#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 _RCT1_H_ #define _RCT1_H_ #include "management/Award.h" #include "management/NewsItem.h" #include "management/Research.h" #include "rct12.h" #include "ride/ride.h" #include "world/banner.h" #include "world/map.h" #include "world/sprite.h" #include "world/map_animation.h" #define RCT1_MAX_MAP_ELEMENTS 0xC000 #define RCT1_MAX_SPRITES 5000 #define RCT1_MAX_TRAINS_PER_RIDE 12 #define RCT1_MAX_MAP_SIZE 128 #define RCT1_MAX_RIDES_IN_PARK 128 #define RCT1_MAX_STAFF 116 #define RCT1_RESEARCH_FLAGS_SEPARATOR 0xFF #define RCT1_MAX_ANIMATED_OBJECTS 1000 typedef struct ParkLoadResult ParkLoadResult; #pragma pack(push, 1) typedef struct rct1_entrance { uint16 x; uint16 y; uint16 z; uint8 direction; } rct1_entrance; assert_struct_size(rct1_entrance, 7); /** * RCT1 ride structure * size: 0x260 */ typedef struct rct1_ride { uint8 type; // 0x000 uint8 vehicle_type; // 0x001 uint16 lifecycle_flags; // 0x002 uint8 operating_mode; // 0x004 uint8 colour_scheme; // 0x005 struct { colour_t body; colour_t trim; } vehicle_colours[RCT1_MAX_TRAINS_PER_RIDE]; // 0x006 colour_t track_primary_colour; // 0x01E colour_t track_secondary_colour; // 0x01F colour_t track_support_colour; // 0x020 uint8 status; // 0x021 uint16 name; // 0x022 uint16 name_argument_ride; // 0x024 uint16 name_argument_number; // 0x026 LocationXY8 overall_view; // 0x028 LocationXY8 station_starts[RCT12_MAX_STATIONS_PER_RIDE]; // 0x02A uint8 station_height[RCT12_MAX_STATIONS_PER_RIDE]; // 0x032 uint8 station_length[RCT12_MAX_STATIONS_PER_RIDE]; // 0x036 uint8 station_light[RCT12_MAX_STATIONS_PER_RIDE]; // 0x03A uint8 station_depart[RCT12_MAX_STATIONS_PER_RIDE]; // 0x03E LocationXY8 entrance[RCT12_MAX_STATIONS_PER_RIDE]; // 0x042 LocationXY8 exit[RCT12_MAX_STATIONS_PER_RIDE]; // 0x04A uint16 last_peep_in_queue[RCT12_MAX_STATIONS_PER_RIDE]; // 0x052 uint8 num_peeps_in_queue[RCT12_MAX_STATIONS_PER_RIDE]; // 0x05A uint16 vehicles[RCT1_MAX_TRAINS_PER_RIDE]; // 0x05E uint8 depart_flags; // 0x076 uint8 num_stations; // 0x077 uint8 num_trains; // 0x078 uint8 num_cars_per_train; // 0x079 uint8 proposed_num_vehicles; // 0x07A uint8 proposed_num_cars_per_train; // 0x07B uint8 max_trains; // 0x07C uint8 min_max_cars_per_train; // 0x07D uint8 min_waiting_time; // 0x07E uint8 max_waiting_time; // 0x07F uint8 operation_option; // 0x080 uint8 boat_hire_return_direction; // 0x081 LocationXY8 boat_hire_return_position; // 0x082 uint8 data_logging_index; // 0x084 uint8 special_track_elements; // 0x085 uint16 unk_86; // 0x086 sint32 max_speed; // 0x088 sint32 average_speed; // 0x08C uint8 current_test_segment; // 0x090 uint8 average_speed_test_timeout; // 0x091 uint8 pad_0E2[0x2]; // 0x092 sint32 length[RCT12_MAX_STATIONS_PER_RIDE]; // 0x094 uint16 time[RCT12_MAX_STATIONS_PER_RIDE]; // 0x0A4 fixed16_2dp max_positive_vertical_g; // 0x0AC fixed16_2dp max_negative_vertical_g; // 0x0AE fixed16_2dp max_lateral_g; // 0x0B0 fixed16_2dp previous_vertical_g; // 0x0B2 fixed16_2dp previous_lateral_g; // 0x0B4 uint8 pad_B6[0x2]; // 0x0B6 uint32 testing_flags; // 0x0B8 // 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; // 0x0BC // Next 3 variables are related (XXXX XYYY ZZZa aaaa) uint16 turn_count_default; // 0x0BE X = current turn count uint16 turn_count_banked; // 0x0C0 uint16 turn_count_sloped; // 0x0C2 X = number turns > 3 elements union { uint8 num_inversions; // 0x0C4 uint8 num_holes; }; uint8 num_drops; // 0x0C5 uint8 start_drop_height; // 0x0C6 uint8 highest_drop_height; // 0x0C7 sint32 sheltered_length; // 0x0C8 uint8 unk_CC[2]; // 0x0CC uint8 num_sheltered_sections; // 0x0CE // see cur_test_track_location uint8 cur_test_track_z; // 0x0CF sint16 unk_D0; // 0x0D0 sint16 unk_D2; // 0x0D2 sint16 customers_per_hour; // 0x0D4 sint16 unk_D6; // 0x0D6 sint16 unk_D8; // 0x0D8 sint16 unk_DA; // 0x0DA sint16 unk_DC; // 0x0DC sint16 unk_DE; // 0x0DE uint16 age; // 0x0E0 sint16 running_cost; // 0x0E2 sint16 unk_E4; // 0x0E4 sint16 unk_E6; // 0x0E6 money16 price; // 0x0E8 LocationXY8 chairlift_bullwheel_location[2]; // 0x0EA uint8 chairlift_bullwheel_z[2]; // 0x0EE union { rating_tuple ratings; struct { ride_rating excitement; // 0x0F0 ride_rating intensity; // 0x0F2 ride_rating nausea; // 0x0F4 }; }; uint16 value; // 0x0F6 uint16 chairlift_bullwheel_rotation; // 0x0F8 uint8 satisfaction; // 0x0FA uint8 satisfaction_time_out; // 0x0FB uint8 satisfaction_next; // 0x0FC uint8 window_invalidate_flags; // 0x0FD uint8 unk_FE[2]; // 0x0FE uint32 total_customers; // 0x100 money32 total_profit; // 0x104 uint8 popularity; // 0x108 uint8 popularity_time_out; // 0x109 uint8 popularity_next; // 0x10A uint8 num_riders; // 0x10B uint8 music_tune_id; // 0x10C uint8 slide_in_use; // 0x10D union { uint16 slide_peep; // 0x10E uint16 maze_tiles; // 0x10E }; uint8 pad_110[0xE]; // 0x110 uint8 slide_peep_t_shirt_colour; // 0x11E uint8 pad_11F[0x7]; // 0x11F uint8 spiral_slide_progress; // 0x126 uint8 pad_127[0x9]; // 0x127 sint16 build_date; // 0x130 money16 upkeep_cost; // 0x131 uint16 race_winner; // 0x132 uint8 unk_134[2]; // 0x134 uint32 music_position; // 0x138 uint8 breakdown_reason_pending; // 0x13C uint8 mechanic_status; // 0x13D uint16 mechanic; // 0x13E uint8 inspection_station; // 0x140 uint8 broken_vehicle; // 0x141 uint8 broken_car; // 0x142 uint8 breakdown_reason; // 0x143 uint8 unk_144[2]; // 0x144 union { struct { uint8 reliability_subvalue; // 0x146, 0 - 255, acts like the decimals for reliability_percentage uint8 reliability_percentage; // 0x147, Starts at 100 and decreases from there. }; uint16 reliability; // 0x146 }; uint8 unreliability_factor; // 0x148 uint8 downtime; // 0x149 uint8 inspection_interval; // 0x14A uint8 last_inspection; // 0x14B uint8 unk_14C[20]; // 0x14C money32 income_per_hour; // 0x160 money32 profit; // 0x164 uint8 queue_time[RCT12_MAX_STATIONS_PER_RIDE]; // 0x168 colour_t track_colour_main[4]; // 0x16C colour_t track_colour_additional[4]; // 0x170 colour_t track_colour_supports[4]; // 0x174 uint8 music; // 0x178 uint8 entrance_style; // 0x179 uint8 unk_17A[230]; // 0x17A } rct1_ride; assert_struct_size(rct1_ride, 0x260); typedef struct rct1_unk_sprite { 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 centre of sprite to bottom uint8 sprite_height_negative; // 0x09 uint16 sprite_index; // 0x0A uint16 flags; // 0x0C sint16 x; // 0x0E sint16 y; // 0x10 sint16 z; // 0x12 // Width from centre of sprite to edge uint8 sprite_width; // 0x14 // Height from centre 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 rct_string_id name_string_idx; // 0x22 uint16 var_24; uint16 frame; // 0x26 uint8 var_28[3]; uint8 var_2B; uint8 pad_2C[0x45]; uint8 var_71; } rct1_unk_sprite; typedef struct rct1_vehicle { uint8 sprite_identifier; // 0x00 uint8 is_child; // 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 centre of sprite to bottom uint8 sprite_height_negative; // 0x09 uint16 sprite_index; // 0x0A uint16 flags; // 0x0C sint16 x; // 0x0E sint16 y; // 0x10 sint16 z; // 0x12 // Width from centre of sprite to edge uint8 sprite_width; // 0x14 // Height from centre 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; // 0x1E uint8 vehicle_sprite_type; // 0x1F uint8 bank_rotation; // 0x20 uint8 pad_21[3]; sint32 remaining_distance; // 0x24 sint32 velocity; // 0x28 sint32 acceleration; // 0x2C uint8 ride; // 0x30 uint8 vehicle_type; // 0x31 rct_vehicle_colour colours; // 0x32 union { uint16 track_progress; // 0x34 struct { sint8 var_34; uint8 var_35; }; }; union { sint16 track_direction; // 0x36 (0000 0000 0000 0011) sint16 track_type; // 0x36 (0000 0011 1111 1100) LocationXY8 boat_location; // 0x36 }; uint16 track_x; // 0x38 uint16 track_y; // 0x3A uint16 track_z; // 0x3C uint16 next_vehicle_on_train; // 0x3E // 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 friction; // 0x46 uint16 update_flags; // 0x48 uint8 var_4A; uint8 current_station; // 0x4B union { sint16 swinging_car_var_0; // 0x4C sint16 current_time; // 0x4C struct { sint8 ferris_wheel_var_0; // 0x4C sint8 ferris_wheel_var_1; // 0x4D }; }; sint16 var_4E; uint8 status; // 0x50 uint8 sub_state; // 0x51 uint16 peep[32]; // 0x52 uint8 peep_tshirt_colours[32]; // 0x92 uint8 num_seats; // 0xB2 uint8 num_peeps; // 0xB3 uint8 next_free_seat; // 0xB4 uint8 restraints_position; // 0xB5 0 == Close, 255 == Open sint16 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; union { uint16 var_C0; uint16 time_waiting; // 0xC0 uint16 cable_lift_target; // 0xC0 }; uint8 speed; // 0xC2 uint8 powered_acceleration; // 0xC3 uint8 var_C4; uint8 var_C5; uint8 pad_C6[0x2]; uint16 var_C8; uint16 var_CA; uint8 scream_sound_id; // 0xCC uint8 var_CD; union { uint8 var_CE; uint8 num_laps; // 0xCE }; union { uint8 var_CF; uint8 brake_speed; // 0xCF }; uint16 lost_time_out; // 0xD0 sint8 vertical_drop_countdown; // 0xD1 uint8 var_D3; uint8 mini_golf_current_animation; uint8 mini_golf_flags; // 0xD5 uint8 ride_subtype; // 0xD6 uint8 colours_extended; // 0xD7 } rct1_vehicle; typedef struct rct1_peep { 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 centre of sprite to bottom uint8 sprite_height_negative; // 0x09 uint16 sprite_index; // 0x0A uint16 flags; // 0x0C sint16 x; // 0x0E sint16 y; // 0x10 sint16 z; // 0x12 // Width from centre of sprite to edge uint8 sprite_width; // 0x14 // Height from centre 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; // 0x1E uint8 pad_1F[3]; rct_string_id name_string_idx; // 0x22 uint16 next_x; // 0x24 uint16 next_y; // 0x26 uint8 next_z; // 0x28 uint8 next_var_29; // 0x29 uint8 outside_of_park; // 0x2A uint8 state; // 0x2B uint8 sub_state; // 0x2C uint8 sprite_type; // 0x2D uint8 type; // 0x2E 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 uint8 destination_tolerence; // 0x36 How close to destination before next action/state 0 = exact uint8 var_37; uint8 energy; // 0x38 uint8 energy_target; // 0x39 uint8 happiness; // 0x3A uint8 happiness_target; // 0x3B uint8 nausea; // 0x3C uint8 nausea_target; // 0x3D uint8 hunger; // 0x3E uint8 thirst; // 0x3F uint8 bathroom; // 0x40 uint8 var_41; uint8 var_42; 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 uint8 ride_types_been_on[16]; // 0x48 uint32 item_extra_flags; // 0x58 uint8 photo2_ride_ref; // 0x5C uint8 photo3_ride_ref; // 0x5D uint8 photo4_ride_ref; // 0x5E uint8 pad_5F[0x09]; // 0x5F uint8 current_ride; // 0x68 uint8 current_ride_station; // 0x69 uint8 current_train; // 0x6A union{ struct{ uint8 current_car; // 0x6B uint8 current_seat; // 0x6C }; uint16 time_to_sitdown; //0x6B struct{ uint8 time_to_stand; //0x6B uint8 standing_flags; //0x6C }; }; // Normally 0, 1 for carrying sliding board on spiral slide ride, 2 for carrying lawn mower uint8 special_sprite; // 0x6D uint8 action_sprite_type; // 0x6E // Seems to be used like a local variable, as it's always set before calling peep_switch_to_next_action_sprite_type, which reads this again uint8 next_action_sprite_type; // 0x6F uint8 action_sprite_image_offset; // 0x70 uint8 action; // 0x71 uint8 action_frame; // 0x72 uint8 var_73; union { uint16 var_74; // time getting to ride to fix uint16 next_in_queue; // 0x74 }; uint8 var_76; uint8 pad_77; union{ uint8 maze_last_edge; // 0x78 uint8 direction; //Direction ? }; uint8 interaction_ride_index; uint16 time_in_queue; // 0x7A 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 money32 cash_in_pocket; // 0xA0 money32 cash_spent; // 0xA4 sint32 time_in_park; // 0xA8 sint8 var_AC; // 0xAC uint8 previous_ride; // 0xAD uint16 previous_ride_time_out; // 0xAE rct_peep_thought thoughts[PEEP_MAX_THOUGHTS]; // 0xB0 uint8 pad_C4; union { uint8 staff_id; // 0xC5 uint8 guest_heading_to_ride_id; // 0xC5 }; union { uint8 staff_orders; // 0xC6 uint8 peep_is_lost_countdown; // 0xC6 }; uint8 photo1_ride_ref; // 0xC7 uint32 peep_flags; // 0xC8 LocationXYZD8 pathfind_goal; // 0xCC LocationXYZD8 pathfind_history[4]; // 0xD0 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 union{ uint8 time_on_ride; // 0xE2 uint8 var_E2; // 0xE2 }; // 0x3F Sick Count split into lots of 3 with time, 0xC0 Time since last recalc uint8 disgusting_count; // 0xE3 money16 paid_to_enter; // 0xE4 money16 paid_on_rides; // 0xE6 money16 paid_on_food; // 0xE8 money16 paid_on_souvenirs; // 0xEA uint8 no_of_food; // 0xEC uint8 no_of_drinks; // 0xED uint8 no_of_souvenirs; // 0xEE uint8 var_EF; uint8 voucher_type; // 0xF0 uint8 voucher_arguments; // 0xF1 ride_id or string_offset_id uint8 var_F2; uint8 var_F3; uint8 var_F4; uint8 days_in_queue; // 0xF5 uint8 balloon_colour; // 0xF6 uint8 umbrella_colour; // 0xF7 uint8 hat_colour; // 0xF8 uint8 favourite_ride; // 0xF9 uint8 favourite_ride_rating; // 0xFA uint8 pad_FB; uint32 item_standard_flags; // 0xFC } rct1_peep; assert_struct_size(rct1_peep, 0x100); enum RCT1_PEEP_SPRITE_TYPE { RCT1_PEEP_SPRITE_TYPE_NORMAL = 0, RCT1_PEEP_SPRITE_TYPE_HANDYMAN = 1, RCT1_PEEP_SPRITE_TYPE_MECHANIC = 2, RCT1_PEEP_SPRITE_TYPE_SECURITY = 3, RCT1_PEEP_SPRITE_TYPE_ENTERTAINER_PANDA = 4, RCT1_PEEP_SPRITE_TYPE_ENTERTAINER_TIGER = 5, RCT1_PEEP_SPRITE_TYPE_ENTERTAINER_ELEPHANT = 6, RCT1_PEEP_SPRITE_TYPE_ENTERTAINER_ROMAN = 7, RCT1_PEEP_SPRITE_TYPE_ENTERTAINER_GORILLA = 8, RCT1_PEEP_SPRITE_TYPE_ENTERTAINER_SNOWMAN = 9, RCT1_PEEP_SPRITE_TYPE_ENTERTAINER_KNIGHT = 10, RCT1_PEEP_SPRITE_TYPE_ENTERTAINER_ASTRONAUT = 11, RCT1_PEEP_SPRITE_TYPE_BALLOON = 16, RCT1_PEEP_SPRITE_TYPE_CANDYFLOSS = 17, RCT1_PEEP_SPRITE_TYPE_UMBRELLA = 18, RCT1_PEEP_SPRITE_TYPE_PIZZA = 19, // Unsure RCT1_PEEP_SPRITE_TYPE_SECURITY_ALT = 20, // Unknown RCT1_PEEP_SPRITE_TYPE_POPCORN = 21, RCT1_PEEP_SPRITE_TYPE_ARMS_CROSSED = 22, RCT1_PEEP_SPRITE_TYPE_HEAD_DOWN = 23, RCT1_PEEP_SPRITE_TYPE_NAUSEOUS = 24, RCT1_PEEP_SPRITE_TYPE_VERY_NAUSEOUS = 25, RCT1_PEEP_SPRITE_TYPE_REQUIRE_BATHROOM = 26, RCT1_PEEP_SPRITE_TYPE_HAT = 27, RCT1_PEEP_SPRITE_TYPE_BURGER = 28, RCT1_PEEP_SPRITE_TYPE_TENTACLE = 29, RCT1_PEEP_SPRITE_TYPE_TOFFEE_APPLE = 30 }; typedef union rct1_sprite { uint8 pad_00[0x100]; rct1_unk_sprite unknown; rct1_vehicle vehicle; rct1_peep peep; rct_litter litter; rct_balloon balloon; rct_sprite duck; rct_jumping_fountain jumping_fountain; rct_money_effect money_effect; rct_crashed_vehicle_particle crashed_vehicle_particle; rct_crash_splash crash_splash; rct_steam_particle steam_particle; } rct1_sprite; assert_struct_size(rct1_sprite, 0x100); typedef struct rct1_research_item { uint8 item; uint8 related_ride; uint8 category; uint8 flags; uint8 expenditure_area; } rct1_research_item; assert_struct_size(rct1_research_item, 5); /** * RCT1,AA,LL scenario / saved game structure. * size: 0x1F850C */ typedef struct rct1_s4 { uint16 month; uint16 day; uint32 ticks; uint32 random_a; uint32 random_b; rct_map_element map_elements[RCT1_MAX_MAP_ELEMENTS]; uint32 unk_counter; rct1_sprite sprites[RCT1_MAX_SPRITES]; uint16 next_sprite_index; uint16 first_vehicle_sprite_index; uint16 first_peep_sprite_index; uint16 first_duck_sprite_index; uint16 first_litter_sprite_index; uint16 first_oversized_ride_car_sprite_index; uint16 sprites_available; uint16 num_vehicle_sprites; uint16 num_peep_sprites; uint16 num_duck_sprites; uint16 num_litter_sprites; uint16 num_oversized_ride_car_sprites; uint32 park_name_string_index; uint32 unk_198830; money32 cash; money32 loan; uint32 park_flags; money16 park_entrance_fee; rct1_entrance park_entrance; uint8 unk_198849; rct2_peep_spawn peep_spawn[RCT12_MAX_PEEP_SPAWNS]; uint8 unk_198856; uint8 research_level; uint32 unk_198858; uint8 available_rides[32]; uint8 available_vehicles[32]; uint32 ride_feature_1[128]; uint32 ride_feature_2[128]; uint16 guests_in_park; uint16 unk_198C9E; money32 expenditure[RCT12_EXPENDITURE_TABLE_MONTH_COUNT][RCT12_EXPENDITURE_TYPE_COUNT]; uint32 guests_in_park_2; uint8 unk_199024; colour_t handman_colour; colour_t mechanic_colour; colour_t security_guard_colour; uint8 available_scenery[128]; uint16 available_banners; uint8 unk_1990AA[94]; uint16 park_rating; uint8 park_rating_history[32]; uint8 guests_in_park_history[32]; uint8 research_priority; uint8 research_progress; uint8 last_research_item; uint8 last_research_ride; uint8 last_research_category; uint8 last_research_flag; rct1_research_item research_items[200]; uint8 next_research_item; uint8 next_research_ride; uint8 next_research_category; uint8 next_research_flag; uint16 unk_19953C; uint32 unk_19953E; uint16 cheat_detection_land_owned; uint16 unk_199544; money16 median_recommended_park_entry_fee; money32 max_loan; money16 guest_initial_cash; uint8 guest_initial_hunger; uint8 guest_initial_thirst; uint8 scenario_objective_type; uint8 scenario_objective_years; uint16 unk_199552; money32 scenario_objective_currency; uint16 scenario_objective_num_guests; uint8 marketing_status[20]; uint8 marketing_assoc[20]; uint8 unk_199582[2]; money32 cash_history[RCT12_FINANCE_GRAPH_SIZE]; money32 total_expenditure; money32 profit; uint8 unk_199788[8]; money32 weekly_profit_history[RCT12_FINANCE_GRAPH_SIZE]; money32 park_value; money32 park_value_history[RCT12_FINANCE_GRAPH_SIZE]; uint32 scenario_objective_score; uint32 num_admissions; money32 admission_total_income; money32 company_value; uint8 thought_timer[16]; rct12_award awards[RCT12_MAX_AWARDS]; money16 land_price; money16 construction_rights_price; uint16 unk_199BCC; uint16 unk_199BCE; uint32 unk_199BD0; char username[64]; uint32 game_version; money32 objective_completion_company_value; uint32 finance_checksum; uint16 num_rides; uint16 cheat_detection_neg_num_rides; uint16 cheat_detection_max_owned_tiles; uint16 cheat_detection_neg_max_owned_tiles; uint32 finance_checksum_3; uint32 scenario_slot_index_checksum; char scenario_winner[32]; uint32 finance_checksum_2; char copyright_notice[40]; uint16 cheat_detection_sv6_sc4[4]; uint16 unk_199C84; uint16 unk_199C86; uint16 map_size_units; uint16 map_size_unk_b; uint16 map_size; uint16 map_size_max_xy; uint32 same_price_flags; uint16 unk_199C94; uint8 unk_199C96[3]; uint8 water_colour; uint16 unk_199C9A; rct1_research_item research_items_LL[180]; uint8 unk_19A020[5468]; rct_banner banners[100]; char string_table[1024][32]; uint32 game_time_counter; rct1_ride rides[255]; uint16 unk_game_time_counter; uint16 view_x; uint16 view_y; uint8 view_zoom; uint8 view_rotation; rct_map_animation map_animations[RCT1_MAX_ANIMATED_OBJECTS]; uint32 num_map_animations; uint8 unk_1CADBC[12]; uint16 scrolling_text_step; uint32 unk_1CADCA; uint16 unk_1CADCE; uint8 unk_1CADD0[116]; rct_ride_measurement ride_measurements[8]; uint32 next_guest_index; uint16 game_counter_5; uint8 patrol_areas[(RCT1_MAX_STAFF + RCT12_STAFF_TYPE_COUNT) * RCT12_PATROL_AREA_SIZE]; uint8 staff_modes[RCT1_MAX_STAFF]; uint8 unk_1F431E[4]; uint8 unk_1F4322[8]; uint8 climate; uint8 unk_1F432B; uint16 climate_timer; uint8 weather; uint8 target_weather; uint8 temperature; uint8 target_temperature; uint8 thunder_frequency; uint8 target_thunder_frequency; uint8 weather_gloom; uint8 target_weather_gloom; uint8 rain; uint8 target_rain; rct12_news_item messages[RCT12_MAX_NEWS_ITEMS]; char scenario_name[62]; uint16 scenario_slot_index; uint32 scenario_flags; uint8 unk_1F8358[432]; uint32 expansion_pack_checksum; } rct1_s4; assert_struct_size(rct1_s4, 0x1F850C); /** * Track design structure. * size: 0x2006 */ typedef struct rct_track_td4 { uint8 type; // 0x00 uint8 vehicle_type; uint32 flags; // 0x02 uint8 mode; // 0x06 uint8 version_and_colour_scheme; // 0x07 0b0000_VVCC rct_vehicle_colour vehicle_colours[RCT1_MAX_TRAINS_PER_RIDE]; // 0x08 uint8 track_spine_colour_v0; // 0x20 uint8 track_rail_colour_v0; // 0x21 uint8 track_support_colour_v0; // 0x22 uint8 depart_flags; // 0x23 uint8 number_of_trains; // 0x24 uint8 number_of_cars_per_train; // 0x25 uint8 min_waiting_time; // 0x26 uint8 max_waiting_time; // 0x27 union { uint8 operation_setting; uint8 launch_speed; uint8 num_laps; uint8 max_people; }; sint8 max_speed; // 0x29 sint8 average_speed; // 0x2A uint16 ride_length; // 0x2B uint8 max_positive_vertical_g; // 0x2D sint8 max_negative_vertical_g; // 0x2C uint8 max_lateral_g; // 0x2F union { uint8 num_inversions; // 0x30 uint8 num_holes; // 0x30 }; uint8 num_drops; // 0x31 uint8 highest_drop_height; // 0x32 uint8 excitement; // 0x33 uint8 intensity; // 0x34 uint8 nausea; // 0x35 money16 upkeep_cost; // 0x36 // Added Attractions / Loopy Landscapes only uint8 track_spine_colour[4]; // 0x38 uint8 track_rail_colour[4]; // 0x3C uint8 track_support_colour[4]; // 0x40 uint8 flags2; // 0x44 uint8 var_45[0x7F]; // 0x45 void *elements; // 0xC4 (data starts here in file, 38 for original RCT1) size_t elementsSize; } rct_track_td4; #pragma pack(pop) enum { RCT1_RIDE_TYPE_NULL = 255, RCT1_RIDE_TYPE_WOODEN_ROLLER_COASTER = 0, RCT1_RIDE_TYPE_STAND_UP_STEEL_ROLLER_COASTER, RCT1_RIDE_TYPE_SUSPENDED_ROLLER_COASTER, RCT1_RIDE_TYPE_INVERTED_ROLLER_COASTER, RCT1_RIDE_TYPE_STEEL_MINI_ROLLER_COASTER, RCT1_RIDE_TYPE_MINIATURE_RAILROAD, RCT1_RIDE_TYPE_MONORAIL, RCT1_RIDE_TYPE_SUSPENDED_SINGLE_RAIL_ROLLER_COASTER, RCT1_RIDE_TYPE_BOAT_HIRE, RCT1_RIDE_TYPE_WOODEN_CRAZY_RODENT_ROLLER_COASTER, RCT1_RIDE_TYPE_SINGLE_RAIL_ROLLER_COASTER, RCT1_RIDE_TYPE_CAR_RIDE, RCT1_RIDE_TYPE_LAUNCHED_FREEFALL, RCT1_RIDE_TYPE_BOBSLED_ROLLER_COASTER, RCT1_RIDE_TYPE_OBSERVATION_TOWER, RCT1_RIDE_TYPE_STEEL_ROLLER_COASTER, RCT1_RIDE_TYPE_WATER_SLIDE, RCT1_RIDE_TYPE_MINE_TRAIN_ROLLER_COASTER, RCT1_RIDE_TYPE_CHAIRLIFT, RCT1_RIDE_TYPE_STEEL_CORKSCREW_ROLLER_COASTER, RCT1_RIDE_TYPE_HEDGE_MAZE, RCT1_RIDE_TYPE_SPIRAL_SLIDE, RCT1_RIDE_TYPE_GO_KARTS, RCT1_RIDE_TYPE_LOG_FLUME, RCT1_RIDE_TYPE_RIVER_RAPIDS, RCT1_RIDE_TYPE_DODGEMS, RCT1_RIDE_TYPE_SWINGING_SHIP, RCT1_RIDE_TYPE_SWINGING_INVERTER_SHIP, RCT1_RIDE_TYPE_ICE_CREAM_STALL, RCT1_RIDE_TYPE_CHIPS_STALL, RCT1_RIDE_TYPE_DRINK_STALL, RCT1_RIDE_TYPE_CANDYFLOSS_STALL, RCT1_RIDE_TYPE_BURGER_BAR, RCT1_RIDE_TYPE_MERRY_GO_ROUND, RCT1_RIDE_TYPE_BALLOON_STALL, RCT1_RIDE_TYPE_INFORMATION_KIOSK, RCT1_RIDE_TYPE_TOILETS, RCT1_RIDE_TYPE_FERRIS_WHEEL, RCT1_RIDE_TYPE_MOTION_SIMULATOR, RCT1_RIDE_TYPE_3D_CINEMA, RCT1_RIDE_TYPE_GRAVITRON, RCT1_RIDE_TYPE_SPACE_RINGS, RCT1_RIDE_TYPE_REVERSE_FREEFALL_ROLLER_COASTER, RCT1_RIDE_TYPE_SOUVENIR_STALL, RCT1_RIDE_TYPE_VERTICAL_ROLLER_COASTER, RCT1_RIDE_TYPE_PIZZA_STALL, RCT1_RIDE_TYPE_SCRAMBLED_EGGS, RCT1_RIDE_TYPE_HAUNTED_HOUSE, RCT1_RIDE_TYPE_POPCORN_STALL, RCT1_RIDE_TYPE_CIRCUS_SHOW, RCT1_RIDE_TYPE_GHOST_TRAIN, RCT1_RIDE_TYPE_STEEL_TWISTER_ROLLER_COASTER, RCT1_RIDE_TYPE_WOODEN_TWISTER_ROLLER_COASTER, RCT1_RIDE_TYPE_WOODEN_SIDE_FRICTION_ROLLER_COASTER, RCT1_RIDE_TYPE_STEEL_WILD_MOUSE_ROLLER_COASTER, RCT1_RIDE_TYPE_HOT_DOG_STALL, RCT1_RIDE_TYPE_EXOTIC_SEA_FOOD_STALL, RCT1_RIDE_TYPE_HAT_STALL, RCT1_RIDE_TYPE_CANDY_APPLE_STAND, RCT1_RIDE_TYPE_VIRGINIA_REEL, RCT1_RIDE_TYPE_RIVER_RIDE, RCT1_RIDE_TYPE_CYCLE_MONORAIL, RCT1_RIDE_TYPE_FLYING_ROLLER_COASTER, RCT1_RIDE_TYPE_SUSPENDED_MONORAIL, RCT1_RIDE_TYPE_40, RCT1_RIDE_TYPE_WOODEN_REVERSER_ROLLER_COASTER, RCT1_RIDE_TYPE_HEARTLINE_TWISTER_ROLLER_COASTER, RCT1_RIDE_TYPE_MINIATURE_GOLF, RCT1_RIDE_TYPE_44, RCT1_RIDE_TYPE_ROTO_DROP, RCT1_RIDE_TYPE_FLYING_SAUCERS, RCT1_RIDE_TYPE_CROOKED_HOUSE, RCT1_RIDE_TYPE_CYCLE_RAILWAY, RCT1_RIDE_TYPE_SUSPENDED_LOOPING_ROLLER_COASTER, RCT1_RIDE_TYPE_WATER_COASTER, RCT1_RIDE_TYPE_AIR_POWERED_VERTICAL_COASTER, RCT1_RIDE_TYPE_INVERTED_WILD_MOUSE_COASTER, RCT1_RIDE_TYPE_JET_SKIS, RCT1_RIDE_TYPE_T_SHIRT_STALL, RCT1_RIDE_TYPE_RAFT_RIDE, RCT1_RIDE_TYPE_DOUGHNUT_SHOP, RCT1_RIDE_TYPE_ENTERPRISE, RCT1_RIDE_TYPE_COFFEE_SHOP, RCT1_RIDE_TYPE_FRIED_CHICKEN_STALL, RCT1_RIDE_TYPE_LEMONADE_STALL, RCT1_RIDE_TYPE_COUNT }; enum { RCT1_VEHICLE_TYPE_STEEL_ROLLER_COASTER_TRAIN = 0, RCT1_VEHICLE_TYPE_STEEL_ROLLER_COASTER_TRAIN_BACKWARDS, RCT1_VEHICLE_TYPE_WOODEN_ROLLER_COASTER_TRAIN, RCT1_VEHICLE_TYPE_INVERTED_COASTER_TRAIN, // Not in RCT2 RCT1_VEHICLE_TYPE_SUSPENDED_SWINGING_CARS, RCT1_VEHICLE_TYPE_LADYBIRD_CARS, RCT1_VEHICLE_TYPE_STANDUP_ROLLER_COASTER_CARS, RCT1_VEHICLE_TYPE_SPINNING_CARS, RCT1_VEHICLE_TYPE_SINGLE_PERSON_SWINGING_CHAIRS, RCT1_VEHICLE_TYPE_SWANS_PEDAL_BOATS, RCT1_VEHICLE_TYPE_LARGE_MONORAIL_TRAIN, RCT1_VEHICLE_TYPE_CANOES, RCT1_VEHICLE_TYPE_ROWING_BOATS, RCT1_VEHICLE_TYPE_STEAM_TRAIN, RCT1_VEHICLE_TYPE_WOODEN_MOUSE_CARS, RCT1_VEHICLE_TYPE_BUMPER_BOATS, RCT1_VEHICLE_TYPE_WOODEN_ROLLER_COASTER_TRAIN_BACKWARDS, RCT1_VEHICLE_TYPE_ROCKET_CARS, RCT1_VEHICLE_TYPE_HORSES, // Steeplechase RCT1_VEHICLE_TYPE_SPORTSCARS, RCT1_VEHICLE_TYPE_LYING_DOWN_SWINGING_CARS, // Inverted single-rail RCT1_VEHICLE_TYPE_WOODEN_MINE_CARS, RCT1_VEHICLE_TYPE_SUSPENDED_SWINGING_AIRPLANE_CARS, RCT1_VEHICLE_TYPE_SMALL_MONORAIL_CARS, RCT1_VEHICLE_TYPE_WATER_TRICYCLES, RCT1_VEHICLE_TYPE_LAUNCHED_FREEFALL_CAR, RCT1_VEHICLE_TYPE_BOBSLEIGH_CARS, RCT1_VEHICLE_TYPE_DINGHIES, RCT1_VEHICLE_TYPE_ROTATING_CABIN, RCT1_VEHICLE_TYPE_MINE_TRAIN, RCT1_VEHICLE_TYPE_CHAIRLIFT_CARS, RCT1_VEHICLE_TYPE_CORKSCREW_ROLLER_COASTER_TRAIN, RCT1_VEHICLE_TYPE_MOTORBIKES, RCT1_VEHICLE_TYPE_RACING_CARS, RCT1_VEHICLE_TYPE_TRUCKS, RCT1_VEHICLE_TYPE_GO_KARTS, RCT1_VEHICLE_TYPE_RAPIDS_BOATS, RCT1_VEHICLE_TYPE_LOG_FLUME_BOATS, RCT1_VEHICLE_TYPE_DODGEMS, RCT1_VEHICLE_TYPE_SWINGING_SHIP, RCT1_VEHICLE_TYPE_SWINGING_INVERTER_SHIP, RCT1_VEHICLE_TYPE_MERRY_GO_ROUND, RCT1_VEHICLE_TYPE_FERRIS_WHEEL, RCT1_VEHICLE_TYPE_SIMULATOR_POD, RCT1_VEHICLE_TYPE_CINEMA_BUILDING, RCT1_VEHICLE_TYPE_TOPSPIN_CAR, RCT1_VEHICLE_TYPE_SPACE_RINGS, RCT1_VEHICLE_TYPE_REVERSE_FREEFALL_ROLLER_COASTER_CAR, RCT1_VEHICLE_TYPE_VERTICAL_ROLLER_COASTER_CARS, RCT1_VEHICLE_TYPE_CAT_CARS, RCT1_VEHICLE_TYPE_TWIST_ARMS_AND_CARS, RCT1_VEHICLE_TYPE_HAUNTED_HOUSE_BUILDING, RCT1_VEHICLE_TYPE_LOG_CARS, RCT1_VEHICLE_TYPE_CIRCUS_TENT, RCT1_VEHICLE_TYPE_GHOST_TRAIN_CARS, RCT1_VEHICLE_TYPE_STEEL_TWISTER_ROLLER_COASTER_TRAIN, RCT1_VEHICLE_TYPE_WOODEN_TWISTER_ROLLER_COASTER_TRAIN, RCT1_VEHICLE_TYPE_WOODEN_SIDE_FRICTION_CARS, RCT1_VEHICLE_TYPE_VINTAGE_CARS, RCT1_VEHICLE_TYPE_STEAM_TRAIN_COVERED_CARS, RCT1_VEHICLE_TYPE_STAND_UP_STEEL_TWISTER_ROLLER_COASTER_TRAIN, RCT1_VEHICLE_TYPE_FLOORLESS_STEEL_TWISTER_ROLLER_COASTER_TRAIN, RCT1_VEHICLE_TYPE_STEEL_MOUSE_CARS, RCT1_VEHICLE_TYPE_CHAIRLIFT_CARS_ALTERNATIVE, RCT1_VEHICLE_TYPE_SUSPENDED_MONORAIL_TRAIN, RCT1_VEHICLE_TYPE_HELICOPTER_CARS, RCT1_VEHICLE_TYPE_VIRGINIA_REEL_TUBS, RCT1_VEHICLE_TYPE_REVERSER_CARS, RCT1_VEHICLE_TYPE_GOLFERS, RCT1_VEHICLE_TYPE_RIVER_RIDE_BOATS, RCT1_VEHICLE_TYPE_FLYING_ROLLER_COASTER_TRAIN, RCT1_VEHICLE_TYPE_NON_LOOPING_STEEL_TWISTER_ROLLER_COASTER_TRAIN, RCT1_VEHICLE_TYPE_HEARTLINE_TWISTER_CARS, RCT1_VEHICLE_TYPE_HEARTLINE_TWISTER_CARS_REVERSED, RCT1_VEHICLE_TYPE_RESERVED, RCT1_VEHICLE_TYPE_ROTODROP_CAR, RCT1_VEHICLE_TYPE_FLYING_SAUCERS, RCT1_VEHICLE_TYPE_CROOKED_HOUSE_BUILDING, RCT1_VEHICLE_TYPE_BICYCLES, RCT1_VEHICLE_TYPE_HYPERCOASTER_TRAIN, RCT1_VEHICLE_TYPE_4_ACROSS_INVERTED_COASTER_TRAIN, RCT1_VEHICLE_TYPE_WATER_COASTER_BOATS, RCT1_VEHICLE_TYPE_FACEOFF_CARS, RCT1_VEHICLE_TYPE_JET_SKIS, RCT1_VEHICLE_TYPE_RAFT_BOATS, RCT1_VEHICLE_TYPE_AMERICAN_STYLE_STEAM_TRAIN, RCT1_VEHICLE_TYPE_AIR_POWERED_COASTER_TRAIN, RCT1_VEHICLE_TYPE_SUSPENDED_WILD_MOUSE_CARS, // Inverted Hairpin in RCT2 RCT1_VEHICLE_TYPE_ENTERPRISE_WHEEL, RCT1_VEHICLE_TYPE_COUNT }; enum { RCT1_TRACK_ELEM_BOOSTER = 100 }; enum { RCT1_RIDE_MODE_REVERSE_INCLINE_LAUNCHED_SHUTTLE = 2, RCT1_RIDE_MODE_POWERED_LAUNCH = 3, }; enum { RCT1_RIDE_DEPART_PLAY_MUSIC = 1 << 5, }; enum { RCT1_SCENERY_THEME_GENERAL, RCT1_SCENERY_THEME_MINE, RCT1_SCENERY_THEME_CLASSICAL_ROMAN, RCT1_SCENERY_THEME_EGYPTIAN, RCT1_SCENERY_THEME_MARTIAN, RCT1_SCENERY_THEME_JUMPING_FOUNTAINS, // Single researchable scenery item RCT1_SCENERY_THEME_WONDERLAND, RCT1_SCENERY_THEME_JURASSIC, RCT1_SCENERY_THEME_SPOOKY, RCT1_SCENERY_THEME_JUNGLE, RCT1_SCENERY_THEME_ABSTRACT, RCT1_SCENERY_THEME_GARDEN_CLOCK, // Single researchable scenery item RCT1_SCENERY_THEME_SNOW_ICE, RCT1_SCENERY_THEME_MEDIEVAL, RCT1_SCENERY_THEME_SPACE, RCT1_SCENERY_THEME_CREEPY, RCT1_SCENERY_THEME_URBAN, RCT1_SCENERY_THEME_PAGODA, }; enum { RCT1_FOOTPATH_TYPE_QUEUE_BLUE, RCT1_FOOTPATH_TYPE_QUEUE_RED, RCT1_FOOTPATH_TYPE_QUEUE_YELLOW, RCT1_FOOTPATH_TYPE_QUEUE_GREEN, RCT1_FOOTPATH_TYPE_TARMAC_GRAY, RCT1_FOOTPATH_TYPE_TARMAC_RED, RCT1_FOOTPATH_TYPE_TARMAC_BROWN, RCT1_FOOTPATH_TYPE_TARMAC_GREEN, RCT1_FOOTPATH_TYPE_DIRT_RED, RCT1_FOOTPATH_TYPE_DIRT_BLACK, RCT1_FOOTPATH_TYPE_CRAZY_PAVING = 12, RCT1_FOOTPATH_TYPE_ROADS = 16, RCT1_FOOTPATH_TYPE_TILE_PINK = 20, RCT1_FOOTPATH_TYPE_TILE_GRAY, RCT1_FOOTPATH_TYPE_TILE_RED, RCT1_FOOTPATH_TYPE_TILE_GREEN, }; enum { FOOTPATH_SUPPORTS_WOODEN_TRUSS, FOOTPATH_SUPPORTS_WOOD, FOOTPATH_SUPPORTS_STEEL, FOOTPATH_SUPPORTS_BAMBOO, }; enum { RCT1_PATH_ADDITION_NONE, RCT1_PATH_ADDITION_LAMP_1, RCT1_PATH_ADDITION_LAMP_2, RCT1_PATH_ADDITION_BIN, RCT1_PATH_ADDITION_BENCH, RCT1_PATH_ADDITION_JUMPING_FOUNTAIN, RCT1_PATH_ADDITION_LAMP_3, RCT1_PATH_ADDITION_LAMP_4, RCT1_PATH_ADDITION_BROKEN_LAMP_1, RCT1_PATH_ADDITION_BROKEN_LAMP_2, RCT1_PATH_ADDITION_BROKEN_BIN, RCT1_PATH_ADDITION_BROKEN_BENCH, RCT1_PATH_ADDITION_BROKEN_LAMP_3, RCT1_PATH_ADDITION_BROKEN_LAMP_4, RCT1_PATH_ADDITION_JUMPING_SNOW, }; enum { RCT1_WALL_TYPE_GLASS_SMOOTH = 11, RCT1_WALL_TYPE_GLASS_PANELS = 22, RCT1_WALL_TYPE_WOODEN_PANEL_FENCE = 12, RCT1_WALL_TYPE_WOODEN_PANEL_FENCE_WITH_GATE = 13, RCT1_WALL_TYPE_WHITE_WOODEN_PANEL_FENCE = 26, RCT1_WALL_TYPE_RED_WOODEN_PANEL_FENCE = 27, RCT1_WALL_TYPE_SMALL_GREY_CASTLE = 35, RCT1_WALL_TYPE_LARGE_CREY_CASTLE = 42, RCT1_WALL_TYPE_LARGE_CREY_CASTLE_CROSS = 43, RCT1_WALL_TYPE_LARGE_CREY_CASTLE_GATE = 44, RCT1_WALL_TYPE_LARGE_CREY_CASTLE_WINDOW = 45, RCT1_WALL_TYPE_MEDIUM_CREY_CASTLE = 46, RCT1_WALL_TYPE_WOODEN_PANEL_FENCE_WITH_SNOW = 50, }; enum { RCT1_RESEARCH_END_AVAILABLE = 0xFF, RCT1_RESEARCH_END_RESEARCHABLE = 0xFE, RCT1_RESEARCH_END = 0xFD, }; enum { RCT1_RESEARCH_CATEGORY_THEME, RCT1_RESEARCH_CATEGORY_RIDE, RCT1_RESEARCH_CATEGORY_VEHICLE, RCT1_RESEARCH_CATEGORY_SPECIAL, }; enum { RCT1_RESEARCH_EXPENDITURE_ROLLERCOASTERS = 1 << 0, RCT1_RESEARCH_EXPENDITURE_THRILL_RIDES = 1 << 1, RCT1_RESEARCH_EXPENDITURE_GENTLE_TRANSPORT_RIDES = 1 << 2, RCT1_RESEARCH_EXPENDITURE_SHOPS = 1 << 3, RCT1_RESEARCH_EXPENDITURE_SCENERY_THEMEING = 1 << 4, RCT1_RESEARCH_EXPENDITURE_RIDE_IMPROVEMENTS = 1 << 5, }; // Unconfirmed special track elements for research enum { RCT1_RESEARCH_SPECIAL_BANKED_CURVES = 0x06, RCT1_RESEARCH_SPECIAL_VERTICAL_LOOP = 0x07, RCT1_RESEARCH_SPECIAL_STEEP_TWIST = 0x0C, RCT1_RESEARCH_SPECIAL_INLINE_TWIST = 0x11, RCT1_RESEARCH_SPECIAL_HALF_LOOP = 0x12, RCT1_RESEARCH_SPECIAL_CORKSCREW = 0x13, RCT1_RESEARCH_SPECIAL_BANKED_HELIX_A = 0x15, RCT1_RESEARCH_SPECIAL_BANKED_HELIX_B = 0x16, RCT1_RESEARCH_SPECIAL_HELIX = 0x17, RCT1_RESEARCH_SPECIAL_ON_RIDE_PHOTO = 0x1A, RCT1_RESEARCH_SPECIAL_WATER_SPLASH = 0x1B, RCT1_RESEARCH_SPECIAL_VERTICAL_DROP = 0x1C, RCT1_RESEARCH_SPECIAL_BARREL_ROLL = 0x1D, RCT1_RESEARCH_SPECIAL_LAUNCHED_LIFT_HILL = 0x1E, RCT1_RESEARCH_SPECIAL_LARGE_LOOP_AND_HALF = 0x1F, RCT1_RESEARCH_SPECIAL_REVERSER_TURNTABLE = 0x21, RCT1_RESEARCH_SPECIAL_HEARTLINE_ROLL = 0x22, RCT1_RESEARCH_SPECIAL_REVERSING_SECTIONS = 0x23, }; 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, }; enum { RCT1_PARK_FLAGS_PARK_OPEN = (1 << 0), RCT1_PARK_FLAGS_SCENARIO_COMPLETE_NAME_INPUT = (1 << 1), RCT1_PARK_FLAGS_FORBID_LANDSCAPE_CHANGES = (1 << 2), RCT1_PARK_FLAGS_FORBID_TREE_REMOVAL = (1 << 3), RCT1_PARK_FLAGS_SHOW_REAL_GUEST_NAMES = (1 << 4), RCT1_PARK_FLAGS_FORBID_HIGH_CONSTRUCTION = (1 << 5), // Below tree height RCT1_PARK_FLAGS_PREF_LESS_INTENSE_RIDES = (1 << 6), RCT1_PARK_FLAGS_FORBID_MARKETING_CAMPAIGN = (1 << 7), RCT1_PARK_FLAGS_ANTI_CHEAT_DEPRECATED = (1 << 8), // Not used anymore, used for cheat detection RCT1_PARK_FLAGS_PREF_MORE_INTENSE_RIDES = (1 << 9), RCT1_PARK_FLAGS_NO_MONEY = (1 << 11), // Used for both scenarios and saved games, unlike RCT2 RCT1_PARK_FLAGS_DIFFICULT_GUEST_GENERATION = (1 << 12), RCT1_PARK_FLAGS_PARK_ENTRY_LOCKED_AT_FREE = (1 << 13), // Off: rides and park entry chargeable. On: only rides chargeable. RCT1_PARK_FLAGS_DIFFICULT_PARK_RATING = (1 << 14), RCT1_PARK_FLAGS_LOCK_REAL_NAMES_OPTION_DEPRECATED = (1 << 15), // Deprecated now we use a persistent 'real names' setting }; enum { STEEL_RC_FRONT = 0, STEEL_RC_CARRIAGE = 1, WOODEN_RC_TRAIN = 2, MONORAIL_CARRIAGE = 10, MONORAIL_FRONT = 11, MONORAIL_BACK = 12, MINIATURE_RAILWAY_TENDER = 15, MINIATURE_RAILWAY_LOCOMOTIVE = 16, MINIATURE_RAILWAY_CARRIAGE = 17, MINE_TRAIN_FRONT = 35, MINE_TRAIN_CARRIAGE = 36, CORKSCREW_RC_FRONT = 38, CORKSCREW_RC_CARRIAGE = 39, GHOST_TRAIN_CAR = 63, TWISTER_RC_SPOILER = 64, TWISTER_RC_CARRIAGE = 65, GHOST_TRAIN_INVISIBLE = 66, ARTICULATED_RC_FRONT = 67, ARTICULATED_RC_CARRIAGE = 68, MINIATURE_RAILWAY_CARRIAGE_COVERED = 71, STANDUP_TWISTER_RC_CARRIAGE = 72, REVERSER_RC_CAR = 79, REVERSER_RC_BOGIE = 80, MINIGOLF_PLAYER = 81, MINIGOLF_BALL = 82, SPLASH_BOAT = 83, SPLASH_BOAT_INVISIBLE = 84, HYPERCOASTER_FRONT = 96, HYPERCOASTER_CARRIAGE = 97, INVERTED_4_ACROSS_CARRIAGE = 98, WATER_COASTER_BOAT = 99, WATER_COASTER_INVISIBLE = 101, RIVER_RAFT = 103, }; enum { COPY_COLOUR_1 = -1, COPY_COLOUR_2 = -2, }; enum { RCT1_WATER_CYAN, RCT1_WATER_ORANGE }; #ifdef __cplusplus extern "C" { #endif extern const uint8 gRideCategories[RIDE_TYPE_COUNT]; bool rideTypeShouldLoseSeparateFlag(const rct_ride_entry *rideEntry); ParkLoadResult * load_from_sv4(const char *path); ParkLoadResult * load_from_sc4(const char *path); #ifdef __cplusplus } #endif #endif