/** * Search Animation */ void AnimationManager::searchAnim(const byte *data, int animIndex, int bufSize) { for (int dataIdx = 0; dataIdx <= bufSize; dataIdx++) { if (READ_BE_UINT32(&data[dataIdx]) == MKTAG('A', 'N', 'I', 'M')) { int entryIndex = data[dataIdx + 4]; if (animIndex == entryIndex) { int curBufferPos = dataIdx + 5; int count = 0; bool innerLoopCond = false; do { if (READ_BE_UINT32(&data[curBufferPos]) == MKTAG('A', 'N', 'I', 'M') || READ_BE_UINT24(&data[curBufferPos]) == MKTAG24('F', 'I', 'N')) innerLoopCond = true; if (bufSize < curBufferPos) { _animBqe[animIndex]._enabledFl = false; _animBqe[animIndex]._data = NULL; return; } ++curBufferPos; ++count; } while (!innerLoopCond); _animBqe[animIndex]._data = _vm->_globals->allocMemory(count + 50); _animBqe[animIndex]._enabledFl = true; memcpy(_animBqe[animIndex]._data, data + dataIdx + 5, 20); byte *dataP = _animBqe[animIndex]._data; int curDestDataIndx = 20; int curSrcDataIndx = dataIdx + 25; for (int i = 0; i <= 4999; i++) { memcpy(dataP + curDestDataIndx, data + curSrcDataIndx, 10); if (!READ_LE_UINT16(data + curSrcDataIndx + 4)) break; curDestDataIndx += 10; curSrcDataIndx += 10; } break; } } if (READ_BE_UINT24(&data[dataIdx]) == MKTAG24('F', 'I', 'N')) break; } }
int AgiLoader_v3::loadDir(struct AgiDir *agid, Common::File *fp, uint32 offs, uint32 len) { int ec = errOK; uint8 *mem; unsigned int i; fp->seek(offs, SEEK_SET); if ((mem = (uint8 *)malloc(len + 32)) != NULL) { fp->read(mem, len); // set all directory resources to gone for (i = 0; i < MAX_DIRECTORY_ENTRIES; i++) { agid[i].volume = 0xff; agid[i].offset = _EMPTY; } // build directory entries for (i = 0; i < len; i += 3) { agid[i / 3].volume = *(mem + i) >> 4; agid[i / 3].offset = READ_BE_UINT24(mem + i) & (uint32) _EMPTY; } free(mem); } else {