You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
106 lines
2.6 KiB
C++
106 lines
2.6 KiB
C++
|
4 years ago
|
/******************************************************************************
|
||
|
4 years ago
|
* File - asset_index.h
|
||
|
4 years ago
|
* Author - Joey Pollack
|
||
|
|
* Date - 2021/10/25 (y/m/d)
|
||
|
|
* Mod Date - 2021/10/25 (y/m/d)
|
||
|
|
* Description - Loads and stores the index.dat file. Allows querying
|
||
|
|
* the asset index by asset ID or name.
|
||
|
|
******************************************************************************/
|
||
|
|
|
||
|
4 years ago
|
#include "asset_index.h"
|
||
|
|
#include <utils/binary_file_buffer.h>
|
||
|
4 years ago
|
|
||
|
|
namespace lunarium
|
||
|
|
{
|
||
|
|
AssetIndex* AssetIndex::mpInstance = nullptr;
|
||
|
|
|
||
|
|
AssetIndex::AssetIndex()
|
||
|
|
{
|
||
|
|
}
|
||
|
|
|
||
|
|
AssetIndex& AssetIndex::GetInstance()
|
||
|
|
{
|
||
|
|
if (!mpInstance)
|
||
|
|
{
|
||
|
|
mpInstance = new AssetIndex;
|
||
|
|
}
|
||
|
|
|
||
|
|
return *mpInstance;
|
||
|
|
}
|
||
|
|
|
||
|
|
void AssetIndex::FreeInstance()
|
||
|
|
{
|
||
|
|
for (auto iter = mpInstance->mAssets.begin(); iter != mpInstance->mAssets.end(); iter++)
|
||
|
|
{
|
||
|
|
delete iter->second;
|
||
|
|
}
|
||
|
|
|
||
|
|
mpInstance->mAssets.clear();
|
||
|
|
mpInstance->mAssetsByName.clear();
|
||
|
|
|
||
|
|
delete mpInstance;
|
||
|
|
mpInstance = nullptr;
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
OpRes AssetIndex::LoadIndex(const char* filename)
|
||
|
|
{
|
||
|
|
BinaryFileBuffer buffer;
|
||
|
|
if (!buffer.LoadFile(filename))
|
||
|
|
{
|
||
|
|
return OpRes::Fail("AssetIndex::LoadIndex - unable to load file: %s", filename);
|
||
|
|
}
|
||
|
|
|
||
|
|
int32_t num_assets = 0;
|
||
|
|
buffer.Read((char*) &num_assets, 4);
|
||
|
|
|
||
|
|
char str_buf[512];
|
||
|
|
|
||
|
|
for (int i = 0; i < num_assets; i++)
|
||
|
|
{
|
||
|
|
AssetInfo* pAI = new AssetInfo;
|
||
|
|
buffer.Read((char*) &pAI->ID, 4);
|
||
|
|
|
||
|
|
int16_t name_size = 0;
|
||
|
|
buffer.Read((char*) &name_size, 2);
|
||
|
|
buffer.Read(str_buf, name_size);
|
||
|
|
pAI->Name = str_buf;
|
||
|
|
|
||
|
|
buffer.Read((char*) &pAI->Type, 2);
|
||
|
|
buffer.Read((char*) &name_size, 2);
|
||
|
|
buffer.Read(str_buf, name_size);
|
||
|
|
pAI->File = str_buf;
|
||
|
|
|
||
|
|
buffer.Read((char*) &pAI->Offset, 4);
|
||
|
|
|
||
|
|
mAssets[pAI->ID] = pAI;
|
||
|
|
mAssetsByName[pAI->Name] = pAI;
|
||
|
|
}
|
||
|
|
|
||
|
|
buffer.Unload();
|
||
|
|
|
||
|
|
return OpRes::OK();
|
||
|
|
}
|
||
|
|
|
||
|
|
const AssetIndex::AssetInfo* AssetIndex::GetAssetInfo(int id) const
|
||
|
|
{
|
||
|
|
auto res = mAssets.find(id);
|
||
|
|
if (res != mAssets.end())
|
||
|
|
{
|
||
|
|
return res->second;
|
||
|
|
}
|
||
|
|
|
||
|
|
return nullptr;
|
||
|
|
}
|
||
|
|
|
||
|
|
const AssetIndex::AssetInfo* AssetIndex::GetAssetInfo(const char* name) const
|
||
|
|
{
|
||
|
|
auto res = mAssetsByName.find(name);
|
||
|
|
if (res != mAssetsByName.end())
|
||
|
|
{
|
||
|
|
return res->second;
|
||
|
|
}
|
||
|
|
|
||
|
|
return nullptr;
|
||
|
|
}
|
||
|
|
}
|