diff --git a/OpenRCT2.xcodeproj/project.pbxproj b/OpenRCT2.xcodeproj/project.pbxproj index 50abb923d2..19c2f1c9ca 100644 --- a/OpenRCT2.xcodeproj/project.pbxproj +++ b/OpenRCT2.xcodeproj/project.pbxproj @@ -806,6 +806,7 @@ 7CDC7EE9B12E40FB9FE78546 /* Crypt.OpenRCT2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4248E4E4394842D4AF6119DA /* Crypt.OpenRCT2.cpp */; }; 4653963391E945D397BCCA0C /* ChangeMapSizeAction.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 76CE81CEAF7F4538976F7C4C /* ChangeMapSizeAction.cpp */; }; F1BE1CB5525C4FF794A3F3CE /* ChangeMapSizeAction.h in Headers */ = {isa = PBXBuildFile; fileRef = C49050C073DB4CB980E1EC5A /* ChangeMapSizeAction.h */; }; + B769EFE0AA1149AE93C15DED /* OrcaStream.hpp in Headers */ = {isa = PBXBuildFile; fileRef = F9061C16C67A45D7915FA229 /* OrcaStream.hpp */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -1915,6 +1916,7 @@ 4248E4E4394842D4AF6119DA /* Crypt.OpenRCT2.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Crypt.OpenRCT2.cpp; path = src/openrct2/core/Crypt.OpenRCT2.cpp; sourceTree = SOURCE_ROOT; }; 76CE81CEAF7F4538976F7C4C /* ChangeMapSizeAction.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ChangeMapSizeAction.cpp; path = src/openrct2/actions/ChangeMapSizeAction.cpp; sourceTree = SOURCE_ROOT; }; C49050C073DB4CB980E1EC5A /* ChangeMapSizeAction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ChangeMapSizeAction.h; path = src/openrct2/actions/ChangeMapSizeAction.h; sourceTree = SOURCE_ROOT; }; + F9061C16C67A45D7915FA229 /* OrcaStream.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = OrcaStream.hpp; path = src/openrct2/core/OrcaStream.hpp; sourceTree = SOURCE_ROOT; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -2571,7 +2573,6 @@ F76C838C1EC4E7CC00FA49E2 /* MemoryStream.cpp */, F76C838D1EC4E7CC00FA49E2 /* MemoryStream.h */, 2ADE2F24224418B2002598AF /* Meta.hpp */, - F76C838E1EC4E7CC00FA49E2 /* Nullable.hpp */, 2ADE2F23224418B1002598AF /* Numerics.hpp */, 4C8BF07523EDD108002D1F7F /* OrcaStream.hpp */, F76C838F1EC4E7CC00FA49E2 /* Path.cpp */, @@ -2592,6 +2593,7 @@ F4D523B8782E4C458AF1490D /* GroupVector.hpp */, F28A181D311D4E078FDB090C /* ZipStream.hpp */, 4248E4E4394842D4AF6119DA /* Crypt.OpenRCT2.cpp */, + F9061C16C67A45D7915FA229 /* OrcaStream.hpp */, ); path = core; sourceTree = ""; @@ -3675,6 +3677,7 @@ C8D612EB56BD4214BEC0F7FF /* GroupVector.hpp in Headers */, B2F44E535BD14A03BE8B9D14 /* ZipStream.hpp in Headers */, F1BE1CB5525C4FF794A3F3CE /* ChangeMapSizeAction.h in Headers */, + B769EFE0AA1149AE93C15DED /* OrcaStream.hpp in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/distribution/changelog.txt b/distribution/changelog.txt index ceee8213e9..14ded1411b 100644 --- a/distribution/changelog.txt +++ b/distribution/changelog.txt @@ -27,6 +27,7 @@ - Fix: [#15255] Tile Inspector shows banner information on walls that do not contain one. - Fix: [#15257] Chat icon shows in scenario/track editor. Other icons don't disable when deactivated in options menu. - Fix: [#15289] Unexpected behavior with duplicated banners which also caused desyncs in multiplayer. +- Fix: [#15487] Map animations do not work correctly when loading an exported SV6 file in vanilla RCT2. - Improved: [#3417] Crash dumps are now placed in their own folder. - Change: [#8601] Revert ToonTower base block fix to re-enable support blocking. - Change: [#15174] [Plugin] Deprecate the type "peep" and add support to target a specific scripting api version. diff --git a/src/openrct2-ui/scripting/CustomWindow.cpp b/src/openrct2-ui/scripting/CustomWindow.cpp index d522e0b35e..d8803a3ed0 100644 --- a/src/openrct2-ui/scripting/CustomWindow.cpp +++ b/src/openrct2-ui/scripting/CustomWindow.cpp @@ -28,6 +28,7 @@ # include # include # include +# include # include using namespace OpenRCT2; diff --git a/src/openrct2/core/Crypt.OpenRCT2.cpp b/src/openrct2/core/Crypt.OpenRCT2.cpp index f3ad2d17d5..ba48bd5d15 100644 --- a/src/openrct2/core/Crypt.OpenRCT2.cpp +++ b/src/openrct2/core/Crypt.OpenRCT2.cpp @@ -17,7 +17,7 @@ using namespace Crypt; -class OpenRCT2FNV1aAlgorithm : public FNV1aAlgorithm +class OpenRCT2FNV1aAlgorithm final : public FNV1aAlgorithm { private: static constexpr uint64_t Offset = 0xCBF29CE484222325ULL; diff --git a/src/openrct2/core/IStream.cpp b/src/openrct2/core/IStream.cpp index 4af586b1d5..70d12182b7 100644 --- a/src/openrct2/core/IStream.cpp +++ b/src/openrct2/core/IStream.cpp @@ -54,9 +54,9 @@ namespace OpenRCT2 } } - void IStream::WriteString(std::string_view str) + void IStream::WriteString(const std::string_view str) { - for (auto c : str) + for (const auto c : str) { if (c == '\0') break; diff --git a/src/openrct2/core/IStream.hpp b/src/openrct2/core/IStream.hpp index 7334f0d0a7..58449729c2 100644 --- a/src/openrct2/core/IStream.hpp +++ b/src/openrct2/core/IStream.hpp @@ -208,7 +208,7 @@ namespace OpenRCT2 utf8* ReadString(); std::string ReadStdString(); void WriteString(const utf8* str); - void WriteString(std::string_view string); + void WriteString(const std::string_view string); void WriteString(const std::string& string); }; diff --git a/src/openrct2/core/OrcaStream.hpp b/src/openrct2/core/OrcaStream.hpp index 472878762e..30f25ba4ba 100644 --- a/src/openrct2/core/OrcaStream.hpp +++ b/src/openrct2/core/OrcaStream.hpp @@ -69,7 +69,7 @@ namespace OpenRCT2 ChunkEntry _currentChunk; public: - OrcaStream(IStream& stream, Mode mode) + OrcaStream(IStream& stream, const Mode mode) { _stream = &stream; _mode = mode; @@ -121,10 +121,7 @@ namespace OpenRCT2 ~OrcaStream() { - if (_mode == Mode::READING) - { - } - else + if (_mode == Mode::WRITING) { const void* uncompressedData = _buffer.GetData(); const uint64_t uncompressedSize = _buffer.GetLength(); @@ -184,7 +181,7 @@ namespace OpenRCT2 return _header; } - template bool ReadWriteChunk(uint32_t chunkId, TFunc f) + template bool ReadWriteChunk(const uint32_t chunkId, TFunc f) { if (_mode == Mode::READING) { @@ -209,12 +206,12 @@ namespace OpenRCT2 } private: - bool SeekChunk(uint32_t id) + bool SeekChunk(const uint32_t id) { - auto result = std::find_if(_chunks.begin(), _chunks.end(), [id](const ChunkEntry& e) { return e.Id == id; }); + const auto result = std::find_if(_chunks.begin(), _chunks.end(), [id](const ChunkEntry& e) { return e.Id == id; }); if (result != _chunks.end()) { - auto offset = result->Offset; + const auto offset = result->Offset; _buffer.SetPosition(offset); return true; } @@ -238,7 +235,7 @@ namespace OpenRCT2 std::stack _arrayStack; public: - ChunkStream(MemoryStream& buffer, Mode mode) + ChunkStream(MemoryStream& buffer, const Mode mode) : _buffer(buffer) , _mode(mode) { @@ -254,7 +251,7 @@ namespace OpenRCT2 return _buffer; } - void ReadWrite(void* addr, size_t len) + void ReadWrite(void* addr, const size_t len) { if (_mode == Mode::READING) { @@ -266,7 +263,7 @@ namespace OpenRCT2 } } - void Read(void* addr, size_t len) + void Read(void* addr, const size_t len) { if (_mode == Mode::READING) { @@ -278,7 +275,7 @@ namespace OpenRCT2 } } - void Write(const void* addr, size_t len) + void Write(const void* addr, const size_t len) { if (_mode == Mode::READING) { @@ -404,7 +401,7 @@ namespace OpenRCT2 Write(sv); } - void Write(const std::string_view& v) + void Write(const std::string_view v) { if (_mode == Mode::READING) { @@ -426,7 +423,7 @@ namespace OpenRCT2 { if (_mode == Mode::READING) { - auto count = BeginArray(); + const auto count = BeginArray(); vec.clear(); for (size_t i = 0; i < count; i++) { @@ -459,7 +456,7 @@ namespace OpenRCT2 { if (_mode == Mode::READING) { - auto count = BeginArray(); + const auto count = BeginArray(); for (auto& el : arr) { el = {}; @@ -495,12 +492,12 @@ namespace OpenRCT2 } private: - void ReadBuffer(void* dst, size_t len) + void ReadBuffer(void* dst, const size_t len) { _buffer.Read(dst, len); } - void WriteBuffer(const void* buffer, size_t len) + void WriteBuffer(const void* buffer, const size_t len) { _buffer.Write(buffer, len); } @@ -509,7 +506,7 @@ namespace OpenRCT2 { if constexpr (sizeof(T) > 4) { - if (std::is_signed()) + if constexpr (std::is_signed()) { int64_t raw{}; Read(&raw, sizeof(raw)); @@ -545,11 +542,11 @@ namespace OpenRCT2 } } - template::value>> void WriteInteger(T value) + template::value>> void WriteInteger(const T value) { if constexpr (sizeof(T) > 4) { - if (std::is_signed()) + if constexpr (std::is_signed()) { auto raw = static_cast(value); Write(&raw, sizeof(raw)); @@ -562,7 +559,7 @@ namespace OpenRCT2 } else { - if (std::is_signed()) + if constexpr (std::is_signed()) { auto raw = static_cast(value); Write(&raw, sizeof(raw)); @@ -581,9 +578,9 @@ namespace OpenRCT2 buffer.reserve(64); while (true) { - char c; + char c{}; ReadBuffer(&c, sizeof(c)); - if (c == 0) + if (c == '\0') { break; } @@ -593,9 +590,9 @@ namespace OpenRCT2 return buffer; } - void WriteString(const std::string_view& s) + void WriteString(const std::string_view s) { - char nullt = '\0'; + const char nullt = '\0'; auto len = s.find('\0'); if (len == std::string_view::npos) { @@ -643,7 +640,7 @@ namespace OpenRCT2 return arrayState.Count == 0; } - auto lastElSize = static_cast(_buffer.GetPosition()) - arrayState.LastPos; + const auto lastElSize = static_cast(_buffer.GetPosition()) - arrayState.LastPos; if (arrayState.Count == 0) { // Set array element size based on first element size @@ -663,12 +660,9 @@ namespace OpenRCT2 void EndArray() { auto& arrayState = _arrayStack.top(); - if (_mode == Mode::READING) + if (_mode == Mode::WRITING) { - } - else - { - size_t backupPos = _buffer.GetPosition(); + const size_t backupPos = _buffer.GetPosition(); if (backupPos != static_cast(arrayState.StartPos) + 8 && arrayState.Count == 0) { throw std::runtime_error("Array data was written but no elements were added."); diff --git a/src/openrct2/libopenrct2.vcxproj b/src/openrct2/libopenrct2.vcxproj index 6c79e3a5f8..64f2074036 100644 --- a/src/openrct2/libopenrct2.vcxproj +++ b/src/openrct2/libopenrct2.vcxproj @@ -177,6 +177,7 @@ + diff --git a/src/openrct2/util/Util.cpp b/src/openrct2/util/Util.cpp index 24ceec36c3..1894dd4472 100644 --- a/src/openrct2/util/Util.cpp +++ b/src/openrct2/util/Util.cpp @@ -693,7 +693,7 @@ bool util_gzip_compress(FILE* source, FILE* dest) return true; } -std::vector Gzip(const void* data, size_t dataLen) +std::vector Gzip(const void* data, const size_t dataLen) { assert(data != nullptr); @@ -702,18 +702,21 @@ std::vector Gzip(const void* data, size_t dataLen) strm.zalloc = Z_NULL; strm.zfree = Z_NULL; strm.opaque = Z_NULL; - auto ret = deflateInit2(&strm, Z_DEFAULT_COMPRESSION, Z_DEFLATED, 15 | 16, 8, Z_DEFAULT_STRATEGY); - if (ret != Z_OK) + { - throw std::runtime_error("deflateInit2 failed with error " + std::to_string(ret)); + const auto ret = deflateInit2(&strm, Z_DEFAULT_COMPRESSION, Z_DEFLATED, 15 | 16, 8, Z_DEFAULT_STRATEGY); + if (ret != Z_OK) + { + throw std::runtime_error("deflateInit2 failed with error " + std::to_string(ret)); + } } - int flush; + int flush = 0; const auto* src = static_cast(data); size_t srcRemaining = dataLen; do { - auto nextBlockSize = std::min(srcRemaining, CHUNK); + const auto nextBlockSize = std::min(srcRemaining, CHUNK); srcRemaining -= nextBlockSize; flush = srcRemaining == 0 ? Z_FINISH : Z_NO_FLUSH; @@ -724,7 +727,7 @@ std::vector Gzip(const void* data, size_t dataLen) output.resize(output.size() + nextBlockSize); strm.avail_out = static_cast(nextBlockSize); strm.next_out = &output[output.size() - nextBlockSize]; - ret = deflate(&strm, flush); + const auto ret = deflate(&strm, flush); if (ret == Z_STREAM_ERROR) { throw std::runtime_error("deflate failed with error " + std::to_string(ret)); @@ -738,7 +741,7 @@ std::vector Gzip(const void* data, size_t dataLen) return output; } -std::vector Ungzip(const void* data, size_t dataLen) +std::vector Ungzip(const void* data, const size_t dataLen) { assert(data != nullptr); @@ -747,18 +750,21 @@ std::vector Ungzip(const void* data, size_t dataLen) strm.zalloc = Z_NULL; strm.zfree = Z_NULL; strm.opaque = Z_NULL; - auto ret = inflateInit2(&strm, 15 | 16); - if (ret != Z_OK) + { - throw std::runtime_error("inflateInit2 failed with error " + std::to_string(ret)); + const auto ret = inflateInit2(&strm, 15 | 16); + if (ret != Z_OK) + { + throw std::runtime_error("inflateInit2 failed with error " + std::to_string(ret)); + } } - int flush; + int flush = 0; const auto* src = static_cast(data); size_t srcRemaining = dataLen; do { - auto nextBlockSize = std::min(srcRemaining, CHUNK); + const auto nextBlockSize = std::min(srcRemaining, CHUNK); srcRemaining -= nextBlockSize; flush = srcRemaining == 0 ? Z_FINISH : Z_NO_FLUSH; @@ -769,7 +775,7 @@ std::vector Ungzip(const void* data, size_t dataLen) output.resize(output.size() + nextBlockSize); strm.avail_out = static_cast(nextBlockSize); strm.next_out = &output[output.size() - nextBlockSize]; - ret = inflate(&strm, flush); + const auto ret = inflate(&strm, flush); if (ret == Z_STREAM_ERROR) { throw std::runtime_error("deflate failed with error " + std::to_string(ret)); @@ -779,7 +785,7 @@ std::vector Ungzip(const void* data, size_t dataLen) src += nextBlockSize; } while (flush != Z_FINISH); - deflateEnd(&strm); + inflateEnd(&strm); return output; } diff --git a/src/openrct2/util/Util.h b/src/openrct2/util/Util.h index 2593c28b48..5acfa086fd 100644 --- a/src/openrct2/util/Util.h +++ b/src/openrct2/util/Util.h @@ -58,8 +58,8 @@ uint32_t util_rand(); std::optional> util_zlib_deflate(const uint8_t* data, size_t data_in_size); uint8_t* util_zlib_inflate(const uint8_t* data, size_t data_in_size, size_t* data_out_size); bool util_gzip_compress(FILE* source, FILE* dest); -std::vector Gzip(const void* data, size_t dataLen); -std::vector Ungzip(const void* data, size_t dataLen); +std::vector Gzip(const void* data, const size_t dataLen); +std::vector Ungzip(const void* data, const size_t dataLen); int8_t add_clamp_int8_t(int8_t value, int8_t value_to_add); int16_t add_clamp_int16_t(int16_t value, int16_t value_to_add);