Skip to content

Commit

Permalink
Implement dock object load (#1829)
Browse files Browse the repository at this point in the history
* Implement dock object load

* Add flags
  • Loading branch information
duncanspumpkin committed Feb 11, 2023
1 parent a5578f0 commit 5441482
Show file tree
Hide file tree
Showing 2 changed files with 55 additions and 14 deletions.
44 changes: 38 additions & 6 deletions src/OpenLoco/src/Objects/DockObject.cpp
Expand Up @@ -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 <OpenLoco/Interop/Interop.hpp>

namespace OpenLoco
Expand Down Expand Up @@ -42,11 +44,39 @@ namespace OpenLoco
// 0x00490E49
void DockObject::load(const LoadedObjectHandle& handle, stdx::span<const std::byte> 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<const uint8_t*>(remainingData.data());
remainingData = remainingData.subspan(numAux01);

// Load unk2?
var_18 = reinterpret_cast<const uint16_t*>(remainingData.data());
remainingData = remainingData.subspan(numAux02Ent * sizeof(uint16_t));
for (auto i = 0U; i < numAux02Ent; ++i)
{
var_1C[0] = reinterpret_cast<const uint8_t*>(remainingData.data());
while (*remainingData.data() != static_cast<std::byte>(0xFF))
{
remainingData = remainingData.subspan(1);
}
remainingData = remainingData.subspan(1);
}

auto imgRes = ObjectManager::loadImageTable(remainingData);
image = imgRes.imageOffset;

// Related to unk2?
const auto offset = (flags & DockObjectFlags::unk01) != DockObjectFlags::none ? numAux02Ent * 4 : 1;
var_0C = imgRes.imageOffset + offset;

// Unused code numAux01 related

assert(remainingData.size() == imgRes.tableLength);
}

// 0x00490EC9
Expand All @@ -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);
}
}
25 changes: 17 additions & 8 deletions src/OpenLoco/src/Objects/DockObject.h
Expand Up @@ -3,6 +3,7 @@
#include "Map/Map.hpp"
#include "Object.h"
#include "Types.hpp"
#include <OpenLoco/Core/EnumFlags.hpp>
#include <OpenLoco/Core/Span.hpp>

namespace OpenLoco
Expand All @@ -16,6 +17,13 @@ namespace OpenLoco
struct RenderTarget;
}

enum class DockObjectFlags : uint16_t
{
none = 0,
unk01 = 1U << 0,
};
OPENLOCO_ENABLE_ENUM_OPERATORS(DockObjectFlags);

#pragma pack(push, 1)
struct DockObject
{
Expand All @@ -28,14 +36,15 @@ namespace OpenLoco
uint8_t var_07;
uint32_t image; // 0x08
uint32_t var_0C;
uint8_t pad_10[0x12 - 0x10];
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
DockObjectFlags flags; // 0x10
uint8_t numAux01; // 0x12
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;
Expand Down

0 comments on commit 5441482

Please sign in to comment.