@react-text-game/core 0.2.2 → 0.3.0
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.
- package/README.md +2 -0
- package/dist/game.d.ts.map +1 -1
- package/dist/game.js +13 -0
- package/dist/game.js.map +1 -1
- package/dist/saves/hooks/useLoadGame.d.ts +3 -0
- package/dist/saves/hooks/useLoadGame.d.ts.map +1 -1
- package/dist/saves/hooks/useLoadGame.js +23 -1
- package/dist/saves/hooks/useLoadGame.js.map +1 -1
- package/dist/saves/index.d.ts +1 -0
- package/dist/saves/index.d.ts.map +1 -1
- package/dist/saves/index.js +1 -0
- package/dist/saves/index.js.map +1 -1
- package/dist/saves/migrations/EXAMPLE.d.ts +113 -0
- package/dist/saves/migrations/EXAMPLE.d.ts.map +1 -0
- package/dist/saves/migrations/EXAMPLE.js +304 -0
- package/dist/saves/migrations/EXAMPLE.js.map +1 -0
- package/dist/saves/migrations/index.d.ts +41 -0
- package/dist/saves/migrations/index.d.ts.map +1 -0
- package/dist/saves/migrations/index.js +40 -0
- package/dist/saves/migrations/index.js.map +1 -0
- package/dist/saves/migrations/registry.d.ts +72 -0
- package/dist/saves/migrations/registry.d.ts.map +1 -0
- package/dist/saves/migrations/registry.js +174 -0
- package/dist/saves/migrations/registry.js.map +1 -0
- package/dist/saves/migrations/runner.d.ts +45 -0
- package/dist/saves/migrations/runner.d.ts.map +1 -0
- package/dist/saves/migrations/runner.js +139 -0
- package/dist/saves/migrations/runner.js.map +1 -0
- package/dist/saves/migrations/types.d.ts +182 -0
- package/dist/saves/migrations/types.d.ts.map +1 -0
- package/dist/saves/migrations/types.js +2 -0
- package/dist/saves/migrations/types.js.map +1 -0
- package/dist/tests/migrations.test.d.ts +2 -0
- package/dist/tests/migrations.test.d.ts.map +1 -0
- package/dist/tests/migrations.test.js +602 -0
- package/dist/tests/migrations.test.js.map +1 -0
- package/package.json +2 -3
package/README.md
CHANGED
|
@@ -384,6 +384,8 @@ Storage.setState(state);
|
|
|
384
384
|
|
|
385
385
|
The engine includes a comprehensive save/load system built on IndexedDB (via Dexie) with encryption support for export/import:
|
|
386
386
|
|
|
387
|
+
> **💾 Save Migrations**: For managing save compatibility across game versions, see the [Save Migration Guide](./MIGRATIONS.md).
|
|
388
|
+
|
|
387
389
|
```typescript
|
|
388
390
|
import {
|
|
389
391
|
useSaveSlots,
|
package/dist/game.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"game.d.ts","sourceRoot":"","sources":["../src/game.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C,OAAO,EAAe,UAAU,EAAc,OAAO,EAAE,MAAM,UAAU,CAAC;AACxE,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"game.d.ts","sourceRoot":"","sources":["../src/game.ts"],"names":[],"mappings":"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"}
|
package/dist/game.js
CHANGED
|
@@ -3,6 +3,7 @@ import { STORAGE_SYSTEM_PATH, SYSTEM_PASSAGE_NAMES } from "./constants";
|
|
|
3
3
|
import { logger } from "./logger";
|
|
4
4
|
import { _getOptions, newOptions } from "./options";
|
|
5
5
|
import { createOrUpdateSystemSave } from "./saves";
|
|
6
|
+
import { validateMigrations } from "./saves/migrations";
|
|
6
7
|
import { Storage } from "./storage";
|
|
7
8
|
const objectRegistry = new Map();
|
|
8
9
|
const passagesRegistry = new Map();
|
|
@@ -432,6 +433,18 @@ export class Game {
|
|
|
432
433
|
if (Game.options.isDevMode) {
|
|
433
434
|
logger.warn("Game is running in dev mode, do not use in production!");
|
|
434
435
|
}
|
|
436
|
+
// Validate migrations in dev mode
|
|
437
|
+
if (Game.options.isDevMode) {
|
|
438
|
+
const validation = validateMigrations(Game.options.gameVersion);
|
|
439
|
+
if (!validation.valid) {
|
|
440
|
+
logger.warn("Migration validation failed. The following issues were found:");
|
|
441
|
+
validation.issues.forEach((issue) => logger.warn(` - ${issue}`));
|
|
442
|
+
logger.warn("These issues may cause problems when loading saves from older versions.");
|
|
443
|
+
}
|
|
444
|
+
else if (validation.issues.length === 0) {
|
|
445
|
+
logger.log("Migration validation passed");
|
|
446
|
+
}
|
|
447
|
+
}
|
|
435
448
|
Game.setCurrent(SYSTEM_PASSAGE_NAMES.START_MENU);
|
|
436
449
|
const initialState = Game.getState(true);
|
|
437
450
|
await createOrUpdateSystemSave(initialState);
|
package/dist/game.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"game.js","sourceRoot":"","sources":["../src/game.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"game.js","sourceRoot":"","sources":["../src/game.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,9 @@
|
|
|
2
2
|
* React hook that provides a function to load a saved game by its ID.
|
|
3
3
|
* Restores the game state from the specified save.
|
|
4
4
|
*
|
|
5
|
+
* **Automatic Migration**: If the save version differs from the current game version,
|
|
6
|
+
* registered migrations will be automatically applied to bring the save data up to date.
|
|
7
|
+
*
|
|
5
8
|
* @returns Function that accepts an optional save ID and loads the game, returning a result object on failure
|
|
6
9
|
*
|
|
7
10
|
* @example
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useLoadGame.d.ts","sourceRoot":"","sources":["../../../src/saves/hooks/useLoadGame.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"useLoadGame.d.ts","sourceRoot":"","sources":["../../../src/saves/hooks/useLoadGame.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,WAAW,SAAgB,IAAI,MAAM;;;cAiDjD,CAAC"}
|
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
import { Game } from "../../game";
|
|
2
2
|
import { loadGame } from "../../saves";
|
|
3
|
+
import { migrateToCurrentVersion } from "../../saves/migrations";
|
|
3
4
|
/**
|
|
4
5
|
* React hook that provides a function to load a saved game by its ID.
|
|
5
6
|
* Restores the game state from the specified save.
|
|
6
7
|
*
|
|
8
|
+
* **Automatic Migration**: If the save version differs from the current game version,
|
|
9
|
+
* registered migrations will be automatically applied to bring the save data up to date.
|
|
10
|
+
*
|
|
7
11
|
* @returns Function that accepts an optional save ID and loads the game, returning a result object on failure
|
|
8
12
|
*
|
|
9
13
|
* @example
|
|
@@ -26,7 +30,25 @@ export const useLoadGame = () => async (id) => {
|
|
|
26
30
|
message: "The requested game save does not exist",
|
|
27
31
|
};
|
|
28
32
|
}
|
|
29
|
-
|
|
33
|
+
// Apply migrations if needed
|
|
34
|
+
const currentVersion = Game.options.gameVersion;
|
|
35
|
+
const saveVersion = data.version;
|
|
36
|
+
let gameData = data.gameData;
|
|
37
|
+
if (saveVersion !== currentVersion) {
|
|
38
|
+
const migrationResult = migrateToCurrentVersion(data.gameData, saveVersion);
|
|
39
|
+
if (!migrationResult.success) {
|
|
40
|
+
return {
|
|
41
|
+
success: false,
|
|
42
|
+
message: `Failed to migrate save from version ${saveVersion} to ${currentVersion}: ${migrationResult.error}`,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
gameData = migrationResult.data;
|
|
46
|
+
// Log migration info for user visibility
|
|
47
|
+
if (migrationResult.migrationsApplied.length > 0) {
|
|
48
|
+
console.log(`Save migrated from version ${saveVersion} to ${currentVersion} (${migrationResult.migrationsApplied.length} step(s))`);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
Game.setState(gameData);
|
|
30
52
|
}
|
|
31
53
|
catch (e) {
|
|
32
54
|
console.error("Failed to load game:", e);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useLoadGame.js","sourceRoot":"","sources":["../../../src/saves/hooks/useLoadGame.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"useLoadGame.js","sourceRoot":"","sources":["../../../src/saves/hooks/useLoadGame.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAClC,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAE5D;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,GAAG,EAAE,CAAC,KAAK,EAAE,EAAU,EAAE,EAAE;IAClD,IAAI,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,EAAE,CAAC,CAAC;QAChC,IAAI,CAAC,IAAI,EAAE,CAAC;YACR,OAAO;gBACH,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,wCAAwC;aACpD,CAAC;QACN,CAAC;QAED,6BAA6B;QAC7B,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC;QAChD,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC;QAEjC,IAAI,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAE7B,IAAI,WAAW,KAAK,cAAc,EAAE,CAAC;YACjC,MAAM,eAAe,GAAG,uBAAuB,CAC3C,IAAI,CAAC,QAAQ,EACb,WAAW,CACd,CAAC;YAEF,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,CAAC;gBAC3B,OAAO;oBACH,OAAO,EAAE,KAAK;oBACd,OAAO,EAAE,uCAAuC,WAAW,OAAO,cAAc,KAAK,eAAe,CAAC,KAAK,EAAE;iBAC/G,CAAC;YACN,CAAC;YAED,QAAQ,GAAG,eAAe,CAAC,IAAK,CAAC;YAEjC,yCAAyC;YACzC,IAAI,eAAe,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC/C,OAAO,CAAC,GAAG,CACP,8BAA8B,WAAW,OAAO,cAAc,KAAK,eAAe,CAAC,iBAAiB,CAAC,MAAM,WAAW,CACzH,CAAC;YACN,CAAC;QACL,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC5B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACT,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,CAAC,CAAC,CAAC;QACzC,OAAO;YACH,OAAO,EAAE,KAAK;YACd,OAAO,EACF,CAAW,CAAC,OAAO;gBACpB,mDAAmD;SAC1D,CAAC;IACN,CAAC;AACL,CAAC,CAAC"}
|
package/dist/saves/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/saves/index.ts"],"names":[],"mappings":"AAAA,cAAc,MAAM,CAAC;AACrB,cAAc,SAAS,CAAC;AACxB,mBAAmB,SAAS,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/saves/index.ts"],"names":[],"mappings":"AAAA,cAAc,MAAM,CAAC;AACrB,cAAc,SAAS,CAAC;AACxB,cAAc,cAAc,CAAC;AAC7B,mBAAmB,SAAS,CAAC"}
|
package/dist/saves/index.js
CHANGED
package/dist/saves/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/saves/index.ts"],"names":[],"mappings":"AAAA,cAAc,MAAM,CAAC;AACrB,cAAc,SAAS,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/saves/index.ts"],"names":[],"mappings":"AAAA,cAAc,MAAM,CAAC;AACrB,cAAc,SAAS,CAAC;AACxB,cAAc,cAAc,CAAC"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EXAMPLE: Save Migration System Usage
|
|
3
|
+
*
|
|
4
|
+
* This file demonstrates how to use the save migration system in a real game.
|
|
5
|
+
* It shows a complete migration history from version 1.0.0 to 3.0.0.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Call this function during game initialization to register all migrations.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```typescript
|
|
12
|
+
* import { Game } from '@react-text-game/core';
|
|
13
|
+
* import { registerAllMigrations } from './migrations';
|
|
14
|
+
*
|
|
15
|
+
* async function initGame() {
|
|
16
|
+
* await Game.init({ gameVersion: "3.0.0", ... });
|
|
17
|
+
* registerAllMigrations();
|
|
18
|
+
* }
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
export declare function registerAllMigrations(): void;
|
|
22
|
+
/**
|
|
23
|
+
* Example test data for each version.
|
|
24
|
+
* Use these to test your migrations.
|
|
25
|
+
*/
|
|
26
|
+
export declare const testSaves: {
|
|
27
|
+
"1.0.0": {
|
|
28
|
+
player: {
|
|
29
|
+
name: string;
|
|
30
|
+
hp: number;
|
|
31
|
+
mp: number;
|
|
32
|
+
maxHp: number;
|
|
33
|
+
maxMp: number;
|
|
34
|
+
level: number;
|
|
35
|
+
experience: number;
|
|
36
|
+
};
|
|
37
|
+
};
|
|
38
|
+
"1.1.0": {
|
|
39
|
+
player: {
|
|
40
|
+
name: string;
|
|
41
|
+
hp: number;
|
|
42
|
+
mp: number;
|
|
43
|
+
maxHp: number;
|
|
44
|
+
maxMp: number;
|
|
45
|
+
level: number;
|
|
46
|
+
experience: number;
|
|
47
|
+
inventory: string[];
|
|
48
|
+
};
|
|
49
|
+
};
|
|
50
|
+
"2.0.0": {
|
|
51
|
+
player: {
|
|
52
|
+
name: string;
|
|
53
|
+
level: number;
|
|
54
|
+
experience: number;
|
|
55
|
+
inventory: string[];
|
|
56
|
+
stats: {
|
|
57
|
+
health: number;
|
|
58
|
+
mana: number;
|
|
59
|
+
maxHealth: number;
|
|
60
|
+
maxMana: number;
|
|
61
|
+
strength: number;
|
|
62
|
+
intelligence: number;
|
|
63
|
+
agility: number;
|
|
64
|
+
};
|
|
65
|
+
};
|
|
66
|
+
quests: {
|
|
67
|
+
active: string[];
|
|
68
|
+
completed: string[];
|
|
69
|
+
};
|
|
70
|
+
};
|
|
71
|
+
};
|
|
72
|
+
/**
|
|
73
|
+
* Example test function to verify migrations work correctly.
|
|
74
|
+
*
|
|
75
|
+
* @example
|
|
76
|
+
* ```typescript
|
|
77
|
+
* import { testMigrationChain } from './migrations/example';
|
|
78
|
+
*
|
|
79
|
+
* // In your test file or dev console
|
|
80
|
+
* testMigrationChain();
|
|
81
|
+
* ```
|
|
82
|
+
*/
|
|
83
|
+
export declare function testMigrationChain(): Promise<void>;
|
|
84
|
+
/**
|
|
85
|
+
* How to integrate this into your game:
|
|
86
|
+
*
|
|
87
|
+
* 1. Create a migrations file (like this one) in your game
|
|
88
|
+
* 2. Define migration functions for each version change
|
|
89
|
+
* 3. Call registerAllMigrations() after Game.init()
|
|
90
|
+
* 4. Migrations will automatically apply when players load old saves
|
|
91
|
+
*
|
|
92
|
+
* Example:
|
|
93
|
+
*
|
|
94
|
+
* ```typescript
|
|
95
|
+
* // src/index.tsx
|
|
96
|
+
* import { Game } from '@react-text-game/core';
|
|
97
|
+
* import { registerAllMigrations } from './game/migrations';
|
|
98
|
+
*
|
|
99
|
+
* async function init() {
|
|
100
|
+
* await Game.init({
|
|
101
|
+
* gameName: "My Adventure",
|
|
102
|
+
* gameVersion: "3.0.0",
|
|
103
|
+
* isDevMode: import.meta.env.DEV
|
|
104
|
+
* });
|
|
105
|
+
*
|
|
106
|
+
* registerAllMigrations();
|
|
107
|
+
*
|
|
108
|
+
* // Dev mode will validate your migration chain
|
|
109
|
+
* // and warn if there are any issues
|
|
110
|
+
* }
|
|
111
|
+
* ```
|
|
112
|
+
*/
|
|
113
|
+
//# sourceMappingURL=EXAMPLE.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EXAMPLE.d.ts","sourceRoot":"","sources":["../../../src/saves/migrations/EXAMPLE.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA+KH;;;;;;;;;;;;;GAaG;AACH,wBAAgB,qBAAqB,SAYpC;AAMD;;;GAGG;AACH,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6CrB,CAAC;AAEF;;;;;;;;;;GAUG;AACH,wBAAsB,kBAAkB,kBAgCvC;AAMD;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG"}
|
|
@@ -0,0 +1,304 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EXAMPLE: Save Migration System Usage
|
|
3
|
+
*
|
|
4
|
+
* This file demonstrates how to use the save migration system in a real game.
|
|
5
|
+
* It shows a complete migration history from version 1.0.0 to 3.0.0.
|
|
6
|
+
*/
|
|
7
|
+
import { registerMigration } from "./index";
|
|
8
|
+
// ============================================================================
|
|
9
|
+
// MIGRATION HISTORY
|
|
10
|
+
// ============================================================================
|
|
11
|
+
/**
|
|
12
|
+
* Version 1.0.0 → 1.1.0
|
|
13
|
+
* Added: Inventory system
|
|
14
|
+
*
|
|
15
|
+
* In version 1.1.0, we added an inventory system to the game.
|
|
16
|
+
* Players who saved in 1.0.0 don't have an inventory field,
|
|
17
|
+
* so we add an empty array as the default.
|
|
18
|
+
*
|
|
19
|
+
* NOTE: This migration uses the generic type parameter to specify
|
|
20
|
+
* the exact shape of the data it operates on. This provides:
|
|
21
|
+
* - Better type safety when accessing save.player.inventory
|
|
22
|
+
* - IDE autocomplete for the specific fields
|
|
23
|
+
* - Compile-time validation of the migration logic
|
|
24
|
+
*/
|
|
25
|
+
const migration_1_0_to_1_1 = {
|
|
26
|
+
from: "1.0.0",
|
|
27
|
+
to: "1.1.0",
|
|
28
|
+
description: "Added player inventory system",
|
|
29
|
+
migrate: (save) => {
|
|
30
|
+
const player = save.player || {};
|
|
31
|
+
return {
|
|
32
|
+
...save,
|
|
33
|
+
player: {
|
|
34
|
+
...player,
|
|
35
|
+
inventory: [],
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
/**
|
|
41
|
+
* Version 1.1.0 → 1.2.0
|
|
42
|
+
* Added: Quest tracking system
|
|
43
|
+
*
|
|
44
|
+
* We added a quest system with active and completed quests.
|
|
45
|
+
*
|
|
46
|
+
* NOTE: This migration does NOT use the generic type parameter,
|
|
47
|
+
* relying on the default GameSaveState type. This is fine for simple
|
|
48
|
+
* migrations where type safety is less critical. Use generics when:
|
|
49
|
+
* - You need type safety for complex nested structures
|
|
50
|
+
* - You want IDE autocomplete for specific fields
|
|
51
|
+
* - The migration logic is non-trivial and could benefit from type checking
|
|
52
|
+
*/
|
|
53
|
+
const migration_1_1_to_1_2 = {
|
|
54
|
+
from: "1.1.0",
|
|
55
|
+
to: "1.2.0",
|
|
56
|
+
description: "Added quest tracking system",
|
|
57
|
+
migrate: (save) => ({
|
|
58
|
+
...save,
|
|
59
|
+
quests: {
|
|
60
|
+
active: [],
|
|
61
|
+
completed: [],
|
|
62
|
+
},
|
|
63
|
+
}),
|
|
64
|
+
};
|
|
65
|
+
/**
|
|
66
|
+
* Version 1.2.0 → 2.0.0 (MAJOR VERSION)
|
|
67
|
+
* Changed: Renamed 'hp' to 'health', 'mp' to 'mana'
|
|
68
|
+
* Changed: Moved stats into a separate 'stats' object
|
|
69
|
+
*
|
|
70
|
+
* This is a breaking change that restructures how player stats are stored.
|
|
71
|
+
*/
|
|
72
|
+
const migration_1_2_to_2_0 = {
|
|
73
|
+
from: "1.2.0",
|
|
74
|
+
to: "2.0.0",
|
|
75
|
+
description: "Restructured player stats: renamed hp→health, mp→mana, moved to stats object",
|
|
76
|
+
migrate: (save) => {
|
|
77
|
+
const player = save.player;
|
|
78
|
+
return {
|
|
79
|
+
...save,
|
|
80
|
+
player: {
|
|
81
|
+
name: player.name,
|
|
82
|
+
level: player.level ?? 1,
|
|
83
|
+
experience: player.experience ?? 0,
|
|
84
|
+
inventory: player.inventory ?? [],
|
|
85
|
+
stats: {
|
|
86
|
+
health: player.hp ?? 100,
|
|
87
|
+
mana: player.mp ?? 50,
|
|
88
|
+
maxHealth: player.maxHp ?? 100,
|
|
89
|
+
maxMana: player.maxMp ?? 50,
|
|
90
|
+
strength: player.strength ?? 10,
|
|
91
|
+
intelligence: player.intelligence ?? 10,
|
|
92
|
+
agility: player.agility ?? 10,
|
|
93
|
+
},
|
|
94
|
+
},
|
|
95
|
+
};
|
|
96
|
+
},
|
|
97
|
+
};
|
|
98
|
+
/**
|
|
99
|
+
* Version 2.0.0 → 2.1.0
|
|
100
|
+
* Added: Skills system
|
|
101
|
+
* Added: Player location tracking
|
|
102
|
+
*/
|
|
103
|
+
const migration_2_0_to_2_1 = {
|
|
104
|
+
from: "2.0.0",
|
|
105
|
+
to: "2.1.0",
|
|
106
|
+
description: "Added skills system and location tracking",
|
|
107
|
+
migrate: (save) => {
|
|
108
|
+
const player = (save.player || {});
|
|
109
|
+
return {
|
|
110
|
+
...save,
|
|
111
|
+
player: {
|
|
112
|
+
...player,
|
|
113
|
+
skills: {
|
|
114
|
+
combat: 1,
|
|
115
|
+
magic: 1,
|
|
116
|
+
crafting: 1,
|
|
117
|
+
},
|
|
118
|
+
location: {
|
|
119
|
+
passageId: "start",
|
|
120
|
+
zone: "village",
|
|
121
|
+
},
|
|
122
|
+
},
|
|
123
|
+
};
|
|
124
|
+
},
|
|
125
|
+
};
|
|
126
|
+
/**
|
|
127
|
+
* Version 2.1.0 → 3.0.0 (MAJOR VERSION)
|
|
128
|
+
* Changed: Completely redesigned inventory system
|
|
129
|
+
* - Old: Array of item names
|
|
130
|
+
* - New: Array of item objects with id, quantity, metadata
|
|
131
|
+
*
|
|
132
|
+
* This migration converts the old simple inventory to the new detailed format.
|
|
133
|
+
*/
|
|
134
|
+
const migration_2_1_to_3_0 = {
|
|
135
|
+
from: "2.1.0",
|
|
136
|
+
to: "3.0.0",
|
|
137
|
+
description: "Redesigned inventory to use item objects instead of strings",
|
|
138
|
+
migrate: (save) => {
|
|
139
|
+
const player = save.player;
|
|
140
|
+
const oldInventory = (player.inventory || []);
|
|
141
|
+
// Count duplicate items
|
|
142
|
+
const itemCounts = new Map();
|
|
143
|
+
for (const itemName of oldInventory) {
|
|
144
|
+
itemCounts.set(itemName, (itemCounts.get(itemName) || 0) + 1);
|
|
145
|
+
}
|
|
146
|
+
// Convert to new format
|
|
147
|
+
const newInventory = Array.from(itemCounts.entries()).map(([name, quantity], index) => ({
|
|
148
|
+
id: `item_${index}`,
|
|
149
|
+
name,
|
|
150
|
+
quantity,
|
|
151
|
+
metadata: {},
|
|
152
|
+
}));
|
|
153
|
+
return {
|
|
154
|
+
...save,
|
|
155
|
+
player: {
|
|
156
|
+
...player,
|
|
157
|
+
inventory: newInventory,
|
|
158
|
+
},
|
|
159
|
+
};
|
|
160
|
+
},
|
|
161
|
+
};
|
|
162
|
+
// ============================================================================
|
|
163
|
+
// MIGRATION REGISTRATION
|
|
164
|
+
// ============================================================================
|
|
165
|
+
/**
|
|
166
|
+
* Call this function during game initialization to register all migrations.
|
|
167
|
+
*
|
|
168
|
+
* @example
|
|
169
|
+
* ```typescript
|
|
170
|
+
* import { Game } from '@react-text-game/core';
|
|
171
|
+
* import { registerAllMigrations } from './migrations';
|
|
172
|
+
*
|
|
173
|
+
* async function initGame() {
|
|
174
|
+
* await Game.init({ gameVersion: "3.0.0", ... });
|
|
175
|
+
* registerAllMigrations();
|
|
176
|
+
* }
|
|
177
|
+
* ```
|
|
178
|
+
*/
|
|
179
|
+
export function registerAllMigrations() {
|
|
180
|
+
// Register in chronological order for clarity
|
|
181
|
+
// The order doesn't actually matter - the system uses BFS to find the path
|
|
182
|
+
registerMigration(migration_1_0_to_1_1);
|
|
183
|
+
registerMigration(migration_1_1_to_1_2);
|
|
184
|
+
registerMigration(migration_1_2_to_2_0);
|
|
185
|
+
registerMigration(migration_2_0_to_2_1);
|
|
186
|
+
registerMigration(migration_2_1_to_3_0);
|
|
187
|
+
console.log("✓ Registered 5 save migrations covering versions 1.0.0 → 3.0.0");
|
|
188
|
+
}
|
|
189
|
+
// ============================================================================
|
|
190
|
+
// TESTING MIGRATIONS
|
|
191
|
+
// ============================================================================
|
|
192
|
+
/**
|
|
193
|
+
* Example test data for each version.
|
|
194
|
+
* Use these to test your migrations.
|
|
195
|
+
*/
|
|
196
|
+
export const testSaves = {
|
|
197
|
+
"1.0.0": {
|
|
198
|
+
player: {
|
|
199
|
+
name: "Hero",
|
|
200
|
+
hp: 80,
|
|
201
|
+
mp: 30,
|
|
202
|
+
maxHp: 100,
|
|
203
|
+
maxMp: 50,
|
|
204
|
+
level: 5,
|
|
205
|
+
experience: 1200,
|
|
206
|
+
},
|
|
207
|
+
},
|
|
208
|
+
"1.1.0": {
|
|
209
|
+
player: {
|
|
210
|
+
name: "Hero",
|
|
211
|
+
hp: 80,
|
|
212
|
+
mp: 30,
|
|
213
|
+
maxHp: 100,
|
|
214
|
+
maxMp: 50,
|
|
215
|
+
level: 5,
|
|
216
|
+
experience: 1200,
|
|
217
|
+
inventory: ["sword", "potion", "potion"],
|
|
218
|
+
},
|
|
219
|
+
},
|
|
220
|
+
"2.0.0": {
|
|
221
|
+
player: {
|
|
222
|
+
name: "Hero",
|
|
223
|
+
level: 5,
|
|
224
|
+
experience: 1200,
|
|
225
|
+
inventory: ["sword", "potion", "potion"],
|
|
226
|
+
stats: {
|
|
227
|
+
health: 80,
|
|
228
|
+
mana: 30,
|
|
229
|
+
maxHealth: 100,
|
|
230
|
+
maxMana: 50,
|
|
231
|
+
strength: 12,
|
|
232
|
+
intelligence: 8,
|
|
233
|
+
agility: 10,
|
|
234
|
+
},
|
|
235
|
+
},
|
|
236
|
+
quests: {
|
|
237
|
+
active: ["main_quest_1"],
|
|
238
|
+
completed: ["tutorial"],
|
|
239
|
+
},
|
|
240
|
+
},
|
|
241
|
+
};
|
|
242
|
+
/**
|
|
243
|
+
* Example test function to verify migrations work correctly.
|
|
244
|
+
*
|
|
245
|
+
* @example
|
|
246
|
+
* ```typescript
|
|
247
|
+
* import { testMigrationChain } from './migrations/example';
|
|
248
|
+
*
|
|
249
|
+
* // In your test file or dev console
|
|
250
|
+
* testMigrationChain();
|
|
251
|
+
* ```
|
|
252
|
+
*/
|
|
253
|
+
export async function testMigrationChain() {
|
|
254
|
+
const { runMigrations } = await import("./runner");
|
|
255
|
+
console.group("Testing Save Migration Chain");
|
|
256
|
+
// Test 1.0.0 → 3.0.0 (full chain)
|
|
257
|
+
console.log("\nTest 1: Migrating from 1.0.0 to 3.0.0");
|
|
258
|
+
const result1 = runMigrations(testSaves["1.0.0"], "1.0.0", "3.0.0", {
|
|
259
|
+
verbose: true,
|
|
260
|
+
});
|
|
261
|
+
console.log(result1.success ? "✓ Success" : "✗ Failed:", result1.error || result1.data);
|
|
262
|
+
// Test 1.1.0 → 3.0.0 (partial chain)
|
|
263
|
+
console.log("\nTest 2: Migrating from 1.1.0 to 3.0.0");
|
|
264
|
+
const result2 = runMigrations(testSaves["1.1.0"], "1.1.0", "3.0.0");
|
|
265
|
+
console.log(result2.success ? "✓ Success" : "✗ Failed:", result2.error || result2.data);
|
|
266
|
+
// Test 2.0.0 → 3.0.0 (single migration)
|
|
267
|
+
console.log("\nTest 3: Migrating from 2.0.0 to 3.0.0");
|
|
268
|
+
const result3 = runMigrations(testSaves["2.0.0"], "2.0.0", "3.0.0");
|
|
269
|
+
console.log(result3.success ? "✓ Success" : "✗ Failed:", result3.error || result3.data);
|
|
270
|
+
console.groupEnd();
|
|
271
|
+
}
|
|
272
|
+
// ============================================================================
|
|
273
|
+
// USAGE IN YOUR GAME
|
|
274
|
+
// ============================================================================
|
|
275
|
+
/**
|
|
276
|
+
* How to integrate this into your game:
|
|
277
|
+
*
|
|
278
|
+
* 1. Create a migrations file (like this one) in your game
|
|
279
|
+
* 2. Define migration functions for each version change
|
|
280
|
+
* 3. Call registerAllMigrations() after Game.init()
|
|
281
|
+
* 4. Migrations will automatically apply when players load old saves
|
|
282
|
+
*
|
|
283
|
+
* Example:
|
|
284
|
+
*
|
|
285
|
+
* ```typescript
|
|
286
|
+
* // src/index.tsx
|
|
287
|
+
* import { Game } from '@react-text-game/core';
|
|
288
|
+
* import { registerAllMigrations } from './game/migrations';
|
|
289
|
+
*
|
|
290
|
+
* async function init() {
|
|
291
|
+
* await Game.init({
|
|
292
|
+
* gameName: "My Adventure",
|
|
293
|
+
* gameVersion: "3.0.0",
|
|
294
|
+
* isDevMode: import.meta.env.DEV
|
|
295
|
+
* });
|
|
296
|
+
*
|
|
297
|
+
* registerAllMigrations();
|
|
298
|
+
*
|
|
299
|
+
* // Dev mode will validate your migration chain
|
|
300
|
+
* // and warn if there are any issues
|
|
301
|
+
* }
|
|
302
|
+
* ```
|
|
303
|
+
*/
|
|
304
|
+
//# sourceMappingURL=EXAMPLE.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EXAMPLE.js","sourceRoot":"","sources":["../../../src/saves/migrations/EXAMPLE.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Save Migration System
|
|
3
|
+
*
|
|
4
|
+
* This module provides a complete solution for versioning and migrating game saves.
|
|
5
|
+
* It allows developers to register migration functions that transform save data
|
|
6
|
+
* from older versions to newer versions.
|
|
7
|
+
*
|
|
8
|
+
* ## Key Concepts
|
|
9
|
+
*
|
|
10
|
+
* - **Migration**: A function that transforms save data from version A to version B
|
|
11
|
+
* - **Migration Path**: A sequence of migrations needed to go from an old version to the current version
|
|
12
|
+
* - **Migration Chain**: Migrations are applied sequentially (1.0.0 → 1.1.0 → 1.2.0 → 2.0.0)
|
|
13
|
+
*
|
|
14
|
+
* ## Usage
|
|
15
|
+
*
|
|
16
|
+
* ```typescript
|
|
17
|
+
* import { registerMigration } from '@react-text-game/core/saves';
|
|
18
|
+
*
|
|
19
|
+
* // Register a migration when you make a breaking change
|
|
20
|
+
* registerMigration({
|
|
21
|
+
* from: "1.0.0",
|
|
22
|
+
* to: "1.1.0",
|
|
23
|
+
* description: "Added player inventory system",
|
|
24
|
+
* migrate: (data) => ({
|
|
25
|
+
* ...data,
|
|
26
|
+
* player: {
|
|
27
|
+
* ...data.player,
|
|
28
|
+
* inventory: [] // Add default value
|
|
29
|
+
* }
|
|
30
|
+
* })
|
|
31
|
+
* });
|
|
32
|
+
* ```
|
|
33
|
+
*
|
|
34
|
+
* Migrations are automatically applied when loading saves via `useLoadGame()`.
|
|
35
|
+
*
|
|
36
|
+
* @module saves/migrations
|
|
37
|
+
*/
|
|
38
|
+
export { clearMigrations, findMigrationPath, getAllMigrations, registerMigration, validateMigrations, } from "./registry";
|
|
39
|
+
export { migrateToCurrentVersion, runMigrations } from "./runner";
|
|
40
|
+
export type { MigrationOptions, MigrationResult, SaveMigration, SaveMigrationFn, } from "./types";
|
|
41
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/saves/migrations/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AAEH,OAAO,EACH,eAAe,EACf,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,GACrB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,uBAAuB,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAClE,YAAY,EACR,gBAAgB,EAChB,eAAe,EACf,aAAa,EACb,eAAe,GAClB,MAAM,SAAS,CAAC"}
|