mirror of
https://github.com/elasota/Aerofoil.git
synced 2025-12-14 12:09:36 +00:00
Working up to start of menu loading
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user