diff options
author | lukaslw | 2014-07-01 23:59:37 +0200 |
---|---|---|
committer | lukaslw | 2014-07-01 23:59:37 +0200 |
commit | f2b28363acb689ccde227bdbad1688e088afeebd (patch) | |
tree | be8b6d8fecb347d179579364c29f65e6c741bf38 | |
parent | c4593a4b23b55b303e650ad1946fa30a4163f0e6 (diff) | |
download | scummvm-rg350-f2b28363acb689ccde227bdbad1688e088afeebd.tar.gz scummvm-rg350-f2b28363acb689ccde227bdbad1688e088afeebd.tar.bz2 scummvm-rg350-f2b28363acb689ccde227bdbad1688e088afeebd.zip |
PRINCE: showAnim(), showNormAnims(), freeNormAnim(), freeAllNormAnims(), O_SHOWANIM(), O_FREEANIM()
-rw-r--r-- | engines/prince/prince.cpp | 131 | ||||
-rw-r--r-- | engines/prince/prince.h | 8 | ||||
-rw-r--r-- | engines/prince/script.cpp | 30 |
3 files changed, 167 insertions, 2 deletions
diff --git a/engines/prince/prince.cpp b/engines/prince/prince.cpp index 0df1f778c6..ddf64b7b52 100644 --- a/engines/prince/prince.cpp +++ b/engines/prince/prince.cpp @@ -144,6 +144,8 @@ PrinceEngine::~PrinceEngine() { clearBackAnimList(); + freeAllNormAnims(); + for (uint i = 0; i < _allInvList.size(); i++) { _allInvList[i]._surface->free(); delete _allInvList[i]._surface; @@ -272,6 +274,13 @@ void PrinceEngine::init() { _mainHero->loadAnimSet(1); _secondHero->loadAnimSet(3); + + Anim tempAnim; + tempAnim._animData = nullptr; + tempAnim._shadowData = nullptr; + for (int i = 0; i < kMaxNormAnims; i++) { + _normAnimList.push_back(tempAnim); + } } void PrinceEngine::showLogo() { @@ -1172,6 +1181,105 @@ void PrinceEngine::showSpriteShadow(Graphics::Surface *shadowSurface, int destX, } } +void PrinceEngine::showAnim(Anim &anim) { + //ShowFrameCode + //ShowAnimFrame + int phaseCount = anim._animData->getPhaseCount(); + int frameCount = anim._animData->getFrameCount(); + int phase = anim._showFrame; + int phaseFrameIndex = anim._animData->getPhaseFrameIndex(phase); + int x = anim._x + anim._animData->getPhaseOffsetX(phase); + int y = anim._y + anim._animData->getPhaseOffsetY(phase); + int animFlag = anim._flags; + int checkMaskFlag = (animFlag & 1); + int maxFrontFlag = (animFlag & 2); + int specialZFlag = anim._nextAnim; + int z = anim._nextAnim; + int frameWidth = anim._animData->getFrameWidth(phaseFrameIndex); + int frameHeight = anim._animData->getFrameHeight(phaseFrameIndex); + int shadowZ = 0; + + if (x != 0 || y != 0 || phaseCount != 1 || frameCount != 1) { // TODO - check if this needed + + if (checkMaskFlag != 0) { + if (anim._nextAnim == 0) { + z = y + frameHeight - 1; + } + checkMasks(x, y, frameWidth, frameHeight, z); + } + + if (specialZFlag != 0) { + z = specialZFlag; + } else if (maxFrontFlag != 0) { + z = kMaxPicHeight + 1; + } else { + z = y + frameHeight - 1; + } + shadowZ = z; + + anim._currX = x; + anim._currY = y; + anim._currW = frameWidth; + anim._currH = frameHeight; + Graphics::Surface *backAnimSurface = anim._animData->getFrame(phaseFrameIndex); // TODO - check for memory leak + showSprite(backAnimSurface, x, y, z, true); + } + + //ShowFrameCodeShadow + //ShowAnimFrameShadow + if (anim._shadowData != nullptr) { + int shadowPhaseFrameIndex = anim._shadowData->getPhaseFrameIndex(phase); + int shadowX = anim._shadowData->getBaseX() + anim._shadowData->getPhaseOffsetX(phase); + int shadowY = anim._shadowData->getBaseY() + anim._shadowData->getPhaseOffsetY(phase); + int shadowFrameWidth = anim._shadowData->getFrameWidth(shadowPhaseFrameIndex); + int shadowFrameHeight = anim._shadowData->getFrameHeight(shadowPhaseFrameIndex); + + if (checkMaskFlag != 0) { + checkMasks(shadowX, shadowY, shadowFrameWidth, shadowFrameHeight, shadowY + shadowFrameWidth - 1); + } + + if (shadowZ == 0) { + if (maxFrontFlag != 0) { + shadowZ = kMaxPicHeight + 1; + } else { + shadowZ = shadowY + shadowFrameWidth - 1; + } + } + + Graphics::Surface *shadowSurface = anim._shadowData->getFrame(shadowPhaseFrameIndex); // TODO - check for memory leak + showSpriteShadow(shadowSurface, shadowX, shadowY, shadowZ, true); + } +} + +void PrinceEngine::showNormAnims() { + for (int i = 0; i < kMaxNormAnims; i++) { + Anim &anim = _normAnimList[i]; + if (anim._animData != nullptr) { + if (!anim._state) { + if (anim._frame == anim._lastFrame) { + if (anim._loopType) { + if (anim._loopType == 1) { + anim._frame = anim._loopFrame; + } else { + continue; + } + } else { + if (anim._frame >= 1) { + anim._frame--; + } else { + anim._frame = 0; + } + } + } else { + anim._frame++; + } + anim._showFrame = anim._frame; + showAnim(anim); + } + } + } +} + void PrinceEngine::showBackAnims() { for (uint i = 0; i < _backAnimList.size(); i++) { int activeSubAnim = _backAnimList[i]._seq._currRelative; @@ -1507,6 +1615,8 @@ void PrinceEngine::drawScreen() { } } + showNormAnims(); + showBackAnims(); showObjects(); @@ -2387,6 +2497,27 @@ void PrinceEngine::testDialog() { } } +void PrinceEngine::freeNormAnim(int slot) { + _normAnimList[slot]._state = 1; + delete _normAnimList[slot]._animData; + _normAnimList[slot]._animData = nullptr; + delete _normAnimList[slot]._shadowData; + _normAnimList[slot]._shadowData = nullptr; + _normAnimList[slot]._currFrame = 0; +} + +void PrinceEngine::freeAllNormAnims() { + for (int i = 0; i < kMaxNormAnims; i++) { + if (_normAnimList[i]._animData != nullptr) { + delete _normAnimList[i]._animData; + } + if (_normAnimList[i]._shadowData != nullptr) { + delete _normAnimList[i]._shadowData; + } + } + _normAnimList.clear(); +} + void PrinceEngine::mainLoop() { changeCursor(0); diff --git a/engines/prince/prince.h b/engines/prince/prince.h index d6bdad376f..fdf5aa15b8 100644 --- a/engines/prince/prince.h +++ b/engines/prince/prince.h @@ -299,11 +299,17 @@ public: Room *_room; Script *_script; + static const int kMaxNormAnims = 64; + Common::Array<AnimListItem> _animList; Common::Array<BackgroundAnim> _backAnimList; + Common::Array<Anim> _normAnimList; Common::Array<Common::Array<DialogLine>> _dialogBoxList; Common::Array<Mob> _mobList; + void freeNormAnim(int slot); + void freeAllNormAnims(); + Common::RandomSource _randomSource; static const int16 kNormalWidth = 640; @@ -411,6 +417,8 @@ private: void showTexts(Graphics::Surface *screen); void init(); void showLogo(); + void showAnim(Anim &anim); + void showNormAnims(); void showBackAnims(); void clearBackAnimList(); bool spriteCheck(int sprWidth, int sprHeight, int destX, int destY); diff --git a/engines/prince/script.cpp b/engines/prince/script.cpp index 5d8ba5d996..37f6724b36 100644 --- a/engines/prince/script.cpp +++ b/engines/prince/script.cpp @@ -606,7 +606,32 @@ void Interpreter::O_REMOBJECT() { void Interpreter::O_SHOWANIM() { uint16 slot = readScriptFlagValue(); uint16 animId = readScriptFlagValue(); - + _vm->freeNormAnim(slot); + Anim &anim = _vm->_normAnimList[slot]; + AnimListItem &animList = _vm->_animList[animId]; + anim._currFrame = 0; + anim._packFlag = 0; + anim._state = 0; + anim._frame = animList._startPhase; + anim._showFrame = animList._startPhase; + anim._lastFrame = animList._endPhase; + anim._loopFrame = animList._loopPhase; + anim._x = animList._x; + anim._y = animList._y; + anim._loopType = animList._loopType; + anim._shadowBack = animList._type; + anim._flags = animList._flags; + anim._nextAnim = animList._nextAnim; + int fileNumber = animList._fileNumber; + const Common::String animName = Common::String::format("AN%02d", fileNumber); + const Common::String shadowName = Common::String::format("AN%02dS", fileNumber); + anim._animData = new Animation(); + anim._shadowData = new Animation(); + Resource::loadResource(anim._animData, animName.c_str(), true); + if (!Resource::loadResource(anim._shadowData, shadowName.c_str(), false)) { + delete anim._shadowData; + anim._shadowData = nullptr; + } debugInterpreter("O_SHOWANIM slot %d, animId %d", slot, animId); } @@ -620,6 +645,7 @@ void Interpreter::O_CHECKANIMEND() { void Interpreter::O_FREEANIM() { uint16 slot = readScriptFlagValue(); + _vm->freeNormAnim(slot); debugInterpreter("O_FREEANIM slot %d", slot); } @@ -650,10 +676,10 @@ void Interpreter::O_CHECKBACKANIMFRAME() { uint16 frameId = readScriptFlagValue(); int currAnim = _vm->_backAnimList[slotId]._seq._currRelative; if (_vm->_backAnimList[slotId].backAnims[currAnim]._frame != frameId) { - debugInterpreter("O_CHECKBACKANIMFRAME slotId %d, frameId %d", slotId, frameId); //esi -= 6; loop of this OP? _opcodeNF = 1; } + debugInterpreter("O_CHECKBACKANIMFRAME slotId %d, frameId %d", slotId, frameId); } void Interpreter::O_FREEALLSAMPLES() { |