Working up to start of menu loading

This commit is contained in:
elasota
2019-12-12 23:37:40 -05:00
parent f7335a2c8b
commit c9c6976344
35 changed files with 1316 additions and 398 deletions

View File

@@ -34,7 +34,16 @@ namespace PortabilityLayer
static ResourceManagerImpl *GetInstance();
private:
std::vector<ResourceFile*> m_resFiles;
struct ResFileSlot
{
short m_prevFile;
short m_nextFile;
ResourceFile* m_resourceFile;
};
std::vector<ResFileSlot> m_resFiles;
short m_firstResFile;
short m_lastResFile;
short m_currentResFile;
bool m_load;
@@ -42,7 +51,9 @@ namespace PortabilityLayer
};
ResourceManagerImpl::ResourceManagerImpl()
: m_currentResFile(0)
: m_currentResFile(-1)
, m_firstResFile(-1)
, m_lastResFile(-1)
, m_load(true)
{
}
@@ -54,8 +65,8 @@ namespace PortabilityLayer
void ResourceManagerImpl::Shutdown()
{
for (std::vector<ResourceFile*>::iterator it = m_resFiles.begin(), itEnd = m_resFiles.end(); it != itEnd; ++it)
delete (*it);
for (std::vector<ResFileSlot>::iterator it = m_resFiles.begin(), itEnd = m_resFiles.end(); it != itEnd; ++it)
delete it->m_resourceFile;
m_resFiles.clear();
}
@@ -87,7 +98,7 @@ namespace PortabilityLayer
for (size_t i = 0; i < numSlots; i++)
{
if (m_resFiles[i] == nullptr)
if (m_resFiles[i].m_resourceFile == nullptr)
{
resFileIndex = i;
break;
@@ -95,11 +106,11 @@ namespace PortabilityLayer
}
if (resFileIndex == 0x7fff)
return 0;
return -1;
IOStream *fStream = nullptr;
if (FileManager::GetInstance()->RawOpenFileRF(virtualDir, filename, EFilePermission_Read, true, &fStream) != noErr)
return 0;
return -1;
ResourceFile *resFile = new ResourceFile();
bool loaded = resFile->Load(fStream);
@@ -108,27 +119,48 @@ namespace PortabilityLayer
if (!loaded)
{
delete resFile;
return 0;
return -1;
}
if (resFileIndex == numSlots)
m_resFiles.push_back(resFile);
else
m_resFiles[resFileIndex] = resFile;
ResFileSlot slot;
slot.m_resourceFile = resFile;
slot.m_prevFile = m_lastResFile;
slot.m_nextFile = -1;
return static_cast<short>(resFileIndex + 1);
if (resFileIndex == numSlots)
m_resFiles.push_back(slot);
else
m_resFiles[resFileIndex] = slot;
const short rfid = static_cast<short>(resFileIndex);
if (m_firstResFile < 0)
m_firstResFile = rfid;
if (m_lastResFile >= 0)
m_resFiles[m_lastResFile].m_nextFile = rfid;
m_lastResFile = rfid;
m_currentResFile = rfid; // Resource Manager is supposed to reset the search stack on new file open
return rfid;
}
MMHandleBlock *ResourceManagerImpl::GetResource(const ResTypeID &resType, int id)
{
if (!m_currentResFile)
return nullptr;
short searchIndex = m_currentResFile;
while (searchIndex >= 0)
{
const ResFileSlot& slot = m_resFiles[searchIndex];
assert(slot.m_resourceFile);
ResourceFile *resFile = m_resFiles[m_currentResFile - 1];
if (!resFile)
return nullptr;
if (MMHandleBlock *block = slot.m_resourceFile->GetResource(resType, id, m_load))
return block;
return resFile->GetResource(resType, id, m_load);
searchIndex = slot.m_prevFile;
}
return nullptr;
}