大话西游2经典版修罗任务设计开发
修罗任务是大话经典任务之一。是人物获得经验的主要来源之一。接下来我们就来分析下任务这个任务,放上
代码。所有代码均有注释,通俗易懂,方便学习。
其中包含了本次任务的很多公共方法,下面会有专门介绍
公共方法
主要公共方法介绍,主要包含了ocr识别、找图、找色等一些常用的基础方法。其中、找图和找色完全可以用其中的一种就可以做,为了学习,把这些方法都用上了。
/**
* @param type 1地图识别 2 坐标识别 3修罗任务识别 4识别申请列表种族 5五倍任务识别
* 6飞行状态识别(飞、降) 7修罗次数 8五环完成对话识别 (该方法识别的方式有很多,字库
* 、找色、图片等等,我这里使用的是文字识别api)
*/
shibie(type)
/**
* 2S间隔判断是否移动 true 没移动 fasle移动中 (该方法为了效率,我自己通过Tesseract OCR训练了一一套数字字库,没有使用在线api识别是因为该方法调用过于频繁,我怕自己服务器压力受不了)
*/
is_move1()
/**
*坐标转换,把任务坐标转换成对应的小地图坐标
*
* @param piont 任务坐标点
* @param lit_map_right 小地图右上真实坐标
* @param big_map_right 大地图右上像素坐标
* @param big_map_left 大地图左下像素坐标
* @param type 不传偏差小传了偏差大
* @returns {*}
* (改方法是通过比例把任务坐标转换成小地图坐标,点击小地图自动寻路过去)
*/
toRealxy(piont, lit_map_right, big_map_right, big_map_left, type)
/**
* 1 信息弹窗 2 找暂离队伍的颜色 3对话采挖时弹出的对话“不”字 4 加蓝 5加血 6飞行飞字 7自动战斗按钮的小三角 8对话按钮
* @param type 找色类型
* @returns {boolean}
*/
finColor(type, is_log)
任务流程分解
对于脚本,都是把一个固定流程分解以后,逐步实现其流程。那么只需要分解修罗流程就可以写好这个任务
的脚本。
0、去任务NPC地图
1、领任务
2、点击寻路
3、去任务点的路上
4、战斗
5、返回重新领取任务
下面我们定义修罗任务的基础参数
let xl_task = {
//任务坐标点
point: "",
//任务地图
map: "",
//当前人物设定的法术
xl_fashu: "",
//当前队伍的人员信息
xl_team: [],
//修罗地图找坐标次数计数
count_nmb: 0,
acount_nmb: 0,
shibie_acount_nmb: 0,
//返回地图时是否使用的飞行道具回去
is_huichengfu: false,
//任务开始时间计时
start_time: 0,
//到达任务地图时间
task_map_time: 0,
//需要对话的怪物点NPC列表信息
xl_click_point: [],
//0 去灵兽 1领任务 2点击寻路 3去任务点的路上 4战斗 5使用回城符文
step: 0
}
流程-领任务
任务领取,我们需要分析其各种情况。各种情况的基础条件就是当前人物是否在移动中,移动我们就不做任何
处理,未移动我们就做处理
下面我们贴出去步骤0的去灵兽的代码
// 0 去灵兽
xl_task.go_lingshou = function () {
logd("0:进入去领修罗任务");
closeother()
//判断当前地图
if (shibie(1) == "灵兽村") {
logd("在灵兽村");
if (xl_task.is_huichengfu) {
if (findPic("close_right_down1280.png", 2, "关闭物品栏", true)) {
findPicAndClick("close_right_down1280.png", 2, "关闭物品栏")
}
if (!findPic("duiwu1280.png", 11, "满员标志")) {
logd("队伍不满员");
duiwu_stat();
}
is_chixiang();
while (finColor(2)) {
if (findPic("duiwu1280.png", 11, "满员标志")) {
logd("队伍满员");
} else {
duiwu_stat();
}
}
logd("在灵兽村使者旁边,准备做好开始领任务");
sleep(500);
click_point(map_big_to_little_point.当前地图, "灵兽村地图");
sleep(800);
if (findPic("click_search_npc1280.png", 19, "小地图搜索按钮")) {
findPicAndClick("click_search_npc1280.png", 19, "小地图搜索按钮");
} else {
wb_task.step = 0;
return;
}
sleep(500);
//1280分辨率
click_point("480,208", "点击搜索框");
sleep(800);
imeInputText(null, "灵兽村使者")
sleep(1000);
click_point("1150,610", "搜索按钮");
sleep(800);
click_point("490,270", "点击搜索结果")
xl_task.step = 1;
return
}
if (is_move1()) {
logd("没有移动");
let now_point = shibie(2);
let now_points = now_point.split(",");
if (parseInt(now_points[0]) > 99 && parseInt(now_points[0]) < 135 && parseInt(now_points[1]) > 80 && parseInt(now_points[1]) < 100) {
logd("在灵兽村使者旁边,为领任务做准备(队伍吃香)");
if (!findPic("duiwu1280.png", 11, "满员标志")) {
logd("队伍不满员");
duiwu_stat();
}
is_chixiang();
while (finColor(2)) {
if (findPic("duiwu1280.png", 11, "满员标志")) {
logd("队伍满员");
} else {
duiwu_stat();
}
}
logd("在灵兽村使者旁边,准备做好开始领任务");
sleep(500);
click_point(map_big_to_little_point.当前地图, "灵兽村");
sleep(800);
if (findPic("click_search_npc1280.png", 19, "小地图搜索按钮")) {
findPicAndClick("click_search_npc1280.png", 19, "小地图搜索按钮");
} else {
wb_task.step = 0;
return;
}
sleep(500);
//1280分辨率
click_point("480,208", "点击搜索框");
sleep(800);
imeInputText(null, "灵兽村使者")
sleep(1000);
click_point("1150,610", "搜索按钮");
sleep(800);
click_point("490,270", "点击搜索结果")
xl_task.step = 1;
return
} else {
logd("不在在灵兽村使者旁边,点击地图到他旁边");
click_point(map_big_to_little_point.当前地图, "灵兽村")
sleep(600)
findPicAndClick("click_fly1280.png", 28, "飞行旗隐藏")
sleep(300);
click_point("625,280", "系统信息弹框");
sleep(500)
//1280分辨率 修罗点
click_point("590,310", "修罗领取任务点");
sleep(500)
findPicAndClick("close_little_map1280.png", 1, "关闭小地图");
return;
}
}
} else {
logd("不在灵兽村");
if (xl_task.is_huichengfu) {
closeother();
findPicAndClick("open_package1280.png", 13, "背包按钮");
sleep(600);
if (findPic("open_package1280.png", 13, "背包按钮")) {
findPicAndClick("open_package1280.png", 13, "背包按钮");
sleep(600);
}
click_point("896,140", "任务物品栏");
sleep(500);
click_point("896,140", "任务物品栏");
sleep(500);
findPicAndClick("xiuluo_back1280.png", 10, "修罗回城福");
sleep(800);
findPicAndClick("xiuluo_use1280.png", 9999, "使用按钮");
xl_task.is_huichengfu = false;
sleep(800)
xl_task.step = 0
return;
}
if (is_move1()) {
logd("没有移动");
findPicAndClick("open_big_map1280.png", 18, "打开大地图");
sleep(600)
//找到灵兽村
click_point(map_big_to_little_point.灵兽村, "灵兽村");
sleep(600)
findPicAndClick("click_fly1280.png", 28, "飞行旗隐藏")
sleep(300);
click_point("625,280", "系统信息弹框");
sleep(500)
//1280分辨率 修罗点
click_point("590,310", "修罗领取任务点");
sleep(500)
findPicAndClick("close_little_map1280.png", 1);
return;
}
}
}
领任务
去灵兽代码中,我们有xl_task.step = 1;设置当前任务状态为领任务的操作,那么接下来我们就要处理领任务
的操作了,下面我们贴出代码。
xl_task.get_task = function () {
logd("1:进入开始识别领取修罗任务并领任务");
let per_time = time();
while (!findPic("xiuluo_talk1280.png", 6, "修罗对话框识别", true)) {
if (time() - per_time > 5 * 1000) {
logd("修罗任务对话框超过5s未弹出,重新开始领取任务");
closeother()
xl_task.step = 0;
return
}
}
logd("识别领取修罗任务对话框已打开,开始领取任务");
let a = shibie(7);
let match = a.match(/:(\d+)/);
xl_task.shibie_acount_nmb = match ? parseInt(match[1], 10) : 0;
if (xl_task.shibie_acount_nmb === 0) {
logd("当前修罗次数:" + xl_task.acount_nmb);
} else {
if (xl_task.acount_nmb != 0 && xl_task.shibie_acount_nmb - xl_task.acount_nmb < 100) {
xl_task.acount_nmb = xl_task.shibie_acount_nmb;
logd("当前修罗次数:" + xl_task.shibie_acount_nmb);
} else {
}
}
sleep(600);
click_point("1080,200", "修罗任务");
sleep(800);
let map_and_point = shibie(3);
if (map_and_point.includes("庄")) {
xl_task.map = "四圣庄";
} else if (map_and_point.includes("东")) {
xl_task.map = "长安城东";
} else if (map_and_point.includes("长安")) {
xl_task.map = "长安";
} else if (map_and_point.includes("凤") && map_and_point.includes("七层")) {
xl_task.map = "凤巢七层";
} else if (map_and_point.includes("凤") && map_and_point.includes("六层")) {
xl_task.map = "凤巢六层";
} else if (map_and_point.includes("凤") && map_and_point.includes("五层")) {
xl_task.map = "凤巢五层";
} else if (map_and_point.includes("龙") && map_and_point.includes("七层")) {
xl_task.map = "龙窟七层";
} else if (map_and_point.includes("龙") && map_and_point.includes("六层")) {
xl_task.map = "龙窟六层";
} else if (map_and_point.includes("龙") && map_and_point.includes("五层")) {
xl_task.map = "龙窟五层";
} else if (map_and_point.includes("洛阳城")) {
xl_task.map = "洛阳城";
} else if (map_and_point.includes("白骨山")) {
xl_task.map = "白骨山";
} else if (map_and_point.includes("万寿山")) {
xl_task.map = "万寿山";
} else if (map_and_point.includes("园")) {
xl_task.map = "蟠桃园";
} else if (map_and_point.includes("兰若寺")) {
xl_task.map = "兰若寺";
} else if (map_and_point.includes("瑶池")) {
xl_task.map = "瑶池";
} else if (map_and_point.includes("大唐边境")) {
xl_task.map = "大唐边境";
} else if (map_and_point.includes("大") && map_and_point.includes("五层")) {
xl_task.map = "大雁塔五层";
} else if (map_and_point.includes("大") && map_and_point.includes("四层")) {
xl_task.map = "大雁塔四层";
} else if (map_and_point.includes("大") && map_and_point.includes("三层")) {
xl_task.map = "大雁塔三层";
} else {
logd("未识别到修罗地图,从新领取任务");
closeother()
xl_task.step = 0;
return
}
logd("修罗任务地图:" + xl_task.map);
let matches = map_and_point.match(/\((\d+),(\d+)\)/);
if (matches) {
xl_task.point = matches[1] + "," + matches[2];
logd("修罗任务坐标:" + xl_task.point);
xl_task.task_state = true;
} else {
logd("未识别坐标,重新领取任务");
closeother()
xl_task.step = 0;
return
}
logd("跳出开始识别领取修罗任务并领任务");
logd((xl_task.shibie_acount_nmb === 0 ? xl_task.acount_nmb : xl_task.shibie_acount_nmb) + "次" + xl_task.map + "坐标:" + xl_task.point);
findPicAndClick("close_right_down1280.png", 3, "关闭对话界面");
sleep(600);
if (xl_task.acount_nmb % ybb === 0) {
findPicAndClick("click_search_npc1280.png", 19, "地图NPC查询列表");
sleep(600);
//1280分辨率
click_point("480,245", "NPC列表超级巫医");
while (!findPic("ybb1280.png", 15, "医宝宝界面", true)) {
}
logd("发现医宝宝界面");
findPicAndClick("ybb1280.png", 15, "医宝宝")
sleep(800);
click_point("625,280", "系统信息弹框");
sleep(600);
}
click_point("380,490", "灵兽村门口")
sleep(500);
findPicAndClick("close_little_map1280.png", 1, "小地图");
sleep(600);
xl_task.start_time = time();
xl_task.is_huichengfu = false;
xl_task.step = 2;
}
点击寻路
去上面代码中,我们有xl_task.step = 2;设置当前任务状态为点击寻路的操作,那么接下来我们就要进行
寻路操作
这里没有什么流程介绍,就是点击地图,点击坐标点。该方法主要就是按照比例对应地图像素点位置。
xl_task.action_task = function () {
logd("2:进入修罗去打怪");
closeother();
findPicAndClick("open_big_map1280.png", 18, "大地图");
sleep(800);
switch (xl_task.map) {
case "长安":
//打开小地图
click_point(map_big_to_little_point.长安, "长安小地图");
sleep(1000);
findPicAndClick("click_fly1280.png", 28, "飞行旗隐藏")
sleep(800);
click_point("640,280", "系统信息提示弹窗");
sleep(1000);
toRealxy(xl_task.point, map_little_real.长安小右上, map_little_real.长安大右上, map_little_real.长安大左下);
break;
case "长安城东":
click_point(map_big_to_little_point.长安城东, "长安城东小地图");
sleep(1000);
findPicAndClick("click_fly1280.png", 28, "飞行旗隐藏")
sleep(800);
click_point("640,280", "系统信息提示弹窗");
sleep(1000);
toRealxy(xl_task.point, map_little_real.长安东小右上, map_little_real.长安东大右上, map_little_real.长安东大左下);
break;
case "四圣庄":
click_point(map_big_to_little_point.四圣庄, "四圣庄小地图");
sleep(1000);
findPicAndClick("click_fly1280.png", 28, "飞行旗隐藏")
sleep(800);
click_point("640,280", "系统信息提示弹窗");
sleep(1000);
toRealxy(xl_task.point, map_little_real.四圣庄小右上, map_little_real.四圣庄大右上, map_little_real.四圣庄大左下);
break;
case "凤巢七层":
click_point(map_big_to_little_point.凤巢, "凤巢小地图");
sleep(1000);
click_point(map_big_to_little_point.凤巢七层, "凤巢七层小地图");
sleep(1000);
findPicAndClick("click_fly1280.png", 28, "飞行旗隐藏")
sleep(800);
click_point("640,280", "系统信息提示弹窗");
sleep(1000);
toRealxy(xl_task.point, map_little_real.凤巢龙窟小右上, map_little_real.凤巢龙窟大右上, map_little_real.凤巢龙窟大左下);
break;
case "凤巢六层":
click_point(map_big_to_little_point.凤巢, "凤巢小地图");
sleep(1000);
click_point(map_big_to_little_point.凤巢六层, "凤巢六小地图");
sleep(1000);
findPicAndClick("click_fly1280.png", 28, "飞行旗隐藏")
sleep(800);
click_point("640,280", "系统信息提示弹窗");
sleep(1000);
toRealxy(xl_task.point, map_little_real.凤巢龙窟小右上, map_little_real.凤巢龙窟大右上, map_little_real.凤巢龙窟大左下);
break;
case "凤巢五层":
click_point(map_big_to_little_point.凤巢, "凤巢小地图");
sleep(1000);
click_point(map_big_to_little_point.凤巢五层, "凤巢五小地图");
sleep(1000);
findPicAndClick("click_fly1280.png", 28, "飞行旗隐藏")
sleep(800);
click_point("640,280", "系统信息提示弹窗");
sleep(1000);
toRealxy(xl_task.point, map_little_real.凤巢龙窟小右上, map_little_real.凤巢龙窟大右上, map_little_real.凤巢龙窟大左下);
break;
case "龙窟七层":
click_point(map_big_to_little_point.龙窟, "龙窟小地图");
sleep(1000);
click_point(map_big_to_little_point.龙窟七层, "龙窟七小地图");
sleep(1000);
findPicAndClick("click_fly1280.png", 28, "飞行旗隐藏")
sleep(800);
click_point("640,280", "系统信息提示弹窗");
sleep(1000);
toRealxy(xl_task.point, map_little_real.凤巢龙窟小右上, map_little_real.凤巢龙窟大右上, map_little_real.凤巢龙窟大左下);
break;
case "龙窟六层":
click_point(map_big_to_little_point.龙窟, "龙窟小地图");
sleep(1000);
click_point(map_big_to_little_point.龙窟六层, "龙窟六小地图");
sleep(1000);
findPicAndClick("click_fly1280.png", 28, "飞行旗隐藏");
sleep(800);
click_point("640,280", "系统信息提示弹窗");
sleep(1000);
toRealxy(xl_task.point, map_little_real.凤巢龙窟小右上, map_little_real.凤巢龙窟大右上, map_little_real.凤巢龙窟大左下);
break;
case "龙窟五层":
click_point(map_big_to_little_point.龙窟, "龙窟小地图");
sleep(1000);
click_point(map_big_to_little_point.龙窟五层, "龙窟五小地图");
sleep(1000);
findPicAndClick("click_fly1280.png", 28, "飞行旗隐藏")
sleep(800);
click_point("640,280", "系统信息提示弹窗");
sleep(1000);
toRealxy(xl_task.point, map_little_real.凤巢龙窟小右上, map_little_real.凤巢龙窟大右上, map_little_real.凤巢龙窟大左下);
break;
case "洛阳城":
click_point(map_big_to_little_point.洛阳城, "洛阳城小地图");
sleep(1000);
findPicAndClick("click_fly1280.png", 28, "飞行旗隐藏");
sleep(800);
click_point("640,280", "系统信息提示弹窗");
sleep(1000);
toRealxy(xl_task.point, map_little_real.洛阳小右上, map_little_real.洛阳大右上, map_little_real.洛阳大左下);
break;
case "白骨山":
click_point(map_big_to_little_point.白骨山, "白骨山小地图");
sleep(1000);
findPicAndClick("click_fly1280.png", 28, "飞行旗隐藏");
sleep(800);
click_point("640,280", "系统信息提示弹窗");
sleep(1000);
toRealxy(xl_task.point, map_little_real.白骨山小右上, map_little_real.白骨山大右上, map_little_real.白骨山大左下);
break;
case "万寿山":
click_point(map_big_to_little_point.万寿山, "万寿山小地图");
sleep(1000);
findPicAndClick("click_fly1280.png", 28, "飞行旗隐藏");
sleep(800);
click_point("640,280", "系统信息提示弹窗");
sleep(1000);
toRealxy(xl_task.point, map_little_real.万寿山小右上, map_little_real.万寿山大右上, map_little_real.万寿山大左下);
break;
case "蟠桃园":
click_point(map_big_to_little_point.蟠桃园, "蟠桃园小地图");
sleep(1000);
findPicAndClick("click_fly1280.png", 28, "飞行旗隐藏");
sleep(800);
click_point("640,280", "系统信息提示弹窗");
sleep(1000);
toRealxy(xl_task.point, map_little_real.蟠桃园小右上, map_little_real.蟠桃园大右上, map_little_real.蟠桃园大左下);
break;
case "兰若寺":
click_point(map_big_to_little_point.兰若寺, "兰若寺小地图");
sleep(1000);
findPicAndClick("click_fly1280.png", 28, "飞行旗隐藏");
sleep(800);
click_point("640,280", "系统信息提示弹窗");
sleep(1000);
toRealxy(xl_task.point, map_little_real.兰若寺小右上, map_little_real.兰若寺大右上, map_little_real.兰若寺大左下);
break;
case "瑶池":
click_point(map_big_to_little_point.瑶池, "瑶池小地图");
sleep(1000);
findPicAndClick("click_fly1280.png", 28, "飞行旗隐藏");
sleep(800);
click_point("640,280", "系统信息提示弹窗");
sleep(1000);
toRealxy(xl_task.point, map_little_real.瑶池小右上, map_little_real.瑶池大右上, map_little_real.瑶池大左下);
break;
case "大唐边境":
click_point(map_big_to_little_point.大唐边境, "大唐边境小地图");
sleep(1000);
findPicAndClick("click_fly1280.png", 28, "飞行旗隐藏");
sleep(800);
click_point("640,280", "系统信息提示弹窗");
sleep(1000);
toRealxy(xl_task.point, map_little_real.大唐小右上, map_little_real.大唐大右上, map_little_real.大唐大左下);
break;
case "大雁塔五层":
click_point(map_big_to_little_point.大雁塔, "大雁塔小地图");
sleep(1000);
click_point(map_big_to_little_point.大雁塔五层, "大雁塔五小地图");
sleep(1000);
findPicAndClick("click_fly1280.png", 28, "飞行旗隐藏");
sleep(800);
click_point("640,280", "系统信息提示弹窗");
sleep(1000);
toRealxy(xl_task.point, map_little_real.大雁塔小右上, map_little_real.大雁塔大右上, map_little_real.大雁塔大左下);
break;
case "大雁塔四层":
click_point(map_big_to_little_point.大雁塔, "大雁塔小地图");
sleep(1000);
click_point(map_big_to_little_point.大雁塔四层, "大雁塔四小地图");
sleep(1000);
findPicAndClick("click_fly1280.png", 28, "飞行旗隐藏");
sleep(800);
click_point("640,280", "系统信息提示弹窗");
sleep(1000);
toRealxy(xl_task.point, map_little_real.大雁塔小右上, map_little_real.大雁塔大右上, map_little_real.大雁塔大左下);
break;
case "大雁塔三层":
click_point(map_big_to_little_point.大雁塔, "大雁塔小地图");
sleep(1000);
click_point(map_big_to_little_point.大雁塔三层, "大雁塔三小地图");
sleep(1000);
findPicAndClick("click_fly1280.png", 28, "飞行旗隐藏");
sleep(800);
click_point("640,280", "系统信息提示弹窗");
sleep(1000);
toRealxy(xl_task.point, map_little_real.大雁塔小右上, map_little_real.大雁塔大右上, map_little_real.大雁塔大左下);
break;
}
// if (finColor(6)) {
// chose_fly_state();
// }
sleep(600);
finColor(4, true);
sleep(600);
finColor(5, true);
logd("跳出修罗去打怪");
xl_task.step = 3
}
去任务点的路上
为什么需要去任务点路上的这个方法呢,因为总会有各种情况,系统卡主人物原地站岗、玩家误操作停止不动。而且最重要的一点是,我们需要判断是否到达怪物点,到了怪物点我们才能进行下一步的对话战斗操作。
xl_task.xl_daguaipaolu_xuhuan = function () {
logd("3:进入去战斗路上的循环");
let is_click_kanda = false;
while (time() - xl_task.start_time < 1000 * 180) {
closeother()
if (is_move1()) {
logd("去战斗路上未移动");
if (shibie(1) == xl_task.map) {
logd("到达修罗地图xl_task.count_nmb" + xl_task.count_nmb);
if (xl_task.task_map_time === 0) {
xl_task.task_map_time = time()
}
if (is_task_point(shibie(2), xl_task.point) || xl_task.count_nmb === 2 || time() - xl_task.task_map_time > 30 * 1000) {
logd("到达任务坐标点或是count_nmb为:" + xl_task.count_nmb + ",开始对话战斗");
if (findPic("open_talk1280.png", 17, "对话按钮")) {
findPicAndClick("open_talk1280.png", 17, "对话按钮");
sleep(800)
if (findPic("kanda1280.png", 5, "修罗看打")) {
findPicAndClick("kanda1280.png", 5, "修罗看打")
let a = time();
while (findPic("open_big_map1280.png", 18, "战斗界面判断", true)) {
if (time() - a > 3000) {
xl_task.step = 3;
return;
}
findPicAndClick("kanda1280.png", 5, "没点上看打,在此点击修罗看打")
sleep(300);
}
logd("点击了看打,准备开始战斗");
sleep(1000);
xl_task.step = 4;
return;
} else {
xl_task.findColor();
logd(xl_task.xl_click_point + "========" + xl_task.xl_click_point.length);
for (let i = 0; i < xl_task.xl_click_point.length; i++) {
if (findPic("open_talk1280.png", 17, "对话按钮", true)) {
findPicAndClick("open_talk1280.png", 17, "对话按钮");
sleep(600);
}
click_point(xl_task.xl_click_point[i], "修罗对话坐标点", true)
sleep(600);
if (findPic("kanda1280.png", 5, "修罗看打")) {
findPicAndClick("kanda1280.png", 5, "修罗看打")
sleep(600);
let a = time();
while (findPic("open_big_map1280.png", 18, "战斗界面判断", true)) {
if (time() - a > 3000) {
xl_task.step = 3;
xl_task.xl_click_point = []
return;
}
findPicAndClick("kanda1280.png", 5, "没点上看打,在此点击修罗看打")
sleep(300);
}
logd("点击了看打,准备开始战斗");
is_click_kanda = true
xl_task.step = 4;
return;
} else {
logd("循环下一个修罗窗口对话");
}
}
if (!is_click_kanda) {
logd("第一列npc列表没有修罗,滑动到第二列重新识别");
findPicAndClick("open_talk1280.png", 17, "对话按钮");
sleep(1000)
touchDown(892, 490)
sleep(500);
touchMove(892 + Math.floor(Math.random() * 7) - 3,
490 - 340 + Math.floor(Math.random() * 7) - 3)
sleep(1500);
if (findPic("wb_ganraokuang.png", 34, "识别是否滑动到底")) {
logd("滑动到底了");
}
sleep(500);
touchUp(892 + Math.floor(Math.random() * 7) - 3,
490 - 340 + Math.floor(Math.random() * 7) - 3)
sleep(1000);
xl_task.findColor();
logd(xl_task.xl_click_point + "========" + xl_task.xl_click_point.length);
for (let i = 0; i < xl_task.xl_click_point.length; i++) {
if (findPic("open_talk1280.png", 17, "对话按钮", true)) {
findPicAndClick("open_talk1280.png", 17, "对话按钮");
sleep(600);
}
click_point(xl_task.xl_click_point[i], "修罗对话坐标点", true)
sleep(600);
if (findPic("kanda1280.png", 5, "修罗看打")) {
findPicAndClick("kanda1280.png", 5, "修罗看打")
sleep(600);
let a = time();
while (findPic("open_big_map1280.png", 18, "战斗界面判断", true)) {
if (time() - a > 3000) {
xl_task.step = 3;
xl_task.xl_click_point = []
return;
}
findPicAndClick("kanda1280.png", 5, "没点上看打,在此点击修罗看打")
sleep(300);
}
logd("点击了看打,准备开始战斗");
is_click_kanda = true
xl_task.step = 4;
return;
} else {
logd("循环下一个修罗窗口对话");
sleep(600);
}
}
}
if (!is_click_kanda) {
xl_task.step = 0;
return;
}
}
} else {
xl_task.count_nmb = 0;
xl_task.step = 2
return;
}
} else {
if (xl_task.count_nmb == 1) {
click_point(map_big_to_little_point.当前地图, xl_task.map);
sleep(800);
let sms = readResAutoImage("xunzhao1280.png");
//在当前屏幕中查找,并且限制只查找一个
let points = null;
points = image.findImageEx(sms, 657, 349, 1052, 686, 0.7, 0.8, 1, 5);
image.recycle(sms)
let x;
let y;
if (points && points.length > 0) {
x = parseInt((points[0].left + points[0].right) / 2)
y = parseInt((points[0].top + points[0].bottom) / 2)
} else {
xl_task.count_nmb += 1;
continue
}
click_point(x - 120 + "," + y, "小地图X输入框");
sleep(800);
let poninList = xl_task.point.split(",");
shuruzuobiao(poninList[0]);
click_point(jianpan.ok, "小地图ok确认");
sleep(800);
click_point(x - 60 + "," + y, "小地图Y输入框");
sleep(800);
shuruzuobiao(poninList[1]);
click_point(jianpan.ok, "小地图ok确认");
sleep(800);
findPicAndClick("xunzhao1280.png", 999, "小地图前往");
sleep(700);
findPicAndClick("close_little_map1280.png", 1, "关小地图");
xl_task.count_nmb += 1;
} else {
logd("1111111111");
if (is_move1()) {
logd("在任务地图,但识别坐标是0,0或站着不动,重新点击任务坐标");
xl_task.count_nmb += 1;
logd("xl_task.count_nmb" + xl_task.count_nmb);
xl_task.step = 2
return;
}
}
}
} else {
logd("不在任务地图,检测到停止不动,再次检测坐标是否没变");
if (is_move1()) {
logd("非修罗地图下停止不动,重新点击目的地");
xl_task.step = 2
return;
}
}
}
}
logd("任务超时,返回灵兽村重新领取任务");
xl_task.chushihua();
xl_task.step = 0;
}
战斗流程
到达任务点后,我们通过对话进入战斗,战斗界面也是一个while循环,需要一直判断是否在战斗界面,因为当战斗界面消失时,就是战斗结束的时候,我们需要重新返回领任务的NPC处。
xl_task.xl_start_fight = function () {
logd("4:开始战斗");
sleep(3000);
if (finColor(7, true)) {
click_point("1226,672", "点击自动战斗");
sleep(600);
}
let is_click_zidong = true;
while (!findPic("open_big_map1280.png", 18, "战斗界面判断", true)) {
if (findPic("magic1280.png", 8, "法术按钮", true)) {
switch (Pfight_state) {
case "法术":
findPicAndClick("magic1280.png", 8, "法术按钮");
switch (xl_task.xl_fashu) {
case "1-5":
sleep(1000);
click_point(magic_point.技能15, "技能1-5");
break;
case "2-5":
sleep(1000);
click_point(magic_point.技能25, "技能2-5");
break;
case "3-5":
sleep(1000);
click_point(magic_point.技能35, "技能3-5");
break;
default:
logd("没选上技能" + xl_task.xl_fashu);
break;
}
sleep(1000);
clickPoint(284, 192);
logd("中间的怪");
// click_point("284,192", "中间的怪");
break;
case "防御":
findPicAndClick("fangyu1280.png", 13, "人物防御")
break;
case "攻击":
findPicAndClick("fight1280.png", 8, "人物攻击")
sleep(1000);
click_point("284,192", "中间的怪");
break;
}
sleep(1000);
switch (Bfight_state) {
case "法术":
findPicAndClick("magic1280.png", 8, "选择法术按钮");
sleep(1000);
click_point("900,280", "宠物提克")
sleep(1000);
click_point("284,192", "中间的怪");
break;
case "防御":
findPicAndClick("fangyu1280.png", 13, "宠物防御")
break;
case "攻击":
findPicAndClick("fight1280.png", 8, "宠物攻击")
sleep(1000);
click_point("284,192", "中间的怪");
break;
}
sleep(2000);
//点击自动战斗
click_point("1226,672", "点击自动战斗");
sleep(1000);
click_point("1226,672", "点击自动战斗");
}
if (is_click_zidong) {
if (xl_task.acount_nmb != 0 && xl_task.acount_nmb % 5 == 0) {
sleep(500);
click_point("1226,672", "点击自动战斗");
sleep(800);
findPicAndClick("zidong1280.png", 16, "战斗自动按钮");
sleep(800);
click_point("1226,672", "点击自动战斗");
is_click_zidong = false
}
}
}
logd("战斗结束");
sleep(800);
click_point("650,225", "点击信息提示框", true)
if (shibie(1) != xl_task.map) {
xl_task.is_huichengfu = false;
xl_task.chushihua()
xl_task.step = 0
} else {
logd("使用修罗回城符文");
xl_task.chushihua()
xl_task.step = 5
}
}
使用回城符文
任务结束,就是回城,重新领取任务了。下面放出代码
xl_task.xl_use_huicheng = function () {
xl_task.acount_nmb += 1;
// finColor(1);
sleep(500);
logd("5:战斗结束,开始找回程符文回城");
if (findPic("xu1280.png", 12, "盒子需要按钮")) {
findPicAndClick("xu1280.png", 12, "盒子需要按钮");
sleep(500);
}
if (!findPic("xiuluo_back1280.png", 9999, "修罗回城福")) {
if (findPic("moreX1280.png", 27, "主界面底部状态栏X")) {
findPicAndClick("moreX1280.png", 27, "主界面底部状态栏X")
sleep(600);
}
findPicAndClick("open_package1280.png", 13, "背包按钮");
sleep(800);
if (findPic("open_package1280.png", 13, "背包按钮")) {
findPicAndClick("open_package1280.png", 13, "背包按钮");
sleep(600);
}
click_point("896,140", "任务物品栏");
sleep(400);
click_point("896,140", "任务物品栏");
sleep(400);
findPicAndClick("xiuluo_back1280.png", 10, "修罗回城福");
sleep(800);
findPicAndClick("xiuluo_use1280.png", 9999, "使用按钮");
xl_task.is_huichengfu = true;
sleep(800)
xl_task.step = 0
} else {
findPicAndClick("xiuluo_back1280.png", 9999, "修罗回城福");
xl_task.is_huichengfu = true;
sleep(800)
xl_task.step = 0
}
}
总结
通过上面的6个步骤,我们完成修罗任务的闭环。效率还是不错的,经过测试,队伍强悍,基本上3个半小时就能做完100次的修罗任务。
本代码仅适用于学习使用。
下一章节,我们会进行五倍任务的学习。