Skip to content

Commit

Permalink
PRINCE: installSingleBackAnim update
Browse files Browse the repository at this point in the history
  • Loading branch information
lukaslw committed Jun 22, 2014
1 parent 5556726 commit eff8b0f
Show file tree
Hide file tree
Showing 4 changed files with 115 additions and 48 deletions.
24 changes: 18 additions & 6 deletions engines/prince/prince.cpp
Expand Up @@ -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];
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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();

Expand Down
11 changes: 9 additions & 2 deletions engines/prince/prince.h
Expand Up @@ -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;
Expand Down Expand Up @@ -137,6 +137,11 @@ struct Anim {
Animation *_shadowData;
};

struct BackgroundAnim {
BAS _seq;
Common::Array<Anim> backAnims;
};

struct DebugChannel {

enum Type {
Expand Down Expand Up @@ -197,7 +202,8 @@ class PrinceEngine : public Engine {
Image::BitmapDecoder *_roomBmp;

Common::Array<AnimListItem> _animList;
Common::Array<Anim> _backAnimList;
//Common::Array<Anim> _backAnimList;
Common::Array<BackgroundAnim> _backAnimList;

int testAnimNr;
int testAnimFrame;
Expand All @@ -212,6 +218,7 @@ class PrinceEngine : public Engine {
void showTexts();
void init();
void showLogo();
void showBackAnims();
void makeShadowTable(int brightness);

uint32 getTextWidth(const char *s);
Expand Down
123 changes: 85 additions & 38 deletions engines/prince/script.cpp
Expand Up @@ -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;
Expand Down
5 changes: 3 additions & 2 deletions engines/prince/script.h
Expand Up @@ -38,6 +38,7 @@ namespace Prince {
class PrinceEngine;
class Animation;
struct Anim;
struct BackgroundAnim;

namespace Detail {
template <typename T> T LittleEndianReader(void *data);
Expand Down Expand Up @@ -132,8 +133,8 @@ class Script {
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]);
Expand Down

0 comments on commit eff8b0f

Please sign in to comment.