@zhin.js/plugin-text-adventure 1.1.15 → 1.1.16

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 (48) hide show
  1. package/commands/adv/[[action]]/index.js +4 -4
  2. package/commands/adv/[[action]]/index.ts +4 -4
  3. package/lib/achievements.d.ts +4 -1
  4. package/lib/achievements.js +18 -17
  5. package/lib/achievements.js.map +1 -1
  6. package/lib/adv-command.d.ts +1 -0
  7. package/lib/adv-command.js +31 -20
  8. package/lib/adv-command.js.map +1 -1
  9. package/lib/game-flow.d.ts +1 -1
  10. package/lib/game-flow.js +50 -21
  11. package/lib/game-flow.js.map +1 -1
  12. package/lib/models.d.ts +4 -1
  13. package/lib/models.js +2 -1
  14. package/lib/models.js.map +1 -1
  15. package/lib/profile-format.d.ts +4 -3
  16. package/lib/profile-format.js +14 -13
  17. package/lib/profile-format.js.map +1 -1
  18. package/lib/scene-view.js +5 -3
  19. package/lib/scene-view.js.map +1 -1
  20. package/lib/session-service.js +1 -0
  21. package/lib/session-service.js.map +1 -1
  22. package/lib/story-catalog.d.ts +4 -2
  23. package/lib/story-catalog.js +59 -9
  24. package/lib/story-catalog.js.map +1 -1
  25. package/lib/story-items.d.ts +2 -1
  26. package/lib/story-items.js +19 -2
  27. package/lib/story-items.js.map +1 -1
  28. package/lib/story-scenes.d.ts +2 -1
  29. package/lib/story-scenes.js +1358 -464
  30. package/lib/story-scenes.js.map +1 -1
  31. package/lib/story.d.ts +4 -3
  32. package/lib/story.js +8 -8
  33. package/lib/story.js.map +1 -1
  34. package/middlewares/adv-alias/index.js +5 -3
  35. package/middlewares/adv-alias/index.ts +5 -3
  36. package/package.json +7 -7
  37. package/plugin.js +4 -0
  38. package/src/achievements.ts +21 -17
  39. package/src/adv-command.ts +35 -24
  40. package/src/game-flow.ts +51 -22
  41. package/src/models.ts +4 -2
  42. package/src/profile-format.ts +15 -13
  43. package/src/scene-view.ts +5 -3
  44. package/src/session-service.ts +1 -0
  45. package/src/story-catalog.ts +63 -10
  46. package/src/story-items.ts +21 -2
  47. package/src/story-scenes.ts +1103 -206
  48. package/src/story.ts +9 -8
@@ -1,17 +1,17 @@
1
1
  // Generated by build-plugin-runtime-entries.mjs. Do not edit.
2
2
  import { defineCommand } from 'zhin.js/command';
3
3
  import { messageFromCommandInput, normalizeAdvAction } from '@zhin.js/game-kit';
4
- import { ADV_HELP, runAdvCommand } from "../../../lib/adv-command.js";
4
+ import { getAdvHelp, runAdvCommand } from "../../../lib/adv-command.js";
5
5
  import { resolveGameServices } from "../../../lib/runtime-store.js";
6
6
  export default defineCommand({
7
7
  description: 'Text Adventure',
8
8
  params: { action: { type: 'string', default: '' } },
9
- async execute({ params, input, use, owner }) {
9
+ async execute({ params, input, use, locale, formatCommand }) {
10
10
  const action = normalizeAdvAction(String(params.action ?? ''));
11
11
  if (!action || action === 'help')
12
- return ADV_HELP;
12
+ return getAdvHelp({ locale, formatCommand });
13
13
  const services = resolveGameServices({ use });
14
- const message = messageFromCommandInput(input);
14
+ const message = messageFromCommandInput(input, { locale, formatCommand });
15
15
  return runAdvCommand(services, message, action);
16
16
  },
17
17
  });
@@ -1,16 +1,16 @@
1
1
  import { defineCommand } from 'zhin.js/command';
2
2
  import { messageFromCommandInput, normalizeAdvAction } from '@zhin.js/game-kit';
3
- import { ADV_HELP, runAdvCommand } from '../../../src/adv-command.js';
3
+ import { getAdvHelp, runAdvCommand } from '../../../src/adv-command.js';
4
4
  import { resolveGameServices } from '../../../src/runtime-store.js';
5
5
 
6
6
  export default defineCommand({
7
7
  description: 'Text Adventure',
8
8
  params: { action: { type: 'string', default: '' } },
9
- async execute({ params, input, use, owner }) {
9
+ async execute({ params, input, use, locale, formatCommand }) {
10
10
  const action = normalizeAdvAction(String(params.action ?? ''));
11
- if (!action || action === 'help') return ADV_HELP;
11
+ if (!action || action === 'help') return getAdvHelp({ locale, formatCommand });
12
12
  const services = resolveGameServices({ use });
13
- const message = messageFromCommandInput(input);
13
+ const message = messageFromCommandInput(input, { locale, formatCommand });
14
14
  return runAdvCommand(services, message, action);
15
15
  },
16
16
  });
@@ -1,8 +1,11 @@
1
+ import { type Locale } from 'zhin.js/i18n';
1
2
  export interface AchievementDef {
2
3
  id: string;
3
4
  icon: string;
4
5
  title: string;
5
6
  description: string;
7
+ titleEn: string;
8
+ descriptionEn: string;
6
9
  hidden?: boolean;
7
10
  }
8
11
  export interface AchievementContext {
@@ -19,5 +22,5 @@ export interface AchievementContext {
19
22
  }
20
23
  export declare const ACHIEVEMENTS: AchievementDef[];
21
24
  export declare function evaluateAchievements(unlocked: string[], ctx: AchievementContext): string[];
22
- export declare function achievementById(id: string): AchievementDef | undefined;
25
+ export declare function achievementById(id: string, locale?: Locale): AchievementDef | undefined;
23
26
  export declare function totalAchievements(): number;
@@ -1,21 +1,21 @@
1
1
  import { ITEM_IDS } from './story-items.js';
2
2
  import { endingIds, playableSceneIds } from './story-catalog.js';
3
3
  export const ACHIEVEMENTS = [
4
- { id: 'first_footprint', icon: '👣', title: '初探者', description: '累计探索 5 个区域' },
5
- { id: 'cartographer', icon: '🗺️', title: '制图师', description: '解锁半数区域(50%+)' },
6
- { id: 'master_explorer', icon: '🧭', title: '全图行者', description: '解锁全部可探索区域' },
7
- { id: 'ending_hunter', icon: '🎬', title: '结局猎人', description: '见证 3 种不同结局' },
8
- { id: 'ending_collector', icon: '📚', title: '结局收藏家', description: '见证 8 种不同结局' },
9
- { id: 'completionist', icon: '👑', title: '秘境通晓者', description: '见证全部 15 种结局' },
10
- { id: 'star_ascendant', icon: '🌟', title: '星辉守忆', description: '达成「星辉归位」结局' },
11
- { id: 'moon_guardian', icon: '🌙', title: '月池星守', description: '达成「星守誓约」结局' },
12
- { id: 'mask_monarch', icon: '🎭', title: '面具之王', description: '达成「面具之王」结局' },
13
- { id: 'item_hoarder', icon: '🎒', title: '拾荒大师', description: '生涯累计发现 10 种道具' },
14
- { id: 'full_satchel', icon: '💎', title: '万象行囊', description: '生涯集齐全部 15 种道具' },
15
- { id: 'marathon_runner', icon: '🏃', title: '马拉松探险', description: '单局步数达到 50+' },
16
- { id: 'veteran', icon: '⚔️', title: '遗迹老兵', description: '完成 5 局冒险' },
17
- { id: 'whisper_listener', icon: '👂', title: '低语聆听者', description: '进入低语画廊' },
18
- { id: 'deep_diver', icon: '🌊', title: '沉殿潜行者', description: '抵达水下沉殿' },
4
+ { id: 'first_footprint', icon: '👣', title: '初探者', description: '累计探索 5 个区域', titleEn: "First Footprints", descriptionEn: "Explore 5 regions across your adventures" },
5
+ { id: 'cartographer', icon: '🗺️', title: '制图师', description: '解锁半数区域(50%+)', titleEn: "Cartographer", descriptionEn: "Discover at least half of all regions" },
6
+ { id: 'master_explorer', icon: '🧭', title: '全图行者', description: '解锁全部可探索区域', titleEn: "Master Explorer", descriptionEn: "Discover every explorable region" },
7
+ { id: 'ending_hunter', icon: '🎬', title: '结局猎人', description: '见证 3 种不同结局', titleEn: "Ending Hunter", descriptionEn: "Witness 3 different endings" },
8
+ { id: 'ending_collector', icon: '📚', title: '结局收藏家', description: '见证 8 种不同结局', titleEn: "Ending Collector", descriptionEn: "Witness 8 different endings" },
9
+ { id: 'completionist', icon: '👑', title: '秘境通晓者', description: '见证全部 15 种结局', titleEn: "Completionist", descriptionEn: "Witness all 15 endings" },
10
+ { id: 'star_ascendant', icon: '🌟', title: '星辉守忆', description: '达成「星辉归位」结局', titleEn: "Keeper of Starlight", descriptionEn: "Reach the Starlight Restored ending" },
11
+ { id: 'moon_guardian', icon: '🌙', title: '月池星守', description: '达成「星守誓约」结局', titleEn: "Moon Guardian", descriptionEn: "Reach the Star Keeper's Oath ending" },
12
+ { id: 'mask_monarch', icon: '🎭', title: '面具之王', description: '达成「面具之王」结局', titleEn: "King of Masks", descriptionEn: "Reach the King of Masks ending" },
13
+ { id: 'item_hoarder', icon: '🎒', title: '拾荒大师', description: '生涯累计发现 10 种道具', titleEn: "Master Scavenger", descriptionEn: "Discover 10 different items across your adventures" },
14
+ { id: 'full_satchel', icon: '💎', title: '万象行囊', description: '生涯集齐全部 15 种道具', titleEn: "Full Satchel", descriptionEn: "Discover all 15 items across your adventures" },
15
+ { id: 'marathon_runner', icon: '🏃', title: '马拉松探险', description: '单局步数达到 50+', titleEn: "Marathon Explorer", descriptionEn: "Take at least 50 steps in one adventure" },
16
+ { id: 'veteran', icon: '⚔️', title: '遗迹老兵', description: '完成 5 局冒险', titleEn: "Ruins Veteran", descriptionEn: "Complete 5 adventures" },
17
+ { id: 'whisper_listener', icon: '👂', title: '低语聆听者', description: '进入低语画廊', titleEn: "Whisper Listener", descriptionEn: "Enter the Whispering Gallery" },
18
+ { id: 'deep_diver', icon: '🌊', title: '沉殿潜行者', description: '抵达水下沉殿', titleEn: "Deep Diver", descriptionEn: "Reach the Sunken Shrine" },
19
19
  ];
20
20
  const PLAYABLE_TOTAL = playableSceneIds().length;
21
21
  const ENDING_TOTAL = endingIds().length;
@@ -53,8 +53,9 @@ export function evaluateAchievements(unlocked, ctx) {
53
53
  }
54
54
  return newly;
55
55
  }
56
- export function achievementById(id) {
57
- return ACHIEVEMENTS.find((a) => a.id === id);
56
+ export function achievementById(id, locale = 'zh-CN') {
57
+ const def = ACHIEVEMENTS.find((a) => a.id === id);
58
+ return def && locale === 'en' ? { ...def, title: def.titleEn, description: def.descriptionEn } : def;
58
59
  }
59
60
  export function totalAchievements() {
60
61
  return ACHIEVEMENTS.length;
@@ -1 +1 @@
1
- {"version":3,"file":"achievements.js","sourceRoot":"","sources":["../src/achievements.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"achievements.js","sourceRoot":"","sources":["../src/achievements.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import { type GameMessageLike, type GameReply } from '@zhin.js/game-kit';
2
2
  import type { GameServices } from './session-service.js';
3
+ export declare function getAdvHelp(message: Pick<GameMessageLike, 'locale' | 'formatCommand'>): string;
3
4
  export declare const ADV_HELP: string;
4
5
  export declare function runAdvCommand(services: GameServices, message: GameMessageLike, action: string): Promise<GameReply>;
@@ -1,31 +1,42 @@
1
- import { channelKey, } from '@zhin.js/game-kit';
1
+ import { createMessages, resolveLocale } from 'zhin.js/i18n';
2
+ import { formatGameHelp, gameCommandHint, gameCommandFeedback, channelKey } from '@zhin.js/game-kit';
2
3
  import { continueAdventure, sessionSummary, startAdventure, } from './game-flow.js';
3
4
  import { formatAchievements, formatMapProgress, formatProgressCompact } from './profile-format.js';
4
- export const ADV_HELP = [
5
- '秘境探险 · 文字冒险',
6
- '冒险 / adv — 帮助与状态',
7
- '冒险 开始 — 开始新冒险',
8
- '冒险 继续 — 刷新当前场景',
9
- '冒险 地图 — 全图探索进度',
10
- '冒险 成就 — 成就列表',
11
- '冒险 放弃 — 放弃当前冒险',
12
- '',
13
- '推进方式:点击选项按钮,或回复数字(1、2…)',
14
- ].join('\n');
5
+ const messages = createMessages({
6
+ map: { 'zh-CN': '全图探索进度', en: 'Exploration map' },
7
+ achievements: { 'zh-CN': '成就列表', en: 'Achievements' },
8
+ choices: { 'zh-CN': '推进方式:点击选项按钮,或回复数字(1、2…)', en: 'Choose an option button, or reply with its number (1, 2, …).' },
9
+ channel: { 'zh-CN': '— 当前频道 —', en: '— Current channel —' },
10
+ noGame: { 'zh-CN': '你没有进行中的冒险。', en: 'You have no active adventure.' },
11
+ quit: { 'zh-CN': '你已放弃冒险。', en: 'You have abandoned the adventure.' },
12
+ });
13
+ export function getAdvHelp(message) {
14
+ const locale = resolveLocale(message.locale);
15
+ const lines = [formatGameHelp(message, { 'zh-CN': '秘境探险 · 文字冒险', en: 'Hidden Ruins · Text Adventure' }, 'adv', ['start', 'continue', 'quit'])];
16
+ const command = message.formatCommand?.('adv');
17
+ if (command !== undefined) {
18
+ lines.push(`${command} map — ${messages(locale, 'map')}`);
19
+ lines.push(`${command} achievements — ${messages(locale, 'achievements')}`);
20
+ }
21
+ lines.push('', messages(locale, 'choices'));
22
+ return lines.join('\n');
23
+ }
24
+ export const ADV_HELP = getAdvHelp({});
15
25
  export async function runAdvCommand(services, message, action) {
26
+ const locale = resolveLocale(message.locale);
16
27
  const ch = channelKey(message);
17
28
  const userId = message.$sender.id;
18
29
  const userName = message.$sender.name?.trim() || userId;
19
30
  if (!action || action === 'help') {
20
31
  const active = await services.sessions.getActiveByChannel(ch);
21
32
  const profile = await services.profiles.getOrCreate(userId, userName);
22
- const lines = [ADV_HELP, '', formatProgressCompact(profile), ''];
33
+ const lines = [getAdvHelp(message), '', formatProgressCompact(profile), ''];
23
34
  if (active) {
24
- lines.push('— 当前频道 —');
35
+ lines.push(messages(locale, 'channel'));
25
36
  lines.push(sessionSummary(active));
26
37
  }
27
38
  else {
28
- lines.push('暂无冒险,发送「冒险 开始」或从游戏大厅进入。');
39
+ lines.push(messages(locale, 'noGame') + gameCommandHint(message, 'adv'));
29
40
  }
30
41
  return lines.join('\n');
31
42
  }
@@ -37,19 +48,19 @@ export async function runAdvCommand(services, message, action) {
37
48
  }
38
49
  if (action === 'map') {
39
50
  const profile = await services.profiles.getOrCreate(userId, userName);
40
- return formatMapProgress(profile);
51
+ return formatMapProgress(profile, locale);
41
52
  }
42
53
  if (action === 'achievements' || action === 'achievement') {
43
54
  const profile = await services.profiles.getOrCreate(userId, userName);
44
- return formatAchievements(profile);
55
+ return formatAchievements(profile, false, locale);
45
56
  }
46
57
  if (action === 'quit') {
47
58
  const row = await services.sessions.getActiveForUser(ch, userId);
48
59
  if (!row)
49
- return '你没有进行中的冒险。';
60
+ return messages(locale, 'noGame');
50
61
  await services.sessions.updateSession(row.id, { status: 'aborted' });
51
- return '你已放弃冒险。';
62
+ return messages(resolveLocale(row.locale), 'quit');
52
63
  }
53
- return `未知子命令:${action}\n\n${ADV_HELP}`;
64
+ return `${gameCommandFeedback(message, 'unknown', action)}\n\n${getAdvHelp(message)}`;
54
65
  }
55
66
  //# sourceMappingURL=adv-command.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"adv-command.js","sourceRoot":"","sources":["../src/adv-command.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"adv-command.js","sourceRoot":"","sources":["../src/adv-command.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import type { GameMessageLike, GameReply } from '@zhin.js/game-kit';
1
+ import { type GameMessageLike, type GameReply } from '@zhin.js/game-kit';
2
2
  import type { AdvProfileRow, AdvSessionRow } from './models.js';
3
3
  import type { GameServices } from './session-service.js';
4
4
  export declare function sendOrEditScene(services: GameServices, message: GameMessageLike, session: AdvSessionRow, extraNarrative?: string, profile?: AdvProfileRow): Promise<GameReply>;
package/lib/game-flow.js CHANGED
@@ -1,3 +1,7 @@
1
+ import { createMessages, resolveLocale } from 'zhin.js/i18n';
2
+ import { gameCommandHint } from '@zhin.js/game-kit';
3
+ import { regionLabel, endingLabel } from './story-catalog.js';
4
+ import { itemLabel } from './story-items.js';
1
5
  import { formatNewAchievements } from './profile-format.js';
2
6
  import { buildSceneInteractive } from './scene-view.js';
3
7
  import { applyChoiceResult, getScene, resolveChoice, stateFromSession, visibleChoices, } from './story.js';
@@ -6,7 +10,7 @@ export async function sendOrEditScene(services, message, session, extraNarrative
6
10
  ?? await services.profiles.getOrCreate(session.player_id, session.player_name);
7
11
  const content = buildSceneInteractive(session, extraNarrative, prof, message.$channel.type);
8
12
  if (!content) {
9
- return '场景数据异常,请 adv quit 后重新开始。';
13
+ return messages(resolveLocale(session.locale), 'invalidScene');
10
14
  }
11
15
  return content;
12
16
  }
@@ -15,9 +19,11 @@ export async function startAdventure(services, message) {
15
19
  const active = await services.sessions.getActiveByChannel(ch);
16
20
  if (active) {
17
21
  if (active.player_id === message.$sender.id) {
18
- return '你已有进行中的冒险。发送 adv continue 继续,或 adv quit 放弃。';
22
+ const locale = resolveLocale(active.locale);
23
+ const command = message.formatCommand?.('adv');
24
+ return messages(locale, 'active') + (command === undefined ? '' : messages(locale, 'activeHint', { command }));
19
25
  }
20
- return `本频道已有玩家 ${active.player_name} 的冒险进行中。`;
26
+ return messages(resolveLocale(message.locale), 'channelBusy', { player: active.player_name });
21
27
  }
22
28
  await services.profiles.onRunStarted(message.$sender.id, message.$sender.name?.trim() || message.$sender.id);
23
29
  const session = await services.sessions.createSession(message);
@@ -26,23 +32,25 @@ export async function startAdventure(services, message) {
26
32
  }
27
33
  export async function handleChoice(services, message, sessionId, choiceId) {
28
34
  const session = await services.sessions.getById(sessionId);
35
+ const locale = resolveLocale(session ? session.locale : message.locale);
29
36
  // 踏进 terminal 场景时 status 必为 completed,终局需放行「再玩一次」(restart)
30
37
  if (!session || (session.status !== 'active' && !(session.status === 'completed' && choiceId === 'restart'))) {
31
- return '冒险不存在或已结束。';
38
+ return messages(locale, 'ended');
32
39
  }
33
40
  if (session.player_id !== message.$sender.id) {
34
- return '这是别人的冒险。';
41
+ return messages(locale, 'otherPlayer');
35
42
  }
36
43
  const state = stateFromSession(session);
37
44
  const scene = getScene(state.sceneId);
38
45
  if (!scene)
39
- return '场景丢失,请 adv quit 后重新开始。';
46
+ return messages(locale, 'invalidScene');
40
47
  if (scene.terminal && choiceId !== 'restart') {
41
- return '本局已结束,请点击「再玩一次」或发送 adv start。';
48
+ return messages(locale, 'restart');
42
49
  }
43
50
  if (choiceId === 'restart') {
44
51
  await services.sessions.updateSession(session.id, {
45
52
  scene_id: 'start',
53
+ locale: resolveLocale(message.locale),
46
54
  hp: 100,
47
55
  inventory: '[]',
48
56
  flags: '{}',
@@ -57,11 +65,11 @@ export async function handleChoice(services, message, sessionId, choiceId) {
57
65
  }
58
66
  // 服务端校验:选项必须当前可见(requires 门槛不能只靠视图层过滤,payload 可绕过)
59
67
  if (!visibleChoices(scene, state).some((c) => c.id === choiceId)) {
60
- return '该选项不可用。';
68
+ return messages(locale, 'unavailable');
61
69
  }
62
70
  const result = resolveChoice(state, choiceId);
63
71
  if (!result)
64
- return '该选项不可用。';
72
+ return messages(locale, 'unavailable');
65
73
  const next = applyChoiceResult(state, result);
66
74
  const nextScene = getScene(next.sceneId);
67
75
  const completed = !!nextScene?.terminal || next.hp <= 0;
@@ -87,30 +95,51 @@ export async function handleChoice(services, message, sessionId, choiceId) {
87
95
  newAchievements = [...new Set([...newAchievements, ...more])];
88
96
  }
89
97
  const updated = (await services.sessions.getById(session.id));
90
- const extra = formatNewAchievements(newAchievements);
98
+ const extra = formatNewAchievements(newAchievements, locale);
91
99
  return sendOrEditScene(services, message, updated, extra);
92
100
  }
93
101
  export async function continueAdventure(services, message) {
94
102
  const session = await services.sessions.getActiveForUser(`${message.$adapter}-${message.$endpoint}-${message.$channel.type}:${message.$channel.id}`, message.$sender.id);
95
103
  if (!session)
96
- return '你没有进行中的冒险,发送 adv start 开始。';
104
+ return messages(resolveLocale(message.locale), 'noGame') + gameCommandHint(message, 'adv');
97
105
  return sendOrEditScene(services, message, session);
98
106
  }
99
107
  export function sessionSummary(session) {
100
- const scene = getScene(session.scene_id);
108
+ const locale = resolveLocale(session.locale);
101
109
  const state = stateFromSession(session);
102
- const items = state.inventory;
103
110
  const lines = [
104
- `冒险 ${session.id}`,
105
- `玩家:${session.player_name}`,
106
- `场景:${scene?.id ?? session.scene_id}`,
107
- `生命:${session.hp}`,
108
- `物品:${items.length ? items.join(', ') : '无'}`,
109
- `步数:${session.step_count}`,
110
- `状态:${session.status}`,
111
+ messages(locale, 'summary', {
112
+ id: session.id,
113
+ player: session.player_name,
114
+ scene: regionLabel(session.scene_id, locale),
115
+ hp: session.hp,
116
+ items: state.inventory.length ? state.inventory.map((id) => itemLabel(id, locale)).join(', ') : messages(locale, 'none'),
117
+ steps: session.step_count,
118
+ status: messages(locale, session.status === 'active' ? 'activeStatus' : session.status === 'completed' ? 'completedStatus' : 'abortedStatus'),
119
+ }),
111
120
  ];
112
121
  if (session.ending_id)
113
- lines.push(`结局:${session.ending_id}`);
122
+ lines.push(messages(locale, 'ending', { ending: endingLabel(session.ending_id, locale) }));
114
123
  return lines.join('\n');
115
124
  }
125
+ const messages = createMessages({
126
+ invalidScene: { 'zh-CN': '场景数据异常,请结束当前冒险后重新开始。', en: 'The scene is unavailable. End this adventure and start again.' },
127
+ active: { 'zh-CN': '你已有进行中的冒险。', en: 'You already have an active adventure.' },
128
+ activeHint: { 'zh-CN': '发送「{command} continue」继续,或「{command} quit」放弃。', en: 'Send “{command} continue” to continue or “{command} quit” to leave.' },
129
+ channelBusy: { 'zh-CN': '本频道已有玩家 {player} 的冒险进行中。', en: '{player} already has an adventure in progress in this channel.' },
130
+ ended: { 'zh-CN': '冒险不存在或已结束。', en: 'This adventure does not exist or has ended.' },
131
+ otherPlayer: { 'zh-CN': '这是别人的冒险。', en: 'This adventure belongs to another player.' },
132
+ restart: { 'zh-CN': '本局已结束,请点击「再玩一次」开始新冒险。', en: 'This adventure has ended. Select “Play again” to start a new one.' },
133
+ unavailable: { 'zh-CN': '该选项不可用。', en: 'That choice is not available.' },
134
+ noGame: { 'zh-CN': '你没有进行中的冒险。', en: 'You have no active adventure.' },
135
+ none: { 'zh-CN': '无', en: 'None' },
136
+ activeStatus: { 'zh-CN': '进行中', en: 'Active' },
137
+ completedStatus: { 'zh-CN': '已完成', en: 'Completed' },
138
+ abortedStatus: { 'zh-CN': '已放弃', en: 'Abandoned' },
139
+ summary: {
140
+ 'zh-CN': '冒险 {id}\n玩家:{player}\n场景:{scene}\n生命:{hp}\n物品:{items}\n步数:{steps}\n状态:{status}',
141
+ en: 'Adventure {id}\nPlayer: {player}\nScene: {scene}\nHealth: {hp}\nItems: {items}\nSteps: {steps}\nStatus: {status}',
142
+ },
143
+ ending: { 'zh-CN': '结局:{ending}', en: 'Ending: {ending}' },
144
+ });
116
145
  //# sourceMappingURL=game-flow.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"game-flow.js","sourceRoot":"","sources":["../src/game-flow.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"game-flow.js","sourceRoot":"","sources":["../src/game-flow.ts"],"names":[],"mappings":"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"}
package/lib/models.d.ts CHANGED
@@ -4,6 +4,7 @@ declare module '@zhin.js/core' {
4
4
  interface Models {
5
5
  adv_sessions: {
6
6
  id: string;
7
+ locale?: 'zh-CN' | 'en' | null;
7
8
  adapter: string;
8
9
  endpoint: string;
9
10
  channel_type: string;
@@ -41,5 +42,7 @@ export type AdvSessionRow = Models['adv_sessions'];
41
42
  export type AdvProfileRow = Models['adv_profiles'];
42
43
  export type AdvModelName = 'adv_sessions' | 'adv_profiles';
43
44
  export declare function defineHostTables(db: {
44
- define: (name: string, definition: Record<string, unknown>) => void;
45
+ define: (name: string, definition: Record<string, unknown>, options?: {
46
+ readonly addColumns?: readonly string[];
47
+ }) => void;
45
48
  }): void;
package/lib/models.js CHANGED
@@ -1,6 +1,7 @@
1
1
  export function defineHostTables(db) {
2
2
  db.define('adv_sessions', {
3
3
  id: { type: 'text', primary: true },
4
+ locale: { type: 'text', nullable: true },
4
5
  adapter: { type: 'text', nullable: false },
5
6
  endpoint: { type: 'text', nullable: false },
6
7
  channel_type: { type: 'text', nullable: false },
@@ -17,7 +18,7 @@ export function defineHostTables(db) {
17
18
  step_count: { type: 'integer', default: 0 },
18
19
  updated_at: { type: 'bigint', default: 0 },
19
20
  created_at: { type: 'bigint', default: 0 },
20
- });
21
+ }, { addColumns: ['locale'] });
21
22
  db.define('adv_profiles', {
22
23
  player_id: { type: 'text', primary: true },
23
24
  player_name: { type: 'text', default: '' },
package/lib/models.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"models.js","sourceRoot":"","sources":["../src/models.ts"],"names":[],"mappings":"AA+CA,MAAM,UAAU,gBAAgB,CAC9B,EAA2E;IAE3E,EAAE,CAAC,MAAM,CAAC,cAAc,EAAE;QACxB,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE;QACnC,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE;QAC1C,QAAQ,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE;QAC3C,YAAY,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE;QAC/C,UAAU,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE;QAC7C,WAAW,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE;QAC9C,SAAS,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE;QAC5C,WAAW,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE;QAC1C,QAAQ,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE;QAC5C,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,EAAE;QACrC,SAAS,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE;QAC1C,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE;QACtC,SAAS,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE;QACxC,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE;QAC3C,UAAU,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,EAAE;QAC3C,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,EAAE;QAC1C,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,EAAE;KAC3C,CAAC,CAAC;IACH,EAAE,CAAC,MAAM,CAAC,cAAc,EAAE;QACxB,SAAS,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE;QAC1C,WAAW,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE;QAC1C,cAAc,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE;QAC/C,YAAY,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE;QAC7C,WAAW,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE;QAC5C,YAAY,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE;QAC7C,YAAY,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,EAAE;QAC7C,cAAc,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,EAAE;QAC/C,WAAW,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,EAAE;QAC5C,eAAe,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,EAAE;QAChD,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,EAAE;QAC1C,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,EAAE;KAC3C,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"models.js","sourceRoot":"","sources":["../src/models.ts"],"names":[],"mappings":"AAgDA,MAAM,UAAU,gBAAgB,CAC9B,EAAkI;IAElI,EAAE,CAAC,MAAM,CAAC,cAAc,EAAE;QACxB,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE;QACnC,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE;QACxC,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE;QAC1C,QAAQ,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE;QAC3C,YAAY,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE;QAC/C,UAAU,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE;QAC7C,WAAW,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE;QAC9C,SAAS,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE;QAC5C,WAAW,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE;QAC1C,QAAQ,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE;QAC5C,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,EAAE;QACrC,SAAS,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE;QAC1C,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE;QACtC,SAAS,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE;QACxC,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE;QAC3C,UAAU,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,EAAE;QAC3C,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,EAAE;QAC1C,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,EAAE;KAC3C,EAAE,EAAE,UAAU,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC/B,EAAE,CAAC,MAAM,CAAC,cAAc,EAAE;QACxB,SAAS,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE;QAC1C,WAAW,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE;QAC1C,cAAc,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE;QAC/C,YAAY,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE;QAC7C,WAAW,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE;QAC5C,YAAY,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE;QAC7C,YAAY,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,EAAE;QAC7C,cAAc,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,EAAE;QAC/C,WAAW,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,EAAE;QAC5C,eAAe,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,EAAE;QAChD,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,EAAE;QAC1C,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,EAAE;KAC3C,CAAC,CAAC;AACL,CAAC"}
@@ -1,5 +1,6 @@
1
+ import { type Locale } from 'zhin.js/i18n';
1
2
  import type { AdvProfileRow } from './models.js';
2
3
  export declare function formatProgressCompact(profile: AdvProfileRow): string;
3
- export declare function formatMapProgress(profile: AdvProfileRow): string;
4
- export declare function formatAchievements(profile: AdvProfileRow, showHidden?: boolean): string;
5
- export declare function formatNewAchievements(ids: string[]): string;
4
+ export declare function formatMapProgress(profile: AdvProfileRow, locale?: Locale): string;
5
+ export declare function formatAchievements(profile: AdvProfileRow, showHidden?: boolean, locale?: Locale): string;
6
+ export declare function formatNewAchievements(ids: string[], locale?: Locale): string;
@@ -9,39 +9,40 @@ export function formatProgressCompact(profile) {
9
9
  const totalEndings = endingIds().length;
10
10
  return `🗺️ ${visited}/${totalRegions} · 🎬 ${endings}/${totalEndings} · 🏅 ${achievements}/${totalAchievements()}`;
11
11
  }
12
- export function formatMapProgress(profile) {
12
+ export function formatMapProgress(profile, locale = 'zh-CN') {
13
13
  const visited = parseStringSet(profile.visited_scenes);
14
14
  const total = playableSceneIds().length;
15
15
  const pct = total ? Math.round((visited.size / total) * 100) : 0;
16
16
  const lines = [
17
- `🗺️ **探索进度** ${visited.size}/${total}(${pct}%)`,
17
+ `🗺️ **${locale === 'en' ? 'Exploration' : '探索进度'}** ${visited.size}/${total} (${pct}%)`,
18
18
  '',
19
19
  ];
20
20
  for (const zone of MAP_ZONES) {
21
21
  const parts = zone.sceneIds.map((id) => {
22
22
  const mark = visited.has(id) ? '✅' : '⬜';
23
- return `${mark} ${regionLabel(id)}`;
23
+ return `${mark} ${regionLabel(id, locale)}`;
24
24
  });
25
- lines.push(`**${zone.name}**`);
25
+ lines.push(`**${locale === 'en' ? zone.nameEn : zone.name}**`);
26
26
  lines.push(parts.join(' '));
27
27
  lines.push('');
28
28
  }
29
29
  const endings = parseStringSet(profile.endings_seen);
30
30
  const allEndings = endingIds();
31
- lines.push(`**结局图鉴** ${endings.size}/${allEndings.length}`);
31
+ lines.push(`**${locale === 'en' ? 'Endings' : '结局图鉴'}** ${endings.size}/${allEndings.length}`);
32
32
  lines.push(allEndings
33
- .map((id) => `${endings.has(id) ? '✅' : '⬜'} ${endingLabel(id)}`)
33
+ .map((id) => `${endings.has(id) ? '✅' : '⬜'} ${endingLabel(id, locale)}`)
34
34
  .join(' '));
35
35
  return lines.join('\n').trimEnd();
36
36
  }
37
- export function formatAchievements(profile, showHidden = false) {
37
+ export function formatAchievements(profile, showHidden = false, locale = 'zh-CN') {
38
38
  const unlocked = parseStringSet(profile.achievements);
39
39
  const lines = [
40
- `🏅 **成就** ${unlocked.size}/${totalAchievements()}`,
41
- `完成局数:${profile.runs_completed} · 生涯步数:${profile.total_steps}`,
40
+ `🏅 **${locale === 'en' ? 'Achievements' : '成就'}** ${unlocked.size}/${totalAchievements()}`,
41
+ locale === 'en' ? `Completed adventures: ${profile.runs_completed} · Lifetime steps: ${profile.total_steps}` : `完成局数:${profile.runs_completed} · 生涯步数:${profile.total_steps}`,
42
42
  '',
43
43
  ];
44
- for (const def of ACHIEVEMENTS) {
44
+ for (const entry of ACHIEVEMENTS) {
45
+ const def = achievementById(entry.id, locale);
45
46
  const got = unlocked.has(def.id);
46
47
  if (def.hidden && !got && !showHidden)
47
48
  continue;
@@ -50,12 +51,12 @@ export function formatAchievements(profile, showHidden = false) {
50
51
  }
51
52
  return lines.join('\n');
52
53
  }
53
- export function formatNewAchievements(ids) {
54
+ export function formatNewAchievements(ids, locale = 'zh-CN') {
54
55
  if (!ids.length)
55
56
  return '';
56
- const lines = ['', '🏅 **新成就解锁!**'];
57
+ const lines = ['', locale === 'en' ? '🏅 **New achievement unlocked!**' : '🏅 **新成就解锁!**'];
57
58
  for (const id of ids) {
58
- const def = achievementById(id);
59
+ const def = achievementById(id, locale);
59
60
  if (def)
60
61
  lines.push(`${def.icon} ${def.title} — ${def.description}`);
61
62
  }
@@ -1 +1 @@
1
- {"version":3,"file":"profile-format.js","sourceRoot":"","sources":["../src/profile-format.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"profile-format.js","sourceRoot":"","sources":["../src/profile-format.ts"],"names":[],"mappings":"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"}
package/lib/scene-view.js CHANGED
@@ -1,14 +1,16 @@
1
+ import { resolveLocale } from 'zhin.js/i18n';
1
2
  import { buildChoiceKeyboard } from '@zhin.js/game-kit';
2
3
  import { formatProgressCompact } from './profile-format.js';
3
4
  import { ADV_PREFIX, getScene, sceneNarrative, stateFromSession, visibleChoices, } from './story.js';
4
5
  export function buildSceneInteractive(session, extraNarrative = '', profile, channelType) {
5
- const scene = getScene(session.scene_id);
6
+ const locale = resolveLocale(session.locale);
7
+ const scene = getScene(session.scene_id, locale);
6
8
  if (!scene)
7
9
  return null;
8
10
  const state = stateFromSession(session);
9
11
  const choices = visibleChoices(scene, state);
10
12
  const terminal = scene.terminal || session.status !== 'active';
11
- let narrative = sceneNarrative(scene, state);
13
+ let narrative = sceneNarrative(scene, state, locale);
12
14
  if (profile && !terminal) {
13
15
  narrative = `${formatProgressCompact(profile)}\n\n${narrative}`;
14
16
  }
@@ -26,7 +28,7 @@ export function buildSceneInteractive(session, extraNarrative = '', profile, cha
26
28
  })),
27
29
  terminal,
28
30
  buttonsPerRow: 2,
29
- fallbackHint: '回复数字选择(仅编号)',
31
+ fallbackHint: locale === 'en' ? 'Reply with the choice number only' : '回复数字选择(仅编号)',
30
32
  interactionProfile: terminal ? 'terminal' : 'gameplay',
31
33
  channelType,
32
34
  });