Merge remote-tracking branch 'remotes/remote/ride-window'

This commit is contained in:
zsilencer 2014-09-20 20:11:51 -06:00
commit 1856cedaa6
28 changed files with 6549 additions and 251 deletions

View File

@ -107,6 +107,8 @@
#define RCT2_ADDRESS_RUN_INTRO_TICK_PART 0x009AC319
#define RCT2_ADDRESS_RIDE_ENTRIES 0x009ACFA4
#define RCT2_ADDRESS_INSTALLED_OBJECT_LIST 0x009ADAE8
#define RCT2_ADDRESS_CURRENT_SOUND_DEVICE 0x009AF280

View File

@ -474,10 +474,12 @@ static int award_is_deserved_best_custom_designed_rides(int awardType, int activ
}
/** At least 5 colourful rides and more than half of the rides are colourful. */
const uint8 dazzling_ride_colours[] = { 5, 14, 20, 30 };
static int award_is_deserved_most_dazzling_ride_colours(int awardType, int activeAwardTypes)
{
int i, countedRides, colourfulRides;
int i, j, countedRides, colourfulRides;
rct_ride *ride;
uint8 mainTrackColour;
if (activeAwardTypes & (1 << PARK_AWARD_MOST_DISAPPOINTING))
return 0;
@ -489,8 +491,14 @@ static int award_is_deserved_most_dazzling_ride_colours(int awardType, int activ
continue;
countedRides++;
if (ride->var_1BC == 5 || ride->var_1BC == 14 || ride->var_1BC == 20 || ride->var_1BC == 30)
colourfulRides++;
mainTrackColour = ride->track_colour_main[0];
for (j = 0; j < countof(dazzling_ride_colours); j++) {
if (mainTrackColour == dazzling_ride_colours[j]) {
colourfulRides++;
break;
}
}
}
return (colourfulRides >= 5 && colourfulRides >= countedRides - colourfulRides);

View File

@ -130,7 +130,7 @@ void finance_pay_ride_upkeep()
if (ride->status != RIDE_STATUS_CLOSED && !(RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_NO_MONEY)) {
sint16 upkeep = ride->upkeep_cost;
if (upkeep != -1) {
ride->var_154 -= upkeep;
ride->total_profit -= upkeep;
ride->var_14D |= 2;
finance_payment(upkeep, RCT2_EXPENDITURE_TYPE_RIDE_UPKEEP);
}

View File

@ -32,7 +32,7 @@ enum GAME_COMMAND {
GAME_COMMAND_7,
GAME_COMMAND_SET_RIDE_OPEN, // 8
GAME_COMMAND_9,
GAME_COMMAND_10,
GAME_COMMAND_SET_RIDE_NAME,
GAME_COMMAND_11,
GAME_COMMAND_12,
GAME_COMMAND_13,

View File

@ -212,7 +212,7 @@ void news_item_get_subject_location(int type, int subject, int *x, int *y, int *
}
// Find the first car of the train peep is on
vehicle = &(g_sprite_list[ride->train_car_map[peep->current_train]]).vehicle;
vehicle = &(g_sprite_list[ride->vehicles[peep->current_train]]).vehicle;
// Find the actual car peep is on
for (i = 0; i < peep->current_car; i++)
vehicle = &(g_sprite_list[vehicle->next_vehicle_on_train]).vehicle;

View File

@ -395,7 +395,7 @@ static int park_calculate_guest_generation_probability()
continue;
if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED))
continue;
if (ride->var_0E4 < 0x2580000)
if (ride->length[0] < (600 << 16))
continue;
if (ride->excitement < RIDE_RATING(6,00))
continue;

View File

@ -27,6 +27,7 @@
#include "ride.h"
#include "sprite.h"
#include "sprites.h"
#include "staff.h"
#include "window.h"
static void peep_update(rct_peep *peep);
@ -716,3 +717,12 @@ int peep_check_cheatcode(int index, rct_peep *peep)
return 1;
}
int peep_is_mechanic(rct_peep *peep)
{
return (
peep->sprite_identifier == SPRITE_IDENTIFIER_PEEP &&
peep->type == PEEP_TYPE_STAFF &&
peep->staff_type == STAFF_TYPE_MECHANIC
);
}

View File

@ -457,6 +457,6 @@ void get_arguments_from_thought(rct_peep_thought thought, uint32* argument_1, ui
int get_peep_face_sprite_small(rct_peep *peep);
int get_peep_face_sprite_large(rct_peep *peep);
int peep_check_cheatcode(int index, rct_peep *peep);
int peep_is_mechanic(rct_peep *peep);
#endif

View File

@ -84,7 +84,7 @@ typedef fixed32_1dp money32;
// would write FIXED_2DP(3,65)
#define FIXED_XDP(x, whole, fraction) ((whole) * (10 * x) + (fraction))
#define FIXED_1DP(whole, fraction) FIXED_XDP(1, whole, fraction)
#define FIXED_2DP(whole, fraction) FIXED_XDP(2, whole, fraction)
#define FIXED_2DP(whole, fraction) FIXED_XDP(10, whole, fraction)
// Construct a money value in the format MONEY(10,70) to represent 10.70. Fractional part must be two digits.
#define MONEY(whole, fraction) ((whole) * 10 + ((fraction) / 10))

View File

@ -23,6 +23,7 @@
#include "game.h"
#include "map.h"
#include "news_item.h"
#include "staff.h"
#include "sprite.h"
#include "ride.h"
#include "scenario.h"
@ -476,6 +477,118 @@ int ride_try_construct(rct_map_element *trackMapElement)
return 1;
}
/**
*
* rct2: 0x006AF561
*/
void ride_get_status(int rideIndex, int *formatSecondary, int *argument)
{
rct_ride *ride = &g_ride_list[rideIndex];
if (ride->lifecycle_flags & RIDE_LIFECYCLE_CRASHED) {
*formatSecondary = STR_CRASHED;
return;
}
if (ride->lifecycle_flags & RIDE_LIFECYCLE_BROKEN_DOWN) {
*formatSecondary = STR_BROKEN_DOWN;
return;
}
if (ride->status == RIDE_STATUS_CLOSED) {
*formatSecondary = STR_CLOSED;
return;
}
if (ride->status == RIDE_STATUS_TESTING) {
*formatSecondary = STR_TEST_RUN;
return;
}
rct_peep *peep = GET_PEEP(ride->race_winner);
if (ride->mode == RIDE_MODE_RACE && !(ride->lifecycle_flags & RIDE_LIFECYCLE_PASS_STATION_NO_STOPPING) && ride->race_winner != 0xFFFF && peep->sprite_identifier == SPRITE_IDENTIFIER_PEEP) {
if (peep->name_string_idx == STR_GUEST) {
*argument = peep->id;
*formatSecondary = STR_RACE_WON_BY_GUEST;
} else {
*argument = peep->name_string_idx;
*formatSecondary = STR_RACE_WON_BY;
}
} else {
if (!(RCT2_GLOBAL(RCT2_ADDRESS_RIDE_FLAGS + ride->type * 8, uint32) & 0x20000)) {
*argument = ride->num_riders;
*formatSecondary = STR_PERSON_ON_RIDE;
if(*argument != 1)
*formatSecondary = STR_PEOPLE_ON_RIDE;
} else {
*formatSecondary = STR_OPEN;
}
}
}
rct_peep *ride_get_assigned_mechanic(rct_ride *ride)
{
rct_peep *peep;
if (ride->lifecycle_flags & RIDE_LIFECYCLE_BROKEN_DOWN) {
if (
ride->mechanic_status == RIDE_MECHANIC_STATUS_HEADING ||
ride->mechanic_status == 3 ||
ride->mechanic_status == 4
) {
peep = &(g_sprite_list[ride->mechanic].peep);
if (peep_is_mechanic(peep))
return peep;
}
}
return NULL;
}
int ride_get_total_length(rct_ride *ride)
{
int i, totalLength = 0;
for (i = 0; i < ride->num_stations; i++)
totalLength += ride->length[i];
return totalLength;
}
int ride_can_have_multiple_circuits(rct_ride *ride)
{
if (!(RCT2_GLOBAL(0x0097D4F2 + (ride->type * 8), uint16) & 0x200))
return 0;
// Only allow circuit or launch modes
if (
ride->mode != RIDE_MODE_CONTINUOUS_CIRCUIT &&
ride->mode != RIDE_MODE_REVERSE_INCLINE_LAUNCHED_SHUTTLE &&
ride->mode != RIDE_MODE_POWERED_LAUNCH
) {
return 0;
}
// Must have no more than one vehicle and one station
if (ride->num_vehicles > 1 || ride->num_stations > 1)
return 0;
return 1;
}
track_colour ride_get_track_colour(rct_ride *ride, int colourScheme)
{
track_colour result;
result.main = ride->track_colour_main[colourScheme];
result.additional = ride->track_colour_additional[colourScheme];
result.supports = ride->track_colour_supports[colourScheme];
return result;
}
vehicle_colour ride_get_vehicle_colour(rct_ride *ride, int vehicleIndex)
{
vehicle_colour result;
result.main = ride->vehicle_colours[vehicleIndex] & 0xFF;
result.additional_1 = ride->vehicle_colours[vehicleIndex] >> 8;
result.additional_2 = ride->vehicle_colours_extended[vehicleIndex];
return result;
}
/**
*
* rct2: 0x006AC988
@ -487,10 +600,10 @@ void ride_init_vehicle_speed(rct_ride *ride)
int ecx = -1;
while (1) {
ecx++;
if (ecx >= ride->var_0C8) {
if (ecx >= ride->num_vehicles) {
break;
}
rct_vehicle *vehicle = &g_sprite_list[ride->train_car_map[ecx]].vehicle;
rct_vehicle *vehicle = &g_sprite_list[ride->vehicles[ecx]].vehicle;
vehicle->var_48 &= (1 << 6);
uint8 r = scenario_rand();
r = 0xC;
@ -522,4 +635,22 @@ void ride_init_vehicle_speed(rct_ride *ride)
}
}
}
}
rct_ride_type *ride_get_entry(rct_ride *ride)
{
return GET_RIDE_ENTRY(ride->subtype);
}
uint8 *get_ride_entry_indices_for_ride_type(uint8 rideType)
{
uint8 *typeToRideEntryIndexMap = (uint8*)0x009E32F8;
uint8 *entryIndexList = typeToRideEntryIndexMap;
while (rideType > 0) {
do {
entryIndexList++;
} while (*(entryIndexList - 1) != 255);
rideType--;
}
return entryIndexList;
}

View File

@ -22,6 +22,7 @@
#define _RIDE_H_
#include "map.h"
#include "peep.h"
#include "rct2.h"
#include "string_ids.h"
@ -49,15 +50,22 @@ typedef struct {
uint32 var_008;
uint8 var_00C;
uint8 var_00D;
uint8 pad_00E[0x5];
uint8 pad_00E;
uint8 var_00F;
uint8 var_010;
uint8 var_011;
uint8 var_012;
uint8 var_013;
uint8 pad_014[0x19E];
sint8 excitement_multipler; // 0x1B2
sint8 intensity_multipler; // 0x1B3
sint8 nausea_multipler; // 0x1B4
uint8 pad_1B5[0x09];
uint8 pad_1B5;
uint32 var_1B6;
uint8 pad_1BA[0x04];
uint8 category[2]; // 0x1BE
uint8 shop_item; // 0x1C0
uint8 shop_item_secondary; // 0x1C1
} rct_ride_type;
/**
@ -72,7 +80,7 @@ typedef struct {
uint16 pad_002;
uint8 mode; // 0x004
uint8 colour_scheme_type; // 0x005
uint16 car_colours[32]; // 0x006
uint16 vehicle_colours[32]; // 0x006
uint8 pad_046[0x03];
// 0 = closed, 1 = open, 2 = test
uint8 status; // 0x049
@ -81,32 +89,38 @@ typedef struct {
uint16 overall_view; // 0x050 00XX = X, XX00 = Y (* 32 + 16)
uint16 station_starts[4]; // 0x052
uint8 station_heights[4]; // 0x05A
uint8 pad_05E[4];
uint8 var_62[4];
uint8 pad_66[4];
uint8 pad_05E[0xC];
uint16 entrances[4]; // 0x06A
uint16 exits[4]; // 0x072
uint8 pad_07A[0x0C];
uint16 train_car_map[1]; // 0x086 Points to the first car in the train
uint8 pad_088[0x3F];
uint16 vehicles[32]; // 0x086 Points to the first car in the train
uint8 depart_flags; // 0x0C6
// Not sure if these should be uint or sint.
uint8 var_0C7;
uint8 var_0C8; // Number of train cars?
uint8 var_0C9;
uint8 pad_0CA[0x06];
uint8 num_stations; // 0x0C7
uint8 num_vehicles; // 0x0C8
uint8 num_cars_per_train; // 0x0C9
uint8 pad_0CA[0x2];
uint8 var_0CC;
uint8 var_0CD;
uint8 min_waiting_time; // 0x0CE
uint8 max_waiting_time; // 0x0CF
uint8 var_0D0;
uint8 pad_0D1[0x13];
sint32 var_0E4;
sint32 var_0E8;
sint32 var_0EC;
sint32 var_0F0;
uint8 pad_0F4[0x20];
uint8 var_114;
// Track length? Number of track segments?
uint8 var_115;
uint8 pad_116[0x0E];
uint8 pad_0D1[0x7];
sint32 max_speed; // 0x0D8
sint32 average_speed; // 0x0DC
uint8 pad_0E0[0x4];
sint32 length[4]; // 0x0E4
uint16 time[4]; // 0x0F4
fixed16_2dp max_positive_vertical_g; // 0x0FC
fixed16_2dp max_negative_vertical_g; // 0x0FE
fixed16_2dp max_lateral_g; // 0x100
uint8 pad_102[0x12];
uint8 inversions; // 0x114 (???X XXXX) holes for mini golf
uint8 drops; // 0x115 (??XX XXXX)
uint8 pad_116;
uint8 highest_drop_height; // 0x117
uint8 pad_118[0x0C];
sint16 var_124;
sint16 var_126;
sint16 var_128;
@ -119,61 +133,81 @@ typedef struct {
sint16 var_136;
money16 price; // 0x138
uint8 pad_13A[0x06];
sint16 excitement; // 0x140
sint16 intensity; // 0x142
uint16 nausea; // 0x144
ride_rating excitement; // 0x140
ride_rating intensity; // 0x142
ride_rating nausea; // 0x144
uint16 reliability; // 0x146
uint16 pad_148;
uint16 var_14A;
uint8 pad_14C;
uint8 var_14D;
uint8 pad_14E[0x06];
uint32 var_154;
uint8 pad_14E[0x02];
uint32 total_customers; // 0x150
money32 total_profit; // 0x154
uint16 var_158;
uint8 pad_15A;
uint8 num_riders; // 0x15B
uint8 pad_15C[0x24];
uint16 build_date;
sint16 upkeep_cost; // 0x182
sint16 build_date; // 0x180
money16 upkeep_cost; // 0x182
uint16 race_winner; // 0x184
uint8 pad_186[0x06];
uint8 var_18C;
uint8 pad_18D[0x09];
uint8 mechanic_status; // 0x18D
uint16 mechanic; // 0x18E
uint8 pad_190[0x03];
uint8 breakdown_reason; // 0x193
money16 price_secondary; // 0x194
uint16 var_196;
// used in computing excitement, nausea, etc
uint8 var_198;
uint8 var_199;
uint8 pad_19A[0x14];
uint8 inspection_interval; // 0x19A
uint8 last_inspection; // 0x19B
uint8 pad_19C[0x8];
uint32 var_1A4;
uint8 pad_1A8[6];
uint8 var_1AE;
uint8 connected_message_throttle;
uint32 pad_1B0;
sint32 profit; // 0x1B4
uint8 connected_message_throttle; // 0x1AF
money32 income_per_hour; // 0x1B0
money32 profit; // 0x1B4
uint8 queue_time[4]; // 0x1B8
uint8 var_1BC;
uint8 pad_1BD[0xD];
uint16 var_1CA;
uint8 var_1CC;
uint8 var_1CD;
uint8 track_colour_main[4]; // 0x1BC
uint8 track_colour_additional[4]; // 0x1C0
uint8 track_colour_supports[4]; // 0x1C4
uint8 music; // 0x1C8
uint8 entrance_style; // 0x1C9
uint8 pad_1CA[0x02];
uint8 num_block_brakes; // 0x1CC
uint8 lift_hill_speed; // 0x1CD
uint16 guests_favourite; // 0x1CE
uint32 lifecycle_flags; // 0x1D0
uint8 var_1D4;
uint8 pad_1D5[0x1F];
// Example value for wild mouse ride is d5 (before it's been constructed)
// I tried searching the IDA file for "1F4" but couldn't find places where
// this is written to.
uint16 var_1F4;
uint8 pad_1F6[0x0a];
uint8 vehicle_colours_extended[32]; // 0x1D4
uint16 total_air_time; // 0x1F4
uint8 pad_1F6;
uint8 num_circuits; // 0x1F7
uint8 pad_1F8[0x8];
uint16 queue_length[4]; // 0x200
uint8 pad_208[0x58];
} rct_ride;
#define RIDE_MEASUREMENT_MAX_ITEMS 4800
/**
* Ride measurement structure.
* size: 0x04B0C
*/
typedef struct {
uint8 var_00;
uint8 pad_01[0x4B0B];
uint8 var_01;
uint8 pad_02[4];
uint16 num_items; // 0x0006
uint16 current_item; // 0x0008
uint16 var_0A;
sint8 vertical[RIDE_MEASUREMENT_MAX_ITEMS]; // 0x000C
sint8 lateral[RIDE_MEASUREMENT_MAX_ITEMS]; // 0x12CC
uint8 velocity[RIDE_MEASUREMENT_MAX_ITEMS]; // 0x258C
uint8 altitude[RIDE_MEASUREMENT_MAX_ITEMS]; // 0x384C
} rct_ride_measurement;
enum {
@ -184,7 +218,7 @@ enum {
// Constants used by the lifecycle_flags property at 0x1D0
enum {
RIDE_LIFECYCLE_ON_TRACK = 1,
RIDE_LIFECYCLE_ON_TRACK = 1 << 0,
RIDE_LIFECYCLE_TESTED = 1 << 1,
RIDE_LIFECYCLE_TEST_IN_PROGRESS = 1 << 2,
RIDE_LIFECYCLE_NO_RAW_STATS = 1 << 3,
@ -194,13 +228,14 @@ enum {
RIDE_LIFECYCLE_BROKEN_DOWN = 1 << 7,
RIDE_LIFECYCLE_CRASHED = 1 << 10,
RIDE_LIFECYCLE_11 = 1 << 11,
RIDE_LIFECYCLE_EVER_BEEN_OPENED = 1 << 12,
RIDE_LIFECYCLE_MUSIC = 1 << 13,
RIDE_LIFECYCLE_INDESTRUCTIBLE = 1 << 14,
RIDE_LIFECYCLE_INDESTRUCTIBLE_TRACK = 1 << 15,
RIDE_LIFECYCLE_CABLE_LIFT = 1 << 17
RIDE_LIFECYCLE_CABLE_LIFT = 1 << 17,
RIDE_LIFECYCLE_19 = 1 << 19
};
enum {
@ -305,9 +340,9 @@ enum {
};
enum {
RIDE_MODE_NORMAL = 0,
RIDE_MODE_NORMAL,
RIDE_MODE_CONTINUOUS_CIRCUIT,
RIDE_MODE_REVERSE_INCLINED_SHUTTLE,
RIDE_MODE_REVERSE_INCLINE_LAUNCHED_SHUTTLE,
RIDE_MODE_POWERED_LAUNCH, // RCT1 style?
RIDE_MODE_SHUTTLE,
RIDE_MODE_BOAT_HIRE,
@ -328,7 +363,7 @@ enum {
RIDE_MODE_3D_FILM_MOUSE_TAILS,
RIDE_MODE_SPACE_RINGS,
RIDE_MODE_BEGINNERS,
RIDE_MODE_LIM_POWERED_LAUNCH, // 0x17
RIDE_MODE_LIM_POWERED_LAUNCH,
RIDE_MODE_FILM_THRILL_RIDERS,
RIDE_MODE_3D_FILM_STORM_CHASERS,
RIDE_MODE_3D_FILM_SPACE_RAIDERS,
@ -340,7 +375,7 @@ enum {
RIDE_MODE_CROOKED_HOUSE,
RIDE_MODE_FREEFALL_DROP,
RIDE_MODE_CONTINUOUS_CIRCUIT_BLOCK_SECTIONED,
RIDE_MODE_POWERED_LAUNCH2, // 0x23. RCT2 style?
RIDE_MODE_POWERED_LAUNCH_35, // RCT2 style?
RIDE_MODE_POWERED_LAUNCH_BLOCK_SECTIONED
};
@ -359,6 +394,109 @@ enum {
RIDE_GROUP_SHOP
};
enum {
MUSIC_STYLE_DODGEMS_BEAT,
MUSIC_STYLE_FAIRGROUND_ORGAN,
MUSIC_STYLE_ROMAN_FANFARE,
MUSIC_STYLE_ORIENTAL,
MUSIC_STYLE_MARTIAN,
MUSIC_STYLE_JUNGLE_DRUMS,
MUSIC_STYLE_EGYPTIAN,
MUSIC_STYLE_TOYLAND,
MUSIC_STYLE_8,
MUSIC_STYLE_SPACE,
MUSIC_STYLE_HORROR,
MUSIC_STYLE_TECHNO,
MUSIC_STYLE_GENTLE,
MUSIC_STYLE_SUMMER,
MUSIC_STYLE_WATER,
MUSIC_STYLE_WILD_WEST,
MUSIC_STYLE_JURASSIC,
MUSIC_STYLE_ROCK,
MUSIC_STYLE_RAGTIME,
MUSIC_STYLE_FANTASY,
MUSIC_STYLE_ROCK_STYLE_2,
MUSIC_STYLE_ICE,
MUSIC_STYLE_SNOW,
MUSIC_STYLE_CUSTOM_MUSIC_1,
MUSIC_STYLE_CUSTOM_MUSIC_2,
MUSIC_STYLE_MEDIEVAL,
MUSIC_STYLE_URBAN,
MUSIC_STYLE_ORGAN,
MUSIC_STYLE_MECHANICAL,
MUSIC_STYLE_MODERN,
MUSIC_STYLE_PIRATES,
MUSIC_STYLE_ROCK_STYLE_3,
MUSIC_STYLE_CANDY_STYLE
};
enum {
BREAKDOWN_NONE = 255,
BREAKDOWN_SAFETY_CUT_OUT = 0,
BREAKDOWN_RESTRAINTS_STUCK_CLOSED,
BREAKDOWN_RESTRAINTS_STUCK_OPEN,
BREAKDOWN_DOORS_STUCK_CLOSED,
BREAKDOWN_DOORS_STUCK_OPEN,
BREAKDOWN_VEHICLE_MALFUNCTION,
BREAKDOWN_BRAKES_FAILURE,
BREAKDOWN_CONTROL_FAILURE
};
enum {
RIDE_MECHANIC_STATUS_CALLING = 1,
RIDE_MECHANIC_STATUS_HEADING = 2,
RIDE_MECHANIC_STATUS_FIXING = 3,
};
enum {
RIDE_DEPART_WAIT_FOR_LOAD_MASK = 7,
RIDE_DEPART_WAIT_FOR_LOAD = 1 << 3,
RIDE_DEPART_LEAVE_WHEN_ANOTHER_ARRIVES = 1 << 4,
RIDE_DEPART_SYNCHRONISE_WITH_ADJACENT_STATIONS = 1 << 5,
RIDE_DEPART_WAIT_FOR_MINIMUM_LENGTH = 1 << 6,
RIDE_DEPART_WAIT_FOR_MAXIMUM_LENGTH = 1 << 7
};
enum {
RIDE_COLOUR_SCHEME_MAIN,
RIDE_COLOUR_SCHEME_ADDITIONAL_1,
RIDE_COLOUR_SCHEME_ADDITIONAL_2,
RIDE_COLOUR_SCHEME_ADDITIONAL_3
};
enum {
VEHICLE_COLOUR_SCHEME_SAME,
VEHICLE_COLOUR_SCHEME_PER_TRAIN,
VEHICLE_COLOUR_SCHEME_PER_VEHICLE
};
enum {
RIDE_ENTRANCE_STYLE_PLAIN,
RIDE_ENTRANCE_STYLE_WOODEN,
RIDE_ENTRANCE_STYLE_CANVAS_TENT,
RIDE_ENTRANCE_STYLE_CASTLE_GREY,
RIDE_ENTRANCE_STYLE_CASTLE_BROWN,
RIDE_ENTRANCE_STYLE_JUNGLE,
RIDE_ENTRANCE_STYLE_LOG_CABIN,
RIDE_ENTRANCE_STYLE_CLASSICAL_ROMAN,
RIDE_ENTRANCE_STYLE_ABSTRACT,
RIDE_ENTRANCE_STYLE_SNOW_ICE,
RIDE_ENTRANCE_STYLE_PAGODA,
RIDE_ENTRANCE_STYLE_SPACE
};
typedef struct {
uint8 main;
uint8 additional;
uint8 supports;
} track_colour;
typedef struct {
uint8 main;
uint8 additional_1;
uint8 additional_2;
} vehicle_colour;
#define MAX_RIDES 255
#define MAX_RIDE_MEASUREMENTS 8
@ -373,6 +511,7 @@ extern rct_ride* g_ride_list;
/** Helper macros until rides are stored in this module. */
#define GET_RIDE(x) (&g_ride_list[x])
#define GET_RIDE_MEASUREMENT(x) (&(RCT2_ADDRESS(RCT2_ADDRESS_RIDE_MEASUREMENTS, rct_ride_measurement)[x]))
#define GET_RIDE_ENTRY(x) RCT2_ADDRESS(RCT2_ADDRESS_RIDE_ENTRIES, rct_ride_type*)[x]
/**
* Helper macro loop for enumerating through all the non null rides.
@ -394,6 +533,13 @@ rct_map_element *sub_6CAF80(int rideIndex, int *outX, int *outY);
rct_map_element *ride_find_track_gap(rct_map_element *startTrackElement, int *outX, int *outY);
void ride_construct_new(int list_item);
int ride_try_construct(rct_map_element *trackMapElement);
void ride_init_vehicle_speed(rct_ride *ride);
void ride_get_status(int rideIndex, int *formatSecondary, int *argument);
rct_peep *ride_get_assigned_mechanic(rct_ride *ride);
int ride_get_total_length(rct_ride *ride);
int ride_can_have_multiple_circuits(rct_ride *ride);
track_colour ride_get_track_colour(rct_ride *ride, int colourScheme);
vehicle_colour ride_get_vehicle_colour(rct_ride *ride, int vehicleIndex);
rct_ride_type *ride_get_entry(rct_ride *ride);
uint8 *get_ride_entry_indices_for_ride_type(uint8 rideType);
#endif

View File

@ -10,6 +10,7 @@
#include <stdbool.h>
#include "rct2.h"
#include "ride.h"
#include "ride_data.h"
const bool hasRunningTrack[0x60] = {
@ -583,4 +584,192 @@ const uint8 rideUnknownData3[0x60] = {
10, // 57 Mini Roller Coaster
10, // 58 Mine Ride
10, // 59 LIM Launched Roller Coaster
};
const rct_ride_name_convention RideNameConvention[96] = {
{ 1229, 1243, 1257, 0 }, // 00 Spiral Roller coaster
{ 1229, 1243, 1257, 0 }, // 01 Stand Up Coaster
{ 1229, 1243, 1257, 0 }, // 02 Suspended Swinging
{ 1229, 1243, 1257, 0 }, // 03 Inverted
{ 1229, 1243, 1257, 0 }, // 04 Steel Mini Coaster
{ 1229, 1243, 1257, 0 }, // 05 Mini Railroad
{ 1229, 1243, 1257, 0 }, // 06 Monorail
{ 1264, 1243, 1257, 0 }, // 07 Mini Suspended Coaster
{ 1236, 1250, 1250, 0 }, // 08 Bumper Boats
{ 1264, 1243, 1257, 0 }, // 09 Wooden Wild Mine/Mouse
{ 1264, 1243, 1257, 0 }, // 0a Steeplechase/Motorbike/Soap Box Derby
{ 1264, 1243, 1257, 0 }, // 0b Car Ride
{ 1264, 1243, 1257, 0 }, // 0c Launched Freefall
{ 1229, 1243, 1257, 0 }, // 0d Bobsleigh Coaster
{ 1292, 1243, 1257, 0 }, // 0e Observation Tower
{ 1229, 1243, 1257, 0 }, // 0f Looping Roller Coaster
{ 1236, 1243, 1257, 0 }, // 10 Dinghy Slide
{ 1229, 1243, 1257, 0 }, // 11 Mine Train Coaster
{ 1264, 1243, 1257, 0 }, // 12 Chairlift
{ 1229, 1243, 1257, 0 }, // 13 Corkscrew Roller Coaster
{ 1229, 1243, 1257, 0 }, // 14 Maze
{ 1229, 1271, 1257, 0 }, // 15 Spiral Slide
{ 1264, 1243, 1257, 0 }, // 16 Go Karts
{ 1236, 1243, 1257, 0 }, // 17 Log Flume
{ 1236, 1243, 1257, 0 }, // 18 River Rapids
{ 1264, 1271, 1257, 0 }, // 19 Bumper Cars
{ 1285, 1278, 1257, 0 }, // 1a Pirate Ship
{ 1285, 1278, 1257, 0 }, // 1b Swinging Inverter Ship
{ 1264, 1271, 1257, 0 }, // 1c Food Stall
{ 1264, 1271, 1257, 0 }, // 1d (none)
{ 1264, 1271, 1257, 0 }, // 1e Drink Stall
{ 1264, 1271, 1257, 0 }, // 1f (none)
{ 1264, 1271, 1257, 0 }, // 20 Shop (all types)
{ 1264, 1278, 1257, 0 }, // 21 Merry Go Round
{ 1264, 1271, 1257, 0 }, // 22 Balloon Stall (maybe)
{ 1264, 1271, 1257, 0 }, // 23 Information Kiosk
{ 1264, 1271, 1257, 0 }, // 24 Bathroom
{ 1299, 1278, 1257, 0 }, // 25 Ferris Wheel
{ 1264, 1278, 1257, 0 }, // 26 Motion Simulator
{ 1271, 1278, 1257, 0 }, // 27 3D Cinema
{ 1264, 1278, 1257, 0 }, // 28 Gravitron
{ 1306, 1278, 1257, 0 }, // 29 Space Rings
{ 1264, 1243, 1257, 0 }, // 2a Reverse Freefall Coaster
{ 1292, 1243, 1257, 0 }, // 2b Elevator
{ 1229, 1243, 1257, 0 }, // 2c Vertical Drop Roller Coaster
{ 1264, 1271, 1257, 0 }, // 2d ATM
{ 1278, 1278, 1257, 0 }, // 2e Twist
{ 1271, 1278, 1257, 0 }, // 2f Haunted House
{ 1264, 1271, 1257, 0 }, // 30 First Aid
{ 1271, 1278, 1257, 0 }, // 31 Circus Show
{ 1264, 1243, 1257, 0 }, // 32 Ghost Train
{ 1229, 1243, 1257, 0 }, // 33 Twister Roller Coaster
{ 1229, 1243, 1257, 0 }, // 34 Wooden Roller Coaster
{ 1229, 1243, 1257, 0 }, // 35 Side-Friction Roller Coaster
{ 1264, 1243, 1257, 0 }, // 36 Wild Mouse
{ 1229, 1243, 1257, 0 }, // 37 Multi Dimension Coaster
{ 1229, 1243, 1257, 0 }, // 38 (none)
{ 1229, 1243, 1257, 0 }, // 39 Flying Roller Coaster
{ 1229, 1243, 1257, 0 }, // 3a (none)
{ 1264, 1243, 1257, 0 }, // 3b Virginia Reel
{ 1236, 1243, 1257, 0 }, // 3c Splash Boats
{ 1264, 1243, 1257, 0 }, // 3d Mini Helicopters
{ 1229, 1243, 1257, 0 }, // 3e Lay-down Roller Coaster
{ 1229, 1243, 1257, 0 }, // 3f Suspended Monorail
{ 1229, 1243, 1257, 0 }, // 40 (none)
{ 1264, 1243, 1257, 0 }, // 41 Reverser Roller Coaster
{ 1264, 1243, 1257, 0 }, // 42 Heartline Twister Roller Coaster
{ 1313, 1320, 1257, 0 }, // 43 Mini Golf
{ 1229, 1243, 1257, 0 }, // 44 Giga Coaster
{ 1264, 1243, 1257, 0 }, // 45 Roto-Drop
{ 1264, 1271, 1257, 0 }, // 46 Flying Saucers
{ 1271, 1278, 1257, 0 }, // 47 Crooked House
{ 1264, 1243, 1257, 0 }, // 48 Monorail Cycles
{ 1229, 1243, 1257, 0 }, // 49 Compact Inverted Coaster
{ 1236, 1243, 1257, 0 }, // 4a Water Coaster
{ 1229, 1243, 1257, 0 }, // 4b Air Powered Vertical Coaster
{ 1264, 1243, 1257, 0 }, // 4c Inverted Hairpin Coaster
{ 1264, 1278, 1257, 0 }, // 4d Magic Carpet
{ 1236, 1243, 1250, 0 }, // 4e Submarine Ride
{ 1236, 1243, 1257, 0 }, // 4f River Rafts
{ 1264, 1271, 1257, 0 }, // 50 (none)
{ 1299, 1278, 1257, 0 }, // 51 Enterprise
{ 1264, 1271, 1257, 0 }, // 52 (none)
{ 1264, 1271, 1257, 0 }, // 53 (none)
{ 1264, 1271, 1257, 0 }, // 54 (none)
{ 1229, 1243, 1257, 0 }, // 55 (none)
{ 1229, 1243, 1257, 0 }, // 56 Inverted Impulse Coaster
{ 1264, 1243, 1257, 0 }, // 57 Mini Roller Coaster
{ 1229, 1243, 1257, 0 }, // 58 Mine Ride
{ 1264, 1243, 1257, 0 }, // 59 LIM Launched Roller Coaster
{ 1229, 1243, 1257, 0 }
};
const uint8 RideAvailableModes[] = {
RIDE_MODE_CONTINUOUS_CIRCUIT, RIDE_MODE_CONTINUOUS_CIRCUIT_BLOCK_SECTIONED, 0xFF, // 00 Spiral Roller coaster
RIDE_MODE_CONTINUOUS_CIRCUIT, RIDE_MODE_CONTINUOUS_CIRCUIT_BLOCK_SECTIONED, 0xFF, // 01 Stand Up Coaster
RIDE_MODE_CONTINUOUS_CIRCUIT, RIDE_MODE_CONTINUOUS_CIRCUIT_BLOCK_SECTIONED, 0xFF, // 02 Suspended Swinging
RIDE_MODE_CONTINUOUS_CIRCUIT, RIDE_MODE_CONTINUOUS_CIRCUIT_BLOCK_SECTIONED, 0xFF, // 03 Inverted
RIDE_MODE_CONTINUOUS_CIRCUIT, RIDE_MODE_CONTINUOUS_CIRCUIT_BLOCK_SECTIONED, 0xFF, // 04 Steel Mini Coaster
RIDE_MODE_CONTINUOUS_CIRCUIT, RIDE_MODE_SHUTTLE, 0xFF, // 05 Mini Railroad
RIDE_MODE_CONTINUOUS_CIRCUIT, RIDE_MODE_SHUTTLE, 0xFF, // 06 Monorail
RIDE_MODE_CONTINUOUS_CIRCUIT, 0xFF, // 07 Mini Suspended Coaster
RIDE_MODE_BOAT_HIRE, 0xFF, // 08 Bumper Boats
RIDE_MODE_CONTINUOUS_CIRCUIT, 0xFF, // 09 Wooden Wild Mine/Mouse
RIDE_MODE_CONTINUOUS_CIRCUIT, RIDE_MODE_CONTINUOUS_CIRCUIT_BLOCK_SECTIONED, 0xFF, // 0A Steeplechase/Motorbike/Soap Box Derby
RIDE_MODE_CONTINUOUS_CIRCUIT, 0xFF, // 0B Car Ride
RIDE_MODE_UPWARD_LAUNCH, RIDE_MODE_DOWNWARD_LAUNCH, 0xFF, // 0C Launched Freefall
RIDE_MODE_CONTINUOUS_CIRCUIT, RIDE_MODE_CONTINUOUS_CIRCUIT_BLOCK_SECTIONED, 0xFF, // 0D Bobsleigh Coaster
RIDE_MODE_ROTATING_LIFT, 0xFF, // 0E Observation Tower
RIDE_MODE_CONTINUOUS_CIRCUIT, RIDE_MODE_CONTINUOUS_CIRCUIT_BLOCK_SECTIONED, RIDE_MODE_REVERSE_INCLINE_LAUNCHED_SHUTTLE, RIDE_MODE_POWERED_LAUNCH, 0xFF, // 0F Looping Roller Coaster
RIDE_MODE_CONTINUOUS_CIRCUIT, 0xFF, // 10 Dinghy Slide
RIDE_MODE_CONTINUOUS_CIRCUIT, RIDE_MODE_CONTINUOUS_CIRCUIT_BLOCK_SECTIONED, 0xFF, // 11 Mine Train Coaster
RIDE_MODE_STATION_TO_STATION, 0xFF, // 12 Chairlift
RIDE_MODE_CONTINUOUS_CIRCUIT, RIDE_MODE_CONTINUOUS_CIRCUIT_BLOCK_SECTIONED, 0x23, 2, 0xFF, // 13 Corkscrew Roller Coaster
RIDE_MODE_MAZE, 0xFF, // 14 Maze
RIDE_MODE_SINGLE_RIDE_PER_ADMISSION, RIDE_MODE_UNLIMITED_RIDES_PER_ADMISSION, 0xFF, // 15 Spiral Slide
RIDE_MODE_RACE, RIDE_MODE_CONTINUOUS_CIRCUIT, 0xFF, // 16 Go Karts
RIDE_MODE_CONTINUOUS_CIRCUIT, 0xFF, // 17 Log Flume
RIDE_MODE_CONTINUOUS_CIRCUIT, 0xFF, // 18 River Rapids
RIDE_MODE_BUMPERCAR, 0xFF, // 19 Bumper Cars
RIDE_MODE_SWING, 0xFF, // 1A Pirate Ship
RIDE_MODE_SWING, 0xFF, // 1B Swinging Inverter Ship
RIDE_MODE_SHOP_STALL, 0xFF, // 1C Food Stall
RIDE_MODE_SHOP_STALL, 0xFF, // 1D (none)
RIDE_MODE_SHOP_STALL, 0xFF, // 1E Drink Stall
RIDE_MODE_SHOP_STALL, 0xFF, // 1F (none)
RIDE_MODE_SHOP_STALL, 0xFF, // 20 Shop (all types)
RIDE_MODE_ROTATION, 0xFF, // 21 Merry Go Round
RIDE_MODE_SHOP_STALL, 0xFF, // 22 Balloon Stall (maybe)
RIDE_MODE_SHOP_STALL, 0xFF, // 23 Information Kiosk
RIDE_MODE_SHOP_STALL, 0xFF, // 24 Bathroom
RIDE_MODE_FORWARD_ROTATION, RIDE_MODE_BACKWARD_ROTATION, 0xFF, // 25 Ferris Wheel
RIDE_MODE_FILM_AVENGING_AVIATORS, RIDE_MODE_FILM_THRILL_RIDERS, 0xFF, // 26 Motion Simulator
RIDE_MODE_3D_FILM_MOUSE_TAILS, RIDE_MODE_3D_FILM_STORM_CHASERS, RIDE_MODE_3D_FILM_SPACE_RAIDERS, 0xFF, // 27 3D Cinema
RIDE_MODE_BEGINNERS, RIDE_MODE_INTENSE, RIDE_MODE_BERSERK, 0xFF, // 28 Gravitron
RIDE_MODE_SPACE_RINGS, 0xFF, // 29 Space Rings
RIDE_MODE_LIM_POWERED_LAUNCH, 0xFF, // 2A Reverse Freefall Coaster
RIDE_MODE_SHUTTLE, 0xFF, // 2B Elevator
RIDE_MODE_CONTINUOUS_CIRCUIT, RIDE_MODE_CONTINUOUS_CIRCUIT_BLOCK_SECTIONED, 0xFF, // 2C Vertical Drop Roller Coaster
RIDE_MODE_SHOP_STALL, 0xFF, // 2D ATM
RIDE_MODE_ROTATION, 0xFF, // 2E Twist
RIDE_MODE_HAUNTED_HOUSE, 0xFF, // 2F Haunted House
RIDE_MODE_SHOP_STALL, 0xFF, // 30 First Aid
RIDE_MODE_CIRCUS_SHOW, 0xFF, // 31 Circus Show
RIDE_MODE_CONTINUOUS_CIRCUIT, 0xFF, // 32 Ghost Train
RIDE_MODE_CONTINUOUS_CIRCUIT, RIDE_MODE_CONTINUOUS_CIRCUIT_BLOCK_SECTIONED, 0xFF, // 33 Twister Roller Coaster
RIDE_MODE_CONTINUOUS_CIRCUIT, RIDE_MODE_CONTINUOUS_CIRCUIT_BLOCK_SECTIONED, 0xFF, // 34 Wooden Roller Coaster
RIDE_MODE_CONTINUOUS_CIRCUIT, 0xFF, // 35 Side-Friction Roller Coaster
RIDE_MODE_CONTINUOUS_CIRCUIT, RIDE_MODE_CONTINUOUS_CIRCUIT_BLOCK_SECTIONED, 0xFF, // 36 Wild Mouse
RIDE_MODE_CONTINUOUS_CIRCUIT, RIDE_MODE_CONTINUOUS_CIRCUIT_BLOCK_SECTIONED, 0xFF, // 37 Multi Dimension Coaster
RIDE_MODE_CONTINUOUS_CIRCUIT, RIDE_MODE_CONTINUOUS_CIRCUIT_BLOCK_SECTIONED, 0xFF, // 38 (none)
RIDE_MODE_CONTINUOUS_CIRCUIT, RIDE_MODE_CONTINUOUS_CIRCUIT_BLOCK_SECTIONED, 0xFF, // 39 Flying Roller Coaster
RIDE_MODE_CONTINUOUS_CIRCUIT, RIDE_MODE_CONTINUOUS_CIRCUIT_BLOCK_SECTIONED, 0xFF, // 3A (none)
RIDE_MODE_CONTINUOUS_CIRCUIT, 0xFF, // 3B Virginia Reel
RIDE_MODE_CONTINUOUS_CIRCUIT, 0xFF, // 3C Splash Boats
RIDE_MODE_CONTINUOUS_CIRCUIT, 0xFF, // 3D Mini Helicopters
RIDE_MODE_CONTINUOUS_CIRCUIT, RIDE_MODE_CONTINUOUS_CIRCUIT_BLOCK_SECTIONED, 0xFF, // 3E Lay-down Roller Coaster
RIDE_MODE_CONTINUOUS_CIRCUIT, RIDE_MODE_SHUTTLE, 0xFF, // 3F Suspended Monorail
RIDE_MODE_CONTINUOUS_CIRCUIT, RIDE_MODE_CONTINUOUS_CIRCUIT_BLOCK_SECTIONED, 0xFF, // 40 (none)
RIDE_MODE_CONTINUOUS_CIRCUIT, 0xFF, // 41 Reverser Roller Coaster
RIDE_MODE_CONTINUOUS_CIRCUIT, 0xFF, // 42 Heartline Twister Roller Coaster
RIDE_MODE_CONTINUOUS_CIRCUIT, 0xFF, // 43 Mini Golf
RIDE_MODE_CONTINUOUS_CIRCUIT, RIDE_MODE_CONTINUOUS_CIRCUIT_BLOCK_SECTIONED, 0xFF, // 44 Giga Coaster
RIDE_MODE_FREEFALL_DROP, 0xFF, // 45 Roto-Drop
RIDE_MODE_BUMPERCAR, 0xFF, // 46 Flying Saucers
RIDE_MODE_CROOKED_HOUSE, 0xFF, // 47 Crooked House
RIDE_MODE_CONTINUOUS_CIRCUIT, 0xFF, // 48 Monorail Cycles
RIDE_MODE_CONTINUOUS_CIRCUIT, RIDE_MODE_CONTINUOUS_CIRCUIT_BLOCK_SECTIONED, 2, 0xFF, // 49 Compact Inverted Coaster
RIDE_MODE_CONTINUOUS_CIRCUIT, RIDE_MODE_CONTINUOUS_CIRCUIT_BLOCK_SECTIONED, 0xFF, // 4A Water Coaster
RIDE_MODE_POWERED_LAUNCH, 0xFF, // 4B Air Powered Vertical Coaster
RIDE_MODE_CONTINUOUS_CIRCUIT, RIDE_MODE_CONTINUOUS_CIRCUIT_BLOCK_SECTIONED, 0xFF, // 4C Inverted Hairpin Coaster
RIDE_MODE_SWING, 0xFF, // 4D Magic Carpet
RIDE_MODE_CONTINUOUS_CIRCUIT, 0xFF, // 4E Submarine Ride
RIDE_MODE_CONTINUOUS_CIRCUIT, 0xFF, // 4F River Rafts
RIDE_MODE_SHOP_STALL, 0xFF, // 50 (none)
RIDE_MODE_ROTATION, 0xFF, // 51 Enterprise
RIDE_MODE_SHOP_STALL, 0xFF, // 52 (none)
RIDE_MODE_SHOP_STALL, 0xFF, // 53 (none)
RIDE_MODE_SHOP_STALL, 0xFF, // 54 (none)
RIDE_MODE_CONTINUOUS_CIRCUIT, 0xFF, // 55 (none)
RIDE_MODE_POWERED_LAUNCH, 0xFF, // 56 Inverted Impulse Coaster
RIDE_MODE_CONTINUOUS_CIRCUIT, RIDE_MODE_CONTINUOUS_CIRCUIT_BLOCK_SECTIONED, 0xFF, // 57 Mini Roller Coaster
RIDE_MODE_CONTINUOUS_CIRCUIT, 0xFF, // 58 Mine Ride
RIDE_MODE_CONTINUOUS_CIRCUIT, RIDE_MODE_CONTINUOUS_CIRCUIT_BLOCK_SECTIONED, 0xFF, // 59 LIM Launched Roller Coaster
RIDE_MODE_POWERED_LAUNCH_35, RIDE_MODE_POWERED_LAUNCH_BLOCK_SECTIONED, 0xFF // 60 (none)
};

View File

@ -23,6 +23,14 @@
#include <stdbool.h>
#include "rct2.h"
#include "string_ids.h"
typedef struct {
rct_string_id vehicle_name;
rct_string_id structure_name;
rct_string_id station_name;
rct_string_id unk_name;
} rct_ride_name_convention;
extern const bool hasRunningTrack[0x60];
extern const uint8 initialUpkeepCosts[0x60];
@ -32,4 +40,7 @@ extern const uint8 rideUnknownData1[0x60];
extern const bool rideUnknownData2[0x60];
extern const uint8 rideUnknownData3[0x60];
extern const rct_ride_name_convention RideNameConvention[96];
extern const uint8 RideAvailableModes[];
#endif

View File

@ -56,9 +56,9 @@ void crooked_house_excitement(rct_ride *ride)
ride->var_14D |= 2;
// clear all bits except lowest 5
ride->var_114 &= 0x1f;
ride->inversions &= 0x1F;
// set 6th,7th,8th bits
ride->var_114 |= 0xE0;
ride->inversions |= 0xE0;
}
/**
@ -75,27 +75,22 @@ uint16 compute_upkeep(rct_ride *ride)
uint16 upkeep = initialUpkeepCosts[ride->type];
uint16 trackCost = costPerTrackPiece[ride->type];
uint8 dl = ride->var_115;
uint8 dl = ride->drops;
dl = dl >> 6;
dl = dl & 3;
upkeep += trackCost * dl;
uint32 cuml = ride->var_0E4;
cuml += ride->var_0E8;
cuml += ride->var_0EC;
cuml += ride->var_0F0;
cuml = cuml >> 0x10;
uint32 totalLength = (ride->length[0] + ride->length[1] + ride->length[2] + ride->length[3]) >> 16;
// The data originally here was 20's and 0's. The 20's all represented
// rides that had tracks. The 0's were fixed rides like crooked house or
// bumper cars.
// Data source is 0x0097E3AC
if (hasRunningTrack[ride->type]) {
cuml = cuml * 20;
totalLength *= 20;
}
cuml = cuml >> 0x0A;
upkeep += (uint16)cuml;
upkeep += (uint16)(totalLength >> 10);
if (ride->lifecycle_flags & RIDE_LIFECYCLE_ON_RIDE_PHOTO) {
// The original code read from a table starting at 0x0097E3AE and
@ -130,24 +125,24 @@ uint16 compute_upkeep(rct_ride *ride)
// various variables set on the ride itself.
// https://gist.github.com/kevinburke/e19b803cd2769d96c540
upkeep += rideUnknownData1[ride->type] * ride->var_0C8;
upkeep += rideUnknownData1[ride->type] * ride->num_vehicles;
// either set to 3 or 0, extra boosts for some rides including mini golf
if (rideUnknownData2[ride->type]) {
upkeep += 3 * ride->var_0C9;
upkeep += 3 * ride->num_cars_per_train;
}
// slight upkeep boosts for some rides - 5 for mini railroad, 10 for log
// flume/rapids, 10 for roller coaster, 28 for giga coaster
upkeep += rideUnknownData3[ride->type] * ride->var_0C7;
upkeep += rideUnknownData3[ride->type] * ride->num_stations;
if (ride->mode == RIDE_MODE_REVERSE_INCLINED_SHUTTLE) {
if (ride->mode == RIDE_MODE_REVERSE_INCLINE_LAUNCHED_SHUTTLE) {
upkeep += 30;
} else if (ride->mode == RIDE_MODE_POWERED_LAUNCH) {
upkeep += 160;
} else if (ride->mode == RIDE_MODE_LIM_POWERED_LAUNCH) {
upkeep += 320;
} else if (ride->mode == RIDE_MODE_POWERED_LAUNCH2 ||
} else if (ride->mode == RIDE_MODE_POWERED_LAUNCH_35 ||
ride->mode == RIDE_MODE_POWERED_LAUNCH_BLOCK_SECTIONED) {
upkeep += 220;
}
@ -184,7 +179,7 @@ rating_tuple per_ride_rating_adjustments(rct_ride *ride, ride_rating excitement,
// more detail: https://gist.github.com/kevinburke/d951e74e678b235eef3e
uint16 ridetype_var = RCT2_GLOBAL(0x0097D4F2 + ride->type * 8, uint16);
if (ridetype_var & 0x80) {
uint16 ax = ride->var_1F4;
uint16 ax = ride->total_air_time;
if (rideType->var_008 & 0x800) {
// 65e86e
ax = ax - 96;
@ -244,7 +239,7 @@ ride_rating apply_intensity_penalty(ride_rating excitement, ride_rating intensit
*/
void sub_655FD6(rct_ride *ride)
{
uint8 al = ride->var_1CD;
uint8 al = ride->lift_hill_speed;
// No idea what this address is; maybe like compensation of some kind? The
// maximum possible value?
// List of ride names/values is here:

View File

@ -419,13 +419,7 @@ void scenario_objective8_check()
ride->status == RIDE_STATUS_OPEN &&
ride->excitement >= RIDE_RATING(7,00) && type_already_counted[subtype_id] == 0){
// this calculates the length, no idea why it's done so complicated though.
uint8 limit = ride->var_0C7;
uint32 sum = 0;
for (int j = 0; j < limit; ++j) {
sum += ((uint32*)&ride->var_0E4)[j];
}
if ((sum >> 16) > (uint32)objective_length) {
if ((ride_get_total_length(ride) >> 16) > objective_length) {
type_already_counted[subtype_id]++;
rcs++;
}

View File

@ -44,6 +44,8 @@ enum {
SPR_RESIZE = 5058,
SPR_CONSTRUCTION = 5164,
SPR_DEMOLISH = 5165,
SPR_HEARING_VIEWPORT = 5166,
SPR_LOCATE = 5167,
SPR_RENAME = 5168,

View File

@ -252,6 +252,20 @@ enum {
STR_LOWER_COST_AMOUNT = 985,
STR_COST_AMOUNT = 986,
STR_CONSTRUCTION = 990,
STR_DEMOLISH_RIDE_TIP = 992,
STR_OVERALL_VIEW = 996,
STR_VIEW_SELECTION = 997,
STR_CANT_OPEN = 1002,
STR_CANT_TEST = 1003,
STR_CANT_CLOSE = 1004,
STR_CANT_START_CONSTRUCTION_ON = 1005,
STR_MUST_BE_CLOSED_FIRST = 1006,
STR_UNABLE_TO_CREATE_ENOUGH_VEHICLES = 1007,
STR_OPEN_CLOSE_OR_TEST_RIDE = 1008,
STR_OPEN_OR_CLOSE_ALL_RIDES = 1009,
STR_OPEN_OR_CLOSE_PARK_TIP = 1010,
STR_CLOSE_ALL = 1011,
@ -259,6 +273,8 @@ enum {
STR_CLOSE_PARK = 1013,
STR_OPEN_PARK = 1014,
STR_CANT_CHANGE_OPERATING_MODE = 1017,
STR_LOCATE_SUBJECT_TIP = 1027,
STR_LOAD_GAME_DIALOG_TITLE = 1036,
@ -268,6 +284,99 @@ enum {
STR_RCT2_LANDSCAPE_FILE = 1045,
STR_RIDES_IN_PARK_TIP = 1053,
STR_NAME_RIDE_TIP = 1054,
STR_RIDE_ATTRACTION_NAME = 1057,
STR_ENTER_NEW_NAME_FOR_THIS_RIDE_ATTRACTION = 1058,
STR_CANT_RENAME_RIDE_ATTRACTION = 1059,
STR_INVALID_RIDE_ATTRACTION_NAME = 1060,
STR_RIDE_MODE_START = 1061,
STR_RIDE_MODE_NORMAL = STR_RIDE_MODE_START + 0,
STR_RIDE_MODE_CONTINUOUS_CIRCUIT = STR_RIDE_MODE_START + 1,
STR_RIDE_MODE_REVERSE_INCLINE_LAUNCHED_SHUTTLE = STR_RIDE_MODE_START + 2,
STR_RIDE_MODE_POWERED_LAUNCH = STR_RIDE_MODE_START + 3,
STR_RIDE_MODE_SHUTTLE = STR_RIDE_MODE_START + 4,
STR_RIDE_MODE_BOAT_HIRE = STR_RIDE_MODE_START + 5,
STR_RIDE_MODE_UPWARD_LAUNCH = STR_RIDE_MODE_START + 6,
STR_RIDE_MODE_ROTATING_LIFT = STR_RIDE_MODE_START + 7,
STR_RIDE_MODE_STATION_TO_STATION = STR_RIDE_MODE_START + 8,
STR_RIDE_MODE_SINGLE_RIDE_PER_ADMISSION = STR_RIDE_MODE_START + 9,
STR_RIDE_MODE_UNLIMITED_RIDES_PER_ADMISSION = STR_RIDE_MODE_START + 10,
STR_RIDE_MODE_MAZE = STR_RIDE_MODE_START + 11,
STR_RIDE_MODE_RACE = STR_RIDE_MODE_START + 12,
STR_RIDE_MODE_BUMPER_CAR = STR_RIDE_MODE_START + 13,
STR_RIDE_MODE_SWING = STR_RIDE_MODE_START + 14,
STR_RIDE_MODE_SHOP_STALL = STR_RIDE_MODE_START + 15,
STR_RIDE_MODE_ROTATION = STR_RIDE_MODE_START + 16,
STR_RIDE_MODE_FORWARD_ROTATION = STR_RIDE_MODE_START + 17,
STR_RIDE_MODE_BACKWARD_ROTATION = STR_RIDE_MODE_START + 18,
STR_RIDE_MODE_FILM_AVENGING_AVIATORS = STR_RIDE_MODE_START + 19,
STR_RIDE_MODE_3D_FILM_MOUSE_TAILS = STR_RIDE_MODE_START + 20,
STR_RIDE_MODE_SPACE_RINGS = STR_RIDE_MODE_START + 21,
STR_RIDE_MODE_BEGINNERS = STR_RIDE_MODE_START + 22,
STR_RIDE_MODE_LIM_POWERED_LAUNCH = STR_RIDE_MODE_START + 23,
STR_RIDE_MODE_FILM_THRILL_RIDERS = STR_RIDE_MODE_START + 24,
STR_RIDE_MODE_3D_FILM_STORM_CHASERS = STR_RIDE_MODE_START + 25,
STR_RIDE_MODE_3D_FILM_SPACE_RAIDERS = STR_RIDE_MODE_START + 26,
STR_RIDE_MODE_INTENSE = STR_RIDE_MODE_START + 27,
STR_RIDE_MODE_BERSERK = STR_RIDE_MODE_START + 28,
STR_RIDE_MODE_HAUNTED_HOUSE = STR_RIDE_MODE_START + 29,
STR_RIDE_MODE_CIRCUS_SHOW = STR_RIDE_MODE_START + 30,
STR_RIDE_MODE_DOWNWARD_LAUNCH = STR_RIDE_MODE_START + 31,
STR_RIDE_MODE_CROOKED_HOUSE = STR_RIDE_MODE_START + 32,
STR_RIDE_MODE_FREEFALL_DROP = STR_RIDE_MODE_START + 33,
STR_RIDE_MODE_CONTINUOUS_CIRCUIT_BLOCK_SECTIONED = STR_RIDE_MODE_START + 34,
STR_RIDE_MODE_POWERED_LAUNCH_35 = STR_RIDE_MODE_START + 35,
STR_RIDE_MODE_POWERED_LAUNCH_BLOCK_SECTIONED_MODE = STR_RIDE_MODE_START + 36,
STR_MOVING_TO_END_OF = 1098,
STR_WAITING_FOR_PASSENGERS_AT = 1099,
STR_WAITING_TO_DEPART = 1100,
STR_DEPARTING = 1101,
STR_TRAVELLING_AT_0 = 1102,
STR_ARRIVING_AT = 1103,
STR_UNLOADING_PASSENGERS_AT = 1104,
STR_TRAVELLING_AT_1 = 1105,
STR_CRASHING = 1106,
STR_CRASHED_0 = 1107,
STR_TRAVELLING_AT_2 = 1108,
STR_SWINGING = 1109,
STR_ROTATING_0 = 1110,
STR_ROTATING_1 = 1111,
STR_OPERATING_0 = 1112,
STR_SHOWING_FILM = 1113,
STR_ROTATING_2 = 1114,
STR_OPERATING_1 = 1115,
STR_OPERATING_2 = 1116,
STR_DOING_CIRCUS_SHOW = 1117,
STR_OPERATING_3 = 1118,
STR_WAITING_FOR_CABLE_LIFT = 1119,
STR_TRAVELLING_AT_3 = 1120,
STR_STOPPING_0 = 1121,
STR_WAITING_FOR_PASSENGERS = 1122,
STR_WAITING_TO_START = 1123,
STR_STARTING = 1124,
STR_OPERATING = 1125,
STR_STOPPING_1 = 1126,
STR_UNLOADING_PASSENGERS = 1127,
STR_STOPPED_BY_BLOCK_BRAKES = 1128,
STR_ALL_VEHICLES_IN_SAME_COLOURS = 1129,
STR_DIFFERENT_COLOURS_PER = 1130,
STR_DIFFERENT_COLOURS_PER_VEHICLE = 1131,
STR_SELECT_MAIN_COLOUR_TIP = 1136,
STR_SELECT_ADDITIONAL_COLOUR_1_TIP = 1137,
STR_SELECT_ADDITIONAL_COLOUR_2_TIP = 1138,
STR_SELECT_SUPPORT_STRUCTURE_COLOUR_TIP = 1139,
STR_SELECT_VEHICLE_COLOUR_SCHEME_TIP = 1140,
STR_SELECT_VEHICLE_TO_MODIFY_TIP = 1141,
STR_QUARTER_LOAD = 1148,
STR_HALF_LOAD = 1149,
STR_THREE_QUARTER_LOAD = 1150,
STR_FULL_LOAD = 1151,
STR_ANY_LOAD = 1152,
STR_PLACE_SCENERY_TIP = 1159,
STR_ADJUST_WATER_TIP = 1160,
@ -305,10 +414,24 @@ enum {
STR_QUEUE_PEOPLE = 1203,
STR_QUEUE_TIME_LABEL = 1204,
STR_QUEUE_TIME_PLURAL_LABEL = 1205,
STR_WAIT_FOR = 1206,
STR_LEAVE_IF_ANOTHER_TRAIN_ARRIVES = 1207,
STR_LEAVE_IF_ANOTHER_BOAT_ARRIVES = 1208,
STR_WAIT_FOR_PASSENGERS_BEFORE_DEPARTING_TIP = 1209,
STR_LEAVE_IF_ANOTHER_VEHICLE_ARRIVES_TIP = 1210,
STR_MINIMUM_WAITING_TIME = 1211,
STR_MAXIMUM_WAITING_TIME = 1212,
STR_MINIMUM_LENGTH_BEFORE_DEPARTING_TIP = 1213,
STR_MAXIMUM_LENGTH_BEFORE_DEPARTING_TIP = 1214,
STR_SYNCHRONISE_WITH_ADJACENT_STATIONS = 1215,
STR_SYNCHRONISE_WITH_ADJACENT_STATIONS_TIP = 1216,
STR_NUMERIC_UP = 1218,
STR_NUMERIC_DOWN = 1219,
STR_EXIT_ONLY = 1220,
STR_NO_ENTRANCE = 1221,
STR_NO_EXIT = 1222,
STR_TRANSPORT_RIDES_TIP = 1223,
STR_GENTLE_RIDES_TIP = 1224,
STR_ROLLER_COASTERS_TIP = 1225,
@ -317,13 +440,47 @@ enum {
STR_SHOPS_STALLS_TIP = 1228,
STR_ROTATE_OBJECTS_90 = 1327,
STR_LAUNCH_SPEED = 1329,
STR_LAUNCH_SPEED_TIP = 1330,
STR_NO_TEST_RESULTS_YET = 1339,
STR_MAX_SPEED = 1340,
STR_RIDE_TIME = 1341,
STR_RIDE_LENGTH = 1344,
STR_AVERAGE_SPEED = 1347,
STR_MAX_POSITIVE_VERTICAL_G = 1348,
STR_MAX_POSITIVE_VERTICAL_G_RED = 1349,
STR_MAX_NEGATIVE_VERTICAL_G = 1350,
STR_MAX_NEGATIVE_VERTICAL_G_RED = 1351,
STR_MAX_LATERAL_G = 1352,
STR_MAX_LATERAL_G_RED = 1353,
STR_HIGHEST_DROP_HEIGHT = 1354,
STR_DROPS = 1355,
STR_INVERSIONS = 1356,
STR_HOLES = 1357,
STR_TOTAL_AIR_TIME = 1358,
STR_QUEUE_TIME_MINUTE = 1359,
STR_QUEUE_TIME_MINUTES = 1360,
STR_VIEW_OF_RIDE_ATTRACTION_TIP = 1392,
STR_VEHICLE_DETAILS_AND_OPTIONS_TIP = 1393,
STR_OPERATING_OPTIONS_TIP = 1394,
STR_MAINTENANCE_OPTIONS_TIP = 1395,
STR_COLOUR_SCHEME_OPTIONS_TIP = 1396,
STR_SOUND_AND_MUSIC_OPTIONS_TIP = 1397,
STR_MEASUREMENTS_AND_TEST_DATA_TIP = 1398,
STR_GRAPHS_TIP = 1399,
STR_BUILD_THIS = 1407,
STR_COST_LABEL = 1408,
STR_LOGGING_DATA_FROM_TIP = 1422,
STR_QUEUE_LINE_PATH_TIP = 1423,
STR_FOOTPATH_TIP = 1424,
STR_CUSTOMERS_PER_HOUR = 1427,
STR_RIDE_INCOME_ADMISSION_PRICE = 1428,
STR_FREE = 1430,
STR_WALKING = 1431,
STR_HEADING_FOR = 1432,
@ -347,15 +504,37 @@ enum {
STR_GUESTS = 1463,
STR_STAFF = 1468,
STR_SPEED = 1471,
STR_SPEED_TIP = 1472,
STR_EXCITEMENT_RATING = 1473,
STR_EXCITEMENT_RATING_NOT_YET_AVAILABLE = 1474,
STR_INTENSITY_RATING = 1475,
STR_INTENSITY_RATING_NOT_YET_AVAILABLE = 1476,
STR_INTENSITY_RATING_RED = 1477,
STR_NAUSEA_RATING = 1478,
STR_NAUSEA_RATING_NOT_YET_AVAILABLE = 1479,
STR_THOUGHT_START = 1480,
STR_CONSTRUCT_FOOTPATH_ON_LAND_TIP = 1655,
STR_CONSTRUCT_BRIDGE_OR_TUNNEL_FOOTPATH_TIP = 1656,
STR_SATISFACTION_UNKNOWN = 1668,
STR_SATISFACTION_PERCENT = 1669,
STR_TOTAL_CUSTOMERS = 1670,
STR_TOTAL_PROFIT = 1671,
STR_POPULARITY_UNKNOWN = 1677,
STR_POPULARITY_PERCENT = 1678,
STR_GUESTS_TIP = 1693,
STR_STAFF_TIP = 1694,
STR_INCOME_AND_COSTS_TIP = 1695,
STR_CUSTOMER_INFORMATION_TIP = 1696,
STR_TOO_MANY_PEOPLE_IN_GAME = 1699,
STR_HIRE_HANDYMAN = 1700,
STR_HIRE_MECHANIC = 1701,
@ -376,12 +555,25 @@ enum {
STR_CANT_OPEN_PARK = 1723,
STR_CANT_CLOSE_PARK = 1724,
STR_NUMBER_OF_LAPS = 1734,
STR_NUMBER_OF_LAPS_TIP = 1735,
STR_RACE_WON_BY_GUEST = 1739,
STR_RACE_WON_BY = 1740,
STR_MAX_PEOPLE_ON_RIDE = 1742,
STR_MAX_PEOPLE_ON_RIDE_TIP = 1743,
STR_TIME_LIMIT = 1747,
STR_TIME_LIMIT_TIP = 1748,
STR_INDIVIDUAL_GUESTS_TIP = 1752,
STR_SUMMARISED_GUESTS_TIP = 1753,
STR_ADMISSION_PRICE = 1756,
STR_RELIABILITY_LABEL_1757 = 1757,
STR_NUMBER_OF_SWINGS = 1769,
STR_NUMBER_OF_SWINGS_TIP = 1770,
STR_OFF = 1775,
STR_ON = 1776,
@ -394,6 +586,18 @@ enum {
STR_FIXING_RIDE = 1794,
STR_ANSWERING_RADIO_CALL = 1795,
STR_SAFETY_CUT_OUT = 1800,
STR_RESTRAINTS_STUCK_CLOSED = 1801,
STR_RESTRAINTS_STUCK_OPEN = 1802,
STR_DOORS_STUCK_CLOSED = 1803,
STR_DOORS_STUCK_OPEN = 1804,
STR_VEHICLE_MALFUNCTION = 1805,
STR_BRAKES_FAILURE = 1806,
STR_CONTROL_FAILURE = 1807,
STR_LAST_BREAKDOWN = 1808,
STR_CURRENT_BREAKDOWN = 1809,
STR_ACTIONS = 1814,
STR_THOUGHTS = STR_ACTIONS + 1,
STR_INFORMATION_TYPE_TIP = 1816,
@ -404,6 +608,10 @@ enum {
STR_GUESTS_FILTER_THINKING = STR_GUESTS_FILTER + 1,
STR_GUESTS_FILTER_THINKING_ABOUT = STR_GUESTS_FILTER + 2,
STR_SHOW_GUESTS_THOUGHTS_ABOUT_THIS_RIDE_ATTRACTION_TIP = 1823,
STR_SHOW_GUESTS_ON_THIS_RIDE_ATTRACTION_TIP = 1824,
STR_SHOW_GUESTS_QUEUING_FOR_THIS_RIDE_ATTRACTION_TIP = 1825,
STR_STATUS = 1826,
STR_POPULARITY = 1827,
STR_SATISFACTION = 1828,
@ -425,6 +633,18 @@ enum {
STR_RIDE_LIST_INFORMATION_TYPE_TIP = 1844,
STR_NUM_GUESTS = 1846,
STR_PLAY_MUSIC = 1849,
STR_SELECT_MUSIC_TIP = 1850,
STR_RUNNING_COST_PER_HOUR = 1851,
STR_RUNNING_COST_UNKNOWN = 1852,
STR_BUILT_THIS_YEAR = 1853,
STR_BUILT_LAST_YEAR = 1854,
STR_BUILT_YEARS_AGO = 1855,
STR_PROFIT_PER_ITEM_SOLD = 1856,
STR_LOSS_PER_ITEM_SOLD = 1857,
STR_COST_PER_MONTH = 1858,
STR_HANDYMAN_PLURAL = 1859,
STR_MECHANIC_PLURAL = 1860,
STR_SECURITY_GUARD_PLURAL = 1861,
@ -435,8 +655,32 @@ enum {
STR_ENTERTAINER_SINGULAR = 1866,
STR_STAFF_LIST_COUNTER = 1867,
STR_NUMBER_OF_ROTATIONS = 1869,
STR_NUMBER_OF_ROTATIONS_TIP = 1870,
STR_INCOME_PER_HOUR = 1873,
STR_PROFIT_PER_HOUR = 1874,
STR_INSPECT_RIDES = 1876,
STR_FIX_RIDES = 1877,
STR_INSPECTION = 1878,
STR_EVERY_10_MINUTES = 1879,
STR_EVERY_20_MINUTES = 1880,
STR_EVERY_30_MINUTES = 1881,
STR_EVERY_45_MINUTES = 1882,
STR_EVERY_HOUR = 1883,
STR_EVERY_2_HOURS = 1884,
STR_NEVER = 1885,
STR_INSPECTING_RIDE = 1886,
STR_TIME_SINCE_LAST_INSPECTION_MINUTES = 1887,
STR_TIME_SINCE_LAST_INSPECTION_MORE_THAN_4_HOURS = 1888,
STR_DOWN_TIME_LABEL_1889 = 1889,
STR_SELECT_HOW_OFTEN_A_MECHANIC_SHOULD_CHECK_THIS_RIDE = 1890,
STR_ITEMS_SOLD = 1894,
STR_BUILD_RIDE_TIP = 1895,
STR_FINANCES_SUMMARY_EXPENDITURE_INCOME = 1896,
STR_FINANCES_SUMMARY_RIDE_CONSTRUCTION = 1897,
@ -481,6 +725,16 @@ enum {
STR_MARKETING = 1953,
STR_RESEARCH_FUNDING = 1954,
STR_NUMBER_OF_CIRCUITS = 1955,
STR_NUMBER_OF_CIRCUITS_TIP = 1956,
STR_ON_RIDE_PHOTO_PRICE = 1963,
STR_MAIN_COLOUR_SCHEME = 2971,
STR_ALTERNATIVE_COLOUR_SCHEME_1 = 2972,
STR_ALTERNATIVE_COLOUR_SCHEME_2 = 2973,
STR_ALTERNATIVE_COLOUR_SCHEME_3 = 2974,
STR_ITEM_START = 1988,
STR_ITEM_SINGULAR_START = 2044,
STR_ITEM2_START = 2090,
@ -609,12 +863,12 @@ enum {
STR_LOW = 2369,
STR_AVERAGE = 2370,
STR_HIGH = 2371,
//STR_LOW = 2372,
STR_MEDIUM = 2373,
//STR_HIGH = 2374,
STR_VERY_HIGH = 2375,
STR_EXTREME = 2376,
STR_ULTRA_EXTREME = 2377,
STR_RATING_LOW = 2372,
STR_RATING_MEDIUM = 2373,
STR_RATING_HIGH = 2374,
STR_RATING_VERY_HIGH = 2375,
STR_RATING_EXTREME = 2376,
STR_RATING_ULTRA_EXTREME = 2377,
STR_ADJUST_SMALLER_LAND_TIP = 2378,
STR_ADJUST_LARGER_LAND_TIP = 2379,
@ -709,6 +963,13 @@ enum {
STR_RESEARCH_NEW_SHOPS_AND_STALLS = 2475,
STR_RESEARCH_NEW_SCENERY_AND_THEMING = 2476,
STR_SELECT_OPERATING_MODE = 2477,
STR_SHOW_GRAPH_OF_VELOCITY_AGAINST_TIME_TIP = 2478,
STR_SHOW_GRAPH_OF_ALTITUDE_AGAINST_TIME_TIP = 2479,
STR_SHOW_GRAPH_OF_VERTICAL_ACCELERATION_AGAINST_TIME_TIP = 2480,
STR_SHOW_GRAPH_OF_LATERAL_ACCELERATION_AGAINST_TIME_TIP = 2481,
STR_PROFIT_PER_WEEK_AND_PARK_VALUE_TIP = 2482,
STR_FINANCES_WEEKLY_PROFIT_POSITIVE = 2483,
STR_FINANCES_WEEKLY_PROFIT_LOSS = 2484,
@ -808,19 +1069,83 @@ enum {
STR_LICENCE_AGREEMENT_NOTICE_1 = 2969,
STR_LICENCE_AGREEMENT_NOTICE_2 = 2970,
STR_COLOUR_SCHEME_TO_CHANGE_TIP = 2975,
STR_PAINT_INDIVIDUAL_AREA_TIP = 2976,
STR_UNABLE_TO_LOAD_FILE = 3010,
STR_FILE_CONTAINS_INVALID_DATA = 3011,
STR_MUSIC_STYLE_START = 3012,
STR_DODGEMS_BEAT_STYLE = STR_MUSIC_STYLE_START + 0,
STR_FAIRGROUND_ORGAN_STYLE = STR_MUSIC_STYLE_START + 1,
STR_ROMAN_FANFARE_STYLE = STR_MUSIC_STYLE_START + 2,
STR_ORIENTAL_STYLE = STR_MUSIC_STYLE_START + 3,
STR_MARTIAN_STYLE = STR_MUSIC_STYLE_START + 4,
STR_JUNGLE_DRUMS_STYLE = STR_MUSIC_STYLE_START + 5,
STR_EGYPTIAN_STYLE = STR_MUSIC_STYLE_START + 6,
STR_TOYLAND_STYLE = STR_MUSIC_STYLE_START + 7,
// STR_??? = STR_MUSIC_STYLE_START + 8,
STR_SPACE_STYLE = STR_MUSIC_STYLE_START + 9,
STR_HORROR_STYLE = STR_MUSIC_STYLE_START + 10,
STR_TECHNO_STYLE = STR_MUSIC_STYLE_START + 11,
STR_GENTLE_STYLE = STR_MUSIC_STYLE_START + 12,
STR_SUMMER_STYLE = STR_MUSIC_STYLE_START + 13,
STR_WATER_STYLE = STR_MUSIC_STYLE_START + 14,
STR_WILD_WEST_STYLE = STR_MUSIC_STYLE_START + 15,
STR_JURASSIC_STYLE = STR_MUSIC_STYLE_START + 16,
STR_ROCK_STYLE = STR_MUSIC_STYLE_START + 17,
STR_RAGTIME_STYLE = STR_MUSIC_STYLE_START + 18,
STR_FANTASY_STYLE = STR_MUSIC_STYLE_START + 19,
STR_ROCK_STYLE_2 = STR_MUSIC_STYLE_START + 20,
STR_ICE_STYLE = STR_MUSIC_STYLE_START + 21,
STR_SNOW_STYLE = STR_MUSIC_STYLE_START + 22,
STR_CUSTOM_MUSIC_1 = STR_MUSIC_STYLE_START + 23,
STR_CUSTOM_MUSIC_2 = STR_MUSIC_STYLE_START + 24,
STR_MEDIEVAL_STYLE = STR_MUSIC_STYLE_START + 25,
STR_URBAN_STYLE = STR_MUSIC_STYLE_START + 26,
STR_ORGAN_STYLE = STR_MUSIC_STYLE_START + 27,
STR_MECHANICAL_STYLE = STR_MUSIC_STYLE_START + 28,
STR_MODERN_STYLE = STR_MUSIC_STYLE_START + 29,
STR_PIRATES_STYLE = STR_MUSIC_STYLE_START + 30,
STR_ROCK_STYLE_3 = STR_MUSIC_STYLE_START + 31,
STR_CANDY_STYLE = STR_MUSIC_STYLE_START + 32,
STR_SELECT_MUSIC_STYLE_TIP = 3045,
STR_WHITE = 3055,
STR_TRANSLUCENT = 3056,
STR_CONSTRUCTION_MARKER = 3057,
STR_BRICK_WALLS = 3058,
STR_HEDGES = 3059,
STR_ICE_BLOCKS = 3060,
STR_WOODEN_FENCES = 3061,
STR_BEGINNER_PARKS = 3064,
STR_CHALLENGING_PARKS = STR_BEGINNER_PARKS + 1,
STR_EXPERT_PARKS = STR_BEGINNER_PARKS + 2,
STR_REAL_PARKS = STR_BEGINNER_PARKS + 3,
STR_OTHER_PARKS = STR_BEGINNER_PARKS + 4,
STR_SAME_PRICE_THROUGHOUT_PARK = 3071,
STR_SAME_PRICE_THROUGHOUT_PARK_TIP = 3072,
STR_PLAIN_ENTRANCE = 3078,
STR_WOODEN_ENTRANCE = 3079,
STR_CANVAS_TENT_ENTRANCE = 3080,
STR_CASTLE_ENTRANCE_GREY = 3081,
STR_CASTLE_ENTRANCE_BROWN = 3082,
STR_JUNGLE_ENTRANCE = 3083,
STR_LOG_CABIN_ENTRANCE = 3084,
STR_CLASSICAL_ROMAN_ENTRANCE = 3085,
STR_ABSTRACT_ENTRANCE = 3086,
STR_SNOW_ICE_ENTRANCE = 3087,
STR_PAGODA_ENTRANCE = 3088,
STR_SPACE_ENTRANCE = 3089,
STR_SELECT_STYLE_OF_ENTRANCE_EXIT_STATION_TIP = 3090,
STR_SELECT_LIFT_HILL_CHAIN_SPEED_TIP = 3097,
STR_SELECT_COLOUR = 3099,
STR_SELECT_SECONDARY_COLOUR = 3100,
STR_SELECT_TERNARY_COLOUR = 3101,
@ -828,6 +1153,30 @@ enum {
STR_LIST_RIDES_TIP = 3104,
STR_LIST_SHOPS_AND_STALLS_TIP = 3105,
STR_LIST_KIOSKS_AND_FACILITIES_TIP = 3106,
STR_CLOSE_RIDE = 3107,
STR_TEST_RIDE = 3108,
STR_OPEN_RIDE = 3109,
STR_BLOCK_SECTIONS = 3110,
STR_SAVE_TRACK_DESIGN = 3115,
STR_SAVE_TRACK_DESIGN_NOT_POSSIBLE = 3116,
STR_CALLING_MECHANIC = 3117,
STR_MEHCANIC_IS_HEADING_FOR_THE_RIDE = 3118,
STR_MEHCANIC_IS_FIXING_THE_RIDE = 3119,
STR_LOCATE_NEAREST_AVAILABLE_MECHANIC_TIP = 3120,
STR_FAVOURITE_RIDE_OF_GUEST = 3122,
STR_FAVOURITE_RIDE_OF_GUESTS = 3123,
STR_SAVE_TRACK_DESIGN_ITEM = 3128,
STR_SAVE_TRACK_DESIGN_WITH_SCENERY_ITEM = 3129,
STR_DESIGN_SAVE = 3130,
STR_DESIGN_CANCEL = 3131,
STR_CLICK_ITEMS_OF_SCENERY_TO_SELECT = 3132,
STR_SELECT_NEARBY_SCENERY = 3137,
STR_RESET_SELECTION = 3138,
STR_SCROLL_LEFT_TIP = 3145,
STR_SCROLL_RIGHT_TIP = STR_SCROLL_LEFT_TIP + 1,

View File

@ -89,7 +89,7 @@ void sub_6BB9FF(rct_vehicle* vehicle)
v18 = 64;
}
i->var_4 = (sint16)(((v15.both / v18) - 0x8000) >> 4);
sint32 v19 = vehicle->var_28;
sint32 v19 = vehicle->velocity;
int testaddr = (vehicle->var_31 * 0x65);
testaddr += (int)RCT2_ADDRESS(0x009ACFA4, rct_ride_type*)[vehicle->var_D6];
@ -138,7 +138,7 @@ int sub_6BC2F3(rct_vehicle* vehicle)
do {
result += vehicle_temp->var_46;
} while (vehicle_temp->next_vehicle_on_train != (uint16)-1 && (vehicle_temp = GET_VEHICLE(vehicle_temp->next_vehicle_on_train)));
sint32 v4 = vehicle->var_28;
sint32 v4 = vehicle->velocity;
if (v4 < 0) {
v4 = -v4;
}

View File

@ -48,20 +48,23 @@ typedef struct {
rct_widthheight view; // 0x1A
uint16 var_1E;
uint8 pad_20[0x08];
sint32 var_28;
sint32 velocity; // 0x28
uint8 pad_2C[0x04];
uint8 ride; // 0x30
uint8 var_31;
uint8 pad_32[0x02];
uint16 var_34;
uint8 pad_36[0x08];
sint16 var_36;
uint8 pad_38[0x06];
uint16 next_vehicle_on_train; // 0x3E
uint32 var_40;
uint16 var_44;
uint16 var_46;
uint16 var_48;
uint8 pad_4A[0x06];
uint8 var_50;
uint8 pad_4A;
uint8 var_4B;
uint8 pad_4C[0x4];
uint8 status;
uint8 var_51;
uint16 peep; // 0x52
uint8 pad_54[0x2C];
@ -84,6 +87,40 @@ typedef struct {
uint8 var_D6;
} rct_vehicle;
enum {
VEHICLE_STATUS_MOVING_TO_END_OF_STATION,
VEHICLE_STATUS_WAITING_FOR_PASSENGERS,
VEHICLE_STATUS_WAITING_TO_DEPART,
VEHICLE_STATUS_DEPARTING,
VEHICLE_STATUS_TRAVELLING,
VEHICLE_STATUS_ARRIVING,
VEHICLE_STATUS_UNLOADING_PASSENGERS,
VEHICLE_STATUS_TRAVELLING_07,
VEHICLE_STATUS_CRASHING,
VEHICLE_STATUS_CRASHED,
VEHICLE_STATUS_TRAVELLING_0A,
VEHICLE_STATUS_SWINGING,
VEHICLE_STATUS_ROTATING,
VEHICLE_STATUS_ROTATING_0D,
VEHICLE_STATUS_OPERATING,
VEHICLE_STATUS_SHOWING_FILM,
VEHICLE_STATUS_ROTATING_10,
VEHICLE_STATUS_OPERATING_11,
VEHICLE_STATUS_OPERATING_12,
VEHICLE_STATUS_DOING_CIRCUS_SHOW,
VEHICLE_STATUS_OPERATING_13,
VEHICLE_STATUS_WAITING_FOR_CABLE_LIFT,
VEHICLE_STATUS_TRAVELLING_15,
VEHICLE_STATUS_STOPPING,
VEHICLE_STATUS_WAITING_FOR_PASSENGERS_17,
VEHICLE_STATUS_WAITING_TO_START,
VEHICLE_STATUS_STARTING,
VEHICLE_STATUS_OPERATING_1A,
VEHICLE_STATUS_STOPPING_1B,
VEHICLE_STATUS_UNLOADING_PASSENGERS_1C,
VEHICLE_STATUS_STOPPED_BY_BLOCK_BRAKES
};
void vehicle_update_all();
int sub_6BC2F3(rct_vehicle* vehicle);
void sub_6BB9FF(rct_vehicle* vehicle);

View File

@ -1576,13 +1576,13 @@ void RCT2_CALLPROC_WE_MOUSE_DOWN(int address, int widgetIndex, rct_window*w, rc
}
/* Based on rct2: 0x6987ED and another version from window_park */
void window_align_tabs( rct_window *w, uint8 start_tab_id, uint8 end_tab_id )
void window_align_tabs(rct_window *w, uint8 start_tab_id, uint8 end_tab_id)
{
int x = w->widgets[start_tab_id].left;
int i, x = w->widgets[start_tab_id].left;
int tab_width = w->widgets[start_tab_id].right - w->widgets[start_tab_id].left;
for (int i = start_tab_id; i < end_tab_id; ++i){
if ( !(w->disabled_widgets & (1LL << i)) ){
for (i = start_tab_id; i <= end_tab_id; i++) {
if (!(w->disabled_widgets & (1LL << i))) {
w->widgets[i].left = x;
w->widgets[i].right = x + tab_width;
x += tab_width + 1;

View File

@ -158,8 +158,9 @@ typedef struct{
} map_variables;
typedef struct {
sint16 var_480;
sint16 view;
sint32 var_482;
sint32 var_486;
} ride_variables;
typedef struct {
@ -343,6 +344,7 @@ enum {
WC_SAVE_PROMPT = 14,
WC_RIDE_LIST = 15,
WC_CONSTRUCT_RIDE = 16,
WC_DEMOLISH_RIDE_PROMPT = 17,
WC_SCENERY = 18,
WC_OPTIONS = 19,
WC_FOOTPATH = 20,
@ -514,6 +516,12 @@ void RCT2_CALLPROC_WE_MOUSE_DOWN(int address, int widgetIndex, rct_window*w, rct
__asm mov widgetIndex, dx \
__asm mov w, esi
#define window_textinput_get_registers(w, widgetIndex, result, text) \
__asm mov result, cl \
__asm mov widgetIndex, dx \
__asm mov w, esi \
__asm mov text, edi
#define window_paint_get_registers(w, dpi) \
__asm mov w, esi \
__asm mov dpi, edi
@ -547,6 +555,12 @@ void RCT2_CALLPROC_WE_MOUSE_DOWN(int address, int widgetIndex, rct_window*w, rct
__asm__ ( "mov %["#widgetIndex"], dx " : [widgetIndex] "+m" (widgetIndex) ); \
__asm__ ( "mov %["#w"], esi " : [w] "+m" (w) );
#define window_textinput_get_registers(w, widgetIndex, result, text) \
__asm__ ( "mov %[result], cl " : [result] "+m" (result) ); \
__asm__ ( "mov %[widgetIndex], dx " : [widgetIndex] "+m" (widgetIndex) ); \
__asm__ ( "mov %[w], esi " : [w] "+m" (w) ); \
__asm__ ( "mov %[text], edi " : [text] "+m" (text) );
#define window_paint_get_registers(w, dpi) \
__asm__ ( "mov %["#w"], esi " : [w] "+m" (w) ); \
__asm__ ( "mov %["#dpi"], edi " : [dpi] "+m" (dpi) );

View File

@ -44,13 +44,13 @@ static rct_widget window_dropdown_widgets[] = {
{ WIDGETS_END },
};
int _dropdown_num_items;
int _dropdown_num_columns;
int _dropdown_num_rows;
int _dropdown_item_width;
int _dropdown_item_height;
int _dropdown_highlighted_index;
int gDropdownNumItems;
uint16 gDropdownItemsFormat[64];
sint64 gDropdownItemsArgs[64];
// Replaces 0x009DED38
@ -149,7 +149,7 @@ void window_dropdown_show_text_custom_width(int x, int y, int extray, uint8 colo
_dropdown_item_height = flags & 0x3F;
// Set the widgets
_dropdown_num_items = num_items;
gDropdownNumItems = num_items;
_dropdown_num_rows = num_items;
window_dropdown_widgets[WIDX_BACKGROUND].bottom = _dropdown_item_height * num_items + 3;
window_dropdown_widgets[WIDX_BACKGROUND].right = _dropdown_item_width + 3;
@ -175,7 +175,7 @@ void window_dropdown_show_text_custom_width(int x, int y, int extray, uint8 colo
RCT2_GLOBAL(RCT2_ADDRESS_INPUT_STATE, sint8) = INPUT_STATE_DROPDOWN_ACTIVE;
// Copy the following properties until all use of it is decompiled
RCT2_GLOBAL(0x009DEBA0, sint16) = _dropdown_num_items;
RCT2_GLOBAL(0x009DEBA0, sint16) = gDropdownNumItems;
RCT2_GLOBAL(0x009DED44, sint32) = _dropdown_num_columns;
RCT2_GLOBAL(0x009DED48, sint32) = _dropdown_num_rows;
RCT2_GLOBAL(0x009DED40, sint32) = _dropdown_item_width;
@ -216,10 +216,10 @@ void window_dropdown_show_image(int x, int y, int extray, uint8 colour, uint8 fl
// Set and calculate num items, rows and columns
_dropdown_item_width = itemWidth;
_dropdown_item_height = itemHeight;
_dropdown_num_items = numItems;
gDropdownNumItems = numItems;
_dropdown_num_columns = numColumns;
_dropdown_num_rows = _dropdown_num_items / _dropdown_num_columns;
if (_dropdown_num_items % _dropdown_num_columns != 0)
_dropdown_num_rows = gDropdownNumItems / _dropdown_num_columns;
if (gDropdownNumItems % _dropdown_num_columns != 0)
_dropdown_num_rows++;
// Calculate position and size
@ -253,7 +253,7 @@ void window_dropdown_show_image(int x, int y, int extray, uint8 colour, uint8 fl
RCT2_GLOBAL(RCT2_ADDRESS_INPUT_STATE, sint8) = INPUT_STATE_DROPDOWN_ACTIVE;
// Copy the following properties until all use of it is decompiled
RCT2_GLOBAL(0x009DEBA0, sint16) = _dropdown_num_items;
RCT2_GLOBAL(0x009DEBA0, sint16) = gDropdownNumItems;
RCT2_GLOBAL(0x009DED44, sint32) = _dropdown_num_columns;
RCT2_GLOBAL(0x009DED48, sint32) = _dropdown_num_rows;
RCT2_GLOBAL(0x009DED40, sint32) = _dropdown_item_width;
@ -278,7 +278,7 @@ static void window_dropdown_paint()
_dropdown_highlighted_index = RCT2_GLOBAL(0x009DEBA2, sint16);
{
int i, cell_x, cell_y, l, t, r, b, item, image, colour;
for (i = 0; i < _dropdown_num_items; i++) {
for (i = 0; i < gDropdownNumItems; i++) {
cell_x = i % _dropdown_num_columns;
cell_y = i / _dropdown_num_columns;
@ -379,3 +379,16 @@ int dropdown_index_from_point(int x, int y, rct_window* w){
return dropdown_index;
}
/**
* rct2: 0x006ED43D
* al: dropdown colour
* ah: selected colour
* esi: window
* edi: widget
* ebp: unknown
*/
void window_dropdown_show_colour(rct_window *w, rct_widget *widget, uint8 dropdownColour, uint8 selectedColour)
{
RCT2_CALLPROC_X(0x006ED43D, (selectedColour << 8) | dropdownColour, 0, 0, 0, (int)w, (int)widget, 0xFFFFFFFF);
}

View File

@ -27,6 +27,7 @@
extern int gAppropriateImageDropdownItemsPerRow[];
extern int gDropdownNumItems;
extern uint16 gDropdownItemsFormat[64];
extern sint64 gDropdownItemsArgs[64];
extern uint32 gDropdownItemsChecked;
@ -36,5 +37,6 @@ void window_dropdown_show_text_custom_width(int x, int y, int extray, uint8 colo
void window_dropdown_show_image(int x, int y, int extray, uint8 colour, uint8 flags, int numItems, int itemWidth, int itemHeight, int numColumns);
void window_dropdown_close();
int dropdown_index_from_point(int x, int y, rct_window* w);
void window_dropdown_show_colour(rct_window *w, rct_widget *widget, uint8 dropdownColour, uint8 selectedColour);
#endif

View File

@ -279,19 +279,6 @@ void window_new_ride_init_vars() {
RCT2_GLOBAL(RCT2_ADDRESS_WINDOW_RIDE_LIST_INFORMATION_TYPE, uint8) = 0;
}
uint8 *get_ride_entry_indices_for_ride_type(uint8 rideType)
{
uint8 *typeToRideEntryIndexMap = (uint8*)0x009E32F8;
uint8 *entryIndexList = typeToRideEntryIndexMap;
while (rideType > 0) {
do {
entryIndexList++;
} while (*(entryIndexList - 1) != 255);
rideType--;
}
return entryIndexList;
}
/**
*
* rct2: 0x006B6F3E

View File

@ -866,30 +866,7 @@ static void window_park_entrance_textinput()
rct_window *w;
char *text;
#ifdef _MSC_VER
__asm mov result, cl
#else
__asm__ ( "mov %[result], cl " : [result] "+m" (result) );
#endif
#ifdef _MSC_VER
__asm mov widgetIndex, dx
#else
__asm__ ( "mov %[widgetIndex], dx " : [widgetIndex] "+m" (widgetIndex) );
#endif
#ifdef _MSC_VER
__asm mov w, esi
#else
__asm__ ( "mov %[w], esi " : [w] "+m" (w) );
#endif
#ifdef _MSC_VER
__asm mov text, edi
#else
__asm__ ( "mov %[text], edi " : [text] "+m" (text) );
#endif
window_textinput_get_registers(w, widgetIndex, result, text);
if (widgetIndex == WIDX_RENAME) {
if (result) {

View File

@ -717,7 +717,7 @@ void window_peep_viewport_init(rct_window* w){
rct_ride* ride = &(RCT2_ADDRESS(RCT2_ADDRESS_RIDE_LIST, rct_ride)[peep->current_ride]);
if (ride->lifecycle_flags & RIDE_LIFECYCLE_ON_TRACK){
rct_vehicle* train = GET_VEHICLE(ride->train_car_map[peep->current_train]);
rct_vehicle* train = GET_VEHICLE(ride->vehicles[peep->current_train]);
int car = peep->current_car;
for (; car != 0; car--){
@ -1379,6 +1379,33 @@ void window_peep_stats_invalidate(){
window_align_tabs(w, WIDX_TAB_1, WIDX_TAB_6);
}
/**
*
* rct2: 0x0066ECC1
*
* ebp: colour, contains flag 0x80000000 for blinking
*/
void window_peep_stats_bars_paint(int value, int x, int y, rct_window *w, rct_drawpixelinfo *dpi, int colour){
//RCT2_CALLPROC_X(0x6974FC, value, 0, x, y, (int)w, (int)dpi, colour);
value *= 0x76;
value >>= 8;
gfx_fill_rect_inset(dpi, x + 0x3A, y + 1, x + 0x3A + 0x79, y + 9, w->colours[1], 0x30);
int blink_flag = colour & (1 << 0x1F); //0x80000000
colour &= ~(1 << 0x1F);
if (!blink_flag ||
RCT2_GLOBAL(0x009DEA6E, uint8) != 0 ||
(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32) & 8) == 0)
{
if (value <= 2)
return;
gfx_fill_rect_inset(dpi, x + 0x3C, y + 2, x + 0x3C + value - 1, y + 8, colour, 0);
}
}
/* rct2: 0x0069711D */
void window_peep_stats_paint(){
rct_window *w;
@ -1412,7 +1439,7 @@ void window_peep_stats_paint(){
if (happiness < 50){
ebp |= 0x80000000;
}
RCT2_CALLPROC_X(0x6974FC, happiness, (int)peep, x, y, (int)w, (int)dpi, ebp);
window_peep_stats_bars_paint(happiness, x, y, w, dpi, ebp);
//Energy
y += 10;
@ -1424,7 +1451,7 @@ void window_peep_stats_paint(){
ebp |= 0x80000000;
}
if (energy < 10)energy = 10;
RCT2_CALLPROC_X(0x6974FC, energy, (int)peep, x, y, (int)w, (int)dpi, ebp);
window_peep_stats_bars_paint(energy, x, y, w, dpi, ebp);
//Hunger
y += 10;
@ -1443,7 +1470,7 @@ void window_peep_stats_paint(){
if (hunger > 170){
ebp |= 0x80000000;
}
RCT2_CALLPROC_X(0x6974FC, hunger, (int)peep, x, y, (int)w, (int)dpi, ebp);
window_peep_stats_bars_paint(hunger, x, y, w, dpi, ebp);
//Thirst
y += 10;
@ -1462,7 +1489,7 @@ void window_peep_stats_paint(){
if (thirst > 170){
ebp |= 0x80000000;
}
RCT2_CALLPROC_X(0x6974FC, thirst, (int)peep, x, y, (int)w, (int)dpi, ebp);
window_peep_stats_bars_paint(thirst, x, y, w, dpi, ebp);
//Nausea
y += 10;
@ -1478,7 +1505,7 @@ void window_peep_stats_paint(){
if (nausea > 120){
ebp |= 0x80000000;
}
RCT2_CALLPROC_X(0x6974FC, nausea, (int)peep, x, y, (int)w, (int)dpi, ebp);
window_peep_stats_bars_paint(nausea, x, y, w, dpi, ebp);
//Bathroom
y += 10;
@ -1496,7 +1523,7 @@ void window_peep_stats_paint(){
if (bathroom > 160){
ebp |= 0x80000000;
}
RCT2_CALLPROC_X(0x6974FC, bathroom, (int)peep, x, y, (int)w, (int)dpi, ebp);
window_peep_stats_bars_paint(bathroom, x, y, w, dpi, ebp);
// Time in park
y += 11;
@ -2178,4 +2205,4 @@ void window_peep_inventory_paint(){
if (!no_items){
gfx_draw_string_left(dpi, 2293, (void*)0, 0, x, y);
}
}
}

File diff suppressed because it is too large Load Diff

View File

@ -432,52 +432,6 @@ static void window_ride_list_paint()
window_ride_list_draw_tab_images(dpi, w);
}
/**
*
* rct2: 0x006AF561
*/
static void ride_get_status(int rideIndex, int *formatSecondary, int *argument)
{
rct_ride *ride = &g_ride_list[rideIndex];
if (ride->lifecycle_flags & RIDE_LIFECYCLE_CRASHED) {
*formatSecondary = STR_CRASHED;
return;
}
if (ride->lifecycle_flags & RIDE_LIFECYCLE_BROKEN_DOWN) {
*formatSecondary = STR_BROKEN_DOWN;
return;
}
if (ride->status == RIDE_STATUS_CLOSED) {
*formatSecondary = STR_CLOSED;
return;
}
if (ride->status == RIDE_STATUS_TESTING) {
*formatSecondary = STR_TEST_RUN;
return;
}
rct_peep *peep = GET_PEEP(ride->race_winner);
if (ride->mode == RIDE_MODE_RACE && !(ride->lifecycle_flags & RIDE_LIFECYCLE_PASS_STATION_NO_STOPPING) && ride->race_winner != 0xFFFF && peep->sprite_identifier == SPRITE_IDENTIFIER_PEEP) {
if (peep->name_string_idx == STR_GUEST) {
*argument = peep->id;
*formatSecondary = STR_RACE_WON_BY_GUEST;
} else {
*argument = peep->name_string_idx;
*formatSecondary = STR_RACE_WON_BY;
}
} else {
if (!(RCT2_GLOBAL(RCT2_ADDRESS_RIDE_FLAGS + ride->type * 8, uint32) & 0x20000)) {
*argument = ride->num_riders;
*formatSecondary = STR_PERSON_ON_RIDE;
if(*argument != 1)
*formatSecondary = STR_PEOPLE_ON_RIDE;
} else {
*formatSecondary = STR_OPEN;
}
}
}
/**
*
* rct2: 0x006B3240