mirror of https://github.com/OpenRCT2/OpenRCT2.git
Move some research logic out of the Inventions window
This commit is contained in:
parent
37cec95ce2
commit
ddd8479827
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue