mirror of https://github.com/OpenRCT2/OpenRCT2.git
Merge pull request #4655 from duncanspumpkin/satisfaction
Re-refactor peep calculate satisfaction
This commit is contained in:
commit
b0c500e79b
239
src/peep/peep.c
239
src/peep/peep.c
|
@ -128,7 +128,7 @@ static void peep_set_has_ridden_ride_type(rct_peep *peep, int rideType);
|
||||||
static bool peep_has_ridden_ride_type(rct_peep *peep, int rideType);
|
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 void peep_on_enter_or_exit_ride(rct_peep *peep, int rideIndex, int flags);
|
||||||
static void peep_update_favourite_ride(rct_peep *peep, rct_ride *ride);
|
static void peep_update_favourite_ride(rct_peep *peep, rct_ride *ride);
|
||||||
static sint8 peep_calculate_ride_satisfaction(rct_peep *peep, rct_ride *ride);
|
static sint16 peep_calculate_ride_satisfaction(rct_peep *peep, rct_ride *ride);
|
||||||
static void peep_update_ride_nausea_growth(rct_peep *peep, rct_ride *ride);
|
static void peep_update_ride_nausea_growth(rct_peep *peep, rct_ride *ride);
|
||||||
static bool sub_69AF1E(rct_peep *peep, int rideIndex, int shopItem, money32 price);
|
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 peep_should_use_cash_machine(rct_peep *peep, int rideIndex);
|
||||||
|
@ -10064,7 +10064,7 @@ static void peep_on_enter_ride(rct_peep *peep, int rideIndex)
|
||||||
rct_ride *ride = get_ride(rideIndex);
|
rct_ride *ride = get_ride(rideIndex);
|
||||||
|
|
||||||
// Calculate how satisfying the ride is for the peep. Can range from -140 to +140.
|
// Calculate how satisfying the ride is for the peep. Can range from -140 to +140.
|
||||||
sint8 satisfaction = peep_calculate_ride_satisfaction(peep, ride);
|
sint16 satisfaction = peep_calculate_ride_satisfaction(peep, ride);
|
||||||
|
|
||||||
// Update the satisfaction stat of the ride.
|
// Update the satisfaction stat of the ride.
|
||||||
uint8 rideSatisfaction = 0;
|
uint8 rideSatisfaction = 0;
|
||||||
|
@ -10109,6 +10109,120 @@ static void peep_update_favourite_ride(rct_peep *peep, rct_ride *ride)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* rct2: 0x00695555 */
|
||||||
|
static sint16 peep_calculate_ride_value_satisfaction(rct_peep* peep, rct_ride* ride) {
|
||||||
|
if (gParkFlags & PARK_FLAGS_NO_MONEY){
|
||||||
|
return -30;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ride->value == 0xFFFF) {
|
||||||
|
return -30;
|
||||||
|
}
|
||||||
|
|
||||||
|
money16 ridePrice = ride_get_price(ride);
|
||||||
|
if (ride->value >= ridePrice) {
|
||||||
|
return -5;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((ride->value + ((ride->value * peep->happiness) / 256)) >= ridePrice) {
|
||||||
|
return -30;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static sint16 peep_calculate_ride_intensity_nausea_satisfaction(rct_peep* peep, rct_ride* ride) {
|
||||||
|
ride_rating minIntensity, maxIntensity;
|
||||||
|
ride_rating minNausea, maxNausea;
|
||||||
|
|
||||||
|
// Calculate satisfaction based on the intensity and nausea of the ride.
|
||||||
|
// The best possible score from this section is achieved by having the intensity and nausea
|
||||||
|
// of the ride fall exactly within the peep's preferences, but lower scores can still be achieved
|
||||||
|
// if the peep's happiness is enough to offset it.
|
||||||
|
|
||||||
|
uint8 intensitySatisfaction = 0;
|
||||||
|
uint8 nauseaSatisfaction = 0;
|
||||||
|
if (ride->excitement == (ride_rating)0xFFFF) {
|
||||||
|
return 70;
|
||||||
|
}
|
||||||
|
intensitySatisfaction = 3;
|
||||||
|
nauseaSatisfaction = 3;
|
||||||
|
|
||||||
|
maxIntensity = (peep->intensity >> 4) * 100;
|
||||||
|
minIntensity = (peep->intensity & 0xF) * 100;
|
||||||
|
if (minIntensity <= ride->intensity && maxIntensity >= ride->intensity) {
|
||||||
|
intensitySatisfaction--;
|
||||||
|
}
|
||||||
|
minIntensity -= peep->happiness * 2;
|
||||||
|
maxIntensity += peep->happiness;
|
||||||
|
if (minIntensity <= ride->intensity && maxIntensity >= ride->intensity) {
|
||||||
|
intensitySatisfaction--;
|
||||||
|
}
|
||||||
|
minIntensity -= peep->happiness * 2;
|
||||||
|
maxIntensity += peep->happiness;
|
||||||
|
if (minIntensity <= ride->intensity && maxIntensity >= ride->intensity) {
|
||||||
|
intensitySatisfaction--;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Although it's not shown in the interface, a peep with Average or High nausea tolerance
|
||||||
|
// has a minimum preferred nausea value. (For peeps with None or Low, this is set to zero.)
|
||||||
|
minNausea = NauseaMinimumThresholds[(peep->nausea_tolerance & 3)];
|
||||||
|
maxNausea = NauseaMaximumThresholds[(peep->nausea_tolerance & 3)];
|
||||||
|
if (minNausea <= ride->nausea && maxNausea >= ride->nausea) {
|
||||||
|
nauseaSatisfaction--;
|
||||||
|
}
|
||||||
|
minNausea -= peep->happiness * 2;
|
||||||
|
maxNausea += peep->happiness;
|
||||||
|
if (minNausea <= ride->nausea && maxNausea >= ride->nausea) {
|
||||||
|
nauseaSatisfaction--;
|
||||||
|
}
|
||||||
|
minNausea -= peep->happiness * 2;
|
||||||
|
maxNausea += peep->happiness;
|
||||||
|
if (minNausea <= ride->nausea && maxNausea >= ride->nausea) {
|
||||||
|
nauseaSatisfaction--;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8 highestSatisfaction = max(intensitySatisfaction, nauseaSatisfaction);
|
||||||
|
uint8 lowestSatisfaction = min(intensitySatisfaction, nauseaSatisfaction);
|
||||||
|
|
||||||
|
switch (highestSatisfaction) {
|
||||||
|
case 0:
|
||||||
|
return 70;
|
||||||
|
case 1:
|
||||||
|
switch (lowestSatisfaction)
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
return 50;
|
||||||
|
case 1:
|
||||||
|
return 35;
|
||||||
|
}
|
||||||
|
case 2:
|
||||||
|
switch (lowestSatisfaction)
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
return 35;
|
||||||
|
case 1:
|
||||||
|
return 20;
|
||||||
|
case 2:
|
||||||
|
return 10;
|
||||||
|
}
|
||||||
|
case 3:
|
||||||
|
switch (lowestSatisfaction)
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
return -35;
|
||||||
|
case 1:
|
||||||
|
return -50;
|
||||||
|
case 2:
|
||||||
|
return -60;
|
||||||
|
case 3:
|
||||||
|
return -60;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Should never happen
|
||||||
|
return 70;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The satisfaction values calculated here are used to determine how happy the peep is with the ride,
|
* The satisfaction values calculated here are used to determine how happy the peep is with the ride,
|
||||||
* and also affects the satisfaction stat of the ride itself. The factors that affect satisfaction include:
|
* and also affects the satisfaction stat of the ride itself. The factors that affect satisfaction include:
|
||||||
|
@ -10117,125 +10231,10 @@ static void peep_update_favourite_ride(rct_peep *peep, rct_ride *ride)
|
||||||
* - How long the peep was waiting in the queue
|
* - How long the peep was waiting in the queue
|
||||||
* - If the peep has been on the ride before, or on another ride of the same type
|
* - If the peep has been on the ride before, or on another ride of the same type
|
||||||
*/
|
*/
|
||||||
static sint8 peep_calculate_ride_satisfaction(rct_peep *peep, rct_ride *ride)
|
static sint16 peep_calculate_ride_satisfaction(rct_peep *peep, rct_ride *ride)
|
||||||
{
|
{
|
||||||
sint8 satisfaction = 0;
|
sint16 satisfaction = peep_calculate_ride_value_satisfaction(peep, ride);
|
||||||
|
satisfaction += peep_calculate_ride_intensity_nausea_satisfaction(peep, ride);
|
||||||
// Calculate satisfaction based on the price and value of the ride.
|
|
||||||
uint8 valueSatisfaction = 1;
|
|
||||||
|
|
||||||
if (!(gParkFlags & PARK_FLAGS_NO_MONEY)) {
|
|
||||||
if (ride->value != 0xFFFF) {
|
|
||||||
money16 ridePrice = ride_get_price(ride);
|
|
||||||
if (ridePrice <= (money16)ride->value) {
|
|
||||||
valueSatisfaction = 2;
|
|
||||||
}
|
|
||||||
// Even if the price is more than the value, the peep will still be partially satisfied if their
|
|
||||||
// happiness is high enough to offset the difference. (Scales from +0% at empty happiness to +99% at full)
|
|
||||||
else if (ridePrice <= (money16)(ride->value + ride->value * (peep->happiness / 256.0))) {
|
|
||||||
valueSatisfaction = 1;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
valueSatisfaction = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (valueSatisfaction) {
|
|
||||||
case 2:
|
|
||||||
satisfaction += 40;
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
satisfaction += 15;
|
|
||||||
break;
|
|
||||||
case 0:
|
|
||||||
satisfaction -= 45;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Calculate satisfaction based on the intensity and nausea of the ride.
|
|
||||||
// The best possible score from this section is achieved by having the intensity and nausea
|
|
||||||
// of the ride fall exactly within the peep's preferences, but lower scores can still be achieved
|
|
||||||
// if the peep's happiness is enough to offset it.
|
|
||||||
ride_rating minIntensity, maxIntensity;
|
|
||||||
ride_rating minNausea, maxNausea;
|
|
||||||
uint8 intensitySatisfaction = 3;
|
|
||||||
uint8 nauseaSatisfaction = 3;
|
|
||||||
|
|
||||||
if (ride->excitement != (ride_rating)0xFFFF) {
|
|
||||||
maxIntensity = (peep->intensity >> 4) * 100;
|
|
||||||
minIntensity = (peep->intensity & 0xF) * 100;
|
|
||||||
if (ride->intensity > maxIntensity || ride->intensity < minIntensity) {
|
|
||||||
intensitySatisfaction--;
|
|
||||||
}
|
|
||||||
|
|
||||||
minIntensity -= peep->happiness * 2;
|
|
||||||
maxIntensity += peep->happiness;
|
|
||||||
if (ride->intensity > maxIntensity || ride->intensity < minIntensity) {
|
|
||||||
intensitySatisfaction--;
|
|
||||||
}
|
|
||||||
|
|
||||||
minIntensity -= peep->happiness * 2;
|
|
||||||
maxIntensity += peep->happiness;
|
|
||||||
if (ride->intensity > maxIntensity || ride->intensity < minIntensity) {
|
|
||||||
intensitySatisfaction--;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Although it's not shown in the interface, a peep with Average or High nausea tolerance
|
|
||||||
// has a minimum preferred nausea value. (For peeps with None or Low, this is set to zero.)
|
|
||||||
minNausea = NauseaMinimumThresholds[peep->nausea_tolerance & 3];
|
|
||||||
maxNausea = NauseaMaximumThresholds[peep->nausea_tolerance & 3];
|
|
||||||
if (ride->nausea > maxNausea || ride->nausea < minNausea) {
|
|
||||||
nauseaSatisfaction--;
|
|
||||||
}
|
|
||||||
|
|
||||||
minNausea -= peep->happiness * 2;
|
|
||||||
maxNausea += peep->happiness;
|
|
||||||
if (ride->nausea > maxNausea || ride->nausea < minNausea) {
|
|
||||||
nauseaSatisfaction--;
|
|
||||||
}
|
|
||||||
|
|
||||||
minNausea -= peep->happiness * 2;
|
|
||||||
maxNausea += peep->happiness;
|
|
||||||
if (ride->nausea > maxNausea || ride->nausea < minNausea) {
|
|
||||||
nauseaSatisfaction--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// The combination of the intensity and nausea satisfaction is then used to determine the raw satisfaction value.
|
|
||||||
uint8 highestSatisfaction = max(intensitySatisfaction, nauseaSatisfaction);
|
|
||||||
uint8 lowestSatisfaction = min(intensitySatisfaction, nauseaSatisfaction);
|
|
||||||
|
|
||||||
if (highestSatisfaction == 3) {
|
|
||||||
switch (lowestSatisfaction) {
|
|
||||||
case 3:
|
|
||||||
satisfaction += 20;
|
|
||||||
case 2:
|
|
||||||
satisfaction += 15;
|
|
||||||
case 1:
|
|
||||||
satisfaction += 35;
|
|
||||||
break;
|
|
||||||
case 0:
|
|
||||||
satisfaction -= 35;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (highestSatisfaction == 2) {
|
|
||||||
switch (lowestSatisfaction) {
|
|
||||||
case 2:
|
|
||||||
satisfaction += 15;
|
|
||||||
case 1:
|
|
||||||
satisfaction += 20;
|
|
||||||
break;
|
|
||||||
case 0:
|
|
||||||
satisfaction -= 50;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (highestSatisfaction == 1 && lowestSatisfaction == 1) {
|
|
||||||
satisfaction += 10;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
satisfaction -= 60;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Calculate satisfaction based on how long the peep has been in the queue for.
|
// Calculate satisfaction based on how long the peep has been in the queue for.
|
||||||
// (For comparison: peeps start thinking "I've been queueing for a long time" at 3500 and
|
// (For comparison: peeps start thinking "I've been queueing for a long time" at 3500 and
|
||||||
|
|
Loading…
Reference in New Issue