Windows 桌面端 AI 视觉小说引擎,单文件 C++,零第三方依赖(只用 Windows SDK + GDI+ + XAudio2)。
接一个 OpenAI 兼容接口,她自己挑立绘、背景和配乐,决定这一轮演什么、什么时候收尾。
| 层 | 做什么 |
|---|---|
| 界面 | GDI+ 全自绘:背景 / 立绘 / 对话框 / 打字机 / 选项 / 子界面 |
| 对话 | WinHTTP 调模型,回包是台词 + 演出指令(JSON 契约) |
| 演出 | 导演状态机:场景、立绘、BGM 都由模型挑,含「本幕何时收尾」 |
| 内容 | 课程大纲(章 + 验收题)与剧情大纲(幕)两种模式 |
| 存档 | 本地 JSON,按角色分目录,另写一份人能直接读的副本 |
| 素材 | 角色包放 assets/char/<id>/,注解与资源扫目录得到,不写死名单 |
| 音频 | XAudio2 播 WAV,BGM / 音效随场景与情绪切换 |
用 Visual Studio 打开 YourReality.sln,cl /utf-8 编译 main.cpp 即可(/utf-8 不能省:源码 UTF-8 带 BOM,缺了中文注释会出 C4819,甚至把下一行吞掉)。
没有第三方库要拉,没有自定义头文件——整个工程就一个 .cpp。
- 角色包。仓库里没有角色包和素材(版权与体积原因,
.gitignore已排除),参考assets/char/下的结构自己放一份:assets/char/<id>/ char.ini # 元信息 + [Prompt] 人设 + [Memory] 前世记忆 + 素材注解 sprite/ # 立绘 bg/ # 背景(可选) bgm/ # 音乐(可选)char.ini用行首空格续行,[Prompt]一段就能把人设写全,不用再维护单独的 txt。 - 模型接口。在设置里填一个 OpenAI 兼容的 base_url + key。没网络时界面照常画,只是她不开口。
顺序建议:main.cpp 从上往下就是分层顺序。文件头有两行约定先看:
- ★ 注释 = 这里曾经出过 bug,写的是「为什么不能那样做」。这类地方的失败模式通常不报错,只表现为「看起来正常、实际不生效」。
- 推进按钮(课程「明天见」/ 剧情「下一幕」)的规则只在
advance命名空间:渲染、命中、点击、状态栏、回放统一走advance::Evaluate()。改阈值只动那一处的constexpr。
想改「聊几句能走」「台词能不能点亮按钮」,改完跑一下契约自检:
g++ -std=c++17 -DADVANCE_SELF_TEST=1 main.cpp -o advtest && ./advtest
# advance self-test: 42 passed, 0 failed这条命令在 Linux / macOS 上只能跑
advance那段逻辑(它没碰 Windows 头); 全量编译请用 MSVC。目前自检覆盖:阶段矩阵、告别词表、按钮文案、存档回放、 「画出来 = 能点」(含打字中不拦、Lesson 里一句「晚安」不能跳过考试)。
为什么没有好感度。 情感推进交给大纲的章 / 幕和角色包的 [Memory],引擎不做 0–100 打分——数值分档会把"她对你的态度"锁死成几档,换角色包就得重配。想做数值养成,自己在剧本里写 $好感 += 5,那是剧本的设计,不是引擎强加的。
为什么不写死素材名单。 背景、立绘、音乐全部扫目录,模型只在真实存在的东西里挑。作者改文件名不用动代码,加图就是加文件。
为什么单文件。 早期维护过 src/ 分模块版,靠脚本单向同步,两边时间戳一前一后就分叉:改在这边、跑一次同步就被那边旧内容盖回去。所以现在只有 main.cpp,分区标记 // 模块:xxx 只是阅读用,不是文件名。
MIT,见 LICENSE。