# Engine test: trigger timing (when, instead, after), optional triggers, a conditional trigger,
# and a trigger on a content item that is active only while equipped.
game: triggers
label: Trigger timing (test)
num_players: 1
mode: competitive
description: >
  Test game for trigger timing and optional triggers. One event `damage` with an impact (hp -2).
  Each trigger appends a letter to `log`, so the order is visible: f = mandatory 'when',
  w = optional 'when' (heals 1), X = optional 'instead', Y = mandatory 'instead' (only with armour),
  I = the impact itself, a = 'after', d = trigger on the content item Thorn (active only when
  equipped).
state:
  vars:
    hp: {scope: global, type: int, init: 3}
    log: {scope: global, type: str, init: ""}
    armour: {scope: global, type: bool, init: false}
    equipment: {scope: global, type: list, init_x: "[]"}
flow:
  id: root
  kind: sequence
  children:
    - {id: hit, kind: step, actor_x: "0", do: strike}
    - {id: close, kind: step, do: finish}
actions:
  strike:
    effect:
      - op: emit
        event: damage
        impact:
          - {op: add, var: hp, amount: -2}
          - {op: set, var: log, value_x: "log + 'I'"}
  finish:
    effect: [{op: set, var: log, value_x: "log + '.'"}]
triggers:
  - {id: after_damage, event: damage, timing: after, do: [{op: set, var: log, value_x: "log + 'a'"}]}
  - {id: heal, event: damage, timing: when, optional: true, do: [{op: add, var: hp, amount: 1}, {op: set, var: log, value_x: "log + 'w'"}]}
  - {id: mandatory, event: damage, timing: when, do: [{op: set, var: log, value_x: "log + 'f'"}]}
  - {id: dodge, event: damage, timing: instead, optional: true, controller_x: "0", do: [{op: set, var: log, value_x: "log + 'X'"}]}
  - {id: armour, event: damage, timing: instead, if: "armour", if_x: "armour", do: [{op: set, var: log, value_x: "log + 'Y'"}]}
content:
  equipment:
    thorn:
      id: thorn
      label: Thorn
      status: verified
      active_x: "self['id'] in equipment"
      triggers:
        - {event: damage, timing: after, do: [{op: set, var: log, value_x: "log + 'd'"}]}
end:
  - {id: done, if_x: "log.count('.') == 1", result: score, returns_x: "[hp]"}
