aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--scumm/intern.h2
-rw-r--r--scumm/script_v72he.cpp69
-rw-r--r--scumm/script_v90he.cpp4
3 files changed, 51 insertions, 24 deletions
diff --git a/scumm/intern.h b/scumm/intern.h
index 741980fcf6..d22af623f6 100644
--- a/scumm/intern.h
+++ b/scumm/intern.h
@@ -716,7 +716,7 @@ protected:
void drawWizPolygon(int resnum, int state, int id, int flags);
void flushWizBuffer();
- int findObject(int x, int y, int *args);
+ int findObject(int x, int y, int num, int *args);
virtual void decodeParseString(int a, int b);
void decodeScriptString(byte *dst, bool scriptString = false);
void copyScriptString(byte *dst);
diff --git a/scumm/script_v72he.cpp b/scumm/script_v72he.cpp
index 3f016d46af..076aea8acb 100644
--- a/scumm/script_v72he.cpp
+++ b/scumm/script_v72he.cpp
@@ -592,33 +592,58 @@ void ScummEngine_v72he::decodeScriptString(byte *dst, bool scriptString) {
*dst = 0;
}
-int ScummEngine_v72he::findObject(int x, int y, int *args) {
- int i, b;
+int ScummEngine_v72he::findObject(int x, int y, int num, int *args) {
+ int i, b, result;
+ int cond, cls, tmp;
byte a;
const int mask = 0xF;
for (i = 1; i < _numLocalObjects; i++) {
+ result = 0;
if ((_objs[i].obj_nr < 1) || getClass(_objs[i].obj_nr, kObjectClassUntouchable))
continue;
+ // Check polygon bounds
if (polygonDefined(_objs[i].obj_nr)) {
if (polygonHit(_objs[i].obj_nr, x, y) != 0)
- return _objs[i].obj_nr;
+ result = _objs[i].obj_nr;
else if (VAR(VAR_POLYGONS_ONLY))
continue;
}
- b = i;
- do {
- a = _objs[b].parentstate;
- b = _objs[b].parent;
- if (b == 0) {
- if (_objs[i].x_pos <= x && _objs[i].width + _objs[i].x_pos > x &&
- _objs[i].y_pos <= y && _objs[i].height + _objs[i].y_pos > y)
- return _objs[i].obj_nr;
- break;
+ if (!result) {
+ // Check object bounds
+ b = i;
+ do {
+ a = _objs[b].parentstate;
+ b = _objs[b].parent;
+ if (b == 0) {
+ if (_objs[i].x_pos <= x && _objs[i].width + _objs[i].x_pos > x &&
+ _objs[i].y_pos <= y && _objs[i].height + _objs[i].y_pos > y)
+ result = _objs[i].obj_nr;
+ break;
+ }
+ } while ((_objs[b].state & mask) == a);
+ }
+
+
+ if (result) {
+ if (!num)
+ return result;
+
+ // Check object class
+ cond = 1;
+ tmp = num;
+ while (--tmp >= 0) {
+ cls = args[tmp];
+ b = getClass(i, cls);
+ if ((cls & 0x80 && !b) || (!(cls & 0x80) && b))
+ cond = 0;
}
- } while ((_objs[b].state & mask) == a);
+
+ if (cond)
+ return result;
+ }
}
return 0;
@@ -707,12 +732,12 @@ void ScummEngine_v72he::o72_unknown50() {
}
void ScummEngine_v72he::o72_findObjectWithClassOf() {
- int args[16];
+ int args[16], num;
- getStackList(args, ARRAYSIZE(args));
+ num = getStackList(args, ARRAYSIZE(args));
int y = pop();
int x = pop();
- int r = findObject(x, y, args);
+ int r = findObject(x, y, num, args);
push(r);
}
@@ -1338,7 +1363,7 @@ void ScummEngine_v72he::o72_verbOps() {
void ScummEngine_v72he::o72_findObject() {
int y = pop();
int x = pop();
- int r = findObject(x, y, 0);
+ int r = findObject(x, y, 0, 0);
push(r);
}
@@ -1417,16 +1442,18 @@ void ScummEngine_v72he::o72_arrayOps() {
len |= dim2end;
len = len - dim2end + 1;
offs = (b >= c) ? 1 : -1;
+ tmp2 = c;
+ tmp3 = len;
while (dim2start <= dim2end) {
tmp = dim1start;
- tmp2 = c;
- tmp3 = len;
while (tmp <= dim1end) {
writeArray(array, dim2start, tmp, tmp2);
- if (--tmp3 == 0)
+ if (--tmp3 == 0) {
tmp2 = c;
- else
+ tmp3 = len;
+ } else {
tmp2 += offs;
+ }
tmp++;
}
dim2start++;
diff --git a/scumm/script_v90he.cpp b/scumm/script_v90he.cpp
index 171d52d508..9fdba4b9f2 100644
--- a/scumm/script_v90he.cpp
+++ b/scumm/script_v90he.cpp
@@ -1067,9 +1067,8 @@ void ScummEngine_v90he::o90_mod() {
void ScummEngine_v90he::o90_findAllObjectsWithClassOf() {
int args[16];
- int num, cls, tmp;
+ int cond, num, cls, tmp;
bool b;
- int cond = 1;
num = getStackList(args, ARRAYSIZE(args));
int room = pop();
@@ -1077,6 +1076,7 @@ void ScummEngine_v90he::o90_findAllObjectsWithClassOf() {
if (room != _currentRoom)
warning("o90_findAllObjectsWithClassOf: current room is not %d", room);
+
writeVar(0, 0);
defineArray(0, kDwordArray, 0, 0, 0, _numLocalObjects + 1);
for (int i = 1; i < _numLocalObjects; i++) {