diff options
author | Gregory Montoir | 2004-01-05 13:40:28 +0000 |
---|---|---|
committer | Gregory Montoir | 2004-01-05 13:40:28 +0000 |
commit | 232a709fd4bf22a0daff99b97eb5e4cc854e44f3 (patch) | |
tree | e290c0fe21e2576a45344c98275d902149232229 /queen | |
parent | fbc4168a8e4f4ccd400f435fa4307472decfac33 (diff) | |
download | scummvm-rg350-232a709fd4bf22a0daff99b97eb5e4cc854e44f3.tar.gz scummvm-rg350-232a709fd4bf22a0daff99b97eb5e4cc854e44f3.tar.bz2 scummvm-rg350-232a709fd4bf22a0daff99b97eb5e4cc854e44f3.zip |
added a class to manage banks, Queen::Graphics cleanup
svn-id: r12157
Diffstat (limited to 'queen')
-rw-r--r-- | queen/cutaway.cpp | 14 | ||||
-rw-r--r-- | queen/graphics.cpp | 150 | ||||
-rw-r--r-- | queen/graphics.h | 63 | ||||
-rw-r--r-- | queen/journal.cpp | 10 | ||||
-rw-r--r-- | queen/logic.cpp | 80 | ||||
-rw-r--r-- | queen/queen.cpp | 4 | ||||
-rw-r--r-- | queen/queen.h | 3 | ||||
-rw-r--r-- | queen/talk.cpp | 34 | ||||
-rw-r--r-- | queen/walk.cpp | 6 | ||||
-rw-r--r-- | queen/xref.txt | 12 |
10 files changed, 207 insertions, 169 deletions
diff --git a/queen/cutaway.cpp b/queen/cutaway.cpp index b9e56facb1..0c80fdcbc9 100644 --- a/queen/cutaway.cpp +++ b/queen/cutaway.cpp @@ -137,7 +137,7 @@ void Cutaway::load(const char *filename) { if (_bankNames[0][0]) { debug(6, "Loading bank '%s'", _bankNames[0]); - _vm->graphics()->bankLoad(_bankNames[0], CUTAWAY_BANK); + _vm->bankMan()->load(_bankNames[0], CUTAWAY_BANK); } char entryString[MAX_STRING_SIZE]; @@ -536,7 +536,7 @@ byte *Cutaway::getCutawayAnim(byte *ptr, int header, CutawayAnim &anim) { if (anim.bank != 13) { /* XXX if (OLDBANK != T) */ { //debug(6, "Loading bank '%s'", _bankNames[anim.bank-1]); - _vm->graphics()->bankLoad(_bankNames[anim.bank-1], CUTAWAY_BANK); + _vm->bankMan()->load(_bankNames[anim.bank-1], CUTAWAY_BANK); // XXX OLDBANK=T; } @@ -701,7 +701,7 @@ byte *Cutaway::handleAnimation(byte *ptr, CutawayObject &object) { objAnim[i].unpackFrame, objAnim[i].originalFrame, objAnim[i].bank);*/ - _vm->graphics()->bankUnpack( + _vm->bankMan()->unpack( objAnim[i].unpackFrame, objAnim[i].originalFrame, objAnim[i].bank); @@ -968,7 +968,7 @@ void Cutaway::run(char *nextFilename) { updateGameState(); - _vm->graphics()->bankErase(CUTAWAY_BANK); + _vm->bankMan()->close(CUTAWAY_BANK); talk(nextFilename); @@ -1156,7 +1156,7 @@ void Cutaway::stop() { bank = 15; else if (bank != 13) { // XXX if(bank != oldBank) { - _vm->graphics()->bankLoad(_bankNames[bank-1], CUTAWAY_BANK); + _vm->bankMan()->load(_bankNames[bank-1], CUTAWAY_BANK); // XXX oldBank = bank; // XXX } bank = 8; @@ -1168,7 +1168,7 @@ void Cutaway::stop() { _vm->graphics()->bobClear(bobIndex); } else if (objectFrame) { - _vm->graphics()->bankUnpack(ABS(frame), objectFrame, bank); + _vm->bankMan()->unpack(ABS(frame), objectFrame, bank); pbs->frameNum = objectFrame; if (frame < 0) pbs->xflip = true; @@ -1327,7 +1327,7 @@ int Cutaway::makeComplexAnimation(int16 currentImage, Cutaway::CutawayAnim *objA if (frameIndex[i]) { currentImage++; //debug(6, "bankUnpack(%i, %i, %i)", i, currentImage, objAnim[0].bank); - _vm->graphics()->bankUnpack(i, currentImage, objAnim[0].bank); + _vm->bankMan()->unpack(i, currentImage, objAnim[0].bank); } } diff --git a/queen/graphics.cpp b/queen/graphics.cpp index 3e82ecf756..adc5444f0c 100644 --- a/queen/graphics.cpp +++ b/queen/graphics.cpp @@ -180,45 +180,40 @@ void BobSlot::clear() { } -Graphics::Graphics(QueenEngine *vm) - : _cameraBob(0), _vm(vm) { + +BankManager::BankManager(Resource *res) + : _res(res) { memset(_frames, 0, sizeof(_frames)); memset(_banks, 0, sizeof(_banks)); - memset(_bobs, 0, sizeof(_bobs)); - memset(_sortedBobs, 0, sizeof(_sortedBobs)); - _sortedBobsCount = 0; - _shrinkBuffer.data = new uint8[ BOB_SHRINK_BUF_SIZE ]; } -Graphics::~Graphics() { - uint32 i; - for(i = 0; i < ARRAYSIZE(_banks); ++i) { - delete[] _banks[i].data; +BankManager::~BankManager() { + for(uint32 i = 0; i < MAX_BANKS_NUMBER; ++i) { + close(i); } - frameEraseAll(true); - delete[] _shrinkBuffer.data; + eraseAllFrames(true); } -void Graphics::bankLoad(const char *bankname, uint32 bankslot) { - bankErase(bankslot); - _banks[bankslot].data = _vm->resource()->loadFile(bankname); +void BankManager::load(const char *bankname, uint32 bankslot) { + close(bankslot); + + _banks[bankslot].data = _res->loadFile(bankname); if (!_banks[bankslot].data) { - error("Unable to open bank '%s'", bankname); + error("Unable to open bank '%s'", 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); + error("Maximum bank size exceeded or negative bank size : %d", entries); } - - debug(9, "Graphics::bankLoad(%s, %d) - entries = %d", bankname, bankslot, entries); + + debug(9, "BankManager::load(%s, %d) - entries = %d", bankname, bankslot, entries); uint32 offset = 2; uint8 *p = _banks[bankslot].data; - int16 i; - for (i = 1; i <= entries; ++i) { + for (int16 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); @@ -228,13 +223,13 @@ void Graphics::bankLoad(const char *bankname, uint32 bankslot) { } -void Graphics::bankUnpack(uint32 srcframe, uint32 dstframe, uint32 bankslot) { - debug(9, "Graphics::bankUnpack(%d, %d, %d)", srcframe, dstframe, bankslot); +void BankManager::unpack(uint32 srcframe, uint32 dstframe, uint32 bankslot) { + debug(9, "BankManager::unpack(%d, %d, %d)", srcframe, dstframe, bankslot); uint8 *p = _banks[bankslot].data + _banks[bankslot].indexes[srcframe]; if (!_banks[bankslot].data) - error("Graphics::bankUnpack(%i, %i, %i) called but _banks[bankslot].data is NULL!", + error("BankManager::bankUnpack(%i, %i, %i) called but _banks[bankslot].data is NULL!", srcframe, dstframe, bankslot); BobFrame *pbf = &_frames[dstframe]; @@ -248,12 +243,11 @@ void Graphics::bankUnpack(uint32 srcframe, uint32 dstframe, uint32 bankslot) { uint32 size = pbf->width * pbf->height; pbf->data = new uint8[ size ]; memcpy(pbf->data, p + 8, size); - } -void Graphics::bankOverpack(uint32 srcframe, uint32 dstframe, uint32 bankslot) { - debug(9, "Graphics::bankOverpack(%d, %d, %d)", srcframe, dstframe, bankslot); +void BankManager::overpack(uint32 srcframe, uint32 dstframe, uint32 bankslot) { + debug(9, "BankManager::overpack(%d, %d, %d)", srcframe, dstframe, bankslot); uint8 *p = _banks[bankslot].data + _banks[bankslot].indexes[srcframe]; uint16 src_w = READ_LE_UINT16(p + 0); @@ -261,7 +255,7 @@ void Graphics::bankOverpack(uint32 srcframe, uint32 dstframe, uint32 bankslot) { // unpack if destination frame is smaller than source one if (_frames[dstframe].width < src_w || _frames[dstframe].height < src_h) { - bankUnpack(srcframe, dstframe, bankslot); + unpack(srcframe, dstframe, bankslot); } else { // copy data 'over' destination frame (without changing frame header) memcpy(_frames[dstframe].data, p + 8, src_w * src_h); @@ -269,31 +263,75 @@ void Graphics::bankOverpack(uint32 srcframe, uint32 dstframe, uint32 bankslot) { } -void Graphics::bankErase(uint32 bankslot) { - debug(9, "Graphics::bankErase(%d)", bankslot); +void BankManager::close(uint32 bankslot) { + debug(9, "BankManager::close(%d)", bankslot); delete[] _banks[bankslot].data; _banks[bankslot].data = 0; } +BobFrame *BankManager::fetchFrame(uint32 index) { + debug(9, "BankManager::fetchFrame(%d)", index); + if (index >= MAX_FRAMES_NUMBER) { + error("BankManager::fetchFrame() invalid frame index = %d", index); + } + return &_frames[index]; +} + + +void BankManager::eraseFrame(uint32 index) { + BobFrame *pbf = &_frames[index]; + pbf->width = 0; + pbf->height = 0; + delete[] pbf->data; + pbf->data = 0; +} + + +void BankManager::eraseAllFrames(bool joe) { + uint32 i = 0; + if (!joe) { + i = FRAMES_JOE + FRAMES_JOE_XTRA; + } + while (i < 256) { + eraseFrame(i); + ++i; + } +} + + + +Graphics::Graphics(QueenEngine *vm) + : _cameraBob(0), _vm(vm) { + memset(_bobs, 0, sizeof(_bobs)); + memset(_sortedBobs, 0, sizeof(_sortedBobs)); + _sortedBobsCount = 0; + _shrinkBuffer.data = new uint8[ BOB_SHRINK_BUF_SIZE ]; +} + + +Graphics::~Graphics() { + delete[] _shrinkBuffer.data; +} + + void Graphics::bobSetupControl() { - bankLoad("control.BBK",17); - bankUnpack(1, 1, 17); // Mouse pointer - bankUnpack(3, 3, 17); // Up arrow dialogue - bankUnpack(4, 4, 17); // Down arrow dialogue - bankErase(17); + _vm->bankMan()->load("control.BBK",17); + _vm->bankMan()->unpack(1, 1, 17); // Mouse pointer + _vm->bankMan()->unpack(3, 3, 17); // Up arrow dialogue + _vm->bankMan()->unpack(4, 4, 17); // Down arrow dialogue + _vm->bankMan()->close(17); - BobFrame *bf = &_frames[1]; + BobFrame *bf = _vm->bankMan()->fetchFrame(1); _vm->display()->setMouseCursor(bf->data, bf->width, bf->height, bf->xhotspot, bf->yhotspot); } void Graphics::bobDraw(const BobSlot *bs, int16 x, int16 y) { - uint16 w, h; - debug(9, "Graphics::bobDraw(%d, %d, %d)", bs->frameNum, x, y); - BobFrame *pbf = &_frames[bs->frameNum]; + uint16 w, h; + BobFrame *pbf = _vm->bankMan()->fetchFrame(bs->frameNum); if (bs->scale < 100) { bobShrink(pbf, bs->scale); pbf = &_shrinkBuffer; @@ -304,7 +342,6 @@ void Graphics::bobDraw(const BobSlot *bs, int16 x, int16 y) { const Box *box = &bs->box; if(w != 0 && h != 0 && box->intersects(x, y, w, h)) { - uint8 *src = pbf->data; uint16 x_skip = 0; uint16 y_skip = 0; @@ -346,7 +383,7 @@ void Graphics::bobDraw(const BobSlot *bs, int16 x, int16 y) { void Graphics::bobDrawInventoryItem(uint32 frameNum, uint16 x, uint16 y) { if (frameNum != 0) { - BobFrame *bf = frame(frameNum); + BobFrame *bf = _vm->bankMan()->fetchFrame(frameNum); _vm->display()->drawInventoryItem(bf->data, x, y, bf->width, bf->height); } else { _vm->display()->drawInventoryItem(NULL, x, y, 32, 32); @@ -356,10 +393,10 @@ void Graphics::bobDrawInventoryItem(uint32 frameNum, uint16 x, uint16 y) { void Graphics::bobPaste(uint16 objNum, uint16 image) { GraphicData *pgd = _vm->logic()->graphicData(objNum); - _vm->graphics()->bankUnpack(pgd->firstFrame, image, 15); - BobFrame *bf = frame(image); + _vm->bankMan()->unpack(pgd->firstFrame, image, 15); + BobFrame *bf = _vm->bankMan()->fetchFrame(image); _vm->display()->drawBobPasteDown(bf->data, pgd->x, pgd->y, bf->width, bf->height); - frameErase(image); + _vm->bankMan()->eraseFrame(image); } @@ -466,7 +503,7 @@ void Graphics::bobDrawAll() { BobSlot *pbs = _sortedBobs[i]; if (pbs->active) { - BobFrame *pbf = &_frames[ pbs->frameNum ]; + BobFrame *pbf = _vm->bankMan()->fetchFrame(pbs->frameNum); uint16 xh, yh, x, y; xh = pbf->xhotspot; @@ -633,27 +670,6 @@ uint16 Graphics::textWidth(const char* text) const { } -void Graphics::frameErase(uint32 fslot) { - BobFrame *pbf = &_frames[fslot]; - pbf->width = 0; - pbf->height = 0; - delete[] pbf->data; - pbf->data = 0; -} - - -void Graphics::frameEraseAll(bool joe) { - int i = 0; - if (!joe) { - i = FRAMES_JOE + FRAMES_JOE_XTRA; - } - while (i < 256) { - frameErase(i); - ++i; - } -} - - void Graphics::loadBackdrop(const char* name, uint16 room) { char roomPrefix[20]; strcpy(roomPrefix, name); @@ -869,7 +885,7 @@ void Graphics::bobSetText( x = pbs->x; y = pbs->y; - BobFrame *pbf = frame(pbs->frameNum); + BobFrame *pbf = _vm->bankMan()->fetchFrame(pbs->frameNum); width = (pbf->width * pbs->scale) / 100; height = (pbf->height * pbs->scale) / 100; diff --git a/queen/graphics.h b/queen/graphics.h index 87b8f6f151..f056bf20a8 100644 --- a/queen/graphics.h +++ b/queen/graphics.h @@ -101,6 +101,46 @@ struct TextSlot { bool outlined; }; +class Resource; + +class BankManager { +public: + + BankManager(Resource *res); + ~BankManager(); + + void load(const char *bankname, uint32 bankslot); + void unpack(uint32 srcframe, uint32 dstframe, uint32 bankslot); + void overpack(uint32 srcframe, uint32 dstframe, uint32 bankslot); + void close(uint32 bankslot); + + BobFrame *fetchFrame(uint32 index); + void eraseFrame(uint32 index); + void eraseAllFrames(bool joe); + + enum { + MAX_BANK_SIZE = 110, + MAX_FRAMES_NUMBER = 256, + MAX_BANKS_NUMBER = 18 + }; + + +private: + + struct PackedBank { + uint32 indexes[MAX_BANK_SIZE]; + uint8 *data; + }; + + //! unbanked bob frames + BobFrame _frames[MAX_FRAMES_NUMBER]; + + //! banked bob frames + PackedBank _banks[MAX_BANKS_NUMBER]; + + Resource *_res; +}; + class QueenEngine; @@ -110,11 +150,6 @@ public: Graphics(QueenEngine *vm); ~Graphics(); - void bankLoad(const char *bankname, uint32 bankslot); // loadbank() - void bankUnpack(uint32 srcframe, uint32 dstframe, uint32 bankslot); // unpackbank() - void bankOverpack(uint32 srcframe, uint32 dstframe, uint32 bankslot); // overpackbank() - void bankErase(uint32 bankslot); // erase() - void bobSetupControl(); void bobDraw(const BobSlot *bs, int16 x, int16 y); void bobDrawInventoryItem(uint32 frameNum, uint16 x, uint16 y); @@ -144,10 +179,6 @@ public: int textCenterX(const char *text) const; // MIDDLE() void textColor(uint16 y, uint8 color) { _texts[y].color = color; } - void frameErase(uint32 fslot); - void frameEraseAll(bool joe); // freeframes, freeallframes - BobFrame *frame(int index) { return _frames + index; } - void loadBackdrop(const char *name, uint16 room); void loadPanel(); @@ -157,9 +188,6 @@ public: void update(uint16 room); enum { - MAX_BANK_SIZE = 110, - MAX_FRAMES_NUMBER = 256, - MAX_BANKS_NUMBER = 18, MAX_BOBS_NUMBER = 64, MAX_STRING_LENGTH = 255, MAX_STRING_SIZE = (MAX_STRING_LENGTH + 1), @@ -169,17 +197,6 @@ public: private: - struct PackedBank { - uint32 indexes[MAX_BANK_SIZE]; - uint8 *data; - }; - - //! unbanked bob frames - BobFrame _frames[MAX_FRAMES_NUMBER]; - - //! banked bob frames - PackedBank _banks[MAX_BANKS_NUMBER]; - BobSlot _bobs[MAX_BOBS_NUMBER]; //! bobs to display diff --git a/queen/journal.cpp b/queen/journal.cpp index ff1a16ba18..d0ad8c96fe 100644 --- a/queen/journal.cpp +++ b/queen/journal.cpp @@ -102,7 +102,7 @@ void Journal::prepare() { _vm->graphics()->cameraBob(-1); _vm->graphics()->bobClearAll(); _vm->graphics()->textClear(0, GAME_SCREEN_HEIGHT - 1); - _vm->graphics()->frameEraseAll(false); + _vm->bankMan()->eraseAllFrames(false); _vm->graphics()->textCurrentColor(INK_JOURNAL); int i; @@ -123,18 +123,18 @@ void Journal::prepare() { _vm->logic()->zoneSet(ZONE_ROOM, ZN_TEXT_TOGGLE, 125 - 16, 168, 135, 177); _vm->graphics()->loadBackdrop("journal.PCX", JOURNAL_ROOM); - _vm->graphics()->bankLoad("journal.BBK", JOURNAL_BANK); + _vm->bankMan()->load("journal.BBK", JOURNAL_BANK); for (i = 1; i <= 20; ++i) { int frameNum = JOURNAL_FRAMES + i; - _vm->graphics()->bankUnpack(i, frameNum, JOURNAL_BANK); - BobFrame *bf = _vm->graphics()->frame(frameNum); + _vm->bankMan()->unpack(i, frameNum, JOURNAL_BANK); + BobFrame *bf = _vm->bankMan()->fetchFrame(frameNum); bf->xhotspot = 0; bf->yhotspot = 0; if (i == FRAME_INFO_BOX) { // adjust info box hot spot to put it on top always bf->yhotspot = 200; } } - _vm->graphics()->bankErase(JOURNAL_BANK); + _vm->bankMan()->close(JOURNAL_BANK); } diff --git a/queen/logic.cpp b/queen/logic.cpp index 8ff4e4f0b0..26f0b9b913 100644 --- a/queen/logic.cpp +++ b/queen/logic.cpp @@ -611,11 +611,11 @@ void Logic::zoneSetupPanel() { void Logic::roomErase() { - _vm->graphics()->frameEraseAll(false); - _vm->graphics()->bankErase(15); - _vm->graphics()->bankErase(11); - _vm->graphics()->bankErase(10); - _vm->graphics()->bankErase(12); + _vm->bankMan()->eraseAllFrames(false); + _vm->bankMan()->close(15); + _vm->bankMan()->close(11); + _vm->bankMan()->close(10); + _vm->bankMan()->close(12); if (_currentRoom >= 114) { _vm->display()->palFadeOut(0, 255, _currentRoom); @@ -689,7 +689,7 @@ void Logic::roomSetupFurniture() { if (pgd->lastFrame == 0) { ++_numFurnitureStatic; ++curImage; - _vm->graphics()->bankUnpack(pgd->firstFrame, curImage, 15); + _vm->bankMan()->unpack(pgd->firstFrame, curImage, 15); ++_numFrames; BobSlot *pbs = _vm->graphics()->bob(19 + _numFurnitureStatic); pbs->curPos(pgd->x, pgd->y); @@ -719,7 +719,7 @@ void Logic::roomSetupFurniture() { int k; for (k = pgd->firstFrame; k <= lastFrame; ++k) { ++curImage; - _vm->graphics()->bankUnpack(k, curImage, 15); + _vm->bankMan()->unpack(k, curImage, 15); ++_numFrames; } BobSlot *pbs = _vm->graphics()->bob(5 + curBob); @@ -792,7 +792,7 @@ void Logic::roomSetupObjects() { uint16 firstFrame = curImage + 1; for (j = pgd->firstFrame; j <= lastFrame; ++j) { ++curImage; - _vm->graphics()->bankUnpack(j, curImage, 15); + _vm->bankMan()->unpack(j, curImage, 15); ++_numFrames; } curBob = 5 + _numFurnitureAnimated + numObjectAnimated; @@ -813,7 +813,7 @@ void Logic::roomSetupObjects() { // FIXME: if((COMPANEL==2) && (FULLSCREEN==1)) bobs[CURRBOB].y2=199; - _vm->graphics()->bankUnpack(pgd->firstFrame, curImage, 15); + _vm->bankMan()->unpack(pgd->firstFrame, curImage, 15); ++_numFrames; if (pod->name > 0) { BobSlot *pbs = _vm->graphics()->bob(curBob); @@ -926,14 +926,14 @@ uint16 Logic::roomRefreshObject(uint16 obj) { curImage += pgd->lastFrame - 1; } else if (lastFrame != 0) { // turn on an animated bob - _vm->graphics()->bankUnpack(pgd->firstFrame, 2, 15); + _vm->bankMan()->unpack(pgd->firstFrame, 2, 15); pbs->animating = false; uint16 firstImage = curImage; --curImage; uint16 j; for (j = pgd->firstFrame; j <= lastFrame; ++j) { ++curImage; - _vm->graphics()->bankUnpack(j, curImage, 15); + _vm->bankMan()->unpack(j, curImage, 15); } pbs->curPos(pgd->x, pgd->y); pbs->frameNum = firstImage; @@ -942,8 +942,8 @@ uint16 Logic::roomRefreshObject(uint16 obj) { } } else { // frame 2 is used as a buffer frame to prevent BOB flickering - _vm->graphics()->bankUnpack(pgd->firstFrame, 2, 15); - _vm->graphics()->bankUnpack(pgd->firstFrame, curImage, 15); + _vm->bankMan()->unpack(pgd->firstFrame, 2, 15); + _vm->bankMan()->unpack(pgd->firstFrame, curImage, 15); pbs->curPos(pgd->x, pgd->y); pbs->frameNum = curImage; } @@ -969,7 +969,7 @@ void Logic::roomSetup(const char *room, int comPanel, bool inCutaway) { // load/setup objects associated to this room sprintf(filename, "%s.BBK", room); - _vm->graphics()->bankLoad(filename, 15); + _vm->bankMan()->load(filename, 15); zoneSetup(); _numFrames = 37 + FRAMES_JOE_XTRA; @@ -1069,7 +1069,7 @@ void Logic::personSetData(int16 noun, const char *actorName, bool loadBank, Pers if (loadBank) { const char *actorFile = _aFile[pp->actor->actorFile]; if (actorFile) { - _vm->graphics()->bankLoad(actorFile, pp->actor->bankNum); + _vm->bankMan()->load(actorFile, pp->actor->bankNum); } // if actorFile is null, the person data is already loaded as // it is contained in objects room bank (.bbk) @@ -1097,7 +1097,7 @@ uint16 Logic::personSetup(uint16 noun, uint16 curImage) { scale = currentRoomArea(a)->calcScale(pad->y); } - _vm->graphics()->bankUnpack(pad->bobFrameStanding, p.bobFrame, p.actor->bankNum); + _vm->bankMan()->unpack(pad->bobFrameStanding, p.bobFrame, p.actor->bankNum); bool xflip = false; uint16 person = currentRoomData() + noun; if (_objectData[person].image == -3) { @@ -1219,7 +1219,7 @@ uint16 Logic::animCreate(uint16 curImage, const Person *person) { for (i = 1; i <= 255; ++i) { if (allocatedFrames[i] != 0) { ++curImage; - _vm->graphics()->bankUnpack(i, curImage, person->actor->bankNum); + _vm->bankMan()->unpack(i, curImage, person->actor->bankNum); } } @@ -1286,7 +1286,7 @@ void Logic::animSetup(const GraphicData *gd, uint16 firstImage, uint16 bobNum, b // queen.c l.962-980 / l.1269-1294 for (i = 0; i < gd->lastFrame; ++i) { - _vm->graphics()->bankUnpack(ABS(tempFrames[i]), firstImage + i, 15); + _vm->bankMan()->unpack(ABS(tempFrames[i]), firstImage + i, 15); } BobSlot *pbs = _vm->graphics()->bob(bobNum); pbs->animating = false; @@ -1323,16 +1323,16 @@ void Logic::animSetup(const GraphicData *gd, uint16 firstImage, uint16 bobNum, b void Logic::joeSetupFromBanks(const char *animBank, const char *standBank) { int i; - _vm->graphics()->bankLoad(animBank, 13); + _vm->bankMan()->load(animBank, 13); for (i = 11; i <= 28 + FRAMES_JOE_XTRA; ++i) { - _vm->graphics()->bankUnpack(i - 10, i, 13); + _vm->bankMan()->unpack(i - 10, i, 13); } - _vm->graphics()->bankErase(13); + _vm->bankMan()->close(13); - _vm->graphics()->bankLoad(standBank, 7); - _vm->graphics()->bankUnpack(1, 33 + FRAMES_JOE_XTRA, 7); - _vm->graphics()->bankUnpack(3, 34 + FRAMES_JOE_XTRA, 7); - _vm->graphics()->bankUnpack(5, 35 + FRAMES_JOE_XTRA, 7); + _vm->bankMan()->load(standBank, 7); + _vm->bankMan()->unpack(1, 33 + FRAMES_JOE_XTRA, 7); + _vm->bankMan()->unpack(3, 34 + FRAMES_JOE_XTRA, 7); + _vm->bankMan()->unpack(5, 35 + FRAMES_JOE_XTRA, 7); } @@ -1410,8 +1410,8 @@ ObjectData *Logic::joeSetupInRoom(bool autoPosition, uint16 scale) { if (_currentRoom == 108) { _vm->graphics()->cameraBob(-1); - _vm->graphics()->bankLoad("joe_e.act", 7); - _vm->graphics()->bankUnpack(2, 29 + FRAMES_JOE_XTRA, 7); + _vm->bankMan()->load("joe_e.act", 7); + _vm->bankMan()->unpack(2, 29 + FRAMES_JOE_XTRA, 7); _vm->display()->horizontalScroll(320); @@ -1476,7 +1476,7 @@ uint16 Logic::joeFace() { } } pbs->frameNum = 29 + FRAMES_JOE_XTRA; - _vm->graphics()->bankUnpack(frame, pbs->frameNum, 7); + _vm->bankMan()->unpack(frame, pbs->frameNum, 7); return frame; } @@ -1509,12 +1509,12 @@ void Logic::joeGrab(int16 grabState) { case STATE_GRAB_UP: // turn back - _vm->graphics()->bankUnpack(5, 29 + FRAMES_JOE_XTRA, 7); + _vm->bankMan()->unpack(5, 29 + FRAMES_JOE_XTRA, 7); bobJoe->xflip = (joeFacing() == DIR_LEFT); bobJoe->scale = joeScale(); update(); // grab up - _vm->graphics()->bankUnpack(7, 29 + FRAMES_JOE_XTRA, 7); + _vm->bankMan()->unpack(7, 29 + FRAMES_JOE_XTRA, 7); bobJoe->xflip = (joeFacing() == DIR_LEFT); bobJoe->scale = joeScale(); update(); @@ -1524,7 +1524,7 @@ void Logic::joeGrab(int16 grabState) { } if (frame != 0) { - _vm->graphics()->bankUnpack(frame, 29 + FRAMES_JOE_XTRA, 7); + _vm->bankMan()->unpack(frame, 29 + FRAMES_JOE_XTRA, 7); bobJoe->xflip = (joeFacing() == DIR_LEFT); bobJoe->scale = joeScale(); update(); @@ -1678,7 +1678,7 @@ uint16 Logic::findInventoryItem(int invSlot) const { void Logic::inventorySetup() { - _vm->graphics()->bankLoad("objects.BBK", 14); + _vm->bankMan()->load("objects.BBK", 14); if (_vm->resource()->isInterview()) { _inventoryItem[0] = 1; _inventoryItem[1] = 2; @@ -1702,7 +1702,7 @@ void Logic::inventoryRefresh() { // whereas 2nd, 3rd and 4th uses frame 9 uint16 dstFrame = (itemNum != 0) ? 8 : 9; // unpack frame for object and draw it - _vm->graphics()->bankUnpack(_itemData[itemNum].frame, dstFrame, 14); + _vm->bankMan()->unpack(_itemData[itemNum].frame, dstFrame, 14); _vm->graphics()->bobDrawInventoryItem(dstFrame, x, 14); } else { // no object, clear the panel @@ -2620,7 +2620,7 @@ void Logic::asmWaitForFrankPosition() { void Logic::asmMakeFrankGrowing() { - _vm->graphics()->bankUnpack(1, 38, 15); + _vm->bankMan()->unpack(1, 38, 15); BobSlot *bobFrank = _vm->graphics()->bob(5); bobFrank->frameNum = 38; bobFrank->curPos(160, 200); @@ -2645,7 +2645,7 @@ void Logic::asmMakeFrankGrowing() { void Logic::asmMakeRobotGrowing() { - _vm->graphics()->bankUnpack(1, 38, 15); + _vm->bankMan()->unpack(1, 38, 15); BobSlot *bobRobot = _vm->graphics()->bob(5); bobRobot->frameNum = 38; bobRobot->curPos(160, 200); @@ -2888,8 +2888,8 @@ void Logic::asmMakeLightningHitPlane() { // 23/2/95 - Play lightning SFX _vm->sound()->playSfx(_vm->logic()->currentRoomSfx()); - _vm->graphics()->bankUnpack(18, lightningBob->frameNum, 15); - _vm->graphics()->bankUnpack(4, planeBob ->frameNum, 15); + _vm->bankMan()->unpack(18, lightningBob->frameNum, 15); + _vm->bankMan()->unpack(4, planeBob ->frameNum, 15); // Plane plunges into the jungle! BobSlot *fireBob = _vm->graphics()->bob(6); @@ -2898,7 +2898,7 @@ void Logic::asmMakeLightningHitPlane() { fireBob->x = planeBob->x; fireBob->y = planeBob->y + 10; - _vm->graphics()->bankUnpack(19, fireBob->frameNum, 15); + _vm->bankMan()->unpack(19, fireBob->frameNum, 15); update(); k = 20; @@ -2910,8 +2910,8 @@ void Logic::asmMakeLightningHitPlane() { planeBob->x = fireBob->x = x; if (k < 40) { - _vm->graphics()->bankUnpack(j, planeBob->frameNum, 15); - _vm->graphics()->bankUnpack(k, fireBob ->frameNum, 15); + _vm->bankMan()->unpack(j, planeBob->frameNum, 15); + _vm->bankMan()->unpack(k, fireBob ->frameNum, 15); k++; j++; diff --git a/queen/queen.cpp b/queen/queen.cpp index 210afcea11..e14ff6dce6 100644 --- a/queen/queen.cpp +++ b/queen/queen.cpp @@ -102,6 +102,7 @@ QueenEngine::~QueenEngine() { _timer->removeTimerProc(&timerHandler); delete _bam; delete _resource; + delete _bankMan; delete _command; delete _debugger; delete _display; @@ -120,7 +121,7 @@ void QueenEngine::errorString(const char *buf1, char *buf2) { void QueenEngine::go() { initialise(); - + _logic->registerDefaultSettings(); _logic->readOptionSettings(); @@ -157,6 +158,7 @@ void QueenEngine::go() { void QueenEngine::initialise(void) { _bam = new BamScene(this); _resource = new Resource(_gameDataPath, _system->get_savefile_manager(), getSavePath()); + _bankMan = new BankManager(_resource); _command = new Command(this); _debugger = new Debugger(this); _display = new Display(this, _system); diff --git a/queen/queen.h b/queen/queen.h index 3aae2482c2..2a8721e970 100644 --- a/queen/queen.h +++ b/queen/queen.h @@ -29,6 +29,7 @@ class GameDetector; namespace Queen { class BamScene; +class BankManager; class Command; class Debugger; class Display; @@ -47,6 +48,7 @@ public: virtual ~QueenEngine(); BamScene *bam() const { return _bam; } + BankManager *bankMan() const { return _bankMan; } Command *command() const { return _command; } Debugger *debugger() const { return _debugger; } Display *display() const { return _display; } @@ -72,6 +74,7 @@ protected: void gotTimerTick(); BamScene *_bam; + BankManager *_bankMan; Command *_command; Debugger *_debugger; Display *_display; diff --git a/queen/talk.cpp b/queen/talk.cpp index eeb9bce9d8..d07fc3be56 100644 --- a/queen/talk.cpp +++ b/queen/talk.cpp @@ -735,7 +735,7 @@ void Talk::headStringAnimation(const SpeechParameters *parameters, int bobNum, i offset += 4; - _vm->graphics()->bankUnpack(frame, _vm->logic()->numFrames(), bankNum); + _vm->bankMan()->unpack(frame, _vm->logic()->numFrames(), bankNum); bob2->frameNum = _vm->logic()->numFrames(); bob2->scale = 100; @@ -759,7 +759,7 @@ void Talk::stringAnimation(const SpeechParameters *parameters, int startFrame, i if (parameters->animation[0] == 'T') { // Torso animation torso = true; - _vm->graphics()->bankOverpack(parameters->body, startFrame, bankNum); + _vm->bankMan()->overpack(parameters->body, startFrame, bankNum); offset++; } else if (parameters->animation[0] == 'E') { @@ -788,10 +788,10 @@ void Talk::stringAnimation(const SpeechParameters *parameters, int startFrame, i } if (torso) { - _vm->graphics()->bankOverpack(frame, startFrame, bankNum); + _vm->bankMan()->overpack(frame, startFrame, bankNum); } else { - _vm->graphics()->bankUnpack(frame, startFrame, bankNum); + _vm->bankMan()->unpack(frame, startFrame, bankNum); // XXX bobs[BNUM].scale=SF; } @@ -869,15 +869,15 @@ void Talk::defaultAnimation( // Make the head move qzx ^= 1; if (parameters->af && qzx) - _vm->graphics()->bankOverpack(parameters->af + head, startFrame, bankNum); + _vm->bankMan()->overpack(parameters->af + head, startFrame, bankNum); else { - _vm->graphics()->bankOverpack(head, startFrame, bankNum); + _vm->bankMan()->overpack(head, startFrame, bankNum); } } else { debug(6, "[Talk::defaultAnimation] Body action!"); // Just do a body action - _vm->graphics()->bankOverpack(parameters->body, startFrame, bankNum); + _vm->bankMan()->overpack(parameters->body, startFrame, bankNum); } if (!_talkHead) @@ -913,7 +913,7 @@ void Talk::defaultAnimation( // Make sure that Person closes their mouths if (!isJoe && parameters->ff > 0) - _vm->graphics()->bankOverpack(parameters->ff, startFrame, bankNum); + _vm->bankMan()->overpack(parameters->ff, startFrame, bankNum); } @@ -984,7 +984,7 @@ void Talk::speakSegment( oracle = true; uint16 frameNum = _vm->logic()->personFrames(bobNum); for (i = 5; i <= 8; ++i) { - _vm->graphics()->bankUnpack(i, frameNum, bankNum); + _vm->bankMan()->unpack(i, frameNum, bankNum); ++frameNum; } } @@ -1070,10 +1070,10 @@ void Talk::speakSegment( stringAnimation(parameters, startFrame, bankNum); } else { - _vm->graphics()->bankUnpack(parameters->body, startFrame, bankNum); + _vm->bankMan()->unpack(parameters->body, startFrame, bankNum); if (length == 0 && !isJoe && parameters->bf > 0) { - _vm->graphics()->bankOverpack(parameters->bf, startFrame, bankNum); + _vm->bankMan()->overpack(parameters->bf, startFrame, bankNum); _vm->logic()->update(); } @@ -1085,7 +1085,7 @@ void Talk::speakSegment( if (-1 == parameters->rf) { // Setup the Torso frames - _vm->graphics()->bankOverpack(parameters->bf, startFrame, bankNum); + _vm->bankMan()->overpack(parameters->bf, startFrame, bankNum); if (isJoe) parameters = findSpeechParameters(person->name, 0, _vm->logic()->joeFacing()); else @@ -1094,7 +1094,7 @@ void Talk::speakSegment( if (-2 == parameters->rf) { // Setup the Torso frames - _vm->graphics()->bankOverpack(parameters->bf, startFrame, bankNum); + _vm->bankMan()->overpack(parameters->bf, startFrame, bankNum); if (isJoe) parameters = findSpeechParameters(person->name, 14, _vm->logic()->joeFacing()); else @@ -1111,7 +1111,7 @@ void Talk::speakSegment( if (oracle) { uint16 frameNum = _vm->logic()->personFrames(bobNum); for (i = 1; i <= 4; ++i) { - _vm->graphics()->bankUnpack(i, frameNum, bankNum); + _vm->bankMan()->unpack(i, frameNum, bankNum); ++frameNum; } } @@ -1137,12 +1137,12 @@ void Talk::speakSegment( // 7/11/94, Ensure that correct mouth closed frame is used! if (parameters->rf != -1) // XXX should really be just "bf", but it is not always calculated... :-( - _vm->graphics()->bankOverpack(parameters->bf, startFrame, bankNum); + _vm->bankMan()->overpack(parameters->bf, startFrame, bankNum); if (parameters->ff == 0) - _vm->graphics()->bankOverpack(10, startFrame, bankNum); + _vm->bankMan()->overpack(10, startFrame, bankNum); else - _vm->graphics()->bankOverpack(parameters->ff, startFrame, bankNum); + _vm->bankMan()->overpack(parameters->ff, startFrame, bankNum); } } } diff --git a/queen/walk.cpp b/queen/walk.cpp index f83c4211af..0e7eeab979 100644 --- a/queen/walk.cpp +++ b/queen/walk.cpp @@ -238,7 +238,7 @@ void Walk::animatePerson(const MovePersonData *mpd, uint16 image, uint16 bobNum, uint16 dstFrame = image; uint16 srcFrame = ABS(pwd->anim.firstFrame); while (srcFrame <= ABS(pwd->anim.lastFrame)) { - _vm->graphics()->bankUnpack(srcFrame, dstFrame, bankNum); + _vm->bankMan()->unpack(srcFrame, dstFrame, bankNum); ++dstFrame; ++srcFrame; } @@ -374,9 +374,9 @@ int16 Walk::movePerson(const Person *pp, int16 endx, int16 endy, uint16 curImage pbs->animating = false; pbs->scale = _walkData[_walkDataCount].area->calcScale(endy); if (_walkData[_walkDataCount].anim.facing == DIR_BACK) { - _vm->graphics()->bankUnpack(mpd->backStandingFrame, standingFrame, bankNum); + _vm->bankMan()->unpack(mpd->backStandingFrame, standingFrame, bankNum); } else { - _vm->graphics()->bankUnpack(mpd->frontStandingFrame, standingFrame, bankNum); + _vm->bankMan()->unpack(mpd->frontStandingFrame, standingFrame, bankNum); } uint16 obj = _vm->logic()->objectForPerson(bobNum); if (_walkData[_walkDataCount].dx < 0) { diff --git a/queen/xref.txt b/queen/xref.txt index 0aa072676c..dc4696c07c 100644 --- a/queen/xref.txt +++ b/queen/xref.txt @@ -6,10 +6,12 @@ the ScummVM implementation. BANKS ===== -erase() Graphics::bankErase -loadbank() Graphics::bankLoad -overpack() Graphics::bankOverpack -unpack() Graphics::bankUnpack +erase() BankManager::close +freeallframes() BankManager::eraseAllFrames(true) +freeframes() BankManager::eraseAllFrames(false) +loadbank() BankManager::load +overpack() BankManager::overpack +unpack() BankManager::unpack COMMAND @@ -123,8 +125,6 @@ CHECK_PARALLAX() Graphics::bobCustomParallax clearallbobs() Graphics::bobClearAll clearbob() Graphics::bobClear drawbobs() Graphics::bobDrawAll -freeallframes() Graphics::frameEraseAll(true) -freeframes() Graphics::frameEraseAll(false) invbob() Graphics::bobDrawInventoryItem loadbackdrop() Graphics::loadBackdrop loadpanel() Graphics::loadPanel |