Skip to content

Commit

Permalink
Implement dock object load
Browse files Browse the repository at this point in the history
  • Loading branch information
duncanspumpkin committed Feb 9, 2023
1 parent 783af60 commit eff6015
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 13 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 & (1 << 0)) ? 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);
}
}
15 changes: 8 additions & 7 deletions src/OpenLoco/src/Objects/DockObject.h
Expand Up @@ -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;
Expand Down

0 comments on commit eff6015

Please sign in to comment.