#pragma region Copyright (c) 2014-2017 OpenRCT2 Developers /***************************************************************************** * OpenRCT2, an open source clone of Roller Coaster Tycoon 2. * * OpenRCT2 is the work of many authors, a full list can be found in contributors.md * For more information, visit https://github.com/OpenRCT2/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. * * A full copy of the GNU General Public License can be found in licence.txt *****************************************************************************/ #pragma endregion #ifndef _RCT2_H_ #define _RCT2_H_ #include "ride/ride_ratings.h" #include "ride/vehicle.h" #include "common.h" #include "rct12.h" #define RCT2_MAX_RIDES_IN_PARK 255 #define RCT2_MAX_STAFF 200 #define RCT2_MAX_BANNERS_IN_PARK 250 #define RCT2_MAX_VEHICLES_PER_RIDE 32 #define RCT2_MAX_CARS_PER_TRAIN 32 #define RCT2_MAX_CATEGORIES_PER_RIDE 2 #define RCT2_MAX_RIDE_TYPES_PER_RIDE_ENTRY 3 #define RCT2_MAX_VEHICLES_PER_RIDE_ENTRY 4 #define RCT2_DOWNTIME_HISTORY_SIZE 8 #define RCT2_CUSTOMER_HISTORY_SIZE 10 #define RCT2_MAX_SPRITES 10000 #define RCT2_MAX_MAP_ELEMENTS 0x30000 #define RCT2_MAX_ANIMATED_OBJECTS 2000 typedef struct rct2_install_info { uint32 installLevel; char title[260]; char path[260]; uint32 var_20C; uint8 pad_210[256]; char expansionPackNames[16][128]; uint32 activeExpansionPacks; //0xB10 } rct2_install_info; #pragma pack(push, 1) /** * Ride structure. * size: 0x0260 */ typedef struct rct2_ride { uint8 type; // 0x000 // pointer to static info. for example, wild mouse type is 0x36, subtype is // 0x4c. uint8 subtype; // 0x001 uint16 pad_002; // 0x002 uint8 mode; // 0x004 uint8 colour_scheme_type; // 0x005 rct_vehicle_colour vehicle_colours[RCT2_MAX_CARS_PER_TRAIN]; // 0x006 uint8 pad_046[0x03]; // 0x046, Used to be track colours in RCT1 without expansions // 0 = closed, 1 = open, 2 = test uint8 status; // 0x049 rct_string_id name; // 0x04A union { uint32 name_arguments; // 0x04C struct { rct_string_id name_arguments_type_name; // 0x04C uint16 name_arguments_number; // 0x04E }; }; LocationXY8 overall_view; // 0x050 LocationXY8 station_starts[RCT12_MAX_STATIONS_PER_RIDE]; // 0x052 uint8 station_heights[RCT12_MAX_STATIONS_PER_RIDE]; // 0x05A uint8 station_length[RCT12_MAX_STATIONS_PER_RIDE]; // 0x05E uint8 station_depart[RCT12_MAX_STATIONS_PER_RIDE]; // 0x062 // ride->vehicle index for current train waiting for passengers // at station uint8 train_at_station[RCT12_MAX_STATIONS_PER_RIDE]; // 0x066 LocationXY8 entrances[RCT12_MAX_STATIONS_PER_RIDE]; // 0x06A LocationXY8 exits[RCT12_MAX_STATIONS_PER_RIDE]; // 0x072 uint16 last_peep_in_queue[RCT12_MAX_STATIONS_PER_RIDE]; // 0x07A uint8 pad_082[RCT12_MAX_STATIONS_PER_RIDE]; // 0x082, Used to be number of peeps in queue in RCT1, but this has moved. uint16 vehicles[RCT2_MAX_VEHICLES_PER_RIDE]; // 0x086, Points to the first car in the train uint8 depart_flags; // 0x0C6 // Not sure if these should be uint or sint. uint8 num_stations; // 0x0C7 uint8 num_vehicles; // 0x0C8 uint8 num_cars_per_train; // 0x0C9 uint8 proposed_num_vehicles; // 0x0CA uint8 proposed_num_cars_per_train; // 0x0CB uint8 max_trains; // 0x0CC uint8 min_max_cars_per_train; // 0x0CD uint8 min_waiting_time; // 0x0CE uint8 max_waiting_time; // 0x0CF union { uint8 operation_option; // 0x0D0 uint8 time_limit; // 0x0D0 uint8 num_laps; // 0x0D0 uint8 launch_speed; // 0x0D0 uint8 speed; // 0x0D0 uint8 rotations; // 0x0D0 }; uint8 boat_hire_return_direction; // 0x0D1 LocationXY8 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 // bit 6: log reverser, waterfall // bit 7: whirlpool uint8 special_track_elements; // 0x0D5 uint8 pad_0D6[2]; // 0x0D6 // 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 uint8 current_test_segment; // 0x0E0 uint8 average_speed_test_timeout; // 0x0E1 uint8 pad_0E2[0x2]; // 0x0E2 sint32 length[RCT12_MAX_STATIONS_PER_RIDE]; // 0x0E4 uint16 time[RCT12_MAX_STATIONS_PER_RIDE]; // 0x0F4 fixed16_2dp max_positive_vertical_g; // 0x0FC fixed16_2dp max_negative_vertical_g; // 0x0FE fixed16_2dp max_lateral_g; // 0x100 fixed16_2dp previous_vertical_g; // 0x102 fixed16_2dp previous_lateral_g; // 0x104 uint8 pad_106[0x2]; // 0x106 uint32 testing_flags; // 0x108 // x y map location of the current track piece during a test // this is to prevent counting special tracks multiple times LocationXY8 cur_test_track_location; // 0x10C // Next 3 variables are related (XXXX XYYY ZZZa aaaa) uint16 turn_count_default; // 0x10E X = current turn count uint16 turn_count_banked; // 0x110 uint16 turn_count_sloped; // 0x112 X = number turns > 3 elements union { uint8 inversions; // 0x114 (???X XXXX) uint8 holes; // 0x114 (???X XXXX) // This 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 sheltered_eighths; // 0x114 (XXX?-????) }; // Y is number of powered lifts, X is drops uint8 drops; // 0x115 (YYXX XXXX) uint8 start_drop_height; // 0x116 uint8 highest_drop_height; // 0x117 sint32 sheltered_length; // 0x118 // Unused always 0? Should affect nausea uint16 var_11C; // 0x11C uint8 num_sheltered_sections; // 0x11E (?abY YYYY) // see cur_test_track_location uint8 cur_test_track_z; // 0x11F // Customer counter in the current 960 game tick (about 30 seconds) interval uint16 cur_num_customers; // 0x120 // Counts ticks to update customer intervals, resets each 960 game ticks. uint16 num_customers_timeout; // 0x122 // Customer count in the last 10 * 960 game ticks (sliding window) uint16 num_customers[RCT2_CUSTOMER_HISTORY_SIZE]; // 0x124 money16 price; // 0x138 LocationXY8 chairlift_bullwheel_location[2]; // 0x13A uint8 chairlift_bullwheel_z[2]; // 0x13E union { rating_tuple ratings; // 0x140 struct { ride_rating excitement; // 0x140 ride_rating intensity; // 0x142 ride_rating nausea; // 0x144 }; }; uint16 value; // 0x146 uint16 chairlift_bullwheel_rotation; // 0x148 uint8 satisfaction; // 0x14A uint8 satisfaction_time_out; // 0x14B uint8 satisfaction_next; // 0x14C // Various flags stating whether a window needs to be refreshed uint8 window_invalidate_flags; // 0x14D uint8 pad_14E[0x02]; // 0x14E uint32 total_customers; // 0x150 money32 total_profit; // 0x154 uint8 popularity; // 0x158 uint8 popularity_time_out; // 0x159 Updated every purchase and ?possibly by time? uint8 popularity_next; // 0x15A When timeout reached this will be the next popularity uint8 num_riders; // 0x15B uint8 music_tune_id; // 0x15C uint8 slide_in_use; // 0x15D union { uint16 slide_peep; // 0x15E uint16 maze_tiles; // 0x15E }; uint8 pad_160[0xE]; // 0x160 uint8 slide_peep_t_shirt_colour; // 0x16E uint8 pad_16F[0x7]; // 0x16F uint8 spiral_slide_progress; // 0x176 uint8 pad_177[0x9]; // 0x177 sint16 build_date; // 0x180 money16 upkeep_cost; // 0x182 uint16 race_winner; // 0x184 uint8 pad_186[0x02]; // 0x186 uint32 music_position; // 0x188 uint8 breakdown_reason_pending; // 0x18C uint8 mechanic_status; // 0x18D uint16 mechanic; // 0x18E uint8 inspection_station; // 0x190 uint8 broken_vehicle; // 0x191 uint8 broken_car; // 0x192 uint8 breakdown_reason; // 0x193 money16 price_secondary; // 0x194 union { struct { uint8 reliability_subvalue; // 0x196, 0 - 255, acts like the decimals for reliability_percentage uint8 reliability_percentage; // 0x197, Starts at 100 and decreases from there. }; uint16 reliability; // 0x196 }; // Small constant used to increase the unreliability as the game continues, // making breakdowns more and more likely. uint8 unreliability_factor; // 0x198 // Range from [0, 100] uint8 downtime; // 0x199 uint8 inspection_interval; // 0x19A uint8 last_inspection; // 0x19B uint8 downtime_history[RCT2_DOWNTIME_HISTORY_SIZE]; // 0x19C uint32 no_primary_items_sold; // 0x1A4 uint32 no_secondary_items_sold; // 0x1A8 uint8 breakdown_sound_modifier; // 0x1AC // Used to oscillate the sound when ride breaks down. // 0 = no change, 255 = max change uint8 not_fixed_timeout; // 0x1AD uint8 last_crash_type; // 0x1AE uint8 connected_message_throttle; // 0x1AF money32 income_per_hour; // 0x1B0 money32 profit; // 0x1B4 uint8 queue_time[RCT12_MAX_STATIONS_PER_RIDE]; // 0x1B8 uint8 track_colour_main[RCT12_NUM_COLOUR_SCHEMES]; // 0x1BC uint8 track_colour_additional[RCT12_NUM_COLOUR_SCHEMES]; // 0x1C0 uint8 track_colour_supports[RCT12_NUM_COLOUR_SCHEMES]; // 0x1C4 uint8 music; // 0x1C8 uint8 entrance_style; // 0x1C9 uint16 vehicle_change_timeout; // 0x1CA uint8 num_block_brakes; // 0x1CC uint8 lift_hill_speed; // 0x1CD uint16 guests_favourite; // 0x1CE uint32 lifecycle_flags; // 0x1D0 uint8 vehicle_colours_extended[RCT2_MAX_CARS_PER_TRAIN]; // 0x1D4 uint16 total_air_time; // 0x1F4 uint8 current_test_station; // 0x1F6 uint8 num_circuits; // 0x1F7 sint16 cable_lift_x; // 0x1F8 sint16 cable_lift_y; // 0x1FA uint8 cable_lift_z; // 0x1FC uint8 pad_1FD; // 0x1FD uint16 cable_lift; // 0x1FE uint16 queue_length[RCT12_MAX_STATIONS_PER_RIDE]; // 0x200 uint8 pad_208[0x58]; // 0x208 } rct2_ride; assert_struct_size(rct2_ride, 0x260); #ifdef __cplusplus /** * scores.dat file header. * size: 0x10 */ struct rct_scores_header { uint32 var_0; uint32 var_4; uint32 var_8; uint32 ScenarioCount; }; assert_struct_size(rct_scores_header, 0x10); /** * An entry of scores.dat * size: 0x02B0 */ struct rct_scores_entry { char Path[256]; uint8 Category; uint8 pad_0101[0x1F]; sint8 ObjectiveType; sint8 ObjectiveArg1; sint32 objectiveArg2; sint16 objectiveArg3; char Name[64]; char Details[256]; sint32 Flags; money32 CompanyValue; char CompletedBy[64]; }; assert_struct_size(rct_scores_entry, 0x02B0); #endif // __cplusplus #pragma pack(pop) #endif