aboutsummaryrefslogtreecommitdiff
path: root/queen
diff options
context:
space:
mode:
authorGregory Montoir2004-01-08 22:46:42 +0000
committerGregory Montoir2004-01-08 22:46:42 +0000
commit1b1ce1faf71f1e7fca9cf030e08bffd343a2bf79 (patch)
tree1ffb8d13a258d8626d0b99fd122b49d276c344fa /queen
parent65bfcb71fe7910e16b5e4e0e6665fa3b9e77510e (diff)
downloadscummvm-rg350-1b1ce1faf71f1e7fca9cf030e08bffd343a2bf79.tar.gz
scummvm-rg350-1b1ce1faf71f1e7fca9cf030e08bffd343a2bf79.tar.bz2
scummvm-rg350-1b1ce1faf71f1e7fca9cf030e08bffd343a2bf79.zip
moved the remaining 'graphics' stuff from Logic to Graphics
svn-id: r12266
Diffstat (limited to 'queen')
-rw-r--r--queen/command.cpp8
-rw-r--r--queen/cutaway.cpp14
-rw-r--r--queen/graphics.cpp644
-rw-r--r--queen/graphics.h40
-rw-r--r--queen/logic.cpp417
-rw-r--r--queen/logic.h24
-rw-r--r--queen/talk.cpp10
-rw-r--r--queen/xref.txt6
8 files changed, 574 insertions, 589 deletions
diff --git a/queen/command.cpp b/queen/command.cpp
index 8d2dc663a7..da1b9b0697 100644
--- a/queen/command.cpp
+++ b/queen/command.cpp
@@ -394,14 +394,14 @@ int16 Command::executeCommand(uint16 comId, int16 condResult) {
} else {
od->image = com->imageOrder;
}
- _vm->logic()->roomRefreshObject(_state.subject[0]);
+ _vm->graphics()->refreshObject(_state.subject[0]);
} else {
// this object is not being updated by command list, see if
// it has another image copied to it
if (_state.subject[0] > 0) {
// an object (not an item)
if (_vm->logic()->objectData(_state.subject[0])->image != oldImage) {
- _vm->logic()->roomRefreshObject(_state.subject[0]);
+ _vm->graphics()->refreshObject(_state.subject[0]);
}
}
}
@@ -1144,7 +1144,7 @@ void Command::setObjects(uint16 command) {
if (dstObj != _state.subject[0]) {
// if the new object we have updated is on screen and
// is not current object then update it
- _vm->logic()->roomRefreshObject(dstObj);
+ _vm->graphics()->refreshObject(dstObj);
}
} else {
// hide the object
@@ -1153,7 +1153,7 @@ void Command::setObjects(uint16 command) {
// may need to turn BOBs off for objects to be hidden on current
// screen ! if the new object we have updated is on screen and
// is not current object then update it
- _vm->logic()->roomRefreshObject(dstObj);
+ _vm->graphics()->refreshObject(dstObj);
}
}
}
diff --git a/queen/cutaway.cpp b/queen/cutaway.cpp
index 43b44433a1..213a43d641 100644
--- a/queen/cutaway.cpp
+++ b/queen/cutaway.cpp
@@ -420,7 +420,7 @@ void Cutaway::changeRooms(CutawayObject &object) {
_vm->logic()->roomDisplay(_vm->logic()->currentRoom(), mode, object.scale, comPanel, true);
- _currentImage = _vm->logic()->numFrames();
+ _currentImage = _vm->graphics()->numFrames();
_temporaryRoom = _vm->logic()->currentRoom();
@@ -460,7 +460,7 @@ Cutaway::ObjectType Cutaway::getObjectType(CutawayObject &object) {
objectData->name = ABS(objectData->name);
}
- _vm->logic()->roomRefreshObject(object.objectNumber);
+ _vm->graphics()->refreshObject(object.objectNumber);
// Skip doing any anim stuff
objectType = OBJECT_TYPE_NO_ANIMATION;
@@ -638,7 +638,7 @@ byte *Cutaway::handleAnimation(byte *ptr, CutawayObject &object) {
if ((_vm->logic()->currentRoom() == 47 || _vm->logic()->currentRoom() == 63) &&
objAnim[0].object == 1) {
//CR 2 - 3/3/95, Special harcoded section to make Oracle work...
- makeComplexAnimation(_vm->logic()->personFrames(1) - 1, objAnim, frameCount);
+ makeComplexAnimation(_vm->graphics()->personFrames(1) - 1, objAnim, frameCount);
}
else {
_currentImage = makeComplexAnimation(_currentImage, objAnim, frameCount);
@@ -856,7 +856,7 @@ void Cutaway::run(char *nextFilename) {
int i;
nextFilename[0] = '\0';
- _currentImage = _vm->logic()->numFrames();
+ _currentImage = _vm->graphics()->numFrames();
BobSlot *joeBob = _vm->graphics()->bob(0);
int initialJoeX = joeBob->x;
@@ -1128,7 +1128,7 @@ void Cutaway::stop() {
}
if (_vm->logic()->currentRoom() == room)
- _vm->logic()->roomRefreshObject(objectIndex);
+ _vm->graphics()->refreshObject(objectIndex);
}
if (_vm->logic()->currentRoom() == object->room) {
@@ -1225,13 +1225,13 @@ void Cutaway::updateGameState() {
objectData->name = ABS(objectData->name);
if (fromObject > 0)
_vm->logic()->objectCopy(fromObject, objectIndex);
- _vm->logic()->roomRefreshObject(objectIndex);
+ _vm->graphics()->refreshObject(objectIndex);
}
else if (objectIndex < 0) { // Hide the object
objectIndex = -objectIndex;
ObjectData *objectData = _vm->logic()->objectData(objectIndex);
objectData->name = -ABS(objectData->name);
- _vm->logic()->roomRefreshObject(objectIndex);
+ _vm->graphics()->refreshObject(objectIndex);
}
if (areaIndex > 0) {
diff --git a/queen/graphics.cpp b/queen/graphics.cpp
index 3f29442bae..71cce80d91 100644
--- a/queen/graphics.cpp
+++ b/queen/graphics.cpp
@@ -24,6 +24,7 @@
#include "queen/bankman.h"
#include "queen/display.h"
+#include "queen/grid.h"
#include "queen/logic.h"
#include "queen/queen.h"
#include "queen/resource.h"
@@ -501,8 +502,118 @@ void Graphics::bobCustomParallax(uint16 roomNum) {
}
-void Graphics::textCurrentColor(uint8 color) {
- _curTextColor = color;
+void Graphics::bobSetText(
+ BobSlot *pbs,
+ const char *text,
+ int textX, int textY,
+ int color, int flags) {
+ // function MAKE_SPEAK_BOB, lines 335-457 in talk.c
+
+ if (text[0] == '\0')
+ return;
+
+ // debug(0, "makeSpeakBob('%s', (%i,%i), %i, %i, %i, %i);",
+ // text, bob->x, bob->y, textX, textY, color, flags);
+
+ // Duplicate string and append zero if needed
+
+ char textCopy[MAX_STRING_SIZE];
+
+ int length = strlen(text);
+ memcpy(textCopy, text, length);
+
+ if (textCopy[length - 1] >= 'A')
+ textCopy[length++] = '.';
+
+ textCopy[length] = '\0';
+
+ // Split text into lines
+
+ char lines[8][MAX_STRING_SIZE];
+ int lineCount = 0;
+ int wordCount = 0;
+ int lineLength = 0;
+ int i;
+
+ for (i = 0; i < length; i++) {
+ if (textCopy[i] == ' ')
+ wordCount++;
+
+ lineLength++;
+
+ if ((lineLength > 20 && textCopy[i] == ' ') || i == (length-1)) {
+ memcpy(lines[lineCount], textCopy + i + 1 - lineLength, lineLength);
+ lines[lineCount][lineLength] = '\0';
+ lineCount++;
+ lineLength = 0;
+ }
+ }
+
+
+ // Plan: write each line to Screen 2, put black outline around lines and
+ // pick them up as a BOB.
+
+
+ // Find width of widest line
+
+ int maxLineWidth = 0;
+
+ for (i = 0; i < lineCount; i++) {
+ int width = textWidth(lines[i]);
+ if (maxLineWidth < width)
+ maxLineWidth = width;
+ }
+
+ // Calc text position
+
+ short x, y, width, height;
+
+ if (flags) {
+ if (flags == 2)
+ x = 160 - maxLineWidth / 2;
+ else
+ x = textX;
+
+ y = textY;
+
+ width = 0;
+ } else {
+ x = pbs->x;
+ y = pbs->y;
+
+ BobFrame *pbf = _vm->bankMan()->fetchFrame(pbs->frameNum);
+
+ width = (pbf->width * pbs->scale) / 100;
+ height = (pbf->height * pbs->scale) / 100;
+
+ y = y - height - 16 - lineCount * 9;
+ }
+
+ x -= _vm->display()->horizontalScroll();
+
+ if (y < 0) {
+ y = 0;
+
+ if (x < 160)
+ x += width / 2;
+ else
+ x -= width / 2 + maxLineWidth;
+ } else if (!flags)
+ x -= maxLineWidth / 2;
+
+ if (x < 0)
+ x = 4;
+ else if ((x + maxLineWidth) > 320)
+ x = 320 - maxLineWidth - 4;
+
+ textCurrentColor(color);
+
+ for (i = 0; i < lineCount; i++) {
+ int lineX = x + (maxLineWidth - textWidth(lines[i])) / 2;
+
+ //debug(0, "Setting text '%s' at (%i, %i)", lines[i], lineX, y + 9 * i);
+ textSet(lineX, y + 9 * i, lines[i]);
+ }
}
@@ -550,6 +661,30 @@ uint16 Graphics::textWidth(const char* text) const {
}
+int Graphics::textCenterX(const char *text) const {
+ return 160 - textWidth(text) / 2;
+}
+
+
+void Graphics::setupNewRoom(const char *room, uint16 roomNum, int16 *furniture, uint16 furnitureCount) {
+ // reset sprites table (bounding box...)
+ bobClearAll();
+
+ // load/setup objects associated to this room
+ char filename[20];
+ sprintf(filename, "%s.BBK", room);
+ _vm->bankMan()->load(filename, 15);
+
+ _numFrames = 37 + FRAMES_JOE_XTRA;
+ setupRoomFurniture(furniture, furnitureCount);
+ setupRoomObjects();
+
+ if (roomNum >= 90) {
+ putCameraOnBob(0);
+ }
+}
+
+
void Graphics::fillAnimBuffer(const char *anim, AnimFrame *af) {
while (true) {
sscanf(anim, "%3hu,%3hu", &af->frame, &af->speed);
@@ -661,6 +796,8 @@ void Graphics::setupObjectAnim(const GraphicData *gd, uint16 firstImage, uint16
uint16 Graphics::setupPersonAnim(const ActorData *ad, const char *anim, uint16 curImage) {
debug(9, "Graphics::setupPersonAnim(%s, %d)", anim, curImage);
+ _personFrames[ad->bobNum] = curImage + 1;
+
AnimFrame *animFrames = _newAnim[ad->bobNum];
fillAnimBuffer(anim, animFrames);
uint16 frameCount[256];
@@ -727,6 +864,356 @@ void Graphics::eraseAllAnims() {
}
+uint16 Graphics::refreshObject(uint16 obj) {
+ debug(6, "Graphics::refreshObject(%X)", obj);
+ uint16 curImage = _numFrames;
+
+ ObjectData *pod = _vm->logic()->objectData(obj);
+ if (pod->image == 0) {
+ return curImage;
+ }
+
+ // check the object is in the current room
+ if (pod->room != _vm->logic()->currentRoom()) {
+ return curImage;
+ }
+
+ // find bob for the object
+ uint16 curBob = _vm->logic()->findBob(obj);
+ BobSlot *pbs = bob(curBob);
+
+ if (pod->image == -3 || pod->image == -4) {
+ // a person object
+ if (pod->name <= 0) {
+ bobClear(curBob);
+ } else {
+ // find person number
+ uint16 pNum = _vm->logic()->findPersonNumber(obj);
+ curImage = _personFrames[pNum] - 1;
+ if (_personFrames[pNum] == 0) {
+ _personFrames[pNum] = curImage = _numFrames;
+ }
+ curImage = setupPerson(obj - _vm->logic()->currentRoomData(), curImage);
+ }
+ return curImage;
+ }
+
+ // find frame used for object
+ curImage = _vm->logic()->findFrame(obj);
+
+ if (pod->name < 0 || pod->image < 0) {
+ // object is hidden or disabled
+ bobClear(curBob);
+ return curImage;
+ }
+
+ int image = pod->image;
+ if (image > 5000) {
+ image -= 5000;
+ }
+
+ GraphicData *pgd = _vm->logic()->graphicData(image);
+ bool rebound = false;
+ int16 lastFrame = pgd->lastFrame;
+ if (lastFrame < 0) {
+ lastFrame = -lastFrame;
+ rebound = true;
+ }
+ if (pgd->firstFrame < 0) {
+ setupObjectAnim(pgd, curImage, curBob, pod->name != 0);
+ curImage += pgd->lastFrame - 1;
+ } else if (lastFrame != 0) {
+ // turn on an animated bob
+ _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->bankMan()->unpack(j, curImage, 15);
+ }
+ pbs->curPos(pgd->x, pgd->y);
+ pbs->frameNum = firstImage;
+ if (pgd->speed > 0) {
+ pbs->animNormal(firstImage, curImage, pgd->speed / 4, rebound, false);
+ }
+ } else {
+ // frame 2 is used as a buffer frame to prevent BOB flickering
+ _vm->bankMan()->unpack(pgd->firstFrame, 2, 15);
+ _vm->bankMan()->unpack(pgd->firstFrame, curImage, 15);
+ pbs->curPos(pgd->x, pgd->y);
+ pbs->frameNum = curImage;
+ }
+
+ return curImage;
+}
+
+
+void Graphics::setupRoomFurniture(int16 *furniture, uint16 furnitureCount) {
+ uint16 i;
+ uint16 curImage = 36 + FRAMES_JOE_XTRA;
+
+ // unpack the furniture from bank 15
+ // there are 3 kinds :
+ // - static (bobs), gamestate range = ]0;5000]
+ // - animated (bobs), gamestate range = ]0;5000]
+ // - static (paste downs), gamestate range = [5000; [
+
+ // unpack the static bobs
+ _numFurnitureStatic = 0;
+ for (i = 1; i <= furnitureCount; ++i) {
+ int16 obj = furniture[i];
+ if (obj > 0 && obj <= 5000) {
+ GraphicData *pgd = _vm->logic()->graphicData(obj);
+ if (pgd->lastFrame == 0) {
+ ++_numFurnitureStatic;
+ ++curImage;
+ _vm->bankMan()->unpack(pgd->firstFrame, curImage, 15);
+ ++_numFrames;
+ BobSlot *pbs = bob(19 + _numFurnitureStatic);
+ pbs->curPos(pgd->x, pgd->y);
+ pbs->frameNum = curImage;
+ }
+ }
+ }
+
+ // unpack the animated bobs
+ _numFurnitureAnimated = 0;
+ _numFurnitureAnimatedLen = 0;
+ uint16 curBob = 0;
+ for (i = 1; i <= furnitureCount; ++i) {
+ int16 obj = furniture[i];
+ if (obj > 0 && obj <= 5000) {
+ GraphicData *pgd = _vm->logic()->graphicData(obj);
+
+ bool rebound = false;
+ int16 lastFrame = pgd->lastFrame;
+ if (lastFrame < 0) {
+ rebound = true;
+ lastFrame = -lastFrame;
+ }
+
+ if (lastFrame > 0) {
+ _numFurnitureAnimatedLen += lastFrame - pgd->firstFrame + 1;
+ ++_numFurnitureAnimated;
+ uint16 image = curImage + 1;
+ int k;
+ for (k = pgd->firstFrame; k <= lastFrame; ++k) {
+ ++curImage;
+ _vm->bankMan()->unpack(k, curImage, 15);
+ ++_numFrames;
+ }
+ BobSlot *pbs = bob(5 + curBob);
+ pbs->animNormal(image, curImage, pgd->speed / 4, rebound, false);
+ pbs->curPos(pgd->x, pgd->y);
+ ++curBob;
+ }
+ }
+ }
+
+ // unpack the paste downs
+ for (i = 1; i <= furnitureCount; ++i) {
+ if (furniture[i] > 5000) {;
+ bobPaste(furniture[i] - 5000, curImage + 1);
+ }
+ }
+}
+
+
+void Graphics::setupRoomObjects() {
+ uint16 i;
+ // furniture frames are reserved in ::setupRoomFurniture(), we append objects
+ // frames after the furniture ones.
+ uint16 curImage = 36 + FRAMES_JOE_XTRA + _numFurnitureStatic + _numFurnitureAnimatedLen;
+ uint16 firstRoomObj = _vm->logic()->currentRoomData() + 1;
+ uint16 lastRoomObj = _vm->logic()->roomData(_vm->logic()->currentRoom() + 1);
+ uint16 numObjectStatic = 0;
+ uint16 numObjectAnimated = 0;
+ uint16 curBob;
+
+ // invalidates all Bobs for persons (except Joe's one)
+ for (i = 1; i <= 3; ++i) {
+ _bobs[i].active = false;
+ }
+
+ // static/animated Bobs
+ for (i = firstRoomObj; i <= lastRoomObj; ++i) {
+ ObjectData *pod = _vm->logic()->objectData(i);
+ // setup blanks bobs for turned off objects (in case
+ // you turn them on again)
+ if (pod->image == -1) {
+ // static OFF Bob
+ curBob = 20 + _numFurnitureStatic + numObjectStatic;
+ ++numObjectStatic;
+ // create a blank frame for the OFF object
+ ++_numFrames;
+ ++curImage;
+ } else if(pod->image == -2) {
+ // animated OFF Bob
+ curBob = 5 + _numFurnitureAnimated + numObjectAnimated;
+ ++numObjectAnimated;
+ } else if(pod->image > 0 && pod->image < 5000) {
+ GraphicData *pgd = _vm->logic()->graphicData(pod->image);
+ int16 lastFrame = pgd->lastFrame;
+ bool rebound = false;
+ if (lastFrame < 0) {
+ lastFrame = -lastFrame;
+ rebound = true;
+ }
+ if (pgd->firstFrame < 0) {
+ // XXX if(TEMPA[1]<0) bobs[CURRBOB].xflip=1;
+ curBob = 5 + _numFurnitureAnimated;
+ setupObjectAnim(pgd, curImage + 1, curBob + numObjectAnimated, pod->name > 0);
+ curImage += pgd->lastFrame;
+ ++numObjectAnimated;
+ } else if (lastFrame != 0) {
+ // animated objects
+ uint16 j;
+ uint16 firstFrame = curImage + 1;
+ for (j = pgd->firstFrame; j <= lastFrame; ++j) {
+ ++curImage;
+ _vm->bankMan()->unpack(j, curImage, 15);
+ ++_numFrames;
+ }
+ curBob = 5 + _numFurnitureAnimated + numObjectAnimated;
+ if (pod->name > 0) {
+ BobSlot *pbs = bob(curBob);
+ pbs->curPos(pgd->x, pgd->y);
+ pbs->frameNum = firstFrame;
+ if (pgd->speed > 0) {
+ pbs->animNormal(firstFrame, curImage, pgd->speed / 4, rebound, false);
+ }
+ }
+ ++numObjectAnimated;
+ } else {
+ // static objects
+ curBob = 20 + _numFurnitureStatic + numObjectStatic;
+ ++curImage;
+ bobClear(curBob);
+
+ // XXX if((COMPANEL==2) && (FULLSCREEN==1)) bobs[CURRBOB].y2=199;
+
+ _vm->bankMan()->unpack(pgd->firstFrame, curImage, 15);
+ ++_numFrames;
+ if (pod->name > 0) {
+ BobSlot *pbs = bob(curBob);
+ pbs->curPos(pgd->x, pgd->y);
+ pbs->frameNum = curImage;
+ }
+ ++numObjectStatic;
+ }
+ }
+ }
+
+ // persons Bobs
+ for (i = firstRoomObj; i <= lastRoomObj; ++i) {
+ ObjectData *pod = _vm->logic()->objectData(i);
+ if (pod->image == -3 || pod->image == -4) {
+ debug(6, "Graphics::setupRoomObjects() - Setting up person %X, name=%X", i, pod->name);
+ uint16 noun = i - _vm->logic()->currentRoomData();
+ if (pod->name > 0) {
+ curImage = setupPerson(noun, curImage);
+ } else {
+ curImage = allocPerson(noun, curImage);
+ }
+ }
+ }
+
+ // paste downs list
+ ++curImage;
+ _numFrames = curImage;
+ for (i = firstRoomObj; i <= lastRoomObj; ++i) {
+ ObjectData *pod = _vm->logic()->objectData(i);
+ if (pod->name > 0 && pod->image > 5000) {
+ bobPaste(pod->image - 5000, curImage);
+ }
+ }
+}
+
+
+uint16 Graphics::setupPerson(uint16 noun, uint16 curImage) {
+ if (noun == 0) {
+ warning("Trying to setup person 0");
+ return curImage;
+ }
+
+ Person p;
+ _vm->logic()->initPerson(noun, "", true, &p);
+
+ const ActorData *pad = p.actor;
+ uint16 scale = 100;
+ uint16 a = _vm->grid()->findAreaForPos(GS_ROOM, pad->x, pad->y);
+ if (a != 0) {
+ // person is not standing in the area box, scale it accordingly
+ scale = _vm->grid()->area(_vm->logic()->currentRoom(), a)->calcScale(pad->y);
+ }
+
+ _vm->bankMan()->unpack(pad->bobFrameStanding, p.bobFrame, p.actor->bankNum);
+ uint16 obj = _vm->logic()->currentRoomData() + noun;
+ BobSlot *pbs = bob(pad->bobNum);
+ pbs->curPos(pad->x, pad->y);
+ pbs->scale = scale;
+ pbs->frameNum = p.bobFrame;
+ pbs->xflip = (_vm->logic()->objectData(obj)->image == -3); // person is facing left
+
+ debug(6, "Graphics::setupPerson(%d, %d) - bob = %d name = %s", noun, curImage, pad->bobNum, p.name);
+
+ if (p.anim != NULL) {
+ curImage = setupPersonAnim(pad, p.anim, curImage);
+ } else {
+ erasePersonAnim(pad->bobNum);
+ }
+ return curImage;
+}
+
+
+uint16 Graphics::allocPerson(uint16 noun, uint16 curImage) {
+ Person p;
+ _vm->logic()->initPerson(noun, "", false, &p);
+ if (p.anim != NULL) {
+ curImage += countAnimFrames(p.anim);
+ _personFrames[p.actor->bobNum] = curImage + 1;
+ }
+ return curImage;
+}
+
+
+void Graphics::update(uint16 room) {
+ bobSortAll();
+ if (_cameraBob >= 0) {
+ _vm->display()->horizontalScrollUpdate(_bobs[_cameraBob].x);
+ }
+ bobCustomParallax(room);
+ _vm->display()->prepareUpdate();
+ bobDrawAll();
+ textDrawAll();
+}
+
+
+
+BamScene::BamScene(QueenEngine *vm)
+ : _flag(F_STOP), _screenShaked(false), _fightData(_fight1Data), _vm(vm) {
+}
+
+
+void BamScene::prepareAnimation() {
+ _obj1 = _vm->graphics()->bob(BOB_OBJ1);
+ _vm->graphics()->bobClear(BOB_OBJ1);
+ _obj1->active = true;
+
+ _obj2 = _vm->graphics()->bob(BOB_OBJ2);
+ _vm->graphics()->bobClear(BOB_OBJ2);
+ _obj2->active = true;
+
+ _objfx = _vm->graphics()->bob(BOB_FX);
+ _vm->graphics()->bobClear(BOB_FX);
+ _objfx->active = true;
+
+ _index = 0;
+}
+
+
void BamScene::updateCarAnimation() {
if (_flag != F_STOP) {
const BamDataBlock *bdb = &_carData[_index];
@@ -821,159 +1308,6 @@ void BamScene::updateFightAnimation() {
}
-void Graphics::update(uint16 room) {
- bobSortAll();
- if (_cameraBob >= 0) {
- _vm->display()->horizontalScrollUpdate(_bobs[_cameraBob].x);
- }
- bobCustomParallax(room);
- _vm->display()->prepareUpdate();
- bobDrawAll();
- textDrawAll();
-}
-
-void Graphics::bobSetText(
- BobSlot *pbs,
- const char *text,
- int textX, int textY,
- int color, int flags) {
- // function MAKE_SPEAK_BOB, lines 335-457 in talk.c
-
- if (text[0] == '\0')
- return;
-
- // debug(0, "makeSpeakBob('%s', (%i,%i), %i, %i, %i, %i);",
- // text, bob->x, bob->y, textX, textY, color, flags);
-
- // Duplicate string and append zero if needed
-
- char textCopy[MAX_STRING_SIZE];
-
- int length = strlen(text);
- memcpy(textCopy, text, length);
-
- if (textCopy[length - 1] >= 'A')
- textCopy[length++] = '.';
-
- textCopy[length] = '\0';
-
- // Split text into lines
-
- char lines[8][MAX_STRING_SIZE];
- int lineCount = 0;
- int wordCount = 0;
- int lineLength = 0;
- int i;
-
- for (i = 0; i < length; i++) {
- if (textCopy[i] == ' ')
- wordCount++;
-
- lineLength++;
-
- if ((lineLength > 20 && textCopy[i] == ' ') || i == (length-1)) {
- memcpy(lines[lineCount], textCopy + i + 1 - lineLength, lineLength);
- lines[lineCount][lineLength] = '\0';
- lineCount++;
- lineLength = 0;
- }
- }
-
-
- // Plan: write each line to Screen 2, put black outline around lines and
- // pick them up as a BOB.
-
-
- // Find width of widest line
-
- int maxLineWidth = 0;
-
- for (i = 0; i < lineCount; i++) {
- int width = textWidth(lines[i]);
- if (maxLineWidth < width)
- maxLineWidth = width;
- }
-
- // Calc text position
-
- short x, y, width, height;
-
- if (flags) {
- if (flags == 2)
- x = 160 - maxLineWidth / 2;
- else
- x = textX;
-
- y = textY;
-
- width = 0;
- } else {
- x = pbs->x;
- y = pbs->y;
-
- BobFrame *pbf = _vm->bankMan()->fetchFrame(pbs->frameNum);
-
- width = (pbf->width * pbs->scale) / 100;
- height = (pbf->height * pbs->scale) / 100;
-
- y = y - height - 16 - lineCount * 9;
- }
-
- x -= _vm->display()->horizontalScroll();
-
- if (y < 0) {
- y = 0;
-
- if (x < 160)
- x += width / 2;
- else
- x -= width / 2 + maxLineWidth;
- } else if (!flags)
- x -= maxLineWidth / 2;
-
- if (x < 0)
- x = 4;
- else if ((x + maxLineWidth) > 320)
- x = 320 - maxLineWidth - 4;
-
- textCurrentColor(color);
-
- for (i = 0; i < lineCount; i++) {
- int lineX = x + (maxLineWidth - textWidth(lines[i])) / 2;
-
- //debug(0, "Setting text '%s' at (%i, %i)", lines[i], lineX, y + 9 * i);
- textSet(lineX, y + 9 * i, lines[i]);
- }
-}
-
-int Graphics::textCenterX(const char *text) const {
- return 160 - textWidth(text) / 2;
-}
-
-
-
-BamScene::BamScene(QueenEngine *vm)
- : _flag(F_STOP), _screenShaked(false), _fightData(_fight1Data), _vm(vm) {
-}
-
-
-void BamScene::prepareAnimation() {
- _obj1 = _vm->graphics()->bob(BOB_OBJ1);
- _vm->graphics()->bobClear(BOB_OBJ1);
- _obj1->active = true;
-
- _obj2 = _vm->graphics()->bob(BOB_OBJ2);
- _vm->graphics()->bobClear(BOB_OBJ2);
- _obj2->active = true;
-
- _objfx = _vm->graphics()->bob(BOB_FX);
- _vm->graphics()->bobClear(BOB_FX);
- _objfx->active = true;
-
- _index = 0;
-}
-
-
const BamScene::BamDataBlock BamScene::_carData[] = {
{ { 310, 105, 1 }, { 314, 106, 17 }, { 366, 101, 1 }, 0 },
{ { 303, 105, 1 }, { 307, 106, 17 }, { 214, 0, 10 }, 0 },
diff --git a/queen/graphics.h b/queen/graphics.h
index 312246b77c..007d1af81c 100644
--- a/queen/graphics.h
+++ b/queen/graphics.h
@@ -114,13 +114,9 @@ public:
void bobCustomParallax(uint16 roomNum); // CHECK_PARALLAX()
- void bobSetText(
- BobSlot *bob,
- const char *text,
- int textX, int textY,
- int color, int flags); // MAKE_SPEAK_BOB
+ void bobSetText(BobSlot *bob, const char *text, int textX, int textY, int color, int flags);
- void textCurrentColor(uint8 color); // ink()
+ void textCurrentColor(uint8 color) { _curTextColor = color; }
void textSet(uint16 x, uint16 y, const char *text, bool outlined = true); // text()
void textSetCentered(uint16 y, const char *text, bool outlined = true);
void textDrawAll(); // drawtext()
@@ -129,6 +125,8 @@ public:
int textCenterX(const char *text) const; // MIDDLE()
void textColor(uint16 y, uint8 color) { _texts[y].color = color; }
+ void setupNewRoom(const char *room, uint16 roomNum, int16 *furniture, uint16 furnitureCount);
+
void fillAnimBuffer(const char *anim, AnimFrame *af);
uint16 countAnimFrames(const char *anim);
void setupObjectAnim(const GraphicData *gd, uint16 firstImage, uint16 bobNum, bool visible);
@@ -137,10 +135,26 @@ public:
void erasePersonAnim(uint16 bobNum);
void eraseAllAnims();
+ uint16 refreshObject(uint16 obj);
+
+ void setupRoomFurniture(int16 *furniture, uint16 furnitureCount);
+ void setupRoomObjects();
+
+ uint16 setupPerson(uint16 noun, uint16 curImage);
+ uint16 allocPerson(uint16 noun, uint16 curImage);
+
+ uint16 personFrames(uint16 bobNum) const { return _personFrames[bobNum]; }
+ void clearPersonFrames() { memset(_personFrames, 0, sizeof(_personFrames)); }
+ uint16 numFrames() const { return _numFrames; }
+ uint16 numStaticFurniture() const { return _numFurnitureStatic; }
+ uint16 numAnimatedFurniture() const { return _numFurnitureAnimated; }
+ uint16 numFurnitureFrames() const { return _numFurnitureStatic + _numFurnitureAnimatedLen; }
+
void putCameraOnBob(int bobNum) { _cameraBob = bobNum; }
void update(uint16 room);
+
enum {
MAX_BOBS_NUMBER = 64,
MAX_STRING_LENGTH = 255,
@@ -167,6 +181,20 @@ private:
AnimFrame _newAnim[17][30];
+ uint16 _personFrames[4];
+
+ //! Number of animated furniture in current room
+ uint16 _numFurnitureAnimated;
+
+ //! Number of static furniture in current room
+ uint16 _numFurnitureStatic;
+
+ //! Total number of frames for the animated furniture
+ uint16 _numFurnitureAnimatedLen;
+
+ //! Current number of frames unpacked
+ uint16 _numFrames;
+
int _cameraBob;
QueenEngine *_vm;
diff --git a/queen/logic.cpp b/queen/logic.cpp
index 8918e6fa33..ca9bd4442e 100644
--- a/queen/logic.cpp
+++ b/queen/logic.cpp
@@ -258,10 +258,8 @@ ObjectData* Logic::objectData(int index) const {
}
-uint16 Logic::findBob(uint16 obj) {
- uint16 i;
+uint16 Logic::findBob(uint16 obj) {
uint16 bobnum = 0;
- uint16 bobtype = 0; // 1 for animated, 0 for static
if (obj > _numObjects)
error("Object index (%i) > _numObjects (%i)", obj, _numObjects);
@@ -276,13 +274,10 @@ uint16 Logic::findBob(uint16 obj) {
if(img != 0) {
if(img == -3 || img == -4) {
// a person object
- for(i = _roomData[room] + 1; i <= obj; ++i) {
- img = _objectData[i].image;
- if(img == -3 || img == -4) {
- ++bobnum;
- }
- }
+ bobnum = findPersonNumber(obj);
} else {
+ uint16 bobtype = 0; // 1 for animated, 0 for static
+
if(img <= -10) {
// object has been turned off, but the image order hasn't been updated
if(_graphicData[-(img + 10)].lastFrame != 0) {
@@ -299,6 +294,7 @@ uint16 Logic::findBob(uint16 obj) {
uint16 idxAnimated = 0;
uint16 idxStatic = 0;
+ uint16 i;
for(i = _roomData[room] + 1; i <= obj; ++i) {
img = _objectData[i].image;
if(img <= -10) {
@@ -329,12 +325,12 @@ uint16 Logic::findBob(uint16 obj) {
if(bobtype == 0) {
// static bob
if(idxStatic > 0) {
- bobnum = 19 + _numFurnitureStatic + idxStatic;
+ bobnum = 19 + _vm->graphics()->numStaticFurniture() + idxStatic;
}
} else {
// animated bob
if(idxAnimated > 0) {
- bobnum = 4 + _numFurnitureAnimated + idxAnimated;
+ bobnum = 4 + _vm->graphics()->numAnimatedFurniture() + idxAnimated;
}
}
}
@@ -350,13 +346,7 @@ uint16 Logic::findFrame(uint16 obj) {
uint16 room = _objectData[obj].room;
int16 img = _objectData[obj].image;
if(img == -3 || img == -4) {
- uint16 bobnum = 0;
- for(i = _roomData[room] + 1; i <= obj; ++i) {
- img = _objectData[i].image;
- if(img == -3 || img == -4) {
- ++bobnum;
- }
- }
+ uint16 bobnum = findPersonNumber(obj);
if(bobnum <= 3) {
framenum = 29 + FRAMES_JOE_XTRA + bobnum;
}
@@ -405,7 +395,7 @@ uint16 Logic::findFrame(uint16 obj) {
// calculate only if there are person frames
if(idx > 0) {
- framenum = 36 + FRAMES_JOE_XTRA + _numFurnitureStatic + _numFurnitureAnimatedLen + idx;
+ framenum = 36 + FRAMES_JOE_XTRA + _vm->graphics()->numFurnitureFrames() + idx;
}
}
return framenum;
@@ -482,10 +472,7 @@ void Logic::roomErase() {
}
// invalidates all persons animations
- uint16 i;
- for (i = 0; i <= 3; ++i) {
- _personFrames[i] = 0;
- }
+ _vm->graphics()->clearPersonFrames();
_vm->graphics()->eraseAllAnims();
uint16 cur = _roomData[_oldRoom] + 1;
@@ -509,303 +496,6 @@ void Logic::roomErase() {
}
-void Logic::roomSetupFurniture() {
- int16 gstate[9];
- _numFurnitureStatic = 0;
- _numFurnitureAnimated = 0;
- _numFurnitureAnimatedLen = 0;
- uint16 curImage = 36 + FRAMES_JOE_XTRA;
-
- // count the furniture and update gameState
- uint16 furnitureTotal = 0;
- uint16 i;
- for (i = 1; i <= _numFurniture; ++i) {
- if (_furnitureData[i].room == _currentRoom) {
- ++furnitureTotal;
- gstate[furnitureTotal] = _furnitureData[i].gameStateValue;
- }
- }
- if (furnitureTotal == 0) {
- return;
- }
-
- // unpack the furniture from the bank 15
- // there are 3 kinds :
- // - static (bobs), gamestate range = ]0;5000]
- // - animated (bobs), gamestate range = ]0;5000]
- // - static (paste downs), gamestate range = [5000; [
-
- // unpack the static bobs
- for (i = 1; i <= furnitureTotal; ++i) {
- int16 obj = gstate[i];
- if (obj > 0 && obj <= 5000) {
- GraphicData *pgd = &_graphicData[obj];
- if (pgd->lastFrame == 0) {
- ++_numFurnitureStatic;
- ++curImage;
- _vm->bankMan()->unpack(pgd->firstFrame, curImage, 15);
- ++_numFrames;
- BobSlot *pbs = _vm->graphics()->bob(19 + _numFurnitureStatic);
- pbs->curPos(pgd->x, pgd->y);
- pbs->frameNum = curImage;
- }
- }
- }
-
- // unpack the animated bobs
- uint16 curBob = 0;
- for (i = 1; i <= furnitureTotal; ++i) {
- int16 obj = gstate[i];
- if (obj > 0 && obj <= 5000) {
- GraphicData *pgd = &_graphicData[obj];
-
- bool rebound = false;
- int16 lastFrame = pgd->lastFrame;
- if (lastFrame < 0) {
- rebound = true;
- lastFrame = -lastFrame;
- }
-
- if (lastFrame > 0) {
- _numFurnitureAnimatedLen += lastFrame - pgd->firstFrame + 1;
- ++_numFurnitureAnimated;
- uint16 image = curImage + 1;
- int k;
- for (k = pgd->firstFrame; k <= lastFrame; ++k) {
- ++curImage;
- _vm->bankMan()->unpack(k, curImage, 15);
- ++_numFrames;
- }
- BobSlot *pbs = _vm->graphics()->bob(5 + curBob);
- pbs->animNormal(image, curImage, pgd->speed / 4, rebound, false);
- pbs->curPos(pgd->x, pgd->y);
- ++curBob;
- }
- }
- }
-
- // unpack the paste downs
- ++curImage;
- for (i = 1; i <= furnitureTotal; ++i) {
- if (gstate[i] > 5000) {;
- _vm->graphics()->bobPaste(gstate[i] - 5000, curImage);
- }
- }
-}
-
-
-void Logic::roomSetupObjects() {
- uint16 i;
- // furniture frames are reserved in ::roomSetupFurniture(), we append objects
- // frames after the furniture ones.
- uint16 curImage = 36 + FRAMES_JOE_XTRA + _numFurnitureStatic + _numFurnitureAnimatedLen;
- uint16 firstRoomObj = currentRoomData() + 1;
- uint16 lastRoomObj = _roomData[_currentRoom + 1];
- uint16 numObjectStatic = 0;
- uint16 numObjectAnimated = 0;
- uint16 curBob;
-
- // invalidates all Bobs for persons (except Joe's one)
- for (i = 1; i <= 3; ++i) {
- _vm->graphics()->bob(i)->active = false;
- }
-
- // static/animated Bobs
- for (i = firstRoomObj; i <= lastRoomObj; ++i) {
- ObjectData *pod = &_objectData[i];
- // setup blanks bobs for turned off objects (in case
- // you turn them on again)
- if (pod->image == -1) {
- // static OFF Bob
- curBob = 20 + _numFurnitureStatic + numObjectStatic;
- ++numObjectStatic;
- // create a blank frame for the for the OFF object
- ++_numFrames;
- ++curImage;
- } else if(pod->image == -2) {
- // animated OFF Bob
- curBob = 5 + _numFurnitureAnimated + numObjectAnimated;
- ++numObjectAnimated;
- } else if(pod->image > 0 && pod->image < 5000) {
- GraphicData *pgd = &_graphicData[pod->image];
- int16 lastFrame = pgd->lastFrame;
- bool rebound = false;
- if (lastFrame < 0) {
- lastFrame = -lastFrame;
- rebound = true;
- }
- if (pgd->firstFrame < 0) {
- // FIXME: if(TEMPA[1]<0) bobs[CURRBOB].xflip=1;
- curBob = 5 + _numFurnitureAnimated;
- _vm->graphics()->setupObjectAnim(pgd, curImage + 1, curBob + numObjectAnimated, pod->name > 0);
- curImage += pgd->lastFrame;
- ++numObjectAnimated;
- } else if (lastFrame != 0) {
- // animated objects
- uint16 j;
- uint16 firstFrame = curImage + 1;
- for (j = pgd->firstFrame; j <= lastFrame; ++j) {
- ++curImage;
- _vm->bankMan()->unpack(j, curImage, 15);
- ++_numFrames;
- }
- curBob = 5 + _numFurnitureAnimated + numObjectAnimated;
- if (pod->name > 0) {
- BobSlot *pbs = _vm->graphics()->bob(curBob);
- pbs->curPos(pgd->x, pgd->y);
- pbs->frameNum = firstFrame;
- if (pgd->speed > 0) {
- pbs->animNormal(firstFrame, curImage, pgd->speed / 4, rebound, false);
- }
- }
- ++numObjectAnimated;
- } else {
- // static objects
- curBob = 20 + _numFurnitureStatic + numObjectStatic;
- ++curImage;
- _vm->graphics()->bobClear(curBob);
-
- // FIXME: if((COMPANEL==2) && (FULLSCREEN==1)) bobs[CURRBOB].y2=199;
-
- _vm->bankMan()->unpack(pgd->firstFrame, curImage, 15);
- ++_numFrames;
- if (pod->name > 0) {
- BobSlot *pbs = _vm->graphics()->bob(curBob);
- pbs->curPos(pgd->x, pgd->y);
- pbs->frameNum = curImage;
- }
- ++numObjectStatic;
- }
- }
- }
-
- // persons Bobs
- for (i = firstRoomObj; i <= lastRoomObj; ++i) {
- ObjectData *pod = &_objectData[i];
- if (pod->image == -3 || pod->image == -4) {
- debug(6, "Logic::roomSetupObjects() - Setting up person %X, name=%X", i, pod->name);
- uint16 noun = i - currentRoomData();
- if (pod->name > 0) {
- curImage = setupPersonInRoom(noun, curImage);
- } else {
- curImage = countPersonFrames(noun, curImage);
- }
- }
- }
-
- // paste downs list
- ++curImage;
- _numFrames = curImage;
- for (i = firstRoomObj; i <= lastRoomObj; ++i) {
- ObjectData *pod = &_objectData[i];
- if (pod->name > 0 && pod->image > 5000) {
- _vm->graphics()->bobPaste(pod->image - 5000, curImage);
- }
- }
-}
-
-
-uint16 Logic::roomRefreshObject(uint16 obj) {
- uint16 curImage = _numFrames;
-
- if (obj == 0 || obj > _numObjects) {
- warning("Invalid object number %d", obj);
- return curImage;
- }
-
- ObjectData *pod = &_objectData[obj];
- if (pod->image == 0) {
- return curImage;
- }
-
- debug(6, "Logic::roomRefreshObject(%X, %s)", obj, _objName[ABS(pod->name)]);
-
- // check the object is in the current room
- if (pod->room != _currentRoom) {
- debug(6, "Refreshing an object (%i=%s) not in current room (object room=%i, current room=%i)", obj, _objName[ABS(pod->name)], pod->room, _currentRoom);
- return curImage;
- }
-
- // find bob for the object
- uint16 curBob = findBob(obj);
- BobSlot *pbs = _vm->graphics()->bob(curBob);
-
- if (pod->image == -3 || pod->image == -4) {
- // a person object
- if (pod->name <= 0) {
- _vm->graphics()->bobClear(curBob);
- } else {
- // find person number
- uint16 pNum = 1;
- uint16 i = currentRoomData() + 1;
- while (i < obj) {
- if (_objectData[i].image == -3 || _objectData[i].image == -4) {
- ++pNum;
- }
- ++i;
- }
- curImage = _personFrames[pNum] - 1;
- if (_personFrames[pNum] == 0) {
- curImage = _numFrames;
- _personFrames[pNum] = curImage;
- }
- curImage = setupPersonInRoom(obj - currentRoomData(), curImage);
- }
- return curImage;
- }
-
- // find frame used for object
- curImage = findFrame(obj);
-
- if (pod->name < 0 || pod->image < 0) {
- // object is hidden or disabled
- _vm->graphics()->bobClear(curBob);
- return curImage;
- }
-
- int image = pod->image;
- if (image > 5000) {
- image -= 5000;
- }
-
- GraphicData *pgd = &_graphicData[image];
- bool rebound = false;
- int16 lastFrame = pgd->lastFrame;
- if (lastFrame < 0) {
- lastFrame = -lastFrame;
- rebound = true;
- }
- if (pgd->firstFrame < 0) {
- _vm->graphics()->setupObjectAnim(pgd, curImage, curBob, pod->name != 0);
- curImage += pgd->lastFrame - 1;
- } else if (lastFrame != 0) {
- // turn on an animated bob
- _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->bankMan()->unpack(j, curImage, 15);
- }
- pbs->curPos(pgd->x, pgd->y);
- pbs->frameNum = firstImage;
- if (pgd->speed > 0) {
- pbs->animNormal(firstImage, curImage, pgd->speed / 4, rebound, false);
- }
- } else {
- // frame 2 is used as a buffer frame to prevent BOB flickering
- _vm->bankMan()->unpack(pgd->firstFrame, 2, 15);
- _vm->bankMan()->unpack(pgd->firstFrame, curImage, 15);
- pbs->curPos(pgd->x, pgd->y);
- pbs->frameNum = curImage;
- }
-
- return curImage;
-}
-
-
void Logic::roomSetup(const char *room, int comPanel, bool inCutaway) {
// load backdrop image, init dynalum, setup colors
_vm->display()->setupNewRoom(room, _currentRoom);
@@ -813,23 +503,18 @@ void Logic::roomSetup(const char *room, int comPanel, bool inCutaway) {
// setup graphics to enter fullscreen/panel mode
_vm->display()->screenMode(comPanel, inCutaway);
- // reset sprites table (bounding box...)
- _vm->graphics()->bobClearAll();
-
- // load/setup objects associated to this room
- char filename[20];
- sprintf(filename, "%s.BBK", room);
- _vm->bankMan()->load(filename, 15);
-
- _numFrames = 37 + FRAMES_JOE_XTRA;
- roomSetupFurniture();
- roomSetupObjects();
+ _vm->grid()->setupNewRoom(_currentRoom, _roomData[_currentRoom]);
- if (_currentRoom >= 90) {
- _vm->graphics()->putCameraOnBob(0);
+ int16 furn[9];
+ uint16 furnTot = 0;
+ for (uint16 i = 1; i <= _numFurniture; ++i) {
+ if (_furnitureData[i].room == _currentRoom) {
+ ++furnTot;
+ furn[furnTot] = _furnitureData[i].gameStateValue;
+ }
}
+ _vm->graphics()->setupNewRoom(room, _currentRoom, furn, furnTot);
- _vm->grid()->setupNewRoom(_currentRoom, _roomData[_currentRoom]);
_vm->display()->forceFullRefresh();
}
@@ -869,17 +554,11 @@ ActorData *Logic::findActor(uint16 noun, const char *name) {
}
// search Bob number for the person
- uint16 i;
- uint16 bobNum = 0;
- for (i = currentRoomData() + 1; i <= obj; ++i) {
- img = _objectData[i].image;
- if (img == -3 || img == -4) {
- ++bobNum;
- }
- }
+ uint16 bobNum = findPersonNumber(obj);
// search for a matching actor
if (bobNum > 0) {
+ uint16 i;
for (i = 1; i <= _numActors; ++i) {
ActorData *pad = &_actorData[i];
if (pad->room == _currentRoom && gameState(pad->gsSlot) == pad->gsValue) {
@@ -916,50 +595,16 @@ void Logic::initPerson(int16 noun, const char *actorName, bool loadBank, Person
}
-uint16 Logic::setupPersonInRoom(uint16 noun, uint16 curImage) {
- if (noun == 0) {
- warning("Trying to setup person 0");
- return curImage;
- }
-
- Person p;
- initPerson(noun, "", true, &p);
-
- const ActorData *pad = p.actor;
- uint16 scale = 100;
- uint16 a = _vm->grid()->findAreaForPos(GS_ROOM, pad->x, pad->y);
- if (a > 0) {
- // person is not standing in the area box, scale it accordingly
- scale = _vm->grid()->area(_currentRoom, a)->calcScale(pad->y);
- }
-
- _vm->bankMan()->unpack(pad->bobFrameStanding, p.bobFrame, p.actor->bankNum);
- uint16 obj = currentRoomData() + noun;
- BobSlot *pbs = _vm->graphics()->bob(pad->bobNum);
- pbs->curPos(pad->x, pad->y);
- pbs->scale = scale;
- pbs->frameNum = p.bobFrame;
- pbs->xflip = (_objectData[obj].image == -3); // person is facing left
-
- debug(6, "Logic::personSetup(%d, %d) - bob = %d name = %s", noun, curImage, pad->bobNum, p.name);
-
- if (p.anim != NULL) {
- _personFrames[pad->bobNum] = curImage + 1;
- curImage = _vm->graphics()->setupPersonAnim(pad, p.anim, curImage);
- } else {
- _vm->graphics()->erasePersonAnim(pad->bobNum);
- }
- return curImage;
-}
-
-
-uint16 Logic::countPersonFrames(uint16 noun, uint16 curImage) {
- ActorData *pad = findActor(noun);
- if (pad != NULL && pad->anim != 0) {
- curImage += _vm->graphics()->countAnimFrames(_aAnim[pad->anim]);
- _personFrames[pad->bobNum] = curImage + 1;
+uint16 Logic::findPersonNumber(uint16 obj) const {
+ uint16 num = 0;
+ uint16 i;
+ for (i = currentRoomData() + 1; i <= obj; ++i) {
+ int16 img = _objectData[i].image;
+ if (img == -3 || img == -4) {
+ ++num;
+ }
}
- return curImage;
+ return num;
}
@@ -2231,7 +1876,7 @@ void Logic::asmMakeLightningHitPlane() {
lightningBob->y = 0;
// 23/2/95 - Play lightning SFX
- _vm->sound()->playSfx(_vm->logic()->currentRoomSfx());
+ _vm->sound()->playSfx(currentRoomSfx());
_vm->bankMan()->unpack(18, lightningBob->frameNum, 15);
_vm->bankMan()->unpack(4, planeBob ->frameNum, 15);
diff --git a/queen/logic.h b/queen/logic.h
index 1a7df1aa39..778429fcce 100644
--- a/queen/logic.h
+++ b/queen/logic.h
@@ -139,22 +139,15 @@ public:
const char *objectTextualDescription(uint16 objNum) const { return _objDescription[objNum]; }
void roomErase();
- void roomSetupFurniture();
- void roomSetupObjects();
- uint16 roomRefreshObject(uint16 obj);
void roomSetup(const char *room, int comPanel, bool inCutaway);
void roomDisplay(uint16 room, RoomDisplayMode mode, uint16 joeScale, int comPanel, bool inCutaway);
int16 entryObj() const { return _entryObj; }
void entryObj(int16 obj) { _entryObj = obj; }
- uint16 numFrames() const { return _numFrames; }
-
ActorData *findActor(uint16 noun, const char *name = NULL);
void initPerson(int16 noun, const char *actorName, bool loadBank, Person *pp);
- uint16 setupPersonInRoom(uint16 noun, uint16 curImage);
- uint16 countPersonFrames(uint16 noun, uint16 curImage);
- uint16 personFrames(uint16 bobNum) const { return _personFrames[bobNum]; }
+ uint16 findPersonNumber(uint16 obj) const;
void loadJoeBanks(const char *animBank, const char *standBank);
@@ -357,21 +350,6 @@ protected:
int16 _gameState[GAME_STATE_COUNT];
TalkSelected _talkSelected[TALK_SELECTED_COUNT];
-
- //! Number of animated furniture in current room
- uint16 _numFurnitureAnimated;
-
- //! Number of static furniture in current room
- uint16 _numFurnitureStatic;
-
- //! Total number of frames for the animated furniture
- uint16 _numFurnitureAnimatedLen;
-
- //! Current number of frames unpacked
- uint16 _numFrames;
-
- //! Last frame number used for person animation
- uint16 _personFrames[4];
//! Inventory items
int16 _inventoryItem[4];
diff --git a/queen/talk.cpp b/queen/talk.cpp
index 33b2b0bec9..8688f6328d 100644
--- a/queen/talk.cpp
+++ b/queen/talk.cpp
@@ -590,7 +590,7 @@ int Talk::getSpeakCommand(const Person *person, const char *sentence, unsigned &
if (0 == strcmp(person->name, "JOE"))
_vm->walk()->moveJoe(0, x, y, _vm->input()->cutawayRunning());
else
- _vm->walk()->movePerson(person, x, y, _vm->logic()->numFrames(), 0);
+ _vm->walk()->movePerson(person, x, y, _vm->graphics()->numFrames(), 0);
index += 11;
// if(JOEWALK==3) CUTQUIT=0;
// XXX personWalking = true;
@@ -737,9 +737,9 @@ void Talk::headStringAnimation(const SpeechParameters *parameters, int bobNum, i
offset += 4;
- _vm->bankMan()->unpack(frame, _vm->logic()->numFrames(), bankNum);
+ _vm->bankMan()->unpack(frame, _vm->graphics()->numFrames(), bankNum);
- bob2->frameNum = _vm->logic()->numFrames();
+ bob2->frameNum = _vm->graphics()->numFrames();
bob2->scale = 100;
bob2->active = true;
bob2->x = x;
@@ -984,7 +984,7 @@ void Talk::speakSegment(
// Dont turn AMAL animation off, and dont manually anim person
command = SPEAK_ORACLE;
oracle = true;
- uint16 frameNum = _vm->logic()->personFrames(bobNum);
+ uint16 frameNum = _vm->graphics()->personFrames(bobNum);
for (i = 5; i <= 8; ++i) {
_vm->bankMan()->unpack(i, frameNum, bankNum);
++frameNum;
@@ -1111,7 +1111,7 @@ void Talk::speakSegment(
_vm->graphics()->textClear(0,198);
if (oracle) {
- uint16 frameNum = _vm->logic()->personFrames(bobNum);
+ uint16 frameNum = _vm->graphics()->personFrames(bobNum);
for (i = 1; i <= 4; ++i) {
_vm->bankMan()->unpack(i, frameNum, bankNum);
++frameNum;
diff --git a/queen/xref.txt b/queen/xref.txt
index 6251564be6..22fb6eb9a0 100644
--- a/queen/xref.txt
+++ b/queen/xref.txt
@@ -124,6 +124,7 @@ Box() Display::drawBox
CHECK_PARALLAX() Graphics::bobCustomParallax
clearallbobs() Graphics::bobClearAll
clearbob() Graphics::bobClear
+DISP_OBJECTS() Graphics::setupRoomObjects
drawbobs() Graphics::bobDrawAll
invbob() Graphics::bobDrawInventoryItem
loadbackdrop() *not needed* (included in Display::setupNewRoom)
@@ -132,6 +133,7 @@ MAKE_SPEAK_BOB() Graphics::bobSetText
makeanim() BobSlot::animNormal
movebob() BobSlot::move
pastebob() Graphics::bobPaste
+REDISP_OBJECT() Graphics::refreshObject
requestor()
shrinkbob() Graphics::bobShrink
sortbobs() Graphics::bobSortAll
@@ -206,17 +208,15 @@ LOGIC
=====
CHECK_PLAYER() QueenEngine::update
CUTAWAY_SPECIAL() Logic::removeHotelItemsFromInventory
-DISP_OBJECTS() Logic::roomSetupObjects
DISP_ROOM() Logic::roomDisplay
FIND_BOB() Logic::findBob
FIND_FRAME() Logic::findFrame
FIND_GRAPHIC() Logic::graphicData
P3_COPY_FROM() Logic::objectCopy
R_MAP() Logic::handlePinnacleRoom
-REDISP_OBJECT() Logic::roomRefreshObject
restart_game()
SETUP_BOBS() Graphics::bobSetupControl
-SETUP_FURNITURE() Logic::roomSetupFurniture
+SETUP_FURNITURE() Graphics::setupRoomFurniture
SETUP_ROOM() Logic::changeRoom
SETUP_SCREENS() *not needed* (only calls Display::setupPanel)
SETUP_VARS() *not needed* (equivalent to Command::clear(), SCENE=0, clear(gamestate))