Move some research logic out of the Inventions window

This commit is contained in:
Michael Steenbeek 2018-01-10 15:10:18 +01:00
parent 37cec95ce2
commit ddd8479827
3 changed files with 89 additions and 76 deletions

View File

@ -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;
}
}
/**
*

View File

@ -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;
}

View File

@ -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