diff options
| author | Nicola Mettifogo | 2008-07-27 10:37:54 +0000 | 
|---|---|---|
| committer | Nicola Mettifogo | 2008-07-27 10:37:54 +0000 | 
| commit | 6e4d26fb70566846c1d8e559db9e1c4b39e3324d (patch) | |
| tree | 29db7a5d050a198cc965930246eea1ceccb416d2 | |
| parent | e0503bc5499614399bf5778c66ff0b7f4e5e4b07 (diff) | |
| download | scummvm-rg350-6e4d26fb70566846c1d8e559db9e1c4b39e3324d.tar.gz scummvm-rg350-6e4d26fb70566846c1d8e559db9e1c4b39e3324d.tar.bz2 scummvm-rg350-6e4d26fb70566846c1d8e559db9e1c4b39e3324d.zip | |
Added rudimental support for location changes when walking through doors. The best part of this commit is that Doug now stops in a normal position.
svn-id: r33328
| -rw-r--r-- | engines/parallaction/walk.cpp | 79 | ||||
| -rw-r--r-- | engines/parallaction/walk.h | 2 | 
2 files changed, 65 insertions, 16 deletions
| diff --git a/engines/parallaction/walk.cpp b/engines/parallaction/walk.cpp index feb2029f5a..14d8d080bd 100644 --- a/engines/parallaction/walk.cpp +++ b/engines/parallaction/walk.cpp @@ -439,6 +439,57 @@ void PathWalker_BR::finalizeWalk() {  	_engineFlags &= ~kEngineWalking;  	_first = true;  	_fieldC = 1; + +	Common::Point foot; +	_ch->getFoot(foot); + +	ZonePtr z = _vm->hitZone(kZoneDoor, foot.x, foot.y); +	if (z != nullZonePtr && (z->_flags & kFlagsClosed) == 0) { +		_vm->_location._startPosition = z->u.door->_startPos; // foot pos +		_vm->_location._startFrame = z->u.door->_startFrame; + +#if 0 +		// TODO: implement working follower. Must find out a location in which the code is +		// used and which is stable enough. +		_followerFootInit.x = -1; +		if (_follower && z->u.door->startPos2.x != -1) { +			_followerFootInit.x = z->u.door->startPos2.x;	// foot pos +			_followerFootInit.y = z->u.door->startPos2.y;	// foot pos +		} +		_followerFootInit.z = -1; +		if (_follower && z->u.door->startPos2.z != -1) { +			_followerFootInit.z = z->u.door->startPos2.z;	// foot pos +		} +#endif + +		_vm->scheduleLocationSwitch(z->u.door->_location); +		_vm->_cmdExec->run(z->_commands, z); +	} + +#if 0 +	// TODO: Input::walkTo must be extended to support destination frame in addition to coordinates +	// TODO: the frame argument must be passed to PathWalker through PathBuilder, so probably +	// a merge between the two Path managers is the right solution +	if (_engineFlags & FINAL_WALK_FRAME) {	// this flag is set in readInput() +		_engineFlags &= ~FINAL_WALK_FRAME; +		_char.ani->_frame = _moveToF; 	// from readInput()... +	} else { +		_char.ani->_frame = _dirFrame;	// from walk() +	} +	_char.setFoot(foot); +#endif + +	_ch->_ani->_frame = _dirFrame;	// temporary solution + +#if 0 +	// TODO: support scrolling ;) +	if (foot.x > _gfx->hscroll + 600) _gfx->scrollRight(78); +	if (foot.x < _gfx->hscroll + 40) _gfx->scrollLeft(78); +	if (foot.y > 350) _gfx->scrollDown(100); +	if (foot.y < 80) _gfx->scrollUp(100); +#endif + +	return;  } @@ -447,7 +498,8 @@ void PathWalker_BR::walk() {  		return;  	} -/* +#if 0 +	// TODO: support delays in walking. This requires extending Input::walkIo().  	if (ch._walkDelay > 0) {  		ch._walkDelay--;  		if (ch._walkDelay == 0 && _ch._ani->_scriptName) { @@ -458,7 +510,8 @@ void PathWalker_BR::walk() {  		}  		return;  	} -*/ +#endif +  	GfxObj *obj = _ch->_ani->gfxobj;  	Common::Rect rect; @@ -477,12 +530,7 @@ void PathWalker_BR::walk() {  	int yStep = (scale * 10) / 100 + 1;  	debugC(9, kDebugWalk, "calculated step: (%i, %i)\n", xStep, yStep); -/* -	if (_first) { -		_ch->getFoot(_startFoot); -		_first = false; -	} -*/ +  	if (_fieldC == 0) {  		_ch->_walkPath.erase(_ch->_walkPath.begin()); @@ -491,7 +539,6 @@ void PathWalker_BR::walk() {  			debugC(3, kDebugWalk, "PathWalker_BR::walk, case 0\n");  			return;  		} else { -//			_ch->getFoot(_startFoot);  			debugC(3, kDebugWalk, "PathWalker_BR::walk, moving to next node\n");  		}  	} @@ -503,7 +550,7 @@ void PathWalker_BR::walk() {  	_step %= 8;  	int walkFrame = _step; -	int dirFrame = 0; +	_dirFrame = 0;  	Common::Point newpos(_startFoot), delta;  	Common::Point p(*_ch->_walkPath.begin()); @@ -517,7 +564,7 @@ void PathWalker_BR::walk() {  			delta.y = p.y - _startFoot.y;  			newpos.y = p.y;  		} -		dirFrame = 9; +		_dirFrame = 9;  	} else  	if (_startFoot.y > p.y && _startFoot.y > 0 && IS_PATH_CLEAR(_startFoot.x, _startFoot.y - yStep)) {  		if (_startFoot.y - yStep >= p.y) { @@ -528,7 +575,7 @@ void PathWalker_BR::walk() {  			delta.y = _startFoot.y - p.y;  			newpos.y = p.y;  		} -		dirFrame = 0; +		_dirFrame = 0;  	}  	if (_startFoot.x < p.x && _startFoot.x < 640 && IS_PATH_CLEAR(_startFoot.x + xStep, _startFoot.y)) { @@ -541,7 +588,7 @@ void PathWalker_BR::walk() {  			newpos.x = p.x;  		}  		if (delta.y < delta.x) { -			dirFrame = 18;	// right +			_dirFrame = 18;	// right  		}  	} else  	if (_startFoot.x > p.x && _startFoot.x > 0 && IS_PATH_CLEAR(_startFoot.x - xStep, _startFoot.y)) { @@ -554,7 +601,7 @@ void PathWalker_BR::walk() {  			newpos.x = p.x;  		}  		if (delta.y < delta.x) { -			dirFrame = 27;	// left +			_dirFrame = 27;	// left  		}  	} @@ -562,11 +609,11 @@ void PathWalker_BR::walk() {  	if (_fieldC) {  		debugC(9, kDebugWalk, "PathWalker_BR::walk, foot moved from (%i, %i) to (%i, %i)\n", _startFoot.x, _startFoot.y, newpos.x, newpos.y); -		_ch->_ani->_frame = walkFrame + dirFrame + 1; +		_ch->_ani->_frame = walkFrame + _dirFrame + 1;  		_startFoot.x = newpos.x;  		_startFoot.y = newpos.y;  		_ch->setFoot(_startFoot); -	//	_ch->_z = ch._startFoot.y; +		_ch->_ani->_z = newpos.y;  	}  	if (_fieldC || !_ch->_walkPath.empty()) { diff --git a/engines/parallaction/walk.h b/engines/parallaction/walk.h index f1afa078fd..8d21e5ebbd 100644 --- a/engines/parallaction/walk.h +++ b/engines/parallaction/walk.h @@ -104,6 +104,8 @@ class PathWalker_BR : public PathWalker {  	bool		_first;  	int			_step; +	int			_dirFrame; +  	void finalizeWalk();  public: | 
