diff --git a/engines/prince/animation.cpp b/engines/prince/animation.cpp index c27505735e4e..e2197c22f25d 100644 --- a/engines/prince/animation.cpp +++ b/engines/prince/animation.cpp @@ -68,12 +68,12 @@ int16 Animation::getLoopCount() const { } // AH_Fazy -uint Animation::getPhaseCount() const { +int32 Animation::getPhaseCount() const { return READ_LE_UINT16(_data + 4); } // AH_Ramki -uint Animation::getFrameCount() const { +int32 Animation::getFrameCount() const { return READ_LE_UINT16(_data + 6); } @@ -113,7 +113,7 @@ int16 Animation::getFrameHeight(uint frameIndex) const { return READ_LE_UINT16(frameData + 2); } -Graphics::Surface *Animation::getFrame(uint frameIndex) { +Graphics::Surface *Animation::getFrame(uint frameIndex, int i, int phase) { byte *frameData = _data + READ_LE_UINT32(_data + 16 + frameIndex * 4); int16 width = READ_LE_UINT16(frameData + 0); int16 height = READ_LE_UINT16(frameData + 2); @@ -132,6 +132,7 @@ Graphics::Surface *Animation::getFrame(uint frameIndex) { } free(ddata); } else { + debug("nr: %d, phase: %d", i, phase); // Uncompressed for (uint16 i = 0; i < height; i++) { memcpy(surf->getBasePtr(0, i), frameData + 4 + width * i, width); diff --git a/engines/prince/animation.h b/engines/prince/animation.h index d5b5938ce070..03ea220c9158 100644 --- a/engines/prince/animation.h +++ b/engines/prince/animation.h @@ -40,12 +40,12 @@ class Animation { int16 getLoopCount() const; int16 getBaseX() const; int16 getBaseY() const; - uint getPhaseCount() const; - uint getFrameCount() const; + int32 getPhaseCount() const; + int32 getFrameCount() const; int16 getPhaseOffsetX(uint phaseIndex) const; int16 getPhaseOffsetY(uint phaseIndex) const; int16 getPhaseFrameIndex(uint phaseIndex) const; - Graphics::Surface *getFrame(uint frameIndex); + Graphics::Surface *getFrame(uint frameIndex, int i, int phase); int16 getFrameWidth(uint frameIndex) const; int16 getFrameHeight(uint frameIndex) const; int16 getZoom(uint16 offset) const; diff --git a/engines/prince/hero.cpp b/engines/prince/hero.cpp index 58f729a73e81..37b9679dbc49 100644 --- a/engines/prince/hero.cpp +++ b/engines/prince/hero.cpp @@ -80,7 +80,7 @@ bool Hero::loadAnimSet(uint32 animSetNr) { Graphics::Surface *Hero::getSurface() { if (_moveSet[_moveSetType]) { int16 phaseFrameIndex = _moveSet[_moveSetType]->getPhaseFrameIndex(_phase); - Graphics::Surface *heroFrame = _moveSet[_moveSetType]->getFrame(phaseFrameIndex); + Graphics::Surface *heroFrame = _moveSet[_moveSetType]->getFrame(phaseFrameIndex, 0, 0); return heroFrame; } return NULL; diff --git a/engines/prince/prince.cpp b/engines/prince/prince.cpp index 73789efedb30..c631038fe8d4 100644 --- a/engines/prince/prince.cpp +++ b/engines/prince/prince.cpp @@ -619,6 +619,16 @@ void PrinceEngine::keyHandler(Common::Event event) { case Common::KEYCODE_l: _mainHero->_middleX += 5; break; + case Common::KEYCODE_EQUALS: + if (_debugger->_locationNr > 1) { + _debugger->_locationNr--; + } + break; + case Common::KEYCODE_BACKSPACE: + if (_debugger->_locationNr < 43) { + _debugger->_locationNr++; + } + break; } } @@ -741,9 +751,10 @@ void PrinceEngine::showBackAnims() { for (uint i = 0; i < _backAnimList.size(); i++) { int activeSubAnim = _backAnimList[i]._seq._currRelative; - if (_backAnimList[i].backAnims[activeSubAnim]._state == 0 && _backAnimList[i]._seq._type != 2 && _backAnimList[i]._seq._type != 3 && _backAnimList[i]._seq._type != 4) { //TEMP + if (_backAnimList[i].backAnims[activeSubAnim]._state == 0 && _backAnimList[i]._seq._type != 0 && _backAnimList[i]._seq._type != 1 && _backAnimList[i]._seq._type != 3 && _backAnimList[i]._seq._type != 4) { //TEMP _backAnimList[i]._seq._counter++; + /* if (_backAnimList[i]._seq._type == 2) { if (_backAnimList[i]._seq._currRelative == 0) { if (_backAnimList[i]._seq._counter >= _backAnimList[i]._seq._data) { @@ -751,6 +762,68 @@ void PrinceEngine::showBackAnims() { } } } + */ + if (_backAnimList[i]._seq._type == 2) { + //not_type_1 + if (_backAnimList[i]._seq._currRelative == 0) { + //zero + debug("counter: %d, data: %d", _backAnimList[i]._seq._counter, _backAnimList[i]._seq._data); + if (_backAnimList[i]._seq._counter >= _backAnimList[i]._seq._data) { + if (_backAnimList[i]._seq._anims > 2) { + int rnd = _randomSource.getRandomNumber(_backAnimList[i]._seq._anims - 2); //? + rnd++; + //debug("rnd: %d", rnd); + _backAnimList[i]._seq._currRelative = rnd; + _backAnimList[i]._seq._current = rnd; // or nr of animation from lst + activeSubAnim = rnd; + } + //only_1_type_2 + //SetBackAnim + int start = _backAnimList[i].backAnims[activeSubAnim]._basaData._start; + if (start != -1) { + _backAnimList[i].backAnims[activeSubAnim]._frame = start; + _backAnimList[i].backAnims[activeSubAnim]._showFrame = start; + _backAnimList[i].backAnims[activeSubAnim]._loopFrame = start; + } + int end = _backAnimList[i].backAnims[activeSubAnim]._basaData._end; + if (end != -1) { + _backAnimList[i].backAnims[activeSubAnim]._lastFrame = end; + } + _backAnimList[i]._seq._counter = 0; + _backAnimList[i].backAnims[activeSubAnim]._state = 0; + //show_bugger + if (_backAnimList[i].backAnims[activeSubAnim]._frame < _backAnimList[i].backAnims[activeSubAnim]._animData->getPhaseCount() - 1) { + _backAnimList[i].backAnims[activeSubAnim]._frame++; + } + //not_end + } + } else { + /* + _backAnimList[i]._seq._currRelative = 0; + _backAnimList[i]._seq._current = 0; // or nr of animation from lst + activeSubAnim = 0; + //only_1_type_1 + //SetBackAnim + int start = _backAnimList[i].backAnims[activeSubAnim]._basaData._start; + if (start != -1) { + _backAnimList[i].backAnims[activeSubAnim]._frame = start; + _backAnimList[i].backAnims[activeSubAnim]._showFrame = start; + _backAnimList[i].backAnims[activeSubAnim]._loopFrame = start; + } + int end = _backAnimList[i].backAnims[activeSubAnim]._basaData._end; + if (end != -1) { + _backAnimList[i].backAnims[activeSubAnim]._lastFrame = end; + } + _backAnimList[i]._seq._counter = 0; + _backAnimList[i].backAnims[activeSubAnim]._state = 0; + //show_bugger + if (_backAnimList[i].backAnims[activeSubAnim]._frame < _backAnimList[i].backAnims[activeSubAnim]._animData->getPhaseCount() - 1) { + _backAnimList[i].backAnims[activeSubAnim]._frame++; + } + //not_end + */ + } + } //not_type_2_1: if (_backAnimList[i]._seq._type == 3) { @@ -778,13 +851,14 @@ void PrinceEngine::showBackAnims() { } //not_type_3_1: //show_bugger + debug("lastFrame: %d", _backAnimList[i].backAnims[activeSubAnim]._lastFrame); if (_backAnimList[i].backAnims[activeSubAnim]._frame == _backAnimList[i].backAnims[activeSubAnim]._lastFrame - 1) { // TEST //loop_back_anim _backAnimList[i].backAnims[activeSubAnim]._frame = _backAnimList[i].backAnims[activeSubAnim]._loopFrame; //change_back_anim if (_backAnimList[i]._seq._type == 0) { //show_bugger - if (_backAnimList[i].backAnims[activeSubAnim]._animData->getPhaseCount() > 1) { + if (_backAnimList[i].backAnims[activeSubAnim]._frame < _backAnimList[i].backAnims[activeSubAnim]._animData->getPhaseCount() - 1) { _backAnimList[i].backAnims[activeSubAnim]._frame++; } //not_end @@ -792,7 +866,7 @@ void PrinceEngine::showBackAnims() { //repeat_rnd if (_backAnimList[i]._seq._anims <= 1) { //show_bugger - if (_backAnimList[i].backAnims[activeSubAnim]._animData->getPhaseCount() > 1) { + if (_backAnimList[i].backAnims[activeSubAnim]._frame < _backAnimList[i].backAnims[activeSubAnim]._animData->getPhaseCount() - 1) { _backAnimList[i].backAnims[activeSubAnim]._frame++; } //not_end @@ -820,52 +894,44 @@ void PrinceEngine::showBackAnims() { _backAnimList[i]._seq._counter = 0; _backAnimList[i].backAnims[activeSubAnim]._state = 0; //show_bugger - if (_backAnimList[i].backAnims[activeSubAnim]._animData->getPhaseCount() > 1) { + if (_backAnimList[i].backAnims[activeSubAnim]._frame < _backAnimList[i].backAnims[activeSubAnim]._animData->getPhaseCount() - 1) { _backAnimList[i].backAnims[activeSubAnim]._frame++; } //not_end } } else if (_backAnimList[i]._seq._type == 2) { - //not_type_1 - if (_backAnimList[i]._seq._currRelative == 0) { - //zero - if (_backAnimList[i]._seq._counter < _backAnimList[i]._seq._data) { - //show_bugger - _backAnimList[i].backAnims[activeSubAnim]._frame++; - //not_end - } else { - if (_backAnimList[i]._seq._anims > 2) { //?? - int rnd = _randomSource.getRandomNumber(_backAnimList[i]._seq._anims - 2); //? - rnd++; - //debug("rnd: %d", rnd); - _backAnimList[i]._seq._currRelative = rnd; - _backAnimList[i]._seq._current = rnd; // or nr of animation from lst - activeSubAnim = rnd; - } - //only_1_type_2 - } - } else { + if (_backAnimList[i]._seq._currRelative != 0) { _backAnimList[i]._seq._currRelative = 0; _backAnimList[i]._seq._current = 0; // or nr of animation from lst activeSubAnim = 0; //only_1_type_1 - } - //SetBackAnim - int start = _backAnimList[i].backAnims[activeSubAnim]._basaData._start; - if (start != -1) { - _backAnimList[i].backAnims[activeSubAnim]._frame = start; - _backAnimList[i].backAnims[activeSubAnim]._showFrame = start; - _backAnimList[i].backAnims[activeSubAnim]._loopFrame = start; - } - int end = _backAnimList[i].backAnims[activeSubAnim]._basaData._end; - if (end != -1) { - _backAnimList[i].backAnims[activeSubAnim]._lastFrame = end; - } - _backAnimList[i]._seq._counter = 0; - _backAnimList[i].backAnims[activeSubAnim]._state = 0; - //show_bugger - _backAnimList[i].backAnims[activeSubAnim]._frame++; - //not_end + //SetBackAnim + int start = _backAnimList[i].backAnims[activeSubAnim]._basaData._start; + if (start != -1) { + _backAnimList[i].backAnims[activeSubAnim]._frame = start; + _backAnimList[i].backAnims[activeSubAnim]._showFrame = start; + _backAnimList[i].backAnims[activeSubAnim]._loopFrame = start; + } + int end = _backAnimList[i].backAnims[activeSubAnim]._basaData._end; + if (end != -1) { + _backAnimList[i].backAnims[activeSubAnim]._lastFrame = end; + } + _backAnimList[i]._seq._counter = 0; + _backAnimList[i].backAnims[activeSubAnim]._state = 0; + /* + //show_bugger + if (_backAnimList[i].backAnims[activeSubAnim]._frame < _backAnimList[i].backAnims[activeSubAnim]._animData->getPhaseCount() - 1) { + _backAnimList[i].backAnims[activeSubAnim]._frame++; + } + //not_end + */ + } /*else if (_backAnimList[i]._seq._counter < _backAnimList[i]._seq._data) { + //show_bugger + if (_backAnimList[i].backAnims[activeSubAnim]._frame < _backAnimList[i].backAnims[activeSubAnim]._animData->getPhaseCount() - 1) { + _backAnimList[i].backAnims[activeSubAnim]._frame++; + } + //not_end + }*/ } else if (_backAnimList[i]._seq._type == 3) { //not_type_2 _backAnimList[i]._seq._currRelative = 0; @@ -895,6 +961,9 @@ void PrinceEngine::showBackAnims() { //debug("frameCount: %d", frameCount); //debug("phaseCount: %d", phaseCount); int phase = _backAnimList[i].backAnims[activeSubAnim]._showFrame; + if (phase < 0) { + debug("phase < 0"); + } if (phase >= phaseCount) { debug("p >= pC: i-%d, activ-%d, phase-%d, phaseC-%d", i, activeSubAnim, phase, phaseCount); debug("type: %d", _backAnimList[i]._seq._type); @@ -908,17 +977,39 @@ void PrinceEngine::showBackAnims() { debug("pFrameIndex2: i-%d, activ-%d, phaseFrInd-%d, frameC-%d", i, activeSubAnim, phaseFrameIndex, frameCount); debug("type: %d", _backAnimList[i]._seq._type); } - Graphics::Surface *backAnimSurface = _backAnimList[i].backAnims[activeSubAnim]._animData->getFrame(phaseFrameIndex); //still out of bounds + int x = _backAnimList[i].backAnims[activeSubAnim]._x + _backAnimList[i].backAnims[activeSubAnim]._animData->getPhaseOffsetX(phase); int y = _backAnimList[i].backAnims[activeSubAnim]._y + _backAnimList[i].backAnims[activeSubAnim]._animData->getPhaseOffsetY(phase); - //debug("x: %d", x); - //debug("picWindowX: %d", _picWindowX); - //if (x >= _picWindowX) { // || x - _picWindowX + _backAnimList[i].backAnims[activeSubAnim]._animData->getPhaseOffsetX(frame) >= 0 ?? - showSprite(backAnimSurface, x, y); - //} - backAnimSurface->free(); - delete backAnimSurface; + if (x != 0 || y != 0 || phaseCount != 1 || frameCount != 1) { // fix for room no. 5 - animation 8 (propably unnecessary anim) + Graphics::Surface *backAnimSurface = _backAnimList[i].backAnims[activeSubAnim]._animData->getFrame(phaseFrameIndex, i, phase); //still out of bounds + + //debug("x: %d", x); + //debug("picWindowX: %d", _picWindowX); + //if (x >= _picWindowX) { // || x - _picWindowX + _backAnimList[i].backAnims[activeSubAnim]._animData->getPhaseOffsetX(frame) >= 0 ?? + showSprite(backAnimSurface, x, y); + //} + backAnimSurface->free(); + delete backAnimSurface; + + //if (_backAnimList[i].backAnims[activeSubAnim]._lastFrame == 1) { + debug("nr: %d, phase: %d, frame: %d", i, phase, phaseFrameIndex); + debug("phaseCount: %d, frameCount: %d, lastFrame: %d", phaseCount, frameCount, _backAnimList[i].backAnims[activeSubAnim]._lastFrame); + //debug("x: %d", _backAnimList[i].backAnims[activeSubAnim]._x); + //debug("y: %d", _backAnimList[i].backAnims[activeSubAnim]._y); + //debug("offX: %d", _backAnimList[i].backAnims[activeSubAnim]._animData->getPhaseOffsetX(phase)); + //debug("offX: %d", _backAnimList[i].backAnims[activeSubAnim]._animData->getPhaseOffsetY(phase)); + //debug("x: %d, y: %d", x, y); + //} + + if (_backAnimList[i].backAnims[activeSubAnim]._x == 0 && _backAnimList[i].backAnims[activeSubAnim]._y == 0) { + debug("x = 0, y = 0"); + } + + if (phaseCount == 1 && frameCount == 1) { + debug("pC = 1, fC = 1"); + } + } //ShowFrameCodeShadow } } diff --git a/engines/prince/script.cpp b/engines/prince/script.cpp index d87cd8b9e26c..7806bf04bb50 100644 --- a/engines/prince/script.cpp +++ b/engines/prince/script.cpp @@ -222,8 +222,12 @@ void Script::installSingleBackAnim(Common::Array &_backanimList, newAnim._basaData._num = READ_UINT16(&_data[animOffset + 28 + i * 8]); newAnim._basaData._start = READ_UINT16(&_data[animOffset + 28 + i * 8 + 2]); newAnim._basaData._end = READ_UINT16(&_data[animOffset + 28 + i * 8 + 4]); - debug("start1: %d", newAnim._basaData._start); - debug("end1: %d", newAnim._basaData._end); + if (newAnim._basaData._start != -1) { + debug("start1: %d", newAnim._basaData._start); + } + if (newAnim._basaData._end != -1) { + debug("end1: %d", newAnim._basaData._end); + } int animNumber = newAnim._basaData._num; const Common::String animName = Common::String::format("AN%02d", animNumber); const Common::String shadowName = Common::String::format("AN%02dS", animNumber); @@ -267,34 +271,34 @@ void Script::installSingleBackAnim(Common::Array &_backanimList, newBackgroundAnim._seq._type = READ_UINT32(&_data[animOffset]); debug("type: %d", newBackgroundAnim._seq._type); newBackgroundAnim._seq._data = READ_UINT32(&_data[animOffset + 4]); - debug("data: %d", newBackgroundAnim._seq._data); + //debug("data: %d", newBackgroundAnim._seq._data); newBackgroundAnim._seq._anims = READ_UINT32(&_data[animOffset + 8]); anims = newBackgroundAnim._seq._anims; debug("anims: %d", newBackgroundAnim._seq._anims); //newBackgroundAnim._seq._current = READ_UINT32(&_data[animOffset + 12]); newBackgroundAnim._seq._current = 0; // nr on list like now or should it be fileNr of anim - check it - debug("current: %d", newBackgroundAnim._seq._current); + //debug("current: %d", newBackgroundAnim._seq._current); //newBackgroundAnim._seq._counter = READ_UINT32(&_data[animOffset + 16]); newBackgroundAnim._seq._counter = 0; - debug("counter: %d", newBackgroundAnim._seq._counter); + //debug("counter: %d", newBackgroundAnim._seq._counter); //newBackgroundAnim._seq._currRelative = READ_UINT32(&_data[animOffset + 20]); newBackgroundAnim._seq._currRelative = 0; - debug("currRelative: %d", newBackgroundAnim._seq._currRelative); + //debug("currRelative: %d", newBackgroundAnim._seq._currRelative); newBackgroundAnim._seq._data2 = READ_UINT32(&_data[animOffset + 24]); - debug("data2: %d", newBackgroundAnim._seq._data2); + //debug("data2: %d", newBackgroundAnim._seq._data2); int start = newBackgroundAnim.backAnims[0]._basaData._start; // BASA_Start of first frame - debug("start2: %d", start); int end = newBackgroundAnim.backAnims[0]._basaData._end; //BASA_End of first frame - debug("end2: %d", end); if (start != -1) { + debug("start2: %d", start); newBackgroundAnim.backAnims[0]._frame = start; newBackgroundAnim.backAnims[0]._showFrame = start; newBackgroundAnim.backAnims[0]._loopFrame = start; } if (end != -1) { + debug("end2: %d", end); newBackgroundAnim.backAnims[0]._lastFrame = end; }