@zhin.js/plugin-word-riddle 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 (60) hide show
  1. package/README.md +20 -0
  2. package/lib/commands.d.ts +6 -0
  3. package/lib/commands.d.ts.map +1 -0
  4. package/lib/commands.js +94 -0
  5. package/lib/commands.js.map +1 -0
  6. package/lib/data/char-riddles.json +1 -0
  7. package/lib/data/riddles.d.ts +3 -0
  8. package/lib/data/riddles.d.ts.map +1 -0
  9. package/lib/data/riddles.js +2 -0
  10. package/lib/data/riddles.js.map +1 -0
  11. package/lib/engine.d.ts +9 -0
  12. package/lib/engine.d.ts.map +1 -0
  13. package/lib/engine.js +20 -0
  14. package/lib/engine.js.map +1 -0
  15. package/lib/game-flow.d.ts +12 -0
  16. package/lib/game-flow.d.ts.map +1 -0
  17. package/lib/game-flow.js +141 -0
  18. package/lib/game-flow.js.map +1 -0
  19. package/lib/hub-register.d.ts +5 -0
  20. package/lib/hub-register.d.ts.map +1 -0
  21. package/lib/hub-register.js +32 -0
  22. package/lib/hub-register.js.map +1 -0
  23. package/lib/index.d.ts +2 -0
  24. package/lib/index.d.ts.map +1 -0
  25. package/lib/index.js +26 -0
  26. package/lib/index.js.map +1 -0
  27. package/lib/models.d.ts +31 -0
  28. package/lib/models.d.ts.map +1 -0
  29. package/lib/models.js +25 -0
  30. package/lib/models.js.map +1 -0
  31. package/lib/riddle-command.d.ts +5 -0
  32. package/lib/riddle-command.d.ts.map +1 -0
  33. package/lib/riddle-command.js +56 -0
  34. package/lib/riddle-command.js.map +1 -0
  35. package/lib/riddle-provider.d.ts +21 -0
  36. package/lib/riddle-provider.d.ts.map +1 -0
  37. package/lib/riddle-provider.js +80 -0
  38. package/lib/riddle-provider.js.map +1 -0
  39. package/lib/session-service.d.ts +20 -0
  40. package/lib/session-service.d.ts.map +1 -0
  41. package/lib/session-service.js +108 -0
  42. package/lib/session-service.js.map +1 -0
  43. package/lib/view.d.ts +6 -0
  44. package/lib/view.d.ts.map +1 -0
  45. package/lib/view.js +50 -0
  46. package/lib/view.js.map +1 -0
  47. package/package.json +39 -0
  48. package/plugin.yml +2 -0
  49. package/src/commands.ts +112 -0
  50. package/src/data/char-riddles.json +1 -0
  51. package/src/data/riddles.ts +8 -0
  52. package/src/engine.ts +30 -0
  53. package/src/game-flow.ts +196 -0
  54. package/src/hub-register.ts +34 -0
  55. package/src/index.ts +32 -0
  56. package/src/models.ts +57 -0
  57. package/src/riddle-command.ts +66 -0
  58. package/src/riddle-provider.ts +105 -0
  59. package/src/session-service.ts +113 -0
  60. package/src/view.ts +60 -0
package/src/view.ts ADDED
@@ -0,0 +1,60 @@
1
+ import { buildChoiceKeyboard } from '@zhin.js/game-shared';
2
+ import type { SendContent } from 'zhin.js';
3
+ import { getRiddleById, RIDDLE_PREFIX, typeLabel } from './engine.js';
4
+ import type { RiddleSessionRow } from './models.js';
5
+ import { currentRiddleId, parseQueue } from './session-service.js';
6
+
7
+ const MAX_WRONG = 3;
8
+
9
+ export function buildRiddleView(
10
+ session: RiddleSessionRow,
11
+ eventLines: string[] = [],
12
+ ): SendContent | string {
13
+ const queue = parseQueue(session.queue);
14
+ const terminal = session.status !== 'active';
15
+ const riddleId = currentRiddleId(session);
16
+ const entry = riddleId ? getRiddleById(riddleId) : undefined;
17
+
18
+ const lines = [
19
+ `🧩 **${typeLabel(session.mode as 'char' | 'idiom')}**`,
20
+ '',
21
+ `进度 ${Math.min(session.index + 1, queue.length)}/${queue.length} · 得分 **${session.score}** · 连击 **${session.streak}**(最佳 ${session.best_streak})`,
22
+ ];
23
+
24
+ if (terminal) {
25
+ lines.push('', '🎊 **本轮题目已全部完成!**', `最终得分:**${session.score}**`);
26
+ } else if (entry) {
27
+ lines.push('', `❓ ${entry.question}`);
28
+ if (session.wrong_count > 0) {
29
+ lines.push(`⚠️ 本题失误 ${session.wrong_count}/${MAX_WRONG}`);
30
+ }
31
+ lines.push('', session.mode === 'char' ? '请回复一个汉字。' : '请回复四字成语。');
32
+ }
33
+
34
+ if (eventLines.length) lines.push('', ...eventLines);
35
+
36
+ if (!entry && !terminal) return '题目加载失败,请重新开始。';
37
+
38
+ const choices = terminal
39
+ ? [
40
+ { id: 'restart_char', label: '🔤 再来字谜', style: 'primary' as const },
41
+ { id: 'restart_idiom', label: '📜 再来成语', style: 'primary' as const },
42
+ ]
43
+ : [
44
+ { id: 'hint', label: '💡 提示', style: 'secondary' as const },
45
+ { id: 'skip', label: '⏭️ 跳过', style: 'secondary' as const },
46
+ { id: 'quit', label: '🏳️ 结束', style: 'danger' as const },
47
+ ];
48
+
49
+ return buildChoiceKeyboard({
50
+ gamePrefix: RIDDLE_PREFIX,
51
+ sessionId: session.id,
52
+ narrative: lines.join('\n'),
53
+ choices,
54
+ terminal,
55
+ buttonsPerRow: terminal ? 2 : 3,
56
+ fallbackHint: '回复答案,或 1提示 2跳过 3结束',
57
+ });
58
+ }
59
+
60
+ export { MAX_WRONG };