OpenRCT2/src/windows/scenery.c

1225 lines
40 KiB
C
Raw Normal View History

#pragma region Copyright (c) 2014-2016 OpenRCT2 Developers
/*****************************************************************************
* OpenRCT2, an open source clone of Roller Coaster Tycoon 2.
*
* OpenRCT2 is the work of many authors, a full list can be found in contributors.md
* For more information, visit https://github.com/OpenRCT2/OpenRCT2
*
* OpenRCT2 is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* A full copy of the GNU General Public License can be found in licence.txt
*****************************************************************************/
#pragma endregion
2014-10-06 18:36:58 +02:00
#include "../audio/audio.h"
#include "../drawing/drawing.h"
#include "../game.h"
#include "../input.h"
2014-10-06 18:36:58 +02:00
#include "../interface/viewport.h"
#include "../interface/widget.h"
#include "../interface/window.h"
#include "../localisation/localisation.h"
#include "../peep/peep.h"
#include "../world/map.h"
#include "../world/scenery.h"
#include "../world/sprite.h"
2014-10-06 18:36:58 +02:00
#include "dropdown.h"
#include "../interface/themes.h"
#include "../network/network.h"
#include "error.h"
#include "../sprites.h"
#define WINDOW_SCENERY_WIDTH 634
#define WINDOW_SCENERY_HEIGHT 142
#define SCENERY_BUTTON_WIDTH 66
#define SCENERY_BUTTON_HEIGHT 80
enum {
WINDOW_SCENERY_TAB_1,
WINDOW_SCENERY_TAB_2,
WINDOW_SCENERY_TAB_3,
WINDOW_SCENERY_TAB_4,
WINDOW_SCENERY_TAB_5,
WINDOW_SCENERY_TAB_6,
WINDOW_SCENERY_TAB_7,
WINDOW_SCENERY_TAB_8,
WINDOW_SCENERY_TAB_9,
WINDOW_SCENERY_TAB_10,
WINDOW_SCENERY_TAB_11,
WINDOW_SCENERY_TAB_12,
WINDOW_SCENERY_TAB_13,
WINDOW_SCENERY_TAB_14,
WINDOW_SCENERY_TAB_15,
WINDOW_SCENERY_TAB_16,
WINDOW_SCENERY_TAB_17,
WINDOW_SCENERY_TAB_18,
WINDOW_SCENERY_TAB_19,
WINDOW_SCENERY_TAB_20
};
static void window_scenery_close(rct_window *w);
static void window_scenery_mouseup(rct_window *w, int widgetIndex);
static void window_scenery_resize(rct_window *w);
2014-09-01 21:55:08 +02:00
static void window_scenery_mousedown(int widgetIndex, rct_window* w, rct_widget* widget);
static void window_scenery_dropdown(rct_window *w, int widgetIndex, int dropdownIndex);
static void window_scenery_update(rct_window *w);
static void window_scenery_event_07(rct_window *w);
static void window_scenery_scrollgetsize(rct_window *w, int scrollIndex, int *width, int *height);
static void window_scenery_scrollmousedown(rct_window *w, int scrollIndex, int x, int y);
static void window_scenery_scrollmouseover(rct_window *w, int scrollIndex, int x, int y);
static void window_scenery_tooltip(rct_window* w, int widgetIndex, rct_string_id *stringId);
static void window_scenery_invalidate(rct_window *w);
static void window_scenery_paint(rct_window *w, rct_drawpixelinfo *dpi);
static void window_scenery_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int scrollIndex);
static rct_window_event_list window_scenery_events = {
window_scenery_close,
window_scenery_mouseup,
window_scenery_resize,
window_scenery_mousedown,
window_scenery_dropdown,
NULL,
window_scenery_update,
window_scenery_event_07,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
window_scenery_scrollgetsize,
window_scenery_scrollmousedown,
NULL,
window_scenery_scrollmouseover,
NULL,
NULL,
NULL,
window_scenery_tooltip,
NULL,
NULL,
window_scenery_invalidate,
window_scenery_paint,
window_scenery_scrollpaint,
};
enum WINDOW_SCENERY_LIST_WIDGET_IDX {
WIDX_SCENERY_BACKGROUND, // 1
WIDX_SCENERY_TITLE, // 2
WIDX_SCENERY_CLOSE, // 4
WIDX_SCENERY_TAB_CONTENT_PANEL, // 8
WIDX_SCENERY_TAB_1, // 10
WIDX_SCENERY_TAB_2, // 20
WIDX_SCENERY_TAB_3, // 40
WIDX_SCENERY_TAB_4, // 80
WIDX_SCENERY_TAB_5, // 100
WIDX_SCENERY_TAB_6, // 200
WIDX_SCENERY_TAB_7, // 400
WIDX_SCENERY_TAB_8, // 800
WIDX_SCENERY_TAB_9, // 1000
WIDX_SCENERY_TAB_10, // 2000
WIDX_SCENERY_TAB_11, // 4000
WIDX_SCENERY_TAB_12, // 8000
WIDX_SCENERY_TAB_13, // 10000
WIDX_SCENERY_TAB_14, // 20000
WIDX_SCENERY_TAB_15, // 40000
WIDX_SCENERY_TAB_16, // 80000
WIDX_SCENERY_TAB_17, // 100000
WIDX_SCENERY_TAB_18, // 200000
WIDX_SCENERY_TAB_19, // 400000
WIDX_SCENERY_TAB_20, // 800000
WIDX_SCENERY_LIST, // 1000000
WIDX_SCENERY_ROTATE_OBJECTS_BUTTON, // 2000000
WIDX_SCENERY_REPAINT_SCENERY_BUTTON, // 4000000
WIDX_SCENERY_PRIMARY_COLOUR_BUTTON, // 8000000
WIDX_SCENERY_SECONDARY_COLOUR_BUTTON, // 10000000
WIDX_SCENERY_TERTIARY_COLOUR_BUTTON, // 20000000
WIDX_SCENERY_BUILD_CLUSTER_BUTTON, // 40000000
};
static rct_widget window_scenery_widgets[] = {
{ WWT_FRAME, 0, 0, 633, 0, 141, 0xFFFFFFFF, STR_NONE }, // 1 0x009DE298
{ WWT_CAPTION, 0, 1, 632, 1, 14, 0xFFFFFFFF, STR_WINDOW_TITLE_TIP }, // 2 0x009DE2A8
{ WWT_CLOSEBOX, 0, 621, 631, 2, 13, STR_CLOSE_X, STR_CLOSE_WINDOW_TIP }, // 4 0x009DE2B8
{ WWT_RESIZE, 1, 0, 633, 43, 141, 0xFFFFFFFF, STR_NONE }, // 8 0x009DE2C8
{ WWT_TAB, 1, 3, 33, 17, 43, 0xFFFFFFFF, STR_STRING_DEFINED_TOOLTIP }, // 10 0x009DE2D8
{ WWT_TAB, 1, 34, 64, 17, 43, 0xFFFFFFFF, STR_STRING_DEFINED_TOOLTIP }, // 20 0x009DE2E8
{ WWT_TAB, 1, 65, 95, 17, 43, 0xFFFFFFFF, STR_STRING_DEFINED_TOOLTIP }, // 40 0x009DE2F8
{ WWT_TAB, 1, 96, 126, 17, 43, 0xFFFFFFFF, STR_STRING_DEFINED_TOOLTIP }, // 80 0x009DE308
{ WWT_TAB, 1, 127, 157, 17, 43, 0xFFFFFFFF, STR_STRING_DEFINED_TOOLTIP }, // 100 0x009DE318
{ WWT_TAB, 1, 158, 188, 17, 43, 0xFFFFFFFF, STR_STRING_DEFINED_TOOLTIP }, // 200 0x009DE328
{ WWT_TAB, 1, 189, 219, 17, 43, 0xFFFFFFFF, STR_STRING_DEFINED_TOOLTIP }, // 400 0x009DE338
{ WWT_TAB, 1, 220, 250, 17, 43, 0xFFFFFFFF, STR_STRING_DEFINED_TOOLTIP }, // 800 0x009DE348
{ WWT_TAB, 1, 251, 281, 17, 43, 0xFFFFFFFF, STR_STRING_DEFINED_TOOLTIP }, // 1000 0x009DE358
{ WWT_TAB, 1, 282, 312, 17, 43, 0xFFFFFFFF, STR_STRING_DEFINED_TOOLTIP }, // 2000 0x009DE368
{ WWT_TAB, 1, 313, 343, 17, 43, 0xFFFFFFFF, STR_STRING_DEFINED_TOOLTIP }, // 4000 0x009DE378
{ WWT_TAB, 1, 344, 374, 17, 43, 0xFFFFFFFF, STR_STRING_DEFINED_TOOLTIP }, // 8000 0x009DE388
{ WWT_TAB, 1, 375, 405, 17, 43, 0xFFFFFFFF, STR_STRING_DEFINED_TOOLTIP }, // 10000 0x009DE398
{ WWT_TAB, 1, 406, 436, 17, 43, 0xFFFFFFFF, STR_STRING_DEFINED_TOOLTIP }, // 20000 0x009DE3A8
{ WWT_TAB, 1, 437, 467, 17, 43, 0xFFFFFFFF, STR_STRING_DEFINED_TOOLTIP }, // 40000 0x009DE3B8
{ WWT_TAB, 1, 468, 498, 17, 43, 0xFFFFFFFF, STR_STRING_DEFINED_TOOLTIP }, // 80000 0x009DE3C8
{ WWT_TAB, 1, 468, 498, 17, 43, 0xFFFFFFFF, STR_STRING_DEFINED_TOOLTIP }, // 100000 0x009DE3D8
{ WWT_TAB, 1, 468, 498, 17, 43, 0xFFFFFFFF, STR_STRING_DEFINED_TOOLTIP }, // 200000 0x009DE3E8
{ WWT_TAB, 1, 468, 498, 17, 43, 0xFFFFFFFF, STR_STRING_DEFINED_TOOLTIP }, // 400000 0x009DE3F8
{ WWT_TAB, 1, 468, 498, 17, 43, 0x20000000 | SPR_TAB_QUESTION, STR_STRING_DEFINED_TOOLTIP }, // 800000 0x009DE408
{ WWT_SCROLL, 1, 2, 608, 47, 126, SCROLL_VERTICAL, STR_NONE }, // 1000000 0x009DE418
{ WWT_FLATBTN, 1, 609, 632, 44, 67, SPR_ROTATE_ARROW, STR_ROTATE_OBJECTS_90 }, // 2000000 0x009DE428
{ WWT_FLATBTN, 1, 609, 632, 68, 91, SPR_PAINTBRUSH, STR_SCENERY_PAINTBRUSH_TIP }, // 4000000 0x009DE438
{ WWT_COLOURBTN, 1, 615, 626, 93, 104, 0xFFFFFFFF, STR_SELECT_COLOUR }, // 8000000 0x009DE448
{ WWT_COLOURBTN, 1, 615, 626, 105, 116, 0xFFFFFFFF, STR_SELECT_SECONDARY_COLOUR }, // 10000000 0x009DE458
{ WWT_COLOURBTN, 1, 615, 626, 117, 128, 0xFFFFFFFF, STR_SELECT_TERNARY_COLOUR }, // 20000000 0x009DE468
{ WWT_FLATBTN, 1, 609, 632, 117, 140, SPR_SCENERY_CLUSTER, STR_SCENERY_CLUSTER_TIP }, // 40000000 0x009DE478
{ WIDGETS_END },
};
// rct2: 0x00F64F2C
sint16 window_scenery_tab_entries[20][SCENERY_ENTRIES_BY_TAB + 1];
void window_scenery_update_scroll(rct_window *w);
/**
* Was part of 0x006DFA00
* The same code repeated five times for every scenery entry type
*/
static void init_scenery_entry(rct_scenery_entry *sceneryEntry, int index, uint8 sceneryTabId)
2016-05-11 20:18:59 +02:00
{
2016-07-09 22:06:54 +02:00
if (scenery_is_invented(index)) {
if (sceneryTabId != 0xFF) {
for (int i = 0; i < SCENERY_ENTRIES_BY_TAB; i++) {
if (window_scenery_tab_entries[sceneryTabId][i] == -1)
{
window_scenery_tab_entries[sceneryTabId][i] = index;
window_scenery_tab_entries[sceneryTabId][i + 1] = -1;
return;
}
}
}
2016-07-09 22:06:54 +02:00
for (int i = 0; i < 19; i++) {
int counter = 0;
while (window_scenery_tab_entries[i][counter] != -1)
{
if (window_scenery_tab_entries[i][counter] == index) {
return;
}
counter++;
}
}
for (int i = 0; i < SCENERY_ENTRIES_BY_TAB; i++) {
2016-07-09 22:06:54 +02:00
if (window_scenery_tab_entries[19][i] == -1)
{
2016-07-09 22:06:54 +02:00
window_scenery_tab_entries[19][i] = index;
window_scenery_tab_entries[19][i + 1] = -1;
break;
}
}
}
}
/**
*
* rct2: 0x006DFA00
*/
void init_scenery()
{
2016-07-09 22:06:54 +02:00
bool enabledScenerySets[20] = { false };
2016-07-09 22:06:54 +02:00
for (int scenerySetIndex = 0; scenerySetIndex < 20; scenerySetIndex++) {
window_scenery_tab_entries[scenerySetIndex][0] = -1;
2016-07-09 22:06:54 +02:00
if (scenerySetIndex == 19)
2014-08-31 21:11:38 +02:00
continue;
rct_scenery_set_entry* scenerySetEntry = get_scenery_group_entry(scenerySetIndex);
2016-07-09 22:06:54 +02:00
if (scenerySetEntry == (rct_scenery_set_entry *)-1)
2014-08-31 21:11:38 +02:00
continue;
int sceneryTabEntryCount = 0;
for (int i = 0; i < scenerySetEntry->entry_count; i++) {
uint16 sceneryEntryId = scenerySetEntry->scenery_entries[i];
2016-07-09 22:06:54 +02:00
if (scenery_is_invented(sceneryEntryId)) {
window_scenery_tab_entries[scenerySetIndex][sceneryTabEntryCount] = sceneryEntryId;
window_scenery_tab_entries[scenerySetIndex][++sceneryTabEntryCount] = -1;
2014-08-31 21:11:38 +02:00
} else {
enabledScenerySets[scenerySetIndex] = true;
}
}
}
2015-10-20 20:16:30 +02:00
// small scenery
for (uint16 sceneryId = 0; sceneryId < 0xFC; sceneryId++) {
2016-07-09 22:06:54 +02:00
if (get_small_scenery_entry(sceneryId) == (rct_scenery_entry *)-1)
continue;
rct_scenery_entry* sceneryEntry = get_small_scenery_entry(sceneryId);
init_scenery_entry(sceneryEntry, sceneryId, sceneryEntry->small_scenery.scenery_tab_id);
}
// large scenery
for (int sceneryId = 0x300; sceneryId < 0x380; sceneryId++) {
int largeSceneryIndex = sceneryId - 0x300;
2016-07-09 22:06:54 +02:00
if (get_large_scenery_entry(largeSceneryIndex) == (rct_scenery_entry *)-1)
continue;
rct_scenery_entry* sceneryEntry = get_large_scenery_entry(largeSceneryIndex);
init_scenery_entry(sceneryEntry, sceneryId, sceneryEntry->large_scenery.scenery_tab_id);
}
// walls
for (int sceneryId = 0x200; sceneryId < 0x280; sceneryId++) {
int wallSceneryIndex = sceneryId - 0x200;
2016-07-09 22:06:54 +02:00
if (get_wall_entry(wallSceneryIndex) == (rct_scenery_entry *)-1)
continue;
rct_scenery_entry* sceneryEntry = get_wall_entry(wallSceneryIndex);
init_scenery_entry(sceneryEntry, sceneryId, sceneryEntry->wall.scenery_tab_id);
}
// banners
for (int sceneryId = 0x400; sceneryId < 0x420; sceneryId++) {
int bannerIndex = sceneryId - 0x400;
2016-07-09 22:06:54 +02:00
if (get_banner_entry(bannerIndex) == (rct_scenery_entry *)-1)
continue;
rct_scenery_entry* sceneryEntry = get_banner_entry(bannerIndex);
init_scenery_entry(sceneryEntry, sceneryId, sceneryEntry->banner.scenery_tab_id);
}
// path bits
for (int sceneryId = 0x100; sceneryId < 0x10F; sceneryId++) {
int pathBitIndex = sceneryId - 0x100;
2016-07-09 22:06:54 +02:00
if (get_footpath_item_entry(pathBitIndex) == (rct_scenery_entry *)-1)
continue;
rct_scenery_entry* sceneryEntry = get_footpath_item_entry(pathBitIndex);
init_scenery_entry(sceneryEntry, sceneryId, sceneryEntry->path_bit.scenery_tab_id);
}
2014-08-31 21:11:38 +02:00
for (int widgetIndex = WIDX_SCENERY_TAB_1; widgetIndex < WIDX_SCENERY_LIST; widgetIndex++)
window_scenery_widgets[widgetIndex].type = WWT_EMPTY;
2014-08-31 21:11:38 +02:00
uint8 tabIndexes[20];
uint8 order[20];
int usedValues = 0;
2014-08-31 21:11:38 +02:00
for (int scenerySetId = 0; scenerySetId < 19; scenerySetId++) {
rct_scenery_set_entry* sceneryEntry = get_scenery_group_entry(scenerySetId);
2016-07-09 22:06:54 +02:00
if (sceneryEntry == (rct_scenery_set_entry *)-1)
2014-08-31 21:11:38 +02:00
continue;
tabIndexes[usedValues] = scenerySetId;
order[usedValues] = sceneryEntry->var_108;
2014-08-31 21:11:38 +02:00
usedValues++;
}
2014-08-31 21:11:38 +02:00
while (true) {
bool finished = true;
for (int i = 1; i < usedValues; i++) {
if (order[i - 1] > order[i]) {
uint8 tmp = tabIndexes[i - 1];
tabIndexes[i - 1] = tabIndexes[i];
tabIndexes[i] = tmp;
tmp = order[i - 1];
order[i - 1] = order[i];
order[i] = tmp;
finished = false;
}
2014-08-31 21:11:38 +02:00
}
if (finished)
break;
2014-08-31 21:11:38 +02:00
}
tabIndexes[usedValues] = 19;
usedValues++;
2014-08-31 21:11:38 +02:00
uint16 left = 3;
for (int i = 0; i < usedValues; i ++) {
uint32 tabIndex = tabIndexes[i];
rct_widget* tabWidget = &window_scenery_widgets[tabIndex + WIDX_SCENERY_TAB_1];
2014-08-31 21:11:38 +02:00
if (left != 3 || tabIndex != 19) {
if (window_scenery_tab_entries[tabIndex][0] == -1)
2014-08-31 21:11:38 +02:00
continue;
if (enabledScenerySets[tabIndex])
2014-08-31 21:11:38 +02:00
continue;
}
tabWidget->type = WWT_TAB;
tabWidget->left = left;
tabWidget->right = left + 0x1E;
left += 0x1F;
2014-08-31 21:11:38 +02:00
if (tabIndex >= 19)
2014-08-31 21:11:38 +02:00
continue;
tabWidget->image = get_scenery_group_entry(tabIndex)->image | 0x20000000;
2014-08-31 21:11:38 +02:00
}
2014-10-16 03:02:43 +02:00
window_invalidate_by_class(WC_SCENERY);
}
/**
*
* rct2: 0x006DFEE4
*/
void scenery_set_default_placement_configuration()
{
2016-05-15 18:16:21 +02:00
gWindowSceneryRotation = 3;
gWindowSceneryPrimaryColour = COLOUR_BORDEAUX_RED;
gWindowScenerySecondaryColour = COLOUR_YELLOW;
gWindowSceneryTertiaryColour = COLOUR_DARK_BROWN;
init_scenery();
for (int i = 0; i < 20; i++)
2016-05-15 18:16:21 +02:00
gWindowSceneryTabSelections[i] = -1;
for (int i = 0; i < 20; i++) {
if (window_scenery_tab_entries[i][0] != -1) {
2016-05-15 18:16:21 +02:00
gWindowSceneryActiveTabIndex = i;
return;
}
}
for (int i = 0; i < 16; i++) {
rct_widget *tabWidget = &window_scenery_widgets[WIDX_SCENERY_TAB_1 + i];
if (tabWidget->type != WWT_EMPTY) {
2016-05-15 18:16:21 +02:00
gWindowSceneryActiveTabIndex = i;
return;
}
}
}
/**
*
* rct2: 0x006E0FEF
*/
void window_scenery_open()
{
rct_window* window;
// Check if window is already open
2014-10-16 03:02:43 +02:00
window = window_bring_to_front_by_class(WC_SCENERY);
if (window != NULL)
return;
init_scenery();
2015-06-13 23:16:14 +02:00
window = window_create(
2016-04-24 01:36:39 +02:00
gScreenWidth - WINDOW_SCENERY_WIDTH,
2015-06-13 23:16:14 +02:00
0x1D,
WINDOW_SCENERY_WIDTH,
WINDOW_SCENERY_HEIGHT,
&window_scenery_events,
2015-06-13 23:16:14 +02:00
WC_SCENERY,
2015-10-03 16:48:25 +02:00
WF_NO_SCROLLING
2015-06-13 23:16:14 +02:00
);
window->widgets = window_scenery_widgets;
window->enabled_widgets =
(1 << WIDX_SCENERY_CLOSE) |
(1 << WIDX_SCENERY_ROTATE_OBJECTS_BUTTON) |
(1 << WIDX_SCENERY_TAB_1) |
(1 << WIDX_SCENERY_TAB_2) |
(1 << WIDX_SCENERY_TAB_3) |
(1 << WIDX_SCENERY_TAB_4) |
(1 << WIDX_SCENERY_TAB_5) |
(1 << WIDX_SCENERY_TAB_6) |
(1 << WIDX_SCENERY_TAB_7) |
(1 << WIDX_SCENERY_TAB_8) |
(1 << WIDX_SCENERY_TAB_9) |
(1 << WIDX_SCENERY_TAB_10) |
(1 << WIDX_SCENERY_TAB_11) |
(1 << WIDX_SCENERY_TAB_12) |
(1 << WIDX_SCENERY_TAB_13) |
(1 << WIDX_SCENERY_TAB_14) |
(1 << WIDX_SCENERY_TAB_15) |
(1 << WIDX_SCENERY_TAB_16) |
(1 << WIDX_SCENERY_TAB_17) |
(1 << WIDX_SCENERY_TAB_18) |
(1 << WIDX_SCENERY_TAB_19) |
(1 << WIDX_SCENERY_TAB_20) |
(1 << WIDX_SCENERY_PRIMARY_COLOUR_BUTTON) |
(1 << WIDX_SCENERY_SECONDARY_COLOUR_BUTTON) |
(1 << WIDX_SCENERY_REPAINT_SCENERY_BUTTON) |
(1 << WIDX_SCENERY_TERTIARY_COLOUR_BUTTON) |
(1 << WIDX_SCENERY_BUILD_CLUSTER_BUTTON);
window_init_scroll_widgets(window);
window_scenery_update_scroll(window);
show_gridlines();
2016-05-15 18:16:21 +02:00
gWindowSceneryRotation = 3;
2016-05-15 18:10:25 +02:00
gSceneryCtrlPressed = false;
gSceneryShiftPressed = false;
window->scenery.selected_scenery_id = -1;
2014-09-06 01:09:12 +02:00
window->scenery.hover_counter = 0;
window_push_others_below(window);
2016-05-15 18:10:25 +02:00
gSceneryGhostType = 0;
gSceneryPlaceCost = MONEY32_UNDEFINED;
gSceneryPlaceRotation = 0;
2016-05-15 18:16:21 +02:00
gWindowSceneryPaintEnabled = 0; // repaint coloured scenery tool state
gWindowSceneryClusterEnabled = 0; // build cluster tool state
window->min_width = WINDOW_SCENERY_WIDTH;
window->max_width = WINDOW_SCENERY_WIDTH;
window->min_height = WINDOW_SCENERY_HEIGHT;
window->max_height = WINDOW_SCENERY_HEIGHT;
2014-08-23 20:17:22 +02:00
}
/**
*
* rct2: 0x0066DB3D
*/
static bool window_scenery_is_scenery_tool_active() {
int toolWindowClassification = gCurrentToolWidget.window_classification;
int toolWidgetIndex = gCurrentToolWidget.widget_index;
2014-08-31 22:21:39 +02:00
2016-01-04 23:53:03 +01:00
if (gInputFlags & INPUT_FLAG_TOOL_ACTIVE)
if (toolWindowClassification == WC_TOP_TOOLBAR && toolWidgetIndex == 9) // 9 is WIDX_SCENERY
2014-08-31 22:21:39 +02:00
return true;
return false;
}
/**
*
* rct2: 0x006E1A73
*/
void window_scenery_close(rct_window *w)
{
scenery_remove_ghost_tool_placement();
hide_gridlines();
viewport_set_visibility(0);
if (window_scenery_is_scenery_tool_active())
2014-08-31 22:21:39 +02:00
tool_cancel();
}
static int count_rows(int items){
int rows = items / 9;
return rows;
}
2016-05-12 23:57:40 +02:00
typedef struct scenery_item {
int allRows;
int selected_item;
sint16 sceneryId;
} scenery_item;
static scenery_item window_scenery_count_rows_with_selected_item(int tabIndex)
{
scenery_item sceneryItem = { 0, 0, -1 };
int totalItems = 0;
sint16 id = 0;
2016-05-15 18:16:21 +02:00
sint16 sceneryId = gWindowSceneryTabSelections[tabIndex];
while ((id = window_scenery_tab_entries[tabIndex][totalItems]) != -1){
if (id == sceneryId){
sceneryItem.selected_item = totalItems;
sceneryItem.sceneryId = sceneryId;
}
totalItems++;
}
sceneryItem.allRows = count_rows(totalItems + 8);
return sceneryItem;
}
static int window_scenery_count_rows()
{
2016-05-15 18:16:21 +02:00
int tabIndex = gWindowSceneryActiveTabIndex;
int totalItems = 0;
while (window_scenery_tab_entries[tabIndex][totalItems] != -1){
totalItems++;
}
int rows = count_rows(totalItems + 8);
return rows;
}
static int window_scenery_rows_height(int rows)
{
return rows * SCENERY_BUTTON_HEIGHT;
}
static int rows_on_page(int height)
{
return height / 90;
}
/**
*
* rct2: 0x006BD94C
*/
static void window_scenery_mouseup(rct_window *w, int widgetIndex)
{
switch (widgetIndex) {
case WIDX_SCENERY_CLOSE:
window_close(w);
break;
case WIDX_SCENERY_ROTATE_OBJECTS_BUTTON:
2016-05-15 18:16:21 +02:00
gWindowSceneryRotation++;
gWindowSceneryRotation = gWindowSceneryRotation % 4;
scenery_remove_ghost_tool_placement();
window_invalidate(w);
break;
case WIDX_SCENERY_REPAINT_SCENERY_BUTTON:
2016-05-15 18:16:21 +02:00
gWindowSceneryPaintEnabled ^= 1;
window_invalidate(w);
break;
case WIDX_SCENERY_BUILD_CLUSTER_BUTTON:
2016-05-15 18:16:21 +02:00
if (gWindowSceneryClusterEnabled == 1) {
gWindowSceneryClusterEnabled = 0;
}
else if (network_get_mode() != NETWORK_MODE_CLIENT || network_can_perform_command(network_get_current_player_group_index(), -2)) {
2016-05-15 18:16:21 +02:00
gWindowSceneryClusterEnabled ^= 1;
}
else {
window_error_open(STR_CANT_DO_THIS, STR_PERMISSION_DENIED);
}
window_invalidate(w);
break;
}
}
/**
*
* rct2: 0x006E1EB4
*/
void window_scenery_update_scroll(rct_window *w)
{
2016-05-15 18:16:21 +02:00
int tabIndex = gWindowSceneryActiveTabIndex;
scenery_item sceneryItem = window_scenery_count_rows_with_selected_item(tabIndex);
w->scrolls[0].v_bottom = window_scenery_rows_height(sceneryItem.allRows) + 1;
int rowsOnPage = rows_on_page(w->height);
int rowSelected = count_rows(sceneryItem.selected_item);
if (sceneryItem.allRows - rowSelected <= rowsOnPage){
rowSelected = sceneryItem.allRows - rowsOnPage;
}
if (sceneryItem.sceneryId == -1) {
rowSelected = 0;
sint16 sceneryId = window_scenery_tab_entries[tabIndex][0];
if (sceneryId != -1)
2016-05-15 18:16:21 +02:00
gWindowSceneryTabSelections[tabIndex] = sceneryId;
}
w->scrolls[0].v_top = window_scenery_rows_height(rowSelected);
widget_scroll_update_thumbs(w, WIDX_SCENERY_LIST);
}
/**
*
* rct2: 0x006E1E48
*/
static void window_scenery_resize(rct_window *w)
{
if (w->width < w->min_width) {
2015-06-17 00:37:29 +02:00
window_invalidate(w);
w->width = w->min_width;
window_invalidate(w);
}
if (w->width > w->max_width) {
2015-06-17 00:37:29 +02:00
window_invalidate(w);
w->width = w->max_width;
window_invalidate(w);
}
if (w->height < w->min_height) {
2015-06-17 00:37:29 +02:00
window_invalidate(w);
w->height = w->min_height;
window_invalidate(w);
2015-03-05 22:27:38 +01:00
// HACK: For some reason invalidate has not been called
window_event_invalidate_call(w);
window_scenery_update_scroll(w);
}
if (w->height > w->max_height) {
2015-06-17 00:37:29 +02:00
window_invalidate(w);
w->height = w->max_height;
window_invalidate(w);
2015-03-05 22:27:38 +01:00
// HACK: For some reason invalidate has not been called
window_event_invalidate_call(w);
window_scenery_update_scroll(w);
}
}
2014-09-01 21:55:08 +02:00
/**
*
* rct2: 0x006E1A25
*/
2014-09-01 21:55:08 +02:00
static void window_scenery_mousedown(int widgetIndex, rct_window* w, rct_widget* widget) {
switch (widgetIndex) {
case WIDX_SCENERY_PRIMARY_COLOUR_BUTTON:
2016-05-15 18:16:21 +02:00
window_dropdown_show_colour(w, widget, w->colours[1], gWindowSceneryPrimaryColour);
2014-09-01 21:55:08 +02:00
break;
case WIDX_SCENERY_SECONDARY_COLOUR_BUTTON:
2016-05-15 18:16:21 +02:00
window_dropdown_show_colour(w, widget, w->colours[1], gWindowScenerySecondaryColour);
break;
case WIDX_SCENERY_TERTIARY_COLOUR_BUTTON:
2016-05-15 18:16:21 +02:00
window_dropdown_show_colour(w, widget, w->colours[1], gWindowSceneryTertiaryColour);
2014-09-01 21:55:08 +02:00
break;
}
if (widgetIndex >= WIDX_SCENERY_TAB_1 && widgetIndex <= WIDX_SCENERY_TAB_20) {
2016-05-15 18:16:21 +02:00
gWindowSceneryActiveTabIndex = widgetIndex - WIDX_SCENERY_TAB_1;
2014-09-01 21:55:08 +02:00
window_invalidate(w);
2016-05-15 18:10:25 +02:00
gSceneryPlaceCost = MONEY32_UNDEFINED;
//HACK: for 3210 Ensures that window_scenery_update_scroll gets called one time
w->max_height = 60;
2014-09-01 21:55:08 +02:00
}
}
/**
*
* rct2: 0x006E1A54
*/
static void window_scenery_dropdown(rct_window *w, int widgetIndex, int dropdownIndex)
{
if (dropdownIndex == -1)
return;
if (widgetIndex == WIDX_SCENERY_PRIMARY_COLOUR_BUTTON) {
2016-05-15 18:16:21 +02:00
gWindowSceneryPrimaryColour = (uint8)dropdownIndex;
}
else if (widgetIndex == WIDX_SCENERY_SECONDARY_COLOUR_BUTTON) {
2016-05-15 18:16:21 +02:00
gWindowScenerySecondaryColour = (uint8)dropdownIndex;
}
else if (widgetIndex == WIDX_SCENERY_TERTIARY_COLOUR_BUTTON) {
2016-05-15 18:16:21 +02:00
gWindowSceneryTertiaryColour = (uint8)dropdownIndex;
}
window_invalidate(w);
}
2014-09-01 20:50:53 +02:00
/**
*
* rct2: 0x006E1B9F
*/
static void window_scenery_event_07(rct_window *w)
{
if (w->scenery.selected_scenery_id != -1) {
w->scenery.selected_scenery_id = -1;
2014-09-01 20:50:53 +02:00
}
}
/**
*
* rct2: 0x006E1CD3
*/
static void window_scenery_update(rct_window *w)
{
rct_window *other = window_find_from_point(gCursorState.x, gCursorState.y);
if (other == w) {
int window_x = gCursorState.x - w->x + 26;
int window_y = gCursorState.y - w->y;
if (window_y < 44 || window_x <= w->width) {
int widgetIndex = window_find_widget_from_point(w, gCursorState.x, gCursorState.y);
if (widgetIndex >= WIDX_SCENERY_TAB_CONTENT_PANEL) {
2014-09-06 01:09:12 +02:00
w->scenery.hover_counter++;
if (w->scenery.hover_counter < 8) {
2016-01-04 23:45:51 +01:00
if (gInputState != INPUT_STATE_SCROLL_LEFT) {
2014-08-31 22:21:39 +02:00
w->min_width = WINDOW_SCENERY_WIDTH;
w->max_width = WINDOW_SCENERY_WIDTH;
w->min_height = WINDOW_SCENERY_HEIGHT;
w->max_height = WINDOW_SCENERY_HEIGHT;
}
} else {
int windowHeight = min(463, w->scrolls[0].v_bottom + 62);
2016-04-24 01:36:39 +02:00
if (gScreenHeight < 600)
windowHeight = min(374, windowHeight);
2014-08-31 22:21:39 +02:00
w->min_width = WINDOW_SCENERY_WIDTH;
w->max_width = WINDOW_SCENERY_WIDTH;
w->min_height = windowHeight;
w->max_height = windowHeight;
}
}
}
} else {
2014-09-06 01:09:12 +02:00
w->scenery.hover_counter = 0;
2016-01-04 23:45:51 +01:00
if (gInputState != INPUT_STATE_SCROLL_LEFT) {
2014-08-31 22:21:39 +02:00
w->min_width = WINDOW_SCENERY_WIDTH;
w->max_width = WINDOW_SCENERY_WIDTH;
w->min_height = WINDOW_SCENERY_HEIGHT;
w->max_height = WINDOW_SCENERY_HEIGHT;
}
}
2015-06-17 00:37:29 +02:00
window_invalidate(w);
2015-10-20 20:16:30 +02:00
if (!window_scenery_is_scenery_tool_active()){
window_close(w);
return;
}
2016-05-15 18:16:21 +02:00
if (gWindowSceneryPaintEnabled == 1) { // the repaint scenery tool is active
gCurrentToolId = 0x17;
} else {
2016-05-15 18:16:21 +02:00
uint16 tabIndex = gWindowSceneryActiveTabIndex;
sint16 tabSelectedSceneryId = gWindowSceneryTabSelections[tabIndex];
if (tabSelectedSceneryId != -1) {
if (tabSelectedSceneryId >= 0x400) { // banner
gCurrentToolId = 0x18;
} else if (tabSelectedSceneryId >= 0x300) { // large scenery
gCurrentToolId = get_large_scenery_entry(tabSelectedSceneryId - 0x300)->large_scenery.tool_id;
} else if (tabSelectedSceneryId >= 0x200) { // wall
gCurrentToolId = get_wall_entry(tabSelectedSceneryId - 0x200)->wall.tool_id;
} else if (tabSelectedSceneryId >= 0x100) { // path bit
gCurrentToolId = get_footpath_item_entry(tabSelectedSceneryId - 0x100)->path_bit.tool_id;
} else { // small scenery
gCurrentToolId = get_small_scenery_entry(tabSelectedSceneryId)->small_scenery.tool_id;
}
}
2014-08-31 22:21:39 +02:00
}
}
/**
*
* rct2: 0x006E1A91
*/
void window_scenery_scrollgetsize(rct_window *w, int scrollIndex, int *width, int *height)
{
int rows = window_scenery_count_rows();
*height = window_scenery_rows_height(rows);
}
static short get_scenery_id_by_cursor_pos(short x, short y)
{
int tabSceneryIndex = x / SCENERY_BUTTON_WIDTH + (y / SCENERY_BUTTON_HEIGHT) * 9;
2016-05-15 18:16:21 +02:00
uint8 tabIndex = gWindowSceneryActiveTabIndex;
int itemCounter = 0;
sint16 sceneryId = 0;
while (itemCounter <= tabSceneryIndex) {
sceneryId = window_scenery_tab_entries[tabIndex][itemCounter];
if (sceneryId == -1)
return -1;
itemCounter++;
}
return sceneryId;
}
/**
*
* rct2: 0x006E1C4A
*/
void window_scenery_scrollmousedown(rct_window *w, int scrollIndex, int x, int y)
{
short sceneryId = get_scenery_id_by_cursor_pos(x, y);
2014-09-03 21:13:42 +02:00
if (sceneryId == -1)
return;
2016-05-15 18:16:21 +02:00
uint8 tabIndex = gWindowSceneryActiveTabIndex;
gWindowSceneryTabSelections[tabIndex] = sceneryId;
2016-05-15 18:16:21 +02:00
gWindowSceneryPaintEnabled &= 0xFE;
2015-11-18 00:05:24 +01:00
audio_play_sound_panned(4, (w->width >> 1) + w->x, 0, 0, 0);
2014-09-06 01:09:12 +02:00
w->scenery.hover_counter = -16;
2016-05-15 18:10:25 +02:00
gSceneryPlaceCost = MONEY32_UNDEFINED;
window_invalidate(w);
}
/**
*
* rct2: 0x006E1BB8
*/
void window_scenery_scrollmouseover(rct_window *w, int scrollIndex, int x, int y)
{
short sceneryId = get_scenery_id_by_cursor_pos(x, y);
if (sceneryId != -1) {
w->scenery.selected_scenery_id = sceneryId;
window_invalidate(w);
}
}
2014-08-23 20:17:22 +02:00
/**
*
* rct2: 0x006E1C05
*/
void window_scenery_tooltip(rct_window* w, int widgetIndex, rct_string_id *stringId)
{
switch (widgetIndex) {
case WIDX_SCENERY_LIST:
set_format_arg(0, uint16, STR_LIST);
break;
case WIDX_SCENERY_TAB_1:
case WIDX_SCENERY_TAB_2:
case WIDX_SCENERY_TAB_3:
case WIDX_SCENERY_TAB_4:
case WIDX_SCENERY_TAB_5:
case WIDX_SCENERY_TAB_6:
case WIDX_SCENERY_TAB_7:
case WIDX_SCENERY_TAB_8:
case WIDX_SCENERY_TAB_9:
case WIDX_SCENERY_TAB_10:
case WIDX_SCENERY_TAB_11:
case WIDX_SCENERY_TAB_12:
case WIDX_SCENERY_TAB_13:
case WIDX_SCENERY_TAB_14:
case WIDX_SCENERY_TAB_15:
case WIDX_SCENERY_TAB_16:
case WIDX_SCENERY_TAB_17:
case WIDX_SCENERY_TAB_18:
case WIDX_SCENERY_TAB_19:
set_format_arg(0, rct_string_id, get_scenery_group_entry(widgetIndex - WIDX_SCENERY_TAB_1)->name);
break;
case WIDX_SCENERY_TAB_20:
set_format_arg(0, rct_string_id, STR_MISCELLANEOUS);
break;
}
2014-08-23 20:17:22 +02:00
}
/**
*
* rct2: 0x006E118B
*/
void window_scenery_invalidate(rct_window *w)
{
colour_scheme_update(w);
2016-05-15 18:16:21 +02:00
uint16 tabIndex = gWindowSceneryActiveTabIndex;
uint32 titleStringId = STR_MISCELLANEOUS;
2015-05-20 02:10:53 +02:00
if (tabIndex < 19)
titleStringId = get_scenery_group_entry(tabIndex)->name;
2015-10-20 20:16:30 +02:00
window_scenery_widgets[WIDX_SCENERY_TITLE].text = titleStringId;
2014-09-06 01:09:12 +02:00
w->pressed_widgets = (((uint32)w->pressed_widgets & 0xFF00000F) | (1 << (tabIndex + 4))) & 0xBBFFFFFF;
2016-05-15 18:16:21 +02:00
if (gWindowSceneryPaintEnabled == 1)
w->pressed_widgets |= (1 << WIDX_SCENERY_REPAINT_SCENERY_BUTTON);
2016-05-15 18:16:21 +02:00
if (gWindowSceneryClusterEnabled == 1)
w->pressed_widgets |= (1 << WIDX_SCENERY_BUILD_CLUSTER_BUTTON);
2015-10-20 20:16:30 +02:00
window_scenery_widgets[WIDX_SCENERY_ROTATE_OBJECTS_BUTTON].type = WWT_EMPTY;
window_scenery_widgets[WIDX_SCENERY_BUILD_CLUSTER_BUTTON].type = WWT_EMPTY;
2015-10-20 20:16:30 +02:00
2016-05-15 18:16:21 +02:00
sint16 tabSelectedSceneryId = gWindowSceneryTabSelections[tabIndex];
2014-09-06 01:09:12 +02:00
if (tabSelectedSceneryId != -1) {
if (tabSelectedSceneryId < 0x100) {
2016-05-15 18:16:21 +02:00
if (!(gWindowSceneryPaintEnabled & 1))
window_scenery_widgets[WIDX_SCENERY_BUILD_CLUSTER_BUTTON].type = WWT_FLATBTN;
rct_scenery_entry* sceneryEntry = get_small_scenery_entry(tabSelectedSceneryId);
if (sceneryEntry->small_scenery.flags & SMALL_SCENERY_FLAG4) {
window_scenery_widgets[WIDX_SCENERY_ROTATE_OBJECTS_BUTTON].type = WWT_FLATBTN;
}
}
else if (tabSelectedSceneryId >= 0x300) {
window_scenery_widgets[WIDX_SCENERY_ROTATE_OBJECTS_BUTTON].type = WWT_FLATBTN;
}
}
window_scenery_widgets[WIDX_SCENERY_PRIMARY_COLOUR_BUTTON].image =
(gWindowSceneryPrimaryColour << 19) | 0x60000000 | SPR_PALETTE_BTN;
window_scenery_widgets[WIDX_SCENERY_SECONDARY_COLOUR_BUTTON].image =
(gWindowScenerySecondaryColour << 19) | 0x60000000 | SPR_PALETTE_BTN;
window_scenery_widgets[WIDX_SCENERY_TERTIARY_COLOUR_BUTTON].image =
(gWindowSceneryTertiaryColour << 19) | 0x60000000 | SPR_PALETTE_BTN;
window_scenery_widgets[WIDX_SCENERY_PRIMARY_COLOUR_BUTTON].type = WWT_EMPTY;
window_scenery_widgets[WIDX_SCENERY_SECONDARY_COLOUR_BUTTON].type = WWT_EMPTY;
window_scenery_widgets[WIDX_SCENERY_TERTIARY_COLOUR_BUTTON].type = WWT_EMPTY;
2015-10-20 20:16:30 +02:00
2016-05-15 18:16:21 +02:00
if (gWindowSceneryPaintEnabled & 1) { // repaint coloured scenery tool is on
window_scenery_widgets[WIDX_SCENERY_PRIMARY_COLOUR_BUTTON].type = WWT_COLOURBTN;
window_scenery_widgets[WIDX_SCENERY_SECONDARY_COLOUR_BUTTON].type = WWT_COLOURBTN;
window_scenery_widgets[WIDX_SCENERY_TERTIARY_COLOUR_BUTTON].type = WWT_COLOURBTN;
window_scenery_widgets[WIDX_SCENERY_ROTATE_OBJECTS_BUTTON].type = WWT_EMPTY;
} else if (tabSelectedSceneryId != -1) {
rct_scenery_entry* sceneryEntry = NULL;
2014-09-06 01:09:12 +02:00
if (tabSelectedSceneryId >= 0x400) {
sceneryEntry = get_banner_entry(tabSelectedSceneryId - 0x400);
2015-10-20 20:16:30 +02:00
if (sceneryEntry->banner.flags & 1)
window_scenery_widgets[WIDX_SCENERY_PRIMARY_COLOUR_BUTTON].type = WWT_COLOURBTN;
} else if (tabSelectedSceneryId >= 0x300) {
sceneryEntry = get_large_scenery_entry(tabSelectedSceneryId - 0x300);
if (sceneryEntry->large_scenery.flags & 1)
window_scenery_widgets[WIDX_SCENERY_PRIMARY_COLOUR_BUTTON].type = WWT_COLOURBTN;
if (sceneryEntry->large_scenery.flags & 2)
window_scenery_widgets[WIDX_SCENERY_SECONDARY_COLOUR_BUTTON].type = WWT_COLOURBTN;
} else if (tabSelectedSceneryId >= 0x200) {
sceneryEntry = get_wall_entry(tabSelectedSceneryId - 0x200);
if (sceneryEntry->wall.flags & (WALL_SCENERY_FLAG1 | WALL_SCENERY_FLAG2)) {
window_scenery_widgets[WIDX_SCENERY_PRIMARY_COLOUR_BUTTON].type = WWT_COLOURBTN;
if (sceneryEntry->wall.flags & WALL_SCENERY_HAS_SECONDARY_COLOUR) {
window_scenery_widgets[WIDX_SCENERY_SECONDARY_COLOUR_BUTTON].type = WWT_COLOURBTN;
if (sceneryEntry->wall.flags2 & WALL_SCENERY_FLAG1)
window_scenery_widgets[WIDX_SCENERY_PRIMARY_COLOUR_BUTTON].type = WWT_EMPTY;
if (sceneryEntry->wall.flags & WALL_SCENERY_HAS_TERNARY_COLOUR)
window_scenery_widgets[WIDX_SCENERY_TERTIARY_COLOUR_BUTTON].type = WWT_COLOURBTN;
}
}
} else if (tabSelectedSceneryId < 0x100) {
sceneryEntry = get_small_scenery_entry(tabSelectedSceneryId);
2014-09-03 21:13:42 +02:00
2016-07-02 12:35:46 +02:00
if (sceneryEntry->small_scenery.flags & (SMALL_SCENERY_FLAG_HAS_PRIMARY_COLOUR | SMALL_SCENERY_FLAG_HAS_GLASS)) {
window_scenery_widgets[WIDX_SCENERY_PRIMARY_COLOUR_BUTTON].type = WWT_COLOURBTN;
if (sceneryEntry->small_scenery.flags & SMALL_SCENERY_FLAG_HAS_SECONDARY_COLOUR)
window_scenery_widgets[WIDX_SCENERY_SECONDARY_COLOUR_BUTTON].type = WWT_COLOURBTN;
}
}
}
window_scenery_widgets[WIDX_SCENERY_BACKGROUND].right = w->width - 1;
window_scenery_widgets[WIDX_SCENERY_BACKGROUND].bottom = w->height - 1;
window_scenery_widgets[WIDX_SCENERY_TAB_CONTENT_PANEL].right = w->width - 1;
window_scenery_widgets[WIDX_SCENERY_TAB_CONTENT_PANEL].bottom = w->height - 1;
window_scenery_widgets[WIDX_SCENERY_TITLE].right = w->width - 2;
window_scenery_widgets[WIDX_SCENERY_CLOSE].left = w->width - 13;
window_scenery_widgets[WIDX_SCENERY_CLOSE].right = window_scenery_widgets[WIDX_SCENERY_CLOSE].left + 10;
window_scenery_widgets[WIDX_SCENERY_LIST].right = w->width - 26;
window_scenery_widgets[WIDX_SCENERY_LIST].bottom = w->height - 14;
window_scenery_widgets[WIDX_SCENERY_ROTATE_OBJECTS_BUTTON].left = w->width - 25;
window_scenery_widgets[WIDX_SCENERY_REPAINT_SCENERY_BUTTON].left = w->width - 25;
window_scenery_widgets[WIDX_SCENERY_BUILD_CLUSTER_BUTTON].left = w->width - 25;
window_scenery_widgets[WIDX_SCENERY_ROTATE_OBJECTS_BUTTON].right = w->width - 2;
window_scenery_widgets[WIDX_SCENERY_REPAINT_SCENERY_BUTTON].right = w->width - 2;
window_scenery_widgets[WIDX_SCENERY_BUILD_CLUSTER_BUTTON].right = w->width - 2;
window_scenery_widgets[WIDX_SCENERY_PRIMARY_COLOUR_BUTTON].left = w->width - 19;
window_scenery_widgets[WIDX_SCENERY_SECONDARY_COLOUR_BUTTON].left = w->width - 19;
window_scenery_widgets[WIDX_SCENERY_TERTIARY_COLOUR_BUTTON].left = w->width - 19;
window_scenery_widgets[WIDX_SCENERY_PRIMARY_COLOUR_BUTTON].right = w->width - 8;
window_scenery_widgets[WIDX_SCENERY_SECONDARY_COLOUR_BUTTON].right = w->width - 8;
window_scenery_widgets[WIDX_SCENERY_TERTIARY_COLOUR_BUTTON].right = w->width - 8;
2014-08-23 20:17:22 +02:00
}
/**
*
* rct2: 0x006E1462
*/
void window_scenery_paint(rct_window *w, rct_drawpixelinfo *dpi)
{
2014-08-23 20:17:22 +02:00
window_draw_widgets(w, dpi);
2016-05-15 18:16:21 +02:00
uint16 tabIndex = gWindowSceneryActiveTabIndex;
2014-09-06 01:09:12 +02:00
uint16 selectedWidgetId = tabIndex + 4;
uint32 imageId = ((w->colours[1] << 19) | window_scenery_widgets[selectedWidgetId].image) + 1ul;
2015-10-20 20:16:30 +02:00
2014-09-06 01:09:12 +02:00
gfx_draw_sprite(dpi, imageId,
w->x + window_scenery_widgets[selectedWidgetId].left,
w->y + window_scenery_widgets[selectedWidgetId].top,
selectedWidgetId);
2015-10-20 20:16:30 +02:00
sint16 selectedSceneryEntryId = w->scenery.selected_scenery_id;
if (selectedSceneryEntryId == -1) {
2016-05-15 18:16:21 +02:00
if (gWindowSceneryPaintEnabled & 1) // repaint coloured scenery tool is on
return;
2016-05-15 18:16:21 +02:00
selectedSceneryEntryId = gWindowSceneryTabSelections[tabIndex];
if (selectedSceneryEntryId == -1)
return;
}
uint32 price = 0;
rct_scenery_entry* sceneryEntry = NULL;
if (selectedSceneryEntryId >= 0x400) {
sceneryEntry = get_banner_entry(selectedSceneryEntryId - 0x400);
price = sceneryEntry->banner.price;
} else if (selectedSceneryEntryId >= 0x300) {
sceneryEntry = get_large_scenery_entry(selectedSceneryEntryId - 0x300);
price = sceneryEntry->large_scenery.price * 10;
} else if (selectedSceneryEntryId >= 0x200) {
sceneryEntry = get_wall_entry(selectedSceneryEntryId - 0x200);
price = sceneryEntry->wall.price;
} else if (selectedSceneryEntryId >= 0x100) {
sceneryEntry = get_footpath_item_entry(selectedSceneryEntryId - 0x100);
price = sceneryEntry->path_bit.price;
} else {
sceneryEntry = get_small_scenery_entry(selectedSceneryEntryId);
price = sceneryEntry->small_scenery.price * 10;
}
2016-05-15 18:10:25 +02:00
if (w->scenery.selected_scenery_id == -1 && gSceneryPlaceCost != MONEY32_UNDEFINED) {
price = gSceneryPlaceCost;
}
2016-05-15 23:03:53 +02:00
set_format_arg(0, uint32, price);
2014-08-23 20:17:22 +02:00
2016-04-23 01:51:22 +02:00
if (!(gParkFlags & PARK_FLAGS_NO_MONEY)) {
// -14
2016-11-13 18:20:30 +01:00
gfx_draw_string_right(dpi, STR_COST_LABEL, gCommonFormatArgs, COLOUR_BLACK,
w->x + w->width - 0x1A, w->y + w->height - 13);
}
2014-08-23 20:17:22 +02:00
set_format_arg(0, rct_string_id, sceneryEntry->name);
2016-11-13 18:20:30 +01:00
gfx_draw_string_left_clipped(dpi, STR_BLACK_STRING, gCommonFormatArgs, COLOUR_BLACK,
w->x + 3, w->y + w->height - 13, w->width - 19);
2014-09-03 21:13:42 +02:00
}
/**
*
* rct2: 0x006E15ED
*/
void window_scenery_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int scrollIndex)
2014-09-03 21:13:42 +02:00
{
2015-11-08 19:55:32 +01:00
gfx_clear(dpi, ColourMapA[w->colours[1]].mid_light * 0x1010101);
2014-09-03 21:13:42 +02:00
2016-05-15 18:16:21 +02:00
uint8 tabIndex = gWindowSceneryActiveTabIndex;
2014-09-03 21:13:42 +02:00
int sceneryTabItemIndex = 0;
sint16 currentSceneryGlobalId = -1;
sint16 left = 0, top = 0;
2015-10-20 20:16:30 +02:00
while ((currentSceneryGlobalId = window_scenery_tab_entries[tabIndex][sceneryTabItemIndex]) != -1) {
2016-05-15 18:16:21 +02:00
uint16 tabSelectedSceneryId = gWindowSceneryTabSelections[tabIndex];
2015-10-20 20:16:30 +02:00
2016-05-15 18:16:21 +02:00
if (gWindowSceneryPaintEnabled == 1)
2014-09-03 21:13:42 +02:00
{
if (w->scenery.selected_scenery_id == currentSceneryGlobalId) {
gfx_fill_rect_inset(dpi, left, top, left + SCENERY_BUTTON_WIDTH - 1,
2016-11-10 18:54:33 +01:00
top + SCENERY_BUTTON_HEIGHT - 1, w->colours[1], INSET_RECT_FLAG_FILL_MID_LIGHT);
2014-09-03 21:13:42 +02:00
}
} else {
2014-09-06 01:09:12 +02:00
if (tabSelectedSceneryId == currentSceneryGlobalId) {
gfx_fill_rect_inset(dpi, left, top, left + SCENERY_BUTTON_WIDTH - 1,
2016-11-10 18:54:33 +01:00
top + SCENERY_BUTTON_HEIGHT - 1, w->colours[1], (INSET_RECT_FLAG_BORDER_INSET | INSET_RECT_FLAG_FILL_MID_LIGHT));
2014-09-03 21:13:42 +02:00
}
else if (w->scenery.selected_scenery_id == currentSceneryGlobalId) {
gfx_fill_rect_inset(dpi, left, top, left + SCENERY_BUTTON_WIDTH - 1,
2016-11-10 18:54:33 +01:00
top + SCENERY_BUTTON_HEIGHT - 1, w->colours[1], INSET_RECT_FLAG_FILL_MID_LIGHT);
2014-09-03 21:13:42 +02:00
}
}
rct_scenery_entry* sceneryEntry;
if (currentSceneryGlobalId >= 0x400) {
sceneryEntry = get_banner_entry(currentSceneryGlobalId - 0x400);
2016-05-15 18:16:21 +02:00
uint32 imageId = sceneryEntry->image + gWindowSceneryRotation * 2;
imageId |= (gWindowSceneryPrimaryColour << 19) | 0x20000000;
2014-09-03 21:13:42 +02:00
gfx_draw_sprite(dpi, imageId, left + 0x21, top + 0x28, w->colours[1]);
gfx_draw_sprite(dpi, imageId + 1, left + 0x21, top + 0x28, w->colours[1]);
} else if (currentSceneryGlobalId >= 0x300) {
sceneryEntry = get_large_scenery_entry(currentSceneryGlobalId - 0x300);
2016-05-15 18:16:21 +02:00
uint32 imageId = sceneryEntry->image + gWindowSceneryRotation;
imageId |= (gWindowSceneryPrimaryColour << 19) | 0x20000000;
imageId |= (gWindowScenerySecondaryColour << 24) | 0x80000000;
2014-09-03 21:13:42 +02:00
gfx_draw_sprite(dpi, imageId, left + 0x21, top, w->colours[1]);
} else if (currentSceneryGlobalId >= 0x200) {
sceneryEntry = get_wall_entry(currentSceneryGlobalId - 0x200);
rct_drawpixelinfo clipdpi;
if (clip_drawpixelinfo(&clipdpi, dpi, left + 1, top + 1, 64, 78)) {
2014-09-03 21:13:42 +02:00
uint32 imageId = sceneryEntry->image;
uint8 tertiaryColour = w->colours[1];
if (sceneryEntry->wall.flags & WALL_SCENERY_FLAG2) {
2016-05-15 18:16:21 +02:00
imageId |= (gWindowSceneryPrimaryColour << 19) | 0x20000000;
2014-09-03 21:13:42 +02:00
if (sceneryEntry->wall.flags & WALL_SCENERY_HAS_SECONDARY_COLOUR) {
2016-05-15 18:16:21 +02:00
imageId |= (gWindowScenerySecondaryColour << 24) | 0x80000000;
2014-09-03 21:13:42 +02:00
}
gfx_draw_sprite(&clipdpi, imageId, 0x2F, (sceneryEntry->wall.height * 2) + 0x32,
tertiaryColour);
2016-11-09 23:40:13 +01:00
imageId = (sceneryEntry->image + 0x40000006) | (GlassPaletteIds[gWindowSceneryPrimaryColour] << 19);
gfx_draw_sprite(&clipdpi, imageId, 0x2F, (sceneryEntry->wall.height * 2) + 0x32,
tertiaryColour);
2014-09-03 21:13:42 +02:00
}
else {
2016-05-15 18:16:21 +02:00
imageId |= (gWindowSceneryPrimaryColour << 19) | 0x20000000;
2014-09-03 21:13:42 +02:00
if (sceneryEntry->wall.flags & WALL_SCENERY_HAS_SECONDARY_COLOUR) {
2016-05-15 18:16:21 +02:00
imageId |= (gWindowScenerySecondaryColour << 24) | 0x80000000;
2014-09-03 21:13:42 +02:00
if (sceneryEntry->wall.flags & WALL_SCENERY_HAS_TERNARY_COLOUR) {
imageId &= 0xDFFFFFFF;
2016-05-15 18:16:21 +02:00
tertiaryColour = gWindowSceneryTertiaryColour;
2014-09-03 21:13:42 +02:00
}
2015-10-20 20:16:30 +02:00
}
gfx_draw_sprite(&clipdpi, imageId, 0x2F, (sceneryEntry->wall.height * 2) + 0x32,
tertiaryColour);
2016-05-13 13:20:36 +02:00
if (sceneryEntry->wall.flags & WALL_SCENERY_IS_DOOR){
gfx_draw_sprite(&clipdpi, imageId + 1, 0x2F, (sceneryEntry->wall.height * 2) + 0x32,
tertiaryColour);
2014-09-03 21:13:42 +02:00
}
}
}
} else if (currentSceneryGlobalId >= 0x100) {
sceneryEntry = get_footpath_item_entry(currentSceneryGlobalId - 0x100);
2014-09-03 21:13:42 +02:00
uint32 imageId = sceneryEntry->image;
gfx_draw_sprite(dpi, imageId, left + 0x0B, top + 0x10, w->colours[1]);
} else {
sceneryEntry = get_small_scenery_entry(currentSceneryGlobalId);
rct_drawpixelinfo clipdpi;
if (clip_drawpixelinfo(&clipdpi, dpi, left + 1, top + 1, SCENERY_BUTTON_WIDTH - 2, SCENERY_BUTTON_HEIGHT - 2)) {
2016-05-15 18:16:21 +02:00
uint32 imageId = sceneryEntry->image + gWindowSceneryRotation;
2014-09-03 21:13:42 +02:00
if (sceneryEntry->small_scenery.flags & SMALL_SCENERY_FLAG_HAS_PRIMARY_COLOUR) {
2016-05-15 18:16:21 +02:00
imageId |= (gWindowSceneryPrimaryColour << 19) | 0x20000000;
2014-09-03 21:13:42 +02:00
if (sceneryEntry->small_scenery.flags & SMALL_SCENERY_FLAG_HAS_SECONDARY_COLOUR) {
2016-05-15 18:16:21 +02:00
imageId |= (gWindowScenerySecondaryColour << 24) | 0x80000000;
2014-09-03 21:13:42 +02:00
}
}
uint16 spriteTop = (sceneryEntry->small_scenery.height / 4) + 0x2B;
if (sceneryEntry->small_scenery.flags & SMALL_SCENERY_FLAG_FULL_TILE &&
sceneryEntry->small_scenery.flags & SMALL_SCENERY_FLAG_VOFFSET_CENTRE) {
2014-09-03 21:13:42 +02:00
spriteTop -= 0x0C;
}
gfx_draw_sprite(&clipdpi, imageId, 0x20, spriteTop, w->colours[1]);
2014-09-03 21:13:42 +02:00
if (sceneryEntry->small_scenery.flags & SMALL_SCENERY_FLAG_HAS_GLASS) {
2016-05-15 18:16:21 +02:00
imageId = ((sceneryEntry->image + gWindowSceneryRotation) + 0x40000004) +
2016-11-09 23:40:13 +01:00
(GlassPaletteIds[gWindowSceneryPrimaryColour] << 19);
2014-09-03 21:13:42 +02:00
gfx_draw_sprite(&clipdpi, imageId, 0x20, spriteTop, w->colours[1]);
2014-09-03 21:13:42 +02:00
}
2016-07-02 12:35:46 +02:00
if (sceneryEntry->small_scenery.flags & SMALL_SCENERY_FLAG_ANIMATED_FG) {
2016-05-15 18:16:21 +02:00
imageId = (sceneryEntry->image + gWindowSceneryRotation) + 4;
gfx_draw_sprite(&clipdpi, imageId, 0x20, spriteTop, w->colours[1]);
2014-09-03 21:13:42 +02:00
}
}
}
2015-10-20 20:16:30 +02:00
left += SCENERY_BUTTON_WIDTH;
2014-09-03 21:13:42 +02:00
if (left >= 594) {
top += SCENERY_BUTTON_HEIGHT;
2014-09-03 21:13:42 +02:00
left = 0;
}
sceneryTabItemIndex++;
}
}