整理中内容

https://docs.qq.com/doc/DZHhJVm1FRERIdk9q

执行效果(调用者, 效果描述)

  • 伤害事件队列 []\gets []
  • 非伤害事件队列 []\gets []
  • 效果描述 执行。其中:
    • 描述中含 造成伤害,则:
      • 伤害 \gets 伤害结算(伤害描述, 非伤害事件队列)
      • 入队(伤害事件队列, ...伤害)
    • 描述中含(非 造成伤害 的)事件,则:
      • 描述 执行;
      • 入队(非伤害事件队列, 描述)
  • 免于被击倒角色 []\gets []
  • 被击倒角色 []\gets []
  • 对于 伤害事件 中的每个 事件
    • 事件.可击倒
      • 免于被击倒(事件.目标角色)事件.目标角色 \notin 免于被击倒角色
        • 入队(免于被击倒角色, 事件.目标角色)
        • 事件.可击倒 \gets false
      • 否则:
        • 入队(被击倒角色, 事件.目标角色)
  • 纯伤害事件队列 \gets 筛选(伤害事件, ¬\neg 事件.可击倒);
  • 击倒事件队列 \gets 筛选(伤害事件, 事件.可击倒);
  • 对于 免于被击倒角色 中的每个 角色
    • (调用者, 描述) \gets 免于被击倒描述(角色)
    • 执行效果(调用者, 描述)
    • 治疗值 \gets 免于被击倒治疗值(描述)
    • 复苏事件 \gets 构造事件("damageOrHeal", { type: HEAL, value: 治疗值 })
    • 结算事件([复苏事件]);
  • 产出充能(效果描述)
    • 增加充能(调用者)
  • 结算事件(非伤害事件队列)
  • 结算事件(纯伤害事件队列);
  • 结算事件(击倒事件队列)
  • 对于 被击倒角色 中的每个 角色
    • 角色 \in 全部在场角色()
      • 击倒(角色)
      • 角色状态和装备 \gets 角色区实体(角色)
      • 弃置(角色装备和状态)
      • 是出战角色(角色)
        • 添加异步事件(选择出战角色(角色.阵营))
  • 切换角色事件队列 \gets 等待异步事件()
  • 结算事件(切换角色事件队列)

结算事件(事件队列)

  • 对于 事件队列 中的每个 事件
    • 待响应实体 \gets 获取全部实体(事件.发生时对局状态)
    • 事件.类型 == "damageOrHeal"事件.可击倒
      • 待响应实体 \gets 排序(待响应实体, 击倒事件优先级(事件.目标角色))
    • 对于 待响应实体 中的每个 实体
      • 效果 \gets 响应事件(事件)
      • 效果 \neq null
        • 实体 \in 获取全部实体()事件.类型 == "dispose"
          • 执行效果(实体, 效果)

击倒事件优先级(目标角色)(实体)

  • 目标角色 == 实体,返回 11
  • 否则,若 实体 \in 角色区实体(目标角色),返回 11
  • 否则,返回 00

伤害结算(伤害描述, 非伤害事件队列, 伤害列表=[])

  • (伤害类型, 伤害值, 目标角色) \gets 伤害描述
  • 伤害类型 \neq 穿透伤害
    • 新伤害类型 \gets 查找伤害效果("change")
    • 新伤害类型 \neq null
      • 伤害类型 \gets 新伤害类型
    • 增伤列表 \gets 查找伤害效果(伤害描述, "+")
    • 元素反应 \gets 元素反应表[[伤害类型][][目标角色.附着]]
    • 元素类型 \neq null
      • 应用元素反应(元素反应, 伤害描述, 非伤害事件队列, 伤害列表)
    • 对于 增伤列表 中的每个 :
      • 伤害值 \gets 伤害值 ++ 项.增伤值
    • 乘伤列表 \gets 查找伤害效果(伤害描述, "*")
    • 对于 乘伤列表 中的每个 :
      • 伤害值 \gets 伤害值 ×\times 项.倍率
    • 除伤列表 \gets 查找伤害效果(伤害描述, "/")
    • 对于 除伤列表 中的每个 :
      • 伤害值 \gets \lceil 伤害值 // 项.倍率 \rceil
    • 减伤列表 \gets 查找伤害效果(伤害描述, "-")
    • 对于 减伤列表 中的每个 :
      • 伤害值 max(\gets \operatorname{max}( 伤害值 - 项.减伤值 ,0), 0)
  • 目标角色.生命值 \gets max(\operatorname{max}( 目标角色.生命值 - 伤害值 ,0), 0)
  • 可击倒 \gets 目标角色.生命值 =0= 0
  • 目标角色 \notin 伤害列表// 官方实现:相同角色上的第二次伤害不再引发事件
    • 伤害事件 \gets 构造事件("damageOrHeal", { 目标角色, 可击倒 });
    • 入队(伤害列表, 伤害事件)
  • 返回 伤害列表

应用元素反应(元素反应, 非伤害事件队列, 伤害描述, 伤害列表)

  • 阵营 \gets 伤害描述.目标角色.阵营
  • 对于 元素反应
    • 匹配 扩散(元素)
      • 被扩散角色 \gets 筛选(全部在场角色(), 角色.阵营 == 阵营 \wedge 角色 \neq 目标角色);
      • 对于 被扩散角色 中的每个 目标角色
        • 伤害结算({ type: 元素, value: 1, 目标角色 })
    • 匹配 结晶(元素)
      • 伤害描述.伤害值 \gets 伤害描述.伤害值 +1+ 1
      • 生成出战状态(结晶);
    • 匹配 感电超导
      • 伤害描述.伤害值 \gets 伤害描述.伤害值 +2+ 2
    • 匹配 蒸发融化
      • 伤害描述.伤害值 \gets 伤害描述.伤害值 +2+ 2
    • 匹配 超载
      • 伤害描述.伤害值 \gets 伤害描述.伤害值 +2+ 2
      • 是出战角色(伤害描述.目标角色)
        • 切换角色(阵营.下个角色())
    • 匹配 冻结
      • 伤害描述.伤害值 \gets 伤害描述.伤害值 +1+ 1
      • 附着状态(冻结);
    • 匹配 燃烧
      • 伤害描述.伤害值 \gets 伤害描述.伤害值 +1+ 1
      • 召唤(燃烧烈焰);
    • 匹配 绽放
      • 伤害描述.伤害值 \gets 伤害描述.伤害值 +1+ 1
      • 生成出战状态(草原核);
    • 匹配 原激化
      • 伤害描述.伤害值 \gets 伤害描述.伤害值 +1+ 1
      • 生成出战状态(激化领域);
  • 入队(非伤害事件队列, 构造事件("elementalReaction", (元素反应, 伤害描述)))
  • 返回。

回收骰子(阵营, 数量)

  • 骰子列表 \gets 阵营.骰子列表
  • 排序后骰子列表 \gets 排序(骰子列表, 回收骰子优先级(骰子列表))
  • 待回收骰子列表 \gets 排序后骰子列表.first_n(数量)
  • 对于 待回收骰子列表 中的每个 骰子
    • 取出首个(骰子列表,骰子)
  • 返回 待回收骰子列表

回收骰子优先级(骰子列表)(骰子)

  • 万能与否 {1,骰子=OMNI0,otherwise\gets \begin{cases}-1,& \textit{骰子}=\texttt{OMNI}\\0,&\text{otherwise}\end{cases}
  • 骰子个数 \gets 骰子列表.count(骰子);
  • 骰子类型序 \gets [CRYO, HYDRO, PYRO, ELECTRO, ANEMO, GEO, DENDRO].index_of(骰子);
  • 返回 (万能与否, 骰子个数, 骰子类型序)。

查找减骰效果(骰子需求)

  • 同色骰子(骰子需求)
    • 查找减元素骰效果(骰子需求)
  • 否则:
    • (基础元素骰, 无色骰) \gets 骰子需求
    • len(\operatorname{len}( 基础元素骰 )0)\neq0 时:
      • 当前元素 \gets 基础元素骰[0][0]
      • 查找减特定元素骰效果(当前元素, 骰子需求)
      • 查找减元素骰效果(骰子需求)
    • len(\operatorname{len}( 无色骰 )0)\neq0 时:
      • 查找减特定元素骰效果(无色, 骰子需求);
      • 对于 基础元素骰类型 中的每个 骰子类型
        • 查找减特定元素骰效果(骰子类型, 骰子需求)
      • 查找减元素骰效果(骰子需求)