noname icon indicating copy to clipboard operation
noname copied to clipboard

事件的新异步形式以及content的新写法

Open nonameShijian opened this issue 2 years ago • 1 comments

加入新写法依旧兼容老写法

事件异步形式:

一系列的创建事件函数将默认返回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; }
       }
    },
}

nonameShijian avatar Nov 18 '23 03:11 nonameShijian

啊?

nigthmoon avatar Nov 18 '23 03:11 nigthmoon