1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2026-01-06 06:32:56 +01:00

add global macros for research variables

This commit is contained in:
Ted John
2016-04-25 23:26:26 +01:00
parent 7be699adbb
commit 83acafe05a
7 changed files with 78 additions and 65 deletions

View File

@@ -102,7 +102,7 @@ void finance_pay_research()
if (gParkFlags & PARK_FLAGS_NO_MONEY)
return;
level = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_RESEARCH_LEVEL, uint8);
level = gResearchFundingLevel;
finance_payment(research_cost_table[level] / 4, RCT_EXPENDITURE_TYPE_RESEARCH);
}
@@ -221,7 +221,7 @@ void finance_update_daily_profit()
}
// Research costs
uint8 level = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_RESEARCH_LEVEL, uint8);
uint8 level = gResearchFundingLevel;
current_profit -= research_cost_table[level];
// Loan costs

View File

@@ -76,29 +76,27 @@ void research_update_uncompleted_types()
*/
static void research_calculate_expected_date()
{
int progress = RCT2_GLOBAL(RCT2_ADDRESS_RESEARH_PROGRESS, uint16);
int progressStage = RCT2_GLOBAL(RCT2_ADDRESS_RESEARH_PROGRESS_STAGE, uint8);
int researchLevel = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_RESEARCH_LEVEL, uint8);
int currentDay = gDateMonthTicks;
int currentMonth = gDateMonthsElapsed;
int progress = gResearchProgress;
int progressStage = gResearchProgressStage;
int researchLevel = gResearchFundingLevel;
int expectedDay, expectedMonth, dayQuotient, dayRemainder, progressRemaining, daysRemaining;
if (progressStage == RESEARCH_STAGE_INITIAL_RESEARCH || researchLevel == RESEARCH_FUNDING_NONE) {
RCT2_GLOBAL(RCT2_ADDRESS_NEXT_RESEARCH_EXPECTED_DAY, uint8) = 255;
gResearchExpectedDay = 255;
} else {
progressRemaining = progressStage == RESEARCH_STAGE_COMPLETING_DESIGN ? 0x10000 : 0x20000;
progressRemaining -= progress;
daysRemaining = (progressRemaining / _researchRate[researchLevel]) * 128;
expectedDay = currentDay + (daysRemaining & 0xFFFF);
expectedDay = gDateMonthTicks + (daysRemaining & 0xFFFF);
dayQuotient = expectedDay / 0x10000;
dayRemainder = expectedDay % 0x10000;
expectedMonth = date_get_month(currentMonth + dayQuotient + (daysRemaining >> 16));
expectedMonth = date_get_month(gDateMonthsElapsed + dayQuotient + (daysRemaining >> 16));
expectedDay = (dayRemainder * days_in_month[expectedMonth]) >> 16;
RCT2_GLOBAL(RCT2_ADDRESS_NEXT_RESEARCH_EXPECTED_DAY, uint8) = expectedDay;
RCT2_GLOBAL(RCT2_ADDRESS_NEXT_RESEARCH_EXPECTED_MONTH, uint8) = expectedMonth;
gResearchExpectedDay = expectedDay;
gResearchExpectedMonth = expectedMonth;
}
}
@@ -116,7 +114,6 @@ static void research_next_design()
{
rct_research_item *firstUnresearchedItem, *researchItem, tmp;
int ignoreActiveResearchTypes;
int activeResearchTypes = RCT2_GLOBAL(RCT2_ADDRESS_ACTIVE_RESEARCH_TYPES, uint16);
// Skip already researched items
firstUnresearchedItem = gResearchItems;
@@ -133,22 +130,22 @@ static void research_next_design()
researchItem = firstUnresearchedItem;
continue;
} else {
RCT2_GLOBAL(RCT2_ADDRESS_RESEARH_PROGRESS, uint16) = 0;
RCT2_GLOBAL(RCT2_ADDRESS_RESEARH_PROGRESS_STAGE, uint8) = RESEARCH_STAGE_FINISHED_ALL;
gResearchProgress = 0;
gResearchProgressStage = RESEARCH_STAGE_FINISHED_ALL;
research_invalidate_related_windows();
// Reset funding to 0 if no more rides.
research_set_funding(0);
return;
}
} else if (ignoreActiveResearchTypes || (activeResearchTypes & (1 << researchItem->category))) {
} else if (ignoreActiveResearchTypes || (gResearchPriorities & (1 << researchItem->category))) {
break;
}
}
RCT2_GLOBAL(RCT2_ADDRESS_NEXT_RESEARCH_ITEM, uint32) = researchItem->entryIndex;
RCT2_GLOBAL(RCT2_ADDRESS_NEXT_RESEARCH_CATEGORY, uint8) = researchItem->category;
RCT2_GLOBAL(RCT2_ADDRESS_RESEARH_PROGRESS, uint16) = 0;
RCT2_GLOBAL(RCT2_ADDRESS_RESEARH_PROGRESS_STAGE, uint8) = RESEARCH_STAGE_DESIGNING;
gResearchNextItem = researchItem->entryIndex;
gResearchNextCategory = researchItem->category;
gResearchProgress = 0;
gResearchProgressStage = RESEARCH_STAGE_DESIGNING;
// Bubble research item up until it is above the researched items separator
do {
@@ -250,28 +247,28 @@ void research_update()
if (RCT2_GLOBAL(RCT2_ADDRESS_SCENARIO_TICKS, uint32) % 32 != 0)
return;
researchLevel = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_RESEARCH_LEVEL, uint8);
researchLevel = gResearchFundingLevel;
currentResearchProgress = RCT2_GLOBAL(RCT2_ADDRESS_RESEARH_PROGRESS, uint16);
currentResearchProgress = gResearchProgress;
currentResearchProgress += _researchRate[researchLevel];
if (currentResearchProgress <= 0xFFFF) {
RCT2_GLOBAL(RCT2_ADDRESS_RESEARH_PROGRESS, uint16) = currentResearchProgress;
gResearchProgress = currentResearchProgress;
} else {
switch (RCT2_GLOBAL(RCT2_ADDRESS_RESEARH_PROGRESS_STAGE, uint8)) {
switch (gResearchProgressStage) {
case RESEARCH_STAGE_INITIAL_RESEARCH:
research_next_design();
research_calculate_expected_date();
break;
case RESEARCH_STAGE_DESIGNING:
RCT2_GLOBAL(RCT2_ADDRESS_RESEARH_PROGRESS, uint16) = 0;
RCT2_GLOBAL(RCT2_ADDRESS_RESEARH_PROGRESS_STAGE, uint8) = RESEARCH_STAGE_COMPLETING_DESIGN;
gResearchProgress = 0;
gResearchProgressStage = RESEARCH_STAGE_COMPLETING_DESIGN;
research_calculate_expected_date();
research_invalidate_related_windows();
break;
case RESEARCH_STAGE_COMPLETING_DESIGN:
research_finish_item(RCT2_GLOBAL(RCT2_ADDRESS_NEXT_RESEARCH_ITEM, sint32));
RCT2_GLOBAL(RCT2_ADDRESS_RESEARH_PROGRESS, uint16) = 0;
RCT2_GLOBAL(RCT2_ADDRESS_RESEARH_PROGRESS_STAGE, uint8) = 0;
research_finish_item((sint32)gResearchNextItem);
gResearchProgress = 0;
gResearchProgressStage = 0;
research_calculate_expected_date();
research_update_uncompleted_types();
research_invalidate_related_windows();
@@ -338,8 +335,8 @@ void sub_684AC3(){
}
RCT2_GLOBAL(RCT2_ADDRESS_LAST_RESEARCHED_ITEM_SUBJECT, sint32) = -1;
RCT2_GLOBAL(RCT2_ADDRESS_RESEARH_PROGRESS_STAGE, uint8) = 0;
RCT2_GLOBAL(RCT2_ADDRESS_RESEARH_PROGRESS, uint16) = 0;
gResearchProgressStage = 0;
gResearchProgress = 0;
}
/**
@@ -565,10 +562,10 @@ void game_command_set_research_funding(int* eax, int* ebx, int* ecx, int* edx, i
log_warning("Invalid research rate %d", fundingAmount);
return;
}
RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_RESEARCH_LEVEL, uint8) = fundingAmount;
gResearchFundingLevel = fundingAmount;
}
else
RCT2_GLOBAL(RCT2_ADDRESS_ACTIVE_RESEARCH_TYPES, uint8) = activeCategories;
gResearchPriorities = activeCategories;
window_invalidate_by_class(WC_FINANCES);
window_invalidate_by_class(WC_RESEARCH);

View File

@@ -66,6 +66,15 @@ enum {
RESEARCH_CATEGORY_SCENERYSET
};
#define gResearchFundingLevel RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_RESEARCH_LEVEL, uint8)
#define gResearchPriorities RCT2_GLOBAL(RCT2_ADDRESS_ACTIVE_RESEARCH_TYPES, uint8)
#define gResearchProgress RCT2_GLOBAL(RCT2_ADDRESS_RESEARH_PROGRESS, uint16)
#define gResearchProgressStage RCT2_GLOBAL(RCT2_ADDRESS_RESEARH_PROGRESS_STAGE, uint8)
#define gResearchExpectedMonth RCT2_GLOBAL(RCT2_ADDRESS_NEXT_RESEARCH_EXPECTED_MONTH, uint8)
#define gResearchExpectedDay RCT2_GLOBAL(RCT2_ADDRESS_NEXT_RESEARCH_EXPECTED_DAY, uint8)
#define gResearchNextCategory RCT2_GLOBAL(RCT2_ADDRESS_NEXT_RESEARCH_CATEGORY, uint8)
#define gResearchNextItem RCT2_GLOBAL(RCT2_ADDRESS_NEXT_RESEARCH_ITEM, uint32)
extern rct_research_item *gResearchItems;
extern uint8 gResearchUncompletedCategories;
extern bool gSilentResearch;

View File

@@ -856,7 +856,7 @@ void S4Importer::ImportResearch()
research_remove_non_separate_vehicle_types();
// Research funding / priority
uint16 activeResearchTypes = 0;
uint8 activeResearchTypes = 0;
if (_s4.research_priority & RCT1_RESEARCH_EXPENDITURE_ROLLERCOASTERS)
{
activeResearchTypes |= (1 << RESEARCH_CATEGORY_ROLLERCOASTER);
@@ -879,16 +879,16 @@ void S4Importer::ImportResearch()
{
activeResearchTypes |= (1 << RESEARCH_CATEGORY_SCENERYSET);
}
RCT2_GLOBAL(RCT2_ADDRESS_ACTIVE_RESEARCH_TYPES, uint16) = activeResearchTypes;
RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_RESEARCH_LEVEL, uint8) = _s4.research_level;
gResearchPriorities = activeResearchTypes;
gResearchFundingLevel = _s4.research_level;
// Research history
RCT2_GLOBAL(RCT2_ADDRESS_RESEARH_PROGRESS, uint8) = _s4.research_progress;
// RCT2_GLOBAL(RCT2_ADDRESS_RESEARH_PROGRESS_STAGE, uint8) =
RCT2_GLOBAL(RCT2_ADDRESS_NEXT_RESEARCH_ITEM, uint8) = _s4.next_research_item;
RCT2_GLOBAL(RCT2_ADDRESS_NEXT_RESEARCH_CATEGORY, uint8) = _s4.next_research_category;
// RCT2_GLOBAL(RCT2_ADDRESS_NEXT_RESEARCH_EXPECTED_DAY, uint8) =
// RCT2_GLOBAL(RCT2_ADDRESS_NEXT_RESEARCH_EXPECTED_MONTH, uint8) =
gResearchProgress = _s4.research_progress;
// gResearchProgressStage =
gResearchNextItem = _s4.next_research_item;
gResearchNextCategory = _s4.next_research_category;
// gResearchExpectedDay =
// gResearchExpectedMonth =
}

View File

@@ -1263,7 +1263,7 @@ static void window_finances_research_mouseup(rct_window *w, int widgetIndex)
case WIDX_WATER_RIDES:
case WIDX_SHOPS_AND_STALLS:
case WIDX_SCENERY_AND_THEMING:
activeResearchTypes = RCT2_GLOBAL(RCT2_ADDRESS_ACTIVE_RESEARCH_TYPES, uint16);
activeResearchTypes = gResearchPriorities;
activeResearchTypes ^= 1 << (widgetIndex - WIDX_TRANSPORT_RIDES);
research_set_priority(activeResearchTypes);
break;
@@ -1298,7 +1298,7 @@ static void window_finances_research_mousedown(int widgetIndex, rct_window *w, r
dropdownWidget->right - dropdownWidget->left - 3
);
int currentResearchLevel = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_RESEARCH_LEVEL, uint8);
int currentResearchLevel = gResearchFundingLevel;
dropdown_set_checked(currentResearchLevel, true);
}
@@ -1340,17 +1340,17 @@ static void window_finances_research_invalidate(rct_window *w)
}
window_finances_set_pressed_tab(w);
if (RCT2_GLOBAL(RCT2_ADDRESS_RESEARH_PROGRESS_STAGE, uint8) == RESEARCH_STAGE_FINISHED_ALL) {
if (gResearchProgressStage == RESEARCH_STAGE_FINISHED_ALL) {
window_finances_research_widgets[WIDX_RESEARCH_FUNDING].type = WWT_EMPTY;
window_finances_research_widgets[WIDX_RESEARCH_FUNDING_DROPDOWN_BUTTON].type = WWT_EMPTY;
}
int currentResearchLevel = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_RESEARCH_LEVEL, uint8);
int currentResearchLevel = gResearchFundingLevel;
// Current funding
window_finances_research_widgets[WIDX_RESEARCH_FUNDING].image = STR_NO_FUNDING + currentResearchLevel;
// Checkboxes
int activeResearchTypes = RCT2_GLOBAL(RCT2_ADDRESS_ACTIVE_RESEARCH_TYPES, uint16);
uint8 activeResearchTypes = gResearchPriorities;
int uncompletedResearchTypes = gResearchUncompletedCategories;
for (int i = 0; i < 7; i++) {
int mask = 1 << i;

View File

@@ -330,7 +330,7 @@ void window_research_development_page_paint(rct_window *w, rct_drawpixelinfo *dp
int y = w->y + w->widgets[WIDX_CURRENTLY_IN_DEVELOPMENT_GROUP + baseWidgetIndex].top + 12;
rct_string_id stringId;
if (RCT2_GLOBAL(RCT2_ADDRESS_RESEARH_PROGRESS_STAGE, uint8) == RESEARCH_STAGE_FINISHED_ALL) {
if (gResearchProgressStage == RESEARCH_STAGE_FINISHED_ALL) {
stringId = STR_RESEARCH_UNKNOWN;
gfx_draw_string_left_wrapped(dpi, &stringId, x, y, 296, STR_RESEARCH_TYPE_LABEL, 0);
y += 25;
@@ -345,10 +345,10 @@ void window_research_development_page_paint(rct_window *w, rct_drawpixelinfo *dp
} else {
// Research type
stringId = STR_RESEARCH_UNKNOWN;
if (RCT2_GLOBAL(RCT2_ADDRESS_RESEARH_PROGRESS_STAGE, uint8) != RESEARCH_STAGE_INITIAL_RESEARCH) {
stringId = STR_TRANSPORT_RIDE + RCT2_GLOBAL(RCT2_ADDRESS_NEXT_RESEARCH_CATEGORY, uint8);
if (RCT2_GLOBAL(RCT2_ADDRESS_RESEARH_PROGRESS_STAGE, uint8) != RESEARCH_STAGE_DESIGNING) {
uint32 typeId = RCT2_GLOBAL(RCT2_ADDRESS_NEXT_RESEARCH_ITEM, uint32);
if (gResearchProgressStage != RESEARCH_STAGE_INITIAL_RESEARCH) {
stringId = STR_TRANSPORT_RIDE + gResearchNextCategory;
if (gResearchProgressStage != RESEARCH_STAGE_DESIGNING) {
uint32 typeId = gResearchNextItem;
if (typeId >= 0x10000) {
rct_ride_entry *rideEntry = get_ride_entry(typeId & 0xFF);
stringId = (rideEntry->flags & RIDE_ENTRY_FLAG_SEPARATE_RIDE_NAME) ?
@@ -363,18 +363,18 @@ void window_research_development_page_paint(rct_window *w, rct_drawpixelinfo *dp
y += 25;
// Progress
stringId = 2285 + RCT2_GLOBAL(RCT2_ADDRESS_RESEARH_PROGRESS_STAGE, uint8);
stringId = 2285 + gResearchProgressStage;
gfx_draw_string_left_wrapped(dpi, &stringId, x, y, 296, STR_RESEARCH_PROGRESS_LABEL, 0);
y += 15;
// Expected
RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, uint16) = STR_UNKNOWN;
if (RCT2_GLOBAL(RCT2_ADDRESS_RESEARH_PROGRESS_STAGE, uint8) != 0) {
uint16 expectedDay = RCT2_GLOBAL(RCT2_ADDRESS_NEXT_RESEARCH_EXPECTED_DAY, uint8);
if (gResearchProgressStage != 0) {
uint16 expectedDay = gResearchExpectedDay;
if (expectedDay != 255) {
RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, uint16) = 2289;
RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS + 2, uint16) = STR_DATE_DAY_1 + expectedDay;
RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS + 4, uint16) = STR_MONTH_MARCH + RCT2_GLOBAL(RCT2_ADDRESS_NEXT_RESEARCH_EXPECTED_MONTH, uint8);
RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS + 4, uint16) = STR_MONTH_MARCH + gResearchExpectedMonth;
}
}
gfx_draw_string_left(dpi, STR_RESEARCH_EXPECTED_LABEL, (void*)RCT2_ADDRESS_COMMON_FORMAT_ARGS, 0, x, y);
@@ -429,7 +429,7 @@ static void window_research_funding_mouseup(rct_window *w, int widgetIndex)
case WIDX_WATER_RIDES:
case WIDX_SHOPS_AND_STALLS:
case WIDX_SCENERY_AND_THEMING:
activeResearchTypes = RCT2_GLOBAL(RCT2_ADDRESS_ACTIVE_RESEARCH_TYPES, uint16);
activeResearchTypes = gResearchPriorities;
activeResearchTypes ^= 1 << (widgetIndex - WIDX_TRANSPORT_RIDES);
research_set_priority(activeResearchTypes);
break;
@@ -464,7 +464,7 @@ static void window_research_funding_mousedown(int widgetIndex, rct_window *w, rc
dropdownWidget->right - dropdownWidget->left - 3
);
int currentResearchLevel = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_RESEARCH_LEVEL, uint8);
int currentResearchLevel = gResearchFundingLevel;
dropdown_set_checked(currentResearchLevel, true);
}
@@ -509,7 +509,7 @@ static void window_research_funding_invalidate(rct_window *w)
window_research_set_pressed_tab(w);
if ((gParkFlags & PARK_FLAGS_NO_MONEY) ||
(RCT2_GLOBAL(RCT2_ADDRESS_RESEARH_PROGRESS_STAGE, uint8) == RESEARCH_STAGE_FINISHED_ALL)) {
(gResearchProgressStage == RESEARCH_STAGE_FINISHED_ALL)) {
//window_research_funding_widgets[WIDX_FUNDING_GROUP].type = WWT_EMPTY;
window_research_funding_widgets[WIDX_RESEARCH_FUNDING].type = WWT_EMPTY;
window_research_funding_widgets[WIDX_RESEARCH_FUNDING_DROPDOWN_BUTTON].type = WWT_EMPTY;
@@ -519,12 +519,12 @@ static void window_research_funding_invalidate(rct_window *w)
window_research_funding_widgets[WIDX_RESEARCH_FUNDING_DROPDOWN_BUTTON].type = WWT_DROPDOWN_BUTTON;
// Current funding
int currentResearchLevel = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_RESEARCH_LEVEL, uint8);
int currentResearchLevel = gResearchFundingLevel;
window_research_funding_widgets[WIDX_RESEARCH_FUNDING].image = STR_NO_FUNDING + currentResearchLevel;
}
// Checkboxes
int activeResearchTypes = RCT2_GLOBAL(RCT2_ADDRESS_ACTIVE_RESEARCH_TYPES, uint16);
uint8 activeResearchTypes = gResearchPriorities;
int uncompletedResearchTypes = gResearchUncompletedCategories;
for (int i = 0; i < 7; i++) {
int mask = 1 << i;
@@ -563,7 +563,7 @@ void window_research_funding_page_paint(rct_window *w, rct_drawpixelinfo *dpi, i
if (gParkFlags & PARK_FLAGS_NO_MONEY)
return;
int currentResearchLevel = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_RESEARCH_LEVEL, uint8);
int currentResearchLevel = gResearchFundingLevel;
money32 currentResearchCostPerWeek = research_cost_table[currentResearchLevel];
gfx_draw_string_left(dpi, STR_RESEARCH_COST_PER_MONTH, &currentResearchCostPerWeek, 0, w->x + 10, w->y + 77);
}

View File

@@ -109,9 +109,16 @@ void park_init()
gParkEntranceFee = MONEY(10, 00);
gPeepSpawns[0].x = UINT16_MAX;
RCT2_GLOBAL(0x013573F8, sint16) = -1;
RCT2_GLOBAL(RCT2_ADDRESS_ACTIVE_RESEARCH_TYPES, uint16) = 127;
RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_RESEARCH_LEVEL, uint8) = 2;
gPeepSpawns[1].x = UINT16_MAX;
gResearchPriorities =
(1 << RESEARCH_CATEGORY_TRANSPORT) |
(1 << RESEARCH_CATEGORY_GENTLE) |
(1 << RESEARCH_CATEGORY_ROLLERCOASTER) |
(1 << RESEARCH_CATEGORY_THRILL) |
(1 << RESEARCH_CATEGORY_WATER) |
(1 << RESEARCH_CATEGORY_SHOP) |
(1 << RESEARCH_CATEGORY_SCENERYSET);
gResearchFundingLevel = RESEARCH_FUNDING_NORMAL;
gGuestInitialCash = MONEY(50,00); // Cash per guest (average)
gGuestInitialHappiness = calculate_guest_initial_happiness(50); // 50%