1#![allow(clippy::needless_return)]
4#![allow(clippy::implicit_return)]
5#![allow(clippy::uninlined_format_args)]
6#![allow(clippy::items_after_statements)]
7#![allow(clippy::unnecessary_cast)]
8#![allow(clippy::doc_markdown)]
9#![allow(clippy::cast_sign_loss)]
10#![allow(clippy::explicit_iter_loop)]
11#![allow(clippy::format_in_format_args)]
12#![allow(clippy::cast_precision_loss)]
13#![allow(clippy::wildcard_imports)]
14#![allow(clippy::too_many_lines)]
15#![allow(clippy::std_instead_of_core)]
16#![allow(clippy::similar_names)]
17#![allow(clippy::duplicated_attributes)]
18#![allow(clippy::cast_possible_truncation)]
19#![allow(clippy::trivially_copy_pass_by_ref)]
20#![allow(clippy::missing_inline_in_public_items)]
21#![allow(clippy::useless_vec)]
22#![allow(clippy::unnested_or_patterns)]
23#![allow(clippy::else_if_without_else)]
24#![allow(clippy::unreadable_literal)]
25#![allow(clippy::redundant_else)]
26#![allow(clippy::field_reassign_with_default)]
27#![allow(clippy::min_ident_chars)]
28use tiles_tools::serialization::*;
38
39fn main() {
40 println!("๐พ Serialization System Demonstration");
41 println!("=====================================");
42
43 println!("\n๐ Basic Game State Serialization");
45 println!("----------------------------------");
46
47 let mut game_state = GameStateSerializer::create_basic_game_state("My First Save".to_string());
49
50 game_state.progress.level = 5;
52 game_state.progress.experience = 2500;
53 game_state.progress.playtime_seconds = 3600; game_state.progress.levels_completed.push("tutorial".to_string());
55 game_state.progress.levels_completed.push("forest_1".to_string());
56
57 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 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 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 println!("\n๐ Multiple Serialization Formats");
89 println!("----------------------------------");
90
91 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 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 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 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 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 -((compressed.len() - uncompressed.len()) as f64 / uncompressed.len() as f64) * 100.0
149 };
150 println!("Compression ratio: {:.1}%", ratio);
151
152 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 println!("\n๐พ Save Manager");
160 println!("---------------");
161
162 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_manager.save_game_state("demo_save", &game_state)
171 .expect("Failed to save game state");
172 println!("โ
Game saved as 'demo_save'");
173
174 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 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 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 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 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 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 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; 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 config_manager.save_config(&custom_config)
266 .expect("Failed to save configuration");
267 println!("โ
Configuration saved");
268
269 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 println!("\n๐ค Player Progress Tracking");
281 println!("---------------------------");
282
283 let mut progress = PlayerProgress::default();
284
285 progress.level = 8;
287 progress.experience = 5500;
288 progress.playtime_seconds = 7200; 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 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 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 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 println!("\n๐งน Cleanup");
345 println!("----------");
346
347 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 std::fs::remove_dir_all(&temp_dir).ok();
358 println!("โ
Cleaned up temporary files");
359
360 println!("\nโก Performance Test");
362 println!("------------------");
363
364 let mut large_state = game_state.clone();
365
366 for i in 0..100 {
368 large_state.custom_data.insert(
369 format!("large_data_{}", i),
370 vec![0u8; 1024] );
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}