Skip to main content

GameStateSerializer

Struct GameStateSerializer 

Source
pub struct GameStateSerializer { /* private fields */ }
Expand description

Game state serializer with compression and format options.

Implementations§

Source§

impl GameStateSerializer

Source

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}
Source

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}
Source

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}
Source

pub fn with_version(self, version: SaveVersion) -> Self

Sets a custom version.

Source

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}
Source

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}
Source

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§

Source§

impl Default for GameStateSerializer

Source§

fn default() -> Self

Returns the “default value” for a type. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> Component for T
where T: Send + Sync + 'static,

Source§

impl<All> From1<()> for All
where All: Default,

Source§

fn from1(_a: ()) -> All

Constructor with a single arguments.
Source§

impl<T, All> From1<(T,)> for All
where All: From1<T>,

Source§

fn from1(arg: (T,)) -> All

Constructor with a single arguments.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<All, F> Into1<F> for All
where F: From1<All>,

Source§

fn to(self) -> F

Converts this type into the (usually inferred) input type.
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoResult<T> for T

Source§

impl<T> ToRef<T> for T
where T: ?Sized,

Source§

fn to_ref(&self) -> &T

Converts the implementing type to an immutable reference. Read more
Source§

impl<T> ToValue<T> for T

Source§

fn to_value(self) -> T

Obtains the value from the implementing type. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.