2015-06-01 03:33:56 +02:00
|
|
|
/*****************************************************************************
|
2018-06-15 14:07:34 +02:00
|
|
|
* Copyright (c) 2014-2018 OpenRCT2 developers
|
2016-05-04 19:24:41 +02:00
|
|
|
*
|
2018-06-15 14:07:34 +02:00
|
|
|
* For a complete list of all authors, please refer to contributors.md
|
|
|
|
* Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2
|
2016-05-04 19:24:41 +02:00
|
|
|
*
|
2018-06-15 14:07:34 +02:00
|
|
|
* OpenRCT2 is licensed under the GNU General Public License version 3.
|
2016-05-04 19:24:41 +02:00
|
|
|
*****************************************************************************/
|
2015-06-01 03:33:56 +02:00
|
|
|
|
2018-08-12 13:50:40 +02:00
|
|
|
#include <algorithm>
|
2018-06-22 23:21:44 +02:00
|
|
|
#include <openrct2-ui/interface/Dropdown.h>
|
|
|
|
#include <openrct2-ui/interface/Widget.h>
|
2017-11-23 00:42:12 +01:00
|
|
|
#include <openrct2-ui/windows/Window.h>
|
2018-06-22 23:21:44 +02:00
|
|
|
#include <openrct2/Game.h>
|
|
|
|
#include <openrct2/Input.h>
|
2017-11-23 00:42:12 +01:00
|
|
|
#include <openrct2/common.h>
|
|
|
|
#include <openrct2/core/Guard.hpp>
|
|
|
|
#include <openrct2/core/Util.hpp>
|
2018-01-06 18:32:25 +01:00
|
|
|
#include <openrct2/localisation/Localisation.h>
|
|
|
|
#include <openrct2/localisation/StringIds.h>
|
2018-01-10 00:00:09 +01:00
|
|
|
#include <openrct2/ride/RideData.h>
|
2017-11-23 00:42:12 +01:00
|
|
|
#include <openrct2/ride/Track.h>
|
|
|
|
#include <openrct2/sprites.h>
|
|
|
|
#include <openrct2/windows/tile_inspector.h>
|
2018-06-22 23:21:44 +02:00
|
|
|
#include <openrct2/world/Banner.h>
|
2018-01-11 10:59:26 +01:00
|
|
|
#include <openrct2/world/Footpath.h>
|
2017-11-23 00:42:12 +01:00
|
|
|
#include <openrct2/world/LargeScenery.h>
|
2018-06-22 23:21:44 +02:00
|
|
|
#include <openrct2/world/Park.h>
|
2018-01-11 10:59:26 +01:00
|
|
|
#include <openrct2/world/Scenery.h>
|
2017-12-04 20:09:38 +01:00
|
|
|
#include <openrct2/world/SmallScenery.h>
|
2018-05-01 16:33:16 +02:00
|
|
|
#include <openrct2/world/Surface.h>
|
2017-11-23 00:42:12 +01:00
|
|
|
#include <openrct2/world/TileInspector.h>
|
2015-06-01 03:33:56 +02:00
|
|
|
|
2018-05-16 20:41:29 +02:00
|
|
|
// clang-format off
|
2018-01-11 14:50:31 +01:00
|
|
|
static constexpr const rct_string_id TerrainTypeStringIds[] = {
|
2017-06-06 23:24:18 +02:00
|
|
|
STR_TILE_INSPECTOR_TERRAIN_GRASS,
|
|
|
|
STR_TILE_INSPECTOR_TERRAIN_SAND,
|
|
|
|
STR_TILE_INSPECTOR_TERRAIN_DIRT,
|
|
|
|
STR_TILE_INSPECTOR_TERRAIN_ROCK,
|
|
|
|
STR_TILE_INSPECTOR_TERRAIN_MARTIAN,
|
|
|
|
STR_TILE_INSPECTOR_TERRAIN_CHECKERBOARD,
|
|
|
|
STR_TILE_INSPECTOR_TERRAIN_GRASS_CLUMPS,
|
|
|
|
STR_TILE_INSPECTOR_TERRAIN_ICE,
|
|
|
|
STR_TILE_INSPECTOR_TERRAIN_GRID_RED,
|
|
|
|
STR_TILE_INSPECTOR_TERRAIN_GRID_YELLOW,
|
|
|
|
STR_TILE_INSPECTOR_TERRAIN_GRID_BLUE,
|
|
|
|
STR_TILE_INSPECTOR_TERRAIN_GRID_GREEN,
|
|
|
|
STR_TILE_INSPECTOR_TERRAIN_SAND_DARK,
|
|
|
|
STR_TILE_INSPECTOR_TERRAIN_SAND_LIGHT,
|
|
|
|
STR_TILE_INSPECTOR_TERRAIN_CHECKERBOARD_INVERTED,
|
|
|
|
STR_TILE_INSPECTOR_TERRAIN_UNDERGROUND_VIEW,
|
2016-07-14 14:07:49 +02:00
|
|
|
};
|
|
|
|
|
2018-01-11 14:50:31 +01:00
|
|
|
static constexpr const rct_string_id TerrainEdgeTypeStringIds[] = {
|
2017-06-06 23:24:18 +02:00
|
|
|
STR_TILE_INSPECTOR_TERRAIN_EDGE_ROCK,
|
|
|
|
STR_TILE_INSPECTOR_TERRAIN_EDGE_WOOD_RED,
|
|
|
|
STR_TILE_INSPECTOR_TERRAIN_EDGE_WOOD_BLACK,
|
|
|
|
STR_TILE_INSPECTOR_TERRAIN_EDGE_ICE,
|
2017-11-14 15:53:07 +01:00
|
|
|
STR_TILE_INSPECTOR_TERRAIN_EDGE_BRICK,
|
|
|
|
STR_TILE_INSPECTOR_TERRAIN_EDGE_IRON,
|
|
|
|
STR_TILE_INSPECTOR_TERRAIN_EDGE_GREY,
|
|
|
|
STR_TILE_INSPECTOR_TERRAIN_EDGE_YELLOW,
|
|
|
|
STR_TILE_INSPECTOR_TERRAIN_EDGE_RED,
|
|
|
|
STR_TILE_INSPECTOR_TERRAIN_EDGE_PURPLE,
|
|
|
|
STR_TILE_INSPECTOR_TERRAIN_EDGE_GREEN,
|
|
|
|
STR_TILE_INSPECTOR_TERRAIN_EDGE_STONE_BROWN,
|
|
|
|
STR_TILE_INSPECTOR_TERRAIN_EDGE_STONE_GREY,
|
|
|
|
STR_TILE_INSPECTOR_TERRAIN_EDGE_SKYSCRAPER_A,
|
|
|
|
STR_TILE_INSPECTOR_TERRAIN_EDGE_SKYSCRAPER_B,
|
2016-07-14 14:07:49 +02:00
|
|
|
};
|
|
|
|
|
2018-01-11 14:50:31 +01:00
|
|
|
static constexpr const rct_string_id EntranceTypeStringIds[] = {
|
2017-06-06 23:24:18 +02:00
|
|
|
STR_TILE_INSPECTOR_ENTRANCE_TYPE_RIDE_ENTRANCE,
|
|
|
|
STR_TILE_INSPECTOR_ENTRANCE_TYPE_RIDE_EXIT,
|
|
|
|
STR_TILE_INSPECTOR_ENTRANCE_TYPE_PARK_ENTRANC,
|
2016-07-14 14:07:49 +02:00
|
|
|
};
|
|
|
|
|
2018-01-11 14:50:31 +01:00
|
|
|
static constexpr const rct_string_id ParkEntrancePartStringIds[] = {
|
2017-06-06 23:24:18 +02:00
|
|
|
STR_TILE_INSPECTOR_ENTRANCE_MIDDLE,
|
|
|
|
STR_TILE_INSPECTOR_ENTRANCE_LEFT,
|
|
|
|
STR_TILE_INSPECTOR_ENTRANCE_RIGHT
|
2016-09-18 23:59:23 +02:00
|
|
|
};
|
|
|
|
|
2018-01-11 14:50:31 +01:00
|
|
|
static constexpr const rct_string_id WallSlopeStringIds[] = {
|
2017-06-06 23:24:18 +02:00
|
|
|
STR_TILE_INSPECTOR_WALL_FLAT,
|
|
|
|
STR_TILE_INSPECTOR_WALL_SLOPED_LEFT,
|
|
|
|
STR_TILE_INSPECTOR_WALL_SLOPED_RIGHT
|
2016-10-01 22:57:09 +02:00
|
|
|
};
|
|
|
|
|
2015-06-01 03:33:56 +02:00
|
|
|
enum WINDOW_TILE_INSPECTOR_WIDGET_IDX {
|
2017-06-06 23:24:18 +02:00
|
|
|
WIDX_BACKGROUND,
|
|
|
|
WIDX_TITLE,
|
|
|
|
WIDX_CLOSE,
|
|
|
|
WIDX_LIST,
|
|
|
|
WIDX_SPINNER_X,
|
|
|
|
WIDX_SPINNER_X_INCREASE,
|
|
|
|
WIDX_SPINNER_X_DECREASE,
|
|
|
|
WIDX_SPINNER_Y,
|
|
|
|
WIDX_SPINNER_Y_INCREASE,
|
|
|
|
WIDX_SPINNER_Y_DECREASE,
|
|
|
|
WIDX_BUTTON_CORRUPT,
|
|
|
|
WIDX_BUTTON_REMOVE,
|
|
|
|
WIDX_BUTTON_MOVE_DOWN,
|
|
|
|
WIDX_BUTTON_MOVE_UP,
|
|
|
|
WIDX_BUTTON_ROTATE,
|
|
|
|
WIDX_BUTTON_SORT,
|
|
|
|
WIDX_BUTTON_COPY,
|
|
|
|
WIDX_BUTTON_PASTE,
|
|
|
|
WIDX_COLUMN_TYPE,
|
|
|
|
WIDX_COLUMN_BASEHEIGHT,
|
|
|
|
WIDX_COLUMN_CLEARANCEHEIGHT,
|
|
|
|
WIDX_COLUMN_GHOSTFLAG,
|
|
|
|
WIDX_COLUMN_BROKENFLAG,
|
|
|
|
WIDX_COLUMN_LASTFLAG,
|
|
|
|
WIDX_GROUPBOX_DETAILS,
|
|
|
|
WIDX_GROUPBOX_PROPERTIES,
|
|
|
|
|
|
|
|
PAGE_WIDGETS,
|
|
|
|
|
|
|
|
// Surface
|
|
|
|
WIDX_SURFACE_SPINNER_HEIGHT = PAGE_WIDGETS,
|
|
|
|
WIDX_SURFACE_SPINNER_HEIGHT_INCREASE,
|
|
|
|
WIDX_SURFACE_SPINNER_HEIGHT_DECREASE,
|
|
|
|
WIDX_SURFACE_BUTTON_REMOVE_FENCES,
|
|
|
|
WIDX_SURFACE_BUTTON_RESTORE_FENCES,
|
|
|
|
WIDX_SURFACE_CHECK_CORNER_N,
|
|
|
|
WIDX_SURFACE_CHECK_CORNER_E,
|
|
|
|
WIDX_SURFACE_CHECK_CORNER_S,
|
|
|
|
WIDX_SURFACE_CHECK_CORNER_W,
|
|
|
|
WIDX_SURFACE_CHECK_DIAGONAL,
|
|
|
|
|
|
|
|
// Path
|
|
|
|
WIDX_PATH_SPINNER_HEIGHT = PAGE_WIDGETS,
|
|
|
|
WIDX_PATH_SPINNER_HEIGHT_INCREASE,
|
|
|
|
WIDX_PATH_SPINNER_HEIGHT_DECREASE,
|
|
|
|
WIDX_PATH_CHECK_SLOPED,
|
|
|
|
WIDX_PATH_CHECK_EDGE_NE, // Note: This is NOT named after the world orientation, but after the way
|
|
|
|
WIDX_PATH_CHECK_EDGE_E, // it looks in the window (top corner is north). Their order is important,
|
|
|
|
WIDX_PATH_CHECK_EDGE_SE, // as this is the same order paths use for their corners / edges.
|
|
|
|
WIDX_PATH_CHECK_EDGE_S, // N
|
|
|
|
WIDX_PATH_CHECK_EDGE_SW, // NW-------NE
|
|
|
|
WIDX_PATH_CHECK_EDGE_W, // W ------------- E
|
|
|
|
WIDX_PATH_CHECK_EDGE_NW, // SW-------SE
|
|
|
|
WIDX_PATH_CHECK_EDGE_N, // S
|
|
|
|
|
|
|
|
// Track
|
|
|
|
WIDX_TRACK_CHECK_APPLY_TO_ALL = PAGE_WIDGETS,
|
|
|
|
WIDX_TRACK_SPINNER_HEIGHT,
|
|
|
|
WIDX_TRACK_SPINNER_HEIGHT_INCREASE,
|
|
|
|
WIDX_TRACK_SPINNER_HEIGHT_DECREASE,
|
|
|
|
WIDX_TRACK_CHECK_CHAIN_LIFT,
|
|
|
|
|
|
|
|
// Scenery
|
|
|
|
WIDX_SCENERY_SPINNER_HEIGHT = PAGE_WIDGETS,
|
|
|
|
WIDX_SCENERY_SPINNER_HEIGHT_INCREASE,
|
|
|
|
WIDX_SCENERY_SPINNER_HEIGHT_DECREASE,
|
|
|
|
WIDX_SCENERY_CHECK_QUARTER_N,
|
|
|
|
WIDX_SCENERY_CHECK_QUARTER_E,
|
|
|
|
WIDX_SCENERY_CHECK_QUARTER_S,
|
|
|
|
WIDX_SCENERY_CHECK_QUARTER_W,
|
|
|
|
WIDX_SCENERY_CHECK_COLLISION_N,
|
|
|
|
WIDX_SCENERY_CHECK_COLLISION_E,
|
|
|
|
WIDX_SCENERY_CHECK_COLLISION_S,
|
|
|
|
WIDX_SCENERY_CHECK_COLLISION_W,
|
|
|
|
|
|
|
|
// Entrance
|
|
|
|
WIDX_ENTRANCE_SPINNER_HEIGHT = PAGE_WIDGETS,
|
|
|
|
WIDX_ENTRANCE_SPINNER_HEIGHT_INCREASE,
|
|
|
|
WIDX_ENTRANCE_SPINNER_HEIGHT_DECREASE,
|
2018-01-13 15:44:10 +01:00
|
|
|
WIDX_ENTRANCE_BUTTON_MAKE_USABLE,
|
2017-06-06 23:24:18 +02:00
|
|
|
|
|
|
|
// Wall
|
|
|
|
WIDX_WALL_SPINNER_HEIGHT = PAGE_WIDGETS,
|
|
|
|
WIDX_WALL_SPINNER_HEIGHT_INCREASE,
|
|
|
|
WIDX_WALL_SPINNER_HEIGHT_DECREASE,
|
|
|
|
WIDX_WALL_DROPDOWN_SLOPE,
|
|
|
|
WIDX_WALL_DROPDOWN_SLOPE_BUTTON,
|
|
|
|
|
|
|
|
// Large
|
|
|
|
WIDX_LARGE_SCENERY_SPINNER_HEIGHT = PAGE_WIDGETS,
|
|
|
|
WIDX_LARGE_SCENERY_SPINNER_HEIGHT_INCREASE,
|
|
|
|
WIDX_LARGE_SCENERY_SPINNER_HEIGHT_DECREASE,
|
|
|
|
|
|
|
|
// Banner
|
|
|
|
WIDX_BANNER_SPINNER_HEIGHT = PAGE_WIDGETS,
|
|
|
|
WIDX_BANNER_SPINNER_HEIGHT_INCREASE,
|
|
|
|
WIDX_BANNER_SPINNER_HEIGHT_DECREASE,
|
|
|
|
WIDX_BANNER_CHECK_BLOCK_NE,
|
|
|
|
WIDX_BANNER_CHECK_BLOCK_SE,
|
|
|
|
WIDX_BANNER_CHECK_BLOCK_SW,
|
|
|
|
WIDX_BANNER_CHECK_BLOCK_NW,
|
|
|
|
|
|
|
|
// Corrupt
|
|
|
|
WIDX_CORRUPT_SPINNER_HEIGHT = PAGE_WIDGETS,
|
|
|
|
WIDX_CORRUPT_SPINNER_HEIGHT_INCREASE,
|
|
|
|
WIDX_CORRUPT_SPINNER_HEIGHT_DECREASE,
|
|
|
|
WIDX_CORRUPT_BUTTON_CLAMP,
|
2015-06-01 03:33:56 +02:00
|
|
|
};
|
|
|
|
|
2016-10-01 23:23:47 +02:00
|
|
|
// Window sizes
|
2016-01-01 19:29:41 +01:00
|
|
|
#define WW 400
|
2018-05-21 14:09:18 +02:00
|
|
|
#define WH 170
|
2015-12-28 23:11:36 +01:00
|
|
|
#define MIN_WW WW
|
2016-01-01 19:29:41 +01:00
|
|
|
#define MAX_WW WW
|
2018-05-21 14:09:18 +02:00
|
|
|
#define MIN_WH 130
|
2015-06-01 03:33:56 +02:00
|
|
|
#define MAX_WH 800
|
|
|
|
|
2016-10-01 23:23:47 +02:00
|
|
|
// Button space for top buttons
|
2017-06-06 23:24:18 +02:00
|
|
|
#define BW (WW - 5) // Button's right side
|
|
|
|
#define BX (BW - 23) // Button's left side
|
|
|
|
#define BY 17 // Button's Top
|
|
|
|
#define BH (BY + 23) // Button's Bottom
|
2016-01-01 19:29:41 +01:00
|
|
|
#define BS 24
|
2015-12-28 23:11:36 +01:00
|
|
|
|
2016-05-30 00:35:50 +02:00
|
|
|
// Column offsets for the table headers
|
2017-06-06 23:24:18 +02:00
|
|
|
#define COL_X_TYPE 3 // Type
|
|
|
|
#define COL_X_BH (COL_X_TYPE + 300) // Base height
|
|
|
|
#define COL_X_CH (COL_X_BH + 20) // Clearance height
|
|
|
|
#define COL_X_GF (COL_X_CH + 20) // Ghost flag
|
|
|
|
#define COL_X_BF (COL_X_GF + 12) // Broken flag
|
|
|
|
#define COL_X_LF (COL_X_BF + 12) // Last for tile flag
|
2015-12-29 23:19:01 +01:00
|
|
|
|
2016-10-01 23:23:47 +02:00
|
|
|
#define PADDING_BOTTOM 15
|
|
|
|
#define GROUPBOX_PADDING 6
|
|
|
|
#define HORIZONTAL_GROUPBOX_PADDING 5
|
|
|
|
#define VERTICAL_GROUPBOX_PADDING 4
|
|
|
|
#define BUTTONW 130
|
|
|
|
#define BUTTONH 17
|
|
|
|
|
|
|
|
// Calculates the .left, .right, .top and .bottom for buttons in a group box.
|
|
|
|
// Buttons are used as reference points for all other widgets in the group boxes.
|
2017-06-06 23:24:18 +02:00
|
|
|
#define GBBL(col) (12 + col * (BUTTONW + HORIZONTAL_GROUPBOX_PADDING))
|
|
|
|
#define GBBR(col) (GBBL(col) + BUTTONW)
|
|
|
|
#define GBBT(GROUPTOP, row) ((GROUPTOP) + 14 + row * (BUTTONH + VERTICAL_GROUPBOX_PADDING))
|
|
|
|
#define GBBB(GROUPTOP, row) (GBBT((GROUPTOP), row) + BUTTONH)
|
|
|
|
#define GBB(GROUPTOP, col, row) GBBL(col), GBBR(col), GBBT((GROUPTOP), row), GBBB((GROUPTOP), row)
|
2016-10-01 23:23:47 +02:00
|
|
|
#define GBBF(GROUPTOP, col, row)GBBL(col), WW - 10, GBBT((GROUPTOP), row), GBBB((GROUPTOP), row) // Full width
|
|
|
|
|
2018-05-31 23:35:59 +02:00
|
|
|
// Dropdowns use the buttons as a reference
|
|
|
|
#define GBD(GBT, col, row) GBBL(col), GBBR(col), GBBT(GBT, row) + 3, GBBB(GBT, row) - 3 // Group box dropdown field
|
2017-06-06 23:24:18 +02:00
|
|
|
#define GBDB(GBT, col, row) GBBR(col) - 11, GBBR(col) - 1, GBBT(GBT, row) + 4, GBBB(GBT, row) - 4 // Group box dropdown button
|
2016-10-01 23:23:47 +02:00
|
|
|
|
|
|
|
// Checkbox - given topleft corner
|
|
|
|
#define CHK(x, y) x, x + 13, y + 2, y + 15
|
|
|
|
|
2016-05-29 16:12:53 +02:00
|
|
|
#define MAIN_TILE_INSPECTOR_WIDGETS \
|
2017-06-06 23:24:18 +02:00
|
|
|
{ WWT_FRAME, 0, 0, WW - 1, 0, WH - 1, 0xFFFFFFFF, STR_NONE }, /* panel / background */ \
|
|
|
|
{ WWT_CAPTION, 0, 1, WW - 2, 1, 14, STR_TILE_INSPECTOR_TITLE, STR_WINDOW_TITLE_TIP }, /* title bar */ \
|
|
|
|
{ WWT_CLOSEBOX, 0, WW - 13, WW - 3, 2, 13, STR_CLOSE_X, STR_CLOSE_WINDOW_TIP }, /* close x button */ \
|
|
|
|
{ WWT_SCROLL, 1, 3, WW - 4, 57, WH - PADDING_BOTTOM, 2, STR_NONE }, /* Element list */ \
|
2018-06-10 21:31:08 +02:00
|
|
|
SPINNER_WIDGETS (1, 20, 70, 23, 34, STR_NONE, STR_NONE), /* Spinner X (3 widgets) */ \
|
|
|
|
SPINNER_WIDGETS (1, 90, 140, 23, 34, STR_NONE, STR_NONE), /* Spinner Y (3 widgets) */ \
|
2017-06-06 23:24:18 +02:00
|
|
|
/* Buttons */ \
|
|
|
|
{ WWT_FLATBTN, 1, BX, BW, BY, BH, SPR_MAP, STR_INSERT_CORRUPT_TIP }, /* Insert corrupt button */ \
|
|
|
|
{ WWT_FLATBTN, 1, BX - BS * 1, BW - BS * 1, BY, BH, SPR_DEMOLISH, STR_REMOVE_SELECTED_ELEMENT_TIP }, /* Remove button */ \
|
2018-01-04 16:17:12 +01:00
|
|
|
{ WWT_BUTTON, 1, BX - BS * 2, BW - BS * 2, BY, BY + 11, STR_UP, STR_MOVE_SELECTED_ELEMENT_UP_TIP }, /* Move down */ \
|
|
|
|
{ WWT_BUTTON, 1, BX - BS * 2, BW - BS * 2, BH - 11, BH, STR_DOWN, STR_MOVE_SELECTED_ELEMENT_DOWN_TIP }, /* Move up */ \
|
2017-06-06 23:24:18 +02:00
|
|
|
{ WWT_FLATBTN, 1, BX - BS * 3, BW - BS * 3, BY, BH, SPR_ROTATE_ARROW, STR_ROTATE_SELECTED_ELEMENT_TIP }, /* Rotate button */ \
|
|
|
|
{ WWT_FLATBTN, 1, BX - BS * 4, BW - BS * 4, BY, BH, SPR_G2_SORT, STR_TILE_INSPECTOR_SORT_TIP }, /* Sort button */ \
|
|
|
|
{ WWT_FLATBTN, 1, BX - BS * 5, BW - BS * 5, BY, BH, SPR_G2_COPY, STR_TILE_INSPECTOR_COPY_TIP }, /* Copy button */ \
|
|
|
|
{ WWT_FLATBTN, 1, BX - BS * 6, BW - BS * 6, BY, BH, SPR_G2_PASTE, STR_TILE_INSPECTOR_PASTE_TIP }, /* Paste button */ \
|
|
|
|
/* Column headers */ \
|
2018-01-03 19:12:44 +01:00
|
|
|
{ WWT_TABLE_HEADER, 1, COL_X_TYPE, COL_X_BH - 1, 42, 42 + 13, STR_NONE, STR_NONE }, /* Type */ \
|
|
|
|
{ WWT_TABLE_HEADER, 1, COL_X_BH, COL_X_CH - 1, 42, 42 + 13, STR_NONE, STR_TILE_INSPECTOR_BASE_HEIGHT }, /* Base height */ \
|
|
|
|
{ WWT_TABLE_HEADER, 1, COL_X_CH, COL_X_GF - 1, 42, 42 + 13, STR_NONE, STR_TILE_INSPECTOR_CLEARANCE_HEIGHT }, /* Clearance height */ \
|
|
|
|
{ WWT_TABLE_HEADER, 1, COL_X_GF, COL_X_BF - 1, 42, 42 + 13, STR_NONE, STR_TILE_INSPECTOR_FLAG_GHOST }, /* Ghost flag */ \
|
|
|
|
{ WWT_TABLE_HEADER, 1, COL_X_BF, COL_X_LF - 1, 42, 42 + 13, STR_NONE, STR_TILE_INSPECTOR_FLAG_BROKEN }, /* Broken flag */ \
|
|
|
|
{ WWT_TABLE_HEADER, 1, COL_X_LF, WW - 3, 42, 42 + 13, STR_NONE, STR_TILE_INSPECTOR_FLAG_LAST }, /* Last of tile flag */ \
|
2017-06-06 23:24:18 +02:00
|
|
|
{ WWT_GROUPBOX, 1, 6, WW - 6, -1, -1, STR_NONE, STR_NONE }, /* Details group box */ \
|
|
|
|
{ WWT_GROUPBOX, 1, 6, WW - 6, -1, -1, STR_TILE_INSPECTOR_GROUPBOX_PROPERTIES, STR_NONE } /* Properties group box */
|
2016-05-29 16:12:53 +02:00
|
|
|
|
2017-02-07 22:23:56 +01:00
|
|
|
static rct_widget DefaultWidgets[] = {
|
2017-06-06 23:24:18 +02:00
|
|
|
MAIN_TILE_INSPECTOR_WIDGETS,
|
|
|
|
{ WIDGETS_END },
|
2016-05-29 16:12:53 +02:00
|
|
|
};
|
|
|
|
|
2016-05-31 20:13:26 +02:00
|
|
|
// Group boxes .top and .bottom for a given window height offsets from the bottom
|
2017-06-06 23:24:18 +02:00
|
|
|
#define SUR_GBPB PADDING_BOTTOM // Surface group box properties bottom
|
|
|
|
#define SUR_GBPT (SUR_GBPB + 16 + 4 * 21) // Surface group box properties top
|
|
|
|
#define SUR_GBDB (SUR_GBPT + GROUPBOX_PADDING) // Surface group box details bottom
|
|
|
|
#define SUR_GBDT (SUR_GBDB + 20 + 4 * 11) // Surface group box details top
|
2017-02-07 22:23:56 +01:00
|
|
|
static rct_widget SurfaceWidgets[] = {
|
2017-06-06 23:24:18 +02:00
|
|
|
MAIN_TILE_INSPECTOR_WIDGETS,
|
2018-06-10 21:31:08 +02:00
|
|
|
SPINNER_WIDGETS (1, GBBL(1), GBBR(1), GBBT(WH - SUR_GBPT, 0) + 3, GBBB(WH - SUR_GBPT, 0) - 3, STR_NONE, STR_NONE), // WIDX_SURFACE_SPINNER_HEIGHT{,_INCREASE,_DECREASE}
|
2018-01-04 16:17:12 +01:00
|
|
|
{ WWT_BUTTON, 1, GBB(WH - SUR_GBPT, 0, 1), STR_TILE_INSPECTOR_SURFACE_REMOVE_FENCES, STR_NONE }, // WIDX_SURFACE_BUTTON_REMOVE_FENCES
|
|
|
|
{ WWT_BUTTON, 1, GBB(WH - SUR_GBPT, 1, 1), STR_TILE_INSPECTOR_SURFACE_RESTORE_FENCES, STR_NONE }, // WIDX_SURFACE_BUTTON_RESTORE_FENCES
|
2017-06-06 23:24:18 +02:00
|
|
|
{ WWT_CHECKBOX, 1, CHK(GBBL(1) + 14 * 1, GBBT(WH - SUR_GBPT, 2) + 7 * 0), STR_NONE, STR_NONE }, // WIDX_SURFACE_CHECK_CORNER_N
|
|
|
|
{ WWT_CHECKBOX, 1, CHK(GBBL(1) + 14 * 2, GBBT(WH - SUR_GBPT, 2) + 7 * 1), STR_NONE, STR_NONE }, // WIDX_SURFACE_CHECK_CORNER_E
|
|
|
|
{ WWT_CHECKBOX, 1, CHK(GBBL(1) + 14 * 1, GBBT(WH - SUR_GBPT, 2) + 7 * 2), STR_NONE, STR_NONE }, // WIDX_SURFACE_CHECK_CORNER_S
|
|
|
|
{ WWT_CHECKBOX, 1, CHK(GBBL(1) + 14 * 0, GBBT(WH - SUR_GBPT, 2) + 7 * 1), STR_NONE, STR_NONE }, // WIDX_SURFACE_CHECK_CORNER_W
|
|
|
|
{ WWT_CHECKBOX, 1, GBBF(WH - SUR_GBPT, 0, 4), STR_TILE_INSPECTOR_SURFACE_DIAGONAL, STR_NONE }, // WIDX_SURFACE_CHECK_DIAGONAL
|
|
|
|
{ WIDGETS_END },
|
2016-05-29 16:12:53 +02:00
|
|
|
};
|
|
|
|
|
2017-06-06 23:24:18 +02:00
|
|
|
#define PAT_GBPB PADDING_BOTTOM // Path group box properties bottom
|
|
|
|
#define PAT_GBPT (PAT_GBPB + 16 + 4 * 21) // Path group box properties top
|
|
|
|
#define PAT_GBDB (PAT_GBPT + GROUPBOX_PADDING) // Path group box info bottom
|
|
|
|
#define PAT_GBDT (PAT_GBDB + 20 + 2 * 11) // Path group box info top
|
2017-02-07 22:23:56 +01:00
|
|
|
static rct_widget PathWidgets[] = {
|
2017-06-06 23:24:18 +02:00
|
|
|
MAIN_TILE_INSPECTOR_WIDGETS,
|
2018-06-10 21:31:08 +02:00
|
|
|
SPINNER_WIDGETS (1, GBBL(1), GBBR(1), GBBT(WH - PAT_GBPT, 0) + 3, GBBB(WH - PAT_GBPT, 0) - 3, STR_NONE, STR_NONE), // WIDX_PATH_SPINNER_HEIGHT{,_INCREASE,_DECREASE}
|
2017-06-06 23:24:18 +02:00
|
|
|
{ WWT_CHECKBOX, 1, GBBF(WH - PAT_GBPT, 0, 1), STR_TILE_INSPECTOR_PATH_SLOPED, STR_NONE }, // WIDX_PATH_CHECK_SLOPED
|
|
|
|
{ WWT_CHECKBOX, 1, CHK(GBBL(1) + 14 * 3, GBBT(WH - PAT_GBPT, 2) + 7 * 1), STR_NONE, STR_NONE }, // WIDX_PATH_CHECK_EDGE_NE
|
|
|
|
{ WWT_CHECKBOX, 1, CHK(GBBL(1) + 14 * 4, GBBT(WH - PAT_GBPT, 2) + 7 * 2), STR_NONE, STR_NONE }, // WIDX_PATH_CHECK_EDGE_E
|
|
|
|
{ WWT_CHECKBOX, 1, CHK(GBBL(1) + 14 * 3, GBBT(WH - PAT_GBPT, 2) + 7 * 3), STR_NONE, STR_NONE }, // WIDX_PATH_CHECK_EDGE_SE
|
|
|
|
{ WWT_CHECKBOX, 1, CHK(GBBL(1) + 14 * 2, GBBT(WH - PAT_GBPT, 2) + 7 * 4), STR_NONE, STR_NONE }, // WIDX_PATH_CHECK_EDGE_S
|
|
|
|
{ WWT_CHECKBOX, 1, CHK(GBBL(1) + 14 * 1, GBBT(WH - PAT_GBPT, 2) + 7 * 3), STR_NONE, STR_NONE }, // WIDX_PATH_CHECK_EDGE_SW
|
|
|
|
{ WWT_CHECKBOX, 1, CHK(GBBL(1) + 14 * 0, GBBT(WH - PAT_GBPT, 2) + 7 * 2), STR_NONE, STR_NONE }, // WIDX_PATH_CHECK_EDGE_W
|
|
|
|
{ WWT_CHECKBOX, 1, CHK(GBBL(1) + 14 * 1, GBBT(WH - PAT_GBPT, 2) + 7 * 1), STR_NONE, STR_NONE }, // WIDX_PATH_CHECK_EDGE_NW
|
|
|
|
{ WWT_CHECKBOX, 1, CHK(GBBL(1) + 14 * 2, GBBT(WH - PAT_GBPT, 2) + 7 * 0), STR_NONE, STR_NONE }, // WIDX_PATH_CHECK_EDGE_N
|
|
|
|
{ WIDGETS_END },
|
2016-05-29 16:12:53 +02:00
|
|
|
};
|
|
|
|
|
2017-06-06 23:24:18 +02:00
|
|
|
#define TRA_GBPB PADDING_BOTTOM // Track group box properties bottom
|
|
|
|
#define TRA_GBPT (TRA_GBPB + 16 + 3 * 21) // Track group box properties top
|
|
|
|
#define TRA_GBDB (TRA_GBPT + GROUPBOX_PADDING) // Track group box info bottom
|
|
|
|
#define TRA_GBDT (TRA_GBDB + 20 + 5 * 11) // Track group box info top
|
2017-02-07 22:23:56 +01:00
|
|
|
static rct_widget TrackWidgets[] = {
|
2017-06-06 23:24:18 +02:00
|
|
|
MAIN_TILE_INSPECTOR_WIDGETS,
|
|
|
|
{ WWT_CHECKBOX, 1, GBBF(WH - TRA_GBPT, 0, 0), STR_TILE_INSPECTOR_TRACK_ENTIRE_TRACK_PIECE, STR_NONE }, // WIDX_TRACK_CHECK_APPLY_TO_ALL
|
2018-06-10 21:31:08 +02:00
|
|
|
SPINNER_WIDGETS (1, GBBL(1), GBBR(1), GBBT(WH - TRA_GBPT, 1) + 3, GBBB(WH - TRA_GBPT, 1) - 3, STR_NONE, STR_NONE), // WIDX_TRACK_SPINNER_HEIGHT{,_INCREASE,_DECREASE}
|
2017-06-06 23:24:18 +02:00
|
|
|
{ WWT_CHECKBOX, 1, GBBF(WH - TRA_GBPT, 0, 2), STR_TILE_INSPECTOR_TRACK_CHAIN_LIFT, STR_NONE }, // WIDX_TRACK_CHECK_CHAIN_LIFT
|
|
|
|
{ WIDGETS_END },
|
2016-05-29 16:12:53 +02:00
|
|
|
};
|
|
|
|
|
2017-06-06 23:24:18 +02:00
|
|
|
#define SCE_GBPB PADDING_BOTTOM // Scenery group box properties bottom
|
|
|
|
#define SCE_GBPT (SCE_GBPB + 16 + 4 * 21) // Scenery group box properties top
|
|
|
|
#define SCE_GBDB (SCE_GBPT + GROUPBOX_PADDING) // Scenery group box info bottom
|
|
|
|
#define SCE_GBDT (SCE_GBDB + 20 + 3 * 11) // Scenery group box info top
|
2017-02-07 22:23:56 +01:00
|
|
|
static rct_widget SceneryWidgets[] = {
|
2017-06-06 23:24:18 +02:00
|
|
|
MAIN_TILE_INSPECTOR_WIDGETS,
|
2018-06-10 21:31:08 +02:00
|
|
|
SPINNER_WIDGETS (1, GBBL(1), GBBR(1), GBBT(WH - SCE_GBPT, 0) + 3, GBBB(WH - SCE_GBPT, 0) - 3, STR_NONE, STR_NONE), // WIDX_SCENERY_SPINNER_HEIGHT{,_INCREASE,_DECREASE}
|
2017-06-06 23:24:18 +02:00
|
|
|
{ WWT_CHECKBOX, 1, CHK(GBBL(1) + 14 * 1, GBBT(WH - SCE_GBPT, 1) + 7 * 0), STR_NONE, STR_NONE }, // WIDX_SCENERY_CHECK_QUARTER_N
|
|
|
|
{ WWT_CHECKBOX, 1, CHK(GBBL(1) + 14 * 2, GBBT(WH - SCE_GBPT, 1) + 7 * 1), STR_NONE, STR_NONE }, // WIDX_SCENERY_CHECK_QUARTER_E
|
|
|
|
{ WWT_CHECKBOX, 1, CHK(GBBL(1) + 14 * 1, GBBT(WH - SCE_GBPT, 1) + 7 * 2), STR_NONE, STR_NONE }, // WIDX_SCENERY_CHECK_QUARTER_S
|
|
|
|
{ WWT_CHECKBOX, 1, CHK(GBBL(1) + 14 * 0, GBBT(WH - SCE_GBPT, 1) + 7 * 1), STR_NONE, STR_NONE }, // WIDX_SCENERY_CHECK_QUARTER_W
|
|
|
|
{ WWT_CHECKBOX, 1, CHK(GBBL(1) + 14 * 1, GBBT(WH - SCE_GBPT, 2) + 7 * 0), STR_NONE, STR_NONE }, // WIDX_SCENERY_CHECK_COLLISION_N
|
|
|
|
{ WWT_CHECKBOX, 1, CHK(GBBL(1) + 14 * 2, GBBT(WH - SCE_GBPT, 2) + 7 * 1), STR_NONE, STR_NONE }, // WIDX_SCENERY_CHECK_COLLISION_E
|
|
|
|
{ WWT_CHECKBOX, 1, CHK(GBBL(1) + 14 * 1, GBBT(WH - SCE_GBPT, 2) + 7 * 2), STR_NONE, STR_NONE }, // WIDX_SCENERY_CHECK_COLLISION_S
|
|
|
|
{ WWT_CHECKBOX, 1, CHK(GBBL(1) + 14 * 0, GBBT(WH - SCE_GBPT, 2) + 7 * 1), STR_NONE, STR_NONE }, // WIDX_SCENERY_CHECK_COLLISION_W
|
|
|
|
{ WIDGETS_END },
|
2016-05-29 16:12:53 +02:00
|
|
|
};
|
|
|
|
|
2018-05-31 23:35:59 +02:00
|
|
|
|
2017-06-06 23:24:18 +02:00
|
|
|
#define ENT_GBPB PADDING_BOTTOM // Entrance group box properties bottom
|
2018-01-13 15:44:10 +01:00
|
|
|
#define ENT_GBPT (ENT_GBPB + 16 + 2 * 21) // Entrance group box properties top
|
2017-06-06 23:24:18 +02:00
|
|
|
#define ENT_GBDB (ENT_GBPT + GROUPBOX_PADDING) // Entrance group box info bottom
|
|
|
|
#define ENT_GBDT (ENT_GBDB + 20 + 3 * 11) // Entrance group box info top
|
2017-02-07 22:23:56 +01:00
|
|
|
static rct_widget EntranceWidgets[] = {
|
2017-06-06 23:24:18 +02:00
|
|
|
MAIN_TILE_INSPECTOR_WIDGETS,
|
2018-06-10 21:31:08 +02:00
|
|
|
SPINNER_WIDGETS (1, GBBL(1), GBBR(1), GBBT(WH - ENT_GBPT, 0) + 3, GBBB(WH - ENT_GBPT, 0) - 3, STR_NONE, STR_NONE), // WIDX_ENTRANCE_SPINNER_HEIGHT{,_INCREASE,_DECREASE}
|
2018-01-13 15:44:10 +01:00
|
|
|
{ WWT_BUTTON, 1, GBB(WH - ENT_GBPT, 0, 1), STR_TILE_INSPECTOR_ENTRANCE_MAKE_USABLE, STR_TILE_INSPECTOR_ENTRANCE_MAKE_USABLE_TIP }, // WIDX_ENTRANCE_BUTTON_MAKE_USABLE
|
2017-06-06 23:24:18 +02:00
|
|
|
{ WIDGETS_END },
|
2015-06-01 03:33:56 +02:00
|
|
|
};
|
|
|
|
|
2017-06-06 23:24:18 +02:00
|
|
|
#define WALL_GBPB PADDING_BOTTOM // Wall group box properties bottom
|
|
|
|
#define WALL_GBPT (WALL_GBPB + 16 + 2 * 21) // Wall group box properties top
|
|
|
|
#define WALL_GBDB (WALL_GBPT + GROUPBOX_PADDING) // Wall group box info bottom
|
|
|
|
#define WALL_GBDT (WALL_GBDB + 20 + 2 * 11) // Wall group box info top
|
2017-02-21 21:22:03 +01:00
|
|
|
static rct_widget WallWidgets[] = {
|
2017-06-06 23:24:18 +02:00
|
|
|
MAIN_TILE_INSPECTOR_WIDGETS,
|
2018-06-10 21:31:08 +02:00
|
|
|
SPINNER_WIDGETS (1, GBBL(1), GBBR(1), GBBT(WH - WALL_GBPT, 0) + 3, GBBB(WH - WALL_GBPT, 0) - 3, STR_NONE, STR_NONE), // WIDX_WALL_SPINNER_HEIGHT{,_INCREASE,_DECREASE}
|
2018-05-31 23:35:59 +02:00
|
|
|
{ WWT_DROPDOWN, 1, GBD(WH - WALL_GBPT, 1, 1), STR_NONE, STR_NONE }, // WIDX_WALL_DROPDOWN_SLOPE
|
2018-01-03 20:30:58 +01:00
|
|
|
{ WWT_BUTTON, 1, GBDB(WH - WALL_GBPT, 1, 1), STR_DROPDOWN_GLYPH, STR_NONE }, // WIDX_WALL_DROPDOWN_SLOPE_BUTTON
|
2017-06-06 23:24:18 +02:00
|
|
|
{ WIDGETS_END },
|
2016-05-29 16:12:53 +02:00
|
|
|
};
|
|
|
|
|
2017-06-06 23:24:18 +02:00
|
|
|
#define LAR_GBPB PADDING_BOTTOM // Large scenery group box properties bottom
|
|
|
|
#define LAR_GBPT (LAR_GBPB + 16 + 1 * 21) // Large scenery group box properties top
|
|
|
|
#define LAR_GBDB (LAR_GBPT + GROUPBOX_PADDING) // Large scenery group box info bottom
|
|
|
|
#define LAR_GBDT (LAR_GBDB + 20 + 3 * 11) // Large scenery group box info top
|
2017-02-07 22:23:56 +01:00
|
|
|
static rct_widget LargeSceneryWidgets[] = {
|
2017-06-06 23:24:18 +02:00
|
|
|
MAIN_TILE_INSPECTOR_WIDGETS,
|
2018-06-10 21:31:08 +02:00
|
|
|
SPINNER_WIDGETS (1, GBBL(1), GBBR(1), GBBT(WH - LAR_GBPT, 0) + 3, GBBB(WH - LAR_GBPT, 0) - 3, STR_NONE, STR_NONE), // WIDX_LARGE_SCENERY_SPINNER_HEIGHT{,_INCREASE,_DECREASE}
|
2017-06-06 23:24:18 +02:00
|
|
|
{ WIDGETS_END },
|
2016-05-29 16:12:53 +02:00
|
|
|
};
|
|
|
|
|
2017-06-06 23:24:18 +02:00
|
|
|
#define BAN_GBPB PADDING_BOTTOM // Banner group box properties bottom
|
|
|
|
#define BAN_GBPT (BAN_GBPB + 16 + 3 * 21) // Banner group box properties top
|
|
|
|
#define BAN_GBDB (BAN_GBPT + GROUPBOX_PADDING) // Banner group box info bottom
|
|
|
|
#define BAN_GBDT (BAN_GBDB + 20 + 1 * 11) // Banner group box info top
|
2017-02-07 22:23:56 +01:00
|
|
|
static rct_widget BannerWidgets[] = {
|
2017-06-06 23:24:18 +02:00
|
|
|
MAIN_TILE_INSPECTOR_WIDGETS,
|
2018-06-10 21:31:08 +02:00
|
|
|
SPINNER_WIDGETS (1, GBBL(1), GBBR(1), GBBT(WH - BAN_GBPT, 0) + 3, GBBB(WH - BAN_GBPT, 0) - 3, STR_NONE, STR_NONE), // WIDX_BANNER_SPINNER_HEIGHT{,_INCREASE,_DECREASE}
|
2017-06-06 23:24:18 +02:00
|
|
|
{ WWT_CHECKBOX, 1, CHK(GBBL(1) + 14 * 3, GBBT(WH - BAN_GBPT, 1) + 7 * 1), STR_NONE, STR_NONE }, // WIDX_BANNER_CHECK_BLOCK_NE
|
|
|
|
{ WWT_CHECKBOX, 1, CHK(GBBL(1) + 14 * 3, GBBT(WH - BAN_GBPT, 1) + 7 * 3), STR_NONE, STR_NONE }, // WIDX_BANNER_CHECK_BLOCK_SE
|
|
|
|
{ WWT_CHECKBOX, 1, CHK(GBBL(1) + 14 * 1, GBBT(WH - BAN_GBPT, 1) + 7 * 3), STR_NONE, STR_NONE }, // WIDX_BANNER_CHECK_BLOCK_SW
|
|
|
|
{ WWT_CHECKBOX, 1, CHK(GBBL(1) + 14 * 1, GBBT(WH - BAN_GBPT, 1) + 7 * 1), STR_NONE, STR_NONE }, // WIDX_BANNER_CHECK_BLOCK_NW
|
|
|
|
|
|
|
|
{ WIDGETS_END },
|
2016-05-29 16:12:53 +02:00
|
|
|
};
|
|
|
|
|
2017-06-06 23:24:18 +02:00
|
|
|
#define COR_GBPB PADDING_BOTTOM // Corrupt element group box properties bottom
|
|
|
|
#define COR_GBPT (COR_GBPB + 16 + 2 * 21) // Corrupt element group box properties top
|
|
|
|
#define COR_GBDB (COR_GBPT + GROUPBOX_PADDING) // Corrupt element group box info bottom
|
|
|
|
#define COR_GBDT (COR_GBDB + 20 + 0 * 11) // Corrupt element group box info top
|
2017-02-07 22:23:56 +01:00
|
|
|
static rct_widget CorruptWidgets[] = {
|
2017-06-06 23:24:18 +02:00
|
|
|
MAIN_TILE_INSPECTOR_WIDGETS,
|
2018-06-10 21:31:08 +02:00
|
|
|
SPINNER_WIDGETS (1, GBBL(1), GBBR(1), GBBT(WH - COR_GBPT, 0) + 3, GBBB(WH - COR_GBPT, 0) - 3, STR_NONE, STR_NONE), // WIDX_CORRUPT_SPINNER_HEIGHT{,_INCREASE,_DECREASE}
|
2018-01-04 16:17:12 +01:00
|
|
|
{ WWT_BUTTON, 1, GBB(WH - SUR_GBPT, 0, 1), STR_TILE_INSPECTOR_CLAMP_TO_NEXT, STR_TILE_INSPECTOR_CLAMP_TO_NEXT_TIP }, // WIDX_CORRUPT_BUTTON_CLAMP
|
2017-06-06 23:24:18 +02:00
|
|
|
{ WIDGETS_END },
|
2016-05-29 16:12:53 +02:00
|
|
|
};
|
|
|
|
|
2017-02-07 22:23:56 +01:00
|
|
|
static rct_widget *PageWidgets[] = {
|
2017-06-06 23:24:18 +02:00
|
|
|
DefaultWidgets,
|
|
|
|
SurfaceWidgets,
|
|
|
|
PathWidgets,
|
|
|
|
TrackWidgets,
|
|
|
|
SceneryWidgets,
|
|
|
|
EntranceWidgets,
|
|
|
|
WallWidgets,
|
|
|
|
LargeSceneryWidgets,
|
|
|
|
BannerWidgets,
|
|
|
|
CorruptWidgets,
|
2016-05-29 16:12:53 +02:00
|
|
|
};
|
|
|
|
|
2016-05-31 20:13:26 +02:00
|
|
|
static struct {
|
2017-06-06 23:24:18 +02:00
|
|
|
// Offsets from the bottom of the window
|
2018-06-20 17:28:51 +02:00
|
|
|
int16_t details_top_offset, details_bottom_offset;
|
|
|
|
int16_t properties_top_offset, properties_bottom_offset;
|
2017-06-06 23:24:18 +02:00
|
|
|
// String to be displayed in the details groupbox
|
|
|
|
rct_string_id string_id;
|
2017-02-07 22:23:56 +01:00
|
|
|
} PageGroupBoxSettings[] = {
|
2017-06-06 23:24:18 +02:00
|
|
|
{ SUR_GBDT, SUR_GBDB, SUR_GBPT, SUR_GBPB, STR_TILE_INSPECTOR_GROUPBOX_SURFACE_INFO },
|
|
|
|
{ PAT_GBDT, PAT_GBDB, PAT_GBPT, PAT_GBPB, STR_TILE_INSPECTOR_GROUPBOX_PATH_INFO },
|
|
|
|
{ TRA_GBDT, TRA_GBDB, TRA_GBPT, TRA_GBPB, STR_TILE_INSPECTOR_GROUPBOX_TRACK_INFO },
|
|
|
|
{ SCE_GBDT, SCE_GBDB, SCE_GBPT, SCE_GBPB, STR_TILE_INSPECTOR_GROUPBOX_SCENERY_INFO },
|
|
|
|
{ ENT_GBDT, ENT_GBDB, ENT_GBPT, ENT_GBPB, STR_TILE_INSPECTOR_GROUPBOX_ENTRANCE_INFO },
|
|
|
|
{ WALL_GBDT, WALL_GBDB, WALL_GBPT, WALL_GBPB, STR_TILE_INSPECTOR_GROUPBOX_WALL_INFO },
|
|
|
|
{ LAR_GBDT, LAR_GBDB, LAR_GBPT, LAR_GBPB, STR_TILE_INSPECTOR_GROUPBOX_LARGE_SCENERY_INFO },
|
|
|
|
{ BAN_GBDT, BAN_GBDB, BAN_GBPT, BAN_GBPB, STR_TILE_INSPECTOR_GROUPBOX_BANNER_INFO },
|
|
|
|
{ COR_GBDT, COR_GBDB, COR_GBPT, COR_GBPB, STR_TILE_INSPECTOR_GROUPBOX_CORRUPT_INFO }
|
2016-05-29 16:12:53 +02:00
|
|
|
};
|
|
|
|
|
2018-05-21 22:34:42 +02:00
|
|
|
// clang-format on
|
2018-06-20 17:28:51 +02:00
|
|
|
static constexpr int32_t ViewportInteractionFlags = VIEWPORT_INTERACTION_MASK_TERRAIN & VIEWPORT_INTERACTION_MASK_SPRITE
|
2018-05-21 22:34:42 +02:00
|
|
|
& VIEWPORT_INTERACTION_MASK_RIDE & VIEWPORT_INTERACTION_MASK_SCENERY & VIEWPORT_INTERACTION_MASK_FOOTPATH
|
|
|
|
& VIEWPORT_INTERACTION_MASK_FOOTPATH_ITEM & VIEWPORT_INTERACTION_MASK_PARK & VIEWPORT_INTERACTION_MASK_WALL
|
|
|
|
& VIEWPORT_INTERACTION_MASK_LARGE_SCENERY & VIEWPORT_INTERACTION_MASK_BANNER;
|
|
|
|
|
2018-06-20 17:28:51 +02:00
|
|
|
static int16_t windowTileInspectorHighlightedIndex = -1;
|
2016-10-09 15:14:56 +02:00
|
|
|
static bool windowTileInspectorTileSelected = false;
|
2018-06-20 17:28:51 +02:00
|
|
|
static int32_t windowTileInspectorToolMouseX = 0;
|
|
|
|
static int32_t windowTileInspectorToolMouseY = 0;
|
2018-05-21 22:34:42 +02:00
|
|
|
static bool windowTileInspectorToolCtrlDown = false;
|
2018-06-20 17:28:51 +02:00
|
|
|
static int32_t windowTileInspectorToolMapX = 0;
|
|
|
|
static int32_t windowTileInspectorToolMapY = 0;
|
2016-09-18 20:47:35 +02:00
|
|
|
static bool windowTileInspectorApplyToAll = false;
|
2016-10-23 20:40:23 +02:00
|
|
|
static bool windowTileInspectorElementCopied = false;
|
2017-10-31 12:57:40 +01:00
|
|
|
static rct_tile_element tileInspectorCopiedElement;
|
2016-09-18 20:47:35 +02:00
|
|
|
|
2018-06-22 23:21:44 +02:00
|
|
|
static void window_tile_inspector_mouseup(rct_window* w, rct_widgetindex widgetIndex);
|
|
|
|
static void window_tile_inspector_resize(rct_window* w);
|
|
|
|
static void window_tile_inspector_mousedown(rct_window* w, rct_widgetindex widgetIndex, rct_widget* widget);
|
|
|
|
static void window_tile_inspector_update(rct_window* w);
|
|
|
|
static void window_tile_inspector_dropdown(rct_window* w, rct_widgetindex widgetIndex, int32_t dropdownIndex);
|
2018-06-20 17:28:51 +02:00
|
|
|
static void window_tile_inspector_tool_update(rct_window* w, rct_widgetindex widgetIndex, int32_t x, int32_t y);
|
2018-06-22 23:21:44 +02:00
|
|
|
static void window_tile_inspector_update_selected_tile(rct_window* w, int32_t x, int32_t y);
|
2018-06-20 17:28:51 +02:00
|
|
|
static void window_tile_inspector_tool_down(rct_window* w, rct_widgetindex widgetIndex, int32_t x, int32_t y);
|
|
|
|
static void window_tile_inspector_tool_drag(rct_window* w, rct_widgetindex widgetIndex, int32_t x, int32_t y);
|
2018-06-22 23:21:44 +02:00
|
|
|
static void window_tile_inspector_scrollgetsize(rct_window* w, int32_t scrollIndex, int32_t* width, int32_t* height);
|
|
|
|
static void window_tile_inspector_scrollmousedown(rct_window* w, int32_t scrollIndex, int32_t x, int32_t y);
|
|
|
|
static void window_tile_inspector_scrollmouseover(rct_window* w, int32_t scrollIndex, int32_t x, int32_t y);
|
|
|
|
static void window_tile_inspector_invalidate(rct_window* w);
|
|
|
|
static void window_tile_inspector_paint(rct_window* w, rct_drawpixelinfo* dpi);
|
|
|
|
static void window_tile_inspector_scrollpaint(rct_window* w, rct_drawpixelinfo* dpi, int32_t scrollIndex);
|
2018-05-25 23:09:52 +02:00
|
|
|
static void window_tile_inspector_set_page(rct_window* w, const TILE_INSPECTOR_PAGE page);
|
2015-12-28 23:11:36 +01:00
|
|
|
|
2018-05-21 22:34:42 +02:00
|
|
|
// clang-format off
|
2017-02-07 22:23:56 +01:00
|
|
|
static rct_window_event_list TileInspectorWindowEvents = {
|
2017-08-15 10:07:44 +02:00
|
|
|
nullptr,
|
2017-06-06 23:24:18 +02:00
|
|
|
window_tile_inspector_mouseup,
|
|
|
|
window_tile_inspector_resize,
|
|
|
|
window_tile_inspector_mousedown,
|
|
|
|
window_tile_inspector_dropdown,
|
2017-08-15 10:07:44 +02:00
|
|
|
nullptr,
|
2017-06-06 23:24:18 +02:00
|
|
|
window_tile_inspector_update,
|
2017-08-15 10:07:44 +02:00
|
|
|
nullptr,
|
|
|
|
nullptr,
|
2017-06-06 23:24:18 +02:00
|
|
|
window_tile_inspector_tool_update,
|
|
|
|
window_tile_inspector_tool_down,
|
|
|
|
window_tile_inspector_tool_drag,
|
2017-08-15 10:07:44 +02:00
|
|
|
nullptr,
|
|
|
|
nullptr,
|
|
|
|
nullptr,
|
2017-06-06 23:24:18 +02:00
|
|
|
window_tile_inspector_scrollgetsize,
|
|
|
|
window_tile_inspector_scrollmousedown,
|
2017-08-15 10:07:44 +02:00
|
|
|
nullptr,
|
2017-06-06 23:24:18 +02:00
|
|
|
window_tile_inspector_scrollmouseover,
|
2017-08-15 10:07:44 +02:00
|
|
|
nullptr,
|
|
|
|
nullptr,
|
|
|
|
nullptr,
|
|
|
|
nullptr,
|
|
|
|
nullptr,
|
|
|
|
nullptr,
|
2017-06-06 23:24:18 +02:00
|
|
|
window_tile_inspector_invalidate,
|
|
|
|
window_tile_inspector_paint,
|
|
|
|
window_tile_inspector_scrollpaint
|
2015-06-01 03:33:56 +02:00
|
|
|
};
|
|
|
|
|
2018-06-20 17:28:51 +02:00
|
|
|
static uint64_t PageEnabledWidgets[] = {
|
2017-06-06 23:24:18 +02:00
|
|
|
(1ULL << WIDX_CLOSE) | (1ULL << WIDX_BUTTON_CORRUPT),
|
|
|
|
(1ULL << WIDX_CLOSE) | (1ULL << WIDX_BUTTON_CORRUPT) | (1ULL << WIDX_BUTTON_REMOVE) | (1ULL << WIDX_BUTTON_ROTATE) | (1ULL << WIDX_BUTTON_COPY) | (1ULL << WIDX_SURFACE_SPINNER_HEIGHT_INCREASE) | (1ULL << WIDX_SURFACE_SPINNER_HEIGHT_DECREASE) | (1ULL << WIDX_SURFACE_BUTTON_REMOVE_FENCES) | (1ULL << WIDX_SURFACE_BUTTON_RESTORE_FENCES) | (1ULL << WIDX_SURFACE_CHECK_CORNER_N) | (1ULL << WIDX_SURFACE_CHECK_CORNER_E) | (1ULL << WIDX_SURFACE_CHECK_CORNER_S) | (1ULL << WIDX_SURFACE_CHECK_CORNER_W) | (1ULL << WIDX_SURFACE_CHECK_DIAGONAL),
|
|
|
|
(1ULL << WIDX_CLOSE) | (1ULL << WIDX_BUTTON_CORRUPT) | (1ULL << WIDX_BUTTON_REMOVE) | (1ULL << WIDX_BUTTON_ROTATE) | (1ULL << WIDX_BUTTON_COPY) | (1ULL << WIDX_PATH_SPINNER_HEIGHT_INCREASE) | (1ULL << WIDX_PATH_SPINNER_HEIGHT_DECREASE) | (1ULL << WIDX_PATH_CHECK_SLOPED) | (1ULL << WIDX_PATH_CHECK_EDGE_N) | (1ULL << WIDX_PATH_CHECK_EDGE_NE) | (1ULL << WIDX_PATH_CHECK_EDGE_E) | (1ULL << WIDX_PATH_CHECK_EDGE_SE) | (1ULL << WIDX_PATH_CHECK_EDGE_S) | (1ULL << WIDX_PATH_CHECK_EDGE_SW) | (1ULL << WIDX_PATH_CHECK_EDGE_W) | (1ULL << WIDX_PATH_CHECK_EDGE_NW),
|
|
|
|
(1ULL << WIDX_CLOSE) | (1ULL << WIDX_BUTTON_CORRUPT) | (1ULL << WIDX_BUTTON_REMOVE) | (1ULL << WIDX_BUTTON_ROTATE) | (1ULL << WIDX_BUTTON_COPY) | (1ULL << WIDX_TRACK_CHECK_APPLY_TO_ALL) | (1ULL << WIDX_TRACK_SPINNER_HEIGHT_INCREASE) | (1ULL << WIDX_TRACK_SPINNER_HEIGHT_DECREASE) | (1ULL << WIDX_TRACK_CHECK_CHAIN_LIFT),
|
|
|
|
(1ULL << WIDX_CLOSE) | (1ULL << WIDX_BUTTON_CORRUPT) | (1ULL << WIDX_BUTTON_REMOVE) | (1ULL << WIDX_BUTTON_ROTATE) | (1ULL << WIDX_BUTTON_COPY) | (1ULL << WIDX_SCENERY_SPINNER_HEIGHT_INCREASE) | (1ULL << WIDX_SCENERY_SPINNER_HEIGHT_DECREASE) | (1ULL << WIDX_SCENERY_CHECK_QUARTER_N) | (1ULL << WIDX_SCENERY_CHECK_QUARTER_E) | (1ULL << WIDX_SCENERY_CHECK_QUARTER_S) | (1ULL << WIDX_SCENERY_CHECK_QUARTER_W) | (1ULL << WIDX_SCENERY_CHECK_COLLISION_N) | (1ULL << WIDX_SCENERY_CHECK_COLLISION_E) | (1ULL << WIDX_SCENERY_CHECK_COLLISION_S) | (1ULL << WIDX_SCENERY_CHECK_COLLISION_W),
|
2018-01-13 15:44:10 +01:00
|
|
|
(1ULL << WIDX_CLOSE) | (1ULL << WIDX_BUTTON_CORRUPT) | (1ULL << WIDX_BUTTON_REMOVE) | (1ULL << WIDX_BUTTON_ROTATE) | (1ULL << WIDX_BUTTON_COPY) | (1ULL << WIDX_ENTRANCE_SPINNER_HEIGHT_INCREASE) | (1ULL << WIDX_ENTRANCE_SPINNER_HEIGHT_DECREASE) | (1ULL << WIDX_ENTRANCE_BUTTON_MAKE_USABLE),
|
2017-06-06 23:24:18 +02:00
|
|
|
(1ULL << WIDX_CLOSE) | (1ULL << WIDX_BUTTON_CORRUPT) | (1ULL << WIDX_BUTTON_REMOVE) | (1ULL << WIDX_BUTTON_ROTATE) | (1ULL << WIDX_BUTTON_COPY) | (1ULL << WIDX_WALL_SPINNER_HEIGHT_INCREASE) | (1ULL << WIDX_WALL_SPINNER_HEIGHT_DECREASE) | (1ULL << WIDX_WALL_DROPDOWN_SLOPE) | (1ULL << WIDX_WALL_DROPDOWN_SLOPE_BUTTON),
|
2018-06-10 18:55:44 +02:00
|
|
|
(1ULL << WIDX_CLOSE) | (1ULL << WIDX_BUTTON_CORRUPT) | (1ULL << WIDX_BUTTON_REMOVE) | (1ULL << WIDX_BUTTON_COPY) | (1ULL << WIDX_LARGE_SCENERY_SPINNER_HEIGHT_INCREASE) | (1ULL << WIDX_LARGE_SCENERY_SPINNER_HEIGHT_DECREASE),
|
|
|
|
(1ULL << WIDX_CLOSE) | (1ULL << WIDX_BUTTON_CORRUPT) | (1ULL << WIDX_BUTTON_REMOVE) | (1ULL << WIDX_BUTTON_ROTATE) | (1ULL << WIDX_BUTTON_COPY) | (1ULL << WIDX_BANNER_SPINNER_HEIGHT_INCREASE) | (1ULL << WIDX_BANNER_SPINNER_HEIGHT_DECREASE) | (1ULL << WIDX_BANNER_CHECK_BLOCK_NE) | (1ULL << WIDX_BANNER_CHECK_BLOCK_SE) | (1ULL << WIDX_BANNER_CHECK_BLOCK_SW) | (1ULL << WIDX_BANNER_CHECK_BLOCK_NW),
|
|
|
|
(1ULL << WIDX_CLOSE) | (1ULL << WIDX_BUTTON_CORRUPT) | (1ULL << WIDX_BUTTON_REMOVE) | (1ULL << WIDX_BUTTON_COPY) | (1ULL << WIDX_CORRUPT_SPINNER_HEIGHT_INCREASE) | (1ULL << WIDX_CORRUPT_SPINNER_HEIGHT_DECREASE) | (1ULL << WIDX_CORRUPT_BUTTON_CLAMP),
|
|
|
|
};
|
|
|
|
|
2018-06-20 17:28:51 +02:00
|
|
|
static uint64_t PageHoldDownWidgets[] = {
|
2018-06-10 18:55:44 +02:00
|
|
|
(1ULL << WIDX_SPINNER_X_INCREASE) | (1ULL << WIDX_SPINNER_X_DECREASE) | (1ULL << WIDX_SPINNER_Y_INCREASE) | (1ULL << WIDX_SPINNER_Y_DECREASE),
|
|
|
|
(1ULL << WIDX_SPINNER_X_INCREASE) | (1ULL << WIDX_SPINNER_X_DECREASE) | (1ULL << WIDX_SPINNER_Y_INCREASE) | (1ULL << WIDX_SPINNER_Y_DECREASE) | (1ULL << WIDX_SURFACE_SPINNER_HEIGHT_INCREASE) | (1ULL << WIDX_SURFACE_SPINNER_HEIGHT_DECREASE),
|
|
|
|
(1ULL << WIDX_SPINNER_X_INCREASE) | (1ULL << WIDX_SPINNER_X_DECREASE) | (1ULL << WIDX_SPINNER_Y_INCREASE) | (1ULL << WIDX_SPINNER_Y_DECREASE) | (1ULL << WIDX_PATH_SPINNER_HEIGHT_INCREASE) | (1ULL << WIDX_PATH_SPINNER_HEIGHT_DECREASE),
|
|
|
|
(1ULL << WIDX_SPINNER_X_INCREASE) | (1ULL << WIDX_SPINNER_X_DECREASE) | (1ULL << WIDX_SPINNER_Y_INCREASE) | (1ULL << WIDX_SPINNER_Y_DECREASE) | (1ULL << WIDX_TRACK_SPINNER_HEIGHT_INCREASE) | (1ULL << WIDX_TRACK_SPINNER_HEIGHT_DECREASE),
|
|
|
|
(1ULL << WIDX_SPINNER_X_INCREASE) | (1ULL << WIDX_SPINNER_X_DECREASE) | (1ULL << WIDX_SPINNER_Y_INCREASE) | (1ULL << WIDX_SPINNER_Y_DECREASE) | (1ULL << WIDX_SCENERY_SPINNER_HEIGHT_INCREASE) | (1ULL << WIDX_SCENERY_SPINNER_HEIGHT_DECREASE),
|
|
|
|
(1ULL << WIDX_SPINNER_X_INCREASE) | (1ULL << WIDX_SPINNER_X_DECREASE) | (1ULL << WIDX_SPINNER_Y_INCREASE) | (1ULL << WIDX_SPINNER_Y_DECREASE) | (1ULL << WIDX_ENTRANCE_SPINNER_HEIGHT_INCREASE) | (1ULL << WIDX_ENTRANCE_SPINNER_HEIGHT_DECREASE),
|
|
|
|
(1ULL << WIDX_SPINNER_X_INCREASE) | (1ULL << WIDX_SPINNER_X_DECREASE) | (1ULL << WIDX_SPINNER_Y_INCREASE) | (1ULL << WIDX_SPINNER_Y_DECREASE) | (1ULL << WIDX_WALL_SPINNER_HEIGHT_INCREASE) | (1ULL << WIDX_WALL_SPINNER_HEIGHT_DECREASE),
|
|
|
|
(1ULL << WIDX_SPINNER_X_INCREASE) | (1ULL << WIDX_SPINNER_X_DECREASE) | (1ULL << WIDX_SPINNER_Y_INCREASE) | (1ULL << WIDX_SPINNER_Y_DECREASE) | (1ULL << WIDX_LARGE_SCENERY_SPINNER_HEIGHT_INCREASE) | (1ULL << WIDX_LARGE_SCENERY_SPINNER_HEIGHT_DECREASE),
|
|
|
|
(1ULL << WIDX_SPINNER_X_INCREASE) | (1ULL << WIDX_SPINNER_X_DECREASE) | (1ULL << WIDX_SPINNER_Y_INCREASE) | (1ULL << WIDX_SPINNER_Y_DECREASE) | (1ULL << WIDX_BANNER_SPINNER_HEIGHT_INCREASE) | (1ULL << WIDX_BANNER_SPINNER_HEIGHT_DECREASE),
|
|
|
|
(1ULL << WIDX_SPINNER_X_INCREASE) | (1ULL << WIDX_SPINNER_X_DECREASE) | (1ULL << WIDX_SPINNER_Y_INCREASE) | (1ULL << WIDX_SPINNER_Y_DECREASE) | (1ULL << WIDX_CORRUPT_SPINNER_HEIGHT_INCREASE) | (1ULL << WIDX_CORRUPT_SPINNER_HEIGHT_DECREASE),
|
2016-05-29 16:12:53 +02:00
|
|
|
};
|
|
|
|
|
2018-06-20 17:28:51 +02:00
|
|
|
static uint64_t PageDisabledWidgets[] = {
|
2017-06-06 23:24:18 +02:00
|
|
|
(1ULL << WIDX_BUTTON_CORRUPT) | (1ULL << WIDX_BUTTON_MOVE_UP) | (1ULL << WIDX_BUTTON_MOVE_DOWN) | (1ULL << WIDX_BUTTON_REMOVE) | (1ULL << WIDX_BUTTON_ROTATE) | (1ULL << WIDX_BUTTON_COPY),
|
|
|
|
0,
|
|
|
|
0,
|
|
|
|
0,
|
|
|
|
0,
|
|
|
|
0,
|
|
|
|
0,
|
|
|
|
(1ULL << WIDX_BUTTON_ROTATE),
|
|
|
|
0,
|
|
|
|
(1ULL << WIDX_BUTTON_ROTATE),
|
2016-05-29 16:12:53 +02:00
|
|
|
};
|
2018-05-16 20:41:29 +02:00
|
|
|
// clang-format on
|
2016-05-29 16:12:53 +02:00
|
|
|
|
2018-06-22 23:21:44 +02:00
|
|
|
rct_window* window_tile_inspector_open()
|
2016-11-01 23:43:39 +01:00
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
rct_window* window;
|
|
|
|
|
|
|
|
// Check if window is already open
|
|
|
|
window = window_bring_to_front_by_class(WC_TILE_INSPECTOR);
|
2017-08-15 10:07:44 +02:00
|
|
|
if (window != nullptr)
|
2017-11-23 00:42:12 +01:00
|
|
|
return window;
|
2017-06-06 23:24:18 +02:00
|
|
|
|
2018-06-22 23:21:44 +02:00
|
|
|
window = window_create(0, 29, WW, WH, &TileInspectorWindowEvents, WC_TILE_INSPECTOR, WF_RESIZABLE);
|
2017-06-06 23:24:18 +02:00
|
|
|
|
2018-05-25 23:09:52 +02:00
|
|
|
window_tile_inspector_set_page(window, TILE_INSPECTOR_PAGE_DEFAULT);
|
2017-06-06 23:24:18 +02:00
|
|
|
window->min_width = MIN_WW;
|
|
|
|
window->min_height = MIN_WH;
|
|
|
|
window->max_width = MAX_WW;
|
|
|
|
window->max_height = MAX_WH;
|
2018-06-11 01:09:00 +02:00
|
|
|
windowTileInspectorSelectedIndex = -1;
|
2018-05-21 19:11:14 +02:00
|
|
|
window_init_scroll_widgets(window);
|
2017-06-06 23:24:18 +02:00
|
|
|
|
|
|
|
windowTileInspectorTileSelected = false;
|
|
|
|
|
|
|
|
tool_set(window, WIDX_BACKGROUND, TOOL_CROSSHAIR);
|
2017-11-23 00:42:12 +01:00
|
|
|
|
|
|
|
return window;
|
2016-06-05 00:45:13 +02:00
|
|
|
}
|
|
|
|
|
2016-11-01 23:43:39 +01:00
|
|
|
void window_tile_inspector_clear_clipboard()
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
windowTileInspectorElementCopied = false;
|
2016-10-30 21:15:31 +01:00
|
|
|
}
|
|
|
|
|
2018-06-22 23:21:44 +02:00
|
|
|
static rct_tile_element* window_tile_inspector_get_selected_element(rct_window* w)
|
2016-11-01 23:43:39 +01:00
|
|
|
{
|
2018-06-22 23:21:44 +02:00
|
|
|
openrct2_assert(
|
|
|
|
windowTileInspectorSelectedIndex >= 0 && windowTileInspectorSelectedIndex < windowTileInspectorElementCount,
|
|
|
|
"Selected list item out of range");
|
2018-06-11 01:09:00 +02:00
|
|
|
return map_get_first_element_at(windowTileInspectorTileX, windowTileInspectorTileY) + windowTileInspectorSelectedIndex;
|
2016-10-02 19:23:04 +02:00
|
|
|
}
|
|
|
|
|
2018-06-22 23:21:44 +02:00
|
|
|
static void window_tile_inspector_select_element_from_list(rct_window* w, int32_t index)
|
2017-06-05 13:23:09 +02:00
|
|
|
{
|
2018-05-21 19:11:14 +02:00
|
|
|
if (index < 0 || index >= windowTileInspectorElementCount)
|
|
|
|
{
|
2018-06-11 01:09:00 +02:00
|
|
|
windowTileInspectorSelectedIndex = -1;
|
2017-06-06 23:24:18 +02:00
|
|
|
}
|
2018-05-21 19:11:14 +02:00
|
|
|
else
|
|
|
|
{
|
2018-06-11 01:09:00 +02:00
|
|
|
windowTileInspectorSelectedIndex = index;
|
2017-06-06 23:24:18 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
window_invalidate(w);
|
2017-06-05 13:23:09 +02:00
|
|
|
}
|
|
|
|
|
2018-05-21 22:34:42 +02:00
|
|
|
static void window_tile_inspector_load_tile(rct_window* w, rct_tile_element* elementToSelect)
|
2016-11-01 23:43:39 +01:00
|
|
|
{
|
2018-06-11 01:09:00 +02:00
|
|
|
windowTileInspectorSelectedIndex = -1;
|
2018-05-21 22:34:42 +02:00
|
|
|
w->scrolls[0].v_top = 0;
|
|
|
|
|
|
|
|
rct_tile_element* element = map_get_first_element_at(windowTileInspectorTileX, windowTileInspectorTileY);
|
2018-06-20 17:28:51 +02:00
|
|
|
int16_t numItems = 0;
|
2018-05-21 22:34:42 +02:00
|
|
|
do
|
|
|
|
{
|
|
|
|
if (element == elementToSelect)
|
|
|
|
{
|
2018-06-11 01:09:00 +02:00
|
|
|
windowTileInspectorSelectedIndex = numItems;
|
2018-05-21 22:34:42 +02:00
|
|
|
}
|
|
|
|
|
2017-06-06 23:24:18 +02:00
|
|
|
numItems++;
|
2018-05-24 11:44:53 +02:00
|
|
|
} while (!(element++)->IsLastForTile());
|
2016-06-05 00:45:13 +02:00
|
|
|
|
2017-06-06 23:24:18 +02:00
|
|
|
windowTileInspectorElementCount = numItems;
|
2016-06-05 00:45:13 +02:00
|
|
|
|
2017-06-06 23:24:18 +02:00
|
|
|
window_invalidate(w);
|
2015-06-01 03:33:56 +02:00
|
|
|
}
|
|
|
|
|
2018-06-20 17:28:51 +02:00
|
|
|
static void window_tile_inspector_insert_corrupt_element(int32_t elementIndex)
|
2016-11-01 23:43:39 +01:00
|
|
|
{
|
2018-06-22 23:21:44 +02:00
|
|
|
openrct2_assert(elementIndex >= 0 && elementIndex < windowTileInspectorElementCount, "elementIndex out of range");
|
2017-06-06 23:24:18 +02:00
|
|
|
game_do_command(
|
2018-07-21 13:51:54 +02:00
|
|
|
TILE_INSPECTOR_ANY_INSERT_CORRUPT, GAME_COMMAND_FLAG_APPLY, windowTileInspectorTileX | (windowTileInspectorTileY << 8),
|
|
|
|
elementIndex, GAME_COMMAND_MODIFY_TILE, 0, 0);
|
2015-11-07 11:04:57 +01:00
|
|
|
}
|
|
|
|
|
2018-06-20 17:28:51 +02:00
|
|
|
static void window_tile_inspector_remove_element(int32_t elementIndex)
|
2016-11-01 23:43:39 +01:00
|
|
|
{
|
2018-06-22 23:21:44 +02:00
|
|
|
openrct2_assert(elementIndex >= 0 && elementIndex < windowTileInspectorElementCount, "elementIndex out of range");
|
2017-06-06 23:24:18 +02:00
|
|
|
game_do_command(
|
2018-07-21 13:51:54 +02:00
|
|
|
TILE_INSPECTOR_ANY_REMOVE, GAME_COMMAND_FLAG_APPLY, windowTileInspectorTileX | (windowTileInspectorTileY << 8),
|
|
|
|
elementIndex, GAME_COMMAND_MODIFY_TILE, 0, 0);
|
2015-12-29 15:43:49 +01:00
|
|
|
}
|
|
|
|
|
2018-06-20 17:28:51 +02:00
|
|
|
static void window_tile_inspector_rotate_element(int32_t elementIndex)
|
2016-11-01 23:43:39 +01:00
|
|
|
{
|
2018-06-22 23:21:44 +02:00
|
|
|
openrct2_assert(elementIndex >= 0 && elementIndex < windowTileInspectorElementCount, "elementIndex out of range");
|
2017-06-06 23:24:18 +02:00
|
|
|
game_do_command(
|
2018-07-21 13:51:54 +02:00
|
|
|
TILE_INSPECTOR_ANY_ROTATE, GAME_COMMAND_FLAG_APPLY, windowTileInspectorTileX | (windowTileInspectorTileY << 8),
|
|
|
|
elementIndex, GAME_COMMAND_MODIFY_TILE, 0, 0);
|
2016-04-17 00:35:11 +02:00
|
|
|
}
|
|
|
|
|
2015-12-28 23:11:36 +01:00
|
|
|
// Swap element with its parent
|
2018-06-20 17:28:51 +02:00
|
|
|
static void window_tile_inspector_swap_elements(int16_t first, int16_t second)
|
2016-11-01 23:43:39 +01:00
|
|
|
{
|
2018-06-22 23:21:44 +02:00
|
|
|
openrct2_assert(first >= 0 && first < windowTileInspectorElementCount, "first out of range");
|
|
|
|
openrct2_assert(second >= 0 && second < windowTileInspectorElementCount, "second out of range");
|
2017-06-06 23:24:18 +02:00
|
|
|
game_do_command(
|
2018-07-21 13:51:54 +02:00
|
|
|
TILE_INSPECTOR_ANY_SWAP, GAME_COMMAND_FLAG_APPLY, windowTileInspectorTileX | (windowTileInspectorTileY << 8), first,
|
|
|
|
GAME_COMMAND_MODIFY_TILE, second, 0);
|
2015-12-21 00:52:42 +01:00
|
|
|
}
|
|
|
|
|
2017-02-07 22:23:56 +01:00
|
|
|
static void window_tile_inspector_sort_elements()
|
2016-11-01 23:43:39 +01:00
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
openrct2_assert(windowTileInspectorTileSelected, "No tile selected");
|
|
|
|
game_do_command(
|
2018-07-21 13:51:54 +02:00
|
|
|
TILE_INSPECTOR_ANY_SORT, GAME_COMMAND_FLAG_APPLY, windowTileInspectorTileX | (windowTileInspectorTileY << 8), 0,
|
|
|
|
GAME_COMMAND_MODIFY_TILE, 0, 0);
|
2016-06-11 19:39:51 +02:00
|
|
|
}
|
|
|
|
|
2018-06-22 23:21:44 +02:00
|
|
|
static void window_tile_inspector_copy_element(rct_window* w)
|
2016-11-01 23:43:39 +01:00
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
// Copy value, in case the element gets moved
|
|
|
|
tileInspectorCopiedElement = *window_tile_inspector_get_selected_element(w);
|
|
|
|
windowTileInspectorElementCopied = true;
|
2018-05-21 19:11:14 +02:00
|
|
|
window_invalidate(w);
|
2016-10-23 20:40:23 +02:00
|
|
|
}
|
|
|
|
|
2018-06-22 23:21:44 +02:00
|
|
|
static void window_tile_inspector_paste_element(rct_window* w)
|
2016-11-01 23:43:39 +01:00
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
// Construct the data to send using the surface's properties
|
2018-06-20 17:28:51 +02:00
|
|
|
int32_t data[2];
|
2017-06-06 23:24:18 +02:00
|
|
|
memcpy(&data[0], &tileInspectorCopiedElement, 8);
|
|
|
|
assert_struct_size(data, sizeof(tileInspectorCopiedElement));
|
|
|
|
|
|
|
|
game_do_command(
|
2018-07-21 13:51:54 +02:00
|
|
|
TILE_INSPECTOR_ANY_PASTE, GAME_COMMAND_FLAG_APPLY, windowTileInspectorTileX | (windowTileInspectorTileY << 8), data[0],
|
|
|
|
GAME_COMMAND_MODIFY_TILE, data[1], 0);
|
2016-10-23 20:40:23 +02:00
|
|
|
}
|
|
|
|
|
2018-06-20 17:28:51 +02:00
|
|
|
static void window_tile_inspector_base_height_offset(int16_t elementIndex, int8_t heightOffset)
|
2017-01-25 14:22:33 +01:00
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
game_do_command(
|
2018-07-21 13:51:54 +02:00
|
|
|
TILE_INSPECTOR_ANY_BASE_HEIGHT_OFFSET, GAME_COMMAND_FLAG_APPLY,
|
|
|
|
windowTileInspectorTileX | (windowTileInspectorTileY << 8), elementIndex, GAME_COMMAND_MODIFY_TILE, heightOffset, 0);
|
2017-01-25 14:22:33 +01:00
|
|
|
}
|
|
|
|
|
2017-02-07 22:23:56 +01:00
|
|
|
static void window_tile_inspector_surface_show_park_fences(bool showFences)
|
2017-01-27 13:30:09 +01:00
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
game_do_command(
|
2018-07-21 13:51:54 +02:00
|
|
|
TILE_INSPECTOR_SURFACE_SHOW_PARK_FENCES, GAME_COMMAND_FLAG_APPLY,
|
|
|
|
windowTileInspectorTileX | (windowTileInspectorTileY << 8), showFences, GAME_COMMAND_MODIFY_TILE, 0, 0);
|
2017-01-27 13:30:09 +01:00
|
|
|
}
|
|
|
|
|
2018-06-20 17:28:51 +02:00
|
|
|
static void window_tile_inspector_surface_toggle_corner(int32_t cornerIndex)
|
2016-11-01 23:43:39 +01:00
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
game_do_command(
|
2018-07-21 13:51:54 +02:00
|
|
|
TILE_INSPECTOR_SURFACE_TOGGLE_CORNER, GAME_COMMAND_FLAG_APPLY,
|
|
|
|
windowTileInspectorTileX | (windowTileInspectorTileY << 8), cornerIndex, GAME_COMMAND_MODIFY_TILE, 0, 0);
|
2016-10-09 00:00:36 +02:00
|
|
|
}
|
|
|
|
|
2017-01-27 14:19:23 +01:00
|
|
|
static void window_tile_inspector_surface_toggle_diagonal()
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
game_do_command(
|
2018-07-21 13:51:54 +02:00
|
|
|
TILE_INSPECTOR_SURFACE_TOGGLE_DIAGONAL, GAME_COMMAND_FLAG_APPLY,
|
|
|
|
windowTileInspectorTileX | (windowTileInspectorTileY << 8), 0, GAME_COMMAND_MODIFY_TILE, 0, 0);
|
2017-01-27 14:19:23 +01:00
|
|
|
}
|
|
|
|
|
2018-06-20 17:28:51 +02:00
|
|
|
static void window_tile_inspector_path_set_sloped(int32_t elementIndex, bool sloped)
|
2017-02-06 14:51:45 +01:00
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
game_do_command(
|
2018-07-21 13:51:54 +02:00
|
|
|
TILE_INSPECTOR_PATH_SET_SLOPE, GAME_COMMAND_FLAG_APPLY, windowTileInspectorTileX | (windowTileInspectorTileY << 8),
|
|
|
|
elementIndex, GAME_COMMAND_MODIFY_TILE, sloped, 0);
|
2017-02-06 14:51:45 +01:00
|
|
|
}
|
|
|
|
|
2018-06-20 17:28:51 +02:00
|
|
|
static void window_tile_inspector_path_toggle_edge(int32_t elementIndex, int32_t cornerIndex)
|
2017-01-27 19:12:25 +01:00
|
|
|
{
|
2018-06-22 23:21:44 +02:00
|
|
|
openrct2_assert(elementIndex >= 0 && elementIndex < windowTileInspectorElementCount, "elementIndex out of range");
|
2017-06-06 23:24:18 +02:00
|
|
|
openrct2_assert(cornerIndex >= 0 && cornerIndex < 8, "cornerIndex out of range");
|
|
|
|
game_do_command(
|
2018-07-21 13:51:54 +02:00
|
|
|
TILE_INSPECTOR_PATH_TOGGLE_EDGE, GAME_COMMAND_FLAG_APPLY, windowTileInspectorTileX | (windowTileInspectorTileY << 8),
|
|
|
|
elementIndex, GAME_COMMAND_MODIFY_TILE, cornerIndex, 0);
|
2017-01-27 19:12:25 +01:00
|
|
|
}
|
|
|
|
|
2018-06-20 17:28:51 +02:00
|
|
|
static void window_tile_inspector_entrance_make_usable(int32_t elementIndex)
|
2018-01-13 15:44:10 +01:00
|
|
|
{
|
|
|
|
Guard::ArgumentInRange(elementIndex, 0, windowTileInspectorElementCount - 1);
|
|
|
|
game_do_command(
|
2018-07-21 13:51:54 +02:00
|
|
|
TILE_INSPECTOR_ENTRANCE_MAKE_USABLE, GAME_COMMAND_FLAG_APPLY,
|
|
|
|
windowTileInspectorTileX | (windowTileInspectorTileY << 8), elementIndex, GAME_COMMAND_MODIFY_TILE, 0, 0);
|
2018-01-13 15:44:10 +01:00
|
|
|
}
|
|
|
|
|
2018-06-20 17:28:51 +02:00
|
|
|
static void window_tile_inspector_wall_set_slope(int32_t elementIndex, int32_t slopeValue)
|
2017-02-02 20:06:27 +01:00
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
// Make sure only the correct bits are set
|
2018-09-17 15:18:07 +02:00
|
|
|
openrct2_assert((slopeValue & 3) == slopeValue, "slopeValue doesn't match its mask");
|
2017-06-06 23:24:18 +02:00
|
|
|
|
|
|
|
game_do_command(
|
2018-07-21 13:51:54 +02:00
|
|
|
TILE_INSPECTOR_WALL_SET_SLOPE, GAME_COMMAND_FLAG_APPLY, windowTileInspectorTileX | (windowTileInspectorTileY << 8),
|
|
|
|
elementIndex, GAME_COMMAND_MODIFY_TILE, slopeValue, 0);
|
2017-02-02 20:06:27 +01:00
|
|
|
}
|
|
|
|
|
2018-06-20 17:28:51 +02:00
|
|
|
static void window_tile_inspector_track_block_height_offset(int32_t elementIndex, int8_t heightOffset)
|
2016-11-01 23:43:39 +01:00
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
game_do_command(
|
2018-07-21 13:51:54 +02:00
|
|
|
TILE_INSPECTOR_TRACK_BASE_HEIGHT_OFFSET, GAME_COMMAND_FLAG_APPLY,
|
|
|
|
windowTileInspectorTileX | (windowTileInspectorTileY << 8), elementIndex, GAME_COMMAND_MODIFY_TILE, heightOffset, 0);
|
2016-09-10 22:37:47 +02:00
|
|
|
}
|
|
|
|
|
2018-06-20 17:28:51 +02:00
|
|
|
static void window_tile_inspector_track_block_set_lift(int32_t elementIndex, bool entireTrackBlock, bool chain)
|
2016-11-01 23:43:39 +01:00
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
game_do_command(
|
2018-07-21 13:51:54 +02:00
|
|
|
TILE_INSPECTOR_TRACK_SET_CHAIN, GAME_COMMAND_FLAG_APPLY, windowTileInspectorTileX | (windowTileInspectorTileY << 8),
|
|
|
|
elementIndex, GAME_COMMAND_MODIFY_TILE, entireTrackBlock, chain);
|
2016-09-11 23:02:34 +02:00
|
|
|
}
|
|
|
|
|
2018-06-20 17:28:51 +02:00
|
|
|
static void window_tile_inspector_quarter_tile_set(int32_t elementIndex, const int32_t quarterIndex)
|
2016-11-01 23:43:39 +01:00
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
// quarterIndex is widget index relative to WIDX_SCENERY_CHECK_QUARTER_N, so a value from 0-3
|
|
|
|
openrct2_assert(quarterIndex >= 0 && quarterIndex < 4, "quarterIndex out of range");
|
|
|
|
|
|
|
|
game_do_command(
|
2018-07-21 13:51:54 +02:00
|
|
|
TILE_INSPECTOR_SCENERY_SET_QUARTER_LOCATION, GAME_COMMAND_FLAG_APPLY,
|
|
|
|
windowTileInspectorTileX | (windowTileInspectorTileY << 8), elementIndex, GAME_COMMAND_MODIFY_TILE,
|
|
|
|
(quarterIndex - get_current_rotation()) & 3, 0);
|
2016-09-18 10:29:48 +02:00
|
|
|
}
|
|
|
|
|
2018-06-20 17:28:51 +02:00
|
|
|
static void window_tile_inspector_toggle_quadrant_collosion(int32_t elementIndex, const int32_t quadrantIndex)
|
2017-02-07 15:25:42 +01:00
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
game_do_command(
|
2018-07-21 13:51:54 +02:00
|
|
|
TILE_INSPECTOR_SCENERY_SET_QUARTER_COLLISION, GAME_COMMAND_FLAG_APPLY,
|
|
|
|
windowTileInspectorTileX | (windowTileInspectorTileY << 8), elementIndex, GAME_COMMAND_MODIFY_TILE,
|
|
|
|
(quadrantIndex + 2 - get_current_rotation()) & 3, 0);
|
2017-02-07 15:25:42 +01:00
|
|
|
}
|
|
|
|
|
2018-06-20 17:28:51 +02:00
|
|
|
static void window_tile_inspector_banner_toggle_block(int32_t elementIndex, int32_t edgeIndex)
|
2017-02-07 21:42:39 +01:00
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
openrct2_assert(edgeIndex >= 0 && edgeIndex < 4, "edgeIndex out of range");
|
|
|
|
|
|
|
|
// Make edgeIndex abstract
|
|
|
|
edgeIndex = (edgeIndex - get_current_rotation()) & 3;
|
|
|
|
|
|
|
|
game_do_command(
|
2018-07-21 13:51:54 +02:00
|
|
|
TILE_INSPECTOR_BANNER_TOGGLE_BLOCKING_EDGE, GAME_COMMAND_FLAG_APPLY,
|
|
|
|
windowTileInspectorTileX | (windowTileInspectorTileY << 8), elementIndex, GAME_COMMAND_MODIFY_TILE, edgeIndex, 0);
|
2017-02-07 21:42:39 +01:00
|
|
|
}
|
|
|
|
|
2018-06-20 17:28:51 +02:00
|
|
|
static void window_tile_inspector_clamp_corrupt(int32_t elementIndex)
|
2017-02-07 15:39:07 +01:00
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
game_do_command(
|
2018-07-21 13:51:54 +02:00
|
|
|
TILE_INSPECTOR_CORRUPT_CLAMP, GAME_COMMAND_FLAG_APPLY, windowTileInspectorTileX | (windowTileInspectorTileY << 8),
|
|
|
|
elementIndex, GAME_COMMAND_MODIFY_TILE, 0, 0);
|
2017-02-07 15:39:07 +01:00
|
|
|
}
|
|
|
|
|
2018-06-22 23:21:44 +02:00
|
|
|
static void window_tile_inspector_mouseup(rct_window* w, rct_widgetindex widgetIndex)
|
2016-11-01 23:43:39 +01:00
|
|
|
{
|
2018-06-22 23:21:44 +02:00
|
|
|
switch (widgetIndex)
|
|
|
|
{
|
|
|
|
case WIDX_CLOSE:
|
|
|
|
tool_cancel();
|
|
|
|
window_close(w);
|
|
|
|
break;
|
|
|
|
case WIDX_BUTTON_CORRUPT:
|
|
|
|
window_tile_inspector_insert_corrupt_element(windowTileInspectorSelectedIndex);
|
|
|
|
break;
|
|
|
|
case WIDX_BUTTON_REMOVE:
|
|
|
|
{
|
|
|
|
int32_t nextItemToSelect = windowTileInspectorSelectedIndex - 1;
|
|
|
|
window_tile_inspector_remove_element(windowTileInspectorSelectedIndex);
|
|
|
|
window_tile_inspector_select_element_from_list(w, nextItemToSelect);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case WIDX_BUTTON_ROTATE:
|
|
|
|
window_tile_inspector_rotate_element(windowTileInspectorSelectedIndex);
|
|
|
|
break;
|
|
|
|
case WIDX_BUTTON_SORT:
|
|
|
|
window_tile_inspector_sort_elements();
|
|
|
|
break;
|
|
|
|
case WIDX_BUTTON_COPY:
|
|
|
|
window_tile_inspector_copy_element(w);
|
|
|
|
break;
|
|
|
|
case WIDX_BUTTON_PASTE:
|
|
|
|
window_tile_inspector_paste_element(w);
|
|
|
|
break;
|
|
|
|
case WIDX_BUTTON_MOVE_DOWN:
|
|
|
|
window_tile_inspector_swap_elements(windowTileInspectorSelectedIndex, windowTileInspectorSelectedIndex + 1);
|
|
|
|
break;
|
|
|
|
case WIDX_BUTTON_MOVE_UP:
|
|
|
|
window_tile_inspector_swap_elements(windowTileInspectorSelectedIndex - 1, windowTileInspectorSelectedIndex);
|
|
|
|
break;
|
2017-06-06 23:24:18 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
// Only element-specific widgets from now on
|
2018-06-22 23:21:44 +02:00
|
|
|
if (w->page == TILE_INSPECTOR_PAGE_DEFAULT || windowTileInspectorSelectedIndex == -1)
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Get the selected map element
|
2018-06-22 23:21:44 +02:00
|
|
|
rct_tile_element* const tileElement = window_tile_inspector_get_selected_element(w);
|
2017-06-06 23:24:18 +02:00
|
|
|
|
|
|
|
// Page widgets
|
2018-06-22 23:21:44 +02:00
|
|
|
switch (w->page)
|
|
|
|
{
|
|
|
|
case TILE_INSPECTOR_PAGE_SURFACE:
|
|
|
|
switch (widgetIndex)
|
|
|
|
{
|
|
|
|
case WIDX_SURFACE_BUTTON_REMOVE_FENCES:
|
|
|
|
window_tile_inspector_surface_show_park_fences(false);
|
|
|
|
break;
|
|
|
|
case WIDX_SURFACE_BUTTON_RESTORE_FENCES:
|
|
|
|
window_tile_inspector_surface_show_park_fences(true);
|
|
|
|
break;
|
|
|
|
case WIDX_SURFACE_CHECK_CORNER_N:
|
|
|
|
case WIDX_SURFACE_CHECK_CORNER_E:
|
|
|
|
case WIDX_SURFACE_CHECK_CORNER_S:
|
|
|
|
case WIDX_SURFACE_CHECK_CORNER_W:
|
|
|
|
window_tile_inspector_surface_toggle_corner(
|
|
|
|
((widgetIndex - WIDX_SURFACE_CHECK_CORNER_N) + 2 - get_current_rotation()) & 3);
|
|
|
|
break;
|
|
|
|
case WIDX_SURFACE_CHECK_DIAGONAL:
|
|
|
|
window_tile_inspector_surface_toggle_diagonal();
|
|
|
|
break;
|
|
|
|
} // switch widgetindex
|
2017-06-06 23:24:18 +02:00
|
|
|
break;
|
|
|
|
|
2018-06-22 23:21:44 +02:00
|
|
|
case TILE_INSPECTOR_PAGE_PATH:
|
|
|
|
switch (widgetIndex)
|
|
|
|
{
|
|
|
|
case WIDX_PATH_CHECK_SLOPED:
|
|
|
|
window_tile_inspector_path_set_sloped(
|
2018-09-16 16:17:35 +02:00
|
|
|
windowTileInspectorSelectedIndex, !tileElement->AsPath()->IsSloped());
|
2018-06-22 23:21:44 +02:00
|
|
|
break;
|
|
|
|
case WIDX_PATH_CHECK_EDGE_E:
|
|
|
|
case WIDX_PATH_CHECK_EDGE_S:
|
|
|
|
case WIDX_PATH_CHECK_EDGE_W:
|
|
|
|
case WIDX_PATH_CHECK_EDGE_N:
|
|
|
|
{
|
|
|
|
// 0 = east/right, 1 = south/bottom, 2 = west/left, 3 = north/top
|
|
|
|
const int32_t eswn = (widgetIndex - WIDX_PATH_CHECK_EDGE_E) / 2;
|
|
|
|
// Transform to world orientation
|
|
|
|
const int32_t index = (eswn - get_current_rotation()) & 3;
|
|
|
|
window_tile_inspector_path_toggle_edge(
|
|
|
|
windowTileInspectorSelectedIndex,
|
|
|
|
index + 4); // The corners are stored in the 4 most significant bits, hence the + 4
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case WIDX_PATH_CHECK_EDGE_NE:
|
|
|
|
case WIDX_PATH_CHECK_EDGE_SE:
|
|
|
|
case WIDX_PATH_CHECK_EDGE_SW:
|
|
|
|
case WIDX_PATH_CHECK_EDGE_NW:
|
|
|
|
{
|
|
|
|
// 0 = NE, 1 = SE, 2 = SW, 3 = NW
|
|
|
|
const int32_t neseswnw = (widgetIndex - WIDX_PATH_CHECK_EDGE_NE) / 2;
|
|
|
|
// Transform to world orientation
|
|
|
|
const int32_t index = (neseswnw - get_current_rotation()) & 3;
|
|
|
|
window_tile_inspector_path_toggle_edge(windowTileInspectorSelectedIndex, index);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
} // switch widget index
|
2017-06-06 23:24:18 +02:00
|
|
|
break;
|
2018-06-22 23:21:44 +02:00
|
|
|
|
|
|
|
case TILE_INSPECTOR_PAGE_TRACK:
|
|
|
|
switch (widgetIndex)
|
|
|
|
{
|
|
|
|
case WIDX_TRACK_CHECK_APPLY_TO_ALL:
|
|
|
|
windowTileInspectorApplyToAll ^= 1;
|
|
|
|
widget_invalidate(w, widgetIndex);
|
|
|
|
break;
|
|
|
|
case WIDX_TRACK_CHECK_CHAIN_LIFT:
|
|
|
|
{
|
|
|
|
bool entireTrackBlock = widget_is_pressed(w, WIDX_TRACK_CHECK_APPLY_TO_ALL);
|
2018-09-18 13:01:09 +02:00
|
|
|
bool newLift = !tileElement->AsTrack()->HasChain();
|
2018-06-22 23:21:44 +02:00
|
|
|
window_tile_inspector_track_block_set_lift(windowTileInspectorSelectedIndex, entireTrackBlock, newLift);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
} // switch widget index
|
2017-06-06 23:24:18 +02:00
|
|
|
break;
|
2018-06-22 23:21:44 +02:00
|
|
|
|
|
|
|
case TILE_INSPECTOR_PAGE_SCENERY:
|
|
|
|
switch (widgetIndex)
|
|
|
|
{
|
|
|
|
case WIDX_SCENERY_CHECK_QUARTER_N:
|
|
|
|
case WIDX_SCENERY_CHECK_QUARTER_E:
|
|
|
|
case WIDX_SCENERY_CHECK_QUARTER_S:
|
|
|
|
case WIDX_SCENERY_CHECK_QUARTER_W:
|
|
|
|
window_tile_inspector_quarter_tile_set(
|
|
|
|
windowTileInspectorSelectedIndex, widgetIndex - WIDX_SCENERY_CHECK_QUARTER_N);
|
|
|
|
break;
|
|
|
|
case WIDX_SCENERY_CHECK_COLLISION_N:
|
|
|
|
case WIDX_SCENERY_CHECK_COLLISION_E:
|
|
|
|
case WIDX_SCENERY_CHECK_COLLISION_S:
|
|
|
|
case WIDX_SCENERY_CHECK_COLLISION_W:
|
|
|
|
window_tile_inspector_toggle_quadrant_collosion(
|
|
|
|
windowTileInspectorSelectedIndex, widgetIndex - WIDX_SCENERY_CHECK_COLLISION_N);
|
|
|
|
break;
|
|
|
|
} // switch widget index
|
2017-06-06 23:24:18 +02:00
|
|
|
break;
|
|
|
|
|
2018-06-22 23:21:44 +02:00
|
|
|
case TILE_INSPECTOR_PAGE_ENTRANCE:
|
|
|
|
switch (widgetIndex)
|
|
|
|
{
|
|
|
|
case WIDX_ENTRANCE_BUTTON_MAKE_USABLE:
|
|
|
|
window_tile_inspector_entrance_make_usable(windowTileInspectorSelectedIndex);
|
|
|
|
break;
|
|
|
|
} // switch widget index
|
2018-01-13 15:44:10 +01:00
|
|
|
break;
|
2018-06-22 23:21:44 +02:00
|
|
|
|
|
|
|
case TILE_INSPECTOR_PAGE_BANNER:
|
|
|
|
switch (widgetIndex)
|
|
|
|
{
|
|
|
|
case WIDX_BANNER_CHECK_BLOCK_NE:
|
|
|
|
case WIDX_BANNER_CHECK_BLOCK_SE:
|
|
|
|
case WIDX_BANNER_CHECK_BLOCK_SW:
|
|
|
|
case WIDX_BANNER_CHECK_BLOCK_NW:
|
|
|
|
window_tile_inspector_banner_toggle_block(
|
|
|
|
windowTileInspectorSelectedIndex, widgetIndex - WIDX_BANNER_CHECK_BLOCK_NE);
|
|
|
|
break;
|
|
|
|
} // switch widget index
|
2017-06-06 23:24:18 +02:00
|
|
|
break;
|
|
|
|
|
2018-06-22 23:21:44 +02:00
|
|
|
case TILE_INSPECTOR_PAGE_CORRUPT:
|
|
|
|
switch (widgetIndex)
|
|
|
|
{
|
|
|
|
case WIDX_CORRUPT_BUTTON_CLAMP:
|
|
|
|
window_tile_inspector_clamp_corrupt(windowTileInspectorSelectedIndex);
|
|
|
|
break;
|
|
|
|
} // switch widget index
|
2017-06-06 23:24:18 +02:00
|
|
|
break;
|
|
|
|
} // switch page
|
2015-06-01 03:33:56 +02:00
|
|
|
}
|
|
|
|
|
2018-06-22 23:21:44 +02:00
|
|
|
static void window_tile_inspector_resize(rct_window* w)
|
2016-11-01 23:43:39 +01:00
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
w->min_width = WW;
|
|
|
|
w->min_height = MIN_WH;
|
2018-06-22 23:21:44 +02:00
|
|
|
if (w->width < w->min_width)
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
window_invalidate(w);
|
|
|
|
w->width = w->min_width;
|
|
|
|
}
|
2018-06-22 23:21:44 +02:00
|
|
|
if (w->height < w->min_height)
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
window_invalidate(w);
|
|
|
|
w->height = w->min_height;
|
|
|
|
}
|
2015-06-01 03:33:56 +02:00
|
|
|
}
|
|
|
|
|
2018-06-22 23:21:44 +02:00
|
|
|
static void window_tile_inspector_mousedown(rct_window* w, rct_widgetindex widgetIndex, rct_widget* widget)
|
2016-11-01 23:43:39 +01:00
|
|
|
{
|
2018-06-10 18:55:44 +02:00
|
|
|
switch (widgetIndex)
|
|
|
|
{
|
|
|
|
case WIDX_SPINNER_X_INCREASE:
|
2018-06-20 17:28:51 +02:00
|
|
|
windowTileInspectorTileX = std::min<uint32_t>(windowTileInspectorTileX + 1, MAXIMUM_MAP_SIZE_TECHNICAL - 1);
|
2018-06-10 18:55:44 +02:00
|
|
|
window_tile_inspector_load_tile(w, nullptr);
|
2017-06-06 23:24:18 +02:00
|
|
|
break;
|
2018-06-10 18:55:44 +02:00
|
|
|
case WIDX_SPINNER_X_DECREASE:
|
2018-06-20 17:28:51 +02:00
|
|
|
windowTileInspectorTileX = std::max<uint32_t>(windowTileInspectorTileX - 1, 0);
|
2018-06-10 18:55:44 +02:00
|
|
|
window_tile_inspector_load_tile(w, nullptr);
|
|
|
|
break;
|
|
|
|
case WIDX_SPINNER_Y_INCREASE:
|
2018-06-20 17:28:51 +02:00
|
|
|
windowTileInspectorTileY = std::min<uint32_t>(windowTileInspectorTileY + 1, MAXIMUM_MAP_SIZE_TECHNICAL - 1);
|
2018-06-10 18:55:44 +02:00
|
|
|
window_tile_inspector_load_tile(w, nullptr);
|
|
|
|
break;
|
|
|
|
case WIDX_SPINNER_Y_DECREASE:
|
2018-06-20 17:28:51 +02:00
|
|
|
windowTileInspectorTileY = std::max<uint32_t>(windowTileInspectorTileY - 1, 0);
|
2018-06-10 18:55:44 +02:00
|
|
|
window_tile_inspector_load_tile(w, nullptr);
|
|
|
|
break;
|
|
|
|
} // switch widget index
|
|
|
|
|
|
|
|
// Only element-specific widgets from now on
|
2018-06-11 01:09:00 +02:00
|
|
|
if (w->page == TILE_INSPECTOR_PAGE_DEFAULT || windowTileInspectorSelectedIndex == -1)
|
2018-06-10 18:55:44 +02:00
|
|
|
{
|
|
|
|
return;
|
2017-06-06 23:24:18 +02:00
|
|
|
}
|
2018-06-10 18:55:44 +02:00
|
|
|
|
|
|
|
switch (w->page)
|
|
|
|
{
|
|
|
|
case TILE_INSPECTOR_PAGE_SURFACE:
|
|
|
|
switch (widgetIndex)
|
|
|
|
{
|
|
|
|
case WIDX_SURFACE_SPINNER_HEIGHT_INCREASE:
|
2018-06-11 01:09:00 +02:00
|
|
|
window_tile_inspector_base_height_offset(windowTileInspectorSelectedIndex, 1);
|
2018-06-10 18:55:44 +02:00
|
|
|
break;
|
|
|
|
case WIDX_SURFACE_SPINNER_HEIGHT_DECREASE:
|
2018-06-11 01:09:00 +02:00
|
|
|
window_tile_inspector_base_height_offset(windowTileInspectorSelectedIndex, -1);
|
2018-06-10 18:55:44 +02:00
|
|
|
break;
|
|
|
|
} // switch widget index
|
|
|
|
break;
|
|
|
|
|
|
|
|
case TILE_INSPECTOR_PAGE_PATH:
|
|
|
|
switch (widgetIndex)
|
|
|
|
{
|
|
|
|
case WIDX_PATH_SPINNER_HEIGHT_INCREASE:
|
2018-06-11 01:09:00 +02:00
|
|
|
window_tile_inspector_base_height_offset(windowTileInspectorSelectedIndex, 1);
|
2018-06-10 18:55:44 +02:00
|
|
|
break;
|
|
|
|
case WIDX_PATH_SPINNER_HEIGHT_DECREASE:
|
2018-06-11 01:09:00 +02:00
|
|
|
window_tile_inspector_base_height_offset(windowTileInspectorSelectedIndex, -1);
|
2018-06-10 18:55:44 +02:00
|
|
|
break;
|
|
|
|
} // switch widget index
|
|
|
|
break;
|
|
|
|
|
|
|
|
case TILE_INSPECTOR_PAGE_TRACK:
|
|
|
|
switch (widgetIndex)
|
|
|
|
{
|
|
|
|
case WIDX_TRACK_SPINNER_HEIGHT_INCREASE:
|
|
|
|
if (widget_is_pressed(w, WIDX_TRACK_CHECK_APPLY_TO_ALL))
|
|
|
|
{
|
2018-06-11 01:09:00 +02:00
|
|
|
window_tile_inspector_track_block_height_offset(windowTileInspectorSelectedIndex, 1);
|
2018-06-10 18:55:44 +02:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2018-06-11 01:09:00 +02:00
|
|
|
window_tile_inspector_base_height_offset(windowTileInspectorSelectedIndex, 1);
|
2018-06-10 18:55:44 +02:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
case WIDX_TRACK_SPINNER_HEIGHT_DECREASE:
|
|
|
|
if (widget_is_pressed(w, WIDX_TRACK_CHECK_APPLY_TO_ALL))
|
|
|
|
{
|
2018-06-11 01:09:00 +02:00
|
|
|
window_tile_inspector_track_block_height_offset(windowTileInspectorSelectedIndex, -1);
|
2018-06-10 18:55:44 +02:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2018-06-11 01:09:00 +02:00
|
|
|
window_tile_inspector_base_height_offset(windowTileInspectorSelectedIndex, -1);
|
2018-06-10 18:55:44 +02:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
} // switch widget index
|
|
|
|
break;
|
|
|
|
|
|
|
|
case TILE_INSPECTOR_PAGE_SCENERY:
|
|
|
|
switch (widgetIndex)
|
|
|
|
{
|
|
|
|
case WIDX_SCENERY_SPINNER_HEIGHT_INCREASE:
|
2018-06-11 01:09:00 +02:00
|
|
|
window_tile_inspector_base_height_offset(windowTileInspectorSelectedIndex, 1);
|
2018-06-10 18:55:44 +02:00
|
|
|
break;
|
|
|
|
case WIDX_SCENERY_SPINNER_HEIGHT_DECREASE:
|
2018-06-11 01:09:00 +02:00
|
|
|
window_tile_inspector_base_height_offset(windowTileInspectorSelectedIndex, -1);
|
2018-06-10 18:55:44 +02:00
|
|
|
break;
|
|
|
|
} // switch widget index
|
|
|
|
break;
|
|
|
|
|
|
|
|
case TILE_INSPECTOR_PAGE_ENTRANCE:
|
|
|
|
switch (widgetIndex)
|
|
|
|
{
|
|
|
|
case WIDX_ENTRANCE_SPINNER_HEIGHT_INCREASE:
|
2018-06-11 01:09:00 +02:00
|
|
|
window_tile_inspector_base_height_offset(windowTileInspectorSelectedIndex, 1);
|
2018-06-10 18:55:44 +02:00
|
|
|
break;
|
|
|
|
case WIDX_ENTRANCE_SPINNER_HEIGHT_DECREASE:
|
2018-06-11 01:09:00 +02:00
|
|
|
window_tile_inspector_base_height_offset(windowTileInspectorSelectedIndex, -1);
|
2018-06-10 18:55:44 +02:00
|
|
|
break;
|
2018-06-22 23:21:44 +02:00
|
|
|
case WIDX_ENTRANCE_BUTTON_MAKE_USABLE:
|
|
|
|
window_tile_inspector_entrance_make_usable(windowTileInspectorSelectedIndex);
|
|
|
|
break;
|
2018-06-10 18:55:44 +02:00
|
|
|
} // switch widget index
|
|
|
|
break;
|
|
|
|
|
|
|
|
case TILE_INSPECTOR_PAGE_WALL:
|
|
|
|
switch (widgetIndex)
|
|
|
|
{
|
|
|
|
case WIDX_WALL_SPINNER_HEIGHT_INCREASE:
|
2018-06-11 01:09:00 +02:00
|
|
|
window_tile_inspector_base_height_offset(windowTileInspectorSelectedIndex, 1);
|
2018-06-10 18:55:44 +02:00
|
|
|
break;
|
|
|
|
case WIDX_WALL_SPINNER_HEIGHT_DECREASE:
|
2018-06-11 01:09:00 +02:00
|
|
|
window_tile_inspector_base_height_offset(windowTileInspectorSelectedIndex, -1);
|
2018-06-10 18:55:44 +02:00
|
|
|
break;
|
|
|
|
case WIDX_WALL_DROPDOWN_SLOPE_BUTTON:
|
|
|
|
// Use dropdown instead of dropdown button
|
|
|
|
widget--;
|
|
|
|
|
|
|
|
// Fill dropdown list
|
|
|
|
gDropdownItemsFormat[0] = STR_DROPDOWN_MENU_LABEL;
|
|
|
|
gDropdownItemsFormat[1] = STR_DROPDOWN_MENU_LABEL;
|
|
|
|
gDropdownItemsFormat[2] = STR_DROPDOWN_MENU_LABEL;
|
|
|
|
gDropdownItemsArgs[0] = STR_TILE_INSPECTOR_WALL_FLAT;
|
|
|
|
gDropdownItemsArgs[1] = STR_TILE_INSPECTOR_WALL_SLOPED_LEFT;
|
|
|
|
gDropdownItemsArgs[2] = STR_TILE_INSPECTOR_WALL_SLOPED_RIGHT;
|
|
|
|
window_dropdown_show_text_custom_width(
|
2018-07-21 13:51:54 +02:00
|
|
|
w->x + widget->left, w->y + widget->top, widget->bottom - widget->top + 1, w->colours[1], 0,
|
|
|
|
DROPDOWN_FLAG_STAY_OPEN, 3, widget->right - widget->left - 3);
|
2018-06-10 18:55:44 +02:00
|
|
|
|
|
|
|
// Set current value as checked
|
|
|
|
rct_tile_element* const tileElement = window_tile_inspector_get_selected_element(w);
|
2018-09-13 15:19:08 +02:00
|
|
|
dropdown_set_checked(tileElement->AsWall()->GetSlope(), true);
|
2018-06-10 18:55:44 +02:00
|
|
|
break;
|
|
|
|
} // switch widget index
|
|
|
|
break;
|
|
|
|
|
|
|
|
case TILE_INSPECTOR_PAGE_LARGE_SCENERY:
|
|
|
|
switch (widgetIndex)
|
|
|
|
{
|
|
|
|
case WIDX_LARGE_SCENERY_SPINNER_HEIGHT_INCREASE:
|
2018-06-11 01:09:00 +02:00
|
|
|
window_tile_inspector_base_height_offset(windowTileInspectorSelectedIndex, 1);
|
2018-06-10 18:55:44 +02:00
|
|
|
break;
|
|
|
|
case WIDX_LARGE_SCENERY_SPINNER_HEIGHT_DECREASE:
|
2018-06-11 01:09:00 +02:00
|
|
|
window_tile_inspector_base_height_offset(windowTileInspectorSelectedIndex, -1);
|
2018-06-10 18:55:44 +02:00
|
|
|
break;
|
|
|
|
} // switch widget index
|
|
|
|
break;
|
|
|
|
|
|
|
|
case TILE_INSPECTOR_PAGE_BANNER:
|
|
|
|
switch (widgetIndex)
|
|
|
|
{
|
|
|
|
case WIDX_BANNER_SPINNER_HEIGHT_INCREASE:
|
2018-06-11 01:09:00 +02:00
|
|
|
window_tile_inspector_base_height_offset(windowTileInspectorSelectedIndex, 1);
|
2018-06-10 18:55:44 +02:00
|
|
|
break;
|
|
|
|
case WIDX_BANNER_SPINNER_HEIGHT_DECREASE:
|
2018-06-11 01:09:00 +02:00
|
|
|
window_tile_inspector_base_height_offset(windowTileInspectorSelectedIndex, -1);
|
2018-06-10 18:55:44 +02:00
|
|
|
break;
|
|
|
|
} // switch widget index
|
|
|
|
break;
|
|
|
|
|
|
|
|
case TILE_INSPECTOR_PAGE_CORRUPT:
|
|
|
|
switch (widgetIndex)
|
|
|
|
{
|
|
|
|
case WIDX_CORRUPT_SPINNER_HEIGHT_INCREASE:
|
2018-06-11 01:09:00 +02:00
|
|
|
window_tile_inspector_base_height_offset(windowTileInspectorSelectedIndex, 1);
|
2018-06-10 18:55:44 +02:00
|
|
|
break;
|
|
|
|
case WIDX_CORRUPT_SPINNER_HEIGHT_DECREASE:
|
2018-06-11 01:09:00 +02:00
|
|
|
window_tile_inspector_base_height_offset(windowTileInspectorSelectedIndex, -1);
|
2018-06-10 18:55:44 +02:00
|
|
|
break;
|
|
|
|
} // switch widget index
|
2018-06-22 23:21:44 +02:00
|
|
|
} // switch page
|
2016-10-01 22:57:09 +02:00
|
|
|
}
|
|
|
|
|
2018-06-22 23:21:44 +02:00
|
|
|
static void window_tile_inspector_update(rct_window* w)
|
2016-11-01 23:43:39 +01:00
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
// Check if the mouse is hovering over the list
|
2018-06-22 23:21:44 +02:00
|
|
|
if (!widget_is_highlighted(w, WIDX_LIST))
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
windowTileInspectorHighlightedIndex = -1;
|
|
|
|
widget_invalidate(w, WIDX_LIST);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (gCurrentToolWidget.window_classification != WC_TILE_INSPECTOR)
|
|
|
|
window_close(w);
|
2015-12-28 23:11:36 +01:00
|
|
|
}
|
|
|
|
|
2018-06-22 23:21:44 +02:00
|
|
|
static void window_tile_inspector_dropdown(rct_window* w, rct_widgetindex widgetIndex, int32_t dropdownIndex)
|
2016-11-01 23:43:39 +01:00
|
|
|
{
|
2018-06-22 23:21:44 +02:00
|
|
|
if (dropdownIndex == -1)
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Get selected element
|
2018-06-22 23:21:44 +02:00
|
|
|
rct_tile_element* const tileElement = window_tile_inspector_get_selected_element(w);
|
2017-06-06 23:24:18 +02:00
|
|
|
|
2018-06-22 23:21:44 +02:00
|
|
|
switch (w->page)
|
|
|
|
{
|
|
|
|
case TILE_INSPECTOR_PAGE_WALL:
|
|
|
|
openrct2_assert(tileElement->GetType() == TILE_ELEMENT_TYPE_WALL, "Element is not a wall");
|
2017-06-06 23:24:18 +02:00
|
|
|
|
2018-06-22 23:21:44 +02:00
|
|
|
switch (widgetIndex)
|
|
|
|
{
|
|
|
|
case WIDX_WALL_DROPDOWN_SLOPE_BUTTON:
|
2018-09-17 15:18:07 +02:00
|
|
|
window_tile_inspector_wall_set_slope(windowTileInspectorSelectedIndex, dropdownIndex);
|
2018-06-22 23:21:44 +02:00
|
|
|
break;
|
|
|
|
}
|
2017-06-06 23:24:18 +02:00
|
|
|
break;
|
|
|
|
}
|
2016-10-01 22:57:09 +02:00
|
|
|
}
|
|
|
|
|
2018-06-20 17:28:51 +02:00
|
|
|
static void window_tile_inspector_tool_update(rct_window* w, rct_widgetindex widgetIndex, int32_t x, int32_t y)
|
2016-11-01 23:43:39 +01:00
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
map_invalidate_selection_rect();
|
|
|
|
|
|
|
|
gMapSelectFlags |= MAP_SELECT_FLAG_ENABLE;
|
|
|
|
|
2018-06-20 17:28:51 +02:00
|
|
|
int16_t mapX = x;
|
|
|
|
int16_t mapY = y;
|
2018-05-21 22:34:42 +02:00
|
|
|
rct_tile_element* clickedElement = nullptr;
|
|
|
|
if (input_test_place_object_modifier(PLACE_OBJECT_MODIFIER_COPY_Z))
|
|
|
|
{
|
|
|
|
get_map_coordinates_from_pos(x, y, ViewportInteractionFlags, &mapX, &mapY, nullptr, &clickedElement, nullptr);
|
|
|
|
}
|
|
|
|
|
|
|
|
// Even if Ctrl was pressed, fall back to normal selection when there was nothing under the cursor
|
|
|
|
if (clickedElement == nullptr)
|
|
|
|
{
|
|
|
|
screen_pos_to_map_pos(&mapX, &mapY, nullptr);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (mapX != LOCATION_NULL)
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
gMapSelectPositionA.x = gMapSelectPositionB.x = mapX;
|
|
|
|
gMapSelectPositionA.y = gMapSelectPositionB.y = mapY;
|
|
|
|
}
|
2018-05-21 22:34:42 +02:00
|
|
|
else if (windowTileInspectorTileSelected)
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
gMapSelectPositionA.x = gMapSelectPositionB.x = windowTileInspectorTileX << 5;
|
|
|
|
gMapSelectPositionA.y = gMapSelectPositionB.y = windowTileInspectorTileY << 5;
|
|
|
|
}
|
2018-05-21 22:34:42 +02:00
|
|
|
else
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
gMapSelectFlags &= ~MAP_SELECT_FLAG_ENABLE;
|
|
|
|
}
|
|
|
|
|
|
|
|
gMapSelectType = MAP_SELECT_TYPE_FULL;
|
|
|
|
map_invalidate_selection_rect();
|
2015-06-01 03:33:56 +02:00
|
|
|
}
|
|
|
|
|
2018-06-20 17:28:51 +02:00
|
|
|
static void window_tile_inspector_update_selected_tile(rct_window* w, int32_t x, int32_t y)
|
2016-11-01 23:43:39 +01:00
|
|
|
{
|
2018-05-21 22:34:42 +02:00
|
|
|
const bool ctrlIsHeldDown = input_test_place_object_modifier(PLACE_OBJECT_MODIFIER_COPY_Z);
|
|
|
|
|
2017-06-06 23:24:18 +02:00
|
|
|
// Mouse hasn't moved
|
2018-05-21 22:34:42 +02:00
|
|
|
if (x == windowTileInspectorToolMouseX && y == windowTileInspectorToolMouseY
|
|
|
|
&& windowTileInspectorToolCtrlDown == ctrlIsHeldDown)
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
return;
|
|
|
|
}
|
2018-05-21 22:34:42 +02:00
|
|
|
|
2017-06-06 23:24:18 +02:00
|
|
|
windowTileInspectorToolMouseX = x;
|
|
|
|
windowTileInspectorToolMouseY = y;
|
2018-05-21 22:34:42 +02:00
|
|
|
windowTileInspectorToolCtrlDown = ctrlIsHeldDown;
|
2017-06-06 23:24:18 +02:00
|
|
|
|
2018-06-20 17:28:51 +02:00
|
|
|
int16_t mapX = x;
|
|
|
|
int16_t mapY = y;
|
2018-05-21 22:34:42 +02:00
|
|
|
rct_tile_element* clickedElement = nullptr;
|
|
|
|
if (ctrlIsHeldDown)
|
|
|
|
{
|
|
|
|
get_map_coordinates_from_pos(x, y, ViewportInteractionFlags, &mapX, &mapY, nullptr, &clickedElement, nullptr);
|
2017-06-06 23:24:18 +02:00
|
|
|
}
|
|
|
|
|
2018-05-21 22:34:42 +02:00
|
|
|
// Even if Ctrl was pressed, fall back to normal selection when there was nothing under the cursor
|
|
|
|
if (clickedElement == nullptr)
|
|
|
|
{
|
|
|
|
screen_pos_to_map_pos(&mapX, &mapY, nullptr);
|
|
|
|
|
|
|
|
if (mapX == LOCATION_NULL)
|
|
|
|
{
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Tile is already selected
|
|
|
|
if (windowTileInspectorTileSelected && mapX == windowTileInspectorToolMapX && mapY == windowTileInspectorToolMapY)
|
|
|
|
{
|
|
|
|
return;
|
|
|
|
}
|
2017-06-06 23:24:18 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
windowTileInspectorTileSelected = true;
|
|
|
|
windowTileInspectorToolMapX = mapX;
|
|
|
|
windowTileInspectorToolMapY = mapY;
|
|
|
|
windowTileInspectorTileX = mapX >> 5;
|
|
|
|
windowTileInspectorTileY = mapY >> 5;
|
|
|
|
|
2018-05-21 22:34:42 +02:00
|
|
|
window_tile_inspector_load_tile(w, clickedElement);
|
2015-06-01 03:33:56 +02:00
|
|
|
}
|
|
|
|
|
2018-06-20 17:28:51 +02:00
|
|
|
static void window_tile_inspector_tool_down(rct_window* w, rct_widgetindex widgetIndex, int32_t x, int32_t y)
|
2017-01-09 20:30:42 +01:00
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
window_tile_inspector_update_selected_tile(w, x, y);
|
2017-01-09 20:30:42 +01:00
|
|
|
}
|
|
|
|
|
2018-06-20 17:28:51 +02:00
|
|
|
static void window_tile_inspector_tool_drag(rct_window* w, rct_widgetindex widgetIndex, int32_t x, int32_t y)
|
2017-01-09 20:30:42 +01:00
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
window_tile_inspector_update_selected_tile(w, x, y);
|
2017-01-09 20:30:42 +01:00
|
|
|
}
|
|
|
|
|
2018-06-22 23:21:44 +02:00
|
|
|
static void window_tile_inspector_scrollgetsize(rct_window* w, int32_t scrollIndex, int32_t* width, int32_t* height)
|
2016-11-01 23:43:39 +01:00
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
*width = WW - 30;
|
2018-05-26 01:19:31 +02:00
|
|
|
*height = windowTileInspectorElementCount * SCROLLABLE_ROW_HEIGHT;
|
2015-12-28 23:11:36 +01:00
|
|
|
}
|
|
|
|
|
2018-06-22 23:21:44 +02:00
|
|
|
static void window_tile_inspector_set_page(rct_window* w, const TILE_INSPECTOR_PAGE page)
|
2016-11-01 23:43:39 +01:00
|
|
|
{
|
2018-05-21 14:09:18 +02:00
|
|
|
// Invalidate the window already, because the size may change
|
|
|
|
window_invalidate(w);
|
|
|
|
|
|
|
|
// subtract current page height, then add new page height
|
|
|
|
if (w->page != TILE_INSPECTOR_PAGE_DEFAULT)
|
|
|
|
{
|
|
|
|
w->height -= PageGroupBoxSettings[w->page - 1].details_top_offset - GROUPBOX_PADDING - 3;
|
|
|
|
w->min_height -= PageGroupBoxSettings[w->page - 1].details_top_offset - GROUPBOX_PADDING - 3;
|
|
|
|
}
|
|
|
|
if (page != TILE_INSPECTOR_PAGE_DEFAULT)
|
|
|
|
{
|
|
|
|
w->height += PageGroupBoxSettings[page - 1].details_top_offset - GROUPBOX_PADDING - 3;
|
|
|
|
w->min_height += PageGroupBoxSettings[page - 1].details_top_offset - GROUPBOX_PADDING - 3;
|
|
|
|
}
|
2017-06-06 23:24:18 +02:00
|
|
|
w->page = page;
|
|
|
|
w->widgets = PageWidgets[page];
|
|
|
|
w->enabled_widgets = PageEnabledWidgets[page];
|
2018-06-10 18:55:44 +02:00
|
|
|
w->hold_down_widgets = PageHoldDownWidgets[page];
|
2017-06-06 23:24:18 +02:00
|
|
|
w->disabled_widgets = PageDisabledWidgets[page];
|
2018-05-21 19:51:12 +02:00
|
|
|
w->pressed_widgets = 0;
|
2016-06-11 19:39:51 +02:00
|
|
|
}
|
|
|
|
|
2018-06-22 23:21:44 +02:00
|
|
|
static void window_tile_inspector_scrollmousedown(rct_window* w, int32_t scrollIndex, int32_t x, int32_t y)
|
2018-05-21 19:11:14 +02:00
|
|
|
{
|
|
|
|
// Because the list items are displayed in reverse order, subtract the calculated index from the amount of elements
|
2018-06-20 17:28:51 +02:00
|
|
|
const int16_t index = windowTileInspectorElementCount - (y - 1) / SCROLLABLE_ROW_HEIGHT - 1;
|
2018-05-21 19:11:14 +02:00
|
|
|
window_tile_inspector_select_element_from_list(w, index);
|
|
|
|
}
|
|
|
|
|
2018-06-22 23:21:44 +02:00
|
|
|
static void window_tile_inspector_scrollmouseover(rct_window* w, int32_t scrollIndex, int32_t x, int32_t y)
|
2018-05-21 19:11:14 +02:00
|
|
|
{
|
2018-06-20 17:28:51 +02:00
|
|
|
int16_t index = windowTileInspectorElementCount - (y - 1) / SCROLLABLE_ROW_HEIGHT - 1;
|
2018-05-21 19:11:14 +02:00
|
|
|
if (index < 0 || index >= windowTileInspectorElementCount)
|
|
|
|
windowTileInspectorHighlightedIndex = -1;
|
|
|
|
else
|
|
|
|
windowTileInspectorHighlightedIndex = index;
|
|
|
|
|
|
|
|
widget_invalidate(w, WIDX_LIST);
|
|
|
|
}
|
|
|
|
|
2018-06-22 23:21:44 +02:00
|
|
|
static void window_tile_inspector_invalidate(rct_window* w)
|
2016-11-01 23:43:39 +01:00
|
|
|
{
|
2018-05-21 19:11:14 +02:00
|
|
|
// Set the correct page automatically
|
|
|
|
TILE_INSPECTOR_PAGE page = TILE_INSPECTOR_PAGE_DEFAULT;
|
2018-06-11 01:09:00 +02:00
|
|
|
if (windowTileInspectorSelectedIndex != -1)
|
2018-05-21 19:11:14 +02:00
|
|
|
{
|
|
|
|
const auto element = window_tile_inspector_get_selected_element(w);
|
|
|
|
auto type = element->GetType();
|
|
|
|
switch (type)
|
|
|
|
{
|
2018-06-22 23:21:44 +02:00
|
|
|
case TILE_ELEMENT_TYPE_SURFACE:
|
|
|
|
page = TILE_INSPECTOR_PAGE_SURFACE;
|
|
|
|
break;
|
|
|
|
case TILE_ELEMENT_TYPE_PATH:
|
|
|
|
page = TILE_INSPECTOR_PAGE_PATH;
|
|
|
|
break;
|
|
|
|
case TILE_ELEMENT_TYPE_TRACK:
|
|
|
|
page = TILE_INSPECTOR_PAGE_TRACK;
|
|
|
|
break;
|
|
|
|
case TILE_ELEMENT_TYPE_SMALL_SCENERY:
|
|
|
|
page = TILE_INSPECTOR_PAGE_SCENERY;
|
|
|
|
break;
|
|
|
|
case TILE_ELEMENT_TYPE_ENTRANCE:
|
|
|
|
page = TILE_INSPECTOR_PAGE_ENTRANCE;
|
|
|
|
break;
|
|
|
|
case TILE_ELEMENT_TYPE_WALL:
|
|
|
|
page = TILE_INSPECTOR_PAGE_WALL;
|
|
|
|
break;
|
|
|
|
case TILE_ELEMENT_TYPE_LARGE_SCENERY:
|
|
|
|
page = TILE_INSPECTOR_PAGE_LARGE_SCENERY;
|
|
|
|
break;
|
|
|
|
case TILE_ELEMENT_TYPE_BANNER:
|
|
|
|
page = TILE_INSPECTOR_PAGE_BANNER;
|
|
|
|
break;
|
2018-05-21 19:11:14 +02:00
|
|
|
case TILE_ELEMENT_TYPE_CORRUPT:
|
|
|
|
default:
|
|
|
|
page = TILE_INSPECTOR_PAGE_CORRUPT;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (w->page != page)
|
|
|
|
{
|
|
|
|
window_tile_inspector_set_page(w, page);
|
|
|
|
window_invalidate(w);
|
|
|
|
}
|
|
|
|
|
2017-06-06 23:24:18 +02:00
|
|
|
// X and Y spinners
|
2018-06-22 23:21:44 +02:00
|
|
|
widget_set_enabled(
|
2018-07-21 13:51:54 +02:00
|
|
|
w, WIDX_SPINNER_X_INCREASE,
|
2018-06-22 23:21:44 +02:00
|
|
|
(windowTileInspectorTileSelected && (windowTileInspectorTileX < MAXIMUM_MAP_SIZE_TECHNICAL - 1)));
|
2017-06-06 23:24:18 +02:00
|
|
|
widget_set_enabled(w, WIDX_SPINNER_X_DECREASE, (windowTileInspectorTileSelected && (windowTileInspectorTileX > 0)));
|
2018-06-22 23:21:44 +02:00
|
|
|
widget_set_enabled(
|
2018-07-21 13:51:54 +02:00
|
|
|
w, WIDX_SPINNER_Y_INCREASE,
|
2018-06-22 23:21:44 +02:00
|
|
|
(windowTileInspectorTileSelected && (windowTileInspectorTileY < MAXIMUM_MAP_SIZE_TECHNICAL - 1)));
|
2017-06-06 23:24:18 +02:00
|
|
|
widget_set_enabled(w, WIDX_SPINNER_Y_DECREASE, (windowTileInspectorTileSelected && (windowTileInspectorTileY > 0)));
|
|
|
|
|
|
|
|
// Sort buttons
|
|
|
|
widget_set_enabled(w, WIDX_BUTTON_SORT, (windowTileInspectorTileSelected && windowTileInspectorElementCount > 1));
|
|
|
|
|
|
|
|
// Move Up button
|
2018-06-11 01:09:00 +02:00
|
|
|
widget_set_enabled(w, WIDX_BUTTON_MOVE_UP, (windowTileInspectorSelectedIndex > 0));
|
2017-06-06 23:24:18 +02:00
|
|
|
widget_invalidate(w, WIDX_BUTTON_MOVE_UP);
|
|
|
|
|
|
|
|
// Move Down button
|
2018-05-21 19:11:14 +02:00
|
|
|
widget_set_enabled(
|
2018-07-21 13:51:54 +02:00
|
|
|
w, WIDX_BUTTON_MOVE_DOWN,
|
2018-06-22 23:21:44 +02:00
|
|
|
(windowTileInspectorSelectedIndex != -1 && windowTileInspectorSelectedIndex < windowTileInspectorElementCount - 1));
|
2017-06-06 23:24:18 +02:00
|
|
|
widget_invalidate(w, WIDX_BUTTON_MOVE_DOWN);
|
|
|
|
|
|
|
|
// Copy button
|
2018-06-11 01:09:00 +02:00
|
|
|
widget_set_enabled(w, WIDX_BUTTON_COPY, windowTileInspectorSelectedIndex >= 0);
|
2017-06-06 23:24:18 +02:00
|
|
|
widget_invalidate(w, WIDX_BUTTON_COPY);
|
|
|
|
|
|
|
|
// Paste button
|
|
|
|
widget_set_enabled(w, WIDX_BUTTON_PASTE, windowTileInspectorTileSelected && windowTileInspectorElementCopied);
|
|
|
|
widget_invalidate(w, WIDX_BUTTON_PASTE);
|
|
|
|
|
|
|
|
w->widgets[WIDX_BACKGROUND].bottom = w->height - 1;
|
|
|
|
|
2018-05-21 14:09:18 +02:00
|
|
|
if (w->page == TILE_INSPECTOR_PAGE_DEFAULT)
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
w->widgets[WIDX_GROUPBOX_DETAILS].type = WWT_EMPTY;
|
|
|
|
w->widgets[WIDX_GROUPBOX_PROPERTIES].type = WWT_EMPTY;
|
|
|
|
w->widgets[WIDX_LIST].bottom = w->height - PADDING_BOTTOM;
|
|
|
|
}
|
2018-05-21 14:09:18 +02:00
|
|
|
else
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
w->widgets[WIDX_GROUPBOX_DETAILS].type = WWT_GROUPBOX;
|
|
|
|
w->widgets[WIDX_GROUPBOX_PROPERTIES].type = WWT_GROUPBOX;
|
2018-05-21 14:09:18 +02:00
|
|
|
w->widgets[WIDX_GROUPBOX_DETAILS].text = PageGroupBoxSettings[w->page - 1].string_id;
|
2017-06-06 23:24:18 +02:00
|
|
|
w->widgets[WIDX_GROUPBOX_DETAILS].top = w->height - PageGroupBoxSettings[w->page - 1].details_top_offset;
|
|
|
|
w->widgets[WIDX_GROUPBOX_DETAILS].bottom = w->height - PageGroupBoxSettings[w->page - 1].details_bottom_offset;
|
|
|
|
w->widgets[WIDX_GROUPBOX_PROPERTIES].top = w->height - PageGroupBoxSettings[w->page - 1].properties_top_offset;
|
|
|
|
w->widgets[WIDX_GROUPBOX_PROPERTIES].bottom = w->height - PageGroupBoxSettings[w->page - 1].properties_bottom_offset;
|
|
|
|
w->widgets[WIDX_LIST].bottom = w->widgets[WIDX_GROUPBOX_DETAILS].top - GROUPBOX_PADDING;
|
|
|
|
}
|
|
|
|
|
2018-05-21 14:09:18 +02:00
|
|
|
// The default page doesn't need further invalidation
|
2018-06-22 23:21:44 +02:00
|
|
|
if (w->page == TILE_INSPECTOR_PAGE_DEFAULT)
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Using a switch, because I don't think giving each page their own callbacks is
|
|
|
|
// needed here, as only the mouseup and invalidate functions are different.
|
2018-06-20 17:28:51 +02:00
|
|
|
const int32_t propertiesAnchor = w->widgets[WIDX_GROUPBOX_PROPERTIES].top;
|
2018-06-22 23:21:44 +02:00
|
|
|
const rct_tile_element* const tileElement = window_tile_inspector_get_selected_element(w);
|
|
|
|
|
|
|
|
switch (w->page)
|
2018-05-21 19:11:14 +02:00
|
|
|
{
|
2018-06-22 23:21:44 +02:00
|
|
|
case TILE_INSPECTOR_PAGE_SURFACE:
|
|
|
|
w->widgets[WIDX_SURFACE_SPINNER_HEIGHT].top = GBBT(propertiesAnchor, 0) + 3;
|
|
|
|
w->widgets[WIDX_SURFACE_SPINNER_HEIGHT].bottom = GBBB(propertiesAnchor, 0) - 3;
|
|
|
|
w->widgets[WIDX_SURFACE_SPINNER_HEIGHT_INCREASE].top = GBBT(propertiesAnchor, 0) + 4;
|
|
|
|
w->widgets[WIDX_SURFACE_SPINNER_HEIGHT_INCREASE].bottom = GBBB(propertiesAnchor, 0) - 4;
|
|
|
|
w->widgets[WIDX_SURFACE_SPINNER_HEIGHT_DECREASE].top = GBBT(propertiesAnchor, 0) + 4;
|
|
|
|
w->widgets[WIDX_SURFACE_SPINNER_HEIGHT_DECREASE].bottom = GBBB(propertiesAnchor, 0) - 4;
|
|
|
|
w->widgets[WIDX_SURFACE_BUTTON_REMOVE_FENCES].top = GBBT(propertiesAnchor, 1);
|
|
|
|
w->widgets[WIDX_SURFACE_BUTTON_REMOVE_FENCES].bottom = GBBB(propertiesAnchor, 1);
|
|
|
|
w->widgets[WIDX_SURFACE_BUTTON_RESTORE_FENCES].top = GBBT(propertiesAnchor, 1);
|
|
|
|
w->widgets[WIDX_SURFACE_BUTTON_RESTORE_FENCES].bottom = GBBB(propertiesAnchor, 1);
|
|
|
|
w->widgets[WIDX_SURFACE_CHECK_CORNER_N].top = GBBT(propertiesAnchor, 2) + 7 * 0;
|
|
|
|
w->widgets[WIDX_SURFACE_CHECK_CORNER_N].bottom = w->widgets[WIDX_SURFACE_CHECK_CORNER_N].top + 13;
|
|
|
|
w->widgets[WIDX_SURFACE_CHECK_CORNER_E].top = GBBT(propertiesAnchor, 2) + 7 * 1;
|
|
|
|
w->widgets[WIDX_SURFACE_CHECK_CORNER_E].bottom = w->widgets[WIDX_SURFACE_CHECK_CORNER_E].top + 13;
|
|
|
|
w->widgets[WIDX_SURFACE_CHECK_CORNER_S].top = GBBT(propertiesAnchor, 2) + 7 * 2;
|
|
|
|
w->widgets[WIDX_SURFACE_CHECK_CORNER_S].bottom = w->widgets[WIDX_SURFACE_CHECK_CORNER_S].top + 13;
|
|
|
|
w->widgets[WIDX_SURFACE_CHECK_CORNER_W].top = GBBT(propertiesAnchor, 2) + 7 * 1;
|
|
|
|
w->widgets[WIDX_SURFACE_CHECK_CORNER_W].bottom = w->widgets[WIDX_SURFACE_CHECK_CORNER_W].top + 13;
|
|
|
|
w->widgets[WIDX_SURFACE_CHECK_DIAGONAL].top = GBBT(propertiesAnchor, 3) + 7 * 1;
|
|
|
|
w->widgets[WIDX_SURFACE_CHECK_DIAGONAL].bottom = w->widgets[WIDX_SURFACE_CHECK_DIAGONAL].top + 13;
|
|
|
|
widget_set_checkbox_value(
|
2018-07-21 13:51:54 +02:00
|
|
|
w, WIDX_SURFACE_CHECK_CORNER_N,
|
2018-09-14 14:54:12 +02:00
|
|
|
tileElement->AsSurface()->GetSlope() & (1 << ((2 - get_current_rotation()) & 3)));
|
2018-06-22 23:21:44 +02:00
|
|
|
widget_set_checkbox_value(
|
2018-07-21 13:51:54 +02:00
|
|
|
w, WIDX_SURFACE_CHECK_CORNER_E,
|
2018-09-14 14:54:12 +02:00
|
|
|
tileElement->AsSurface()->GetSlope() & (1 << ((3 - get_current_rotation()) & 3)));
|
2018-06-22 23:21:44 +02:00
|
|
|
widget_set_checkbox_value(
|
2018-07-21 13:51:54 +02:00
|
|
|
w, WIDX_SURFACE_CHECK_CORNER_S,
|
2018-09-14 14:54:12 +02:00
|
|
|
tileElement->AsSurface()->GetSlope() & (1 << ((0 - get_current_rotation()) & 3)));
|
2018-06-22 23:21:44 +02:00
|
|
|
widget_set_checkbox_value(
|
2018-07-21 13:51:54 +02:00
|
|
|
w, WIDX_SURFACE_CHECK_CORNER_W,
|
2018-09-14 14:54:12 +02:00
|
|
|
tileElement->AsSurface()->GetSlope() & (1 << ((1 - get_current_rotation()) & 3)));
|
2018-06-22 23:21:44 +02:00
|
|
|
widget_set_checkbox_value(
|
2018-09-14 14:54:12 +02:00
|
|
|
w, WIDX_SURFACE_CHECK_DIAGONAL, tileElement->AsSurface()->GetSlope() & TILE_ELEMENT_SLOPE_DOUBLE_HEIGHT);
|
2018-06-22 23:21:44 +02:00
|
|
|
break;
|
|
|
|
case TILE_INSPECTOR_PAGE_PATH:
|
|
|
|
w->widgets[WIDX_PATH_SPINNER_HEIGHT].top = GBBT(propertiesAnchor, 0) + 3;
|
|
|
|
w->widgets[WIDX_PATH_SPINNER_HEIGHT].bottom = GBBB(propertiesAnchor, 0) - 3;
|
|
|
|
w->widgets[WIDX_PATH_SPINNER_HEIGHT_INCREASE].top = GBBT(propertiesAnchor, 0) + 4;
|
|
|
|
w->widgets[WIDX_PATH_SPINNER_HEIGHT_INCREASE].bottom = GBBB(propertiesAnchor, 0) - 4;
|
|
|
|
w->widgets[WIDX_PATH_SPINNER_HEIGHT_DECREASE].top = GBBT(propertiesAnchor, 0) + 4;
|
|
|
|
w->widgets[WIDX_PATH_SPINNER_HEIGHT_DECREASE].bottom = GBBB(propertiesAnchor, 0) - 4;
|
|
|
|
w->widgets[WIDX_PATH_CHECK_SLOPED].top = GBBT(propertiesAnchor, 1) + 2;
|
|
|
|
w->widgets[WIDX_PATH_CHECK_SLOPED].bottom = GBBT(propertiesAnchor, 1) + 15;
|
|
|
|
w->widgets[WIDX_PATH_CHECK_EDGE_N].top = GBBT(propertiesAnchor, 2) + 7 * 0;
|
|
|
|
w->widgets[WIDX_PATH_CHECK_EDGE_N].bottom = w->widgets[WIDX_PATH_CHECK_EDGE_N].top + 13;
|
|
|
|
w->widgets[WIDX_PATH_CHECK_EDGE_NE].top = GBBT(propertiesAnchor, 2) + 7 * 1;
|
|
|
|
w->widgets[WIDX_PATH_CHECK_EDGE_NE].bottom = w->widgets[WIDX_PATH_CHECK_EDGE_NE].top + 13;
|
|
|
|
w->widgets[WIDX_PATH_CHECK_EDGE_E].top = GBBT(propertiesAnchor, 2) + 7 * 2;
|
|
|
|
w->widgets[WIDX_PATH_CHECK_EDGE_E].bottom = w->widgets[WIDX_PATH_CHECK_EDGE_E].top + 13;
|
|
|
|
w->widgets[WIDX_PATH_CHECK_EDGE_SE].top = GBBT(propertiesAnchor, 2) + 7 * 3;
|
|
|
|
w->widgets[WIDX_PATH_CHECK_EDGE_SE].bottom = w->widgets[WIDX_PATH_CHECK_EDGE_SE].top + 13;
|
|
|
|
w->widgets[WIDX_PATH_CHECK_EDGE_S].top = GBBT(propertiesAnchor, 2) + 7 * 4;
|
|
|
|
w->widgets[WIDX_PATH_CHECK_EDGE_S].bottom = w->widgets[WIDX_PATH_CHECK_EDGE_S].top + 13;
|
|
|
|
w->widgets[WIDX_PATH_CHECK_EDGE_SW].top = GBBT(propertiesAnchor, 2) + 7 * 3;
|
|
|
|
w->widgets[WIDX_PATH_CHECK_EDGE_SW].bottom = w->widgets[WIDX_PATH_CHECK_EDGE_SW].top + 13;
|
|
|
|
w->widgets[WIDX_PATH_CHECK_EDGE_W].top = GBBT(propertiesAnchor, 2) + 7 * 2;
|
|
|
|
w->widgets[WIDX_PATH_CHECK_EDGE_W].bottom = w->widgets[WIDX_PATH_CHECK_EDGE_W].top + 13;
|
|
|
|
w->widgets[WIDX_PATH_CHECK_EDGE_NW].top = GBBT(propertiesAnchor, 2) + 7 * 1;
|
|
|
|
w->widgets[WIDX_PATH_CHECK_EDGE_NW].bottom = w->widgets[WIDX_PATH_CHECK_EDGE_NW].top + 13;
|
2018-09-16 16:17:35 +02:00
|
|
|
widget_set_checkbox_value(w, WIDX_PATH_CHECK_SLOPED, tileElement->AsPath()->IsSloped());
|
2018-06-22 23:21:44 +02:00
|
|
|
widget_set_checkbox_value(
|
|
|
|
w, WIDX_PATH_CHECK_EDGE_NE, tileElement->properties.path.edges & (1 << ((0 - get_current_rotation()) & 3)));
|
|
|
|
widget_set_checkbox_value(
|
|
|
|
w, WIDX_PATH_CHECK_EDGE_SE, tileElement->properties.path.edges & (1 << ((1 - get_current_rotation()) & 3)));
|
|
|
|
widget_set_checkbox_value(
|
|
|
|
w, WIDX_PATH_CHECK_EDGE_SW, tileElement->properties.path.edges & (1 << ((2 - get_current_rotation()) & 3)));
|
|
|
|
widget_set_checkbox_value(
|
|
|
|
w, WIDX_PATH_CHECK_EDGE_NW, tileElement->properties.path.edges & (1 << ((3 - get_current_rotation()) & 3)));
|
|
|
|
widget_set_checkbox_value(
|
2018-07-21 13:51:54 +02:00
|
|
|
w, WIDX_PATH_CHECK_EDGE_E,
|
2018-06-22 23:21:44 +02:00
|
|
|
tileElement->properties.path.edges & (1 << (4 + ((0 - get_current_rotation()) & 3))));
|
|
|
|
widget_set_checkbox_value(
|
2018-07-21 13:51:54 +02:00
|
|
|
w, WIDX_PATH_CHECK_EDGE_S,
|
2018-06-22 23:21:44 +02:00
|
|
|
tileElement->properties.path.edges & (1 << (4 + ((1 - get_current_rotation()) & 3))));
|
|
|
|
widget_set_checkbox_value(
|
2018-07-21 13:51:54 +02:00
|
|
|
w, WIDX_PATH_CHECK_EDGE_W,
|
2018-06-22 23:21:44 +02:00
|
|
|
tileElement->properties.path.edges & (1 << (4 + ((2 - get_current_rotation()) & 3))));
|
|
|
|
widget_set_checkbox_value(
|
2018-07-21 13:51:54 +02:00
|
|
|
w, WIDX_PATH_CHECK_EDGE_N,
|
2018-06-22 23:21:44 +02:00
|
|
|
tileElement->properties.path.edges & (1 << (4 + ((3 - get_current_rotation()) & 3))));
|
|
|
|
break;
|
|
|
|
case TILE_INSPECTOR_PAGE_TRACK:
|
|
|
|
w->widgets[WIDX_TRACK_CHECK_APPLY_TO_ALL].top = GBBT(propertiesAnchor, 0);
|
|
|
|
w->widgets[WIDX_TRACK_CHECK_APPLY_TO_ALL].bottom = GBBB(propertiesAnchor, 0);
|
|
|
|
w->widgets[WIDX_TRACK_SPINNER_HEIGHT].top = GBBT(propertiesAnchor, 1) + 3;
|
|
|
|
w->widgets[WIDX_TRACK_SPINNER_HEIGHT].bottom = GBBB(propertiesAnchor, 1) - 3;
|
|
|
|
w->widgets[WIDX_TRACK_SPINNER_HEIGHT_INCREASE].top = GBBT(propertiesAnchor, 1) + 4;
|
|
|
|
w->widgets[WIDX_TRACK_SPINNER_HEIGHT_INCREASE].bottom = GBBB(propertiesAnchor, 1) - 4;
|
|
|
|
w->widgets[WIDX_TRACK_SPINNER_HEIGHT_DECREASE].top = GBBT(propertiesAnchor, 1) + 4;
|
|
|
|
w->widgets[WIDX_TRACK_SPINNER_HEIGHT_DECREASE].bottom = GBBB(propertiesAnchor, 1) - 4;
|
|
|
|
w->widgets[WIDX_TRACK_CHECK_CHAIN_LIFT].top = GBBT(propertiesAnchor, 2);
|
|
|
|
w->widgets[WIDX_TRACK_CHECK_CHAIN_LIFT].bottom = GBBB(propertiesAnchor, 2);
|
|
|
|
widget_set_checkbox_value(w, WIDX_TRACK_CHECK_APPLY_TO_ALL, windowTileInspectorApplyToAll);
|
2018-09-18 13:01:09 +02:00
|
|
|
widget_set_checkbox_value(w, WIDX_TRACK_CHECK_CHAIN_LIFT, tileElement->AsTrack()->HasChain());
|
2018-06-22 23:21:44 +02:00
|
|
|
break;
|
|
|
|
case TILE_INSPECTOR_PAGE_SCENERY:
|
|
|
|
{
|
|
|
|
// Raise / Lower
|
|
|
|
w->widgets[WIDX_SCENERY_SPINNER_HEIGHT].top = GBBT(propertiesAnchor, 0) + 3;
|
|
|
|
w->widgets[WIDX_SCENERY_SPINNER_HEIGHT].bottom = GBBB(propertiesAnchor, 0) - 3;
|
|
|
|
w->widgets[WIDX_SCENERY_SPINNER_HEIGHT_INCREASE].top = GBBT(propertiesAnchor, 0) + 4;
|
|
|
|
w->widgets[WIDX_SCENERY_SPINNER_HEIGHT_INCREASE].bottom = GBBB(propertiesAnchor, 0) - 4;
|
|
|
|
w->widgets[WIDX_SCENERY_SPINNER_HEIGHT_DECREASE].top = GBBT(propertiesAnchor, 0) + 4;
|
|
|
|
w->widgets[WIDX_SCENERY_SPINNER_HEIGHT_DECREASE].bottom = GBBB(propertiesAnchor, 0) - 4;
|
|
|
|
|
|
|
|
// Quadrant checkboxes
|
|
|
|
w->widgets[WIDX_SCENERY_CHECK_QUARTER_N].top = GBBT(propertiesAnchor, 1) - 5 + 7 * 0;
|
|
|
|
w->widgets[WIDX_SCENERY_CHECK_QUARTER_N].bottom = w->widgets[WIDX_SCENERY_CHECK_QUARTER_N].top + 13;
|
|
|
|
w->widgets[WIDX_SCENERY_CHECK_QUARTER_E].top = GBBT(propertiesAnchor, 1) - 5 + 7 * 1;
|
|
|
|
w->widgets[WIDX_SCENERY_CHECK_QUARTER_E].bottom = w->widgets[WIDX_SCENERY_CHECK_QUARTER_E].top + 13;
|
|
|
|
w->widgets[WIDX_SCENERY_CHECK_QUARTER_S].top = GBBT(propertiesAnchor, 1) - 5 + 7 * 2;
|
|
|
|
w->widgets[WIDX_SCENERY_CHECK_QUARTER_S].bottom = w->widgets[WIDX_SCENERY_CHECK_QUARTER_S].top + 13;
|
|
|
|
w->widgets[WIDX_SCENERY_CHECK_QUARTER_W].top = GBBT(propertiesAnchor, 1) - 5 + 7 * 1;
|
|
|
|
w->widgets[WIDX_SCENERY_CHECK_QUARTER_W].bottom = w->widgets[WIDX_SCENERY_CHECK_QUARTER_W].top + 13;
|
|
|
|
// This gets the relative rotation, by subtracting the camera's rotation, and wrapping it between 0-3 inclusive
|
2018-09-13 15:19:08 +02:00
|
|
|
bool N = tileElement->AsSmallScenery()->GetSceneryQuadrant() == ((0 - get_current_rotation()) & 3);
|
|
|
|
bool E = tileElement->AsSmallScenery()->GetSceneryQuadrant() == ((1 - get_current_rotation()) & 3);
|
|
|
|
bool S = tileElement->AsSmallScenery()->GetSceneryQuadrant() == ((2 - get_current_rotation()) & 3);
|
|
|
|
bool W = tileElement->AsSmallScenery()->GetSceneryQuadrant() == ((3 - get_current_rotation()) & 3);
|
2018-06-22 23:21:44 +02:00
|
|
|
widget_set_checkbox_value(w, WIDX_SCENERY_CHECK_QUARTER_N, N);
|
|
|
|
widget_set_checkbox_value(w, WIDX_SCENERY_CHECK_QUARTER_E, E);
|
|
|
|
widget_set_checkbox_value(w, WIDX_SCENERY_CHECK_QUARTER_S, S);
|
|
|
|
widget_set_checkbox_value(w, WIDX_SCENERY_CHECK_QUARTER_W, W);
|
|
|
|
|
|
|
|
// Collision checkboxes
|
|
|
|
w->widgets[WIDX_SCENERY_CHECK_COLLISION_N].top = GBBT(propertiesAnchor, 2) + 5 + 7 * 0;
|
|
|
|
w->widgets[WIDX_SCENERY_CHECK_COLLISION_N].bottom = w->widgets[WIDX_SCENERY_CHECK_COLLISION_N].top + 13;
|
|
|
|
w->widgets[WIDX_SCENERY_CHECK_COLLISION_E].top = GBBT(propertiesAnchor, 2) + 5 + 7 * 1;
|
|
|
|
w->widgets[WIDX_SCENERY_CHECK_COLLISION_E].bottom = w->widgets[WIDX_SCENERY_CHECK_COLLISION_E].top + 13;
|
|
|
|
w->widgets[WIDX_SCENERY_CHECK_COLLISION_S].top = GBBT(propertiesAnchor, 2) + 5 + 7 * 2;
|
|
|
|
w->widgets[WIDX_SCENERY_CHECK_COLLISION_S].bottom = w->widgets[WIDX_SCENERY_CHECK_COLLISION_S].top + 13;
|
|
|
|
w->widgets[WIDX_SCENERY_CHECK_COLLISION_W].top = GBBT(propertiesAnchor, 2) + 5 + 7 * 1;
|
|
|
|
w->widgets[WIDX_SCENERY_CHECK_COLLISION_W].bottom = w->widgets[WIDX_SCENERY_CHECK_COLLISION_W].top + 13;
|
|
|
|
N = (tileElement->flags & (1 << ((2 - get_current_rotation()) & 3))) != 0;
|
|
|
|
E = (tileElement->flags & (1 << ((3 - get_current_rotation()) & 3))) != 0;
|
|
|
|
S = (tileElement->flags & (1 << ((0 - get_current_rotation()) & 3))) != 0;
|
|
|
|
W = (tileElement->flags & (1 << ((1 - get_current_rotation()) & 3))) != 0;
|
|
|
|
widget_set_checkbox_value(w, WIDX_SCENERY_CHECK_COLLISION_N, N);
|
|
|
|
widget_set_checkbox_value(w, WIDX_SCENERY_CHECK_COLLISION_E, E);
|
|
|
|
widget_set_checkbox_value(w, WIDX_SCENERY_CHECK_COLLISION_S, S);
|
|
|
|
widget_set_checkbox_value(w, WIDX_SCENERY_CHECK_COLLISION_W, W);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case TILE_INSPECTOR_PAGE_ENTRANCE:
|
|
|
|
w->widgets[WIDX_ENTRANCE_SPINNER_HEIGHT].top = GBBT(propertiesAnchor, 0) + 3;
|
|
|
|
w->widgets[WIDX_ENTRANCE_SPINNER_HEIGHT].bottom = GBBB(propertiesAnchor, 0) - 3;
|
|
|
|
w->widgets[WIDX_ENTRANCE_SPINNER_HEIGHT_INCREASE].top = GBBT(propertiesAnchor, 0) + 4;
|
|
|
|
w->widgets[WIDX_ENTRANCE_SPINNER_HEIGHT_INCREASE].bottom = GBBB(propertiesAnchor, 0) - 4;
|
|
|
|
w->widgets[WIDX_ENTRANCE_SPINNER_HEIGHT_DECREASE].top = GBBT(propertiesAnchor, 0) + 4;
|
|
|
|
w->widgets[WIDX_ENTRANCE_SPINNER_HEIGHT_DECREASE].bottom = GBBB(propertiesAnchor, 0) - 4;
|
|
|
|
w->widgets[WIDX_ENTRANCE_BUTTON_MAKE_USABLE].top = GBBT(propertiesAnchor, 1);
|
|
|
|
w->widgets[WIDX_ENTRANCE_BUTTON_MAKE_USABLE].bottom = GBBB(propertiesAnchor, 1);
|
|
|
|
widget_set_enabled(
|
2018-09-26 15:44:09 +02:00
|
|
|
w, WIDX_ENTRANCE_BUTTON_MAKE_USABLE,
|
|
|
|
tileElement->AsEntrance()->GetEntranceType() != ENTRANCE_TYPE_PARK_ENTRANCE);
|
2018-06-22 23:21:44 +02:00
|
|
|
break;
|
|
|
|
case TILE_INSPECTOR_PAGE_WALL:
|
|
|
|
{
|
|
|
|
w->widgets[WIDX_WALL_SPINNER_HEIGHT].top = GBBT(propertiesAnchor, 0) + 3;
|
|
|
|
w->widgets[WIDX_WALL_SPINNER_HEIGHT].bottom = GBBB(propertiesAnchor, 0) - 3;
|
|
|
|
w->widgets[WIDX_WALL_SPINNER_HEIGHT_INCREASE].top = GBBT(propertiesAnchor, 0) + 4;
|
|
|
|
w->widgets[WIDX_WALL_SPINNER_HEIGHT_INCREASE].bottom = GBBB(propertiesAnchor, 0) - 4;
|
|
|
|
w->widgets[WIDX_WALL_SPINNER_HEIGHT_DECREASE].top = GBBT(propertiesAnchor, 0) + 4;
|
|
|
|
w->widgets[WIDX_WALL_SPINNER_HEIGHT_DECREASE].bottom = GBBB(propertiesAnchor, 0) - 4;
|
|
|
|
w->widgets[WIDX_WALL_DROPDOWN_SLOPE].top = GBBT(propertiesAnchor, 1) + 3;
|
|
|
|
w->widgets[WIDX_WALL_DROPDOWN_SLOPE].bottom = GBBB(propertiesAnchor, 1) - 3;
|
2018-09-13 15:19:08 +02:00
|
|
|
w->widgets[WIDX_WALL_DROPDOWN_SLOPE].text = WallSlopeStringIds[tileElement->AsWall()->GetSlope()];
|
2018-06-22 23:21:44 +02:00
|
|
|
w->widgets[WIDX_WALL_DROPDOWN_SLOPE_BUTTON].top = GBBT(propertiesAnchor, 1) + 4;
|
|
|
|
w->widgets[WIDX_WALL_DROPDOWN_SLOPE_BUTTON].bottom = GBBB(propertiesAnchor, 1) - 4;
|
2018-09-17 15:42:34 +02:00
|
|
|
const uint8_t wallType = tileElement->AsWall()->GetEntryIndex();
|
2018-06-22 23:21:44 +02:00
|
|
|
const rct_wall_scenery_entry wallEntry = get_wall_entry(wallType)->wall;
|
|
|
|
const bool canBeSloped = !(wallEntry.flags & WALL_SCENERY_CANT_BUILD_ON_SLOPE);
|
|
|
|
// Wall slope dropdown
|
|
|
|
widget_set_enabled(w, WIDX_WALL_DROPDOWN_SLOPE, canBeSloped);
|
|
|
|
widget_invalidate(w, WIDX_WALL_DROPDOWN_SLOPE);
|
|
|
|
widget_set_enabled(w, WIDX_WALL_DROPDOWN_SLOPE_BUTTON, canBeSloped);
|
|
|
|
widget_invalidate(w, WIDX_WALL_DROPDOWN_SLOPE_BUTTON);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case TILE_INSPECTOR_PAGE_LARGE_SCENERY:
|
|
|
|
w->widgets[WIDX_LARGE_SCENERY_SPINNER_HEIGHT].top = GBBT(propertiesAnchor, 0) + 3;
|
|
|
|
w->widgets[WIDX_LARGE_SCENERY_SPINNER_HEIGHT].bottom = GBBB(propertiesAnchor, 0) - 3;
|
|
|
|
w->widgets[WIDX_LARGE_SCENERY_SPINNER_HEIGHT_INCREASE].top = GBBT(propertiesAnchor, 0) + 4;
|
|
|
|
w->widgets[WIDX_LARGE_SCENERY_SPINNER_HEIGHT_INCREASE].bottom = GBBB(propertiesAnchor, 0) - 4;
|
|
|
|
w->widgets[WIDX_LARGE_SCENERY_SPINNER_HEIGHT_DECREASE].top = GBBT(propertiesAnchor, 0) + 4;
|
|
|
|
w->widgets[WIDX_LARGE_SCENERY_SPINNER_HEIGHT_DECREASE].bottom = GBBB(propertiesAnchor, 0) - 4;
|
|
|
|
break;
|
|
|
|
case TILE_INSPECTOR_PAGE_BANNER:
|
|
|
|
w->widgets[WIDX_BANNER_SPINNER_HEIGHT].top = GBBT(propertiesAnchor, 0) + 3;
|
|
|
|
w->widgets[WIDX_BANNER_SPINNER_HEIGHT].bottom = GBBB(propertiesAnchor, 0) - 3;
|
|
|
|
w->widgets[WIDX_BANNER_SPINNER_HEIGHT_INCREASE].top = GBBT(propertiesAnchor, 0) + 4;
|
|
|
|
w->widgets[WIDX_BANNER_SPINNER_HEIGHT_INCREASE].bottom = GBBB(propertiesAnchor, 0) - 4;
|
|
|
|
w->widgets[WIDX_BANNER_SPINNER_HEIGHT_DECREASE].top = GBBT(propertiesAnchor, 0) + 4;
|
|
|
|
w->widgets[WIDX_BANNER_SPINNER_HEIGHT_DECREASE].bottom = GBBB(propertiesAnchor, 0) - 4;
|
|
|
|
w->widgets[WIDX_BANNER_CHECK_BLOCK_NE].top = GBBT(propertiesAnchor, 1);
|
|
|
|
w->widgets[WIDX_BANNER_CHECK_BLOCK_NE].bottom = GBBB(propertiesAnchor, 1);
|
|
|
|
w->widgets[WIDX_BANNER_CHECK_BLOCK_SE].top = GBBT(propertiesAnchor, 2);
|
|
|
|
w->widgets[WIDX_BANNER_CHECK_BLOCK_SE].bottom = GBBB(propertiesAnchor, 2);
|
|
|
|
w->widgets[WIDX_BANNER_CHECK_BLOCK_SW].top = GBBT(propertiesAnchor, 2);
|
|
|
|
w->widgets[WIDX_BANNER_CHECK_BLOCK_SW].bottom = GBBB(propertiesAnchor, 2);
|
|
|
|
w->widgets[WIDX_BANNER_CHECK_BLOCK_NW].top = GBBT(propertiesAnchor, 1);
|
|
|
|
w->widgets[WIDX_BANNER_CHECK_BLOCK_NW].bottom = GBBB(propertiesAnchor, 1);
|
|
|
|
widget_set_checkbox_value(
|
2018-07-21 13:51:54 +02:00
|
|
|
w, WIDX_BANNER_CHECK_BLOCK_NE,
|
2018-09-26 14:52:16 +02:00
|
|
|
!(tileElement->AsBanner()->GetAllowedEdges() & (1 << ((0 - get_current_rotation()) & 3))));
|
2018-06-22 23:21:44 +02:00
|
|
|
widget_set_checkbox_value(
|
2018-07-21 13:51:54 +02:00
|
|
|
w, WIDX_BANNER_CHECK_BLOCK_SE,
|
2018-09-26 14:52:16 +02:00
|
|
|
!(tileElement->AsBanner()->GetAllowedEdges() & (1 << ((1 - get_current_rotation()) & 3))));
|
2018-06-22 23:21:44 +02:00
|
|
|
widget_set_checkbox_value(
|
2018-07-21 13:51:54 +02:00
|
|
|
w, WIDX_BANNER_CHECK_BLOCK_SW,
|
2018-09-26 14:52:16 +02:00
|
|
|
!(tileElement->AsBanner()->GetAllowedEdges() & (1 << ((2 - get_current_rotation()) & 3))));
|
2018-06-22 23:21:44 +02:00
|
|
|
widget_set_checkbox_value(
|
2018-07-21 13:51:54 +02:00
|
|
|
w, WIDX_BANNER_CHECK_BLOCK_NW,
|
2018-09-26 14:52:16 +02:00
|
|
|
!(tileElement->AsBanner()->GetAllowedEdges() & (1 << ((3 - get_current_rotation()) & 3))));
|
2018-06-22 23:21:44 +02:00
|
|
|
break;
|
|
|
|
case TILE_INSPECTOR_PAGE_CORRUPT:
|
|
|
|
w->widgets[WIDX_CORRUPT_SPINNER_HEIGHT].top = GBBT(propertiesAnchor, 0) + 3;
|
|
|
|
w->widgets[WIDX_CORRUPT_SPINNER_HEIGHT].bottom = GBBB(propertiesAnchor, 0) - 3;
|
|
|
|
w->widgets[WIDX_CORRUPT_SPINNER_HEIGHT_INCREASE].top = GBBT(propertiesAnchor, 0) + 4;
|
|
|
|
w->widgets[WIDX_CORRUPT_SPINNER_HEIGHT_INCREASE].bottom = GBBB(propertiesAnchor, 0) - 4;
|
|
|
|
w->widgets[WIDX_CORRUPT_SPINNER_HEIGHT_DECREASE].top = GBBT(propertiesAnchor, 0) + 4;
|
|
|
|
w->widgets[WIDX_CORRUPT_SPINNER_HEIGHT_DECREASE].bottom = GBBB(propertiesAnchor, 0) - 4;
|
|
|
|
w->widgets[WIDX_CORRUPT_BUTTON_CLAMP].top = GBBT(propertiesAnchor, 1);
|
|
|
|
w->widgets[WIDX_CORRUPT_BUTTON_CLAMP].bottom = GBBB(propertiesAnchor, 1);
|
|
|
|
break;
|
2017-06-06 23:24:18 +02:00
|
|
|
}
|
2015-06-01 03:33:56 +02:00
|
|
|
}
|
|
|
|
|
2018-06-22 23:21:44 +02:00
|
|
|
static void window_tile_inspector_paint(rct_window* w, rct_drawpixelinfo* dpi)
|
2016-11-01 23:43:39 +01:00
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
window_draw_widgets(w, dpi);
|
|
|
|
|
|
|
|
// Set medium font size
|
|
|
|
gCurrentFontSpriteBase = FONT_SPRITE_BASE_MEDIUM;
|
|
|
|
|
|
|
|
// Draw column headers
|
2018-06-22 23:21:44 +02:00
|
|
|
rct_widget* widget;
|
|
|
|
if ((widget = &w->widgets[WIDX_COLUMN_TYPE])->type != WWT_EMPTY)
|
|
|
|
{
|
|
|
|
gfx_draw_string_left_clipped(
|
2018-07-21 13:51:54 +02:00
|
|
|
dpi, STR_TILE_INSPECTOR_ELEMENT_TYPE, gCommonFormatArgs, w->colours[1], w->x + widget->left + 1,
|
|
|
|
w->y + widget->top + 1, widget->right - widget->left);
|
2017-06-06 23:24:18 +02:00
|
|
|
}
|
2018-06-22 23:21:44 +02:00
|
|
|
if ((widget = &w->widgets[WIDX_COLUMN_BASEHEIGHT])->type != WWT_EMPTY)
|
|
|
|
{
|
|
|
|
gfx_draw_string_left_clipped(
|
2018-07-21 13:51:54 +02:00
|
|
|
dpi, STR_TILE_INSPECTOR_BASE_HEIGHT_SHORT, gCommonFormatArgs, w->colours[1], w->x + widget->left + 1,
|
|
|
|
w->y + widget->top + 1, widget->right - widget->left);
|
2017-06-06 23:24:18 +02:00
|
|
|
}
|
2018-06-22 23:21:44 +02:00
|
|
|
if ((widget = &w->widgets[WIDX_COLUMN_CLEARANCEHEIGHT])->type != WWT_EMPTY)
|
|
|
|
{
|
|
|
|
gfx_draw_string_left_clipped(
|
2018-07-21 13:51:54 +02:00
|
|
|
dpi, STR_TILE_INSPECTOR_CLEARANGE_HEIGHT_SHORT, gCommonFormatArgs, w->colours[1], w->x + widget->left + 1,
|
|
|
|
w->y + widget->top + 1, widget->right - widget->left);
|
2017-06-06 23:24:18 +02:00
|
|
|
}
|
2018-06-22 23:21:44 +02:00
|
|
|
if ((widget = &w->widgets[WIDX_COLUMN_GHOSTFLAG])->type != WWT_EMPTY)
|
|
|
|
{
|
|
|
|
gfx_draw_string_left_clipped(
|
2018-07-21 13:51:54 +02:00
|
|
|
dpi, STR_TILE_INSPECTOR_FLAG_GHOST_SHORT, gCommonFormatArgs, w->colours[1], w->x + widget->left + 1,
|
|
|
|
w->y + widget->top + 1, widget->right - widget->left);
|
2017-06-06 23:24:18 +02:00
|
|
|
}
|
2018-06-22 23:21:44 +02:00
|
|
|
if ((widget = &w->widgets[WIDX_COLUMN_BROKENFLAG])->type != WWT_EMPTY)
|
|
|
|
{
|
|
|
|
gfx_draw_string_left_clipped(
|
2018-07-21 13:51:54 +02:00
|
|
|
dpi, STR_TILE_INSPECTOR_FLAG_BROKEN_SHORT, gCommonFormatArgs, w->colours[1], w->x + widget->left + 1,
|
|
|
|
w->y + widget->top + 1, widget->right - widget->left);
|
2017-06-06 23:24:18 +02:00
|
|
|
}
|
2018-06-22 23:21:44 +02:00
|
|
|
if ((widget = &w->widgets[WIDX_COLUMN_LASTFLAG])->type != WWT_EMPTY)
|
|
|
|
{
|
|
|
|
gfx_draw_string_left_clipped(
|
2018-07-21 13:51:54 +02:00
|
|
|
dpi, STR_TILE_INSPECTOR_FLAG_LAST_SHORT, gCommonFormatArgs, w->colours[1], w->x + widget->left + 1,
|
|
|
|
w->y + widget->top + 1, widget->right - widget->left);
|
2017-06-06 23:24:18 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
// Draw coordinates
|
2018-06-22 23:21:44 +02:00
|
|
|
gfx_draw_string(dpi, (char*)"X:", COLOUR_DARK_GREEN, w->x + 5, w->y + 24);
|
|
|
|
gfx_draw_string(dpi, (char*)"Y:", COLOUR_DARK_GREEN, w->x + 74, w->y + 24);
|
|
|
|
if (windowTileInspectorTileSelected)
|
|
|
|
{
|
2018-05-31 23:35:59 +02:00
|
|
|
gfx_draw_string_right(dpi, STR_FORMAT_INTEGER, &windowTileInspectorTileX, COLOUR_DARK_GREEN, w->x + 43, w->y + 24);
|
|
|
|
gfx_draw_string_right(dpi, STR_FORMAT_INTEGER, &windowTileInspectorTileY, COLOUR_DARK_GREEN, w->x + 113, w->y + 24);
|
2017-06-06 23:24:18 +02:00
|
|
|
}
|
2018-06-22 23:21:44 +02:00
|
|
|
else
|
|
|
|
{
|
|
|
|
gfx_draw_string(dpi, (char*)"-", COLOUR_DARK_GREEN, w->x + 43 - 7, w->y + 24);
|
|
|
|
gfx_draw_string(dpi, (char*)"-", COLOUR_DARK_GREEN, w->x + 113 - 7, w->y + 24);
|
2017-06-06 23:24:18 +02:00
|
|
|
}
|
|
|
|
|
2018-06-22 23:21:44 +02:00
|
|
|
if (windowTileInspectorSelectedIndex != -1)
|
|
|
|
{
|
2017-06-06 23:24:18 +02:00
|
|
|
// X and Y of first element in detail box
|
2018-06-20 17:28:51 +02:00
|
|
|
int32_t x = w->x + w->widgets[WIDX_GROUPBOX_DETAILS].left + 7;
|
|
|
|
int32_t y = w->y + w->widgets[WIDX_GROUPBOX_DETAILS].top + 14;
|
2017-06-06 23:24:18 +02:00
|
|
|
|
|
|
|
// Get map element
|
2018-06-22 23:21:44 +02:00
|
|
|
rct_tile_element* const tileElement = window_tile_inspector_get_selected_element(w);
|
2017-06-06 23:24:18 +02:00
|
|
|
|
2018-06-22 23:21:44 +02:00
|
|
|
switch (w->page)
|
|
|
|
{
|
|
|
|
case TILE_INSPECTOR_PAGE_SURFACE:
|
|
|
|
{
|
|
|
|
// Details
|
|
|
|
// Terrain texture name
|
2018-09-14 14:54:12 +02:00
|
|
|
rct_string_id terrainNameId = TerrainTypeStringIds[tileElement->AsSurface()->GetSurfaceStyle()];
|
2018-06-22 23:21:44 +02:00
|
|
|
gfx_draw_string_left(dpi, STR_TILE_INSPECTOR_SURFACE_TERAIN, &terrainNameId, COLOUR_DARK_GREEN, x, y);
|
|
|
|
|
|
|
|
// Edge texture name
|
2018-09-14 14:54:12 +02:00
|
|
|
uint32_t idx = tileElement->AsSurface()->GetEdgeStyle();
|
2018-06-22 23:21:44 +02:00
|
|
|
openrct2_assert(
|
|
|
|
(uint32_t)idx < Util::CountOf(TerrainEdgeTypeStringIds),
|
2018-07-21 13:51:54 +02:00
|
|
|
"Tried accessing invalid entry %d in terrainEdgeTypeStringIds", idx);
|
2018-09-14 14:54:12 +02:00
|
|
|
rct_string_id terrainEdgeNameId = TerrainEdgeTypeStringIds[tileElement->AsSurface()->GetEdgeStyle()];
|
2018-06-22 23:21:44 +02:00
|
|
|
gfx_draw_string_left(dpi, STR_TILE_INSPECTOR_SURFACE_EDGE, &terrainEdgeNameId, COLOUR_DARK_GREEN, x, y + 11);
|
|
|
|
|
|
|
|
// Land ownership
|
|
|
|
rct_string_id landOwnership;
|
2018-09-14 14:54:12 +02:00
|
|
|
if (tileElement->AsSurface()->GetOwnership() & OWNERSHIP_OWNED)
|
2018-06-22 23:21:44 +02:00
|
|
|
landOwnership = STR_LAND_OWNED;
|
2018-09-14 14:54:12 +02:00
|
|
|
else if (tileElement->AsSurface()->GetOwnership() & OWNERSHIP_AVAILABLE)
|
2018-06-22 23:21:44 +02:00
|
|
|
landOwnership = STR_LAND_SALE;
|
2018-09-14 14:54:12 +02:00
|
|
|
else if (tileElement->AsSurface()->GetOwnership() & OWNERSHIP_CONSTRUCTION_RIGHTS_OWNED)
|
2018-06-22 23:21:44 +02:00
|
|
|
landOwnership = STR_CONSTRUCTION_RIGHTS_OWNED;
|
2018-09-14 14:54:12 +02:00
|
|
|
else if (tileElement->AsSurface()->GetOwnership() & OWNERSHIP_CONSTRUCTION_RIGHTS_AVAILABLE)
|
2018-06-22 23:21:44 +02:00
|
|
|
landOwnership = STR_CONSTRUCTION_RIGHTS_SALE;
|
|
|
|
else
|
|
|
|
landOwnership = STR_TILE_INSPECTOR_LAND_NOT_OWNED_AND_NOT_AVAILABLE;
|
|
|
|
gfx_draw_string_left(dpi, STR_TILE_INSPECTOR_SURFACE_OWNERSHIP, &landOwnership, COLOUR_DARK_GREEN, x, y + 22);
|
|
|
|
|
|
|
|
// Water level
|
2018-09-15 10:56:35 +02:00
|
|
|
uint32_t waterLevel = tileElement->AsSurface()->GetWaterHeight();
|
2018-06-22 23:21:44 +02:00
|
|
|
gfx_draw_string_left(dpi, STR_TILE_INSPECTOR_SURFACE_WATER_LEVEL, &waterLevel, COLOUR_DARK_GREEN, x, y + 33);
|
|
|
|
|
|
|
|
// Properties
|
|
|
|
// Raise / lower label
|
|
|
|
x = w->x + w->widgets[WIDX_GROUPBOX_DETAILS].left + 7;
|
|
|
|
y = w->y + w->widgets[WIDX_SURFACE_SPINNER_HEIGHT].top;
|
|
|
|
gfx_draw_string_left(dpi, STR_TILE_INSPECTOR_BASE_HEIGHT_FULL, nullptr, COLOUR_DARK_GREEN, x, y);
|
|
|
|
|
|
|
|
// Current base height
|
|
|
|
x = w->x + w->widgets[WIDX_SURFACE_SPINNER_HEIGHT].left + 3;
|
|
|
|
int32_t baseHeight = tileElement->base_height;
|
|
|
|
gfx_draw_string_left(dpi, STR_FORMAT_INTEGER, &baseHeight, COLOUR_DARK_GREEN, x, y);
|
|
|
|
|
|
|
|
// Raised corners
|
|
|
|
x = w->x + w->widgets[WIDX_GROUPBOX_DETAILS].left + 7;
|
|
|
|
y = w->y + w->widgets[WIDX_SURFACE_CHECK_CORNER_E].top;
|
|
|
|
gfx_draw_string_left(dpi, STR_TILE_INSPECTOR_SURFACE_CORNERS, nullptr, COLOUR_DARK_GREEN, x, y);
|
|
|
|
break;
|
2017-06-06 23:24:18 +02:00
|
|
|
}
|
|
|
|
|
2018-06-22 23:21:44 +02:00
|
|
|
case TILE_INSPECTOR_PAGE_PATH:
|
|
|
|
{
|
|
|
|
// Details
|
|
|
|
// Path name
|
2018-09-16 17:19:56 +02:00
|
|
|
rct_string_id pathNameId = tileElement->AsPath()->GetEntry()->string_idx;
|
2018-06-22 23:21:44 +02:00
|
|
|
gfx_draw_string_left(dpi, STR_TILE_INSPECTOR_PATH_NAME, &pathNameId, COLOUR_DARK_GREEN, x, y);
|
2017-06-06 23:24:18 +02:00
|
|
|
|
2018-06-22 23:21:44 +02:00
|
|
|
// Path addition
|
2018-09-16 17:08:15 +02:00
|
|
|
if (tileElement->AsPath()->HasAddition())
|
2018-06-22 23:21:44 +02:00
|
|
|
{
|
2018-09-16 17:08:15 +02:00
|
|
|
const uint8_t pathAdditionType = tileElement->AsPath()->GetAdditionEntryIndex();
|
2018-06-22 23:21:44 +02:00
|
|
|
rct_string_id additionNameId = get_footpath_item_entry(pathAdditionType)->name;
|
|
|
|
gfx_draw_string_left(dpi, STR_TILE_INSPECTOR_PATH_ADDITIONS, &additionNameId, COLOUR_DARK_GREEN, x, y + 11);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
gfx_draw_string_left(dpi, STR_TILE_INSPECTOR_PATH_ADDITIONS_NONE, nullptr, COLOUR_DARK_GREEN, x, y + 11);
|
|
|
|
|
|
|
|
// Properties
|
|
|
|
// Raise / lower label
|
|
|
|
x = w->x + w->widgets[WIDX_GROUPBOX_DETAILS].left + 7;
|
|
|
|
y = w->y + w->widgets[WIDX_PATH_SPINNER_HEIGHT].top;
|
|
|
|
gfx_draw_string_left(dpi, STR_TILE_INSPECTOR_BASE_HEIGHT_FULL, nullptr, COLOUR_DARK_GREEN, x, y);
|
|
|
|
|
|
|
|
// Current base height
|
|
|
|
x = w->x + w->widgets[WIDX_PATH_SPINNER_HEIGHT].left + 3;
|
|
|
|
int32_t baseHeight = tileElement->base_height;
|
|
|
|
gfx_draw_string_left(dpi, STR_FORMAT_INTEGER, &baseHeight, COLOUR_DARK_GREEN, x, y);
|
|
|
|
|
|
|
|
// Path connections
|
|
|
|
x = w->x + w->widgets[WIDX_GROUPBOX_DETAILS].left + 7;
|
|
|
|
y = w->y + w->widgets[WIDX_PATH_CHECK_EDGE_W].top;
|
|
|
|
gfx_draw_string_left(dpi, STR_TILE_INSPECTOR_PATH_CONNECTED_EDGES, nullptr, COLOUR_DARK_GREEN, x, y);
|
|
|
|
break;
|
|
|
|
}
|
2017-06-06 23:24:18 +02:00
|
|
|
|
2018-06-22 23:21:44 +02:00
|
|
|
case TILE_INSPECTOR_PAGE_TRACK:
|
2017-12-04 20:09:38 +01:00
|
|
|
{
|
2018-06-22 23:21:44 +02:00
|
|
|
// Details
|
|
|
|
// Ride
|
2018-09-18 13:10:29 +02:00
|
|
|
int16_t rideId = tileElement->AsTrack()->GetRideIndex();
|
2018-06-22 23:21:44 +02:00
|
|
|
Ride* ride = get_ride(rideId);
|
|
|
|
rct_string_id rideType = RideNaming[ride->type].name;
|
|
|
|
gfx_draw_string_left(dpi, STR_TILE_INSPECTOR_TRACK_RIDE_TYPE, &rideType, COLOUR_DARK_GREEN, x, y);
|
|
|
|
gfx_draw_string_left(dpi, STR_TILE_INSPECTOR_TRACK_RIDE_ID, &rideId, COLOUR_DARK_GREEN, x, y + 11);
|
|
|
|
set_format_arg(0, rct_string_id, ride->name);
|
|
|
|
set_format_arg(0 + sizeof(rct_string_id), uint32_t, ride->name_arguments);
|
|
|
|
gfx_draw_string_left(dpi, STR_TILE_INSPECTOR_TRACK_RIDE_NAME, gCommonFormatArgs, COLOUR_DARK_GREEN, x, y + 22);
|
|
|
|
// Track
|
2018-09-17 21:54:36 +02:00
|
|
|
int16_t trackType = tileElement->AsTrack()->GetTrackType();
|
2018-09-17 22:10:15 +02:00
|
|
|
int16_t sequenceNumber = tileElement->AsTrack()->GetSequenceIndex();
|
2018-06-22 23:21:44 +02:00
|
|
|
gfx_draw_string_left(dpi, STR_TILE_INSPECTOR_TRACK_PIECE_ID, &trackType, COLOUR_DARK_GREEN, x, y + 33);
|
|
|
|
gfx_draw_string_left(dpi, STR_TILE_INSPECTOR_TRACK_SEQUENCE, &sequenceNumber, COLOUR_DARK_GREEN, x, y + 44);
|
|
|
|
|
|
|
|
// Properties
|
|
|
|
// Raise / lower label
|
|
|
|
y = w->y + w->widgets[WIDX_TRACK_SPINNER_HEIGHT].top;
|
|
|
|
gfx_draw_string_left(dpi, STR_TILE_INSPECTOR_BASE_HEIGHT_FULL, nullptr, COLOUR_DARK_GREEN, x, y);
|
|
|
|
|
|
|
|
// Current base height
|
|
|
|
x = w->x + w->widgets[WIDX_TRACK_SPINNER_HEIGHT].left + 3;
|
|
|
|
int32_t baseHeight = tileElement->base_height;
|
|
|
|
gfx_draw_string_left(dpi, STR_FORMAT_INTEGER, &baseHeight, COLOUR_DARK_GREEN, x, y);
|
|
|
|
break;
|
2017-06-06 23:24:18 +02:00
|
|
|
}
|
|
|
|
|
2018-06-22 23:21:44 +02:00
|
|
|
case TILE_INSPECTOR_PAGE_SCENERY:
|
|
|
|
{
|
|
|
|
// Details
|
|
|
|
// Age
|
2018-09-13 17:26:36 +02:00
|
|
|
int16_t age = tileElement->AsSmallScenery()->GetAge();
|
2018-06-22 23:21:44 +02:00
|
|
|
gfx_draw_string_left(dpi, STR_TILE_INSPECTOR_SCENERY_AGE, &age, COLOUR_DARK_GREEN, x, y);
|
|
|
|
|
|
|
|
// Quadrant value
|
2018-09-13 17:02:38 +02:00
|
|
|
const rct_scenery_entry* sceneryEntry = get_small_scenery_entry(tileElement->AsSmallScenery()->GetEntryIndex());
|
2018-06-22 23:21:44 +02:00
|
|
|
if (!(scenery_small_entry_has_flag(sceneryEntry, SMALL_SCENERY_FLAG_FULL_TILE)))
|
|
|
|
{
|
2018-09-13 15:19:08 +02:00
|
|
|
int16_t quadrant = tileElement->AsSmallScenery()->GetSceneryQuadrant();
|
2018-06-22 23:21:44 +02:00
|
|
|
static rct_string_id quadrant_string_idx[] = { STR_TILE_INSPECTOR_SCENERY_QUADRANT_SW,
|
|
|
|
STR_TILE_INSPECTOR_SCENERY_QUADRANT_NW,
|
|
|
|
STR_TILE_INSPECTOR_SCENERY_QUADRANT_NE,
|
|
|
|
STR_TILE_INSPECTOR_SCENERY_QUADRANT_SE };
|
|
|
|
gfx_draw_string_left(
|
|
|
|
dpi, STR_TILE_INSPECTOR_SCENERY_QUADRANT, &quadrant_string_idx[quadrant], COLOUR_DARK_GREEN, x, y + 11);
|
|
|
|
}
|
2017-06-06 23:24:18 +02:00
|
|
|
|
2018-06-22 23:21:44 +02:00
|
|
|
// Scenery ID
|
2018-09-13 17:02:38 +02:00
|
|
|
int16_t idx = tileElement->AsSmallScenery()->GetEntryIndex();
|
2018-06-22 23:21:44 +02:00
|
|
|
gfx_draw_string_left(dpi, STR_TILE_INSPECTOR_SCENERY_ENTRY_IDX, &idx, COLOUR_DARK_GREEN, x, y + 22);
|
|
|
|
|
|
|
|
// Properties
|
|
|
|
// Raise / Lower
|
|
|
|
y = w->y + w->widgets[WIDX_SCENERY_SPINNER_HEIGHT].top;
|
|
|
|
gfx_draw_string_left(dpi, STR_TILE_INSPECTOR_BASE_HEIGHT_FULL, nullptr, COLOUR_DARK_GREEN, x, y);
|
|
|
|
|
|
|
|
// Current base height
|
|
|
|
x = w->x + w->widgets[WIDX_SCENERY_SPINNER_HEIGHT].left + 3;
|
|
|
|
int32_t baseHeight = tileElement->base_height;
|
|
|
|
gfx_draw_string_left(dpi, STR_FORMAT_INTEGER, &baseHeight, COLOUR_DARK_GREEN, x, y);
|
2017-06-06 23:24:18 +02:00
|
|
|
|
2018-06-22 23:21:44 +02:00
|
|
|
// Quarter tile
|
|
|
|
x = w->x + w->widgets[WIDX_GROUPBOX_DETAILS].left + 7;
|
|
|
|
y = w->y + w->widgets[WIDX_SCENERY_CHECK_QUARTER_E].top;
|
|
|
|
gfx_draw_string_left(dpi, STR_TILE_INSPECTOR_SCENERY_QUADRANT_LABEL, nullptr, COLOUR_DARK_GREEN, x, y);
|
|
|
|
|
|
|
|
// Collision
|
|
|
|
y = w->y + w->widgets[WIDX_SCENERY_CHECK_COLLISION_E].top;
|
|
|
|
gfx_draw_string_left(dpi, STR_TILE_INSPECTOR_COLLISSION, nullptr, COLOUR_DARK_GREEN, x, y);
|
|
|
|
break;
|
2017-06-06 23:24:18 +02:00
|
|
|
}
|
2018-06-22 23:21:44 +02:00
|
|
|
|
|
|
|
case TILE_INSPECTOR_PAGE_ENTRANCE:
|
2018-05-18 15:18:40 +02:00
|
|
|
{
|
2018-06-22 23:21:44 +02:00
|
|
|
// Details
|
|
|
|
// Entrance type
|
2018-09-26 12:13:44 +02:00
|
|
|
rct_string_id entranceType = EntranceTypeStringIds[tileElement->AsEntrance()->GetEntranceType()];
|
2018-06-22 23:21:44 +02:00
|
|
|
gfx_draw_string_left(dpi, STR_TILE_INSPECTOR_ENTRANCE_TYPE, &entranceType, COLOUR_DARK_GREEN, x, y);
|
|
|
|
|
2018-09-26 12:13:44 +02:00
|
|
|
if (tileElement->AsEntrance()->GetEntranceType() == ENTRANCE_TYPE_PARK_ENTRANCE)
|
2018-05-18 15:18:40 +02:00
|
|
|
{
|
2018-06-22 23:21:44 +02:00
|
|
|
// Park entrance ID
|
|
|
|
int32_t middleX = windowTileInspectorTileX << 5;
|
|
|
|
int32_t middleY = windowTileInspectorTileY << 5;
|
|
|
|
// TODO: Make this work with Left/Right park entrance parts
|
|
|
|
int16_t parkEntranceIndex = park_entrance_get_index(middleX, middleY, tileElement->base_height * 8);
|
2018-05-18 15:18:40 +02:00
|
|
|
gfx_draw_string_left(
|
2018-06-22 23:21:44 +02:00
|
|
|
dpi, STR_TILE_INSPECTOR_ENTRANCE_ENTRANCE_ID, &parkEntranceIndex, COLOUR_DARK_GREEN, x, y + 11);
|
2017-06-06 23:24:18 +02:00
|
|
|
}
|
2018-05-18 15:18:40 +02:00
|
|
|
else
|
|
|
|
{
|
2018-09-26 12:54:44 +02:00
|
|
|
int16_t rideEntranceIndex = tileElement->AsEntrance()->GetStationIndex();
|
2018-09-26 12:13:44 +02:00
|
|
|
if (tileElement->AsEntrance()->GetEntranceType() == ENTRANCE_TYPE_RIDE_ENTRANCE)
|
2018-06-22 23:21:44 +02:00
|
|
|
{
|
|
|
|
// Ride entrance ID
|
|
|
|
gfx_draw_string_left(
|
|
|
|
dpi, STR_TILE_INSPECTOR_ENTRANCE_ENTRANCE_ID, &rideEntranceIndex, COLOUR_DARK_GREEN, x, y + 11);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
// Ride exit ID
|
|
|
|
gfx_draw_string_left(
|
|
|
|
dpi, STR_TILE_INSPECTOR_ENTRANCE_EXIT_ID, &rideEntranceIndex, COLOUR_DARK_GREEN, x, y + 11);
|
|
|
|
}
|
2017-06-06 23:24:18 +02:00
|
|
|
}
|
|
|
|
|
2018-09-26 12:13:44 +02:00
|
|
|
if (tileElement->AsEntrance()->GetEntranceType() == ENTRANCE_TYPE_PARK_ENTRANCE)
|
2018-06-22 23:21:44 +02:00
|
|
|
{
|
|
|
|
// Entrance part
|
2018-09-26 12:54:44 +02:00
|
|
|
rct_string_id entrancePart = ParkEntrancePartStringIds[tileElement->AsEntrance()->GetSequenceIndex()];
|
2018-06-22 23:21:44 +02:00
|
|
|
gfx_draw_string_left(dpi, STR_TILE_INSPECTOR_ENTRANCE_PART, &entrancePart, COLOUR_DARK_GREEN, x, y + 22);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
// Ride ID
|
2018-09-26 12:30:27 +02:00
|
|
|
int16_t rideId = tileElement->AsEntrance()->GetRideIndex();
|
2018-06-22 23:21:44 +02:00
|
|
|
gfx_draw_string_left(dpi, STR_TILE_INSPECTOR_ENTRANCE_RIDE_ID, &rideId, COLOUR_DARK_GREEN, x, y + 22);
|
|
|
|
}
|
2017-06-06 23:24:18 +02:00
|
|
|
|
2018-06-22 23:21:44 +02:00
|
|
|
// Properties
|
|
|
|
// Raise / Lower
|
|
|
|
y = w->y + w->widgets[WIDX_ENTRANCE_SPINNER_HEIGHT].top;
|
|
|
|
gfx_draw_string_left(dpi, STR_TILE_INSPECTOR_BASE_HEIGHT_FULL, nullptr, COLOUR_DARK_GREEN, x, y);
|
2017-06-06 23:24:18 +02:00
|
|
|
|
2018-06-22 23:21:44 +02:00
|
|
|
// Current base height
|
|
|
|
x = w->x + w->widgets[WIDX_ENTRANCE_SPINNER_HEIGHT].left + 3;
|
|
|
|
int32_t baseHeight = tileElement->base_height;
|
|
|
|
gfx_draw_string_left(dpi, STR_FORMAT_INTEGER, &baseHeight, COLOUR_DARK_GREEN, x, y);
|
|
|
|
break;
|
2017-06-06 23:24:18 +02:00
|
|
|
}
|
|
|
|
|
2018-06-22 23:21:44 +02:00
|
|
|
case TILE_INSPECTOR_PAGE_WALL:
|
|
|
|
{
|
|
|
|
// Details
|
|
|
|
// Type
|
2018-09-17 15:42:34 +02:00
|
|
|
int16_t wallType = tileElement->AsWall()->GetEntryIndex();
|
2018-06-22 23:21:44 +02:00
|
|
|
gfx_draw_string_left(dpi, STR_TILE_INSPECTOR_WALL_TYPE, &wallType, COLOUR_DARK_GREEN, x, y);
|
|
|
|
|
|
|
|
// Banner info
|
|
|
|
rct_wall_scenery_entry wallEntry = get_wall_entry(wallType)->wall;
|
|
|
|
if (wallEntry.flags & WALL_SCENERY_IS_BANNER)
|
|
|
|
{
|
|
|
|
gfx_draw_string_left(
|
2018-07-21 13:51:54 +02:00
|
|
|
dpi, STR_TILE_INSPECTOR_ENTRY_BANNER_TEXT,
|
2018-09-17 15:42:34 +02:00
|
|
|
&gBanners[tileElement->AsWall()->GetBannerIndex()].string_idx, COLOUR_DARK_GREEN, x, y + 11);
|
2018-06-22 23:21:44 +02:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
gfx_draw_string_left(dpi, STR_TILE_INSPECTOR_ENTRY_BANNER_NONE, nullptr, COLOUR_DARK_GREEN, x, y + 11);
|
|
|
|
}
|
2017-06-06 23:24:18 +02:00
|
|
|
|
2018-06-22 23:21:44 +02:00
|
|
|
// Properties
|
|
|
|
// Raise / lower label
|
|
|
|
y = w->y + w->widgets[WIDX_WALL_SPINNER_HEIGHT].top;
|
|
|
|
gfx_draw_string_left(dpi, STR_TILE_INSPECTOR_BASE_HEIGHT_FULL, nullptr, COLOUR_DARK_GREEN, x, y);
|
2017-06-06 23:24:18 +02:00
|
|
|
|
2018-06-22 23:21:44 +02:00
|
|
|
// Current base height
|
|
|
|
x = w->x + w->widgets[WIDX_WALL_SPINNER_HEIGHT].left + 3;
|
|
|
|
int32_t baseHeight = tileElement->base_height;
|
|
|
|
gfx_draw_string_left(dpi, STR_FORMAT_INTEGER, &baseHeight, COLOUR_DARK_GREEN, x, y);
|
2017-06-06 23:24:18 +02:00
|
|
|
|
2018-06-22 23:21:44 +02:00
|
|
|
// Slope label
|
|
|
|
x = w->x + w->widgets[WIDX_GROUPBOX_DETAILS].left + 7;
|
|
|
|
y = w->y + w->widgets[WIDX_WALL_DROPDOWN_SLOPE].top;
|
|
|
|
gfx_draw_string_left(dpi, STR_TILE_INSPECTOR_WALL_SLOPE, nullptr, COLOUR_DARK_GREEN, x, y);
|
|
|
|
break;
|
2017-06-06 23:24:18 +02:00
|
|
|
}
|
|
|
|
|
2018-06-22 23:21:44 +02:00
|
|
|
case TILE_INSPECTOR_PAGE_LARGE_SCENERY:
|
|
|
|
{
|
|
|
|
// Details
|
|
|
|
// Type
|
2018-09-14 12:12:22 +02:00
|
|
|
auto sceneryElement = tileElement->AsLargeScenery();
|
|
|
|
int16_t largeSceneryType = sceneryElement->GetEntryIndex();
|
2018-06-22 23:21:44 +02:00
|
|
|
gfx_draw_string_left(dpi, STR_TILE_INSPECTOR_LARGE_SCENERY_TYPE, &largeSceneryType, COLOUR_DARK_GREEN, x, y);
|
|
|
|
|
|
|
|
// Part ID
|
2018-09-14 12:12:22 +02:00
|
|
|
int16_t pieceID = sceneryElement->GetSequenceIndex();
|
2018-06-22 23:21:44 +02:00
|
|
|
gfx_draw_string_left(dpi, STR_TILE_INSPECTOR_LARGE_SCENERY_PIECE_ID, &pieceID, COLOUR_DARK_GREEN, x, y + 11);
|
|
|
|
|
|
|
|
// Banner info
|
2018-09-14 12:12:22 +02:00
|
|
|
rct_scenery_entry* largeSceneryEntry = get_large_scenery_entry(largeSceneryType);
|
2018-06-22 23:21:44 +02:00
|
|
|
if (largeSceneryEntry->large_scenery.scrolling_mode != 0xFF)
|
|
|
|
{
|
2018-09-14 12:12:22 +02:00
|
|
|
const BannerIndex bannerIndex = sceneryElement->GetBannerIndex();
|
2018-06-22 23:21:44 +02:00
|
|
|
rct_string_id* string = &gBanners[bannerIndex].string_idx;
|
|
|
|
gfx_draw_string_left(dpi, STR_TILE_INSPECTOR_ENTRY_BANNER_TEXT, string, COLOUR_DARK_GREEN, x, y + 22);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
gfx_draw_string_left(dpi, STR_TILE_INSPECTOR_ENTRY_BANNER_NONE, nullptr, COLOUR_DARK_GREEN, x, y + 22);
|
|
|
|
}
|
2017-06-06 23:24:18 +02:00
|
|
|
|
2018-06-22 23:21:44 +02:00
|
|
|
// Properties
|
|
|
|
// Raise / lower label
|
|
|
|
y = w->y + w->widgets[WIDX_LARGE_SCENERY_SPINNER_HEIGHT].top;
|
|
|
|
gfx_draw_string_left(dpi, STR_TILE_INSPECTOR_BASE_HEIGHT_FULL, nullptr, COLOUR_DARK_GREEN, x, y);
|
2017-06-06 23:24:18 +02:00
|
|
|
|
2018-06-22 23:21:44 +02:00
|
|
|
// Current base height
|
|
|
|
x = w->x + w->widgets[WIDX_LARGE_SCENERY_SPINNER_HEIGHT].left + 3;
|
|
|
|
int32_t baseHeight = tileElement->base_height;
|
|
|
|
gfx_draw_string_left(dpi, STR_FORMAT_INTEGER, &baseHeight, COLOUR_DARK_GREEN, x, y);
|
|
|
|
break;
|
2017-06-06 23:24:18 +02:00
|
|
|
}
|
|
|
|
|
2018-06-22 23:21:44 +02:00
|
|
|
case TILE_INSPECTOR_PAGE_BANNER:
|
|
|
|
{
|
|
|
|
// Details
|
|
|
|
// Banner info
|
2018-09-26 14:07:04 +02:00
|
|
|
const uint8_t bannerIndex = tileElement->AsBanner()->GetIndex();
|
2018-06-22 23:21:44 +02:00
|
|
|
if (gBanners[bannerIndex].flags & BANNER_FLAG_NO_ENTRY)
|
|
|
|
{
|
|
|
|
rct_string_id noEntryStringIdx = STR_NO_ENTRY;
|
|
|
|
gfx_draw_string_left(dpi, STR_TILE_INSPECTOR_ENTRY_BANNER_TEXT, &noEntryStringIdx, COLOUR_DARK_GREEN, x, y);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
gfx_draw_string_left(
|
|
|
|
dpi, STR_TILE_INSPECTOR_ENTRY_BANNER_TEXT, &gBanners[bannerIndex].string_idx, COLOUR_DARK_GREEN, x, y);
|
|
|
|
}
|
2017-06-06 23:24:18 +02:00
|
|
|
|
2018-06-22 23:21:44 +02:00
|
|
|
// Properties
|
|
|
|
// Raise / lower label
|
|
|
|
y = w->y + w->widgets[WIDX_BANNER_SPINNER_HEIGHT].top;
|
|
|
|
gfx_draw_string_left(dpi, STR_TILE_INSPECTOR_BASE_HEIGHT_FULL, nullptr, COLOUR_DARK_GREEN, x, y);
|
2017-06-06 23:24:18 +02:00
|
|
|
|
2018-06-22 23:21:44 +02:00
|
|
|
// Current base height
|
|
|
|
x = w->x + w->widgets[WIDX_BANNER_SPINNER_HEIGHT].left + 3;
|
|
|
|
int32_t baseHeight = tileElement->base_height;
|
|
|
|
gfx_draw_string_left(dpi, STR_FORMAT_INTEGER, &baseHeight, COLOUR_DARK_GREEN, x, y);
|
2017-06-06 23:24:18 +02:00
|
|
|
|
2018-06-22 23:21:44 +02:00
|
|
|
// Blocked paths
|
|
|
|
y += 28;
|
|
|
|
x = w->x + w->widgets[WIDX_GROUPBOX_DETAILS].left + 7;
|
|
|
|
gfx_draw_string_left(dpi, STR_TILE_INSPECTOR_BANNER_BLOCKED_PATHS, nullptr, COLOUR_DARK_GREEN, x, y);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
case TILE_INSPECTOR_PAGE_CORRUPT:
|
|
|
|
{
|
|
|
|
// Properties
|
|
|
|
// Raise / lower label
|
|
|
|
y = w->y + w->widgets[WIDX_CORRUPT_SPINNER_HEIGHT].top;
|
|
|
|
gfx_draw_string_left(dpi, STR_TILE_INSPECTOR_BASE_HEIGHT_FULL, nullptr, COLOUR_DARK_GREEN, x, y);
|
|
|
|
|
|
|
|
// Current base height
|
|
|
|
x = w->x + w->widgets[WIDX_CORRUPT_SPINNER_HEIGHT].left + 3;
|
|
|
|
int32_t baseHeight = tileElement->base_height;
|
|
|
|
gfx_draw_string_left(dpi, STR_FORMAT_INTEGER, &baseHeight, COLOUR_DARK_GREEN, x, y);
|
|
|
|
break;
|
|
|
|
}
|
2017-06-06 23:24:18 +02:00
|
|
|
} // switch page
|
|
|
|
}
|
2015-06-01 03:33:56 +02:00
|
|
|
}
|
|
|
|
|
2018-06-20 17:28:51 +02:00
|
|
|
static void window_tile_inspector_scrollpaint(rct_window* w, rct_drawpixelinfo* dpi, int32_t scrollIndex)
|
2016-11-01 23:43:39 +01:00
|
|
|
{
|
2018-06-20 17:28:51 +02:00
|
|
|
const int32_t listWidth = w->widgets[WIDX_LIST].right - w->widgets[WIDX_LIST].left;
|
2018-05-21 13:46:55 +02:00
|
|
|
gfx_fill_rect(dpi, dpi->x, dpi->y, dpi->x + dpi->width - 1, dpi->y + dpi->height - 1, ColourMapA[w->colours[1]].mid_light);
|
|
|
|
|
2018-06-20 17:28:51 +02:00
|
|
|
int32_t y = SCROLLABLE_ROW_HEIGHT * (windowTileInspectorElementCount - 1);
|
|
|
|
int32_t i = 0;
|
2017-06-06 23:24:18 +02:00
|
|
|
char buffer[256];
|
|
|
|
|
|
|
|
if (!windowTileInspectorTileSelected)
|
|
|
|
return;
|
|
|
|
|
2018-05-21 13:46:55 +02:00
|
|
|
const rct_tile_element* tileElement = map_get_first_element_at(windowTileInspectorTileX, windowTileInspectorTileY);
|
2017-06-06 23:24:18 +02:00
|
|
|
|
|
|
|
gCurrentFontSpriteBase = FONT_SPRITE_BASE_MEDIUM;
|
2018-06-22 23:21:44 +02:00
|
|
|
do
|
|
|
|
{
|
2018-06-11 01:09:00 +02:00
|
|
|
const bool selectedRow = i == windowTileInspectorSelectedIndex;
|
2018-05-22 21:54:09 +02:00
|
|
|
const bool hoveredRow = i == windowTileInspectorHighlightedIndex;
|
2018-06-20 17:28:51 +02:00
|
|
|
int32_t type = tileElement->GetType();
|
2018-05-22 21:54:09 +02:00
|
|
|
const char* typeName = "";
|
2018-05-21 13:46:55 +02:00
|
|
|
|
2018-05-22 21:54:09 +02:00
|
|
|
if (selectedRow)
|
2018-05-21 13:46:55 +02:00
|
|
|
{
|
2018-05-26 01:19:31 +02:00
|
|
|
gfx_fill_rect(dpi, 0, y, listWidth, y + SCROLLABLE_ROW_HEIGHT - 1, ColourMapA[w->colours[1]].mid_dark);
|
2018-05-21 13:46:55 +02:00
|
|
|
}
|
2018-05-22 21:54:09 +02:00
|
|
|
else if (hoveredRow)
|
|
|
|
{
|
2018-05-26 01:19:31 +02:00
|
|
|
gfx_fill_rect(dpi, 0, y, listWidth, y + SCROLLABLE_ROW_HEIGHT - 1, ColourMapA[w->colours[1]].mid_dark | 0x1000000);
|
2018-05-22 21:54:09 +02:00
|
|
|
}
|
|
|
|
else if (((windowTileInspectorElementCount - i) & 1) == 0)
|
|
|
|
{
|
|
|
|
// Zebra stripes
|
2018-05-26 01:19:31 +02:00
|
|
|
gfx_fill_rect(dpi, 0, y, listWidth, y + SCROLLABLE_ROW_HEIGHT - 1, ColourMapA[w->colours[1]].light | 0x1000000);
|
2018-05-22 21:54:09 +02:00
|
|
|
}
|
2017-06-06 23:24:18 +02:00
|
|
|
|
2018-06-22 23:21:44 +02:00
|
|
|
switch (type)
|
|
|
|
{
|
|
|
|
case TILE_ELEMENT_TYPE_SURFACE:
|
|
|
|
typeName = language_get_string(STR_TILE_INSPECTOR_SURFACE);
|
|
|
|
break;
|
|
|
|
case TILE_ELEMENT_TYPE_PATH:
|
2018-10-03 10:57:29 +02:00
|
|
|
typeName = tileElement->AsPath()->IsQueue() ? language_get_string(STR_QUEUE_LINE_MAP_TIP)
|
|
|
|
: language_get_string(STR_FOOTPATH_MAP_TIP);
|
2018-06-22 23:21:44 +02:00
|
|
|
break;
|
|
|
|
case TILE_ELEMENT_TYPE_TRACK:
|
|
|
|
typeName = language_get_string(STR_RIDE_COMPONENT_TRACK_CAPITALISED);
|
|
|
|
break;
|
|
|
|
case TILE_ELEMENT_TYPE_SMALL_SCENERY:
|
|
|
|
snprintf(
|
2018-07-21 13:51:54 +02:00
|
|
|
buffer, sizeof(buffer), "%s (%s)", language_get_string(STR_OBJECT_SELECTION_SMALL_SCENERY),
|
2018-09-13 17:02:38 +02:00
|
|
|
language_get_string(get_small_scenery_entry(tileElement->AsSmallScenery()->GetEntryIndex())->name));
|
2018-06-22 23:21:44 +02:00
|
|
|
typeName = buffer;
|
|
|
|
break;
|
|
|
|
case TILE_ELEMENT_TYPE_ENTRANCE:
|
|
|
|
typeName = language_get_string(STR_RIDE_CONSTRUCTION_ENTRANCE);
|
|
|
|
break;
|
|
|
|
case TILE_ELEMENT_TYPE_WALL:
|
|
|
|
snprintf(
|
2018-07-21 13:51:54 +02:00
|
|
|
buffer, sizeof(buffer), "%s (%s)", language_get_string(STR_TILE_INSPECTOR_WALL),
|
2018-09-17 15:42:34 +02:00
|
|
|
language_get_string(tileElement->AsWall()->GetEntry()->name));
|
2018-06-22 23:21:44 +02:00
|
|
|
typeName = buffer;
|
|
|
|
break;
|
|
|
|
case TILE_ELEMENT_TYPE_LARGE_SCENERY:
|
|
|
|
typeName = language_get_string(STR_OBJECT_SELECTION_LARGE_SCENERY);
|
|
|
|
break;
|
|
|
|
case TILE_ELEMENT_TYPE_BANNER:
|
|
|
|
snprintf(
|
2018-07-21 13:51:54 +02:00
|
|
|
buffer, sizeof(buffer), "%s (%d)", language_get_string(STR_BANNER_WINDOW_TITLE),
|
2018-09-26 14:07:04 +02:00
|
|
|
tileElement->AsBanner()->GetIndex());
|
2018-06-22 23:21:44 +02:00
|
|
|
typeName = buffer;
|
|
|
|
break;
|
|
|
|
case TILE_ELEMENT_TYPE_CORRUPT:
|
|
|
|
// fall-through
|
|
|
|
default:
|
|
|
|
snprintf(buffer, sizeof(buffer), "%s (%d)", language_get_string(STR_UNKNOWN_OBJECT_TYPE), type);
|
|
|
|
typeName = buffer;
|
2017-06-06 23:24:18 +02:00
|
|
|
}
|
|
|
|
|
2018-06-20 17:28:51 +02:00
|
|
|
const int32_t baseHeight = tileElement->base_height;
|
|
|
|
const int32_t clearanceHeight = tileElement->clearance_height;
|
2017-10-31 14:03:45 +01:00
|
|
|
const bool ghost = (tileElement->flags & TILE_ELEMENT_FLAG_GHOST) != 0;
|
|
|
|
const bool broken = (tileElement->flags & TILE_ELEMENT_FLAG_BROKEN) != 0;
|
|
|
|
const bool last = (tileElement->flags & TILE_ELEMENT_FLAG_LAST_TILE) != 0;
|
2018-05-21 13:46:55 +02:00
|
|
|
|
2018-05-22 21:54:09 +02:00
|
|
|
const rct_string_id stringFormat = (selectedRow || hoveredRow) ? STR_WHITE_STRING : STR_WINDOW_COLOUR_2_STRINGID;
|
2018-05-21 13:46:55 +02:00
|
|
|
|
|
|
|
// Undo relative scroll offset, but keep the 3 pixel padding
|
2018-06-20 17:28:51 +02:00
|
|
|
const int32_t x = -w->widgets[WIDX_LIST].left;
|
2018-05-21 13:46:55 +02:00
|
|
|
set_format_arg(0, rct_string_id, STR_STRING);
|
|
|
|
set_format_arg(2, char*, typeName);
|
2018-06-22 23:21:44 +02:00
|
|
|
gfx_draw_string_left_clipped(
|
|
|
|
dpi, stringFormat, gCommonFormatArgs, COLOUR_BLACK, x + COL_X_TYPE + 3, y, COL_X_BH); // 3px padding
|
2018-05-21 13:46:55 +02:00
|
|
|
|
|
|
|
// Base height
|
|
|
|
set_format_arg(0, rct_string_id, STR_FORMAT_INTEGER);
|
2018-06-20 17:28:51 +02:00
|
|
|
set_format_arg(2, int32_t, baseHeight);
|
2018-05-21 13:46:55 +02:00
|
|
|
gfx_draw_string_left(dpi, stringFormat, gCommonFormatArgs, COLOUR_BLACK, x + COL_X_BH, y);
|
|
|
|
|
|
|
|
// Clearance height
|
|
|
|
set_format_arg(0, rct_string_id, STR_FORMAT_INTEGER);
|
2018-06-20 17:28:51 +02:00
|
|
|
set_format_arg(2, int32_t, clearanceHeight);
|
2018-05-21 13:46:55 +02:00
|
|
|
gfx_draw_string_left(dpi, stringFormat, gCommonFormatArgs, COLOUR_BLACK, x + COL_X_CH, y);
|
|
|
|
|
|
|
|
// Checkmarks for ghost, broken en last for tile
|
|
|
|
set_format_arg(0, rct_string_id, STR_STRING);
|
|
|
|
set_format_arg(2, char*, CheckBoxMarkString);
|
|
|
|
if (ghost)
|
|
|
|
{
|
|
|
|
gfx_draw_string_left(dpi, stringFormat, gCommonFormatArgs, COLOUR_BLACK, x + COL_X_GF, y);
|
|
|
|
}
|
|
|
|
if (broken)
|
|
|
|
{
|
|
|
|
gfx_draw_string_left(dpi, stringFormat, gCommonFormatArgs, COLOUR_BLACK, x + COL_X_BF, y);
|
|
|
|
}
|
|
|
|
if (last)
|
|
|
|
{
|
|
|
|
gfx_draw_string_left(dpi, stringFormat, gCommonFormatArgs, COLOUR_BLACK, x + COL_X_LF, y);
|
|
|
|
}
|
2017-06-06 23:24:18 +02:00
|
|
|
|
2018-05-26 01:19:31 +02:00
|
|
|
y -= SCROLLABLE_ROW_HEIGHT;
|
2017-06-06 23:24:18 +02:00
|
|
|
i++;
|
2018-05-24 11:44:53 +02:00
|
|
|
} while (!(tileElement++)->IsLastForTile());
|
2015-06-01 03:33:56 +02:00
|
|
|
}
|