aboutsummaryrefslogtreecommitdiff
path: root/scumm
diff options
context:
space:
mode:
authorGregory Montoir2004-09-26 15:29:58 +0000
committerGregory Montoir2004-09-26 15:29:58 +0000
commit914d00f51a5c3ea06dee7481f157e21baefde1b0 (patch)
tree9fae274b3cf09aaf7f04fc7fac8b71cd25170595 /scumm
parent28727812319185ac39d951176c6e63bed8b68f21 (diff)
downloadscummvm-rg350-914d00f51a5c3ea06dee7481f157e21baefde1b0.tar.gz
scummvm-rg350-914d00f51a5c3ea06dee7481f157e21baefde1b0.tar.bz2
scummvm-rg350-914d00f51a5c3ea06dee7481f157e21baefde1b0.zip
wiz stuff cleanup and o90_unknown1C opcode update
svn-id: r15293
Diffstat (limited to 'scumm')
-rw-r--r--scumm/intern.h38
-rw-r--r--scumm/script_v72he.cpp132
-rw-r--r--scumm/script_v80he.cpp69
-rw-r--r--scumm/script_v90he.cpp160
-rw-r--r--scumm/scumm.cpp10
-rw-r--r--scumm/scumm.h1
6 files changed, 240 insertions, 170 deletions
diff --git a/scumm/intern.h b/scumm/intern.h
index b7a34ea795..c69c50e9ce 100644
--- a/scumm/intern.h
+++ b/scumm/intern.h
@@ -685,10 +685,11 @@ protected:
} GCC_PACK;
struct WizImage {
- int resnum;
+ int resNum;
int x1;
int y1;
int flags;
+ int state;
};
#if !defined(__GNUC__)
@@ -721,8 +722,9 @@ protected:
void writeFileFromArray(int slot, int resID);
void arrrays_unk2(int dst, int src, int len2, int len);
+ void displayWizImage(const WizImage *pwi);
void getWizImageDim(int resnum, int state, uint32 &w, uint32 &h);
- uint8 *drawWizImage(int restype, int resnum, int state, int x1, int y1, int flags);
+ uint8 *drawWizImage(int restype, const WizImage *pwi);
void drawWizPolygon(int resnum, int state, int id, int flags);
void flushWizBuffer();
@@ -805,7 +807,7 @@ protected:
virtual void executeOpcode(byte i);
virtual const char *getOpcodeDesc(byte i);
- void loadImgSpot(int resId, int state, uint32 &w, uint32 &h);
+ void loadImgSpot(int resId, int state, int16 &x, int16 &y);
void loadWizCursor(int resId, int resType, bool state);
/* HE version 80 script opcodes */
@@ -828,17 +830,47 @@ protected:
OpcodeProcV90he proc;
const char *desc;
};
+
+ struct WizParameters {
+ byte filename[260];
+ Common::Rect box;
+ int drawFlags;
+ int drawMode;
+ int unk_11C;
+ int unk_120;
+ int unk_124;
+ int unk_128;
+ int unk_12C;
+ int unk_130;
+ int unk_134;
+ int unk_138;
+ int unk_148;
+ int unk_14C;
+ int unk_150;
+ int unk_158;
+ int unk_15C;
+ int unk_160;
+ uint8 remapBuf1[256];
+ uint8 remapBuf2[256];
+ int remapPos;
+ WizImage img;
+ };
const OpcodeEntryV90he *_opcodesV90he;
+ WizParameters _wizParams;
public:
ScummEngine_v90he(GameDetector *detector, OSystem *syst, const ScummGameSettings &gs, uint8 md5sum[16]) : ScummEngine_v80he(detector, syst, gs, md5sum) {}
+ virtual void scummInit();
+
protected:
virtual void setupOpcodes();
virtual void executeOpcode(byte i);
virtual const char *getOpcodeDesc(byte i);
+ void wizDraw(const WizParameters *params);
+
/* HE version 90 script opcodes */
void o90_dup();
void o90_getLT();
diff --git a/scumm/script_v72he.cpp b/scumm/script_v72he.cpp
index 400a0d8ab2..210d701a59 100644
--- a/scumm/script_v72he.cpp
+++ b/scumm/script_v72he.cpp
@@ -861,8 +861,12 @@ void ScummEngine_v72he::o72_drawObject() {
}
void ScummEngine_v72he::o72_printWizImage() {
- int resnum = pop();
- drawWizImage(rtImage, resnum, 0, 0, 0, 4);
+ WizImage wi;
+ wi.resNum = pop();
+ wi.x1 = wi.y1 = 0;
+ wi.state = 0;
+ wi.flags = 4;
+ drawWizImage(rtImage, &wi);
}
void ScummEngine_v72he::o72_getArrayDimSize() {
@@ -1400,6 +1404,18 @@ void ScummEngine_v72he::o72_traceStatus() {
pop();
}
+void ScummEngine_v72he::displayWizImage(const WizImage *pwi) {
+ if (_fullRedraw) {
+ assert(_wizImagesNum < ARRAYSIZE(_wizImages));
+ memcpy(&_wizImages[_wizImagesNum], pwi, sizeof(WizImage));
+ ++_wizImagesNum;
+ } else if (pwi->flags & 0x40) {
+ drawWizPolygon(pwi->resNum, pwi->state, pwi->x1, pwi->flags);
+ } else {
+ drawWizImage(rtImage, pwi);
+ }
+}
+
void ScummEngine_v72he::getWizImageDim(int resnum, int state, uint32 &w, uint32 &h) {
const uint8 *dataPtr = getResourceAddress(rtImage, resnum);
if (dataPtr) {
@@ -1412,42 +1428,38 @@ void ScummEngine_v72he::getWizImageDim(int resnum, int state, uint32 &w, uint32
}
}
-uint8 *ScummEngine_v72he::drawWizImage(int restype, int resnum, int state, int x1, int y1, int flags) {
- debug(1, "drawWizImage(%d, %d, %d, %d, 0x%X)", restype, resnum, x1, y1, flags);
- if (flags & 64) {
- drawWizPolygon(resnum, state, x1, flags);
- return NULL;
- }
+uint8 *ScummEngine_v72he::drawWizImage(int restype, const WizImage *pwi) {
+ debug(1, "drawWizImage(%d, %d, %d, %d, 0x%X)", restype, pwi->resNum, pwi->x1, pwi->y1, pwi->flags);
uint8 *dst = NULL;
- const uint8 *dataPtr = getResourceAddress(restype, resnum);
+ const uint8 *dataPtr = getResourceAddress(restype, pwi->resNum);
if (dataPtr) {
- const uint8 *wizh = findWrappedBlock(MKID('WIZH'), dataPtr, state, 0);
+ const uint8 *wizh = findWrappedBlock(MKID('WIZH'), dataPtr, pwi->state, 0);
assert(wizh);
uint32 comp = READ_LE_UINT32(wizh + 0x0);
uint32 width = READ_LE_UINT32(wizh + 0x4);
uint32 height = READ_LE_UINT32(wizh + 0x8);
if (comp != 1) {
- warning("%d has invalid compression type %d", resnum, comp);
+ warning("%d has invalid compression type %d", pwi->resNum, comp);
}
- const uint8 *wizd = findWrappedBlock(MKID('WIZD'), dataPtr, state, 0);
+ const uint8 *wizd = findWrappedBlock(MKID('WIZD'), dataPtr, pwi->state, 0);
assert(wizd);
- if (flags & 1) {
- const uint8 *pal = findWrappedBlock(MKID('RGBS'), dataPtr, state, 0);
+ if (pwi->flags & 1) {
+ const uint8 *pal = findWrappedBlock(MKID('RGBS'), dataPtr, pwi->state, 0);
assert(pal);
setPaletteFromPtr(pal, 256);
}
- if (flags & 2) {
- const uint8 *rmap = findWrappedBlock(MKID('RMAP'), dataPtr, state, 0);
+ if (pwi->flags & 2) {
+ const uint8 *rmap = findWrappedBlock(MKID('RMAP'), dataPtr, pwi->state, 0);
assert(rmap);
- const uint8 *rgbs = findWrappedBlock(MKID('RGBS'), dataPtr, state, 0);
+ const uint8 *rgbs = findWrappedBlock(MKID('RGBS'), dataPtr, pwi->state, 0);
assert(rgbs);
// drawWizImageHelper1(rmap + 4, _currentPalette, rgbs);
warning("drawWizImage() unhandled flag 0x2");
}
uint32 cw, ch;
- if (flags & 0x24) { // printing (0x4) or rendering to memory (0x20)
+ if (pwi->flags & 0x24) { // printing (0x4) or rendering to memory (0x20)
dst = (uint8 *)malloc(width * height);
- if (flags & 0x20) {
+ if (pwi->flags & 0x20) {
int color = 255; // FIXME: should be (VAR_WIZ_TCOLOR != 0xFF) ? VAR(VAR_WIZ_TCOLOR) : 5;
memset(dst, color, width * height);
}
@@ -1455,7 +1467,7 @@ uint8 *ScummEngine_v72he::drawWizImage(int restype, int resnum, int state, int x
ch = height;
} else {
VirtScreen *pvs = &virtscr[kMainVirtScreen];
- if (flags & 0x10) {
+ if (pwi->flags & 0x10) {
dst = pvs->getPixels(0, pvs->topline);
} else {
dst = pvs->getBackPixels(0, pvs->topline);
@@ -1464,23 +1476,23 @@ uint8 *ScummEngine_v72he::drawWizImage(int restype, int resnum, int state, int x
ch = pvs->h;
}
Common::Rect rScreen(0, 0, cw - 1, ch - 1);
- if (flags & 0x80) {
+ if (pwi->flags & 0x80) {
// drawWizImageHelper2(p, wizd, cw, ch, x1, y1, width, height, &rScreen, 0, 2);
warning("drawWizImage() unhandled flag 0x80");
- } else if (flags & 0x100) {
+ } else if (pwi->flags & 0x100) {
// drawWizImageHelper2(p, wizd, cw, ch, x1, y1, width, height, &rScreen, 0, 1);
warning("drawWizImage() unhandled flag 0x100");
} else {
- gdi.copyWizImage(dst, wizd, cw, ch, x1, y1, width, height, &rScreen);
+ gdi.copyWizImage(dst, wizd, cw, ch, pwi->x1, pwi->y1, width, height, &rScreen);
}
- if (flags & 4) {
+ if (pwi->flags & 4) {
warning("printing Wiz image is unimplemented");
dst = NULL;
- } else if (!(flags & 0x20)) {
- Common::Rect rImage(x1, y1, x1 + width - 1, y1 + height - 1);
+ } else if (!(pwi->flags & 0x20)) {
+ Common::Rect rImage(pwi->x1, pwi->y1, pwi->x1 + width - 1, pwi->y1 + height - 1);
if (rImage.intersects(rScreen)) {
rImage.clip(rScreen);
- if (flags & 0x18) {
+ if (pwi->flags & 0x18) {
++rImage.bottom;
markRectAsDirty(kMainVirtScreen, rImage);
} else {
@@ -1574,7 +1586,12 @@ void ScummEngine_v72he::drawWizPolygon(int resnum, int state, int id, int flags)
if (wp->numVerts != 5) {
error("Invalid point count %d for Polygon %d", wp->numVerts, id);
}
- uint8 *srcWizBuf = drawWizImage(rtImage, resnum, state, 0, 0, 0x20);
+ WizImage wi;
+ wi.resNum = resnum;
+ wi.state = state;
+ wi.x1 = wi.y1 = 0;
+ wi.flags = 0x20;
+ uint8 *srcWizBuf = drawWizImage(rtImage, &wi);
if (srcWizBuf) {
uint8 *dst;
VirtScreen *pvs = &virtscr[kMainVirtScreen];
@@ -1615,24 +1632,24 @@ void ScummEngine_v72he::drawWizPolygon(int resnum, int state, int id, int flags)
ymin_b = 0;
ymax_b = wizH - 1;
- PolygonDrawData *pdd = new PolygonDrawData(ymax_p - ymin_p + 1);
- pdd->pts[0].x = xmin_p;
- pdd->pts[0].y = ymin_p;
- pdd->pts[1].x = xmax_p;
- pdd->pts[1].y = ymax_p;
- pdd->pts[2].x = xmin_b;
- pdd->pts[2].y = ymin_b;
- pdd->pts[3].x = xmax_b;
- pdd->pts[3].y = ymax_b;
+ PolygonDrawData pdd(ymax_p - ymin_p + 1);
+ pdd.pts[0].x = xmin_p;
+ pdd.pts[0].y = ymin_p;
+ pdd.pts[1].x = xmax_p;
+ pdd.pts[1].y = ymax_p;
+ pdd.pts[2].x = xmin_b;
+ pdd.pts[2].y = ymin_b;
+ pdd.pts[3].x = xmax_b;
+ pdd.pts[3].y = ymax_b;
for (i = 0; i < 3; ++i) {
- pdd->calcIntersection(&wp->vert[i], &wp->vert[i + 1], &bbox[i], &bbox[i + 1]);
+ pdd.calcIntersection(&wp->vert[i], &wp->vert[i + 1], &bbox[i], &bbox[i + 1]);
}
- pdd->calcIntersection(&wp->vert[3], &wp->vert[0], &bbox[3], &bbox[0]);
+ pdd.calcIntersection(&wp->vert[3], &wp->vert[0], &bbox[3], &bbox[0]);
- uint yoff = pdd->pts[0].y * pvs->w;
- for (i = 0; i < pdd->areasNum; ++i) {
- PolygonDrawData::InterArea *pia = &pdd->ia[i];
+ uint yoff = pdd.pts[0].y * pvs->w;
+ for (i = 0; i < pdd.areasNum; ++i) {
+ PolygonDrawData::InterArea *pia = &pdd.ia[i];
uint16 dx = pia->xmax - pia->xmin + 1;
uint8 *dstPtr = dst + pia->xmin + yoff;
int32 x_acc = pia->x1 << 0x10;
@@ -1649,8 +1666,6 @@ void ScummEngine_v72he::drawWizPolygon(int resnum, int state, int id, int flags)
yoff += pvs->w;
}
- delete pdd;
-
if (flags & 0x10) {
markRectAsDirty(kMainVirtScreen, wp->bound);
} else {
@@ -1669,28 +1684,23 @@ void ScummEngine_v72he::redrawBGAreas() {
void ScummEngine_v72he::flushWizBuffer() {
for (int i = 0; i < _wizImagesNum; ++i) {
WizImage *pwi = &_wizImages[i];
- drawWizImage(rtImage, pwi->resnum, 0, pwi->x1, pwi->y1, pwi->flags);
+ if (pwi->flags & 0x40) {
+ drawWizPolygon(pwi->resNum, pwi->state, pwi->x1, pwi->flags);
+ } else {
+ drawWizImage(rtImage, pwi);
+ }
}
_wizImagesNum = 0;
}
void ScummEngine_v72he::o72_drawWizImage() {
- int flags = pop();
- int y1 = pop();
- int x1 = pop();
- int resnum = pop();
-
- if (_fullRedraw) {
- assert(_wizImagesNum < ARRAYSIZE(_wizImages));
- WizImage *pwi = &_wizImages[_wizImagesNum];
- pwi->resnum = resnum;
- pwi->x1 = x1;
- pwi->y1 = y1;
- pwi->flags = flags;
- ++_wizImagesNum;
- } else {
- drawWizImage(rtImage, resnum, 0, x1, y1, flags);
- }
+ WizImage wi;
+ wi.flags = pop();
+ wi.y1 = pop();
+ wi.x1 = pop();
+ wi.resNum = pop();
+ wi.state = 0;
+ displayWizImage(&wi);
}
void ScummEngine_v72he::o72_unknownCF() {
diff --git a/scumm/script_v80he.cpp b/scumm/script_v80he.cpp
index fccf502a0d..f3b2aef38e 100644
--- a/scumm/script_v80he.cpp
+++ b/scumm/script_v80he.cpp
@@ -559,44 +559,49 @@ void ScummEngine_v80he::o80_cursorCommand() {
VAR(VAR_USERPUT) = _userPut;
}
-void ScummEngine_v80he::loadImgSpot(int resId, int state, uint32 &w, uint32 &h) {
+void ScummEngine_v80he::loadImgSpot(int resId, int state, int16 &x, int16 &y) {
const uint8 *dataPtr = getResourceAddress(rtImage, resId);
if (!dataPtr) {
warning("loadImgSpot: unknown Image %d", resId);
- w = h = 0;
+ x = y = 0;
return;
}
const uint8 *spotPtr = findWrappedBlock(MKID('SPOT'), dataPtr, state, 0);
if (spotPtr) {
- w = (int16)READ_LE_UINT32(spotPtr + 0);
- h = (int16)READ_LE_UINT32(spotPtr + 4);
+ x = (int16)READ_LE_UINT32(spotPtr + 0);
+ y = (int16)READ_LE_UINT32(spotPtr + 4);
} else {
- w = 0;
- h = 0;
+ x = 0;
+ y = 0;
}
}
void ScummEngine_v80he::loadWizCursor(int resId, int resType, bool state) {
- Common::Rect rc;
- uint32 w, h;
-
- loadImgSpot(resId, 0, w, h);
-
- rc.top = w;
- rc.right = h;
-
- rc.top = MAX((int)rc.top, 0);
- rc.right = MAX((int)rc.right, 0);
- rc.top = MIN((int)rc.top, 32);
- rc.right = MIN((int)rc.right, 32);
+ int16 x, y;
+ loadImgSpot(resId, 0, x, y);
+ if (x < 0) {
+ x = 0;
+ } else if (x > 32) {
+ x = 32;
+ }
+ if (y < 0) {
+ y = 0;
+ } else if (y > 32) {
+ y = 32;
+ }
- uint8 *cursor = drawWizImage(rtImage, resId, 0, 0, 0, 0x20);
- uint32 cw, ch;
+ WizImage wi;
+ wi.resNum = resId;
+ wi.x1 = wi.y1 = 0;
+ wi.state = 0;
+ wi.flags = 0x20;
+ uint8 *cursor = drawWizImage(rtImage, &wi);
+ uint32 cw, ch;
getWizImageDim(resId, 0, cw, ch);
setCursorFromBuffer(cursor, cw, ch, cw);
- setCursorHotspot(rc.top, rc.right);
+ setCursorHotspot(x, y);
free(cursor);
}
@@ -612,24 +617,14 @@ void ScummEngine_v80he::o80_setState() {
void ScummEngine_v80he::o80_drawWizPolygon() {
error("o80_drawWizPolygon");
- int xy1 = pop();
- int resnum = pop();
-
- if (_fullRedraw) {
- assert(_wizImagesNum < ARRAYSIZE(_wizImages));
- WizImage *pwi = &_wizImages[_wizImagesNum];
- pwi->resnum = resnum;
- pwi->x1 = xy1;
- pwi->y1 = xy1;
- pwi->flags = 64;
- ++_wizImagesNum;
- } else {
- drawWizImage(rtImage, resnum, 0, xy1, xy1, 64);
- }
+ WizImage wi;
+ wi.x1 = wi.y1 = pop();
+ wi.resNum = pop();
+ wi.state = 0;
+ wi.flags = 0x40;
+ displayWizImage(&wi);
}
-
-
void ScummEngine_v80he::o80_pickVarRandom() {
int num;
int args[100];
diff --git a/scumm/script_v90he.cpp b/scumm/script_v90he.cpp
index d547d4c1cb..fd219f4499 100644
--- a/scumm/script_v90he.cpp
+++ b/scumm/script_v90he.cpp
@@ -422,9 +422,26 @@ void ScummEngine_v90he::o90_startLocalScript() {
runScript(script, (flags == 199 || flags == 200), (flags == 195 || flags == 200), args);
}
+void ScummEngine_v90he::wizDraw(const WizParameters *params) {
+ debug(1, "ScummEngine_v90he::wizDraw()");
+ switch (params->drawMode) {
+ case 1:
+ // XXX incomplete
+ displayWizImage(&params->img);
+ break;
+ case 2:
+ case 6:
+ case 3:
+ case 4:
+ warning("unhandled wizDraw mode %d", params->drawMode);
+ break;
+ default:
+ error("invalid wizDraw mode %d", params->drawMode);
+ }
+}
+
void ScummEngine_v90he::o90_unknown1C() {
- // For Pajame Sam 2 demo
- // Incomplete
+ int a, b;
int subOp = fetchScriptByte();
subOp -= 46;
@@ -439,78 +456,98 @@ void ScummEngine_v90he::o90_unknown1C() {
pop();
break;
case 1:
- pop();
- pop();
- pop();
- pop();
+ _wizParams.box.bottom = pop();
+ _wizParams.box.right = pop();
+ _wizParams.box.top = pop();
+ _wizParams.box.left = pop();
break;
case 2:
- //Sets a variable to 1
+ _wizParams.drawMode = 1;
break;
case 3:
- //Gets a script string
+ _wizParams.drawFlags |= 0x800;
+ _wizParams.drawMode = 3;
+ copyScriptString(_wizParams.filename);
break;
case 4:
- //Gets a script string
- pop();
+ _wizParams.drawFlags |= 0x800;
+ _wizParams.drawMode = 4;
+ copyScriptString(_wizParams.filename);
+ _wizParams.unk_14C = pop();
break;
case 5:
- pop();
- pop();
- pop();
- pop();
- pop();
+ _wizParams.drawFlags |= 0x300;
+ _wizParams.drawMode = 2;
+ _wizParams.box.bottom = pop();
+ _wizParams.box.right = pop();
+ _wizParams.box.top = pop();
+ _wizParams.box.left = pop();
+ _wizParams.unk_148 = pop();
break;
case 6:
- _wizState = pop();
+ _wizParams.drawFlags |= 0x400;
+ _wizParams.img.state = pop();
break;
case 7:
- pop();
+ _wizParams.drawFlags |= 0x10;
+ _wizParams.unk_150 = pop();
break;
case 8:
- _wizFlag |= pop();
+ _wizParams.drawFlags |= 0x20;
+ _wizParams.img.flags = pop();
break;
case 10:
- {
- int flags = pop();
- int state = pop();
- int y1 = pop();
- int x1 = pop();
- int resnum = pop();
- if (_fullRedraw) {
- assert(_wizImagesNum < ARRAYSIZE(_wizImages));
- WizImage *pwi = &_wizImages[_wizImagesNum];
- pwi->resnum = resnum;
- pwi->x1 = x1;
- pwi->y1 = y1;
- pwi->flags = flags;
- ++_wizImagesNum;
- } else {
- drawWizImage(rtImage, resnum, state, x1, y1, flags);
- }
- }
+ _wizParams.img.flags = pop();
+ _wizParams.img.state = pop();
+ _wizParams.img.y1 = pop();
+ _wizParams.img.x1 = pop();
+ _wizParams.img.resNum = pop();
+ displayWizImage(&_wizParams.img);
break;
case 11:
- _wizResNum = pop();
- _wizFlag = 0;
+ _wizParams.img.resNum = pop();
+ _wizParams.drawMode = 0;
+ _wizParams.drawFlags = 0;
+ _wizParams.remapPos = 0;
+ _wizParams.img.flags = 0;
break;
case 19:
- _wizY1 = pop();
- _wizX1 = pop();
+ _wizParams.drawFlags |= 1;
+ _wizParams.img.y1 = pop();
+ _wizParams.img.x1 = pop();
break;
case 20:
- pop();
- pop();
+ b = pop();
+ a = pop();
+ _wizParams.drawFlags |= 0x40;
+ _wizParams.drawMode = 6;
+ if (_wizParams.remapPos == 0) {
+ memset(_wizParams.remapBuf2, 0, sizeof(_wizParams.remapBuf2));
+ } else {
+ assert(_wizParams.remapPos < ARRAYSIZE(_wizParams.remapBuf2));
+ _wizParams.remapBuf2[_wizParams.remapPos] = a;
+ _wizParams.remapBuf1[a] = b;
+ ++_wizParams.remapPos;
+ }
break;
case 21:
- pop();
- pop();
- pop();
- pop();
+ _wizParams.drawFlags |= 0x200;
+ _wizParams.box.bottom = pop();
+ _wizParams.box.right = pop();
+ _wizParams.box.top = pop();
+ _wizParams.box.left = pop();
break;
case 40: // HE99+
pop();
break;
+ case 46:
+ _wizParams.drawFlags |= 8;
+ _wizParams.unk_158 = pop();
+ break;
+ case 52:
+ _wizParams.drawFlags |= 4;
+ _wizParams.unk_15C = pop();
+ break;
case 87: // HE99+
pop();
pop();
@@ -521,28 +558,24 @@ void ScummEngine_v90he::o90_unknown1C() {
case 91: // HE99+
pop();
break;
+ case 108:
+ _wizParams.drawFlags |= 1;
+ _wizParams.img.y1 = pop();
+ _wizParams.img.x1 = pop();
+ break;
case 171: // HE99+
break;
case 200:
- _wizFlag |= 64;
- _wizY1 = _wizX1 = pop();
+ _wizParams.drawFlags |= 0x23;
+ _wizParams.img.flags |= 0x40;
+ _wizParams.unk_160 = _wizParams.img.y1 = _wizParams.img.x1 = pop();
break;
case 203: // HE98+
pop();
pop();
break;
case 209:
- if (_fullRedraw) {
- assert(_wizImagesNum < ARRAYSIZE(_wizImages));
- WizImage *pwi = &_wizImages[_wizImagesNum];
- pwi->resnum = _wizResNum;
- pwi->x1 = _wizX1;
- pwi->y1 = _wizY1;
- pwi->flags = _wizFlag;
- ++_wizImagesNum;
- } else {
- drawWizImage(rtImage, _wizResNum, _wizState, _wizX1, _wizY1, _wizFlag);
- }
+ wizDraw(&_wizParams);
break;
default:
error("o90_unknown1C: unhandled case %d", subOp);
@@ -798,6 +831,7 @@ void ScummEngine_v90he::o90_unknown28() {
void ScummEngine_v90he::o90_unknown29() {
int state, resId;
uint32 w, h;
+ int16 x, y;
int subOp = fetchScriptByte();
subOp -= 30;
@@ -806,14 +840,14 @@ void ScummEngine_v90he::o90_unknown29() {
case 0:
state = pop();
resId = pop();
- loadImgSpot(resId, state, w, h);
- push(w);
+ loadImgSpot(resId, state, x, y);
+ push(x);
break;
case 1:
state = pop();
resId = pop();
- loadImgSpot(resId, state, w, h);
- push(h);
+ loadImgSpot(resId, state, x, y);
+ push(y);
break;
case 2:
state = pop();
diff --git a/scumm/scumm.cpp b/scumm/scumm.cpp
index 52da3e5214..bfb4182b0d 100644
--- a/scumm/scumm.cpp
+++ b/scumm/scumm.cpp
@@ -697,11 +697,6 @@ ScummEngine::ScummEngine(GameDetector *detector, OSystem *syst, const ScummGameS
_heSndLoop = 0;
_heSndSoundFreq = 0;
memset(_timers, 0, sizeof(_timers));
- _wizResNum = 0;
- _wizX1 = 0;
- _wizY1 = 0;
- _wizState = 0;
- _wizFlag = 0;
memset(_akosQueue, 0, sizeof(_akosQueue));
_akosQueuePos = 0;
@@ -1317,6 +1312,11 @@ void ScummEngine_v60he::scummInit() {
}
}
+void ScummEngine_v90he::scummInit() {
+ ScummEngine_v80he::scummInit();
+ memset(&_wizParams, 0, sizeof(_wizParams));
+}
+
void ScummEngine::setupMusic(int midi) {
_midiDriver = GameDetector::detectMusicDriver(midi);
_native_mt32 = ConfMan.getBool("native_mt32");
diff --git a/scumm/scumm.h b/scumm/scumm.h
index c5e5bae651..e43d0fb462 100644
--- a/scumm/scumm.h
+++ b/scumm/scumm.h
@@ -1082,7 +1082,6 @@ public:
int _heSndSoundFreq, _heSndOffset, _heSndChannel, _heSndSoundId, _heSndLoop;
bool _skipDrawObject, _skipProcessActors;
int _timers[4];
- int _wizResNum, _wizX1, _wizY1, _wizState, _wizFlag;
protected:
int _shadowPaletteSize;