From a0f041b43a4909587719a75eea286b998f4c428b Mon Sep 17 00:00:00 2001 From: Ted John Date: Fri, 7 Oct 2016 21:49:23 +0100 Subject: [PATCH] Start initial generation of ride and general support calls --- test/testpaint/data.c | 259 ++++++++++++++++++++++++++ test/testpaint/data.h | 1 + test/testpaint/generate.cpp | 252 +++++++++++++++++++++++++ test/testpaint/intercept.h | 2 + test/testpaint/main.cpp | 12 ++ test/testpaint/testpaint.vcxproj | 1 + test/testpaint/testpaint.vcxproj.user | 3 +- 7 files changed, 529 insertions(+), 1 deletion(-) create mode 100644 test/testpaint/generate.cpp diff --git a/test/testpaint/data.c b/test/testpaint/data.c index 39b98da4a8..c4126693df 100644 --- a/test/testpaint/data.c +++ b/test/testpaint/data.c @@ -626,3 +626,262 @@ const utf8string FlatTrackNames[256] = { "", "", }; + +const utf8string TrackElemNames[] = { + "TRACK_ELEM_FLAT", + "TRACK_ELEM_END_STATION", + "TRACK_ELEM_BEGIN_STATION", + "TRACK_ELEM_MIDDLE_STATION", + "TRACK_ELEM_25_DEG_UP", + "TRACK_ELEM_60_DEG_UP", + "TRACK_ELEM_FLAT_TO_25_DEG_UP", + "TRACK_ELEM_25_DEG_UP_TO_60_DEG_UP", + "TRACK_ELEM_60_DEG_UP_TO_25_DEG_UP", + "TRACK_ELEM_25_DEG_UP_TO_FLAT", + "TRACK_ELEM_25_DEG_DOWN", + "TRACK_ELEM_60_DEG_DOWN", + "TRACK_ELEM_FLAT_TO_25_DEG_DOWN", + "TRACK_ELEM_25_DEG_DOWN_TO_60_DEG_DOWN", + "TRACK_ELEM_60_DEG_DOWN_TO_25_DEG_DOWN", + "TRACK_ELEM_25_DEG_DOWN_TO_FLAT", + "TRACK_ELEM_LEFT_QUARTER_TURN_5_TILES", + "TRACK_ELEM_RIGHT_QUARTER_TURN_5_TILES", + "TRACK_ELEM_FLAT_TO_LEFT_BANK", + "TRACK_ELEM_FLAT_TO_RIGHT_BANK", + "TRACK_ELEM_LEFT_BANK_TO_FLAT", + "TRACK_ELEM_RIGHT_BANK_TO_FLAT", + "TRACK_ELEM_BANKED_LEFT_QUARTER_TURN_5_TILES", + "TRACK_ELEM_BANKED_RIGHT_QUARTER_TURN_5_TILES", + "TRACK_ELEM_LEFT_BANK_TO_25_DEG_UP", + "TRACK_ELEM_RIGHT_BANK_TO_25_DEG_UP", + "TRACK_ELEM_25_DEG_UP_TO_LEFT_BANK", + "TRACK_ELEM_25_DEG_UP_TO_RIGHT_BANK", + "TRACK_ELEM_LEFT_BANK_TO_25_DEG_DOWN", + "TRACK_ELEM_RIGHT_BANK_TO_25_DEG_DOWN", + "TRACK_ELEM_25_DEG_DOWN_TO_LEFT_BANK", + "TRACK_ELEM_25_DEG_DOWN_TO_RIGHT_BANK", + "TRACK_ELEM_LEFT_BANK", + "TRACK_ELEM_RIGHT_BANK", + "TRACK_ELEM_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP", + "TRACK_ELEM_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP", + "TRACK_ELEM_LEFT_QUARTER_TURN_5_TILES_25_DEG_DOWN", + "TRACK_ELEM_RIGHT_QUARTER_TURN_5_TILES_25_DEG_DOWN", + "TRACK_ELEM_S_BEND_LEFT", + "TRACK_ELEM_S_BEND_RIGHT", + "TRACK_ELEM_LEFT_VERTICAL_LOOP", + "TRACK_ELEM_RIGHT_VERTICAL_LOOP", + "TRACK_ELEM_LEFT_QUARTER_TURN_3_TILES", + "TRACK_ELEM_RIGHT_QUARTER_TURN_3_TILES", + "TRACK_ELEM_LEFT_QUARTER_TURN_3_TILES_BANK", + "TRACK_ELEM_RIGHT_QUARTER_TURN_3_TILES_BANK", + "TRACK_ELEM_LEFT_QUARTER_TURN_3_TILES_25_DEG_UP", + "TRACK_ELEM_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP", + "TRACK_ELEM_LEFT_QUARTER_TURN_3_TILES_25_DEG_DOWN", + "TRACK_ELEM_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN", + "TRACK_ELEM_LEFT_QUARTER_TURN_1_TILE", + "TRACK_ELEM_RIGHT_QUARTER_TURN_1_TILE", + "TRACK_ELEM_LEFT_TWIST_DOWN_TO_UP", + "TRACK_ELEM_RIGHT_TWIST_DOWN_TO_UP", + "TRACK_ELEM_LEFT_TWIST_UP_TO_DOWN", + "TRACK_ELEM_RIGHT_TWIST_UP_TO_DOWN", + "TRACK_ELEM_HALF_LOOP_UP", + "TRACK_ELEM_HALF_LOOP_DOWN", + "TRACK_ELEM_LEFT_CORKSCREW_UP", + "TRACK_ELEM_RIGHT_CORKSCREW_UP", + "TRACK_ELEM_LEFT_CORKSCREW_DOWN", + "TRACK_ELEM_RIGHT_CORKSCREW_DOWN", + "TRACK_ELEM_FLAT_TO_60_DEG_UP", + "TRACK_ELEM_60_DEG_UP_TO_FLAT", + "TRACK_ELEM_FLAT_TO_60_DEG_DOWN", + "TRACK_ELEM_60_DEG_DOWN_TO_FLAT", + "TRACK_ELEM_TOWER_BASE", + "TRACK_ELEM_TOWER_SECTION", + "TRACK_ELEM_FLAT_COVERED", + "TRACK_ELEM_25_DEG_UP_COVERED", + "TRACK_ELEM_60_DEG_UP_COVERED", + "TRACK_ELEM_FLAT_TO_25_DEG_UP_COVERED", + "TRACK_ELEM_25_DEG_UP_TO_60_DEG_UP_COVERED", + "TRACK_ELEM_60_DEG_UP_TO_25_DEG_UP_COVERED", + "TRACK_ELEM_25_DEG_UP_TO_FLAT_COVERED", + "TRACK_ELEM_25_DEG_DOWN_COVERED", + "TRACK_ELEM_60_DEG_DOWN_COVERED", + "TRACK_ELEM_FLAT_TO_25_DEG_DOWN_COVERED", + "TRACK_ELEM_25_DEG_DOWN_TO_60_DEG_DOWN_COVERED", + "TRACK_ELEM_60_DEG_DOWN_TO_25_DEG_DOWN_COVERED", + "TRACK_ELEM_25_DEG_DOWN_TO_FLAT_COVERED", + "TRACK_ELEM_LEFT_QUARTER_TURN_5_TILES_COVERED", + "TRACK_ELEM_RIGHT_QUARTER_TURN_5_TILES_COVERED", + "TRACK_ELEM_S_BEND_LEFT_COVERED", + "TRACK_ELEM_S_BEND_RIGHT_COVERED", + "TRACK_ELEM_LEFT_QUARTER_TURN_3_TILES_COVERED", + "TRACK_ELEM_RIGHT_QUARTER_TURN_3_TILES_COVERED", + "TRACK_ELEM_LEFT_HALF_BANKED_HELIX_UP_SMALL", + "TRACK_ELEM_RIGHT_HALF_BANKED_HELIX_UP_SMALL", + "TRACK_ELEM_LEFT_HALF_BANKED_HELIX_DOWN_SMALL", + "TRACK_ELEM_RIGHT_HALF_BANKED_HELIX_DOWN_SMALL", + "TRACK_ELEM_LEFT_HALF_BANKED_HELIX_UP_LARGE", + "TRACK_ELEM_RIGHT_HALF_BANKED_HELIX_UP_LARGE", + "TRACK_ELEM_LEFT_HALF_BANKED_HELIX_DOWN_LARGE", + "TRACK_ELEM_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE", + "TRACK_ELEM_LEFT_QUARTER_TURN_1_TILE_60_DEG_UP", + "TRACK_ELEM_RIGHT_QUARTER_TURN_1_TILE_60_DEG_UP", + "TRACK_ELEM_LEFT_QUARTER_TURN_1_TILE_60_DEG_DOWN", + "TRACK_ELEM_RIGHT_QUARTER_TURN_1_TILE_60_DEG_DOWN", + "TRACK_ELEM_BRAKES", + "TRACK_ELEM_ROTATION_CONTROL_TOGGLE", + "TRACK_ELEM_INVERTED_90_DEG_UP_TO_FLAT_QUARTER_LOOP", + "TRACK_ELEM_MAZE", + "TRACK_ELEM_LEFT_QUARTER_BANKED_HELIX_LARGE_UP", + "TRACK_ELEM_RIGHT_QUARTER_BANKED_HELIX_LARGE_UP", + "TRACK_ELEM_LEFT_QUARTER_BANKED_HELIX_LARGE_DOWN", + "TRACK_ELEM_RIGHT_QUARTER_BANKED_HELIX_LARGE_DOWN", + "TRACK_ELEM_LEFT_QUARTER_HELIX_LARGE_UP", + "TRACK_ELEM_RIGHT_QUARTER_HELIX_LARGE_UP", + "TRACK_ELEM_LEFT_QUARTER_HELIX_LARGE_DOWN", + "TRACK_ELEM_RIGHT_QUARTER_HELIX_LARGE_DOWN", + "TRACK_ELEM_25_DEG_UP_LEFT_BANKED", + "TRACK_ELEM_25_DEG_UP_RIGHT_BANKED", + "TRACK_ELEM_WATERFALL", + "TRACK_ELEM_RAPIDS", + "TRACK_ELEM_ON_RIDE_PHOTO", + "TRACK_ELEM_25_DEG_DOWN_LEFT_BANKED", + "TRACK_ELEM_25_DEG_DOWN_RIGHT_BANKED", + "TRACK_ELEM_WATER_SPLASH", + "TRACK_ELEM_FLAT_TO_60_DEG_UP_LONG_BASE", + "TRACK_ELEM_60_DEG_UP_TO_FLAT_LONG_BASE", + "TRACK_ELEM_WHIRLPOOL", + "TRACK_ELEM_FLAT_TO_60_DEG_DOWN_LONG_BASE", + "TRACK_ELEM_60_DEG_UP_TO_FLAT_LONG_BASE_122", + "TRACK_ELEM_CABLE_LIFT_HILL", + "TRACK_ELEM_REVERSE_WHOA_BELLY_SLOPE", + "TRACK_ELEM_REVERSE_WHOA_BELLY_VERTICAL", + "TRACK_ELEM_90_DEG_UP", + "TRACK_ELEM_90_DEG_DOWN", + "TRACK_ELEM_60_DEG_UP_TO_90_DEG_UP", + "TRACK_ELEM_90_DEG_DOWN_TO_60_DEG_DOWN", + "TRACK_ELEM_90_DEG_UP_TO_60_DEG_UP", + "TRACK_ELEM_60_DEG_DOWN_TO_90_DEG_DOWN", + "TRACK_ELEM_BRAKE_FOR_DROP", + "TRACK_ELEM_LEFT_EIGHTH_TO_DIAG", + "TRACK_ELEM_RIGHT_EIGHTH_TO_DIAG", + "TRACK_ELEM_LEFT_EIGHTH_TO_ORTHOGONAL", + "TRACK_ELEM_RIGHT_EIGHTH_TO_ORTHOGONAL", + "TRACK_ELEM_LEFT_EIGHTH_BANK_TO_DIAG", + "TRACK_ELEM_RIGHT_EIGHTH_BANK_TO_DIAG", + "TRACK_ELEM_LEFT_EIGHTH_BANK_TO_ORTHOGONAL", + "TRACK_ELEM_RIGHT_EIGHTH_BANK_TO_ORTHOGONAL", + "TRACK_ELEM_DIAG_FLAT", + "TRACK_ELEM_DIAG_25_DEG_UP", + "TRACK_ELEM_DIAG_60_DEG_UP", + "TRACK_ELEM_DIAG_FLAT_TO_25_DEG_UP", + "TRACK_ELEM_DIAG_25_DEG_UP_TO_60_DEG_UP", + "TRACK_ELEM_DIAG_60_DEG_UP_TO_25_DEG_UP", + "TRACK_ELEM_DIAG_25_DEG_UP_TO_FLAT", + "TRACK_ELEM_DIAG_25_DEG_DOWN", + "TRACK_ELEM_DIAG_60_DEG_DOWN", + "TRACK_ELEM_DIAG_FLAT_TO_25_DEG_DOWN", + "TRACK_ELEM_DIAG_25_DEG_DOWN_TO_60_DEG_DOWN", + "TRACK_ELEM_DIAG_60_DEG_DOWN_TO_25_DEG_DOWN", + "TRACK_ELEM_DIAG_25_DEG_DOWN_TO_FLAT", + "TRACK_ELEM_DIAG_FLAT_TO_60_DEG_UP", + "TRACK_ELEM_DIAG_60_DEG_UP_TO_FLAT", + "TRACK_ELEM_DIAG_FLAT_TO_60_DEG_DOWN", + "TRACK_ELEM_DIAG_60_DEG_DOWN_TO_FLAT", + "TRACK_ELEM_DIAG_FLAT_TO_LEFT_BANK", + "TRACK_ELEM_DIAG_FLAT_TO_RIGHT_BANK", + "TRACK_ELEM_DIAG_LEFT_BANK_TO_FLAT", + "TRACK_ELEM_DIAG_RIGHT_BANK_TO_FLAT", + "TRACK_ELEM_DIAG_LEFT_BANK_TO_25_DEG_UP", + "TRACK_ELEM_DIAG_RIGHT_BANK_TO_25_DEG_UP", + "TRACK_ELEM_DIAG_25_DEG_UP_TO_LEFT_BANK", + "TRACK_ELEM_DIAG_25_DEG_UP_TO_RIGHT_BANK", + "TRACK_ELEM_DIAG_LEFT_BANK_TO_25_DEG_DOWN", + "TRACK_ELEM_DIAG_RIGHT_BANK_TO_25_DEG_DOWN", + "TRACK_ELEM_DIAG_25_DEG_DOWN_TO_LEFT_BANK", + "TRACK_ELEM_DIAG_25_DEG_DOWN_TO_RIGHT_BANK", + "TRACK_ELEM_DIAG_LEFT_BANK", + "TRACK_ELEM_DIAG_RIGHT_BANK", + "TRACK_ELEM_LOG_FLUME_REVERSER", + "TRACK_ELEM_SPINNING_TUNNEL", + "TRACK_ELEM_LEFT_BARREL_ROLL_UP_TO_DOWN", + "TRACK_ELEM_RIGHT_BARREL_ROLL_UP_TO_DOWN", + "TRACK_ELEM_LEFT_BARREL_ROLL_DOWN_TO_UP", + "TRACK_ELEM_RIGHT_BARREL_ROLL_DOWN_TO_UP", + "TRACK_ELEM_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_TILES_25_DEG_UP", + "TRACK_ELEM_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP", + "TRACK_ELEM_LEFT_QUARTER_TURN_3_TILES_25_DEG_DOWN_TO_LEFT_BANK", + "TRACK_ELEM_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN_TO_RIGHT_BANK", + "TRACK_ELEM_POWERED_LIFT", + "TRACK_ELEM_LEFT_LARGE_HALF_LOOP_UP", + "TRACK_ELEM_RIGHT_LARGE_HALF_LOOP_UP", + "TRACK_ELEM_RIGHT_LARGE_HALF_LOOP_DOWN", + "TRACK_ELEM_LEFT_LARGE_HALF_LOOP_DOWN", + "TRACK_ELEM_LEFT_FLYER_TWIST_UP", + "TRACK_ELEM_RIGHT_FLYER_TWIST_UP", + "TRACK_ELEM_LEFT_FLYER_TWIST_DOWN", + "TRACK_ELEM_RIGHT_FLYER_TWIST_DOWN", + "TRACK_ELEM_FLYER_HALF_LOOP_UP", + "TRACK_ELEM_FLYER_HALF_LOOP_DOWN", + "TRACK_ELEM_LEFT_FLYER_CORKSCREW_UP", + "TRACK_ELEM_RIGHT_FLYER_CORKSCREW_UP", + "TRACK_ELEM_LEFT_FLYER_CORKSCREW_DOWN", + "TRACK_ELEM_RIGHT_FLYER_CORKSCREW_DOWN", + "TRACK_ELEM_HEARTLINE_TRANSFER_UP", + "TRACK_ELEM_HEARTLINE_TRANSFER_DOWN", + "TRACK_ELEM_LEFT_HEARTLINE_ROLL", + "TRACK_ELEM_RIGHT_HEARTLINE_ROLL", + "TRACK_ELEM_MINI_GOLF_HOLE_A", + "TRACK_ELEM_MINI_GOLF_HOLE_B", + "TRACK_ELEM_MINI_GOLF_HOLE_C", + "TRACK_ELEM_MINI_GOLF_HOLE_D", + "TRACK_ELEM_MINI_GOLF_HOLE_E", + "TRACK_ELEM_MULTIDIM_INVERTED_FLAT_TO_90_DEG_QUARTER_LOOP_DOWN", + "TRACK_ELEM_90_DEG_TO_INVERTED_FLAT_QUARTER_LOOP_UP", + "TRACK_ELEM_INVERTED_FLAT_TO_90_DEG_QUARTER_LOOP_DOWN", + "TRACK_ELEM_LEFT_CURVED_LIFT_HILL", + "TRACK_ELEM_RIGHT_CURVED_LIFT_HILL", + "TRACK_ELEM_LEFT_REVERSER", + "TRACK_ELEM_RIGHT_REVERSER", + "TRACK_ELEM_AIR_THRUST_TOP_CAP", + "TRACK_ELEM_AIR_THRUST_VERTICAL_DOWN", + "TRACK_ELEM_AIR_THRUST_VERTICAL_DOWN_TO_LEVEL", + "TRACK_ELEM_BLOCK_BRAKES", + "TRACK_ELEM_LEFT_BANKED_QUARTER_TURN_3_TILE_25_DEG_UP", + "TRACK_ELEM_RIGHT_BANKED_QUARTER_TURN_3_TILE_25_DEG_UP", + "TRACK_ELEM_LEFT_BANKED_QUARTER_TURN_3_TILE_25_DEG_DOWN", + "TRACK_ELEM_RIGHT_BANKED_QUARTER_TURN_3_TILE_25_DEG_DOWN", + "TRACK_ELEM_LEFT_BANKED_QUARTER_TURN_5_TILE_25_DEG_UP", + "TRACK_ELEM_RIGHT_BANKED_QUARTER_TURN_5_TILE_25_DEG_UP", + "TRACK_ELEM_LEFT_BANKED_QUARTER_TURN_5_TILE_25_DEG_DOWN", + "TRACK_ELEM_RIGHT_BANKED_QUARTER_TURN_5_TILE_25_DEG_DOWN", + "TRACK_ELEM_25_DEG_UP_TO_LEFT_BANKED_25_DEG_UP", + "TRACK_ELEM_25_DEG_UP_TO_RIGHT_BANKED_25_DEG_UP", + "TRACK_ELEM_LEFT_BANKED_25_DEG_UP_TO_25_DEG_UP", + "TRACK_ELEM_RIGHT_BANKED_25_DEG_UP_TO_25_DEG_UP", + "TRACK_ELEM_25_DEG_DOWN_TO_LEFT_BANKED_25_DEG_DOWN", + "TRACK_ELEM_25_DEG_DOWN_TO_RIGHT_BANKED_25_DEG_DOWN", + "TRACK_ELEM_LEFT_BANKED_25_DEG_DOWN_TO_25_DEG_DOWN", + "TRACK_ELEM_RIGHT_BANKED_25_DEG_DOWN_TO_25_DEG_DOWN", + "TRACK_ELEM_LEFT_BANKED_FLAT_TO_LEFT_BANKED_25_DEG_UP", + "TRACK_ELEM_RIGHT_BANKED_FLAT_TO_RIGHT_BANKED_25_DEG_UP", + "TRACK_ELEM_LEFT_BANKED_25_DEG_UP_TO_LEFT_BANKED_FLAT", + "TRACK_ELEM_RIGHT_BANKED_25_DEG_UP_TO_RIGHT_BANKED_FLAT", + "TRACK_ELEM_LEFT_BANKED_FLAT_TO_LEFT_BANKED_25_DEG_DOWN", + "TRACK_ELEM_RIGHT_BANKED_FLAT_TO_RIGHT_BANKED_25_DEG_DOWN", + "TRACK_ELEM_LEFT_BANKED_25_DEG_DOWN_TO_LEFT_BANKED_FLAT", + "TRACK_ELEM_RIGHT_BANKED_25_DEG_DOWN_TO_RIGHT_BANKED_FLAT", + "TRACK_ELEM_FLAT_TO_LEFT_BANKED_25_DEG_UP", + "TRACK_ELEM_FLAT_TO_RIGHT_BANKED_25_DEG_UP", + "TRACK_ELEM_LEFT_BANKED_25_DEG_UP_TO_FLAT", + "TRACK_ELEM_RIGHT_BANKED_25_DEG_UP_TO_FLAT", + "TRACK_ELEM_FLAT_TO_LEFT_BANKED_25_DEG_DOWN", + "TRACK_ELEM_FLAT_TO_RIGHT_BANKED_25_DEG_DOWN", + "TRACK_ELEM_LEFT_BANKED_25_DEG_DOWN_TO_FLAT", + "TRACK_ELEM_RIGHT_BANKED_25_DEG_DOWN_TO_FLAT", + "TRACK_ELEM_LEFT_QUARTER_TURN_1_TILE_90_DEG_UP", + "TRACK_ELEM_RIGHT_QUARTER_TURN_1_TILE_90_DEG_UP", + "TRACK_ELEM_LEFT_QUARTER_TURN_1_TILE_90_DEG_DOWN", + "TRACK_ELEM_RIGHT_QUARTER_TURN_1_TILE_90_DEG_DOWN", + "TRACK_ELEM_MULTIDIM_90_DEG_UP_TO_INVERTED_FLAT_QUARTER_LOOP", + "TRACK_ELEM_MULTIDIM_FLAT_TO_90_DEG_DOWN_QUARTER_LOOP", +}; diff --git a/test/testpaint/data.h b/test/testpaint/data.h index 9e685786ed..c2f4897ceb 100644 --- a/test/testpaint/data.h +++ b/test/testpaint/data.h @@ -22,5 +22,6 @@ extern const utf8string RideNames[91]; extern const utf8string TrackNames[256]; extern const utf8string FlatTrackNames[256]; +extern const utf8string TrackElemNames[256]; #endif // #endif _TEST_PAINT_DATA_H_ diff --git a/test/testpaint/generate.cpp b/test/testpaint/generate.cpp new file mode 100644 index 0000000000..3533ffa120 --- /dev/null +++ b/test/testpaint/generate.cpp @@ -0,0 +1,252 @@ +#pragma region Copyright (c) 2014-2016 OpenRCT2 Developers +/***************************************************************************** + * OpenRCT2, an open source clone of Roller Coaster Tycoon 2. + * + * OpenRCT2 is the work of many authors, a full list can be found in contributors.md + * For more information, visit https://github.com/OpenRCT2/OpenRCT2 + * + * OpenRCT2 is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * A full copy of the GNU General Public License can be found in licence.txt + *****************************************************************************/ +#pragma endregion + +#include +#include +#include + +extern "C" +{ + #include "data.h" + #include "intercept.h" + #include "../../src/interface/viewport.h" + #include "../../src/rct2.h" + #include "../../src/ride/ride.h" + #include "../../src/ride/ride_data.h" + #include "../../src/ride/track.h" + #include "../../src/ride/track_data.h" +} + +class PaintCodeGenerator +{ +public: + int Generate(uint8 rideType) + { + auto filename = "paint_" + std::to_string(rideType) + ".c"; + FILE * file = fopen(filename.c_str(), "w"); + if (file == nullptr) + { + fprintf(stderr, "Unable to save to ./%s\n", filename.c_str()); + return 1; + } + + _file = file; + _rideType = rideType; + _rideName = std::string(RideNames[rideType]); + Generate(); + + fclose(file); + return 0; + } + +private: + std::string _rideName; + uint8 _rideType; + FILE * _file; + + void Generate() + { + GenerateTrackFunctions(); + GenerateMainFunction(); + } + + void GenerateTrackFunctions() + { + for (int trackType = 0; trackType < 256; trackType++) + { + if (IsTrackTypeSupported(trackType)) + { + GenerateTrackFunction(trackType); + WriteLine(); + } + } + } + + void GenerateTrackFunction(int trackType) + { + std::string trackName = TrackNames[trackType]; + int numSequences = getTrackSequenceCount(_rideType, trackType); + int height = 48; + + WriteLine(0, "static void " + _rideName + "_track_" + trackName + "(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement)"); + WriteLine(0, "{"); + + support_height generalSupports[4] = { 0 }; + + for (int direction = 0; direction < 4; direction++) { + int trackSequence = 0; + + rct_map_element mapElement = { 0 }; + mapElement.flags |= MAP_ELEMENT_FLAG_LAST_TILE; + mapElement.properties.track.type = trackType; + mapElement.base_height = 3; + g_currently_drawn_item = &mapElement; + + CallOriginal(trackType, direction, trackSequence, height, &mapElement); + + generalSupports[direction] = gSupport; + } + + if (AllMatch(generalSupports, 4)) + { + WriteLine(1, "paint_util_set_general_support_height(height + %d, 0x%02X);", generalSupports[0].height - height, generalSupports[0].slope); + } + else + { + WriteLine(1, "#error Unsupported: different directional general supports"); + } + + WriteLine(0, "}"); + } + + template + bool AllMatch(T * arr, size_t count) + { + for (size_t i = 1; i < count; i++) + { + if (memcmp((const void *)&arr[i], (const void *)&arr[0], sizeof(T)) != 0) + { + return false; + } + } + return true; + } + + void CallOriginal(int trackType, int direction, int trackSequence, int height, rct_map_element *mapElement) + { + constexpr uint32 DEFAULT_SCHEME_TRACK = COLOUR_GREY << 19 | COLOUR_WHITE << 24 | 0xA0000000; + constexpr uint32 DEFAULT_SCHEME_SUPPORTS = COLOUR_LIGHT_BLUE << 19 | COLOUR_ICY_BLUE << 24 | 0xA0000000; + constexpr uint32 DEFAULT_SCHEME_MISC = COLOUR_DARK_PURPLE << 19 | COLOUR_LIGHT_PURPLE << 24 | 0xA0000000; + constexpr uint32 DEFAULT_SCHEME_3 = COLOUR_BRIGHT_PURPLE << 19 | COLOUR_DARK_BLUE << 24 | 0xA0000000; + + gPaintInteractionType = VIEWPORT_INTERACTION_ITEM_RIDE; + gTrackColours[SCHEME_TRACK] = DEFAULT_SCHEME_TRACK; + gTrackColours[SCHEME_SUPPORTS] = DEFAULT_SCHEME_SUPPORTS; + gTrackColours[SCHEME_MISC] = DEFAULT_SCHEME_MISC; + gTrackColours[SCHEME_3] = DEFAULT_SCHEME_3; + + rct_drawpixelinfo dpi = { 0 }; + dpi.zoom_level = 1; + unk_140E9A8 = &dpi; + + rct_ride ride = {0}; + + rct_ride_entry rideEntry = {0}; + rct_ride_entry_vehicle vehicleEntry { 0 }; + vehicleEntry.base_image_id = 0x70000; + rideEntry.vehicles[0] = vehicleEntry; + + gRideList[0] = ride; + gRideEntries[0] = &rideEntry; + + for (int s = 0; s < 9; ++s) + { + gSupportSegments[s].height = 0; + gSupportSegments[s].slope = 0xFF; + } + + gSupport.height = 0; + gSupport.slope = 0xFF; + g141E9DB = G141E9DB_FLAG_1 | G141E9DB_FLAG_2; + + uint32 *trackDirectionList = (uint32 *)RideTypeTrackPaintFunctionsOld[_rideType][trackType]; + // Have to call from this point as it pushes esi and expects callee to pop it + RCT2_CALLPROC_X( + 0x006C4934, + _rideType, + (int) trackDirectionList, + direction, + height, + (int) &mapElement, + 0 * sizeof(rct_ride), + trackSequence + ); + } + + void GenerateMainFunction() + { + WriteLine(0, "TRACK_PAINT_FUNCTION get_track_paint_function_" + _rideName + "(int trackType, int direction)"); + WriteLine(0, "{"); + WriteLine(1, "switch (trackType) {"); + for (int trackType = 0; trackType < 256; trackType++) + { + if (IsTrackTypeSupported(trackType)) + { + WriteLine(1, "case " + std::string(TrackElemNames[trackType]) + ":"); + WriteLine(2, "return NULL;"); + } + } + WriteLine(1, "}"); + WriteLine(1, "return NULL;"); + WriteLine(0, "}"); + } + + bool IsTrackTypeSupported(int trackType) + { + if (trackType == TRACK_ELEM_BEGIN_STATION || + trackType == TRACK_ELEM_MIDDLE_STATION || + trackType == TRACK_ELEM_END_STATION) + { + return false; + } + if (RideTypeTrackPaintFunctionsOld[_rideType][trackType] != 0) + { + return true; + } + return false; + } + + void WriteLine() + { + WriteLine(0, ""); + } + + void WriteLine(int tabs, const char * format, ...) + { + va_list args; + char buffer[512]; + + va_start(args, format); + vsprintf(buffer, format, args); + va_end(args); + + WriteLine(tabs, std::string(buffer)); + } + + void WriteLine(int tabs, std::string s) + { + for (int i = 0; i < tabs; i++) + { + fprintf(_file, "\t"); + } + fprintf(_file, s.c_str()); + fprintf(_file, "\n"); + } +}; + +extern "C" +{ + int generatePaintCode(uint8 rideType) + { + if (ride_type_has_flag(rideType, RIDE_TYPE_FLAG_FLAT_RIDE)) + { + fprintf(stderr, "Flat rides not supported.\n"); + } + + auto pcg = PaintCodeGenerator(); + return pcg.Generate(rideType); + } +} diff --git a/test/testpaint/intercept.h b/test/testpaint/intercept.h index 3d008443e7..a4ed85752c 100644 --- a/test/testpaint/intercept.h +++ b/test/testpaint/intercept.h @@ -32,4 +32,6 @@ bool testSupportSegments(uint8 rideType, uint8 trackType); bool testTunnels(uint8 rideType, uint8 trackType); bool testVerticalTunnels(uint8 rideType, uint8 trackType); +int generatePaintCode(uint8 rideType); + #endif // #endif _TEST_PAINT_INTERCEPT_H_ diff --git a/test/testpaint/main.cpp b/test/testpaint/main.cpp index 3824d3a229..2f6d079827 100644 --- a/test/testpaint/main.cpp +++ b/test/testpaint/main.cpp @@ -352,6 +352,7 @@ static void PrintRideTypes() int main(int argc, char *argv[]) { std::vector testCases; + bool generate = false; uint8 specificRideType = 0xFF; for (int i = 0; i < argc; ++i) { char *arg = argv[i]; @@ -367,6 +368,17 @@ int main(int argc, char *argv[]) { return 2; } } + else if (strcmp(arg, "--generate") == 0) { + generate = true; + } + } + + if (generate) { + if (specificRideType > 90) { + fprintf(stderr, "No ride or invalid ride specified.\n"); + return 1; + } + return generatePaintCode(specificRideType); } for (uint8 rideType = 0; rideType < 91; rideType++) { diff --git a/test/testpaint/testpaint.vcxproj b/test/testpaint/testpaint.vcxproj index a4d03fb714..281bccfa48 100644 --- a/test/testpaint/testpaint.vcxproj +++ b/test/testpaint/testpaint.vcxproj @@ -92,6 +92,7 @@ + diff --git a/test/testpaint/testpaint.vcxproj.user b/test/testpaint/testpaint.vcxproj.user index 2d0a6983e6..9d6e2bebff 100644 --- a/test/testpaint/testpaint.vcxproj.user +++ b/test/testpaint/testpaint.vcxproj.user @@ -4,8 +4,9 @@ $(TargetDir)\openrct2.exe $(TargetDir) WindowsLocalDebugger + --ride-type 88 --generate - true + false \ No newline at end of file