@zhin.js/plugin-dungeon-expedition 1.1.15 → 1.1.17

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/lib/game-flow.js CHANGED
@@ -1,3 +1,4 @@
1
+ import { createMessages, resolveLocale } from 'zhin.js/i18n';
1
2
  import { GameSessionConflictError, SessionRevisionConflictError, channelKey, } from '@zhin.js/game-kit';
2
3
  import { DungeonRuleError, } from './engine.js';
3
4
  import { stateFromSession, } from './session-service.js';
@@ -12,34 +13,37 @@ export async function startDungeon(service, message) {
12
13
  }
13
14
  catch (error) {
14
15
  if (error instanceof GameSessionConflictError)
15
- return error.message;
16
+ return error.format(message.locale);
16
17
  throw error;
17
18
  }
18
19
  }
19
20
  export async function continueDungeon(service, message) {
21
+ const locale = resolveLocale(message.locale);
20
22
  const session = await service.getActiveByChannel(channelKey(message));
21
23
  if (!session)
22
- return '当前频道没有进行中的地牢远征。发送「地牢 开始」创建队伍。';
24
+ return messages(locale, 'text1');
23
25
  return buildDungeonView(session, stateFromSession(session), message.$channel.type);
24
26
  }
25
27
  export async function handleDungeonChoice(service, message, sessionToken, choiceId) {
28
+ let locale = resolveLocale(message.locale);
26
29
  const token = parseDungeonSessionToken(sessionToken);
27
30
  if (!token)
28
- return '无效的地牢操作。';
31
+ return messages(locale, 'text2');
29
32
  const session = await service.getById(token.sessionId);
30
33
  if (!session || session.channel_key !== channelKey(message)) {
31
- return '远征不存在,或不属于当前频道。';
34
+ return messages(locale, 'text3');
32
35
  }
36
+ locale = resolveLocale(session.locale);
33
37
  if (choiceId === 'restart') {
34
38
  if (session.status === 'active')
35
- return '当前远征尚未结束。';
39
+ return messages(locale, 'text4');
36
40
  if (session.owner_id !== message.$sender.id)
37
- return '只有原队长可以重新创建远征。';
41
+ return messages(locale, 'text5');
38
42
  return startDungeon(service, message);
39
43
  }
40
44
  const action = actionFromChoice(choiceId, message);
41
45
  if (!action)
42
- return '未知的地牢操作。';
46
+ return messages(locale, 'text6');
43
47
  try {
44
48
  const result = await service.performAction({
45
49
  sessionId: session.id,
@@ -52,18 +56,18 @@ export async function handleDungeonChoice(service, message, sessionToken, choice
52
56
  return buildDungeonView(result.session, stateFromSession(result.session), message.$channel.type);
53
57
  }
54
58
  catch (error) {
55
- if (error instanceof DungeonRuleError
56
- || error instanceof GameSessionConflictError) {
59
+ if (error instanceof DungeonRuleError)
57
60
  return error.message;
58
- }
61
+ if (error instanceof GameSessionConflictError)
62
+ return error.format(locale);
59
63
  if (error instanceof SessionRevisionConflictError) {
60
64
  const latest = await service.getById(session.id);
61
65
  if (!latest)
62
- return '远征状态已变化,请重新打开当前界面。';
66
+ return messages(locale, 'text7');
63
67
  const view = buildDungeonView(latest, stateFromSession(latest), message.$channel.type);
64
68
  return Array.isArray(view)
65
- ? ['操作来自旧回合,已为你刷新最新状态。', ...view]
66
- : ['操作来自旧回合,已为你刷新最新状态。', view];
69
+ ? [messages(locale, 'text8'), ...view]
70
+ : [messages(locale, 'text8'), view];
67
71
  }
68
72
  throw error;
69
73
  }
@@ -94,4 +98,14 @@ function actionFromChoice(choiceId, message) {
94
98
  return { type: 'abort' };
95
99
  return null;
96
100
  }
101
+ const messages = createMessages({
102
+ text1: { 'zh-CN': "当前频道没有进行中的地牢远征。", en: "There is no active dungeon expedition in this channel." },
103
+ text2: { 'zh-CN': "无效的地牢操作。", en: "Invalid dungeon action." },
104
+ text3: { 'zh-CN': "远征不存在,或不属于当前频道。", en: "The expedition does not exist or belongs to another channel." },
105
+ text4: { 'zh-CN': "当前远征尚未结束。", en: "The current expedition has not ended." },
106
+ text5: { 'zh-CN': "只有原队长可以重新创建远征。", en: "Only the original leader may restart the expedition." },
107
+ text6: { 'zh-CN': "未知的地牢操作。", en: "Unknown dungeon action." },
108
+ text7: { 'zh-CN': "远征状态已变化,请重新打开当前界面。", en: "The expedition state changed. Reopen its current view." },
109
+ text8: { 'zh-CN': "操作来自旧回合,已为你刷新最新状态。", en: "This action was from an earlier turn. The latest state is shown below." },
110
+ });
97
111
  //# 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
  dungeon_sessions: {
6
6
  id: string;
7
+ locale?: 'zh-CN' | 'en' | null;
7
8
  adapter: string;
8
9
  endpoint: string;
9
10
  channel_type: string;
@@ -27,5 +28,7 @@ declare module '@zhin.js/core' {
27
28
  }
28
29
  export type DungeonSessionRow = Models['dungeon_sessions'];
29
30
  export declare function defineHostTables(database: {
30
- define(name: string, definition: Record<string, unknown>): void;
31
+ define(name: string, definition: Record<string, unknown>, options?: {
32
+ readonly addColumns?: readonly string[];
33
+ }): void;
31
34
  }): void;
package/lib/models.js CHANGED
@@ -1,6 +1,7 @@
1
1
  export function defineHostTables(database) {
2
2
  database.define('dungeon_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 },
@@ -19,6 +20,6 @@ export function defineHostTables(database) {
19
20
  status: { type: 'text', default: 'active' },
20
21
  updated_at: { type: 'bigint', default: 0 },
21
22
  created_at: { type: 'bigint', default: 0 },
22
- });
23
+ }, { addColumns: ['locale'] });
23
24
  }
24
25
  //# sourceMappingURL=models.js.map
package/lib/models.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"models.js","sourceRoot":"","sources":["../src/models.ts"],"names":[],"mappings":"AAgCA,MAAM,UAAU,gBAAgB,CAC9B,QAEC;IAED,QAAQ,CAAC,MAAM,CAAC,kBAAkB,EAAE;QAClC,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,QAAQ,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE;QAC3C,UAAU,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE;QACzC,UAAU,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE;QAC7C,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE;QACzC,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE;QACnC,SAAS,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,EAAE;QAC1C,cAAc,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,EAAE;QAC/C,QAAQ,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,EAAE;QACzC,iBAAiB,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE;QAClD,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,EAAE;QAC3C,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,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;AACL,CAAC"}
1
+ {"version":3,"file":"models.js","sourceRoot":"","sources":["../src/models.ts"],"names":[],"mappings":"AAiCA,MAAM,UAAU,gBAAgB,CAC9B,QAEC;IAED,QAAQ,CAAC,MAAM,CAAC,kBAAkB,EAAE;QAClC,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,QAAQ,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE;QAC3C,UAAU,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE;QACzC,UAAU,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE;QAC7C,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE;QACzC,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE;QACnC,SAAS,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,EAAE;QAC1C,cAAc,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,EAAE;QAC/C,QAAQ,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,EAAE;QACzC,iBAAiB,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE;QAClD,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,EAAE;QAC3C,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,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;AACjC,CAAC"}
@@ -13,10 +13,11 @@ export class SessionService extends VersionedSessionService {
13
13
  const now = Date.now();
14
14
  const id = generateCompactId('dng_');
15
15
  const ownerName = message.$sender.name?.trim() || message.$sender.id;
16
- const state = createDungeonState(message.$sender.id, ownerName);
16
+ const state = createDungeonState(message.$sender.id, ownerName, message.locale);
17
17
  const random = DeterministicRandom.fromSeed(seed ?? id);
18
18
  return this.createRow({
19
19
  id,
20
+ locale: message.locale ?? 'zh-CN',
20
21
  adapter: String(message.$adapter),
21
22
  endpoint: message.$endpoint,
22
23
  channel_type: message.$channel.type,
@@ -61,7 +62,7 @@ export class SessionService extends VersionedSessionService {
61
62
  apply: (session) => {
62
63
  const state = decodeDungeonState(session.state_json);
63
64
  const random = DeterministicRandom.fromState(session.rng_state);
64
- const next = applyDungeonAction(state, options.actorId, options.action, random);
65
+ const next = applyDungeonAction(state, options.actorId, options.action, random, session.locale ?? undefined);
65
66
  return {
66
67
  state_json: JSON.stringify(next),
67
68
  phase: next.phase,
@@ -1 +1 @@
1
- {"version":3,"file":"session-service.js","sourceRoot":"","sources":["../src/session-service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"session-service.js","sourceRoot":"","sources":["../src/session-service.ts"],"names":[],"mappings":"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"}
package/lib/view.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ import { type Locale } from 'zhin.js/i18n';
1
2
  import type { SendContent } from '@zhin.js/core/runtime';
2
3
  import { type ChoiceOption } from '@zhin.js/game-kit';
3
4
  import { type DungeonState } from './engine.js';
@@ -8,5 +9,5 @@ export declare function parseDungeonSessionToken(token: string): {
8
9
  sessionId: string;
9
10
  revision: number;
10
11
  } | null;
11
- export declare function choicesForState(state: Readonly<DungeonState>): ChoiceOption[];
12
+ export declare function choicesForState(state: Readonly<DungeonState>, locale?: Locale): ChoiceOption[];
12
13
  export declare function buildDungeonView(session: DungeonSessionRow, state: Readonly<DungeonState>, channelType?: string): SendContent;
package/lib/view.js CHANGED
@@ -1,3 +1,4 @@
1
+ import { createMessages, resolveLocale } from 'zhin.js/i18n';
1
2
  import { buildChoiceKeyboard, } from '@zhin.js/game-kit';
2
3
  import { activePlayer } from './engine.js';
3
4
  export const DUNGEON_PREFIX = 'dungeon';
@@ -10,62 +11,63 @@ export function parseDungeonSessionToken(token) {
10
11
  return null;
11
12
  return { sessionId: match[1], revision: Number(match[2]) };
12
13
  }
13
- export function choicesForState(state) {
14
+ export function choicesForState(state, locale) {
14
15
  if (state.phase === 'completed') {
15
16
  return [{
16
17
  id: 'restart',
17
- label: '再来一局',
18
+ label: messages(locale, 'text1'),
18
19
  style: 'primary',
19
20
  keepEnabledWhenTerminal: true,
20
21
  }];
21
22
  }
22
23
  if (state.phase === 'lobby') {
23
24
  return [
24
- { id: 'join', label: '加入队伍', style: 'secondary' },
25
- { id: 'ready', label: '准备/取消', style: 'secondary' },
26
- { id: 'start', label: '开始远征', style: 'primary' },
27
- { id: 'abort', label: '解散队伍', style: 'danger' },
25
+ { id: 'join', label: messages(locale, 'text2'), style: 'secondary' },
26
+ { id: 'ready', label: messages(locale, 'text3'), style: 'secondary' },
27
+ { id: 'start', label: messages(locale, 'text4'), style: 'primary' },
28
+ { id: 'abort', label: messages(locale, 'text5'), style: 'danger' },
28
29
  ];
29
30
  }
30
31
  if (state.phase === 'combat') {
31
32
  return [
32
- { id: 'attack', label: '攻击', style: 'primary' },
33
- { id: 'defend', label: '防御', style: 'secondary' },
34
- { id: 'potion', label: '药水', style: 'secondary' },
35
- { id: 'abort', label: '结束远征', style: 'danger' },
33
+ { id: 'attack', label: messages(locale, 'text6'), style: 'primary' },
34
+ { id: 'defend', label: messages(locale, 'text7'), style: 'secondary' },
35
+ { id: 'potion', label: messages(locale, 'text8'), style: 'secondary' },
36
+ { id: 'abort', label: messages(locale, 'text9'), style: 'danger' },
36
37
  ];
37
38
  }
38
39
  return [
39
- { id: 'explore', label: '探索下一房间', style: 'primary' },
40
- { id: 'potion', label: '使用药水', style: 'secondary' },
41
- { id: 'abort', label: '结束远征', style: 'danger' },
40
+ { id: 'explore', label: messages(locale, 'text10'), style: 'primary' },
41
+ { id: 'potion', label: messages(locale, 'text11'), style: 'secondary' },
42
+ { id: 'abort', label: messages(locale, 'text9'), style: 'danger' },
42
43
  ];
43
44
  }
44
45
  export function buildDungeonView(session, state, channelType) {
46
+ const locale = resolveLocale(session.locale);
45
47
  const current = activePlayer(state);
46
48
  const lines = [
47
- `地牢远征 · 第 ${state.floor}/${3} 层 · 房间 ${state.room}/${4}`,
48
- `状态:${phaseLabel(state)}`,
49
+ messages(locale, 'text12', { p0: state.floor, p1: 3, p2: state.room, p3: 4 }),
50
+ messages(locale, 'text13', { p0: phaseLabel(state, locale) }),
49
51
  '',
50
52
  ...state.players.map((player, index) => {
51
- const turn = current?.id === player.id && state.phase !== 'lobby' ? ' <- 当前回合' : '';
52
- const ready = state.phase === 'lobby' ? player.ready ? ' [已准备]' : ' [未准备]' : '';
53
+ const turn = current?.id === player.id && state.phase !== 'lobby' ? messages(locale, 'text14') : '';
54
+ const ready = state.phase === 'lobby' ? player.ready ? messages(locale, 'text15') : messages(locale, 'text16') : '';
53
55
  return `${index + 1}. ${player.name}${ready} HP ${player.hp}/${player.maxHp}`
54
- + ` · 药水 ${player.potions} · 金币 ${player.gold}${turn}`;
56
+ + messages(locale, 'text17', { p0: player.potions, p1: player.gold, p2: turn });
55
57
  }),
56
58
  ];
57
59
  if (state.enemy) {
58
- lines.push('', `${state.enemy.boss ? '守层者' : '敌人'}:${state.enemy.name}`, `HP ${state.enemy.hp}/${state.enemy.maxHp} · 攻击 ${state.enemy.attack}`);
60
+ lines.push('', `${state.enemy.boss ? messages(locale, 'text18') : messages(locale, 'text19')}:${state.enemy.name}`, messages(locale, 'text20', { p0: state.enemy.hp, p1: state.enemy.maxHp, p2: state.enemy.attack }));
59
61
  }
60
- lines.push('', '最近事件:', ...state.log.slice(-4).map((line) => `- ${line}`));
62
+ lines.push('', messages(locale, 'text21'), ...state.log.slice(-4).map((line) => `- ${line}`));
61
63
  if (state.phase === 'completed') {
62
64
  lines.push('', state.result === 'victory'
63
- ? '远征胜利,地牢已被征服。'
65
+ ? messages(locale, 'text22')
64
66
  : state.result === 'aborted'
65
- ? '本次远征由队长结束。'
66
- : '远征失败,队伍全员倒下。');
67
+ ? messages(locale, 'text23')
68
+ : messages(locale, 'text24'));
67
69
  }
68
- const choices = choicesForState(state);
70
+ const choices = choicesForState(state, locale);
69
71
  return buildChoiceKeyboard({
70
72
  gamePrefix: DUNGEON_PREFIX,
71
73
  sessionId: dungeonSessionToken(session),
@@ -78,17 +80,49 @@ export function buildDungeonView(session, state, channelType) {
78
80
  channelType,
79
81
  });
80
82
  }
81
- function phaseLabel(state) {
83
+ function phaseLabel(state, locale) {
82
84
  if (state.phase === 'lobby')
83
- return '等待队员';
85
+ return messages(locale, 'text25');
84
86
  if (state.phase === 'exploring')
85
- return '探索中';
87
+ return messages(locale, 'text26');
86
88
  if (state.phase === 'combat')
87
- return '战斗中';
89
+ return messages(locale, 'text27');
88
90
  if (state.result === 'victory')
89
- return '胜利';
91
+ return messages(locale, 'text28');
90
92
  if (state.result === 'aborted')
91
- return '已结束';
92
- return '失败';
93
+ return messages(locale, 'text29');
94
+ return messages(locale, 'text30');
93
95
  }
96
+ const messages = createMessages({
97
+ text1: { 'zh-CN': "再来一局", en: "Play again" },
98
+ text2: { 'zh-CN': "加入队伍", en: "Join party" },
99
+ text3: { 'zh-CN': "准备/取消", en: "Ready / Not ready" },
100
+ text4: { 'zh-CN': "开始远征", en: "Start expedition" },
101
+ text5: { 'zh-CN': "解散队伍", en: "Disband party" },
102
+ text6: { 'zh-CN': "攻击", en: "Attack" },
103
+ text7: { 'zh-CN': "防御", en: "Defend" },
104
+ text8: { 'zh-CN': "药水", en: "Potion" },
105
+ text9: { 'zh-CN': "结束远征", en: "End expedition" },
106
+ text10: { 'zh-CN': "探索下一房间", en: "Explore next room" },
107
+ text11: { 'zh-CN': "使用药水", en: "Use potion" },
108
+ text12: { 'zh-CN': "地牢远征 · 第 {p0}/{p1} 层 · 房间 {p2}/{p3}", en: "Dungeon Expedition · Floor {p0}/{p1} · Room {p2}/{p3}" },
109
+ text13: { 'zh-CN': "状态:{p0}", en: "Status: {p0}" },
110
+ text14: { 'zh-CN': " <- 当前回合", en: " <- Current turn" },
111
+ text15: { 'zh-CN': " [已准备]", en: " [Ready]" },
112
+ text16: { 'zh-CN': " [未准备]", en: " [Not ready]" },
113
+ text17: { 'zh-CN': " · 药水 {p0} · 金币 {p1}{p2}", en: " · Potions {p0} · Gold {p1}{p2}" },
114
+ text18: { 'zh-CN': "守层者", en: "Floor guardian" },
115
+ text19: { 'zh-CN': "敌人", en: "Enemy" },
116
+ text20: { 'zh-CN': "HP {p0}/{p1} · 攻击 {p2}", en: "HP {p0}/{p1} · Attack {p2}" },
117
+ text21: { 'zh-CN': "最近事件:", en: "Recent events:" },
118
+ text22: { 'zh-CN': "远征胜利,地牢已被征服。", en: "Expedition victory! The dungeon is conquered." },
119
+ text23: { 'zh-CN': "本次远征由队长结束。", en: "The leader ended this expedition." },
120
+ text24: { 'zh-CN': "远征失败,队伍全员倒下。", en: "Expedition failed. The entire party fell." },
121
+ text25: { 'zh-CN': "等待队员", en: "Waiting for players" },
122
+ text26: { 'zh-CN': "探索中", en: "Exploring" },
123
+ text27: { 'zh-CN': "战斗中", en: "In combat" },
124
+ text28: { 'zh-CN': "胜利", en: "Victory" },
125
+ text29: { 'zh-CN': "已结束", en: "Ended" },
126
+ text30: { 'zh-CN': "失败", en: "Defeat" },
127
+ });
94
128
  //# sourceMappingURL=view.js.map
package/lib/view.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"view.js","sourceRoot":"","sources":["../src/view.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"view.js","sourceRoot":"","sources":["../src/view.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zhin.js/plugin-dungeon-expedition",
3
- "version": "1.1.15",
3
+ "version": "1.1.17",
4
4
  "description": "Zhin.js multiplayer deterministic dungeon expedition",
5
5
  "type": "module",
6
6
  "main": "./lib/index.js",
@@ -23,13 +23,13 @@
23
23
  ],
24
24
  "license": "MIT",
25
25
  "dependencies": {
26
- "@zhin.js/core": "1.1.50",
27
- "@zhin.js/game-kit": "1.1.15"
26
+ "@zhin.js/core": "1.1.52",
27
+ "@zhin.js/game-kit": "1.1.17"
28
28
  },
29
29
  "devDependencies": {
30
30
  "typescript": "^6.0.3",
31
31
  "vitest": "^4.1.10",
32
- "zhin.js": "1.1.15"
32
+ "zhin.js": "1.1.17"
33
33
  },
34
34
  "repository": {
35
35
  "type": "git",
@@ -66,9 +66,9 @@
66
66
  "plugins": []
67
67
  },
68
68
  "peerDependencies": {
69
- "@zhin.js/command": "^1.1.10",
70
- "@zhin.js/middleware": "^1.1.9",
71
- "zhin.js": "^1.1.15"
69
+ "@zhin.js/command": "^1.1.11",
70
+ "@zhin.js/middleware": "^1.1.10",
71
+ "zhin.js": "^1.1.17"
72
72
  },
73
73
  "peerDependenciesMeta": {
74
74
  "@zhin.js/command": {
package/plugin.js CHANGED
@@ -2,6 +2,7 @@
2
2
  import { defineGamePlugin, } from '@zhin.js/game-kit';
3
3
  import { defineHostTables } from "./lib/models.js";
4
4
  import { gameServicesToken } from "./lib/runtime-store.js";
5
+ import { createMessages } from 'zhin.js/i18n';
5
6
  import { createServices, } from "./lib/session-service.js";
6
7
  export default defineGamePlugin({
7
8
  name: 'dungeon-expedition',
@@ -9,6 +10,10 @@ export default defineGamePlugin({
9
10
  displayName: 'Dungeon Expedition',
10
11
  },
11
12
  game: {
13
+ commandPath: 'dungeon',
14
+ titleI18n: { en: 'Dungeon Expedition' },
15
+ descriptionI18n: { en: 'Explore a dungeon and battle monsters' },
16
+ quickStartI18n: { en: 'start' },
12
17
  id: 'dungeon',
13
18
  title: '地牢远征',
14
19
  icon: '⚔️',
@@ -30,6 +35,9 @@ export default defineGamePlugin({
30
35
  session: (service) => service,
31
36
  stale: {
32
37
  idleMs: 30 * 60_000,
33
- message: '地牢远征因 30 分钟无人操作,已自动结束。',
38
+ message: row => messages(row.locale ?? undefined, 'timeout'),
34
39
  },
35
40
  });
41
+ const messages = createMessages({
42
+ timeout: { 'zh-CN': '地牢远征因 30 分钟无人操作,已自动结束。', en: 'Dungeon Expedition ended after 30 minutes of inactivity.' },
43
+ });
@@ -1,8 +1,5 @@
1
- import {
2
- channelKey,
3
- type GameMessageLike,
4
- type GameReply,
5
- } from '@zhin.js/game-kit';
1
+ import { createMessages } from 'zhin.js/i18n';
2
+ import { gameCommandHint, channelKey, type GameMessageLike, type GameReply } from '@zhin.js/game-kit';
6
3
  import {
7
4
  continueDungeon,
8
5
  handleDungeonChoice,
@@ -11,17 +8,24 @@ import {
11
8
  import type { SessionService } from './session-service.js';
12
9
  import { dungeonSessionToken } from './view.js';
13
10
 
14
- export const DUNGEON_HELP = [
15
- '地牢远征 · 1-4 人确定性回合冒险',
16
- '地牢 开始 — 创建远征队',
17
- '地牢 加入 — 加入当前频道的队伍',
18
- '地牢 准备 — 切换准备状态',
19
- '地牢 出发 — 队长开始远征',
20
- '地牢 探索 — 探索下一房间',
21
- '地牢 攻击 / 防御 / 药水 — 战斗操作',
22
- '地牢 状态 — 刷新当前界面',
23
- '地牢 结束 — 队长结束远征',
24
- ].join('\n');
11
+ const messages = createMessages({
12
+ title: { 'zh-CN': '地牢远征 · 1-4 人确定性回合冒险', en: 'Dungeon Expedition · Turn-based adventure for 1–4 players' },
13
+ start: { 'zh-CN': '创建远征队', en: 'Create a party' },
14
+ join: { 'zh-CN': '加入当前频道的队伍', en: 'Join this channel’s party' },
15
+ ready: { 'zh-CN': '切换准备状态', en: 'Toggle readiness' },
16
+ go: { 'zh-CN': '队长开始远征', en: 'Leader starts the expedition' },
17
+ explore: { 'zh-CN': '探索下一房间', en: 'Explore the next room' },
18
+ attack: { 'zh-CN': '攻击', en: 'Attack' }, defend: { 'zh-CN': '防御', en: 'Defend' }, potion: { 'zh-CN': '使用药水', en: 'Use a potion' },
19
+ status: { 'zh-CN': '刷新当前界面', en: 'View current status' },
20
+ abort: { 'zh-CN': '队长结束远征', en: 'Leader ends the expedition' },
21
+ empty: { 'zh-CN': '当前频道没有远征队。', en: 'This channel has no expedition party.' },
22
+ });
23
+ export function getDungeonHelp(message: Pick<GameMessageLike, 'locale' | 'formatCommand'> = {}): string {
24
+ const command = message.formatCommand?.('dungeon');
25
+ const actions = ['start', 'join', 'ready', 'go', 'explore', 'attack', 'defend', 'potion', 'status', 'abort'] as const;
26
+ return [messages(message.locale, 'title'), ...(command === undefined ? [] : actions.map(action => `${command} ${action} — ${messages(message.locale, action)}`))].join('\n');
27
+ }
28
+ export const DUNGEON_HELP = getDungeonHelp();
25
29
 
26
30
  const ACTION_ALIASES: Readonly<Record<string, string>> = {
27
31
  '': 'status',
@@ -65,12 +69,12 @@ export async function runDungeonCommand(
65
69
  rawAction: string,
66
70
  ): Promise<GameReply> {
67
71
  const action = normalizeDungeonAction(rawAction);
68
- if (!action || action === 'help') return DUNGEON_HELP;
72
+ if (!action || action === 'help') return getDungeonHelp(message);
69
73
  if (action === 'create') return startDungeon(service, message);
70
74
  if (action === 'status') return continueDungeon(service, message);
71
75
 
72
76
  const session = await service.getActiveByChannel(channelKey(message));
73
- if (!session) return '当前频道没有远征队。发送「地牢 开始」创建。';
77
+ if (!session) return messages(message.locale, 'empty') + gameCommandHint(message, 'dungeon');
74
78
  return handleDungeonChoice(
75
79
  service,
76
80
  message,