VOYEUR: Fixes for ControlResource initialisation

This commit is contained in:
Paul Gilbert 2013-12-08 18:23:40 -05:00
parent bad9219c27
commit 96b1fb8601
4 changed files with 27 additions and 8 deletions

View file

@ -236,7 +236,9 @@ BoltFile::BoltFile(const Common::String &filename, BoltFilesState &state): _stat
} }
BoltFile::~BoltFile() { BoltFile::~BoltFile() {
_state._curFd->close(); _file.close();
if (_state._curFd == &_file)
_state._curFd = NULL;
} }
bool BoltFile::getBoltGroup(uint32 id) { bool BoltFile::getBoltGroup(uint32 id) {
@ -1306,6 +1308,7 @@ VInitCyclResource::VInitCyclResource(BoltFilesState &state, const byte *src) {
/*------------------------------------------------------------------------*/ /*------------------------------------------------------------------------*/
ThreadResource::ThreadResource(BoltFilesState &state, const byte *src) { ThreadResource::ThreadResource(BoltFilesState &state, const byte *src) {
_flags = READ_LE_UINT16(&src[8]);
} }
/*------------------------------------------------------------------------*/ /*------------------------------------------------------------------------*/
@ -1330,10 +1333,8 @@ ControlResource::ControlResource(BoltFilesState &state, const byte *src) {
uint32 ptrId = READ_LE_UINT32(&src[0x32]); uint32 ptrId = READ_LE_UINT32(&src[0x32]);
_ptr = state._curLibPtr->getBoltEntryFromLong(ptrId)._data; _ptr = state._curLibPtr->getBoltEntryFromLong(ptrId)._data;
for (int i = 0; i < 8; ++i) { for (int i = 0; i < 8; ++i)
_memberIds[i] = READ_LE_UINT16(src + i * 2); _memberIds[i] = READ_LE_UINT16(src + i * 2);
_entries[i] = NULL;
}
// Load pointer list // Load pointer list
uint32 *idP = (uint32 *)&src[0x10]; uint32 *idP = (uint32 *)&src[0x10];
@ -1341,9 +1342,7 @@ ControlResource::ControlResource(BoltFilesState &state, const byte *src) {
for (int i = 0; i < count; ++i, ++idP) { for (int i = 0; i < count; ++i, ++idP) {
uint32 id = READ_LE_UINT32(idP); uint32 id = READ_LE_UINT32(idP);
BoltEntry &entry = state._curLibPtr->getBoltEntryFromLong(id); state._curLibPtr->resolveIt(id, &_entries[i]);
_entries[i] = entry._data;
} }
} }

View file

@ -417,6 +417,7 @@ public:
int _field0; int _field0;
int _controlIndex; int _controlIndex;
int _field4, _field6; int _field4, _field6;
int _flags;
int _field3A; int _field3A;
int _field3E; int _field3E;
byte *_ctlPtr; byte *_ctlPtr;

View file

@ -83,10 +83,12 @@ private:
void playStamp(); void playStamp();
void initStamp(); void initStamp();
void closeStamp();
void initUseCount(); void initUseCount();
void initThreadStruct(ThreadResource *thread, int v1, int idx); void initThreadStruct(ThreadResource *thread, int v1, int idx);
bool stm_loadAStack(ThreadResource *thread, int idx); bool stm_loadAStack(ThreadResource *thread, int idx);
void stm_unloadAStack(int idx); void stm_unloadAStack(int idx);
void stm_unloadAllStacks();
void stm_doState(ThreadResource *thread); void stm_doState(ThreadResource *thread);
protected: protected:
// Engine APIs // Engine APIs

View file

@ -59,6 +59,9 @@ void VoyeurEngine::playStamp() {
} }
_voy._field4386 = 0; _voy._field4386 = 0;
closeStamp();
_stampLibPtr->freeBoltGroup(0x10000);
delete _stampLibPtr;
} }
void VoyeurEngine::initStamp() { void VoyeurEngine::initStamp() {
@ -71,6 +74,10 @@ void VoyeurEngine::initStamp() {
initUseCount(); initUseCount();
} }
void VoyeurEngine::closeStamp() {
stm_unloadAllStacks();
}
void VoyeurEngine::initUseCount() { void VoyeurEngine::initUseCount() {
Common::fill(&_stm_useCount[0], &_stm_useCount[8], 0); Common::fill(&_stm_useCount[0], &_stm_useCount[8], 0);
} }
@ -102,6 +109,7 @@ bool VoyeurEngine::stm_loadAStack(ThreadResource *thread, int idx) {
} }
thread->_ctlPtr = _controlPtr->_entries[idx]; thread->_ctlPtr = _controlPtr->_entries[idx];
return true;
} }
void VoyeurEngine::stm_unloadAStack(int idx) { void VoyeurEngine::stm_unloadAStack(int idx) {
@ -112,8 +120,17 @@ void VoyeurEngine::stm_unloadAStack(int idx) {
} }
} }
void VoyeurEngine::stm_doState(ThreadResource *thread) { void VoyeurEngine::stm_unloadAllStacks() {
if (_stampFlags & 1) {
for (int i = 0; i < 8; ++i) {
if (_stm_useCount[i])
_stampLibPtr->freeBoltMember(_controlPtr->_memberIds[i]);
}
}
}
void VoyeurEngine::stm_doState(ThreadResource *thread) {
warning("TODO: stm_doState");
} }
} // End of namespace Voyeur } // End of namespace Voyeur