mirror of
https://github.com/libretro/scummvm.git
synced 2025-02-04 18:06:26 +00:00
SCUMM: HE: Temporarily revert copyArray to old version
This apparently fixes softlocks during online Baseball2001 matches, or at least this is what happens in my situation when A/B-ing the two versions. I have no time to fix this properly since I'm going on vacation, but I'll provide a proper fix as soon as I reasonably can.
This commit is contained in:
parent
bdec55f2a0
commit
1ee9023559
@ -2014,6 +2014,7 @@ void ScummEngine_v72he::checkArrayLimits(int array, int downMin, int downMax, in
|
||||
}
|
||||
}
|
||||
|
||||
#if 0
|
||||
void ScummEngine_v72he::copyArray(int dstVariable, int dstDownMin, int dstDownMax, int dstAcrossMin, int dstAcrossMax,
|
||||
int srcVariable, int srcDownMin, int srcDownMax, int srcAcrossMin, int srcAcrossMax) {
|
||||
byte *dstPtr, *srcPtr;
|
||||
@ -2104,6 +2105,68 @@ void ScummEngine_v72he::copyArray(int dstVariable, int dstDownMin, int dstDownMa
|
||||
}
|
||||
}
|
||||
}
|
||||
#else
|
||||
void ScummEngine_v72he::copyArray(int array1, int a1_dim2start, int a1_dim2end, int a1_dim1start, int a1_dim1end,
|
||||
int array2, int a2_dim2start, int a2_dim2end, int a2_dim1start, int a2_dim1end) {
|
||||
byte *dst, *src;
|
||||
int dstPitch, srcPitch;
|
||||
int rowSize;
|
||||
checkArrayLimits(array1, a1_dim2start, a1_dim2end, a1_dim1start, a1_dim1end);
|
||||
checkArrayLimits(array2, a2_dim2start, a2_dim2end, a2_dim1start, a2_dim1end);
|
||||
int a12_num = a1_dim2end - a1_dim2start + 1;
|
||||
int a11_num = a1_dim1end - a1_dim1start + 1;
|
||||
int a22_num = a2_dim2end - a2_dim2start + 1;
|
||||
int a21_num = a2_dim1end - a2_dim1start + 1;
|
||||
if (a22_num != a12_num || a21_num != a11_num) {
|
||||
error("Operation size mismatch (%d vs %d)(%d vs %d)", a12_num, a22_num, a11_num, a21_num);
|
||||
}
|
||||
|
||||
if (array1 != array2) {
|
||||
ArrayHeader *ah1 = (ArrayHeader *)getResourceAddress(rtString, readVar(array1));
|
||||
assert(ah1);
|
||||
ArrayHeader *ah2 = (ArrayHeader *)getResourceAddress(rtString, readVar(array2));
|
||||
assert(ah2);
|
||||
if (FROM_LE_32(ah1->type) == FROM_LE_32(ah2->type)) {
|
||||
getArrayDataPtrAndDataSize(ah1, a1_dim2start, a1_dim1start, a1_dim1end, &dst, &dstPitch, &rowSize);
|
||||
getArrayDataPtrAndDataSize(ah2, a2_dim2start, a2_dim1start, a2_dim1end, &src, &srcPitch, &rowSize);
|
||||
for (; a1_dim2start <= a1_dim2end; ++a1_dim2start) {
|
||||
memcpy(dst, src, rowSize);
|
||||
dst += dstPitch;
|
||||
src += srcPitch;
|
||||
}
|
||||
} else {
|
||||
for (; a1_dim2start <= a1_dim2end; ++a1_dim2start, ++a2_dim2start) {
|
||||
int a2dim1 = a2_dim1start;
|
||||
int a1dim1 = a1_dim1start;
|
||||
for (; a1dim1 <= a1_dim1end; ++a1dim1, ++a2dim1) {
|
||||
int val = readArray(array2, a2_dim2start, a2dim1);
|
||||
writeArray(array1, a1_dim2start, a1dim1, val);
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (a2_dim2start != a1_dim2start || a2_dim1start != a1_dim1start) {
|
||||
ArrayHeader *ah = (ArrayHeader *)getResourceAddress(rtString, readVar(array1));
|
||||
assert(ah);
|
||||
if (a2_dim2start > a1_dim2start) {
|
||||
getArrayDataPtrAndDataSize(ah, a1_dim2start, a1_dim1start, a1_dim1end, &dst, &dstPitch, &rowSize);
|
||||
getArrayDataPtrAndDataSize(ah, a2_dim2start, a2_dim1start, a2_dim1end, &src, &srcPitch, &rowSize);
|
||||
} else {
|
||||
// start at the end, so we copy backwards (in case the indices overlap)
|
||||
getArrayDataPtrAndDataSize(ah, a1_dim2end, a1_dim1start, a1_dim1end, &dst, &dstPitch, &rowSize);
|
||||
getArrayDataPtrAndDataSize(ah, a2_dim2end, a2_dim1start, a2_dim1end, &src, &srcPitch, &rowSize);
|
||||
dstPitch = -dstPitch;
|
||||
srcPitch = -srcPitch;
|
||||
}
|
||||
for (; a1_dim2start <= a1_dim2end; ++a1_dim2start) {
|
||||
memcpy(dst, src, rowSize);
|
||||
dst += dstPitch;
|
||||
src += srcPitch;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
void ScummEngine_v72he::getArrayDataPtrAndDataSize(ArrayHeader *headerPtr, int down, int aMin, int aMax, byte **ptrPtr, int *dataOffsetPtr, int *dataSizePtr) {
|
||||
const int acrossCount = FROM_LE_32(headerPtr->acrossMax) - FROM_LE_32(headerPtr->acrossMin) + 1;
|
||||
|
Loading…
x
Reference in New Issue
Block a user