Merge pull request #946 from kevinburke/var_198_docs

Name reliability variables
This commit is contained in:
Ted John 2015-03-22 15:40:16 +00:00
commit 956d6688d3
8 changed files with 120 additions and 111 deletions

View File

@ -127,7 +127,7 @@ void finance_pay_ride_upkeep()
FOR_ALL_RIDES(i, ride) {
if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_EVER_BEEN_OPENED)) {
ride->build_date = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_YEAR, uint16);
ride->var_196 = 25855; // durability?
ride->reliability = RIDE_INITIAL_RELIABILITY;
}
if (ride->status != RIDE_STATUS_CLOSED && !(RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_NO_MONEY)) {
@ -297,4 +297,4 @@ void game_command_set_current_loan(int* eax, int* ebx, int* ecx, int* edx, int*
}
*ebx = 0;
}
}

View File

@ -1309,13 +1309,35 @@ static void ride_inspection_update(rct_ride *ride)
}
}
static int get_age_penalty(rct_ride *ride) {
int years;
years = date_get_year(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_YEAR, uint16) - ride->build_date);
switch (years) {
case 0:
return 0;
case 1:
return ride->unreliability_factor / 8;
case 2:
return ride->unreliability_factor / 4;
case 3:
case 4:
return ride->unreliability_factor / 2;
case 5:
case 6:
case 7:
return 0;
default:
return ride->unreliability_factor * 2;
}
}
/**
*
* rct2: 0x006AC622
*/
static void ride_breakdown_update(int rideIndex)
{
int agePenalty, years, ax, breakdownReason;
int breakdownReason, unreliabilityAccumulator;
rct_ride *ride = GET_RIDE(rideIndex);
if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32) & 255)
@ -1354,38 +1376,17 @@ static void ride_breakdown_update(int rideIndex)
return;
// Calculate breakdown probability?
ax = ride->var_198;
agePenalty;
years = date_get_year(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_YEAR, uint16) - ride->build_date);
switch (years) {
case 0:
agePenalty = 0;
break;
case 1:
agePenalty = ax >> 3;
break;
case 2:
agePenalty = ax >> 2;
break;
case 3:
case 4:
agePenalty = ax >> 1;
break;
case 5:
case 6:
case 7:
agePenalty = ax >> 0;
break;
default:
agePenalty = ax << 1;
break;
}
ax += agePenalty;
ride->var_196 = max(0, ride->var_196 - ax);
unreliabilityAccumulator = ride->unreliability_factor + get_age_penalty(ride);
ride->reliability = max(0, ride->reliability - unreliabilityAccumulator);
ride->var_14D |= 32;
// Random probability of a breakdown
if (ride->var_196 == 0 || (int)(scenario_rand() & 0x2FFFFF) <= 25856 - ride->var_196) {
// Random probability of a breakdown. Roughly this is 1 in
//
// (25000 - reliability) / 3 000 000
//
// a 0.8% chance, less the breakdown factor which accumulates as the game
// continues.
if (ride->reliability == 0 || (int)(scenario_rand() & 0x2FFFFF) <= 1 + RIDE_INITIAL_RELIABILITY - ride->reliability) {
breakdownReason = ride_get_new_breakdown_problem(ride);
if (breakdownReason != -1)
ride_prepare_breakdown(rideIndex, breakdownReason);
@ -1443,9 +1444,8 @@ static int ride_get_new_breakdown_problem(rct_ride *ride)
if (ride->num_vehicles != 1)
return -1;
// Again the probability is lower, this time if young or two other unknown reasons...
monthsOld = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_YEAR, uint8) - ride->build_date;
if (monthsOld < 16 || ride->var_196 > 12800 || ride->lifecycle_flags & RIDE_LIFECYCLE_SIX_FLAGS)
if (monthsOld < 16 || ride->reliability > (50 << 8) || ride->lifecycle_flags & RIDE_LIFECYCLE_SIX_FLAGS)
return -1;
return BREAKDOWN_BRAKES_FAILURE;

View File

@ -218,7 +218,7 @@ typedef struct {
ride_rating nausea; // 0x144
};
};
uint16 reliability; // 0x146
uint16 value; // 0x146
uint16 var_148;
uint8 satisfaction; // 0x14A
uint8 satisfaction_time_out; // 0x14B
@ -253,9 +253,13 @@ typedef struct {
uint8 broken_car; // 0x192
uint8 breakdown_reason; // 0x193
money16 price_secondary; // 0x194
uint16 var_196;
// used in computing excitement, nausea, etc
uint8 var_198;
// Starts at RIDE_INITIAL_RELIABILITY and decreases from there. Right shift
// this number by 8 to get a reliability percentage 0-100
uint16 reliability;
// Small constant used to increase the unreliability as the game continues,
// making breakdowns more and more likely.
uint8 unreliability_factor;
// Down time
uint8 var_199;
uint8 inspection_interval; // 0x19A
uint8 last_inspection; // 0x19B
@ -661,7 +665,8 @@ enum {
#define MAX_RIDES 255
#define MAX_RIDE_MEASUREMENTS 8
#define RIDE_RELIABILITY_UNDEFINED 0xFFFF
#define RIDE_VALUE_UNDEFINED 0xFFFF
#define RIDE_INITIAL_RELIABILITY ((100 << 8) - 1)
#define STATION_DEPART_FLAG (1 << 7)
#define STATION_DEPART_MASK (~STATION_DEPART_FLAG)

View File

@ -49,7 +49,7 @@ static void ride_ratings_update_state_4();
static void ride_ratings_update_state_5();
static void loc_6B5BB2();
static void ride_ratings_calculate(rct_ride *ride);
static void ride_ratings_reliability_calculate(rct_ride *ride);
static void ride_ratings_calculate_value(rct_ride *ride);
static int sub_6C6402(rct_map_element *mapElement, int *x, int *y, int *z)
{
@ -283,7 +283,7 @@ static void ride_ratings_update_state_3()
ride_ratings_calculate(ride);
RCT2_CALLPROC_X(0x00655F64, 0, 0, 0, 0, 0, (int)ride, 0);
ride_ratings_reliability_calculate(ride);
ride_ratings_calculate_value(ride);
window_invalidate_by_number(WC_RIDE, _rideRatingsCurrentRide);
_rideRatingsState = RIDE_RATINGS_STATE_FIND_NEXT_RIDE;
@ -372,7 +372,7 @@ static void ride_ratings_calculate(rct_ride *ride)
}
}
static void ride_ratings_reliability_calculate(rct_ride *ride)
static void ride_ratings_calculate_value(rct_ride *ride)
{
rct_ride *ride2;
int i, otherRidesOfSameType;
@ -380,7 +380,7 @@ static void ride_ratings_reliability_calculate(rct_ride *ride)
if (ride->excitement == (ride_rating)0xFFFF)
return;
int reliability =
int value =
(((ride->excitement * RCT2_GLOBAL(0x0097CD1E + (ride->type * 6), sint16)) * 32) >> 15) +
(((ride->intensity * RCT2_GLOBAL(0x0097CD20 + (ride->type * 6), sint16)) * 32) >> 15) +
(((ride->nausea * RCT2_GLOBAL(0x0097CD22 + (ride->type * 6), sint16)) * 32) >> 15);
@ -389,19 +389,19 @@ static void ride_ratings_reliability_calculate(rct_ride *ride)
// New ride reward
if (monthsOld <= 12) {
reliability += 10;
value += 10;
if (monthsOld <= 4)
reliability += 20;
value += 20;
}
// Old ride penalty
if (monthsOld >= 40) reliability -= reliability / 4;
if (monthsOld >= 64) reliability -= reliability / 4;
if (monthsOld >= 40) value -= value / 4;
if (monthsOld >= 64) value -= value / 4;
if (monthsOld < 200) {
if (monthsOld >= 88) reliability -= reliability / 4;
if (monthsOld >= 104) reliability -= reliability / 4;
if (monthsOld >= 120) reliability -= reliability / 2;
if (monthsOld >= 128) reliability -= reliability / 2;
if (monthsOld >= 88) value -= value / 4;
if (monthsOld >= 104) value -= value / 4;
if (monthsOld >= 120) value -= value / 2;
if (monthsOld >= 128) value -= value / 2;
}
// Other ride of same type penalty
@ -411,9 +411,9 @@ static void ride_ratings_reliability_calculate(rct_ride *ride)
otherRidesOfSameType++;
}
if (otherRidesOfSameType > 1)
reliability -= reliability / 4;
value -= value / 4;
ride->reliability = max(0, reliability);
ride->value = max(0, value);
}
/**
@ -564,12 +564,16 @@ static void ride_ratings_apply_intensity_penalty(rating_tuple *ratings)
}
/**
*
* rct2: 0x00655FD6
*/
static void sub_655FD6(rct_ride *ride)
static void set_unreliability_factor(rct_ride *ride)
{
ride->var_198 += (ride->lift_hill_speed - RCT2_ADDRESS(0x0097D7C9, uint8)[ride->type * 4]) * 2;
// The higher the number, the lower the breakdown
// possibility. Range is [3, 7]. values are here:
// https://gist.github.com/kevinburke/123977c4884ccadbec70. Consider
// inlining this per ride
uint8 lift_speed_adjustment = RCT2_ADDRESS(0x0097D7C9, uint8)[ride->type * 4];
ride->unreliability_factor += (ride->lift_hill_speed - lift_speed_adjustment) * 2;
}
/**
@ -752,13 +756,13 @@ static void ride_ratings_calculate_mine_train_coaster(rct_ride *ride)
if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED))
return;
ride->var_198 = 16;
sub_655FD6(ride);
ride->unreliability_factor = 16;
set_unreliability_factor(ride);
// Base ratings
ratings.excitement = RIDE_RATING(2,90);
ratings.intensity = RIDE_RATING(2,30);
ratings.nausea = RIDE_RATING(2,10);
ratings.excitement = RIDE_RATING(2,90);
ratings.intensity = RIDE_RATING(2,30);
ratings.nausea = RIDE_RATING(2,10);
// Apply length of ride factor
totalLength = (ride->length[0] + ride->length[1] + ride->length[2] + ride->length[3]) >> 16;
@ -868,8 +872,8 @@ static void ride_ratings_calculate_maze(rct_ride *ride)
ride->lifecycle_flags |= RIDE_LIFECYCLE_TESTED;
ride->lifecycle_flags |= RIDE_LIFECYCLE_NO_RAW_STATS;
ride->var_198 = 8;
sub_655FD6(ride);
ride->unreliability_factor = 8;
set_unreliability_factor(ride);
// Base ratings
ratings.excitement = RIDE_RATING(1,30);
@ -901,8 +905,8 @@ static void ride_ratings_calculate_spiral_slide(rct_ride *ride)
ride->lifecycle_flags |= RIDE_LIFECYCLE_TESTED;
ride->lifecycle_flags |= RIDE_LIFECYCLE_NO_RAW_STATS;
ride->var_198 = 8;
sub_655FD6(ride);
ride->unreliability_factor = 8;
set_unreliability_factor(ride);
// Base ratings
ratings.excitement = RIDE_RATING(1,50);
@ -936,8 +940,8 @@ static void ride_ratings_calculate_pirate_ship(rct_ride *ride)
ride->lifecycle_flags |= RIDE_LIFECYCLE_TESTED;
ride->lifecycle_flags |= RIDE_LIFECYCLE_NO_RAW_STATS;
ride->var_198 = 10;
sub_655FD6(ride);
ride->unreliability_factor = 10;
set_unreliability_factor(ride);
// Base ratings
ratings.excitement = RIDE_RATING(1,50);
@ -968,8 +972,8 @@ static void ride_ratings_calculate_inverter_ship(rct_ride *ride)
ride->lifecycle_flags |= RIDE_LIFECYCLE_TESTED;
ride->lifecycle_flags |= RIDE_LIFECYCLE_NO_RAW_STATS;
ride->var_198 = 16;
sub_655FD6(ride);
ride->unreliability_factor = 16;
set_unreliability_factor(ride);
// Base ratings
ratings.excitement = RIDE_RATING(2,50);
@ -1018,8 +1022,8 @@ static void ride_ratings_calculate_merry_go_round(rct_ride *ride)
ride->lifecycle_flags |= RIDE_LIFECYCLE_TESTED;
ride->lifecycle_flags |= RIDE_LIFECYCLE_NO_RAW_STATS;
ride->var_198 = 16;
sub_655FD6(ride);
ride->unreliability_factor = 16;
set_unreliability_factor(ride);
int unk = ride->var_0D0 * 5;
ratings.excitement = unk + RIDE_RATING(0,60) + ((ride_ratings_get_scenery_score(ride) * 19521) >> 16);
@ -1056,8 +1060,8 @@ static void ride_ratings_calculate_ferris_wheel(rct_ride *ride)
ride->lifecycle_flags |= RIDE_LIFECYCLE_TESTED;
ride->lifecycle_flags |= RIDE_LIFECYCLE_NO_RAW_STATS;
ride->var_198 = 16;
sub_655FD6(ride);
ride->unreliability_factor = 16;
set_unreliability_factor(ride);
int unk = ride->var_0D0 * 25;
ratings.excitement = unk + RIDE_RATING(0,60) + ((ride_ratings_get_scenery_score(ride) * 41831) >> 16);
@ -1082,8 +1086,8 @@ static void ride_ratings_calculate_motion_simulator(rct_ride *ride)
ride->lifecycle_flags |= RIDE_LIFECYCLE_TESTED;
ride->lifecycle_flags |= RIDE_LIFECYCLE_NO_RAW_STATS;
ride->var_198 = 21;
sub_655FD6(ride);
ride->unreliability_factor = 21;
set_unreliability_factor(ride);
// Base ratings
if (ride->mode == RIDE_MODE_FILM_THRILL_RIDERS) {
@ -1114,8 +1118,8 @@ static void ride_ratings_calculate_3d_cinema(rct_ride *ride)
ride->lifecycle_flags |= RIDE_LIFECYCLE_TESTED;
ride->lifecycle_flags |= RIDE_LIFECYCLE_NO_RAW_STATS;
ride->var_198 = 21;
sub_655FD6(ride);
ride->unreliability_factor = 21;
set_unreliability_factor(ride);
// Base ratings
switch (ride->mode) {
@ -1155,8 +1159,8 @@ static void ride_ratings_calculate_top_spin(rct_ride *ride)
ride->lifecycle_flags |= RIDE_LIFECYCLE_TESTED;
ride->lifecycle_flags |= RIDE_LIFECYCLE_NO_RAW_STATS;
ride->var_198 = 19;
sub_655FD6(ride);
ride->unreliability_factor = 19;
set_unreliability_factor(ride);
// Base ratings
switch (ride->mode) {
@ -1198,8 +1202,8 @@ static void ride_ratings_calculate_space_rings(rct_ride *ride)
ride->lifecycle_flags |= RIDE_LIFECYCLE_TESTED;
ride->lifecycle_flags |= RIDE_LIFECYCLE_NO_RAW_STATS;
ride->var_198 = 7;
sub_655FD6(ride);
ride->unreliability_factor = 7;
set_unreliability_factor(ride);
// Base ratings
ratings.excitement = RIDE_RATING(1,50);
@ -1228,8 +1232,8 @@ static void ride_ratings_calculate_elevator(rct_ride *ride)
if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED))
return;
ride->var_198 = 15;
sub_655FD6(ride);
ride->unreliability_factor = 15;
set_unreliability_factor(ride);
// Base ratings
ratings.excitement = RIDE_RATING(1,11);
@ -1270,8 +1274,8 @@ static void ride_ratings_calculate_twist(rct_ride *ride)
ride->lifecycle_flags |= RIDE_LIFECYCLE_TESTED;
ride->lifecycle_flags |= RIDE_LIFECYCLE_NO_RAW_STATS;
ride->var_198 = 16;
sub_655FD6(ride);
ride->unreliability_factor = 16;
set_unreliability_factor(ride);
// Base ratings
ratings.excitement = RIDE_RATING(1,13);
@ -1302,8 +1306,8 @@ static void ride_ratings_calculate_haunted_house(rct_ride *ride)
ride->lifecycle_flags |= RIDE_LIFECYCLE_TESTED;
ride->lifecycle_flags |= RIDE_LIFECYCLE_NO_RAW_STATS;
ride->var_198 = 8;
sub_655FD6(ride);
ride->unreliability_factor = 8;
set_unreliability_factor(ride);
ratings.excitement = RIDE_RATING(3,41);
ratings.intensity = RIDE_RATING(1,53);
@ -1330,8 +1334,8 @@ static void ride_ratings_calculate_mini_golf(rct_ride *ride)
if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED))
return;
ride->var_198 = 0;
sub_655FD6(ride);
ride->unreliability_factor = 0;
set_unreliability_factor(ride);
// Base ratings
ratings.excitement = RIDE_RATING(1,50);
@ -1391,8 +1395,8 @@ static void ride_ratings_calculate_circus_show(rct_ride *ride)
ride->lifecycle_flags |= RIDE_LIFECYCLE_TESTED;
ride->lifecycle_flags |= RIDE_LIFECYCLE_NO_RAW_STATS;
ride->var_198 = 9;
sub_655FD6(ride);
ride->unreliability_factor = 9;
set_unreliability_factor(ride);
ratings.excitement = RIDE_RATING(2,10);
ratings.intensity = RIDE_RATING(0,30);
@ -1416,8 +1420,8 @@ static void ride_ratings_calculate_crooked_house(rct_ride *ride)
ride->lifecycle_flags |= RIDE_LIFECYCLE_TESTED;
ride->lifecycle_flags |= RIDE_LIFECYCLE_NO_RAW_STATS;
ride->var_198 = 5;
sub_655FD6(ride);
ride->unreliability_factor = 5;
set_unreliability_factor(ride);
ratings.excitement = RIDE_RATING(2,15);
ratings.intensity = RIDE_RATING(0,62);
@ -1441,8 +1445,8 @@ static void ride_ratings_calculate_magic_carpet(rct_ride *ride)
ride->lifecycle_flags |= RIDE_LIFECYCLE_TESTED;
ride->lifecycle_flags |= RIDE_LIFECYCLE_NO_RAW_STATS;
ride->var_198 = 16;
sub_655FD6(ride);
ride->unreliability_factor = 16;
set_unreliability_factor(ride);
// Base ratings
ratings.excitement = RIDE_RATING(2,45);
@ -1473,8 +1477,8 @@ static void ride_ratings_calculate_enterprise(rct_ride *ride)
ride->lifecycle_flags |= RIDE_LIFECYCLE_TESTED;
ride->lifecycle_flags |= RIDE_LIFECYCLE_NO_RAW_STATS;
ride->var_198 = 22;
sub_655FD6(ride);
ride->unreliability_factor = 22;
set_unreliability_factor(ride);
// Base ratings
ratings.excitement = RIDE_RATING(3,60);

View File

@ -100,13 +100,13 @@ static void* window_new_campaign_events[] = {
uint8 window_new_campaign_rides[MAX_RIDES];
uint8 window_new_campaign_shop_items[64];
int ride_reliability_compare(const void *a, const void *b)
int ride_value_compare(const void *a, const void *b)
{
rct_ride *rideA, *rideB;
rideA = GET_RIDE(*((uint8*)a));
rideB = GET_RIDE(*((uint8*)b));
return rideB->reliability - rideA->reliability;
return rideB->value - rideA->value;
}
int ride_name_compare(const void *a, const void *b)
@ -179,7 +179,7 @@ void window_new_campaign_open(sint16 campaignType)
// Take top 40 most reliable rides
if (numApplicableRides > 40) {
qsort(window_new_campaign_rides, countof(window_new_campaign_rides), sizeof(uint8), ride_reliability_compare);
qsort(window_new_campaign_rides, countof(window_new_campaign_rides), sizeof(uint8), ride_value_compare);
numApplicableRides = 40;
}
@ -413,4 +413,4 @@ static void window_new_campaign_paint()
// Total price
money32 totalPrice = AdvertisingCampaignPricePerWeek[w->campaign.campaign_type] * w->campaign.no_weeks;
gfx_draw_string_left(dpi, STR_MARKETING_TOTAL_COST, &totalPrice, 0, x, y);
}
}

View File

@ -3434,7 +3434,7 @@ static void window_ride_maintenance_paint()
x = w->x + widget->left + 4;
y = w->y + widget->top + 4;
reliability = ride->var_196 >> 8;
reliability = ride->reliability >> 8;
gfx_draw_string_left(dpi, STR_RELIABILITY_LABEL_1757, &reliability, 0, x, y);
window_ride_maintenance_draw_bar(w, dpi, x + 103, y, max(10, reliability), 14);
y += 11;

View File

@ -507,7 +507,7 @@ static void window_ride_list_scrollpaint()
case INFORMATION_TYPE_RELIABILITY:
// edx = RCT2_GLOBAL(0x009ACFA4 + (ride->var_001 * 4), uint32);
RCT2_GLOBAL(0x013CE952 + 2, uint16) = ride->var_196 >> 8;
RCT2_GLOBAL(0x013CE952 + 2, uint16) = ride->reliability >> 8;
formatSecondary = STR_RELIABILITY_LABEL;
break;
case INFORMATION_TYPE_DOWN_TIME:
@ -661,7 +661,7 @@ static void window_ride_list_refresh_list(rct_window *w)
case INFORMATION_TYPE_RELIABILITY:
while (--current_list_position >= 0) {
otherRide = &g_ride_list[w->list_item_positions[current_list_position]];
if (ride->var_196 >> 8 <= otherRide->var_196 >> 8)
if (ride->reliability >> 8 <= otherRide->reliability >> 8)
break;
window_bubble_list_item(w, current_list_position);

View File

@ -276,11 +276,11 @@ money32 calculate_ride_value(rct_ride *ride)
{
if (ride->type == RIDE_TYPE_NULL)
return 0;
if (ride->reliability == 0xFFFF)
if (ride->value == RIDE_VALUE_UNDEFINED)
return 0;
// Reliability * (...)
return (ride->reliability * 10) * (
// Fair value * (...)
return (ride->value * 10) * (
ride->var_124 + ride->var_126 + ride->var_128 + ride->var_12A +
ride->var_12C + ride->var_12E + ride->age + ride->running_cost +
ride->var_134 + ride->var_136 +
@ -369,8 +369,8 @@ static int park_calculate_guest_generation_probability()
suggestedMaxGuests += RCT2_GLOBAL(0x0097D21E + (ride->type * 8), uint8);
// Add ride value
if (ride->reliability != RIDE_RELIABILITY_UNDEFINED) {
int rideValue = ride->reliability - ride->price;
if (ride->value != RIDE_VALUE_UNDEFINED) {
int rideValue = ride->value - ride->price;
if (rideValue > 0)
totalRideValue += rideValue * 2;
}
@ -802,4 +802,4 @@ void game_command_set_park_name(int *eax, int *ebx, int *ecx, int *edx, int *esi
}
*ebx = 0;
}
}