[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