From 154bb0d4757a8d0c0860841c461461306d1b5499 Mon Sep 17 00:00:00 2001 From: Ted John Date: Sun, 14 Aug 2016 15:50:52 +0100 Subject: [PATCH] Integrate guest and park globals Note: this also fixes loading of landscapes in the editor which did not use the new SC loading code. --- src/addresses.h | 53 +++++++++---------- src/editor.c | 109 ++++------------------------------------ src/peep/peep.c | 14 +++++- src/peep/peep.h | 20 ++++---- src/rct2/S6Exporter.cpp | 2 +- src/rct2/S6Importer.cpp | 2 +- src/ride/ride_ratings.c | 1 - src/world/park.c | 16 +++++- src/world/park.h | 30 +++++------ 9 files changed, 92 insertions(+), 155 deletions(-) diff --git a/src/addresses.h b/src/addresses.h index 5225b9f87c..b23ef7ac73 100644 --- a/src/addresses.h +++ b/src/addresses.h @@ -207,57 +207,32 @@ #define RCT2_ADDRESS_SPRITE_LIST 0x010E63BC #define RCT2_ADDRESS_SPRITE_LISTS_HEAD 0x013573BC #define RCT2_ADDRESS_SPRITE_LISTS_COUNT 0x013573C8 -#define RCT2_ADDRESS_PARK_NAME 0x013573D4 -#define RCT2_ADDRESS_PARK_NAME_ARGS 0x013573D8 #define RCT2_ADDRESS_INITIAL_CASH 0x013573DC #define RCT2_ADDRESS_CURRENT_LOAN 0x013573E0 #define RCT2_ADDRESS_MAXIMUM_LOAN 0x013580F0 -#define RCT2_ADDRESS_PEEP_WARNING_THROTTLE 0x01358750 #define RCT2_ADDRESS_LOAN_HASH 0x013587C4 -#define RCT2_ADDRESS_PARK_FLAGS 0x013573E4 -#define RCT2_ADDRESS_PARK_ENTRANCE_FEE 0x013573E8 -#define RCT2_ADDRESS_GUESTS_IN_PARK 0x01357844 -#define RCT2_ADDRESS_GUESTS_HEADING_FOR_PARK 0x01357846 -#define RCT2_ADDRESS_CURRENT_PARK_RATING 0x01357CB0 -#define RCT2_ADDRESS_PARK_RATING_HISTORY 0x01357CB2 -#define RCT2_ADDRESS_GUESTS_IN_PARK_HISTORY 0x01357CD2 #define RCT2_ADDRESS_LAST_RESEARCHED_ITEM_SUBJECT 0x01357CF4 -#define RCT2_ADDRESS_OBJECTIVE_TYPE 0x013580F8 -#define RCT2_ADDRESS_OBJECTIVE_YEAR 0x013580F9 -#define RCT2_ADDRESS_OBJECTIVE_CURRENCY 0x013580FC -#define RCT2_ADDRESS_OBJECTIVE_NUM_GUESTS 0x01358100 #define RCT2_ADDRESS_BALANCE_HISTORY 0x0135812C #define RCT2_ADDRESS_CURRENT_EXPENDITURE 0x0135832C #define RCT2_ADDRESS_CURRENT_PROFIT 0x01358330 #define RCT2_ADDRESS_WEEKLY_PROFIT_HISTORY 0x0135833C #define RCT2_ADDRESS_CURRENT_PARK_VALUE 0x0135853C #define RCT2_ADDRESS_PARK_VALUE_HISTORY 0x01358540 -#define RCT2_ADDRESS_COMPLETED_COMPANY_VALUE 0x01358740 -#define RCT2_ADDRESS_TOTAL_ADMISSIONS 0x01358744 -#define RCT2_ADDRESS_INCOME_FROM_ADMISSIONS 0x01358748 -#define RCT2_ADDRESS_CURRENT_COMPANY_VALUE 0x0135874C #define RCT2_ADDRESS_AWARD_LIST 0x01358760 -#define RCT2_ADDRESS_COMPANY_VALUE_RECORD 0x013587C0 #define RCT2_ADDRESS_CURRENT_MONEY_ENCRYPTED 0x013587F8 #define RCT2_ADDRESS_CURRENT_INTEREST_RATE 0x0135934A #define RCT2_ADDRESS_SAME_PRICE_THROUGHOUT 0x01358838 #define RCT2_ADDRESS_LAST_ENTRANCE_STYLE 0x01358840 #define RCT2_ADDRESS_SAME_PRICE_THROUGHOUT_EXTENDED 0x0135934C -#define RCT2_ADDRESS_GUEST_INITIAL_CASH 0x013580F4 -#define RCT2_ADDRESS_GUEST_INITIAL_HAPPINESS 0x013580E9 -#define RCT2_ADDRESS_GUEST_INITIAL_HUNGER 0x013580F6 -#define RCT2_ADDRESS_GUEST_INITIAL_THIRST 0x013580F7 #define RCT2_ADDRESS_LAND_COST 0x01358770 #define RCT2_ADDRESS_CONSTRUCTION_RIGHTS_COST 0x01358772 #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 @@ -314,7 +289,6 @@ #define RCT2_ADDRESS_NUM_MAP_ANIMATIONS 0x0138B580 #define RCT2_ADDRESS_RIDE_MEASUREMENTS 0x0138B60C -#define RCT2_ADDRESS_NEXT_GUEST_NUMBER 0x013B0E6C #define RCT2_ADDRESS_GRASS_SCENERY_TILEPOS 0x013B0E70 #define RCT2_ADDRESS_STAFF_PATROL_AREAS 0x013B0E72 @@ -590,6 +564,33 @@ #define RCT2_ADDRESS_SCENERY_TOOL_CTRL_PRESSED 0x00F64F12 #define RCT2_ADDRESS_SCENERY_TOOL_SHIFT_PRESSED 0x00F64F13 +#define RCT2_ADDRESS_GUEST_CHANGE_MODIFIER 0x013573FE +#define RCT2_ADDRESS_LAST_GUESTS_IN_PARK 0x01357BC8 +#define RCT2_ADDRESS_NEXT_GUEST_NUMBER 0x013B0E6C +#define RCT2_ADDRESS_PARK_NAME 0x013573D4 +#define RCT2_ADDRESS_PARK_NAME_ARGS 0x013573D8 +#define RCT2_ADDRESS_PEEP_WARNING_THROTTLE 0x01358750 +#define RCT2_ADDRESS_PARK_FLAGS 0x013573E4 +#define RCT2_ADDRESS_PARK_ENTRANCE_FEE 0x013573E8 +#define RCT2_ADDRESS_GUESTS_IN_PARK 0x01357844 +#define RCT2_ADDRESS_GUESTS_HEADING_FOR_PARK 0x01357846 +#define RCT2_ADDRESS_CURRENT_PARK_RATING 0x01357CB0 +#define RCT2_ADDRESS_PARK_RATING_HISTORY 0x01357CB2 +#define RCT2_ADDRESS_GUESTS_IN_PARK_HISTORY 0x01357CD2 +#define RCT2_ADDRESS_OBJECTIVE_TYPE 0x013580F8 +#define RCT2_ADDRESS_OBJECTIVE_YEAR 0x013580F9 +#define RCT2_ADDRESS_OBJECTIVE_CURRENCY 0x013580FC +#define RCT2_ADDRESS_OBJECTIVE_NUM_GUESTS 0x01358100 +#define RCT2_ADDRESS_COMPLETED_COMPANY_VALUE 0x01358740 +#define RCT2_ADDRESS_TOTAL_ADMISSIONS 0x01358744 +#define RCT2_ADDRESS_INCOME_FROM_ADMISSIONS 0x01358748 +#define RCT2_ADDRESS_CURRENT_COMPANY_VALUE 0x0135874C +#define RCT2_ADDRESS_COMPANY_VALUE_RECORD 0x013587C0 +#define RCT2_ADDRESS_GUEST_INITIAL_CASH 0x013580F4 +#define RCT2_ADDRESS_GUEST_INITIAL_HAPPINESS 0x013580E9 +#define RCT2_ADDRESS_GUEST_INITIAL_HUNGER 0x013580F6 +#define RCT2_ADDRESS_GUEST_INITIAL_THIRST 0x013580F7 + #define RCT2_ADDRESS_CLIMATE 0x013CA746 #define RCT2_ADDRESS_CURRENT_WEATHER 0x013CA74A #define RCT2_ADDRESS_NEXT_WEATHER 0x013CA74B diff --git a/src/editor.c b/src/editor.c index a08e871f07..c869deaac8 100644 --- a/src/editor.c +++ b/src/editor.c @@ -284,106 +284,19 @@ static int editor_load_landscape_from_sc4(const char *path) */ static int editor_read_s6(const char *path) { - int i, j; - SDL_RWops* rw; - rct_s6_header *s6Header = RCT2_ADDRESS(0x009E34E4, rct_s6_header); - rct_s6_info *s6Info = gS6Info; - - log_verbose("loading landscape, %s", path); - - rw = SDL_RWFromFile(path, "rb"); - if (rw != NULL) { - if (!sawyercoding_validate_checksum(rw)) { - SDL_RWclose(rw); - gErrorType = ERROR_TYPE_FILE_LOAD; - gErrorStringId = STR_FILE_CONTAINS_INVALID_DATA; - - log_error("failed to load scenario, invalid checksum"); - return 0; - } - - // Read first chunk - sawyercoding_read_chunk(rw, (uint8*)s6Header); - if (s6Header->type == S6_TYPE_SCENARIO) { - // Read second chunk - sawyercoding_read_chunk(rw, (uint8*)s6Info); - - if (s6Info->editor_step == 255) - s6Info->editor_step = EDITOR_STEP_LANDSCAPE_EDITOR; - } else { - s6Info->editor_step = EDITOR_STEP_LANDSCAPE_EDITOR; - s6Info->category = SCENARIO_CATEGORY_OTHER; - format_string(s6Info->details, STR_NO_DETAILS_YET, NULL); - } - - // 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). Loads: - // RCT2_ADDRESS_CURRENT_MONTH_YEAR - // RCT2_ADDRESS_CURRENT_MONTH_TICKS - // RCT2_ADDRESS_SCENARIO_TICKS - sawyercoding_read_chunk(rw, RCT2_ADDRESS(RCT2_ADDRESS_CURRENT_MONTH_YEAR, uint8)); - - // Read map elements - memset((void*)gMapElements, 0, MAX_MAP_ELEMENTS * sizeof(rct_map_element)); - sawyercoding_read_chunk(rw, RCT2_ADDRESS(gMapElements, uint8)); - - // Read game data, including sprites - sawyercoding_read_chunk(rw, RCT2_ADDRESS(0x010E63B8, uint8)); - - if (s6Header->type == S6_TYPE_SCENARIO) { - // Read number of guests in park and something else - sawyercoding_read_chunk(rw, RCT2_ADDRESS(RCT2_ADDRESS_GUESTS_IN_PARK, uint8)); - - // Read ? - sawyercoding_read_chunk(rw, RCT2_ADDRESS(RCT2_ADDRESS_LAST_GUESTS_IN_PARK, uint8)); - - // Read park rating - sawyercoding_read_chunk(rw, RCT2_ADDRESS(RCT2_ADDRESS_CURRENT_PARK_RATING, uint8)); - - // Read ? - sawyercoding_read_chunk(rw, RCT2_ADDRESS(RCT2_ADDRESS_ACTIVE_RESEARCH_TYPES, uint8)); - - // Read ? - sawyercoding_read_chunk(rw, RCT2_ADDRESS(RCT2_ADDRESS_CURRENT_EXPENDITURE, uint8)); - - // Read ? - sawyercoding_read_chunk(rw, RCT2_ADDRESS(RCT2_ADDRESS_CURRENT_PARK_VALUE, uint8)); - - // Read more game data, including research items and rides - sawyercoding_read_chunk(rw, RCT2_ADDRESS(RCT2_ADDRESS_COMPLETED_COMPANY_VALUE, uint8)); - } - - SDL_RWclose(rw); - if (!load_success) { - log_error("failed to load all entries."); - return 0; - } - - map_update_tile_pointers(); - game_convert_strings_to_utf8(); - - gScreenFlags = SCREEN_FLAGS_SCENARIO_EDITOR; - editor_clear_map_for_editing(); - viewport_init_all(); - window_editor_main_open(); - editor_finalise_main_view(); - return 1; + if (!scenario_load(path)) { + return 0; } - log_error("failed to find scenario file."); - gErrorType = ERROR_TYPE_FILE_LOAD; - gErrorStringId = STR_FILE_CONTAINS_INVALID_DATA; - return 0; + editor_clear_map_for_editing(); + + gS6Info->editor_step = EDITOR_STEP_LANDSCAPE_EDITOR; + gScreenAge = 0; + gScreenFlags = SCREEN_FLAGS_SCENARIO_EDITOR; + viewport_init_all(); + window_editor_main_open(); + editor_finalise_main_view(); + return 1; } static void editor_clear_map_for_editing() diff --git a/src/peep/peep.c b/src/peep/peep.c index af7085d2c5..999e8d1178 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -40,7 +40,19 @@ #include "peep.h" #include "staff.h" -uint8 *gPeepWarningThrottle = RCT2_ADDRESS(RCT2_ADDRESS_PEEP_WARNING_THROTTLE, uint8); +uint8 gGuestChangeModifier; +uint16 gNumGuestsInPark; +uint16 gNumGuestsInParkLastWeek; +uint16 gNumGuestsHeadingForPark; + +money16 gGuestInitialCash; +uint8 gGuestInitialHappiness; +uint8 gGuestInitialHunger; +uint8 gGuestInitialThirst; + +uint32 gNextGuestNumber; + +uint8 gPeepWarningThrottle[16]; rct_xyz16 gPeepPathFindGoalPosition; bool gPeepPathFindIgnoreForeignQueues; diff --git a/src/peep/peep.h b/src/peep/peep.h index 90fbbc209c..b2a898bea1 100644 --- a/src/peep/peep.h +++ b/src/peep/peep.h @@ -611,19 +611,19 @@ enum { FOR_ALL_PEEPS(sprite_index, peep) \ if (peep->type == PEEP_TYPE_STAFF) -#define gGuestChangeModifier RCT2_GLOBAL(RCT2_ADDRESS_GUEST_CHANGE_MODIFIER, uint8) -#define gNumGuestsInPark RCT2_GLOBAL(RCT2_ADDRESS_GUESTS_IN_PARK, uint16) -#define gNumGuestsInParkLastWeek RCT2_GLOBAL(RCT2_ADDRESS_LAST_GUESTS_IN_PARK, uint16) -#define gNumGuestsHeadingForPark RCT2_GLOBAL(RCT2_ADDRESS_GUESTS_HEADING_FOR_PARK, uint16) +extern uint8 gGuestChangeModifier; +extern uint16 gNumGuestsInPark; +extern uint16 gNumGuestsInParkLastWeek; +extern uint16 gNumGuestsHeadingForPark; -#define gGuestInitialCash RCT2_GLOBAL(RCT2_ADDRESS_GUEST_INITIAL_CASH, money16) -#define gGuestInitialHappiness RCT2_GLOBAL(RCT2_ADDRESS_GUEST_INITIAL_HAPPINESS, uint8) -#define gGuestInitialHunger RCT2_GLOBAL(RCT2_ADDRESS_GUEST_INITIAL_HUNGER, uint8) -#define gGuestInitialThirst RCT2_GLOBAL(RCT2_ADDRESS_GUEST_INITIAL_THIRST, uint8) +extern money16 gGuestInitialCash; +extern uint8 gGuestInitialHappiness; +extern uint8 gGuestInitialHunger; +extern uint8 gGuestInitialThirst; -#define gNextGuestNumber RCT2_GLOBAL(RCT2_ADDRESS_NEXT_GUEST_NUMBER, uint32) +extern uint32 gNextGuestNumber; -extern uint8 *gPeepWarningThrottle; +extern uint8 gPeepWarningThrottle[16]; extern rct_xyz16 gPeepPathFindGoalPosition; extern bool gPeepPathFindIgnoreForeignQueues; diff --git a/src/rct2/S6Exporter.cpp b/src/rct2/S6Exporter.cpp index f06673dd5f..d2e8ffacc5 100644 --- a/src/rct2/S6Exporter.cpp +++ b/src/rct2/S6Exporter.cpp @@ -286,7 +286,7 @@ void S6Exporter::Export() memcpy(_s6.expenditure_table, gExpenditureTable, sizeof(_s6.expenditure_table)); - _s6.last_guests_in_park = RCT2_GLOBAL(RCT2_ADDRESS_LAST_GUESTS_IN_PARK, uint16); + _s6.last_guests_in_park = gNumGuestsInParkLastWeek; // pad_01357BCA _s6.handyman_colour = gStaffHandymanColour; _s6.mechanic_colour = gStaffMechanicColour; diff --git a/src/rct2/S6Importer.cpp b/src/rct2/S6Importer.cpp index 9f11568528..62446487fa 100644 --- a/src/rct2/S6Importer.cpp +++ b/src/rct2/S6Importer.cpp @@ -204,7 +204,7 @@ void S6Importer::Import() memcpy(gExpenditureTable, _s6.expenditure_table, sizeof(_s6.expenditure_table)); - RCT2_GLOBAL(RCT2_ADDRESS_LAST_GUESTS_IN_PARK, uint16) = _s6.last_guests_in_park; + gNumGuestsInParkLastWeek = _s6.last_guests_in_park; // pad_01357BCA gStaffHandymanColour = _s6.handyman_colour; gStaffMechanicColour = _s6.mechanic_colour; diff --git a/src/ride/ride_ratings.c b/src/ride/ride_ratings.c index cd93cba984..e9c362bf04 100644 --- a/src/ride/ride_ratings.c +++ b/src/ride/ride_ratings.c @@ -14,7 +14,6 @@ *****************************************************************************/ #pragma endregion -#include "../addresses.h" #include "../interface/window.h" #include "../localisation/date.h" #include "../world/map.h" diff --git a/src/world/park.c b/src/world/park.c index c8ce1d8ee3..f68583829d 100644 --- a/src/world/park.c +++ b/src/world/park.c @@ -35,8 +35,20 @@ #include "park.h" #include "sprite.h" -uint8 *gParkRatingHistory = RCT2_ADDRESS(RCT2_ADDRESS_PARK_RATING_HISTORY, uint8); -uint8 *gGuestsInParkHistory = RCT2_ADDRESS(RCT2_ADDRESS_GUESTS_IN_PARK_HISTORY, uint8); +rct_string_id gParkName; +uint32 gParkNameArgs; +uint32 gParkFlags; +uint16 gParkRating; +money16 gParkEntranceFee; + +uint32 gTotalAdmissions; +money32 gTotalIncomeFromAdmissions; + +money32 gParkValue; +money32 gCompanyValue; + +uint8 gParkRatingHistory[32]; +uint8 gGuestsInParkHistory[32]; // If this value is more than or equal to 0, the park rating is forced to this value. Used for cheat int gForcedParkRating = -1; diff --git a/src/world/park.h b/src/world/park.h index 1bdf83a47c..a6a07101c9 100644 --- a/src/world/park.h +++ b/src/world/park.h @@ -44,24 +44,24 @@ enum { PARK_FLAGS_SIX_FLAGS_DEPRECATED = (1 << 19) // Not used anymore }; -#define gParkName RCT2_GLOBAL(RCT2_ADDRESS_PARK_NAME, rct_string_id) -#define gParkNameArgs RCT2_GLOBAL(RCT2_ADDRESS_PARK_NAME_ARGS, uint32) -#define gParkFlags RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) -#define gParkSize RCT2_GLOBAL(RCT2_ADDRESS_PARK_SIZE, uint16) -#define gParkRating RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_PARK_RATING, uint16) -#define gParkEntranceFee RCT2_GLOBAL(RCT2_ADDRESS_PARK_ENTRANCE_FEE, money16) - -#define gTotalAdmissions RCT2_GLOBAL(RCT2_ADDRESS_TOTAL_ADMISSIONS, uint32) -#define gTotalIncomeFromAdmissions RCT2_GLOBAL(RCT2_ADDRESS_INCOME_FROM_ADMISSIONS, money32) - -#define gParkValue RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_PARK_VALUE, money32) -#define gCompanyValue RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_COMPANY_VALUE, money32) - +#define gParkSize RCT2_GLOBAL(RCT2_ADDRESS_PARK_SIZE, uint16) #define gLandPrice RCT2_GLOBAL(RCT2_ADDRESS_LAND_COST, money16) #define gConstructionRightsPrice RCT2_GLOBAL(RCT2_ADDRESS_CONSTRUCTION_RIGHTS_COST, money16) -extern uint8 *gParkRatingHistory; -extern uint8 *gGuestsInParkHistory; +extern rct_string_id gParkName; +extern uint32 gParkNameArgs; +extern uint32 gParkFlags; +extern uint16 gParkRating; +extern money16 gParkEntranceFee; + +extern uint32 gTotalAdmissions; +extern money32 gTotalIncomeFromAdmissions; + +extern money32 gParkValue; +extern money32 gCompanyValue; + +extern uint8 gParkRatingHistory[32]; +extern uint8 gGuestsInParkHistory[32]; extern int _guestGenerationProbability; extern int _suggestedGuestMaximum;