3939using BetterGenshinImpact . GameTask . AutoArtifactSalvage ;
4040using System . Collections . ObjectModel ;
4141using BetterGenshinImpact . Core . Script . Dependence ;
42+ using BetterGenshinImpact . GameTask . AutoDomain . Model ;
43+ using BetterGenshinImpact . GameTask . Common ;
4244using Compunet . YoloSharp ;
4345using Microsoft . Extensions . DependencyInjection ;
4446
@@ -182,7 +184,7 @@ private async Task DoDomain()
182184
183185 // 5. 快速领取奖励并判断是否有下一轮
184186 Logger . LogInformation ( "自动秘境:{Text}" , "5. 领取奖励" ) ;
185- if ( ! GettingTreasure ( _taskParam . DomainRoundNum == 9999 , i == _taskParam . DomainRoundNum - 1 ) )
187+ if ( ! await GettingTreasure ( i == _taskParam . DomainRoundNum - 1 ) )
186188 {
187189 if ( i == _taskParam . DomainRoundNum - 1 )
188190 {
@@ -997,7 +999,7 @@ private Task LockCameraToEastTask(CancellationTokenSource cts, Task moveAvatarTa
997999 Simulation . SendInput . Mouse . MoveMouseBy ( moveAngle , 0 ) ;
9981000 }
9991001
1000- Sleep ( 100 ) ;
1002+ Sleep ( 100 , _ct ) ;
10011003 }
10021004
10031005 Logger . LogInformation ( "锁定东方向视角线程结束" ) ;
@@ -1008,64 +1010,51 @@ private Task LockCameraToEastTask(CancellationTokenSource cts, Task moveAvatarTa
10081010 /// <summary>
10091011 /// 领取奖励
10101012 /// </summary>
1011- /// <param name="recognizeResin">是否识别树脂</param>
10121013 /// <param name="isLastTurn">是否最后一轮</param>
1013- private bool GettingTreasure ( bool recognizeResin , bool isLastTurn )
1014+ private async Task < bool > GettingTreasure ( bool isLastTurn )
10141015 {
10151016 // 等待窗口弹出
1016- Sleep ( 1500 , _ct ) ;
1017+ await Delay ( 300 , _ct ) ;
10171018
1018- // 优先使用浓缩树脂
1019- var retryTimes = 0 ;
1020- while ( true )
1019+ // OCR 弹出框
1020+ bool chooseResinPrompt = await NewRetry . WaitForAction ( ( ) =>
10211021 {
1022- retryTimes ++ ;
1023- if ( retryTimes > 3 )
1024- {
1025- Logger . LogInformation ( "没有浓缩树脂了" ) ;
1026- break ;
1027- }
1022+ using var ra = CaptureToRectArea ( ) ;
1023+ var regionList = ra . FindMulti ( RecognitionObject . Ocr ( ra . Width * 0.25 , ra . Height * 0.2 , ra . Width * 0.5 , ra . Height * 0.6 ) ) ;
1024+ return regionList . Any ( t => t . Text . Contains ( "石化古树" ) ) ;
1025+ } , _ct , 10 , 500 ) ;
1026+ Debug . WriteLine ( "识别到选择树脂页" ) ;
10281027
1029- var useCondensedResinRa = CaptureToRectArea ( ) . Find ( AutoFightAssets . Instance . UseCondensedResinRa ) ;
1030- if ( ! useCondensedResinRa . IsEmpty ( ) )
1031- {
1032- useCondensedResinRa . Click ( ) ;
1033- // 点两下 #224 #218
1034- // 解决水龙王按下左键后没松开,然后后续点击按下就没反应了
1035- Sleep ( 400 , _ct ) ;
1036- useCondensedResinRa . Click ( ) ;
1037- break ;
1038- }
1028+ if ( ! chooseResinPrompt )
1029+ {
1030+ throw new NormalEndException ( "未检测到选取树脂界面,可能是背包物品已满。" ) ;
1031+ }
1032+
1033+
1034+ await Delay ( 800 , _ct ) ;
1035+ // 弹出框
1036+ using var ra2 = CaptureToRectArea ( ) ;
1037+ // 识别树脂状况
1038+ var resinStatus = ResinStatus . RecogniseFromRegion ( ra2 ) ;
1039+ resinStatus . Print ( Logger ) ;
10391040
1040- Sleep ( 800 , _ct ) ;
1041+ if ( resinStatus . CondensedResinCount > 0 )
1042+ {
1043+ PressUseResin ( ra2 , "浓缩树脂" ) ;
1044+ resinStatus . CondensedResinCount -= 1 ;
1045+ }
1046+ else if ( resinStatus . OriginalResinCount >= 20 )
1047+ {
1048+ PressUseResin ( ra2 , "原粹树脂" ) ;
1049+ resinStatus . OriginalResinCount -= 20 ;
10411050 }
10421051
1052+
10431053 Sleep ( 1000 , _ct ) ;
10441054
1045- var hasSkip = false ;
1046- var captureArea = TaskContext . Instance ( ) . SystemInfo . ScaleMax1080PCaptureRect ;
1047- var assetScale = TaskContext . Instance ( ) . SystemInfo . AssetScale ;
10481055 for ( var i = 0 ; i < 30 ; i ++ )
10491056 {
1050- // 跳过领取动画
1051- if ( ! hasSkip )
1052- {
1053- TaskContext . Instance ( ) . PostMessageSimulator . LeftButtonClick ( ) ; // 先随便点一个地方使得跳过出现
1054- }
1055-
10561057 using var ra = CaptureToRectArea ( ) ;
1057-
1058- // OCR识别是否有跳过
1059- var ocrList = ra . FindMulti ( RecognitionObject . Ocr ( captureArea . Width - 230 * assetScale , 0 ,
1060- 230 * assetScale - 5 , 80 * assetScale ) ) ;
1061- var skipTextRa = ocrList . FirstOrDefault ( t => Regex . IsMatch ( t . Text , this . skipLocalizedString ) ) ;
1062- if ( skipTextRa != null )
1063- {
1064- hasSkip = true ;
1065- skipTextRa . Click ( ) ; // 有则点击
1066- }
1067-
1068-
10691058 // 优先点击继续
10701059 using var confirmRectArea = ra . Find ( AutoFightAssets . Instance . ConfirmRa ) ;
10711060 if ( ! confirmRectArea . IsEmpty ( ) )
@@ -1081,14 +1070,7 @@ private bool GettingTreasure(bool recognizeResin, bool isLastTurn)
10811070 }
10821071 }
10831072
1084- if ( ! recognizeResin )
1085- {
1086- confirmRectArea . Click ( ) ;
1087- return true ;
1088- }
1089-
1090- var ( condensedResinCount , fragileResinCount ) = GetRemainResinStatus ( ) ;
1091- if ( condensedResinCount == 0 && fragileResinCount < 20 )
1073+ if ( resinStatus . CondensedResinCount <= 0 && resinStatus . OriginalResinCount < 20 )
10921074 {
10931075 // 没有体力了退出
10941076 var exitRectArea = ra . Find ( AutoFightAssets . Instance . ExitRa ) ;
@@ -1112,6 +1094,50 @@ private bool GettingTreasure(bool recognizeResin, bool isLastTurn)
11121094 throw new NormalEndException ( "未检测到秘境结束,可能是背包物品已满。" ) ;
11131095 }
11141096
1097+ private void PressUseResin ( ImageRegion ra , string resinName )
1098+ {
1099+ var regionList = ra . FindMulti ( RecognitionObject . Ocr ( ra . Width * 0.25 , ra . Height * 0.2 , ra . Width * 0.5 , ra . Height * 0.6 ) ) ;
1100+ var resinKey = regionList . FirstOrDefault ( t => t . Text . Contains ( resinName ) ) ;
1101+ if ( resinKey != null )
1102+ {
1103+ // 找到树脂名称对应的按键,关键词为使用,是同一行的(高度相交)
1104+ var useList = regionList . Where ( t => t . Text . Contains ( "使用" ) ) . ToList ( ) ;
1105+ if ( useList . Count != 0 )
1106+ {
1107+ // 找到使用按键
1108+ var useKey = useList . FirstOrDefault ( t => t . X > ra . Width / 2 && IsHeightOverlap ( t , resinKey ) ) ;
1109+ if ( useKey != null )
1110+ {
1111+ // 点击使用
1112+ useKey . Click ( ) ;
1113+ Logger . LogInformation ( "自动秘境:使用 {ResinName}" , resinName ) ;
1114+ }
1115+ else
1116+ {
1117+ Logger . LogWarning ( "自动秘境:未找到 {ResinName} 的使用按键" , resinName ) ;
1118+ }
1119+ }
1120+ else
1121+ {
1122+ Logger . LogWarning ( "自动秘境:未找到 {ResinName} 的使用按键" , resinName ) ;
1123+ }
1124+ }
1125+ }
1126+
1127+ /// <summary>
1128+ /// 判断两个区域在垂直方向上是否有重叠
1129+ /// </summary>
1130+ private bool IsHeightOverlap ( Region region1 , Region region2 )
1131+ {
1132+ int region1Top = region1 . Y ;
1133+ int region1Bottom = region1 . Y + region1 . Height ;
1134+ int region2Top = region2 . Y ;
1135+ int region2Bottom = region2 . Y + region2 . Height ;
1136+
1137+ // 检查区域是否在垂直方向上重叠
1138+ return ( region1Top <= region2Bottom && region1Bottom >= region2Top ) ;
1139+ }
1140+
11151141 /// <summary>
11161142 /// 获取剩余树脂状态
11171143 /// </summary>
0 commit comments