diff options
| -rw-r--r-- | engines/illusions/actor.cpp | 2 | ||||
| -rw-r--r-- | engines/illusions/duckman/duckman_specialcode.cpp | 3 | ||||
| -rw-r--r-- | engines/illusions/duckman/illusions_duckman.cpp | 77 | ||||
| -rw-r--r-- | engines/illusions/duckman/illusions_duckman.h | 1 | ||||
| -rw-r--r-- | engines/illusions/duckman/scriptopcodes_duckman.cpp | 4 | ||||
| -rw-r--r-- | engines/illusions/illusions.cpp | 15 | ||||
| -rw-r--r-- | engines/illusions/pathfinder.cpp | 17 | ||||
| -rw-r--r-- | engines/illusions/pathfinder.h | 3 | ||||
| -rw-r--r-- | engines/illusions/thread.cpp | 2 | 
9 files changed, 109 insertions, 15 deletions
| diff --git a/engines/illusions/actor.cpp b/engines/illusions/actor.cpp index e9aad26ce8..cb9f3a909d 100644 --- a/engines/illusions/actor.cpp +++ b/engines/illusions/actor.cpp @@ -770,7 +770,7 @@ PointArray *Control::createPath(Common::Point destPt) {  	PathLines *walkRects = (_actor->_flags & Illusions::ACTOR_FLAG_HAS_WALK_RECTS) ? _actor->_pathWalkRects->_rects : 0;  	PathFinder pathFinder;  	WidthHeight bgDimensions = _vm->_backgroundInstances->getMasterBgDimensions(); -	PointArray *path = pathFinder.findPath(_actor->_position, destPt, walkPoints, walkRects, bgDimensions); +	PointArray *path = pathFinder.findPath(_vm->_camera, _actor->_position, destPt, walkPoints, walkRects, bgDimensions);  	for (uint i = 0; i < path->size(); ++i) {  		//debug(0, "Path(%d) (%d, %d)", i, (*path)[i].x, (*path)[i].y);  	} diff --git a/engines/illusions/duckman/duckman_specialcode.cpp b/engines/illusions/duckman/duckman_specialcode.cpp index d53896d6ac..60e05052c0 100644 --- a/engines/illusions/duckman/duckman_specialcode.cpp +++ b/engines/illusions/duckman/duckman_specialcode.cpp @@ -103,6 +103,7 @@ void DuckmanSpecialCode::run(uint32 specialCodeId, OpCall &opCall) {  	} else {  		debug("DuckmanSpecialCode::run() Unimplemented special code %08X", specialCodeId);  		_vm->notifyThreadId(opCall._threadId); +		error("DuckmanSpecialCode::run() Unimplemented special code");  	}  } @@ -392,7 +393,7 @@ void DuckmanSpecialCode::updateTeleporterProperties() {  	_vm->_scriptResource->_properties.set(0x000E0075, _teleporterPosition.x == 4 && _teleporterPosition.y == 3);  	_vm->_scriptResource->_properties.set(0x000E0076, _teleporterPosition.x == 3 && _teleporterPosition.y == 3);  	_vm->_scriptResource->_properties.set(0x000E0077, _teleporterPosition.x == 2 && _teleporterPosition.y == 2); -	_vm->_scriptResource->_properties.set(0x000E0078, _teleporterPosition.x == 1 && _teleporterPosition.y == 1);	 +	_vm->_scriptResource->_properties.set(0x000E0078, _teleporterPosition.x == 1 && _teleporterPosition.y == 1);  }  } // End of namespace Illusions diff --git a/engines/illusions/duckman/illusions_duckman.cpp b/engines/illusions/duckman/illusions_duckman.cpp index 9407812c99..325b6dca87 100644 --- a/engines/illusions/duckman/illusions_duckman.cpp +++ b/engines/illusions/duckman/illusions_duckman.cpp @@ -261,10 +261,10 @@ void IllusionsEngine_Duckman::initInput() {  	_input->setInputEvent(kEventDown, 0x80)  		.addMouseButton(MOUSE_RIGHT_BUTTON)  		.addKey(Common::KEYCODE_DOWN); -	/* Not implemented, used for original debugging purposes +#if 1 //TODO hide behind "gosanta" code  	_input->setInputEvent(kEventF1, 0x100)  		.addKey(Common::KEYCODE_F1); -	*/ +#endif  }  #define UPDATEFUNCTION(priority, sceneId, callback) \ @@ -294,6 +294,8 @@ int IllusionsEngine_Duckman::updateScript(uint flags) {  	}  	_threads->updateThreads(); + +	//TODO need to call startScriptThread2(0x10002, 0x20001, 0);  	return kUFNext;  } @@ -459,6 +461,22 @@ Control *IllusionsEngine_Duckman::getObjectControl(uint32 objectId) {  	return _dict->getObjectControl(objectId);  } +static const uint8 kPointConversionTable[] = { +		0, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, +		35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, +		35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, +		35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, +		35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, +		35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, +		35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, +		35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 1, 2, 3, +		4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 35, +		35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, +		35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, +		35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, +		35, 35, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, +		33, 34 +};  Common::Point IllusionsEngine_Duckman::getNamedPointPosition(uint32 namedPointId) {  	Common::Point pt;  	Common::Point currPan = _camera->getCurrentPan(); @@ -471,8 +489,50 @@ Common::Point IllusionsEngine_Duckman::getNamedPointPosition(uint32 namedPointId  			return currPan;  		}  	} else { -		// TODO -		debug(1, "getNamedPointPosition(%08X) UNKNOWN", namedPointId); +		debug(1, "getNamedPointPosition(%02d)", kPointConversionTable[namedPointId - 0x00070001]); +		switch(kPointConversionTable[namedPointId - 0x00070001]) { +			case 0 : return Common::Point(160, 100); +			case 1 : return currPan; +			case 2 : return Common::Point(currPan.x - 160, currPan.y); +			case 3 : return Common::Point(currPan.x + 160, currPan.y); +			case 4 : return Common::Point(currPan.x, currPan.y - 100); +			case 5 : return Common::Point(currPan.x, currPan.y + 100); +			case 6 : return Common::Point(currPan.x - 160, currPan.y - 100); +			case 7 : return Common::Point((uint16)(currPan.x + 160), currPan.y - 100); +			case 8 : return Common::Point(currPan.x - 160, currPan.y + 100); +			case 9 : return Common::Point(currPan.x + 160, currPan.y + 100); +			/* TODO implement these +			case 10 : return Common::Point(0, 0); +			case 11 : return Common::Point(0, 0); +			case 12 : return Common::Point(0, 0); +			case 13 : return Common::Point(0, 0); +			case 14 : return Common::Point(0, 0); +			*/ +			case 15 : return Common::Point(0, 0); +			/* TODO implement these +			case 16 : return Common::Point(0, 0); +			case 17 : return Common::Point(0, 0); +			case 18 : return Common::Point(0, 0); +			 */ +			case 19 : return Common::Point(0, 0); +			case 20 : return Common::Point(320, 0); +			case 21 : return Common::Point(640, 0); +			case 22 : return Common::Point(960, 0); +			case 23 : return Common::Point(0, 200); +			case 24 : return Common::Point(320, 200); +			case 25 : return Common::Point(640, 200); +			case 26 : return Common::Point(960, 200); +			case 27 : return Common::Point(0, 400); +			case 28 : return Common::Point(320, 400); +			case 29 : return Common::Point(640, 400); +			case 30 : return Common::Point(960, 400); +			case 31 : return Common::Point(0, 600); +			case 32 : return Common::Point(320, 0); +			case 33 : return Common::Point(640, 0); +			case 34 : return Common::Point(960, 0); +			default : break; +		} +		error("getNamedPointPosition(%02d) UNKNOWN", kPointConversionTable[namedPointId - 0x00070001]);  		return Common::Point(0, 0);  	}  } @@ -717,6 +777,13 @@ void IllusionsEngine_Duckman::startScriptThread(uint32 threadId, uint32 callingT  	newScriptThread(threadId, callingThreadId, 0, scriptCodeIp);  } +void IllusionsEngine_Duckman::startScriptThread2(uint32 sceneId, uint32 threadId, uint32 callingThreadId) { +	debug(2, "Starting script thread2"); +	_savegameSceneId = sceneId; +	_savegameThreadId = threadId; +	startScriptThread(0x20002, callingThreadId); +} +  uint32 IllusionsEngine_Duckman::startAbortableTimerThread(uint32 duration, uint32 threadId) {  	return newTimerThread(duration, threadId, true);  } @@ -824,7 +891,7 @@ bool IllusionsEngine_Duckman::enterScene(uint32 sceneId, uint32 threadId) {  			startScriptThread(threadId, 0);  		return true;  	} -	// TODO startScriptThread2(0x10002, 0x20001, 0); +	startScriptThread2(0x10002, 0x20001, 0);  	return false;  } diff --git a/engines/illusions/duckman/illusions_duckman.h b/engines/illusions/duckman/illusions_duckman.h index daa1b06c0c..87ca932ea8 100644 --- a/engines/illusions/duckman/illusions_duckman.h +++ b/engines/illusions/duckman/illusions_duckman.h @@ -147,6 +147,7 @@ public:  	void startScriptThreadSimple(uint32 threadId, uint32 callingThreadId);  	void startScriptThread(uint32 threadId, uint32 callingThreadId); +	void startScriptThread2(uint32 threadId, uint32 callingThreadId, uint32 unk);  	uint32 startAbortableTimerThread(uint32 duration, uint32 threadId);  	uint32 startTimerThread(uint32 duration, uint32 threadId);  	uint32 startAbortableThread(byte *scriptCodeIp1, byte *scriptCodeIp2, uint32 callingThreadId); diff --git a/engines/illusions/duckman/scriptopcodes_duckman.cpp b/engines/illusions/duckman/scriptopcodes_duckman.cpp index 10efceae24..9ac0b9a0ad 100644 --- a/engines/illusions/duckman/scriptopcodes_duckman.cpp +++ b/engines/illusions/duckman/scriptopcodes_duckman.cpp @@ -321,7 +321,7 @@ void ScriptOpcodes_Duckman::opStartModalScene(ScriptThread *scriptThread, OpCall  void ScriptOpcodes_Duckman::opExitModalScene(ScriptThread *scriptThread, OpCall &opCall) {  	_vm->_input->discardAllEvents();  	if (_vm->_scriptResource->_properties.get(0x000E0027)) { -		// TODO _vm->startScriptThread2(0x10002, 0x20001, 0); +		_vm->startScriptThread2(0x10002, 0x20001, 0);  		opCall._result = kTSTerminate;  	} else {  		_vm->dumpCurrSceneFiles(_vm->getCurrentScene(), opCall._callerThreadId); @@ -521,7 +521,7 @@ void ScriptOpcodes_Duckman::opAppearActor(ScriptThread *scriptThread, OpCall &op  	ARG_UINT32(objectId);  	Control *control = _vm->_dict->getObjectControl(objectId);  	if (!control) { -		Common::Point pos = _vm->getNamedPointPosition(0x70001);		 +		Common::Point pos = _vm->getNamedPointPosition(0x70001);  		_vm->_controls->placeActor(0x50001, pos, 0x60001, objectId, 0);  		control = _vm->_dict->getObjectControl(objectId);  	} diff --git a/engines/illusions/illusions.cpp b/engines/illusions/illusions.cpp index 11ef6d0ac7..83881103a1 100644 --- a/engines/illusions/illusions.cpp +++ b/engines/illusions/illusions.cpp @@ -238,8 +238,19 @@ int IllusionsEngine::getRandom(int max) {  }  int IllusionsEngine::convertPanXCoord(int16 x) { -	// TODO -	return 0; +	int16 diff = x - _camera->getCurrentPan().x; +	int16 absX = ABS(diff); +	int newX = 0; +	if ( absX < 160) { +		newX = (diff << 7) / 320; +	} else if (diff < 0) { +		newX = -64; +	} else { +		newX = 64; +	} +	debug(1, "convertPanXCoord %d %d -> %d", diff, x, newX); + +	return newX;  }  bool IllusionsEngine::calcPointDirection(Common::Point &srcPt, Common::Point &dstPt, uint &facing) { diff --git a/engines/illusions/pathfinder.cpp b/engines/illusions/pathfinder.cpp index 1e781e64ea..b0b43a0e4f 100644 --- a/engines/illusions/pathfinder.cpp +++ b/engines/illusions/pathfinder.cpp @@ -22,11 +22,16 @@  #include "illusions/illusions.h"  #include "illusions/pathfinder.h" +#include "camera.h"  namespace Illusions { -PointArray *PathFinder::findPath(Common::Point sourcePt, Common::Point destPt, +PointArray *PathFinder::findPath(Camera *camera, Common::Point sourcePt, Common::Point destPt,  	PointArray *walkPoints, PathLines *walkRects, WidthHeight bgDimensions) { +	Common::Point cameraPt = camera->getScreenOffset(); +	_screenRect.p0 = cameraPt; +	_screenRect.p1.x = cameraPt.x + 320; //TODO fix me get screen dimentions here. +	_screenRect.p1.y = cameraPt.y + 200;  	_walkPoints = walkPoints;  	_walkRects = walkRects;  	_bgDimensions = bgDimensions; @@ -132,8 +137,16 @@ void PathFinder::findValidDestPt(Common::Point &destPt) {  	int minDistance = 0xFFFF, currDistance;  	PathLine destLine;  	for (uint i = 0; i < _walkRects->size(); ++i) { -		PathLine &currRect = (*_walkRects)[i]; +		PathLine currRect = (*_walkRects)[i]; +		//TODO fix this hack. Used here to get xmas tree scene to work. +		if(currRect.p1.x > _screenRect.p1.x) { +			currRect.p1.x = _screenRect.p1.x; +		} +		if(currRect.p0.x < _screenRect.p0.x) { +			currRect.p0.x = _screenRect.p0.x; +		}  		WidthHeight rectDimensions = calcRectDimensions(currRect); +  		adjustRectDimensions(rectDimensions);  		clipLineToBg(destPt, rectDimensions, destLine);  		if (calcLineStatus(destLine, currRect, &outPt) == 3) { diff --git a/engines/illusions/pathfinder.h b/engines/illusions/pathfinder.h index f337a25fc0..47cc0575c5 100644 --- a/engines/illusions/pathfinder.h +++ b/engines/illusions/pathfinder.h @@ -39,9 +39,10 @@ typedef Common::Array<Common::Point> PointArray;  class PathFinder {  public: -	PointArray *findPath(Common::Point sourcePt, Common::Point destPt, +	PointArray *findPath(Camera *camera, Common::Point sourcePt, Common::Point destPt,  		PointArray *walkPoints, PathLines *walkRects, WidthHeight bgDimensions);  protected: +	PathLine _screenRect;  	PointArray *_walkPoints;  	PathLines *_walkRects;  	WidthHeight _bgDimensions; diff --git a/engines/illusions/thread.cpp b/engines/illusions/thread.cpp index b7ea41b53a..d984af2c67 100644 --- a/engines/illusions/thread.cpp +++ b/engines/illusions/thread.cpp @@ -160,7 +160,7 @@ void ThreadList::updateThreads() {  		if (_vm->_rerunThreads)  			_vm->_rerunThreads = false;  		else -			break;		 +			break;  	}  } | 
