aboutsummaryrefslogtreecommitdiff
path: root/engines/prince
diff options
context:
space:
mode:
Diffstat (limited to 'engines/prince')
-rw-r--r--engines/prince/animation.cpp7
-rw-r--r--engines/prince/animation.h6
-rw-r--r--engines/prince/hero.cpp2
-rw-r--r--engines/prince/prince.cpp187
-rw-r--r--engines/prince/script.cpp22
5 files changed, 160 insertions, 64 deletions
diff --git a/engines/prince/animation.cpp b/engines/prince/animation.cpp
index c27505735e..e2197c22f2 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 d5b5938ce0..03ea220c91 100644
--- a/engines/prince/animation.h
+++ b/engines/prince/animation.h
@@ -40,12 +40,12 @@ public:
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 58f729a73e..37b9679dbc 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 73789efedb..c631038fe8 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 d87cd8b9e2..7806bf04bb 100644
--- a/engines/prince/script.cpp
+++ b/engines/prince/script.cpp
@@ -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);
@@ -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;
}