mirror of
https://github.com/libretro/scummvm.git
synced 2025-03-05 17:57:14 +00:00
Polygons used by HE71 too.
svn-id: r15585
This commit is contained in:
parent
2319d27178
commit
4aa211a8e0
@ -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();
|
||||
|
@ -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),
|
||||
|
@ -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();
|
||||
|
@ -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;
|
||||
|
@ -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),
|
||||
|
@ -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),
|
||||
|
Loading…
x
Reference in New Issue
Block a user