From 74dc18b062bd49fef78480843f04850398db9799 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Fri, 17 Jul 2015 17:18:01 +0100 Subject: [PATCH] implement viewport_track_paint_setup --- src/interface/viewport.c | 76 ++++++++++++++++++++++++++++++-- src/ride/track_data.c | 94 ++++++++++++++++++++++++++++++++++++++++ src/ride/track_data.h | 3 ++ 3 files changed, 169 insertions(+), 4 deletions(-) diff --git a/src/interface/viewport.c b/src/interface/viewport.c index a1d33730e9..7d5f902b3e 100644 --- a/src/interface/viewport.c +++ b/src/interface/viewport.c @@ -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); } } diff --git a/src/ride/track_data.c b/src/ride/track_data.c index c29975e447..cc81434b26 100644 --- a/src/ride/track_data.c +++ b/src/ride/track_data.c @@ -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 +}; diff --git a/src/ride/track_data.h b/src/ride/track_data.h index e477642fa2..1a6010df89 100644 --- a/src/ride/track_data.h +++ b/src/ride/track_data.h @@ -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];