findObject in HE72+ only checks object bounds

findObject in He70/71 only needs additional polygon check

svn-id: r17270
This commit is contained in:
Travis Howell 2005-03-28 10:02:22 +00:00
parent 26f4124873
commit 11e1e246cc
7 changed files with 57 additions and 71 deletions

View file

@ -244,7 +244,7 @@ void ScummEngine_v72he::setupOpcodes() {
OPCODE(o72_verbOps),
OPCODE(o6_getActorFromXY),
/* A0 */
OPCODE(o70_findObject),
OPCODE(o72_findObject),
OPCODE(o6_pseudoRoom),
OPCODE(o6_getActorElevation),
OPCODE(o6_getVerbEntrypoint),
@ -654,6 +654,44 @@ byte *ScummEngine_v72he::findWrappedBlock(uint32 tag, byte *ptr, int state, bool
}
}
int ScummEngine_v72he::findObject(int x, int y, int num, int *args) {
int b, cls, i, result;
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 (_wiz.polygonDefined(_objs[i].obj_nr)) {
if (_wiz.polygonHit(_objs[i].obj_nr, x, y))
result = _objs[i].obj_nr;
else if (VAR_POLYGONS_ONLY != 0xFF && VAR(VAR_POLYGONS_ONLY))
continue;
}
if (!result) {
// Check object bounds
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;
}
if (result) {
if (!num)
return result;
// Check object class
cls = args[0];
b = getClass(i, cls);
if ((cls & 0x80 && b) || (!(cls & 0x80) && !b))
return result;
}
}
return 0;
}
void ScummEngine_v72he::o72_pushDWord() {
int a;
if (*_lastCodePtr + sizeof(MemBlkHeader) != _scriptOrgPointer) {
@ -1334,6 +1372,13 @@ 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();