pub struct GameStateSerializer { /* private fields */ }Expand description
Game state serializer with compression and format options.
Implementations§
Source§impl GameStateSerializer
impl GameStateSerializer
Sourcepub fn new() -> Self
pub fn new() -> Self
Creates a new game state serializer with JSON format.
Examples found in repository?
examples/serialization_demo.rs (line 92)
39fn main() {
40 println!("💾 Serialization System Demonstration");
41 println!("=====================================");
42
43 // === BASIC SERIALIZATION ===
44 println!("\n📄 Basic Game State Serialization");
45 println!("----------------------------------");
46
47 // Create a basic game state
48 let mut game_state = GameStateSerializer::create_basic_game_state("My First Save".to_string());
49
50 // Add some custom data
51 game_state.progress.level = 5;
52 game_state.progress.experience = 2500;
53 game_state.progress.playtime_seconds = 3600; // 1 hour
54 game_state.progress.levels_completed.push("tutorial".to_string());
55 game_state.progress.levels_completed.push("forest_1".to_string());
56
57 // Add an achievement
58 game_state.progress.achievements.push(Achievement {
59 id: "first_level".to_string(),
60 name: "First Steps".to_string(),
61 description: "Complete your first level".to_string(),
62 unlocked_at: 1234567890,
63 points: 50,
64 });
65
66 // Update game statistics
67 game_state.progress.statistics.entities_defeated = 25;
68 game_state.progress.statistics.distance_moved = 1500.0;
69 game_state.progress.statistics.items_collected = 12;
70
71 // Add custom metadata tags
72 game_state.metadata = game_state.metadata
73 .with_tag("demo".to_string())
74 .with_tag("tutorial_complete".to_string())
75 .with_custom("difficulty".to_string(), "normal".to_string())
76 .with_custom("character_class".to_string(), "warrior".to_string());
77
78 println!("Created game state:");
79 println!(" Player Level: {}", game_state.progress.level);
80 println!(" Experience: {}", game_state.progress.experience);
81 println!(" Playtime: {}h {}m",
82 game_state.progress.playtime_seconds / 3600,
83 (game_state.progress.playtime_seconds % 3600) / 60);
84 println!(" Achievements: {}", game_state.progress.achievements.len());
85 println!(" Levels Completed: {}", game_state.progress.levels_completed.len());
86
87 // === MULTIPLE FORMATS DEMONSTRATION ===
88 println!("\n🔄 Multiple Serialization Formats");
89 println!("----------------------------------");
90
91 // Test JSON serialization
92 let json_serializer = GameStateSerializer::new()
93 .with_format(SerializationFormat::Json);
94
95 let json_data = json_serializer.serialize_game_state(&game_state)
96 .expect("Failed to serialize to JSON");
97 println!("JSON serialization: {} bytes", json_data.len());
98
99 // Test Binary serialization
100 let binary_serializer = GameStateSerializer::new()
101 .with_format(SerializationFormat::Binary);
102
103 let binary_data = binary_serializer.serialize_game_state(&game_state)
104 .expect("Failed to serialize to binary");
105 println!("Binary serialization: {} bytes", binary_data.len());
106
107 // Test RON serialization
108 let ron_serializer = GameStateSerializer::new()
109 .with_format(SerializationFormat::Ron);
110
111 let ron_data = ron_serializer.serialize_game_state(&game_state)
112 .expect("Failed to serialize to RON");
113 println!("RON serialization: {} bytes", ron_data.len());
114
115 // Verify deserialization works
116 let json_restored = json_serializer.deserialize_game_state(&json_data)
117 .expect("Failed to deserialize JSON");
118 let binary_restored = binary_serializer.deserialize_game_state(&binary_data)
119 .expect("Failed to deserialize binary");
120 let ron_restored = ron_serializer.deserialize_game_state(&ron_data)
121 .expect("Failed to deserialize RON");
122
123 println!("✅ All formats successfully roundtrip serialized");
124 println!(" JSON player level: {}", json_restored.progress.level);
125 println!(" Binary player level: {}", binary_restored.progress.level);
126 println!(" RON player level: {}", ron_restored.progress.level);
127
128 // === COMPRESSION DEMONSTRATION ===
129 println!("\n🗜️ Compression");
130 println!("--------------");
131
132 let uncompressed_serializer = GameStateSerializer::new()
133 .with_compression(false);
134 let compressed_serializer = GameStateSerializer::new()
135 .with_compression(true);
136
137 let uncompressed = uncompressed_serializer.serialize_game_state(&game_state)
138 .expect("Failed to serialize uncompressed");
139 let compressed = compressed_serializer.serialize_game_state(&game_state)
140 .expect("Failed to serialize compressed");
141
142 println!("Uncompressed size: {} bytes", uncompressed.len());
143 println!("Compressed size: {} bytes", compressed.len());
144 let ratio = if compressed.len() < uncompressed.len() {
145 ((uncompressed.len() - compressed.len()) as f64 / uncompressed.len() as f64) * 100.0
146 } else {
147 // No compression achieved (mock compression adds overhead)
148 -((compressed.len() - uncompressed.len()) as f64 / uncompressed.len() as f64) * 100.0
149 };
150 println!("Compression ratio: {:.1}%", ratio);
151
152 // Verify compressed data can be decompressed
153 let decompressed = compressed_serializer.deserialize_game_state(&compressed)
154 .expect("Failed to decompress data");
155 println!("✅ Compression/decompression successful");
156 println!(" Restored player level: {}", decompressed.progress.level);
157
158 // === SAVE MANAGER DEMONSTRATION ===
159 println!("\n💾 Save Manager");
160 println!("---------------");
161
162 // Create a temporary directory for saves (in real usage, this would be a persistent directory)
163 let temp_dir = std::env::temp_dir().join("tiles_tools_demo_saves");
164 std::fs::create_dir_all(&temp_dir).expect("Failed to create saves directory");
165
166 let save_manager = SaveManager::new(&temp_dir)
167 .with_serializer(GameStateSerializer::new().with_compression(true));
168
169 // Save the game state
170 save_manager.save_game_state("demo_save", &game_state)
171 .expect("Failed to save game state");
172 println!("✅ Game saved as 'demo_save'");
173
174 // Create additional saves with different states
175 let mut quick_save = game_state.clone();
176 quick_save.metadata.description = "Quick Save - Before Boss Fight".to_string();
177 quick_save.progress.level = 6;
178 quick_save.progress.experience = 3000;
179
180 save_manager.save_game_state("quick_save", &quick_save)
181 .expect("Failed to save quick save");
182
183 let mut checkpoint = game_state.clone();
184 checkpoint.metadata.description = "Checkpoint - Forest Entry".to_string();
185 checkpoint.progress.level = 4;
186 checkpoint.progress.experience = 1800;
187 checkpoint.metadata = checkpoint.metadata.with_tag("checkpoint".to_string());
188
189 save_manager.save_game_state("checkpoint_1", &checkpoint)
190 .expect("Failed to save checkpoint");
191
192 // List all saves
193 println!("\n📂 Available Saves:");
194 let saves = save_manager.list_saves()
195 .expect("Failed to list saves");
196 for save_name in &saves {
197 println!(" - {}", save_name);
198 }
199
200 // Get detailed save information
201 println!("\n📊 Save Information:");
202 let saves_info = save_manager.get_saves_info()
203 .expect("Failed to get saves info");
204
205 for (name, metadata) in &saves_info {
206 let _created_time = std::time::SystemTime::UNIX_EPOCH + std::time::Duration::from_secs(metadata.created_at);
207 println!(" Save: {}", name);
208 println!(" Description: {}", metadata.description);
209 println!(" Size: {} bytes", metadata.size_bytes);
210 println!(" Version: {}.{}.{}", metadata.version.major, metadata.version.minor, metadata.version.patch);
211 println!(" Compressed: {}", metadata.compressed);
212 println!(" Tags: {:?}", metadata.tags);
213 if !metadata.custom.is_empty() {
214 println!(" Custom data: {:?}", metadata.custom);
215 }
216 println!();
217 }
218
219 // Load a specific save
220 println!("🔄 Loading save 'demo_save'...");
221 let loaded_state = save_manager.load_game_state("demo_save")
222 .expect("Failed to load save");
223
224 println!("✅ Save loaded successfully:");
225 println!(" Player Level: {}", loaded_state.progress.level);
226 println!(" Experience: {}", loaded_state.progress.experience);
227 println!(" Description: {}", loaded_state.metadata.description);
228 println!(" Achievements: {}", loaded_state.progress.achievements.len());
229
230 // === VERSION COMPATIBILITY ===
231 println!("\n🔄 Version Compatibility");
232 println!("------------------------");
233
234 let current_version = SaveVersion::current();
235 let older_version = SaveVersion::new(1, 0, 0);
236 let newer_version = SaveVersion::new(1, 1, 0);
237 let incompatible_version = SaveVersion::new(2, 0, 0);
238
239 println!("Current version: {}.{}.{}", current_version.major, current_version.minor, current_version.patch);
240 println!("Older version compatibility: {}", current_version.is_compatible_with(&older_version));
241 println!("Newer version compatibility: {}", older_version.is_compatible_with(&newer_version));
242 println!("Incompatible version compatibility: {}", current_version.is_compatible_with(&incompatible_version));
243
244 // === CONFIGURATION MANAGEMENT ===
245 println!("\n⚙️ Configuration Management");
246 println!("---------------------------");
247
248 let config_path = temp_dir.join("game_config.json");
249 let config_manager = ConfigManager::new(&config_path);
250
251 // Create custom configuration
252 let mut custom_config = GameConfig::default();
253 custom_config.difficulty = 3;
254 custom_config.graphics.resolution_width = 2560;
255 custom_config.graphics.resolution_height = 1440;
256 custom_config.graphics.quality_level = 3;
257 custom_config.audio.master_volume = 0.8;
258 custom_config.gameplay.auto_save_interval = 600; // 10 minutes
259
260 // Add custom keybindings
261 custom_config.controls.key_bindings.insert("sprint".to_string(), "Shift".to_string());
262 custom_config.controls.key_bindings.insert("inventory".to_string(), "Tab".to_string());
263
264 // Save configuration
265 config_manager.save_config(&custom_config)
266 .expect("Failed to save configuration");
267 println!("✅ Configuration saved");
268
269 // Load configuration
270 let loaded_config = config_manager.load_config()
271 .expect("Failed to load configuration");
272 println!("✅ Configuration loaded:");
273 println!(" Difficulty: {}", loaded_config.difficulty);
274 println!(" Resolution: {}x{}", loaded_config.graphics.resolution_width, loaded_config.graphics.resolution_height);
275 println!(" Master Volume: {}", loaded_config.audio.master_volume);
276 println!(" Auto-save Interval: {}s", loaded_config.gameplay.auto_save_interval);
277 println!(" Key bindings: {}", loaded_config.controls.key_bindings.len());
278
279 // === PLAYER PROGRESS TRACKING ===
280 println!("\n👤 Player Progress Tracking");
281 println!("---------------------------");
282
283 let mut progress = PlayerProgress::default();
284
285 // Simulate some gameplay progress
286 progress.level = 8;
287 progress.experience = 5500;
288 progress.playtime_seconds = 7200; // 2 hours
289
290 // Add completed levels
291 progress.levels_completed.extend([
292 "tutorial".to_string(),
293 "forest_1".to_string(),
294 "forest_2".to_string(),
295 "caves_1".to_string(),
296 ]);
297
298 // Add achievements
299 progress.achievements.extend([
300 Achievement {
301 id: "level_5".to_string(),
302 name: "Experienced".to_string(),
303 description: "Reach level 5".to_string(),
304 unlocked_at: 1234567890,
305 points: 100,
306 },
307 Achievement {
308 id: "cave_explorer".to_string(),
309 name: "Cave Explorer".to_string(),
310 description: "Complete the cave levels".to_string(),
311 unlocked_at: 1234568000,
312 points: 150,
313 },
314 ]);
315
316 // Update statistics
317 progress.statistics.entities_defeated = 150;
318 progress.statistics.distance_moved = 5000.0;
319 progress.statistics.items_collected = 45;
320 progress.statistics.spells_cast = 80;
321 progress.statistics.deaths = 3;
322 progress.statistics.levels_completed_count = 4;
323
324 // Serialize progress
325 let _progress_json = serde_json::to_string_pretty(&progress)
326 .expect("Failed to serialize progress");
327
328 println!("Player Progress Summary:");
329 println!(" Level: {}", progress.level);
330 println!(" Experience: {}", progress.experience);
331 println!(" Playtime: {}h {}m", progress.playtime_seconds / 3600, (progress.playtime_seconds % 3600) / 60);
332 println!(" Levels Completed: {}", progress.levels_completed.len());
333 println!(" Achievements: {} (total {} points)",
334 progress.achievements.len(),
335 progress.achievements.iter().map(|a| a.points).sum::<u32>());
336 println!(" Statistics:");
337 println!(" Entities Defeated: {}", progress.statistics.entities_defeated);
338 println!(" Distance Moved: {:.1}m", progress.statistics.distance_moved);
339 println!(" Items Collected: {}", progress.statistics.items_collected);
340 println!(" Spells Cast: {}", progress.statistics.spells_cast);
341 println!(" Deaths: {}", progress.statistics.deaths);
342
343 // === CLEANUP DEMONSTRATION ===
344 println!("\n🧹 Cleanup");
345 println!("----------");
346
347 // Demonstrate save deletion
348 save_manager.delete_save("checkpoint_1")
349 .expect("Failed to delete save");
350 println!("✅ Deleted checkpoint_1 save");
351
352 let remaining_saves = save_manager.list_saves()
353 .expect("Failed to list remaining saves");
354 println!("Remaining saves: {:?}", remaining_saves);
355
356 // Clean up temporary directory
357 std::fs::remove_dir_all(&temp_dir).ok();
358 println!("✅ Cleaned up temporary files");
359
360 // === PERFORMANCE DEMONSTRATION ===
361 println!("\n⚡ Performance Test");
362 println!("------------------");
363
364 let mut large_state = game_state.clone();
365
366 // Add lots of custom data to simulate a large game state
367 for i in 0..100 {
368 large_state.custom_data.insert(
369 format!("large_data_{}", i),
370 vec![0u8; 1024] // 1KB per entry
371 );
372 }
373
374 let start_time = std::time::Instant::now();
375 let serialized_large = GameStateSerializer::new()
376 .with_compression(true)
377 .serialize_game_state(&large_state)
378 .expect("Failed to serialize large state");
379 let serialize_duration = start_time.elapsed();
380
381 let start_time = std::time::Instant::now();
382 let _deserialized_large = GameStateSerializer::new()
383 .with_compression(true)
384 .deserialize_game_state(&serialized_large)
385 .expect("Failed to deserialize large state");
386 let deserialize_duration = start_time.elapsed();
387
388 println!("Large game state performance:");
389 println!(" Size: {} KB", serialized_large.len() / 1024);
390 println!(" Serialize time: {:.2}ms", serialize_duration.as_secs_f64() * 1000.0);
391 println!(" Deserialize time: {:.2}ms", deserialize_duration.as_secs_f64() * 1000.0);
392
393 println!("\n✨ Serialization Demo Complete!");
394 println!("\nKey features demonstrated:");
395 println!("• Multiple serialization formats (JSON, Binary, RON)");
396 println!("• Compression support with size reduction");
397 println!("• Save file management with metadata");
398 println!("• Configuration persistence");
399 println!("• Player progress tracking");
400 println!("• Version compatibility checking");
401 println!("• Error handling and recovery");
402 println!("• Performance optimization");
403}Sourcepub fn with_format(self, format: SerializationFormat) -> Self
pub fn with_format(self, format: SerializationFormat) -> Self
Sets the serialization format.
Examples found in repository?
examples/serialization_demo.rs (line 93)
39fn main() {
40 println!("💾 Serialization System Demonstration");
41 println!("=====================================");
42
43 // === BASIC SERIALIZATION ===
44 println!("\n📄 Basic Game State Serialization");
45 println!("----------------------------------");
46
47 // Create a basic game state
48 let mut game_state = GameStateSerializer::create_basic_game_state("My First Save".to_string());
49
50 // Add some custom data
51 game_state.progress.level = 5;
52 game_state.progress.experience = 2500;
53 game_state.progress.playtime_seconds = 3600; // 1 hour
54 game_state.progress.levels_completed.push("tutorial".to_string());
55 game_state.progress.levels_completed.push("forest_1".to_string());
56
57 // Add an achievement
58 game_state.progress.achievements.push(Achievement {
59 id: "first_level".to_string(),
60 name: "First Steps".to_string(),
61 description: "Complete your first level".to_string(),
62 unlocked_at: 1234567890,
63 points: 50,
64 });
65
66 // Update game statistics
67 game_state.progress.statistics.entities_defeated = 25;
68 game_state.progress.statistics.distance_moved = 1500.0;
69 game_state.progress.statistics.items_collected = 12;
70
71 // Add custom metadata tags
72 game_state.metadata = game_state.metadata
73 .with_tag("demo".to_string())
74 .with_tag("tutorial_complete".to_string())
75 .with_custom("difficulty".to_string(), "normal".to_string())
76 .with_custom("character_class".to_string(), "warrior".to_string());
77
78 println!("Created game state:");
79 println!(" Player Level: {}", game_state.progress.level);
80 println!(" Experience: {}", game_state.progress.experience);
81 println!(" Playtime: {}h {}m",
82 game_state.progress.playtime_seconds / 3600,
83 (game_state.progress.playtime_seconds % 3600) / 60);
84 println!(" Achievements: {}", game_state.progress.achievements.len());
85 println!(" Levels Completed: {}", game_state.progress.levels_completed.len());
86
87 // === MULTIPLE FORMATS DEMONSTRATION ===
88 println!("\n🔄 Multiple Serialization Formats");
89 println!("----------------------------------");
90
91 // Test JSON serialization
92 let json_serializer = GameStateSerializer::new()
93 .with_format(SerializationFormat::Json);
94
95 let json_data = json_serializer.serialize_game_state(&game_state)
96 .expect("Failed to serialize to JSON");
97 println!("JSON serialization: {} bytes", json_data.len());
98
99 // Test Binary serialization
100 let binary_serializer = GameStateSerializer::new()
101 .with_format(SerializationFormat::Binary);
102
103 let binary_data = binary_serializer.serialize_game_state(&game_state)
104 .expect("Failed to serialize to binary");
105 println!("Binary serialization: {} bytes", binary_data.len());
106
107 // Test RON serialization
108 let ron_serializer = GameStateSerializer::new()
109 .with_format(SerializationFormat::Ron);
110
111 let ron_data = ron_serializer.serialize_game_state(&game_state)
112 .expect("Failed to serialize to RON");
113 println!("RON serialization: {} bytes", ron_data.len());
114
115 // Verify deserialization works
116 let json_restored = json_serializer.deserialize_game_state(&json_data)
117 .expect("Failed to deserialize JSON");
118 let binary_restored = binary_serializer.deserialize_game_state(&binary_data)
119 .expect("Failed to deserialize binary");
120 let ron_restored = ron_serializer.deserialize_game_state(&ron_data)
121 .expect("Failed to deserialize RON");
122
123 println!("✅ All formats successfully roundtrip serialized");
124 println!(" JSON player level: {}", json_restored.progress.level);
125 println!(" Binary player level: {}", binary_restored.progress.level);
126 println!(" RON player level: {}", ron_restored.progress.level);
127
128 // === COMPRESSION DEMONSTRATION ===
129 println!("\n🗜️ Compression");
130 println!("--------------");
131
132 let uncompressed_serializer = GameStateSerializer::new()
133 .with_compression(false);
134 let compressed_serializer = GameStateSerializer::new()
135 .with_compression(true);
136
137 let uncompressed = uncompressed_serializer.serialize_game_state(&game_state)
138 .expect("Failed to serialize uncompressed");
139 let compressed = compressed_serializer.serialize_game_state(&game_state)
140 .expect("Failed to serialize compressed");
141
142 println!("Uncompressed size: {} bytes", uncompressed.len());
143 println!("Compressed size: {} bytes", compressed.len());
144 let ratio = if compressed.len() < uncompressed.len() {
145 ((uncompressed.len() - compressed.len()) as f64 / uncompressed.len() as f64) * 100.0
146 } else {
147 // No compression achieved (mock compression adds overhead)
148 -((compressed.len() - uncompressed.len()) as f64 / uncompressed.len() as f64) * 100.0
149 };
150 println!("Compression ratio: {:.1}%", ratio);
151
152 // Verify compressed data can be decompressed
153 let decompressed = compressed_serializer.deserialize_game_state(&compressed)
154 .expect("Failed to decompress data");
155 println!("✅ Compression/decompression successful");
156 println!(" Restored player level: {}", decompressed.progress.level);
157
158 // === SAVE MANAGER DEMONSTRATION ===
159 println!("\n💾 Save Manager");
160 println!("---------------");
161
162 // Create a temporary directory for saves (in real usage, this would be a persistent directory)
163 let temp_dir = std::env::temp_dir().join("tiles_tools_demo_saves");
164 std::fs::create_dir_all(&temp_dir).expect("Failed to create saves directory");
165
166 let save_manager = SaveManager::new(&temp_dir)
167 .with_serializer(GameStateSerializer::new().with_compression(true));
168
169 // Save the game state
170 save_manager.save_game_state("demo_save", &game_state)
171 .expect("Failed to save game state");
172 println!("✅ Game saved as 'demo_save'");
173
174 // Create additional saves with different states
175 let mut quick_save = game_state.clone();
176 quick_save.metadata.description = "Quick Save - Before Boss Fight".to_string();
177 quick_save.progress.level = 6;
178 quick_save.progress.experience = 3000;
179
180 save_manager.save_game_state("quick_save", &quick_save)
181 .expect("Failed to save quick save");
182
183 let mut checkpoint = game_state.clone();
184 checkpoint.metadata.description = "Checkpoint - Forest Entry".to_string();
185 checkpoint.progress.level = 4;
186 checkpoint.progress.experience = 1800;
187 checkpoint.metadata = checkpoint.metadata.with_tag("checkpoint".to_string());
188
189 save_manager.save_game_state("checkpoint_1", &checkpoint)
190 .expect("Failed to save checkpoint");
191
192 // List all saves
193 println!("\n📂 Available Saves:");
194 let saves = save_manager.list_saves()
195 .expect("Failed to list saves");
196 for save_name in &saves {
197 println!(" - {}", save_name);
198 }
199
200 // Get detailed save information
201 println!("\n📊 Save Information:");
202 let saves_info = save_manager.get_saves_info()
203 .expect("Failed to get saves info");
204
205 for (name, metadata) in &saves_info {
206 let _created_time = std::time::SystemTime::UNIX_EPOCH + std::time::Duration::from_secs(metadata.created_at);
207 println!(" Save: {}", name);
208 println!(" Description: {}", metadata.description);
209 println!(" Size: {} bytes", metadata.size_bytes);
210 println!(" Version: {}.{}.{}", metadata.version.major, metadata.version.minor, metadata.version.patch);
211 println!(" Compressed: {}", metadata.compressed);
212 println!(" Tags: {:?}", metadata.tags);
213 if !metadata.custom.is_empty() {
214 println!(" Custom data: {:?}", metadata.custom);
215 }
216 println!();
217 }
218
219 // Load a specific save
220 println!("🔄 Loading save 'demo_save'...");
221 let loaded_state = save_manager.load_game_state("demo_save")
222 .expect("Failed to load save");
223
224 println!("✅ Save loaded successfully:");
225 println!(" Player Level: {}", loaded_state.progress.level);
226 println!(" Experience: {}", loaded_state.progress.experience);
227 println!(" Description: {}", loaded_state.metadata.description);
228 println!(" Achievements: {}", loaded_state.progress.achievements.len());
229
230 // === VERSION COMPATIBILITY ===
231 println!("\n🔄 Version Compatibility");
232 println!("------------------------");
233
234 let current_version = SaveVersion::current();
235 let older_version = SaveVersion::new(1, 0, 0);
236 let newer_version = SaveVersion::new(1, 1, 0);
237 let incompatible_version = SaveVersion::new(2, 0, 0);
238
239 println!("Current version: {}.{}.{}", current_version.major, current_version.minor, current_version.patch);
240 println!("Older version compatibility: {}", current_version.is_compatible_with(&older_version));
241 println!("Newer version compatibility: {}", older_version.is_compatible_with(&newer_version));
242 println!("Incompatible version compatibility: {}", current_version.is_compatible_with(&incompatible_version));
243
244 // === CONFIGURATION MANAGEMENT ===
245 println!("\n⚙️ Configuration Management");
246 println!("---------------------------");
247
248 let config_path = temp_dir.join("game_config.json");
249 let config_manager = ConfigManager::new(&config_path);
250
251 // Create custom configuration
252 let mut custom_config = GameConfig::default();
253 custom_config.difficulty = 3;
254 custom_config.graphics.resolution_width = 2560;
255 custom_config.graphics.resolution_height = 1440;
256 custom_config.graphics.quality_level = 3;
257 custom_config.audio.master_volume = 0.8;
258 custom_config.gameplay.auto_save_interval = 600; // 10 minutes
259
260 // Add custom keybindings
261 custom_config.controls.key_bindings.insert("sprint".to_string(), "Shift".to_string());
262 custom_config.controls.key_bindings.insert("inventory".to_string(), "Tab".to_string());
263
264 // Save configuration
265 config_manager.save_config(&custom_config)
266 .expect("Failed to save configuration");
267 println!("✅ Configuration saved");
268
269 // Load configuration
270 let loaded_config = config_manager.load_config()
271 .expect("Failed to load configuration");
272 println!("✅ Configuration loaded:");
273 println!(" Difficulty: {}", loaded_config.difficulty);
274 println!(" Resolution: {}x{}", loaded_config.graphics.resolution_width, loaded_config.graphics.resolution_height);
275 println!(" Master Volume: {}", loaded_config.audio.master_volume);
276 println!(" Auto-save Interval: {}s", loaded_config.gameplay.auto_save_interval);
277 println!(" Key bindings: {}", loaded_config.controls.key_bindings.len());
278
279 // === PLAYER PROGRESS TRACKING ===
280 println!("\n👤 Player Progress Tracking");
281 println!("---------------------------");
282
283 let mut progress = PlayerProgress::default();
284
285 // Simulate some gameplay progress
286 progress.level = 8;
287 progress.experience = 5500;
288 progress.playtime_seconds = 7200; // 2 hours
289
290 // Add completed levels
291 progress.levels_completed.extend([
292 "tutorial".to_string(),
293 "forest_1".to_string(),
294 "forest_2".to_string(),
295 "caves_1".to_string(),
296 ]);
297
298 // Add achievements
299 progress.achievements.extend([
300 Achievement {
301 id: "level_5".to_string(),
302 name: "Experienced".to_string(),
303 description: "Reach level 5".to_string(),
304 unlocked_at: 1234567890,
305 points: 100,
306 },
307 Achievement {
308 id: "cave_explorer".to_string(),
309 name: "Cave Explorer".to_string(),
310 description: "Complete the cave levels".to_string(),
311 unlocked_at: 1234568000,
312 points: 150,
313 },
314 ]);
315
316 // Update statistics
317 progress.statistics.entities_defeated = 150;
318 progress.statistics.distance_moved = 5000.0;
319 progress.statistics.items_collected = 45;
320 progress.statistics.spells_cast = 80;
321 progress.statistics.deaths = 3;
322 progress.statistics.levels_completed_count = 4;
323
324 // Serialize progress
325 let _progress_json = serde_json::to_string_pretty(&progress)
326 .expect("Failed to serialize progress");
327
328 println!("Player Progress Summary:");
329 println!(" Level: {}", progress.level);
330 println!(" Experience: {}", progress.experience);
331 println!(" Playtime: {}h {}m", progress.playtime_seconds / 3600, (progress.playtime_seconds % 3600) / 60);
332 println!(" Levels Completed: {}", progress.levels_completed.len());
333 println!(" Achievements: {} (total {} points)",
334 progress.achievements.len(),
335 progress.achievements.iter().map(|a| a.points).sum::<u32>());
336 println!(" Statistics:");
337 println!(" Entities Defeated: {}", progress.statistics.entities_defeated);
338 println!(" Distance Moved: {:.1}m", progress.statistics.distance_moved);
339 println!(" Items Collected: {}", progress.statistics.items_collected);
340 println!(" Spells Cast: {}", progress.statistics.spells_cast);
341 println!(" Deaths: {}", progress.statistics.deaths);
342
343 // === CLEANUP DEMONSTRATION ===
344 println!("\n🧹 Cleanup");
345 println!("----------");
346
347 // Demonstrate save deletion
348 save_manager.delete_save("checkpoint_1")
349 .expect("Failed to delete save");
350 println!("✅ Deleted checkpoint_1 save");
351
352 let remaining_saves = save_manager.list_saves()
353 .expect("Failed to list remaining saves");
354 println!("Remaining saves: {:?}", remaining_saves);
355
356 // Clean up temporary directory
357 std::fs::remove_dir_all(&temp_dir).ok();
358 println!("✅ Cleaned up temporary files");
359
360 // === PERFORMANCE DEMONSTRATION ===
361 println!("\n⚡ Performance Test");
362 println!("------------------");
363
364 let mut large_state = game_state.clone();
365
366 // Add lots of custom data to simulate a large game state
367 for i in 0..100 {
368 large_state.custom_data.insert(
369 format!("large_data_{}", i),
370 vec![0u8; 1024] // 1KB per entry
371 );
372 }
373
374 let start_time = std::time::Instant::now();
375 let serialized_large = GameStateSerializer::new()
376 .with_compression(true)
377 .serialize_game_state(&large_state)
378 .expect("Failed to serialize large state");
379 let serialize_duration = start_time.elapsed();
380
381 let start_time = std::time::Instant::now();
382 let _deserialized_large = GameStateSerializer::new()
383 .with_compression(true)
384 .deserialize_game_state(&serialized_large)
385 .expect("Failed to deserialize large state");
386 let deserialize_duration = start_time.elapsed();
387
388 println!("Large game state performance:");
389 println!(" Size: {} KB", serialized_large.len() / 1024);
390 println!(" Serialize time: {:.2}ms", serialize_duration.as_secs_f64() * 1000.0);
391 println!(" Deserialize time: {:.2}ms", deserialize_duration.as_secs_f64() * 1000.0);
392
393 println!("\n✨ Serialization Demo Complete!");
394 println!("\nKey features demonstrated:");
395 println!("• Multiple serialization formats (JSON, Binary, RON)");
396 println!("• Compression support with size reduction");
397 println!("• Save file management with metadata");
398 println!("• Configuration persistence");
399 println!("• Player progress tracking");
400 println!("• Version compatibility checking");
401 println!("• Error handling and recovery");
402 println!("• Performance optimization");
403}Sourcepub fn with_compression(self, compress: bool) -> Self
pub fn with_compression(self, compress: bool) -> Self
Enables or disables compression.
Examples found in repository?
examples/serialization_demo.rs (line 133)
39fn main() {
40 println!("💾 Serialization System Demonstration");
41 println!("=====================================");
42
43 // === BASIC SERIALIZATION ===
44 println!("\n📄 Basic Game State Serialization");
45 println!("----------------------------------");
46
47 // Create a basic game state
48 let mut game_state = GameStateSerializer::create_basic_game_state("My First Save".to_string());
49
50 // Add some custom data
51 game_state.progress.level = 5;
52 game_state.progress.experience = 2500;
53 game_state.progress.playtime_seconds = 3600; // 1 hour
54 game_state.progress.levels_completed.push("tutorial".to_string());
55 game_state.progress.levels_completed.push("forest_1".to_string());
56
57 // Add an achievement
58 game_state.progress.achievements.push(Achievement {
59 id: "first_level".to_string(),
60 name: "First Steps".to_string(),
61 description: "Complete your first level".to_string(),
62 unlocked_at: 1234567890,
63 points: 50,
64 });
65
66 // Update game statistics
67 game_state.progress.statistics.entities_defeated = 25;
68 game_state.progress.statistics.distance_moved = 1500.0;
69 game_state.progress.statistics.items_collected = 12;
70
71 // Add custom metadata tags
72 game_state.metadata = game_state.metadata
73 .with_tag("demo".to_string())
74 .with_tag("tutorial_complete".to_string())
75 .with_custom("difficulty".to_string(), "normal".to_string())
76 .with_custom("character_class".to_string(), "warrior".to_string());
77
78 println!("Created game state:");
79 println!(" Player Level: {}", game_state.progress.level);
80 println!(" Experience: {}", game_state.progress.experience);
81 println!(" Playtime: {}h {}m",
82 game_state.progress.playtime_seconds / 3600,
83 (game_state.progress.playtime_seconds % 3600) / 60);
84 println!(" Achievements: {}", game_state.progress.achievements.len());
85 println!(" Levels Completed: {}", game_state.progress.levels_completed.len());
86
87 // === MULTIPLE FORMATS DEMONSTRATION ===
88 println!("\n🔄 Multiple Serialization Formats");
89 println!("----------------------------------");
90
91 // Test JSON serialization
92 let json_serializer = GameStateSerializer::new()
93 .with_format(SerializationFormat::Json);
94
95 let json_data = json_serializer.serialize_game_state(&game_state)
96 .expect("Failed to serialize to JSON");
97 println!("JSON serialization: {} bytes", json_data.len());
98
99 // Test Binary serialization
100 let binary_serializer = GameStateSerializer::new()
101 .with_format(SerializationFormat::Binary);
102
103 let binary_data = binary_serializer.serialize_game_state(&game_state)
104 .expect("Failed to serialize to binary");
105 println!("Binary serialization: {} bytes", binary_data.len());
106
107 // Test RON serialization
108 let ron_serializer = GameStateSerializer::new()
109 .with_format(SerializationFormat::Ron);
110
111 let ron_data = ron_serializer.serialize_game_state(&game_state)
112 .expect("Failed to serialize to RON");
113 println!("RON serialization: {} bytes", ron_data.len());
114
115 // Verify deserialization works
116 let json_restored = json_serializer.deserialize_game_state(&json_data)
117 .expect("Failed to deserialize JSON");
118 let binary_restored = binary_serializer.deserialize_game_state(&binary_data)
119 .expect("Failed to deserialize binary");
120 let ron_restored = ron_serializer.deserialize_game_state(&ron_data)
121 .expect("Failed to deserialize RON");
122
123 println!("✅ All formats successfully roundtrip serialized");
124 println!(" JSON player level: {}", json_restored.progress.level);
125 println!(" Binary player level: {}", binary_restored.progress.level);
126 println!(" RON player level: {}", ron_restored.progress.level);
127
128 // === COMPRESSION DEMONSTRATION ===
129 println!("\n🗜️ Compression");
130 println!("--------------");
131
132 let uncompressed_serializer = GameStateSerializer::new()
133 .with_compression(false);
134 let compressed_serializer = GameStateSerializer::new()
135 .with_compression(true);
136
137 let uncompressed = uncompressed_serializer.serialize_game_state(&game_state)
138 .expect("Failed to serialize uncompressed");
139 let compressed = compressed_serializer.serialize_game_state(&game_state)
140 .expect("Failed to serialize compressed");
141
142 println!("Uncompressed size: {} bytes", uncompressed.len());
143 println!("Compressed size: {} bytes", compressed.len());
144 let ratio = if compressed.len() < uncompressed.len() {
145 ((uncompressed.len() - compressed.len()) as f64 / uncompressed.len() as f64) * 100.0
146 } else {
147 // No compression achieved (mock compression adds overhead)
148 -((compressed.len() - uncompressed.len()) as f64 / uncompressed.len() as f64) * 100.0
149 };
150 println!("Compression ratio: {:.1}%", ratio);
151
152 // Verify compressed data can be decompressed
153 let decompressed = compressed_serializer.deserialize_game_state(&compressed)
154 .expect("Failed to decompress data");
155 println!("✅ Compression/decompression successful");
156 println!(" Restored player level: {}", decompressed.progress.level);
157
158 // === SAVE MANAGER DEMONSTRATION ===
159 println!("\n💾 Save Manager");
160 println!("---------------");
161
162 // Create a temporary directory for saves (in real usage, this would be a persistent directory)
163 let temp_dir = std::env::temp_dir().join("tiles_tools_demo_saves");
164 std::fs::create_dir_all(&temp_dir).expect("Failed to create saves directory");
165
166 let save_manager = SaveManager::new(&temp_dir)
167 .with_serializer(GameStateSerializer::new().with_compression(true));
168
169 // Save the game state
170 save_manager.save_game_state("demo_save", &game_state)
171 .expect("Failed to save game state");
172 println!("✅ Game saved as 'demo_save'");
173
174 // Create additional saves with different states
175 let mut quick_save = game_state.clone();
176 quick_save.metadata.description = "Quick Save - Before Boss Fight".to_string();
177 quick_save.progress.level = 6;
178 quick_save.progress.experience = 3000;
179
180 save_manager.save_game_state("quick_save", &quick_save)
181 .expect("Failed to save quick save");
182
183 let mut checkpoint = game_state.clone();
184 checkpoint.metadata.description = "Checkpoint - Forest Entry".to_string();
185 checkpoint.progress.level = 4;
186 checkpoint.progress.experience = 1800;
187 checkpoint.metadata = checkpoint.metadata.with_tag("checkpoint".to_string());
188
189 save_manager.save_game_state("checkpoint_1", &checkpoint)
190 .expect("Failed to save checkpoint");
191
192 // List all saves
193 println!("\n📂 Available Saves:");
194 let saves = save_manager.list_saves()
195 .expect("Failed to list saves");
196 for save_name in &saves {
197 println!(" - {}", save_name);
198 }
199
200 // Get detailed save information
201 println!("\n📊 Save Information:");
202 let saves_info = save_manager.get_saves_info()
203 .expect("Failed to get saves info");
204
205 for (name, metadata) in &saves_info {
206 let _created_time = std::time::SystemTime::UNIX_EPOCH + std::time::Duration::from_secs(metadata.created_at);
207 println!(" Save: {}", name);
208 println!(" Description: {}", metadata.description);
209 println!(" Size: {} bytes", metadata.size_bytes);
210 println!(" Version: {}.{}.{}", metadata.version.major, metadata.version.minor, metadata.version.patch);
211 println!(" Compressed: {}", metadata.compressed);
212 println!(" Tags: {:?}", metadata.tags);
213 if !metadata.custom.is_empty() {
214 println!(" Custom data: {:?}", metadata.custom);
215 }
216 println!();
217 }
218
219 // Load a specific save
220 println!("🔄 Loading save 'demo_save'...");
221 let loaded_state = save_manager.load_game_state("demo_save")
222 .expect("Failed to load save");
223
224 println!("✅ Save loaded successfully:");
225 println!(" Player Level: {}", loaded_state.progress.level);
226 println!(" Experience: {}", loaded_state.progress.experience);
227 println!(" Description: {}", loaded_state.metadata.description);
228 println!(" Achievements: {}", loaded_state.progress.achievements.len());
229
230 // === VERSION COMPATIBILITY ===
231 println!("\n🔄 Version Compatibility");
232 println!("------------------------");
233
234 let current_version = SaveVersion::current();
235 let older_version = SaveVersion::new(1, 0, 0);
236 let newer_version = SaveVersion::new(1, 1, 0);
237 let incompatible_version = SaveVersion::new(2, 0, 0);
238
239 println!("Current version: {}.{}.{}", current_version.major, current_version.minor, current_version.patch);
240 println!("Older version compatibility: {}", current_version.is_compatible_with(&older_version));
241 println!("Newer version compatibility: {}", older_version.is_compatible_with(&newer_version));
242 println!("Incompatible version compatibility: {}", current_version.is_compatible_with(&incompatible_version));
243
244 // === CONFIGURATION MANAGEMENT ===
245 println!("\n⚙️ Configuration Management");
246 println!("---------------------------");
247
248 let config_path = temp_dir.join("game_config.json");
249 let config_manager = ConfigManager::new(&config_path);
250
251 // Create custom configuration
252 let mut custom_config = GameConfig::default();
253 custom_config.difficulty = 3;
254 custom_config.graphics.resolution_width = 2560;
255 custom_config.graphics.resolution_height = 1440;
256 custom_config.graphics.quality_level = 3;
257 custom_config.audio.master_volume = 0.8;
258 custom_config.gameplay.auto_save_interval = 600; // 10 minutes
259
260 // Add custom keybindings
261 custom_config.controls.key_bindings.insert("sprint".to_string(), "Shift".to_string());
262 custom_config.controls.key_bindings.insert("inventory".to_string(), "Tab".to_string());
263
264 // Save configuration
265 config_manager.save_config(&custom_config)
266 .expect("Failed to save configuration");
267 println!("✅ Configuration saved");
268
269 // Load configuration
270 let loaded_config = config_manager.load_config()
271 .expect("Failed to load configuration");
272 println!("✅ Configuration loaded:");
273 println!(" Difficulty: {}", loaded_config.difficulty);
274 println!(" Resolution: {}x{}", loaded_config.graphics.resolution_width, loaded_config.graphics.resolution_height);
275 println!(" Master Volume: {}", loaded_config.audio.master_volume);
276 println!(" Auto-save Interval: {}s", loaded_config.gameplay.auto_save_interval);
277 println!(" Key bindings: {}", loaded_config.controls.key_bindings.len());
278
279 // === PLAYER PROGRESS TRACKING ===
280 println!("\n👤 Player Progress Tracking");
281 println!("---------------------------");
282
283 let mut progress = PlayerProgress::default();
284
285 // Simulate some gameplay progress
286 progress.level = 8;
287 progress.experience = 5500;
288 progress.playtime_seconds = 7200; // 2 hours
289
290 // Add completed levels
291 progress.levels_completed.extend([
292 "tutorial".to_string(),
293 "forest_1".to_string(),
294 "forest_2".to_string(),
295 "caves_1".to_string(),
296 ]);
297
298 // Add achievements
299 progress.achievements.extend([
300 Achievement {
301 id: "level_5".to_string(),
302 name: "Experienced".to_string(),
303 description: "Reach level 5".to_string(),
304 unlocked_at: 1234567890,
305 points: 100,
306 },
307 Achievement {
308 id: "cave_explorer".to_string(),
309 name: "Cave Explorer".to_string(),
310 description: "Complete the cave levels".to_string(),
311 unlocked_at: 1234568000,
312 points: 150,
313 },
314 ]);
315
316 // Update statistics
317 progress.statistics.entities_defeated = 150;
318 progress.statistics.distance_moved = 5000.0;
319 progress.statistics.items_collected = 45;
320 progress.statistics.spells_cast = 80;
321 progress.statistics.deaths = 3;
322 progress.statistics.levels_completed_count = 4;
323
324 // Serialize progress
325 let _progress_json = serde_json::to_string_pretty(&progress)
326 .expect("Failed to serialize progress");
327
328 println!("Player Progress Summary:");
329 println!(" Level: {}", progress.level);
330 println!(" Experience: {}", progress.experience);
331 println!(" Playtime: {}h {}m", progress.playtime_seconds / 3600, (progress.playtime_seconds % 3600) / 60);
332 println!(" Levels Completed: {}", progress.levels_completed.len());
333 println!(" Achievements: {} (total {} points)",
334 progress.achievements.len(),
335 progress.achievements.iter().map(|a| a.points).sum::<u32>());
336 println!(" Statistics:");
337 println!(" Entities Defeated: {}", progress.statistics.entities_defeated);
338 println!(" Distance Moved: {:.1}m", progress.statistics.distance_moved);
339 println!(" Items Collected: {}", progress.statistics.items_collected);
340 println!(" Spells Cast: {}", progress.statistics.spells_cast);
341 println!(" Deaths: {}", progress.statistics.deaths);
342
343 // === CLEANUP DEMONSTRATION ===
344 println!("\n🧹 Cleanup");
345 println!("----------");
346
347 // Demonstrate save deletion
348 save_manager.delete_save("checkpoint_1")
349 .expect("Failed to delete save");
350 println!("✅ Deleted checkpoint_1 save");
351
352 let remaining_saves = save_manager.list_saves()
353 .expect("Failed to list remaining saves");
354 println!("Remaining saves: {:?}", remaining_saves);
355
356 // Clean up temporary directory
357 std::fs::remove_dir_all(&temp_dir).ok();
358 println!("✅ Cleaned up temporary files");
359
360 // === PERFORMANCE DEMONSTRATION ===
361 println!("\n⚡ Performance Test");
362 println!("------------------");
363
364 let mut large_state = game_state.clone();
365
366 // Add lots of custom data to simulate a large game state
367 for i in 0..100 {
368 large_state.custom_data.insert(
369 format!("large_data_{}", i),
370 vec![0u8; 1024] // 1KB per entry
371 );
372 }
373
374 let start_time = std::time::Instant::now();
375 let serialized_large = GameStateSerializer::new()
376 .with_compression(true)
377 .serialize_game_state(&large_state)
378 .expect("Failed to serialize large state");
379 let serialize_duration = start_time.elapsed();
380
381 let start_time = std::time::Instant::now();
382 let _deserialized_large = GameStateSerializer::new()
383 .with_compression(true)
384 .deserialize_game_state(&serialized_large)
385 .expect("Failed to deserialize large state");
386 let deserialize_duration = start_time.elapsed();
387
388 println!("Large game state performance:");
389 println!(" Size: {} KB", serialized_large.len() / 1024);
390 println!(" Serialize time: {:.2}ms", serialize_duration.as_secs_f64() * 1000.0);
391 println!(" Deserialize time: {:.2}ms", deserialize_duration.as_secs_f64() * 1000.0);
392
393 println!("\n✨ Serialization Demo Complete!");
394 println!("\nKey features demonstrated:");
395 println!("• Multiple serialization formats (JSON, Binary, RON)");
396 println!("• Compression support with size reduction");
397 println!("• Save file management with metadata");
398 println!("• Configuration persistence");
399 println!("• Player progress tracking");
400 println!("• Version compatibility checking");
401 println!("• Error handling and recovery");
402 println!("• Performance optimization");
403}Sourcepub fn with_version(self, version: SaveVersion) -> Self
pub fn with_version(self, version: SaveVersion) -> Self
Sets a custom version.
Sourcepub fn serialize_game_state(
&self,
state: &SerializableGameState,
) -> Result<Vec<u8>, SerializationError>
pub fn serialize_game_state( &self, state: &SerializableGameState, ) -> Result<Vec<u8>, SerializationError>
Serializes a game state to bytes.
Examples found in repository?
examples/serialization_demo.rs (line 95)
39fn main() {
40 println!("💾 Serialization System Demonstration");
41 println!("=====================================");
42
43 // === BASIC SERIALIZATION ===
44 println!("\n📄 Basic Game State Serialization");
45 println!("----------------------------------");
46
47 // Create a basic game state
48 let mut game_state = GameStateSerializer::create_basic_game_state("My First Save".to_string());
49
50 // Add some custom data
51 game_state.progress.level = 5;
52 game_state.progress.experience = 2500;
53 game_state.progress.playtime_seconds = 3600; // 1 hour
54 game_state.progress.levels_completed.push("tutorial".to_string());
55 game_state.progress.levels_completed.push("forest_1".to_string());
56
57 // Add an achievement
58 game_state.progress.achievements.push(Achievement {
59 id: "first_level".to_string(),
60 name: "First Steps".to_string(),
61 description: "Complete your first level".to_string(),
62 unlocked_at: 1234567890,
63 points: 50,
64 });
65
66 // Update game statistics
67 game_state.progress.statistics.entities_defeated = 25;
68 game_state.progress.statistics.distance_moved = 1500.0;
69 game_state.progress.statistics.items_collected = 12;
70
71 // Add custom metadata tags
72 game_state.metadata = game_state.metadata
73 .with_tag("demo".to_string())
74 .with_tag("tutorial_complete".to_string())
75 .with_custom("difficulty".to_string(), "normal".to_string())
76 .with_custom("character_class".to_string(), "warrior".to_string());
77
78 println!("Created game state:");
79 println!(" Player Level: {}", game_state.progress.level);
80 println!(" Experience: {}", game_state.progress.experience);
81 println!(" Playtime: {}h {}m",
82 game_state.progress.playtime_seconds / 3600,
83 (game_state.progress.playtime_seconds % 3600) / 60);
84 println!(" Achievements: {}", game_state.progress.achievements.len());
85 println!(" Levels Completed: {}", game_state.progress.levels_completed.len());
86
87 // === MULTIPLE FORMATS DEMONSTRATION ===
88 println!("\n🔄 Multiple Serialization Formats");
89 println!("----------------------------------");
90
91 // Test JSON serialization
92 let json_serializer = GameStateSerializer::new()
93 .with_format(SerializationFormat::Json);
94
95 let json_data = json_serializer.serialize_game_state(&game_state)
96 .expect("Failed to serialize to JSON");
97 println!("JSON serialization: {} bytes", json_data.len());
98
99 // Test Binary serialization
100 let binary_serializer = GameStateSerializer::new()
101 .with_format(SerializationFormat::Binary);
102
103 let binary_data = binary_serializer.serialize_game_state(&game_state)
104 .expect("Failed to serialize to binary");
105 println!("Binary serialization: {} bytes", binary_data.len());
106
107 // Test RON serialization
108 let ron_serializer = GameStateSerializer::new()
109 .with_format(SerializationFormat::Ron);
110
111 let ron_data = ron_serializer.serialize_game_state(&game_state)
112 .expect("Failed to serialize to RON");
113 println!("RON serialization: {} bytes", ron_data.len());
114
115 // Verify deserialization works
116 let json_restored = json_serializer.deserialize_game_state(&json_data)
117 .expect("Failed to deserialize JSON");
118 let binary_restored = binary_serializer.deserialize_game_state(&binary_data)
119 .expect("Failed to deserialize binary");
120 let ron_restored = ron_serializer.deserialize_game_state(&ron_data)
121 .expect("Failed to deserialize RON");
122
123 println!("✅ All formats successfully roundtrip serialized");
124 println!(" JSON player level: {}", json_restored.progress.level);
125 println!(" Binary player level: {}", binary_restored.progress.level);
126 println!(" RON player level: {}", ron_restored.progress.level);
127
128 // === COMPRESSION DEMONSTRATION ===
129 println!("\n🗜️ Compression");
130 println!("--------------");
131
132 let uncompressed_serializer = GameStateSerializer::new()
133 .with_compression(false);
134 let compressed_serializer = GameStateSerializer::new()
135 .with_compression(true);
136
137 let uncompressed = uncompressed_serializer.serialize_game_state(&game_state)
138 .expect("Failed to serialize uncompressed");
139 let compressed = compressed_serializer.serialize_game_state(&game_state)
140 .expect("Failed to serialize compressed");
141
142 println!("Uncompressed size: {} bytes", uncompressed.len());
143 println!("Compressed size: {} bytes", compressed.len());
144 let ratio = if compressed.len() < uncompressed.len() {
145 ((uncompressed.len() - compressed.len()) as f64 / uncompressed.len() as f64) * 100.0
146 } else {
147 // No compression achieved (mock compression adds overhead)
148 -((compressed.len() - uncompressed.len()) as f64 / uncompressed.len() as f64) * 100.0
149 };
150 println!("Compression ratio: {:.1}%", ratio);
151
152 // Verify compressed data can be decompressed
153 let decompressed = compressed_serializer.deserialize_game_state(&compressed)
154 .expect("Failed to decompress data");
155 println!("✅ Compression/decompression successful");
156 println!(" Restored player level: {}", decompressed.progress.level);
157
158 // === SAVE MANAGER DEMONSTRATION ===
159 println!("\n💾 Save Manager");
160 println!("---------------");
161
162 // Create a temporary directory for saves (in real usage, this would be a persistent directory)
163 let temp_dir = std::env::temp_dir().join("tiles_tools_demo_saves");
164 std::fs::create_dir_all(&temp_dir).expect("Failed to create saves directory");
165
166 let save_manager = SaveManager::new(&temp_dir)
167 .with_serializer(GameStateSerializer::new().with_compression(true));
168
169 // Save the game state
170 save_manager.save_game_state("demo_save", &game_state)
171 .expect("Failed to save game state");
172 println!("✅ Game saved as 'demo_save'");
173
174 // Create additional saves with different states
175 let mut quick_save = game_state.clone();
176 quick_save.metadata.description = "Quick Save - Before Boss Fight".to_string();
177 quick_save.progress.level = 6;
178 quick_save.progress.experience = 3000;
179
180 save_manager.save_game_state("quick_save", &quick_save)
181 .expect("Failed to save quick save");
182
183 let mut checkpoint = game_state.clone();
184 checkpoint.metadata.description = "Checkpoint - Forest Entry".to_string();
185 checkpoint.progress.level = 4;
186 checkpoint.progress.experience = 1800;
187 checkpoint.metadata = checkpoint.metadata.with_tag("checkpoint".to_string());
188
189 save_manager.save_game_state("checkpoint_1", &checkpoint)
190 .expect("Failed to save checkpoint");
191
192 // List all saves
193 println!("\n📂 Available Saves:");
194 let saves = save_manager.list_saves()
195 .expect("Failed to list saves");
196 for save_name in &saves {
197 println!(" - {}", save_name);
198 }
199
200 // Get detailed save information
201 println!("\n📊 Save Information:");
202 let saves_info = save_manager.get_saves_info()
203 .expect("Failed to get saves info");
204
205 for (name, metadata) in &saves_info {
206 let _created_time = std::time::SystemTime::UNIX_EPOCH + std::time::Duration::from_secs(metadata.created_at);
207 println!(" Save: {}", name);
208 println!(" Description: {}", metadata.description);
209 println!(" Size: {} bytes", metadata.size_bytes);
210 println!(" Version: {}.{}.{}", metadata.version.major, metadata.version.minor, metadata.version.patch);
211 println!(" Compressed: {}", metadata.compressed);
212 println!(" Tags: {:?}", metadata.tags);
213 if !metadata.custom.is_empty() {
214 println!(" Custom data: {:?}", metadata.custom);
215 }
216 println!();
217 }
218
219 // Load a specific save
220 println!("🔄 Loading save 'demo_save'...");
221 let loaded_state = save_manager.load_game_state("demo_save")
222 .expect("Failed to load save");
223
224 println!("✅ Save loaded successfully:");
225 println!(" Player Level: {}", loaded_state.progress.level);
226 println!(" Experience: {}", loaded_state.progress.experience);
227 println!(" Description: {}", loaded_state.metadata.description);
228 println!(" Achievements: {}", loaded_state.progress.achievements.len());
229
230 // === VERSION COMPATIBILITY ===
231 println!("\n🔄 Version Compatibility");
232 println!("------------------------");
233
234 let current_version = SaveVersion::current();
235 let older_version = SaveVersion::new(1, 0, 0);
236 let newer_version = SaveVersion::new(1, 1, 0);
237 let incompatible_version = SaveVersion::new(2, 0, 0);
238
239 println!("Current version: {}.{}.{}", current_version.major, current_version.minor, current_version.patch);
240 println!("Older version compatibility: {}", current_version.is_compatible_with(&older_version));
241 println!("Newer version compatibility: {}", older_version.is_compatible_with(&newer_version));
242 println!("Incompatible version compatibility: {}", current_version.is_compatible_with(&incompatible_version));
243
244 // === CONFIGURATION MANAGEMENT ===
245 println!("\n⚙️ Configuration Management");
246 println!("---------------------------");
247
248 let config_path = temp_dir.join("game_config.json");
249 let config_manager = ConfigManager::new(&config_path);
250
251 // Create custom configuration
252 let mut custom_config = GameConfig::default();
253 custom_config.difficulty = 3;
254 custom_config.graphics.resolution_width = 2560;
255 custom_config.graphics.resolution_height = 1440;
256 custom_config.graphics.quality_level = 3;
257 custom_config.audio.master_volume = 0.8;
258 custom_config.gameplay.auto_save_interval = 600; // 10 minutes
259
260 // Add custom keybindings
261 custom_config.controls.key_bindings.insert("sprint".to_string(), "Shift".to_string());
262 custom_config.controls.key_bindings.insert("inventory".to_string(), "Tab".to_string());
263
264 // Save configuration
265 config_manager.save_config(&custom_config)
266 .expect("Failed to save configuration");
267 println!("✅ Configuration saved");
268
269 // Load configuration
270 let loaded_config = config_manager.load_config()
271 .expect("Failed to load configuration");
272 println!("✅ Configuration loaded:");
273 println!(" Difficulty: {}", loaded_config.difficulty);
274 println!(" Resolution: {}x{}", loaded_config.graphics.resolution_width, loaded_config.graphics.resolution_height);
275 println!(" Master Volume: {}", loaded_config.audio.master_volume);
276 println!(" Auto-save Interval: {}s", loaded_config.gameplay.auto_save_interval);
277 println!(" Key bindings: {}", loaded_config.controls.key_bindings.len());
278
279 // === PLAYER PROGRESS TRACKING ===
280 println!("\n👤 Player Progress Tracking");
281 println!("---------------------------");
282
283 let mut progress = PlayerProgress::default();
284
285 // Simulate some gameplay progress
286 progress.level = 8;
287 progress.experience = 5500;
288 progress.playtime_seconds = 7200; // 2 hours
289
290 // Add completed levels
291 progress.levels_completed.extend([
292 "tutorial".to_string(),
293 "forest_1".to_string(),
294 "forest_2".to_string(),
295 "caves_1".to_string(),
296 ]);
297
298 // Add achievements
299 progress.achievements.extend([
300 Achievement {
301 id: "level_5".to_string(),
302 name: "Experienced".to_string(),
303 description: "Reach level 5".to_string(),
304 unlocked_at: 1234567890,
305 points: 100,
306 },
307 Achievement {
308 id: "cave_explorer".to_string(),
309 name: "Cave Explorer".to_string(),
310 description: "Complete the cave levels".to_string(),
311 unlocked_at: 1234568000,
312 points: 150,
313 },
314 ]);
315
316 // Update statistics
317 progress.statistics.entities_defeated = 150;
318 progress.statistics.distance_moved = 5000.0;
319 progress.statistics.items_collected = 45;
320 progress.statistics.spells_cast = 80;
321 progress.statistics.deaths = 3;
322 progress.statistics.levels_completed_count = 4;
323
324 // Serialize progress
325 let _progress_json = serde_json::to_string_pretty(&progress)
326 .expect("Failed to serialize progress");
327
328 println!("Player Progress Summary:");
329 println!(" Level: {}", progress.level);
330 println!(" Experience: {}", progress.experience);
331 println!(" Playtime: {}h {}m", progress.playtime_seconds / 3600, (progress.playtime_seconds % 3600) / 60);
332 println!(" Levels Completed: {}", progress.levels_completed.len());
333 println!(" Achievements: {} (total {} points)",
334 progress.achievements.len(),
335 progress.achievements.iter().map(|a| a.points).sum::<u32>());
336 println!(" Statistics:");
337 println!(" Entities Defeated: {}", progress.statistics.entities_defeated);
338 println!(" Distance Moved: {:.1}m", progress.statistics.distance_moved);
339 println!(" Items Collected: {}", progress.statistics.items_collected);
340 println!(" Spells Cast: {}", progress.statistics.spells_cast);
341 println!(" Deaths: {}", progress.statistics.deaths);
342
343 // === CLEANUP DEMONSTRATION ===
344 println!("\n🧹 Cleanup");
345 println!("----------");
346
347 // Demonstrate save deletion
348 save_manager.delete_save("checkpoint_1")
349 .expect("Failed to delete save");
350 println!("✅ Deleted checkpoint_1 save");
351
352 let remaining_saves = save_manager.list_saves()
353 .expect("Failed to list remaining saves");
354 println!("Remaining saves: {:?}", remaining_saves);
355
356 // Clean up temporary directory
357 std::fs::remove_dir_all(&temp_dir).ok();
358 println!("✅ Cleaned up temporary files");
359
360 // === PERFORMANCE DEMONSTRATION ===
361 println!("\n⚡ Performance Test");
362 println!("------------------");
363
364 let mut large_state = game_state.clone();
365
366 // Add lots of custom data to simulate a large game state
367 for i in 0..100 {
368 large_state.custom_data.insert(
369 format!("large_data_{}", i),
370 vec![0u8; 1024] // 1KB per entry
371 );
372 }
373
374 let start_time = std::time::Instant::now();
375 let serialized_large = GameStateSerializer::new()
376 .with_compression(true)
377 .serialize_game_state(&large_state)
378 .expect("Failed to serialize large state");
379 let serialize_duration = start_time.elapsed();
380
381 let start_time = std::time::Instant::now();
382 let _deserialized_large = GameStateSerializer::new()
383 .with_compression(true)
384 .deserialize_game_state(&serialized_large)
385 .expect("Failed to deserialize large state");
386 let deserialize_duration = start_time.elapsed();
387
388 println!("Large game state performance:");
389 println!(" Size: {} KB", serialized_large.len() / 1024);
390 println!(" Serialize time: {:.2}ms", serialize_duration.as_secs_f64() * 1000.0);
391 println!(" Deserialize time: {:.2}ms", deserialize_duration.as_secs_f64() * 1000.0);
392
393 println!("\n✨ Serialization Demo Complete!");
394 println!("\nKey features demonstrated:");
395 println!("• Multiple serialization formats (JSON, Binary, RON)");
396 println!("• Compression support with size reduction");
397 println!("• Save file management with metadata");
398 println!("• Configuration persistence");
399 println!("• Player progress tracking");
400 println!("• Version compatibility checking");
401 println!("• Error handling and recovery");
402 println!("• Performance optimization");
403}Sourcepub fn deserialize_game_state(
&self,
data: &[u8],
) -> Result<SerializableGameState, SerializationError>
pub fn deserialize_game_state( &self, data: &[u8], ) -> Result<SerializableGameState, SerializationError>
Deserializes a game state from bytes.
Examples found in repository?
examples/serialization_demo.rs (line 116)
39fn main() {
40 println!("💾 Serialization System Demonstration");
41 println!("=====================================");
42
43 // === BASIC SERIALIZATION ===
44 println!("\n📄 Basic Game State Serialization");
45 println!("----------------------------------");
46
47 // Create a basic game state
48 let mut game_state = GameStateSerializer::create_basic_game_state("My First Save".to_string());
49
50 // Add some custom data
51 game_state.progress.level = 5;
52 game_state.progress.experience = 2500;
53 game_state.progress.playtime_seconds = 3600; // 1 hour
54 game_state.progress.levels_completed.push("tutorial".to_string());
55 game_state.progress.levels_completed.push("forest_1".to_string());
56
57 // Add an achievement
58 game_state.progress.achievements.push(Achievement {
59 id: "first_level".to_string(),
60 name: "First Steps".to_string(),
61 description: "Complete your first level".to_string(),
62 unlocked_at: 1234567890,
63 points: 50,
64 });
65
66 // Update game statistics
67 game_state.progress.statistics.entities_defeated = 25;
68 game_state.progress.statistics.distance_moved = 1500.0;
69 game_state.progress.statistics.items_collected = 12;
70
71 // Add custom metadata tags
72 game_state.metadata = game_state.metadata
73 .with_tag("demo".to_string())
74 .with_tag("tutorial_complete".to_string())
75 .with_custom("difficulty".to_string(), "normal".to_string())
76 .with_custom("character_class".to_string(), "warrior".to_string());
77
78 println!("Created game state:");
79 println!(" Player Level: {}", game_state.progress.level);
80 println!(" Experience: {}", game_state.progress.experience);
81 println!(" Playtime: {}h {}m",
82 game_state.progress.playtime_seconds / 3600,
83 (game_state.progress.playtime_seconds % 3600) / 60);
84 println!(" Achievements: {}", game_state.progress.achievements.len());
85 println!(" Levels Completed: {}", game_state.progress.levels_completed.len());
86
87 // === MULTIPLE FORMATS DEMONSTRATION ===
88 println!("\n🔄 Multiple Serialization Formats");
89 println!("----------------------------------");
90
91 // Test JSON serialization
92 let json_serializer = GameStateSerializer::new()
93 .with_format(SerializationFormat::Json);
94
95 let json_data = json_serializer.serialize_game_state(&game_state)
96 .expect("Failed to serialize to JSON");
97 println!("JSON serialization: {} bytes", json_data.len());
98
99 // Test Binary serialization
100 let binary_serializer = GameStateSerializer::new()
101 .with_format(SerializationFormat::Binary);
102
103 let binary_data = binary_serializer.serialize_game_state(&game_state)
104 .expect("Failed to serialize to binary");
105 println!("Binary serialization: {} bytes", binary_data.len());
106
107 // Test RON serialization
108 let ron_serializer = GameStateSerializer::new()
109 .with_format(SerializationFormat::Ron);
110
111 let ron_data = ron_serializer.serialize_game_state(&game_state)
112 .expect("Failed to serialize to RON");
113 println!("RON serialization: {} bytes", ron_data.len());
114
115 // Verify deserialization works
116 let json_restored = json_serializer.deserialize_game_state(&json_data)
117 .expect("Failed to deserialize JSON");
118 let binary_restored = binary_serializer.deserialize_game_state(&binary_data)
119 .expect("Failed to deserialize binary");
120 let ron_restored = ron_serializer.deserialize_game_state(&ron_data)
121 .expect("Failed to deserialize RON");
122
123 println!("✅ All formats successfully roundtrip serialized");
124 println!(" JSON player level: {}", json_restored.progress.level);
125 println!(" Binary player level: {}", binary_restored.progress.level);
126 println!(" RON player level: {}", ron_restored.progress.level);
127
128 // === COMPRESSION DEMONSTRATION ===
129 println!("\n🗜️ Compression");
130 println!("--------------");
131
132 let uncompressed_serializer = GameStateSerializer::new()
133 .with_compression(false);
134 let compressed_serializer = GameStateSerializer::new()
135 .with_compression(true);
136
137 let uncompressed = uncompressed_serializer.serialize_game_state(&game_state)
138 .expect("Failed to serialize uncompressed");
139 let compressed = compressed_serializer.serialize_game_state(&game_state)
140 .expect("Failed to serialize compressed");
141
142 println!("Uncompressed size: {} bytes", uncompressed.len());
143 println!("Compressed size: {} bytes", compressed.len());
144 let ratio = if compressed.len() < uncompressed.len() {
145 ((uncompressed.len() - compressed.len()) as f64 / uncompressed.len() as f64) * 100.0
146 } else {
147 // No compression achieved (mock compression adds overhead)
148 -((compressed.len() - uncompressed.len()) as f64 / uncompressed.len() as f64) * 100.0
149 };
150 println!("Compression ratio: {:.1}%", ratio);
151
152 // Verify compressed data can be decompressed
153 let decompressed = compressed_serializer.deserialize_game_state(&compressed)
154 .expect("Failed to decompress data");
155 println!("✅ Compression/decompression successful");
156 println!(" Restored player level: {}", decompressed.progress.level);
157
158 // === SAVE MANAGER DEMONSTRATION ===
159 println!("\n💾 Save Manager");
160 println!("---------------");
161
162 // Create a temporary directory for saves (in real usage, this would be a persistent directory)
163 let temp_dir = std::env::temp_dir().join("tiles_tools_demo_saves");
164 std::fs::create_dir_all(&temp_dir).expect("Failed to create saves directory");
165
166 let save_manager = SaveManager::new(&temp_dir)
167 .with_serializer(GameStateSerializer::new().with_compression(true));
168
169 // Save the game state
170 save_manager.save_game_state("demo_save", &game_state)
171 .expect("Failed to save game state");
172 println!("✅ Game saved as 'demo_save'");
173
174 // Create additional saves with different states
175 let mut quick_save = game_state.clone();
176 quick_save.metadata.description = "Quick Save - Before Boss Fight".to_string();
177 quick_save.progress.level = 6;
178 quick_save.progress.experience = 3000;
179
180 save_manager.save_game_state("quick_save", &quick_save)
181 .expect("Failed to save quick save");
182
183 let mut checkpoint = game_state.clone();
184 checkpoint.metadata.description = "Checkpoint - Forest Entry".to_string();
185 checkpoint.progress.level = 4;
186 checkpoint.progress.experience = 1800;
187 checkpoint.metadata = checkpoint.metadata.with_tag("checkpoint".to_string());
188
189 save_manager.save_game_state("checkpoint_1", &checkpoint)
190 .expect("Failed to save checkpoint");
191
192 // List all saves
193 println!("\n📂 Available Saves:");
194 let saves = save_manager.list_saves()
195 .expect("Failed to list saves");
196 for save_name in &saves {
197 println!(" - {}", save_name);
198 }
199
200 // Get detailed save information
201 println!("\n📊 Save Information:");
202 let saves_info = save_manager.get_saves_info()
203 .expect("Failed to get saves info");
204
205 for (name, metadata) in &saves_info {
206 let _created_time = std::time::SystemTime::UNIX_EPOCH + std::time::Duration::from_secs(metadata.created_at);
207 println!(" Save: {}", name);
208 println!(" Description: {}", metadata.description);
209 println!(" Size: {} bytes", metadata.size_bytes);
210 println!(" Version: {}.{}.{}", metadata.version.major, metadata.version.minor, metadata.version.patch);
211 println!(" Compressed: {}", metadata.compressed);
212 println!(" Tags: {:?}", metadata.tags);
213 if !metadata.custom.is_empty() {
214 println!(" Custom data: {:?}", metadata.custom);
215 }
216 println!();
217 }
218
219 // Load a specific save
220 println!("🔄 Loading save 'demo_save'...");
221 let loaded_state = save_manager.load_game_state("demo_save")
222 .expect("Failed to load save");
223
224 println!("✅ Save loaded successfully:");
225 println!(" Player Level: {}", loaded_state.progress.level);
226 println!(" Experience: {}", loaded_state.progress.experience);
227 println!(" Description: {}", loaded_state.metadata.description);
228 println!(" Achievements: {}", loaded_state.progress.achievements.len());
229
230 // === VERSION COMPATIBILITY ===
231 println!("\n🔄 Version Compatibility");
232 println!("------------------------");
233
234 let current_version = SaveVersion::current();
235 let older_version = SaveVersion::new(1, 0, 0);
236 let newer_version = SaveVersion::new(1, 1, 0);
237 let incompatible_version = SaveVersion::new(2, 0, 0);
238
239 println!("Current version: {}.{}.{}", current_version.major, current_version.minor, current_version.patch);
240 println!("Older version compatibility: {}", current_version.is_compatible_with(&older_version));
241 println!("Newer version compatibility: {}", older_version.is_compatible_with(&newer_version));
242 println!("Incompatible version compatibility: {}", current_version.is_compatible_with(&incompatible_version));
243
244 // === CONFIGURATION MANAGEMENT ===
245 println!("\n⚙️ Configuration Management");
246 println!("---------------------------");
247
248 let config_path = temp_dir.join("game_config.json");
249 let config_manager = ConfigManager::new(&config_path);
250
251 // Create custom configuration
252 let mut custom_config = GameConfig::default();
253 custom_config.difficulty = 3;
254 custom_config.graphics.resolution_width = 2560;
255 custom_config.graphics.resolution_height = 1440;
256 custom_config.graphics.quality_level = 3;
257 custom_config.audio.master_volume = 0.8;
258 custom_config.gameplay.auto_save_interval = 600; // 10 minutes
259
260 // Add custom keybindings
261 custom_config.controls.key_bindings.insert("sprint".to_string(), "Shift".to_string());
262 custom_config.controls.key_bindings.insert("inventory".to_string(), "Tab".to_string());
263
264 // Save configuration
265 config_manager.save_config(&custom_config)
266 .expect("Failed to save configuration");
267 println!("✅ Configuration saved");
268
269 // Load configuration
270 let loaded_config = config_manager.load_config()
271 .expect("Failed to load configuration");
272 println!("✅ Configuration loaded:");
273 println!(" Difficulty: {}", loaded_config.difficulty);
274 println!(" Resolution: {}x{}", loaded_config.graphics.resolution_width, loaded_config.graphics.resolution_height);
275 println!(" Master Volume: {}", loaded_config.audio.master_volume);
276 println!(" Auto-save Interval: {}s", loaded_config.gameplay.auto_save_interval);
277 println!(" Key bindings: {}", loaded_config.controls.key_bindings.len());
278
279 // === PLAYER PROGRESS TRACKING ===
280 println!("\n👤 Player Progress Tracking");
281 println!("---------------------------");
282
283 let mut progress = PlayerProgress::default();
284
285 // Simulate some gameplay progress
286 progress.level = 8;
287 progress.experience = 5500;
288 progress.playtime_seconds = 7200; // 2 hours
289
290 // Add completed levels
291 progress.levels_completed.extend([
292 "tutorial".to_string(),
293 "forest_1".to_string(),
294 "forest_2".to_string(),
295 "caves_1".to_string(),
296 ]);
297
298 // Add achievements
299 progress.achievements.extend([
300 Achievement {
301 id: "level_5".to_string(),
302 name: "Experienced".to_string(),
303 description: "Reach level 5".to_string(),
304 unlocked_at: 1234567890,
305 points: 100,
306 },
307 Achievement {
308 id: "cave_explorer".to_string(),
309 name: "Cave Explorer".to_string(),
310 description: "Complete the cave levels".to_string(),
311 unlocked_at: 1234568000,
312 points: 150,
313 },
314 ]);
315
316 // Update statistics
317 progress.statistics.entities_defeated = 150;
318 progress.statistics.distance_moved = 5000.0;
319 progress.statistics.items_collected = 45;
320 progress.statistics.spells_cast = 80;
321 progress.statistics.deaths = 3;
322 progress.statistics.levels_completed_count = 4;
323
324 // Serialize progress
325 let _progress_json = serde_json::to_string_pretty(&progress)
326 .expect("Failed to serialize progress");
327
328 println!("Player Progress Summary:");
329 println!(" Level: {}", progress.level);
330 println!(" Experience: {}", progress.experience);
331 println!(" Playtime: {}h {}m", progress.playtime_seconds / 3600, (progress.playtime_seconds % 3600) / 60);
332 println!(" Levels Completed: {}", progress.levels_completed.len());
333 println!(" Achievements: {} (total {} points)",
334 progress.achievements.len(),
335 progress.achievements.iter().map(|a| a.points).sum::<u32>());
336 println!(" Statistics:");
337 println!(" Entities Defeated: {}", progress.statistics.entities_defeated);
338 println!(" Distance Moved: {:.1}m", progress.statistics.distance_moved);
339 println!(" Items Collected: {}", progress.statistics.items_collected);
340 println!(" Spells Cast: {}", progress.statistics.spells_cast);
341 println!(" Deaths: {}", progress.statistics.deaths);
342
343 // === CLEANUP DEMONSTRATION ===
344 println!("\n🧹 Cleanup");
345 println!("----------");
346
347 // Demonstrate save deletion
348 save_manager.delete_save("checkpoint_1")
349 .expect("Failed to delete save");
350 println!("✅ Deleted checkpoint_1 save");
351
352 let remaining_saves = save_manager.list_saves()
353 .expect("Failed to list remaining saves");
354 println!("Remaining saves: {:?}", remaining_saves);
355
356 // Clean up temporary directory
357 std::fs::remove_dir_all(&temp_dir).ok();
358 println!("✅ Cleaned up temporary files");
359
360 // === PERFORMANCE DEMONSTRATION ===
361 println!("\n⚡ Performance Test");
362 println!("------------------");
363
364 let mut large_state = game_state.clone();
365
366 // Add lots of custom data to simulate a large game state
367 for i in 0..100 {
368 large_state.custom_data.insert(
369 format!("large_data_{}", i),
370 vec![0u8; 1024] // 1KB per entry
371 );
372 }
373
374 let start_time = std::time::Instant::now();
375 let serialized_large = GameStateSerializer::new()
376 .with_compression(true)
377 .serialize_game_state(&large_state)
378 .expect("Failed to serialize large state");
379 let serialize_duration = start_time.elapsed();
380
381 let start_time = std::time::Instant::now();
382 let _deserialized_large = GameStateSerializer::new()
383 .with_compression(true)
384 .deserialize_game_state(&serialized_large)
385 .expect("Failed to deserialize large state");
386 let deserialize_duration = start_time.elapsed();
387
388 println!("Large game state performance:");
389 println!(" Size: {} KB", serialized_large.len() / 1024);
390 println!(" Serialize time: {:.2}ms", serialize_duration.as_secs_f64() * 1000.0);
391 println!(" Deserialize time: {:.2}ms", deserialize_duration.as_secs_f64() * 1000.0);
392
393 println!("\n✨ Serialization Demo Complete!");
394 println!("\nKey features demonstrated:");
395 println!("• Multiple serialization formats (JSON, Binary, RON)");
396 println!("• Compression support with size reduction");
397 println!("• Save file management with metadata");
398 println!("• Configuration persistence");
399 println!("• Player progress tracking");
400 println!("• Version compatibility checking");
401 println!("• Error handling and recovery");
402 println!("• Performance optimization");
403}Sourcepub fn create_basic_game_state(description: String) -> SerializableGameState
pub fn create_basic_game_state(description: String) -> SerializableGameState
Creates a basic game state for testing.
Examples found in repository?
examples/serialization_demo.rs (line 48)
39fn main() {
40 println!("💾 Serialization System Demonstration");
41 println!("=====================================");
42
43 // === BASIC SERIALIZATION ===
44 println!("\n📄 Basic Game State Serialization");
45 println!("----------------------------------");
46
47 // Create a basic game state
48 let mut game_state = GameStateSerializer::create_basic_game_state("My First Save".to_string());
49
50 // Add some custom data
51 game_state.progress.level = 5;
52 game_state.progress.experience = 2500;
53 game_state.progress.playtime_seconds = 3600; // 1 hour
54 game_state.progress.levels_completed.push("tutorial".to_string());
55 game_state.progress.levels_completed.push("forest_1".to_string());
56
57 // Add an achievement
58 game_state.progress.achievements.push(Achievement {
59 id: "first_level".to_string(),
60 name: "First Steps".to_string(),
61 description: "Complete your first level".to_string(),
62 unlocked_at: 1234567890,
63 points: 50,
64 });
65
66 // Update game statistics
67 game_state.progress.statistics.entities_defeated = 25;
68 game_state.progress.statistics.distance_moved = 1500.0;
69 game_state.progress.statistics.items_collected = 12;
70
71 // Add custom metadata tags
72 game_state.metadata = game_state.metadata
73 .with_tag("demo".to_string())
74 .with_tag("tutorial_complete".to_string())
75 .with_custom("difficulty".to_string(), "normal".to_string())
76 .with_custom("character_class".to_string(), "warrior".to_string());
77
78 println!("Created game state:");
79 println!(" Player Level: {}", game_state.progress.level);
80 println!(" Experience: {}", game_state.progress.experience);
81 println!(" Playtime: {}h {}m",
82 game_state.progress.playtime_seconds / 3600,
83 (game_state.progress.playtime_seconds % 3600) / 60);
84 println!(" Achievements: {}", game_state.progress.achievements.len());
85 println!(" Levels Completed: {}", game_state.progress.levels_completed.len());
86
87 // === MULTIPLE FORMATS DEMONSTRATION ===
88 println!("\n🔄 Multiple Serialization Formats");
89 println!("----------------------------------");
90
91 // Test JSON serialization
92 let json_serializer = GameStateSerializer::new()
93 .with_format(SerializationFormat::Json);
94
95 let json_data = json_serializer.serialize_game_state(&game_state)
96 .expect("Failed to serialize to JSON");
97 println!("JSON serialization: {} bytes", json_data.len());
98
99 // Test Binary serialization
100 let binary_serializer = GameStateSerializer::new()
101 .with_format(SerializationFormat::Binary);
102
103 let binary_data = binary_serializer.serialize_game_state(&game_state)
104 .expect("Failed to serialize to binary");
105 println!("Binary serialization: {} bytes", binary_data.len());
106
107 // Test RON serialization
108 let ron_serializer = GameStateSerializer::new()
109 .with_format(SerializationFormat::Ron);
110
111 let ron_data = ron_serializer.serialize_game_state(&game_state)
112 .expect("Failed to serialize to RON");
113 println!("RON serialization: {} bytes", ron_data.len());
114
115 // Verify deserialization works
116 let json_restored = json_serializer.deserialize_game_state(&json_data)
117 .expect("Failed to deserialize JSON");
118 let binary_restored = binary_serializer.deserialize_game_state(&binary_data)
119 .expect("Failed to deserialize binary");
120 let ron_restored = ron_serializer.deserialize_game_state(&ron_data)
121 .expect("Failed to deserialize RON");
122
123 println!("✅ All formats successfully roundtrip serialized");
124 println!(" JSON player level: {}", json_restored.progress.level);
125 println!(" Binary player level: {}", binary_restored.progress.level);
126 println!(" RON player level: {}", ron_restored.progress.level);
127
128 // === COMPRESSION DEMONSTRATION ===
129 println!("\n🗜️ Compression");
130 println!("--------------");
131
132 let uncompressed_serializer = GameStateSerializer::new()
133 .with_compression(false);
134 let compressed_serializer = GameStateSerializer::new()
135 .with_compression(true);
136
137 let uncompressed = uncompressed_serializer.serialize_game_state(&game_state)
138 .expect("Failed to serialize uncompressed");
139 let compressed = compressed_serializer.serialize_game_state(&game_state)
140 .expect("Failed to serialize compressed");
141
142 println!("Uncompressed size: {} bytes", uncompressed.len());
143 println!("Compressed size: {} bytes", compressed.len());
144 let ratio = if compressed.len() < uncompressed.len() {
145 ((uncompressed.len() - compressed.len()) as f64 / uncompressed.len() as f64) * 100.0
146 } else {
147 // No compression achieved (mock compression adds overhead)
148 -((compressed.len() - uncompressed.len()) as f64 / uncompressed.len() as f64) * 100.0
149 };
150 println!("Compression ratio: {:.1}%", ratio);
151
152 // Verify compressed data can be decompressed
153 let decompressed = compressed_serializer.deserialize_game_state(&compressed)
154 .expect("Failed to decompress data");
155 println!("✅ Compression/decompression successful");
156 println!(" Restored player level: {}", decompressed.progress.level);
157
158 // === SAVE MANAGER DEMONSTRATION ===
159 println!("\n💾 Save Manager");
160 println!("---------------");
161
162 // Create a temporary directory for saves (in real usage, this would be a persistent directory)
163 let temp_dir = std::env::temp_dir().join("tiles_tools_demo_saves");
164 std::fs::create_dir_all(&temp_dir).expect("Failed to create saves directory");
165
166 let save_manager = SaveManager::new(&temp_dir)
167 .with_serializer(GameStateSerializer::new().with_compression(true));
168
169 // Save the game state
170 save_manager.save_game_state("demo_save", &game_state)
171 .expect("Failed to save game state");
172 println!("✅ Game saved as 'demo_save'");
173
174 // Create additional saves with different states
175 let mut quick_save = game_state.clone();
176 quick_save.metadata.description = "Quick Save - Before Boss Fight".to_string();
177 quick_save.progress.level = 6;
178 quick_save.progress.experience = 3000;
179
180 save_manager.save_game_state("quick_save", &quick_save)
181 .expect("Failed to save quick save");
182
183 let mut checkpoint = game_state.clone();
184 checkpoint.metadata.description = "Checkpoint - Forest Entry".to_string();
185 checkpoint.progress.level = 4;
186 checkpoint.progress.experience = 1800;
187 checkpoint.metadata = checkpoint.metadata.with_tag("checkpoint".to_string());
188
189 save_manager.save_game_state("checkpoint_1", &checkpoint)
190 .expect("Failed to save checkpoint");
191
192 // List all saves
193 println!("\n📂 Available Saves:");
194 let saves = save_manager.list_saves()
195 .expect("Failed to list saves");
196 for save_name in &saves {
197 println!(" - {}", save_name);
198 }
199
200 // Get detailed save information
201 println!("\n📊 Save Information:");
202 let saves_info = save_manager.get_saves_info()
203 .expect("Failed to get saves info");
204
205 for (name, metadata) in &saves_info {
206 let _created_time = std::time::SystemTime::UNIX_EPOCH + std::time::Duration::from_secs(metadata.created_at);
207 println!(" Save: {}", name);
208 println!(" Description: {}", metadata.description);
209 println!(" Size: {} bytes", metadata.size_bytes);
210 println!(" Version: {}.{}.{}", metadata.version.major, metadata.version.minor, metadata.version.patch);
211 println!(" Compressed: {}", metadata.compressed);
212 println!(" Tags: {:?}", metadata.tags);
213 if !metadata.custom.is_empty() {
214 println!(" Custom data: {:?}", metadata.custom);
215 }
216 println!();
217 }
218
219 // Load a specific save
220 println!("🔄 Loading save 'demo_save'...");
221 let loaded_state = save_manager.load_game_state("demo_save")
222 .expect("Failed to load save");
223
224 println!("✅ Save loaded successfully:");
225 println!(" Player Level: {}", loaded_state.progress.level);
226 println!(" Experience: {}", loaded_state.progress.experience);
227 println!(" Description: {}", loaded_state.metadata.description);
228 println!(" Achievements: {}", loaded_state.progress.achievements.len());
229
230 // === VERSION COMPATIBILITY ===
231 println!("\n🔄 Version Compatibility");
232 println!("------------------------");
233
234 let current_version = SaveVersion::current();
235 let older_version = SaveVersion::new(1, 0, 0);
236 let newer_version = SaveVersion::new(1, 1, 0);
237 let incompatible_version = SaveVersion::new(2, 0, 0);
238
239 println!("Current version: {}.{}.{}", current_version.major, current_version.minor, current_version.patch);
240 println!("Older version compatibility: {}", current_version.is_compatible_with(&older_version));
241 println!("Newer version compatibility: {}", older_version.is_compatible_with(&newer_version));
242 println!("Incompatible version compatibility: {}", current_version.is_compatible_with(&incompatible_version));
243
244 // === CONFIGURATION MANAGEMENT ===
245 println!("\n⚙️ Configuration Management");
246 println!("---------------------------");
247
248 let config_path = temp_dir.join("game_config.json");
249 let config_manager = ConfigManager::new(&config_path);
250
251 // Create custom configuration
252 let mut custom_config = GameConfig::default();
253 custom_config.difficulty = 3;
254 custom_config.graphics.resolution_width = 2560;
255 custom_config.graphics.resolution_height = 1440;
256 custom_config.graphics.quality_level = 3;
257 custom_config.audio.master_volume = 0.8;
258 custom_config.gameplay.auto_save_interval = 600; // 10 minutes
259
260 // Add custom keybindings
261 custom_config.controls.key_bindings.insert("sprint".to_string(), "Shift".to_string());
262 custom_config.controls.key_bindings.insert("inventory".to_string(), "Tab".to_string());
263
264 // Save configuration
265 config_manager.save_config(&custom_config)
266 .expect("Failed to save configuration");
267 println!("✅ Configuration saved");
268
269 // Load configuration
270 let loaded_config = config_manager.load_config()
271 .expect("Failed to load configuration");
272 println!("✅ Configuration loaded:");
273 println!(" Difficulty: {}", loaded_config.difficulty);
274 println!(" Resolution: {}x{}", loaded_config.graphics.resolution_width, loaded_config.graphics.resolution_height);
275 println!(" Master Volume: {}", loaded_config.audio.master_volume);
276 println!(" Auto-save Interval: {}s", loaded_config.gameplay.auto_save_interval);
277 println!(" Key bindings: {}", loaded_config.controls.key_bindings.len());
278
279 // === PLAYER PROGRESS TRACKING ===
280 println!("\n👤 Player Progress Tracking");
281 println!("---------------------------");
282
283 let mut progress = PlayerProgress::default();
284
285 // Simulate some gameplay progress
286 progress.level = 8;
287 progress.experience = 5500;
288 progress.playtime_seconds = 7200; // 2 hours
289
290 // Add completed levels
291 progress.levels_completed.extend([
292 "tutorial".to_string(),
293 "forest_1".to_string(),
294 "forest_2".to_string(),
295 "caves_1".to_string(),
296 ]);
297
298 // Add achievements
299 progress.achievements.extend([
300 Achievement {
301 id: "level_5".to_string(),
302 name: "Experienced".to_string(),
303 description: "Reach level 5".to_string(),
304 unlocked_at: 1234567890,
305 points: 100,
306 },
307 Achievement {
308 id: "cave_explorer".to_string(),
309 name: "Cave Explorer".to_string(),
310 description: "Complete the cave levels".to_string(),
311 unlocked_at: 1234568000,
312 points: 150,
313 },
314 ]);
315
316 // Update statistics
317 progress.statistics.entities_defeated = 150;
318 progress.statistics.distance_moved = 5000.0;
319 progress.statistics.items_collected = 45;
320 progress.statistics.spells_cast = 80;
321 progress.statistics.deaths = 3;
322 progress.statistics.levels_completed_count = 4;
323
324 // Serialize progress
325 let _progress_json = serde_json::to_string_pretty(&progress)
326 .expect("Failed to serialize progress");
327
328 println!("Player Progress Summary:");
329 println!(" Level: {}", progress.level);
330 println!(" Experience: {}", progress.experience);
331 println!(" Playtime: {}h {}m", progress.playtime_seconds / 3600, (progress.playtime_seconds % 3600) / 60);
332 println!(" Levels Completed: {}", progress.levels_completed.len());
333 println!(" Achievements: {} (total {} points)",
334 progress.achievements.len(),
335 progress.achievements.iter().map(|a| a.points).sum::<u32>());
336 println!(" Statistics:");
337 println!(" Entities Defeated: {}", progress.statistics.entities_defeated);
338 println!(" Distance Moved: {:.1}m", progress.statistics.distance_moved);
339 println!(" Items Collected: {}", progress.statistics.items_collected);
340 println!(" Spells Cast: {}", progress.statistics.spells_cast);
341 println!(" Deaths: {}", progress.statistics.deaths);
342
343 // === CLEANUP DEMONSTRATION ===
344 println!("\n🧹 Cleanup");
345 println!("----------");
346
347 // Demonstrate save deletion
348 save_manager.delete_save("checkpoint_1")
349 .expect("Failed to delete save");
350 println!("✅ Deleted checkpoint_1 save");
351
352 let remaining_saves = save_manager.list_saves()
353 .expect("Failed to list remaining saves");
354 println!("Remaining saves: {:?}", remaining_saves);
355
356 // Clean up temporary directory
357 std::fs::remove_dir_all(&temp_dir).ok();
358 println!("✅ Cleaned up temporary files");
359
360 // === PERFORMANCE DEMONSTRATION ===
361 println!("\n⚡ Performance Test");
362 println!("------------------");
363
364 let mut large_state = game_state.clone();
365
366 // Add lots of custom data to simulate a large game state
367 for i in 0..100 {
368 large_state.custom_data.insert(
369 format!("large_data_{}", i),
370 vec![0u8; 1024] // 1KB per entry
371 );
372 }
373
374 let start_time = std::time::Instant::now();
375 let serialized_large = GameStateSerializer::new()
376 .with_compression(true)
377 .serialize_game_state(&large_state)
378 .expect("Failed to serialize large state");
379 let serialize_duration = start_time.elapsed();
380
381 let start_time = std::time::Instant::now();
382 let _deserialized_large = GameStateSerializer::new()
383 .with_compression(true)
384 .deserialize_game_state(&serialized_large)
385 .expect("Failed to deserialize large state");
386 let deserialize_duration = start_time.elapsed();
387
388 println!("Large game state performance:");
389 println!(" Size: {} KB", serialized_large.len() / 1024);
390 println!(" Serialize time: {:.2}ms", serialize_duration.as_secs_f64() * 1000.0);
391 println!(" Deserialize time: {:.2}ms", deserialize_duration.as_secs_f64() * 1000.0);
392
393 println!("\n✨ Serialization Demo Complete!");
394 println!("\nKey features demonstrated:");
395 println!("• Multiple serialization formats (JSON, Binary, RON)");
396 println!("• Compression support with size reduction");
397 println!("• Save file management with metadata");
398 println!("• Configuration persistence");
399 println!("• Player progress tracking");
400 println!("• Version compatibility checking");
401 println!("• Error handling and recovery");
402 println!("• Performance optimization");
403}Trait Implementations§
Auto Trait Implementations§
impl Freeze for GameStateSerializer
impl RefUnwindSafe for GameStateSerializer
impl Send for GameStateSerializer
impl Sync for GameStateSerializer
impl Unpin for GameStateSerializer
impl UnsafeUnpin for GameStateSerializer
impl UnwindSafe for GameStateSerializer
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more