1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2026-01-04 13:42:55 +01:00

implement finance research tab

This commit is contained in:
IntelOrca
2014-08-12 22:22:16 +01:00
parent 01974a0b9b
commit b13f31f73e
5 changed files with 225 additions and 8 deletions

View File

@@ -172,6 +172,8 @@
//32bit (pixel_offset 24 bit)(pixel_colour 8 bit)
#define RCT2_ADDRESS_RAIN_PIXEL_STORE 0x00EDF850
#define RCT2_ADDRESS_UNCOMPLETED_RESEARCH_TYPES 0x00EE787C
#define RCT2_ADDRESS_MAP_IMAGE_DATA 0x00F1AD68
#define RCT2_ADDRESS_PROVISIONAL_PATH_FLAGS 0x00F3EF92
@@ -247,6 +249,8 @@
#define RCT2_ADDRESS_MECHANIC_COLOUR 0x01357BCE
#define RCT2_ADDRESS_SECURITY_COLOUR 0x01357BCF
#define RCT2_ADDRESS_ACTIVE_RESEARCH_TYPES 0x01357CF2
#define RCT2_ADDRESS_MAP_SIZE 0x01358834
#define RCT2_ADDRESS_PARK_SIZE 0x013580EA

View File

@@ -32,6 +32,7 @@ enum {
RCT_EXPENDITURE_TYPE_INTEREST = 13
};
extern const money32 research_cost_table[4];
void finance_payment(money32 amount, rct_expenditure_type type);
void finance_pay_wages();

View File

@@ -67,10 +67,10 @@ enum GAME_COMMAND {
GAME_COMMAND_42,
GAME_COMMAND_43,
GAME_COMMAND_44,
GAME_COMMAND_SET_CURRENT_LOAN,
GAME_COMMAND_46,
GAME_COMMAND_SET_CURRENT_LOAN, // 45
GAME_COMMAND_SET_RESEARCH_FUNDING, // 46
GAME_COMMAND_47,
GAME_COMMAND_START_MARKETING_CAMPAIGN,
GAME_COMMAND_START_MARKETING_CAMPAIGN, // 48
GAME_COMMAND_49,
GAME_COMMAND_50,
GAME_COMMAND_51,

View File

@@ -503,7 +503,13 @@ enum {
STR_RESEARCH_SHOPS_AND_STALLS = 2258,
STR_RESEARCH_SCENERY_AND_THEMING = 2259,
STR_NO_FUNDING = 2260,
STR_MINIMUM_FUNDING = 2261,
STR_NORMAL_FUNDING = 2262,
STR_MAXIMUM_FUNDING = 2263,
STR_RESEARCH_FUNDING_ = 2264,
STR_RESEARCH_COST_PER_MONTH = 2265,
STR_RESEARCH_PRIORITIES = 2266,
STR_FINANCES_RESEARCH = 2275,

View File

@@ -20,6 +20,7 @@
#include "addresses.h"
#include "date.h"
#include "finance.h"
#include "game.h"
#include "graph.h"
#include "marketing.h"
@@ -29,6 +30,7 @@
#include "sprites.h"
#include "widget.h"
#include "window.h"
#include "window_dropdown.h"
enum {
WINDOW_FINANCES_PAGE_SUMMARY,
@@ -160,10 +162,10 @@ static rct_widget window_finances_marketing_widgets[] = {
};
static rct_widget window_finances_research_widgets[] = {
{ WWT_FRAME, 0, 0, 529, 0, 256, 0xFFFFFFFF, STR_NONE },
{ WWT_CAPTION, 0, 1, 528, 1, 14, STR_RESEARCH_FUNDING, STR_WINDOW_TITLE_TIP },
{ WWT_CLOSEBOX, 0, 517, 527, 2, 13, STR_CLOSE_X, STR_CLOSE_WINDOW_TIP },
{ WWT_RESIZE, 1, 0, 529, 43, 256, 0xFFFFFFFF, STR_NONE },
{ WWT_FRAME, 0, 0, 319, 0, 206, 0xFFFFFFFF, STR_NONE },
{ WWT_CAPTION, 0, 1, 318, 1, 14, STR_RESEARCH_FUNDING, STR_WINDOW_TITLE_TIP },
{ WWT_CLOSEBOX, 0, 307, 317, 2, 13, STR_CLOSE_X, STR_CLOSE_WINDOW_TIP },
{ WWT_RESIZE, 1, 0, 319, 43, 206, 0xFFFFFFFF, STR_NONE },
{ WWT_TAB, 1, 3, 33, 17, 43, 0x2000144E, STR_FINANCES_SHOW_SUMMARY_TAB_TIP },
{ WWT_TAB, 1, 34, 64, 17, 43, 0x2000144E, STR_FINANCES_SHOW_CASH_TAB_TIP },
{ WWT_TAB, 1, 65, 95, 17, 43, 0x2000144E, STR_FINANCES_SHOW_PARK_VALUE_TAB_TIP },
@@ -225,6 +227,13 @@ static void window_finances_marketing_update(rct_window *w);
static void window_finances_marketing_invalidate();
static void window_finances_marketing_paint();
static void window_finances_research_mouseup();
static void window_finances_research_mousedown(int widgetIndex, rct_window*w, rct_widget* widget);
static void window_finances_research_dropdown();
static void window_finances_research_update(rct_window *w);
static void window_finances_research_invalidate();
static void window_finances_research_paint();
// 0x00988EB8
static void* window_finances_summary_events[] = {
window_finances_emptysub,
@@ -385,13 +394,45 @@ static void* window_finances_marketing_events[] = {
window_finances_emptysub
};
// 0x009890E8
static void* window_finances_research_events[] = {
window_finances_emptysub,
window_finances_research_mouseup,
window_finances_emptysub,
window_finances_research_mousedown,
window_finances_research_dropdown,
window_finances_emptysub,
window_finances_research_update,
window_finances_emptysub,
window_finances_emptysub,
window_finances_emptysub,
window_finances_emptysub,
window_finances_emptysub,
window_finances_emptysub,
window_finances_emptysub,
window_finances_emptysub,
window_finances_emptysub,
window_finances_emptysub,
window_finances_emptysub,
window_finances_emptysub,
window_finances_emptysub,
window_finances_emptysub,
window_finances_emptysub,
window_finances_emptysub,
window_finances_emptysub,
window_finances_emptysub,
window_finances_research_invalidate,
window_finances_research_paint,
window_finances_emptysub
};
static void* window_finances_page_events[] = {
window_finances_summary_events,
window_finances_financial_graph_events,
window_finances_value_graph_events,
window_finances_profit_graph_events,
window_finances_marketing_events,
(void*)0x009890E8
window_finances_research_events
};
#pragma endregion
@@ -1255,6 +1296,170 @@ static void window_finances_marketing_paint()
#pragma region Research page
/**
*
* rct2: 0x0069DB3F
*/
static void window_finances_research_mouseup()
{
rct_window * w;
short widgetIndex;
int activeResearchTypes;
window_mouse_up_get_registers(w, widgetIndex);
switch (widgetIndex) {
case WIDX_CLOSE:
window_close(w);
break;
case WIDX_TAB_1:
case WIDX_TAB_2:
case WIDX_TAB_3:
case WIDX_TAB_4:
case WIDX_TAB_5:
case WIDX_TAB_6:
window_finances_set_page(w, widgetIndex - WIDX_TAB_1);
break;
case WIDX_TRANSPORT_RIDES:
case WIDX_GENTLE_RIDES:
case WIDX_ROLLER_COASTERS:
case WIDX_THRILL_RIDES:
case WIDX_WATER_RIDES:
case WIDX_SHOPS_AND_STALLS:
case WIDX_SCENERY_AND_THEMING:
activeResearchTypes = RCT2_GLOBAL(RCT2_ADDRESS_ACTIVE_RESEARCH_TYPES, uint16);
activeResearchTypes ^= 1 << (widgetIndex - WIDX_TRANSPORT_RIDES);
game_do_command(0, (1 << 8) | 1, 0, activeResearchTypes, GAME_COMMAND_SET_RESEARCH_FUNDING, 0, 0);
break;
}
}
/**
*
* rct2: 0x0069DB66
*/
static void window_finances_research_mousedown(int widgetIndex, rct_window *w, rct_widget* widget)
{
rct_widget *dropdownWidget;
int i;
if (widgetIndex != WIDX_RESEARCH_FUNDING_DROPDOWN_BUTTON)
return;
dropdownWidget = widget - 1;
for (i = 0; i < 4; i++) {
gDropdownItemsFormat[i] = 1142;
gDropdownItemsArgs[i] = STR_NO_FUNDING + i;
}
window_dropdown_show_text_custom_width(
w->x + dropdownWidget->left,
w->y + dropdownWidget->top,
dropdownWidget->bottom - dropdownWidget->top + 1,
w->colours[1],
0x80,
4,
dropdownWidget->right - dropdownWidget->left - 3
);
int currentResearchLevel = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_RESEARCH_LEVEL, uint8);
gDropdownItemsChecked = (1 << currentResearchLevel);
}
/**
*
* rct2: 0x0069DB6D
*/
static void window_finances_research_dropdown()
{
rct_window *w;
short widgetIndex;
short dropdownIndex;
window_dropdown_get_registers(w, widgetIndex, dropdownIndex);
if (widgetIndex != WIDX_RESEARCH_FUNDING_DROPDOWN_BUTTON || dropdownIndex == -1)
return;
game_do_command(0, 1, 0, dropdownIndex, GAME_COMMAND_SET_RESEARCH_FUNDING, 0, 0);
}
/**
*
* rct2: 0x0069DC23
*/
static void window_finances_research_update(rct_window *w)
{
// Tab animation
if (++w->frame_no >= window_finances_tab_animation_loops[w->page])
w->frame_no = 0;
widget_invalidate(w->classification, w->number, WIDX_TAB_6);
}
/**
*
* rct2: 0x0069DA64
*/
static void window_finances_research_invalidate()
{
rct_window *w;
window_get_register(w);
if (w->widgets != window_finances_page_widgets[WINDOW_FINANCES_PAGE_RESEARCH]) {
w->widgets = window_finances_page_widgets[WINDOW_FINANCES_PAGE_RESEARCH];
window_init_scroll_widgets(w);
}
window_finances_set_pressed_tab(w);
int currentResearchLevel = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_RESEARCH_LEVEL, uint8);
// 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);
int uncompletedResearchTypes = RCT2_GLOBAL(RCT2_ADDRESS_UNCOMPLETED_RESEARCH_TYPES, uint16);
for (int i = 0; i < 7; i++) {
int mask = 1 << i;
int widgetMask = 1 << (i + WIDX_TRANSPORT_RIDES);
// Set checkbox disabled if research type is complete
if (uncompletedResearchTypes & mask) {
w->disabled_widgets &= ~widgetMask;
// Set checkbox ticked if research type is active
if (activeResearchTypes & mask)
w->pressed_widgets |= widgetMask;
else
w->pressed_widgets &= ~widgetMask;
} else {
w->disabled_widgets |= widgetMask;
w->pressed_widgets &= ~widgetMask;
}
}
}
/**
*
* rct2: 0x0069DAF0
*/
static void window_finances_research_paint()
{
rct_window *w;
rct_drawpixelinfo *dpi;
window_paint_get_registers(w, dpi);
window_draw_widgets(w, dpi);
window_finances_draw_tab_images(dpi, w);
int currentResearchLevel = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_RESEARCH_LEVEL, uint8);
money32 currentResearchCostPerWeek = research_cost_table[currentResearchLevel];
gfx_draw_string_left(dpi, STR_RESEARCH_COST_PER_MONTH, &currentResearchCostPerWeek, 0, w->x + 10, w->y + 77);
}
#pragma endregion
#pragma region Common
@@ -1277,6 +1482,7 @@ static void window_finances_set_page(rct_window *w, int page)
w->event_handlers = window_finances_page_events[page];
w->widgets = window_finances_page_widgets[page];
w->disabled_widgets = 0;
w->pressed_widgets = 0;
window_invalidate(w);
if (w->page == WINDOW_FINANCES_PAGE_RESEARCH) {