第三站:赋予世界记忆
在上一站,我们的故事已经有了分支,玩家可以自由选择探索的方向。但一个真正引人入胜的世界,应该能记住玩家的行为。比如,玩家在桌上发现了一把钥匙,那么这个“拥有钥匙”的状态就应该被世界记住。
这就是 变量 (Variables) 的魔力。变量就像是故事世界的“记忆口袋”,我们可以用它来存放各种信息:玩家是否拥有某件物品、角色的好感度、时间的流逝等等。
开辟“记忆空间”:variables
首先,我们需要在 common/data.json 的顶层,开辟一个专门存放所有变量的地方。这个地方就叫做 "variables"。
让我们在 metadata 的下方,添加一个新的 "variables" 区域,并定义我们的第一个变量:hasKey。我们将它的初始值设为 false,因为玩家一开始并没有钥匙。
{
"metadata": {
"indexNode": "start"
},
"variables": {
"player": {
"hasKey": false
}
},
"nodes": {
// ... 我们之前的节点内容 ...
}
}小提示: 将所有与玩家相关的变量,都放在一个叫
"player"的对象里,是一种很好的整理习惯。这样,当变量多起来时,我们的“记忆口袋”就不会显得杂乱无章。
让记忆“说话”:在文本中显示变量
光能记住还不够,我们得让这些记忆在故事中体现出来。BandTwine 提供了一种非常简单的“文本标记”语法,可以在对话和描述中,直接显示变量的当前值。
语法是:{var.变量路径}。
例如,要显示我们刚刚定义的 hasKey 变量,路径就是 var.player.hasKey。
让我们来修改一下 check_desk 节点,让它能显示出玩家是否拥有钥匙的状态。同时,我们为它添加一个返回的链接。
"check_desk": {
"text": "你走向桌子,上面放着一盏熄灭的油灯和一本合上的旧书。\n\n当前钥匙状态:{var.player.hasKey}\n\n{0}",
"links": [
{ "text": "回到房间中央", "target": "start" }
]
}小知识:
\n是一个特殊的“换行符”,它可以让文本在显示时换行,使排版更美观。
现在,当玩家选择“检查床边的桌子”时,他们会看到文字:“当前钥匙状态:false”,以及一个可以点击的“回到房间中央”的链接。我们的世界第一次“说出”了它的记忆!
完整的剧本
让我们看一下到目前为止,我们完整的 common/data.json 文件:
{
"metadata": {
"indexNode": "start"
},
"variables": {
"player": {
"hasKey": false
}
},
"nodes": {
"start": {
"text": "你在一间安静的房间里醒来,阳光透过窗帘的缝隙洒在地板上。你决定 {0} 还是 {1}?",
"links": [
{ "text": "查看窗外", "target": "look_outside" },
{ "text": "检查床边的桌子", "target": "check_desk" }
]
},
"look_outside": {
"text": "你拉开窗帘,外面是一片宁静的森林,薄雾弥漫在树林间。\n\n{0}",
"links": [
{ "text": "回到房间中央", "target": "start" }
]
},
"check_desk": {
"text": "你走向桌子,上面放着一盏熄灭的油灯和一本合上的旧书。\n\n当前钥匙状态:{var.player.hasKey}\n\n{0}",
"links": [
{ "text": "回到房间中央", "target": "start" }
]
}
}
}✨ 世界拥有了记忆!
恭喜!您已经学会了如何定义变量来存储信息,以及如何在故事中展示这些信息。
但您可能已经发现了问题:现在这个状态是静态的,hasKey 的值永远是 false。我们如何让玩家通过自己的行为,来改变这个记忆呢?
这正是我们下一站要探索的,也是互动故事最核心的魅力所在:选择的力量。
下一站: 第四步:选择的力量