diff options
| -rw-r--r-- | engines/prince/animation.cpp | 5 | ||||
| -rw-r--r-- | engines/prince/hero.cpp | 148 | ||||
| -rw-r--r-- | engines/prince/hero.h | 5 | ||||
| -rw-r--r-- | engines/prince/prince.cpp | 30 | ||||
| -rw-r--r-- | engines/prince/prince.h | 1 | 
5 files changed, 133 insertions, 56 deletions
| diff --git a/engines/prince/animation.cpp b/engines/prince/animation.cpp index 9911f5f99e..e27d556f1b 100644 --- a/engines/prince/animation.cpp +++ b/engines/prince/animation.cpp @@ -58,11 +58,6 @@ void Animation::clear() {  }  // TEMP -/* -int8 Animation::getZoom(uint16 offset) const { -	return *(uint8*)(_data+offset); -} -*/  int16 Animation::getZoom(uint16 offset) const {  	return READ_LE_UINT16(_data + offset);  } diff --git a/engines/prince/hero.cpp b/engines/prince/hero.cpp index 2b4f156df2..8afa0ca372 100644 --- a/engines/prince/hero.cpp +++ b/engines/prince/hero.cpp @@ -40,13 +40,13 @@ Hero::Hero(PrinceEngine *vm, GraphicsMan *graph) : _vm(vm), _graph(graph)  	, _frameXSize(0), _frameYSize(0), _scaledFrameXSize(0), _scaledFrameYSize(0)  {  	_zoomBitmap = new Animation(); -	_shadowBitmap = new Animation(); +	_shadowBitmap = (byte *)malloc(2 * kShadowBitmapSize);  	_shadowLine = new byte[kShadowLineArraySize];  }  Hero::~Hero() {  	delete _zoomBitmap; -	delete _shadowBitmap; +	free(_shadowBitmap);  	delete[] _shadowLine;  } @@ -280,7 +280,12 @@ void Hero::showHeroShadow(Graphics::Surface *heroFrame) {  		int shadMinY = _shadDrawY;  		int shadMaxY = _shadDrawY;  		int shadBitAddr = destY * kMaxPicWidth / 8 + destX / 8; +		debug("destX: %d", destX); +		debug("destY: %d", destY); +		debug("shadBitmap: %d", _shadowBitmap[shadBitAddr]); +		debug("shadBitmap2: %d", _shadowBitmap[shadBitAddr + kShadowBitmapSize]);  		int shadBitMask = 128 >> (destX % 8); +		debug("shadBitMask: %d", shadBitMask);  		int shadZoomY2 = _shadScaleValue;  		int shadZoomY = _scaleValue; @@ -299,10 +304,18 @@ void Hero::showHeroShadow(Graphics::Surface *heroFrame) {  		// banked2  		byte *shadowLineStart = _shadowLine + 8; +		int shadWallBitAddr = 0; +		int shadWallBitMask = 0; +		byte *shadWallDestAddr = 0; +		int shadWallPosY = 0; +		int shadWallSkipX = 0; +		int shadWallModulo = 0; +  		// linear_loop  		for(int i = 0; i < _frameYSize; i++) {  			int shadSkipX = 0;  			int ct_loop = 0; +			int sprModulo = 0;  			int ebxOnStack;  			//retry_line: @@ -356,6 +369,7 @@ void Hero::showHeroShadow(Graphics::Surface *heroFrame) {  					//x1_ok  					if (shadPosX + _frameXSize > 640) {  						ct_loop = 640 - shadPosX; // test it +						sprModulo = shadPosX + _frameXSize - 640;  					} else {  						//draw_line  						ct_loop = _frameXSize; @@ -400,14 +414,14 @@ void Hero::showHeroShadow(Graphics::Surface *heroFrame) {  					break;  				}  				//line_y_ok_2: -				// push esi -				// push ecx -				// lineDestAddr = eax; +				// push esi - background +				// push ecx - ct_loop +				byte *lineDestAddr = (byte *)_graph->_frontScreen->getBasePtr(_shadDrawX + diffX, _shadDrawY + diffY);  				// edi = eax -> needed in copy trans  				// push shadBitMask -				// lineBitAddr = shadBitMask; +				int lineBitMask = shadBitMask; // before copy_trans ct_loop  				// push shadBitAddr; -				// lineBitAddr = shadBitAddr; +				int lineBitAddr = shadBitAddr; // before copy_trans ct_loop  				//copy_trans  				//push eax, ebx, edx, ebp @@ -422,17 +436,21 @@ void Hero::showHeroShadow(Graphics::Surface *heroFrame) {  						shadowStart = (byte *)makeShadow->getBasePtr(blackHeroX, blackHeroY);  						shadZoomX += _scaleValue;  					} else { -						//point_ok:  						if (*shadowStart == kShadowColor) { -							if (shadBitMask != _shadowBitmap->getZoom(shadBitAddr)) { //tofix +							if (shadBitMask != _shadowBitmap[shadBitAddr]) { +								//debug("shadBitMask: %d", shadBitMask); +								//debug("_shadBitmap: %d", _shadowBitmap->getShadow(shadBitAddr));  								if (shadWallDown == 0) { -									if (shadBitMask != _shadowBitmap->getZoom(shadBitAddr + kShadowBitmapSize)) { //tofix +									if (shadBitMask != _shadowBitmap[shadBitAddr + kShadowBitmapSize]) {  										shadWDFlag = 1; +										//shadow +										*background = *(sprShadow + *background);  									}  								} +							} else { +								//shadow +								*background = *(sprShadow + *background);  							} -							//shadow -							*background = *(sprShadow + *background);  						}  						//ct_next  						//ror(shadBitMask, 1) @@ -449,59 +467,99 @@ void Hero::showHeroShadow(Graphics::Surface *heroFrame) {  						background = (byte *)_graph->_frontScreen->getBasePtr(_shadDrawX + diffX + backgroundDiff, _shadDrawY + diffY);  					}  				} +				/*  				//byebyebye  				if (shadWallDown == 0 && shadWDFlag != 0) { -					//shadWallDown = shadPosX; -					//shadWallBitAddr = lineBitAddr; -					//shadWallDestAddr = lineDestAddr; -					//shadWallBitMask = lineBitMask; -					//shadWallPosY = shadPosY; -					//shadWallSkipX = shadSkipX; -					//shadWallModulo = sprModulo; +					shadWallDown = shadPosX; +					shadWallBitAddr = lineBitAddr; +					shadWallDestAddr = lineDestAddr; +					shadWallBitMask = lineBitMask; +					shadWallPosY = shadPosY; +					shadWallSkipX = shadSkipX; +					shadWallModulo = sprModulo;  				}  				//byebye  				//pop ebp edx ebx eax  				//pop shadBitAddr  				//pop shadBitMask -				//pop ecx -				//pop edi +				//pop ecx - ct_loop +				//pop edi - shadowStart  				if (shadDirection != 0 && shadWallDown != 0) {  					//push esi -					//esi = edi; -					//push	shadBitMask -					//push	shadBitAddr -					//shadBitMask = shadWallBitMask; -					//shadBitAddr = shadWallBitAddr; -					//eax = shadWallSkipX; -					//edi = shadWallDestAddr; -					//esi += shadWallSkipX; -					//if (ct_loop > shadWallSkipX && ct_loop - shadWallSkipX > shadWallModulo) { +					//esi = edi; // shadowStart +					//push shadBitMask +					//push shadBitAddr +					shadBitMask = shadWallBitMask; +					shadBitAddr = shadWallBitAddr; +					//eax = shadWallSkipX; -not needed in wall_copy_trans +					background = (byte *)_graph->_frontScreen->getBasePtr(_shadDrawX + diffX, _shadDrawY + diffY); //edi = shadWallDestAddr; +					shadowStart = (byte *)makeShadow->getBasePtr(shadWallSkipX, blackHeroY); //esi += shadWallSkipX; + +					if (ct_loop > shadWallSkipX && ct_loop - shadWallSkipX > shadWallModulo) {  						//WALL_copy_trans -					//} else { +						//push eax, ebx, edx, ebp +						//ebx = SprShadow; +						//ebp = ShadBitAddr; +						//ah = ShadBitMask; +						shadWDFlag = 0; +						int shadZoomX = _scaleValue; +						int backgroundDiff = 0; +						int blackHeroXWall = 0; +						//ct_loop: +						for (int j = 0; j < ct_loop; j++) { +							shadZoomX -= 100; +							if (shadZoomX < 0 && _scaleValue != 10000) { +								blackHeroXWall++; +								shadowStart = (byte *)makeShadow->getBasePtr(shadWallSkipX + blackHeroXWall, blackHeroY); +								shadZoomX += _scaleValue; +							} else { +								//point_ok: +								if (*shadowStart == kShadowColor) { +									if (shadBitMask != _shadowBitmap->getShadow(shadBitAddr + kShadowBitmapSize)) { +										//*background = *(sprShadow + *background);	 +										*background = 50; +									} +								} +								//ct_next +								//ror(shadBitMask, 1) +								if (shadBitMask == 1) { +									shadBitMask = 128; +									shadBitAddr++; +								} else { +									shadBitMask /= 2; +								} +								//okok +								blackHeroXWall++; +								shadowStart = (byte *)makeShadow->getBasePtr(shadWallSkipX + blackHeroXWall, blackHeroY); +								backgroundDiff++; +								background = (byte *)_graph->_frontScreen->getBasePtr(_shadDrawX + diffX + backgroundDiff, _shadDrawY + diffY); +							} +						} +					} else {  						//krap2  						//pop shadBitAddr  						//pop shadBitMask  						//pop esi -						//ebx = VESA_ScanLine  						if (shadDirection != 0) { -							//shadWallDestAddr -= ebx; //SCREENWIDTH -							//shadWallBitAddr -= kMaxPicWidth / 8; -							//shadWallPosY--; +							shadWallDestAddr -= kScreenWidth; +							shadWallBitAddr -= kMaxPicWidth / 8; +							shadWallPosY--;  						} else {  							//down_direct -							//shadWallDestAddr += ebx; //SCREENWIDTH -							//shadWallBitAddr += kMaxPicWidth / 8; -							//shadWallPosY++; +							shadWallDestAddr += kScreenWidth; +							shadWallBitAddr += kMaxPicWidth / 8; +							shadWallPosY++;  						}  						//compareagain -						//if (shadWallPosY < shadMinY) { -						//	shadMinY = shadWallPosY; -						//} -						//if (shadWallPosY > shadMaxY) { -						//	shadMaxY = shadWallPosY; -						//} -					//} +						if (shadWallPosY < shadMinY) { +							shadMinY = shadWallPosY; +						} +						if (shadWallPosY > shadMaxY) { +							shadMaxY = shadWallPosY; +						} +					}  				} +				*/  			}  			//skip_line  			//add esi, sprWidth - don't need it? diff --git a/engines/prince/hero.h b/engines/prince/hero.h index 28b97d9b68..7fe3218b91 100644 --- a/engines/prince/hero.h +++ b/engines/prince/hero.h @@ -45,7 +45,8 @@ public:  	static const int16 kZoomBitmapWidth = kMaxPicWidth / kZoomStep;  	static const int16 kNormalWidth = 640;  	static const int16 kShadowLineArraySize = 2 * 1280 * 4; -	static const int16 kShadowBitmapSize = kMaxPicWidth * kMaxPicHeight / 8; +	static const int32 kShadowBitmapSize = kMaxPicWidth * kMaxPicHeight / 8; +	static const int16 kScreenWidth = 640;  	static const byte kShadowColor = 191; @@ -182,7 +183,7 @@ public:  	Common::Array<Animation *> _moveSet; // MoveAnims MoveSet  	// TurnAnim ??  	Animation *_zoomBitmap; // change to sth else, not Animation ?? -	Animation *_shadowBitmap; +	byte *_shadowBitmap;  	byte *_shadowLine;  	uint32 _moveDelay; diff --git a/engines/prince/prince.cpp b/engines/prince/prince.cpp index f987ff222f..98f9689b9a 100644 --- a/engines/prince/prince.cpp +++ b/engines/prince/prince.cpp @@ -294,10 +294,7 @@ bool PrinceEngine::loadLocation(uint16 locationNr) {  	_mainHero->_zoomBitmap->clear();  	Resource::loadResource(_mainHero->_zoomBitmap, "zoom", false); -	_mainHero->_shadowBitmap->clear(); -	if (Resource::loadResource(_mainHero->_shadowBitmap, "shadow", false) == false) { -		Resource::loadResource(_mainHero->_shadowBitmap, "shadow2", false); -	} +	loadShadow(_mainHero->_shadowBitmap, _mainHero->kShadowBitmapSize, "shadow", "shadow2");  	_picWindowX = 0; @@ -471,6 +468,31 @@ bool PrinceEngine::loadAnim(uint16 animNr, bool loop) {  	return true;  } +bool PrinceEngine::loadShadow(byte *shadowBitmap, uint32 dataSize, const char *resourceName1, const char *resourceName2) { + +	Common::SeekableReadStream *stream = SearchMan.createReadStreamForMember(resourceName1); +	if (!stream) { +		return false; +	} + +	if (stream->read(shadowBitmap, dataSize) != dataSize) { +		free(shadowBitmap); +		return false; +	} + +	stream = SearchMan.createReadStreamForMember(resourceName2); +	if (!stream) { +		return false; +	} + +	byte *shadowBitmap2 = shadowBitmap + dataSize; +	if (stream->read(shadowBitmap2, dataSize) != dataSize) { +		free(shadowBitmap); +		return false; +	} +	return true; +} +  void PrinceEngine::scrollCameraLeft(int16 delta) {      if (_newCameraX > 0) {          if (_newCameraX < delta) diff --git a/engines/prince/prince.h b/engines/prince/prince.h index e7cdce5af1..dd00abb788 100644 --- a/engines/prince/prince.h +++ b/engines/prince/prince.h @@ -124,6 +124,7 @@ public:  	bool loadAnim(uint16 animNr, bool loop);  	bool loadVoice(uint32 textSlot, uint32 sampleSlot, const Common::String &name);  	bool loadSample(uint32 sampleSlot, const Common::String &name); +	bool loadShadow(byte *shadowBitmap, uint32 dataSize, const char *resourceName1, const char *resourceName2);  	void playSample(uint16 sampleId, uint16 loopType);  	void stopSample(uint16 sampleId); | 
