GamingTS

事件系统

事件系统是 GTS 的核心机制。实体可以通过 on <事件名> 注册对特定游戏事件的响应,并使用 when 过滤器精确控制触发条件。

on — 事件注册

on <事件名> {
  // 事件处理体
}

on 后面跟一个标识符作为事件名。每个实体可以有多个 on 块,同一事件名也可以出现多次(按顺序依次触发)。

常用事件类型

事件名触发时机适用实体
enter实体入场时装备、状态、召唤物、支援牌
endPhase结束阶段召唤物、出战状态、状态
actionPhase行动阶段开始支援牌
battleBegin战斗开始时被动技能
useSkill使用技能后装备、状态
increaseSkillDamage技能造成伤害增加时装备、状态
decreaseDamaged受到伤害减少时状态(护盾)
increaseDamaged受到伤害增加时状态(脆弱)
damagedOrHealed受到伤害或治疗后状态
modifySkillDamageType修改技能伤害类型状态
deductOmniDiceSkill技能扣除任意元素骰装备、状态
deductElementDice扣除特定元素骰装备
deductOmniDiceCard打出卡牌扣骰支援牌
playCard打出卡牌后支援牌
switchActive切换出战角色后支援牌
dispose实体被移除时支援牌、召唤物
revive角色复苏时被动技能
adventure冒险时状态
enterRelative有实体入场时状态、支援牌
selfDiscard自身被舍弃时卡牌

once — 一次性触发

once <事件名> {
  // 仅触发一次
}

on 语法相同,但事件处理器只执行一次,之后自动移除。

when — 条件过滤

when 定义事件处理的前置过滤条件。只有 when 表达式返回 true 时,当前 on 块的效果才会执行:

on increaseDamaged {
  when :( [DamageType.Pyro, DamageType.Physical].includes(:e.type) );
  :e.increaseDamage(2);
  :dispose();
}

when 后的 :( expr ) 是快捷函数——expr 在事件上下文中求值。参数 :e 代表事件对象,其类型取决于触发的事件类型。

多个 when 组合

一个 on 块可以有多个 when,它们之间的关系是"与"(全部满足才触发):

on useSkill {
  when :( :e.isSkillType("normal") );
  when :( !:player.hands.find((card) => card.definition.id === SeatsSacredAndSecular) );
  usage perRound, 1;
  :createHandCard(SeatsSacredAndSecular);
}

listenTo — 事件监听范围

默认情况下,实体只监听自身所属方的事件。使用 listenTo 可以改变监听范围:

listenTo all;        // 监听双方的事件
listenTo samePlayer; // 仅监听己方
listenTo sameArea;   // 仅监听同区域实体(默认)
define status {
  id 114072 as ChakraDesiderataStatus;
  variable chakra, 0;
  on useSkill {
    when :( :e.isSkillType("burst") && :e.skill.caller.id !== :self.master.id );
    listenTo samePlayer;
    :addVariableWithMax("chakra", 1, 3);
  }
  on increaseSkillDamage {
    when :( :e.via.definition.id === SecretArtMusouShinsetsu );
    const currentVal = :getVariable("chakra");
    :e.increaseDamage(currentVal);
    :setVariable("chakra", 0);
  }
}

此例中第一个 on useSkill 监听己方其他角色的爆发使用,listenTo sameArea 是默认行为。

完整的事件类型列表和每个事件的事件对象类型,请参考 Provider 代码和 genius-invokation 的事件文档

On this page