diff options
| -rw-r--r-- | scumm/intern.h | 4 | ||||
| -rw-r--r-- | scumm/script_v100he.cpp | 2 | ||||
| -rw-r--r-- | scumm/script_v72he.cpp | 66 | ||||
| -rw-r--r-- | scumm/script_v7he.cpp | 65 | ||||
| -rw-r--r-- | scumm/script_v80he.cpp | 2 | ||||
| -rw-r--r-- | scumm/script_v90he.cpp | 2 | 
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), | 
