2014-04-23 02:50:40 +02:00
|
|
|
|
/*****************************************************************************
|
2018-06-15 14:07:34 +02:00
|
|
|
|
* Copyright (c) 2014-2018 OpenRCT2 developers
|
2014-04-23 02:50:40 +02:00
|
|
|
|
*
|
2018-06-15 14:07:34 +02:00
|
|
|
|
* For a complete list of all authors, please refer to contributors.md
|
|
|
|
|
* Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2
|
2014-04-23 02:50:40 +02:00
|
|
|
|
*
|
2018-06-15 14:07:34 +02:00
|
|
|
|
* OpenRCT2 is licensed under the GNU General Public License version 3.
|
2014-04-23 02:50:40 +02:00
|
|
|
|
*****************************************************************************/
|
|
|
|
|
|
2018-06-22 23:14:18 +02:00
|
|
|
|
#include "Track.h"
|
|
|
|
|
|
2017-12-13 13:02:24 +01:00
|
|
|
|
#include "../Cheats.h"
|
2017-11-30 18:17:06 +01:00
|
|
|
|
#include "../Game.h"
|
2018-06-22 23:14:18 +02:00
|
|
|
|
#include "../audio/audio.h"
|
|
|
|
|
#include "../config/Config.h"
|
2018-01-06 00:45:53 +01:00
|
|
|
|
#include "../interface/Viewport.h"
|
2018-01-06 18:32:25 +01:00
|
|
|
|
#include "../localisation/Localisation.h"
|
2017-10-06 22:37:06 +02:00
|
|
|
|
#include "../management/Finance.h"
|
2016-01-25 05:00:31 +01:00
|
|
|
|
#include "../network/network.h"
|
2015-02-12 21:51:40 +01:00
|
|
|
|
#include "../platform/platform.h"
|
2018-01-09 10:40:42 +01:00
|
|
|
|
#include "../rct1/RCT1.h"
|
2017-12-13 13:02:24 +01:00
|
|
|
|
#include "../util/SawyerCoding.h"
|
|
|
|
|
#include "../util/Util.h"
|
2018-01-11 10:59:26 +01:00
|
|
|
|
#include "../world/Footpath.h"
|
2018-01-03 14:56:08 +01:00
|
|
|
|
#include "../world/Map.h"
|
2018-01-11 10:59:26 +01:00
|
|
|
|
#include "../world/MapAnimation.h"
|
2017-12-31 21:40:00 +01:00
|
|
|
|
#include "../world/Park.h"
|
2018-01-11 10:59:26 +01:00
|
|
|
|
#include "../world/Scenery.h"
|
2018-05-01 16:33:16 +02:00
|
|
|
|
#include "../world/Surface.h"
|
2017-12-31 13:21:34 +01:00
|
|
|
|
#include "Ride.h"
|
2018-01-10 00:00:09 +01:00
|
|
|
|
#include "RideData.h"
|
2017-06-14 13:31:27 +02:00
|
|
|
|
#include "RideGroupManager.h"
|
2018-06-22 23:14:18 +02:00
|
|
|
|
#include "RideRatings.h"
|
2017-10-23 14:47:12 +02:00
|
|
|
|
#include "Station.h"
|
2017-10-16 12:02:23 +02:00
|
|
|
|
#include "TrackData.h"
|
2018-03-19 23:28:40 +01:00
|
|
|
|
#include "TrackDesign.h"
|
2014-04-23 02:50:40 +02:00
|
|
|
|
|
2018-06-20 17:28:51 +02:00
|
|
|
|
uint8_t gTrackGroundFlags;
|
2016-05-17 21:51:11 +02:00
|
|
|
|
|
2017-12-13 17:25:05 +01:00
|
|
|
|
/** rct2: 0x00997C9D */
|
2018-01-10 16:14:36 +01:00
|
|
|
|
// clang-format off
|
2017-10-17 13:55:53 +02:00
|
|
|
|
const rct_trackdefinition TrackDefinitions[256] =
|
|
|
|
|
{
|
2017-10-17 13:56:33 +02:00
|
|
|
|
// TYPE VANGLE END VANGLE START BANK END BANK START PREVIEW Z OFFSET
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_FLAT
|
|
|
|
|
{ TRACK_STATION_END, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_END_STATION
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_BEGIN_STATION
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_MIDDLE_STATION
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_25_DEG_UP
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_UP_60, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_60_DEG_UP
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_FLAT_TO_25_DEG_UP
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_UP_60, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_25_DEG_UP_TO_60_DEG_UP
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_60_DEG_UP_TO_25_DEG_UP
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_25_DEG_UP_TO_FLAT
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_25_DEG_DOWN
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_DOWN_60, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_60_DEG_DOWN
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_FLAT_TO_25_DEG_DOWN
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_DOWN_60, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_25_DEG_DOWN_TO_60_DEG_DOWN
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_60_DEG_DOWN_TO_25_DEG_DOWN
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_25_DEG_DOWN_TO_FLAT
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_LEFT_QUARTER_TURN_5_TILES
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_RIGHT_QUARTER_TURN_5_TILES
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_BANK_NONE, 0 }, // ELEM_FLAT_TO_LEFT_BANK
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_BANK_NONE, 0 }, // ELEM_FLAT_TO_RIGHT_BANK
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_LEFT, 0 }, // ELEM_LEFT_BANK_TO_FLAT
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_RIGHT, 0 }, // ELEM_RIGHT_BANK_TO_FLAT
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, 0 }, // ELEM_BANKED_LEFT_QUARTER_TURN_5_TILES
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, 0 }, // ELEM_BANKED_RIGHT_QUARTER_TURN_5_TILES
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_LEFT, 0 }, // ELEM_LEFT_BANK_TO_25_DEG_UP
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_RIGHT, 0 }, // ELEM_RIGHT_BANK_TO_25_DEG_UP
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_LEFT, TRACK_BANK_NONE, 0 }, // ELEM_25_DEG_UP_TO_LEFT_BANK
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_RIGHT, TRACK_BANK_NONE, 0 }, // ELEM_25_DEG_UP_TO_RIGHT_BANK
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_LEFT, 0 }, // ELEM_LEFT_BANK_TO_25_DEG_DOWN
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_RIGHT, 0 }, // ELEM_RIGHT_BANK_TO_25_DEG_DOWN
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_LEFT, TRACK_BANK_NONE, 0 }, // ELEM_25_DEG_DOWN_TO_LEFT_BANK
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_RIGHT, TRACK_BANK_NONE, 0 }, // ELEM_25_DEG_DOWN_TO_RIGHT_BANK
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, 0 }, // ELEM_LEFT_BANK
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, 0 }, // ELEM_RIGHT_BANK
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_LEFT_QUARTER_TURN_5_TILES_25_DEG_DOWN
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_RIGHT_QUARTER_TURN_5_TILES_25_DEG_DOWN
|
|
|
|
|
{ TRACK_S_BEND, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_S_BEND_LEFT
|
|
|
|
|
{ TRACK_S_BEND, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_S_BEND_RIGHT
|
|
|
|
|
{ TRACK_VERTICAL_LOOP, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, -48 }, // ELEM_LEFT_VERTICAL_LOOP
|
|
|
|
|
{ TRACK_VERTICAL_LOOP, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, -48 }, // ELEM_RIGHT_VERTICAL_LOOP
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_LEFT_QUARTER_TURN_3_TILES
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_RIGHT_QUARTER_TURN_3_TILES
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, 0 }, // ELEM_LEFT_QUARTER_TURN_3_TILES_BANK
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, 0 }, // ELEM_RIGHT_QUARTER_TURN_3_TILES_BANK
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_LEFT_QUARTER_TURN_3_TILES_25_DEG_UP
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_LEFT_QUARTER_TURN_3_TILES_25_DEG_DOWN
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_LEFT_QUARTER_TURN_1_TILE
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_RIGHT_QUARTER_TURN_1_TILE
|
|
|
|
|
{ TRACK_TWIST, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_BANK_NONE, 0 }, // ELEM_LEFT_TWIST_DOWN_TO_UP
|
|
|
|
|
{ TRACK_TWIST, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_BANK_NONE, 0 }, // ELEM_RIGHT_TWIST_DOWN_TO_UP
|
|
|
|
|
{ TRACK_TWIST, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_UPSIDE_DOWN, 0 }, // ELEM_LEFT_TWIST_UP_TO_DOWN
|
|
|
|
|
{ TRACK_TWIST, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_UPSIDE_DOWN, 0 }, // ELEM_RIGHT_TWIST_UP_TO_DOWN
|
|
|
|
|
{ TRACK_HALF_LOOP, TRACK_SLOPE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_UPSIDE_DOWN, TRACK_BANK_NONE, 64 }, // ELEM_HALF_LOOP_UP
|
|
|
|
|
{ TRACK_HALF_LOOP, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_UPSIDE_DOWN, -64 }, // ELEM_HALF_LOOP_DOWN
|
|
|
|
|
{ TRACK_CORKSCREW, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_BANK_NONE, 0 }, // ELEM_LEFT_CORKSCREW_UP
|
|
|
|
|
{ TRACK_CORKSCREW, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_BANK_NONE, 0 }, // ELEM_RIGHT_CORKSCREW_UP
|
|
|
|
|
{ TRACK_CORKSCREW, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_UPSIDE_DOWN, -32 }, // ELEM_LEFT_CORKSCREW_DOWN
|
|
|
|
|
{ TRACK_CORKSCREW, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_UPSIDE_DOWN, -32 }, // ELEM_RIGHT_CORKSCREW_DOWN
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_UP_60, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_FLAT_TO_60_DEG_UP
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_60_DEG_UP_TO_FLAT
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_DOWN_60, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_FLAT_TO_60_DEG_DOWN
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_60_DEG_DOWN_TO_FLAT
|
|
|
|
|
{ TRACK_TOWER_BASE, TRACK_VANGLE_TOWER, TRACK_VANGLE_TOWER, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_TOWER_BASE
|
|
|
|
|
{ TRACK_TOWER_BASE, TRACK_VANGLE_TOWER, TRACK_VANGLE_TOWER, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_TOWER_SECTION
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_FLAT_COVERED
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_25_DEG_UP_COVERED
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_UP_60, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_60_DEG_UP_COVERED
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_FLAT_TO_25_DEG_UP_COVERED
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_UP_60, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_25_DEG_UP_TO_60_DEG_UP_COVERED
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_60_DEG_UP_TO_25_DEG_UP_COVERED
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_25_DEG_UP_TO_FLAT_COVERED
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_25_DEG_DOWN_COVERED
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_DOWN_60, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_60_DEG_DOWN_COVERED
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_FLAT_TO_25_DEG_DOWN_COVERED
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_DOWN_60, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_25_DEG_DOWN_TO_60_DEG_DOWN_COVERED
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_60_DEG_DOWN_TO_25_DEG_DOWN_COVERED
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_25_DEG_DOWN_TO_FLAT_COVERED
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_LEFT_QUARTER_TURN_5_TILES_COVERED
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_RIGHT_QUARTER_TURN_5_TILES_COVERED
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_S_BEND_LEFT_COVERED
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_S_BEND_RIGHT_COVERED
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_LEFT_QUARTER_TURN_3_TILES_COVERED
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_RIGHT_QUARTER_TURN_3_TILES_COVERED
|
|
|
|
|
{ TRACK_HELIX_SMALL, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, 0 }, // ELEM_LEFT_HALF_BANKED_HELIX_UP_SMALL
|
|
|
|
|
{ TRACK_HELIX_SMALL, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, 0 }, // ELEM_RIGHT_HALF_BANKED_HELIX_UP_SMALL
|
|
|
|
|
{ TRACK_HELIX_SMALL, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, 0 }, // ELEM_LEFT_HALF_BANKED_HELIX_DOWN_SMALL
|
|
|
|
|
{ TRACK_HELIX_SMALL, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, 0 }, // ELEM_RIGHT_HALF_BANKED_HELIX_DOWN_SMALL
|
|
|
|
|
{ TRACK_HELIX_SMALL, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, 0 }, // ELEM_LEFT_HALF_BANKED_HELIX_UP_LARGE
|
|
|
|
|
{ TRACK_HELIX_SMALL, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, 0 }, // ELEM_RIGHT_HALF_BANKED_HELIX_UP_LARGE
|
|
|
|
|
{ TRACK_HELIX_SMALL, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, 0 }, // ELEM_LEFT_HALF_BANKED_HELIX_DOWN_LARGE
|
|
|
|
|
{ TRACK_HELIX_SMALL, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, 0 }, // ELEM_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_UP_60, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_LEFT_QUARTER_TURN_1_TILE_60_DEG_UP
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_UP_60, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_RIGHT_QUARTER_TURN_1_TILE_60_DEG_UP
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_DOWN_60, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_LEFT_QUARTER_TURN_1_TILE_60_DEG_DOWN
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_DOWN_60, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_RIGHT_QUARTER_TURN_1_TILE_60_DEG_DOWN
|
|
|
|
|
{ TRACK_BRAKES, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_BRAKES
|
|
|
|
|
{ TRACK_ROTATION_CONTROL_TOGGLE,TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_ROTATION_CONTROL_TOGGLE
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_INVERTED_90_DEG_UP_TO_FLAT_QUARTER_LOOP
|
|
|
|
|
{ TRACK_HELIX_LARGE, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, 0 }, // ELEM_LEFT_QUARTER_BANKED_HELIX_LARGE_UP
|
|
|
|
|
{ TRACK_HELIX_LARGE, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, 0 }, // ELEM_RIGHT_QUARTER_BANKED_HELIX_LARGE_UP
|
|
|
|
|
{ TRACK_HELIX_LARGE, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, 0 }, // ELEM_LEFT_QUARTER_BANKED_HELIX_LARGE_DOWN
|
|
|
|
|
{ TRACK_HELIX_LARGE, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, 0 }, // ELEM_RIGHT_QUARTER_BANKED_HELIX_LARGE_DOWN
|
|
|
|
|
{ TRACK_HELIX_LARGE_UNBANKED, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_LEFT_QUARTER_HELIX_LARGE_UP
|
|
|
|
|
{ TRACK_HELIX_LARGE_UNBANKED, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_RIGHT_QUARTER_HELIX_LARGE_UP
|
|
|
|
|
{ TRACK_HELIX_LARGE_UNBANKED, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_LEFT_QUARTER_HELIX_LARGE_DOWN
|
|
|
|
|
{ TRACK_HELIX_LARGE_UNBANKED, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_RIGHT_QUARTER_HELIX_LARGE_DOWN
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_UP_25, TRACK_BANK_LEFT, TRACK_BANK_LEFT, 0 }, // ELEM_25_DEG_UP_LEFT_BANKED
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_UP_25, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, 0 }, // ELEM_25_DEG_UP_RIGHT_BANKED
|
|
|
|
|
{ TRACK_WATERFALL, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_WATERFALL
|
|
|
|
|
{ TRACK_RAPIDS, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_RAPIDS
|
|
|
|
|
{ TRACK_ON_RIDE_PHOTO, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_ON_RIDE_PHOTO
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_DOWN_25, TRACK_BANK_LEFT, TRACK_BANK_LEFT, 0 }, // ELEM_25_DEG_DOWN_LEFT_BANKED
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_DOWN_25, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, 0 }, // ELEM_25_DEG_DOWN_RIGHT_BANKED
|
|
|
|
|
{ TRACK_WATER_SPLASH, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_WATER_SPLASH
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_UP_60, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_FLAT_TO_60_DEG_UP_LONG_BASE
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_60_DEG_UP_TO_FLAT_LONG_BASE
|
|
|
|
|
{ TRACK_WHIRLPOOL, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_WHIRLPOOL
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_FLAT_TO_60_DEG_DOWN_LONG_BASE
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_DOWN_60, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_60_DEG_UP_TO_FLAT_LONG_BASE_122
|
|
|
|
|
{ TRACK_LIFT_HILL_CABLE, TRACK_SLOPE_DOWN_60, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_CABLE_LIFT_HILL
|
|
|
|
|
{ TRACK_REVERSE_FREEFALL, TRACK_VANGLE_REVERSE_FREEFALL, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_REVERSE_FREEFALL_SLOPE
|
|
|
|
|
{ TRACK_REVERSE_FREEFALL, TRACK_VANGLE_REVERSE_FREEFALL, TRACK_VANGLE_REVERSE_FREEFALL, TRACK_BANK_NONE,TRACK_BANK_NONE, 0 }, // ELEM_REVERSE_FREEFALL_VERTICAL
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_UP_90, TRACK_SLOPE_UP_90, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_90_DEG_UP
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_DOWN_90, TRACK_SLOPE_DOWN_90, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_90_DEG_DOWN
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_UP_90, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_60_DEG_UP_TO_90_DEG_UP
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_DOWN_60, TRACK_SLOPE_DOWN_90, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_90_DEG_DOWN_TO_60_DEG_DOWN
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_UP_60, TRACK_SLOPE_UP_90, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_90_DEG_UP_TO_60_DEG_UP
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_DOWN_90, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_60_DEG_DOWN_TO_90_DEG_DOWN
|
|
|
|
|
{ TRACK_BRAKE_FOR_DROP, TRACK_SLOPE_DOWN_60, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_BRAKE_FOR_DROP
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_LEFT_EIGHTH_TO_DIAG
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_RIGHT_EIGHTH_TO_DIAG
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_LEFT_EIGHTH_TO_ORTHOGONAL
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_RIGHT_EIGHTH_TO_ORTHOGONAL
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, 0 }, // ELEM_LEFT_EIGHTH_BANK_TO_DIAG
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, 0 }, // ELEM_RIGHT_EIGHTH_BANK_TO_DIAG
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, 0 }, // ELEM_LEFT_EIGHTH_BANK_TO_ORTHOGONAL
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, 0 }, // ELEM_RIGHT_EIGHTH_BANK_TO_ORTHOGONAL
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_DIAG_FLAT
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_DIAG_25_DEG_UP
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_UP_60, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_DIAG_60_DEG_UP
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_DIAG_FLAT_TO_25_DEG_UP
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_UP_60, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_DIAG_25_DEG_UP_TO_60_DEG_UP
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_DIAG_60_DEG_UP_TO_25_DEG_UP
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_DIAG_25_DEG_UP_TO_FLAT
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_DIAG_25_DEG_DOWN
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_DOWN_60, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_DIAG_60_DEG_DOWN
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_DIAG_FLAT_TO_25_DEG_DOWN
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_DOWN_60, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_DIAG_25_DEG_DOWN_TO_60_DEG_DOWN
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_DIAG_60_DEG_DOWN_TO_25_DEG_DOWN
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_DIAG_25_DEG_DOWN_TO_FLAT
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_UP_60, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_DIAG_FLAT_TO_60_DEG_UP
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_DIAG_60_DEG_UP_TO_FLAT
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_DOWN_60, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_DIAG_FLAT_TO_60_DEG_DOWN
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_DIAG_60_DEG_DOWN_TO_FLAT
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_BANK_NONE, 0 }, // ELEM_DIAG_FLAT_TO_LEFT_BANK
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_BANK_NONE, 0 }, // ELEM_DIAG_FLAT_TO_RIGHT_BANK
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_LEFT, 0 }, // ELEM_DIAG_LEFT_BANK_TO_FLAT
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_RIGHT, 0 }, // ELEM_DIAG_RIGHT_BANK_TO_FLAT
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_LEFT, 0 }, // ELEM_DIAG_LEFT_BANK_TO_25_DEG_UP
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_RIGHT, 0 }, // ELEM_DIAG_RIGHT_BANK_TO_25_DEG_UP
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_LEFT, TRACK_BANK_NONE, 0 }, // ELEM_DIAG_25_DEG_UP_TO_LEFT_BANK
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_RIGHT, TRACK_BANK_NONE, 0 }, // ELEM_DIAG_25_DEG_UP_TO_RIGHT_BANK
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_LEFT, 0 }, // ELEM_DIAG_LEFT_BANK_TO_25_DEG_DOWN
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_RIGHT, 0 }, // ELEM_DIAG_RIGHT_BANK_TO_25_DEG_DOWN
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_LEFT, TRACK_BANK_NONE, 0 }, // ELEM_DIAG_25_DEG_DOWN_TO_LEFT_BANK
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_RIGHT, TRACK_BANK_NONE, 0 }, // ELEM_DIAG_25_DEG_DOWN_TO_RIGHT_BANK
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, 0 }, // ELEM_DIAG_LEFT_BANK
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, 0 }, // ELEM_DIAG_RIGHT_BANK
|
|
|
|
|
{ TRACK_LOG_FLUME_REVERSER, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_LOG_FLUME_REVERSER
|
|
|
|
|
{ TRACK_SPINNING_TUNNEL, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_SPINNING_TUNNEL
|
|
|
|
|
{ TRACK_BARREL_ROLL, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_BANK_NONE, 0 }, // ELEM_LEFT_BARREL_ROLL_UP_TO_DOWN
|
|
|
|
|
{ TRACK_BARREL_ROLL, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_BANK_NONE, 0 }, // ELEM_RIGHT_BARREL_ROLL_UP_TO_DOWN
|
|
|
|
|
{ TRACK_BARREL_ROLL, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_UPSIDE_DOWN, 0 }, // ELEM_LEFT_BARREL_ROLL_DOWN_TO_UP
|
|
|
|
|
{ TRACK_BARREL_ROLL, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_UPSIDE_DOWN, 0 }, // ELEM_RIGHT_BARREL_ROLL_DOWN_TO_UP
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_LEFT, 0 }, // ELEM_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_TILES_25_DEG_UP
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_RIGHT, 0 }, // ELEM_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_LEFT, TRACK_BANK_NONE, 0 }, // ELEM_LEFT_QUARTER_TURN_3_TILES_25_DEG_DOWN_TO_LEFT_BANK
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_RIGHT, TRACK_BANK_NONE, 0 }, // ELEM_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN_TO_RIGHT_BANK
|
|
|
|
|
{ TRACK_POWERED_LIFT, TRACK_SLOPE_UP_25, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_POWERED_LIFT
|
|
|
|
|
{ TRACK_HALF_LOOP_LARGE, TRACK_SLOPE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_UPSIDE_DOWN, TRACK_BANK_NONE, 64 }, // ELEM_LEFT_LARGE_HALF_LOOP_UP
|
|
|
|
|
{ TRACK_HALF_LOOP_LARGE, TRACK_SLOPE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_UPSIDE_DOWN, TRACK_BANK_NONE, 64 }, // ELEM_RIGHT_LARGE_HALF_LOOP_UP
|
|
|
|
|
{ TRACK_HALF_LOOP_LARGE, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_UPSIDE_DOWN, -64 }, // ELEM_RIGHT_LARGE_HALF_LOOP_DOWN
|
|
|
|
|
{ TRACK_HALF_LOOP_LARGE, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_UPSIDE_DOWN, -64 }, // ELEM_LEFT_LARGE_HALF_LOOP_DOWN
|
|
|
|
|
{ TRACK_INLINE_TWIST_UNINVERTED,TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_BANK_NONE, 0 }, // ELEM_LEFT_FLYER_TWIST_UP
|
|
|
|
|
{ TRACK_INLINE_TWIST_UNINVERTED,TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_BANK_NONE, 0 }, // ELEM_RIGHT_FLYER_TWIST_UP
|
|
|
|
|
{ TRACK_INLINE_TWIST_INVERTED, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_BANK_NONE, 0 }, // ELEM_LEFT_FLYER_TWIST_DOWN
|
|
|
|
|
{ TRACK_INLINE_TWIST_INVERTED, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_BANK_NONE, 0 }, // ELEM_RIGHT_FLYER_TWIST_DOWN
|
|
|
|
|
{ TRACK_HALF_LOOP_UNINVERTED, TRACK_SLOPE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_UPSIDE_DOWN, TRACK_BANK_NONE, 64 }, // ELEM_FLYER_HALF_LOOP_UP
|
|
|
|
|
{ TRACK_HALF_LOOP_INVERTED, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_BANK_NONE, -64 }, // ELEM_FLYER_HALF_LOOP_DOWN
|
|
|
|
|
{ TRACK_190, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_BANK_NONE, 0 }, // ELEM_LEFT_FLYER_CORKSCREW_UP
|
|
|
|
|
{ TRACK_190, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_BANK_NONE, 0 }, // ELEM_RIGHT_FLYER_CORKSCREW_UP
|
|
|
|
|
{ TRACK_192, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_BANK_NONE, -32 }, // ELEM_LEFT_FLYER_CORKSCREW_DOWN
|
|
|
|
|
{ TRACK_192, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_BANK_NONE, -32 }, // ELEM_RIGHT_FLYER_CORKSCREW_DOWN
|
|
|
|
|
{ TRACK_194, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_HEARTLINE_TRANSFER_UP
|
|
|
|
|
{ TRACK_194, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_HEARTLINE_TRANSFER_DOWN
|
|
|
|
|
{ TRACK_HEARTLINE_ROLL, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_LEFT_HEARTLINE_ROLL
|
|
|
|
|
{ TRACK_HEARTLINE_ROLL, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_RIGHT_HEARTLINE_ROLL
|
|
|
|
|
{ TRACK_MINI_GOLF_HOLE, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_MINI_GOLF_HOLE_A
|
|
|
|
|
{ TRACK_MINI_GOLF_HOLE, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_MINI_GOLF_HOLE_B
|
|
|
|
|
{ TRACK_MINI_GOLF_HOLE, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_MINI_GOLF_HOLE_C
|
|
|
|
|
{ TRACK_MINI_GOLF_HOLE, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_MINI_GOLF_HOLE_D
|
|
|
|
|
{ TRACK_MINI_GOLF_HOLE, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_MINI_GOLF_HOLE_E
|
|
|
|
|
{ TRACK_QUARTER_LOOP_INVERTED, TRACK_SLOPE_DOWN_90, TRACK_SLOPE_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_BANK_NONE, 0 }, // ELEM_MULTIDIM_INVERTED_FLAT_TO_90_DEG_QUARTER_LOOP_DOWN
|
|
|
|
|
{ TRACK_QUARTER_LOOP, TRACK_SLOPE_NONE, TRACK_SLOPE_UP_90, TRACK_BANK_UPSIDE_DOWN, TRACK_BANK_NONE, 0 }, // ELEM_90_DEG_TO_INVERTED_FLAT_QUARTER_LOOP_UP
|
|
|
|
|
{ TRACK_QUARTER_LOOP, TRACK_SLOPE_DOWN_90, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_UPSIDE_DOWN, 0 }, // ELEM_INVERTED_FLAT_TO_90_DEG_QUARTER_LOOP_DOWN
|
|
|
|
|
{ TRACK_LIFT_HILL_CURVED, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_LEFT_CURVED_LIFT_HILL
|
|
|
|
|
{ TRACK_LIFT_HILL_CURVED, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_RIGHT_CURVED_LIFT_HILL
|
|
|
|
|
{ TRACK_REVERSER, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_LEFT_REVERSER
|
|
|
|
|
{ TRACK_REVERSER, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_RIGHT_REVERSER
|
|
|
|
|
{ TRACK_SLOPE_TO_FLAT, TRACK_SLOPE_DOWN_90, TRACK_SLOPE_UP_90, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_AIR_THRUST_TOP_CAP
|
|
|
|
|
{ TRACK_SLOPE_TO_FLAT, TRACK_SLOPE_DOWN_90, TRACK_SLOPE_DOWN_90, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_AIR_THRUST_VERTICAL_DOWN
|
|
|
|
|
{ TRACK_SLOPE_TO_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_DOWN_90, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_AIR_THRUST_VERTICAL_DOWN_TO_LEVEL
|
|
|
|
|
{ TRACK_BLOCK_BRAKES, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_BLOCK_BRAKES
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_UP_25, TRACK_BANK_LEFT, TRACK_BANK_LEFT, 0 }, // ELEM_LEFT_BANKED_QUARTER_TURN_3_TILE_25_DEG_UP
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_UP_25, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, 0 }, // ELEM_RIGHT_BANKED_QUARTER_TURN_3_TILE_25_DEG_UP
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_DOWN_25, TRACK_BANK_LEFT, TRACK_BANK_LEFT, 0 }, // ELEM_LEFT_BANKED_QUARTER_TURN_3_TILE_25_DEG_DOWN
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_DOWN_25, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, 0 }, // ELEM_RIGHT_BANKED_QUARTER_TURN_3_TILE_25_DEG_DOWN
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_UP_25, TRACK_BANK_LEFT, TRACK_BANK_LEFT, 0 }, // ELEM_LEFT_BANKED_QUARTER_TURN_5_TILE_25_DEG_UP
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_UP_25, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, 0 }, // ELEM_RIGHT_BANKED_QUARTER_TURN_5_TILE_25_DEG_UP
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_DOWN_25, TRACK_BANK_LEFT, TRACK_BANK_LEFT, 0 }, // ELEM_LEFT_BANKED_QUARTER_TURN_5_TILE_25_DEG_DOWN
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_DOWN_25, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, 0 }, // ELEM_RIGHT_BANKED_QUARTER_TURN_5_TILE_25_DEG_DOWN
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_UP_25, TRACK_BANK_LEFT, TRACK_BANK_NONE, 0 }, // ELEM_25_DEG_UP_TO_LEFT_BANKED_25_DEG_UP
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_UP_25, TRACK_BANK_RIGHT, TRACK_BANK_NONE, 0 }, // ELEM_25_DEG_UP_TO_RIGHT_BANKED_25_DEG_UP
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_BANK_LEFT, 0 }, // ELEM_LEFT_BANKED_25_DEG_UP_TO_25_DEG_UP
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_BANK_RIGHT, 0 }, // ELEM_RIGHT_BANKED_25_DEG_UP_TO_25_DEG_UP
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_DOWN_25, TRACK_BANK_LEFT, TRACK_BANK_NONE, 0 }, // ELEM_25_DEG_DOWN_TO_LEFT_BANKED_25_DEG_DOWN
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_DOWN_25, TRACK_BANK_RIGHT, TRACK_BANK_NONE, 0 }, // ELEM_25_DEG_DOWN_TO_RIGHT_BANKED_25_DEG_DOWN
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_LEFT, 0 }, // ELEM_LEFT_BANKED_25_DEG_DOWN_TO_25_DEG_DOWN
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_RIGHT, 0 }, // ELEM_RIGHT_BANKED_25_DEG_DOWN_TO_25_DEG_DOWN
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, 0 }, // ELEM_LEFT_BANKED_FLAT_TO_LEFT_BANKED_25_DEG_UP
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, 0 }, // ELEM_RIGHT_BANKED_FLAT_TO_RIGHT_BANKED_25_DEG_UP
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_LEFT, TRACK_BANK_LEFT, 0 }, // ELEM_LEFT_BANKED_25_DEG_UP_TO_LEFT_BANKED_FLAT
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, 0 }, // ELEM_RIGHT_BANKED_25_DEG_UP_TO_RIGHT_BANKED_FLAT
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, 0 }, // ELEM_LEFT_BANKED_FLAT_TO_LEFT_BANKED_25_DEG_DOWN
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, 0 }, // ELEM_RIGHT_BANKED_FLAT_TO_RIGHT_BANKED_25_DEG_DOWN
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_LEFT, TRACK_BANK_LEFT, 0 }, // ELEM_LEFT_BANKED_25_DEG_DOWN_TO_LEFT_BANKED_FLAT
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, 0 }, // ELEM_RIGHT_BANKED_25_DEG_DOWN_TO_RIGHT_BANKED_FLAT
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_BANK_NONE, 0 }, // ELEM_FLAT_TO_LEFT_BANKED_25_DEG_UP
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_BANK_NONE, 0 }, // ELEM_FLAT_TO_RIGHT_BANKED_25_DEG_UP
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_BANK_LEFT, 0 }, // ELEM_LEFT_BANKED_25_DEG_UP_TO_FLAT
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_BANK_RIGHT, 0 }, // ELEM_RIGHT_BANKED_25_DEG_UP_TO_FLAT
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_BANK_NONE, 0 }, // ELEM_FLAT_TO_LEFT_BANKED_25_DEG_DOWN
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_BANK_NONE, 0 }, // ELEM_FLAT_TO_RIGHT_BANKED_25_DEG_DOWN
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_LEFT, 0 }, // ELEM_LEFT_BANKED_25_DEG_DOWN_TO_FLAT
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_RIGHT, 0 }, // ELEM_RIGHT_BANKED_25_DEG_DOWN_TO_FLAT
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_UP_90, TRACK_SLOPE_UP_90, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_LEFT_QUARTER_TURN_1_TILE_90_DEG_UP
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_UP_90, TRACK_SLOPE_UP_90, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_RIGHT_QUARTER_TURN_1_TILE_90_DEG_UP
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_DOWN_90, TRACK_SLOPE_DOWN_90, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_LEFT_QUARTER_TURN_1_TILE_90_DEG_DOWN
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_DOWN_90, TRACK_SLOPE_DOWN_90, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // ELEM_RIGHT_QUARTER_TURN_1_TILE_90_DEG_DOWN
|
|
|
|
|
{ TRACK_QUARTER_LOOP_UNINVERTED,TRACK_SLOPE_NONE, TRACK_SLOPE_UP_90, TRACK_BANK_UPSIDE_DOWN, TRACK_BANK_NONE, 0 }, // ELEM_MULTIDIM_90_DEG_UP_TO_INVERTED_FLAT_QUARTER_LOOP
|
|
|
|
|
{ TRACK_QUARTER_LOOP_UNINVERTED,TRACK_SLOPE_DOWN_90, TRACK_SLOPE_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_BANK_NONE, 0 }, // ELEM_MULTIDIM_FLAT_TO_90_DEG_DOWN_QUARTER_LOOP
|
|
|
|
|
{ TRACK_QUARTER_LOOP_INVERTED, TRACK_SLOPE_NONE, TRACK_SLOPE_UP_90, TRACK_BANK_UPSIDE_DOWN, TRACK_BANK_NONE, 0 }, // 255
|
2016-08-04 01:16:31 +02:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/** rct2: 0x0099849D */
|
2017-10-17 13:55:53 +02:00
|
|
|
|
const rct_trackdefinition FlatRideTrackDefinitions[256] =
|
|
|
|
|
{
|
2017-10-17 13:56:33 +02:00
|
|
|
|
// TYPE VANGLE END VANGLE START BANK END BANK START PREVIEW Z OFFSET
|
2017-06-06 23:24:18 +02:00
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 0
|
|
|
|
|
{ TRACK_STATION_END, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 1
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 2
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 3
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 4
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_UP_60, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 5
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 6
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_UP_60, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 7
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 8
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 9
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 10
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_DOWN_60, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 11
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 12
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_DOWN_60, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 13
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 14
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 15
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 16
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 17
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_BANK_NONE, 0 }, // 18
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_BANK_NONE, 0 }, // 19
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_LEFT, 0 }, // 20
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_RIGHT, 0 }, // 21
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, 0 }, // 22
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, 0 }, // 23
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_LEFT, 0 }, // 24
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_RIGHT, 0 }, // 25
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_LEFT, TRACK_BANK_NONE, 0 }, // 26
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_RIGHT, TRACK_BANK_NONE, 0 }, // 27
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_LEFT, 0 }, // 28
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_RIGHT, 0 }, // 29
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_LEFT, TRACK_BANK_NONE, 0 }, // 30
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_RIGHT, TRACK_BANK_NONE, 0 }, // 31
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, 0 }, // 32
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, 0 }, // 33
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 34
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 35
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 36
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 37
|
|
|
|
|
{ TRACK_S_BEND, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 38
|
|
|
|
|
{ TRACK_S_BEND, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 39
|
2017-10-17 13:56:33 +02:00
|
|
|
|
{ TRACK_VERTICAL_LOOP, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, -48 }, // 40
|
|
|
|
|
{ TRACK_VERTICAL_LOOP, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, -48 }, // 41
|
2017-06-06 23:24:18 +02:00
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 42
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 43
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, 0 }, // 44
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, 0 }, // 45
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 46
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 47
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 48
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 49
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 50
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 51
|
|
|
|
|
{ TRACK_TWIST, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_BANK_NONE, 0 }, // 52
|
|
|
|
|
{ TRACK_TWIST, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_BANK_NONE, 0 }, // 53
|
|
|
|
|
{ TRACK_TWIST, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_UPSIDE_DOWN, 0 }, // 54
|
|
|
|
|
{ TRACK_TWIST, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_UPSIDE_DOWN, 0 }, // 55
|
2017-10-17 13:56:33 +02:00
|
|
|
|
{ TRACK_HALF_LOOP, TRACK_SLOPE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_UPSIDE_DOWN, TRACK_BANK_NONE, 64 }, // 56
|
|
|
|
|
{ TRACK_HALF_LOOP, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_UPSIDE_DOWN, -64 }, // 57
|
2017-06-06 23:24:18 +02:00
|
|
|
|
{ TRACK_CORKSCREW, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_BANK_NONE, 0 }, // 58
|
|
|
|
|
{ TRACK_CORKSCREW, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_BANK_NONE, 0 }, // 59
|
2017-10-17 13:56:33 +02:00
|
|
|
|
{ TRACK_CORKSCREW, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_UPSIDE_DOWN, -32 }, // 60
|
|
|
|
|
{ TRACK_CORKSCREW, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_UPSIDE_DOWN, -32 }, // 61
|
2017-06-06 23:24:18 +02:00
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_UP_60, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 62
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 63
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_DOWN_60, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 64
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 65
|
|
|
|
|
{ TRACK_TOWER_BASE, TRACK_SLOPE_UP_90, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 66
|
|
|
|
|
{ TRACK_TOWER_BASE, TRACK_SLOPE_UP_90, TRACK_SLOPE_UP_90, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 67
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 68
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 69
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_UP_60, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 70
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 71
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_UP_60, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 72
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 73
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 74
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 75
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_DOWN_60, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 76
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 77
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_DOWN_60, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 78
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 79
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 80
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 81
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 82
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 83
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 84
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 85
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 86
|
|
|
|
|
{ TRACK_HELIX_SMALL, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, 0 }, // 87
|
|
|
|
|
{ TRACK_HELIX_SMALL, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, 0 }, // 88
|
|
|
|
|
{ TRACK_HELIX_SMALL, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, 0 }, // 89
|
|
|
|
|
{ TRACK_HELIX_SMALL, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, 0 }, // 90
|
|
|
|
|
{ TRACK_HELIX_SMALL, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, 0 }, // 91
|
|
|
|
|
{ TRACK_HELIX_SMALL, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, 0 }, // 92
|
|
|
|
|
{ TRACK_HELIX_SMALL, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, 0 }, // 93
|
|
|
|
|
{ TRACK_HELIX_SMALL, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, 0 }, // 94
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // FLAT_TRACK_ELEM_1_X_4_A
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_UP_60, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 96
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_DOWN_60, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 97
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_DOWN_60, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 98
|
|
|
|
|
{ TRACK_BRAKES, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 99
|
|
|
|
|
{ TRACK_ROTATION_CONTROL_TOGGLE,TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 100
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 101
|
|
|
|
|
{ TRACK_HELIX_LARGE, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, 0 }, // 102
|
|
|
|
|
{ TRACK_HELIX_LARGE, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, 0 }, // 103
|
|
|
|
|
{ TRACK_HELIX_LARGE, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, 0 }, // 104
|
|
|
|
|
{ TRACK_HELIX_LARGE, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, 0 }, // 105
|
|
|
|
|
{ TRACK_HELIX_LARGE_UNBANKED, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 106
|
|
|
|
|
{ TRACK_HELIX_LARGE_UNBANKED, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 107
|
|
|
|
|
{ TRACK_HELIX_LARGE_UNBANKED, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 108
|
|
|
|
|
{ TRACK_HELIX_LARGE_UNBANKED, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 109
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // FLAT_TRACK_ELEM_2_X_2
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // FLAT_TRACK_ELEM_4_X_4
|
|
|
|
|
{ TRACK_WHIRLPOOL, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 112
|
|
|
|
|
{ TRACK_WHIRLPOOL, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 113
|
|
|
|
|
{ TRACK_ON_RIDE_PHOTO, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 114
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 115
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // FLAT_TRACK_ELEM_1_X_5
|
|
|
|
|
{ TRACK_WATER_SPLASH, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 117
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // FLAT_TRACK_ELEM_1_X_1_A
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // FLAT_TRACK_ELEM_1_X_4_B
|
|
|
|
|
{ TRACK_WHIRLPOOL, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 120
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // FLAT_TRACK_ELEM_1_X_1_B
|
2017-10-17 13:56:33 +02:00
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, -40 }, // FLAT_TRACK_ELEM_1_X_4_C
|
2017-06-06 23:24:18 +02:00
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // FLAT_TRACK_ELEM_3_X_3
|
2017-10-17 13:56:33 +02:00
|
|
|
|
{ TRACK_REVERSE_FREEFALL, TRACK_SLOPE_UP_90, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 124
|
|
|
|
|
{ TRACK_REVERSE_FREEFALL, TRACK_SLOPE_UP_90, TRACK_SLOPE_UP_90, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 125
|
2017-06-06 23:24:18 +02:00
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_UP_90, TRACK_SLOPE_UP_90, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 126
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_DOWN_90, TRACK_SLOPE_DOWN_90, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 127
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_UP_90, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 128
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_DOWN_60, TRACK_SLOPE_DOWN_90, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 129
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_UP_60, TRACK_SLOPE_UP_90, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 130
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_DOWN_90, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 131
|
|
|
|
|
{ TRACK_BRAKE_FOR_DROP, TRACK_SLOPE_DOWN_60, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 132
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 133
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 134
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 135
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 136
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, 0 }, // 137
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, 0 }, // 138
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, 0 }, // 139
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, 0 }, // 140
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 141
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 142
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_UP_60, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 143
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 144
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_UP_60, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 145
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 146
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 147
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 148
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_DOWN_60, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 149
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 150
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_DOWN_60, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 151
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 152
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 153
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_UP_60, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 154
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 155
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_DOWN_60, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 156
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 157
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_BANK_NONE, 0 }, // 158
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_BANK_NONE, 0 }, // 159
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_LEFT, 0 }, // 160
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_RIGHT, 0 }, // 161
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_LEFT, 0 }, // 162
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_RIGHT, 0 }, // 163
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_LEFT, TRACK_BANK_NONE, 0 }, // 164
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_RIGHT, TRACK_BANK_NONE, 0 }, // 165
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_LEFT, 0 }, // 166
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_RIGHT, 0 }, // 167
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_LEFT, TRACK_BANK_NONE, 0 }, // 168
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_RIGHT, TRACK_BANK_NONE, 0 }, // 169
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, 0 }, // 170
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, 0 }, // 171
|
|
|
|
|
{ TRACK_LOG_FLUME_REVERSER, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 172
|
|
|
|
|
{ TRACK_SPINNING_TUNNEL, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 173
|
|
|
|
|
{ TRACK_BARREL_ROLL, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_UPSIDE_DOWN,TRACK_BANK_NONE, 0 }, // 174
|
|
|
|
|
{ TRACK_BARREL_ROLL, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_UPSIDE_DOWN,TRACK_BANK_NONE, 0 }, // 175
|
|
|
|
|
{ TRACK_BARREL_ROLL, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_UPSIDE_DOWN, 0 }, // 176
|
|
|
|
|
{ TRACK_BARREL_ROLL, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_UPSIDE_DOWN, 0 }, // 177
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_LEFT, 0 }, // 178
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_RIGHT, 0 }, // 179
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_LEFT, TRACK_BANK_NONE, 0 }, // 180
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_RIGHT, TRACK_BANK_NONE, 0 }, // 181
|
|
|
|
|
{ TRACK_POWERED_LIFT, TRACK_SLOPE_UP_25, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 182
|
2017-10-17 13:56:33 +02:00
|
|
|
|
{ TRACK_HALF_LOOP_LARGE, TRACK_SLOPE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_UPSIDE_DOWN,TRACK_BANK_NONE, 64 }, // 183
|
|
|
|
|
{ TRACK_HALF_LOOP_LARGE, TRACK_SLOPE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_UPSIDE_DOWN,TRACK_BANK_NONE, 64 }, // 184
|
|
|
|
|
{ TRACK_HALF_LOOP_LARGE, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_UPSIDE_DOWN, -64 }, // 185
|
|
|
|
|
{ TRACK_HALF_LOOP_LARGE, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_UPSIDE_DOWN, -64 }, // 186
|
2017-06-06 23:24:18 +02:00
|
|
|
|
{ TRACK_190, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_UPSIDE_DOWN,TRACK_BANK_NONE, 0 }, // 187
|
|
|
|
|
{ TRACK_190, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_UPSIDE_DOWN,TRACK_BANK_NONE, 0 }, // 188
|
|
|
|
|
{ TRACK_192, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_UPSIDE_DOWN,TRACK_BANK_NONE, 0 }, // 189
|
|
|
|
|
{ TRACK_192, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_UPSIDE_DOWN,TRACK_BANK_NONE, 0 }, // 190
|
2017-10-17 13:56:33 +02:00
|
|
|
|
{ TRACK_190, TRACK_SLOPE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_UPSIDE_DOWN,TRACK_BANK_NONE, 64 }, // 191
|
|
|
|
|
{ TRACK_192, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_NONE, TRACK_BANK_UPSIDE_DOWN,TRACK_BANK_NONE, -64 }, // 192
|
2017-06-06 23:24:18 +02:00
|
|
|
|
{ TRACK_190, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_UPSIDE_DOWN,TRACK_BANK_NONE, 0 }, // 193
|
|
|
|
|
{ TRACK_190, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_UPSIDE_DOWN,TRACK_BANK_NONE, 0 }, // 194
|
2017-10-17 13:56:33 +02:00
|
|
|
|
{ TRACK_192, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_UPSIDE_DOWN,TRACK_BANK_NONE, -32 }, // 195
|
|
|
|
|
{ TRACK_192, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_UPSIDE_DOWN,TRACK_BANK_NONE, -32 }, // 196
|
2017-06-06 23:24:18 +02:00
|
|
|
|
{ TRACK_194, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 197
|
|
|
|
|
{ TRACK_194, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 198
|
|
|
|
|
{ TRACK_HEARTLINE_ROLL, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 199
|
|
|
|
|
{ TRACK_HEARTLINE_ROLL, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 200
|
|
|
|
|
{ TRACK_MINI_GOLF_HOLE, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 201
|
|
|
|
|
{ TRACK_MINI_GOLF_HOLE, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 202
|
|
|
|
|
{ TRACK_MINI_GOLF_HOLE, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 203
|
|
|
|
|
{ TRACK_MINI_GOLF_HOLE, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 204
|
|
|
|
|
{ TRACK_MINI_GOLF_HOLE, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 205
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 206
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 207
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 208
|
|
|
|
|
{ TRACK_LIFT_HILL_CURVED, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 209
|
|
|
|
|
{ TRACK_LIFT_HILL_CURVED, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 210
|
|
|
|
|
{ TRACK_REVERSER, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 211
|
|
|
|
|
{ TRACK_REVERSER, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 212
|
|
|
|
|
{ TRACK_SLOPE_TO_FLAT, TRACK_SLOPE_DOWN_90, TRACK_SLOPE_UP_90, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 213
|
|
|
|
|
{ TRACK_SLOPE_TO_FLAT, TRACK_SLOPE_DOWN_90, TRACK_SLOPE_DOWN_90, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 214
|
|
|
|
|
{ TRACK_SLOPE_TO_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_DOWN_90, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 215
|
|
|
|
|
{ TRACK_BLOCK_BRAKES, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 216
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_UP_25, TRACK_BANK_LEFT, TRACK_BANK_LEFT, 0 }, // 217
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_UP_25, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, 0 }, // 218
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_DOWN_25, TRACK_BANK_LEFT, TRACK_BANK_LEFT, 0 }, // 219
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_DOWN_25, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, 0 }, // 220
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_UP_25, TRACK_BANK_LEFT, TRACK_BANK_LEFT, 0 }, // 221
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_UP_25, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, 0 }, // 222
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_DOWN_25, TRACK_BANK_LEFT, TRACK_BANK_LEFT, 0 }, // 223
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_DOWN_25, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, 0 }, // 224
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_UP_25, TRACK_BANK_LEFT, TRACK_BANK_NONE, 0 }, // 225
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_UP_25, TRACK_BANK_RIGHT, TRACK_BANK_NONE, 0 }, // 226
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_BANK_LEFT, 0 }, // 227
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_BANK_RIGHT, 0 }, // 228
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_DOWN_25, TRACK_BANK_LEFT, TRACK_BANK_NONE, 0 }, // 229
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_DOWN_25, TRACK_BANK_RIGHT, TRACK_BANK_NONE, 0 }, // 230
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_LEFT, 0 }, // 231
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_RIGHT, 0 }, // 232
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, 0 }, // 233
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, 0 }, // 234
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_LEFT, TRACK_BANK_LEFT, 0 }, // 235
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, 0 }, // 236
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, 0 }, // 237
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, 0 }, // 238
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_LEFT, TRACK_BANK_LEFT, 0 }, // 239
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, 0 }, // 240
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_BANK_NONE, 0 }, // 241
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_BANK_NONE, 0 }, // 242
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_BANK_LEFT, 0 }, // 243
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_BANK_RIGHT, 0 }, // 244
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_BANK_NONE, 0 }, // 245
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_BANK_NONE, 0 }, // 246
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_LEFT, 0 }, // 247
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_RIGHT, 0 }, // 248
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_UP_90, TRACK_SLOPE_UP_90, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 249
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_UP_90, TRACK_SLOPE_UP_90, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 250
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_DOWN_90, TRACK_SLOPE_DOWN_90, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 251
|
|
|
|
|
{ TRACK_FLAT, TRACK_SLOPE_DOWN_90, TRACK_SLOPE_DOWN_90, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // 252
|
2017-10-17 13:56:33 +02:00
|
|
|
|
{ TRACK_QUARTER_LOOP_UNINVERTED,TRACK_SLOPE_NONE, TRACK_SLOPE_UP_90, TRACK_BANK_UPSIDE_DOWN, TRACK_BANK_NONE, 0 }, // 253
|
|
|
|
|
{ TRACK_QUARTER_LOOP_UNINVERTED,TRACK_SLOPE_DOWN_90, TRACK_SLOPE_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_BANK_NONE, 0 }, // 254
|
2014-04-23 02:50:40 +02:00
|
|
|
|
};
|
2018-01-10 16:14:36 +01:00
|
|
|
|
// clang-format on
|
2014-04-23 02:50:40 +02:00
|
|
|
|
|
2015-06-07 17:02:43 +02:00
|
|
|
|
/**
|
2016-04-28 22:46:39 +02:00
|
|
|
|
* Helper method to determine if a connects to b by its bank and angle, not location.
|
2015-06-07 17:02:43 +02:00
|
|
|
|
*/
|
2018-06-22 23:14:18 +02:00
|
|
|
|
int32_t track_is_connected_by_shape(rct_tile_element* a, rct_tile_element* b)
|
2015-06-07 17:02:43 +02:00
|
|
|
|
{
|
2018-06-20 17:28:51 +02:00
|
|
|
|
int32_t trackType, aBank, aAngle, bBank, bAngle;
|
2015-06-07 17:02:43 +02:00
|
|
|
|
|
2018-09-17 21:54:36 +02:00
|
|
|
|
trackType = a->AsTrack()->GetTrackType();
|
2018-06-22 23:14:18 +02:00
|
|
|
|
aBank = TrackDefinitions[trackType].bank_end;
|
|
|
|
|
aAngle = TrackDefinitions[trackType].vangle_end;
|
|
|
|
|
aBank = track_get_actual_bank(a, aBank);
|
2015-06-07 17:02:43 +02:00
|
|
|
|
|
2018-09-17 21:54:36 +02:00
|
|
|
|
trackType = b->AsTrack()->GetTrackType();
|
2018-06-22 23:14:18 +02:00
|
|
|
|
bBank = TrackDefinitions[trackType].bank_start;
|
|
|
|
|
bAngle = TrackDefinitions[trackType].vangle_start;
|
|
|
|
|
bBank = track_get_actual_bank(b, bBank);
|
2015-06-07 17:02:43 +02:00
|
|
|
|
|
2017-06-06 23:24:18 +02:00
|
|
|
|
return aBank == bBank && aAngle == bAngle;
|
2015-06-07 17:02:43 +02:00
|
|
|
|
}
|
|
|
|
|
|
2018-06-22 23:14:18 +02:00
|
|
|
|
const rct_preview_track* get_track_def_from_ride(Ride* ride, int32_t trackType)
|
2015-06-27 16:17:54 +02:00
|
|
|
|
{
|
2018-06-22 23:14:18 +02:00
|
|
|
|
return ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_FLAT_RIDE) ? FlatRideTrackBlocks[trackType] : TrackBlocks[trackType];
|
2015-06-27 16:17:54 +02:00
|
|
|
|
}
|
|
|
|
|
|
2018-06-22 23:14:18 +02:00
|
|
|
|
const rct_track_coordinates* get_track_coord_from_ride(Ride* ride, int32_t trackType)
|
2017-10-17 13:55:53 +02:00
|
|
|
|
{
|
2018-06-22 23:14:18 +02:00
|
|
|
|
return ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_FLAT_RIDE) ? &FlatTrackCoordinates[trackType]
|
|
|
|
|
: &TrackCoordinates[trackType];
|
2015-07-04 23:50:48 +02:00
|
|
|
|
}
|
|
|
|
|
|
2018-06-22 23:14:18 +02:00
|
|
|
|
const rct_preview_track* get_track_def_from_ride_index(int32_t rideIndex, int32_t trackType)
|
2015-06-27 16:17:54 +02:00
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
|
return get_track_def_from_ride(get_ride(rideIndex), trackType);
|
2015-06-27 16:17:54 +02:00
|
|
|
|
}
|
2015-06-27 18:53:28 +02:00
|
|
|
|
|
2018-06-22 23:14:18 +02:00
|
|
|
|
static rct_tile_element* find_station_element(int32_t x, int32_t y, int32_t z, int32_t direction, int32_t rideIndex)
|
2016-02-14 16:29:53 +01:00
|
|
|
|
{
|
2018-06-22 23:14:18 +02:00
|
|
|
|
rct_tile_element* tileElement = map_get_first_element_at(x >> 5, y >> 5);
|
2017-10-17 13:55:53 +02:00
|
|
|
|
do
|
|
|
|
|
{
|
2017-10-31 14:03:45 +01:00
|
|
|
|
if (z != tileElement->base_height)
|
2017-10-17 13:55:53 +02:00
|
|
|
|
continue;
|
2018-05-02 19:27:04 +02:00
|
|
|
|
if (tileElement->GetType() != TILE_ELEMENT_TYPE_TRACK)
|
2017-10-17 13:55:53 +02:00
|
|
|
|
continue;
|
2018-09-14 11:14:19 +02:00
|
|
|
|
if (tileElement->GetDirection() != direction)
|
2017-10-17 13:55:53 +02:00
|
|
|
|
continue;
|
2018-09-18 13:10:29 +02:00
|
|
|
|
if (tileElement->AsTrack()->GetRideIndex() != rideIndex)
|
2017-10-17 13:55:53 +02:00
|
|
|
|
continue;
|
2017-10-31 14:03:45 +01:00
|
|
|
|
if (!track_element_is_station(tileElement))
|
2017-10-17 13:55:53 +02:00
|
|
|
|
continue;
|
2017-06-06 23:24:18 +02:00
|
|
|
|
|
2017-10-31 14:03:45 +01:00
|
|
|
|
return tileElement;
|
2018-06-22 23:14:18 +02:00
|
|
|
|
} while (!(tileElement++)->IsLastForTile());
|
2017-10-17 13:55:53 +02:00
|
|
|
|
return nullptr;
|
2016-02-14 16:29:53 +01:00
|
|
|
|
}
|
|
|
|
|
|
2018-06-22 23:14:18 +02:00
|
|
|
|
static void ride_remove_station(Ride* ride, int32_t x, int32_t y, int32_t z)
|
2016-02-14 16:29:53 +01:00
|
|
|
|
{
|
2018-06-20 17:28:51 +02:00
|
|
|
|
for (int32_t i = 0; i < MAX_STATIONS; i++)
|
2017-07-18 12:23:24 +02:00
|
|
|
|
{
|
2018-06-22 23:14:18 +02:00
|
|
|
|
if (ride->station_starts[i].x == (x >> 5) && ride->station_starts[i].y == (y >> 5) && ride->station_heights[i] == z)
|
2017-07-18 12:23:24 +02:00
|
|
|
|
{
|
|
|
|
|
ride->station_starts[i].xy = RCT_XY8_UNDEFINED;
|
2017-06-06 23:24:18 +02:00
|
|
|
|
ride->num_stations--;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
2016-02-14 16:29:53 +01:00
|
|
|
|
}
|
|
|
|
|
|
2015-09-05 21:34:56 +02:00
|
|
|
|
/**
|
|
|
|
|
*
|
|
|
|
|
* rct2: 0x006C4D89
|
|
|
|
|
*/
|
2018-06-20 17:28:51 +02:00
|
|
|
|
static bool track_add_station_element(int32_t x, int32_t y, int32_t z, int32_t direction, int32_t rideIndex, int32_t flags)
|
2015-09-05 21:34:56 +02:00
|
|
|
|
{
|
2018-06-22 23:14:18 +02:00
|
|
|
|
int32_t stationX0 = x;
|
|
|
|
|
int32_t stationY0 = y;
|
|
|
|
|
int32_t stationX1 = x;
|
|
|
|
|
int32_t stationY1 = y;
|
2018-06-20 17:28:51 +02:00
|
|
|
|
int32_t stationLength = 1;
|
2017-06-06 23:24:18 +02:00
|
|
|
|
|
2018-06-22 23:14:18 +02:00
|
|
|
|
Ride* ride = get_ride(rideIndex);
|
2017-10-17 13:55:53 +02:00
|
|
|
|
if (ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_3))
|
|
|
|
|
{
|
|
|
|
|
if (ride->num_stations >= MAX_STATIONS)
|
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
|
gGameCommandErrorText = STR_NO_MORE_STATIONS_ALLOWED_ON_THIS_RIDE;
|
|
|
|
|
return false;
|
|
|
|
|
}
|
2017-07-18 13:39:12 +02:00
|
|
|
|
if (flags & GAME_COMMAND_FLAG_APPLY)
|
|
|
|
|
{
|
2018-06-20 17:28:51 +02:00
|
|
|
|
int8_t stationIndex = ride_get_first_empty_station_start(ride);
|
2017-06-06 23:24:18 +02:00
|
|
|
|
assert(stationIndex != -1);
|
|
|
|
|
|
2017-07-18 12:23:24 +02:00
|
|
|
|
ride->station_starts[stationIndex].x = (x >> 5);
|
|
|
|
|
ride->station_starts[stationIndex].y = (y >> 5);
|
2018-06-22 23:14:18 +02:00
|
|
|
|
ride->station_heights[stationIndex] = z;
|
|
|
|
|
ride->station_depart[stationIndex] = 1;
|
|
|
|
|
ride->station_length[stationIndex] = 0;
|
2017-06-06 23:24:18 +02:00
|
|
|
|
ride->num_stations++;
|
|
|
|
|
}
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
2018-06-22 23:14:18 +02:00
|
|
|
|
rct_tile_element* stationElement;
|
2017-06-06 23:24:18 +02:00
|
|
|
|
|
|
|
|
|
// Search backwards for more station
|
|
|
|
|
x = stationX0;
|
|
|
|
|
y = stationY0;
|
2017-10-17 13:55:53 +02:00
|
|
|
|
do
|
|
|
|
|
{
|
2018-04-18 20:34:34 +02:00
|
|
|
|
x -= CoordsDirectionDelta[direction].x;
|
|
|
|
|
y -= CoordsDirectionDelta[direction].y;
|
2017-06-06 23:24:18 +02:00
|
|
|
|
|
|
|
|
|
stationElement = find_station_element(x, y, z, direction, rideIndex);
|
2017-10-17 13:55:53 +02:00
|
|
|
|
if (stationElement != nullptr)
|
|
|
|
|
{
|
2018-09-17 21:54:36 +02:00
|
|
|
|
if (stationElement->AsTrack()->GetTrackType() == TRACK_ELEM_END_STATION)
|
2017-10-17 13:55:53 +02:00
|
|
|
|
{
|
|
|
|
|
if (flags & GAME_COMMAND_FLAG_APPLY)
|
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
|
ride_remove_station(ride, x, y, z);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
stationX0 = x;
|
|
|
|
|
stationY0 = y;
|
|
|
|
|
stationLength++;
|
|
|
|
|
}
|
2018-06-22 23:14:18 +02:00
|
|
|
|
} while (stationElement != nullptr);
|
2017-06-06 23:24:18 +02:00
|
|
|
|
|
|
|
|
|
// Search forwards for more station
|
|
|
|
|
x = stationX1;
|
|
|
|
|
y = stationY1;
|
2017-10-17 13:55:53 +02:00
|
|
|
|
do
|
|
|
|
|
{
|
2018-04-18 20:34:34 +02:00
|
|
|
|
x += CoordsDirectionDelta[direction].x;
|
|
|
|
|
y += CoordsDirectionDelta[direction].y;
|
2017-06-06 23:24:18 +02:00
|
|
|
|
|
|
|
|
|
stationElement = find_station_element(x, y, z, direction, rideIndex);
|
2017-10-17 13:55:53 +02:00
|
|
|
|
if (stationElement != nullptr)
|
|
|
|
|
{
|
2018-09-17 21:54:36 +02:00
|
|
|
|
if (stationElement->AsTrack()->GetTrackType() == TRACK_ELEM_END_STATION)
|
2017-10-17 13:55:53 +02:00
|
|
|
|
{
|
|
|
|
|
if (flags & GAME_COMMAND_FLAG_APPLY)
|
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
|
ride_remove_station(ride, x, y, z);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
stationX1 = x;
|
|
|
|
|
stationY1 = y;
|
|
|
|
|
stationLength++;
|
|
|
|
|
}
|
2018-06-22 23:14:18 +02:00
|
|
|
|
} while (stationElement != nullptr);
|
2017-06-06 23:24:18 +02:00
|
|
|
|
|
2017-10-17 13:55:53 +02:00
|
|
|
|
if (stationX0 == stationX1 && stationY0 == stationY1 && ride->num_stations >= MAX_STATIONS)
|
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
|
gGameCommandErrorText = STR_NO_MORE_STATIONS_ALLOWED_ON_THIS_RIDE;
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
2017-10-17 13:55:53 +02:00
|
|
|
|
if (stationLength > MAX_STATION_PLATFORM_LENGTH)
|
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
|
gGameCommandErrorText = STR_STATION_PLATFORM_TOO_LONG;
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
2017-10-17 13:55:53 +02:00
|
|
|
|
if (flags & GAME_COMMAND_FLAG_APPLY)
|
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
|
x = stationX1;
|
|
|
|
|
y = stationY1;
|
|
|
|
|
|
|
|
|
|
bool finaliseStationDone;
|
2017-10-17 13:55:53 +02:00
|
|
|
|
do
|
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
|
finaliseStationDone = true;
|
|
|
|
|
|
|
|
|
|
stationElement = find_station_element(x, y, z, direction, rideIndex);
|
2017-10-17 13:55:53 +02:00
|
|
|
|
if (stationElement != nullptr)
|
|
|
|
|
{
|
2018-06-20 17:28:51 +02:00
|
|
|
|
int32_t targetTrackType;
|
2017-07-18 13:39:12 +02:00
|
|
|
|
if (x == stationX1 && y == stationY1)
|
|
|
|
|
{
|
2018-06-20 17:28:51 +02:00
|
|
|
|
int8_t stationIndex = ride_get_first_empty_station_start(ride);
|
2017-06-06 23:24:18 +02:00
|
|
|
|
assert(stationIndex != -1);
|
|
|
|
|
|
2017-07-18 12:23:24 +02:00
|
|
|
|
ride->station_starts[stationIndex].x = (x >> 5);
|
|
|
|
|
ride->station_starts[stationIndex].y = (y >> 5);
|
2018-06-22 23:14:18 +02:00
|
|
|
|
ride->station_heights[stationIndex] = z;
|
|
|
|
|
ride->station_depart[stationIndex] = 1;
|
|
|
|
|
ride->station_length[stationIndex] = stationLength;
|
2017-06-06 23:24:18 +02:00
|
|
|
|
ride->num_stations++;
|
|
|
|
|
|
|
|
|
|
targetTrackType = TRACK_ELEM_END_STATION;
|
2017-10-17 13:55:53 +02:00
|
|
|
|
}
|
|
|
|
|
else if (x == stationX0 && y == stationY0)
|
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
|
targetTrackType = TRACK_ELEM_BEGIN_STATION;
|
2017-10-17 13:55:53 +02:00
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
|
targetTrackType = TRACK_ELEM_MIDDLE_STATION;
|
|
|
|
|
}
|
2018-09-17 21:54:36 +02:00
|
|
|
|
stationElement->AsTrack()->SetTrackType(targetTrackType);
|
2017-06-06 23:24:18 +02:00
|
|
|
|
|
|
|
|
|
map_invalidate_element(x, y, stationElement);
|
|
|
|
|
|
2017-10-17 13:55:53 +02:00
|
|
|
|
if (x != stationX0 || y != stationY0)
|
|
|
|
|
{
|
2018-04-18 20:34:34 +02:00
|
|
|
|
x -= CoordsDirectionDelta[direction].x;
|
|
|
|
|
y -= CoordsDirectionDelta[direction].y;
|
2017-06-06 23:24:18 +02:00
|
|
|
|
finaliseStationDone = false;
|
|
|
|
|
}
|
|
|
|
|
}
|
2018-06-22 23:14:18 +02:00
|
|
|
|
} while (!finaliseStationDone);
|
2017-06-06 23:24:18 +02:00
|
|
|
|
}
|
|
|
|
|
return true;
|
2015-09-05 21:34:56 +02:00
|
|
|
|
}
|
|
|
|
|
|
2016-02-14 18:37:28 +01:00
|
|
|
|
/**
|
|
|
|
|
*
|
|
|
|
|
* rct2: 0x006C494B
|
|
|
|
|
*/
|
2018-06-20 17:28:51 +02:00
|
|
|
|
static bool track_remove_station_element(int32_t x, int32_t y, int32_t z, int32_t direction, int32_t rideIndex, int32_t flags)
|
2016-02-14 18:37:28 +01:00
|
|
|
|
{
|
2018-06-22 23:14:18 +02:00
|
|
|
|
int32_t removeX = x;
|
|
|
|
|
int32_t removeY = y;
|
|
|
|
|
int32_t stationX0 = x;
|
|
|
|
|
int32_t stationY0 = y;
|
|
|
|
|
int32_t stationX1 = x;
|
|
|
|
|
int32_t stationY1 = y;
|
2018-06-20 17:28:51 +02:00
|
|
|
|
int32_t stationLength = 0;
|
2018-06-22 23:14:18 +02:00
|
|
|
|
int32_t byte_F441D1 = -1;
|
2017-06-06 23:24:18 +02:00
|
|
|
|
|
2018-06-22 23:14:18 +02:00
|
|
|
|
Ride* ride = get_ride(rideIndex);
|
2017-10-17 13:55:53 +02:00
|
|
|
|
if (ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_3))
|
|
|
|
|
{
|
2018-06-22 23:14:18 +02:00
|
|
|
|
rct_tile_element* tileElement = map_get_track_element_at_with_direction_from_ride(x, y, z, direction, rideIndex);
|
2017-10-31 14:03:45 +01:00
|
|
|
|
if (tileElement != nullptr)
|
2017-10-17 13:55:53 +02:00
|
|
|
|
{
|
|
|
|
|
if (flags & GAME_COMMAND_FLAG_APPLY)
|
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
|
ride_remove_station(ride, x, y, z);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
2018-06-22 23:14:18 +02:00
|
|
|
|
rct_tile_element* stationElement;
|
2017-06-06 23:24:18 +02:00
|
|
|
|
|
|
|
|
|
// Search backwards for more station
|
|
|
|
|
x = stationX0;
|
|
|
|
|
y = stationY0;
|
2017-10-17 13:55:53 +02:00
|
|
|
|
while ((stationElement = find_station_element(x, y, z, direction, rideIndex)) != nullptr)
|
|
|
|
|
{
|
2018-09-17 21:54:36 +02:00
|
|
|
|
if (stationElement->AsTrack()->GetTrackType() == TRACK_ELEM_END_STATION)
|
2017-10-17 13:55:53 +02:00
|
|
|
|
{
|
|
|
|
|
if (flags & GAME_COMMAND_FLAG_APPLY)
|
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
|
ride_remove_station(ride, x, y, z);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
stationX0 = x;
|
|
|
|
|
stationY0 = y;
|
|
|
|
|
byte_F441D1++;
|
|
|
|
|
|
2018-04-18 20:34:34 +02:00
|
|
|
|
x -= CoordsDirectionDelta[direction].x;
|
|
|
|
|
y -= CoordsDirectionDelta[direction].y;
|
2017-06-06 23:24:18 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Search forwards for more station
|
|
|
|
|
x = stationX1;
|
|
|
|
|
y = stationY1;
|
2017-10-17 13:55:53 +02:00
|
|
|
|
do
|
|
|
|
|
{
|
2018-04-18 20:34:34 +02:00
|
|
|
|
x += CoordsDirectionDelta[direction].x;
|
|
|
|
|
y += CoordsDirectionDelta[direction].y;
|
2017-06-06 23:24:18 +02:00
|
|
|
|
|
|
|
|
|
stationElement = find_station_element(x, y, z, direction, rideIndex);
|
2017-10-17 13:55:53 +02:00
|
|
|
|
if (stationElement != nullptr)
|
|
|
|
|
{
|
2018-09-17 21:54:36 +02:00
|
|
|
|
if (stationElement->AsTrack()->GetTrackType() == TRACK_ELEM_END_STATION)
|
2017-10-17 13:55:53 +02:00
|
|
|
|
{
|
|
|
|
|
if (flags & GAME_COMMAND_FLAG_APPLY)
|
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
|
ride_remove_station(ride, x, y, z);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
stationX1 = x;
|
|
|
|
|
stationY1 = y;
|
|
|
|
|
stationLength++;
|
|
|
|
|
}
|
2018-06-22 23:14:18 +02:00
|
|
|
|
} while (stationElement != nullptr);
|
2017-06-06 23:24:18 +02:00
|
|
|
|
|
2017-10-17 13:55:53 +02:00
|
|
|
|
if (!(flags & GAME_COMMAND_FLAG_APPLY))
|
|
|
|
|
{
|
2018-06-22 23:14:18 +02:00
|
|
|
|
if ((removeX != stationX0 || removeY != stationY0) && (removeX != stationX1 || removeY != stationY1)
|
|
|
|
|
&& ride->num_stations >= MAX_STATIONS)
|
2017-10-17 13:55:53 +02:00
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
|
gGameCommandErrorText = STR_NO_MORE_STATIONS_ALLOWED_ON_THIS_RIDE;
|
|
|
|
|
return false;
|
2017-10-17 13:55:53 +02:00
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
x = stationX1;
|
|
|
|
|
y = stationY1;
|
|
|
|
|
bool finaliseStationDone;
|
2017-10-17 13:55:53 +02:00
|
|
|
|
do
|
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
|
finaliseStationDone = true;
|
|
|
|
|
|
2017-10-17 13:55:53 +02:00
|
|
|
|
if (x != removeX || y != removeY)
|
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
|
stationElement = find_station_element(x, y, z, direction, rideIndex);
|
2017-10-17 13:55:53 +02:00
|
|
|
|
if (stationElement != nullptr)
|
|
|
|
|
{
|
2018-06-20 17:28:51 +02:00
|
|
|
|
int32_t targetTrackType;
|
2017-07-18 13:39:12 +02:00
|
|
|
|
if (x == stationX1 && y == stationY1)
|
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
|
loc_6C4BF5:;
|
2018-06-20 17:28:51 +02:00
|
|
|
|
int8_t stationIndex = ride_get_first_empty_station_start(ride);
|
2017-06-06 23:24:18 +02:00
|
|
|
|
assert(stationIndex != -1);
|
|
|
|
|
|
2017-07-18 12:23:24 +02:00
|
|
|
|
ride->station_starts[stationIndex].x = (x >> 5);
|
|
|
|
|
ride->station_starts[stationIndex].y = (y >> 5);
|
2018-06-22 23:14:18 +02:00
|
|
|
|
ride->station_heights[stationIndex] = z;
|
|
|
|
|
ride->station_depart[stationIndex] = 1;
|
|
|
|
|
ride->station_length[stationIndex] = stationLength != 0 ? stationLength : byte_F441D1;
|
2017-06-06 23:24:18 +02:00
|
|
|
|
ride->num_stations++;
|
|
|
|
|
|
2018-06-22 23:14:18 +02:00
|
|
|
|
stationLength = 0;
|
2017-06-06 23:24:18 +02:00
|
|
|
|
targetTrackType = TRACK_ELEM_END_STATION;
|
2017-10-17 13:55:53 +02:00
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2018-06-22 23:14:18 +02:00
|
|
|
|
if (x + CoordsDirectionDelta[direction].x == removeX && y + CoordsDirectionDelta[direction].y == removeY)
|
2017-10-17 13:55:53 +02:00
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
|
goto loc_6C4BF5;
|
2017-10-17 13:55:53 +02:00
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2018-06-22 23:14:18 +02:00
|
|
|
|
if (x - CoordsDirectionDelta[direction].x == removeX
|
|
|
|
|
&& y - CoordsDirectionDelta[direction].y == removeY)
|
2017-10-17 13:55:53 +02:00
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
|
targetTrackType = TRACK_ELEM_BEGIN_STATION;
|
2017-10-17 13:55:53 +02:00
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
if (x == stationX0 && y == stationY0)
|
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
|
targetTrackType = TRACK_ELEM_BEGIN_STATION;
|
2017-10-17 13:55:53 +02:00
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
|
targetTrackType = TRACK_ELEM_MIDDLE_STATION;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2018-09-17 21:54:36 +02:00
|
|
|
|
stationElement->AsTrack()->SetTrackType(targetTrackType);
|
2017-06-06 23:24:18 +02:00
|
|
|
|
|
|
|
|
|
map_invalidate_element(x, y, stationElement);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2017-10-17 13:55:53 +02:00
|
|
|
|
if (x != stationX0 || y != stationY0)
|
|
|
|
|
{
|
2018-04-18 20:34:34 +02:00
|
|
|
|
x -= CoordsDirectionDelta[direction].x;
|
|
|
|
|
y -= CoordsDirectionDelta[direction].y;
|
2017-06-06 23:24:18 +02:00
|
|
|
|
finaliseStationDone = false;
|
|
|
|
|
}
|
2018-06-22 23:14:18 +02:00
|
|
|
|
} while (!finaliseStationDone);
|
2017-06-06 23:24:18 +02:00
|
|
|
|
|
|
|
|
|
return true;
|
2016-02-14 18:37:28 +01:00
|
|
|
|
}
|
|
|
|
|
|
2018-06-22 23:14:18 +02:00
|
|
|
|
static money32 track_place(
|
2018-07-21 13:51:54 +02:00
|
|
|
|
int32_t rideIndex, int32_t type, int32_t originX, int32_t originY, int32_t originZ, int32_t direction, int32_t brakeSpeed,
|
|
|
|
|
int32_t colour, int32_t seatRotation, int32_t liftHillAndAlternativeState, int32_t flags)
|
2015-07-02 21:07:44 +02:00
|
|
|
|
{
|
2018-06-22 23:14:18 +02:00
|
|
|
|
Ride* ride = get_ride(rideIndex);
|
2017-10-17 13:55:53 +02:00
|
|
|
|
if (ride == nullptr)
|
2017-06-06 23:24:18 +02:00
|
|
|
|
{
|
|
|
|
|
log_warning("Invalid ride for track placement, rideIndex = %d", rideIndex);
|
|
|
|
|
return MONEY32_UNDEFINED;
|
|
|
|
|
}
|
2017-10-17 13:55:53 +02:00
|
|
|
|
if (ride->type == RIDE_TYPE_NULL)
|
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
|
log_warning("Invalid ride type, rideIndex = %d", rideIndex);
|
|
|
|
|
return MONEY32_UNDEFINED;
|
|
|
|
|
}
|
2018-06-22 23:14:18 +02:00
|
|
|
|
rct_ride_entry* rideEntry = get_ride_entry(ride->subtype);
|
2017-10-17 13:55:53 +02:00
|
|
|
|
if (rideEntry == nullptr)
|
2017-06-06 23:24:18 +02:00
|
|
|
|
{
|
|
|
|
|
log_warning("Invalid ride type for track placement, rideIndex = %d", rideIndex);
|
|
|
|
|
return MONEY32_UNDEFINED;
|
|
|
|
|
}
|
2018-06-22 23:14:18 +02:00
|
|
|
|
rct_tile_element* tileElement;
|
2017-06-06 23:24:18 +02:00
|
|
|
|
|
|
|
|
|
gCommandExpenditureType = RCT_EXPENDITURE_TYPE_RIDE_CONSTRUCTION;
|
|
|
|
|
gCommandPosition.x = originX + 16;
|
|
|
|
|
gCommandPosition.y = originY + 16;
|
|
|
|
|
gCommandPosition.z = originZ;
|
2018-06-20 17:28:51 +02:00
|
|
|
|
int16_t trackpieceZ = originZ;
|
2017-06-06 23:24:18 +02:00
|
|
|
|
direction &= 3;
|
2018-06-22 23:14:18 +02:00
|
|
|
|
gTrackGroundFlags = 0;
|
2017-06-06 23:24:18 +02:00
|
|
|
|
|
2018-06-22 23:14:18 +02:00
|
|
|
|
uint32_t rideTypeFlags = RideProperties[ride->type].flags;
|
2017-06-06 23:24:18 +02:00
|
|
|
|
|
2017-10-17 13:55:53 +02:00
|
|
|
|
if ((ride->lifecycle_flags & RIDE_LIFECYCLE_INDESTRUCTIBLE_TRACK) && type == TRACK_ELEM_END_STATION)
|
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
|
gGameCommandErrorText = STR_NOT_ALLOWED_TO_MODIFY_STATION;
|
|
|
|
|
return MONEY32_UNDEFINED;
|
|
|
|
|
}
|
|
|
|
|
|
2017-10-17 13:55:53 +02:00
|
|
|
|
if (!(flags & GAME_COMMAND_FLAG_ALLOW_DURING_PAUSED))
|
|
|
|
|
{
|
|
|
|
|
if (game_is_paused() && !gCheatsBuildInPauseMode)
|
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
|
gGameCommandErrorText = STR_CONSTRUCTION_NOT_POSSIBLE_WHILE_GAME_IS_PAUSED;
|
|
|
|
|
return MONEY32_UNDEFINED;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2018-06-22 23:14:18 +02:00
|
|
|
|
const uint8_t(*wallEdges)[16];
|
2017-10-17 13:55:53 +02:00
|
|
|
|
if (rideTypeFlags & RIDE_TYPE_FLAG_FLAT_RIDE)
|
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
|
wallEdges = &FlatRideTrackSequenceElementAllowedWallEdges[type];
|
2017-10-17 13:55:53 +02:00
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
if (type == TRACK_ELEM_ON_RIDE_PHOTO)
|
|
|
|
|
{
|
|
|
|
|
if (ride->lifecycle_flags & RIDE_LIFECYCLE_ON_RIDE_PHOTO)
|
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
|
gGameCommandErrorText = STR_ONLY_ONE_ON_RIDE_PHOTO_PER_RIDE;
|
|
|
|
|
return MONEY32_UNDEFINED;
|
|
|
|
|
}
|
2017-10-17 13:55:53 +02:00
|
|
|
|
}
|
|
|
|
|
else if (type == TRACK_ELEM_CABLE_LIFT_HILL)
|
|
|
|
|
{
|
|
|
|
|
if (ride->lifecycle_flags & RIDE_LIFECYCLE_CABLE_LIFT_HILL_COMPONENT_USED)
|
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
|
gGameCommandErrorText = STR_ONLY_ONE_CABLE_LIFT_HILL_PER_RIDE;
|
|
|
|
|
return MONEY32_UNDEFINED;
|
|
|
|
|
}
|
|
|
|
|
}
|
2017-06-30 12:01:50 +02:00
|
|
|
|
// Backwards steep lift hills are allowed, even on roller coasters that do not support forwards steep lift hills.
|
2018-06-22 23:14:18 +02:00
|
|
|
|
if ((liftHillAndAlternativeState & CONSTRUCTION_LIFT_HILL_SELECTED)
|
|
|
|
|
&& !(RideTypePossibleTrackConfigurations[ride->type] & (1ULL << TRACK_LIFT_HILL_STEEP))
|
|
|
|
|
&& !gCheatsEnableChainLiftOnAllTrack)
|
2017-10-17 13:55:53 +02:00
|
|
|
|
{
|
|
|
|
|
if (TrackFlags[type] & TRACK_ELEM_FLAG_IS_STEEP_UP)
|
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
|
gGameCommandErrorText = STR_TOO_STEEP_FOR_LIFT_HILL;
|
|
|
|
|
return MONEY32_UNDEFINED;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
wallEdges = &TrackSequenceElementAllowedWallEdges[type];
|
|
|
|
|
}
|
|
|
|
|
|
2018-06-22 23:14:18 +02:00
|
|
|
|
money32 cost = 0;
|
|
|
|
|
const rct_preview_track* trackBlock = get_track_def_from_ride(ride, type);
|
|
|
|
|
uint32_t num_elements = 0;
|
2017-06-06 23:24:18 +02:00
|
|
|
|
// First check if any of the track pieces are outside the park
|
2017-10-17 13:55:53 +02:00
|
|
|
|
for (; trackBlock->index != 0xFF; trackBlock++)
|
|
|
|
|
{
|
2018-06-20 17:28:51 +02:00
|
|
|
|
int32_t offsetX = 0;
|
|
|
|
|
int32_t offsetY = 0;
|
2017-06-06 23:24:18 +02:00
|
|
|
|
|
2017-10-17 13:55:53 +02:00
|
|
|
|
switch (direction)
|
|
|
|
|
{
|
2018-06-22 23:14:18 +02:00
|
|
|
|
case 0:
|
|
|
|
|
offsetX = trackBlock->x;
|
|
|
|
|
offsetY = trackBlock->y;
|
|
|
|
|
break;
|
|
|
|
|
case 1:
|
|
|
|
|
offsetX = trackBlock->y;
|
|
|
|
|
offsetY = -trackBlock->x;
|
|
|
|
|
break;
|
|
|
|
|
case 2:
|
|
|
|
|
offsetX = -trackBlock->x;
|
|
|
|
|
offsetY = -trackBlock->y;
|
|
|
|
|
break;
|
|
|
|
|
case 3:
|
|
|
|
|
offsetX = -trackBlock->y;
|
|
|
|
|
offsetY = trackBlock->x;
|
|
|
|
|
break;
|
2017-06-06 23:24:18 +02:00
|
|
|
|
}
|
|
|
|
|
|
2018-06-20 17:28:51 +02:00
|
|
|
|
int32_t x = originX + offsetX;
|
|
|
|
|
int32_t y = originY + offsetY;
|
|
|
|
|
int32_t z = originZ + trackBlock->z;
|
2017-06-06 23:24:18 +02:00
|
|
|
|
|
2017-10-17 13:55:53 +02:00
|
|
|
|
if (!map_is_location_owned(x, y, z) && !gCheatsSandboxMode)
|
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
|
gGameCommandErrorText = STR_LAND_NOT_OWNED_BY_PARK;
|
|
|
|
|
return MONEY32_UNDEFINED;
|
|
|
|
|
}
|
|
|
|
|
num_elements++;
|
|
|
|
|
}
|
|
|
|
|
|
2017-10-17 13:55:53 +02:00
|
|
|
|
if (!map_check_free_elements_and_reorganise(num_elements))
|
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
|
return MONEY32_UNDEFINED;
|
|
|
|
|
}
|
2018-06-22 23:14:18 +02:00
|
|
|
|
const uint16_t* trackFlags = (rideTypeFlags & RIDE_TYPE_FLAG_FLAT_RIDE) ? FlatTrackFlags : TrackFlags;
|
2018-10-23 14:52:51 +02:00
|
|
|
|
if (trackFlags[type] & TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT)
|
|
|
|
|
{
|
|
|
|
|
if ((originZ & 0x0F) != 8)
|
|
|
|
|
{
|
|
|
|
|
gGameCommandErrorText = STR_CONSTRUCTION_ERR_UNKNOWN;
|
|
|
|
|
return MONEY32_UNDEFINED;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
if ((originZ & 0x0F) != 0)
|
|
|
|
|
{
|
|
|
|
|
gGameCommandErrorText = STR_CONSTRUCTION_ERR_UNKNOWN;
|
|
|
|
|
return MONEY32_UNDEFINED;
|
|
|
|
|
}
|
|
|
|
|
}
|
2017-06-06 23:24:18 +02:00
|
|
|
|
|
|
|
|
|
// If that is not the case, then perform the remaining checks
|
|
|
|
|
trackBlock = get_track_def_from_ride(ride, type);
|
|
|
|
|
|
2018-06-20 17:28:51 +02:00
|
|
|
|
for (int32_t blockIndex = 0; trackBlock->index != 0xFF; trackBlock++, blockIndex++)
|
2017-10-17 13:55:53 +02:00
|
|
|
|
{
|
2018-06-20 17:28:51 +02:00
|
|
|
|
int32_t offsetX = 0;
|
|
|
|
|
int32_t offsetY = 0;
|
2018-06-22 23:14:18 +02:00
|
|
|
|
int32_t bl = trackBlock->var_08;
|
2018-06-20 17:28:51 +02:00
|
|
|
|
int32_t bh;
|
2017-10-17 13:55:53 +02:00
|
|
|
|
switch (direction)
|
|
|
|
|
{
|
2018-06-22 23:14:18 +02:00
|
|
|
|
case 0:
|
|
|
|
|
offsetX = trackBlock->x;
|
|
|
|
|
offsetY = trackBlock->y;
|
|
|
|
|
break;
|
|
|
|
|
case 1:
|
|
|
|
|
offsetX = trackBlock->y;
|
|
|
|
|
offsetY = -trackBlock->x;
|
|
|
|
|
bl = rol8(bl, 1);
|
|
|
|
|
bh = bl;
|
|
|
|
|
bh = ror8(bh, 4);
|
|
|
|
|
bl &= 0xEE;
|
|
|
|
|
bh &= 0x11;
|
|
|
|
|
bl |= bh;
|
|
|
|
|
break;
|
|
|
|
|
case 2:
|
|
|
|
|
offsetX = -trackBlock->x;
|
|
|
|
|
offsetY = -trackBlock->y;
|
|
|
|
|
bl = rol8(bl, 2);
|
|
|
|
|
bh = bl;
|
|
|
|
|
bh = ror8(bh, 4);
|
|
|
|
|
bl &= 0xCC;
|
|
|
|
|
bh &= 0x33;
|
|
|
|
|
bl |= bh;
|
|
|
|
|
break;
|
|
|
|
|
case 3:
|
|
|
|
|
offsetX = -trackBlock->y;
|
|
|
|
|
offsetY = trackBlock->x;
|
|
|
|
|
bl = rol8(bl, 3);
|
|
|
|
|
bh = bl;
|
|
|
|
|
bh = ror8(bh, 4);
|
|
|
|
|
bl &= 0x88;
|
|
|
|
|
bh &= 0x77;
|
|
|
|
|
bl |= bh;
|
|
|
|
|
break;
|
2017-06-06 23:24:18 +02:00
|
|
|
|
}
|
2018-06-20 17:28:51 +02:00
|
|
|
|
int32_t x = originX + offsetX;
|
|
|
|
|
int32_t y = originY + offsetY;
|
|
|
|
|
int32_t z = originZ + trackBlock->z;
|
2018-10-23 14:52:51 +02:00
|
|
|
|
|
2017-06-06 23:24:18 +02:00
|
|
|
|
trackpieceZ = z;
|
|
|
|
|
|
2017-10-17 13:55:53 +02:00
|
|
|
|
if (z < 16)
|
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
|
gGameCommandErrorText = STR_TOO_LOW;
|
|
|
|
|
return MONEY32_UNDEFINED;
|
|
|
|
|
}
|
|
|
|
|
|
2018-06-20 17:28:51 +02:00
|
|
|
|
int32_t baseZ = (originZ + trackBlock->z) / 8;
|
2017-06-06 23:24:18 +02:00
|
|
|
|
|
2018-06-20 17:28:51 +02:00
|
|
|
|
int32_t clearanceZ = trackBlock->var_07;
|
2017-10-17 13:55:53 +02:00
|
|
|
|
if (trackBlock->var_09 & (1 << 2) && RideData5[ride->type].clearance_height > 24)
|
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
|
clearanceZ += 24;
|
|
|
|
|
}
|
2017-10-17 13:55:53 +02:00
|
|
|
|
else
|
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
|
clearanceZ += RideData5[ride->type].clearance_height;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
clearanceZ = (clearanceZ / 8) + baseZ;
|
|
|
|
|
|
2017-10-17 13:55:53 +02:00
|
|
|
|
if (clearanceZ >= 255)
|
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
|
gGameCommandErrorText = STR_TOO_HIGH;
|
|
|
|
|
return MONEY32_UNDEFINED;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_currentTrackEndX = x;
|
|
|
|
|
_currentTrackEndY = y;
|
|
|
|
|
|
2017-10-17 13:55:53 +02:00
|
|
|
|
if (!gCheatsDisableClearanceChecks || flags & GAME_COMMAND_FLAG_GHOST)
|
|
|
|
|
{
|
2018-06-22 23:14:18 +02:00
|
|
|
|
uint8_t crossingMode = (ride->type == RIDE_TYPE_MINIATURE_RAILWAY && type == TRACK_ELEM_FLAT)
|
|
|
|
|
? CREATE_CROSSING_MODE_TRACK_OVER_PATH
|
|
|
|
|
: CREATE_CROSSING_MODE_NONE;
|
|
|
|
|
if (!map_can_construct_with_clear_at(
|
|
|
|
|
x, y, baseZ, clearanceZ, &map_place_non_scenery_clear_func, bl, flags, &cost, crossingMode))
|
2017-06-06 23:24:18 +02:00
|
|
|
|
return MONEY32_UNDEFINED;
|
|
|
|
|
}
|
|
|
|
|
|
2018-06-22 23:14:18 +02:00
|
|
|
|
// 6c53dc
|
2017-06-06 23:24:18 +02:00
|
|
|
|
|
2017-10-17 13:55:53 +02:00
|
|
|
|
if ((flags & GAME_COMMAND_FLAG_APPLY) && !(flags & GAME_COMMAND_FLAG_GHOST) && !gCheatsDisableClearanceChecks)
|
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
|
footpath_remove_litter(x, y, z);
|
2017-10-17 13:55:53 +02:00
|
|
|
|
if (rideTypeFlags & RIDE_TYPE_FLAG_TRACK_NO_WALLS)
|
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
|
wall_remove_at(x, y, baseZ * 8, clearanceZ * 8);
|
2017-10-17 13:55:53 +02:00
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
|
// Remove walls in the directions this track intersects
|
2018-06-20 17:28:51 +02:00
|
|
|
|
uint8_t intersectingDirections = (*wallEdges)[blockIndex];
|
2017-06-06 23:24:18 +02:00
|
|
|
|
intersectingDirections ^= 0x0F;
|
2018-06-20 17:28:51 +02:00
|
|
|
|
for (int32_t i = 0; i < 4; i++)
|
2017-10-17 13:55:53 +02:00
|
|
|
|
{
|
|
|
|
|
if (intersectingDirections & (1 << i))
|
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
|
wall_remove_intersecting_walls(x, y, baseZ, clearanceZ, i);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bh = gMapGroundFlags & (ELEMENT_IS_ABOVE_GROUND | ELEMENT_IS_UNDERGROUND);
|
2017-10-17 13:55:53 +02:00
|
|
|
|
if (gTrackGroundFlags != 0 && (gTrackGroundFlags & bh) == 0)
|
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
|
gGameCommandErrorText = STR_CANT_BUILD_PARTLY_ABOVE_AND_PARTLY_BELOW_GROUND;
|
|
|
|
|
return MONEY32_UNDEFINED;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
gTrackGroundFlags = bh;
|
2017-10-17 13:55:53 +02:00
|
|
|
|
if (rideTypeFlags & RIDE_TYPE_FLAG_FLAT_RIDE)
|
|
|
|
|
{
|
|
|
|
|
if (FlatTrackFlags[type] & TRACK_ELEM_FLAG_ONLY_ABOVE_GROUND)
|
|
|
|
|
{
|
|
|
|
|
if (gTrackGroundFlags & TRACK_ELEMENT_LOCATION_IS_UNDERGROUND)
|
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
|
gGameCommandErrorText = STR_CAN_ONLY_BUILD_THIS_ABOVE_GROUND;
|
|
|
|
|
return MONEY32_UNDEFINED;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2017-10-17 13:55:53 +02:00
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
if (TrackFlags[type] & TRACK_ELEM_FLAG_ONLY_ABOVE_GROUND)
|
|
|
|
|
{
|
|
|
|
|
if (gTrackGroundFlags & TRACK_ELEMENT_LOCATION_IS_UNDERGROUND)
|
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
|
gGameCommandErrorText = STR_CAN_ONLY_BUILD_THIS_ABOVE_GROUND;
|
|
|
|
|
return MONEY32_UNDEFINED;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2017-10-17 13:55:53 +02:00
|
|
|
|
if (rideTypeFlags & RIDE_TYPE_FLAG_FLAT_RIDE)
|
|
|
|
|
{
|
|
|
|
|
if (FlatTrackFlags[type] & TRACK_ELEM_FLAG_ONLY_UNDERWATER)
|
|
|
|
|
{
|
|
|
|
|
if (!(gMapGroundFlags & ELEMENT_IS_UNDERWATER))
|
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
|
gGameCommandErrorText = STR_CAN_ONLY_BUILD_THIS_UNDERWATER;
|
|
|
|
|
return MONEY32_UNDEFINED;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2017-10-17 13:55:53 +02:00
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
if (TrackFlags[type] & TRACK_ELEM_FLAG_ONLY_UNDERWATER)
|
|
|
|
|
{ // No element has this flag
|
|
|
|
|
if (gMapGroundFlags & ELEMENT_IS_UNDERWATER)
|
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
|
gGameCommandErrorText = STR_CAN_ONLY_BUILD_THIS_UNDERWATER;
|
|
|
|
|
return MONEY32_UNDEFINED;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2017-12-21 17:02:09 +01:00
|
|
|
|
if (gMapGroundFlags & ELEMENT_IS_UNDERWATER && !gCheatsDisableClearanceChecks)
|
2017-10-17 13:55:53 +02:00
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
|
gGameCommandErrorText = STR_RIDE_CANT_BUILD_THIS_UNDERWATER;
|
|
|
|
|
return MONEY32_UNDEFINED;
|
|
|
|
|
}
|
|
|
|
|
|
2017-10-17 13:55:53 +02:00
|
|
|
|
if ((rideTypeFlags & RIDE_TYPE_FLAG_TRACK_MUST_BE_ON_WATER) && !byte_9D8150)
|
|
|
|
|
{
|
2018-06-22 23:14:18 +02:00
|
|
|
|
tileElement = map_get_surface_element_at({ x, y });
|
2017-06-06 23:24:18 +02:00
|
|
|
|
|
2018-09-15 10:56:35 +02:00
|
|
|
|
uint8_t water_height = tileElement->AsSurface()->GetWaterHeight() * 2;
|
2017-10-17 13:55:53 +02:00
|
|
|
|
if (water_height == 0)
|
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
|
gGameCommandErrorText = STR_CAN_ONLY_BUILD_THIS_ON_WATER;
|
|
|
|
|
return MONEY32_UNDEFINED;
|
|
|
|
|
}
|
|
|
|
|
|
2017-10-17 13:55:53 +02:00
|
|
|
|
if (water_height != baseZ)
|
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
|
gGameCommandErrorText = STR_CAN_ONLY_BUILD_THIS_ON_WATER;
|
|
|
|
|
return MONEY32_UNDEFINED;
|
|
|
|
|
}
|
|
|
|
|
water_height -= 2;
|
2017-10-31 14:03:45 +01:00
|
|
|
|
if (water_height == tileElement->base_height)
|
2017-10-17 13:55:53 +02:00
|
|
|
|
{
|
2018-09-14 14:54:12 +02:00
|
|
|
|
bh = tileElement->AsSurface()->GetSlope() & TILE_ELEMENT_SLOPE_ALL_CORNERS_UP;
|
2018-06-22 23:14:18 +02:00
|
|
|
|
if (bh == TILE_ELEMENT_SLOPE_W_CORNER_DN || bh == TILE_ELEMENT_SLOPE_S_CORNER_DN
|
|
|
|
|
|| bh == TILE_ELEMENT_SLOPE_E_CORNER_DN || bh == TILE_ELEMENT_SLOPE_N_CORNER_DN)
|
2017-10-17 13:55:53 +02:00
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
|
gGameCommandErrorText = STR_CAN_ONLY_BUILD_THIS_ON_WATER;
|
|
|
|
|
return MONEY32_UNDEFINED;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2018-06-20 17:28:51 +02:00
|
|
|
|
int32_t entranceDirections;
|
2017-10-17 13:55:53 +02:00
|
|
|
|
if (ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_FLAT_RIDE))
|
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
|
entranceDirections = FlatRideTrackSequenceProperties[type][0];
|
|
|
|
|
}
|
2017-10-17 13:55:53 +02:00
|
|
|
|
else
|
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
|
entranceDirections = TrackSequenceProperties[type][0];
|
|
|
|
|
}
|
2017-10-17 13:55:53 +02:00
|
|
|
|
if ((entranceDirections & TRACK_SEQUENCE_FLAG_ORIGIN) && trackBlock->index == 0)
|
|
|
|
|
{
|
|
|
|
|
if (!track_add_station_element(x, y, baseZ, direction, rideIndex, 0))
|
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
|
return MONEY32_UNDEFINED;
|
|
|
|
|
}
|
|
|
|
|
}
|
2018-06-22 23:14:18 +02:00
|
|
|
|
// 6c55be
|
2017-10-17 13:55:53 +02:00
|
|
|
|
if (entranceDirections & TRACK_SEQUENCE_FLAG_CONNECTS_TO_PATH)
|
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
|
entranceDirections &= 0x0F;
|
2017-10-17 13:55:53 +02:00
|
|
|
|
if (entranceDirections != 0)
|
|
|
|
|
{
|
2018-06-22 23:14:18 +02:00
|
|
|
|
if (!(flags & GAME_COMMAND_FLAG_APPLY) && !(flags & GAME_COMMAND_FLAG_GHOST) && !gCheatsDisableClearanceChecks)
|
2017-10-17 13:55:53 +02:00
|
|
|
|
{
|
2018-06-20 17:28:51 +02:00
|
|
|
|
uint8_t _bl = entranceDirections;
|
|
|
|
|
for (int32_t dl = bitscanforward(_bl); dl != -1; dl = bitscanforward(_bl))
|
2017-10-17 13:55:53 +02:00
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
|
_bl &= ~(1 << dl);
|
2018-06-22 23:14:18 +02:00
|
|
|
|
int32_t temp_x = x, temp_y = y;
|
2018-06-20 17:28:51 +02:00
|
|
|
|
int32_t temp_direction = (direction + dl) & 3;
|
2018-04-18 20:34:34 +02:00
|
|
|
|
temp_x += CoordsDirectionDelta[temp_direction].x;
|
|
|
|
|
temp_y += CoordsDirectionDelta[temp_direction].y;
|
2017-06-06 23:24:18 +02:00
|
|
|
|
temp_direction ^= (1 << 1);
|
|
|
|
|
wall_remove_intersecting_walls(temp_x, temp_y, baseZ, clearanceZ, temp_direction & 3);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2018-06-22 23:14:18 +02:00
|
|
|
|
// 6c5648 12 push
|
|
|
|
|
tileElement = map_get_surface_element_at({ x, y });
|
2017-10-17 13:55:53 +02:00
|
|
|
|
if (!gCheatsDisableSupportLimits)
|
|
|
|
|
{
|
2018-06-20 17:28:51 +02:00
|
|
|
|
int32_t ride_height = clearanceZ - tileElement->base_height;
|
2017-10-17 13:55:53 +02:00
|
|
|
|
if (ride_height >= 0)
|
|
|
|
|
{
|
2018-06-20 17:28:51 +02:00
|
|
|
|
uint16_t maxHeight;
|
2017-12-07 16:12:37 +01:00
|
|
|
|
|
|
|
|
|
if (RideGroupManager::RideTypeIsIndependent(ride->type) && rideEntry->max_height != 0)
|
2017-10-17 13:55:53 +02:00
|
|
|
|
{
|
2017-12-07 16:12:37 +01:00
|
|
|
|
maxHeight = rideEntry->max_height;
|
|
|
|
|
}
|
|
|
|
|
else if (RideGroupManager::RideTypeHasRideGroups(ride->type))
|
|
|
|
|
{
|
2018-06-22 23:14:18 +02:00
|
|
|
|
const RideGroup* rideGroup = RideGroupManager::GetRideGroup(ride->type, rideEntry);
|
2017-12-07 16:12:37 +01:00
|
|
|
|
maxHeight = rideGroup->MaximumHeight;
|
2017-10-17 13:55:53 +02:00
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2017-12-07 16:12:37 +01:00
|
|
|
|
maxHeight = RideData5[ride->type].max_height;
|
2017-06-06 23:24:18 +02:00
|
|
|
|
}
|
2017-06-14 13:31:27 +02:00
|
|
|
|
|
2017-06-06 23:24:18 +02:00
|
|
|
|
ride_height /= 2;
|
2017-10-17 13:55:53 +02:00
|
|
|
|
if (ride_height > maxHeight && !byte_9D8150)
|
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
|
gGameCommandErrorText = STR_TOO_HIGH_FOR_SUPPORTS;
|
|
|
|
|
return MONEY32_UNDEFINED;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2018-06-20 17:28:51 +02:00
|
|
|
|
int32_t _support_height = baseZ - tileElement->base_height;
|
2017-10-17 13:55:53 +02:00
|
|
|
|
if (_support_height < 0)
|
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
|
_support_height = 10;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
cost += ((_support_height / 2) * RideTrackCosts[ride->type].support_price) * 5;
|
|
|
|
|
|
2018-06-22 23:14:18 +02:00
|
|
|
|
// 6c56d3
|
2017-06-06 23:24:18 +02:00
|
|
|
|
|
|
|
|
|
if (!(flags & GAME_COMMAND_FLAG_APPLY))
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
invalidate_test_results(rideIndex);
|
2017-10-17 13:55:53 +02:00
|
|
|
|
switch (type)
|
|
|
|
|
{
|
2018-06-22 23:14:18 +02:00
|
|
|
|
case TRACK_ELEM_ON_RIDE_PHOTO:
|
|
|
|
|
ride->lifecycle_flags |= RIDE_LIFECYCLE_ON_RIDE_PHOTO;
|
2017-06-06 23:24:18 +02:00
|
|
|
|
break;
|
2018-06-22 23:14:18 +02:00
|
|
|
|
case TRACK_ELEM_CABLE_LIFT_HILL:
|
|
|
|
|
if (trackBlock->index != 0)
|
|
|
|
|
break;
|
|
|
|
|
ride->lifecycle_flags |= RIDE_LIFECYCLE_CABLE_LIFT_HILL_COMPONENT_USED;
|
|
|
|
|
ride->cable_lift_x = x;
|
|
|
|
|
ride->cable_lift_y = y;
|
|
|
|
|
ride->cable_lift_z = baseZ;
|
|
|
|
|
break;
|
|
|
|
|
case TRACK_ELEM_BLOCK_BRAKES:
|
|
|
|
|
ride->num_block_brakes++;
|
|
|
|
|
ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_OPERATING;
|
2017-10-17 13:55:53 +02:00
|
|
|
|
|
2018-06-22 23:14:18 +02:00
|
|
|
|
ride->mode = RIDE_MODE_CONTINUOUS_CIRCUIT_BLOCK_SECTIONED;
|
|
|
|
|
if (ride->type == RIDE_TYPE_LIM_LAUNCHED_ROLLER_COASTER)
|
|
|
|
|
ride->mode = RIDE_MODE_POWERED_LAUNCH_BLOCK_SECTIONED;
|
2017-10-17 13:55:53 +02:00
|
|
|
|
|
2018-06-22 23:14:18 +02:00
|
|
|
|
break;
|
2017-06-06 23:24:18 +02:00
|
|
|
|
}
|
|
|
|
|
|
2017-10-17 13:55:53 +02:00
|
|
|
|
if (trackBlock->index == 0)
|
|
|
|
|
{
|
|
|
|
|
switch (type)
|
|
|
|
|
{
|
2018-06-22 23:14:18 +02:00
|
|
|
|
case TRACK_ELEM_25_DEG_UP_TO_FLAT:
|
|
|
|
|
case TRACK_ELEM_60_DEG_UP_TO_FLAT:
|
|
|
|
|
case TRACK_ELEM_DIAG_25_DEG_UP_TO_FLAT:
|
|
|
|
|
case TRACK_ELEM_DIAG_60_DEG_UP_TO_FLAT:
|
|
|
|
|
if (!(liftHillAndAlternativeState & CONSTRUCTION_LIFT_HILL_SELECTED))
|
|
|
|
|
break;
|
|
|
|
|
// Fall Through
|
|
|
|
|
case TRACK_ELEM_CABLE_LIFT_HILL:
|
|
|
|
|
ride->num_block_brakes++;
|
2017-06-06 23:24:18 +02:00
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
entranceDirections = 0;
|
2017-10-17 13:55:53 +02:00
|
|
|
|
if (ride->overall_view.xy != RCT_XY8_UNDEFINED)
|
|
|
|
|
{
|
|
|
|
|
if (!(flags & GAME_COMMAND_FLAG_5))
|
|
|
|
|
{
|
|
|
|
|
if (ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_FLAT_RIDE))
|
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
|
entranceDirections = FlatRideTrackSequenceProperties[type][0];
|
|
|
|
|
}
|
2017-10-17 13:55:53 +02:00
|
|
|
|
else
|
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
|
entranceDirections = TrackSequenceProperties[type][0];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2017-10-17 13:55:53 +02:00
|
|
|
|
if (entranceDirections & TRACK_SEQUENCE_FLAG_ORIGIN || ride->overall_view.xy == RCT_XY8_UNDEFINED)
|
|
|
|
|
{
|
2017-07-18 12:22:39 +02:00
|
|
|
|
ride->overall_view.x = x / 32;
|
|
|
|
|
ride->overall_view.y = y / 32;
|
2017-06-06 23:24:18 +02:00
|
|
|
|
}
|
|
|
|
|
|
2017-10-31 14:03:45 +01:00
|
|
|
|
tileElement = tile_element_insert(x / 32, y / 32, baseZ, bl & 0xF);
|
|
|
|
|
assert(tileElement != nullptr);
|
|
|
|
|
tileElement->clearance_height = clearanceZ;
|
2018-10-03 11:39:33 +02:00
|
|
|
|
tileElement->SetType(TILE_ELEMENT_TYPE_TRACK);
|
|
|
|
|
tileElement->SetDirection(direction);
|
2017-10-17 13:55:53 +02:00
|
|
|
|
if (liftHillAndAlternativeState & CONSTRUCTION_LIFT_HILL_SELECTED)
|
|
|
|
|
{
|
2018-10-03 11:39:33 +02:00
|
|
|
|
tileElement->AsTrack()->SetHasChain(true);
|
2017-06-06 23:24:18 +02:00
|
|
|
|
}
|
|
|
|
|
|
2018-09-17 22:10:15 +02:00
|
|
|
|
tileElement->AsTrack()->SetSequenceIndex(trackBlock->index);
|
2018-09-18 13:10:29 +02:00
|
|
|
|
tileElement->AsTrack()->SetRideIndex(rideIndex);
|
2018-09-17 21:54:36 +02:00
|
|
|
|
tileElement->AsTrack()->SetTrackType(type);
|
2017-11-16 17:32:26 +01:00
|
|
|
|
|
2017-10-04 17:14:53 +02:00
|
|
|
|
if (flags & GAME_COMMAND_FLAG_GHOST)
|
|
|
|
|
{
|
2017-10-31 14:03:45 +01:00
|
|
|
|
tileElement->flags |= TILE_ELEMENT_FLAG_GHOST;
|
2017-06-06 23:24:18 +02:00
|
|
|
|
}
|
|
|
|
|
|
2017-10-17 13:55:53 +02:00
|
|
|
|
switch (type)
|
|
|
|
|
{
|
2018-06-22 23:14:18 +02:00
|
|
|
|
case TRACK_ELEM_WATERFALL:
|
|
|
|
|
map_animation_create(MAP_ANIMATION_TYPE_TRACK_WATERFALL, x, y, tileElement->base_height);
|
|
|
|
|
break;
|
|
|
|
|
case TRACK_ELEM_RAPIDS:
|
|
|
|
|
map_animation_create(MAP_ANIMATION_TYPE_TRACK_RAPIDS, x, y, tileElement->base_height);
|
|
|
|
|
break;
|
|
|
|
|
case TRACK_ELEM_WHIRLPOOL:
|
|
|
|
|
map_animation_create(MAP_ANIMATION_TYPE_TRACK_WHIRLPOOL, x, y, tileElement->base_height);
|
|
|
|
|
break;
|
|
|
|
|
case TRACK_ELEM_SPINNING_TUNNEL:
|
|
|
|
|
map_animation_create(MAP_ANIMATION_TYPE_TRACK_SPINNINGTUNNEL, x, y, tileElement->base_height);
|
|
|
|
|
break;
|
2017-06-06 23:24:18 +02:00
|
|
|
|
}
|
2017-10-04 17:14:53 +02:00
|
|
|
|
if (track_element_has_speed_setting(type))
|
|
|
|
|
{
|
2018-09-18 13:37:44 +02:00
|
|
|
|
tileElement->AsTrack()->SetBrakeBoosterSpeed(brakeSpeed);
|
2017-06-06 23:24:18 +02:00
|
|
|
|
}
|
2017-10-04 17:14:53 +02:00
|
|
|
|
else
|
|
|
|
|
{
|
2018-09-17 22:15:19 +02:00
|
|
|
|
tileElement->AsTrack()->SetSeatRotation(seatRotation);
|
2017-06-06 23:24:18 +02:00
|
|
|
|
}
|
|
|
|
|
|
2017-10-04 17:14:53 +02:00
|
|
|
|
if (liftHillAndAlternativeState & RIDE_TYPE_ALTERNATIVE_TRACK_TYPE)
|
|
|
|
|
{
|
2018-09-18 13:30:00 +02:00
|
|
|
|
tileElement->AsTrack()->SetInverted(true);
|
2017-06-06 23:24:18 +02:00
|
|
|
|
}
|
2018-09-18 13:14:30 +02:00
|
|
|
|
tileElement->AsTrack()->SetColourScheme(colour);
|
2017-06-06 23:24:18 +02:00
|
|
|
|
|
2017-10-17 13:55:53 +02:00
|
|
|
|
if (ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_FLAT_RIDE))
|
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
|
entranceDirections = FlatRideTrackSequenceProperties[type][0];
|
|
|
|
|
}
|
2017-10-17 13:55:53 +02:00
|
|
|
|
else
|
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
|
entranceDirections = TrackSequenceProperties[type][0];
|
|
|
|
|
}
|
|
|
|
|
|
2017-10-17 13:55:53 +02:00
|
|
|
|
if (entranceDirections & TRACK_SEQUENCE_FLAG_ORIGIN)
|
|
|
|
|
{
|
|
|
|
|
if (trackBlock->index == 0)
|
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
|
track_add_station_element(x, y, baseZ, direction, rideIndex, GAME_COMMAND_FLAG_APPLY);
|
|
|
|
|
}
|
|
|
|
|
sub_6CB945(rideIndex);
|
|
|
|
|
ride_update_max_vehicles(rideIndex);
|
|
|
|
|
}
|
|
|
|
|
|
2017-10-17 13:55:53 +02:00
|
|
|
|
if (rideTypeFlags & RIDE_TYPE_FLAG_TRACK_MUST_BE_ON_WATER)
|
|
|
|
|
{
|
2018-06-22 23:14:18 +02:00
|
|
|
|
rct_tile_element* surfaceElement = map_get_surface_element_at({ x, y });
|
2018-10-03 11:39:33 +02:00
|
|
|
|
surfaceElement->AsSurface()->SetHasTrackThatNeedsWater(true);
|
2017-10-31 14:03:45 +01:00
|
|
|
|
tileElement = surfaceElement;
|
2017-06-06 23:24:18 +02:00
|
|
|
|
}
|
|
|
|
|
|
2017-10-17 13:55:53 +02:00
|
|
|
|
if (!gCheatsDisableClearanceChecks || !(flags & GAME_COMMAND_FLAG_GHOST))
|
|
|
|
|
{
|
2017-10-31 14:03:45 +01:00
|
|
|
|
footpath_connect_edges(x, y, tileElement, flags);
|
2017-06-06 23:24:18 +02:00
|
|
|
|
}
|
|
|
|
|
map_invalidate_tile_full(x, y);
|
|
|
|
|
}
|
|
|
|
|
|
2017-10-17 13:55:53 +02:00
|
|
|
|
if (gGameCommandNestLevel == 1)
|
|
|
|
|
{
|
2017-10-13 22:23:07 +02:00
|
|
|
|
LocationXYZ16 coord;
|
2017-06-06 23:24:18 +02:00
|
|
|
|
coord.x = originX + 16;
|
|
|
|
|
coord.y = originY + 16;
|
|
|
|
|
coord.z = trackpieceZ;
|
|
|
|
|
network_set_player_last_action_coord(network_get_player_index(game_command_playerid), coord);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
money32 price = RideTrackCosts[ride->type].track_price;
|
2018-06-22 23:14:18 +02:00
|
|
|
|
price *= (rideTypeFlags & RIDE_TYPE_FLAG_FLAT_RIDE) ? FlatRideTrackPricing[type] : TrackPricing[type];
|
2017-06-06 23:24:18 +02:00
|
|
|
|
|
|
|
|
|
price >>= 16;
|
|
|
|
|
price = cost + ((price / 2) * 10);
|
|
|
|
|
|
2017-10-17 13:55:53 +02:00
|
|
|
|
if (gParkFlags & PARK_FLAGS_NO_MONEY)
|
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
|
return 0;
|
|
|
|
|
}
|
2017-10-17 13:55:53 +02:00
|
|
|
|
else
|
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
|
return price;
|
|
|
|
|
}
|
2015-07-02 21:07:44 +02:00
|
|
|
|
}
|
2015-09-12 00:16:05 +02:00
|
|
|
|
|
2015-06-27 18:53:28 +02:00
|
|
|
|
/**
|
|
|
|
|
*
|
|
|
|
|
* rct2: 0x006C511D
|
|
|
|
|
*/
|
2018-04-20 13:56:37 +02:00
|
|
|
|
void game_command_place_track(
|
2018-07-21 13:51:54 +02:00
|
|
|
|
int32_t* eax, int32_t* ebx, int32_t* ecx, int32_t* edx, [[maybe_unused]] int32_t* esi, int32_t* edi,
|
2018-06-22 23:14:18 +02:00
|
|
|
|
[[maybe_unused]] int32_t* ebp)
|
2015-06-27 18:53:28 +02:00
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
|
*ebx = track_place(
|
2018-07-21 13:51:54 +02:00
|
|
|
|
*edx & 0xFF, (*edx >> 8) & 0xFF, (int16_t)(*eax & 0xFFFF), (int16_t)(*ecx & 0xFFFF), (int16_t)(*edi & 0xFFFF),
|
|
|
|
|
(*ebx >> 8) & 0xFF, (*edi >> 16) & 0xFF, (*edi >> 24) & 0x0F, (*edi >> 28) & 0x0F, (*edx >> 16), *ebx & 0xFF);
|
2015-06-27 18:53:28 +02:00
|
|
|
|
}
|
|
|
|
|
|
2018-06-22 23:14:18 +02:00
|
|
|
|
static money32 track_remove(
|
|
|
|
|
uint8_t type, uint8_t sequence, int16_t originX, int16_t originY, int16_t originZ, uint8_t rotation, uint8_t flags)
|
2017-10-17 13:55:53 +02:00
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
|
gCommandExpenditureType = RCT_EXPENDITURE_TYPE_RIDE_CONSTRUCTION;
|
|
|
|
|
gCommandPosition.x = originX + 16;
|
|
|
|
|
gCommandPosition.y = originY + 16;
|
|
|
|
|
gCommandPosition.z = originZ;
|
2018-06-20 17:28:51 +02:00
|
|
|
|
int16_t trackpieceZ = originZ;
|
2017-06-06 23:24:18 +02:00
|
|
|
|
|
2017-10-17 13:55:53 +02:00
|
|
|
|
switch (type)
|
|
|
|
|
{
|
2018-06-22 23:14:18 +02:00
|
|
|
|
case TRACK_ELEM_BEGIN_STATION:
|
|
|
|
|
case TRACK_ELEM_MIDDLE_STATION:
|
|
|
|
|
type = TRACK_ELEM_END_STATION;
|
|
|
|
|
break;
|
2017-06-06 23:24:18 +02:00
|
|
|
|
}
|
|
|
|
|
|
2017-10-17 13:55:53 +02:00
|
|
|
|
if (!(flags & (1 << 3)) && game_is_paused() && !gCheatsBuildInPauseMode)
|
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
|
gGameCommandErrorText = STR_CONSTRUCTION_NOT_POSSIBLE_WHILE_GAME_IS_PAUSED;
|
|
|
|
|
return MONEY32_UNDEFINED;
|
|
|
|
|
}
|
|
|
|
|
|
2018-05-31 22:36:45 +02:00
|
|
|
|
bool found = false;
|
|
|
|
|
bool isGhost = flags & GAME_COMMAND_FLAG_GHOST;
|
2018-06-22 23:14:18 +02:00
|
|
|
|
rct_tile_element* tileElement = map_get_first_element_at(originX / 32, originY / 32);
|
2017-10-31 14:03:45 +01:00
|
|
|
|
if (tileElement == nullptr)
|
2017-06-06 23:24:18 +02:00
|
|
|
|
{
|
|
|
|
|
log_warning("Invalid coordinates for track removal. x = %d, y = %d", originX, originY);
|
|
|
|
|
return MONEY32_UNDEFINED;
|
|
|
|
|
}
|
2017-10-17 13:55:53 +02:00
|
|
|
|
do
|
|
|
|
|
{
|
2017-10-31 14:03:45 +01:00
|
|
|
|
if (tileElement->base_height * 8 != originZ)
|
2017-06-06 23:24:18 +02:00
|
|
|
|
continue;
|
|
|
|
|
|
2018-05-02 19:27:04 +02:00
|
|
|
|
if (tileElement->GetType() != TILE_ELEMENT_TYPE_TRACK)
|
2017-06-06 23:24:18 +02:00
|
|
|
|
continue;
|
|
|
|
|
|
2018-09-14 11:14:19 +02:00
|
|
|
|
if ((tileElement->GetDirection()) != rotation)
|
2017-06-06 23:24:18 +02:00
|
|
|
|
continue;
|
|
|
|
|
|
2018-09-17 22:10:15 +02:00
|
|
|
|
if (tileElement->AsTrack()->GetSequenceIndex() != sequence)
|
2017-06-06 23:24:18 +02:00
|
|
|
|
continue;
|
|
|
|
|
|
2018-05-31 22:36:45 +02:00
|
|
|
|
if (tileElement->IsGhost() != isGhost)
|
|
|
|
|
continue;
|
2017-06-06 23:24:18 +02:00
|
|
|
|
|
2018-09-17 21:54:36 +02:00
|
|
|
|
uint8_t track_type = tileElement->AsTrack()->GetTrackType();
|
2017-10-17 13:55:53 +02:00
|
|
|
|
switch (track_type)
|
|
|
|
|
{
|
2018-06-22 23:14:18 +02:00
|
|
|
|
case TRACK_ELEM_BEGIN_STATION:
|
|
|
|
|
case TRACK_ELEM_MIDDLE_STATION:
|
|
|
|
|
track_type = TRACK_ELEM_END_STATION;
|
|
|
|
|
break;
|
2017-06-06 23:24:18 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (track_type != type)
|
|
|
|
|
continue;
|
|
|
|
|
|
2018-05-31 22:36:45 +02:00
|
|
|
|
found = true;
|
2017-06-06 23:24:18 +02:00
|
|
|
|
break;
|
2018-06-22 23:14:18 +02:00
|
|
|
|
} while (!(tileElement++)->IsLastForTile());
|
2017-06-06 23:24:18 +02:00
|
|
|
|
|
2017-10-17 13:55:53 +02:00
|
|
|
|
if (!found)
|
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
|
return MONEY32_UNDEFINED;
|
|
|
|
|
}
|
|
|
|
|
|
2017-10-31 14:03:45 +01:00
|
|
|
|
if (tileElement->flags & TILE_ELEMENT_FLAG_INDESTRUCTIBLE_TRACK_PIECE)
|
2017-10-17 13:55:53 +02:00
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
|
gGameCommandErrorText = STR_YOU_ARE_NOT_ALLOWED_TO_REMOVE_THIS_SECTION;
|
|
|
|
|
return MONEY32_UNDEFINED;
|
|
|
|
|
}
|
|
|
|
|
|
2018-09-18 13:10:29 +02:00
|
|
|
|
uint8_t rideIndex = tileElement->AsTrack()->GetRideIndex();
|
2018-09-17 21:54:36 +02:00
|
|
|
|
type = tileElement->AsTrack()->GetTrackType();
|
2018-09-18 13:01:09 +02:00
|
|
|
|
bool isLiftHill = tileElement->AsTrack()->HasChain();
|
2017-06-06 23:24:18 +02:00
|
|
|
|
|
2018-06-22 23:14:18 +02:00
|
|
|
|
Ride* ride = get_ride(rideIndex);
|
|
|
|
|
const rct_preview_track* trackBlock = get_track_def_from_ride(ride, type);
|
2018-09-17 22:10:15 +02:00
|
|
|
|
trackBlock += tileElement->AsTrack()->GetSequenceIndex();
|
2017-06-06 23:24:18 +02:00
|
|
|
|
|
2018-09-14 11:14:19 +02:00
|
|
|
|
uint8_t originDirection = tileElement->GetDirection();
|
2017-10-17 13:55:53 +02:00
|
|
|
|
switch (originDirection)
|
|
|
|
|
{
|
2018-06-22 23:14:18 +02:00
|
|
|
|
case 0:
|
|
|
|
|
originX -= trackBlock->x;
|
|
|
|
|
originY -= trackBlock->y;
|
|
|
|
|
break;
|
|
|
|
|
case 1:
|
|
|
|
|
originX -= trackBlock->y;
|
|
|
|
|
originY += trackBlock->x;
|
|
|
|
|
break;
|
|
|
|
|
case 2:
|
|
|
|
|
originX += trackBlock->x;
|
|
|
|
|
originY += trackBlock->y;
|
|
|
|
|
break;
|
|
|
|
|
case 3:
|
|
|
|
|
originX += trackBlock->y;
|
|
|
|
|
originY -= trackBlock->x;
|
|
|
|
|
break;
|
2017-06-06 23:24:18 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
originZ -= trackBlock->z;
|
|
|
|
|
|
|
|
|
|
money32 cost = 0;
|
|
|
|
|
|
|
|
|
|
trackBlock = get_track_def_from_ride(ride, type);
|
2017-10-17 13:55:53 +02:00
|
|
|
|
for (; trackBlock->index != 255; trackBlock++)
|
|
|
|
|
{
|
2018-06-20 17:28:51 +02:00
|
|
|
|
int16_t x = originX, y = originY, z = originZ;
|
2017-06-06 23:24:18 +02:00
|
|
|
|
|
2017-10-17 13:55:53 +02:00
|
|
|
|
switch (originDirection)
|
|
|
|
|
{
|
2018-06-22 23:14:18 +02:00
|
|
|
|
case 0:
|
|
|
|
|
x += trackBlock->x;
|
|
|
|
|
y += trackBlock->y;
|
|
|
|
|
break;
|
|
|
|
|
case 1:
|
|
|
|
|
x += trackBlock->y;
|
|
|
|
|
y -= trackBlock->x;
|
|
|
|
|
break;
|
|
|
|
|
case 2:
|
|
|
|
|
x -= trackBlock->x;
|
|
|
|
|
y -= trackBlock->y;
|
|
|
|
|
break;
|
|
|
|
|
case 3:
|
|
|
|
|
x -= trackBlock->y;
|
|
|
|
|
y += trackBlock->x;
|
|
|
|
|
break;
|
2017-06-06 23:24:18 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
z += trackBlock->z;
|
|
|
|
|
|
|
|
|
|
map_invalidate_tile_full(x, y);
|
|
|
|
|
|
|
|
|
|
trackpieceZ = z;
|
|
|
|
|
|
2018-05-31 22:36:45 +02:00
|
|
|
|
found = false;
|
2017-10-31 14:03:45 +01:00
|
|
|
|
tileElement = map_get_first_element_at(x / 32, y / 32);
|
2017-10-17 13:55:53 +02:00
|
|
|
|
do
|
|
|
|
|
{
|
2017-10-31 14:03:45 +01:00
|
|
|
|
if (tileElement == nullptr)
|
2017-08-22 10:20:59 +02:00
|
|
|
|
break;
|
|
|
|
|
|
2017-10-31 14:03:45 +01:00
|
|
|
|
if (tileElement->base_height != z / 8)
|
2017-06-06 23:24:18 +02:00
|
|
|
|
continue;
|
|
|
|
|
|
2018-05-02 19:27:04 +02:00
|
|
|
|
if (tileElement->GetType() != TILE_ELEMENT_TYPE_TRACK)
|
2017-06-06 23:24:18 +02:00
|
|
|
|
continue;
|
|
|
|
|
|
2018-09-17 21:54:36 +02:00
|
|
|
|
if (tileElement->GetDirection() != rotation)
|
2017-06-06 23:24:18 +02:00
|
|
|
|
continue;
|
|
|
|
|
|
2018-09-17 22:10:15 +02:00
|
|
|
|
if (tileElement->AsTrack()->GetSequenceIndex() != trackBlock->index)
|
2017-06-06 23:24:18 +02:00
|
|
|
|
continue;
|
|
|
|
|
|
2018-09-17 21:54:36 +02:00
|
|
|
|
if (tileElement->AsTrack()->GetTrackType() != type)
|
2017-06-06 23:24:18 +02:00
|
|
|
|
continue;
|
|
|
|
|
|
2018-05-31 22:36:45 +02:00
|
|
|
|
if (tileElement->IsGhost() != isGhost)
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
found = true;
|
2017-06-06 23:24:18 +02:00
|
|
|
|
break;
|
2018-06-22 23:14:18 +02:00
|
|
|
|
} while (!(tileElement++)->IsLastForTile());
|
2017-06-06 23:24:18 +02:00
|
|
|
|
|
2017-10-17 13:55:53 +02:00
|
|
|
|
if (!found)
|
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
|
log_error("Track map element part not found!");
|
|
|
|
|
return MONEY32_UNDEFINED;
|
|
|
|
|
}
|
|
|
|
|
|
2018-06-20 17:28:51 +02:00
|
|
|
|
int32_t entranceDirections;
|
2017-10-17 13:55:53 +02:00
|
|
|
|
if (ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_FLAT_RIDE))
|
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
|
entranceDirections = FlatRideTrackSequenceProperties[type][0];
|
|
|
|
|
}
|
2017-10-17 13:55:53 +02:00
|
|
|
|
else
|
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
|
entranceDirections = TrackSequenceProperties[type][0];
|
|
|
|
|
}
|
|
|
|
|
|
2018-09-17 22:10:15 +02:00
|
|
|
|
if (entranceDirections & TRACK_SEQUENCE_FLAG_ORIGIN && (tileElement->AsTrack()->GetSequenceIndex() == 0))
|
2017-10-17 13:55:53 +02:00
|
|
|
|
{
|
|
|
|
|
if (!track_remove_station_element(x, y, z / 8, rotation, rideIndex, 0))
|
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
|
return MONEY32_UNDEFINED;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2018-06-22 23:14:18 +02:00
|
|
|
|
rct_tile_element* surfaceElement = map_get_surface_element_at({ x, y });
|
2017-10-17 13:55:53 +02:00
|
|
|
|
if (surfaceElement == nullptr)
|
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
|
return MONEY32_UNDEFINED;
|
|
|
|
|
}
|
|
|
|
|
|
2018-06-20 17:28:51 +02:00
|
|
|
|
int8_t _support_height = tileElement->base_height - surfaceElement->base_height;
|
2017-10-17 13:55:53 +02:00
|
|
|
|
if (_support_height < 0)
|
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
|
_support_height = 10;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
cost += (_support_height / 2) * RideTrackCosts[ride->type].support_price;
|
|
|
|
|
|
|
|
|
|
if (!(flags & GAME_COMMAND_FLAG_APPLY))
|
|
|
|
|
continue;
|
|
|
|
|
|
2018-09-17 22:10:15 +02:00
|
|
|
|
if (entranceDirections & (1 << 4) && (tileElement->AsTrack()->GetSequenceIndex() == 0))
|
2017-10-17 13:55:53 +02:00
|
|
|
|
{
|
|
|
|
|
if (!track_remove_station_element(x, y, z / 8, rotation, rideIndex, GAME_COMMAND_FLAG_APPLY))
|
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
|
return MONEY32_UNDEFINED;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2017-10-17 13:55:53 +02:00
|
|
|
|
if (ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_TRACK_MUST_BE_ON_WATER))
|
|
|
|
|
{
|
2018-10-03 11:39:33 +02:00
|
|
|
|
surfaceElement->AsSurface()->SetHasTrackThatNeedsWater(false);
|
2017-06-06 23:24:18 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
invalidate_test_results(rideIndex);
|
|
|
|
|
footpath_queue_chain_reset();
|
2017-10-31 14:03:45 +01:00
|
|
|
|
if (!gCheatsDisableClearanceChecks || !(tileElement->flags & TILE_ELEMENT_FLAG_GHOST))
|
2017-10-17 13:55:53 +02:00
|
|
|
|
{
|
2017-10-31 14:03:45 +01:00
|
|
|
|
footpath_remove_edges_at(x, y, tileElement);
|
2017-06-06 23:24:18 +02:00
|
|
|
|
}
|
2017-10-31 14:03:45 +01:00
|
|
|
|
tile_element_remove(tileElement);
|
2017-10-17 13:55:53 +02:00
|
|
|
|
if (!(flags & GAME_COMMAND_FLAG_GHOST))
|
|
|
|
|
{
|
2017-07-28 10:56:04 +02:00
|
|
|
|
sub_6CB945(rideIndex);
|
2017-06-06 23:24:18 +02:00
|
|
|
|
ride_update_max_vehicles(rideIndex);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2017-10-17 13:55:53 +02:00
|
|
|
|
if (flags & GAME_COMMAND_FLAG_APPLY)
|
|
|
|
|
{
|
|
|
|
|
switch (type)
|
|
|
|
|
{
|
2018-06-22 23:14:18 +02:00
|
|
|
|
case TRACK_ELEM_ON_RIDE_PHOTO:
|
|
|
|
|
ride->lifecycle_flags &= ~RIDE_LIFECYCLE_ON_RIDE_PHOTO;
|
|
|
|
|
break;
|
|
|
|
|
case TRACK_ELEM_CABLE_LIFT_HILL:
|
|
|
|
|
ride->lifecycle_flags &= ~RIDE_LIFECYCLE_CABLE_LIFT_HILL_COMPONENT_USED;
|
|
|
|
|
break;
|
|
|
|
|
case TRACK_ELEM_BLOCK_BRAKES:
|
|
|
|
|
ride->num_block_brakes--;
|
|
|
|
|
if (ride->num_block_brakes == 0)
|
2017-10-17 13:55:53 +02:00
|
|
|
|
{
|
2018-06-22 23:14:18 +02:00
|
|
|
|
ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_OPERATING;
|
|
|
|
|
ride->mode = RIDE_MODE_CONTINUOUS_CIRCUIT;
|
|
|
|
|
if (ride->type == RIDE_TYPE_LIM_LAUNCHED_ROLLER_COASTER)
|
|
|
|
|
{
|
|
|
|
|
ride->mode = RIDE_MODE_POWERED_LAUNCH;
|
|
|
|
|
}
|
2017-06-06 23:24:18 +02:00
|
|
|
|
}
|
2018-06-22 23:14:18 +02:00
|
|
|
|
break;
|
2017-06-06 23:24:18 +02:00
|
|
|
|
}
|
|
|
|
|
|
2017-10-17 13:55:53 +02:00
|
|
|
|
switch (type)
|
|
|
|
|
{
|
2018-06-22 23:14:18 +02:00
|
|
|
|
case TRACK_ELEM_25_DEG_UP_TO_FLAT:
|
|
|
|
|
case TRACK_ELEM_60_DEG_UP_TO_FLAT:
|
|
|
|
|
case TRACK_ELEM_DIAG_25_DEG_UP_TO_FLAT:
|
|
|
|
|
case TRACK_ELEM_DIAG_60_DEG_UP_TO_FLAT:
|
|
|
|
|
if (!isLiftHill)
|
|
|
|
|
break;
|
|
|
|
|
// Fall through
|
|
|
|
|
case TRACK_ELEM_CABLE_LIFT_HILL:
|
|
|
|
|
ride->num_block_brakes--;
|
2017-06-06 23:24:18 +02:00
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
money32 price = RideTrackCosts[ride->type].track_price;
|
2017-10-17 13:55:53 +02:00
|
|
|
|
if (ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_FLAT_RIDE))
|
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
|
price *= FlatRideTrackPricing[type];
|
|
|
|
|
}
|
2017-10-17 13:55:53 +02:00
|
|
|
|
else
|
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
|
price *= TrackPricing[type];
|
|
|
|
|
}
|
|
|
|
|
price >>= 16;
|
2017-10-17 15:38:20 +02:00
|
|
|
|
price = (price + cost) / 2;
|
2017-06-06 23:24:18 +02:00
|
|
|
|
if (ride->lifecycle_flags & RIDE_LIFECYCLE_EVER_BEEN_OPENED)
|
|
|
|
|
price *= -7;
|
|
|
|
|
else
|
|
|
|
|
price *= -10;
|
|
|
|
|
|
2017-10-17 13:55:53 +02:00
|
|
|
|
if (gGameCommandNestLevel == 1)
|
|
|
|
|
{
|
2017-10-13 22:23:07 +02:00
|
|
|
|
LocationXYZ16 coord;
|
2017-06-06 23:24:18 +02:00
|
|
|
|
coord.x = originX + 16;
|
|
|
|
|
coord.y = originY + 16;
|
|
|
|
|
coord.z = trackpieceZ;
|
|
|
|
|
network_set_player_last_action_coord(network_get_player_index(game_command_playerid), coord);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (gParkFlags & PARK_FLAGS_NO_MONEY)
|
|
|
|
|
return 0;
|
|
|
|
|
else
|
|
|
|
|
return price;
|
2015-07-05 12:50:43 +02:00
|
|
|
|
}
|
|
|
|
|
|
2015-06-27 18:53:28 +02:00
|
|
|
|
/**
|
|
|
|
|
*
|
|
|
|
|
* rct2: 0x006C5B69
|
|
|
|
|
*/
|
2018-04-20 13:56:37 +02:00
|
|
|
|
void game_command_remove_track(
|
2018-07-21 13:51:54 +02:00
|
|
|
|
int32_t* eax, int32_t* ebx, int32_t* ecx, int32_t* edx, [[maybe_unused]] int32_t* esi, int32_t* edi,
|
2018-06-22 23:14:18 +02:00
|
|
|
|
[[maybe_unused]] int32_t* ebp)
|
2015-06-27 18:53:28 +02:00
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
|
*ebx = track_remove(
|
2018-06-22 23:14:18 +02:00
|
|
|
|
*edx & 0xFF, (*edx >> 8) & 0xFF, *eax & 0xFFFF, *ecx & 0xFFFF, *edi & 0xFFFF, (*ebx >> 8) & 0xFF, *ebx & 0xFF);
|
2015-06-28 12:44:34 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
*
|
|
|
|
|
* rct2: 0x006C5AE9
|
|
|
|
|
*/
|
2018-04-20 13:56:37 +02:00
|
|
|
|
void game_command_set_brakes_speed(
|
2018-07-21 13:51:54 +02:00
|
|
|
|
int32_t* eax, int32_t* ebx, int32_t* ecx, int32_t* edx, [[maybe_unused]] int32_t* esi, int32_t* edi,
|
2018-06-22 23:14:18 +02:00
|
|
|
|
[[maybe_unused]] int32_t* ebp)
|
2015-06-28 12:44:34 +02:00
|
|
|
|
{
|
2018-06-22 23:14:18 +02:00
|
|
|
|
int32_t x = (*eax & 0xFFFF);
|
|
|
|
|
int32_t y = (*ecx & 0xFFFF);
|
|
|
|
|
int32_t z = (*edi & 0xFFFF);
|
|
|
|
|
int32_t trackType = (*edx & 0xFF);
|
2018-06-20 17:28:51 +02:00
|
|
|
|
int32_t brakesSpeed = ((*ebx >> 8) & 0xFF);
|
2017-06-06 23:24:18 +02:00
|
|
|
|
|
|
|
|
|
gCommandExpenditureType = RCT_EXPENDITURE_TYPE_RIDE_CONSTRUCTION;
|
|
|
|
|
gCommandPosition.x = x + 16;
|
|
|
|
|
gCommandPosition.y = y + 16;
|
|
|
|
|
gCommandPosition.z = z;
|
|
|
|
|
|
2017-10-17 13:55:53 +02:00
|
|
|
|
if (*ebx & GAME_COMMAND_FLAG_APPLY)
|
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
|
*ebx = 0;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2018-06-22 23:14:18 +02:00
|
|
|
|
rct_tile_element* tileElement = map_get_first_element_at(x >> 5, y >> 5);
|
2017-10-31 14:03:45 +01:00
|
|
|
|
if (tileElement == nullptr)
|
2017-06-06 23:24:18 +02:00
|
|
|
|
{
|
|
|
|
|
log_warning("Invalid game command for setting brakes speed. x = %d, y = %d", x, y);
|
|
|
|
|
*ebx = MONEY32_UNDEFINED;
|
|
|
|
|
return;
|
|
|
|
|
}
|
2017-10-17 13:55:53 +02:00
|
|
|
|
do
|
|
|
|
|
{
|
2017-10-31 14:03:45 +01:00
|
|
|
|
if (tileElement->base_height * 8 != z)
|
2017-06-06 23:24:18 +02:00
|
|
|
|
continue;
|
2018-05-02 19:27:04 +02:00
|
|
|
|
if (tileElement->GetType() != TILE_ELEMENT_TYPE_TRACK)
|
2017-06-06 23:24:18 +02:00
|
|
|
|
continue;
|
2018-09-17 21:54:36 +02:00
|
|
|
|
if (tileElement->AsTrack()->GetTrackType() != trackType)
|
2017-06-06 23:24:18 +02:00
|
|
|
|
continue;
|
|
|
|
|
|
2018-09-18 13:37:44 +02:00
|
|
|
|
tileElement->AsTrack()->SetBrakeBoosterSpeed(brakesSpeed);
|
2017-06-06 23:24:18 +02:00
|
|
|
|
|
|
|
|
|
break;
|
2018-06-22 23:14:18 +02:00
|
|
|
|
} while (!(tileElement++)->IsLastForTile());
|
2017-06-06 23:24:18 +02:00
|
|
|
|
|
|
|
|
|
*ebx = 0;
|
2015-07-11 23:51:11 +02:00
|
|
|
|
}
|
|
|
|
|
|
2018-06-22 23:14:18 +02:00
|
|
|
|
void track_circuit_iterator_begin(track_circuit_iterator* it, CoordsXYE first)
|
2015-07-11 23:51:11 +02:00
|
|
|
|
{
|
2018-06-22 23:14:18 +02:00
|
|
|
|
it->last = first;
|
|
|
|
|
it->first = nullptr;
|
2017-06-06 23:24:18 +02:00
|
|
|
|
it->firstIteration = true;
|
2018-06-22 23:14:18 +02:00
|
|
|
|
it->looped = false;
|
2015-07-11 23:51:11 +02:00
|
|
|
|
}
|
|
|
|
|
|
2018-06-22 23:14:18 +02:00
|
|
|
|
bool track_circuit_iterator_previous(track_circuit_iterator* it)
|
2015-09-13 03:59:55 +02:00
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
|
track_begin_end trackBeginEnd;
|
|
|
|
|
|
2017-10-17 13:55:53 +02:00
|
|
|
|
if (it->first == nullptr)
|
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
|
if (!track_block_get_previous(it->last.x, it->last.y, it->last.element, &trackBeginEnd))
|
|
|
|
|
return false;
|
|
|
|
|
|
2018-06-22 23:14:18 +02:00
|
|
|
|
it->current.x = trackBeginEnd.begin_x;
|
|
|
|
|
it->current.y = trackBeginEnd.begin_y;
|
|
|
|
|
it->current.element = trackBeginEnd.begin_element;
|
|
|
|
|
it->currentZ = trackBeginEnd.begin_z;
|
2017-06-06 23:24:18 +02:00
|
|
|
|
it->currentDirection = trackBeginEnd.begin_direction;
|
|
|
|
|
|
|
|
|
|
it->first = it->current.element;
|
|
|
|
|
return true;
|
2017-10-17 13:55:53 +02:00
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
if (!it->firstIteration && it->first == it->current.element)
|
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
|
it->looped = true;
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
it->firstIteration = false;
|
2018-06-22 23:14:18 +02:00
|
|
|
|
it->last = it->current;
|
2017-06-06 23:24:18 +02:00
|
|
|
|
|
2017-10-17 13:55:53 +02:00
|
|
|
|
if (track_block_get_previous(it->last.x, it->last.y, it->last.element, &trackBeginEnd))
|
|
|
|
|
{
|
2018-06-22 23:14:18 +02:00
|
|
|
|
it->current.x = trackBeginEnd.end_x;
|
|
|
|
|
it->current.y = trackBeginEnd.end_y;
|
|
|
|
|
it->current.element = trackBeginEnd.begin_element;
|
|
|
|
|
it->currentZ = trackBeginEnd.begin_z;
|
2017-06-06 23:24:18 +02:00
|
|
|
|
it->currentDirection = trackBeginEnd.begin_direction;
|
|
|
|
|
return true;
|
2017-10-17 13:55:53 +02:00
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
2015-09-13 03:59:55 +02:00
|
|
|
|
}
|
|
|
|
|
|
2018-06-22 23:14:18 +02:00
|
|
|
|
bool track_circuit_iterator_next(track_circuit_iterator* it)
|
2015-07-11 23:51:11 +02:00
|
|
|
|
{
|
2017-10-17 13:55:53 +02:00
|
|
|
|
if (it->first == nullptr)
|
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
|
if (!track_block_get_next(&it->last, &it->current, &it->currentZ, &it->currentDirection))
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
it->first = it->current.element;
|
|
|
|
|
return true;
|
2017-10-17 13:55:53 +02:00
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
if (!it->firstIteration && it->first == it->current.element)
|
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
|
it->looped = true;
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
it->firstIteration = false;
|
2018-06-22 23:14:18 +02:00
|
|
|
|
it->last = it->current;
|
2017-06-06 23:24:18 +02:00
|
|
|
|
return track_block_get_next(&it->last, &it->current, &it->currentZ, &it->currentDirection);
|
|
|
|
|
}
|
2015-07-11 23:51:11 +02:00
|
|
|
|
}
|
2015-07-12 15:26:14 +02:00
|
|
|
|
|
2018-06-22 23:14:18 +02:00
|
|
|
|
bool track_circuit_iterators_match(const track_circuit_iterator* firstIt, const track_circuit_iterator* secondIt)
|
2018-01-20 22:51:26 +01:00
|
|
|
|
{
|
2018-06-22 23:14:18 +02:00
|
|
|
|
return (
|
|
|
|
|
firstIt->currentZ == secondIt->currentZ && firstIt->currentDirection == secondIt->currentDirection
|
|
|
|
|
&& firstIt->current.x == secondIt->current.x && firstIt->current.y == secondIt->current.y);
|
2018-01-20 22:51:26 +01:00
|
|
|
|
}
|
|
|
|
|
|
2018-06-22 23:14:18 +02:00
|
|
|
|
void track_get_back(CoordsXYE* input, CoordsXYE* output)
|
2015-07-12 15:26:14 +02:00
|
|
|
|
{
|
2018-06-22 23:14:18 +02:00
|
|
|
|
CoordsXYE lastTrack;
|
2017-06-06 23:24:18 +02:00
|
|
|
|
track_begin_end currentTrack;
|
2018-06-22 23:14:18 +02:00
|
|
|
|
bool result;
|
2017-06-06 23:24:18 +02:00
|
|
|
|
|
|
|
|
|
lastTrack = *input;
|
2017-10-17 13:55:53 +02:00
|
|
|
|
do
|
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
|
result = track_block_get_previous(lastTrack.x, lastTrack.y, lastTrack.element, ¤tTrack);
|
2017-10-17 13:55:53 +02:00
|
|
|
|
if (result)
|
|
|
|
|
{
|
2018-06-22 23:14:18 +02:00
|
|
|
|
lastTrack.x = currentTrack.begin_x;
|
|
|
|
|
lastTrack.y = currentTrack.begin_y;
|
2017-06-06 23:24:18 +02:00
|
|
|
|
lastTrack.element = currentTrack.begin_element;
|
|
|
|
|
}
|
2018-06-22 23:14:18 +02:00
|
|
|
|
} while (result);
|
2017-06-06 23:24:18 +02:00
|
|
|
|
*output = lastTrack;
|
2015-07-12 15:26:14 +02:00
|
|
|
|
}
|
|
|
|
|
|
2018-06-22 23:14:18 +02:00
|
|
|
|
void track_get_front(CoordsXYE* input, CoordsXYE* output)
|
2015-07-12 15:26:14 +02:00
|
|
|
|
{
|
2018-02-15 17:42:53 +01:00
|
|
|
|
CoordsXYE lastTrack, currentTrack;
|
2018-06-22 23:14:18 +02:00
|
|
|
|
int32_t z, direction;
|
|
|
|
|
bool result;
|
2017-06-06 23:24:18 +02:00
|
|
|
|
|
|
|
|
|
lastTrack = *input;
|
2017-10-17 13:55:53 +02:00
|
|
|
|
do
|
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
|
result = track_block_get_next(&lastTrack, ¤tTrack, &z, &direction);
|
2017-10-17 13:55:53 +02:00
|
|
|
|
if (result)
|
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
|
lastTrack = currentTrack;
|
|
|
|
|
}
|
2018-06-22 23:14:18 +02:00
|
|
|
|
} while (result);
|
2017-06-06 23:24:18 +02:00
|
|
|
|
*output = lastTrack;
|
2015-07-12 15:26:14 +02:00
|
|
|
|
}
|
2015-10-25 17:00:21 +01:00
|
|
|
|
|
2018-09-18 13:01:09 +02:00
|
|
|
|
bool TrackElement::HasChain() const
|
2015-10-25 17:00:21 +01:00
|
|
|
|
{
|
2018-09-18 13:01:09 +02:00
|
|
|
|
return type & TRACK_ELEMENT_TYPE_FLAG_CHAIN_LIFT;
|
2015-10-25 17:00:21 +01:00
|
|
|
|
}
|
2015-11-04 20:28:45 +01:00
|
|
|
|
|
2018-09-18 13:01:09 +02:00
|
|
|
|
void TrackElement::SetHasChain(bool on)
|
2017-11-14 15:12:48 +01:00
|
|
|
|
{
|
|
|
|
|
if (on)
|
|
|
|
|
{
|
2018-09-18 13:01:09 +02:00
|
|
|
|
type |= TRACK_ELEMENT_TYPE_FLAG_CHAIN_LIFT;
|
2017-11-14 15:12:48 +01:00
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2018-09-18 13:01:09 +02:00
|
|
|
|
type &= ~TRACK_ELEMENT_TYPE_FLAG_CHAIN_LIFT;
|
2017-11-14 15:12:48 +01:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2015-11-01 15:58:46 +01:00
|
|
|
|
/**
|
|
|
|
|
* Checks if a track element is recognised as the beginning of a block.
|
|
|
|
|
* A beginning of a block can be the end of a station, the end of a lift hill,
|
|
|
|
|
* or a block brake.
|
|
|
|
|
*/
|
2018-06-22 23:14:18 +02:00
|
|
|
|
bool track_element_is_block_start(rct_tile_element* trackElement)
|
2015-11-01 15:58:46 +01:00
|
|
|
|
{
|
2018-09-17 21:54:36 +02:00
|
|
|
|
switch (trackElement->AsTrack()->GetTrackType())
|
2017-10-17 13:55:53 +02:00
|
|
|
|
{
|
2018-06-22 23:14:18 +02:00
|
|
|
|
case TRACK_ELEM_END_STATION:
|
|
|
|
|
case TRACK_ELEM_CABLE_LIFT_HILL:
|
|
|
|
|
case TRACK_ELEM_BLOCK_BRAKES:
|
2017-06-06 23:24:18 +02:00
|
|
|
|
return true;
|
2018-06-22 23:14:18 +02:00
|
|
|
|
case TRACK_ELEM_25_DEG_UP_TO_FLAT:
|
|
|
|
|
case TRACK_ELEM_60_DEG_UP_TO_FLAT:
|
|
|
|
|
case TRACK_ELEM_DIAG_25_DEG_UP_TO_FLAT:
|
|
|
|
|
case TRACK_ELEM_DIAG_60_DEG_UP_TO_FLAT:
|
2018-09-18 13:01:09 +02:00
|
|
|
|
if (trackElement->AsTrack()->HasChain())
|
2018-06-22 23:14:18 +02:00
|
|
|
|
{
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
break;
|
2017-06-06 23:24:18 +02:00
|
|
|
|
}
|
|
|
|
|
return false;
|
2015-11-01 15:58:46 +01:00
|
|
|
|
}
|
|
|
|
|
|
2018-06-22 23:14:18 +02:00
|
|
|
|
int32_t track_get_actual_bank(rct_tile_element* tileElement, int32_t bank)
|
2015-11-22 13:14:53 +01:00
|
|
|
|
{
|
2018-09-18 13:10:29 +02:00
|
|
|
|
Ride* ride = get_ride(tileElement->AsTrack()->GetRideIndex());
|
2018-09-18 13:30:00 +02:00
|
|
|
|
bool isInverted = tileElement->AsTrack()->IsInverted();
|
2017-11-14 13:15:17 +01:00
|
|
|
|
return track_get_actual_bank_2(ride->type, isInverted, bank);
|
2015-11-22 13:14:53 +01:00
|
|
|
|
}
|
|
|
|
|
|
2018-06-20 17:28:51 +02:00
|
|
|
|
int32_t track_get_actual_bank_2(int32_t rideType, bool isInverted, int32_t bank)
|
2015-11-22 13:14:53 +01:00
|
|
|
|
{
|
2017-10-17 13:55:53 +02:00
|
|
|
|
if (RideData4[rideType].flags & RIDE_TYPE_FLAG4_HAS_ALTERNATIVE_TRACK_TYPE)
|
|
|
|
|
{
|
2017-11-14 13:15:17 +01:00
|
|
|
|
if (isInverted)
|
2017-10-17 13:55:53 +02:00
|
|
|
|
{
|
|
|
|
|
if (bank == TRACK_BANK_NONE)
|
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
|
bank = TRACK_BANK_UPSIDE_DOWN;
|
2017-10-17 13:55:53 +02:00
|
|
|
|
}
|
|
|
|
|
else if (bank == TRACK_BANK_UPSIDE_DOWN)
|
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
|
bank = TRACK_BANK_NONE;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return bank;
|
2015-11-22 13:14:53 +01:00
|
|
|
|
}
|
2015-11-22 15:55:46 +01:00
|
|
|
|
|
2018-06-22 23:14:18 +02:00
|
|
|
|
int32_t track_get_actual_bank_3(rct_vehicle* vehicle, rct_tile_element* tileElement)
|
2015-12-13 17:10:30 +01:00
|
|
|
|
{
|
2018-07-21 11:50:45 +02:00
|
|
|
|
bool isInverted = ((vehicle->update_flags & VEHICLE_UPDATE_FLAG_USE_INVERTED_SPRITES) > 0)
|
2018-09-18 13:30:00 +02:00
|
|
|
|
^ tileElement->AsTrack()->IsInverted();
|
2018-09-17 21:54:36 +02:00
|
|
|
|
int32_t trackType = tileElement->AsTrack()->GetTrackType();
|
2018-09-18 13:10:29 +02:00
|
|
|
|
int32_t rideType = get_ride(tileElement->AsTrack()->GetRideIndex())->type;
|
2018-06-22 23:14:18 +02:00
|
|
|
|
int32_t bankStart = TrackDefinitions[trackType].bank_start;
|
2017-11-14 13:15:17 +01:00
|
|
|
|
return track_get_actual_bank_2(rideType, isInverted, bankStart);
|
2015-12-13 17:10:30 +01:00
|
|
|
|
}
|
|
|
|
|
|
2018-06-22 23:14:18 +02:00
|
|
|
|
bool track_element_is_station(rct_tile_element* trackElement)
|
2015-11-22 15:55:46 +01:00
|
|
|
|
{
|
2018-09-17 21:54:36 +02:00
|
|
|
|
switch (trackElement->AsTrack()->GetTrackType())
|
2017-10-17 13:55:53 +02:00
|
|
|
|
{
|
2018-06-22 23:14:18 +02:00
|
|
|
|
case TRACK_ELEM_END_STATION:
|
|
|
|
|
case TRACK_ELEM_BEGIN_STATION:
|
|
|
|
|
case TRACK_ELEM_MIDDLE_STATION:
|
|
|
|
|
return true;
|
|
|
|
|
default:
|
|
|
|
|
return false;
|
2017-06-06 23:24:18 +02:00
|
|
|
|
}
|
2015-11-22 15:55:46 +01:00
|
|
|
|
}
|
2015-11-22 18:50:33 +01:00
|
|
|
|
|
2018-06-20 17:28:51 +02:00
|
|
|
|
bool track_element_is_covered(int32_t trackElementType)
|
2015-11-22 18:50:33 +01:00
|
|
|
|
{
|
2017-10-17 13:55:53 +02:00
|
|
|
|
switch (trackElementType)
|
|
|
|
|
{
|
2018-06-22 23:14:18 +02:00
|
|
|
|
case TRACK_ELEM_FLAT_COVERED:
|
|
|
|
|
case TRACK_ELEM_25_DEG_UP_COVERED:
|
|
|
|
|
case TRACK_ELEM_60_DEG_UP_COVERED:
|
|
|
|
|
case TRACK_ELEM_FLAT_TO_25_DEG_UP_COVERED:
|
|
|
|
|
case TRACK_ELEM_25_DEG_UP_TO_60_DEG_UP_COVERED:
|
|
|
|
|
case TRACK_ELEM_60_DEG_UP_TO_25_DEG_UP_COVERED:
|
|
|
|
|
case TRACK_ELEM_25_DEG_UP_TO_FLAT_COVERED:
|
|
|
|
|
case TRACK_ELEM_25_DEG_DOWN_COVERED:
|
|
|
|
|
case TRACK_ELEM_60_DEG_DOWN_COVERED:
|
|
|
|
|
case TRACK_ELEM_FLAT_TO_25_DEG_DOWN_COVERED:
|
|
|
|
|
case TRACK_ELEM_25_DEG_DOWN_TO_60_DEG_DOWN_COVERED:
|
|
|
|
|
case TRACK_ELEM_60_DEG_DOWN_TO_25_DEG_DOWN_COVERED:
|
|
|
|
|
case TRACK_ELEM_25_DEG_DOWN_TO_FLAT_COVERED:
|
|
|
|
|
case TRACK_ELEM_LEFT_QUARTER_TURN_5_TILES_COVERED:
|
|
|
|
|
case TRACK_ELEM_RIGHT_QUARTER_TURN_5_TILES_COVERED:
|
|
|
|
|
case TRACK_ELEM_S_BEND_LEFT_COVERED:
|
|
|
|
|
case TRACK_ELEM_S_BEND_RIGHT_COVERED:
|
|
|
|
|
case TRACK_ELEM_LEFT_QUARTER_TURN_3_TILES_COVERED:
|
|
|
|
|
case TRACK_ELEM_RIGHT_QUARTER_TURN_3_TILES_COVERED:
|
|
|
|
|
return true;
|
|
|
|
|
default:
|
|
|
|
|
return false;
|
2017-06-06 23:24:18 +02:00
|
|
|
|
}
|
2015-11-22 18:50:33 +01:00
|
|
|
|
}
|
2017-06-20 14:23:49 +02:00
|
|
|
|
|
2018-06-20 17:28:51 +02:00
|
|
|
|
bool track_element_is_booster(uint8_t rideType, uint8_t trackType)
|
2017-06-20 14:23:49 +02:00
|
|
|
|
{
|
|
|
|
|
// Boosters share their ID with the Spinning Control track.
|
2017-12-03 23:45:43 +01:00
|
|
|
|
return rideType != RIDE_TYPE_STEEL_WILD_MOUSE && trackType == TRACK_ELEM_BOOSTER;
|
2017-06-20 14:23:49 +02:00
|
|
|
|
}
|
|
|
|
|
|
2018-06-20 17:28:51 +02:00
|
|
|
|
bool track_element_has_speed_setting(uint8_t trackType)
|
2017-06-20 14:23:49 +02:00
|
|
|
|
{
|
|
|
|
|
// This does not check if the element is really a Spinning Control track instead of a booster,
|
|
|
|
|
// but this does not cause problems.
|
2017-12-03 23:45:43 +01:00
|
|
|
|
return trackType == TRACK_ELEM_BRAKES || trackType == TRACK_ELEM_BOOSTER;
|
2017-06-20 14:23:49 +02:00
|
|
|
|
}
|
2017-10-04 17:14:53 +02:00
|
|
|
|
|
2018-09-17 22:15:19 +02:00
|
|
|
|
uint8_t TrackElement::GetSeatRotation() const
|
2017-10-04 17:14:53 +02:00
|
|
|
|
{
|
2018-09-17 22:15:19 +02:00
|
|
|
|
return colour >> 4;
|
2017-10-04 17:14:53 +02:00
|
|
|
|
}
|
|
|
|
|
|
2018-09-17 22:15:19 +02:00
|
|
|
|
void TrackElement::SetSeatRotation(uint8_t newSeatRotation)
|
2017-10-04 17:14:53 +02:00
|
|
|
|
{
|
2018-09-17 22:15:19 +02:00
|
|
|
|
colour &= 0x0F;
|
|
|
|
|
colour |= (newSeatRotation << 4);
|
2017-10-04 17:14:53 +02:00
|
|
|
|
}
|
|
|
|
|
|
2018-09-18 13:49:58 +02:00
|
|
|
|
bool TrackElement::IsTakingPhoto() const
|
2017-11-14 12:08:03 +01:00
|
|
|
|
{
|
2018-09-18 13:49:58 +02:00
|
|
|
|
return (sequence & MAP_ELEM_TRACK_SEQUENCE_TAKING_PHOTO_MASK) != 0;
|
2017-11-14 12:08:03 +01:00
|
|
|
|
}
|
|
|
|
|
|
2018-09-18 13:49:58 +02:00
|
|
|
|
void TrackElement::SetPhotoTimeout()
|
2017-11-14 12:08:03 +01:00
|
|
|
|
{
|
2018-09-18 13:49:58 +02:00
|
|
|
|
sequence &= MAP_ELEM_TRACK_SEQUENCE_SEQUENCE_MASK;
|
|
|
|
|
sequence |= (3 << 4);
|
2017-11-14 12:08:03 +01:00
|
|
|
|
}
|
|
|
|
|
|
2018-09-18 13:49:58 +02:00
|
|
|
|
void TrackElement::DecrementPhotoTimeout()
|
2017-11-14 12:08:03 +01:00
|
|
|
|
{
|
|
|
|
|
// We should only touch the upper 4 bits, avoid underflow into the lower 4.
|
2018-09-18 13:49:58 +02:00
|
|
|
|
if (sequence & MAP_ELEM_TRACK_SEQUENCE_TAKING_PHOTO_MASK)
|
2017-11-14 12:08:03 +01:00
|
|
|
|
{
|
2018-09-18 13:49:58 +02:00
|
|
|
|
sequence -= (1 << 4);
|
2017-11-14 12:08:03 +01:00
|
|
|
|
}
|
2017-11-14 13:15:17 +01:00
|
|
|
|
}
|
|
|
|
|
|
2018-09-18 14:04:23 +02:00
|
|
|
|
uint16_t TrackElement::GetMazeEntry() const
|
2017-11-14 13:15:17 +01:00
|
|
|
|
{
|
2018-09-18 14:04:23 +02:00
|
|
|
|
return mazeEntry;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void TrackElement::SetMazeEntry(uint16_t newMazeEntry)
|
|
|
|
|
{
|
|
|
|
|
mazeEntry = newMazeEntry;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void TrackElement::MazeEntryAdd(uint16_t addVal)
|
|
|
|
|
{
|
|
|
|
|
mazeEntry |= addVal;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void TrackElement::MazeEntrySubtract(uint16_t subVal)
|
|
|
|
|
{
|
|
|
|
|
mazeEntry &= ~subVal;
|
2017-11-14 13:15:17 +01:00
|
|
|
|
}
|
|
|
|
|
|
2018-09-17 21:54:36 +02:00
|
|
|
|
uint8_t TrackElement::GetTrackType() const
|
2017-11-14 15:01:19 +01:00
|
|
|
|
{
|
2018-09-17 21:54:36 +02:00
|
|
|
|
return trackType;
|
2017-11-14 15:01:19 +01:00
|
|
|
|
}
|
|
|
|
|
|
2018-09-17 21:54:36 +02:00
|
|
|
|
void TrackElement::SetTrackType(uint8_t newType)
|
2017-11-14 15:01:19 +01:00
|
|
|
|
{
|
2018-09-17 21:54:36 +02:00
|
|
|
|
trackType = newType;
|
2017-11-14 15:01:19 +01:00
|
|
|
|
}
|
2018-05-10 09:39:33 +02:00
|
|
|
|
|
2018-09-17 22:51:28 +02:00
|
|
|
|
uint8_t TrackElement::GetSequenceIndex() const
|
|
|
|
|
{
|
|
|
|
|
return sequence & MAP_ELEM_TRACK_SEQUENCE_SEQUENCE_MASK;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void TrackElement::SetSequenceIndex(uint8_t newSequenceIndex)
|
|
|
|
|
{
|
|
|
|
|
sequence &= ~MAP_ELEM_TRACK_SEQUENCE_SEQUENCE_MASK;
|
|
|
|
|
sequence |= (newSequenceIndex & MAP_ELEM_TRACK_SEQUENCE_SEQUENCE_MASK);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
uint8_t TrackElement::GetStationIndex() const
|
|
|
|
|
{
|
|
|
|
|
return (sequence & MAP_ELEM_TRACK_SEQUENCE_STATION_INDEX_MASK) >> 4;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void TrackElement::SetStationIndex(uint8_t newStationIndex)
|
|
|
|
|
{
|
|
|
|
|
sequence &= ~MAP_ELEM_TRACK_SEQUENCE_STATION_INDEX_MASK;
|
|
|
|
|
sequence |= (newStationIndex << 4);
|
|
|
|
|
}
|
|
|
|
|
|
2018-09-17 21:57:12 +02:00
|
|
|
|
uint8_t TrackElement::GetDoorAState() const
|
2018-05-10 09:39:33 +02:00
|
|
|
|
{
|
2018-09-17 21:57:12 +02:00
|
|
|
|
return (colour & TRACK_ELEMENT_DOOR_A_MASK) >> 2;
|
2018-05-10 09:39:33 +02:00
|
|
|
|
}
|
|
|
|
|
|
2018-09-17 21:57:12 +02:00
|
|
|
|
uint8_t TrackElement::GetDoorBState() const
|
2018-05-10 09:39:33 +02:00
|
|
|
|
{
|
2018-09-17 21:57:12 +02:00
|
|
|
|
return (colour & TRACK_ELEMENT_DOOR_B_MASK) >> 5;
|
2018-05-10 09:39:33 +02:00
|
|
|
|
}
|
2018-09-18 13:10:29 +02:00
|
|
|
|
|
|
|
|
|
uint8_t TrackElement::GetRideIndex() const
|
|
|
|
|
{
|
|
|
|
|
return rideIndex;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void TrackElement::SetRideIndex(uint8_t newRideIndex)
|
|
|
|
|
{
|
|
|
|
|
rideIndex = newRideIndex;
|
|
|
|
|
}
|
|
|
|
|
|
2018-09-18 13:14:30 +02:00
|
|
|
|
uint8_t TrackElement::GetColourScheme() const
|
|
|
|
|
{
|
|
|
|
|
return colour & 0x3;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void TrackElement::SetColourScheme(uint8_t newColourScheme)
|
|
|
|
|
{
|
|
|
|
|
colour &= ~0x3;
|
|
|
|
|
colour |= (newColourScheme & 0x3);
|
|
|
|
|
}
|
2018-09-18 13:22:56 +02:00
|
|
|
|
|
|
|
|
|
bool TrackElement::HasCableLift() const
|
|
|
|
|
{
|
|
|
|
|
return colour & TRACK_ELEMENT_COLOUR_FLAG_CABLE_LIFT;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void TrackElement::SetHasCableLift(bool on)
|
|
|
|
|
{
|
|
|
|
|
colour &= ~TRACK_ELEMENT_COLOUR_FLAG_CABLE_LIFT;
|
|
|
|
|
if (on)
|
|
|
|
|
colour |= TRACK_ELEMENT_COLOUR_FLAG_CABLE_LIFT;
|
|
|
|
|
}
|
2018-09-18 13:30:00 +02:00
|
|
|
|
|
|
|
|
|
bool TrackElement::IsInverted() const
|
|
|
|
|
{
|
|
|
|
|
return colour & TRACK_ELEMENT_COLOUR_FLAG_INVERTED;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void TrackElement::SetInverted(bool inverted)
|
|
|
|
|
{
|
|
|
|
|
if (inverted)
|
|
|
|
|
{
|
|
|
|
|
colour |= TRACK_ELEMENT_COLOUR_FLAG_INVERTED;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
colour &= ~TRACK_ELEMENT_COLOUR_FLAG_INVERTED;
|
|
|
|
|
}
|
2018-09-18 13:37:44 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
uint8_t TrackElement::GetBrakeBoosterSpeed() const
|
|
|
|
|
{
|
|
|
|
|
return (sequence >> 4) << 1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void TrackElement::SetBrakeBoosterSpeed(uint8_t speed)
|
|
|
|
|
{
|
|
|
|
|
sequence &= ~0b11110000;
|
|
|
|
|
sequence |= ((speed >> 1) << 4);
|
|
|
|
|
}
|
2018-09-18 13:43:55 +02:00
|
|
|
|
|
|
|
|
|
uint8_t TrackElement::HasGreenLight() const
|
|
|
|
|
{
|
|
|
|
|
return (sequence & MAP_ELEM_TRACK_SEQUENCE_GREEN_LIGHT) != 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void TrackElement::SetHasGreenLight(uint8_t greenLight)
|
|
|
|
|
{
|
|
|
|
|
sequence &= ~MAP_ELEM_TRACK_SEQUENCE_GREEN_LIGHT;
|
|
|
|
|
if (greenLight)
|
|
|
|
|
{
|
|
|
|
|
sequence |= MAP_ELEM_TRACK_SEQUENCE_GREEN_LIGHT;
|
|
|
|
|
}
|
|
|
|
|
}
|
2018-10-03 11:39:33 +02:00
|
|
|
|
|
|
|
|
|
bool TrackElement::IsHighlighted() const
|
|
|
|
|
{
|
|
|
|
|
return (type & TILE_ELEMENT_TYPE_FLAG_HIGHLIGHT);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void TrackElement::SetHighlight(bool on)
|
|
|
|
|
{
|
|
|
|
|
type &= ~TILE_ELEMENT_TYPE_FLAG_HIGHLIGHT;
|
|
|
|
|
if (on)
|
|
|
|
|
type |= TILE_ELEMENT_TYPE_FLAG_HIGHLIGHT;
|
2018-10-23 14:52:51 +02:00
|
|
|
|
}
|