PRINCE: freeHeroAnim(), O_SETHEROANIM()

This commit is contained in:
lukaslw 2014-07-20 17:38:17 +02:00
parent 8b9d3bedf2
commit 2749f97dd9
4 changed files with 35 additions and 5 deletions

View File

@ -37,7 +37,7 @@ Hero::Hero(PrinceEngine *vm, GraphicsMan *graph) : _vm(vm), _graph(graph)
, _number(0), _visible(false), _state(MOVE), _middleX(0), _middleY(0)
, _boreNum(1), _currHeight(0), _moveDelay(0), _shadMinus(0), _moveSetType(0)
, _lastDirection(kHeroDirDown), _destDirection(kHeroDirDown), _talkTime(0), _boredomTime(0), _phase(0)
, _specAnim(0), _drawX(0), _drawY(0), _drawZ(0), _zoomFactor(0), _scaleValue(0)
, _specAnim(nullptr), _drawX(0), _drawY(0), _drawZ(0), _zoomFactor(0), _scaleValue(0)
, _shadZoomFactor(0), _shadScaleValue(0), _shadLineLen(0), _shadDrawX(0), _shadDrawY(0)
, _frameXSize(0), _frameYSize(0), _scaledFrameXSize(0), _scaledFrameYSize(0), _color(0)
, _coords(nullptr), _dirTab(nullptr), _currCoords(nullptr), _currDirTab(nullptr), _step(0)
@ -52,6 +52,7 @@ Hero::~Hero() {
free(_zoomBitmap);
free(_shadowBitmap);
delete[] _shadowLine;
freeHeroAnim();
}
bool Hero::loadAnimSet(uint32 animSetNr) {
@ -971,9 +972,11 @@ void Hero::freeOldMove() {
_state = Hero::STAY;
}
//TODO
void Hero::freeHeroAnim() {
if (_specAnim != nullptr) {
delete _specAnim;
_specAnim = nullptr;
}
}
}

View File

@ -180,7 +180,7 @@ public:
int16 _boredomTime; // Boredom current boredom time in frames
uint16 _boreNum; // Bore anim frame
int16 _talkTime; // TalkTime time of talk anim
int32 _specAnim; // SpecAnim additional anim
Animation *_specAnim; // additional anim
uint16 _currHeight; // height of current anim phase

View File

@ -181,6 +181,10 @@ int32 Script::getOptionStandardOffset(int option) {
}
}
uint8 *Script::getHeroAnimName(int offset) {
return &_data[offset];
}
void Script::setBackAnimId(int offset, int animId) {
WRITE_UINT32(&_data[offset], animId);
}
@ -1167,8 +1171,30 @@ void Interpreter::O_WAITTEXT() {
}
void Interpreter::O_SETHEROANIM() {
uint16 hero = readScriptFlagValue();
uint16 heroId = readScriptFlagValue();
int32 offset = readScript<uint32>();
Hero *hero = nullptr;
if (!heroId) {
hero = _vm->_mainHero;
} else {
hero = _vm->_secondHero;
}
if (hero != nullptr) {
hero->freeHeroAnim();
if (hero ->_specAnim == nullptr) {
hero->_specAnim = new Animation();
if (offset < 100) {
const Common::String animName = Common::String::format("AN%02d", offset);
Resource::loadResource(hero->_specAnim, animName.c_str(), true);
} else {
const Common::String animName = Common::String((const char *)_script->getHeroAnimName(offset));
Common::String normalizedPath = lastPathComponent(animName, '\\');
Resource::loadResource(hero->_specAnim, normalizedPath.c_str(), true);
}
hero->_phase = 0;
hero->_state = Hero::SPEC;
}
}
debugInterpreter("O_SETHEROANIM hero %d, offset %d", hero, offset);
}

View File

@ -138,6 +138,7 @@ public:
int32 getShadowScale(int locationNr);
uint8 *getRoomOffset(int locationNr);
int32 getOptionStandardOffset(int option);
uint8 *getHeroAnimName(int offset);
void setBackAnimId(int offset, int animId);
void setObjId(int offset, int objId);
void installBackAnims(Common::Array<BackgroundAnim> &backAnimList, int offset);