From 2b66253d285e38b7c3aafbc5b033e74b4fa771a9 Mon Sep 17 00:00:00 2001 From: Sam Horn Date: Sat, 10 Oct 2015 18:53:48 +1000 Subject: [PATCH] Replaced remaining gotos with function calls --- src/peep/peep.c | 275 ++++++++++++++++++++++++++++-------------------- src/peep/peep.h | 2 +- src/ride/ride.h | 1 + 3 files changed, 161 insertions(+), 117 deletions(-) diff --git a/src/peep/peep.c b/src/peep/peep.c index aeb581017c..234a2ae47f 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -70,7 +70,9 @@ static bool peep_has_ridden_ride_type(rct_peep *peep, int rideType); static void peep_on_enter_or_exit_ride(rct_peep *peep, int rideIndex, int flags); static bool sub_69AF1E(rct_peep *peep, int rideIndex, int shopItem, money32 price); static bool peep_should_use_cash_machine(rct_peep *peep, int rideIndex); -static bool sub_6960AB(rct_peep *peep, int rideIndex, int entranceNum, int flags); +static bool peep_should_go_on_ride(rct_peep *peep, int rideIndex, int entranceNum, int flags); +static void peep_ride_is_too_intense(rct_peep *peep, int rideIndex, bool peepAtRide); +static void peep_chose_not_to_go_on_ride(rct_peep *peep, int rideIndex, bool peepAtRide, bool updateLastRide); static void peep_tried_to_enter_full_queue(rct_peep *peep, int rideIndex); static bool peep_should_go_to_shop(rct_peep *peep, int rideIndex, bool peepAtShop); static void sub_69A98C(rct_peep *peep); @@ -462,7 +464,7 @@ static void sub_68F41A(rct_peep *peep, int index) } if (peep->state == PEEP_STATE_WALKING && - peep->outside_of_park == 0 && + peep->outside_of_park == 0 && !(peep->flags & PEEP_FLAGS_LEAVING_PARK) && peep->no_of_rides == 0 && peep->guest_heading_to_ride_id == 0xFF){ @@ -6093,7 +6095,7 @@ static int peep_interact_with_entrance(rct_peep* peep, sint16 x, sint16 y, rct_m peep->var_F4 = 0; uint8 stationNum = (map_element->properties.entrance.index >> 4) & 0x7; - if (!sub_6960AB(peep, rideIndex, stationNum, 0)){ + if (!peep_should_go_on_ride(peep, rideIndex, stationNum, 0)){ peep->var_79 = rideIndex; return peep_return_to_center_of_tile(peep); } @@ -6463,7 +6465,7 @@ static int peep_interact_with_path(rct_peep* peep, sint16 x, sint16 y, rct_map_e peep->var_F4 = 0; uint8 stationNum = (map_element->properties.path.additions & 0x70) >> 4; - if (!sub_6960AB(peep, rideIndex, stationNum, 1)){ + if (!peep_should_go_on_ride(peep, rideIndex, stationNum, 1)){ peep->var_79 = rideIndex; return peep_return_to_center_of_tile(peep); } @@ -6532,7 +6534,7 @@ static int peep_interact_with_shop(rct_peep* peep, sint16 x, sint16 y, rct_map_e if (ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_PEEP_SHOULD_GO_INSIDE_FACILITY)){ peep->var_F4 = 0; - if (!sub_6960AB(peep, rideIndex, 0, 0)) + if (!peep_should_go_on_ride(peep, rideIndex, 0, 0)) return peep_return_to_center_of_tile(peep); money16 cost = ride->price; @@ -7888,14 +7890,14 @@ static void peep_reset_ride_heading(rct_peep *peep) * This function is called whenever a peep is deciding whether or not they want to go on a ride or visit a shop. * They may be physically present at the ride/shop, or they may just be thinking about it. */ -static bool sub_6960AB(rct_peep *peep, int rideIndex, int entranceNum, int flags) +static bool peep_should_go_on_ride(rct_peep *peep, int rideIndex, int entranceNum, int flags) { rct_ride *ride = GET_RIDE(rideIndex); // Indicates if the peep is about to enter a queue (as opposed to entering an entrance directly from a path) bool peepAtQueue = flags & 1; - // Indicates whether a peep is physically at the ride, or is just thinking about it. + // Indicates whether a peep is physically at the ride, or is just thinking about going on the ride. bool peepAtRide = !(flags & 4); if (!(RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_8)) { @@ -7904,7 +7906,8 @@ static bool sub_6960AB(rct_peep *peep, int rideIndex, int entranceNum, int flags // Peeps that are leaving the park will refuse to go on any rides, with the exception of free transport rides. if (!(RideData4[ride->type].flags & RIDE_TYPE_FLAG4_TRANSPORT_RIDE) || ride->value == 0xFFFF || ride->price != 0) { if (peep->flags & PEEP_FLAGS_LEAVING_PARK) { - goto loc_69666E; + peep_chose_not_to_go_on_ride(peep, rideIndex, peepAtRide, false); + return false; } } @@ -7912,10 +7915,9 @@ static bool sub_6960AB(rct_peep *peep, int rideIndex, int entranceNum, int flags return peep_should_go_to_shop(peep, rideIndex, peepAtRide); } - // Flag 2 and flag 4 are always used together, and never with flag 1. - // This is the only place that flag 2 is checked; unsure if it has any special significance. - if (!(flags & 2)) { - + // This used to check !(flags & 2), but the function is only ever called with flags = 0, 1 or 6. + // This means we can use the existing !(flags & 4) check. + if (peepAtRide) { // Peeps won't join a queue that has 1000 peeps already in it. if (ride->queue_length[entranceNum] >= 1000) { peep_tried_to_enter_full_queue(peep, rideIndex); @@ -7928,7 +7930,8 @@ static bool sub_6960AB(rct_peep *peep, int rideIndex, int entranceNum, int flags peep_tried_to_enter_full_queue(peep, rideIndex); return false; } - } else { + } + else { // Check if there's room in the queue for the peep to enter. if (ride->first_peep_in_queue[entranceNum] != 0xFFFF) { rct_peep *firstPeepInQueue = &(g_sprite_list[ride->first_peep_in_queue[entranceNum]].peep); @@ -7958,22 +7961,25 @@ static bool sub_6960AB(rct_peep *peep, int rideIndex, int entranceNum, int flags // Assuming the queue conditions are met, peeps will always go on free transport rides. // Ride ratings, recent crashes and weather will all be ignored. if (!(RideData4[ride->type].flags & RIDE_TYPE_FLAG4_TRANSPORT_RIDE) || ride->value == 0xFFFF || ride->price != 0) { - if (peep->previous_ride == rideIndex) - goto loc_69666E; + if (peep->previous_ride == rideIndex) { + peep_chose_not_to_go_on_ride(peep, rideIndex, peepAtRide, false); + return false; + } - // Price checks + // Basic price checks if (ride->price != 0 && !peep_has_voucher_for_free_ride(peep, rideIndex)) { - if (peep->cash_in_pocket <= 0) { - if (peepAtRide) { - peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_SPENT_MONEY, 255); - } - goto loc_696658; - } + if (ride->price > peep->cash_in_pocket) { if (peepAtRide) { - peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_CANT_AFFORD_0, rideIndex); + if (peep->cash_in_pocket <= 0) { + peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_SPENT_MONEY, 255); + } + else { + peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_CANT_AFFORD_0, rideIndex); + } } - goto loc_696658; + peep_chose_not_to_go_on_ride(peep, rideIndex, peepAtRide, true); + return false; } } @@ -7986,19 +7992,23 @@ static bool sub_6960AB(rct_peep *peep, int rideIndex, int entranceNum, int flags } ride_update_popularity(ride, 0); } - goto loc_696658; + peep_chose_not_to_go_on_ride(peep, rideIndex, peepAtRide, true); + return false; } if (ride->excitement != (ride_rating)0xFFFF) { + // If a peep has already decided that they're going to go on a ride, they'll skip the weather and + // excitment check and will only do a basic intensity check when they arrive at the ride itself. if (rideIndex == peep->guest_heading_to_ride_id) { - if (ride->intensity > RIDE_RATING(10, 00) && !gConfigCheat.ignore_ride_intensity) goto loc_6965F1; - goto loc_696387; + if (ride->intensity > RIDE_RATING(10, 00) && !gConfigCheat.ignore_ride_intensity) { + peep_ride_is_too_intense(peep, rideIndex, peepAtRide); + return false; + } } // Peeps won't go on certain rides while it's raining. - if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_RAIN_LEVEL, uint8) != 0) { - if (ride->var_114 > 96) goto loc_696387; + if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_RAIN_LEVEL, uint8) != 0 && ride->var_114 < 96) { if (peepAtRide) { peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_NOT_WHILE_RAINING, rideIndex); if (peep->happiness_growth_rate >= 64) { @@ -8006,63 +8016,98 @@ static bool sub_6960AB(rct_peep *peep, int rideIndex, int entranceNum, int flags } ride_update_popularity(ride, 0); } - goto loc_696658; + peep_chose_not_to_go_on_ride(peep, rideIndex, peepAtRide, true); + return false; } - ride_rating maxIntensity = min((peep->intensity >> 4) * 100, 1000) + peep->happiness; - ride_rating minIntensity = ((peep->intensity & 0x0F) * 100) - peep->happiness; - if (ride->intensity < minIntensity && !gConfigCheat.ignore_ride_intensity) { - if (peepAtRide) { - peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_MORE_THRILLING, rideIndex); - if (peep->happiness_growth_rate >= 64) { - peep->happiness_growth_rate -= 8; - } - ride_update_popularity(ride, 0); - } - goto loc_696658; - } - if (ride->intensity > maxIntensity && !gConfigCheat.ignore_ride_intensity) goto loc_6965F1; - ride_rating minNausea = RCT2_ADDRESS(0x00982390, uint16)[(peep->nausea_tolerance & 3) * 2] - peep->happiness; - ride_rating maxNausea = RCT2_ADDRESS(0x00982392, uint16)[(peep->nausea_tolerance & 3) * 2] + peep->happiness; - if (ride->nausea > maxNausea && !gConfigCheat.ignore_ride_intensity) { - if (peepAtRide) { - peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_SICKENING, rideIndex); - if (peep->happiness_growth_rate >= 64) { - peep->happiness_growth_rate -= 8; + if (!gConfigCheat.ignore_ride_intensity) { + // Intensity calculations. Even though the max intensity can go up to 15, it's capped + // at 10.0 (before happiness calculations). A full happiness bar will increase the max + // intensity and decrease the min intensity by about 2.5. + ride_rating maxIntensity = min((peep->intensity >> 4) * 100, 1000) + peep->happiness; + ride_rating minIntensity = ((peep->intensity & 0x0F) * 100) - peep->happiness; + if (ride->intensity < minIntensity) { + if (peepAtRide) { + peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_MORE_THRILLING, rideIndex); + if (peep->happiness_growth_rate >= 64) { + peep->happiness_growth_rate -= 8; + } + ride_update_popularity(ride, 0); } - ride_update_popularity(ride, 0); + peep_chose_not_to_go_on_ride(peep, rideIndex, peepAtRide, true); + return false; + } + if (ride->intensity > maxIntensity) { + peep_ride_is_too_intense(peep, rideIndex, peepAtRide); + return false; + } + + // Nausea calculations + ride_rating minNausea = RCT2_ADDRESS(0x00982390, uint16)[(peep->nausea_tolerance & 3) * 2] - peep->happiness; + ride_rating maxNausea = RCT2_ADDRESS(0x00982392, uint16)[(peep->nausea_tolerance & 3) * 2] + peep->happiness; + if (ride->nausea > maxNausea) { + if (peepAtRide) { + peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_SICKENING, rideIndex); + if (peep->happiness_growth_rate >= 64) { + peep->happiness_growth_rate -= 8; + } + ride_update_popularity(ride, 0); + } + peep_chose_not_to_go_on_ride(peep, rideIndex, peepAtRide, true); + return false; + } + if (ride->nausea >= 140 && peep->nausea > 160) { + peep_chose_not_to_go_on_ride(peep, rideIndex, peepAtRide, false); + return false; } - goto loc_696658; } - if (ride->nausea >= 140 && peep->nausea > 160 && !gConfigCheat.ignore_ride_intensity) goto loc_69666E; - goto loc_696387; } - // Check G forces (basic intensity look check) - if (RideData4[ride->type].flags & RIDE_TYPE_FLAG4_PEEP_CHECK_GFORCES) { - if ((scenario_rand() & 0xFFFF) > 0x1999U) goto loc_69666E; - if (ride->max_positive_vertical_g > 500 && !gConfigCheat.ignore_ride_intensity) goto loc_69666E; - if (ride->max_negative_vertical_g < -400 && !gConfigCheat.ignore_ride_intensity) goto loc_69666E; - if (ride->max_lateral_g > 400 && !gConfigCheat.ignore_ride_intensity) goto loc_69666E; + // If the ride has not yet been rated and is capable of having g-forces, + // there's a 90% chance that the peep will ignore it. + if ((ride->excitement == (ride_rating)0xFFFF) + && (RideData4[ride->type].flags & RIDE_TYPE_FLAG4_PEEP_CHECK_GFORCES)) { + if ((scenario_rand() & 0xFFFF) > 0x1999U) { + peep_chose_not_to_go_on_ride(peep, rideIndex, peepAtRide, false); + return false; + } + + if (!gConfigCheat.ignore_ride_intensity) { + if (ride->max_positive_vertical_g > FIXED_2DP(5, 00) + || ride->max_negative_vertical_g < FIXED_2DP(-4, 00) + || ride->max_lateral_g > FIXED_2DP(4, 00)) { + peep_chose_not_to_go_on_ride(peep, rideIndex, peepAtRide, false); + return false; + } + } } - // This is where the peep checks if the asking price is good enough for the ride. - loc_696387:; uint32 value = ride->value; + + // If the value of the ride hasn't yet been calculated, peeps will be willing to pay any amount for the ride. if (value != 0xFFFF && !peep_has_voucher_for_free_ride(peep, rideIndex)) { - if (peep->flags & PEEP_FLAGS_HAS_PAID_FOR_PARK_ENTRY) value /= 4; + + // The amount peeps are willing to pay is decreased by 75% if they had to pay to enter the park. + if (peep->flags & PEEP_FLAGS_HAS_PAID_FOR_PARK_ENTRY) + value /= 4; + + // Peeps won't pay more than twice the value of the ride. if (ride->price > (money16)(value * 2)) { - if (!peepAtRide) goto loc_696658; - peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_BAD_VALUE, rideIndex); - if (peep->happiness_growth_rate < 60) { - peep->happiness_growth_rate -= 16; + if (peepAtRide) { + peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_BAD_VALUE, rideIndex); + if (peep->happiness_growth_rate < 60) { + peep->happiness_growth_rate -= 16; + } + ride_update_popularity(ride, 0); } - ride_update_popularity(ride, 0); - goto loc_696658; + peep_chose_not_to_go_on_ride(peep, rideIndex, peepAtRide, true); + return false; } - if (ride->price <= (money16)(value / 2) && flags == 4) { + + // A ride is good value if the price is 50% or less of the ride value and the peep didn't pay to enter the park. + if (ride->price <= (money16)(value / 2) && peepAtRide) { if (!(RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_NO_MONEY)) { - if (RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_PARK_FREE_ENTRY) { + if (!(peep->flags & PEEP_FLAGS_HAS_PAID_FOR_PARK_ENTRY)) { peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_GOOD_VALUE, rideIndex); } } @@ -8070,6 +8115,7 @@ static bool sub_6960AB(rct_peep *peep, int rideIndex, int entranceNum, int flags } } + // At this point, the peep has decided to go on the ride. if (peepAtRide) { ride_update_popularity(ride, 1); if ((peep->flags & PEEP_FLAGS_INTAMIN) && ride_type_is_intamin(ride->type)) { @@ -8086,33 +8132,34 @@ static bool sub_6960AB(rct_peep *peep, int rideIndex, int entranceNum, int flags } } -// Check has failed: peep will not go on ride. -loc_69666E: - if (rideIndex == peep->guest_heading_to_ride_id) { - peep_reset_ride_heading(peep); - } + peep_chose_not_to_go_on_ride(peep, rideIndex, peepAtRide, false); return false; +} -// The ride is too intense for the peep -loc_6965F1: - if (!(flags & 4)) { +static void peep_ride_is_too_intense(rct_peep *peep, int rideIndex, bool peepAtRide) +{ + rct_ride *ride = GET_RIDE(rideIndex); + + if (peepAtRide) { peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_INTENSE, rideIndex); if (peep->happiness_growth_rate >= 64) { peep->happiness_growth_rate -= 8; } ride_update_popularity(ride, 0); } - goto loc_696658; + peep_chose_not_to_go_on_ride(peep, rideIndex, peepAtRide, true); +} -// Check has failed: peep will not go on ride, but it will still be marked as the last ride they visited. -loc_696658: - if (!(flags & 4)) { +static void peep_chose_not_to_go_on_ride(rct_peep *peep, int rideIndex, bool peepAtRide, bool updateLastRide) +{ + if (peepAtRide && updateLastRide) { peep->previous_ride = rideIndex; peep->previous_ride_time_out = 0; } - peep_reset_ride_heading(peep); - return false; + if (rideIndex == peep->guest_heading_to_ride_id) { + peep_reset_ride_heading(peep); + } } /* @@ -8134,15 +8181,16 @@ static bool peep_should_go_to_shop(rct_peep *peep, int rideIndex, bool peepAtSho rct_ride *ride = GET_RIDE(rideIndex); // Peeps won't go to the same shop twice in a row. - if (rideIndex == peep->previous_ride) goto failedCheck; - - if (ride->type == RIDE_TYPE_FIRST_AID) { - if (peep->nausea < 128) goto failedCheck; - goto successfulCheck; + if (rideIndex == peep->previous_ride) { + peep_chose_not_to_go_on_ride(peep, rideIndex, peepAtShop, true); + return false; } if (ride->type == RIDE_TYPE_TOILETS) { - if (peep->bathroom < 70) goto failedCheck; + if (peep->bathroom < 70) { + peep_chose_not_to_go_on_ride(peep, rideIndex, peepAtShop, true); + return false; + } // The amount that peeps are willing to pay to use the Toilets scales with their bathroom stat. // It effectively has a minimum of $0.10 (due to the check above) and a maximum of $0.60. @@ -8154,27 +8202,32 @@ static bool peep_should_go_to_shop(rct_peep *peep, int rideIndex, bool peepAtSho } ride_update_popularity(ride, 0); } - goto failedCheck; + peep_chose_not_to_go_on_ride(peep, rideIndex, peepAtShop, true); + return false; } } - if (ride->price != 0) { - if (peep->cash_in_pocket <= 0) { - if (peepAtShop) { + if (ride->type == RIDE_TYPE_FIRST_AID) { + if (peep->nausea < 128) { + peep_chose_not_to_go_on_ride(peep, rideIndex, peepAtShop, true); + return false; + } + } + + // Basic price checks + if (ride->price != 0 && ride->price > peep->cash_in_pocket) { + if (peepAtShop) { + if (peep->cash_in_pocket <= 0) { peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_SPENT_MONEY, 255); } - goto failedCheck; - } - if (ride->price > peep->cash_in_pocket) { - if (peepAtShop) { + else { peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_CANT_AFFORD_0, rideIndex); } - goto failedCheck; } + peep_chose_not_to_go_on_ride(peep, rideIndex, peepAtShop, true); + return false; } - - -successfulCheck: + if (peepAtShop) { ride_update_popularity(ride, 1); if (rideIndex == peep->guest_heading_to_ride_id) { @@ -8182,16 +8235,6 @@ successfulCheck: } } return true; - -failedCheck: - if (peepAtShop) { - peep->previous_ride = rideIndex; - peep->previous_ride_time_out = 0; - } - - peep_reset_ride_heading(peep); - return false; - } /** @@ -8267,7 +8310,7 @@ static void peep_pick_ride_to_go_on(rct_peep *peep) rct_ride *ride = GET_RIDE(i); if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_QUEUE_FULL)) { - if (sub_6960AB(peep, i, 0, 6)) { + if (peep_should_go_on_ride(peep, i, 0, 6)) { *nextPotentialRide++ = i; numPotentialRides++; } @@ -8376,7 +8419,7 @@ static void peep_head_for_nearest_ride_type(rct_peep *peep, int rideType) rct_ride *ride = GET_RIDE(i); if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_QUEUE_FULL)) { - if (sub_6960AB(peep, i, 0, 6)) { + if (peep_should_go_on_ride(peep, i, 0, 6)) { *nextPotentialRide++ = i; numPotentialRides++; } @@ -8488,7 +8531,7 @@ static void peep_head_for_nearest_ride_with_flags(rct_peep *peep, int rideTypeFl rct_ride *ride = GET_RIDE(i); if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_QUEUE_FULL)) { - if (sub_6960AB(peep, i, 0, 6)) { + if (peep_should_go_on_ride(peep, i, 0, 6)) { *nextPotentialRide++ = i; numPotentialRides++; } diff --git a/src/peep/peep.h b/src/peep/peep.h index 10ac9203c6..44a3477a3c 100644 --- a/src/peep/peep.h +++ b/src/peep/peep.h @@ -428,7 +428,7 @@ typedef struct { uint8 bathroom; // 0x40 uint8 var_41; uint8 var_42; - uint8 intensity; // 0x43 + uint8 intensity; // 0x43 The max intensity is stored in the first 4 bits, and the min intensity in the second 4 bits uint8 nausea_tolerance; // 0x44 uint8 window_invalidate_flags; // 0x45 money16 paid_on_drink; // 0x46 diff --git a/src/ride/ride.h b/src/ride/ride.h index 88eec5e4e3..d764b1df48 100644 --- a/src/ride/ride.h +++ b/src/ride/ride.h @@ -236,6 +236,7 @@ typedef struct { union { uint8 inversions; // 0x114 (???X XXXX) uint8 holes; // 0x114 (???X XXXX) + // This has something to do with how much of the ride is undercover. uint8 var_114; }; uint8 drops; // 0x115 (??XX XXXX)