体力值相关事件
================

体力值变化事件
---------------

::

  以该角色为承担者，触发“体力值变化前”
  （若在触发本时机技能的on_use函数中return true则导致本事件与后续此事件流程终止）
  fk.BeforeHpChanged   @体力值变化前

  若因为伤害而触发本事件：
    若该角色横置，则将场上所有横置的其他角色按行动顺序记录为该伤害的[chain_table]（连环表），用于稍后的铁索连环结算
    将本事件的护甲扣减量``shield_lost``设定为（该角色护甲值的相反数和体力值变化量的最小值）
    将本事件的体力值变化量加上本事件的护甲扣减量
  以该角色为承担者，触发“体力值变化时”
  fk.BeforeHpChanged       @体力值变化时

  若本事件的体力值变化量和护甲扣减量均为0，则视为本事件被防止
  若本事件被防止，结束本事件的流程

  若因为伤害而触发本事件且该伤害不为虚拟伤害且护甲扣减量不为0，则
    将该角色的护甲减去护甲扣减量
  
  将该角色的体力值加上体力值变化量
  以该角色为承担者，触发“体力值变化后”
  fk.HpChanged       @体力值变化后

  然后若该角色的体力值小于1，则
    若体力值变化量小于0，且不防止进入濒死结算，则
      进行该角色的濒死结算
  否则若该角色正处于濒死状态，则
    该角色脱离濒死状态

体力变化相关时机的data为HpChangedData，继承HpChangedDataSpec

.. admonition:: 在《三国杀官方规则集V2.2》中：

  并不存在“体力值变化事件”，你在官服看到的“体力值减少”、“体力值变化”是扣减体力事件的内容。
  具体实现因服务器和具体武将的不同，可能会有所差异。


体力上限变化事件
-----------------

::

  以该角色为承担者，触发“体力上限变化前”
  fk.BeforeMaxHpChanged     @体力上限变化前

  将该角色的体力上限加上体力上限变化量
  若体力上限变为0，则杀死角色
  若体力值大于体力上限，则直接修改体力值为体力上限
  以该角色为承担者，触发“体力上限变化后”
  fk.MaxHpChanged     @体力上限变化后
  
体力上限改变相关时机的data为MaxHpChangedData，继承MaxHpChangedDataSpec

.. admonition:: 在《三国杀官方规则集V2.2》中：

  关于体力上限的变化被分成了两个事件：“加体力上限事件”和“减体力上限事件”。
  相关的时机也被分离。

失去体力事件
------------

::

  以该角色为承担者，触发“失去体力前”
  fk.PreHpLost     @失去体力前

  以失去体力为原因，触发一个因本事件将该角色体力值减少[num]点的体力值变化事件
  以该角色为承担者，触发“失去体力后”
  fk.HpLost            @失去体力后
 
失去体力相关时机的data为HpLostData，继承HpLostDataSpec

.. admonition:: 在《三国杀官方规则集V2.2》中：

    “失去体力结算开始前”   对应   “失去体力前”

    “失去体力后”   对应   “失去体力后”

    “失去体力结算结束后” 在新月杀没有对应。
    原规则集亦未将此时机给OL服务器技能使用。

回复体力事件
------------

::

  以该角色为承担者，触发“回复体力前”
  fk.PreHpRecover       @回复体力前

  以回复体力为原因，触发一个因本事件将该角色体力增加[num]点的体力值变化事件
  以该角色为承担者，触发“回复体力后”
  fk.HpRecover        @回复体力后

回复体力相关时机的data为RecoverData，继承RecoverDataSpec

.. admonition:: 在《三国杀官方规则集V2.2》中：

    “回复体力前”   对应   “回复体力前”

    “回复体力后”   对应   “回复体力后”

    “回复体力结算结束后” 在新月杀没有对应。
    原规则集亦未将此时机给OL服务器技能使用。


伤害事件
----------

::

  （主效果）
  以伤害来源为承担者，触发“伤害发生前”
  fk.PreDamage      @准备造成伤害

  以伤害来源为承担者，触发“造成伤害时”和“造成核定伤害时”
  fk.DamageCaused   @造成伤害时
  fk.DetermineDamageCaused   @造成核定伤害时

  以受伤者为承担者，触发“受到伤害时”和“受到核定伤害时”
  fk.DamageInflicted    @受到伤害时
  fk.DetermineDamageInflicted    @受到核定伤害时

  若是属性伤害且受伤者处于连环状态，则重置受伤者
  以伤害为原因，借由体力值改变事件修改受伤者的体力值
  以伤害来源为承担者，触发“造成伤害后”
  fk.Damage    @造成伤害后

  以受伤者为承担者，触发“受到伤害后”
  fk.Damaged     @受到伤害后

.. hint:: 

  “造成伤害时”和“造成核定伤害时”、“受到伤害时”和“造成核定伤害时”本质上分别是对描述中“造成伤害时”、“受到伤害时”的细化划分。

  其中:

  - “造成伤害时”和“受到伤害时”指的是在\ **伤害数值尚未确定**\ 时的时机，允许通过修改伤害数据来影响最终伤害数值；

  - “造成核定伤害时”和“受到核定伤害时”指的是在\ **伤害数值已经确定**\ 后的时机，
    原则上，只有此时才能判断诸如“受到几点伤害”、“将伤害固定为X”等确定最终数值的相关内容。
    因为“防止伤害”=“将伤害固定为0”，所以“防止伤害”类效果应在此时机处理。

.. admonition:: 在《三国杀官方规则集V2.2》中：

    “造成伤害时①”   对应   “造成伤害时”

    “造成伤害时②”   对应   “造成核定伤害时”

    “受到伤害时①”   对应   “受到伤害时”

    “受到伤害时②”   对应   “受到核定伤害时”

::

  （后续效果）
  以伤害来源为承担者，触发“伤害结算完成后”
  fk.DamageFinished    @伤害流程完毕后

  若受伤者是连环传导起点，则
    从当前行动者开始，对所有处于连环状态的角色依次造成等量、属性相同的传导伤害
  
伤害相关时机的data为DamageData，继承DamageDataSpec