跳转到内容

让预制配图进入当前场景

一次生成可以选中一张创作者预制图,铺到这一轮的所有旁白 block;对话继续使用角色舞台。读者手动触发 Imagine 后,生成图也直接进入当前页面,阅读和选择入口继续可用。

本教程从第 6 课的完整温室 Pack出发。先复用已有图片跑通规则,再替换成自己的横竖版作品。协议仍是 0.5,不需要迁移旧 Pack;但校验器、服务端和阅读器必须支持新增字段。本文核对的 Schema 快照 的 SHA-256 是 18756b09a11f4f234d1e2fcd5237a93be0b4bad8f9afae7d2a99243d7d9cd959。

下载并解压第 6 课,编辑 finished/pack.json。把下面这个对象追加到已有 illustrations 数组,保留原来的开场插图。它引用课程已经附带的 greenhouse_art,所以这一步无需新增文件。

{
"id": "greenhouse_after_care",
"asset_id": "greenhouse_art",
"variant_asset_ids": [],
"alt": "夕阳下,绿色窗框内的长凳上放着一株幼苗。",
"actor_ids": [],
"entry_ids": ["arrival"]
}

asset_id 是素材目录里的 ID;alt 如实描述画面。这里是无人场景,所以 actor_ids 为空。若换成画有 Rowan 的配图,把真实出现的角色卡 ID rowan 加入 actor_ids;有多个角色就全部列出。不要为了更早显示图片而省略人物。

素材必须是已声明的普通静态图片:access: "standard",且不能是 reference_only。PNG、JPEG、WebP 可用于配图;APNG 属于角色表演,不能放在这里。实际文件的 SHA-256、字节数、MIME 和上传附件必须与声明一致。

2. 先判断资格,再判断这一轮是否适合

Section titled “2. 先判断资格,再判断这一轮是否适合”

保留已有 presentation.protocol 和 presentation.bindings,在 presentation.illustration_rules 数组中加入这条规则:

{
"id": "after_shared_care",
"illustration_id": "greenhouse_after_care",
"when": {
"op": "all",
"conditions": [
{ "op": "gte", "path": "/trust", "value": 2 },
{ "op": "eq", "path": "/left", "value": false }
]
},
"match": "整轮旁白始终发生在黄昏的温室里,幼苗长凳适合作为场景全景;没有转到其他地点或时间。",
"priority": 10
}

上面两段都是局部对象,不能代替完整 Pack。将 manifest.revision 从课程的 7 增加到 8;自己的作品使用更大的新修订号。保留其他故事、状态、开场和成长系统字段。

when 使用与成就相同的状态条件语法。这个示例要求共同照料达到 2,且读者尚未离开。它只决定规则能否成为候选,不代表画面一定符合当前故事。这里不能使用 observed;如果某个行动影响资格,先让现有运行时规则把行动记录到状态。

match 描述图片适合的当前场景。服务把合资格规则放进一次 JEV 语义判断,检查完整的一轮生成;不会为每个 block 分别调用。适合的描述应涵盖地点、时间、人物和关键行动,且能覆盖整轮旁白。仅提到温室、回忆温室、打算前往温室,或者叙述中途离开,都不足以命中这张图。匹配规则也不会命令叙述者把故事改成图里的内容。

显示资格不等于素材保密。 when 只管这条配图规则,图片本身仍受素材 reveal_when、入口和所画角色的披露条件约束。若图片含未揭露内容,应使用独立素材并正确设置这些条件;不要把它同时用作公开封面。同文件别名也受已声明的所画角色条件约束。每个素材 ID 和变体都需要正确配置 reveal_when;不要把私密文件换个 ID 同时登记为始终可见的公开素材。

候选资格读取这一轮开始前的状态和披露范围。同一轮刚解锁的角色或素材,最早在下一轮成为候选。温室课程可以这样试玩:

轮次 开始时 /trust 本轮发生的事 预期
第一轮 0 完成一次照料 状态升到 1;这条规则不参与匹配
第二轮 1 再完成一次照料 状态升到 2,成就可结算;这条配图规则仍不参与
第三轮 2 继续留在黄昏温室 规则有资格;语义也匹配时展示配图
后续一轮 2 叙述从温室转到回家路上 单张图无法覆盖整轮,保留普通舞台

配图不会创建成就、永久解锁或额外状态。开场也不会自动运行这条续写规则;固定开场插图继续使用 opening_illustrations 的准确段落位置,开场舞台继续使用 opening_stages。

先把真实横竖版文件分别加入 assets,再把主图 ID 放在 asset_id,另一张放进 variant_asset_ids。两张必须是同一场景、同一组人物、同一件事的不同构图。白天与夜晚、告白前与告白后,应该使用不同的 illustration 和匹配规则。

variant_asset_ids 最多 8 个,不含主图;ID 不能重复。一个候选的主图和全部变体都要满足披露条件,因此不能把未解锁人物藏在横版里。阅读器根据图片实际尺寸和当前视口选择构图,没有 ios_asset_id 或 web_asset_id 字段。

为手机准备接近竖屏的画面,为桌面准备横构图。Web 保留完整构图,并用模糊延展填补比例差;iOS 对比例相近的图可能裁剪以填满视口,比例差较大时使用模糊延展。让人脸和关键细节远离边缘,竖版素材能减少手机上的构图差异。旋转屏幕只会选择适合的已有配图变体,不会生成新图。

5. 图片多时,怎样保持匹配清楚

Section titled “5. 图片多时,怎样保持匹配清楚”

先用 entry_ids 和已有状态条件缩小候选范围,再写简洁、可区分的 match。例如分别按当前章节、地点和关系阶段组织,而不是把所有图片都设成始终可用。entry_ids 属于 illustration;状态条件写在 rule 的 when 中。

多个规则命中时,取最高 priority,范围为 -1000 到 1000,默认 0。最高优先级若仍对应不同 illustration,系统放弃选图;数组顺序不会打破平局。若最高优先级的规则都指向同一个 illustration,则可以选择该图。优先级负责命中后的选择,不能减少送去匹配的候选数量。

当前每个 Pack 最多 128 条规则、128 个 illustration 和 128 个素材;变体也占素材额度。一次配图判断只有一次 provider 尝试、6 秒预算,候选问题与整轮文本合计最多 60,000 字节。没有合资格候选或没有旁白时不发起判断;超限、超时、失败或有歧义时,故事继续,使用普通舞台。系统不会自动把大目录拆成多批请求。

读者可以在整轮仍流式生成时开始阅读。配图在整轮成功接纳后确定:若还停留在这一轮的旁白,图片直接进入当前舞台;已经读过去,则回看该 block 时显示。图片到达不会移动阅读位置。

选中的图覆盖本轮所有旁白,包括结束语;对话保留角色舞台。进入或回到相应页面时,画面淡入并逐渐放大到舞台全屏,文字和阅读控制保留;普通刷新不会重新播放,打开覆盖界面时动画暂停。“减少动态效果”开启时静态显示。缺失图片不会阻断阅读。

Imagine 仍由读者主动触发。完成后直接使用相同的场景表面,无需再点一次查看;该页面的 Imagine 图优先于预制图,但不会覆盖同轮其他页面。iOS 根据实际竖屏视口请求合适的竖版尺寸,Web 也根据自身视口选择。output_size 是 Imagine 请求字段,不要放进 Creator Pack。回看或旋转继续复用已生成图片,不会再次购买。

在解压目录运行 .venv/bin/python check.py finished/pack.json;Windows 使用 .venv\Scripts\python.exe check.py finished/pack.json。尚未安装校验依赖时,先按第 6 课下载内的 README 完成安装。确认使用的是本文快照或支持相同字段的更新快照;旧版 0.5 Schema 可能拒绝新增字段。

本站测试把本文两个 JSON 对象合并进中英文第 6 课完成稿,验证 Schema、引用和上述状态资格边界。它们没有发起真实 JEV 或 Imagine,也不代表你的画作已通过服务端试玩。使用兼容主机创建一个新修订的私有旅程后,检查:

  1. 连续照料两次,再留在温室续写;确认“具备资格”和“语义命中”是两个步骤。
  2. 混合旁白和对话,确认预制图只覆盖旁白;换地点、只回忆或提及温室时不应误配。
  3. 图片晚到时阅读位置不变;离开再回到该页面,图片复用且入场效果重播。
  4. iOS 竖屏、横屏及 Web 都能继续阅读;主动 Imagine 完成后直接显示,旋转与回看没有新生成。

排查不出图时,依次核对确切 Schema、入口、轮前状态、所有变体和所画角色的披露、整轮是否换景,以及优先级平局。记录实际试玩结果与客户端版本,再按第 9 课发布修订。规则修改不会追溯重新匹配已接纳的旧段落;旧旅程保留它开始时的 Pack 修订。

返回第 6 课 · 全部 0.5 字段