From cb86c86ee193632eef59e5ebe73113e4bef3cc07 Mon Sep 17 00:00:00 2001 From: hendricks266 Date: Wed, 23 May 2018 05:58:09 +0000 Subject: [PATCH] CON: Implement the copy command for GAMEARRAY_BOOLEAN. git-svn-id: https://svn.eduke32.com/eduke32@6899 1a8010ca-5511-0410-912e-c29ae57300e0 --- source/duke3d/src/gameexec.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/source/duke3d/src/gameexec.cpp b/source/duke3d/src/gameexec.cpp index 61cee2d41..493639bf6 100644 --- a/source/duke3d/src/gameexec.cpp +++ b/source/duke3d/src/gameexec.cpp @@ -5063,8 +5063,9 @@ GAMEEXEC_STATIC void VM_Execute(native_t loop) int const srcInc = 1 << (int)!!(EDUKE32_PREDICT_FALSE(aGameArrays[srcArray].flags & GAMEARRAY_STRIDE2)); int const destInc = 1 << (int)!!(EDUKE32_PREDICT_FALSE(aGameArrays[destArray].flags & GAMEARRAY_STRIDE2)); - // matching array types and no STRIDE2 flag + // matching array types, no BITMAPs, no STRIDE2 flag if ((aGameArrays[srcArray].flags & GAMEARRAY_SIZE_MASK) == (aGameArrays[destArray].flags & GAMEARRAY_SIZE_MASK) + && !((aGameArrays[srcArray].flags | aGameArrays[destArray].flags) & GAMEARRAY_BITMAP) && (srcInc & destInc) == 1) { Bmemcpy(aGameArrays[destArray].pValues + destArrayIndex, aGameArrays[srcArray].pValues + srcArrayIndex, @@ -5107,6 +5108,15 @@ GAMEEXEC_STATIC void VM_Execute(native_t loop) ((uint8_t *) aGameArrays[destArray].pValues)[destArrayIndex] = Gv_GetArrayValue(srcArray, srcArrayIndex++); destArrayIndex += destInc; } + case GAMEARRAY_BITMAP: + for (; numElements > 0; --numElements) + { + uint32_t const newValue = Gv_GetArrayValue(srcArray, srcArrayIndex++); + uint32_t const mask = 1 << (destArrayIndex & 7); + uint8_t & value = ((uint8_t *)aGameArrays[destArray].pValues)[destArrayIndex >> 3]; + value = (value & ~mask) | (-!!newValue & mask); + destArrayIndex += destInc; + } break; }