@zhin.js/plugin-dungeon-expedition 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.
- package/commands/dungeon/[[action]]/index.js +4 -4
- package/commands/dungeon/[[action]]/index.ts +4 -4
- package/lib/dungeon-command.d.ts +1 -0
- package/lib/dungeon-command.js +22 -14
- package/lib/dungeon-command.js.map +1 -1
- package/lib/engine.d.ts +3 -2
- package/lib/engine.js +119 -70
- package/lib/engine.js.map +1 -1
- package/lib/game-flow.js +27 -13
- package/lib/game-flow.js.map +1 -1
- package/lib/models.d.ts +4 -1
- package/lib/models.js +2 -1
- package/lib/models.js.map +1 -1
- package/lib/session-service.js +3 -2
- package/lib/session-service.js.map +1 -1
- package/lib/view.d.ts +2 -1
- package/lib/view.js +65 -31
- package/lib/view.js.map +1 -1
- package/package.json +7 -7
- package/plugin.js +9 -1
- package/src/dungeon-command.ts +22 -18
- package/src/engine.ts +120 -59
- package/src/game-flow.ts +27 -14
- package/src/models.ts +4 -2
- package/src/session-service.ts +3 -1
- package/src/view.ts +67 -32
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
|
-
? ['
|
|
66
|
-
: ['
|
|
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
|
package/lib/game-flow.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"game-flow.js","sourceRoot":"","sources":["../src/game-flow.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,wBAAwB,EACxB,4BAA4B,EAC5B,UAAU,GAGX,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,gBAAgB,GAEjB,MAAM,aAAa,CAAC;AAErB,OAAO,EAEL,gBAAgB,GACjB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,gBAAgB,EAChB,wBAAwB,GACzB,MAAM,WAAW,CAAC;AAEnB,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,OAAuB,EACvB,OAAwB;IAExB,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,kBAAkB,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;IACrE,IAAI,MAAM;QAAE,OAAO,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC7F,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QACrD,OAAO,gBAAgB,CAAC,OAAO,EAAE,gBAAgB,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACrF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,wBAAwB;YAAE,OAAO,KAAK,CAAC,OAAO,CAAC;
|
|
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
|
|
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":"
|
|
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"}
|
package/lib/session-service.js
CHANGED
|
@@ -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":"AACA,OAAO,EACL,mBAAmB,EACnB,uBAAuB,EACvB,UAAU,EACV,iBAAiB,GAKlB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,YAAY,EACZ,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,GAGnB,MAAM,aAAa,CAAC;AAcrB,MAAM,OAAO,cAAe,SAAQ,uBAA0C;IAC5E,YAAY,QAAyB;QACnC,KAAK,CAAC,QAA6D,EAAE;YACnE,MAAM,EAAE,SAAS;YACjB,KAAK,EAAE,kBAAkB;YACzB,UAAU,EAAE,CAAC,UAAU,CAAC;YACxB,eAAe,EAAE,sBAAsB;SACxC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,aAAa,CACjB,OAAwB,EACxB,IAAsB;QAEtB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,EAAE,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;QACrC,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACrE,MAAM,KAAK,GAAG,kBAAkB,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;
|
|
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
|
|
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: '
|
|
25
|
-
{ id: 'ready', label: '
|
|
26
|
-
{ id: 'start', label: '
|
|
27
|
-
{ id: 'abort', label: '
|
|
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: '
|
|
33
|
-
{ id: 'defend', label: '
|
|
34
|
-
{ id: 'potion', label: '
|
|
35
|
-
{ id: 'abort', label: '
|
|
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: '
|
|
40
|
-
{ id: 'potion', label: '
|
|
41
|
-
{ id: 'abort', label: '
|
|
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
|
-
|
|
48
|
-
|
|
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
|
-
+
|
|
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 ? '
|
|
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('', '
|
|
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":"
|
|
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.
|
|
3
|
+
"version": "1.1.16",
|
|
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.
|
|
27
|
-
"@zhin.js/game-kit": "1.1.
|
|
26
|
+
"@zhin.js/core": "1.1.51",
|
|
27
|
+
"@zhin.js/game-kit": "1.1.16"
|
|
28
28
|
},
|
|
29
29
|
"devDependencies": {
|
|
30
30
|
"typescript": "^6.0.3",
|
|
31
31
|
"vitest": "^4.1.10",
|
|
32
|
-
"zhin.js": "1.1.
|
|
32
|
+
"zhin.js": "1.1.16"
|
|
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.
|
|
70
|
-
"@zhin.js/middleware": "^1.1.
|
|
71
|
-
"zhin.js": "^1.1.
|
|
69
|
+
"@zhin.js/command": "^1.1.11",
|
|
70
|
+
"@zhin.js/middleware": "^1.1.10",
|
|
71
|
+
"zhin.js": "^1.1.16"
|
|
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:
|
|
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
|
+
});
|
package/src/dungeon-command.ts
CHANGED
|
@@ -1,8 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
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
|
-
|
|
15
|
-
'地牢远征 · 1-4 人确定性回合冒险',
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
'
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
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
|
|
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,
|