diff options
-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; |