十分钟写完第一个故事

新建项目 → 写几行正文 → 预览 → 加一个选项 → 记住读者做过什么 → 导出成网页,把整条链路走通一次。

这一篇把从空白到「读者能读到」的全过程走一遍。每一步都短,十分钟够用。不需要先读语法——需要的语法在用到的时候讲。

新建项目

打开编辑器,点启动页上的新建项目(也可以按 Ctrl+N),填一个作品名、选一个存放位置。编辑器会建一个同名文件夹,里面有三样东西:

文件 是什么
<作品名>.kiw 作品清单:名字、版本、故事从哪个文件开始
main.kin 故事正文。你主要在这里写
theme.css 作品外观:底色、字体、字号、栏宽

左边是资源管理器,中间是编辑区,右边是实时预览——你改一个字,右边立刻跟着变。

写几行正文

打开 main.kin,把里面的内容换成:

=== 序章 ===
末班蒸汽船把你卸在雾港的栈桥上。
海雾很厚,只看得见十步之内。
栈桥尽头,锈锚酒馆的窗子透出一点橘色的光。
-> END

三条规则,就这些:

  • === 序章 === 开了一个节点,名字随你起。故事从入口文件的开头开始跑;这里第一行就是节点,所以从它开始(第一个节点之前还能写东西,见下面「让故事记住」那一节)。
  • 中间每一行普通文字,就是读者会读到的一句正文。一行就是一段,不用写任何标记。
  • -> END 表示故事到此结束。END 是保留的目标,不需要你自己建这个节点。

点上面的「运行」看看效果——右边的预览区里,正文就是这样一行行流出来的。

加一个选项

只有正文的故事不叫互动小说。加两个选项:

=== 栈桥 ===
海雾很厚,栈桥尽头透出一点橘色的光。
* [推门进酒馆] -> 酒馆
* [先在码头上站一会儿] -> 码头

=== 酒馆 ===
门轴发出被海水泡胀的呻吟。屋里烟气很重。
-> END

=== 码头 ===
你听见远处有铁链拖过石板的声音,然后是长久的安静。
-> 栈桥

新出现的东西:

  • * 开头的行是一个选项。方括号里的字是给读者点的按钮文字。
  • -> 酒馆跳转:读者选了这条,故事就跳到 === 酒馆 === 那个节点继续。
  • 「码头」那条最后 -> 栈桥,会跳回去——读者又能再选一次。

试着运行它,先点「先在码头上站一会儿」:回到栈桥后,那一条不见了,只剩「推门进酒馆」。

因为 *一次性选项,选过就消失。想让它每次都在,把 * 换成 +(粘性选项)。

让故事记住

粘性选项会一直在,但读者未必希望它一直在——去过一次码头之后,也许就该换个说法,或者干脆让它消失。这需要故事记住读者做过什么:

~ let seen_dock = false
-> 栈桥

=== 栈桥 ===
海雾很厚,栈桥尽头透出一点橘色的光。
* [推门进酒馆] -> 酒馆
+ {!seen_dock} [先在码头上站一会儿] -> 码头

=== 码头 ===
~ seen_dock = true
你听见远处有铁链拖过石板的声音,然后是长久的安静。
-> 栈桥

=== 酒馆 ===
{seen_dock ? "你带着码头上那阵铁链声推开了门。" : "门轴发出被海水泡胀的呻吟。"}
-> END

四处新写法:

  • ~ let seen_dock = false —— ~ 开头的行是一条逻辑语句,读者看不到它。这里声明了一个变量。
  • + {!seen_dock} —— +粘性选项(选了也不消失),{...} 是挂在它前面的条件:只有条件成立时才出现。去过码头后 seen_dock 变成 true,这条就没了。
  • ~ seen_dock = true 写在「码头」节点里,读者走到那儿时才执行。
  • 正文里的 {...}插值:把大括号里的表达式求值,结果印进正文。这里用一个三元表达式按条件挑一句。

运行上面这段:先去码头再进酒馆,你会读到不一样的那一句。

别漏了第二行的 -> 栈桥 入口文件里、第一个 === 节点 === 之前的内容叫开场,故事就从这里开始播放。开场执行到底如果没有跳转,故事当场就结束了——一个只放了变量声明、忘了跳出去的开场,运行起来是一片空白加「故事结束」。

节点名可以用中文,变量名必须用 ASCII(字母、数字、下划线)。这条界线是有意的:一眼就能分出哪些是叙事内容、哪些是程序逻辑。

变量、条件、插值都是 JavaScript。~ let x = 1{x > 0}{x + 1} 全都按 JS 求值——不需要另学一套表达式语法。

在预览里走查

右边的预览区就是读者所见。写长了之后有两个开关很有用:

  • 快进:打开后正文瞬间显示、停顿一律不等,点完一个选项直接到下一个决定点。调试分支时快很多。
  • 返回上一步:撤销刚才那次选择,回到上一个决定点重选,不用从头再来。

编辑器底部会实时报语法与语义问题(跳转指向不存在的节点、变量名拼错等)。有错误时导出会被禁用——这是有意的,免得把跑不起来的作品发出去。

导出成网页

故事能跑之后,菜单 文件 → 导出独立网页…,选一个存放位置。

你会得到一个文件夹,里面是一个自包含的网页:把整个文件夹传到任意静态空间(对象存储、GitHub Pages、自己的服务器都行),读者打开就能读。不需要后端,也不需要读者装任何东西。

想给读者一个能离线读的版本,就用 文件 → 导出故事包(.kip)…,把生成的 .kip 发给他们,用 Kiny 阅读器或网页书库打开。

接下来

到这里你已经把整条链路走完了。往下按顺序读就行:

  • 项目结构——.kiw 清单里有什么、多个 .kin 文件怎么组织、图片音频放哪
  • 正文写作——分段、缩进、标点、加粗变色、句中停顿
  • 节点与跳转——子节点、带参数的节点、动态跳转

也可以先照着自己的想法写下去,卡住了再回来查。