diff options
| -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); | 
