From 4f03b0c99725bda2d95055c345f7dea287e6e14c Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Sat, 6 Jun 2015 20:07:27 +0100 Subject: [PATCH] Refactor of research. Fix bug that would cause a crash on a scenario that had rides with same base type --- src/management/research.c | 29 ++++++++++++++-------------- src/management/research.h | 5 +++++ src/windows/editor_inventions_list.c | 8 ++++---- 3 files changed, 23 insertions(+), 19 deletions(-) diff --git a/src/management/research.c b/src/management/research.c index 27d036ec24..f44ed4c5b2 100644 --- a/src/management/research.c +++ b/src/management/research.c @@ -57,10 +57,9 @@ void research_update_uncompleted_types() { int uncompletedResearchTypes = 0; rct_research_item *researchItem = gResearchItems; - while (researchItem->entryIndex != -1) - researchItem++; - researchItem++; - for (; researchItem->entryIndex != -2; researchItem++) + while (researchItem++->entryIndex != RESEARCHED_ITEMS_SEPERATOR); + + for (; researchItem->entryIndex != RESEARCHED_ITEMS_END; researchItem++) uncompletedResearchTypes |= (1 << researchItem->category); gResearchUncompletedCategories = uncompletedResearchTypes; @@ -163,7 +162,7 @@ static void research_next_design() */ void research_finish_item(sint32 entryIndex) { - int i, ebx, ecx, rideEntryIndex, subSceneryEntryIndex; + int i, ebx, base_ride_type, rideEntryIndex, subSceneryEntryIndex; rct_ride_type *rideEntry, *rideEntry2; rct_scenery_set_entry *scenerySetEntry; @@ -171,14 +170,14 @@ void research_finish_item(sint32 entryIndex) research_invalidate_related_windows(); if (entryIndex >= 0x10000) { // Ride - ecx = (entryIndex >> 8) & 0xFF; + base_ride_type = (entryIndex >> 8) & 0xFF; rideEntryIndex = entryIndex & 0xFF; rideEntry = GET_RIDE_ENTRY(rideEntryIndex); - RCT2_ADDRESS(0x01357404, uint32)[ecx >> 5] |= (1 << (ecx & 0x1F)); - RCT2_ADDRESS(0x01357444, uint32)[ecx] = RCT2_ADDRESS(0x0097C468, uint32)[ecx]; - RCT2_ADDRESS(0x01357644, uint32)[ecx] = RCT2_ADDRESS(0x0097C5D4, uint32)[ecx]; - if (RCT2_GLOBAL(0x0097D4F2 + (ecx * 8), uint16) & 8) { - ebx = RCT2_GLOBAL(0x0097D4F5 + (ecx * 8), uint8); + RCT2_ADDRESS(0x01357404, uint32)[base_ride_type >> 5] |= (1 << (base_ride_type & 0x1F)); + RCT2_ADDRESS(0x01357444, uint32)[base_ride_type] = RCT2_ADDRESS(0x0097C468, uint32)[base_ride_type]; + RCT2_ADDRESS(0x01357644, uint32)[base_ride_type] = RCT2_ADDRESS(0x0097C5D4, uint32)[base_ride_type]; + if (RCT2_GLOBAL(0x0097D4F2 + (base_ride_type * 8), uint16) & 8) { + ebx = RCT2_GLOBAL(0x0097D4F5 + (base_ride_type * 8), uint8); RCT2_ADDRESS(0x01357444, uint32)[ebx] = RCT2_ADDRESS(0x0097C468, uint32)[ebx]; RCT2_ADDRESS(0x01357644, uint32)[ebx] = RCT2_ADDRESS(0x0097C5D4, uint32)[ebx]; } @@ -191,7 +190,7 @@ void research_finish_item(sint32 entryIndex) if (rideEntry2->flags & RIDE_ENTRY_FLAG_SEPERATE_RIDE) continue; - if (rideEntry2->ride_type[0] == ecx || rideEntry2->ride_type[1] == ecx || rideEntry2->ride_type[2] == ecx) + if (rideEntry2->ride_type[0] == base_ride_type || rideEntry2->ride_type[1] == base_ride_type || rideEntry2->ride_type[2] == base_ride_type) RCT2_ADDRESS(0x001357424, uint32)[i >> 5] |= 1 << (i & 0x1F); } } @@ -199,7 +198,7 @@ void research_finish_item(sint32 entryIndex) // I don't think 0x009AC06C is ever not 0, so probably redundant if (RCT2_GLOBAL(0x009AC06C, uint8) == 0) { RCT2_GLOBAL(0x013CE952, rct_string_id) = rideEntry->flags & RIDE_ENTRY_FLAG_SEPERATE_RIDE_NAME ? - rideEntry->name : ecx + 2; + rideEntry->name : base_ride_type + 2; if (!gSilentResearch) news_item_add_to_queue(NEWS_ITEM_RESEARCH, 2249, entryIndex); } @@ -292,7 +291,7 @@ void sub_684AC3(){ if ((research + 1)->entryIndex == inner_research->entryIndex){ ebp = inner_research; } - } while ((inner_research++)->entryIndex != -2); + } while ((inner_research++)->entryIndex != RESEARCHED_ITEMS_END); edx->entryIndex = research->entryIndex; ebp->entryIndex = (research + 1)->entryIndex; @@ -372,7 +371,7 @@ void research_remove_non_separate_vehicle_types() researchItem2 = researchItem; do { *researchItem2 = *(researchItem2 + 1); - } while ((researchItem2++)->entryIndex != RESEARCHED_ITEMS_END); + } while ((researchItem2++)->entryIndex != RESEARCHED_ITEMS_END_2); goto loopBeginning; } } diff --git a/src/management/research.h b/src/management/research.h index af39f75ef8..e26725b6db 100644 --- a/src/management/research.h +++ b/src/management/research.h @@ -29,6 +29,11 @@ typedef struct { uint8 category; } rct_research_item; +enum{ + RESEARCH_ENTRY_FLAG_SCENERY_SET_ALWAYS_RESEARCHED = (1 << 29), + RESEARCH_ENTRY_FLAG_RIDE_ALWAYS_RESEARCHED = (1 << 30), +}; + // Everything before this point has been researched #define RESEARCHED_ITEMS_SEPERATOR -1 // Everything before this point and after seperator still requires research diff --git a/src/windows/editor_inventions_list.c b/src/windows/editor_inventions_list.c index 535f976342..2e1b5296d8 100644 --- a/src/windows/editor_inventions_list.c +++ b/src/windows/editor_inventions_list.c @@ -162,7 +162,7 @@ static void move_research_item(rct_research_item *beforeItem); static int research_item_is_always_researched(rct_research_item *researchItem) { - return (researchItem->entryIndex & 0x60000000) != 0; + return (researchItem->entryIndex & (RESEARCH_ENTRY_FLAG_RIDE_ALWAYS_RESEARCHED | RESEARCH_ENTRY_FLAG_SCENERY_SET_ALWAYS_RESEARCHED)) != 0; } /* rct2: 0x0068596F @@ -185,7 +185,7 @@ static void research_rides_setup(){ } for (rct_research_item* research = gResearchItems; research->entryIndex != RESEARCHED_ITEMS_END; research++){ - if (research->entryIndex & (1 << 30)) + if (research->entryIndex & RESEARCH_ENTRY_FLAG_RIDE_ALWAYS_RESEARCHED) continue; // If not a ride @@ -232,7 +232,7 @@ static void research_rides_setup(){ } } - research->entryIndex |= (1 << 30); + research->entryIndex |= RESEARCH_ENTRY_FLAG_RIDE_ALWAYS_RESEARCHED; _editorInventionsListDraggedItem = research; move_research_item(gResearchItems); _editorInventionsListDraggedItem = NULL; @@ -262,7 +262,7 @@ static void research_scenery_sets_setup(){ if ((research->entryIndex & 0xFFFFFF) != entry_index) continue; - research->entryIndex |= (1 << 29); + research->entryIndex |= RESEARCH_ENTRY_FLAG_SCENERY_SET_ALWAYS_RESEARCHED; _editorInventionsListDraggedItem = research; move_research_item(gResearchItems); _editorInventionsListDraggedItem = NULL;