1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2026-01-16 19:43:06 +01:00

Start work on cleaning up sub_6960AB

This commit is contained in:
Sam Horn
2015-10-09 17:12:48 +10:00
parent 33655afcf9
commit ceeaa34ac8
2 changed files with 141 additions and 77 deletions

View File

@@ -70,7 +70,8 @@ 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 dh, int bp);
static bool sub_6960AB(rct_peep *peep, int rideIndex, int entranceNum, int flags);
static bool peep_should_go_to_shop(rct_peep *peep, int rideIndex, bool peepAtShop);
static void sub_69A98C(rct_peep *peep);
static void sub_68FD3A(rct_peep *peep);
static bool sub_690B99(rct_peep *peep, int edge, uint8 *rideToView, uint8 *rideSeatToView);
@@ -7880,80 +7881,61 @@ static void peep_reset_ride_heading(rct_peep *peep)
}
/**
*
*
* rct2: 0x006960AB
*
* 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 dh, int bp)
static bool sub_6960AB(rct_peep *peep, int rideIndex, int entranceNum, int flags)
{
// return RCT2 CALLPROC X(0x006960AB, 0, 0, 0, rideIndex | (dh << 8), (int)peep, 0, bp) & 0x100;
rct_ride *ride = GET_RIDE(rideIndex);
rct_ride_type *rideEntry;
// 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.
bool peepAtRide = !(flags & 4);
char buffer[255];
sprintf(buffer, "sub_6960AB: ride %d, queue %d, flags %d\n", rideIndex, entranceNum, flags);
OutputDebugString(buffer);
if (!(RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_8)) {
if (ride->status == RIDE_STATUS_OPEN && !(ride->lifecycle_flags & RIDE_LIFECYCLE_BROKEN_DOWN)) {
// 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;
}
}
if (RCT2_ADDRESS(0x0097CF40, uint32)[ride->type * 2] & 0x20000) {
if (rideIndex == peep->previous_ride) goto loc_69666E;
if (ride->type != RIDE_TYPE_CASH_MACHINE) {
if (ride->type == RIDE_TYPE_FIRST_AID) {
if (peep->nausea < 128) goto loc_69666E;
goto loc_69652C;
}
rideEntry = GET_RIDE_ENTRY(ride->subtype);
if (rideEntry->shop_item == 255) {
if (peep->bathroom < 70) goto loc_69666E;
money16 ax = ride->price * 40;
if ((ax >> 8) != 0 || (ax & 0xFF) > peep->bathroom) {
if (!(bp & 4)) {
peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_NOT_PAYING, rideIndex);
if (peep->happiness_growth_rate >= 60) {
peep->happiness_growth_rate -= 16;
}
ride_update_popularity(ride, 0);
}
goto loc_696658;
}
}
if (ride->price != 0) {
if (peep->cash_in_pocket <= 0) {
if (!(bp & 4)) {
peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_SPENT_MONEY, 255);
}
goto loc_696658;
}
if (ride->price > peep->cash_in_pocket) {
if (!(bp & 4)) {
peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_CANT_AFFORD_0, rideIndex);
}
goto loc_696658;
}
}
}
loc_69652C:
if (!(bp & 4)) {
ride_update_popularity(ride, 1);
if (rideIndex == peep->guest_heading_to_ride_id) {
peep_reset_ride_heading(peep);
}
}
return true;
// All of the shop logic is contained within this if statement.
if (RCT2_ADDRESS(RCT2_ADDRESS_RIDE_FLAGS, uint32)[ride->type * 2] & RIDE_TYPE_FLAG_IS_SHOP) {
return peep_should_go_to_shop(peep, rideIndex, peepAtRide);
}
if (!(bp & 2)) {
if (ride->queue_length[dh] == 1000)
// Queue logic
if (!(flags & 2)) {
// Peeps won't join a queue that has 1000 peeps already in it.
if (ride->queue_length[entranceNum] >= 1000)
goto loc_696645;
if (!(bp & 1)) {
if (ride->first_peep_in_queue[dh] != 0xFFFF)
// Rides without queues can only have one peep waiting at a time.
if (!peepAtQueue) {
if (ride->first_peep_in_queue[entranceNum] != 0xFFFF)
goto loc_696645;
} else {
if (ride->first_peep_in_queue[dh] != 0xFFFF) {
rct_peep *firstPeepInQueue = &(g_sprite_list[ride->first_peep_in_queue[dh]].peep);
// This block of code won't allow a peep to join a queue if some sort of distance based criteria is met.
if (ride->first_peep_in_queue[entranceNum] != 0xFFFF) {
rct_peep *firstPeepInQueue = &(g_sprite_list[ride->first_peep_in_queue[entranceNum]].peep);
if (abs(firstPeepInQueue->z - peep->z) <= 6) {
int dx = abs(firstPeepInQueue->x - peep->x);
int dy = abs(firstPeepInQueue->y - peep->y);
@@ -7969,45 +7951,56 @@ static bool sub_6960AB(rct_peep *peep, int rideIndex, int dh, int bp)
}
}
// Check price, safety, ratings etc.
// 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;
// Price checks
if (ride->price != 0 && !peep_has_voucher_for_free_ride(peep, rideIndex)) {
if (peep->cash_in_pocket <= 0) {
if (!(bp & 4)) {
if (peepAtRide) {
peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_SPENT_MONEY, 255);
}
goto loc_696658;
}
if (ride->price > peep->cash_in_pocket) {
if (!(bp & 4)) {
if (peepAtRide) {
peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_CANT_AFFORD_0, rideIndex);
}
goto loc_696658;
}
}
if (ride->last_crash_type != RIDE_CRASH_TYPE_NONE) {
if (peep->happiness < 225) {
if (!(bp & 4)) {
peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_NOT_SAFE, rideIndex);
if (peep->happiness_growth_rate >= 64) {
peep->happiness_growth_rate -= 8;
}
ride_update_popularity(ride, 0);
// If happy enough, peeps will ignore the fact that a ride has recently crashed.
if (ride->last_crash_type != RIDE_CRASH_TYPE_NONE && peep->happiness < 225) {
if (peepAtRide) {
peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_NOT_SAFE, rideIndex);
if (peep->happiness_growth_rate >= 64) {
peep->happiness_growth_rate -= 8;
}
goto loc_696658;
ride_update_popularity(ride, 0);
}
goto loc_696658;
}
if (ride->excitement != (ride_rating)0xFFFF) {
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;
}
// 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 >> 5) >= 3) goto loc_696387;
if (!(bp & 4)) {
char buffer[255];
sprintf(buffer, "var_114: %d/255\n", ride->var_114);
OutputDebugString(buffer);
if (ride->var_114 > 96) goto loc_696387;
if (peepAtRide) {
peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_NOT_WHILE_RAINING, rideIndex);
if (peep->happiness_growth_rate >= 64) {
peep->happiness_growth_rate -= 8;
@@ -8019,7 +8012,7 @@ static bool sub_6960AB(rct_peep *peep, int rideIndex, int dh, int bp)
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 (!(bp & 4)) {
if (peepAtRide) {
peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_MORE_THRILLING, rideIndex);
if (peep->happiness_growth_rate >= 64) {
peep->happiness_growth_rate -= 8;
@@ -8033,7 +8026,7 @@ static bool sub_6960AB(rct_peep *peep, int rideIndex, int dh, int bp)
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 (!(bp & 4)) {
if (peepAtRide) {
peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_SICKENING, rideIndex);
if (peep->happiness_growth_rate >= 64) {
peep->happiness_growth_rate -= 8;
@@ -8054,12 +8047,13 @@ static bool sub_6960AB(rct_peep *peep, int rideIndex, int dh, int bp)
if (ride->max_lateral_g > 400 && !gConfigCheat.ignore_ride_intensity) goto loc_69666E;
}
// This is where the peep checks if the asking price is good enough for the ride.
loc_696387:;
uint32 value = ride->value;
if (value != 0xFFFF && !peep_has_voucher_for_free_ride(peep, rideIndex)) {
if (peep->flags & PEEP_FLAGS_HAS_PAID_FOR_PARK_ENTRY) value /= 4;
if (ride->price > (money16)(value * 2)) {
if (bp & 4) goto loc_696658;
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;
@@ -8067,7 +8061,7 @@ static bool sub_6960AB(rct_peep *peep, int rideIndex, int dh, int bp)
ride_update_popularity(ride, 0);
goto loc_696658;
}
if (ride->price <= (money16)(value / 2) && bp == 4) {
if (ride->price <= (money16)(value / 2) && flags == 4) {
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) {
peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_GOOD_VALUE, rideIndex);
@@ -8077,7 +8071,7 @@ static bool sub_6960AB(rct_peep *peep, int rideIndex, int dh, int bp)
}
}
if (!(bp & 4)) {
if (peepAtRide) {
ride_update_popularity(ride, 1);
if ((peep->flags & PEEP_FLAGS_INTAMIN) && ride_type_is_intamin(ride->type)) {
peep_insert_new_thought(peep, PEEP_THOUGHT_EXCITED, 255);
@@ -8092,14 +8086,17 @@ static bool sub_6960AB(rct_peep *peep, int rideIndex, int dh, int bp)
return true;
}
}
// Check has failed: peep will not go on ride.
loc_69666E:
if (rideIndex == peep->guest_heading_to_ride_id) {
peep_reset_ride_heading(peep);
}
return false;
// The ride is too intense for the peep
loc_6965F1:
if (!(bp & 4)) {
if (!(flags & 4)) {
peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_INTENSE, rideIndex);
if (peep->happiness_growth_rate >= 64) {
peep->happiness_growth_rate -= 8;
@@ -8108,11 +8105,13 @@ loc_6965F1:
}
goto loc_696658;
// Something queue related? When RIDE_LIFECYCLE_9 is set, peeps won't consider the ride when thinking about what to go on next.
loc_696645:
ride->lifecycle_flags |= RIDE_LIFECYCLE_9;
// Check has failed: peep will not go on ride, but it will still be marked as the last ride they visited.
loc_696658:
if (!(bp & 4)) {
if (!(flags & 4)) {
peep->previous_ride = rideIndex;
peep->previous_ride_time_out = 0;
}
@@ -8121,6 +8120,71 @@ loc_696658:
return false;
}
static bool peep_should_go_to_shop(rct_peep *peep, int rideIndex, bool peepAtShop)
{
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 (ride->type == RIDE_TYPE_TOILETS) {
if (peep->bathroom < 70) goto failedCheck;
// 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.
if (ride->price * 40 > peep->bathroom) {
if (peepAtShop) {
peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_NOT_PAYING, rideIndex);
if (peep->happiness_growth_rate >= 60) {
peep->happiness_growth_rate -= 16;
}
ride_update_popularity(ride, 0);
}
goto failedCheck;
}
}
if (ride->price != 0) {
if (peep->cash_in_pocket <= 0) {
if (peepAtShop) {
peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_SPENT_MONEY, 255);
}
goto failedCheck;
}
if (ride->price > peep->cash_in_pocket) {
if (peepAtShop) {
peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_CANT_AFFORD_0, rideIndex);
}
goto failedCheck;
}
}
successfulCheck:
if (peepAtShop) {
ride_update_popularity(ride, 1);
if (rideIndex == peep->guest_heading_to_ride_id) {
peep_reset_ride_heading(peep);
}
}
return true;
failedCheck:
if (peepAtShop) {
peep->previous_ride = rideIndex;
peep->previous_ride_time_out = 0;
}
peep_reset_ride_heading(peep);
return false;
}
/**
*
* rct2: 0x00695DD2

View File

@@ -407,7 +407,7 @@ enum {
RIDE_LIFECYCLE_BREAKDOWN_PENDING = 1 << 6,
RIDE_LIFECYCLE_BROKEN_DOWN = 1 << 7,
RIDE_LIFECYCLE_DUE_INSPECTION = 1 << 8,
RIDE_LIFECYCLE_9 = 1 << 9,
RIDE_LIFECYCLE_9 = 1 << 9, // Queue is full?
RIDE_LIFECYCLE_CRASHED = 1 << 10,
RIDE_LIFECYCLE_11 = 1 << 11,
RIDE_LIFECYCLE_EVER_BEEN_OPENED = 1 << 12,