Rewrote Themes

Added rct1 styles and lights.
Themes are now easier to expand
Added features tab to themes window
This commit is contained in:
Robert Jordan 2015-06-07 20:31:54 -04:00
parent 65377629e4
commit e90c724a3a
23 changed files with 741 additions and 254 deletions

View File

@ -3614,3 +3614,7 @@ STR_5277 :Clear
STR_5278 :Editable land rights
STR_5279 :Normal map window
STR_5280 :{SMALLFONT}{BLACK}Allow editing land ownership settings through the Map window
STR_5281 :{SMALLFONT}{BLACK}Features
STR_5282 :RCT1 Ride Open/Close Lights
STR_5283 :RCT1 Park Open/Close Lights
STR_5284 :RCT1 Scenario Selection Font

BIN
resources/g2/17.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 232 B

BIN
resources/g2/18.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 229 B

BIN
resources/g2/19.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 271 B

BIN
resources/g2/20.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 268 B

BIN
resources/g2/21.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 242 B

BIN
resources/g2/22.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 235 B

BIN
resources/g2/23.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 280 B

BIN
resources/g2/24.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 280 B

BIN
resources/g2/25.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 240 B

BIN
resources/g2/26.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 236 B

BIN
resources/g2/27.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 282 B

BIN
resources/g2/28.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 282 B

View File

@ -1003,16 +1003,55 @@ bool config_shortcut_keys_save()
#pragma region Themes
static void themes_remove_extension(char *path);
static bool themes_open(const utf8string path);
static bool themes_save(const utf8string path, int preset);
static void themes_read_properties(int preset, window_colours **current_window_colours, const_utf8string line);
static void themes_set_property(window_colours *colour_scheme, utf8string name, utf8string value);
typedef struct {
size_t offset;
const_utf8string property_name;
uint8 type;
value_union default_value;
config_enum_definition *enum_definitions;
} theme_property_definition;
typedef struct {
size_t offset;
const_utf8string section_name;
theme_property_definition *property_definitions;
int property_definitions_count;
} theme_section_definition;
theme_property_definition _themeWindowDefinitions[] = {
{ offsetof(theme_window, colours[0]), "colour_0", CONFIG_VALUE_TYPE_UINT8, 0, NULL },
{ offsetof(theme_window, colours[1]), "colour_1", CONFIG_VALUE_TYPE_UINT8, 0, NULL },
{ offsetof(theme_window, colours[2]), "colour_2", CONFIG_VALUE_TYPE_UINT8, 0, NULL },
{ offsetof(theme_window, colours[3]), "colour_3", CONFIG_VALUE_TYPE_UINT8, 0, NULL },
{ offsetof(theme_window, colours[4]), "colour_4", CONFIG_VALUE_TYPE_UINT8, 0, NULL },
{ offsetof(theme_window, colours[5]), "colour_5", CONFIG_VALUE_TYPE_UINT8, 0, NULL },
};
theme_property_definition _themeFeaturesDefinitions[] = {
{ offsetof(theme_features, rct1_ride_lights), "rct1_ride_lights", CONFIG_VALUE_TYPE_BOOLEAN, false, NULL },
{ offsetof(theme_features, rct1_park_lights), "rct1_park_lights", CONFIG_VALUE_TYPE_BOOLEAN, false, NULL },
{ offsetof(theme_features, rct1_scenario_font), "rct1_scenario_font", CONFIG_VALUE_TYPE_BOOLEAN, false, NULL },
};
theme_section_definition _themeSectionDefinitions[] = {
// Special definition for theme windows
{ 0, "", _themeWindowDefinitions, countof(_themeWindowDefinitions) },
{ offsetof(theme_preset, features), "features", _themeFeaturesDefinitions, countof(_themeFeaturesDefinitions) },
};
static void themes_remove_extension(char *path);
static bool themes_open(const_utf8string path);
static bool themes_save(const_utf8string path, int preset);
static void themes_read_properties(theme_preset *theme, theme_section_definition **currentSection, utf8string line);
static void themes_set_property(theme_preset *theme, const theme_section_definition *section, const theme_property_definition *property, utf8string value, int valueSize);
static theme_section_definition* themes_get_section_def(utf8string name, int size);
static theme_property_definition *themes_get_property_def(theme_section_definition *section, utf8string name, int size);
void themes_set_default()
{
utf8 path[MAX_PATH];
platform_get_user_directory(path, "themes");
@ -1021,28 +1060,39 @@ void themes_set_default()
gConfigThemes.num_presets = 2;
gConfigThemes.presets = malloc(sizeof(theme_preset) * gConfigThemes.num_presets);
// Set RCT2 colour scheme
// Set RCT2 theme
strcpy(gConfigThemes.presets[0].name, language_get_string(2741));
gConfigThemes.presets[0].colour_schemes = malloc(sizeof(window_colours) * gNumColourSchemeWindows);
for (int i = 0; i < (int)gNumColourSchemeWindows; i++) {
for (int j = 0; j < 6; j++)
gConfigThemes.presets[0].colour_schemes[i].colours[j] = gColourSchemes[i].colours[j];
gConfigThemes.presets[0].windows = malloc(sizeof(theme_window) * gNumThemeWindows);
// Define the defaults for RCT2 here
gConfigThemes.presets[0].features.rct1_ride_lights = false;
gConfigThemes.presets[0].features.rct1_park_lights = false;
gConfigThemes.presets[0].features.rct1_scenario_font = false;
for (int i = 0; i < (int)gNumThemeWindows; i++) {
gConfigThemes.presets[0].windows[i] = gThemeWindowDefinitions[i].window;
}
// Set RCT1 colour scheme
// Set RCT1 theme
strcpy(gConfigThemes.presets[1].name, language_get_string(2740));
gConfigThemes.presets[1].colour_schemes = malloc(sizeof(window_colours) * gNumColourSchemeWindows);
for (int i = 0; i < (int)gNumColourSchemeWindows; i++) {
gConfigThemes.presets[1].windows = malloc(sizeof(theme_window) * gNumThemeWindows);
// Define the defaults for RCT1 here
gConfigThemes.presets[1].features.rct1_ride_lights = true;
gConfigThemes.presets[1].features.rct1_park_lights = true;
gConfigThemes.presets[1].features.rct1_scenario_font = true;
for (int i = 0; i < (int)gNumThemeWindows; i++) {
uint8 changed_colour = 0xFF;
for (int k = 0; gColourSchemesRCT1[k].classification != 0xFF; k++) {
if (gColourSchemesRCT1[k].classification == gColourSchemes[i].classification) {
for (int k = 0; gThemeWindowsRCT1[k].classification != 0xFF; k++) {
if (gThemeWindowsRCT1[k].classification == gThemeWindowDefinitions[i].classification) {
changed_colour = (uint8)k;
break;
}
}
for (int j = 0; j < 6; j++) {
gConfigThemes.presets[1].colour_schemes[i].colours[j] = (changed_colour != 0xFF ? gColourSchemesRCT1[changed_colour].colours[j] : gColourSchemes[i].colours[j]);
}
gConfigThemes.presets[1].windows[i] = (changed_colour != 0xFF ? gThemeWindowsRCT1[changed_colour].window : gThemeWindowDefinitions[i].window);
}
}
@ -1095,14 +1145,14 @@ bool themes_save_preset(int preset)
return false;
}
bool themes_open(const utf8string path)
bool themes_open(const_utf8string path)
{
FILE *file;
uint8 *lineBuffer;
size_t lineBufferCapacity;
size_t lineLength;
int c, preset;
window_colours *currentColourScheme;
theme_section_definition *currentSection;
file = fopen(path, "rb");
if (file == NULL)
@ -1121,14 +1171,16 @@ bool themes_open(const utf8string path)
gConfigThemes.presets = realloc(gConfigThemes.presets, sizeof(theme_preset) * gConfigThemes.num_presets);
strcpy(gConfigThemes.presets[preset].name, path_get_filename(path));
themes_remove_extension(gConfigThemes.presets[preset].name);
gConfigThemes.presets[preset].colour_schemes = malloc(sizeof(window_colours) * gNumColourSchemeWindows);
for (int i = 0; i < (int)gNumColourSchemeWindows; i++) {
for (int j = 0; j < 6; j++)
gConfigThemes.presets[preset].colour_schemes[i].colours[j] = gColourSchemes[i].colours[j];
gConfigThemes.presets[preset].windows = malloc(sizeof(theme_window) * gNumThemeWindows);
gConfigThemes.presets[preset].features.rct1_ride_lights = false;
gConfigThemes.presets[preset].features.rct1_park_lights = false;
gConfigThemes.presets[preset].features.rct1_scenario_font = false;
for (int i = 0; i < (int)gNumThemeWindows; i++) {
gConfigThemes.presets[preset].windows[i] = gThemeWindowDefinitions[i].window;
}
}
currentColourScheme = NULL;
currentSection = NULL;
lineBufferCapacity = 64;
lineBuffer = malloc(lineBufferCapacity);
lineLength = 0;
@ -1141,7 +1193,7 @@ bool themes_open(const utf8string path)
while ((c = fgetc(file)) != EOF) {
if (c == '\n' || c == '\r') {
lineBuffer[lineLength++] = 0;
themes_read_properties(preset, &currentColourScheme, (const_utf8string)lineBuffer);
themes_read_properties(&gConfigThemes.presets[preset], &currentSection, (utf8string)lineBuffer);
lineLength = 0;
}
else {
@ -1156,7 +1208,7 @@ bool themes_open(const utf8string path)
if (lineLength > 0) {
lineBuffer[lineLength++] = 0;
themes_read_properties(preset, &currentColourScheme, lineBuffer);
themes_read_properties(&gConfigThemes.presets[preset], &currentSection, lineBuffer);
}
free(lineBuffer);
@ -1164,79 +1216,179 @@ bool themes_open(const utf8string path)
return true;
}
static bool themes_save(const utf8string path, int preset)
static bool themes_save(const_utf8string path, int preset)
{
FILE *file;
int i, j;
value_union *value;
file = fopen(path, "wb");
if (file == NULL) {
log_error("Unable to write to colour scheme file.");
log_error("Unable to write to theme file.");
return false;
}
for (i = 0; i < (int)gNumColourSchemeWindows; i++) {
window_colour_scheme* colour_scheme_info = &gColourSchemes[i];
window_colours* colour_scheme = &gConfigThemes.presets[preset].colour_schemes[i];
// Skip the window definition, we'll do that after
for (i = 1; i < countof(_themeSectionDefinitions); i++) {
theme_section_definition *section = &_themeSectionDefinitions[i];
fputc('[', file);
fwrite(colour_scheme_info->section_name, strlen(colour_scheme_info->section_name), 1, file);
fwrite(section->section_name, strlen(section->section_name), 1, file);
fputc(']', file);
fputc('\n', file);
for (j = 0; j < colour_scheme_info->num_colours; j++) {
for (j = 0; j < section->property_definitions_count; j++) {
theme_property_definition *property = &section->property_definitions[j];
fprintf(file, "colour_%d", j);
fwrite(property->property_name, strlen(property->property_name), 1, file);
fwrite(" = ", 3, 1, file);
fprintf(file, "%u", colour_scheme->colours[j]);
value = (value_union*)((size_t)&gConfigThemes.presets[preset] + (size_t)section->offset + (size_t)property->offset);
if (property->enum_definitions != NULL)
config_write_enum(file, property->type, value, property->enum_definitions);
else
config_save_property_value(file, property->type, value);
fputc('\n', file);
}
fputc('\n', file);
}
for (i = 0; i < (int)gNumThemeWindows; i++) {
theme_section_definition *section = &_themeSectionDefinitions[0];
fputc('[', file);
fwrite(gThemeWindowDefinitions[i].section_name, strlen(gThemeWindowDefinitions[i].section_name), 1, file);
fputc(']', file);
fputc('\n', file);
for (j = 0; j < section->property_definitions_count; j++) {
theme_property_definition *property = &section->property_definitions[j];
fwrite(property->property_name, strlen(property->property_name), 1, file);
fwrite(" = ", 3, 1, file);
value = (value_union*)((size_t)gConfigThemes.presets[preset].windows + (size_t)(sizeof(theme_window) * i) + (size_t)property->offset);
if (property->enum_definitions != NULL)
config_write_enum(file, property->type, value, property->enum_definitions);
else
config_save_property_value(file, property->type, value);
fputc('\n', file);
}
}
fclose(file);
return true;
}
static void themes_read_properties(int preset, window_colours **colour_scheme, const_utf8string line)
static void themes_read_properties(theme_preset *theme, theme_section_definition **currentSection, utf8string line)
{
utf8string ch = (utf8string)line;
utf8 *ch = (utf8*)line;
utf8_skip_whitespace(&ch);
if (*ch == '[') {
utf8string sectionName;
const utf8 *sectionName;
int sectionNameSize;
if (config_get_section(ch, &sectionName, &sectionNameSize)) {
sectionName[strlen(sectionName) - 1] = '\0';
for (int i = 0; i < (int)gNumColourSchemeWindows; i++) {
if (strcmp(sectionName, gColourSchemes[i].section_name) == 0) {
*colour_scheme = &(gConfigThemes.presets[preset].colour_schemes[i]);
break;
}
}
}
if (config_get_section(ch, &sectionName, &sectionNameSize))
*currentSection = themes_get_section_def((utf8string)sectionName, sectionNameSize);
}
else {
if (*colour_scheme != NULL) {
utf8string propertyName, value;
if (*currentSection != NULL) {
utf8 *propertyName, *value;
int propertyNameSize, valueSize;
if (config_get_property_name_value(ch, &propertyName, &propertyNameSize, &value, &valueSize)) {
propertyName[propertyNameSize] = '\0';
themes_set_property(*colour_scheme, propertyName, value);
theme_property_definition *property;
property = themes_get_property_def(*currentSection, propertyName, propertyNameSize);
if (property != NULL)
themes_set_property(theme, *currentSection, property, value, valueSize);
}
}
}
}
static void themes_set_property(window_colours *colour_scheme, utf8string name, utf8string value)
static void themes_set_property(theme_preset *theme, const theme_section_definition *section, const theme_property_definition *property, utf8string value, int valueSize)
{
const_utf8string colour_names[] = { "colour_0", "colour_1", "colour_2", "colour_3", "colour_4", "colour_5" };
value_union *destValue = (value_union*)((size_t)theme + (size_t)section->offset + (size_t)property->offset);
for (int i = 0; i < 6; i++) {
if (strcmp(name, colour_names[i]) == 0) {
colour_scheme->colours[i] = (uint8)strtol(value, NULL, 0);
// Get getting the address from the windows pointer instead
if (section == &_themeSectionDefinitions[0])
destValue = (value_union*)((size_t)theme->windows + (size_t)section->offset + (size_t)property->offset);
if (property->enum_definitions != NULL)
if (config_read_enum(destValue, _configValueTypeSize[property->type], value, valueSize, property->enum_definitions))
return;
switch (property->type) {
case CONFIG_VALUE_TYPE_BOOLEAN:
if (_strnicmp(value, "false", valueSize) == 0) destValue->value_boolean = false;
else if (_strnicmp(value, "true", valueSize) == 0) destValue->value_boolean = true;
else destValue->value_boolean = strtol(value, NULL, 0) != 0;
break;
case CONFIG_VALUE_TYPE_UINT8:
destValue->value_uint8 = (uint8)strtol(value, NULL, 0);
break;
case CONFIG_VALUE_TYPE_UINT16:
destValue->value_uint16 = (uint16)strtol(value, NULL, 0);
break;
case CONFIG_VALUE_TYPE_UINT32:
destValue->value_uint32 = (uint32)strtol(value, NULL, 0);
break;
case CONFIG_VALUE_TYPE_SINT8:
destValue->value_sint8 = (sint8)strtol(value, NULL, 0);
break;
case CONFIG_VALUE_TYPE_SINT16:
destValue->value_sint16 = (sint16)strtol(value, NULL, 0);
break;
case CONFIG_VALUE_TYPE_SINT32:
destValue->value_sint32 = (sint32)strtol(value, NULL, 0);
break;
case CONFIG_VALUE_TYPE_FLOAT:
destValue->value_float = strtof(value, NULL);
break;
case CONFIG_VALUE_TYPE_DOUBLE:
destValue->value_double = strtod(value, NULL);
break;
case CONFIG_VALUE_TYPE_STRING:
SafeFree(destValue->value_string);
destValue->value_string = malloc(valueSize + 1);
memcpy(destValue->value_string, value, valueSize);
destValue->value_string[valueSize] = 0;
break;
}
}
static theme_section_definition* themes_get_section_def(utf8string name, int size)
{
int i;
// Skip the special definition
for (i = 1; i < countof(_themeSectionDefinitions); i++) {
const_utf8string sectionName = _themeSectionDefinitions[i].section_name;
if (sectionName[size] == 0 && _strnicmp(sectionName, name, size) == 0)
return &_themeSectionDefinitions[i];
}
// Check for window definitions
for (i = 0; i < (int)gNumThemeWindows; i++) {
const_utf8string sectionName = gThemeWindowDefinitions[i].section_name;
if (sectionName[size] == 0 && _strnicmp(sectionName, name, size) == 0) {
_themeSectionDefinitions[0].offset = (size_t)(sizeof(theme_window) * i);
return &_themeSectionDefinitions[0];
}
}
return NULL;
}
static theme_property_definition *themes_get_property_def(theme_section_definition *section, utf8string name, int size)
{
int i;
for (i = 0; i < section->property_definitions_count; i++) {
const_utf8string propertyName = section->property_definitions[i].property_name;
if (propertyName[size] == 0 && _strnicmp(propertyName, name, size) == 0)
return &section->property_definitions[i];
}
return NULL;
}
static void themes_remove_extension(char *path)

View File

@ -176,13 +176,28 @@ typedef struct {
uint8 enable_news;
} twitch_configuration;
typedef struct {
typedef struct theme_window {
uint8 colours[6];
} window_colours;
// Define any other settings for all windows here
} theme_window;
// Define structures for any other settings here
typedef struct {
window_colours *colour_schemes;
uint8 rct1_ride_lights;
uint8 rct1_park_lights;
uint8 rct1_scenario_font;
} theme_features;
typedef struct theme_preset {
char name[256];
theme_window *windows;
// Add structures for any other settings here
theme_features features;
} theme_preset;
typedef struct {

View File

@ -18,141 +18,154 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*****************************************************************************/
#include "../config.h"
#include "../localisation/string_ids.h"
#include "window.h"
#include "themes.h"
window_colour_scheme gColourSchemes[] = {
{ WC_TOP_TOOLBAR, { 7, 12, 24, 1, 0, 0 }, 4, 5245, "top_toolbar" },
{ WC_BOTTOM_TOOLBAR, { 140, 140, 0, 14, 0, 0 }, 4, 5246, "bottom_toolbar" },
{ WC_RIDE, { 1, 26, 11, 0, 0, 0 }, 3, 5203, "ride" },
{ WC_RIDE_CONSTRUCTION, { 24, 24, 24, 0, 0, 0 }, 3, 5199, "ride_construction" },
{ WC_RIDE_LIST, { 1, 26, 26, 0, 0, 0 }, 3, 5204, "ride_list" },
{ WC_SAVE_PROMPT, { 154, 0, 0, 0, 0, 0 }, 1, 5223, "save_prompt" },
{ WC_CONSTRUCT_RIDE, { 24, 26, 26, 0, 0, 0 }, 3, 5201, "new_ride" },
{ WC_DEMOLISH_RIDE_PROMPT, { 154, 0, 0, 0, 0, 0 }, 1, 5224, "demolish_ride_prompt" },
{ WC_SCENERY, { 24, 12, 12, 0, 0, 0 }, 3, 5197, "scenery" },
{ WC_OPTIONS, { 7, 7, 7, 0, 0, 0 }, 3, 5219, "options" },
{ WC_FOOTPATH, { 24, 24, 24, 0, 0, 0 }, 3, 5198, "footpath" },
{ WC_LAND, { 24, 24, 24, 0, 0, 0 }, 3, 5193, "land" },
{ WC_WATER, { 24, 24, 24, 0, 0, 0 }, 3, 5194, "water" },
{ WC_PEEP, { 1, 15, 15, 0, 0, 0 }, 3, 5205, "guest" },
{ WC_GUEST_LIST, { 1, 15, 15, 0, 0, 0 }, 3, 5206, "guest_list" },
{ WC_STAFF_LIST, { 1, 4, 4, 0, 0, 0 }, 3, 5208, "staff_list" },
{ WC_FIRE_PROMPT, { 154, 0, 0, 0, 0, 0 }, 1, 5225, "staff_fire_prompt" },
{ WC_PARK_INFORMATION, { 1, 19, 19, 0, 0, 0 }, 3, 5253, "park_information" },
{ WC_FINANCES, { 1, 19, 19, 0, 0, 0 }, 3, 5187, "finances" },
{ WC_TITLE_MENU, { 140, 140, 140, 0, 0, 0 }, 3, 5249, "title_menu" },
{ WC_TITLE_EXIT, { 140, 140, 140, 0, 0, 0 }, 3, 5250, "title_exit" },
{ WC_RECENT_NEWS, { 1, 1, 0, 0, 0, 0 }, 3, 5192, "recent_news" },
{ WC_SCENARIO_SELECT, { 1, 26, 26, 0, 0, 0 }, 3, 5252, "scenario_select" },
{ WC_TRACK_DESIGN_LIST, { 26, 26, 26, 0, 0, 0 }, 3, 5202, "track_design_list" },
{ WC_TRACK_DESIGN_PLACE, { 24, 24, 24, 0, 0, 0 }, 3, 5200, "track_design_place" },
{ WC_NEW_CAMPAIGN, { 19, 19, 19, 0, 0, 0 }, 3, 5188, "new_campaign" },
{ WC_KEYBOARD_SHORTCUT_LIST, { 7, 7, 7, 0, 0, 0 }, 3, 5220, "keyboard_shortcuts" },
{ WC_CHANGE_KEYBOARD_SHORTCUT, { 7, 7, 7, 0, 0, 0 }, 3, 5221, "change_keyboard_shortcut" },
{ WC_MAP, { 12, 24, 0, 0, 0, 0 }, 2, 5190, "map" },
{ WC_BANNER, { 24, 24, 24, 0, 0, 0 }, 3, 5209, "banner" },
{ WC_EDITOR_OBJECT_SELECTION, { 4, 1, 1, 0, 0, 0 }, 3, 5210, "editor_object_selection" },
{ WC_EDITOR_INVENTION_LIST, { 4, 1, 1, 0, 0, 0 }, 3, 5211, "editor_invention_list" },
{ WC_EDITOR_SCENARIO_OPTIONS, { 4, 1, 1, 0, 0, 0 }, 3, 5212, "editor_scenario_options" },
{ WC_EDTIOR_OBJECTIVE_OPTIONS, { 4, 1, 1, 0, 0, 0 }, 3, 5213, "editor_objection_options" },
{ WC_MANAGE_TRACK_DESIGN, { 1, 1, 1, 0, 0, 0 }, 3, 5215, "manage_track_design" },
{ WC_TRACK_DELETE_PROMPT, { 26, 26, 26, 0, 0, 0 }, 3, 5226, "track_delete_prompt" },
{ WC_INSTALL_TRACK, { 26, 26, 26, 0, 0, 0 }, 3, 5216, "install_track" },
{ WC_CLEAR_SCENERY, { 24, 24, 24, 0, 0, 0 }, 3, 5195, "clear_scenery" },
{ WC_CHEATS, { 1, 19, 19, 0, 0, 0 }, 3, 5217, "cheats" },
{ WC_RESEARCH, { 1, 19, 19, 0, 0, 0 }, 3, 5189, "research" },
{ WC_VIEWPORT, { 24, 24, 24, 0, 0, 0 }, 3, 5191, "viewport" },
{ WC_MAPGEN, { 12, 24, 24, 0, 0, 0 }, 3, 5214, "map_generation" },
{ WC_LOADSAVE, { 7, 7, 7, 0, 0, 0 }, 3, 5222, "loadsave" },
{ WC_LOADSAVE_OVERWRITE_PROMPT, { 154, 0, 0, 0, 0, 0 }, 1, 5227, "loadsave_overwrite_prompt" },
{ WC_TITLE_OPTIONS, { 140, 140, 140, 0, 0, 0 }, 3, 5251, "title_options" },
{ WC_LAND_RIGHTS, { 19, 19, 19, 0, 0, 0 }, 3, 5196, "land_rights" },
{ WC_THEMES, { 1, 12, 12, 0, 0, 0 }, 3, 5218, "themes" },
{ WC_STAFF, { 1, 4, 4, 0, 0, 0 }, 3, 5207, "staff" },
{ WC_EDITOR_TRACK_BOTTOM_TOOLBAR, { 135, 135, 135, 0, 0, 0 }, 3, 5247, "editor_track_bottom_toolbar" },
{ WC_EDITOR_SCENARIO_BOTTOM_TOOLBAR, { 150, 150, 141, 0, 0, 0 }, 3, 5248, "editor_scenario_bottom_toolbar" },
#define COLOURS_1(c0) 1, { { (c0), 0, 0, 0, 0, 0 } }
#define COLOURS_2(c0, c1) 2, { { (c0), (c1), 0, 0, 0, 0 } }
#define COLOURS_3(c0, c1, c2) 3, { { (c0), (c1), (c2), 0, 0, 0 } }
#define COLOURS_4(c0, c1, c2, c3) 4, { { (c0), (c1), (c2), (c3), 0, 0 } }
#define COLOURS_5(c0, c1, c2, c3, c4) 5, { { (c0), (c1), (c2), (c3), (c4), 0 } }
#define COLOURS_6(c0, c1, c2, c3, c4, c5) 6, { { (c0), (c1), (c2), (c3), (c4), (c5) } }
#define TWINDOW(window_class, window_name, window_string_id, theme) { window_class, window_name, window_string_id, theme }
theme_window_definition gThemeWindowDefinitions[] = {
/* Window Class ini section name stringid window defaults */
{ WC_TOP_TOOLBAR, "top_toolbar", 5245, COLOURS_4(7, 12, 24, 1) },
{ WC_BOTTOM_TOOLBAR, "bottom_toolbar", 5246, COLOURS_4(140, 140, 0, 14) },
{ WC_RIDE, "ride", 5203, COLOURS_3(1, 26, 1) },
{ WC_RIDE_CONSTRUCTION, "ride_construction", 5199, COLOURS_3(24, 24, 24) },
{ WC_RIDE_LIST, "ride_list", 5204, COLOURS_3(1, 26, 26) },
{ WC_SAVE_PROMPT, "save_prompt", 5223, COLOURS_1(154) },
{ WC_CONSTRUCT_RIDE, "new_ride", 5201, COLOURS_3(24, 26, 26) },
{ WC_DEMOLISH_RIDE_PROMPT, "demolish_ride_prompt", 5224, COLOURS_1(154) },
{ WC_SCENERY, "scenery", 5197, COLOURS_3(24, 12, 12) },
{ WC_OPTIONS, "options", 5219, COLOURS_3(7, 7, 7) },
{ WC_FOOTPATH, "footpath", 5198, COLOURS_3(24, 24, 24) },
{ WC_LAND, "land", 5193, COLOURS_3(24, 24, 24) },
{ WC_WATER, "water", 5194, COLOURS_3(24, 24, 24) },
{ WC_PEEP, "guest", 5205, COLOURS_3(1, 15, 15) },
{ WC_GUEST_LIST, "guest_list", 5206, COLOURS_3(1, 15, 15) },
{ WC_STAFF_LIST, "staff_list", 5208, COLOURS_3(1, 4, 4) },
{ WC_FIRE_PROMPT, "staff_fire_prompt", 5225, COLOURS_1(154) },
{ WC_PARK_INFORMATION, "park_information", 5253, COLOURS_3(1, 19, 19) },
{ WC_FINANCES, "finances", 5187, COLOURS_3(1, 19, 19) },
{ WC_TITLE_MENU, "title_menu", 5249, COLOURS_3(140, 140, 140) },
{ WC_TITLE_EXIT, "title_exit", 5250, COLOURS_3(140, 140, 140) },
{ WC_RECENT_NEWS, "recent_news", 5192, COLOURS_3(1, 1, 0) },
{ WC_SCENARIO_SELECT, "scenario_select", 5252, COLOURS_3(1, 26, 26) },
{ WC_TRACK_DESIGN_LIST, "track_design_list", 5202, COLOURS_3(26, 26, 26) },
{ WC_TRACK_DESIGN_PLACE, "track_design_place", 5200, COLOURS_3(24, 24, 24) },
{ WC_NEW_CAMPAIGN, "new_campaign", 5188, COLOURS_3(19, 19, 19) },
{ WC_KEYBOARD_SHORTCUT_LIST, "keyboard_shortcuts", 5220, COLOURS_3(7, 7, 7) },
{ WC_CHANGE_KEYBOARD_SHORTCUT, "change_keyboard_shortcut", 5221, COLOURS_3(7, 7, 7) },
{ WC_MAP, "map", 5190, COLOURS_2(12, 24) },
{ WC_BANNER, "banner", 5209, COLOURS_3(24, 24, 24) },
{ WC_EDITOR_OBJECT_SELECTION, "editor_object_selection", 5210, COLOURS_3(4, 1, 1) },
{ WC_EDITOR_INVENTION_LIST, "editor_invention_list", 5211, COLOURS_3(4, 1, 1) },
{ WC_EDITOR_SCENARIO_OPTIONS, "editor_scenario_options", 5212, COLOURS_3(4, 1, 1) },
{ WC_EDTIOR_OBJECTIVE_OPTIONS, "editor_objection_options", 5213, COLOURS_3(4, 1, 1) },
{ WC_MANAGE_TRACK_DESIGN, "manage_track_design", 5215, COLOURS_3(1, 1, 1) },
{ WC_TRACK_DELETE_PROMPT, "track_delete_prompt", 5226, COLOURS_3(26, 26, 26) },
{ WC_INSTALL_TRACK, "install_track", 5216, COLOURS_3(26, 26, 26) },
{ WC_CLEAR_SCENERY, "clear_scenery", 5195, COLOURS_3(24, 24, 24) },
{ WC_CHEATS, "cheats", 5217, COLOURS_3(1, 19, 19) },
{ WC_RESEARCH, "research", 5189, COLOURS_3(1, 19, 19) },
{ WC_VIEWPORT, "viewport", 5191, COLOURS_3(24, 24, 24) },
{ WC_MAPGEN, "map_generation", 5214, COLOURS_3(12, 24, 24) },
{ WC_LOADSAVE, "loadsave", 5222, COLOURS_3(7, 7, 7) },
{ WC_LOADSAVE_OVERWRITE_PROMPT, "loadsave_overwrite_prompt", 5227, COLOURS_1(154) },
{ WC_TITLE_OPTIONS, "title_options", 5251, COLOURS_3(140, 140, 140) },
{ WC_LAND_RIGHTS, "land_rights", 5196, COLOURS_3(19, 19, 19) },
{ WC_THEMES, "themes", 5218, COLOURS_3(1, 12, 12) },
{ WC_STAFF, "staff", 5207, COLOURS_3(1, 4, 4) },
{ WC_EDITOR_TRACK_BOTTOM_TOOLBAR, "editor_track_bottom_toolbar", 5247, COLOURS_3(135, 135, 135) },
{ WC_EDITOR_SCENARIO_BOTTOM_TOOLBAR, "editor_scenario_bottom_toolbar", 5248, COLOURS_3(150, 150, 141) },
};
#define COLOURS_RCT1(c0, c1, c2, c3, c4, c5) { { (c0), (c1), (c2), (c3), (c4), (c5) } }
marked_window_colours gColourSchemesRCT1[sizeof(gColourSchemes)] = {
{ WC_TOP_TOOLBAR, { 1, 1, 1, 1, 0, 0 } }, // WC_TOP_TOOLBAR
{ WC_BOTTOM_TOOLBAR, { 129, 129, 0, 18, 0, 0 } }, // WC_BOTTOM_TOOLBAR
{ WC_RIDE, { 26, 1, 11, 0, 0, 0 } }, // WC_RIDE
{ WC_RIDE_LIST, { 26, 1, 1, 0, 0, 0 } }, // WC_RIDE_LIST
{ WC_CONSTRUCT_RIDE, { 26, 1, 1, 0, 0, 0 } }, // WC_CONSTRUCT_RIDE
{ WC_PEEP, { 22, 26, 26, 0, 0, 0 } }, // WC_PEEP
{ WC_GUEST_LIST, { 22, 26, 26, 0, 0, 0 } }, // WC_GUEST_LIST
{ WC_STAFF_LIST, { 12, 4, 4, 0, 0, 0 } }, // WC_STAFF_LIST
{ WC_FINANCES, { 4, 1, 1, 0, 0, 0 } }, // WC_FINANCES
{ WC_TITLE_MENU, { 129, 129, 129, 0, 0, 0 } }, // WC_TITLE_MENU
{ WC_TITLE_EXIT, { 129, 129, 129, 0, 0, 0 } }, // WC_TITLE_EXIT
{ WC_NEW_CAMPAIGN, { 4, 4, 1, 0, 0, 0 } }, // WC_NEW_CAMPAIGN
{ WC_TITLE_OPTIONS, { 129, 129, 129, 0, 0, 0 } }, // WC_TITLE_OPTIONS
{ WC_STAFF, { 12, 4, 4, 0, 0, 0 } }, // WC_STAFF
theme_window_preset gThemeWindowsRCT1[] = {
{ WC_TOP_TOOLBAR, COLOURS_RCT1(1, 1, 1, 1, 0, 0) },
{ WC_BOTTOM_TOOLBAR, COLOURS_RCT1(129, 129, 0, 18, 0, 0) },
{ WC_RIDE, COLOURS_RCT1(26, 1, 11, 0, 0, 0) },
{ WC_RIDE_LIST, COLOURS_RCT1(26, 1, 1, 0, 0, 0) },
{ WC_CONSTRUCT_RIDE, COLOURS_RCT1(26, 1, 1, 0, 0, 0) },
{ WC_PEEP, COLOURS_RCT1(22, 26, 26, 0, 0, 0) },
{ WC_GUEST_LIST, COLOURS_RCT1(22, 26, 26, 0, 0, 0) },
{ WC_STAFF_LIST, COLOURS_RCT1(12, 4, 4, 0, 0, 0) },
{ WC_FINANCES, COLOURS_RCT1(4, 1, 1, 0, 0, 0) },
{ WC_TITLE_MENU, COLOURS_RCT1(129, 129, 129, 0, 0, 0) },
{ WC_TITLE_EXIT, COLOURS_RCT1(129, 129, 129, 0, 0, 0) },
{ WC_NEW_CAMPAIGN, COLOURS_RCT1(4, 4, 1, 0, 0, 0) },
{ WC_TITLE_OPTIONS, COLOURS_RCT1(129, 129, 129, 0, 0, 0) },
{ WC_STAFF, COLOURS_RCT1(12, 4, 4, 0, 0, 0) },
{ 0xFF, { 0, 0, 0, 0, 0, 0 } } // End
};
uint16 gCurrentTheme = 0;
uint32 gNumColourSchemeWindows = sizeof(gColourSchemes) / sizeof(window_colour_scheme);
uint32 gNumThemeWindows = sizeof(gThemeWindowDefinitions) / sizeof(theme_window_definition);
window_colour_scheme* colour_scheme_get_by_class(rct_windowclass classification)
theme_preset* theme_get_preset()
{
for (int i = 0; i < sizeof(gColourSchemes); i++) {
if (gColourSchemes[i].classification == classification) {
return &(gColourSchemes[i]);
return &gConfigThemes.presets[gCurrentTheme];
}
theme_window_definition* theme_window_definition_get_by_class(rct_windowclass classification)
{
for (int i = 0; i < (int)gNumThemeWindows; i++) {
if (gThemeWindowDefinitions[i].classification == classification) {
return &gThemeWindowDefinitions[i];
}
}
return NULL;
}
int colour_scheme_get_index_by_class(rct_windowclass classification)
theme_window* theme_window_get_by_class(rct_windowclass classification)
{
for (int i = 0; i < sizeof(gColourSchemes); i++) {
if (gColourSchemes[i].classification == classification) {
return i;
for (int i = 0; i < (int)gNumThemeWindows; i++) {
if (gThemeWindowDefinitions[i].classification == classification) {
return &gConfigThemes.presets[gCurrentTheme].windows[i];
}
}
return -1;
return NULL;
}
void colour_scheme_update(rct_window *window)
{
window_colour_scheme* colour_scheme = colour_scheme_get_by_class(window->classification);
theme_window* theme = theme_window_get_by_class(window->classification);
bool transparent = false;
for (int i = 0; i < colour_scheme->num_colours; i++) {
window->colours[i] = colour_scheme->colours[i];
if (colour_scheme->colours[i] & 0x80) {
for (int i = 0; i < 6; i++) {
window->colours[i] = theme->colours[i];
if (theme->colours[i] & 0x80) {
transparent = true;
}
}
//if (transparent)
window->flags |= WF_TRANSPARENT;
//else
// window->flags &= ~WF_TRANSPARENT;
// Some windows need to be transparent even if the colours aren't.
// There doesn't seem to be any side-effects for all windows being transparent
window->flags |= WF_TRANSPARENT;
}
void colour_scheme_update_by_class(rct_window *window, rct_windowclass classification)
{
window_colour_scheme* colour_scheme = colour_scheme_get_by_class(classification);
theme_window* theme = theme_window_get_by_class(classification);
bool transparent = false;
for (int i = 0; i < colour_scheme->num_colours; i++) {
window->colours[i] = colour_scheme->colours[i];
if (colour_scheme->colours[i] & 0x80) {
for (int i = 0; i < 6; i++) {
window->colours[i] = theme->colours[i];
if (theme->colours[i] & 0x80) {
transparent = true;
}
}
//if (transparent)
window->flags |= WF_TRANSPARENT;
//else
// window->flags &= ~WF_TRANSPARENT;
// Some windows need to be transparent even if the colours aren't.
// There doesn't seem to be any side-effects for all windows being transparent
window->flags |= WF_TRANSPARENT;
}
void theme_change_preset(int preset)
@ -170,25 +183,19 @@ void theme_change_preset(int preset)
break;
}
gCurrentTheme = preset;
for (int i = 0; i < (int)gNumColourSchemeWindows; i++) {
for (int j = 0; j < gColourSchemes[i].num_colours; j++) {
gColourSchemes[i].colours[j] = gConfigThemes.presets[preset].colour_schemes[i].colours[j];
}
}
}
window_invalidate_all();
}
void theme_create_preset(const char *name)
void theme_create_preset(int duplicate, const char *name)
{
int preset = gConfigThemes.num_presets;
gConfigThemes.num_presets++;
gConfigThemes.presets = realloc(gConfigThemes.presets, sizeof(theme_preset) * gConfigThemes.num_presets);
strcpy(gConfigThemes.presets[preset].name, name);
gConfigThemes.presets[preset].colour_schemes = malloc(sizeof(window_colours) * gNumColourSchemeWindows);
for (int i = 0; i < (int)gNumColourSchemeWindows; i++) {
for (int j = 0; j < 6; j++)
gConfigThemes.presets[preset].colour_schemes[i].colours[j] = gColourSchemes[i].colours[j];
gConfigThemes.presets[preset].windows = malloc(sizeof(theme_window) * gNumThemeWindows);
for (int i = 0; i < (int)gNumThemeWindows; i++) {
gConfigThemes.presets[preset].windows[i] = gConfigThemes.presets[duplicate].windows[i];
}
themes_save_preset(preset);
theme_change_preset(preset);
@ -203,6 +210,8 @@ void theme_delete_preset(int preset)
strcat(path, ".ini");
platform_file_delete(path);
free(gConfigThemes.presets[preset].windows);
for (int i = preset; i < gConfigThemes.num_presets - 1; i++) {
gConfigThemes.presets[i] = gConfigThemes.presets[i + 1];
}

View File

@ -23,38 +23,42 @@
#include "../common.h"
#include "window.h"
#include "../config.h"
typedef struct {
rct_windowclass classification;
uint8 colours[6];
uint8 num_colours;
rct_string_id name;
char *section_name;
} window_colour_scheme;
rct_string_id name;
uint8 num_colours;
theme_window window;
} theme_window_definition;
typedef struct {
rct_windowclass classification;
uint8 colours[6];
} marked_window_colours;
theme_window window;
} theme_window_preset;
extern window_colour_scheme gColourSchemes[];
extern marked_window_colours gColourSchemesRCT1[];
// The definitions for window themes as well as the RCT2 preset
extern theme_window_definition gThemeWindowDefinitions[];
// The preset for RCT1 window themes
extern theme_window_preset gThemeWindowsRCT1[];
// The index of the current theme
extern uint16 gCurrentTheme;
// The number of theme-able windows
extern uint32 gNumThemeWindows;
extern uint32 gNumColourSchemeWindows;
window_colour_scheme* colour_scheme_get_by_class(rct_windowclass classification);
int colour_scheme_get_index_by_class(rct_windowclass classification);
theme_preset* theme_get_preset();
theme_window_definition* theme_window_definition_get_by_class(rct_windowclass classification);
theme_window* theme_window_get_by_class(rct_windowclass classification);
void colour_scheme_update(rct_window *window);
void colour_scheme_update_by_class(rct_window *window, rct_windowclass classification);
void theme_change_preset(int preset);
void theme_create_preset(const char *name);
void theme_create_preset(int duplicate, const char *name);
void theme_delete_preset(int preset);
void theme_rename_preset(int preset, const char *newName);
#endif

View File

@ -367,6 +367,19 @@ enum {
SPR_G2_BUTTON_LARGE_SCENERY = SPR_G2_BEGIN + 14,
SPR_G2_BUTTON_TREES = SPR_G2_BEGIN + 15,
SPR_G2_BUTTON_FOOTPATH = SPR_G2_BEGIN + 16,
SPR_G2_RCT1_CLOSE_BUTTON_0 = SPR_G2_BEGIN + 17,
SPR_G2_RCT1_CLOSE_BUTTON_1 = SPR_G2_BEGIN + 18,
SPR_G2_RCT1_CLOSE_BUTTON_2 = SPR_G2_BEGIN + 19,
SPR_G2_RCT1_CLOSE_BUTTON_3 = SPR_G2_BEGIN + 20,
SPR_G2_RCT1_TEST_BUTTON_0 = SPR_G2_BEGIN + 21,
SPR_G2_RCT1_TEST_BUTTON_1 = SPR_G2_BEGIN + 22,
SPR_G2_RCT1_TEST_BUTTON_2 = SPR_G2_BEGIN + 23,
SPR_G2_RCT1_TEST_BUTTON_3 = SPR_G2_BEGIN + 24,
SPR_G2_RCT1_OPEN_BUTTON_0 = SPR_G2_BEGIN + 25,
SPR_G2_RCT1_OPEN_BUTTON_1 = SPR_G2_BEGIN + 26,
SPR_G2_RCT1_OPEN_BUTTON_2 = SPR_G2_BEGIN + 27,
SPR_G2_RCT1_OPEN_BUTTON_3 = SPR_G2_BEGIN + 28,
};
#endif

View File

@ -70,6 +70,8 @@ enum WINDOW_PARK_WIDGET_IDX {
//WIDX_BUY_CONSTRUCTION_RIGHTS,
WIDX_LOCATE,
WIDX_RENAME,
WIDX_CLOSE_LIGHT,
WIDX_OPEN_LIGHT,
WIDX__ = 11,
WIDX_PRICE,
@ -101,6 +103,8 @@ static rct_widget window_park_entrance_widgets[] = {
//{ WWT_FLATBTN, 1, 205, 228, 97, 120, SPR_BUY_CONSTRUCTION_RIGHTS, SPR_BUY_CONSTRUCTION_RIGHTS_TIP }, // buy construction rights
{ WWT_FLATBTN, 1, 205, 228, 97, 120, SPR_LOCATE, STR_LOCATE_SUBJECT_TIP }, // locate
{ WWT_FLATBTN, 1, 205, 228, 121, 144, SPR_RENAME, STR_NAME_PARK_TIP }, // rename
{ WWT_IMGBTN, 1, 210, 223, 51, 65, SPR_G2_RCT1_CLOSE_BUTTON_0, STR_NONE },
{ WWT_IMGBTN, 1, 210, 223, 66, 79, SPR_G2_RCT1_OPEN_BUTTON_0, STR_NONE },
{ WIDGETS_END },
};
@ -515,7 +519,9 @@ static uint32 window_park_page_enabled_widgets[] = {
(1 << WIDX_BUY_LAND_RIGHTS) |
//(1 << WIDX_BUY_CONSTRUCTION_RIGHTS) |
(1 << WIDX_LOCATE) |
(1 << WIDX_RENAME),
(1 << WIDX_RENAME) |
(1 << WIDX_CLOSE_LIGHT) |
(1 << WIDX_OPEN_LIGHT),
(1 << WIDX_CLOSE) |
(1 << WIDX_TAB_1) |
@ -716,6 +722,12 @@ static void window_park_entrance_mouseup()
RCT2_GLOBAL(0x013CE962, uint32) = RCT2_GLOBAL(0x013573D8, uint32);
window_text_input_open(w, WIDX_RENAME, STR_PARK_NAME, STR_ENTER_PARK_NAME, RCT2_GLOBAL(RCT2_ADDRESS_PARK_NAME, rct_string_id), 0, 32);
break;
case WIDX_CLOSE_LIGHT:
park_set_open(0);
break;
case WIDX_OPEN_LIGHT:
park_set_open(1);
break;
}
}
@ -1036,7 +1048,7 @@ static void window_park_entrance_textinput()
*/
static void window_park_entrance_invalidate()
{
int i;
int i, height;
rct_window *w;
window_get_register(w);
@ -1051,6 +1063,8 @@ static void window_park_entrance_invalidate()
RCT2_GLOBAL(0x013CE952, uint16) = RCT2_GLOBAL(RCT2_ADDRESS_PARK_NAME, rct_string_id);
RCT2_GLOBAL(0x013CE952 + 2, uint32) = RCT2_GLOBAL(RCT2_ADDRESS_PARK_NAME_ARGS, uint32);
window_park_entrance_widgets[WIDX_OPEN_OR_CLOSE].image = park_is_open() ? SPR_OPEN : SPR_CLOSED;
window_park_entrance_widgets[WIDX_CLOSE_LIGHT].image = SPR_G2_RCT1_CLOSE_BUTTON_0 + !park_is_open() * 2 + widget_is_pressed(w, WIDX_CLOSE_LIGHT);
window_park_entrance_widgets[WIDX_OPEN_LIGHT].image = SPR_G2_RCT1_OPEN_BUTTON_0 + park_is_open() * 2 + widget_is_pressed(w, WIDX_OPEN_LIGHT);
// Only allow closing of park for guest / rating objective
if (RCT2_GLOBAL(RCT2_ADDRESS_OBJECTIVE_TYPE, uint8) == OBJECTIVE_GUESTS_AND_RATING)
@ -1065,21 +1079,45 @@ static void window_park_entrance_invalidate()
window_park_entrance_widgets[WIDX_STATUS].right = w->width - 26;
window_park_entrance_widgets[WIDX_STATUS].top = w->height - 13;
window_park_entrance_widgets[WIDX_STATUS].bottom = w->height - 3;
for (i = WIDX_OPEN_OR_CLOSE; i <= WIDX_RENAME; i++) {
/*for (i = WIDX_OPEN_OR_CLOSE; i <= WIDX_RENAME; i++) {
window_park_entrance_widgets[i].left = w->width - 25;
window_park_entrance_widgets[i].right = w->width - 2;
}*/
if (theme_get_preset()->features.rct1_park_lights) {
window_park_entrance_widgets[WIDX_OPEN_OR_CLOSE].type = WWT_EMPTY;
window_park_entrance_widgets[WIDX_CLOSE_LIGHT].type = WWT_IMGBTN;
window_park_entrance_widgets[WIDX_OPEN_LIGHT].type = WWT_IMGBTN;
height = window_park_entrance_widgets[WIDX_OPEN_LIGHT].bottom + 5 - 24;
}
else {
window_park_entrance_widgets[WIDX_OPEN_OR_CLOSE].type = WWT_FLATBTN;
window_park_entrance_widgets[WIDX_CLOSE_LIGHT].type = WWT_EMPTY;
window_park_entrance_widgets[WIDX_OPEN_LIGHT].type = WWT_EMPTY;
height = 49;
}
// Only allow closing of park and purchase of land when there is money
if (RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_NO_MONEY) {
window_park_entrance_widgets[WIDX_OPEN_OR_CLOSE].type = WWT_EMPTY;
window_park_entrance_widgets[WIDX_CLOSE_LIGHT].type = WWT_EMPTY;
window_park_entrance_widgets[WIDX_OPEN_LIGHT].type = WWT_EMPTY;
window_park_entrance_widgets[WIDX_BUY_LAND_RIGHTS].type = WWT_EMPTY;
//window_park_entrance_widgets[WIDX_BUY_CONSTRUCTION_RIGHTS].type = WWT_EMPTY;
} else {
window_park_entrance_widgets[WIDX_OPEN_OR_CLOSE].type = WWT_FLATBTN;
window_park_entrance_widgets[WIDX_BUY_LAND_RIGHTS].type = WWT_FLATBTN;
//window_park_entrance_widgets[WIDX_BUY_CONSTRUCTION_RIGHTS].type = WWT_FLATBTN;
}
for (i = WIDX_CLOSE_LIGHT; i <= WIDX_OPEN_LIGHT; i++) {
window_park_entrance_widgets[i].left = w->width - 20;
window_park_entrance_widgets[i].right = w->width - 7;
}
for (i = WIDX_OPEN_OR_CLOSE; i <= WIDX_RENAME; i++, height += 24) {
window_park_entrance_widgets[i].left = w->width - 25;
window_park_entrance_widgets[i].right = w->width - 2;
window_park_entrance_widgets[i].top = height;
window_park_entrance_widgets[i].bottom = height + 23;
}
}
/**

View File

@ -81,6 +81,9 @@ enum {
WIDX_RENAME,
WIDX_LOCATE,
WIDX_DEMOLISH,
WIDX_CLOSE_LIGHT,
WIDX_TEST_LIGHT,
WIDX_OPEN_LIGHT,
WIDX_VEHICLE_TYPE = 14,
WIDX_VEHICLE_TYPE_DROPDOWN,
@ -175,6 +178,8 @@ enum {
WIDX_SHOW_GUESTS_QUEUING
};
#define RCT1_LIGHT_OFFSET 4
// 0x009ADC34
static rct_widget window_ride_main_widgets[] = {
{ WWT_FRAME, 0, 0, 315, 0, 206, 0x0FFFFFFFF, STR_NONE },
@ -201,6 +206,9 @@ static rct_widget window_ride_main_widgets[] = {
{ WWT_FLATBTN, 1, 291, 314, 94, 117, SPR_RENAME, STR_NAME_RIDE_TIP },
{ WWT_FLATBTN, 1, 291, 314, 118, 141, SPR_LOCATE, STR_LOCATE_SUBJECT_TIP },
{ WWT_FLATBTN, 1, 291, 314, 142, 165, SPR_DEMOLISH, STR_DEMOLISH_RIDE_TIP },
{ WWT_IMGBTN, 1, 296, 309, 48, 61, SPR_G2_RCT1_CLOSE_BUTTON_0, STR_NONE },
{ WWT_IMGBTN, 1, 296, 309, 62, 75, SPR_G2_RCT1_TEST_BUTTON_0, STR_NONE },
{ WWT_IMGBTN, 1, 296, 309, 76, 89, SPR_G2_RCT1_OPEN_BUTTON_0, STR_NONE },
{ WIDGETS_END },
};
@ -481,7 +489,7 @@ static rct_widget *window_ride_page_widgets[] = {
};
const uint64 window_ride_page_enabled_widgets[] = {
0x00000000007DBFF4,
0x0000000003FDBFF4,
0x00000000001EFFF4,
0x0000019E777DBFF4,
0x000000000001FFF4,
@ -1609,6 +1617,8 @@ static void window_ride_main_mouseup()
{
short widgetIndex;
rct_window *w;
rct_ride *ride;
int status;
window_widget_get_registers(w, widgetIndex);
@ -1640,6 +1650,31 @@ static void window_ride_main_mouseup()
case WIDX_DEMOLISH:
window_ride_demolish_prompt_open(w->number);
break;
case WIDX_CLOSE_LIGHT:
case WIDX_TEST_LIGHT:
case WIDX_OPEN_LIGHT:
ride = GET_RIDE(w->number);
switch (widgetIndex - WIDX_CLOSE_LIGHT) {
case 0:
status = RIDE_STATUS_CLOSED;
RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, rct_string_id) = 1004;
break;
case 1:
status = RIDE_STATUS_TESTING;
RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, rct_string_id) = 1003;
break;
case 2:
status = RIDE_STATUS_OPEN;
RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, rct_string_id) = 1002;
break;
}
RCT2_GLOBAL(0x013CE952 + 6, uint16) = ride->name;
RCT2_GLOBAL(0x013CE952 + 8, uint32) = ride->name_arguments;
ride_set_status(w->number, status);
break;
}
}
@ -1656,7 +1691,10 @@ static void window_ride_main_resize()
window_get_register(w);
w->flags |= WF_RESIZABLE;
window_set_resize(w, 316, 180, 500, 450);
int minHeight = 180;
if (theme_get_preset()->features.rct1_ride_lights);
minHeight = 200 + RCT1_LIGHT_OFFSET - (ride_type_has_flag(GET_RIDE(w->number)->type, RIDE_TYPE_FLAG_NO_TEST_MODE) ? 14 : 0);
window_set_resize(w, 316, minHeight, 500, 450);
viewport = w->viewport;
if (viewport != NULL) {
@ -1972,7 +2010,7 @@ static void window_ride_main_invalidate()
{
rct_window *w;
rct_widget *widgets;
int i;
int i, height;
window_get_register(w);
colour_scheme_update(w);
@ -1996,6 +2034,10 @@ static void window_ride_main_invalidate()
RCT2_GLOBAL(0x013CE952 + 2, uint32) = ride->name_arguments;
window_ride_main_widgets[WIDX_OPEN].image = SPR_CLOSED + ride->status;
window_ride_main_widgets[WIDX_CLOSE_LIGHT].image = SPR_G2_RCT1_CLOSE_BUTTON_0 + (ride->status == RIDE_STATUS_CLOSED) * 2 + widget_is_pressed(w, WIDX_CLOSE_LIGHT);
window_ride_main_widgets[WIDX_TEST_LIGHT].image = SPR_G2_RCT1_TEST_BUTTON_0 + (ride->status == RIDE_STATUS_TESTING) * 2 + widget_is_pressed(w, WIDX_TEST_LIGHT);
window_ride_main_widgets[WIDX_OPEN_LIGHT].image = SPR_G2_RCT1_OPEN_BUTTON_0 + (ride->status == RIDE_STATUS_OPEN) * 2 + widget_is_pressed(w, WIDX_OPEN_LIGHT);
window_ride_anchor_border_widgets(w);
// Anchor main page specific widgets
@ -2004,15 +2046,49 @@ static void window_ride_main_invalidate()
window_ride_main_widgets[WIDX_STATUS].right = w->width - 26;
window_ride_main_widgets[WIDX_STATUS].top = w->height - 13;
window_ride_main_widgets[WIDX_STATUS].bottom = w->height - 3;
for (i = WIDX_OPEN; i <= WIDX_DEMOLISH; i++) {
window_ride_main_widgets[i].left = w->width - 25;
window_ride_main_widgets[i].right = w->width - 2;
}
window_ride_main_widgets[WIDX_VIEW].right = w->width - 60;
window_ride_main_widgets[WIDX_VIEW_DROPDOWN].right = w->width - 61;
window_ride_main_widgets[WIDX_VIEW_DROPDOWN].left = w->width - 71;
window_align_tabs(w, WIDX_TAB_1, WIDX_TAB_10);
if (theme_get_preset()->features.rct1_ride_lights) {
window_ride_main_widgets[WIDX_OPEN].type = WWT_EMPTY;
window_ride_main_widgets[WIDX_CLOSE_LIGHT].type = WWT_IMGBTN;
window_ride_main_widgets[WIDX_TEST_LIGHT].type = (ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_NO_TEST_MODE) ? WWT_EMPTY : WWT_IMGBTN);
window_ride_main_widgets[WIDX_OPEN_LIGHT].type = WWT_IMGBTN;
height = 62;
if (window_ride_main_widgets[WIDX_TEST_LIGHT].type != WWT_EMPTY) {
window_ride_main_widgets[WIDX_TEST_LIGHT].top = height;
window_ride_main_widgets[WIDX_TEST_LIGHT].bottom = height + 13;
height += 14;
}
window_ride_main_widgets[WIDX_OPEN_LIGHT].top = height;
window_ride_main_widgets[WIDX_OPEN_LIGHT].bottom = height + 13;
height += 14 - 24 + RCT1_LIGHT_OFFSET;
w->min_height = 200 + RCT1_LIGHT_OFFSET - (ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_NO_TEST_MODE) ? 14 : 0);
if (w->height < w->min_height)
window_event_resize_call(w);
}
else {
window_ride_main_widgets[WIDX_OPEN].type = WWT_FLATBTN;
window_ride_main_widgets[WIDX_CLOSE_LIGHT].type = WWT_EMPTY;
window_ride_main_widgets[WIDX_TEST_LIGHT].type = WWT_EMPTY;
window_ride_main_widgets[WIDX_OPEN_LIGHT].type = WWT_EMPTY;
height = window_ride_main_widgets[WIDX_OPEN].top;
}
for (i = WIDX_CLOSE_LIGHT; i <= WIDX_OPEN_LIGHT; i++) {
window_ride_main_widgets[i].left = w->width - 20;
window_ride_main_widgets[i].right = w->width - 7;
}
for (i = WIDX_OPEN; i <= WIDX_DEMOLISH; i++, height += 24) {
window_ride_main_widgets[i].left = w->width - 25;
window_ride_main_widgets[i].right = w->width - 2;
window_ride_main_widgets[i].top = height;
window_ride_main_widgets[i].bottom = height + 23;
}
}
/**

View File

@ -48,7 +48,9 @@ enum WINDOW_RIDE_LIST_WIDGET_IDX {
WIDX_TAB_1,
WIDX_TAB_2,
WIDX_TAB_3,
WIDX_LIST
WIDX_LIST,
WIDX_CLOSE_LIGHT,
WIDX_OPEN_LIGHT
};
static rct_widget window_ride_list_widgets[] = {
@ -64,6 +66,8 @@ static rct_widget window_ride_list_widgets[] = {
{ WWT_TAB, 1, 34, 64, 17, 43, 0x2000144E, STR_LIST_SHOPS_AND_STALLS_TIP }, // tab 2
{ WWT_TAB, 1, 65, 95, 17, 43, 0x2000144E, STR_LIST_KIOSKS_AND_FACILITIES_TIP }, // tab 3
{ WWT_SCROLL, 1, 3, 336, 60, 236, 2, 65535 }, // list
{ WWT_IMGBTN, 1, 320, 333, 62, 75, SPR_G2_RCT1_CLOSE_BUTTON_0, STR_NONE },
{ WWT_IMGBTN, 1, 320, 333, 76, 89, SPR_G2_RCT1_OPEN_BUTTON_0, STR_NONE },
{ WIDGETS_END },
};
@ -152,7 +156,9 @@ void window_ride_list_open()
(1 << WIDX_SORT) |
(1 << WIDX_TAB_1) |
(1 << WIDX_TAB_2) |
(1 << WIDX_TAB_3);
(1 << WIDX_TAB_3) |
(1 << WIDX_CLOSE_LIGHT) |
(1 << WIDX_OPEN_LIGHT);
window_init_scroll_widgets(window);
window->page = PAGE_RIDES;
window->no_list_items = 0;
@ -194,12 +200,19 @@ static void window_ride_list_mouseup()
if (w->page != widgetIndex - WIDX_TAB_1) {
w->page = widgetIndex - WIDX_TAB_1;
w->no_list_items = 0;
w->frame_no = 0;
w->selected_list_item = -1;
if (w->page != PAGE_RIDES && _window_ride_list_information_type > INFORMATION_TYPE_PROFIT)
_window_ride_list_information_type = INFORMATION_TYPE_PROFIT;
window_invalidate(w);
}
break;
case WIDX_CLOSE_LIGHT:
window_ride_list_close_all(w);
break;
case WIDX_OPEN_LIGHT:
window_ride_list_open_all(w);
break;
}
}
@ -388,6 +401,7 @@ static void window_ride_list_invalidate()
{
int i;
rct_window *w;
rct_ride *ride;
window_get_register(w);
colour_scheme_update(w);
@ -412,6 +426,38 @@ static void window_ride_list_invalidate()
w->widgets[WIDX_LIST].bottom = w->height - 4;
w->widgets[WIDX_OPEN_CLOSE_ALL].right = w->width - 2;
w->widgets[WIDX_OPEN_CLOSE_ALL].left = w->width - 25;
w->widgets[WIDX_CLOSE_LIGHT].right = w->width - 7;
w->widgets[WIDX_CLOSE_LIGHT].left = w->width - 20;
w->widgets[WIDX_OPEN_LIGHT].right = w->width - 7;
w->widgets[WIDX_OPEN_LIGHT].left = w->width - 20;
if (theme_get_preset()->features.rct1_ride_lights) {
w->widgets[WIDX_OPEN_CLOSE_ALL].type = WWT_EMPTY;
w->widgets[WIDX_CLOSE_LIGHT].type = WWT_IMGBTN;
w->widgets[WIDX_OPEN_LIGHT].type = WWT_IMGBTN;
sint8 allClosed = -1;
sint8 allOpen = -1;
FOR_ALL_RIDES(i, ride) {
if (w->page != gRideClassifications[ride->type])
continue;
if (ride->status == RIDE_STATUS_OPEN) {
if (allOpen == -1) allOpen = true;
allClosed = false;
}
else {
if (allClosed == -1) allClosed = true;
allOpen = false;
}
}
w->widgets[WIDX_CLOSE_LIGHT].image = SPR_G2_RCT1_CLOSE_BUTTON_0 + (allClosed == 1) * 2 + widget_is_pressed(w, WIDX_CLOSE_LIGHT);
w->widgets[WIDX_OPEN_LIGHT].image = SPR_G2_RCT1_OPEN_BUTTON_0 + (allOpen == 1) * 2 + widget_is_pressed(w, WIDX_OPEN_LIGHT);
}
else {
w->widgets[WIDX_OPEN_CLOSE_ALL].type = WWT_FLATBTN;
w->widgets[WIDX_CLOSE_LIGHT].type = WWT_EMPTY;
w->widgets[WIDX_OPEN_LIGHT].type = WWT_EMPTY;
}
}
/**

View File

@ -43,7 +43,9 @@ enum {
WINDOW_THEMES_TAB_RIDES_PEEPS,
WINDOW_THEMES_TAB_EDITORS,
WINDOW_THEMES_TAB_MISC,
WINDOW_THEMES_TAB_PROMPTS
WINDOW_THEMES_TAB_PROMPTS,
WINDOW_THEMES_TAB_FEATURES,
WINDOW_THEMES_TAB_COUNT
} WINDOW_THEMES_TAB;
static void window_themes_emptysub() { }
@ -107,6 +109,7 @@ enum WINDOW_STAFF_LIST_WIDGET_IDX {
WIDX_THEMES_EDITORS_TAB,
WIDX_THEMES_MISC_TAB,
WIDX_THEMES_PROMPTS_TAB,
WIDX_THEMES_FEATURES_TAB,
WIDX_THEMES_PRESETS,
WIDX_THEMES_PRESETS_DROPDOWN,
WIDX_THEMES_DUPLICATE_BUTTON,
@ -114,6 +117,9 @@ enum WINDOW_STAFF_LIST_WIDGET_IDX {
WIDX_THEMES_RENAME_BUTTON,
WIDX_THEMES_COLORBTN_MASK,
WIDX_THEMES_LIST,
WIDX_THEMES_RCT1_RIDE_LIGHTS,
WIDX_THEMES_RCT1_PARK_LIGHTS,
WIDX_THEMES_RCT1_SCENARIO_FONT
};
static rct_widget window_themes_widgets[] = {
@ -129,6 +135,7 @@ static rct_widget window_themes_widgets[] = {
{ WWT_TAB, 1, 158, 188, 17, 43, 0x02000144E, 5232 }, // editors tab
{ WWT_TAB, 1, 189, 219, 17, 43, 0x02000144E, 5233 }, // misc tab
{ WWT_TAB, 1, 220, 250, 17, 43, 0x02000144E, 5234 }, // prompts tab
{ WWT_TAB, 1, 251, 281, 17, 43, 0x02000144E, 5281 }, // features tab
{ WWT_DROPDOWN, 1, 125, 299, 60, 71, STR_NONE, STR_NONE }, // Preset colour schemes
{ WWT_DROPDOWN_BUTTON, 1, 288, 298, 61, 70, 876, STR_NONE },
{ WWT_DROPDOWN_BUTTON, 1, 10, 100, 82, 93, 5239, 5257 }, // Duplicate button
@ -136,6 +143,9 @@ static rct_widget window_themes_widgets[] = {
{ WWT_DROPDOWN_BUTTON, 1, 210, 300, 82, 93, 3348, 5259 }, // Rename button
{ WWT_COLORBTN, 1, 0, 0, 0, 0, STR_NONE, STR_NONE }, // color button mask
{ WWT_SCROLL, 1, 3, 316, 60, 103, 2, STR_NONE }, // staff list
{ WWT_CHECKBOX, 1, 10, 299, 54, 65, 5282, STR_NONE }, // rct1 ride lights
{ WWT_CHECKBOX, 1, 10, 299, 69, 80, 5283, STR_NONE }, // rct1 park lights
{ WWT_CHECKBOX, 1, 10, 299, 84, 95, 5284, STR_NONE }, // rct1 scenario font
{ WIDGETS_END },
};
@ -147,7 +157,8 @@ static int window_themes_tab_animation_loops[] = {
64,
32,
8,
14
14,
32
};
static int window_themes_tab_animation_divisor[] = {
4,
@ -157,6 +168,7 @@ static int window_themes_tab_animation_divisor[] = {
4,
2,
2,
2,
2
};
static int window_themes_tab_sprites[] = {
@ -167,7 +179,8 @@ static int window_themes_tab_sprites[] = {
SPR_TAB_RIDE_0,
5205,
5201,
SPR_TAB_STAFF_OPTIONS_0
SPR_TAB_STAFF_OPTIONS_0,
SPR_TAB_FINANCES_MARKETING_0
};
static rct_windowclass window_themes_tab_1_classes[] = {
@ -254,29 +267,55 @@ void window_themes_init_vars()
_selected_tab = WINDOW_THEMES_TAB_SETTINGS;
}
static window_colour_scheme* get_colour_scheme_tab()
static theme_window_definition* get_colour_scheme_tab_definition()
{
switch (_selected_tab) {
case 1: return colour_scheme_get_by_class(window_themes_tab_1_classes[_color_index_1]);
case 2: return colour_scheme_get_by_class(window_themes_tab_2_classes[_color_index_1]);
case 3: return colour_scheme_get_by_class(window_themes_tab_3_classes[_color_index_1]);
case 4: return colour_scheme_get_by_class(window_themes_tab_4_classes[_color_index_1]);
case 5: return colour_scheme_get_by_class(window_themes_tab_5_classes[_color_index_1]);
case 6: return colour_scheme_get_by_class(window_themes_tab_6_classes[_color_index_1]);
case 7: return colour_scheme_get_by_class(window_themes_tab_7_classes[_color_index_1]);
case 1: return theme_window_definition_get_by_class(window_themes_tab_1_classes[_color_index_1]);
case 2: return theme_window_definition_get_by_class(window_themes_tab_2_classes[_color_index_1]);
case 3: return theme_window_definition_get_by_class(window_themes_tab_3_classes[_color_index_1]);
case 4: return theme_window_definition_get_by_class(window_themes_tab_4_classes[_color_index_1]);
case 5: return theme_window_definition_get_by_class(window_themes_tab_5_classes[_color_index_1]);
case 6: return theme_window_definition_get_by_class(window_themes_tab_6_classes[_color_index_1]);
case 7: return theme_window_definition_get_by_class(window_themes_tab_7_classes[_color_index_1]);
}
return NULL;
}
static window_colour_scheme* get_colour_scheme_tab_by_index(int index)
static theme_window_definition* get_colour_scheme_tab_definition_by_index(int index)
{
switch (_selected_tab) {
case 1: return colour_scheme_get_by_class(window_themes_tab_1_classes[index]);
case 2: return colour_scheme_get_by_class(window_themes_tab_2_classes[index]);
case 3: return colour_scheme_get_by_class(window_themes_tab_3_classes[index]);
case 4: return colour_scheme_get_by_class(window_themes_tab_4_classes[index]);
case 5: return colour_scheme_get_by_class(window_themes_tab_5_classes[index]);
case 6: return colour_scheme_get_by_class(window_themes_tab_6_classes[index]);
case 7: return colour_scheme_get_by_class(window_themes_tab_7_classes[index]);
case 1: return theme_window_definition_get_by_class(window_themes_tab_1_classes[index]);
case 2: return theme_window_definition_get_by_class(window_themes_tab_2_classes[index]);
case 3: return theme_window_definition_get_by_class(window_themes_tab_3_classes[index]);
case 4: return theme_window_definition_get_by_class(window_themes_tab_4_classes[index]);
case 5: return theme_window_definition_get_by_class(window_themes_tab_5_classes[index]);
case 6: return theme_window_definition_get_by_class(window_themes_tab_6_classes[index]);
case 7: return theme_window_definition_get_by_class(window_themes_tab_7_classes[index]);
}
return NULL;
}
static theme_window* get_colour_scheme_tab()
{
switch (_selected_tab) {
case 1: return theme_window_get_by_class(window_themes_tab_1_classes[_color_index_1]);
case 2: return theme_window_get_by_class(window_themes_tab_2_classes[_color_index_1]);
case 3: return theme_window_get_by_class(window_themes_tab_3_classes[_color_index_1]);
case 4: return theme_window_get_by_class(window_themes_tab_4_classes[_color_index_1]);
case 5: return theme_window_get_by_class(window_themes_tab_5_classes[_color_index_1]);
case 6: return theme_window_get_by_class(window_themes_tab_6_classes[_color_index_1]);
case 7: return theme_window_get_by_class(window_themes_tab_7_classes[_color_index_1]);
}
return NULL;
}
static theme_window* get_colour_scheme_tab_by_index(int index)
{
switch (_selected_tab) {
case 1: return theme_window_get_by_class(window_themes_tab_1_classes[index]);
case 2: return theme_window_get_by_class(window_themes_tab_2_classes[index]);
case 3: return theme_window_get_by_class(window_themes_tab_3_classes[index]);
case 4: return theme_window_get_by_class(window_themes_tab_4_classes[index]);
case 5: return theme_window_get_by_class(window_themes_tab_5_classes[index]);
case 6: return theme_window_get_by_class(window_themes_tab_6_classes[index]);
case 7: return theme_window_get_by_class(window_themes_tab_7_classes[index]);
}
return NULL;
}
@ -295,24 +334,24 @@ static int get_colour_scheme_tab_count()
return 0;
}
static int get_colour_scheme_index() {
/*static int get_colour_scheme_index() {
switch (_selected_tab) {
case 1: return colour_scheme_get_index_by_class(window_themes_tab_1_classes[_color_index_1]);
case 2: return colour_scheme_get_index_by_class(window_themes_tab_2_classes[_color_index_1]);
case 3: return colour_scheme_get_index_by_class(window_themes_tab_3_classes[_color_index_1]);
case 4: return colour_scheme_get_index_by_class(window_themes_tab_4_classes[_color_index_1]);
case 5: return colour_scheme_get_index_by_class(window_themes_tab_5_classes[_color_index_1]);
case 6: return colour_scheme_get_index_by_class(window_themes_tab_6_classes[_color_index_1]);
case 7: return colour_scheme_get_index_by_class(window_themes_tab_7_classes[_color_index_1]);
case 1: return theme_window_get_index_by_class(window_themes_tab_1_classes[_color_index_1]);
case 2: return theme_window_get_index_by_class(window_themes_tab_2_classes[_color_index_1]);
case 3: return theme_window_get_index_by_class(window_themes_tab_3_classes[_color_index_1]);
case 4: return theme_window_get_index_by_class(window_themes_tab_4_classes[_color_index_1]);
case 5: return theme_window_get_index_by_class(window_themes_tab_5_classes[_color_index_1]);
case 6: return theme_window_get_index_by_class(window_themes_tab_6_classes[_color_index_1]);
case 7: return theme_window_get_index_by_class(window_themes_tab_7_classes[_color_index_1]);
}
return -1;
}
}*/
static void window_themes_draw_tab_images(rct_drawpixelinfo *dpi, rct_window *w)
{
int sprite_idx;
for (int i = 0; i < 8; i++) {
for (int i = 0; i < WINDOW_THEMES_TAB_COUNT; i++) {
sprite_idx = window_themes_tab_sprites[i];
if (_selected_tab == i)
sprite_idx += w->frame_no / window_themes_tab_animation_divisor[_selected_tab];
@ -341,12 +380,16 @@ void window_themes_open()
(1 << WIDX_THEMES_EDITORS_TAB) |
(1 << WIDX_THEMES_MISC_TAB) |
(1 << WIDX_THEMES_PROMPTS_TAB) |
(1 << WIDX_THEMES_FEATURES_TAB) |
(1 << WIDX_THEMES_COLORBTN_MASK) |
(1 << WIDX_THEMES_PRESETS) |
(1 << WIDX_THEMES_PRESETS_DROPDOWN) |
(1 << WIDX_THEMES_DUPLICATE_BUTTON) |
(1 << WIDX_THEMES_DELETE_BUTTON) |
(1 << WIDX_THEMES_RENAME_BUTTON);
(1 << WIDX_THEMES_RENAME_BUTTON) |
(1 << WIDX_THEMES_RCT1_RIDE_LIGHTS) |
(1 << WIDX_THEMES_RCT1_PARK_LIGHTS) |
(1 << WIDX_THEMES_RCT1_SCENARIO_FONT);
window_themes_init_vars();
@ -429,6 +472,29 @@ static void window_themes_resize()
gfx_invalidate_screen();
}
}
else if (_selected_tab == WINDOW_THEMES_TAB_FEATURES) {
w->min_width = 320;
w->min_height = 107;
w->max_width = 320;
w->max_height = 107;
if (w->width < w->min_width) {
w->width = w->min_width;
gfx_invalidate_screen();
}
if (w->height < w->min_height) {
w->height = w->min_height;
gfx_invalidate_screen();
}
if (w->width > w->max_width) {
w->width = w->max_width;
gfx_invalidate_screen();
}
if (w->height > w->max_height) {
w->height = w->max_height;
gfx_invalidate_screen();
}
}
else {
w->min_width = 320;
w->min_height = 270;
@ -468,6 +534,7 @@ static void window_themes_mousedown(int widgetIndex, rct_window* w, rct_widget*
case WIDX_THEMES_EDITORS_TAB:
case WIDX_THEMES_MISC_TAB:
case WIDX_THEMES_PROMPTS_TAB:
case WIDX_THEMES_FEATURES_TAB:
newSelectedTab = widgetIndex - WIDX_THEMES_SETTINGS_TAB;
if (_selected_tab == newSelectedTab)
break;
@ -498,6 +565,36 @@ static void window_themes_mousedown(int widgetIndex, rct_window* w, rct_widget*
gDropdownItemsChecked = 1 << gCurrentTheme;
break;
case WIDX_THEMES_RCT1_RIDE_LIGHTS:
if (gCurrentTheme >= 2) {
theme_get_preset()->features.rct1_ride_lights ^= 1;
themes_save_preset(gCurrentTheme);
window_invalidate_all();
}
else {
window_error_open(5241, STR_NONE);
}
break;
case WIDX_THEMES_RCT1_PARK_LIGHTS:
if (gCurrentTheme >= 2) {
theme_get_preset()->features.rct1_park_lights ^= 1;
themes_save_preset(gCurrentTheme);
window_invalidate_all();
}
else {
window_error_open(5241, STR_NONE);
}
break;
case WIDX_THEMES_RCT1_SCENARIO_FONT:
if (gCurrentTheme >= 2) {
theme_get_preset()->features.rct1_scenario_font ^= 1;
themes_save_preset(gCurrentTheme);
window_invalidate_all();
}
else {
window_error_open(5241, STR_NONE);
}
break;
}
}
@ -511,7 +608,6 @@ static void window_themes_dropdown()
case WIDX_THEMES_LIST:
if (dropdownIndex != -1) {
get_colour_scheme_tab()->colours[_color_index_2] = dropdownIndex | get_colour_scheme_tab()->colours[_color_index_2] & 0x80;
gConfigThemes.presets[gCurrentTheme].colour_schemes[get_colour_scheme_index()].colours[_color_index_2] = dropdownIndex | get_colour_scheme_tab()->colours[_color_index_2] & 0x80;
window_invalidate_all();
_color_index_1 = -1;
_color_index_2 = -1;
@ -545,7 +641,7 @@ void window_themes_scrollgetsize() {
window_get_register(w);
if (_selected_tab == WINDOW_THEMES_TAB_SETTINGS)
if (_selected_tab == WINDOW_THEMES_TAB_SETTINGS || _selected_tab == WINDOW_THEMES_TAB_FEATURES)
return;
int scrollHeight = get_colour_scheme_tab_count() * _row_height;
@ -580,7 +676,7 @@ void window_themes_scrollmousedown() {
int y2 = y % _row_height;
_color_index_1 = y / _row_height;
_color_index_2 = ((x - _button_offset_x) / 12);
if (_color_index_2 < get_colour_scheme_tab()->num_colours) {
if (_color_index_2 < get_colour_scheme_tab_definition()->num_colours) {
if (x >= _button_offset_x && x < _button_offset_x + 12 * 6 && y2 >= _button_offset_y && y2 < _button_offset_y + 11) {
if (gCurrentTheme >= 2) {
window_themes_widgets[WIDX_THEMES_COLORBTN_MASK].left = _button_offset_x + _color_index_2 * 12 + window_themes_widgets[WIDX_THEMES_LIST].left;
@ -598,12 +694,9 @@ void window_themes_scrollmousedown() {
if (gCurrentTheme >= 2) {
if (get_colour_scheme_tab()->colours[_color_index_2] & 0x80) {
get_colour_scheme_tab()->colours[_color_index_2] &= 0x7F;
gConfigThemes.presets[gCurrentTheme].colour_schemes[get_colour_scheme_index()].colours[_color_index_2] &= 0x7F;
}
else {
get_colour_scheme_tab()->colours[_color_index_2] |= 0x80;
gConfigThemes.presets[gCurrentTheme].colour_schemes[get_colour_scheme_index()].colours[_color_index_2] |= 0x80;
}
themes_save_preset(gCurrentTheme);
window_invalidate_all();
@ -661,7 +754,7 @@ static void window_themes_textinput()
}
if (!nameTaken) {
if (widgetIndex == WIDX_THEMES_DUPLICATE_BUTTON) {
theme_create_preset(text);
theme_create_preset(gCurrentTheme, text);
}
else {
theme_rename_preset(gCurrentTheme, text);
@ -689,7 +782,7 @@ void window_themes_invalidate()
window_get_register(w);
colour_scheme_update(w);
int pressed_widgets = w->pressed_widgets & 0xFFFFF00F;
int pressed_widgets = w->pressed_widgets & 0xFFFFE00F;
uint8 widgetIndex = _selected_tab + 4;
w->pressed_widgets = pressed_widgets | (1 << widgetIndex);
@ -709,11 +802,53 @@ void window_themes_invalidate()
window_themes_widgets[WIDX_THEMES_LIST].right = w->width - 4;
window_themes_widgets[WIDX_THEMES_LIST].bottom = w->height - 0x0F;
window_themes_widgets[WIDX_THEMES_LIST].type = WWT_EMPTY;
window_themes_widgets[WIDX_THEMES_RCT1_RIDE_LIGHTS].type = WWT_EMPTY;
window_themes_widgets[WIDX_THEMES_RCT1_PARK_LIGHTS].type = WWT_EMPTY;
window_themes_widgets[WIDX_THEMES_RCT1_SCENARIO_FONT].type = WWT_EMPTY;
window_themes_widgets[WIDX_THEMES_DUPLICATE_BUTTON].type = WWT_EMPTY;
window_themes_widgets[WIDX_THEMES_DELETE_BUTTON].type = WWT_EMPTY;
window_themes_widgets[WIDX_THEMES_RENAME_BUTTON].type = WWT_EMPTY;
window_themes_widgets[WIDX_THEMES_PRESETS].type = WWT_EMPTY;
window_themes_widgets[WIDX_THEMES_PRESETS_DROPDOWN].type = WWT_EMPTY;
if (_selected_tab == WINDOW_THEMES_TAB_SETTINGS) {
window_themes_widgets[WIDX_THEMES_LIST].type = WWT_EMPTY;
window_themes_widgets[WIDX_THEMES_RCT1_RIDE_LIGHTS].type = WWT_EMPTY;
window_themes_widgets[WIDX_THEMES_RCT1_PARK_LIGHTS].type = WWT_EMPTY;
window_themes_widgets[WIDX_THEMES_RCT1_SCENARIO_FONT].type = WWT_EMPTY;
window_themes_widgets[WIDX_THEMES_DUPLICATE_BUTTON].type = WWT_DROPDOWN_BUTTON;
window_themes_widgets[WIDX_THEMES_DELETE_BUTTON].type = WWT_DROPDOWN_BUTTON;
window_themes_widgets[WIDX_THEMES_RENAME_BUTTON].type = WWT_DROPDOWN_BUTTON;
window_themes_widgets[WIDX_THEMES_PRESETS].type = WWT_DROPDOWN;
window_themes_widgets[WIDX_THEMES_PRESETS_DROPDOWN].type = WWT_DROPDOWN_BUTTON;
}
else if (_selected_tab == WINDOW_THEMES_TAB_FEATURES) {
window_themes_widgets[WIDX_THEMES_LIST].type = WWT_EMPTY;
window_themes_widgets[WIDX_THEMES_RCT1_RIDE_LIGHTS].type = WWT_CHECKBOX;
window_themes_widgets[WIDX_THEMES_RCT1_PARK_LIGHTS].type = WWT_CHECKBOX;
window_themes_widgets[WIDX_THEMES_RCT1_SCENARIO_FONT].type = WWT_CHECKBOX;
window_themes_widgets[WIDX_THEMES_DUPLICATE_BUTTON].type = WWT_EMPTY;
window_themes_widgets[WIDX_THEMES_DELETE_BUTTON].type = WWT_EMPTY;
window_themes_widgets[WIDX_THEMES_RENAME_BUTTON].type = WWT_EMPTY;
window_themes_widgets[WIDX_THEMES_PRESETS].type = WWT_EMPTY;
window_themes_widgets[WIDX_THEMES_PRESETS_DROPDOWN].type = WWT_EMPTY;
widget_set_checkbox_value(w, WIDX_THEMES_RCT1_RIDE_LIGHTS, theme_get_preset()->features.rct1_ride_lights);
widget_set_checkbox_value(w, WIDX_THEMES_RCT1_PARK_LIGHTS, theme_get_preset()->features.rct1_park_lights);
widget_set_checkbox_value(w, WIDX_THEMES_RCT1_SCENARIO_FONT, theme_get_preset()->features.rct1_scenario_font);
}
else {
window_themes_widgets[WIDX_THEMES_LIST].type = WWT_SCROLL;
window_themes_widgets[WIDX_THEMES_RCT1_RIDE_LIGHTS].type = WWT_EMPTY;
window_themes_widgets[WIDX_THEMES_RCT1_PARK_LIGHTS].type = WWT_EMPTY;
window_themes_widgets[WIDX_THEMES_RCT1_SCENARIO_FONT].type = WWT_EMPTY;
window_themes_widgets[WIDX_THEMES_DUPLICATE_BUTTON].type = WWT_EMPTY;
window_themes_widgets[WIDX_THEMES_DELETE_BUTTON].type = WWT_EMPTY;
window_themes_widgets[WIDX_THEMES_RENAME_BUTTON].type = WWT_EMPTY;
window_themes_widgets[WIDX_THEMES_PRESETS].type = WWT_EMPTY;
window_themes_widgets[WIDX_THEMES_PRESETS_DROPDOWN].type = WWT_EMPTY;
}
}
@ -727,12 +862,7 @@ void window_themes_paint() {
window_draw_widgets(w, dpi);
window_themes_draw_tab_images(dpi, w);
if (_selected_tab != WINDOW_THEMES_TAB_SETTINGS) {
gfx_draw_string_left(dpi, 5236, w, w->colours[1], w->x + 6, 58 - 12 + w->y + 1);
gfx_draw_string_left(dpi, 5237, w, w->colours[1], w->x + 220, 58 - 12 + w->y + 1);
}
else {
if (_selected_tab == WINDOW_THEMES_TAB_SETTINGS) {
RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS + 0, uint32) = (uint32)&gConfigThemes.presets[gCurrentTheme].name;
gfx_draw_string_left(dpi, 5238, NULL, w->colours[1], w->x + 10, w->y + window_themes_widgets[WIDX_THEMES_PRESETS].top + 1);
gfx_draw_string_left_clipped(
@ -745,6 +875,13 @@ void window_themes_paint() {
w->x + window_themes_widgets[WIDX_THEMES_PRESETS_DROPDOWN].left - window_themes_widgets[WIDX_THEMES_PRESETS].left - 4
);
}
else if (_selected_tab == WINDOW_THEMES_TAB_FEATURES) {
}
else {
gfx_draw_string_left(dpi, 5236, w, w->colours[1], w->x + 6, 58 - 12 + w->y + 1);
gfx_draw_string_left(dpi, 5237, w, w->colours[1], w->x + 220, 58 - 12 + w->y + 1);
}
}
/**
@ -759,7 +896,7 @@ void window_themes_scrollpaint()
window_paint_get_registers(w, dpi);
if (_selected_tab == WINDOW_THEMES_TAB_SETTINGS)
if (_selected_tab == WINDOW_THEMES_TAB_SETTINGS || _selected_tab == WINDOW_THEMES_TAB_FEATURES)
return;
if ((w->colours[1] & 0x80) == 0)
@ -788,9 +925,9 @@ void window_themes_scrollpaint()
}
}
for (int j = 0; j < get_colour_scheme_tab_by_index(i)->num_colours; j++) {
for (int j = 0; j < get_colour_scheme_tab_definition_by_index(i)->num_colours; j++) {
gfx_draw_string_left(dpi, get_colour_scheme_tab_by_index(i)->name, NULL, w->colours[1], 2, y + 4);
gfx_draw_string_left(dpi, get_colour_scheme_tab_definition_by_index(i)->name, NULL, w->colours[1], 2, y + 4);
uint32 image = ((get_colour_scheme_tab_by_index(i)->colours[j] & 0x7F) << 19) + 0x600013C3;
if (i == _color_index_1 && j == _color_index_2) {

View File

@ -289,11 +289,8 @@ static void window_scenarioselect_paint()
window_paint_get_registers(w, dpi);
window_draw_widgets(w, dpi);
// Use small text for the tabs when the RCT1 colour scheme is selected.
//format = (gConfigInterface.rct1_colour_scheme) ? 5138 : 1193;
// Will reimplement this later
format = 1193;
format = (theme_get_preset()->features.rct1_scenario_font) ? 5138 : 1193;
// Text for each tab
for (i = 0; i < 5; i++) {
@ -358,12 +355,8 @@ static void window_scenarioselect_scrollpaint()
colour = (colour << 24) | (colour << 16) | (colour << 8) | colour;
gfx_clear(dpi, colour);
// Use white text for the scenario names when the RCT1 colour scheme is selected
//highlighted_format = gConfigInterface.rct1_colour_scheme ? 5139 : 1193;
//unhighlighted_format = gConfigInterface.rct1_colour_scheme ? 5139 : 1191;
// Will reimplement this later
highlighted_format = 1193;
unhighlighted_format = 1191;
highlighted_format = (theme_get_preset()->features.rct1_scenario_font) ? 5139 : 1193;
unhighlighted_format = (theme_get_preset()->features.rct1_scenario_font) ? 5139 : 1191;
y = 0;
for (i = 0; i < gScenarioListCount; i++) {