void MfcArchive::writeObject(CObject *obj) { if (obj == NULL) { writeUint16LE(0); } else if (_objectHash.contains(obj)) { int32 idx = _objectHash[obj]; if (idx < 0x7fff) { writeUint16LE(idx); } else { writeUint16LE(0x7fff); writeUint32LE(idx); } } else { writeUint16LE(0xffff); // New class _objectHash[obj] = _lastIndex++; writeUint16LE(1); // schema switch (obj->_objtype) { case kObjTypeGameVar: writePascalString(lookupObjectId(kGameVar), true); // Two byte counter break; default: error("Unhandled save for object type: %d", obj->_objtype); } obj->save(*this); } }
void Settings::save(std::string const& path) { FILE* opt = fopen(path.c_str(), "wb"); writeUint8(opt, maxBonuses); writeUint16(opt, loadingTime); writeUint16(opt, lives); writeUint16(opt, timeToLose); writeUint16(opt, flagsToWin); writeUint8(opt, screenSync); writeUint8(opt, map); writeUint8(opt, wormSettings[0].controller); writeUint8(opt, wormSettings[1].controller); writeUint8(opt, randomLevel); writeUint16(opt, blood); writeUint8(opt, gameMode); writeUint8(opt, namesOnBonuses); writeUint8(opt, regenerateLevel); writeUint8(opt, shadow); fwrite(weapTable, 1, 40, opt); for(int i = 0; i < 2; ++i) for(int j = 0; j < 3; ++j) writeUint8(opt, wormSettings[i].rgb[j]); for(int i = 0; i < 2; ++i) { for(int j = 0; j < 5; ++j) { writeUint8(opt, wormSettings[i].weapons[j]); } } writeUint16(opt, wormSettings[0].health); writeUint16(opt, wormSettings[1].health); for(int i = 0; i < 2; ++i) { if(wormSettings[i].randomName) writePascalString(opt, "", 21); else writePascalString(opt, wormSettings[i].name, 21); } //fputc(0, opt); // What's this? writeUint8(opt, loadChange); char const lieroStr[] = "\x05LIERO\0\0"; fwrite(lieroStr, 1, sizeof(lieroStr), opt); //fseek(opt, 0x84, SEEK_SET); for(int i = 0; i < 2; ++i) { for(int j = 0; j < 7; ++j) { writeUint8(opt, wormSettings[i].controls[j]); } } writePascalString(opt, levelFile, 9); fclose(opt); }