aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
authorlukaslw2014-05-23 21:24:05 +0200
committerlukaslw2014-06-22 20:08:13 +0200
commiteff8b0fd91b190a11370bff8e68110723b27489d (patch)
treeb88865f202463debb0cf472357f13e1876cee074 /engines
parent555672618f270c29a7649bb3615a7ce9e5b3459f (diff)
downloadscummvm-rg350-eff8b0fd91b190a11370bff8e68110723b27489d.tar.gz
scummvm-rg350-eff8b0fd91b190a11370bff8e68110723b27489d.tar.bz2
scummvm-rg350-eff8b0fd91b190a11370bff8e68110723b27489d.zip
PRINCE: installSingleBackAnim update
Diffstat (limited to 'engines')
-rw-r--r--engines/prince/prince.cpp24
-rw-r--r--engines/prince/prince.h11
-rw-r--r--engines/prince/script.cpp123
-rw-r--r--engines/prince/script.h5
4 files changed, 115 insertions, 48 deletions
diff --git a/engines/prince/prince.cpp b/engines/prince/prince.cpp
index 4ef4e88685..844944184f 100644
--- a/engines/prince/prince.cpp
+++ b/engines/prince/prince.cpp
@@ -115,11 +115,13 @@ PrinceEngine::~PrinceEngine() {
}
_objList.clear();
+ /*
for (uint i = 0; i < _backAnimList.size(); i++) {
delete _backAnimList[i]._animData;
delete _backAnimList[i]._shadowData;
}
_backAnimList.clear();
+ */
for (uint i = 0; i < _mainHero->_moveSet.size(); i++) {
delete _mainHero->_moveSet[i];
@@ -323,11 +325,13 @@ bool PrinceEngine::loadLocation(uint16 locationNr) {
_mainHero->setShadowScale(_script->getShadowScale(_locationNr));
_room->loadRoom(_script->getRoomOffset(_locationNr));
+ /*
for (uint32 i = 0; i < _backAnimList.size(); i++) {
delete _backAnimList[i]._animData;
delete _backAnimList[i]._shadowData;
}
_backAnimList.clear();
+ */
_script->installBackAnims(_backAnimList, _room->_backAnim);
_graph->makeShadowTable(70, _graph->_shadowTable70);
@@ -696,6 +700,18 @@ void PrinceEngine::showTexts() {
}
}
+void PrinceEngine::showBackAnims() {
+ int tempAnimNr = 0;
+ for (uint i = 0; i < _backAnimList.size(); i++) {
+ if (_backAnimList[i].backAnims[tempAnimNr]._state == 0) {
+ Graphics::Surface *backAnimSurface = _backAnimList[i].backAnims[tempAnimNr]._animData->getFrame(testAnimFrame);
+ _graph->drawTransparent(_backAnimList[i].backAnims[tempAnimNr]._x, _backAnimList[i].backAnims[tempAnimNr]._y, backAnimSurface); // out of range now - crash .exe
+ backAnimSurface->free();
+ delete backAnimSurface;
+ }
+ }
+}
+
void PrinceEngine::drawScreen() {
const Graphics::Surface *roomSurface = _roomBmp->getSurface();
if (roomSurface) {
@@ -727,12 +743,8 @@ void PrinceEngine::drawScreen() {
}
}
*/
- for (uint i = 0; i < _backAnimList.size() ; i++) {
- Graphics::Surface *backAnimSurface = _backAnimList[i]._animData->getFrame(testAnimFrame);
- _graph->drawTransparent(_backAnimList[i]._x, _backAnimList[i]._y, backAnimSurface); // out of range now - crash .exe
- backAnimSurface->free();
- delete backAnimSurface;
- }
+
+ showBackAnims();
playNextFrame();
diff --git a/engines/prince/prince.h b/engines/prince/prince.h
index d30a9c1f72..3f8e3f9c78 100644
--- a/engines/prince/prince.h
+++ b/engines/prince/prince.h
@@ -109,7 +109,7 @@ struct BASA {
// background and normal animation
struct Anim {
int32 _addr; //animation adress
- int32 _seq;
+ //int32 _seq;
int16 _usage;
int16 _state; // state of animation: 0 - turning on, 1 - turning off
int16 _flags;
@@ -137,6 +137,11 @@ struct Anim {
Animation *_shadowData;
};
+struct BackgroundAnim {
+ BAS _seq;
+ Common::Array<Anim> backAnims;
+};
+
struct DebugChannel {
enum Type {
@@ -197,7 +202,8 @@ public:
Image::BitmapDecoder *_roomBmp;
Common::Array<AnimListItem> _animList;
- Common::Array<Anim> _backAnimList;
+ //Common::Array<Anim> _backAnimList;
+ Common::Array<BackgroundAnim> _backAnimList;
int testAnimNr;
int testAnimFrame;
@@ -212,6 +218,7 @@ private:
void showTexts();
void init();
void showLogo();
+ void showBackAnims();
void makeShadowTable(int brightness);
uint32 getTextWidth(const char *s);
diff --git a/engines/prince/script.cpp b/engines/prince/script.cpp
index 0dae2b1b5b..0c52e6a97e 100644
--- a/engines/prince/script.cpp
+++ b/engines/prince/script.cpp
@@ -205,51 +205,98 @@ uint8 *Script::getRoomOffset(int locationNr) {
return &_data[_scriptInfo.rooms + locationNr * 64];
}
-void Script::installSingleBackAnim(Common::Array<Anim> &_backanimList, int offset) {
+void Script::installSingleBackAnim(Common::Array<BackgroundAnim> &_backanimList, int offset) {
+
+ BackgroundAnim newBackgroundAnim;
+
int animOffset = READ_UINT32(&_data[offset]);
- int animNumber = READ_UINT16(&_data[animOffset + 28]);
- Anim newAnim;
+ int anims = READ_UINT32(&_data[animOffset + 8]);
+
+ if (anims == 0) {
+ anims = 1;
+ }
+
if (animOffset != 0) {
- const Common::String animName = Common::String::format("AN%02d", animNumber);
- const Common::String shadowName = Common::String::format("AN%02dS", animNumber);
- newAnim._animData = new Animation();
- newAnim._shadowData = new Animation();
- Resource::loadResource(newAnim._animData, animName.c_str(), true);
- if (!Resource::loadResource(newAnim._shadowData, shadowName.c_str(), false)) {
- delete newAnim._shadowData;
- newAnim._shadowData = nullptr;
+ for (int i = 0; i < anims; i++) {
+ Anim newAnim;
+ int animNumber = READ_UINT16(&_data[animOffset + 28 + i * 8]);
+ const Common::String animName = Common::String::format("AN%02d", animNumber);
+ const Common::String shadowName = Common::String::format("AN%02dS", animNumber);
+ newAnim._animData = new Animation();
+ newAnim._shadowData = new Animation();
+ Resource::loadResource(newAnim._animData, animName.c_str(), true);
+ if (!Resource::loadResource(newAnim._shadowData, shadowName.c_str(), false)) {
+ delete newAnim._shadowData;
+ newAnim._shadowData = nullptr;
+ }
+ //newAnim._seq = 0;
+ newAnim._usage = 0;
+ newAnim._state = 0; // enabled
+ if ((_vm->_animList[animNumber]._flags & 4) != 0) {
+ newAnim._state = 1;
+ newAnim._frame = _vm->_animList[animNumber]._endPhase;
+ newAnim._showFrame = _vm->_animList[animNumber]._endPhase;
+ } else {
+ newAnim._frame = _vm->_animList[animNumber]._startPhase;
+ newAnim._showFrame = _vm->_animList[animNumber]._startPhase;
+ }
+ newAnim._flags = _vm->_animList[animNumber]._flags;
+ newAnim._lastFrame = _vm->_animList[animNumber]._endPhase;
+ newAnim._loopFrame = _vm->_animList[animNumber]._loopPhase;
+ newAnim._loopType = _vm->_animList[animNumber]._loopType;
+ newAnim._nextAnim = _vm->_animList[animNumber]._nextAnim;
+ newAnim._x = _vm->_animList[animNumber]._x;
+ newAnim._y = _vm->_animList[animNumber]._y;
+ newAnim._currFrame = 0;
+ newAnim._currX = _vm->_animList[animNumber]._x;
+ newAnim._currY = _vm->_animList[animNumber]._y;
+ newAnim._currW = 0;
+ newAnim._currH = 0;
+ newAnim._packFlag = 0;
+ newAnim._shadowBack = _vm->_animList[animNumber]._type;
+ newBackgroundAnim.backAnims.push_back(newAnim);
+ debug("%d - animNo: %d", i, animNumber);
}
- newAnim._seq = 0;
- newAnim._usage = 0;
- newAnim._state = 0; // enabled
- if ((_vm->_animList[animNumber]._flags & 4) != 0) {
- newAnim._state = 1;
- newAnim._frame = _vm->_animList[animNumber]._endPhase;
- newAnim._showFrame = _vm->_animList[animNumber]._endPhase;
- } else {
- newAnim._frame = _vm->_animList[animNumber]._startPhase;
- newAnim._showFrame = _vm->_animList[animNumber]._startPhase;
+
+ 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);
+ 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);
+ //newBackgroundAnim._seq._counter = READ_UINT32(&_data[animOffset + 16]);
+ newBackgroundAnim._seq._counter = 0;
+ debug("counter: %d", newBackgroundAnim._seq._counter);
+ //newBackgroundAnim._seq._currRelative = READ_UINT32(&_data[animOffset + 20]);
+ newBackgroundAnim._seq._currRelative = 0;
+ debug("currRelative: %d", newBackgroundAnim._seq._currRelative);
+ newBackgroundAnim._seq._data2 = READ_UINT32(&_data[animOffset + 24]);
+ debug("data2: %d", newBackgroundAnim._seq._data2);
+
+ int start = READ_UINT16(&_data[animOffset + 28 + 2]); // BASA_Start of first frame
+ debug("start: %d", start);
+ int end = READ_UINT16(&_data[animOffset + 28 + 2]); //BASA_End of first frame
+ debug("end: %d", end);
+
+ if (start != 65535) {
+ newBackgroundAnim.backAnims[0]._frame = start;
+ newBackgroundAnim.backAnims[0]._showFrame = start;
+ newBackgroundAnim.backAnims[0]._loopFrame = start;
+ }
+
+ if (end != 65535) {
+ newBackgroundAnim.backAnims[0]._lastFrame = end;
}
- newAnim._flags = _vm->_animList[animNumber]._flags;
- newAnim._lastFrame = _vm->_animList[animNumber]._endPhase;
- newAnim._loopFrame = _vm->_animList[animNumber]._loopPhase;
- newAnim._loopType = _vm->_animList[animNumber]._loopType;
- newAnim._nextAnim = _vm->_animList[animNumber]._nextAnim;
- newAnim._x = _vm->_animList[animNumber]._x;
- newAnim._y = _vm->_animList[animNumber]._y;
- newAnim._currFrame = 0;
- newAnim._currX = _vm->_animList[animNumber]._x;
- newAnim._currY = _vm->_animList[animNumber]._y;
- newAnim._currW = 0;
- newAnim._currH = 0;
- newAnim._packFlag = 0;
- newAnim._shadowBack = _vm->_animList[animNumber]._type;
- _backanimList.push_back(newAnim);
- //debug("animNo: %d", animNumber);
+
+ _backanimList.push_back(newBackgroundAnim);
}
}
-void Script::installBackAnims(Common::Array<Anim> &_backanimList, int offset) {
+void Script::installBackAnims(Common::Array<BackgroundAnim> &_backanimList, int offset) {
for (uint i = 0; i < 64; i++) {
installSingleBackAnim(_backanimList, offset);
offset += 4;
diff --git a/engines/prince/script.h b/engines/prince/script.h
index b2087c7b12..b05d5ca84d 100644
--- a/engines/prince/script.h
+++ b/engines/prince/script.h
@@ -38,6 +38,7 @@ namespace Prince {
class PrinceEngine;
class Animation;
struct Anim;
+struct BackgroundAnim;
namespace Detail {
template <typename T> T LittleEndianReader(void *data);
@@ -132,8 +133,8 @@ public:
int16 getLightY(int locationNr);
int32 getShadowScale(int locationNr);
uint8 *getRoomOffset(int locationNr);
- void installBackAnims(Common::Array<Anim> &_backanimList, int offset);
- void installSingleBackAnim(Common::Array<Anim> &_backanimList, int offset);
+ void installBackAnims(Common::Array<BackgroundAnim> &_backanimList, int offset);
+ void installSingleBackAnim(Common::Array<BackgroundAnim> &_backanimList, int offset);
const char *getString(uint32 offset) {
return (const char *)(&_data[offset]);