@@ -12,13 +12,18 @@ SetWorkingDir %A_ScriptDir%
1212Menu Tray , Icon , logo_w.ico, , 1
1313CoordMode Pixel , Client
1414CoordMode Mouse , Client
15+ SetDefaultMouseSpeed 4
1516
1617; 2160×1080下的A9专用常量
1718
1819; 网络错误
1920NETWORK_ERROR_X = 940
2021NETWORK_ERROR_Y = 765
2122NETWORK_ERROR_COLOR = 0xFFFFFF
23+ ; 特殊赛事
24+ SPECIAL_RACE_X = 150
25+ SPECIAL_RACE_Y = 973
26+ SPECIAL_RACE_COLOR = 0xFFFFFF
2227; 每日赛事
2328DAILY_RACE_X = 500
2429DAILY_RACE_Y = 973
@@ -164,8 +169,12 @@ CAR_FEATURE_COLOR_LOCKED = 0x7F7F7F
164169TICKET_FROM_X = 1888
165170TICKET_TO_X = 1913
166171TICKET_Y = 192
172+ TICKET_FROM_X_SPECIAL = 1830
173+ TICKET_TO_X_SPECIAL = 1855
174+ TICKET_Y_SPECIAL = 200
167175TICKET_COLOR_BG = 0x000000
168176TICKET_COLOR = 0x0DB090
177+ TICKET_LIMIT = 9
169178; 每日车辆战利品搜索相关
170179DAILY_CAR_FEATURE_1_X = 221
171180DAILY_CAR_FEATURE_1_Y = 888
@@ -193,6 +202,9 @@ OPERATE_MODE_Y = 840
193202OPERATE_MODE_RANGE = 12
194203; 每日车辆用车顺序
195204DAILY_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
301311RunRaces() ; 开始比赛
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
736832RevertControlSetting() ; 如果是手动挡,恢复操作模式为手动,目前在赛事开始前读取时和赛事结束后下一步时不可用
737833{
738- if (OPERATE_MODE = 1 )
834+ if (OPERATE_MODE)
739835 {
740836 if CheckPixel(RACING_CHECK_X, RACING_CHECK_Y, RACING_CHECK_COLOR) ; 比赛中则先退出比赛,如果比赛中检测失效,那这里不会正确改回操作模式
741837 {
0 commit comments