@zhin.js/plugin-text-adventure 1.1.14 → 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/adv/[[action]]/index.js +4 -4
- package/commands/adv/[[action]]/index.ts +4 -4
- package/lib/achievements.d.ts +4 -1
- package/lib/achievements.js +18 -17
- package/lib/achievements.js.map +1 -1
- package/lib/adv-command.d.ts +1 -0
- package/lib/adv-command.js +31 -20
- package/lib/adv-command.js.map +1 -1
- package/lib/game-flow.d.ts +1 -1
- package/lib/game-flow.js +50 -21
- 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/profile-format.d.ts +4 -3
- package/lib/profile-format.js +14 -13
- package/lib/profile-format.js.map +1 -1
- package/lib/scene-view.js +5 -3
- package/lib/scene-view.js.map +1 -1
- package/lib/session-service.js +1 -0
- package/lib/session-service.js.map +1 -1
- package/lib/story-catalog.d.ts +4 -2
- package/lib/story-catalog.js +59 -9
- package/lib/story-catalog.js.map +1 -1
- package/lib/story-items.d.ts +2 -1
- package/lib/story-items.js +19 -2
- package/lib/story-items.js.map +1 -1
- package/lib/story-scenes.d.ts +2 -1
- package/lib/story-scenes.js +1358 -464
- package/lib/story-scenes.js.map +1 -1
- package/lib/story.d.ts +4 -3
- package/lib/story.js +8 -8
- package/lib/story.js.map +1 -1
- package/middlewares/adv-alias/index.js +5 -3
- package/middlewares/adv-alias/index.ts +5 -3
- package/package.json +7 -7
- package/plugin.js +4 -0
- package/src/achievements.ts +21 -17
- package/src/adv-command.ts +35 -24
- package/src/game-flow.ts +51 -22
- package/src/models.ts +4 -2
- package/src/profile-format.ts +15 -13
- package/src/scene-view.ts +5 -3
- package/src/session-service.ts +1 -0
- package/src/story-catalog.ts +63 -10
- package/src/story-items.ts +21 -2
- package/src/story-scenes.ts +1103 -206
- 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 {
|
|
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,
|
|
9
|
+
async execute({ params, input, use, locale, formatCommand }) {
|
|
10
10
|
const action = normalizeAdvAction(String(params.action ?? ''));
|
|
11
11
|
if (!action || action === 'help')
|
|
12
|
-
return
|
|
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 {
|
|
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,
|
|
9
|
+
async execute({ params, input, use, locale, formatCommand }) {
|
|
10
10
|
const action = normalizeAdvAction(String(params.action ?? ''));
|
|
11
|
-
if (!action || action === 'help') return
|
|
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
|
});
|
package/lib/achievements.d.ts
CHANGED
|
@@ -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;
|
package/lib/achievements.js
CHANGED
|
@@ -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
|
-
|
|
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;
|
package/lib/achievements.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"achievements.js","sourceRoot":"","sources":["../src/achievements.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"achievements.js","sourceRoot":"","sources":["../src/achievements.ts"],"names":[],"mappings":"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"}
|
package/lib/adv-command.d.ts
CHANGED
|
@@ -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>;
|
package/lib/adv-command.js
CHANGED
|
@@ -1,31 +1,42 @@
|
|
|
1
|
-
import {
|
|
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
|
-
|
|
5
|
-
'
|
|
6
|
-
'
|
|
7
|
-
'
|
|
8
|
-
'
|
|
9
|
-
'
|
|
10
|
-
'
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
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 = [
|
|
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
|
|
64
|
+
return `${gameCommandFeedback(message, 'unknown', action)}\n\n${getAdvHelp(message)}`;
|
|
54
65
|
}
|
|
55
66
|
//# sourceMappingURL=adv-command.js.map
|
package/lib/adv-command.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adv-command.js","sourceRoot":"","sources":["../src/adv-command.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"adv-command.js","sourceRoot":"","sources":["../src/adv-command.ts"],"names":[],"mappings":"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"}
|
package/lib/game-flow.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
|
46
|
+
return messages(locale, 'invalidScene');
|
|
40
47
|
if (scene.terminal && choiceId !== 'restart') {
|
|
41
|
-
return
|
|
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 '
|
|
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
|
|
108
|
+
const locale = resolveLocale(session.locale);
|
|
101
109
|
const state = stateFromSession(session);
|
|
102
|
-
const items = state.inventory;
|
|
103
110
|
const lines = [
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
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(
|
|
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
|
package/lib/game-flow.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"game-flow.js","sourceRoot":"","sources":["../src/game-flow.ts"],"names":[],"mappings":"
|
|
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
|
|
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":"
|
|
1
|
+
{"version":3,"file":"models.js","sourceRoot":"","sources":["../src/models.ts"],"names":[],"mappings":"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"}
|
package/lib/profile-format.d.ts
CHANGED
|
@@ -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;
|
package/lib/profile-format.js
CHANGED
|
@@ -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
|
-
`🗺️
|
|
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(
|
|
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
|
-
`🏅
|
|
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
|
|
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":"
|
|
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
|
|
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
|
});
|