diff options
| author | Ludvig Strigeus | 2001-11-27 17:56:04 +0000 | 
|---|---|---|
| committer | Ludvig Strigeus | 2001-11-27 17:56:04 +0000 | 
| commit | 1c0a7cd2e71e459f37323a25d0adf853ac882a2c (patch) | |
| tree | e5a6743452a7798e3118f5cbb5f22ee923396d96 | |
| parent | 38e2a886ce152ed2b0cfe9777a0514a10c56de04 (diff) | |
| download | scummvm-rg350-1c0a7cd2e71e459f37323a25d0adf853ac882a2c.tar.gz scummvm-rg350-1c0a7cd2e71e459f37323a25d0adf853ac882a2c.tar.bz2 scummvm-rg350-1c0a7cd2e71e459f37323a25d0adf853ac882a2c.zip  | |
some BOMP support,
some fixes
svn-id: r3506
| -rw-r--r-- | actor.cpp | 8 | ||||
| -rw-r--r-- | akos.cpp | 2 | ||||
| -rw-r--r-- | debug.cpp | 2 | ||||
| -rw-r--r-- | gfx.cpp | 91 | ||||
| -rw-r--r-- | object.cpp | 31 | ||||
| -rw-r--r-- | saveload.cpp | 2 | ||||
| -rw-r--r-- | script_v1.cpp | 8 | ||||
| -rw-r--r-- | script_v2.cpp | 10 | ||||
| -rw-r--r-- | scumm.h | 14 | ||||
| -rw-r--r-- | sdl.cpp | 3 | ||||
| -rw-r--r-- | sound.cpp | 2 | 
11 files changed, 141 insertions, 32 deletions
@@ -55,7 +55,7 @@ void Scumm::initActor(Actor *a, int mode) {  	setActorWalkSpeed(a, 8, 2);  	a->ignoreBoxes = 0; -	a->neverZClip = 0; +	a->forceClip = 0;  	a->new_3 = 0;  	a->initFrame = 1;  	a->walkFrame = 2; @@ -773,6 +773,7 @@ void Scumm::processActors() {  		a = *ac;  		if (a->costume) {  			CHECK_HEAP +			getMaskFromBox(a->walkbox);  			drawActorCostume(a);  			CHECK_HEAP  			actorAnimate(a); @@ -786,8 +787,8 @@ void Scumm::setupCostumeRenderer(CostumeRenderer *c, Actor *a) {  	c->_zbuf = a->mask;  	if (c->_zbuf > gdi._numZBuffer)  		c->_zbuf = (byte)gdi._numZBuffer; -	if (a->neverZClip) -		c->_zbuf = a->neverZClip; +	if (a->forceClip) +		c->_zbuf = a->forceClip;  	c->_scaleX = a->scalex;  	c->_scaleY = a->scaley; @@ -1024,6 +1025,7 @@ void Scumm::startWalkActor(Actor *a, int x, int y, int dir) {  	a->walkdata.destbox = (byte)abr.dist; /* a box */  	a->walkdata.destdir = dir;  	a->moving = (a->moving&2)|1; +	a->walkdata.curbox = a->walkbox;  }  byte *Scumm::getActorName(Actor *a) { @@ -384,6 +384,7 @@ const byte default_scale_table[768] = {  0x17, 0x97, 0x57, 0xD7, 0x37, 0xB7, 0x77, 0xF7,  0x0F, 0x8F, 0x4F, 0xCF, 0x2F, 0xAF, 0x6F, 0xEF,  0x1F, 0x9F, 0x5F, 0xDF, 0x3F, 0xBF, 0x7F, 0xFE, +  0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0,  0x10, 0x90, 0x50, 0xD0, 0x30, 0xB0, 0x70, 0xF0,  0x08, 0x88, 0x48, 0xC8, 0x28, 0xA8, 0x68, 0xE8, @@ -416,6 +417,7 @@ const byte default_scale_table[768] = {  0x17, 0x97, 0x57, 0xD7, 0x37, 0xB7, 0x77, 0xF7,  0x0F, 0x8F, 0x4F, 0xCF, 0x2F, 0xAF, 0x6F, 0xEF,  0x1F, 0x9F, 0x5F, 0xDF, 0x3F, 0xBF, 0x7F, 0xFE, +  0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0,  0x10, 0x90, 0x50, 0xD0, 0x30, 0xB0, 0x70, 0xF0,  0x08, 0x88, 0x48, 0xC8, 0x28, 0xA8, 0x68, 0xE8, @@ -198,7 +198,7 @@ void ScummDebugger::printActors(int act) {  			a = &_s->actor[i];  			if (a->visible)  				printf("|%2d|%4d|%3d  %3d|%4d|%3d|%5d|%3d|%3d|%2d|%5d|%5d|%3d|%3d|\n", -					i,a->room,a->x,a->y,a->elevation,a->costume,a->width,a->walkbox,a->moving,a->neverZClip,a->frame,a->scalex,a->speedx,a->facing); +					i,a->room,a->x,a->y,a->elevation,a->costume,a->width,a->walkbox,a->moving,a->forceClip,a->frame,a->scalex,a->speedx,a->facing);  		}  	}  	printf("+--------------------------------------------------------------+\n"); @@ -1998,4 +1998,95 @@ int Scumm::remapPaletteColor(byte r, byte g, byte b, uint threshold) {  void Scumm::setupShadowPalette(int slot,int rfact,int gfact,int bfact,int from,int to) { +} + +void Scumm::drawBomp(BompDrawData *bd) { +	byte *dest = bd->out + bd->y * bd->outwidth, *src; +	int h = bd->srcheight; +	bool inside; + +	if (h==0 || bd->srcwidth==0) +		return; + +	inside = (bd->x>=0) && (bd->y>=0) && +		(bd->x <= bd->outwidth - bd->srcwidth) && +		(bd->y <= bd->outheight - bd->srcheight); +	assert(_objs[2].obj_nr == 36); + +	if (1 || bd->scale_x==255 && bd->scale_y==255) { +		/* Routine used when no scaling is needed */ +		if (inside) { +			dest += bd->x; +			src = bd->dataptr; +			do { +				byte code,color; +				uint len = bd->srcwidth, num, i; +				byte *d = dest; +				src += 2; +				do { +					code = *src++; +					num = (code>>1)+1; +					if (num>len) num=len; +					len -= num; +					if (code&1) { +						color = *src++; +						if (color!=255) { +							do *d++ = color; while (--num); +						} else { +							d += num; +						} +					} else { +						for(i=0;i<num; i++) +							if ( (color=src[i]) != 255) +								d[i] = color; +						d += num; +						src += num; +					} +				} while (len); +				dest += bd->outwidth; +			} while (--h); +		} else { +			uint y = bd->y; +			src = bd->dataptr; + +			do { +				byte color,code; +				uint len, num; +				uint x; +				if ((uint)y >= (uint)bd->outheight) { +					src += READ_LE_UINT16(src) + 2; +					continue; +				} +				len = bd->srcwidth; +				x = bd->x; + +				src += 2; +				do { +					byte code = *src++; +					num = (code>>1)+1; +					if (num>len) num=len; +					len -= num; +					if (code&1) { +						if ((color = *src++)!=255) { +							do { +								if ((uint)x < (uint)bd->outwidth) +									dest[x] = color; +							} while (++x,--num); +						} else { +							x += num; +						} +					} else { +						do { +							if ((color=*src++) != 255 && (uint)x < (uint)bd->outwidth) +								dest[x] = color; +						} while (++x,--num); +					} +				} while (len); +			} while (dest += bd->outwidth,y++,--h); +		} +	} else { +		/* scaling of bomp images not supported yet */ +	} +	CHECK_HEAP +	assert(_objs[2].obj_nr == 36);  }
\ No newline at end of file diff --git a/object.cpp b/object.cpp index f68e48e140..02b732dd30 100644 --- a/object.cpp +++ b/object.cpp @@ -232,7 +232,7 @@ void Scumm::drawRoomObjects(int arg) {  	for(i=1; i<=_numObjectsInRoom; i++) {  		od = &_objs[i]; -		if (!od->obj_nr || !od->state || od->fl_object_index) +		if (!od->obj_nr || !od->state)  			continue;  		do {  			a = od->parentstate; @@ -921,6 +921,8 @@ void Scumm::drawEnqueuedObject(EnqueuedObject *eo) {  	int x,y;  	byte *dataptr; +	BompDrawData bdd; +  	vs = &virtscr[0];  	_lastXstart = vs->xstart; @@ -928,35 +930,40 @@ void Scumm::drawEnqueuedObject(EnqueuedObject *eo) {  	if (eo->l==0) {  		roomptr = getResourceAddress(1, _roomResource);  		index = getObjectIndex(eo->a); +		assert(index != -1);  		ptr = roomptr + _objs[index].offs_obim_to_room;  	} else if (eo->a!=0) {  		od = &_objs[getObjectIndex(eo->a)];  		ptr = getResourceAddress(rtFlObject, od->fl_object_index); +		assert(ptr);  		ptr = findResource(MKID('OBIM'), ptr);  	} else {  		warning("drawEnqueuedObject: invalid");  		return;  	} +	assert(ptr);  	ptr = findResource(MKID('IM01'), ptr); +	assert(ptr);  	bomp = findResource(MKID('BOMP'), ptr); -	width = READ_LE_UINT16(&((BompHeader*)bomp)->width); -	height = READ_LE_UINT16(&((BompHeader*)bomp)->height); +	bdd.srcwidth = READ_LE_UINT16(&((BompHeader*)bomp)->width); +	bdd.srcheight = READ_LE_UINT16(&((BompHeader*)bomp)->height); -	outptr = getResourceAddress(rtBuffer, vs->number+1) + vs->xstart; +	bdd.out = getResourceAddress(rtBuffer, vs->number+1) + vs->xstart; +	bdd.outwidth = 320; +	bdd.outheight = vs->height; +	bdd.dataptr = bomp + 18; +	bdd.x = eo->x; +	bdd.y = eo->y; +	bdd.scale_x = eo->j; +	bdd.scale_y = eo->k; -	x = eo->x; -	y = eo->y; +	updateDirtyRect(vs->number, bdd.x, bdd.x+bdd.srcwidth, bdd.y, bdd.y+bdd.srcheight, 0);  	if (eo->a) { -		dataptr = bomp + 18; +		drawBomp(&bdd);  	} - -//	debug(1, "drawEnqueuedObject(%d,%d,%d,%d,%d,  %d,%d,%d,%d,%d,%d,%d)", -//		eo->x, eo->y, eo->width, eo->height, eo->a, eo->b, eo->c, eo->d, eo->e, eo->j, eo->k, eo->l); - -	updateDirtyRect(vs->number, x, x+width,y,y+height,0);  }  void Scumm::removeEnqueuedObjects() { diff --git a/saveload.cpp b/saveload.cpp index 199eea4594..f0289634eb 100644 --- a/saveload.cpp +++ b/saveload.cpp @@ -223,7 +223,7 @@ void Scumm::saveOrLoad(Serializer *s) {  		MKLINE(Actor,newDirection,sleUint16),  		MKLINE(Actor,moving,sleByte),  		MKLINE(Actor,ignoreBoxes,sleByte), -		MKLINE(Actor,neverZClip,sleByte), +		MKLINE(Actor,forceClip,sleByte),  		MKLINE(Actor,initFrame,sleByte),  		MKLINE(Actor,walkFrame,sleByte),  		MKLINE(Actor,standFrame,sleByte), diff --git a/script_v1.cpp b/script_v1.cpp index 828fcb2836..5bbbe4570b 100644 --- a/script_v1.cpp +++ b/script_v1.cpp @@ -439,21 +439,21 @@ void Scumm::o5_actorSet() {  			a->needBgReset = true;  			break;  		case 18: /* neverzclip */ -			a->neverZClip = 0; +			a->forceClip = 0;  			break;  		case 19: /* setzclip */ -			a->neverZClip = getVarOrDirectByte(0x80); +			a->forceClip = getVarOrDirectByte(0x80);  			break;  		case 20: /* ignoreboxes */  			a->ignoreBoxes = 1; -			a->neverZClip = 0; +			a->forceClip = 0;  FixRoom:  			if (a->room==_currentRoom)  				putActor(a, a->x, a->y, a->room);  			break;  		case 21: /* followboxes */  			a->ignoreBoxes = 0; -			a->neverZClip = 0; +			a->forceClip = 0;  			goto FixRoom;  		case 22: /* animspeed */ diff --git a/script_v2.cpp b/script_v2.cpp index f4f2155d53..e4d9b42bc4 100644 --- a/script_v2.cpp +++ b/script_v2.cpp @@ -729,7 +729,7 @@ void Scumm::o6_cursorCommand() {  		break;  	case 0x99:  		a = pop(); -		setCursorImg(a, pop(), 1); +		setCursorImg(pop(), a, 1);  		break;  	case 0x9A:  		a = pop(); @@ -1475,22 +1475,22 @@ void Scumm::o6_actorSet() {  		a->needBgReset = true;  		break;  	case 93: -		a->neverZClip = 0; +		a->forceClip = 0;  		break;  	case 225:  	case 94: -		a->neverZClip = pop(); +		a->forceClip = pop();  		break;  	case 95:  		a->ignoreBoxes = 1; -		a->neverZClip = 0; +		a->forceClip = 0;  FixRooms:;  		if (a->room==_currentRoom)  			putActor(a, a->x, a->y, a->room);  		break;  	case 96:  		a->ignoreBoxes = 0; -		a->neverZClip = 0; +		a->forceClip = 0;  		goto FixRooms;  	case 97:  		a->animSpeed = pop(); @@ -632,6 +632,15 @@ struct AkosRenderer {  	byte palette[256];  }; +struct BompDrawData { +	byte *out; +	int outwidth, outheight; +	int x,y; +	byte scale_x, scale_y; +	byte *dataptr; +	int srcwidth, srcheight; +}; +  struct CostumeRenderer {  	Scumm *_vm;  	byte *_ptr; @@ -702,7 +711,7 @@ struct Actor {  	int16 newDirection;  	byte moving;  	byte ignoreBoxes; -	byte neverZClip; +	byte forceClip;  	byte initFrame,walkFrame,standFrame,talkFrame1,talkFrame2;  	bool needRedraw, needBgReset,costumeNeedsInit,visible;  	byte unk1; @@ -2004,6 +2013,8 @@ struct Scumm {  	int cost_frameToAnim(Actor *a, int frame);  	void setupShadowPalette(int slot,int rfact,int gfact,int bfact,int from,int to); + +	void drawBomp(BompDrawData *bd);  };  enum AkosOpcodes{ @@ -2111,6 +2122,7 @@ struct Serializer {  };  extern const uint32 IMxx_tags[]; +extern const byte default_scale_table[768];  void outputdisplay2(Scumm *s, int disp);  extern const byte revBitMask[8]; @@ -75,9 +75,6 @@ void waitForTimer(Scumm *s, int msec_delay) {  	SDL_Event event;  	uint32 start_time; -	if (msec_delay<0) -		return; -  	if (s->_fastMode&2)  		msec_delay = 0;  	else if (s->_fastMode&1) @@ -138,8 +138,6 @@ void Scumm::startTalkSound(uint32 offset, uint32 b, int mode) {  	byte file_byte,file_byte_2;  	uint16 elem; -	return; -  	if (!_sfxFile) {  		warning("startTalkSound: SFX file is not open");  		return;  | 
