diff options
| author | Vincent Hamm | 2002-04-19 12:38:03 +0000 | 
|---|---|---|
| committer | Vincent Hamm | 2002-04-19 12:38:03 +0000 | 
| commit | 708799f8dba34112d945ceebc3171cd0ece126de (patch) | |
| tree | 903649186453fff5e4a5043e13e8896447365a6f | |
| parent | 89d957090e977e73a9ef314d647e4cded3710bdb (diff) | |
| download | scummvm-rg350-708799f8dba34112d945ceebc3171cd0ece126de.tar.gz scummvm-rg350-708799f8dba34112d945ceebc3171cd0ece126de.tar.bz2 scummvm-rg350-708799f8dba34112d945ceebc3171cd0ece126de.zip | |
Early flashlight implementation
svn-id: r4006
| -rw-r--r-- | costume.cpp | 131 | ||||
| -rw-r--r-- | script_v2.cpp | 9 | ||||
| -rw-r--r-- | scumm.h | 3 | 
3 files changed, 121 insertions, 22 deletions
| diff --git a/costume.cpp b/costume.cpp index cb566ee368..8bca4f1cac 100644 --- a/costume.cpp +++ b/costume.cpp @@ -274,8 +274,7 @@ byte CostumeRenderer::mainRoutine(Actor * a, int slot, int frame)  	}  	_bgbak_ptr = -		_vm->getResourceAddress(rtBuffer, -														5) + _vm->virtscr[0].xstart + _ypos * 320 + _xpos; +		_vm->getResourceAddress(rtBuffer,5) + _vm->virtscr[0].xstart + _ypos * 320 + _xpos;  	_backbuff_ptr =  		_vm->virtscr[0].screenPtr + _vm->virtscr[0].xstart + _ypos * 320 + _xpos;  	charsetmask = @@ -284,18 +283,13 @@ byte CostumeRenderer::mainRoutine(Actor * a, int slot, int frame)  	masking = 0;  	if (_zbuf) { -		masking = _vm->isMaskActiveAt(_left, _top, _right, _bottom, -																	_vm->getResourceAddress(rtBuffer, -																													9) + +		masking = _vm->isMaskActiveAt(_left, _top, _right, _bottom,_vm->getResourceAddress(rtBuffer,9) +  																	_vm->gdi._imgBufOffs[_zbuf] +  																	_vm->_screenStartStrip);  	}  	if (_zbuf || charsetmask) { -		_mask_ptr = -			_vm->getResourceAddress(rtBuffer, -															9) + _ypos * 40 + _vm->_screenStartStrip; - +		_mask_ptr =_vm->getResourceAddress(rtBuffer,9) + _ypos * 40 + _vm->_screenStartStrip;  		_imgbufoffs = _vm->gdi._imgBufOffs[_zbuf];  		if (!charsetmask && _zbuf != 0)  			_mask_ptr += _imgbufoffs; @@ -303,30 +297,30 @@ byte CostumeRenderer::mainRoutine(Actor * a, int slot, int frame)  	}  	CHECK_HEAP if (a->shadow_mode) { -		proc_special(a->shadow_mode); +		proc_special(a,(masking<<1)+charsetmask);  		return b;  	}  	switch ((scaling << 2) | (masking << 1) | charsetmask) {  	case 0: -		proc6(); +		proc6(); // no scaling, no masking, no charsetmask  		break;  	case 1:  	case 2: -		proc5(); +		proc5(); // no scaling, masking or charsetmask  		break;  	case 3: -		proc4(); +		proc4(); // no scaling, masking and charsetmask  		break;  	case 4: -		proc1(); +		proc1(); // scaling, no masking, no charsetmask  		break;  	case 5:  	case 6: -		proc2(); +		proc2(); // scaling, masking or charsetmask  		break;  	case 7: -		proc3(); +		proc3(); // scaling, masking and charsetmask  		break;  	} @@ -538,8 +532,7 @@ void CostumeRenderer::proc3()  			len = *src++;  		do {  			if (cost_scaleTable[_scaleIndexY++] < _scaleY) { -				if (color && y < _outheight -						&& !((*mask | mask[_imgbufoffs]) & maskbit)) { +				if (color && y < _outheight && !((*mask | mask[_imgbufoffs]) & maskbit)) {  					pcolor = _palette[color];  					if (pcolor == 13)  						pcolor = _transEffect[*dst]; @@ -695,9 +688,107 @@ void CostumeRenderer::proc1()  	} while (1);  } -void CostumeRenderer::proc_special(byte code) +void CostumeRenderer::proc_special(Actor *a, byte mask2)  { -	warning("stub CostumeRenderer::proc_special(%d) not implemented"); +	byte *mask, *src, *dst, *dstorg; +	byte maskbit, len, height, pcolor, width; +	uint y; +	int color; +	int t; + +	byte shadow1; +	byte shadow2; +	byte shadow3; +	byte shadow4; +	byte shadow5; + +	shadow1=a->shadow_mode & 0x80; +	shadow2=a->shadow_mode & 0x40; +	shadow3=a->shadow_mode & 0x20; +	shadow4=a->shadow_mode & 0x10; +	shadow5=a->shadow_mode & 0x0F; + +	mask = _mask_ptr = _mask_ptr_dest; +	maskbit = revBitMask[_xpos & 7]; +	y = _ypos; + +	mask = _mask_ptr_dest; +	dstorg = dst = _backbuff_ptr; +	height = _height2; +	width = _width2; +	len = _replen; +	color = _repcolor; +	src = _srcptr; + +	if(_mirror == 0) +		shadow5=-shadow5; + +	maskbit = revBitMask[_xpos & 7]; + +	dst = _backbuff_ptr; + +	if(mask2 !=0 && mask2 < 3) +		_imgbufoffs = 0; + +	if (_docontinue) +		goto StartPos; + +	do { +		len = *src++; +		color = len >> _shrval; +		len &= _maskval; +		if (!len) +			len = *src++; + +		do { // ok +			if (cost_scaleTable[_scaleIndexY++] < _scaleY) { +				if (color && y < _outheight) { +					if (!mask2 || (mask2 && !((*mask | mask[_imgbufoffs]) & maskbit))) +					{ +						if(shadow3 == 0) +						{ +							pcolor = _palette[color]; +							if (pcolor != 13) +								goto proc_special_end; + +						} +						if(shadow2 != 0) +						{ +							warning("proc_special: shadow2 unimplemented"); +						} +						else // we don't need all the random stuff, just the background copy +						{ +							pcolor=_vm->_proc_special_palette[*dst]; +						} +proc_special_end:;			*dst = pcolor; +					} +				} +				dst += 320; +				mask += 40; +				y++; +			} +			if (!--height) { +				if (!--width) +					return; +				height = _height; +				y = _ypostop; +				_scaleIndexY = _scaleIndexYTop; +				t = _scaleIndexX; +				_scaleIndexX = t + _scaleIndexXStep; +				if (cost_scaleTable[t] < _scaleX) { +					_xpos += _scaleIndexXStep; +					if (_xpos >= 320) +						return; +					maskbit = revBitMask[_xpos & 7]; +					_backbuff_ptr += _scaleIndexXStep; +				} +				dst = _backbuff_ptr; +				mask = _mask_ptr + (_xpos >> 3); +			} +		StartPos:; +		} while (--len); +	} while (1); +	  }  #if 0 diff --git a/script_v2.cpp b/script_v2.cpp index 7de8a863da..5562805cdb 100644 --- a/script_v2.cpp +++ b/script_v2.cpp @@ -2796,8 +2796,15 @@ void Scumm::o6_miscOps()  			a->needRedraw = true;  			break; -		case 108:									/* shadow palette? */ +		case 108:									/* create proc_special_palette */  		case 109: +			int i; +			byte j; +			for(i=0;i<256;i++) +			{ +				j=rand(); +				_proc_special_palette[i]=j; +			}  			warning("stub o6_miscOps_108(%d,%d,%d,%d,%d,%d,%d)", args[1], args[2],  							args[3], args[4], args[5], 0, 256);  			break; @@ -416,7 +416,7 @@ struct CostumeRenderer {  	void proc3();  	void proc2();  	void proc1(); -	void proc_special(byte code); +	void proc_special(Actor *a, byte mask);  	byte mainRoutine(Actor *a, int slot, int frame);  	void ignorePakCols(int num); @@ -1223,6 +1223,7 @@ public:  	byte *_shadowPalette;  	int _shadowPaletteSize;  	byte _currentPalette[0x300]; +	byte _proc_special_palette[256];  	int _palDirtyMin, _palDirtyMax;  	byte _bkColor;  	uint16 _lastXstart; | 
