mirror of https://github.com/OpenRCT2/OpenRCT2.git
223 lines
6.6 KiB
C
223 lines
6.6 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 _TRACK_DESIGN_H_
|
|
#define _TRACK_DESIGN_H_
|
|
|
|
#include "../common.h"
|
|
#include "../object.h"
|
|
#include "../world/map.h"
|
|
#include "vehicle.h"
|
|
|
|
#define TRACK_PREVIEW_IMAGE_SIZE (370 * 217)
|
|
|
|
#pragma pack(push, 1)
|
|
/* Maze Element entry size: 0x04 */
|
|
typedef struct rct_td6_maze_element {
|
|
union {
|
|
uint32 all;
|
|
struct {
|
|
sint8 x;
|
|
sint8 y;
|
|
union {
|
|
uint16 maze_entry;
|
|
struct{
|
|
uint8 unk_2;
|
|
uint8 type;
|
|
};
|
|
};
|
|
};
|
|
};
|
|
} 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 {
|
|
sint8 z; // 0x00
|
|
uint8 direction; // 0x01
|
|
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 {
|
|
rct_object_entry scenery_object; // 0x00
|
|
sint8 x; // 0x10
|
|
sint8 y; // 0x11
|
|
sint8 z; // 0x12
|
|
uint8 flags; // 0x13 direction quadrant tertiary colour
|
|
uint8 primary_colour; // 0x14
|
|
uint8 secondary_colour; // 0x15
|
|
} rct_td6_scenery_element;
|
|
assert_struct_size(rct_td6_scenery_element, 0x16);
|
|
|
|
/**
|
|
* Track design structure.
|
|
* size: 0x4E72B
|
|
*/
|
|
typedef struct rct_track_td6 {
|
|
uint8 type; // 0x00
|
|
uint8 vehicle_type;
|
|
union{
|
|
// After loading the track this is converted to
|
|
// a cost but before its a flags register
|
|
money32 cost; // 0x02
|
|
uint32 flags; // 0x02
|
|
};
|
|
union{
|
|
// After loading the track this is converted to
|
|
// a flags register
|
|
uint8 ride_mode; // 0x06
|
|
uint8 track_flags; // 0x06
|
|
};
|
|
uint8 version_and_colour_scheme; // 0x07 0b0000_VVCC
|
|
rct_vehicle_colour vehicle_colours[32]; // 0x08
|
|
union{
|
|
uint8 pad_48;
|
|
uint8 track_spine_colour_rct1; // 0x48
|
|
};
|
|
union{
|
|
uint8 entrance_style; // 0x49
|
|
uint8 track_rail_colour_rct1; // 0x49
|
|
};
|
|
union{
|
|
uint8 total_air_time; // 0x4A
|
|
uint8 track_support_colour_rct1; // 0x4A
|
|
};
|
|
uint8 depart_flags; // 0x4B
|
|
uint8 number_of_trains; // 0x4C
|
|
uint8 number_of_cars_per_train; // 0x4D
|
|
uint8 min_waiting_time; // 0x4E
|
|
uint8 max_waiting_time; // 0x4F
|
|
uint8 operation_setting;
|
|
sint8 max_speed; // 0x51
|
|
sint8 average_speed; // 0x52
|
|
uint16 ride_length; // 0x53
|
|
uint8 max_positive_vertical_g; // 0x55
|
|
sint8 max_negative_vertical_g; // 0x56
|
|
uint8 max_lateral_g; // 0x57
|
|
union {
|
|
uint8 inversions; // 0x58
|
|
uint8 holes; // 0x58
|
|
};
|
|
uint8 drops; // 0x59
|
|
uint8 highest_drop_height; // 0x5A
|
|
uint8 excitement; // 0x5B
|
|
uint8 intensity; // 0x5C
|
|
uint8 nausea; // 0x5D
|
|
money16 upkeep_cost; // 0x5E
|
|
uint8 track_spine_colour[4]; // 0x60
|
|
uint8 track_rail_colour[4]; // 0x64
|
|
uint8 track_support_colour[4]; // 0x68
|
|
uint32 flags2; // 0x6C
|
|
rct_object_entry vehicle_object; // 0x70
|
|
uint8 space_required_x; // 0x80
|
|
uint8 space_required_y; // 0x81
|
|
uint8 vehicle_additional_colour[32]; // 0x82
|
|
uint8 lift_hill_speed_num_circuits; // 0xA2 0bCCCL_LLLL
|
|
void *elements; // 0xA3 (data starts here in file)
|
|
size_t elementsSize;
|
|
|
|
rct_td6_maze_element *maze_elements;
|
|
rct_td6_track_element *track_elements;
|
|
rct_td6_entrance_element *entrance_elements;
|
|
rct_td6_scenery_element *scenery_elements;
|
|
|
|
utf8 *name;
|
|
} rct_track_td6;
|
|
//Warning: improper struct size in comment
|
|
#ifdef PLATFORM_32BIT
|
|
assert_struct_size(rct_track_td6, 0xbf);
|
|
#endif
|
|
#pragma pack(pop)
|
|
|
|
enum {
|
|
TRACK_FLAGS2_CONTAINS_LOG_FLUME_REVERSER = (1 << 1),
|
|
TRACK_FLAGS2_SIX_FLAGS_RIDE_DEPRECATED = (1u << 31) // Not used anymore.
|
|
};
|
|
|
|
enum {
|
|
TDPF_PLACE_SCENERY = 1 << 0,
|
|
};
|
|
|
|
enum {
|
|
TRACK_DESIGN_FLAG_SCENERY_UNAVAILABLE = (1 << 0),
|
|
TRACK_DESIGN_FLAG_VEHICLE_UNAVAILABLE = (1 << 2),
|
|
};
|
|
|
|
enum {
|
|
BYTE_F4414E_SCENERY_UNAVAILABLE = (1 << 1),
|
|
};
|
|
|
|
enum {
|
|
PTD_OPERATION_DRAW_OUTLINES,
|
|
PTD_OPERATION_1,
|
|
PTD_OPERATION_2,
|
|
PTD_OPERATION_GET_PLACE_Z,
|
|
PTD_OPERATION_4,
|
|
PTD_OPERATION_GET_COST,
|
|
PTD_OPERATION_CLEAR_OUTLINES
|
|
};
|
|
|
|
extern rct_track_td6 *gActiveTrackDesign;
|
|
extern uint8 gTrackDesignPlaceFlags;
|
|
extern bool gTrackDesignSceneryToggle;
|
|
extern rct_xyz16 gTrackPreviewMin;
|
|
extern rct_xyz16 gTrackPreviewMax;
|
|
extern rct_xyz16 gTrackPreviewOrigin;
|
|
|
|
extern uint8 byte_F4414E;
|
|
extern uint8 byte_9D8150;
|
|
|
|
extern bool gTrackDesignSaveMode;
|
|
extern uint8 gTrackDesignSaveRideIndex;
|
|
|
|
rct_track_td6 *track_design_open(const utf8 *path);
|
|
void track_design_dispose(rct_track_td6 *td6);
|
|
|
|
void track_design_mirror(rct_track_td6 *td6);
|
|
|
|
int sub_6D01B3(rct_track_td6 *td6, uint8 bl, uint8 rideIndex, int x, int y, int z);
|
|
|
|
void game_command_place_track_design(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp);
|
|
void game_command_place_maze_design(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp);
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// Track design preview
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
void track_design_draw_preview(rct_track_td6 *td6, uint8 *pixels);
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// Track design saving
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
void track_design_save_init();
|
|
void track_design_save_reset_scenery();
|
|
bool track_design_save_contains_map_element(rct_map_element *mapElement);
|
|
void track_design_save_select_nearby_scenery(int rideIndex);
|
|
void track_design_save_toggle_map_element(int interactionType, int x, int y, rct_map_element *mapElement);
|
|
bool track_design_save(uint8 rideIndex);
|
|
bool track_design_save_to_file(const utf8 *path);
|
|
|
|
#endif
|