Implemented tables for top spin paint setup

This commit is contained in:
duncanspumpkin 2015-10-18 19:03:51 +01:00
parent f233f5c498
commit 330b6b5524
7 changed files with 355 additions and 30 deletions

View File

@ -94,6 +94,7 @@
<ClCompile Include="..\src\ride\station.c" />
<ClCompile Include="..\src\ride\track.c" />
<ClCompile Include="..\src\ride\track_data.c" />
<ClCompile Include="..\src\ride\track_paint.c" />
<ClCompile Include="..\src\ride\vehicle.c" />
<ClCompile Include="..\src\scenario.c" />
<ClCompile Include="..\src\scenario_list.c" />
@ -250,6 +251,7 @@
<ClInclude Include="..\src\ride\station.h" />
<ClInclude Include="..\src\ride\track.h" />
<ClInclude Include="..\src\ride\track_data.h" />
<ClInclude Include="..\src\ride\track_paint.h" />
<ClInclude Include="..\src\ride\vehicle.h" />
<ClInclude Include="..\src\scenario.h" />
<ClInclude Include="..\src\sprites.h" />

View File

@ -540,6 +540,9 @@
<ClCompile Include="..\src\localisation\language.cpp">
<Filter>Source\Localisation</Filter>
</ClCompile>
<ClCompile Include="..\src\ride\track_paint.c">
<Filter>Source\Ride</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\src\management\award.h">
@ -806,5 +809,8 @@
<ClInclude Include="..\src\core\Math.hpp">
<Filter>Source\Core</Filter>
</ClInclude>
<ClInclude Include="..\src\ride\track_paint.h">
<Filter>Source\Ride</Filter>
</ClInclude>
</ItemGroup>
</Project>

View File

@ -24,6 +24,7 @@
#include "../localisation/localisation.h"
#include "../ride/ride_data.h"
#include "../ride/track_data.h"
#include "../ride/track_paint.h"
#include "../sprites.h"
#include "../world/map.h"
#include "../world/sprite.h"
@ -1373,16 +1374,7 @@ void viewport_track_paint_setup(uint8 direction, int height, rct_map_element *ma
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
);
sub_98197C(16, 0, ebx, 16, height + ax + 3, 1, 1, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32));
}
}
@ -1398,28 +1390,34 @@ void viewport_track_paint_setup(uint8 direction, int height, rct_map_element *ma
RCT2_GLOBAL(0x00F441A4, uint32) = 0x21600000;
}
if (mapElement->flags & MAP_ELEMENT_FLAG_GHOST) {
uint32 meh = RCT2_ADDRESS(0x00993CC4, uint32)[RCT2_GLOBAL(0x009AACBF, uint8)];
uint32 ghost_id = RCT2_ADDRESS(0x00993CC4, uint32)[RCT2_GLOBAL(0x009AACBF, uint8)];
RCT2_GLOBAL(RCT2_ADDRESS_PAINT_SETUP_CURRENT_TYPE, uint8) = 0;
RCT2_GLOBAL(0x00F44198, uint32) = meh;
RCT2_GLOBAL(0x00F4419C, uint32) = meh;
RCT2_GLOBAL(0x00F441A0, uint32) = meh;
RCT2_GLOBAL(0x00F441A4, uint32) = meh;
RCT2_GLOBAL(0x00F44198, uint32) = ghost_id;
RCT2_GLOBAL(0x00F4419C, uint32) = ghost_id;
RCT2_GLOBAL(0x00F441A0, uint32) = ghost_id;
RCT2_GLOBAL(0x00F441A4, uint32) = ghost_id;
}
uint32 **trackTypeList = (uint32**)RideTypeTrackPaintFunctions[ride->type];
uint32 *trackDirectionList = trackTypeList[trackType];
TRACK_PAINT_FUNCTION ***trackTypeList = (TRACK_PAINT_FUNCTION***)RideTypeTrackPaintFunctionsOld[ride->type];
if (trackTypeList == NULL) {
trackTypeList = (TRACK_PAINT_FUNCTION***)RideTypeTrackPaintFunctions[ride->type];
trackTypeList[trackType][direction](rideIndex, trackSequence, direction, height, mapElement);
}
else {
uint32 *trackDirectionList = (uint32*)trackTypeList[trackType];
// Have to call from this point as it pushes esi and expects callee to pop it
RCT2_CALLPROC_X(
0x006C4934,
ride->type,
(int)trackDirectionList,
direction,
height,
(int)mapElement,
rideIndex * sizeof(rct_ride),
trackSequence
);
// Have to call from this point as it pushes esi and expects callee to pop it
RCT2_CALLPROC_X(
0x006C4934,
ride->type,
(int)trackDirectionList,
direction,
height,
(int)mapElement,
rideIndex * sizeof(rct_ride),
trackSequence
);
}
}
if (isEntranceStyleNone) {

View File

@ -20,6 +20,7 @@
#include "track.h"
#include "track_data.h"
#include "track_paint.h"
const rct_track_coordinates* FlatTrackCoordinates = RCT2_ADDRESS(0x009972BB, const rct_track_coordinates);
@ -5469,7 +5470,7 @@ const track_curve_chain gFlatRideTrackCurveChain[256] = {
{ 0, 57088 },
};
const uint32 RideTypeTrackPaintFunctions[91] = {
const uint32 RideTypeTrackPaintFunctionsOld[91] = {
0x008A42F4, // RIDE_TYPE_SPIRAL_ROLLER_COASTER
0x008A6DB0, // RIDE_TYPE_STAND_UP_ROLLER_COASTER
0x008A85E4, // RIDE_TYPE_SUSPENDED_SWINGING_COASTER
@ -5510,7 +5511,7 @@ const uint32 RideTypeTrackPaintFunctions[91] = {
0x008A8CC8, // RIDE_TYPE_FERRIS_WHEEL
0x00763520, // RIDE_TYPE_MOTION_SIMULATOR
0x0076554C, // RIDE_TYPE_3D_CINEMA
0x0076659C, // RIDE_TYPE_TOP_SPIN
0, // RIDE_TYPE_TOP_SPIN
0x00767A40, // RIDE_TYPE_SPACE_RINGS
0x00768BAC, // RIDE_TYPE_REVERSE_FREEFALL_COASTER
0x0076C5BC, // RIDE_TYPE_LIFT
@ -5562,3 +5563,98 @@ const uint32 RideTypeTrackPaintFunctions[91] = {
0x00000000, // RIDE_TYPE_59
0x008A5F6C, // RIDE_TYPE_LIM_LAUNCHED_ROLLER_COASTER
};
const uint32 RideTypeTrackPaintFunctions[91] = {
0, // RIDE_TYPE_SPIRAL_ROLLER_COASTER
0, // RIDE_TYPE_STAND_UP_ROLLER_COASTER
0, // RIDE_TYPE_SUSPENDED_SWINGING_COASTER
0, // RIDE_TYPE_INVERTED_ROLLER_COASTER
0, // RIDE_TYPE_JUNIOR_ROLLER_COASTER
0, // RIDE_TYPE_MINIATURE_RAILWAY
0, // RIDE_TYPE_MONORAIL
0, // RIDE_TYPE_MINI_SUSPENDED_COASTER
0, // RIDE_TYPE_BOAT_RIDE
0, // RIDE_TYPE_WOODEN_WILD_MOUSE
0, // RIDE_TYPE_STEEPLECHASE
0, // RIDE_TYPE_CAR_RIDE
0, // RIDE_TYPE_LAUNCHED_FREEFALL
0, // RIDE_TYPE_BOBSLEIGH_COASTER
0, // RIDE_TYPE_OBSERVATION_TOWER
0, // RIDE_TYPE_LOOPING_ROLLER_COASTER
0, // RIDE_TYPE_DINGHY_SLIDE
0, // RIDE_TYPE_MINE_TRAIN_COASTER
0, // RIDE_TYPE_CHAIRLIFT
0, // RIDE_TYPE_CORKSCREW_ROLLER_COASTER
0, // RIDE_TYPE_MAZE
0, // RIDE_TYPE_SPIRAL_SLIDE
0, // RIDE_TYPE_GO_KARTS
0, // RIDE_TYPE_LOG_FLUME
0, // RIDE_TYPE_RIVER_RAPIDS
0, // RIDE_TYPE_DODGEMS
0, // RIDE_TYPE_PIRATE_SHIP
0, // RIDE_TYPE_SWINGING_INVERTER_SHIP
0, // RIDE_TYPE_FOOD_STALL
0, // RIDE_TYPE_1D
0, // RIDE_TYPE_DRINK_STALL
0, // RIDE_TYPE_1F
0, // RIDE_TYPE_SHOP
0, // RIDE_TYPE_MERRY_GO_ROUND
0, // RIDE_TYPE_22
0, // RIDE_TYPE_INFORMATION_KIOSK
0, // RIDE_TYPE_TOILETS
0, // RIDE_TYPE_FERRIS_WHEEL
0, // RIDE_TYPE_MOTION_SIMULATOR
0, // RIDE_TYPE_3D_CINEMA
(uint32)top_spin_track_paint_functions, // RIDE_TYPE_TOP_SPIN
0, // RIDE_TYPE_SPACE_RINGS
0, // RIDE_TYPE_REVERSE_FREEFALL_COASTER
0, // RIDE_TYPE_LIFT
0, // RIDE_TYPE_VERTICAL_DROP_ROLLER_COASTER
0, // RIDE_TYPE_CASH_MACHINE
0, // RIDE_TYPE_TWIST
0, // RIDE_TYPE_HAUNTED_HOUSE
0, // RIDE_TYPE_FIRST_AID
0, // RIDE_TYPE_CIRCUS_SHOW
0, // RIDE_TYPE_GHOST_TRAIN
0, // RIDE_TYPE_TWISTER_ROLLER_COASTER
0, // RIDE_TYPE_WOODEN_ROLLER_COASTER
0, // RIDE_TYPE_SIDE_FRICTION_ROLLER_COASTER
0, // RIDE_TYPE_WILD_MOUSE
0, // RIDE_TYPE_MULTI_DIMENSION_ROLLER_COASTER
0, // RIDE_TYPE_38
0, // RIDE_TYPE_FLYING_ROLLER_COASTER
0, // RIDE_TYPE_3A
0, // RIDE_TYPE_VIRGINIA_REEL
0, // RIDE_TYPE_SPLASH_BOATS
0, // RIDE_TYPE_MINI_HELICOPTERS
0, // RIDE_TYPE_LAY_DOWN_ROLLER_COASTER
0, // RIDE_TYPE_SUSPENDED_MONORAIL
0, // RIDE_TYPE_40
0, // RIDE_TYPE_REVERSER_ROLLER_COASTER
0, // RIDE_TYPE_HEARTLINE_TWISTER_COASTER
0, // RIDE_TYPE_MINI_GOLF
0, // RIDE_TYPE_GIGA_COASTER
0, // RIDE_TYPE_ROTO_DROP
0, // RIDE_TYPE_FLYING_SAUCERS
0, // RIDE_TYPE_CROOKED_HOUSE
0, // RIDE_TYPE_MONORAIL_CYCLES
0, // RIDE_TYPE_COMPACT_INVERTED_COASTER
0, // RIDE_TYPE_WATER_COASTER
0, // RIDE_TYPE_AIR_POWERED_VERTICAL_COASTER
0, // RIDE_TYPE_INVERTED_HAIRPIN_COASTER
0, // RIDE_TYPE_MAGIC_CARPET
0, // RIDE_TYPE_SUBMARINE_RIDE
0, // RIDE_TYPE_RIVER_RAFTS
0, // RIDE_TYPE_50
0, // RIDE_TYPE_ENTERPRISE
0, // RIDE_TYPE_52
0, // RIDE_TYPE_53
0, // RIDE_TYPE_54
0, // RIDE_TYPE_55
0, // RIDE_TYPE_INVERTED_IMPULSE_COASTER
0, // RIDE_TYPE_MINI_ROLLER_COASTER
0, // RIDE_TYPE_MINE_RIDE
0, // RIDE_TYPE_59
0, // RIDE_TYPE_LIM_LAUNCHED_ROLLER_COASTER
};

View File

@ -41,3 +41,4 @@ extern const track_curve_chain gTrackCurveChain[256];
extern const track_curve_chain gFlatRideTrackCurveChain[256];
extern const uint32 RideTypeTrackPaintFunctions[91];
extern const uint32 RideTypeTrackPaintFunctionsOld[91];

212
src/ride/track_paint.c Normal file
View File

@ -0,0 +1,212 @@
/*****************************************************************************
* Copyright (c) 2014 Ted John
* OpenRCT2, an open source clone of Roller Coaster Tycoon 2.
*
* This file is part of 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.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*****************************************************************************/
#include "../addresses.h"
#include "../config.h"
#include "../drawing/drawing.h"
#include "../localisation/localisation.h"
#include "ride_data.h"
#include "track_data.h"
#include "../sprites.h"
#include "../world/map.h"
#include "../world/sprite.h"
#include "../interface/viewport.h"
#include "../interface/window.h"
#include "track_paint.h"
void dummy_paint_setup_function(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement) {}
TRACK_PAINT_FUNCTION* dummy_rotation[] = {
dummy_paint_setup_function,
dummy_paint_setup_function,
dummy_paint_setup_function,
dummy_paint_setup_function,
};
void top_spin_paint_setup_rot_0(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement);
void top_spin_paint_setup_rot_1(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement);
void top_spin_paint_setup_rot_2(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement);
void top_spin_paint_setup_rot_3(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement);
/* 0x0076679C */
TRACK_PAINT_FUNCTION* top_spin_base_functions[] = {
top_spin_paint_setup_rot_0,
top_spin_paint_setup_rot_1,
top_spin_paint_setup_rot_2,
top_spin_paint_setup_rot_3,
};
TRACK_PAINT_FUNCTION** top_spin_track_paint_functions[] = {
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
dummy_rotation,
top_spin_base_functions // 123
};
/* rct2: 0x007667BC
*/
void top_spin_paint_setup_rot_0(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement) {
return;
RCT2_CALLPROC_X(0x007667BC, 0, 0, 0, 0, 0, 0, 0);
}
/* rct2: 0x007667EC
*/
void top_spin_paint_setup_rot_1(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement) {
return;
RCT2_CALLPROC_X(0x007667EC, 0, 0, 0, 0, 0, 0, 0);
}
/* rct2: 0x0076671C
*/
void top_spin_paint_setup_rot_2(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement) {
return;
RCT2_CALLPROC_X(0x0076671C, 0, 0, 0, 0, 0, 0, 0);
}
/* rct2: 0x0076674C
*/
void top_spin_paint_setup_rot_3(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement) {
return;
RCT2_CALLPROC_X(0x0076674C, 0, 0, 0, 0, 0, 0, 0);
}

10
src/ride/track_paint.h Normal file
View File

@ -0,0 +1,10 @@
#ifndef _TRACK_PAINT_H
#define _TRACK_PAINT_H
#include "../common.h"
typedef void (TRACK_PAINT_FUNCTION)(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement);
extern TRACK_PAINT_FUNCTION** top_spin_track_paint_functions[];
#endif