From 40f775c39a3de454b2d0e83b195c10104bfb0fa4 Mon Sep 17 00:00:00 2001 From: Ted John Date: Thu, 14 Dec 2017 13:28:08 +0000 Subject: [PATCH] Add JSON loading for water --- src/openrct2/object/WaterObject.cpp | 84 +++++++++++++++++++++++++++++ src/openrct2/object/WaterObject.h | 9 +++- 2 files changed, 91 insertions(+), 2 deletions(-) diff --git a/src/openrct2/object/WaterObject.cpp b/src/openrct2/object/WaterObject.cpp index 70fa3ee34e..c18c9ccfd3 100644 --- a/src/openrct2/object/WaterObject.cpp +++ b/src/openrct2/object/WaterObject.cpp @@ -14,10 +14,14 @@ *****************************************************************************/ #pragma endregion +#pragma warning(disable : 4706) // assignment within conditional expression + +#include #include "../core/IStream.hpp" #include "../localisation/Language.h" #include "../localisation/StringIds.h" #include "../OpenRCT2.h" +#include "ObjectJsonHelpers.h" #include "WaterObject.h" void WaterObject::ReadLegacy(IReadObjectContext * context, IStream * stream) @@ -55,3 +59,83 @@ void WaterObject::DrawPreview(rct_drawpixelinfo * dpi, sint32 width, sint32 heig sint32 y = height / 2; gfx_draw_string_centred(dpi, STR_WINDOW_NO_IMAGE, x, y, COLOUR_BLACK, nullptr); } + +void WaterObject::ReadJson(IReadObjectContext * context, const json_t * root) +{ + auto properties = json_object_get(root, "properties"); + _legacyType.flags = ObjectJsonHelpers::GetFlags(properties, { + { "allowDucks", WATER_FLAGS_ALLOW_DUCKS }}); + + ObjectJsonHelpers::LoadStrings(root, GetStringTable()); + + // Images which are actually palette data + static const char * paletteNames[] = + { + "general", + "waves-0", + "waves-1", + "waves-2", + "sparkles-0", + "sparkles-1", + "sparkles-2" + }; + for (auto paletteName : paletteNames) + { + auto jPalettes = json_object_get(properties, "palettes"); + if (jPalettes != nullptr) + { + auto jPalette = json_object_get(jPalettes, paletteName); + if (jPalette != nullptr) + { + ReadJsonPalette(jPalette); + } + } + } +} + +void WaterObject::ReadJsonPalette(const json_t * jPalette) +{ + auto paletteStartIndex = json_integer_value(json_object_get(jPalette, "index")); + auto jColours = json_object_get(jPalette, "colours"); + auto numColours = json_array_size(jColours); + + auto data = std::make_unique(numColours); + size_t dataIndex = 0; + + size_t index; + const json_t * jColour; + json_array_foreach(jColours, index, jColour) + { + auto szColour = json_string_value(jColour); + if (szColour != nullptr) + { + auto colour = ParseColour(szColour); + data[dataIndex + 0] = colour; + data[dataIndex + 1] = (colour >> 8) & 0xFF; + data[dataIndex + 2] = (colour >> 16) & 0xFF; + } + dataIndex += 3; + } + + rct_g1_element g1 = { 0 }; + g1.offset = data.get(); + g1.x_offset = (sint16)paletteStartIndex; + + auto &imageTable = GetImageTable(); + imageTable.AddImage(&g1); +} + +uint32 WaterObject::ParseColour(const std::string &s) const +{ + uint8 r = 0; + uint8 g = 0; + uint8 b = 0; + if (s[0] == '#' && s.size() == 7) + { + // Expect #RRGGBB + r = std::stoul(s.substr(1, 2), nullptr, 16) & 0xFF; + g = std::stoul(s.substr(3, 2), nullptr, 16) & 0xFF; + b = std::stoul(s.substr(5, 2), nullptr, 16) & 0xFF; + } + return (b << 16) | (g << 8) | r; +} diff --git a/src/openrct2/object/WaterObject.h b/src/openrct2/object/WaterObject.h index e1c7a6ec1e..7b30929d26 100644 --- a/src/openrct2/object/WaterObject.h +++ b/src/openrct2/object/WaterObject.h @@ -16,9 +16,9 @@ #pragma once -#include "Object.h" - +#include #include "../world/Water.h" +#include "Object.h" class WaterObject final : public Object { @@ -30,9 +30,14 @@ public: void * GetLegacyData() override { return &_legacyType; } + void ReadJson(IReadObjectContext * context, const json_t * root) override; void ReadLegacy(IReadObjectContext * context, IStream * stream) override; void Load() override; void Unload() override; void DrawPreview(rct_drawpixelinfo * dpi, sint32 width, sint32 height) const override; + +private: + void ReadJsonPalette(const json_t * jPalette); + uint32 ParseColour(const std::string &s) const; };