#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/news_item.h"
#include "management/research.h"
#include "rct12.h"
#include "rct2.h"
#include "ride/ride.h"
#include "world/banner.h"
#include "world/map.h"
#include "world/sprite.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_RESEARCH_FLAGS_SEPARATOR 0xFF

#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;
    uint8 vehicle_type;
    uint16 lifecycle_flags;
    uint8 operating_mode;
    uint8 colour_scheme;
    struct {
        colour_t body;
        colour_t trim;
    } vehicle_colours[RCT1_MAX_TRAINS_PER_RIDE];
    colour_t track_primary_colour;
    colour_t track_secondary_colour;
    colour_t track_support_colour;
    uint8 status;
    uint16 name;
    uint16 name_argument_ride;
    uint16 name_argument_number;
    uint16 overall_view;
    uint16 station_starts[RCT12_MAX_STATIONS_PER_RIDE];
    uint8 station_height[RCT12_MAX_STATIONS_PER_RIDE];
    uint8 station_length[RCT12_MAX_STATIONS_PER_RIDE];
    uint8 station_light[RCT12_MAX_STATIONS_PER_RIDE];
    uint8 station_depart[RCT12_MAX_STATIONS_PER_RIDE];
    uint16 entrance[RCT12_MAX_STATIONS_PER_RIDE];
    uint16 exit[RCT12_MAX_STATIONS_PER_RIDE];
    uint16 last_peep_in_queue[RCT12_MAX_STATIONS_PER_RIDE];
    uint8 num_peeps_in_queue[RCT12_MAX_STATIONS_PER_RIDE];
    uint16 vehicles[RCT1_MAX_TRAINS_PER_RIDE];
    uint8 depart_flags;
    uint8 num_stations;
    uint8 num_trains;
    uint8 num_cars_per_train;
    uint8 proposed_num_vehicles;    // 0x7A
    uint8 proposed_num_cars_per_train; // 0x7B
    uint8 max_trains;
    uint8 min_max_cars_per_train; // 0x7D
    uint8 min_waiting_time;
    uint8 max_waiting_time;
    uint8 operation_option;
    uint8 boat_hire_return_direction;
    rct_xy8 boat_hire_return_position;
    uint8 data_logging_index;
    uint8 special_track_elements;
    uint16 unk_86;
    sint32 max_speed;
    sint32 average_speed;
    uint8 current_test_segment;     // 0x90
    uint8 average_speed_test_timeout; // 0x91
    uint8 pad_0E2[0x2]; // 0x92
    sint32 length[RCT12_MAX_STATIONS_PER_RIDE];
    uint16 time[RCT12_MAX_STATIONS_PER_RIDE];
    fixed16_2dp max_positive_vertical_g;
    fixed16_2dp max_negative_vertical_g;
    fixed16_2dp max_lateral_g;
    fixed16_2dp previous_vertical_g;// 0xB2
    fixed16_2dp previous_lateral_g; // 0xB4
    uint8 pad_106[0x2];
    uint32 testing_flags;           // 0xB8
    // x y map location of the current track piece during a test
    // this is to prevent counting special tracks multiple times
    rct_xy8 cur_test_track_location;    // 0xBC
    // Next 3 variables are related (XXXX XYYY ZZZa aaaa)
    uint16 turn_count_default;      // 0xBE X = current turn count
    uint16 turn_count_banked;       // 0xC0
    uint16 turn_count_sloped;       // 0xC2 X = number turns > 3 elements
    union {
        uint8 num_inversions;
        uint8 num_holes;
    };
    uint8 num_drops;
    uint8 start_drop_height;
    uint8 highest_drop_height;
    sint32 sheltered_length;
    uint8 unk_CC[2];
    uint8 num_sheltered_sections;
    // see cur_test_track_location
    uint8 cur_test_track_z;         // 0xCF
    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;
    rct_xy8 chairlift_bullwheel_location[2]; // 0xEA
    uint8 chairlift_bullwheel_z[2]; // 0xEE
    union {
        rating_tuple ratings;
        struct {
            ride_rating excitement;
            ride_rating intensity;
            ride_rating nausea;
        };
    };
    uint16 value;
    uint16 chairlift_bullwheel_rotation; // 0xF8
    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 music_tune_id;            // 0x10C
    uint8 slide_in_use;             // 0x10D
    union {
        uint16 slide_peep;          // 0x10E
        uint16 maze_tiles;          // 0x10E
    };
    uint8 pad_110[0xE];
    uint8 slide_peep_t_shirt_colour;// 0x11E
    uint8 pad_11F[0x7];
    uint8 spiral_slide_progress;    // 0x126
    uint8 pad_127[0x9];
    sint16 build_date;              // 0x130
    money16 upkeep_cost;            // 0x131
    uint16 race_winner;             // 0x132
    uint8 unk_134[2];
    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];
    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[RCT12_MAX_STATIONS_PER_RIDE];
    colour_t track_colour_main[4];
    colour_t track_colour_additional[4];
    colour_t track_colour_supports[4];
    uint8 music;
    uint8 entrance_style;
    uint8 unk_17A[230];
} 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 center 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 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
    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 center 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 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;         // 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)
        rct_xy8 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 center 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 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;         // 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_growth_rate;       // 0x39
    uint8 happiness;                // 0x3A
    uint8 happiness_growth_rate;    // 0x3B
    uint8 nausea;                   // 0x3C
    uint8 nausea_growth_rate;       // 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
    rct_xyzd8 pathfind_goal;        // 0xCC
    rct_xyzd8 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[14 * 16];
    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[128];
    money32 total_expenditure;
    money32 profit;
    uint8 unk_199788[8];
    money32 weekly_profit_history[128];
    money32 park_value;
    money32 park_value_history[128];
    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;
    uint8 map_animations[6000];
    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[0x3C00];
    uint8 unk_1F42AA[116];
    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
};

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
};

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
};

extern const uint8 gRideCategories[RIDE_TYPE_COUNT];

sint32 vehicle_preference_compare(uint8 rideType, const char * a, const char * b);
bool rideTypeShouldLoseSeparateFlag(const rct_ride_entry *rideEntry);

bool rct1_load_saved_game(const char *path);
bool rct1_load_scenario(const char *path);

colour_t rct1_get_colour(colour_t colour);

#endif
