用溪流 WarKey 辅助红警开局快捷操作
2023-03-20 15:28:29 时间
背景
自从发现红警除了 ddraw 补丁可以在最新的系统里玩后,就开始怀旧了。但是由于手残,遇到别人抢地盘基本上直接崩了。偶然有一次发现像 08 这样的高手点 30 个坦克使用工具的。那么,我开局用工具造兵营、碉堡,是不是显得不那么可耻了呢?
说干就干,我有支持 lua 脚本的溪流 WayKey,理论上都能做到。
实现一次性点 30 个坦克
这个场景没有手速要求,只是为了不麻烦,所以我们实现地简单些:要求先把鼠标放好位置,然后设定快捷键,直接给点击 N 次。
实现很简单,30 次这个次数作为参数传进来,主函数里就是 PressMouseButton(Mouse.LBUTTON)、ReleaseMouseButton(Mouse.LBUTTON) 来 30 下:
Extension =
{
Application = "xlWarKey",
Version = "3.0",
NameSpace = "http://www.streamlet.org/Software/xlWarKey/",
ExtensionName = "鼠标连点",
Author = "溪流",
Description = "该脚本可以用来在红警2中一次性造多个单位。",
Configuration =
{
Count =
{
Type = "number",
Desc = "连点次数"
}
},
Entrance = function (id)
local config = Extension.Configuration;
--config.Count 就是用户在软件界面上设置的连点次数
for i = 1, config.Count, 1
do
PressMouseButton(Mouse.LBUTTON);
ReleaseMouseButton(Mouse.LBUTTON);
end
return true;
end
};
(脚本文档见 https://www.streamlet.org/software/xlwarkey/)
保存为 .lua 文件放到溪流 WarKey 目录下的 Scripts 下,退出溪流 WarKey 重新打开,即可看到脚本生效。
因为溪流 WarKey 本是为魔兽写的,因此默认会勾上“仅在魔兽争霸中应用”,要去掉它。
然后改键动作选择“鼠标连点”脚本,并配置参数 Count 为 30 即可:
实现快速造兵营、碉堡
难点主要是在定位按钮的位置。
我们在不同分辨率下截几张图,发现一个规律:不管分辨率如何,面板宽度总是固定为 168 像素,面板内部的各个组件大小也是固定的。这就好办了。经过测量,得出如下结论:
- 顶部到按钮区域高度:227
- 面板宽度 168,左右空隙 20、22,按钮区域宽度126
- 按钮大小 63x50
所以,对于第 r 行、第 c 列(r、c 均从 0 开始)的按钮,其中心坐标的计算公式为
x = WIDTH - 168 + 20 + 63 * c + 63/2
y = 227 + r * 50 + 50/2
点击面板按钮可以组织成一个函数:
ClickPanel = function(row, column, count)
if count == nil then
count = 1
end
local width, height = GetClientSize()
local target_x = width - 168 + 20 + 63 * column + 32
local target_y = 227 + row * 50 + 25
MoveMouse(target_x, target_y)
for i = 1, count, 1
do
ClickMouse()
Delay(10)
end
end
有了 ClickPanel,我们可以写出造任何东西的代码了。完整脚本如下:
Extension =
{
Application = "xlWarKey",
Version = "3.0",
NameSpace = "http://www.streamlet.org/Software/xlWarKey/",
ExtensionName = "红警开局快速操作",
Author = "溪流",
Description = "帮助红警手残党不要一开始就被抢死,提高游戏体验",
Configuration =
{
Type =
{
Type = "number",
Desc = "1=造电厂,2=造兵营,3=造矿场,4=造碉堡,5=造3条狗,6=造10个兵"
}
},
Entrance = function (id)
ClickKey = function (key)
PressKey(key)
ReleaseKey(key)
end
ClickMouse = function ()
PressMouseButton(Mouse.LBUTTON)
ReleaseMouseButton(Mouse.LBUTTON)
end
ClickPanel = function(row, column, count)
if count == nil then
count = 1
end
local width, height = GetClientSize()
-- 红警面板总是在右侧固定宽度位置 168 像素,其中
-- 内边框左侧 20 像素,右侧 22 像素,中间 126 像素为按钮,分两列,每列 63px
-- 顶部到按钮高度 227 像素,按钮高度 50 像素
local target_x = width - 168 + 20 + 63 * column + 32
local target_y = 227 + row * 50 + 25
MoveMouse(target_x, target_y)
for i = 1, count, 1
do
ClickMouse()
Delay(10)
end
end
local config = Extension.Configuration
local start_x, start_y = GetCursorPosition()
if config.Type == 1 then
-- 造电厂
ClickKey(Keys.VK_Q)
ClickPanel(0, 0)
MoveMouse(start_x, start_y)
elseif config.Type == 2 then
-- 造兵营
ClickKey(Keys.VK_Q)
ClickPanel(1, 0)
MoveMouse(start_x, start_y)
elseif config.Type == 3 then
-- 造矿场
ClickKey(Keys.VK_Q)
ClickPanel(0, 1)
MoveMouse(start_x, start_y)
elseif config.Type == 4 then
-- 造碉堡
ClickKey(Keys.VK_W)
ClickPanel(0, 1)
MoveMouse(start_x, start_y)
elseif config.Type == 5 then
-- 造3条狗
ClickKey(Keys.VK_Q)
ClickPanel(1, 0, 3)
MoveMouse(start_x, start_y)
elseif config.Type == 6 then
-- 造10个兵
ClickKey(Keys.VK_Q)
ClickPanel(0, 0, 10)
MoveMouse(start_x, start_y)
end
return true
end
}
因为面板按钮会随着游戏进行而会有变化,所以上述脚本只适用于开局。
相关文章
- 2017GAITC丨尖峰对话:AI的第三次寒冬会不会到来?
- 如何使用 backupninja 来备份 Debian 系统
- 安卓平台上的依赖注入(一)
- 《Ansible权威指南》一第2章
- Linux 有问必答:如何删除 Ubuntu 上不再使用的旧内核
- 《Ansible权威指南》一2.2 Ansible配置文件解析
- 20个 Unix/Linux 命令技巧
- Linux 有问必答:如何使用yum来下载RPM包而不进行安装
- Linux 有问必答:如何在 Linux 中统计一个进程的线程数
- 如何在 Linux 上使用 BackupPC 来架设跨平台的备份服务器
- 2017GAITC| 通用AI之路:继续大数据驱动深度学习还是另寻他途
- 你需要了解的 Chrome 45 的改变
- 13 种在 Linux 系统上检测 CPU 信息的工具
- 在linux中如何通过nload来监控网络使用情况
- 《Ansible权威指南》一2.5 Ansible Inventory配置及详解
- 使用Nemiver调试器来调试 C/C++ 程序
- 《Ansible权威指南》一 2.6 Ansible与正则
- Linux有问必答:如何在Linux上安装Git
- Samba 系列(一):在 Ubuntu 系统上使用 Samba4 来创建活动目录架构
- 2017GAITC专访丨大会程序委员会主席周明