diff options
| author | lukaslw | 2014-07-10 22:27:39 +0200 | 
|---|---|---|
| committer | lukaslw | 2014-07-10 22:27:39 +0200 | 
| commit | 0f58b3ac6a71db4556152b987a9d6be783975217 (patch) | |
| tree | 0784a705068097e95f082db47c0d34f2b512df57 | |
| parent | b711899a63e7e98bce9dc9509e9cc4a85486cb41 (diff) | |
| download | scummvm-rg350-0f58b3ac6a71db4556152b987a9d6be783975217.tar.gz scummvm-rg350-0f58b3ac6a71db4556152b987a9d6be783975217.tar.bz2 scummvm-rg350-0f58b3ac6a71db4556152b987a9d6be783975217.zip | |
PRINCE: Pathfinding - second update
| -rw-r--r-- | engines/prince/prince.cpp | 96 | ||||
| -rw-r--r-- | engines/prince/prince.h | 14 | 
2 files changed, 99 insertions, 11 deletions
| diff --git a/engines/prince/prince.cpp b/engines/prince/prince.cpp index 1fe671187a..6685a065e5 100644 --- a/engines/prince/prince.cpp +++ b/engines/prince/prince.cpp @@ -90,7 +90,8 @@ PrinceEngine::PrinceEngine(OSystem *syst, const PrinceGameDescription *gameDesc)  	_dialogWidth(600), _dialogHeight(0), _dialogLineSpace(10), _dialogColor1(220), _dialogColor2(223),  	_dialogFlag(false), _dialogLines(0), _dialogText(nullptr), _mouseFlag(1),  	_roomPathBitmap(nullptr), _roomPathBitmapTemp(nullptr), _destX(0), _destY(0), _destX2(0), _destY2(0), -	_fpFlag(0), _fpX(0), _fpY(0), _fpX1(0), _fpY1(0) { +	_fpFlag(0), _fpX(0), _fpY(0), _fpX1(0), _fpY1(0), _coordsBufEnd(8), _coordsBuf(nullptr), _coords(nullptr), +	_traceLineLen(0), _traceLineFlag(0) {  	// Debug/console setup  	DebugMan.addDebugChannel(DebugChannel::kScript, "script", "Prince Script debug channel"); @@ -177,6 +178,7 @@ PrinceEngine::~PrinceEngine() {  	free(_roomPathBitmap);  	free(_roomPathBitmapTemp); +	free(_coordsBuf);  }  GUI::Debugger *PrinceEngine::getDebugger() { @@ -298,6 +300,8 @@ void PrinceEngine::init() {  	_roomPathBitmap = (byte *)malloc(kPathBitmapLen);  	_roomPathBitmapTemp = (byte *)malloc(kPathBitmapLen); +	_coordsBuf = (byte *)malloc(kTracePts * 4); +	_coords = _coordsBuf;  	BackgroundAnim tempBackAnim;  	tempBackAnim._seq._currRelative = 0; @@ -2686,22 +2690,24 @@ void PrinceEngine::freeAllNormAnims() {  	_normAnimList.clear();  } -bool PrinceEngine::fpGetPixelAddr(int x, int y) { +int PrinceEngine::fpGetPixelAddr(int x, int y) {  	_fpX = x;  	_fpY = y;  	return fpGetPixel(x, y);  } -bool PrinceEngine::fpGetPixel(int x, int y) { +int PrinceEngine::fpGetPixel(int x, int y) {  	_fpX1 = x;  	_fpY1 = y; -  	int mask = 128 >> (x & 7);  	byte value = _roomPathBitmap[x / 8 + y * 80]; -	if (mask != value) { -		return true; -	} -	return false; +	return (mask & value); +} + +int PrinceEngine::getPixelAddr(byte *pathBitmap, int x, int y) { +	int mask = 128 >> (x & 7); +	byte value = pathBitmap[x / 8 + y * 80]; +	return (mask & value);  }  void PrinceEngine::findPoint(int x1, int y1, int x2, int y2) { @@ -2860,6 +2866,45 @@ Direction PrinceEngine::makeDirection(int x1, int y1, int x2, int y2) {  	}  } +void PrinceEngine::specialPlot(int x, int y) { +	if (*_coords < _coordsBufEnd) { +		WRITE_UINT16(_coords, x); +		_coords += 2; +		WRITE_UINT16(_coords, y); +		_coords += 2; +		int mask = 128 >> (x & 7); +		_roomPathBitmapTemp[x / 8 + y * 80] |= mask; // set point +	} +} + +void PrinceEngine::specialPlotInside(int x, int y) { +	if (*_coords < _coordsBufEnd) { +		WRITE_UINT16(_coords, x); +		_coords += 2; +		WRITE_UINT16(_coords, y); +		_coords += 2; +	} +} + +void PrinceEngine::plotTraceLine(int x, int y, int color, void *data) { +	PrinceEngine *traceLine = (PrinceEngine *)data; +	if (!traceLine->_traceLineFlag) { +		if (!traceLine->getPixelAddr(traceLine->_roomPathBitmapTemp, x, y)) { +			if (traceLine->getPixelAddr(traceLine->_roomPathBitmap, x, y)) { +				traceLine->specialPlotInside(x, y); +				traceLine->_traceLineLen++; +				traceLine->_traceLineFlag = 0; +			} else { +				//mov	eax, OldX // last correct point +				//mov	ebx, OldY +				traceLine->_traceLineFlag = -1; +			} +		} else { +			traceLine->_traceLineFlag = 1; +		} +	} +} +  int PrinceEngine::tracePath(int x1, int y1, int x2, int y2) {  	for (int i = 0; i < kPathBitmapLen; i++) {  		_roomPathBitmapTemp[i] = 0; @@ -2873,7 +2918,36 @@ int PrinceEngine::tracePath(int x1, int y1, int x2, int y2) {  		_destY = y1;  		_destX2 = x2;  		_destY2 = y2; -		makeDirection(x1, y1, x2, y2); +		Direction dir = makeDirection(x1, y1, x2, y2); +		// eax = _destX; +		// ebx = _destY; +		//  EAX, EBX - x,y +		//  ESI - adres w buforze SSala (czasowy) +		//  EBP - adres w buforze Sala (staly) +		//	DL  - maska bitu +		if(getPixelAddr(_roomPathBitmap, _destX, _destY)) { +			if (getPixelAddr(_roomPathBitmap, _destX2, _destY2)) { +				//mov	eax,d DestX +				//mov	ebx,d DestY +				//mov	edi,o CoordsBuf +				//mov	d Coords,edi +				specialPlot(_destX, _destY); +				//trace_loop: +				int btx = _destX; +				int bty = _destY; +				byte *bcad = _coords; +				while (1) { +					_traceLineLen = 0; +					Graphics::drawLine(_destX, _destY, _destX2, _destY2, 0, &this->plotTraceLine, this); +				} +			} else { +				//error2 +				return 2; +			} +		} else { +			//error2 +			return 2; +		}  		return 0;  	} else {  		//error1: @@ -2881,6 +2955,10 @@ int PrinceEngine::tracePath(int x1, int y1, int x2, int y2) {  	}  } +void PrinceEngine::approxPath() { + +} +  void PrinceEngine::makePath(int destX, int destY) {  	int pathLen1 = 0; // global?  	int pathLen2 = 0; // global? diff --git a/engines/prince/prince.h b/engines/prince/prince.h index b9dc249cc3..81c2bf6949 100644 --- a/engines/prince/prince.h +++ b/engines/prince/prince.h @@ -434,6 +434,7 @@ public:  	// Pathfinding  	static const int16 kPathGridStep = 2;  	static const int32 kPathBitmapLen = (kMaxPicHeight / kPathGridStep * kMaxPicWidth / kPathGridStep) / 8; +	static const int32 kTracePts = 8000;  	byte *_roomPathBitmap; // PL - Sala  	byte *_roomPathBitmapTemp; // PL -SSala @@ -447,6 +448,11 @@ public:  	int _fpX1;  	int _fpY1;  	Direction _direction; +	int _coordsBufEnd; +	byte *_coordsBuf; // optimal path +	byte *_coords; // last path point adress from coordsBuf +	int _traceLineLen; +	int _traceLineFlag; // return value of plotTraceLine  	struct fpResult {  		int x1; @@ -458,10 +464,14 @@ public:  	bool loadPath(const char *resourceName);  	void makePath(int destX, int destY);  	void findPoint(int x1, int y1, int x2, int y2); -	bool fpGetPixelAddr(int x, int y); -	bool fpGetPixel(int x, int y); +	int fpGetPixelAddr(int x, int y); +	int fpGetPixel(int x, int y); +	int getPixelAddr(byte *pathBitmap, int x, int y); +	static void plotTraceLine(int x, int y, int color, void *data); +	void specialPlotInside(int x, int y);  	int tracePath(int x1, int y1, int x2, int y2);  	Direction makeDirection(int x1, int y1, int x2, int y2); +	void specialPlot(int x, int y);  	void approxPath();  	int testAnimNr; | 
