diff --git a/src/OpenLoco/src/Objects/DockObject.cpp b/src/OpenLoco/src/Objects/DockObject.cpp index 4f1a6d1b34..9deb4f1545 100644 --- a/src/OpenLoco/src/Objects/DockObject.cpp +++ b/src/OpenLoco/src/Objects/DockObject.cpp @@ -2,7 +2,9 @@ #include "Drawing/SoftwareDrawingEngine.h" #include "Graphics/Colour.h" #include "Graphics/Gfx.h" +#include "ObjectImageTable.h" #include "ObjectManager.h" +#include "ObjectStringTable.h" #include namespace OpenLoco @@ -42,11 +44,39 @@ namespace OpenLoco // 0x00490E49 void DockObject::load(const LoadedObjectHandle& handle, stdx::span data, ObjectManager::DependentObjects*) { - Interop::registers regs; - regs.esi = Interop::X86Pointer(this); - regs.ebx = handle.id; - regs.ecx = enumValue(handle.type); - Interop::call(0x00490E49, regs); + auto remainingData = data.subspan(sizeof(DockObject)); + + auto strRes = ObjectManager::loadStringTable(remainingData, handle, 0); + name = strRes.str; + remainingData = remainingData.subspan(strRes.tableLength); + + // Load unk? + var_14 = reinterpret_cast(remainingData.data()); + remainingData = remainingData.subspan(numAux01); + + // Load unk2? + var_18 = reinterpret_cast(remainingData.data()); + remainingData = remainingData.subspan(numAux02Ent * sizeof(uint16_t)); + for (auto i = 0U; i < numAux02Ent; ++i) + { + var_1C[0] = reinterpret_cast(remainingData.data()); + while (*remainingData.data() != static_cast(0xFF)) + { + remainingData = remainingData.subspan(1); + } + remainingData = remainingData.subspan(1); + } + + auto imgRes = ObjectManager::loadImageTable(remainingData); + image = imgRes.imageOffset; + + // Related to unk2? + const auto offset = (flags & (1 << 0)) ? numAux02Ent * 4 : 1; + var_0C = imgRes.imageOffset + offset; + + // Unused code numAux01 related + + assert(remainingData.size() == imgRes.tableLength); } // 0x00490EC9 @@ -55,6 +85,8 @@ namespace OpenLoco name = 0; image = 0; var_0C = 0; - std::fill(std::begin(var_1C), std::end(var_1C), 0); + var_14 = nullptr; + var_18 = nullptr; + std::fill(std::begin(var_1C), std::end(var_1C), nullptr); } } diff --git a/src/OpenLoco/src/Objects/DockObject.h b/src/OpenLoco/src/Objects/DockObject.h index a434821223..7d28fe7a9d 100644 --- a/src/OpenLoco/src/Objects/DockObject.h +++ b/src/OpenLoco/src/Objects/DockObject.h @@ -28,14 +28,15 @@ namespace OpenLoco uint8_t var_07; uint32_t image; // 0x08 uint32_t var_0C; - uint8_t pad_10[0x12 - 0x10]; + uint16_t flags; uint8_t numAux01; // 0x12 - uint8_t numAux02Ent; // 0x13 - uint8_t pad_14[0x1C - 0x14]; - uint32_t var_1C[1]; // odd that this is size 1 but that is how its used - uint16_t designedYear; // 0x20 - uint16_t obsoleteYear; // 0x22 - Map::Pos2 boatPosition; // 0x24 + uint8_t numAux02Ent; // 0x13 must be 1 or 0 + const uint8_t* var_14; + const uint16_t* var_18; + const uint8_t* var_1C[1]; // odd that this is size 1 but that is how its used + uint16_t designedYear; // 0x20 + uint16_t obsoleteYear; // 0x22 + Map::Pos2 boatPosition; // 0x24 void drawPreviewImage(Gfx::RenderTarget& rt, const int16_t x, const int16_t y) const; void drawDescription(Gfx::RenderTarget& rt, const int16_t x, const int16_t y, [[maybe_unused]] const int16_t width) const;