diff --git a/modules/story-outline/story-outline-prompt.js b/modules/story-outline/story-outline-prompt.js index 32c4a59..b65ba6c 100644 --- a/modules/story-outline/story-outline-prompt.js +++ b/modules/story-outline/story-outline-prompt.js @@ -272,14 +272,14 @@ const DEFAULT_JSON_TEMPLATES = { localSceneGen: `{ "review": { "deviation": { - "cot_analysis": "简要分析{{user}}在上一地点的行为对氛围的影响(例如:让气氛更热闹/更安静)。", + "cot_analysis": "简要分析{{user}}在上一地点的行为对氛围的影响(例如:让气氛更热闹/更安静)。", "score_delta": 0 } }, "side_story": { - "surface": "{{user}}刚进入时看到的画面或听到的话语,充满生活感。", - "inner": "如果{{user}}稍微多停留或互动,可以发现的细节(例如 NPC 的小秘密、店家的用心布置)。", - "Introduce": "接着玩家之前经历,填写引入这段故事的文字(纯叙述文本)。不要包含 /send、/sendas、/sys 或类似 'as name=\"...\"' 的前缀。" + "Incident": "触发。描写打破环境平衡的瞬间。它是一个‘钩子’,负责强行吸引玩家注意力并建立临场感(如:突发的争吵、破碎声、人群的异动)。", + "Facade": "表现。交代明面上的剧情逻辑。不需过多渲染,只需叙述‘看起来是怎么回事’。重点在于冲突的表面原因、人物的公开说辞或围观者眼中的剧本。这是玩家不需要深入调查就能获得的信息。", + "Undercurrent": "暗流。背后的秘密或真实动机。它是驱动事件发生的‘真实引擎’。它不一定是反转,但必须是‘隐藏在表面下的信息’(如:某种苦衷、被误导的真相、或是玩家探究后才能发现的关联)。它是对Facade的深化,为玩家的后续介入提供价值。" } }` }; @@ -599,6 +599,6 @@ export const buildOverlayHtml = src => `
`; -export const MOBILE_LAYOUT_STYLE = 'position:absolute!important;left:0!important;right:0!important;top:0!important;bottom:auto!important;width:100%!important;height:350px!important;transform:none!important;z-index:1!important;pointer-events:auto!important;border-radius:0 0 16px 16px!important;box-shadow:0 8px 32px rgba(0,0,0,.4)!important;overflow:hidden!important;display:flex!important;flex-direction:column!important;background:#f4f4f4!important;'; +export const MOBILE_LAYOUT_STYLE = 'position:absolute!important;left:0!important;right:0!important;top:0!important;bottom:auto!important;width:100%!important;height:350px!important;transform:none!important;z-index:1!important;pointer-events:auto!important;border-radius:0 0 16px 16px!important;box-shadow:0 8px 32px rgba(0,0,0,.4)!important;overflow:hidden!important;display:flex!important;flex-direction:column!important;background:#f4f4f4!important;'; export const DESKTOP_LAYOUT_STYLE = 'position:absolute!important;left:50%!important;top:50%!important;transform:translate(-50%,-50%)!important;width:600px!important;max-width:90vw!important;height:450px!important;max-height:80vh!important;z-index:1!important;pointer-events:auto!important;border-radius:12px!important;box-shadow:0 8px 32px rgba(0,0,0,.4)!important;overflow:hidden!important;display:flex!important;flex-direction:column!important;background:#f4f4f4!important;'; diff --git a/modules/story-outline/story-outline.html b/modules/story-outline/story-outline.html index 2a2a476..c32fb72 100644 --- a/modules/story-outline/story-outline.html +++ b/modules/story-outline/story-outline.html @@ -31,6 +31,8 @@ .btn:hover{border-color:var(--c);background:var(--bg3)} .btn:disabled{opacity:.5;cursor:not-allowed} .btn-p{background:var(--c);color:#fff;border-color:var(--c)} + .btn-due{background:#ffe1e1!important;border-color:#ff9b9b!important;color:#7a1f1f!important} + .btn-due:hover{background:#ffd1d1!important} .btn-s{padding:6px 12px;font-size:12px} .btn-c{width:28px;height:28px;padding:0;background:#888;border-color:#777;color:#fff;border-radius:50%} .btn-add{width:32px;height:32px;padding:0;border-radius:50%;flex-shrink:0} @@ -176,7 +178,7 @@ .modal-by{flex:1;overflow-y:auto;padding:18px} /* 编辑器 */ - .ed-ta{width:100%;min-height:200px;padding:12px;background:var(--bg);border:none;border-top:1px solid var(--bd);font-family:'SF Mono',Monaco,Consolas,monospace;font-size:11px;line-height:1.5;color:var(--c);resize:none;outline:none} + .ed-ta{width:100%;min-height:100px;padding:12px;background:var(--bg);border:none;border-top:1px solid var(--bd);font-family:'SF Mono',Monaco,Consolas,monospace;font-size:11px;line-height:1.5;color:var(--c);resize:vertical;outline:none;overflow:auto} .ed-preview{margin-top:10px;padding:10px;background:var(--bg3);border:1px solid var(--bd);border-radius:4px;font-size:11px;font-family:'SF Mono',Monaco,Consolas,monospace;white-space:pre-wrap;display:none;color:var(--c2)} .ed-err{padding:10px;background:#fef2f2;border:1px solid #fecaca;border-radius:4px;color:#b91c1c;font-size:12px;margin-top:10px;display:none} .ed-err.vis{display:block} @@ -308,7 +310,7 @@ @@ -370,7 +372,7 @@{{user}}:你的名字/称呼{{persona}}:你的 Persona(用户设定){{description}}:当前角色描述(角色卡 description){$worldInfo}:世界书(World Info)注入内容{$historyN}:最近 N 条聊天历史(例:{$history50})${v.xxx} 取值)v.storyOutline:剧情大纲文本v.historyCount:历史条数(配合 {$historyN})v.mode:模式(assist/story)v.contactName:联系人/NPC 名字v.userName:用户名字(部分模板可能用到)v.smsHistoryContent:已整理的短信历史块v.userMessage:用户发来的新短信文本v.characterContent:人物设定文本(可选)v.targetLocation:邀请要去的地点v.existingSummaryContent:已有摘要内容v.conversationText:需要总结的对话文本v.strangerName:新 NPC 名字v.strangerInfo:新 NPC 描述v.existingContacts:已有联络人列表(避免重复)v.existingStrangers:已有陌路人列表(避免重复)v.prevLocationName:上一地点名v.prevLocationInfo:上一地点描述(可选)v.targetLocationName:目标地点名v.targetLocationType:目标地点类型(home/sub 等)v.targetLocationInfo:目标地点描述(可选)v.playerAction:玩家行动/意图(可选)v.stage:当前阶段/轮次v.currentTimeline:当前时间线对象(可选)v.outdoorDescription:大地图/户外地图描述(可选)v.locationName:当前地点名v.locationInfo:当前地点信息(可选)v.playerLocation:玩家当前地点名(可选)v.currentLocalMap:当前局部地图 JSON(可选)v.playerRequests:世界生成需求文本v.step1Data:世界生成 Step 1 数据(meta)v.currentWorldData:当前世界状态 JSON(字符串)v.deviationScore:干扰评分/偏差值