diff options
author | lukaslw | 2014-07-18 15:35:43 +0200 |
---|---|---|
committer | lukaslw | 2014-07-18 15:35:43 +0200 |
commit | f4a35de7ebc67d0888ce25d85d2021f71adeb9c5 (patch) | |
tree | 59ba3f9c7e4a9e45471459b399a6f2ddd0583489 | |
parent | dfddfbbd795156ecf2ff83b009c1fb73901a37a3 (diff) | |
download | scummvm-rg350-f4a35de7ebc67d0888ce25d85d2021f71adeb9c5.tar.gz scummvm-rg350-f4a35de7ebc67d0888ce25d85d2021f71adeb9c5.tar.bz2 scummvm-rg350-f4a35de7ebc67d0888ce25d85d2021f71adeb9c5.zip |
PRINCE: showHero() update
-rw-r--r-- | engines/prince/hero.cpp | 243 | ||||
-rw-r--r-- | engines/prince/hero.h | 18 | ||||
-rw-r--r-- | engines/prince/prince.cpp | 31 | ||||
-rw-r--r-- | engines/prince/prince.h | 4 | ||||
-rw-r--r-- | engines/prince/script.cpp | 6 | ||||
-rw-r--r-- | engines/prince/script.h | 1 |
6 files changed, 206 insertions, 97 deletions
diff --git a/engines/prince/hero.cpp b/engines/prince/hero.cpp index 349418bef6..07aa550f25 100644 --- a/engines/prince/hero.cpp +++ b/engines/prince/hero.cpp @@ -28,17 +28,20 @@ #include "prince/resource.h" #include "prince/prince.h" #include "prince/graphics.h" +#include "prince/flags.h" +#include "prince/script.h" namespace Prince { 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(DOWN), _destDirection(DOWN), _talkTime(0), _boredomTime(0), _phase(0) + , _lastDirection(kHeroDirDown), _destDirection(kHeroDirDown), _talkTime(0), _boredomTime(0), _phase(0) , _specAnim(0), _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) + , _maxBoredom(200), _turnAnim(0), _leftRightMainDir(0), _upDownMainDir(0) { _zoomBitmap = (byte *)malloc(kZoomBitmapLen); _shadowBitmap = (byte *)malloc(2 * kShadowBitmapSize); @@ -588,71 +591,60 @@ void Hero::setShadowScale(int32 shadowScale) { void Hero::specialAnim() { } -void Hero::rotateHero() { - switch (_lastDirection) { - case LEFT: - switch (_destDirection) { - case RIGHT: - _moveSetType = kMove_MLR; - break; - case UP: - _moveSetType = kMove_MLU; - break; - case DOWN: - _moveSetType = kMove_MLD; - break; +int Hero::rotateHero(int oldDirection, int newDirection) { + switch (oldDirection) { + case kHeroDirLeft: + switch (newDirection) { + case kHeroDirRight: + return kMove_MLR; + case kHeroDirUp: + return kMove_MLU; + case kHeroDirDown: + return kMove_MLD; } break; - case RIGHT: - switch (_destDirection) { - case LEFT: - _moveSetType = kMove_MRL; - break; - case UP: - _moveSetType = kMove_MRU; - break; - case DOWN: - _moveSetType = kMove_MRD; - break; + case kHeroDirRight: + switch (newDirection) { + case kHeroDirLeft: + return kMove_MRL; + case kHeroDirUp: + return kMove_MRU; + case kHeroDirDown: + return kMove_MRD; } break; - case UP: - switch (_destDirection) { - case LEFT: - _moveSetType = kMove_MUL; - break; - case RIGHT: - _moveSetType = kMove_MUR; - break; - case DOWN: - _moveSetType = kMove_MUD; - break; + case kHeroDirUp: + switch (newDirection) { + case kHeroDirLeft: + return kMove_MUL; + case kHeroDirRight: + return kMove_MUR; + case kHeroDirDown: + return kMove_MUD; } break; - case DOWN: - switch (_destDirection) { - case LEFT: - _moveSetType = kMove_MDL; - break; - case RIGHT: - _moveSetType = kMove_MDR; - break; - case UP: - _moveSetType = kMove_MDU; - break; + case kHeroDirDown: + switch (newDirection) { + case kHeroDirLeft: + return kMove_MDL; + case kHeroDirRight: + return kMove_MDR; + case kHeroDirUp: + return kMove_MDU; } break; } + return -1; } void Hero::showHero() { if (_visible) { + //cmp w FLAGI+NOHEROATALL,ax + //jnz @@no_hero_visible if (_talkTime != 0) { _talkTime--; - //if (_talkTime == 0) { - //_state = STAY; // test this - //} } + // Scale of hero selectZoom(); @@ -662,24 +654,26 @@ void Hero::showHero() { switch (_state) { case STAY: - //if(OptionsFlag == false) { - //if(OpcodePC == null) { - _boredomTime++; - if (_boredomTime == 200) { // 140 for second hero + if (!_vm->_optionsFlag && !_vm->_interpreter->getLastOPCode()) { + _boredomTime++; + if (_boredomTime == _maxBoredom) { + _boredomTime = 0; + _state = BORE; + } + } else { _boredomTime = 0; - _state = BORE; } switch (_lastDirection) { - case LEFT: + case kHeroDirLeft: _moveSetType = kMove_SL; break; - case RIGHT: + case kHeroDirRight: _moveSetType = kMove_SR; break; - case UP: + case kHeroDirUp: _moveSetType = kMove_SU; break; - case DOWN: + case kHeroDirDown: _moveSetType = kMove_SD; break; } @@ -696,17 +690,98 @@ void Hero::showHero() { */ break; case MOVE: - switch (_lastDirection) { - case LEFT: + int x, y, dir, oldMiddleX, oldMiddleY, dX, dY; + //go_for_it: + while (1) { + if (_currCoords != nullptr) { + if (READ_UINT32(_currCoords) != 0xFFFFFFFF) { + x = READ_UINT16(_currCoords); + y = READ_UINT16(_currCoords + 2); + _currCoords += 4; + dir = *_currDirTab; + _currDirTab++; + if (_lastDirection != dir) { + _phase = 0; + int rotateDir = rotateHero(_lastDirection, dir); + _lastDirection = dir; + if (!rotateDir) { + continue; + } else { + _turnAnim = rotateDir; + _state = MVAN; + break; + } + } + //no_need_direction_change + if (dir == kHeroDirLeft) { + if (_middleX - x >= _step) { + break; + } + } else if (dir == kHeroDirRight) { + if (x - _middleX >= _step) { + break; + } + } else if (dir == kHeroDirUp) { + if (_middleY - y >= _step) { + break; + } + } else if (dir == kHeroDirDown) { + if (y - _middleY >= _step) { + break; + } + } + } else { + //finito + _middleX = READ_UINT16(_currCoords - 4); + _middleY = READ_UINT16(_currCoords - 2); + selectZoom(); + free(_coords); + free(_dirTab); + _boredomTime = 0; + _coords = nullptr; + _dirTab = nullptr; + _currCoords = nullptr; + _currDirTab = nullptr; + _phase = 0; + _state = TURN; + //_destDir = 0; + + } + } + } + oldMiddleX = _middleX; + oldMiddleY = _middleY; + _middleX = x; + _middleY = y; + selectZoom(); + + // TODO - useful or not? + dX = oldMiddleX - _middleX; + dY = oldMiddleY - _middleY; + if (dX) { + _leftRightMainDir = kHeroDirLeft; + if (dX >= 0) { + _leftRightMainDir = kHeroDirRight; + } + } + if (dY) { + _upDownMainDir = kHeroDirUp; + if (dY >= 0) { + _upDownMainDir = kHeroDirDown; + } + } + + switch (dir) { + case kHeroDirLeft: _moveSetType = kMove_ML; break; - case RIGHT: + case kHeroDirRight: _moveSetType = kMove_MR; break; - case UP: + case kHeroDirUp: _moveSetType = kMove_MU; break; - case DOWN: + case kHeroDirDown: _moveSetType = kMove_MD; break; } @@ -721,9 +796,9 @@ void Hero::showHero() { _moveSetType = kMove_BORED2; break; } - if (_phase == _moveSet[_moveSetType]->getFrameCount() - 1) { + if (_phase == _moveSet[_moveSetType]->getPhaseCount() - 1) { _boreNum = _vm->_randomSource.getRandomNumber(1); // rand one of two 'bored' animation - _lastDirection = DOWN; + _lastDirection = kHeroDirDown; _state = STAY; } break; @@ -731,26 +806,54 @@ void Hero::showHero() { //specialAnim(); break; case TALK: + if (!_talkTime) { + _state = STAY; + } switch (_lastDirection) { - case LEFT: + case kHeroDirLeft: _moveSetType = kMove_TL; break; - case RIGHT: + case kHeroDirRight: _moveSetType = kMove_TR; break; - case UP: + case kHeroDirUp: _moveSetType = kMove_TU; break; - case DOWN: + case kHeroDirDown: _moveSetType = kMove_TD; break; } break; + case MVAN: case TRAN: + if (_turnAnim) { + if (_phase < _moveSet[_moveSetType]->getPhaseCount() - 1) { + //TODO - not here? + _phase += 2; //? + } else { + //turn_anim_koniec + if (_state == MVAN) { + _state = MOVE; + } else { + _state = STAY; + } + } + } else { + //turn_anim_koniec + if (_state == MVAN) { + _state = MOVE; + } else { + _state = STAY; + } + } break; case RUN: break; case DMOVE: + _moveDelay--; + if (!_moveDelay) { + _state = MOVE; + } break; } showHeroAnimFrame(); diff --git a/engines/prince/hero.h b/engines/prince/hero.h index 9effde6228..e48befc073 100644 --- a/engines/prince/hero.h +++ b/engines/prince/hero.h @@ -64,10 +64,10 @@ public: }; enum Direction { - LEFT = 1, - RIGHT = 2, - UP = 3, - DOWN = 4 + kHeroDirLeft = 1, + kHeroDirRight = 2, + kHeroDirUp = 3, + kHeroDirDown = 4 }; enum MoveSet { @@ -118,7 +118,7 @@ public: void showHero(); void moveHero(); - void rotateHero(); + int rotateHero(int oldDirection, int newDirection); void scrollHero(); void setScale(int8 zoomBitmapValue); int getScaledValue(int size); @@ -169,11 +169,11 @@ public: byte *_currDirTab; // current direction int16 _lastDirection; // previous move direction int16 _destDirection; - // LeftRight previous left/right direction - // UpDown previous up/down direction + int16 _leftRightMainDir; // left or right - dominant direction + int16 _upDownMainDir; // up or down - dominant direction int32 _phase; // Phase animation phase int16 _step; // Step x/y step size depends on direction - // MaxBoredom stand still timeout + int16 _maxBoredom; // stand still timeout int16 _boredomTime; // Boredom current boredom time in frames uint16 _boreNum; // Bore anim frame int16 _talkTime; // TalkTime time of talk anim @@ -187,7 +187,7 @@ public: int _color; // Color Subtitles color // AnimSet number of animation set Common::Array<Animation *> _moveSet; // MoveAnims MoveSet - // TurnAnim ?? + int16 _turnAnim; byte *_zoomBitmap; byte *_shadowBitmap; byte *_shadowLine; diff --git a/engines/prince/prince.cpp b/engines/prince/prince.cpp index e422077427..bbcb9bbb60 100644 --- a/engines/prince/prince.cpp +++ b/engines/prince/prince.cpp @@ -297,6 +297,7 @@ void PrinceEngine::init() { _mainHero = new Hero(this, _graph); _secondHero = new Hero(this, _graph); + _secondHero->_maxBoredom = 140; _mainHero->loadAnimSet(1); _secondHero->loadAnimSet(3); @@ -827,19 +828,19 @@ void PrinceEngine::keyHandler(Common::Event event) { debugEngine("%d", _mainHero->_phase); break; case Common::KEYCODE_w: - _mainHero->_lastDirection = _mainHero->UP; + _mainHero->_lastDirection = _mainHero->kHeroDirUp; debugEngine("UP"); break; case Common::KEYCODE_s: - _mainHero->_lastDirection = _mainHero->DOWN; + _mainHero->_lastDirection = _mainHero->kHeroDirDown; debugEngine("DOWN"); break; case Common::KEYCODE_a: - _mainHero->_lastDirection = _mainHero->LEFT; + _mainHero->_lastDirection = _mainHero->kHeroDirLeft; debugEngine("LEFT"); break; case Common::KEYCODE_f: - _mainHero->_lastDirection = _mainHero->RIGHT; + _mainHero->_lastDirection = _mainHero->kHeroDirRight; debugEngine("RIGHT"); break; case Common::KEYCODE_1: @@ -3946,14 +3947,14 @@ int PrinceEngine::scanDirectionsFindNext(byte *tempCoordsBuf, int xDiff, int yDi int tempX, tempY, direction, dX, dY, againPointX1, againPointY1; - tempX = Hero::LEFT; + tempX = Hero::kHeroDirLeft; if (xDiff < 0) { - tempX = Hero::RIGHT; + tempX = Hero::kHeroDirRight; } - tempY = Hero::UP; + tempY = Hero::kHeroDirUp; if (yDiff < 0) { - tempY = Hero::DOWN; + tempY = Hero::kHeroDirDown; } while (1) { @@ -4010,15 +4011,15 @@ void PrinceEngine::scanDirections() { if (yDiff) { if (lastDirection != -1) { direction = lastDirection; - if (direction == Hero::LEFT) { + if (direction == Hero::kHeroDirLeft) { if (xDiff < 0) { direction = scanDirectionsFindNext(tempCoordsBuf, xDiff, yDiff); } - } else if (direction == Hero::RIGHT) { + } else if (direction == Hero::kHeroDirRight) { if (xDiff >= 0) { direction = scanDirectionsFindNext(tempCoordsBuf, xDiff, yDiff); } - } else if (direction == Hero::UP) { + } else if (direction == Hero::kHeroDirUp) { if (yDiff < 0) { direction = scanDirectionsFindNext(tempCoordsBuf, xDiff, yDiff); } @@ -4031,16 +4032,16 @@ void PrinceEngine::scanDirections() { direction = scanDirectionsFindNext(tempCoordsBuf, xDiff, yDiff); } } else { - direction = Hero::LEFT; + direction = Hero::kHeroDirLeft; if (xDiff < 0) { - direction = Hero::RIGHT; + direction = Hero::kHeroDirRight; } } } else { if (yDiff) { - direction = Hero::UP; + direction = Hero::kHeroDirUp; if (yDiff < 0) { - direction = Hero::DOWN; + direction = Hero::kHeroDirDown; } } else { direction = lastDirection; diff --git a/engines/prince/prince.h b/engines/prince/prince.h index 7a6596ada6..1f9244c58c 100644 --- a/engines/prince/prince.h +++ b/engines/prince/prince.h @@ -299,6 +299,8 @@ public: MhwanhDecoder *_suitcaseBmp; Room *_room; Script *_script; + InterpreterFlags *_flags; + Interpreter *_interpreter; static const int kMaxNormAnims = 64; static const int kMaxBackAnims = 64; @@ -568,8 +570,6 @@ private: Cursor *_cursor3; Debugger *_debugger; GraphicsMan *_graph; - InterpreterFlags *_flags; - Interpreter *_interpreter; Font *_font; MusicPlayer *_midiPlayer; diff --git a/engines/prince/script.cpp b/engines/prince/script.cpp index 14fae2b42f..fdf1b7c8ef 100644 --- a/engines/prince/script.cpp +++ b/engines/prince/script.cpp @@ -458,6 +458,10 @@ void Interpreter::storeNewPC(int opcodePC) { _fgOpcodePC = opcodePC; } +int Interpreter::getLastOPCode() { + return _lastOpcode; +} + uint32 Interpreter::getCurrentString() { return _currentString; } @@ -508,7 +512,7 @@ void Interpreter::O_WAITFOREVER() { _vm->changeCursor(_vm->_currentPointerNumber); _opcodeNF = 1; _currentInstruction -= 2; - //debugInterpreter("O_WAITFOREVER"); + debugInterpreter("O_WAITFOREVER"); } void Interpreter::O_BLACKPALETTE() { diff --git a/engines/prince/script.h b/engines/prince/script.h index 11f1cb8cd7..93db83ee65 100644 --- a/engines/prince/script.h +++ b/engines/prince/script.h @@ -185,6 +185,7 @@ public: void step(); void storeNewPC(int opcodePC); + int getLastOPCode(); uint32 getCurrentString(); void setCurrentString(uint32 value); |