2026/2/14 tianhaobu
//注册与注销建议使用更加现代化的autoreg_handle和autodel_handle，详见2/18

1. 引入了新的输入方法，相关函数在interaction.gml里，大致逻辑是这样的:
在监听任何按键前，需要先注册一个句柄(handle)
{句柄函数名} = new input_handle("{句柄注册名}",{优先级})
句柄外部名称是调用该句柄的名称，句柄内部名称建议与外部名称保持一致.
优先级描述了该句柄的优先使用程度，通常来说，''高优先级句柄独占所有的输入''(例外是 debug 句柄).
意味着若存在优先级10的句柄foo与优先级为1的句柄bar，基于bar的任何按键监听都是无效的，句柄foo独占整个输入.

监听按键时，需要使用如下格式
{句柄函数名}.kc({按键}) | {句柄函数名}.kcr({按键}) | {句柄函数名}.kcp({按键})
假设为存在foo = foo_A.kc("A")； bar_A = bar.kc("A")； foo_B = bar.kc("B")； bar_B = bar.kc("B")
如果只有按键A被按下: 则foo_A = true； foo_B = false； bar_A = false； bar_B = false
如果按键A、B被按下: 则foo_A = true； foo_B = true； bar_A = false； bar_B = false

此外，现对优先级进行简单的设定: 游戏内部的输入(上下左右跳etc): 1；debug: -1
其中，debug不参与优先级竞争，即debug句柄无论何时都被激活，同时不影响当前最高级句柄，因此任何时候都有两个激活的句柄.

为了防止潜在的bug，该系统存在一个消费系统，任何一个按键被按下都会使这个按键被"消费"，即该按键会被视作没被按下.

一些简单的约定:
1) 不要让debug句柄和其他句柄同时监听一个按键.
2) 所有输入都尽量放在oInput里.
3) _handle_init()放在begin_step里.

语言能力极差... 看不懂的可以参考oInput

2026/2/18 tianhaobu
TL;DR: 给大忙人的handleinput30秒速通
必修:
autoreg_handle("A","B",C)
注册handle用，"A"表示这个handle函数的名字；"B"表示这个handle的注册名(小名)，通常"A"="B"；C表示优先级

autodel_handle("A")
注销handle用，"A"表示这个handle函数的名字

选择性必修:
input_handle_find("A")
根据注册名返回函数名，"A"表示注册名
通常搭配autodel_handle()使用

2026/2/19 tianhaobu
没错还是我，修复了handle input，现在直接使用_xxx = ingame.kc("X")即可，无需if(xxx != undefined)了.