aboutsummaryrefslogtreecommitdiff
path: root/queen
diff options
context:
space:
mode:
authorGregory Montoir2004-01-05 13:40:28 +0000
committerGregory Montoir2004-01-05 13:40:28 +0000
commit232a709fd4bf22a0daff99b97eb5e4cc854e44f3 (patch)
treee290c0fe21e2576a45344c98275d902149232229 /queen
parentfbc4168a8e4f4ccd400f435fa4307472decfac33 (diff)
downloadscummvm-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.cpp14
-rw-r--r--queen/graphics.cpp150
-rw-r--r--queen/graphics.h63
-rw-r--r--queen/journal.cpp10
-rw-r--r--queen/logic.cpp80
-rw-r--r--queen/queen.cpp4
-rw-r--r--queen/queen.h3
-rw-r--r--queen/talk.cpp34
-rw-r--r--queen/walk.cpp6
-rw-r--r--queen/xref.txt12
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