Merge pull request #3783 from janisozaur/packed-structs

Explicitly pack structs
This commit is contained in:
Ted John 2016-06-03 10:42:43 +01:00
commit 5889522d74
41 changed files with 322 additions and 81 deletions

View File

@ -659,6 +659,8 @@ static int RCT2_CALLPROC_EBPSAFE(int address)
*/
int RCT2_CALLFUNC_X(int address, int *_eax, int *_ebx, int *_ecx, int *_edx, int *_esi, int *_edi, int *_ebp);
#pragma pack(push, 1)
typedef struct registers {
union {
int eax;
@ -706,6 +708,10 @@ typedef struct registers {
};
} registers;
assert_struct_size(registers, 7 * 4);
#pragma pack(pop)
static int RCT2_CALLFUNC_Y(int address, registers *inOut)
{
return RCT2_CALLFUNC_X(address, &inOut->eax, &inOut->ebx, &inOut->ecx, &inOut->edx, &inOut->esi, &inOut->edi, &inOut->ebp);

View File

@ -31,6 +31,8 @@ typedef struct audio_device {
char name[AUDIO_DEVICE_NAME_SIZE];
} audio_device;
#pragma pack(push, 1)
typedef struct rct_ride_music {
uint8 ride_id;
uint8 tune_id;
@ -39,6 +41,9 @@ typedef struct rct_ride_music {
uint16 frequency;
void* sound_channel;
} rct_ride_music;
#ifdef PLATFORM_32BIT
assert_struct_size(rct_ride_music, 12);
#endif
typedef struct rct_ride_music_info {
uint32 length;
@ -46,6 +51,7 @@ typedef struct rct_ride_music_info {
uint8 path_id;
uint8 var_9;
} rct_ride_music_info;
assert_struct_size(rct_ride_music_info, 10);
typedef struct rct_ride_music_params {
uint8 ride_id;
@ -55,6 +61,7 @@ typedef struct rct_ride_music_params {
sint16 pan;
uint16 frequency;
} rct_ride_music_params;
assert_struct_size(rct_ride_music_params, 12);
typedef struct rct_vehicle_sound {
uint16 id;
@ -70,6 +77,9 @@ typedef struct rct_vehicle_sound {
void* sound1_channel;
void* sound2_channel;
} rct_vehicle_sound;
#ifdef PLATFORM_32BIT
assert_struct_size(rct_vehicle_sound, 28);
#endif
typedef struct rct_vehicle_sound_params {
uint16 id;
@ -79,6 +89,9 @@ typedef struct rct_vehicle_sound_params {
sint16 volume;
uint16 var_A;
} rct_vehicle_sound_params;
assert_struct_size(rct_vehicle_sound_params, 12);
#pragma pack(pop)
typedef enum RCT2_SOUND {
SOUND_LIFT_1 = 0,

View File

@ -137,6 +137,7 @@ bool Source_Sample::LoadCSS1(const char *filename, unsigned int offset)
Uint32 soundsize;
SDL_RWread(rw, &soundsize, sizeof(soundsize), 1);
length = soundsize;
#pragma pack(push, 1)
struct WaveFormatEx
{
Uint16 encoding;
@ -147,6 +148,8 @@ bool Source_Sample::LoadCSS1(const char *filename, unsigned int offset)
Uint16 bitspersample;
Uint16 extrasize;
} waveformat;
#pragma pack(pop)
assert_struct_size(waveformat, 18);
SDL_RWread(rw, &waveformat, sizeof(waveformat), 1);
format.freq = waveformat.frequency;
format.format = AUDIO_S16LSB;
@ -262,6 +265,7 @@ bool Source_SampleStream::LoadWAV(SDL_RWops* rw)
return false;
}
Uint64 chunkstart = SDL_RWtell(rw);
#pragma pack(push, 1)
struct WaveFormat
{
Uint16 encoding;
@ -271,6 +275,8 @@ bool Source_SampleStream::LoadWAV(SDL_RWops* rw)
Uint16 blockalign;
Uint16 bitspersample;
} waveformat;
#pragma pack(pop)
assert_struct_size(waveformat, 16);
SDL_RWread(rw, &waveformat, sizeof(waveformat), 1);
SDL_RWseek(rw, chunkstart + fmtchunk_size, RW_SEEK_SET);
const Uint16 pcmformat = 0x0001;

View File

@ -43,12 +43,12 @@ extern "C" {
#include <speex/speex_resampler.h>
}
struct AudioFormat {
int BytesPerSample() const { return (SDL_AUDIO_BITSIZE(format)) / 8; };
typedef struct AudioFormat {
int BytesPerSample() const { return (SDL_AUDIO_BITSIZE(format)) / 8; }
int freq;
SDL_AudioFormat format;
int channels;
};
} AudioFormat;
class Source
{

View File

@ -26,15 +26,30 @@
extern int gSpriteMode;
#pragma pack(push, 1)
typedef struct rct_sprite_file_header {
uint32 num_entries;
uint32 total_size;
} rct_sprite_file_header;
assert_struct_size(rct_sprite_file_header, 8);
typedef struct rct_sprite_file_palette_entry {
uint8 b, g, r, a;
} rct_sprite_file_palette_entry;
typedef struct rle_code {
uint8 num_pixels;
uint8 offset_x;
} rle_code;
assert_struct_size(rle_code, 2);
#pragma pack(pop)
assert_struct_size(rct_sprite_file_palette_entry, 4);
rct_sprite_file_palette_entry spriteFilePalette[256];
static rct_sprite_file_palette_entry _standardPalette[256];
@ -231,11 +246,6 @@ int get_palette_index(sint16 *colour)
return -1;
}
typedef struct rle_code {
uint8 num_pixels;
uint8 offset_x;
} rle_code;
bool sprite_file_import(const char *path, rct_g1_element *outElement, uint8 **outBuffer, int *outBufferLength, int mode)
{
uint8 *pixels;

View File

@ -34,6 +34,12 @@
#define PLATFORM_X86
#endif
#if defined(__LP64__) || defined(_WIN64)
#define PLATFORM_64BIT
#else
#define PLATFORM_32BIT
#endif
// C99's restrict keywords guarantees the pointer in question, for the whole of its lifetime,
// will be the only way to access a given memory region. In other words: there is no other pointer
// aliasing the same memory area. Using it lets compiler generate better code. If your compiler
@ -55,6 +61,17 @@
#define RESTRICT
#endif
#ifdef __cplusplus
#define assert_struct_size(x, y) static_assert(sizeof(x) == (y), "Improper struct size")
#else
// Visual Studio does not know _Static_assert
#if !defined(_MSC_VER)
#define assert_struct_size(x, y) _Static_assert(sizeof(x) == (y), "Improper struct size")
#else
#define assert_struct_size(x, y)
#endif // !defined(_MSC_VER)
#endif
#ifdef PLATFORM_X86
#ifndef FASTCALL
#ifdef __GNUC__

View File

@ -20,6 +20,7 @@
#include "../common.h"
#include "font.h"
#pragma pack(push, 1)
// Size: 0x10
typedef struct rct_drawpixelinfo {
uint8* bits; // 0x00
@ -30,6 +31,9 @@ typedef struct rct_drawpixelinfo {
short pitch; // 0x0C note: this is actually (pitch - width)
uint16 zoom_level; // 0x0E
} rct_drawpixelinfo;
#ifdef PLATFORM_32BIT
assert_struct_size(rct_drawpixelinfo, 0x10);
#endif
// Size: 0x10
typedef struct rct_g1_element {
@ -41,6 +45,9 @@ typedef struct rct_g1_element {
uint16 flags; // 0x0C
uint16 zoomed_offset; // 0x0E
} rct_g1_element;
#ifdef PLATFORM_32BIT
assert_struct_size(rct_g1_element, 0x10);
#endif
enum {
G1_FLAG_BMP = (1 << 0), //No invisible sections
@ -58,12 +65,16 @@ typedef struct rct_g1_header {
uint32 num_entries;
uint32 total_size;
} rct_g1_header;
assert_struct_size(rct_g1_header, 8);
typedef struct rct_gx {
rct_g1_header header;
rct_g1_element *elements;
void *data;
} rct_gx;
#ifdef PLATFORM_32BIT
assert_struct_size(rct_gx, 16);
#endif
typedef struct rct_palette_entry {
uint8 blue;
@ -71,6 +82,9 @@ typedef struct rct_palette_entry {
uint8 red;
uint8 alpha;
} rct_palette_entry;
assert_struct_size(rct_palette_entry, 4);
#pragma pack(pop)
typedef struct rct_palette {
rct_palette_entry entries[256];

View File

@ -70,6 +70,8 @@ enum {
#define NUM_COLOURS 32
#pragma pack(push, 1)
typedef struct rct_colour_map_a {
uint8 darkest;
uint8 darker;
@ -80,6 +82,7 @@ typedef struct rct_colour_map_a {
uint8 lighter;
uint8 lightest;
} rct_colour_map_a;
assert_struct_size(rct_colour_map_a, 8);
typedef struct rct_colour_map_b {
uint8 a;
@ -91,6 +94,9 @@ typedef struct rct_colour_map_b {
uint8 g;
uint8 h;
} rct_colour_map_b;
assert_struct_size(rct_colour_map_b, 8);
#pragma pack(pop)
extern rct_colour_map_a *ColourMapA;
extern rct_colour_map_b *ColourMapB;

View File

@ -19,10 +19,13 @@
#include "../common.h"
#pragma pack(push, 1)
typedef struct rct_award {
uint16 time;
uint16 type;
} rct_award;
assert_struct_size(rct_award, 4);
#pragma pack(pop)
enum {
PARK_AWARD_MOST_UNTIDY,

View File

@ -32,6 +32,7 @@ enum {
NEWS_ITEM_GRAPH
};
#pragma pack(push, 1)
/**
* News item structure.
* size: 0x10C
@ -46,6 +47,8 @@ typedef struct rct_news_item {
uint8 pad_0B; // 0x0B
utf8 text[256]; // 0x0C
} rct_news_item;
assert_struct_size(rct_news_item, 12 + 256);
#pragma pack(pop)
#define MAX_NEWS_ITEMS 60

View File

@ -19,11 +19,14 @@
#include "../common.h"
#pragma pack(push, 1)
typedef struct rct_research_item {
// Bit 16 (0: scenery entry, 1: ride entry)
sint32 entryIndex;
uint8 category;
} rct_research_item;
assert_struct_size(rct_research_item, 5);
#pragma pack(pop)
enum{
RESEARCH_ENTRY_FLAG_SCENERY_SET_ALWAYS_RESEARCHED = (1 << 29),

View File

@ -57,12 +57,6 @@ extern "C" {
#define NETWORK_STREAM_VERSION "9"
#define NETWORK_STREAM_ID OPENRCT2_VERSION "-" NETWORK_STREAM_VERSION
// Fixes issues on OS X
#if defined(_RCT2_H_) && !defined(_MSC_VER)
// use similar struct packing as MSVC for our structs
#pragma pack(1)
#endif
#ifdef __cplusplus
#include <array>

View File

@ -50,6 +50,7 @@ typedef enum{
#define OBJECT_ENTRY_GROUP_COUNT 11
#define OBJECT_ENTRY_COUNT 721
#pragma pack(push, 1)
/**
* Object entry structure.
* size: 0x10
@ -59,6 +60,7 @@ typedef struct rct_object_entry {
char name[8];
uint32 checksum;
} rct_object_entry;
assert_struct_size(rct_object_entry, 0x10);
/**
* Object entry structure extended.
@ -70,6 +72,7 @@ typedef struct rct_object_entry_extended {
uint32 checksum;
uint32 chunk_size;
} rct_object_entry_extended;
assert_struct_size(rct_object_entry_extended, 0x14);
extern int object_entry_group_counts[];
extern int object_entry_group_encoding[];
@ -78,17 +81,23 @@ typedef struct rct_object_entry_group {
uint8 **chunks;
rct_object_entry_extended *entries;
} rct_object_entry_group;
#ifdef PLATFORM_32BIT
assert_struct_size(rct_object_entry_group, 8);
#endif
typedef struct rct_ride_filters {
uint8 category[2];
uint8 ride_type;
} rct_ride_filters;
assert_struct_size(rct_ride_filters, 3);
typedef struct rct_object_filters {
union {
rct_ride_filters ride;
};
} rct_object_filters;
assert_struct_size(rct_object_filters, 3);
#pragma pack(pop)
extern rct_object_entry_group object_entry_groups[];
extern void** gObjectList;

View File

@ -31,6 +31,7 @@
#define FILTER_VERSION 1
#pragma pack(push, 1)
typedef struct rct_plugin_header {
uint32 total_files;
uint32 total_file_size;
@ -38,6 +39,8 @@ typedef struct rct_plugin_header {
uint32 object_list_size;
uint32 object_list_no_items;
} rct_plugin_header;
assert_struct_size(rct_plugin_header, 20);
#pragma pack(pop)
// 98DA00
int object_entry_group_counts[] = {

View File

@ -325,15 +325,6 @@ uint8 viewport_surface_paint_setup_get_relative_slope(rct_map_element * mapEleme
return ebx | di;
}
typedef struct viewport_surface_paint_struct_0 {
uint32 var_00;
uint32 var_04;
uint32 var_08;
uint32 var_0C;
uint32 var_10;
uint32 pad[3];
} viewport_surface_paint_struct_0;
/**
* rct2: 0x0065E890, 0x0065E946, 0x0065E9FC, 0x0065EAB2
*/

View File

@ -24,6 +24,7 @@
typedef struct attached_paint_struct attached_paint_struct;
#pragma pack(push, 1)
/* size 0x12 */
struct attached_paint_struct {
uint32 image_id; // 0x00
@ -38,6 +39,10 @@ struct attached_paint_struct {
uint8 pad_0D;
attached_paint_struct* next; //0x0E
};
#ifdef PLATFORM_32BIT
// TODO: drop packing from this when all rendering is done.
assert_struct_size(attached_paint_struct, 0x12);
#endif
typedef struct paint_struct paint_struct;
@ -70,6 +75,10 @@ struct paint_struct {
uint16 map_y; // 0x2E
rct_map_element *mapElement; // 0x30 (or sprite pointer)
};
#ifdef PLATFORM_32BIT
// TODO: drop packing from this when all rendering is done.
assert_struct_size(paint_struct, 0x34);
#endif
typedef struct paint_string_struct paint_string_struct;
@ -82,6 +91,10 @@ struct paint_string_struct {
uint32 args[4]; // 0x0A
uint8 *y_offsets; // 0x1A
};
#ifdef PLATFORM_32BIT
assert_struct_size(paint_string_struct, 0x1e);
#endif
#pragma pack(pop)
typedef struct sprite_bb {
uint32 sprite_id;

View File

@ -370,12 +370,14 @@ enum PEEP_RIDE_DECISION {
PEEP_RIDE_DECISION_THINKING = 1 << 2
};
#pragma pack(push, 1)
typedef struct rct_peep_thought {
uint8 type; //0
uint8 item; //1
uint8 var_2; //2
uint8 var_3; //3
} rct_peep_thought;
assert_struct_size(rct_peep_thought, 4);
typedef struct rct_peep {
uint8 sprite_identifier; // 0x00
@ -546,6 +548,8 @@ typedef struct rct_peep {
uint8 pad_FB;
uint32 item_standard_flags; // 0xFC
} rct_peep;
assert_struct_size(rct_peep, 0x100);
#pragma pack(pop)
enum {
EASTEREGG_PEEP_NAME_MICHAEL_SCHUMACHER,

View File

@ -26,12 +26,14 @@
#include "world/map.h"
#include "world/sprite.h"
#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
@ -160,6 +162,7 @@ typedef struct rct1_ride {
uint8 entrance_style;
uint8 unk_17A[230];
} rct1_ride;
assert_struct_size(rct1_ride, 0x260);
typedef struct rct1_research_item {
uint8 item;
@ -168,6 +171,7 @@ typedef struct rct1_research_item {
uint8 flags;
uint8 expenditure_area;
} rct1_research_item;
assert_struct_size(rct1_research_item, 5);
/**
* RCT1,AA,LL scenario / saved game structure.
@ -340,6 +344,54 @@ typedef struct rct1_s4 {
uint8 unk_1F8358[432];
uint32 expansion_pack_checksum;
} rct1_s4;
assert_struct_size(rct1_s4, 0x1F850C);
typedef struct rct_track_td4 {
uint8 type; // 0x00
uint8 vehicle_type; // 0x01
uint32 special_track_flags; // 0x02
uint8 operating_mode; // 0x06
uint8 vehicle_colour_version; // 0x07 Vehicle colour type in first two bits, Version in bits 3,4
colour_t body_trim_colour[24]; // 0x08
colour_t track_spine_colour_rct1; // 0x20
colour_t track_rail_colour_rct1; // 0x21
colour_t track_support_colour_rct1; // 0x22
uint8 departure_control_flags; // 0x23
uint8 number_of_trains; // 0x24
uint8 cars_per_train; // 0x25
uint8 min_wait_time; // 0x26
uint8 max_wait_time; // 0x27
uint8 speed; // 0x28
uint8 max_speed; // 0x29
uint8 average_speed; // 0x2A
uint16 ride_length; // 0x2B
uint8 max_positive_vertical_g; // 0x2D
uint8 max_negitive_vertical_g; // 0x2E
uint8 max_lateral_g; // 0x2F
union {
uint8 inversions; // 0x30
uint8 holes; // 0x30
};
uint8 drops; // 0x31
uint8 highest_drop_height; // 0x32
uint8 excitement; // 0x33
uint8 intensity; // 0x34
uint8 nausea; // 0x35
uint8 pad_36[2];
union{
uint16 start_track_data_original; // 0x38
colour_t track_spine_colour[4]; // 0x38
};
colour_t track_rail_colour[4]; // 0x3C
union{
colour_t track_support_colour[4]; // 0x40
uint8 wall_type[4]; // 0x40
};
uint8 pad_41[0x83];
uint16 start_track_data_AA_CF; // 0xC4
} rct_track_td4; // Information based off RCTTechDepot
assert_struct_size(rct_track_td4, 0xC9);
#pragma pack(pop)
enum {
RCT1_RIDE_TYPE_NULL = 255,
@ -645,51 +697,6 @@ enum {
RCT1_RESEARCH_SPECIAL_REVERSING_SECTIONS = 0x23,
};
typedef struct rct_track_td4 {
uint8 type; // 0x00
uint8 vehicle_type; // 0x01
uint32 special_track_flags; // 0x02
uint8 operating_mode; // 0x06
uint8 vehicle_colour_version; // 0x07 Vehicle colour type in first two bits, Version in bits 3,4
colour_t body_trim_colour[24]; // 0x08
colour_t track_spine_colour_rct1; // 0x20
colour_t track_rail_colour_rct1; // 0x21
colour_t track_support_colour_rct1; // 0x22
uint8 departure_control_flags; // 0x23
uint8 number_of_trains; // 0x24
uint8 cars_per_train; // 0x25
uint8 min_wait_time; // 0x26
uint8 max_wait_time; // 0x27
uint8 speed; // 0x28
uint8 max_speed; // 0x29
uint8 average_speed; // 0x2A
uint16 ride_length; // 0x2B
uint8 max_positive_vertical_g; // 0x2D
uint8 max_negitive_vertical_g; // 0x2E
uint8 max_lateral_g; // 0x2F
union {
uint8 inversions; // 0x30
uint8 holes; // 0x30
};
uint8 drops; // 0x31
uint8 highest_drop_height; // 0x32
uint8 excitement; // 0x33
uint8 intensity; // 0x34
uint8 nausea; // 0x35
uint8 pad_36[2];
union{
uint16 start_track_data_original; // 0x38
colour_t track_spine_colour[4]; // 0x38
};
colour_t track_rail_colour[4]; // 0x3C
union{
colour_t track_support_colour[4]; // 0x40
uint8 wall_type[4]; // 0x40
};
uint8 pad_41[0x83];
uint16 start_track_data_AA_CF; // 0xC4
} rct_track_td4; // Information based off RCTTechDepot
enum {
RCT1_SCENARIO_FLAG_0 = 1 << 0,
RCT1_SCENARIO_FLAG_1 = 1 << 1,

View File

@ -111,11 +111,6 @@ typedef uint8 colour_t;
#endif // __GNUC__
#endif // __cplusplus
#ifndef _MSC_VER
// use similar struct packing as MSVC for our structs
#pragma pack(1)
#endif
#if defined(__unix__) || (defined(__APPLE__) && defined(__MACH__))
#include <unistd.h>
#define STUB() log_warning("Function %s at %s:%d is a stub.\n", __PRETTY_FUNCTION__, __FILE__, __LINE__)

View File

@ -187,4 +187,4 @@ TRACK_PAINT_FUNCTION get_track_paint_function_ferris_wheel(int trackType, int di
}
return paint_ferris_wheel;
}
}

View File

@ -5945,10 +5945,13 @@ foundRideEntry:
useDefaultName:
ride->name = STR_NONE;
#pragma pack(push, 1)
struct {
uint16 type_name;
uint16 number;
} name_args;
assert_struct_size(name_args, 4);
#pragma pack(pop)
name_args.type_name = 2 + ride->type;
name_args.number = 0;
do {
@ -8516,10 +8519,13 @@ void ride_reset_all_names()
{
ride->name = STR_NONE;
#pragma pack(push, 1)
struct {
uint16 type_name;
uint16 number;
} name_args;
assert_struct_size(name_args, 4);
#pragma pack(pop)
name_args.type_name = 2 + ride->type;
name_args.number = 0;
do {

View File

@ -29,6 +29,7 @@ typedef fixed16_2dp ride_rating;
// integer. To create the ride rating 3.65 type RIDE_RATING(3,65)
#define RIDE_RATING(whole, fraction) FIXED_2DP(whole, fraction)
#pragma pack(push, 1)
// Used for return values, for functions that modify all three.
typedef struct rating_tuple {
@ -36,6 +37,7 @@ typedef struct rating_tuple {
ride_rating intensity;
ride_rating nausea;
} rating_tuple;
assert_struct_size(rating_tuple, 6);
/**
* Couples a ride type and subtype together.
@ -49,28 +51,33 @@ typedef struct ride_list_item {
uint16 ride_type_and_entry;
};
} ride_list_item;
assert_struct_size(ride_list_item, 2);
typedef struct track_colour {
uint8 main;
uint8 additional;
uint8 supports;
} track_colour;
assert_struct_size(track_colour, 3);
typedef struct vehicle_colour {
uint8 main;
uint8 additional_1;
uint8 additional_2;
} vehicle_colour;
assert_struct_size(vehicle_colour, 3);
typedef struct track_colour_preset_list {
uint8 count;
track_colour list[256];
} track_colour_preset_list;
assert_struct_size(track_colour_preset_list, (1 + 256 * 3));
typedef struct vehicle_colour_preset_list {
uint8 count;
vehicle_colour list[256];
} vehicle_colour_preset_list;
assert_struct_size(vehicle_colour_preset_list, (1 + 256 * 3));
/**
* Ride type structure.
@ -115,6 +122,9 @@ typedef struct rct_ride_entry {
uint8 shop_item; // 0x1C0
uint8 shop_item_secondary; // 0x1C1
} rct_ride_entry;
#ifdef PLATFORM_32BIT
assert_struct_size(rct_ride_entry, 0x1c2);
#endif
/**
* Ride structure.
@ -321,6 +331,7 @@ typedef struct rct_ride {
uint16 queue_length[4]; // 0x200
uint8 pad_208[0x58];
} rct_ride;
assert_struct_size(rct_ride, 0x260);
#define RIDE_MEASUREMENT_MAX_ITEMS 4800
@ -341,6 +352,7 @@ typedef struct rct_ride_measurement {
uint8 velocity[RIDE_MEASUREMENT_MAX_ITEMS]; // 0x258C
uint8 altitude[RIDE_MEASUREMENT_MAX_ITEMS]; // 0x384C
} rct_ride_measurement;
assert_struct_size(rct_ride_measurement, 0x4b0c);
typedef struct track_begin_end {
int begin_x;
@ -353,6 +365,11 @@ typedef struct track_begin_end {
int end_direction;
rct_map_element *end_element;
} track_begin_end;
#ifdef PLATFORM_32BIT
assert_struct_size(track_begin_end, 36);
#endif
#pragma pack(pop)
enum {
RIDE_CLASS_RIDE,

View File

@ -21,6 +21,7 @@
#include "../object.h"
#include "ride.h"
#pragma pack(push, 1)
typedef struct rct_trackdefinition {
uint8 type;
uint8 vangle_end;
@ -30,6 +31,8 @@ typedef struct rct_trackdefinition {
uint8 special;
uint8 pad[2];
} rct_trackdefinition;
assert_struct_size(rct_trackdefinition, 8);
#pragma pack(pop)
/**
* Size: 0x0A

View File

@ -24,6 +24,7 @@
#define TRACK_PREVIEW_IMAGE_SIZE (370 * 217)
#pragma pack(push, 1)
/* Maze Element entry size: 0x04 */
typedef struct rct_td6_maze_element {
union {
@ -41,12 +42,14 @@ typedef struct rct_td6_maze_element {
};
};
} rct_td6_maze_element;
assert_struct_size(rct_td6_maze_element, 0x04);
/* Track Element entry size: 0x02 */
typedef struct rct_td6_track_element {
uint8 type; // 0x00
uint8 flags; // 0x01
} rct_td6_track_element;
assert_struct_size(rct_td6_track_element, 0x02);
/* Track Entrance entry size: 0x06 */
typedef struct rct_td6_entrance_element {
@ -55,6 +58,7 @@ typedef struct rct_td6_entrance_element {
sint16 x; // 0x02
sint16 y; // 0x04
} rct_td6_entrance_element;
assert_struct_size(rct_td6_entrance_element, 0x06);
/* Track Scenery entry size: 0x16 */
typedef struct rct_td6_scenery_element {
@ -66,6 +70,7 @@ typedef struct rct_td6_scenery_element {
uint8 primary_colour; // 0x14
uint8 secondary_colour; // 0x15
} rct_td6_scenery_element;
assert_struct_size(rct_td6_scenery_element, 0x16);
/**
* Track design structure.
@ -141,11 +146,11 @@ typedef struct rct_track_td6 {
utf8 *name;
} rct_track_td6;
typedef struct rct_track_design {
rct_track_td6 track_td6;
uint8 preview[4][TRACK_PREVIEW_IMAGE_SIZE]; // 0xA3
} rct_track_design;
//Warning: improper struct size in comment
#ifdef PLATFORM_32BIT
assert_struct_size(rct_track_td6, 0xbf);
#endif
#pragma pack(pop)
typedef struct track_design_file_ref {
utf8 *name;

View File

@ -23,11 +23,16 @@
#include "track.h"
#include "track_design.h"
#pragma pack(push, 1)
typedef struct td_index_item {
uint8 ride_type;
char ride_entry[9];
utf8 path[MAX_PATH];
} td_index_item;
// NOTE: this is our own struct and should not get packed, but it is stored in a file
// so removing packing from it would require refactoring file access
assert_struct_size(td_index_item, 1 + 9 + 260);
#pragma pack(pop)
static bool track_design_index_read_header(SDL_RWops *file, uint32 *tdidxCount);
static void track_design_index_scan();

View File

@ -1881,11 +1881,14 @@ static void vehicle_update_waiting_to_depart(rct_vehicle* vehicle) {
}
}
#pragma pack(push, 1)
typedef struct rct_synchronised_vehicle {
uint8 ride_id;
uint8 station_id;
uint16 vehicle_id;
} rct_synchronised_vehicle;
assert_struct_size(rct_synchronised_vehicle, 4);
#pragma pack(pop)
// 8 synchronised vehicle info
rct_synchronised_vehicle *_synchronisedVehicles = (rct_synchronised_vehicle*)0x00F64E4C;

View File

@ -19,11 +19,13 @@
#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.
@ -75,6 +77,9 @@ typedef struct rct_ride_entry_vehicle {
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
@ -193,6 +198,8 @@ typedef struct rct_vehicle {
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;

View File

@ -30,6 +30,7 @@
#include "world/map_animation.h"
#include "world/sprite.h"
#pragma pack(push, 1)
/**
* SV6/SC6 header chunk
* size: 0x20
@ -41,6 +42,7 @@ typedef struct rct_s6_header {
uint32 magic_number; // 0x08
uint8 pad_0C[0x14];
} rct_s6_header;
assert_struct_size(rct_s6_header, 0x20);
/**
* SC6 information chunk
@ -58,6 +60,7 @@ typedef struct rct_s6_info {
char details[256]; // 0x88
rct_object_entry entry; // 0x188
} rct_s6_info;
assert_struct_size(rct_s6_info, 0x198);
/**
* Scenario scores file header.
@ -69,6 +72,7 @@ typedef struct rct_scenario_scores_header {
uint32 var_8;
uint32 scenario_count; // 0x0C
} rct_scenario_scores_header;
assert_struct_size(rct_scenario_scores_header, 16);
typedef enum scenario_source {
SCENARIO_SOURCE_RCT1,
@ -101,6 +105,7 @@ typedef struct rct_scenario_basic {
// uint8 source_game; // new in OpenRCT2
// sint16 source_index; // new in OpenRCT2
} rct_scenario_basic;
assert_struct_size(rct_scenario_basic, 0x02B0);
typedef struct rct_stex_entry {
rct_string_id scenario_name; // 0x00
@ -108,6 +113,7 @@ typedef struct rct_stex_entry {
rct_string_id details; // 0x04
uint8 var_06;
} rct_stex_entry;
assert_struct_size(rct_stex_entry, 7);
#define g_stexEntries ((rct_stex_entry**)object_entry_groups[OBJECT_TYPE_SCENARIO_TEXT].chunks)
@ -336,6 +342,8 @@ typedef struct rct_s6_data {
uint16 wide_path_tile_loop_y;
uint8 pad_13CE778[434];
} rct_s6_data;
assert_struct_size(rct_s6_data, 0x46b44a);
#pragma pack(pop)
enum {
SCENARIO_FLAGS_VISIBLE = (1 << 0),
@ -387,6 +395,10 @@ typedef struct scenario_highscore_entry {
money32 company_value;
datetime64 timestamp;
} scenario_highscore_entry;
// NOTE: Check if needed
#ifdef PLATFORM_32BIT
assert_struct_size(scenario_highscore_entry, 20);
#endif
typedef struct scenario_index_entry {
utf8 path[MAX_PATH];

View File

@ -20,10 +20,13 @@
#include <SDL.h>
#include "../common.h"
#pragma pack(push, 1)
typedef struct sawyercoding_chunk_header {
uint8 encoding;
uint32 length;
} sawyercoding_chunk_header;
assert_struct_size(sawyercoding_chunk_header, 5);
#pragma pack(pop)
enum {
CHUNK_ENCODING_NONE,

View File

@ -30,7 +30,6 @@ typedef struct notification_def {
uint8 category;
rct_string_id caption;
size_t config_offset;
} notification_def;
static const notification_def NewsItemOptionDefinitions[] = {

View File

@ -441,6 +441,7 @@ rct_string_id RideConfigurationStringIds[] = {
#pragma endregion
#pragma pack(push, 1)
union {
uint64 ab;
struct {
@ -448,6 +449,8 @@ union {
uint32 b;
};
} _enabledRidePieces;
assert_struct_size(_enabledRidePieces, 8);
#pragma pack(pop)
static bool _trackPlaceCtrlState;
static int _trackPlaceCtrlZ;

View File

@ -23,6 +23,7 @@
#define BANNER_NULL 255
#define MAX_BANNERS 250
#pragma pack(push, 1)
typedef struct rct_banner {
uint8 type;
uint8 flags; //0x01 bit 0 is no entry
@ -32,6 +33,8 @@ typedef struct rct_banner {
uint8 x; //0x06
uint8 y; //0x07
} rct_banner;
assert_struct_size(rct_banner, 8);
#pragma pack(pop)
enum{
BANNER_FLAG_NO_ENTRY = (1 << 0),

View File

@ -33,11 +33,14 @@ enum {
MAX_THUNDER_INSTANCES = 2
};
#pragma pack(push, 1)
typedef struct rct_weather_transition {
sint8 base_temperature;
sint8 distribution_size;
sint8 distribution[24];
} rct_weather_transition;
assert_struct_size(rct_weather_transition, 26);
#pragma pack(pop)
static const rct_weather_transition* climate_transitions[4];

View File

@ -35,6 +35,7 @@ enum{
WEATHER_THUNDER
};
#pragma pack(push, 1)
typedef struct rct_weather {
sint8 temp_delta;
sint8 effect_level;
@ -42,6 +43,8 @@ typedef struct rct_weather {
sint8 rain_level;
uint32 sprite_id;
} rct_weather;
assert_struct_size(rct_weather, 8);
#pragma pack(pop)
#define gClimate RCT2_GLOBAL(RCT2_ADDRESS_CLIMATE, uint8)
#define gClimateCurrentWeather RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_WEATHER, uint8)

View File

@ -19,11 +19,14 @@
#include "../common.h"
#pragma pack(push, 1)
typedef struct rct_entrance_type {
rct_string_id string_idx; // 0x00
uint32 image_id; // 0x02
uint8 scrolling_mode; // 0x06
uint8 text_height; // 0x07
} rct_entrance_type;
assert_struct_size(rct_entrance_type, 8);
#pragma pack(pop)
#endif

View File

@ -27,6 +27,7 @@ enum {
PROVISIONAL_PATH_FLAG_2 = (1 << 2),
};
#pragma pack(push, 1)
typedef struct rct_footpath_entry {
rct_string_id string_idx; // 0x00
uint32 image; // 0x02
@ -34,6 +35,8 @@ typedef struct rct_footpath_entry {
uint8 var_0A;
uint8 flags; // 0x0B
} rct_footpath_entry;
assert_struct_size(rct_footpath_entry, 12);
#pragma pack(pop)
enum {
FOOTPATH_SEARCH_SUCCESS,

View File

@ -19,12 +19,14 @@
#include "../common.h"
#pragma pack(push, 1)
typedef struct rct_map_element_surface_properties {
uint8 slope; //4 0xE0 Edge Style, 0x1F Slope
uint8 terrain; //5 0xE0 Terrain Style, 0x1F Water height
uint8 grass_length; //6
uint8 ownership; //7
} rct_map_element_surface_properties;
assert_struct_size(rct_map_element_surface_properties, 4);
typedef struct rct_map_element_path_properties {
uint8 type; //4 0xF0 Path type, 0x08 Unknown/Unused, 0x04 Set when path is diagonal, 0x03 Rotation
@ -35,6 +37,7 @@ typedef struct rct_map_element_path_properties {
uint8 ride_index;
};
} rct_map_element_path_properties;
assert_struct_size(rct_map_element_path_properties, 4);
typedef struct rct_map_element_track_properties {
uint8 type; //4
@ -47,6 +50,7 @@ typedef struct rct_map_element_track_properties {
};
uint8 ride_index; //7
} rct_map_element_track_properties;
assert_struct_size(rct_map_element_track_properties, 4);
typedef struct rct_map_element_scenery_properties {
uint8 type; //4
@ -54,6 +58,7 @@ typedef struct rct_map_element_scenery_properties {
uint8 colour_1; //6
uint8 colour_2; //7
} rct_map_element_scenery_properties;
assert_struct_size(rct_map_element_scenery_properties, 4);
typedef struct rct_map_element_entrance_properties {
uint8 type; //4
@ -61,16 +66,19 @@ typedef struct rct_map_element_entrance_properties {
uint8 path_type; //6
uint8 ride_index; //7
} rct_map_element_entrance_properties;
assert_struct_size(rct_map_element_entrance_properties, 4);
typedef struct rct_map_element_fence_properties {
uint8 type; //4
uint8 item[3]; //5
} rct_map_element_fence_properties;
assert_struct_size(rct_map_element_fence_properties, 4);
typedef struct rct_map_element_scenerymultiple_properties {
uint16 type; //4
uint8 colour[2]; //6
} rct_map_element_scenerymultiple_properties;
assert_struct_size(rct_map_element_scenerymultiple_properties, 4);
typedef struct rct_map_element_banner_properties {
uint8 index; //4
@ -78,6 +86,7 @@ typedef struct rct_map_element_banner_properties {
uint8 flags; //6
uint8 unused; //7
} rct_map_element_banner_properties;
assert_struct_size(rct_map_element_banner_properties, 4);
typedef union {
rct_map_element_surface_properties surface;
@ -89,6 +98,7 @@ typedef union {
rct_map_element_scenerymultiple_properties scenerymultiple;
rct_map_element_banner_properties banner;
} rct_map_element_properties;
assert_struct_size(rct_map_element_properties, 4);
/**
* Map element structure
@ -101,6 +111,8 @@ typedef struct rct_map_element {
uint8 clearance_height; //3
rct_map_element_properties properties;
} rct_map_element;
assert_struct_size(rct_map_element, 8);
#pragma pack(pop)
enum {
MAP_ELEMENT_QUADRANT_SW,
@ -229,6 +241,7 @@ enum {
#define TILE_UNDEFINED_MAP_ELEMENT (rct_map_element*)-1
#pragma pack(push, 1)
typedef struct rct_xy8 {
union {
struct {
@ -237,27 +250,35 @@ typedef struct rct_xy8 {
uint16 xy;
};
} rct_xy8;
assert_struct_size(rct_xy8, 2);
typedef struct rct_xyz8 {
uint8 x, y, z;
} rct_xyz8;
assert_struct_size(rct_xyz8, 3);
typedef struct rct_xyzd8 {
uint8 x, y, z, direction;
} rct_xyzd8;
assert_struct_size(rct_xyzd8, 4);
typedef struct rct_xy16 {
sint16 x, y;
} rct_xy16;
assert_struct_size(rct_xy16, 4);
typedef struct rct_xyz16 {
sint16 x, y, z;
} rct_xyz16;
assert_struct_size(rct_xyz16, 6);
typedef struct rct_xy_element {
int x, y;
rct_map_element *element;
} rct_xy_element;
#ifdef PLATFORM_32BIT
assert_struct_size(rct_xy_element, 12);
#endif
typedef struct rct2_peep_spawn {
uint16 x;
@ -265,6 +286,8 @@ typedef struct rct2_peep_spawn {
uint8 z;
uint8 direction;
} rct2_peep_spawn;
assert_struct_size(rct2_peep_spawn, 6);
#pragma pack(pop)
enum {
MAP_SELECT_FLAG_ENABLE = 1 << 0,
@ -421,6 +444,9 @@ typedef struct map_element_iterator {
int y;
rct_map_element *element;
} map_element_iterator;
#ifdef PLATFORM_32BIT
assert_struct_size(map_element_iterator, 12);
#endif
void map_element_iterator_begin(map_element_iterator *it);
int map_element_iterator_next(map_element_iterator *it);

View File

@ -19,6 +19,7 @@
#include "../common.h"
#pragma pack(push, 1)
/**
* Animated object
* size: 0x06
@ -29,6 +30,8 @@ typedef struct rct_map_animation {
uint16 x;
uint16 y;
} rct_map_animation;
assert_struct_size(rct_map_animation, 6);
#pragma pack(pop)
enum {
MAP_ANIMATION_TYPE_RIDE_ENTRANCE,

View File

@ -21,6 +21,7 @@
#include "../object.h"
#include "../world/map.h"
#pragma pack(push, 1)
typedef struct rct_small_scenery_entry {
uint32 flags; // 0x06
uint8 height; // 0x0A
@ -33,6 +34,7 @@ typedef struct rct_small_scenery_entry {
uint16 var_18;
uint8 scenery_tab_id; // 0x1A
} rct_small_scenery_entry;
assert_struct_size(rct_small_scenery_entry, 21);
typedef enum {
SMALL_SCENERY_FLAG_FULL_TILE = (1 << 0), // 0x1
@ -72,6 +74,7 @@ typedef struct rct_large_scenery_tile {
uint8 z_clearance;
uint16 var_7;
} rct_large_scenery_tile;
assert_struct_size(rct_large_scenery_tile, 9);
typedef struct rct_large_scenery_text_glyph {
uint8 image_offset;
@ -79,6 +82,7 @@ typedef struct rct_large_scenery_text_glyph {
uint8 height;
uint8 var_3;
} rct_large_scenery_text_glyph;
assert_struct_size(rct_large_scenery_text_glyph, 4);
typedef struct rct_large_scenery_text {
rct_xy16 offset[2]; // 0x0
@ -87,6 +91,7 @@ typedef struct rct_large_scenery_text {
uint16 var_C; // 0xC
rct_large_scenery_text_glyph glyphs[256]; // 0xE
} rct_large_scenery_text;
assert_struct_size(rct_large_scenery_text, 14 + 4 * 256);
typedef struct rct_large_scenery_entry {
uint8 tool_id; // 0x06
@ -99,7 +104,9 @@ typedef struct rct_large_scenery_entry {
rct_large_scenery_text* text; // 0x12
uint32 text_image; // 0x16
} rct_large_scenery_entry;
#ifdef PLATFORM_32BIT
assert_struct_size(rct_large_scenery_entry, 20);
#endif
typedef struct rct_wall_scenery_entry {
uint8 tool_id; // 0x06
@ -110,6 +117,7 @@ typedef struct rct_wall_scenery_entry {
uint8 scenery_tab_id; // 0x0C
uint8 var_0D;
} rct_wall_scenery_entry;
assert_struct_size(rct_wall_scenery_entry, 8);
typedef enum {
WALL_SCENERY_FLAG1 = (1 << 0), // 0x1
@ -133,6 +141,7 @@ typedef struct rct_path_bit_scenery_entry {
sint16 price; // 0x0A
uint8 scenery_tab_id; // 0x0C
} rct_path_bit_scenery_entry;
assert_struct_size(rct_path_bit_scenery_entry, 7);
typedef struct rct_banner_scenery_entry {
uint8 scrolling_mode; // 0x06
@ -140,6 +149,7 @@ typedef struct rct_banner_scenery_entry {
sint16 price; // 0x08
uint8 scenery_tab_id; // 0x0A
} rct_banner_scenery_entry;
assert_struct_size(rct_banner_scenery_entry, 5);
typedef struct rct_scenery_entry {
rct_string_id name; // 0x00
@ -152,6 +162,9 @@ typedef struct rct_scenery_entry {
rct_banner_scenery_entry banner;
};
} rct_scenery_entry;
#ifdef PLATFORM_32BIT
assert_struct_size(rct_scenery_entry, 6 + 21);
#endif
typedef struct rct_scenery_set_entry {
rct_string_id name; // 0x00
@ -163,6 +176,8 @@ typedef struct rct_scenery_set_entry {
uint8 pad_109;
uint32 var_10A;
} rct_scenery_set_entry;
assert_struct_size(rct_scenery_set_entry, 14 + 2 * 0x80);
#pragma pack(pop)
enum {
PATH_BIT_FLAG_BIN = 1 << 0,

View File

@ -43,6 +43,7 @@ enum SPRITE_LIST {
SPRITE_LIST_UNKNOWN,
};
#pragma pack(push, 1)
typedef struct rct_unk_sprite {
uint8 sprite_identifier; // 0x00
uint8 misc_identifier; // 0x01
@ -75,6 +76,7 @@ typedef struct rct_unk_sprite {
uint8 pad_2C[0x45];
uint8 var_71;
} rct_unk_sprite;
assert_struct_size(rct_unk_sprite, 0x72);
typedef struct rct_litter {
uint8 sprite_identifier; // 0x00
@ -96,6 +98,7 @@ typedef struct rct_litter {
uint8 pad_1F[5];
uint32 creationTick; // 0x24
} rct_litter;
assert_struct_size(rct_litter, 0x28);
typedef struct rct_balloon {
uint8 sprite_identifier; // 0x00
@ -125,6 +128,7 @@ typedef struct rct_balloon {
uint8 colour; // 0x2C
uint8 var_2D;
} rct_balloon;
assert_struct_size(rct_balloon, 0x2e);
typedef struct rct_duck {
uint8 sprite_identifier; // 0x00
@ -151,6 +155,7 @@ typedef struct rct_duck {
uint8 pad_34[0x14];
uint8 state; // 0x48
} rct_duck;
assert_struct_size(rct_duck, 0x49);
typedef struct rct_jumping_fountain {
uint8 sprite_identifier; // 0x00
@ -185,6 +190,7 @@ typedef struct rct_jumping_fountain {
uint8 pad_34[0x12];
uint16 iteration; // 0x46
} rct_jumping_fountain;
assert_struct_size(rct_jumping_fountain, 0x48);
typedef struct rct_money_effect {
uint8 sprite_identifier; // 0x00
@ -209,6 +215,7 @@ typedef struct rct_money_effect {
sint16 offset_x; // 0x44
uint16 wiggle; // 0x46
} rct_money_effect;
assert_struct_size(rct_money_effect, 0x48);
typedef struct rct_crashed_vehicle_particle {
uint8 sprite_identifier; // 0x00
@ -251,6 +258,7 @@ typedef struct rct_crashed_vehicle_particle {
uint8 pad_44[0x2D];
uint8 var_71;
} rct_crashed_vehicle_particle;
assert_struct_size(rct_crashed_vehicle_particle, 0x45 + 0x2D);
typedef struct rct_crash_splash {
uint8 sprite_identifier; // 0x00
@ -280,6 +288,7 @@ typedef struct rct_crash_splash {
uint16 var_24;
uint16 frame; // 0x26
} rct_crash_splash;
assert_struct_size(rct_crash_splash, 0x28);
typedef struct rct_steam_particle {
uint8 sprite_identifier; // 0x00
@ -309,6 +318,7 @@ typedef struct rct_steam_particle {
uint16 var_24;
uint16 frame; // 0x26
} rct_steam_particle;
assert_struct_size(rct_steam_particle, 0x28);
/**
* Sprite structure.
@ -328,6 +338,7 @@ typedef union {
rct_crash_splash crash_splash;
rct_steam_particle steam_particle;
} rct_sprite;
assert_struct_size(rct_sprite, 0x100);
typedef struct rct_sprite_bounds {
uint8 sprite_width; // 0x00
@ -335,16 +346,24 @@ typedef struct rct_sprite_bounds {
uint8 sprite_height_positive; // 0x02
uint8 unused; // 0x03
} rct_sprite_bounds;
assert_struct_size(rct_sprite_bounds, 4);
typedef struct rct_sprite_image {
uint32 base_image; // 0x00
uint8* unkn_04; // 0x04
} rct_sprite_image;
#ifdef PLATFORM_32BIT
assert_struct_size(rct_sprite_image, 8);
#endif
typedef struct rct_sprite_entry {
rct_sprite_image *sprite_image; // 0x00
rct_sprite_bounds *sprite_bounds; // 0x04
} rct_sprite_entry;
#ifdef PLATFORM_32BIT
assert_struct_size(rct_sprite_entry, 8);
#endif
#pragma pack(pop)
enum {
SPRITE_MISC_STEAM_PARTICLE,

View File

@ -19,6 +19,7 @@
#include "../common.h"
#pragma pack(push, 1)
typedef struct rct_water_type {
rct_string_id string_idx; // 0x00
uint32 image_id; // 0x02
@ -26,5 +27,7 @@ typedef struct rct_water_type {
uint32 var_0A;
uint16 var_0E;
} rct_water_type;
assert_struct_size(rct_water_type, 16);
#pragma pack(pop)
#endif