mirror of https://github.com/OpenRCT2/OpenRCT2.git
244 lines
8.7 KiB
C
244 lines
8.7 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 _TRACK_DESIGN_H_
|
|
#define _TRACK_DESIGN_H_
|
|
|
|
#include "../common.h"
|
|
#include "../object/Object.h"
|
|
#include "../rct12/RCT12.h"
|
|
#include "../rct2/RCT2.h"
|
|
#include "../world/Map.h"
|
|
#include "Vehicle.h"
|
|
|
|
#define TRACK_PREVIEW_IMAGE_SIZE (370 * 217)
|
|
|
|
#pragma pack(push, 1)
|
|
/* Maze Element entry size: 0x04 */
|
|
struct rct_td6_maze_element {
|
|
union {
|
|
uint32 all;
|
|
struct {
|
|
sint8 x;
|
|
sint8 y;
|
|
union {
|
|
uint16 maze_entry;
|
|
struct{
|
|
uint8 direction;
|
|
uint8 type;
|
|
};
|
|
};
|
|
};
|
|
};
|
|
};
|
|
assert_struct_size(rct_td6_maze_element, 0x04);
|
|
|
|
/* Track Element entry size: 0x02 */
|
|
struct rct_td6_track_element {
|
|
uint8 type; // 0x00
|
|
uint8 flags; // 0x01
|
|
};
|
|
assert_struct_size(rct_td6_track_element, 0x02);
|
|
|
|
/* Track Entrance entry size: 0x06 */
|
|
struct rct_td6_entrance_element {
|
|
sint8 z; // 0x00
|
|
uint8 direction; // 0x01
|
|
sint16 x; // 0x02
|
|
sint16 y; // 0x04
|
|
};
|
|
assert_struct_size(rct_td6_entrance_element, 0x06);
|
|
|
|
/* Track Scenery entry size: 0x16 */
|
|
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
|
|
};
|
|
assert_struct_size(rct_td6_scenery_element, 0x16);
|
|
|
|
/**
|
|
* Track design structure.
|
|
* size: 0x4E72B
|
|
*/
|
|
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[RCT2_MAX_CARS_PER_TRAIN]; // 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[RCT12_NUM_COLOUR_SCHEMES]; // 0x60
|
|
uint8 track_rail_colour[RCT12_NUM_COLOUR_SCHEMES]; // 0x64
|
|
uint8 track_support_colour[RCT12_NUM_COLOUR_SCHEMES]; // 0x68
|
|
uint32 flags2; // 0x6C
|
|
rct_object_entry vehicle_object; // 0x70
|
|
uint8 space_required_x; // 0x80
|
|
uint8 space_required_y; // 0x81
|
|
uint8 vehicle_additional_colour[RCT2_MAX_CARS_PER_TRAIN]; // 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;
|
|
};
|
|
//Warning: improper struct size in comment
|
|
#ifdef PLATFORM_32BIT
|
|
assert_struct_size(rct_track_td6, 0xbf);
|
|
#endif
|
|
#pragma pack(pop)
|
|
|
|
// Only written to in RCT2, not used in OpenRCT2. All of these are elements that had to be invented in RCT1.
|
|
enum : uint32
|
|
{
|
|
TRACK_FLAGS_CONTAINS_VERTICAL_LOOP = (1 << 7),
|
|
TRACK_FLAGS_CONTAINS_INLINE_TWIST = (1 << 17),
|
|
TRACK_FLAGS_CONTAINS_HALF_LOOP = (1 << 18),
|
|
TRACK_FLAGS_CONTAINS_CORKSCREW = (1 << 19),
|
|
TRACK_FLAGS_CONTAINS_WATER_SPLASH = (1 << 27),
|
|
TRACK_FLAGS_CONTAINS_BARREL_ROLL = (1 << 29),
|
|
TRACK_FLAGS_CONTAINS_POWERED_LIFT = (1 << 30),
|
|
TRACK_FLAGS_CONTAINS_LARGE_HALF_LOOP = (1u << 31),
|
|
};
|
|
|
|
enum : uint32
|
|
{
|
|
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_HAS_SCENERY = (1 << 1),
|
|
TRACK_DESIGN_FLAG_VEHICLE_UNAVAILABLE = (1 << 2),
|
|
};
|
|
|
|
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,
|
|
};
|
|
|
|
enum {
|
|
MAZE_ELEMENT_TYPE_MAZE_TRACK = 0,
|
|
MAZE_ELEMENT_TYPE_ENTRANCE = (1 << 3),
|
|
MAZE_ELEMENT_TYPE_EXIT = (1 << 7)
|
|
};
|
|
|
|
extern rct_track_td6 *gActiveTrackDesign;
|
|
extern bool gTrackDesignSceneryToggle;
|
|
extern LocationXYZ16 gTrackPreviewMin;
|
|
extern LocationXYZ16 gTrackPreviewMax;
|
|
extern LocationXYZ16 gTrackPreviewOrigin;
|
|
|
|
extern bool 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);
|
|
|
|
sint32 place_virtual_track(rct_track_td6 *td6, uint8 ptdOperation, bool placeScenery, uint8 rideIndex, sint16 x, sint16 y, sint16 z);
|
|
|
|
void game_command_place_track_design(sint32* eax, sint32* ebx, sint32* ecx, sint32* edx, sint32* esi, sint32* edi, sint32* ebp);
|
|
void game_command_place_maze_design(sint32* eax, sint32* ebx, sint32* ecx, sint32* edx, sint32* esi, sint32* edi, sint32* 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_tile_element(const rct_tile_element * tileElement);
|
|
void track_design_save_select_nearby_scenery(sint32 rideIndex);
|
|
void track_design_save_select_tile_element(sint32 interactionType, sint32 x, sint32 y, rct_tile_element *tileElement, bool collect);
|
|
bool track_design_save(uint8 rideIndex);
|
|
bool track_design_save_to_file(const utf8 *path);
|
|
|
|
bool track_design_are_entrance_and_exit_placed();
|
|
|
|
#endif
|