/** * * @author OLiver */ bool Savegame::Save(BinaryFile& file) { // Versionszeug schreiben WriteVersion(file, 8, SAVE_SIGNATURE, SAVE_VERSION); // Timestamp der Aufzeichnung unser_time_t tmpTime = libendian::ConvertEndianess<false>::fromNative(save_time); file.WriteRawData(&tmpTime, 8); // Mapname file.WriteShortString(map_name); // Anzahl Spieler file.WriteUnsignedChar(GetPlayerCount()); // Größe der Spielerdaten (später ausfüllen) unsigned players_size = 0; unsigned players_pos = file.Tell(); file.WriteUnsignedInt(players_size); // Spielerdaten WritePlayerData(file); // Wieder zurückspringen und Größe des Spielerblocks eintragen unsigned new_pos = file.Tell(); file.Seek(players_pos, SEEK_SET); file.WriteUnsignedInt(new_pos - players_pos - 4); file.Seek(new_pos, SEEK_SET); // GGS WriteGGS(file); // Start-GF file.WriteUnsignedInt(start_gf); // Serialisiertes Spielzeug reinschreiben sgd.WriteToFile(file); return true; }
bool Savegame::Save(BinaryFile& file) { // Versionszeug schreiben WriteFileHeader(file); // Timestamp der Aufzeichnung unser_time_t tmpTime = libendian::ConvertEndianess<false>::fromNative(save_time); file.WriteRawData(&tmpTime, sizeof(tmpTime)); // Mapname file.WriteShortString(mapName); WritePlayerData(file); WriteGGS(file); // Start-GF file.WriteUnsignedInt(start_gf); // Serialisiertes Spielzeug reinschreiben sgd.WriteToFile(file); return true; }
/** * * @author OLiver */ bool Replay::WriteHeader(const std::string& filename) { // Datei öffnen if(!file.Open(filename.c_str(),OFM_WRITE)) return false; Replay::filename = filename; // Versionszeug schreiben WriteVersion(file,6,REPLAY_SIGNATURE,REPLAY_VERSION); // Timestamp der Aufzeichnung (TODO: Little/Big Endian unterscheidung) file.WriteRawData(&save_time,8); /// NWF-Länge file.WriteUnsignedShort(nwf_length); /// Zufallsgeneratorinitialisierung file.WriteUnsignedInt(random_init); /// Pathfinding-Results hier drin? file.WriteUnsignedChar(pathfinding_results ? 1 : 0); // Position merken für End-GF last_gf_file_pos = file.Tell(); /// End-GF (erstmal nur 0, wird dann im Spiel immer geupdatet) file.WriteUnsignedInt(last_gf); // Anzahl Spieler file.WriteUnsignedChar(player_count); // Spielerdaten WritePlayerData(file); // GGS WriteGGS(file); // Map-Type file.WriteUnsignedShort(static_cast<unsigned short>(map_type)); switch(map_type) { default: break; case MAPTYPE_OLDMAP: { // Map-Daten file.WriteUnsignedInt(map_length); file.WriteUnsignedInt(map_zip_length); file.WriteRawData(map_data,map_zip_length); } break; case MAPTYPE_SAVEGAME: { // Savegame speichern if(!savegame->Save(file)) return false; } break; } // Mapname file.WriteShortString(map_name); // bei ungerader 4er position aufrunden //while(file.Tell() % 4) // file.WriteSignedChar(0); // Alles sofort reinschreiben file.Flush(); gf_file_pos = 0; // Create File for pathfinding results if(pathfinding_results) pf_file.Open((filename + "_res").c_str(),OFM_WRITE); return true; }