diff --git a/openrct2.vcxproj b/openrct2.vcxproj index fe0d037877..42eb95041d 100644 --- a/openrct2.vcxproj +++ b/openrct2.vcxproj @@ -118,7 +118,6 @@ - @@ -605,4 +604,4 @@ - + \ No newline at end of file diff --git a/src/localisation/language.cpp b/src/localisation/language.cpp index bd87a4b628..b3c8f75d01 100644 --- a/src/localisation/language.cpp +++ b/src/localisation/language.cpp @@ -322,129 +322,6 @@ static bool rct2_language_is_multibyte_charset(int languageId) } } -/* rct2: 0x006A9E24*/ -rct_string_id object_get_localised_text(uint8_t** pStringTable/*ebp*/, int type/*ecx*/, int index/*ebx*/, int tableindex/*edx*/) -{ - uint8 languageId, chosenLanguageId; - char *pString = nullptr; - int result = 0; - bool isBlank; - - while ((languageId = *(*pStringTable)++) != RCT2_LANGUAGE_ID_END) { - isBlank = true; - - // Strings that are just ' ' are set as invalid langauges. - // But if there is no real string then it will set the string as - // the blank string - for (char *ch = (char*)(*pStringTable); *ch != 0; ch++) { - if (!isblank(*ch)) { - isBlank = false; - break; - } - } - - if (isBlank) languageId = 0xFE; - - // This is the ideal situation. Language found - if (languageId == LanguagesDescriptors[gCurrentLanguage].rct2_original_id) { - chosenLanguageId = languageId; - pString = (char*)(*pStringTable); - result |= 1; - } - - // Just in case always load english into pString - if (languageId == RCT2_LANGUAGE_ID_ENGLISH_UK && !(result & 1)) { - chosenLanguageId = languageId; - pString = (char*)(*pStringTable); - result |= 2; - } - - // Failing that fall back to whatever is first string - if (!(result & 7)) { - chosenLanguageId = languageId; - pString = (char*)(*pStringTable); - if (!isBlank) result |= 4; - } - - // Skip over the actual string entry to get to the next entry - while (*(*pStringTable)++ != 0); - } - // Fall back in case language does not get set. - if (pString == NULL) - { - pString = (char*)(*pStringTable); - } - - char name[9]; - if (RCT2_GLOBAL(0x009ADAFC, uint8) == 0) { - memcpy(name, object_entry_groups[type].entries[index].name, 8); - } else { - memcpy(name, gTempObjectLoadName, 8); - } - name[8] = 0; - - rct_string_id stringId = _languageCurrent->GetObjectOverrideStringId(name, tableindex); - if (stringId != STR_NONE) { - return stringId; - } - - // If not scenario text - if (RCT2_GLOBAL(0x009ADAFC, uint8) == 0) { - int stringid = NONSTEX_BASE_STRING_ID; - for (int i = 0; i < type; i++) { - int nrobjects = object_entry_group_counts[i]; - int nrstringtables = ObjectTypeStringTableCount[i]; - stringid += nrobjects * nrstringtables; - } - stringid += index * ObjectTypeStringTableCount[type]; - // Used by the object list to allocate name in plugin.dat - RCT2_GLOBAL(RCT2_ADDRESS_CURR_OBJECT_BASE_STRING_ID, uint32) = stringid; - stringid += tableindex; - - // cache UTF-8 string - int cacheStringOffset = stringid - STEX_BASE_STRING_ID; - utf8 **cacheString = &_cachedObjectStrings[cacheStringOffset]; - if (*cacheString != nullptr) { - free(*cacheString); - } - if (rct2_language_is_multibyte_charset(chosenLanguageId)) { - *cacheString = convert_multibyte_charset(pString, chosenLanguageId); - } else { - *cacheString = win1252_to_utf8_alloc(pString); - } - utf8_trim_string(*cacheString); - - //put pointer in stringtable - _languageCurrent->SetString(stringid, *cacheString); - // Until all string related functions are finished copy - // to old array as well. - _languageOriginal[stringid] = *cacheString; - return stringid; - } else { - int stringid = STEX_BASE_STRING_ID + tableindex; - - // cache UTF-8 string - int cacheStringOffset = stringid - STEX_BASE_STRING_ID; - utf8 **cacheString = &_cachedObjectStrings[cacheStringOffset]; - if (*cacheString != nullptr) { - free(*cacheString); - } - if (rct2_language_is_multibyte_charset(chosenLanguageId)) { - *cacheString = convert_multibyte_charset(pString, chosenLanguageId); - } else { - *cacheString = win1252_to_utf8_alloc(pString); - } - utf8_trim_string(*cacheString); - - //put pointer in stringtable - _languageCurrent->SetString(stringid, *cacheString); - // Until all string related functions are finished copy - // to old array as well. - _languageOriginal[stringid] = *cacheString; - return stringid; - } -} - bool language_get_localised_scenario_strings(const utf8 *scenarioFilename, rct_string_id *outStringIds) { outStringIds[0] = _languageCurrent->GetScenarioOverrideStringId(scenarioFilename, 0); diff --git a/src/localisation/language.h b/src/localisation/language.h index 4bcab7a61f..0a6823f4e3 100644 --- a/src/localisation/language.h +++ b/src/localisation/language.h @@ -69,8 +69,6 @@ const char *language_get_string(rct_string_id id); bool language_open(int id); void language_close_all(); -rct_string_id object_get_localised_text(uint8_t** pStringTable/*ebp*/, int type/*ecx*/, int index/*ebx*/, int tableindex/*edx*/); - uint32 utf8_get_next(const utf8 *char_ptr, const utf8 **nextchar_ptr); utf8 *utf8_write_codepoint(utf8 *dst, uint32 codepoint); int utf8_insert_codepoint(utf8 *dst, uint32 codepoint); diff --git a/src/object.c b/src/object.c deleted file mode 100644 index 5368758525..0000000000 --- a/src/object.c +++ /dev/null @@ -1,92 +0,0 @@ -#pragma region Copyright (c) 2014-2016 OpenRCT2 Developers -/***************************************************************************** - * OpenRCT2, an open source clone of Roller Coaster Tycoon 2. - * - * OpenRCT2 is the work of many authors, a full list can be found in contributors.md - * For more information, visit https://github.com/OpenRCT2/OpenRCT2 - * - * OpenRCT2 is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * A full copy of the GNU General Public License can be found in licence.txt - *****************************************************************************/ -#pragma endregion - -#include "addresses.h" -#include "config.h" -#include "drawing/drawing.h" -#include "localisation/localisation.h" -#include "object.h" -#include "object_list.h" -#include "platform/platform.h" -#include "rct1.h" -#include "ride/ride.h" -#include "scenario.h" -#include "util/sawyercoding.h" -#include "world/entrance.h" -#include "world/footpath.h" -#include "world/scenery.h" -#include "world/water.h" - -char gTempObjectLoadName[9] = { 0 }; -uint32 gTotalNoImages = 0; - -int object_load_entry(const utf8 *path, rct_object_entry *outEntry) -{ - SDL_RWops *file; - - file = SDL_RWFromFile(path, "rb"); - if (file == NULL) - return 0; - - if (SDL_RWread(file, outEntry, sizeof(rct_object_entry), 1) != 1) { - SDL_RWclose(file); - return 0; - } - - SDL_RWclose(file); - return 1; -} - -int object_entry_compare(const rct_object_entry *a, const rct_object_entry *b) -{ - // If an official object don't bother checking checksum - if ((a->flags & 0xF0) || (b->flags & 0xF0)) { - if ((a->flags & 0x0F) != (b->flags & 0x0F)) - return 0; - int match = memcmp(a->name, b->name, 8); - if (match) - return 0; - } - else { - if (a->flags != b->flags) - return 0; - int match = memcmp(a->name, b->name, 8); - if (match) - return 0; - if (a->checksum != b->checksum) - return 0; - } - - return 1; -} - -int object_calculate_checksum(const rct_object_entry *entry, const uint8 *data, int dataLength) -{ - const uint8 *entryBytePtr = (uint8*)entry; - - uint32 checksum = 0xF369A75B; - checksum ^= entryBytePtr[0]; - checksum = rol32(checksum, 11); - for (int i = 4; i < 12; i++) { - checksum ^= entryBytePtr[i]; - checksum = rol32(checksum, 11); - } - for (int i = 0; i < dataLength; i++) { - checksum ^= data[i]; - checksum = rol32(checksum, 11); - } - return (int)checksum; -} diff --git a/src/object.h b/src/object.h index abf9b63a30..157348e49f 100644 --- a/src/object.h +++ b/src/object.h @@ -105,11 +105,7 @@ assert_struct_size(rct_object_filters, 3); #pragma pack(pop) extern const rct_object_entry_group object_entry_groups[]; -extern char gTempObjectLoadName[9]; -extern uint32 gTotalNoImages; - -int object_load_entry(const utf8 *path, rct_object_entry *outEntry); void object_list_load(); void set_load_objects_fail_reason(); bool object_read_and_load_entries(SDL_RWops* rw); @@ -120,8 +116,8 @@ void object_unload_all(); int check_object_entry(rct_object_entry *entry); bool object_load_chunk(int groupIndex, const rct_object_entry * entry, int * outGroupIndex); -int object_entry_compare(const rct_object_entry *a, const rct_object_entry *b); -int object_calculate_checksum(const rct_object_entry *entry, const uint8 *data, int dataLength); +bool object_entry_compare(const rct_object_entry *a, const rct_object_entry *b); +int object_calculate_checksum(const rct_object_entry * entry, const void * data, size_t dataLength); void reset_loaded_objects(); int find_object_in_entry_group(const rct_object_entry* entry, uint8* entry_type, uint8* entry_index); void object_create_identifier_name(char* string_buffer, const rct_object_entry* object); diff --git a/src/object/ObjectRepository.cpp b/src/object/ObjectRepository.cpp index cd6f2383cf..07a35523bb 100644 --- a/src/object/ObjectRepository.cpp +++ b/src/object/ObjectRepository.cpp @@ -640,8 +640,6 @@ extern "C" void reset_loaded_objects() { - gTotalNoImages = 0xF26E; - for (int i = 0; i < 721; i++) { Object * object = _loadedObjects[i]; @@ -881,4 +879,61 @@ extern "C" const Object * baseObject = (const Object *)object; baseObject->DrawPreview(dpi); } + + bool object_entry_compare(const rct_object_entry * a, const rct_object_entry * b) + { + // If an official object don't bother checking checksum + if ((a->flags & 0xF0) || (b->flags & 0xF0)) + { + if ((a->flags & 0x0F) != (b->flags & 0x0F)) + { + return 0; + } + int match = memcmp(a->name, b->name, 8); + if (match) + { + return 0; + } + } + else + { + if (a->flags != b->flags) + { + return 0; + } + int match = memcmp(a->name, b->name, 8); + if (match) + { + return 0; + } + if (a->checksum != b->checksum) + { + return 0; + } + } + return 1; + } + + int object_calculate_checksum(const rct_object_entry * entry, const void * data, size_t dataLength) + { + const uint8 *entryBytePtr = (uint8*)entry; + + uint32 checksum = 0xF369A75B; + checksum ^= entryBytePtr[0]; + checksum = rol32(checksum, 11); + for (int i = 4; i < 12; i++) + { + checksum ^= entryBytePtr[i]; + checksum = rol32(checksum, 11); + } + + uint8 * dataBytes = (uint8 *)data; + for (size_t i = 0; i < dataLength; i++) + { + checksum ^= dataBytes[i]; + checksum = rol32(checksum, 11); + } + + return (int)checksum; + } } diff --git a/src/object/RideObject.cpp b/src/object/RideObject.cpp index 01b9f75ce3..e092b292a3 100644 --- a/src/object/RideObject.cpp +++ b/src/object/RideObject.cpp @@ -304,35 +304,6 @@ void RideObject::Load() vehicleEntry->peep_loading_positions = _peepLoadingPositions[i]; } } - - // 0x6DEB71 - if (RCT2_GLOBAL(0x9ADAFD, uint8) == 0) - { - for (int i = 0; i < 3; i++) - { - sint16 rideType = _legacyType.ride_type[i]; - if (rideType != RIDE_TYPE_NULL) - { - uint8 * typeToRideEntryIndexMap = gTypeToRideEntryIndexMap; - while (rideType >= 0) - { - if (*typeToRideEntryIndexMap++ == 0xFF) - { - rideType--; - } - } - - typeToRideEntryIndexMap--; - uint8 previous_entry = 0; // TODO set this to entryIndex - while (typeToRideEntryIndexMap < gTypeToRideEntryIndexMap + Util::CountOf(gTypeToRideEntryIndexMap)) - { - uint8 backup_entry = *typeToRideEntryIndexMap; - *typeToRideEntryIndexMap++ = previous_entry; - previous_entry = backup_entry; - } - } - } - } } void RideObject::Unload() diff --git a/src/object/WaterObject.cpp b/src/object/WaterObject.cpp index cbe669a985..4ad0616341 100644 --- a/src/object/WaterObject.cpp +++ b/src/object/WaterObject.cpp @@ -47,11 +47,8 @@ void WaterObject::Load() _legacyType.var_06 = _legacyType.image_id + 1; _legacyType.var_0A = _legacyType.image_id + 4; - if (RCT2_GLOBAL(0x009ADAFD, uint8) == 0) - { - load_palette(); - gfx_invalidate_screen(); - } + load_palette(); + gfx_invalidate_screen(); } void WaterObject::Unload()