前言

本文是一个非常草台和简略的Ink互动文游制作讲解,作者也并不是很懂Ink。

Ink是一种Inkle Studio开发的编程语言,它是专门用来写互动故事的。

对于想要深入了解Ink的读者,且有一定英语水平,或不介意使用翻译工具的:

这里还是推荐去读官方的入门教程:Writing web-based interactive fiction with ink

还有官方的用户手册:ink/Documentation/WritingWithInk.md at master · inkle/ink

这显然会比我这种半吊子写的东西好得多。

Ink的语法十分简单,但其实也有很多高级特性。本文不深入探究,只是简单讲解一下环境部署,开发过程,基本语法,项目导出,部署上线的这个过程,也算是记一次经历。

部署方式:GitHub Pages。

这是一篇面向小白的教程,如果是有一定技术背景的用户,那么你基本可以完全忽略这篇教程的全部内容,你只要上手摸索几分钟就全懂了。


示例

一开始就是看到了这个StarInitial的「深渊凝视着你」- XPCheck。

仓库地址在这里:StarInitial/xpcheck

测试地址在这里,部署方式GitHub Pages,可以游玩:深渊凝视着你

就觉得挺有意思,于是学着做了一个。由于作者蓝枫是一个M男,做了一个「受虐癖测试」- MasoCheck。

仓库地址在这里:BlueMap1e/MasoCheck

测试地址在这里,部署方式GitHub Pages,可以游玩:「受虐癖测试」- MasoCheck

这两个示例大致展现了Ink制作互动文游的特点。当然,Ink这个语言潜力很大,可以做出比这好得多的东西,至少是比蓝枫做的好得多。


环境搭建

这其实很难说是什么……环境搭建之类的东西。就,很容易,下载安装几个工具就可以了。


Inky

Inky是Ink的主要开发工具,它可以提供即时的测试。

可以直接在Ink的官网下载:ink - inkle’s narrative scripting language

选择自己对应的操作系统,下载解压即可,它是绿色的。


Git

建议是安装一个Git,方便部署。

在Git的官网就可以下载:Git

注册个GitHub账号,如果没有的话。


VSCode

建议通过VSCode来编写Ink的代码,因为Ink本身的这个编辑器……在我看来……有点,反人类(

在VSCode的官网下载:code.visualstudio.com

然后装个插件:Ink。装好了就有代码高亮。

VSCode写起来比Ink编辑器要舒服得多,要测试的话直接复制粘贴到Inky里面,再保存一下就可以了。

当然如果不介意Ink这个代码编辑器的话,也可以直接在上面写(


UI简介

不打算详细介绍UI,稍微讲一下。

这就是Inky的UI。左边可以编写代码,Ctrl+S保存以后右边的界面同步更新,右边可以直接体验和测试自己写出来的东西。

右上角的回退按钮,左边这个单箭头是回退1步,右边这个双箭头是直接回退到起点。

Files可以新建、打开、导出。

基本就这样。


语法

Ink的语法并不复杂,这里只介绍一些最基本的部分。


文本(Text)

非常基本的元素,直接打字。

1
你是一个冒险者,你进入了一片魔法森林。

没有什么好说的,文本会直接显示在故事中。


结点(Knots)

结点是Ink的核心概念之一,一个Ink故事基本就是由结点组成的。

结点分为三个层次——结点(Knots)针脚(Stitch)标签(Label)


结点(Knots)

在Ink中,结点以===表示:

1
=== Knot1 ===

它是组织故事结构的基本单元,也可以理解为跳转点。


针脚(Stitch)

在Ink中,针脚以==表示:

1
== Stitch1 ==

它是结点内部的细分,可以用于细化故事的内容,分清层级结构。但其实,在结点显示器上,它是和结点平行的。

这就很怪,没错,这好像是一个遗留问题还是什么的……?

总之,在自己写代码的时候,最好就是和自己的风格保持一致。当然随随便便混淆也是可以的,影响不大。


标签(Label)

在Ink中,标签以=表示,标签名后面没有=

1
= Label

标签是结点或针脚内部的细分,这确实是能够划出层级结构来的。它也可以用来跳转,问题不大。


可以在菜单中单击Toggle knot browser,左侧会显示故事的层级结构。

类似于这样:


转移(Divert)

转移(Divert)可以理解为针对结点的goto,我认为,学过一点程序设计的应该能够很快理解。

总之它的功能就是,故事跳转到对应名称的结点/针脚/标签处。

1
2
3
4
5
6
	故事开始
-> forest

=== forest ===
你是一名冒险者,你进入了一片森林
-> END

例子已经很明显,不多赘述。


选择(Choice)

选择(Choice)会暂停故事的推进,并让玩家进行选择交互。它通常以+表示,也可以用*表示。这其实有一些不同,但我的建议是,全部用+

如果说为了避免出现重复什么的,才用*,一个一次性选择。


普通选择

先讲一下普通的选择吧,这是一个示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
	故事开始
-> forest

=== forest ===
你是一名冒险者,你进入了一片森林。
你来到了一个岔路口,左边是一条碎石路,似乎通向一个村庄。
右边是一条林间小路,通向森林深处。

+ [向左走,尝试靠近村庄] -> villageEnd
+ [向右走,尝试深入森林] -> succubusEnd

=== villageEnd ===
你成功进入了村庄,村民欢迎了你,你安全了。
你住进了村民的家里,结果你半夜醒来,发现自己被人家家里的少女夜袭了,于是你果断地缴械投降了。
-> END

=== succubusEnd ===
你决定深入森林,结果遇到了一只魅魔。
她的等级比你低,你明明能打过,但是你因为自己的败北癖和色欲输掉了,于是你被魅魔榨得一滴不剩了。
-> END

才不是因为是黄文写手才写出这样的一个示例呢。


一次性选择

讲讲一次性选择

前言

本文主要介绍一些入门程度的隐私保护技巧。作者也是门外汉,无法提供专业的建议。本文在内行看来应该是绝对纯属胡扯

这可能会稍微提高一点点防人肉能力,但不多,也许能防一些小白。但也就顶多只会稍微增加调查的成本而已。对于体系化的社工库团队而言,拿下普通人这种事基本上是轻而易举的,你通常防了也没用。

Read more »

简介

本文是一篇完全面向技术小白的新手教程。

作为技术用户,阅读这篇文章可能导致你血压升高。请谨慎阅读

Read more »

引言

在介绍了注册、基本UI和基本行为机制后,其实已经可以制作一个简单的文游。

或者说,有些读者就很不喜欢看那些系统性介绍的长篇大论,就喜欢这种直接上手的实战教程——你™黄油呢?那么,它来了。

Read more »

引言

行为(Actions)是Milovana Webtease的核心机制,它构成了一个互动文游的框架和主体。

本文主要介绍一些基础的行为,以及它们的用法案例。阅读本文后,你应该能够制作一个简单的Webtease互动文游。

Read more »