From 1f6a8b4fb8f4b6a2ecaec0785684dd3c75feed30 Mon Sep 17 00:00:00 2001 From: Robert Göffringmann Date: Mon, 9 Jun 2003 20:41:08 +0000 Subject: fixed issue about file decompression. svn-id: r8421 --- sky/disk.cpp | 74 ++++++++++++++++++++++++++++------------------------------- sky/logic.cpp | 17 +++++++++++++- 2 files changed, 51 insertions(+), 40 deletions(-) (limited to 'sky') diff --git a/sky/disk.cpp b/sky/disk.cpp index 17fb77d5bc..a7592f9a10 100644 --- a/sky/disk.cpp +++ b/sky/disk.cpp @@ -156,57 +156,51 @@ uint8 *SkyDisk::loadFile(uint16 fileNr, uint8 *dest) { //if cflag == 0 then file is compressed, 1 == uncompressed - if (!cflag) { - debug(2, "File is compressed..."); + if ((!cflag) && ((FROM_LE_16(((dataFileHeader*)_fileDest)->flag) >> 7)&1)) { + debug(2, "File is RNC compressed."); memcpy(&fileHeader, _fileDest, sizeof(struct dataFileHeader)); - if ( (uint8)((FROM_LE_16(fileHeader.flag) >> 7) & 0x1) ) { - debug(2, "with RNC!"); + _decompSize = (FROM_LE_16(fileHeader.flag) & 0xFFFFFF00) << 8; + _decompSize |= FROM_LE_16((uint16)fileHeader.s_tot_size); - _decompSize = (FROM_LE_16(fileHeader.flag) & 0xFFFFFF00) << 8; - _decompSize |= FROM_LE_16((uint16)fileHeader.s_tot_size); + if (_fixedDest == NULL) // is this valid? + _compDest = (uint8 *)malloc(_decompSize); - if (_fixedDest == NULL) // is this valid? - _compDest = (uint8 *)malloc(_decompSize); + inputPtr = _fileDest; + outputPtr = _compDest; - inputPtr = _fileDest; - outputPtr = _compDest; - - if ( (uint8)(_fileFlags >> (22) & 0x1) ) //do we include the header? - inputPtr += sizeof(struct dataFileHeader); - else { - memcpy(outputPtr, inputPtr, sizeof(struct dataFileHeader)); - inputPtr += sizeof(struct dataFileHeader); - outputPtr += sizeof(struct dataFileHeader); - } + if ( (uint8)(_fileFlags >> (22) & 0x1) ) //do we include the header? + inputPtr += sizeof(struct dataFileHeader); + else { + memcpy(outputPtr, inputPtr, sizeof(struct dataFileHeader)); + inputPtr += sizeof(struct dataFileHeader); + outputPtr += sizeof(struct dataFileHeader); + } - RncDecoder rncDecoder; - int32 unPackLen = rncDecoder.unpackM1(inputPtr, outputPtr, 0); + RncDecoder rncDecoder; + int32 unPackLen = rncDecoder.unpackM1(inputPtr, outputPtr, 0); - debug(3, "UnpackM1 returned: %d", unPackLen); + debug(3, "UnpackM1 returned: %d", unPackLen); - if (unPackLen == 0) { //Unpack returned 0: file was probably not packed. - if (_fixedDest == NULL) - free(_compDest); + if (unPackLen == 0) { //Unpack returned 0: file was probably not packed. + if (_fixedDest == NULL) + free(_compDest); - return _fileDest; - } + return _fileDest; + } - if (! (uint8)(_fileFlags >> (22) & 0x1) ) { // include header? - unPackLen += sizeof(struct dataFileHeader); + if (! (uint8)(_fileFlags >> (22) & 0x1) ) { // include header? + unPackLen += sizeof(struct dataFileHeader); - if (unPackLen != (int32)_decompSize) { - debug(1, "ERROR: invalid decomp size! (was: %d, should be: %d)", unPackLen, _decompSize); - } + if (unPackLen != (int32)_decompSize) { + debug(1, "ERROR: invalid decomp size! (was: %d, should be: %d)", unPackLen, _decompSize); } + } - _lastLoadedFileSize = _decompSize; //including header + _lastLoadedFileSize = _decompSize; //including header - if (_fixedDest == NULL) - free(_fileDest); - - } else - debug(2, "but not with RNC! (?!)"); + if (_fixedDest == NULL) + free(_fileDest); } else return _fileDest; @@ -289,7 +283,7 @@ void SkyDisk::fnCacheFast(uint32 list) { uint8 cnt = 0; uint16 *fList = (uint16*)SkyState::fetchCompact(list); do { - _buildList[cnt] = fList[cnt]; + _buildList[cnt] = fList[cnt] & 0x7FFFU; cnt++; } while (fList[cnt-1]); } @@ -312,7 +306,7 @@ void SkyDisk::fnCacheFiles(void) { targCnt++; } else { free(SkyState::_itemList[_loadedFilesList[lCnt] & 2047]); - SkyState::_itemList[_loadedFilesList[lCnt] & 2047] = NULL; + SkyState::_itemList[_loadedFilesList[lCnt] & 2047] = NULL; } lCnt++; } @@ -339,6 +333,8 @@ void SkyDisk::fnCacheFiles(void) { targCnt++; _loadedFilesList[targCnt] = 0; SkyState::_itemList[_buildList[bCnt] & 2047] = (void**)loadFile(_buildList[bCnt] & 0x7FFF, NULL); + if (!SkyState::_itemList[_buildList[bCnt] & 2047]) + warning("fnCacheFiles: SkyDisk::loadFile() returned NULL for file %d\n",_buildList[bCnt] & 0x7FFF); bCnt++; } _buildList[0] = 0; diff --git a/sky/logic.cpp b/sky/logic.cpp index 1f32ef5dc9..4acc3af93b 100644 --- a/sky/logic.cpp +++ b/sky/logic.cpp @@ -1403,6 +1403,11 @@ bool SkyLogic::fnGetTo(uint32 targetPlaceId, uint32 mode, uint32 c) { return false; } uint16 *getToTable = cpt->getToTable; + if (!getToTable) { + // FIXME: This should never happen + warning("Place compact's getToTable is NULL!"); + return false; + } while (*getToTable != targetPlaceId) getToTable += 2; @@ -1500,7 +1505,8 @@ bool SkyLogic::fnAddHuman(uint32 a, uint32 b, uint32 c) { } bool SkyLogic::fnAddButtons(uint32 a, uint32 b, uint32 c) { - error("Stub: fnAddButtons"); + _scriptVariables[MOUSE_STATUS] |= 4; + return true; } bool SkyLogic::fnNoButtons(uint32 a, uint32 b, uint32 c) { @@ -1871,6 +1877,15 @@ bool SkyLogic::fnResetId(uint32 id, uint32 resetBlock, uint32 c) { Compact *cpt = SkyState::fetchCompact(id); uint16 *rst = (uint16 *)SkyState::fetchCompact(resetBlock); + SkyCompact::jobsworth; + if (!cpt) { + warning("fnResetId(): Compact %d (id) == NULL\n",id); + return true; + } + if (!rst) { + warning("fnResetId(): Compact %d (resetBlock) == NULL\n",resetBlock); + return true; + } uint16 off; while ((off = *rst++) != 0xffff) -- cgit v1.2.3