metaforce/Runtime/CScannableObjectInfo.cpp

73 lines
2.2 KiB
C++
Raw Permalink Normal View History

#include "Runtime/CScannableObjectInfo.hpp"
#include "Runtime/GameGlobalObjects.hpp"
2016-08-03 16:20:31 -07:00
2021-04-10 01:42:06 -07:00
namespace metaforce {
2018-12-07 21:30:43 -08:00
CScannableObjectInfo::CScannableObjectInfo(CInputStream& in, CAssetId resId) : x0_scannableObjectId(resId) {
const u32 version = in.ReadLong();
2018-12-07 21:30:43 -08:00
Load(in, version);
for (auto& bucket : x14_buckets) {
bucket.x4_appearanceRange *= x8_totalDownloadTime;
2018-12-07 21:30:43 -08:00
}
2018-11-24 00:09:35 -08:00
const float appearanceOffset = g_tweakGui->GetScanAppearanceDuration();
for (size_t i = 0; i < x14_buckets.size(); ++i) {
if (x14_buckets[i].x8_imagePos == UINT32_MAX) {
continue;
}
x8_totalDownloadTime += appearanceOffset;
for (size_t j = i; j < x14_buckets.size(); j++) {
x14_buckets[j].x4_appearanceRange += appearanceOffset;
}
2018-12-07 21:30:43 -08:00
}
for (size_t i = 0; i < x14_buckets.size() - 1; ++i) {
for (size_t j = i + 1; j < x14_buckets.size(); ++j) {
if (x14_buckets[i].x8_imagePos == x14_buckets[j].x8_imagePos && x14_buckets[i].x8_imagePos != UINT32_MAX) {
x14_buckets[j].x8_imagePos = UINT32_MAX;
}
}
2018-12-07 21:30:43 -08:00
}
2016-08-03 16:20:31 -07:00
}
2018-12-07 21:30:43 -08:00
void CScannableObjectInfo::Load(CInputStream& in, u32 version) {
in.ReadLong();
in.ReadLong();
x4_stringId = in.Get<CAssetId>();
if (version < 4) {
x8_totalDownloadTime = in.ReadFloat();
} else {
const u32 scanSpeed = in.ReadLong();
2018-12-07 21:30:43 -08:00
x8_totalDownloadTime = g_tweakGui->GetScanSpeed(scanSpeed);
}
xc_category = in.ReadLong();
if (version > 4) {
x10_important = in.ReadBool();
}
2016-08-03 16:20:31 -07:00
for (size_t i = 0; i < x14_buckets.capacity(); i++) {
2018-12-07 21:30:43 -08:00
x14_buckets.emplace_back(in, version);
}
2016-08-03 16:20:31 -07:00
}
2018-12-07 21:30:43 -08:00
CScannableObjectInfo::SBucket::SBucket(CInputStream& in, u32 version) {
x0_texture = in.Get<CAssetId>();
x4_appearanceRange = in.ReadFloat();
x8_imagePos = in.ReadLong();
2018-12-07 21:30:43 -08:00
if (version > 1) {
xc_size.x = in.ReadLong();
xc_size.y = in.ReadLong();
x14_interval = in.ReadFloat();
2018-12-07 21:30:43 -08:00
if (version >= 3)
x18_fadeDuration = in.ReadFloat();
2018-12-07 21:30:43 -08:00
}
2016-08-03 16:20:31 -07:00
}
2017-01-31 03:21:45 -08:00
CFactoryFnReturn FScannableObjectInfoFactory(const SObjectTag& tag, CInputStream& in, const CVParamTransfer&,
CObjectReference*) {
2018-12-07 21:30:43 -08:00
return TToken<CScannableObjectInfo>::GetIObjObjectFor(std::make_unique<CScannableObjectInfo>(in, tag.id));
2016-08-03 16:20:31 -07:00
}
2021-04-10 01:42:06 -07:00
} // namespace metaforce