存档
在脚本中,我们可以通过函数拿到故事存档, 其中记录着 故事路径 和 故事数据,路径由系统自动生成,数据则需要开发者自行处理。
故事数据
故事数据 是各种逻辑判定的关键, 其位于 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)
}
}