@zhin.js/plugin-text-adventure 1.0.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.
Files changed (98) hide show
  1. package/README.md +92 -0
  2. package/lib/achievements.d.ts +24 -0
  3. package/lib/achievements.d.ts.map +1 -0
  4. package/lib/achievements.js +62 -0
  5. package/lib/achievements.js.map +1 -0
  6. package/lib/adv-command.d.ts +5 -0
  7. package/lib/adv-command.d.ts.map +1 -0
  8. package/lib/adv-command.js +55 -0
  9. package/lib/adv-command.js.map +1 -0
  10. package/lib/commands.d.ts +6 -0
  11. package/lib/commands.d.ts.map +1 -0
  12. package/lib/commands.js +96 -0
  13. package/lib/commands.js.map +1 -0
  14. package/lib/game-flow.d.ts +9 -0
  15. package/lib/game-flow.d.ts.map +1 -0
  16. package/lib/game-flow.js +134 -0
  17. package/lib/game-flow.js.map +1 -0
  18. package/lib/hub-register.d.ts +5 -0
  19. package/lib/hub-register.d.ts.map +1 -0
  20. package/lib/hub-register.js +25 -0
  21. package/lib/hub-register.js.map +1 -0
  22. package/lib/index.d.ts +2 -0
  23. package/lib/index.d.ts.map +1 -0
  24. package/lib/index.js +37 -0
  25. package/lib/index.js.map +1 -0
  26. package/lib/models.d.ts +45 -0
  27. package/lib/models.d.ts.map +1 -0
  28. package/lib/models.js +37 -0
  29. package/lib/models.js.map +1 -0
  30. package/lib/profile-format.d.ts +6 -0
  31. package/lib/profile-format.d.ts.map +1 -0
  32. package/lib/profile-format.js +64 -0
  33. package/lib/profile-format.js.map +1 -0
  34. package/lib/profile-parse.d.ts +4 -0
  35. package/lib/profile-parse.d.ts.map +1 -0
  36. package/lib/profile-parse.js +21 -0
  37. package/lib/profile-parse.js.map +1 -0
  38. package/lib/profile-service.d.ts +17 -0
  39. package/lib/profile-service.d.ts.map +1 -0
  40. package/lib/profile-service.js +124 -0
  41. package/lib/profile-service.js.map +1 -0
  42. package/lib/scene-view.d.ts +4 -0
  43. package/lib/scene-view.d.ts.map +1 -0
  44. package/lib/scene-view.js +32 -0
  45. package/lib/scene-view.js.map +1 -0
  46. package/lib/session-service.d.ts +22 -0
  47. package/lib/session-service.d.ts.map +1 -0
  48. package/lib/session-service.js +100 -0
  49. package/lib/session-service.js.map +1 -0
  50. package/lib/story-catalog.d.ts +13 -0
  51. package/lib/story-catalog.d.ts.map +1 -0
  52. package/lib/story-catalog.js +104 -0
  53. package/lib/story-catalog.js.map +1 -0
  54. package/lib/story-items.d.ts +5 -0
  55. package/lib/story-items.d.ts.map +1 -0
  56. package/lib/story-items.js +23 -0
  57. package/lib/story-items.js.map +1 -0
  58. package/lib/story-path.d.ts +3 -0
  59. package/lib/story-path.d.ts.map +1 -0
  60. package/lib/story-path.js +66 -0
  61. package/lib/story-path.js.map +1 -0
  62. package/lib/story-scenes.d.ts +9 -0
  63. package/lib/story-scenes.d.ts.map +1 -0
  64. package/lib/story-scenes.js +478 -0
  65. package/lib/story-scenes.js.map +1 -0
  66. package/lib/story-transitions.d.ts +3 -0
  67. package/lib/story-transitions.d.ts.map +1 -0
  68. package/lib/story-transitions.js +193 -0
  69. package/lib/story-transitions.js.map +1 -0
  70. package/lib/story-types.d.ts +30 -0
  71. package/lib/story-types.d.ts.map +1 -0
  72. package/lib/story-types.js +3 -0
  73. package/lib/story-types.js.map +1 -0
  74. package/lib/story.d.ts +21 -0
  75. package/lib/story.d.ts.map +1 -0
  76. package/lib/story.js +91 -0
  77. package/lib/story.js.map +1 -0
  78. package/package.json +54 -0
  79. package/plugin.yml +2 -0
  80. package/src/achievements.ts +90 -0
  81. package/src/adv-command.ts +72 -0
  82. package/src/commands.ts +133 -0
  83. package/src/game-flow.ts +196 -0
  84. package/src/hub-register.ts +32 -0
  85. package/src/index.ts +47 -0
  86. package/src/models.ts +84 -0
  87. package/src/profile-format.ts +76 -0
  88. package/src/profile-parse.ts +19 -0
  89. package/src/profile-service.ts +151 -0
  90. package/src/scene-view.ts +46 -0
  91. package/src/session-service.ts +113 -0
  92. package/src/story-catalog.ts +110 -0
  93. package/src/story-items.ts +24 -0
  94. package/src/story-path.ts +75 -0
  95. package/src/story-scenes.ts +508 -0
  96. package/src/story-transitions.ts +198 -0
  97. package/src/story-types.ts +33 -0
  98. package/src/story.ts +104 -0
@@ -0,0 +1,104 @@
1
+ import { SCENES } from './story-scenes.js';
2
+ /** 区域中文名(用于地图 / 成就展示) */
3
+ export const REGION_LABELS = {
4
+ start: '秘境入口',
5
+ rubble: '碎石廊',
6
+ watchtower: '瞭望石塔',
7
+ observatory: '星象台',
8
+ vine_path: '秘径',
9
+ corridor: '幽暗走廊',
10
+ mural_room: '铭文壁画',
11
+ whisper_gallery: '低语画廊',
12
+ spring: '精灵泉',
13
+ flooded_hall: '积水厅',
14
+ bell_tower: '钟楼',
15
+ garden: '古庭院',
16
+ greenhouse: '遗迹温室',
17
+ library: '尘封书库',
18
+ ember_forge: '锻炉间',
19
+ market_ruins: '废墟市集',
20
+ ghost_bridge: '冥河石桥',
21
+ crystal_cave: '晶洞',
22
+ moon_pool: '月池',
23
+ sunken_shrine: '水下沉殿',
24
+ depths: '墓穴岔口',
25
+ crypt_entry: '墓穴入口',
26
+ catacombs: '骸骨甬道',
27
+ ossuary: '龛室',
28
+ prison_cell: '囚室',
29
+ spider_nest: '蛛巢',
30
+ shadow_maze: '暗影迷宫',
31
+ sealed_gates: '封印密室',
32
+ vault: '宝藏前厅',
33
+ vault_open: '宝库',
34
+ throne_room: '王座厅',
35
+ };
36
+ export const ENDING_LABELS = {
37
+ treasure: '遗迹宝藏',
38
+ ascension: '星辉归位',
39
+ wisdom: '智者归途',
40
+ curse: '贪婪代价',
41
+ escape: '生还',
42
+ defeat: '陨落',
43
+ coward: '怯懦归途',
44
+ hermit: '庭院隐者',
45
+ redemption: '幽魂解脱',
46
+ drowned: '寒水沉眠',
47
+ spider: '茧中亡魂',
48
+ labyrinth: '迷宫迷失',
49
+ star_keeper: '星守誓约',
50
+ mask_king: '面具之王',
51
+ merchant: '行商结局',
52
+ };
53
+ /** 地图分区(便于 adv map 分组展示) */
54
+ export const MAP_ZONES = [
55
+ {
56
+ name: '入口与塔',
57
+ sceneIds: ['start', 'rubble', 'watchtower', 'observatory', 'vine_path'],
58
+ },
59
+ {
60
+ name: '主廊与泉',
61
+ sceneIds: ['corridor', 'mural_room', 'whisper_gallery', 'spring', 'flooded_hall', 'bell_tower'],
62
+ },
63
+ {
64
+ name: '庭院书库',
65
+ sceneIds: ['garden', 'greenhouse', 'library', 'ember_forge'],
66
+ },
67
+ {
68
+ name: '冥域水线',
69
+ sceneIds: ['market_ruins', 'ghost_bridge', 'crystal_cave', 'moon_pool', 'sunken_shrine'],
70
+ },
71
+ {
72
+ name: '墓穴深处',
73
+ sceneIds: [
74
+ 'depths',
75
+ 'crypt_entry',
76
+ 'catacombs',
77
+ 'ossuary',
78
+ 'prison_cell',
79
+ 'spider_nest',
80
+ 'shadow_maze',
81
+ 'sealed_gates',
82
+ 'vault',
83
+ 'vault_open',
84
+ 'throne_room',
85
+ ],
86
+ },
87
+ ];
88
+ export function playableSceneIds() {
89
+ return Object.values(SCENES)
90
+ .filter((s) => !s.terminal)
91
+ .map((s) => s.id);
92
+ }
93
+ export function endingIds() {
94
+ return Object.values(SCENES)
95
+ .filter((s) => s.terminal)
96
+ .map((s) => s.id);
97
+ }
98
+ export function regionLabel(id) {
99
+ return REGION_LABELS[id] ?? ENDING_LABELS[id] ?? id;
100
+ }
101
+ export function endingLabel(id) {
102
+ return ENDING_LABELS[id] ?? id;
103
+ }
104
+ //# sourceMappingURL=story-catalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"story-catalog.js","sourceRoot":"","sources":["../src/story-catalog.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /** 15 种可收集道具 */
2
+ export declare const ITEM_LABELS: Record<string, string>;
3
+ export declare const ITEM_IDS: string[];
4
+ export declare function itemLabel(id: string): string;
5
+ //# sourceMappingURL=story-items.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"story-items.d.ts","sourceRoot":"","sources":["../src/story-items.ts"],"names":[],"mappings":"AAAA,gBAAgB;AAChB,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAgB9C,CAAC;AAEF,eAAO,MAAM,QAAQ,UAA2B,CAAC;AAEjD,wBAAgB,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAE5C"}
@@ -0,0 +1,23 @@
1
+ /** 15 种可收集道具 */
2
+ export const ITEM_LABELS = {
3
+ torch: '火把',
4
+ key: '锈蚀钥匙',
5
+ gem: '幽蓝宝石',
6
+ herb: '荧光草药',
7
+ scroll: '残破卷轴',
8
+ amulet: '精灵护符',
9
+ silver_coin: '古银币',
10
+ rusted_blade: '生锈短剑',
11
+ moon_shard: '月华碎片',
12
+ elixir: '治愈灵药',
13
+ compass: '星象罗盘',
14
+ spirit_bell: '回音铃',
15
+ elf_feather: '银羽',
16
+ masquerade_mask: '仪式面具',
17
+ star_chart: '星图残页',
18
+ };
19
+ export const ITEM_IDS = Object.keys(ITEM_LABELS);
20
+ export function itemLabel(id) {
21
+ return ITEM_LABELS[id] ?? id;
22
+ }
23
+ //# sourceMappingURL=story-items.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"story-items.js","sourceRoot":"","sources":["../src/story-items.ts"],"names":[],"mappings":"AAAA,gBAAgB;AAChB,MAAM,CAAC,MAAM,WAAW,GAA2B;IACjD,KAAK,EAAE,IAAI;IACX,GAAG,EAAE,MAAM;IACX,GAAG,EAAE,MAAM;IACX,IAAI,EAAE,MAAM;IACZ,MAAM,EAAE,MAAM;IACd,MAAM,EAAE,MAAM;IACd,WAAW,EAAE,KAAK;IAClB,YAAY,EAAE,MAAM;IACpB,UAAU,EAAE,MAAM;IAClB,MAAM,EAAE,MAAM;IACd,OAAO,EAAE,MAAM;IACf,WAAW,EAAE,KAAK;IAClB,WAAW,EAAE,IAAI;IACjB,eAAe,EAAE,MAAM;IACvB,UAAU,EAAE,MAAM;CACnB,CAAC;AAEF,MAAM,CAAC,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;AAEjD,MAAM,UAAU,SAAS,CAAC,EAAU;IAClC,OAAO,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;AAC/B,CAAC"}
@@ -0,0 +1,3 @@
1
+ /** 允许回路的最长路径(玩家可多次往返) */
2
+ export declare function estimateLongestPlaythrough(maxDepth?: number): number;
3
+ //# sourceMappingURL=story-path.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"story-path.d.ts","sourceRoot":"","sources":["../src/story-path.ts"],"names":[],"mappings":"AAwCA,yBAAyB;AACzB,wBAAgB,0BAA0B,CAAC,QAAQ,SAAK,GAAG,MAAM,CAiChE"}
@@ -0,0 +1,66 @@
1
+ import { SCENES } from './story-scenes.js';
2
+ import { ITEM_IDS } from './story-items.js';
3
+ import { resolveTransition } from './story-transitions.js';
4
+ const OPTIMISTIC_FLAGS = {
5
+ spirit_met: true,
6
+ saw_map: true,
7
+ knows_sequence: true,
8
+ whisper_lore: true,
9
+ healed: true,
10
+ rested: true,
11
+ read_archive: true,
12
+ forged_blade: true,
13
+ amulet_upgraded: true,
14
+ moon_blessed: true,
15
+ shadow_banished: true,
16
+ };
17
+ function optimisticState(sceneId) {
18
+ return {
19
+ sceneId,
20
+ hp: 100,
21
+ inventory: [...ITEM_IDS],
22
+ flags: { ...OPTIMISTIC_FLAGS },
23
+ endingId: '',
24
+ };
25
+ }
26
+ function visibleChoiceIds(state) {
27
+ const scene = SCENES[state.sceneId];
28
+ if (!scene || scene.terminal)
29
+ return [];
30
+ return scene.choices
31
+ .filter((c) => !c.requires || c.requires(state))
32
+ .map((c) => c.id);
33
+ }
34
+ /** 允许回路的最长路径(玩家可多次往返) */
35
+ export function estimateLongestPlaythrough(maxDepth = 70) {
36
+ let best = 0;
37
+ const memo = new Map();
38
+ function walk(sceneId, depth) {
39
+ if (depth >= maxDepth)
40
+ return depth;
41
+ const key = `${sceneId}:${depth}`;
42
+ const cached = memo.get(key);
43
+ if (cached != null)
44
+ return cached;
45
+ const scene = SCENES[sceneId];
46
+ if (scene?.terminal) {
47
+ best = Math.max(best, depth);
48
+ memo.set(key, depth);
49
+ return depth;
50
+ }
51
+ best = Math.max(best, depth);
52
+ let localBest = depth;
53
+ const state = optimisticState(sceneId);
54
+ for (const choiceId of visibleChoiceIds(state)) {
55
+ const result = resolveTransition(state, choiceId);
56
+ if (!result)
57
+ continue;
58
+ localBest = Math.max(localBest, walk(result.nextSceneId, depth + 1));
59
+ }
60
+ memo.set(key, localBest);
61
+ return localBest;
62
+ }
63
+ walk('start', 0);
64
+ return best;
65
+ }
66
+ //# sourceMappingURL=story-path.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"story-path.js","sourceRoot":"","sources":["../src/story-path.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { Scene } from './story-types.js';
2
+ /** 非终局场景 28 个 + 终局 12 个 */
3
+ export declare const SCENES: Record<string, Scene>;
4
+ export declare function countScenes(): {
5
+ total: number;
6
+ playable: number;
7
+ terminals: number;
8
+ };
9
+ //# sourceMappingURL=story-scenes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"story-scenes.d.ts","sourceRoot":"","sources":["../src/story-scenes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAa,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAIzD,2BAA2B;AAC3B,eAAO,MAAM,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAgfxC,CAAC;AAEF,wBAAgB,WAAW,IAAI;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAIpF"}