bug fixes, code cleanup
svn-id: r3446
This commit is contained in:
parent
f9daf35824
commit
056dd5b15d
17 changed files with 1178 additions and 1110 deletions
11
actor.cpp
11
actor.cpp
|
@ -17,6 +17,9 @@
|
||||||
*
|
*
|
||||||
* Change Log:
|
* Change Log:
|
||||||
* $Log$
|
* $Log$
|
||||||
|
* Revision 1.7 2001/10/26 17:34:50 strigeus
|
||||||
|
* bug fixes, code cleanup
|
||||||
|
*
|
||||||
* Revision 1.6 2001/10/23 19:51:50 strigeus
|
* Revision 1.6 2001/10/23 19:51:50 strigeus
|
||||||
* recompile not needed when switching games
|
* recompile not needed when switching games
|
||||||
* debugger skeleton implemented
|
* debugger skeleton implemented
|
||||||
|
@ -445,8 +448,8 @@ void Scumm::putActor(Actor *a, int x, int y, byte room) {
|
||||||
a->needRedraw = true;
|
a->needRedraw = true;
|
||||||
a->needBgReset = true;
|
a->needBgReset = true;
|
||||||
|
|
||||||
if (_vars[VAR_UNK_ACTOR]==a->number) {
|
if (_vars[VAR_EGO]==a->number) {
|
||||||
dseg_3A76 = 1;
|
_egoPositioned = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (a->visible) {
|
if (a->visible) {
|
||||||
|
@ -774,8 +777,8 @@ void Scumm::setupCostumeRenderer(CostumeRenderer *c, Actor *a) {
|
||||||
c->_actorX = a->x - virtscr->xstart;
|
c->_actorX = a->x - virtscr->xstart;
|
||||||
c->_actorY = a->y - a->elevation;
|
c->_actorY = a->y - a->elevation;
|
||||||
c->_zbuf = a->mask;
|
c->_zbuf = a->mask;
|
||||||
if (c->_zbuf > _numZBuffer)
|
if (c->_zbuf > gdi._numZBuffer)
|
||||||
c->_zbuf = (byte)_numZBuffer;
|
c->_zbuf = (byte)gdi._numZBuffer;
|
||||||
if (a->neverZClip)
|
if (a->neverZClip)
|
||||||
c->_zbuf = a->neverZClip;
|
c->_zbuf = a->neverZClip;
|
||||||
|
|
||||||
|
|
48
costume.cpp
48
costume.cpp
|
@ -17,6 +17,9 @@
|
||||||
*
|
*
|
||||||
* Change Log:
|
* Change Log:
|
||||||
* $Log$
|
* $Log$
|
||||||
|
* Revision 1.6 2001/10/26 17:34:50 strigeus
|
||||||
|
* bug fixes, code cleanup
|
||||||
|
*
|
||||||
* Revision 1.5 2001/10/23 19:51:50 strigeus
|
* Revision 1.5 2001/10/23 19:51:50 strigeus
|
||||||
* recompile not needed when switching games
|
* recompile not needed when switching games
|
||||||
* debugger skeleton implemented
|
* debugger skeleton implemented
|
||||||
|
@ -286,21 +289,21 @@ byte CostumeRenderer::mainRoutine(Actor *a, int slot, int frame) {
|
||||||
return 2;
|
return 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
_where_to_draw_ptr = _vm->getResourceAddress(0xA, 5) + _vm->virtscr[0].xstart + _ypos*320 + _xpos;
|
_bgbak_ptr = _vm->getResourceAddress(0xA, 5) + _vm->virtscr[0].xstart + _ypos*320 + _xpos;
|
||||||
_bg_ptr = _vm->getResourceAddress(0xA, 1) + _vm->virtscr[0].xstart + _ypos*320 + _xpos;
|
_backbuff_ptr = _vm->getResourceAddress(0xA, 1) + _vm->virtscr[0].xstart + _ypos*320 + _xpos;
|
||||||
charsetmask = _vm->hasCharsetMask(_left, _top + _vm->virtscr[0].topline, _right, _vm->virtscr[0].topline + _bottom);
|
charsetmask = _vm->hasCharsetMask(_left, _top + _vm->virtscr[0].topline, _right, _vm->virtscr[0].topline + _bottom);
|
||||||
masking = 0;
|
masking = 0;
|
||||||
|
|
||||||
if (_zbuf) {
|
if (_zbuf) {
|
||||||
masking = _vm->isMaskActiveAt(_left, _top, _right, _bottom,
|
masking = _vm->isMaskActiveAt(_left, _top, _right, _bottom,
|
||||||
_vm->getResourceAddress(0xA, 9) + _vm->_imgBufOffs[_zbuf] + _vm->_screenStartStrip
|
_vm->getResourceAddress(0xA, 9) + _vm->gdi._imgBufOffs[_zbuf] + _vm->_screenStartStrip
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_zbuf || charsetmask) {
|
if (_zbuf || charsetmask) {
|
||||||
_mask_ptr = _vm->getResourceAddress(0xA, 9) + _ypos*40 + _vm->_screenStartStrip;
|
_mask_ptr = _vm->getResourceAddress(0xA, 9) + _ypos*40 + _vm->_screenStartStrip;
|
||||||
|
|
||||||
_imgbufoffs = _vm->_imgBufOffs[_zbuf];
|
_imgbufoffs = _vm->gdi._imgBufOffs[_zbuf];
|
||||||
if (!charsetmask && _zbuf!=0)
|
if (!charsetmask && _zbuf!=0)
|
||||||
_mask_ptr += _imgbufoffs;
|
_mask_ptr += _imgbufoffs;
|
||||||
_mask_ptr_dest = _mask_ptr + _xpos / 8;
|
_mask_ptr_dest = _mask_ptr + _xpos / 8;
|
||||||
|
@ -344,7 +347,7 @@ void CostumeRenderer::proc6() {
|
||||||
y = _ypos;
|
y = _ypos;
|
||||||
len = _replen;
|
len = _replen;
|
||||||
src = _srcptr;
|
src = _srcptr;
|
||||||
dst = _bg_ptr;
|
dst = _backbuff_ptr;
|
||||||
color = _repcolor;
|
color = _repcolor;
|
||||||
scrheight = _vscreenheight;
|
scrheight = _vscreenheight;
|
||||||
width = _width2;
|
width = _width2;
|
||||||
|
@ -391,7 +394,7 @@ void CostumeRenderer::proc5() {
|
||||||
maskbit = revBitMask[_xpos&7];
|
maskbit = revBitMask[_xpos&7];
|
||||||
y = _ypos;
|
y = _ypos;
|
||||||
src = _srcptr;
|
src = _srcptr;
|
||||||
dst = _bg_ptr;
|
dst = _backbuff_ptr;
|
||||||
len = _replen;
|
len = _replen;
|
||||||
color = _repcolor;
|
color = _repcolor;
|
||||||
scrheight = _vscreenheight;
|
scrheight = _vscreenheight;
|
||||||
|
@ -451,7 +454,7 @@ void CostumeRenderer::proc4() {
|
||||||
maskbit = revBitMask[_xpos&7];
|
maskbit = revBitMask[_xpos&7];
|
||||||
y = _ypos;
|
y = _ypos;
|
||||||
src = _srcptr;
|
src = _srcptr;
|
||||||
dst = _bg_ptr;
|
dst = _backbuff_ptr;
|
||||||
len = _replen;
|
len = _replen;
|
||||||
color = _repcolor;
|
color = _repcolor;
|
||||||
scrheight = _vscreenheight;
|
scrheight = _vscreenheight;
|
||||||
|
@ -508,7 +511,7 @@ void CostumeRenderer::proc3() {
|
||||||
uint y;
|
uint y;
|
||||||
|
|
||||||
mask = _mask_ptr_dest;
|
mask = _mask_ptr_dest;
|
||||||
dst = _bg_ptr;
|
dst = _backbuff_ptr;
|
||||||
height = _height2;
|
height = _height2;
|
||||||
width = _width2;
|
width = _width2;
|
||||||
len = _replen;
|
len = _replen;
|
||||||
|
@ -549,9 +552,9 @@ void CostumeRenderer::proc3() {
|
||||||
if (_xpos >= 320)
|
if (_xpos >= 320)
|
||||||
return;
|
return;
|
||||||
maskbit = revBitMask[_xpos&7];
|
maskbit = revBitMask[_xpos&7];
|
||||||
_bg_ptr += _scaleIndexXStep;
|
_backbuff_ptr += _scaleIndexXStep;
|
||||||
}
|
}
|
||||||
dst = _bg_ptr;
|
dst = _backbuff_ptr;
|
||||||
mask = _mask_ptr + (_xpos>>3);
|
mask = _mask_ptr + (_xpos>>3);
|
||||||
}
|
}
|
||||||
StartPos:;
|
StartPos:;
|
||||||
|
@ -566,7 +569,7 @@ void CostumeRenderer::proc2() {
|
||||||
uint y;
|
uint y;
|
||||||
|
|
||||||
mask = _mask_ptr_dest;
|
mask = _mask_ptr_dest;
|
||||||
dst = _bg_ptr;
|
dst = _backbuff_ptr;
|
||||||
height = _height2;
|
height = _height2;
|
||||||
width = _width2;
|
width = _width2;
|
||||||
len = _replen;
|
len = _replen;
|
||||||
|
@ -607,9 +610,9 @@ void CostumeRenderer::proc2() {
|
||||||
if (_xpos >= 320)
|
if (_xpos >= 320)
|
||||||
return;
|
return;
|
||||||
maskbit = revBitMask[_xpos&7];
|
maskbit = revBitMask[_xpos&7];
|
||||||
_bg_ptr += _scaleIndexXStep;
|
_backbuff_ptr += _scaleIndexXStep;
|
||||||
}
|
}
|
||||||
dst = _bg_ptr;
|
dst = _backbuff_ptr;
|
||||||
mask = _mask_ptr + (_xpos>>3);
|
mask = _mask_ptr + (_xpos>>3);
|
||||||
}
|
}
|
||||||
StartPos:;
|
StartPos:;
|
||||||
|
@ -619,28 +622,17 @@ StartPos:;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CostumeRenderer::proc1() {
|
void CostumeRenderer::proc1() {
|
||||||
byte *mask,*src,*dst;
|
byte *mask,*src,*dst,*dstorg;
|
||||||
byte maskbit,len,height,pcolor,width;
|
byte maskbit,len,height,pcolor,width;
|
||||||
uint y;
|
uint y;
|
||||||
int color;
|
int color;
|
||||||
int t;
|
int t;
|
||||||
|
|
||||||
#if 0
|
|
||||||
debug(1, "proc1(): (%d %d),(%d %d %d),(%d %d %d),(%d %d,%d %d,%d %d),(%d %d)",
|
|
||||||
_xpos, _ypos,
|
|
||||||
_width2, _height2, _height,
|
|
||||||
_replen,_repcolor,_docontinue,
|
|
||||||
_scaleX, _scaleY, _scaleIndexX, _scaleIndexY,
|
|
||||||
_scaleIndexXStep, _scaleIndexYStep,
|
|
||||||
_scaleIndexYTop,_vscreenheight
|
|
||||||
);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
mask = _mask_ptr = _mask_ptr_dest;
|
mask = _mask_ptr = _mask_ptr_dest;
|
||||||
maskbit = revBitMask[_xpos&7];
|
maskbit = revBitMask[_xpos&7];
|
||||||
y = _ypos;
|
y = _ypos;
|
||||||
|
|
||||||
dst = _bg_ptr;
|
dstorg = dst = _backbuff_ptr;
|
||||||
height = _height2;
|
height = _height2;
|
||||||
width = _width2;
|
width = _width2;
|
||||||
len = _replen;
|
len = _replen;
|
||||||
|
@ -678,9 +670,9 @@ void CostumeRenderer::proc1() {
|
||||||
_xpos += _scaleIndexXStep;
|
_xpos += _scaleIndexXStep;
|
||||||
if (_xpos >= 320)
|
if (_xpos >= 320)
|
||||||
return;
|
return;
|
||||||
_bg_ptr += _scaleIndexXStep;
|
_backbuff_ptr += _scaleIndexXStep;
|
||||||
}
|
}
|
||||||
dst = _bg_ptr;
|
dst = _backbuff_ptr;
|
||||||
}
|
}
|
||||||
StartPos:;
|
StartPos:;
|
||||||
} while (--len);
|
} while (--len);
|
||||||
|
|
54
debug.cpp
54
debug.cpp
|
@ -17,6 +17,9 @@
|
||||||
*
|
*
|
||||||
* Change Log:
|
* Change Log:
|
||||||
* $Log$
|
* $Log$
|
||||||
|
* Revision 1.3 2001/10/26 17:34:50 strigeus
|
||||||
|
* bug fixes, code cleanup
|
||||||
|
*
|
||||||
* Revision 1.2 2001/10/23 19:56:57 strigeus
|
* Revision 1.2 2001/10/23 19:56:57 strigeus
|
||||||
* fixed spelling error
|
* fixed spelling error
|
||||||
*
|
*
|
||||||
|
@ -36,6 +39,8 @@ enum {
|
||||||
CMD_HELP,
|
CMD_HELP,
|
||||||
CMD_QUIT,
|
CMD_QUIT,
|
||||||
CMD_GO,
|
CMD_GO,
|
||||||
|
CMD_ACTOR,
|
||||||
|
CMD_SCRIPTS,
|
||||||
};
|
};
|
||||||
|
|
||||||
void ScummDebugger::attach(Scumm *s) {
|
void ScummDebugger::attach(Scumm *s) {
|
||||||
|
@ -57,7 +62,7 @@ bool ScummDebugger::do_command() {
|
||||||
printf("Debugger commands:\n"
|
printf("Debugger commands:\n"
|
||||||
"help -> display this help text\n"
|
"help -> display this help text\n"
|
||||||
"quit -> quit the debugger\n"
|
"quit -> quit the debugger\n"
|
||||||
"step -> increase one frame\n"
|
"go [numframes] -> increase frame\n"
|
||||||
);
|
);
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
@ -71,7 +76,15 @@ bool ScummDebugger::do_command() {
|
||||||
else
|
else
|
||||||
_go_amount = atoi(_parameters);
|
_go_amount = atoi(_parameters);
|
||||||
return false;
|
return false;
|
||||||
|
case CMD_ACTOR:
|
||||||
|
if (!_parameters[0])
|
||||||
|
printActors(-1);
|
||||||
|
else
|
||||||
|
printActors(atoi(_parameters));
|
||||||
|
return true;
|
||||||
|
case CMD_SCRIPTS:
|
||||||
|
printScripts();
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -108,6 +121,8 @@ static const DebuggerCommands debugger_commands[] = {
|
||||||
{ "h", 1, CMD_HELP },
|
{ "h", 1, CMD_HELP },
|
||||||
{ "q", 1, CMD_QUIT },
|
{ "q", 1, CMD_QUIT },
|
||||||
{ "g", 1, CMD_GO },
|
{ "g", 1, CMD_GO },
|
||||||
|
{ "a", 1, CMD_ACTOR },
|
||||||
|
{ "s", 1, CMD_SCRIPTS },
|
||||||
{ 0, 0, 0 },
|
{ 0, 0, 0 },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -143,4 +158,39 @@ int ScummDebugger::get_command() {
|
||||||
if (*s==32) { *s=0; break; }
|
if (*s==32) { *s=0; break; }
|
||||||
printf("Invalid command '%s'. Type 'help' for a list of available commands.\n", _cmd_buffer);
|
printf("Invalid command '%s'. Type 'help' for a list of available commands.\n", _cmd_buffer);
|
||||||
} while (1);
|
} while (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ScummDebugger::printActors(int act) {
|
||||||
|
int i;
|
||||||
|
Actor *a;
|
||||||
|
|
||||||
|
if (act==-1) {
|
||||||
|
printf("+--------------------------------------------------------------+\n");
|
||||||
|
printf("|# |room| x y |elev|cos|width|box|mov|zp|frame|scale|spd|dir|\n");
|
||||||
|
printf("+--+----+--------+----+---+-----+---+---+--+-----+-----+---+---+\n");
|
||||||
|
for(i=1; i<13; i++) {
|
||||||
|
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->animIndex,a->scalex,a->speedx,a->facing);
|
||||||
|
}
|
||||||
|
printf("+--------------------------------------------------------------+\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ScummDebugger::printScripts() {
|
||||||
|
int i;
|
||||||
|
ScriptSlot *ss;
|
||||||
|
|
||||||
|
printf("+---------------------------------+\n");
|
||||||
|
printf("|# |num|sta|typ|un1|un2|fc|cut|un5|\n");
|
||||||
|
printf("+--+---+---+---+---+---+--+---+---+\n");
|
||||||
|
for(i=0; i<25; i++) {
|
||||||
|
ss = &_s->vm.slot[i];
|
||||||
|
if (ss->number) {
|
||||||
|
printf("|%2d|%3d|%3d|%3d|%3d|%3d|%2d|%3d|%3d|\n",
|
||||||
|
i, ss->number, ss->status, ss->type, ss->unk1, ss->unk2, ss->freezeCount, ss->cutsceneOverride, ss->unk5);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
printf("+---------------------------------+\n");
|
||||||
}
|
}
|
96
object.cpp
96
object.cpp
|
@ -17,6 +17,9 @@
|
||||||
*
|
*
|
||||||
* Change Log:
|
* Change Log:
|
||||||
* $Log$
|
* $Log$
|
||||||
|
* Revision 1.7 2001/10/26 17:34:50 strigeus
|
||||||
|
* bug fixes, code cleanup
|
||||||
|
*
|
||||||
* Revision 1.6 2001/10/23 19:51:50 strigeus
|
* Revision 1.6 2001/10/23 19:51:50 strigeus
|
||||||
* recompile not needed when switching games
|
* recompile not needed when switching games
|
||||||
* debugger skeleton implemented
|
* debugger skeleton implemented
|
||||||
|
@ -152,13 +155,13 @@ void Scumm::getObjectXYPos(int object) {
|
||||||
|
|
||||||
if (od->fl_object_index) {
|
if (od->fl_object_index) {
|
||||||
ptr = getResourceAddress(0xD, od->fl_object_index);
|
ptr = getResourceAddress(0xD, od->fl_object_index);
|
||||||
ptr = findResource(MKID('OBIM'), ptr);
|
ptr = findResource(MKID('OBIM'), ptr, 0);
|
||||||
} else {
|
} else {
|
||||||
ptr = getResourceAddress(1, _roomResource);
|
ptr = getResourceAddress(1, _roomResource);
|
||||||
ptr += od->offs_obim_to_room;
|
ptr += od->offs_obim_to_room;
|
||||||
}
|
}
|
||||||
|
|
||||||
imhd = (ImageHeader*)findResource2(MKID('IMHD'), ptr);
|
imhd = (ImageHeader*)findResource(MKID('IMHD'), ptr, 0);
|
||||||
x = od->x_pos*8 + (int16)READ_LE_UINT16(&imhd->hotspot[state].x);
|
x = od->x_pos*8 + (int16)READ_LE_UINT16(&imhd->hotspot[state].x);
|
||||||
y = od->y_pos*8 + (int16)READ_LE_UINT16(&imhd->hotspot[state].y);
|
y = od->y_pos*8 + (int16)READ_LE_UINT16(&imhd->hotspot[state].y);
|
||||||
} else {
|
} else {
|
||||||
|
@ -196,7 +199,6 @@ int Scumm::getObjActToObjActDist(int a, int b) {
|
||||||
if (getObjectOrActorXY(b)==-1)
|
if (getObjectOrActorXY(b)==-1)
|
||||||
return 0xFF;
|
return 0xFF;
|
||||||
|
|
||||||
/* XXX: bug here? should be <= */
|
|
||||||
if (acta) {
|
if (acta) {
|
||||||
AdjustBoxResult r = adjustXYToBeInBox(acta, _xPos, _yPos);
|
AdjustBoxResult r = adjustXYToBeInBox(acta, _xPos, _yPos);
|
||||||
_xPos = r.x;
|
_xPos = r.x;
|
||||||
|
@ -281,12 +283,13 @@ void Scumm::drawObject(int obj, int arg) {
|
||||||
ObjectData *od;
|
ObjectData *od;
|
||||||
int xpos, ypos, height, width;
|
int xpos, ypos, height, width;
|
||||||
byte *ptr;
|
byte *ptr;
|
||||||
int x,a,b;
|
int x,a,numstrip;
|
||||||
|
int tmp;
|
||||||
|
|
||||||
if (_BgNeedsRedraw)
|
if (_BgNeedsRedraw)
|
||||||
arg = 0;
|
arg = 0;
|
||||||
|
|
||||||
gdi.virtScreen = 0;
|
_curVirtScreen = &virtscr[0];
|
||||||
|
|
||||||
od = &_objs[obj];
|
od = &_objs[obj];
|
||||||
|
|
||||||
|
@ -300,40 +303,39 @@ void Scumm::drawObject(int obj, int arg) {
|
||||||
|
|
||||||
if (od->fl_object_index) {
|
if (od->fl_object_index) {
|
||||||
ptr = getResourceAddress(0xD, od->fl_object_index);
|
ptr = getResourceAddress(0xD, od->fl_object_index);
|
||||||
ptr = findResource(MKID('OBIM'), ptr);
|
ptr = findResource(MKID('OBIM'), ptr, 0);
|
||||||
} else {
|
} else {
|
||||||
ptr = getResourceAddress(1, _roomResource);
|
ptr = getResourceAddress(1, _roomResource);
|
||||||
ptr = ptr + od->offs_obim_to_room;
|
ptr = ptr + od->offs_obim_to_room;
|
||||||
}
|
}
|
||||||
|
|
||||||
ptr = findResource(state_tags[getState(od->obj_nr)], ptr);
|
ptr = findResource(state_tags[getState(od->obj_nr)], ptr, 0);
|
||||||
if (!ptr)
|
if (!ptr)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
x = 0xFFFF;
|
x = 0xFFFF;
|
||||||
|
|
||||||
for (a=b=0; a<width; a++) {
|
for (a=numstrip=0; a<width; a++) {
|
||||||
_drawBmpX = xpos + a;
|
tmp = xpos + a;
|
||||||
if (arg==1 && _screenStartStrip!=_drawBmpX)
|
if (arg==1 && _screenStartStrip!=tmp)
|
||||||
continue;
|
continue;
|
||||||
if (arg==2 && _screenEndStrip!=_drawBmpX)
|
if (arg==2 && _screenEndStrip!=tmp)
|
||||||
continue;
|
continue;
|
||||||
if (_screenStartStrip > _drawBmpX || _drawBmpX > _screenEndStrip)
|
if (tmp < _screenStartStrip || tmp > _screenEndStrip)
|
||||||
continue;
|
continue;
|
||||||
actorDrawBits[_drawBmpX] |= 0x8000;
|
actorDrawBits[tmp] |= 0x8000;
|
||||||
if (_drawBmpX < x)
|
if (tmp < x)
|
||||||
x = _drawBmpX;
|
x = tmp;
|
||||||
b++;
|
numstrip++;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (b==0)
|
if (numstrip!=0)
|
||||||
return;
|
gdi.drawBitmap(ptr, _curVirtScreen, x, ypos<<3, height<<3, x-xpos, numstrip, true);
|
||||||
|
|
||||||
_drawBmpY = ypos << 3;
|
// _drawBmpY = ypos << 3;
|
||||||
gdi.numLinesToProcess = height << 3;
|
// gdi._numLinesToProcess = height << 3;
|
||||||
|
// _drawBmpX = x;
|
||||||
_drawBmpX = x;
|
// drawBmp(ptr, x - xpos, b, 1, "Object", od->obj_nr);
|
||||||
drawBmp(ptr, x - xpos, b, 1, "Object", od->obj_nr);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Scumm::loadRoomObjects() {
|
void Scumm::loadRoomObjects() {
|
||||||
|
@ -341,7 +343,7 @@ void Scumm::loadRoomObjects() {
|
||||||
ObjectData *od;
|
ObjectData *od;
|
||||||
byte *ptr;
|
byte *ptr;
|
||||||
uint16 obim_id;
|
uint16 obim_id;
|
||||||
byte *room,*tmp_room;
|
byte *room;
|
||||||
ImageHeader *imhd;
|
ImageHeader *imhd;
|
||||||
RoomHeader *roomhdr;
|
RoomHeader *roomhdr;
|
||||||
|
|
||||||
|
@ -350,7 +352,7 @@ void Scumm::loadRoomObjects() {
|
||||||
CHECK_HEAP
|
CHECK_HEAP
|
||||||
|
|
||||||
room = getResourceAddress(1, _roomResource);
|
room = getResourceAddress(1, _roomResource);
|
||||||
roomhdr = (RoomHeader*)findResource(MKID('RMHD'), room);
|
roomhdr = (RoomHeader*)findResource(MKID('RMHD'), room, 0);
|
||||||
|
|
||||||
_numObjectsInRoom = READ_LE_UINT16(&roomhdr->numObjects);
|
_numObjectsInRoom = READ_LE_UINT16(&roomhdr->numObjects);
|
||||||
|
|
||||||
|
@ -360,16 +362,14 @@ void Scumm::loadRoomObjects() {
|
||||||
if (_numObjectsInRoom > _numLocalObjects)
|
if (_numObjectsInRoom > _numLocalObjects)
|
||||||
error("More than %d objects in room %d", _numLocalObjects, _roomResource);
|
error("More than %d objects in room %d", _numLocalObjects, _roomResource);
|
||||||
|
|
||||||
tmp_room = room;
|
|
||||||
|
|
||||||
od = &_objs[1];
|
od = &_objs[1];
|
||||||
for (i=1; i<=_numObjectsInRoom; i++,od++) {
|
for (i=0; i<_numObjectsInRoom; i++,od++) {
|
||||||
ptr = findResource(MKID('OBCD'), tmp_room);
|
ptr = findResource(MKID('OBCD'), room, i);
|
||||||
if (ptr==NULL)
|
if (ptr==NULL)
|
||||||
error("Room %d missing object code block(s)", _roomResource);
|
error("Room %d missing object code block(s)", _roomResource);
|
||||||
|
|
||||||
od->offs_obcd_to_room = ptr - room;
|
od->offs_obcd_to_room = ptr - room;
|
||||||
cdhd = (CodeHeader*)findResource2(MKID('CDHD'), ptr);
|
cdhd = (CodeHeader*)findResource(MKID('CDHD'), ptr, 0);
|
||||||
od->obj_nr = READ_LE_UINT16(&cdhd->obj_id);
|
od->obj_nr = READ_LE_UINT16(&cdhd->obj_id);
|
||||||
|
|
||||||
#ifdef DUMP_SCRIPTS
|
#ifdef DUMP_SCRIPTS
|
||||||
|
@ -379,29 +379,26 @@ void Scumm::loadRoomObjects() {
|
||||||
dumpResource(buf, od->obj_nr, ptr);
|
dumpResource(buf, od->obj_nr, ptr);
|
||||||
} while (0);
|
} while (0);
|
||||||
#endif
|
#endif
|
||||||
tmp_room = NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
tmp_room = room;
|
for (i=0; i<_numObjectsInRoom; i++) {
|
||||||
for (i=1; i<=_numObjectsInRoom; i++) {
|
ptr = findResource(MKID('OBIM'), room, i);
|
||||||
ptr = findResource(MKID('OBIM'), tmp_room);
|
|
||||||
if (ptr==NULL)
|
if (ptr==NULL)
|
||||||
error("Room %d missing image blocks(s)", _roomResource);
|
error("Room %d missing image blocks(s)", _roomResource);
|
||||||
|
|
||||||
imhd = (ImageHeader*)findResource2(MKID('IMHD'), ptr);
|
imhd = (ImageHeader*)findResource(MKID('IMHD'), ptr, 0);
|
||||||
obim_id = READ_LE_UINT16(&imhd->obj_id);
|
obim_id = READ_LE_UINT16(&imhd->obj_id);
|
||||||
|
|
||||||
for(j=1; j<=_numObjectsInRoom; j++) {
|
for(j=1; j<=_numObjectsInRoom; j++) {
|
||||||
if (_objs[j].obj_nr==obim_id)
|
if (_objs[j].obj_nr==obim_id)
|
||||||
_objs[j].offs_obim_to_room = ptr - room;
|
_objs[j].offs_obim_to_room = ptr - room;
|
||||||
}
|
}
|
||||||
tmp_room = NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
od = &_objs[1];
|
od = &_objs[1];
|
||||||
for (i=1; i<=_numObjectsInRoom; i++,od++) {
|
for (i=1; i<=_numObjectsInRoom; i++,od++) {
|
||||||
ptr = room + _objs[i].offs_obcd_to_room;
|
ptr = room + _objs[i].offs_obcd_to_room;
|
||||||
cdhd = (CodeHeader*)findResource2(MKID('CDHD'), ptr);
|
cdhd = (CodeHeader*)findResource(MKID('CDHD'), ptr,0);
|
||||||
_objs[i].obj_nr = READ_LE_UINT16(&cdhd->obj_id);
|
_objs[i].obj_nr = READ_LE_UINT16(&cdhd->obj_id);
|
||||||
|
|
||||||
if (_majorScummVersion == 6) {
|
if (_majorScummVersion == 6) {
|
||||||
|
@ -482,14 +479,15 @@ void Scumm::clearOwnerOf(int obj) {
|
||||||
nukeResource(5, i);
|
nukeResource(5, i);
|
||||||
_inventory[i] = 0;
|
_inventory[i] = 0;
|
||||||
}
|
}
|
||||||
a = &_inventory[2];
|
a = &_inventory[1];
|
||||||
for (i=1; i < _maxInventoryItems-1; i++) {
|
for (i=1; i < _maxInventoryItems-1; i++,a++) {
|
||||||
if (!a[-1] && a[0]) {
|
if (!a[0] && a[1]) {
|
||||||
a[-1] = a[0];
|
a[0] = a[1];
|
||||||
|
a[1] = 0;
|
||||||
ptr = getResourceAddress(5, i+1);
|
ptr = getResourceAddress(5, i+1);
|
||||||
_baseInventoryItems[i] = _baseInventoryItems[i+1];
|
_baseInventoryItems[i] = _baseInventoryItems[i+1];
|
||||||
|
_baseInventoryItems[i+1] = 0;
|
||||||
/* TODO: some wacky write is done here */
|
/* TODO: some wacky write is done here */
|
||||||
error("clearOwnerOf: not fully implemented");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
|
@ -536,7 +534,7 @@ byte *Scumm::getObjOrActorName(int obj) {
|
||||||
if (objptr==NULL)
|
if (objptr==NULL)
|
||||||
return (byte*)" ";
|
return (byte*)" ";
|
||||||
|
|
||||||
return findResource(MKID('OBNA'), objptr) + 8;
|
return findResource(MKID('OBNA'), objptr, 0) + 8;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32 Scumm::getOBCDOffs(int object) {
|
uint32 Scumm::getOBCDOffs(int object) {
|
||||||
|
@ -579,7 +577,7 @@ void Scumm::addObjectToInventory(int obj, int room) {
|
||||||
byte *ptr,*obcdptr;
|
byte *ptr,*obcdptr;
|
||||||
uint32 size,cdoffs;
|
uint32 size,cdoffs;
|
||||||
int numobj;
|
int numobj;
|
||||||
byte *tmp_roomptr,*roomptr;
|
byte *roomptr;
|
||||||
CodeHeader *cdhd;
|
CodeHeader *cdhd;
|
||||||
RoomHeader *roomhdr;
|
RoomHeader *roomhdr;
|
||||||
|
|
||||||
|
@ -601,19 +599,18 @@ void Scumm::addObjectToInventory(int obj, int room) {
|
||||||
}
|
}
|
||||||
ensureResourceLoaded(1, room);
|
ensureResourceLoaded(1, room);
|
||||||
roomptr = getResourceAddress(1, room);
|
roomptr = getResourceAddress(1, room);
|
||||||
roomhdr = (RoomHeader*)findResource(MKID('RMHD'), roomptr);
|
roomhdr = (RoomHeader*)findResource(MKID('RMHD'), roomptr, 0);
|
||||||
numobj = READ_LE_UINT16(&roomhdr->numObjects);
|
numobj = READ_LE_UINT16(&roomhdr->numObjects);
|
||||||
if (numobj==0)
|
if (numobj==0)
|
||||||
error("addObjectToInventory: No object found in room %d", room);
|
error("addObjectToInventory: No object found in room %d", room);
|
||||||
if (numobj > 200)
|
if (numobj > 200)
|
||||||
error("addObjectToInventory: More (%d) than %d objects in room %d", numobj, 200, room);
|
error("addObjectToInventory: More (%d) than %d objects in room %d", numobj, 200, room);
|
||||||
|
|
||||||
tmp_roomptr = roomptr;
|
for (i=0; i<numobj; i++) {
|
||||||
for (i=1; i<=numobj; i++) {
|
obcdptr = findResource(MKID('OBCD'), roomptr, i);
|
||||||
obcdptr = findResource(MKID('OBCD'), tmp_roomptr);
|
|
||||||
if(obcdptr==NULL)
|
if(obcdptr==NULL)
|
||||||
error("addObjectToInventory: Not enough code blocks in room %d", room);
|
error("addObjectToInventory: Not enough code blocks in room %d", room);
|
||||||
cdhd = (CodeHeader*)findResource2(MKID('CDHD'), obcdptr);
|
cdhd = (CodeHeader*)findResource(MKID('CDHD'), obcdptr, 0);
|
||||||
if ( READ_LE_UINT16(&cdhd->obj_id) == obj) {
|
if ( READ_LE_UINT16(&cdhd->obj_id) == obj) {
|
||||||
cdoffs = obcdptr - roomptr;
|
cdoffs = obcdptr - roomptr;
|
||||||
size = READ_BE_UINT32_UNALIGNED(obcdptr+4);
|
size = READ_BE_UINT32_UNALIGNED(obcdptr+4);
|
||||||
|
@ -625,7 +622,6 @@ void Scumm::addObjectToInventory(int obj, int room) {
|
||||||
CHECK_HEAP
|
CHECK_HEAP
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
tmp_roomptr = NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
error("addObjectToInventory: Object %d not found in room %d", obj, room);
|
error("addObjectToInventory: Object %d not found in room %d", obj, room);
|
||||||
|
|
68
resource.cpp
68
resource.cpp
|
@ -17,6 +17,9 @@
|
||||||
*
|
*
|
||||||
* Change Log:
|
* Change Log:
|
||||||
* $Log$
|
* $Log$
|
||||||
|
* Revision 1.7 2001/10/26 17:34:50 strigeus
|
||||||
|
* bug fixes, code cleanup
|
||||||
|
*
|
||||||
* Revision 1.6 2001/10/24 20:12:52 strigeus
|
* Revision 1.6 2001/10/24 20:12:52 strigeus
|
||||||
* fixed some bugs related to string handling
|
* fixed some bugs related to string handling
|
||||||
*
|
*
|
||||||
|
@ -650,20 +653,19 @@ void Scumm::unkResourceProc() {
|
||||||
warning("unkResourceProc: not implemented");
|
warning("unkResourceProc: not implemented");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
byte *findResource(uint32 tag, byte *searchin, int index) {
|
||||||
|
uint32 maxsize,curpos,totalsize,size;
|
||||||
|
|
||||||
byte *Scumm::findResource(uint32 tag, byte *searchin) {
|
searchin += 4;
|
||||||
uint32 size;
|
totalsize = READ_BE_UINT32_UNALIGNED(searchin);
|
||||||
|
curpos = 8;
|
||||||
|
searchin += 4;
|
||||||
|
|
||||||
if (searchin) {
|
while (curpos<totalsize) {
|
||||||
searchin+=4;
|
if (READ_UINT32_UNALIGNED(searchin)==tag && !index--)
|
||||||
_findResSize = READ_BE_UINT32_UNALIGNED(searchin);
|
return searchin;
|
||||||
_findResHeaderSize = 8;
|
|
||||||
_findResPos = searchin+4;
|
|
||||||
goto startScan;
|
|
||||||
}
|
|
||||||
|
|
||||||
do {
|
size = READ_BE_UINT32_UNALIGNED(searchin+4);
|
||||||
size = READ_BE_UINT32_UNALIGNED(_findResPos+4);
|
|
||||||
if ((int32)size <= 0) {
|
if ((int32)size <= 0) {
|
||||||
error("(%c%c%c%c) Not found in %d... illegal block len %d",
|
error("(%c%c%c%c) Not found in %d... illegal block len %d",
|
||||||
tag&0xFF,(tag>>8)&0xFF,(tag>>16)&0xFF,(tag>>24)&0xFF,
|
tag&0xFF,(tag>>8)&0xFF,(tag>>16)&0xFF,(tag>>24)&0xFF,
|
||||||
|
@ -671,53 +673,17 @@ byte *Scumm::findResource(uint32 tag, byte *searchin) {
|
||||||
size);
|
size);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
_findResHeaderSize += size;
|
|
||||||
_findResPos += size;
|
|
||||||
|
|
||||||
startScan:;
|
|
||||||
if (_findResHeaderSize >= _findResSize)
|
|
||||||
return NULL;
|
|
||||||
/* endian OK, tags are in native format */
|
|
||||||
} while (READ_UINT32_UNALIGNED(_findResPos) != tag);
|
|
||||||
|
|
||||||
return _findResPos;
|
curpos += size;
|
||||||
}
|
searchin += size;
|
||||||
|
}
|
||||||
|
|
||||||
byte *Scumm::findResource2(uint32 tag, byte *searchin) {
|
return NULL;
|
||||||
uint32 size;
|
|
||||||
|
|
||||||
if (searchin) {
|
|
||||||
searchin+=4;
|
|
||||||
_findResSize2 = READ_BE_UINT32_UNALIGNED(searchin);
|
|
||||||
_findResHeaderSize2 = 8;
|
|
||||||
_findResPos2 = searchin+4;
|
|
||||||
goto startScan;
|
|
||||||
}
|
|
||||||
|
|
||||||
do {
|
|
||||||
size = READ_BE_UINT32_UNALIGNED(_findResPos2+4);
|
|
||||||
if ((int32)size <= 0) {
|
|
||||||
error("(%c%c%c%c) Not found in %d... illegal block len %d",
|
|
||||||
tag&0xFF,(tag>>8)&0xFF,(tag>>16)&0xFF,(tag>>24)&0xFF,
|
|
||||||
0,
|
|
||||||
size);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
_findResHeaderSize2 += size;
|
|
||||||
_findResPos2 += size;
|
|
||||||
|
|
||||||
startScan:;
|
|
||||||
if (_findResHeaderSize2 >= _findResSize2)
|
|
||||||
return NULL;
|
|
||||||
/* endian OK, tags are in native format */
|
|
||||||
} while (READ_UINT32_UNALIGNED(_findResPos2) != tag);
|
|
||||||
return _findResPos2;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Scumm::lock(int type, int i) {
|
void Scumm::lock(int type, int i) {
|
||||||
validateResource("Locking", type, i);
|
validateResource("Locking", type, i);
|
||||||
res.flags[type][i] |= 0x80;
|
res.flags[type][i] |= 0x80;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Scumm::unlock(int type, int i) {
|
void Scumm::unlock(int type, int i) {
|
||||||
|
|
52
saveload.cpp
52
saveload.cpp
|
@ -17,6 +17,9 @@
|
||||||
*
|
*
|
||||||
* Change Log:
|
* Change Log:
|
||||||
* $Log$
|
* $Log$
|
||||||
|
* Revision 1.6 2001/10/26 17:34:50 strigeus
|
||||||
|
* bug fixes, code cleanup
|
||||||
|
*
|
||||||
* Revision 1.5 2001/10/18 20:04:58 strigeus
|
* Revision 1.5 2001/10/18 20:04:58 strigeus
|
||||||
* flags were not saved properly
|
* flags were not saved properly
|
||||||
*
|
*
|
||||||
|
@ -72,6 +75,7 @@ bool Scumm::loadState(const char *filename) {
|
||||||
FILE *out = fopen(filename,"rb");
|
FILE *out = fopen(filename,"rb");
|
||||||
int i,j;
|
int i,j;
|
||||||
SaveGameHeader hdr;
|
SaveGameHeader hdr;
|
||||||
|
int sb,sh;
|
||||||
|
|
||||||
if (out==NULL)
|
if (out==NULL)
|
||||||
return false;
|
return false;
|
||||||
|
@ -105,11 +109,20 @@ bool Scumm::loadState(const char *filename) {
|
||||||
saveOrLoad(out,false);
|
saveOrLoad(out,false);
|
||||||
fclose(out);
|
fclose(out);
|
||||||
|
|
||||||
initScreens(0, _screenB, 320, _screenH);
|
sb = _screenB;
|
||||||
|
sh = _screenH;
|
||||||
|
|
||||||
|
initScreens(0, 0, 320, 200);
|
||||||
|
_screenEffectFlag = 1;
|
||||||
|
unkVirtScreen4(129);
|
||||||
|
|
||||||
|
initScreens(0, sb, 320, sh);
|
||||||
|
|
||||||
_completeScreenRedraw = 1;
|
_completeScreenRedraw = 1;
|
||||||
setDirtyColors(0,255);
|
setDirtyColors(0,255);
|
||||||
|
|
||||||
|
_lastCodePtr = NULL;
|
||||||
|
|
||||||
_drawObjectQueNr = 0;
|
_drawObjectQueNr = 0;
|
||||||
_verbMouseOver = 0;
|
_verbMouseOver = 0;
|
||||||
|
|
||||||
|
@ -255,7 +268,7 @@ void Scumm::saveOrLoad(FILE *inout, bool mode) {
|
||||||
MKLINE(Scumm,_numObjectsInRoom,sleByte),
|
MKLINE(Scumm,_numObjectsInRoom,sleByte),
|
||||||
MKLINE(Scumm,_currentScript,sleByte),
|
MKLINE(Scumm,_currentScript,sleByte),
|
||||||
MKARRAY(Scumm,_localScriptList[0],sleUint32,0x39),
|
MKARRAY(Scumm,_localScriptList[0],sleUint32,0x39),
|
||||||
MKARRAY(Scumm,vm.localvar[0],sleUint16,20*17),
|
MKARRAY(Scumm,vm.localvar[0],sleUint16,NUM_SCRIPT_SLOT*17),
|
||||||
MKARRAY(Scumm,_resourceMapper[0],sleByte,128),
|
MKARRAY(Scumm,_resourceMapper[0],sleByte,128),
|
||||||
MKARRAY(Scumm,charset._colorMap[0],sleByte,16),
|
MKARRAY(Scumm,charset._colorMap[0],sleByte,16),
|
||||||
MKARRAY(Scumm,_charsetData[0][0],sleByte,10*16),
|
MKARRAY(Scumm,_charsetData[0][0],sleByte,10*16),
|
||||||
|
@ -293,29 +306,28 @@ void Scumm::saveOrLoad(FILE *inout, bool mode) {
|
||||||
MKLINE(Scumm,_numNestedScripts,sleByte),
|
MKLINE(Scumm,_numNestedScripts,sleByte),
|
||||||
MKLINE(Scumm,_userPut,sleByte),
|
MKLINE(Scumm,_userPut,sleByte),
|
||||||
MKLINE(Scumm,_cursorState,sleByte),
|
MKLINE(Scumm,_cursorState,sleByte),
|
||||||
MKLINE(Scumm,gdi.unk4,sleByte),
|
MKLINE(Scumm,gdi._unk4,sleByte),
|
||||||
MKLINE(Scumm,gdi.currentCursor,sleByte),
|
MKLINE(Scumm,gdi._currentCursor,sleByte),
|
||||||
|
|
||||||
MKLINE(Scumm,doEffect,sleByte),
|
MKLINE(Scumm,_doEffect,sleByte),
|
||||||
MKLINE(Scumm,_switchRoomEffect,sleByte),
|
MKLINE(Scumm,_switchRoomEffect,sleByte),
|
||||||
MKLINE(Scumm,_newEffect,sleByte),
|
MKLINE(Scumm,_newEffect,sleByte),
|
||||||
MKLINE(Scumm,_switchRoomEffect2,sleByte),
|
MKLINE(Scumm,_switchRoomEffect2,sleByte),
|
||||||
MKLINE(Scumm,_BgNeedsRedraw,sleByte),
|
MKLINE(Scumm,_BgNeedsRedraw,sleByte),
|
||||||
|
|
||||||
MKARRAY(Scumm,actorDrawBits[0],sleUint16,200),
|
MKARRAY(Scumm,actorDrawBits[0],sleUint16,200),
|
||||||
MKLINE(Scumm,gdi.transparency,sleByte),
|
MKLINE(Scumm,gdi._transparency,sleByte),
|
||||||
MKARRAY(Scumm,_currentPalette[0],sleByte,768),
|
MKARRAY(Scumm,_currentPalette[0],sleByte,768),
|
||||||
/* virtscr */
|
/* virtscr */
|
||||||
|
|
||||||
MKARRAY(Scumm,charset._buffer[0],sleByte,256),
|
MKARRAY(Scumm,charset._buffer[0],sleByte,256),
|
||||||
|
|
||||||
MKLINE(Scumm,dseg_3A76,sleUint16),
|
MKLINE(Scumm,_egoPositioned,sleByte),
|
||||||
|
|
||||||
MKARRAY(Scumm,_imgBufOffs[0],sleUint16,4),
|
MKARRAY(Scumm,gdi._imgBufOffs[0],sleUint16,4),
|
||||||
MKLINE(Scumm,_numZBuffer,sleUint16),
|
MKLINE(Scumm,gdi._numZBuffer,sleByte),
|
||||||
|
|
||||||
MKLINE(Scumm,dseg_4EA0,sleUint16),
|
MKLINE(Scumm,_screenEffectFlag,sleByte),
|
||||||
MKLINE(Scumm,dseg_4EA0,sleUint16),
|
|
||||||
|
|
||||||
MKLINE(Scumm,_randSeed1,sleUint32),
|
MKLINE(Scumm,_randSeed1,sleUint32),
|
||||||
MKLINE(Scumm,_randSeed2,sleUint32),
|
MKLINE(Scumm,_randSeed2,sleUint32),
|
||||||
|
@ -327,12 +339,6 @@ void Scumm::saveOrLoad(FILE *inout, bool mode) {
|
||||||
MKLINE(Scumm,_screenB,sleUint16),
|
MKLINE(Scumm,_screenB,sleUint16),
|
||||||
MKLINE(Scumm,_screenH,sleUint16),
|
MKLINE(Scumm,_screenH,sleUint16),
|
||||||
|
|
||||||
MKARRAY(Scumm,_colorCycleDelays[0],sleUint16,17),
|
|
||||||
MKARRAY(Scumm,_colorCycleCounter[0],sleUint16,17),
|
|
||||||
MKARRAY(Scumm,_colorCycleFlags[0],sleUint16,17),
|
|
||||||
MKARRAY(Scumm,_colorCycleStart[0],sleByte,17),
|
|
||||||
MKARRAY(Scumm,_colorCycleEnd[0],sleByte,17),
|
|
||||||
|
|
||||||
MKARRAY(Scumm,cost._transEffect[0],sleByte,256),
|
MKARRAY(Scumm,cost._transEffect[0],sleByte,256),
|
||||||
MKEND()
|
MKEND()
|
||||||
};
|
};
|
||||||
|
@ -393,6 +399,14 @@ void Scumm::saveOrLoad(FILE *inout, bool mode) {
|
||||||
MKEND()
|
MKEND()
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const SaveLoadEntry colorCycleEntries[] = {
|
||||||
|
MKLINE(ColorCycle,delay,sleUint16),
|
||||||
|
MKLINE(ColorCycle,counter,sleUint16),
|
||||||
|
MKLINE(ColorCycle,flags,sleUint16),
|
||||||
|
MKLINE(ColorCycle,start,sleByte),
|
||||||
|
MKLINE(ColorCycle,end,sleByte),
|
||||||
|
};
|
||||||
|
|
||||||
int i,j;
|
int i,j;
|
||||||
|
|
||||||
_saveLoadStream = inout;
|
_saveLoadStream = inout;
|
||||||
|
@ -401,7 +415,7 @@ void Scumm::saveOrLoad(FILE *inout, bool mode) {
|
||||||
saveLoadEntries(this,mainEntries);
|
saveLoadEntries(this,mainEntries);
|
||||||
for (i=1; i<13; i++)
|
for (i=1; i<13; i++)
|
||||||
saveLoadEntries(&actor[i],actorEntries);
|
saveLoadEntries(&actor[i],actorEntries);
|
||||||
for (i=0; i<20; i++)
|
for (i=0; i<NUM_SCRIPT_SLOT; i++)
|
||||||
saveLoadEntries(&vm.slot[i],scriptSlotEntries);
|
saveLoadEntries(&vm.slot[i],scriptSlotEntries);
|
||||||
for (i=0; i<_numLocalObjects; i++)
|
for (i=0; i<_numLocalObjects; i++)
|
||||||
saveLoadEntries(&_objs[i],objectEntries);
|
saveLoadEntries(&_objs[i],objectEntries);
|
||||||
|
@ -413,6 +427,8 @@ void Scumm::saveOrLoad(FILE *inout, bool mode) {
|
||||||
saveLoadEntries(&sentence[i],sentenceTabEntries);
|
saveLoadEntries(&sentence[i],sentenceTabEntries);
|
||||||
for (i=0; i<6; i++)
|
for (i=0; i<6; i++)
|
||||||
saveLoadEntries(&string[i],stringTabEntries);
|
saveLoadEntries(&string[i],stringTabEntries);
|
||||||
|
for (i=0; i<16; i++)
|
||||||
|
saveLoadEntries(&_colorCycle,colorCycleEntries);
|
||||||
|
|
||||||
for (i=1; i<16; i++)
|
for (i=1; i<16; i++)
|
||||||
if (res.mode[i]==0)
|
if (res.mode[i]==0)
|
||||||
|
|
59
script.cpp
59
script.cpp
|
@ -17,6 +17,9 @@
|
||||||
*
|
*
|
||||||
* Change Log:
|
* Change Log:
|
||||||
* $Log$
|
* $Log$
|
||||||
|
* Revision 1.5 2001/10/26 17:34:50 strigeus
|
||||||
|
* bug fixes, code cleanup
|
||||||
|
*
|
||||||
* Revision 1.4 2001/10/23 19:51:50 strigeus
|
* Revision 1.4 2001/10/23 19:51:50 strigeus
|
||||||
* recompile not needed when switching games
|
* recompile not needed when switching games
|
||||||
* debugger skeleton implemented
|
* debugger skeleton implemented
|
||||||
|
@ -101,7 +104,7 @@ void Scumm::stopScriptNr(int script) {
|
||||||
|
|
||||||
ss = &vm.slot[1];
|
ss = &vm.slot[1];
|
||||||
|
|
||||||
for (i=1; i<20; i++,ss++) {
|
for (i=1; i<NUM_SCRIPT_SLOT; i++,ss++) {
|
||||||
if (script!=ss->number || ss->type!=2 && ss->type!=3 || ss->status==0)
|
if (script!=ss->number || ss->type!=2 && ss->type!=3 || ss->status==0)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
@ -138,7 +141,7 @@ void Scumm::stopObjectScript(int script) {
|
||||||
|
|
||||||
ss = &vm.slot[1];
|
ss = &vm.slot[1];
|
||||||
|
|
||||||
for (i=1; i<20; i++,ss++) {
|
for (i=1; i<NUM_SCRIPT_SLOT; i++,ss++) {
|
||||||
if (script==ss->number && (ss->type==1 || ss->type==0 || ss->type==4) && ss->status!=0) {
|
if (script==ss->number && (ss->type==1 || ss->type==0 || ss->type==4) && ss->status!=0) {
|
||||||
if (ss->cutsceneOverride)
|
if (ss->cutsceneOverride)
|
||||||
error("Object %d stopped with active cutscene/override", script);
|
error("Object %d stopped with active cutscene/override", script);
|
||||||
|
@ -169,11 +172,11 @@ int Scumm::getScriptSlot() {
|
||||||
int i;
|
int i;
|
||||||
ss = &vm.slot[1];
|
ss = &vm.slot[1];
|
||||||
|
|
||||||
for (i=1; i<20; i++,ss++) {
|
for (i=1; i<NUM_SCRIPT_SLOT; i++,ss++) {
|
||||||
if(ss->status==0)
|
if(ss->status==0)
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
error("Too many scripts running, %d max", 20);
|
error("Too many scripts running, %d max", NUM_SCRIPT_SLOT);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Scumm::runScriptNested(int script) {
|
void Scumm::runScriptNested(int script) {
|
||||||
|
@ -414,12 +417,14 @@ void Scumm::setResult(int value) {
|
||||||
|
|
||||||
void Scumm::drawBox(int x, int y, int x2, int y2, int color) {
|
void Scumm::drawBox(int x, int y, int x2, int y2, int color) {
|
||||||
int top,bottom,count;
|
int top,bottom,count;
|
||||||
|
VirtScreen *vs;
|
||||||
|
byte *backbuff;
|
||||||
|
|
||||||
if (findVirtScreen(y)==-1)
|
if ((vs=findVirtScreen(y)) == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
top = virtscr[gdi.virtScreen].topline;
|
top = vs->topline;
|
||||||
bottom = top + virtscr[gdi.virtScreen].height;
|
bottom = top + vs->height;
|
||||||
|
|
||||||
if (x > x2)
|
if (x > x2)
|
||||||
SWAP(x,x2);
|
SWAP(x,x2);
|
||||||
|
@ -436,16 +441,14 @@ void Scumm::drawBox(int x, int y, int x2, int y2, int color) {
|
||||||
if (x2>320) x2=320;
|
if (x2>320) x2=320;
|
||||||
if (y2 > bottom) y2=bottom;
|
if (y2 > bottom) y2=bottom;
|
||||||
|
|
||||||
updateDirtyRect(gdi.virtScreen, x, x2, y-top, y2-top, 0);
|
updateDirtyRect(vs->number, x, x2, y-top, y2-top, 0);
|
||||||
|
|
||||||
gdi.bg_ptr = getResourceAddress(0xA, gdi.virtScreen+1)
|
backbuff = getResourceAddress(0xA, vs->number+1) + vs->xstart + (y-top)*320 + x;
|
||||||
+ virtscr[gdi.virtScreen].xstart
|
|
||||||
+ (y-top)*320 + x;
|
|
||||||
|
|
||||||
count = y2 - y;
|
count = y2 - y;
|
||||||
while (count) {
|
while (count) {
|
||||||
memset(gdi.bg_ptr, color, x2 - x);
|
memset(backbuff, color, x2 - x);
|
||||||
gdi.bg_ptr += 320;
|
backbuff += 320;
|
||||||
count--;
|
count--;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -477,7 +480,7 @@ bool Scumm::isScriptLoaded(int script) {
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
ss = vm.slot;
|
ss = vm.slot;
|
||||||
for (i=0; i<20; i++,ss++) {
|
for (i=0; i<NUM_SCRIPT_SLOT; i++,ss++) {
|
||||||
if (ss->number == script)
|
if (ss->number == script)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -495,7 +498,7 @@ void Scumm::runHook(int i) {
|
||||||
void Scumm::freezeScripts(int flag) {
|
void Scumm::freezeScripts(int flag) {
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for(i=1; i<20; i++) {
|
for(i=1; i<NUM_SCRIPT_SLOT; i++) {
|
||||||
if (_currentScript!=i && vm.slot[i].status!=0 && (vm.slot[i].unk1==0 || flag>=0x80)) {
|
if (_currentScript!=i && vm.slot[i].status!=0 && (vm.slot[i].unk1==0 || flag>=0x80)) {
|
||||||
vm.slot[i].status |= 0x80;
|
vm.slot[i].status |= 0x80;
|
||||||
vm.slot[i].freezeCount++;
|
vm.slot[i].freezeCount++;
|
||||||
|
@ -513,7 +516,7 @@ void Scumm::freezeScripts(int flag) {
|
||||||
|
|
||||||
void Scumm::unfreezeScripts() {
|
void Scumm::unfreezeScripts() {
|
||||||
int i;
|
int i;
|
||||||
for (i=1; i<20; i++) {
|
for (i=1; i<NUM_SCRIPT_SLOT; i++) {
|
||||||
if (vm.slot[i].status&0x80) {
|
if (vm.slot[i].status&0x80) {
|
||||||
if (!--vm.slot[i].freezeCount) {
|
if (!--vm.slot[i].freezeCount) {
|
||||||
vm.slot[i].status&=0x7F;
|
vm.slot[i].status&=0x7F;
|
||||||
|
@ -530,11 +533,11 @@ void Scumm::unfreezeScripts() {
|
||||||
void Scumm::runAllScripts() {
|
void Scumm::runAllScripts() {
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i=0; i<20; i++)
|
for (i=0; i<NUM_SCRIPT_SLOT; i++)
|
||||||
vm.slot[i].didexec = 0;
|
vm.slot[i].didexec = 0;
|
||||||
|
|
||||||
_currentScript = 0xFF;
|
_currentScript = 0xFF;
|
||||||
for(_curExecScript = 0; _curExecScript<20; _curExecScript++) {
|
for(_curExecScript = 0; _curExecScript<NUM_SCRIPT_SLOT; _curExecScript++) {
|
||||||
if (vm.slot[_curExecScript].status == 2 &&
|
if (vm.slot[_curExecScript].status == 2 &&
|
||||||
vm.slot[_curExecScript].didexec == 0) {
|
vm.slot[_curExecScript].didexec == 0) {
|
||||||
_currentScript = _curExecScript;
|
_currentScript = _curExecScript;
|
||||||
|
@ -587,7 +590,7 @@ void Scumm::killScriptsAndResources() {
|
||||||
|
|
||||||
ss = &vm.slot[1];
|
ss = &vm.slot[1];
|
||||||
|
|
||||||
for (i=1; i<20; i++,ss++) {
|
for (i=1; i<NUM_SCRIPT_SLOT; i++,ss++) {
|
||||||
if (ss->type==1 || ss->type==4) {
|
if (ss->type==1 || ss->type==4) {
|
||||||
if(ss->cutsceneOverride)
|
if(ss->cutsceneOverride)
|
||||||
error("Object %d stopped with active cutscene/override in exit", ss->number);
|
error("Object %d stopped with active cutscene/override in exit", ss->number);
|
||||||
|
@ -613,7 +616,7 @@ void Scumm::checkAndRunVar33() {
|
||||||
memset(_localParamList, 0, sizeof(_localParamList));
|
memset(_localParamList, 0, sizeof(_localParamList));
|
||||||
if (isScriptLoaded(_vars[VAR_SENTENCE_SCRIPT])) {
|
if (isScriptLoaded(_vars[VAR_SENTENCE_SCRIPT])) {
|
||||||
ss = vm.slot;
|
ss = vm.slot;
|
||||||
for (i=0; i<20; i++,ss++)
|
for (i=0; i<NUM_SCRIPT_SLOT; i++,ss++)
|
||||||
if (ss->number==_vars[VAR_SENTENCE_SCRIPT] && ss->status!=0 && ss->freezeCount==0)
|
if (ss->number==_vars[VAR_SENTENCE_SCRIPT] && ss->status!=0 && ss->freezeCount==0)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -648,7 +651,7 @@ void Scumm::runInputScript(int a, int cmd, int mode) {
|
||||||
void Scumm::decreaseScriptDelay(int amount) {
|
void Scumm::decreaseScriptDelay(int amount) {
|
||||||
ScriptSlot *ss = &vm.slot[0];
|
ScriptSlot *ss = &vm.slot[0];
|
||||||
int i;
|
int i;
|
||||||
for (i=0; i<20; i++,ss++) {
|
for (i=0; i<NUM_SCRIPT_SLOT; i++,ss++) {
|
||||||
if(ss->status==1) {
|
if(ss->status==1) {
|
||||||
ss->delay -= amount;
|
ss->delay -= amount;
|
||||||
if (ss->delay < 0){
|
if (ss->delay < 0){
|
||||||
|
@ -712,7 +715,7 @@ int Scumm::getVerbEntrypoint(int obj, int entry) {
|
||||||
|
|
||||||
objptr = getObjectAddress(obj);
|
objptr = getObjectAddress(obj);
|
||||||
|
|
||||||
verbptr = findResource(MKID('VERB'), objptr);
|
verbptr = findResource(MKID('VERB'), objptr, 0);
|
||||||
if (verbptr==NULL)
|
if (verbptr==NULL)
|
||||||
error("No verb block in object %d", obj);
|
error("No verb block in object %d", obj);
|
||||||
|
|
||||||
|
@ -842,7 +845,7 @@ void Scumm::animateActor(int act, int anim) {
|
||||||
int Scumm::getScriptRunning(int script) {
|
int Scumm::getScriptRunning(int script) {
|
||||||
int i;
|
int i;
|
||||||
ScriptSlot *ss = vm.slot;
|
ScriptSlot *ss = vm.slot;
|
||||||
for (i=0; i<20; i++,ss++)
|
for (i=0; i<NUM_SCRIPT_SLOT; i++,ss++)
|
||||||
if (ss->number==script && (ss->type==2 || ss->type==3) && ss->status)
|
if (ss->number==script && (ss->type==2 || ss->type==3) && ss->status)
|
||||||
return 1;
|
return 1;
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -939,6 +942,16 @@ int Scumm::getArrayId() {
|
||||||
error("Out of array pointers, %d max", _numArray);
|
error("Out of array pointers, %d max", _numArray);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Scumm::arrayop_1(int a, byte *ptr) {
|
||||||
|
ArrayHeader *ah;
|
||||||
|
int r;
|
||||||
|
int len = getStringLen(ptr);
|
||||||
|
|
||||||
|
r = defineArray(a, 4, 0, len);
|
||||||
|
ah = (ArrayHeader*)getResourceAddress(7,r);
|
||||||
|
copyString(ah->data,ptr,len);
|
||||||
|
}
|
||||||
|
|
||||||
void Scumm::copyString(byte *dst, byte *src, int len) {
|
void Scumm::copyString(byte *dst, byte *src, int len) {
|
||||||
if (!src) {
|
if (!src) {
|
||||||
while (--len>=0)
|
while (--len>=0)
|
||||||
|
|
|
@ -17,6 +17,9 @@
|
||||||
*
|
*
|
||||||
* Change Log:
|
* Change Log:
|
||||||
* $Log$
|
* $Log$
|
||||||
|
* Revision 1.4 2001/10/26 17:34:50 strigeus
|
||||||
|
* bug fixes, code cleanup
|
||||||
|
*
|
||||||
* Revision 1.3 2001/10/23 19:51:50 strigeus
|
* Revision 1.3 2001/10/23 19:51:50 strigeus
|
||||||
* recompile not needed when switching games
|
* recompile not needed when switching games
|
||||||
* debugger skeleton implemented
|
* debugger skeleton implemented
|
||||||
|
@ -890,7 +893,7 @@ void Scumm::o5_getClosestObjActor() {
|
||||||
getResultPos();
|
getResultPos();
|
||||||
|
|
||||||
act = getVarOrDirectWord(0x80);
|
act = getVarOrDirectWord(0x80);
|
||||||
obj = _vars[VAR_OBJECT_HI];
|
obj = _vars[VAR_V5_OBJECT_HI];
|
||||||
|
|
||||||
do {
|
do {
|
||||||
dist = getObjActToObjActDist(obj,act);
|
dist = getObjActToObjActDist(obj,act);
|
||||||
|
@ -898,7 +901,7 @@ void Scumm::o5_getClosestObjActor() {
|
||||||
closnum = dist;
|
closnum = dist;
|
||||||
closobj = obj;
|
closobj = obj;
|
||||||
}
|
}
|
||||||
} while (--obj >= _vars[VAR_OBJECT_LO]);
|
} while (--obj >= _vars[VAR_V5_OBJECT_LO]);
|
||||||
|
|
||||||
setResult(closnum);
|
setResult(closnum);
|
||||||
}
|
}
|
||||||
|
@ -1054,11 +1057,11 @@ void Scumm::o5_lights() {
|
||||||
a = getVarOrDirectByte(0x80);
|
a = getVarOrDirectByte(0x80);
|
||||||
b = fetchScriptByte();
|
b = fetchScriptByte();
|
||||||
c = fetchScriptByte();
|
c = fetchScriptByte();
|
||||||
|
|
||||||
if (c==0)
|
if (c==0)
|
||||||
_vars[VAR_DRAWFLAGS] = a;
|
_vars[VAR_V5_DRAWFLAGS] = a;
|
||||||
else if (c==1) {
|
else if (c==1) {
|
||||||
_lightsValueA = a;
|
warning("o5_lights: lights not implemented");
|
||||||
_lightsValueB = b;
|
|
||||||
}
|
}
|
||||||
_fullRedraw=1;
|
_fullRedraw=1;
|
||||||
}
|
}
|
||||||
|
@ -1077,7 +1080,7 @@ void Scumm::o5_loadRoomWithEgo() {
|
||||||
obj = getVarOrDirectWord(0x80);
|
obj = getVarOrDirectWord(0x80);
|
||||||
room = getVarOrDirectByte(0x40);
|
room = getVarOrDirectByte(0x40);
|
||||||
|
|
||||||
a = derefActorSafe(_vars[VAR_UNK_ACTOR], "o5_loadRoomWithEgo");
|
a = derefActorSafe(_vars[VAR_EGO], "o5_loadRoomWithEgo");
|
||||||
|
|
||||||
/* Warning: uses _xPos, _yPos from a previous update of those */
|
/* Warning: uses _xPos, _yPos from a previous update of those */
|
||||||
putActor(a, _xPos, _yPos, room);
|
putActor(a, _xPos, _yPos, room);
|
||||||
|
@ -1085,7 +1088,7 @@ void Scumm::o5_loadRoomWithEgo() {
|
||||||
x = (int16)fetchScriptWord();
|
x = (int16)fetchScriptWord();
|
||||||
y = (int16)fetchScriptWord();
|
y = (int16)fetchScriptWord();
|
||||||
|
|
||||||
dseg_3A76 = 0;
|
_egoPositioned = false;
|
||||||
|
|
||||||
_vars[VAR_WALKTO_OBJ] = obj;
|
_vars[VAR_WALKTO_OBJ] = obj;
|
||||||
|
|
||||||
|
@ -1166,7 +1169,7 @@ void Scumm::o5_pickupObject() {
|
||||||
if (room==0)
|
if (room==0)
|
||||||
room = _roomResource;
|
room = _roomResource;
|
||||||
addObjectToInventory(obj, room);
|
addObjectToInventory(obj, room);
|
||||||
putOwner(obj, _vars[VAR_UNK_ACTOR]);
|
putOwner(obj, _vars[VAR_EGO]);
|
||||||
putClass(obj, 32, 1);
|
putClass(obj, 32, 1);
|
||||||
putState(obj, 1);
|
putState(obj, 1);
|
||||||
removeObjectFromRoom(obj);
|
removeObjectFromRoom(obj);
|
||||||
|
@ -1180,7 +1183,7 @@ void Scumm::o5_print() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Scumm::o5_printEgo() {
|
void Scumm::o5_printEgo() {
|
||||||
_actorToPrintStrFor = _vars[VAR_UNK_ACTOR];
|
_actorToPrintStrFor = _vars[VAR_EGO];
|
||||||
decodeParseString();
|
decodeParseString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1367,12 +1370,12 @@ void Scumm::o5_roomOps() {
|
||||||
a = getVarOrDirectByte(0x80);
|
a = getVarOrDirectByte(0x80);
|
||||||
b = getVarOrDirectByte(0x40);
|
b = getVarOrDirectByte(0x40);
|
||||||
c = getVarOrDirectByte(0x20);
|
c = getVarOrDirectByte(0x20);
|
||||||
unkRoomFunc2(b, c, a, a, a);
|
darkenPalette(b, c, a, a, a);
|
||||||
break;
|
break;
|
||||||
case 9: /* ? */
|
case 9: /* ? */
|
||||||
_saveLoadFlag = getVarOrDirectByte(0x80);
|
_saveLoadFlag = getVarOrDirectByte(0x80);
|
||||||
_saveLoadData = getVarOrDirectByte(0x40);
|
_saveLoadSlot = getVarOrDirectByte(0x40);
|
||||||
_saveLoadData = 0; /* TODO: weird behaviour */
|
_saveLoadSlot = 99; /* use this slot */
|
||||||
break;
|
break;
|
||||||
case 10: /* ? */
|
case 10: /* ? */
|
||||||
a = getVarOrDirectWord(0x80);
|
a = getVarOrDirectWord(0x80);
|
||||||
|
@ -1390,7 +1393,7 @@ void Scumm::o5_roomOps() {
|
||||||
_opcode = fetchScriptByte();
|
_opcode = fetchScriptByte();
|
||||||
d = getVarOrDirectByte(0x80);
|
d = getVarOrDirectByte(0x80);
|
||||||
e = getVarOrDirectByte(0x40);
|
e = getVarOrDirectByte(0x40);
|
||||||
unkRoomFunc2(d, e, a, b, c);
|
darkenPalette(d, e, a, b, c);
|
||||||
break;
|
break;
|
||||||
case 12: /* ? */
|
case 12: /* ? */
|
||||||
a = getVarOrDirectWord(0x80);
|
a = getVarOrDirectWord(0x80);
|
||||||
|
@ -1430,10 +1433,8 @@ void Scumm::o5_roomOps() {
|
||||||
case 16: /* ? */
|
case 16: /* ? */
|
||||||
a = getVarOrDirectByte(0x80);
|
a = getVarOrDirectByte(0x80);
|
||||||
b = getVarOrDirectByte(0x40);
|
b = getVarOrDirectByte(0x40);
|
||||||
if (b!=0)
|
checkRange(16, 1, a, "o5_roomOps: 16: color cycle out of range (%d)");
|
||||||
_colorCycleDelays[a] = 0x4000 / (b*0x4C);
|
_colorCycle[a-1].delay = (b!=0) ? 0x4000 / (b*0x4C) : 0;
|
||||||
else
|
|
||||||
_colorCycleDelays[a] = 0;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,6 +17,9 @@
|
||||||
*
|
*
|
||||||
* Change Log:
|
* Change Log:
|
||||||
* $Log$
|
* $Log$
|
||||||
|
* Revision 1.4 2001/10/26 17:34:50 strigeus
|
||||||
|
* bug fixes, code cleanup
|
||||||
|
*
|
||||||
* Revision 1.3 2001/10/24 20:12:52 strigeus
|
* Revision 1.3 2001/10/24 20:12:52 strigeus
|
||||||
* fixed some bugs related to string handling
|
* fixed some bugs related to string handling
|
||||||
*
|
*
|
||||||
|
@ -978,7 +981,7 @@ void Scumm::o6_pickupObject() {
|
||||||
if (room==0)
|
if (room==0)
|
||||||
room = _roomResource;
|
room = _roomResource;
|
||||||
addObjectToInventory(obj, room);
|
addObjectToInventory(obj, room);
|
||||||
putOwner(obj, _vars[VAR_UNK_ACTOR]);
|
putOwner(obj, _vars[VAR_EGO]);
|
||||||
putClass(obj, 32, 1);
|
putClass(obj, 32, 1);
|
||||||
putState(obj, 1);
|
putState(obj, 1);
|
||||||
removeObjectFromRoom(obj);
|
removeObjectFromRoom(obj);
|
||||||
|
@ -995,15 +998,16 @@ void Scumm::o6_loadRoomWithEgo() {
|
||||||
room = pop();
|
room = pop();
|
||||||
obj = pop();
|
obj = pop();
|
||||||
|
|
||||||
a = derefActorSafe(_vars[VAR_UNK_ACTOR], "o_loadRoomWithEgo");
|
a = derefActorSafe(_vars[VAR_EGO], "o_loadRoomWithEgo");
|
||||||
|
|
||||||
putActor(a, 0, 0, room);
|
putActor(a, 0, 0, room);
|
||||||
dseg_3A76 = 0;
|
_egoPositioned = false;
|
||||||
|
|
||||||
_vars[VAR_WALKTO_OBJ] = obj;
|
_vars[VAR_WALKTO_OBJ] = obj;
|
||||||
startScene(a->room, a, obj);
|
startScene(a->room, a, obj);
|
||||||
_vars[VAR_WALKTO_OBJ] = 0;
|
_vars[VAR_WALKTO_OBJ] = 0;
|
||||||
|
|
||||||
/* startScene maybe modifies VAR_UNK_ACTOR, i hope not */
|
/* startScene maybe modifies VAR_EGO, i hope not */
|
||||||
camera._destPos = camera._curPos = a->x;
|
camera._destPos = camera._curPos = a->x;
|
||||||
setCameraFollows(a);
|
setCameraFollows(a);
|
||||||
_fullRedraw=1;
|
_fullRedraw=1;
|
||||||
|
@ -1278,11 +1282,12 @@ void Scumm::o6_roomOps() {
|
||||||
c = pop();
|
c = pop();
|
||||||
b = pop();
|
b = pop();
|
||||||
a = pop();
|
a = pop();
|
||||||
unkRoomFunc2(b,c,a,a,a);
|
darkenPalette(b,c,a,a,a);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 180:
|
case 180:
|
||||||
_saveLoadData = pop();
|
_saveLoadCompatible = true;
|
||||||
|
_saveLoadSlot = pop();
|
||||||
_saveLoadFlag = pop();
|
_saveLoadFlag = pop();
|
||||||
warning("o6_roomops:180: partially unimplemented");
|
warning("o6_roomops:180: partially unimplemented");
|
||||||
break;
|
break;
|
||||||
|
@ -1303,7 +1308,7 @@ void Scumm::o6_roomOps() {
|
||||||
c = pop();
|
c = pop();
|
||||||
b = pop();
|
b = pop();
|
||||||
a = pop();
|
a = pop();
|
||||||
unkRoomFunc2(d, e, a, b, c);
|
darkenPalette(d, e, a, b, c);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 183:
|
case 183:
|
||||||
|
@ -1334,10 +1339,8 @@ void Scumm::o6_roomOps() {
|
||||||
case 187: /* color cycle delay */
|
case 187: /* color cycle delay */
|
||||||
b = pop();
|
b = pop();
|
||||||
a = pop();
|
a = pop();
|
||||||
if (b!=0)
|
checkRange(16, 1, a, "o6_roomOps: 187: color cycle out of range (%d)");
|
||||||
_colorCycleDelays[a] = 0x4000 / (b*0x4C);
|
_colorCycle[a-1].delay = (b!=0) ? 0x4000 / (b*0x4C) : 0;
|
||||||
else
|
|
||||||
_colorCycleDelays[a] = 0;
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 213: /* set palette */
|
case 213: /* set palette */
|
||||||
|
@ -1863,7 +1866,7 @@ void Scumm::o6_printActor() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Scumm::o6_printEgo() {
|
void Scumm::o6_printEgo() {
|
||||||
push(_vars[VAR_UNK_ACTOR]);
|
push(_vars[VAR_EGO]);
|
||||||
decodeParseString2(0,1);
|
decodeParseString2(0,1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1876,7 +1879,7 @@ void Scumm::o6_talkActor() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Scumm::o6_talkEgo() {
|
void Scumm::o6_talkEgo() {
|
||||||
_actorToPrintStrFor = _vars[VAR_UNK_ACTOR];
|
_actorToPrintStrFor = _vars[VAR_EGO];
|
||||||
_messagePtr = _scriptPointer;
|
_messagePtr = _scriptPointer;
|
||||||
setStringVars(0);
|
setStringVars(0);
|
||||||
actorTalk();
|
actorTalk();
|
||||||
|
|
374
scumm.h
374
scumm.h
|
@ -17,6 +17,9 @@
|
||||||
*
|
*
|
||||||
* Change Log:
|
* Change Log:
|
||||||
* $Log$
|
* $Log$
|
||||||
|
* Revision 1.14 2001/10/26 17:34:50 strigeus
|
||||||
|
* bug fixes, code cleanup
|
||||||
|
*
|
||||||
* Revision 1.13 2001/10/24 20:12:52 strigeus
|
* Revision 1.13 2001/10/24 20:12:52 strigeus
|
||||||
* fixed some bugs related to string handling
|
* fixed some bugs related to string handling
|
||||||
*
|
*
|
||||||
|
@ -73,6 +76,8 @@ struct Actor;
|
||||||
|
|
||||||
typedef void (Scumm::*OpcodeProc)();
|
typedef void (Scumm::*OpcodeProc)();
|
||||||
|
|
||||||
|
#define NUM_SCRIPT_SLOT 25
|
||||||
|
|
||||||
#pragma START_PACK_STRUCTS
|
#pragma START_PACK_STRUCTS
|
||||||
|
|
||||||
struct Point {
|
struct Point {
|
||||||
|
@ -109,6 +114,7 @@ struct VerbSlot {
|
||||||
};
|
};
|
||||||
|
|
||||||
struct VirtScreen {
|
struct VirtScreen {
|
||||||
|
int number;
|
||||||
uint16 unk1;
|
uint16 unk1;
|
||||||
uint16 topline;
|
uint16 topline;
|
||||||
uint16 width,height;
|
uint16 width,height;
|
||||||
|
@ -258,80 +264,78 @@ enum {
|
||||||
};
|
};
|
||||||
|
|
||||||
enum ScummVars {
|
enum ScummVars {
|
||||||
VAR_UNK_ACTOR = 1,
|
VAR_EGO = 1,
|
||||||
VAR_WALKTO_OBJ = 38,
|
VAR_CAMERA_CUR_POS = 2,
|
||||||
|
VAR_HAVE_MSG = 3,
|
||||||
|
VAR_ROOM = 4,
|
||||||
VAR_OVERRIDE = 5,
|
VAR_OVERRIDE = 5,
|
||||||
VAR_NUM_ACTOR = 8,
|
VAR_NUM_ACTOR = 8,
|
||||||
VAR_OBJECT_LO = 15,
|
|
||||||
VAR_OBJECT_HI = 16,
|
|
||||||
VAR_CURRENTDRIVE = 10,
|
VAR_CURRENTDRIVE = 10,
|
||||||
VAR_TALK_ACTOR = 25,
|
VAR_TMR_1 = 11,
|
||||||
VAR_DEBUGMODE = 39,
|
VAR_TMR_2 = 12,
|
||||||
VAR_VERSION = 75,
|
VAR_TMR_3 = 13,
|
||||||
VAR_FIXEDDISK = 51,
|
VAR_CAMERA_MIN = 17,
|
||||||
VAR_CURSORSTATE = 52,
|
VAR_CAMERA_MAX = 18,
|
||||||
VAR_USERPUT = 53,
|
VAR_TIMER_NEXT = 19,
|
||||||
VAR_SOUNDCARD = 48,
|
|
||||||
VAR_VIDEOMODE = 49,
|
|
||||||
VAR_HEAPSPACE = 40,
|
|
||||||
VAR_MOUSEPRESENT = 67,
|
|
||||||
VAR_SOUNDPARAM = 64,
|
|
||||||
VAR_SOUNDPARAM2 = 65,
|
|
||||||
VAR_SOUNDPARAM3 = 66,
|
|
||||||
VAR_GAME_LOADED = 71,
|
|
||||||
VAR_VIRT_MOUSE_X = 20,
|
VAR_VIRT_MOUSE_X = 20,
|
||||||
VAR_VIRT_MOUSE_Y = 21,
|
VAR_VIRT_MOUSE_Y = 21,
|
||||||
VAR_PERFORMANCE_1 = 68,
|
VAR_ROOM_RESOURCE = 22,
|
||||||
VAR_PERFORMANCE_2 = 69,
|
VAR_LAST_SOUND = 23,
|
||||||
VAR_ROOM_FLAG = 70,
|
VAR_CUTSCENEEXIT_KEY = 24,
|
||||||
VAR_HAVE_MSG = 3,
|
VAR_TALK_ACTOR = 25,
|
||||||
|
VAR_CAMERA_FAST = 26,
|
||||||
|
VAR_SCROLL_SCRIPT = 27,
|
||||||
VAR_ENTRY_SCRIPT = 28,
|
VAR_ENTRY_SCRIPT = 28,
|
||||||
VAR_ENTRY_SCRIPT2 = 29,
|
VAR_ENTRY_SCRIPT2 = 29,
|
||||||
VAR_EXIT_SCRIPT = 30,
|
VAR_EXIT_SCRIPT = 30,
|
||||||
VAR_EXIT_SCRIPT2 = 31,
|
VAR_EXIT_SCRIPT2 = 31,
|
||||||
VAR_VERB_SCRIPT = 32,
|
VAR_VERB_SCRIPT = 32,
|
||||||
VAR_SENTENCE_SCRIPT = 33,
|
VAR_SENTENCE_SCRIPT = 33,
|
||||||
VAR_LAST_SOUND = 23,
|
|
||||||
VAR_HOOK_SCRIPT = 34,
|
VAR_HOOK_SCRIPT = 34,
|
||||||
VAR_CUTSCENE_START_SCRIPT = 35,
|
VAR_CUTSCENE_START_SCRIPT = 35,
|
||||||
VAR_CUTSCENE_END_SCRIPT = 36,
|
VAR_CUTSCENE_END_SCRIPT = 36,
|
||||||
VAR_SCROLL_SCRIPT = 27,
|
|
||||||
VAR_CAMERA_MIN = 17,
|
|
||||||
VAR_CAMERA_MAX = 18,
|
|
||||||
VAR_CAMERA_FAST = 26,
|
|
||||||
VAR_CAMERA_CUR_POS = 2,
|
|
||||||
VAR_NEW_ROOM = 72,
|
|
||||||
VAR_ROOM = 4,
|
|
||||||
VAR_ROOM_RESOURCE = 22,
|
|
||||||
|
|
||||||
VAR_MOUSE_X = 44,
|
|
||||||
VAR_MOUSE_Y = 45,
|
|
||||||
|
|
||||||
VAR_TIMER = 46,
|
|
||||||
VAR_TIMER_NEXT = 19,
|
|
||||||
|
|
||||||
VAR_TMR_1 = 11,
|
|
||||||
VAR_TMR_2 = 12,
|
|
||||||
VAR_TMR_3 = 13,
|
|
||||||
VAR_TMR_4 = 47,
|
|
||||||
|
|
||||||
VAR_DRAWFLAGS = 9,
|
|
||||||
|
|
||||||
VAR_SOUNDRESULT = 56,
|
|
||||||
|
|
||||||
VAR_PLAYBACKTIMER = 19,
|
|
||||||
|
|
||||||
VAR_TALK_STRING_Y = 54,
|
|
||||||
VAR_CHARFLAG = 60,
|
|
||||||
VAR_CHARINC = 37,
|
VAR_CHARINC = 37,
|
||||||
|
VAR_WALKTO_OBJ = 38,
|
||||||
|
VAR_DEBUGMODE = 39,
|
||||||
|
VAR_HEAPSPACE = 40,
|
||||||
VAR_RESTART_KEY = 42,
|
VAR_RESTART_KEY = 42,
|
||||||
VAR_PAUSE_KEY = 43,
|
VAR_PAUSE_KEY = 43,
|
||||||
VAR_CUTSCENEEXIT_KEY = 24,
|
VAR_MOUSE_X = 44,
|
||||||
VAR_TALKSTOP_KEY = 57,
|
VAR_MOUSE_Y = 45,
|
||||||
|
VAR_TIMER = 46,
|
||||||
|
VAR_TMR_4 = 47,
|
||||||
|
VAR_SOUNDCARD = 48,
|
||||||
|
VAR_VIDEOMODE = 49,
|
||||||
VAR_SAVELOADDIALOG_KEY = 50,
|
VAR_SAVELOADDIALOG_KEY = 50,
|
||||||
|
VAR_FIXEDDISK = 51,
|
||||||
|
VAR_CURSORSTATE = 52,
|
||||||
|
VAR_USERPUT = 53,
|
||||||
|
VAR_SOUNDRESULT = 56,
|
||||||
|
VAR_TALKSTOP_KEY = 57,
|
||||||
|
VAR_59 = 59,
|
||||||
|
|
||||||
|
VAR_SOUNDPARAM = 64,
|
||||||
|
VAR_SOUNDPARAM2 = 65,
|
||||||
|
VAR_SOUNDPARAM3 = 66,
|
||||||
|
VAR_MOUSEPRESENT = 67,
|
||||||
|
VAR_PERFORMANCE_1 = 68,
|
||||||
|
VAR_PERFORMANCE_2 = 69,
|
||||||
|
VAR_ROOM_FLAG = 70,
|
||||||
|
VAR_GAME_LOADED = 71,
|
||||||
|
VAR_NEW_ROOM = 72,
|
||||||
|
VAR_VERSION = 75,
|
||||||
|
|
||||||
|
VAR_V5_DRAWFLAGS = 9,
|
||||||
|
VAR_V5_OBJECT_LO = 15,
|
||||||
|
VAR_V5_OBJECT_HI = 16,
|
||||||
|
VAR_V5_TALK_STRING_Y = 54,
|
||||||
|
VAR_V5_CHARFLAG = 60,
|
||||||
|
|
||||||
|
VAR_V6_SCREEN_WIDTH = 41,
|
||||||
|
VAR_V6_SCREEN_HEIGHT = 54,
|
||||||
|
VAR_V6_EMSSPACE = 76,
|
||||||
VAR_V6_RANDOM_NR = 118,
|
VAR_V6_RANDOM_NR = 118,
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#define _maxRooms res.num[1]
|
#define _maxRooms res.num[1]
|
||||||
|
@ -366,6 +370,7 @@ struct CharsetRenderer {
|
||||||
int _right;
|
int _right;
|
||||||
byte _color;
|
byte _color;
|
||||||
bool _hasMask;
|
bool _hasMask;
|
||||||
|
bool _blitAlso;
|
||||||
|
|
||||||
int _strLeft, _strRight, _strTop, _strBottom;
|
int _strLeft, _strRight, _strTop, _strBottom;
|
||||||
// int _mask_bottom, _mask_right, _mask_top, _mask_left;
|
// int _mask_bottom, _mask_right, _mask_top, _mask_left;
|
||||||
|
@ -386,8 +391,9 @@ struct CharsetRenderer {
|
||||||
|
|
||||||
byte _ignoreCharsetMask;
|
byte _ignoreCharsetMask;
|
||||||
|
|
||||||
byte *_bg_ptr, *_where_to_draw_ptr;
|
byte *_backbuff_ptr, *_bgbak_ptr;
|
||||||
byte *_mask_ptr;
|
byte *_mask_ptr;
|
||||||
|
byte *_bg_ptr2;
|
||||||
|
|
||||||
byte _colorMap[16];
|
byte _colorMap[16];
|
||||||
byte _buffer[256];
|
byte _buffer[256];
|
||||||
|
@ -405,7 +411,7 @@ struct CostumeRenderer {
|
||||||
byte *_dataptr;
|
byte *_dataptr;
|
||||||
byte *_frameptr;
|
byte *_frameptr;
|
||||||
byte *_srcptr;
|
byte *_srcptr;
|
||||||
byte *_where_to_draw_ptr, *_bg_ptr, *_mask_ptr, *_mask_ptr_dest;
|
byte *_bgbak_ptr, *_backbuff_ptr, *_mask_ptr, *_mask_ptr_dest;
|
||||||
int _actorX, _actorY;
|
int _actorX, _actorY;
|
||||||
byte _zbuf;
|
byte _zbuf;
|
||||||
uint _scaleX, _scaleY;
|
uint _scaleX, _scaleY;
|
||||||
|
@ -519,6 +525,82 @@ struct StringTab {
|
||||||
int16 mask_top, mask_bottom, mask_right, mask_left;
|
int16 mask_top, mask_bottom, mask_right, mask_left;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct ColorCycle {
|
||||||
|
uint16 delay;
|
||||||
|
uint16 counter;
|
||||||
|
uint16 flags;
|
||||||
|
byte start;
|
||||||
|
byte end;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct Gdi {
|
||||||
|
Scumm *_vm;
|
||||||
|
|
||||||
|
byte *_readPtr;
|
||||||
|
uint _readOffs;
|
||||||
|
|
||||||
|
int8 _unk4;
|
||||||
|
|
||||||
|
int _numZBuffer;
|
||||||
|
int _imgBufOffs[4];
|
||||||
|
byte _disable_zbuffer;
|
||||||
|
|
||||||
|
byte dseg_4E3B;
|
||||||
|
byte _numLinesToProcess;
|
||||||
|
byte _tempNumLines;
|
||||||
|
byte _currentX;
|
||||||
|
byte _hotspot_x;
|
||||||
|
byte _hotspot_y;
|
||||||
|
int16 _drawMouseX;
|
||||||
|
int16 _drawMouseY;
|
||||||
|
byte _currentCursor;
|
||||||
|
byte _mouseColors[4];
|
||||||
|
byte _mouseColor;
|
||||||
|
byte _mouseClipMask1, _mouseClipMask2, _mouseClipMask3;
|
||||||
|
byte _mouseColorIndex;
|
||||||
|
byte *_mouseMaskPtr;
|
||||||
|
byte *_smap_ptr;
|
||||||
|
byte *_backbuff_ptr;
|
||||||
|
byte *_bgbak_ptr;
|
||||||
|
byte *_mask_ptr;
|
||||||
|
byte *_mask_ptr_dest;
|
||||||
|
byte *_z_plane_ptr;
|
||||||
|
|
||||||
|
byte _decomp_shr, _decomp_mask;
|
||||||
|
byte _transparency;
|
||||||
|
uint16 _vertStripNextInc;
|
||||||
|
byte *_backupIsWhere;
|
||||||
|
|
||||||
|
byte _mouseMask[0x200];
|
||||||
|
|
||||||
|
void unkDecode1();
|
||||||
|
void unkDecode2();
|
||||||
|
void unkDecode3();
|
||||||
|
void unkDecode4();
|
||||||
|
void unkDecode5();
|
||||||
|
void unkDecode6();
|
||||||
|
void unkDecode7();
|
||||||
|
|
||||||
|
void decompressBitmap();
|
||||||
|
|
||||||
|
void drawBitmap(byte *ptr, VirtScreen *vs, int x, int y, int h, int stripnr, int numstrip, bool flag);
|
||||||
|
void clearUpperMask();
|
||||||
|
|
||||||
|
void disableZBuffer() { _disable_zbuffer++; }
|
||||||
|
void enableZBuffer() { _disable_zbuffer--; }
|
||||||
|
|
||||||
|
void draw8ColWithMasking();
|
||||||
|
void clear8ColWithMasking();
|
||||||
|
void clear8Col();
|
||||||
|
void decompressMaskImgOr();
|
||||||
|
void decompressMaskImg();
|
||||||
|
|
||||||
|
void resetBackground(byte top, byte bottom, int strip);
|
||||||
|
void drawStripToScreen(VirtScreen *vs, int x, int w, int t, int b);
|
||||||
|
void updateDirtyScreen(VirtScreen *vs);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
enum GameId {
|
enum GameId {
|
||||||
GID_TENTACLE = 1,
|
GID_TENTACLE = 1,
|
||||||
GID_MONKEY2 = 2,
|
GID_MONKEY2 = 2,
|
||||||
|
@ -545,8 +627,10 @@ struct Scumm {
|
||||||
void *_fileHandle;
|
void *_fileHandle;
|
||||||
char *_exe_name;
|
char *_exe_name;
|
||||||
|
|
||||||
int _saveLoadSlot;
|
byte _saveLoadFlag;
|
||||||
|
byte _saveLoadSlot;
|
||||||
|
bool _saveLoadCompatible;
|
||||||
|
|
||||||
bool _dynamicRoomOffsets;
|
bool _dynamicRoomOffsets;
|
||||||
byte _resFilePathId;
|
byte _resFilePathId;
|
||||||
|
|
||||||
|
@ -571,6 +655,8 @@ struct Scumm {
|
||||||
|
|
||||||
int _curPalIndex;
|
int _curPalIndex;
|
||||||
|
|
||||||
|
VirtScreen *_curVirtScreen;
|
||||||
|
|
||||||
int _numVariables;
|
int _numVariables;
|
||||||
int _numBitVariables;
|
int _numBitVariables;
|
||||||
int _numLocalObjects;
|
int _numLocalObjects;
|
||||||
|
@ -584,47 +670,39 @@ struct Scumm {
|
||||||
int _numSounds;
|
int _numSounds;
|
||||||
int _numCharsets;
|
int _numCharsets;
|
||||||
int _numCostumes;
|
int _numCostumes;
|
||||||
|
|
||||||
|
byte *_msgPtrToAdd;
|
||||||
|
|
||||||
uint8 *_roomFileIndexes;
|
uint8 *_roomFileIndexes;
|
||||||
byte *_objectFlagTable;
|
byte *_objectFlagTable;
|
||||||
uint32 *_classData;
|
uint32 *_classData;
|
||||||
|
|
||||||
byte _numGlobalScripts;
|
byte _numGlobalScripts;
|
||||||
|
byte *_scriptPointer, *_scriptOrgPointer;
|
||||||
uint16 _numZBuffer;
|
byte *_scriptPointerStart;
|
||||||
|
byte _opcode;
|
||||||
|
|
||||||
uint32 _randSeed1;
|
uint32 _randSeed1;
|
||||||
uint32 _randSeed2;
|
uint32 _randSeed2;
|
||||||
|
|
||||||
uint16 _screenB, _screenH;
|
uint16 _screenB, _screenH;
|
||||||
|
|
||||||
uint16 dseg_3A76;
|
|
||||||
uint16 _defaultTalkDelay;
|
uint16 _defaultTalkDelay;
|
||||||
uint16 _lightsValueA,_lightsValueB;
|
|
||||||
byte _haveMsg;
|
byte _haveMsg;
|
||||||
byte _newEffect;
|
byte _newEffect;
|
||||||
uint16 _fullRedraw;
|
uint16 _fullRedraw;
|
||||||
uint16 dseg_3DB6;
|
|
||||||
uint16 dseg_2456; /* lastDrawnRoom */
|
|
||||||
uint16 dseg_4E8A;
|
|
||||||
uint16 _soundParam,_soundParam2,_soundParam3;
|
uint16 _soundParam,_soundParam2,_soundParam3;
|
||||||
uint16 dseg_4F8C;
|
|
||||||
|
|
||||||
byte _switchRoomEffect2, _switchRoomEffect;
|
byte _switchRoomEffect2, _switchRoomEffect;
|
||||||
uint16 dseg_4AC2;
|
|
||||||
|
|
||||||
bool doEffect;
|
bool _egoPositioned;
|
||||||
|
bool _doEffect;
|
||||||
uint16 _drawBmpX;
|
bool _screenEffectFlag;
|
||||||
uint16 dseg_719E;
|
|
||||||
uint16 _drawBmpY;
|
|
||||||
uint16 dseg_4174;
|
|
||||||
byte dseg_4E3C;
|
|
||||||
uint16 _lastXstart;
|
|
||||||
uint16 dseg_4EA0;
|
|
||||||
|
|
||||||
bool _keepText;
|
bool _keepText;
|
||||||
|
|
||||||
|
byte _bkColor;
|
||||||
|
uint16 _lastXstart;
|
||||||
|
|
||||||
int16 _talkDelay;
|
int16 _talkDelay;
|
||||||
int16 _shakeMode;
|
int16 _shakeMode;
|
||||||
|
|
||||||
|
@ -639,7 +717,6 @@ struct Scumm {
|
||||||
byte *_messagePtr;
|
byte *_messagePtr;
|
||||||
|
|
||||||
byte _numNestedScripts;
|
byte _numNestedScripts;
|
||||||
byte _unkTabIndex;
|
|
||||||
byte _currentScript;
|
byte _currentScript;
|
||||||
|
|
||||||
byte _currentRoom;
|
byte _currentRoom;
|
||||||
|
@ -656,7 +733,7 @@ struct Scumm {
|
||||||
|
|
||||||
uint16 _completeScreenRedraw;
|
uint16 _completeScreenRedraw;
|
||||||
|
|
||||||
byte _saveLoadFlag;
|
|
||||||
|
|
||||||
int8 _userPut;
|
int8 _userPut;
|
||||||
int8 _cursorState;
|
int8 _cursorState;
|
||||||
|
@ -666,7 +743,6 @@ struct Scumm {
|
||||||
|
|
||||||
int _numInMsgStack;
|
int _numInMsgStack;
|
||||||
|
|
||||||
// VerbSlot verbs[102];
|
|
||||||
VirtScreen virtscr[4];
|
VirtScreen virtscr[4];
|
||||||
|
|
||||||
uint32 _ENCD_offs, _EXCD_offs;
|
uint32 _ENCD_offs, _EXCD_offs;
|
||||||
|
@ -703,56 +779,15 @@ struct Scumm {
|
||||||
int16 cutSceneData[5];
|
int16 cutSceneData[5];
|
||||||
int16 cutSceneScriptIndex;
|
int16 cutSceneScriptIndex;
|
||||||
byte cutSceneStackPointer;
|
byte cutSceneStackPointer;
|
||||||
ScriptSlot slot[20];
|
ScriptSlot slot[NUM_SCRIPT_SLOT];
|
||||||
NestedScript nest[15];
|
NestedScript nest[15];
|
||||||
int16 localvar[20*17];
|
int16 localvar[NUM_SCRIPT_SLOT*17];
|
||||||
} vm;
|
} vm;
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
int16 x,y;
|
int16 x,y;
|
||||||
} mouse;
|
} mouse;
|
||||||
|
|
||||||
struct {
|
|
||||||
byte *readPtr;
|
|
||||||
uint16 readOffs;
|
|
||||||
uint16 drawY;
|
|
||||||
uint16 drawHeight;
|
|
||||||
uint16 drawWidth;
|
|
||||||
uint16 draw8xPos;
|
|
||||||
int16 virtScreen;
|
|
||||||
uint16 drawBottom;
|
|
||||||
uint16 drawTop;
|
|
||||||
|
|
||||||
int8 unk4;
|
|
||||||
|
|
||||||
byte numLinesToProcess;
|
|
||||||
byte tempNumLines;
|
|
||||||
byte currentX;
|
|
||||||
byte hotspot_x;
|
|
||||||
byte hotspot_y;
|
|
||||||
int16 drawMouseX;
|
|
||||||
int16 drawMouseY;
|
|
||||||
byte currentCursor;
|
|
||||||
byte mouseColors[4];
|
|
||||||
byte mouseColor;
|
|
||||||
byte mouseClipMask1, mouseClipMask2, mouseClipMask3;
|
|
||||||
byte mouseColorIndex;
|
|
||||||
byte mouseMask[0x200];
|
|
||||||
byte *mouseMaskPtr;
|
|
||||||
byte *smap_ptr;
|
|
||||||
byte *bg_ptr;
|
|
||||||
byte *where_to_draw_ptr;
|
|
||||||
byte *mask_ptr;
|
|
||||||
byte *mask_ptr_dest;
|
|
||||||
byte *z_plane_ptr;
|
|
||||||
|
|
||||||
byte decomp_shr, decomp_mask;
|
|
||||||
byte transparency;
|
|
||||||
uint16 vertStripNextInc;
|
|
||||||
byte *backupIsWhere;
|
|
||||||
// byte mouseBackup[16*24];
|
|
||||||
} gdi;
|
|
||||||
|
|
||||||
Actor actor[13];
|
Actor actor[13];
|
||||||
|
|
||||||
uint16 actorDrawBits[200];
|
uint16 actorDrawBits[200];
|
||||||
|
@ -788,10 +823,6 @@ struct Scumm {
|
||||||
|
|
||||||
uint32 _whereInResToRead;
|
uint32 _whereInResToRead;
|
||||||
|
|
||||||
byte *_scriptPointer, *_scriptOrgPointer;
|
|
||||||
byte *_scriptPointerStart;
|
|
||||||
byte _opcode;
|
|
||||||
|
|
||||||
int _xPos, _yPos;
|
int _xPos, _yPos;
|
||||||
byte _dir;
|
byte _dir;
|
||||||
|
|
||||||
|
@ -799,41 +830,13 @@ struct Scumm {
|
||||||
|
|
||||||
int _resultVarNumber;
|
int _resultVarNumber;
|
||||||
|
|
||||||
uint16 _imgBufOffs[4];
|
|
||||||
|
|
||||||
byte _sentenceIndex;
|
byte _sentenceIndex;
|
||||||
SentenceTab sentence[6];
|
SentenceTab sentence[6];
|
||||||
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
byte _sentenceTab[6];
|
|
||||||
byte _sentenceTab2[6];
|
|
||||||
uint16 _sentenceTab3[6];
|
|
||||||
uint16 _sentenceTab4[6];
|
|
||||||
byte _sentenceTab5[6];
|
|
||||||
#endif
|
|
||||||
|
|
||||||
StringTab string[6];
|
StringTab string[6];
|
||||||
|
|
||||||
#if 0
|
|
||||||
// int _stringXPos[4], _stringYPos[4];
|
|
||||||
uint16 _stringOverhead[6];
|
|
||||||
uint16 _stringCenter[6];
|
|
||||||
uint16 _stringRight[6];
|
|
||||||
uint16 _stringColor[6];
|
|
||||||
|
|
||||||
int16 _stringXpos[6];
|
|
||||||
int16 _stringYpos[6];
|
|
||||||
uint16 _stringCharset[6];
|
|
||||||
|
|
||||||
int16 _stringXpos2[6];
|
|
||||||
int16 _stringYpos2[6];
|
|
||||||
#endif
|
|
||||||
|
|
||||||
CostumeRenderer cost;
|
CostumeRenderer cost;
|
||||||
|
|
||||||
// ObjectData objs[184];
|
|
||||||
|
|
||||||
int16 _soundQuePos;
|
int16 _soundQuePos;
|
||||||
int16 _soundQue[0x100];
|
int16 _soundQue[0x100];
|
||||||
|
|
||||||
|
@ -851,22 +854,11 @@ struct Scumm {
|
||||||
|
|
||||||
int _palDirtyMin, _palDirtyMax;
|
int _palDirtyMin, _palDirtyMax;
|
||||||
|
|
||||||
byte _saveLoadData;
|
|
||||||
|
|
||||||
uint16 _colorCycleDelays[17];
|
ColorCycle _colorCycle[16];
|
||||||
uint16 _colorCycleCounter[17];
|
|
||||||
uint16 _colorCycleFlags[17];
|
|
||||||
byte _colorCycleStart[17];
|
|
||||||
byte _colorCycleEnd[17];
|
|
||||||
|
|
||||||
byte dseg_4E3B;
|
|
||||||
|
|
||||||
uint32 _findResSize, _findResHeaderSize;
|
|
||||||
byte *_findResPos;
|
|
||||||
|
|
||||||
uint32 _findResSize2, _findResHeaderSize2;
|
|
||||||
byte *_findResPos2;
|
|
||||||
|
|
||||||
|
Gdi gdi;
|
||||||
|
|
||||||
bool _BgNeedsRedraw;
|
bool _BgNeedsRedraw;
|
||||||
|
|
||||||
int16 _localParamList[16];
|
int16 _localParamList[16];
|
||||||
|
@ -886,8 +878,6 @@ struct Scumm {
|
||||||
int _boxPathVertexHeapIndex;
|
int _boxPathVertexHeapIndex;
|
||||||
int _boxMatrixItem;
|
int _boxMatrixItem;
|
||||||
|
|
||||||
byte *_msgPtrToAdd;
|
|
||||||
|
|
||||||
OpcodeProc getOpcode(int i) { return _opcodes[i]; }
|
OpcodeProc getOpcode(int i) { return _opcodes[i]; }
|
||||||
|
|
||||||
void openRoom(int room);
|
void openRoom(int room);
|
||||||
|
@ -958,8 +948,8 @@ struct Scumm {
|
||||||
void updateDirtyScreen(int slot);
|
void updateDirtyScreen(int slot);
|
||||||
void unkVirtScreen4(int a);
|
void unkVirtScreen4(int a);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void drawStripToScreen();
|
|
||||||
void restoreMouse();
|
void restoreMouse();
|
||||||
void initActor(Actor *a, int mode);
|
void initActor(Actor *a, int mode);
|
||||||
bool checkFixedDisk();
|
bool checkFixedDisk();
|
||||||
|
@ -1327,8 +1317,10 @@ struct Scumm {
|
||||||
void initBGBuffers();
|
void initBGBuffers();
|
||||||
void setDirtyColors(int min, int max);
|
void setDirtyColors(int min, int max);
|
||||||
|
|
||||||
|
#if 0
|
||||||
byte *findResource(uint32 tag, byte *searchin);
|
byte *findResource(uint32 tag, byte *searchin);
|
||||||
byte *findResource2(uint32 tag, byte *searchin);
|
byte *findResource2(uint32 tag, byte *searchin);
|
||||||
|
#endif
|
||||||
|
|
||||||
void setScaleItem(int slot, int a, int b, int c, int d);
|
void setScaleItem(int slot, int a, int b, int c, int d);
|
||||||
|
|
||||||
|
@ -1341,26 +1333,13 @@ struct Scumm {
|
||||||
void redrawBGStrip(int start, int num);
|
void redrawBGStrip(int start, int num);
|
||||||
void drawObject(int obj, int arg);
|
void drawObject(int obj, int arg);
|
||||||
|
|
||||||
void drawBmp(byte *ptr, int a, int b, int c, const char *str, int objnr);
|
// void drawBmp(byte *ptr, int a, int b, int c, const char *str, int objnr);
|
||||||
void decompressBitmap();
|
|
||||||
int hasCharsetMask(int x, int y, int x2, int y2);
|
int hasCharsetMask(int x, int y, int x2, int y2);
|
||||||
void draw8ColWithMasking();
|
|
||||||
void clear8ColWithMasking();
|
|
||||||
void clear8Col();
|
|
||||||
void decompressMaskImgOr();
|
|
||||||
void decompressMaskImg();
|
|
||||||
|
|
||||||
void GDI_UnkDecode1();
|
|
||||||
void GDI_UnkDecode2();
|
|
||||||
void GDI_UnkDecode3();
|
|
||||||
void GDI_UnkDecode4();
|
|
||||||
void GDI_UnkDecode5();
|
|
||||||
void GDI_UnkDecode6();
|
|
||||||
void GDI_UnkDecode7();
|
|
||||||
|
|
||||||
void restoreBG(int left, int top, int right, int bottom);
|
void restoreBG(int left, int top, int right, int bottom);
|
||||||
void updateDirtyRect(int virt, int left, int right, int top, int bottom, uint16 dirtybits);
|
void updateDirtyRect(int virt, int left, int right, int top, int bottom, uint16 dirtybits);
|
||||||
int findVirtScreen(int y);
|
VirtScreen *findVirtScreen(int y);
|
||||||
|
|
||||||
void unkScreenEffect1();
|
void unkScreenEffect1();
|
||||||
void unkScreenEffect2();
|
void unkScreenEffect2();
|
||||||
|
@ -1375,7 +1354,7 @@ struct Scumm {
|
||||||
void decreaseScriptDelay(int amount);
|
void decreaseScriptDelay(int amount);
|
||||||
void processKbd();
|
void processKbd();
|
||||||
|
|
||||||
void clearUpperMask();
|
|
||||||
void redrawVerbs();
|
void redrawVerbs();
|
||||||
void checkExecVerbs();
|
void checkExecVerbs();
|
||||||
void checkAndRunVar33();
|
void checkAndRunVar33();
|
||||||
|
@ -1447,7 +1426,7 @@ struct Scumm {
|
||||||
void unkHeapProc2(int a, int b);
|
void unkHeapProc2(int a, int b);
|
||||||
void unkResProc(int a, int b);
|
void unkResProc(int a, int b);
|
||||||
void setPalColor(int index, int r, int g, int b);
|
void setPalColor(int index, int r, int g, int b);
|
||||||
void unkRoomFunc2(int a, int b, int c, int d, int e);
|
void darkenPalette(int a, int b, int c, int d, int e);
|
||||||
void unkRoomFunc3(int a, int b, int c, int d, int e);
|
void unkRoomFunc3(int a, int b, int c, int d, int e);
|
||||||
void unkRoomFunc4(int a, int b, int c, int d, int e);
|
void unkRoomFunc4(int a, int b, int c, int d, int e);
|
||||||
int getVerbSlot(int id, int mode);
|
int getVerbSlot(int id, int mode);
|
||||||
|
@ -1484,9 +1463,6 @@ struct Scumm {
|
||||||
|
|
||||||
void drawMouse();
|
void drawMouse();
|
||||||
|
|
||||||
void GDI_drawMouse();
|
|
||||||
void GDI_removeMouse();
|
|
||||||
|
|
||||||
void dumpResource(char *tag, int index, byte *ptr);
|
void dumpResource(char *tag, int index, byte *ptr);
|
||||||
|
|
||||||
FILE *_saveLoadStream;
|
FILE *_saveLoadStream;
|
||||||
|
@ -1509,7 +1485,6 @@ struct Scumm {
|
||||||
uint16 loadWord();
|
uint16 loadWord();
|
||||||
uint32 loadUint32();
|
uint32 loadUint32();
|
||||||
|
|
||||||
|
|
||||||
Actor *derefActor(int id) { return &actor[id]; }
|
Actor *derefActor(int id) { return &actor[id]; }
|
||||||
Actor *derefActorSafe(int id, const char *errmsg);
|
Actor *derefActorSafe(int id, const char *errmsg);
|
||||||
Actor *getFirstActor() { return actor; }
|
Actor *getFirstActor() { return actor; }
|
||||||
|
@ -1588,6 +1563,10 @@ struct Scumm {
|
||||||
void startManiac();
|
void startManiac();
|
||||||
|
|
||||||
void readIndexFileV5(int i);
|
void readIndexFileV5(int i);
|
||||||
|
|
||||||
|
void grabCursor(byte *ptr, int width, int height);
|
||||||
|
|
||||||
|
byte *getPalettePtr();
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ScummDebugger {
|
struct ScummDebugger {
|
||||||
|
@ -1607,6 +1586,9 @@ struct ScummDebugger {
|
||||||
int get_command();
|
int get_command();
|
||||||
void attach(Scumm *s);
|
void attach(Scumm *s);
|
||||||
void detach();
|
void detach();
|
||||||
|
|
||||||
|
void printActors(int act);
|
||||||
|
void printScripts();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -1624,3 +1606,5 @@ void initGraphics(Scumm *s);
|
||||||
void updateScreen(Scumm *s);
|
void updateScreen(Scumm *s);
|
||||||
|
|
||||||
void drawMouse(Scumm *s, int x, int y, int color, byte *mask, bool visible);
|
void drawMouse(Scumm *s, int x, int y, int color, byte *mask, bool visible);
|
||||||
|
void blit(byte *dst, byte *src, int w, int h);
|
||||||
|
byte *findResource(uint32 id, byte *searchin, int index);
|
182
scummvm.cpp
182
scummvm.cpp
|
@ -17,6 +17,9 @@
|
||||||
*
|
*
|
||||||
* Change Log:
|
* Change Log:
|
||||||
* $Log$
|
* $Log$
|
||||||
|
* Revision 1.13 2001/10/26 17:34:50 strigeus
|
||||||
|
* bug fixes, code cleanup
|
||||||
|
*
|
||||||
* Revision 1.12 2001/10/24 20:12:52 strigeus
|
* Revision 1.12 2001/10/24 20:12:52 strigeus
|
||||||
* fixed some bugs related to string handling
|
* fixed some bugs related to string handling
|
||||||
*
|
*
|
||||||
|
@ -160,11 +163,9 @@ void Scumm::scummInit() {
|
||||||
|
|
||||||
virtscr[0].xstart = 0;
|
virtscr[0].xstart = 0;
|
||||||
|
|
||||||
_vars[9] = 11;
|
_vars[VAR_V5_DRAWFLAGS] = 11;
|
||||||
|
|
||||||
_lightsValueA = _lightsValueB = 7;
|
_vars[VAR_59] = 3;
|
||||||
|
|
||||||
_vars[59] = 3;
|
|
||||||
|
|
||||||
mouse.x = 104;
|
mouse.x = 104;
|
||||||
mouse.y = 56;
|
mouse.y = 56;
|
||||||
|
@ -172,8 +173,8 @@ void Scumm::scummInit() {
|
||||||
_ENCD_offs = 0;
|
_ENCD_offs = 0;
|
||||||
_EXCD_offs = 0;
|
_EXCD_offs = 0;
|
||||||
|
|
||||||
_unkTabIndex = 0xFF;
|
|
||||||
_currentScript = 0xFF;
|
_currentScript = 0xFF;
|
||||||
|
_sentenceIndex = 0xFF;
|
||||||
|
|
||||||
_currentRoom = 0;
|
_currentRoom = 0;
|
||||||
_numObjectsInRoom = 0;
|
_numObjectsInRoom = 0;
|
||||||
|
@ -184,7 +185,7 @@ void Scumm::scummInit() {
|
||||||
|
|
||||||
_screenStartStrip = 0;
|
_screenStartStrip = 0;
|
||||||
|
|
||||||
_vars[25] = 0;
|
_vars[VAR_TALK_ACTOR] = 0;
|
||||||
|
|
||||||
_talkDelay = 0;
|
_talkDelay = 0;
|
||||||
_keepText = false;
|
_keepText = false;
|
||||||
|
@ -212,7 +213,8 @@ void Scumm::scummInit() {
|
||||||
|
|
||||||
initScummVars();
|
initScummVars();
|
||||||
|
|
||||||
_vars[54] = -0x50;
|
if (_majorScummVersion==5)
|
||||||
|
_vars[VAR_V5_TALK_STRING_Y] = -0x50;
|
||||||
|
|
||||||
getGraphicsPerformance();
|
getGraphicsPerformance();
|
||||||
}
|
}
|
||||||
|
@ -228,6 +230,8 @@ void Scumm::initScummVars() {
|
||||||
_vars[VAR_SOUNDPARAM] = _soundParam;
|
_vars[VAR_SOUNDPARAM] = _soundParam;
|
||||||
_vars[VAR_SOUNDPARAM2] = _soundParam2;
|
_vars[VAR_SOUNDPARAM2] = _soundParam2;
|
||||||
_vars[VAR_SOUNDPARAM3] = _soundParam3;
|
_vars[VAR_SOUNDPARAM3] = _soundParam3;
|
||||||
|
if (_majorScummVersion==6)
|
||||||
|
_vars[VAR_V6_EMSSPACE] = 10000;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Scumm::checkRange(int max, int min, int no, const char *str) {
|
void Scumm::checkRange(int max, int min, int no, const char *str) {
|
||||||
|
@ -242,6 +246,7 @@ void Scumm::scummMain(int argc, char **argv) {
|
||||||
|
|
||||||
charset._vm = this;
|
charset._vm = this;
|
||||||
cost._vm = this;
|
cost._vm = this;
|
||||||
|
gdi._vm = this;
|
||||||
|
|
||||||
_fileHandle = NULL;
|
_fileHandle = NULL;
|
||||||
|
|
||||||
|
@ -278,8 +283,8 @@ void Scumm::scummMain(int argc, char **argv) {
|
||||||
|
|
||||||
do {
|
do {
|
||||||
if (_playBackFile) {
|
if (_playBackFile) {
|
||||||
while ((_scummTimer>>2) < _vars[VAR_PLAYBACKTIMER]) {}
|
while ((_scummTimer>>2) < _vars[VAR_TIMER_NEXT]) {}
|
||||||
_scummTimer = _vars[VAR_PLAYBACKTIMER] << 2;
|
_scummTimer = _vars[VAR_TIMER_NEXT] << 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
CHECK_HEAP
|
CHECK_HEAP
|
||||||
|
@ -323,18 +328,24 @@ void Scumm::scummMain(int argc, char **argv) {
|
||||||
|
|
||||||
if (_saveLoadFlag) {
|
if (_saveLoadFlag) {
|
||||||
char buf[256];
|
char buf[256];
|
||||||
|
|
||||||
sprintf(buf, "savegame.%d", _saveLoadSlot);
|
sprintf(buf, "savegame.%d", _saveLoadSlot);
|
||||||
if (_saveLoadFlag==1) {
|
if (_saveLoadFlag==1) {
|
||||||
saveState(buf);
|
saveState(buf);
|
||||||
|
if (_saveLoadCompatible)
|
||||||
|
_vars[VAR_GAME_LOADED] = 201;
|
||||||
} else {
|
} else {
|
||||||
loadState(buf);
|
loadState(buf);
|
||||||
|
if (_saveLoadCompatible) {
|
||||||
|
_vars[VAR_GAME_LOADED] = 203;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
_saveLoadFlag = 0;
|
_saveLoadFlag = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_completeScreenRedraw) {
|
if (_completeScreenRedraw) {
|
||||||
_completeScreenRedraw = 0;
|
_completeScreenRedraw = 0;
|
||||||
clearUpperMask();
|
gdi.clearUpperMask();
|
||||||
charset._hasMask = false;
|
charset._hasMask = false;
|
||||||
redrawVerbs();
|
redrawVerbs();
|
||||||
_fullRedraw = 1;
|
_fullRedraw = 1;
|
||||||
|
@ -347,7 +358,7 @@ void Scumm::scummMain(int argc, char **argv) {
|
||||||
checkAndRunVar33();
|
checkAndRunVar33();
|
||||||
|
|
||||||
if (_currentRoom==0) {
|
if (_currentRoom==0) {
|
||||||
gdi.unk4 = 0;
|
gdi._unk4 = 0;
|
||||||
CHARSET_1();
|
CHARSET_1();
|
||||||
unkVirtScreen2();
|
unkVirtScreen2();
|
||||||
unkSoundProc22();
|
unkSoundProc22();
|
||||||
|
@ -366,7 +377,7 @@ void Scumm::scummMain(int argc, char **argv) {
|
||||||
setActorRedrawFlags();
|
setActorRedrawFlags();
|
||||||
resetActorBgs();
|
resetActorBgs();
|
||||||
|
|
||||||
if (!(_vars[VAR_DRAWFLAGS]&2) && _vars[VAR_DRAWFLAGS]&4) {
|
if (!(_vars[VAR_V5_DRAWFLAGS]&2) && _vars[VAR_V5_DRAWFLAGS]&4) {
|
||||||
error("Flashlight not implemented in this version");
|
error("Flashlight not implemented in this version");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -375,8 +386,8 @@ void Scumm::scummMain(int argc, char **argv) {
|
||||||
cyclePalette();
|
cyclePalette();
|
||||||
palManipulate();
|
palManipulate();
|
||||||
|
|
||||||
if (doEffect) {
|
if (_doEffect) {
|
||||||
doEffect = false;
|
_doEffect = false;
|
||||||
screenEffect(_newEffect);
|
screenEffect(_newEffect);
|
||||||
clearClickedStatus();
|
clearClickedStatus();
|
||||||
}
|
}
|
||||||
|
@ -385,7 +396,7 @@ void Scumm::scummMain(int argc, char **argv) {
|
||||||
verbMouseOver(checkMouseOver(mouse.x, mouse.y));
|
verbMouseOver(checkMouseOver(mouse.x, mouse.y));
|
||||||
}
|
}
|
||||||
|
|
||||||
gdi.unk4 = _cursorState > 0;
|
gdi._unk4 = _cursorState > 0;
|
||||||
|
|
||||||
unkVirtScreen2();
|
unkVirtScreen2();
|
||||||
|
|
||||||
|
@ -548,7 +559,12 @@ void Scumm::startScene(int room, Actor *a, int objectNr) {
|
||||||
|
|
||||||
camera._mode = 1;
|
camera._mode = 1;
|
||||||
camera._curPos = camera._destPos = 160;
|
camera._curPos = camera._destPos = 160;
|
||||||
|
|
||||||
|
if (_majorScummVersion==6) {
|
||||||
|
_vars[VAR_V6_SCREEN_WIDTH] = _scrWidthIn8Unit<<3;
|
||||||
|
_vars[VAR_V6_SCREEN_HEIGHT] = _scrHeight;
|
||||||
|
}
|
||||||
|
|
||||||
if (_roomResource == 0)
|
if (_roomResource == 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -568,17 +584,16 @@ void Scumm::startScene(int room, Actor *a, int objectNr) {
|
||||||
}
|
}
|
||||||
|
|
||||||
showActors();
|
showActors();
|
||||||
dseg_3A76 = 0;
|
|
||||||
|
_egoPositioned = false;
|
||||||
runEntryScript();
|
runEntryScript();
|
||||||
|
if (a && !_egoPositioned) {
|
||||||
|
|
||||||
if (a && dseg_3A76==0) {
|
|
||||||
getObjectXYPos(objectNr);
|
getObjectXYPos(objectNr);
|
||||||
putActor(a, _xPos, _yPos, _currentRoom);
|
putActor(a, _xPos, _yPos, _currentRoom);
|
||||||
a->moving = 0;
|
a->moving = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
doEffect = true;
|
_doEffect = true;
|
||||||
|
|
||||||
CHECK_HEAP
|
CHECK_HEAP
|
||||||
}
|
}
|
||||||
|
@ -601,14 +616,14 @@ void Scumm::initRoomSubBlocks() {
|
||||||
|
|
||||||
roomptr = getResourceAddress(1, _roomResource);
|
roomptr = getResourceAddress(1, _roomResource);
|
||||||
|
|
||||||
ptr = findResource(MKID('RMHD'), roomptr);
|
ptr = findResource(MKID('RMHD'), roomptr, 0);
|
||||||
_scrWidthIn8Unit = READ_LE_UINT16(&((RoomHeader*)ptr)->width) >> 3;
|
_scrWidthIn8Unit = READ_LE_UINT16(&((RoomHeader*)ptr)->width) >> 3;
|
||||||
_scrHeight = READ_LE_UINT16(&((RoomHeader*)ptr)->height);
|
_scrHeight = READ_LE_UINT16(&((RoomHeader*)ptr)->height);
|
||||||
|
|
||||||
_IM00_offs = findResource(MKID('IM00'), findResource(MKID('RMIM'), roomptr)) -
|
_IM00_offs = findResource(MKID('IM00'), findResource(MKID('RMIM'), roomptr, 0), 0) -
|
||||||
roomptr;
|
roomptr;
|
||||||
|
|
||||||
ptr = findResource(MKID('EXCD'), roomptr);
|
ptr = findResource(MKID('EXCD'), roomptr, 0);
|
||||||
if (ptr) {
|
if (ptr) {
|
||||||
_EXCD_offs = ptr - roomptr;
|
_EXCD_offs = ptr - roomptr;
|
||||||
#ifdef DUMP_SCRIPTS
|
#ifdef DUMP_SCRIPTS
|
||||||
|
@ -616,7 +631,7 @@ void Scumm::initRoomSubBlocks() {
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
ptr = findResource(MKID('ENCD'), roomptr);
|
ptr = findResource(MKID('ENCD'), roomptr, 0);
|
||||||
if (ptr) {
|
if (ptr) {
|
||||||
_ENCD_offs = ptr - roomptr;
|
_ENCD_offs = ptr - roomptr;
|
||||||
#ifdef DUMP_SCRIPTS
|
#ifdef DUMP_SCRIPTS
|
||||||
|
@ -624,25 +639,25 @@ void Scumm::initRoomSubBlocks() {
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
ptr = findResource(MKID('BOXD'), roomptr);
|
ptr = findResource(MKID('BOXD'), roomptr, 0);
|
||||||
if (ptr) {
|
if (ptr) {
|
||||||
int size = READ_BE_UINT32_UNALIGNED(ptr+4);
|
int size = READ_BE_UINT32_UNALIGNED(ptr+4);
|
||||||
createResource(14, 2, size);
|
createResource(14, 2, size);
|
||||||
roomptr = getResourceAddress(1, _roomResource);
|
roomptr = getResourceAddress(1, _roomResource);
|
||||||
ptr = findResource(MKID('BOXD'), roomptr);
|
ptr = findResource(MKID('BOXD'), roomptr, 0);
|
||||||
memcpy(getResourceAddress(0xE, 2), ptr, size);
|
memcpy(getResourceAddress(0xE, 2), ptr, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
ptr = findResource(MKID('BOXM'), roomptr);
|
ptr = findResource(MKID('BOXM'), roomptr, 0);
|
||||||
if (ptr) {
|
if (ptr) {
|
||||||
int size = READ_BE_UINT32_UNALIGNED(ptr+4);
|
int size = READ_BE_UINT32_UNALIGNED(ptr+4);
|
||||||
createResource(14, 1, size);
|
createResource(14, 1, size);
|
||||||
roomptr = getResourceAddress(1, _roomResource);
|
roomptr = getResourceAddress(1, _roomResource);
|
||||||
ptr = findResource(MKID('BOXM'), roomptr);
|
ptr = findResource(MKID('BOXM'), roomptr, 0);
|
||||||
memcpy(getResourceAddress(0xE, 1), ptr, size);
|
memcpy(getResourceAddress(0xE, 1), ptr, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
ptr = findResource(MKID('SCAL'), roomptr);
|
ptr = findResource(MKID('SCAL'), roomptr, 0);
|
||||||
if (ptr) {
|
if (ptr) {
|
||||||
offs = ptr - roomptr;
|
offs = ptr - roomptr;
|
||||||
for (i=1; i<_maxScaleTable; i++, offs+=8) {
|
for (i=1; i<_maxScaleTable; i++, offs+=8) {
|
||||||
|
@ -659,10 +674,8 @@ void Scumm::initRoomSubBlocks() {
|
||||||
memset(_localScriptList, 0, (0x100 - _numGlobalScripts) * 4);
|
memset(_localScriptList, 0, (0x100 - _numGlobalScripts) * 4);
|
||||||
|
|
||||||
roomptr = getResourceAddress(1, _roomResource);
|
roomptr = getResourceAddress(1, _roomResource);
|
||||||
ptr = findResource(MKID('LSCR'), roomptr);
|
for (i=0; ptr = findResource(MKID('LSCR'), roomptr, i++) ;) {
|
||||||
while (ptr) {
|
|
||||||
_localScriptList[ptr[8] - _numGlobalScripts] = ptr - roomptr;
|
_localScriptList[ptr[8] - _numGlobalScripts] = ptr - roomptr;
|
||||||
|
|
||||||
#ifdef DUMP_SCRIPTS
|
#ifdef DUMP_SCRIPTS
|
||||||
do {
|
do {
|
||||||
char buf[32];
|
char buf[32];
|
||||||
|
@ -670,35 +683,34 @@ void Scumm::initRoomSubBlocks() {
|
||||||
dumpResource(buf, ptr[8], ptr);
|
dumpResource(buf, ptr[8], ptr);
|
||||||
} while (0);
|
} while (0);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
ptr = findResource(MKID('LSCR'), NULL);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
ptr = findResource(MKID('EPAL'), roomptr);
|
ptr = findResource(MKID('EPAL'), roomptr, 0);
|
||||||
if (ptr)
|
if (ptr)
|
||||||
_EPAL_offs = ptr - roomptr;
|
_EPAL_offs = ptr - roomptr;
|
||||||
|
|
||||||
ptr = findResource(MKID('CLUT'), roomptr);
|
ptr = findResource(MKID('CLUT'), roomptr, 0);
|
||||||
if (ptr) {
|
if (ptr) {
|
||||||
_CLUT_offs = ptr - roomptr;
|
_CLUT_offs = ptr - roomptr;
|
||||||
setPaletteFromRes();
|
setPaletteFromRes();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_majorScummVersion==6) {
|
if (_majorScummVersion==6) {
|
||||||
ptr = findResource(MKID('PALS'), roomptr);
|
ptr = findResource(MKID('PALS'), roomptr, 0);
|
||||||
if (ptr) {
|
if (ptr) {
|
||||||
_PALS_offs = ptr - roomptr;
|
_PALS_offs = ptr - roomptr;
|
||||||
setPalette(0);
|
setPalette(0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
initCycl(findResource(MKID('CYCL'), roomptr) + 8);
|
initCycl(findResource(MKID('CYCL'), roomptr, 0) + 8);
|
||||||
|
|
||||||
ptr = findResource(MKID('TRNS'), roomptr);
|
ptr = findResource(MKID('TRNS'), roomptr, 0);
|
||||||
if (ptr)
|
if (ptr)
|
||||||
gdi.transparency = ptr[8];
|
gdi._transparency = ptr[8];
|
||||||
else
|
else
|
||||||
gdi.transparency = 255;
|
gdi._transparency = 255;
|
||||||
|
|
||||||
initBGBuffers();
|
initBGBuffers();
|
||||||
}
|
}
|
||||||
|
@ -764,64 +776,12 @@ void Scumm::unkRoomFunc3(int a, int b, int c, int d, int e) {
|
||||||
warning("stub unkRoomFunc3(%d,%d,%d,%d,%d)",a,b,c,d,e);
|
warning("stub unkRoomFunc3(%d,%d,%d,%d,%d)",a,b,c,d,e);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Scumm::unkRoomFunc2(int a, int b, int c, int d, int e) {
|
|
||||||
byte *cptr, *cur;
|
|
||||||
int num;
|
|
||||||
byte color;
|
|
||||||
|
|
||||||
if (_videoMode==0xE) {
|
|
||||||
warning("stub unkRoomFunc2(%d,%d,%d,%d,%d)",a,b,c,d,e);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (_videoMode==0x13) {
|
|
||||||
cptr = getResourceAddress(1, _roomResource);
|
|
||||||
if (_CLUT_offs) {
|
|
||||||
cptr += _CLUT_offs;
|
|
||||||
} else {
|
|
||||||
cptr = findPalInPals(cptr + _PALS_offs, _curPalIndex);
|
|
||||||
}
|
|
||||||
cptr += 8 + a*3;
|
|
||||||
cur = _currentPalette + a*3;
|
|
||||||
if (a <= b) {
|
|
||||||
num = b - a + 1;
|
|
||||||
|
|
||||||
do {
|
|
||||||
if (c != 0xFF) {
|
|
||||||
color = *cptr++ * (c>>2) / 0xFF;
|
|
||||||
} else {
|
|
||||||
color = *cptr++ >> 2;
|
|
||||||
}
|
|
||||||
if(color>63) color = 63;
|
|
||||||
*cur++=color;
|
|
||||||
|
|
||||||
if (d != 0xFF) {
|
|
||||||
color = *cptr++ * (d>>2) / 0xFF;
|
|
||||||
} else {
|
|
||||||
color = *cptr++ >> 2;
|
|
||||||
}
|
|
||||||
if(color>63) color = 63;
|
|
||||||
*cur++=color;
|
|
||||||
|
|
||||||
if (e != 0xFF) {
|
|
||||||
color = *cptr++ * (e>>2) / 0xFF;
|
|
||||||
} else {
|
|
||||||
color = *cptr++ >> 2;
|
|
||||||
}
|
|
||||||
if(color>63) color = 63;
|
|
||||||
*cur++=color;
|
|
||||||
} while (--num);
|
|
||||||
}
|
|
||||||
setDirtyColors(a,b);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void Scumm::unkRoomFunc4(int a, int b, int c, int d, int e) {
|
void Scumm::unkRoomFunc4(int a, int b, int c, int d, int e) {
|
||||||
/* TODO: implement this */
|
/* TODO: implement this */
|
||||||
warning("unkRoomFunc4: not implemented");
|
warning("unkRoomFunc4: not implemented");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Scumm::pauseGame(int i) {
|
void Scumm::pauseGame(int i) {
|
||||||
/* TODO: implement this */
|
/* TODO: implement this */
|
||||||
warning("pauseGame: not implemented");
|
warning("pauseGame: not implemented");
|
||||||
|
@ -924,7 +884,7 @@ Actor *Scumm::derefActorSafe(int id, const char *errmsg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Scumm::new_unk_1(int a) {
|
void Scumm::new_unk_1(int a) {
|
||||||
error("stub new_unk_1(%d)", a);
|
warning("stub new_unk_1(%d)", a);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Scumm::setCursorHotspot2(int x,int y) {
|
void Scumm::setCursorHotspot2(int x,int y) {
|
||||||
|
@ -932,29 +892,15 @@ void Scumm::setCursorHotspot2(int x,int y) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Scumm::setStringVars(int slot) {
|
void Scumm::setStringVars(int slot) {
|
||||||
string[slot].xpos = string[slot].t_xpos;
|
StringTab *st = &string[slot];
|
||||||
string[slot].ypos = string[slot].t_ypos;
|
st->xpos = st->t_xpos;
|
||||||
string[slot].center = string[slot].t_center;
|
st->ypos = st->t_ypos;
|
||||||
string[slot].overhead = string[slot].t_overhead;
|
st->center = st->t_center;
|
||||||
string[slot].new_3 = string[slot].t_new3;
|
st->overhead = st->t_overhead;
|
||||||
string[slot].right = string[slot].t_right;
|
st->new_3 = st->t_new3;
|
||||||
string[slot].color = string[slot].t_color;
|
st->right = st->t_right;
|
||||||
string[slot].charset = string[slot].t_charset;
|
st->color = st->t_color;
|
||||||
}
|
st->charset = st->t_charset;
|
||||||
|
|
||||||
void Scumm::arrayop_1(int a, byte *ptr) {
|
|
||||||
ArrayHeader *ah;
|
|
||||||
int r;
|
|
||||||
int len = getStringLen(ptr);
|
|
||||||
|
|
||||||
r = defineArray(a, 4, 0, len);
|
|
||||||
ah = (ArrayHeader*)getResourceAddress(7,r);
|
|
||||||
copyString(ah->data,ptr,len);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void Scumm::unkMiscOp4(int a, int b, int c, int d) {
|
|
||||||
warning("stub unkMiscOp4(%d,%d,%d,%d)", a,b,c,d);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Scumm::unkMiscOp9() {
|
void Scumm::unkMiscOp9() {
|
||||||
|
|
158
scummvm.dsp
158
scummvm.dsp
|
@ -42,7 +42,7 @@ RSC=rc.exe
|
||||||
# PROP Ignore_Export_Lib 0
|
# PROP Ignore_Export_Lib 0
|
||||||
# PROP Target_Dir ""
|
# PROP Target_Dir ""
|
||||||
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /Yu"stdafx.h" /FD /c
|
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /Yu"stdafx.h" /FD /c
|
||||||
# ADD CPP /nologo /Zp4 /W3 /GX /O1 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /Yu"stdafx.h" /FD /c
|
# ADD CPP /nologo /Zp4 /MD /W3 /GX /O1 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /Yu"stdafx.h" /FD /c
|
||||||
# ADD BASE RSC /l 0x41d /d "NDEBUG"
|
# ADD BASE RSC /l 0x41d /d "NDEBUG"
|
||||||
# ADD RSC /l 0x41d /d "NDEBUG"
|
# ADD RSC /l 0x41d /d "NDEBUG"
|
||||||
BSC32=bscmake.exe
|
BSC32=bscmake.exe
|
||||||
|
@ -66,7 +66,7 @@ LINK32=link.exe
|
||||||
# PROP Ignore_Export_Lib 0
|
# PROP Ignore_Export_Lib 0
|
||||||
# PROP Target_Dir ""
|
# PROP Target_Dir ""
|
||||||
# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /Yu"stdafx.h" /FD /GZ /c
|
# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /Yu"stdafx.h" /FD /GZ /c
|
||||||
# ADD CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "CHECK_HEAP" /Yu"stdafx.h" /FD /GZ /c
|
# ADD CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "DUMP_SCRIPTS" /Yu"stdafx.h" /FD /GZ /c
|
||||||
# SUBTRACT CPP /Fr
|
# SUBTRACT CPP /Fr
|
||||||
# ADD BASE RSC /l 0x41d /d "_DEBUG"
|
# ADD BASE RSC /l 0x41d /d "_DEBUG"
|
||||||
# ADD RSC /l 0x41d /d "_DEBUG"
|
# ADD RSC /l 0x41d /d "_DEBUG"
|
||||||
|
@ -89,71 +89,225 @@ LINK32=link.exe
|
||||||
# Begin Source File
|
# Begin Source File
|
||||||
|
|
||||||
SOURCE=.\actor.cpp
|
SOURCE=.\actor.cpp
|
||||||
|
|
||||||
|
!IF "$(CFG)" == "scummvm - Win32 Release"
|
||||||
|
|
||||||
|
# ADD CPP /Gd
|
||||||
|
|
||||||
|
!ELSEIF "$(CFG)" == "scummvm - Win32 Debug"
|
||||||
|
|
||||||
|
!ENDIF
|
||||||
|
|
||||||
# End Source File
|
# End Source File
|
||||||
# Begin Source File
|
# Begin Source File
|
||||||
|
|
||||||
SOURCE=.\boxes.cpp
|
SOURCE=.\boxes.cpp
|
||||||
|
|
||||||
|
!IF "$(CFG)" == "scummvm - Win32 Release"
|
||||||
|
|
||||||
|
# ADD CPP /Gd
|
||||||
|
|
||||||
|
!ELSEIF "$(CFG)" == "scummvm - Win32 Debug"
|
||||||
|
|
||||||
|
!ENDIF
|
||||||
|
|
||||||
# End Source File
|
# End Source File
|
||||||
# Begin Source File
|
# Begin Source File
|
||||||
|
|
||||||
SOURCE=.\costume.cpp
|
SOURCE=.\costume.cpp
|
||||||
|
|
||||||
|
!IF "$(CFG)" == "scummvm - Win32 Release"
|
||||||
|
|
||||||
|
# ADD CPP /Gd
|
||||||
|
|
||||||
|
!ELSEIF "$(CFG)" == "scummvm - Win32 Debug"
|
||||||
|
|
||||||
|
!ENDIF
|
||||||
|
|
||||||
# End Source File
|
# End Source File
|
||||||
# Begin Source File
|
# Begin Source File
|
||||||
|
|
||||||
SOURCE=.\debug.cpp
|
SOURCE=.\debug.cpp
|
||||||
|
|
||||||
|
!IF "$(CFG)" == "scummvm - Win32 Release"
|
||||||
|
|
||||||
|
# ADD CPP /Gd
|
||||||
|
|
||||||
|
!ELSEIF "$(CFG)" == "scummvm - Win32 Debug"
|
||||||
|
|
||||||
|
!ENDIF
|
||||||
|
|
||||||
# End Source File
|
# End Source File
|
||||||
# Begin Source File
|
# Begin Source File
|
||||||
|
|
||||||
SOURCE=.\gfx.cpp
|
SOURCE=.\gfx.cpp
|
||||||
|
|
||||||
|
!IF "$(CFG)" == "scummvm - Win32 Release"
|
||||||
|
|
||||||
|
# ADD CPP /Gd
|
||||||
|
|
||||||
|
!ELSEIF "$(CFG)" == "scummvm - Win32 Debug"
|
||||||
|
|
||||||
|
!ENDIF
|
||||||
|
|
||||||
# End Source File
|
# End Source File
|
||||||
# Begin Source File
|
# Begin Source File
|
||||||
|
|
||||||
SOURCE=.\object.cpp
|
SOURCE=.\object.cpp
|
||||||
|
|
||||||
|
!IF "$(CFG)" == "scummvm - Win32 Release"
|
||||||
|
|
||||||
|
# ADD CPP /Gd
|
||||||
|
|
||||||
|
!ELSEIF "$(CFG)" == "scummvm - Win32 Debug"
|
||||||
|
|
||||||
|
!ENDIF
|
||||||
|
|
||||||
# End Source File
|
# End Source File
|
||||||
# Begin Source File
|
# Begin Source File
|
||||||
|
|
||||||
SOURCE=.\resource.cpp
|
SOURCE=.\resource.cpp
|
||||||
|
|
||||||
|
!IF "$(CFG)" == "scummvm - Win32 Release"
|
||||||
|
|
||||||
|
# ADD CPP /Gd
|
||||||
|
|
||||||
|
!ELSEIF "$(CFG)" == "scummvm - Win32 Debug"
|
||||||
|
|
||||||
|
!ENDIF
|
||||||
|
|
||||||
# End Source File
|
# End Source File
|
||||||
# Begin Source File
|
# Begin Source File
|
||||||
|
|
||||||
SOURCE=.\saveload.cpp
|
SOURCE=.\saveload.cpp
|
||||||
|
|
||||||
|
!IF "$(CFG)" == "scummvm - Win32 Release"
|
||||||
|
|
||||||
|
# ADD CPP /Gd
|
||||||
|
|
||||||
|
!ELSEIF "$(CFG)" == "scummvm - Win32 Debug"
|
||||||
|
|
||||||
|
!ENDIF
|
||||||
|
|
||||||
# End Source File
|
# End Source File
|
||||||
# Begin Source File
|
# Begin Source File
|
||||||
|
|
||||||
SOURCE=.\script.cpp
|
SOURCE=.\script.cpp
|
||||||
|
|
||||||
|
!IF "$(CFG)" == "scummvm - Win32 Release"
|
||||||
|
|
||||||
|
# ADD CPP /Gd
|
||||||
|
|
||||||
|
!ELSEIF "$(CFG)" == "scummvm - Win32 Debug"
|
||||||
|
|
||||||
|
!ENDIF
|
||||||
|
|
||||||
# End Source File
|
# End Source File
|
||||||
# Begin Source File
|
# Begin Source File
|
||||||
|
|
||||||
SOURCE=.\script_v1.cpp
|
SOURCE=.\script_v1.cpp
|
||||||
|
|
||||||
|
!IF "$(CFG)" == "scummvm - Win32 Release"
|
||||||
|
|
||||||
|
# ADD CPP /Gd
|
||||||
|
|
||||||
|
!ELSEIF "$(CFG)" == "scummvm - Win32 Debug"
|
||||||
|
|
||||||
|
!ENDIF
|
||||||
|
|
||||||
# End Source File
|
# End Source File
|
||||||
# Begin Source File
|
# Begin Source File
|
||||||
|
|
||||||
SOURCE=.\script_v2.cpp
|
SOURCE=.\script_v2.cpp
|
||||||
|
|
||||||
|
!IF "$(CFG)" == "scummvm - Win32 Release"
|
||||||
|
|
||||||
|
# ADD CPP /Gd
|
||||||
|
|
||||||
|
!ELSEIF "$(CFG)" == "scummvm - Win32 Debug"
|
||||||
|
|
||||||
|
!ENDIF
|
||||||
|
|
||||||
# End Source File
|
# End Source File
|
||||||
# Begin Source File
|
# Begin Source File
|
||||||
|
|
||||||
SOURCE=.\scummvm.cpp
|
SOURCE=.\scummvm.cpp
|
||||||
|
|
||||||
|
!IF "$(CFG)" == "scummvm - Win32 Release"
|
||||||
|
|
||||||
|
# ADD CPP /Gd
|
||||||
|
|
||||||
|
!ELSEIF "$(CFG)" == "scummvm - Win32 Debug"
|
||||||
|
|
||||||
|
!ENDIF
|
||||||
|
|
||||||
# End Source File
|
# End Source File
|
||||||
# Begin Source File
|
# Begin Source File
|
||||||
|
|
||||||
SOURCE=.\sound.cpp
|
SOURCE=.\sound.cpp
|
||||||
|
|
||||||
|
!IF "$(CFG)" == "scummvm - Win32 Release"
|
||||||
|
|
||||||
|
# ADD CPP /Gd
|
||||||
|
|
||||||
|
!ELSEIF "$(CFG)" == "scummvm - Win32 Debug"
|
||||||
|
|
||||||
|
!ENDIF
|
||||||
|
|
||||||
# End Source File
|
# End Source File
|
||||||
# Begin Source File
|
# Begin Source File
|
||||||
|
|
||||||
SOURCE=.\StdAfx.cpp
|
SOURCE=.\StdAfx.cpp
|
||||||
|
|
||||||
|
!IF "$(CFG)" == "scummvm - Win32 Release"
|
||||||
|
|
||||||
|
# ADD CPP /Gd /Yc"stdafx.h"
|
||||||
|
|
||||||
|
!ELSEIF "$(CFG)" == "scummvm - Win32 Debug"
|
||||||
|
|
||||||
# ADD CPP /Yc"stdafx.h"
|
# ADD CPP /Yc"stdafx.h"
|
||||||
|
|
||||||
|
!ENDIF
|
||||||
|
|
||||||
# End Source File
|
# End Source File
|
||||||
# Begin Source File
|
# Begin Source File
|
||||||
|
|
||||||
SOURCE=.\string.cpp
|
SOURCE=.\string.cpp
|
||||||
|
|
||||||
|
!IF "$(CFG)" == "scummvm - Win32 Release"
|
||||||
|
|
||||||
|
# ADD CPP /Gd
|
||||||
|
|
||||||
|
!ELSEIF "$(CFG)" == "scummvm - Win32 Debug"
|
||||||
|
|
||||||
|
!ENDIF
|
||||||
|
|
||||||
# End Source File
|
# End Source File
|
||||||
# Begin Source File
|
# Begin Source File
|
||||||
|
|
||||||
SOURCE=.\sys.cpp
|
SOURCE=.\sys.cpp
|
||||||
|
|
||||||
|
!IF "$(CFG)" == "scummvm - Win32 Release"
|
||||||
|
|
||||||
|
# ADD CPP /Gd
|
||||||
|
|
||||||
|
!ELSEIF "$(CFG)" == "scummvm - Win32 Debug"
|
||||||
|
|
||||||
|
!ENDIF
|
||||||
|
|
||||||
# End Source File
|
# End Source File
|
||||||
# Begin Source File
|
# Begin Source File
|
||||||
|
|
||||||
SOURCE=.\verbs.cpp
|
SOURCE=.\verbs.cpp
|
||||||
|
|
||||||
|
!IF "$(CFG)" == "scummvm - Win32 Release"
|
||||||
|
|
||||||
|
# ADD CPP /Gd
|
||||||
|
|
||||||
|
!ELSEIF "$(CFG)" == "scummvm - Win32 Debug"
|
||||||
|
|
||||||
|
!ENDIF
|
||||||
|
|
||||||
# End Source File
|
# End Source File
|
||||||
# Begin Source File
|
# Begin Source File
|
||||||
|
|
||||||
|
|
6
sdl.cpp
6
sdl.cpp
|
@ -17,6 +17,9 @@
|
||||||
*
|
*
|
||||||
* Change Log:
|
* Change Log:
|
||||||
* $Log$
|
* $Log$
|
||||||
|
* Revision 1.12 2001/10/26 17:34:50 strigeus
|
||||||
|
* bug fixes, code cleanup
|
||||||
|
*
|
||||||
* Revision 1.11 2001/10/23 19:51:50 strigeus
|
* Revision 1.11 2001/10/23 19:51:50 strigeus
|
||||||
* recompile not needed when switching games
|
* recompile not needed when switching games
|
||||||
* debugger skeleton implemented
|
* debugger skeleton implemented
|
||||||
|
@ -102,6 +105,7 @@ void waitForTimer(Scumm *s) {
|
||||||
s->_saveLoadFlag = 1;
|
s->_saveLoadFlag = 1;
|
||||||
else if (event.key.keysym.mod&KMOD_CTRL)
|
else if (event.key.keysym.mod&KMOD_CTRL)
|
||||||
s->_saveLoadFlag = 2;
|
s->_saveLoadFlag = 2;
|
||||||
|
s->_saveLoadCompatible = false;
|
||||||
}
|
}
|
||||||
if (event.key.keysym.sym=='z' && event.key.keysym.mod&KMOD_CTRL) {
|
if (event.key.keysym.sym=='z' && event.key.keysym.mod&KMOD_CTRL) {
|
||||||
exit(1);
|
exit(1);
|
||||||
|
@ -328,7 +332,7 @@ void initGraphics(Scumm *s) {
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Clean up on exit */
|
/* Clean up on exit */
|
||||||
atexit(SDL_Quit);
|
atexit(SDL_Quit);
|
||||||
|
|
||||||
char buf[512], *gameName;
|
char buf[512], *gameName;
|
||||||
|
|
||||||
|
|
85
string.cpp
85
string.cpp
|
@ -17,6 +17,9 @@
|
||||||
*
|
*
|
||||||
* Change Log:
|
* Change Log:
|
||||||
* $Log$
|
* $Log$
|
||||||
|
* Revision 1.5 2001/10/26 17:34:50 strigeus
|
||||||
|
* bug fixes, code cleanup
|
||||||
|
*
|
||||||
* Revision 1.4 2001/10/24 20:12:52 strigeus
|
* Revision 1.4 2001/10/24 20:12:52 strigeus
|
||||||
* fixed some bugs related to string handling
|
* fixed some bugs related to string handling
|
||||||
*
|
*
|
||||||
|
@ -160,6 +163,8 @@ void Scumm::unkMessage1() {
|
||||||
byte buf[100];
|
byte buf[100];
|
||||||
_msgPtrToAdd = buf;
|
_msgPtrToAdd = buf;
|
||||||
_messagePtr = addMessageToStack(_messagePtr);
|
_messagePtr = addMessageToStack(_messagePtr);
|
||||||
|
|
||||||
|
// warning("unkMessage1(\"%s\")", buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Scumm::unkMessage2() {
|
void Scumm::unkMessage2() {
|
||||||
|
@ -171,7 +176,7 @@ void Scumm::unkMessage2() {
|
||||||
if (string[3].color==0)
|
if (string[3].color==0)
|
||||||
string[3].color = 4;
|
string[3].color = 4;
|
||||||
|
|
||||||
error("unkMessage2: call to printScummMessage(%s)", buf);
|
warning("unkMessage2(\"%s\")", buf);
|
||||||
_messagePtr = tmp;
|
_messagePtr = tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -193,11 +198,11 @@ void Scumm::CHARSET_1() {
|
||||||
if (_majorScummVersion==5) {
|
if (_majorScummVersion==5) {
|
||||||
string[0].xpos = a->x - camera._curPos + 160;
|
string[0].xpos = a->x - camera._curPos + 160;
|
||||||
|
|
||||||
if (_vars[VAR_TALK_STRING_Y] < 0) {
|
if (_vars[VAR_V5_TALK_STRING_Y] < 0) {
|
||||||
s = (a->scaley * (int)_vars[VAR_TALK_STRING_Y]) / 0xFF;
|
s = (a->scaley * (int)_vars[VAR_V5_TALK_STRING_Y]) / 0xFF;
|
||||||
string[0].ypos = ((_vars[VAR_TALK_STRING_Y]-s)>>1) + s - a->elevation + a->y;
|
string[0].ypos = ((_vars[VAR_V5_TALK_STRING_Y]-s)>>1) + s - a->elevation + a->y;
|
||||||
} else {
|
} else {
|
||||||
string[0].ypos = _vars[VAR_TALK_STRING_Y];
|
string[0].ypos = _vars[VAR_V5_TALK_STRING_Y];
|
||||||
}
|
}
|
||||||
if (string[0].ypos < 1)
|
if (string[0].ypos < 1)
|
||||||
string[0].ypos = 1;
|
string[0].ypos = 1;
|
||||||
|
@ -232,7 +237,7 @@ void Scumm::CHARSET_1() {
|
||||||
charset._center = string[0].center;
|
charset._center = string[0].center;
|
||||||
charset._right = string[0].right;
|
charset._right = string[0].right;
|
||||||
charset._color = _charsetColor;
|
charset._color = _charsetColor;
|
||||||
dseg_4E3C = 0;
|
_bkColor = 0;
|
||||||
|
|
||||||
for (i=0; i<4; i++)
|
for (i=0; i<4; i++)
|
||||||
charset._colorMap[i] = _charsetData[charset._curId][i];
|
charset._colorMap[i] = _charsetData[charset._curId][i];
|
||||||
|
@ -303,9 +308,14 @@ newLine:;
|
||||||
charset._left = string[0].xpos2;
|
charset._left = string[0].xpos2;
|
||||||
charset._top = string[0].ypos2;
|
charset._top = string[0].ypos2;
|
||||||
|
|
||||||
if (!_vars[VAR_CHARFLAG]) {
|
if (_majorScummVersion==5) {
|
||||||
|
if (!_vars[VAR_V5_CHARFLAG]) {
|
||||||
|
charset.printChar(c);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
charset.printChar(c);
|
charset.printChar(c);
|
||||||
}
|
}
|
||||||
|
|
||||||
string[0].xpos2 = charset._left;
|
string[0].xpos2 = charset._left;
|
||||||
string[0].ypos2 = charset._top;
|
string[0].ypos2 = charset._top;
|
||||||
|
|
||||||
|
@ -366,6 +376,7 @@ void Scumm::drawString(int a) {
|
||||||
byte *charsetptr,*space;
|
byte *charsetptr,*space;
|
||||||
int i;
|
int i;
|
||||||
byte byte1, chr;
|
byte byte1, chr;
|
||||||
|
uint color;
|
||||||
|
|
||||||
_msgPtrToAdd = buf;
|
_msgPtrToAdd = buf;
|
||||||
_messagePtr = addMessageToStack(_messagePtr);
|
_messagePtr = addMessageToStack(_messagePtr);
|
||||||
|
@ -376,7 +387,7 @@ void Scumm::drawString(int a) {
|
||||||
charset._center = string[a].center;
|
charset._center = string[a].center;
|
||||||
charset._right = string[a].right;
|
charset._right = string[a].right;
|
||||||
charset._color = string[a].color;
|
charset._color = string[a].color;
|
||||||
dseg_4E3C = 0;
|
_bkColor = 0;
|
||||||
charset._unk12 = 1;
|
charset._unk12 = 1;
|
||||||
charset._disableOffsX = 1;
|
charset._disableOffsX = 1;
|
||||||
|
|
||||||
|
@ -420,6 +431,7 @@ void Scumm::drawString(int a) {
|
||||||
chr = buf[i++];
|
chr = buf[i++];
|
||||||
switch(chr) {
|
switch(chr) {
|
||||||
case 9:
|
case 9:
|
||||||
|
case 10: case 13: case 14:
|
||||||
i += 2;
|
i += 2;
|
||||||
break;
|
break;
|
||||||
case 1: case 8:
|
case 1: case 8:
|
||||||
|
@ -428,10 +440,22 @@ void Scumm::drawString(int a) {
|
||||||
} else {
|
} else {
|
||||||
charset._left = charset._left2;
|
charset._left = charset._left2;
|
||||||
}
|
}
|
||||||
charset._top += byte1;
|
charset._top += byte1;
|
||||||
|
break;
|
||||||
|
case 12:
|
||||||
|
color = buf[i] + (buf[i+1]<<8);
|
||||||
|
i+=2;
|
||||||
|
if (color==0xFF)
|
||||||
|
charset._color = string[a].color;
|
||||||
|
else
|
||||||
|
charset._color = color;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
if (a==1 && _majorScummVersion==6)
|
||||||
|
charset._blitAlso = true;
|
||||||
charset.printChar(chr);
|
charset.printChar(chr);
|
||||||
|
charset._blitAlso = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -603,11 +627,9 @@ void CharsetRenderer::printChar(int chr) {
|
||||||
VirtScreen *vs;
|
VirtScreen *vs;
|
||||||
|
|
||||||
_vm->checkRange(_vm->_maxCharsets-1, 1, _curId, "Printing with bad charset %d");
|
_vm->checkRange(_vm->_maxCharsets-1, 1, _curId, "Printing with bad charset %d");
|
||||||
if (_vm->findVirtScreen(_top)==-1)
|
if ((vs=_vm->findVirtScreen(_top)) == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
vs = &_vm->virtscr[_vm->gdi.virtScreen];
|
|
||||||
|
|
||||||
if (chr=='@')
|
if (chr=='@')
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -678,20 +700,34 @@ void CharsetRenderer::printChar(int chr) {
|
||||||
_strTop = _top;
|
_strTop = _top;
|
||||||
|
|
||||||
_drawTop = _top - vs->topline;
|
_drawTop = _top - vs->topline;
|
||||||
|
if (_drawTop<0) _drawTop = 0;
|
||||||
|
|
||||||
_bottom = _drawTop + _height + _offsY;
|
_bottom = _drawTop + _height + _offsY;
|
||||||
|
|
||||||
_vm->updateDirtyRect(_vm->gdi.virtScreen, _left, right, _drawTop, _bottom, 0);
|
_vm->updateDirtyRect(vs->number, _left, right, _drawTop, _bottom, 0);
|
||||||
|
|
||||||
if (_vm->gdi.virtScreen==0)
|
#if defined(OLD)
|
||||||
|
if (vs->number==0)
|
||||||
_hasMask = true;
|
_hasMask = true;
|
||||||
|
#else
|
||||||
|
if (vs->number!=0)
|
||||||
|
_blitAlso = false;
|
||||||
|
if (vs->number==0 && _blitAlso==0)
|
||||||
|
_hasMask = true;
|
||||||
|
#endif
|
||||||
|
|
||||||
_bg_ptr = _vm->getResourceAddress(0xA, _vm->gdi.virtScreen+1)
|
_bg_ptr2 = _backbuff_ptr = _vm->getResourceAddress(0xA, vs->number+1)
|
||||||
+ vs->xstart + _drawTop * 320 + _left;
|
|
||||||
|
|
||||||
_where_to_draw_ptr = _vm->getResourceAddress(0xA, _vm->gdi.virtScreen+5)
|
|
||||||
+ vs->xstart + _drawTop * 320 + _left;
|
+ vs->xstart + _drawTop * 320 + _left;
|
||||||
|
|
||||||
|
#if !defined(OLD)
|
||||||
|
if (_blitAlso) {
|
||||||
|
#else
|
||||||
|
if (1) {
|
||||||
|
#endif
|
||||||
|
_bg_ptr2 = _bgbak_ptr = _vm->getResourceAddress(0xA, vs->number+5)
|
||||||
|
+ vs->xstart + _drawTop * 320 + _left;
|
||||||
|
}
|
||||||
|
|
||||||
_mask_ptr = _vm->getResourceAddress(0xA, 9)
|
_mask_ptr = _vm->getResourceAddress(0xA, 9)
|
||||||
+ _drawTop * 40 + _left/8
|
+ _drawTop * 40 + _left/8
|
||||||
+ _vm->_screenStartStrip;
|
+ _vm->_screenStartStrip;
|
||||||
|
@ -702,7 +738,12 @@ void CharsetRenderer::printChar(int chr) {
|
||||||
_charPtr += 4;
|
_charPtr += 4;
|
||||||
|
|
||||||
drawBits();
|
drawBits();
|
||||||
|
|
||||||
|
#if !defined(OLD)
|
||||||
|
if (_blitAlso)
|
||||||
|
blit(_backbuff_ptr, _bgbak_ptr, _width, _height);
|
||||||
|
#endif
|
||||||
|
|
||||||
_left += _width;
|
_left += _width;
|
||||||
if (_left > _strRight)
|
if (_left > _strRight)
|
||||||
_strRight = _left;
|
_strRight = _left;
|
||||||
|
@ -722,12 +763,12 @@ void CharsetRenderer::drawBits() {
|
||||||
int color;
|
int color;
|
||||||
byte numbits,bits;
|
byte numbits,bits;
|
||||||
|
|
||||||
usemask = (_vm->gdi.virtScreen==0 && _ignoreCharsetMask==0);
|
usemask = (_vm->_curVirtScreen->number==0 && _ignoreCharsetMask==0);
|
||||||
|
|
||||||
bits = *_charPtr++;
|
bits = *_charPtr++;
|
||||||
numbits = 8;
|
numbits = 8;
|
||||||
|
|
||||||
dst = _bg_ptr;
|
dst = _bg_ptr2;
|
||||||
mask = _mask_ptr;
|
mask = _mask_ptr;
|
||||||
y = 0;
|
y = 0;
|
||||||
|
|
||||||
|
@ -754,7 +795,7 @@ void CharsetRenderer::drawBits() {
|
||||||
maskpos++;
|
maskpos++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
dst = (_bg_ptr += 320);
|
dst = (_bg_ptr2 += 320);
|
||||||
mask += 40;
|
mask += 40;
|
||||||
y++;
|
y++;
|
||||||
}
|
}
|
||||||
|
|
46
verbs.cpp
46
verbs.cpp
|
@ -17,6 +17,9 @@
|
||||||
*
|
*
|
||||||
* Change Log:
|
* Change Log:
|
||||||
* $Log$
|
* $Log$
|
||||||
|
* Revision 1.4 2001/10/26 17:34:50 strigeus
|
||||||
|
* bug fixes, code cleanup
|
||||||
|
*
|
||||||
* Revision 1.3 2001/10/16 10:01:48 strigeus
|
* Revision 1.3 2001/10/16 10:01:48 strigeus
|
||||||
* preliminary DOTT support
|
* preliminary DOTT support
|
||||||
*
|
*
|
||||||
|
@ -164,7 +167,7 @@ void Scumm::restoreVerbBG(int verb) {
|
||||||
vs = &_verbs[verb];
|
vs = &_verbs[verb];
|
||||||
|
|
||||||
if (vs->oldleft != -1) {
|
if (vs->oldleft != -1) {
|
||||||
dseg_4E3C = vs->bkcolor;
|
_bkColor = vs->bkcolor;
|
||||||
restoreBG(vs->oldleft, vs->oldtop, vs->oldright, vs->oldbottom);
|
restoreBG(vs->oldleft, vs->oldtop, vs->oldright, vs->oldbottom);
|
||||||
vs->oldleft = -1;
|
vs->oldleft = -1;
|
||||||
}
|
}
|
||||||
|
@ -177,17 +180,16 @@ void Scumm::drawVerbBitmap(int vrb, int x, int y) {
|
||||||
byte twobufs, *imptr;
|
byte twobufs, *imptr;
|
||||||
int ydiff, xstrip;
|
int ydiff, xstrip;
|
||||||
int imgw, imgh;
|
int imgw, imgh;
|
||||||
int i;
|
int i,tmp;
|
||||||
byte *IMHD_ptr;
|
byte *IMHD_ptr;
|
||||||
|
byte *obim;
|
||||||
|
|
||||||
if (findVirtScreen(y) == -1)
|
if ((vs=findVirtScreen(y)) == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
_lastXstart = virtscr[0].xstart;
|
_lastXstart = virtscr[0].xstart;
|
||||||
nozbufs = _numZBuffer;
|
|
||||||
_numZBuffer = 0;
|
gdi.disableZBuffer();
|
||||||
|
|
||||||
vs = &virtscr[gdi.virtScreen];
|
|
||||||
|
|
||||||
twobufs = vs->alloctwobuffers;
|
twobufs = vs->alloctwobuffers;
|
||||||
vs->alloctwobuffers = 0;
|
vs->alloctwobuffers = 0;
|
||||||
|
@ -195,22 +197,21 @@ void Scumm::drawVerbBitmap(int vrb, int x, int y) {
|
||||||
xstrip = x>>3;
|
xstrip = x>>3;
|
||||||
ydiff = y - vs->topline;
|
ydiff = y - vs->topline;
|
||||||
|
|
||||||
IMHD_ptr = findResource2(MKID('IMHD'), getResourceAddress(8, vrb));
|
|
||||||
|
obim = getResourceAddress(8, vrb);
|
||||||
|
IMHD_ptr = findResource(MKID('IMHD'), obim, 0);
|
||||||
|
|
||||||
imgw = READ_LE_UINT16(IMHD_ptr+0x14) >> 3;
|
imgw = READ_LE_UINT16(IMHD_ptr+0x14) >> 3;
|
||||||
imgh = READ_LE_UINT16(IMHD_ptr+0x16) >> 3;
|
imgh = READ_LE_UINT16(IMHD_ptr+0x16) >> 3;
|
||||||
|
|
||||||
imptr = findResource2(MKID('IM01'), NULL);
|
imptr = findResource(MKID('IM01'), obim, 0);
|
||||||
if (!imptr)
|
if (!imptr)
|
||||||
error("No image for verb %d", vrb);
|
error("No image for verb %d", vrb);
|
||||||
|
|
||||||
for (i=0; i<imgw; i++) {
|
for (i=0; i<imgw; i++) {
|
||||||
_drawBmpX = xstrip + i;
|
tmp = xstrip + i;
|
||||||
if (_drawBmpX < 40) {
|
if ((uint)tmp < 40)
|
||||||
_drawBmpY = ydiff;
|
gdi.drawBitmap(imptr, vs, tmp, ydiff, imgh<<3, i, 1, true);
|
||||||
gdi.numLinesToProcess = imgh<<3;
|
|
||||||
drawBmp(imptr, i, 1, 1, "Verb", READ_LE_UINT16(IMHD_ptr+8));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
vst = &_verbs[vrb];
|
vst = &_verbs[vrb];
|
||||||
|
@ -220,7 +221,8 @@ void Scumm::drawVerbBitmap(int vrb, int x, int y) {
|
||||||
vst->oldright = vst->right;
|
vst->oldright = vst->right;
|
||||||
vst->oldtop = vst->y;
|
vst->oldtop = vst->y;
|
||||||
vst->oldbottom = vst->bottom;
|
vst->oldbottom = vst->bottom;
|
||||||
_numZBuffer = nozbufs;
|
|
||||||
|
gdi.enableZBuffer();
|
||||||
|
|
||||||
vs->alloctwobuffers = twobufs;
|
vs->alloctwobuffers = twobufs;
|
||||||
}
|
}
|
||||||
|
@ -258,7 +260,7 @@ void Scumm::setVerbObject(int room, int object, int verb) {
|
||||||
int numobj, i;
|
int numobj, i;
|
||||||
byte *obimptr;
|
byte *obimptr;
|
||||||
uint32 imoffs,size;
|
uint32 imoffs,size;
|
||||||
byte *roomptr,*tmp_roomptr;
|
byte *roomptr;
|
||||||
ImageHeader *imhd;
|
ImageHeader *imhd;
|
||||||
RoomHeader *roomhdr;
|
RoomHeader *roomhdr;
|
||||||
|
|
||||||
|
@ -267,7 +269,7 @@ void Scumm::setVerbObject(int room, int object, int verb) {
|
||||||
|
|
||||||
ensureResourceLoaded(1,room);
|
ensureResourceLoaded(1,room);
|
||||||
roomptr = getResourceAddress(1, room);
|
roomptr = getResourceAddress(1, room);
|
||||||
roomhdr = (RoomHeader*)findResource(MKID('RMHD'), roomptr);
|
roomhdr = (RoomHeader*)findResource(MKID('RMHD'), roomptr, 0);
|
||||||
|
|
||||||
numobj = READ_LE_UINT16(&roomhdr->numObjects);
|
numobj = READ_LE_UINT16(&roomhdr->numObjects);
|
||||||
if (numobj==0)
|
if (numobj==0)
|
||||||
|
@ -275,12 +277,11 @@ void Scumm::setVerbObject(int room, int object, int verb) {
|
||||||
if (numobj > 200)
|
if (numobj > 200)
|
||||||
error("More (%d) than %d objects in room %d", numobj, 200, room);
|
error("More (%d) than %d objects in room %d", numobj, 200, room);
|
||||||
|
|
||||||
tmp_roomptr = roomptr;
|
for (i=0; i<numobj; i++) {
|
||||||
for (i=1; i<=numobj; i++) {
|
obimptr = findResource(MKID('OBIM'), roomptr, i);
|
||||||
obimptr = findResource(MKID('OBIM'), tmp_roomptr);
|
|
||||||
if (obimptr==NULL)
|
if (obimptr==NULL)
|
||||||
error("Not enough image blocks in room %d", room);
|
error("Not enough image blocks in room %d", room);
|
||||||
imhd = (ImageHeader*)findResource2(MKID('IMHD'), obimptr);
|
imhd = (ImageHeader*)findResource(MKID('IMHD'), obimptr, 0);
|
||||||
if ( READ_LE_UINT16(&imhd->obj_id) == object) {
|
if ( READ_LE_UINT16(&imhd->obj_id) == object) {
|
||||||
imoffs = obimptr - roomptr;
|
imoffs = obimptr - roomptr;
|
||||||
size = READ_BE_UINT32_UNALIGNED(obimptr+4);
|
size = READ_BE_UINT32_UNALIGNED(obimptr+4);
|
||||||
|
@ -289,7 +290,6 @@ void Scumm::setVerbObject(int room, int object, int verb) {
|
||||||
memcpy(getResourceAddress(8, verb), obimptr, size);
|
memcpy(getResourceAddress(8, verb), obimptr, size);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
tmp_roomptr = NULL;
|
|
||||||
}
|
}
|
||||||
error("Image %d not found in room %d", object, room);
|
error("Image %d not found in room %d", object, room);
|
||||||
}
|
}
|
||||||
|
|
10
windows.cpp
10
windows.cpp
|
@ -17,6 +17,9 @@
|
||||||
*
|
*
|
||||||
* Change Log:
|
* Change Log:
|
||||||
* $Log$
|
* $Log$
|
||||||
|
* Revision 1.8 2001/10/26 17:34:50 strigeus
|
||||||
|
* bug fixes, code cleanup
|
||||||
|
*
|
||||||
* Revision 1.7 2001/10/23 19:51:50 strigeus
|
* Revision 1.7 2001/10/23 19:51:50 strigeus
|
||||||
* recompile not needed when switching games
|
* recompile not needed when switching games
|
||||||
* debugger skeleton implemented
|
* debugger skeleton implemented
|
||||||
|
@ -133,6 +136,7 @@ void Error(const char *msg) {
|
||||||
|
|
||||||
int sel;
|
int sel;
|
||||||
Scumm scumm;
|
Scumm scumm;
|
||||||
|
ScummDebugger debugger;
|
||||||
WndMan wm[1];
|
WndMan wm[1];
|
||||||
byte veryFastMode;
|
byte veryFastMode;
|
||||||
|
|
||||||
|
@ -148,6 +152,7 @@ static LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM l
|
||||||
case WM_CLOSE:
|
case WM_CLOSE:
|
||||||
PostQuitMessage(0);
|
PostQuitMessage(0);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case WM_CHAR:
|
case WM_CHAR:
|
||||||
wm->_scumm->_keyPressed = wParam;
|
wm->_scumm->_keyPressed = wParam;
|
||||||
break;
|
break;
|
||||||
|
@ -159,6 +164,7 @@ static LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM l
|
||||||
wm->_scumm->_saveLoadFlag = 1;
|
wm->_scumm->_saveLoadFlag = 1;
|
||||||
else if (GetAsyncKeyState(VK_CONTROL)<0)
|
else if (GetAsyncKeyState(VK_CONTROL)<0)
|
||||||
wm->_scumm->_saveLoadFlag = 2;
|
wm->_scumm->_saveLoadFlag = 2;
|
||||||
|
wm->_scumm->_saveLoadCompatible = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (wParam=='F') {
|
if (wParam=='F') {
|
||||||
|
@ -169,6 +175,10 @@ static LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM l
|
||||||
veryFastMode ^= 1;
|
veryFastMode ^= 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (wParam=='D') {
|
||||||
|
debugger.attach(wm->_scumm);
|
||||||
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case WM_MOUSEMOVE:
|
case WM_MOUSEMOVE:
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue