bool NotesHandler::load(int16 dataVar, int32 size, int32 offset) { if ((dataVar < 0) || (size < 0) || (offset < 0)) return false; Common::String fileName = _file->build(); if (fileName.empty()) return false; SaveReader *reader; SaveConverter_Notes converter(_vm, _notesSize, fileName); if (converter.isOldSave()) { // Old save, plug the converter in if (!converter.load()) return false; reader = new SaveReader(1, 0, converter); } else // New save, load directly reader = new SaveReader(1, 0, fileName); SavePartVars vars(_vm, _notesSize); if (!reader->load()) { delete reader; return false; } if (!reader->readPart(0, &vars)) { delete reader; return false; } if (!vars.writeInto(dataVar, offset, size)) { delete reader; return false; } delete reader; return true; }
bool SaveLoad_v2::GameHandler::load(int16 dataVar, int32 size, int32 offset) { uint32 varSize = SaveHandler::getVarSize(_vm); if (varSize == 0) return false; if (size == 0) { // Indicator to load all variables dataVar = 0; size = varSize; } if (offset == 0) { // Save index if (((uint32) size) != kIndexSize) { warning("Requested index has wrong size (%d)", size); return false; } // Create/Fake the index buildIndex(_vm->_inter->_variables->getAddressOff8(dataVar)); } else { // Save slot, whole variable block uint32 slot = _slotFile->getSlot(offset); int slotRem = _slotFile->getSlotRemainder(offset); debugC(2, kDebugSaveLoad, "Loading from slot %d", slot); if ((slot >= kSlotCount) || (slotRem != 0) || (dataVar != 0) || (((uint32) size) != varSize)) { warning("Invalid loading procedure (%d, %d, %d, %d, %d)", dataVar, size, offset, slot, slotRem); return false; } Common::String slotFile = _slotFile->build(slot); SaveReader *reader = 0; SaveConverter_v2 converter(_vm, slotFile); if (converter.isOldSave()) { // Old save, plug the converter in if (!converter.load()) return false; reader = new SaveReader(2, slot, converter); } else // New save, load directly reader = new SaveReader(2, slot, slotFile); SavePartInfo info(kSlotNameLength, (uint32) _vm->getGameType(), 0, _vm->getEndianness(), varSize); SavePartVars vars(_vm, varSize); if (!reader->load()) { delete reader; return false; } if (!reader->readPart(0, &info)) { delete reader; return false; } if (!reader->readPart(1, &vars)) { delete reader; return false; } // Get all variables if (!vars.writeInto(0, 0, varSize)) { delete reader; return false; } delete reader; } return true; }
bool SaveLoad_Playtoons::GameHandler::load(int16 dataVar, int32 size, int32 offset) { uint32 varSize; if (size < 0) { // Load a temporary sprite debugC(2, kDebugSaveLoad, "Loading temporary sprite %d at pos %d", size, offset); _tempSpriteHandler->load(dataVar, size, offset); return true; } varSize = SaveHandler::getVarSize(_vm); if (varSize == 0) return false; if (size == 0) { // Indicator to load all variables dataVar = 0; size = varSize; } if (((uint32) offset) < kPropsSize) { // Properties if (((uint32) (offset + size)) > kPropsSize) { warning("Wrong index size (%d, %d)", size, offset); return false; } _vm->_inter->_variables->copyFrom(dataVar, _props + offset, size); } else if (((uint32) offset) < kPropsSize + kIndexSize) { // Save index if (((uint32) size) != kIndexSize) { warning("Wrong index size (%d, %d)", size, offset); return false; } buildIndex(_vm->_inter->_variables->getAddressOff8(dataVar)); } else { // Save slot, whole variable block uint32 slot = _slotFile->getSlot(offset); int slotRem = _slotFile->getSlotRemainder(offset); debugC(2, kDebugSaveLoad, "Loading from slot %d", slot); if ((slot >= kSlotCount) || (slotRem != 0) || (dataVar != 0) || (((uint32) size) != varSize)) { warning("Invalid loading procedure (%d, %d, %d, %d, %d)", dataVar, size, offset, slot, slotRem); return false; } Common::String slotFile = _slotFile->build(slot); SaveReader *reader = 0; // New save, load directly reader = new SaveReader(2, slot, slotFile); SavePartInfo info(kSlotNameLength, (uint32) _vm->getGameType(), 0, _vm->getEndianness(), varSize); SavePartVars vars(_vm, varSize); if (!reader->load()) { delete reader; return false; } if (!reader->readPart(0, &info)) { delete reader; return false; } if (!reader->readPart(1, &vars)) { delete reader; return false; } // Get all variables if (!vars.writeInto(0, 0, varSize)) { delete reader; return false; } delete reader; } return true; }