add initial update awards implementation

This commit is contained in:
IntelOrca 2014-05-27 14:00:13 +01:00
parent 835835bbec
commit 88ffb17a4a
4 changed files with 135 additions and 2 deletions

View File

@ -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);
}

View File

@ -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

View File

@ -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();
}
}

View File

@ -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,