diff options
| author | lukaslw | 2014-07-10 02:22:18 +0200 | 
|---|---|---|
| committer | lukaslw | 2014-07-10 02:22:18 +0200 | 
| commit | 1b1238d4b3796f487ecfd260cdb3f9607a0724b1 (patch) | |
| tree | fd0d828765bf545636d45f0d8ca422f9bafec6b3 | |
| parent | 59e8dc2fd3f1847d724469bcaa680db750d21736 (diff) | |
| download | scummvm-rg350-1b1238d4b3796f487ecfd260cdb3f9607a0724b1.tar.gz scummvm-rg350-1b1238d4b3796f487ecfd260cdb3f9607a0724b1.tar.bz2 scummvm-rg350-1b1238d4b3796f487ecfd260cdb3f9607a0724b1.zip | |
PRINCE: Loading path data, fpGetPixelAddr(), fpGetPixel(), findPoint(), beginning of makePath()
| -rw-r--r-- | engines/prince/prince.cpp | 181 | ||||
| -rw-r--r-- | engines/prince/prince.h | 21 | 
2 files changed, 199 insertions, 3 deletions
| diff --git a/engines/prince/prince.cpp b/engines/prince/prince.cpp index 32baf75a95..f7c2f9e3f4 100644 --- a/engines/prince/prince.cpp +++ b/engines/prince/prince.cpp @@ -88,7 +88,9 @@ PrinceEngine::PrinceEngine(OSystem *syst, const PrinceGameDescription *gameDesc)  	_optionsWidth(210), _optionsHeight(170), _invOptionsWidth(210), _invOptionsHeight(130), _optionsStep(20),  	_invOptionsStep(20), _optionsNumber(7), _invOptionsNumber(5), _optionsColor1(236), _optionsColor2(252),  	_dialogWidth(600), _dialogHeight(0), _dialogLineSpace(10), _dialogColor1(220), _dialogColor2(223), -	_dialogFlag(false), _dialogLines(0), _dialogText(nullptr), _mouseFlag(1) { +	_dialogFlag(false), _dialogLines(0), _dialogText(nullptr), _mouseFlag(1), +	_roomPathBitmap(nullptr), _destX(0), _destY(0), _destX2(0), _destY2(0), _fpFlag(0), _fpX(0), _fpY(0), +	_fpX1(0), _fpY1(0) {  	// Debug/console setup  	DebugMan.addDebugChannel(DebugChannel::kScript, "script", "Prince Script debug channel"); @@ -172,6 +174,8 @@ PrinceEngine::~PrinceEngine() {  	delete _mainHero;  	delete _secondHero; + +	free(_roomPathBitmap);  }  GUI::Debugger *PrinceEngine::getDebugger() { @@ -291,6 +295,8 @@ void PrinceEngine::init() {  	_mainHero->loadAnimSet(1);  	_secondHero->loadAnimSet(3); +	_roomPathBitmap = (byte *)malloc(kPathBitmapLen); +  	BackgroundAnim tempBackAnim;  	tempBackAnim._seq._currRelative = 0;  	for (int i = 0; i < kMaxBackAnims; i++) { @@ -397,8 +403,9 @@ bool PrinceEngine::loadLocation(uint16 locationNr) {  		_graph->setPalette(_roomBmp->getPalette());  	} -	loadZoom(_mainHero->_zoomBitmap, _mainHero->kZoomBitmapLen, "zoom"); -	loadShadow(_mainHero->_shadowBitmap, _mainHero->kShadowBitmapSize, "shadow", "shadow2"); +	loadZoom(_mainHero->_zoomBitmap, _mainHero->kZoomBitmapLen, "zoom"); // TODO - second hero +	loadShadow(_mainHero->_shadowBitmap, _mainHero->kShadowBitmapSize, "shadow", "shadow2"); // TODO - second hero +	loadPath("path");  	for (uint32 i = 0; i < _pscrList.size(); i++) {  		delete _pscrList[i]; @@ -731,6 +738,20 @@ bool PrinceEngine::loadShadow(byte *shadowBitmap, uint32 dataSize, const char *r  	return true;  } +bool PrinceEngine::loadPath(const char *resourceName) { +	Common::SeekableReadStream *stream = SearchMan.createReadStreamForMember(resourceName); +	if (!stream) { +		delete stream; +		return false; +	} +	if (stream->read(_roomPathBitmap, kPathBitmapLen) != kPathBitmapLen) { +		delete stream; +		return false; +	} +	delete stream; +	return true; +} +  bool PrinceEngine::loadAllInv() {  	for (int i = 0; i < kMaxInv; i++) {  		InvItem tempInvItem; @@ -2663,6 +2684,160 @@ void PrinceEngine::freeAllNormAnims() {  	_normAnimList.clear();  } +bool PrinceEngine::fpGetPixelAddr(int x, int y) { +	_fpX = x; +	_fpY = y; +	return fpGetPixel(x, y); +} + +bool 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; +} + +void PrinceEngine::findPoint(int x1, int y1, int x2, int y2) { +	// other names? +	_destX = x1; +	_destY = y1; +	_destX2 = x2; +	_destY2 = y2; +	_fpFlag = 0; + +	if (fpGetPixelAddr(x1, y1)) { +		_fpFlag = 1; +		if (fpGetPixelAddr(_destX2, _destY2)) { +			//bye +			//eax = _destX; +			//ebx = _destY; +			//ecx = _destX2; +			//edx = _destY2; +			return; +		} +	} +	//got_wrong_point + +	int fpL, fpU, fpR, fpD; // global? + +	fpL = _fpX; +	fpU = _fpY; +	fpR = _fpX; +	fpD = _fpY; + +	//loop: +	while (1) { +		if (fpD != kMaxPicHeight) { +			if (fpGetPixel(_fpX, fpD)) { +				//gotcha +				if (_fpFlag) { +					_destX2 = _fpX1; +					_destY2 = _fpY1; +				} else { +					_destX = _fpX1; +					_destY = _fpY1; +				} +				break; +			} +			fpD++; +		} +		//no down +		if (fpU != 0) { +			if (fpGetPixel(_fpX, fpU)) { +				//gotcha +				if (_fpFlag) { +					_destX2 = _fpX1; +					_destY2 = _fpY1; +				} else { +					_destX = _fpX1; +					_destY = _fpY1; +				} +				break; +			} +			fpU--; +		} +		//no_up +		if (fpL != 0) { +			if (fpGetPixel(fpL, _fpY)) { +				//gotcha +				if (_fpFlag) { +					_destX2 = _fpX1; +					_destY2 = _fpY1; +				} else { +					_destX = _fpX1; +					_destY = _fpY1; +				} +				break; +			} +			fpL--; +		} +		//no_left +		if (fpR != _sceneWidth) { +			if (fpGetPixel(fpL, _fpY)) { +				//gotcha +				if (_fpFlag) { +					_destX2 = _fpX1; +					_destY2 = _fpY1; +				} else { +					_destX = _fpX1; +					_destY = _fpY1; +				} +				break; +			} +			fpR++; +		} +		//no_right +		if (fpD == kMaxPicHeight) { +			if (fpL == 0) { +				if (fpU == 0) { +					if (fpR == _sceneWidth) { +						break; +					} +				} +			} +		} +		//bye +		//eax = _destX; +		//ebx = _destY; +		//ecx = _destX2; +		//edx = _destY2; +		return; +	} +} + +void PrinceEngine::makePath(int destX, int destY) { + +	int realDestX = destX; +	int realDestY = destY; +	_flags->setFlagValue(Flags::MOVEDESTX, destX); +	_flags->setFlagValue(Flags::MOVEDESTY, destY); + +	int ebp = -2; +	int currX = _mainHero->_middleX; // second hero +	int currY = _mainHero->_middleY; + +	int eax = currX / 2; +	int ebx = currY / 2; +	int ecx = destX / 2; +	int edx = destY / 2; + +	if ((currX / 2 != destX / 2) && (currY / 2 != destY / 2)) { +		//not_just_turn +		findPoint(currX / 2, currY / 2, destX / 2, destY / 2); +	} else { +		//byemove +		//freeOldMove(); +		_mainHero->_state = _mainHero->TURN; +		// eax = -1 +		return; +	} +} +  void PrinceEngine::mainLoop() {  	changeCursor(0); diff --git a/engines/prince/prince.h b/engines/prince/prince.h index c9f9268631..c664d44896 100644 --- a/engines/prince/prince.h +++ b/engines/prince/prince.h @@ -431,6 +431,27 @@ public:  	void initZoomIn(int slot);  	void initZoomOut(int slot); +	// Pathfinding +	static const int16 kPathGridStep = 2; +	static const int32 kPathBitmapLen = (kMaxPicHeight / kPathGridStep * kMaxPicWidth / kPathGridStep) / 8; +	byte *_roomPathBitmap; // PL - Sala + +	int _destX; +	int _destY; +	int _destX2; +	int _destY2; +	int _fpFlag; +	int _fpX; +	int _fpY; +	int _fpX1; +	int _fpY1; + +	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 testAnimNr;  	int testAnimFrame; | 
