From ededc82cba842432f501f70c6db34aafe8209daa Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sat, 2 Jan 2016 20:40:24 +0000 Subject: [PATCH] add DLC and Build your own scenario classification --- data/language/english_uk.txt | 3 +- src/localisation/string_ids.h | 3 ++ src/scenario.c | 11 ++++++ src/scenario.h | 11 +++++- src/scenario_list.c | 30 +++++++++------- src/scenario_sources.c | 37 ++++++++++++-------- src/windows/editor_objective_options.c | 6 ++-- src/windows/title_scenarioselect.c | 47 +++++++++++++++++++------- 8 files changed, 103 insertions(+), 45 deletions(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index a7fb98c133..b275753414 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3969,7 +3969,8 @@ STR_5627 :Group scenario list by: STR_5628 :Source game STR_5629 :Difficulty level STR_5630 :Enable unlocking of scenarios -STR_5631 :{GREY}{STRINGID} +STR_5631 :Original DLC Parks +STR_5632 :Build your own... ############# # Scenarios # diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index e62e622dc0..fe5d9012e6 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -2254,6 +2254,9 @@ enum { STR_OPTIONS_SCENARIO_DIFFICULTY = 5629, STR_OPTIONS_SCENARIO_UNLOCKING = 5630, + STR_DLC_PARKS = 5631, + STR_BUILD_YOUR_OWN_PARKS = 5632, + // Have to include resource strings (from scenarios and objects) for the time being now that language is partially working STR_COUNT = 32768 }; diff --git a/src/scenario.c b/src/scenario.c index 7dd400aa0c..52973e9491 100644 --- a/src/scenario.c +++ b/src/scenario.c @@ -45,6 +45,17 @@ #include "world/sprite.h" #include "world/water.h" +const rct_string_id ScenarioCategoryStringIds[SCENARIO_CATEGORY_COUNT] = { + STR_BEGINNER_PARKS, + STR_CHALLENGING_PARKS, + STR_EXPERT_PARKS, + STR_REAL_PARKS, + STR_OTHER_PARKS, + + STR_DLC_PARKS, + STR_BUILD_YOUR_OWN_PARKS, +}; + static char _scenarioPath[MAX_PATH]; static const char *_scenarioFileName = ""; diff --git a/src/scenario.h b/src/scenario.h index 41d3ffa3b4..c8a4b8bfa6 100644 --- a/src/scenario.h +++ b/src/scenario.h @@ -398,11 +398,18 @@ enum { #define S6_MAGIC_NUMBER 0x00031144 enum { + // RCT2 categories (keep order) SCENARIO_CATEGORY_BEGINNER, SCENARIO_CATEGORY_CHALLENGING, SCENARIO_CATEGORY_EXPERT, SCENARIO_CATEGORY_REAL, - SCENARIO_CATEGORY_OTHER + SCENARIO_CATEGORY_OTHER, + + // OpenRCT2 categories + SCENARIO_CATEGORY_DLC, + SCENARIO_CATEGORY_BUILD_YOUR_OWN, + + SCENARIO_CATEGORY_COUNT }; enum { @@ -455,6 +462,8 @@ typedef struct { uint8 category; } source_desc; +extern const rct_string_id ScenarioCategoryStringIds[SCENARIO_CATEGORY_COUNT]; + // Scenario list extern int gScenarioListCount; extern int gScenarioListCapacity; diff --git a/src/scenario_list.c b/src/scenario_list.c index bfede50777..d5041788ed 100644 --- a/src/scenario_list.c +++ b/src/scenario_list.c @@ -37,7 +37,7 @@ scenario_highscore_entry *gScenarioHighscoreList = NULL; static void scenario_list_include(const utf8 *directory); static void scenario_list_add(const utf8 *path, uint64 timestamp); static void scenario_list_sort(); -static int scenario_list_sort_by_name(const void *a, const void *b); +static int scenario_list_sort_by_category(const void *a, const void *b); static int scenario_list_sort_by_index(const void *a, const void *b); static void scenario_translate(scenario_index_entry *scenarioEntry, const rct_object_entry *stexObjectEntry); @@ -222,19 +222,29 @@ static void scenario_list_sort() compareFunc = gConfigGeneral.scenario_select_mode == SCENARIO_SELECT_MODE_ORIGIN ? scenario_list_sort_by_index : - scenario_list_sort_by_name; + scenario_list_sort_by_category; qsort(gScenarioList, gScenarioListCount, sizeof(scenario_index_entry), compareFunc); } -static int scenario_list_sort_by_name(const void *a, const void *b) +static int scenario_list_category_compare(int categoryA, int categoryB) +{ + if (categoryA == categoryB) return 0; + if (categoryA == SCENARIO_CATEGORY_DLC) return -1; + if (categoryB == SCENARIO_CATEGORY_DLC) return 1; + if (categoryA == SCENARIO_CATEGORY_BUILD_YOUR_OWN) return -1; + if (categoryB == SCENARIO_CATEGORY_BUILD_YOUR_OWN) return 1; + return sgn(categoryA - categoryB); +} + +static int scenario_list_sort_by_category(const void *a, const void *b) { const scenario_index_entry *entryA = (const scenario_index_entry*)a; const scenario_index_entry *entryB = (const scenario_index_entry*)b; // Order by category if (entryA->category != entryB->category) { - return entryA->category - entryB->category; + return scenario_list_category_compare(entryA->category, entryB->category); } // Then by source game / name @@ -266,9 +276,9 @@ static int scenario_list_sort_by_index(const void *a, const void *b) default: if (entryA->source_index == -1 && entryB->source_index == -1) { if (entryA->category == entryB->category) { - return scenario_list_sort_by_name(a, b); + return scenario_list_sort_by_category(a, b); } else { - return entryA->category - entryB->category; + return scenario_list_category_compare(entryA->category, entryB->category); } } else if (entryA->source_index == -1) { return 1; @@ -278,13 +288,7 @@ static int scenario_list_sort_by_index(const void *a, const void *b) return entryA->source_index - entryB->source_index; } case SCENARIO_SOURCE_REAL: - return scenario_list_sort_by_name(a, b); - case SCENARIO_SOURCE_OTHER: - if (entryA->category == entryB->category) { - return scenario_list_sort_by_name(a, b); - } else { - return entryA->category - entryB->category; - } + return scenario_list_sort_by_category(a, b); } } diff --git a/src/scenario_sources.c b/src/scenario_sources.c index 2e5b0f45c0..1ca3c957cb 100644 --- a/src/scenario_sources.c +++ b/src/scenario_sources.c @@ -191,26 +191,35 @@ const scenario_title_desc ScenarioTitlesRealParks[] = { }; // Other parks -const scenario_title_desc ScenarioTitlesRCT2BuildYourOwnParks[] = { - { SC_UNIDENTIFIED, "Build your own Six Flags Belgium", SCENARIO_CATEGORY_OTHER }, - { SC_UNIDENTIFIED, "Build your own Six Flags Great Adventure", SCENARIO_CATEGORY_OTHER }, - { SC_UNIDENTIFIED, "Build your own Six Flags Holland", SCENARIO_CATEGORY_OTHER }, - { SC_UNIDENTIFIED, "Build your own Six Flags Magic Mountain", SCENARIO_CATEGORY_OTHER }, - { SC_UNIDENTIFIED, "Build your own Six Flags Park", SCENARIO_CATEGORY_OTHER }, - { SC_UNIDENTIFIED, "Build your own Six Flags over Texas", SCENARIO_CATEGORY_OTHER }, +const scenario_title_desc ScenarioTitlesOtherParks[] = { + { SC_UNIDENTIFIED, "Fort Anachronism", SCENARIO_CATEGORY_DLC }, + { SC_UNIDENTIFIED, "PC Player", SCENARIO_CATEGORY_DLC }, + { SC_UNIDENTIFIED, "PC Gaming World", SCENARIO_CATEGORY_DLC }, + { SC_UNIDENTIFIED, "gameplay", SCENARIO_CATEGORY_DLC }, + { SC_UNIDENTIFIED, "Panda World", SCENARIO_CATEGORY_DLC }, + { SC_UNIDENTIFIED, "Competition Land 1", SCENARIO_CATEGORY_DLC }, + { SC_UNIDENTIFIED, "Competition Land 2", SCENARIO_CATEGORY_DLC }, + { SC_UNIDENTIFIED, "Build your own Six Flags Belgium", SCENARIO_CATEGORY_BUILD_YOUR_OWN }, + { SC_UNIDENTIFIED, "Build your own Six Flags Great Adventure", SCENARIO_CATEGORY_BUILD_YOUR_OWN }, + { SC_UNIDENTIFIED, "Build your own Six Flags Holland", SCENARIO_CATEGORY_BUILD_YOUR_OWN }, + { SC_UNIDENTIFIED, "Build your own Six Flags Magic Mountain", SCENARIO_CATEGORY_BUILD_YOUR_OWN }, + { SC_UNIDENTIFIED, "Build your own Six Flags Park", SCENARIO_CATEGORY_BUILD_YOUR_OWN }, + { SC_UNIDENTIFIED, "Build your own Six Flags over Texas", SCENARIO_CATEGORY_BUILD_YOUR_OWN }, }; +#define DEFINE_SCENARIO_TITLE_DESC_GROUP(x) { countof(x), x } const struct { int count; const scenario_title_desc * const titles; } ScenarioTitlesBySource[] = { - { countof(ScenarioTitlesRCT1), ScenarioTitlesRCT1 }, - { countof(ScenarioTitlesRCT1AA), ScenarioTitlesRCT1AA }, - { countof(ScenarioTitlesRCT1LL), ScenarioTitlesRCT1LL }, - { countof(ScenarioTitlesRCT2), ScenarioTitlesRCT2 }, - { countof(ScenarioTitlesRCT2WW), ScenarioTitlesRCT2WW }, - { countof(ScenarioTitlesRCT2TT), ScenarioTitlesRCT2TT }, - { countof(ScenarioTitlesRealParks), ScenarioTitlesRealParks }, + DEFINE_SCENARIO_TITLE_DESC_GROUP(ScenarioTitlesRCT1), + DEFINE_SCENARIO_TITLE_DESC_GROUP(ScenarioTitlesRCT1AA), + DEFINE_SCENARIO_TITLE_DESC_GROUP(ScenarioTitlesRCT1LL), + DEFINE_SCENARIO_TITLE_DESC_GROUP(ScenarioTitlesRCT2), + DEFINE_SCENARIO_TITLE_DESC_GROUP(ScenarioTitlesRCT2WW), + DEFINE_SCENARIO_TITLE_DESC_GROUP(ScenarioTitlesRCT2TT), + DEFINE_SCENARIO_TITLE_DESC_GROUP(ScenarioTitlesRealParks), + DEFINE_SCENARIO_TITLE_DESC_GROUP(ScenarioTitlesOtherParks), }; bool scenario_get_source_desc(const utf8 *name, source_desc *outDesc) diff --git a/src/windows/editor_objective_options.c b/src/windows/editor_objective_options.c index 04bdad6fd1..aa7861c59e 100644 --- a/src/windows/editor_objective_options.c +++ b/src/windows/editor_objective_options.c @@ -534,9 +534,9 @@ static void window_editor_objective_options_show_category_dropdown(rct_window *w dropdownWidget = &w->widgets[WIDX_CATEGORY]; - for (i = 0; i < 5; i++) { + for (i = SCENARIO_CATEGORY_BEGINNER; i <= SCENARIO_CATEGORY_OTHER; i++) { gDropdownItemsFormat[i] = 1142; - gDropdownItemsArgs[i] = STR_BEGINNER_PARKS + i; + gDropdownItemsArgs[i] = ScenarioCategoryStringIds[i]; } window_dropdown_show_text_custom_width( w->x + dropdownWidget->left, @@ -1036,7 +1036,7 @@ static void window_editor_objective_options_main_paint(rct_window *w, rct_drawpi // Scenario category value x = w->x + w->widgets[WIDX_CATEGORY].left + 1; y = w->y + w->widgets[WIDX_CATEGORY].top; - stringId = STR_BEGINNER_PARKS + s6Info->category; + stringId = ScenarioCategoryStringIds[s6Info->category]; gfx_draw_string_left(dpi, 1193, &stringId, 0, x, y); } diff --git a/src/windows/title_scenarioselect.c b/src/windows/title_scenarioselect.c index 156133e8e6..fc8fdbd184 100644 --- a/src/windows/title_scenarioselect.c +++ b/src/windows/title_scenarioselect.c @@ -189,7 +189,11 @@ static void window_scenarioselect_init_tabs(rct_window *w) if (gConfigGeneral.scenario_select_mode == SCENARIO_SELECT_MODE_ORIGIN) { showPages |= 1 << scenario->source_game; } else { - showPages |= 1 << scenario->category; + int category = scenario->category; + if (category > SCENARIO_CATEGORY_OTHER) { + category = SCENARIO_CATEGORY_OTHER; + } + showPages |= 1 << category; } } @@ -358,7 +362,7 @@ static void window_scenarioselect_paint(rct_window *w, rct_drawpixelinfo *dpi) if (gConfigGeneral.scenario_select_mode == SCENARIO_SELECT_MODE_ORIGIN) { RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS + 0, short) = STR_SCENARIO_CATEGORY_RCT1 + i; } else { // old-style - RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS + 0, short) = STR_BEGINNER_PARKS + i; + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS + 0, short) = ScenarioCategoryStringIds[i]; } gfx_draw_string_centred_wrapped(dpi, (void*)RCT2_ADDRESS_COMMON_FORMAT_ARGS, x, y, 87, format, 10); } @@ -415,7 +419,6 @@ static void window_scenarioselect_scrollpaint(rct_window *w, rct_drawpixelinfo * int highlighted_format = (theme_get_preset()->features.rct1_scenario_font) ? 5139 : 1193; int unhighlighted_format = (theme_get_preset()->features.rct1_scenario_font) ? 5139 : 1191; - int disabled_format = 5619; bool wide = gConfigGeneral.scenario_select_mode == SCENARIO_SELECT_MODE_ORIGIN; @@ -528,14 +531,25 @@ static void initialise_list_items(rct_window *w) // Category heading rct_string_id headingStringId = STR_NONE; if (gConfigGeneral.scenario_select_mode == SCENARIO_SELECT_MODE_ORIGIN) { - if (w->selected_tab != 6 && currentHeading != scenario->category) { + if (w->selected_tab != SCENARIO_SOURCE_REAL && currentHeading != scenario->category) { currentHeading = scenario->category; - headingStringId = STR_BEGINNER_PARKS + currentHeading; + headingStringId = ScenarioCategoryStringIds[currentHeading]; } } else { - if (w->selected_tab < 3 && currentHeading != scenario->source_game) { - currentHeading = scenario->source_game; - headingStringId = STR_SCENARIO_CATEGORY_RCT1 + currentHeading; + if (w->selected_tab <= SCENARIO_CATEGORY_EXPERT) { + if (currentHeading != scenario->source_game) { + currentHeading = scenario->source_game; + headingStringId = STR_SCENARIO_CATEGORY_RCT1 + currentHeading; + } + } else if (w->selected_tab == SCENARIO_CATEGORY_OTHER) { + int category = scenario->category; + if (category <= SCENARIO_CATEGORY_REAL) { + category = SCENARIO_CATEGORY_OTHER; + } + if (currentHeading != category) { + currentHeading = category; + headingStringId = ScenarioCategoryStringIds[category]; + } } } if (headingStringId != (rct_string_id)STR_NONE) { @@ -612,12 +626,19 @@ static void initialise_list_items(rct_window *w) static bool is_scenario_visible(rct_window *w, scenario_index_entry *scenario) { - if ((gConfigGeneral.scenario_select_mode == SCENARIO_SELECT_MODE_ORIGIN && scenario->source_game != w->selected_tab) || - (gConfigGeneral.scenario_select_mode == SCENARIO_SELECT_MODE_DIFFICULTY && scenario->category != w->selected_tab) - ) { - return false; + if (gConfigGeneral.scenario_select_mode == SCENARIO_SELECT_MODE_ORIGIN) { + if (scenario->source_game != w->selected_tab) { + return false; + } + } else { + int category = scenario->category; + if (category > SCENARIO_CATEGORY_OTHER) { + category = SCENARIO_CATEGORY_OTHER; + } + if (category != w->selected_tab) { + return false; + } } - return true; }