@zhin.js/plugin-text-adventure 1.0.1 → 1.0.2

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 (78) hide show
  1. package/commands/adv/[action:string=].ts +15 -0
  2. package/lib/achievements.d.ts +0 -1
  3. package/lib/adv-command.d.ts +4 -3
  4. package/lib/adv-command.js +5 -1
  5. package/lib/adv-command.js.map +1 -1
  6. package/lib/game-flow.d.ts +5 -6
  7. package/lib/game-flow.js +14 -7
  8. package/lib/game-flow.js.map +1 -1
  9. package/lib/index.d.ts +8 -2
  10. package/lib/index.js +6 -34
  11. package/lib/index.js.map +1 -1
  12. package/lib/memory-db.d.ts +6 -0
  13. package/lib/memory-db.js +18 -0
  14. package/lib/memory-db.js.map +1 -0
  15. package/lib/models.d.ts +5 -4
  16. package/lib/models.js +3 -3
  17. package/lib/models.js.map +1 -1
  18. package/lib/profile-format.d.ts +0 -1
  19. package/lib/profile-parse.d.ts +0 -1
  20. package/lib/profile-service.d.ts +0 -1
  21. package/lib/runtime-store.d.ts +6 -0
  22. package/lib/runtime-store.js +7 -0
  23. package/lib/runtime-store.js.map +1 -0
  24. package/lib/scene-view.d.ts +1 -2
  25. package/lib/scene-view.js +1 -1
  26. package/lib/scene-view.js.map +1 -1
  27. package/lib/session-service.d.ts +1 -3
  28. package/lib/session-service.js +1 -4
  29. package/lib/session-service.js.map +1 -1
  30. package/lib/story-catalog.d.ts +0 -1
  31. package/lib/story-items.d.ts +0 -1
  32. package/lib/story-path.d.ts +0 -1
  33. package/lib/story-scenes.d.ts +0 -1
  34. package/lib/story-transitions.d.ts +0 -1
  35. package/lib/story-types.d.ts +0 -1
  36. package/lib/story.d.ts +0 -1
  37. package/middlewares/adv-alias.ts +18 -0
  38. package/middlewares/adv-choice.ts +70 -0
  39. package/package.json +36 -18
  40. package/plugin.ts +65 -0
  41. package/schema.json +6 -0
  42. package/src/adv-command.ts +12 -3
  43. package/src/game-flow.ts +17 -12
  44. package/src/index.ts +7 -43
  45. package/src/memory-db.ts +22 -0
  46. package/src/models.ts +8 -6
  47. package/src/profile-service.ts +1 -1
  48. package/src/runtime-store.ts +9 -0
  49. package/src/scene-view.ts +2 -2
  50. package/src/session-service.ts +2 -5
  51. package/lib/achievements.d.ts.map +0 -1
  52. package/lib/adv-command.d.ts.map +0 -1
  53. package/lib/commands.d.ts +0 -6
  54. package/lib/commands.d.ts.map +0 -1
  55. package/lib/commands.js +0 -115
  56. package/lib/commands.js.map +0 -1
  57. package/lib/game-flow.d.ts.map +0 -1
  58. package/lib/hub-register.d.ts +0 -5
  59. package/lib/hub-register.d.ts.map +0 -1
  60. package/lib/hub-register.js +0 -31
  61. package/lib/hub-register.js.map +0 -1
  62. package/lib/index.d.ts.map +0 -1
  63. package/lib/models.d.ts.map +0 -1
  64. package/lib/profile-format.d.ts.map +0 -1
  65. package/lib/profile-parse.d.ts.map +0 -1
  66. package/lib/profile-service.d.ts.map +0 -1
  67. package/lib/scene-view.d.ts.map +0 -1
  68. package/lib/session-service.d.ts.map +0 -1
  69. package/lib/story-catalog.d.ts.map +0 -1
  70. package/lib/story-items.d.ts.map +0 -1
  71. package/lib/story-path.d.ts.map +0 -1
  72. package/lib/story-scenes.d.ts.map +0 -1
  73. package/lib/story-transitions.d.ts.map +0 -1
  74. package/lib/story-types.d.ts.map +0 -1
  75. package/lib/story.d.ts.map +0 -1
  76. package/plugin.yml +0 -2
  77. package/src/commands.ts +0 -155
  78. package/src/hub-register.ts +0 -32
@@ -1 +0,0 @@
1
- {"version":3,"file":"scene-view.d.ts","sourceRoot":"","sources":["../src/scene-view.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE3C,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAUhE,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,aAAa,EACtB,cAAc,SAAK,EACnB,OAAO,CAAC,EAAE,aAAa,EACvB,WAAW,CAAC,EAAE,MAAM,GACnB,WAAW,GAAG,IAAI,CA+BpB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"session-service.d.ts","sourceRoot":"","sources":["../src/session-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,EAAgB,MAAM,SAAS,CAAC;AAExF,OAAO,KAAK,EAAgB,aAAa,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,EAAwB,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE5E,MAAM,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAS5D,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,cAAc,CAAC;IACzB,QAAQ,EAAE,cAAc,CAAC;CAC1B;AAED,qBAAa,cAAc;IACb,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,WAAW;IAEtC,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAQlE,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAMhF,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAIlD,yBAAyB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAS3E,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC;IA2B5D,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAOvE,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAalD;AAED,wBAAgB,cAAc,CAAC,EAAE,EAAE,WAAW,GAAG,YAAY,CAK5D;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,eAAe,GAAG,WAAW,CAEzE"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"story-catalog.d.ts","sourceRoot":"","sources":["../src/story-catalog.ts"],"names":[],"mappings":"AAEA,yBAAyB;AACzB,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAgChD,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAgBhD,CAAC;AAEF,4BAA4B;AAC5B,eAAO,MAAM,SAAS,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,CAiCjE,CAAC;AAEF,wBAAgB,gBAAgB,IAAI,MAAM,EAAE,CAI3C;AAED,wBAAgB,SAAS,IAAI,MAAM,EAAE,CAIpC;AAED,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAE9C"}
@@ -1 +0,0 @@
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"}
@@ -1 +0,0 @@
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"}
@@ -1 +0,0 @@
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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"story-transitions.d.ts","sourceRoot":"","sources":["../src/story-transitions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAEhE,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAmMzF"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"story-types.d.ts","sourceRoot":"","sources":["../src/story-types.ts"],"names":[],"mappings":"AAAA,oBAAoB;AACpB,eAAO,MAAM,UAAU,QAAQ,CAAC;AAEhC,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,SAAS,GAAG,QAAQ,GAAG,WAAW,CAAC;IAC3C,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,OAAO,CAAC;CAC1C;AAED,MAAM,WAAW,KAAK;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,SAAS,KAAK,MAAM,CAAC,CAAC;IAC9C,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"story.d.ts","sourceRoot":"","sources":["../src/story.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,YAAY,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACpF,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACpE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAExD,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAKvE,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,OAAO,GAAG,MAAM,EAAE,CAW3E;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAarG;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB,GAAG,SAAS,CAQZ;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAKxD;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAErF;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK,GAAG,SAAS,CAE3D;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,4CAE5D;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,GAAG,SAAS,CAwBnF;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,GAAG,MAAM,CAIrE"}
package/plugin.yml DELETED
@@ -1,2 +0,0 @@
1
- name: "@zhin.js/plugin-text-adventure"
2
- description: "交互式文字冒险游戏"
package/src/commands.ts DELETED
@@ -1,155 +0,0 @@
1
- import {
2
- Message,
3
- MessageCommand,
4
- getActionFromMessage,
5
- type Plugin,
6
- } from 'zhin.js';
7
- import {
8
- buildChoiceFallbackMap,
9
- channelKey,
10
- normalizeAdvAction,
11
- parseChoicePayload,
12
- registerGameTextMiddleware,
13
- resolveGameChoice,
14
- resolveGameTextPayload,
15
- } from '@zhin.js/game-shared';
16
- import { runAdvCommand } from './adv-command.js';
17
- import { handleChoice } from './game-flow.js';
18
- import { ADV_PREFIX, getScene, stateFromSession, visibleChoices } from './story.js';
19
- import type { GameServices } from './session-service.js';
20
-
21
- async function resolveAdvChoice(
22
- message: Message<any>,
23
- services: GameServices,
24
- ): Promise<{ sessionId: string; choiceId: string } | null> {
25
- const restart = await resolveGameChoice({
26
- message,
27
- gamePrefix: ADV_PREFIX,
28
- validChoiceIds: ['restart'],
29
- getById: (id) => services.sessions.getById(id),
30
- getActiveForUser: (ch, uid) => services.sessions.getActiveForUser(ch, uid),
31
- getByBoardMessageId: (mid) => services.sessions.getActiveByBoardMessageId(mid),
32
- });
33
- if (restart) return restart;
34
-
35
- const action = getActionFromMessage(message);
36
- if (!action) return null;
37
-
38
- const fromPayload = parseChoicePayload(action.payload, ADV_PREFIX);
39
- if (fromPayload) {
40
- return { sessionId: fromPayload.sessionId, choiceId: fromPayload.choiceId };
41
- }
42
-
43
- const choiceId = action.id || action.payload;
44
- if (!choiceId) return null;
45
-
46
- const ch = channelKey(message);
47
- const session =
48
- await services.sessions.getActiveForUser(ch, message.$sender.id)
49
- ?? (action.sourceMessageId
50
- ? await services.sessions.getActiveByBoardMessageId(action.sourceMessageId)
51
- : null);
52
- if (!session || session.channel_key !== ch) return null;
53
-
54
- const scene = getScene(session.scene_id);
55
- if (!scene) return null;
56
- const state = stateFromSession(session);
57
- const choices = visibleChoices(scene, state);
58
- if (!choices.some((c) => c.id === choiceId)) return null;
59
-
60
- return { sessionId: session.id, choiceId };
61
- }
62
-
63
- export function registerCommands(
64
- plugin: Plugin,
65
- getServices: () => GameServices | null,
66
- ): void {
67
- registerAdvPattern(plugin, '/adv [action:word]', '秘境探险(adv)', getServices);
68
- registerAdvPattern(plugin, '/冒险 [action:word]', '秘境探险(中文)', getServices);
69
- registerAdvPattern(plugin, '/秘境 [action:word]', '秘境探险(简称)', getServices);
70
- }
71
-
72
- function registerAdvPattern(
73
- plugin: Plugin,
74
- pattern: string,
75
- desc: string,
76
- getServices: () => GameServices | null,
77
- ): void {
78
- plugin.addCommand(
79
- new MessageCommand(pattern)
80
- .desc(desc)
81
- .action(async (message, result) => {
82
- const services = getServices();
83
- if (!services) return '文字冒险需要启用 database 配置。';
84
- const raw = (result.params.action as string | undefined) ?? '';
85
- return runAdvCommand(plugin, services, message, normalizeAdvAction(raw));
86
- }),
87
- );
88
- }
89
-
90
- async function handleAdvAction(
91
- plugin: Plugin,
92
- getServices: () => GameServices | null,
93
- message: Message<any>,
94
- ): Promise<boolean> {
95
- const services = getServices();
96
- if (!services) return false;
97
- const choice = await resolveAdvChoice(message, services);
98
- if (!choice) return false;
99
- const err = await handleChoice(plugin, services, message, choice.sessionId, choice.choiceId);
100
- if (err) await message.$reply?.(err);
101
- return true;
102
- }
103
-
104
- export function registerInteractive(
105
- plugin: Plugin,
106
- getServices: () => GameServices | null,
107
- ): void {
108
- plugin.registerInteractiveHandler(`${ADV_PREFIX}:`, (message) =>
109
- handleAdvAction(plugin, getServices, message),
110
- );
111
- }
112
-
113
- export function registerTextFallback(
114
- plugin: Plugin,
115
- getServices: () => GameServices | null,
116
- ): void {
117
- registerGameTextMiddleware(plugin, async (message, next) => {
118
- const services = getServices();
119
- if (!services) return next();
120
-
121
- const action = getActionFromMessage(message);
122
- if (action?.payload.startsWith(`${ADV_PREFIX}:`)) return next();
123
-
124
- const raw = message.$raw?.trim() ?? '';
125
- const ch = channelKey(message);
126
-
127
- const payloadFromText = resolveGameTextPayload(raw);
128
- if (payloadFromText?.startsWith(`${ADV_PREFIX}:`)) {
129
- const parsed = parseChoicePayload(payloadFromText, ADV_PREFIX);
130
- if (parsed) {
131
- const session = await services.sessions.getById(parsed.sessionId);
132
- if (session?.channel_key === ch) {
133
- const err = await handleChoice(plugin, services, message, parsed.sessionId, parsed.choiceId);
134
- if (err) await message.$reply?.(err);
135
- return;
136
- }
137
- }
138
- }
139
-
140
- const session = await services.sessions.getActiveForUser(ch, message.$sender.id);
141
- if (!session) return next();
142
-
143
- const scene = getScene(session.scene_id);
144
- if (!scene) return next();
145
- const state = stateFromSession(session);
146
- const choices = visibleChoices(scene, state);
147
- const map = buildChoiceFallbackMap(ADV_PREFIX, session.id, choices);
148
- const payload = resolveGameTextPayload(raw, map);
149
- const parsed = payload ? parseChoicePayload(payload, ADV_PREFIX) : null;
150
- if (!parsed || parsed.sessionId !== session.id) return next();
151
-
152
- const err = await handleChoice(plugin, services, message, session.id, parsed.choiceId);
153
- if (err) await message.$reply?.(err);
154
- }, 'adv:text');
155
- }
@@ -1,32 +0,0 @@
1
- import { getPlugin } from 'zhin.js';
2
- import { ensureGameHubService } from '@zhin.js/game-shared';
3
- import { runAdvCommand, ADV_HELP } from './adv-command.js';
4
- import type { GameServices } from './session-service.js';
5
-
6
- export function registerAdvHub(getServices: () => GameServices | null): () => void {
7
- const plugin = getPlugin();
8
- ensureGameHubService(plugin);
9
- return plugin.registerGame({
10
- id: 'adv',
11
- title: '秘境探险',
12
- icon: '🗺️',
13
- description: '文字冒险,31 区域 · 15 结局 · 成就收集',
14
- commandPrefix: '/冒险',
15
- quickStart: '开始',
16
- aliases: ['adv', '秘境'],
17
- menus: [
18
- { id: 'start', label: '🚪 开始冒险', style: 'primary' },
19
- { id: 'continue', label: '🔄 继续冒险' },
20
- { id: 'map', label: '🗺️ 探索进度' },
21
- { id: 'achievements', label: '🏅 成就' },
22
- { id: 'help', label: '📖 玩法说明' },
23
- ],
24
- runAction: async (actionId, ctx) => {
25
- const services = getServices();
26
- if (!services) return '文字冒险需要启用 database 配置。';
27
- return runAdvCommand(ctx.plugin, services, ctx.message, actionId);
28
- },
29
- });
30
- }
31
-
32
- export { ADV_HELP };