mirror of
https://github.com/OpenRCT2/OpenRCT2
synced 2025-12-24 08:12:53 +01:00
implement viewport_track_paint_setup
This commit is contained in:
@@ -22,6 +22,7 @@
|
||||
#include "../config.h"
|
||||
#include "../drawing/drawing.h"
|
||||
#include "../localisation/localisation.h"
|
||||
#include "../ride/track_data.h"
|
||||
#include "../sprites.h"
|
||||
#include "../world/map.h"
|
||||
#include "../world/sprite.h"
|
||||
@@ -1407,6 +1408,73 @@ void viewport_park_entrance_paint_setup(uint8 direction, int height, rct_map_ele
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* rct2: 0x006C4794
|
||||
*/
|
||||
void viewport_track_paint_setup(uint8 direction, int height, rct_map_element *mapElement)
|
||||
{
|
||||
rct_drawpixelinfo *dpi = RCT2_GLOBAL(0x0140E9A8, rct_drawpixelinfo*);
|
||||
rct_ride *ride;
|
||||
int trackType, trackColourScheme, trackSequence;
|
||||
|
||||
if (!(RCT2_GLOBAL(0x009DEA6F, uint8) & 1) || mapElement->properties.track.ride_index == RCT2_GLOBAL(0x00F64DE8, uint8)) {
|
||||
ride = GET_RIDE(mapElement->properties.track.ride_index);
|
||||
trackType = mapElement->properties.track.type;
|
||||
trackSequence = mapElement->properties.track.sequence & 0x0F;
|
||||
trackColourScheme = mapElement->properties.track.colour & 3;
|
||||
|
||||
if ((RCT2_GLOBAL(0x0141E9E4, uint16) & 0x20) && dpi->zoom_level == 0) {
|
||||
RCT2_GLOBAL(0x009DE570, uint8) = 0;
|
||||
if (RCT2_ADDRESS(0x00999694, uint32)[trackType] & (1 << trackSequence)) {
|
||||
uint16 ax = RCT2_GLOBAL(0x0097D21A + (ride->type * 8), uint8);
|
||||
uint32 ebx = 0x20381689 + (height + 8) / 16;
|
||||
ebx += RCT2_GLOBAL(0x009AACBD, uint16);
|
||||
ebx -= RCT2_GLOBAL(0x01359208, uint16);
|
||||
RCT2_GLOBAL(0x009DEA52, uint16) = 1000;
|
||||
RCT2_GLOBAL(0x009DEA54, uint16) = 1000;
|
||||
RCT2_GLOBAL(0x009DEA56, uint16) = 2047;
|
||||
RCT2_CALLPROC_X(
|
||||
RCT2_ADDRESS(0x0098197C, uint32)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint8)],
|
||||
16,
|
||||
ebx,
|
||||
16,
|
||||
height + ax + 3,
|
||||
1,
|
||||
1,
|
||||
0
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
RCT2_GLOBAL(0x009DE570, uint8) = 3;
|
||||
RCT2_GLOBAL(0x00F44198, uint32) = (ride->track_colour_main[trackColourScheme] << 19) | (ride->track_colour_additional[trackColourScheme] << 24) | 0xA0000000;
|
||||
RCT2_GLOBAL(0x00F441A0, uint32) = 0x20000000;
|
||||
RCT2_GLOBAL(0x00F441A4, uint32) = 0x20C00000;
|
||||
RCT2_GLOBAL(0x00F4419C, uint32) = (ride->track_colour_supports[trackColourScheme] << 19) | 0x20000000;
|
||||
if (mapElement->type & 0x40) {
|
||||
RCT2_GLOBAL(0x00F44198, uint32) = 0x21600000;
|
||||
RCT2_GLOBAL(0x00F4419C, uint32) = 0x21600000;
|
||||
RCT2_GLOBAL(0x00F441A0, uint32) = 0x21600000;
|
||||
RCT2_GLOBAL(0x00F441A4, uint32) = 0x21600000;
|
||||
}
|
||||
if (mapElement->flags & MAP_ELEMENT_FLAG_GHOST) {
|
||||
uint32 meh = RCT2_ADDRESS(0x00993CC4, uint32)[RCT2_GLOBAL(0x009AACBF, uint8)];
|
||||
RCT2_GLOBAL(0x009DE570, uint8) = 0;
|
||||
RCT2_GLOBAL(0x00F44198, uint32) = meh;
|
||||
RCT2_GLOBAL(0x00F4419C, uint32) = meh;
|
||||
RCT2_GLOBAL(0x00F441A0, uint32) = meh;
|
||||
RCT2_GLOBAL(0x00F441A4, uint32) = meh;
|
||||
}
|
||||
|
||||
uint32 **trackTypeList = (uint32**)RideTypeTrackPaintFunctions[ride->type];
|
||||
uint32 *trackDirectionList = trackTypeList[trackType];
|
||||
|
||||
// Have to call from this point as it pushes esi and expects callee to pop it
|
||||
RCT2_CALLPROC_X(0x006C4934, 0, (int)trackDirectionList, direction, height, (int)mapElement, 0, trackSequence);
|
||||
}
|
||||
}
|
||||
|
||||
/* rct2: 0x00664FD4 */
|
||||
void viewport_entrance_paint_setup(uint8 direction, int height, rct_map_element* map_element){
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_PAINT_SETUP_CURRENT_TYPE, uint8_t) = VIEWPORT_INTERACTION_ITEM_LABEL;
|
||||
@@ -1630,7 +1698,7 @@ static void sub_68B3FB(int x, int y)
|
||||
RCT2_CALLPROC_X(0x6A3590, 0, 0, direction, height, (int)map_element, 0, 0);
|
||||
break;
|
||||
case MAP_ELEMENT_TYPE_TRACK:
|
||||
RCT2_CALLPROC_X(0x6C4794, 0, 0, direction, height, (int)map_element, 0, 0);
|
||||
viewport_track_paint_setup(direction, height, map_element);
|
||||
break;
|
||||
case MAP_ELEMENT_TYPE_SCENERY:
|
||||
RCT2_CALLPROC_X(0x6DFF47, 0, 0, direction, height, (int)map_element, 0, 0);
|
||||
@@ -1663,7 +1731,7 @@ static void sub_68B3FB(int x, int y)
|
||||
*
|
||||
* rct2: 0x0068B60E
|
||||
*/
|
||||
static void sub_68B60E(int x, int y)
|
||||
static void viewport_blank_tiles_paint_setup(int x, int y)
|
||||
{
|
||||
rct_drawpixelinfo *dpi = RCT2_GLOBAL(0x0140E9A8, rct_drawpixelinfo*);
|
||||
|
||||
@@ -1735,7 +1803,7 @@ void sub_68B2B7(int x, int y)
|
||||
|
||||
sub_68B3FB(x, y);
|
||||
} else {
|
||||
sub_68B60E(x, y);
|
||||
viewport_blank_tiles_paint_setup(x, y);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1766,7 +1834,7 @@ void map_element_paint_setup(int x, int y)
|
||||
|
||||
sub_68B3FB(x, y);
|
||||
} else {
|
||||
sub_68B60E(x, y);
|
||||
viewport_blank_tiles_paint_setup(x, y);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -5468,3 +5468,97 @@ const track_curve_chain gFlatRideTrackCurveChain[256] = {
|
||||
{ 0, 0 },
|
||||
{ 0, 57088 },
|
||||
};
|
||||
|
||||
const uint32 RideTypeTrackPaintFunctions[91] = {
|
||||
0x008A42F4, // RIDE_TYPE_SPIRAL_ROLLER_COASTER
|
||||
0x008A6DB0, // RIDE_TYPE_STAND_UP_ROLLER_COASTER
|
||||
0x008A85E4, // RIDE_TYPE_SUSPENDED_SWINGING_COASTER
|
||||
0x008A8EE4, // RIDE_TYPE_INVERTED_ROLLER_COASTER
|
||||
0x008AAA0C, // RIDE_TYPE_JUNIOR_ROLLER_COASTER
|
||||
0x008ACE48, // RIDE_TYPE_MINIATURE_RAILWAY
|
||||
0x008ADF34, // RIDE_TYPE_MONORAIL
|
||||
0x008AFC24, // RIDE_TYPE_MINI_SUSPENDED_COASTER
|
||||
0x008B0D60, // RIDE_TYPE_BOAT_RIDE
|
||||
0x008A534C, // RIDE_TYPE_WOODEN_WILD_MOUSE
|
||||
0x008A5634, // RIDE_TYPE_STEEPLECHASE
|
||||
0x006F7000, // RIDE_TYPE_CAR_RIDE
|
||||
0x006FD0E8, // RIDE_TYPE_LAUNCHED_FREEFALL
|
||||
0x006FE240, // RIDE_TYPE_BOBSLEIGH_COASTER
|
||||
0x0070DC5C, // RIDE_TYPE_OBSERVATION_TOWER
|
||||
0x008A5B88, // RIDE_TYPE_LOOPING_ROLLER_COASTER
|
||||
0x0070EDB4, // RIDE_TYPE_DINGHY_SLIDE
|
||||
0x0071BC40, // RIDE_TYPE_MINE_TRAIN_COASTER
|
||||
0x00743EC8, // RIDE_TYPE_CHAIRLIFT
|
||||
0x008A7784, // RIDE_TYPE_CORKSCREW_ROLLER_COASTER
|
||||
0x008A81E8, // RIDE_TYPE_MAZE
|
||||
0x0074840C, // RIDE_TYPE_SPIRAL_SLIDE
|
||||
0x0074A668, // RIDE_TYPE_GO_KARTS
|
||||
0x0074DDEC, // RIDE_TYPE_LOG_FLUME
|
||||
0x0075745C, // RIDE_TYPE_RIVER_RAPIDS
|
||||
0x0075C9D0, // RIDE_TYPE_DODGEMS
|
||||
0x008A83E0, // RIDE_TYPE_PIRATE_SHIP
|
||||
0x00760070, // RIDE_TYPE_SWINGING_INVERTER_SHIP
|
||||
0x00761160, // RIDE_TYPE_FOOD_STALL
|
||||
0x00761160, // RIDE_TYPE_1D
|
||||
0x00761160, // RIDE_TYPE_DRINK_STALL
|
||||
0x00761160, // RIDE_TYPE_1F
|
||||
0x00761160, // RIDE_TYPE_SHOP
|
||||
0x0076190C, // RIDE_TYPE_MERRY_GO_ROUND
|
||||
0x00761160, // RIDE_TYPE_22
|
||||
0x00761160, // RIDE_TYPE_INFORMATION_KIOSK
|
||||
0x00762D44, // RIDE_TYPE_TOILETS
|
||||
0x008A8CC8, // RIDE_TYPE_FERRIS_WHEEL
|
||||
0x00763520, // RIDE_TYPE_MOTION_SIMULATOR
|
||||
0x0076554C, // RIDE_TYPE_3D_CINEMA
|
||||
0x0076659C, // RIDE_TYPE_TOP_SPIN
|
||||
0x00767A40, // RIDE_TYPE_SPACE_RINGS
|
||||
0x00768BAC, // RIDE_TYPE_REVERSE_FREEFALL_COASTER
|
||||
0x0076C5BC, // RIDE_TYPE_LIFT
|
||||
0x008A9C08, // RIDE_TYPE_VERTICAL_DROP_ROLLER_COASTER
|
||||
0x00761160, // RIDE_TYPE_CASH_MACHINE
|
||||
0x0076D658, // RIDE_TYPE_TWIST
|
||||
0x0076E7B0, // RIDE_TYPE_HAUNTED_HOUSE
|
||||
0x00762D44, // RIDE_TYPE_FIRST_AID
|
||||
0x0076F8D4, // RIDE_TYPE_CIRCUS_SHOW
|
||||
0x00770924, // RIDE_TYPE_GHOST_TRAIN
|
||||
0x008AB2A0, // RIDE_TYPE_TWISTER_ROLLER_COASTER
|
||||
0x008AC164, // RIDE_TYPE_WOODEN_ROLLER_COASTER
|
||||
0x00778124, // RIDE_TYPE_SIDE_FRICTION_ROLLER_COASTER
|
||||
0x0078AE80, // RIDE_TYPE_WILD_MOUSE
|
||||
0x00792978, // RIDE_TYPE_MULTI_DIMENSION_ROLLER_COASTER
|
||||
0x00792978, // RIDE_TYPE_38
|
||||
0x007C6C00, // RIDE_TYPE_FLYING_ROLLER_COASTER
|
||||
0x007C6C00, // RIDE_TYPE_3A
|
||||
0x00811184, // RIDE_TYPE_VIRGINIA_REEL
|
||||
0x008164AC, // RIDE_TYPE_SPLASH_BOATS
|
||||
0x0081F268, // RIDE_TYPE_MINI_HELICOPTERS
|
||||
0x008245A8, // RIDE_TYPE_LAY_DOWN_ROLLER_COASTER
|
||||
0x0086347C, // RIDE_TYPE_SUSPENDED_MONORAIL
|
||||
0x008245A8, // RIDE_TYPE_40
|
||||
0x0086E2F8, // RIDE_TYPE_REVERSER_ROLLER_COASTER
|
||||
0x00876618, // RIDE_TYPE_HEARTLINE_TWISTER_COASTER
|
||||
0x0087EDC4, // RIDE_TYPE_MINI_GOLF
|
||||
0x008AD280, // RIDE_TYPE_GIGA_COASTER
|
||||
0x00886074, // RIDE_TYPE_ROTO_DROP
|
||||
0x00887208, // RIDE_TYPE_FLYING_SAUCERS
|
||||
0x00889C28, // RIDE_TYPE_CROOKED_HOUSE
|
||||
0x0088AC88, // RIDE_TYPE_MONORAIL_CYCLES
|
||||
0x008AE36C, // RIDE_TYPE_COMPACT_INVERTED_COASTER
|
||||
0x008AEDE0, // RIDE_TYPE_WATER_COASTER
|
||||
0x008AF764, // RIDE_TYPE_AIR_POWERED_VERTICAL_COASTER
|
||||
0x00890940, // RIDE_TYPE_INVERTED_HAIRPIN_COASTER
|
||||
0x00898384, // RIDE_TYPE_MAGIC_CARPET
|
||||
0x008995D4, // RIDE_TYPE_SUBMARINE_RIDE
|
||||
0x0089B0C0, // RIDE_TYPE_RIVER_RAFTS
|
||||
0x00761160, // RIDE_TYPE_50
|
||||
0x008A13B4, // RIDE_TYPE_ENTERPRISE
|
||||
0x00761160, // RIDE_TYPE_52
|
||||
0x00761160, // RIDE_TYPE_53
|
||||
0x00761160, // RIDE_TYPE_54
|
||||
0x00000000, // RIDE_TYPE_55
|
||||
0x008B005C, // RIDE_TYPE_INVERTED_IMPULSE_COASTER
|
||||
0x008A46D8, // RIDE_TYPE_MINI_ROLLER_COASTER
|
||||
0x008B0610, // RIDE_TYPE_MINE_RIDE
|
||||
0x00000000, // RIDE_TYPE_59
|
||||
0x008A5F6C, // RIDE_TYPE_LIM_LAUNCHED_ROLLER_COASTER
|
||||
};
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
*****************************************************************************/
|
||||
|
||||
#include "../common.h"
|
||||
#include "track.h"
|
||||
|
||||
// 0x009968BB, 0x009968BC, 0x009968BD, 0x009968BF, 0x009968C1, 0x009968C3
|
||||
extern const rct_track_coordinates TrackCoordinates[256];
|
||||
@@ -38,3 +39,5 @@ typedef struct {
|
||||
|
||||
extern const track_curve_chain gTrackCurveChain[256];
|
||||
extern const track_curve_chain gFlatRideTrackCurveChain[256];
|
||||
|
||||
extern const uint32 RideTypeTrackPaintFunctions[91];
|
||||
|
||||
Reference in New Issue
Block a user