Skip to content
This repository was archived by the owner on Mar 18, 2020. It is now read-only.

Commit 4f8071a

Browse files
committed
Add custom race support. Temporarily add avj car hunt support.
1 parent e44e789 commit 4f8071a

3 files changed

Lines changed: 134 additions & 45 deletions

File tree

Config.ahk

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,27 @@
77
OPERATE_MODE = 0
88
; 应用是顶栏的"首页"后的第几个窗口
99
APP_INDEX = 2
10-
; 票预留上限,0~10,建议小于9以免浪费票
11-
TICKET_LIMIT = 8
1210
; 生涯用车顺序,第一排1、3、5、7,第二排2、4、6、8,建议前6以加快选车过程
1311
CAREER_CARS := [5, 6, 4, 7, 10, 12, 13]
1412
; 脚本在哪些时间范围运行,多个时间段用英文逗号分隔,如 00:00-08:00, 09:00-12:15, 13:55-18:30,注意小于10的加0
1513
RUN_TIME_SCOPE = 00:00-23:59
1614
; true/false,默认开启/关闭每日赛事
17-
ENABLE_DAILY_RACE := true
15+
ENABLE_DAILY_RACE := false
1816
; true/false,默认开启/关闭多人赛事
1917
ENABLE_MULTI_PLAYER_RACE := true
2018
; true/false,默认开启/关闭生涯赛事
2119
ENABLE_CAREER_RACE := false
20+
21+
; true/false,默认开启/关闭自定义赛事
22+
ENABLE_CUSTOM_RACE := true
23+
; special/daily,自定义赛事类型,特殊赛事/每日赛事
24+
CUSTOM_TYPE = special
25+
; 自定义赛事次序
26+
CUSTOM_INDEX = 6
27+
; 自定义赛事票数消耗
28+
CUSTOM_TICKET = 2
29+
; 自定义赛事用车顺序
30+
CUSTOM_CARS := [13, 12, 16, 17]
31+
2232
; 允许脚本使用每个段位的前几辆车来跑多人
23-
MP_MAX_CARS_PER_LEVEL = 3
33+
MP_MAX_CARS_PER_LEVEL = 6

source/A9.ahk

Lines changed: 117 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,18 @@ SetWorkingDir %A_ScriptDir%
1212
Menu Tray, Icon, logo_w.ico, , 1
1313
CoordMode Pixel, Client
1414
CoordMode Mouse, Client
15+
SetDefaultMouseSpeed 4
1516

1617
; 2160×1080下的A9专用常量
1718

1819
; 网络错误
1920
NETWORK_ERROR_X = 940
2021
NETWORK_ERROR_Y = 765
2122
NETWORK_ERROR_COLOR = 0xFFFFFF
23+
; 特殊赛事
24+
SPECIAL_RACE_X = 150
25+
SPECIAL_RACE_Y = 973
26+
SPECIAL_RACE_COLOR = 0xFFFFFF
2227
; 每日赛事
2328
DAILY_RACE_X = 500
2429
DAILY_RACE_Y = 973
@@ -164,8 +169,12 @@ CAR_FEATURE_COLOR_LOCKED = 0x7F7F7F
164169
TICKET_FROM_X = 1888
165170
TICKET_TO_X = 1913
166171
TICKET_Y = 192
172+
TICKET_FROM_X_SPECIAL = 1830
173+
TICKET_TO_X_SPECIAL = 1855
174+
TICKET_Y_SPECIAL = 200
167175
TICKET_COLOR_BG = 0x000000
168176
TICKET_COLOR = 0x0DB090
177+
TICKET_LIMIT = 9
169178
; 每日车辆战利品搜索相关
170179
DAILY_CAR_FEATURE_1_X = 221
171180
DAILY_CAR_FEATURE_1_Y = 888
@@ -193,6 +202,9 @@ OPERATE_MODE_Y = 840
193202
OPERATE_MODE_RANGE = 12
194203
; 每日车辆用车顺序
195204
DAILY_CARS := [1, 5, 14, 2, 3, 4]
205+
; 自定义赛事
206+
CUSTOM_TYPE_SPECIAL = special
207+
CUSTOM_TYPE_DAILY = daily
196208

197209
; 全局变量
198210

@@ -270,7 +282,7 @@ OpenApp() ; 启动A9
270282
RandomClick(NETWORK_ERROR_X, NETWORK_ERROR_Y, , DELAY_VERY_LONG)
271283
else
272284
Sleep DELAY_LONG
273-
if (Mod(A_Index, 10) = 0)
285+
if (enableDebug && Mod(A_Index, 10) = 0)
274286
Debug(NETWORK_ERROR_X . "/" . NETWORK_ERROR_Y . " " . GetPixel(NETWORK_ERROR_X, NETWORK_ERROR_Y))
275287
}
276288
}
@@ -287,9 +299,7 @@ Restart() ; 重置,不会影响票数计时器
287299
if (forceRestart || !(hasBack && mainCross || mainNormal && secondNormal)) ; 60秒内重置过,或者检测不到菜单页特征值
288300
{
289301
if (enableDebug)
290-
{
291302
Debug("Restarting.", "forceRestart: " . forceRestart, "hasBack: " . hasBack, "mainCross: " . mainCross, "mainNormal: " . mainNormal, "secondNormal: " . secondNormal)
292-
}
293303
if (!enableDebug)
294304
CloseApp()
295305
OpenApp()
@@ -300,9 +310,11 @@ Restart() ; 重置,不会影响票数计时器
300310

301311
RunRaces() ; 开始比赛
302312
{
303-
global ENABLE_DAILY_RACE, ENABLE_MULTI_PLAYER_RACE, ENABLE_CAREER_RACE
313+
global ENABLE_CUSTOM_RACE, ENABLE_DAILY_RACE, ENABLE_MULTI_PLAYER_RACE, ENABLE_CAREER_RACE
304314
Loop
305315
{
316+
if (ENABLE_CUSTOM_RACE)
317+
RunCustomRace()
306318
if (ENABLE_DAILY_RACE)
307319
RunDailyRace()
308320
if (ENABLE_MULTI_PLAYER_RACE)
@@ -351,52 +363,135 @@ UpdateTicket() ; 检查并更新票数,返回值表示票数是否变化
351363
return false
352364
}
353365

354-
CheckFullTicket() ; 满票识别,使用"10"的十位"1"作为特征识别;如果票满,会刷新票数和票数计时器;在每个时间段,只检测到一次满票即可,后续全程由票数计时器计算
366+
CheckFullTicket(type:="daily") ; 满票识别,使用"10"的十位"1"作为特征识别;如果票满,会刷新票数和票数计时器;在每个时间段,只检测到一次满票即可,后续全程由票数计时器计算
355367
{
356-
global TICKET_FROM_X, TICKET_TO_X, TICKET_Y, TICKET_COLOR, TICKET_COLOR_BG, tickets, ticketTime, needFullTicketCheck
368+
global TICKET_FROM_X, TICKET_TO_X, TICKET_Y, TICKET_FROM_X_SPECIAL, TICKET_TO_X_SPECIAL, TICKET_Y_SPECIAL, TICKET_COLOR, TICKET_COLOR_BG, tickets, ticketTime, needFullTicketCheck, CUSTOM_TYPE_SPECIAL, CUSTOM_TYPE_DAILY
357369
if (!needFullTicketCheck)
358370
return
359371
CheckReward()
372+
if (type = CUSTOM_TYPE_SPECIAL) {
373+
ticketFromX := TICKET_FROM_X_SPECIAL
374+
ticketToX := TICKET_TO_X_SPECIAL
375+
ticketY := TICKET_Y_SPECIAL
376+
} else if (type = CUSTOM_TYPE_DAILY) {
377+
ticketFromX := TICKET_FROM_X
378+
ticketToX := TICKET_TO_X
379+
ticketY := TICKET_Y
380+
}
381+
Debug(tickets, ticketFromX, ticketToX, ticketY)
360382
ticketFlag := 0 ; 二进制最低位标记背景,次低位标记特征颜色,当匹配到"背景-特征颜色-背景"的时候认为票满
361-
while (A_Index + TICKET_FROM_X < TICKET_TO_X && tickets < 10) ; 判断票是否已满,这里使用界面上"10/10"分子中"10"的"1"这个数字作为特征识别
383+
while (A_Index + ticketFromX < ticketToX && tickets < 10) ; 判断票是否已满,这里使用界面上"10/10"分子中"10"的"1"这个数字作为特征识别
362384
{
363-
if CheckPixelWithDeviation(A_Index + TICKET_FROM_X, TICKET_Y, TICKET_COLOR, 120) ; 检测到1数字颜色,因为1很细,所以缩小显示后颜色偏差较大,这里允许120误差
385+
if CheckPixelWithDeviation(A_Index + ticketFromX, ticketY, TICKET_COLOR, 120) ; 检测到1数字颜色,因为1很细,所以缩小显示后颜色偏差较大,这里允许120误差
364386
{
365-
Debug("" . A_Index . "次:1 " . GetX(A_Index + TICKET_FROM_X) . " " . GetY(TICKET_Y))
387+
Debug("" . A_Index . "次:1 " . GetX(A_Index + ticketFromX) . " " . GetY(ticketY))
366388
ticketFlag |= 2
367389
}
368-
else if CheckPixel(A_Index + TICKET_FROM_X, TICKET_Y, TICKET_COLOR_BG) ; 检测到1背景色
390+
else if CheckPixel(A_Index + ticketFromX, ticketY, TICKET_COLOR_BG) ; 检测到1背景色
369391
{
370392
if (ticketFlag & 3 = 3) ; 检测到背景色是来自右边
371393
{
372-
Debug("" . A_Index . "次:右背景 " . GetX(A_Index + TICKET_FROM_X) . " " . GetY(TICKET_Y))
394+
Debug("" . A_Index . "次:右背景 " . GetX(A_Index + ticketFromX) . " " . GetY(ticketY))
373395
tickets := 10
374396
ticketTime := A_TickCount
375397
needFullTicketCheck := false
376398
}
377399
else ; 检测到背景色是来自左边
378400
{
379-
Debug("" . A_Index . "次:左背景 " . GetX(A_Index + TICKET_FROM_X) . " " . GetY(TICKET_Y))
401+
Debug("" . A_Index . "次:左背景 " . GetX(A_Index + ticketFromX) . " " . GetY(ticketY))
380402
ticketFlag |= 1
381403
}
382404
}
383405
else ; 其他
384406
{
385-
Debug("" . A_Index . "次:失败 " . GetX(A_Index + TICKET_FROM_X) . " " . GetY(TICKET_Y) . " " . GetPixel(A_Index + TICKET_FROM_X, TICKET_Y))
407+
Debug("" . A_Index . "次:失败 " . GetX(A_Index + ticketFromX) . " " . GetY(ticketY) . " " . GetPixel(A_Index + ticketFromX, ticketY))
386408
}
387409
}
388410
}
389411

390-
CheckReward() ; 检查是否有需要结算的奖励可以领取
391-
{
412+
; 检查是否有需要结算的奖励可以领取
413+
CheckReward() {
392414
global GAME_RUNNING_CHECK_X, GAME_RUNNING_CHECK_Y, GAME_RUNNING_CHECK_COLOR_LIGHT_GRAY, DAILY_REWORD_READY_X, DAILY_REWORD_READY_X_2, DAILY_REWORD_READY_Y, DAILY_REWORD_READY_COLOR, DELAY_LONG
393415
if CheckPixel(GAME_RUNNING_CHECK_X, GAME_RUNNING_CHECK_Y, GAME_RUNNING_CHECK_COLOR_LIGHT_GRAY)
394416
&& CheckPixel(DAILY_REWORD_READY_X, DAILY_REWORD_READY_Y, DAILY_REWORD_READY_COLOR)
395417
&& CheckPixel(DAILY_REWORD_READY_X_2, DAILY_REWORD_READY_Y, DAILY_REWORD_READY_COLOR)
396418
RandomClick(DAILY_REWORD_READY_X_2, DAILY_REWORD_READY_Y, , DELAY_LONG)
397419
}
398420

399-
RunDailyRace() ; 从A9首页打开每日车辆战利品赛事。只要票大于预留值,就开始比赛
421+
; 自定义赛事
422+
RunCustomRace() {
423+
global
424+
GoHome()
425+
CheckTime()
426+
UpdateTicket()
427+
local customRaceX, customRaceY, customRaceColor
428+
if (CUSTOM_TYPE = CUSTOM_TYPE_SPECIAL) {
429+
customRaceX := SPECIAL_RACE_X
430+
customRaceY := SPECIAL_RACE_Y
431+
customRaceColor := SPECIAL_RACE_COLOR
432+
} else {
433+
customRaceX := DAILY_RACE_X
434+
customRaceY := DAILY_RACE_Y
435+
customRaceColor := DAILY_RACE_COLOR
436+
}
437+
if !CheckPixel(customRaceX, customRaceY, customRaceColor)
438+
RandomClick(customRaceX, customRaceY, , DELAY_MIDDLE)
439+
RandomClick(customRaceX, customRaceY, , DELAY_MIDDLE)
440+
WaitColor(BACK_X, BACK_Y, BACK_COLOR)
441+
CheckFullTicket(CUSTOM_TYPE)
442+
if (tickets >= TICKET_LIMIT)
443+
{
444+
CheckReward()
445+
if (CUSTOM_TYPE = CUSTOM_TYPE_SPECIAL) {
446+
Loop 6 {
447+
MouseMove GetX(559), GetY(672)
448+
SendEvent {Click D}
449+
MouseMove GetX(1959), GetY(672)
450+
SendEvent {Click U}
451+
Sleep 100
452+
}
453+
Sleep 2000
454+
Loop 2 {
455+
MouseMove GetX(1959), GetY(672)
456+
SendEvent {Click D}
457+
MouseMove GetX(559), GetY(672)
458+
SendEvent {Click U}
459+
Sleep 100
460+
}
461+
if (GetPixel(1283, 519) & 0xFF > 0xD0)
462+
RandomClick(1283, 519, DELAY_MIDDLE, DELAY_MIDDLE)
463+
else if (GetPixel(1683, 519) & 0xFF > 0xD0)
464+
RandomClick(1683, 519, DELAY_MIDDLE, DELAY_MIDDLE)
465+
else if (GetPixel(883, 519) & 0xFF > 0xD0)
466+
RandomClick(883, 519, DELAY_MIDDLE, DELAY_MIDDLE)
467+
else
468+
return
469+
}
470+
local carArraySize := CUSTOM_CARS.MaxIndex()
471+
while (tickets >= TICKET_LIMIT && ENABLE_CUSTOM_RACE)
472+
{
473+
CheckTime()
474+
UpdateTicket()
475+
tickets -= CUSTOM_TICKET
476+
WaitPopUp()
477+
WaitColor(NEXT_X, NEXT_Y, NEXT_COLOR_GREEN, NEXT_COLOR_RED, NEXT_COLOR_BLACK)
478+
RandomClick(NEXT_X, NEXT_Y, DELAY_SHORT, DELAY_LONG)
479+
local startIndex
480+
Random startIndex, 0, carArraySize
481+
while (A_Index < startIndex || !StartRace(CUSTOM_CARS[A_Index], 50, 90))
482+
{
483+
if (A_Index >= startIndex + carArraySize)
484+
{
485+
ShowTrayTip("无可用车辆")
486+
tickets += CUSTOM_TICKET
487+
return
488+
}
489+
}
490+
}
491+
}
492+
}
493+
494+
RunDailyRace() ; 每日车辆战利品赛事。只要票>=9,就开始比赛
400495
{
401496
global
402497
GoHome()
@@ -407,7 +502,7 @@ RunDailyRace() ; 从A9首页打开每日车辆战利品赛事。只要票大于
407502
RandomClick(DAILY_RACE_X, DAILY_RACE_Y, , DELAY_MIDDLE)
408503
WaitColor(BACK_X, BACK_Y, BACK_COLOR)
409504
CheckFullTicket()
410-
if (tickets > TICKET_LIMIT) ; 当前票大于预留值(也就是还有票可用)
505+
if (tickets >= TICKET_LIMIT)
411506
{
412507
CheckReward()
413508
RandomClick(DAILY_CAR_CLICK_X, DAILY_CAR_CLICK_Y, DELAY_SHORT, DELAY_MIDDLE) ; 这里为了让图标缩小到同样大小,便于匹配特征点。如果被点击的赛事是要找的目标(有时会出现乱序现象),那就匹配不到,直接下次再说
@@ -440,7 +535,7 @@ RunDailyRace() ; 从A9首页打开每日车辆战利品赛事。只要票大于
440535
{
441536
RandomClick(dailyRaceX, dailyRaceY, , DELAY_MIDDLE)
442537
RandomClick(dailyRaceX, dailyRaceY, , DELAY_MIDDLE)
443-
while (tickets > TICKET_LIMIT && ENABLE_DAILY_RACE)
538+
while (tickets >= TICKET_LIMIT && ENABLE_DAILY_RACE)
444539
{
445540
CheckTime()
446541
UpdateTicket()
@@ -455,6 +550,7 @@ RunDailyRace() ; 从A9首页打开每日车辆战利品赛事。只要票大于
455550
if (A_Index >= startIndex + carArraySize)
456551
{
457552
ShowTrayTip("无可用车辆")
553+
tickets += 1
458554
return
459555
}
460556
}
@@ -477,7 +573,7 @@ RunMultiPlayerRace() ; 从A9首页打开并开始多人赛事
477573
WaitColor(NEXT_X_2, NEXT_Y, NEXT_COLOR_WHITE)
478574
RandomClick(NEXT_X_2, NEXT_Y, , DELAY_LONG)
479575
}
480-
RandomClick(MP_RACE_FIRST_X, MP_RACE_FIRST_Y + MP_RACE_GAP_Y, , DELAY_MIDDLE)
576+
RandomClick(MP_RACE_FIRST_X, MP_RACE_FIRST_Y, , DELAY_MIDDLE)
481577
WaitColor(BACK_X, BACK_Y, BACK_COLOR)
482578
while (!CheckTicket() && ENABLE_MULTI_PLAYER_RACE)
483579
{
@@ -489,7 +585,7 @@ RunMultiPlayerRace() ; 从A9首页打开并开始多人赛事
489585
RandomClick(MP_PACK_X, MP_PACK_Y, , DELAY_MIDDLE)
490586
WaitColor(NEXT_X_2, NEXT_Y, NEXT_COLOR_WHITE)
491587
RandomClick(NEXT_X_2, NEXT_Y, , DELAY_LONG)
492-
RandomClick(MP_RACE_FIRST_X, MP_RACE_FIRST_Y + MP_RACE_GAP_Y, , DELAY_MIDDLE) ; 因为这里回到了多人首页,所以要重新进二级页面
588+
RandomClick(MP_RACE_FIRST_X, MP_RACE_FIRST_Y, , DELAY_MIDDLE) ; 因为这里回到了多人首页,所以要重新进二级页面
493589
WaitColor(BACK_X, BACK_Y, BACK_COLOR)
494590
}
495591
if (CheckPixel(MP_START_MISTAKE_X, MP_START_MISTAKE_Y, MP_START_MISTAKE_COLOR))
@@ -735,7 +831,7 @@ CheckOperateMode() ; 检查操作模式是否是自动挡
735831

736832
RevertControlSetting() ; 如果是手动挡,恢复操作模式为手动,目前在赛事开始前读取时和赛事结束后下一步时不可用
737833
{
738-
if (OPERATE_MODE = 1)
834+
if (OPERATE_MODE)
739835
{
740836
if CheckPixel(RACING_CHECK_X, RACING_CHECK_Y, RACING_CHECK_COLOR) ; 比赛中则先退出比赛,如果比赛中检测失效,那这里不会正确改回操作模式
741837
{

source/Commons.ahk

Lines changed: 3 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -170,27 +170,10 @@ Swipe(fromX, fromY, toX, toY) ; 滑动
170170
dragFromY := GetY(fromY)
171171
dragToX := GetX(toX)
172172
dragToY := GetY(toY)
173-
SetMouseDelay 0
174-
Click %dragFromX%, %dragFromY%, D
175-
dx := Abs(dragToX - dragFromX)
176-
dy := Abs(dragToY - dragFromY)
177-
part := (dx > dy ? dx : dy)
178-
dxPart := dx / part
179-
if (dragFromX > dragToX)
180-
dxPart := -dxPart
181-
dyPart := dy / part
182-
if (dragFromY > dragToY)
183-
dyPart := -dyPart
184-
Loop %part%
185-
{
186-
MouseMove dxPart, dyPart, , R
187-
if (A_Index & 0xF = 0) ; 减少二进制位1的个数,来提高精度,但会增加延迟
188-
Sleep 1
189-
}
173+
MouseMove dragFromX, dragFromY
174+
SendEvent {Click D}
190175
MouseMove dragToX, dragToY
191-
Sleep DELAY_VERY_SHORT
192-
Click %dragToX%, %dragToY%, U
193-
SetMouseDelay 10ms
176+
SendEvent {Click U}
194177
Sleep DELAY_VERY_SHORT
195178
}
196179

0 commit comments

Comments
 (0)