ludic/docs/language/events/kw-cancel.md

1.5 KiB

id name category kind tokens sig tip order
kw-cancel cancel events keyword cancel cancel Inside a listener, veto the cancellable event being emitted. 2

cancel is used inside an @On listener to veto the cancellable event currently being emitted. Calling it sets the payload's cancelled flag, and once the emit finishes running its listeners that flag comes back to the caller — emit E(…) used as an expression yields 1 when any listener cancelled and 0 otherwise. Guard it behind whatever condition should block the action; listeners that do not cancel simply observe. cancel is only meaningful in a listener for an event declared cancellable.

program CancelExample {
  event cancellable BeforeOpenDoor { key_count: int = 0 }

  state CancelExampleState {
    keys: int = 0
    doors_opened: int = 0
  }

  @On(BeforeOpenDoor) handler RequireKey { if key_count <= 0 { cancel } }

  handler TryOpen(cancel_example_st: mut CancelExampleState) phase Update {
    if Input.key() == 'o' {
      if emit BeforeOpenDoor(key_count: cancel_example_st.keys) == 0 {
        cancel_example_st.doors_opened = cancel_example_st.doors_opened + 1
        cancel_example_st.keys = cancel_example_st.keys - 1
      }
    }
  }

  handler DrawWorld(cancel_example_st: CancelExampleState) phase Render {
    Screen.clear(Color.MidnightBlue)
    Screen.draw_number(x: 4, y: 4, value: cancel_example_st.doors_opened, color: Color.Gold, scale: 1)
    Screen.show()
  }
}