diff --git a/src/openrct2-ui/windows/EditorInventionsList.cpp b/src/openrct2-ui/windows/EditorInventionsList.cpp index be1a5e6142..3bc5654931 100644 --- a/src/openrct2-ui/windows/EditorInventionsList.cpp +++ b/src/openrct2-ui/windows/EditorInventionsList.cpp @@ -168,11 +168,6 @@ static const rct_string_id EditorInventionsResearchCategories[] = { static void window_editor_inventions_list_drag_open(rct_research_item *researchItem); static void move_research_item(rct_research_item *beforeItem); -static sint32 research_item_is_always_researched(rct_research_item *researchItem) -{ - return (researchItem->flags & (RESEARCH_ENTRY_FLAG_RIDE_ALWAYS_RESEARCHED | RESEARCH_ENTRY_FLAG_SCENERY_SET_ALWAYS_RESEARCHED)) != 0; -} - /** * * rct2: 0x0068596F @@ -307,78 +302,7 @@ static void research_always_researched_setup() research_scenery_groups_setup(); } -/** - * - * rct2: 0x00685A93 - */ -static void research_items_shuffle() -{ - rct_research_item *researchItem, *researchOrderBase, researchItemTemp; - sint32 i, numNonResearchedItems; - // Skip pre-researched items - for (researchItem = gResearchItems; researchItem->rawValue != RESEARCHED_ITEMS_SEPARATOR; researchItem++) {} - researchItem++; - researchOrderBase = researchItem; - - // Count non pre-researched items - numNonResearchedItems = 0; - for (; researchItem->rawValue != RESEARCHED_ITEMS_END; researchItem++) - numNonResearchedItems++; - - // Shuffle list - for (i = 0; i < numNonResearchedItems; i++) { - sint32 ri = util_rand() % numNonResearchedItems; - if (ri == i) - continue; - - researchItemTemp = researchOrderBase[i]; - researchOrderBase[i] = researchOrderBase[ri]; - researchOrderBase[ri] = researchItemTemp; - } -} - -static void research_items_make_all_unresearched() -{ - rct_research_item *researchItem, *nextResearchItem, researchItemTemp; - - sint32 sorted; - do { - sorted = 1; - for (researchItem = gResearchItems; researchItem->rawValue != RESEARCHED_ITEMS_SEPARATOR; researchItem++) { - if (research_item_is_always_researched(researchItem)) - continue; - - nextResearchItem = researchItem + 1; - if (nextResearchItem->rawValue == RESEARCHED_ITEMS_SEPARATOR || research_item_is_always_researched(nextResearchItem)) { - // Bubble up always researched item or separator - researchItemTemp = *researchItem; - *researchItem = *nextResearchItem; - *nextResearchItem = researchItemTemp; - sorted = 0; - - if (researchItem->rawValue == RESEARCHED_ITEMS_SEPARATOR) - break; - } - } - } while (!sorted); -} - -static void research_items_make_all_researched() -{ - rct_research_item *researchItem, researchItemTemp; - - // Find separator - for (researchItem = gResearchItems; researchItem->rawValue != RESEARCHED_ITEMS_SEPARATOR; researchItem++) { } - - // Move separator below all items - for (; (researchItem + 1)->rawValue != RESEARCHED_ITEMS_END; researchItem++) { - // Swap separator with research item - researchItemTemp = *researchItem; - *researchItem = *(researchItem + 1); - *(researchItem + 1) = researchItemTemp; - } -} /** * diff --git a/src/openrct2/management/Research.cpp b/src/openrct2/management/Research.cpp index c3785a1c33..f0165ae004 100644 --- a/src/openrct2/management/Research.cpp +++ b/src/openrct2/management/Research.cpp @@ -35,6 +35,7 @@ #include "Finance.h" #include "Research.h" #include "../core/Memory.hpp" +#include "../util/Util.h" const sint32 _researchRate[] = {0, 160, 250, 400}; @@ -928,3 +929,86 @@ void research_fix() } } } + +void research_items_make_all_unresearched() +{ + rct_research_item * researchItem, * nextResearchItem, researchItemTemp; + + sint32 sorted; + do { + sorted = 1; + for (researchItem = gResearchItems; researchItem->rawValue != RESEARCHED_ITEMS_SEPARATOR; researchItem++) + { + if (research_item_is_always_researched(researchItem)) + continue; + + nextResearchItem = researchItem + 1; + if (nextResearchItem->rawValue == RESEARCHED_ITEMS_SEPARATOR || research_item_is_always_researched(nextResearchItem)) + { + // Bubble up always researched item or separator + researchItemTemp = *researchItem; + *researchItem = *nextResearchItem; + *nextResearchItem = researchItemTemp; + sorted = 0; + + if (researchItem->rawValue == RESEARCHED_ITEMS_SEPARATOR) + break; + } + } + } + while (!sorted); +} + +void research_items_make_all_researched() +{ + rct_research_item * researchItem, researchItemTemp; + + // Find separator + for (researchItem = gResearchItems; researchItem->rawValue != RESEARCHED_ITEMS_SEPARATOR; researchItem++) { } + + // Move separator below all items + for (; (researchItem + 1)->rawValue != RESEARCHED_ITEMS_END; researchItem++) + { + // Swap separator with research item + researchItemTemp = *researchItem; + *researchItem = *(researchItem + 1); + *(researchItem + 1) = researchItemTemp; + } +} + +/** + * + * rct2: 0x00685A93 + */ +void research_items_shuffle() +{ + rct_research_item * researchItem, * researchOrderBase, researchItemTemp; + sint32 i, numNonResearchedItems; + + // Skip pre-researched items + for (researchItem = gResearchItems; researchItem->rawValue != RESEARCHED_ITEMS_SEPARATOR; researchItem++) {} + researchItem++; + researchOrderBase = researchItem; + + // Count non pre-researched items + numNonResearchedItems = 0; + for (; researchItem->rawValue != RESEARCHED_ITEMS_END; researchItem++) + numNonResearchedItems++; + + // Shuffle list + for (i = 0; i < numNonResearchedItems; i++) + { + sint32 ri = util_rand() % numNonResearchedItems; + if (ri == i) + continue; + + researchItemTemp = researchOrderBase[i]; + researchOrderBase[i] = researchOrderBase[ri]; + researchOrderBase[ri] = researchItemTemp; + } +} + +bool research_item_is_always_researched(rct_research_item * researchItem) +{ + return (researchItem->flags & (RESEARCH_ENTRY_FLAG_RIDE_ALWAYS_RESEARCHED | RESEARCH_ENTRY_FLAG_SCENERY_SET_ALWAYS_RESEARCHED)) != 0; +} diff --git a/src/openrct2/management/Research.h b/src/openrct2/management/Research.h index a30c706340..df62a6a102 100644 --- a/src/openrct2/management/Research.h +++ b/src/openrct2/management/Research.h @@ -149,6 +149,11 @@ rct_string_id research_get_friendly_base_ride_type_name(uint8 trackType, rct_rid void research_remove_flags(); void research_fix(); +void research_items_make_all_unresearched(); +void research_items_make_all_researched(); +void research_items_shuffle(); +bool research_item_is_always_researched(rct_research_item * researchItem); + #ifdef __cplusplus } #endif