diff options
Diffstat (limited to 'engines/sci/graphics/animate.cpp')
-rw-r--r-- | engines/sci/graphics/animate.cpp | 87 |
1 files changed, 39 insertions, 48 deletions
diff --git a/engines/sci/graphics/animate.cpp b/engines/sci/graphics/animate.cpp index c201b2cfb7..71c7b7dd7f 100644 --- a/engines/sci/graphics/animate.cpp +++ b/engines/sci/graphics/animate.cpp @@ -92,10 +92,10 @@ bool GfxAnimate::invoke(List *list, int argc, reg_t *argv) { } } - signal = readSelectorValue(_s->_segMan, curObject, SELECTOR(signal)); + signal = GET_SEL32V(_s->_segMan, curObject, SELECTOR(signal)); if (!(signal & kSignalFrozen)) { // Call .doit method of that object - invokeSelector(_s, curObject, g_sci->getKernel()->_selectorCache.doit, kContinueOnInvalidSelector, argc, argv, 0); + invoke_selector(_s, curObject, g_sci->getKernel()->_selectorCache.doit, kContinueOnInvalidSelector, argc, argv, 0); // Lookup node again, since the nodetable it was in may have been reallocated curNode = _s->_segMan->lookupNode(curAddress); } @@ -109,15 +109,7 @@ bool GfxAnimate::invoke(List *list, int argc, reg_t *argv) { } bool sortHelper(const AnimateEntry* entry1, const AnimateEntry* entry2) { - if (entry1->y == entry2->y) { - // if both y and z are the same, use the order we were given originally - // this is needed for special cases like iceman room 35 - if (entry1->z == entry2->z) - return entry1->givenOrderNo < entry2->givenOrderNo; - else - return entry1->z < entry2->z; - } - return entry1->y < entry2->y; + return (entry1->y == entry2->y) ? (entry1->z < entry2->z) : (entry1->y < entry2->y); } void GfxAnimate::makeSortedList(List *list) { @@ -164,22 +156,21 @@ void GfxAnimate::makeSortedList(List *list) { listEntry->object = curObject; // Get data from current object - listEntry->givenOrderNo = listNr; - listEntry->viewId = readSelectorValue(_s->_segMan, curObject, SELECTOR(view)); - listEntry->loopNo = readSelectorValue(_s->_segMan, curObject, SELECTOR(loop)); - listEntry->celNo = readSelectorValue(_s->_segMan, curObject, SELECTOR(cel)); - listEntry->paletteNo = readSelectorValue(_s->_segMan, curObject, SELECTOR(palette)); - listEntry->x = readSelectorValue(_s->_segMan, curObject, SELECTOR(x)); - listEntry->y = readSelectorValue(_s->_segMan, curObject, SELECTOR(y)); - listEntry->z = readSelectorValue(_s->_segMan, curObject, SELECTOR(z)); - listEntry->priority = readSelectorValue(_s->_segMan, curObject, SELECTOR(priority)); - listEntry->signal = readSelectorValue(_s->_segMan, curObject, SELECTOR(signal)); + listEntry->viewId = GET_SEL32V(_s->_segMan, curObject, SELECTOR(view)); + listEntry->loopNo = GET_SEL32V(_s->_segMan, curObject, SELECTOR(loop)); + listEntry->celNo = GET_SEL32V(_s->_segMan, curObject, SELECTOR(cel)); + listEntry->paletteNo = GET_SEL32V(_s->_segMan, curObject, SELECTOR(palette)); + listEntry->x = GET_SEL32V(_s->_segMan, curObject, SELECTOR(x)); + listEntry->y = GET_SEL32V(_s->_segMan, curObject, SELECTOR(y)); + listEntry->z = GET_SEL32V(_s->_segMan, curObject, SELECTOR(z)); + listEntry->priority = GET_SEL32V(_s->_segMan, curObject, SELECTOR(priority)); + listEntry->signal = GET_SEL32V(_s->_segMan, curObject, SELECTOR(signal)); if (getSciVersion() >= SCI_VERSION_1_1) { // Cel scaling - listEntry->scaleSignal = readSelectorValue(_s->_segMan, curObject, SELECTOR(scaleSignal)); + listEntry->scaleSignal = GET_SEL32V(_s->_segMan, curObject, SELECTOR(scaleSignal)); if (listEntry->scaleSignal & kScaleSignalDoScaling) { - listEntry->scaleX = readSelectorValue(_s->_segMan, curObject, SELECTOR(scaleX)); - listEntry->scaleY = readSelectorValue(_s->_segMan, curObject, SELECTOR(scaleY)); + listEntry->scaleX = GET_SEL32V(_s->_segMan, curObject, SELECTOR(scaleX)); + listEntry->scaleY = GET_SEL32V(_s->_segMan, curObject, SELECTOR(scaleY)); } else { listEntry->scaleX = 128; listEntry->scaleY = 128; @@ -228,11 +219,11 @@ void GfxAnimate::fill(byte &old_picNotValid) { // adjust loop and cel, if any of those is invalid if (listEntry->loopNo >= view->getLoopCount()) { listEntry->loopNo = 0; - writeSelectorValue(_s->_segMan, curObject, SELECTOR(loop), listEntry->loopNo); + PUT_SEL32V(_s->_segMan, curObject, SELECTOR(loop), listEntry->loopNo); } if (listEntry->celNo >= view->getCelCount(listEntry->loopNo)) { listEntry->celNo = 0; - writeSelectorValue(_s->_segMan, curObject, SELECTOR(cel), listEntry->celNo); + PUT_SEL32V(_s->_segMan, curObject, SELECTOR(cel), listEntry->celNo); } // Create rect according to coordinates and given cel @@ -241,17 +232,17 @@ void GfxAnimate::fill(byte &old_picNotValid) { } else { view->getCelRect(listEntry->loopNo, listEntry->celNo, listEntry->x, listEntry->y, listEntry->z, &listEntry->celRect); } - writeSelectorValue(_s->_segMan, curObject, SELECTOR(nsLeft), listEntry->celRect.left); - writeSelectorValue(_s->_segMan, curObject, SELECTOR(nsTop), listEntry->celRect.top); - writeSelectorValue(_s->_segMan, curObject, SELECTOR(nsRight), listEntry->celRect.right); - writeSelectorValue(_s->_segMan, curObject, SELECTOR(nsBottom), listEntry->celRect.bottom); + PUT_SEL32V(_s->_segMan, curObject, SELECTOR(nsLeft), listEntry->celRect.left); + PUT_SEL32V(_s->_segMan, curObject, SELECTOR(nsTop), listEntry->celRect.top); + PUT_SEL32V(_s->_segMan, curObject, SELECTOR(nsRight), listEntry->celRect.right); + PUT_SEL32V(_s->_segMan, curObject, SELECTOR(nsBottom), listEntry->celRect.bottom); signal = listEntry->signal; // Calculate current priority according to y-coordinate if (!(signal & kSignalFixedPriority)) { listEntry->priority = _ports->kernelCoordinateToPriority(listEntry->y); - writeSelectorValue(_s->_segMan, curObject, SELECTOR(priority), listEntry->priority); + PUT_SEL32V(_s->_segMan, curObject, SELECTOR(priority), listEntry->priority); } if (signal & kSignalNoUpdate) { @@ -291,14 +282,14 @@ void GfxAnimate::update() { if (signal & kSignalNoUpdate) { if (!(signal & kSignalRemoveView)) { - bitsHandle = readSelector(_s->_segMan, curObject, SELECTOR(underBits)); + bitsHandle = GET_SEL32(_s->_segMan, curObject, SELECTOR(underBits)); if (_screen->_picNotValid != 1) { _paint16->bitsRestore(bitsHandle); listEntry->showBitsFlag = true; } else { _paint16->bitsFree(bitsHandle); } - writeSelectorValue(_s->_segMan, curObject, SELECTOR(underBits), 0); + PUT_SEL32V(_s->_segMan, curObject, SELECTOR(underBits), 0); } signal &= 0xFFFF ^ kSignalForceUpdate; signal &= signal & kSignalViewUpdated ? 0xFFFF ^ (kSignalViewUpdated | kSignalNoUpdate) : 0xFFFF; @@ -348,7 +339,7 @@ void GfxAnimate::update() { bitsHandle = _paint16->bitsSave(listEntry->celRect, GFX_SCREEN_MASK_VISUAL|GFX_SCREEN_MASK_PRIORITY); else bitsHandle = _paint16->bitsSave(listEntry->celRect, GFX_SCREEN_MASK_ALL); - writeSelector(_s->_segMan, curObject, SELECTOR(underBits), bitsHandle); + PUT_SEL32(_s->_segMan, curObject, SELECTOR(underBits), bitsHandle); } listEntry->signal = signal; } @@ -396,7 +387,7 @@ void GfxAnimate::drawCels() { if (!(signal & (kSignalNoUpdate | kSignalHidden | kSignalAlwaysUpdate))) { // Save background bitsHandle = _paint16->bitsSave(listEntry->celRect, GFX_SCREEN_MASK_ALL); - writeSelector(_s->_segMan, curObject, SELECTOR(underBits), bitsHandle); + PUT_SEL32(_s->_segMan, curObject, SELECTOR(underBits), bitsHandle); // draw corresponding cel _paint16->drawCel(listEntry->viewId, listEntry->loopNo, listEntry->celNo, listEntry->celRect, listEntry->priority, listEntry->paletteNo, listEntry->scaleX, listEntry->scaleY); @@ -432,10 +423,10 @@ void GfxAnimate::updateScreen(byte oldPicNotValid) { if (listEntry->showBitsFlag || !(signal & (kSignalRemoveView | kSignalNoUpdate) || (!(signal & kSignalRemoveView) && (signal & kSignalNoUpdate) && oldPicNotValid))) { - lsRect.left = readSelectorValue(_s->_segMan, curObject, SELECTOR(lsLeft)); - lsRect.top = readSelectorValue(_s->_segMan, curObject, SELECTOR(lsTop)); - lsRect.right = readSelectorValue(_s->_segMan, curObject, SELECTOR(lsRight)); - lsRect.bottom = readSelectorValue(_s->_segMan, curObject, SELECTOR(lsBottom)); + lsRect.left = GET_SEL32V(_s->_segMan, curObject, SELECTOR(lsLeft)); + lsRect.top = GET_SEL32V(_s->_segMan, curObject, SELECTOR(lsTop)); + lsRect.right = GET_SEL32V(_s->_segMan, curObject, SELECTOR(lsRight)); + lsRect.bottom = GET_SEL32V(_s->_segMan, curObject, SELECTOR(lsBottom)); workerRect = lsRect; workerRect.clip(listEntry->celRect); @@ -447,10 +438,10 @@ void GfxAnimate::updateScreen(byte oldPicNotValid) { _paint16->bitsShow(lsRect); workerRect = listEntry->celRect; } - writeSelectorValue(_s->_segMan, curObject, SELECTOR(lsLeft), workerRect.left); - writeSelectorValue(_s->_segMan, curObject, SELECTOR(lsTop), workerRect.top); - writeSelectorValue(_s->_segMan, curObject, SELECTOR(lsRight), workerRect.right); - writeSelectorValue(_s->_segMan, curObject, SELECTOR(lsBottom), workerRect.bottom); + PUT_SEL32V(_s->_segMan, curObject, SELECTOR(lsLeft), workerRect.left); + PUT_SEL32V(_s->_segMan, curObject, SELECTOR(lsTop), workerRect.top); + PUT_SEL32V(_s->_segMan, curObject, SELECTOR(lsRight), workerRect.right); + PUT_SEL32V(_s->_segMan, curObject, SELECTOR(lsBottom), workerRect.bottom); _paint16->bitsShow(workerRect); if (signal & kSignalHidden) { @@ -481,7 +472,7 @@ void GfxAnimate::restoreAndDelete(int argc, reg_t *argv) { signal = listEntry->signal; // Finally update signal - writeSelectorValue(_s->_segMan, curObject, SELECTOR(signal), signal); + PUT_SEL32V(_s->_segMan, curObject, SELECTOR(signal), signal); listIterator++; } @@ -490,16 +481,16 @@ void GfxAnimate::restoreAndDelete(int argc, reg_t *argv) { listEntry = *listIterator; curObject = listEntry->object; // We read out signal here again, this is not by accident but to ensure that we got an up-to-date signal - signal = readSelectorValue(_s->_segMan, curObject, SELECTOR(signal)); + signal = GET_SEL32V(_s->_segMan, curObject, SELECTOR(signal)); if ((signal & (kSignalNoUpdate | kSignalRemoveView)) == 0) { - _paint16->bitsRestore(readSelector(_s->_segMan, curObject, SELECTOR(underBits))); - writeSelectorValue(_s->_segMan, curObject, SELECTOR(underBits), 0); + _paint16->bitsRestore(GET_SEL32(_s->_segMan, curObject, SELECTOR(underBits))); + PUT_SEL32V(_s->_segMan, curObject, SELECTOR(underBits), 0); } if (signal & kSignalDisposeMe) { // Call .delete_ method of that object - invokeSelector(_s, curObject, g_sci->getKernel()->_selectorCache.delete_, kContinueOnInvalidSelector, argc, argv, 0); + invoke_selector(_s, curObject, g_sci->getKernel()->_selectorCache.delete_, kContinueOnInvalidSelector, argc, argv, 0); } listIterator--; } |