[Scummvm-git-logs] scummvm master -> 8884cc4d229ae85e4b08f4fb4b74381ff2cacd02

sdelamarre noreply at scummvm.org
Sun Dec 1 21:57:09 UTC 2024


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
8884cc4d22 GOB: Fix endianess issue in Goblin_v7::setGoblinState (Adibou2) - bug #15516


Commit: 8884cc4d229ae85e4b08f4fb4b74381ff2cacd02
    https://github.com/scummvm/scummvm/commit/8884cc4d229ae85e4b08f4fb4b74381ff2cacd02
Author: Simon Delamarre (simon.delamarre14 at gmail.com)
Date: 2024-12-01T22:56:57+01:00

Commit Message:
GOB: Fix endianess issue in Goblin_v7::setGoblinState (Adibou2) - bug #15516

Changed paths:
    engines/gob/goblin_v7.cpp
    engines/gob/inter_v1.cpp
    engines/gob/map_v2.cpp
    engines/gob/mult.cpp
    engines/gob/mult.h
    engines/gob/variables.cpp
    engines/gob/variables.h


diff --git a/engines/gob/goblin_v7.cpp b/engines/gob/goblin_v7.cpp
index 78747c03fa7..9699780a6a0 100644
--- a/engines/gob/goblin_v7.cpp
+++ b/engines/gob/goblin_v7.cpp
@@ -71,19 +71,20 @@ void Goblin_v7::setGoblinState(Mult::Mult_Object *obj, int16 animState) {
 	while (true) {
 		// obj->animVariables[1]: number of fields per state
 		// obj->animVariables[2]: max number of states
-		if (animState <= 0 || animState > obj->animVariables[2]) {
+		if (animState <= 0 || animState > (int16) obj->animVariables->at(2)) {
 			obj->pAnimData->animType = 11;
 			return;
 		}
 
-		int16 *animVariablesForState = obj->animVariables + animState * obj->animVariables[1];
-		if (animVariablesForState[0] == 0) {
-			newXCorrection = animVariablesForState[1];
-			newYCorrection = animVariablesForState[2];
+		int32 newOffset = animState * (int16) obj->animVariables->at(1);
+		VariableReferenceArray animVariablesForState = obj->animVariables->arrayAt(newOffset);
+		if (animVariablesForState.at(0) == 0) {
+			newXCorrection = (int16) animVariablesForState.at(1);
+			newYCorrection = (int16) animVariablesForState.at(2);
 			break;
 		}
 
-		if (animVariablesForState[0] == -2) {
+		if ((int16) animVariablesForState.at(0) == -2) {
 			// Reflexion relative to Y axis:
 			// Some videos exist only for "west" directions (W, NW, SW, N S),
 			// "east" directions (E, NE, SE) are then obtained by symmetry
@@ -121,17 +122,17 @@ void Goblin_v7::setGoblinState(Mult::Mult_Object *obj, int16 animState) {
 			}
 
 			obj->pAnimData->layer |= 0x80;
-			newXCorrection = animVariablesForState[1];
-			newYCorrection = animVariablesForState[2];
+			newXCorrection = (int16) animVariablesForState.at(1);
+			newYCorrection = (int16) animVariablesForState.at(2);
 			break;
 		}
 
-		if (animVariablesForState[0] == -1) {
+		if ((int16) animVariablesForState.at(0) == -1) {
 			obj->pAnimData->animType = 11;
 			return;
 		}
 
-		animState = animVariablesForState[0];
+		animState = (int16) animVariablesForState.at(0);
 	}
 
 	if (obj->pAnimData->stateType == 1) {
diff --git a/engines/gob/inter_v1.cpp b/engines/gob/inter_v1.cpp
index 4b595ee925c..950d896ed7d 100644
--- a/engines/gob/inter_v1.cpp
+++ b/engines/gob/inter_v1.cpp
@@ -505,7 +505,6 @@ void Inter_v1::o1_initMult() {
 			_vm->_mult->_objects[i].animName[0] = '\0';
 			_vm->_mult->_objects[i].videoSlot = 0;
 			_vm->_mult->_objects[i].animVariables = nullptr;
-			_vm->_mult->_objects[i].ownAnimVariables = false;
 			_vm->_mult->_objects[i].lastLeft = -1;
 			_vm->_mult->_objects[i].lastRight = -1;
 			_vm->_mult->_objects[i].lastTop = -1;
diff --git a/engines/gob/map_v2.cpp b/engines/gob/map_v2.cpp
index 3a740d45376..8a17ee00e64 100644
--- a/engines/gob/map_v2.cpp
+++ b/engines/gob/map_v2.cpp
@@ -82,8 +82,9 @@ void Map_v2::loadMapObjects(const char *avjFile) {
 				break;
 			case 65533: {
 				int index = READ_VARO_UINT16(var);
-				_vm->_mult->_objects[index].ownAnimVariables = false;
-				_vm->_mult->_objects[index].animVariables = (int16*) variables;
+				_vm->_mult->_objects[index].animVariables = new VariableReferenceArray(*_vm->_inter->_variables,
+																					   var,
+																					   Variables::kVariableType16);
 				break;
 			}
 			case 65534:
diff --git a/engines/gob/mult.cpp b/engines/gob/mult.cpp
index 1cbd3f01ee3..f254413eb93 100644
--- a/engines/gob/mult.cpp
+++ b/engines/gob/mult.cpp
@@ -135,10 +135,7 @@ void Mult::freeMult(bool freeObjectSprites) {
 		for (int i = 0; i < _objCount; i++) {
 			delete _objects[i].pPosX;
 			delete _objects[i].pPosY;
-			if (_objects[i].ownAnimVariables) {
-				delete _objects[i].animVariables;
-				_objects[i].animVariables = nullptr;
-			}
+			delete _objects[i].animVariables;
 
 			if (freeObjectSprites)
 				_vm->_draw->freeSprite(50 + i);
diff --git a/engines/gob/mult.h b/engines/gob/mult.h
index 740a65e353e..aa18d3db818 100644
--- a/engines/gob/mult.h
+++ b/engines/gob/mult.h
@@ -121,8 +121,8 @@ public:
 		byte* field_3C;
 		char animName[16];
 		int8 field_50;
-		int16* animVariables;
-		bool ownAnimVariables;
+		VariableReferenceArray *animVariables;
+		//bool ownAnimVariables;
 	} PACKED_STRUCT;
 
 	struct Mult_StaticKey {
diff --git a/engines/gob/variables.cpp b/engines/gob/variables.cpp
index dd9fb79a39e..be32e7054d1 100644
--- a/engines/gob/variables.cpp
+++ b/engines/gob/variables.cpp
@@ -309,6 +309,28 @@ VariableReference &VariableReference::operator*=(uint32 value) {
 	return (*this = (*this * value));
 }
 
+VariableReferenceArray::VariableReferenceArray(Variables &vars, uint32 offset, Variables::Type type) : _vars(&vars), _offset(offset), _type(type) {
+	switch (_type) {
+	case Variables::kVariableType8:
+		_fieldSize = 1;
+		break;
+	case Variables::kVariableType16:
+		_fieldSize = 2;
+		break;
+	case Variables::kVariableType32:
+	default:
+		_fieldSize = 4;
+		break;
+	}
+}
+
+VariableReference VariableReferenceArray::at(int32 i) {
+	return VariableReference(*_vars, _offset + i * _fieldSize, _type);
+}
+
+VariableReferenceArray VariableReferenceArray::arrayAt(int32 i) {
+	return VariableReferenceArray(*_vars, _offset + i * _fieldSize, _type);
+}
 
 VariableStack::VariableStack(uint32 size) : _size(size), _position(0) {
 	_stack = new byte[_size]();
diff --git a/engines/gob/variables.h b/engines/gob/variables.h
index 9ad3b363c25..37b49b42f6f 100644
--- a/engines/gob/variables.h
+++ b/engines/gob/variables.h
@@ -150,6 +150,19 @@ private:
 	Variables::Type _type;
 };
 
+class VariableReferenceArray {
+public:
+	VariableReferenceArray(Variables &vars, uint32 offset, Variables::Type type = Variables::kVariableType32);
+	VariableReference at(int32 i);
+	VariableReferenceArray arrayAt(int32 i);
+
+private:
+	Variables *_vars;
+	uint32 _offset;
+	Variables::Type _type;
+	uint32 _fieldSize;
+};
+
 class VariableStack {
 public:
 	VariableStack(uint32 size);




More information about the Scummvm-git-logs mailing list