diff --git a/src/park.c b/src/park.c index 027c08aa26..f879a409ef 100644 --- a/src/park.c +++ b/src/park.c @@ -23,6 +23,7 @@ #include "finance.h" #include "map.h" #include "marketing.h" +#include "news_item.h" #include "park.h" #include "peep.h" #include "ride.h" @@ -477,7 +478,7 @@ static int park_calculate_guest_generation_probability() } // Reward or penalties for park awards - for (i = 0; i < 4; i++) { + for (i = 0; i < MAX_AWARDS; i++) { rct_award *award = &RCT2_ADDRESS(RCT2_ADDRESS_AWARD_LIST, rct_award)[i]; if (award->time == 0) continue; @@ -589,4 +590,114 @@ void park_update() void park_update_histories() { RCT2_CALLPROC_EBPSAFE(0x0066A231); +} + +static int park_is_award_deserved(int awardType, int activeAwardTypes) +{ + switch (awardType) { + case PARK_AWARD_MOST_UNTIDY: + break; + case PARK_AWARD_MOST_TIDY: + break; + case PARK_AWARD_BEST_ROLLERCOASTERS: + break; + case PARK_AWARD_BEST_VALUE: + if (activeAwardTypes & (1 << PARK_AWARD_WORST_VALUE)) + return 0; + if (activeAwardTypes & (1 << PARK_AWARD_MOST_DISAPPOINTING)) + return 0; + if (RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & (PARK_FLAGS_11 | PARK_FLAGS_PARK_FREE_ENTRY)) + return 0; + if (RCT2_GLOBAL(RCT2_TOTAL_RIDE_VALUE, money16) < MONEY(10, 00)) + return 0; + if (RCT2_GLOBAL(RCT2_ADDRESS_PARK_ENTRANCE_FEE, money16) + MONEY(0, 10) >= RCT2_GLOBAL(RCT2_TOTAL_RIDE_VALUE, money16) / 2) + return 0; + return 1; + case PARK_AWARD_MOST_BEAUTIFUL: + break; + case PARK_AWARD_WORST_VALUE: + if (activeAwardTypes & (1 << PARK_AWARD_BEST_VALUE)) + return 0; + if (RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_11) + return 0; + if (RCT2_GLOBAL(RCT2_ADDRESS_PARK_ENTRANCE_FEE, money16) == MONEY(0, 00)) + return 0; + if (RCT2_GLOBAL(RCT2_TOTAL_RIDE_VALUE, money16) >= RCT2_GLOBAL(RCT2_ADDRESS_PARK_ENTRANCE_FEE, money16)) + return 0; + return 1; + break; + case PARK_AWARD_SAFEST: + break; + case PARK_AWARD_BEST_STAFF: + break; + case PARK_AWARD_BEST_FOOD: + break; + case PARK_AWARD_WORST_FOOD: + break; + case PARK_AWARD_BEST_RESTROOMS: + break; + case PARK_AWARD_MOST_DISAPPOINTING: + break; + case PARK_AWARD_BEST_WATER_RIDES: + break; + case PARK_AWARD_BEST_CUSTOM_DESIGNED_RIDES: + break; + case PARK_AWARD_MOST_DAZZLING_RIDE_COLOURS: + break; + case PARK_AWARD_MOST_CONFUSING_LAYOUT: + break; + case PARK_AWARD_BEST_GENTLE_RIDES: + break; + } + + return 0; +} + +/** + * + * rct2: 0x0066A86C + */ +void park_update_awards() +{ + int i, activeAwardTypes, freeAwardEntryIndex; + rct_award *awards; + + awards = RCT2_ADDRESS(RCT2_ADDRESS_AWARD_LIST, rct_award); + + // Only add new awards if park is open + if (RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_PARK_OPEN) { + // Set active award types as flags + activeAwardTypes = 0; + freeAwardEntryIndex = -1; + for (i = 0; i < MAX_AWARDS; i++) { + if (awards[i].time != 0) + activeAwardTypes |= (1 << awards[i].type); + else if (freeAwardEntryIndex != -1) + freeAwardEntryIndex = i; + } + + // Check if there was a free award entry + if (freeAwardEntryIndex != -1) { + // Get a random award type not already active + int awardType; + do { + awardType = (((scenario_rand() & 0xFF) * 17) >> 8) & 0xFF; + } while (activeAwardTypes & (1 << awardType)); + + // Check if award is deserved + if (park_is_award_deserved(awardType, activeAwardTypes)) { + // Add award + awards[freeAwardEntryIndex].type = awardType; + awards[freeAwardEntryIndex].time = 5; + news_item_add_to_queue(NEWS_ITEM_AWARD, STR_NEWS_ITEM_AWARD_MOST_UNTIDY + awardType, 0); + window_invalidate_by_id(WC_PARK_INFORMATION, 0); + } + } + } + + // Decrease award times + for (i = 0; i < MAX_AWARDS; i++) + if (awards[i].time != 0) + if (--awards[i].time == 0) + window_invalidate_by_id(WC_PARK_INFORMATION, 0); } \ No newline at end of file diff --git a/src/park.h b/src/park.h index 94a98789fc..eb7d61e358 100644 --- a/src/park.h +++ b/src/park.h @@ -49,6 +49,7 @@ enum { PARK_AWARD_MOST_DAZZLING_RIDE_COLOURS, PARK_AWARD_MOST_CONFUSING_LAYOUT, PARK_AWARD_BEST_GENTLE_RIDES, + PARK_AWARD_COUNT }; enum { @@ -68,6 +69,8 @@ enum { PARK_FLAGS_18 = (1 << 18) }; +#define MAX_AWARDS 4 + int park_is_award_positive(int type); int park_is_open(); void park_init(); @@ -81,5 +84,6 @@ void reset_park_entrances(); void park_update(); void park_update_histories(); +void park_update_awards(); #endif diff --git a/src/scenario.c b/src/scenario.c index 51ea46cc00..93b93fbbbf 100644 --- a/src/scenario.c +++ b/src/scenario.c @@ -634,7 +634,7 @@ void scenario_update() RCT2_CALLPROC_EBPSAFE(0x0069DEAD); scenario_objectives_check(); scenario_entrance_fee_too_high_check(); - RCT2_CALLPROC_EBPSAFE(0x0066A86C); // award checks + park_update_awards(); } } diff --git a/src/string_ids.h b/src/string_ids.h index d0fde8f342..6812f33eeb 100644 --- a/src/string_ids.h +++ b/src/string_ids.h @@ -547,6 +547,24 @@ enum { STR_MOST_CONFUSING_LAYOUT = STR_AWARD_MOST_UNTIDY + 15, STR_BEST_GENTLE_RIDES = STR_AWARD_MOST_UNTIDY + 16, + STR_NEWS_ITEM_AWARD_MOST_UNTIDY = 2831, + STR_NEWS_ITEM_MOST_TIDY = STR_NEWS_ITEM_AWARD_MOST_UNTIDY + 1, + STR_NEWS_ITEM_BEST_ROLLERCOASTERS = STR_AWARD_MOST_UNTIDY + 2, + STR_NEWS_ITEM_BEST_VALUE = STR_NEWS_ITEM_AWARD_MOST_UNTIDY + 3, + STR_NEWS_ITEM_MOST_BEAUTIFUL = STR_NEWS_ITEM_AWARD_MOST_UNTIDY + 4, + STR_NEWS_ITEM_WORST_VALUE = STR_NEWS_ITEM_AWARD_MOST_UNTIDY + 5, + STR_NEWS_ITEM_SAFEST = STR_NEWS_ITEM_AWARD_MOST_UNTIDY + 6, + STR_NEWS_ITEM_BEST_STAFF = STR_NEWS_ITEM_AWARD_MOST_UNTIDY + 7, + STR_NEWS_ITEM_BEST_FOOD = STR_NEWS_ITEM_AWARD_MOST_UNTIDY + 8, + STR_NEWS_ITEM_WORST_FOOD = STR_NEWS_ITEM_AWARD_MOST_UNTIDY + 9, + STR_NEWS_ITEM_BEST_RESTROOMS = STR_NEWS_ITEM_AWARD_MOST_UNTIDY + 10, + STR_NEWS_ITEM_MOST_DISAPPOINTING = STR_NEWS_ITEM_AWARD_MOST_UNTIDY + 11, + STR_NEWS_ITEM_BEST_WATER_RIDES = STR_NEWS_ITEM_AWARD_MOST_UNTIDY + 12, + STR_NEWS_ITEM_BEST_CUSTOM_DESIGNED_RIDES = STR_NEWS_ITEM_AWARD_MOST_UNTIDY + 13, + STR_NEWS_ITEM_MOST_DAZZLING_RIDE_COLOURS = STR_NEWS_ITEM_AWARD_MOST_UNTIDY + 14, + STR_NEWS_ITEM_MOST_CONFUSING_LAYOUT = STR_NEWS_ITEM_AWARD_MOST_UNTIDY + 15, + STR_NEWS_ITEM_BEST_GENTLE_RIDES = STR_NEWS_ITEM_AWARD_MOST_UNTIDY + 16, + STR_NO_RECENT_AWARDS = 2848, STR_TUTORIAL = 2856,