OpenRCT2/src/ride/vehicle.h

404 lines
13 KiB
C

#pragma region Copyright (c) 2014-2016 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 _VEHICLE_H_
#define _VEHICLE_H_
#include "../common.h"
#pragma pack(push, 1)
/* size: 0x2 */
typedef struct rct_vehicle_colour {
uint8 body_colour;
uint8 trim_colour;
} rct_vehicle_colour;
assert_struct_size(rct_vehicle_colour, 2);
/**
* Ride type vehicle structure.
* size: 0x65
*/
typedef struct rct_ride_entry_vehicle {
uint16 rotation_frame_mask; // 0x00 , 0x1A
uint8 var_02; // 0x02 , 0x1C
uint8 var_03; // 0x03 , 0x1D
uint32 spacing; // 0x04 , 0x1E
uint16 car_friction; // 0x08 , 0x22
sint8 tab_height; // 0x0A , 0x24
uint8 num_seats; // 0x0B , 0x25
uint16 sprite_flags; // 0x0C , 0x26
uint8 sprite_width; // 0x0E , 0x28
uint8 sprite_height_negative; // 0x0F , 0x29
uint8 sprite_height_positive; // 0x10 , 0x2A
uint8 var_11; // 0x11 , 0x2B
uint16 flags_a; // 0x12 , 0x2C
uint16 flags_b; // 0x14 , 0x2E
uint16 var_16; // 0x16 , 0x30
uint32 base_image_id; // 0x18 , 0x32
uint32 var_1C; // 0x1C , 0x36
uint32 var_20; // 0x20 , 0x3A
uint32 var_24; // 0x24 , 0x3E
uint32 var_28; // 0x28 , 0x42
uint32 var_2C; // 0x2C , 0x46
uint32 var_30; // 0x30 , 0x4A
uint32 var_34; // 0x34 , 0x4E
uint32 var_38; // 0x38 , 0x52
uint32 var_3C; // 0x3C , 0x56
uint32 var_40; // 0x40 , 0x5A
uint32 var_44; // 0x44 , 0x5E
uint32 var_48; // 0x48 , 0x62
uint32 var_4C; // 0x4C , 0x66
uint32 no_vehicle_images; // 0x50 , 0x6A
uint8 no_seating_rows; // 0x54 , 0x6E
uint8 spinning_inertia; // 0x55 , 0x6F
uint8 spinning_friction; // 0x56 , 0x70
uint8 friction_sound_id; // 0x57 , 0x71
uint8 var_58; // 0x58 , 0x72
uint8 sound_range; // 0x59 , 0x73
uint8 var_5A; // 0x5A , 0x74
uint8 powered_acceleration; // 0x5B , 0x75
uint8 powered_max_speed; // 0x5C , 0x76
uint8 car_visual; // 0x5D , 0x77
uint8 effect_visual;
uint8 draw_order;
uint8 special_frames; // 0x60 , 0x7A
sint8* peep_loading_positions; // 0x61 , 0x7B
} rct_ride_entry_vehicle;
#ifdef PLATFORM_32BIT
assert_struct_size(rct_ride_entry_vehicle, 0x65);
#endif
typedef struct rct_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 break_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
uint8 seat_rotation; // 0xD8
uint8 target_seat_rotation; // 0xD9
} rct_vehicle;
assert_struct_size(rct_vehicle, 0xDA);
#pragma pack(pop)
typedef struct train_ref {
rct_vehicle *head;
rct_vehicle *tail;
} train_ref;
// Size: 0x09
typedef struct rct_vehicle_info {
sint16 x; // 0x00
sint16 y; // 0x02
sint16 z; // 0x04
uint8 direction; // 0x06
uint8 vehicle_sprite_type; // 0x07
uint8 bank_rotation; // 0x08
} rct_vehicle_info;
enum {
VEHICLE_ENTRY_FLAG_A_0 = 1 << 0,
VEHICLE_ENTRY_FLAG_A_1 = 1 << 1,
VEHICLE_ENTRY_FLAG_A_2 = 1 << 2,
VEHICLE_ENTRY_FLAG_A_MINI_GOLF = 1 << 3,
VEHICLE_ENTRY_FLAG_A_4 = 1 << 4,
VEHICLE_ENTRY_FLAG_A_5 = 1 << 5,
VEHICLE_ENTRY_FLAG_A_6 = 1 << 6,
VEHICLE_ENTRY_FLAG_A_7 = 1 << 7,
VEHICLE_ENTRY_FLAG_A_8 = 1 << 8,
VEHICLE_ENTRY_FLAG_A_9 = 1 << 9,
VEHICLE_ENTRY_FLAG_A_10 = 1 << 10,
VEHICLE_ENTRY_FLAG_A_11 = 1 << 11,
VEHICLE_ENTRY_FLAG_A_12 = 1 << 12,
VEHICLE_ENTRY_FLAG_A_13 = 1 << 13,
VEHICLE_ENTRY_FLAG_A_14 = 1 << 14,
VEHICLE_ENTRY_FLAG_A_15 = 1 << 15,
};
enum {
VEHICLE_ENTRY_FLAG_B_0 = 1 << 0,
VEHICLE_ENTRY_FLAG_B_SWINGING = 1 << 1,
VEHICLE_ENTRY_FLAG_B_SPINNING = 1 << 2,
VEHICLE_ENTRY_FLAG_B_3 = 1 << 3,
VEHICLE_ENTRY_FLAG_B_4 = 1 << 4,
VEHICLE_ENTRY_FLAG_B_5 = 1 << 5,
VEHICLE_ENTRY_FLAG_B_6 = 1 << 6,
VEHICLE_ENTRY_FLAG_B_7 = 1 << 7,
VEHICLE_ENTRY_FLAG_B_8 = 1 << 8,
VEHICLE_ENTRY_FLAG_B_9 = 1 << 9,
VEHICLE_ENTRY_FLAG_B_10 = 1 << 10,
VEHICLE_ENTRY_FLAG_B_11 = 1 << 11,
VEHICLE_ENTRY_FLAG_B_12 = 1 << 12,
VEHICLE_ENTRY_FLAG_B_13 = 1 << 13,
VEHICLE_ENTRY_FLAG_B_14 = 1 << 14,
VEHICLE_ENTRY_FLAG_B_15 = 1 << 15,
};
enum {
VEHICLE_STATUS_MOVING_TO_END_OF_STATION,
VEHICLE_STATUS_WAITING_FOR_PASSENGERS,
VEHICLE_STATUS_WAITING_TO_DEPART,
VEHICLE_STATUS_DEPARTING,
VEHICLE_STATUS_TRAVELLING,
VEHICLE_STATUS_ARRIVING,
VEHICLE_STATUS_UNLOADING_PASSENGERS,
VEHICLE_STATUS_TRAVELLING_BOAT,
VEHICLE_STATUS_CRASHING,
VEHICLE_STATUS_CRASHED,
VEHICLE_STATUS_TRAVELLING_BUMPER_CARS,
VEHICLE_STATUS_SWINGING,
VEHICLE_STATUS_ROTATING,
VEHICLE_STATUS_FERRIS_WHEEL_ROTATING,
VEHICLE_STATUS_SIMULATOR_OPERATING,
VEHICLE_STATUS_SHOWING_FILM,
VEHICLE_STATUS_SPACE_RINGS_OPERATING,
VEHICLE_STATUS_TOP_SPIN_OPERATING,
VEHICLE_STATUS_HAUNTED_HOUSE_OPERATING,
VEHICLE_STATUS_DOING_CIRCUS_SHOW,
VEHICLE_STATUS_CROOKED_HOUSE_OPERATING,
VEHICLE_STATUS_WAITING_FOR_CABLE_LIFT,
VEHICLE_STATUS_TRAVELLING_CABLE_LIFT,
VEHICLE_STATUS_STOPPING,
VEHICLE_STATUS_WAITING_FOR_PASSENGERS_17,
VEHICLE_STATUS_WAITING_TO_START,
VEHICLE_STATUS_STARTING,
VEHICLE_STATUS_OPERATING_1A,
VEHICLE_STATUS_STOPPING_1B,
VEHICLE_STATUS_UNLOADING_PASSENGERS_1C,
VEHICLE_STATUS_STOPPED_BY_BLOCK_BRAKES
};
enum{
VEHICLE_UPDATE_FLAG_0 = (1 << 0),
VEHICLE_UPDATE_FLAG_1 = (1 << 1),
VEHICLE_UPDATE_FLAG_WAIT_ON_ADJACENT = (1 << 2),
VEHICLE_UPDATE_FLAG_3 = (1 << 3),
VEHICLE_UPDATE_FLAG_TRAIN_READY_DEPART = (1 << 4),
VEHICLE_UPDATE_FLAG_TESTING = (1 << 5),
VEHICLE_UPDATE_FLAG_6 = (1 << 6),
VEHICLE_UPDATE_FLAG_7 = (1 << 7),
VEHICLE_UPDATE_FLAG_BROKEN_CAR = (1 << 8),
VEHICLE_UPDATE_FLAG_BROKEN_TRAIN = (1 << 9),
VEHICLE_UPDATE_FLAG_ON_BREAK_FOR_DROP = (1 << 10),
VEHICLE_UPDATE_FLAG_11 = (1 << 11),
VEHICLE_UPDATE_FLAG_12 = (1 << 12),
VEHICLE_UPDATE_FLAG_13 = (1 << 13),
VEHICLE_UPDATE_FLAG_14 = (1 << 14),
VEHICLE_UPDATE_FLAG_15 = (1 << 15)
};
enum {
VEHICLE_SPRITE_FLAG_FLAT = (1 << 0),
VEHICLE_SPRITE_FLAG_GENTLE_SLOPES = (1 << 1),
VEHICLE_SPRITE_FLAG_STEEP_SLOPES = (1 << 2),
VEHICLE_SPRITE_FLAG_VERTICAL_SLOPES = (1 << 3),
VEHICLE_SPRITE_FLAG_DIAGONAL_SLOPES = (1 << 4),
VEHICLE_SPRITE_FLAG_FLAT_BANKED = (1 << 5),
VEHICLE_SPRITE_FLAG_INLINE_TWISTS = (1 << 6),
VEHICLE_SPRITE_FLAG_FLAT_TO_GENTLE_SLOPE_BANKED_TRANSITIONS = (1 << 7),
VEHICLE_SPRITE_FLAG_DIAGONAL_GENTLE_SLOPE_BANKED_TRANSITIONS = (1 << 8),
VEHICLE_SPRITE_FLAG_GENTLE_SLOPE_BANKED_TRANSITIONS = (1 << 9),
VEHICLE_SPRITE_FLAG_GENTLE_SLOPE_BANKED_TURNS = (1 << 10),
VEHICLE_SPRITE_FLAG_FLAT_TO_GENTLE_SLOPE_WHILE_BANKED_TRANSITIONS = (1 << 11),
VEHICLE_SPRITE_FLAG_CORKSCREWS = (1 << 12),
VEHICLE_SPRITE_FLAG_RESTRAINT_ANIMATION = (1 << 13),
VEHICLE_SPRITE_FLAG_14 = (1 << 14),
VEHICLE_SPRITE_FLAG_15 = (1 << 15),
};
enum {
VEHICLE_VISUAL_DEFAULT,
VEHICLE_VISUAL_FLAT_RIDE_OR_CAR_RIDE,
VEHICLE_VISUAL_LAUNCHED_FREEFALL,
VEHICLE_VISUAL_OBSERVATION_TOWER,
VEHICLE_VISUAL_RIVER_RAPIDS,
VEHICLE_VISUAL_MINI_GOLF_PLAYER,
VEHICLE_VISUAL_MINI_GOLF_BALL,
VEHICLE_VISUAL_REVERSER,
VEHICLE_VISUAL_SPLASH_BOATS_OR_WATER_COASTER,
VEHICLE_VISUAL_ROTO_DROP,
VEHICLE_VISUAL_SPLASH1_EFFECT,
VEHICLE_VISUAL_SPLASH2_EFFECT,
VEHICLE_VISUAL_SPLASH3_EFFECT,
VEHICLE_VISUAL_SPLASH4_EFFECT,
VEHICLE_VISUAL_SPLASH5_EFFECT,
VEHICLE_VISUAL_VIRGINIA_REEL,
VEHICLE_VISUAL_SUBMARINE
};
enum {
VEHICLE_UPDATE_MOTION_TRACK_FLAG_VEHICLE_AT_STATION = 1 << 0,
VEHICLE_UPDATE_MOTION_TRACK_FLAG_1 = 1 << 1,
VEHICLE_UPDATE_MOTION_TRACK_FLAG_2 = 1 << 2,
VEHICLE_UPDATE_MOTION_TRACK_FLAG_3 = 1 << 3,
VEHICLE_UPDATE_MOTION_TRACK_FLAG_VEHICLE_ON_LIFT_HILL = 1 << 4,
VEHICLE_UPDATE_MOTION_TRACK_FLAG_5 = 1 << 5,
VEHICLE_UPDATE_MOTION_TRACK_FLAG_VEHICLE_DERAILED = 1 << 6,
VEHICLE_UPDATE_MOTION_TRACK_FLAG_VEHICLE_COLLISION = 1 << 7,
VEHICLE_UPDATE_MOTION_TRACK_FLAG_8 = 1 << 8,
VEHICLE_UPDATE_MOTION_TRACK_FLAG_9 = 1 << 9,
VEHICLE_UPDATE_MOTION_TRACK_FLAG_10 = 1 << 10,
VEHICLE_UPDATE_MOTION_TRACK_FLAG_11 = 1 << 11,
VEHICLE_UPDATE_MOTION_TRACK_FLAG_12 = 1 << 12,
};
#define VEHICLE_SEAT_PAIR_FLAG 0x80
#define VEHICLE_SEAT_NUM_MASK 0x7F
void vehicle_update_all();
int sub_6BC2F3(rct_vehicle* vehicle);
void vehicle_sounds_update();
void vehicle_get_g_forces(rct_vehicle *vehicle, int *verticalG, int *lateralG);
void vehicle_set_map_toolbar(rct_vehicle *vehicle);
int vehicle_is_used_in_pairs(rct_vehicle *vehicle);
rct_vehicle *vehicle_get_head(rct_vehicle *vehicle);
int vehicle_update_track_motion(rct_vehicle *vehicle, int *outStation);
rct_ride_entry_vehicle *vehicle_get_vehicle_entry(rct_vehicle *vehicle);
int vehicle_get_total_num_peeps(rct_vehicle *vehicle);
void vehicle_invalidate_window(rct_vehicle *vehicle);
void vehicle_update_test_finish(rct_vehicle* vehicle);
void vehicle_test_reset(rct_vehicle* vehicle);
void vehicle_peep_easteregg_here_we_are(rct_vehicle* vehicle);
rct_vehicle *vehicle_get_head(rct_vehicle *vehicle);
rct_vehicle *vehicle_get_tail(rct_vehicle *vehicle);
const rct_vehicle_info *vehicle_get_move_info(int cd, int typeAndDirection, int offset);
uint16 vehicle_get_move_info_size(int cd, int typeAndDirection);
bool vehicle_update_bumper_car_collision(rct_vehicle *vehicle, sint16 x, sint16 y, uint16 *spriteId);
extern rct_vehicle *gCurrentVehicle;
extern uint8 _vehicleStationIndex;
extern uint32 _vehicleMotionTrackFlags;
extern sint32 _vehicleVelocityF64E08;
extern sint32 _vehicleVelocityF64E0C;
extern sint32 _vehicleUnkF64E10;
extern uint8 _vehicleVAngleEndF64E36;
extern uint8 _vehicleBankEndF64E37;
extern uint8 _vehicleF64E2C;
extern rct_vehicle * _vehicleFrontVehicle;
extern rct_xyz16 unk_F64E20;
/** Helper macro until rides are stored in this module. */
#define GET_VEHICLE(sprite_index) &(get_sprite(sprite_index)->vehicle)
#endif