int AgiEngine::decodeObjects(uint8 *mem, uint32 flen) { unsigned int i, so, padsize, spos; padsize = _game.gameFlags & ID_AMIGA ? 4 : 3; _game.numObjects = 0; _objects = NULL; // check if first pointer exceeds file size // if so, its encrypted, else it is not if (READ_LE_UINT16(mem) > flen) { debugN(0, "Decrypting objects... "); decrypt(mem, flen); debug(0, "done."); } // alloc memory for object list // byte 3 = number of animated objects. this is ignored.. ?? if (READ_LE_UINT16(mem) / padsize > 256) { // die with no error! AGDS game needs not to die to work!! :( return errOK; } _game.numObjects = READ_LE_UINT16(mem) / padsize; debugC(5, kDebugLevelResources, "num_objects = %d (padsize = %d)", _game.numObjects, padsize); if (allocObjects(_game.numObjects) != errOK) return errNotEnoughMemory; // build the object list spos = getVersion() >= 0x2000 ? padsize : 0; for (i = 0, so = spos; i < _game.numObjects; i++, so += padsize) { int offset; _objects[i].location = *(mem + so + 2); offset = READ_LE_UINT16(mem + so) + spos; if ((uint) offset < flen) { _objects[i].name = (char *)strdup((const char *)mem + offset); } else { warning("object %i name beyond object filesize (%04x > %04x)", i, offset, flen); _objects[i].name = strdup(""); } // Don't show the invalid "?" object in ego's inventory in the fanmade // game Beyond the Titanic 2 (bug #3116541). if (!strcmp(_objects[i].name, "?") && _objects[i].location == EGO_OWNED) _objects[i].location = 0; } debug(0, "Reading objects: %d objects read.", _game.numObjects); return errOK; }
int AgiEngine::decodeObjects(uint8 *mem, uint32 flen) { unsigned int i, so, padsize; padsize = _game.gameFlags & ID_AMIGA ? 4 : 3; _game.numObjects = 0; _objects = NULL; // check if first pointer exceeds file size // if so, its encrypted, else it is not if (READ_LE_UINT16(mem) > flen) { debugN(0, "Decrypting objects... "); decrypt(mem, flen); debug(0, "done."); } // alloc memory for object list // byte 3 = number of animated objects. this is ignored.. ?? if (READ_LE_UINT16(mem) / padsize >= 256) { // die with no error! AGDS game needs not to die to work!! :( return errOK; } _game.numObjects = READ_LE_UINT16(mem) / padsize; debugC(5, kDebugLevelResources, "num_objects = %d (padsize = %d)", _game.numObjects, padsize); if (allocObjects(_game.numObjects) != errOK) return errNotEnoughMemory; // build the object list for (i = 0, so = padsize; i < _game.numObjects; i++, so += padsize) { int offset; (_objects + i)->location = *(mem + so + 2); offset = READ_LE_UINT16(mem + so) + padsize; if ((uint) offset < flen) { (_objects + i)->name = (char *)strdup((const char *)mem + offset); } else { warning("object %i name beyond object filesize (%04x > %04x)", i, offset, flen); (_objects + i)->name = strdup(""); } } debug(0, "Reading objects: %d objects read.", _game.numObjects); return errOK; }