Skip to content

第三站:赋予世界记忆

在上一站,我们的故事已经有了分支,玩家可以自由选择探索的方向。但一个真正引人入胜的世界,应该能记住玩家的行为。比如,玩家在桌上发现了一把钥匙,那么这个“拥有钥匙”的状态就应该被世界记住。

这就是 变量 (Variables) 的魔力。变量就像是故事世界的“记忆口袋”,我们可以用它来存放各种信息:玩家是否拥有某件物品、角色的好感度、时间的流逝等等。


开辟“记忆空间”:variables

首先,我们需要在 common/data.json 的顶层,开辟一个专门存放所有变量的地方。这个地方就叫做 "variables"

让我们在 metadata 的下方,添加一个新的 "variables" 区域,并定义我们的第一个变量:hasKey。我们将它的初始值设为 false,因为玩家一开始并没有钥匙。

json
{
  "metadata": {
    "indexNode": "start"
  },
  "variables": {
    "player": {
      "hasKey": false
    }
  },
  "nodes": {
    // ... 我们之前的节点内容 ...
  }
}

小提示: 将所有与玩家相关的变量,都放在一个叫 "player" 的对象里,是一种很好的整理习惯。这样,当变量多起来时,我们的“记忆口袋”就不会显得杂乱无章。

让记忆“说话”:在文本中显示变量

光能记住还不够,我们得让这些记忆在故事中体现出来。BandTwine 提供了一种非常简单的“文本标记”语法,可以在对话和描述中,直接显示变量的当前值。

语法是:{var.变量路径}

例如,要显示我们刚刚定义的 hasKey 变量,路径就是 var.player.hasKey

让我们来修改一下 check_desk 节点,让它能显示出玩家是否拥有钥匙的状态。同时,我们为它添加一个返回的链接。

json
"check_desk": {
  "text": "你走向桌子,上面放着一盏熄灭的油灯和一本合上的旧书。\n\n当前钥匙状态:{var.player.hasKey}\n\n{0}",
  "links": [
    { "text": "回到房间中央", "target": "start" }
  ]
}

小知识: \n 是一个特殊的“换行符”,它可以让文本在显示时换行,使排版更美观。

现在,当玩家选择“检查床边的桌子”时,他们会看到文字:“当前钥匙状态:false”,以及一个可以点击的“回到房间中央”的链接。我们的世界第一次“说出”了它的记忆!

完整的剧本

让我们看一下到目前为止,我们完整的 common/data.json 文件:

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。我们如何让玩家通过自己的行为,来改变这个记忆呢?

这正是我们下一站要探索的,也是互动故事最核心的魅力所在:选择的力量。

下一站: 第四步:选择的力量