noname
noname copied to clipboard
事件的新异步形式以及content的新写法
加入新写法依旧兼容老写法
事件异步形式:
一系列的创建事件函数将默认返回Promise对象 使用await或then来获取事件的执行结果(即原先的事件对象) 最简单的例子:
console.log(player.draw()) // Promise<GameEvent>
console.log(await player.draw()) // GameEvent
复杂事件例子: (注: await一般只能在async function中使用)
const event = player.chooseBool('是否发动【xx】?');
console.log(event) //Promise<GameEvent>
// 以下几种方法获取事件的result(结果):
event.then(({result})=>console.log(result));
const result = (await event).result;
const { result } = await event;
// 不需要result本身,而只获取result的部分属性(比如result.bool)
const { result : { bool } } = await event;
console.log(bool) // true or false
虽然返回值变为了Promise对象,但其依然可以调用事件对象原有的方法和属性 (使用的Proxy代理实现) 最简单的例子:
const event = player.chooseBool('是否发动xxx?');
// 和以前一样调用各种方法
event.set('xx', 2);
event.finish();
toPromise和toEvent:
在事件类的原型上添加toPromise函数,用于将(原先的)事件对象转换为Promise对象, 但你无需手动调用。
在事件转换Promise对象后的新事件类添加toEvent函数,用于将异步事件转换为原先的事件对象。
新增async content使用方法:
skill = {
// 新的content将不经过parsex编译,并且不会提供event.goto和event.redo跳转步骤的函数。
// 函数执行完成即代表该技能事件完成(event.finish())
// 遗计新写法
content: async function(event, trigger, player) {
let num = trigger.num;
while (num --> 0) {
const { result: { bool } } = await player.chooseBool('是否发动遗计');
if (bool) {
await player.draw(2);
const { result: { card } } = await player.chooseCard(2, true);
const { result: { targets} } = = await player.chooseTarget();
// player.give
} else { break; }
}
},
}
啊?