Skip to content

Commit

Permalink
PRINCE: showBackAnims anim type 2, memory leaks debugging
Browse files Browse the repository at this point in the history
  • Loading branch information
lukaslw committed Jun 22, 2014
1 parent ac845b5 commit 2e1f7db
Show file tree
Hide file tree
Showing 5 changed files with 160 additions and 64 deletions.
7 changes: 4 additions & 3 deletions engines/prince/animation.cpp
Expand Up @@ -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);
}

Expand Down Expand Up @@ -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);
Expand All @@ -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);
Expand Down
6 changes: 3 additions & 3 deletions engines/prince/animation.h
Expand Up @@ -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;
Expand Down
2 changes: 1 addition & 1 deletion engines/prince/hero.cpp
Expand Up @@ -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;
Expand Down
187 changes: 139 additions & 48 deletions engines/prince/prince.cpp
Expand Up @@ -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;
}
}

Expand Down Expand Up @@ -741,16 +751,79 @@ 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) {
//change_back_anim
}
}
}
*/
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) {
Expand Down Expand Up @@ -778,21 +851,22 @@ 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
} else if (_backAnimList[i]._seq._type == 1) {
//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
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Expand All @@ -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
}
}
Expand Down
22 changes: 13 additions & 9 deletions engines/prince/script.cpp
Expand Up @@ -222,8 +222,12 @@ void Script::installSingleBackAnim(Common::Array<BackgroundAnim> &_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);
Expand Down Expand Up @@ -267,34 +271,34 @@ void Script::installSingleBackAnim(Common::Array<BackgroundAnim> &_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;
}

Expand Down

0 comments on commit 2e1f7db

Please sign in to comment.