findObject in HE72+ only checks object bounds
findObject in He70/71 only needs additional polygon check svn-id: r17270
This commit is contained in:
parent
26f4124873
commit
11e1e246cc
7 changed files with 57 additions and 71 deletions
|
@ -242,7 +242,7 @@ void ScummEngine_v70he::setupOpcodes() {
|
|||
OPCODE(o6_verbOps),
|
||||
OPCODE(o6_getActorFromXY),
|
||||
/* A0 */
|
||||
OPCODE(o70_findObject),
|
||||
OPCODE(o6_findObject),
|
||||
OPCODE(o6_pseudoRoom),
|
||||
OPCODE(o6_getActorElevation),
|
||||
OPCODE(o6_getVerbEntrypoint),
|
||||
|
@ -425,62 +425,6 @@ void ScummEngine_v70he::appendSubstring(int dst, int src, int srcOffs, int len)
|
|||
writeArray(0, 0, dstOffs + 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 (_wiz.polygonDefined(_objs[i].obj_nr)) {
|
||||
if (_wiz.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();
|
||||
|
||||
|
@ -697,13 +641,6 @@ 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;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue