示例#1
0
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;
}
示例#2
0
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;
}