OpenRCT2/src/openrct2/rct1.h

1239 lines
47 KiB
C

#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_TILE_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_tile_element tile_elements[RCT1_MAX_TILE_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 total_ride_value_for_money;
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