diff --git a/01_World/初始创意.md b/01_World/初始创意.md index 322ef10..8a93d84 100644 --- a/01_World/初始创意.md +++ b/01_World/初始创意.md @@ -1,9 +1,3 @@ - - -基于您提供的片段和设定,以下是为这部小说构思的初始创意大纲: - ---- - ### **小说名称:《合金经书:西行代码》** **类型:** 赛博朋克 / 硬科幻 / 动作冒险 / 团队公路片 @@ -52,7 +46,7 @@ * **身份:** 地下界的顶级赏金猎人,沉默寡言的独行侠。 * **特征:** 全身覆盖光学迷彩,使用静力场发生器“降妖杖”,能隐身、制造无声杀戮领域。 * **性格:** 极度社恐,面瘫,只认钱和契约。说话不超过十个字。 -* **过去:** 曾是某财团的首席清洁工(暗杀者),因为一次任务失败脖颈处被植入了项圈(或某种致命诅咒),需要定期服用昂贵的药物,这让他不得不接高风险任务。 +* **过去:** 曾是某财团的首席清洁工(暗杀者),因为一次任务失败脖颈处被植入了项圈(或某种致命诅咒),需要定期服用昂贵的药物,这让她不得不接高风险任务。 --- diff --git a/02_Memory/story_monitor.py b/02_Memory/story_monitor.py new file mode 100644 index 0000000..554ae86 --- /dev/null +++ b/02_Memory/story_monitor.py @@ -0,0 +1,237 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +《合金经书:西行代码》故事监控脚本 +动态监控故事发展,辅助记忆基座更新 +""" + +import os +import time +import json +from datetime import datetime +from pathlib import Path + +class StoryMonitor: + def __init__(self, project_root="h:\\学习资料\\write\\1stnovel"): + self.project_root = Path(project_root) + self.story_dir = self.project_root / "03_story" + self.memory_dir = self.project_root / "02_memory" + self.memory_file = self.memory_dir / "记忆基座.md" + + # 监控状态记录 + self.last_modified = {} + self.update_log = [] + + def scan_story_files(self): + """扫描故事目录,返回所有章节文件""" + story_files = [] + for file_path in self.story_dir.glob("*.md"): + if file_path.name.startswith("第") and "章" in file_path.name: + story_files.append(file_path) + return sorted(story_files) + + def get_chapter_info(self, file_path): + """获取章节基本信息""" + filename = file_path.name + # 提取章节编号 + if "第1章" in filename: + return 1, "第1章_黑风号的末班车" + elif "第2章" in filename: + return 2, "第2章_逃出新长安" + elif "第3章" in filename: + return 3, "第3章_贫民窟的黑市" + # 可以继续添加更多章节识别 + return None, filename + + def check_for_updates(self): + """检查故事文件是否有更新""" + updates = [] + story_files = self.scan_story_files() + + for file_path in story_files: + current_mtime = file_path.stat().st_mtime + filename = file_path.name + + if filename not in self.last_modified or current_mtime > self.last_modified[filename]: + chapter_num, chapter_name = self.get_chapter_info(file_path) + updates.append({ + 'filename': filename, + 'chapter_num': chapter_num, + 'chapter_name': chapter_name, + 'modified_time': datetime.fromtimestamp(current_mtime), + 'file_size': file_path.stat().st_size + }) + self.last_modified[filename] = current_mtime + + return updates + + def analyze_chapter_content(self, file_path): + """分析章节内容,提取关键信息""" + try: + with open(file_path, 'r', encoding='utf-8') as f: + content = f.read() + + analysis = { + 'character_interactions': [], + 'new_items': [], + 'key_events': [], + 'location_changes': [] + } + + # 简单的关键词分析(可以进一步扩展) + lines = content.split('\n') + for line in lines: + line = line.strip() + if not line: + continue + + # 检测角色互动 + if any(name in line for name in ['石行者', '老猪', '沙静', '唐藏']): + analysis['character_interactions'].append(line[:100]) # 截取前100字符 + + # 检测新物品 + if any(keyword in line for keyword in ['获得', '找到', '发现', '装备']): + analysis['new_items'].append(line[:100]) + + # 检测关键事件 + if any(keyword in line for keyword in ['战斗', '冲突', '合作', '逃离']): + analysis['key_events'].append(line[:100]) + + # 检测地点变化 + if any(keyword in line for keyword in ['到达', '进入', '离开', '隧道', '城市']): + analysis['location_changes'].append(line[:100]) + + return analysis + + except Exception as e: + print(f"分析章节内容时出错: {e}") + return None + + def generate_update_report(self, updates): + """生成更新报告""" + if not updates: + return "没有检测到更新" + + report = f"# 故事更新报告 - {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n\n" + + for update in updates: + report += f"## 检测到更新: {update['chapter_name']}\n" + report += f"- **文件**: {update['filename']}\n" + report += f"- **修改时间**: {update['modified_time']}\n" + report += f"- **文件大小**: {update['file_size']} 字节\n" + + # 分析内容 + file_path = self.story_dir / update['filename'] + analysis = self.analyze_chapter_content(file_path) + + if analysis: + report += f"- **角色互动**: {len(analysis['character_interactions'])} 处\n" + report += f"- **新物品**: {len(analysis['new_items'])} 个\n" + report += f"- **关键事件**: {len(analysis['key_events'])} 个\n" + report += f"- **地点变化**: {len(analysis['location_changes'])} 处\n" + + report += "\n" + + return report + + def save_update_log(self, report): + """保存更新日志""" + log_file = self.memory_dir / "更新日志.md" + + # 如果日志文件不存在,创建它 + if not log_file.exists(): + with open(log_file, 'w', encoding='utf-8') as f: + f.write("# 记忆基座更新日志\n\n") + + # 追加新的报告 + with open(log_file, 'a', encoding='utf-8') as f: + f.write(report) + f.write("\n" + "="*50 + "\n\n") + + def monitor_loop(self, interval=60): + """监控循环""" + print(f"开始监控故事目录: {self.story_dir}") + print(f"监控间隔: {interval} 秒") + print("按 Ctrl+C 停止监控\n") + + try: + while True: + updates = self.check_for_updates() + + if updates: + report = self.generate_update_report(updates) + print(report) + self.save_update_log(report) + + # 提示用户需要更新记忆基座 + print("⚠️ 检测到故事更新,请及时更新记忆基座!") + print(" 运行: python update_memory.py") + else: + print(f"[{datetime.now().strftime('%H:%M:%S')}] 监控中... 未检测到更新") + + time.sleep(interval) + + except KeyboardInterrupt: + print("\n监控已停止") + except Exception as e: + print(f"监控过程中出错: {e}") + +def main(): + """主函数""" + monitor = StoryMonitor() + + # 检查目录是否存在 + if not monitor.story_dir.exists(): + print(f"错误: 故事目录不存在: {monitor.story_dir}") + return + + if not monitor.memory_dir.exists(): + print(f"错误: 记忆目录不存在: {monitor.memory_dir}") + return + + # 显示当前故事状态 + story_files = monitor.scan_story_files() + print(f"发现 {len(story_files)} 个故事章节:") + for file_path in story_files: + chapter_num, chapter_name = monitor.get_chapter_info(file_path) + mtime = datetime.fromtimestamp(file_path.stat().st_mtime) + print(f" - {chapter_name} (最后修改: {mtime})") + + print("\n选择操作:") + print("1. 启动持续监控") + print("2. 单次检查更新") + print("3. 生成当前状态报告") + + choice = input("请输入选择 (1-3): ").strip() + + if choice == "1": + interval = input("输入监控间隔(秒,默认60): ").strip() + interval = int(interval) if interval.isdigit() else 60 + monitor.monitor_loop(interval) + elif choice == "2": + updates = monitor.check_for_updates() + report = monitor.generate_update_report(updates) + print(report) + monitor.save_update_log(report) + elif choice == "3": + # 生成详细的状态报告 + story_files = monitor.scan_story_files() + print(f"\n# 当前故事状态报告") + print(f"总章节数: {len(story_files)}") + print(f"最后更新: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}") + print("\n各章节状态:") + + for file_path in story_files: + chapter_num, chapter_name = monitor.get_chapter_info(file_path) + analysis = monitor.analyze_chapter_content(file_path) + + print(f"\n## {chapter_name}") + if analysis: + print(f"- 角色互动: {len(analysis['character_interactions'])}") + print(f"- 关键事件: {len(analysis['key_events'])}") + print(f"- 物品变化: {len(analysis['new_items'])}") + else: + print("无效选择") + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/02_Outline/人设.md b/02_Outline/人设.md index 3aaf8d5..d1d4816 100644 --- a/02_Outline/人设.md +++ b/02_Outline/人设.md @@ -22,6 +22,7 @@ 3. 沙静 —— 沉默的义体奴隶 性格: 简练、服从、阴冷。 +性别:女 替换词: (基本无口头禅,建议用沉默或功能性词汇代替)。 语感: 说话不超过十个字,像说明书一样冰冷。 示例: diff --git a/02_Outline/分章节剧情大纲.md b/02_Outline/分章节剧情大纲.md index 345eefc..6b3a33a 100644 --- a/02_Outline/分章节剧情大纲.md +++ b/02_Outline/分章节剧情大纲.md @@ -44,11 +44,11 @@ **阶段三:冲突升级** - **核心冲突**:与追兵的追逐战 -- **特写焦点**:老猪在车后座疯狂扫射,沙静隐身消除痕迹,石行者在车顶用金箍棒击落无人机 +- **特写焦点**:老猪在车后座疯狂扫射导致机械臂过热,沙静隐身消除痕迹,石行者在车顶用金箍棒击落无人机 **阶段四:解决与余韵** -- **直接结果**:成功摆脱追兵,但机车受损 -- **长期影响**:四人意识到必须合作才能活下去 +- **直接结果**:成功摆脱追兵,但机车受损,老猪机械臂过热需要冷却 +- **长期影响**:四人意识到必须合作才能活下去,老猪开始意识到装备维护的重要性 --- @@ -56,7 +56,7 @@ **阶段一:铺垫引入** - **环境设定**:新长安城贫民窟,地下黑市 -- **角色状态**:四人需要修理机车,补充装备 +- **角色状态**:四人需要修理机车,补充装备,老猪机械臂需要维修 - **悬念建立**:黑市里有一个关于"真经"的情报贩子 **阶段二:冲突触发** @@ -64,11 +64,11 @@ **阶段三:冲突升级** - **核心冲突**:与黑市帮派的战斗 -- **特写焦点**:石行者第一次使用火眼金睛,扫描出所有敌人的位置 +- **特写焦点**:石行者第一次使用火眼金睛,扫描出所有敌人的位置;老猪机械臂在战斗中受损 **阶段四:解决与余韵** -- **直接结果**:获得情报,机车修好 -- **长期影响**:唐藏决定与团队分享部分信息,建立初步信任 +- **直接结果**:获得情报,机车修好,老猪在黑市找到零件初步修复机械臂 +- **长期影响**:唐藏决定与团队分享部分信息,建立初步信任;老猪开始收集备用零件 --- @@ -96,7 +96,7 @@ **阶段一:铺垫引入** - **环境设定**:废弃的补给站,酸雨停歇,星空可见 -- **角色状态**:四人疲惫不堪,需要休息 +- **角色状态**:四人疲惫不堪,需要休息,老猪机械臂在酸雨侵蚀下出现故障 - **悬念建立**:补给站里有一个神秘的黑匣子 **阶段二:冲突触发** @@ -104,11 +104,11 @@ **阶段三:冲突升级** - **核心冲突**:黑匣子里的信息引发内部矛盾 -- **特写焦点**:老猪在战斗中为石行者挡了一枪,石行者第一次感受到"被保护" +- **特写焦点**:老猪在战斗中为石行者挡了一枪导致机械臂液压系统损坏,石行者第一次感受到"被保护" **阶段四:解决与余韵** -- **直接结果**:获得关于"高老庄"的情报 -- **长期影响**:石行者开始质疑自己的身份,老猪找回了一点自信 +- **直接结果**:获得关于"高老庄"的情报,老猪在补给站找到零件修复液压系统 +- **长期影响**:石行者开始质疑自己的身份,老猪找回了一点自信,机械臂性能得到提升 --- @@ -156,7 +156,7 @@ **阶段一:铺垫引入** - **环境设定**:高老庄的地下实验室 -- **角色状态**:四人探索实验室,寻找更多线索 +- **角色状态**:四人探索实验室,寻找更多线索,老猪发现军用级机械臂零件 - **悬念建立**:实验室里有一个休眠的AI **阶段二:冲突触发** @@ -164,11 +164,11 @@ **阶段三:冲突升级** - **核心冲突**:AI告诉唐藏,镇元子想要夺取他的生物密钥 -- **特写焦点**:唐藏陷入道德困境:是继续前进,还是回头? +- **特写焦点**:唐藏陷入道德困境:是继续前进,还是回头?老猪成功升级机械臂性能 **阶段四:解决与余韵** -- **直接结果**:获得关于镇元子的情报 -- **长期影响**:唐藏决定继续前进,但开始反思自己的动机 +- **直接结果**:获得关于镇元子的情报,老猪机械臂升级为军用级性能 +- **长期影响**:唐藏决定继续前进,但开始反思自己的动机;老猪装备水平显著提升 --- @@ -197,143 +197,152 @@ --- -### 第10章:镇元子的陷阱 +### 第10章:数据森林的陷阱 **阶段一:铺垫引入** -- **环境设定**:五庄观内部,无数个服务器机柜 -- **角色状态**:四人在城寨中探索,寻找镇元子的本体 -- **悬念建立**:老猪的药物快用完了 +- **环境设定**:五庄观数据屏障前,沙地环境,数据光柱构成的森林 +- **角色状态**:四人分析数据屏障,寻找突破方法,老猪机械臂在数据干扰下出现异常 +- **悬念建立**:镇元子给出的入口是陷阱的概率高达97.3% **阶段二:冲突触发** -- **触发事件**:老猪把唯一的药物分给沙静一半 +- **触发事件**:镇元子激活数据屏障攻击,释放出会分裂的数据体 +- **关键发现**:沙静被感染的装备具有对抗数据生命体的特殊能力 **阶段三:冲突升级** -- **核心冲突**:镇元子的数据流攻击,四人分散 -- **特写焦点**:沙静第一次感受到"被信任" +- **核心冲突**:与数据体和地下数据触手的激烈战斗 +- **特写焦点**:四人配合突破数据屏障薄弱点,石行者金箍棒破盾;老猪机械臂在数据干扰下功能下降 **阶段四:解决与余韵** -- **直接结果**:四人重新汇合,但老猪的药物用完了 -- **长期影响**:沙静开始信任团队 +- **直接结果**:成功进入数据森林,但石行者受伤,老猪机械臂需要重新校准 +- **长期影响**:团队配合更加默契,进入五庄观核心区域;老猪意识到数据环境对机械装备的影响 --- ### 第11章:石行者的对决 **阶段一:铺垫引入** -- **环境设定**:五庄观的核心区域,镇元子的本体 -- **角色状态**:石行者与镇元子进行黑客对决 -- **悬念建立**:镇元子告诉石行者,他是自己的"儿子" +- **环境设定**:五庄观核心区域,纯白色数据空间,由流动代码构成的墙壁 +- **角色状态**:石行者独自面对镇元子本体(发光数据链球体) +- **悬念建立**:镇元子自称是石行者的创造者 **阶段二:冲突触发** -- **触发事件**:镇元子展示石行者的原始代码 +- **触发事件**:镇元子展示石行者的制造记录和基因序列 +- **关键发现**:石行者发现自己的所有特征都是被设计的 **阶段三:冲突升级** -- **核心冲突**:石行者的身份危机 -- **特写焦点**:石行者在代码中看到了自己的"出生记录" +- **核心冲突**:石行者与自己的代码镜像战斗,发现镜像缺乏随机性 +- **特写焦点**:石行者用超出逻辑的动作击败镜像,突破镇元子的计算 **阶段四:解决与余韵** -- **直接结果**:石行者击败镇元子,但内心受到冲击 -- **长期影响**:石行者开始质疑自己的身份 +- **直接结果**:石行者摧毁镇元子核心,但看到被删除的"母亲"记忆 +- **长期影响**:石行者陷入身份危机,开始质疑自己的本质 --- -### 第12章:逃离五庄观 +### 第12章:身份的回响 **阶段一:铺垫引入** -- **环境设定**:五庄观的出口,数据流瀑布 -- **角色状态**:四人准备逃离城寨 -- **悬念建立**:镇元子虽然被击败,但他的"儿子"红孩儿还在 +- **环境设定**:五庄观核心区域崩溃中,数据流倾泻,代码碎片消散 +- **角色状态**:石行者陷入身份危机,团队前来救援 +- **悬念建立**:石行者向团队透露自己的身份真相 **阶段二:冲突触发** -- **触发事件**:红孩儿出现,他是一个被病毒感染的改造人 +- **触发事件**:石行者质问团队,自己是否只是被制造的工具 +- **关键对话**:团队成员用实际行为证明石行者的自主性 **阶段三:冲突升级** -- **核心冲突**:与红孩儿的战斗 -- **特写焦点**:老猪发现红孩儿是镇元子的"儿子",心生怜悯 +- **核心冲突**:石行者内心的自我认同危机与团队信任考验 +- **特写焦点**:石行者发现纳米机器人自动修复功能,与"母亲"相关 **阶段四:解决与余韵** -- **直接结果**:击败红孩儿,但老猪没有杀他 -- **长期影响**:老猪开始反思自己的过去 +- **直接结果**:石行者选择保护团队,明确自己的身份定位 +- **长期影响**:团队凝聚力增强,石行者完成自我认同的转变 --- ### 第13章:火焰山的边缘 **阶段一:铺垫引入** -- **环境设定**:火焰山的边缘,核辐射污染区 -- **角色状态**:四人到达火焰山,准备穿越 -- **悬念建立**:火焰山里有一个被病毒感染的改造人(代号"红孩儿") +- **环境设定**:火焰山边缘,赤红色岩石,核辐射污染,硫磺臭氧气味 +- **角色状态**:四人到达火焰山,辐射强度超过安全阈值,老猪机械臂散热系统超载 +- **悬念建立**:检测到移动热源信号,未知威胁正在靠近 **阶段二:冲突触发** -- **触发事件**:红孩儿出现,他控制着一群火焰机器人 +- **触发事件**:火焰机器人从地下钻出攻击,随后红孩儿出现 +- **关键发现**:红孩儿是高度病毒感染的改造人,能量波动异常 **阶段三:冲突升级** -- **核心冲突**:与红孩儿的战斗 -- **特写焦点**:老猪在战斗中救了红孩儿,完成了对小队的救赎 +- **核心冲突**:与火焰机器人和红孩儿的激烈战斗 +- **特写焦点**:老猪发现红孩儿保护左胸的细微动作,意识到病毒控制器下的记忆;机械臂液压系统在高温下受损 **阶段四:解决与余韵** -- **直接结果**:红孩儿加入团队,成为向导 -- **长期影响**:老猪完成了对小队的救赎,找回了自信 +- **直接结果**:老猪用电磁脉冲器抑制病毒,红孩儿恢复理智加入团队,老猪机械臂液压系统需要紧急维修 +- **长期影响**:老猪展现情感洞察力,团队增加新成员,获得火焰山向导;装备在极端环境下承受极限考验 --- -### 第14章:穿越火焰山 +### 第14章:熔岩通道的考验 **阶段一:铺垫引入** -- **环境设定**:火焰山内部,到处都是火焰和岩浆 -- **角色状态**:四人在红孩儿的带领下穿越火焰山 -- **悬念建立**:火焰山的深处有一个秘密实验室 +- **环境设定**:火焰山内部狭窄熔岩通道,高温扭曲空气,岩浆滴落 +- **角色状态**:五人团队(新增红孩儿)穿越危险通道,装备承受极限,老猪机械臂液压系统已损坏 +- **悬念建立**:检测到强烈能量干扰,前方是火焰山心脏地带 **阶段二:冲突触发** -- **触发事件**:发现实验室,里面有关于病毒的真相 +- **触发事件**:遭遇熔岩守卫——火焰山自动防御系统 +- **关键发现**:熔岩守卫对热武器免疫,再生能力极强 **阶段三:冲突升级** -- **核心冲突**:唐藏发现病毒的原始代码 -- **特写焦点**:病毒确实是天庭故意释放的,目的是清理"低价值意识" +- **核心冲突**:与熔岩守卫的生死战斗,老猪机械臂在高温下彻底熔化报废 +- **特写焦点**:团队配合攻击核心,老猪为保护石行者用机械臂抵挡岩浆导致彻底损毁 **阶段四:解决与余韵** -- **直接结果**:获得病毒的真相 -- **长期影响**:唐藏愤怒达到顶点,决定一定要揭露天庭的罪行 +- **直接结果**:击败熔岩守卫,找到安全洞穴,老猪机械臂完全报废需要重新安装 +- **长期影响**:团队凝聚力达到新高度,老猪展现牺牲精神,红孩儿融入团队;装备损坏为后续维修埋下伏笔 --- -### 第15章:流沙河的秘密 +### 第15章:流沙河底的抉择 **阶段一:铺垫引入** -- **环境设定**:流沙河,一个巨大的地下河系统 -- **角色状态**:四人到达流沙河,准备渡河 -- **悬念建立**:流沙河底有一个秘密实验室 +- **环境设定**:流沙河边缘,黄昏时分,沙漠热浪与河面湿气交织,形成诡异的雾气。流沙河表面看似平静,实则暗流汹涌,偶尔有气泡冒出,发出咕嘟声 +- **角色状态**:五人团队疲惫不堪,老猪的机械臂完全报废,右臂无力垂落;沙静的项圈发出微弱红光,显示解药即将失效;红孩儿因过度使用火焰能力而面色苍白 +- **悬念建立**:红孩儿指向流沙河中心"实验室就在河底,但入口被流沙覆盖,需要特殊方法才能进入" **阶段二:冲突触发** -- **触发事件**:沙静的项圈开始失效,他必须尽快找到解药 +- **触发事件**:沙静的项圈突然发出刺耳警报,红光闪烁频率加快,显示解药将在2小时内失效。同时,老猪的机械臂接口处开始漏电,发出滋滋声 **阶段三:冲突升级** -- **核心冲突**:沙静面临生死抉择:是继续跟随团队,还是独自寻找解药 -- **特写焦点**:沙静选择继续跟随团队,而不是独自寻找解药 +- **核心冲突**:团队面临三重危机:沙静的生死时限、老猪的战斗力丧失、以及进入实验室的技术难题 +- **特写焦点**: + - 红孩儿集中最后的力量,双手燃起蓝色火焰,在流沙河面烧出一个临时通道 + - 石行者用金箍棒撑开通道入口,金属棒身因高温而发红变形 + - 沙静在通道关闭前犹豫片刻,最终选择跟随团队潜入河底 + - 老猪用仅存的左手抓住通道边缘,机械臂接口处电火花四溅 **阶段四:解决与余韵** -- **直接结果**:在流沙河底发现实验室,里面有解药 -- **长期影响**:沙静开始信任团队 +- **直接结果**:团队成功进入河底实验室,找到解药制造设备和机械臂制造蓝图。红孩儿因能量耗尽,决定返回火焰山守护家园 +- **长期影响**:沙静对团队的信任度大幅提升;老猪获得制造新机械臂的技术;团队意识到天庭的监控系统可能已经发现他们的位置 --- ### 第16章:流沙河底的真相 **阶段一:铺垫引入** -- **环境设定**:流沙河底的秘密实验室 -- **角色状态**:四人在实验室里探索,寻找更多线索 -- **悬念建立**:实验室里有一份关于"真经"的加密文件 +- **环境设定**:流沙河底的秘密实验室,红孩儿已离开,团队恢复四人状态 +- **角色状态**:四人在实验室深入探索,老猪正在制造新机械臂,沙静已使用解药 +- **悬念建立**:实验室里有一份关于"真经"的加密文件,同时发现实验室的创建者身份 **阶段二:冲突触发** -- **触发事件**:唐藏成功解密文件,发现真经确实是格式化命令 +- **触发事件**:唐藏成功解密文件,发现真经确实是格式化命令,同时揭示实验室创建者与天庭的关系 **阶段三:冲突升级** -- **核心冲突**:唐藏陷入道德困境:是执行格式化,还是寻找其他方法? -- **特写焦点**:唐藏决定暂时不告诉团队真相 +- **核心冲突**:唐藏陷入道德困境:是否应该告诉团队真相,还是独自承担这个秘密? +- **特写焦点**:唐藏发现实验室的监控系统仍在运行,天庭可能已经知道他们的位置 **阶段四:解决与余韵** -- **直接结果**:获得关于真经的真相 -- **长期影响**:唐藏陷入道德困境,开始反思自己的动机 +- **直接结果**:获得真经真相,老猪完成新机械臂制造,团队意识到危险逼近 +- **长期影响**:唐藏选择暂时隐瞒真相,团队准备离开实验室,面临新的追捕威胁 --- diff --git a/03_Story/merge_md_to_pdf.py b/03_Story/merge_md_to_pdf.py new file mode 100644 index 0000000..a445175 --- /dev/null +++ b/03_Story/merge_md_to_pdf.py @@ -0,0 +1,87 @@ +""" +将当前目录下的所有md文件合并成一个pdf文件 +""" + +import os +import markdown +from weasyprint import HTML, CSS + +# 获取当前目录 +current_dir = os.path.dirname(os.path.abspath(__file__)) + +# 获取所有md文件并按文件名排序 +md_files = sorted([f for f in os.listdir(current_dir) if f.endswith('.md')]) + +print(f"找到 {len(md_files)} 个md文件:") +for f in md_files: + print(f" - {f}") + +# 合并所有md文件内容 +combined_html = """ + + + + 小说合集 + + + +""" + +for md_file in md_files: + file_path = os.path.join(current_dir, md_file) + + # 读取md文件 + with open(file_path, 'r', encoding='utf-8') as f: + content = f.read() + + # 转换为html + md = markdown.Markdown(extensions=['tables', 'fenced_code']) + html_content = md.convert(content) + + # 添加章节标题 + chapter_title = md_file.replace('.md', '') + combined_html += f'

{chapter_title}

\n' + combined_html += html_content + '\n' + +combined_html += '' + +# 输出pdf文件 +output_pdf = os.path.join(current_dir, '小说合集.pdf') +HTML(string=combined_html).write_pdf(output_pdf) + +print(f"\nPDF已生成: {output_pdf}") diff --git a/03_Story/西行代码(第一稿).pdf b/03_Story/西行代码(第一稿).pdf new file mode 100644 index 0000000..8507b49 Binary files /dev/null and b/03_Story/西行代码(第一稿).pdf differ diff --git a/03_Story/(新的DeepSeek)小说-西行代码.pdf b/03_Story/(新的DeepSeek)小说-西行代码.pdf new file mode 100644 index 0000000..3fb447f Binary files /dev/null and b/03_Story/(新的DeepSeek)小说-西行代码.pdf differ diff --git a/03_Story/(老的DeepSeek)小说-西行代码.pdf b/03_Story/(老的DeepSeek)小说-西行代码.pdf new file mode 100644 index 0000000..7fe878d Binary files /dev/null and b/03_Story/(老的DeepSeek)小说-西行代码.pdf differ