xinyu-pro 0.21.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +21 -0
- package/README.md +36 -0
- package/app/api/chat/route.ts +84 -0
- package/app/api/generate-svg/route.ts +171 -0
- package/app/api/generate-theme/route.ts +137 -0
- package/app/api/plugins/bindings/route.ts +173 -0
- package/app/api/plugins/export/route.ts +122 -0
- package/app/api/plugins/export-xye/route.ts +156 -0
- package/app/api/plugins/files/route.ts +146 -0
- package/app/api/plugins/files-list/route.ts +168 -0
- package/app/api/plugins/files-upload/route.ts +101 -0
- package/app/api/plugins/files-write/route.ts +272 -0
- package/app/api/plugins/import/route.ts +140 -0
- package/app/api/plugins/import-package/route.ts +231 -0
- package/app/api/plugins/resources/route.ts +109 -0
- package/app/api/plugins/route.ts +308 -0
- package/app/api/plugins/scan/route.ts +280 -0
- package/app/api/plugins/storage/route.ts +146 -0
- package/app/api/sessions/route.ts +165 -0
- package/app/api/settings/route.ts +40 -0
- package/app/api/suggest-fields/route.ts +129 -0
- package/app/api/templates/route.ts +159 -0
- package/app/api/test-api/route.ts +63 -0
- package/app/editor/page.tsx +1466 -0
- package/app/extensions/create/page.tsx +1422 -0
- package/app/extensions/edit/[id]/page.tsx +2342 -0
- package/app/extensions/page.tsx +1572 -0
- package/app/extensions/tutorial/page.tsx +4258 -0
- package/app/favicon.ico +0 -0
- package/app/fonts/GeistMonoVF.woff +0 -0
- package/app/fonts/GeistVF.woff +0 -0
- package/app/game/[id]/page.tsx +996 -0
- package/app/globals.css +3 -0
- package/app/layout.tsx +26 -0
- package/app/loading.tsx +26 -0
- package/app/page.tsx +345 -0
- package/app/settings/page.tsx +1490 -0
- package/bin/cli.js +262 -0
- package/components/ChatInput.tsx +106 -0
- package/components/ChatWindow.tsx +52 -0
- package/components/FullPageLoader.tsx +107 -0
- package/components/LoadingDots.tsx +20 -0
- package/components/MathCurveLoader.tsx +173 -0
- package/components/MessageBubble.tsx +147 -0
- package/components/WorldCardPreview.tsx +98 -0
- package/components/WorldCardUploader.tsx +58 -0
- package/components/ui/ConfirmDialog.tsx +135 -0
- package/components/ui/PageHeader.tsx +99 -0
- package/components/ui/PermissionConflictDialog.tsx +206 -0
- package/components/ui/PluginConfigForm.tsx +192 -0
- package/components/ui/PluginFloatingLayer.tsx +52 -0
- package/components/ui/PluginIcon.tsx +53 -0
- package/components/ui/PluginModalRenderer.tsx +185 -0
- package/components/ui/PluginProvider.tsx +1038 -0
- package/components/ui/PluginSlotRenderer.tsx +76 -0
- package/components/ui/ThemeCustomizer.tsx +174 -0
- package/components/ui/ThemeProvider.tsx +125 -0
- package/components/ui/ThemeSwitcher.tsx +140 -0
- package/components/ui/ToastProvider.tsx +141 -0
- package/lib/builtin-plugins.ts +11 -0
- package/lib/db-init.ts +35 -0
- package/lib/db.ts +244 -0
- package/lib/manifest-parser.ts +185 -0
- package/lib/parseWorldCard.ts +110 -0
- package/lib/plugin-dom-sandbox.ts +327 -0
- package/lib/plugin-events.ts +88 -0
- package/lib/plugin-files.ts +186 -0
- package/lib/plugin-html-sanitizer.ts +79 -0
- package/lib/plugin-resource-tracker.ts +175 -0
- package/lib/plugin-runtime.ts +2287 -0
- package/lib/plugin-security.ts +151 -0
- package/lib/plugin-types.ts +416 -0
- package/lib/prompt-builder.ts +55 -0
- package/lib/router-history.ts +119 -0
- package/lib/storage.ts +381 -0
- package/lib/themes.ts +129 -0
- package/lib/types.ts +117 -0
- package/lib/version.ts +55 -0
- package/next.config.mjs +43 -0
- package/package.json +56 -0
- package/plugins/xinyu.bag-system.xye +0 -0
- package/plugins/xinyu.cache-optimizer.xye +0 -0
- package/plugins/xinyu.dice-arbiter.xye +0 -0
- package/plugins/xinyu.game-auto-start-choices.xye +0 -0
- package/plugins/xinyu.markdown-render.xye +0 -0
- package/plugins/xinyu.slot-ui-beautify.xye +0 -0
- package/plugins/xinyu.world-info.xye +0 -0
- package/postcss.config.mjs +8 -0
- package/public/templates/atlantis.svg +63 -0
- package/public/templates/cyber-city.svg +68 -0
- package/public/templates/jianghu.svg +69 -0
- package/public/templates//351/255/224/346/263/225/344/270/226/347/225/214.svg +137 -0
- package/styles/themes.css +111 -0
- package/tailwind.config.ts +18 -0
- package/tsconfig.json +26 -0
- package/version.json +6 -0
package/lib/types.ts
ADDED
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
// lib/types.ts - TypeScript 类型定义
|
|
2
|
+
|
|
3
|
+
/** 世界卡片设定(完全由用户自定义字段组成) */
|
|
4
|
+
export type WorldSetting = Record<string, unknown>;
|
|
5
|
+
|
|
6
|
+
/** 字段输入类型 */
|
|
7
|
+
export type FieldType = 'text' | 'textarea' | 'select' | 'checkbox' | 'slider';
|
|
8
|
+
|
|
9
|
+
/** 下拉选项 */
|
|
10
|
+
export interface SelectOption {
|
|
11
|
+
label: string;
|
|
12
|
+
value: string;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/** 世界卡片字段定义 */
|
|
16
|
+
export interface WorldCardField {
|
|
17
|
+
id: string; // 唯一标识
|
|
18
|
+
key: string; // 数据键名(如 title, era, custom_field_1)
|
|
19
|
+
label: string; // 显示名称
|
|
20
|
+
type: FieldType; // 输入类型
|
|
21
|
+
value: string | string[] | boolean | number; // 当前值
|
|
22
|
+
placeholder?: string; // 占位文本
|
|
23
|
+
required?: boolean; // 是否必填
|
|
24
|
+
editableBeforeGame?: boolean; // 是否允许在游戏前编辑
|
|
25
|
+
// select 类型专属
|
|
26
|
+
options?: SelectOption[];
|
|
27
|
+
allowCustomOption?: boolean; // 下拉框是否允许用户输入自定义选项
|
|
28
|
+
// slider 类型专属
|
|
29
|
+
min?: number;
|
|
30
|
+
max?: number;
|
|
31
|
+
step?: number;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/** 世界卡片模板 */
|
|
35
|
+
export interface WorldCardTemplate {
|
|
36
|
+
id: string;
|
|
37
|
+
name: string; // 模板名称
|
|
38
|
+
svgContent: string; // SVG 代码
|
|
39
|
+
fields: WorldCardField[]; // 字段定义列表
|
|
40
|
+
plugins?: string[]; // 关联的插件 ID 列表(开始游戏时自动启用)
|
|
41
|
+
createdAt: string;
|
|
42
|
+
updatedAt: string;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/** 对话消息 */
|
|
46
|
+
export interface ChatMessage {
|
|
47
|
+
role: 'user' | 'assistant' | 'system' | 'notice';
|
|
48
|
+
content: string;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/** 游戏会话 */
|
|
52
|
+
export interface GameSession {
|
|
53
|
+
id: string;
|
|
54
|
+
worldSetting: WorldSetting;
|
|
55
|
+
messages: ChatMessage[];
|
|
56
|
+
createdAt: string;
|
|
57
|
+
updatedAt: string;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/** 主题定义 */
|
|
61
|
+
export interface Theme {
|
|
62
|
+
id: string;
|
|
63
|
+
name: string;
|
|
64
|
+
description: string;
|
|
65
|
+
variables: Record<string, string>;
|
|
66
|
+
isDark: boolean;
|
|
67
|
+
/** 导入的主题预览数据 */
|
|
68
|
+
preview?: {
|
|
69
|
+
type: 'svg' | 'json';
|
|
70
|
+
content: string; // SVG 代码或 JSON 字符串
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/** 主题配置 */
|
|
75
|
+
export interface ThemeConfig {
|
|
76
|
+
presets: Theme[];
|
|
77
|
+
activeThemeId: string;
|
|
78
|
+
customTheme: Theme | null;
|
|
79
|
+
/** 用户导入的主题列表 */
|
|
80
|
+
importedThemes: Theme[];
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/** 应用设置 */
|
|
84
|
+
export interface AppSettings {
|
|
85
|
+
// API 配置
|
|
86
|
+
aiApiKey: string;
|
|
87
|
+
aiApiBase: string;
|
|
88
|
+
aiModel: string;
|
|
89
|
+
aiTemperature: number;
|
|
90
|
+
aiMaxTokens: number;
|
|
91
|
+
// 对话偏好
|
|
92
|
+
systemPromptExtra: string; // 用户追加的全局 system prompt
|
|
93
|
+
// 数据管理
|
|
94
|
+
maxHistorySessions: number; // 最大保留历史会话数
|
|
95
|
+
// 插件提示控制
|
|
96
|
+
pluginToastEnabled: boolean; // 是否显示插件 toast 消息
|
|
97
|
+
pluginToastLevels: ('info' | 'success' | 'warning' | 'error')[]; // 允许显示的消息级别
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/** API 请求体(含可选配置覆盖) */
|
|
101
|
+
export interface ChatRequest {
|
|
102
|
+
worldSetting: WorldSetting;
|
|
103
|
+
messages: ChatMessage[];
|
|
104
|
+
apiConfig?: {
|
|
105
|
+
apiKey: string;
|
|
106
|
+
apiBase: string;
|
|
107
|
+
model: string;
|
|
108
|
+
temperature: number;
|
|
109
|
+
maxTokens: number;
|
|
110
|
+
systemPromptExtra: string;
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/** API 响应体 */
|
|
115
|
+
export interface ChatResponse {
|
|
116
|
+
content: string;
|
|
117
|
+
}
|
package/lib/version.ts
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
// lib/version.ts - 版本号管理与校验工具
|
|
2
|
+
|
|
3
|
+
import versionData from '../version.json';
|
|
4
|
+
|
|
5
|
+
/** 应用版本信息 */
|
|
6
|
+
export const APP_VERSION: string = versionData.version;
|
|
7
|
+
export const APP_NAME: string = versionData.displayName;
|
|
8
|
+
export const APP_DESCRIPTION: string = versionData.description;
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* 解析语义化版本号为可比较的数字数组
|
|
12
|
+
* "1.2.3" → [1, 2, 3]
|
|
13
|
+
* "1.2.3-beta.1" → [1, 2, 3](忽略预发布标识)
|
|
14
|
+
*/
|
|
15
|
+
export function parseSemver(version: string): number[] {
|
|
16
|
+
const match = version.match(/^(\d+)\.(\d+)\.(\d+)/);
|
|
17
|
+
if (!match) return [0, 0, 0];
|
|
18
|
+
return [parseInt(match[1], 10), parseInt(match[2], 10), parseInt(match[3], 10)];
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* 比较两个语义化版本号
|
|
23
|
+
* @returns -1 (a < b), 0 (a == b), 1 (a > b)
|
|
24
|
+
*/
|
|
25
|
+
export function compareSemver(a: string, b: string): number {
|
|
26
|
+
const pa = parseSemver(a);
|
|
27
|
+
const pb = parseSemver(b);
|
|
28
|
+
for (let i = 0; i < 3; i++) {
|
|
29
|
+
if (pa[i] < pb[i]) return -1;
|
|
30
|
+
if (pa[i] > pb[i]) return 1;
|
|
31
|
+
}
|
|
32
|
+
return 0;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* 检查当前应用版本是否满足插件要求的最低版本
|
|
37
|
+
* @param minVersion 插件声明的最低版本(如 "0.2.0")
|
|
38
|
+
* @returns { satisfied: boolean, current: string, required: string }
|
|
39
|
+
*/
|
|
40
|
+
export function checkAppVersion(minVersion: string): {
|
|
41
|
+
satisfied: boolean;
|
|
42
|
+
current: string;
|
|
43
|
+
required: string;
|
|
44
|
+
} {
|
|
45
|
+
const current = APP_VERSION;
|
|
46
|
+
const satisfied = compareSemver(current, minVersion) >= 0;
|
|
47
|
+
return { satisfied, current, required: minVersion };
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* 版本号格式化显示
|
|
52
|
+
*/
|
|
53
|
+
export function formatVersion(version: string): string {
|
|
54
|
+
return `v${version}`;
|
|
55
|
+
}
|
package/next.config.mjs
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/** @type {import('next').NextConfig} */
|
|
2
|
+
const nextConfig = {
|
|
3
|
+
eslint: {
|
|
4
|
+
ignoreDuringBuilds: true,
|
|
5
|
+
},
|
|
6
|
+
typescript: {
|
|
7
|
+
ignoreBuildErrors: true,
|
|
8
|
+
},
|
|
9
|
+
async headers() {
|
|
10
|
+
const cspValue = [
|
|
11
|
+
"default-src 'self'",
|
|
12
|
+
"script-src 'self' 'unsafe-eval' 'unsafe-inline' https://cdn.jsdelivr.net",
|
|
13
|
+
"style-src 'self' 'unsafe-inline' https://cdn.jsdelivr.net",
|
|
14
|
+
"img-src 'self' data: blob: https://cdn.jsdelivr.net",
|
|
15
|
+
"connect-src 'self' https://cdn.jsdelivr.net",
|
|
16
|
+
"font-src 'self' https://cdn.jsdelivr.net",
|
|
17
|
+
"frame-src 'none'",
|
|
18
|
+
"object-src 'none'",
|
|
19
|
+
].join('; ');
|
|
20
|
+
return [
|
|
21
|
+
{
|
|
22
|
+
source: '/game/:id*',
|
|
23
|
+
headers: [
|
|
24
|
+
{
|
|
25
|
+
key: 'Content-Security-Policy',
|
|
26
|
+
value: cspValue,
|
|
27
|
+
},
|
|
28
|
+
],
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
source: '/extensions/edit/:id*',
|
|
32
|
+
headers: [
|
|
33
|
+
{
|
|
34
|
+
key: 'Content-Security-Policy',
|
|
35
|
+
value: cspValue,
|
|
36
|
+
},
|
|
37
|
+
],
|
|
38
|
+
},
|
|
39
|
+
];
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
export default nextConfig;
|
package/package.json
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "xinyu-pro",
|
|
3
|
+
"version": "0.21.0",
|
|
4
|
+
"private": false,
|
|
5
|
+
"description": "星语 Pro - AI 驱动的互动叙事平台",
|
|
6
|
+
"author": "RestRegular",
|
|
7
|
+
"license": "MIT",
|
|
8
|
+
"bin": {
|
|
9
|
+
"xinyu": "bin/cli.js"
|
|
10
|
+
},
|
|
11
|
+
"files": [
|
|
12
|
+
"bin/",
|
|
13
|
+
"app/",
|
|
14
|
+
"components/",
|
|
15
|
+
"lib/",
|
|
16
|
+
"plugins/",
|
|
17
|
+
"public/",
|
|
18
|
+
"styles/",
|
|
19
|
+
"next.config.mjs",
|
|
20
|
+
"tailwind.config.ts",
|
|
21
|
+
"tsconfig.json",
|
|
22
|
+
"postcss.config.mjs",
|
|
23
|
+
".env.example",
|
|
24
|
+
"version.json"
|
|
25
|
+
],
|
|
26
|
+
"engines": {
|
|
27
|
+
"node": ">=18"
|
|
28
|
+
},
|
|
29
|
+
"scripts": {
|
|
30
|
+
"dev": "next dev",
|
|
31
|
+
"build": "next build",
|
|
32
|
+
"start": "next start",
|
|
33
|
+
"lint": "next lint",
|
|
34
|
+
"prepublishOnly": "next build"
|
|
35
|
+
},
|
|
36
|
+
"dependencies": {
|
|
37
|
+
"@fortawesome/fontawesome-free": "^7.2.0",
|
|
38
|
+
"@monaco-editor/react": "^4.7.0",
|
|
39
|
+
"@types/node": "^20",
|
|
40
|
+
"@types/react": "^18",
|
|
41
|
+
"@types/react-dom": "^18",
|
|
42
|
+
"adm-zip": "^0.5.17",
|
|
43
|
+
"mysql2": "^3.22.2",
|
|
44
|
+
"next": "14.2.35",
|
|
45
|
+
"postcss": "^8",
|
|
46
|
+
"react": "^18",
|
|
47
|
+
"react-dom": "^18",
|
|
48
|
+
"tailwindcss": "^3.4.1",
|
|
49
|
+
"typescript": "^5"
|
|
50
|
+
},
|
|
51
|
+
"devDependencies": {
|
|
52
|
+
"@types/adm-zip": "^0.5.8",
|
|
53
|
+
"eslint": "^8",
|
|
54
|
+
"eslint-config-next": "14.2.35"
|
|
55
|
+
}
|
|
56
|
+
}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 400 560" width="400" height="560">
|
|
2
|
+
<defs>
|
|
3
|
+
<linearGradient id="bg" x1="0%" y1="0%" x2="0%" y2="100%">
|
|
4
|
+
<stop offset="0%" style="stop-color:#1a0a2e;stop-opacity:1" />
|
|
5
|
+
<stop offset="100%" style="stop-color:#0d0520;stop-opacity:1" />
|
|
6
|
+
</linearGradient>
|
|
7
|
+
<linearGradient id="gold" x1="0%" y1="0%" x2="100%" y2="100%">
|
|
8
|
+
<stop offset="0%" style="stop-color:#d4a843;stop-opacity:1" />
|
|
9
|
+
<stop offset="100%" style="stop-color:#f0d080;stop-opacity:1" />
|
|
10
|
+
</linearGradient>
|
|
11
|
+
</defs>
|
|
12
|
+
|
|
13
|
+
<!-- 背景 -->
|
|
14
|
+
<rect width="400" height="560" rx="16" fill="url(#bg)" />
|
|
15
|
+
|
|
16
|
+
<!-- 装饰边框 -->
|
|
17
|
+
<rect x="12" y="12" width="376" height="536" rx="12" fill="none" stroke="url(#gold)" stroke-width="1.5" opacity="0.6" />
|
|
18
|
+
<rect x="20" y="20" width="360" height="520" rx="8" fill="none" stroke="url(#gold)" stroke-width="0.5" opacity="0.3" />
|
|
19
|
+
|
|
20
|
+
<!-- 顶部装饰 -->
|
|
21
|
+
<line x1="100" y1="60" x2="300" y2="60" stroke="url(#gold)" stroke-width="1" opacity="0.4" />
|
|
22
|
+
<circle cx="200" cy="60" r="4" fill="url(#gold)" opacity="0.6" />
|
|
23
|
+
<circle cx="100" cy="60" r="2" fill="url(#gold)" opacity="0.4" />
|
|
24
|
+
<circle cx="300" cy="60" r="2" fill="url(#gold)" opacity="0.4" />
|
|
25
|
+
|
|
26
|
+
<!-- 标题区 -->
|
|
27
|
+
<text x="200" y="100" text-anchor="middle" fill="url(#gold)" font-size="24" font-weight="bold" font-family="serif">失落的亚特兰蒂斯</text>
|
|
28
|
+
<text x="200" y="125" text-anchor="middle" fill="#a89bc2" font-size="12" font-family="sans-serif">神话时代末期 · 深海之城</text>
|
|
29
|
+
|
|
30
|
+
<!-- 分隔线 -->
|
|
31
|
+
<line x1="60" y1="145" x2="340" y2="145" stroke="url(#gold)" stroke-width="0.5" opacity="0.3" />
|
|
32
|
+
|
|
33
|
+
<!-- 内容区域装饰 -->
|
|
34
|
+
<text x="60" y="175" fill="#6b5f85" font-size="10" font-family="sans-serif">叙事基调</text>
|
|
35
|
+
<text x="60" y="195" fill="#e8e0f0" font-size="13" font-family="sans-serif">史诗悲壮</text>
|
|
36
|
+
|
|
37
|
+
<text x="60" y="225" fill="#6b5f85" font-size="10" font-family="sans-serif">核心冲突</text>
|
|
38
|
+
<text x="60" y="245" fill="#e8e0f0" font-size="13" font-family="sans-serif">亚特兰蒂斯即将沉没,</text>
|
|
39
|
+
<text x="60" y="265" fill="#e8e0f0" font-size="13" font-family="sans-serif">你必须在文明毁灭前找到</text>
|
|
40
|
+
<text x="60" y="285" fill="#e8e0f0" font-size="13" font-family="sans-serif">拯救这座深海之城的方法。</text>
|
|
41
|
+
|
|
42
|
+
<text x="60" y="315" fill="#6b5f85" font-size="10" font-family="sans-serif">主要势力</text>
|
|
43
|
+
<text x="60" y="335" fill="#d4a843" font-size="12" font-family="sans-serif">🔮 祭司团 · ⚔️ 王室卫队 · 🌊 深渊教团</text>
|
|
44
|
+
|
|
45
|
+
<!-- 底部装饰 -->
|
|
46
|
+
<line x1="60" y1="365" x2="340" y2="365" stroke="url(#gold)" stroke-width="0.5" opacity="0.3" />
|
|
47
|
+
<circle cx="200" cy="500" r="20" fill="none" stroke="url(#gold)" stroke-width="1" opacity="0.3" />
|
|
48
|
+
<circle cx="200" cy="500" r="12" fill="none" stroke="url(#gold)" stroke-width="0.5" opacity="0.2" />
|
|
49
|
+
<text x="200" y="505" text-anchor="middle" fill="url(#gold)" font-size="14">✦</text>
|
|
50
|
+
|
|
51
|
+
<!-- 嵌入式世界数据 -->
|
|
52
|
+
<script type="application/json" id="world-data">
|
|
53
|
+
{
|
|
54
|
+
"title": "失落的亚特兰蒂斯",
|
|
55
|
+
"era": "神话时代末期",
|
|
56
|
+
"location": "深海之城亚特兰蒂斯",
|
|
57
|
+
"tone": "史诗悲壮",
|
|
58
|
+
"coreConflict": "亚特兰蒂斯即将沉没,你必须在文明毁灭前找到拯救这座深海之城的方法。古老的预言指向三件神器,但每一件都由强大的守护者看管。",
|
|
59
|
+
"keyFactions": ["祭司团", "王室卫队", "深渊教团"],
|
|
60
|
+
"aiPrompt": "以庄重而富有诗意的语调叙述。注重描写海洋的光影、古老建筑的壮美和角色内心的挣扎。NPC 对话应带有神话时代的典雅气质。"
|
|
61
|
+
}
|
|
62
|
+
</script>
|
|
63
|
+
</svg>
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 400 560" width="400" height="560">
|
|
2
|
+
<defs>
|
|
3
|
+
<linearGradient id="cyberBg" x1="0%" y1="0%" x2="100%" y2="100%">
|
|
4
|
+
<stop offset="0%" style="stop-color:#0a0a0a;stop-opacity:1" />
|
|
5
|
+
<stop offset="100%" style="stop-color:#0d1a0d;stop-opacity:1" />
|
|
6
|
+
</linearGradient>
|
|
7
|
+
<linearGradient id="neonGreen" x1="0%" y1="0%" x2="100%" y2="0%">
|
|
8
|
+
<stop offset="0%" style="stop-color:#00ff88;stop-opacity:1" />
|
|
9
|
+
<stop offset="100%" style="stop-color:#00cc66;stop-opacity:1" />
|
|
10
|
+
</linearGradient>
|
|
11
|
+
</defs>
|
|
12
|
+
|
|
13
|
+
<!-- 背景 -->
|
|
14
|
+
<rect width="400" height="560" rx="4" fill="url(#cyberBg)" />
|
|
15
|
+
|
|
16
|
+
<!-- 扫描线效果 -->
|
|
17
|
+
<pattern id="scanlines" width="400" height="4" patternUnits="userSpaceOnUse">
|
|
18
|
+
<line x1="0" y1="0" x2="400" y2="0" stroke="#00ff88" stroke-width="0.3" opacity="0.1" />
|
|
19
|
+
</pattern>
|
|
20
|
+
<rect width="400" height="560" fill="url(#scanlines)" />
|
|
21
|
+
|
|
22
|
+
<!-- 边框 -->
|
|
23
|
+
<rect x="8" y="8" width="384" height="544" rx="2" fill="none" stroke="#00ff88" stroke-width="1" opacity="0.5" />
|
|
24
|
+
|
|
25
|
+
<!-- 角落装饰 -->
|
|
26
|
+
<polyline points="8,30 8,8 30,8" fill="none" stroke="#00ff88" stroke-width="2" />
|
|
27
|
+
<polyline points="370,8 392,8 392,30" fill="none" stroke="#00ff88" stroke-width="2" />
|
|
28
|
+
<polyline points="8,530 8,552 30,552" fill="none" stroke="#00ff88" stroke-width="2" />
|
|
29
|
+
<polyline points="370,552 392,552 392,530" fill="none" stroke="#00ff88" stroke-width="2" />
|
|
30
|
+
|
|
31
|
+
<!-- 标题 -->
|
|
32
|
+
<text x="200" y="80" text-anchor="middle" fill="#00ff88" font-size="22" font-weight="bold" font-family="monospace">霓虹都市 2099</text>
|
|
33
|
+
<text x="200" y="105" text-anchor="middle" fill="#406040" font-size="11" font-family="monospace">[ 赛博朋克 · 新东京地下城 ]</text>
|
|
34
|
+
|
|
35
|
+
<!-- 分隔线 -->
|
|
36
|
+
<line x1="40" y1="125" x2="360" y2="125" stroke="#00ff88" stroke-width="0.5" opacity="0.3" />
|
|
37
|
+
|
|
38
|
+
<!-- 数据标签 -->
|
|
39
|
+
<text x="40" y="155" fill="#406040" font-size="10" font-family="monospace">> 叙事基调</text>
|
|
40
|
+
<text x="40" y="175" fill="#e0ffe0" font-size="13" font-family="monospace">暗黑赛博朋克</text>
|
|
41
|
+
|
|
42
|
+
<text x="40" y="205" fill="#406040" font-size="10" font-family="monospace">> 核心冲突</text>
|
|
43
|
+
<text x="40" y="225" fill="#e0ffe0" font-size="12" font-family="monospace">巨型企业的 AI 系统失控,</text>
|
|
44
|
+
<text x="40" y="245" fill="#e0ffe0" font-size="12" font-family="monospace">整个城市的神经链接被劫持。</text>
|
|
45
|
+
<text x="40" y="265" fill="#e0ffe0" font-size="12" font-family="monospace">你是一名地下黑客,</text>
|
|
46
|
+
<text x="40" y="285" fill="#e0ffe0" font-size="12" font-family="monospace">必须在 72 小时内找到</text>
|
|
47
|
+
<text x="40" y="305" fill="#e0ffe0" font-size="12" font-family="monospace">关闭 AI 的后门代码。</text>
|
|
48
|
+
|
|
49
|
+
<text x="40" y="335" fill="#406040" font-size="10" font-family="monospace">> 主要势力</text>
|
|
50
|
+
<text x="40" y="355" fill="#00ff88" font-size="11" font-family="monospace">[ 荒坂集团 ] [ 地下抵抗军 ] [ AI 网络 ]</text>
|
|
51
|
+
|
|
52
|
+
<!-- 底部装饰 -->
|
|
53
|
+
<line x1="40" y1="385" x2="360" y2="385" stroke="#00ff88" stroke-width="0.5" opacity="0.3" />
|
|
54
|
+
<text x="200" y="510" text-anchor="middle" fill="#00ff88" font-size="10" font-family="monospace" opacity="0.4">[ SYSTEM READY ]</text>
|
|
55
|
+
|
|
56
|
+
<!-- 嵌入式世界数据 -->
|
|
57
|
+
<script type="application/json" id="world-data">
|
|
58
|
+
{
|
|
59
|
+
"title": "霓虹都市 2099",
|
|
60
|
+
"era": "2099年,赛博朋克时代",
|
|
61
|
+
"location": "新东京地下城",
|
|
62
|
+
"tone": "暗黑赛博朋克",
|
|
63
|
+
"coreConflict": "巨型企业的 AI 系统失控,整个城市的神经链接被劫持。你是一名地下黑客,必须在 72 小时内找到关闭 AI 的后门代码。城市的每一个角落都布满了监控无人机和企业安保。",
|
|
64
|
+
"keyFactions": ["荒坂集团", "地下抵抗军", "AI 网络"],
|
|
65
|
+
"aiPrompt": "以冷峻简洁的赛博朋克风格叙述。使用科技术语和黑客行话。场景描写注重新东京的霓虹灯光、雨水和电子噪音。NPC 对话简洁有力,带有未来都市的冷漠感。"
|
|
66
|
+
}
|
|
67
|
+
</script>
|
|
68
|
+
</svg>
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 400 560" width="400" height="560">
|
|
2
|
+
<defs>
|
|
3
|
+
<linearGradient id="parchBg" x1="0%" y1="0%" x2="0%" y2="100%">
|
|
4
|
+
<stop offset="0%" style="stop-color:#f8f0e0;stop-opacity:1" />
|
|
5
|
+
<stop offset="100%" style="stop-color:#e8dcc8;stop-opacity:1" />
|
|
6
|
+
</linearGradient>
|
|
7
|
+
</defs>
|
|
8
|
+
|
|
9
|
+
<!-- 背景 -->
|
|
10
|
+
<rect width="400" height="560" rx="8" fill="url(#parchBg)" />
|
|
11
|
+
|
|
12
|
+
<!-- 纸张纹理 -->
|
|
13
|
+
<filter id="paper">
|
|
14
|
+
<feTurbulence type="fractalNoise" baseFrequency="0.04" numOctaves="5" result="noise" />
|
|
15
|
+
<feDiffuseLighting in="noise" lighting-color="#f8f0e0" surfaceScale="2">
|
|
16
|
+
<feDistantLight azimuth="45" elevation="55" />
|
|
17
|
+
</feDiffuseLighting>
|
|
18
|
+
</filter>
|
|
19
|
+
<rect width="400" height="560" rx="8" fill="url(#parchBg)" filter="url(#paper)" opacity="0.3" />
|
|
20
|
+
|
|
21
|
+
<!-- 装饰边框 -->
|
|
22
|
+
<rect x="16" y="16" width="368" height="528" rx="4" fill="none" stroke="#8b4513" stroke-width="2" opacity="0.4" />
|
|
23
|
+
<rect x="24" y="24" width="352" height="512" rx="2" fill="none" stroke="#8b4513" stroke-width="0.5" opacity="0.2" />
|
|
24
|
+
|
|
25
|
+
<!-- 角落花纹 -->
|
|
26
|
+
<circle cx="40" cy="40" r="8" fill="none" stroke="#8b4513" stroke-width="1" opacity="0.3" />
|
|
27
|
+
<circle cx="360" cy="40" r="8" fill="none" stroke="#8b4513" stroke-width="1" opacity="0.3" />
|
|
28
|
+
<circle cx="40" cy="520" r="8" fill="none" stroke="#8b4513" stroke-width="1" opacity="0.3" />
|
|
29
|
+
<circle cx="360" cy="520" r="8" fill="none" stroke="#8b4513" stroke-width="1" opacity="0.3" />
|
|
30
|
+
|
|
31
|
+
<!-- 标题 -->
|
|
32
|
+
<text x="200" y="90" text-anchor="middle" fill="#3a2a1a" font-size="26" font-weight="bold" font-family="serif">江湖行</text>
|
|
33
|
+
<text x="200" y="118" text-anchor="middle" fill="#6a5a4a" font-size="12" font-family="serif">南宋末年 · 临安城</text>
|
|
34
|
+
|
|
35
|
+
<!-- 分隔线 -->
|
|
36
|
+
<line x1="80" y1="138" x2="320" y2="138" stroke="#8b4513" stroke-width="0.5" opacity="0.3" />
|
|
37
|
+
<circle cx="200" cy="138" r="3" fill="#8b4513" opacity="0.3" />
|
|
38
|
+
|
|
39
|
+
<!-- 内容 -->
|
|
40
|
+
<text x="50" y="170" fill="#9a8a7a" font-size="11" font-family="serif">【叙事基调】</text>
|
|
41
|
+
<text x="50" y="192" fill="#3a2a1a" font-size="14" font-family="serif">武侠江湖</text>
|
|
42
|
+
|
|
43
|
+
<text x="50" y="222" fill="#9a8a7a" font-size="11" font-family="serif">【核心冲突】</text>
|
|
44
|
+
<text x="50" y="244" fill="#3a2a1a" font-size="13" font-family="serif">蒙古铁骑南下,南宋江山风雨飘摇。</text>
|
|
45
|
+
<text x="50" y="266" fill="#3a2a1a" font-size="13" font-family="serif">你是一名流浪剑客,身怀绝世武功,</text>
|
|
46
|
+
<text x="50" y="288" fill="#3a2a1a" font-size="13" font-family="serif">却卷入了一场关乎天下命运的阴谋。</text>
|
|
47
|
+
<text x="50" y="310" fill="#3a2a1a" font-size="13" font-family="serif">传说中的《九阴真经》残卷散落江湖,</text>
|
|
48
|
+
<text x="50" y="332" fill="#3a2a1a" font-size="13" font-family="serif">各方势力明争暗斗。</text>
|
|
49
|
+
|
|
50
|
+
<text x="50" y="362" fill="#9a8a7a" font-size="11" font-family="serif">【主要势力】</text>
|
|
51
|
+
<text x="50" y="384" fill="#8b4513" font-size="12" font-family="serif">⚔️ 少林武当 · 🗡️ 暗影阁 · 🏯 朝廷</text>
|
|
52
|
+
|
|
53
|
+
<!-- 底部装饰 -->
|
|
54
|
+
<line x1="80" y1="410" x2="320" y2="410" stroke="#8b4513" stroke-width="0.5" opacity="0.3" />
|
|
55
|
+
<text x="200" y="490" text-anchor="middle" fill="#8b4513" font-size="20" opacity="0.3">⚔</text>
|
|
56
|
+
|
|
57
|
+
<!-- 嵌入式世界数据 -->
|
|
58
|
+
<script type="application/json" id="world-data">
|
|
59
|
+
{
|
|
60
|
+
"title": "江湖行",
|
|
61
|
+
"era": "南宋末年",
|
|
62
|
+
"location": "临安城",
|
|
63
|
+
"tone": "武侠江湖",
|
|
64
|
+
"coreConflict": "蒙古铁骑南下,南宋江山风雨飘摇。你是一名流浪剑客,身怀绝世武功,却卷入了一场关乎天下命运的阴谋。传说中的《九阴真经》残卷散落江湖,各方势力明争暗斗。",
|
|
65
|
+
"keyFactions": ["少林武当", "暗影阁", "朝廷"],
|
|
66
|
+
"aiPrompt": "以古典武侠小说的风格叙述,注重描写武功招式、江湖义气和人物情感。场景描写融入山水意境。NPC 对话带有古风韵味,适当使用成语和诗词。"
|
|
67
|
+
}
|
|
68
|
+
</script>
|
|
69
|
+
</svg>
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 400 560">
|
|
2
|
+
<defs>
|
|
3
|
+
<!-- 背景渐变 -->
|
|
4
|
+
<radialGradient id="bg-grad" cx="50%" cy="50%" r="70%">
|
|
5
|
+
<stop offset="0%" stop-color="#1B0F3A" />
|
|
6
|
+
<stop offset="100%" stop-color="#080112" />
|
|
7
|
+
</radialGradient>
|
|
8
|
+
|
|
9
|
+
<!-- 金色装饰渐变 -->
|
|
10
|
+
<linearGradient id="gold-grad" x1="0%" y1="0%" x2="100%" y2="100%">
|
|
11
|
+
<stop offset="0%" stop-color="#D4AF37" />
|
|
12
|
+
<stop offset="50%" stop-color="#FFDF73" />
|
|
13
|
+
<stop offset="100%" stop-color="#B8860B" />
|
|
14
|
+
</linearGradient>
|
|
15
|
+
|
|
16
|
+
<!-- 标题发光效果 -->
|
|
17
|
+
<filter id="glow" x="-20%" y="-20%" width="140%" height="140%">
|
|
18
|
+
<feGaussianBlur stdDeviation="3" result="blur" />
|
|
19
|
+
<feComposite in="SourceGraphic" in2="blur" operator="over" />
|
|
20
|
+
</filter>
|
|
21
|
+
|
|
22
|
+
<!-- 标题背后微光 -->
|
|
23
|
+
<radialGradient id="glow-grad" cx="50%" cy="50%" r="50%">
|
|
24
|
+
<stop offset="0%" stop-color="#FFD700" stop-opacity="0.15" />
|
|
25
|
+
<stop offset="100%" stop-color="#FFD700" stop-opacity="0" />
|
|
26
|
+
</radialGradient>
|
|
27
|
+
|
|
28
|
+
<!-- 角落符文装饰 -->
|
|
29
|
+
<g id="corner-ornament">
|
|
30
|
+
<circle cx="0" cy="0" r="14" fill="none" stroke="url(#gold-grad)" stroke-width="1.5" />
|
|
31
|
+
<circle cx="0" cy="0" r="9" fill="none" stroke="url(#gold-grad)" stroke-width="1" stroke-dasharray="2,2" />
|
|
32
|
+
<path d="M 0,-14 L 3,-5 L 14,0 L 3,5 L 0,14 L -3,5 L -14,0 L -3,-5 Z" fill="url(#gold-grad)" />
|
|
33
|
+
</g>
|
|
34
|
+
|
|
35
|
+
<!-- 装饰星芒 -->
|
|
36
|
+
<path id="star" d="M 0,-8 L 2,-2 L 8,0 L 2,2 L 0,8 L -2,2 L -8,0 L -2,-2 Z" fill="url(#gold-grad)" />
|
|
37
|
+
</defs>
|
|
38
|
+
|
|
39
|
+
<!-- 背景层 -->
|
|
40
|
+
<rect width="400" height="560" fill="url(#bg-grad)" />
|
|
41
|
+
|
|
42
|
+
<!-- 背景隐藏魔法阵 -->
|
|
43
|
+
<g opacity="0.06" stroke="#D4AF37" fill="none">
|
|
44
|
+
<circle cx="200" cy="290" r="150" stroke-width="2" />
|
|
45
|
+
<circle cx="200" cy="290" r="130" stroke-width="1.5" stroke-dasharray="10,5" />
|
|
46
|
+
<polygon points="200,140 260,250 350,290 260,330 200,440 140,330 50,290 140,250" stroke-width="1.5" />
|
|
47
|
+
<polygon points="200,160 245,245 320,290 245,335 200,420 155,335 80,290 155,245" stroke-width="1" />
|
|
48
|
+
</g>
|
|
49
|
+
|
|
50
|
+
<!-- 装饰边框 -->
|
|
51
|
+
<rect x="10" y="10" width="380" height="540" fill="none" stroke="url(#gold-grad)" stroke-width="2" rx="15" />
|
|
52
|
+
<rect x="15" y="15" width="370" height="530" fill="none" stroke="url(#gold-grad)" stroke-width="1" stroke-dasharray="5,5" rx="12" />
|
|
53
|
+
|
|
54
|
+
<!-- 角落符文 -->
|
|
55
|
+
<use href="#corner-ornament" x="25" y="25" />
|
|
56
|
+
<use href="#corner-ornament" x="375" y="25" />
|
|
57
|
+
<use href="#corner-ornament" x="25" y="535" />
|
|
58
|
+
<use href="#corner-ornament" x="375" y="535" />
|
|
59
|
+
|
|
60
|
+
<!-- 魔法尘埃 / 漂浮星芒 -->
|
|
61
|
+
<use href="#star" transform="translate(60, 60) scale(0.6)" opacity="0.7" />
|
|
62
|
+
<use href="#star" transform="translate(340, 100) scale(0.4)" opacity="0.5" />
|
|
63
|
+
<use href="#star" transform="translate(80, 480) scale(0.5)" opacity="0.6" />
|
|
64
|
+
<use href="#star" transform="translate(320, 510) scale(0.7)" opacity="0.8" />
|
|
65
|
+
<use href="#star" transform="translate(150, 130) scale(0.3)" opacity="0.9" />
|
|
66
|
+
<use href="#star" transform="translate(260, 130) scale(0.3)" opacity="0.9" />
|
|
67
|
+
<use href="#star" transform="translate(200, 40) scale(1.2)" opacity="0.8" />
|
|
68
|
+
|
|
69
|
+
<!-- 标题区域 -->
|
|
70
|
+
<circle cx="200" cy="75" r="80" fill="url(#glow-grad)" />
|
|
71
|
+
<text x="200" y="78" font-family="'Times New Roman', Times, serif" font-size="48" fill="url(#gold-grad)" text-anchor="middle" font-weight="bold" filter="url(#glow)" letter-spacing="4">魔法世界</text>
|
|
72
|
+
|
|
73
|
+
<!-- 标题装饰线 -->
|
|
74
|
+
<path d="M 100 95 Q 200 105 300 95" fill="none" stroke="url(#gold-grad)" stroke-width="2" />
|
|
75
|
+
<path d="M 120 102 Q 200 110 280 102" fill="none" stroke="url(#gold-grad)" stroke-width="1" />
|
|
76
|
+
<use href="#star" transform="translate(200, 105) scale(1.5)" />
|
|
77
|
+
|
|
78
|
+
<!-- 信息背景面板 -->
|
|
79
|
+
<rect x="30" y="120" width="340" height="365" fill="#000000" opacity="0.4" rx="10" />
|
|
80
|
+
|
|
81
|
+
<!-- 信息内容 -->
|
|
82
|
+
<!-- 时代 -->
|
|
83
|
+
<text x="40" y="122" font-size="12" fill="url(#gold-grad)">✦</text>
|
|
84
|
+
<text x="55" y="122" font-family="Georgia, serif" font-size="14" fill="#C5A55A" font-weight="bold" letter-spacing="2">时 代</text>
|
|
85
|
+
<text x="55" y="142" font-family="Georgia, serif" font-size="16" fill="#F4E8D1">中世纪魔法纪元</text>
|
|
86
|
+
<line x1="55" y1="157" x2="350" y2="157" stroke="url(#gold-grad)" stroke-width="0.5" opacity="0.6" />
|
|
87
|
+
|
|
88
|
+
<!-- 地点 -->
|
|
89
|
+
<text x="40" y="182" font-size="12" fill="url(#gold-grad)">✦</text>
|
|
90
|
+
<text x="55" y="182" font-family="Georgia, serif" font-size="14" fill="#C5A55A" font-weight="bold" letter-spacing="2">地 点</text>
|
|
91
|
+
<text x="55" y="202" font-family="Georgia, serif" font-size="16" fill="#F4E8D1">霍格沃茨魔法学院</text>
|
|
92
|
+
<line x1="55" y1="217" x2="350" y2="217" stroke="url(#gold-grad)" stroke-width="0.5" opacity="0.6" />
|
|
93
|
+
|
|
94
|
+
<!-- 基调 -->
|
|
95
|
+
<text x="40" y="242" font-size="12" fill="url(#gold-grad)">✦</text>
|
|
96
|
+
<text x="55" y="242" font-family="Georgia, serif" font-size="14" fill="#C5A55A" font-weight="bold" letter-spacing="2">基 调</text>
|
|
97
|
+
<text x="55" y="262" font-family="Georgia, serif" font-size="16" fill="#F4E8D1">史诗</text>
|
|
98
|
+
<line x1="55" y1="277" x2="350" y2="277" stroke="url(#gold-grad)" stroke-width="0.5" opacity="0.6" />
|
|
99
|
+
|
|
100
|
+
<!-- 核心冲突 -->
|
|
101
|
+
<text x="40" y="302" font-size="12" fill="url(#gold-grad)">✦</text>
|
|
102
|
+
<text x="55" y="302" font-family="Georgia, serif" font-size="14" fill="#C5A55A" font-weight="bold" letter-spacing="2">核心冲突</text>
|
|
103
|
+
<text x="55" y="322" font-family="Georgia, serif" font-size="15" fill="#F4E8D1">光明与黑暗的魔法大战,</text>
|
|
104
|
+
<text x="55" y="342" font-family="Georgia, serif" font-size="15" fill="#F4E8D1">魔法的滥用导致世界失衡</text>
|
|
105
|
+
<line x1="55" y1="357" x2="350" y2="357" stroke="url(#gold-grad)" stroke-width="0.5" opacity="0.6" />
|
|
106
|
+
|
|
107
|
+
<!-- 关键阵营 -->
|
|
108
|
+
<text x="40" y="382" font-size="12" fill="url(#gold-grad)">✦</text>
|
|
109
|
+
<text x="55" y="382" font-family="Georgia, serif" font-size="14" fill="#C5A55A" font-weight="bold" letter-spacing="2">关键阵营</text>
|
|
110
|
+
<text x="55" y="402" font-family="Georgia, serif" font-size="15" fill="#F4E8D1">
|
|
111
|
+
<tspan>光明教廷</tspan><tspan dx="20">·</tspan><tspan dx="20">黑暗议会</tspan>
|
|
112
|
+
</text>
|
|
113
|
+
<text x="55" y="424" font-family="Georgia, serif" font-size="15" fill="#F4E8D1">
|
|
114
|
+
<tspan>龙族隐修会</tspan><tspan dx="20">·</tspan><tspan dx="20">精灵王国</tspan>
|
|
115
|
+
</text>
|
|
116
|
+
<line x1="55" y1="435" x2="350" y2="435" stroke="url(#gold-grad)" stroke-width="0.5" opacity="0.6" />
|
|
117
|
+
|
|
118
|
+
<!-- 世界之声(AI提示)区域 -->
|
|
119
|
+
<rect x="30" y="440" width="340" height="80" fill="#000000" fill-opacity="0.3" stroke="url(#gold-grad)" stroke-width="1" rx="5" />
|
|
120
|
+
<text x="200" y="458" font-family="Georgia, serif" font-size="12" fill="url(#gold-grad)" text-anchor="middle" font-weight="bold">✧ 世界之声 ✧</text>
|
|
121
|
+
<text x="40" y="475" font-family="sans-serif" font-size="10" fill="#B8A788" font-style="italic">“作为一名专业的游戏主持,你将用生动、富有</text>
|
|
122
|
+
<text x="40" y="488" font-family="sans-serif" font-size="10" fill="#B8A788" font-style="italic">神秘感的语言描述场景,推动剧情发展,并适当</text>
|
|
123
|
+
<text x="40" y="501" font-family="sans-serif" font-size="10" fill="#B8A788" font-style="italic">扮演NPC引导玩家探索。”</text>
|
|
124
|
+
|
|
125
|
+
<!-- 嵌入式世界设定数据 -->
|
|
126
|
+
<script type="application/json" id="world-data">
|
|
127
|
+
{
|
|
128
|
+
"title": "魔法世界",
|
|
129
|
+
"era": "中世纪魔法纪元",
|
|
130
|
+
"location": "霍格沃茨魔法学院",
|
|
131
|
+
"tone": "史诗",
|
|
132
|
+
"coreConflict": "光明与黑暗的魔法大战,魔法的滥用导致世界失衡",
|
|
133
|
+
"keyFactions": "光明教廷、黑暗议会、龙族隐修会、精灵王国",
|
|
134
|
+
"aiPrompt": "作为一名专业的游戏主持,你将用生动、富有神秘感的语言描述场景,推动剧情发展,并适当扮演NPC引导玩家探索。"
|
|
135
|
+
}
|
|
136
|
+
</script>
|
|
137
|
+
</svg>
|