diff options
author | Gregory Montoir | 2003-10-15 08:46:18 +0000 |
---|---|---|
committer | Gregory Montoir | 2003-10-15 08:46:18 +0000 |
commit | ce468f9e1f83549841f192270faae4637d7f9f44 (patch) | |
tree | 2fbc4ecb77df22cb316b47ea6fcbf9465f6bd646 /queen | |
parent | 8c0496194a19bc7e2f8e974863b94d7785b1fad5 (diff) | |
download | scummvm-rg350-ce468f9e1f83549841f192270faae4637d7f9f44.tar.gz scummvm-rg350-ce468f9e1f83549841f192270faae4637d7f9f44.tar.bz2 scummvm-rg350-ce468f9e1f83549841f192270faae4637d7f9f44.zip |
DISP_ROOM/REDISP_OBJ() implementation (still missing GRAPHIC_ANIM stuff)
svn-id: r10808
Diffstat (limited to 'queen')
-rw-r--r-- | queen/logic.cpp | 169 | ||||
-rw-r--r-- | queen/logic.h | 1 | ||||
-rw-r--r-- | queen/structs.h | 2 |
3 files changed, 163 insertions, 9 deletions
diff --git a/queen/logic.cpp b/queen/logic.cpp index ec3d206c12..5fd938c870 100644 --- a/queen/logic.cpp +++ b/queen/logic.cpp @@ -864,10 +864,10 @@ void Logic::roomSetupObjects() { // static/animated Bobs for (i = firstRoomObj; i <= lastRoomObj; ++i) { - int16 obj = _objectData[i].image; + ObjectData *pod = &_objectData[i]; // setup blanks bobs for turned off objects (in case // you turn them on again) - if (obj == -1) { + if (pod->image == -1) { // static OFF Bob curBob = 20 + _numFurnitureStatic + numObjectStatic; ++numObjectStatic; @@ -875,16 +875,66 @@ void Logic::roomSetupObjects() { ++_numFrames; ++curImage; } - else if(obj == -2) { + else if(pod->image == -2) { // animated OFF Bob curBob = 5 + _numFurnitureAnimated + numObjectAnimated; ++numObjectAnimated; } - else if(obj > 0 && obj < 5000) { - // FIXME: need GRAPHIC_ANIM stuff - warning("Logic::roomSetupObjects() - Object number %d not handled", obj); - } + 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: need GRAPHIC_ANIM stuff + // see queen.c l.1251-1296 + warning("Logic::roomSetupObjects() - Object number %d not handled", pod->image); + } + else if (lastFrame != 0) { + // animated objects + uint16 j; + uint16 firstFrame = curImage + 1; + for (j = pgd->firstFrame; j <= lastFrame; ++j) { + ++curImage; + _graphics->bankUnpack(j, curImage, 15); + ++_numFrames; + } + curBob = 5 + _numFurnitureAnimated + numObjectAnimated; + if (pod->name > 0) { + BobSlot *pbs = _graphics->bob(curBob); + pbs->active = true; + pbs->x = pgd->x; + pbs->y = pgd->y; + pbs->frameNum = firstFrame; + if (pgd->speed > 0) { + _graphics->bobAnimNormal(curBob, firstFrame, curImage, pgd->speed / 4, rebound, false); + } + } + ++numObjectAnimated; + } + else { + // static objects + curBob = 20 + _numFurnitureStatic + numObjectStatic; + ++curImage; + _graphics->bobClear(curBob); + + // FIXME: if((COMPANEL==2) && (FULLSCREEN==1)) bobs[CURRBOB].y2=199; + _graphics->bankUnpack(pgd->firstFrame, curImage, 15); + ++_numFrames; + if (pod->name > 0) { + BobSlot *pbs = _graphics->bob(curBob); + pbs->active = true; + pbs->x = pgd->x; + pbs->y = pgd->y; + pbs->frameNum = curImage; + } + ++numObjectStatic; + } + } } // persons Bobs @@ -917,6 +967,105 @@ void Logic::roomSetupObjects() { } +uint16 Logic::roomRefreshObject(uint16 obj) { + warning("Logic::roomSetupObjects() not fully implemented"); + uint16 curImage = _numFrames; + + ObjectData *pod = &_objectData[obj]; + if (pod->image == 0) { + return curImage; + } + + // check the object is in the current room + if (pod->room != _currentRoom) { + warning("Logic::roomRefreshObject() - Trying to display an object that is not in room"); + return curImage; + } + + // find bob for the object + uint16 curBob = findBob(obj); + BobSlot *pbs = _graphics->bob(curBob); + + if (pod->image == -3 || pod->image == -4) { + // a person object + if (pod->name < 0) { + _graphics->bobClear(curBob); + } + else { + // find person number + uint16 pNum = 1; + uint16 i = _roomData[_currentRoom] + 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 = personSetup(obj - _roomData[_currentRoom], curImage); + } + return curImage; + } + + if (pod->name < 0 || pod->image < 0) { + // object is hidden or disabled + _graphics->bobClear(curBob); + return curImage; + } + + // find frame used for object + curImage = findFrame(obj); + + if (pod->image > 5000) { + GraphicData *pgd = &_graphicData[pod->image - 5000]; + bool rebound = false; + int16 lastFrame = pgd->lastFrame; + if (lastFrame < 0) { + lastFrame = -lastFrame; + rebound = true; + } + if (pgd->firstFrame) { + // FIXME: need GRAPHIC_ANIM stuff + // see queen.c l.944-981 + warning("Logic::roomRefreshObject() - Object number %d not handled", obj); + } + else if (lastFrame != 0) { + // turn on an animated bob + _graphics->bankUnpack(pgd->firstFrame, 2, 15); + pbs->animating = false; + uint16 firstFrame = curImage; + --curImage; + uint16 j; + for (j = pgd->firstFrame; j <= lastFrame; ++j) { + ++curImage; + _graphics->bankUnpack(j, curImage, 15); + } + pbs->active = true; + pbs->x = pgd->x; + pbs->y = pgd->y; + pbs->frameNum = firstFrame; + if (pgd->speed > 0) { + _graphics->bobAnimNormal(curBob, firstFrame, curImage, pgd->speed / 4, rebound, false); + } + } + else { + // frame 2 is used as a buffer frame to prevent BOB flickering + _graphics->bankUnpack(pgd->firstFrame, 2, 15); + _graphics->bankUnpack(pgd->firstFrame, curImage, 15); + pbs->active = true; + pbs->x = pgd->x; + pbs->y = pgd->y; + pbs->frameNum = curImage; + } + } + return curImage; +} + + void Logic::roomSetup(const char* room, int comPanel, bool inCutaway) { // loads background image @@ -1202,6 +1351,11 @@ void Logic::animErase(uint16 bobNum) { StateDirection Logic::findStateDirection(uint16 state) { + + // FIXME: may be we should return a DIR_* constant instead + // of a STATE_DIR_*. Some (all ?) calls to FIND_STATE(, "DIR") + // are often followed by a DIR_* constant. + // see queen.c l.4016-4023 StateDirection sd = STATE_DIR_BACK; switch ((state >> 2) & 3) { @@ -1371,6 +1525,5 @@ uint16 Logic::joeFace() { } - } // End of namespace Queen diff --git a/queen/logic.h b/queen/logic.h index 05ecd96105..36fe5eb133 100644 --- a/queen/logic.h +++ b/queen/logic.h @@ -109,6 +109,7 @@ public: void roomErase(); void roomSetupFurniture(); // SETUP_FURNITURE() void roomSetupObjects(); // DISP_OBJECTS + uint16 roomRefreshObject(uint16 obj); // REDISP_OBJECT void roomSetup(const char* room, int comPanel, bool inCutaway); void roomDisplay(const char* room, RoomDisplayMode mode, uint16 joeScale, int comPanel, bool inCutaway); // DISP_ROOM diff --git a/queen/structs.h b/queen/structs.h index 21bc44bacd..dc314dff1d 100644 --- a/queen/structs.h +++ b/queen/structs.h @@ -120,7 +120,7 @@ struct GraphicData { struct ObjectData { - //! entry in OBJECT_NAME + //! entry in OBJECT_NAME (<0: object is hidden) int16 name; //! coordinates of object uint16 x, y; |