Skip to content

存档

在脚本中,我们可以通过函数拿到故事存档, 其中记录着 故事路径故事数据,路径由系统自动生成,数据则需要开发者自行处理。

故事数据

故事数据 是各种逻辑判定的关键, 其位于 save.data, 您可以在 项目.初始存档数据 中设定初始值, 并在函数中修改。

就比如我们将初始存档数据设置如下:

json
{
  "me": {
    "title": "小明",
    "money": 529900,
    "faceScore": 999999999999,
    "cp": 500,
    "mate": null
  },
  "NPCList": [
    {
      "title": "柳如烟",
      "money": 10000000,
      "faceScore": 99999999999,
      "cp": 10000
    },
    {
      "title": "如花",
      "money": 300,
      "faceScore": 5,
      "cp": 9999999999
    }
  ]
}

在某个场景的某个事件中,我们选择给卖给柳如烟一枚丹药,造成资产变动和柳如烟战力变化:

js
export default {
    ...其他参数(不用管),
    /**
     * 事件运行
     *
     * @param {object} save  存档 - 故事存档
     * @param {object} story  故事 - 故事对象,可进行提示,弹窗等对故事进行修改操作
     * @param {object} loader 加载器 - 事件加载器的 Vue 节点
     * @return {Promise<Place|yinObject|undefined>}
     */
    run(save, story, loader) {
        console.log('存档:\n', save)
        console.log('故事:\n', story)

        const me = save.data.me, liuruyan = save.data.NPCList[0]
        // 我的资产增加 100
        me.money += 100
        // 柳如烟的资产减少 100
        liuruyan.money -= 100
        // 柳如烟的武力值增加 10000
        liuruyan.cp += 10000

        // 此时事件运行结束,由于没有新的场景地址,下个场景还是 事件.目标场景
    }
}

场景切换

故事路径会被记录在 存档.路径 中,以数组形式存在,存档对象内置了两个功能来编辑这个路径数组, 除非你知道自己在做什么,否则最好不要直接修改路径数组。

载入场景

传入一个场景用作新场景,同时传入新场景的父场景(一般为当前场景)创建路径索引和回环检查, 修改路径后覆盖 故事数据

路径回环

故事路径不会产生回环:

  • 若传入的场景已在故事路径中,则截断路径,但覆盖 故事数据
  • 若传入的父场景已在故事路径中,则从父场景截断路径,并添加新场景
js
export default {
    async run(save, story) {
        // 正常情况下直接返回场景地址就可以进入新场景
        // 若此时进入的新场景并不属于当前场景的子场景
        await save.load('新场景地址', '新场景父场景的地址')
    }
}

转到场景

转到一个曾经进入过的历史场景,系统将根据路径索引重建上次进入该场景的路径,同时恢复当时的 故事数据

js
export default {
    async run(save, story) {
        // 此时穿越时光,回到过去的某个场景。
        await save.to('场景地址')
    }
}

自动保存

场景切换成功后存档将自动保存。

基础功能

借助 引.Object,存档对象包含一些其他功能和特性,或许可以让故事更有趣。

js
export default {
    async run(save, story) {
        // 直接保存该存档
        await save._save()

        // 删除该存档,例如专家模式,死亡直接删档。
        await save._delete()

        // 重新载入上一次保存的数据
        await save._reload()

        function do_some_thing() {
            // 做点什么
        }

        // 为存档挂载一些事件
        // 不同设备可以同时打开同一个存档,多设备故事自动同步进行。
        // 下面这些事件会在所有设备触发。
        
        // 挂载存档更新事件
        save._on('update', do_some_thing)

        // 挂载存档读取事件
        save._on('read', do_some_thing)
        
        // 挂载存档删除事件
        save._on('deleted', do_some_thing)

        // 移除挂载的事件
        save._removeEvent('update', do_some_thing)
    }
}