aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--scumm/intern.h4
-rw-r--r--scumm/script_v100he.cpp2
-rw-r--r--scumm/script_v72he.cpp66
-rw-r--r--scumm/script_v7he.cpp65
-rw-r--r--scumm/script_v80he.cpp2
-rw-r--r--scumm/script_v90he.cpp2
6 files changed, 70 insertions, 71 deletions
diff --git a/scumm/intern.h b/scumm/intern.h
index 6f61d91981..af325a9bd2 100644
--- a/scumm/intern.h
+++ b/scumm/intern.h
@@ -626,6 +626,7 @@ protected:
void arrrays_unk2(int dst, int src, int len2, int len);
+ int findObject(int x, int y, int num, int *args);
void polygonErase(int fromId, int toId);
bool polygonContains(const WizPolygon &pol, int x, int y);
bool polygonDefined(int id);
@@ -638,6 +639,7 @@ protected:
void o70_pickupObject();
void o70_getActorRoom();
void o70_resourceRoutines();
+ void o70_findObject();
void o70_quitPauseRestart();
void o70_kernelSetFunctions();
void o70_unknownED();
@@ -720,7 +722,6 @@ protected:
void flushWizBuffer();
void captureWizImage(int restype, int resnum, const Common::Rect& r, bool frontBuffer, int compType);
- 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);
@@ -748,7 +749,6 @@ protected:
void o72_roomOps();
void o72_actorOps();
void o72_verbOps();
- void o72_findObject();
void o72_arrayOps();
void o72_dimArray();
void o72_dim2dimArray();
diff --git a/scumm/script_v100he.cpp b/scumm/script_v100he.cpp
index 50dd62c672..c37ae2948f 100644
--- a/scumm/script_v100he.cpp
+++ b/scumm/script_v100he.cpp
@@ -262,7 +262,7 @@ void ScummEngine_v100he::setupOpcodes() {
OPCODE(o90_findAllObjectsWithClassOf),
OPCODE(o6_invalid),
OPCODE(o6_findInventory),
- OPCODE(o72_findObject),
+ OPCODE(o70_findObject),
/* B0 */
OPCODE(o72_findObjectWithClassOf),
OPCODE(o70_polygonHit),
diff --git a/scumm/script_v72he.cpp b/scumm/script_v72he.cpp
index 7244be412b..f4faf895ab 100644
--- a/scumm/script_v72he.cpp
+++ b/scumm/script_v72he.cpp
@@ -245,7 +245,7 @@ void ScummEngine_v72he::setupOpcodes() {
OPCODE(o72_verbOps),
OPCODE(o6_getActorFromXY),
/* A0 */
- OPCODE(o72_findObject),
+ OPCODE(o70_findObject),
OPCODE(o6_pseudoRoom),
OPCODE(o6_getActorElevation),
OPCODE(o6_getVerbEntrypoint),
@@ -567,63 +567,6 @@ void ScummEngine_v72he::decodeScriptString(byte *dst, bool scriptString) {
*dst = 0;
}
-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)
- result = _objs[i].obj_nr;
- else if (VAR(VAR_POLYGONS_ONLY))
- continue;
- }
-
- 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;
- }
-
- if (cond)
- return result;
- }
- }
-
- return 0;
-}
-
const byte *ScummEngine_v72he::findWrappedBlock(uint32 tag, const byte *ptr, int state, bool errorFlag) {
if (READ_UINT32(ptr) == MKID('MULT')) {
const byte *offs, *wrap;
@@ -1574,13 +1517,6 @@ void ScummEngine_v72he::o72_verbOps() {
}
}
-void ScummEngine_v72he::o72_findObject() {
- int y = pop();
- int x = pop();
- int r = findObject(x, y, 0, 0);
- push(r);
-}
-
void ScummEngine_v72he::o72_arrayOps() {
byte subOp = fetchScriptByte();
int array = fetchScriptWord();
diff --git a/scumm/script_v7he.cpp b/scumm/script_v7he.cpp
index 242624575c..e1387d1a79 100644
--- a/scumm/script_v7he.cpp
+++ b/scumm/script_v7he.cpp
@@ -246,7 +246,7 @@ void ScummEngine_v70he::setupOpcodes() {
OPCODE(o6_verbOps),
OPCODE(o6_getActorFromXY),
/* A0 */
- OPCODE(o6_findObject),
+ OPCODE(o70_findObject),
OPCODE(o6_pseudoRoom),
OPCODE(o6_getActorElevation),
OPCODE(o6_getVerbEntrypoint),
@@ -404,6 +404,62 @@ void ScummEngine_v70he::arrrays_unk2(int dst, int src, int len2, int len) {
writeArray(0, 0, edi + i, 0);
}
+int ScummEngine_v70he::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)
+ result = _objs[i].obj_nr;
+ else if (VAR_POLYGONS_ONLY != 0xFF && VAR(VAR_POLYGONS_ONLY))
+ continue;
+ }
+
+ 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;
+ }
+
+ if (cond)
+ return result;
+ }
+ }
+
+ return 0;
+}
+
void ScummEngine_v70he::o70_startSound() {
byte subOp = fetchScriptByte();
@@ -617,6 +673,13 @@ void ScummEngine_v70he::o70_resourceRoutines() {
}
}
+void ScummEngine_v70he::o70_findObject() {
+ int y = pop();
+ int x = pop();
+ int r = findObject(x, y, 0, 0);
+ push(r);
+}
+
void ScummEngine_v70he::o70_quitPauseRestart() {
byte subOp = fetchScriptByte();
int par1;
diff --git a/scumm/script_v80he.cpp b/scumm/script_v80he.cpp
index 466feabb3d..d21f342493 100644
--- a/scumm/script_v80he.cpp
+++ b/scumm/script_v80he.cpp
@@ -244,7 +244,7 @@ void ScummEngine_v80he::setupOpcodes() {
OPCODE(o6_invalid),
OPCODE(o6_getActorFromXY),
/* A0 */
- OPCODE(o72_findObject),
+ OPCODE(o70_findObject),
OPCODE(o6_pseudoRoom),
OPCODE(o6_getActorElevation),
OPCODE(o6_getVerbEntrypoint),
diff --git a/scumm/script_v90he.cpp b/scumm/script_v90he.cpp
index fbd8cee369..c6fdbdfd66 100644
--- a/scumm/script_v90he.cpp
+++ b/scumm/script_v90he.cpp
@@ -244,7 +244,7 @@ void ScummEngine_v90he::setupOpcodes() {
OPCODE(o90_paletteOps),
OPCODE(o6_getActorFromXY),
/* A0 */
- OPCODE(o72_findObject),
+ OPCODE(o70_findObject),
OPCODE(o6_pseudoRoom),
OPCODE(o6_getActorElevation),
OPCODE(o6_getVerbEntrypoint),