@nice2dev/game-engine 1.0.22 → 1.0.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,574 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * @file GameSaveSystem.ts
5
+ * @description Serialization with schema migration for game saves
6
+ * PRO-1.5: Runtime & Performance
7
+ *
8
+ * Features:
9
+ * - Save/load game state
10
+ * - Schema versioning
11
+ * - Migration system
12
+ * - Multiple save slots
13
+ * - Cloud save support
14
+ * - Compression
15
+ * - Encryption
16
+ * - Auto-save
17
+ */
18
+ // ============================================================
19
+ // Default Configuration
20
+ // ============================================================
21
+ const DEFAULT_SAVE_CONFIG = {
22
+ format: 'json',
23
+ backend: 'local',
24
+ compress: true,
25
+ encrypt: false,
26
+ maxSlots: 10,
27
+ autoSaveInterval: 60000, // 1 minute
28
+ autoSaveSlot: 0,
29
+ cloudSync: false,
30
+ schemaVersion: 1,
31
+ };
32
+ class LocalStorageAdapter {
33
+ constructor(prefix = 'game_save_') {
34
+ this.prefix = prefix;
35
+ }
36
+ async save(key, data) {
37
+ try {
38
+ localStorage.setItem(this.prefix + key, data);
39
+ return true;
40
+ }
41
+ catch {
42
+ return false;
43
+ }
44
+ }
45
+ async load(key) {
46
+ return localStorage.getItem(this.prefix + key);
47
+ }
48
+ async delete(key) {
49
+ localStorage.removeItem(this.prefix + key);
50
+ return true;
51
+ }
52
+ async exists(key) {
53
+ return localStorage.getItem(this.prefix + key) !== null;
54
+ }
55
+ async list(prefix) {
56
+ const keys = [];
57
+ for (let i = 0; i < localStorage.length; i++) {
58
+ const key = localStorage.key(i);
59
+ if (key?.startsWith(this.prefix + prefix)) {
60
+ keys.push(key.substring(this.prefix.length));
61
+ }
62
+ }
63
+ return keys;
64
+ }
65
+ async clear() {
66
+ const keysToRemove = [];
67
+ for (let i = 0; i < localStorage.length; i++) {
68
+ const key = localStorage.key(i);
69
+ if (key?.startsWith(this.prefix)) {
70
+ keysToRemove.push(key);
71
+ }
72
+ }
73
+ keysToRemove.forEach((key) => localStorage.removeItem(key));
74
+ }
75
+ }
76
+ class IndexedDBAdapter {
77
+ constructor(dbName = 'game_saves', storeName = 'saves') {
78
+ this.db = null;
79
+ this.dbName = dbName;
80
+ this.storeName = storeName;
81
+ }
82
+ async getDB() {
83
+ if (this.db) {
84
+ return this.db;
85
+ }
86
+ return new Promise((resolve, reject) => {
87
+ const request = indexedDB.open(this.dbName, 1);
88
+ request.onerror = () => reject(request.error);
89
+ request.onsuccess = () => {
90
+ this.db = request.result;
91
+ resolve(this.db);
92
+ };
93
+ request.onupgradeneeded = () => {
94
+ const db = request.result;
95
+ if (!db.objectStoreNames.contains(this.storeName)) {
96
+ db.createObjectStore(this.storeName, { keyPath: 'key' });
97
+ }
98
+ };
99
+ });
100
+ }
101
+ async save(key, data) {
102
+ try {
103
+ const db = await this.getDB();
104
+ return new Promise((resolve) => {
105
+ const transaction = db.transaction(this.storeName, 'readwrite');
106
+ const store = transaction.objectStore(this.storeName);
107
+ const request = store.put({ key, data });
108
+ request.onsuccess = () => resolve(true);
109
+ request.onerror = () => resolve(false);
110
+ });
111
+ }
112
+ catch {
113
+ return false;
114
+ }
115
+ }
116
+ async load(key) {
117
+ try {
118
+ const db = await this.getDB();
119
+ return new Promise((resolve) => {
120
+ const transaction = db.transaction(this.storeName, 'readonly');
121
+ const store = transaction.objectStore(this.storeName);
122
+ const request = store.get(key);
123
+ request.onsuccess = () => resolve(request.result?.data ?? null);
124
+ request.onerror = () => resolve(null);
125
+ });
126
+ }
127
+ catch {
128
+ return null;
129
+ }
130
+ }
131
+ async delete(key) {
132
+ try {
133
+ const db = await this.getDB();
134
+ return new Promise((resolve) => {
135
+ const transaction = db.transaction(this.storeName, 'readwrite');
136
+ const store = transaction.objectStore(this.storeName);
137
+ const request = store.delete(key);
138
+ request.onsuccess = () => resolve(true);
139
+ request.onerror = () => resolve(false);
140
+ });
141
+ }
142
+ catch {
143
+ return false;
144
+ }
145
+ }
146
+ async exists(key) {
147
+ return (await this.load(key)) !== null;
148
+ }
149
+ async list(_prefix) {
150
+ try {
151
+ const db = await this.getDB();
152
+ return new Promise((resolve) => {
153
+ const transaction = db.transaction(this.storeName, 'readonly');
154
+ const store = transaction.objectStore(this.storeName);
155
+ const request = store.getAllKeys();
156
+ request.onsuccess = () => resolve(request.result);
157
+ request.onerror = () => resolve([]);
158
+ });
159
+ }
160
+ catch {
161
+ return [];
162
+ }
163
+ }
164
+ async clear() {
165
+ try {
166
+ const db = await this.getDB();
167
+ await new Promise((resolve) => {
168
+ const transaction = db.transaction(this.storeName, 'readwrite');
169
+ const store = transaction.objectStore(this.storeName);
170
+ const request = store.clear();
171
+ request.onsuccess = () => resolve();
172
+ request.onerror = () => resolve();
173
+ });
174
+ }
175
+ catch {
176
+ // Ignore
177
+ }
178
+ }
179
+ }
180
+ // ============================================================
181
+ // Save System
182
+ // ============================================================
183
+ class GameSaveSystem {
184
+ constructor(config) {
185
+ this.config = { ...DEFAULT_SAVE_CONFIG };
186
+ this.migrations = [];
187
+ this.autoSaveTimer = null;
188
+ if (config) {
189
+ this.config = { ...this.config, ...config };
190
+ }
191
+ this.adapter = this.createAdapter(this.config.backend);
192
+ }
193
+ createAdapter(backend) {
194
+ switch (backend) {
195
+ case 'indexeddb':
196
+ return new IndexedDBAdapter();
197
+ case 'local':
198
+ default:
199
+ return new LocalStorageAdapter();
200
+ }
201
+ }
202
+ // ─── Migration System ──────────────────────────────────
203
+ registerMigration(migration) {
204
+ this.migrations.push(migration);
205
+ this.migrations.sort((a, b) => a.fromVersion - b.fromVersion);
206
+ }
207
+ async migrate(data, fromVersion) {
208
+ let currentVersion = fromVersion;
209
+ let migrationsApplied = 0;
210
+ try {
211
+ while (currentVersion < this.config.schemaVersion) {
212
+ const migration = this.migrations.find((m) => m.fromVersion === currentVersion);
213
+ if (!migration) {
214
+ return {
215
+ success: false,
216
+ fromVersion,
217
+ toVersion: currentVersion,
218
+ migrationsApplied,
219
+ error: `No migration found from version ${currentVersion}`,
220
+ };
221
+ }
222
+ data = migration.migrate(data);
223
+ currentVersion = migration.toVersion;
224
+ migrationsApplied++;
225
+ }
226
+ return {
227
+ success: true,
228
+ fromVersion,
229
+ toVersion: currentVersion,
230
+ migrationsApplied,
231
+ };
232
+ }
233
+ catch (error) {
234
+ return {
235
+ success: false,
236
+ fromVersion,
237
+ toVersion: currentVersion,
238
+ migrationsApplied,
239
+ error: error.message,
240
+ };
241
+ }
242
+ }
243
+ // ─── Save Operations ───────────────────────────────────
244
+ async save(slot, name) {
245
+ if (slot < 0 || slot >= this.config.maxSlots) {
246
+ return { success: false, slot, error: 'Invalid slot number' };
247
+ }
248
+ this.onSaveStarted?.(slot);
249
+ try {
250
+ const state = this.getGameState?.() ?? this.createEmptyState();
251
+ const existingMeta = await this.getSlotMetadata(slot);
252
+ const metadata = {
253
+ id: existingMeta?.id ?? this.generateId(),
254
+ name: name ?? existingMeta?.name ?? `Save ${slot + 1}`,
255
+ slot,
256
+ version: (existingMeta?.version ?? 0) + 1,
257
+ schemaVersion: this.config.schemaVersion,
258
+ createdAt: existingMeta?.createdAt ?? Date.now(),
259
+ modifiedAt: Date.now(),
260
+ playTime: existingMeta?.playTime ?? 0,
261
+ tags: existingMeta?.tags ?? [],
262
+ checksum: '',
263
+ size: 0,
264
+ compressed: this.config.compress,
265
+ encrypted: this.config.encrypt,
266
+ cloudSynced: false,
267
+ };
268
+ const saveData = { metadata, state };
269
+ let serialized = this.serialize(saveData);
270
+ if (this.config.compress) {
271
+ serialized = await this.compress(serialized);
272
+ }
273
+ if (this.config.encrypt && this.config.encryptionKey) {
274
+ serialized = await this.encrypt(serialized, this.config.encryptionKey);
275
+ }
276
+ metadata.checksum = await this.calculateChecksum(serialized);
277
+ metadata.size = serialized.length;
278
+ // Save data
279
+ const dataKey = `slot_${slot}_data`;
280
+ const metaKey = `slot_${slot}_meta`;
281
+ const dataSuccess = await this.adapter.save(dataKey, serialized);
282
+ const metaSuccess = await this.adapter.save(metaKey, JSON.stringify(metadata));
283
+ if (!dataSuccess || !metaSuccess) {
284
+ return { success: false, slot, error: 'Failed to write save data' };
285
+ }
286
+ const result = { success: true, slot, metadata };
287
+ this.onSaveCompleted?.(result);
288
+ return result;
289
+ }
290
+ catch (error) {
291
+ const result = {
292
+ success: false,
293
+ slot,
294
+ error: error.message,
295
+ };
296
+ this.onSaveCompleted?.(result);
297
+ return result;
298
+ }
299
+ }
300
+ async load(slot) {
301
+ if (slot < 0 || slot >= this.config.maxSlots) {
302
+ return { success: false, error: 'Invalid slot number', migrated: false };
303
+ }
304
+ this.onLoadStarted?.(slot);
305
+ try {
306
+ const dataKey = `slot_${slot}_data`;
307
+ const metaKey = `slot_${slot}_meta`;
308
+ const metaStr = await this.adapter.load(metaKey);
309
+ if (!metaStr) {
310
+ return { success: false, error: 'Save slot is empty', migrated: false };
311
+ }
312
+ const metadata = JSON.parse(metaStr);
313
+ let serialized = await this.adapter.load(dataKey);
314
+ if (!serialized) {
315
+ return { success: false, error: 'Save data not found', migrated: false };
316
+ }
317
+ // Verify checksum
318
+ const checksum = await this.calculateChecksum(serialized);
319
+ if (checksum !== metadata.checksum) {
320
+ return { success: false, error: 'Save data corrupted', migrated: false };
321
+ }
322
+ if (metadata.encrypted && this.config.encryptionKey) {
323
+ serialized = await this.decrypt(serialized, this.config.encryptionKey);
324
+ }
325
+ if (metadata.compressed) {
326
+ serialized = await this.decompress(serialized);
327
+ }
328
+ const saveData = this.deserialize(serialized);
329
+ const state = saveData.state;
330
+ let migrated = false;
331
+ let migratedFrom;
332
+ // Check for migration
333
+ if (metadata.schemaVersion < this.config.schemaVersion) {
334
+ this.onMigrationNeeded?.(metadata.schemaVersion, this.config.schemaVersion);
335
+ const migrationResult = await this.migrate(state, metadata.schemaVersion);
336
+ if (!migrationResult.success) {
337
+ return {
338
+ success: false,
339
+ error: `Migration failed: ${migrationResult.error}`,
340
+ migrated: false,
341
+ };
342
+ }
343
+ migrated = true;
344
+ migratedFrom = metadata.schemaVersion;
345
+ }
346
+ // Apply state
347
+ this.setGameState?.(state);
348
+ const result = {
349
+ success: true,
350
+ data: state,
351
+ metadata,
352
+ migrated,
353
+ migratedFrom,
354
+ };
355
+ this.onLoadCompleted?.(result);
356
+ return result;
357
+ }
358
+ catch (error) {
359
+ const result = {
360
+ success: false,
361
+ error: error.message,
362
+ migrated: false,
363
+ };
364
+ this.onLoadCompleted?.(result);
365
+ return result;
366
+ }
367
+ }
368
+ async delete(slot) {
369
+ if (slot < 0 || slot >= this.config.maxSlots) {
370
+ return false;
371
+ }
372
+ const dataKey = `slot_${slot}_data`;
373
+ const metaKey = `slot_${slot}_meta`;
374
+ await this.adapter.delete(dataKey);
375
+ await this.adapter.delete(metaKey);
376
+ return true;
377
+ }
378
+ // ─── Slot Management ───────────────────────────────────
379
+ async getSlots() {
380
+ const slots = [];
381
+ for (let i = 0; i < this.config.maxSlots; i++) {
382
+ const metadata = await this.getSlotMetadata(i);
383
+ slots.push({
384
+ index: i,
385
+ isEmpty: !metadata,
386
+ metadata: metadata ?? undefined,
387
+ });
388
+ }
389
+ return slots;
390
+ }
391
+ async getSlotMetadata(slot) {
392
+ const metaKey = `slot_${slot}_meta`;
393
+ const metaStr = await this.adapter.load(metaKey);
394
+ if (!metaStr) {
395
+ return null;
396
+ }
397
+ try {
398
+ return JSON.parse(metaStr);
399
+ }
400
+ catch {
401
+ return null;
402
+ }
403
+ }
404
+ async hasSlot(slot) {
405
+ return (await this.getSlotMetadata(slot)) !== null;
406
+ }
407
+ async getNextEmptySlot() {
408
+ for (let i = 0; i < this.config.maxSlots; i++) {
409
+ if (!(await this.hasSlot(i))) {
410
+ return i;
411
+ }
412
+ }
413
+ return -1;
414
+ }
415
+ // ─── Auto-save ─────────────────────────────────────────
416
+ startAutoSave() {
417
+ if (this.autoSaveTimer) {
418
+ return;
419
+ }
420
+ this.autoSaveTimer = setInterval(async () => {
421
+ const result = await this.save(this.config.autoSaveSlot, 'Auto Save');
422
+ this.onAutoSave?.(result);
423
+ }, this.config.autoSaveInterval);
424
+ }
425
+ stopAutoSave() {
426
+ if (this.autoSaveTimer) {
427
+ clearInterval(this.autoSaveTimer);
428
+ this.autoSaveTimer = null;
429
+ }
430
+ }
431
+ async triggerAutoSave() {
432
+ const result = await this.save(this.config.autoSaveSlot, 'Auto Save');
433
+ this.onAutoSave?.(result);
434
+ return result;
435
+ }
436
+ // ─── Quick Save/Load ───────────────────────────────────
437
+ async quickSave() {
438
+ return this.save(0, 'Quick Save');
439
+ }
440
+ async quickLoad() {
441
+ return this.load(0);
442
+ }
443
+ // ─── Export/Import ─────────────────────────────────────
444
+ async exportSave(slot) {
445
+ const dataKey = `slot_${slot}_data`;
446
+ const metaKey = `slot_${slot}_meta`;
447
+ const data = await this.adapter.load(dataKey);
448
+ const meta = await this.adapter.load(metaKey);
449
+ if (!data || !meta) {
450
+ return null;
451
+ }
452
+ return btoa(JSON.stringify({ data, meta }));
453
+ }
454
+ async importSave(slot, exportedData) {
455
+ try {
456
+ const { data, meta } = JSON.parse(atob(exportedData));
457
+ const dataKey = `slot_${slot}_data`;
458
+ const metaKey = `slot_${slot}_meta`;
459
+ // Update metadata with new slot
460
+ const metadata = JSON.parse(meta);
461
+ metadata.slot = slot;
462
+ await this.adapter.save(dataKey, data);
463
+ await this.adapter.save(metaKey, JSON.stringify(metadata));
464
+ return true;
465
+ }
466
+ catch {
467
+ return false;
468
+ }
469
+ }
470
+ // ─── Utilities ─────────────────────────────────────────
471
+ serialize(data) {
472
+ return JSON.stringify(data);
473
+ }
474
+ deserialize(str) {
475
+ return JSON.parse(str);
476
+ }
477
+ async compress(data) {
478
+ // Simple compression using TextEncoder and base64
479
+ // In production, use a proper compression library like pako
480
+ const encoder = new TextEncoder();
481
+ const bytes = encoder.encode(data);
482
+ return btoa(String.fromCharCode(...bytes));
483
+ }
484
+ async decompress(data) {
485
+ const bytes = atob(data)
486
+ .split('')
487
+ .map((c) => c.charCodeAt(0));
488
+ const decoder = new TextDecoder();
489
+ return decoder.decode(new Uint8Array(bytes));
490
+ }
491
+ async encrypt(data, _key) {
492
+ // Placeholder - in production use Web Crypto API
493
+ return btoa(data);
494
+ }
495
+ async decrypt(data, _key) {
496
+ // Placeholder - in production use Web Crypto API
497
+ return atob(data);
498
+ }
499
+ async calculateChecksum(data) {
500
+ const encoder = new TextEncoder();
501
+ const bytes = encoder.encode(data);
502
+ const hashBuffer = await crypto.subtle.digest('SHA-256', bytes);
503
+ const hashArray = Array.from(new Uint8Array(hashBuffer));
504
+ return hashArray.map((b) => b.toString(16).padStart(2, '0')).join('');
505
+ }
506
+ generateId() {
507
+ return `save_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
508
+ }
509
+ createEmptyState() {
510
+ return {
511
+ player: {},
512
+ world: {},
513
+ inventory: {},
514
+ quests: {},
515
+ settings: {},
516
+ custom: {},
517
+ };
518
+ }
519
+ // ─── Configuration ─────────────────────────────────────
520
+ getConfig() {
521
+ return { ...this.config };
522
+ }
523
+ setConfig(config) {
524
+ this.config = { ...this.config, ...config };
525
+ if (config.backend) {
526
+ this.adapter = this.createAdapter(config.backend);
527
+ }
528
+ }
529
+ setAdapter(adapter) {
530
+ this.adapter = adapter;
531
+ }
532
+ // ─── Callbacks ─────────────────────────────────────────
533
+ setOnSaveStarted(callback) {
534
+ this.onSaveStarted = callback;
535
+ }
536
+ setOnSaveCompleted(callback) {
537
+ this.onSaveCompleted = callback;
538
+ }
539
+ setOnLoadStarted(callback) {
540
+ this.onLoadStarted = callback;
541
+ }
542
+ setOnLoadCompleted(callback) {
543
+ this.onLoadCompleted = callback;
544
+ }
545
+ setOnAutoSave(callback) {
546
+ this.onAutoSave = callback;
547
+ }
548
+ setOnMigrationNeeded(callback) {
549
+ this.onMigrationNeeded = callback;
550
+ }
551
+ setGetGameState(callback) {
552
+ this.getGameState = callback;
553
+ }
554
+ setSetGameState(callback) {
555
+ this.setGameState = callback;
556
+ }
557
+ }
558
+ // ============================================================
559
+ // Factory Functions
560
+ // ============================================================
561
+ function createSaveSystem(config) {
562
+ return new GameSaveSystem(config);
563
+ }
564
+ function createMigration(fromVersion, toVersion, migrate, description = '') {
565
+ return { fromVersion, toVersion, migrate, description };
566
+ }
567
+
568
+ exports.DEFAULT_SAVE_CONFIG = DEFAULT_SAVE_CONFIG;
569
+ exports.GameSaveSystem = GameSaveSystem;
570
+ exports.IndexedDBAdapter = IndexedDBAdapter;
571
+ exports.LocalStorageAdapter = LocalStorageAdapter;
572
+ exports.createMigration = createMigration;
573
+ exports.createSaveSystem = createSaveSystem;
574
+ //# sourceMappingURL=GameSaveSystem.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GameSaveSystem.js","sources":["../../../src/performance/GameSaveSystem.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}