/**
 * ============================================================================================
 * MacroEngine 用户指南 (v1.0)
 * ============================================================================================
 * [程序快捷键]
 * F10 - 配置重载: 修改完 config.json 文件后直接按 F10，无需重启软件即可使新配置生效
 * F12 - 配置切换: 弹出配置列表。输入序号选择，按 回车 确认切换（直接按回车则保持当前配置）
 * F8  - 操作录制: 
 *  - 开启: 按下 F8 开始录制你的键鼠操作
 *  - 停止: 再次按下 F8 停止并自动保存至 profiles 文件夹
 *  - 限制: 若 meta 中指定了 target_class，录制仅在目标窗口焦点内生效，切出窗口将自动停止
 *
 * [文件规范]
 * 1. 编码格式: 必须使用 UTF-8 编码，否则中文描述 (desp) 会显示乱码
 * 2. 存放位置: 必须存放在程序根目录的 profiles 文件夹下，后缀名为 .json
 * 3. 语法基础: 严格遵循 JSON 语法（注意：数组最后一个元素后面不能有逗号）
 *
 * [坐标系核心概念]
 * 1. 相对移动 (abs: false): 以当前鼠标位置为原点，进行偏移
 * 2. 绝对移动 (abs: true): 
 * - 若 meta 中 target_class 为空: 以“全屏幕”左上角为 (0,0)
 * - 若 meta 中指定了窗口类名: 引擎将自动转换为“窗口客户区坐标”
 * - 这意味着 (0,0) 永远是该游戏窗口内容的左上角，无论窗口在屏幕哪个位置，宏都能点准
 * ============================================================================================
 */
 
/*
{
    // ----------------------------------------------------------------------------------------
    // 第一部分：元数据 (meta)
    // ----------------------------------------------------------------------------------------
    "meta": {
        "name": "刻晴-重击模板",          	// 宏的名称
        "description": "按住侧键自动执行",	// 宏的描述
        "trigger_key": "XBUTTON2",        	// 触发按键：LBUTTON(左键), RBUTTON(右键), MBUTTON(中键), 
											// 	XBUTTON1/2(侧键), A-Z, F1-F12, CTRL, ALT, SHIFT, SPACE
        "trigger_mode": "hold",           	// 触发模式: 
											// 	"hold"   - 按住时运行，松开立即停止
											// 	"toggle" - 按一下开始运行，再按一下停止
        "target_class": "UnityWndClass"   	// 作用窗口：只有在这个窗口激活时宏才生效
											// 	常用：原神(UnityWndClass),
											// 	如果想在桌面或所有地方生效，请保持为空 ""
    },

    // ----------------------------------------------------------------------------------------
    // 第二部分：全局参数 (settings)
    // ----------------------------------------------------------------------------------------
    "settings": {
        "default_click_hold": 30,         // 如果下面的 key_click 没写 hold，默认按住 30ms
        "default_post_delay": 15,         // 每个动作执行完后，默认歇 15ms，防止操作过快被系统丢包
        "global_speed": 1.0               // 速度系数：2.0 会让所有 delay 减半（快一倍），
                                          // 0.5 会让所有 delay 翻倍（慢一倍）
    },

    // ----------------------------------------------------------------------------------------
    // 第三部分：执行序列 (Execution Sequences)
    // ----------------------------------------------------------------------------------------
    // on_start:   按下那一刻执行（只跑一次）
    // on_loop:    按住期间循环执行（跑完最后一条指令会立即回到第一条重跑）
    // on_release: 松开按键时执行（清理现场，比如松开后自动收刀）
    
    "on_loop": [
		// ------------------------------------------------------------------------------------
        // 键盘操作详解
        // ------------------------------------------------------------------------------------
		
        // A. 键盘点击：按下 F 键，保持 50ms 后松开，再等待 100ms
        { "op": "key_click", "key": "F", "hold": 50, "delay": 100, "desp": "拾取" },

		// ------------------------------------------------------------------------------------
        // 鼠标操作详解
        // ------------------------------------------------------------------------------------
		
		// A. 相对移动 (Relative Move)
        // 场景：视角转动
        { 
            "op": "mouse_move", 
            "x": 0, "y": 15, 
            "abs": false, 
            "desp": "鼠标相对当前位置向下移动 15 像素" 
        },
		
		// B. 绝对移动 (Absolute Move)
        // 场景：自动点击游戏菜单、技能图标、背包位置
        // 注意：当指定了 target_class 时，(100, 100) 永远指向游戏画面内的固定位置
        { 
            "op": "mouse_move", 
            "x": 100, "y": 100, 
            "abs": true, 
            "delay": 50,
            "desp": "鼠标直接跳转到窗口客户区左上角往右下各 100 像素的位置" 
        },
		
		// C. 组合动作：精确点击
        // 先跳转到指定按钮坐标，再模拟点击
        { "op": "mouse_move", "x": 500, "y": 500, "abs": true },
        { "op": "mouse_click", "key": "left", "hold": 50, "desp": "点击屏幕中央的确认按钮" },

		// ------------------------------------------------------------------------------------
        // 颜色判定详解
        // ------------------------------------------------------------------------------------

        // A. 强力等待模式 (wait_color)
        // 逻辑：死等颜色出现。如果在 timeout 内没等到，宏会“报错并立即退出”
        // 场景：确保目标已就绪再继续，若没就绪宁愿停止宏
        {
            "op": "wait_color",
            "x": 960, "y": 540,
            "color": "#FF0000",
            "timeout": 2000,               // 2秒内没等到红色，整个宏停止运行
            "then": [
                { "op": "key_click", "key": "E", "desp": "怪红了，自动释放技能" }
            ],
            "desp": "严格等待技能亮起"
        },

        // B. 条件分支模式 (if_color)
        // 逻辑：尝试检测颜色。如果在 timeout 内没等到，宏会“放弃当前块”，继续跑后面的指令
        // 场景：检测是否有突发状况，有则处理，无则继续循环
        {
            "op": "if_color",
            "x": 100, "y": 100,
            "color": "#FFFFFF",
            "timeout": 50,                 // 仅等待 50ms，没等到也无所谓，继续往下跑
            "then": [
                { "op": "key_click", "key": "F", "desp": "看到白色提示词，顺手捡一下" }
            ],
            "desp": "可选动作：有则捡取"
        },

		// ------------------------------------------------------------------------------------
        // 进阶操作详解
        // ------------------------------------------------------------------------------------
		
        // A. 冷却控制：
        { "op": "cooldown", "val": 800, "tag": "switch_char", "desp": "切人内置CD" },

        // B. 模块导入：把常用的复杂序列（如复杂的连招）写在 library/base.json 里直接引用
        { "op": "import", "file": "base", "speed": 1.0 }
    ]
}
*/

/**
 * ============================================================================================
 * [用户常见问题 FAQ]
 * 1. 为什么宏没反应？
 * - 请检查 target_class 是否正确如果不确定，先改为 "" (全局测试)
 * - 检查 trigger_key 是否拼写正确（全大写）
 *
 * 2. 坐标如何获取？
 * - 使用QQ附带的“截图工具”，或者在 100% 缩放的截图软件中查看像素点坐标
 *
 * 3. 颜色检测不准？
 * - 注意游戏是否有滤镜或动态光影尽量取颜色最稳定的核心像素点
 * - 颜色格式为标准 RGB 的 16 进制
 *
 * 4. 怎么实现“按一下松开，宏一直跑”？
 * - 将 meta 里的 trigger_mode 设置为 "toggle"
 * ============================================================================================
 */
 
 /**
 * ============================================================================================
 * [用户进阶 Tips]
 * 1. 什么是“窗口客户区”？
 * - 客户区不包含窗口的标题栏和边框。如果你在窗口类名中填了值，引擎会自动扣除这些边距
 * - 确保你填写的 (0,0) 就是游戏画面的第一个像素
 *
 * 2. 为什么绝对坐标点不准？
 * - 请确认你的游戏分辨率与编写脚本时的分辨率一致
 *
 * 3. 调试小技巧：
 * - 在编写绝对移动宏时，可以先把 target_class 置空，在桌面上测试跳转位置是否正确
 * ============================================================================================
 */

