1 /***************************************************************************** 2 * Copyright (c) 2014-2020 OpenRCT2 developers 3 * 4 * For a complete list of all authors, please refer to contributors.md 5 * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 6 * 7 * OpenRCT2 is licensed under the GNU General Public License version 3. 8 *****************************************************************************/ 9 10 #pragma once 11 12 #include "../common.h" 13 #include "../object/ObjectLimits.h" 14 #include "../ride/Ride.h" 15 #include "../util/Util.h" 16 17 #include <optional> 18 19 struct rct_ride_entry; 20 21 namespace Research 22 { 23 enum class EntryType : uint8_t 24 { 25 Scenery = 0, 26 Ride = 1, 27 }; 28 } 29 30 enum 31 { 32 RESEARCH_ENTRY_FLAG_FIRST_OF_TYPE = (1 << 0), 33 RESEARCH_ENTRY_FLAG_SCENERY_SET_ALWAYS_RESEARCHED = (1 << 5), 34 RESEARCH_ENTRY_FLAG_RIDE_ALWAYS_RESEARCHED = (1 << 6), 35 }; 36 37 enum class ResearchCategory : uint8_t 38 { 39 Transport = 0, 40 Gentle = 1, 41 Rollercoaster = 2, 42 Thrill = 3, 43 Water = 4, 44 Shop = 5, 45 SceneryGroup = 6, 46 }; 47 48 struct ResearchItem 49 { 50 union 51 { 52 uint32_t rawValue; 53 struct 54 { 55 ObjectEntryIndex entryIndex; 56 uint8_t baseRideType; 57 Research::EntryType type; // 0: scenery entry, 1: ride entry 58 }; 59 }; 60 uint8_t flags; 61 ResearchCategory category; 62 63 bool IsNull() const; 64 void SetNull(); 65 bool Exists() const; 66 bool IsAlwaysResearched() const; 67 rct_string_id GetName() const; 68 rct_string_id GetCategoryInventionString() const; 69 rct_string_id GetCategoryName() const; 70 71 ResearchItem() = default; ResearchItemResearchItem72 constexpr ResearchItem(uint32_t _rawValue, ResearchCategory _category, uint8_t _flags) 73 : rawValue(_rawValue) 74 , flags(_flags) 75 , category(_category) 76 { 77 } ResearchItemResearchItem78 ResearchItem( 79 Research::EntryType _type, ObjectEntryIndex _entryIndex, uint8_t _baseRideType, ResearchCategory _category, 80 uint8_t _flags) 81 : entryIndex(_entryIndex) 82 , baseRideType(_baseRideType) 83 , type(_type) 84 , flags(_flags) 85 , category(_category) 86 { 87 } 88 ToRCT12ResearchItemResearchItem89 RCT12ResearchItem ToRCT12ResearchItem() const 90 { 91 RCT12ResearchItem retItem = {}; 92 if (IsNull()) 93 { 94 retItem.rawValue = RCT12_RESEARCHED_ITEMS_SEPARATOR; 95 } 96 else 97 { 98 retItem.entryIndex = OpenRCT2EntryIndexToRCTEntryIndex(entryIndex); 99 retItem.baseRideType = OpenRCT2RideTypeToRCT2RideType(baseRideType); 100 retItem.type = static_cast<uint8_t>(type); 101 retItem.flags = (flags & ~RESEARCH_ENTRY_FLAG_FIRST_OF_TYPE); 102 retItem.category = EnumValue(category); 103 } 104 105 return retItem; 106 } 107 ResearchItemResearchItem108 ResearchItem(const RCT12ResearchItem& oldResearchItem) 109 { 110 if (oldResearchItem.IsInventedEndMarker() || oldResearchItem.IsUninventedEndMarker() 111 || oldResearchItem.IsRandomEndMarker()) 112 { 113 rawValue = 0; 114 flags = 0; 115 category = ResearchCategory::Transport; 116 SetNull(); 117 } 118 else 119 { 120 entryIndex = RCTEntryIndexToOpenRCT2EntryIndex(oldResearchItem.entryIndex); 121 auto* rideEntry = get_ride_entry(entryIndex); 122 baseRideType = rideEntry != nullptr ? RCT2RideTypeToOpenRCT2RideType(oldResearchItem.baseRideType, rideEntry) 123 : oldResearchItem.baseRideType; 124 type = Research::EntryType{ oldResearchItem.type }; 125 flags = oldResearchItem.flags; 126 category = static_cast<ResearchCategory>(oldResearchItem.category); 127 } 128 } 129 130 bool operator==(const ResearchItem& rhs) const; 131 }; 132 133 // Only used to mark as null nowadays. Deprecated. TODO: remove. 134 #define RESEARCH_ITEM_NULL 0xFFFFFFFF 135 136 #define MAX_RESEARCH_ITEMS 500 137 138 enum 139 { 140 RESEARCH_FUNDING_NONE, 141 RESEARCH_FUNDING_MINIMUM, 142 RESEARCH_FUNDING_NORMAL, 143 RESEARCH_FUNDING_MAXIMUM, 144 145 RESEARCH_FUNDING_COUNT 146 }; 147 148 enum 149 { 150 RESEARCH_STAGE_INITIAL_RESEARCH, 151 RESEARCH_STAGE_DESIGNING, 152 RESEARCH_STAGE_COMPLETING_DESIGN, 153 RESEARCH_STAGE_UNKNOWN, 154 RESEARCH_STAGE_FINISHED_ALL 155 }; 156 157 extern uint8_t gResearchFundingLevel; 158 extern uint8_t gResearchPriorities; 159 extern uint16_t gResearchProgress; 160 extern uint8_t gResearchProgressStage; 161 extern uint8_t gResearchExpectedMonth; 162 extern uint8_t gResearchExpectedDay; 163 extern std::optional<ResearchItem> gResearchLastItem; 164 extern std::optional<ResearchItem> gResearchNextItem; 165 166 extern std::vector<ResearchItem> gResearchItemsUninvented; 167 extern std::vector<ResearchItem> gResearchItemsInvented; 168 extern uint8_t gResearchUncompletedCategories; 169 extern bool gSilentResearch; 170 171 void research_reset_items(); 172 void research_update_uncompleted_types(); 173 void research_update(); 174 void research_reset_current_item(); 175 void research_populate_list_random(); 176 177 void research_finish_item(ResearchItem* researchItem); 178 void research_insert(ResearchItem&& item, bool researched); 179 void ResearchRemove(const ResearchItem& researchItem); 180 181 bool research_insert_ride_entry(uint8_t rideType, ObjectEntryIndex entryIndex, ResearchCategory category, bool researched); 182 void research_insert_ride_entry(ObjectEntryIndex entryIndex, bool researched); 183 bool research_insert_scenery_group_entry(ObjectEntryIndex entryIndex, bool researched); 184 185 void ride_type_set_invented(uint32_t rideType); 186 void ride_entry_set_invented(int32_t rideEntryIndex); 187 void scenery_set_invented(const ScenerySelection& sceneryItem); 188 void scenery_set_not_invented(const ScenerySelection& sceneryItem); 189 bool ride_type_is_invented(uint32_t rideType); 190 bool ride_entry_is_invented(int32_t rideEntryIndex); 191 bool scenery_group_is_invented(int32_t sgIndex); 192 void scenery_group_set_invented(int32_t sgIndex); 193 bool scenery_is_invented(const ScenerySelection& sceneryItem); 194 void set_all_scenery_items_invented(); 195 void set_all_scenery_items_not_invented(); 196 void set_all_scenery_groups_not_invented(); 197 void set_every_ride_type_invented(); 198 void set_every_ride_type_not_invented(); 199 void set_every_ride_entry_invented(); 200 void set_every_ride_entry_not_invented(); 201 void research_remove_flags(); 202 void research_fix(); 203 204 void research_items_make_all_unresearched(); 205 void research_items_make_all_researched(); 206 void research_items_shuffle(); 207 /** 208 * Determines if a newly invented ride entry should be listed as a new ride 209 * or as a new vehicle for a pre-existing ride. 210 */ 211 void research_determine_first_of_type(); 212