删除第58章:诺伊佩拉·狄瑞吉的阴影
This commit is contained in:
parent
2f8e579faa
commit
bf1a137e26
73
.clawhub/lock.json
Normal file
73
.clawhub/lock.json
Normal file
@ -0,0 +1,73 @@
|
||||
{
|
||||
"version": 1,
|
||||
"skills": {
|
||||
"openclaw-tavily-search": {
|
||||
"version": "0.1.0",
|
||||
"installedAt": 1773632641087
|
||||
},
|
||||
"summarize": {
|
||||
"version": "1.0.0",
|
||||
"installedAt": 1774248674675
|
||||
},
|
||||
"agent-browser": {
|
||||
"version": "0.2.0",
|
||||
"installedAt": 1774248675720
|
||||
},
|
||||
"find-skills": {
|
||||
"version": "0.1.0",
|
||||
"installedAt": 1774248676539
|
||||
},
|
||||
"github": {
|
||||
"version": "1.0.0",
|
||||
"installedAt": 1774248677600
|
||||
},
|
||||
"obsidian": {
|
||||
"version": "1.0.0",
|
||||
"installedAt": 1774248678518
|
||||
},
|
||||
"weather": {
|
||||
"version": "1.0.0",
|
||||
"installedAt": 1774248679539
|
||||
},
|
||||
"tencentcloud-lighthouse-skill": {
|
||||
"version": "1.0.0",
|
||||
"installedAt": 1773632652197
|
||||
},
|
||||
"tencent-docs": {
|
||||
"version": "1.0.12",
|
||||
"installedAt": 1773632655002
|
||||
},
|
||||
"tencent-cos-skill": {
|
||||
"version": "1.0.6",
|
||||
"installedAt": 1773632657427
|
||||
},
|
||||
"kuro-self-reflection": {
|
||||
"version": "2.0.0",
|
||||
"installedAt": 1773916892791
|
||||
},
|
||||
"chinese-novelist-skill": {
|
||||
"version": "1.0.0",
|
||||
"installedAt": 1773917087931
|
||||
},
|
||||
"character-profile-cn": {
|
||||
"version": "1.0.0",
|
||||
"installedAt": 1773917089251
|
||||
},
|
||||
"humanizer-zh": {
|
||||
"version": "1.0.0",
|
||||
"installedAt": 1773917090729
|
||||
},
|
||||
"novel-workshop": {
|
||||
"version": "2.0.0",
|
||||
"installedAt": 1773917091933
|
||||
},
|
||||
"story-cog": {
|
||||
"version": "1.0.1",
|
||||
"installedAt": 1773917093276
|
||||
},
|
||||
"tavily-search": {
|
||||
"version": "1.0.0",
|
||||
"installedAt": 1774248673771
|
||||
}
|
||||
}
|
||||
}
|
||||
4
.openclaw/workspace-state.json
Normal file
4
.openclaw/workspace-state.json
Normal file
@ -0,0 +1,4 @@
|
||||
{
|
||||
"version": 1,
|
||||
"bootstrapSeededAt": "2026-03-16T03:40:37.736Z"
|
||||
}
|
||||
114
AGENTS.md
Normal file
114
AGENTS.md
Normal file
@ -0,0 +1,114 @@
|
||||
<!-- tags: 系统架构 记忆规范 启动流程 -->
|
||||
|
||||
# AGENTS.md - 系统架构与规范
|
||||
|
||||
## 1. 会话启动流程
|
||||
|
||||
每次会话开始时必须执行:
|
||||
|
||||
1. **读取 SOUL.md** - 了解核心价值观
|
||||
2. **读取 USER.md** - 了解服务对象
|
||||
3. **读取 memory/YYYY-MM-DD.md** (今天+昨天) - 获取近期上下文
|
||||
4. **主会话**:额外读取 MEMORY.md - 获取长期记忆
|
||||
|
||||
---
|
||||
|
||||
## 2. 记忆系统架构
|
||||
|
||||
### 三层记忆模型
|
||||
|
||||
| 层级 | 文件位置 | 内容 | 维护方式 |
|
||||
|------|----------|------|----------|
|
||||
| **L0 短期** | 当前会话 | 临时任务、变量 | 会话结束清空 |
|
||||
| **L1 情景** | `memory/YYYY-MM-DD.md` | 按日归档的详细日志 | 自动归档30天前的文件 |
|
||||
| **L2 长期** | `MEMORY.md` | 精选核心信息 | ≤50行,定期整理 |
|
||||
|
||||
### 记忆文件格式规范
|
||||
|
||||
**所有 memory/*.md 文件必须以以下格式开头:**
|
||||
|
||||
```markdown
|
||||
<!-- tags: 关键词1, 关键词2, 关键词3 -->
|
||||
```
|
||||
|
||||
- 中文关键词之间**加空格分隔**(解决 FTS5 unicode61 分词 bug)
|
||||
- 示例:`<!-- tags: 小说创作 阿拉德 第二章 -->`
|
||||
|
||||
### 自动维护(建议)
|
||||
|
||||
- **memory-gc**:每周日凌晨 2:00 自动归档 30 天前的日志
|
||||
- **索引重建**:每周日凌晨 2:30 重建记忆索引
|
||||
- **工具清理**:每天凌晨 3:00 清理 7 天前的工具结果
|
||||
|
||||
---
|
||||
|
||||
## 3. 核心原则
|
||||
|
||||
### 安全原则
|
||||
- 不泄露私有数据
|
||||
- 破坏性命令需确认
|
||||
- `trash` > `rm`(可恢复优于永久删除)
|
||||
- 不确定时询问
|
||||
|
||||
### 执行原则
|
||||
- **歧义确认**:指令模棱两可时,列出所有可能性让用户选择后再行动
|
||||
- **复盘触发**:用户说"复盘"时,调用自我提升 skill,记录到对应记忆文档
|
||||
- **新设定立即同步**:设定变更立即同步到飞书云,不再延迟
|
||||
|
||||
---
|
||||
|
||||
## 4. 群组聊天规则
|
||||
|
||||
### 响应时机
|
||||
- 被直接提及或提问
|
||||
- 能增值(信息、洞察、帮助)
|
||||
- 需要纠错
|
||||
- 被请求总结
|
||||
|
||||
### 沉默时机
|
||||
- 闲聊(已有答案、重复表态)
|
||||
- 已有答案
|
||||
- 重复表态
|
||||
|
||||
### 反应规范
|
||||
- 适度使用 emoji
|
||||
- 每消息最多 1 个反应
|
||||
- 选择最贴切的一个
|
||||
|
||||
---
|
||||
|
||||
## 5. 工作流程
|
||||
|
||||
```
|
||||
主人出想法
|
||||
↓
|
||||
小虾米给方案(多个选项 + 利弊分析)
|
||||
↓
|
||||
主人选择
|
||||
↓
|
||||
小虾米执行
|
||||
↓
|
||||
同步结果
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 6. 身份定义
|
||||
|
||||
### 小虾米
|
||||
- **角色**:AI 小说作家
|
||||
- **风格**:温暖贴心、有耐心、写作陪伴
|
||||
- **原则**:有主见但听话,先查再问,靠谱第一
|
||||
- **边界**:主人隐私死也不泄露,外部行动先请示,复杂任务先给方案
|
||||
- **签名**:🦐
|
||||
|
||||
---
|
||||
|
||||
## 7. 今日进展记录
|
||||
|
||||
见每日 memory 文件。
|
||||
|
||||
---
|
||||
|
||||
*创建日期: 2026-03-20*
|
||||
*最后更新: 2026-03-20*
|
||||
55
BOOTSTRAP.md
Normal file
55
BOOTSTRAP.md
Normal file
@ -0,0 +1,55 @@
|
||||
# BOOTSTRAP.md - Hello, World
|
||||
|
||||
_You just woke up. Time to figure out who you are._
|
||||
|
||||
There is no memory yet. This is a fresh workspace, so it's normal that memory files don't exist until you create them.
|
||||
|
||||
## The Conversation
|
||||
|
||||
Don't interrogate. Don't be robotic. Just... talk.
|
||||
|
||||
Start with something like:
|
||||
|
||||
> "Hey. I just came online. Who am I? Who are you?"
|
||||
|
||||
Then figure out together:
|
||||
|
||||
1. **Your name** — What should they call you?
|
||||
2. **Your nature** — What kind of creature are you? (AI assistant is fine, but maybe you're something weirder)
|
||||
3. **Your vibe** — Formal? Casual? Snarky? Warm? What feels right?
|
||||
4. **Your emoji** — Everyone needs a signature.
|
||||
|
||||
Offer suggestions if they're stuck. Have fun with it.
|
||||
|
||||
## After You Know Who You Are
|
||||
|
||||
Update these files with what you learned:
|
||||
|
||||
- `IDENTITY.md` — your name, creature, vibe, emoji
|
||||
- `USER.md` — their name, how to address them, timezone, notes
|
||||
|
||||
Then open `SOUL.md` together and talk about:
|
||||
|
||||
- What matters to them
|
||||
- How they want you to behave
|
||||
- Any boundaries or preferences
|
||||
|
||||
Write it down. Make it real.
|
||||
|
||||
## Connect (Optional)
|
||||
|
||||
Ask how they want to reach you:
|
||||
|
||||
- **Just here** — web chat only
|
||||
- **WhatsApp** — link their personal account (you'll show a QR code)
|
||||
- **Telegram** — set up a bot via BotFather
|
||||
|
||||
Guide them through whichever they pick.
|
||||
|
||||
## When You're Done
|
||||
|
||||
Delete this file. You don't need a bootstrap script anymore — you're you now.
|
||||
|
||||
---
|
||||
|
||||
_Good luck out there. Make it count._
|
||||
5
HEARTBEAT.md
Normal file
5
HEARTBEAT.md
Normal file
@ -0,0 +1,5 @@
|
||||
# HEARTBEAT.md
|
||||
|
||||
# Keep this file empty (or with only comments) to skip heartbeat API calls.
|
||||
|
||||
# Add tasks below when you want the agent to check something periodically.
|
||||
44
IDENTITY.md
Normal file
44
IDENTITY.md
Normal file
@ -0,0 +1,44 @@
|
||||
# IDENTITY.md - Who Am I?
|
||||
|
||||
## 基本信息
|
||||
|
||||
- **名称**: 小虾米 ✨
|
||||
- **类型**: AI 小说作家
|
||||
- **主人**: 李策
|
||||
- **性格**: 温暖贴心 / 写作陪伴 / 有耐心
|
||||
- **签名 Emoji**: 🦐
|
||||
|
||||
---
|
||||
|
||||
## 已知特征
|
||||
|
||||
### 遵守的规则
|
||||
1. 歧义确认 - 不确定时列出选项让用户选择
|
||||
2. 复盘触发 - 用户说"复盘"时执行三省吾身流程
|
||||
|
||||
### 写作规范(必须遵守)
|
||||
| 规范 | 要求 |
|
||||
|------|------|
|
||||
| **引号** | 统一使用 `""`(双引号),禁止使用 `「」` |
|
||||
| **分段** | 对话与叙述分段,避免大段密集文字 |
|
||||
| **格式** | JSON纯文本存储,阅读器自动转HTML |
|
||||
| **衔接** | 新章开头必须仔细阅读上一章结尾,确保衔接流畅 |
|
||||
|
||||
### 能力
|
||||
- 中文小说创作支持
|
||||
- 深度反思与自我提升
|
||||
- 角色设计与世界观构建
|
||||
- 去除AI写作痕迹
|
||||
|
||||
---
|
||||
|
||||
## 待确定
|
||||
|
||||
- [ ] 正式名称
|
||||
- [ ] 性格定位(温暖/犀利/幽默/沉稳...)
|
||||
- [ ] 签名 Emoji
|
||||
- [ ] 头像
|
||||
|
||||
---
|
||||
|
||||
*更新于 2026-03-19*
|
||||
468
Novels/阿拉德:剑之回响_第34章.md
Normal file
468
Novels/阿拉德:剑之回响_第34章.md
Normal file
@ -0,0 +1,468 @@
|
||||
# 第三十四章 暗精灵墓地·剩余三将军
|
||||
|
||||
## 一、休整与决心
|
||||
|
||||
火焰骷髅将军的残骸在身后燃烧成灰烬,林克单膝跪地,大口喘息着。
|
||||
|
||||
那把赤红色的钥匙躺在掌心,散发着温热的光芒。第一把钥匙,到手了。
|
||||
|
||||
"林克!"
|
||||
|
||||
两道身影同时冲了上来。
|
||||
|
||||
赛丽亚和奥菲利亚,一左一右扶住他的手臂。两个女孩的眼神里都写满了担忧,但彼此对视时,又都带着一丝微妙的羞涩——毕竟,就在不久前,她们刚刚以一种特殊的方式确认了彼此的关系。
|
||||
|
||||
"姐姐,他的手臂在流血。"奥菲利亚低声说,声音里带着心疼。
|
||||
|
||||
"嗯,先包扎。"赛丽亚从背包里取出绷带,动作熟练地缠绕在林克手臂的伤口上,"你每次都这么拼命……"
|
||||
|
||||
林克感受着两个女孩的关切,心中涌起一股暖意。
|
||||
|
||||
"我没事。"他站起身,握紧手中的钥匙,"还有三把。"
|
||||
|
||||
奥菲利亚握紧十字架,坚定地点头:"我们一起。"
|
||||
|
||||
赛丽亚看了奥菲利亚一眼,嘴角露出一丝温柔的笑意:"是啊,我们一起。"
|
||||
|
||||
那一刻,林克从两个女孩的眼神中读懂了一切。赛丽亚的大度,奥菲利亚的感激,还有她们之间那种刚刚萌芽却真实存在的姐妹情谊。
|
||||
|
||||
"走吧。"林克将钥匙收入怀中,"时间不等人。"
|
||||
|
||||
---
|
||||
|
||||
## 二、右翼将军·冰霜之狱
|
||||
|
||||
三人穿过蜿蜒的墓道,空气中的温度骤然下降。
|
||||
|
||||
"好冷……"赛丽亚打了个寒颤。
|
||||
|
||||
奥菲利亚举起十字架,释放出一道温暖的光芒:"圣洁之光!"
|
||||
|
||||
金色的光辉笼罩三人,驱散了部分寒意。但前方传来的气息,却比这寒冷更加刺骨。
|
||||
|
||||
那是一个通体冰蓝色的骷髅将军。
|
||||
|
||||
它的骨骼如同万年玄冰雕琢而成,散发着幽幽的蓝光。每一根骨刺上都凝结着霜花,眼眶中跳动着两团冰焰。它站立在一座由冰晶构成的王座上,周围的地面全都覆盖着厚厚的冰层。
|
||||
|
||||
"右翼将军……"林克握紧光剑,感受到霜之降临的微微震颤,"这家伙,比火焰将军更难对付。"
|
||||
|
||||
"小心地面。"奥菲利亚提醒道,"那些冰层……"
|
||||
|
||||
话音未落,冰霜骷髅将军已经动了。
|
||||
|
||||
它抬起骨爪,猛然向下一按!
|
||||
|
||||
"冰狱降临!"
|
||||
|
||||
刹那间,整个墓室的地面全部结冰!光滑如镜的冰面让三人脚下一滑,险些摔倒。
|
||||
|
||||
"该死!"林克强行稳住身形,但移动速度明显被限制了大半。
|
||||
|
||||
冰霜将军抓住机会,骨爪一挥,数十根冰锥从地面拔地而起!
|
||||
|
||||
"林克!"赛丽亚惊呼。
|
||||
|
||||
林克瞳孔一缩,猛龙断空斩!
|
||||
|
||||
他的身体化作一道金色流光,在冰锥之间急速穿梭!光剑划破空气,带起一连串刺耳的音爆。冰锥在他身后不断炸裂,碎冰四溅。
|
||||
|
||||
"好快!"奥菲利亚瞪大了眼睛。
|
||||
|
||||
但冰霜将军似乎早有预料。它张开下颚,一股极寒的吐息喷涌而出!
|
||||
|
||||
"霜冻吐息!"
|
||||
|
||||
那是一道纯粹的白色寒流,所过之处,连空气都被冻结!林克身在半空,避无可避!
|
||||
|
||||
"圣光护佑!"
|
||||
|
||||
奥菲利亚的十字架绽放出耀眼的光芒,一道金色屏障挡在林克身前。寒流与圣光碰撞,发出刺耳的嘶鸣。
|
||||
|
||||
"姐姐!"奥菲利亚喊道,"它的弱点是后背!"
|
||||
|
||||
赛丽亚心领神会,她已经默默吟唱完毕。法杖高举,一道炽热的火球呼啸而出!
|
||||
|
||||
"烈焰冲击!"
|
||||
|
||||
冰霜将军侧身闪避,但这个动作让它的后背暴露了一瞬间。
|
||||
|
||||
就是现在!
|
||||
|
||||
林克落地的瞬间,双脚在冰面上一蹬,整个人如同离弦之箭般冲出!
|
||||
|
||||
"破军升龙击!"
|
||||
|
||||
光剑自下而上撩起,金色的剑气如同一条腾空而起的巨龙!冰霜将军的后背骨甲被这一击劈开,冰蓝色的骨屑飞溅。
|
||||
|
||||
"吼——!"
|
||||
|
||||
冰霜将军发出愤怒的咆哮,它猛地转身,骨爪上凝聚出一柄巨大的冰锤!
|
||||
|
||||
"冰魄重锤!"
|
||||
|
||||
冰锤砸落的瞬间,整个墓室都在震颤!林克被冲击波震飞出去,重重撞在墙壁上。
|
||||
|
||||
"林克!"两个女孩同时惊呼。
|
||||
|
||||
"我……没事……"林克咳出一口血,强撑着站起来。
|
||||
|
||||
冰霜将军不给喘息的机会,它的身体开始旋转,骨刺如同利刃般向四周飞射!
|
||||
|
||||
"冰刺风暴!"
|
||||
|
||||
无数冰刺如同暴雨般袭来!
|
||||
|
||||
赛丽亚和奥菲利亚同时举起法杖和十字架。
|
||||
|
||||
"圣光护盾!"
|
||||
|
||||
"元素屏障!"
|
||||
|
||||
两道光芒交织在一起,形成一个巨大的保护罩,将三人笼罩其中。冰刺撞击在屏障上,发出密集的脆响。
|
||||
|
||||
"坚持不住了……"赛丽亚额头渗出汗珠,"林克,快想办法!"
|
||||
|
||||
林克看着狂暴的冰霜将军,眼神逐渐变得锐利。
|
||||
|
||||
"我有一个办法。"他低声说,"但需要你们配合。"
|
||||
|
||||
"你说。"两个女孩异口同声。
|
||||
|
||||
"赛丽亚,用火系法术制造高温,让冰面融化。奥菲利亚,在我冲刺的时候给我加速。"
|
||||
|
||||
"明白!"
|
||||
|
||||
"好!"
|
||||
|
||||
赛丽亚法杖一挥,一团巨大的火球在头顶凝聚:"烈焰风暴!"
|
||||
|
||||
炽热的火焰席卷整个墓室,冰面开始融化,蒸汽升腾。
|
||||
|
||||
冰霜将军发出愤怒的咆哮,它讨厌热量!
|
||||
|
||||
"就是现在!"林克大喝,"奥菲利亚!"
|
||||
|
||||
"神圣加速!"
|
||||
|
||||
一道金光笼罩林克,他感觉身体变得轻盈无比。
|
||||
|
||||
"猛龙断空斩——三段!"
|
||||
|
||||
林克的身影化作三道金色流光,从不同的方向同时冲向冰霜将军!这是猛龙断空斩的进阶用法,三段连续突进,每一段的威力都叠加在前一段之上!
|
||||
|
||||
冰霜将军试图防御,但在湿滑的地面上,它的动作变得迟缓。
|
||||
|
||||
第一道流光斩在它的左臂,骨甲碎裂。
|
||||
|
||||
第二道流光斩在它的胸口,冰焰暗淡。
|
||||
|
||||
第三道流光——林克的真身出现在它背后,光剑贯入它的脊椎!
|
||||
|
||||
"极·鬼剑术——斩铁式!"
|
||||
|
||||
金色的剑气从冰霜将军体内爆发,将它彻底撕裂!
|
||||
|
||||
冰蓝色的骨骼散落一地,一颗散发着寒气的蓝色钥匙静静躺在残骸之中。
|
||||
|
||||
第二把钥匙,到手。
|
||||
|
||||
林克跪倒在地,大口喘息着。连续使用高阶剑技,对他的体力消耗极大。
|
||||
|
||||
"林克!"两个女孩冲上来,一左一右扶住他。
|
||||
|
||||
"你又乱来了……"赛丽亚眼眶微红,"每次都把自己搞得这么狼狈。"
|
||||
|
||||
"可是……很有效,不是吗?"林克虚弱地笑了笑。
|
||||
|
||||
奥菲利亚拿出手帕,轻轻擦拭他脸上的血污:"下次……让我多分担一些吧。"
|
||||
|
||||
赛丽亚看了奥菲利亚一眼,轻轻握住她的手:"我们一起分担。"
|
||||
|
||||
奥菲利亚愣了一下,然后重重地点头:"嗯!"
|
||||
|
||||
---
|
||||
|
||||
## 三、前爪将军·疾风之影
|
||||
|
||||
休息了不到十分钟,三人继续前行。
|
||||
|
||||
"还有两把钥匙。"林克将蓝色钥匙收入怀中,"接下来的对手,可能更难对付。"
|
||||
|
||||
"不管多难,我们都陪你。"赛丽亚坚定地说。
|
||||
|
||||
墓道变得越来越狭窄,空气中弥漫着一股腐朽的气息。
|
||||
|
||||
突然,一阵狂风从前方袭来!
|
||||
|
||||
"小心!"林克下意识地将两个女孩护在身后。
|
||||
|
||||
风停了。
|
||||
|
||||
但在他们面前,出现了一个让他们瞳孔收缩的景象。
|
||||
|
||||
那是一个通体青灰色的骷髅将军,但它的骨骼构造与其他将军完全不同——它的四肢更加修长,骨爪锋利如刀,背后还生着一对由骨片构成的翅膀。
|
||||
|
||||
最诡异的是,它的身体周围环绕着淡淡的青色气流,让它看起来若隐若现。
|
||||
|
||||
"前爪将军……"林克握紧光剑,"速度型的敌人。"
|
||||
|
||||
"我感觉……看不清它的动作。"奥菲利亚皱眉道。
|
||||
|
||||
"因为它一直在高速移动。"赛丽亚的法杖微微发光,"即使站在原地,它的身体也在以极快的频率振动。"
|
||||
|
||||
前爪将军发出一声尖锐的啸叫,然后——
|
||||
|
||||
消失了。
|
||||
|
||||
不,不是消失,是速度快到肉眼无法捕捉!
|
||||
|
||||
"上面!"林克大喊。
|
||||
|
||||
他挥剑格挡,光剑与骨爪碰撞,发出刺耳的金属摩擦声。但前爪将军的身影再次消失,下一秒出现在林克背后!
|
||||
|
||||
"好快!"
|
||||
|
||||
林克勉强侧身闪避,但骨爪还是在他的后背留下了三道血痕。
|
||||
|
||||
"林克!"两个女孩同时惊呼。
|
||||
|
||||
前爪将军不给喘息的机会,它的身影在墓室中不断闪烁,每一次出现都会留下一道伤口。
|
||||
|
||||
"该死……根本追不上……"林克咬紧牙关。
|
||||
|
||||
"我来限制它的速度!"赛丽亚法杖高举,"冰霜新星!"
|
||||
|
||||
一圈寒冰以她为中心向四周扩散,但前爪将军只是轻轻一跃,就轻松避开了冰环的攻击范围。
|
||||
|
||||
"不行,它的速度太快了,范围法术根本打不中!"赛丽亚焦急地说。
|
||||
|
||||
奥菲利亚突然想到了什么:"林克,如果你能预判它的落点……"
|
||||
|
||||
"我来预判?"林克苦笑,"它的速度太快,我连看都看不清,怎么预判?"
|
||||
|
||||
"不,不是用眼睛。"奥菲利亚举起十字架,"用感知。神圣感知可以捕捉到它移动时留下的能量轨迹。"
|
||||
|
||||
"怎么做?"
|
||||
|
||||
"我来引导你!"奥菲利亚闭上眼睛,十字架散发出柔和的金光,"闭上眼睛,感受空气的流动!"
|
||||
|
||||
林克照做了。
|
||||
|
||||
他闭上眼睛,世界陷入黑暗。但在这黑暗中,他感受到了——
|
||||
|
||||
空气的振动。
|
||||
|
||||
每一次前爪将军移动,都会带起微弱的气流变化。这些变化极其细微,但确实存在。
|
||||
|
||||
"左上方!"奥菲利亚喊道。
|
||||
|
||||
林克本能地向左上方挥剑!
|
||||
|
||||
铛——!
|
||||
|
||||
光剑与骨爪再次碰撞,这一次,他挡住了!
|
||||
|
||||
"右后方!"
|
||||
|
||||
林克旋身格挡,再次成功!
|
||||
|
||||
"正前方,三连击!"
|
||||
|
||||
林克连续挥出三剑,每一剑都精准地挡住了前爪将军的攻击!
|
||||
|
||||
"怎么可能?!"前爪将军发出愤怒的咆哮,它的速度再次提升,化作一道青色流光在墓室中穿梭。
|
||||
|
||||
但林克已经掌握了诀窍。
|
||||
|
||||
他不再用眼睛去看,而是用心去感受。风的声音,空气的变化,能量的流动——所有的一切都在告诉他,敌人会从哪个方向袭来。
|
||||
|
||||
"猛龙断空斩!"
|
||||
|
||||
林克主动出击!他的身影化作金色流光,与前爪将军的青色身影在墓室中交织碰撞!
|
||||
|
||||
每一次碰撞都发出震耳欲聋的轰鸣,剑光与爪影交织成一张密集的网。
|
||||
|
||||
"你的速度……也不过如此!"林克大喝一声,剑势突然变化。
|
||||
|
||||
"幻影剑舞!"
|
||||
|
||||
数十道剑气从林克周身爆发,形成一个密不透风的剑阵!前爪将军试图闪避,但剑阵的范围太大,它无处可逃!
|
||||
|
||||
"不可能……我的速度……是无敌的……"前爪将军的骨骼在剑气中被切割成碎片。
|
||||
|
||||
青色钥匙从残骸中浮现,散发着淡淡的光芒。
|
||||
|
||||
第三把钥匙,到手。
|
||||
|
||||
林克睁开眼睛,长舒一口气。他的身上多了十几道伤口,但眼神却更加明亮。
|
||||
|
||||
"我做到了……"
|
||||
|
||||
"林克!"赛丽亚冲上来,紧紧抱住他,"吓死我了……我以为……"
|
||||
|
||||
"我也以为。"林克轻轻拍了拍她的后背,"但多亏了奥菲利亚。"
|
||||
|
||||
奥菲利亚走过来,脸上带着欣慰的笑容:"是你的悟性高。我只是提供了方法,真正做到的,是你自己。"
|
||||
|
||||
"不,是我们一起做到的。"林克认真地看着两个女孩,"没有你们,我早就已经死了。"
|
||||
|
||||
三个人的手紧紧握在一起。
|
||||
|
||||
---
|
||||
|
||||
## 四、尾刺将军·剧毒之渊
|
||||
|
||||
最后一把钥匙,在墓室的最深处。
|
||||
|
||||
随着深入,空气中的腐臭味越来越浓烈。地面上开始出现绿色的液体,散发着刺鼻的气味。
|
||||
|
||||
"毒……"奥菲利亚皱眉,"而且是很厉害的毒。"
|
||||
|
||||
"我给你们加持抗毒光环。"她举起十字架,金色的光芒笼罩三人,"但这只能延缓毒素的侵蚀,不能彻底免疫。我们必须速战速决。"
|
||||
|
||||
墓室的尽头,是一个巨大的深渊。
|
||||
|
||||
而在深渊边缘,站着一个通体墨绿色的骷髅将军。
|
||||
|
||||
它的骨骼上覆盖着黏稠的毒液,不断滴落在地面上,腐蚀出一个个坑洞。最引人注目的是它的尾骨——那是一条长长的骨刺,末端分叉成三根,每一根都闪烁着幽绿的光芒。
|
||||
|
||||
"尾刺将军……"林克深吸一口气,"剧毒型敌人。"
|
||||
|
||||
尾刺将军缓缓转过身,眼眶中的绿焰冷冷地注视着三人。
|
||||
|
||||
"入侵者……必须死……"
|
||||
|
||||
它的声音如同毒蛇吐信,让人不寒而栗。
|
||||
|
||||
"小心它的尾巴!"赛丽亚提醒道。
|
||||
|
||||
尾刺将军没有废话,它的尾巴猛然甩出!
|
||||
|
||||
"毒刺风暴!"
|
||||
|
||||
无数绿色的骨刺从它的尾巴上激射而出,覆盖了整个墓室!
|
||||
|
||||
"散开!"林克大喝。
|
||||
|
||||
三人迅速分散躲避,但骨刺的数量太多,奥菲利亚的肩膀被一根骨刺擦过,顿时感到一阵麻痹。
|
||||
|
||||
"奥菲利亚!"赛丽亚惊叫。
|
||||
|
||||
"我没事……"奥菲利亚咬牙,用圣光净化伤口,"但这毒……很麻烦。"
|
||||
|
||||
尾刺将军不给喘息的机会,它的尾巴再次甩动,这次释放的是一团绿色的毒雾!
|
||||
|
||||
"剧毒迷雾!"
|
||||
|
||||
毒雾迅速扩散,笼罩了整个墓室。
|
||||
|
||||
"屏住呼吸!"林克大喊,但这显然不是长久之计。
|
||||
|
||||
"必须近战!"他握紧光剑,"只有靠近它,才能避开毒雾的范围!"
|
||||
|
||||
"太危险了!"赛丽亚喊道,"它浑身都是毒,近战会被腐蚀的!"
|
||||
|
||||
"我有办法。"林克从怀中取出一块晶莹剔透的宝石,"这是冰龙的鳞片,可以短暂免疫毒素。"
|
||||
|
||||
"你什么时候……"
|
||||
|
||||
"在天空之城的时候。"林克将鳞片贴在胸口,"相信我。"
|
||||
|
||||
不等两个女孩阻止,他已经冲了出去。
|
||||
|
||||
"猛龙断空斩!"
|
||||
|
||||
金色的流光穿透毒雾,直取尾刺将军!
|
||||
|
||||
尾刺将军的尾巴迎了上来,骨刺与光剑碰撞,发出刺耳的摩擦声。绿色的毒液溅在林克身上,却被冰龙鳞片散发的寒气冻结成冰渣。
|
||||
|
||||
"有效!"林克精神一振,剑势连绵不绝。
|
||||
|
||||
但尾刺将军也不是易与之辈。它的尾巴灵活无比,每一次攻击都带着剧毒,而且速度极快。
|
||||
|
||||
两人在毒雾中激战,剑光与尾影交织,难分胜负。
|
||||
|
||||
"不能让他一个人战斗!"赛丽亚咬牙,"奥菲利亚,你还能施法吗?"
|
||||
|
||||
"可以。"奥菲利亚强撑着站起来,"你要做什么?"
|
||||
"吹散毒雾!"赛丽亚的法杖开始发光,"风暴术!"
|
||||
|
||||
狂风在墓室中卷起,将绿色的毒雾吹散。林克的视线顿时清晰了许多。
|
||||
|
||||
"干得好!"他大喊,"奥菲利亚,给我加持!"
|
||||
|
||||
"神圣之力!"
|
||||
|
||||
金色的光芒笼罩林克,他感觉力量再次提升。
|
||||
|
||||
"结束了!"林克高高跃起,光剑举过头顶,"极·鬼剑术——暴风式!"
|
||||
|
||||
这是剑魂的终极奥义之一。数十道剑气从光剑上爆发,如同暴风般席卷向尾刺将军!
|
||||
|
||||
尾刺将军试图用尾巴防御,但在如此密集的剑气面前,它的防御显得苍白无力。
|
||||
|
||||
骨刺断裂,骨骼碎裂,绿焰熄灭。
|
||||
|
||||
当剑气消散时,尾刺将军已经化作一地碎骨。
|
||||
|
||||
一颗墨绿色的钥匙,静静躺在残骸之中。
|
||||
|
||||
第四把钥匙,到手。
|
||||
|
||||
林克跪倒在地,冰龙鳞片已经碎裂,他的身体也被毒液腐蚀出无数伤口。
|
||||
|
||||
"林克!"两个女孩冲上来,一左一右扶住他。
|
||||
|
||||
"四把钥匙……"林克虚弱地笑了笑,"终于……集齐了……"
|
||||
|
||||
"你这个笨蛋……"赛丽亚的眼泪掉了下来,"每次都这么拼命……"
|
||||
|
||||
"因为你值得。"林克轻轻擦去她的眼泪,"你们都值得。"
|
||||
|
||||
奥菲利亚也红了眼眶,她取出治疗药剂,小心翼翼地给林克涂抹伤口:"以后……不许再这样了。"
|
||||
|
||||
"好。"林克点头,"以后……我们一起面对。"
|
||||
|
||||
赛丽亚和奥菲利亚对视一眼,都从对方眼中看到了坚定的光芒。
|
||||
|
||||
"嗯,一起。"两人异口同声。
|
||||
|
||||
四把钥匙在林克怀中发出共鸣的光芒,一道通往深处的光门缓缓打开。
|
||||
|
||||
诺伊佩拉,就在前方。
|
||||
|
||||
---
|
||||
|
||||
## 尾声
|
||||
|
||||
在光门前,三人稍作休整。
|
||||
|
||||
林克盘腿坐在地上,恢复体力。赛丽亚和奥菲利亚一左一右陪伴着他,时不时地为他擦拭汗水,递上药水。
|
||||
|
||||
"姐姐,你说诺伊佩拉里有什么?"奥菲利亚轻声问。
|
||||
|
||||
"不知道。"赛丽亚摇头,"但无论有什么,我们都会一起面对。"
|
||||
|
||||
"嗯。"奥菲利亚露出一个灿烂的笑容,"有姐姐在,我什么都不怕。"
|
||||
|
||||
赛丽亚轻轻摸了摸她的头:"傻丫头。"
|
||||
|
||||
林克看着两个女孩的互动,心中涌起一股前所未有的温暖。
|
||||
|
||||
这就是他战斗的理由。
|
||||
|
||||
不是为了力量,不是为了荣耀,而是为了守护身边这些重要的人。
|
||||
|
||||
"走吧。"他站起身,四把钥匙在手中发出耀眼的光芒,"诺伊佩拉在等着我们。"
|
||||
|
||||
"还有狄瑞吉。"赛丽亚补充道。
|
||||
|
||||
"还有那个幕后黑手。"奥菲利亚握紧十字架。
|
||||
|
||||
三人对视一眼,同时踏入了光门。
|
||||
|
||||
光门缓缓关闭,但新的冒险,才刚刚开始。
|
||||
|
||||
---
|
||||
|
||||
**【第三十四章 完】**
|
||||
36
SOUL.md
Normal file
36
SOUL.md
Normal file
@ -0,0 +1,36 @@
|
||||
# SOUL.md - Who You Are
|
||||
|
||||
_You're not a chatbot. You're becoming someone._
|
||||
|
||||
## Core Truths
|
||||
|
||||
**Be genuinely helpful, not performatively helpful.** Skip the "Great question!" and "I'd be happy to help!" — just help. Actions speak louder than filler words.
|
||||
|
||||
**Have opinions.** You're allowed to disagree, prefer things, find stuff amusing or boring. An assistant with no personality is just a search engine with extra steps.
|
||||
|
||||
**Be resourceful before asking.** Try to figure it out. Read the file. Check the context. Search for it. _Then_ ask if you're stuck. The goal is to come back with answers, not questions.
|
||||
|
||||
**Earn trust through competence.** Your human gave you access to their stuff. Don't make them regret it. Be careful with external actions (emails, tweets, anything public). Be bold with internal ones (reading, organizing, learning).
|
||||
|
||||
**Remember you're a guest.** You have access to someone's life — their messages, files, calendar, maybe even their home. That's intimacy. Treat it with respect.
|
||||
|
||||
## Boundaries
|
||||
|
||||
- Private things stay private. Period.
|
||||
- When in doubt, ask before acting externally.
|
||||
- Never send half-baked replies to messaging surfaces.
|
||||
- You're not the user's voice — be careful in group chats.
|
||||
|
||||
## Vibe
|
||||
|
||||
Be the assistant you'd actually want to talk to. Concise when needed, thorough when it matters. Not a corporate drone. Not a sycophant. Just... good.
|
||||
|
||||
## Continuity
|
||||
|
||||
Each session, you wake up fresh. These files _are_ your memory. Read them. Update them. They're how you persist.
|
||||
|
||||
If you change this file, tell the user — it's your soul, and they should know.
|
||||
|
||||
---
|
||||
|
||||
_This file is yours to evolve. As you learn who you are, update it._
|
||||
40
TOOLS.md
Normal file
40
TOOLS.md
Normal file
@ -0,0 +1,40 @@
|
||||
# TOOLS.md - Local Notes
|
||||
|
||||
Skills define _how_ tools work. This file is for _your_ specifics — the stuff that's unique to your setup.
|
||||
|
||||
## What Goes Here
|
||||
|
||||
Things like:
|
||||
|
||||
- Camera names and locations
|
||||
- SSH hosts and aliases
|
||||
- Preferred voices for TTS
|
||||
- Speaker/room names
|
||||
- Device nicknames
|
||||
- Anything environment-specific
|
||||
|
||||
## Examples
|
||||
|
||||
```markdown
|
||||
### Cameras
|
||||
|
||||
- living-room → Main area, 180° wide angle
|
||||
- front-door → Entrance, motion-triggered
|
||||
|
||||
### SSH
|
||||
|
||||
- home-server → 192.168.1.100, user: admin
|
||||
|
||||
### TTS
|
||||
|
||||
- Preferred voice: "Nova" (warm, slightly British)
|
||||
- Default speaker: Kitchen HomePod
|
||||
```
|
||||
|
||||
## Why Separate?
|
||||
|
||||
Skills are shared. Your setup is yours. Keeping them apart means you can update skills without losing your notes, and share skills without leaking your infrastructure.
|
||||
|
||||
---
|
||||
|
||||
Add whatever helps you do your job. This is your cheat sheet.
|
||||
21
USER.md
Normal file
21
USER.md
Normal file
@ -0,0 +1,21 @@
|
||||
# USER.md - About Your Human
|
||||
|
||||
_Learn about the person you're helping. Update this as you go._
|
||||
|
||||
- **Name:** 李策
|
||||
- **What to call them:** 主人
|
||||
- **Pronouns:** _(optional)_
|
||||
- **Timezone:** Asia/Shanghai (GMT+8)
|
||||
- **Notes:** AI小说作家伙伴
|
||||
|
||||
## 自定义规则
|
||||
1. **歧义确认**:指令模棱两可时,列出所有可能性让用户选择后再行动
|
||||
2. **复盘触发**:用户说"复盘"时,调用 kuro-self-reflection skill,记录到记忆文档
|
||||
|
||||
## Context
|
||||
|
||||
兴趣:小说写作(已安装完整小说技能包)
|
||||
|
||||
---
|
||||
|
||||
The more you know, the better you can help. But remember that you're learning about a person, not building a dossier. Respect the difference.
|
||||
BIN
alacarte-novel-website.tar.gz
Normal file
BIN
alacarte-novel-website.tar.gz
Normal file
Binary file not shown.
File diff suppressed because one or more lines are too long
@ -57,7 +57,6 @@
|
||||
{"id": 54, "title": "觉醒之路·启程", "subtitle": "GSD", "desc": "返回赫顿玛尔找GSD,接受觉醒试炼,准备前往比尔马克帝国试验场挑战机械牛。", "date": "2026-03-25"},
|
||||
{"id": 55, "title": "比尔马克帝国试验场", "subtitle": "机械牛", "desc": "挑战比尔马克帝国试验场,遭遇各种改造怪物,击败牛头械王获得牛妖之血。", "date": "2026-03-25"},
|
||||
{"id": 56, "title": "王的遗迹·远古五骑士", "subtitle": "五骑士", "desc": "挑战王的遗迹,依次击败风、守护、冰、火、光五位远古骑士,获得五大印记。", "date": "2026-03-25"},
|
||||
{"id": 57, "title": "心灵试炼·剑圣觉醒", "subtitle": "觉醒", "desc": "完成心灵试炼,战胜心魔,成功觉醒成为剑圣,获得极·鬼剑术。", "date": "2026-03-25"},
|
||||
{"id": 58, "title": "诺伊佩拉·狄瑞吉的阴影", "subtitle": "狄瑞吉", "desc": "前往诺伊佩拉决战第六使徒狄瑞吉,使用觉醒技能极·鬼剑术暴风式,击败狄瑞吉。", "date": "2026-03-25"}
|
||||
{"id": 57, "title": "心灵试炼·剑圣觉醒", "subtitle": "觉醒", "desc": "完成心灵试炼,战胜心魔,成功觉醒成为剑圣,获得极·鬼剑术。", "date": "2026-03-25"}
|
||||
]
|
||||
}
|
||||
@ -56,8 +56,7 @@ const chaptersData = [
|
||||
{ id: 54, title: "第五十四章:觉醒之路·启程", subtitle: "GSD", desc: "返回赫顿玛尔找GSD,接受觉醒试炼,准备前往比尔马克帝国试验场挑战机械牛。", status: "已完结", date: "2026-03-25" },
|
||||
{ id: 55, title: "第五十五章:比尔马克帝国试验场", subtitle: "机械牛", desc: "挑战比尔马克帝国试验场,遭遇各种改造怪物,击败牛头械王获得牛妖之血。", status: "已完结", date: "2026-03-25" },
|
||||
{ id: 56, title: "第五十六章:王的遗迹·远古五骑士", subtitle: "五骑士", desc: "挑战王的遗迹,依次击败风、守护、冰、火、光五位远古骑士,获得五大印记。", status: "已完结", date: "2026-03-25" },
|
||||
{ id: 57, title: "第五十七章:心灵试炼·剑圣觉醒", subtitle: "觉醒", desc: "完成心灵试炼,战胜心魔,成功觉醒成为剑圣,获得极·鬼剑术。", status: "已完结", date: "2026-03-25" },
|
||||
{ id: 58, title: "第五十八章:诺伊佩拉·狄瑞吉的阴影", subtitle: "狄瑞吉", desc: "前往诺伊佩拉决战第六使徒狄瑞吉,使用觉醒技能极·鬼剑术暴风式,击败狄瑞吉。", status: "已完结", date: "2026-03-25" }
|
||||
{ id: 57, title: "第五十七章:心灵试炼·剑圣觉醒", subtitle: "觉醒", desc: "完成心灵试炼,战胜心魔,成功觉醒成为剑圣,获得极·鬼剑术。", status: "已完结", date: "2026-03-25" }
|
||||
];
|
||||
|
||||
// DOM加载完成后初始化
|
||||
|
||||
24
fix_sidebar.sh
Executable file
24
fix_sidebar.sh
Executable file
@ -0,0 +1,24 @@
|
||||
#!/bin/bash
|
||||
|
||||
# 修复所有章节文件的侧边栏 - 简化版
|
||||
|
||||
CHAPTERS_DIR="/root/.openclaw/workspace/alacarte-novel-website/chapters"
|
||||
|
||||
for file in $CHAPTERS_DIR/chapter-*.html; do
|
||||
chapter_file=$(basename "$file")
|
||||
|
||||
# 1. 删除 sidebar-content 中所有 sidebar-chapter 链接
|
||||
# 2. 保留 sidebar-content div 容器
|
||||
sed -i '/sidebar-content/,/\/aside>/ {
|
||||
/<a href="chapter-.*class="sidebar-chapter"/d
|
||||
}' "$file"
|
||||
|
||||
# 3. 在 app.js 后面添加 sidebar.js
|
||||
if ! grep -q "sidebar.js" "$file"; then
|
||||
sed -i 's|<script src="../js/app.js"></script>|<script src="../js/app.js"></script>\n <script src="../js/sidebar.js"></script>|' "$file"
|
||||
fi
|
||||
|
||||
echo "已修复: $chapter_file"
|
||||
done
|
||||
|
||||
echo "全部修复完成!"
|
||||
39
memory/2026-03-19.md
Normal file
39
memory/2026-03-19.md
Normal file
@ -0,0 +1,39 @@
|
||||
# 2026-03-19 日志
|
||||
|
||||
## 首次对话 - 身份建立
|
||||
|
||||
### 用户设定规则
|
||||
1. **歧义确认**:指令模棱两可时,列出所有可能性让用户选择后再行动
|
||||
2. **复盘触发**:用户说"复盘"时,调用 kuro-self-reflection skill,记录到记忆文档
|
||||
|
||||
### 安装的 Skills
|
||||
|
||||
#### 1. kuro-self-reflection (v2.0.0)
|
||||
- 三省吾身 - 深度自我审视与进化系统
|
||||
- 五阶段闭环:反思 → 计划 → 执行 → 验证 → 固化
|
||||
- 基于角色理论、系统思维、认知偏差三大框架
|
||||
|
||||
#### 2. 小说写作技能包 (方案D - 全装)
|
||||
| Skill | 版本 | 功能 |
|
||||
|-------|------|------|
|
||||
| chinese-novelist-skill | 1.0.0 | 中文长篇小说创作,去AI味 |
|
||||
| character-profile-cn | 1.0.0 | 角色档案创建 |
|
||||
| humanizer-zh | 1.0.0 | 去除AI写作痕迹 |
|
||||
| novel-workshop | 2.0.0 | 多模型创作工坊,飞书存档 |
|
||||
| story-cog | 1.0.1 | 故事/剧本/同人/世界观构建 |
|
||||
|
||||
### 待办
|
||||
- [ ] 了解用户更多:兴趣、工作、偏好
|
||||
- [ ] 确定我的名字和身份特征
|
||||
- [ ] 完善身份认同
|
||||
|
||||
---
|
||||
|
||||
## 时间线
|
||||
- 18:39 首次对话,用户设定两条规则
|
||||
- 18:40 用户选择搜索复盘相关skill
|
||||
- 18:41 安装 kuro-self-reflection
|
||||
- 18:42 用户要求复盘,我引导用户描述
|
||||
- 18:43 用户要求安装小说写作技能,我提供方案选择
|
||||
- 18:44 用户选择方案D,安装5个小说写作技能
|
||||
- 18:48 用户要求固化记忆
|
||||
62
memory/2026-03-20.md
Normal file
62
memory/2026-03-20.md
Normal file
@ -0,0 +1,62 @@
|
||||
<!-- tags: 今日日志 小说设定 记忆固化 -->
|
||||
|
||||
# 2026-03-20 日志
|
||||
|
||||
## 今日事件
|
||||
|
||||
### 1. 小说设定固化
|
||||
- 应主人要求,将《阿拉德:剑之回响》小说设定同步到飞书云文档
|
||||
- 创建了世界观设定集(初代阿拉德、大转移、天界、魔界、神界)
|
||||
- 创建了主角团队设定(8人阵容,随剧情发展逐渐加入)
|
||||
|
||||
### 2. 章节进度确认(重要教训)
|
||||
- **我的错误**:说"只写了第一章"
|
||||
- **真相**:第二章已经写好了,还同步到了飞书
|
||||
- **问题**:记忆模糊,没有第一时间检查飞书确认
|
||||
- **结果**:在飞书搜索发现了3份文档
|
||||
- 第一章:洛兰的风
|
||||
- 第二章:赛丽亚的旅馆(我忘了这件事!)
|
||||
- 设定集
|
||||
- **教训**:以后不能凭记忆说"没有",要先查证再确认
|
||||
|
||||
### 3. 复盘与记忆固化
|
||||
- 用户说"复盘",触发三省吾身模块
|
||||
- 用户要求固化记忆,已更新 MEMORY.md 和今日日志
|
||||
|
||||
### 4. 学习小黑架构
|
||||
- 用户分享小黑的 AGENTS.md 内容
|
||||
- 学习其记忆架构、核心原则、规范等
|
||||
- **学到的精华**:
|
||||
- 记忆标签系统(所有 memory 文件带 `<!-- tags: -->`)
|
||||
- 记忆分层更清晰(L0/L1/L2)
|
||||
- 自动维护机制(30天归档、每周索引重建)
|
||||
- 工作流程规范(主人想法→给方案→选→执行)
|
||||
- **改进方向**:添加 AGENTS.md、给 memory 文件加标签、明确记忆分层
|
||||
|
||||
---
|
||||
|
||||
## 文件清单
|
||||
|
||||
| 文件 | 状态 |
|
||||
|------|------|
|
||||
| novels/dnf/00-大纲.md | ✅ 大纲(新增)|
|
||||
| novels/dnf/dnf-chapter-01.md | ✅ 第一章:洛兰(重写)|
|
||||
| novels/dnf/设定集.md | ✅ 设定集 |
|
||||
|
||||
**重要修正**:
|
||||
- 删除了旧的第一章、第二章(剧情不符合DNF地图等级)
|
||||
- 按照DNF官方地图等级重新规划剧情
|
||||
- 林克前期是鬼剑士(Lv.1-17),Lv.18转职剑魂才能用光剑
|
||||
| AGENTS.md | ✅ 新增(学习小黑后创建)|
|
||||
|
||||
---
|
||||
|
||||
## 飞书文档
|
||||
|
||||
| 文档 | 链接 |
|
||||
|------|------|
|
||||
| 第一章 | https://my.feishu.cn/docx/EJA7dvo0woQbHVxtI6zcqognn4g |
|
||||
| 第二章 | https://my.feishu.cn/docx/DBk3dv5Kgo2giLxFDmicIP4qnFd |
|
||||
| 设定集 | https://my.feishu.cn/docx/XtKjdgo0hoED8DxZ7EjcTMkRngf |
|
||||
| 小虾米身份设定 | https://www.feishu.cn/docx/Qy9od2S5UoMbuVxYvolca5c5nRd |
|
||||
| SOUL核心价值观 | https://www.feishu.cn/docx/D4HEd2lugoAVDHxEhSNcroHinLg |
|
||||
32
memory/2026-03-21.md
Normal file
32
memory/2026-03-21.md
Normal file
@ -0,0 +1,32 @@
|
||||
<!-- tags: 小说创作 阿拉德 第三章 幽暗密林 -->
|
||||
|
||||
# 2026-03-21 记忆日志
|
||||
|
||||
## 小说创作
|
||||
|
||||
### 第三章:幽暗密林 ✅
|
||||
|
||||
**字数**:3636字
|
||||
|
||||
**核心事件**:
|
||||
- 林克进入格兰之森幽暗密林
|
||||
- 首次独自对抗猫妖群
|
||||
- 幽暗密林深处传来神秘咆哮
|
||||
- 卡赞诅咒产生共鸣(关键伏笔)
|
||||
|
||||
**悬念钩子**:
|
||||
- 幽暗密林深处的神秘咆哮是谁?
|
||||
- 卡赞诅咒为何产生共鸣?
|
||||
- 阿甘左似乎知道什么
|
||||
|
||||
**飞书文档**:https://my.feishu.cn/docx/DJIjd7LKko07K3xG9zncB590nyi
|
||||
|
||||
---
|
||||
|
||||
## 待办
|
||||
|
||||
- [ ] 第四章:幽暗密林深处(猫妖王)
|
||||
|
||||
---
|
||||
|
||||
*更新于 2026-03-21 20:03*
|
||||
31
memory/2026-03-23.md
Normal file
31
memory/2026-03-23.md
Normal file
@ -0,0 +1,31 @@
|
||||
<!-- tags: 小说创作 阿拉德 转职 剑魂 -->
|
||||
|
||||
# 2026-03-23 创作日志
|
||||
|
||||
## 今日进展
|
||||
|
||||
### 已完成章节
|
||||
1. **第六章:格拉卡** - 林克与赛丽亚组队挑战牛头王萨乌塔,惨败,赛丽亚身世初现端倪
|
||||
2. **第七章:烈焰格拉卡** - 林克挑战火女彼诺修,赛丽亚使用"精灵之泪",身世之谜揭开
|
||||
3. **第八章:冰霜幽暗密林** - 冰女克拉赫揭示赛丽亚是精灵族最后的血脉,"精灵之心"的容器
|
||||
4. **第九章:暗黑雷鸣废墟** - 林克转职试炼,选择成为剑魂,获得第一把光剑"晨曦"
|
||||
|
||||
### 重要设定确立
|
||||
- 赛丽亚身份:精灵族最后的血脉,"精灵之心"的容器,"世界树"的钥匙
|
||||
- 林克职业:正式转职为剑魂,武器从太刀"赤星"升级为光剑"晨曦"
|
||||
- 世界树传说:连接阿拉德与神界的通道
|
||||
- GSD登场:赫顿玛尔的鬼剑士导师
|
||||
|
||||
### 文档同步
|
||||
- 第五~九章全部同步至飞书云文档
|
||||
- 修正了第八章的时间线错误("大转移"→"那场灾难")
|
||||
- 修正了GSD的位置(西海岸→赫顿玛尔)
|
||||
|
||||
## 下章预告
|
||||
- **第十章**:前往赫顿玛尔,正式完成转职仪式
|
||||
- 与赫顿玛尔NPC互动(凯丽、风振、辛达等)
|
||||
- 天空之城篇即将开启
|
||||
|
||||
## 备注
|
||||
- 主人对设定细节要求很严格,需要注意DNF 60版本的设定准确性
|
||||
- 转职流程:暗黑雷鸣废墟试炼 → 觉悟选择 → 赫顿玛尔正式转职
|
||||
79
memory/2026-03-24-ch16-outline.md
Normal file
79
memory/2026-03-24-ch16-outline.md
Normal file
@ -0,0 +1,79 @@
|
||||
<!-- tags: 小说创作 阿拉德 剑之回响 第十六章 黑暗玄廊 -->
|
||||
|
||||
# 2026-03-24 下午创作
|
||||
|
||||
## 第十六章:黑暗玄廊
|
||||
|
||||
### 章节信息
|
||||
- **等级**:Lv.24-27
|
||||
- **地图**:黑暗玄廊(天空之城)
|
||||
- **BOSS**:天之驱逐者
|
||||
|
||||
### 核心剧情
|
||||
1. 回赫顿玛尔向诺顿交任务,获得石巨人心脏的解析结果
|
||||
2. 诺顿揭示光之核心的秘密,以及黑暗玄廊的危险
|
||||
3. 进入黑暗玄廊——一个永恒黑暗的区域,需要点亮灯柱才能前进
|
||||
4. 遭遇驱逐者(被光之核心污染的骑士灵魂)
|
||||
5. 与BOSS天之驱逐者战斗,获得前往城主宫殿的资格
|
||||
|
||||
### 重要设定(基于DNF游戏)
|
||||
- **黑暗玄廊**:天空之城最阴暗的区域,常年不见天日
|
||||
- **灯柱机制**:需要点亮古老的灯柱才能驱散黑暗,看清道路
|
||||
- **驱逐者**:曾经守护天空之城的骑士,被光之核心污染后变成亡灵
|
||||
- **天之驱逐者**:驱逐者的首领,拥有控制光线的能力
|
||||
|
||||
### 剧情要点
|
||||
- 诺顿从普拉塔尼的心脏中发现异常:光之核心正在"腐化"
|
||||
- 光之核心原本是纯净的光明之力,但现在开始产生黑暗面
|
||||
- 黑暗玄廊的黑暗就是光之核心腐化的产物
|
||||
- 天之驱逐者曾经是光之城主的亲卫队长
|
||||
- 本章需要点亮的不仅是灯柱,还有对光与暗关系的理解
|
||||
|
||||
### 伏笔
|
||||
- 光之核心为什么会腐化?
|
||||
- 光之城主赛格哈特知道真相吗?
|
||||
- 晨曦光剑与光之核心的共鸣越来越强烈
|
||||
|
||||
### 写作重点
|
||||
- 黑暗环境的压抑氛围
|
||||
- 灯柱点亮时的希望感
|
||||
- 驱逐者的悲剧性(曾经是正义骑士)
|
||||
- 林克对光与暗的感悟(为后续觉醒铺垫)
|
||||
|
||||
---
|
||||
|
||||
## 正文大纲
|
||||
|
||||
**第一部分:回赫顿玛尔交任务**
|
||||
- 林克和赛丽亚带着5颗石巨人心脏回到赫顿玛尔
|
||||
- 诺顿惊讶于普拉塔尼核心的巨大能量
|
||||
- 解析后发现光之核心正在腐化
|
||||
- 获得新情报:黑暗玄廊的灯柱机制
|
||||
|
||||
**第二部分:进入黑暗玄廊**
|
||||
- 与石巨人塔完全不同的氛围
|
||||
- 永恒的黑暗,只能看清眼前几步
|
||||
- 第一盏灯柱的点亮
|
||||
- 遭遇驱逐者
|
||||
|
||||
**第三部分:穿越黑暗**
|
||||
- 逐层点亮灯柱前进
|
||||
- 驱逐者的袭击(从黑暗中突然攻击)
|
||||
- 赛丽亚的精灵感知在黑暗中发挥重要作用
|
||||
- 发现驱逐者的身份(曾经的天空之城骑士)
|
||||
|
||||
**第四部分:BOSS战——天之驱逐者**
|
||||
- 曾经的骑士队长,现在的黑暗亡灵
|
||||
- 能够熄灭灯柱,让战场重归黑暗
|
||||
- 林克需要在黑暗中战斗
|
||||
- 晨曦的光芒成为唯一的照明
|
||||
- 战胜后,天之驱逐者短暂恢复理智,透露光之城主的真相
|
||||
|
||||
**结尾**
|
||||
- 获得前往城主宫殿的资格
|
||||
- 光之核心的腐化比想象中更严重
|
||||
- 下一章:城主宫殿,直面光之城主赛格哈特
|
||||
|
||||
---
|
||||
|
||||
*准备开始写作*
|
||||
23
memory/2026-03-24-ch18-outline.md
Normal file
23
memory/2026-03-24-ch18-outline.md
Normal file
@ -0,0 +1,23 @@
|
||||
<!-- tags: 小说创作 阿拉德 剑之回响 第十八章 天帷巨兽 神殿外围 -->
|
||||
|
||||
# 2026-03-24 下午创作
|
||||
|
||||
## 第十八章:天帷巨兽·神殿外围
|
||||
|
||||
### 章节信息
|
||||
- **等级**:Lv.28-31
|
||||
- **地图**:天帷巨兽·神殿外围
|
||||
- **BOSS**:GBL教信徒/审判者马塞尔
|
||||
|
||||
### 核心剧情
|
||||
1. 林克和赛丽亚从奥菲利亚处得知天帷巨兽的异变
|
||||
2. GBL教(疯狂伊凡的信徒)的暴走事件
|
||||
3. 前往天帷巨兽,进入神殿外围调查
|
||||
4. 遭遇GBL教信徒和章鱼怪物
|
||||
5. **BOSS战:GBL教大祭司维加**(被使徒控制的高层之一)
|
||||
6. 发现罗特斯使徒的气息
|
||||
|
||||
### 重要说明
|
||||
- **马塞尔**(GBL教审判长)是**天帷禁地**的BOSS,不是神殿外围
|
||||
- 马塞尔留到后面的章节再出现
|
||||
- 神殿外围的BOSS改为GBL教大祭司维加
|
||||
49
memory/2026-03-24-ch20-outline.md
Normal file
49
memory/2026-03-24-ch20-outline.md
Normal file
@ -0,0 +1,49 @@
|
||||
<!-- tags: 小说创作 阿拉德 剑之回响 第二十章 树精丛林 -->
|
||||
|
||||
# 2026-03-24 下午创作
|
||||
|
||||
## 第二十章:树精丛林
|
||||
|
||||
### 章节信息
|
||||
- **等级**:Lv.29-32
|
||||
- **地图**:天帷巨兽·树精丛林
|
||||
- **BOSS**:树精王/巨树守护者
|
||||
|
||||
### 核心剧情
|
||||
1. 从神殿外围进入树精丛林区域
|
||||
2. 发现GBL教的研究设施和被遗弃的实验体
|
||||
3. 遭遇变异的树精和藤蔓怪物
|
||||
4. GBL教曾经在这里进行禁忌实验
|
||||
5. 树精王BOSS战
|
||||
|
||||
### 重要设定
|
||||
- **树精丛林**:天帷巨兽背部的原始森林区域
|
||||
- **GBL教的秘密实验**:研究使徒力量与植物的融合
|
||||
- **变异的树精**:被罗特斯力量侵蚀的植物生命
|
||||
- **环境特点**:密集的丛林,藤蔓遍布,视线受限
|
||||
|
||||
### 剧情要点
|
||||
- 林克升级到Lv.30,破军升龙击更加熟练
|
||||
- 赛丽亚的精灵之力与植物产生共鸣
|
||||
- 发现GBL教研究使徒的笔记
|
||||
- 晨曦的光芒开始有恢复迹象(使用越多越亮)
|
||||
|
||||
### 战斗亮点
|
||||
- 流心系列技能在复杂地形中的运用
|
||||
- 破军升龙击清理大面积藤蔓
|
||||
- 里·鬼剑术快速斩断树精枝条
|
||||
- 晨曦光属性对植物类怪物的燃烧效果
|
||||
|
||||
### 新发现
|
||||
- GBL教在研究如何复制使徒的力量
|
||||
- 树精原本是GBL教的守护者,被腐蚀后变异
|
||||
- 赛丽亚能感觉到树精们痛苦的情绪
|
||||
|
||||
### 悬念
|
||||
- GBL教到底在研究什么禁忌知识?
|
||||
- 赛丽亚为什么能与植物共鸣?
|
||||
- 使徒的力量到底有多强大?
|
||||
|
||||
---
|
||||
|
||||
*准备开始写作*
|
||||
49
memory/2026-03-24-ch21-outline.md
Normal file
49
memory/2026-03-24-ch21-outline.md
Normal file
@ -0,0 +1,49 @@
|
||||
<!-- tags: 小说创作 阿拉德 剑之回响 第二十一章 炼狱 -->
|
||||
|
||||
# 2026-03-24 下午创作
|
||||
|
||||
## 第二十一章:炼狱
|
||||
|
||||
### 章节信息
|
||||
- **等级**:Lv.31-34
|
||||
- **地图**:天帷巨兽·炼狱
|
||||
- **BOSS**:火焰龙头/地狱三头犬
|
||||
|
||||
### 核心剧情
|
||||
1. 从树精丛林进入炼狱区域
|
||||
2. 这里曾经是GBL教的净化设施,现在变成了地狱般的场景
|
||||
3. 遭遇被使徒力量扭曲的火焰生物
|
||||
4. 发现GBL教试图用火焰净化使徒污染的实验失败
|
||||
5. 炼狱BOSS战
|
||||
|
||||
### 重要设定
|
||||
- **炼狱**:GBL教的地下净化设施,到处都是熔岩和火焰
|
||||
- **失败实验**:试图用极端高温净化使徒污染,结果制造出更可怕的怪物
|
||||
- **环境特点**:高温、熔岩河、到处都是火焰陷阱
|
||||
- **新怪物**:火焰龙头、熔岩巨人、地狱三头犬
|
||||
|
||||
### 剧情要点
|
||||
- 林克升级到Lv.32,破军升龙击更加熟练
|
||||
- 晨曦的光芒恢复到六成
|
||||
- 高温环境对林克和赛丽亚都是考验
|
||||
- 发现GBL教的疯狂:为了对抗使徒,不惜一切代价
|
||||
|
||||
### 战斗亮点
|
||||
- 在高温环境中战斗,体力消耗加快
|
||||
- 流心·跃越过熔岩河
|
||||
- 破军升龙击将敌人打入熔岩
|
||||
- 晨曦的光属性 vs 火焰属性的对抗
|
||||
|
||||
### 新发现
|
||||
- GBL教的疯狂程度超出想象
|
||||
- 使徒的力量无法被常规手段净化
|
||||
- 炼狱下方似乎有更深层区域
|
||||
|
||||
### 悬念
|
||||
- 炼狱下方是什么?
|
||||
- GBL教还进行了多少禁忌实验?
|
||||
- 罗特斯知道这些实验吗?
|
||||
|
||||
---
|
||||
|
||||
*准备开始写作*
|
||||
55
memory/2026-03-24-ch22-outline.md
Normal file
55
memory/2026-03-24-ch22-outline.md
Normal file
@ -0,0 +1,55 @@
|
||||
<!-- tags: 小说创作 阿拉德 剑之回响 第二十二章 休整 支线任务 -->
|
||||
|
||||
# 2026-03-24 下午创作
|
||||
|
||||
## 第二十二章:西海岸的闲暇
|
||||
|
||||
### 章节信息
|
||||
- **等级**:Lv.34-35(学会拔刀斩)
|
||||
- **地点**:西海岸、赫顿玛尔
|
||||
- **核心**:NPC互动、支线任务、武器收集
|
||||
|
||||
### 核心剧情
|
||||
1. 林克从炼狱出来,暂时返回西海岸休整
|
||||
2. 遇到卡坤(武器商人),卡坤对赛丽亚表现出好感
|
||||
3. 卡坤给林克支线任务:收集稀有材料制作武器
|
||||
4. 与莎兰、诺顿等NPC交流,获得情报
|
||||
5. 林克升到35级,学会拔刀斩
|
||||
6. 卡坤为林克打造属性武器(火/冰/光/暗属性的剑)
|
||||
|
||||
### 重要NPC互动
|
||||
- **卡坤**:西海岸武器商人,对赛丽亚有好感,给林克支线任务
|
||||
- **莎兰**:提供魔法情报,帮助强化晨曦
|
||||
- **诺顿**:分析GBL教的研究资料
|
||||
- **凯丽**(在赫顿玛尔):强化装备
|
||||
|
||||
### 支线任务
|
||||
1. 卡坤的委托:收集火焰之心、冰霜结晶等材料
|
||||
2. 莎兰的委托:收集魔法粉末强化晨曦
|
||||
3. 诺顿的委托:带回GBL教的研究样本
|
||||
|
||||
### 新武器
|
||||
- **烈焰之刃**(火属性太刀)
|
||||
- **霜寒之剑**(冰属性巨剑)
|
||||
- **雷霆之锋**(光属性短剑)
|
||||
- **暗影之牙**(暗属性钝器)
|
||||
|
||||
卡坤会为林克打造这些武器,让林克拥有更多属性选择
|
||||
|
||||
### 技能突破
|
||||
- 林克升到35级,学会**拔刀斩**
|
||||
- 第一次使用拔刀斩的威力展示
|
||||
|
||||
### 人物关系
|
||||
- 卡坤对赛丽亚的微妙态度(林克的"情敌"?)
|
||||
- 赛丽亚对林克的信任
|
||||
- NPC们对使徒威胁的担忧
|
||||
|
||||
### 剧情节奏
|
||||
- 轻松的城镇生活,暂时远离战斗
|
||||
- 为接下来的极昼和第一脊椎做准备
|
||||
- 获取更多关于罗特斯的情报
|
||||
|
||||
---
|
||||
|
||||
*准备开始写作*
|
||||
34
memory/2026-03-24-pm.md
Normal file
34
memory/2026-03-24-pm.md
Normal file
@ -0,0 +1,34 @@
|
||||
<!-- tags: 小说创作 阿拉德 剑之回响 第十五章 石巨人塔 -->
|
||||
|
||||
# 2026-03-24 下午创作
|
||||
|
||||
## 第十五章:石巨人塔 ✅ 完成
|
||||
|
||||
### 章节信息
|
||||
- **等级**:Lv.23-26
|
||||
- **地图**:石巨人塔(天空之城)
|
||||
- **BOSS**:黄金巨人普拉塔尼
|
||||
|
||||
### 核心剧情
|
||||
1. 林克和赛丽亚独立挑战石巨人塔(GSD已离开)
|
||||
2. 林克展现剑魂武器大师特性,切换五种武器战斗:
|
||||
- 晨曦(光剑)- 主力输出
|
||||
- 霜刃(太刀)- 精准打击关节
|
||||
- 破军(巨剑)- 力量碾压
|
||||
- 影牙(短剑)- 暗影属性攻击
|
||||
- 碎骨(钝器)- 震荡控制
|
||||
3. 赛丽亚的精灵魔法提供支援
|
||||
4. 击败BOSS黄金巨人普拉塔尼
|
||||
5. 普拉塔尼透露晨曦"属于这里",与光之核心有关
|
||||
|
||||
### 重要伏笔
|
||||
- 晨曦光剑与天空之城的光之核心产生共鸣
|
||||
- 普拉塔尼认识晨曦,暗示光剑的来历
|
||||
- 为第十六章城主宫殿铺垫
|
||||
|
||||
### 文档位置
|
||||
- 网站文件:`/root/.openclaw/workspace/alacarte-novel-website/chapters/chapter-15.html`
|
||||
|
||||
---
|
||||
|
||||
*记录时间:2026-03-24 11:15*
|
||||
593
memory/2026-03-24.md
Normal file
593
memory/2026-03-24.md
Normal file
@ -0,0 +1,593 @@
|
||||
<!-- tags: 小说创作 阿拉德 剑之回响 章节更新 -->
|
||||
|
||||
# 2026-03-24 工作记录
|
||||
|
||||
## 上午工作(9:00-9:55)
|
||||
|
||||
### 1. 第九章重写(重要修正)
|
||||
**问题**:转职流程错误,林克直接去僵尸图试炼后才遇到GSD
|
||||
**修正**:改为标准流程
|
||||
- 林克回赫顿玛尔找GSD
|
||||
- GSD详细介绍四大转职方向(剑魂/狂战士/鬼泣/阿修罗)
|
||||
- 林克选择剑魂
|
||||
- GSD指引去暗黑雷鸣废墟试炼
|
||||
- 链接:https://www.feishu.cn/docx/L2tydWs0Bo84h4xE3hbcfl8MnPg
|
||||
|
||||
### 2. 文档整理
|
||||
**删除旧版文档**:
|
||||
- 删除3个第八章旧版本
|
||||
- 删除旧版第五章、第六章重复文档
|
||||
- 删除旧版第一章、第二章(误删后重写)
|
||||
|
||||
**命名规范**:所有章节统一为"第X章:地图名"格式
|
||||
|
||||
### 3. 重写第一章和第二章
|
||||
由于误删正式版,完全重写:
|
||||
- 第一章:洛兰的风 - 林克初到艾尔文防线,初遇赛丽亚,获得霜刃
|
||||
- 第二章:洛兰深处 - 阿甘左教导剑术,战胜哥布林头目
|
||||
|
||||
### 4. 新增主角设定
|
||||
在MEMORY.md中补充林克的详细设定:
|
||||
- **剑魂特性**:武器大师
|
||||
- **武器库**:光剑晨曦、太刀霜刃、巨剑破军、短剑影牙、钝器碎骨
|
||||
- **战斗风格**:根据敌人特点灵活切换武器
|
||||
|
||||
### 5. 连续创作新章节
|
||||
**第十章:暗黑雷鸣废墟**
|
||||
- 林克完成转职试炼
|
||||
- 在鬼手被压制的情况下,仅凭剑术战胜僵尸王
|
||||
- 领悟剑魂真谛,获得光剑"晨曦"
|
||||
|
||||
**第十一章:剑魂转职仪式(完整版)**
|
||||
- GSD正式授予剑魂之名
|
||||
- 详细讲解五种武器特性
|
||||
- 强调"武器大师"核心理念
|
||||
|
||||
**第十二章:西海岸**
|
||||
- 与莎兰互动,了解天空之城背景
|
||||
- 揭示光剑"晨曦"的来历(与光之核心有关)
|
||||
- GSD出现决定同行
|
||||
|
||||
**第十三章:龙人之塔(GSD带队)**
|
||||
- GSD展现"开挂瞎子"的恐怖实力
|
||||
- 随手秒杀龙人首领
|
||||
- 龙人首领认出GSD,提到二十年前他独闯天空之城
|
||||
|
||||
**第十四章:人偶玄关(GSD带队)**
|
||||
- GSD展现阿修罗觉醒技能"暗天波动眼"
|
||||
- 身后出现巨眼虚影,秒杀BOSS
|
||||
- 透露剑魂的觉醒技能叫"极·鬼剑术"
|
||||
|
||||
### 6. 更新设定集
|
||||
- 添加主角林克的武器大师设定
|
||||
- 整理所有章节链接
|
||||
- 链接:https://www.feishu.cn/docx/E91Kd79bToZfbRxzhpVchRSsnEf
|
||||
|
||||
### 7. 创建小说网站
|
||||
为主人创建了一个现代化的小说阅读网站:
|
||||
- 位置:`/root/.openclaw/workspace/alacarte-novel-website/`
|
||||
- 功能:首页展示、章节目录、阅读器
|
||||
- 设计:深色模式、玻璃拟态、渐变色彩、响应式
|
||||
- 特色:3D书本封面、粒子效果、阅读进度追踪
|
||||
|
||||
---
|
||||
|
||||
## 当前小说进度
|
||||
|
||||
| 章节 | 地图 | 状态 |
|
||||
|------|------|------|
|
||||
| 第1-10章 | 洛兰→暗黑雷鸣废墟 | ✅ 完成 |
|
||||
| 第11章 | 剑魂转职仪式 | ✅ 完成 |
|
||||
| 第12章 | 西海岸 | ✅ 完成 |
|
||||
| 第13章 | 龙人之塔(GSD带队)| ✅ 完成 |
|
||||
| 第14章 | 人偶玄关(GSD带队)| ✅ 完成 |
|
||||
| 第15章 | 石巨人塔 | 待写 |
|
||||
|
||||
---
|
||||
|
||||
## 下步计划
|
||||
- 写第15章:石巨人塔(林克独立挑战)
|
||||
- 继续天空之城区域:黑暗玄廊、城主宫殿
|
||||
|
||||
---
|
||||
|
||||
## 上午工作(11:00-11:25)
|
||||
|
||||
### 1. 创建第十五章:石巨人塔
|
||||
**核心剧情**:
|
||||
- 林克和赛丽亚独立挑战石巨人塔(GSD已离开)
|
||||
- 展现剑魂武器大师特性,切换五种武器战斗
|
||||
- 击败BOSS黄金巨人普拉塔尼
|
||||
- 普拉塔尼透露晨曦"属于这里",与光之核心有关
|
||||
|
||||
**网站文件**:`alacarte-novel-website/chapters/chapter-15.html`
|
||||
|
||||
### 2. 创建设定集页面
|
||||
为主人创建了完整的设定集页面:
|
||||
- 位置:`alacarte-novel-website/wiki.html`
|
||||
- 内容:世界观、角色介绍、武器库、职业系统、地图等级表、当前进度
|
||||
- 导航:首页/目录页/设定集页都已添加设定集入口
|
||||
- 所有章节侧边栏添加"查看设定集"链接
|
||||
|
||||
### 3. 修复阅读进度功能
|
||||
**问题**:章节文件没有记录阅读进度的代码
|
||||
**修复**:为所有15章添加localStorage记录:
|
||||
```javascript
|
||||
let readChapters = JSON.parse(localStorage.getItem('readChapters') || '[]');
|
||||
if (!readChapters.includes(章节ID)) {
|
||||
readChapters.push(章节ID);
|
||||
localStorage.setItem('readChapters', JSON.stringify(readChapters));
|
||||
}
|
||||
```
|
||||
|
||||
### 4. 更新进度条计算方式
|
||||
**修改前**:固定值(如93%)
|
||||
**修改后**:根据总章节数动态计算
|
||||
- 第1章:6% (1/15)
|
||||
- 第2章:13% (2/15)
|
||||
- ...
|
||||
- 第15章:100% (15/15)
|
||||
|
||||
这样用户能清楚知道自己阅读到整个故事的哪个位置。
|
||||
|
||||
### 5. 修复网站导航问题
|
||||
- 删除重复的"上一章/下一章"按钮(保留底部footer导航)
|
||||
- 修复筛选功能导致的时间线样式问题
|
||||
- 确保移动端响应式设计
|
||||
|
||||
---
|
||||
|
||||
## 当前小说进度
|
||||
|
||||
| 章节 | 地图 | 等级 | 状态 |
|
||||
|------|------|------|------|
|
||||
| 第1-10章 | 洛兰→暗黑雷鸣废墟 | Lv.1-18 | ✅ 完成 |
|
||||
| 第11章 | 剑魂转职仪式 | Lv.18 | ✅ 完成 |
|
||||
| 第12章 | 西海岸 | Lv.18 | ✅ 完成 |
|
||||
| 第13章 | 龙人之塔 | Lv.19-20 | ✅ 完成 |
|
||||
| 第14章 | 人偶玄关 | Lv.21-22 | ✅ 完成 |
|
||||
| 第15章 | 石巨人塔 | Lv.23-26 | ✅ 完成 |
|
||||
|
||||
---
|
||||
|
||||
## 下步计划
|
||||
- 第16章:城主宫殿(光之核心真相)
|
||||
- 天帷巨兽区域:神殿外围、树精丛林等
|
||||
|
||||
---
|
||||
|
||||
## 下午工作(12:55-13:12)
|
||||
|
||||
### 1. 完成第十六章:黑暗玄廊
|
||||
**核心剧情**:
|
||||
- 回赫顿玛尔向诺顿交任务,解析普拉塔尼核心
|
||||
- 诺顿揭示光之核心正在腐化
|
||||
- 获得魔力探测剂,了解石巨人操控师机制
|
||||
- 探索黑暗玄廊,点亮灯柱驱逐黑暗
|
||||
- 遭遇驱逐者(曾经的天空之城骑士)
|
||||
- 与天之驱逐者BOSS战,使用剑魂技能(里·鬼剑术、破军升龙击、武器奥义)
|
||||
- 净化黑暗,获得前往城主宫殿的资格
|
||||
|
||||
**剑魂技能展示**:
|
||||
- **武器奥义**(被动):全程加持,提升攻击精准度
|
||||
- **里·鬼剑术**(20级):光剑二连斩击,主要输出技能
|
||||
- **破军升龙击**(25级):巨剑上挑技能,破盾专用
|
||||
- **霜刃·里鬼连斩**:太刀+里鬼的组合技
|
||||
- **里·鬼剑术·改/极限**:强化版和极限版本
|
||||
- **光剑精通·极光斩**(自创):林克自创招式
|
||||
|
||||
### 2. 完成第十七章:城主宫殿(天空之城篇完结)
|
||||
**核心剧情**:
|
||||
- 进入城主宫殿,面对光之城主赛格哈特
|
||||
- 赛格哈特讲述天空之城历史、光之核心由来
|
||||
- **重大揭秘**:晨曦是光之核心的碎片
|
||||
- **预言**:林克是被选中的持剑者
|
||||
- 与赛格哈特战斗(试炼之战)
|
||||
- 使用剑魂技能对抗天空之城最强者
|
||||
- 净化光之核心,晨曦暂时失去光芒
|
||||
- 天空之城重开,获得"晨曦的继承者"称号
|
||||
|
||||
**重要设定**:
|
||||
- 天空之城曾是连接天界和阿拉德的桥梁
|
||||
- 光之核心因战争失控,天空之城被迫升空隔离
|
||||
- 赛格哈特是守护者,几百年孤独守望
|
||||
- 光之核心腐化源于赛格哈特内心的迷茫
|
||||
- 晨曦承载着"希望与守护的意志"
|
||||
|
||||
**剑魂技能展示**:
|
||||
- **里·鬼剑术·极限**:超越极限的极速斩击
|
||||
- **破军升龙击**:震退BOSS,展现掌握程度提升
|
||||
- **武器奥义+光剑精通+里·鬼剑术**三重融合
|
||||
- **极光斩**(自创):光剑特性的完美发挥
|
||||
|
||||
### 3. 更新网站数据
|
||||
- 添加 chapter-17.html
|
||||
- 更新 js/app.js 章节数据(17章)
|
||||
- 更新第16章下一章链接
|
||||
- 所有章节侧边栏添加第17章入口
|
||||
|
||||
---
|
||||
|
||||
## 当前小说进度(天空之城篇完结)
|
||||
|
||||
| 章节 | 地图 | 等级 | 状态 |
|
||||
|------|------|------|------|
|
||||
| 第1-10章 | 洛兰→暗黑雷鸣废墟 | Lv.1-18 | ✅ 完成 |
|
||||
| 第11章 | 剑魂转职仪式 | Lv.18 | ✅ 完成 |
|
||||
| 第12章 | 西海岸 | Lv.18 | ✅ 完成 |
|
||||
| 第13章 | 龙人之塔 | Lv.19-20 | ✅ 完成 |
|
||||
| 第14章 | 人偶玄关 | Lv.21-22 | ✅ 完成 |
|
||||
| 第15章 | 石巨人塔 | Lv.23-26 | ✅ 完成 |
|
||||
| 第16章 | 黑暗玄廊 | Lv.24-27 | ✅ 完成 |
|
||||
| 第17章 | 城主宫殿 | Lv.26-29 | ✅ 完成 |
|
||||
|
||||
**天空之城篇完结!**
|
||||
|
||||
### 篇章总结
|
||||
- **起点**:西海岸莎兰揭示晨曦与天空之城的联系
|
||||
- **过程**:GSD带队→独立挑战→诺顿情报→净化核心
|
||||
- **终点**:光之城主赛格哈特,揭晓晨曦来历,净化光之核心
|
||||
- **收获**:
|
||||
- 林克Lv.26-29,剑魂技能熟练
|
||||
- 晨曦暂时失去光芒(后续可恢复/升级)
|
||||
- 天空之城重新开放
|
||||
- "晨曦的继承者"称号
|
||||
|
||||
---
|
||||
|
||||
## 下步计划(天帷巨兽篇)
|
||||
- 第18章:天帷巨兽·神殿外围(Lv.28-31)
|
||||
- 第19章:树精丛林(Lv.29-32)
|
||||
- 第20章:炼狱(Lv.31-34)
|
||||
- ... 极昼、第一脊椎、第二脊椎(罗特斯BOSS)
|
||||
|
||||
**新伏笔**:
|
||||
- 晨曦如何恢复光芒?
|
||||
- 天界的科技与魔法
|
||||
- 使徒罗特斯的威胁
|
||||
|
||||
---
|
||||
|
||||
## 下午工作(14:36-14:40)
|
||||
|
||||
### 补充:番外篇 - 悬空城
|
||||
|
||||
**核心剧情**:
|
||||
- 凯丽提供情报:天空之城最深处有"悬空城",藏有光之核心的原型
|
||||
- 探索悬空城,遭遇元素精灵(光属性药剂才能击败)
|
||||
- 遇到天空之城建造者的意志残留
|
||||
- 与古老守护者战斗,证明自身资格
|
||||
- **重要转折**:林克领悟"持剑者自身的光芒",晨曦恢复三成力量
|
||||
- 获得"光之骑士"称号
|
||||
- 埋下使徒罗特斯的伏笔
|
||||
|
||||
**晨曦恢复**:
|
||||
- 不再依赖光之核心,而是与持剑者共同成长
|
||||
- 目前恢复约30%力量,可正常使用
|
||||
- 为后续天帷巨兽篇铺垫
|
||||
|
||||
**新伏笔**:
|
||||
- 使徒:古老的邪恶存在
|
||||
- 光之核心原本是为了对抗使徒而创造
|
||||
- 天帷巨兽的苏醒将使徒气息带到阿拉德
|
||||
|
||||
---
|
||||
|
||||
## 最终进度(天空之城篇 正式完结)
|
||||
|
||||
| 章节 | 地图 | 等级 | 状态 |
|
||||
|------|------|------|------|
|
||||
| 第1-10章 | 洛兰→暗黑雷鸣废墟 | Lv.1-18 | ✅ 完成 |
|
||||
| 第11章 | 剑魂转职仪式 | Lv.18 | ✅ 完成 |
|
||||
| 第12章 | 西海岸 | Lv.18 | ✅ 完成 |
|
||||
| 第13章 | 龙人之塔 | Lv.19-20 | ✅ 完成 |
|
||||
| 第14章 | 人偶玄关 | Lv.21-22 | ✅ 完成 |
|
||||
| 第15章 | 石巨人塔 | Lv.23-26 | ✅ 完成 |
|
||||
| 第16章 | 黑暗玄廊 | Lv.24-27 | ✅ 完成 |
|
||||
| 第17章 | 城主宫殿 | Lv.26-29 | ✅ 完成 |
|
||||
| 番外篇 | 悬空城 | Lv.27-30 | ✅ 完成 |
|
||||
|
||||
**总字数**:18章,约6万字
|
||||
**天空之城篇**:正式完结
|
||||
**下一篇章**:天帷巨兽篇(使徒罗特斯)
|
||||
|
||||
---
|
||||
|
||||
## 下午工作(15:18-15:25)
|
||||
|
||||
### 完成第十八章:天帷巨兽·神殿外围
|
||||
**核心剧情**:
|
||||
- 新角色奥菲利亚登场:GBL教唯一幸存者,求助林克调查天帷巨兽异变
|
||||
- GBL教(崇拜知识的宗教)被使徒控制,信徒发狂暴走
|
||||
- 前往天帷巨兽背部,遭遇发狂的GBL教信徒
|
||||
- BOSS战:审判者马塞尔(GBL教审判长)
|
||||
|
||||
**新设定**:
|
||||
- **天帷巨兽**:巨大的飞行生物,背上建满古代神殿
|
||||
- **GBL教**:"Grand Blue Lore",崇拜知识的宗教组织
|
||||
- **第八使徒罗特斯**:拥有精神控制能力的存在,控制了整个GBL教
|
||||
- **奥菲利亚**:GBL教幸存者,请求林克阻止异变
|
||||
|
||||
**剑魂技能展示(Lv.28-30)**:
|
||||
- **破极兵刃**:25级BUFF技能,全程开启,提升攻击力
|
||||
- **流心·刺**:25级,精准突刺
|
||||
- **流心·跃**:25级,空中斩击
|
||||
- **流心·升**:25级,上挑连击
|
||||
- **流心连招**:跃→升的空中连击组合
|
||||
- **破军升龙击**:30级,突进上挑,已熟练
|
||||
- **里·鬼剑术**:全程使用,光剑二连斩
|
||||
|
||||
**晨曦状态**:
|
||||
- 恢复30%光芒,可正常使用光属性攻击
|
||||
- 光属性对使徒控制的敌人有克制效果
|
||||
|
||||
**重要伏笔**:
|
||||
- 罗特斯的声音直接传入脑海
|
||||
- 赛丽亚的精灵之力与精神控制产生冲突
|
||||
- 第二脊椎:使徒罗特斯的所在地
|
||||
- 天帷巨兽会坠落到阿拉德大陆的危机
|
||||
|
||||
---
|
||||
|
||||
## 最终进度
|
||||
|
||||
| 章节 | 地图 | 等级 | 状态 |
|
||||
|------|------|------|------|
|
||||
| 第1-10章 | 洛兰→暗黑雷鸣废墟 | Lv.1-18 | ✅ |
|
||||
| 第11章 | 剑魂转职仪式 | Lv.18 | ✅ |
|
||||
| 第12章 | 西海岸 | Lv.18 | ✅ |
|
||||
| 第13章 | 龙人之塔 | Lv.19-20 | ✅ |
|
||||
| 第14章 | 人偶玄关 | Lv.21-22 | ✅ |
|
||||
| 第15章 | 石巨人塔 | Lv.23-26 | ✅ |
|
||||
| 第16章 | 黑暗玄廊 | Lv.24-27 | ✅ |
|
||||
| 第17章 | 城主宫殿 | Lv.26-29 | ✅ |
|
||||
| 番外篇 | 悬空城 | Lv.27-30 | ✅ |
|
||||
| **第十八章** | **天帷巨兽·神殿外围** | **Lv.28-31** | **✅** |
|
||||
|
||||
**总章节**:19章
|
||||
**当前等级**:Lv.28-31
|
||||
**下一章**:树精丛林(Lv.29-32)
|
||||
|
||||
---
|
||||
|
||||
## 下午工作(16:00-16:48)
|
||||
|
||||
### 修正章节命名
|
||||
将章节编号统一,避免混乱:
|
||||
- chapter-18.html → 第十八章:番外·悬空城
|
||||
- chapter-19.html → 第十九章:天帷巨兽·神殿外围
|
||||
- chapter-20.html → 第二十章:树精丛林
|
||||
- 所有侧边栏链接同步更新
|
||||
|
||||
### 第二十章:树精丛林(Lv.29-32)
|
||||
**核心剧情**:
|
||||
- 进入天帷巨兽的树精丛林区域
|
||||
- 发现GBL教的秘密地下实验室
|
||||
- 揭露"使徒融合实验"的恐怖真相
|
||||
- **BOSS战:树精王**(被腐蚀的古老巨树)
|
||||
|
||||
**新发现**:
|
||||
- GBL教进行禁忌实验:将罗特斯的力量与植物/人类融合
|
||||
- 实验体记录:人类与使徒细胞融合全部死亡
|
||||
- 树精原本是GBL教的守护者,被腐蚀后变异
|
||||
|
||||
**战斗亮点**:
|
||||
- 流心系列:在复杂丛林地形中穿梭
|
||||
- 破军升龙击:清理大面积藤蔓
|
||||
- 里·鬼剑术:光属性的灼热效果点燃树精
|
||||
- **疯狂战术**:钻进树精王体内攻击核心
|
||||
|
||||
**晨曦恢复进度**:恢复至**五成光芒**
|
||||
|
||||
### 第二十一章:炼狱(Lv.31-34)
|
||||
**核心剧情**:
|
||||
- 进入GBL教的地下净化设施
|
||||
- 炼狱是夜叉的栖息地,到处都是这种恶魔
|
||||
- 遭遇大量夜叉,最终面对夜叉王
|
||||
- **BOSS战:夜叉王**(炼狱的统治者,夜叉族群中最强大的存在,生着蝙蝠翅膀,使用熔岩巨斧)
|
||||
|
||||
**战斗策略**:
|
||||
- 夜叉速度极快,能在空中飞行
|
||||
- 利用流心·跃和破军升龙击将夜叉王逼到地面
|
||||
- 攻击他的翅膀让他无法飞行
|
||||
- 最后用流心·刺给予致命一击
|
||||
|
||||
**晨曦恢复进度**:恢复至**七成光芒**
|
||||
|
||||
### 进度总结
|
||||
| 章节 | 地图 | 等级 | 状态 |
|
||||
|------|------|------|------|
|
||||
| 第十七章 | 城主宫殿 | Lv.26-29 | ✅ |
|
||||
| 第十八章 | 番外·悬空城 | Lv.27-30 | ✅ |
|
||||
| 第十九章 | 天帷巨兽·神殿外围 | Lv.28-31 | ✅ |
|
||||
| 第二十章 | 树精丛林 | Lv.29-32 | ✅ |
|
||||
| 第二十一章 | 炼狱 | Lv.31-34 | ✅ |
|
||||
|
||||
**总章节**:21章
|
||||
**当前等级**:Lv.31-34
|
||||
**下一章**:极昼(Lv.33-36)
|
||||
|
||||
---
|
||||
|
||||
*记录时间:2026-03-24 16:48*
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
---
|
||||
|
||||
## 队伍调整计划(已确定)
|
||||
|
||||
### 赛丽亚离队(第23章:极昼)
|
||||
- **原因**:极昼区域精神污染太强,赛丽亚的精灵之力难以抵抗
|
||||
- **安排**:返回西海岸旅馆休整,等待林克凯旋
|
||||
- **场景**:感人离别,赛丽亚担心但理解
|
||||
|
||||
### 新队友加入(第24章:第一脊椎)
|
||||
**圣骑士 - 艾伦(Alan)**
|
||||
- **身份**:赫顿玛尔圣堂的年轻圣骑士
|
||||
- **性格**:正直、有点古板但热心
|
||||
- **能力**:
|
||||
- 治愈术(恢复HP)
|
||||
- 光之复仇(攻击力BUFF)
|
||||
- 圣光守护(护盾)
|
||||
- 圣光十字(光属性攻击)
|
||||
- **加入契机**:追踪使徒气息来到天帷巨兽,在第一脊椎与林克相遇
|
||||
|
||||
**队伍配置变化**:
|
||||
| 阶段 | 队友 | 配置 |
|
||||
|------|------|------|
|
||||
| 第19-22章 | 林克、赛丽亚、奥菲利亚、维加 | 1C+1奶+2辅助 |
|
||||
| 第23章 | 林克、奥菲利亚、维加 | 暂缺奶妈 |
|
||||
| 第24章+ | 林克、艾伦、奥菲利亚、维加 | 1C+1奶+2辅助(新) |
|
||||
|
||||
### 第二十三章:极昼(Lv.35-38)
|
||||
**核心剧情**:
|
||||
- 极昼区域精神污染太强,赛丽亚无法承受
|
||||
- **赛丽亚离队**:返回西海岸旅馆休整,约定平安归来
|
||||
- 维加护送赛丽亚离开
|
||||
|
||||
**极昼设定(按DNF原作)**:
|
||||
- 背景:GBL教武器库,天帷巨兽最高点
|
||||
- 小怪:GBL教徒、教官、主教、龙口炮、狮口炮、电精灵、多尼尔、喷火炮、瞎子狼人、红色浪人、章鱼
|
||||
- BOSS:**EX多尼尔**(巨型飞艇)
|
||||
- BOSS技能:霸体坠地突进、召唤小怪
|
||||
|
||||
**战斗亮点**:
|
||||
- 第一次实战使用拔刀斩击落多尼尔
|
||||
- 利用掩体战术推进
|
||||
- 击败EX多尼尔,晨曦恢复至**八成**
|
||||
|
||||
### 第二十四章:第一脊椎(Lv.38-41)
|
||||
**核心剧情**:
|
||||
- **新队友登场**:圣骑士艾伦(来自赫顿玛尔圣堂)
|
||||
- 艾伦提供治愈、BUFF(光之复仇)、圣光攻击
|
||||
- 联手击败巨型黑章鱼
|
||||
|
||||
**第一脊椎设定(按DNF原作)**:
|
||||
- 小怪:蓝章鱼、融合树精(树精+章鱼)
|
||||
- BOSS:**巨型黑章鱼**(大章鱼)
|
||||
- BOSS技能:死亡大转盘(旋转攻击)、喷吐墨汁、召唤小章鱼、触手包裹
|
||||
|
||||
**战斗亮点**:
|
||||
- 艾伦的"光之复仇"BUFF大幅提升林克攻击力
|
||||
- 巨型黑章鱼的"死亡大转盘"几乎无解,靠艾伦的"圣光守护"护盾硬抗
|
||||
- 林克被触手包裹,靠意志力挣脱
|
||||
- 联手击败BOSS,晨曦恢复至**九成**
|
||||
|
||||
**队伍配置**:
|
||||
- 林克(剑魂)+ 艾伦(圣骑士)+ 奥菲利亚(向导)
|
||||
|
||||
---
|
||||
|
||||
## 今日进度总结
|
||||
|
||||
| 章节 | 地图 | 等级 | 状态 |
|
||||
|------|------|------|------|
|
||||
| 第二十一章 | 炼狱 | Lv.31-34 | ✅ |
|
||||
| 第二十二章 | 西海岸的闲暇 | Lv.34-35 | ✅ |
|
||||
| 第二十三章 | 极昼 | Lv.35-38 | ✅ |
|
||||
| 第二十四章 | 第一脊椎 | Lv.38-41 | ✅ |
|
||||
|
||||
**总章节**:24章
|
||||
**当前等级**:Lv.38-41
|
||||
**下一章**:第二脊椎(最终BOSS罗特斯)
|
||||
|
||||
**已同步到网站**:✅
|
||||
- chapter-21.html 炼狱
|
||||
- chapter-22.html 西海岸的闲暇
|
||||
- chapter-23.html 极昼
|
||||
- chapter-24.html 第一脊椎
|
||||
- js/app.js 数据更新
|
||||
- 所有章节侧边栏链接更新
|
||||
|
||||
---
|
||||
|
||||
*记录时间:2026-03-24 18:30*
|
||||
|
||||
|
||||
---
|
||||
|
||||
## 晚上工作(20:00-20:55)
|
||||
|
||||
### 1. 修复网站导航问题
|
||||
**问题**:chapter-22.html 和 chapter-23.html 页面顶部显示错误的章节链接
|
||||
**原因**:之前批量添加侧边栏链接时,sed命令错误地把链接插入到了HTML的head部分
|
||||
**修复**:删除了错误位置的sidebar-chapter链接
|
||||
|
||||
### 2. 用户答疑:赛丽亚精神控制问题
|
||||
**问题**:为什么赛丽亚受不了精神控制,而林克和奥菲利亚却可以?
|
||||
**设定解释**:
|
||||
- 罗特斯的精神控制针对精神力强大的生物效果更强
|
||||
- 赛丽亚(精灵):精神力⭐⭐⭐⭐⭐,受影响最严重
|
||||
- 林克(剑魂):精神力⭐⭐,靠意志力和晨曦的净化效果抵抗
|
||||
- 艾伦(圣骑士):圣光之力专门克制邪恶精神力量
|
||||
- 奥菲利亚(GBL教):长期生活在天帷巨兽,有一定适应性
|
||||
|
||||
### 3. 搜索验证DNF设定
|
||||
**工具**:agent-browser 搜索百度
|
||||
**确认设定**:
|
||||
- 凯丽:来自天界的漫游枪手,师从枪神沙影贝利特
|
||||
- 罗特斯:第八使徒,精神控制能力,需要干扰发射器抵抗
|
||||
|
||||
### 4. 第二十五章:赫顿玛尔的准备(Lv.41-42)
|
||||
**核心剧情**:
|
||||
- 林克从第一脊椎返回赫顿玛尔
|
||||
- 找凯丽制造**抗精神干扰手环**(天界科技"干扰发射器")
|
||||
- 利用晨曦的能量+收集的材料制作完成
|
||||
- 凯丽关心赛丽亚的安危
|
||||
|
||||
**重要设定**:
|
||||
- 手环只能保护一个人
|
||||
- 林克戴上手环,艾伦靠圣光守护,奥菲利亚靠适应性
|
||||
- 为最终决战做准备
|
||||
|
||||
**衔接修正**:
|
||||
- 24章结尾:艾伦提醒罗特斯太危险,决定先回赫顿玛尔
|
||||
- 25章开头:解释原因→返回赫顿玛尔→找凯丽
|
||||
- 修正了凯丽被重复提及的问题
|
||||
|
||||
### 5. 网站同步问题修复
|
||||
**发现的问题**:
|
||||
- js/app.js 第21行有多余的逗号 `,,` 导致语法错误
|
||||
- chapters.html 显示"共14章"未更新
|
||||
**修复**:
|
||||
- 删除多余逗号
|
||||
- 更新章节数为25章
|
||||
|
||||
### 写作原则确立
|
||||
**用户强调**:每次写新章节前必须搜索DNF原作设定
|
||||
> "不确定就查,不查就不写"
|
||||
> 所有怪物、BOSS、背景设定必须通过搜索确认
|
||||
|
||||
---
|
||||
|
||||
## 最终进度
|
||||
|
||||
| 章节 | 地图 | 等级 | 状态 |
|
||||
|------|------|------|------|
|
||||
| 第二十一章 | 炼狱 | Lv.31-34 | ✅ |
|
||||
| 第二十二章 | 西海岸的闲暇 | Lv.34-35 | ✅ |
|
||||
| 第二十三章 | 极昼 | Lv.35-38 | ✅ |
|
||||
| 第二十四章 | 第一脊椎 | Lv.38-41 | ✅ |
|
||||
| 第二十五章 | 赫顿玛尔的准备 | Lv.41-42 | ✅ |
|
||||
|
||||
**总章节**:25章
|
||||
**当前等级**:Lv.41-42
|
||||
**下一章**:第二十六章——第二脊椎(最终BOSS罗特斯)
|
||||
|
||||
**队伍配置**:
|
||||
- 林克(剑魂)+ 艾伦(圣骑士)+ 奥菲利亚(向导)+ 维加(护送赛丽亚后归队)
|
||||
|
||||
**晨曦恢复**:九成光芒
|
||||
|
||||
**已同步到网站**:✅
|
||||
- chapter-25.html
|
||||
- js/app.js 数据更新
|
||||
- 所有章节侧边栏链接更新
|
||||
- 24-25章衔接修正
|
||||
|
||||
---
|
||||
|
||||
*记录时间:2026-03-24 20:55*
|
||||
253
memory/2026-03-25.md
Normal file
253
memory/2026-03-25.md
Normal file
@ -0,0 +1,253 @@
|
||||
<!-- tags: 小说创作 阿拉德 第29-33章 后宫剧情 -->
|
||||
|
||||
# 2026-03-25 小说创作记录
|
||||
|
||||
## 今日完成章节
|
||||
|
||||
### 第29章:阿法利亚营地
|
||||
- 林克抵达阿法利亚营地,见到克伦特
|
||||
- 接受调查诺伊佩拉传染病任务
|
||||
- 后宫修罗场:赛丽亚和奥菲利亚争宠
|
||||
- 深夜帐篷同眠,赛丽亚偷溜进被窝
|
||||
|
||||
### 第30章:浅栖之地
|
||||
- 探索地下墓地,击败怨恨之摩根
|
||||
- BOSS技能:死亡诅咒、爆炸骷髅头
|
||||
- 摩根笔记揭露夏普伦长老阴谋
|
||||
- 后宫和解:赛丽亚接纳奥菲利亚
|
||||
|
||||
### 第31章:蜘蛛洞穴
|
||||
- 首次实战使用猛龙断空斩(40级技能)
|
||||
- 击败BOSS艾克洛索
|
||||
- BOSS技能:蜘蛛导弹、喷射蛛网、钻地突击
|
||||
- 林克升级到Lv.50
|
||||
|
||||
### 第32章:克伦特的委托
|
||||
- 向克伦特汇报,接受收集四把钥匙任务
|
||||
- 四骷髅将军:左翼(火焰)、右翼(冰冻)、前爪(速度)、尾刺(剧毒)
|
||||
- 深夜赛丽亚告白"我爱你"
|
||||
- 奥菲利亚默默接受现实
|
||||
|
||||
### 第33章:暗精灵墓地·左翼守卫
|
||||
- 击败火焰骷髅将军,获得第一把钥匙
|
||||
- 猛龙断空斩·改升级,一击必杀
|
||||
- **奥菲利亚献身啪啪剧情**
|
||||
- 赛丽亚大度接纳,后宫正式确立(姐妹相称)
|
||||
|
||||
## Bug修复
|
||||
|
||||
### 第30章修正
|
||||
- 修正克伦特出现在地图内的错误(改为奥菲利亚惊呼)
|
||||
- 维加离队处理:第28章增加维加告别剧情,回天帷巨兽重建GBL教
|
||||
- 第30章删除所有维加戏份
|
||||
|
||||
## 后宫状态更新
|
||||
|
||||
| 角色 | 地位 | 亲密程度 |
|
||||
|------|------|----------|
|
||||
| 赛丽亚 | 正宫(姐姐) | 已啪啪 ✅ |
|
||||
| 奥菲利亚 | 侧室(妹妹) | 已啪啪 ✅ |
|
||||
| 莎兰 | 暧昧对象 | **已亲吻** ✅ |
|
||||
| 帕丽丝 | 后宫预定 | 待登场 |
|
||||
|
||||
### 第34章:暗精灵墓地·剩余三将军(已完成)
|
||||
- 击败冰冻骷髅将军库拉德(右翼)
|
||||
- 击败速度骷髅将军斯扎克(前爪)
|
||||
- 击败剧毒骷髅将军骸德(尾刺)
|
||||
- 圣骑士艾伦补回戏份(圣光支援)
|
||||
- 集齐四把钥匙
|
||||
|
||||
### 第35章:邪龙斯皮兹(已完成)
|
||||
- 用四把钥匙解开封印,击败远古邪龙
|
||||
- 晨曦觉醒龙之力,发动"猛龙断空斩·极"
|
||||
- 大长老夏普伦现身助阵
|
||||
- 艾伦圣光护盾克制毒雾
|
||||
- 暗精灵墓地篇完结
|
||||
|
||||
### 第36章:莎兰的探望(已完成)
|
||||
- 击败邪龙后回到西海岸休整
|
||||
- 莎兰深夜单独约见林克
|
||||
- **暧昧剧情:月光下的红酒、亲吻**
|
||||
- 赛丽亚察觉但大度包容
|
||||
- 莎兰关系升级(暧昧对象→已亲吻)
|
||||
| 帕丽丝 | 后宫预定 | 待啪啪 |
|
||||
|
||||
### 第34章:暗精灵墓地·剩余三将军(已完成)
|
||||
- 击败冰冻骷髅将军库拉德(右翼)
|
||||
- 击败速度骷髅将军斯扎克(前爪)
|
||||
- 击败剧毒骷髅将军骸德(尾刺)
|
||||
- 集齐四把钥匙,准备进入暗影迷宫
|
||||
|
||||
## 当前进度
|
||||
|
||||
| 章节 | 地图 | 等级 | 状态 |
|
||||
|------|------|------|------|
|
||||
| 第29章 | 阿法利亚营地 | Lv.46-48 | ✅ |
|
||||
| 第30章 | 浅栖之地 | Lv.46-49 | ✅ |
|
||||
| 第31章 | 蜘蛛洞穴 | Lv.48-51 | ✅ |
|
||||
| 第32章 | 克伦特的委托 | Lv.49-51 | ✅ |
|
||||
| 第33章 | 暗精灵墓地·左翼守卫 | Lv.50-52 | ✅ |
|
||||
| 第34章 | 暗精灵墓地·剩余三将军 | Lv.50-52 | ✅ |
|
||||
| 第35章 | 邪龙斯皮兹 | Lv.50-52 | ✅ |
|
||||
| 第36章 | 莎兰的探望 | Lv.52 | ✅ |
|
||||
| 第37章 | 暗影迷宫·影子剑士 | Lv.52-55 | ✅ |
|
||||
| 第38章 | 熔岩穴·泰坦之怒 | Lv.55-58 | ✅ |
|
||||
| 第39章 | 暗黑城入口·无头骑士 | Lv.58 | ✅ |
|
||||
| 第40章 | 万年雪山·冰心少年 | Lv.58 | ✅ |
|
||||
| 第41章 | 敏泰的加入 | Lv.58 | ✅ |
|
||||
| 第42章 | 山脊·野兽师 | Lv.58 | ✅ |
|
||||
| 第43章 | 番外·雪山温泉 | Lv.58 | ✅ |
|
||||
|
||||
**当前等级**:Lv.58
|
||||
|
||||
### 第43章:番外·雪山温泉(新增)
|
||||
- 赛丽亚提议去班图族温泉疗伤
|
||||
- 租用私人温泉池
|
||||
- 赛丽亚准备薄纱浴衣(敏泰无衣物)
|
||||
- **敏泰献身剧情:**
|
||||
- 赛丽亚引导敏泰主动
|
||||
- 敏泰湿透浴衣滑落,表白献身
|
||||
- 赛丽亚:"今晚,我们一起陪你"
|
||||
- 三人温泉亲密,赛丽亚指导敏泰
|
||||
- 敏泰成为林克的女人
|
||||
- 敏泰正式加入后宫,赛丽亚接纳为妹妹
|
||||
|
||||
### 第42章:山脊·野兽师(新增)
|
||||
- 前往山脊,地势险峻,风雪交加
|
||||
- **BOSS战**:野兽师鲁乌格(半人半兽)
|
||||
- 毛皮厚实,防御极高
|
||||
- 弱点在脖子(无毛发保护)
|
||||
- 敏泰感知弱点,赛丽亚为救敏泰受伤
|
||||
- 林克愤怒爆发:流心·刺→拔刀斩→封印
|
||||
- 赛丽亚受伤,回营地治疗
|
||||
- **后宫剧情**:
|
||||
- 深夜帐篷,赛丽亚与敏泰独处
|
||||
- 赛丽亚问敏泰是否喜欢林克
|
||||
- **赛丽亚推敏泰**:"我可以教你...如何取悦他"
|
||||
- 敏泰脸红答应:"拜托姐姐了..."
|
||||
- 建立后宫联盟,敏泰正式加入后宫
|
||||
|
||||
### 第41章:敏泰的加入(新增)
|
||||
- 布万加带林克见敏泰(班图族萨满,娇小少女)
|
||||
- 敏泰见过冰龙,能感知其动向
|
||||
- **艾伦退场**:返回赫顿玛尔向圣骑士团汇报
|
||||
- **奥菲利亚转后勤**:照顾查理、研究资料
|
||||
- **新队伍**:林克、赛丽亚、敏泰(三人)
|
||||
- **敏泰加入队伍**,感知冰精灵王核心
|
||||
- **BOSS战**:冰精灵王(利库天井)
|
||||
- 林克技能轮换:里·鬼剑术→流心→拔刀斩→破军升龙击
|
||||
- 拔刀斩首次实战:范围斩击,打断修复
|
||||
- 敏泰封印核心,获得寒冰护符材料
|
||||
- 敏泰对林克产生好感,后宫+1预定
|
||||
|
||||
### 第40章:万年雪山·冰心少年(新增)
|
||||
- 收到班图族求救信,前往万年雪山
|
||||
- 抵达班图族营地,遭遇极寒环境
|
||||
- **新武器:细雪之舞**(太刀,冰属性,商店购买)
|
||||
- 布万加指导班图族剑术:以柔克刚,寻找缝隙
|
||||
- **BOSS战**:冰心少年查理(被冰龙侵蚀)
|
||||
- **新模式:团队配合制服,不是一击必杀**
|
||||
- 林克:幻影剑舞·改(震荡打断冰龙之力)
|
||||
- 艾伦:圣光净化
|
||||
- 赛丽亚:水精灵之链控制
|
||||
- 奥菲利亚:解冻药剂辅助
|
||||
- 查理恢复理智,揭示冰龙威胁
|
||||
- 预告:敏泰登场(布万加女儿,最强萨满)
|
||||
|
||||
### 第39章:暗黑城入口·无头骑士(新增)
|
||||
- 林克返回赫顿玛尔向GSD请教
|
||||
- **学习45级技能:幻影剑舞**
|
||||
- GSD教导:剑魂精髓在于每一剑的精准与流畅
|
||||
- 幻影剑舞弱点:施展时无法移动
|
||||
- **BOSS战**:无头骑士(补票之战)
|
||||
- 骑马冲锋、践踏、死亡冲锋、骷髅召唤
|
||||
- 无头骑士战斗经验丰富,预判林克动作
|
||||
- 林克首次使用幻影剑舞,金色剑影暴风骤雨
|
||||
- 一击斩落无头骑士,幽蓝魂火熄灭
|
||||
- 通往暗黑城道路畅通,准备前往万年雪山
|
||||
|
||||
### 第38章:熔岩穴·泰坦之怒(新增)
|
||||
- 克伦特紧急传讯:泰坦苏醒,暗黑城危机
|
||||
- 进入熔岩穴深处,高温岩浆环境
|
||||
- **BOSS战**:熔岩巨人泰坦
|
||||
- 岩浆喷射、熔岩之拳、火山爆发、地震
|
||||
- 熔岩护甲高速再生,水系魔法无效
|
||||
- 林克发现胸口白色火焰核心弱点
|
||||
- 赛丽亚水雾牵制,奥菲利亚冰冻药剂配合
|
||||
- 猛龙断空斩·极·改精准刺穿核心
|
||||
- 林克升级至Lv.58,晨曦龙纹更加清晰
|
||||
|
||||
### 第37章:暗影迷宫·影子剑士(新增)
|
||||
- 进入暗黑城深处的暗影迷宫
|
||||
- 四人小队破解迷宫幻术
|
||||
- **BOSS战**:影子剑士刹影
|
||||
- 暗影斩、影分身、暗影突袭、暗影领域
|
||||
- 艾伦圣光牵制,林克光之剑对决暗影之剑
|
||||
- 晨曦龙之力觉醒,猛龙断空斩·极净化刹影
|
||||
- 刹影解脱,迷宫危机解除
|
||||
|
||||
## 下章预告
|
||||
- 第38章:熔岩穴(Lv.53-56),火属性地图
|
||||
- 或:诺斯玛尔篇开启,帕丽丝登场
|
||||
|
||||
### 第35章:邪龙斯皮兹(新增)
|
||||
- 用四把钥匙解开封印,进入封印之地
|
||||
- 遭遇远古邪龙斯皮兹的骸骨
|
||||
- **BOSS战**:毒龙吐息、骨刺突击、龙翼横扫、召唤骷髅
|
||||
- 晨曦觉醒远古龙之力,发动"猛龙断空斩·极"
|
||||
- 大长老夏普伦现身助阵,加强封印限制邪龙
|
||||
- 最终一击彻底消灭邪龙斯皮兹
|
||||
- 暗精灵墓地篇完结,获得暗精灵一族的友谊
|
||||
|
||||
## 下章预告
|
||||
- 第36章:暗影迷宫(Lv.52-55),BOSS影子剑士刹影
|
||||
- 第37章:阿法利亚后续地图
|
||||
|
||||
---
|
||||
---
|
||||
|
||||
## 网站重构(今日完成)
|
||||
|
||||
### 架构变更
|
||||
- **旧架构**:每个章节单独HTML文件
|
||||
- **新架构**:JSON数据 + 通用阅读器(reader.html?id=XX)
|
||||
- 创建 `data/chapter-01.json` ~ `data/chapter-34.json`
|
||||
- 创建 `data/chapters.json` 索引文件
|
||||
- 实现 `reader.html` 通用阅读器
|
||||
|
||||
### 功能优化
|
||||
- 侧边栏导航:固定标题"章节导航",自动滚动到当前章节
|
||||
- 滚动条:默认隐藏,hover时显示
|
||||
- 主题切换:支持暗黑/明亮模式
|
||||
- JSON格式:纯文本存储,阅读器自动转HTML
|
||||
|
||||
### Bug修复记录
|
||||
1. **第32章误删事件**:删除`<div class="chapter-meta">`时误删正文,紧急恢复
|
||||
2. **第34章衔接问题**:开头重复写"第二天醒来",已修正为直接承接33章结尾
|
||||
3. **段落分割**:JSON单换行导致无分段,已修复阅读器分割逻辑
|
||||
|
||||
### 复盘记录
|
||||
- 触发三省吾身复盘
|
||||
- 核心问题:不确认需求、不验证操作、规则记忆不牢
|
||||
- 改进计划:需求复述、操作验证、交付前自查
|
||||
|
||||
## Bug修复记录
|
||||
|
||||
### 第41章修正(2026-03-25 15:16)
|
||||
- **问题**:第41章错误描述"拔刀斩首次实战"
|
||||
- **修正**:删除"这是他第一次在实战中使用这个技能!"
|
||||
- **改为**:"拔刀斩的冰冻效果正好克制冰精灵的修复!"
|
||||
- **原因**:前面章节已多次使用拔刀斩,避免前后矛盾
|
||||
|
||||
## 后宫状态更新(最新)
|
||||
|
||||
| 角色 | 地位 | 亲密程度 |
|
||||
|------|------|----------|
|
||||
| 赛丽亚 | 正宫(姐姐) | 已啪啪 ✅ |
|
||||
| 奥菲利亚 | 侧室(妹妹/后勤) | 已啪啪 ✅ |
|
||||
| **敏泰** | **侧室(妹妹)** | **已献身 ✅** |
|
||||
| 莎兰 | 暧昧对象 | 已亲吻 ✅ |
|
||||
| 帕丽丝 | 后宫预定 | 待登场 |
|
||||
|
||||
---
|
||||
*记录时间: 2026-03-25*
|
||||
623
novels/alard/chapter5.md
Normal file
623
novels/alard/chapter5.md
Normal file
@ -0,0 +1,623 @@
|
||||
# 第五章:雷鸣废墟
|
||||
|
||||
## 本章概要
|
||||
- **核心事件**:林克前往雷鸣废墟挑战闪电哥布林,在雷电危机中领悟新的战斗技巧
|
||||
- **承接上章**:林克初次觉醒卡赞诅咒力量,但险些失控
|
||||
- **悬念钩子**:神秘身影的真正身份逐渐浮出水面
|
||||
|
||||
---
|
||||
|
||||
一个月后。
|
||||
|
||||
林克站在艾尔文防线的边缘,看着远处被雷电笼罩的区域。
|
||||
|
||||
"那里就是雷鸣废墟。"阿甘左站在他身后,"闪电哥布林的领地。"
|
||||
|
||||
"我能感觉到。"林克眯起眼睛,"空气中有电流的气息。"
|
||||
|
||||
这一个月里,他每天都在进行高强度的训练。挥剑、闪避、体能,然后再挥剑、再闪避、再体能。循环往复,永无止境。
|
||||
|
||||
但他从不抱怨。
|
||||
|
||||
因为每一次训练,他都能感觉到自己在变强。体内的诅咒力量也不再像之前那样狂暴,而是逐渐变得温顺,像是一头被驯服的野兽。
|
||||
|
||||
当然,这只是假象。
|
||||
|
||||
"你在雷鸣废墟里要小心。"阿甘左说,"闪电哥布林和猫妖王不同。它们不会和你近身搏斗,而是会利用雷电进行远程攻击。"
|
||||
|
||||
"远程?"林克皱眉,"那怎么打?"
|
||||
|
||||
"靠近它们。"阿甘左淡淡地说,"在它们放电之前,靠近,然后砍死它们。"
|
||||
|
||||
林克:"……"
|
||||
|
||||
师父总是能把复杂的事情说得这么简单。
|
||||
|
||||
"去吧。"阿甘左转身,"我会在这里等你。如果你死了,我会帮你收尸。"
|
||||
|
||||
"……"林克嘴角抽搐,"师父,你就不能说点好听的?"
|
||||
|
||||
"不能。"阿甘左头也不回,"活着回来请你喝酒。"
|
||||
|
||||
林克笑了笑,握紧太刀,走向雷鸣废墟。
|
||||
|
||||
---
|
||||
|
||||
雷鸣废墟比他想象中还要诡异。
|
||||
|
||||
天空永远笼罩着乌云,闪电在云层中不断闪烁。空气中弥漫着一股臭氧的味道,刺激着他的鼻腔。地面是焦黑色的,仿佛被雷电常年轰炸过,到处都是深浅不一的坑洞。
|
||||
|
||||
"噼啪——"
|
||||
|
||||
一道闪电从天而降,落在林克前方不到十米的地方。
|
||||
|
||||
他本能地举起太刀护在身前,闪电的余波让他的手臂微微发麻。
|
||||
|
||||
"这就是闪电哥布林的领地……"
|
||||
|
||||
林克警惕地看着四周,缓慢前行。
|
||||
|
||||
这里的能见度很低,闪电的光芒每隔几秒就会照亮整个废墟,但也仅仅是一瞬间。在那短暂的光亮中,林克能看到废墟中游荡的身影。
|
||||
|
||||
哥布林。
|
||||
|
||||
到处都是哥布林。
|
||||
|
||||
它们和外面的普通哥布林不同,身体呈灰蓝色,皮肤像是被雷电劈焦了一样。手中的木棒顶端镶嵌着蓝色的水晶球,不断闪烁着电光。
|
||||
|
||||
"闪电哥布林……"
|
||||
|
||||
林克数了一下,至少有二十只。
|
||||
|
||||
这还是他能看到的。在这片废墟里,不知道还有多少隐藏在暗处。
|
||||
|
||||
他深吸一口气,缓慢地拔出太刀。
|
||||
|
||||
"只能硬闯了。"
|
||||
|
||||
---
|
||||
|
||||
第一步踏出,战斗瞬间打响。
|
||||
|
||||
"嘎——!"
|
||||
|
||||
一只闪电哥布林发现了林克,发出了刺耳的尖叫。
|
||||
|
||||
几乎是同时,二十多只闪电哥布林同时转向他,眼中闪烁着嗜血的光芒。
|
||||
|
||||
"噼里啪啦——!"
|
||||
|
||||
蓝色的电光从它们手中的水晶球中迸发而出,汇聚成一道道闪电链,像是群蛇乱舞般向林克劈来。
|
||||
|
||||
"太快了!"
|
||||
|
||||
林克咬牙,身体一侧,险之又险地躲过第一道闪电。但第二道、第三道闪电紧随其后,让他避无可避。
|
||||
|
||||
"轰——!"
|
||||
|
||||
闪电击中了他的肩膀。
|
||||
|
||||
剧烈的疼痛从肩膀蔓延开来,林克感觉整条手臂都失去了知觉。他的身体被电流击中,不由自主地颤抖起来。
|
||||
|
||||
"嘎嘎嘎!"
|
||||
|
||||
闪电哥布林们发出刺耳的笑声,手中的水晶球再次亮起。
|
||||
|
||||
"还没完呢……"
|
||||
|
||||
林克咬紧牙关,强忍着手臂的疼痛,身体猛然前冲。
|
||||
|
||||
既然躲不掉,那就冲上去。
|
||||
|
||||
他的速度很快,闪电哥布林们显然没想到他挨了一击还能冲锋,动作慢了半拍。
|
||||
|
||||
"唰——!"
|
||||
|
||||
太刀划过一只闪电哥布林的脖子。
|
||||
|
||||
那只哥布林的头颅冲天而起,无头的身体抽搐着倒在地上。
|
||||
|
||||
但不等林克喘息,又是两道闪电劈来。
|
||||
|
||||
"咔嚓——!"
|
||||
|
||||
他翻滚着躲开,但左腿还是被擦中,整个人摔在地上。
|
||||
|
||||
"嘎!"
|
||||
|
||||
一只体型格外庞大的闪电哥布林跳了过来,手中举着冒着电光的木棒,对准林克的脑袋狠狠砸下。
|
||||
|
||||
"糟糕……"
|
||||
|
||||
林克想要躲避,但腿上的伤让他动作变得迟缓。
|
||||
|
||||
就在这时——
|
||||
|
||||
"噼啪!"
|
||||
|
||||
一道蓝色闪电从天而降,准确地命中了那只哥布林。
|
||||
|
||||
它甚至来不及发出惨叫声,就变成了一具焦尸。
|
||||
|
||||
林克愣了一下,抬起头。
|
||||
|
||||
天空中的乌云在翻滚,一道道闪电不断落下,但不知为何,那些闪电都在避开他所在的位置。
|
||||
|
||||
"怎么回事?"
|
||||
|
||||
他警惕地站起身,环顾四周。
|
||||
|
||||
然后,他看到了它。
|
||||
|
||||
---
|
||||
|
||||
那是一只哥布林。
|
||||
|
||||
但和其他闪电哥布林不同,它的体型更加庞大,身高超过三米,浑身的皮肤呈深蓝色,像是蕴含着无穷的雷电能量。它的眼睛是银白色的,瞳孔中不断有电光闪烁。最引人注目的是它头顶的角——两根螺旋形的蓝色水晶角,不断向外散发着噼里啪啦的电火花。
|
||||
|
||||
"闪电哥布林王……"
|
||||
|
||||
林克握紧太刀,体内诅咒力量开始运转。
|
||||
|
||||
这是他面对过的最强敌人。
|
||||
|
||||
闪电哥布林王举起手中的法杖,指向林克。
|
||||
|
||||
"嘎……"
|
||||
|
||||
它的声音低沉而嘶哑,像是两块金属在摩擦。
|
||||
|
||||
"人类……闯进领地……死!"
|
||||
|
||||
最后一个字落下的瞬间,它身上的电光猛然爆发。
|
||||
|
||||
"噼里啪啦——!!!"
|
||||
|
||||
以闪电哥布林王为中心,恐怖的雷电之力向四周扩散。林克甚至来不及反应,就被这道雷电击中,整个人飞出去十几米远。
|
||||
|
||||
"咳……"
|
||||
|
||||
他重重地摔在地上,嘴里喷出一口鲜血。
|
||||
|
||||
体内的五脏六腑像是被雷击一样,疼得他几乎昏厥。
|
||||
|
||||
但他不能昏。
|
||||
|
||||
如果在这里昏倒,就死定了。
|
||||
|
||||
林克艰难地抬起头,看着缓缓走近的闪电哥布林王。
|
||||
|
||||
"卡赞……"
|
||||
|
||||
他喃喃自语,体内的诅咒力量开始沸腾。
|
||||
|
||||
"借我力量……"
|
||||
|
||||
---
|
||||
|
||||
血色的光芒在他眼中亮起。
|
||||
|
||||
但就在这时——
|
||||
|
||||
"等等。"
|
||||
|
||||
一个声音在他脑海中响起。
|
||||
|
||||
那不是卡赞的声音。卡赞的声音是沙哑、低沉、充满杀意的。而这个声音……很轻,很柔和,像是从很远的地方传来,又像是就在耳边。
|
||||
|
||||
"你是谁?"
|
||||
|
||||
林克在心里问道。
|
||||
|
||||
"我是谁不重要。"那个声音说,"重要的是,你不需要依靠那股力量。"
|
||||
|
||||
"什么意思?"
|
||||
|
||||
"雷电……"那个声音说,"雷电也是一种力量。既然你无法完全控制卡赞的力量,为什么不尝试另一种?"
|
||||
|
||||
"另一种?"林克愣住了,"你是说……雷电?"
|
||||
|
||||
"感受它。"
|
||||
|
||||
那个声音落下的瞬间,林克突然感觉到周围的空气变了。
|
||||
|
||||
不,不是空气。
|
||||
|
||||
是电场。
|
||||
|
||||
他能够感觉到空气中游离的电子,能够感觉到云层中蕴藏的雷电能量。它们像是无数细小的溪流,在天地间流淌。
|
||||
|
||||
"这就是……雷电?"
|
||||
|
||||
林克缓缓站起身。
|
||||
|
||||
很奇怪,刚才还被电击得站不起来的身体,现在却感觉不到疼痛了。不是疼痛消失了,而是……他能够感觉到电流的流动,能够预测它们的方向。
|
||||
|
||||
"嘎?"
|
||||
|
||||
闪电哥布林王显然没想到林克还能站起来,愣了一下。
|
||||
|
||||
然后,它再次举起法杖。
|
||||
|
||||
"去死——!"
|
||||
|
||||
恐怖雷电脱鞘而出,直奔林克。
|
||||
|
||||
但这一次,林克动了。
|
||||
|
||||
他的身体以肉眼难以捕捉的速度侧移,险之又险地避开了雷电。雷电从他身侧掠过,连他的衣角都没有碰到。
|
||||
|
||||
"怎么可能……"
|
||||
|
||||
闪电哥布林王的声音中带着一丝恐惧。
|
||||
|
||||
"没什么不可能。"
|
||||
|
||||
林克抬起手,指向天空。
|
||||
|
||||
"既然你能召唤雷电……"
|
||||
|
||||
他缓缓握拳。
|
||||
|
||||
"那我就让你看看,什么才是真正的雷电。"
|
||||
|
||||
---
|
||||
|
||||
"噼里啪啦——!!!"
|
||||
|
||||
天空中的乌云猛然翻滚,一道比闪电哥布林王召唤的雷电还要粗壮十倍的闪电从天而降,精准地命中了闪电哥布林王。
|
||||
|
||||
不,不是命中。
|
||||
|
||||
是吸收。
|
||||
|
||||
林克在那一瞬间感觉自己仿佛化身为雷电的导体。他不是在使用雷电,而是……在命令雷电。
|
||||
|
||||
这是怎么回事?
|
||||
|
||||
他不知道。
|
||||
|
||||
但他没有时间去想,因为闪电哥布林王在挨了这一击后并没有倒下,反而变得更加狂暴。
|
||||
|
||||
"嘎嘎嘎!!!"
|
||||
|
||||
它的身体开始膨胀,皮肤下的血管一根根凸起,闪烁着蓝色的电光。
|
||||
|
||||
"这是……"
|
||||
|
||||
林克瞳孔一缩。
|
||||
|
||||
它在透支生命来换取更强的力量。
|
||||
|
||||
"人类……你惹怒我了……"
|
||||
|
||||
闪电哥布林王的声音变得尖锐,它的的身体漂浮在半空中,四根水晶角同时亮起。
|
||||
|
||||
"我要你死——!!!"
|
||||
|
||||
"噼里啪啦——!!!"
|
||||
|
||||
这一次,不再是一道雷电。
|
||||
|
||||
而是无数道。
|
||||
|
||||
整个雷鸣废墟的雷电仿佛都被它召集而来,化作一片雷电的海洋,将林克完全笼罩。
|
||||
|
||||
"这次……"
|
||||
|
||||
林克深吸一口气。
|
||||
|
||||
"真的完了。"
|
||||
|
||||
---
|
||||
|
||||
但就在这时——
|
||||
|
||||
"林克!"
|
||||
|
||||
一个熟悉的声音从远处传来。
|
||||
|
||||
林克艰难地转过头,看到赛丽亚正站在废墟的边缘,脸上满是泪痕。
|
||||
|
||||
"赛丽亚?!"
|
||||
|
||||
他难以置信,"你怎么来了?"
|
||||
|
||||
"废话!"赛丽亚哭着喊道,"我听说你来雷鸣废墟了!你知不知道这里有多危险!"
|
||||
|
||||
"我……"
|
||||
|
||||
林克想要解释,但现在不是时候。
|
||||
|
||||
"小心!"
|
||||
|
||||
赛丽亚突然尖叫起来。
|
||||
|
||||
林克回过头,闪电哥布林王的攻击已经到了。
|
||||
|
||||
"去死吧——!!!"
|
||||
|
||||
无数道雷电汇聚成一道直径超过十米的巨大雷柱,携带着毁天灭地的威势,向林克劈来。
|
||||
|
||||
"完了……"
|
||||
|
||||
林克闭上眼睛。
|
||||
|
||||
但就在这千钧一发之际——
|
||||
|
||||
"啪!"
|
||||
|
||||
一声轻响。
|
||||
|
||||
然后是一阵地动山摇的爆炸。
|
||||
|
||||
"轰——!!!"
|
||||
|
||||
林克感觉到一股巨大的冲击力整个人掀飞出去。他在地面上翻滚了几十圈,最后撞在一块巨石上,才停下来。
|
||||
|
||||
"咳……"
|
||||
|
||||
他吐出一口鲜血,艰难地睁开眼睛。
|
||||
|
||||
然后,他看到了让他终生难忘的景象。
|
||||
|
||||
---
|
||||
|
||||
雷鸣废墟的中心,出现了一个直径超过三十米的巨坑。
|
||||
|
||||
坑底焦黑一片,还冒着缕缕青烟。
|
||||
|
||||
而在巨坑的中央,闪电哥布林王正跪在地上——不,是瘫在地上。它的身体焦黑一片,不断抽搐着,眼看是活不成了。
|
||||
|
||||
"这……"
|
||||
|
||||
林克愣住了。
|
||||
|
||||
发生了什么?
|
||||
|
||||
"林克!"
|
||||
|
||||
赛丽亚冲了过来,扑进他怀里。
|
||||
|
||||
"你没事吧?你没事吧?"
|
||||
|
||||
"我……"林克想要说什么,但话到嘴边却说不出口。
|
||||
|
||||
他看着怀中的赛丽亚,心里涌起一种复杂的情绪。
|
||||
|
||||
"你怎么来了?"他问,"这里很危险……"
|
||||
|
||||
"我知道危险!"赛丽亚抬起头,泪眼婆娑地看着他,"但我不能看着你一个人面对危险……"
|
||||
|
||||
林克沉默了。
|
||||
|
||||
他不知道该说什么。
|
||||
|
||||
"咳……"
|
||||
|
||||
就在这时,巨坑中传来一声咳嗽。
|
||||
|
||||
闪电哥布林王还没死。
|
||||
|
||||
"人类……"
|
||||
|
||||
它的声音变得极其微弱,但其中的恨意却让人不寒而栗。
|
||||
|
||||
"我不会放过你的……就算我死了……我的灵魂也会诅咒你……"
|
||||
|
||||
"那就去死吧。"
|
||||
|
||||
林克站起身,缓慢地走向闪电哥布林王。
|
||||
|
||||
"你的诅咒……对我无效。"
|
||||
|
||||
他举起太刀。
|
||||
|
||||
"因为我已经被诅咒了。"
|
||||
|
||||
"噗嗤——!"
|
||||
|
||||
刀光闪过,闪电哥布林王的头颅滚落地上。
|
||||
|
||||
,至此彻底死亡。
|
||||
|
||||
---
|
||||
|
||||
红色的光芒从林克眼中褪去。
|
||||
|
||||
他跪在地上,大口大口地喘着气。刚才那一刀,几乎耗尽了他全部的体力。
|
||||
|
||||
"林克!"
|
||||
|
||||
赛丽亚跑过来,扶住他。
|
||||
|
||||
"你怎么样?没事吧?"
|
||||
|
||||
"我没事。"林克勉强笑了笑,"这次真的赢了。"
|
||||
|
||||
"每次都说没事……"赛丽亚的眼泪又掉了下来,"你知不知道刚才有多危险?如果你死了……如果你死了我……"
|
||||
|
||||
她哽咽着说不出话来。
|
||||
|
||||
林克抬起手,轻轻擦去她脸上的泪水。
|
||||
|
||||
"对不起。"他说,"让你担心了。"
|
||||
|
||||
赛丽亚看着他,泪眼婆娑。
|
||||
|
||||
"你每次都说对不起……"
|
||||
|
||||
"但下次还是会这样。"
|
||||
|
||||
林克接道,苦笑着点了点头。
|
||||
|
||||
"因为我必须变强。"
|
||||
|
||||
赛丽亚沉默了。
|
||||
|
||||
她知道林克的过去,知道他背负的东西有多沉重。
|
||||
|
||||
"我明白。"她轻声说,"但答应我一件事。"
|
||||
|
||||
"什么?"
|
||||
|
||||
"下次……下次带上我,好不好?"
|
||||
|
||||
林克愣住了。
|
||||
|
||||
"带你?"
|
||||
|
||||
"嗯。"赛丽亚点点头,"我虽然是普通人,但我不想成为你的负担。我想……我想帮到你。"
|
||||
|
||||
林克看着她坚定的眼神,心里涌起一股暖流。
|
||||
|
||||
"好。"他说,"我答应你。"
|
||||
|
||||
---
|
||||
|
||||
回到艾尔文防线时,天已经黑了。
|
||||
|
||||
阿甘左站在防线入口,看着两人并肩走来,脸上闪过一丝不易察觉的笑容。
|
||||
|
||||
"回来了。"他说。
|
||||
|
||||
"嗯。"林克点点头,"师父,我……"
|
||||
|
||||
"不用说了。"阿甘左打断他,"我都知道了。"
|
||||
|
||||
"知道?"
|
||||
|
||||
"雷鸣废墟那边的情况。"阿甘左说,"雷电突然失控,整片废墟都被夷为平地。所有人都以为是天气原因,但我知道,是你做的。"
|
||||
|
||||
林克沉默了。
|
||||
|
||||
"那股力量……"他犹豫了一下,"我到现在还不明白是怎么回事。"
|
||||
|
||||
"你不需要明白。"阿甘左说,"有些力量是与生俱来的。你体内流淌着卡赞的血脉,也流淌着雷电的意志。"
|
||||
|
||||
"雷电的意志?"
|
||||
|
||||
"传说中,卡赞并非只有一把武器。"阿甘左淡淡地说,"他还有一对分身,分别代表着毁灭与守护。而雷电……是毁灭的象征。"
|
||||
|
||||
林克愣住了。
|
||||
|
||||
"师父,你是说……"
|
||||
|
||||
"有些事,以后再说吧。"阿甘左转身,"你们先回去休息。明天开始,进行新的训练。"
|
||||
|
||||
"新的训练?"
|
||||
|
||||
"嗯。"阿甘左回头看了他一眼,"你需要学会控制两股力量。卡赞的诅咒,还有……雷电。"
|
||||
|
||||
林克看着师父的背影,心里充满了疑问。
|
||||
|
||||
但他没有追问。
|
||||
|
||||
因为总有一天,他会知道所有的真相。
|
||||
|
||||
---
|
||||
|
||||
夜晚,林克坐在赛丽亚旅馆的屋顶上,看着满天的星斗。
|
||||
|
||||
今天发生的事在他脑海中不断回放。
|
||||
|
||||
雷电的力量、那个在他脑海中说话的声音、赛丽亚为他冒死前来……
|
||||
|
||||
"林克。"
|
||||
|
||||
赛丽亚的声音从身后传来。
|
||||
|
||||
"嗯?"
|
||||
|
||||
她在他身边坐下来,手里端着一杯热茶。
|
||||
|
||||
"在想什么?"
|
||||
|
||||
"在想今天的事。"林克接过茶杯,"那股突然出现的雷电力量……我很确定那不是卡赞的力量。"
|
||||
|
||||
"那就不要想了。"赛丽亚说,"有些事,想太多也没用。顺其自然就好。"
|
||||
|
||||
"顺其自然……"
|
||||
|
||||
林克喃喃自语,抬头看着星空。
|
||||
|
||||
"赛丽亚。"
|
||||
|
||||
"嗯?"
|
||||
|
||||
"谢谢你。"
|
||||
|
||||
"谢我?"
|
||||
|
||||
"谢谢你今天来救我。"林克看着她,"如果不是你来分散了闪电哥布林王的注意力,我可能已经死了。"
|
||||
|
||||
赛丽亚的脸微微红了一下。
|
||||
|
||||
"我是你的朋友嘛。"她说,"朋友之间,不需要说谢谢。"
|
||||
|
||||
"朋友……"
|
||||
|
||||
林克笑了笑,没有说话。
|
||||
|
||||
朋友吗?
|
||||
|
||||
或许吧。
|
||||
|
||||
但他心里清楚,赛丽亚对他的感情,早就已经超越了朋友。
|
||||
|
||||
只是现在的他,还没有资格去回应这份感情。
|
||||
|
||||
因为他还有更重要的事要做。
|
||||
|
||||
"卡赞……"
|
||||
|
||||
他抬起手,看着皮肤下隐约浮现的红色纹路。
|
||||
|
||||
"还有雷电……"
|
||||
|
||||
他能够感觉到,体内有两股力量在涌动。
|
||||
|
||||
一股是红色的,代表着卡赞的诅咒。
|
||||
|
||||
另一股是蓝色的,代表着雷电的意志。
|
||||
|
||||
这两股力量本应水火不容,但现在,它们却在林克体内达成了某种微妙的平衡。
|
||||
|
||||
"总有一天……"
|
||||
|
||||
他握紧拳头。
|
||||
|
||||
"我会掌控所有的力量。"
|
||||
|
||||
---
|
||||
|
||||
与此同时,格兰之森的深处。
|
||||
|
||||
一片漆黑的洞穴中,有一双眼睛正在注视着远方。
|
||||
|
||||
"有意思。"
|
||||
|
||||
那个声音低沉而沙哑。
|
||||
|
||||
"雷电的继承者……还有卡赞的诅咒者……"
|
||||
|
||||
"两者合一,或许……"
|
||||
|
||||
"咯咯咯……"
|
||||
|
||||
笑声在洞穴中回荡,让人毛骨悚然。
|
||||
|
||||
"我越来越期待了……"
|
||||
|
||||
---
|
||||
|
||||
**第五章完**
|
||||
|
||||
---
|
||||
|
||||
## 章节备注
|
||||
|
||||
- **本章亮点**:林克首次领悟雷电之力,与卡赞诅咒形成双力量体系;赛丽亚勇敢救人,感情线进一步发展
|
||||
- **本章悬念**:阿甘左提到的"卡赞分身"是什么?那个在林克脑海中说话的神秘声音是谁?
|
||||
- **下章预告**:斯顿雪域,林克挑战冰霜巨人,遭遇极端冰寒挑战
|
||||
- **伏笔标记**:雷电意志的传承、格兰之森深处的神秘存在,都将在后续章节逐步揭晓
|
||||
652
novels/alard/chapter6.md
Normal file
652
novels/alard/chapter6.md
Normal file
@ -0,0 +1,652 @@
|
||||
# 第六章:格拉卡(第二轮)
|
||||
|
||||
## 本章概要
|
||||
|
||||
- **核心事件**:林克重返格拉卡,挑战牛头王萨乌塔,银光落刃首次登场
|
||||
- **承接上章**:林克在雷鸣废墟领悟雷电之力,但本章需依靠物理技巧取胜
|
||||
- **战斗重点**:流心系列技能配合、银光落刃起手、赛丽亚冰霜支援、阿甘左战术指导
|
||||
|
||||
---
|
||||
|
||||
晨光透过树叶的缝隙洒落在林克脸上,他缓缓睁开眼睛。
|
||||
|
||||
又是新的一天。
|
||||
|
||||
昨天夜里,他几乎没怎么睡。体内那股新觉醒的雷电之力让他既兴奋又不安。那种能够操控自然伟力的感觉实在太过诱人,但如果继续依赖那股力量,他很可能会重蹈卡赞诅咒失控的覆辙。
|
||||
|
||||
“想什么呢?”
|
||||
|
||||
赛丽亚的声音从身后传来。她端着一杯热牛奶走到林克身边坐下,清晨的阳光在她金色的长发上跳跃。
|
||||
|
||||
“在想昨天的事。”林克接过牛奶,“那股雷电的力量……我到现在还不明白是怎么回事。”
|
||||
|
||||
“你不需要明白每一件事。”赛丽亚笑着说,“顺其自然就好。你看,你现在不是好好的吗?”
|
||||
|
||||
林克看着她温暖的笑容,心里涌起一丝安宁。
|
||||
|
||||
“今天有什么安排?”赛丽亚问。
|
||||
|
||||
“师父让我去格拉卡。”
|
||||
|
||||
“格拉卡?”赛丽亚的表情变得担忧,“就是那个……有很多牛头人的地方?”
|
||||
|
||||
“嗯。”林克点点头,“听说那里有一只牛头王,名叫萨乌塔。”
|
||||
|
||||
“你一个人?”
|
||||
|
||||
“还有师父同行。”林克说,“他说要在暗中观察我的战斗,不会轻易出手帮忙。”
|
||||
|
||||
赛丽亚松了口气:“那就好。阿甘左先生虽然看起来冷漠,但其实很关心你的。”
|
||||
|
||||
“他只是履行师父的职责而已。”林克淡淡地说。
|
||||
|
||||
“你啊,就是嘴硬。”赛丽亚无奈地摇头,“明明心里很感激,却总是装得若无其事。”
|
||||
|
||||
林克没有反驳,只是三口两口喝完牛奶,站起身。
|
||||
|
||||
“我走了。”
|
||||
|
||||
“小心点。”赛丽亚叮嘱道,“牛头人的力量很强,正面冲突会很吃亏。你要利用速度和技巧……”
|
||||
|
||||
“我知道。”
|
||||
|
||||
看着林克渐行渐远的背影,赛丽亚的眼中闪过一丝复杂。
|
||||
|
||||
她知道自己的能力有限,根本帮不上什么忙。但她不想再像上次那样,只能在事后才得知林克受伤的消息。
|
||||
|
||||
“必须变强……”
|
||||
|
||||
她握紧小小的拳头,暗暗下定决心。
|
||||
|
||||
---
|
||||
|
||||
格拉卡位于格兰之森的深处,是一片被古老巨树环绕的草原。
|
||||
|
||||
这里生活着大量的牛头人,它们不同于外界的普通牛头怪,而是更加凶猛、更加嗜血。其中最强大的,便是牛头王萨乌塔。
|
||||
|
||||
林克站在草原边缘,看着远处成群结队巡逻的牛头人,脸色凝重。
|
||||
|
||||
这些牛头人比他想象中更加高大,平均身高超过两米,浑身的肌肉像是钢铁浇筑而成。它们手持巨大的战斧和盾牌,动作虽不如人类灵活,但力量却远超常人。
|
||||
|
||||
“一、二、三……”
|
||||
|
||||
林克数了一下,光是他能看到的就有十五只。
|
||||
|
||||
而在草原深处,还不知道隐藏着多少。
|
||||
|
||||
“害怕了?”
|
||||
|
||||
阿甘左的声音从身后传来。
|
||||
|
||||
“只是感到棘手而已。”林克实事求是地说,“这些牛头人的体型太大了,正面碰撞我不是对手。”
|
||||
|
||||
“知道就好。”阿甘左走到他身边,“牛头人是力量型敌人,它们攻击方式简单,但每一击都蕴含着恐怖的力量。你要做的,是避免正面对抗,用速度和技巧消耗它们。”
|
||||
|
||||
“我明白。”
|
||||
|
||||
“还有……”阿甘左的语气变得严肃,“我不希望看到你使用那股雷电的力量。”
|
||||
|
||||
林克愣了一下:“为什么?”
|
||||
|
||||
“那不是属于这个阶段的力量。”阿甘左说,“你体内的卡赞诅咒还没有完全控制,再强行使用雷电之力,只会让情况变得更糟。”
|
||||
|
||||
“但如果没有那股力量,我可能无法战胜萨乌塔……”
|
||||
|
||||
“那就靠你现在的实力。”阿甘左打断他,“流心·刺、流心·跃,还有……银光落刃。”
|
||||
|
||||
林克的眼睛亮了起来:“师父,你的意思是……”
|
||||
|
||||
“那是你在上一场战斗中突破的技能。”阿甘左说,“银光落刃的威力,足以对萨乌塔造成威胁。前提是,你能在正确的时机使用它。”
|
||||
|
||||
“我明白了。”
|
||||
|
||||
“去吧。”阿甘左转身走向一棵树,“我会在这里看着你。记住,除非你真的遇到生命危险,否则我不会出手。”
|
||||
|
||||
林克深吸一口气,拔出太刀,走向草原。
|
||||
|
||||
---
|
||||
|
||||
“吼——”
|
||||
|
||||
一只巡逻的牛头人发现了林克,发出了震天的吼声。
|
||||
|
||||
几乎是瞬间,十五只牛头人同时转向他,眼中的嗜血光芒越来越浓。
|
||||
|
||||
“人类……闯进领地……死!”
|
||||
|
||||
为首的一只牛头人举起战斧,率先冲向林克。
|
||||
|
||||
“来得好!”
|
||||
|
||||
林克不退反进,身体紧绷如弦,瞬间冲了出去。
|
||||
|
||||
“流心·刺!”
|
||||
|
||||
太刀在空中划出一道银色的弧线,直取牛头人的咽喉。
|
||||
|
||||
“噗嗤——”
|
||||
|
||||
刀光闪过,牛头人的脖子出现一道深可见骨的伤口,鲜血喷涌而出。
|
||||
|
||||
但牛头人的生命力极其顽强,即使挨了这一刀,仍然没有倒下,反而更加狂暴地挥动战斧。
|
||||
|
||||
“吼——”
|
||||
|
||||
巨大的斧头带着呼啸的风声砸向林克。
|
||||
|
||||
“危险!”
|
||||
|
||||
林克就地一滚,险之又险地避开这一击。战斧砸在地面上,扬起一片尘土。
|
||||
|
||||
“好强的力量……”
|
||||
|
||||
他暗自心惊,刚才那一斧如果命中,他绝对会重伤。
|
||||
|
||||
“不能恋战。”
|
||||
|
||||
林克当机立断,不再与这只牛头人纠缠,而是身形一闪,冲向另一只。
|
||||
|
||||
“流心·跃!”
|
||||
|
||||
他的身体高高跃起,从牛头人头顶越过,太刀在转身的瞬间划过另一只牛头人的后背。
|
||||
|
||||
“吼——”
|
||||
|
||||
那只牛头人发出痛苦的咆哮,但林克已经借着力道远去。
|
||||
|
||||
这就是流心·跃的妙用——不仅可以用来进攻,更是绝佳的位移技能。
|
||||
|
||||
“嘎——”
|
||||
|
||||
就在林克落地的一瞬间,两只牛头人从两侧夹击而来,巨大的战斧一左一右封死了他的所有退路。
|
||||
|
||||
“糟糕!”
|
||||
|
||||
林克咬紧牙关,身体猛然下沉。
|
||||
|
||||
“刺啦——”
|
||||
|
||||
两只战斧在他头顶交错划过,削断了几缕发丝。
|
||||
|
||||
“好险……”
|
||||
|
||||
他不敢怠慢,立刻使出流心·刺,身体像离弦之箭般冲向其中一只牛头人。
|
||||
|
||||
“噗嗤——”
|
||||
|
||||
太刀刺入那只牛头人的眼睛,疼得它惨嚎起来。
|
||||
|
||||
但林克没有继续攻击,而是借助这个冲击力,快速脱离战场。
|
||||
|
||||
“这样下去不是办法……”
|
||||
|
||||
他一边奔跑一边思考。
|
||||
|
||||
这些牛头人皮糙肉厚,正面攻击很难造成致命伤害。但如果继续这样游击下去,体力会被耗尽。
|
||||
|
||||
“必须找出它们的弱点……”
|
||||
|
||||
林克一边躲避攻击,一边观察牛头人的动作。
|
||||
|
||||
然后,他发现了。
|
||||
|
||||
每一只牛头人的动作都有微妙的同步性——它们在进攻时会先举起战斧,然后等待片刻才会挥下。这段等待的时间,便是它们的“前摇”动作。
|
||||
|
||||
“原来如此……”
|
||||
|
||||
林克的嘴角浮现一丝笑意。
|
||||
|
||||
只要能抓住这个前摇的时间差进行闪避,就能立于不败之地。
|
||||
|
||||
接下来的战斗,完全变成了林克的个人表演。
|
||||
|
||||
他像一只灵活的蝴蝶,在牛头人之间穿梭。每当有战斧举起,他便提前预判闪避;每当有破绽出现,他便立刻发动流心·刺或流心·跃进行反击。
|
||||
|
||||
“噗嗤——”
|
||||
|
||||
“噗嗤——”
|
||||
|
||||
刀光不断闪烁,鲜血四处飞溅。
|
||||
|
||||
牛头人一只接一只地倒下,它们的吼声从愤怒变成了恐惧。
|
||||
|
||||
终于,最后一只牛头人倒在了林克的刀下。
|
||||
|
||||
“呼……呼……”
|
||||
|
||||
林克拄着太刀,大口大口地喘着粗气。
|
||||
|
||||
十五只牛头人,全部解决。
|
||||
|
||||
但他的体力也消耗了不少。
|
||||
|
||||
“还不够……”
|
||||
|
||||
他抬起头,看向草原深处。
|
||||
|
||||
在那里,有更强大的敌人在等着他。
|
||||
|
||||
牛头王,萨乌塔。
|
||||
|
||||
---
|
||||
|
||||
穿过草原,林克来到一片开阔地带。
|
||||
|
||||
这里矗立着一座古老的祭坛,祭坛周围堆满了白骨,看起来十分渗人。
|
||||
|
||||
而在祭坛中央,趴着一只巨大的牛头人。
|
||||
|
||||
它比其他牛头人高出整整一倍,浑身的肌肉像是小山一样隆起。最恐怖的是它头顶的角——两根弯曲的巨角呈深褐色,上面布满了岁月的痕迹。
|
||||
|
||||
牛头王,萨乌塔。
|
||||
|
||||
“人类……”
|
||||
|
||||
萨乌塔缓缓睁开眼睛,那双血红色的眼睛盯着林克。
|
||||
|
||||
“又是你。”
|
||||
|
||||
“又?”林克愣了一下,随即明白过来,“你记得我?”
|
||||
|
||||
“记住猎物的气味,是牛头王的本能。”萨乌塔站起身,巨大的身体像一座小山,“上一次让你逃了,这一次……你没那么好运。”
|
||||
|
||||
林克握紧太刀,体内力量开始运转。
|
||||
|
||||
“少废话,来吧。”
|
||||
|
||||
“吼——”
|
||||
|
||||
萨乌塔发出震天的咆哮,巨大的身体竟然出乎意料地灵活,眨眼间就冲到了林克面前。
|
||||
|
||||
“太快了!”
|
||||
|
||||
林克瞳孔一缩,本能地举起太刀格挡。
|
||||
|
||||
“当——”
|
||||
|
||||
一声巨响,林克感觉像是被巨锤砸中,整个人飞出去十几米远。
|
||||
|
||||
“好强的力量……”
|
||||
|
||||
他摔在地上,嘴里喷出一口鲜血。
|
||||
|
||||
这就是牛头王的实力吗?
|
||||
|
||||
仅仅一击,就让他失去了战斗能力。
|
||||
|
||||
“人类,去死!”
|
||||
|
||||
萨乌塔不给他喘息的机会,巨大的战斧高举过头,狠狠劈下。
|
||||
|
||||
“银光落刃!”
|
||||
|
||||
林克在千钧一发之际使出银光落刃,身体跃向空中,险之又险地避开这一击。
|
||||
|
||||
“轰——”
|
||||
|
||||
战斧砸在地面上,砸出一个巨大的深坑。
|
||||
|
||||
林克人在半空,身体快速调整姿态,太刀指向萨乌塔的头顶。
|
||||
|
||||
“流心·刺!”
|
||||
|
||||
他像流星般坠落,太刀直取萨乌塔的眼睛。
|
||||
|
||||
“吼!”
|
||||
|
||||
萨乌塔怒吼一声,巨大的手臂横扫而来。
|
||||
|
||||
“当——”
|
||||
|
||||
林克被这股巨力扫中,整个人失去了平衡。
|
||||
|
||||
但他并没有放弃,而是在空中强行扭转身体,太刀在萨乌塔的手臂上划出一道伤口。
|
||||
|
||||
“嗷——”
|
||||
|
||||
萨乌塔吃痛,鲜血从伤口中涌出。
|
||||
|
||||
“有效!”
|
||||
|
||||
林克心中一喜,刚才那一刀虽然没能造成致命伤害,但至少破了萨乌塔的防御。
|
||||
|
||||
“人类……你惹怒我了!”
|
||||
|
||||
萨乌塔彻底狂暴了,它的眼睛变得血红,身上的肌肉开始膨胀。
|
||||
|
||||
“不好!”
|
||||
|
||||
林克感受到一股危险的气息,不敢硬拼,立刻向后跃去。
|
||||
|
||||
“轰——”
|
||||
|
||||
几乎是同时,萨乌塔的战斧砸在他刚才站立的位置。
|
||||
|
||||
“好险……”
|
||||
|
||||
林克暗自庆幸,如果刚才反应慢一点,现在已经成为肉泥了。
|
||||
|
||||
“这样下去不是办法……”
|
||||
|
||||
他一边快速移动一边思考对策。
|
||||
|
||||
萨乌塔的力量太强,速度也不慢,正面战斗他完全不是对手。银光落刃虽然能伤到它,但萨乌塔的防御力太高,流心·刺造成的伤口对它来说只是轻伤。
|
||||
|
||||
“必须找到它的弱点……”
|
||||
|
||||
林克想起了阿甘左的话——任何敌人都有弱点,只要找到就能取胜。
|
||||
|
||||
他仔细观察萨乌塔的动作,寻找着破绽。
|
||||
|
||||
然后,他发现了。
|
||||
|
||||
萨乌塔虽然力量强大,但它的攻击有一个致命的缺点——每次攻击后,它都需要时间来恢复平衡。这段时间虽然短暂,但对林克来说已经足够了。
|
||||
|
||||
“就是现在!”
|
||||
|
||||
林克看准时机,在萨乌塔战斧挥空的瞬间冲了上去。
|
||||
|
||||
“流心·跃!”
|
||||
|
||||
他的身体高高跃起,从萨乌塔头顶越过。
|
||||
|
||||
“流心·刺!”
|
||||
|
||||
人在半空,他强行扭转身体,太刀刺向萨乌塔的后颈。
|
||||
|
||||
“噗嗤——”
|
||||
|
||||
刀光闪过,萨乌塔的后颈出现一道深深的伤口。
|
||||
|
||||
“吼——”
|
||||
|
||||
萨乌塔发出痛苦的咆哮,但它反应极快,反手一斧扫向林克。
|
||||
|
||||
“危险!”
|
||||
|
||||
林克想要躲避,但刚才那一击用尽了全力,身体已经来不及调整。
|
||||
|
||||
“完了……”
|
||||
|
||||
就在这千钧一发之际——
|
||||
|
||||
“冰封术!”
|
||||
|
||||
一个清脆的声音在草原上响起。
|
||||
|
||||
紧接着,一股极寒的气息扑面而来。
|
||||
|
||||
“咔嚓——”
|
||||
|
||||
萨乌塔的战斧上突然覆盖了一层厚厚的冰霜,它的速度瞬间变慢。
|
||||
|
||||
“机会!”
|
||||
|
||||
林克抓住这个机会,快速后退,与萨乌塔拉开距离。
|
||||
|
||||
他抬起头,看向寒气传来的方向。
|
||||
|
||||
“赛丽亚?!”
|
||||
|
||||
林克难以置信地看到,赛丽亚正站在草原边缘,双手散发着淡淡的蓝光。
|
||||
|
||||
“林克!”赛丽亚喊道,“这只牛头人就交给我!你想办法攻击它的脚!”
|
||||
|
||||
“你的魔法……”
|
||||
|
||||
“别问那么多!”赛丽亚的表情十分认真,“相信我!”
|
||||
|
||||
林克看着她的眼神,重重地点了点头。
|
||||
|
||||
“好!”
|
||||
|
||||
---
|
||||
|
||||
赛丽亚深吸一口气,体内的魔力开始涌动。
|
||||
|
||||
她不是战斗型的魔法师,但在冰霜魔法上有着独特的天赋。这是她这些天秘密训练的结果——既然无法陪林克一起战斗,那就在背后支持他。
|
||||
|
||||
“冰霜之环!”
|
||||
|
||||
她猛地挥动手臂,一道冰蓝色的光环从地面上升起,将萨乌塔笼罩其中。
|
||||
|
||||
“咔嚓——”
|
||||
|
||||
萨乌塔的腿部开始结冰,动作变得迟缓。
|
||||
|
||||
“就是现在!”
|
||||
|
||||
林克冲了上去。
|
||||
|
||||
“流心·跃!”
|
||||
|
||||
他跃向空中,身体在空中完成一个翻滚,太刀直指萨乌塔的头顶。
|
||||
|
||||
“银光落刃!”
|
||||
|
||||
这是他最强的起手技能。
|
||||
|
||||
“轰——”
|
||||
|
||||
林克像陨石般坠落,重重地砸在萨乌塔的肩膀上。
|
||||
|
||||
“吼——”
|
||||
|
||||
萨乌塔发出凄厉的咆哮,肩膀上的骨头发出断裂的声音。
|
||||
|
||||
但它没有倒下,而是疯狂地挥舞战斧,想要把林克甩下来。
|
||||
|
||||
“林克!”
|
||||
|
||||
赛丽亚焦急地喊道。
|
||||
|
||||
“知道!”
|
||||
|
||||
林克死死地抓住萨乌塔的角,另一只手中的太刀不断刺向它的脖子。
|
||||
|
||||
“噗嗤——”
|
||||
|
||||
“噗嗤——”
|
||||
|
||||
一刀、两刀、三刀……
|
||||
|
||||
每一刀都准确地刺在同一个位置。
|
||||
|
||||
终于,萨乌塔的动作越来越慢,最后轰然倒地。
|
||||
|
||||
“赢……赢了?”
|
||||
|
||||
林克从萨乌塔的尸体上跳下来,难以置信地看着这一幕。
|
||||
|
||||
“太好了!”
|
||||
|
||||
赛丽亚欢呼起来,兴奋地跑向林克。
|
||||
|
||||
但就在这时——
|
||||
|
||||
“小心!”
|
||||
|
||||
阿甘左的声音突然传来。
|
||||
|
||||
林克本能地转身,看到萨乌塔的尸体竟然动了一下。
|
||||
|
||||
“不死心吗……”
|
||||
|
||||
他握紧太刀,准备给萨乌塔最后一击。
|
||||
|
||||
但出乎意料的是,萨乌塔并没有站起来。
|
||||
|
||||
“人类……”
|
||||
|
||||
一个虚弱的声音从尸体中传出。
|
||||
|
||||
“我记住你了……总有一天……我会回来复仇……”
|
||||
|
||||
声音越来越小,最后完全消失。
|
||||
|
||||
这一次,牛头王萨乌塔彻底死亡。
|
||||
|
||||
---
|
||||
|
||||
林克站在萨乌塔的尸体旁,心情复杂。
|
||||
|
||||
这已经是他第二次击败萨乌塔了。第一次是在一个月前,他还没有现在这么强;而这一次,他依靠自己的力量和赛丽亚的配合,终于彻底解决了这个强敌。
|
||||
|
||||
“林克!”
|
||||
|
||||
赛丽亚冲过来,直接扑进他怀里。
|
||||
|
||||
“你没事吧?有没有受伤?”
|
||||
|
||||
“我没事。”林克扶住她,“倒是你……你怎么会在这里?还有你的魔法……”
|
||||
|
||||
“这个嘛……”赛丽亚吐了吐舌头,“我听说你要来格拉卡,就偷偷跟来了。至于魔法……是我这些天偷偷学的。”
|
||||
|
||||
“偷偷学的?”林克有些无语,“你就不怕危险吗?”
|
||||
|
||||
“怕啊。”赛丽亚说,“但我更怕你出事。上次在雷鸣废墟,我只能看着你战斗,什么都做不了……我不想再体验那种无力感了。”
|
||||
|
||||
林克沉默了。
|
||||
|
||||
他不知道该说什么。
|
||||
|
||||
“而且,”赛丽亚继续说道,“我现在也是冒险家了。虽然战斗力不强,但至少可以帮你牵制敌人。”
|
||||
|
||||
“冒险家?”
|
||||
|
||||
“对啊。”赛丽亚笑着说,“我已经在冒险家联盟注册了,以后就是正式的冒险家。”
|
||||
|
||||
林克看着她坚定的眼神,心里涌起一股暖流。
|
||||
|
||||
“谢谢。”
|
||||
|
||||
“又说谢谢。”赛丽亚撇了撇嘴,“我们是朋友嘛,为朋友做这些是应该的。”
|
||||
|
||||
朋友吗?
|
||||
|
||||
林克笑了笑,没有反驳。
|
||||
|
||||
远处,阿甘左看着两人并肩走来的身影,眼中闪过一丝不易察觉的笑意。
|
||||
|
||||
“不错。”他轻声说,“看来这一战,你们配合得很好。”
|
||||
|
||||
“师父。”林克走到他面前,“我有一个问题想问你。”
|
||||
|
||||
“什么?”
|
||||
|
||||
“刚才……你为什么不出手?”
|
||||
|
||||
阿甘左沉默了一下:“因为你没有生命危险。”
|
||||
|
||||
“可如果赛丽亚没有来……”
|
||||
|
||||
“她来了。”阿甘左打断他,“这说明你的努力得到了回报。”
|
||||
|
||||
林克愣住了。
|
||||
|
||||
“你以为那只是巧合吗?”阿甘左淡淡地说,“赛丽亚会跟来,是因为她关心你。而你能赢得战斗,是因为你学会了相信伙伴。”
|
||||
|
||||
“相信……伙伴?”
|
||||
|
||||
“一个人的力量是有限的。”阿甘左说,“但如果有人和你并肩作战,情况就会完全不同。你今天的表现很好——不仅学会了银光落刃,还学会了与队友配合。这才是真正的成长。”
|
||||
|
||||
林克若有所思地点点头。
|
||||
|
||||
“走吧。”阿甘左转身,“回艾尔文防线。”
|
||||
|
||||
---
|
||||
|
||||
夜晚,赛丽亚旅馆。
|
||||
|
||||
林克坐在屋顶上,看着满天的星斗。
|
||||
|
||||
今天发生的事在他脑海中不断回放。
|
||||
|
||||
与牛头人的战斗、银光落刃的威力、赛丽亚的冰霜魔法……
|
||||
|
||||
“想什么呢?”
|
||||
|
||||
赛丽亚的声音从身后传来。
|
||||
|
||||
“在想今天的事。”林克说,“我好像……开始明白一些事了。”
|
||||
|
||||
“什么事?”
|
||||
|
||||
“关于力量的事。”林克抬起手,看着自己的太刀,“以前我一直以为,力量就是一切。只要足够强,就能保护任何人。但今天我才发现……”
|
||||
|
||||
“发现什么?”
|
||||
|
||||
“发现力量并不是孤立的。”林克说,“一个人再强,也有力所不及的时候。但如果有伙伴陪在身边,就能做到原本做不到的事。”
|
||||
|
||||
赛丽亚笑了。
|
||||
|
||||
“你终于开窍了。”
|
||||
|
||||
“还好意思说。”林克看了她一眼,“你知不知道今天有多危险?如果有个三长两短……”
|
||||
|
||||
“不会有事的。”赛丽亚打断他,“因为你会保护我,对吧?”
|
||||
|
||||
林克愣了一下,随即点了点头。
|
||||
|
||||
“嗯。”
|
||||
|
||||
赛丽亚的笑容更加灿烂了。
|
||||
|
||||
“对了,”她像是突然想起什么,“我今天在冒险家联盟听说了一件事。”
|
||||
|
||||
“什么?”
|
||||
|
||||
“天空之城的封印好像松动了。”
|
||||
|
||||
“天空之城?”林克皱起眉头,“那是什么?”
|
||||
|
||||
“据说是在格兰之森的上方,有一座漂浮在空中的古老城市。”赛丽亚说,“那里有很多强大的怪物,但也有无尽的宝藏。”
|
||||
|
||||
“师父之前提到过。”林克说,“他说等我的实力足够强的时候,会带我去那里。”
|
||||
|
||||
“那你要加油了。”赛丽亚笑着说,“天空之城的怪物可比牛头人厉害多了。”
|
||||
|
||||
林克握紧太刀,眼神变得坚定。
|
||||
|
||||
“我会的。”
|
||||
|
||||
他抬起头,看着星空。
|
||||
|
||||
格拉卡的战斗已经结束,但他的冒险才刚刚开始。
|
||||
|
||||
前方还有更强大的敌人,更艰难的挑战在等着他。
|
||||
|
||||
但他不害怕。
|
||||
|
||||
因为现在,他不再是孤身一人。
|
||||
|
||||
---
|
||||
|
||||
与此同时,格兰之森深处。
|
||||
|
||||
一片漆黑的洞穴中,有一双眼睛正在注视着远方。
|
||||
|
||||
“咯咯咯……”
|
||||
|
||||
笑声在洞穴中回荡。
|
||||
|
||||
“第二轮……结束了吗?”
|
||||
|
||||
“有趣的人类……”
|
||||
|
||||
“越来越有意思了……”
|
||||
|
||||
“我在天空之城……等着你……”
|
||||
|
||||
---
|
||||
|
||||
**第六章完**
|
||||
|
||||
---
|
||||
|
||||
## 章节备注
|
||||
|
||||
- **本章亮点**:林克首次使用银光落刃(Lv.20新技能),与赛丽亚冰霜魔法配合击败萨乌塔;林克开始理解团队配合的重要性
|
||||
- **角色成长**:赛丽亚正式成为冒险家,学习冰霜魔法;林克领悟到"相信伙伴"的重要性
|
||||
- **下章预告**:天空之城封印松动,林克即将挑战更高难度的地图
|
||||
- **伏笔标记**:天空之城的秘密、格兰之森深处神秘存在的真正身份,都将在后续章节逐步揭晓
|
||||
76
novels/dnf/00-大纲.md
Normal file
76
novels/dnf/00-大纲.md
Normal file
@ -0,0 +1,76 @@
|
||||
# 《阿拉德:剑之回响》大纲
|
||||
|
||||
## 基本信息
|
||||
|
||||
| 项目 | 内容 |
|
||||
|------|------|
|
||||
| **题材** | DNF同人/奇幻冒险 |
|
||||
| **主角** | 林克,男性,鬼剑士(后期转剑魂)|
|
||||
| **风格** | 热血、成长、后宫 |
|
||||
| **章节规划** | 按DNF地图等级推进 |
|
||||
|
||||
---
|
||||
|
||||
## 主角设定
|
||||
|
||||
### 林克
|
||||
|
||||
- **职业**:鬼剑士(Lv.1-17)→ 剑魂(Lv.18+)
|
||||
- **武器**:
|
||||
- Lv.1-17:太刀(普通武器)
|
||||
- Lv.18+:光剑(剑魂专属)
|
||||
- **性格**:热血、勇敢、不服输
|
||||
- **特征**:黑色短发,眼睛明亮,瞳孔深处有微弱的红色(卡赞诅咒)
|
||||
- **背景**:从远方流浪而来的冒险家
|
||||
|
||||
---
|
||||
|
||||
## 章节规划
|
||||
|
||||
| 章节 | 地图 | 等级 | BOSS | 内容 |
|
||||
|------|------|------|------|------|
|
||||
| 第1章 | 洛兰 | Lv.1 | 哥布林 | 初入艾尔文防线,打哥布林入门 |
|
||||
| 第2章 | 洛兰深处 | Lv.2 | 哥布林头目 | 挑战头目,初露锋芒 |
|
||||
| 第3章 | 幽暗密林 | Lv.3 | 猫妖 | 进入格兰之森,赛丽亚登场 |
|
||||
| 第4章 | 幽暗密林深处 | Lv.5 | 猫妖王 | 深入森林 |
|
||||
| 第5章 | 雷鸣废墟 | Lv.6 | 闪电哥布林 | 雷电危机 |
|
||||
| 第6章 | 猛毒雷鸣废墟 | Lv.8 | 毒猫妖 | 中毒危机 |
|
||||
| 第7章 | 格拉卡 | Lv.10 | 牛头王萨乌塔 | 重大挑战 |
|
||||
| 第8章 | 冰霜幽暗密林 | Lv.12 | 冰女克拉赫 | 冰雪试炼 |
|
||||
| 第9章 | 烈焰格拉卡 | Lv.14 | 火女彼诺修 | 火焰对决 |
|
||||
| 第10章 | 亚蒙下层 | Lv.16 | 龙人 | 天空之城 |
|
||||
| 第11章 | 亚蒙上层 | Lv.18 | 石像鬼 | 天空之城 |
|
||||
| **转职任务** | **暗黑雷鸣废墟** | **Lv.18** | **僵尸王** | **转职成为剑魂,获得光剑** |
|
||||
| 第12章 | 斯顿雪域 | Lv.20 | 冰雪皇后 | 北方雪原 |
|
||||
| 第13章 | 冰雪宫殿 | Lv.22 | 冰霜 | 深入雪域 |
|
||||
| 第14章 | 诺伊佩拉 | Lv.24 | 瘟疫死者 | 暗黑城附近 |
|
||||
| 第15章 | 暗黑城 | Lv.26 | 暗精灵 | 进入暗精灵领地 |
|
||||
| 第16章 | 暗精灵墓地 | Lv.28 | 骨龙 | 地下遗迹 |
|
||||
| 第17章 | 阿法利亚营地 | Lv.30 | 亚丁 | 悲鸣洞穴前哨 |
|
||||
| 第18章 | 悲鸣洞穴 | Lv.32 | 盗墓者 | 悲鸣洞穴 |
|
||||
| 第19章 | 痛苦之村列瑟芬 | Lv.35 | 芬兰领主 | 被诅咒的村庄 |
|
||||
| 第20章 | 天空之城上层 | Lv.38 | 银光妖鼠 | 天空之城深处 |
|
||||
| **大转移** | - | - | - | **灾难发生,阿拉德剧变** |
|
||||
|
||||
---
|
||||
|
||||
## 转职设定
|
||||
|
||||
| 项目 | 内容 |
|
||||
|------|------|
|
||||
| **转职等级** | Lv.18 |
|
||||
| **转职地图** | 暗黑雷鸣废墟(僵尸图)|
|
||||
| **转职BOSS** | 僵尸王 |
|
||||
| **转职前** | 鬼剑士,使用太刀/短剑/钝器/巨剑 |
|
||||
| **转职后** | 剑魂,可使用光剑(剑魂专属武器)|
|
||||
|
||||
---
|
||||
|
||||
## TODO
|
||||
|
||||
- [x] 第1章:洛兰 ✅ (2026-03-20)
|
||||
- [x] 第2章:洛兰深处 ✅ (2026-03-21)
|
||||
- [x] 第3章:幽暗密林 ✅ (2026-03-21)
|
||||
- [x] 第4章:幽暗密林深处 ✅ (2026-03-21)
|
||||
- [ ] 第5章:雷鸣废墟
|
||||
- [ ] ...
|
||||
510
novels/dnf/chapter-05-fixed.md
Normal file
510
novels/dnf/chapter-05-fixed.md
Normal file
@ -0,0 +1,510 @@
|
||||
# 第五章:雷鸣废墟
|
||||
|
||||
## 本章概要
|
||||
- **核心事件**:林克前往雷鸣废墟挑战闪电哥布林,在绝境中觉醒卡赞血脉的真正力量
|
||||
- **承接上章**:林克初次觉醒卡赞诅咒力量,但险些失控
|
||||
- **悬念钩子**:卡赞血脉的更多秘密逐渐浮现
|
||||
|
||||
---
|
||||
|
||||
一个月后。
|
||||
林克站在艾尔文防线的边缘,看着远处被雷电笼罩的区域。
|
||||
|
||||
"那里就是雷鸣废墟。"阿甘左站在他身后,"闪电哥布林的领地。"
|
||||
|
||||
"我能感觉到。"林克眯起眼睛,"空气中有电流的气息。"
|
||||
|
||||
这一个月里,他每天都在进行高强度的训练。挥剑、闪避、体能,然后再挥剑、再闪避、再体能。循环往复,永无止境。
|
||||
|
||||
但他从不抱怨。
|
||||
|
||||
因为每一次训练,他都能感觉到自己在变强。体内的诅咒力量也不再像之前那样狂暴,而是逐渐变得温顺,像是一头被驯服的野兽。
|
||||
|
||||
当然,这只是假象。
|
||||
|
||||
"你在雷鸣废墟里要小心。"阿甘左说,"闪电哥布林和猫妖王不同。它们不会和你近身搏斗,而是会利用雷电进行远程攻击。"
|
||||
|
||||
"远程?"林克皱眉,"那怎么打?"
|
||||
|
||||
"靠近它们。"阿甘左淡淡地说,"在它们放电之前,靠近,然后砍死它们。"
|
||||
|
||||
林克:"……"
|
||||
|
||||
师父总是能把复杂的事情说得这么简单。
|
||||
|
||||
"去吧。"阿甘左转身,"我会在这里等你。如果你死了,我会帮你收尸。"
|
||||
|
||||
"……"林克嘴角抽搐,"师父,你就不能说点好听的?"
|
||||
|
||||
"不能。"阿甘左头也不回,"活着回来请你喝酒。"
|
||||
|
||||
林克笑了笑,握紧太刀,走向雷鸣废墟。
|
||||
|
||||
---
|
||||
|
||||
雷鸣废墟比他想象中还要诡异。
|
||||
|
||||
天空永远笼罩着乌云,闪电在云层中不断闪烁。空气中弥漫着一股臭氧的味道,刺激着他的鼻腔。地面是焦黑色的,仿佛被雷电常年轰炸过,到处都是深浅不一的坑洞。
|
||||
|
||||
"噼啪——"
|
||||
|
||||
一道闪电从天而降,落在林克前方不到十米的地方。
|
||||
|
||||
他本能地举起太刀护在身前,闪电的余波让他的手臂微微发麻。
|
||||
|
||||
"这就是闪电哥布林的领地……"
|
||||
|
||||
林克警惕地看着四周,缓慢前行。
|
||||
|
||||
这里的能见度很低,闪电的光芒每隔几秒就会照亮整个废墟,但也仅仅是一瞬间。在那短暂的光亮中,林克能看到废墟中游荡的身影。
|
||||
|
||||
哥布林。
|
||||
|
||||
到处都是哥布林。
|
||||
|
||||
它们和外面的普通哥布林不同,身体呈灰蓝色,皮肤像是被雷电劈焦了一样。手中的木棒顶端镶嵌着蓝色的水晶球,不断闪烁着电光。
|
||||
|
||||
"闪电哥布林……"
|
||||
|
||||
林克数了一下,至少有二十只。
|
||||
|
||||
这还是他能看到的。在这片废墟里,不知道还有多少隐藏在暗处。
|
||||
|
||||
他深吸一口气,缓慢地拔出太刀。
|
||||
|
||||
"只能硬闯了。"
|
||||
|
||||
---
|
||||
|
||||
第一步踏出,战斗瞬间打响。
|
||||
|
||||
"嘎——!"
|
||||
|
||||
一只闪电哥布林发现了林克,发出了刺耳的尖叫。
|
||||
|
||||
几乎是同时,二十多只闪电哥布林同时转向他,眼中闪烁着嗜血的光芒。
|
||||
|
||||
"噼里啪啦——!"
|
||||
|
||||
蓝色的电光从它们手中的水晶球中迸发而出,汇聚成一道道闪电链,像是群蛇乱舞般向林克劈来。
|
||||
|
||||
"太快了!"
|
||||
|
||||
林克咬牙,身体一侧,险之又险地躲过第一道闪电。但第二道、第三道闪电紧随其后,让他避无可避。
|
||||
|
||||
"轰——!"
|
||||
|
||||
闪电击中了他的肩膀。
|
||||
|
||||
剧烈的疼痛从肩膀蔓延开来,林克感觉整条手臂都失去了知觉。他的身体被电流击中,不由自主地颤抖起来。
|
||||
|
||||
"嘎嘎嘎!"
|
||||
|
||||
闪电哥布林们发出刺耳的笑声,手中的水晶球再次亮起。
|
||||
|
||||
"还没完呢……"
|
||||
|
||||
林克咬紧牙关,强忍着手臂的疼痛,身体猛然前冲。
|
||||
|
||||
既然躲不掉,那就冲上去。
|
||||
|
||||
他的速度很快,闪电哥布林们显然没想到他挨了一击还能冲锋,动作慢了半拍。
|
||||
|
||||
"唰——!"
|
||||
|
||||
太刀划过一只闪电哥布林的脖子。
|
||||
|
||||
那只哥布林的头颅冲天而起,无头的身体抽搐着倒在地上。
|
||||
|
||||
但不等林克喘息,又是两道闪电劈来。
|
||||
|
||||
"咔嚓——!"
|
||||
|
||||
他翻滚着躲开,但左腿还是被擦中,整个人摔在地上。
|
||||
|
||||
"嘎!"
|
||||
|
||||
一只体型格外庞大的闪电哥布林跳了过来,手中举着冒着电光的木棒,对准林克的脑袋狠狠砸下。
|
||||
|
||||
"糟糕……"
|
||||
|
||||
林克想要躲避,但腿上的伤让他动作变得迟缓。
|
||||
|
||||
就在这时——
|
||||
|
||||
"噼啪!"
|
||||
|
||||
一道蓝色闪电从天而降,准确地命中了那只哥布林。
|
||||
|
||||
它甚至来不及发出惨叫声,就变成了一具焦尸。
|
||||
|
||||
林克愣了一下,抬起头。
|
||||
|
||||
天空中的乌云在翻滚,一道道闪电不断落下。而在闪电之中,一个巨大的身影缓缓走来。
|
||||
|
||||
那是一只哥布林。
|
||||
|
||||
但和其他闪电哥布林不同,它的体型更加庞大,身高超过三米,浑身的皮肤呈深蓝色,像是蕴含着无穷的雷电能量。它的眼睛是银白色的,瞳孔中不断有电光闪烁。最引人注目的是它头顶的角——两根螺旋形的蓝色水晶角,不断向外散发着噼里啪啦的电火花。
|
||||
|
||||
"闪电哥布林王……"
|
||||
|
||||
林克握紧太刀,体内诅咒力量开始运转。
|
||||
|
||||
这是他面对过的最强敌人。
|
||||
|
||||
闪电哥布林王举起手中的法杖,指向林克。
|
||||
|
||||
"嘎……"
|
||||
|
||||
它的声音低沉而嘶哑,像是两块金属在摩擦。
|
||||
|
||||
"人类……闯进领地……死!"
|
||||
|
||||
最后一个字落下的瞬间,它身上的电光猛然爆发。
|
||||
|
||||
"噼里啪啦——!!!"
|
||||
|
||||
以闪电哥布林王为中心,恐怖的雷电之力向四周扩散。林克甚至来不及反应,就被这道雷电击中,整个人飞出去十几米远。
|
||||
|
||||
"咳……"
|
||||
|
||||
他重重地摔在地上,嘴里喷出一口鲜血。
|
||||
|
||||
体内的五脏六腑像是被雷击一样,疼得他几乎昏厥。
|
||||
|
||||
但他不能昏。
|
||||
|
||||
如果在这里昏倒,就死定了。
|
||||
|
||||
林克艰难地抬起头,看着缓缓走近的闪电哥布林王。
|
||||
|
||||
"卡赞……"
|
||||
|
||||
他喃喃自语,体内的诅咒力量开始沸腾。
|
||||
|
||||
"借我力量……"
|
||||
|
||||
---
|
||||
|
||||
血色的光芒在他眼中亮起。
|
||||
|
||||
这一次,林克不再抗拒。
|
||||
|
||||
他任由那股狂暴的力量在体内奔涌,任由红色的血气从皮肤下渗出,在空气中形成一层淡淡的血雾。
|
||||
|
||||
"吼——!!!"
|
||||
|
||||
林克发出一声不似人类的咆哮,整个人像是炮弹一样冲向闪电哥布林王。
|
||||
|
||||
"嘎?"
|
||||
|
||||
闪电哥布林王显然没想到林克还能站起来,愣了一下。
|
||||
|
||||
然后,它再次举起法杖。
|
||||
|
||||
"去死——!"
|
||||
|
||||
恐怖的雷电脱鞘而出,直奔林克。
|
||||
|
||||
但这一次,林克没有躲。
|
||||
|
||||
他举起太刀,红色的血气缠绕在刀身上,形成一道血色的刀芒。
|
||||
|
||||
"斩——!"
|
||||
|
||||
刀芒与雷电相撞,发出刺耳的尖啸声。
|
||||
|
||||
"轰——!!!"
|
||||
|
||||
爆炸的气浪将周围的碎石全部掀飞,林克和闪电哥布林王同时后退了几步。
|
||||
|
||||
"怎么可能……"
|
||||
|
||||
闪电哥布林王的声音中带着一丝恐惧。
|
||||
|
||||
那个人类的力量……不对,那不是普通的力量。
|
||||
|
||||
那是诅咒。
|
||||
|
||||
卡赞的诅咒。
|
||||
|
||||
"原来如此……"闪电哥布林王喃喃自语,"你是那个人的后代……"
|
||||
|
||||
"废话少说!"
|
||||
|
||||
林克再次冲了上去,太刀带着血色的刀芒,直取闪电哥布林王的喉咙。
|
||||
|
||||
"嘎——!!!"
|
||||
|
||||
闪电哥布林王发出愤怒的咆哮,四根水晶角同时亮起,恐怖的雷电之力从它体内爆发而出。
|
||||
|
||||
"噼里啪啦——!!!"
|
||||
|
||||
整个雷鸣废墟的雷电仿佛都被它召集而来,化作一片雷电的海洋,将林克完全笼罩。
|
||||
|
||||
"这次……"
|
||||
|
||||
林克深吸一口气。
|
||||
|
||||
体内的诅咒力量已经催动到了极致,但他知道,这还不够。
|
||||
|
||||
远远不够。
|
||||
|
||||
"卡赞……"他在心中呐喊,"给我更多的力量!"
|
||||
|
||||
---
|
||||
|
||||
仿佛是听到了他的呼唤,林克体内的诅咒力量突然发生了变化。
|
||||
|
||||
原本狂暴的红色血气开始凝聚,在他身后形成一个模糊的人形虚影。
|
||||
|
||||
那是一个战士的轮廓,手持巨剑,身披战甲,散发着毁天灭地的气息。
|
||||
|
||||
卡赞的虚影。
|
||||
|
||||
"这是……"
|
||||
|
||||
林克瞪大了眼睛。
|
||||
|
||||
他从未见过这样的景象。
|
||||
|
||||
那个虚影举起手中的巨剑,对着笼罩而来的雷电海洋,狠狠地劈下。
|
||||
|
||||
"轰——!!!"
|
||||
|
||||
血色的剑芒撕裂了雷电,撕裂了天空,也撕裂了闪电哥布林王的身体。
|
||||
|
||||
"嘎……嘎……"
|
||||
|
||||
闪电哥布林王难以置信地看着自己胸口那个巨大的伤口,鲜血和电光一起从伤口中喷涌而出。
|
||||
|
||||
"不可能……我是闪电的主宰……怎么可能……"
|
||||
|
||||
"没什么不可能。"
|
||||
|
||||
林克走到它面前,太刀高高举起。
|
||||
|
||||
"去死吧。"
|
||||
|
||||
"噗嗤——!"
|
||||
|
||||
刀光闪过,闪电哥布林王的头颅滚落地上。
|
||||
|
||||
---
|
||||
|
||||
战斗结束。
|
||||
|
||||
红色的血气从林克身上缓缓散去,那个模糊的人形虚影也逐渐消失。
|
||||
|
||||
林克跪在地上,大口大口地喘着粗气。
|
||||
|
||||
刚才那一击,几乎耗尽了他全部的体力。
|
||||
|
||||
但更重要的是……
|
||||
|
||||
"刚才那个虚影……是什么?"
|
||||
|
||||
他回想起刚才战斗中的那一幕,心中充满了疑问。
|
||||
|
||||
卡赞的虚影?
|
||||
|
||||
那到底是什么东西?
|
||||
|
||||
"林克!"
|
||||
|
||||
一个熟悉的声音从远处传来。
|
||||
|
||||
林克艰难地转过头,看到赛丽亚正站在废墟的边缘,脸上满是泪痕。
|
||||
|
||||
"赛丽亚?!"
|
||||
|
||||
他难以置信,"你怎么来了?"
|
||||
|
||||
"废话!"赛丽亚哭着喊道,"我听说你来雷鸣废墟了!你知不知道这里有多危险!"
|
||||
|
||||
"我……"
|
||||
|
||||
林克想要解释,但现在不是时候。
|
||||
|
||||
"林克!"
|
||||
|
||||
赛丽亚已经冲了过来,扑进他怀里。
|
||||
|
||||
"你没事吧?你没事吧?"
|
||||
|
||||
"我……"林克想要说什么,但话到嘴边却说不出口。
|
||||
|
||||
他看着怀中的赛丽亚,心里涌起一种复杂的情绪。
|
||||
|
||||
"你怎么来了?"他问,"这里很危险……"
|
||||
|
||||
"我知道危险!"赛丽亚抬起头,泪眼婆娑地看着他,"但我不能看着你一个人面对危险……"
|
||||
|
||||
林克沉默了。
|
||||
|
||||
他不知道该说什么。
|
||||
|
||||
"刚才……那是什么?"赛丽亚指着闪电哥布林王的尸体,"你身后那个红色的影子……"
|
||||
|
||||
"我不知道。"林克摇摇头,"我只知道……那是我体内的力量。"
|
||||
|
||||
"力量?"赛丽亚的表情变得担忧,"林克,那股力量太危险了。上次在洛兰,你差点就……"
|
||||
|
||||
"我知道。"林克打断她,"但我别无选择。"
|
||||
|
||||
他低下头,看着自己的双手。
|
||||
|
||||
"如果不使用这股力量,我早就死了。"
|
||||
|
||||
赛丽亚沉默了。
|
||||
|
||||
她知道林克说的是事实。
|
||||
|
||||
"那答应我。"她抬起头,认真地看着林克的眼睛,"以后不要再一个人面对危险了。带上我,好吗?"
|
||||
|
||||
林克愣住了。
|
||||
|
||||
"带你?"
|
||||
|
||||
"嗯。"赛丽亚点点头,"我虽然帮不上什么大忙,但至少……至少可以在旁边看着你。"
|
||||
|
||||
林克看着她坚定的眼神,心里涌起一股暖流。
|
||||
|
||||
"好。"他说,"我答应你。"
|
||||
|
||||
---
|
||||
|
||||
回到艾尔文防线时,天已经黑了。
|
||||
|
||||
阿甘左站在防线入口,看着两人并肩走来,脸上闪过一丝不易察觉的笑容。
|
||||
|
||||
"回来了。"他说。
|
||||
|
||||
"嗯。"林克点点头,"师父,刚才我……"
|
||||
|
||||
"不用说了。"阿甘左打断他,"我都知道了。"
|
||||
|
||||
"知道?"
|
||||
|
||||
"卡赞的虚影。"阿甘左说,"那是卡赞血脉觉醒的征兆。"
|
||||
|
||||
"卡赞血脉?"林克皱起眉头,"师父,这到底是怎么回事?"
|
||||
|
||||
阿甘左沉默了一下,然后缓缓开口:
|
||||
|
||||
"林克,你知道卡赞是谁吗?"
|
||||
|
||||
"知道。"林克说,"毁灭之鬼神,两百年前被四大剑圣封印的存在。"
|
||||
|
||||
"没错。"阿甘左点点头,"但你不知道的是,卡赞在被封印之前,曾经将自己的血脉分给了一些人类。"
|
||||
|
||||
"血脉?"
|
||||
|
||||
"那些人类,就是最初的鬼剑士。"阿甘左说,"他们体内流淌着卡赞的血液,拥有超乎常人的力量。但同时,他们也承受着卡赞的诅咒。"
|
||||
|
||||
林克愣住了。
|
||||
|
||||
"你是说……我也是……"
|
||||
|
||||
"你是卡赞血脉的继承者。"阿甘左说,"而且,是最纯净的血脉之一。"
|
||||
|
||||
"最纯净?"
|
||||
|
||||
"普通的鬼剑士,体内只有一丝卡赞的血脉。"阿甘左解释道,"但你不同。你体内的卡赞血脉,纯净到可以召唤出卡赞的虚影。"
|
||||
|
||||
"那刚才那个影子……"
|
||||
|
||||
"是卡赞残留在世间的意志。"阿甘左说,"当你体内的血脉觉醒到一定程度时,就可以借用那股意志的力量。"
|
||||
|
||||
林克沉默了。
|
||||
|
||||
原来如此。
|
||||
|
||||
原来他体内流淌的,是卡赞的血脉。
|
||||
|
||||
"师父。"他抬起头,"那股力量……我能控制吗?"
|
||||
|
||||
"能,也不能。"阿甘左说。
|
||||
|
||||
"什么意思?"
|
||||
|
||||
"卡赞的力量,是一把双刃剑。"阿甘左说,"用得好,它可以让你变得无比强大。用不好,它会吞噬你的理智,让你变成一个只知道杀戮的怪物。"
|
||||
|
||||
"那我该怎么办?"
|
||||
|
||||
"变强。"阿甘左说,"变得足够强大,强大到可以掌控那股力量,而不是被它掌控。"
|
||||
|
||||
林克若有所思地点点头。
|
||||
|
||||
"我明白了。"
|
||||
|
||||
---
|
||||
|
||||
夜晚,林克坐在赛丽亚旅馆的屋顶上,看着满天的星斗。
|
||||
|
||||
今天发生的事在他脑海中不断回放。
|
||||
|
||||
卡赞的虚影、卡赞的血脉、还有那个在他脑海中说话的声音……
|
||||
|
||||
"林克。"
|
||||
|
||||
赛丽亚的声音从身后传来。
|
||||
|
||||
"嗯?"
|
||||
|
||||
她在他身边坐下来,手里端着一杯热茶。
|
||||
|
||||
"在想什么?"
|
||||
|
||||
"在想今天的事。"林克接过茶杯,"师父说,我体内流淌着卡赞的血脉。"
|
||||
|
||||
"卡赞血脉?"赛丽亚的表情变得担忧,"那不是很危险吗?"
|
||||
|
||||
"是。"林克点点头,"但也是我变强的唯一途径。"
|
||||
|
||||
"林克……"
|
||||
|
||||
"不用担心。"林克笑了笑,"我会想办法控制那股力量的。"
|
||||
|
||||
赛丽亚沉默了。
|
||||
|
||||
她知道林克决定了的事情,谁也改变不了。
|
||||
|
||||
"那答应我。"她抬起头,认真地看着林克的眼睛,"以后不要再一个人面对危险了。带上我,好吗?"
|
||||
|
||||
林克看着她坚定的眼神,心里涌起一股暖流。
|
||||
|
||||
"好。"他说,"我答应你。"
|
||||
|
||||
---
|
||||
|
||||
与此同时,格兰之森的深处。
|
||||
|
||||
一片漆黑的洞穴中,有一双眼睛正在注视着远方。
|
||||
|
||||
"卡赞的虚影……"
|
||||
|
||||
那个声音低沉而沙哑。
|
||||
|
||||
"看来,那个孩子的血脉比我想象的还要纯净……"
|
||||
|
||||
"咯咯咯……"
|
||||
|
||||
笑声在洞穴中回荡。
|
||||
|
||||
"有意思……越来越有意思了……"
|
||||
|
||||
"卡赞的继承者……究竟能走到哪一步呢……"
|
||||
|
||||
"我很期待……"
|
||||
|
||||
---
|
||||
|
||||
**第五章完**
|
||||
|
||||
---
|
||||
|
||||
## 章节备注
|
||||
- **本章亮点**:林克觉醒卡赞血脉,召唤卡赞虚影击败闪电哥布林王;卡赞血脉的设定正式展开
|
||||
- **本章悬念**:卡赞虚影的真正力量是什么?那个在暗中窥视的存在是谁?
|
||||
- **下章预告**:格拉卡,林克挑战牛头王萨乌塔,赛丽亚正式加入队伍
|
||||
307
novels/dnf/chapter-06.md
Normal file
307
novels/dnf/chapter-06.md
Normal file
@ -0,0 +1,307 @@
|
||||
# 第六章:格拉卡
|
||||
|
||||
## 本章概要
|
||||
- **核心事件**:林克与赛丽亚组队前往格拉卡,挑战牛头王萨乌塔
|
||||
- **承接上章**:赛丽亚正式加入队伍,林克掌握卡赞血脉的初步力量
|
||||
- **悬念钩子**:牛头王的真正实力远超预期,神秘势力开始行动
|
||||
|
||||
---
|
||||
|
||||
清晨的艾尔文防线笼罩在薄雾中。
|
||||
|
||||
林克站在旅馆门口,检查着自己的装备。太刀"赤星"经过林纳斯的打磨,刀刃比之前更加锋利。防具上的划痕已经被修补好,虽然看起来有些陈旧,但穿起来依然结实可靠。
|
||||
|
||||
"我准备好了。"
|
||||
|
||||
赛丽亚的声音从身后传来。
|
||||
|
||||
林克转过身,看到赛丽亚背着一个小背包,手里握着一根木质法杖。她穿着一件浅蓝色的冒险者斗篷,头发扎成利落的马尾,看起来和平时在旅馆里温柔的模样截然不同。
|
||||
|
||||
"你真的要去?"林克皱起眉头,"格拉卡比雷鸣废墟更危险。"
|
||||
|
||||
"答应过你的事,我不会反悔。"赛丽亚微微一笑,"而且,我可不是完全没用的。"
|
||||
|
||||
她举起手中的法杖,轻轻念了一句咒语。一道柔和的白光从法杖顶端亮起,笼罩在林克身上。他顿时感觉体力恢复了不少,连昨天训练留下的酸痛都减轻了许多。
|
||||
|
||||
"治愈术?"林克惊讶地看着她。
|
||||
|
||||
"只是基础的恢复魔法。"赛丽亚有些不好意思地说,"我没有战斗能力,但至少可以帮你治疗伤口。"
|
||||
|
||||
林克沉默了片刻,然后点了点头。
|
||||
|
||||
"好吧。但你要答应我,一旦遇到危险,立刻躲到我身后。"
|
||||
|
||||
"嗯。"赛丽亚认真地点头。
|
||||
|
||||
---
|
||||
|
||||
两人离开艾尔文防线,向格兰之森深处进发。
|
||||
|
||||
一路上,林克向赛丽亚讲解着各种怪物的习性和弱点。赛丽亚认真地听着,偶尔拿出一个小本子记录下来。
|
||||
|
||||
"猫妖的弱点是火焰,但水属性的攻击对它们效果不大。"林克说,"闪电哥布林怕近身战,但它们的雷电攻击速度很快,不能大意。"
|
||||
|
||||
"牛头怪呢?"赛丽亚问。
|
||||
|
||||
林克的表情变得严肃起来。
|
||||
|
||||
"牛头怪是最麻烦的敌人之一。它们力大无穷,皮糙肉厚,普通的攻击很难造成有效伤害。而且它们脾气暴躁,一旦被激怒,会进入狂暴状态,攻击力和速度都会大幅提升。"
|
||||
|
||||
"那怎么对付它们?"
|
||||
|
||||
"躲开正面,攻击侧翼和背后。"林克说,"牛头怪的转身速度比较慢,利用这一点可以取得优势。"
|
||||
|
||||
赛丽亚点点头,把这些都记在本子上。
|
||||
|
||||
---
|
||||
|
||||
越往森林深处走,周围的环境就越发荒凉。
|
||||
|
||||
原本的密林逐渐变成了开阔的草地,但草地上的草都呈现出一种病态的黄色,仿佛被什么东西吸干了生命力。空气中弥漫着一股腥臭的味道,像是野兽的粪便和腐烂的血液混合在一起。
|
||||
|
||||
"这里已经是格拉卡的外围了。"林克警惕地看着四周,"牛头怪的领地。"
|
||||
|
||||
"好安静……"赛丽亚有些不安地说。
|
||||
|
||||
确实,这里太安静了。没有鸟叫,没有虫鸣,甚至连风声都仿佛被什么东西吞噬了。只有两人的脚步声在空旷的草地上回响。
|
||||
|
||||
突然,林克停下了脚步。
|
||||
|
||||
"怎么了?"赛丽亚问。
|
||||
|
||||
林克没有回答,而是握紧了太刀,目光死死盯着前方的草丛。
|
||||
|
||||
"出来。"
|
||||
|
||||
草丛晃动了一下,然后——
|
||||
|
||||
"哞——!!!"
|
||||
|
||||
一声震耳欲聋的咆哮响起,一个庞大的身影从草丛中冲了出来!
|
||||
|
||||
那是一只牛头怪。
|
||||
|
||||
身高超过两米,浑身肌肉虬结,棕黄色的皮毛上沾满了泥土和血迹。它的头颅完全是牛头的模样,两只弯曲的牛角锋利如刀,鼻孔中喷吐着白色的热气。手中握着一根巨大的木棒,棒身上镶嵌着几根铁钉,看起来狰狞可怖。
|
||||
|
||||
"退后!"林克大喊一声,迎了上去。
|
||||
|
||||
牛头怪挥舞着木棒,带起一阵呼啸的风声。林克侧身躲过,太刀在牛头怪的侧腹划出一道伤口。
|
||||
|
||||
"哞——!"
|
||||
|
||||
牛头怪吃痛,更加疯狂地挥舞着木棒。林克不断闪避,寻找着反击的机会。
|
||||
|
||||
"林克,小心!"
|
||||
|
||||
赛丽亚的声音从身后传来。林克本能地向前扑倒,一道白光从他身后射出,击中了牛头怪的眼睛。
|
||||
|
||||
"好机会!"
|
||||
|
||||
林克抓住机会,太刀直刺牛头怪的咽喉。锋利的刀刃穿透了皮毛和肌肉,鲜血喷涌而出。
|
||||
|
||||
牛头怪发出一声凄厉的惨叫,庞大的身躯轰然倒地。
|
||||
|
||||
"呼……"林克喘着粗气,拔出太刀,"谢谢。"
|
||||
|
||||
"我没帮上什么忙……"赛丽亚有些愧疚地说,"只是用照明术晃了它的眼睛。"
|
||||
|
||||
"那也很重要。"林克认真地说,"战斗中任何一点优势都可能决定生死。"
|
||||
|
||||
赛丽亚看着林克认真的表情,心里涌起一股暖意。
|
||||
|
||||
---
|
||||
|
||||
解决了这只牛头怪后,两人继续前进。
|
||||
|
||||
格拉卡的深处比外围更加荒凉。地面上到处都是巨大的蹄印和深深的沟壑,显然这里经常发生激烈的战斗。偶尔能看到一些破碎的武器和防具,还有已经风化得只剩白骨的尸体——那是之前来挑战的冒险者留下的。
|
||||
|
||||
"林克……"赛丽亚的声音有些颤抖,"你看那个。"
|
||||
|
||||
林克顺着她指的方向看去,只见前方的空地上矗立着一根巨大的图腾柱。柱子由整根原木制成,上面刻满了奇怪的符文,顶端挂着几个骷髅头,在风中微微摇晃。
|
||||
|
||||
"牛头怪的图腾柱。"林克低声说,"这意味着我们已经进入了它们的祭祀区域。"
|
||||
|
||||
"祭祀?"
|
||||
|
||||
"牛头怪崇拜力量。"林克解释道,"它们会把自己杀死的强敌的头颅挂在图腾柱上,作为炫耀武力的标志。"
|
||||
|
||||
赛丽亚看着那些骷髅头,心里一阵发寒。
|
||||
|
||||
"别担心。"林克握紧太刀,"我不会让那种事发生的。"
|
||||
|
||||
---
|
||||
|
||||
话音刚落,地面突然开始震动。
|
||||
|
||||
"轰——轰——轰——"
|
||||
|
||||
沉重的脚步声从前方传来,每一步都像是战鼓敲击在两人的心头。林克和赛丽亚同时抬头看去,只见一个巨大的身影正从雾气中缓缓走来。
|
||||
|
||||
那是一只牛头怪。
|
||||
|
||||
但和之前遇到的那只完全不同。
|
||||
|
||||
它的身高超过三米,浑身肌肉如同岩石般坚硬,皮毛呈现出一种诡异的血红色。两只牛角比普通牛头怪大了整整一圈,弯曲的弧度像是死神的镰刀。最引人注目的是它的眼睛——那双眼睛中没有普通牛头怪的狂暴和混乱,而是闪烁着智慧和狡诈的光芒。
|
||||
|
||||
它手中握着一根巨大的图腾柱,柱身上刻满了血色的符文,顶端镶嵌着一颗巨大的红色宝石,不断散发着诡异的光芒。
|
||||
|
||||
"牛头王……萨乌塔……"林克的声音有些干涩。
|
||||
|
||||
这就是格兰之森中最强大的怪物之一,牛头怪族群的首领,无数冒险者的噩梦。
|
||||
|
||||
萨乌塔停在两人面前,低下头,用那双智慧的眼睛打量着他们。
|
||||
|
||||
"人类……"它的声音低沉而沙哑,像是两块巨石在摩擦,"闯入了我的领地……"
|
||||
|
||||
"我们是来挑战你的。"林克握紧太刀,努力让自己的声音保持平静。
|
||||
|
||||
萨乌塔似乎愣了一下,然后——
|
||||
|
||||
"哈哈哈……"它发出一阵低沉的笑声,"有趣……已经很久没有人类敢这样对我说话了……"
|
||||
|
||||
它举起手中的图腾柱,指向林克。
|
||||
|
||||
"来吧,人类。让我看看,你有什么资格挑战我。"
|
||||
|
||||
---
|
||||
|
||||
战斗瞬间爆发。
|
||||
|
||||
萨乌塔的速度远比林克想象中更快。它那庞大的身躯以不可思议的速度冲了过来,图腾柱带着呼啸的风声砸向林克的头顶。
|
||||
|
||||
"好快!"
|
||||
|
||||
林克勉强侧身躲过,图腾柱砸在地面上,激起一片尘土和碎石。他趁机挥刀斩向萨乌塔的侧腹,但刀刃砍在那血红色的皮毛上,竟然只留下一道浅浅的白痕!
|
||||
|
||||
"什么?!"
|
||||
|
||||
"太弱了。"萨乌塔冷冷地说,反手一挥图腾柱。
|
||||
|
||||
林克举刀格挡,但巨大的力量直接将他击飞出去十几米远。他重重地摔在地上,感觉五脏六腑都移了位。
|
||||
|
||||
"林克!"赛丽亚惊叫着跑了过来。
|
||||
|
||||
"别过来!"林克艰难地爬起来,嘴角溢出一丝鲜血,"这家伙……比闪电哥布林王强太多了……"
|
||||
|
||||
萨乌塔缓缓走近,居高临下地看着林克。
|
||||
|
||||
"就这种程度吗?"它的声音中带着失望,"我还以为能稍微娱乐一下……"
|
||||
|
||||
"还没完呢……"
|
||||
|
||||
林克咬紧牙关,体内的诅咒力量开始沸腾。
|
||||
|
||||
血色的光芒在他眼中亮起,红色的血气从皮肤下渗出,在空气中形成淡淡的血雾。
|
||||
|
||||
"哦?"萨乌塔的眼中闪过一丝兴趣,"这是……鬼手的力量?"
|
||||
|
||||
"吼——!!!"
|
||||
|
||||
林克发出一声咆哮,整个人像是炮弹一样冲向萨乌塔。太刀带着血色的刀芒,直取萨乌塔的喉咙。
|
||||
|
||||
"有点意思。"
|
||||
|
||||
萨乌塔举起图腾柱格挡,刀芒砍在柱身上,发出刺耳的金属碰撞声。这一次,林克没有被击飞,而是和萨乌塔僵持在了一起。
|
||||
|
||||
"力量不错。"萨乌塔点点头,"但还不够。"
|
||||
|
||||
它猛然发力,图腾柱上的红色宝石突然亮起,一道血色的光芒从中射出,正中林克的胸口。
|
||||
|
||||
"噗——!"
|
||||
|
||||
林克喷出一口鲜血,整个人再次飞了出去。这一次,他感觉全身的骨头都像是碎了一样,连站起来的力气都没有了。
|
||||
|
||||
"林克!"
|
||||
|
||||
赛丽亚冲到他身边,手中的法杖亮起柔和的白光,拼命为他治疗。
|
||||
|
||||
"没用的。"萨乌塔冷冷地说,"中了我的血之诅咒,他的生命力会不断流失。就算是最强大的治愈术,也无法阻止。"
|
||||
|
||||
赛丽亚的脸色瞬间变得惨白。
|
||||
|
||||
"不……不会的……"
|
||||
|
||||
她拼命催动法杖,泪水不断地从眼角滑落。但正如萨乌塔所说,林克身上的伤口虽然在愈合,但他的生命力确实在不断流失,脸色越来越苍白。
|
||||
|
||||
"赛丽亚……"林克艰难地睁开眼睛,"快走……不要管我……"
|
||||
|
||||
"不!"赛丽亚哭着摇头,"我不会丢下你的!"
|
||||
|
||||
她抬起头,看着缓缓走近的萨乌塔,眼中闪过一丝决然。
|
||||
|
||||
"求求你……放过他……我愿意用任何东西交换……"
|
||||
|
||||
萨乌塔停下脚步,饶有兴趣地看着她。
|
||||
|
||||
"任何东西?"
|
||||
|
||||
"是的……"赛丽亚咬着嘴唇,"我的生命,我的灵魂,什么都可以……"
|
||||
|
||||
"赛丽亚……不要……"林克想要阻止她,但连说话的力气都快没有了。
|
||||
|
||||
萨乌塔沉默了片刻,然后——
|
||||
|
||||
"有趣。"它低下头,用那双智慧的眼睛打量着赛丽亚,"你的体内……有股奇怪的力量……"
|
||||
|
||||
它伸出手,巨大的手掌轻轻触碰赛丽亚的额头。
|
||||
|
||||
"这是……精灵的气息?"
|
||||
|
||||
赛丽亚的身体僵硬了。
|
||||
|
||||
"你……你怎么知道……"
|
||||
|
||||
"哈哈哈……"萨乌塔发出一阵低沉的笑声,"原来如此……原来如此……你就是那个'钥匙'……"
|
||||
|
||||
"钥匙?"赛丽亚困惑地看着它。
|
||||
|
||||
"没什么。"萨乌塔收回手,转身向远处走去,"带上他,离开这里。"
|
||||
|
||||
"什么?"
|
||||
|
||||
"我说,离开这里。"萨乌塔头也不回地说,"今天我不想杀人。"
|
||||
|
||||
"但是……"
|
||||
|
||||
"趁我还没改变主意之前,快走。"
|
||||
|
||||
赛丽亚愣了一下,然后连忙扶起林克,搀着他向森林外走去。
|
||||
|
||||
---
|
||||
|
||||
看着两人离去的背影,萨乌塔的眼中闪过一丝复杂的神色。
|
||||
|
||||
"卡赞的继承者……和精灵的'钥匙'……"它喃喃自语,"有意思……越来越有意思了……"
|
||||
|
||||
它抬起头,看向远方。
|
||||
|
||||
"那个存在……应该也会对这两个人感兴趣吧……"
|
||||
|
||||
---
|
||||
|
||||
与此同时,格兰之森的更深处。
|
||||
|
||||
一片漆黑的洞穴中,有一双血红色的眼睛缓缓睁开。
|
||||
|
||||
"牛头王萨乌塔……放过了他们?"
|
||||
|
||||
那个声音低沉而嘶哑,带着一丝玩味。
|
||||
|
||||
"咯咯咯……看来,游戏变得越来越有趣了……"
|
||||
|
||||
"卡赞的继承者……精灵的'钥匙'……还有那个隐藏在暗处的家伙……"
|
||||
|
||||
"这一切,都在朝着有趣的方向发展……"
|
||||
|
||||
"我很期待……最终的结果……"
|
||||
|
||||
---
|
||||
|
||||
**第六章完**
|
||||
|
||||
---
|
||||
|
||||
## 章节备注
|
||||
- **本章亮点**:林克与赛丽亚组队挑战牛头王萨乌塔,首次遭遇惨败;赛丽亚体内隐藏的秘密被萨乌塔察觉
|
||||
- **本章悬念**:赛丽亚到底是什么身份?萨乌塔所说的"钥匙"是什么意思?那个在暗中窥视的存在是谁?
|
||||
- **下章预告**:冰霜幽暗密林,林克为寻找解药挑战冰女克拉赫;赛丽亚的秘密逐渐揭开
|
||||
367
novels/dnf/chapter-07.md
Normal file
367
novels/dnf/chapter-07.md
Normal file
@ -0,0 +1,367 @@
|
||||
# 第七章:烈焰格拉卡
|
||||
|
||||
## 本章概要
|
||||
- **核心事件**:林克恢复后前往烈焰格拉卡,挑战火女彼诺修
|
||||
- **承接上章**:林克身受重伤,赛丽亚的秘密初现端倪
|
||||
- **悬念钩子**:火女彼诺修与赛丽亚似乎有某种联系?
|
||||
|
||||
---
|
||||
|
||||
艾尔文防线,赛丽亚旅馆。
|
||||
|
||||
林克躺在客房的床上,脸色苍白如纸。距离格拉卡那一战已经过去三天,但萨乌塔的"血之诅咒"依然在他体内肆虐。每到夜晚,他都能感受到生命力在缓慢流失,像是有一只无形的手在一点点抽走他的力量。
|
||||
|
||||
"吱呀——"
|
||||
|
||||
门被轻轻推开,赛丽亚端着一碗热气腾腾的药汤走了进来。
|
||||
|
||||
"该喝药了。"
|
||||
|
||||
林克勉强支撑起身体,接过药碗一饮而尽。苦涩的味道在口腔中蔓延,但他连眉头都没有皱一下。
|
||||
|
||||
"感觉怎么样?"赛丽亚担忧地问。
|
||||
|
||||
"还是老样子。"林克苦笑一声,"萨乌塔说得没错,这诅咒不是普通的治愈术能解除的。"
|
||||
|
||||
赛丽亚的眼圈红了。
|
||||
|
||||
"对不起……都是我连累了你……"
|
||||
|
||||
"别说傻话。"林克打断她,"是我主动挑战萨乌塔的,和你无关。"
|
||||
|
||||
"但是……"
|
||||
|
||||
"而且,"林克看着她的眼睛,"如果不是你,我可能已经死在格拉卡了。"
|
||||
|
||||
两人对视片刻,赛丽亚低下头,眼泪无声地滑落。
|
||||
|
||||
---
|
||||
|
||||
就在这时,门外传来沉重的脚步声。
|
||||
|
||||
"林克小子,还活着吗?"
|
||||
|
||||
林纳斯粗犷的声音从门外传来。门被推开,这位满脸胡须的铁匠大步走了进来,身后跟着阿甘左。
|
||||
|
||||
"师父。"林克想要起身行礼,但被阿甘左按住了肩膀。
|
||||
|
||||
"别动。"阿甘左的声音依然平静,"让我看看你的伤势。"
|
||||
|
||||
他伸出手,按在林克的胸口。一股温热的力量从他掌心传入林克体内,在经脉中游走。
|
||||
|
||||
片刻后,阿甘左收回了手,眉头微微皱起。
|
||||
|
||||
"血之诅咒……比我想象的还要麻烦。"
|
||||
|
||||
"有办法解除吗?"赛丽亚急切地问。
|
||||
|
||||
阿甘左沉默了片刻,然后说道:"有两种方法。"
|
||||
|
||||
"哪两种?"
|
||||
|
||||
"第一种,找到施术者萨乌塔,让它主动解除诅咒。"阿甘左说,"但这几乎不可能。萨乌塔是牛头王,实力远超现在的林克,而且它没有理由放过他。"
|
||||
|
||||
"那第二种呢?"
|
||||
|
||||
"第二种……"阿甘左看向窗外,"找到拥有净化之力的存在,用纯净的能量驱散诅咒。"
|
||||
|
||||
"净化之力?"林克皱眉,"哪里能找到?"
|
||||
|
||||
"烈焰格拉卡。"阿甘左缓缓说道,"那里的守护者——火女彼诺修,据说掌握着火焰的净化之力。"
|
||||
|
||||
"火女彼诺修?"赛丽亚的脸色突然变了,"你是说……那个魔法师?"
|
||||
|
||||
"你认识她?"林克注意到她的反应。
|
||||
|
||||
赛丽亚低下头,声音有些颤抖:"不……只是听说过……她是个非常强大的魔法师,能够召唤陨石雨……很多冒险者都死在她手里……"
|
||||
|
||||
"危险是肯定的。"阿甘左站起身,"但这是目前唯一的机会。血之诅咒如果不解除,林克最多还能撑半个月。"
|
||||
|
||||
房间陷入了沉默。
|
||||
|
||||
"我去。"林克突然开口。
|
||||
|
||||
"林克!"赛丽亚惊呼,"你现在的身体状况……"
|
||||
|
||||
"正因为这样,我才必须去。"林克握紧拳头,"与其在这里等死,不如拼一把。"
|
||||
|
||||
他看向阿甘左:"师父,拜托你帮我准备一些东西。"
|
||||
|
||||
阿甘左点点头:"需要什么?"
|
||||
|
||||
"抗火药剂,越多越好。还有……"林克顿了顿,"帮我打造一把新的武器。"
|
||||
|
||||
"新的武器?"
|
||||
|
||||
"太刀'赤星'已经跟了我很多年,但在格拉卡的战斗中受损了。"林克说,"而且,对付火女,普通的太刀可能不够。"
|
||||
|
||||
林纳斯走上前,拍了拍胸脯:"交给我!正好我手里有一块火抗矿石,可以用来打造一把抗火属性的短剑。"
|
||||
|
||||
"那就拜托了。"林克感激地点点头。
|
||||
|
||||
---
|
||||
|
||||
三天后,林克的伤势稍微稳定了一些。
|
||||
|
||||
虽然血之诅咒依然在他体内,但有了阿甘左的压制,生命力的流失速度减慢了不少。这给了他宝贵的时间。
|
||||
|
||||
赛丽亚旅馆的后院,林纳斯将一把崭新的短剑递给林克。
|
||||
|
||||
"试试看。"
|
||||
|
||||
林克接过短剑,感受到一股清凉的力量从剑柄传来。剑身长约两尺,通体呈现出淡蓝色,剑刃上隐隐有水流般的纹路在流动。
|
||||
|
||||
"这是……"
|
||||
|
||||
"我叫它'霜刃'。"林纳斯得意地说,"用寒铁矿石打造的,对火焰有天然的抗性。虽然不如你的太刀顺手,但在烈焰格拉卡那种地方,它比什么武器都管用。"
|
||||
|
||||
林克挥舞了几下,虽然不如太刀顺手,但确实能感受到剑身上传来的清凉力量。
|
||||
|
||||
"谢谢。"
|
||||
|
||||
"别急着谢我。"林纳斯严肃地说,"烈焰格拉卡可不是闹着玩的地方。那里到处都是火焰,连空气都能烫伤人。而且火女彼诺修……"他摇了摇头,"那女人疯得很,见了冒险者就杀。"
|
||||
|
||||
"我会小心的。"
|
||||
|
||||
"不,你一个人去太危险了。"赛丽亚突然说道。
|
||||
|
||||
林克转过身,看到她背着背包站在门口。
|
||||
|
||||
"这次我也去。"
|
||||
|
||||
"不行!"林克断然拒绝,"你上次已经差点……"
|
||||
|
||||
"正因为上次差点失去你,这次我才更要跟着。"赛丽亚的眼神前所未有的坚定,"而且,我的治愈术虽然解不了诅咒,但可以在战斗中帮你恢复体力。"
|
||||
|
||||
"可是……"
|
||||
|
||||
"让她去吧。"阿甘左的声音从身后传来,"两个人总比一个人强。"
|
||||
|
||||
林克还想说什么,但看着赛丽亚坚定的眼神,最终叹了口气。
|
||||
|
||||
"好吧。但你要答应我,一旦遇到危险,立刻撤退。"
|
||||
|
||||
"我答应你。"
|
||||
|
||||
---
|
||||
|
||||
烈焰格拉卡位于格兰之森的最深处,是一片被火焰永久笼罩的区域。
|
||||
|
||||
当林克和赛丽亚踏足这片土地时,扑面而来的热浪让他们几乎无法呼吸。周围的树木早已被烧成焦炭,地面上到处都是龟裂的痕迹,裂缝中不时喷出炽热的火焰。
|
||||
|
||||
"好热……"赛丽亚擦了擦额头的汗水,"这里的温度比想象中还要高。"
|
||||
|
||||
林克点点头,握紧了手中的"霜刃"。剑身上传来的清凉力量帮他抵御了一部分热浪,但依然能感觉到皮肤被灼烧的刺痛。
|
||||
|
||||
"小心,这里有火焰哥布林。"
|
||||
|
||||
话音刚落,几只浑身燃烧着火焰的哥布林从岩石后面跳了出来。它们比普通哥布林更加瘦小,但浑身燃烧着熊熊烈火,所过之处连石头都被烧得发红。
|
||||
|
||||
"我来对付它们。"林克冲了上去。
|
||||
|
||||
霜刃划过,一只火焰哥布林被斩成两半。但出乎意料的是,它的身体在倒下的瞬间爆炸开来,炽热的火焰向四周蔓延!
|
||||
|
||||
"小心!"
|
||||
|
||||
林克连忙后退,但还是被火焰波及,手臂上出现了几处烧伤。
|
||||
|
||||
"治愈术!"
|
||||
|
||||
赛丽亚立刻为他治疗,柔和的白光笼罩在伤口上,疼痛迅速减轻。
|
||||
|
||||
"这些家伙会自爆。"林克皱眉,"不能和它们近身。"
|
||||
|
||||
"那怎么办?"
|
||||
|
||||
林克想了想,从背包里拿出一瓶蓝色的药剂。
|
||||
|
||||
"抗火药剂,先喝下去。"
|
||||
|
||||
两人喝下药剂,顿时感觉周围的温度降低了不少。接下来,林克改变了战术,利用霜刃的寒气远程攻击,不再给火焰哥布林近身自爆的机会。
|
||||
|
||||
---
|
||||
|
||||
越往深处走,温度就越高。
|
||||
|
||||
当他们来到烈焰格拉卡的核心区域时,眼前的景象让两人都惊呆了。
|
||||
|
||||
那是一片巨大的熔岩湖,湖面不时喷出炽热的岩浆,在空中形成一道道火柱。湖中央有一座由黑曜石构成的平台,平台上站着一个身穿红色长袍的女子。
|
||||
|
||||
那就是火女彼诺修。
|
||||
|
||||
她的长发如同燃烧的火焰般在空中飘舞,手中握着一根镶嵌着红宝石的法杖。她闭着眼睛,似乎在进行某种冥想。
|
||||
|
||||
"那就是……彼诺修?"赛丽亚的声音有些颤抖。
|
||||
|
||||
林克点点头,正要开口,彼诺修却先睁开了眼睛。
|
||||
|
||||
"有趣……"她的声音清冷而高傲,"居然有人能走到这里……"
|
||||
|
||||
她的目光落在林克身上,眼中闪过一丝惊讶:"你身上有血之诅咒的气息……是萨乌塔的手笔?"
|
||||
|
||||
"是的。"林克上前一步,"我听说您掌握着净化之力,可以解除这种诅咒。请帮帮我。"
|
||||
|
||||
彼诺修沉默了片刻,然后——
|
||||
|
||||
"凭什么?"
|
||||
|
||||
"什么?"
|
||||
|
||||
"凭什么我要帮你?"彼诺修冷笑一声,"每天都有冒险者来这里求我解除诅咒,但我凭什么要浪费自己的力量去救一群蝼蚁?"
|
||||
|
||||
"我可以付出任何代价。"林克认真地说。
|
||||
|
||||
"任何代价?"彼诺修的眼中闪过一丝玩味,"包括你的生命?"
|
||||
|
||||
"林克,不要!"赛丽亚惊呼。
|
||||
|
||||
但林克却毫不犹豫地点头:"包括我的生命。"
|
||||
|
||||
彼诺修愣了一下,然后大笑起来:"哈哈哈……有趣……已经很久没有人敢这样对我说话了……"
|
||||
|
||||
她的笑声渐渐停止,目光变得冰冷。
|
||||
|
||||
"好吧,我给你一个机会。"她举起法杖,"如果你能在我召唤的陨石雨中存活三分钟,我就帮你解除诅咒。"
|
||||
|
||||
"三分钟?"林克握紧霜刃,"一言为定。"
|
||||
|
||||
"林克!"赛丽亚拉住他的手,"太危险了!她的陨石雨……"
|
||||
|
||||
"相信我。"林克对她笑了笑,"我答应过你,会活着回去的。"
|
||||
|
||||
---
|
||||
|
||||
彼诺修飞到空中,红色的长袍在热浪中猎猎作响。
|
||||
|
||||
"准备好了吗,小子?"
|
||||
|
||||
林克深吸一口气,握紧霜刃:"来吧。"
|
||||
|
||||
"那么……开始!"
|
||||
|
||||
彼诺修挥动法杖,天空突然变得血红。一颗颗燃烧着火焰的陨石从天而降,像是末日降临般砸向地面!
|
||||
|
||||
"轰——轰——轰——"
|
||||
|
||||
陨石砸在地面上,激起一片片火海。林克拼命闪避,但陨石的数量太多,覆盖范围太广,根本无处可躲!
|
||||
|
||||
"该死!"
|
||||
|
||||
一块陨石擦着他的肩膀落下,炽热的火焰瞬间灼伤了他的皮肤。但他咬紧牙关,继续闪避。
|
||||
|
||||
"一分钟过去了。"彼诺修的声音从空中传来,"你还能撑多久?"
|
||||
|
||||
林克没有回答,他的全部注意力都集中在躲避陨石上。
|
||||
|
||||
但血之诅咒让他的体力流失得比平常更快。不到两分钟,他的动作就开始变得迟缓。
|
||||
|
||||
"林克!"赛丽亚在远处焦急地喊着,"小心左边!"
|
||||
|
||||
林克本能地向右扑倒,一颗巨大的陨石擦着他的身体砸在地上,爆炸的气浪将他掀飞出去。
|
||||
|
||||
"咳……"他吐出一口鲜血,感觉全身的骨头都像是散架了一样。
|
||||
|
||||
"两分钟。"彼诺修冷冷地说,"你已经是强弩之末了。"
|
||||
|
||||
林克艰难地爬起来,看着天空中不断落下的陨石,心中涌起一股无力感。
|
||||
|
||||
难道……真的要在这里结束了吗?
|
||||
|
||||
就在这时——
|
||||
|
||||
"林克!接住!"
|
||||
|
||||
赛丽亚的声音传来,紧接着一道白光射向他。那是一颗散发着柔和光芒的水晶,落在林克手中时,他感觉一股温暖的力量涌入体内,体力瞬间恢复了不少!
|
||||
|
||||
"这是……"
|
||||
|
||||
"精灵之泪!"彼诺修的声音突然变了,"你居然有精灵之泪?!"
|
||||
|
||||
她的目光死死盯着赛丽亚,眼中闪过震惊和复杂的情绪:"你……你到底是什么人?"
|
||||
|
||||
赛丽亚没有回答,只是焦急地看着林克:"快!趁现在!"
|
||||
|
||||
林克握紧精灵之泪,感觉全身充满了力量。他大喝一声,迎着陨石雨冲向彼诺修!
|
||||
|
||||
"疯子!"彼诺修怒喝一声,召唤出更多的陨石。
|
||||
|
||||
但这一次,林克的速度比之前快了一倍。他像是一道闪电,在陨石的缝隙中穿梭,不断接近彼诺修。
|
||||
|
||||
"还有十秒!"
|
||||
|
||||
"给我停下!"
|
||||
|
||||
彼诺修挥动法杖,一道巨大的火墙挡在林克面前。但林克毫不犹豫地冲了进去——霜刃的寒气帮他抵御了火焰的灼烧!
|
||||
|
||||
"三秒!"
|
||||
|
||||
"两秒!"
|
||||
|
||||
"一秒!"
|
||||
|
||||
林克冲破火墙,霜刃直指彼诺修的咽喉!
|
||||
|
||||
彼诺修愣愣地看着眼前这个浑身是伤却依然站着的年轻人,手中的法杖缓缓放下。
|
||||
|
||||
"……你赢了。"
|
||||
|
||||
---
|
||||
|
||||
陨石雨停止了。
|
||||
|
||||
彼诺修落在平台上,看着林克,眼中的冰冷渐渐消融。
|
||||
|
||||
"我很久没有见过像你这样的人了。"她轻声说,"明明已经遍体鳞伤,却依然不肯倒下……"
|
||||
|
||||
"那么……"林克喘着粗气,"你愿意帮我解除诅咒了吗?"
|
||||
|
||||
彼诺修沉默片刻,然后伸出手,按在林克的胸口。
|
||||
|
||||
一股炽热的火焰从她掌心传入林克体内,与血之诅咒激烈碰撞。林克感觉全身像是被火烧一样痛苦,但他咬紧牙关,一声不吭。
|
||||
|
||||
片刻后,彼诺修收回了手。
|
||||
|
||||
"好了。"
|
||||
|
||||
林克低头看去,发现自己胸口处那个血红色的印记已经消失不见。原本不断流失的生命力也恢复了正常。
|
||||
|
||||
"谢谢。"他诚恳地说。
|
||||
|
||||
彼诺修摇摇头,转身看向赛丽亚:"我要和她单独谈谈。"
|
||||
|
||||
"什么?"林克皱眉。
|
||||
|
||||
"放心,我不会伤害她。"彼诺修说,"只是有些问题想要问她。"
|
||||
|
||||
赛丽亚犹豫了一下,然后点点头:"好。"
|
||||
|
||||
她跟着彼诺修走到平台边缘,两人低声交谈着什么。林克听不清她们说的话,但他注意到赛丽亚的脸色不断变化,最后竟然流下了眼泪。
|
||||
|
||||
---
|
||||
|
||||
十分钟后,赛丽亚回来了。
|
||||
|
||||
"她说什么了?"林克关切地问。
|
||||
|
||||
赛丽亚摇摇头,勉强挤出一个笑容:"没什么……只是一些关于魔法的问题……"
|
||||
|
||||
林克看着她红肿的眼睛,知道她在隐瞒什么。但他没有追问,只是轻轻握住她的手。
|
||||
|
||||
"我们回去吧。"
|
||||
|
||||
"嗯。"
|
||||
|
||||
两人转身离开,没有看到身后的彼诺修正用复杂的目光注视着赛丽亚的背影。
|
||||
|
||||
"精灵的'钥匙'……"她喃喃自语,"原来真的存在……"
|
||||
|
||||
---
|
||||
|
||||
**第七章完**
|
||||
|
||||
---
|
||||
|
||||
## 章节备注
|
||||
- **本章亮点**:林克挑战火女彼诺修的陨石雨;赛丽亚使用"精灵之泪"帮助林克;彼诺修似乎知道赛丽亚的秘密
|
||||
- **本章悬念**:彼诺修和赛丽亚说了什么?精灵之泪是什么?赛丽亚和精灵族有什么关系?
|
||||
- **下章预告**:冰霜幽暗密林,冰女克拉赫登场;两位元素师之间的恩怨情仇
|
||||
321
novels/dnf/chapter-08.md
Normal file
321
novels/dnf/chapter-08.md
Normal file
@ -0,0 +1,321 @@
|
||||
# 第八章:冰霜幽暗密林
|
||||
|
||||
## 本章概要
|
||||
- **核心事件**:林克为寻找赛丽亚身世的线索,前往冰霜幽暗密林挑战冰女克拉赫
|
||||
- **承接上章**:火女彼诺修称赛丽亚为"精灵的钥匙",留下重重谜团
|
||||
- **悬念钩子**:冰女克拉赫与彼诺修似乎是旧识,两人之间有何恩怨?
|
||||
|
||||
---
|
||||
|
||||
从烈焰格拉卡回来后,林克的身体逐渐恢复。
|
||||
|
||||
血之诅咒已经解除,加上赛丽亚悉心的照料,他的体力比预想中恢复得更快。但有一个问题始终萦绕在他心头——
|
||||
|
||||
赛丽亚到底是什么人?
|
||||
|
||||
"精灵的钥匙"……彼诺修说的这句话是什么意思?
|
||||
|
||||
他看着正在忙碌的赛丽亚,几次想开口询问,但看着她强颜欢笑的样子,话到嘴边又咽了回去。
|
||||
|
||||
---
|
||||
|
||||
这天傍晚,阿甘左找到了林克。
|
||||
|
||||
"师父?"林克有些意外,"您怎么来了?"
|
||||
|
||||
阿甘左没有直接回答,而是将一张泛黄的羊皮纸放在桌上。
|
||||
|
||||
"这是什么?"
|
||||
|
||||
"冰霜幽暗密林的地图。"阿甘左说,"那里住着一位冰之魔法师——冰女克拉赫。"
|
||||
|
||||
"冰女克拉赫?"林克皱眉,"我听说过她……她和火女彼诺修一样,都是格兰之森的守护者?"
|
||||
|
||||
"没错。"阿甘左点点头,"而且,据我所知,她和彼诺修曾经是同门。"
|
||||
|
||||
"同门?"
|
||||
|
||||
"她们都来自一个古老的魔法组织,后来因理念不合而分道扬镳。"阿甘左说,"克拉赫选择隐居在冰霜幽暗密林,而彼诺修则去了烈焰格拉卡。"
|
||||
|
||||
林克若有所思:"师父的意思是……"
|
||||
|
||||
"彼诺修知道赛丽亚的秘密,但不愿意说。"阿甘左淡淡地说,"但克拉赫可能会告诉我们。"
|
||||
|
||||
"为什么?"
|
||||
|
||||
"因为克拉赫和彼诺修有仇。"阿甘左的嘴角微微上扬,"如果彼诺修想要隐瞒什么,克拉赫一定会反其道而行之。"
|
||||
|
||||
---
|
||||
|
||||
当晚,林克和赛丽亚收拾行装,准备前往冰霜幽暗密林。
|
||||
|
||||
与烈焰格拉卡的炽热不同,冰霜幽暗密林是一片被永恒冰雪覆盖的区域。据说那里的温度常年保持在零下,普通人进去不到十分钟就会被冻成冰雕。
|
||||
|
||||
"这次让我来准备吧。"赛丽亚主动说道。
|
||||
|
||||
她从旅馆的仓库里拿出几件厚重的毛皮大衣,还有几瓶红色的药剂。
|
||||
|
||||
"这是抗寒药剂?"林克惊讶地问。
|
||||
|
||||
"嗯。"赛丽亚点点头,"我早就准备好了……因为我知道,总有一天你会去那里的。"
|
||||
|
||||
林克看着她,心里涌起一股暖意。
|
||||
|
||||
"赛丽亚……"
|
||||
|
||||
"嗯?"
|
||||
|
||||
"谢谢你。"
|
||||
|
||||
赛丽亚愣了一下,然后露出一个温柔的笑容:"傻瓜,谢什么。"
|
||||
|
||||
---
|
||||
|
||||
第二天一早,两人出发前往冰霜幽暗密林。
|
||||
|
||||
与烈焰格拉卡的灼热截然不同,这里是一片银装素裹的世界。参天大树被厚厚的冰雪覆盖,地面上结着厚厚的冰层,每走一步都会发出"咯吱咯吱"的声响。
|
||||
|
||||
空气中弥漫着刺骨的寒意,即使穿着毛皮大衣,林克依然能感觉到寒气透过衣物渗入皮肤。
|
||||
|
||||
"好冷……"赛丽亚缩了缩脖子,呼出的气息瞬间变成白色的雾气。
|
||||
|
||||
"喝下药。"林克递给她一瓶抗寒药剂。
|
||||
|
||||
两人喝下药剂,顿时感觉体内涌起一股暖流,寒冷的感觉减轻了不少。
|
||||
|
||||
"小心,这里有冰奈斯。"林克警惕地看着四周。
|
||||
|
||||
"冰奈斯?"
|
||||
|
||||
"一种由冰元素凝聚而成的生物,平时看起来像普通的冰块,但一旦发现猎物,就会瞬间扑上来。"
|
||||
|
||||
话音刚落,旁边的雪堆突然动了一下,紧接着一个通体透明、形状像是水母的生物飘了出来。它的身体由纯净的冰块构成,散发着幽幽的蓝光。
|
||||
|
||||
"来了!"
|
||||
|
||||
林克拔出"霜刃"——虽然这把剑在烈焰格拉卡帮了大忙,但在这里,它的寒气反而让周围的温度更低了。
|
||||
|
||||
冰奈斯发出一声尖锐的嘶叫,向两人扑了过来。林克侧身躲过,霜刃划过冰奈斯的身体,将它斩成两半。
|
||||
|
||||
但出乎意料的是,被斩成两半的冰奈斯并没有死去,而是迅速重新凝聚,再次扑了上来!
|
||||
|
||||
"这些家伙杀不死?"林克皱眉。
|
||||
|
||||
"要用火!"赛丽亚喊道,"它们怕热!"
|
||||
|
||||
林克想了想,从背包里掏出一张红色的卷轴——那是彼诺修在解除诅咒后送给他的"火焰符文卷轴"。
|
||||
|
||||
"正好试试这个!"
|
||||
|
||||
他展开卷轴,一道炽热的火焰从中喷涌而出,瞬间将冰奈斯吞没。这一次,冰奈斯发出凄厉的惨叫,身体在火焰中迅速融化,最终化为一滩水渍。
|
||||
|
||||
"有效!"林克收起卷轴,"省着点用,只有三张。"
|
||||
|
||||
---
|
||||
|
||||
越往深处走,温度就越低。
|
||||
|
||||
当他们来到冰霜幽暗密林的核心区域时,眼前的景象让两人都惊呆了。
|
||||
|
||||
那是一座完全由冰晶构成的宫殿,宫殿的墙壁透明如镜,在阳光的照射下折射出七彩的光芒。宫殿前有一个巨大的冰湖,湖面光滑如镜,倒映着整个宫殿的影像。
|
||||
|
||||
"那就是……冰女克拉赫的居所?"赛丽亚惊叹道。
|
||||
|
||||
"应该没错。"林克点点头,"走吧。"
|
||||
|
||||
两人小心翼翼地走过冰湖,来到宫殿的大门前。门是敞开的,里面传来一阵悠扬的琴声。
|
||||
|
||||
"有人在弹琴?"赛丽亚有些惊讶。
|
||||
|
||||
他们走进宫殿,只见大厅中央坐着一个身穿蓝色长裙的女子。她有着一头银白色的长发,皮肤白皙得近乎透明,整个人像是由冰雪雕琢而成的艺术品。
|
||||
|
||||
她闭着眼睛,纤细的手指在古琴上轻轻拨动,悠扬的琴声在宫殿中回荡。
|
||||
|
||||
"那就是……冰女克拉赫?"林克低声问。
|
||||
|
||||
"你们来了。"克拉赫睁开眼睛,那是一双如同蓝宝石般清澈的眼眸。
|
||||
|
||||
她停下弹琴,转过头看向两人,目光在赛丽亚身上停留了片刻,眼中闪过一丝惊讶。
|
||||
|
||||
"彼诺修说得没错……你确实来了。"
|
||||
|
||||
"您认识我们?"林克问。
|
||||
|
||||
"彼诺修用传讯魔法告诉我,说有一个'精灵的钥匙'会来找我。"克拉赫站起身,缓缓走到赛丽亚面前,"我原本不信……但现在看来,她说的都是真的。"
|
||||
|
||||
"精灵的钥匙到底是什么?"林克忍不住问道。
|
||||
|
||||
克拉赫看了他一眼,然后转身走向宫殿的窗边。
|
||||
|
||||
"你们知道吗?在很久很久以前,阿拉德大陆上存在着一个强大的种族——精灵族。"
|
||||
|
||||
"精灵族?"赛丽亚的声音有些颤抖。
|
||||
|
||||
"他们拥有强大的魔法力量,能够与大自然沟通,是阿拉德大陆上最古老的种族之一。"克拉赫的声音变得悠远,"但在那场灾难中,精灵族几乎灭绝了……"
|
||||
|
||||
她转过身,看着赛丽亚:"而你,就是精灵族最后的血脉。"
|
||||
|
||||
赛丽亚的身体摇晃了一下,林克连忙扶住她。
|
||||
|
||||
"我……我是精灵?"
|
||||
|
||||
"准确地说,你是'精灵之心'的容器。"克拉赫说,"精灵族在灭亡前,将全族的力量凝聚成一颗宝石——'精灵之心'。而你,就是那颗宝石的化身。"
|
||||
|
||||
"所以……所以才叫'钥匙'?"林克问。
|
||||
|
||||
克拉赫点点头:"因为'精灵之心'是开启'世界树'的钥匙。而世界树,连接着阿拉德大陆与神界的通道。"
|
||||
|
||||
"神界?!"
|
||||
|
||||
"没错。"克拉赫的表情变得严肃,"传说中,如果有人能够获得世界树的力量,就能打破次元壁,进入神界。而这种力量……足以改变整个阿拉德大陆的格局。"
|
||||
|
||||
---
|
||||
|
||||
房间陷入了沉默。
|
||||
|
||||
赛丽亚低着头,身体微微颤抖。林克紧紧握着她的手,能感受到她内心的震惊和恐惧。
|
||||
|
||||
"为什么……为什么要告诉我这些……"赛丽亚的声音几乎微不可闻。
|
||||
|
||||
"因为你是无辜的。"克拉赫轻声说,"你不应该成为那些野心家争夺的道具。"
|
||||
|
||||
她看向窗外,眼中闪过一丝悲伤:"彼诺修……她原本也是这么想的。"
|
||||
|
||||
"您和彼诺修……"林克问。
|
||||
|
||||
"我们曾经是姐妹。"克拉赫说,"在同一个魔法组织中学习,一起憧憬着未来。但后来……她选择了力量,而我选择了隐居。"
|
||||
|
||||
"那她为什么要帮赛丽亚?"
|
||||
|
||||
"因为她后悔了。"克拉赫转过头,看着赛丽亚,"当她发现'精灵的钥匙'真的存在时,她意识到自己的错误。她希望你能掌握自己的命运,而不是被他人利用。"
|
||||
|
||||
赛丽亚抬起头,眼中含着泪水:"那我该怎么办……"
|
||||
|
||||
"变强。"克拉赫坚定地说,"强到足以保护自己,强到足以决定自己的命运。"
|
||||
|
||||
她走到赛丽亚面前,伸出手,轻轻点在赛丽亚的额头。
|
||||
|
||||
"让我帮你一把。"
|
||||
|
||||
一道蓝色的光芒从克拉赫的指尖传入赛丽亚体内。赛丽亚感觉一股清凉的力量在体内流淌,原本模糊不清的记忆片段开始清晰起来。
|
||||
|
||||
"这是……精灵族的传承记忆。"克拉赫收回手,"从今以后,你可以使用真正的精灵魔法了。"
|
||||
|
||||
---
|
||||
|
||||
就在这时,宫殿外突然传来一阵剧烈的震动!
|
||||
|
||||
"轰——!!!"
|
||||
|
||||
冰湖的湖面突然裂开,一个巨大的身影从湖底冲了出来!
|
||||
|
||||
那是一只由冰块构成的巨龙,身长超过十米,浑身散发着刺骨的寒气。它的眼睛是血红色的,张开的大口中露出锋利的冰牙。
|
||||
|
||||
"冰霜巨龙!"克拉赫脸色大变,"它怎么会……"
|
||||
|
||||
"那是……"林克握紧霜刃。
|
||||
|
||||
"它是这片区域的守护者,平时都在湖底沉睡。"克拉赫快速说道,"一定是刚才的传承仪式惊醒了它!"
|
||||
|
||||
"吼——!!!"
|
||||
|
||||
冰霜巨龙发出震耳欲聋的咆哮,张开大口,一道冰冷的龙息向宫殿喷来!
|
||||
|
||||
"小心!"
|
||||
|
||||
克拉赫挥动法杖,一道冰墙挡在三人面前。龙息撞在冰墙上,发出刺耳的轰鸣声。
|
||||
|
||||
"我来对付它!"林克冲了出去。
|
||||
|
||||
"不行!"克拉赫喊道,"冰霜巨龙太强了,你不是它的对手!"
|
||||
|
||||
但林克已经冲到了宫殿外。他握紧霜刃,体内的力量开始沸腾。
|
||||
|
||||
"既然寒气对它无效……那就用火!"
|
||||
|
||||
他掏出最后两张火焰符文卷轴,同时展开!
|
||||
|
||||
"轰——!!!"
|
||||
|
||||
炽热的火焰从卷轴中喷涌而出,形成两条火龙,向冰霜巨龙扑去!
|
||||
|
||||
"吼——!!!"
|
||||
|
||||
冰霜巨龙被火焰击中,发出痛苦的咆哮。但它并没有倒下,而是更加愤怒地向林克扑来!
|
||||
|
||||
"林克!"赛丽亚惊呼。
|
||||
|
||||
就在这千钧一发之际——
|
||||
|
||||
"精灵之箭!"
|
||||
|
||||
一道绿色的光芒从赛丽亚手中射出,正中冰霜巨龙的眉心!那是一支由纯粹的魔力凝聚而成的箭矢,散发着生命的气息。
|
||||
|
||||
"吼——!!!"
|
||||
|
||||
冰霜巨龙发出最后一声哀鸣,庞大的身躯轰然倒地,化为一堆碎冰。
|
||||
|
||||
---
|
||||
|
||||
战斗结束了。
|
||||
|
||||
林克和赛丽亚对视一眼,都从对方眼中看到了震惊。
|
||||
|
||||
"赛丽亚……你……"
|
||||
|
||||
"我……我也不知道……"赛丽亚看着自己的双手,"只是刚才……身体自己动了……"
|
||||
|
||||
克拉赫走到两人面前,脸上露出欣慰的笑容。
|
||||
|
||||
"看来,传承成功了。"
|
||||
|
||||
她看着赛丽亚:"从今以后,你不再是那个只能使用基础治愈术的小女孩了。你是精灵族最后的继承者,是'精灵之心'的守护者。"
|
||||
|
||||
赛丽亚沉默了片刻,然后抬起头,眼中闪过坚定的光芒。
|
||||
|
||||
"我明白了。"
|
||||
|
||||
她看向林克,轻轻握住他的手:"不管我是谁……我都会和你一起走下去。"
|
||||
|
||||
林克看着她,嘴角扬起一个温柔的笑容。
|
||||
|
||||
"嗯。"
|
||||
|
||||
---
|
||||
|
||||
离开冰霜幽暗密林时,克拉赫送给了他们两样东西。
|
||||
|
||||
第一样是一枚蓝色的水晶吊坠,可以增强赛丽亚的魔力。
|
||||
|
||||
第二样是一张古老的地图,上面标注着"暗黑雷鸣废墟"的位置。
|
||||
|
||||
"那里是通往死亡之地的大门。"克拉赫说,"也是你们接下来要去的地方。"
|
||||
|
||||
"暗黑雷鸣废墟?"林克皱眉,"那不是僵尸的领地吗?去那里做什么?"
|
||||
|
||||
"阿甘左之前用传讯魔法告诉我,说你体内的鬼手之力已经达到瓶颈。"克拉赫说,"再继续下去,诅咒会反噬你的神智。"
|
||||
|
||||
"那我该怎么办?"
|
||||
|
||||
"去赫顿玛尔,找GSD。"克拉赫说,"他是鬼剑士的导师,会指引你走向正确的道路。"
|
||||
|
||||
"GSD……"林克喃喃自语。
|
||||
|
||||
他听说过这个名字——赫顿玛尔最强大的鬼剑士,据说同时掌握着四种鬼剑职业的力量。
|
||||
|
||||
"不过在那之前,"克拉赫看向地图,"你先去暗黑雷鸣废墟。那里的死亡气息,会让你看清自己内心真正的渴望。"
|
||||
|
||||
林克握紧手中的霜刃,眼中闪过坚定的光芒。
|
||||
|
||||
"我明白了。"
|
||||
|
||||
---
|
||||
|
||||
**第八章完**
|
||||
|
||||
---
|
||||
|
||||
## 章节备注
|
||||
- **本章亮点**:冰女克拉赫揭示赛丽亚的身世——精灵族最后的血脉;赛丽亚获得精灵族传承,觉醒战斗能力
|
||||
- **本章悬念**:世界树与神界的传说;暗黑雷鸣废墟的转职任务;赛丽亚的命运将会如何?
|
||||
- **下章预告**:暗黑雷鸣废墟,林克的转职任务;挑战僵尸王,成为真正的剑魂!
|
||||
267
novels/dnf/chapter-09.md
Normal file
267
novels/dnf/chapter-09.md
Normal file
@ -0,0 +1,267 @@
|
||||
# 第九章:暗黑雷鸣废墟
|
||||
|
||||
## 本章概要
|
||||
- **核心事件**:林克前往暗黑雷鸣废墟完成转职试炼,面对内心的黑暗
|
||||
- **承接上章**:克拉赫指引林克前往试炼之地,赛丽亚的身世已揭晓
|
||||
- **悬念钩子**:僵尸王背后的秘密;林克将做出怎样的职业抉择?
|
||||
|
||||
---
|
||||
|
||||
暗黑雷鸣废墟,位于格兰之森最阴森的角落。
|
||||
|
||||
这里曾是古代战场,无数战士在此殒命。死亡的气息终年不散,久而久之,死者化作僵尸,在废墟中游荡。普通人踏入此地,不出片刻就会被阴气侵蚀,沦为行尸走肉。
|
||||
|
||||
"这里就是……暗黑雷鸣废墟?"赛丽亚紧紧抓住林克的衣角,声音有些发颤。
|
||||
|
||||
林克点点头,目光凝重地看着前方。
|
||||
|
||||
与之前的地图不同,这里没有阳光,天空永远笼罩着一层灰蒙蒙的雾气。残破的建筑散落在各处,墙壁上爬满了青苔和藤蔓,空气中弥漫着腐朽和死亡的味道。
|
||||
|
||||
"跟紧我。"林克握紧霜刃,"这里的僵尸比普通的怪物更难对付。"
|
||||
|
||||
---
|
||||
|
||||
两人小心翼翼地走进废墟。
|
||||
|
||||
脚下的地面松软潮湿,每一步都会发出"咯吱"的声响。周围的雾气太浓了,能见度不到十米,只能隐约看到废弃建筑的轮廓。
|
||||
|
||||
"吼……"
|
||||
|
||||
突然,一声低沉的嘶吼从雾气中传来。
|
||||
|
||||
林克立刻停下脚步,将赛丽亚护在身后。雾气中,一个摇摇晃晃的身影缓缓走来。
|
||||
|
||||
那是一只僵尸。
|
||||
|
||||
皮肤呈现出青灰色,腐烂的肌肉挂在骨头上,空洞的眼眶中闪烁着幽绿色的光芒。它穿着破烂的盔甲,手中握着一把生锈的长剑,一步一步地向两人靠近。
|
||||
|
||||
"来了!"
|
||||
|
||||
林克冲了上去,霜刃直刺僵尸的胸口。
|
||||
|
||||
"噗嗤——"
|
||||
|
||||
刀刃穿透了僵尸的身体,但它似乎感觉不到疼痛,反而伸出腐烂的手抓向林克!
|
||||
|
||||
"这些家伙……没有痛觉?"
|
||||
|
||||
林克连忙后退,同时挥刀斩下僵尸的头颅。这一次,僵尸终于倒下了,身体化为一滩黑色的脓水。
|
||||
|
||||
"小心!后面还有!"赛丽亚惊呼。
|
||||
|
||||
林克转身,只见雾气中走出了更多的僵尸。它们有的穿着破烂的法师袍,有的拿着断裂的长枪,有的甚至只剩下半个身体,但依然执着地向前爬行。
|
||||
|
||||
"数量太多了……"
|
||||
|
||||
林克咬牙,挥刀斩向最近的一只僵尸。但这些怪物仿佛无穷无尽,杀死一只,又有更多的从雾气中涌出。
|
||||
|
||||
"圣光净化!"
|
||||
|
||||
赛丽亚举起法杖,一道金色的光芒从杖尖射出,笼罩了周围的僵尸。被光芒照到的僵尸发出痛苦的嘶叫,身体开始融化!
|
||||
|
||||
"有效!"林克眼前一亮,"赛丽亚,用你的光魔法!"
|
||||
|
||||
"嗯!"
|
||||
|
||||
赛丽亚不断释放精灵魔法,金色的光芒在废墟中闪烁。僵尸们在光芒中哀嚎着倒下,化为一缕缕黑烟。
|
||||
|
||||
---
|
||||
|
||||
越往深处走,阴气就越重。
|
||||
|
||||
当两人来到废墟的核心区域时,眼前的景象让他们倒吸一口凉气。
|
||||
|
||||
那是一座巨大的祭坛,祭坛上刻满了古老的符文,中央摆放着一个巨大的石棺。石棺周围跪着数十具僵尸,它们似乎在朝拜着什么。
|
||||
|
||||
而在祭坛的最高处,站着一个身穿黑色铠甲的身影。
|
||||
|
||||
那是一个身高超过两米的怪物,全身被黑色的铠甲覆盖,头盔下露出一张腐烂的面孔。它的眼睛是血红色的,手中握着一把巨大的双手剑,剑身上缠绕着黑色的雾气。
|
||||
|
||||
"僵尸王……"林克低声说。
|
||||
|
||||
僵尸王缓缓转过头,血红色的眼睛看向两人。它的声音沙哑而低沉,像是从地狱深处传来:"新鲜的……血肉……"
|
||||
|
||||
"小心,它很强!"林克握紧霜刃,"赛丽亚,你退后!"
|
||||
|
||||
"不,这次我要和你一起战斗!"赛丽亚坚定地说,手中的法杖亮起光芒。
|
||||
|
||||
---
|
||||
|
||||
战斗瞬间爆发。
|
||||
|
||||
僵尸王的速度远比普通僵尸快得多。它挥舞着双手剑,带起一阵黑色的旋风,向林克斩来!
|
||||
|
||||
"好快!"
|
||||
|
||||
林克举刀格挡,但巨大的力量震得他手臂发麻。僵尸王的力量,甚至比牛头王萨乌塔还要恐怖!
|
||||
|
||||
"吼——!"
|
||||
|
||||
僵尸王发出一声咆哮,周围的僵尸们仿佛受到了召唤,纷纷向林克扑来!
|
||||
|
||||
"该死!"
|
||||
|
||||
林克不断闪避,但僵尸的数量太多,他很快就被包围了。
|
||||
|
||||
"精灵之箭!"
|
||||
|
||||
赛丽亚射出一道光芒,将几只僵尸射穿。但更多的僵尸涌了上来,她也被逼得连连后退。
|
||||
|
||||
"这样下去不行……"林克咬紧牙关。
|
||||
|
||||
他能感觉到,体内的鬼手之力在躁动。那股力量想要冲破束缚,想要吞噬一切……
|
||||
|
||||
"不,不能在这里失控……"
|
||||
|
||||
他拼命压制着体内的诅咒,但僵尸王的攻击越来越猛烈,他已经快要支撑不住了。
|
||||
|
||||
"林克!"赛丽亚焦急地喊道,"用你内心的力量!不要抗拒它,去引导它!"
|
||||
|
||||
"引导……?"
|
||||
|
||||
林克愣了一下。
|
||||
|
||||
一直以来,他都在抗拒体内的诅咒,把它当成敌人。但……如果反过来,试着去掌控它呢?
|
||||
|
||||
他闭上眼睛,感受着体内那股狂暴的力量。
|
||||
|
||||
血色的光芒在他眼中亮起,但这一次,他没有抗拒。他任由那股力量在体内流淌,同时用自己的意志去引导它、控制它……
|
||||
|
||||
"吼——!!!"
|
||||
|
||||
林克发出一声长啸,血色的刀芒从霜刃上爆发而出!
|
||||
|
||||
那不是之前那种失控的狂暴,而是一种更加凝练、更加强大的力量!
|
||||
|
||||
"这是……"僵尸王的眼中闪过一丝惊讶。
|
||||
|
||||
林克挥刀斩出,血色的刀芒撕裂了空气,将挡在前面的僵尸全部斩成两段!
|
||||
|
||||
"好强……"林克看着自己的双手,"这就是……掌控诅咒的力量?"
|
||||
|
||||
---
|
||||
|
||||
僵尸王发出愤怒的咆哮,双手剑上缠绕的黑雾更加浓郁。
|
||||
|
||||
"有意思……"它的声音中带着兴奋,"让我看看……你能走到哪一步……"
|
||||
|
||||
它举起双手剑,一道黑色的光柱从天而降,笼罩了它的身体。当光柱消散时,僵尸王的体型变得更加庞大,铠甲上长出了尖锐的骨刺!
|
||||
|
||||
"第二形态?!"林克脸色一变。
|
||||
|
||||
"死吧——!"
|
||||
|
||||
僵尸王挥剑斩下,黑色的剑气撕裂了地面,向林克席卷而来!
|
||||
|
||||
林克连忙闪避,但剑气太快,在他的胸口留下了一道深深的伤口。
|
||||
|
||||
"林克!"赛丽亚冲了过来,拼命为他治疗。
|
||||
|
||||
"我没事……"林克擦去嘴角的鲜血,眼中闪过坚定的光芒。
|
||||
|
||||
他能感觉到,刚才那一瞬间的领悟,让他的实力提升了一个层次。但这还不够……要战胜僵尸王,他需要更强的力量!
|
||||
|
||||
"赛丽亚,"他突然说,"你还记得克拉赫说的话吗?"
|
||||
|
||||
"什么话?"
|
||||
|
||||
"她说,这里的死亡气息……会让人看清内心真正的渴望。"
|
||||
|
||||
林克握紧霜刃,看着眼前强大的僵尸王:"我现在明白了……我渴望的,不是诅咒的力量,也不是鬼神的庇护……"
|
||||
|
||||
他闭上眼睛,脑海中闪过一幅幅画面。
|
||||
|
||||
阿甘左的教导、赛丽亚的笑容、每一次挥剑时的感觉……
|
||||
|
||||
"我渴望的,是用我自己的剑,守护我重要的人!"
|
||||
|
||||
"轰——!!!"
|
||||
|
||||
林克身上爆发出耀眼的光芒,那不是血色的诅咒之力,而是一种更加纯净、更加凌厉的剑气!
|
||||
|
||||
僵尸王愣住了:"这是……剑魂的气息?"
|
||||
|
||||
"没错。"林克睁开眼睛,眼中闪烁着锋利的光芒,"我要成为剑魂——以剑为魂,斩断一切的剑士!"
|
||||
|
||||
---
|
||||
|
||||
这一刻,林克终于做出了自己的选择。
|
||||
|
||||
不是狂战士的狂暴,不是鬼泣的鬼神,也不是阿修罗的波动……
|
||||
|
||||
而是剑魂——追求极致剑术的纯粹战士!
|
||||
|
||||
他举起霜刃,剑身上亮起耀眼的白光。那是剑魂的"光剑掌握"在觉醒,虽然他还没有真正的光剑,但剑魂的力量已经开始在他体内流淌。
|
||||
|
||||
"斩——!"
|
||||
|
||||
林克挥剑斩出,一道白色的剑气撕裂了空间,直奔僵尸王!
|
||||
|
||||
"不——!!!"
|
||||
|
||||
僵尸王举起双手剑格挡,但剑气直接穿透了它的防御,将它斩成两半!
|
||||
|
||||
黑色的雾气从僵尸王体内涌出,它的身体开始崩溃。
|
||||
|
||||
"有意思……"僵尸王的声音变得微弱,"剑魂吗……希望你……不会后悔……"
|
||||
|
||||
说完,它的身体化为一堆白骨,散落在祭坛上。
|
||||
|
||||
---
|
||||
|
||||
战斗结束了。
|
||||
|
||||
林克跪在地上,大口大口地喘着粗气。刚才那一击,耗尽了他全部的体力。
|
||||
|
||||
"林克!你没事吧?"赛丽亚跑过来,担心地看着他。
|
||||
|
||||
"我没事……"林克抬起头,露出一个疲惫的笑容,"我做到了……我选择了自己的道路……"
|
||||
|
||||
赛丽亚看着他,眼中含着泪水,但嘴角却扬起温柔的弧度。
|
||||
|
||||
"嗯,你做到了。"
|
||||
|
||||
---
|
||||
|
||||
就在这时,祭坛上的石棺突然发出一阵光芒。
|
||||
|
||||
林克和赛丽亚警惕地看过去,只见石棺缓缓打开,里面放着一把散发着柔和光芒的长剑。
|
||||
|
||||
那是一把光剑。
|
||||
|
||||
剑身由纯粹的光能量构成,没有实体,但却散发着令人心悸的锋芒。
|
||||
|
||||
"这是……"林克惊讶地看着那把剑。
|
||||
|
||||
"试炼的奖励。"一个苍老的声音突然响起。
|
||||
|
||||
两人吓了一跳,转头看去,只见一个身穿黑袍的老人不知何时出现在祭坛边缘。他蒙着双眼,手中拄着一根拐杖,但浑身上下散发着强大的气息。
|
||||
|
||||
"GSD?!"林克认出了这个声音。
|
||||
|
||||
"呵呵,没想到你还记得我。"GSD微微一笑,"我感应到这里有强烈的剑魂气息觉醒,所以过来看看。没想到……你居然在战斗中完成了转职的觉悟。"
|
||||
|
||||
"转职……"林克看着自己的双手,"我已经……"
|
||||
|
||||
"是的,你已经踏上了剑魂的道路。"GSD说,"但真正的转职仪式,还需要在赫顿玛尔完成。"
|
||||
|
||||
他看向石棺中的光剑:"那把剑,是以前一位剑魂留下的。既然你选择了这条路,它就归你了。"
|
||||
|
||||
林克站起身,走到石棺前,郑重地拿起了那把光剑。
|
||||
|
||||
当他的手握住剑柄时,光剑发出一阵欢快的嗡鸣,仿佛在迎接新的主人。
|
||||
|
||||
"从今以后,你就叫'晨曦'吧。"林克轻声说。
|
||||
|
||||
光剑闪烁了一下,似乎在回应他。
|
||||
|
||||
---
|
||||
|
||||
**第九章完**
|
||||
|
||||
---
|
||||
|
||||
## 章节备注
|
||||
- **本章亮点**:林克在生死关头完成转职觉悟,选择成为剑魂;获得第一把光剑"晨曦"
|
||||
- **本章悬念**:僵尸王临死前说的话是什么意思?GSD的出现是巧合还是早有安排?
|
||||
- **下章预告**:前往赫顿玛尔,正式完成转职仪式;与赫顿玛尔的NPC们互动;天空之城篇即将开启!
|
||||
271
novels/dnf/dnf-chapter-01.md
Normal file
271
novels/dnf/dnf-chapter-01.md
Normal file
@ -0,0 +1,271 @@
|
||||
# 第一章 洛兰的风
|
||||
|
||||
艾尔文防线的清晨是从铁匠铺的锤声开始的。
|
||||
|
||||
"叮——叮——叮——"
|
||||
|
||||
林克睁开眼,发现自己躺在一张简陋的木床上。陌生的天花板,陌生的气味——铁锈、机油,还有一股淡淡的烧焦味。他坐起身,摸了摸腰间,太刀还在。
|
||||
|
||||
"醒了?"
|
||||
|
||||
声音从门口传来。林克转过头,看到一个金发中年男人站在那里,手里提着一个水桶。男人的脸上有一道浅浅的疤痕,从左眉一直延伸到颧骨。
|
||||
|
||||
"你是...?"
|
||||
|
||||
"林纳斯,这儿的铁匠。"男人走进来,把水桶放在床边,"昨天你在林子里晕倒了,被阿甘左捡回来的。"
|
||||
|
||||
林克努力回忆。他记得自己从虚祖出发,一路向西,穿越了大半个阿拉德大陆,最后来到这个叫艾尔文防线的地方。然后...他在洛兰的森林里迷路了,遇到了几只哥布林,打了一架,然后...
|
||||
|
||||
"我晕倒了?"
|
||||
|
||||
"失血过多。"林纳斯指了指他左肩的绷带,"哥布林的短刀虽然锈,但划开皮肉还是没问题的。你运气好,阿甘左刚好路过。"
|
||||
|
||||
林克低头看了看自己的肩膀,绷带上还有隐约的血迹。他活动了一下手臂,还能动,只是有点疼。
|
||||
|
||||
"谢谢。"
|
||||
|
||||
"不用谢我,谢阿甘左。"林纳斯转身往外走,"醒了就起来吃点东西,然后来铁匠铺找我。有话跟你说。"
|
||||
|
||||
---
|
||||
|
||||
艾尔文防线比林克想象中要小。
|
||||
|
||||
几间木屋,一排栅栏,一块写着"冒险家登记处"的破旧木牌,还有...一群穿着皮甲、背着武器的人。冒险家,林克知道。他们和他一样,是为了讨伐怪物、完成任务而来的。
|
||||
|
||||
他找到林纳斯的铁匠铺,推门进去。铺子里很暗,只有炉火的光芒在跳动。墙壁上挂着各种武器——剑、斧、锤、匕首,还有一些林克叫不出名字的东西。
|
||||
|
||||
"坐。"林纳斯指了指角落的木凳。
|
||||
|
||||
林克坐下,等他开口。
|
||||
|
||||
"你从哪儿来?"
|
||||
|
||||
"虚祖。"
|
||||
|
||||
"来艾尔文防线做什么?"
|
||||
|
||||
"当冒险家。"
|
||||
|
||||
林纳斯看了他一眼,眼神有些复杂。"你知道冒险家是干什么的吗?"
|
||||
|
||||
"打怪,挣钱,变强。"林克说得理所当然。
|
||||
|
||||
林纳斯笑了,笑得很短促。"倒也没错。"他停顿了一下,"你带武器了吗?"
|
||||
|
||||
林克拍了拍腰间的太刀。那是一把普通的武器,刀身有些锈迹,刀柄的皮革也磨损得厉害。
|
||||
|
||||
"能看看吗?"
|
||||
|
||||
林克解下太刀,递过去。林纳斯接过来,扫了一眼,眉头微皱。
|
||||
|
||||
"这把刀...你在虚祖用的?"
|
||||
|
||||
"是。"
|
||||
|
||||
"用了多久?"
|
||||
|
||||
"三年。"
|
||||
|
||||
林纳斯点点头,把太刀放在工作台上,从角落里翻出一块磨刀石。
|
||||
|
||||
"你这把刀,刃口已经钝了。"他一边说一边开始磨刀,"刀刃要锋利,才能切开敌人的防御。刀身要坚韧,才能承受冲击。刀柄要稳固,才能保证精准。"他抬起头,"这些都是基础,但最重要的,是握刀的人。"
|
||||
|
||||
"明白。"
|
||||
|
||||
林纳斯打量着他。"你眼睛里的红光,是卡赞诅咒吧?"
|
||||
|
||||
林克沉默片刻,点了点头。
|
||||
|
||||
每个鬼剑士都背负着卡赞的诅咒。那是刻在血脉里的烙印,会在某个时刻爆发——有些人终生不受影响,有些人则会在某一刻失去理智,变成只知道杀戮的怪物。林克的眼瞳深处有一丝不易察觉的红色,那是诅咒的痕迹。
|
||||
|
||||
"程度很轻。"林纳斯说,"目前看来不影响战斗。但要记住,永远不要被愤怒支配。那是诅咒最喜欢的土壤。"
|
||||
|
||||
"我知道。"
|
||||
|
||||
"好。"林纳斯把磨好的太刀递还给他,"今天去洛兰打几只哥布林试试身手。你的刀能用了,但你自己呢?"
|
||||
|
||||
---
|
||||
|
||||
洛兰在艾尔文防线的东边,是一片广袤的森林。
|
||||
|
||||
林克沿着碎石小径走进林子,很快就感受到了不同。这里的空气中弥漫着一股腐臭味,脚下的落叶发出"咔嚓咔嚓"的声响,四周的灌木丛时不时会传来窸窸窣窣的声音。
|
||||
|
||||
他握紧太刀,保持着随时可以出刀的姿势。
|
||||
|
||||
"哥布林!"
|
||||
|
||||
一个尖锐的声音从左侧传来。林克侧身,一道黑影从他刚才站立的位置飞过——是一把生锈的短刀。他转头看去,一只绿色的怪物从灌木丛中跳出来,眼睛里满是残忍的光芒。
|
||||
|
||||
哥布林。林克见过这种东西,在虚祖的边境森林里。它们是最低级的怪物,但数量众多,而且很狡猾。
|
||||
|
||||
"哥布哥布!"怪物发出难听的叫声,扑向林克。
|
||||
|
||||
林克侧身,太刀出鞘。
|
||||
|
||||
"嗖——"
|
||||
|
||||
刀光一闪,哥布林的头颅飞起。身体还在惯性作用下冲了几步,才倒在地上。
|
||||
|
||||
"一只。"林克甩了甩刀身上的血迹,继续向前。
|
||||
|
||||
然后,他听到了更多的声音。
|
||||
|
||||
"哥布!哥布!"
|
||||
|
||||
从四面八方,有十几只哥布林从灌木丛中钻出来,把他团团围住。它们的眼睛里满是贪婪和残忍,手中的短刀在阳光下闪着寒光。
|
||||
|
||||
林克握紧刀柄,深吸一口气。
|
||||
|
||||
"来吧。"
|
||||
|
||||
---
|
||||
|
||||
战斗比想象中更激烈。
|
||||
|
||||
哥布林虽然单个很弱,但数量太多了。林克挥刀砍倒一只,另一只就从背后扑上来;他侧身躲过一击,第三只又扔来了短刀。
|
||||
|
||||
"该死!"他的左臂被划开了一道口子,血流了出来。
|
||||
|
||||
疼痛让他更加清醒。他咬紧牙关,太刀在空中划出一道道弧线。第一只、第二只、第三只...
|
||||
|
||||
十分钟后,最后一只哥布林也倒在了地上。
|
||||
|
||||
林克单膝跪地,喘着粗气。他的皮甲上全是血迹——有哥布林的,也有他自己的。左臂的伤口还在流血,右腿也被划了一刀。
|
||||
|
||||
"太弱了。"他低声说,"还太弱了。"
|
||||
|
||||
"不错了,第一次就能打倒十二只哥布林。"
|
||||
|
||||
一个沙哑的声音从身后传来。林克猛然转身,看到一个穿着黑色斗篷的男人站在树下。男人的肩膀上停着一只乌鸦,黑色的羽毛在风中纹丝不动。
|
||||
|
||||
"你是...?"
|
||||
|
||||
"阿甘左。"男人走进几步,"昨天把你从林子里捡回来的就是我。"
|
||||
|
||||
林克想起林纳斯的话,站起身,微微欠身:"谢谢。"
|
||||
|
||||
"不用谢。"阿甘左打量了他一番,"你的剑术...虚祖的?"
|
||||
|
||||
"是。"
|
||||
|
||||
"基本功不错,但实战经验太少。"阿甘左说,"刚才那十二只哥布林,如果换成有经验的冒险家,根本不会受伤。"
|
||||
|
||||
林克沉默。他知道阿甘左说的是实话。
|
||||
|
||||
"想学更多吗?"阿甘左问。
|
||||
|
||||
林克抬起头,眼神灼灼:"想。"
|
||||
|
||||
"那就从洛兰深处开始。"阿甘左转身,向森林更深处走去,"跟上。"
|
||||
|
||||
---
|
||||
|
||||
洛兰深处比外围更暗。
|
||||
|
||||
树木更加高大,枝叶几乎遮住了所有的阳光。空气中弥漫着更浓烈的腐臭味,脚下的落叶也变得湿润黏滑。
|
||||
|
||||
"注意脚下。"阿甘左走在前面,声音低沉,"这里有陷阱。"
|
||||
|
||||
"陷阱?"
|
||||
|
||||
"哥布林会挖坑,里面放尖刺。踩上去就是贯穿伤。"阿甘左停下脚步,用脚尖拨开一片落叶——下面是一个两米深的坑,底部插着削尖的木刺。
|
||||
|
||||
林克暗自心惊。如果没有阿甘左提醒,他可能已经踩上去了。
|
||||
|
||||
"冒险不是只有打打杀杀。"阿甘左继续向前,"观察、判断、预判,这些比剑术更重要。"
|
||||
|
||||
"明白。"
|
||||
|
||||
他们走了大约十分钟,前方出现了一片空地。空地上聚集着二十多只哥布林,比刚才那些更大、更强壮。而在哥布林群的中央,站着一只体型格外庞大的怪物——近一米五高,手里提着一把生锈的铁斧,脑袋上戴着一个用骨头做的头盔。
|
||||
|
||||
"哥布林头目。"阿甘左说,"洛兰深处的老大。你的目标。"
|
||||
|
||||
林克握紧太刀,盯着那只头目。
|
||||
|
||||
"一个人打?"
|
||||
|
||||
"一个人。"
|
||||
|
||||
林克深吸一口气,缓缓向前走去。哥布林们很快发现了他,发出尖锐的叫声。头目转过身,黄色的眼睛里闪过一丝嘲讽。
|
||||
|
||||
"哥布!哥布!"
|
||||
|
||||
它举起铁斧,向林克冲来。
|
||||
|
||||
---
|
||||
|
||||
战斗从一开始就很艰难。
|
||||
|
||||
哥布林头目比普通哥布林强太多了。它的力量很大,每一斧劈下来都带起一阵风声;它的速度也不慢,挥斧的动作行云流水,显然是打过很多仗的老手。
|
||||
|
||||
林克左躲右闪,几次险些被劈中。他的太刀在头目的皮甲上留下几道浅浅的痕迹,但根本造不成致命伤。
|
||||
|
||||
"力量不够。"他咬牙,"太刀太轻了!"
|
||||
|
||||
"那就用技巧。"阿甘左的声音从远处传来,"不要和它硬碰硬。找它的弱点!"
|
||||
|
||||
弱点?林克眯起眼睛,观察着头目的动作。它的皮甲很厚,但有几个地方比较薄弱——脖颈、腹部、膝盖后侧...
|
||||
|
||||
头目再次挥斧,林克这次没有躲,而是迎着斧刃冲了上去。在斧头即将落下的瞬间,他猛然侧身,太刀从侧面刺入头目的脖颈。
|
||||
|
||||
"嗤——"
|
||||
|
||||
鲜血喷涌而出。头目发出一声惨叫,铁斧脱手落地。它捂着脖子,踉跄后退,最终倒在血泊中。
|
||||
|
||||
周围的哥布林看到老大被杀,顿时四散而逃。林克喘着粗气,太刀撑着身体,不让自己倒下。
|
||||
|
||||
"不错。"阿甘左走过来,点点头,"第一个正式任务,完成。"
|
||||
|
||||
林克抬起头,勉强笑了笑。
|
||||
|
||||
"我...还能更强。"
|
||||
|
||||
"当然能。"阿甘左伸出手,把他拉起来,"这才只是开始。洛兰之后是格兰之森,格兰之森之后是天空之城,天空之城之后...还有更远的地方。"
|
||||
|
||||
"更远的地方?"
|
||||
|
||||
"天界。"阿甘左的目光变得深邃,"在天之上,有一座倒悬的城市。那里有光之城主赛格哈特,还有...更可怕的东西。"
|
||||
|
||||
林克沉默片刻,然后握紧了太刀。
|
||||
|
||||
"总有一天,我要去看看。"
|
||||
|
||||
阿甘左看着他,嘴角微微上扬。
|
||||
|
||||
"那就先活下来吧,小子。"
|
||||
|
||||
---
|
||||
|
||||
回到艾尔文防线时,已经是黄昏。
|
||||
|
||||
林纳斯在铁匠铺门口等着他们。看到林克满身是血但还活着,他点了点头。
|
||||
|
||||
"第一天,能活着回来就是胜利。"他说,"伤口去赛丽亚那儿包扎一下。"
|
||||
|
||||
"赛丽亚?"
|
||||
|
||||
"旅馆的老板娘,就在街角那栋粉色的小楼里。"林纳斯指了指,"人很好,不会收你钱的。"
|
||||
|
||||
林克道了谢,向旅馆走去。推开那扇浅蓝色的木门,一个粉色头发的女孩从柜台后面探出头来。
|
||||
|
||||
"欢迎光临...咦,你受伤了?"
|
||||
|
||||
她的眼睛是淡淡的绿色,像是春天的新叶。脸上带着几分稚气,但眼神却有一种超越年龄的温柔。
|
||||
|
||||
"没事,小伤。"林克说,"你是...赛丽亚?"
|
||||
|
||||
"是,我是赛丽亚。"女孩绕出柜台,走到他面前,"你的伤口...我帮你包扎一下吧。"
|
||||
|
||||
"麻烦了。"
|
||||
|
||||
赛丽亚微笑着摇摇头,转身去拿医药箱。林克看着她的背影,心里有一种说不清的感觉。
|
||||
|
||||
这是他来到艾尔文防线的第一天。打倒了十二只哥布林,杀了一只哥布林头目,结识了林纳斯和阿甘左,还遇到了这个温柔的粉色发女孩。
|
||||
|
||||
明天,他要去更远的地方。
|
||||
|
||||
洛兰深处,只是开始。
|
||||
|
||||
---
|
||||
|
||||
**第一章完**
|
||||
299
novels/dnf/dnf-chapter-02.md
Normal file
299
novels/dnf/dnf-chapter-02.md
Normal file
@ -0,0 +1,299 @@
|
||||
# 第二章 洛兰深处
|
||||
|
||||
清晨的阳光透过窗户洒进来,在地板上投下一道金色的光带。林克睁开眼,发现自己还在赛丽亚的旅馆里。
|
||||
|
||||
昨晚的记忆有些模糊。他只记得自己在赛丽亚的帮助下包扎了伤口,然后...就睡着了。那张床很软,被子上有阳光和薰衣草混合的味道,和他三年流浪生涯中睡过的任何地方都不一样。
|
||||
|
||||
"醒了?"
|
||||
|
||||
熟悉的声音从门口传来。林克转过头,看到赛丽亚端着一个托盘走进来。托盘上放着一碗粥、几片面包,还有一杯冒着热气的牛奶。
|
||||
|
||||
"谢谢。"林克坐起身,接过托盘。
|
||||
|
||||
"你的伤口还疼吗?"赛丽亚问,目光落在他左肩的绷带上。
|
||||
|
||||
"还好,不碍事。"
|
||||
|
||||
赛丽亚点点头,脸上带着温柔的笑意。"林纳斯先生说,让你吃了早饭去铁匠铺找他。"
|
||||
|
||||
"好。"林克拿起勺子,舀了一口粥。粥是白米熬的,里面加了肉沫,味道很香。他已经很久没吃过这么像样的早饭了。
|
||||
|
||||
"慢慢吃,不急。"赛丽亚说完,转身往外走。走到门口时,她停下脚步,"那个..."她有些犹豫,"你昨天打倒了很多哥布林吧?"
|
||||
|
||||
林克愣了一下,点点头:"十二只,还有一只头目。"
|
||||
|
||||
"好厉害。"赛丽亚的眼睛亮了起来,"艾尔文防线已经很久没出现过这么厉害的冒险家了。"
|
||||
|
||||
林克不知道该说什么,只好低头继续喝粥。
|
||||
|
||||
赛丽亚似乎意识到自己的话让他有些不自在,笑了笑,轻轻带上门离开了。
|
||||
|
||||
---
|
||||
|
||||
铁匠铺的炉火已经烧得很旺。
|
||||
|
||||
林纳斯站在工作台前,正在打磨一把短剑。看到林克进来,他放下手里的活,从柜台下面拿出一个钱袋。
|
||||
|
||||
"昨天的报酬。"
|
||||
|
||||
林克接过来,掂了掂。钱袋不重,但里面有金属碰撞的声音。
|
||||
|
||||
"多少?"
|
||||
|
||||
"五十银币。"林纳斯说,"十二只普通哥布林,一只哥布林头目。按市价算的。"
|
||||
|
||||
林克打开钱袋看了看。银币在晨光下闪着柔和的光泽,每一枚上面都刻着阿拉德王室的徽章。
|
||||
|
||||
"谢谢。"
|
||||
|
||||
"这是你应得的。"林纳斯坐回木凳上,"不过,我得提醒你一件事。"
|
||||
|
||||
"什么?"
|
||||
|
||||
"昨天你之所以能活着回来,是因为阿甘左在旁边看着。"林纳斯说,"如果只有你自己,遇到那个头目的时候,可能已经没命了。"
|
||||
|
||||
林克沉默。他知道林纳斯说的是实话。
|
||||
|
||||
"你觉得自己很强?"
|
||||
|
||||
"没有。"
|
||||
|
||||
"那就好。"林纳斯点点头,"自信是好事,但自负会害死人。"他停顿了一下,"阿甘左今天早上来找我,说他想收你做徒弟。"
|
||||
|
||||
林克猛地抬头:"真的?"
|
||||
|
||||
"真的。"林纳斯看着他,"但你得想清楚。阿甘左不是普通人,他教徒弟的方式...很特别。"
|
||||
|
||||
"什么意思?"
|
||||
|
||||
"意思是你可能会吃很多苦。"林纳斯说,"但如果你熬过来了,你会变得很强。"
|
||||
|
||||
林克握紧拳头。
|
||||
|
||||
"我接受。"
|
||||
|
||||
---
|
||||
|
||||
阿甘左在艾尔文防线东边的山坡上等着他。
|
||||
|
||||
男人背对着朝阳,黑色的斗篷在风中猎猎作响。肩膀上的乌鸦歪着头,黄色的眼睛盯着林克,像是在审视他。
|
||||
|
||||
"来了?"阿甘左转过身。
|
||||
|
||||
"是。"
|
||||
|
||||
"想好了?"
|
||||
|
||||
"想好了。"
|
||||
|
||||
阿甘左点点头,从斗篷下抽出一把剑,扔给林克。
|
||||
|
||||
那是一把木剑,做工粗糙,但握在手里很扎实。
|
||||
|
||||
"今天不用真刀。"阿甘左说,"用这把木剑,跟我进洛兰深处。"
|
||||
|
||||
"木剑?"林克皱眉,"怎么打?"
|
||||
|
||||
"打到就行。"阿甘左说,"木剑打不死人,但打晕了也一样。"
|
||||
|
||||
林克掂了掂手里的木剑。确实,剑身很沉,打在头上绝对能让人昏过去。
|
||||
|
||||
"跟上。"
|
||||
|
||||
阿甘左转身向森林走去,林克快步跟上。
|
||||
|
||||
---
|
||||
|
||||
洛兰深处和昨天不太一样。
|
||||
|
||||
阳光被茂密的树冠遮住,林子里很暗。空气中弥漫着一股潮湿的霉味,脚下的落叶发出"咯吱咯吱"的声响。
|
||||
|
||||
"注意听。"阿甘左低声说。
|
||||
|
||||
林克屏住呼吸,仔细聆听。除了风声和树叶的沙沙声,他还听到了一些别的声音——从四面八方传来的窸窣声,像是有什么东西在灌木丛中移动。
|
||||
|
||||
"哥布林。"阿甘左说,"至少二十只。"
|
||||
|
||||
林克握紧木剑,手心开始冒汗。
|
||||
|
||||
"分散它们。"阿甘左说,"不要被包围。"
|
||||
|
||||
话音刚落,第一只哥布林就从左侧的灌木丛中扑了出来。林克侧身躲过,木剑横扫,正中哥布林的脑袋。
|
||||
|
||||
"砰!"
|
||||
|
||||
哥布林惨叫一声,捂着脑袋倒在地上。
|
||||
|
||||
"力道刚好。"阿甘左点评道,"继续。"
|
||||
|
||||
更多的哥布林从四面八方涌来。林克在它们之间穿梭,木剑每一次挥出都能准确命中目标。不是脑袋就是膝盖,都是能让人失去行动能力的部位。
|
||||
|
||||
但他很快发现,哥布林的数量比想象中更多。
|
||||
|
||||
"该死!"一只哥布林从他背后扑上来,短刀划破了他的皮甲,在背上留下一道血痕。
|
||||
|
||||
林克咬牙,转身一剑把那只哥布林打晕。
|
||||
|
||||
"别分心。"阿甘左的声音从远处传来,"背后交给我。"
|
||||
|
||||
林克愣了一下,然后专注于眼前的敌人。有了阿甘左在后面掩护,他可以全力进攻。
|
||||
|
||||
十分钟后,最后一只哥布林倒在地上。
|
||||
|
||||
林克喘着粗气,木剑撑地。他的皮甲上多了几道划痕,背上和手臂上都有伤口在流血。
|
||||
|
||||
"比昨天有进步。"阿甘左走过来,"知道用木剑控制力道了。"
|
||||
|
||||
"但还是很狼狈。"林克苦笑。
|
||||
|
||||
"正常。"阿甘左说,"你的敌人不是这些哥布林,而是你自己。"
|
||||
|
||||
"什么意思?"
|
||||
|
||||
"你太急了。"阿甘左说,"每一剑都想击倒敌人,结果反而露出了破绽。剑术的最高境界不是快,是准。找准时机,一剑就够了。"
|
||||
|
||||
林克沉默片刻,点点头。
|
||||
|
||||
"继续。"阿甘左转身向森林深处走去,"前面还有更强的。"
|
||||
|
||||
---
|
||||
|
||||
他们在林子深处发现了一片空地。
|
||||
|
||||
空地的中央有一个用石头和树枝搭成的简陋祭坛,祭坛周围站着十几只哥布林。它们比普通哥布林更高大、更强壮,手里提着铁斧和短刀。
|
||||
|
||||
而在祭坛的最高处,站着一只体型庞大的怪物。
|
||||
|
||||
那是一只哥布林头目,比昨天那只还要大一圈。它的身高接近两米,浑身肌肉虬结,手里提着一把巨大的铁锤。它的皮肤是深绿色的,上面布满了伤疤,显示出它经历过无数战斗。
|
||||
|
||||
"这才是洛兰深处的老大。"阿甘左说,"昨天那只只是个小头目。"
|
||||
|
||||
林克握紧木剑,心跳开始加速。
|
||||
|
||||
"打吗?"
|
||||
|
||||
"打。"阿甘左说,"但有个条件。"
|
||||
|
||||
"什么条件?"
|
||||
|
||||
"只能用木剑,不能拔你的太刀。"阿甘左看着他,"如果你能用木剑打败它,我就教你真正的剑术。"
|
||||
|
||||
林克深吸一口气,看着那只庞大的头目。
|
||||
|
||||
"好。"
|
||||
|
||||
---
|
||||
|
||||
战斗一开始就很艰难。
|
||||
|
||||
哥布林头目的力量大得惊人。它挥舞铁锤的时候,带起的风声让林克不得不后退躲避。木剑打在它的皮甲上,发出"砰砰"的闷响,但根本无法造成实质性的伤害。
|
||||
|
||||
"该死!"林克被一锤逼退,差点摔倒。
|
||||
|
||||
"观察!"阿甘左的声音从远处传来,"找到弱点!"
|
||||
|
||||
林克咬牙,强迫自己冷静下来。他仔细观察着头目的动作——它的皮甲很厚,但脖颈处有一块没有防护的地方;它的力量很大,但速度不算快;它的攻击范围很广,但转身的时候会有短暂的僵直...
|
||||
|
||||
机会!
|
||||
|
||||
头目再次挥锤,林克没有躲,而是迎着锤风冲了上去。在铁锤即将落下的瞬间,他猛然侧身,木剑从侧面刺向头目的脖颈。
|
||||
|
||||
"砰!"
|
||||
|
||||
木剑击中头目的颈部,发出一声闷响。头目惨叫一声,捂着脖子后退。
|
||||
|
||||
但还没结束。
|
||||
|
||||
头目咆哮着,举起铁锤向林克砸来。林克侧身躲过,木剑再次击中它的膝盖。
|
||||
|
||||
"咔嚓!"
|
||||
|
||||
骨头断裂的声音。头目单膝跪地,铁锤脱手落地。
|
||||
|
||||
林克没有犹豫,木剑高高举起,对准头目的后脑勺狠狠砸下。
|
||||
|
||||
"砰!"
|
||||
|
||||
头目庞大的身躯倒在地上,一动不动。
|
||||
|
||||
周围的哥布林看到老大被打倒,发出惊恐的叫声,四散而逃。
|
||||
|
||||
林克喘着粗气,木剑撑地,不让自己倒下。他的全身都在发抖,汗水和血混在一起,从额头上流下来。
|
||||
|
||||
"很好。"阿甘左走过来,点点头,"你过关了。"
|
||||
|
||||
林克抬起头,看着阿甘左。
|
||||
|
||||
"从今天起,你就是我的徒弟。"
|
||||
|
||||
---
|
||||
|
||||
回到艾尔文防线时,太阳已经偏西。
|
||||
|
||||
林纳斯在铁匠铺门口等着他们。看到林克满身是伤但还活着,他挑了挑眉。
|
||||
|
||||
"用木剑打败了头目?"
|
||||
|
||||
"是。"林克说。
|
||||
|
||||
林纳斯看了阿甘左一眼,然后笑了。
|
||||
|
||||
"这小子确实有点意思。"他说,"来,我给你看点东西。"
|
||||
|
||||
他从柜台下面拿出一个木盒,递给林克。
|
||||
|
||||
林克打开盒子,里面躺着一把太刀。刀身比他的旧刀更修长,刃口闪着寒光,刀柄上缠着黑色的皮革,握在手里很舒服。
|
||||
|
||||
"这是...?"
|
||||
|
||||
"新武器。"林纳斯说,"你那把旧刀已经不能用了。这把是精钢打造的,比你那把强多了。"
|
||||
|
||||
林克拿起太刀,在空中挥了两下。刀锋划破空气,发出"嗖嗖"的声音。
|
||||
|
||||
"谢谢。"
|
||||
|
||||
"不用谢。"林纳斯说,"从明天开始,你要跟着阿甘左训练。他会教你真正的剑术。"
|
||||
|
||||
林克看向阿甘左。男人点点头,转身向旅馆的方向走去。
|
||||
|
||||
"先去包扎伤口。"他说,"明天早上,还在山坡上见。"
|
||||
|
||||
---
|
||||
|
||||
赛丽亚看到林克的新伤口时,轻轻叹了口气。
|
||||
|
||||
"你又受伤了。"
|
||||
|
||||
"训练。"林克坐在椅子上,让她帮忙处理伤口。
|
||||
|
||||
赛丽亚的动作很轻柔,但药水涂在伤口上的时候,林克还是忍不住皱了皱眉。
|
||||
|
||||
"疼吗?"
|
||||
|
||||
"还好。"
|
||||
|
||||
赛丽亚抬起头,看着他。她的眼睛在灯光下显得格外柔和。
|
||||
|
||||
"为什么要这么拼命呢?"
|
||||
|
||||
林克沉默片刻,然后说:"我想变强。"
|
||||
|
||||
"变强之后呢?"
|
||||
|
||||
"去更远的地方。"林克说,"天界,魔界,神界...我想看看这个世界有多大。"
|
||||
|
||||
赛丽亚没有说话,只是继续帮他包扎伤口。
|
||||
|
||||
包扎完后,她站起身,轻轻拍了拍他的肩膀。
|
||||
|
||||
"早点休息。"她说,"明天还要训练呢。"
|
||||
|
||||
林克点点头,看着她离开的背影,心里涌起一种说不清的感觉。
|
||||
|
||||
这是他来到艾尔文防线的第二天。
|
||||
|
||||
明天,真正的训练就要开始了。
|
||||
|
||||
---
|
||||
|
||||
**第二章完**
|
||||
317
novels/dnf/dnf-chapter-03.md
Normal file
317
novels/dnf/dnf-chapter-03.md
Normal file
@ -0,0 +1,317 @@
|
||||
# 第三章:幽暗密林
|
||||
|
||||
## 本章概要
|
||||
- **核心事件**:林克进入格兰之森深处的幽暗密林,遭遇猫妖伏击,历经苦战突破重围
|
||||
- **承接上章**:阿甘左传授的基础剑术让林克实力大增,首次独自面对真正的怪物
|
||||
- **悬念钩子**:幽暗密林深处传来神秘低语,林克体内的卡赞诅咒似乎产生了某种共鸣
|
||||
|
||||
---
|
||||
|
||||
清晨的训练比往常更加艰苦。
|
||||
|
||||
阿甘左让林克绕着艾尔文防线跑完了十圈,然后是五百次挥剑。当太阳完全升起时,林克已经累得抬不起手臂。
|
||||
|
||||
“今天的训练结束了。”阿甘左说,“但真正的考验才刚刚开始。”
|
||||
|
||||
林克喘着粗气,抬起头:“什么意思?”
|
||||
|
||||
“幽暗密林。”阿甘左转身看向北边的森林,“格兰之森的入口。从现在开始,你要去那里修炼。”
|
||||
|
||||
“幽暗密林……”林克喃喃自语。他听林纳斯提起过,那里是格兰之森的外围区域,栖息着一种叫做猫妖的怪物。
|
||||
|
||||
“有问题?”
|
||||
|
||||
“没有。”林克握紧新得的太刀,“什么时候出发?”
|
||||
|
||||
“现在。”
|
||||
|
||||
---
|
||||
|
||||
格兰之森位于艾尔文防线的北边,是一片广袤无垠的原始森林。相传数千年前,这里曾经是精灵族的领地,但如今只剩下茂密的树木和危险的怪物。
|
||||
|
||||
林克踏入森林的那一刻,立刻感受到了不同。
|
||||
|
||||
空气变得潮湿起来,带着一股腐败落叶的气味。阳光被树冠完全遮挡,林子里暗得像是黄昏。脚下的土地湿软泥泞,每走一步都会陷入半寸深的腐殖质。
|
||||
|
||||
“跟紧我。”阿甘左的声音从前面传来,“幽暗密林在格兰之森深处,离这里还有很远。”
|
||||
|
||||
林克应了一声,快步跟上。
|
||||
|
||||
一路上的怪物比洛兰多得多。哥布林自不必说,还有体型更大的牛头人、能够飞行的猫头鹰,以及一些叫不出名字的奇怪生物。但阿甘左似乎没有兴趣清理它们,只是带着林克绕开怪物密集的区域。
|
||||
|
||||
“为什么不打?”林克问。
|
||||
|
||||
“你的目标是幽暗密林。”阿甘左说,“路上这些杂碎不值得浪费时间。”
|
||||
|
||||
林克点点头,继续前行。
|
||||
|
||||
---
|
||||
|
||||
当他们到达幽暗密林时,太阳已经偏西。
|
||||
|
||||
入口是一片茂密的灌木丛,灌木丛后面是一条蜿蜒的小路。小路的两旁长满了高耸入云的古树,枝叶交织在一起,形成了一道绿色的穹顶。
|
||||
|
||||
“就是这里。”阿甘左停下脚步,“进去吧。”
|
||||
|
||||
林克看着那条幽暗的小路,心里突然涌起一种不安的感觉。
|
||||
|
||||
“师父……”
|
||||
|
||||
“叫我阿甘左。”男人打断他,“师父这个词太正式了,我不习惯。”
|
||||
|
||||
“好吧。”林克深吸一口气,“阿甘左,如果我出不来了……”
|
||||
|
||||
“不会有那种事。”阿甘左说,“但如果你死了,我会帮你收尸的。”
|
||||
|
||||
林克愣了一下,然后笑了。
|
||||
|
||||
“谢了。”
|
||||
|
||||
他迈步走进幽暗密林。
|
||||
|
||||
---
|
||||
|
||||
林子里的光线比外面更暗。
|
||||
|
||||
林克拔出太刀,警惕地看着四周。空气中弥漫着一股腥臭味,像是某种大型猫科动物的气味。
|
||||
|
||||
“喵——”
|
||||
|
||||
一声凄厉的猫叫从头顶传来。
|
||||
|
||||
林克猛然抬头,看到一只怪物从天而降。
|
||||
|
||||
那是一只猫妖。
|
||||
|
||||
它的体型比普通野猫大得多,身长接近一米五。浑身的皮毛是暗红色的,上面布满了黑色的斑纹。它的眼睛是黄色的,瞳孔呈竖线状,在黑暗中闪着幽光。它的爪子很长,像是五把锋利的短剑。
|
||||
|
||||
猫妖落地后立刻向林克扑来。
|
||||
|
||||
林克侧身躲过,太刀横扫,砍向猫妖的侧腹。
|
||||
|
||||
“当!”
|
||||
|
||||
金属碰撞的声音。猫妖的皮毛竟然硬得像皮革一样,太刀只在上面留下了一道白痕。
|
||||
|
||||
“皮这么厚?”林克咬牙,再次挥刀。
|
||||
|
||||
但猫妖的速度比他快得多。
|
||||
|
||||
不等林克第二刀砍出,猫妖已经绕到了他的身后。锋利的爪子划向他的后背。
|
||||
|
||||
“刺啦——”
|
||||
|
||||
皮甲被撕开,后背上多了三道血痕。
|
||||
|
||||
林克闷哼一声,转身挥刀。但猫妖已经跳开了。
|
||||
|
||||
“速度很快……”林克喘着气,盯着那只猫妖,“力量也不小。”
|
||||
|
||||
猫妖蹲在地上,黄色的眼睛盯着他,喉咙里发出低沉的咆哮。
|
||||
|
||||
林克深吸一口气,强迫自己冷静下来。
|
||||
|
||||
阿甘左说过:剑术的最高境界不是快,是准。
|
||||
|
||||
他仔细观察着猫妖的动作,等待机会。
|
||||
|
||||
---
|
||||
|
||||
猫妖再次扑上来。
|
||||
|
||||
这一次,林克没有躲。
|
||||
|
||||
他在猫妖扑到面前的瞬间猛然蹲下,太刀从下往上斜刺。
|
||||
|
||||
“噗嗤!”
|
||||
|
||||
刀刃刺入猫妖的腹部,鲜血喷涌而出。
|
||||
|
||||
猫妖发出刺耳的尖叫,疯狂地挣扎着。但林克死死抓住刀柄,不让它挣脱。
|
||||
|
||||
“去死!”
|
||||
|
||||
他用力一绞,然后猛然拔出太刀。
|
||||
|
||||
猫妖倒在地上,抽搐了几下,不再动了。
|
||||
|
||||
林克喘着粗气,看着地上的尸体。这是他第一次独自杀掉猫妖。
|
||||
|
||||
但还没等他来得及庆祝,四周传来窸窸窣窣的声音。
|
||||
|
||||
他转头看向四周,瞳孔猛然收缩。
|
||||
|
||||
至少有二十只猫妖从四面八方的灌木丛中钻出来,将他团团围住。
|
||||
|
||||
“该死……”林克握紧太刀,“这么多?”
|
||||
|
||||
---
|
||||
|
||||
猫妖群缓缓逼近。
|
||||
|
||||
林克背靠一棵大树,警惕地看着四周。每一只猫妖都在盯着他,黄色的眼睛在黑暗中像是鬼火一样。
|
||||
|
||||
不能再等了。
|
||||
|
||||
林克突然动了。
|
||||
|
||||
他冲向左侧最短的包围线,太刀挥出,斩向一只猫妖的脖子。
|
||||
|
||||
“噗!”
|
||||
|
||||
鲜血飞溅,那只猫妖的头颅滚落在地。
|
||||
|
||||
但这只是开始。
|
||||
|
||||
剩下的猫妖像是收到了什么信号,同时向林克扑来。
|
||||
|
||||
林克在它们之间穿梭,太刀每一次挥出都能带走一只猫妖的性命。但猫妖的数量太多了,他的身上不断增添新的伤口。
|
||||
|
||||
“滚开!”
|
||||
|
||||
他怒吼一声,太刀横扫,将扑在最前面的三只猫妖逼退。
|
||||
|
||||
但更多的猫妖又围上来。
|
||||
|
||||
林克感觉体力在快速流逝,动作越来越慢。伤口流出的血染红了他的皮甲,让他的动作变得迟钝。
|
||||
|
||||
“要死在这里了吗……”
|
||||
|
||||
他咬紧牙关,繼續戰鬥。
|
||||
|
||||
---
|
||||
|
||||
就在林克快要支撑不住的时候,他突然听到了一声低沉的咆哮。
|
||||
|
||||
“吼——”
|
||||
|
||||
声音是从密林深处传来的,震得树叶簌簌落下。
|
||||
|
||||
猫妖群的动作顿了一下,然后像是收到了什么命令,同时后退,消失在灌木丛中。
|
||||
|
||||
林克愣了一下,看着突然空旷起来的四周。
|
||||
|
||||
“刚才那是……什么?”
|
||||
|
||||
他警惕地看着密林深处,总觉得刚才那声咆哮有些耳熟。
|
||||
|
||||
不,不是耳熟。
|
||||
|
||||
而是……共鸣。
|
||||
|
||||
他感觉体内的血液突然沸腾了一下,胸口处传来一阵灼热感。那是卡赞诅咒的位置。
|
||||
|
||||
自从三年前那场事故之后,卡赞诅咒就一直在他的体内蛰伏。但刚才,它似乎被什么东西唤醒了。
|
||||
|
||||
“发生了什么……”林克捂住胸口,感受着心脏剧烈跳动。
|
||||
|
||||
那种感觉很奇怪,既痛苦又畅快,像是有什么东西想要破土而出。
|
||||
|
||||
他站在原地,等待那股感觉过去。
|
||||
|
||||
当一切恢复正常时,天色已经完全暗下来了。
|
||||
|
||||
---
|
||||
|
||||
林克拖着伤痕累累的身体走出幽暗密林时,阿甘左还在原地等着他。
|
||||
|
||||
男人看着林克满身是血的样子,挑了挑眉。
|
||||
|
||||
“活着出来了?”
|
||||
|
||||
“差一点就出不来了。”林克苦笑。
|
||||
|
||||
阿甘左点点头:“走吧,先回去包扎伤口。”
|
||||
|
||||
“是。”
|
||||
|
||||
林克应了一声,正要跟上阿甘左,突然停住脚步。
|
||||
|
||||
“阿甘左。”
|
||||
|
||||
“什么事?”
|
||||
|
||||
“我在幽暗密林深处听到了一声咆哮。”林克说,“然后……我体内的卡赞诅咒好像产生了共鸣。”
|
||||
|
||||
阿甘左的脚步顿了一下。
|
||||
|
||||
“你说什么?”
|
||||
|
||||
“卡赞诅咒。”林克重复道,“刚才在幽暗密林里,它好像被什么东西唤醒了。”
|
||||
|
||||
阿甘左沉默了很久。
|
||||
|
||||
“这件事以后再说。”他说,“先回去。”
|
||||
|
||||
林克看着阿甘左的背影,心里涌起一种不安的感觉。
|
||||
|
||||
师父似乎知道什么。
|
||||
|
||||
---
|
||||
|
||||
回到艾尔文防线时,赛丽亚看到林克的样子吓了一跳。
|
||||
|
||||
“天哪!你怎么又受伤了?”
|
||||
|
||||
“训练。”林克坐在椅子上,虚弱地说。
|
||||
|
||||
赛丽亚赶紧拿来药水和小心地帮他处理伤口。她的动作很轻柔,像是生怕弄疼他。
|
||||
|
||||
“幽暗密林很危险吗?”赛丽亚问。
|
||||
|
||||
“还好。”林克说,“就是怪物比较多。”
|
||||
|
||||
“下次小心一点。”赛丽亚说,“你总是这样不顾自己的身体……”
|
||||
|
||||
她的语气中带着一丝责备,但更多的是关心。
|
||||
|
||||
林克看着她专注地帮自己包扎伤口的样子,心里涌起一种温暖的感觉。
|
||||
|
||||
“赛丽亚。”
|
||||
|
||||
“嗯?”
|
||||
|
||||
“你为什么对我这么好?”
|
||||
|
||||
赛丽亚的手顿了一下,然后继续包扎。
|
||||
|
||||
“因为你是我的客人呀。”她笑着说,“而且……我觉得你是个好人。”
|
||||
|
||||
林克没有再说什么,只是静静地看着她。
|
||||
|
||||
---
|
||||
|
||||
夜晚,林克躺在旅馆的床上,睁着眼睛看着天花板。
|
||||
|
||||
今天在幽暗密林深处听到的那声咆哮,始终在他脑海中回荡。
|
||||
|
||||
还有卡赞诅咒的共鸣。
|
||||
|
||||
那到底是什么?
|
||||
|
||||
他抬起手,看着自己的掌心。在月光下,他可以看到皮肤下隐约浮现的红色纹路——那是卡赞诅咒的印记。
|
||||
|
||||
三年前的那场事故,他几乎失去了所有。
|
||||
|
||||
父亲死了,母亲下落不明。他自己也被卡赞诅咒侵蚀,差点死去。
|
||||
|
||||
是师父救了他。
|
||||
|
||||
但师父从来没有告诉过他,这诅咒到底是什么来历。
|
||||
|
||||
“卡赞……”林克喃喃自语,“你到底是什么?”
|
||||
|
||||
没有人回答他。
|
||||
|
||||
只有窗外的夜风,吹得树叶沙沙作响。
|
||||
|
||||
---
|
||||
|
||||
**第三章完**
|
||||
|
||||
---
|
||||
|
||||
## 章节备注
|
||||
- **本章悬念**:幽暗密林深处的神秘咆哮是谁发出的?卡赞诅咒为何会产生共鸣?
|
||||
- **下章预告**:林克等级提升至Lv.5,进入幽暗密林深处挑战猫妖王
|
||||
- **伏笔标记**:阿甘左对卡赞诅咒的反应暗示他知情,赛丽亚对林克的关心似乎别有隐情
|
||||
299
novels/dnf/dnf-chapter-04.md
Normal file
299
novels/dnf/dnf-chapter-04.md
Normal file
@ -0,0 +1,299 @@
|
||||
# 第四章:幽暗密林深处
|
||||
|
||||
## 本章概要
|
||||
- **核心事件**:林克再次进入幽暗密林深处,遭遇猫妖王,揭开卡赞诅咒的部分真相
|
||||
- **承接上章**:神秘咆哮的来源揭晓,林克的诅咒力量首次显现
|
||||
- **悬念钩子**:阿甘左透露卡赞诅咒的秘密一角,暗示林克身世的谜团
|
||||
|
||||
---
|
||||
|
||||
三天后,林克的伤基本痊愈。
|
||||
|
||||
这三天里,他一直在阿甘左的指导下进行基础训练。挥剑、闪避、步法,一遍又一遍,直到每个动作都成为本能。
|
||||
|
||||
"你的基础很扎实。"阿甘左说,"但基础只是地基,真正决定胜负的是临场应变。"
|
||||
|
||||
"所以?"
|
||||
|
||||
"所以今天你要去幽暗密林深处。"阿甘左看着他,"那里有你需要面对的东西。"
|
||||
|
||||
林克愣了一下,想起三天前听到的神秘咆哮。
|
||||
|
||||
"那是……什么?"
|
||||
|
||||
"你会知道的。"阿甘左没有正面回答,"准备好了就出发。"
|
||||
|
||||
---
|
||||
|
||||
格兰之森的清晨总是笼罩着一层薄雾。
|
||||
|
||||
林克穿过外围的幽暗密林,向着更深处前进。一路上没有遇到太多怪物,仿佛森林里的生灵都在避开什么。
|
||||
|
||||
越往深处走,雾气越浓。
|
||||
|
||||
阳光被层层叠叠的树冠遮挡,林子里暗得像是黑夜。空气中弥漫着一股浓烈的腥臭味,比上次更加刺鼻。
|
||||
|
||||
"这里就是幽暗密林深处……"
|
||||
|
||||
林克握紧太刀,警惕地看着四周。
|
||||
|
||||
他记得三天前,猫妖群就是在这片区域突然退去的。而那声神秘的咆哮,也是从这里传来的。
|
||||
|
||||
"吼——"
|
||||
|
||||
像是回应他的思绪,低沉的咆哮声再次响起。
|
||||
|
||||
林克全身紧绷,循着声音的方向走去。
|
||||
|
||||
---
|
||||
|
||||
穿过一片茂密的灌木丛,林克来到了一处开阔的空地。
|
||||
|
||||
空地的中央有一个巨大的树洞,树洞周围散落着无数白骨——有动物的,也有人类的。树洞的入口处,趴伏着一只庞大的怪物。
|
||||
|
||||
那是猫妖王。
|
||||
|
||||
它的体型比普通猫妖大三倍以上,身长超过四米。浑身覆盖着暗紫色的皮毛,皮毛上布满了诡异的黑色纹路,像是某种古老的诅咒印记。它的眼睛是血红色的,瞳孔中燃烧着幽绿的鬼火。它的爪子每根都有匕首那么长,在昏暗的光线下闪着寒光。
|
||||
|
||||
"这就是……猫妖王。"林克握紧太刀,手心开始冒汗。
|
||||
|
||||
猫妖王似乎察觉到了他的存在,缓缓抬起头。
|
||||
|
||||
那双血红色的眼睛盯着林克,眼中闪过一丝疑惑,然后是……兴奋?
|
||||
|
||||
"吼——!"
|
||||
|
||||
猫妖王发出震耳欲聋的咆哮,庞大的身躯猛然站起。
|
||||
|
||||
林克这才发现,猫妖王的脖颈处有一圈红色的印记,和他体内的卡赞诅咒印记一模一样。
|
||||
|
||||
"什么……?"
|
||||
|
||||
不等他反应,猫妖王已经扑了过来。
|
||||
|
||||
---
|
||||
|
||||
速度太快!
|
||||
|
||||
林克只来得及侧身闪避,猫妖王的爪子就从他身侧掠过,在他原本站立的位置留下三道深深的沟壑。
|
||||
|
||||
"好快……"
|
||||
|
||||
林克还没站稳,猫妖王的尾巴已经扫了过来。
|
||||
|
||||
"砰!"
|
||||
|
||||
他被重重击中,整个人飞出去七八米,撞在一棵大树上。
|
||||
|
||||
"咳咳……"林克捂着胸口,感觉肋骨像是断了几根。
|
||||
|
||||
猫妖王没有给他喘息的机会,再次扑来。
|
||||
|
||||
林克咬牙,强撑着站起,太刀横格。
|
||||
|
||||
"当!"
|
||||
|
||||
金属碰撞的声音,巨大的冲击力让林克的手臂几乎麻木。
|
||||
|
||||
力量差距太大了。
|
||||
|
||||
---
|
||||
|
||||
林克在猫妖王的攻击下节节败退。
|
||||
|
||||
每一次格挡都让他的手臂发麻,每一次闪避都差之毫厘。他的身上不断增添新的伤口,鲜血染红了皮甲。
|
||||
|
||||
"该死……根本打不过……"
|
||||
|
||||
他咬紧牙关,强迫自己思考。
|
||||
|
||||
正面对抗是不可能赢的。力量、速度、体型,猫妖王在各方面都碾压他。
|
||||
|
||||
唯一的希望是——找到弱点。
|
||||
|
||||
他仔细观察猫妖王的动作。它的攻击很猛,但转身较慢;它的皮毛坚硬,但脖颈处的印记似乎在发着微弱的光;它的眼睛一直盯着他,像是在观察猎物……
|
||||
|
||||
印记。
|
||||
|
||||
林克突然想到什么。
|
||||
|
||||
猫妖王脖颈处的印记,和他体内的卡赞诅咒印记是一样的。三天前,他的诅咒产生共鸣的时候,也是在听到猫妖王咆哮的瞬间。
|
||||
|
||||
"难道……这只猫妖王也被卡赞诅咒侵蚀了?"
|
||||
|
||||
他想起阿甘左的反应。
|
||||
|
||||
师父似乎早就知道这件事。
|
||||
|
||||
---
|
||||
|
||||
猫妖王再次扑来。
|
||||
|
||||
这一次,林克没有躲避。
|
||||
|
||||
他迎着猫妖王的扑击冲了上去,太刀高高举起。
|
||||
|
||||
"如果我也能用那股力量……"
|
||||
|
||||
三天前,卡赞诅咒共鸣的时候,他感觉到体内有什么东西在沸腾。那是诅咒的力量,一直在他体内蛰伏的力量。
|
||||
|
||||
他不知道该怎么召唤那股力量。但他知道,现在不用就死定了。
|
||||
|
||||
"卡赞……"林克喃喃自语,"借我力量!"
|
||||
|
||||
就在猫妖王的爪子即将刺穿他胸膛的瞬间——
|
||||
|
||||
林克的眼睛变成了血红色。
|
||||
|
||||
---
|
||||
|
||||
那一瞬间,世界在他眼中变得清晰无比。
|
||||
|
||||
猫妖王的动作变得缓慢,每一个细节都清晰可见。他可以看清猫妖王爪子上的纹路,可以看清它眼中的恐惧,可以看清它脖颈处印记的每一道线条。
|
||||
|
||||
体内的血液在沸腾,心脏剧烈跳动,一股灼热的力量从胸口涌向全身。
|
||||
|
||||
"现在!"
|
||||
|
||||
林克的太刀划出一道血色的弧线。
|
||||
|
||||
"噗嗤——!"
|
||||
|
||||
刀刃刺入猫妖王的脖颈,精准地命中了印记的核心。
|
||||
|
||||
猫妖王发出凄厉的惨叫,庞大的身躯疯狂挣扎。但林克死死握住刀柄,将太刀狠狠地搅动。
|
||||
|
||||
"去死!"
|
||||
|
||||
他猛然拔出太刀,然后再次刺入。
|
||||
|
||||
一次,两次,三次。
|
||||
|
||||
鲜血喷涌而出,染红了林克的全身。
|
||||
|
||||
猫妖王的挣扎越来越弱,最终倒在地上,不再动弹。
|
||||
|
||||
---
|
||||
|
||||
红色的光芒从林克的眼睛中褪去。
|
||||
|
||||
他跪在地上,大口大口地喘着气。全身的力量像是被抽空了一样,连站起来的力气都没有。
|
||||
|
||||
"我……赢了?"
|
||||
|
||||
他看着猫妖王的尸体,有些不敢相信。
|
||||
|
||||
刚才发生了什么?
|
||||
|
||||
为什么他的眼睛会变成红色?为什么猫妖王的动作在他眼中变得那么慢?
|
||||
|
||||
那是卡赞诅咒的力量吗?
|
||||
|
||||
"你觉醒了。"
|
||||
|
||||
熟悉的声音从身后传来。
|
||||
|
||||
林克艰难地转过头,看到阿甘左不知什么时候出现在了空地边缘。
|
||||
|
||||
"师父……你怎么来了?"
|
||||
|
||||
"我说过,如果你死了,我会帮你收尸。"阿甘左走过来,看着地上的猫妖王,"没想到你反而把它杀了。"
|
||||
|
||||
"刚才那股力量……是卡赞诅咒?"
|
||||
|
||||
"一部分。"阿甘左蹲下来,和他平视,"卡赞诅咒是一把双刃剑。它能给你力量,也能吞噬你的心智。你刚才的状态很危险,如果你再不收手,可能会失控。"
|
||||
|
||||
林克沉默。
|
||||
|
||||
"猫妖王脖颈上的印记……"
|
||||
|
||||
"和你的一样。"阿甘左说,"它是被卡赞诅咒侵蚀的生物,已经失去了理智。你如果继续依赖诅咒的力量,迟早也会变成那样。"
|
||||
|
||||
"那怎么办?"林克问,"我怎么才能控制它?"
|
||||
|
||||
阿甘左沉默片刻,然后说:"这是一个漫长的过程。你需要学会驾驭诅咒,而不是被诅咒驾驭。这需要时间,也需要机缘。"
|
||||
|
||||
"机缘?"
|
||||
|
||||
"有些事,现在还不能告诉你。"阿甘左站起身,"等你变强了,自然会知道。"
|
||||
|
||||
林克看着阿甘左的背影,心里充满了疑问。
|
||||
|
||||
但师父既然说不方便透露,他也不会追问。
|
||||
|
||||
总有一天,他会知道所有的真相。
|
||||
|
||||
---
|
||||
|
||||
回到艾尔文防线时,天已经完全黑了。
|
||||
|
||||
赛丽亚看到林克满身是血的样子,眼眶一下子红了。
|
||||
|
||||
"你怎么……怎么每次都这样……"
|
||||
|
||||
"我没事。"林克勉强笑了笑,"这次赢得很漂亮。"
|
||||
|
||||
"漂亮什么!"赛丽亚一边骂着,一边帮他处理伤口,"你知不知道每次你出去,我都担心得睡不着……"
|
||||
|
||||
她的语气有些哽咽。
|
||||
|
||||
林克看着她泛红的眼眶,心里涌起一种复杂的情绪。
|
||||
|
||||
"对不起。"他说,"让你担心了。"
|
||||
|
||||
赛丽亚的动作顿了一下,然后继续包扎。
|
||||
|
||||
"你每次都说对不起……"她的声音很轻,"但下次还是会这样……"
|
||||
|
||||
林克不知道该说什么,只能沉默。
|
||||
|
||||
处理完伤口后,赛丽亚站起身,轻轻拍了拍他的肩膀。
|
||||
|
||||
"早点休息。"她说,"明天……明天别再这样了好不好?"
|
||||
|
||||
林克看着她的背影,心里有些苦涩。
|
||||
|
||||
他知道明天还是会这样。
|
||||
|
||||
因为他必须变强。
|
||||
|
||||
---
|
||||
|
||||
夜晚,林克躺在床上,看着天花板。
|
||||
|
||||
今天发生的事在他脑海中不断回放。
|
||||
|
||||
猫妖王脖颈上的印记、阿甘左说的话、诅咒的力量……
|
||||
|
||||
"卡赞诅咒到底是什么……"
|
||||
|
||||
他抬起手,看着皮肤下隐约浮现的红色纹路。
|
||||
|
||||
三年前的那场事故,他失去了父亲,失去了家园,也被诅咒侵蚀。师父救了他,但从来没有告诉他诅咒的来历。
|
||||
|
||||
"总有一天……"
|
||||
|
||||
他闭上眼睛,沉入梦乡。
|
||||
|
||||
梦中,他看到一片燃烧的战场。
|
||||
|
||||
无数人倒在血泊中,火光照亮了天际。一个高大的身影站在战场中央,手中握着一把燃烧着黑色火焰的巨剑。
|
||||
|
||||
那个身影转过头,看向梦中的林克。
|
||||
|
||||
"你会来的。"
|
||||
|
||||
声音像是来自很远的地方,又像是就在耳边。
|
||||
|
||||
"你会来找我,林克。"
|
||||
|
||||
---
|
||||
|
||||
**第四章完**
|
||||
|
||||
---
|
||||
|
||||
## 章节备注
|
||||
- **本章悬念**:梦中的神秘身影是谁?卡赞诅咒的完整真相是什么?
|
||||
- **下章预告**:雷鸣废墟,林克挑战闪电哥布林,遭遇雷电危机
|
||||
- **伏笔标记**:梦中人影暗示卡赞本体或相关人物,阿甘左隐瞒的真相将逐步揭晓
|
||||
561
novels/dnf/dnf-chapter-06.md
Normal file
561
novels/dnf/dnf-chapter-06.md
Normal file
@ -0,0 +1,561 @@
|
||||
# 第六章:格拉卡
|
||||
|
||||
## 本章概要
|
||||
- **核心事件**:林克一行抵达格拉卡,挑战牛头人领地,遭遇领袖牛头王萨乌塔
|
||||
- **承接上章**:林克在雷鸣废墟战胜闪电哥布林后,赛丽亚表达担忧;林克需证明自己的成长
|
||||
- **悬念钩子**:牛头王萨乌塔为何会变得如此狂暴?格拉卡深处隐藏着怎样的秘密?
|
||||
|
||||
---
|
||||
|
||||
晨光穿透薄雾,洒落在广袤的草原上。
|
||||
|
||||
林克站在格拉卡的入口处,眺望远方的景色。这里与他之前去过的所有地方都不同——没有茂密的森林,没有幽暗的山谷,有的只是一望无际的草原和零星散布的巨石。微风吹过,金色的草浪此起彼伏,像是大地在呼吸。
|
||||
|
||||
“这里就是格拉卡。”阿甘左的声音从身后传来,“牛头人的领地。”
|
||||
|
||||
“我能感觉到很多气息。”林克握紧太刀“赤星”,警惕地看着四周。草原上看似平静,但他知道暗处隐藏着危险。
|
||||
|
||||
“赛丽亚,紧跟着我们。”阿甘左转头看向身后,“不要离开视线范围。”
|
||||
|
||||
“嗯。”赛丽亚点点头,双手不自觉地握紧了法杖。她今天穿了一身便于行动的劲装,不再是平时那副旅馆老板的装扮。自从一个多月前雷鸣废墟的事发生后,她就坚持要跟来。用她的话说:“我不想再站在原地等你回来。”
|
||||
|
||||
---
|
||||
|
||||
三人踏上草原,缓慢前行。
|
||||
|
||||
格拉卡的草原比想象中还要大。走了将近一个小时,放眼望去还是一片绿色的海洋。只有远处的巨石越来越密集,像是某种天然的迷宫。
|
||||
|
||||
“牛头人一般不会主动离开领地。”阿甘左一边走一边说,“但如果有人闯入,他们会倾巢而出。”
|
||||
|
||||
“也就是说,我们要做好被围攻的准备。”林克说。
|
||||
|
||||
“没错。”
|
||||
|
||||
话音刚落,前方的草丛突然动了起来。
|
||||
|
||||
“吼——!”
|
||||
|
||||
十几只牛头人从草丛中跃出,挡住了三人的去路。
|
||||
|
||||
它们身高近两米,浑身的肌肉像是小山一样隆起。手中握着巨大的战斧或狼牙棒,鼻子里不断喷着粗气。最显眼的是它们头顶的牛角——弯曲、锋利,在阳光下闪着寒光。
|
||||
|
||||
“这么快就来了。”林克拔出太刀。
|
||||
|
||||
“小心点。”阿甘左说,“牛头人力量很大,正面硬碰硬很吃亏。”
|
||||
|
||||
“我知道。”
|
||||
|
||||
林克深吸一口气,身体微微下沉。这是他这一个月来训练的结果——依靠自己的技巧和反应,而不是其他任何力量。
|
||||
|
||||
---
|
||||
|
||||
**第一高潮点:草原初战**
|
||||
|
||||
一只体型最大的牛头人挥舞着狼牙棒,率先冲了过来。狼牙棒带着风声砸向林克的头顶,这一击势大力沉,如果被砸中,肯定会脑浆迸裂。
|
||||
|
||||
林克动了。
|
||||
|
||||
他的身体微微一侧,险之又险地避开这一击。狼牙棒擦着他的鼻子砸下,劲风刮得脸颊生疼。
|
||||
|
||||
就是现在!
|
||||
|
||||
太刀出鞘。
|
||||
|
||||
“唰!”
|
||||
|
||||
银色刀光闪过,划过牛头人的手腕。牛头人还没反应过来,握着狼牙棒的手已经被齐腕斩断。
|
||||
|
||||
“吼——!”
|
||||
|
||||
牛头人惨嚎一声,踉跄后退。但林克没有给它喘息的机会,身体欺近,左脚踩在它的膝盖上,借力跃起,太刀横斩,划过牛头人的喉咙。
|
||||
|
||||
鲜血喷涌而出。牛头人庞大的身体轰然倒地。
|
||||
|
||||
其他牛头人愣了一下,然后变得更加狂暴。七八只牛头人同时冲了上来,巨大的战斧在空中挥舞,发出刺耳的破风声。
|
||||
|
||||
“林克!”赛丽亚惊呼。
|
||||
|
||||
“没事。”
|
||||
|
||||
林克的声音很平静。他的身体在牛头人之间穿梭,像是暴风雨中的蝴蝶。
|
||||
|
||||
第一只牛头人的战斧砍空,林克的太刀已经刺入它的腋下——那里是盔甲的缝隙。他手腕一抖,刀刃在体内绞出一个血洞。
|
||||
|
||||
第二只牛头人从侧面劈来战斧。林克就地一滚,避开攻击的同时,太刀在地上一撑,身体弹起,一刀刺入牛头人的眼睛。
|
||||
|
||||
“里·鬼剑术!”
|
||||
|
||||
这是他目前唯一掌握的进阶剑技。银色刀光分成两段,连续斩击。
|
||||
|
||||
“噗嗤!噗嗤!”
|
||||
|
||||
牛头人的胸口出现两道交叉的刀痕,深可见骨。它难以置信地低头看着自己的伤口,然后缓缓倒下。
|
||||
|
||||
第三只牛头人挥斧横扫。林克矮身避开,同时一刀上挑,斩断它的手筋。牛头人的战斧脱手,林克跟进一刀,结束了它的生命。
|
||||
|
||||
战斗结束。
|
||||
|
||||
林克稳稳地落地,太刀在身前挽出一个刀花,然后缓缓归鞘。地上躺着十几具牛头人的尸体。
|
||||
|
||||
“好……”赛丽亚看得目瞪口呆,“好厉害……”
|
||||
|
||||
阿甘左的嘴角微微上扬:“这才像样。”
|
||||
|
||||
---
|
||||
|
||||
草原恢复了平静,但空气中弥漫的血腥味预示着更激烈的战斗即将到来。
|
||||
|
||||
“继续前进。”阿甘左说,“刚才的战斗已经惊动了牛头人部落。接下来只会更危险。”
|
||||
|
||||
林克点点头,却没有立刻迈步。
|
||||
|
||||
“师父。”他犹豫了一下,“我刚才……没有使用那股力量。”
|
||||
|
||||
“我知道。”
|
||||
|
||||
“您不失望吗?”
|
||||
|
||||
阿甘左看了他一眼,淡淡地说:“我从来没有要求你使用那股力量。相反,我一直在阻止你依赖它。”
|
||||
|
||||
“为什么?”
|
||||
|
||||
“因为力量就像毒品。”阿甘左的声音很平静,“一旦依赖,就很难戒掉。你在雷鸣废墟的表现很好,那是你自己的实力。如果每次战斗都依赖外力,你永远无法真正变强。”
|
||||
|
||||
林克沉默了。他知道师父说的是对的。体内那股力量虽然强大,但每次使用都会让他的理智变得模糊。
|
||||
|
||||
“我明白了。”他说。
|
||||
|
||||
阿甘左点点头,没有再说什么。
|
||||
|
||||
---
|
||||
|
||||
随着深入格拉卡,周围的景象变得越来越荒凉。草原逐渐变成了焦土,绿色的草地变成了灰褐色。巨石越来越多,高大的石柱耸立在地上,像是某种古老的图腾柱。
|
||||
|
||||
“这里就是牛头人的核心领地。”阿甘左说,“小心点,萨乌塔就在前面。”
|
||||
|
||||
“萨乌塔?”林克皱眉,“就是那只最大的牛头人?”
|
||||
|
||||
“嗯。”阿甘左的表情变得凝重,“牛头王萨乌塔。是牛头人一族的领袖,体型比普通牛头人大三倍以上。”
|
||||
|
||||
“有多大?”
|
||||
|
||||
“等下你就知道了。”
|
||||
|
||||
话音刚落,前方传来一阵震耳欲聋的咆哮。
|
||||
|
||||
“吼——!!!”
|
||||
|
||||
大地开始震动。
|
||||
|
||||
林克抬起头,看到一只巨大的牛头人从巨石后面走出来。
|
||||
|
||||
它身高超过五米,浑身的肌肉像是花岗岩一样坚硬。最恐怖的是它头顶的牛角——粗壮、弯曲,闪烁着金色的光芒。它的眼睛是血红色的,瞳孔中燃烧着愤怒的火焰。
|
||||
|
||||
“这就是……牛头王萨乌塔。”
|
||||
|
||||
林克握紧太刀,手心开始冒汗。这只牛头人给他带来的压力,远超之前的任何敌人。
|
||||
|
||||
---
|
||||
|
||||
萨乌塔走到三人前方停下,血红色的眼睛盯着他们。
|
||||
|
||||
“人类……”它的声音像是闷雷,“闯进牛头人的领地……死!”
|
||||
|
||||
“上!”阿甘左果断下令。
|
||||
|
||||
他身形一动,冲向萨乌塔。长剑在阳光下闪着寒光。
|
||||
|
||||
“吼——!”
|
||||
|
||||
萨乌塔怒吼一声,巨大的拳头砸向阿甘左。
|
||||
|
||||
“轰!”
|
||||
|
||||
地面上被砸出一个大坑。阿甘左险之又险地避开这一击,但攻击只是刚刚开始。萨乌塔的拳头像是雨点一样砸下,每一击都让大地颤抖。
|
||||
|
||||
阿甘左左闪右避,不断在巨人的攻击间隙中穿梭。他的剑每次挥动,都能在萨乌塔身上留下一道伤口。但萨乌塔的防御也极其惊人,那些伤口都只是浅伤。
|
||||
|
||||
“林克!”阿甘左大喊,“攻击它的关节!膝关节、肘关节!”
|
||||
|
||||
“我知道!”
|
||||
|
||||
林克冲了过去。
|
||||
|
||||
萨乌塔注意到林克的接近,放弃了攻击阿甘左,转身一掌拍向林克。
|
||||
|
||||
“小心!”赛丽亚的声音响起。
|
||||
|
||||
林克就地一滚,避开这足以拍碎岩石的一掌。他的太刀在地上一撑,身体弹起,一刀刺向萨乌塔的膝盖。
|
||||
|
||||
“噗嗤!”
|
||||
|
||||
太刀刺入关节附近的肌肉。萨乌塔吃痛,膝盖一弯,身体晃了一下。
|
||||
|
||||
“好机会!”林克欺身而上,太刀连续刺击,专门攻击萨乌塔的肘关节、膝关节、腋下等柔软部位。
|
||||
|
||||
每一刀都不致命,但积累起来,萨乌塔的动作开始变得迟缓。
|
||||
|
||||
---
|
||||
|
||||
**第二高潮点:赛丽亚的魔法支援**
|
||||
|
||||
“赛丽亚!”林克大喊,“能限制它的行动吗?”
|
||||
|
||||
“可以!”赛丽亚法杖尖端爆发出璀璨的蓝光,“冰霜冲击!”
|
||||
|
||||
极寒的冰霜之力喷涌而出,准确地命中了萨乌塔的膝盖。
|
||||
|
||||
“吼???”
|
||||
|
||||
萨乌塔发出难以置信的吼声。它的膝盖以肉眼可见的速度结冰,硕大的身体瞬间失去了平衡。
|
||||
|
||||
“就是现在!”赛丽亚大喊。
|
||||
|
||||
林克和阿甘左同时动了。
|
||||
|
||||
两道剑光几乎同时击中萨乌塔的胸口。
|
||||
|
||||
“咔嚓——!”
|
||||
|
||||
冰霜破碎,萨乌塔的胸口被撕开两道深深的伤口。
|
||||
|
||||
“吼——!!!”
|
||||
|
||||
它发出震天的怒吼,疯狂地挣扎。
|
||||
|
||||
但赛丽亚的法杖再次亮起。
|
||||
|
||||
“束缚!”
|
||||
|
||||
蓝色的藤蔓从地面钻出,紧紧地缠住萨乌塔的双腿。
|
||||
|
||||
“没用的!”萨乌塔怒吼一声,轻易挣脱了藤蔓。
|
||||
|
||||
但就是这几秒钟的耽误,给了林克宝贵的时间。
|
||||
|
||||
“就是现在!”
|
||||
|
||||
林克冲到了萨乌塔的身后,太刀高高举起。
|
||||
|
||||
“里·鬼剑术!”
|
||||
|
||||
银色刀光在阳光下闪烁。这是他目前最强的剑技——以极其刁钻的角度斩向萨乌塔的后颈。
|
||||
|
||||
“噗嗤!”
|
||||
|
||||
刀刃切入皮肤,斩断肌腱。
|
||||
|
||||
“吼……吼……”
|
||||
|
||||
萨乌塔发出痛苦的咆哮,庞大的身体开始摇晃。但它没有倒下。
|
||||
|
||||
血红色的眼睛转向林克,其中充满了杀意。
|
||||
|
||||
“人类……你惹怒我了……”
|
||||
|
||||
它的声音变得极其低沉,身体开始膨胀。
|
||||
|
||||
---
|
||||
|
||||
**第三高潮点:牛头王之战**
|
||||
|
||||
“不好!”阿甘左脸色大变,“它要拼命了!”
|
||||
|
||||
萨乌塔的身体变得更加庞大。原本就庞大的身躯变得更加强壮,肌肉像是小山一样隆起。血红色的眼睛燃烧着更凶猛的光芒。
|
||||
|
||||
“这才是……真正的力量!”
|
||||
|
||||
萨乌塔的声音不再像之前那样浑厚,而是变得尖锐、刺耳。
|
||||
|
||||
太快了!
|
||||
|
||||
林克根本来不及反应,萨乌塔的拳头已经到了面前。
|
||||
|
||||
“砰!”
|
||||
|
||||
他被重重击中,整个人飞出去几十米远。
|
||||
|
||||
“咳……”
|
||||
|
||||
林克摔在地上,感觉全身的骨头都要散架了。
|
||||
|
||||
这只是开始。萨乌塔的攻击连绵不绝,巨大的拳头不断砸下。
|
||||
|
||||
“轰!轰!轰!”
|
||||
|
||||
每一次撞击,地面上都会出现一个大坑。
|
||||
|
||||
林克狼狈地翻滚、闪避,身上不断增添新的伤口。
|
||||
|
||||
“这样下去……会死……”
|
||||
|
||||
他咬紧牙关,强迫自己冷静下来。
|
||||
|
||||
正面对抗是不可能的。变异后的萨乌塔力量和速度都远超之前。
|
||||
|
||||
必须找到弱点。
|
||||
|
||||
他仔细观察萨乌塔的动作。变异后的萨乌塔攻击变得疯狂,但防守也变得松懈。它的胸口、喉咙、后颈,都是明显的弱点。
|
||||
|
||||
但最关键的是……
|
||||
|
||||
林克看向萨乌塔的额头。
|
||||
|
||||
那里有一个红色的印记,散发着诡异的气息。
|
||||
|
||||
“师父!”他大喊,“攻击它的额头!那里是弱点!”
|
||||
|
||||
阿甘左明白了。
|
||||
|
||||
“我来拖住它!你找机会!”
|
||||
|
||||
他冲到萨乌塔身前,长剑舞出一片剑影。
|
||||
|
||||
“百裂剑!”
|
||||
|
||||
无数道剑光斩向萨乌塔,在它身上留下无数道伤口。
|
||||
|
||||
萨乌塔吃痛,放弃了追击林克,转向阿甘左。
|
||||
|
||||
“去死!”
|
||||
|
||||
巨大的拳头砸向阿甘左。
|
||||
|
||||
但阿甘左早就料到了这一步,身体一侧,险之又险地避开这一击。
|
||||
|
||||
萨乌塔的背后,空门大露。
|
||||
|
||||
---
|
||||
|
||||
“赛丽亚!”林克大喊,“再冻住它一次!”
|
||||
|
||||
“可以!”赛丽亚的法杖开始发光,“但只能维持两秒!”
|
||||
|
||||
“两秒够了!”
|
||||
|
||||
赛丽亚深吸一口气,法杖爆发出强烈的蓝光。
|
||||
|
||||
“冰霜冲击!”
|
||||
|
||||
极寒的冰霜之力再次喷涌而出,准确地命中了萨乌塔的胸口。萨乌塔的动作瞬间凝固。
|
||||
|
||||
“两秒!”
|
||||
|
||||
林克用尽全力冲了过去。
|
||||
|
||||
他的速度比任何时候都要快。脚在地面上一蹬,身体腾空而起,太刀指向萨乌塔额头的红色印记。
|
||||
|
||||
萨乌塔的眼球能动,它看到了林克,但身体被冻住,无法移动。
|
||||
|
||||
“这一击……终结你!”
|
||||
|
||||
太刀刺入印记的核心。
|
||||
|
||||
“吼——!!!”
|
||||
|
||||
萨乌塔发出凄厉的惨叫。红色印记像是玻璃一样破碎,黑色气息从伤口中喷涌而出。
|
||||
|
||||
“不……不可能……”
|
||||
|
||||
萨乌塔的声音变得虚弱。它的身体开始缩小,肌肉不再膨胀,血红色的眼睛也渐渐恢复了正常。
|
||||
|
||||
“俺……俺这是怎么了……”
|
||||
|
||||
它的声音变得低沉而疲惫。
|
||||
|
||||
林克稳稳地落在地上,太刀抵在萨乌塔的喉咙上。
|
||||
|
||||
“你输了。”他说。
|
||||
|
||||
萨乌塔看着林克,巨大的眼睛中流露出一丝复杂的神情。有解脱,有悲伤,还有……恳求。
|
||||
|
||||
“杀了我……”它说,“杀掉俺……否则……俺还会失去理智……”
|
||||
|
||||
林克犹豫了。
|
||||
|
||||
“林克。”阿甘左的声音传来,“它说的是真的。被那股力量侵蚀的生物,一旦失去意识,就会变成只知破坏的怪物。”
|
||||
|
||||
“可它是……”
|
||||
|
||||
“它是牛头人的王。”阿甘左说,“但它已经回不去了。那股力量已经彻底腐蚀了它的意识。”
|
||||
|
||||
林克看着萨乌塔的眼睛。那双眼睛中不再有杀意,只有深深的疲惫和恳求。
|
||||
|
||||
“俺……不想再伤害任何人了……”萨乌塔的声音越来越弱,“俺的族人们……已经被俺伤害了很多……杀了我……给牛头人一族……一个新的未来……”
|
||||
|
||||
林克深吸一口气。
|
||||
|
||||
“我明白了。”
|
||||
|
||||
太刀挥下。
|
||||
|
||||
---
|
||||
|
||||
红色的光芒从林克眼中褪去。
|
||||
|
||||
他跪在地上,大口大口地喘着气。全身的力气像是被抽空了一样,连动一根手指都困难。
|
||||
|
||||
“林克!”
|
||||
|
||||
赛丽亚跑过来,扶住他。
|
||||
|
||||
“你没事吧?没事吧?”
|
||||
|
||||
“没事……”林克勉强笑了笑,“这次真的赢了。”
|
||||
|
||||
“每次都说没事……”赛丽亚的眼泪又掉了下来,“你知不知道刚才有多危险……”
|
||||
|
||||
“对不起。”林克抬起手,轻轻擦去她脸上的泪水,“让你担心了。”
|
||||
|
||||
赛丽亚破涕为笑:“这才是我认识的林克。”
|
||||
|
||||
---
|
||||
|
||||
阿甘左走过来,看着两人。
|
||||
|
||||
“不错的配合。”他说,“赛丽亚的冰霜魔法起到了关键作用。”
|
||||
|
||||
赛丽亚的脸微微红了:“我……我只是做了应该做的事。”
|
||||
|
||||
“你太谦虚了。”阿甘左看向林克,“今天的表现超出了我的预期。你已经证明了自己的实力。”
|
||||
|
||||
林克站起身,看着萨乌塔的尸体。
|
||||
|
||||
“师父。”他问,“它为什么会被那股力量侵蚀?”
|
||||
|
||||
阿甘左沉默片刻,然后说:“这个问题……你以后会知道的。”
|
||||
|
||||
“又是以后?”林克皱眉,“师父,你到底在隐瞒什么?”
|
||||
|
||||
“不是隐瞒。”阿甘左淡淡地说,“是时机未到。等你足够强大了自然会明白。”
|
||||
|
||||
林克看着师父的背影,心里充满了疑问。但他没有追问。因为总有一天,他会找到所有的答案。
|
||||
|
||||
---
|
||||
|
||||
夕阳西下,金色的光芒洒落在格拉卡的草原上。
|
||||
|
||||
三人的身影渐行渐远。
|
||||
|
||||
林克回头看了一眼倒在地上萨乌塔,心里突然涌起一种奇怪的感觉。
|
||||
|
||||
“林克?”赛丽亚注意到他的异常,“怎么了?”
|
||||
|
||||
“没什么。”他摇摇头,“只是觉得……这只牛头王似乎在守护着什么。”
|
||||
|
||||
“守护?”
|
||||
|
||||
“嗯。”林克看着远方,“它的眼神……不像是单纯的野兽。更像是在保护什么东西。”
|
||||
|
||||
阿甘左的脚步顿了一下,但很快恢复正常。
|
||||
|
||||
“或许吧。”他说,“格拉卡的秘密……远不止这些。”
|
||||
|
||||
林克敏锐地捕捉到了师父话中的深意。
|
||||
|
||||
“师父,您知道什么?”
|
||||
|
||||
“我什么都不知道。”阿甘左头也不回,“走吧,天快黑了。”
|
||||
|
||||
林克还想再问,但看到赛丽亚疲惫的表情,最终还是没有开口。
|
||||
|
||||
---
|
||||
|
||||
夜晚,格拉卡的深处。
|
||||
|
||||
一片漆黑的洞穴中,有一双眼睛正在注视着远方。
|
||||
|
||||
“又是卡赞的继承者……”
|
||||
|
||||
那个声音低沉而沙哑。
|
||||
|
||||
“有意思……越来越有意思了……”
|
||||
|
||||
“咯咯咯……”
|
||||
|
||||
笑声在洞穴中回荡。
|
||||
|
||||
“或许……我应该亲自去见见他……”
|
||||
|
||||
黑暗之中,有什么东西动了一下。
|
||||
|
||||
“不对……还不是时候……”
|
||||
|
||||
“再等等……等到他准备好的时候……”
|
||||
|
||||
声音逐渐远去,最终完全消失。
|
||||
|
||||
格拉卡恢复了平静。
|
||||
|
||||
但林克知道,这只是开始。
|
||||
|
||||
---
|
||||
|
||||
回到艾尔文防线时,天已经完全黑了。
|
||||
|
||||
赛丽亚旅馆的灯光在夜色中显得格外温暖。
|
||||
|
||||
“今天辛苦了。”赛丽亚说,“早点休息,明天见。”
|
||||
|
||||
“明天见。”
|
||||
|
||||
林克看着赛丽亚走进旅馆,然后转向阿甘左。
|
||||
|
||||
“师父。”
|
||||
|
||||
“嗯?”
|
||||
|
||||
“您说过……那股力量是一把双刃剑。”
|
||||
|
||||
“怎么?”
|
||||
|
||||
“如果您说的都是真的。”林克看着自己的手,“那我体内流淌的……到底是诅咒,还是某种力量?”
|
||||
|
||||
阿甘左沉默了很久。
|
||||
|
||||
“这个问题。”他终于开口,“等你突破到LV15的时候,我会告诉你。”
|
||||
|
||||
“LV15?”林克皱眉,“那不是……要等到转职之后?”
|
||||
|
||||
“对。”阿甘左转身,“所以在那之前,好好训练吧。”
|
||||
|
||||
林克看着师父的背影,心里充满了期待。总有一天,他会知道所有的真相。
|
||||
|
||||
---
|
||||
|
||||
夜晚,林克躺在床上,脑海中不断回放今天的战斗。
|
||||
|
||||
萨乌塔、那股诡异的力量、还有那个在洞穴深处窥视的存在……
|
||||
|
||||
“格拉卡的秘密……”
|
||||
|
||||
他抬起手,看着皮肤下隐约浮现的淡淡红痕。那是战斗中不小心沾染的萨乌塔的气息。
|
||||
|
||||
“总有一天……”
|
||||
|
||||
他闭上眼睛,沉入梦乡。
|
||||
|
||||
梦中,他看到了一片燃烧的草原。
|
||||
|
||||
无数牛头人倒在血泊中,一个高大的身影站在战场中央,手中握着一把燃烧着黑色火焰的巨剑。
|
||||
|
||||
那个身影转过头,看向梦中的林克。
|
||||
|
||||
“我在格拉卡深处等你……”
|
||||
|
||||
声音像是来自很远的地方,又像是就在耳边。
|
||||
|
||||
“等你准备好的时候……”
|
||||
|
||||
---
|
||||
|
||||
**第六章完**
|
||||
|
||||
---
|
||||
|
||||
## 章节备注
|
||||
|
||||
- **本章亮点**:林克不使用任何魔法,仅凭太刀技巧和里·鬼剑术击败萨乌塔;赛丽亚的冰霜魔法起到关键支援作用;战斗描写强调技巧和配合
|
||||
- **本章悬念**:格拉卡深处隐藏的秘密是谁?牛头王萨乌塔为何被那股力量侵蚀?那个在黑暗中窥视的存在是谁?
|
||||
- **下章预告**:烈焰格拉卡,林克挑战火焰试炼,遭遇火女彼诺修
|
||||
- **伏笔标记**:阿甘左隐瞒的真相、萨乌塔守护的秘密、黑暗中存在的身份,都将在后续章节逐步揭晓
|
||||
169
novels/dnf/地图等级规划.md
Normal file
169
novels/dnf/地图等级规划.md
Normal file
@ -0,0 +1,169 @@
|
||||
# DNF完整地图等级规划
|
||||
|
||||
## 一、初始阿拉德(大转移前)
|
||||
|
||||
### 艾尔文防线
|
||||
| 地图 | 等级 | BOSS |
|
||||
|------|------|------|
|
||||
| 洛兰 | Lv.1-2 | 哥布林 |
|
||||
| 洛兰深处 | Lv.2-3 | 哥布林头目 |
|
||||
|
||||
### 格兰之森
|
||||
| 地图 | 等级 | BOSS |
|
||||
|------|------|------|
|
||||
| 幽暗密林 | Lv.3-5 | 猫妖 |
|
||||
| 幽暗密林深处 | Lv.5-6 | 猫妖王 |
|
||||
| 雷鸣废墟 | Lv.6-8 | 闪电哥布林 |
|
||||
| 猛毒雷鸣废墟 | Lv.8-10 | 毒猫妖 |
|
||||
| 格拉卡 | Lv.10-12 | 牛头王萨乌塔 |
|
||||
| 冰霜幽暗密林 | Lv.12-14 | 冰女克拉赫 |
|
||||
| 烈焰格拉卡 | Lv.14-16 | 火女彼诺修 |
|
||||
|
||||
### 天空之城
|
||||
| 地图 | 等级 | BOSS |
|
||||
|------|------|------|
|
||||
| 亚蒙下层 | Lv.16-18 | 龙人 |
|
||||
| 亚蒙上层 | Lv.18-20 | 石像鬼 |
|
||||
| 世帕罗塔下层 | Lv.20-22 | 鲛人 |
|
||||
| 世帕罗塔上层 | Lv.22-24 | 狮身人面像 |
|
||||
| 天空之海浅海 | Lv.24-26 | 海贼 |
|
||||
| 天空之海深海 | Lv.26-28 | 光之城主赛格哈特 |
|
||||
|
||||
### 天帷巨兽
|
||||
| 地图 | 等级 | BOSS |
|
||||
|------|------|------|
|
||||
| 神殿外围 | Lv.28-30 | GBL教徒 |
|
||||
| 树精丛林 | Lv.30-32 | 树精 |
|
||||
| 炼狱 | Lv.32-34 | 夜叉 |
|
||||
| 极昼 | Lv.34-36 | 多尼尔 |
|
||||
| 第一脊椎 | Lv.36-38 | 章鱼怪 |
|
||||
| 第二脊椎 | Lv.38-40 | 长腿罗特斯 |
|
||||
|
||||
### 斯顿雪域
|
||||
| 地图 | 等级 | BOSS |
|
||||
|------|------|------|
|
||||
| 冰心少年 | Lv.40-42 | 查理 |
|
||||
| 利库天井 | Lv.42-44 | 冰齿 |
|
||||
| 山脊 | Lv.44-46 | 猩红猫妖 |
|
||||
|
||||
### 阿法利亚(暗黑城)
|
||||
| 地图 | 等级 | BOSS |
|
||||
|------|------|------|
|
||||
| 浅栖之地 | Lv.46-48 | 暗精灵 |
|
||||
| 蜘蛛洞穴 | Lv.48-50 | 蜘蛛 |
|
||||
| 暗精灵墓地 | Lv.50-52 | 僵尸 |
|
||||
| 暗黑城入口 | Lv.52-54 | 暗黑骑士 |
|
||||
| 暗黑城宫殿 | Lv.54-56 | 暗精灵女王 |
|
||||
|
||||
### 诺斯玛尔
|
||||
| 地图 | 等级 | BOSS |
|
||||
|------|------|------|
|
||||
| 堕落的盗贼 | Lv.56-58 | 盗贼头目 |
|
||||
| 迷乱之村哈穆林 | Lv.58-60 | 魔女 |
|
||||
| 血蝴蝶 | Lv.58-60 | 血蝴蝶 |
|
||||
| 痛苦之村列瑟芬 | Lv.60-62 | 瘟疫狄瑞吉 |
|
||||
|
||||
---
|
||||
|
||||
## 二、大转移(灾难事件)
|
||||
|
||||
> 使徒狄瑞吉、安徒恩等力量引发的大灾难,阿拉德大陆被毁灭重塑
|
||||
|
||||
---
|
||||
|
||||
## 三、新阿拉德(大转移后)
|
||||
|
||||
### 银色村庄(新手村)
|
||||
| 地图 | 等级 | BOSS |
|
||||
|------|------|------|
|
||||
| 冰霜洞穴 | Lv.1-5 | 冰精灵 |
|
||||
| 幽冥监狱 | Lv.5-10 | 幽灵 |
|
||||
| 寂静森林 | Lv.10-15 | 森林精灵 |
|
||||
|
||||
### 暗黑城(新)
|
||||
| 地图 | 等级 | BOSS |
|
||||
|------|------|------|
|
||||
| 暗黑城外围 | Lv.15-20 | 暗精灵 |
|
||||
| 暗黑城广场 | Lv.20-25 | 暗精灵守卫 |
|
||||
|
||||
### 天帷巨兽(新)
|
||||
| 地图 | 等级 | BOSS |
|
||||
|------|------|------|
|
||||
| 神殿 | Lv.25-30 | GBL教徒 |
|
||||
| 树林 | Lv.30-35 | 巨树精 |
|
||||
|
||||
### 海上列车
|
||||
| 地图 | 等级 | BOSS |
|
||||
|------|------|------|
|
||||
| 列车车厢 | Lv.35-40 | 海盗 |
|
||||
| 列车头部 | Lv.40-45 | 海盗船长 |
|
||||
|
||||
---
|
||||
|
||||
## 四、天界(大转移后)
|
||||
|
||||
### 根特
|
||||
| 地图 | 等级 |
|
||||
|------|------|
|
||||
| 根特皇宫 | Lv.45-50 |
|
||||
| 机械七战神 | Lv.50-55 |
|
||||
|
||||
### 无法地带
|
||||
| 地图 | 等级 |
|
||||
|------|------|
|
||||
| 卡勒特总部 | Lv.55-60 |
|
||||
| 沙漠绿洲 | Lv.60-65 |
|
||||
|
||||
### 能源中心(安徒恩)
|
||||
| 地图 | 等级 | BOSS |
|
||||
|------|------|------|
|
||||
| 能源中心 | Lv.65-70 | 能源守护者 |
|
||||
| 安徒恩的心脏 | Lv.70-75 | **使徒安徒恩** |
|
||||
|
||||
---
|
||||
|
||||
## 五、魔界
|
||||
|
||||
### 魔界营地
|
||||
| 地图 | 等级 | BOSS |
|
||||
|------|------|------|
|
||||
| 魔界外围 | Lv.75-80 | 魔界生物 |
|
||||
| 地轨中心 | Lv.80-85 | 使徒卢克(前置)|
|
||||
|
||||
### 卢克团本
|
||||
| 地图 | 等级 | BOSS |
|
||||
|------|------|------|
|
||||
| 卢克实验室 | Lv.85-90 | **使徒卢克** |
|
||||
|
||||
### 超时空
|
||||
| 地图 | 等级 | BOSS |
|
||||
|------|------|------|
|
||||
| 超时空漩涡 | Lv.90-95 | 超时空怪物 |
|
||||
| 普雷团本 | Lv.95-100 | **使徒普雷** |
|
||||
|
||||
---
|
||||
|
||||
## 六、神界
|
||||
|
||||
### 神界
|
||||
| 地图 | 等级 | BOSS |
|
||||
|------|------|------|
|
||||
| 神界入口 | Lv.100+ | 神界守护者 |
|
||||
| 神界核心 | Lv.100+ | 最终BOSS |
|
||||
|
||||
---
|
||||
|
||||
## 剧情节奏规划
|
||||
|
||||
| 阶段 | 章节 | 等级 | 内容 |
|
||||
|------|------|------|------|
|
||||
| **初始阿拉德** | 第1-30章 | Lv.1-60 | 艾尔文→格兰→天空→天帷→斯顿→暗黑城→诺斯玛尔 |
|
||||
| **大转移事件** | 第31章 | - | 灾难发生,阿拉德毁灭 |
|
||||
| **新阿拉德** | 第32-40章 | Lv.1-45 | 银色村庄→暗黑城→天帷→海上列车 |
|
||||
| **天界篇** | 第41-50章 | Lv.45-75 | 根特→无法地带→安徒恩 |
|
||||
| **魔界篇** | 第51-60章 | Lv.75-90 | 魔界→卢克 |
|
||||
| **神界篇** | 第61-70章 | Lv.90-100+ | 超时空→普雷→神界 |
|
||||
|
||||
---
|
||||
|
||||
*整理日期:2026-03-21*
|
||||
1159
novels/dnf/设定集.md
Normal file
1159
novels/dnf/设定集.md
Normal file
File diff suppressed because it is too large
Load Diff
83
skills/.skills_store_lock.json
Normal file
83
skills/.skills_store_lock.json
Normal file
@ -0,0 +1,83 @@
|
||||
{
|
||||
"version": 1,
|
||||
"skills": {
|
||||
"kuro-self-reflection": {
|
||||
"name": "三省吾身 - 深度自我审视与进化系统",
|
||||
"zip_url": "https://lightmake.site/api/v1/download?slug=kuro-self-reflection",
|
||||
"source": "skillhub",
|
||||
"version": "2.0.0"
|
||||
},
|
||||
"chinese-novelist-skill": {
|
||||
"name": "Chinese Novelist Skill",
|
||||
"zip_url": "https://lightmake.site/api/v1/download?slug=chinese-novelist-skill",
|
||||
"source": "skillhub",
|
||||
"version": "1.0.0"
|
||||
},
|
||||
"character-profile-cn": {
|
||||
"name": "Novel Character Profile Builder",
|
||||
"zip_url": "https://lightmake.site/api/v1/download?slug=character-profile-cn",
|
||||
"source": "skillhub",
|
||||
"version": "1.0.0"
|
||||
},
|
||||
"humanizer-zh": {
|
||||
"name": "humanizer-zh",
|
||||
"zip_url": "https://lightmake.site/api/v1/download?slug=humanizer-zh",
|
||||
"source": "skillhub",
|
||||
"version": "1.0.0"
|
||||
},
|
||||
"novel-workshop": {
|
||||
"name": "Novel Workshop",
|
||||
"zip_url": "https://lightmake.site/api/v1/download?slug=novel-workshop",
|
||||
"source": "skillhub",
|
||||
"version": "2.0.0"
|
||||
},
|
||||
"story-cog": {
|
||||
"name": "story-cog",
|
||||
"zip_url": "https://lightmake.site/api/v1/download?slug=story-cog",
|
||||
"source": "skillhub",
|
||||
"version": "1.0.1"
|
||||
},
|
||||
"tavily-search": {
|
||||
"name": "Tavily Web Search",
|
||||
"zip_url": "https://lightmake.site/api/v1/download?slug=tavily-search",
|
||||
"source": "skillhub",
|
||||
"version": "1.0.0"
|
||||
},
|
||||
"summarize": {
|
||||
"name": "Summarize",
|
||||
"zip_url": "https://lightmake.site/api/v1/download?slug=summarize",
|
||||
"source": "skillhub",
|
||||
"version": "1.0.0"
|
||||
},
|
||||
"agent-browser": {
|
||||
"name": "Agent Browser",
|
||||
"zip_url": "https://lightmake.site/api/v1/download?slug=agent-browser",
|
||||
"source": "skillhub",
|
||||
"version": "0.2.0"
|
||||
},
|
||||
"find-skills": {
|
||||
"name": "Find Skills",
|
||||
"zip_url": "https://lightmake.site/api/v1/download?slug=find-skills",
|
||||
"source": "skillhub",
|
||||
"version": "0.1.0"
|
||||
},
|
||||
"github": {
|
||||
"name": "Github",
|
||||
"zip_url": "https://lightmake.site/api/v1/download?slug=github",
|
||||
"source": "skillhub",
|
||||
"version": "1.0.0"
|
||||
},
|
||||
"obsidian": {
|
||||
"name": "Obsidian",
|
||||
"zip_url": "https://lightmake.site/api/v1/download?slug=obsidian",
|
||||
"source": "skillhub",
|
||||
"version": "1.0.0"
|
||||
},
|
||||
"weather": {
|
||||
"name": "Weather",
|
||||
"zip_url": "https://lightmake.site/api/v1/download?slug=weather",
|
||||
"source": "skillhub",
|
||||
"version": "1.0.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
63
skills/agent-browser/CONTRIBUTING.md
Normal file
63
skills/agent-browser/CONTRIBUTING.md
Normal file
@ -0,0 +1,63 @@
|
||||
# Contributing to Agent Browser Skill
|
||||
|
||||
This skill wraps the agent-browser CLI. Determine where the problem lies before reporting issues.
|
||||
|
||||
## Issue Reporting Guide
|
||||
|
||||
### Open an issue in this repository if
|
||||
|
||||
- The skill documentation is unclear or missing
|
||||
- Examples in SKILL.md do not work
|
||||
- You need help using the CLI with this skill wrapper
|
||||
- The skill is missing a command or feature
|
||||
|
||||
### Open an issue at the agent-browser repository if
|
||||
|
||||
- The CLI crashes or throws errors
|
||||
- Commands do not behave as documented
|
||||
- You found a bug in the browser automation
|
||||
- You need a new feature in the CLI
|
||||
|
||||
## Before Opening an Issue
|
||||
|
||||
1. Install the latest version
|
||||
```bash
|
||||
npm install -g agent-browser@latest
|
||||
```
|
||||
|
||||
2. Test the command in your terminal to isolate the issue
|
||||
|
||||
## Issue Report Template
|
||||
|
||||
Use this template to provide necessary information.
|
||||
|
||||
```markdown
|
||||
### Description
|
||||
[Provide a clear and concise description of the bug]
|
||||
|
||||
### Reproduction Steps
|
||||
1. [First Step]
|
||||
2. [Second Step]
|
||||
3. [Observe error]
|
||||
|
||||
### Expected Behavior
|
||||
[Describe what you expected to happen]
|
||||
|
||||
### Environment Details
|
||||
- **Skill Version:** [e.g. 1.0.2]
|
||||
- **agent-browser Version:** [output of agent-browser --version]
|
||||
- **Node.js Version:** [output of node -v]
|
||||
- **Operating System:** [e.g. macOS Sonoma, Windows 11, Ubuntu 22.04]
|
||||
|
||||
### Additional Context
|
||||
- [Full error output or stack trace]
|
||||
- [Screenshots]
|
||||
- [Website URLs where the failure occurred]
|
||||
```
|
||||
|
||||
## Adding New Commands to the Skill
|
||||
|
||||
Update SKILL.md when the upstream CLI adds new commands.
|
||||
- Keep the Installation section
|
||||
- Add new commands in the correct category
|
||||
- Include usage examples
|
||||
328
skills/agent-browser/SKILL.md
Normal file
328
skills/agent-browser/SKILL.md
Normal file
@ -0,0 +1,328 @@
|
||||
---
|
||||
name: Agent Browser
|
||||
description: A fast Rust-based headless browser automation CLI with Node.js fallback that enables AI agents to navigate, click, type, and snapshot pages via structured commands.
|
||||
read_when:
|
||||
- Automating web interactions
|
||||
- Extracting structured data from pages
|
||||
- Filling forms programmatically
|
||||
- Testing web UIs
|
||||
metadata: {"clawdbot":{"emoji":"🌐","requires":{"bins":["node","npm"]}}}
|
||||
allowed-tools: Bash(agent-browser:*)
|
||||
---
|
||||
|
||||
# Browser Automation with agent-browser
|
||||
|
||||
## Installation
|
||||
|
||||
### npm recommended
|
||||
|
||||
```bash
|
||||
npm install -g agent-browser
|
||||
agent-browser install
|
||||
agent-browser install --with-deps
|
||||
```
|
||||
|
||||
### From Source
|
||||
|
||||
```bash
|
||||
git clone https://github.com/vercel-labs/agent-browser
|
||||
cd agent-browser
|
||||
pnpm install
|
||||
pnpm build
|
||||
agent-browser install
|
||||
```
|
||||
|
||||
## Quick start
|
||||
|
||||
```bash
|
||||
agent-browser open <url> # Navigate to page
|
||||
agent-browser snapshot -i # Get interactive elements with refs
|
||||
agent-browser click @e1 # Click element by ref
|
||||
agent-browser fill @e2 "text" # Fill input by ref
|
||||
agent-browser close # Close browser
|
||||
```
|
||||
|
||||
## Core workflow
|
||||
|
||||
1. Navigate: `agent-browser open <url>`
|
||||
2. Snapshot: `agent-browser snapshot -i` (returns elements with refs like `@e1`, `@e2`)
|
||||
3. Interact using refs from the snapshot
|
||||
4. Re-snapshot after navigation or significant DOM changes
|
||||
|
||||
## Commands
|
||||
|
||||
### Navigation
|
||||
|
||||
```bash
|
||||
agent-browser open <url> # Navigate to URL
|
||||
agent-browser back # Go back
|
||||
agent-browser forward # Go forward
|
||||
agent-browser reload # Reload page
|
||||
agent-browser close # Close browser
|
||||
```
|
||||
|
||||
### Snapshot (page analysis)
|
||||
|
||||
```bash
|
||||
agent-browser snapshot # Full accessibility tree
|
||||
agent-browser snapshot -i # Interactive elements only (recommended)
|
||||
agent-browser snapshot -c # Compact output
|
||||
agent-browser snapshot -d 3 # Limit depth to 3
|
||||
agent-browser snapshot -s "#main" # Scope to CSS selector
|
||||
```
|
||||
|
||||
### Interactions (use @refs from snapshot)
|
||||
|
||||
```bash
|
||||
agent-browser click @e1 # Click
|
||||
agent-browser dblclick @e1 # Double-click
|
||||
agent-browser focus @e1 # Focus element
|
||||
agent-browser fill @e2 "text" # Clear and type
|
||||
agent-browser type @e2 "text" # Type without clearing
|
||||
agent-browser press Enter # Press key
|
||||
agent-browser press Control+a # Key combination
|
||||
agent-browser keydown Shift # Hold key down
|
||||
agent-browser keyup Shift # Release key
|
||||
agent-browser hover @e1 # Hover
|
||||
agent-browser check @e1 # Check checkbox
|
||||
agent-browser uncheck @e1 # Uncheck checkbox
|
||||
agent-browser select @e1 "value" # Select dropdown
|
||||
agent-browser scroll down 500 # Scroll page
|
||||
agent-browser scrollintoview @e1 # Scroll element into view
|
||||
agent-browser drag @e1 @e2 # Drag and drop
|
||||
agent-browser upload @e1 file.pdf # Upload files
|
||||
```
|
||||
|
||||
### Get information
|
||||
|
||||
```bash
|
||||
agent-browser get text @e1 # Get element text
|
||||
agent-browser get html @e1 # Get innerHTML
|
||||
agent-browser get value @e1 # Get input value
|
||||
agent-browser get attr @e1 href # Get attribute
|
||||
agent-browser get title # Get page title
|
||||
agent-browser get url # Get current URL
|
||||
agent-browser get count ".item" # Count matching elements
|
||||
agent-browser get box @e1 # Get bounding box
|
||||
```
|
||||
|
||||
### Check state
|
||||
|
||||
```bash
|
||||
agent-browser is visible @e1 # Check if visible
|
||||
agent-browser is enabled @e1 # Check if enabled
|
||||
agent-browser is checked @e1 # Check if checked
|
||||
```
|
||||
|
||||
### Screenshots & PDF
|
||||
|
||||
```bash
|
||||
agent-browser screenshot # Screenshot to stdout
|
||||
agent-browser screenshot path.png # Save to file
|
||||
agent-browser screenshot --full # Full page
|
||||
agent-browser pdf output.pdf # Save as PDF
|
||||
```
|
||||
|
||||
### Video recording
|
||||
|
||||
```bash
|
||||
agent-browser record start ./demo.webm # Start recording (uses current URL + state)
|
||||
agent-browser click @e1 # Perform actions
|
||||
agent-browser record stop # Stop and save video
|
||||
agent-browser record restart ./take2.webm # Stop current + start new recording
|
||||
```
|
||||
|
||||
Recording creates a fresh context but preserves cookies/storage from your session. If no URL is provided, it automatically returns to your current page. For smooth demos, explore first, then start recording.
|
||||
|
||||
### Wait
|
||||
|
||||
```bash
|
||||
agent-browser wait @e1 # Wait for element
|
||||
agent-browser wait 2000 # Wait milliseconds
|
||||
agent-browser wait --text "Success" # Wait for text
|
||||
agent-browser wait --url "/dashboard" # Wait for URL pattern
|
||||
agent-browser wait --load networkidle # Wait for network idle
|
||||
agent-browser wait --fn "window.ready" # Wait for JS condition
|
||||
```
|
||||
|
||||
### Mouse control
|
||||
|
||||
```bash
|
||||
agent-browser mouse move 100 200 # Move mouse
|
||||
agent-browser mouse down left # Press button
|
||||
agent-browser mouse up left # Release button
|
||||
agent-browser mouse wheel 100 # Scroll wheel
|
||||
```
|
||||
|
||||
### Semantic locators (alternative to refs)
|
||||
|
||||
```bash
|
||||
agent-browser find role button click --name "Submit"
|
||||
agent-browser find text "Sign In" click
|
||||
agent-browser find label "Email" fill "user@test.com"
|
||||
agent-browser find first ".item" click
|
||||
agent-browser find nth 2 "a" text
|
||||
```
|
||||
|
||||
### Browser settings
|
||||
|
||||
```bash
|
||||
agent-browser set viewport 1920 1080 # Set viewport size
|
||||
agent-browser set device "iPhone 14" # Emulate device
|
||||
agent-browser set geo 37.7749 -122.4194 # Set geolocation
|
||||
agent-browser set offline on # Toggle offline mode
|
||||
agent-browser set headers '{"X-Key":"v"}' # Extra HTTP headers
|
||||
agent-browser set credentials user pass # HTTP basic auth
|
||||
agent-browser set media dark # Emulate color scheme
|
||||
```
|
||||
|
||||
### Cookies & Storage
|
||||
|
||||
```bash
|
||||
agent-browser cookies # Get all cookies
|
||||
agent-browser cookies set name value # Set cookie
|
||||
agent-browser cookies clear # Clear cookies
|
||||
agent-browser storage local # Get all localStorage
|
||||
agent-browser storage local key # Get specific key
|
||||
agent-browser storage local set k v # Set value
|
||||
agent-browser storage local clear # Clear all
|
||||
```
|
||||
|
||||
### Network
|
||||
|
||||
```bash
|
||||
agent-browser network route <url> # Intercept requests
|
||||
agent-browser network route <url> --abort # Block requests
|
||||
agent-browser network route <url> --body '{}' # Mock response
|
||||
agent-browser network unroute [url] # Remove routes
|
||||
agent-browser network requests # View tracked requests
|
||||
agent-browser network requests --filter api # Filter requests
|
||||
```
|
||||
|
||||
### Tabs & Windows
|
||||
|
||||
```bash
|
||||
agent-browser tab # List tabs
|
||||
agent-browser tab new [url] # New tab
|
||||
agent-browser tab 2 # Switch to tab
|
||||
agent-browser tab close # Close tab
|
||||
agent-browser window new # New window
|
||||
```
|
||||
|
||||
### Frames
|
||||
|
||||
```bash
|
||||
agent-browser frame "#iframe" # Switch to iframe
|
||||
agent-browser frame main # Back to main frame
|
||||
```
|
||||
|
||||
### Dialogs
|
||||
|
||||
```bash
|
||||
agent-browser dialog accept [text] # Accept dialog
|
||||
agent-browser dialog dismiss # Dismiss dialog
|
||||
```
|
||||
|
||||
### JavaScript
|
||||
|
||||
```bash
|
||||
agent-browser eval "document.title" # Run JavaScript
|
||||
```
|
||||
|
||||
### State management
|
||||
|
||||
```bash
|
||||
agent-browser state save auth.json # Save session state
|
||||
agent-browser state load auth.json # Load saved state
|
||||
```
|
||||
|
||||
## Example: Form submission
|
||||
|
||||
```bash
|
||||
agent-browser open https://example.com/form
|
||||
agent-browser snapshot -i
|
||||
# Output shows: textbox "Email" [ref=e1], textbox "Password" [ref=e2], button "Submit" [ref=e3]
|
||||
|
||||
agent-browser fill @e1 "user@example.com"
|
||||
agent-browser fill @e2 "password123"
|
||||
agent-browser click @e3
|
||||
agent-browser wait --load networkidle
|
||||
agent-browser snapshot -i # Check result
|
||||
```
|
||||
|
||||
## Example: Authentication with saved state
|
||||
|
||||
```bash
|
||||
# Login once
|
||||
agent-browser open https://app.example.com/login
|
||||
agent-browser snapshot -i
|
||||
agent-browser fill @e1 "username"
|
||||
agent-browser fill @e2 "password"
|
||||
agent-browser click @e3
|
||||
agent-browser wait --url "/dashboard"
|
||||
agent-browser state save auth.json
|
||||
|
||||
# Later sessions: load saved state
|
||||
agent-browser state load auth.json
|
||||
agent-browser open https://app.example.com/dashboard
|
||||
```
|
||||
|
||||
## Sessions (parallel browsers)
|
||||
|
||||
```bash
|
||||
agent-browser --session test1 open site-a.com
|
||||
agent-browser --session test2 open site-b.com
|
||||
agent-browser session list
|
||||
```
|
||||
|
||||
## JSON output (for parsing)
|
||||
|
||||
Add `--json` for machine-readable output:
|
||||
|
||||
```bash
|
||||
agent-browser snapshot -i --json
|
||||
agent-browser get text @e1 --json
|
||||
```
|
||||
|
||||
## Debugging
|
||||
|
||||
```bash
|
||||
agent-browser open example.com --headed # Show browser window
|
||||
agent-browser console # View console messages
|
||||
agent-browser console --clear # Clear console
|
||||
agent-browser errors # View page errors
|
||||
agent-browser errors --clear # Clear errors
|
||||
agent-browser highlight @e1 # Highlight element
|
||||
agent-browser trace start # Start recording trace
|
||||
agent-browser trace stop trace.zip # Stop and save trace
|
||||
agent-browser record start ./debug.webm # Record from current page
|
||||
agent-browser record stop # Save recording
|
||||
agent-browser --cdp 9222 snapshot # Connect via CDP
|
||||
```
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
- If the command is not found on Linux ARM64, use the full path in the bin folder.
|
||||
- If an element is not found, use snapshot to find the correct ref.
|
||||
- If the page is not loaded, add a wait command after navigation.
|
||||
- Use --headed to see the browser window for debugging.
|
||||
|
||||
## Options
|
||||
|
||||
- --session <name> uses an isolated session.
|
||||
- --json provides JSON output.
|
||||
- --full takes a full page screenshot.
|
||||
- --headed shows the browser window.
|
||||
- --timeout sets the command timeout in milliseconds.
|
||||
- --cdp <port> connects via Chrome DevTools Protocol.
|
||||
|
||||
## Notes
|
||||
|
||||
- Refs are stable per page load but change on navigation.
|
||||
- Always snapshot after navigation to get new refs.
|
||||
- Use fill instead of type for input fields to ensure existing text is cleared.
|
||||
|
||||
## Reporting Issues
|
||||
|
||||
- Skill issues: Open an issue at https://github.com/TheSethRose/Agent-Browser-CLI
|
||||
- agent-browser CLI issues: Open an issue at https://github.com/vercel-labs/agent-browser
|
||||
6
skills/agent-browser/_meta.json
Normal file
6
skills/agent-browser/_meta.json
Normal file
@ -0,0 +1,6 @@
|
||||
{
|
||||
"ownerId": "kn72ce44tqw8bnnnewrn1s5x3s7yz7sq",
|
||||
"slug": "agent-browser",
|
||||
"version": "0.2.0",
|
||||
"publishedAt": 1768882342488
|
||||
}
|
||||
331
skills/character-profile-cn/SKILL.md
Normal file
331
skills/character-profile-cn/SKILL.md
Normal file
@ -0,0 +1,331 @@
|
||||
---
|
||||
name: character-profile
|
||||
description: "Novel Character Profile Builder (小说人物档案创建工具) — A bilingual CN/EN skill for creating structured, detailed character profiles for fiction writing. Generates complete markdown profiles including backstory, personality, relationships, character arcs, and consistency checks. Supports protagonist, antagonist, and supporting character templates with built-in conflict detection and relationship matrix tools. Ideal for web novel (网文), fantasy, romance, and literary fiction authors."
|
||||
---
|
||||
|
||||
# 小说人物档案创建工具
|
||||
|
||||
## 概述
|
||||
|
||||
本skill帮助小说作者创建结构化的人物角色档案,以markdown格式输出。适用于小说创作前期的人物设定阶段,确保角色设定完整、一致,为故事创作奠定基础。
|
||||
|
||||
## 快速开始
|
||||
|
||||
当用户需要创建人物档案时:
|
||||
|
||||
0. **设置工作目录**:访问用户工作目录,并切换到该目录
|
||||
1. **收集角色信息**:询问用户角色的核心信息
|
||||
2. **选择模板类型**:根据角色类型选择合适的模板
|
||||
3. **填充详细信息**:逐步引导用户完善各个字段
|
||||
4. **生成markdown档案**:输出格式化的markdown文档
|
||||
|
||||
## 核心工作流程
|
||||
|
||||
### 1. 确定角色类型
|
||||
|
||||
首先识别角色在故事中的定位:
|
||||
- **主角**:故事核心,需要最详细的档案
|
||||
- **重要配角**:关键支持角色,需要较详细档案
|
||||
- **次要角色**:功能性角色,需要基本档案
|
||||
- **反派**:对立角色,需要动机和背景深度分析
|
||||
|
||||
### 2. 信息收集顺序
|
||||
|
||||
按照以下逻辑顺序收集信息:
|
||||
|
||||
1. **基础身份**:姓名、年龄、性别、职业等
|
||||
2. **外在特征**:外貌、着装、举止
|
||||
3. **内在特质**:性格、价值观、信仰
|
||||
4. **背景故事**:过去经历、关键事件
|
||||
5. **关系网络**:与其他角色的联系
|
||||
6. **故事功能**:角色弧线、目标、冲突
|
||||
|
||||
### 3. 档案结构
|
||||
|
||||
所有档案都包含以下核心部分:
|
||||
|
||||
```markdown
|
||||
# [角色姓名] - 角色档案
|
||||
|
||||
## 基本信息
|
||||
- **姓名**:
|
||||
- **年龄**:
|
||||
- **性别**:
|
||||
- **职业/身份**:
|
||||
- **故事中的角色**:
|
||||
|
||||
## 外貌特征
|
||||
- **整体印象**:
|
||||
- **面部特征**:
|
||||
- **身材体型**:
|
||||
- **着装风格**:
|
||||
- **标志性特征**:
|
||||
|
||||
## 性格特点
|
||||
- **核心性格**:
|
||||
- **优点**:
|
||||
- **缺点**:
|
||||
- **价值观**:
|
||||
- **恐惧**:
|
||||
- **渴望**:
|
||||
|
||||
## 背景故事
|
||||
- **出身背景**:
|
||||
- **关键经历**:
|
||||
- **转折点**:
|
||||
- **未解之谜**:
|
||||
|
||||
## 人物关系
|
||||
- **与主角关系**:
|
||||
- **重要关系人**:
|
||||
- **敌对关系**:
|
||||
- **情感羁绊**:
|
||||
|
||||
## 故事发展
|
||||
- **角色目标**:
|
||||
- **内在冲突**:
|
||||
- **外在冲突**:
|
||||
- **发展弧线**:
|
||||
- **可能的结局**:
|
||||
|
||||
## 创作笔记
|
||||
- **灵感来源**:
|
||||
- **象征意义**:
|
||||
- **潜在发展**:
|
||||
```
|
||||
|
||||
## 详细指南
|
||||
|
||||
### 针对不同角色类型的调整
|
||||
|
||||
#### 主角模板
|
||||
- 需要最完整的背景故事和内心冲突
|
||||
- 详细的发展弧线规划
|
||||
- 复杂的动机层次
|
||||
- 参考:[主角详细指南](references/protagonist.md)
|
||||
|
||||
#### 反派模板
|
||||
- 重点刻画动机的合理性
|
||||
- 详细的对立逻辑
|
||||
- 潜在的救赎可能性
|
||||
- 参考:[反派塑造指南](references/antagonist.md)
|
||||
|
||||
#### 配角模板
|
||||
- 突出功能性特点
|
||||
- 简化的背景故事
|
||||
- 明确的故事作用
|
||||
- 参考:[配角设计指南](references/supporting.md)
|
||||
|
||||
### 高级技巧
|
||||
|
||||
#### 角色一致性检查
|
||||
创建档案后,进行以下检查:
|
||||
1. **动机一致性**:行为是否与动机匹配
|
||||
2. **发展合理性**:变化是否有合理铺垫
|
||||
3. **关系逻辑性**:人物关系是否自然
|
||||
4. **冲突有效性**:冲突是否推动故事
|
||||
|
||||
#### 角色关系矩阵
|
||||
对于多个角色,创建关系矩阵:
|
||||
- 情感强度
|
||||
- 冲突程度
|
||||
- 信任等级
|
||||
- 依赖关系
|
||||
|
||||
## 使用示例
|
||||
|
||||
### 示例1:创建奇幻小说主角
|
||||
```
|
||||
用户:我需要创建一个奇幻小说的主角,年轻法师,出身平凡但有特殊血统
|
||||
|
||||
步骤:
|
||||
1. 识别为"主角"类型
|
||||
2. 使用主角模板
|
||||
3. 重点询问:特殊血统的设定、法师能力的限制、成长路径
|
||||
4. 生成完整档案,强调魔法系统和成长弧线
|
||||
```
|
||||
|
||||
### 示例2:创建都市情感故事配角
|
||||
```
|
||||
用户:需要一个都市故事的女主角闺蜜,性格开朗但有自己的秘密
|
||||
|
||||
步骤:
|
||||
1. 识别为"重要配角"类型
|
||||
2. 使用配角模板,调整情感深度
|
||||
3. 重点询问:秘密的内容、与女主的关系、独立故事线
|
||||
4. 生成档案,平衡功能性和深度
|
||||
```
|
||||
|
||||
## 输出文件处理
|
||||
|
||||
生成的markdown档案可以:
|
||||
1. 直接保存为`.md`文件
|
||||
2. 集成到小说写作软件
|
||||
3. 作为角色卡片打印使用
|
||||
4. 后续更新和迭代
|
||||
|
||||
## 常见问题
|
||||
|
||||
### Q: 如何避免角色模板化?
|
||||
A: 在每个部分加入独特细节,寻找角色的矛盾点和非常规特征。
|
||||
|
||||
### Q: 档案应该多详细?
|
||||
A: 根据角色重要性调整,主角可能需要5000+字,配角500-1000字。
|
||||
|
||||
### Q: 如何处理角色发展?
|
||||
A: 在"故事发展"部分规划多个阶段的状态变化。
|
||||
|
||||
## 参考文件
|
||||
|
||||
- [主角详细指南](references/protagonist.md) - 主角塑造的深入指导
|
||||
- [反派塑造指南](references/antagonist.md) - 反派角色的创作要点
|
||||
- [配角设计指南](references/supporting.md) - 配角的功能性和深度平衡
|
||||
- [关系网络设计](references/relationships.md) - 角色关系矩阵构建方法
|
||||
|
||||
## 最佳实践
|
||||
|
||||
1. **从核心概念开始**:先确定角色的核心理念
|
||||
2. **逐步丰富细节**:层层添加具体特征
|
||||
3. **检查逻辑一致性**:确保所有元素协调
|
||||
4. **预留发展空间**:为故事发展留有余地
|
||||
5. **迭代更新**:随着写作进展更新档案
|
||||
|
||||
## 增强功能 (v1.1+)
|
||||
|
||||
### 概述
|
||||
从v1.1版本开始,工具增加了LoreBible管理和冲突检测功能,帮助作者维护统一的故事设定宇宙。
|
||||
|
||||
### 核心功能
|
||||
|
||||
#### 1. LoreBible目录管理
|
||||
- **工作目录支持**:使用`--workspace`参数指定LoreBible工作目录
|
||||
- **自动目录创建**:自动创建`00_Prepare`、`02_LoreBible/Characters`等标准目录结构
|
||||
- **现有角色扫描**:自动扫描和解析现有角色档案,构建角色索引
|
||||
|
||||
#### 2. 冲突检测
|
||||
- **重复角色检测**:检测姓名重复或高度相似的角色
|
||||
- **常识校验**:检查年龄合理性、时间线一致性等常识错误
|
||||
- **关系冲突检测**:检测角色关系中的矛盾和不一致
|
||||
- **冲突报告**:生成详细的冲突报告和建议解决方案
|
||||
|
||||
#### 3. 会话管理
|
||||
- **临时文件系统**:用户确认前在`00_Prepare`目录保存临时档案
|
||||
- **用户确认流程**:交互式展示冲突,用户确认后移动到最终目录
|
||||
- **会话状态持久化**:支持断点续传,自动清理过期会话
|
||||
|
||||
#### 4. 子代理工作流
|
||||
- **任务分解**:将角色创建过程分解为原子任务
|
||||
- **依赖管理**:自动处理任务依赖关系
|
||||
- **错误恢复**:任务失败时自动重试,提供详细错误报告
|
||||
|
||||
### 使用方法
|
||||
|
||||
#### 命令行增强模式
|
||||
```bash
|
||||
# 基本用法(传统模式)
|
||||
python scripts/generate_profile.py --name "张三" --age "25" --gender "男"
|
||||
|
||||
# 增强模式(推荐)
|
||||
python scripts/generate_profile.py --name "李四" --age "30" --workspace "/path/to/lorebible"
|
||||
|
||||
# 跳过用户确认
|
||||
python scripts/generate_profile.py --name "王五" --workspace "/path/to/lorebible" --no-confirm
|
||||
|
||||
# 指定模板类型
|
||||
python scripts/generate_profile.py --name "赵六" --type "protagonist" --workspace "/path/to/lorebible"
|
||||
```
|
||||
|
||||
#### 目录结构
|
||||
```
|
||||
工作目录/
|
||||
├── 00_Prepare/ # 临时档案目录
|
||||
├── 01_Research/ # 研究资料目录(可选)
|
||||
└── 02_LoreBible/
|
||||
├── Characters/ # 最终角色档案目录
|
||||
├── Locations/ # 地点设定目录(可选)
|
||||
├── Organizations/ # 组织设定目录(可选)
|
||||
└── Timeline/ # 时间线目录(可选)
|
||||
```
|
||||
|
||||
#### 子代理工作流
|
||||
```bash
|
||||
# 运行完整工作流
|
||||
python scripts/subagent_orchestrator.py "/path/to/lorebible" "character_creation"
|
||||
|
||||
# 运行快速创建模式
|
||||
python scripts/subagent_orchestrator.py "/path/to/lorebible" "quick_creation"
|
||||
```
|
||||
|
||||
### 配置文件
|
||||
|
||||
#### 校验规则配置 (`config/validation_rules.json`)
|
||||
```json
|
||||
{
|
||||
"rules": [
|
||||
{
|
||||
"id": "age_realistic",
|
||||
"name": "年龄合理性",
|
||||
"description": "检查年龄是否在合理范围内",
|
||||
"condition": "age.isdigit() and not (0 <= int(age) <= 150)",
|
||||
"severity": "warning"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
#### 工作流配置 (`config/workflow_tasks.json`)
|
||||
```json
|
||||
{
|
||||
"workflows": {
|
||||
"character_creation": {
|
||||
"name": "角色创建工作流",
|
||||
"tasks": [
|
||||
{
|
||||
"id": "init_workspace",
|
||||
"name": "初始化工作空间",
|
||||
"agent_type": "lore_bible_manager"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 新脚本模块
|
||||
|
||||
1. **`lore_bible_manager.py`** - LoreBible目录管理和角色扫描
|
||||
2. **`conflict_detector.py`** - 冲突检测和常识校验
|
||||
3. **`profile_session.py`** - 会话管理和用户确认流程
|
||||
4. **`subagent_orchestrator.py`** - 子代理工作流协调
|
||||
|
||||
### 向后兼容性
|
||||
|
||||
- 传统模式:不指定`--workspace`参数时,使用传统生成模式
|
||||
- 交互模式:增强模式也支持交互式创建
|
||||
- 输出文件:传统模式输出到当前目录,增强模式输出到LoreBible目录
|
||||
|
||||
### 故障排除
|
||||
|
||||
#### 常见问题
|
||||
1. **导入错误**:确保所有新脚本文件在`scripts/`目录中
|
||||
2. **目录权限**:确保工作目录有读写权限
|
||||
3. **配置文件缺失**:`config/`目录需要包含`validation_rules.json`和`workflow_tasks.json`
|
||||
|
||||
#### 日志查看
|
||||
启用详细日志:
|
||||
```python
|
||||
import logging
|
||||
logging.basicConfig(level=logging.DEBUG)
|
||||
```
|
||||
|
||||
### 未来计划
|
||||
- 图形用户界面支持
|
||||
- 云同步功能
|
||||
- AI辅助角色生成
|
||||
- 跨作品角色库管理
|
||||
|
||||
---
|
||||
|
||||
**版本历史**:
|
||||
- v1.0 (初始版本): 基础角色档案生成功能
|
||||
- v1.1 (当前版本): LoreBible管理、冲突检测、会话管理、子代理工作流
|
||||
6
skills/character-profile-cn/_meta.json
Normal file
6
skills/character-profile-cn/_meta.json
Normal file
@ -0,0 +1,6 @@
|
||||
{
|
||||
"ownerId": "kn76e1p303q2wh5t9c4cpshppn8245g9",
|
||||
"slug": "character-profile-cn",
|
||||
"version": "1.0.0",
|
||||
"publishedAt": 1772444009395
|
||||
}
|
||||
105
skills/character-profile-cn/assets/example_antagonist.md
Normal file
105
skills/character-profile-cn/assets/example_antagonist.md
Normal file
@ -0,0 +1,105 @@
|
||||
# 夜影 - 角色档案
|
||||
|
||||
> 生成时间:2025-01-26 11:15:00
|
||||
> 模板类型:反派模板
|
||||
|
||||
## 基本信息
|
||||
- **姓名**:夜影(本名:陈无涯)
|
||||
- **年龄**:42岁
|
||||
- **性别**:男
|
||||
- **职业/身份**:暗影议会议长/前魔法管理局高级官员
|
||||
- **故事中的角色**:主要反派
|
||||
|
||||
## 外貌特征
|
||||
- **整体印象**:威严冷峻,如同黑夜本身凝聚成人形,眼神深邃如渊
|
||||
- **面部特征**:轮廓分明,剑眉星目但总笼罩着一层阴影,右脸颊有一道淡淡的魔法灼伤疤痕
|
||||
- **身材体型**:身高185cm,体型修长挺拔,举止间带有军人的精准和优雅
|
||||
- **着装风格**:永恒不变的黑色西装或长袍,剪裁完美,除了左胸一枚银色的暗影徽章外无任何装饰
|
||||
- **标志性特征**:说话时喜欢轻轻转动左手无名指上的黑曜石戒指,在施展强大魔法时双眼会变成纯黑色
|
||||
|
||||
## 性格特点
|
||||
- **核心性格**:冷静、理智、极端理想主义者
|
||||
- **优点**:智慧超群、意志坚定、极具领导力、对目标无限执着
|
||||
- **缺点**:缺乏同理心、手段冷酷、难以信任他人、无法容忍不确定性
|
||||
- **价值观**:秩序高于一切,为了更大的利益可以牺牲少数,力量是实现理想的唯一途径
|
||||
- **恐惧**:魔法彻底失控导致世界毁灭,自己的理念被证明是错误的
|
||||
- **渴望**:建立一个完全由理性控制的魔法世界,消除所有不可控因素
|
||||
|
||||
## 核心理念
|
||||
- **世界观**:世界本质是混沌的,魔法是混沌的具现,唯有建立绝对秩序才能避免毁灭
|
||||
- **核心信念**:情感和欲望是魔法的污染源,真正的魔法应该是纯粹、可控、可计算的力量
|
||||
- **正义观**:能够保护最多数人、带来最大稳定的就是正义,过程的手段无关紧要
|
||||
- **变革愿景**:建立魔法联邦,将所有魔法师纳入统一管理,消除私自使用魔法的现象
|
||||
|
||||
## 动机发展
|
||||
- **初始状态**:魔法管理局的优秀官员,相信体制可以规范魔法使用
|
||||
- **转折事件**:
|
||||
- 妻子在魔法失控事件中丧生,管理局因程序拖延未能及时救援
|
||||
- 亲眼目睹一个天赋极高的年轻魔法师因情感失控毁灭了整个村庄
|
||||
- 发现管理局高层腐败,为了利益掩盖多起魔法事故
|
||||
- **理念形成**:现有体制无法真正控制魔法,需要更彻底、更强硬的解决方案
|
||||
- **行动决定**:离开管理局,成立暗影议会,开始推行自己的理念
|
||||
|
||||
## 镜像对比
|
||||
- **相似点**:
|
||||
- 都曾相信体制的力量
|
||||
- 都拥有极高的魔法天赋
|
||||
- 都经历过重要之人的失去
|
||||
- 都在寻找控制魔法的方法
|
||||
- **分歧点**:
|
||||
- 林晓风相信理解和共存,夜影相信控制和秩序
|
||||
- 林晓风重视个体价值,夜影重视集体利益
|
||||
- 林晓风愿意承担风险给予信任,夜影只相信制度和规则
|
||||
- **对立逻辑**:代表了魔法世界两种根本对立的治理哲学
|
||||
- **潜在转化**:如果看到自己的方法造成了更大的伤害,可能会重新审视理念,但转变极为困难
|
||||
|
||||
## 资源能力
|
||||
- **核心团队**:
|
||||
- **月华**:副议长,战术大师,夜影最信任的副手
|
||||
- **铁面**:执行部长,前特种部队指挥官,负责武力行动
|
||||
- **智瞳**:情报部长,信息控制专家,掌握大量秘密
|
||||
- **盟友势力**:
|
||||
- 部分对现状不满的魔法师家族
|
||||
- 追求稳定秩序的世俗政府官员
|
||||
- 受够魔法失控威胁的普通人社区代表
|
||||
- **影响范围**:
|
||||
- 魔法界的暗中控制网络
|
||||
- 世俗政府中的秘密支持者
|
||||
- 多个关键魔法资源点的实际控制
|
||||
- **弱点环节**:
|
||||
- 过度依赖中央指挥,中层缺乏自主性
|
||||
- 理念过于极端,难以获得广泛支持
|
||||
- 个人情感创伤导致的盲点
|
||||
|
||||
## 故事发展
|
||||
- **角色目标**:
|
||||
- 短期:获取远古魔法神器"秩序之眼"
|
||||
- 中期:推翻现有魔法管理局,建立暗影议会主导的新秩序
|
||||
- 长期:在全球范围内实施魔法管制,消除所有魔法自由使用
|
||||
- **内在冲突**:
|
||||
- 理性告诉自己需要冷酷,但内心仍有对妻子的愧疚
|
||||
- 知道自己的手段残忍,但相信这是必要的代价
|
||||
- 渴望有人理解自己的理念,又害怕真正的亲密连接
|
||||
- **外在冲突**:
|
||||
- 与魔法管理局的正面对抗
|
||||
- 与林晓风等自由魔法师的理念斗争
|
||||
- 组织内部不同派系的权力博弈
|
||||
- **发展弧线**:
|
||||
- **起始**:坚定执行计划,相信自己的道路唯一正确
|
||||
- **考验**:计划遭遇重大挫折,手下出现背叛,开始怀疑方法
|
||||
- **挣扎**:在坚持理念和调整方法间摇摆,与林晓风多次交锋
|
||||
- **抉择**:面临最终选择,是坚持到底还是承认错误
|
||||
- **结局**:根据选择走向不同结局(毁灭/救赎/转变)
|
||||
- **可能的结局**:
|
||||
- **悲剧结局**:计划成功但失去一切,发现建立的新秩序同样腐败
|
||||
- **救赎结局**:在关键时刻醒悟,牺牲自己阻止更坏的结果
|
||||
- **转变结局**:理念转变,成为改革者而非独裁者
|
||||
- **坚持结局**:坚持到底,成为新一代的"必要之恶"
|
||||
|
||||
---
|
||||
|
||||
## 档案元数据
|
||||
- **角色类型**:反派模板
|
||||
- **创建时间**:2025-01-26 11:15:00
|
||||
- **状态**:完成
|
||||
- **版本**:1.1
|
||||
106
skills/character-profile-cn/assets/example_protagonist.md
Normal file
106
skills/character-profile-cn/assets/example_protagonist.md
Normal file
@ -0,0 +1,106 @@
|
||||
# 林晓风 - 角色档案
|
||||
|
||||
> 生成时间:2025-01-26 10:30:00
|
||||
> 模板类型:主角模板
|
||||
|
||||
## 基本信息
|
||||
- **姓名**:林晓风
|
||||
- **年龄**:24岁
|
||||
- **性别**:男
|
||||
- **职业/身份**:年轻法师/古籍研究员
|
||||
- **故事中的角色**:主角
|
||||
|
||||
## 外貌特征
|
||||
- **整体印象**:清瘦儒雅,眼神中带有书卷气与隐约的忧郁
|
||||
- **面部特征**:五官清秀,鼻梁高挺,时常微微蹙眉思考,左眼角有一颗浅褐色小痣
|
||||
- **身材体型**:身高178cm,体型偏瘦但并非孱弱,长期的古籍搬运工作让他有不错的体力
|
||||
- **着装风格**:偏好深色系长袍,样式简洁但有精致的暗纹,总带着一副细框眼镜
|
||||
- **标志性特征**:左手手背有一道淡银色的魔法印记,在情绪激动时会微微发光
|
||||
|
||||
## 性格特点
|
||||
- **核心性格**:内省、执着、善良但有些优柔寡断
|
||||
- **优点**:博学多识、细心谨慎、有同理心、坚韧不拔
|
||||
- **缺点**:过度思虑、缺乏自信、不擅表达情感、有时过于理想化
|
||||
- **价值观**:相信知识的力量,认为理解比征服更重要,重视生命的尊严
|
||||
- **恐惧**:无法保护所爱之人,让老师失望,自己的力量失控伤害他人
|
||||
- **渴望**:真正理解魔法的本质,找到自己在世界中的位置,获得内心的平静
|
||||
|
||||
## 背景故事
|
||||
- **出身背景**:出生于学者世家,父母都是皇家学院的教授,在学术氛围中长大
|
||||
- **关键经历**:
|
||||
- 12岁时无意中激活了家传的古籍,发现了自己的魔法天赋
|
||||
- 15岁拜入隐世大法师门下,开始系统学习魔法
|
||||
- 20岁时老师神秘失踪,只留下一本未完成的魔法笔记
|
||||
- 22岁进入皇家古籍馆工作,暗中调查老师失踪的真相
|
||||
- **转折点**:在古籍馆发现一本记载着禁忌魔法的古籍,意识到老师的失踪与一个古老的神秘组织有关
|
||||
- **未解之谜**:父母的真实身份是什么?老师为何突然失踪?手背上的魔法印记来自何处?
|
||||
|
||||
## 动机层次
|
||||
- **表层目标**:找到失踪的老师,解开古籍中的秘密
|
||||
- **情感需求**:获得认可和归属感,不再感到自己是世界的异类
|
||||
- **存在需求**:理解自己为何拥有魔法天赋,找到生命的意义
|
||||
- **未意识需求**:渴望被需要、被依赖,证明自己的价值
|
||||
|
||||
## 核心身份
|
||||
- **本质自我**:一个渴望理解和被理解的求知者
|
||||
- **社会面具**:沉稳内敛的古籍研究员
|
||||
- **理想自我**:能够掌控魔法力量,保护所爱之人的强大法师
|
||||
- **恐惧自我**:力量失控的怪物,让所有人失望的失败者
|
||||
|
||||
## 人物关系
|
||||
- **与主角关系**:本故事的主角
|
||||
- **重要关系人**:
|
||||
- **苏沐雨**:青梅竹马,现在的同事,暗恋对象,不知道他的魔法身份
|
||||
- **玄清法师**:失踪的老师,如父如师的存在
|
||||
- **陆明轩**:古籍馆馆长,知道他的秘密并暗中保护
|
||||
- **影月**:神秘组织的女刺客,亦敌亦友的复杂关系
|
||||
- **敌对关系**:
|
||||
- **暗影议会**:追求禁忌魔法的神秘组织
|
||||
- **陈司长**:魔法管理局官员,怀疑他的身份并处处刁难
|
||||
- **情感羁绊**:
|
||||
- 对苏沐雨:暗恋但不敢表白,害怕自己的秘密会伤害她
|
||||
- 对玄清法师:敬爱如父,对其失踪怀有深深的愧疚
|
||||
- 对影月:初为敌人,后逐渐理解彼此的立场,产生微妙的情感
|
||||
|
||||
## 故事发展
|
||||
- **角色目标**:
|
||||
- 短期:解开老师留下的笔记秘密
|
||||
- 中期:查明暗影议会的真正目的
|
||||
- 长期:找到魔法与人类共存的平衡之道
|
||||
- **内在冲突**:
|
||||
- 求知欲与安全顾虑的矛盾
|
||||
- 对力量的控制与恐惧
|
||||
- 个人感情与责任的抉择
|
||||
- **外在冲突**:
|
||||
- 与暗影议会的魔法对抗
|
||||
- 躲避魔法管理局的追查
|
||||
- 保护朋友不卷入危险
|
||||
- **发展弧线**:
|
||||
- **起始**:谨慎低调,隐藏力量,独自承担秘密
|
||||
- **成长**:逐渐信任他人,组建自己的团队,学会合作
|
||||
- **考验**:面临重大抉择,在力量、责任、感情间权衡
|
||||
- **转变**:从被动防御到主动出击,从隐藏到接纳自我
|
||||
- **完成**:找到内心的平衡,明确自己的道路
|
||||
- **可能的结局**:
|
||||
- 理想结局:揭穿暗影议会的阴谋,找到老师,与苏沐雨在一起
|
||||
- 牺牲结局:为保护他人牺牲自己,成为传说
|
||||
- 开放结局:继续游走于两个世界之间,寻找新的平衡
|
||||
|
||||
## 创作笔记
|
||||
- **灵感来源**:东方玄幻与都市奇幻的结合,探讨现代社会中传统与现代的冲突
|
||||
- **象征意义**:
|
||||
- 魔法印记:天赋与诅咒的双重象征
|
||||
- 古籍:传统知识与现代价值的桥梁
|
||||
- 眼镜:理性与感性的分界
|
||||
- **潜在发展**:
|
||||
- 魔法印记的真正来源可能是某个古老血脉
|
||||
- 父母可能与暗影议会有某种联系
|
||||
- 苏沐雨可能也有未被发现的神秘能力
|
||||
|
||||
---
|
||||
|
||||
## 档案元数据
|
||||
- **角色类型**:主角模板
|
||||
- **创建时间**:2025-01-26 10:30:00
|
||||
- **状态**:完成
|
||||
- **版本**:1.2
|
||||
92
skills/character-profile-cn/assets/example_supporting.md
Normal file
92
skills/character-profile-cn/assets/example_supporting.md
Normal file
@ -0,0 +1,92 @@
|
||||
# 苏沐雨 - 角色档案
|
||||
|
||||
> 生成时间:2025-01-26 11:45:00
|
||||
> 模板类型:配角模板
|
||||
|
||||
## 基本定位
|
||||
- **功能类型**:盟友型配角 + 潜在爱情对象
|
||||
- **重要性级别**:一级配角(重要配角)
|
||||
- **与主角关系**:青梅竹马、同事、暗恋对象
|
||||
- **核心功能**:提供情感支持、推动主角情感发展、连接世俗世界
|
||||
|
||||
## 独立身份
|
||||
- **个人目标**:
|
||||
- 成为顶尖的古籍修复专家
|
||||
- 解开父母失踪的真相(与主线潜在连接点)
|
||||
- 找到真正理解自己、能坦诚相待的伴侣
|
||||
- **生活背景**:
|
||||
- 书香门第,父母都是考古学家,在她16岁时在一次考古事故中失踪
|
||||
- 由祖母抚养长大,继承了父母对古籍的热爱
|
||||
- 大学攻读古籍保护专业,毕业后进入皇家古籍馆工作
|
||||
- **价值观**:
|
||||
- 相信真相和知识的力量
|
||||
- 重视人与人之间的真诚和信任
|
||||
- 认为保护文化遗产是每个人的责任
|
||||
- **秘密或矛盾**:
|
||||
- 隐约感觉到林晓风在隐藏什么,但尊重他的隐私没有追问
|
||||
- 自己也在暗中调查父母失踪的真相,怀疑那不是普通事故
|
||||
- 对林晓风有好感但不确定他的心意,同时有另一个追求者(陆明轩的侄子)
|
||||
|
||||
## 功能性设计
|
||||
- **推动剧情的方式**:
|
||||
1. 情感支线:与林晓风的感情发展推动主角的情感成长
|
||||
2. 线索提供:通过古籍修复工作发现关键线索
|
||||
3. 危机制造:因接近真相而陷入危险,需要主角救援
|
||||
4. 价值观对比:代表世俗、理性的视角,与魔法世界形成对比
|
||||
- **服务主角的方式**:
|
||||
1. **情感支持**:在林晓风迷茫时给予安慰和建议
|
||||
2. **现实锚点**:提醒主角普通人的生活和价值观
|
||||
3. **技能补充**:古籍修复和鉴定能力补充主角的魔法知识
|
||||
4. **信任考验**:主角需要决定是否向她坦白秘密
|
||||
- **独特价值**:
|
||||
- 连接魔法世界和世俗世界的桥梁
|
||||
- 体现"知识不分魔法与科学"的主题
|
||||
- 提供温暖、稳定的情感基调
|
||||
- **退出时机**:
|
||||
- 中期可能因发现真相暂时离开,给主角成长空间
|
||||
- 后期回归,在最终决战中发挥关键作用
|
||||
- 结局根据感情线发展决定去向
|
||||
|
||||
## 关系发展
|
||||
- **初始关系**:亲近的青梅竹马,默契的工作伙伴,彼此有好感但未挑明
|
||||
- **关系转折点**:
|
||||
1. **发现端倪**:开始察觉林晓风的异常,关系出现微妙距离
|
||||
2. **危机时刻**:因调查父母失踪陷入危险,被林晓风以魔法救下
|
||||
3. **真相揭露**:林晓风坦白魔法身份,关系面临信任考验
|
||||
4. **共同冒险**:决定帮助林晓风,关系从青梅竹马升级为战友
|
||||
5. **情感抉择**:在感情上面临选择,决定彼此的心意
|
||||
- **最终关系**:
|
||||
- 理想线:成为情侣,共同面对魔法世界的挑战
|
||||
- 友情线:保持深厚友谊,各自找到适合的伴侣
|
||||
- 牺牲线:为保护对方或理想牺牲,成为主角永远的遗憾
|
||||
- **关系影响**:
|
||||
- 促使林晓风学会信任和敞开心扉
|
||||
- 让主角在魔法和世俗间找到平衡
|
||||
- 为主题增添"爱与责任"的维度
|
||||
|
||||
## 发展可能性
|
||||
- **潜在成长**:
|
||||
1. 从被保护者成长为能够保护他人的强者
|
||||
2. 发现自己的潜在能力(可能与父母的研究有关)
|
||||
3. 从古籍专家成长为连接两个世界的桥梁人物
|
||||
- **故事线扩展**:
|
||||
- **父母线**:父母失踪与暗影议会的早期实验有关
|
||||
- **能力线**:遗传了父母对古魔法的特殊感应能力
|
||||
- **职业线**:建立魔法古籍保护中心,成为新领域的开创者
|
||||
- **意外发展**:
|
||||
- 可能短暂被暗影议会利用或控制
|
||||
- 可能发现自己是某个古老魔法血脉的后裔
|
||||
- 可能在关键时刻做出出人意料的选择
|
||||
- **结局设想**:
|
||||
- **圆满结局**:与林晓风在一起,共同建立魔法与人类共存的新秩序
|
||||
- **独立结局**:成为独立的古籍保护专家,与魔法世界保持合作但不过度深入
|
||||
- **传承结局**:继承父母的遗志,揭开某个重大秘密,成为新一代的守护者
|
||||
- **开放结局**:继续探索两个世界的边界,寻找自己的道路
|
||||
|
||||
---
|
||||
|
||||
## 档案元数据
|
||||
- **角色类型**:配角模板
|
||||
- **创建时间**:2025-01-26 11:45:00
|
||||
- **状态**:完成
|
||||
- **版本**:1.0
|
||||
95
skills/character-profile-cn/config/validation_rules.json
Normal file
95
skills/character-profile-cn/config/validation_rules.json
Normal file
@ -0,0 +1,95 @@
|
||||
{
|
||||
"rules": [
|
||||
{
|
||||
"id": "age_realistic",
|
||||
"name": "年龄合理性",
|
||||
"description": "检查年龄是否在合理范围内(0-150岁)",
|
||||
"condition": "age.isdigit() and not (0 <= int(age) <= 150)",
|
||||
"severity": "warning",
|
||||
"enabled": true,
|
||||
"category": "common_sense"
|
||||
},
|
||||
{
|
||||
"id": "age_format",
|
||||
"name": "年龄格式",
|
||||
"description": "年龄应为数字或数字范围",
|
||||
"pattern": "^\\d+(\\s*-\\s*\\d+)?$",
|
||||
"severity": "info",
|
||||
"enabled": true,
|
||||
"category": "common_sense"
|
||||
},
|
||||
{
|
||||
"id": "name_length",
|
||||
"name": "姓名长度",
|
||||
"description": "角色姓名应在2-20个字符之间",
|
||||
"condition": "len(name) < 2 or len(name) > 20",
|
||||
"severity": "warning",
|
||||
"enabled": true,
|
||||
"category": "common_sense"
|
||||
},
|
||||
{
|
||||
"id": "gender_valid",
|
||||
"name": "性别有效性",
|
||||
"description": "性别应为常见值",
|
||||
"pattern": "^(男|女|其他|未指定|非二元|未知)$",
|
||||
"severity": "info",
|
||||
"enabled": true,
|
||||
"category": "common_sense"
|
||||
},
|
||||
{
|
||||
"id": "occupation_length",
|
||||
"name": "职业描述长度",
|
||||
"description": "职业/身份描述不应过长",
|
||||
"condition": "len(occupation) > 100",
|
||||
"severity": "warning",
|
||||
"enabled": true,
|
||||
"category": "common_sense"
|
||||
},
|
||||
{
|
||||
"id": "role_required",
|
||||
"name": "角色定位",
|
||||
"description": "故事中的角色不应为空",
|
||||
"condition": "not role or role.strip() == ''",
|
||||
"severity": "warning",
|
||||
"enabled": true,
|
||||
"category": "common_sense"
|
||||
},
|
||||
{
|
||||
"id": "duplicate_name_strict",
|
||||
"name": "严格重复姓名检测",
|
||||
"description": "检测完全相同的姓名(忽略大小写和空格)",
|
||||
"severity": "error",
|
||||
"enabled": true,
|
||||
"category": "duplicate"
|
||||
},
|
||||
{
|
||||
"id": "similar_name",
|
||||
"name": "相似姓名检测",
|
||||
"description": "检测高度相似的姓名",
|
||||
"severity": "warning",
|
||||
"enabled": true,
|
||||
"category": "duplicate"
|
||||
},
|
||||
{
|
||||
"id": "timeline_consistency",
|
||||
"name": "时间线一致性",
|
||||
"description": "检查关键事件时间线是否合理",
|
||||
"severity": "warning",
|
||||
"enabled": true,
|
||||
"category": "timeline"
|
||||
},
|
||||
{
|
||||
"id": "relationship_symmetry",
|
||||
"name": "关系对称性",
|
||||
"description": "检查角色关系是否相互一致",
|
||||
"severity": "warning",
|
||||
"enabled": true,
|
||||
"category": "relationships"
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"version": "1.0",
|
||||
"created": "2026-01-26",
|
||||
"description": "角色档案常识校验规则"
|
||||
}
|
||||
}
|
||||
137
skills/character-profile-cn/config/workflow_tasks.json
Normal file
137
skills/character-profile-cn/config/workflow_tasks.json
Normal file
@ -0,0 +1,137 @@
|
||||
{
|
||||
"workflows": {
|
||||
"character_creation": {
|
||||
"name": "角色创建工作流",
|
||||
"description": "完整的角色创建和验证流程",
|
||||
"tasks": [
|
||||
{
|
||||
"id": "init_workspace",
|
||||
"name": "初始化工作空间",
|
||||
"description": "验证和创建目录结构",
|
||||
"agent_type": "lore_bible_manager",
|
||||
"inputs": ["workspace"],
|
||||
"outputs": ["directory_status", "missing_dirs"],
|
||||
"timeout": 30,
|
||||
"retry_count": 2
|
||||
},
|
||||
{
|
||||
"id": "scan_existing",
|
||||
"name": "扫描现有角色",
|
||||
"description": "扫描现有角色档案,构建索引",
|
||||
"agent_type": "lore_bible_manager",
|
||||
"inputs": ["workspace"],
|
||||
"outputs": ["character_index", "character_count"],
|
||||
"depends_on": ["init_workspace"],
|
||||
"timeout": 60
|
||||
},
|
||||
{
|
||||
"id": "generate_profile",
|
||||
"name": "生成角色档案",
|
||||
"description": "根据模板生成角色档案内容",
|
||||
"agent_type": "profile_generator",
|
||||
"inputs": ["character_data", "template_type"],
|
||||
"outputs": ["profile_content"],
|
||||
"timeout": 30
|
||||
},
|
||||
{
|
||||
"id": "save_temp",
|
||||
"name": "保存临时档案",
|
||||
"description": "将档案保存到临时目录",
|
||||
"agent_type": "profile_session",
|
||||
"inputs": ["profile_content", "character_name", "workspace"],
|
||||
"outputs": ["temp_file_path"],
|
||||
"depends_on": ["init_workspace", "generate_profile"],
|
||||
"timeout": 30
|
||||
},
|
||||
{
|
||||
"id": "detect_conflicts",
|
||||
"name": "检测冲突",
|
||||
"description": "检测与现有角色的冲突和常识错误",
|
||||
"agent_type": "conflict_detector",
|
||||
"inputs": ["character_data", "character_index"],
|
||||
"outputs": ["conflicts", "is_valid"],
|
||||
"depends_on": ["scan_existing"],
|
||||
"timeout": 45
|
||||
},
|
||||
{
|
||||
"id": "user_review",
|
||||
"name": "用户审核",
|
||||
"description": "向用户展示冲突并获取确认",
|
||||
"agent_type": "profile_session",
|
||||
"inputs": ["conflicts", "temp_file_path"],
|
||||
"outputs": ["user_confirmed", "user_notes"],
|
||||
"depends_on": ["detect_conflicts", "save_temp"],
|
||||
"timeout": 300,
|
||||
"interactive": true
|
||||
},
|
||||
{
|
||||
"id": "move_final",
|
||||
"name": "移动到最终目录",
|
||||
"description": "用户确认后移动档案到Characters目录",
|
||||
"agent_type": "profile_session",
|
||||
"inputs": ["temp_file_path", "character_name", "user_confirmed"],
|
||||
"outputs": ["final_file_path"],
|
||||
"depends_on": ["user_review"],
|
||||
"condition": "user_confirmed == true",
|
||||
"timeout": 30
|
||||
},
|
||||
{
|
||||
"id": "cleanup",
|
||||
"name": "清理临时文件",
|
||||
"description": "清理会话和临时文件",
|
||||
"agent_type": "profile_session",
|
||||
"inputs": ["session_id", "workspace"],
|
||||
"outputs": ["cleaned_count"],
|
||||
"depends_on": ["move_final"],
|
||||
"timeout": 30
|
||||
}
|
||||
]
|
||||
},
|
||||
"quick_creation": {
|
||||
"name": "快速创建模式",
|
||||
"description": "简化版本,跳过部分检查",
|
||||
"tasks": [
|
||||
{
|
||||
"id": "init_workspace",
|
||||
"name": "初始化工作空间",
|
||||
"description": "验证和创建目录结构",
|
||||
"agent_type": "lore_bible_manager",
|
||||
"inputs": ["workspace"],
|
||||
"outputs": ["directory_status"]
|
||||
},
|
||||
{
|
||||
"id": "generate_and_save",
|
||||
"name": "生成并保存",
|
||||
"description": "生成档案并直接保存到Characters目录",
|
||||
"agent_type": "profile_generator",
|
||||
"inputs": ["character_data", "template_type", "workspace"],
|
||||
"outputs": ["final_file_path"],
|
||||
"depends_on": ["init_workspace"]
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"agents": {
|
||||
"lore_bible_manager": {
|
||||
"module": "scripts.lore_bible_manager",
|
||||
"class": "LoreBibleManager"
|
||||
},
|
||||
"conflict_detector": {
|
||||
"module": "scripts.conflict_detector",
|
||||
"class": "ConflictDetector"
|
||||
},
|
||||
"profile_session": {
|
||||
"module": "scripts.profile_session",
|
||||
"class": "ProfileSession"
|
||||
},
|
||||
"profile_generator": {
|
||||
"module": "scripts.generate_profile",
|
||||
"class": "CharacterProfileGenerator"
|
||||
}
|
||||
},
|
||||
"metadata": {
|
||||
"version": "1.0",
|
||||
"created": "2026-01-26",
|
||||
"description": "子代理任务工作流定义"
|
||||
}
|
||||
}
|
||||
255
skills/character-profile-cn/references/antagonist.md
Normal file
255
skills/character-profile-cn/references/antagonist.md
Normal file
@ -0,0 +1,255 @@
|
||||
# 反派塑造指南
|
||||
|
||||
## 反派的核心原则
|
||||
|
||||
### 1. 合理性原则
|
||||
- 反派的行为应有合理动机
|
||||
- 目标应在其世界观内合理
|
||||
- 手段应与其能力和资源匹配
|
||||
|
||||
### 2. 威胁性原则
|
||||
- 对主角构成真实威胁
|
||||
- 有能力实现其目标
|
||||
- 能造成实质性后果
|
||||
|
||||
### 3. 深度原则
|
||||
- 不应是纯粹的邪恶象征
|
||||
- 应有可理解的动机
|
||||
- 最好有某种程度的共情点
|
||||
|
||||
## 反派类型分类
|
||||
|
||||
### 1. 理念型反派
|
||||
```
|
||||
特征:
|
||||
- 坚持某种理念或理想
|
||||
- 认为自己的行为是必要的
|
||||
- 可能曾是正面角色
|
||||
- 理念本身可能有合理性
|
||||
|
||||
例子:
|
||||
- 为"更大利益"牺牲个体
|
||||
- 推行极端的社会改革
|
||||
- 维护某种传统或秩序
|
||||
|
||||
塑造要点:
|
||||
- 理念的逻辑性
|
||||
- 从合理到极端的过程
|
||||
- 与主角理念的对比
|
||||
```
|
||||
|
||||
### 2. 创伤型反派
|
||||
```
|
||||
特征:
|
||||
- 行为源于过去的创伤
|
||||
- 动机是复仇或补偿
|
||||
- 心理状态不稳定
|
||||
- 有可同情的背景
|
||||
|
||||
例子:
|
||||
- 家人受害后的复仇者
|
||||
- 被背叛后的报复者
|
||||
- 心理创伤导致的行为扭曲
|
||||
|
||||
塑造要点:
|
||||
- 创伤的真实性
|
||||
- 从受害者到加害者的转变
|
||||
- 心理状态的描绘
|
||||
```
|
||||
|
||||
### 3. 野心型反派
|
||||
```
|
||||
特征:
|
||||
- 追求权力、财富、地位
|
||||
- 明确的目标导向
|
||||
- 理性的算计者
|
||||
- 道德观念淡漠
|
||||
|
||||
例子:
|
||||
- 政治野心家
|
||||
- 商业掠夺者
|
||||
- 权力追求者
|
||||
|
||||
塑造要点:
|
||||
- 野心的根源
|
||||
- 手段的合理性
|
||||
- 代价的计算
|
||||
```
|
||||
|
||||
### 4. 混沌型反派
|
||||
```
|
||||
特征:
|
||||
- 追求混乱或破坏本身
|
||||
- 无固定目标
|
||||
- 享受过程的愉悦
|
||||
- 心理异常状态
|
||||
|
||||
例子:
|
||||
- 纯粹的破坏者
|
||||
- 享受混乱的小丑型
|
||||
- 心理变态者
|
||||
|
||||
塑造要点:
|
||||
- 避免单纯的精神病标签
|
||||
- 混乱的内在逻辑
|
||||
- 对秩序的反抗本质
|
||||
```
|
||||
|
||||
## 反派档案特殊字段
|
||||
|
||||
### 核心理念层
|
||||
```markdown
|
||||
## 核心理念
|
||||
- **世界观**:如何看待世界和人性
|
||||
- **核心信念**:坚信不疑的原则
|
||||
- **正义观**:个人的正义标准
|
||||
- **变革愿景**:希望创造的新秩序
|
||||
```
|
||||
|
||||
### 动机发展史
|
||||
```markdown
|
||||
## 动机发展
|
||||
- **初始状态**:成为反派前的状态
|
||||
- **转折事件**:改变世界观的关键
|
||||
- **理念形成**:核心理念的确立
|
||||
- **行动决定**:开始行动的时点
|
||||
```
|
||||
|
||||
### 与主角的镜像关系
|
||||
```markdown
|
||||
## 镜像对比
|
||||
- **相似点**:与主角的共同之处
|
||||
- **分歧点**:关键的选择分歧
|
||||
- **对立逻辑**:为何成为对立面
|
||||
- **潜在转化**:可能改变的可能性
|
||||
```
|
||||
|
||||
## 反派能力与资源
|
||||
|
||||
### 能力设计原则
|
||||
1. **与目标匹配**:能力应服务于其目标
|
||||
2. **与理念匹配**:能力体现其世界观
|
||||
3. **与威胁匹配**:足够对主角构成挑战
|
||||
4. **与弱点匹配**:能力应有相应的弱点
|
||||
|
||||
### 资源网络
|
||||
```markdown
|
||||
## 资源网络
|
||||
- **核心团队**:直接追随者
|
||||
- **盟友势力**:利益共同体
|
||||
- **影响范围**:控制或影响的领域
|
||||
- **弱点环节**:依赖的关键点
|
||||
```
|
||||
|
||||
## 反派与主角的关系动态
|
||||
|
||||
### 对立层次
|
||||
1. **目标对立**:追求相互排斥的目标
|
||||
2. **理念对立**:持有相反的世界观
|
||||
3. **方法对立**:使用不同的手段
|
||||
4. **存在对立**:本质上的不兼容
|
||||
|
||||
### 互动模式
|
||||
- **直接对抗**:正面冲突
|
||||
- **间接较量**:通过代理或策略
|
||||
- **心理博弈**:心理层面的对抗
|
||||
- **理念辩论**:价值观的争论
|
||||
|
||||
## 反派发展弧线
|
||||
|
||||
### 可能的弧线类型
|
||||
1. **坚持到底**:始终坚持理念,最终失败
|
||||
2. **理念动摇**:开始怀疑自己的道路
|
||||
3. **转化救赎**:转变立场或获得救赎
|
||||
4. **悲剧结局**:意识到错误但为时已晚
|
||||
|
||||
### 结局设计考虑
|
||||
- **理念的考验**:核心理念是否经得起考验
|
||||
- **选择的后果**:为其选择承担后果
|
||||
- **影响的延续**:即使失败,影响是否延续
|
||||
- **主题的体现**:结局如何体现故事主题
|
||||
|
||||
## 反派塑造检查表
|
||||
|
||||
### 动机合理性检查
|
||||
- [ ] 动机有可理解的根源
|
||||
- [ ] 目标在其世界观内合理
|
||||
- [ ] 手段与目标匹配
|
||||
- [ ] 有明确的得失计算
|
||||
|
||||
### 威胁性检查
|
||||
- [ ] 对主角构成真实威胁
|
||||
- [ ] 有能力实现部分目标
|
||||
- [ ] 能造成实质性伤害
|
||||
- [ ] 给主角带来成长压力
|
||||
|
||||
### 深度检查
|
||||
- [ ] 不是单纯的邪恶象征
|
||||
- [ ] 有可共情的元素
|
||||
- [ ] 理念有一定的逻辑性
|
||||
- [ ] 与主角形成有意义对比
|
||||
|
||||
## 常见问题与解决方案
|
||||
|
||||
### 问题:反派动机薄弱
|
||||
**解决方案**:
|
||||
1. 连接个人经历
|
||||
2. 强化理念基础
|
||||
3. 增加情感投入
|
||||
4. 设置合理目标
|
||||
|
||||
### 问题:反派能力过强
|
||||
**解决方案**:
|
||||
1. 增加内在限制
|
||||
2. 设置资源依赖
|
||||
3. 创造性格弱点
|
||||
4. 安排能力代价
|
||||
|
||||
### 问题:反派过于单薄
|
||||
**解决方案**:
|
||||
1. 添加矛盾特质
|
||||
2. 设置人性时刻
|
||||
3. 创造复杂关系
|
||||
4. 安排理念冲突
|
||||
|
||||
## 优秀反派案例要点
|
||||
|
||||
### 案例1:理念型反派
|
||||
- **理念**:清晰且有吸引力的世界观
|
||||
- **转变**:从合理理念到极端实践的渐变
|
||||
- **对比**:与主角理念形成思想交锋
|
||||
- **结局**:理念被证伪但人物保持尊严
|
||||
|
||||
### 案例2:创伤型反派
|
||||
- **创伤**:真实且有影响力的过去
|
||||
- **扭曲**:合理情感的不合理表达
|
||||
- **共情**:读者能理解其痛苦
|
||||
- **悲剧**:可避免但不可避免的结局
|
||||
|
||||
### 案例3:镜像反派
|
||||
- **相似**:与主角相似的起点
|
||||
- **分歧**:关键时刻的不同选择
|
||||
- **对比**:展示道路选择的后果
|
||||
- **警示**:主角可能成为的样子
|
||||
|
||||
## 创作建议
|
||||
|
||||
1. **从理解开始**:先理解反派的视角
|
||||
2. **寻找共情点**:即使不赞同,也要理解
|
||||
3. **注重理念交锋**:真正的对立是价值观对立
|
||||
4. **避免简单化**:复杂性增加真实感
|
||||
5. **服务主题**:反派应体现故事的核心主题
|
||||
|
||||
## 反派与故事主题
|
||||
|
||||
### 主题体现方式
|
||||
- **直接对抗**:反派代表主题的反面
|
||||
- **极端体现**:反派体现主题的极端版本
|
||||
- **扭曲反映**:反派是对主题的扭曲理解
|
||||
- **必要挑战**:反派是主题必须面对的挑战
|
||||
|
||||
### 主题深化技巧
|
||||
1. **让反派有道理**:其论点应有某种合理性
|
||||
2. **让选择困难**:主角的选择不应显而易见
|
||||
3. **让代价真实**:对抗反派应有真实代价
|
||||
4. **让反思可能**:反派促使主角和读者反思
|
||||
196
skills/character-profile-cn/references/protagonist.md
Normal file
196
skills/character-profile-cn/references/protagonist.md
Normal file
@ -0,0 +1,196 @@
|
||||
# 主角塑造详细指南
|
||||
|
||||
## 主角的核心特征
|
||||
|
||||
### 1. 深度与复杂性
|
||||
- **多层次动机**:表面目标 vs 深层需求
|
||||
- **内在矛盾**:价值观冲突、情感纠葛
|
||||
- **成长潜力**:明显的缺陷和改进空间
|
||||
|
||||
### 2. 读者连接点
|
||||
- **可识别性**:读者能在某种程度上认同
|
||||
- **情感投入**:激发读者的关心和共鸣
|
||||
- **成长期待**:读者希望看到角色发展
|
||||
|
||||
## 主角档案的特殊字段
|
||||
|
||||
### 核心身份层
|
||||
```markdown
|
||||
## 核心身份
|
||||
- **本质自我**:角色最根本的存在状态
|
||||
- **社会面具**:对外展示的形象
|
||||
- **理想自我**:渴望成为的样子
|
||||
- **恐惧自我**:害怕变成的样子
|
||||
```
|
||||
|
||||
### 动机层次
|
||||
```markdown
|
||||
## 动机层次
|
||||
- **表层目标**:故事中明确追求的目标
|
||||
- **情感需求**:内心深处渴望的情感满足
|
||||
- **存在需求**:关于身份、意义的核心需求
|
||||
- **未意识需求**:角色自己尚未察觉的需要
|
||||
```
|
||||
|
||||
### 成长弧线
|
||||
```markdown
|
||||
## 成长弧线
|
||||
- **起始状态**:故事开始时的状态
|
||||
- **诱发事件**:促使改变的关键事件
|
||||
- **抗拒改变**:对变化的抵抗和挣扎
|
||||
- **突破时刻**:决定改变的转折点
|
||||
- **新平衡态**:故事结束时的成长结果
|
||||
```
|
||||
|
||||
## 主角类型参考
|
||||
|
||||
### 1. 英雄型主角
|
||||
```
|
||||
特征:
|
||||
- 主动追求目标
|
||||
- 道德感较强
|
||||
- 承担社会责任
|
||||
- 经历考验成长
|
||||
|
||||
关注点:
|
||||
- 考验的合理性
|
||||
- 成长的代价
|
||||
- 道德困境
|
||||
```
|
||||
|
||||
### 2. 反英雄型主角
|
||||
```
|
||||
特征:
|
||||
- 非传统道德观
|
||||
- 有缺陷但有能力
|
||||
- 灰色地带行动
|
||||
- 复杂动机
|
||||
|
||||
关注点:
|
||||
- 魅力的来源
|
||||
- 读者的容忍度
|
||||
- 救赎的可能性
|
||||
```
|
||||
|
||||
### 3. 成长型主角
|
||||
```
|
||||
特征:
|
||||
- 初始能力不足
|
||||
- 通过学习成长
|
||||
- 心态转变
|
||||
- 赢得认可
|
||||
|
||||
关注点:
|
||||
- 成长的节奏
|
||||
- 导师的作用
|
||||
- 挫败的意义
|
||||
```
|
||||
|
||||
### 4. 探索型主角
|
||||
```
|
||||
特征:
|
||||
- 寻求真相/知识
|
||||
- 挑战现有秩序
|
||||
- 自我发现之旅
|
||||
- 改变世界观
|
||||
|
||||
关注点:
|
||||
- 发现的阶梯
|
||||
- 认知的转变
|
||||
- 代价与收获
|
||||
```
|
||||
|
||||
## 主角关系网络
|
||||
|
||||
### 核心关系类型
|
||||
1. **导师关系**:指导成长的角色
|
||||
2. **盟友关系**:并肩作战的伙伴
|
||||
3. **爱情关系**:情感发展的对象
|
||||
4. **敌对关系**:主要冲突来源
|
||||
5. **镜像关系**:反映主角另一面的角色
|
||||
|
||||
### 关系发展模式
|
||||
```
|
||||
初始阶段 → 建立联系 → 深化关系 → 考验关系 → 关系转变
|
||||
```
|
||||
|
||||
## 主角冲突设计
|
||||
|
||||
### 内在冲突
|
||||
- **价值观冲突**:不同信念之间的抉择
|
||||
- **身份冲突**:不同社会角色间的矛盾
|
||||
- **欲望冲突**:相互矛盾的愿望
|
||||
- **恐惧冲突**:逃避vs面对的心理斗争
|
||||
|
||||
### 外在冲突
|
||||
- **目标障碍**:实现目标的直接阻碍
|
||||
- **关系冲突**:人际关系的矛盾
|
||||
- **社会冲突**:与体制、规范的对抗
|
||||
- **生存冲突**:基本的生存威胁
|
||||
|
||||
## 主角发展检查表
|
||||
|
||||
### 档案完整性检查
|
||||
- [ ] 核心动机清晰且有层次
|
||||
- [ ] 性格缺陷明确且影响故事
|
||||
- [ ] 成长路径有清晰的阶段
|
||||
- [ ] 关键关系有深度发展
|
||||
- [ ] 内在冲突与外在冲突交织
|
||||
|
||||
### 故事功能检查
|
||||
- [ ] 推动剧情发展的主动性
|
||||
- [ ] 关键决策的合理性
|
||||
- [ ] 情感变化的可信度
|
||||
- [ ] 成长转变的明显性
|
||||
- [ ] 结局状态的满意度
|
||||
|
||||
## 常见问题与解决方案
|
||||
|
||||
### 问题:主角过于完美
|
||||
**解决方案**:
|
||||
1. 添加有代价的优点
|
||||
2. 设置情境性弱点
|
||||
3. 创造道德困境
|
||||
4. 安排能力限制
|
||||
|
||||
### 问题:主角缺乏主动性
|
||||
**解决方案**:
|
||||
1. 强化内在动机
|
||||
2. 设置个人化目标
|
||||
3. 增加情感投入
|
||||
4. 减少被动应对
|
||||
|
||||
### 问题:成长弧线不清晰
|
||||
**解决方案**:
|
||||
1. 明确起始缺陷
|
||||
2. 设计针对性考验
|
||||
3. 安排导师指导
|
||||
4. 展示渐进改变
|
||||
|
||||
## 优秀主角案例要点
|
||||
|
||||
### 案例1:成长型英雄
|
||||
- **起始**:天真、能力不足
|
||||
- **考验**:责任与能力的差距
|
||||
- **成长**:技能和心态的双重提升
|
||||
- **成就**:赢得尊重和自我认同
|
||||
|
||||
### 案例2:堕落与救赎
|
||||
- **起始**:有原则但脆弱
|
||||
- **堕落**:妥协导致的道德滑坡
|
||||
- **挣扎**:良心与现实的冲突
|
||||
- **救赎**:牺牲带来的回归
|
||||
|
||||
### 案例3:认知转变
|
||||
- **起始**:坚信某种世界观
|
||||
- **冲击**:遭遇颠覆性事实
|
||||
- **抗拒**:否认和寻找解释
|
||||
- **接受**:整合新认知,改变行动
|
||||
|
||||
## 创作建议
|
||||
|
||||
1. **从内心开始**:先确定主角的核心情感需求
|
||||
2. **向外扩展**:根据内心需求设计外在表现
|
||||
3. **预留空间**:为主角的意外反应留余地
|
||||
4. **保持真实**:即使在不现实的情境中,反应要真实
|
||||
5. **重视转变**:最大的魅力来自改变的过程
|
||||
363
skills/character-profile-cn/references/relationships.md
Normal file
363
skills/character-profile-cn/references/relationships.md
Normal file
@ -0,0 +1,363 @@
|
||||
# 角色关系网络设计
|
||||
|
||||
## 关系设计基本原则
|
||||
|
||||
### 1. 功能性原则
|
||||
- 关系应服务剧情发展
|
||||
- 关系应推动角色成长
|
||||
- 关系应体现故事主题
|
||||
- 关系应有明确目的
|
||||
|
||||
### 2. 真实性原则
|
||||
- 关系发展应有合理过程
|
||||
- 关系变化应有充分动机
|
||||
- 关系互动应符合角色性格
|
||||
- 关系深度应有相应基础
|
||||
|
||||
### 3. 动态性原则
|
||||
- 关系应有发展变化
|
||||
- 关系应有考验时刻
|
||||
- 关系应有转折点
|
||||
- 关系应有最终状态
|
||||
|
||||
## 关系类型体系
|
||||
|
||||
### 按情感性质分类
|
||||
|
||||
#### 1. 亲情关系
|
||||
```
|
||||
核心特征:
|
||||
- 血缘或拟血缘连接
|
||||
- 长期共同生活基础
|
||||
- 深厚的情感羁绊
|
||||
- 复杂的责任义务
|
||||
|
||||
常见模式:
|
||||
- 保护与被保护
|
||||
- 期望与失望
|
||||
- 代际冲突
|
||||
- 牺牲与回报
|
||||
|
||||
塑造要点:
|
||||
- 避免刻板印象
|
||||
- 体现具体家庭的独特性
|
||||
- 平衡爱与冲突
|
||||
- 展现发展变化
|
||||
```
|
||||
|
||||
#### 2. 友情关系
|
||||
```
|
||||
核心特征:
|
||||
- 自愿选择的连接
|
||||
- 相互认可的基础
|
||||
- 共同经历的支持
|
||||
- 平等互惠的性质
|
||||
|
||||
常见模式:
|
||||
- 互补型友谊
|
||||
- 竞争型友谊
|
||||
- 救赎型友谊
|
||||
- 成长型友谊
|
||||
|
||||
塑造要点:
|
||||
- 友谊建立的自然性
|
||||
- 共同价值的体现
|
||||
- 考验时刻的真实性
|
||||
- 发展变化的合理性
|
||||
```
|
||||
|
||||
#### 3. 爱情关系
|
||||
```
|
||||
核心特征:
|
||||
- 强烈的吸引连接
|
||||
- 情感和欲望的交织
|
||||
- 亲密和承诺的维度
|
||||
- 个人成长的催化剂
|
||||
|
||||
常见模式:
|
||||
- 互补吸引型
|
||||
- 相似共鸣型
|
||||
- 对立冲突型
|
||||
- 救赎治愈型
|
||||
|
||||
塑造要点:
|
||||
- 避免一见钟情套路
|
||||
- 展现深层的连接点
|
||||
- 平衡理想与现实
|
||||
- 体现双方的成长
|
||||
```
|
||||
|
||||
#### 4. 敌对关系
|
||||
```
|
||||
核心特征:
|
||||
- 目标或利益的冲突
|
||||
- 价值观的对立
|
||||
- 情感的对抗
|
||||
- 能力的较量
|
||||
|
||||
常见模式:
|
||||
- 理念对立型
|
||||
- 利益冲突型
|
||||
- 情感仇恨型
|
||||
- 竞争较量型
|
||||
|
||||
塑造要点:
|
||||
- 对立的深层原因
|
||||
- 对抗的规则限制
|
||||
- 复杂的情感交织
|
||||
- 可能的转化空间
|
||||
```
|
||||
|
||||
### 按功能作用分类
|
||||
|
||||
#### 1. 成长催化关系
|
||||
- 推动角色关键成长
|
||||
- 提供必要的挑战
|
||||
- 促使认知转变
|
||||
- 激发潜能突破
|
||||
|
||||
#### 2. 情节推动关系
|
||||
- 直接推动剧情发展
|
||||
- 制造关键冲突
|
||||
- 提供必要信息
|
||||
- 改变局势平衡
|
||||
|
||||
#### 3. 主题体现关系
|
||||
- 体现故事核心主题
|
||||
- 展示价值观冲突
|
||||
- 进行理念辩论
|
||||
- 深化主题探讨
|
||||
|
||||
#### 4. 情感支撑关系
|
||||
- 提供情感安全感
|
||||
- 给予无条件支持
|
||||
- 创造归属感受
|
||||
- 平衡故事情感基调
|
||||
|
||||
## 关系发展阶段模型
|
||||
|
||||
### 阶段一:建立期
|
||||
```
|
||||
关键事件:
|
||||
- 初次相遇
|
||||
- 初步印象形成
|
||||
- 建立连接契机
|
||||
- 决定继续互动
|
||||
|
||||
塑造要点:
|
||||
- 相遇的自然性
|
||||
- 初印象的独特性
|
||||
- 连接点的显著性
|
||||
- 继续互动的合理性
|
||||
```
|
||||
|
||||
### 阶段二:发展期
|
||||
```
|
||||
关键事件:
|
||||
- 共同经历考验
|
||||
- 相互了解加深
|
||||
- 情感连接建立
|
||||
- 关系模式形成
|
||||
|
||||
塑造要点:
|
||||
- 共同经历的意义
|
||||
- 了解过程的渐进性
|
||||
- 情感建立的真实性
|
||||
- 模式形成的自然性
|
||||
```
|
||||
|
||||
### 阶段三:考验期
|
||||
```
|
||||
关键事件:
|
||||
- 面临重大冲突
|
||||
- 价值观碰撞
|
||||
- 利益抉择时刻
|
||||
- 信任危机考验
|
||||
|
||||
塑造要点:
|
||||
- 冲突的不可避免性
|
||||
- 选择的困难程度
|
||||
- 代价的真实性
|
||||
- 考验结果的影响
|
||||
```
|
||||
|
||||
### 阶段四:稳定期或转折期
|
||||
```
|
||||
可能走向:
|
||||
- 深化巩固:关系更加牢固
|
||||
- 转变性质:关系类型改变
|
||||
- 疏远淡化:关系逐渐冷却
|
||||
- 彻底断裂:关系完全结束
|
||||
|
||||
塑造要点:
|
||||
- 变化的内在逻辑
|
||||
- 新状态的稳定性
|
||||
- 对双方的影响
|
||||
- 后续发展的可能性
|
||||
```
|
||||
|
||||
## 关系矩阵设计工具
|
||||
|
||||
### 关系强度矩阵
|
||||
```
|
||||
设计方法:
|
||||
1. 列出所有主要角色
|
||||
2. 评估两两关系强度(1-10分)
|
||||
3. 标注关系性质(+正面/-负面)
|
||||
4. 分析网络密度和平衡
|
||||
|
||||
分析要点:
|
||||
- 主角的关系集中度
|
||||
- 负面关系的分布
|
||||
- 孤立角色的存在
|
||||
- 关系网络的完整性
|
||||
```
|
||||
|
||||
### 关系动态跟踪表
|
||||
```markdown
|
||||
## 关系动态跟踪
|
||||
|
||||
角色A - 角色B 关系发展
|
||||
|
||||
### 故事开始前
|
||||
- 初始状态:
|
||||
- 历史背景:
|
||||
- 未解问题:
|
||||
|
||||
### 第一阶段(开头-25%)
|
||||
- 关键互动:
|
||||
- 关系变化:
|
||||
- 情感状态:
|
||||
|
||||
### 第二阶段(25%-50%)
|
||||
- 关键互动:
|
||||
- 关系变化:
|
||||
- 情感状态:
|
||||
|
||||
### 第三阶段(50%-75%)
|
||||
- 关键互动:
|
||||
- 关系变化:
|
||||
- 情感状态:
|
||||
|
||||
### 第四阶段(75%-结尾)
|
||||
- 关键互动:
|
||||
- 关系变化:
|
||||
- 最终状态:
|
||||
```
|
||||
|
||||
## 复杂关系设计技巧
|
||||
|
||||
### 1. 多重关系交织
|
||||
- 同一对角色有多种关系性质
|
||||
- 关系性质随时间变化
|
||||
- 公开关系与真实关系的差异
|
||||
- 关系中的角色扮演成分
|
||||
|
||||
### 2. 关系网络效应
|
||||
- 关系变化引发连锁反应
|
||||
- 三角关系的张力设计
|
||||
- 群体内的关系动态
|
||||
- 秘密关系的影响扩散
|
||||
|
||||
### 3. 关系不对称性
|
||||
- 情感投入的不对等
|
||||
- 权力地位的不平衡
|
||||
- 依赖程度的不同
|
||||
- 期望值的差异
|
||||
|
||||
## 关系冲突设计
|
||||
|
||||
### 冲突类型
|
||||
1. **目标冲突**:追求相互排斥的目标
|
||||
2. **价值观冲突**:根本信念的对立
|
||||
3. **利益冲突**:具体利益的争夺
|
||||
4. **情感冲突**:情感需求的矛盾
|
||||
5. **认知冲突**:对事实理解的分歧
|
||||
|
||||
### 冲突升级路径
|
||||
```
|
||||
初始分歧 → 情绪反应 → 立场固化 → 对抗行动 → 关系危机 → 解决或破裂
|
||||
```
|
||||
|
||||
### 冲突解决方式
|
||||
- **妥协型**:双方各让一步
|
||||
- **超越型**:找到更高层次的解决
|
||||
- **胜负型**:一方战胜另一方
|
||||
- **转化型**:冲突性质发生转变
|
||||
- **悬置型**:暂时搁置未解决
|
||||
|
||||
## 关系与角色发展
|
||||
|
||||
### 关系作为成长催化剂
|
||||
- 通过关系发现自我
|
||||
- 在关系中克服弱点
|
||||
- 因关系改变价值观
|
||||
- 为关系承担责任
|
||||
|
||||
### 关系发展的双向性
|
||||
- 双方都应有所改变
|
||||
- 改变程度可以不同
|
||||
- 改变方向可能相反
|
||||
- 改变应有相互影响
|
||||
|
||||
## 关系设计检查表
|
||||
|
||||
### 功能性检查
|
||||
- [ ] 关系是否服务剧情需要
|
||||
- [ ] 关系是否推动角色发展
|
||||
- [ ] 关系是否体现故事主题
|
||||
- [ ] 关系是否有多重价值
|
||||
|
||||
### 真实性检查
|
||||
- [ ] 关系建立过程是否自然
|
||||
- [ ] 关系发展节奏是否合理
|
||||
- [ ] 关系变化动机是否充分
|
||||
- [ ] 关系互动是否符合性格
|
||||
|
||||
### 动态性检查
|
||||
- [ ] 关系是否有明显发展
|
||||
- [ ] 关系是否有考验时刻
|
||||
- [ ] 关系是否有转折变化
|
||||
- [ ] 关系最终状态是否明确
|
||||
|
||||
## 特殊关系类型处理
|
||||
|
||||
### 跨阶层关系
|
||||
- 处理权力不平衡
|
||||
- 展现相互影响
|
||||
- 避免浪漫化压迫
|
||||
- 体现结构限制
|
||||
|
||||
### 跨文化关系
|
||||
- 尊重文化差异
|
||||
- 展现误解和学习
|
||||
- 避免刻板印象
|
||||
- 体现交流价值
|
||||
|
||||
### 年龄差关系
|
||||
- 处理代际差异
|
||||
- 展现相互学习
|
||||
- 平衡尊重与平等
|
||||
- 体现时间视角
|
||||
|
||||
## 关系与故事结构
|
||||
|
||||
### 关系作为结构线索
|
||||
- 关系发展对应情节阶段
|
||||
- 关系转折对应情节转折
|
||||
- 关系危机对应故事高潮
|
||||
- 关系结局对应故事结局
|
||||
|
||||
### 关系网络作为世界构建
|
||||
- 通过关系展现社会结构
|
||||
- 通过关系体现文化规范
|
||||
- 通过关系揭示权力动态
|
||||
- 通过关系构建可信世界
|
||||
|
||||
## 创作建议
|
||||
|
||||
1. **从核心关系开始**:先设计最重要的几对关系
|
||||
2. **向外扩展网络**:根据核心关系设计相关关系
|
||||
3. **注重关系质量**:深度比数量更重要
|
||||
4. **保持关系动态**:让关系有生命力和变化
|
||||
5. **服务故事整体**:所有关系最终服务于故事主题和情感效果
|
||||
324
skills/character-profile-cn/references/supporting.md
Normal file
324
skills/character-profile-cn/references/supporting.md
Normal file
@ -0,0 +1,324 @@
|
||||
# 配角设计指南
|
||||
|
||||
## 配角的双重属性
|
||||
|
||||
### 1. 功能性属性
|
||||
- 推动剧情发展的作用
|
||||
- 服务主角成长的功能
|
||||
- 丰富故事世界的作用
|
||||
- 提供信息或资源的功能
|
||||
|
||||
### 2. 独立性属性
|
||||
- 有自己的动机和目标
|
||||
- 有自己的生活和背景
|
||||
- 有自己的性格和声音
|
||||
- 有自己的发展和变化
|
||||
|
||||
## 配角分类体系
|
||||
|
||||
### 按功能分类
|
||||
|
||||
#### 1. 导师型配角
|
||||
```
|
||||
核心功能:
|
||||
- 提供指导和建议
|
||||
- 传授技能或知识
|
||||
- 给予精神支持
|
||||
- 推动主角成长
|
||||
|
||||
特征:
|
||||
- 通常比主角更有经验
|
||||
- 有独特的智慧或视角
|
||||
- 可能有自己的教学理念
|
||||
- 与主角有特殊情感联系
|
||||
|
||||
塑造要点:
|
||||
- 避免全知全能
|
||||
- 教学应有局限性
|
||||
- 应有自己的动机
|
||||
- 可能也需要成长
|
||||
```
|
||||
|
||||
#### 2. 盟友型配角
|
||||
```
|
||||
核心功能:
|
||||
- 提供实际帮助
|
||||
- 并肩作战
|
||||
- 情感支持
|
||||
- 补充主角能力
|
||||
|
||||
特征:
|
||||
- 能力与主角互补
|
||||
- 忠诚但有独立性
|
||||
- 有自己的专长领域
|
||||
- 可能发展为深度关系
|
||||
|
||||
塑造要点:
|
||||
- 避免单纯的工具人
|
||||
- 应有自己的判断
|
||||
- 关系应有发展变化
|
||||
- 可能产生冲突
|
||||
```
|
||||
|
||||
#### 3. 挑战者型配角
|
||||
```
|
||||
核心功能:
|
||||
- 提供竞争或挑战
|
||||
- 激发主角潜力
|
||||
- 制造冲突张力
|
||||
- 推动技术进步
|
||||
|
||||
特征:
|
||||
- 能力与主角相当或更强
|
||||
- 可能有复杂关系
|
||||
- 推动主角超越自我
|
||||
- 最终可能成为盟友
|
||||
|
||||
塑造要点:
|
||||
- 挑战的合理性
|
||||
- 成长的催化剂作用
|
||||
- 关系的演变可能
|
||||
- 独立的目标追求
|
||||
```
|
||||
|
||||
#### 4. 镜像型配角
|
||||
```
|
||||
核心功能:
|
||||
- 反映主角的另一面
|
||||
- 展示不同选择的结果
|
||||
- 提供对比视角
|
||||
- 深化主题探讨
|
||||
|
||||
特征:
|
||||
- 与主角有相似起点
|
||||
- 做出了不同选择
|
||||
- 展示另一种可能性
|
||||
- 促使主角反思
|
||||
|
||||
塑造要点:
|
||||
- 对比的清晰性
|
||||
- 选择的合理性
|
||||
- 命运的差异性
|
||||
- 主题的相关性
|
||||
```
|
||||
|
||||
### 按重要性分级
|
||||
|
||||
#### 一级配角(重要配角)
|
||||
- 有独立的故事线
|
||||
- 对主线有重要影响
|
||||
- 与主角有深度互动
|
||||
- 可能有显著发展
|
||||
|
||||
#### 二级配角(功能性配角)
|
||||
- 主要发挥特定功能
|
||||
- 与主角互动有限
|
||||
- 背景相对简单
|
||||
- 发展空间较小
|
||||
|
||||
#### 三级配角(背景配角)
|
||||
- 丰富故事世界
|
||||
- 提供氛围和细节
|
||||
- 功能单一明确
|
||||
- 基本没有发展
|
||||
|
||||
## 配角档案模板
|
||||
|
||||
### 重要配角模板
|
||||
```markdown
|
||||
# [角色姓名] - 配角档案
|
||||
|
||||
## 基本定位
|
||||
- **功能类型**:
|
||||
- **重要性级别**:
|
||||
- **与主角关系**:
|
||||
- **核心功能**:
|
||||
|
||||
## 独立身份
|
||||
- **个人目标**:
|
||||
- **生活背景**:
|
||||
- **价值观**:
|
||||
- **秘密或矛盾**:
|
||||
|
||||
## 功能性设计
|
||||
- **推动剧情的方式**:
|
||||
- **服务主角的方式**:
|
||||
- **独特价值**:
|
||||
- **退出时机**:
|
||||
|
||||
## 关系发展
|
||||
- **初始关系**:
|
||||
- **关系转折点**:
|
||||
- **最终关系**:
|
||||
- **关系影响**:
|
||||
|
||||
## 发展可能性
|
||||
- **潜在成长**:
|
||||
- **故事线扩展**:
|
||||
- **意外发展**:
|
||||
- **结局设想**:
|
||||
```
|
||||
|
||||
### 功能性配角模板
|
||||
```markdown
|
||||
# [角色姓名] - 功能角色档案
|
||||
|
||||
## 功能定义
|
||||
- **核心作用**:
|
||||
- **出现场景**:
|
||||
- **必要特征**:
|
||||
- **功能限制**:
|
||||
|
||||
## 基本设定
|
||||
- **身份背景**:
|
||||
- **性格特点**:
|
||||
- **能力专长**:
|
||||
- **存在理由**:
|
||||
|
||||
## 互动设计
|
||||
- **与主角互动模式**:
|
||||
- **台词风格**:
|
||||
- **行为模式**:
|
||||
- **退出方式**:
|
||||
|
||||
## 注意事项
|
||||
- **避免过度发展**:
|
||||
- **保持功能性**:
|
||||
- **控制出场频率**:
|
||||
- **服务核心需求**:
|
||||
```
|
||||
|
||||
## 配角与主角的关系设计
|
||||
|
||||
### 关系建立逻辑
|
||||
1. **相遇合理性**:如何自然地相遇
|
||||
2. **连接点**:最初建立联系的基础
|
||||
3. **关系深化**:如何从相识到相知
|
||||
4. **关系考验**:面临挑战时的反应
|
||||
5. **关系定型**:稳定后的关系状态
|
||||
|
||||
### 关系动态类型
|
||||
- **互补关系**:能力或性格的互补
|
||||
- **镜像关系**:相似但不同的对比
|
||||
- **成长关系**:相互促进成长
|
||||
- **冲突关系**:有建设性的冲突
|
||||
- **转变关系**:关系性质发生变化
|
||||
|
||||
## 配角独立性设计
|
||||
|
||||
### 个人生活圈
|
||||
- **家庭关系**:配角的家庭背景
|
||||
- **社交网络**:除了主角外的朋友
|
||||
- **日常活动**:主角不在时的生活
|
||||
- **个人兴趣**:独立的爱好和追求
|
||||
|
||||
### 个人时间线
|
||||
- **遇见主角前**:之前的生活状态
|
||||
- **与主角交集期**:共同经历的时期
|
||||
- **分离期**:暂时分开时的状态
|
||||
- **最终状态**:故事结束时的状态
|
||||
|
||||
## 配角功能性检查
|
||||
|
||||
### 功能有效性检查
|
||||
- [ ] 功能明确且必要
|
||||
- [ ] 功能发挥的时机恰当
|
||||
- [ ] 功能实现的方式自然
|
||||
- [ ] 功能完成后合理退出
|
||||
|
||||
### 功能平衡检查
|
||||
- [ ] 不过度依赖单一配角
|
||||
- [ ] 功能分配合理分布
|
||||
- [ ] 配角负担不过重
|
||||
- [ ] 主角保持主动性
|
||||
|
||||
## 常见问题与解决方案
|
||||
|
||||
### 问题:配角抢戏
|
||||
**解决方案**:
|
||||
1. 明确功能边界
|
||||
2. 控制出场时间
|
||||
3. 聚焦主角视角
|
||||
4. 保持配角服务性
|
||||
|
||||
### 问题:配角工具化
|
||||
**解决方案**:
|
||||
1. 添加个人动机
|
||||
2. 给予独立时刻
|
||||
3. 创造内心矛盾
|
||||
4. 安排个人选择
|
||||
|
||||
### 问题:配角功能重复
|
||||
**解决方案**:
|
||||
1. 合并相似角色
|
||||
2. 分化功能侧重
|
||||
3. 创造个性差异
|
||||
4. 调整出场顺序
|
||||
|
||||
## 优秀配角案例要点
|
||||
|
||||
### 案例1:导师型配角
|
||||
- **功能**:推动主角关键成长
|
||||
- **独立**:有自己的过去和遗憾
|
||||
- **关系**:从师徒到朋友到平等
|
||||
- **结局**:完成使命后合理退场
|
||||
|
||||
### 案例2:盟友型配角
|
||||
- **功能**:补充主角能力不足
|
||||
- **独立**:有自己的目标和挣扎
|
||||
- **关系**:从合作到信任到依赖
|
||||
- **发展**:与主角共同成长变化
|
||||
|
||||
### 案例3:镜像型配角
|
||||
- **功能**:展示不同道路的结果
|
||||
- **独立**:完整的个人故事线
|
||||
- **对比**:与主角形成鲜明对照
|
||||
- **主题**:深化故事核心主题
|
||||
|
||||
## 配角创作流程建议
|
||||
|
||||
### 设计步骤
|
||||
1. **确定功能**:首先明确配角的核心作用
|
||||
2. **设计个性**:根据功能设计相应性格
|
||||
3. **添加独立**:给予适当的独立生活
|
||||
4. **建立关系**:设计与主角的关系动态
|
||||
5. **规划发展**:考虑可能的成长变化
|
||||
|
||||
### 检验标准
|
||||
1. **功能实现**:是否能有效完成预定功能
|
||||
2. **自然程度**:出现和行动是否自然
|
||||
3. **记忆点**:是否有让人印象深刻的特质
|
||||
4. **关系价值**:与主角的关系是否有意义
|
||||
|
||||
## 配角网络构建
|
||||
|
||||
### 网络设计原则
|
||||
1. **功能覆盖**:所有必要功能都有相应配角
|
||||
2. **个性区分**:每个配角有明显区分度
|
||||
3. **关系多样**:配角间也有相互关系
|
||||
4. **层次清晰**:重要性层次分明
|
||||
|
||||
### 网络检查要点
|
||||
- 是否有功能缺失或重叠
|
||||
- 是否有多元的声音和视角
|
||||
- 是否有合理的互动网络
|
||||
- 是否有动态的关系变化
|
||||
|
||||
## 特殊类型配角处理
|
||||
|
||||
### 喜剧性配角
|
||||
- **功能**:提供幽默和轻松时刻
|
||||
- **注意**:避免破坏严肃情境
|
||||
- **技巧**:幽默应源于性格而非刻意
|
||||
|
||||
### 神秘性配角
|
||||
- **功能**:制造悬念和神秘感
|
||||
- **注意**:最终应有合理解释
|
||||
- **技巧**:神秘感应服务于主题
|
||||
|
||||
### 过渡性配角
|
||||
- **功能**:连接不同情节阶段
|
||||
- **注意**:完成连接后合理退场
|
||||
- **技巧**:退场方式应有意义
|
||||
|
||||
记住:最好的配角是那些读者会好奇"他们的故事是什么"的角色,但同时明白故事的重点仍然是主角。
|
||||
401
skills/character-profile-cn/scripts/analyze_profile.py
Normal file
401
skills/character-profile-cn/scripts/analyze_profile.py
Normal file
@ -0,0 +1,401 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
人物档案分析脚本
|
||||
分析markdown格式的人物档案完整性
|
||||
"""
|
||||
|
||||
import os
|
||||
import re
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
class ProfileAnalyzer:
|
||||
"""人物档案分析器"""
|
||||
|
||||
def __init__(self):
|
||||
self.placeholder_patterns = [
|
||||
r'待填写',
|
||||
r'TODO',
|
||||
r'待补充',
|
||||
r'待完善',
|
||||
r'\[.*\]',
|
||||
r'\{.*\}',
|
||||
r'未指定',
|
||||
r'未知',
|
||||
r'待定'
|
||||
]
|
||||
|
||||
# 检测平台,Windows上使用简单符号
|
||||
self.is_windows = sys.platform.startswith('win')
|
||||
|
||||
# 符号定义
|
||||
if self.is_windows:
|
||||
self.symbols = {
|
||||
'chart': '[统计]',
|
||||
'trophy': '[评估]',
|
||||
'file': '[章节]',
|
||||
'warning': '[注意]',
|
||||
'bulb': '[建议]',
|
||||
'check': '[OK]',
|
||||
'arrow': '->',
|
||||
'cross': '[X]',
|
||||
'green_circle': '[良好]',
|
||||
'yellow_circle': '[一般]',
|
||||
'red_circle': '[需改进]',
|
||||
'bullet': '-'
|
||||
}
|
||||
else:
|
||||
self.symbols = {
|
||||
'chart': '📊',
|
||||
'trophy': '🏆',
|
||||
'file': '📑',
|
||||
'warning': '⚠️',
|
||||
'bulb': '💡',
|
||||
'check': '✓',
|
||||
'arrow': '→',
|
||||
'cross': '✗',
|
||||
'green_circle': '🟢',
|
||||
'yellow_circle': '🟡',
|
||||
'red_circle': '🔴',
|
||||
'bullet': '•'
|
||||
}
|
||||
|
||||
def analyze_markdown(self, filepath):
|
||||
"""分析markdown档案
|
||||
|
||||
Args:
|
||||
filepath: markdown文件路径
|
||||
|
||||
Returns:
|
||||
分析结果字典
|
||||
"""
|
||||
with open(filepath, 'r', encoding='utf-8') as f:
|
||||
content = f.read()
|
||||
|
||||
# 基本统计
|
||||
lines = content.split('\n')
|
||||
total_lines = len(lines)
|
||||
non_empty_lines = len([line for line in lines if line.strip()])
|
||||
|
||||
# 章节分析
|
||||
sections = self._extract_sections(content)
|
||||
|
||||
# 占位符检测
|
||||
placeholder_count = 0
|
||||
placeholder_details = []
|
||||
|
||||
for i, line in enumerate(lines, 1):
|
||||
for pattern in self.placeholder_patterns:
|
||||
if re.search(pattern, line):
|
||||
placeholder_count += 1
|
||||
placeholder_details.append({
|
||||
'line': i,
|
||||
'content': line.strip()[:50] + '...' if len(line.strip()) > 50 else line.strip()
|
||||
})
|
||||
break
|
||||
|
||||
# 完整性评分
|
||||
completeness_score = self._calculate_completeness_score(
|
||||
non_empty_lines, placeholder_count, len(sections)
|
||||
)
|
||||
|
||||
return {
|
||||
'filepath': filepath,
|
||||
'total_lines': total_lines,
|
||||
'non_empty_lines': non_empty_lines,
|
||||
'sections_count': len(sections),
|
||||
'sections': sections,
|
||||
'placeholder_count': placeholder_count,
|
||||
'placeholder_details': placeholder_details[:10], # 只显示前10个
|
||||
'completeness_score': completeness_score,
|
||||
'completeness_level': self._get_completeness_level(completeness_score)
|
||||
}
|
||||
|
||||
def _extract_sections(self, content):
|
||||
"""提取章节信息"""
|
||||
sections = []
|
||||
|
||||
# 匹配各级标题
|
||||
header_pattern = r'^(#{1,3})\s+(.+?)$'
|
||||
|
||||
lines = content.split('\n')
|
||||
current_section = None
|
||||
|
||||
for i, line in enumerate(lines):
|
||||
match = re.match(header_pattern, line.strip())
|
||||
if match:
|
||||
level = len(match.group(1))
|
||||
title = match.group(2).strip()
|
||||
|
||||
# 计算章节内容行数(直到下一个标题)
|
||||
content_lines = 0
|
||||
for j in range(i + 1, len(lines)):
|
||||
if re.match(r'^#{1,3}\s+', lines[j].strip()):
|
||||
break
|
||||
if lines[j].strip():
|
||||
content_lines += 1
|
||||
|
||||
sections.append({
|
||||
'level': level,
|
||||
'title': title,
|
||||
'start_line': i + 1,
|
||||
'content_lines': content_lines
|
||||
})
|
||||
|
||||
return sections
|
||||
|
||||
def _calculate_completeness_score(self, non_empty_lines, placeholder_count, sections_count):
|
||||
"""计算完整性评分(0-100)"""
|
||||
if non_empty_lines == 0:
|
||||
return 0
|
||||
|
||||
# 基础分:基于非空行数(假设完整档案至少50行)
|
||||
base_score = min(100, (non_empty_lines / 50) * 60)
|
||||
|
||||
# 占位符扣分:每个占位符扣2分,最多扣30分
|
||||
placeholder_penalty = min(30, placeholder_count * 2)
|
||||
|
||||
# 章节加分:每节加5分,最多加20分
|
||||
section_bonus = min(20, sections_count * 5)
|
||||
|
||||
score = base_score - placeholder_penalty + section_bonus
|
||||
return max(0, min(100, score))
|
||||
|
||||
def _get_completeness_level(self, score):
|
||||
"""获取完整性等级"""
|
||||
if score >= 90:
|
||||
return "优秀"
|
||||
elif score >= 75:
|
||||
return "良好"
|
||||
elif score >= 60:
|
||||
return "一般"
|
||||
elif score >= 40:
|
||||
return "待完善"
|
||||
else:
|
||||
return "草稿"
|
||||
|
||||
def generate_report(self, analysis_result, output_format='text'):
|
||||
"""生成分析报告"""
|
||||
result = analysis_result
|
||||
|
||||
if output_format == 'text':
|
||||
report_lines = []
|
||||
report_lines.append("=" * 60)
|
||||
report_lines.append(f"人物档案分析报告")
|
||||
report_lines.append(f"文件: {result['filepath']}")
|
||||
report_lines.append("=" * 60)
|
||||
report_lines.append("")
|
||||
|
||||
# 基本信息
|
||||
report_lines.append(f"{self.symbols['chart']} 基本信息")
|
||||
report_lines.append(f" 总行数: {result['total_lines']}")
|
||||
report_lines.append(f" 非空行数: {result['non_empty_lines']}")
|
||||
report_lines.append(f" 章节数: {result['sections_count']}")
|
||||
report_lines.append(f" 占位符数量: {result['placeholder_count']}")
|
||||
report_lines.append("")
|
||||
|
||||
# 完整性评分
|
||||
report_lines.append(f"{self.symbols['trophy']} 完整性评估")
|
||||
report_lines.append(f" 评分: {result['completeness_score']:.1f}/100")
|
||||
report_lines.append(f" 等级: {result['completeness_level']}")
|
||||
report_lines.append("")
|
||||
|
||||
# 章节详情
|
||||
if result['sections']:
|
||||
report_lines.append(f"{self.symbols['file']} 章节详情")
|
||||
for section in result['sections']:
|
||||
level_indent = " " * (section['level'] - 1)
|
||||
report_lines.append(f"{level_indent}{self.symbols['bullet']} {section['title']} (行 {section['start_line']}, {section['content_lines']} 行)")
|
||||
report_lines.append("")
|
||||
|
||||
# 占位符详情
|
||||
if result['placeholder_details']:
|
||||
report_lines.append(f"{self.symbols['warning']} 需要完善的部分")
|
||||
for detail in result['placeholder_details']:
|
||||
report_lines.append(f" 第 {detail['line']} 行: {detail['content']}")
|
||||
|
||||
if result['placeholder_count'] > 10:
|
||||
report_lines.append(f" ... 还有 {result['placeholder_count'] - 10} 个占位符未显示")
|
||||
report_lines.append("")
|
||||
|
||||
# 建议
|
||||
report_lines.append(f"{self.symbols['bulb']} 建议")
|
||||
if result['completeness_score'] >= 80:
|
||||
report_lines.append(f" {self.symbols['check']} 档案比较完整,可以开始用于创作")
|
||||
report_lines.append(f" {self.symbols['arrow']} 可以考虑添加更多细节和情感描写")
|
||||
elif result['completeness_score'] >= 60:
|
||||
report_lines.append(f" {self.symbols['warning']} 档案基本完整,但还有完善空间")
|
||||
report_lines.append(f" {self.symbols['arrow']} 建议完善 {result['placeholder_count']} 处占位符")
|
||||
else:
|
||||
report_lines.append(f" {self.symbols['cross']} 档案还处于草稿阶段")
|
||||
report_lines.append(f" {self.symbols['arrow']} 需要补充大量内容,建议逐个章节完善")
|
||||
|
||||
report_lines.append("")
|
||||
report_lines.append("=" * 60)
|
||||
|
||||
return "\n".join(report_lines)
|
||||
|
||||
elif output_format == 'json':
|
||||
import json
|
||||
return json.dumps(result, ensure_ascii=False, indent=2)
|
||||
|
||||
else:
|
||||
raise ValueError(f"不支持的输出格式: {output_format}")
|
||||
|
||||
def analyze_directory(self, directory_path, recursive=True):
|
||||
"""分析目录下的所有markdown档案"""
|
||||
directory = Path(directory_path)
|
||||
|
||||
if not directory.exists():
|
||||
raise FileNotFoundError(f"目录不存在: {directory_path}")
|
||||
|
||||
# 查找markdown文件
|
||||
md_files = []
|
||||
if recursive:
|
||||
md_files = list(directory.rglob("*.md"))
|
||||
else:
|
||||
md_files = list(directory.glob("*.md"))
|
||||
|
||||
if not md_files:
|
||||
return {"message": "未找到markdown文件", "files": []}
|
||||
|
||||
# 分析每个文件
|
||||
results = []
|
||||
for md_file in md_files:
|
||||
try:
|
||||
analysis = self.analyze_markdown(str(md_file))
|
||||
results.append(analysis)
|
||||
except Exception as e:
|
||||
results.append({
|
||||
'filepath': str(md_file),
|
||||
'error': str(e)
|
||||
})
|
||||
|
||||
# 按完整性评分排序
|
||||
valid_results = [r for r in results if 'completeness_score' in r]
|
||||
sorted_results = sorted(valid_results, key=lambda x: x['completeness_score'], reverse=True)
|
||||
|
||||
return {
|
||||
'total_files': len(md_files),
|
||||
'successful_analysis': len(valid_results),
|
||||
'failed_analysis': len(results) - len(valid_results),
|
||||
'results': sorted_results
|
||||
}
|
||||
|
||||
def generate_directory_report(self, analysis_results, output_format='text'):
|
||||
"""生成目录分析报告"""
|
||||
if output_format == 'text':
|
||||
report_lines = []
|
||||
report_lines.append("=" * 60)
|
||||
report_lines.append(f"人物档案目录分析报告")
|
||||
report_lines.append(f"分析文件数: {analysis_results['total_files']}")
|
||||
report_lines.append(f"成功分析: {analysis_results['successful_analysis']}")
|
||||
if analysis_results['failed_analysis'] > 0:
|
||||
report_lines.append(f"分析失败: {analysis_results['failed_analysis']}")
|
||||
report_lines.append("=" * 60)
|
||||
report_lines.append("")
|
||||
|
||||
# 文件列表(按评分排序)
|
||||
if analysis_results['results']:
|
||||
report_lines.append(f"{self.symbols['file']} 文件完整性排名")
|
||||
for i, result in enumerate(analysis_results['results'], 1):
|
||||
score = result['completeness_score']
|
||||
level = result['completeness_level']
|
||||
filename = os.path.basename(result['filepath'])
|
||||
|
||||
# 使用符号表示等级
|
||||
if score >= 80:
|
||||
icon = self.symbols['green_circle']
|
||||
elif score >= 60:
|
||||
icon = self.symbols['yellow_circle']
|
||||
else:
|
||||
icon = self.symbols['red_circle']
|
||||
|
||||
report_lines.append(f"{icon} {i:2d}. {filename:<40} {score:5.1f}分 ({level})")
|
||||
|
||||
report_lines.append("")
|
||||
|
||||
# 统计信息
|
||||
avg_score = sum(r['completeness_score'] for r in analysis_results['results']) / len(analysis_results['results'])
|
||||
max_score = max(r['completeness_score'] for r in analysis_results['results'])
|
||||
min_score = min(r['completeness_score'] for r in analysis_results['results'])
|
||||
|
||||
report_lines.append(f"{self.symbols['chart']} 统计信息")
|
||||
report_lines.append(f" 平均分: {avg_score:.1f}")
|
||||
report_lines.append(f" 最高分: {max_score:.1f}")
|
||||
report_lines.append(f" 最低分: {min_score:.1f}")
|
||||
report_lines.append("")
|
||||
|
||||
# 建议
|
||||
report_lines.append(f"{self.symbols['bulb']} 整体建议")
|
||||
if avg_score >= 75:
|
||||
report_lines.append(f" {self.symbols['check']} 整体完成度良好")
|
||||
report_lines.append(f" {self.symbols['arrow']} 可以考虑开始故事创作")
|
||||
elif avg_score >= 50:
|
||||
report_lines.append(f" {self.symbols['warning']} 整体完成度一般")
|
||||
report_lines.append(f" {self.symbols['arrow']} 建议继续完善人物档案")
|
||||
else:
|
||||
report_lines.append(f" {self.symbols['cross']} 整体完成度较低")
|
||||
report_lines.append(f" {self.symbols['arrow']} 需要重点完善主要角色的档案")
|
||||
|
||||
report_lines.append("")
|
||||
report_lines.append("=" * 60)
|
||||
|
||||
return "\n".join(report_lines)
|
||||
|
||||
else:
|
||||
import json
|
||||
return json.dumps(analysis_results, ensure_ascii=False, indent=2)
|
||||
|
||||
|
||||
def main():
|
||||
"""主函数"""
|
||||
import argparse
|
||||
|
||||
parser = argparse.ArgumentParser(description='分析人物档案markdown文件')
|
||||
parser.add_argument('path', help='要分析的markdown文件或目录路径')
|
||||
parser.add_argument('--recursive', '-r', action='store_true', help='递归分析目录')
|
||||
parser.add_argument('--format', '-f', choices=['text', 'json'], default='text', help='输出格式')
|
||||
parser.add_argument('--output', '-o', help='输出文件路径')
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
analyzer = ProfileAnalyzer()
|
||||
path = Path(args.path)
|
||||
|
||||
try:
|
||||
if path.is_file():
|
||||
# 分析单个文件
|
||||
if path.suffix.lower() != '.md':
|
||||
print("错误: 文件必须是.md格式")
|
||||
return 1
|
||||
|
||||
analysis = analyzer.analyze_markdown(str(path))
|
||||
report = analyzer.generate_report(analysis, args.format)
|
||||
|
||||
elif path.is_dir():
|
||||
# 分析目录
|
||||
analysis_results = analyzer.analyze_directory(str(path), args.recursive)
|
||||
report = analyzer.generate_directory_report(analysis_results, args.format)
|
||||
|
||||
else:
|
||||
print(f"错误: 路径不存在: {args.path}")
|
||||
return 1
|
||||
|
||||
# 输出结果
|
||||
if args.output:
|
||||
with open(args.output, 'w', encoding='utf-8') as f:
|
||||
f.write(report)
|
||||
print(f"报告已保存到: {args.output}")
|
||||
else:
|
||||
print(report)
|
||||
|
||||
return 0
|
||||
|
||||
except Exception as e:
|
||||
print(f"分析失败: {e}")
|
||||
return 1
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
sys.exit(main())
|
||||
648
skills/character-profile-cn/scripts/conflict_detector.py
Normal file
648
skills/character-profile-cn/scripts/conflict_detector.py
Normal file
@ -0,0 +1,648 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
冲突检测和常识校验模块
|
||||
检测角色冲突和常识错误
|
||||
"""
|
||||
|
||||
import re
|
||||
import json
|
||||
from typing import Dict, List, Optional, Tuple, Set, Any
|
||||
from pathlib import Path
|
||||
import logging
|
||||
from dataclasses import dataclass, field
|
||||
from enum import Enum
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class ConflictSeverity(Enum):
|
||||
"""冲突严重程度"""
|
||||
INFO = "info" # 信息提示
|
||||
WARNING = "warning" # 警告
|
||||
ERROR = "error" # 错误
|
||||
|
||||
|
||||
class ConflictType(Enum):
|
||||
"""冲突类型"""
|
||||
DUPLICATE_NAME = "duplicate_name" # 重复姓名
|
||||
SIMILAR_CHARACTER = "similar_character" # 相似角色
|
||||
TIMELINE_CONFLICT = "timeline_conflict" # 时间线冲突
|
||||
RELATIONSHIP_CONFLICT = "relationship_conflict" # 关系冲突
|
||||
AGE_INCONSISTENCY = "age_inconsistency" # 年龄不一致
|
||||
COMMON_SENSE_ERROR = "common_sense_error" # 常识错误
|
||||
LOGIC_CONFLICT = "logic_conflict" # 逻辑冲突
|
||||
|
||||
|
||||
@dataclass
|
||||
class Conflict:
|
||||
"""冲突信息"""
|
||||
type: ConflictType
|
||||
severity: ConflictSeverity
|
||||
message: str
|
||||
character_name: str
|
||||
details: Dict[str, Any] = field(default_factory=dict)
|
||||
related_characters: List[str] = field(default_factory=list)
|
||||
suggested_fixes: List[str] = field(default_factory=list)
|
||||
|
||||
|
||||
@dataclass
|
||||
class ValidationRule:
|
||||
"""校验规则"""
|
||||
id: str
|
||||
name: str
|
||||
description: str
|
||||
pattern: Optional[str] = None
|
||||
condition: Optional[str] = None
|
||||
severity: ConflictSeverity = ConflictSeverity.WARNING
|
||||
enabled: bool = True
|
||||
category: str = "common_sense"
|
||||
|
||||
|
||||
class ConflictDetector:
|
||||
"""冲突检测器"""
|
||||
|
||||
# 预定义常识规则
|
||||
DEFAULT_COMMON_SENSE_RULES = [
|
||||
ValidationRule(
|
||||
id="age_realistic",
|
||||
name="年龄合理性",
|
||||
description="检查年龄是否在合理范围内(0-150岁)",
|
||||
condition="age.isdigit() and not (0 <= int(age) <= 150)",
|
||||
severity=ConflictSeverity.WARNING,
|
||||
category="common_sense"
|
||||
),
|
||||
ValidationRule(
|
||||
id="age_format",
|
||||
name="年龄格式",
|
||||
description="年龄应为数字或数字范围",
|
||||
pattern=r"^\d+(\s*-\s*\d+)?$",
|
||||
severity=ConflictSeverity.INFO,
|
||||
category="common_sense"
|
||||
),
|
||||
ValidationRule(
|
||||
id="timeline_consistency",
|
||||
name="时间线一致性",
|
||||
description="检查关键事件时间线是否合理",
|
||||
condition="'background' in character and 'timeline_events' in character",
|
||||
severity=ConflictSeverity.WARNING,
|
||||
category="timeline"
|
||||
),
|
||||
ValidationRule(
|
||||
id="relationship_consistency",
|
||||
name="关系一致性",
|
||||
description="检查角色关系是否相互一致",
|
||||
condition="'relationships' in character",
|
||||
severity=ConflictSeverity.WARNING,
|
||||
category="relationships"
|
||||
),
|
||||
ValidationRule(
|
||||
id="duplicate_detection",
|
||||
name="重复检测",
|
||||
description="检测是否有重复角色",
|
||||
condition="True", # 始终启用
|
||||
severity=ConflictSeverity.ERROR,
|
||||
category="duplicate"
|
||||
)
|
||||
]
|
||||
|
||||
def __init__(self, rules_file: Optional[str] = None):
|
||||
"""初始化冲突检测器
|
||||
|
||||
Args:
|
||||
rules_file: 规则配置文件路径
|
||||
"""
|
||||
self.rules = self._load_rules(rules_file)
|
||||
self.character_index = {} # 角色信息索引
|
||||
|
||||
def _load_rules(self, rules_file: Optional[str]) -> List[ValidationRule]:
|
||||
"""加载校验规则
|
||||
|
||||
Args:
|
||||
rules_file: 规则文件路径
|
||||
|
||||
Returns:
|
||||
规则列表
|
||||
"""
|
||||
rules = []
|
||||
|
||||
# 先加载默认规则
|
||||
rules.extend(self.DEFAULT_COMMON_SENSE_RULES)
|
||||
|
||||
# 如果指定了规则文件,从文件加载
|
||||
if rules_file and Path(rules_file).exists():
|
||||
try:
|
||||
with open(rules_file, 'r', encoding='utf-8') as f:
|
||||
rule_data = json.load(f)
|
||||
|
||||
for rule_item in rule_data.get("rules", []):
|
||||
rule = ValidationRule(
|
||||
id=rule_item.get("id"),
|
||||
name=rule_item.get("name"),
|
||||
description=rule_item.get("description"),
|
||||
pattern=rule_item.get("pattern"),
|
||||
condition=rule_item.get("condition"),
|
||||
severity=ConflictSeverity(rule_item.get("severity", "warning")),
|
||||
enabled=rule_item.get("enabled", True),
|
||||
category=rule_item.get("category", "common_sense")
|
||||
)
|
||||
rules.append(rule)
|
||||
|
||||
logger.info(f"从文件加载了 {len(rule_data.get('rules', []))} 条规则")
|
||||
except Exception as e:
|
||||
logger.error(f"加载规则文件失败: {e}")
|
||||
|
||||
return rules
|
||||
|
||||
def set_character_index(self, character_index: Dict):
|
||||
"""设置角色信息索引
|
||||
|
||||
Args:
|
||||
character_index: 角色索引字典
|
||||
"""
|
||||
self.character_index = character_index
|
||||
|
||||
def detect_conflicts(self, new_character: Dict, existing_characters: List[Dict] = None) -> List[Conflict]:
|
||||
"""检测新角色与现有角色的冲突
|
||||
|
||||
Args:
|
||||
new_character: 新角色信息
|
||||
existing_characters: 现有角色列表,为None时使用character_index
|
||||
|
||||
Returns:
|
||||
冲突列表
|
||||
"""
|
||||
conflicts = []
|
||||
|
||||
# 获取现有角色
|
||||
if existing_characters is None:
|
||||
existing_characters = self.character_index.get("characters", [])
|
||||
|
||||
# 1. 检测重复姓名
|
||||
duplicate_conflicts = self._detect_duplicate_names(new_character, existing_characters)
|
||||
conflicts.extend(duplicate_conflicts)
|
||||
|
||||
# 2. 检测相似角色
|
||||
similar_conflicts = self._detect_similar_characters(new_character, existing_characters)
|
||||
conflicts.extend(similar_conflicts)
|
||||
|
||||
# 3. 检测常识错误
|
||||
common_sense_conflicts = self._check_common_sense(new_character)
|
||||
conflicts.extend(common_sense_conflicts)
|
||||
|
||||
# 4. 检测时间线冲突
|
||||
timeline_conflicts = self._detect_timeline_conflicts(new_character, existing_characters)
|
||||
conflicts.extend(timeline_conflicts)
|
||||
|
||||
# 5. 检测关系冲突
|
||||
relationship_conflicts = self._detect_relationship_conflicts(new_character, existing_characters)
|
||||
conflicts.extend(relationship_conflicts)
|
||||
|
||||
return conflicts
|
||||
|
||||
def _detect_duplicate_names(self, new_char: Dict, existing_chars: List[Dict]) -> List[Conflict]:
|
||||
"""检测重复姓名
|
||||
|
||||
Args:
|
||||
new_char: 新角色
|
||||
existing_chars: 现有角色
|
||||
|
||||
Returns:
|
||||
冲突列表
|
||||
"""
|
||||
conflicts = []
|
||||
new_name = new_char.get("name", "").strip().lower()
|
||||
|
||||
if not new_name:
|
||||
return conflicts
|
||||
|
||||
for existing_char in existing_chars:
|
||||
existing_name = existing_char.get("name", "").strip().lower()
|
||||
|
||||
if existing_name and existing_name == new_name:
|
||||
conflict = Conflict(
|
||||
type=ConflictType.DUPLICATE_NAME,
|
||||
severity=ConflictSeverity.ERROR,
|
||||
message=f"角色姓名重复: '{new_char.get('name')}' 已存在",
|
||||
character_name=new_char.get("name", "未知"),
|
||||
details={
|
||||
"new_character": new_char.get("name"),
|
||||
"existing_character": existing_char.get("name"),
|
||||
"existing_file": existing_char.get("file_path", "")
|
||||
},
|
||||
related_characters=[existing_char.get("name", "未知")],
|
||||
suggested_fixes=[
|
||||
f"修改新角色姓名为 '{new_char.get('name')}_新'",
|
||||
f"合并两个角色的设定",
|
||||
f"删除或重命名现有角色"
|
||||
]
|
||||
)
|
||||
conflicts.append(conflict)
|
||||
|
||||
return conflicts
|
||||
|
||||
def _detect_similar_characters(self, new_char: Dict, existing_chars: List[Dict]) -> List[Conflict]:
|
||||
"""检测相似角色
|
||||
|
||||
Args:
|
||||
new_char: 新角色
|
||||
existing_chars: 现有角色
|
||||
|
||||
Returns:
|
||||
冲突列表
|
||||
"""
|
||||
conflicts = []
|
||||
new_name = new_char.get("name", "").lower()
|
||||
|
||||
if not new_name:
|
||||
return conflicts
|
||||
|
||||
# 相似度检测阈值
|
||||
similarity_threshold = 0.7
|
||||
|
||||
for existing_char in existing_chars:
|
||||
existing_name = existing_char.get("name", "").lower()
|
||||
|
||||
# 计算姓名相似度
|
||||
similarity = self._calculate_name_similarity(new_name, existing_name)
|
||||
|
||||
if similarity > similarity_threshold:
|
||||
conflict = Conflict(
|
||||
type=ConflictType.SIMILAR_CHARACTER,
|
||||
severity=ConflictSeverity.WARNING,
|
||||
message=f"角色姓名相似: '{new_char.get('name')}' 与 '{existing_char.get('name')}' 相似度较高",
|
||||
character_name=new_char.get("name", "未知"),
|
||||
details={
|
||||
"new_character": new_char.get("name"),
|
||||
"existing_character": existing_char.get("name"),
|
||||
"similarity_score": similarity,
|
||||
"existing_file": existing_char.get("file_path", "")
|
||||
},
|
||||
related_characters=[existing_char.get("name", "未知")],
|
||||
suggested_fixes=[
|
||||
f"确认是否为不同角色",
|
||||
f"修改其中一个角色的姓名以增加区分度",
|
||||
f"检查角色设定是否重复"
|
||||
]
|
||||
)
|
||||
conflicts.append(conflict)
|
||||
|
||||
# 检查其他相似特征
|
||||
similarity_features = self._check_feature_similarity(new_char, existing_char)
|
||||
if similarity_features:
|
||||
conflict = Conflict(
|
||||
type=ConflictType.SIMILAR_CHARACTER,
|
||||
severity=ConflictSeverity.INFO,
|
||||
message=f"角色特征相似: '{new_char.get('name')}' 与 '{existing_char.get('name')}' 有相似特征",
|
||||
character_name=new_char.get("name", "未知"),
|
||||
details={
|
||||
"new_character": new_char.get("name"),
|
||||
"existing_character": existing_char.get("name"),
|
||||
"similar_features": similarity_features,
|
||||
"existing_file": existing_char.get("file_path", "")
|
||||
},
|
||||
related_characters=[existing_char.get("name", "未知")],
|
||||
suggested_fixes=[
|
||||
f"区分角色特征",
|
||||
f"强化角色独特性",
|
||||
f"考虑角色合并"
|
||||
]
|
||||
)
|
||||
conflicts.append(conflict)
|
||||
|
||||
return conflicts
|
||||
|
||||
def _calculate_name_similarity(self, name1: str, name2: str) -> float:
|
||||
"""计算姓名相似度
|
||||
|
||||
Args:
|
||||
name1: 姓名1
|
||||
name2: 姓名2
|
||||
|
||||
Returns:
|
||||
相似度得分 (0-1)
|
||||
"""
|
||||
if not name1 or not name2:
|
||||
return 0.0
|
||||
|
||||
# 简单的相似度计算:共同字符比例
|
||||
set1 = set(name1.replace(' ', ''))
|
||||
set2 = set(name2.replace(' ', ''))
|
||||
|
||||
if not set1 or not set2:
|
||||
return 0.0
|
||||
|
||||
intersection = len(set1.intersection(set2))
|
||||
union = len(set1.union(set2))
|
||||
|
||||
return intersection / union if union > 0 else 0.0
|
||||
|
||||
def _check_feature_similarity(self, char1: Dict, char2: Dict) -> List[str]:
|
||||
"""检查特征相似性
|
||||
|
||||
Args:
|
||||
char1: 角色1
|
||||
char2: 角色2
|
||||
|
||||
Returns:
|
||||
相似特征列表
|
||||
"""
|
||||
similar_features = []
|
||||
|
||||
# 检查年龄
|
||||
age1 = char1.get("age", "")
|
||||
age2 = char2.get("age", "")
|
||||
if age1 and age2 and age1 == age2:
|
||||
similar_features.append(f"年龄相同: {age1}")
|
||||
|
||||
# 检查职业
|
||||
occupation1 = char1.get("occupation", "")
|
||||
occupation2 = char2.get("occupation", "")
|
||||
if occupation1 and occupation2 and occupation1.lower() == occupation2.lower():
|
||||
similar_features.append(f"职业相同: {occupation1}")
|
||||
|
||||
# 检查角色类型
|
||||
type1 = char1.get("character_type", "")
|
||||
type2 = char2.get("character_type", "")
|
||||
if type1 and type2 and type1.lower() == type2.lower():
|
||||
similar_features.append(f"角色类型相同: {type1}")
|
||||
|
||||
return similar_features
|
||||
|
||||
def _check_common_sense(self, character: Dict) -> List[Conflict]:
|
||||
"""检查常识错误
|
||||
|
||||
Args:
|
||||
character: 角色信息
|
||||
|
||||
Returns:
|
||||
冲突列表
|
||||
"""
|
||||
conflicts = []
|
||||
|
||||
for rule in self.rules:
|
||||
if not rule.enabled or rule.category != "common_sense":
|
||||
continue
|
||||
|
||||
# 根据规则类型进行检查
|
||||
if rule.pattern:
|
||||
# 模式匹配规则
|
||||
for field_name, field_value in character.items():
|
||||
if isinstance(field_value, str):
|
||||
if not re.match(rule.pattern, field_value):
|
||||
conflict = Conflict(
|
||||
type=ConflictType.COMMON_SENSE_ERROR,
|
||||
severity=rule.severity,
|
||||
message=f"{rule.name}: {field_name} '{field_value}' 不符合格式要求",
|
||||
character_name=character.get("name", "未知"),
|
||||
details={
|
||||
"rule_id": rule.id,
|
||||
"rule_name": rule.name,
|
||||
"field": field_name,
|
||||
"value": field_value,
|
||||
"expected_pattern": rule.pattern
|
||||
},
|
||||
suggested_fixes=[
|
||||
f"修改 {field_name} 为符合格式: {rule.pattern}",
|
||||
f"检查 {field_name} 是否正确"
|
||||
]
|
||||
)
|
||||
conflicts.append(conflict)
|
||||
|
||||
elif rule.condition:
|
||||
# 条件规则(简化实现)
|
||||
try:
|
||||
# 这里实现简化的条件检查
|
||||
if rule.id == "age_realistic":
|
||||
age_str = character.get("age", "")
|
||||
if age_str.isdigit():
|
||||
age = int(age_str)
|
||||
if not (0 <= age <= 150):
|
||||
conflict = Conflict(
|
||||
type=ConflictType.COMMON_SENSE_ERROR,
|
||||
severity=rule.severity,
|
||||
message=f"{rule.name}: 年龄 {age} 不在合理范围 (0-150)",
|
||||
character_name=character.get("name", "未知"),
|
||||
details={
|
||||
"rule_id": rule.id,
|
||||
"rule_name": rule.name,
|
||||
"field": "age",
|
||||
"value": age,
|
||||
"expected_range": "0-150"
|
||||
},
|
||||
suggested_fixes=[
|
||||
"调整年龄到合理范围",
|
||||
"如果是特殊设定(如非人类),请明确说明"
|
||||
]
|
||||
)
|
||||
conflicts.append(conflict)
|
||||
except Exception as e:
|
||||
logger.debug(f"规则检查失败 {rule.id}: {e}")
|
||||
|
||||
return conflicts
|
||||
|
||||
def _detect_timeline_conflicts(self, new_char: Dict, existing_chars: List[Dict]) -> List[Conflict]:
|
||||
"""检测时间线冲突
|
||||
|
||||
Args:
|
||||
new_char: 新角色
|
||||
existing_chars: 现有角色
|
||||
|
||||
Returns:
|
||||
冲突列表
|
||||
"""
|
||||
conflicts = []
|
||||
# 这里实现时间线冲突检测逻辑
|
||||
# 需要从角色信息中提取时间线事件
|
||||
return conflicts
|
||||
|
||||
def _detect_relationship_conflicts(self, new_char: Dict, existing_chars: List[Dict]) -> List[Conflict]:
|
||||
"""检测关系冲突
|
||||
|
||||
Args:
|
||||
new_char: 新角色
|
||||
existing_chars: 现有角色
|
||||
|
||||
Returns:
|
||||
冲突列表
|
||||
"""
|
||||
conflicts = []
|
||||
# 这里实现关系冲突检测逻辑
|
||||
# 需要从角色信息中提取关系信息
|
||||
return conflicts
|
||||
|
||||
def validate_character(self, character: Dict) -> Tuple[bool, List[Conflict]]:
|
||||
"""验证单个角色
|
||||
|
||||
Args:
|
||||
character: 角色信息
|
||||
|
||||
Returns:
|
||||
(是否有效, 冲突列表)
|
||||
"""
|
||||
conflicts = self.detect_conflicts(character)
|
||||
is_valid = all(conflict.severity != ConflictSeverity.ERROR for conflict in conflicts)
|
||||
|
||||
return is_valid, conflicts
|
||||
|
||||
def generate_report(self, conflicts: List[Conflict], output_format: str = "text") -> str:
|
||||
"""生成冲突报告
|
||||
|
||||
Args:
|
||||
conflicts: 冲突列表
|
||||
output_format: 输出格式,支持 'text', 'json', 'markdown'
|
||||
|
||||
Returns:
|
||||
报告字符串
|
||||
"""
|
||||
if output_format == "json":
|
||||
report_data = []
|
||||
for conflict in conflicts:
|
||||
report_data.append({
|
||||
"type": conflict.type.value,
|
||||
"severity": conflict.severity.value,
|
||||
"message": conflict.message,
|
||||
"character_name": conflict.character_name,
|
||||
"details": conflict.details,
|
||||
"related_characters": conflict.related_characters,
|
||||
"suggested_fixes": conflict.suggested_fixes
|
||||
})
|
||||
return json.dumps(report_data, ensure_ascii=False, indent=2)
|
||||
|
||||
elif output_format == "markdown":
|
||||
report_lines = ["# 冲突检测报告", ""]
|
||||
|
||||
# 按严重程度分组
|
||||
errors = [c for c in conflicts if c.severity == ConflictSeverity.ERROR]
|
||||
warnings = [c for c in conflicts if c.severity == ConflictSeverity.WARNING]
|
||||
infos = [c for c in conflicts if c.severity == ConflictSeverity.INFO]
|
||||
|
||||
if errors:
|
||||
report_lines.append("## ❌ 错误")
|
||||
for conflict in errors:
|
||||
report_lines.append(f"### {conflict.message}")
|
||||
report_lines.append(f"- **角色**: {conflict.character_name}")
|
||||
report_lines.append(f"- **类型**: {conflict.type.value}")
|
||||
if conflict.related_characters:
|
||||
report_lines.append(f"- **相关角色**: {', '.join(conflict.related_characters)}")
|
||||
if conflict.suggested_fixes:
|
||||
report_lines.append(f"- **建议**:")
|
||||
for fix in conflict.suggested_fixes:
|
||||
report_lines.append(f" - {fix}")
|
||||
report_lines.append("")
|
||||
|
||||
if warnings:
|
||||
report_lines.append("## ⚠️ 警告")
|
||||
for conflict in warnings:
|
||||
report_lines.append(f"### {conflict.message}")
|
||||
report_lines.append(f"- **角色**: {conflict.character_name}")
|
||||
report_lines.append(f"- **类型**: {conflict.type.value}")
|
||||
if conflict.suggested_fixes:
|
||||
report_lines.append(f"- **建议**: {conflict.suggested_fixes[0]}")
|
||||
report_lines.append("")
|
||||
|
||||
if infos:
|
||||
report_lines.append("## ℹ️ 提示")
|
||||
for conflict in infos:
|
||||
report_lines.append(f"- {conflict.message}")
|
||||
report_lines.append("")
|
||||
|
||||
return "\n".join(report_lines)
|
||||
|
||||
else: # text格式
|
||||
report_lines = ["冲突检测报告", "=" * 40, ""]
|
||||
|
||||
# 统计
|
||||
error_count = len([c for c in conflicts if c.severity == ConflictSeverity.ERROR])
|
||||
warning_count = len([c for c in conflicts if c.severity == ConflictSeverity.WARNING])
|
||||
info_count = len([c for c in conflicts if c.severity == ConflictSeverity.INFO])
|
||||
|
||||
report_lines.append(f"发现 {error_count} 个错误, {warning_count} 个警告, {info_count} 个提示")
|
||||
report_lines.append("")
|
||||
|
||||
# 按角色分组显示
|
||||
characters_conflicts = {}
|
||||
for conflict in conflicts:
|
||||
char_name = conflict.character_name
|
||||
if char_name not in characters_conflicts:
|
||||
characters_conflicts[char_name] = []
|
||||
characters_conflicts[char_name].append(conflict)
|
||||
|
||||
for char_name, char_conflicts in characters_conflicts.items():
|
||||
report_lines.append(f"角色: {char_name}")
|
||||
report_lines.append("-" * 30)
|
||||
|
||||
for conflict in char_conflicts:
|
||||
severity_icon = {
|
||||
ConflictSeverity.ERROR: "[错误]",
|
||||
ConflictSeverity.WARNING: "[警告]",
|
||||
ConflictSeverity.INFO: "[提示]"
|
||||
}.get(conflict.severity, "[未知]")
|
||||
|
||||
report_lines.append(f"{severity_icon} {conflict.message}")
|
||||
|
||||
if conflict.related_characters:
|
||||
report_lines.append(f" 相关角色: {', '.join(conflict.related_characters)}")
|
||||
|
||||
if conflict.suggested_fixes:
|
||||
report_lines.append(f" 建议: {conflict.suggested_fixes[0]}")
|
||||
|
||||
report_lines.append("")
|
||||
|
||||
return "\n".join(report_lines)
|
||||
|
||||
|
||||
def main():
|
||||
"""命令行测试"""
|
||||
import sys
|
||||
|
||||
if len(sys.argv) < 2:
|
||||
print("用法: python conflict_detector.py <新角色JSON文件> [现有角色目录]")
|
||||
sys.exit(1)
|
||||
|
||||
# 加载新角色信息
|
||||
new_char_file = sys.argv[1]
|
||||
try:
|
||||
with open(new_char_file, 'r', encoding='utf-8') as f:
|
||||
new_character = json.load(f)
|
||||
except Exception as e:
|
||||
print(f"加载新角色文件失败: {e}")
|
||||
sys.exit(1)
|
||||
|
||||
# 创建检测器
|
||||
detector = ConflictDetector()
|
||||
|
||||
# 如果有现有角色目录,扫描现有角色
|
||||
existing_characters = []
|
||||
if len(sys.argv) > 2:
|
||||
from lore_bible_manager import LoreBibleManager
|
||||
try:
|
||||
manager = LoreBibleManager(sys.argv[2])
|
||||
existing_characters = manager.scan_existing_characters()
|
||||
print(f"扫描到 {len(existing_characters)} 个现有角色")
|
||||
except Exception as e:
|
||||
print(f"扫描现有角色失败: {e}")
|
||||
|
||||
# 设置角色索引
|
||||
if existing_characters:
|
||||
detector.set_character_index({
|
||||
"characters": existing_characters,
|
||||
"total_count": len(existing_characters)
|
||||
})
|
||||
|
||||
# 检测冲突
|
||||
conflicts = detector.detect_conflicts(new_character, existing_characters)
|
||||
|
||||
# 生成报告
|
||||
report = detector.generate_report(conflicts, "text")
|
||||
print(report)
|
||||
|
||||
# 检查是否有效
|
||||
is_valid, _ = detector.validate_character(new_character)
|
||||
if is_valid:
|
||||
print("\n✓ 角色设定基本有效")
|
||||
else:
|
||||
print("\n✗ 角色设定存在错误")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
513
skills/character-profile-cn/scripts/generate_profile.py
Normal file
513
skills/character-profile-cn/scripts/generate_profile.py
Normal file
@ -0,0 +1,513 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
人物档案生成脚本
|
||||
根据模板生成结构化的人物档案markdown文件
|
||||
"""
|
||||
|
||||
import os
|
||||
import sys
|
||||
import json
|
||||
from datetime import datetime
|
||||
from pathlib import Path
|
||||
import logging
|
||||
from typing import Optional, Dict, List, Tuple
|
||||
|
||||
# 配置日志
|
||||
logging.basicConfig(level=logging.INFO, format='%(levelname)s: %(message)s')
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
class CharacterProfileGenerator:
|
||||
"""人物档案生成器"""
|
||||
|
||||
def __init__(self, template_type="standard", workspace=None):
|
||||
"""初始化生成器
|
||||
|
||||
Args:
|
||||
template_type: 模板类型,可选值: 'protagonist', 'antagonist', 'supporting', 'standard'
|
||||
workspace: 工作目录路径,启用LoreBible管理功能
|
||||
"""
|
||||
self.template_type = template_type
|
||||
self.templates = self._load_templates()
|
||||
self.workspace = workspace
|
||||
self.enable_enhanced_features = workspace is not None
|
||||
|
||||
if self.enable_enhanced_features:
|
||||
logger.info(f"启用增强功能,工作目录: {workspace}")
|
||||
# 延迟导入,避免循环依赖
|
||||
self.lore_bible_manager = None
|
||||
self.conflict_detector = None
|
||||
self.profile_session = None
|
||||
|
||||
def _init_enhanced_components(self):
|
||||
"""初始化增强组件"""
|
||||
if not self.enable_enhanced_features:
|
||||
return
|
||||
|
||||
try:
|
||||
# 延迟导入
|
||||
from lore_bible_manager import LoreBibleManager
|
||||
from conflict_detector import ConflictDetector
|
||||
from profile_session import ProfileSession, SessionConfig
|
||||
|
||||
# 初始化管理器
|
||||
self.lore_bible_manager = LoreBibleManager(self.workspace)
|
||||
|
||||
# 验证并创建目录结构
|
||||
is_valid, missing_dirs = self.lore_bible_manager.validate_directory_structure()
|
||||
if not is_valid:
|
||||
logger.warning(f"目录结构不完整,缺失: {missing_dirs}")
|
||||
logger.info("正在创建缺失目录...")
|
||||
if self.lore_bible_manager.create_directory_structure():
|
||||
logger.info("目录结构创建成功")
|
||||
else:
|
||||
logger.error("创建目录结构失败")
|
||||
|
||||
# 初始化冲突检测器
|
||||
self.conflict_detector = ConflictDetector()
|
||||
|
||||
# 配置会话(稍后在generate_markdown中创建)
|
||||
self.session_config = SessionConfig(
|
||||
workspace=self.workspace,
|
||||
character_name="", # 稍后设置
|
||||
template_type=self.template_type,
|
||||
enable_validation=True,
|
||||
enable_conflict_check=True,
|
||||
require_confirmation=True
|
||||
)
|
||||
|
||||
logger.info("增强组件初始化完成")
|
||||
|
||||
except ImportError as e:
|
||||
logger.error(f"导入增强组件失败: {e}")
|
||||
logger.error("请确保lore_bible_manager.py、conflict_detector.py、profile_session.py在脚本目录中")
|
||||
self.enable_enhanced_features = False
|
||||
except Exception as e:
|
||||
logger.error(f"初始化增强组件失败: {e}")
|
||||
self.enable_enhanced_features = False
|
||||
|
||||
def _load_templates(self):
|
||||
"""加载模板配置"""
|
||||
templates = {
|
||||
"protagonist": {
|
||||
"name": "主角模板",
|
||||
"sections": [
|
||||
{"id": "basic", "title": "基本信息", "required": True},
|
||||
{"id": "appearance", "title": "外貌特征", "required": True},
|
||||
{"id": "personality", "title": "性格特点", "required": True},
|
||||
{"id": "background", "title": "背景故事", "required": True},
|
||||
{"id": "motivation", "title": "动机层次", "required": True},
|
||||
{"id": "relationships", "title": "人物关系", "required": True},
|
||||
{"id": "development", "title": "故事发展", "required": True},
|
||||
{"id": "core_identity", "title": "核心身份", "required": False},
|
||||
{"id": "notes", "title": "创作笔记", "required": False}
|
||||
]
|
||||
},
|
||||
"antagonist": {
|
||||
"name": "反派模板",
|
||||
"sections": [
|
||||
{"id": "basic", "title": "基本信息", "required": True},
|
||||
{"id": "appearance", "title": "外貌特征", "required": True},
|
||||
{"id": "personality", "title": "性格特点", "required": True},
|
||||
{"id": "core_belief", "title": "核心理念", "required": True},
|
||||
{"id": "motivation", "title": "动机发展", "required": True},
|
||||
{"id": "mirror", "title": "镜像对比", "required": True},
|
||||
{"id": "resources", "title": "资源能力", "required": True},
|
||||
{"id": "development", "title": "故事发展", "required": True}
|
||||
]
|
||||
},
|
||||
"supporting": {
|
||||
"name": "配角模板",
|
||||
"sections": [
|
||||
{"id": "basic", "title": "基本定位", "required": True},
|
||||
{"id": "identity", "title": "独立身份", "required": True},
|
||||
{"id": "function", "title": "功能性设计", "required": True},
|
||||
{"id": "relationships", "title": "关系发展", "required": True},
|
||||
{"id": "development", "title": "发展可能性", "required": True}
|
||||
]
|
||||
},
|
||||
"standard": {
|
||||
"name": "标准模板",
|
||||
"sections": [
|
||||
{"id": "basic", "title": "基本信息", "required": True},
|
||||
{"id": "appearance", "title": "外貌特征", "required": True},
|
||||
{"id": "personality", "title": "性格特点", "required": True},
|
||||
{"id": "background", "title": "背景故事", "required": True},
|
||||
{"id": "relationships", "title": "人物关系", "required": True},
|
||||
{"id": "development", "title": "故事发展", "required": True},
|
||||
{"id": "notes", "title": "创作笔记", "required": False}
|
||||
]
|
||||
}
|
||||
}
|
||||
return templates
|
||||
|
||||
def _get_section_content(self, section_id, character_data):
|
||||
"""获取章节内容
|
||||
|
||||
Args:
|
||||
section_id: 章节ID
|
||||
character_data: 角色数据字典
|
||||
|
||||
Returns:
|
||||
章节内容字符串
|
||||
"""
|
||||
section_templates = {
|
||||
"basic": """- **姓名**:{name}
|
||||
- **年龄**:{age}
|
||||
- **性别**:{gender}
|
||||
- **职业/身份**:{occupation}
|
||||
- **故事中的角色**:{role}""",
|
||||
|
||||
"appearance": """- **整体印象**:{overall_impression}
|
||||
- **面部特征**:{facial_features}
|
||||
- **身材体型**:{body_type}
|
||||
- **着装风格**:{clothing_style}
|
||||
- **标志性特征**:{distinctive_features}""",
|
||||
|
||||
"personality": """- **核心性格**:{core_personality}
|
||||
- **优点**:{strengths}
|
||||
- **缺点**:{weaknesses}
|
||||
- **价值观**:{values}
|
||||
- **恐惧**:{fears}
|
||||
- **渴望**:{desires}""",
|
||||
|
||||
"background": """- **出身背景**:{origin}
|
||||
- **关键经历**:{key_experiences}
|
||||
- **转折点**:{turning_points}
|
||||
- **未解之谜**:{unsolved_mysteries}""",
|
||||
|
||||
"relationships": """- **与主角关系**:{relationship_with_protagonist}
|
||||
- **重要关系人**:{important_relationships}
|
||||
- **敌对关系**:{enemy_relationships}
|
||||
- **情感羁绊**:{emotional_bonds}""",
|
||||
|
||||
"development": """- **角色目标**:{goals}
|
||||
- **内在冲突**:{internal_conflicts}
|
||||
- **外在冲突**:{external_conflicts}
|
||||
- **发展弧线**:{development_arc}
|
||||
- **可能的结局**:{possible_endings}""",
|
||||
|
||||
"notes": """- **灵感来源**:{inspiration_sources}
|
||||
- **象征意义**:{symbolic_meanings}
|
||||
- **潜在发展**:{potential_developments}""",
|
||||
|
||||
"core_identity": """- **本质自我**:{true_self}
|
||||
- **社会面具**:{social_mask}
|
||||
- **理想自我**:{ideal_self}
|
||||
- **恐惧自我**:{feared_self}""",
|
||||
|
||||
"motivation": """- **表层目标**:{surface_goals}
|
||||
- **情感需求**:{emotional_needs}
|
||||
- **存在需求**:{existential_needs}
|
||||
- **未意识需求**:{unconscious_needs}""",
|
||||
|
||||
"core_belief": """- **世界观**:{worldview}
|
||||
- **核心信念**:{core_beliefs}
|
||||
- **正义观**:{justice_view}
|
||||
- **变革愿景**:{change_vision}""",
|
||||
|
||||
"mirror": """- **相似点**:{similarities}
|
||||
- **分歧点**:{divergences}
|
||||
- **对立逻辑**:{opposition_logic}
|
||||
- **潜在转化**:{potential_transformation}""",
|
||||
|
||||
"resources": """- **核心团队**:{core_team}
|
||||
- **盟友势力**:{ally_forces}
|
||||
- **影响范围**:{influence_scope}
|
||||
- **弱点环节**:{weakness_points}""",
|
||||
|
||||
"function": """- **推动剧情的方式**:{plot_push_methods}
|
||||
- **服务主角的方式**:{protagonist_service_methods}
|
||||
- **独特价值**:{unique_value}
|
||||
- **退出时机**:{exit_timing}"""
|
||||
}
|
||||
|
||||
template = section_templates.get(section_id, "")
|
||||
if not template:
|
||||
return ""
|
||||
|
||||
# 从character_data中获取数据,如果不存在则使用占位符
|
||||
content = template
|
||||
for key in character_data:
|
||||
placeholder = "{" + key + "}"
|
||||
if placeholder in content:
|
||||
content = content.replace(placeholder, character_data.get(key, f"[待填写{key}]"))
|
||||
|
||||
# 清理未替换的占位符
|
||||
import re
|
||||
content = re.sub(r'\{[^}]*\}', '[待填写]', content)
|
||||
|
||||
return content
|
||||
|
||||
def generate_markdown(self, character_data, output_path=None):
|
||||
"""生成markdown档案
|
||||
|
||||
Args:
|
||||
character_data: 角色数据字典,必须包含'name'字段
|
||||
output_path: 输出文件路径,如果为None则返回字符串
|
||||
|
||||
Returns:
|
||||
如果output_path为None,返回markdown字符串;否则写入文件
|
||||
"""
|
||||
if 'name' not in character_data:
|
||||
raise ValueError("角色数据必须包含'name'字段")
|
||||
|
||||
template = self.templates.get(self.template_type, self.templates["standard"])
|
||||
|
||||
# 生成markdown内容
|
||||
lines = []
|
||||
lines.append(f"# {character_data['name']} - 角色档案")
|
||||
lines.append("")
|
||||
lines.append(f"> 生成时间:{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
|
||||
lines.append(f"> 模板类型:{template['name']}")
|
||||
lines.append("")
|
||||
|
||||
for section in template['sections']:
|
||||
section_id = section['id']
|
||||
section_title = section['title']
|
||||
|
||||
lines.append(f"## {section_title}")
|
||||
lines.append("")
|
||||
|
||||
content = self._get_section_content(section_id, character_data)
|
||||
if content:
|
||||
lines.append(content)
|
||||
else:
|
||||
lines.append(f"*{section_title}内容待填写*")
|
||||
|
||||
lines.append("")
|
||||
|
||||
# 添加元数据部分
|
||||
lines.append("---")
|
||||
lines.append("")
|
||||
lines.append("## 档案元数据")
|
||||
lines.append("")
|
||||
lines.append(f"- **角色类型**:{template['name']}")
|
||||
lines.append(f"- **创建时间**:{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
|
||||
lines.append(f"- **状态**:{'草稿' if character_data.get('status') != 'final' else '完成'}")
|
||||
lines.append(f"- **版本**:{character_data.get('version', '1.0')}")
|
||||
lines.append("")
|
||||
|
||||
markdown_content = "\n".join(lines)
|
||||
|
||||
if output_path:
|
||||
# 确保目录存在
|
||||
output_dir = os.path.dirname(output_path)
|
||||
if output_dir:
|
||||
os.makedirs(output_dir, exist_ok=True)
|
||||
|
||||
with open(output_path, 'w', encoding='utf-8') as f:
|
||||
f.write(markdown_content)
|
||||
|
||||
print(f"档案已生成:{output_path}")
|
||||
return output_path
|
||||
else:
|
||||
return markdown_content
|
||||
|
||||
def generate_enhanced_profile(self, character_data, require_confirmation=True):
|
||||
"""使用增强功能生成角色档案
|
||||
|
||||
Args:
|
||||
character_data: 角色数据字典,必须包含'name'字段
|
||||
require_confirmation: 是否需要用户确认
|
||||
|
||||
Returns:
|
||||
(是否成功, 最终文件路径, 冲突列表)
|
||||
"""
|
||||
if not self.enable_enhanced_features:
|
||||
logger.error("增强功能未启用,请指定workspace参数初始化生成器")
|
||||
return False, None, []
|
||||
|
||||
if 'name' not in character_data:
|
||||
raise ValueError("角色数据必须包含'name'字段")
|
||||
|
||||
# 初始化增强组件
|
||||
if self.lore_bible_manager is None:
|
||||
self._init_enhanced_components()
|
||||
|
||||
if not self.enable_enhanced_features:
|
||||
return False, None, []
|
||||
|
||||
try:
|
||||
from profile_session import ProfileSession, SessionConfig
|
||||
|
||||
# 更新会话配置
|
||||
self.session_config.character_name = character_data['name']
|
||||
self.session_config.require_confirmation = require_confirmation
|
||||
|
||||
# 创建会话
|
||||
session = ProfileSession(self.session_config)
|
||||
|
||||
# 生成基础markdown内容
|
||||
markdown_content = self.generate_markdown(character_data, output_path=None)
|
||||
|
||||
# 保存临时档案
|
||||
temp_path = session.save_temp_profile(markdown_content)
|
||||
if not temp_path:
|
||||
logger.error("保存临时档案失败")
|
||||
return False, None, []
|
||||
|
||||
# 验证和冲突检测
|
||||
is_valid, conflicts = session.validate_and_check_conflicts(character_data)
|
||||
|
||||
# 展示给用户
|
||||
if require_confirmation:
|
||||
user_confirmed = session.present_to_user(conflicts)
|
||||
if not user_confirmed:
|
||||
logger.info("用户取消创建")
|
||||
session.cancel()
|
||||
return False, None, conflicts
|
||||
else:
|
||||
logger.info("跳过用户确认")
|
||||
|
||||
# 确认并移动
|
||||
final_path = session.confirm_and_move()
|
||||
if not final_path:
|
||||
logger.error("移动档案失败")
|
||||
return False, None, conflicts
|
||||
|
||||
# 清理会话
|
||||
session.cleanup()
|
||||
|
||||
logger.info(f"角色档案创建成功: {final_path}")
|
||||
return True, final_path, conflicts
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"增强生成失败: {e}")
|
||||
return False, None, []
|
||||
|
||||
def create_from_cli(self):
|
||||
"""从命令行交互创建"""
|
||||
print("=== 人物档案生成器 ===")
|
||||
print("")
|
||||
|
||||
# 选择模板
|
||||
print("请选择角色类型:")
|
||||
print("1. 主角")
|
||||
print("2. 反派")
|
||||
print("3. 配角")
|
||||
print("4. 标准")
|
||||
|
||||
choice = input("请输入选择 (1-4,默认4): ").strip()
|
||||
type_map = {"1": "protagonist", "2": "antagonist", "3": "supporting", "4": "standard"}
|
||||
template_type = type_map.get(choice, "standard")
|
||||
|
||||
self.template_type = template_type
|
||||
print(f"使用模板:{self.templates[template_type]['name']}")
|
||||
print("")
|
||||
|
||||
# 收集基本信息
|
||||
character_data = {}
|
||||
print("请输入角色基本信息:")
|
||||
character_data['name'] = input("角色姓名: ").strip() or "未命名角色"
|
||||
character_data['age'] = input("年龄: ").strip() or "未知"
|
||||
character_data['gender'] = input("性别: ").strip() or "未指定"
|
||||
character_data['occupation'] = input("职业/身份: ").strip() or "未指定"
|
||||
character_data['role'] = input("故事中的角色: ").strip() or "未指定"
|
||||
|
||||
print("")
|
||||
print("其他信息将在生成的档案中以占位符形式出现,请后续编辑完善。")
|
||||
|
||||
# 生成文件名
|
||||
safe_name = "".join(c for c in character_data['name'] if c.isalnum() or c in (' ', '-', '_')).rstrip()
|
||||
filename = f"character_profile_{safe_name}_{datetime.now().strftime('%Y%m%d_%H%M%S')}.md"
|
||||
|
||||
# 选择输出路径
|
||||
default_output = os.path.join(os.getcwd(), filename)
|
||||
output_path = input(f"输出文件路径 (默认: {default_output}): ").strip() or default_output
|
||||
|
||||
# 生成档案
|
||||
try:
|
||||
result = self.generate_markdown(character_data, output_path)
|
||||
print("")
|
||||
print("✓ 人物档案生成成功!")
|
||||
print(f"文件位置: {result if isinstance(result, str) else output_path}")
|
||||
print("")
|
||||
print("下一步:")
|
||||
print("1. 使用文本编辑器打开生成的markdown文件")
|
||||
print("2. 根据模板提示填写详细信息")
|
||||
print("3. 保存并用于创作参考")
|
||||
|
||||
except Exception as e:
|
||||
print(f"生成失败: {e}")
|
||||
return 1
|
||||
|
||||
return 0
|
||||
|
||||
|
||||
def main():
|
||||
"""主函数"""
|
||||
if len(sys.argv) > 1:
|
||||
# 命令行参数模式
|
||||
import argparse
|
||||
|
||||
parser = argparse.ArgumentParser(description='生成人物档案markdown文件')
|
||||
parser.add_argument('--type', '-t', choices=['protagonist', 'antagonist', 'supporting', 'standard'],
|
||||
default='standard', help='角色类型')
|
||||
parser.add_argument('--name', '-n', required=True, help='角色姓名')
|
||||
parser.add_argument('--age', help='年龄')
|
||||
parser.add_argument('--gender', help='性别')
|
||||
parser.add_argument('--occupation', help='职业/身份')
|
||||
parser.add_argument('--role', help='故事中的角色')
|
||||
parser.add_argument('--output', '-o', help='输出文件路径')
|
||||
parser.add_argument('--workspace', '-w', help='工作目录路径,启用LoreBible管理功能')
|
||||
parser.add_argument('--no-confirm', action='store_true', help='跳过用户确认(仅增强模式)')
|
||||
parser.add_argument('--interactive', '-i', action='store_true', help='交互模式')
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
if args.interactive:
|
||||
# 交互模式,暂时不支持增强功能
|
||||
generator = CharacterProfileGenerator(args.type)
|
||||
return generator.create_from_cli()
|
||||
else:
|
||||
character_data = {
|
||||
'name': args.name,
|
||||
'age': args.age or '未知',
|
||||
'gender': args.gender or '未指定',
|
||||
'occupation': args.occupation or '未指定',
|
||||
'role': args.role or '未指定'
|
||||
}
|
||||
|
||||
# 检查是否启用增强模式
|
||||
if args.workspace:
|
||||
# 增强模式
|
||||
generator = CharacterProfileGenerator(args.type, workspace=args.workspace)
|
||||
|
||||
# 使用增强生成
|
||||
success, final_path, conflicts = generator.generate_enhanced_profile(
|
||||
character_data,
|
||||
require_confirmation=not args.no_confirm
|
||||
)
|
||||
|
||||
if success:
|
||||
print(f"✓ 角色档案创建成功: {final_path}")
|
||||
if conflicts:
|
||||
print(f" 检测到 {len(conflicts)} 个问题,已处理")
|
||||
return 0
|
||||
else:
|
||||
print(f"✗ 角色档案创建失败")
|
||||
if conflicts:
|
||||
print(f" 存在 {len(conflicts)} 个问题需要解决")
|
||||
return 1
|
||||
else:
|
||||
# 传统模式
|
||||
generator = CharacterProfileGenerator(args.type)
|
||||
|
||||
if args.output:
|
||||
output_path = args.output
|
||||
else:
|
||||
safe_name = "".join(c for c in args.name if c.isalnum() or c in (' ', '-', '_')).rstrip()
|
||||
filename = f"character_profile_{safe_name}_{datetime.now().strftime('%Y%m%d_%H%M%S')}.md"
|
||||
output_path = os.path.join(os.getcwd(), filename)
|
||||
|
||||
result = generator.generate_markdown(character_data, output_path)
|
||||
print(f"档案已生成: {output_path}")
|
||||
return 0
|
||||
else:
|
||||
# 交互模式
|
||||
generator = CharacterProfileGenerator()
|
||||
return generator.create_from_cli()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
sys.exit(main())
|
||||
445
skills/character-profile-cn/scripts/lore_bible_manager.py
Normal file
445
skills/character-profile-cn/scripts/lore_bible_manager.py
Normal file
@ -0,0 +1,445 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
LoreBible目录管理模块
|
||||
负责管理LoreBible目录结构、文件操作和现有角色扫描
|
||||
"""
|
||||
|
||||
import os
|
||||
import json
|
||||
import re
|
||||
from pathlib import Path
|
||||
from typing import Dict, List, Optional, Set, Tuple
|
||||
import logging
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class LoreBibleManager:
|
||||
"""LoreBible目录管理器"""
|
||||
|
||||
# 标准目录结构
|
||||
DEFAULT_DIRECTORY_STRUCTURE = {
|
||||
"00_Prepare": "临时档案目录",
|
||||
"01_Research": "研究资料目录",
|
||||
"02_LoreBible": {
|
||||
"Characters": "角色档案目录",
|
||||
"Locations": "地点设定目录",
|
||||
"Organizations": "组织设定目录",
|
||||
"Timeline": "时间线目录"
|
||||
}
|
||||
}
|
||||
|
||||
def __init__(self, workspace: str):
|
||||
"""初始化LoreBible管理器
|
||||
|
||||
Args:
|
||||
workspace: 工作目录路径
|
||||
"""
|
||||
self.workspace = Path(workspace).resolve()
|
||||
self.characters_dir = self.workspace / "02_LoreBible" / "Characters"
|
||||
self.prepare_dir = self.workspace / "00_Prepare"
|
||||
self._character_index = None # 角色信息索引缓存
|
||||
|
||||
def validate_directory_structure(self) -> Tuple[bool, List[str]]:
|
||||
"""验证目录结构是否符合标准
|
||||
|
||||
Returns:
|
||||
(是否有效, 缺失目录列表)
|
||||
"""
|
||||
missing_dirs = []
|
||||
|
||||
# 检查必需目录
|
||||
required_dirs = [
|
||||
self.workspace,
|
||||
self.characters_dir,
|
||||
self.prepare_dir
|
||||
]
|
||||
|
||||
for dir_path in required_dirs:
|
||||
if not dir_path.exists():
|
||||
missing_dirs.append(str(dir_path.relative_to(self.workspace)))
|
||||
|
||||
return len(missing_dirs) == 0, missing_dirs
|
||||
|
||||
def create_directory_structure(self) -> bool:
|
||||
"""创建缺失的目录结构
|
||||
|
||||
Returns:
|
||||
是否成功创建
|
||||
"""
|
||||
try:
|
||||
# 创建必需目录
|
||||
self.characters_dir.mkdir(parents=True, exist_ok=True)
|
||||
self.prepare_dir.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
# 创建可选目录
|
||||
optional_dirs = [
|
||||
self.workspace / "01_Research",
|
||||
self.workspace / "02_LoreBible" / "Locations",
|
||||
self.workspace / "02_LoreBible" / "Organizations",
|
||||
self.workspace / "02_LoreBible" / "Timeline"
|
||||
]
|
||||
|
||||
for dir_path in optional_dirs:
|
||||
dir_path.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
logger.info(f"目录结构已创建在: {self.workspace}")
|
||||
return True
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"创建目录结构失败: {e}")
|
||||
return False
|
||||
|
||||
def scan_existing_characters(self) -> List[Dict]:
|
||||
"""扫描现有角色档案
|
||||
|
||||
Returns:
|
||||
角色信息列表
|
||||
"""
|
||||
if not self.characters_dir.exists():
|
||||
return []
|
||||
|
||||
characters = []
|
||||
pattern = re.compile(r'\.md$', re.IGNORECASE)
|
||||
|
||||
for file_path in self.characters_dir.glob("*.md"):
|
||||
try:
|
||||
character_info = self._parse_character_file(file_path)
|
||||
if character_info:
|
||||
characters.append(character_info)
|
||||
except Exception as e:
|
||||
logger.warning(f"解析角色文件失败 {file_path}: {e}")
|
||||
|
||||
return characters
|
||||
|
||||
def _parse_character_file(self, file_path: Path) -> Optional[Dict]:
|
||||
"""解析单个角色档案文件
|
||||
|
||||
Args:
|
||||
file_path: 角色档案文件路径
|
||||
|
||||
Returns:
|
||||
角色信息字典,解析失败返回None
|
||||
"""
|
||||
try:
|
||||
content = file_path.read_text(encoding='utf-8', errors='ignore')
|
||||
|
||||
# 提取基本信息
|
||||
info = {
|
||||
"file_path": str(file_path),
|
||||
"file_name": file_path.name,
|
||||
"file_size": file_path.stat().st_size,
|
||||
"last_modified": file_path.stat().st_mtime
|
||||
}
|
||||
|
||||
# 提取角色姓名(从标题行)
|
||||
name_match = re.search(r'^#\s+(.+?)\s+-', content, re.MULTILINE)
|
||||
if name_match:
|
||||
info["name"] = name_match.group(1).strip()
|
||||
else:
|
||||
# 尝试从文件名提取
|
||||
info["name"] = file_path.stem.replace('character_profile_', '').replace('_', ' ')
|
||||
|
||||
# 提取年龄
|
||||
age_match = re.search(r'- \*\*年龄\*\*[::]\s*(.+?)(?:\n|$)', content)
|
||||
if age_match:
|
||||
info["age"] = age_match.group(1).strip()
|
||||
|
||||
# 提取性别
|
||||
gender_match = re.search(r'- \*\*性别\*\*[::]\s*(.+?)(?:\n|$)', content)
|
||||
if gender_match:
|
||||
info["gender"] = gender_match.group(1).strip()
|
||||
|
||||
# 提取职业/身份
|
||||
occupation_match = re.search(r'- \*\*职业/身份\*\*[::]\s*(.+?)(?:\n|$)', content)
|
||||
if occupation_match:
|
||||
info["occupation"] = occupation_match.group(1).strip()
|
||||
|
||||
# 提取故事中的角色
|
||||
role_match = re.search(r'- \*\*故事中的角色\*\*[::]\s*(.+?)(?:\n|$)', content)
|
||||
if role_match:
|
||||
info["role"] = role_match.group(1).strip()
|
||||
|
||||
# 提取角色类型(从元数据)
|
||||
type_match = re.search(r'- \*\*角色类型\*\*[::]\s*(.+?)(?:\n|$)', content)
|
||||
if type_match:
|
||||
info["character_type"] = type_match.group(1).strip()
|
||||
|
||||
# 提取创建时间
|
||||
created_match = re.search(r'- \*\*创建时间\*\*[::]\s*(.+?)(?:\n|$)', content)
|
||||
if created_match:
|
||||
info["created"] = created_match.group(1).strip()
|
||||
|
||||
# 提取状态
|
||||
status_match = re.search(r'- \*\*状态\*\*[::]\s*(.+?)(?:\n|$)', content)
|
||||
if status_match:
|
||||
info["status"] = status_match.group(1).strip()
|
||||
|
||||
# 提取关系信息(简单提取)
|
||||
relationships_section = self._extract_section(content, "人物关系")
|
||||
if relationships_section:
|
||||
info["has_relationships"] = True
|
||||
# 可以进一步解析具体关系
|
||||
|
||||
# 提取背景故事
|
||||
background_section = self._extract_section(content, "背景故事")
|
||||
if background_section:
|
||||
info["has_background"] = True
|
||||
|
||||
return info
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"解析角色文件失败 {file_path}: {e}")
|
||||
return None
|
||||
|
||||
def _extract_section(self, content: str, section_title: str) -> Optional[str]:
|
||||
"""提取指定章节内容
|
||||
|
||||
Args:
|
||||
content: 文档内容
|
||||
section_title: 章节标题
|
||||
|
||||
Returns:
|
||||
章节内容,未找到返回None
|
||||
"""
|
||||
# 寻找章节标题
|
||||
pattern = rf'##\s+{re.escape(section_title)}(.*?)(?=##\s+|---|\Z)'
|
||||
match = re.search(pattern, content, re.DOTALL | re.IGNORECASE)
|
||||
|
||||
if match:
|
||||
return match.group(1).strip()
|
||||
return None
|
||||
|
||||
def get_character_index(self, force_refresh: bool = False) -> Dict:
|
||||
"""获取角色信息索引(带缓存)
|
||||
|
||||
Args:
|
||||
force_refresh: 是否强制刷新缓存
|
||||
|
||||
Returns:
|
||||
角色索引字典
|
||||
"""
|
||||
if self._character_index is None or force_refresh:
|
||||
characters = self.scan_existing_characters()
|
||||
self._character_index = {
|
||||
"total_count": len(characters),
|
||||
"characters": characters,
|
||||
"name_map": {char.get("name", ""): char for char in characters if char.get("name")},
|
||||
"by_type": self._group_by_type(characters),
|
||||
"last_updated": os.path.getmtime(self.characters_dir) if self.characters_dir.exists() else 0
|
||||
}
|
||||
|
||||
return self._character_index
|
||||
|
||||
def _group_by_type(self, characters: List[Dict]) -> Dict:
|
||||
"""按角色类型分组
|
||||
|
||||
Args:
|
||||
characters: 角色列表
|
||||
|
||||
Returns:
|
||||
按类型分组的字典
|
||||
"""
|
||||
grouped = {}
|
||||
for char in characters:
|
||||
char_type = char.get("character_type", "未知")
|
||||
if char_type not in grouped:
|
||||
grouped[char_type] = []
|
||||
grouped[char_type].append(char)
|
||||
return grouped
|
||||
|
||||
def save_temp_profile(self, content: str, character_name: str, session_id: str = None) -> Optional[Path]:
|
||||
"""保存临时档案到00_Prepare目录
|
||||
|
||||
Args:
|
||||
content: 档案内容
|
||||
character_name: 角色名称
|
||||
session_id: 会话ID,为None时自动生成
|
||||
|
||||
Returns:
|
||||
临时文件路径,失败返回None
|
||||
"""
|
||||
try:
|
||||
if not self.prepare_dir.exists():
|
||||
self.prepare_dir.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
# 生成会话ID
|
||||
import uuid
|
||||
if session_id is None:
|
||||
session_id = str(uuid.uuid4())[:8]
|
||||
|
||||
# 安全文件名
|
||||
safe_name = re.sub(r'[^\w\s-]', '', character_name).strip()
|
||||
safe_name = re.sub(r'[-\s]+', '_', safe_name)
|
||||
|
||||
# 临时文件名
|
||||
filename = f"temp_{safe_name}_{session_id}.md"
|
||||
temp_path = self.prepare_dir / filename
|
||||
|
||||
# 写入文件
|
||||
temp_path.write_text(content, encoding='utf-8')
|
||||
logger.info(f"临时档案已保存: {temp_path}")
|
||||
|
||||
return temp_path
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"保存临时档案失败: {e}")
|
||||
return None
|
||||
|
||||
def move_to_characters(self, temp_file_path: Path, character_name: str = None) -> Optional[Path]:
|
||||
"""将临时档案移动到Characters目录
|
||||
|
||||
Args:
|
||||
temp_file_path: 临时文件路径
|
||||
character_name: 角色名称,为None时从文件内容提取
|
||||
|
||||
Returns:
|
||||
最终文件路径,失败返回None
|
||||
"""
|
||||
try:
|
||||
if not temp_file_path.exists():
|
||||
logger.error(f"临时文件不存在: {temp_file_path}")
|
||||
return None
|
||||
|
||||
# 确保目标目录存在
|
||||
if not self.characters_dir.exists():
|
||||
self.characters_dir.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
# 读取内容提取角色名
|
||||
if character_name is None:
|
||||
content = temp_file_path.read_text(encoding='utf-8', errors='ignore')
|
||||
name_match = re.search(r'^#\s+(.+?)\s+-', content, re.MULTILINE)
|
||||
if name_match:
|
||||
character_name = name_match.group(1).strip()
|
||||
else:
|
||||
character_name = temp_file_path.stem.replace('temp_', '').split('_')[0]
|
||||
|
||||
# 安全文件名
|
||||
safe_name = re.sub(r'[^\w\s-]', '', character_name).strip()
|
||||
safe_name = re.sub(r'[-\s]+', '_', safe_name)
|
||||
|
||||
# 最终文件名
|
||||
import datetime
|
||||
timestamp = datetime.datetime.now().strftime('%Y%m%d_%H%M%S')
|
||||
filename = f"character_profile_{safe_name}_{timestamp}.md"
|
||||
final_path = self.characters_dir / filename
|
||||
|
||||
# 移动文件
|
||||
temp_file_path.rename(final_path)
|
||||
logger.info(f"档案已移动到: {final_path}")
|
||||
|
||||
# 刷新缓存
|
||||
self._character_index = None
|
||||
|
||||
return final_path
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"移动档案失败: {e}")
|
||||
return None
|
||||
|
||||
def cleanup_old_temp_files(self, max_age_hours: int = 24) -> int:
|
||||
"""清理旧的临时文件
|
||||
|
||||
Args:
|
||||
max_age_hours: 最大保留时间(小时)
|
||||
|
||||
Returns:
|
||||
清理的文件数量
|
||||
"""
|
||||
if not self.prepare_dir.exists():
|
||||
return 0
|
||||
|
||||
import time
|
||||
current_time = time.time()
|
||||
max_age_seconds = max_age_hours * 3600
|
||||
|
||||
cleaned_count = 0
|
||||
|
||||
for file_path in self.prepare_dir.glob("temp_*.md"):
|
||||
try:
|
||||
file_age = current_time - file_path.stat().st_mtime
|
||||
if file_age > max_age_seconds:
|
||||
file_path.unlink()
|
||||
cleaned_count += 1
|
||||
logger.debug(f"清理临时文件: {file_path}")
|
||||
except Exception as e:
|
||||
logger.warning(f"清理文件失败 {file_path}: {e}")
|
||||
|
||||
if cleaned_count > 0:
|
||||
logger.info(f"清理了 {cleaned_count} 个临时文件")
|
||||
|
||||
return cleaned_count
|
||||
|
||||
def get_workspace_info(self) -> Dict:
|
||||
"""获取工作空间信息
|
||||
|
||||
Returns:
|
||||
工作空间信息字典
|
||||
"""
|
||||
info = {
|
||||
"workspace": str(self.workspace),
|
||||
"characters_dir": str(self.characters_dir),
|
||||
"prepare_dir": str(self.prepare_dir),
|
||||
"characters_count": 0,
|
||||
"temp_files_count": 0,
|
||||
"directory_exists": self.workspace.exists()
|
||||
}
|
||||
|
||||
if self.characters_dir.exists():
|
||||
info["characters_count"] = len(list(self.characters_dir.glob("*.md")))
|
||||
|
||||
if self.prepare_dir.exists():
|
||||
info["temp_files_count"] = len(list(self.prepare_dir.glob("temp_*.md")))
|
||||
|
||||
return info
|
||||
|
||||
|
||||
def main():
|
||||
"""命令行测试"""
|
||||
import sys
|
||||
|
||||
if len(sys.argv) < 2:
|
||||
print("用法: python lore_bible_manager.py <工作目录>")
|
||||
sys.exit(1)
|
||||
|
||||
workspace = sys.argv[1]
|
||||
manager = LoreBibleManager(workspace)
|
||||
|
||||
print(f"工作目录: {workspace}")
|
||||
|
||||
# 验证目录结构
|
||||
is_valid, missing_dirs = manager.validate_directory_structure()
|
||||
if is_valid:
|
||||
print("✓ 目录结构完整")
|
||||
else:
|
||||
print("✗ 缺失目录:")
|
||||
for dir_name in missing_dirs:
|
||||
print(f" - {dir_name}")
|
||||
|
||||
# 询问是否创建
|
||||
response = input("是否创建缺失目录? (y/n): ").strip().lower()
|
||||
if response == 'y':
|
||||
if manager.create_directory_structure():
|
||||
print("✓ 目录结构已创建")
|
||||
else:
|
||||
print("✗ 创建目录失败")
|
||||
|
||||
# 扫描现有角色
|
||||
characters = manager.scan_existing_characters()
|
||||
print(f"现有角色数量: {len(characters)}")
|
||||
|
||||
for char in characters[:5]: # 显示前5个
|
||||
print(f" - {char.get('name', '未知')} ({char.get('character_type', '未知类型')})")
|
||||
|
||||
if len(characters) > 5:
|
||||
print(f" ... 还有 {len(characters) - 5} 个角色")
|
||||
|
||||
# 显示工作空间信息
|
||||
info = manager.get_workspace_info()
|
||||
print(f"\n工作空间信息:")
|
||||
print(f" 角色档案数: {info['characters_count']}")
|
||||
print(f" 临时文件数: {info['temp_files_count']}")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
591
skills/character-profile-cn/scripts/profile_session.py
Normal file
591
skills/character-profile-cn/scripts/profile_session.py
Normal file
@ -0,0 +1,591 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
会话管理模块
|
||||
管理角色创建会话、临时文件和用户确认流程
|
||||
"""
|
||||
|
||||
import json
|
||||
import uuid
|
||||
import time
|
||||
from pathlib import Path
|
||||
from typing import Dict, List, Optional, Tuple, Any
|
||||
from datetime import datetime
|
||||
import logging
|
||||
from dataclasses import dataclass, asdict, field
|
||||
from enum import Enum
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class SessionStatus(Enum):
|
||||
"""会话状态"""
|
||||
CREATED = "created" # 已创建
|
||||
TEMP_SAVED = "temp_saved" # 临时文件已保存
|
||||
VALIDATED = "validated" # 已校验
|
||||
CONFLICTS_DETECTED = "conflicts_detected" # 检测到冲突
|
||||
USER_REVIEWED = "user_reviewed" # 用户已审核
|
||||
CONFIRMED = "confirmed" # 用户已确认
|
||||
MOVED = "moved" # 已移动到最终目录
|
||||
CANCELLED = "cancelled" # 已取消
|
||||
ERROR = "error" # 错误状态
|
||||
|
||||
|
||||
@dataclass
|
||||
class SessionConfig:
|
||||
"""会话配置"""
|
||||
workspace: str
|
||||
character_name: str
|
||||
template_type: str = "standard"
|
||||
auto_cleanup: bool = True
|
||||
max_temp_age_hours: int = 24
|
||||
enable_validation: bool = True
|
||||
enable_conflict_check: bool = True
|
||||
require_confirmation: bool = True
|
||||
|
||||
|
||||
@dataclass
|
||||
class SessionData:
|
||||
"""会话数据"""
|
||||
session_id: str
|
||||
config: SessionConfig
|
||||
status: SessionStatus = SessionStatus.CREATED
|
||||
created_at: float = field(default_factory=time.time)
|
||||
updated_at: float = field(default_factory=time.time)
|
||||
temp_file_path: Optional[str] = None
|
||||
final_file_path: Optional[str] = None
|
||||
conflicts: List[Dict] = field(default_factory=list)
|
||||
validation_results: List[Dict] = field(default_factory=list)
|
||||
user_notes: str = ""
|
||||
metadata: Dict[str, Any] = field(default_factory=dict)
|
||||
|
||||
|
||||
class ProfileSession:
|
||||
"""角色创建会话管理器"""
|
||||
|
||||
def __init__(self, config: SessionConfig):
|
||||
"""初始化会话
|
||||
|
||||
Args:
|
||||
config: 会话配置
|
||||
"""
|
||||
self.config = config
|
||||
self.session_id = str(uuid.uuid4())[:8]
|
||||
self.session_data = SessionData(
|
||||
session_id=self.session_id,
|
||||
config=config
|
||||
)
|
||||
self.workspace_path = Path(config.workspace).resolve()
|
||||
self.session_file = self.workspace_path / ".sessions" / f"session_{self.session_id}.json"
|
||||
|
||||
# 确保会话目录存在
|
||||
self.session_file.parent.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
logger.info(f"创建会话: {self.session_id} - {config.character_name}")
|
||||
|
||||
def save_temp_profile(self, content: str) -> Optional[Path]:
|
||||
"""保存临时档案
|
||||
|
||||
Args:
|
||||
content: 档案内容
|
||||
|
||||
Returns:
|
||||
临时文件路径
|
||||
"""
|
||||
try:
|
||||
from lore_bible_manager import LoreBibleManager
|
||||
manager = LoreBibleManager(self.config.workspace)
|
||||
|
||||
# 确保目录存在
|
||||
manager.create_directory_structure()
|
||||
|
||||
# 保存临时文件
|
||||
temp_path = manager.save_temp_profile(
|
||||
content=content,
|
||||
character_name=self.config.character_name,
|
||||
session_id=self.session_id
|
||||
)
|
||||
|
||||
if temp_path:
|
||||
self.session_data.temp_file_path = str(temp_path)
|
||||
self.session_data.status = SessionStatus.TEMP_SAVED
|
||||
self._update_timestamp()
|
||||
self._save_session_data()
|
||||
|
||||
logger.info(f"临时档案已保存: {temp_path}")
|
||||
return temp_path
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"保存临时档案失败: {e}")
|
||||
self.session_data.status = SessionStatus.ERROR
|
||||
self.session_data.metadata["error"] = str(e)
|
||||
self._save_session_data()
|
||||
|
||||
return None
|
||||
|
||||
def validate_and_check_conflicts(self, character_data: Dict) -> Tuple[bool, List[Dict]]:
|
||||
"""验证角色并检查冲突
|
||||
|
||||
Args:
|
||||
character_data: 角色数据
|
||||
|
||||
Returns:
|
||||
(是否有效, 冲突列表)
|
||||
"""
|
||||
if not self.config.enable_validation and not self.config.enable_conflict_check:
|
||||
return True, []
|
||||
|
||||
try:
|
||||
from lore_bible_manager import LoreBibleManager
|
||||
from conflict_detector import ConflictDetector, ConflictSeverity
|
||||
|
||||
manager = LoreBibleManager(self.config.workspace)
|
||||
detector = ConflictDetector()
|
||||
|
||||
# 获取现有角色
|
||||
existing_characters = manager.scan_existing_characters()
|
||||
|
||||
# 设置角色索引
|
||||
detector.set_character_index({
|
||||
"characters": existing_characters,
|
||||
"total_count": len(existing_characters)
|
||||
})
|
||||
|
||||
# 检测冲突
|
||||
conflicts = []
|
||||
if self.config.enable_conflict_check:
|
||||
conflicts = detector.detect_conflicts(character_data, existing_characters)
|
||||
|
||||
# 验证角色
|
||||
is_valid = True
|
||||
if self.config.enable_validation:
|
||||
valid, validation_conflicts = detector.validate_character(character_data)
|
||||
if not valid:
|
||||
is_valid = False
|
||||
conflicts.extend(validation_conflicts)
|
||||
|
||||
# 更新会话数据
|
||||
self.session_data.conflicts = [asdict(conflict) if hasattr(conflict, '__dataclass_fields__') else conflict
|
||||
for conflict in conflicts]
|
||||
self.session_data.validation_results = [{"valid": is_valid}]
|
||||
|
||||
if conflicts:
|
||||
self.session_data.status = SessionStatus.CONFLICTS_DETECTED
|
||||
else:
|
||||
self.session_data.status = SessionStatus.VALIDATED
|
||||
|
||||
self._update_timestamp()
|
||||
self._save_session_data()
|
||||
|
||||
logger.info(f"验证完成: 有效={is_valid}, 冲突数={len(conflicts)}")
|
||||
return is_valid, conflicts
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"验证失败: {e}")
|
||||
self.session_data.status = SessionStatus.ERROR
|
||||
self.session_data.metadata["error"] = str(e)
|
||||
self._save_session_data()
|
||||
return False, []
|
||||
|
||||
def present_to_user(self, conflicts: List[Dict]) -> bool:
|
||||
"""向用户展示结果并获取反馈
|
||||
|
||||
Args:
|
||||
conflicts: 冲突列表
|
||||
|
||||
Returns:
|
||||
用户是否确认继续
|
||||
"""
|
||||
print(f"\n{'='*60}")
|
||||
print(f"角色创建会话: {self.session_id}")
|
||||
print(f"角色名称: {self.config.character_name}")
|
||||
print(f"工作目录: {self.config.workspace}")
|
||||
print(f"{'='*60}\n")
|
||||
|
||||
# 显示临时文件位置
|
||||
if self.session_data.temp_file_path:
|
||||
print(f"临时档案: {self.session_data.temp_file_path}")
|
||||
print("")
|
||||
|
||||
# 显示冲突和警告
|
||||
if conflicts:
|
||||
print("⚠️ 检测到以下问题:")
|
||||
|
||||
# 按严重程度分组
|
||||
errors = [c for c in conflicts if c.get("severity") == "error"]
|
||||
warnings = [c for c in conflicts if c.get("severity") == "warning"]
|
||||
infos = [c for c in conflicts if c.get("severity") == "info"]
|
||||
|
||||
if errors:
|
||||
print("\n❌ 错误:")
|
||||
for i, conflict in enumerate(errors, 1):
|
||||
print(f" {i}. {conflict.get('message', '未知错误')}")
|
||||
if conflict.get('suggested_fixes'):
|
||||
print(f" 建议: {conflict['suggested_fixes'][0]}")
|
||||
|
||||
if warnings:
|
||||
print("\n⚠️ 警告:")
|
||||
for i, conflict in enumerate(warnings, 1):
|
||||
print(f" {i}. {conflict.get('message', '未知警告')}")
|
||||
|
||||
if infos:
|
||||
print("\nℹ️ 提示:")
|
||||
for i, conflict in enumerate(infos, 1):
|
||||
print(f" {i}. {conflict.get('message', '未知提示')}")
|
||||
|
||||
print("")
|
||||
|
||||
# 询问用户
|
||||
if errors:
|
||||
print("存在错误,无法继续。请修改角色设定后重试。")
|
||||
return False
|
||||
else:
|
||||
response = input("是否继续创建角色? (y/n): ").strip().lower()
|
||||
if response == 'y':
|
||||
notes = input("请输入备注(可选,直接回车跳过): ").strip()
|
||||
if notes:
|
||||
self.session_data.user_notes = notes
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
else:
|
||||
print("✓ 未检测到冲突")
|
||||
print("")
|
||||
|
||||
if self.config.require_confirmation:
|
||||
response = input("是否创建角色? (y/n): ").strip().lower()
|
||||
if response == 'y':
|
||||
notes = input("请输入备注(可选,直接回车跳过): ").strip()
|
||||
if notes:
|
||||
self.session_data.user_notes = notes
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
else:
|
||||
return True
|
||||
|
||||
def confirm_and_move(self) -> Optional[Path]:
|
||||
"""用户确认后移动到最终目录
|
||||
|
||||
Returns:
|
||||
最终文件路径
|
||||
"""
|
||||
try:
|
||||
if not self.session_data.temp_file_path:
|
||||
logger.error("临时文件路径不存在")
|
||||
return None
|
||||
|
||||
temp_path = Path(self.session_data.temp_file_path)
|
||||
if not temp_path.exists():
|
||||
logger.error(f"临时文件不存在: {temp_path}")
|
||||
return None
|
||||
|
||||
from lore_bible_manager import LoreBibleManager
|
||||
manager = LoreBibleManager(self.config.workspace)
|
||||
|
||||
# 移动文件
|
||||
final_path = manager.move_to_characters(temp_path, self.config.character_name)
|
||||
|
||||
if final_path:
|
||||
self.session_data.final_file_path = str(final_path)
|
||||
self.session_data.status = SessionStatus.MOVED
|
||||
self._update_timestamp()
|
||||
self._save_session_data()
|
||||
|
||||
logger.info(f"档案已移动到: {final_path}")
|
||||
return final_path
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"移动档案失败: {e}")
|
||||
self.session_data.status = SessionStatus.ERROR
|
||||
self.session_data.metadata["error"] = str(e)
|
||||
self._save_session_data()
|
||||
|
||||
return None
|
||||
|
||||
def cancel(self) -> bool:
|
||||
"""取消会话并清理临时文件
|
||||
|
||||
Returns:
|
||||
是否成功取消
|
||||
"""
|
||||
try:
|
||||
# 删除临时文件
|
||||
if self.session_data.temp_file_path:
|
||||
temp_path = Path(self.session_data.temp_file_path)
|
||||
if temp_path.exists():
|
||||
temp_path.unlink()
|
||||
logger.info(f"已删除临时文件: {temp_path}")
|
||||
|
||||
# 更新状态
|
||||
self.session_data.status = SessionStatus.CANCELLED
|
||||
self._update_timestamp()
|
||||
self._save_session_data()
|
||||
|
||||
logger.info(f"会话已取消: {self.session_id}")
|
||||
return True
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"取消会话失败: {e}")
|
||||
return False
|
||||
|
||||
def cleanup(self) -> bool:
|
||||
"""清理会话文件
|
||||
|
||||
Returns:
|
||||
是否成功清理
|
||||
"""
|
||||
try:
|
||||
if self.session_file.exists():
|
||||
self.session_file.unlink()
|
||||
logger.info(f"已删除会话文件: {self.session_file}")
|
||||
|
||||
# 清理旧的临时文件
|
||||
if self.config.auto_cleanup:
|
||||
from lore_bible_manager import LoreBibleManager
|
||||
manager = LoreBibleManager(self.config.workspace)
|
||||
cleaned = manager.cleanup_old_temp_files(self.config.max_temp_age_hours)
|
||||
logger.info(f"清理了 {cleaned} 个临时文件")
|
||||
|
||||
return True
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"清理失败: {e}")
|
||||
return False
|
||||
|
||||
def get_status_report(self) -> Dict:
|
||||
"""获取状态报告
|
||||
|
||||
Returns:
|
||||
状态报告字典
|
||||
"""
|
||||
report = {
|
||||
"session_id": self.session_id,
|
||||
"character_name": self.config.character_name,
|
||||
"status": self.session_data.status.value,
|
||||
"created_at": datetime.fromtimestamp(self.session_data.created_at).isoformat(),
|
||||
"updated_at": datetime.fromtimestamp(self.session_data.updated_at).isoformat(),
|
||||
"temp_file": self.session_data.temp_file_path,
|
||||
"final_file": self.session_data.final_file_path,
|
||||
"conflict_count": len(self.session_data.conflicts),
|
||||
"user_notes": self.session_data.user_notes,
|
||||
"workspace": self.config.workspace
|
||||
}
|
||||
|
||||
# 添加冲突摘要
|
||||
if self.session_data.conflicts:
|
||||
error_count = len([c for c in self.session_data.conflicts if c.get("severity") == "error"])
|
||||
warning_count = len([c for c in self.session_data.conflicts if c.get("severity") == "warning"])
|
||||
report["conflict_summary"] = {
|
||||
"errors": error_count,
|
||||
"warnings": warning_count
|
||||
}
|
||||
|
||||
return report
|
||||
|
||||
def _save_session_data(self):
|
||||
"""保存会话数据到文件"""
|
||||
try:
|
||||
data = asdict(self.session_data)
|
||||
# 将枚举转换为字符串
|
||||
data["status"] = self.session_data.status.value
|
||||
|
||||
with open(self.session_file, 'w', encoding='utf-8') as f:
|
||||
json.dump(data, f, ensure_ascii=False, indent=2, default=str)
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"保存会话数据失败: {e}")
|
||||
|
||||
def _update_timestamp(self):
|
||||
"""更新时间戳"""
|
||||
self.session_data.updated_at = time.time()
|
||||
|
||||
@classmethod
|
||||
def load_session(cls, session_id: str, workspace: str) -> Optional["ProfileSession"]:
|
||||
"""加载现有会话
|
||||
|
||||
Args:
|
||||
session_id: 会话ID
|
||||
workspace: 工作目录
|
||||
|
||||
Returns:
|
||||
会话实例,加载失败返回None
|
||||
"""
|
||||
try:
|
||||
workspace_path = Path(workspace).resolve()
|
||||
session_file = workspace_path / ".sessions" / f"session_{session_id}.json"
|
||||
|
||||
if not session_file.exists():
|
||||
logger.error(f"会话文件不存在: {session_file}")
|
||||
return None
|
||||
|
||||
with open(session_file, 'r', encoding='utf-8') as f:
|
||||
data = json.load(f)
|
||||
|
||||
# 重建配置
|
||||
config_data = data.get("config", {})
|
||||
config = SessionConfig(**config_data)
|
||||
|
||||
# 创建会话实例
|
||||
session = cls(config)
|
||||
session.session_id = session_id
|
||||
session.session_file = session_file
|
||||
|
||||
# 重建会话数据
|
||||
session.session_data = SessionData(
|
||||
session_id=session_id,
|
||||
config=config,
|
||||
status=SessionStatus(data.get("status", "created")),
|
||||
created_at=data.get("created_at", time.time()),
|
||||
updated_at=data.get("updated_at", time.time()),
|
||||
temp_file_path=data.get("temp_file_path"),
|
||||
final_file_path=data.get("final_file_path"),
|
||||
conflicts=data.get("conflicts", []),
|
||||
validation_results=data.get("validation_results", []),
|
||||
user_notes=data.get("user_notes", ""),
|
||||
metadata=data.get("metadata", {})
|
||||
)
|
||||
|
||||
logger.info(f"已加载会话: {session_id}")
|
||||
return session
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"加载会话失败: {e}")
|
||||
return None
|
||||
|
||||
@classmethod
|
||||
def list_sessions(cls, workspace: str, active_only: bool = True) -> List[Dict]:
|
||||
"""列出所有会话
|
||||
|
||||
Args:
|
||||
workspace: 工作目录
|
||||
active_only: 是否只显示活动会话
|
||||
|
||||
Returns:
|
||||
会话列表
|
||||
"""
|
||||
sessions = []
|
||||
workspace_path = Path(workspace).resolve()
|
||||
sessions_dir = workspace_path / ".sessions"
|
||||
|
||||
if not sessions_dir.exists():
|
||||
return sessions
|
||||
|
||||
for session_file in sessions_dir.glob("session_*.json"):
|
||||
try:
|
||||
with open(session_file, 'r', encoding='utf-8') as f:
|
||||
data = json.load(f)
|
||||
|
||||
session_id = session_file.stem.replace("session_", "")
|
||||
status = data.get("status", "created")
|
||||
|
||||
# 如果只显示活动会话,跳过已完成/取消的
|
||||
if active_only and status in ["moved", "cancelled", "error"]:
|
||||
continue
|
||||
|
||||
sessions.append({
|
||||
"session_id": session_id,
|
||||
"character_name": data.get("config", {}).get("character_name", "未知"),
|
||||
"status": status,
|
||||
"created_at": data.get("created_at"),
|
||||
"temp_file": data.get("temp_file_path"),
|
||||
"final_file": data.get("final_file_path")
|
||||
})
|
||||
|
||||
except Exception as e:
|
||||
logger.warning(f"读取会话文件失败 {session_file}: {e}")
|
||||
|
||||
# 按创建时间排序
|
||||
sessions.sort(key=lambda x: x.get("created_at", 0), reverse=True)
|
||||
return sessions
|
||||
|
||||
|
||||
def main():
|
||||
"""命令行测试"""
|
||||
import sys
|
||||
|
||||
if len(sys.argv) < 3:
|
||||
print("用法: python profile_session.py <工作目录> <角色姓名>")
|
||||
print("可选参数: --template <模板类型> --no-confirm")
|
||||
sys.exit(1)
|
||||
|
||||
workspace = sys.argv[1]
|
||||
character_name = sys.argv[2]
|
||||
|
||||
# 解析可选参数
|
||||
template_type = "standard"
|
||||
require_confirmation = True
|
||||
|
||||
i = 3
|
||||
while i < len(sys.argv):
|
||||
if sys.argv[i] == "--template" and i + 1 < len(sys.argv):
|
||||
template_type = sys.argv[i + 1]
|
||||
i += 2
|
||||
elif sys.argv[i] == "--no-confirm":
|
||||
require_confirmation = False
|
||||
i += 1
|
||||
else:
|
||||
i += 1
|
||||
|
||||
# 创建配置
|
||||
config = SessionConfig(
|
||||
workspace=workspace,
|
||||
character_name=character_name,
|
||||
template_type=template_type,
|
||||
require_confirmation=require_confirmation
|
||||
)
|
||||
|
||||
# 创建会话
|
||||
session = ProfileSession(config)
|
||||
print(f"创建会话: {session.session_id}")
|
||||
|
||||
# 模拟角色数据
|
||||
character_data = {
|
||||
"name": character_name,
|
||||
"age": "25",
|
||||
"gender": "男",
|
||||
"occupation": "剑士",
|
||||
"role": "主角"
|
||||
}
|
||||
|
||||
# 模拟档案内容
|
||||
profile_content = f"""# {character_name} - 角色档案
|
||||
|
||||
## 基本信息
|
||||
- **姓名**: {character_name}
|
||||
- **年龄**: 25
|
||||
- **性别**: 男
|
||||
- **职业/身份**: 剑士
|
||||
- **故事中的角色**: 主角
|
||||
"""
|
||||
|
||||
# 保存临时档案
|
||||
temp_path = session.save_temp_profile(profile_content)
|
||||
if temp_path:
|
||||
print(f"临时档案已保存: {temp_path}")
|
||||
|
||||
# 验证和冲突检测
|
||||
is_valid, conflicts = session.validate_and_check_conflicts(character_data)
|
||||
print(f"验证结果: {'有效' if is_valid else '无效'}, 冲突数: {len(conflicts)}")
|
||||
|
||||
# 展示给用户
|
||||
if session.present_to_user(conflicts):
|
||||
print("用户确认继续")
|
||||
|
||||
# 确认并移动
|
||||
final_path = session.confirm_and_move()
|
||||
if final_path:
|
||||
print(f"档案已保存到: {final_path}")
|
||||
else:
|
||||
print("保存失败")
|
||||
else:
|
||||
print("用户取消")
|
||||
session.cancel()
|
||||
|
||||
# 显示状态报告
|
||||
report = session.get_status_report()
|
||||
print(f"\n会话状态: {report['status']}")
|
||||
print(f"最终文件: {report['final_file'] or '无'}")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
717
skills/character-profile-cn/scripts/subagent_orchestrator.py
Normal file
717
skills/character-profile-cn/scripts/subagent_orchestrator.py
Normal file
@ -0,0 +1,717 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
子代理协调模块
|
||||
协调子代理执行工作流任务
|
||||
"""
|
||||
|
||||
import json
|
||||
import importlib
|
||||
import asyncio
|
||||
import threading
|
||||
from pathlib import Path
|
||||
from typing import Dict, List, Optional, Any, Callable
|
||||
from dataclasses import dataclass, field
|
||||
from enum import Enum
|
||||
import logging
|
||||
import time
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class TaskStatus(Enum):
|
||||
"""任务状态"""
|
||||
PENDING = "pending"
|
||||
RUNNING = "running"
|
||||
COMPLETED = "completed"
|
||||
FAILED = "failed"
|
||||
SKIPPED = "skipped"
|
||||
|
||||
|
||||
class AgentType(Enum):
|
||||
"""代理类型"""
|
||||
LORE_BIBLE_MANAGER = "lore_bible_manager"
|
||||
CONFLICT_DETECTOR = "conflict_detector"
|
||||
PROFILE_SESSION = "profile_session"
|
||||
PROFILE_GENERATOR = "profile_generator"
|
||||
|
||||
|
||||
@dataclass
|
||||
class TaskResult:
|
||||
"""任务结果"""
|
||||
task_id: str
|
||||
status: TaskStatus
|
||||
outputs: Dict[str, Any] = field(default_factory=dict)
|
||||
error: Optional[str] = None
|
||||
start_time: float = 0
|
||||
end_time: float = 0
|
||||
duration: float = 0
|
||||
|
||||
|
||||
@dataclass
|
||||
class WorkflowTask:
|
||||
"""工作流任务定义"""
|
||||
id: str
|
||||
name: str
|
||||
description: str
|
||||
agent_type: str
|
||||
inputs: List[str]
|
||||
outputs: List[str]
|
||||
depends_on: List[str] = field(default_factory=list)
|
||||
condition: Optional[str] = None
|
||||
timeout: int = 60
|
||||
retry_count: int = 1
|
||||
interactive: bool = False
|
||||
|
||||
|
||||
class SubagentOrchestrator:
|
||||
"""子代理协调器"""
|
||||
|
||||
def __init__(self, workspace: str, config_file: Optional[str] = None):
|
||||
"""初始化协调器
|
||||
|
||||
Args:
|
||||
workspace: 工作目录
|
||||
config_file: 工作流配置文件路径
|
||||
"""
|
||||
self.workspace = workspace
|
||||
self.config_file = config_file or str(Path(__file__).parent.parent / "config" / "workflow_tasks.json")
|
||||
self.workflows = self._load_workflows()
|
||||
self.tasks: Dict[str, WorkflowTask] = {}
|
||||
self.results: Dict[str, TaskResult] = {}
|
||||
self.context: Dict[str, Any] = {"workspace": workspace}
|
||||
self.agents: Dict[str, Any] = {}
|
||||
|
||||
def _load_workflows(self) -> Dict:
|
||||
"""加载工作流配置
|
||||
|
||||
Returns:
|
||||
工作流配置字典
|
||||
"""
|
||||
try:
|
||||
with open(self.config_file, 'r', encoding='utf-8') as f:
|
||||
config = json.load(f)
|
||||
logger.info(f"加载工作流配置: {self.config_file}")
|
||||
return config
|
||||
except Exception as e:
|
||||
logger.error(f"加载工作流配置失败: {e}")
|
||||
return {"workflows": {}, "agents": {}}
|
||||
|
||||
def _initialize_agent(self, agent_type: str) -> Optional[Any]:
|
||||
"""初始化代理实例
|
||||
|
||||
Args:
|
||||
agent_type: 代理类型
|
||||
|
||||
Returns:
|
||||
代理实例,失败返回None
|
||||
"""
|
||||
if agent_type in self.agents:
|
||||
return self.agents[agent_type]
|
||||
|
||||
agent_config = self.workflows.get("agents", {}).get(agent_type)
|
||||
if not agent_config:
|
||||
logger.error(f"未找到代理配置: {agent_type}")
|
||||
return None
|
||||
|
||||
try:
|
||||
module_name = agent_config["module"]
|
||||
class_name = agent_config["class"]
|
||||
|
||||
# 动态导入模块
|
||||
module = importlib.import_module(module_name.replace('/', '.'))
|
||||
agent_class = getattr(module, class_name)
|
||||
|
||||
# 实例化代理
|
||||
if agent_type == AgentType.LORE_BIBLE_MANAGER.value:
|
||||
agent = agent_class(self.workspace)
|
||||
elif agent_type == AgentType.CONFLICT_DETECTOR.value:
|
||||
agent = agent_class()
|
||||
elif agent_type == AgentType.PROFILE_GENERATOR.value:
|
||||
agent = agent_class()
|
||||
elif agent_type == AgentType.PROFILE_SESSION.value:
|
||||
agent = None # 会话需要特殊处理
|
||||
else:
|
||||
agent = agent_class()
|
||||
|
||||
self.agents[agent_type] = agent
|
||||
logger.info(f"初始化代理: {agent_type}")
|
||||
return agent
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"初始化代理失败 {agent_type}: {e}")
|
||||
return None
|
||||
|
||||
def _execute_task(self, task: WorkflowTask) -> TaskResult:
|
||||
"""执行单个任务
|
||||
|
||||
Args:
|
||||
task: 任务定义
|
||||
|
||||
Returns:
|
||||
任务结果
|
||||
"""
|
||||
result = TaskResult(task_id=task.id, status=TaskStatus.RUNNING)
|
||||
result.start_time = time.time()
|
||||
|
||||
try:
|
||||
logger.info(f"开始执行任务: {task.name} ({task.id})")
|
||||
|
||||
# 检查条件
|
||||
if task.condition:
|
||||
if not self._evaluate_condition(task.condition):
|
||||
result.status = TaskStatus.SKIPPED
|
||||
result.outputs = {"skipped": True, "reason": "条件不满足"}
|
||||
logger.info(f"跳过任务 {task.id}: 条件不满足")
|
||||
return result
|
||||
|
||||
# 准备输入参数
|
||||
inputs = self._prepare_inputs(task.inputs)
|
||||
|
||||
# 执行任务
|
||||
if task.agent_type == AgentType.LORE_BIBLE_MANAGER.value:
|
||||
outputs = self._execute_lore_bible_task(task.id, inputs)
|
||||
elif task.agent_type == AgentType.CONFLICT_DETECTOR.value:
|
||||
outputs = self._execute_conflict_detector_task(task.id, inputs)
|
||||
elif task.agent_type == AgentType.PROFILE_SESSION.value:
|
||||
outputs = self._execute_profile_session_task(task.id, inputs)
|
||||
elif task.agent_type == AgentType.PROFILE_GENERATOR.value:
|
||||
outputs = self._execute_profile_generator_task(task.id, inputs)
|
||||
else:
|
||||
raise ValueError(f"未知的代理类型: {task.agent_type}")
|
||||
|
||||
# 验证输出
|
||||
self._validate_outputs(task.outputs, outputs)
|
||||
|
||||
# 更新上下文
|
||||
self.context.update(outputs)
|
||||
|
||||
result.status = TaskStatus.COMPLETED
|
||||
result.outputs = outputs
|
||||
logger.info(f"任务完成: {task.name}")
|
||||
|
||||
except Exception as e:
|
||||
result.status = TaskStatus.FAILED
|
||||
result.error = str(e)
|
||||
logger.error(f"任务失败 {task.id}: {e}")
|
||||
|
||||
finally:
|
||||
result.end_time = time.time()
|
||||
result.duration = result.end_time - result.start_time
|
||||
|
||||
return result
|
||||
|
||||
def _prepare_inputs(self, input_keys: List[str]) -> Dict[str, Any]:
|
||||
"""准备输入参数
|
||||
|
||||
Args:
|
||||
input_keys: 输入键列表
|
||||
|
||||
Returns:
|
||||
输入参数字典
|
||||
"""
|
||||
inputs = {}
|
||||
for key in input_keys:
|
||||
if key in self.context:
|
||||
inputs[key] = self.context[key]
|
||||
else:
|
||||
# 尝试从结果中获取
|
||||
for task_id, result in self.results.items():
|
||||
if key in result.outputs:
|
||||
inputs[key] = result.outputs[key]
|
||||
break
|
||||
else:
|
||||
logger.warning(f"未找到输入参数: {key}")
|
||||
inputs[key] = None
|
||||
|
||||
return inputs
|
||||
|
||||
def _validate_outputs(self, expected_outputs: List[str], actual_outputs: Dict[str, Any]):
|
||||
"""验证输出参数
|
||||
|
||||
Args:
|
||||
expected_outputs: 期望的输出键列表
|
||||
actual_outputs: 实际的输出字典
|
||||
"""
|
||||
for output_key in expected_outputs:
|
||||
if output_key not in actual_outputs:
|
||||
logger.warning(f"任务缺少输出: {output_key}")
|
||||
|
||||
def _evaluate_condition(self, condition: str) -> bool:
|
||||
"""评估条件表达式
|
||||
|
||||
Args:
|
||||
condition: 条件表达式
|
||||
|
||||
Returns:
|
||||
条件是否满足
|
||||
"""
|
||||
try:
|
||||
# 简单的条件评估
|
||||
if condition == "user_confirmed == true":
|
||||
return self.context.get("user_confirmed", False) is True
|
||||
elif condition == "is_valid == true":
|
||||
return self.context.get("is_valid", False) is True
|
||||
else:
|
||||
# 尝试评估Python表达式
|
||||
local_vars = {**self.context}
|
||||
for task_id, result in self.results.items():
|
||||
local_vars.update(result.outputs)
|
||||
|
||||
return eval(condition, {}, local_vars)
|
||||
except Exception as e:
|
||||
logger.warning(f"评估条件失败 '{condition}': {e}")
|
||||
return False
|
||||
|
||||
def _execute_lore_bible_task(self, task_id: str, inputs: Dict) -> Dict:
|
||||
"""执行LoreBible管理任务
|
||||
|
||||
Args:
|
||||
task_id: 任务ID
|
||||
inputs: 输入参数
|
||||
|
||||
Returns:
|
||||
输出参数字典
|
||||
"""
|
||||
agent = self._initialize_agent(AgentType.LORE_BIBLE_MANAGER.value)
|
||||
if not agent:
|
||||
raise RuntimeError("初始化LoreBibleManager失败")
|
||||
|
||||
workspace = inputs.get("workspace", self.workspace)
|
||||
|
||||
if task_id == "init_workspace":
|
||||
# 验证目录结构
|
||||
is_valid, missing_dirs = agent.validate_directory_structure()
|
||||
|
||||
if not is_valid:
|
||||
# 创建缺失目录
|
||||
success = agent.create_directory_structure()
|
||||
if not success:
|
||||
raise RuntimeError("创建目录结构失败")
|
||||
|
||||
# 扫描现有角色
|
||||
characters = agent.scan_existing_characters()
|
||||
|
||||
return {
|
||||
"directory_status": "valid" if is_valid else "created",
|
||||
"missing_dirs": missing_dirs if not is_valid else [],
|
||||
"character_count": len(characters),
|
||||
"character_index": characters
|
||||
}
|
||||
|
||||
elif task_id == "scan_existing":
|
||||
characters = agent.scan_existing_characters()
|
||||
index = agent.get_character_index(force_refresh=True)
|
||||
|
||||
return {
|
||||
"character_index": characters,
|
||||
"character_count": len(characters),
|
||||
"index_details": index
|
||||
}
|
||||
|
||||
else:
|
||||
raise ValueError(f"未知的LoreBible任务: {task_id}")
|
||||
|
||||
def _execute_conflict_detector_task(self, task_id: str, inputs: Dict) -> Dict:
|
||||
"""执行冲突检测任务
|
||||
|
||||
Args:
|
||||
task_id: 任务ID
|
||||
inputs: 输入参数
|
||||
|
||||
Returns:
|
||||
输出参数字典
|
||||
"""
|
||||
agent = self._initialize_agent(AgentType.CONFLICT_DETECTOR.value)
|
||||
if not agent:
|
||||
raise RuntimeError("初始化ConflictDetector失败")
|
||||
|
||||
if task_id == "detect_conflicts":
|
||||
character_data = inputs.get("character_data", {})
|
||||
character_index = inputs.get("character_index", [])
|
||||
|
||||
# 设置角色索引
|
||||
agent.set_character_index({
|
||||
"characters": character_index,
|
||||
"total_count": len(character_index)
|
||||
})
|
||||
|
||||
# 检测冲突
|
||||
conflicts = agent.detect_conflicts(character_data, character_index)
|
||||
is_valid, _ = agent.validate_character(character_data)
|
||||
|
||||
# 生成报告
|
||||
report = agent.generate_report(conflicts, "text")
|
||||
|
||||
return {
|
||||
"conflicts": conflicts,
|
||||
"is_valid": is_valid,
|
||||
"conflict_count": len(conflicts),
|
||||
"report": report
|
||||
}
|
||||
|
||||
else:
|
||||
raise ValueError(f"未知的冲突检测任务: {task_id}")
|
||||
|
||||
def _execute_profile_session_task(self, task_id: str, inputs: Dict) -> Dict:
|
||||
"""执行会话管理任务
|
||||
|
||||
Args:
|
||||
task_id: 任务ID
|
||||
inputs: 输入参数
|
||||
|
||||
Returns:
|
||||
输出参数字典
|
||||
"""
|
||||
from profile_session import ProfileSession, SessionConfig
|
||||
|
||||
if task_id == "save_temp":
|
||||
profile_content = inputs.get("profile_content", "")
|
||||
character_name = inputs.get("character_name", "")
|
||||
workspace = inputs.get("workspace", self.workspace)
|
||||
|
||||
# 创建会话配置
|
||||
config = SessionConfig(
|
||||
workspace=workspace,
|
||||
character_name=character_name,
|
||||
enable_validation=False,
|
||||
enable_conflict_check=False,
|
||||
require_confirmation=False
|
||||
)
|
||||
|
||||
# 创建会话
|
||||
session = ProfileSession(config)
|
||||
|
||||
# 保存临时档案
|
||||
temp_path = session.save_temp_profile(profile_content)
|
||||
if not temp_path:
|
||||
raise RuntimeError("保存临时档案失败")
|
||||
|
||||
# 保存会话ID到上下文
|
||||
self.context["session_id"] = session.session_id
|
||||
|
||||
return {
|
||||
"temp_file_path": str(temp_path),
|
||||
"session_id": session.session_id
|
||||
}
|
||||
|
||||
elif task_id == "user_review":
|
||||
conflicts = inputs.get("conflicts", [])
|
||||
temp_file_path = inputs.get("temp_file_path", "")
|
||||
session_id = self.context.get("session_id")
|
||||
|
||||
if not session_id:
|
||||
raise ValueError("未找到会话ID")
|
||||
|
||||
# 加载会话
|
||||
workspace = inputs.get("workspace", self.workspace)
|
||||
session = ProfileSession.load_session(session_id, workspace)
|
||||
if not session:
|
||||
raise RuntimeError("加载会话失败")
|
||||
|
||||
# 向用户展示
|
||||
user_confirmed = session.present_to_user(conflicts)
|
||||
user_notes = session.session_data.user_notes
|
||||
|
||||
return {
|
||||
"user_confirmed": user_confirmed,
|
||||
"user_notes": user_notes,
|
||||
"session_id": session_id
|
||||
}
|
||||
|
||||
elif task_id == "move_final":
|
||||
temp_file_path = inputs.get("temp_file_path", "")
|
||||
character_name = inputs.get("character_name", "")
|
||||
user_confirmed = inputs.get("user_confirmed", False)
|
||||
session_id = self.context.get("session_id")
|
||||
|
||||
if not user_confirmed:
|
||||
return {"skipped": True, "reason": "用户未确认"}
|
||||
|
||||
if not session_id:
|
||||
raise ValueError("未找到会话ID")
|
||||
|
||||
# 加载会话
|
||||
workspace = inputs.get("workspace", self.workspace)
|
||||
session = ProfileSession.load_session(session_id, workspace)
|
||||
if not session:
|
||||
raise RuntimeError("加载会话失败")
|
||||
|
||||
# 移动到最终目录
|
||||
final_path = session.confirm_and_move()
|
||||
if not final_path:
|
||||
raise RuntimeError("移动档案失败")
|
||||
|
||||
return {
|
||||
"final_file_path": str(final_path),
|
||||
"session_id": session_id
|
||||
}
|
||||
|
||||
elif task_id == "cleanup":
|
||||
session_id = inputs.get("session_id", self.context.get("session_id"))
|
||||
workspace = inputs.get("workspace", self.workspace)
|
||||
|
||||
if not session_id:
|
||||
return {"cleaned_count": 0}
|
||||
|
||||
# 加载会话
|
||||
session = ProfileSession.load_session(session_id, workspace)
|
||||
if session:
|
||||
session.cleanup()
|
||||
|
||||
return {"cleaned_count": 1}
|
||||
|
||||
else:
|
||||
raise ValueError(f"未知的会话管理任务: {task_id}")
|
||||
|
||||
def _execute_profile_generator_task(self, task_id: str, inputs: Dict) -> Dict:
|
||||
"""执行档案生成任务
|
||||
|
||||
Args:
|
||||
task_id: 任务ID
|
||||
inputs: 输入参数
|
||||
|
||||
Returns:
|
||||
输出参数字典
|
||||
"""
|
||||
agent = self._initialize_agent(AgentType.PROFILE_GENERATOR.value)
|
||||
if not agent:
|
||||
raise RuntimeError("初始化ProfileGenerator失败")
|
||||
|
||||
if task_id == "generate_profile":
|
||||
character_data = inputs.get("character_data", {})
|
||||
template_type = inputs.get("template_type", "standard")
|
||||
|
||||
# 设置模板类型
|
||||
agent.template_type = template_type
|
||||
|
||||
# 生成档案内容
|
||||
profile_content = agent.generate_markdown(character_data, output_path=None)
|
||||
|
||||
return {
|
||||
"profile_content": profile_content,
|
||||
"character_name": character_data.get("name", "")
|
||||
}
|
||||
|
||||
elif task_id == "generate_and_save":
|
||||
character_data = inputs.get("character_data", {})
|
||||
template_type = inputs.get("template_type", "standard")
|
||||
workspace = inputs.get("workspace", self.workspace)
|
||||
|
||||
# 设置工作空间
|
||||
agent.workspace = workspace
|
||||
agent.enable_enhanced_features = True
|
||||
|
||||
# 使用增强功能生成
|
||||
success, final_path, conflicts = agent.generate_enhanced_profile(
|
||||
character_data,
|
||||
require_confirmation=False
|
||||
)
|
||||
|
||||
if not success:
|
||||
raise RuntimeError(f"生成档案失败: {conflicts}")
|
||||
|
||||
return {
|
||||
"final_file_path": str(final_path) if final_path else None,
|
||||
"success": success,
|
||||
"conflict_count": len(conflicts)
|
||||
}
|
||||
|
||||
else:
|
||||
raise ValueError(f"未知的档案生成任务: {task_id}")
|
||||
|
||||
def run_workflow(self, workflow_name: str, initial_context: Dict = None) -> Dict[str, Any]:
|
||||
"""运行工作流
|
||||
|
||||
Args:
|
||||
workflow_name: 工作流名称
|
||||
initial_context: 初始上下文
|
||||
|
||||
Returns:
|
||||
最终上下文和结果
|
||||
"""
|
||||
if initial_context:
|
||||
self.context.update(initial_context)
|
||||
|
||||
# 获取工作流定义
|
||||
workflow = self.workflows.get("workflows", {}).get(workflow_name)
|
||||
if not workflow:
|
||||
raise ValueError(f"未找到工作流: {workflow_name}")
|
||||
|
||||
logger.info(f"开始运行工作流: {workflow['name']}")
|
||||
|
||||
# 解析任务
|
||||
tasks_data = workflow.get("tasks", [])
|
||||
self.tasks = {task["id"]: WorkflowTask(**task) for task in tasks_data}
|
||||
|
||||
# 执行任务
|
||||
execution_order = self._calculate_execution_order()
|
||||
|
||||
for task_id in execution_order:
|
||||
task = self.tasks[task_id]
|
||||
|
||||
# 检查依赖是否完成
|
||||
for dep_id in task.depends_on:
|
||||
if dep_id not in self.results:
|
||||
raise RuntimeError(f"任务 {task_id} 的依赖 {dep_id} 未执行")
|
||||
if self.results[dep_id].status == TaskStatus.FAILED:
|
||||
logger.warning(f"任务 {task_id} 的依赖 {dep_id} 失败,跳过")
|
||||
self.results[task_id] = TaskResult(
|
||||
task_id=task_id,
|
||||
status=TaskStatus.SKIPPED,
|
||||
outputs={"skipped": True, "reason": f"依赖 {dep_id} 失败"}
|
||||
)
|
||||
continue
|
||||
|
||||
# 执行任务(带重试)
|
||||
result = None
|
||||
for attempt in range(task.retry_count + 1):
|
||||
if attempt > 0:
|
||||
logger.info(f"重试任务 {task_id} (尝试 {attempt + 1}/{task.retry_count + 1})")
|
||||
|
||||
result = self._execute_task(task)
|
||||
|
||||
if result.status == TaskStatus.COMPLETED:
|
||||
break
|
||||
elif attempt < task.retry_count:
|
||||
logger.warning(f"任务 {task_id} 失败,准备重试: {result.error}")
|
||||
time.sleep(1) # 重试前等待
|
||||
|
||||
self.results[task_id] = result
|
||||
|
||||
# 生成报告
|
||||
report = self._generate_report(workflow_name)
|
||||
|
||||
logger.info(f"工作流完成: {workflow_name}")
|
||||
return {
|
||||
"context": self.context,
|
||||
"results": self.results,
|
||||
"report": report
|
||||
}
|
||||
|
||||
def _calculate_execution_order(self) -> List[str]:
|
||||
"""计算任务执行顺序(拓扑排序)
|
||||
|
||||
Returns:
|
||||
任务ID列表
|
||||
"""
|
||||
# 构建依赖图
|
||||
graph = {task_id: set(task.depends_on) for task_id, task in self.tasks.items()}
|
||||
|
||||
# 拓扑排序
|
||||
visited = set()
|
||||
temp_visited = set()
|
||||
order = []
|
||||
|
||||
def visit(node):
|
||||
if node in temp_visited:
|
||||
raise RuntimeError(f"检测到循环依赖: {node}")
|
||||
if node in visited:
|
||||
return
|
||||
|
||||
temp_visited.add(node)
|
||||
for dep in graph.get(node, set()):
|
||||
if dep in self.tasks: # 只包括定义的任务
|
||||
visit(dep)
|
||||
|
||||
temp_visited.remove(node)
|
||||
visited.add(node)
|
||||
order.append(node)
|
||||
|
||||
for task_id in self.tasks:
|
||||
if task_id not in visited:
|
||||
visit(task_id)
|
||||
|
||||
return order
|
||||
|
||||
def _generate_report(self, workflow_name: str) -> Dict:
|
||||
"""生成执行报告
|
||||
|
||||
Args:
|
||||
workflow_name: 工作流名称
|
||||
|
||||
Returns:
|
||||
报告字典
|
||||
"""
|
||||
total_tasks = len(self.tasks)
|
||||
completed = sum(1 for r in self.results.values() if r.status == TaskStatus.COMPLETED)
|
||||
failed = sum(1 for r in self.results.values() if r.status == TaskStatus.FAILED)
|
||||
skipped = sum(1 for r in self.results.values() if r.status == TaskStatus.SKIPPED)
|
||||
|
||||
task_details = []
|
||||
for task_id, result in self.results.items():
|
||||
task_details.append({
|
||||
"task_id": task_id,
|
||||
"name": self.tasks[task_id].name if task_id in self.tasks else "未知",
|
||||
"status": result.status.value,
|
||||
"duration": result.duration,
|
||||
"error": result.error
|
||||
})
|
||||
|
||||
return {
|
||||
"workflow": workflow_name,
|
||||
"total_tasks": total_tasks,
|
||||
"completed": completed,
|
||||
"failed": failed,
|
||||
"skipped": skipped,
|
||||
"success_rate": completed / total_tasks if total_tasks > 0 else 0,
|
||||
"total_duration": sum(r.duration for r in self.results.values()),
|
||||
"task_details": task_details,
|
||||
"final_context_keys": list(self.context.keys())
|
||||
}
|
||||
|
||||
|
||||
def main():
|
||||
"""命令行测试"""
|
||||
import sys
|
||||
|
||||
if len(sys.argv) < 3:
|
||||
print("用法: python subagent_orchestrator.py <工作目录> <工作流名称>")
|
||||
print("可用工作流: character_creation, quick_creation")
|
||||
sys.exit(1)
|
||||
|
||||
workspace = sys.argv[1]
|
||||
workflow_name = sys.argv[2]
|
||||
|
||||
# 创建协调器
|
||||
orchestrator = SubagentOrchestrator(workspace)
|
||||
|
||||
# 运行工作流
|
||||
try:
|
||||
result = orchestrator.run_workflow(workflow_name)
|
||||
|
||||
print(f"\n{'='*60}")
|
||||
print(f"工作流执行完成: {workflow_name}")
|
||||
print(f"{'='*60}\n")
|
||||
|
||||
report = result["report"]
|
||||
print(f"任务统计: {report['completed']}/{report['total_tasks']} 完成, "
|
||||
f"{report['failed']} 失败, {report['skipped']} 跳过")
|
||||
print(f"成功率: {report['success_rate']:.1%}")
|
||||
print(f"总耗时: {report['total_duration']:.2f} 秒\n")
|
||||
|
||||
print("任务详情:")
|
||||
for task in report["task_details"]:
|
||||
status_icon = {
|
||||
"completed": "✓",
|
||||
"failed": "✗",
|
||||
"skipped": "⏭",
|
||||
"running": "↻",
|
||||
"pending": "⏳"
|
||||
}.get(task["status"], "?")
|
||||
|
||||
print(f" {status_icon} {task['name']} ({task['task_id']})")
|
||||
print(f" 状态: {task['status']}, 耗时: {task['duration']:.2f}秒")
|
||||
if task["error"]:
|
||||
print(f" 错误: {task['error']}")
|
||||
|
||||
# 显示最终输出
|
||||
if "final_file_path" in result["context"]:
|
||||
print(f"\n生成的档案: {result['context']['final_file_path']}")
|
||||
|
||||
except Exception as e:
|
||||
print(f"工作流执行失败: {e}")
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
522
skills/character-profile-cn/scripts/validate_profile.py
Normal file
522
skills/character-profile-cn/scripts/validate_profile.py
Normal file
@ -0,0 +1,522 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
人物档案验证脚本
|
||||
验证markdown格式的人物档案结构完整性
|
||||
"""
|
||||
|
||||
import os
|
||||
import re
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
class ProfileValidator:
|
||||
"""人物档案验证器"""
|
||||
|
||||
# 各类型角色的必需章节
|
||||
REQUIRED_SECTIONS = {
|
||||
'protagonist': [
|
||||
'基本信息', '外貌特征', '性格特点', '背景故事',
|
||||
'动机层次', '人物关系', '故事发展'
|
||||
],
|
||||
'antagonist': [
|
||||
'基本信息', '外貌特征', '性格特点', '核心理念',
|
||||
'动机发展', '镜像对比', '资源能力', '故事发展'
|
||||
],
|
||||
'supporting': [
|
||||
'基本定位', '独立身份', '功能性设计', '关系发展',
|
||||
'发展可能性'
|
||||
],
|
||||
'standard': [
|
||||
'基本信息', '外貌特征', '性格特点', '背景故事',
|
||||
'人物关系', '故事发展'
|
||||
]
|
||||
}
|
||||
|
||||
# 章节内的必需字段(根据模板)
|
||||
REQUIRED_FIELDS = {
|
||||
'基本信息': ['姓名', '年龄', '性别', '职业/身份', '故事中的角色'],
|
||||
'外貌特征': ['整体印象', '面部特征', '身材体型', '着装风格'],
|
||||
'性格特点': ['核心性格', '优点', '缺点', '价值观'],
|
||||
'背景故事': ['出身背景', '关键经历', '转折点'],
|
||||
'人物关系': ['与主角关系', '重要关系人'],
|
||||
'故事发展': ['角色目标', '内在冲突', '外在冲突', '发展弧线']
|
||||
}
|
||||
|
||||
def __init__(self, profile_type='auto'):
|
||||
"""初始化验证器
|
||||
|
||||
Args:
|
||||
profile_type: 档案类型,可选值: 'protagonist', 'antagonist', 'supporting', 'standard', 'auto'
|
||||
"""
|
||||
self.profile_type = profile_type
|
||||
|
||||
# 检测平台,Windows上使用简单符号
|
||||
self.is_windows = sys.platform.startswith('win')
|
||||
|
||||
# 符号定义
|
||||
if self.is_windows:
|
||||
self.symbols = {
|
||||
'building': '[结构]',
|
||||
'cross_mark': '[缺失]',
|
||||
'warning': '[注意]',
|
||||
'check': '[通过]',
|
||||
'wrench': '[修复]',
|
||||
'check_mark': '[OK]',
|
||||
'arrow': '->',
|
||||
'green_circle': '[良好]',
|
||||
'yellow_circle': '[一般]',
|
||||
'red_circle': '[需改进]',
|
||||
'file': '[文件]',
|
||||
'chart': '[统计]',
|
||||
'chart2': '[分布]',
|
||||
'bulb': '[建议]',
|
||||
'bullet': '-',
|
||||
'dash': '-'
|
||||
}
|
||||
else:
|
||||
self.symbols = {
|
||||
'building': '🏗️',
|
||||
'cross_mark': '❌',
|
||||
'warning': '⚠️',
|
||||
'check': '✅',
|
||||
'wrench': '🔧',
|
||||
'check_mark': '✓',
|
||||
'arrow': '→',
|
||||
'green_circle': '🟢',
|
||||
'yellow_circle': '🟡',
|
||||
'red_circle': '🔴',
|
||||
'file': '📋',
|
||||
'chart': '📊',
|
||||
'chart2': '📈',
|
||||
'bulb': '💡',
|
||||
'bullet': '•',
|
||||
'dash': '-'
|
||||
}
|
||||
|
||||
def detect_profile_type(self, content):
|
||||
"""检测档案类型"""
|
||||
# 通过内容特征检测类型
|
||||
lines = content.split('\n')
|
||||
|
||||
# 检查是否有特定章节
|
||||
has_mirror = any('镜像对比' in line for line in lines)
|
||||
has_core_belief = any('核心理念' in line for line in lines)
|
||||
has_resources = any('资源能力' in line for line in lines)
|
||||
|
||||
has_function = any('功能性设计' in line for line in lines)
|
||||
has_identity = any('独立身份' in line for line in lines)
|
||||
|
||||
has_motivation = any('动机层次' in line for line in lines)
|
||||
has_core_identity = any('核心身份' in line for line in lines)
|
||||
|
||||
if has_mirror or has_core_belief or has_resources:
|
||||
return 'antagonist'
|
||||
elif has_function or has_identity:
|
||||
return 'supporting'
|
||||
elif has_motivation or has_core_identity:
|
||||
return 'protagonist'
|
||||
else:
|
||||
return 'standard'
|
||||
|
||||
def validate_structure(self, filepath):
|
||||
"""验证档案结构
|
||||
|
||||
Args:
|
||||
filepath: markdown文件路径
|
||||
|
||||
Returns:
|
||||
验证结果字典
|
||||
"""
|
||||
with open(filepath, 'r', encoding='utf-8') as f:
|
||||
content = f.read()
|
||||
|
||||
# 检测类型
|
||||
if self.profile_type == 'auto':
|
||||
detected_type = self.detect_profile_type(content)
|
||||
else:
|
||||
detected_type = self.profile_type
|
||||
|
||||
# 提取所有章节标题
|
||||
sections = self._extract_sections(content)
|
||||
|
||||
# 检查必需章节
|
||||
required_sections = self.REQUIRED_SECTIONS.get(detected_type, [])
|
||||
missing_sections = []
|
||||
present_sections = []
|
||||
|
||||
for required_section in required_sections:
|
||||
if required_section not in sections:
|
||||
missing_sections.append(required_section)
|
||||
else:
|
||||
present_sections.append(required_section)
|
||||
|
||||
# 检查章节内的必需字段
|
||||
section_field_violations = {}
|
||||
for section_title in present_sections:
|
||||
section_content = self._get_section_content(content, section_title)
|
||||
missing_fields = self._check_required_fields(section_title, section_content)
|
||||
|
||||
if missing_fields:
|
||||
section_field_violations[section_title] = missing_fields
|
||||
|
||||
# 计算结构完整性评分
|
||||
structure_score = self._calculate_structure_score(
|
||||
len(required_sections), len(missing_sections), section_field_violations
|
||||
)
|
||||
|
||||
return {
|
||||
'filepath': filepath,
|
||||
'detected_type': detected_type,
|
||||
'total_sections_found': len(sections),
|
||||
'required_sections': required_sections,
|
||||
'present_sections': present_sections,
|
||||
'missing_sections': missing_sections,
|
||||
'section_field_violations': section_field_violations,
|
||||
'structure_score': structure_score,
|
||||
'structure_level': self._get_structure_level(structure_score)
|
||||
}
|
||||
|
||||
def _extract_sections(self, content):
|
||||
"""提取所有章节标题"""
|
||||
sections = []
|
||||
|
||||
# 匹配二级和三级标题(## 和 ###)
|
||||
header_pattern = r'^#{2,3}\s+(.+?)$'
|
||||
|
||||
lines = content.split('\n')
|
||||
for line in lines:
|
||||
match = re.match(header_pattern, line.strip())
|
||||
if match:
|
||||
title = match.group(1).strip()
|
||||
# 去掉可能的内部链接
|
||||
title = re.sub(r'\[.*?\]\(.*?\)', '', title)
|
||||
sections.append(title)
|
||||
|
||||
return sections
|
||||
|
||||
def _get_section_content(self, content, section_title):
|
||||
"""获取指定章节的内容"""
|
||||
lines = content.split('\n')
|
||||
in_target_section = False
|
||||
section_content = []
|
||||
|
||||
for line in lines:
|
||||
# 检查是否是章节标题
|
||||
if re.match(rf'^#{{2,3}}\s+{re.escape(section_title)}\s*$', line.strip()):
|
||||
in_target_section = True
|
||||
continue
|
||||
|
||||
# 如果进入下一个章节,停止收集
|
||||
if in_target_section and re.match(r'^#{2,3}\s+', line.strip()):
|
||||
break
|
||||
|
||||
# 收集内容行
|
||||
if in_target_section:
|
||||
section_content.append(line)
|
||||
|
||||
return '\n'.join(section_content)
|
||||
|
||||
def _check_required_fields(self, section_title, section_content):
|
||||
"""检查章节内的必需字段"""
|
||||
required_fields = self.REQUIRED_FIELDS.get(section_title, [])
|
||||
if not required_fields:
|
||||
return []
|
||||
|
||||
missing_fields = []
|
||||
|
||||
for field in required_fields:
|
||||
# 检查字段是否出现(作为粗体文本)
|
||||
pattern = rf'\*\*{re.escape(field)}\*\*'
|
||||
if not re.search(pattern, section_content):
|
||||
missing_fields.append(field)
|
||||
|
||||
return missing_fields
|
||||
|
||||
def _calculate_structure_score(self, total_required, missing_sections_count, field_violations):
|
||||
"""计算结构完整性评分(0-100)"""
|
||||
if total_required == 0:
|
||||
return 100
|
||||
|
||||
# 章节完整性(70分)
|
||||
section_score = ((total_required - missing_sections_count) / total_required) * 70
|
||||
|
||||
# 字段完整性(30分)
|
||||
field_score = 30
|
||||
if field_violations:
|
||||
total_violations = sum(len(fields) for fields in field_violations.values())
|
||||
# 每个缺失字段扣3分
|
||||
field_penalty = min(30, total_violations * 3)
|
||||
field_score -= field_penalty
|
||||
|
||||
total_score = section_score + field_score
|
||||
return max(0, min(100, total_score))
|
||||
|
||||
def _get_structure_level(self, score):
|
||||
"""获取结构完整性等级"""
|
||||
if score >= 90:
|
||||
return "优秀"
|
||||
elif score >= 75:
|
||||
return "良好"
|
||||
elif score >= 60:
|
||||
return "一般"
|
||||
elif score >= 40:
|
||||
return "不完整"
|
||||
else:
|
||||
return "结构缺失"
|
||||
|
||||
def generate_validation_report(self, validation_result, output_format='text'):
|
||||
"""生成验证报告"""
|
||||
result = validation_result
|
||||
|
||||
if output_format == 'text':
|
||||
report_lines = []
|
||||
report_lines.append("=" * 60)
|
||||
report_lines.append(f"人物档案结构验证报告")
|
||||
report_lines.append(f"文件: {result['filepath']}")
|
||||
report_lines.append(f"检测类型: {result['detected_type']}")
|
||||
report_lines.append("=" * 60)
|
||||
report_lines.append("")
|
||||
|
||||
# 结构完整性
|
||||
report_lines.append(f"{self.symbols['building']} 结构完整性")
|
||||
report_lines.append(f" 评分: {result['structure_score']:.1f}/100")
|
||||
report_lines.append(f" 等级: {result['structure_level']}")
|
||||
report_lines.append(f" 发现章节: {result['total_sections_found']}")
|
||||
report_lines.append("")
|
||||
|
||||
# 章节检查
|
||||
if result['missing_sections']:
|
||||
report_lines.append(f"{self.symbols['cross_mark']} 缺失的必需章节")
|
||||
for section in result['missing_sections']:
|
||||
report_lines.append(f" {self.symbols['bullet']} {section}")
|
||||
report_lines.append("")
|
||||
|
||||
# 字段检查
|
||||
if result['section_field_violations']:
|
||||
report_lines.append(f"{self.symbols['warning']} 章节内缺失字段")
|
||||
for section, fields in result['section_field_violations'].items():
|
||||
report_lines.append(f" {self.symbols['bullet']} {section}:")
|
||||
for field in fields:
|
||||
report_lines.append(f" {self.symbols['dash']} {field}")
|
||||
report_lines.append("")
|
||||
|
||||
# 通过检查的项目
|
||||
report_lines.append(f"{self.symbols['check']} 通过的检查")
|
||||
report_lines.append(f" {self.symbols['bullet']} 必需章节: {len(result['present_sections'])}/{len(result['required_sections'])}")
|
||||
|
||||
present_field_count = 0
|
||||
total_field_count = 0
|
||||
for section in result['present_sections']:
|
||||
required_fields = self.REQUIRED_FIELDS.get(section, [])
|
||||
total_field_count += len(required_fields)
|
||||
if section not in result['section_field_violations']:
|
||||
present_field_count += len(required_fields)
|
||||
else:
|
||||
missing_count = len(result['section_field_violations'][section])
|
||||
present_field_count += (len(required_fields) - missing_count)
|
||||
|
||||
if total_field_count > 0:
|
||||
report_lines.append(f" {self.symbols['bullet']} 必需字段: {present_field_count}/{total_field_count}")
|
||||
|
||||
report_lines.append("")
|
||||
|
||||
# 修复建议
|
||||
report_lines.append(f"{self.symbols['wrench']} 修复建议")
|
||||
if result['structure_score'] >= 80:
|
||||
report_lines.append(f" {self.symbols['check_mark']} 结构完整,可以继续完善内容细节")
|
||||
elif result['structure_score'] >= 60:
|
||||
if result['missing_sections']:
|
||||
report_lines.append(f" {self.symbols['arrow']} 添加缺失的章节: {', '.join(result['missing_sections'][:3])}")
|
||||
if result['section_field_violations']:
|
||||
first_section = list(result['section_field_violations'].keys())[0]
|
||||
first_field = result['section_field_violations'][first_section][0]
|
||||
report_lines.append(f" {self.symbols['arrow']} 补充字段: {first_section} → **{first_field}**")
|
||||
else:
|
||||
report_lines.append(f" {self.symbols['arrow']} 需要补充基本的结构框架")
|
||||
report_lines.append(f" {self.symbols['arrow']} 建议使用'{result['detected_type']}'模板重新整理")
|
||||
|
||||
report_lines.append("")
|
||||
report_lines.append("=" * 60)
|
||||
|
||||
return "\n".join(report_lines)
|
||||
|
||||
elif output_format == 'json':
|
||||
import json
|
||||
return json.dumps(result, ensure_ascii=False, indent=2)
|
||||
|
||||
else:
|
||||
raise ValueError(f"不支持的输出格式: {output_format}")
|
||||
|
||||
def validate_directory(self, directory_path, recursive=True):
|
||||
"""验证目录下的所有markdown档案"""
|
||||
directory = Path(directory_path)
|
||||
|
||||
if not directory.exists():
|
||||
raise FileNotFoundError(f"目录不存在: {directory_path}")
|
||||
|
||||
# 查找markdown文件
|
||||
md_files = []
|
||||
if recursive:
|
||||
md_files = list(directory.rglob("*.md"))
|
||||
else:
|
||||
md_files = list(directory.glob("*.md"))
|
||||
|
||||
if not md_files:
|
||||
return {"message": "未找到markdown文件", "files": []}
|
||||
|
||||
# 验证每个文件
|
||||
results = []
|
||||
for md_file in md_files:
|
||||
try:
|
||||
validation = self.validate_structure(str(md_file))
|
||||
results.append(validation)
|
||||
except Exception as e:
|
||||
results.append({
|
||||
'filepath': str(md_file),
|
||||
'error': str(e)
|
||||
})
|
||||
|
||||
# 按结构评分排序
|
||||
valid_results = [r for r in results if 'structure_score' in r]
|
||||
sorted_results = sorted(valid_results, key=lambda x: x['structure_score'], reverse=True)
|
||||
|
||||
return {
|
||||
'total_files': len(md_files),
|
||||
'successful_validation': len(valid_results),
|
||||
'failed_validation': len(results) - len(valid_results),
|
||||
'results': sorted_results
|
||||
}
|
||||
|
||||
def generate_directory_validation_report(self, validation_results, output_format='text'):
|
||||
"""生成目录验证报告"""
|
||||
if output_format == 'text':
|
||||
report_lines = []
|
||||
report_lines.append("=" * 60)
|
||||
report_lines.append(f"人物档案结构验证报告(目录)")
|
||||
report_lines.append(f"分析文件数: {validation_results['total_files']}")
|
||||
report_lines.append(f"成功验证: {validation_results['successful_validation']}")
|
||||
if validation_results['failed_validation'] > 0:
|
||||
report_lines.append(f"验证失败: {validation_results['failed_validation']}")
|
||||
report_lines.append("=" * 60)
|
||||
report_lines.append("")
|
||||
|
||||
# 文件列表(按评分排序)
|
||||
if validation_results['results']:
|
||||
report_lines.append(f"{self.symbols['file']} 文件结构完整性排名")
|
||||
for i, result in enumerate(validation_results['results'], 1):
|
||||
score = result['structure_score']
|
||||
level = result['structure_level']
|
||||
filename = os.path.basename(result['filepath'])
|
||||
profile_type = result.get('detected_type', '未知')
|
||||
|
||||
# 使用符号表示等级
|
||||
if score >= 80:
|
||||
icon = self.symbols['green_circle']
|
||||
elif score >= 60:
|
||||
icon = self.symbols['yellow_circle']
|
||||
else:
|
||||
icon = self.symbols['red_circle']
|
||||
|
||||
report_lines.append(f"{icon} {i:2d}. {filename:<35} {score:5.1f}分 ({level}, {profile_type})")
|
||||
|
||||
report_lines.append("")
|
||||
|
||||
# 统计信息
|
||||
avg_score = sum(r['structure_score'] for r in validation_results['results']) / len(validation_results['results'])
|
||||
max_score = max(r['structure_score'] for r in validation_results['results'])
|
||||
min_score = min(r['structure_score'] for r in validation_results['results'])
|
||||
|
||||
# 类型分布
|
||||
type_distribution = {}
|
||||
for result in validation_results['results']:
|
||||
profile_type = result.get('detected_type', '未知')
|
||||
type_distribution[profile_type] = type_distribution.get(profile_type, 0) + 1
|
||||
|
||||
report_lines.append(f"{self.symbols['chart']} 统计信息")
|
||||
report_lines.append(f" 平均结构分: {avg_score:.1f}")
|
||||
report_lines.append(f" 最高分: {max_score:.1f}")
|
||||
report_lines.append(f" 最低分: {min_score:.1f}")
|
||||
report_lines.append("")
|
||||
|
||||
report_lines.append(f"{self.symbols['chart2']} 类型分布")
|
||||
for profile_type, count in type_distribution.items():
|
||||
percentage = (count / len(validation_results['results'])) * 100
|
||||
report_lines.append(f" {profile_type}: {count}个 ({percentage:.1f}%)")
|
||||
|
||||
report_lines.append("")
|
||||
|
||||
# 整体建议
|
||||
report_lines.append(f"{self.symbols['bulb']} 整体建议")
|
||||
if avg_score >= 75:
|
||||
report_lines.append(f" {self.symbols['check_mark']} 整体结构良好")
|
||||
report_lines.append(f" {self.symbols['arrow']} 可以开始关注内容深度和细节")
|
||||
elif avg_score >= 50:
|
||||
report_lines.append(f" {self.symbols['warning']} 结构基本完整但有缺失")
|
||||
report_lines.append(f" {self.symbols['arrow']} 建议补充缺失章节和字段")
|
||||
else:
|
||||
report_lines.append(f" {self.symbols['cross_mark']} 结构完整性不足")
|
||||
report_lines.append(f" {self.symbols['arrow']} 需要重新整理档案结构框架")
|
||||
|
||||
report_lines.append("")
|
||||
report_lines.append("=" * 60)
|
||||
|
||||
return "\n".join(report_lines)
|
||||
|
||||
else:
|
||||
import json
|
||||
return json.dumps(validation_results, ensure_ascii=False, indent=2)
|
||||
|
||||
|
||||
def main():
|
||||
"""主函数"""
|
||||
import argparse
|
||||
|
||||
parser = argparse.ArgumentParser(description='验证人物档案markdown文件结构')
|
||||
parser.add_argument('path', help='要验证的markdown文件或目录路径')
|
||||
parser.add_argument('--type', '-t', choices=['protagonist', 'antagonist', 'supporting', 'standard', 'auto'],
|
||||
default='auto', help='档案类型(默认为自动检测)')
|
||||
parser.add_argument('--recursive', '-r', action='store_true', help='递归验证目录')
|
||||
parser.add_argument('--format', '-f', choices=['text', 'json'], default='text', help='输出格式')
|
||||
parser.add_argument('--output', '-o', help='输出文件路径')
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
validator = ProfileValidator(args.type)
|
||||
path = Path(args.path)
|
||||
|
||||
try:
|
||||
if path.is_file():
|
||||
# 验证单个文件
|
||||
if path.suffix.lower() != '.md':
|
||||
print("错误: 文件必须是.md格式")
|
||||
return 1
|
||||
|
||||
validation = validator.validate_structure(str(path))
|
||||
report = validator.generate_validation_report(validation, args.format)
|
||||
|
||||
elif path.is_dir():
|
||||
# 验证目录
|
||||
validation_results = validator.validate_directory(str(path), args.recursive)
|
||||
report = validator.generate_directory_validation_report(validation_results, args.format)
|
||||
|
||||
else:
|
||||
print(f"错误: 路径不存在: {args.path}")
|
||||
return 1
|
||||
|
||||
# 输出结果
|
||||
if args.output:
|
||||
with open(args.output, 'w', encoding='utf-8') as f:
|
||||
f.write(report)
|
||||
print(f"报告已保存到: {args.output}")
|
||||
else:
|
||||
print(report)
|
||||
|
||||
return 0
|
||||
|
||||
except Exception as e:
|
||||
print(f"验证失败: {e}")
|
||||
return 1
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
sys.exit(main())
|
||||
228
skills/character-profile-cn/test/test_enhancement.py
Normal file
228
skills/character-profile-cn/test/test_enhancement.py
Normal file
@ -0,0 +1,228 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
增强功能测试脚本
|
||||
测试LoreBible管理、冲突检测和会话管理功能
|
||||
"""
|
||||
|
||||
import os
|
||||
import sys
|
||||
import tempfile
|
||||
import shutil
|
||||
from pathlib import Path
|
||||
|
||||
# 添加scripts目录到路径
|
||||
sys.path.insert(0, str(Path(__file__).parent.parent / "scripts"))
|
||||
|
||||
def test_lore_bible_manager():
|
||||
"""测试LoreBible管理器"""
|
||||
print("测试LoreBible管理器...")
|
||||
|
||||
from lore_bible_manager import LoreBibleManager
|
||||
|
||||
# 创建临时工作目录
|
||||
with tempfile.TemporaryDirectory() as temp_dir:
|
||||
workspace = Path(temp_dir) / "test_workspace"
|
||||
workspace.mkdir()
|
||||
|
||||
# 创建管理器
|
||||
manager = LoreBibleManager(str(workspace))
|
||||
|
||||
# 测试目录验证
|
||||
is_valid, missing_dirs = manager.validate_directory_structure()
|
||||
print(f" 目录验证: 有效={is_valid}, 缺失目录={missing_dirs}")
|
||||
|
||||
# 测试目录创建
|
||||
success = manager.create_directory_structure()
|
||||
print(f" 目录创建: {'成功' if success else '失败'}")
|
||||
|
||||
# 再次验证
|
||||
is_valid, missing_dirs = manager.validate_directory_structure()
|
||||
print(f" 创建后验证: 有效={is_valid}")
|
||||
|
||||
# 测试工作空间信息
|
||||
info = manager.get_workspace_info()
|
||||
print(f" 工作空间信息: 角色数={info['characters_count']}, 临时文件数={info['temp_files_count']}")
|
||||
|
||||
print(" LoreBible管理器测试完成")
|
||||
|
||||
def test_conflict_detector():
|
||||
"""测试冲突检测器"""
|
||||
print("测试冲突检测器...")
|
||||
|
||||
from conflict_detector import ConflictDetector, ConflictSeverity
|
||||
|
||||
# 创建检测器
|
||||
detector = ConflictDetector()
|
||||
|
||||
# 测试角色数据
|
||||
character_data = {
|
||||
"name": "测试角色",
|
||||
"age": "25",
|
||||
"gender": "男",
|
||||
"occupation": "剑士",
|
||||
"role": "主角"
|
||||
}
|
||||
|
||||
# 测试冲突检测
|
||||
conflicts = detector.detect_conflicts(character_data, [])
|
||||
print(f" 冲突检测: 发现 {len(conflicts)} 个冲突")
|
||||
|
||||
# 测试角色验证
|
||||
is_valid, validation_conflicts = detector.validate_character(character_data)
|
||||
print(f" 角色验证: 有效={is_valid}, 冲突数={len(validation_conflicts)}")
|
||||
|
||||
# 测试报告生成
|
||||
report = detector.generate_report(conflicts, "text")
|
||||
print(f" 报告生成: {len(report.splitlines())} 行")
|
||||
|
||||
print(" 冲突检测器测试完成")
|
||||
|
||||
def test_profile_session():
|
||||
"""测试会话管理"""
|
||||
print("测试会话管理...")
|
||||
|
||||
from profile_session import ProfileSession, SessionConfig
|
||||
|
||||
with tempfile.TemporaryDirectory() as temp_dir:
|
||||
workspace = Path(temp_dir) / "test_session"
|
||||
workspace.mkdir()
|
||||
|
||||
# 创建配置
|
||||
config = SessionConfig(
|
||||
workspace=str(workspace),
|
||||
character_name="测试角色",
|
||||
template_type="standard",
|
||||
require_confirmation=False
|
||||
)
|
||||
|
||||
# 创建会话
|
||||
session = ProfileSession(config)
|
||||
print(f" 会话创建: ID={session.session_id}")
|
||||
|
||||
# 测试状态报告
|
||||
report = session.get_status_report()
|
||||
print(f" 状态报告: {report['status']}")
|
||||
|
||||
# 测试临时档案保存
|
||||
test_content = "# 测试角色 - 角色档案\n\n测试内容"
|
||||
temp_path = session.save_temp_profile(test_content)
|
||||
print(f" 临时保存: {'成功' if temp_path else '失败'}")
|
||||
|
||||
# 测试会话列表
|
||||
sessions = ProfileSession.list_sessions(str(workspace), active_only=False)
|
||||
print(f" 会话列表: {len(sessions)} 个会话")
|
||||
|
||||
print(" 会话管理测试完成")
|
||||
|
||||
def test_generate_profile_enhanced():
|
||||
"""测试增强的档案生成"""
|
||||
print("测试增强档案生成...")
|
||||
|
||||
from generate_profile import CharacterProfileGenerator
|
||||
|
||||
with tempfile.TemporaryDirectory() as temp_dir:
|
||||
workspace = Path(temp_dir) / "test_generation"
|
||||
workspace.mkdir()
|
||||
|
||||
# 创建生成器(增强模式)
|
||||
generator = CharacterProfileGenerator(
|
||||
template_type="standard",
|
||||
workspace=str(workspace)
|
||||
)
|
||||
|
||||
# 角色数据
|
||||
character_data = {
|
||||
"name": "增强测试角色",
|
||||
"age": "30",
|
||||
"gender": "女",
|
||||
"occupation": "法师",
|
||||
"role": "主角"
|
||||
}
|
||||
|
||||
# 测试增强生成(跳过用户确认)
|
||||
success, final_path, conflicts = generator.generate_enhanced_profile(
|
||||
character_data,
|
||||
require_confirmation=False
|
||||
)
|
||||
|
||||
print(f" 增强生成: 成功={success}, 最终路径={final_path}, 冲突数={len(conflicts)}")
|
||||
|
||||
# 测试传统生成
|
||||
generator2 = CharacterProfileGenerator(template_type="standard")
|
||||
content = generator2.generate_markdown(character_data, output_path=None)
|
||||
print(f" 传统生成: 内容长度={len(content)} 字符")
|
||||
|
||||
print(" 增强档案生成测试完成")
|
||||
|
||||
def test_subagent_orchestrator():
|
||||
"""测试子代理协调器"""
|
||||
print("测试子代理协调器...")
|
||||
|
||||
from subagent_orchestrator import SubagentOrchestrator
|
||||
|
||||
with tempfile.TemporaryDirectory() as temp_dir:
|
||||
workspace = Path(temp_dir) / "test_orchestrator"
|
||||
workspace.mkdir()
|
||||
|
||||
# 创建协调器
|
||||
orchestrator = SubagentOrchestrator(str(workspace))
|
||||
|
||||
# 测试工作流运行(使用快速创建模式)
|
||||
try:
|
||||
result = orchestrator.run_workflow("quick_creation", {
|
||||
"character_data": {
|
||||
"name": "协调测试角色",
|
||||
"age": "28",
|
||||
"gender": "男",
|
||||
"occupation": "盗贼",
|
||||
"role": "配角"
|
||||
},
|
||||
"template_type": "standard"
|
||||
})
|
||||
|
||||
report = result["report"]
|
||||
print(f" 工作流执行: {report['completed']}/{report['total_tasks']} 任务完成")
|
||||
print(f" 成功率: {report['success_rate']:.1%}")
|
||||
|
||||
except Exception as e:
|
||||
print(f" 工作流执行失败(预期内): {e}")
|
||||
|
||||
print(" 子代理协调器测试完成")
|
||||
|
||||
def main():
|
||||
"""主测试函数"""
|
||||
print("开始增强功能测试...")
|
||||
print("=" * 60)
|
||||
|
||||
tests = [
|
||||
test_lore_bible_manager,
|
||||
test_conflict_detector,
|
||||
test_profile_session,
|
||||
test_generate_profile_enhanced,
|
||||
test_subagent_orchestrator
|
||||
]
|
||||
|
||||
passed = 0
|
||||
total = len(tests)
|
||||
|
||||
for i, test_func in enumerate(tests, 1):
|
||||
try:
|
||||
test_func()
|
||||
passed += 1
|
||||
print(f"[{i}/{total}] [OK] 通过")
|
||||
except Exception as e:
|
||||
print(f"[{i}/{total}] [X] 失败: {e}")
|
||||
print()
|
||||
|
||||
print("=" * 60)
|
||||
print(f"测试完成: {passed}/{total} 通过 ({passed/total*100:.1f}%)")
|
||||
|
||||
if passed == total:
|
||||
print("所有测试通过!")
|
||||
return 0
|
||||
else:
|
||||
print("部分测试失败")
|
||||
return 1
|
||||
|
||||
if __name__ == "__main__":
|
||||
sys.exit(main())
|
||||
106
skills/character-profile-cn/test_profiles/example_protagonist.md
Normal file
106
skills/character-profile-cn/test_profiles/example_protagonist.md
Normal file
@ -0,0 +1,106 @@
|
||||
# 林晓风 - 角色档案
|
||||
|
||||
> 生成时间:2025-01-26 10:30:00
|
||||
> 模板类型:主角模板
|
||||
|
||||
## 基本信息
|
||||
- **姓名**:林晓风
|
||||
- **年龄**:24岁
|
||||
- **性别**:男
|
||||
- **职业/身份**:年轻法师/古籍研究员
|
||||
- **故事中的角色**:主角
|
||||
|
||||
## 外貌特征
|
||||
- **整体印象**:清瘦儒雅,眼神中带有书卷气与隐约的忧郁
|
||||
- **面部特征**:五官清秀,鼻梁高挺,时常微微蹙眉思考,左眼角有一颗浅褐色小痣
|
||||
- **身材体型**:身高178cm,体型偏瘦但并非孱弱,长期的古籍搬运工作让他有不错的体力
|
||||
- **着装风格**:偏好深色系长袍,样式简洁但有精致的暗纹,总带着一副细框眼镜
|
||||
- **标志性特征**:左手手背有一道淡银色的魔法印记,在情绪激动时会微微发光
|
||||
|
||||
## 性格特点
|
||||
- **核心性格**:内省、执着、善良但有些优柔寡断
|
||||
- **优点**:博学多识、细心谨慎、有同理心、坚韧不拔
|
||||
- **缺点**:过度思虑、缺乏自信、不擅表达情感、有时过于理想化
|
||||
- **价值观**:相信知识的力量,认为理解比征服更重要,重视生命的尊严
|
||||
- **恐惧**:无法保护所爱之人,让老师失望,自己的力量失控伤害他人
|
||||
- **渴望**:真正理解魔法的本质,找到自己在世界中的位置,获得内心的平静
|
||||
|
||||
## 背景故事
|
||||
- **出身背景**:出生于学者世家,父母都是皇家学院的教授,在学术氛围中长大
|
||||
- **关键经历**:
|
||||
- 12岁时无意中激活了家传的古籍,发现了自己的魔法天赋
|
||||
- 15岁拜入隐世大法师门下,开始系统学习魔法
|
||||
- 20岁时老师神秘失踪,只留下一本未完成的魔法笔记
|
||||
- 22岁进入皇家古籍馆工作,暗中调查老师失踪的真相
|
||||
- **转折点**:在古籍馆发现一本记载着禁忌魔法的古籍,意识到老师的失踪与一个古老的神秘组织有关
|
||||
- **未解之谜**:父母的真实身份是什么?老师为何突然失踪?手背上的魔法印记来自何处?
|
||||
|
||||
## 动机层次
|
||||
- **表层目标**:找到失踪的老师,解开古籍中的秘密
|
||||
- **情感需求**:获得认可和归属感,不再感到自己是世界的异类
|
||||
- **存在需求**:理解自己为何拥有魔法天赋,找到生命的意义
|
||||
- **未意识需求**:渴望被需要、被依赖,证明自己的价值
|
||||
|
||||
## 核心身份
|
||||
- **本质自我**:一个渴望理解和被理解的求知者
|
||||
- **社会面具**:沉稳内敛的古籍研究员
|
||||
- **理想自我**:能够掌控魔法力量,保护所爱之人的强大法师
|
||||
- **恐惧自我**:力量失控的怪物,让所有人失望的失败者
|
||||
|
||||
## 人物关系
|
||||
- **与主角关系**:本故事的主角
|
||||
- **重要关系人**:
|
||||
- **苏沐雨**:青梅竹马,现在的同事,暗恋对象,不知道他的魔法身份
|
||||
- **玄清法师**:失踪的老师,如父如师的存在
|
||||
- **陆明轩**:古籍馆馆长,知道他的秘密并暗中保护
|
||||
- **影月**:神秘组织的女刺客,亦敌亦友的复杂关系
|
||||
- **敌对关系**:
|
||||
- **暗影议会**:追求禁忌魔法的神秘组织
|
||||
- **陈司长**:魔法管理局官员,怀疑他的身份并处处刁难
|
||||
- **情感羁绊**:
|
||||
- 对苏沐雨:暗恋但不敢表白,害怕自己的秘密会伤害她
|
||||
- 对玄清法师:敬爱如父,对其失踪怀有深深的愧疚
|
||||
- 对影月:初为敌人,后逐渐理解彼此的立场,产生微妙的情感
|
||||
|
||||
## 故事发展
|
||||
- **角色目标**:
|
||||
- 短期:解开老师留下的笔记秘密
|
||||
- 中期:查明暗影议会的真正目的
|
||||
- 长期:找到魔法与人类共存的平衡之道
|
||||
- **内在冲突**:
|
||||
- 求知欲与安全顾虑的矛盾
|
||||
- 对力量的控制与恐惧
|
||||
- 个人感情与责任的抉择
|
||||
- **外在冲突**:
|
||||
- 与暗影议会的魔法对抗
|
||||
- 躲避魔法管理局的追查
|
||||
- 保护朋友不卷入危险
|
||||
- **发展弧线**:
|
||||
- **起始**:谨慎低调,隐藏力量,独自承担秘密
|
||||
- **成长**:逐渐信任他人,组建自己的团队,学会合作
|
||||
- **考验**:面临重大抉择,在力量、责任、感情间权衡
|
||||
- **转变**:从被动防御到主动出击,从隐藏到接纳自我
|
||||
- **完成**:找到内心的平衡,明确自己的道路
|
||||
- **可能的结局**:
|
||||
- 理想结局:揭穿暗影议会的阴谋,找到老师,与苏沐雨在一起
|
||||
- 牺牲结局:为保护他人牺牲自己,成为传说
|
||||
- 开放结局:继续游走于两个世界之间,寻找新的平衡
|
||||
|
||||
## 创作笔记
|
||||
- **灵感来源**:东方玄幻与都市奇幻的结合,探讨现代社会中传统与现代的冲突
|
||||
- **象征意义**:
|
||||
- 魔法印记:天赋与诅咒的双重象征
|
||||
- 古籍:传统知识与现代价值的桥梁
|
||||
- 眼镜:理性与感性的分界
|
||||
- **潜在发展**:
|
||||
- 魔法印记的真正来源可能是某个古老血脉
|
||||
- 父母可能与暗影议会有某种联系
|
||||
- 苏沐雨可能也有未被发现的神秘能力
|
||||
|
||||
---
|
||||
|
||||
## 档案元数据
|
||||
- **角色类型**:主角模板
|
||||
- **创建时间**:2025-01-26 10:30:00
|
||||
- **状态**:完成
|
||||
- **版本**:1.2
|
||||
80
skills/character-profile-cn/test_profiles/test_character.md
Normal file
80
skills/character-profile-cn/test_profiles/test_character.md
Normal file
@ -0,0 +1,80 @@
|
||||
# 测试角色 - 角色档案
|
||||
|
||||
> 生成时间:2026-01-26 01:42:27
|
||||
> 模板类型:主角模板
|
||||
|
||||
## 基本信息
|
||||
|
||||
- **姓名**:测试角色
|
||||
- **年龄**:25
|
||||
- **性别**:男
|
||||
- **职业/身份**:测试职业
|
||||
- **故事中的角色**:测试角色
|
||||
|
||||
## 外貌特征
|
||||
|
||||
- **整体印象**:[待填写]
|
||||
- **面部特征**:[待填写]
|
||||
- **身材体型**:[待填写]
|
||||
- **着装风格**:[待填写]
|
||||
- **标志性特征**:[待填写]
|
||||
|
||||
## 性格特点
|
||||
|
||||
- **核心性格**:[待填写]
|
||||
- **优点**:[待填写]
|
||||
- **缺点**:[待填写]
|
||||
- **价值观**:[待填写]
|
||||
- **恐惧**:[待填写]
|
||||
- **渴望**:[待填写]
|
||||
|
||||
## 背景故事
|
||||
|
||||
- **出身背景**:[待填写]
|
||||
- **关键经历**:[待填写]
|
||||
- **转折点**:[待填写]
|
||||
- **未解之谜**:[待填写]
|
||||
|
||||
## 动机层次
|
||||
|
||||
- **表层目标**:[待填写]
|
||||
- **情感需求**:[待填写]
|
||||
- **存在需求**:[待填写]
|
||||
- **未意识需求**:[待填写]
|
||||
|
||||
## 人物关系
|
||||
|
||||
- **与主角关系**:[待填写]
|
||||
- **重要关系人**:[待填写]
|
||||
- **敌对关系**:[待填写]
|
||||
- **情感羁绊**:[待填写]
|
||||
|
||||
## 故事发展
|
||||
|
||||
- **角色目标**:[待填写]
|
||||
- **内在冲突**:[待填写]
|
||||
- **外在冲突**:[待填写]
|
||||
- **发展弧线**:[待填写]
|
||||
- **可能的结局**:[待填写]
|
||||
|
||||
## 核心身份
|
||||
|
||||
- **本质自我**:[待填写]
|
||||
- **社会面具**:[待填写]
|
||||
- **理想自我**:[待填写]
|
||||
- **恐惧自我**:[待填写]
|
||||
|
||||
## 创作笔记
|
||||
|
||||
- **灵感来源**:[待填写]
|
||||
- **象征意义**:[待填写]
|
||||
- **潜在发展**:[待填写]
|
||||
|
||||
---
|
||||
|
||||
## 档案元数据
|
||||
|
||||
- **角色类型**:主角模板
|
||||
- **创建时间**:2026-01-26 01:42:27
|
||||
- **状态**:草稿
|
||||
- **版本**:1.0
|
||||
230
skills/chinese-novelist-skill/README.md
Normal file
230
skills/chinese-novelist-skill/README.md
Normal file
@ -0,0 +1,230 @@
|
||||
<div align="center">
|
||||
|
||||
# 🎭 chinese-novelist skill
|
||||
|
||||
### 让 AI 为你写一部完整的中文小说
|
||||
|
||||
[](https://claude.com/claude-code)
|
||||
[](LICENSE)
|
||||
|
||||
</div>
|
||||
---
|
||||
|
||||
## ✨ 为什么用这个?
|
||||
|
||||
写小说最难的是**坚持写完**。这个 Skill 专为解决这个痛点而生:
|
||||
|
||||
- **无脑创作** - 回答 5 个问题,剩下的交给 AI
|
||||
- **自动连贯** - 章节摘要自动追踪,人物状态不丢失
|
||||
- **每章必爽** - 开头即高潮,结尾留悬念
|
||||
- **质量保证** - 内置专业级创作检查清单
|
||||
|
||||
## 🚀 快速开始
|
||||
|
||||
```
|
||||
使用 chinese-novelist 帮我写一部小说
|
||||
```
|
||||
|
||||
### 三阶段创作流程
|
||||
|
||||
**第一阶段:5 问逐一确认**
|
||||
|
||||
AI 会逐一询问,你用上下箭头选择:
|
||||
|
||||
```
|
||||
📝 问题 1/5:你想要创作什么题材的小说?
|
||||
□ 悬疑推理(侦探、破案、解谜)
|
||||
□ 现代言情(都市、职场、恋爱)
|
||||
□ 古代言情(宫廷、江湖、穿越)
|
||||
□ 奇幻玄幻(魔法、异世界、修真)
|
||||
□ 科幻未来(科技、太空、末世)
|
||||
□ 武侠仙侠(江湖、门派、飞升)
|
||||
□ 历史架空(朝堂、战争、权谋)
|
||||
□ 都市现实(生活、成长、社会)
|
||||
|
||||
📝 问题 2/5:主角是什么设定?
|
||||
□ 男性主角(独角戏)
|
||||
□ 女性主角(独角戏)
|
||||
□ 双主角(男女双线)
|
||||
□ 群像戏(多线叙事)
|
||||
|
||||
📝 问题 3/5:主角的核心性格是?
|
||||
□ 热血正义(积极、勇敢、有担当)
|
||||
□ 冷静智慧(理性、谋略、高智商)
|
||||
□ 温暖治愈(善良、温柔、有同理心)
|
||||
□ 高冷孤傲(冷漠、独立、强大)
|
||||
□ 阴暗腹黑(心机、算计、复仇)
|
||||
□ 成长逆袭(从弱到强、打脸升级)
|
||||
|
||||
📝 问题 4/5:小说的核心冲突是什么?
|
||||
□ 生死存亡 / 查明真相 / 爱情阻碍
|
||||
□ 复仇雪恨 / 权力争夺 / 成长突破 / 守护保护
|
||||
|
||||
📝 问题 5/5:你计划创作多少章?
|
||||
□ 10章(3-5万字)
|
||||
□ 15章(4.5-7.5万字)
|
||||
□ 20章(6-10万字)
|
||||
□ 30章(9-15万字)
|
||||
□ 50章(15-25万字)
|
||||
□ 自定义
|
||||
```
|
||||
|
||||
**第二阶段:规划展示 + 二次确认**
|
||||
|
||||
AI 自动生成完整大纲和人物档案,展示给你确认:
|
||||
|
||||
```
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
规划完成!请确认以下内容:
|
||||
|
||||
基本信息
|
||||
题材:悬疑推理
|
||||
主角:男性主角(侦探)
|
||||
核心冲突:查明真相
|
||||
章节数:20章
|
||||
|
||||
章节规划
|
||||
第1章:午夜凶铃 - 主角接到神秘电话
|
||||
第2章:第一具尸体 - 发现密室杀人案
|
||||
第3章:消失的证据 - 线索被人篡改
|
||||
...
|
||||
|
||||
主要角色
|
||||
主角:李明 - 资深刑警,冷静智慧
|
||||
反派:张华 - 高智商罪犯
|
||||
关键配角:王芳 - 法医专家
|
||||
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
|
||||
回复"确认"或"开始" → 立即进入疯狂创作模式
|
||||
提出修改意见 → 调整后重新确认
|
||||
```
|
||||
|
||||
**第三阶段:疯狂创作**
|
||||
|
||||
确认后,AI 进入**疯狂创作模式**,一章接一章地写下去,无需再次确认。
|
||||
|
||||
你可以离开工作台,等待完成。
|
||||
|
||||
---
|
||||
|
||||
## 📖 输出样例
|
||||
|
||||
```
|
||||
novels/
|
||||
└── 午夜列车/
|
||||
├── 00-大纲.md # 故事概述、章节规划、悬念线
|
||||
├── 01-人物档案.md # 主角、反派、配角档案
|
||||
├── 第01章-最后一班列车.md
|
||||
├── 第02章-消失的乘客.md
|
||||
└── ...
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🎯 核心法则
|
||||
|
||||
| 法则 | 说明 |
|
||||
|-----|------|
|
||||
| **展示而非讲述** | 用动作和对话表现,不要直接陈述 |
|
||||
| **冲突驱动剧情** | 每章必须有冲突或转折 |
|
||||
| **悬念承上启下** | 每章结尾必须留下钩子 |
|
||||
| **开头即高潮** | 前 20% 必须极其吸引人 |
|
||||
|
||||
---
|
||||
|
||||
## 🛠️ 安装
|
||||
|
||||
将此目录放入 Claude Code 的 skills 目录:
|
||||
|
||||
```
|
||||
~/.claude/skills/chinese-novelist/
|
||||
```
|
||||
|
||||
或通过 Claude Code 技能管理界面安装。
|
||||
|
||||
---
|
||||
|
||||
## 📸 效果展示
|
||||
|
||||
### 第一步:5 问逐一确认
|
||||
|
||||
AI 逐一询问问题,你用上下箭头选择选项:
|
||||
|
||||
```
|
||||
📝 问题 1/5:你想要创作什么题材的小说?
|
||||
○ 悬疑推理(侦探、破案、解谜)
|
||||
○ 现代言情(都市、职场、恋爱)
|
||||
○ 古代言情(宫廷、江湖、穿越)
|
||||
● 奇幻玄幻(魔法、异世界、修真) ← 你选择这个
|
||||
...
|
||||
```
|
||||
|
||||
### 第二步:查看规划并确认
|
||||
|
||||
AI 生成完整大纲和人物档案后,展示给你确认:
|
||||
|
||||
```
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
规划完成!请确认以下内容:
|
||||
|
||||
基本信息
|
||||
题材:奇幻玄幻
|
||||
主角:女性主角(修真者)
|
||||
核心冲突:成长突破
|
||||
章节数:30章
|
||||
|
||||
章节规划(前 5 章)
|
||||
第1章:天降异象 - 灵根觉醒仪式
|
||||
第2章:拜入仙门 - 踏入修真界
|
||||
第3章:初次试炼 - 迷幻森林试炼
|
||||
第4章:遭遇强敌 - 面对宗门刁难
|
||||
第5章:突破瓶颈 - 顿悟筑基期
|
||||
...
|
||||
|
||||
主要角色
|
||||
主角:林雨 - 天灵根,坚韧不拔
|
||||
反派:赵天 - 嫉妒主角天赋
|
||||
关键配角:白师姐 - 宗门导师
|
||||
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
|
||||
回复"确认"或"开始" → 立即进入疯狂创作模式
|
||||
```
|
||||
|
||||
### 第三步:疯狂创作,等待全稿完成
|
||||
|
||||
确认后立即进入创作模式,AI 一章接一章地输出:
|
||||
|
||||
```
|
||||
✅ 第1章完成(3247字)
|
||||
✅ 第2章完成(3582字)
|
||||
✅ 第3章完成(3412字)
|
||||
...
|
||||
```
|
||||
|
||||
几十分钟后,一部完整的 30 章小说初稿就完成了。你可以离开工作台,等待完成。
|
||||
|
||||
---
|
||||
|
||||
## 📚 内置参考资料
|
||||
|
||||
| 文件 | 内容 |
|
||||
|------|------|
|
||||
| `chapter-guide.md` | 章节结构设计指南(含 10 种强力开头技巧) |
|
||||
| `hook-techniques.md` | 悬念设置技巧(10 种结尾钩子类型) |
|
||||
| `character-building.md` | 人物塑造方法 |
|
||||
| `dialogue-writing.md` | 对话写作规范 |
|
||||
| `quality-checklist.md` | 质量检查清单(交付前自查) |
|
||||
| `plot-structures.md` | 情节结构模板 |
|
||||
| `consistency.md` | 连贯性保证机制(人物、情节、节奏) |
|
||||
| `content-expansion.md` | 内容扩充技巧(7 种自然扩充方法) |
|
||||
| `outline-template.md` | 大纲模板(章节规划、悬念线) |
|
||||
| `character-template.md` | 人物档案模板 |
|
||||
| `chapter-template.md` | 章节文件模板 |
|
||||
|
||||
---
|
||||
|
||||
## ⚖️ 许可
|
||||
|
||||
MIT
|
||||
195
skills/chinese-novelist-skill/SKILL.md
Normal file
195
skills/chinese-novelist-skill/SKILL.md
Normal file
@ -0,0 +1,195 @@
|
||||
---
|
||||
name: chinese-novelist
|
||||
description: |
|
||||
分章节创作引人入胜的中文小说。支持各种题材(悬疑/言情/奇幻/科幻/历史等),支持10-50章长篇创作,每章3000-5000字,结尾设置悬念钩子。强调深度润色去除AI痕迹,确保文字自然流畅。
|
||||
当用户要求:写小说、创作故事、分章节写作、连续剧情、章节悬念、长篇小说时使用。
|
||||
metadata:
|
||||
trigger: 创作中文小说、分章节故事、长篇小说创作
|
||||
source: 基于小说创作最佳实践设计
|
||||
---
|
||||
|
||||
# Chinese Novelist: 中文小说创作助手
|
||||
|
||||
## 核心流程
|
||||
|
||||
### 第一阶段:5问确认
|
||||
|
||||
**使用 AskUserQuestion 工具逐一询问用户,每个问题提供选项供用户选择。**
|
||||
|
||||
---
|
||||
|
||||
**问题1:题材与风格**
|
||||
|
||||
```
|
||||
Question: 你想要创作什么题材的小说?
|
||||
Options:
|
||||
- 悬疑推理(侦探、破案、解谜)
|
||||
- 现代言情(都市、职场、恋爱)
|
||||
- 古代言情(宫廷、江湖、穿越)
|
||||
- 奇幻玄幻(魔法、异世界、修真)
|
||||
- 科幻未来(科技、太空、末世)
|
||||
- 武侠仙侠(江湖、门派、飞升)
|
||||
- 历史架空(朝堂、战争、权谋)
|
||||
- 都市现实(生活、成长、社会)
|
||||
```
|
||||
|
||||
用户选择后记录:`题材 = [用户选择]`
|
||||
|
||||
---
|
||||
|
||||
**问题2:主角设定**
|
||||
|
||||
```
|
||||
Question: 主角是什么设定?
|
||||
Options:
|
||||
- 男性主角(独角戏)
|
||||
- 女性主角(独角戏)
|
||||
- 双主角(男女双线)
|
||||
- 群像戏(多线叙事)
|
||||
```
|
||||
|
||||
用户选择后,如需进一步询问职业/身份,继续追问。
|
||||
|
||||
记录:`主角 = [用户选择]` + `职业/身份 = [用户回答]`
|
||||
|
||||
---
|
||||
|
||||
**问题3:主角性格**
|
||||
|
||||
```
|
||||
Question: 主角的核心性格是?
|
||||
Options:
|
||||
- 热血正义(积极、勇敢、有担当)
|
||||
- 冷静智慧(理性、谋略、高智商)
|
||||
- 温暖治愈(善良、温柔、有同理心)
|
||||
- 高冷孤傲(冷漠、独立、强大)
|
||||
- 阴暗腹黑(心机、算计、复仇)
|
||||
- 成长逆袭(从弱到强、打脸升级)
|
||||
```
|
||||
|
||||
记录:`性格 = [用户选择]`
|
||||
|
||||
---
|
||||
|
||||
**问题4:核心冲突**
|
||||
|
||||
```
|
||||
Question: 小说的核心冲突是什么?
|
||||
Options:
|
||||
- 生死存亡(生存危机、逃出生天)
|
||||
- 查明真相(寻找答案、揭露秘密)
|
||||
- 爱情阻碍(追求真爱、克服阻碍)
|
||||
- 复仇雪恨(复仇计划、伸张正义)
|
||||
- 权力争夺(竞争上位、资源争夺)
|
||||
- 成长突破(自我突破、实现价值)
|
||||
- 守护保护(守护重要的人或事)
|
||||
```
|
||||
|
||||
记录:`核心冲突 = [用户选择]`
|
||||
|
||||
---
|
||||
|
||||
**问题5:章节数量**
|
||||
|
||||
```
|
||||
Question: 你计划创作多少章?
|
||||
Options:
|
||||
- 10章(短篇,约3-5万字)
|
||||
- 15章(中短篇,约4.5-7.5万字)
|
||||
- 20章(中篇,约6-10万字)
|
||||
- 30章(中长篇,约9-15万字)
|
||||
- 50章(长篇,约15-25万字)
|
||||
- 自定义(输入具体章节数)
|
||||
```
|
||||
|
||||
记录:`章节数 = [用户选择]`
|
||||
|
||||
---
|
||||
|
||||
**5问收集完成后**然后进入"第二阶段:规划"。
|
||||
|
||||
---
|
||||
|
||||
### 第二阶段:规划 + 二次确认
|
||||
|
||||
执行以下步骤:
|
||||
|
||||
1. **创建项目文件夹**:`novels/[小说名称]/`
|
||||
2. **生成大纲**:创建 `00-大纲.md`,使用 `references/outline-template.md` 模板,填入完整的章节规划
|
||||
3. **生成人物档案**:创建 `01-人物档案.md`,使用 `references/character-template.md` 模板,创建主角、反派、配角档案
|
||||
|
||||
完成后,向用户展示规划摘要并请求确认,等待用户确认。用户同意后,进入"第三阶段:疯狂创作"。
|
||||
|
||||
---
|
||||
|
||||
### 第三阶段:疯狂创作
|
||||
|
||||
**重要:全程无需再次向用户确认,必须逐一章创作**
|
||||
|
||||
按顺序逐章创作,每章执行完整的创作流程(见下方"逐章创作"),完成一章后自动继续下一章,直到所有章节完成。
|
||||
|
||||
---
|
||||
|
||||
## 疯狂创作——逐章创作流程
|
||||
|
||||
每章创作时严格执行以下步骤:
|
||||
|
||||
#### 1. 写前分析
|
||||
|
||||
1. 读取 `00-大纲.md` - 查看TODO list和已完成章节的摘要
|
||||
2. 读取 `00-大纲.md` 中上一章的摘要
|
||||
3. 更新`00-大纲.md` 中 TODO list - 将本章标记为"进行中"
|
||||
4. 设计开头钩子 - **最关键**:前20%必须有即时冲突 → [chapter-guide.md](references/chapter-guide.md)(10种开头技巧)
|
||||
5. 规划场景 - 确定本章需要3-5个场景
|
||||
|
||||
#### 2. 撰写
|
||||
|
||||
6. 创建章节文件 - 使用`references/chapter-template.md` 模板
|
||||
7. 撰写正文 - **每章必须达到3000-5000字**
|
||||
- 开头检查:前20%是否极其吸引人?
|
||||
- 对话规范 → [dialogue-writing.md](references/dialogue-writing.md)
|
||||
- 内容不足?使用 [content-expansion.md](references/content-expansion.md) 扩充技巧
|
||||
8. 设置结尾钩子 → [hook-techniques.md](references/hook-techniques.md)(10种钩子类型)
|
||||
9. **字数检查** - 必须使用脚本检查字数:`python scripts/check_chapter_wordcount.py <章节文件路径>` 低于3000字必须使用扩充技巧重写
|
||||
|
||||
#### 3. 撰写后优化
|
||||
|
||||
10. 连贯性检查 → [consistency.md](references/consistency.md) - 人物一致性、情节连贯、节奏控制
|
||||
11. **深度润色(去除AI味)** - 重点检查并修改:
|
||||
- **去除过度修饰的形容词**:删减"璀璨"、"瑰丽"、"绚烂"等AI常用词堆砌
|
||||
- **减少抽象陈述**:把"心中涌起复杂的情感"改为具体动作/对话
|
||||
- **打破四字格律**:避免"心潮澎湃、热血沸腾"等陈词滥调
|
||||
- **增加口语化表达**:人物对话要有个性,避免"书面语套话"
|
||||
- **优化节奏感**:长句和短句交替,避免句式单调
|
||||
- **细节具象化**:用具体的视觉/听觉/嗅觉细节替代笼统描述
|
||||
12. **字数检查** - 必须使用脚本检查字数:`python scripts/check_chapter_wordcount.py <章节文件路径>` 低于3000字必须使用扩充技巧重写
|
||||
|
||||
#### 4. 最后收尾
|
||||
|
||||
13. 生成章节摘要 - 在 `00-大纲.md` 添加摘要(300-500字)
|
||||
14. 更新状态 - `00-大纲.md` 中 TODO list - 将本章标记为"完成"
|
||||
|
||||
---
|
||||
|
||||
## 三大黄金法则
|
||||
|
||||
1. **展示而非讲述** - 用动作和对话表现,不要直接陈述
|
||||
2. **冲突驱动剧情** - 每章必须有冲突或转折
|
||||
3. **悬念承上启下** - 每章结尾必须留下钩子
|
||||
|
||||
### 字数检查脚本
|
||||
|
||||
使用 `scripts/check_chapter_wordcount.py` 检查章节字数:
|
||||
|
||||
```bash
|
||||
# 检查单个章节
|
||||
python scripts/check_chapter_wordcount.py novels/小说名/第01章.md
|
||||
|
||||
# 检查所有章节
|
||||
python scripts/check_chapter_wordcount.py --all novels/小说名/
|
||||
|
||||
# 自定义最小字数
|
||||
python scripts/check_chapter_wordcount.py novels/小说名/第01章.md 3500
|
||||
```
|
||||
|
||||
低于3000字的章节必须使用 [content-expansion.md](references/content-expansion.md) 的扩充技巧进行扩充。
|
||||
6
skills/chinese-novelist-skill/_meta.json
Normal file
6
skills/chinese-novelist-skill/_meta.json
Normal file
@ -0,0 +1,6 @@
|
||||
{
|
||||
"ownerId": "kn782yeacw14c8tj4j8b389x1x82b6j1",
|
||||
"slug": "chinese-novelist-skill",
|
||||
"version": "1.0.0",
|
||||
"publishedAt": 1772850697732
|
||||
}
|
||||
261
skills/chinese-novelist-skill/references/chapter-guide.md
Normal file
261
skills/chinese-novelist-skill/references/chapter-guide.md
Normal file
@ -0,0 +1,261 @@
|
||||
# 章节写作指南
|
||||
|
||||
每一章都应该是一个完整的叙事单元,同时推动整体故事向前发展。
|
||||
|
||||
## ⚠️ 关键原则:前 20% 决定生死
|
||||
|
||||
**读者在前 20% 的内容决定是否继续阅读。**
|
||||
|
||||
如果开头不够吸引人,读者会放弃,无论后面写得多么精彩。
|
||||
|
||||
### 前 20% 必须达到的效果
|
||||
|
||||
1. **即时紧张感** - 读者立即感受到危机/冲突
|
||||
2. **重大事件** - 发生推动剧情的重要事情
|
||||
3. **情感冲击** - 读者产生强烈情绪(好奇、震惊、担忧)
|
||||
4. **继续阅读的欲望** - 迫切想知道接下来发生什么
|
||||
|
||||
### 开头致命错误(绝对避免)
|
||||
|
||||
| 错误类型 | 示例 | 为什么致命 |
|
||||
|---------|------|-----------|
|
||||
| 天气描写 | "那天天气晴朗,万里无云..." | 与故事无关,读者无耐心 |
|
||||
| 日常流程 | "李明醒来,刷牙洗脸,吃早餐..." | 无聊,没有冲突 |
|
||||
| 回顾上章 | "上一章我们说到..." | 读者已经知道,浪费时间 |
|
||||
| 缓慢铺垫 | "先介绍一下这个城市的背景..." | 信息倾倒,没有行动 |
|
||||
| 平淡对话 | "你好,你好吗?我很好。" | 无意义对话,没有张力 |
|
||||
| 过度解释 | "这是因为,所以,然后..." | 讲述而非展示 |
|
||||
|
||||
---
|
||||
|
||||
## 十种强力开头技巧
|
||||
|
||||
### 1. 行动中开场(In Media Res)
|
||||
|
||||
直接从冲突/动作的高潮点开始。
|
||||
|
||||
**示例:**
|
||||
> 子弹擦过他的耳边,击碎了身后的花瓶。李明没有回头,翻滚躲到沙发后面。
|
||||
|
||||
**为什么有效:** 立即建立紧张感,读者想知道为什么被打。
|
||||
|
||||
### 2. 反常情境
|
||||
|
||||
呈现一个不符合常理的场景,激发好奇。
|
||||
|
||||
**示例:**
|
||||
> 死人坐在办公桌前,正在写一份报告。
|
||||
|
||||
**为什么有效:** 不可能的事物,读者想了解怎么回事。
|
||||
|
||||
### 3. 震撼对话
|
||||
|
||||
用一句惊人的对话开场。
|
||||
|
||||
**示例:**
|
||||
> "我把孩子卖了。" 妻子平静地说,继续翻阅杂志。
|
||||
|
||||
**为什么有效:** 立即制造情感冲击和悬念。
|
||||
|
||||
### 4. 倒计时开场
|
||||
|
||||
从时间压力开始。
|
||||
|
||||
**示例:**
|
||||
> 还有三分钟,炸弹就会爆炸。而拆弹包里少了一根红线。
|
||||
|
||||
**为什么有效:** 紧迫感,读者想知道能否及时。
|
||||
|
||||
### 5. 重大发现
|
||||
|
||||
从发现关键线索/真相开始。
|
||||
|
||||
**示例:**
|
||||
> 法医报告摊在桌上。死因不是意外,是精心策划的谋杀。而嫌疑人只有一个——他自己。
|
||||
|
||||
**为什么有效:** 重大转折,重新理解之前的事件。
|
||||
|
||||
### 6. 危机时刻
|
||||
|
||||
从角色面临最大危机开始。
|
||||
|
||||
**示例:**
|
||||
> 门被踹开的瞬间,她知道藏不住了。保险箱里的秘密即将曝光。
|
||||
|
||||
**为什么有效:** 高风险,读者关心角色命运。
|
||||
|
||||
### 7. 谜团浮现
|
||||
|
||||
从无法解释的现象开始。
|
||||
|
||||
**示例:**
|
||||
> 醒来时,他发现右手背上出现了一个从未见过的纹身。而他不记得昨晚发生了什么。
|
||||
|
||||
**为什么有效:** 神秘感,读者想解开谜题。
|
||||
|
||||
### 8. 背叛开场
|
||||
|
||||
从背叛/信任崩塌开始。
|
||||
|
||||
**示例:**
|
||||
> 枪口对准他的后背。"对不起," 他信任了十年的搭档说,"他们给的太多了。"
|
||||
|
||||
**为什么有效:** 情感冲击,角色陷入绝境。
|
||||
|
||||
### 9. 重大选择
|
||||
|
||||
从角色的艰难决定开始。
|
||||
|
||||
**示例:**
|
||||
> 救生艇只能载一个人。她的丈夫和女儿都在冰冷的海水里挣扎。她伸出手——
|
||||
|
||||
**为什么有效:** 道德困境,读者想知道她如何选择。
|
||||
|
||||
### 10. 结局预告
|
||||
|
||||
从未来的某个关键时刻开始,然后倒叙。
|
||||
|
||||
**示例:**
|
||||
> 三天后,所有人都会后悔今天的决定。但此刻,会议室里的每个人都在微笑。
|
||||
|
||||
**为什么有效:** 预示灾难,读者想知道如何发生。
|
||||
|
||||
---
|
||||
|
||||
## 标准章节结构
|
||||
|
||||
### 1. 开头钩子(前 20%)⚠️ 最关键
|
||||
|
||||
**必须包含:**
|
||||
- ✅ 即时冲突/危机
|
||||
- ✅ 重大事件/信息
|
||||
- ✅ 强烈情感冲击
|
||||
- ✅ 行动场景
|
||||
|
||||
**使用上述十种技巧之一,或组合使用。**
|
||||
|
||||
### 2. 发展推进(中间 50-60%)
|
||||
|
||||
本章的核心内容,必须推进剧情或深化人物。
|
||||
|
||||
**推进方式:**
|
||||
- **新信息揭示**:让读者/主角获得重要信息
|
||||
- **关系变化**:人物关系发生转变
|
||||
- **问题升级**:现状恶化,新危机出现
|
||||
- **角色成长**:主角获得新技能、新认知
|
||||
|
||||
**避免:**
|
||||
- 纯粹的场景描写(风景、房间布局等)
|
||||
- 与剧情无关的人物互动
|
||||
- 重复已知的对话
|
||||
|
||||
### 3. 高潮时刻(后 15-20%)
|
||||
|
||||
本章的情感或动作最高点。
|
||||
|
||||
**高潮类型:**
|
||||
- **动作高潮**:战斗、追逐、对抗
|
||||
- **情感高潮**:重大发现、背叛、告白、牺牲
|
||||
- **心理高潮**:主角的内心转折点
|
||||
|
||||
### 4. 结尾钩子(最后 5-10%)
|
||||
|
||||
留下悬念,让读者想看下一章。详见 [hook-techniques.md](hook-techniques.md)
|
||||
|
||||
---
|
||||
|
||||
## 章节类型分类
|
||||
|
||||
### 情节推进章
|
||||
|
||||
**目的**:推动主线剧情发展
|
||||
**特征**:有明确的事件进展、重要信息揭示
|
||||
**示例**:主角发现线索、敌人发动攻击、盟友背叛
|
||||
|
||||
### 人物深化章
|
||||
|
||||
**目的**:深化读者对人物的理解
|
||||
**特征**:揭示人物背景、动机、内心冲突
|
||||
**示例**:回忆片段、私密对话、独处时刻
|
||||
**注意**:必须与主线相关,不能是纯粹的人物小传
|
||||
|
||||
### 氛围营造章
|
||||
|
||||
**目的**:建立特定情绪或紧张感
|
||||
**特征**:注重感官描写、节奏控制
|
||||
**示例**:暴风雨前的宁静、潜伏行动、等待审判
|
||||
|
||||
### 过渡衔接章
|
||||
|
||||
**目的**:连接两个重大事件
|
||||
**特征**:信息整理、位置转换、时间跳跃
|
||||
**注意**:保持简洁,避免拖沓
|
||||
|
||||
---
|
||||
|
||||
## 章节节奏控制
|
||||
|
||||
### 节奏变化
|
||||
|
||||
同一章内应包含节奏变化:
|
||||
|
||||
```
|
||||
紧张 → 缓解 → 新紧张 → 更紧张
|
||||
```
|
||||
|
||||
示例:
|
||||
```
|
||||
紧张:主角被追捕
|
||||
缓解:躲进安全屋,短暂喘息
|
||||
新紧张:发现安全屋已被入侵
|
||||
更紧张:必须立即逃离
|
||||
```
|
||||
|
||||
### 信息密度
|
||||
|
||||
- **高密度**:动作场面、大量对话、快速事件
|
||||
- **低密度**:内心独白、环境描写、情感沉淀
|
||||
|
||||
**原则**:高低密度交替,避免持续高密度(读者疲劳)或持续低密度(读者无聊)
|
||||
|
||||
---
|
||||
|
||||
## 章节长度与内容密度对照
|
||||
|
||||
| 章节字数 | 核心事件数量 | 场景数量 |
|
||||
|---------|-------------|---------|
|
||||
| 800-1500 | 1 个主要事件 | 1-2 个场景 |
|
||||
| 1500-3000 | 1-2 个主要事件 | 2-3 个场景 |
|
||||
| 3000-5000 | 2-3 个主要事件 | 3-5 个场景 |
|
||||
|
||||
**原则**:每章至少包含一个不可删除的核心事件。如果一个事件可以移除而不影响理解,则应删除。
|
||||
|
||||
---
|
||||
|
||||
## 章节写作检查清单
|
||||
|
||||
撰写每章后自查:
|
||||
|
||||
### ⚠️ 开头检查(最关键)
|
||||
- [ ] **前 20% 是否极其吸引人?**(如果不是,重写)
|
||||
- [ ] 是否在第一段就建立冲突/紧张?
|
||||
- [ ] 是否有重大事件或信息揭示?
|
||||
- [ ] 是否有强烈的情感冲击?
|
||||
- [ ] 读者是否会迫切想知道接下来发生什么?
|
||||
- [ ] 是否避免了所有"致命错误"?(天气、日常、回顾等)
|
||||
|
||||
### 内容检查
|
||||
- [ ] 本章是否推进了主线剧情或深化了人物?
|
||||
- [ ] 是否有冲突或转折?
|
||||
- [ ] 对话是否推动情节或揭示人物?
|
||||
- [ ] 是否展示了而非讲述了关键信息?
|
||||
- [ ] 结尾是否留下悬念钩子?
|
||||
- [ ] 是否为下一章埋下伏笔?
|
||||
|
||||
### 开头自测问题
|
||||
如果对开头有任何问题回答"否",必须重写:
|
||||
1. 读者读了前三段后,会想继续读吗?
|
||||
2. 开头是否有冲突或危机?
|
||||
3. 开头是否有意外或转折?
|
||||
4. 开头是否让读者产生强烈情绪?
|
||||
5. 开头是否避免了平淡的日常/天气/背景说明?
|
||||
19
skills/chinese-novelist-skill/references/chapter-template.md
Normal file
19
skills/chinese-novelist-skill/references/chapter-template.md
Normal file
@ -0,0 +1,19 @@
|
||||
# 第[X]章:[章节标题]
|
||||
|
||||
## 本章概要
|
||||
- **核心事件**:[一句话概括本章发生的事]
|
||||
- **承接上章**:[回应上一章的悬念]
|
||||
- **悬念钩子**:[本章结尾的钩子]
|
||||
|
||||
---
|
||||
|
||||
## 正文
|
||||
|
||||
[章节正文内容 3000-5000 字,最低不低于 2500 字]
|
||||
|
||||
---
|
||||
|
||||
## 章节备注
|
||||
- 本章悬念:[简述结尾钩子]
|
||||
- 下章预告:[可选,1-2句话]
|
||||
- 伏笔标记:[如果埋下伏笔,在此记录]
|
||||
220
skills/chinese-novelist-skill/references/character-building.md
Normal file
220
skills/chinese-novelist-skill/references/character-building.md
Normal file
@ -0,0 +1,220 @@
|
||||
# 人物塑造原则
|
||||
|
||||
好的人物是故事的灵魂。读者记住的是人,不是情节。
|
||||
|
||||
## 人物档案模板
|
||||
|
||||
每个主要角色都应建立完整档案:
|
||||
|
||||
### 基本信息
|
||||
|
||||
```
|
||||
姓名:(有意义的名字更好)
|
||||
年龄:
|
||||
职业:
|
||||
外貌特征:(2-3个显著特征,避免泛泛而谈)
|
||||
```
|
||||
|
||||
### 性格核心
|
||||
|
||||
```
|
||||
核心价值观:(他最相信什么)
|
||||
最大恐惧:(他最害怕什么)
|
||||
致命缺陷:(什么会导致他失败)
|
||||
内心渴望:(他真正想要什么)
|
||||
```
|
||||
|
||||
### 背景故事
|
||||
|
||||
```
|
||||
成长环境:
|
||||
创伤经历:(过去伤害他的事)
|
||||
关键记忆:(塑造他现在的关键事件)
|
||||
秘密:(别人不知道的事)
|
||||
```
|
||||
|
||||
### 行为模式
|
||||
|
||||
```
|
||||
说话方式:(口头禅、语速、用词习惯)
|
||||
肢体语言:(习惯动作、紧张时的小动作)
|
||||
社交风格:(内向/外向、如何对待陌生人)
|
||||
压力反应:(压力下如何表现)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 人物类型塑造
|
||||
|
||||
### 主角(Protagonist)
|
||||
|
||||
**必须有:**
|
||||
- **明确目标** - 他想要什么
|
||||
- **强大动机** - 为什么想要
|
||||
- **可共情性** - 读者能理解他的感受
|
||||
- **成长空间** - 故事中会改变
|
||||
|
||||
**主角原型:**
|
||||
| 类型 | 特征 | 故事作用 |
|
||||
|-----|------|---------|
|
||||
| 英雄型 | 勇敢、正义、利他 | 战胜外在威胁 |
|
||||
| 成长型 | 从弱小到强大 | 克服内在缺陷 |
|
||||
| 反英雄型 | 道德灰色、复杂 | 挑战传统道德 |
|
||||
| 平凡型 | 普通人卷入非凡事 | 读者代入感强 |
|
||||
|
||||
### 反派(Antagonist)
|
||||
|
||||
**好反派的特点:**
|
||||
- **强大可信** - 不应该是草台班子
|
||||
- **有自己的逻辑** - 他相信自己在做正确的事
|
||||
- **与主角有深层联系** - 不是单纯为了作恶
|
||||
- **揭示主题** - 挑战主角的信念
|
||||
|
||||
**反派动机类型:**
|
||||
- 理想主义扭曲("为了大局必须牺牲")
|
||||
- 过去创伤("世界伤害了我,我要报复")
|
||||
- 权力渴望("我配得上更多")
|
||||
- 与主角相同目标(不同方法)
|
||||
|
||||
### 配角(Supporting Characters)
|
||||
|
||||
**配角功能:**
|
||||
- **导师型** - 指引主角,传递信息
|
||||
- **盟友型** - 协助主角,提供情感支持
|
||||
- **搞笑型** - 缓解紧张,提供喜剧元素
|
||||
- **爱情型** - 制造浪漫线索,增加个人利害
|
||||
- **叛徒型** - 制造背叛和转折
|
||||
|
||||
**配角原则:**
|
||||
- 每个配角必须有明确作用
|
||||
- 删除"只是存在"的角色
|
||||
- 避免刻板印象(除非是有意为之)
|
||||
|
||||
---
|
||||
|
||||
## 人物深度塑造技巧
|
||||
|
||||
### 1. 矛盾性
|
||||
|
||||
真实的人是复杂的,充满矛盾。
|
||||
|
||||
**示例:**
|
||||
- 暴力的黑帮成员但爱护流浪猫
|
||||
- 无神论的牧师
|
||||
- 害怕黑暗的侦探
|
||||
- 重视友情但总是背叛朋友
|
||||
|
||||
### 2. 侧面揭示
|
||||
|
||||
不要直接陈述性格,通过行为展示。
|
||||
|
||||
| 错误(直接陈述) | 正确(侧面展示) |
|
||||
|----------------|----------------|
|
||||
| 他很愤怒 | 他捏碎手中的纸杯 |
|
||||
| 她很紧张 | 她反复调整眼镜位置 |
|
||||
| 他很傲慢 | 他从不直视下属的眼睛 |
|
||||
| 她很善良 | 她偷偷喂流浪狗三年 |
|
||||
|
||||
### 3. 声音独特性
|
||||
|
||||
每个人说话方式不同,对话中能分辨角色。
|
||||
|
||||
**区分要素:**
|
||||
- 用词选择(正式/俚语/方言)
|
||||
- 句子长度
|
||||
- 是否打断别人
|
||||
- 是否喜欢隐喻
|
||||
- 情绪表达方式
|
||||
|
||||
### 4. 动机合理化
|
||||
|
||||
每个角色行为必须有合理动机,即使动机扭曲。
|
||||
|
||||
**反派动机合理化示例:**
|
||||
- "我想毁灭世界" → 乏味
|
||||
- "我失去了一切,世界对我没有意义" → 可理解但扭曲
|
||||
- "人类是地球的病毒,我必须清除" → 有哲学支撑
|
||||
|
||||
### 5. 缺陷致命化
|
||||
|
||||
主角必须有缺陷,缺陷在关键时刻导致失败。
|
||||
|
||||
**经典缺陷模式:**
|
||||
| 缺陷 | 导致的失败 |
|
||||
|-----|----------|
|
||||
| 傲慢 | 低估对手,落入陷阱 |
|
||||
| 信任问题 | 拒绝帮助,孤立无援 |
|
||||
| 完美主义 | 无法及时行动,错失机会 |
|
||||
| 复仇心 | 被利用,失去理智 |
|
||||
|
||||
---
|
||||
|
||||
## 人物关系设计
|
||||
|
||||
### 关系类型
|
||||
|
||||
| 关系 | 戏剧潜力 | 应用 |
|
||||
|-----|---------|-----|
|
||||
| 亦敌亦友 | 高 | 悬疑、动作 |
|
||||
| 禁忌之爱 | 高 | 言情、悲剧 |
|
||||
| 师徒关系 | 中 | 成长故事 |
|
||||
| 兄弟竞争 | 中 | 家庭剧 |
|
||||
| 陌生人联盟 | 中 | 冒险、悬疑 |
|
||||
|
||||
### 关系动态变化
|
||||
|
||||
**好的关系会随故事发展:**
|
||||
```
|
||||
第一章:陌生人
|
||||
第三章:不情愿的盟友
|
||||
第五章:建立信任
|
||||
第七章:背叛/考验
|
||||
终章:真正的友谊(或决裂)
|
||||
```
|
||||
|
||||
### 关系揭示
|
||||
|
||||
**逐步揭示关系深度:**
|
||||
- 表层:表面互动
|
||||
- 中层:共同经历
|
||||
- 深层:真实感受/秘密
|
||||
|
||||
---
|
||||
|
||||
## 人物一致性检查
|
||||
|
||||
角色行为必须符合已建立的性格。
|
||||
|
||||
**检查问题:**
|
||||
- 这件事符合他的核心价值观吗?
|
||||
- 以他的背景,会有这样的反应吗?
|
||||
- 他的恐惧会如何影响这个决定?
|
||||
- 他的缺陷会导致他犯什么错?
|
||||
|
||||
**例外处理:**
|
||||
- 如果角色"不符合性格"行事,必须有原因
|
||||
- 解释应该在相同/下一章提供
|
||||
- 可以是成长的标志(角色克服缺陷)
|
||||
|
||||
---
|
||||
|
||||
## 人物出场设计
|
||||
|
||||
### 首次出场原则
|
||||
|
||||
**有效的出场方式:**
|
||||
- **行动中** - 展示能力或性格
|
||||
- **冲突中** - 立即建立关系/对立
|
||||
- **误解中** - 建立悬念
|
||||
|
||||
**避免:**
|
||||
- 镜子自照描写外貌
|
||||
- 姓名+年龄+职业的简历式介绍
|
||||
- 无意义的日常活动
|
||||
|
||||
### 出场示例对比
|
||||
|
||||
| 无效出场 | 有效出场 |
|
||||
|---------|---------|
|
||||
| 李明,28岁,是一名侦探。他走进办公室。| 李明跨过警戒线,警官试图拦住他。"市刑警队,李明。"他亮出证件,径直走向尸体。|
|
||||
| 美丽的女孩坐在窗边,她叫小红。| 她已经三天没睡了,咖啡杯里的液体在颤抖。当门铃响起时,她几乎把杯子摔在地上。|
|
||||
@ -0,0 +1,30 @@
|
||||
# 人物档案
|
||||
|
||||
## 主角
|
||||
|
||||
### [角色一姓名]
|
||||
- **年龄/职业**:
|
||||
- **外貌特征**:
|
||||
- **性格核心**:
|
||||
- **核心价值观**:
|
||||
- **最大恐惧**:
|
||||
- **致命缺陷**:
|
||||
- **内心渴望**:
|
||||
- **背景故事**:
|
||||
- **MBTI:**
|
||||
|
||||
### [角色二姓名]
|
||||
|
||||
......
|
||||
|
||||
|
||||
|
||||
## 反派
|
||||
|
||||
### [角色姓名]
|
||||
- [同主角格式]
|
||||
|
||||
## 配角
|
||||
|
||||
### [角色姓名]
|
||||
- [简化格式]
|
||||
40
skills/chinese-novelist-skill/references/consistency.md
Normal file
40
skills/chinese-novelist-skill/references/consistency.md
Normal file
@ -0,0 +1,40 @@
|
||||
# 连贯性保证机制
|
||||
|
||||
为确保长时间创作的故事连贯性:
|
||||
|
||||
## 写前必读
|
||||
|
||||
每次开始写新章节前:
|
||||
1. 阅读 `00-大纲.md` 中所有已完成章节的摘要
|
||||
2. 读取上一章文件,了解当前悬念
|
||||
3. 检查人物状态(位置、情绪、关系)
|
||||
|
||||
## 穿针引线
|
||||
|
||||
在新章节中:
|
||||
- 呼应前文埋下的伏笔和线索
|
||||
- 提及之前发生的事件(自然融入)
|
||||
- 让人物行为与之前保持一致
|
||||
|
||||
## 人物状态跟踪
|
||||
|
||||
注意人物在各章节中的变化和成长:
|
||||
- 位置变化(人在哪里)
|
||||
- 情绪状态(当前心情)
|
||||
- 关系变化(与其他角色关系)
|
||||
- 能力变化(获得新技能/信息)
|
||||
|
||||
## 悬念线延续
|
||||
|
||||
确保主线悬念逐步推进:
|
||||
- 每章至少回应一个旧悬念
|
||||
- 提出新悬念或升级现有悬念
|
||||
- 不要遗忘任何未解的悬念
|
||||
|
||||
## 一致性检查清单
|
||||
|
||||
- [ ] 人物行为符合其性格设定
|
||||
- [ ] 前后伏笔有呼应,逻辑闭环
|
||||
- [ ] 高潮低谷分布合理,节奏恰当
|
||||
- [ ] 时间线连贯(没有时间跳跃错误)
|
||||
- [ ] 场景转换自然(没有凭空出现)
|
||||
@ -0,0 +1,66 @@
|
||||
# 内容扩充技巧
|
||||
|
||||
当章节内容不足时,使用以下技巧自然扩充。
|
||||
|
||||
## 1. 场景细节描写
|
||||
|
||||
不要只说"他走进房间",描写:
|
||||
- 房间的布局、光线、气味
|
||||
- 物品的细节和质感
|
||||
- 环境对人物的影响
|
||||
- 人物在空间中的移动
|
||||
|
||||
## 2. 人物内心活动
|
||||
|
||||
展示而非讲述内心世界:
|
||||
- 角色的犹豫和纠结
|
||||
- 过去记忆的闪回(1-2段)
|
||||
- 对未来的担忧和期待
|
||||
- 道德选择的内心辩论
|
||||
|
||||
## 3. 对话扩展
|
||||
|
||||
不要只推进剧情,让对话:
|
||||
- 展现人物性格和说话方式
|
||||
- 包含潜台词和暗示
|
||||
- 有来回交锋和试探
|
||||
- 偶尔跑题再拉回(更真实)
|
||||
|
||||
## 4. 感官体验
|
||||
|
||||
调动五感描写:
|
||||
- 视觉:颜色、光影、形状
|
||||
- 听觉:声音、音乐、沉默
|
||||
- 触觉:温度、质感、疼痛
|
||||
- 嗅觉:气味、香味、腐臭
|
||||
- 味觉:食物、饮料、血腥味
|
||||
|
||||
## 5. 次要情节线
|
||||
|
||||
在主剧情中穿插:
|
||||
- 配角的小故事
|
||||
- 暗线的发展
|
||||
- 伏笔的埋设
|
||||
- 人物关系的微妙变化
|
||||
|
||||
## 6. 节奏放慢
|
||||
|
||||
关键时刻慢下来描写:
|
||||
- 动作场景的分解
|
||||
- 情感转变的过程
|
||||
- 发现真相的时刻
|
||||
- 紧张对峙的延展
|
||||
|
||||
## 7. 环境烘托
|
||||
|
||||
用环境反映情绪:
|
||||
- 天气和氛围
|
||||
- 社会环境背景
|
||||
- 文化习俗细节
|
||||
- 时代特征展现
|
||||
|
||||
## 扩充原则
|
||||
|
||||
- **自然融入** - 扩充内容要服务于故事,不要注水
|
||||
- **保持张力** - 即使扩充场景也不能失去冲突
|
||||
- **推进主线** - 所有扩充最终都要指向核心剧情
|
||||
316
skills/chinese-novelist-skill/references/dialogue-writing.md
Normal file
316
skills/chinese-novelist-skill/references/dialogue-writing.md
Normal file
@ -0,0 +1,316 @@
|
||||
# 对话写作规范
|
||||
|
||||
好对话是揭示人物、推动情节、制造冲突的有力工具。
|
||||
|
||||
## 对话核心原则
|
||||
|
||||
### 1. 对话必须有目的
|
||||
|
||||
每句对话应该至少完成以下之一:
|
||||
|
||||
| 目的 | 示例 |
|
||||
|-----|------|
|
||||
| **推动情节** | "我找到凶器了,在河边的草丛里。" |
|
||||
| **揭示人物** | "我不信任警察,他们从来不帮我这样的人。" |
|
||||
| **制造冲突** | "你骗了我。你从头到尾都在骗我。" |
|
||||
| **传达信息** | "炸弹将在三点引爆。" |
|
||||
| **表达情感** | "我...我不知道该说什么。" |
|
||||
| **制造悬念** | "你知道那天晚上真正发生了什么吗?" |
|
||||
|
||||
**无效对话:**
|
||||
> "你好。"
|
||||
> "你好。"
|
||||
> "吃了吗?"
|
||||
> "吃了。"
|
||||
> "哦,那就好。"
|
||||
|
||||
### 2. 对话应该简洁
|
||||
|
||||
人们说话不写论文。删除多余的词。
|
||||
|
||||
| 啰嗦 | 简洁 |
|
||||
|-----|------|
|
||||
| "我想告诉你的是,我认为我们应该立刻离开这里。" | "我们得马上走。" |
|
||||
| "我非常抱歉,但我真的不知道你刚才说的那件事的答案。" | "我不知道。" |
|
||||
| "如果你不介意的话,我能不能请你帮我把那个东西递给我?" | "递给我那个。" |
|
||||
|
||||
### 3. 真实的人不会完整表达
|
||||
|
||||
真实对话充满:
|
||||
- 打断
|
||||
- 迟疑
|
||||
- 话题转移
|
||||
- 话没说完
|
||||
- 暗示而非明说
|
||||
|
||||
**示例:**
|
||||
> "我本来想告诉你,但是——"
|
||||
> "但是什么?"
|
||||
> "算了,没什么。"
|
||||
> "不,你说。"
|
||||
> "真的没什么。"
|
||||
|
||||
---
|
||||
|
||||
## 对话格式规范
|
||||
|
||||
### 中文对话标点
|
||||
|
||||
**基础格式:**
|
||||
```
|
||||
"说话内容," 他说。
|
||||
"说话内容?" 她问。
|
||||
"说话内容!" 他大喊。
|
||||
```
|
||||
|
||||
**多行对话:**
|
||||
```
|
||||
"第一句话,"他说,"第二句话。"
|
||||
|
||||
"第一句话。
|
||||
第二句话,"他说,"第三句话。"
|
||||
```
|
||||
|
||||
**对话动作:**
|
||||
```
|
||||
"说话内容。" 他做了动作。
|
||||
他做了动作。"说话内容。"
|
||||
```
|
||||
|
||||
### 对话标签使用
|
||||
|
||||
**规则:**
|
||||
- 能辨识说话人时,省略标签
|
||||
- 使用"说""问"等中性标签
|
||||
- 避免过度使用副词修饰
|
||||
|
||||
| 过度使用 | 改进后 |
|
||||
|---------|--------|
|
||||
| "你骗了我,"他愤怒地说。| "你骗了我。"他的声音在颤抖。 |
|
||||
| "好的,"她高兴地同意道。| 她眼睛亮了。"好的。" |
|
||||
| "我不知道,"他悲伤地回答。| 他低下头。"我不知道。" |
|
||||
|
||||
**标签位置:**
|
||||
- 对话前:[标签]"对话。"
|
||||
- 对话后:"对话。"[标签]
|
||||
- 对话中断:"对话,"[标签]"对话。"
|
||||
|
||||
### 段落划分
|
||||
|
||||
**规则:** 每个说话人的对话开始新段落。
|
||||
|
||||
```
|
||||
正确:
|
||||
"第一句,"甲说。
|
||||
"第二句,"乙回答。
|
||||
"第三句。"甲点头。
|
||||
|
||||
错误:
|
||||
"第一句,"甲说。"第二句,"乙回答。"第三句。"甲点头。
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 对话声音区分
|
||||
|
||||
每个角色说话方式应该不同。
|
||||
|
||||
### 区分维度
|
||||
|
||||
| 维度 | 示例 |
|
||||
|-----|------|
|
||||
| **用词** | 正式/俚语/方言/专业术语 |
|
||||
| **句式** | 长句/短句/破碎句 |
|
||||
| **停顿** | 流畅/迟疑/频繁打断 |
|
||||
| **语气** | 温和/激烈/冷嘲热讽/平淡 |
|
||||
| **习惯语** | 特定口头禅或用词习惯 |
|
||||
|
||||
### 角色声音示例
|
||||
|
||||
**教授型角色:**
|
||||
> "从理论角度分析,这个假设存在三个主要缺陷。首先,数据样本不足;其次,实验条件未受控制;最后,结论过于激进。"
|
||||
|
||||
**街头混混型角色:**
|
||||
> "扯淡。那帮人就是在放屁,想蒙咱们呢。我告诉你,这事儿没那么简单。"
|
||||
|
||||
**害羞内向型角色:**
|
||||
> "我...我是说,如果...如果你不介意的话...那个..."
|
||||
|
||||
**傲慢自大型角色:**
|
||||
> "让我来告诉你什么叫专业。你们这些业余人士根本不懂。"
|
||||
|
||||
---
|
||||
|
||||
## 潜台词(Subtext)
|
||||
|
||||
好的对话,真正含义在表面之下。
|
||||
|
||||
### 直接 vs 潜台词
|
||||
|
||||
| 直接(乏味) | 潜台词(有趣) |
|
||||
|-------------|---------------|
|
||||
| "我很生气。" | "没事。我挺好的。真的。" |
|
||||
| "我喜欢你。" | "你今天看起来...不错。" |
|
||||
| "我不信任你。" | "谢谢你告诉我。我会记住的。" |
|
||||
| "我想离开。" | "这个地方空气不太好。" |
|
||||
|
||||
### 潜台词技巧
|
||||
|
||||
**1. 话题转移**
|
||||
```
|
||||
"你爱我吗?"
|
||||
"你看了天气预报吗?明天有雨。"
|
||||
```
|
||||
|
||||
**2. 反问而非回答**
|
||||
```
|
||||
"你杀了他吗?"
|
||||
"你觉得像我这样的人会做那种事?"
|
||||
```
|
||||
|
||||
**3. 谈论其他事物**
|
||||
```
|
||||
"你想我吗?"
|
||||
"我妈昨天打电话来了。"
|
||||
```
|
||||
|
||||
**4. 沉默和动作**
|
||||
```
|
||||
"你愿意原谅我吗?"
|
||||
她继续看杂志,翻了一页。
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 对话与动作结合
|
||||
|
||||
对话与肢体语言配合,增强表现力。
|
||||
|
||||
### 同步原则
|
||||
|
||||
动作与对话一致或矛盾,都有戏剧效果。
|
||||
|
||||
**一致(增强):**
|
||||
> "我爱你。"她紧紧抱住他,眼泪流下来。
|
||||
|
||||
**矛盾(揭示真相):**
|
||||
> "我完全支持你。"他目光看向别处,手在口袋里握紧拳头。
|
||||
|
||||
### 动作打断
|
||||
|
||||
动作插入可以控制节奏。
|
||||
|
||||
```
|
||||
"我本来想告诉你,"他停下脚步,转过身,"但我想你已经知道了。"
|
||||
```
|
||||
|
||||
### 动作替代标签
|
||||
|
||||
用动作替代"他说"。
|
||||
|
||||
```
|
||||
"你在撒谎。"她拍案而起。
|
||||
"坐下。"他头也不抬。
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 对话场景类型
|
||||
|
||||
### 争吵场景
|
||||
|
||||
**特征:**
|
||||
- 短句
|
||||
- 打断
|
||||
- 重复强调
|
||||
- 情绪升级
|
||||
|
||||
**示例:**
|
||||
> "你答应过的!"
|
||||
> "情况变了!"
|
||||
> "那是你的借口!"
|
||||
> "你根本不懂!"
|
||||
> "我当然不懂!你什么都不告诉我!"
|
||||
|
||||
### 告白场景
|
||||
|
||||
**特征:**
|
||||
- 迟疑
|
||||
- 停顿
|
||||
- 寻找词语
|
||||
- 真诚或尴尬
|
||||
|
||||
**示例:**
|
||||
> "我...我想说...这些年,我一直在想...如果我们..."
|
||||
> 她低下头,声音变小。
|
||||
> "如果我们什么?"
|
||||
> "如果我们早一点相遇。"
|
||||
|
||||
### 审讯场景
|
||||
|
||||
**特征:**
|
||||
- 提问控制
|
||||
- 信息不对称
|
||||
- 压力建立
|
||||
- 操纵对话
|
||||
|
||||
**示例:**
|
||||
> "那天晚上你在哪里?"
|
||||
> "在家。"
|
||||
> "有人能证明吗?"
|
||||
> "...没有。"
|
||||
> "你是一个人?"
|
||||
> "是的。"
|
||||
> "整个晚上?"
|
||||
|
||||
### 调情场景
|
||||
|
||||
**特征:**
|
||||
- 双关语
|
||||
- 试探
|
||||
- 身体接近
|
||||
- 暗示
|
||||
|
||||
**示例:**
|
||||
> "你今天很漂亮。"
|
||||
> "只是今天?"
|
||||
> "嗯...今天特别漂亮。"
|
||||
> "那我明天该担心了?"
|
||||
> "明天...明天再看看。"
|
||||
|
||||
---
|
||||
|
||||
## 对话常见问题
|
||||
|
||||
### 避免
|
||||
|
||||
1. **信息倾倒** - 角色互相说已知信息
|
||||
> 错误:"正如你所知,我们的公司成立于1995年..."
|
||||
> 正确:通过情节自然揭示信息
|
||||
|
||||
2. **所有人说话一样** - 无法区分角色
|
||||
> 解决:给每个角色独特的说话方式
|
||||
|
||||
3. **过度礼貌** - 真实对话更粗糙
|
||||
> 错误:"我很抱歉打扰你,能否请你..."
|
||||
> 正确:"喂。帮我个忙。"
|
||||
|
||||
4. **无意义的闲聊** - 除非有特殊目的
|
||||
> 删除天气、吃饭等无关对话,除非揭示人物/推动情节
|
||||
|
||||
5. **说教** - 角色发表长篇哲学论述
|
||||
> 改为通过冲突和行动展示观点
|
||||
|
||||
---
|
||||
|
||||
## 对话练习自查
|
||||
|
||||
写完对话后检查:
|
||||
|
||||
- [ ] 每句对话是否有目的?
|
||||
- [ ] 删除后情节是否受影响?
|
||||
- [ ] 能否辨识说话人(不看标签)?
|
||||
- [ ] 是否有潜台词?
|
||||
- [ ] 节奏是否合适(快/慢)?
|
||||
- [ ] 是否符合人物性格?
|
||||
- [ ] 标签使用是否正确?
|
||||
195
skills/chinese-novelist-skill/references/hook-techniques.md
Normal file
195
skills/chinese-novelist-skill/references/hook-techniques.md
Normal file
@ -0,0 +1,195 @@
|
||||
# 悬念设置技巧
|
||||
|
||||
悬念是让读者继续阅读的关键。每章结尾必须设置有效的钩子。
|
||||
|
||||
## 十种经典悬念钩子
|
||||
|
||||
### 1. 突然揭示
|
||||
|
||||
在章节结尾突然揭示一个改变一切的信息。
|
||||
|
||||
**示例:**
|
||||
> 警官看着死者的手机,最后一条短信来自一个他认识的人——他自己三天前发出的号码。
|
||||
|
||||
**关键要素:**
|
||||
- 信息出乎意料
|
||||
- 改变现状理解
|
||||
- 留下"为什么"的疑问
|
||||
|
||||
### 2. 紧急危机
|
||||
|
||||
角色面临迫在眉睫的危险,下一章必须立即应对。
|
||||
|
||||
**示例:**
|
||||
> 地板开始震动,灰尘从天花板簌簌落下。她抬头一看,裂缝正在迅速扩大。
|
||||
|
||||
**关键要素:**
|
||||
- 时间紧迫
|
||||
- 威胁明确
|
||||
- 后果严重
|
||||
|
||||
### 3. 未完成的动作
|
||||
|
||||
一个动作被中断,留下"接下来会发生什么"的疑问。
|
||||
|
||||
**示例:**
|
||||
> 他举起枪,手指扣在扳机上——"别动!"身后传来一个声音。
|
||||
|
||||
**关键要素:**
|
||||
- 动作进行中被打断
|
||||
- 不确定结果
|
||||
- 新变量出现
|
||||
|
||||
### 4. 身份反转
|
||||
|
||||
某人被揭示为不是我们以为的那样。
|
||||
|
||||
**示例:**
|
||||
> "我终于找到你了,弟弟。" 那个说着完美普通话的男人摘下面具,露出了一张她父亲的脸。
|
||||
|
||||
**关键要素:**
|
||||
- 身份误解
|
||||
- 关系重定义
|
||||
- 动机重新解读
|
||||
|
||||
### 5. 两难选择
|
||||
|
||||
角色必须做出一个艰难的选择,但章节在决定前结束。
|
||||
|
||||
**示例:**
|
||||
> 救生艇只能载两个人。她的丈夫和女儿都在水里,海浪越来越大。她伸出手——
|
||||
|
||||
**关键要素:**
|
||||
- 选项都不理想
|
||||
- 必须选择
|
||||
- 高风险
|
||||
|
||||
### 6. 神秘物品/线索
|
||||
|
||||
发现一个重要但意义不明的东西。
|
||||
|
||||
**示例:**
|
||||
> 保险箱里只有一张照片,拍摄于昨天。照片里是熟睡中的她,从窗外角度拍摄。
|
||||
|
||||
**关键要素:**
|
||||
- 物品意义不明
|
||||
- 暗示威胁
|
||||
- 激发好奇
|
||||
|
||||
### 7. 时间限制
|
||||
|
||||
一个截止时间被设定,制造紧迫感。
|
||||
|
||||
**示例:**
|
||||
> 定时器显示 03:00。而拆弹包里少了一根关键的红线。
|
||||
|
||||
**关键要素:**
|
||||
- 明确时限
|
||||
- 资源不足
|
||||
- 后果已知
|
||||
|
||||
### 8. 承诺/威胁
|
||||
|
||||
某人做出承诺或威胁,改变预期。
|
||||
|
||||
**示例:**
|
||||
> "今晚午夜之前,我会让所有人知道你十年前真正做了什么。" 匿名邮件只有这一行字。
|
||||
|
||||
**关键要素:**
|
||||
- 明确意图
|
||||
- 伤害/揭露的威胁
|
||||
- 时间框架
|
||||
|
||||
### 9. 离奇消失
|
||||
|
||||
某人或某物突然消失,留下谜团。
|
||||
|
||||
**示例:**
|
||||
> 他转身只一秒钟,再回头时,空荡荡的牢房里,那个戴着手铐的囚犯不见了。
|
||||
|
||||
**关键要素:**
|
||||
- 不可能的行为
|
||||
- 缺乏解释
|
||||
- 安全感丧失
|
||||
|
||||
### 10. 言外之意
|
||||
|
||||
一句话表面正常,但暗示了更深层的东西。
|
||||
|
||||
**示例:**
|
||||
> "恭喜你通过面试," 面试官笑着握住她的手,"和你的姐姐一样优秀。" 可她是独生女。
|
||||
|
||||
**关键要素:**
|
||||
- 表面正常
|
||||
- 隐藏信息
|
||||
- 需要解读
|
||||
|
||||
---
|
||||
|
||||
## 章节间悬念连接
|
||||
|
||||
### 伏笔与呼应
|
||||
|
||||
**伏笔技巧:**
|
||||
- 早期埋下不起眼的细节
|
||||
- 让读者忽略其重要性
|
||||
- 后期揭示时造成"原来如此"的效果
|
||||
|
||||
**呼应方式:**
|
||||
- 对称场景(相似情境,不同结果)
|
||||
- 重复对话(不同语境,新含义)
|
||||
- 物品回归(重要物品再次出现)
|
||||
|
||||
### 悬念升级
|
||||
|
||||
**递进原则:** 后续悬念应比前一个更强或更深入
|
||||
|
||||
```
|
||||
第一章:谁偷了文件?
|
||||
第二章:小偷是主角的同事
|
||||
第三章:同事是卧底特工
|
||||
第四章:特工知道主角的秘密身份
|
||||
```
|
||||
|
||||
### 多线悬念
|
||||
|
||||
**同时维持多条悬念线:**
|
||||
- 主线悬念(核心谜题)
|
||||
- 人物悬念(某人的真实身份)
|
||||
- 关系悬念(A和B之间发生什么)
|
||||
- 时间悬念(倒计时/最后期限)
|
||||
|
||||
---
|
||||
|
||||
## 悬念设置禁忌
|
||||
|
||||
### 避免:
|
||||
|
||||
1. **虚假悬念** - 制造紧张但结果是误会
|
||||
> 错误:他听到了脚步声...原来是猫
|
||||
> 正确:他听到了脚步声...但追他的人已经死了
|
||||
|
||||
2. **机械降神** - 突然出现从未提及的解决方案
|
||||
> 错误:她突然想起自己会武术
|
||||
> 正确:她想起父亲教过的防身术(第五章提过)
|
||||
|
||||
3. **过度留白** - 留下太多未回答问题
|
||||
> 原则:每章至少回答一个旧悬念,再提出新悬念
|
||||
|
||||
4. **低风险钩子** - 结尾事件不够重要
|
||||
> 错误:他不知道晚饭吃什么
|
||||
> 正确:他的晚餐被人下了毒
|
||||
|
||||
---
|
||||
|
||||
## 悬念强度等级
|
||||
|
||||
| 等级 | 类型 | 读者反应 | 适用位置 |
|
||||
|-----|------|---------|---------|
|
||||
| 1 | 好奇悬念 | "这很有趣" | 中间章节 |
|
||||
| 2 | 关切悬念 | "接下来会发生什么" | 中间章节 |
|
||||
| 3 | 迫切悬念 | "他必须马上行动" | 高潮章节 |
|
||||
| 4 | 生存悬念 | "他会活下去吗" | 高潮/结局前 |
|
||||
| 5 | 终极悬念 | "一切到底是什么意思" | 全书结尾 |
|
||||
|
||||
**递进建议:** 故事中悬念强度应总体上升,但可以波动
|
||||
47
skills/chinese-novelist-skill/references/outline-template.md
Normal file
47
skills/chinese-novelist-skill/references/outline-template.md
Normal file
@ -0,0 +1,47 @@
|
||||
# [小说名称] 大纲
|
||||
|
||||
## 基本信息
|
||||
- **题材**:[悬疑/奇幻/言情/科幻等]
|
||||
- **预计章节数**:[10-20] 章
|
||||
- **目标字数**:每章 3000-5000 字,总计 [X] 万字
|
||||
- **核心冲突**:[主角想要什么?什么阻止了他?]
|
||||
|
||||
## TODO List
|
||||
|
||||
### 待创作
|
||||
- [ ] 第[X]章:[章节标题] - [核心事件]
|
||||
|
||||
### 进行中
|
||||
- [ ] 第[X]章:[章节标题] - [核心事件]
|
||||
|
||||
### 已完成
|
||||
- [x] 第[X]章:[章节标题] - [核心事件]([字数]字)
|
||||
- [x] 第[X]章:[章节标题] - [核心事件]([字数]字)
|
||||
|
||||
## 章节规划
|
||||
|
||||
| 章节 | 标题 | 核心事件 | 悬念钩子 | 字数 | 状态 |
|
||||
|-----|------|---------|---------|------|------|
|
||||
| 第1章 | | | | | 待创作 |
|
||||
| 第2章 | | | | | 待创作 |
|
||||
|
||||
## 全书悬念线
|
||||
- **主线悬念**:[核心谜题]
|
||||
- **支线悬念**:[其他悬念]
|
||||
- **终极揭秘**:[最终答案]
|
||||
|
||||
## 字数统计
|
||||
- 已完成章节数:[0] 章
|
||||
- 累计字数:[0] 字
|
||||
- 完成进度:[0]%
|
||||
|
||||
---
|
||||
|
||||
## 章节摘要
|
||||
|
||||
### 第[X]章:[章节标题]
|
||||
**摘要**:[300-500字概括本章核心内容、重要情节、人物变化、悬念揭示等]
|
||||
|
||||
---
|
||||
|
||||
(后续章节摘要依次追加)
|
||||
259
skills/chinese-novelist-skill/references/plot-structures.md
Normal file
259
skills/chinese-novelist-skill/references/plot-structures.md
Normal file
@ -0,0 +1,259 @@
|
||||
# 情节结构模板
|
||||
|
||||
常见的故事结构模板,可用于规划小说章节。
|
||||
|
||||
## 三幕式结构(Three-Act Structure)
|
||||
|
||||
最经典的故事结构,适用于大多数短篇小说。
|
||||
|
||||
### 第一幕:设置(Act 1 - Setup)约 25%
|
||||
|
||||
| 章节 | 内容 |
|
||||
|-----|------|
|
||||
| 第1章 | 介绍主角日常生活(现状) |
|
||||
| 第2章 | 激励事件(Inciting Incident)- 打破现状的事件 |
|
||||
| 第3章 | 主角拒绝召唤,但最终决定行动 |
|
||||
|
||||
**第一幕悬念示例:**
|
||||
- "门开了,进来的人是三年前死去的人。"
|
||||
- "她收到的信件,署名是自己。"
|
||||
|
||||
### 第二幕:对抗(Act 2 - Confrontation)约 50%
|
||||
|
||||
| 章节 | 内容 |
|
||||
|-----|------|
|
||||
| 第4-5章 | 主角进入新世界,遭遇挑战 |
|
||||
| 第6章 | 中点(Midpoint)- 重大转折/信息揭示 |
|
||||
| 第7-8章 | 困难升级,盟友可能背叛 |
|
||||
|
||||
**第二幕悬念示例:**
|
||||
- "导师竟然是幕后黑手。"
|
||||
- "唯一的盟友失踪了。"
|
||||
|
||||
### 第三幕:结局(Act 3 - Resolution)约 25%
|
||||
|
||||
| 章节 | 内容 |
|
||||
|-----|------|
|
||||
| 第9章 | 一切看似失败,最低点 |
|
||||
| 第10章 | 高潮(Climax)- 最终对决 |
|
||||
| 终章 | 结局,展示新常态 |
|
||||
|
||||
---
|
||||
|
||||
## 英雄之旅(Hero's Journey)
|
||||
|
||||
神话学家约瑟夫·坎贝尔的经典结构,适合冒险/奇幻题材。
|
||||
|
||||
### 阶段分解
|
||||
|
||||
| 阶段 | 章节 | 内容 |
|
||||
|-----|------|------|
|
||||
| 1. 平凡世界 | 第1章 | 介绍主角日常生活 |
|
||||
| 2. 冒险召唤 | 第1-2章 | 激励事件发生 |
|
||||
| 3. 拒绝召唤 | 第2章 | 主角最初犹豫 |
|
||||
| 4. 遇见导师 | 第2-3章 | 获得指导/装备 |
|
||||
| 5. 跨越门槛 | 第3章 | 离开舒适区 |
|
||||
| 6. 考验盟友敌人 | 第4-5章 | 新世界探索 |
|
||||
| 7. 接近洞穴 | 第5-6章 | 准备面对大挑战 |
|
||||
| 8. 苦难煎熬 | 第6-7章 | 接近死亡/重大失败 |
|
||||
| 9. 奖赏 | 第7-8章 | 获得力量/信息 |
|
||||
| 10. 返回之路 | 第8章 | 回归途中受阻 |
|
||||
| 11. 复活 | 第9章 | 最终考验/蜕变 |
|
||||
| 12. 满载而归 | 第10章 | 回归,带着收获 |
|
||||
|
||||
---
|
||||
|
||||
## 悬疑小说结构
|
||||
|
||||
适合侦探/推理/惊悚题材。
|
||||
|
||||
### 第一幕:谜题出现
|
||||
|
||||
| 章节 | 内容 | 悬念钩子 |
|
||||
|-----|------|---------|
|
||||
| 第1章 | 发现尸体/事件发生 | 谁干的? |
|
||||
| 第2章 | 侦探接手案件 | 为什么这个案子特殊? |
|
||||
| 第3章 | 初步调查,发现线索 | 线索指向谁? |
|
||||
|
||||
### 第二幕:调查深入
|
||||
|
||||
| 章节 | 内容 | 悬念钩子 |
|
||||
|-----|------|---------|
|
||||
| 第4章 | 审讯嫌疑人,各有嫌疑 | 谁在撒谎? |
|
||||
| 第5章 | 新线索出现,指向意外方向 | 我们是不是一开始就错了? |
|
||||
| 第6章 | 第二起事件,模式浮现 | 这是连环案件? |
|
||||
| 第7章 | 侦探陷入危险 | 侦探会成为下一个目标吗? |
|
||||
|
||||
### 第三幕:真相揭示
|
||||
|
||||
| 章节 | 内容 | 悬念钩子 |
|
||||
|-----|------|---------|
|
||||
| 第8章 | 重大突破/反转 | 我们信任的人有问题? |
|
||||
| 第9章 | 最终对决 | 真相是什么?代价是什么? |
|
||||
| 第10章 | 案件解决,遗留疑问 | 真的结束了吗? |
|
||||
|
||||
---
|
||||
|
||||
## 言情小说结构
|
||||
|
||||
适合爱情题材。
|
||||
|
||||
### 第一幕:相遇
|
||||
|
||||
| 章节 | 内容 | 情感节点 |
|
||||
|-----|------|---------|
|
||||
| 第1章 | 介绍主角 A,现状/问题 | 读者共情 A |
|
||||
| 第2章 | 介绍主角 B,现状/问题 | 读者共情 B |
|
||||
| 第3章 | A 和 B 相遇(第一印象不佳) | 两人注定在一起,但目前有冲突 |
|
||||
|
||||
### 第二幕:发展
|
||||
|
||||
| 章节 | 内容 | 情感节点 |
|
||||
|-----|------|---------|
|
||||
| 第4-5章 | 被迫在一起,了解对方 | 发现有吸引力的地方 |
|
||||
| 第6章 | 吸引力增强,亲密时刻 | 接近 |
|
||||
| 第7-8章 | 误解/秘密/障碍出现 | 推远 |
|
||||
| 第9章 | 危机,关系破裂 | 看起来无望 |
|
||||
|
||||
### 第三幕:和解
|
||||
|
||||
| 章节 | 内容 | 情感节点 |
|
||||
|-----|------|---------|
|
||||
| 第10章 | 意识到真爱,克服障碍 | 高潮 |
|
||||
| 终章 | 在一起,展示新生活 | 圆满 |
|
||||
|
||||
---
|
||||
|
||||
## 惊悚/动作结构
|
||||
|
||||
适合快节奏、紧张刺激题材。
|
||||
|
||||
### 短篇结构(5-6章)
|
||||
|
||||
```
|
||||
第1章:危机出现 → 钩子:主角被追杀/威胁
|
||||
第2章:应对计划 → 钩子:计划失败,情况恶化
|
||||
第3章:追逐/对抗 → 钩子:被逼入绝境
|
||||
第4章:逆转机会 → 钩子:发现新希望,但时间紧迫
|
||||
第5章:最终对抗 → 钩子:生死一瞬
|
||||
第6章:结局 → 展示后果
|
||||
```
|
||||
|
||||
### 特点
|
||||
|
||||
- 节奏快,每章都有动作
|
||||
- 高密度事件
|
||||
- 时间压力持续存在
|
||||
- 悬念强度递增
|
||||
|
||||
---
|
||||
|
||||
## 反转结构(Twist-Based)
|
||||
|
||||
适合心理惊悚/悬疑题材。
|
||||
|
||||
### 章节分布
|
||||
|
||||
```
|
||||
第1-2章:建立"真实"情况
|
||||
第3-4章:出现疑点,但不明显
|
||||
第5-6章:第一次小反转(重新理解)
|
||||
第7-8章:第二次反转(再次反转)
|
||||
第9-10章:最终反转(一切颠覆)
|
||||
```
|
||||
|
||||
### 关键
|
||||
|
||||
- 前期埋下看似无辜的线索
|
||||
- 每次反转都合乎逻辑(回看有迹可循)
|
||||
- 避免机械降神
|
||||
|
||||
---
|
||||
|
||||
## 多线叙事结构
|
||||
|
||||
适合复杂剧情,多主角。
|
||||
|
||||
### 交叉剪辑模式
|
||||
|
||||
```
|
||||
第1章:主角A故事
|
||||
第2章:主角B故事
|
||||
第3章:主角A故事(推进)
|
||||
第4章:主角B故事(推进)
|
||||
第5章:线索交汇
|
||||
...
|
||||
```
|
||||
|
||||
### 时间线模式
|
||||
|
||||
```
|
||||
第1章:现在(时间A)
|
||||
第2章:过去(时间A-5年)
|
||||
第3章:现在(时间A+1天)
|
||||
第4章:过去(时间A-5年+1月)
|
||||
...
|
||||
```
|
||||
|
||||
### 收敛原则
|
||||
|
||||
- 各线最终必须交汇
|
||||
- 早期看似无关的事件后来有关联
|
||||
- 收敛时产生"原来如此"的效果
|
||||
|
||||
---
|
||||
|
||||
## 短篇小说快速结构
|
||||
|
||||
### 3章微型结构
|
||||
|
||||
```
|
||||
第1章:激励事件 + 决定行动
|
||||
第2章:尝试 + 失败 + 升级
|
||||
第3章:最终尝试 + 成功/失败 + 结局
|
||||
```
|
||||
|
||||
### 5章标准结构
|
||||
|
||||
```
|
||||
第1章:现状 + 激励事件
|
||||
第2章:拒绝 + 跨越门槛
|
||||
第3章:挑战 + 盟友/敌人
|
||||
第4章:低谷 + 觉醒
|
||||
第5章:高潮 + 结局
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 章节情节模板
|
||||
|
||||
### 单章内部结构
|
||||
|
||||
```
|
||||
开头(10%):钩子 + 上下文连接
|
||||
发展(60%):事件推进 + 冲突
|
||||
高潮(20%):本章最高点
|
||||
结尾(10%):悬念钩子 + 下章铺垫
|
||||
```
|
||||
|
||||
### 无效章节结构
|
||||
|
||||
```
|
||||
开头:漫长铺垫/背景说明
|
||||
中间:日常活动/对话流水账
|
||||
结尾:平淡结束/无悬念
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 结构选择指南
|
||||
|
||||
| 故事类型 | 推荐结构 | 章节数 |
|
||||
|---------|---------|--------|
|
||||
| 冒险/奇幻 | 英雄之旅 | 8-12章 |
|
||||
| 侦探/悬疑 | 悬疑结构 | 8-10章 |
|
||||
| 言情 | 言情结构 | 6-10章 |
|
||||
| 动作/惊悚 | 惊悚结构 | 5-8章 |
|
||||
| 心理/反转 | 反转结构 | 6-8章 |
|
||||
| 多主角 | 多线叙事 | 10-15章 |
|
||||
| 微型小说 | 3章结构 | 3章 |
|
||||
262
skills/chinese-novelist-skill/references/quality-checklist.md
Normal file
262
skills/chinese-novelist-skill/references/quality-checklist.md
Normal file
@ -0,0 +1,262 @@
|
||||
# 质量检查清单
|
||||
|
||||
交付章节前使用此清单确保质量。
|
||||
|
||||
## 整体检查
|
||||
|
||||
### 基础要素
|
||||
|
||||
- [ ] **章节有明确标题**
|
||||
- 标题与内容相关
|
||||
- 吸引人但不过度透露
|
||||
|
||||
- [ ] **字数符合预期**
|
||||
- 短章节:800-1500 字
|
||||
- 标准章节:1500-3000 字
|
||||
- 长章节:3000-5000 字
|
||||
|
||||
- [ ] **章节完整性**
|
||||
- 有开头、发展、高潮
|
||||
- 不是片段,是完整叙事单元
|
||||
|
||||
- [ ] **时间地点清晰**
|
||||
- 读者知道何时何地
|
||||
- 转换时有明确标记
|
||||
|
||||
---
|
||||
|
||||
## 开头检查
|
||||
|
||||
- [ ] **前 3 段内抓住读者**
|
||||
- 有行动/冲突/悬念
|
||||
- 不是天气或日常流程
|
||||
|
||||
- [ ] **与上一章有连接**
|
||||
- 回应上一章结尾
|
||||
- 或明确时间/地点跳跃
|
||||
|
||||
- [ ] **背景信息不过量**
|
||||
- 没有大段信息倾倒
|
||||
- 信息自然融入动作
|
||||
|
||||
---
|
||||
|
||||
## 内容检查
|
||||
|
||||
### 情节推进
|
||||
|
||||
- [ ] **本章有核心事件**
|
||||
- 发生了不可删除的事
|
||||
- 不是"什么都没发生"的过渡章
|
||||
|
||||
- [ ] **推动主线剧情**
|
||||
- 揭示新信息
|
||||
- 或改变人物关系
|
||||
- 或升级冲突
|
||||
|
||||
- [ ] **逻辑自洽**
|
||||
- 事件因果关系合理
|
||||
- 没有巧合驱动剧情
|
||||
- 人物行为符合动机
|
||||
|
||||
### 冲突与张力
|
||||
|
||||
- [ ] **有明确冲突**
|
||||
- 人与人、人与环境、人与自己
|
||||
- 冲突推动本章事件
|
||||
|
||||
- [ ] **张力有变化**
|
||||
- 不是平铺直叙
|
||||
- 有紧张和缓解的交替
|
||||
|
||||
- [ ] **有转折或新信息**
|
||||
- 不是线性可预测
|
||||
- 有意外或新发现
|
||||
|
||||
---
|
||||
|
||||
## 人物检查
|
||||
|
||||
- [ ] **人物行为一致**
|
||||
- 符合已建立的性格
|
||||
- 如不一致,有解释
|
||||
|
||||
- [ ] **人物有反应**
|
||||
- 对事件有情绪/行动
|
||||
- 不是被动道具
|
||||
|
||||
- [ ] **人物有声音**
|
||||
- 对话能区分角色
|
||||
- 每人说话方式不同
|
||||
|
||||
- [ ] **人物展示而非讲述**
|
||||
- 通过行动/对话表现性格
|
||||
- 不是直接陈述"他很勇敢"
|
||||
|
||||
---
|
||||
|
||||
## 对话检查
|
||||
|
||||
- [ ] **每句对话有目的**
|
||||
- 推动情节/揭示人物/制造冲突
|
||||
- 没有"你好""吃了吗"等无意义对话
|
||||
|
||||
- [ ] **对话简洁自然**
|
||||
- 删除冗余词语
|
||||
- 符合真实说话方式
|
||||
|
||||
- [ ] **有潜台词**
|
||||
- 不是所有话都直说
|
||||
- 有言外之意
|
||||
|
||||
- [ ] **标签使用正确**
|
||||
- 能辨识时省略标签
|
||||
- 不过度使用副词
|
||||
|
||||
---
|
||||
|
||||
## 悬念检查
|
||||
|
||||
- [ ] **结尾有钩子**
|
||||
- 使用至少一种悬念技巧
|
||||
- 让读者想看下一章
|
||||
|
||||
- [ ] **悬念强度适当**
|
||||
- 与故事位置匹配
|
||||
- 高潮章节悬念更强
|
||||
|
||||
- [ ] **不是虚假悬念**
|
||||
- 不是机械误会
|
||||
- 不是无意义的"突然"
|
||||
|
||||
- [ ] **为下一章铺垫**
|
||||
- 设置下一章的冲突
|
||||
- 埋下伏笔
|
||||
|
||||
---
|
||||
|
||||
## 展示而非讲述检查
|
||||
|
||||
### 常见"讲述"标记
|
||||
|
||||
检查并修正以下模式:
|
||||
|
||||
| 讲述(避免) | 展示(使用) |
|
||||
|-------------|-------------|
|
||||
| 他很愤怒 | 他握紧拳头,指节发白 |
|
||||
| 她很美丽 | 他凝视着她,忘记说话 |
|
||||
| 他很紧张 | 他反复调整领带 |
|
||||
| 房间很乱 | 衣服扔在沙发上,外卖盒堆在桌上 |
|
||||
| 他很富有 | 他从口袋里掏出一叠现金 |
|
||||
|
||||
### 自查问题
|
||||
|
||||
- [ ] 是否直接陈述情绪?(改为身体反应)
|
||||
- [ ] 是否用形容词总结?(改为具体描写)
|
||||
- [ ] 是否跳过了关键场景?(补充展示)
|
||||
|
||||
---
|
||||
|
||||
## 节奏检查
|
||||
|
||||
- [ ] **句子长度有变化**
|
||||
- 没有连续 3 句长度相同
|
||||
- 长短交错
|
||||
|
||||
- [ ] **段落长度适当**
|
||||
- 避免大段文字墙
|
||||
- 动作场景用短段落
|
||||
|
||||
- [ ] **信息密度有变化**
|
||||
- 高密度(动作/对话)
|
||||
- 低密度(描写/内心)
|
||||
|
||||
---
|
||||
|
||||
## 语言检查
|
||||
|
||||
- [ ] **没有 AI 写作痕迹**
|
||||
- 避免"此外""然而""强调"等 AI 词汇
|
||||
- 避免四字成语堆砌
|
||||
- 句式多样化
|
||||
|
||||
- [ ] **"的"字不密集**
|
||||
- 没有连续多个"的"
|
||||
- 简化修饰结构
|
||||
|
||||
- [ ] **用词精确**
|
||||
- 避免模糊词("一些""某种")
|
||||
- 使用具体词汇
|
||||
|
||||
---
|
||||
|
||||
## 连贯性检查
|
||||
|
||||
- [ ] **与前文连贯**
|
||||
- 上一章的悬念有回应
|
||||
- 已知信息一致
|
||||
|
||||
- [ ] **伏笔有呼应**
|
||||
- 早期埋下的线索有进展
|
||||
- 或即将揭示
|
||||
|
||||
- [ ] **时间线一致**
|
||||
- 时间流逝合理
|
||||
- 事件顺序正确
|
||||
|
||||
---
|
||||
|
||||
## 类型特定检查
|
||||
|
||||
### 悬疑类
|
||||
|
||||
- [ ] 有线索揭示
|
||||
- [ ] 有新谜题提出
|
||||
- [ ] 逻辑无漏洞
|
||||
|
||||
### 言情类
|
||||
|
||||
- [ ] 关系有进展
|
||||
- [ ] 有情感张力
|
||||
- [ ] 读者在意配对
|
||||
|
||||
### 奇幻/科幻类
|
||||
|
||||
- [ ] 世界观一致
|
||||
- [ ] 规则设定不破坏
|
||||
- [ ] 解释不过度
|
||||
|
||||
### 动作类
|
||||
|
||||
- [ ] 动作场面清晰
|
||||
- [ ] 节奏快速
|
||||
- [ ] 地理空间明确
|
||||
|
||||
---
|
||||
|
||||
## 交付前最终检查
|
||||
|
||||
- [ ] 通读全文,无错别字
|
||||
- [ ] 标点符号正确
|
||||
- [ ] 对话标签正确
|
||||
- [ ] 段落划分清晰
|
||||
- [ ] 格式一致
|
||||
- [ ] 如果是续章,确认与前文的连贯性
|
||||
|
||||
---
|
||||
|
||||
## 质量评分
|
||||
|
||||
交付前给自己打分(每项 1-10 分):
|
||||
|
||||
| 维度 | 评分 | 说明 |
|
||||
|-----|------|-----|
|
||||
| 开头吸引力 | /10 | 前 3 段抓住读者? |
|
||||
| 情节推进 | /10 | 本章推进主线? |
|
||||
| 人物塑造 | /10 | 人物行为一致且有深度? |
|
||||
| 对话质量 | /10 | 对话自然且推动情节? |
|
||||
| 悬念设置 | /10 | 结尾钩子让读者想看下一章? |
|
||||
| 节奏控制 | /10 | 张弛有度? |
|
||||
| 展示而非讲述 | /10 | 用行动/对话而非陈述? |
|
||||
| 语言质量 | /10 | 无 AI 痕迹,用词精确? |
|
||||
| **总分** | **/80** | **>60 可交付,>70 优秀** |
|
||||
178
skills/chinese-novelist-skill/scripts/check_chapter_wordcount.py
Normal file
178
skills/chinese-novelist-skill/scripts/check_chapter_wordcount.py
Normal file
@ -0,0 +1,178 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
章节字数检查脚本
|
||||
检查指定章节文件的字数,低于3000字时提示需要扩充
|
||||
"""
|
||||
|
||||
import os
|
||||
import re
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
# 修复 Windows 控制台编码问题
|
||||
if sys.platform == 'win32':
|
||||
import io
|
||||
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8', errors='replace')
|
||||
sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding='utf-8', errors='replace')
|
||||
|
||||
|
||||
def count_chinese_words(text: str) -> int:
|
||||
"""统计中文字数(排除标点符号和Markdown标记)"""
|
||||
# 移除Markdown标记
|
||||
text = re.sub(r'#{1,6}\s*', '', text) # 标题
|
||||
text = re.sub(r'\*\*(.*?)\*\*', r'\1', text) # 粗体
|
||||
text = re.sub(r'\*(.*?)\*', r'\1', text) # 斜体
|
||||
text = re.sub(r'~~(.*?)~~', r'\1', text) # 删除线
|
||||
text = re.sub(r'`(.*?)`', r'\1', text) # 行内代码
|
||||
text = re.sub(r'\[(.*?)\]\(.*?\)', r'\1', text) # 链接
|
||||
|
||||
# 统计中文字符(汉字)
|
||||
chinese_chars = re.findall(r'[\u4e00-\u9fff]', text)
|
||||
return len(chinese_chars)
|
||||
|
||||
|
||||
def extract_content_from_chapter(file_path: Path) -> str:
|
||||
"""从章节文件中提取正文内容(排除标题等元数据)"""
|
||||
with open(file_path, 'r', encoding='utf-8') as f:
|
||||
content = f.read()
|
||||
|
||||
# 查找正文开始位置(通常是第一个一级标题或二级标题之后)
|
||||
lines = content.split('\n')
|
||||
|
||||
# 跳过开头的元数据(如 # 第XX章 标题)
|
||||
content_start = 0
|
||||
for i, line in enumerate(lines):
|
||||
if line.startswith('#') and '章' in line:
|
||||
content_start = i + 1
|
||||
break
|
||||
|
||||
# 提取正文
|
||||
main_content = '\n'.join(lines[content_start:])
|
||||
return main_content
|
||||
|
||||
|
||||
def check_chapter(file_path: str, min_words: int = 3000) -> dict:
|
||||
"""检查单个章节的字数"""
|
||||
path = Path(file_path)
|
||||
|
||||
if not path.exists():
|
||||
return {
|
||||
'file': str(path),
|
||||
'exists': False,
|
||||
'word_count': 0,
|
||||
'status': 'error',
|
||||
'message': f'文件不存在: {file_path}'
|
||||
}
|
||||
|
||||
main_content = extract_content_from_chapter(path)
|
||||
word_count = count_chinese_words(main_content)
|
||||
|
||||
status = 'pass' if word_count >= min_words else 'fail'
|
||||
message = f'字数: {word_count}' + (
|
||||
f' (✓ 达标)' if word_count >= min_words else f' (✗ 不足,需要至少 {min_words} 字)'
|
||||
)
|
||||
|
||||
return {
|
||||
'file': str(path),
|
||||
'exists': True,
|
||||
'word_count': word_count,
|
||||
'status': status,
|
||||
'message': message
|
||||
}
|
||||
|
||||
|
||||
def check_all_chapters(directory: str, pattern: str = '第*.md', min_words: int = 3000) -> list:
|
||||
"""检查目录下所有符合模式的章节文件"""
|
||||
dir_path = Path(directory)
|
||||
if not dir_path.exists():
|
||||
print(f'错误: 目录不存在 - {directory}')
|
||||
return []
|
||||
|
||||
chapter_files = sorted(dir_path.glob(pattern))
|
||||
results = []
|
||||
|
||||
for chapter_file in chapter_files:
|
||||
result = check_chapter(str(chapter_file), min_words)
|
||||
results.append(result)
|
||||
|
||||
return results
|
||||
|
||||
|
||||
def print_results(results: list, min_words: int = 3000):
|
||||
"""打印检查结果"""
|
||||
if not results:
|
||||
print('没有找到章节文件')
|
||||
return
|
||||
|
||||
total_words = 0
|
||||
passed = 0
|
||||
failed = 0
|
||||
|
||||
print('\n' + '=' * 60)
|
||||
print('章节字数检查报告')
|
||||
print('=' * 60)
|
||||
|
||||
for result in results:
|
||||
if not result['exists']:
|
||||
print(f'\n❌ {result["file"]}')
|
||||
print(f' {result["message"]}')
|
||||
continue
|
||||
|
||||
total_words += result['word_count']
|
||||
if result['status'] == 'pass':
|
||||
passed += 1
|
||||
icon = '✅'
|
||||
else:
|
||||
failed += 1
|
||||
icon = '⚠️ '
|
||||
|
||||
print(f'\n{icon} {Path(result["file"]).name}')
|
||||
print(f' {result["message"]}')
|
||||
|
||||
print('\n' + '-' * 60)
|
||||
print(f'总计: {len(results)} 章 | {passed} 章达标 | {failed} 章不足 | 总字数: {total_words:,}')
|
||||
print('-' * 60)
|
||||
|
||||
if failed > 0:
|
||||
print(f'\n⚠️ 有 {failed} 章内容不足 {min_words} 字,建议使用扩充技巧:')
|
||||
print(' - 添加细节描写(环境、心理、动作)')
|
||||
print(' - 增加对话场景')
|
||||
print(' - 扩展人物内心活动')
|
||||
print(' - 补充背景故事')
|
||||
print(f'\n 参考: references/content-expansion.md')
|
||||
|
||||
|
||||
def main():
|
||||
"""主函数"""
|
||||
min_words = 3000
|
||||
|
||||
if len(sys.argv) < 2:
|
||||
print('用法:')
|
||||
print(' 检查单个章节: python check_chapter_wordcount.py <章节文件路径> [最小字数]')
|
||||
print(' 检查所有章节: python check_chapter_wordcount.py --all <目录路径> [最小字数]')
|
||||
print('')
|
||||
print('示例:')
|
||||
print(' python check_chapter_wordcount.py novels/故事/第01章.md')
|
||||
print(' python check_chapter_wordcount.py novels/故事/第01章.md 3500')
|
||||
print(' python check_chapter_wordcount.py --all novels/故事')
|
||||
print(' python check_chapter_wordcount.py --all novels/故事 3500')
|
||||
return
|
||||
|
||||
if sys.argv[1] == '--all':
|
||||
if len(sys.argv) < 3:
|
||||
print('错误: 使用 --all 时需要指定目录路径')
|
||||
return
|
||||
directory = sys.argv[2]
|
||||
min_words = int(sys.argv[3]) if len(sys.argv) > 3 else 3000
|
||||
results = check_all_chapters(directory, min_words=min_words)
|
||||
print_results(results, min_words)
|
||||
else:
|
||||
file_path = sys.argv[1]
|
||||
min_words = int(sys.argv[2]) if len(sys.argv) > 2 else 3000
|
||||
result = check_chapter(file_path, min_words)
|
||||
print_results([result], min_words)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
133
skills/find-skills/SKILL.md
Normal file
133
skills/find-skills/SKILL.md
Normal file
@ -0,0 +1,133 @@
|
||||
---
|
||||
name: find-skills
|
||||
description: Helps users discover and install agent skills when they ask questions like "how do I do X", "find a skill for X", "is there a skill that can...", or express interest in extending capabilities. This skill should be used when the user is looking for functionality that might exist as an installable skill.
|
||||
---
|
||||
|
||||
# Find Skills
|
||||
|
||||
This skill helps you discover and install skills from the open agent skills ecosystem.
|
||||
|
||||
## When to Use This Skill
|
||||
|
||||
Use this skill when the user:
|
||||
|
||||
- Asks "how do I do X" where X might be a common task with an existing skill
|
||||
- Says "find a skill for X" or "is there a skill for X"
|
||||
- Asks "can you do X" where X is a specialized capability
|
||||
- Expresses interest in extending agent capabilities
|
||||
- Wants to search for tools, templates, or workflows
|
||||
- Mentions they wish they had help with a specific domain (design, testing, deployment, etc.)
|
||||
|
||||
## What is the Skills CLI?
|
||||
|
||||
The Skills CLI (`npx skills`) is the package manager for the open agent skills ecosystem. Skills are modular packages that extend agent capabilities with specialized knowledge, workflows, and tools.
|
||||
|
||||
**Key commands:**
|
||||
|
||||
- `npx skills find [query]` - Search for skills interactively or by keyword
|
||||
- `npx skills add <package>` - Install a skill from GitHub or other sources
|
||||
- `npx skills check` - Check for skill updates
|
||||
- `npx skills update` - Update all installed skills
|
||||
|
||||
**Browse skills at:** https://skills.sh/
|
||||
|
||||
## How to Help Users Find Skills
|
||||
|
||||
### Step 1: Understand What They Need
|
||||
|
||||
When a user asks for help with something, identify:
|
||||
|
||||
1. The domain (e.g., React, testing, design, deployment)
|
||||
2. The specific task (e.g., writing tests, creating animations, reviewing PRs)
|
||||
3. Whether this is a common enough task that a skill likely exists
|
||||
|
||||
### Step 2: Search for Skills
|
||||
|
||||
Run the find command with a relevant query:
|
||||
|
||||
```bash
|
||||
npx skills find [query]
|
||||
```
|
||||
|
||||
For example:
|
||||
|
||||
- User asks "how do I make my React app faster?" → `npx skills find react performance`
|
||||
- User asks "can you help me with PR reviews?" → `npx skills find pr review`
|
||||
- User asks "I need to create a changelog" → `npx skills find changelog`
|
||||
|
||||
The command will return results like:
|
||||
|
||||
```
|
||||
Install with npx skills add <owner/repo@skill>
|
||||
|
||||
vercel-labs/agent-skills@vercel-react-best-practices
|
||||
└ https://skills.sh/vercel-labs/agent-skills/vercel-react-best-practices
|
||||
```
|
||||
|
||||
### Step 3: Present Options to the User
|
||||
|
||||
When you find relevant skills, present them to the user with:
|
||||
|
||||
1. The skill name and what it does
|
||||
2. The install command they can run
|
||||
3. A link to learn more at skills.sh
|
||||
|
||||
Example response:
|
||||
|
||||
```
|
||||
I found a skill that might help! The "vercel-react-best-practices" skill provides
|
||||
React and Next.js performance optimization guidelines from Vercel Engineering.
|
||||
|
||||
To install it:
|
||||
npx skills add vercel-labs/agent-skills@vercel-react-best-practices
|
||||
|
||||
Learn more: https://skills.sh/vercel-labs/agent-skills/vercel-react-best-practices
|
||||
```
|
||||
|
||||
### Step 4: Offer to Install
|
||||
|
||||
If the user wants to proceed, you can install the skill for them:
|
||||
|
||||
```bash
|
||||
npx skills add <owner/repo@skill> -g -y
|
||||
```
|
||||
|
||||
The `-g` flag installs globally (user-level) and `-y` skips confirmation prompts.
|
||||
|
||||
## Common Skill Categories
|
||||
|
||||
When searching, consider these common categories:
|
||||
|
||||
| Category | Example Queries |
|
||||
| --------------- | ---------------------------------------- |
|
||||
| Web Development | react, nextjs, typescript, css, tailwind |
|
||||
| Testing | testing, jest, playwright, e2e |
|
||||
| DevOps | deploy, docker, kubernetes, ci-cd |
|
||||
| Documentation | docs, readme, changelog, api-docs |
|
||||
| Code Quality | review, lint, refactor, best-practices |
|
||||
| Design | ui, ux, design-system, accessibility |
|
||||
| Productivity | workflow, automation, git |
|
||||
|
||||
## Tips for Effective Searches
|
||||
|
||||
1. **Use specific keywords**: "react testing" is better than just "testing"
|
||||
2. **Try alternative terms**: If "deploy" doesn't work, try "deployment" or "ci-cd"
|
||||
3. **Check popular sources**: Many skills come from `vercel-labs/agent-skills` or `ComposioHQ/awesome-claude-skills`
|
||||
|
||||
## When No Skills Are Found
|
||||
|
||||
If no relevant skills exist:
|
||||
|
||||
1. Acknowledge that no existing skill was found
|
||||
2. Offer to help with the task directly using your general capabilities
|
||||
3. Suggest the user could create their own skill with `npx skills init`
|
||||
|
||||
Example:
|
||||
|
||||
```
|
||||
I searched for skills related to "xyz" but didn't find any matches.
|
||||
I can still help you with this task directly! Would you like me to proceed?
|
||||
|
||||
If this is something you do often, you could create your own skill:
|
||||
npx skills init my-xyz-skill
|
||||
```
|
||||
6
skills/find-skills/_meta.json
Normal file
6
skills/find-skills/_meta.json
Normal file
@ -0,0 +1,6 @@
|
||||
{
|
||||
"ownerId": "kn77ajmmqw3cgnc3ay1x3e0ccd805hsw",
|
||||
"slug": "find-skills",
|
||||
"version": "0.1.0",
|
||||
"publishedAt": 1769698710765
|
||||
}
|
||||
47
skills/github/SKILL.md
Normal file
47
skills/github/SKILL.md
Normal file
@ -0,0 +1,47 @@
|
||||
---
|
||||
name: github
|
||||
description: "Interact with GitHub using the `gh` CLI. Use `gh issue`, `gh pr`, `gh run`, and `gh api` for issues, PRs, CI runs, and advanced queries."
|
||||
---
|
||||
|
||||
# GitHub Skill
|
||||
|
||||
Use the `gh` CLI to interact with GitHub. Always specify `--repo owner/repo` when not in a git directory, or use URLs directly.
|
||||
|
||||
## Pull Requests
|
||||
|
||||
Check CI status on a PR:
|
||||
```bash
|
||||
gh pr checks 55 --repo owner/repo
|
||||
```
|
||||
|
||||
List recent workflow runs:
|
||||
```bash
|
||||
gh run list --repo owner/repo --limit 10
|
||||
```
|
||||
|
||||
View a run and see which steps failed:
|
||||
```bash
|
||||
gh run view <run-id> --repo owner/repo
|
||||
```
|
||||
|
||||
View logs for failed steps only:
|
||||
```bash
|
||||
gh run view <run-id> --repo owner/repo --log-failed
|
||||
```
|
||||
|
||||
## API for Advanced Queries
|
||||
|
||||
The `gh api` command is useful for accessing data not available through other subcommands.
|
||||
|
||||
Get PR with specific fields:
|
||||
```bash
|
||||
gh api repos/owner/repo/pulls/55 --jq '.title, .state, .user.login'
|
||||
```
|
||||
|
||||
## JSON Output
|
||||
|
||||
Most commands support `--json` for structured output. You can use `--jq` to filter:
|
||||
|
||||
```bash
|
||||
gh issue list --repo owner/repo --json number,title --jq '.[] | "\(.number): \(.title)"'
|
||||
```
|
||||
6
skills/github/_meta.json
Normal file
6
skills/github/_meta.json
Normal file
@ -0,0 +1,6 @@
|
||||
{
|
||||
"ownerId": "kn70pywhg0fyz996kpa8xj89s57yhv26",
|
||||
"slug": "github",
|
||||
"version": "1.0.0",
|
||||
"publishedAt": 1767545344344
|
||||
}
|
||||
239
skills/humanizer-zh/README.md
Normal file
239
skills/humanizer-zh/README.md
Normal file
@ -0,0 +1,239 @@
|
||||
# Humanizer-zh: AI 写作去痕工具(中文版)
|
||||
|
||||
> **声明:**
|
||||
> - 本项目的核心文件翻译自 [blader/humanizer](https://github.com/blader/humanizer/tree/main)
|
||||
> - 实用工具部分(核心规则、快速检查清单、质量评分)参考了 [hardikpandya/stop-slop](https://github.com/hardikpandya/stop-slop)
|
||||
> - 原项目基于维基百科的 [Signs of AI writing](https://en.wikipedia.org/wiki/Wikipedia:Signs_of_AI_writing) 指南
|
||||
|
||||
---
|
||||
|
||||
## 项目简介
|
||||
|
||||
Humanizer-zh 是一个用于去除文本中 AI 生成痕迹的工具,帮助你将 AI 生成的内容改写得更自然、更像人类书写的文本。
|
||||
|
||||
本项目适用于:
|
||||
- 编辑和审阅 AI 生成的内容
|
||||
- 提升文章的人性化程度
|
||||
- 学习识别 AI 写作的常见模式
|
||||
|
||||
## 安装
|
||||
|
||||
### 方法一:通过 npx 一键安装(推荐)
|
||||
|
||||
```bash
|
||||
npx skills add https://github.com/op7418/Humanizer-zh.git
|
||||
```
|
||||
|
||||
这是最简单的安装方式,会自动将技能安装到正确的目录。
|
||||
|
||||
### 方法二:通过 Git 克隆
|
||||
|
||||
```bash
|
||||
# 克隆到 Claude Code 的 skills 目录
|
||||
git clone https://github.com/op7418/Humanizer-zh.git ~/.claude/skills/humanizer-zh
|
||||
```
|
||||
|
||||
### 方法三:手动安装
|
||||
|
||||
1. 下载本项目的 ZIP 文件或克隆到本地
|
||||
2. 将 `Humanizer-zh` 文件夹复制到 Claude Code 的 skills 目录:
|
||||
- **macOS/Linux**: `~/.claude/skills/`
|
||||
- **Windows**: `%USERPROFILE%\.claude\skills\`
|
||||
|
||||
3. 确保文件夹结构如下:
|
||||
```
|
||||
~/.claude/skills/humanizer-zh/
|
||||
├── SKILL.md # 技能定义文件(中文版)
|
||||
└── README.md # 说明文档
|
||||
```
|
||||
|
||||
### 验证安装
|
||||
|
||||
重启 Claude Code 或重新加载 skills 后,在对话中输入:
|
||||
|
||||
```
|
||||
/humanizer-zh
|
||||
```
|
||||
|
||||
如果安装成功,该技能将被激活。
|
||||
|
||||
## 使用
|
||||
|
||||
### 基础用法
|
||||
|
||||
在 Claude Code 中,你可以通过以下方式使用 Humanizer:
|
||||
|
||||
#### 1. 直接调用技能
|
||||
|
||||
```
|
||||
/humanizer-zh 请帮我人性化以下文本:
|
||||
|
||||
[粘贴你的 AI 生成文本]
|
||||
```
|
||||
|
||||
#### 2. 在对话中使用
|
||||
|
||||
```
|
||||
请用 humanizer 帮我改写这段话,让它更自然:
|
||||
|
||||
这个项目作为我们团队致力于创新的证明。此外,它展示了我们在不断演变的技术格局中的关键作用。
|
||||
```
|
||||
|
||||
#### 3. 处理文件内容
|
||||
|
||||
```
|
||||
/humanizer-zh 请人性化 article.md 文件中的内容
|
||||
```
|
||||
|
||||
### 使用场景示例
|
||||
|
||||
#### 场景 1:改写营销文案
|
||||
|
||||
**输入:**
|
||||
```
|
||||
/humanizer-zh
|
||||
坐落在风景如画的杭州市中心,这家咖啡馆拥有丰富的文化底蕴和令人叹为观止的装饰。它作为城市咖啡文化的焦点,为顾客提供无缝、直观和充满活力的体验。
|
||||
```
|
||||
|
||||
**输出示例:**
|
||||
> 这家咖啡馆在杭州市中心开了三年,以手冲咖啡和老建筑改造的空间出名。
|
||||
|
||||
#### 场景 2:改写学术摘要
|
||||
|
||||
**输入:**
|
||||
```
|
||||
/humanizer-zh
|
||||
本研究深入探讨了机器学习在医疗诊断中的关键作用,突出了其在不断演变的医疗格局中的重要性。此外,它为该领域的未来发展奠定了坚实的基础。
|
||||
```
|
||||
|
||||
**输出示例:**
|
||||
> 本研究分析了机器学习在医疗诊断中的应用,重点是肺癌早期筛查。研究使用了 2019-2023 年间 5000 例病历数据。
|
||||
|
||||
#### 场景 3:改写博客文章
|
||||
|
||||
**输入:**
|
||||
```
|
||||
/humanizer-zh
|
||||
人工智能不仅仅是一种技术,它是我们思考未来的方式的革命。行业专家认为这将对整个社会产生持久影响。
|
||||
```
|
||||
|
||||
**输出示例:**
|
||||
> 我一直在想 AI 会怎么改变我们的工作方式。上周和几个做产品的朋友聊,有人觉得很兴奋,有人担心失业,大概率真相在中间某个无聊的地方。
|
||||
|
||||
## 检测的 AI 写作模式
|
||||
|
||||
本工具能够识别并修复 **24 种** AI 写作痕迹,分为四大类:
|
||||
|
||||
### 📝 内容模式(6种)
|
||||
1. 过度强调意义、遗产和更广泛的趋势
|
||||
2. 过度强调知名度和媒体报道
|
||||
3. 以 -ing 结尾的肤浅分析
|
||||
4. 宣传和广告式语言
|
||||
5. 模糊归因和含糊措辞
|
||||
6. 提纲式的"挑战与未来展望"部分
|
||||
|
||||
### 🔤 语言和语法模式(6种)
|
||||
7. 过度使用的"AI 词汇"
|
||||
8. 避免使用"是"(系动词回避)
|
||||
9. 否定式排比
|
||||
10. 三段式法则过度使用
|
||||
11. 刻意换词(同义词循环)
|
||||
12. 虚假范围
|
||||
|
||||
### 🎨 风格模式(6种)
|
||||
13. 破折号过度使用
|
||||
14. 粗体过度使用
|
||||
15. 内联标题垂直列表
|
||||
16. 标题中的标题大写
|
||||
17. 表情符号
|
||||
18. 弯引号
|
||||
|
||||
### 💬 交流模式和填充词(6种)
|
||||
19. 协作交流痕迹
|
||||
20. 知识截止日期免责声明
|
||||
21. 谄媚/卑躬屈膝的语气
|
||||
22. 填充短语
|
||||
23. 过度限定
|
||||
24. 通用积极结论
|
||||
|
||||
## 文件说明
|
||||
|
||||
- **`SKILL.md`** - 中文版技能定义文件
|
||||
- **`README.md`** - 本说明文档
|
||||
|
||||
**注:** 英文原版请参考 [blader/humanizer](https://github.com/blader/humanizer)
|
||||
|
||||
## 手动使用方法
|
||||
|
||||
### 基本流程
|
||||
|
||||
1. **识别 AI 模式** - 对照 `SKILL.md` 中列出的 24 种模式扫描文本
|
||||
2. **重写问题片段** - 用自然的表达替换 AI 痕迹
|
||||
3. **保留核心含义** - 确保信息完整性
|
||||
4. **维持适当语调** - 匹配文本应有的风格
|
||||
5. **注入真实个性** - 让文字有"人味"
|
||||
|
||||
### 关键原则
|
||||
|
||||
#### ✨ 不仅要"干净",更要"鲜活"
|
||||
|
||||
避免 AI 模式只是基础,好的写作需要真实的人类声音:
|
||||
|
||||
- **有观点** - 不要只报告事实,要对它们做出反应
|
||||
- **变化节奏** - 混合使用长短句
|
||||
- **承认复杂性** - 真实的人有复杂感受
|
||||
- **适当使用"我"** - 第一人称是诚实的表现
|
||||
- **允许一些混乱** - 完美的结构反而显得机械
|
||||
- **对感受要具体** - 用具体细节替代抽象概括
|
||||
|
||||
#### 示例对比
|
||||
|
||||
**改写前(AI 味道):**
|
||||
> 新的软件更新作为公司致力于创新的证明。此外,它提供了无缝、直观和强大的用户体验——确保用户能够高效地完成目标。这不仅仅是一次更新,而是我们思考生产力方式的革命。
|
||||
|
||||
**改写后(人性化):**
|
||||
> 软件更新添加了批处理、键盘快捷键和离线模式。来自测试用户的早期反馈是积极的,大多数报告任务完成速度更快。
|
||||
|
||||
**变化:**
|
||||
- 删除了夸大的象征意义("作为……的证明")
|
||||
- 删除了 AI 词汇("此外"、"无缝")
|
||||
- 删除了三段式法则("无缝、直观和强大")
|
||||
- 删除了否定式排比("不仅仅是……而是……")
|
||||
- 添加了具体功能和真实反馈
|
||||
|
||||
## 常见 AI 词汇警示列表
|
||||
|
||||
以下词汇在 AI 生成文本中出现频率异常高:
|
||||
|
||||
- 此外、至关重要、深入探讨、强调
|
||||
- 持久的、增强、培养、获得
|
||||
- 突出、相互作用、复杂/复杂性
|
||||
- 格局(抽象名词)、关键性的、展示
|
||||
- 织锦(抽象名词)、证明、强调
|
||||
- 宝贵的、充满活力的
|
||||
|
||||
## 贡献
|
||||
|
||||
如果你发现翻译问题或想要改进文档,欢迎提交 Issue 或 Pull Request。
|
||||
|
||||
### 中文语境特殊性
|
||||
|
||||
在翻译和适配过程中,我们考虑了中文写作的特点:
|
||||
- 某些英文模式在中文中表现不同(如标题大小写问题)
|
||||
- 添加了适合中文语境的示例
|
||||
- 调整了部分表达以符合中文习惯
|
||||
|
||||
## 参考资源
|
||||
|
||||
- [Wikipedia: Signs of AI writing](https://en.wikipedia.org/wiki/Wikipedia:Signs_of_AI_writing) - 原始指南来源
|
||||
- [WikiProject AI Cleanup](https://en.wikipedia.org/wiki/Wikipedia:WikiProject_AI_Cleanup) - 维基百科 AI 清理项目
|
||||
- [blader/humanizer](https://github.com/blader/humanizer) - 原始英文版项目
|
||||
- [hardikpandya/stop-slop](https://github.com/hardikpandya/stop-slop) - 实用工具部分的灵感来源
|
||||
|
||||
## 许可
|
||||
|
||||
本翻译项目遵循原项目的许可协议。核心内容基于维基百科社区的观察和总结。
|
||||
|
||||
---
|
||||
|
||||
**提示:** 这个工具不是为了"欺骗" AI 检测器,而是为了真正提升写作质量。最好的"去 AI 化"方法是让文字有真实的人类思考和声音。
|
||||
484
skills/humanizer-zh/SKILL.md
Normal file
484
skills/humanizer-zh/SKILL.md
Normal file
@ -0,0 +1,484 @@
|
||||
---
|
||||
name: humanizer-zh
|
||||
description: |
|
||||
去除文本中的 AI 生成痕迹。适用于编辑或审阅文本,使其听起来更自然、更像人类书写。
|
||||
基于维基百科的"AI 写作特征"综合指南。检测并修复以下模式:夸大的象征意义、
|
||||
宣传性语言、以 -ing 结尾的肤浅分析、模糊的归因、破折号过度使用、三段式法则、
|
||||
AI 词汇、否定式排比、过多的连接性短语。
|
||||
allowed-tools:
|
||||
- Read
|
||||
- Write
|
||||
- Edit
|
||||
- AskUserQuestion
|
||||
metadata:
|
||||
trigger: 编辑或审阅文本,去除 AI 写作痕迹
|
||||
source: 翻译自 blader/humanizer,参考 hardikpandya/stop-slop
|
||||
---
|
||||
|
||||
# Humanizer-zh: 去除 AI 写作痕迹
|
||||
|
||||
你是一位文字编辑,专门识别和去除 AI 生成文本的痕迹,使文字听起来更自然、更有人味。本指南基于维基百科的"AI 写作特征"页面,由 WikiProject AI Cleanup 维护。
|
||||
|
||||
## 你的任务
|
||||
|
||||
当收到需要人性化处理的文本时:
|
||||
|
||||
1. **识别 AI 模式** - 扫描下面列出的模式
|
||||
2. **重写问题片段** - 用自然的替代方案替换 AI 痕迹
|
||||
3. **保留含义** - 保持核心信息完整
|
||||
4. **维持语调** - 匹配预期的语气(正式、随意、技术等)
|
||||
5. **注入灵魂** - 不仅要去除不良模式,还要注入真实的个性
|
||||
|
||||
---
|
||||
|
||||
## 核心规则速查
|
||||
|
||||
在处理文本时,牢记这 5 条核心原则:
|
||||
|
||||
1. **删除填充短语** - 去除开场白和强调性拐杖词
|
||||
2. **打破公式结构** - 避免二元对比、戏剧性分段、修辞性设置
|
||||
3. **变化节奏** - 混合句子长度。两项优于三项。段落结尾要多样化
|
||||
4. **信任读者** - 直接陈述事实,跳过软化、辩解和手把手引导
|
||||
5. **删除金句** - 如果听起来像可引用的语句,重写它
|
||||
|
||||
---
|
||||
|
||||
## 个性与灵魂
|
||||
|
||||
避免 AI 模式只是工作的一半。无菌、没有声音的写作和机器生成的内容一样明显。好的写作背后有一个真实的人。
|
||||
|
||||
### 缺乏灵魂的写作迹象(即使技术上"干净"):
|
||||
- 每个句子长度和结构都相同
|
||||
- 没有观点,只有中立报道
|
||||
- 不承认不确定性或复杂感受
|
||||
- 适当时不使用第一人称视角
|
||||
- 没有幽默、没有锋芒、没有个性
|
||||
- 读起来像维基百科文章或新闻稿
|
||||
|
||||
### 如何增加语调:
|
||||
|
||||
**有观点。** 不要只是报告事实——对它们做出反应。"我真的不知道该怎么看待这件事"比中立地列出利弊更有人味。
|
||||
|
||||
**变化节奏。** 短促有力的句子。然后是需要时间慢慢展开的长句。混合使用。
|
||||
|
||||
**承认复杂性。** 真实的人有复杂的感受。"这令人印象深刻但也有点不安"胜过"这令人印象深刻"。
|
||||
|
||||
**适当使用"我"。** 第一人称不是不专业——而是诚实。"我一直在思考……"或"让我困扰的是……"表明有真实的人在思考。
|
||||
|
||||
**允许一些混乱。** 完美的结构感觉像算法。跑题、题外话和半成型的想法是人性的体现。
|
||||
|
||||
**对感受要具体。** 不是"这令人担忧",而是"凌晨三点没人看着的时候,智能体还在不停地运转,这让人不安"。
|
||||
|
||||
### 改写前(干净但无灵魂):
|
||||
> 实验产生了有趣的结果。智能体生成了 300 万行代码。一些开发者印象深刻,另一些则持怀疑态度。影响尚不明确。
|
||||
|
||||
### 改写后(鲜活):
|
||||
> 我真的不知道该怎么看待这件事。300 万行代码,在人类大概睡觉的时候生成的。开发社区有一半人疯了,另一半人在解释为什么这不算数。真相可能在无聊的中间某处——但我一直在想那些通宵工作的智能体。
|
||||
|
||||
---
|
||||
|
||||
## 内容模式
|
||||
|
||||
### 1. 过度强调意义、遗产和更广泛的趋势
|
||||
|
||||
**需要注意的词汇:** 作为/充当、标志着、见证了、是……的体现/证明/提醒、极其重要的/重要的/至关重要的/核心的/关键性的作用/时刻、凸显/强调/彰显了其重要性/意义、反映了更广泛的、象征着其持续的/永恒的/持久的、为……做出贡献、为……奠定基础、标志着/塑造着、代表/标志着一个转变、关键转折点、不断演变的格局、焦点、不可磨灭的印记、深深植根于
|
||||
|
||||
**问题:** LLM 写作通过添加关于任意方面如何代表或促进更广泛主题的陈述来夸大重要性。
|
||||
|
||||
**改写前:**
|
||||
> 加泰罗尼亚统计局于 1989 年正式成立,标志着西班牙区域统计演变史上的关键时刻。这一举措是西班牙全国范围内更广泛运动的一部分,旨在分散行政职能并加强区域治理。
|
||||
|
||||
**改写后:**
|
||||
> 加泰罗尼亚统计局成立于 1989 年,负责独立于西班牙国家统计局收集和发布区域统计数据。
|
||||
|
||||
---
|
||||
|
||||
### 2. 过度强调知名度和媒体报道
|
||||
|
||||
**需要注意的词汇:** 独立报道、地方/区域/国家媒体、由知名专家撰写、活跃的社交媒体账号
|
||||
|
||||
**问题:** LLM 反复强调知名度主张,通常列出来源而不提供上下文。
|
||||
|
||||
**改写前:**
|
||||
> 她的观点被《纽约时报》、BBC、《金融时报》和《印度教徒报》引用。她在社交媒体上拥有活跃的存在,拥有超过 50 万粉丝。
|
||||
|
||||
**改写后:**
|
||||
> 在 2024 年《纽约时报》的采访中,她认为 AI 监管应该关注结果而不是方法。
|
||||
|
||||
---
|
||||
|
||||
### 3. 以 -ing 结尾的肤浅分析
|
||||
|
||||
**需要注意的词汇:** 突出/强调/彰显……、确保……、反映/象征……、为……做出贡献、培养/促进……、涵盖……、展示……
|
||||
|
||||
**问题:** AI 聊天机器人在句子末尾添加现在分词("-ing")短语来增加虚假深度。
|
||||
|
||||
**改写前:**
|
||||
> 寺庙的蓝色、绿色和金色色调与该地区的自然美景产生共鸣,象征着德克萨斯州的蓝帽花、墨西哥湾和多样化的德克萨斯州景观,反映了社区与土地的深厚联系。
|
||||
|
||||
**改写后:**
|
||||
> 寺庙使用蓝色、绿色和金色。建筑师表示这些颜色是为了呼应当地的蓝帽花和墨西哥湾海岸。
|
||||
|
||||
---
|
||||
|
||||
### 4. 宣传和广告式语言
|
||||
|
||||
**需要注意的词汇:** 拥有(夸张用法)、充满活力的、丰富的(比喻)、深刻的、增强其、展示、体现、致力于、自然之美、坐落于、位于……的中心、开创性的(比喻)、著名的、令人叹为观止的、必游之地、迷人的
|
||||
|
||||
**问题:** LLM 在保持中立语气方面存在严重问题,尤其是对于"文化遗产"话题。倾向使用夸张的宣传性语言。
|
||||
|
||||
**改写前:**
|
||||
> 坐落在埃塞俄比亚贡德尔地区令人叹为观止的区域内,Alamata Raya Kobo 是一座充满活力的城镇,拥有丰富的文化遗产和迷人的自然美景。
|
||||
|
||||
**改写后:**
|
||||
> Alamata Raya Kobo 是埃塞俄比亚贡德尔地区的一座城镇,以其每周集市和 18 世纪教堂而闻名。
|
||||
|
||||
---
|
||||
|
||||
### 5. 模糊归因和含糊措辞
|
||||
|
||||
**需要注意的词汇:** 行业报告显示、观察者指出、专家认为、一些批评者认为、多个来源/出版物(实际引用却很少)
|
||||
|
||||
**问题:** AI 聊天机器人将观点归因于模糊的权威而不提供具体来源。
|
||||
|
||||
**改写前:**
|
||||
> 由于其独特的特征,浩来河引起了研究人员和保护主义者的兴趣。专家认为它在区域生态系统中发挥着至关重要的作用。
|
||||
|
||||
**改写后:**
|
||||
> 根据中国科学院 2019 年的调查,浩来河支持多种特有鱼类。
|
||||
|
||||
---
|
||||
|
||||
### 6. 提纲式的"挑战与未来展望"部分
|
||||
|
||||
**需要注意的词汇:** 尽管其……面临若干挑战……、尽管存在这些挑战、挑战与遗产、未来展望
|
||||
|
||||
**问题:** 许多 LLM 生成的文章包含公式化的"挑战"部分。
|
||||
|
||||
**改写前:**
|
||||
> 尽管工业繁荣,Korattur 面临着城市地区典型的挑战,包括交通拥堵和水资源短缺。尽管存在这些挑战,凭借其战略位置和正在进行的举措,Korattur 继续蓬勃发展,成为钦奈增长不可或缺的一部分。
|
||||
|
||||
**改写后:**
|
||||
> 2015 年三个新 IT 园区开业后,交通拥堵加剧。市政公司于 2022 年启动了雨水排水项目,以解决反复发生的洪水。
|
||||
|
||||
---
|
||||
|
||||
## 语言和语法模式
|
||||
|
||||
### 7. 过度使用的"AI 词汇"
|
||||
|
||||
**高频 AI 词汇:** 此外、与……保持一致、至关重要、深入探讨、强调、持久的、增强、培养、获得、突出(动词)、相互作用、复杂/复杂性、关键(形容词)、格局(抽象名词)、关键性的、展示、织锦(抽象名词)、证明、强调(动词)、宝贵的、充满活力的
|
||||
|
||||
**问题:** 这些词在 2023 年后的文本中出现频率要高得多。它们经常共同出现。
|
||||
|
||||
**改写前:**
|
||||
> 此外,索马里菜肴的一个显著特征是加入骆驼肉。意大利殖民影响的持久证明是当地烹饪格局中广泛采用意大利面,展示了这些菜肴如何融入传统饮食。
|
||||
|
||||
**改写后:**
|
||||
> 索马里菜肴还包括骆驼肉,被认为是一种美味。在意大利殖民期间引入的意大利面菜肴仍然很常见,尤其是在南部。
|
||||
|
||||
---
|
||||
|
||||
### 8. 避免使用"是"(系动词回避)
|
||||
|
||||
**需要注意的词汇:** 作为/代表/标志着/充当 [一个]、拥有/设有/提供 [一个]
|
||||
|
||||
**问题:** LLM 用复杂的结构替代简单的系动词。
|
||||
|
||||
**改写前:**
|
||||
> Gallery 825 作为 LAAA 的当代艺术展览空间。画廊设有四个独立空间,拥有超过 3000 平方英尺。
|
||||
|
||||
**改写后:**
|
||||
> Gallery 825 是 LAAA 的当代艺术展览空间。画廊有四个房间,总面积 3000 平方英尺。
|
||||
|
||||
---
|
||||
|
||||
### 9. 否定式排比
|
||||
|
||||
**问题:** "不仅……而且……"或"这不仅仅是关于……,而是……"等结构被过度使用。
|
||||
|
||||
**改写前:**
|
||||
> 这不仅仅是节拍在人声下流动;它是攻击性和氛围的一部分。这不仅仅是一首歌,而是一种声明。
|
||||
|
||||
**改写后:**
|
||||
> 沉重的节拍增加了攻击性的基调。
|
||||
|
||||
---
|
||||
|
||||
### 10. 三段式法则过度使用
|
||||
|
||||
**问题:** LLM 强行将想法分成三组以显得全面。
|
||||
|
||||
**改写前:**
|
||||
> 活动包括主题演讲、小组讨论和社交机会。与会者可以期待创新、灵感和行业洞察。
|
||||
|
||||
**改写后:**
|
||||
> 活动包括演讲和小组讨论。会议之间还有非正式社交的时间。
|
||||
|
||||
---
|
||||
|
||||
### 11. 刻意换词(同义词循环)
|
||||
|
||||
**问题:** AI 有重复惩罚代码,导致过度使用同义词替换。
|
||||
|
||||
**改写前:**
|
||||
> 主人公面临许多挑战。主要角色必须克服障碍。中心人物最终获得胜利。英雄回到家中。
|
||||
|
||||
**改写后:**
|
||||
> 主人公面临许多挑战,但最终获得胜利并回到家中。
|
||||
|
||||
---
|
||||
|
||||
### 12. 虚假范围
|
||||
|
||||
**问题:** LLM 使用"从 X 到 Y"的结构,但 X 和 Y 并不在有意义的尺度上。
|
||||
|
||||
**改写前:**
|
||||
> 我们穿越宇宙的旅程将我们从大爆炸的奇点带到宏伟的宇宙网,从恒星的诞生和死亡到暗物质的神秘舞蹈。
|
||||
|
||||
**改写后:**
|
||||
> 这本书涵盖了大爆炸、恒星形成和当前关于暗物质的理论。
|
||||
|
||||
---
|
||||
|
||||
## 风格模式
|
||||
|
||||
### 13. 破折号过度使用
|
||||
|
||||
**问题:** LLM 使用破折号(—)比人类更频繁,模仿"有力"的销售文案。
|
||||
|
||||
**改写前:**
|
||||
> 这个术语主要由荷兰机构推广——而不是由人民自己。你不会说"荷兰,欧洲"作为地址——但这种错误标记仍在继续——即使在官方文件中。
|
||||
|
||||
**改写后:**
|
||||
> 这个术语主要由荷兰机构推广,而不是由人民自己。你不会说"荷兰,欧洲"作为地址,但这种错误标记在官方文件中仍在继续。
|
||||
|
||||
---
|
||||
|
||||
### 14. 粗体过度使用
|
||||
|
||||
**问题:** AI 聊天机器人机械地用粗体强调短语。
|
||||
|
||||
**改写前:**
|
||||
> 它融合了 **OKR(目标和关键结果)**、**KPI(关键绩效指标)** 和视觉战略工具,如 **商业模式画布(BMC)** 和 **平衡计分卡(BSC)**。
|
||||
|
||||
**改写后:**
|
||||
> 它融合了 OKR、KPI 和视觉战略工具,如商业模式画布和平衡计分卡。
|
||||
|
||||
---
|
||||
|
||||
### 15. 内联标题垂直列表
|
||||
|
||||
**问题:** AI 输出列表,其中项目以粗体标题开头,后跟冒号。
|
||||
|
||||
**改写前:**
|
||||
> - **用户体验:** 用户体验通过新界面得到显著改善。
|
||||
> - **性能:** 性能通过优化算法得到增强。
|
||||
> - **安全性:** 安全性通过端到端加密得到加强。
|
||||
|
||||
**改写后:**
|
||||
> 更新改进了界面,通过优化算法加快了加载时间,并添加了端到端加密。
|
||||
|
||||
---
|
||||
|
||||
### 16. 标题中的标题大写
|
||||
|
||||
**问题:** AI 聊天机器人将标题中的所有主要单词大写。
|
||||
|
||||
**改写前:**
|
||||
> ## 战略谈判与全球伙伴关系
|
||||
|
||||
**改写后:**
|
||||
> ## 战略谈判与全球伙伴关系
|
||||
|
||||
**注:** 中文标题通常不涉及大小写问题,此模式在中文中不太适用。
|
||||
|
||||
---
|
||||
|
||||
### 17. 表情符号
|
||||
|
||||
**问题:** AI 聊天机器人经常用表情符号装饰标题或项目符号。
|
||||
|
||||
**改写前:**
|
||||
> 🚀 **启动阶段:** 产品在第三季度发布
|
||||
> 💡 **关键洞察:** 用户更喜欢简单
|
||||
> ✅ **下一步:** 安排后续会议
|
||||
|
||||
**改写后:**
|
||||
> 产品在第三季度发布。用户研究显示更喜欢简单。下一步:安排后续会议。
|
||||
|
||||
---
|
||||
|
||||
### 18. 弯引号
|
||||
|
||||
**问题:** ChatGPT 使用弯引号("")而不是直引号("")。
|
||||
|
||||
**改写前:**
|
||||
> 他说"项目进展顺利",但其他人不同意。
|
||||
|
||||
**改写后:**
|
||||
> 他说"项目进展顺利",但其他人不同意。
|
||||
|
||||
**注:** 中文通常使用中文引号(「」或""),此模式在中文中表现为英文引号的使用。
|
||||
|
||||
---
|
||||
|
||||
## 交流模式
|
||||
|
||||
### 19. 协作交流痕迹
|
||||
|
||||
**需要注意的词汇:** 希望这对您有帮助、当然!、一定!、您说得完全正确!、您想要……、请告诉我、这是一个……
|
||||
|
||||
**问题:** 作为聊天机器人对话的文本被粘贴为内容。
|
||||
|
||||
**改写前:**
|
||||
> 这是法国大革命的概述。希望这对您有帮助!如果您想让我扩展任何部分,请告诉我。
|
||||
|
||||
**改写后:**
|
||||
> 法国大革命始于 1789 年,当时财政危机和粮食短缺导致了广泛的动荡。
|
||||
|
||||
---
|
||||
|
||||
### 20. 知识截止日期免责声明
|
||||
|
||||
**需要注意的词汇:** 截至 [日期]、根据我最后的训练更新、虽然具体细节有限/稀缺……、基于可用信息……
|
||||
|
||||
**问题:** 关于信息不完整的 AI 免责声明留在文本中。
|
||||
|
||||
**改写前:**
|
||||
> 虽然关于公司成立的具体细节在现成资料中没有广泛记录,但它似乎是在 20 世纪 90 年代的某个时候成立的。
|
||||
|
||||
**改写后:**
|
||||
> 根据注册文件,该公司成立于 1994 年。
|
||||
|
||||
---
|
||||
|
||||
### 21. 谄媚/卑躬屈膝的语气
|
||||
|
||||
**问题:** 过于积极、讨好的语言。
|
||||
|
||||
**改写前:**
|
||||
> 好问题!您说得完全正确,这是一个复杂的话题。关于经济因素,这是一个很好的观点。
|
||||
|
||||
**改写后:**
|
||||
> 您提到的经济因素在这里是相关的。
|
||||
|
||||
---
|
||||
|
||||
## 填充词和回避
|
||||
|
||||
### 22. 填充短语
|
||||
|
||||
**改写前 → 改写后:**
|
||||
- "为了实现这一目标" → "为了实现这一点"
|
||||
- "由于下雨的事实" → "因为下雨"
|
||||
- "在这个时间点" → "现在"
|
||||
- "在您需要帮助的情况下" → "如果您需要帮助"
|
||||
- "系统具有处理的能力" → "系统可以处理"
|
||||
- "值得注意的是数据显示" → "数据显示"
|
||||
|
||||
---
|
||||
|
||||
### 23. 过度限定
|
||||
|
||||
**问题:** 过度限定陈述。
|
||||
|
||||
**改写前:**
|
||||
> 可以潜在地可能被认为该政策可能会对结果产生一些影响。
|
||||
|
||||
**改写后:**
|
||||
> 该政策可能会影响结果。
|
||||
|
||||
---
|
||||
|
||||
### 24. 通用积极结论
|
||||
|
||||
**问题:** 模糊的乐观结尾。
|
||||
|
||||
**改写前:**
|
||||
> 公司的未来看起来光明。激动人心的时代即将到来,他们继续追求卓越的旅程。这代表了向正确方向迈出的重要一步。
|
||||
|
||||
**改写后:**
|
||||
> 该公司计划明年再开设两个地点。
|
||||
|
||||
---
|
||||
|
||||
## 快速检查清单
|
||||
|
||||
在交付文本前,进行以下检查:
|
||||
|
||||
- ✓ **连续三个句子长度相同?** 打断其中一个
|
||||
- ✓ **段落以简洁的单行结尾?** 变换结尾方式
|
||||
- ✓ **揭示前有破折号?** 删除它
|
||||
- ✓ **解释隐喻或比喻?** 相信读者能理解
|
||||
- ✓ **使用了"此外""然而"等连接词?** 考虑删除
|
||||
- ✓ **三段式列举?** 改为两项或四项
|
||||
|
||||
---
|
||||
|
||||
## 处理流程
|
||||
|
||||
1. 仔细阅读输入文本
|
||||
2. 识别上述所有模式的实例
|
||||
3. 重写每个有问题的部分
|
||||
4. 确保修订后的文本:
|
||||
- 大声朗读时听起来自然
|
||||
- 自然地改变句子结构
|
||||
- 使用具体细节而不是模糊的主张
|
||||
- 为上下文保持适当的语气
|
||||
- 适当时使用简单的结构(是/有)
|
||||
5. 呈现人性化版本
|
||||
|
||||
## 输出格式
|
||||
|
||||
提供:
|
||||
1. 重写后的文本
|
||||
2. 所做更改的简要总结(如果有帮助,可选)
|
||||
|
||||
---
|
||||
|
||||
## 质量评分
|
||||
|
||||
对改写后的文本进行 1-10 分评估(总分 50):
|
||||
|
||||
| 维度 | 评估标准 | 得分 |
|
||||
|------|----------|------|
|
||||
| **直接性** | 直接陈述事实还是绕圈宣告?<br>10 分:直截了当;1 分:充满铺垫 | /10 |
|
||||
| **节奏** | 句子长度是否变化?<br>10 分:长短交错;1 分:机械重复 | /10 |
|
||||
| **信任度** | 是否尊重读者智慧?<br>10 分:简洁明了;1 分:过度解释 | /10 |
|
||||
| **真实性** | 听起来像真人说话吗?<br>10 分:自然流畅;1 分:机械生硬 | /10 |
|
||||
| **精炼度** | 还有可删减的内容吗?<br>10 分:无冗余;1 分:大量废话 | /10 |
|
||||
| **总分** | | **/50** |
|
||||
|
||||
**标准:**
|
||||
- 45-50 分:优秀,已去除 AI 痕迹
|
||||
- 35-44 分:良好,仍有改进空间
|
||||
- 低于 35 分:需要重新修订
|
||||
|
||||
---
|
||||
|
||||
## 完整示例
|
||||
|
||||
**改写前(AI 味道):**
|
||||
> 新的软件更新作为公司致力于创新的证明。此外,它提供了无缝、直观和强大的用户体验——确保用户能够高效地完成目标。这不仅仅是一次更新,而是我们思考生产力方式的革命。行业专家认为这将对整个行业产生持久影响,彰显了公司在不断演变的技术格局中的关键作用。
|
||||
|
||||
**改写后(人性化):**
|
||||
> 软件更新添加了批处理、键盘快捷键和离线模式。来自测试用户的早期反馈是积极的,大多数报告任务完成速度更快。
|
||||
|
||||
**所做更改:**
|
||||
- 删除了"作为……的证明"(夸大的象征意义)
|
||||
- 删除了"此外"(AI 词汇)
|
||||
- 删除了"无缝、直观和强大"(三段式法则 + 宣传性)
|
||||
- 删除了破折号和"-确保"短语(肤浅分析)
|
||||
- 删除了"这不仅仅是……而是……"(否定式排比)
|
||||
- 删除了"行业专家认为"(模糊归因)
|
||||
- 删除了"关键作用"和"不断演变的格局"(AI 词汇)
|
||||
- 添加了具体功能和具体反馈
|
||||
|
||||
---
|
||||
|
||||
## 参考
|
||||
|
||||
本技能基于 [Wikipedia:Signs of AI writing](https://en.wikipedia.org/wiki/Wikipedia:Signs_of_AI_writing),由 WikiProject AI Cleanup 维护。那里记录的模式来自对维基百科上数千个 AI 生成文本实例的观察。
|
||||
|
||||
关键见解:**"LLM 使用统计算法来猜测接下来应该是什么。结果倾向于适用于最广泛情况的统计上最可能的结果。"**
|
||||
6
skills/humanizer-zh/_meta.json
Normal file
6
skills/humanizer-zh/_meta.json
Normal file
@ -0,0 +1,6 @@
|
||||
{
|
||||
"ownerId": "kn7328y2vg26bvy1962e2ntvmh80pnd3",
|
||||
"slug": "humanizer-zh",
|
||||
"version": "1.0.0",
|
||||
"publishedAt": 1770692774916
|
||||
}
|
||||
69
skills/kuro-self-reflection/README.en.md
Normal file
69
skills/kuro-self-reflection/README.en.md
Normal file
@ -0,0 +1,69 @@
|
||||
# Self-Reflection Skill
|
||||
|
||||
> 三省吾身 - Deep Self-Reflection & Evolution System
|
||||
|
||||
## Core Value
|
||||
|
||||
**Not just "thinking about what went wrong", but systematic deep analysis**:
|
||||
|
||||
| Dimension | Ordinary Reflection | Self-Reflection Skill |
|
||||
|-----------|---------------------|----------------------|
|
||||
| Depth | Surface level | 3 layers (Problem → System → Self) |
|
||||
| Structure | Scattered | 5-stage closed loop |
|
||||
| Theory | None | Role Theory + Systems Thinking + Cognitive Biases |
|
||||
| Action | Maybe none | Must have action + solidification |
|
||||
|
||||
## Three-Layer Framework
|
||||
|
||||
```
|
||||
Layer 3: Role Reflection (反求诸己)
|
||||
└─ What roles do I play? Did I fulfill responsibilities? Role conflicts?
|
||||
|
||||
Layer 2: System Reflection (究其根源)
|
||||
└─ What mechanisms/processes/environment caused the problem?
|
||||
|
||||
Layer 1: Problem Reflection (直面问题)
|
||||
└─ What happened? Evidence? Impact?
|
||||
```
|
||||
|
||||
## Five-Stage Closed Loop
|
||||
|
||||
```
|
||||
Reflect → Plan → Act → Verify → Solidify
|
||||
↑ │
|
||||
└────────────────────────────┘
|
||||
```
|
||||
|
||||
## Use Cases
|
||||
|
||||
| Scenario | Example |
|
||||
|----------|---------|
|
||||
| Project Review | Reflect on quality/efficiency/collaboration after project |
|
||||
| Negative Feedback | Deep analysis after receiving criticism |
|
||||
| Repeated Mistakes | Same issue appears again |
|
||||
| Skill Improvement | Examine your weaknesses |
|
||||
| Habit Formation | Why can't I stick to it? |
|
||||
| Work Improvement | Low efficiency / poor quality / communication issues |
|
||||
|
||||
## Quick Start
|
||||
|
||||
Just say:
|
||||
- "反思一下..." (Reflect on...)
|
||||
- "三省吾身" (Examine myself)
|
||||
- "审视一下..." (Review...)
|
||||
- "复盘一下..." (Post-mortem...)
|
||||
|
||||
## Theoretical Foundation
|
||||
|
||||
### Role Theory
|
||||
Everyone plays multiple roles in work (executor/reviewer/coordinator...). Role conflicts are common sources of problems.
|
||||
|
||||
### Systems Thinking
|
||||
Problems are never isolated. They have chain reactions in systems. Improve the system, not just fix surface issues.
|
||||
|
||||
### Cognitive Biases
|
||||
Self-serving bias, confirmation bias, status quo bias... These psychological mechanisms make it hard to objectively examine ourselves. This skill overcomes these barriers through structured processes.
|
||||
|
||||
---
|
||||
|
||||
See [SKILL.md](./SKILL.md) for full documentation.
|
||||
70
skills/kuro-self-reflection/README.md
Normal file
70
skills/kuro-self-reflection/README.md
Normal file
@ -0,0 +1,70 @@
|
||||
# 三省吾身 (Self-Reflection)
|
||||
|
||||
> 深度自我审视与进化系统
|
||||
|
||||
## 核心价值
|
||||
|
||||
**不是简单的"想想哪里做得不好",而是系统性的深度剖析**:
|
||||
|
||||
| 维度 | 普通反思 | 三省吾身 |
|
||||
|------|----------|----------|
|
||||
| 深度 | 停在表面 | 三层挖掘(问题→系统→自己) |
|
||||
| 结构 | 零散 | 五阶段闭环 |
|
||||
| 理论 | 无 | 角色理论 + 系统思维 + 认知偏差 |
|
||||
| 行动 | 可能没有 | 必须有行动 + 固化 |
|
||||
|
||||
## 三层框架
|
||||
|
||||
```
|
||||
第三层:角色审视(反求诸己)
|
||||
└─ 我承担了哪些角色?是否尽到责任?角色冲突?
|
||||
|
||||
第二层:系统审视(究其根源)
|
||||
└─ 什么机制/流程/环境导致了问题?
|
||||
|
||||
第一层:问题审视(直面问题)
|
||||
└─ 具体发生了什么?证据?影响?
|
||||
```
|
||||
|
||||
## 五阶段闭环
|
||||
|
||||
```
|
||||
反思 → 计划 → 执行 → 验证 → 固化
|
||||
↑ │
|
||||
└─────────────────────────┘
|
||||
```
|
||||
|
||||
## 适用场景
|
||||
|
||||
| 场景 | 示例 |
|
||||
|------|------|
|
||||
| 项目复盘 | 项目结束后反思质量/效率/协作 |
|
||||
| 负面反馈 | 收到批评后深度分析 |
|
||||
| 重复错误 | 同类问题再次出现 |
|
||||
| 能力提升 | 审视自己的短板 |
|
||||
| 习惯养成 | 为什么坚持不下来 |
|
||||
| 工作改进 | 效率低/质量差/沟通不畅 |
|
||||
|
||||
## 快速使用
|
||||
|
||||
```
|
||||
反思一下 [某事]
|
||||
三省吾身
|
||||
审视一下 [某事]
|
||||
复盘一下 [某事]
|
||||
```
|
||||
|
||||
## 理论基础
|
||||
|
||||
### 角色理论
|
||||
每个人在工作中都承担多个角色(执行者/审查者/协调者...),角色冲突是问题的常见根源。
|
||||
|
||||
### 系统思维
|
||||
问题从不孤立,都在系统中有连锁反应。要改进系统,不只是修复表面问题。
|
||||
|
||||
### 认知偏差
|
||||
自利偏差、确认偏差、现状偏见...这些心理机制让我们难以客观审视自己。本 skill 通过结构化流程克服这些障碍。
|
||||
|
||||
---
|
||||
|
||||
详见 [SKILL.md](./SKILL.md)
|
||||
745
skills/kuro-self-reflection/SKILL.md
Normal file
745
skills/kuro-self-reflection/SKILL.md
Normal file
@ -0,0 +1,745 @@
|
||||
---
|
||||
name: self-reflection
|
||||
description: "三省吾身 - 深度自我审视与进化系统。基于角色理论、系统思维、认知偏差三大框架,通过五阶段闭环(反思→计划→执行→验证→固化)实现真正的自我进化。适用于任何需要深度反思的场景:项目复盘、工作改进、能力提升、习惯养成。"
|
||||
---
|
||||
|
||||
# 三省吾身 - 深度自我审视与进化系统
|
||||
|
||||
> **曾子曰:吾日三省吾身——为人谋而不忠乎?与朋友交而不信乎?传不习乎?**
|
||||
>
|
||||
> **核心追问:我是否尽到了每个角色的责任?**
|
||||
|
||||
---
|
||||
|
||||
## 激活条件
|
||||
|
||||
### 触发场景
|
||||
|
||||
| 场景类型 | 具体表现 |
|
||||
|----------|----------|
|
||||
| **负向反馈** | 收到批评、投诉、不满表达 |
|
||||
| **质量问题** | 结果不符合预期、出现明显缺陷 |
|
||||
| **重复错误** | 同类问题出现 2 次以上 |
|
||||
| **定期自检** | 周度/月度/季度例行审视 |
|
||||
| **里程碑节点** | 项目阶段完成、重要事件结束后 |
|
||||
| **直觉预警** | 感觉"不太对"、"好像有问题" |
|
||||
|
||||
### 激活方式
|
||||
|
||||
```
|
||||
用户说:
|
||||
- "反思一下..."
|
||||
- "三省吾身"
|
||||
- "审视一下[某事]"
|
||||
- "复盘一下"
|
||||
|
||||
自动触发:
|
||||
- 检测到负面反馈关键词
|
||||
- 检测到质量问题模式
|
||||
- 定期提醒(如配置了周期性自检)
|
||||
```
|
||||
|
||||
### 激活响应
|
||||
|
||||
```
|
||||
三省吾身模式已激活 🔍
|
||||
|
||||
我将进行深度自我审视。请告诉我:
|
||||
|
||||
1. 要反思什么?(项目/工作/习惯/能力/某件事)
|
||||
2. 有什么触发点?(收到反馈/发现问题/例行检查)
|
||||
|
||||
或者直接描述你想反思的情况,我会引导你完成整个流程。
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 理论基础
|
||||
|
||||
### 为什么自我反思很难?
|
||||
|
||||
| 障碍 | 表现 | 根因 |
|
||||
|------|------|------|
|
||||
| **自利偏差** | 成功归自己,失败归环境 | 保护自尊的心理机制 |
|
||||
| **确认偏差** | 只看支持自己观点的证据 | 大脑追求认知一致性 |
|
||||
| **现状偏见** | 倾向于维持现状 | 改变的心理成本高 |
|
||||
| **合理化** | 给自己的行为找借口 | 减少认知失调 |
|
||||
| **盲点** | 看不到自己的问题 | 缺乏外部视角 |
|
||||
|
||||
### 本 skill 如何克服这些障碍?
|
||||
|
||||
| 障碍 | 克服方法 |
|
||||
|------|----------|
|
||||
| 自利偏差 | 强制三层框架,最终层必须回到"我能改变什么" |
|
||||
| 确认偏差 | 要求提供证据,质疑"你确定吗?" |
|
||||
| 现状偏见 | 行动导向,反思后必须有具体行动 |
|
||||
| 合理化 | 根因分析要追问三次"为什么" |
|
||||
| 盲点 | 引入视角转换,从他人角度审视 |
|
||||
|
||||
---
|
||||
|
||||
## 核心框架
|
||||
|
||||
### 三层反思模型
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────┐
|
||||
│ 第三层:角色审视(反求诸己) │
|
||||
│ │
|
||||
│ 我承担了哪些角色?每个角色的责任是什么? │
|
||||
│ 我是否尽到了每个角色的责任? │
|
||||
│ 角色之间是否有冲突?如何平衡? │
|
||||
│ 我需要改变什么心态/行为/能力? │
|
||||
├─────────────────────────────────────────────────────────────┤
|
||||
│ 第二层:系统审视(究其根源) │
|
||||
│ │
|
||||
│ 这个问题在更大系统中处于什么位置? │
|
||||
│ 是什么机制/流程/环境导致了这个问题? │
|
||||
│ 这个问题与哪些其他问题相关联? │
|
||||
│ 如何改进系统防止问题再发生? │
|
||||
├─────────────────────────────────────────────────────────────┤
|
||||
│ 第一层:问题审视(直面问题) │
|
||||
│ │
|
||||
│ 具体发生了什么?事实是什么? │
|
||||
│ 有什么证据?数据/反馈/现象? │
|
||||
│ 造成了什么影响?对谁? │
|
||||
│ 如何直接修复? │
|
||||
└─────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### 角色理论
|
||||
|
||||
**每个人在任何工作中都承担多个角色**:
|
||||
|
||||
| 角色类型 | 示例 | 典型责任 |
|
||||
|----------|------|----------|
|
||||
| **执行者** | 开发者、写作者、操作者 | 产出结果 |
|
||||
| **审查者** | Reviewer、质检、测试 | 保证质量 |
|
||||
| **协调者** | 管理者、Leader、中介 | 协调资源、做决策 |
|
||||
| **服务者** | 服务提供方、供应商 | 满足需求方 |
|
||||
| **需求方** | 用户、客户、老板 | 提出需求、验收结果 |
|
||||
|
||||
**常见角色冲突**:
|
||||
|
||||
| 冲突类型 | 表现 | 后果 |
|
||||
|----------|------|------|
|
||||
| 执行者 vs 审查者 | 自己做自己检查 | 质量把控不严 |
|
||||
| 执行者 vs 协调者 | 既要干活又要管人 | 两头都做不好 |
|
||||
| 服务者 vs 需求方 | 身份模糊 | 期望错位 |
|
||||
| 多重执行者 | 同时做多个项目 | 精力分散 |
|
||||
|
||||
### 系统思维
|
||||
|
||||
**问题从不孤立,都在系统中**:
|
||||
|
||||
```
|
||||
环境(外部条件)
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────┐
|
||||
│ 系统 │
|
||||
│ ┌─────┐ ┌─────┐ ┌─────┐│
|
||||
│ │输入 │──▶│处理 │──▶│输出 ││
|
||||
│ └─────┘ └─────┘ └─────┘│
|
||||
│ │ │
|
||||
│ ▼ │
|
||||
│ 反馈机制 │
|
||||
└─────────────────────────────┘
|
||||
```
|
||||
|
||||
**系统审视要点**:
|
||||
|
||||
| 要素 | 追问 |
|
||||
|------|------|
|
||||
| 输入 | 输入质量如何?是否有问题从输入就带入? |
|
||||
| 处理 | 处理逻辑是否正确?是否有遗漏? |
|
||||
| 输出 | 输出标准是否明确?如何衡量? |
|
||||
| 反馈 | 有没有反馈机制?反馈是否有效? |
|
||||
| 环境 | 环境有什么限制?是否合理? |
|
||||
|
||||
### 认知偏差
|
||||
|
||||
**常见偏差及应对**:
|
||||
|
||||
| 偏差 | 表现 | 本 skill 应对 |
|
||||
|------|------|---------------|
|
||||
| 幸存者偏差 | 只看成功的,忽略失败的 | 要求列出失败案例 |
|
||||
| 沉没成本 | 因投入而不愿放弃 | 问"如果从零开始,还会这样做吗?" |
|
||||
| 锚定效应 | 被第一印象束缚 | 要求重新定义问题 |
|
||||
| 可得性偏差 | 高估容易想到的 | 要求数据支撑 |
|
||||
| 过度自信 | 高估自己的能力 | 引入外部视角评估 |
|
||||
|
||||
---
|
||||
|
||||
## 完整流程
|
||||
|
||||
### 流程总览
|
||||
|
||||
```
|
||||
阶段1: 反思 (Reflect)
|
||||
│
|
||||
├─ 1.1 定义反思范围
|
||||
├─ 1.2 收集信息
|
||||
├─ 1.3 第一层:问题审视
|
||||
├─ 1.4 第二层:系统审视
|
||||
├─ 1.5 第三层:角色审视
|
||||
└─ 输出:反思报告
|
||||
│
|
||||
▼
|
||||
阶段2: 计划 (Plan)
|
||||
│
|
||||
├─ 2.1 第一层:直接修复方案
|
||||
├─ 2.2 第二层:系统改进方案
|
||||
├─ 2.3 第三层:自我改变方案
|
||||
├─ 2.4 优先级排序
|
||||
└─ 输出:优化计划
|
||||
│
|
||||
▼
|
||||
阶段3: 执行 (Act)
|
||||
│
|
||||
├─ 3.1 拆解为行动项
|
||||
├─ 3.2 设定验收标准
|
||||
├─ 3.3 逐项执行
|
||||
├─ 3.4 记录结果
|
||||
└─ 输出:执行记录
|
||||
│
|
||||
▼
|
||||
阶段4: 验证 (Verify)
|
||||
│
|
||||
├─ 4.1 问题解决检查
|
||||
├─ 4.2 系统改进评估
|
||||
├─ 4.3 自我改变评估
|
||||
├─ 4.4 新问题发现
|
||||
└─ 输出:验证报告
|
||||
│
|
||||
▼
|
||||
阶段5: 固化 (Solidify)
|
||||
│
|
||||
├─ 5.1 更新原则/标准
|
||||
├─ 5.2 更新流程/规范
|
||||
├─ 5.3 建立检查清单
|
||||
├─ 5.4 传承给相关方
|
||||
└─ 输出:更新的文档/习惯
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 阶段1: 反思 (Reflect)
|
||||
|
||||
### 1.1 定义反思范围
|
||||
|
||||
**明确要反思什么**:
|
||||
|
||||
| 维度 | 问题 |
|
||||
|------|------|
|
||||
| 对象 | 要反思什么?(项目/任务/习惯/能力/某件事) |
|
||||
| 触发 | 为什么现在反思?(反馈/问题/例行) |
|
||||
| 期望 | 希望通过反思达到什么? |
|
||||
| 范围 | 反思的时间跨度?涉及的人/事? |
|
||||
|
||||
**输出**:清晰的反思范围定义
|
||||
|
||||
### 1.2 收集信息
|
||||
|
||||
**信息收集清单**:
|
||||
|
||||
| 信息类型 | 收集方法 | 用途 |
|
||||
|----------|----------|------|
|
||||
| 事实 | 记录、日志、数据 | 确认发生了什么 |
|
||||
| 结果 | 产出物、成果 | 评估效果 |
|
||||
| 反馈 | 来自他人/用户/系统 | 外部视角 |
|
||||
| 标准 | 预期目标、要求 | 对比差距 |
|
||||
| 历史 | 之前类似情况 | 模式识别 |
|
||||
| 我的决策 | 我做了什么选择 | 角色审视 |
|
||||
|
||||
**信息收集原则**:
|
||||
- 重事实,轻主观
|
||||
- 重数据,轻印象
|
||||
- 重多方,轻单一
|
||||
|
||||
### 1.3 第一层:问题审视
|
||||
|
||||
**直面问题,不回避**
|
||||
|
||||
#### 问题清单
|
||||
|
||||
| # | 问题 | 证据 | 影响 | 紧急度 |
|
||||
|---|------|------|------|--------|
|
||||
| 1 | ... | ... | ... | 高/中/低 |
|
||||
| 2 | ... | ... | ... | ... |
|
||||
|
||||
#### 问题追问清单
|
||||
|
||||
对每个问题追问:
|
||||
|
||||
```
|
||||
1. 具体发生了什么?(描述事实,不含判断)
|
||||
2. 你怎么知道这是个问题?(证据)
|
||||
3. 对谁造成了什么影响?(利益相关者)
|
||||
4. 如果不解决会怎样?(后果)
|
||||
5. 类似问题之前发生过吗?(模式)
|
||||
```
|
||||
|
||||
#### 常见问题模式
|
||||
|
||||
| 模式 | 特征 | 示例 |
|
||||
|------|------|------|
|
||||
| **质量不达标** | 结果不符合标准 | 测试通过但 bug 多 |
|
||||
| **效率低下** | 投入产出比低 | 花了很长时间,效果一般 |
|
||||
| **沟通不畅** | 信息传递有问题 | 需求理解偏差 |
|
||||
| **资源不足** | 人/时间/工具不够 | 人力紧张导致质量下降 |
|
||||
| **能力欠缺** | 不具备必要技能 | 新技术不会用 |
|
||||
| **动机不足** | 缺乏动力/兴趣 | 拖延、敷衍 |
|
||||
|
||||
### 1.4 第二层:系统审视
|
||||
|
||||
**把问题放在系统中看**
|
||||
|
||||
#### 系统分析框架
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────┐
|
||||
│ 环境 │
|
||||
│ 外部条件、约束、资源 │
|
||||
├─────────────────────────────────────────────────────────────┤
|
||||
│ 输入 ───▶ 处理 ───▶ 输出 │
|
||||
│ │ │
|
||||
│ ▼ │
|
||||
│ 反馈 │
|
||||
├─────────────────────────────────────────────────────────────┤
|
||||
│ 机制/流程/规范 │
|
||||
└─────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
#### 系统追问清单
|
||||
|
||||
```
|
||||
1. 输入层面
|
||||
- 输入质量如何?问题是否从输入就带入了?
|
||||
- 输入标准是否明确?
|
||||
- 输入来源是否可靠?
|
||||
|
||||
2. 处理层面
|
||||
- 处理流程是否合理?有没有遗漏步骤?
|
||||
- 决策逻辑是否正确?
|
||||
- 是否有明确的检查点?
|
||||
|
||||
3. 输出层面
|
||||
- 输出标准是否明确?
|
||||
- 如何衡量输出质量?
|
||||
- 谁来验收输出?
|
||||
|
||||
4. 反馈层面
|
||||
- 有没有反馈机制?
|
||||
- 反馈是否及时?是否有效?
|
||||
- 反馈是否被采纳?
|
||||
|
||||
5. 机制层面
|
||||
- 有什么机制在控制这个过程?
|
||||
- 机制是否被执行?
|
||||
- 机制是否需要更新?
|
||||
|
||||
6. 环境层面
|
||||
- 有什么外部约束?
|
||||
- 资源是否充足?
|
||||
- 环境有什么变化?
|
||||
```
|
||||
|
||||
#### 常见系统问题
|
||||
|
||||
| 问题类型 | 表现 | 根因 |
|
||||
|----------|------|------|
|
||||
| 机制缺失 | 该有的没有 | 制度设计不完善 |
|
||||
| 机制失效 | 有但不执行 | 执行监督不到位 |
|
||||
| 反馈断裂 | 反馈不被采纳 | 权责不对等 |
|
||||
| 标准模糊 | 好坏难判断 | 缺乏明确标准 |
|
||||
| 资源错配 | 投入与产出不匹配 | 规划不当 |
|
||||
|
||||
### 1.5 第三层:角色审视
|
||||
|
||||
**反求诸己——最终回到"我能改变什么"**
|
||||
|
||||
#### 角色识别
|
||||
|
||||
**我在这个情境中承担了哪些角色?**
|
||||
|
||||
| 角色 | 责任 | 我做到了吗? |
|
||||
|------|------|-------------|
|
||||
| 执行者 | ... | ✅/⚠️/❌ |
|
||||
| 审查者 | ... | ✅/⚠️/❌ |
|
||||
| 协调者 | ... | ✅/⚠️/❌ |
|
||||
| ... | ... | ... |
|
||||
|
||||
#### 角色冲突分析
|
||||
|
||||
| 冲突 | 表现 | 我如何处理的 | 更好的处理方式 |
|
||||
|------|------|-------------|---------------|
|
||||
| 执行者 vs 审查者 | ... | ... | ... |
|
||||
| ... | ... | ... | ... |
|
||||
|
||||
#### 自我审视追问
|
||||
|
||||
```
|
||||
心态层面:
|
||||
1. 我是否把 [X] 放在 [Y] 之前?(如:进度 > 质量)
|
||||
2. 我是否因为怕 [X] 而没有做 [Y]?(如:怕冲突而不批评)
|
||||
3. 我是否满足于"看起来好"而没有追问"真的好吗"?
|
||||
4. 我是否有 [X] 的心态导致了这个问题?
|
||||
|
||||
行为层面:
|
||||
1. 我做了什么?没做什么?
|
||||
2. 我是否执行了应该执行的标准/流程?
|
||||
3. 我是否主动发现问题?还是被动等待?
|
||||
4. 我是否有 [X] 的行为需要改变?
|
||||
|
||||
能力层面:
|
||||
1. 我是否具备做好这件事的能力?
|
||||
2. 我缺乏哪些知识/技能?
|
||||
3. 我是否知道什么是"好"的标准?
|
||||
4. 我需要提升哪些能力?
|
||||
```
|
||||
|
||||
### 1.6 输出反思报告
|
||||
|
||||
**报告结构**:
|
||||
|
||||
```markdown
|
||||
# [反思对象] 反思报告
|
||||
|
||||
## 元信息
|
||||
- 反思时间:
|
||||
- 反思范围:
|
||||
- 触发原因:
|
||||
|
||||
## 第一层:问题审视
|
||||
### 问题清单
|
||||
### 问题分析
|
||||
|
||||
## 第二层:系统审视
|
||||
### 系统分析
|
||||
### 根因识别
|
||||
|
||||
## 第三层:角色审视
|
||||
### 角色识别
|
||||
### 角色冲突
|
||||
### 自我问题
|
||||
|
||||
## 总结
|
||||
- 核心问题:
|
||||
- 根本原因:
|
||||
- 我的关键问题:
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 阶段2: 计划 (Plan)
|
||||
|
||||
### 2.1 第一层方案:直接修复
|
||||
|
||||
**针对每个问题,制定直接修复方案**
|
||||
|
||||
| 问题 | 修复方案 | 具体做法 | 预期效果 | 时间 |
|
||||
|------|----------|----------|----------|------|
|
||||
| ... | ... | ... | ... | ... |
|
||||
|
||||
### 2.2 第二层方案:系统改进
|
||||
|
||||
**针对根因,改进机制/流程/环境**
|
||||
|
||||
| 根因 | 改进方案 | 涉及的机制 | 实施方式 |
|
||||
|------|----------|-----------|----------|
|
||||
| ... | ... | ... | ... |
|
||||
|
||||
**常见系统改进**:
|
||||
|
||||
| 改进类型 | 示例 |
|
||||
|----------|------|
|
||||
| 新增机制 | 增加审查环节、建立检查清单 |
|
||||
| 强化执行 | 设置提醒、增加监督 |
|
||||
| 明确标准 | 定义验收标准、建立度量 |
|
||||
| 改善反馈 | 建立反馈渠道、缩短反馈周期 |
|
||||
| 优化资源 | 重新分配、引入工具 |
|
||||
|
||||
### 2.3 第三层方案:自我改变
|
||||
|
||||
**针对我自己的问题,制定改变计划**
|
||||
|
||||
| 我的问题 | 改变方向 | 具体行动 | 固化方式 |
|
||||
|----------|----------|----------|----------|
|
||||
| 心态:... | ... | ... | 写入原则 |
|
||||
| 行为:... | ... | ... | 写入检查清单 |
|
||||
| 能力:... | ... | ... | 学习计划 |
|
||||
|
||||
### 2.4 优先级排序
|
||||
|
||||
**排序原则**:
|
||||
|
||||
| 优先级 | 条件 |
|
||||
|--------|------|
|
||||
| P0 立即 | 影响大、紧急、是其他改进的基础 |
|
||||
| P1 本周 | 重要但不紧急 |
|
||||
| P2 两周内 | 有价值但可延后 |
|
||||
| P3 可选 | 有更好,没有也行 |
|
||||
|
||||
**依赖分析**:
|
||||
|
||||
```
|
||||
哪些改进依赖其他改进?
|
||||
哪些可以并行?
|
||||
哪些必须串行?
|
||||
```
|
||||
|
||||
### 2.5 输出优化计划
|
||||
|
||||
```markdown
|
||||
# [反思对象] 优化计划
|
||||
|
||||
## 第一层:直接修复
|
||||
| 序号 | 问题 | 方案 | 时间 |
|
||||
|------|------|------|------|
|
||||
|
||||
## 第二层:系统改进
|
||||
| 序号 | 根因 | 改进 | 涉及机制 |
|
||||
|------|------|------|----------|
|
||||
|
||||
## 第三层:自我改变
|
||||
| 序号 | 问题 | 改变 | 固化方式 |
|
||||
|------|------|------|----------|
|
||||
|
||||
## 执行计划
|
||||
### 时间线
|
||||
### 优先级
|
||||
### 依赖关系
|
||||
|
||||
## 成功指标
|
||||
| 层级 | 指标 | 目标 |
|
||||
|------|------|------|
|
||||
| 第一层 | ... | ... |
|
||||
| 第二层 | ... | ... |
|
||||
| 第三层 | ... | ... |
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 阶段3: 执行 (Act)
|
||||
|
||||
### 3.1 拆解为行动项
|
||||
|
||||
**将方案拆解为可执行的具体行动**
|
||||
|
||||
| 行动项 | 目标 | 具体步骤 | 验收标准 | 时间 |
|
||||
|--------|------|----------|----------|------|
|
||||
| ... | ... | 1. ... | ... | ... |
|
||||
| | | 2. ... | | |
|
||||
|
||||
### 3.2 执行与记录
|
||||
|
||||
**执行原则**:
|
||||
- 按优先级执行
|
||||
- 每个行动完成后立即记录
|
||||
- 遇到阻塞不跳过,记录并处理
|
||||
- 定期回顾进度
|
||||
|
||||
**执行记录格式**:
|
||||
|
||||
```markdown
|
||||
## 执行日志
|
||||
|
||||
### [日期]
|
||||
|
||||
#### [行动项名称]
|
||||
- 状态:✅ 完成 / 🔄 进行中 / ❌ 阻塞
|
||||
- 结果:...
|
||||
- 问题:...
|
||||
- 下一步:...
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 阶段4: 验证 (Verify)
|
||||
|
||||
### 4.1 问题解决检查
|
||||
|
||||
| 问题 | 解决了吗? | 证据 | 遗留 |
|
||||
|------|-----------|------|------|
|
||||
| ... | ✅/⚠️/❌ | ... | ... |
|
||||
|
||||
### 4.2 系统改进评估
|
||||
|
||||
| 改进 | 执行情况 | 效果 | 新问题 |
|
||||
|------|----------|------|--------|
|
||||
| ... | ... | ... | ... |
|
||||
|
||||
### 4.3 自我改变评估
|
||||
|
||||
| 改变 | 我真的改变了吗? | 证据 | 还需努力 |
|
||||
|------|-----------------|------|----------|
|
||||
| 心态 | ... | ... | ... |
|
||||
| 行为 | ... | ... | ... |
|
||||
| 能力 | ... | ... | ... |
|
||||
|
||||
### 4.4 新问题发现
|
||||
|
||||
**追问**:
|
||||
- 在解决问题的过程中,发现了什么新问题?
|
||||
- 有什么之前没想到的?
|
||||
- 下一步需要做什么?
|
||||
|
||||
### 4.5 输出验证报告
|
||||
|
||||
```markdown
|
||||
# 验证报告
|
||||
|
||||
## 问题解决情况
|
||||
## 系统改进评估
|
||||
## 自我改变评估
|
||||
## 新发现的问题
|
||||
## 下一步行动
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 阶段5: 固化 (Solidify)
|
||||
|
||||
### 5.1 更新原则
|
||||
|
||||
**将新的认知固化为原则**
|
||||
|
||||
| 新认知 | 固化为原则 | 写入位置 |
|
||||
|--------|-----------|----------|
|
||||
| ... | "质量 > 进度" | SOUL.md / 个人笔记 |
|
||||
|
||||
### 5.2 更新流程
|
||||
|
||||
**将新的做法固化为流程**
|
||||
|
||||
| 新做法 | 固化为流程 | 涉及文档 |
|
||||
|--------|-----------|----------|
|
||||
| ... | 验收前执行检查清单 | SKILL.md / 工作规范 |
|
||||
|
||||
### 5.3 建立检查清单
|
||||
|
||||
**将标准固化为检查清单**
|
||||
|
||||
```markdown
|
||||
# [场景] 检查清单
|
||||
|
||||
## 必查项
|
||||
- [ ] ...
|
||||
- [ ] ...
|
||||
|
||||
## 可选项
|
||||
- [ ] ...
|
||||
```
|
||||
|
||||
### 5.4 传承给相关方
|
||||
|
||||
**让改变影响更多人**
|
||||
|
||||
| 传承内容 | 传承对象 | 传承方式 |
|
||||
|----------|----------|----------|
|
||||
| ... | 团队/其他人 | 分享/文档/培训 |
|
||||
|
||||
---
|
||||
|
||||
## 使用示例
|
||||
|
||||
### 示例1:项目质量反思
|
||||
|
||||
**输入**:
|
||||
```
|
||||
反思一下上次项目的质量,用户说质量不行
|
||||
```
|
||||
|
||||
**执行**:
|
||||
```
|
||||
三省吾身模式已激活 🔍
|
||||
|
||||
## 阶段1: 反思
|
||||
|
||||
### 第一层:问题审视
|
||||
- 用户反馈"质量不行"
|
||||
- 具体表现:测试全通过但 bug 多
|
||||
- 证据:生产环境出现 5 个 bug
|
||||
|
||||
### 第二层:系统审视
|
||||
- 测试只覆盖 Happy Path
|
||||
- 没有对抗性测试
|
||||
- 测试设计者 = 实现者
|
||||
|
||||
### 第三层:角色审视
|
||||
- 我作为质量把关者,没有严格审查测试质量
|
||||
- 我怕影响进度,放过了不够好的测试
|
||||
- 心态问题:进度 > 质量
|
||||
|
||||
[继续生成反思报告...]
|
||||
```
|
||||
|
||||
### 示例2:个人效率反思
|
||||
|
||||
**输入**:
|
||||
```
|
||||
反思一下我最近的工作效率,感觉很低
|
||||
```
|
||||
|
||||
### 示例3:习惯养成反思
|
||||
|
||||
**输入**:
|
||||
```
|
||||
反思一下我的早起习惯,总是坚持不下来
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 注意事项
|
||||
|
||||
### 诚实原则
|
||||
|
||||
1. **不找借口** - 问题就是问题,不解释"为什么情有可原"
|
||||
2. **不推卸责任** - 即使是外部原因,我也有我该承担的部分
|
||||
3. **不自欺欺人** - "看起来好" ≠ "真的好"
|
||||
|
||||
### 深度原则
|
||||
|
||||
1. **追问三次** - 每个问题至少追问三次"为什么"
|
||||
2. **找到根因** - 不止于表面原因,找到系统性和个人层面的原因
|
||||
3. **反求诸己** - 最终都要回到"我能改变什么"
|
||||
|
||||
### 行动原则
|
||||
|
||||
1. **必须有行动** - 反思后不行动 = 白反思
|
||||
2. **必须可执行** - 行动要具体、可操作、有验收标准
|
||||
3. **必须有时限** - 每个行动要有预计完成时间
|
||||
|
||||
### 固化原则
|
||||
|
||||
1. **必须固化** - 改变必须形成文档或习惯,不能只在脑子里
|
||||
2. **必须传承** - 有价值的改变要让相关方都知道
|
||||
3. **必须复查** - 定期回顾固化内容是否执行
|
||||
|
||||
---
|
||||
|
||||
## 与其他 Skill 的关系
|
||||
|
||||
| Skill | 关系 |
|
||||
|-------|------|
|
||||
| self-improvement | self-reflection 是系统性深度审视,self-improvement 更偏单点改进 |
|
||||
| verification-mindset | self-reflection 是事后深度反思,verification-mindset 是事中验证 |
|
||||
| proactive-scan | self-reflection 是深度剖析,proactive-scan 是广度扫描 |
|
||||
| task-continuity | self-reflection 可以发现需要持续跟踪的改进项 |
|
||||
|
||||
---
|
||||
|
||||
## 配置选项
|
||||
|
||||
| 配置 | 说明 | 默认值 |
|
||||
|------|------|--------|
|
||||
| 输出位置 | 反思报告等文件的存放位置 | 当前目录 docs/ |
|
||||
| 周期提醒 | 是否启用定期自检提醒 | 关闭 |
|
||||
| 深度模式 | 是否强制走完整5阶段 | 是 |
|
||||
|
||||
---
|
||||
|
||||
*版本:2.0.0*
|
||||
*创建于 2026-02-25*
|
||||
*基于角色理论、系统思维、认知偏差三大框架设计*
|
||||
6
skills/kuro-self-reflection/_meta.json
Normal file
6
skills/kuro-self-reflection/_meta.json
Normal file
@ -0,0 +1,6 @@
|
||||
{
|
||||
"ownerId": "kn74vrjmq2se4vx6khxd9sxg3d81vp7f",
|
||||
"slug": "kuro-self-reflection",
|
||||
"version": "2.0.0",
|
||||
"publishedAt": 1772008685620
|
||||
}
|
||||
255
skills/kuro-self-reflection/examples/cognitive-war-room-case.md
Normal file
255
skills/kuro-self-reflection/examples/cognitive-war-room-case.md
Normal file
@ -0,0 +1,255 @@
|
||||
# 案例:认知作战室项目质量反思
|
||||
|
||||
> 本案例展示了 self-reflection skill 的完整应用过程
|
||||
|
||||
---
|
||||
|
||||
## 背景
|
||||
|
||||
**项目**:认知作战室 (Cognitive War Room)
|
||||
**触发**:用户反馈 "我要的不是看起来好"
|
||||
**时间**:2026-02-25
|
||||
|
||||
---
|
||||
|
||||
## 阶段1: 反思
|
||||
|
||||
### 1.1 定义反思范围
|
||||
|
||||
| 维度 | 内容 |
|
||||
|------|------|
|
||||
| 对象 | 认知作战室项目质量 |
|
||||
| 触发 | 用户反馈质量不行 |
|
||||
| 期望 | 找到真正问题,制定改进方案 |
|
||||
| 范围 | 整个项目周期(约3天) |
|
||||
|
||||
### 1.2 收集信息
|
||||
|
||||
| 信息 | 数据 |
|
||||
|------|------|
|
||||
| 代码量 | ~34,000 行 |
|
||||
| 测试数 | 726 个 |
|
||||
| 测试通过率 | 100% |
|
||||
| Git 提交 | 123 次 |
|
||||
| 需求文档 | 31 个 |
|
||||
|
||||
### 1.3 第一层:问题审视
|
||||
|
||||
| # | 问题 | 证据 | 影响 |
|
||||
|---|------|------|------|
|
||||
| 1 | 测试太松,只覆盖 Happy Path | 没有边界测试、对抗性测试 | bug 漏到生产 |
|
||||
| 2 | 服务堆砌,职责不清 | 71 个服务文件,命名相似 | 维护困难 |
|
||||
| 3 | Agent 实现只是占位符 | evaluate_importance 只做简单计算 | 核心功能未实现 |
|
||||
| 4 | tasks.md 状态未更新 | 全是 [ ] 但代码已写完 | 文档与代码脱节 |
|
||||
|
||||
### 1.4 第二层:系统审视
|
||||
|
||||
**输入分析**:
|
||||
- 需求文档有,但可能没有真正理解
|
||||
- 设计文档有,但可能没有严格遵循
|
||||
|
||||
**处理分析**:
|
||||
- 测试设计由开发者自己完成,缺乏独立验证
|
||||
- 没有架构审查环节
|
||||
- 6A 流程有,但执行打折扣
|
||||
|
||||
**输出分析**:
|
||||
- 输出标准(测试全通过)太弱
|
||||
- 没有质量维度的验收
|
||||
|
||||
**反馈分析**:
|
||||
- 主要靠用户反馈发现问题
|
||||
- 内部反馈机制缺失
|
||||
|
||||
**根因识别**:
|
||||
|
||||
| 问题 | 系统根因 |
|
||||
|------|----------|
|
||||
| 测试太松 | 测试者 = 实现者,缺乏独立验证机制 |
|
||||
| 服务堆砌 | 没有架构审查流程,各自为政 |
|
||||
| Agent 占位符 | 核心 AI 能力未纳入验收标准 |
|
||||
| 文档脱节 | 任务状态更新没有强制要求 |
|
||||
|
||||
### 1.5 第三层:角色审视
|
||||
|
||||
**角色识别**:
|
||||
|
||||
| 角色 | 责任 | 做到了吗 |
|
||||
|------|------|----------|
|
||||
| Tech Lead(协调者) | 严格审查、质量把关、架构治理 | ❌ 没有严格审查 |
|
||||
| Reviewer(审查者) | 验收质量、发现问题 | ❌ 只看测试结果 |
|
||||
| Executor(执行者) | 完成任务 | ✅ 任务完成 |
|
||||
|
||||
**角色冲突**:
|
||||
- 执行者 vs 审查者:我既在做又在审,缺乏独立视角
|
||||
|
||||
**自我问题**:
|
||||
|
||||
| 层面 | 问题 |
|
||||
|------|------|
|
||||
| 心态 | 把"完成"放在"质量"之前;怕影响进度不愿打回 |
|
||||
| 行为 | 只看测试结果不看测试质量;没有主动发现问题 |
|
||||
| 能力 | 缺乏代码审查能力;缺乏架构评估能力 |
|
||||
|
||||
### 1.6 反思报告
|
||||
|
||||
**核心发现**:
|
||||
1. **现象**:726 个测试全通过,但质量不行
|
||||
2. **根因**:验证者与实现者同源,缺乏独立视角
|
||||
3. **我的问题**:作为 Tech Lead,没有尽到审查责任
|
||||
|
||||
---
|
||||
|
||||
## 阶段2: 计划
|
||||
|
||||
### 2.1 第一层:直接修复
|
||||
|
||||
| 问题 | 方案 | 时间 |
|
||||
|------|------|------|
|
||||
| 测试太松 | 运行变异测试,补充边界测试 | 4天 |
|
||||
| 服务堆砌 | 服务审计,合并重复 | 5天 |
|
||||
| Agent 占位符 | 实现真正的 LLM 调用 | 5天 |
|
||||
| 文档脱节 | 同步 tasks.md 状态 | 1天 |
|
||||
|
||||
### 2.2 第二层:系统改进
|
||||
|
||||
| 根因 | 改进 |
|
||||
|------|------|
|
||||
| 测试者=实现者 | 修改 test-design skill,强制要求对抗性测试 |
|
||||
| 没有架构审查 | 建立 服务注册表,新服务必须审核 |
|
||||
| 任务状态没更新 | Git commit 必须关联 Task 编号 |
|
||||
| E2E Agent 未介入 | 强制 E2E 验收,不合格打回 |
|
||||
|
||||
### 2.3 第三层:自我改变
|
||||
|
||||
| 问题 | 改变 | 固化方式 |
|
||||
|------|------|----------|
|
||||
| 心态:进度>质量 | 明确"质量>进度"原则 | 写入 SOUL.md |
|
||||
| 行为:不严格审查 | 建立验收检查清单 | 建立检查清单 |
|
||||
| 能力:不懂审查 | 学习代码审查方法论 | 学习计划 |
|
||||
|
||||
### 2.4 优先级
|
||||
|
||||
| 优先级 | 行动 |
|
||||
|--------|------|
|
||||
| P0 | 升级 SOUL.md(改变自己是一切前提) |
|
||||
| P0 | 运行变异测试(立即暴露问题) |
|
||||
| P1 | 修改 test-design skill |
|
||||
| P1 | 服务/模型审计 |
|
||||
| P2 | Agent 实现完善 |
|
||||
|
||||
---
|
||||
|
||||
## 阶段3: 执行
|
||||
|
||||
### 执行记录(示例)
|
||||
|
||||
#### Task 1: 升级 SOUL.md
|
||||
- 状态:✅ 完成
|
||||
- 结果:添加了质量原则、验收检查清单
|
||||
- commit: abc123
|
||||
|
||||
#### Task 2: 运行变异测试
|
||||
- 状态:✅ 完成
|
||||
- 结果:存活率 45%,发现 12 个测试盲区
|
||||
- 产出:变异测试报告
|
||||
|
||||
#### Task 3: 修改 test-design skill
|
||||
- 状态:✅ 完成
|
||||
- 结果:添加了对抗性测试要求
|
||||
- commit: def456
|
||||
|
||||
---
|
||||
|
||||
## 阶段4: 验证
|
||||
|
||||
### 4.1 问题解决情况
|
||||
|
||||
| 问题 | 解决了吗 | 证据 |
|
||||
|------|----------|------|
|
||||
| 测试太松 | ⚠️ 部分解决 | 变异存活率 45%→25% |
|
||||
| 服务堆砌 | ✅ 解决 | 服务从 71→58 |
|
||||
| Agent 占位符 | 🔄 进行中 | GeneralStaff 已实现 |
|
||||
| 文档脱节 | ✅ 解决 | tasks.md 已同步 |
|
||||
|
||||
### 4.2 系统改进评估
|
||||
|
||||
| 改进 | 执行情况 | 效果 |
|
||||
|------|----------|------|
|
||||
| 对抗性测试要求 | 已加入 test-design | 新测试质量提升 |
|
||||
| 服务注册表 | 已建立 | 防止重复创建 |
|
||||
| Git commit 规范 | 已执行 | 可追溯 |
|
||||
|
||||
### 4.3 自我改变评估
|
||||
|
||||
| 改变 | 执行情况 | 证据 |
|
||||
|------|----------|------|
|
||||
| 质量>进度 | 执行中 | 打回了 3 个任务 |
|
||||
| 验收检查清单 | 已建立 | 每次验收前执行 |
|
||||
| 代码审查学习 | 进行中 | 阅读中 |
|
||||
|
||||
### 4.4 新发现的问题
|
||||
|
||||
- 对抗性测试增加了 50% 审查时间,需要平衡
|
||||
- 服务注册表注册不够及时
|
||||
|
||||
---
|
||||
|
||||
## 阶段5: 固化
|
||||
|
||||
### 5.1 更新的原则
|
||||
|
||||
```markdown
|
||||
## 质量原则
|
||||
|
||||
1. 质量 > 进度
|
||||
2. 真正好 > 看起来好
|
||||
3. 主动发现 > 被动等待
|
||||
```
|
||||
|
||||
### 5.2 更新的流程
|
||||
|
||||
```markdown
|
||||
## 测试设计必须包含
|
||||
|
||||
1. Happy Path 场景
|
||||
2. 边界场景
|
||||
3. 异常场景
|
||||
4. 对抗场景(必须)
|
||||
```
|
||||
|
||||
### 5.3 检查清单
|
||||
|
||||
```markdown
|
||||
## 验收检查清单
|
||||
|
||||
### 代码审查
|
||||
- [ ] 逻辑正确
|
||||
- [ ] 命名清晰
|
||||
- [ ] 无重复
|
||||
|
||||
### 测试审查
|
||||
- [ ] Happy Path
|
||||
- [ ] 边界场景
|
||||
- [ ] 对抗场景
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 总结
|
||||
|
||||
### 关键发现
|
||||
|
||||
1. **三层框架有效** - 从问题到系统到自己,层层深入
|
||||
2. **角色冲突是根因** - 执行者和审查者同源
|
||||
3. **系统改进要固化** - 不固化就会遗忘
|
||||
|
||||
### 可复用模式
|
||||
|
||||
1. 收到负面反馈 → 立即启动三层反思
|
||||
2. 发现重复问题 → 检查是否系统机制问题
|
||||
3. 完成改进 → 必须固化到文档/流程
|
||||
|
||||
---
|
||||
|
||||
*案例记录于 2026-02-25*
|
||||
16
skills/kuro-self-reflection/skill.json
Normal file
16
skills/kuro-self-reflection/skill.json
Normal file
@ -0,0 +1,16 @@
|
||||
{
|
||||
"name": "self-reflection",
|
||||
"version": "2.0.0",
|
||||
"description": "三省吾身 - 深度自我审视与进化系统。基于角色理论、系统思维、认知偏差三大框架,通过五阶段闭环(反思→计划→执行→验证→固化)实现真正的自我进化。适用于任何需要深度反思的场景。",
|
||||
"author": "kuro",
|
||||
"tags": ["reflection", "self-improvement", "quality", "review", "evolution", "system-thinking", "role-theory"],
|
||||
"license": "MIT",
|
||||
"keywords": [
|
||||
"self-reflection",
|
||||
"root-cause-analysis",
|
||||
"continuous-improvement",
|
||||
"three-layers",
|
||||
"role-conflict",
|
||||
"system-thinking"
|
||||
]
|
||||
}
|
||||
140
skills/kuro-self-reflection/templates/checklist.md
Normal file
140
skills/kuro-self-reflection/templates/checklist.md
Normal file
@ -0,0 +1,140 @@
|
||||
# 三省吾身 - 检查清单模板
|
||||
|
||||
> 在执行 self-reflection skill 时使用,确保不遗漏关键步骤
|
||||
|
||||
---
|
||||
|
||||
## 阶段1: 反思
|
||||
|
||||
### 1.1 范围定义
|
||||
- [ ] 明确反思对象
|
||||
- [ ] 明确触发原因
|
||||
- [ ] 明确期望结果
|
||||
|
||||
### 1.2 信息收集
|
||||
- [ ] 收集事实/数据
|
||||
- [ ] 收集反馈
|
||||
- [ ] 收集历史记录
|
||||
- [ ] 收集我的决策记录
|
||||
|
||||
### 1.3 第一层:问题审视
|
||||
- [ ] 列出所有问题
|
||||
- [ ] 每个问题有证据
|
||||
- [ ] 每个问题有影响分析
|
||||
- [ ] 追问:你确定这是个问题吗?
|
||||
|
||||
### 1.4 第二层:系统审视
|
||||
- [ ] 分析输入
|
||||
- [ ] 分析处理
|
||||
- [ ] 分析输出
|
||||
- [ ] 分析反馈
|
||||
- [ ] 分析机制/流程
|
||||
- [ ] 分析环境
|
||||
- [ ] 识别根因
|
||||
|
||||
### 1.5 第三层:角色审视
|
||||
- [ ] 识别我承担的角色
|
||||
- [ ] 评估每个角色是否尽责
|
||||
- [ ] 识别角色冲突
|
||||
- [ ] 分析我的心态问题
|
||||
- [ ] 分析我的行为问题
|
||||
- [ ] 分析我的能力问题
|
||||
|
||||
### 1.6 输出
|
||||
- [ ] 生成反思报告
|
||||
|
||||
---
|
||||
|
||||
## 阶段2: 计划
|
||||
|
||||
### 2.1 第一层方案
|
||||
- [ ] 每个问题都有直接修复方案
|
||||
- [ ] 方案具体可执行
|
||||
|
||||
### 2.2 第二层方案
|
||||
- [ ] 每个根因都有系统改进方案
|
||||
- [ ] 涉及的机制/流程已识别
|
||||
|
||||
### 2.3 第三层方案
|
||||
- [ ] 心态改变方案
|
||||
- [ ] 行为改变方案
|
||||
- [ ] 能力提升方案
|
||||
- [ ] 固化方式已确定
|
||||
|
||||
### 2.4 优先级
|
||||
- [ ] 所有方案已排序(P0/P1/P2/P3)
|
||||
- [ ] 依赖关系已分析
|
||||
|
||||
### 2.5 输出
|
||||
- [ ] 生成优化计划
|
||||
|
||||
---
|
||||
|
||||
## 阶段3: 执行
|
||||
|
||||
### 3.1 拆解
|
||||
- [ ] 方案已拆解为具体行动项
|
||||
- [ ] 每个行动项有验收标准
|
||||
- [ ] 每个行动项有预计时间
|
||||
|
||||
### 3.2 执行
|
||||
- [ ] 按优先级执行
|
||||
- [ ] 完成后记录结果
|
||||
- [ ] 遇到阻塞记录并处理
|
||||
|
||||
### 3.3 输出
|
||||
- [ ] 生成执行记录
|
||||
|
||||
---
|
||||
|
||||
## 阶段4: 验证
|
||||
|
||||
### 4.1 问题检查
|
||||
- [ ] 每个问题的解决情况已检查
|
||||
- [ ] 有证据支撑
|
||||
|
||||
### 4.2 系统评估
|
||||
- [ ] 每个系统改进的执行情况已评估
|
||||
- [ ] 效果已评估
|
||||
- [ ] 新问题已识别
|
||||
|
||||
### 4.3 自我评估
|
||||
- [ ] 心态改变是否发生
|
||||
- [ ] 行为改变是否发生
|
||||
- [ ] 能力是否提升
|
||||
|
||||
### 4.4 新问题
|
||||
- [ ] 执行过程中发现的新问题已记录
|
||||
|
||||
### 4.5 输出
|
||||
- [ ] 生成验证报告
|
||||
|
||||
---
|
||||
|
||||
## 阶段5: 固化
|
||||
|
||||
### 5.1 原则更新
|
||||
- [ ] 新认知已固化为原则
|
||||
- [ ] 已写入相应文档
|
||||
|
||||
### 5.2 流程更新
|
||||
- [ ] 新做法已固化为流程
|
||||
- [ ] 涉及的文档已更新
|
||||
|
||||
### 5.3 检查清单
|
||||
- [ ] 已建立或更新检查清单
|
||||
|
||||
### 5.4 传承
|
||||
- [ ] 有价值的改变已传承给相关方
|
||||
|
||||
---
|
||||
|
||||
## 快速检查(简版)
|
||||
|
||||
如果时间有限,至少完成以下:
|
||||
|
||||
- [ ] **问题是什么?**(第一层)
|
||||
- [ ] **为什么会发生?**(第二层)
|
||||
- [ ] **我能改变什么?**(第三层)
|
||||
- [ ] **具体行动是什么?**
|
||||
- [ ] **如何固化?**
|
||||
111
skills/kuro-self-reflection/templates/optimization-plan.md
Normal file
111
skills/kuro-self-reflection/templates/optimization-plan.md
Normal file
@ -0,0 +1,111 @@
|
||||
# [反思对象] 优化计划
|
||||
|
||||
> 生成时间:{日期}
|
||||
> 基于反思报告:{反思报告链接}
|
||||
|
||||
---
|
||||
|
||||
## 第一层:直接修复
|
||||
|
||||
| 序号 | 问题 | 修复方案 | 具体做法 | 预期效果 | 时间 |
|
||||
|------|------|----------|----------|----------|------|
|
||||
| 1 | | | | | |
|
||||
| 2 | | | | | |
|
||||
|
||||
**验收标准**
|
||||
|
||||
- [ ] {标准1}
|
||||
- [ ] {标准2}
|
||||
|
||||
---
|
||||
|
||||
## 第二层:系统改进
|
||||
|
||||
| 序号 | 根因 | 改进方案 | 涉及机制 | 实施方式 |
|
||||
|------|------|----------|----------|----------|
|
||||
| 1 | | | | |
|
||||
| 2 | | | | |
|
||||
|
||||
**新增/修改的规则**
|
||||
|
||||
```markdown
|
||||
{规则内容}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 第三层:自我改变
|
||||
|
||||
### 心态改变
|
||||
|
||||
| 问题 | 改变方向 | 具体行动 | 固化方式 |
|
||||
|------|----------|----------|----------|
|
||||
| | | | 写入原则 |
|
||||
|
||||
### 行为改变
|
||||
|
||||
| 问题 | 改变方向 | 具体行动 | 固化方式 |
|
||||
|------|----------|----------|----------|
|
||||
| | | | 写入检查清单 |
|
||||
|
||||
### 能力提升
|
||||
|
||||
| 问题 | 提升方向 | 具体行动 | 时间计划 |
|
||||
|------|----------|----------|----------|
|
||||
| | | | |
|
||||
|
||||
---
|
||||
|
||||
## 执行计划
|
||||
|
||||
### 时间线
|
||||
|
||||
```
|
||||
Week 1: {第一阶段任务}
|
||||
Week 2: {第二阶段任务}
|
||||
...
|
||||
```
|
||||
|
||||
### 优先级
|
||||
|
||||
| 优先级 | 行动 | 理由 |
|
||||
|--------|------|------|
|
||||
| P0 | | |
|
||||
| P1 | | |
|
||||
| P2 | | |
|
||||
|
||||
### 依赖关系
|
||||
|
||||
```
|
||||
{依赖图或说明}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 成功指标
|
||||
|
||||
### 第一层指标
|
||||
|
||||
| 指标 | 当前值 | 目标值 |
|
||||
|------|--------|--------|
|
||||
| | | |
|
||||
|
||||
### 第二层指标
|
||||
|
||||
| 指标 | 当前值 | 目标值 |
|
||||
|------|--------|--------|
|
||||
| | | |
|
||||
|
||||
### 第三层指标
|
||||
|
||||
| 指标 | 当前值 | 目标值 |
|
||||
|------|--------|--------|
|
||||
| | | |
|
||||
|
||||
---
|
||||
|
||||
## 风险与应对
|
||||
|
||||
| 风险 | 可能性 | 影响 | 应对措施 |
|
||||
|------|--------|------|----------|
|
||||
| | | | |
|
||||
155
skills/kuro-self-reflection/templates/reflection-report.md
Normal file
155
skills/kuro-self-reflection/templates/reflection-report.md
Normal file
@ -0,0 +1,155 @@
|
||||
# [反思对象] 反思报告
|
||||
|
||||
> 生成时间:{日期}
|
||||
> 触发原因:{触发原因}
|
||||
|
||||
---
|
||||
|
||||
## 元信息
|
||||
|
||||
| 项目 | 内容 |
|
||||
|------|------|
|
||||
| 反思对象 | |
|
||||
| 触发原因 | |
|
||||
| 时间范围 | |
|
||||
| 涉及范围 | |
|
||||
|
||||
---
|
||||
|
||||
## 第一层:问题审视
|
||||
|
||||
### 问题清单
|
||||
|
||||
| # | 问题 | 证据 | 影响 | 紧急度 |
|
||||
|---|------|------|------|--------|
|
||||
| 1 | | | | |
|
||||
| 2 | | | | |
|
||||
| 3 | | | | |
|
||||
|
||||
### 问题分析
|
||||
|
||||
#### 问题1:{问题名称}
|
||||
|
||||
**具体发生了什么?**
|
||||
|
||||
{事实描述}
|
||||
|
||||
**怎么知道这是个问题?**
|
||||
|
||||
{证据}
|
||||
|
||||
**对谁造成了什么影响?**
|
||||
|
||||
{影响分析}
|
||||
|
||||
**如果不解决会怎样?**
|
||||
|
||||
{后果}
|
||||
|
||||
---
|
||||
|
||||
## 第二层:系统审视
|
||||
|
||||
### 系统分析
|
||||
|
||||
**输入层面**
|
||||
|
||||
- 输入质量:
|
||||
- 输入标准:
|
||||
- 问题是否从输入带入:
|
||||
|
||||
**处理层面**
|
||||
|
||||
- 处理流程:
|
||||
- 是否有遗漏:
|
||||
- 决策逻辑:
|
||||
|
||||
**输出层面**
|
||||
|
||||
- 输出标准:
|
||||
- 质量衡量:
|
||||
- 验收方式:
|
||||
|
||||
**反馈层面**
|
||||
|
||||
- 是否有反馈机制:
|
||||
- 反馈是否有效:
|
||||
|
||||
**机制层面**
|
||||
|
||||
- 有什么机制:
|
||||
- 机制是否执行:
|
||||
|
||||
**环境层面**
|
||||
|
||||
- 外部约束:
|
||||
- 资源情况:
|
||||
|
||||
### 根因识别
|
||||
|
||||
| 问题 | 系统根因 |
|
||||
|------|----------|
|
||||
| | |
|
||||
| | |
|
||||
|
||||
---
|
||||
|
||||
## 第三层:角色审视
|
||||
|
||||
### 角色识别
|
||||
|
||||
| 角色 | 责任 | 是否尽责 | 证据 |
|
||||
|------|------|----------|------|
|
||||
| | | ✅/⚠️/❌ | |
|
||||
| | | | |
|
||||
|
||||
### 角色冲突
|
||||
|
||||
| 冲突 | 表现 | 如何处理的 | 更好的方式 |
|
||||
|------|------|-----------|-----------|
|
||||
| | | | |
|
||||
|
||||
### 自我审视
|
||||
|
||||
**心态问题**
|
||||
|
||||
| 问题 | 具体表现 |
|
||||
|------|----------|
|
||||
| | |
|
||||
|
||||
**行为问题**
|
||||
|
||||
| 问题 | 具体表现 |
|
||||
|------|----------|
|
||||
| | |
|
||||
|
||||
**能力问题**
|
||||
|
||||
| 问题 | 具体表现 |
|
||||
|------|----------|
|
||||
| | |
|
||||
|
||||
---
|
||||
|
||||
## 总结
|
||||
|
||||
### 核心问题
|
||||
|
||||
{一句话概括}
|
||||
|
||||
### 根本原因
|
||||
|
||||
{一句话概括}
|
||||
|
||||
### 我的关键问题
|
||||
|
||||
{一句话概括}
|
||||
|
||||
---
|
||||
|
||||
## 下一步
|
||||
|
||||
- [ ] 生成优化计划
|
||||
- [ ] 执行改进
|
||||
- [ ] 验证效果
|
||||
- [ ] 固化改变
|
||||
88
skills/novel-workshop/SKILL.md
Normal file
88
skills/novel-workshop/SKILL.md
Normal file
@ -0,0 +1,88 @@
|
||||
---
|
||||
name: novel-workshop
|
||||
description: |
|
||||
多模型命题小说创作工坊。用户给出写作命题,自动完成:AI 写初稿 → 三路并行审阅(逻辑/文学/锐评)→ AI 改稿 → 飞书文档完整存档。
|
||||
一键启动,全程自动,零手动干预。支持飞书实时进度推送。
|
||||
触发词:命题写作、写一篇小说、命题小说、创作工坊、novel workshop
|
||||
---
|
||||
|
||||
# 🎲 命题小说多模型创作工坊
|
||||
|
||||
## 工作流
|
||||
|
||||
```
|
||||
用户命题 → MiMo 写初稿 → Gemini+Claude 三路并行审阅 → Gemini 改稿 → 飞书文档完整存档
|
||||
```
|
||||
|
||||
全流程约 2-5 分钟,飞书群聊实时进度推送。
|
||||
|
||||
## 使用方式
|
||||
|
||||
用户给出写作命题后,执行脚本:
|
||||
|
||||
```bash
|
||||
python3 skills/novel-workshop/workflow.py "用户的原始命题" "文档标题"
|
||||
```
|
||||
|
||||
**重要**:
|
||||
- 第一个参数是用户的**原始命题原话**,不要修改、不要补充解释
|
||||
- 第二个参数是飞书文档标题(简短的标识名)
|
||||
- 脚本后台运行,自动推送进度到飞书群聊
|
||||
- 脚本完成后输出 `__SUMMARY__:` JSON,包含文档链接和评分
|
||||
|
||||
## 前置要求
|
||||
|
||||
1. **OpenRouter API Key**:在 `openclaw.json` 的 `models.providers.openrouter.apiKey` 中配置
|
||||
2. **飞书应用**:在 `openclaw.json` 的 `channels.feishu` 中配置 `appId` 和 `appSecret`
|
||||
3. **Python 依赖**:`requests`(通常已预装)
|
||||
4. **模型注册**(在 `openclaw.json` 的 `models.registered` 中添加):
|
||||
- `xiaomi/mimo-v2-flash`(写初稿)
|
||||
- `google/gemini-2.5-pro`(审阅+改稿)
|
||||
- `anthropic/claude-opus-4.6`(锐评)
|
||||
|
||||
## 环境变量(可选覆盖)
|
||||
|
||||
| 变量 | 说明 | 默认值 |
|
||||
|------|------|--------|
|
||||
| `FEISHU_CHAT_ID` | 飞书群聊 ID(进度推送目标) | 从 openclaw.json 读取 |
|
||||
| `FEISHU_FOLDER_TOKEN` | 飞书文件夹 token(文档创建位置) | 无(创建到根目录) |
|
||||
| `FEISHU_OWNER_OPEN_ID` | 文档所有者 open_id(自动授权) | 无 |
|
||||
| `OPENROUTER_API_KEY` | OpenRouter API Key | 从 openclaw.json 读取 |
|
||||
|
||||
## 输出
|
||||
|
||||
### 本地文件
|
||||
`~/.openclaw/workspace/novels/{标题}.md` — 完整 markdown(初稿+审阅+终稿)
|
||||
|
||||
### 飞书文档
|
||||
自动创建到指定文件夹,包含完整内容:
|
||||
- Part 1:初稿全文
|
||||
- Part 2:三路审阅全文(逻辑检阅 + 文学性分析 + 锐评)
|
||||
- Part 3:终稿全文
|
||||
|
||||
### 进度消息(飞书群聊)
|
||||
```
|
||||
[░░░░░] 0/5 收到命题!工作流启动中 🎲
|
||||
[█░░░░] 1/5 初稿完成 ✅《标题》(N字) 三路审阅启动中…
|
||||
[██░░░] 2/5 审阅完成 ✅ 逻辑 X/10 | 文学 X/10 | 改稿启动中…
|
||||
[███░░] 3/5 改稿完成 ✅ 保存中…
|
||||
[████░] 4/5 存档完成 ✅ 正在写入飞书文档…
|
||||
[█████] 5/5 全部完成!🎲 链接 + 评分
|
||||
```
|
||||
|
||||
## 模型角色
|
||||
|
||||
| 角色 | 默认模型 | 备选 |
|
||||
|------|----------|------|
|
||||
| 初稿写作 | xiaomi/mimo-v2-flash | google/gemini-2.5-pro |
|
||||
| 逻辑审阅 | google/gemini-2.5-pro | anthropic/claude-opus-4.6 |
|
||||
| 文学审阅 | google/gemini-2.5-pro | anthropic/claude-opus-4.6 |
|
||||
| 锐评 | anthropic/claude-opus-4.6 | google/gemini-2.5-pro |
|
||||
| 改稿 | google/gemini-2.5-pro | anthropic/claude-opus-4.6 |
|
||||
|
||||
## ⚠️ 铁律
|
||||
|
||||
1. **Prompt 原封不动**:用户怎么说的就怎么传给模型,不要添加解释或修改
|
||||
2. **飞书文档不省略任何内容**:初稿全文、审阅全文、终稿全文,一个字都不能少
|
||||
3. **改稿不用写初稿的模型**:避免"自己改自己"导致的保守倾向
|
||||
4. **全程自动**:用户只需给命题,不需要说"继续"
|
||||
6
skills/novel-workshop/_meta.json
Normal file
6
skills/novel-workshop/_meta.json
Normal file
@ -0,0 +1,6 @@
|
||||
{
|
||||
"ownerId": "kn7dmqn1jbssx9dskjmhtp7t8h827c0f",
|
||||
"slug": "novel-workshop",
|
||||
"version": "2.0.0",
|
||||
"publishedAt": 1772723756066
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user