diff options
-rw-r--r-- | queen/bankman.cpp | 39 | ||||
-rw-r--r-- | queen/bankman.h | 4 | ||||
-rw-r--r-- | queen/cutaway.cpp | 10 |
3 files changed, 33 insertions, 20 deletions
diff --git a/queen/bankman.cpp b/queen/bankman.cpp index 6627cb60bd..890d864b24 100644 --- a/queen/bankman.cpp +++ b/queen/bankman.cpp @@ -28,8 +28,7 @@ namespace Queen { BankManager::BankManager(Resource *res) : _res(res) { - memset(_frames, 0, sizeof(_frames)); - memset(_banks, 0, sizeof(_banks)); + flush(); } BankManager::~BankManager() { @@ -40,29 +39,38 @@ BankManager::~BankManager() { } void BankManager::load(const char *bankname, uint32 bankslot) { - close(bankslot); + debug(9, "BankManager::load(%s, %d)", bankname, bankslot); + assert(bankslot < MAX_BANKS_NUMBER); + if (!scumm_stricmp(bankname, _loadedBanks[bankslot])) { + debug(9, "BankManager::load() bank '%s' already loaded", bankname); + return; + } + + close(bankslot); _banks[bankslot].data = _res->loadFile(bankname); - int16 entries = (int16)READ_LE_UINT16(_banks[bankslot].data); - if (entries < 0 || entries >= MAX_BANK_SIZE) { - error("Maximum bank size exceeded or negative bank size : %d", entries); - } - debug(9, "BankManager::load(%s, %d) - entries = %d", bankname, bankslot, entries); + uint16 entries = READ_LE_UINT16(_banks[bankslot].data); + assert(entries < MAX_BANK_SIZE); + debug(9, "BankManager::load() entries = %d", entries); uint32 offset = 2; uint8 *p = _banks[bankslot].data; - for (int16 i = 1; i <= entries; ++i) { + for (uint16 i = 1; i <= entries; ++i) { _banks[bankslot].indexes[i] = offset; uint16 w = READ_LE_UINT16(p + offset + 0); uint16 h = READ_LE_UINT16(p + offset + 2); // jump to next entry, skipping data & header offset += w * h + 8; } + + // mark this bank as loaded + strcpy(_loadedBanks[bankslot], bankname); } void BankManager::unpack(uint32 srcframe, uint32 dstframe, uint32 bankslot) { debug(9, "BankManager::unpack(%d, %d, %d)", srcframe, dstframe, bankslot); + assert(bankslot < MAX_BANKS_NUMBER); assert(_banks[bankslot].data != NULL); BobFrame *pbf = &_frames[dstframe]; @@ -80,6 +88,7 @@ void BankManager::unpack(uint32 srcframe, uint32 dstframe, uint32 bankslot) { void BankManager::overpack(uint32 srcframe, uint32 dstframe, uint32 bankslot) { debug(9, "BankManager::overpack(%d, %d, %d)", srcframe, dstframe, bankslot); + assert(bankslot < MAX_BANKS_NUMBER); assert(_banks[bankslot].data != NULL); uint8 *p = _banks[bankslot].data + _banks[bankslot].indexes[srcframe]; @@ -97,8 +106,16 @@ void BankManager::overpack(uint32 srcframe, uint32 dstframe, uint32 bankslot) { void BankManager::close(uint32 bankslot) { debug(9, "BankManager::close(%d)", bankslot); + assert(bankslot < MAX_BANKS_NUMBER); delete[] _banks[bankslot].data; - memset(&_banks[bankslot], 0, sizeof(_banks[bankslot])); + memset(&_banks[bankslot], 0, sizeof(PackedBank)); + _loadedBanks[bankslot][0] = '\0'; +} + +void BankManager::flush() { + memset(_frames, 0, sizeof(_frames)); + memset(_banks, 0, sizeof(_banks)); + memset(_loadedBanks, 0, sizeof(_loadedBanks)); } BobFrame *BankManager::fetchFrame(uint32 index) { @@ -122,7 +139,7 @@ void BankManager::eraseFrames(bool joe) { if (!joe) { i = FRAMES_JOE + FRAMES_JOE_XTRA; } - while (i < 256) { + while (i < MAX_FRAMES_NUMBER) { eraseFrame(i); ++i; } diff --git a/queen/bankman.h b/queen/bankman.h index df8777d899..f02b59d85f 100644 --- a/queen/bankman.h +++ b/queen/bankman.h @@ -39,6 +39,7 @@ public: void unpack(uint32 srcframe, uint32 dstframe, uint32 bankslot); void overpack(uint32 srcframe, uint32 dstframe, uint32 bankslot); void close(uint32 bankslot); + void flush(); BobFrame *fetchFrame(uint32 index); void eraseFrame(uint32 index); @@ -63,6 +64,9 @@ private: //! banked bob frames PackedBank _banks[MAX_BANKS_NUMBER]; + //! loaded banks names + char _loadedBanks[MAX_BANKS_NUMBER][20]; + Resource *_res; }; diff --git a/queen/cutaway.cpp b/queen/cutaway.cpp index 10c8e328c9..4a85c6ca94 100644 --- a/queen/cutaway.cpp +++ b/queen/cutaway.cpp @@ -535,12 +535,7 @@ byte *Cutaway::getCutawayAnim(byte *ptr, int header, CutawayAnim &anim) { } else { if (anim.bank != 13) { - /* XXX if (OLDBANK != T) */ { - //debug(6, "Loading bank '%s'", _bankNames[anim.bank-1]); - _vm->bankMan()->load(_bankNames[anim.bank-1], CUTAWAY_BANK); - // XXX OLDBANK=T; - } - + _vm->bankMan()->load(_bankNames[anim.bank-1], CUTAWAY_BANK); anim.bank = 8; } else { @@ -1150,10 +1145,7 @@ void Cutaway::stop() { if (0 == bank) bank = 15; else if (bank != 13) { - // XXX if(bank != oldBank) { _vm->bankMan()->load(_bankNames[bank-1], CUTAWAY_BANK); - // XXX oldBank = bank; - // XXX } bank = 8; } |