1
0
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:
IntelOrca
2015-07-17 17:18:01 +01:00
parent a6c71c61ce
commit 74dc18b062
3 changed files with 169 additions and 4 deletions

View File

@@ -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);
}
}

View File

@@ -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
};

View File

@@ -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];