From 37fcde080fdeacc67bc33a8fc210ad00a7c1414b Mon Sep 17 00:00:00 2001 From: FishmanTheMurloc <162452111+FishmanTheMurloc@users.noreply.github.com> Date: Sat, 6 Sep 2025 01:17:05 +0800 Subject: [PATCH] =?UTF-8?q?=E5=9B=BE=E6=A0=87=E8=AF=86=E5=88=AB=E5=BA=94?= =?UTF-8?q?=E7=94=A8=E4=B8=A4=E5=88=99=20(#2154)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AutoArtifactSalvageConfig.cs | 4 + .../AutoArtifactSalvageTask.cs | 43 ++++- .../AutoArtifactSalvageTaskParam.cs | 4 +- .../GameTask/AutoDomain/AutoDomainTask.cs | 2 +- .../Assets/1920x1080/bait/emberglow bait.png | Bin 8190 -> 0 bytes .../Assets/1920x1080/bait/fake fly bait.png | Bin 17677 -> 0 bytes .../Assets/1920x1080/bait/false worm bait.png | Bin 14033 -> 0 bytes .../bait/flashing maintenance mek bait.png | Bin 17462 -> 0 bytes .../1920x1080/bait/fruit paste bait.png | Bin 16493 -> 0 bytes .../Assets/1920x1080/bait/redrot bait.png | Bin 16962 -> 0 bytes .../Assets/1920x1080/bait/sour bait.png | Bin 17709 -> 0 bytes .../1920x1080/bait/spinelgrain bait.png | Bin 8149 -> 0 bytes .../Assets/1920x1080/bait/sugardew bait.png | Bin 17271 -> 0 bytes .../GameTask/AutoFishing/AutoFishingTask.cs | 72 +++++--- .../GameTask/AutoFishing/Behaviours.cs | 170 ++++++++++-------- .../GameTask/AutoFishing/Blackboard.cs | 20 +-- .../GameTask/AutoFishing/Model/BaitType.cs | 69 +++---- .../GameTask/AutoFishing/Model/BigFishType.cs | 46 ++--- .../AutoStygianOnslaughtTask.cs | 2 +- .../GameTask/GetGridIcons/GetGridIconsTask.cs | 20 ++- .../GetGridIcons/GridIconsAccuracyTestTask.cs | 3 +- .../GameTask/Model/GameUI/GridScreen.cs | 2 +- .../Helpers/Extensions/EnumExtensions.cs | 31 +++- .../View/Pages/TaskSettingsPage.xaml | 32 ++++ .../View/Windows/OcrDialog.xaml.cs | 2 +- .../ViewModel/Pages/HotKeyPageViewModel.cs | 2 +- .../Pages/TaskSettingsPageViewModel.cs | 1 + .../AutoArtifactSalvageTaskTests.cs | 6 +- .../BehavioursTests.ChooseBait.cs | 54 +++--- .../BehavioursTests.GetFishpond.cs | 7 +- .../BehavioursTests.ThrowRod.cs | 27 +-- .../AutoFishingTests/BehavioursTests.cs | 9 +- 32 files changed, 384 insertions(+), 244 deletions(-) delete mode 100644 BetterGenshinImpact/GameTask/AutoFishing/Assets/1920x1080/bait/emberglow bait.png delete mode 100644 BetterGenshinImpact/GameTask/AutoFishing/Assets/1920x1080/bait/fake fly bait.png delete mode 100644 BetterGenshinImpact/GameTask/AutoFishing/Assets/1920x1080/bait/false worm bait.png delete mode 100644 BetterGenshinImpact/GameTask/AutoFishing/Assets/1920x1080/bait/flashing maintenance mek bait.png delete mode 100644 BetterGenshinImpact/GameTask/AutoFishing/Assets/1920x1080/bait/fruit paste bait.png delete mode 100644 BetterGenshinImpact/GameTask/AutoFishing/Assets/1920x1080/bait/redrot bait.png delete mode 100644 BetterGenshinImpact/GameTask/AutoFishing/Assets/1920x1080/bait/sour bait.png delete mode 100644 BetterGenshinImpact/GameTask/AutoFishing/Assets/1920x1080/bait/spinelgrain bait.png delete mode 100644 BetterGenshinImpact/GameTask/AutoFishing/Assets/1920x1080/bait/sugardew bait.png diff --git a/BetterGenshinImpact/GameTask/AutoArtifactSalvage/AutoArtifactSalvageConfig.cs b/BetterGenshinImpact/GameTask/AutoArtifactSalvage/AutoArtifactSalvageConfig.cs index 408e838e..5762ca55 100644 --- a/BetterGenshinImpact/GameTask/AutoArtifactSalvage/AutoArtifactSalvageConfig.cs +++ b/BetterGenshinImpact/GameTask/AutoArtifactSalvage/AutoArtifactSalvageConfig.cs @@ -14,6 +14,10 @@ public partial class AutoArtifactSalvageConfig : ObservableObject Output = hasATK && hasDEF; })(ArtifactStat);"; + // JavaScript + [ObservableProperty] + private string _artifactSetFilter = ""; + // 正则表达式 [Obsolete] [ObservableProperty] diff --git a/BetterGenshinImpact/GameTask/AutoArtifactSalvage/AutoArtifactSalvageTask.cs b/BetterGenshinImpact/GameTask/AutoArtifactSalvage/AutoArtifactSalvageTask.cs index fd393bd8..5207c3f0 100644 --- a/BetterGenshinImpact/GameTask/AutoArtifactSalvage/AutoArtifactSalvageTask.cs +++ b/BetterGenshinImpact/GameTask/AutoArtifactSalvage/AutoArtifactSalvageTask.cs @@ -7,6 +7,7 @@ using BetterGenshinImpact.GameTask.Common; using BetterGenshinImpact.GameTask.Common.BgiVision; using BetterGenshinImpact.GameTask.Common.Element.Assets; using BetterGenshinImpact.GameTask.Common.Job; +using BetterGenshinImpact.GameTask.GetGridIcons; using BetterGenshinImpact.GameTask.Model.Area; using BetterGenshinImpact.GameTask.Model.GameUI; using BetterGenshinImpact.Helpers; @@ -16,6 +17,7 @@ using Microsoft.ClearScript; using Microsoft.ClearScript.V8; using Microsoft.Extensions.Localization; using Microsoft.Extensions.Logging; +using Microsoft.ML.OnnxRuntime; using OpenCvSharp; using System; using System.Collections.Frozen; @@ -51,6 +53,8 @@ public class AutoArtifactSalvageTask : ISoloTask private readonly string? javaScript; + private readonly string? artifactSetFilter; + private readonly int? maxNumToCheck; private readonly RecognitionFailurePolicy? recognitionFailurePolicy; @@ -65,6 +69,7 @@ public class AutoArtifactSalvageTask : ISoloTask { this.star = param.Star; this.javaScript = param.JavaScript; + this.artifactSetFilter = param.ArtifactSetFilter; this.maxNumToCheck = param.MaxNumToCheck; this.recognitionFailurePolicy = param.RecognitionFailurePolicy; this.logger = logger ?? App.GetLogger(); @@ -228,7 +233,11 @@ public class AutoArtifactSalvageTask : ISoloTask } } - Bv.ClickWhiteConfirmButton(ra4); + using var quickSelectConfirmBtn = ra4.Find(ElementAssets.Instance.BtnWhiteConfirm); + if (quickSelectConfirmBtn.IsExist()) + { + quickSelectConfirmBtn.Click(); + } await Delay(1500, ct); @@ -264,6 +273,38 @@ public class AutoArtifactSalvageTask : ISoloTask // 分解5星 if (javaScript != null) { + if (!string.IsNullOrWhiteSpace(this.artifactSetFilter)) + { + // 其实是点击筛选按钮……快速选择确认的这个按钮正好和筛选按钮位置重合,摆烂直接用了 + quickSelectConfirmBtn.Click(); + await Delay(400, ct); + // 点击所属套装 + ra5.ClickTo(315, 205); + await Delay(1000, ct); + // 遍历套装Grid勾选套装 + using InferenceSession session = GridIconsAccuracyTestTask.LoadModel(out Dictionary prototypes); + ArtifactSetFilterScreen gridScreen = new ArtifactSetFilterScreen(new GridParams(new Rect(40, 100, 1300, 852), 2, 3, 40, 40, 0.024), this.logger, this.ct); + await foreach (ImageRegion itemRegion in gridScreen) + { + using Mat img125 = GetGridIconsTask.CropResizeArtifactSetFilterGridIcon(itemRegion); + (string predName, _) = GridIconsAccuracyTestTask.Infer(img125, session, prototypes); + if (this.artifactSetFilter.Contains(predName)) + { + itemRegion.Click(); + await Delay(100, ct); + } + } + // 点击确认筛选 + using var confirmFilterBtnRegion = CaptureToRectArea(); + Bv.ClickWhiteConfirmButton(confirmFilterBtnRegion); + await Delay(1500, ct); + // 点击确认 + using var confirmBtnRegion = CaptureToRectArea(); + Bv.ClickWhiteConfirmButton(confirmBtnRegion); + await Delay(600, ct); + } + + // 逐一点选查看面板筛选 await Salvage5Star(); logger.LogInformation("筛选完毕,请复查并手动分解"); } diff --git a/BetterGenshinImpact/GameTask/AutoArtifactSalvage/AutoArtifactSalvageTaskParam.cs b/BetterGenshinImpact/GameTask/AutoArtifactSalvage/AutoArtifactSalvageTaskParam.cs index dd170723..0d7b4e69 100644 --- a/BetterGenshinImpact/GameTask/AutoArtifactSalvage/AutoArtifactSalvageTaskParam.cs +++ b/BetterGenshinImpact/GameTask/AutoArtifactSalvage/AutoArtifactSalvageTaskParam.cs @@ -9,16 +9,18 @@ namespace BetterGenshinImpact.GameTask.AutoArtifactSalvage { public class AutoArtifactSalvageTaskParam : BaseTaskParam { - public AutoArtifactSalvageTaskParam(int star, string? javaScript, int? maxNumToCheck, RecognitionFailurePolicy? recognitionFailurePolicy, CultureInfo? cultureInfo = null, IStringLocalizer? stringLocalizer = null) : base(cultureInfo, stringLocalizer) + public AutoArtifactSalvageTaskParam(int star, string? javaScript, string? artifactSetFilter, int? maxNumToCheck, RecognitionFailurePolicy? recognitionFailurePolicy, CultureInfo? cultureInfo = null, IStringLocalizer? stringLocalizer = null) : base(cultureInfo, stringLocalizer) { Star = star; JavaScript = javaScript; + ArtifactSetFilter = artifactSetFilter; MaxNumToCheck = maxNumToCheck; RecognitionFailurePolicy = recognitionFailurePolicy; } public int Star { get; set; } public string? JavaScript { get; set; } + public string? ArtifactSetFilter { get; set; } public int? MaxNumToCheck { get; set; } public RecognitionFailurePolicy? RecognitionFailurePolicy { get; set; } } diff --git a/BetterGenshinImpact/GameTask/AutoDomain/AutoDomainTask.cs b/BetterGenshinImpact/GameTask/AutoDomain/AutoDomainTask.cs index 285edf77..389e8c1c 100644 --- a/BetterGenshinImpact/GameTask/AutoDomain/AutoDomainTask.cs +++ b/BetterGenshinImpact/GameTask/AutoDomain/AutoDomainTask.cs @@ -1312,6 +1312,6 @@ public class AutoDomainTask : ISoloTask star = 4; } - await new AutoArtifactSalvageTask(new AutoArtifactSalvageTaskParam(star, javaScript: null, maxNumToCheck: null, recognitionFailurePolicy: null)).Start(_ct); + await new AutoArtifactSalvageTask(new AutoArtifactSalvageTaskParam(star, javaScript: null, artifactSetFilter: null, maxNumToCheck: null, recognitionFailurePolicy: null)).Start(_ct); } } diff --git a/BetterGenshinImpact/GameTask/AutoFishing/Assets/1920x1080/bait/emberglow bait.png b/BetterGenshinImpact/GameTask/AutoFishing/Assets/1920x1080/bait/emberglow bait.png deleted file mode 100644 index f7b665c6bab7c26626c29ecadeb289e9e3d84311..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8190 zcmbuB)ms!?+r@_tkr=u=hXDp2kQR_GX@`bk=n{~Dp;V9>x=TPny1ON$L!=o%B!`C* zY3a}Blug9gwbpW}hs)i~63kv|i`nv#+D}Wb&PyfIA5Ay#b z{GER61yB$Ipa2UTEDiuR1r`nk*5d$x1polxCME=3N&#>U3N z#>K+k}mSg^PzzK>!3$vO@@|I284%ZD~Zk>N(#h{U)OQr=U*><~_af9~$ew zQEZ(5fdK@B_(ZsP030lA;=j5C#a|r@2OA#?8wa1@zplTV|Ik1JN&q1hI|oFO(^kLW zH}zlo`y^T}C0JTDB1m`c90*3%M5n zYvq^WfY&ig&r1H$BjDGGO_U#@_CWB~8uHFh`R!Z!*tcP><~Fdsfuk`$_EtesRhD(~@hCMXLFyC(zCEXHhtxdDg`2!?P0Z9n zpX0M2#ODz^A%od7L?@o$ZFo+#X8Y{#edP`g;9A#~fw8-%PAo>Lkhv@L+ zP17@l4tA<8f&~pVaqtwnl3GE{KxakgfWT1o0H_Gc$lChTui&2vCHc zMNS4U$$lrbUK2_Dia^QkaAxn4c*XGthf{*^Hp3O7C4tq&Rf~X;&@+usU-LK|-$iG# zT6;PY;1phHdGyM-PfI(y%2jgNH#a= zn!Sk_vV&x6%02UTh6P0!vQx)~hX4hBm#fl7bR*I%doUOYx599dUgcPa*vUfK{5MUL z8RNUY&2jdqTHL+({>`ev==@}j)|ws7r1S}zS-*BlM4ly_BZu>%~`3>4yW{-wY zkocx9O>9(4+cnvMmWx7A02>$?81RK)FBkLv>`B?F*-z@i<~Z;0Us1ROsNiCKvLR z@)3YcV19sMkZgQ;cE@{v?q1&C*{_yeWkz3J?%tkkv~j+@e|XC}et&1;oSJfcD1UX! zb<67YOYx!mjvl)6$4}YG4IP|?avy@B3c~Vq`_Q{@f`Ax zfS#t|o3r)2wBXQ%y;0u|HD`5*#4R&Jl=LGsV`e*DwR#2wx1uY|Fl|4 z3Y~s~u&@7zAMS;?q-mvAs*z!>!3zpqhrBRephKEJBgJXh&d=edHFKo45bE$qKbNtb z5rKBQ5=B6)NGqf!vQ`(LU9DEz%EU2WdC5Da)0-R2wLnefwDsxN=S z5C8U&pA{#y;tsn_v!@83QMDL_ePR8En{mV08UF(&uitRCL0f)KE^(TH+NazN2bMqx zLn08HGS19~OTFMTW^4V;O@R%@Ae^eVuN*{Zu+I7ILtnti<**yMax_9+!w(Dhk71Ds z%M34AloCu;ZTSc=h>Wt%Ruz$V4i1X?%|r|Exm#mz?X#k_pR0f7c0~U%&$)9a8x2Yq zy>#0K$HVk@YDQO(&D{$FsPe>#_vG`xlBiE;i18uZ1Q?_v&dS69K>6x5OrMe)GR35= zO-6A(aGP@THl@#{`#HWrxTp5h9AiwVswsE%Kft(jRb>@hE*_~x)H|75HzlA_$G5mi zxxChxXS1A4*g`*+?EDMsB+D{BcyfwfmH<^w9fay5SAB@-gEN@p2KX~P%_=nuCy7Bc zM6dI9Gs_A2;5RuegJ3V5QF=l(c?QdIoxUBWA&EHWW326Pg;8t^!sxOeg5IV-m?yaE zeeh&S29(vJY3o$9oL$VVn(L8*Urc)=NKi|>yFyPxpmn5pp>Bliki5|>ir<4C83(XA zl4hjjg~W^#`z14g6Sjiqtla=tA|0oDLeKF&nU9_?|0UDpFq7g~$Y=XLfN)34HsDE+ z8aG?oDsvVxP&A*JE{8IU9nw^81H>sJS6>z>_IJBW3-ef8Ka@Ob^fa=j%O|^@Jp8=^ z|KZ^(SNgqE<>p9AwAc>+HqzTPyz2BiYC=$k(M@{^DGX}Ted-(Pa#kHIFhHwt)%63r zs>L;vbt}j>ok>7GP@^d~OoOy+%P#0nw1v$>5Keui&tW2y9xLK>j_2P?Q zn>k5g<~G{P1PFhDKvVn_T>WmEUDCK#bqj$T`lgL^KXHW_v+O%Z=c5@CO?WZSU&} z4i()!b5)_`RtiKU;kuDOltvh8x@xss@~3`Bjt2gzZ0m}b5V~CFl9E0fc8Gh|BL&jD z)n{Wz*5dEB0)ElGqqW%4!g;30#v)&Az2PUiq`BO4&AXAo7N= zD8Gkd>fw1Q%fo}9-#T-qbT?$a+^}KSv7!A}@vrNXa)ZG^*g=Lqf;k{=^(+OS%3#^w zMe@*Zf=c4M9hzT%vG7c9x9VEM$r(%ax#v+=oCUmw(4g6W)T5W+k0yu^$_h)Cyj=3= zzjo^9u`UyXXY+jAs}i56c1mJU@_6p?5h%*X8_N$vrnPYY{SNTgJ>8EFW^Z_EviBwB zOnlHk8csPz<>FNY7?jIHni$>%o}gX6;|>19=&$o=N)m?KB@xsZbpER9{iY_SM`=M~ zbMO%Ww*0d?TYqRdCJ4*qIJc@OthJmlV8|iK^p11Q%Dc(yKk$$B@dS<55fS>=rH)2= z38WJh$I?fffC(w(2kR6taOCf1+gghZP%@#mWD8o0 zdDprLd@bE~hM)vm5Jk~wQVO0dwvw|$;s39K>nOut{(nI-q*jpFp= z+o=^i0v$2or>6T!x_BQ$Pis1QI)i*Da9-%;h7bTN4xgvivUsNJ@hSDoAm7JJMone? z5bc=KZ;8dw%oRTZ1_H5H8?pqh1Y~%fEOlqv6U0f$l(09I*P%c`EOv7^!gOj6{d8>- zB`N1fcbqh_b9yZ>@3i?VduK!YTCCG$^3!^`NwL9XCroVn(+K@?=i7neDf5Y~>h@|+ zdLM3zSoQwuY-6xy{jxDHO8S)wP0|+u#XQma_IR2=>e+$WJ=BP@U2>ihQ&8gA$q-o4 zdzCz2$&;iAs-V>5eaDkluwj9( zErg@JC+_|^(^|habN2bb=aJ1I*8>mZ=U?01ju@!CCGAc4GURUmSV-#!&mAP9HNr;}3GR zGKIOJV`vg4U>FejCz*K<4ERx9OST~B(VKW$ zf3Lj=KkB_Hk;s*Booi4Uc|gFM590*_v$)*ufqkR2Zoi?_pHvB=q7u{-mgSyPZtVYg zuduRLQ(Pw&P?P$uwC+3_<5 z#FxDNi*ciQ1F%-)kmGh7Vl#saxK)#Al&BLUx!bUNI4Tn|kg{I4B5~Wa84y?)4nvEj zx&N$B?E?Bwnwx*}P0K)^I%DHBQRyC;&3U092t#g{YJKicRZx}wyXUTErHa1;7Q#!4 zD+kRRhB1xLqUh7nV(2G4NTy4d-gjTYD_>@93Y0pa=M4hWnxHDRLB>P823Itb>PhiR zqn69O)yf;5;*wd}aGG9KL%^ z*a)jQzFP53sf}Bz-~38^873SXP-XWE`st$GlneXcHI&(jmBI2$QhYM0xNaV%z z*o~?a^-065&a`Nfo3KhENpEu!k*R=aD^1l57sVBDR?KVL2dl6#K-hTdL+$=ewC>_l z4Fgk7Dcaf7cYk8&)IURpd88aofp>%tWpJ2UrWRA%zguk|=i?j=hio4K#vSkCa-PKw z%q;wbx^o;A#*j+$j|#-cMX|9LVN!(?mn>;vlY4TiUU(~ z`m5Yb{shkMjx6q{x@=CBMlEUk_%JK8O}eQ7dy^&EBib6ok)$Rz_FNE{9Bm~?AvLDDZHTr}*7f96G*%IS993yA~ za`gJ58Z=#dX(d2d;8=>+R|MHL*HMJKGurKJS?76jT2BIo$_)txrcG6dY6`;d%G4gx zPy;fy7UUy@!?v`wZ>E^Ej`s1Aut7DwN2gCa5>;>GTDZv7P6#}wmI6qa%2u;jli1?k zEmZ>iaO1AHLK%ZmxA)}A21`9J9r_x3#PS9=I>k&Qb+lSRMI8TvE=_^dRS*ZZz6*RN zZSurSa2Q0M?F#Bgmf0X_CZ*Jgf(+2us~A`| zHf0#RsA`U2G9qp`mm&_&59)Bh9m7@j$H0wO6VyD+=X`dH77Q=*26G@Va|W71M$%J} zWc3=(rMFpnr{#AiMh0pTMd}w`_2ZU8dp&w->k)*3e(53+UFtC$AOpniA*=Tx4yjD| z&jG8wjF)G*nv;vcp{R~{c#Wvo$t61l}y2vhp2K|bXDDsmS~TCnqm}0{9xJZ zUS=WR-hY$1W6ZtQtj8ZE`q!4py&4-YiN=x&Jbz3nw0#DDnJP5Bk1u|5g@vwSUJ!OV zgs8`EFE^+P6(qg}2Ixazv^2O5@@7H%CnTEhMv3D$;5U7D`twyDqHzIos*{essH*a6 zxR|T1?vAplXTBrtZY=~^9NlT#Fsg zg;kOLE%?)8GsWdUJ|`vC9jqI^)ao!!D8z2tCortLWqqAuim9c2H|0+29xXds*ppou ztD&tSsI!knzO8CjD39Lc;ozKIlk-2%y14tJW3?t~UKHRL+SJL)Jsl^FDRvu;wl_Eb zX7+;(9hyVIl_Rj|y6*MII$yv2X}6uYNuwtD9;d&BDBBVmC~UQ~8+G5!;lFjv^ryip z#^%uG98BRti~43V-!+h=T?|)lf}v{JddcCXR$VB$_?f4@Hz#UqZsIzY8uN$60VeCM zuXOY)OKIj!XgG zDqXr3ltS?(FQm3+IP+VV-;TYN4fNkd@T4XBGNC9v;szN6Uj>Ah1!S|BQ_VFH(zRfb z(=n;jO$-bSO!#LVSaQcKN(Zu+HjLgpqfDitexajuXp`OQ`b%|2VRySL%^|$Fmi-4gA+L=Kb9i)92`XKa^e5=(#9AAo9s@g#ktlGV#_b1Ji zqYHIDG?JOT2cprogD2vAD%1?@G69}c==?6_*oN>P~i@d*?vsp z`lK8s8yjTz2b&#V$gzW}gTSD%BhPGJw_?}D#?2J=Dststm~KtM>+o2-c*K%fp!j%1 zyJplWA;}BwZq#@dXzT-OO0oIpOE>FI;+Z)p(X>Ohn_}JKzO34o;L8%@!?rur) z%mB7bms4?ES%QQd%|VSAHOiG9OkG`nnz^Spr?;5EoQm3rb2BbVuY?6eIHB47f&0_R zhKz%_LNnp!Z-;$LEp(r=*BsHlRh``OMl;pm$O-7tC`A~oZa>x0PSwfgvi(Pp80BUx zP5zr&LqMn9Z=j_hdi1XPW0OeUNkzenyNe{|_h!sHT*e;kF94fBrQNy-5){6sovxp7 zVrNt(%u8ItR9r zP|j{P7>bYzITU@+HOcP!*#K z;qcn&=*TEnt{j+7a_N)_BpkynfV&8N>px^qD1qU*VP6Oxla$z%q3(SwDop0hSu;kT z$_{CQT8^qnC6ORgal1s{1onTnuJ`e7CNtVK@smEriW)Jdjx%QI>DZKQqhTs4I^@`2 zU7=`fvwnQK&Ezx^f-DLO%03Ut1h$2p9Oj=Q0FX=!d=R>b&%!TO73_XuC~+sapo zFm3brsk@Yg6~D$Is}`V--#EvtJlo`bZR!nWitr94mf-sy$6MH_#{KU^vx`ZcEvis^ zl4Gm}8Yn{Sm+PCNhvG8dD(tYMExeg)H#jbF|En9>d# zNaua)b9}WPr_a?Uo&mo26@8VtmG}1VV`Jpx?i@v5Ceuep6aEU_o#6^bCQRG}+<#ep zAb7t8dPsT%BrLX~8UIXp`#rx*B)EyYe*}!%wuWWvq!9k%iza+8#JLu7_TV!SBLDD! z5iU2IiIxDi@`rK2`hcOp^CUjLOg_G>=;-KpIr;yPQ5vk{cMo6g-bk^Pl-<)?!7QIkYaoMt&brT&KouPduI#m&bz1p!{WAr0I zbxd9P19be&4bKLd7z8XUG#pldpY;12rWt`-Rct$A@ z>eF_W?Ek@g^!)kI(Z$jAYC@^>-ZBKK+8V&FKJCQV+cU9I zx&+e;H?6wt2T#g2lYc_@>@Qncp36lfk>e1yq6W~VnHmXi3f=W89g=!uzij>qPrw=Q zheZh;V{3MCVO;)FAH~XgugP}xw zmzsf((xQtxceNM)+MsE?@k$^x(D?HZG@0`>)LEeEyF7+hSDU`tQMaSmxw;(@Q6KO% zD*I|_Sh+IZY z7+>*3CWV@E614s%(e$$U?A{T!OEy7f*c5O5!d1>0|D_J*o^RA3QrCIHEu|XN>`gs8 zzvbl%<^WfGS076*OXPLG<`m87jLyQV;DE_-6-p+UMrUQ_$rT+PT;;z7q&~@8`{lS6 g43l&G`7Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>DM50MVK~#8Nox68j z6!*UW@9*4G?rA9|F(#&%o||^k>=mT9rS~S%6cn(5fQkh>0v1FO1e9j)qGIp8_udnG z@ACS--k+I)#gKE){r&NJ%FV7LuDxS^t3Et#sJC3F$%W7Pje17IIe~vq)H4!J36b27giCM!t-gGIB41A_ z7A8^O7@q42r=C$t&b|1)cx|otntjZ~*D&$CC4NF&hICT#v$Y{b5K;7WhCkAePWBkUu}7T*KGxb>@*0n079$M1;e z`w`^t$kdOoZzx%l2A1!Ea@N(rCOiN=V*_w{|2#anc@*bQ?nFgyGF)8R!y!5ZCc~LZ z+$RVHNTBJe7b+d)W_&P1JmxB(2uY-X5Y%s6rpwvbm+R$u%Bl4OQz8_%lpb(T)g=4s zn0~xIx$>MTnXjuus#oSPb)W`J1yUSo-Nhe$ySZcc%Hdd9mV#ru=ivH<<(Qij4m%eM z(M5y8>x=Mv*4M5$k z`eOmE9Hm~5A6{OAPI6C))0A2(HwEyw$La%U$Tj6Z04aJIWO7|sHn5}XJWXw}C_fbC zS?(B}&=zZF#pC4GQHTp_1s79CbPct`g!B;1oE(eUQ({n*8G*3_L*VagrNBDGcF{m4 z@q?JjqaQyEKfDG}dtB#O4O9)RxXlP@!-)b>U7s8ekCb@A<2F^(%h3L<2;BhpTm1(h zUy_T+$eo1Rz^O+#EWDi&;nxO*BVAFE>5c_CUf5TajH+*r+Bpel_szhT(>@z`dVY( zx)Hd0aW0`Z|wx|j4+?z$(=p8bAFz3=H)}hIJ{vz zPVb(9(}$L0aGVLYu9m78Y59>bUxMUG7yVWVN*+r5@B*oSf`U~SC?%Ctsw_Xe29)P( zpvsni#{g)!^d*qyGKX59Oa%HHcm%8T((wjTETkoIii=K2P6AGDAA>7Lr{VtPg}8rd0by3+@y!j~uAmzQ z47b}p5HcY~$lPi&(>IY}%j&OFffwPwl`^6}gH>F63+q?*-Mg-+GuqV9I zbaCGRsL43iQvnsH)&k)NRUxTKj>$RYL$SsZR=$!UN&K#@^b;#L(1TNf-jLE-(TmNbj^>HBc2qwckta zD+x@>2zh}Z5X~K`z`X>m=CRpv1y2X*DjFalHJIigYhl)vNx#m3C|`gA>BNF#PbaOM znS?EidSch|WSrSIi7=<&#_5^0APModg!P#@3gXG_ld);RP^>N;ie&|(P*sqJs)l(N) zN7}P$dwE!3$BLoYFfSf!%Db{6Pr%7t6A3d9*H6tFjG!2>>@O&$6q=W&>xAfOecvya{sG%5-dAn21GFgXpxr zII&~A(y3jOaQSdCu22WpXJO0yY;2!32lsZ}!iz%$ceonWJE-~9z!Dbu)zk)E>#2`QuI~I4Z!tCfJD2tejqRwTQ7F>qOzSA+udpfe* zree6m1oXEVjUG1r;pxozJU&9X%!AGoxhse91L80aJH4u$`f|OMi0qO46frTc8VLcRcCk12vlu+zkk%nX2vT<~4HjZq`!q%mO zv3E`>u5CUI93q^9)p)w%DXRAq;1PlK0x!y5;CaalJe~fGdaCqf2F2~;=}+*m=n?J} z+{f+wySO&_CVrW84Hw4!g41Iz;9&YuY){#P%I<4X5;7m7yeFZ%Q!+g5!(i>|1Dh^^ zaPG@)fZzn6XBtxifs;dKJbi2&;;Ns|Fm17hY_d2H@B9hef&zYJ2YQ7}_DBFfsI^pO@p9*7C)giVVF zWAl;$D9QH2jIo3{wHtG08nzcMz`dz=@wn)*3S)634pRjByx~*y zp?VgttKc=|l(8-2HKkOErWbVYttoe~Z|Ff(ben@D&op@0hQP+;3+o_1HF`StW*bE~ zQg9?M%2ri;!t)x;YELPclsk{P(Vf46sY9#*Dd1GD)AOAUM-`6&OcScG=;How;L830 z?U(}Tmc)eIHx_mr@9dr1AtT9zT~#BndUhfTNBd#g2p_D;&&B zfvBr`4dIP@j3)&Qb3%Tx@dfTqxQn|5_Y}aVQ=a0^kUMyg`2de|ALALpKcDto>De@X z35Aqw`DNT1cMAvlAI0K`D&+c1M~cfxgxWI?I)%g0okhn#2#(=h;1JGnlnuH8Qo*DI zrV;8A=30o?1*zpkaijp$A?i*Ph;9S*>Mq-Xad73B=(L z6aFUlfrEXqbLB`>mi9u?pzio((HZ5y7c2PT%bx>_2~a}YfVrEnW%h(bqiCj^^XVPgMa zEST6I+omq2<5-ym+}3J5p7j_nX7e%ODTor{2dK(w+{nL$o0D#%ngs{zs`0$=InKnL z$EgA5aCYQn?2g@!6MawNV%lY#N;-oBJ&s~qm%UgYxDBg)He!YMdaU%_fRzE8FxzVx zGHs?Jwf$(sw(k#bnJ7~gk4mqx((ntn0b=WyodIwk=Iay)a5xu3w3F<7pv7yqGy~3BhMP z#9qGx*xvmBjwhbNu86((W!N=58vg_jvLE4o=0n^Wb04=x-oecgx2Ze0LH#oH2KM$o zf_a^nV~{BmZmir^?mn=N2!cx@3y;j!0y13(nO>_JnBvT#bmpK0es~FC9j2jVT>_Hl zRG5n6#CbI^>q=nCb#*}Um;!06_sM+`+ipzsj+RLD3&!q(HGmYB1=KbT*u%<)xK?_N z$8?C|%yrsU`pAppuHe+Lvv`*C43Bf3;Caz=+)liMt)6?Zx5r_eO+JsqeNW)#$lJIx znr+bNd$={~E+5~)_2GALZP+dRN{CkmU&p0E*Kj8J3Xb+Vhb`Uqp)6=I5}ijdUq-^( zF9;4jBUKLbt^vpJ=JsW%nls~-@@CV+`}(}uVH_mlXx`pF|Ne^iZyOqvAr9^JMki}r{BVzQFP*nd&+?V@oM^Q z<;2T;-o>=5I6vT5rhrR0MvzB(o}tcRZ`^UL4Bw0b?>Xr0kPZ)L_Q65HaEuRE1wx>C z(S^#X22cfBV6p(If}vGf4W#BuCxUcJWkna4N#6T6AXRu1rb$FMx(W8+PL(q!K*xl4Bfw-(&N#pxGufBFMpkq&Yti_26t;?tkw>A0u3 zoc$~I^gV(nqn==Szz&o+uf@gWUvNI=7c8(}hs+jBF}8ITD%>_>14I2_Jd01?vpAi2 z4yO{&;3T&vlg<;k=mL)Rp^JN-<#nfVApVrn{vIc>J^B!qhHgTh*G%+s7z#H!)kdm1 zCm# z;J^eX#^r=H1GqHoS3F$u2p1<`#*L*naec}SRF~@^zln``?lU|Y^8^>WU&8$n_i<$C zNnA<&mBr=~qCXyw)SnBnBxpO1u{tlbUyC8%%|_3rC5UZWfUckBVo0+Y$g!M>BHMXb z;Jh5m+^Vp|o${)}V((R0>bDw|forimcmr01Y(iD%Em+%S2R26S!M2z~*wS@BmWFIV zu17ig+K+^{V^`RC2f&_fofI1ls)!YsmDySKgS8>;q^nMNOUt7}Go+lTLv$lRfv9q% z22cYjK%Ml0W98zAgA-^swmQ`XFL0sf6Lm7dK7h0R&th-PLEInu5IGj};ooEg5a;D6;~LYq<)TFyd=-E0)w&q9%11*X}SAkVfKx%ShL z>r{vW*HV=G%)|V^WdyttYr{Fe6KbK)91L{Kg1>zn?Ae3LqKB*$sapqxB(78;tzZ&r zJyN+)m+@FYDu?n*5l4!96-ebsB|f zyZA0HW?sbIv3J=-6Xqs@obe0~)1Tl{!WC>}JF~y*LF|m)ixa)iVt?dOgg4Ei11BT( z(`o4S>13q+P>6iXc_?VP6cavQ3HOHM(e<6F82`n5K3;$^pUy`7`+0DGYZ%<#PDkga z8A$kgA_g|g!}t!xm~1s2Q*BC7U|)`D4rM5CDn-6i3Gy9FFwLn9GfZij(W84h_I#s0X%I1qXWx6AI}Zt*=_>UTxu#Ah=(Z!dU;`{|Exx!14Q*?BLH z#GSw@zxCK0zLVGeit%lh(0Sw0|I;F*e_o2X4|5Rv$pj>SHwA^wR%7@_s}Rz#3==z42lUZMq)4o323YXLFJ8?F=L}XRq020tQ=- z$587Wq+91=l=W0(SrsDNY8toGFxDy`W9-$U5O##^W{6+M)ADCH z+U+Fn4|{+|*^lvb*)!Z5`2fH6x{9s-J8`A|HSCE#h`FvyRWVuRzZKyh6d~lDYz+Op z1e3pBiE&>pLBa=l=<@z}hV(3izEOr=@65xTZ+BwDj~B4x=j+(n>;@{oyMUy3H=^^K zl_>o3I9B{{1yephhP3y0A>!SY2x>ALoxdnT@V_$Q*}eyCZG#z6zOZE9Y3ac&)ydlr zmcE?dLjz&W`Q0u)432#x;mlC|&p~Q(86eJNs7uHbq5!QIq0nQ{&<=Dom; z)SFmgT8G_k`>`%+6Ru4D1=SVRxX}MHuJ*b{CqBf(8BcI$?0sDB{VTS5Z^y|#=Wr(F z5-J1MU^Of2fo?}I^5^+5y^)2e_p*^okd;52z|!xJVbW(C5c|$d1T`#$-|I7w_3271 z{*GVT&)2Y%Fn1}K7m?I>JtE&)iJ9M=#o8ZlqUwiRDEsCjMtyVu@$YUzaHD02`eY8e zd{qe7p9Y|lbto(Yec{wMnmLixRYpL`Z460~xXL7jN7|u!fc>ue8!&Zu^0j^g(n$yD z;pmC;`Iqow)^q&AytlH;IxMqZg;n9}aWVUn0(m#{9*%T5j$5gBR8M$&+U}+r^nJZ(vi$t4MCT5xw4BkIEl^MHOK#`{4$be18+OzPpah z&yFGCy^RQJv=|W|R3hr5rRef~0URykVCf$K$HXX3L!5|)CQ!YU+=p=Lkr363$$u(U zfOLp%d<`9>22p`z3uG4;hCtUK{91es&x)VoMC2(PWjj+Dx&|vE*5GFDE!A5-%z2E% zT~FWwL0?V2iEE>8;Y{xfSmV6`+oJc-vA^PMihKzhv5k{SWyo4=>wORdS}cUqYw1Y& zs0eeu+lR&fI*JAVI)ureZ$`))r3iYX82Mjp!0I1PV@I>=O52)W$7#1m*x`BuJwIHF ziQgZ_epfzrc!YHw?_+7pyO{UGZIpa_1H(Q!gdXp$Md;g$5ZQ$J^y9VY_FXyLJM@KB zK#;21Uc=a5rV}LFBGX{0yd0710j5L;*3kg6;`IhZcYZN?A6XZqZMV*d^oYcbl3RE( z=?RWTp1`BRM>sY19A^0}#EpqJ)r!u;$&Yb?jrP8CalG$29O!uh>)Dp9>beoTl1`w~_JcJj@4(j&e1Sv$oKU^1vBmTpE3F@6VcQ2N zqEiQav7K;-oX zMENr4NS+`-=Oj&zeWGB)dAo;qJnoh;TsadTian~p-N?Iv64zNcI`}xANxPHx5LeQ! zVLPkzVZuHVa{>oqjirdnYO<0!dIf^M z%Yl_+DC~Pj5@dpMm&-tgw-k{YXc{K0UFXk%1?YLXFAi7Agv<n2JTIHfO7+`;86St%r`B;x`0hsDSv)^7R&^H(knOWf=e28qE9G9=h== zAzs7gR@bnl?G2ppeZp|QgQQP4Aobg=Sm$vUy9sj}owHZgSu;)n>+mvCRX)%_1 zE=RfBY|QYQMOY`XE_OQ>1gyZ~z$(o5U5YaIIVkp;jkPgbv9bFul(^5s1k3pd`Ctmd z-=0iouEq?4Ec%~~NP4f54fu8}{qZ<93rK-TZKSqa-Nw1F7pQXl1+gDiVQlmL*x~mC zJLt;I4DoezUvJe<~y9c)>-NDI0=W&2zV}X4MCR$F#0*+&)ZZlEfUV`0y591Ksyey1P^q7lsLY!_Y zN4{GrmUdZ#MZv2uFK{_Vwwpi|!}q;R1ih7u^pBQc`q!H<>5Fx2byj2McPFu}6~kHw zxrtie`a1Tx@QVzqMtS=)2!DSWa@!xpj-cn*OjoX_D-}pWTJBqGNypH|-kD$P#1Sf}|#hDQou{+@?X3%XhpT%QPixDU` zRUp%LBBr^OV`ra3*p{%L#b+g^+81Lg!A-Es!%UyWD0Z2H=#RT&K(k>;{&6rOK8-=I zpVATfc_tiQ8;6)Cvrzc;QC9JdnEkI)*dp-EK(3`W+uy~psA{ZtyNBdYHX-8U<;d-L z5*vN1v4&y2+?^mz1WAbV9Dq6YK&izujQHX*!W*wbK;yaar~DetfzMmB;KjUb_sKxC z@%AK4aV6UvfoM39&^$)e2U6V}V(BML1(dFIH2Gj%{05YH&PGnaBn9&7glo8#bDi6( z*qd?~lU)n3C-orCj=qGQ@rMQJ==auW<@!#mG;2C}Uu6LvlZ zx6Huk4!Q7qClnqHec{>A4*?%JVO-Y;>|RodjF3eLe2wA9kuUu1r6~ONFgCR%NNQc% zt5`#=l&$q`9O&`_JN=&_{o9=gXfhWeO&1}n%`q%MA5qDTj+IkR^y zNcVyA>jY7}YR-dA(O4R?0==!0kr$ee`)qm6j=q2kV=v)i=4Ix-T^Q$_iv`h@I6mq$ z`$7S^94XEFBlH7*guWM!KHsMy_`L|aaxmrxEoWg_i3#@knCwuDNe+dWWIr9zU&JHk zt3C+(v@53>e}sQyLeaov{BnFBoa%8>Ze0kX!jHg=)}2%IJ*-;S^{O<&gk$0qrbY1 zE{#`nWSs`b*9r(R4|e~|h3(%bz^dUev~^^U$q`aOdXDS^&ryA9AgaeY+!~M?%y{)9 zr6{MKD$fOVibPR(Deg?Uixb1o;Pj|-I5YY@R>f>Urqg&72hPO7VMnk#Wk1`Sb?hA( zsz3EXz`KD6Arm)b&f1QY_4kajZnT6Em>2QB503n}vVi2QX zP3dIZxq1oJ)zvt@buM-;&cVqY>oKLegPvZsX&T2cJ2MYq%pnz@91lt_CtPA44?gpR6 zp3Ff(NNY2i`F1|0xs;)E(G3&Do3SuSyZ{wgxkx@q8q5LdpI95SG%N3pw$ub$Wmu!PQv7$tU`Q zN<@CR9Fc5ooL?_QpU*aD3h__FHJ#Af?uo{=fUcvr>hq15!VeCyk zjA{NQ1f7Xt_E}ipZzHz%--$VFx`$YgLxuNZic6n0^jpRw=a8Qs&fenUCPmw z#mMLF01R$D9JzKgFfK9`3&&;P$i}sJc=s00>{(5a>+$&hJ>0x}9xF?8uy^$WoIQ2` zxsj7Fu*Dh#zBLy?Z_iT|H|U+YNd0Uh^1o-R*8UEA$QRheJ~FG>5qPnPjQaKnV%}Q? zyH}^6+lMPq(B>8@bchNhU0KkMx%JEI@P1>Ka-%ifX!+lnu=q;`I{s-4+BF=Ac0PW( zE9piZqye!GNcq)*{P@T&G#CTyM#0M=91cza*pRpt$A_K5j(+>Fwa*@`PuPZRw;T+y zAB7$rQ?WR%65CR@qdbTq*KQ!DnP#Ebm2Hb_If`6oBCT}_0-FS4gyjS}vK)O{^hQj3 zKcols!xYnW6vSm?efbRRshopdi}P@F;}YDx`U|1n#`?L1*tVn`r+2Q$$pbquXWRs= z?6D20->*W@yKGq+GY`H!3*LZiQ9zv;ma`GDFeN1 z2f*7h3dIrS*qFEpQ+%hxtwRLHvbCAc{8#8wfkNiliMEr`?TauZw;zTnPBSnun61y? zEEEl&fSky27#B7gb2EDr<^=3nJ_jeZZJ;B!W6RtkoZQK&>heWwT~va7o2syD!)h#w zsl?Kt;~3q3BZA&z>q3a$jmqKqRw+zx6eIk@#TeJ(2$tDDM8?mDc&rHHnw`P4X7>>F zHevp40#m~rWHrBta)K<8qC=2HonBz%H@D&OS~)ELmQ9dZ=*ZA+Pe-=>Bb)SB2cvyJ z0NjRYuJj;CcM&1FYsH4SQGx8Ke*R%{4MnU?60AE1qO)@x!*&-zZN>7K)mR$65=H){ zbmM6F+D605-4A1ZCu3Rn707VQMJESe^s!7=Q;tYL7CFyCu0sL(TZ}=bbsi>%7NI;l zACm?S!N}NHWX2?7*4V+=IJW|ORxZN!g)_0COq^MTTNl|{RnEq$vRs_rzXPilut>#D z;~tm@-iJV3W5+t7*UE&n?k9Tdn6w4>VoWi(p;90r#` z-LDYAG zc>2RCEC>TkW3jZ`GNd_Xz|z+beikum?2}ugMI05gt*0T2lgxmQV==IO7DifSAuTKt zbMo@BAio&XM~_44m<*JS9gZ2JQ?YF7I2_)v0%z&UHDx(iH>Us>kL|~r`9;`B$IhFO zk9h$*uq@~pHgr9M&GF|kuw|8MUtAh$a(hc)mci$pnecwQf}o3#+u|3@Vv(8j{XIky zrsdxLtL1|gTdW8UC?n3*}8EzmSNb3PVM9*$L|6L90=S)4w&3yTXgadg)v%*-B# zx&B*F)%heULyqC{um?CX;1;`uO>kIfNPU z_F7o}eJo78cJL2}QO?n^gvxF62odkBK?li^f1xY?l!f+$*#3{1X!pu6wDAal>o7*K zv_NC}Y9L3`kpfcOsQoyTFgYSh(XkB(#6A_GhR=INTss*Sj8Hb(An2Q(8pfhJ;R_ID> zh&;#M^$3n8-Ne;lPjO}FLzH;#f&Y6mVE4*oIK4hqxzqG!kpgLA*ayBlAIV?sLVlY& z$ocUuVXlG2-^LJTK8E~s7!^(|K90{Z{JYC+$fuZr6lJ6Re~)E&hr?wECmn{f#~8EF zRv_gUT*LandstufTSNKzu(Nw8O2TJjNz5{o2UcK)Zz)@z@o-}`mzziGH-~hvuU#yr zdY8bIrAu=V(!4Kvv>5~oTOV}l9*kCQF7S2s zM|NrwmX{P^=7dow&m4*c6GvcG$z*Dxg1B$Z9IP&%h!rykbj>nM51NUsT`v&iQEZL9 zgv*1U;PRly_;u(L%=bTv;HEQR{m&e>Jh^ZnQ0F%aRMByLb2?lIw)6W-Fz}lL82951 zR`WIJ__quNet3(cnB~qU-Qpnv-df0zme3xD4u2d^kkp^Yq2-4?VV~R;t|K{P>ku`N z64pa|!FzaL_zX{kS9%{cbNf1VMMdO%%nY7|BClfPx=lr_RSImF7d-@gdT*^bIfb)1 z=WJ>UhWsa#W8Y{vTX(@E=cy=mFGDx0RJ3(-XUmg{kXC)++cE)`w!WNU!(q!gwr#LC ztSlXonbI4}D~d30N+u=`?19_?F{sSXz>dWwSU)?LK(n!7_GD~dQh}1bMc5W|j-h=V zD;eS!)1KhsfX6tW`WT0L-NKOe%i!?tNZ7oZ16#H{cCSu`qXCp4UEVBIg(>R8DkOb! z7?Fh8{;y-;#^YlgLF4Q z(v4n(={dAF9O5I<%W)t|Ln=_KQI+Ic!VIudJJrQ zg0!3M{bOL^>Wg&SY!tayAly0;R$W8jXwezLZTg^{2i@2$SS^}5_3x&Zs$`X=ot*=M zt^JYHj}?4=ITq$+um~k#R(2|?iZcjt3RV_pVfV`En3gyk+hZ?aRhQG4?{^4iQXb)4 z%43{KdWe&K9&nD|0{ib1(D9o%*fh+94c%$`>Lj{zih?O1O_US&-QFxg=XY0d0-K8t zf6Y`mb%OOJOtZfa)2lP+#t9UGQtkgM2kjW{t(-Z3508hNawS1Zjuen`qg)&*AZ1_v zO)cFy1Nq*CnCy~=G4|ux?sQc-(Q`;I_>4?clKaAT{=w+cX&`L6gsKHl=Yic}5#q-@ zIUM<}CGfY3QFkUS-24#Lk!@9Eh`NpG$zIHhl2vEEoLrF5`=5|J2#3=0UaSiJuFQCk04-WUbLx_)Xs?S55>iH1)jyvGg zybn5r1fW&h09Z5{%ut^I>sKbi?zLPvHq0YL7N$3+aeo?*Nj{xU_fCezU&kS!$sBeb zSJ310jRZKc7UUlU=0vn;5ek=d0ojuw&bE;<1IgKuVeL+rIl6~n4D(^G>lBQ0&Ow}2 z8f-!s(mW?l^c~#~KBJQeq7Q7tL(!#EBJAQL2$Fe|Agz0JMtG;*nCO%T7uztn4v1rw zkA%rSlHEWUzl0?CWh5)f>v)gst5%?`x&~vES2-#>AH(#B8JIJ83T93mh~QE4dk+lE~|ZeUB-D{TDPyhmNZ$=(lfB7qe=?jeetcEkOfbaY}QI5D5MG5MnH z$Gy<$)ht-QIuSOnF@L^384eAn!jZ0YV6m|$Oxstcz~IcHDeXgd!h+Z|&AKUD+y zUz5<`51Lwi%siPA4OaIVh(e*A{y{{aa@Zk#*z>k5-q7mTqR4?Bkt^##atpLa|{+X#% z3jD?rDCIpW5%#?zkm8b$wNdA>Ch`RKCH#UFsf$pOHUP!_5-_V*A?5`gz#P8=*b{dX z+heX`io<3s3pj~m@egsN`+XdZy^nmmoe2Iq7nWT@)R!x=j0i^SmR(@+RywR+r8_B` z*O)&U?)J=|cCY1egq#9vg0%V@pZk|d2y40&9t|s$6Ag%>HgBb&W7ih zz;RdZuXxh&vUOy&ZRO;H_8%~Bzmm;xpQys!hWXQ$1k5JeVHb)Ng6xVHp^J(3ZVm6&g&~63TSp*#4SyH)i z?1|M;=dd#J4AynOh|^=A;ruw@!g%0t`aR6?KZwQQCvi68DfaffgKVqym}I>fySm)Q zp0GRE6LJ?>?Ki{k(*m?}2~rTfGy1`ch0Bejoy*`JXdmK_)*Sabyg3vW|Hy{rKR6Qp zV*)z;V-l?XE}>13gxK*m3=ns*9-)1VmTM#+;6+-Q4ug7h3F?Mx4NI7O)C zv1IE}ti)2K)U?N(!h-wkZ{ zzk{8AcQCTWdU(B`kG35{;WmsWAxQ7cWO$8DQWJ?Q3x!=`Bw9N9pf&r#_WvA%j{iLl z9sfF>#U_Vyw&q5QKTSeM9i#zK)Q;8r=YK`QVL(@cls1S}TLals$vzUEke-l^}%TOXU^1r<}~x? z33MYN)_|;qXn<_-L0?$)>cSk!&nvUGv?6W{DFJC45QM%~!{Kiq3%j^*bRF)0%?S|xXo~-xKKd4OOMDZ z>?7xx5B&(t(C@D}M^{Ch!Lo>xSk&b>cJ{l2!-Jop!sh^{vfWwN{U-J$ z0jopqV?gtji2q?B@-2>HiRE=Hv$%n{PZq)cjfrUgMK3t8;TLG;AZviim(MTUjjl4$ zotDwTXx7>vE#F8%t3QrHtN$8{Hh&mLc${qhz}M3yAlv?B99q~5NKSVnm?Ncs6Ia^B zbwRL0PuK)D@Zy`q(G_=)}=eqfGF~1U+Ky((A%*$ zD!ZJ)lJFClA9@rkI9KmXysscmb=ifDF%PjLt{Tg{@1gGxm5BaoE^;gmV7bjb%x`rA zk?+lc^=kz1aX;86MX6B!4M>p`p$vxm=tT9N1*Y_et-O8k^S5DW@ycK{`%?y5{#O>- zz6_L&d2`8=Y2Dy5B0&#rX~H>u*mdm;SAi&1oQYqmZ5@aTWNo2QG6N|$gX9f~te_)U5p@ycY&S5p_hVDHXV?@~jrlHj z5clBU^6ATIWZo`1w}^H7;d)lZo~p_JdvD$lroAlYsOTkj!(gbe79d4i5vn zp;KH4nmZ8a$34)J;oj;G;?8WeGhqIIoV(vihGmZsxQt}`BgIDK!J^{9LZOO_%8OWeUsoXd#=n!W3>_?I3evIj~79}1h zu|B*SYl4At>syHWd>(>6E#@O9jf$4n;Q3}gEM6Inb{{0cu8$7#Wq`UQ?A>Ke zk=0zs5AL`DD?Nd<~m~E=Y9D z#k`QCDD&TsX&$>V(Qz9_vuB*;bp@+}faTuRnAYYRLO-m4@B1?l|M^O+vU`Ej7FXfK zF|gx5MxovN{b1WWLV?u4=~a6ShX+|p6!Dy_;+QW$NIN6@%Aw4Gwkc6)>FbRjzwV3{ z|2-6~S&UTSVTEteEDTOVVl|NJM?(DIGMyNC(EzDnnnQb80#TQ@O5S{Pd;{_`4teau z@vmNph76FhPse((AC;dWd)oIxMZf_Rd+o+#mu<+j-GtGdwqT*xJyfb6j{@U=xB|a- zO5piUF(R8T!QxKOFy)5}u>EJ22C@l3_G0%zI8wPiGIW3nRxh~fQp;gHrorVD#A`hn z^0F_@w$sq=up1DCj`2Zg=HQ9uA0(jF-$tYDpC+Jnqk-tyE!Z3+{}^EkNC{B|QvubW z)(cVe5=gJne6xh8UXS~d(0$k=)`|_hx#+?g5xO`=9Bp9=LXPWtK_Fm1_8946rO6&sP8 z0gr$^#u6SK>!C#GlpJ@XV_inX!EtB|><2}|wtpnrg!|y9_C9Fdq&M39oz>kf01Zs? z!*V^eCBGRU>%!Eb)u%cj#lczyR4^Ils`Zd_zb8FsDe?KzlE`zVQSN75hDof{qpa3p zK${gv{J9d-ZLVTIAQ)n8~lXM zY*F|b86`Ck#f3UV1(1!pQdU2Ba4T|GAQ|>!daJ7JJiG^-hQ-2h2!W;%XlfKXbPGgt zJ3q7w^+yBwg}#)1_3Kj!Zx)H)1F7|n6amx+QiI7iqN=yN9z&c-+=I>(i9?kbGPUC0 z5+^G+(+NE9%3@{9YU|%|2(s)qV{rQ_ByoD_{@r|}{A(jBES{pGT{U`tunmq4b76Y3 z0Dg^UV%iV)5YuQK9ABHFR(D!){OiGFCsz8s3bF~IY@Je^*Zt;fQH0XTApMW4P)0YYj*rb zMMmz_+-fdWo1hRv@)yC3=3p08wAgM%YKQF`?OIl(u?~=*CrW zcx@7#8|K63?Q-ONbqgU4m%#D$Jhgb+`qKp1CPpYXDtNm4%mFHhRE-PGdfP@9gAS5uC^zq5)EEGYOL5T_vmyH!6?` z1j*dWfMm1H4QTMVsV+H+*B&oV9;E+u(EMT1Z`U;@A>V>Gu#PiNWx~pZX z)*S;mxs)RKqf+=ZnGSbWX~~JM4U5_4Ok`+JQQ-UtvVYUV%#V3BAltNvru#W)NdHKP z20(KeAhlwngOqAbIHu8NVQnsf$#ZUFShO+-l4{_}PF~jMOhZ|4nB)aw9hrfwA106K zPLy>&HM>$CbfvT$CV^=V(9p~9%)?!GtRv^xHi6!7`+PL~KP-mF+j6tN04{G7Fr25V zT&SQ?L5=1ivFUDt)qWh{^u|=QwFu{zse!ByVy!fYBKJ(DCAv`@C(bjC;``C%!dz&; zlyeHCI8s2m(S-ujB%#fHX@Lw^)`F}H(~AH#X<@IyGY82x$K&qIm1o^)CL07bPB zwXoJ&o*IaBo~temrikyETXkG_Wdo_Cawkl3q)3*OR6j|GGOmd2V>y+<}_8I#f^1A=0SeN8~FCTnqziv zjYk{bAT_n9uzgwLQbX#P6dDO@v)o85=UfD?I;TLg`p`A`50+)t` zHOH*q84Zi5P~}J!+P?>psx!&ZVJbHoZqy+vabIAXL~@OQRM*JDF5M^KREQIz%9T>R zYd~tw5}+@Gt1H5;fyg2yAX$LqvCOQ}5dZHGwfs{9lh;Y(E3Rze<%Ld7hH;XqA7o9D zQObv9(?PK56+w_Pz3}~+gRCRniDUVNGpuWKqX1%r8W7E-uHiYumD02;N4hC#jj&Wq zfm$<>2tWdrt=fMHU@g3tBoK9}1proYDLkt9=v(v0HSo+ukTOMxE3Ff|p!v_CaA?TB z(F|h!%166zda~+wQ-8NMe03Q)F-ss4ph$8fLsS7$E)$51)=U~r0TzIoB%HPD_#P?Q zZ(u+)K&mRPrV+yAn~)_Z4*{ve{EtAIK{TXX$>y~d+{=0iq9NrBNEPD4=*q#Izk39u-IqNH%seNWgUpA`+nH$J zSqDjA<`9(#Ruz~UkP_1Tf^{bv0P8~3&TH4a44FAn`bVP~7LeM#3j-`GIE#d=F#o35 z{Qm$c*J~>({PzDZFez=trHAS*+xYvz>fPaRdhI2MA{HZyj|alKSGfApv>uZ0%@`47 z!qGu`>L3M#QK=Omv%L8-L~*5d4GkvGS1@JPmS$W+nb5T5cAk*%)?wD>%04(|7U()9j^AO)ft$ygZaGJ)A4A`lku4fsvrabU06$~s7y;P(nm-F8RI zjfUH5^PhyQ7S@JpAnKCG%FO~&Kxu9iklNayIY_CpQXpy;MRkx$a&JRIN%08Jb9qVP;Z29p4+lsO2qwv2x3_dB*_tLjZG-HjT2-E+{~~XZbs-#i42- z>W{^Z;wE#qx#~UQ%Tk3$Rq*;DDv-*F%8i=T!m19pMs$SRsQO{b5|shYfc3J>L5h?c zj7nLbE6pIP#+dF^5c%QN^SLi!ZqYpi9o|o6L!QTmTtMcdBB}`-m6?+15(?% z>ktKo0m2-X0n>119f&$e4Pxz=pg_v_CQj6#X)tA9bE2l&{d!;$q^v%xJ9OMPmzz4K zefV04h9p<=4b>OoW*}v@757TxToabumxARqq&r%+4TU{(rGS(Li&h;%)o3ZNZCq;r z6^L%~T!Ba!1}w>w0?QnvZ0i85aia!NU1O#O3Jj&)+vUMJAoa&)FjcF4SIG!xHD;SrcM#Yf3-qLvrs0|-dNT}nJAu51?)2-~-_)Uug1+nzT50qVGVjt;Lz zFF`a3Gy$e>Yrx2{OdVnt#jOI(=c#Lr>&#RG(tv5es}H2eJjB(s!mX%&h`Q>7Sfg5J z8bIrXs6d**q}$}aiQI0rXgU~hO8}Ka1)?}n z07`pf^qS(t-+?G5vwKwm)}=?OPMj!Y)vy231}4u$EBP#P_C$Wo>TL;Zb#Rp@K-s z{(k^b)Iea>z%-LNObL}5n6fW0)${c0>PVpIl6^x4WCfPn`Xuo5*HO=}fi2)E0?`0z za^-Ve_@%ZB3`UzaQLsyiqMP}?1c*4@0H|O{NY?{H08(nMHUR1n<#kkH`ClN48W=7! zfGWv{(LcECYquUXfW{(&?8|Y(MIr@40K5c98e4NIIPz`RfT~Aw-drloBt&JaNdT$J zPZ!Dxk$O+Mla1#Y5MR!N^*T^qS6$D~Z$LC)Wz<4b`%3z2X7s}U1D9fpbByW&^8f$< M07*qoM6N<$f`TYkh5!Hn diff --git a/BetterGenshinImpact/GameTask/AutoFishing/Assets/1920x1080/bait/false worm bait.png b/BetterGenshinImpact/GameTask/AutoFishing/Assets/1920x1080/bait/false worm bait.png deleted file mode 100644 index a2d26aef19f583e4fbe443aaf033a380e3b77939..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14033 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 Y50(j^TDC1rC;$Ke07*qoM6N<$f^D2rkpKVy diff --git a/BetterGenshinImpact/GameTask/AutoFishing/Assets/1920x1080/bait/redrot bait.png b/BetterGenshinImpact/GameTask/AutoFishing/Assets/1920x1080/bait/redrot bait.png deleted file mode 100644 index 5d43fd6898193ca351c0973b5b1a02d71669108f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16962 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 diff --git a/BetterGenshinImpact/GameTask/AutoFishing/Assets/1920x1080/bait/spinelgrain bait.png b/BetterGenshinImpact/GameTask/AutoFishing/Assets/1920x1080/bait/spinelgrain bait.png deleted file mode 100644 index cf8212e52c2a8bcdf5c66cc5d0ee444f5d443218..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8149 zcmbuERa6|X(tsED!r~P7;w%)GZIM!}6e#ZQ?p`Rei$jq`ixpqoDaBc=Nb$vrwz#|f z+=qM4|9&S=Ig|M&$vKluCQtKEe*i>E?-btwP*4B>l;;L`S_H^G_x?Be59EI%JX=3? z0f5*51ArbH3KIYoh=K-0dFlhuJ$HGBF{SRLV_{>K|LB&8t$3XoL{=a-IVgNP?BZyR;>8;r@nOkU5 zJ`OoEtAJo__v8~2fRBdqyaqHN01O})s6%Z1d;*N$J^@PL`FfVdSV2F*;M)+eL7&b> z(!ssO__wGhKydI%b1!l0eDOObkz-bgCjdSD_{PQAj$z7G;GG=e?|5_b)e}JQ?Cj`| z7u#sC#{=`mtwJa039w@GcR;zE+ASg>q0;I8>ajBcJ{3=XFw78qa+**XD6;zZ@52+o zME8*i&AM1RLU|!@O!2D;MR>oK)l#t%g7(hKzQW@bL0|US!Av;@Z^JnoYoduQy#aG=S+KrI zfiB<3ly}y+Nv=H4P;T&T7gb{tjS8HhhjLx5Mv1)_)5UDSVMe;1$KC&>S2A|5j~!|#iiTAy?8AeD*GWTz+&Wt=mRfFm!cc_k#O()FTI zx+J-}@O6CIECUc#$Cc86X8=28Fm}LsQ=!Z~^hpUVo^H5uVJ0J5J3Hm(8s$T{r$Cq@RLPyUdD)ZcL+*0nwyoGAV z_ui}xnjaNi8z<7aGIVuyiRv<0q>mU@wim}vRh|G!-YUV;)SrW~q|!5Tm%P#OiAX0Q^=EdY8>Q>Y zh`H&ie~h19F(6^ENSOiCjvyUctx~L_+4BaJX!k*Ve7#sAeo8^6H|8H@WLpMDNmY(^ zkG&oo#K#rwc?7c&=7N-!4=%ktEnEWa(+%^Q7>%kT0e~4HR0CpU?S>$uATfzn=G8)s zv1cB`x!#BRDg1!UA7q8Ne)lS((Y?TT=Up3o(|XzEaEG_C=G#`X=AZBY(dMt|N|1$S ziv=wndSl!Kg-(};l-JeqQi*3@nJTR=lJ-0>#~=U z3=*Va-e?GVaMm`$uXmxhZrnFE{vzRrFRf9*vAIK&gzr-!GQL2R6AyGYCK*{U3A!LUD@iwgH-6%{GzkHy`AQh}t>pOnzSE?6d^UIT@!w - /// 已选择的鱼饵名 + /// 已选择的鱼饵类型 /// - public string selectedBaitName = string.Empty; + public BaitType? selectedBait = null; /// /// 鱼塘 @@ -44,9 +44,9 @@ namespace BetterGenshinImpact.GameTask.AutoFishing /// /// 抛竿无目标鱼失败列表 - /// 失败一次就加入一次鱼饵名,列表中同名鱼饵的数量代表该种失败了几次 + /// 失败一次就加入一次鱼饵类型,列表中同名鱼饵的数量代表该种失败了几次 /// - public List throwRodNoBaitFishFailures = new List(); + public List throwRodNoBaitFishFailures = new List(); /// /// 拉条位置的识别框 @@ -61,9 +61,9 @@ namespace BetterGenshinImpact.GameTask.AutoFishing /// /// 选鱼饵失败列表 - /// 失败一次就加入一次鱼饵名,列表中同名鱼饵的数量代表该种失败了几次 + /// 失败一次就加入一次鱼饵类型,列表中同名鱼饵的数量代表该种失败了几次 /// - public List chooseBaitFailures = new List(); + public List chooseBaitFailures = new List(); /// /// 镜头俯仰是否被行为重置 @@ -104,12 +104,12 @@ namespace BetterGenshinImpact.GameTask.AutoFishing { abort = false; throwRodNoTargetTimes = 0; - throwRodNoBaitFishFailures = new List(); + throwRodNoBaitFishFailures = new List(); fishBoxRect = default; chooseBaitUIOpening = false; - chooseBaitFailures = new List(); + chooseBaitFailures = new List(); pitchReset = true; - selectedBaitName = string.Empty; + selectedBait = null; } } } diff --git a/BetterGenshinImpact/GameTask/AutoFishing/Model/BaitType.cs b/BetterGenshinImpact/GameTask/AutoFishing/Model/BaitType.cs index 16cfdc9e..3e269cc8 100644 --- a/BetterGenshinImpact/GameTask/AutoFishing/Model/BaitType.cs +++ b/BetterGenshinImpact/GameTask/AutoFishing/Model/BaitType.cs @@ -1,54 +1,25 @@ -using System.Collections.Generic; +using System.ComponentModel; namespace BetterGenshinImpact.GameTask.AutoFishing.Model; -public class BaitType +public enum BaitType { - - public static readonly BaitType FruitPasteBait = new("fruit paste bait", "果酿饵"); - public static readonly BaitType RedrotBait = new("redrot bait", "赤糜饵"); - public static readonly BaitType FalseWormBait = new("false worm bait", "蠕虫假饵"); - public static readonly BaitType FakeFlyBait = new("fake fly bait", "飞蝇假饵"); - public static readonly BaitType SugardewBait = new("sugardew bait", "甘露饵"); - public static readonly BaitType SourBait = new("sour bait", "酸桔饵"); - public static readonly BaitType FlashingMaintenanceMekBait = new("flashing maintenance mek bait", "维护机关频闪诱饵"); - public static readonly BaitType SpinelgrainBait = new("spinelgrain bait", "澄晶果粒饵"); - public static readonly BaitType EmberglowBait = new("emberglow bait", "温火饵"); - - public static IEnumerable Values - { - get - { - yield return FruitPasteBait; - yield return RedrotBait; - yield return FalseWormBait; - yield return FakeFlyBait; - yield return SugardewBait; - yield return SourBait; - yield return FlashingMaintenanceMekBait; - yield return SpinelgrainBait; - yield return EmberglowBait; - } - } - public string Name { get; private set; } - public string ChineseName { get; private set; } - - private BaitType(string name, string chineseName) - { - Name = name; - ChineseName = chineseName; - } - - public static BaitType FromName(string name) - { - foreach (var type in Values) - { - if (type.Name == name) - { - return type; - } - } - - throw new KeyNotFoundException($"BaitType {name} not found"); - } + [Description("果酿饵")] + FruitPasteBait, + [Description("赤糜饵")] + RedrotBait, + [Description("蠕虫假饵")] + FalseWormBait, + [Description("飞蝇假饵")] + FakeFlyBait, + [Description("甘露饵")] + SugardewBait, + [Description("酸桔饵")] + SourBait, + [Description("维护机关频闪诱饵")] + FlashingMaintenanceMekBait, + [Description("澄晶果粒饵")] + SpinelgrainBait, + [Description("温火饵")] + EmberglowBait } \ No newline at end of file diff --git a/BetterGenshinImpact/GameTask/AutoFishing/Model/BigFishType.cs b/BetterGenshinImpact/GameTask/AutoFishing/Model/BigFishType.cs index fdbab99d..6cf0f561 100644 --- a/BetterGenshinImpact/GameTask/AutoFishing/Model/BigFishType.cs +++ b/BetterGenshinImpact/GameTask/AutoFishing/Model/BigFishType.cs @@ -1,4 +1,4 @@ -using System.Collections.Generic; +using System.Collections.Generic; using System.Linq; namespace BetterGenshinImpact.GameTask.AutoFishing.Model; @@ -9,27 +9,27 @@ namespace BetterGenshinImpact.GameTask.AutoFishing.Model; /// public class BigFishType { - public static readonly BigFishType Medaka = new("medaka", "fruit paste bait", "花鳉", 0); - public static readonly BigFishType LargeMedaka = new("large medaka", "fruit paste bait", "大花鳉", 1); - public static readonly BigFishType Stickleback = new("stickleback", "redrot bait", "棘鱼", 2); - public static readonly BigFishType Koi = new("koi", "fake fly bait", "假龙", 3); - public static readonly BigFishType KoiHead = new("koi head", "fake fly bait", "假龙头", 3); - public static readonly BigFishType Butterflyfish = new("butterflyfish", "false worm bait", "蝶鱼", 4); - public static readonly BigFishType Pufferfish = new("pufferfish", "fake fly bait", "炮鲀", 5); + public static readonly BigFishType Medaka = new("medaka", BaitType.FruitPasteBait, "花鳉", 0); + public static readonly BigFishType LargeMedaka = new("large medaka", BaitType.FruitPasteBait, "大花鳉", 1); + public static readonly BigFishType Stickleback = new("stickleback", BaitType.RedrotBait, "棘鱼", 2); + public static readonly BigFishType Koi = new("koi", BaitType.FakeFlyBait, "假龙", 3); + public static readonly BigFishType KoiHead = new("koi head", BaitType.FakeFlyBait, "假龙头", 3); + public static readonly BigFishType Butterflyfish = new("butterflyfish", BaitType.FalseWormBait, "蝶鱼", 4); + public static readonly BigFishType Pufferfish = new("pufferfish", BaitType.FakeFlyBait, "炮鲀", 5); - public static readonly BigFishType Ray = new("ray", "fake fly bait", "鳐", 6); + public static readonly BigFishType Ray = new("ray", BaitType.FakeFlyBait, "鳐", 6); - // public static readonly BigFishType FormaloRay = new("formalo ray", "fake fly bait", "佛玛洛鳐"); - // public static readonly BigFishType DivdaRay = new("divda ray", "fake fly bait", "迪芙妲鳐"); - public static readonly BigFishType Angler = new("angler", "sugardew bait", "角鲀", 7); - public static readonly BigFishType AxeMarlin = new("axe marlin", "sugardew bait", "斧枪鱼", 8); - public static readonly BigFishType HeartfeatherBass = new("heartfeather bass", "sour bait", "心羽鲈", 9); - public static readonly BigFishType MaintenanceMek = new("maintenance mek", "flashing maintenance mek bait", "维护机关", 10); - public static readonly BigFishType Unihornfish = new("unihornfish", "spinelgrain bait", "独角鱼", 10); - public static readonly BigFishType Sunfish = new("sunfish", "spinelgrain bait", "翻车鲀", 7); - public static readonly BigFishType Rapidfish = new("rapidfish", "spinelgrain bait", "斗士急流鱼", 9); - public static readonly BigFishType PhonyUnihornfish = new("phony unihornfish", "emberglow bait", "燃素独角鱼", 10); - public static readonly BigFishType MagmaRapidfish = new("magma rapidfish", "emberglow bait", "炽岩斗士急流鱼", 9); + // public static readonly BigFishType FormaloRay = new("formalo ray", "飞蝇假饵", "佛玛洛鳐"); + // public static readonly BigFishType DivdaRay = new("divda ray", "飞蝇假饵", "迪芙妲鳐"); + public static readonly BigFishType Angler = new("angler", BaitType.SugardewBait, "角鲀", 7); + public static readonly BigFishType AxeMarlin = new("axe marlin", BaitType.SugardewBait, "斧枪鱼", 8); + public static readonly BigFishType HeartfeatherBass = new("heartfeather bass", BaitType.SourBait, "心羽鲈", 9); + public static readonly BigFishType MaintenanceMek = new("maintenance mek", BaitType.FlashingMaintenanceMekBait, "维护机关", 10); + public static readonly BigFishType Unihornfish = new("unihornfish", BaitType.SpinelgrainBait, "独角鱼", 10); + public static readonly BigFishType Sunfish = new("sunfish", BaitType.SpinelgrainBait, "翻车鲀", 7); + public static readonly BigFishType Rapidfish = new("rapidfish", BaitType.SpinelgrainBait, "斗士急流鱼", 9); + public static readonly BigFishType PhonyUnihornfish = new("phony unihornfish", BaitType.EmberglowBait, "燃素独角鱼", 10); + public static readonly BigFishType MagmaRapidfish = new("magma rapidfish", BaitType.EmberglowBait, "炽岩斗士急流鱼", 9); public static IEnumerable Values @@ -59,15 +59,15 @@ public class BigFishType } public string Name { get; private set; } - public string BaitName { get; private set; } + public BaitType BaitType { get; private set; } public string ChineseName { get; private set; } public int NetIndex { get; private set; } - private BigFishType(string name, string baitName, string chineseName, int netIndex) + private BigFishType(string name, BaitType baitType, string chineseName, int netIndex) { Name = name; - BaitName = baitName; + BaitType = baitType; ChineseName = chineseName; NetIndex = netIndex; } diff --git a/BetterGenshinImpact/GameTask/AutoStygianOnslaught/AutoStygianOnslaughtTask.cs b/BetterGenshinImpact/GameTask/AutoStygianOnslaught/AutoStygianOnslaughtTask.cs index 29d64a85..76472706 100644 --- a/BetterGenshinImpact/GameTask/AutoStygianOnslaught/AutoStygianOnslaughtTask.cs +++ b/BetterGenshinImpact/GameTask/AutoStygianOnslaught/AutoStygianOnslaughtTask.cs @@ -609,7 +609,7 @@ public class AutoStygianOnslaughtTask : ISoloTask star = 4; } - await new AutoArtifactSalvageTask(new AutoArtifactSalvageTaskParam(star, javaScript: null, maxNumToCheck: null, recognitionFailurePolicy: null)).Start(_ct); + await new AutoArtifactSalvageTask(new AutoArtifactSalvageTaskParam(star, javaScript: null, artifactSetFilter: null, maxNumToCheck: null, recognitionFailurePolicy: null)).Start(_ct); } diff --git a/BetterGenshinImpact/GameTask/GetGridIcons/GetGridIconsTask.cs b/BetterGenshinImpact/GameTask/GetGridIcons/GetGridIconsTask.cs index 3afeb078..3ac3678d 100644 --- a/BetterGenshinImpact/GameTask/GetGridIcons/GetGridIconsTask.cs +++ b/BetterGenshinImpact/GameTask/GetGridIcons/GetGridIconsTask.cs @@ -3,6 +3,7 @@ using BetterGenshinImpact.Core.Simulator; using BetterGenshinImpact.GameTask.AutoArtifactSalvage; using BetterGenshinImpact.GameTask.Common; using BetterGenshinImpact.GameTask.Common.Job; +using BetterGenshinImpact.GameTask.Model; using BetterGenshinImpact.GameTask.Model.Area; using BetterGenshinImpact.GameTask.Model.GameUI; using BetterGenshinImpact.Helpers.Extensions; @@ -198,13 +199,8 @@ public class GetGridIconsTask : ISoloTask { using (FileStream fs = new FileStream(filePath, FileMode.Create, FileAccess.Write, FileShare.None)) { - double scale = TaskContext.Instance().SystemInfo.AssetScale; - double width = 60; - double height = 60; // 宽高缩放似乎不一致,似乎在2.05:2.15之间,但不知道怎么测定 - Rect iconRect = new Rect((int)(itemRegion.Width / 2 - 237 * scale - width / 2), (int)(itemRegion.Height / 2 - height / 2), (int)width, (int)height); - Mat crop = itemRegion.SrcMat.SubMat(iconRect); - using Mat resize = crop.Resize(new Size(125, 125)); - resize.ToBitmap().Save(fs, System.Drawing.Imaging.ImageFormat.Png); + using Mat img125 = CropResizeArtifactSetFilterGridIcon(itemRegion); + img125.ToBitmap().Save(fs, System.Drawing.Imaging.ImageFormat.Png); } logger.LogInformation("图片保存成功:{Text}", fileName); } @@ -230,6 +226,16 @@ public class GetGridIconsTask : ISoloTask } } + internal static Mat CropResizeArtifactSetFilterGridIcon(ImageRegion itemRegion, ISystemInfo? systemInfo = null) + { + double scale = (systemInfo ?? TaskContext.Instance().SystemInfo).AssetScale; + double width = 60; + double height = 60; // 宽高缩放似乎不一致,似乎在2.05:2.15之间,但不知道怎么测定 + Rect iconRect = new Rect((int)(itemRegion.Width / 2 - 237 * scale - width / 2), (int)(itemRegion.Height / 2 - height / 2), (int)width, (int)height); + Mat crop = itemRegion.SrcMat.SubMat(iconRect); + return crop.Resize(new Size(125, 125)); + } + /// /// OCR检测★字符很不稳定,因此用cv /// 非常简陋的色彩检测,请传入聚焦的图像,勿带入可能的干扰 diff --git a/BetterGenshinImpact/GameTask/GetGridIcons/GridIconsAccuracyTestTask.cs b/BetterGenshinImpact/GameTask/GetGridIcons/GridIconsAccuracyTestTask.cs index 8b97f248..63101ddd 100644 --- a/BetterGenshinImpact/GameTask/GetGridIcons/GridIconsAccuracyTestTask.cs +++ b/BetterGenshinImpact/GameTask/GetGridIcons/GridIconsAccuracyTestTask.cs @@ -111,7 +111,6 @@ public class GridIconsAccuracyTestTask : ISoloTask { itemRegion.Click(); Task task1 = Delay(300, ct); - var sadf = task1.Status; // 用模型推理得到的结果 Task<(string, int)> task2 = Task.Run(() => @@ -161,7 +160,7 @@ public class GridIconsAccuracyTestTask : ISoloTask /// /// /// - /// + /// (预测名称, 预测星级) /// public static (string, int) Infer(Mat mat, InferenceSession session, Dictionary prototypes) { diff --git a/BetterGenshinImpact/GameTask/Model/GameUI/GridScreen.cs b/BetterGenshinImpact/GameTask/Model/GameUI/GridScreen.cs index ae5cb74d..f09d1456 100644 --- a/BetterGenshinImpact/GameTask/Model/GameUI/GridScreen.cs +++ b/BetterGenshinImpact/GameTask/Model/GameUI/GridScreen.cs @@ -215,7 +215,7 @@ namespace BetterGenshinImpact.GameTask.Model.GameUI { return false; } - return Math.Abs((float)r.Width / r.Height - 0.8) < 0.05; // 按形状筛选 + return Math.Abs((float)r.Width / r.Height - 0.81) < 0.05; // 按形状筛选 }).ToArray(); IEnumerable boxes = contours.Select(Cv2.BoundingRect); diff --git a/BetterGenshinImpact/Helpers/Extensions/EnumExtensions.cs b/BetterGenshinImpact/Helpers/Extensions/EnumExtensions.cs index 6e5d5cb5..6a4ea194 100644 --- a/BetterGenshinImpact/Helpers/Extensions/EnumExtensions.cs +++ b/BetterGenshinImpact/Helpers/Extensions/EnumExtensions.cs @@ -1,8 +1,10 @@ +using BetterGenshinImpact.Model; using System; using System.Collections.Generic; using System.ComponentModel; +using System.Diagnostics.CodeAnalysis; using System.Linq; -using BetterGenshinImpact.Model; +using System.Reflection; namespace BetterGenshinImpact.Helpers.Extensions; @@ -18,6 +20,33 @@ public static class EnumExtensions ?.Description ?? value.ToString(); } + public static bool TryGetEnumValueFromDescription(this string description, [NotNullWhen(true)] out T? result) where T : struct, Enum + { + result = null; + if (string.IsNullOrEmpty(description)) + return false; + + var type = typeof(T); + foreach (var field in type.GetFields(BindingFlags.Public | BindingFlags.Static)) + { + if (Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute)) + is DescriptionAttribute attribute) + { + if (attribute.Description.Equals(description, StringComparison.OrdinalIgnoreCase)) + { + var value = field.GetValue(null); + if (value is T enumValue) + { + result = enumValue; + return true; + } + return false; + } + } + } + return false; + } + public static int GetOrder(this Enum value) { return value.GetType() diff --git a/BetterGenshinImpact/View/Pages/TaskSettingsPage.xaml b/BetterGenshinImpact/View/Pages/TaskSettingsPage.xaml index 08aed9eb..db677611 100644 --- a/BetterGenshinImpact/View/Pages/TaskSettingsPage.xaml +++ b/BetterGenshinImpact/View/Pages/TaskSettingsPage.xaml @@ -2377,6 +2377,38 @@ Text="{Binding Config.AutoArtifactSalvageConfig.JavaScript, Mode=TwoWay}" TextWrapping="Wrap" Cursor="IBeam" /> + + + + + + + + + + + 按套装筛选 + + + 利用游戏自带的筛选功能先行筛选 + + 一般填写套装内生之花名,可填入多个名称;留空则不用 + + + diff --git a/BetterGenshinImpact/View/Windows/OcrDialog.xaml.cs b/BetterGenshinImpact/View/Windows/OcrDialog.xaml.cs index 7b14f09d..8b32bc18 100644 --- a/BetterGenshinImpact/View/Windows/OcrDialog.xaml.cs +++ b/BetterGenshinImpact/View/Windows/OcrDialog.xaml.cs @@ -28,7 +28,7 @@ public partial class OcrDialog this.widthRatio = widthRatio; this.heightRatio = heightRatio; this.javaScript = javaScript; - this.autoArtifactSalvageTask = new AutoArtifactSalvageTask(new AutoArtifactSalvageTaskParam(5, null, null, null, new CultureInfo(TaskContext.Instance().Config.OtherConfig.GameCultureInfoName))); + this.autoArtifactSalvageTask = new AutoArtifactSalvageTask(new AutoArtifactSalvageTaskParam(5, null, null, null, null, new CultureInfo(TaskContext.Instance().Config.OtherConfig.GameCultureInfoName))); InitializeComponent(); diff --git a/BetterGenshinImpact/ViewModel/Pages/HotKeyPageViewModel.cs b/BetterGenshinImpact/ViewModel/Pages/HotKeyPageViewModel.cs index d9203245..7ed038bd 100644 --- a/BetterGenshinImpact/ViewModel/Pages/HotKeyPageViewModel.cs +++ b/BetterGenshinImpact/ViewModel/Pages/HotKeyPageViewModel.cs @@ -584,7 +584,7 @@ public partial class HotKeyPageViewModel : ObservableObject, IViewModel Config.HotKeyConfig.Test1HotkeyType, (_, _) => { - Task.Run(async () => { await new AutoArtifactSalvageTask(new AutoArtifactSalvageTaskParam(star: 4, null, null, null)).Start(new CancellationToken()); }); + Task.Run(async () => { await new AutoArtifactSalvageTask(new AutoArtifactSalvageTaskParam(star: 4, null, null, null, null)).Start(new CancellationToken()); }); } )); diff --git a/BetterGenshinImpact/ViewModel/Pages/TaskSettingsPageViewModel.cs b/BetterGenshinImpact/ViewModel/Pages/TaskSettingsPageViewModel.cs index 2af3dea0..96bd4c4f 100644 --- a/BetterGenshinImpact/ViewModel/Pages/TaskSettingsPageViewModel.cs +++ b/BetterGenshinImpact/ViewModel/Pages/TaskSettingsPageViewModel.cs @@ -537,6 +537,7 @@ public partial class TaskSettingsPageViewModel : ViewModel .RunSoloTaskAsync(new AutoArtifactSalvageTask(new AutoArtifactSalvageTaskParam( int.Parse(Config.AutoArtifactSalvageConfig.MaxArtifactStar), Config.AutoArtifactSalvageConfig.JavaScript, + Config.AutoArtifactSalvageConfig.ArtifactSetFilter, Config.AutoArtifactSalvageConfig.MaxNumToCheck, Config.AutoArtifactSalvageConfig.RecognitionFailurePolicy ))); diff --git a/Test/BetterGenshinImpact.UnitTest/GameTaskTests/AutoArtifactSalvageTests/AutoArtifactSalvageTaskTests.cs b/Test/BetterGenshinImpact.UnitTest/GameTaskTests/AutoArtifactSalvageTests/AutoArtifactSalvageTaskTests.cs index b89248b5..bc450699 100644 --- a/Test/BetterGenshinImpact.UnitTest/GameTaskTests/AutoArtifactSalvageTests/AutoArtifactSalvageTaskTests.cs +++ b/Test/BetterGenshinImpact.UnitTest/GameTaskTests/AutoArtifactSalvageTests/AutoArtifactSalvageTaskTests.cs @@ -98,7 +98,7 @@ namespace BetterGenshinImpact.UnitTest.GameTaskTests.AutoArtifactSalvageTests CultureInfo cultureInfo = new CultureInfo("zh-Hans"); // - AutoArtifactSalvageTask sut = new AutoArtifactSalvageTask(new AutoArtifactSalvageTaskParam(5, null, null, null, cultureInfo, this.stringLocalizer), new FakeLogger()); + AutoArtifactSalvageTask sut = new AutoArtifactSalvageTask(new AutoArtifactSalvageTaskParam(5, null, null, null, null, cultureInfo, this.stringLocalizer), new FakeLogger()); string result = PaddleResultDic.GetOrAdd(screenshot, screenshot_ => { using Mat mat = new Mat(@$"..\..\..\Assets\AutoArtifactSalvage\{screenshot_}"); @@ -203,7 +203,7 @@ namespace BetterGenshinImpact.UnitTest.GameTaskTests.AutoArtifactSalvageTests */ // - AutoArtifactSalvageTask sut = new AutoArtifactSalvageTask(new AutoArtifactSalvageTaskParam(5, null, null, null, cultureInfo, this.stringLocalizer), new FakeLogger()); + AutoArtifactSalvageTask sut = new AutoArtifactSalvageTask(new AutoArtifactSalvageTaskParam(5, null, null, null, null, cultureInfo, this.stringLocalizer), new FakeLogger()); ArtifactStat result = sut.GetArtifactStat(mat, paddle.Get(cultureInfo.Name), out string _); // @@ -237,7 +237,7 @@ namespace BetterGenshinImpact.UnitTest.GameTaskTests.AutoArtifactSalvageTests CultureInfo cultureInfo = new CultureInfo("zh-Hans"); // - AutoArtifactSalvageTask sut = new AutoArtifactSalvageTask(new AutoArtifactSalvageTaskParam(5, null, null, null, cultureInfo, this.stringLocalizer), new FakeLogger()); + AutoArtifactSalvageTask sut = new AutoArtifactSalvageTask(new AutoArtifactSalvageTaskParam(5, null, null, null, null, cultureInfo, this.stringLocalizer), new FakeLogger()); ArtifactStat artifact = sut.GetArtifactStat(mat, paddle.Get(), out string _); bool result = IsMatchJavaScript(artifact, js); diff --git a/Test/BetterGenshinImpact.UnitTest/GameTaskTests/AutoFishingTests/BehavioursTests.ChooseBait.cs b/Test/BetterGenshinImpact.UnitTest/GameTaskTests/AutoFishingTests/BehavioursTests.ChooseBait.cs index cf70aaa8..d5cfa27d 100644 --- a/Test/BetterGenshinImpact.UnitTest/GameTaskTests/AutoFishingTests/BehavioursTests.ChooseBait.cs +++ b/Test/BetterGenshinImpact.UnitTest/GameTaskTests/AutoFishingTests/BehavioursTests.ChooseBait.cs @@ -1,4 +1,4 @@ -using BehaviourTree; +using BehaviourTree; using BetterGenshinImpact.GameTask.AutoFishing; using BetterGenshinImpact.GameTask.AutoFishing.Model; using BetterGenshinImpact.GameTask.Model.Area; @@ -17,7 +17,7 @@ namespace BetterGenshinImpact.UnitTest.GameTaskTests.AutoFishingTests { [Theory] [InlineData(@"20250225101300361_ChooseBait_Succeeded.png", new string[] { "medaka", "butterflyfish", "butterflyfish", "pufferfish" })] - [InlineData(@"20250226161354285_ChooseBait_Succeeded.png", new string[] { "medaka", "medaka" })] + [InlineData(@"20250226161354285_ChooseBait_Succeeded.png", new string[] { "medaka", "medaka" })] // todo 更新用例 [InlineData(@"202503160917566615@900p.png", new string[] { "pufferfish" })] /// /// 测试各种选取鱼饵,结果为成功 @@ -35,7 +35,7 @@ namespace BetterGenshinImpact.UnitTest.GameTaskTests.AutoFishingTests }; // - ChooseBait sut = new ChooseBait("-", blackboard, new FakeLogger(), false, systemInfo, new FakeInputSimulator()); + ChooseBait sut = new ChooseBait("-", blackboard, new FakeLogger(), false, systemInfo, new FakeInputSimulator(), this.session, this.prototypes); BehaviourStatus actual = sut.Tick(imageRegion); // @@ -69,11 +69,11 @@ namespace BetterGenshinImpact.UnitTest.GameTaskTests.AutoFishingTests FakeTimeProvider fakeTimeProvider = new FakeTimeProvider(dateTime); // - ChooseBait sut = new ChooseBait("-", blackboard, new FakeLogger(), false, systemInfo, new FakeInputSimulator(), fakeTimeProvider); + ChooseBait sut = new ChooseBait("-", blackboard, new FakeLogger(), false, systemInfo, new FakeInputSimulator(), this.session, this.prototypes, fakeTimeProvider); BehaviourStatus actual = sut.Tick(imageRegion); // - Assert.True(String.IsNullOrEmpty(blackboard.selectedBaitName)); + Assert.Null(blackboard.selectedBait); Assert.True(blackboard.chooseBaitUIOpening); Assert.Equal(BehaviourStatus.Running, actual); @@ -84,7 +84,7 @@ namespace BetterGenshinImpact.UnitTest.GameTaskTests.AutoFishingTests actual = sut.Tick(imageRegion); // - Assert.False(String.IsNullOrEmpty(blackboard.selectedBaitName)); + Assert.NotNull(blackboard.selectedBait); Assert.True(blackboard.chooseBaitUIOpening); Assert.Equal(BehaviourStatus.Running, actual); @@ -95,7 +95,7 @@ namespace BetterGenshinImpact.UnitTest.GameTaskTests.AutoFishingTests actual = sut.Tick(imageRegion); // - Assert.True(String.IsNullOrEmpty(blackboard.selectedBaitName)); + Assert.Null(blackboard.selectedBait); Assert.False(blackboard.chooseBaitUIOpening); Assert.Equal(BehaviourStatus.Failed, actual); } @@ -124,15 +124,15 @@ namespace BetterGenshinImpact.UnitTest.GameTaskTests.AutoFishingTests #region 第1次失败 // - ChooseBait sut = new ChooseBait("-", blackboard, new FakeLogger(), false, systemInfo, new FakeInputSimulator(), fakeTimeProvider); + ChooseBait sut = new ChooseBait("-", blackboard, new FakeLogger(), false, systemInfo, new FakeInputSimulator(), this.session, this.prototypes, fakeTimeProvider); BehaviourStatus actual = sut.Tick(imageRegion); fakeTimeProvider.SetUtcNow(dateTime.AddSeconds(3)); actual = sut.Tick(imageRegion); // - Assert.True(String.IsNullOrEmpty(blackboard.selectedBaitName)); + Assert.Null(blackboard.selectedBait); Assert.Equal(BehaviourStatus.Failed, actual); - Assert.Single(blackboard.chooseBaitFailures.Where(f => f == "fake fly bait")); + Assert.Single(blackboard.chooseBaitFailures.Where(f => f == BaitType.FakeFlyBait)); #endregion #region 第2次失败 @@ -146,9 +146,9 @@ namespace BetterGenshinImpact.UnitTest.GameTaskTests.AutoFishingTests actual = sut.Tick(imageRegion); // - Assert.True(String.IsNullOrEmpty(blackboard.selectedBaitName)); + Assert.Null(blackboard.selectedBait); Assert.Equal(BehaviourStatus.Failed, actual); - Assert.Equal(2, blackboard.chooseBaitFailures.Where(f => f == "fake fly bait").Count()); + Assert.Equal(2, blackboard.chooseBaitFailures.Where(f => f == BaitType.FakeFlyBait).Count()); Assert.False(blackboard.abort); #endregion @@ -165,9 +165,9 @@ namespace BetterGenshinImpact.UnitTest.GameTaskTests.AutoFishingTests actual = sut.Tick(imageRegion); // - Assert.True(String.IsNullOrEmpty(blackboard.selectedBaitName)); + Assert.Null(blackboard.selectedBait); Assert.Equal(BehaviourStatus.Failed, actual); - Assert.Single(blackboard.chooseBaitFailures.Where(f => f == "spinelgrain bait")); + Assert.Single(blackboard.chooseBaitFailures.Where(f => f == BaitType.SpinelgrainBait)); #endregion #region sunfish受到遮挡,medaka再次出现,第4次成功,并钓起medaka @@ -183,9 +183,9 @@ namespace BetterGenshinImpact.UnitTest.GameTaskTests.AutoFishingTests actual = sut.Tick(imageRegion); // - Assert.False(String.IsNullOrEmpty(blackboard.selectedBaitName)); + Assert.NotNull(blackboard.selectedBait); // todo 更新用例 Assert.Equal(BehaviourStatus.Succeeded, actual); - Assert.Single(blackboard.chooseBaitFailures.Where(f => f == "spinelgrain bait")); + Assert.Single(blackboard.chooseBaitFailures.Where(f => f == BaitType.SpinelgrainBait)); #endregion #region sunfish再次出现,第5次失败 @@ -201,9 +201,9 @@ namespace BetterGenshinImpact.UnitTest.GameTaskTests.AutoFishingTests actual = sut.Tick(imageRegion); // - Assert.True(String.IsNullOrEmpty(blackboard.selectedBaitName)); + Assert.Null(blackboard.selectedBait); Assert.Equal(BehaviourStatus.Failed, actual); - Assert.Equal(2, blackboard.chooseBaitFailures.Where(f => f == "spinelgrain bait").Count()); + Assert.Equal(2, blackboard.chooseBaitFailures.Where(f => f == BaitType.SpinelgrainBait).Count()); #endregion } @@ -230,15 +230,15 @@ namespace BetterGenshinImpact.UnitTest.GameTaskTests.AutoFishingTests #region 第1次失败 // - ChooseBait sut = new ChooseBait("-", blackboard, new FakeLogger(), false, systemInfo, new FakeInputSimulator(), fakeTimeProvider); + ChooseBait sut = new ChooseBait("-", blackboard, new FakeLogger(), false, systemInfo, new FakeInputSimulator(), this.session, this.prototypes, fakeTimeProvider); BehaviourStatus actual = sut.Tick(imageRegion); fakeTimeProvider.SetUtcNow(dateTime.AddSeconds(3)); actual = sut.Tick(imageRegion); // - Assert.True(String.IsNullOrEmpty(blackboard.selectedBaitName)); + Assert.Null(blackboard.selectedBait); Assert.Equal(BehaviourStatus.Failed, actual); - Assert.Single(blackboard.chooseBaitFailures.Where(f => f == "fake fly bait")); + Assert.Single(blackboard.chooseBaitFailures.Where(f => f == BaitType.FakeFlyBait)); #endregion #region koi受到遮挡,第2次失败 @@ -254,9 +254,9 @@ namespace BetterGenshinImpact.UnitTest.GameTaskTests.AutoFishingTests actual = sut.Tick(imageRegion); // - Assert.True(String.IsNullOrEmpty(blackboard.selectedBaitName)); + Assert.Null(blackboard.selectedBait); Assert.Equal(BehaviourStatus.Failed, actual); - Assert.Single(blackboard.chooseBaitFailures.Where(f => f == "spinelgrain bait")); + Assert.Single(blackboard.chooseBaitFailures.Where(f => f == BaitType.SpinelgrainBait)); Assert.False(blackboard.abort); #endregion @@ -273,9 +273,9 @@ namespace BetterGenshinImpact.UnitTest.GameTaskTests.AutoFishingTests actual = sut.Tick(imageRegion); // - Assert.True(String.IsNullOrEmpty(blackboard.selectedBaitName)); + Assert.Null(blackboard.selectedBait); Assert.Equal(BehaviourStatus.Failed, actual); - Assert.Equal(2, blackboard.chooseBaitFailures.Where(f => f == "fake fly bait").Count()); + Assert.Equal(2, blackboard.chooseBaitFailures.Where(f => f == BaitType.FakeFlyBait).Count()); #endregion #region 第4次失败 @@ -291,9 +291,9 @@ namespace BetterGenshinImpact.UnitTest.GameTaskTests.AutoFishingTests actual = sut.Tick(imageRegion); // - Assert.True(String.IsNullOrEmpty(blackboard.selectedBaitName)); + Assert.Null(blackboard.selectedBait); Assert.Equal(BehaviourStatus.Failed, actual); - Assert.Equal(2, blackboard.chooseBaitFailures.Where(f => f == "spinelgrain bait").Count()); + Assert.Equal(2, blackboard.chooseBaitFailures.Where(f => f == BaitType.SpinelgrainBait).Count()); #endregion } } diff --git a/Test/BetterGenshinImpact.UnitTest/GameTaskTests/AutoFishingTests/BehavioursTests.GetFishpond.cs b/Test/BetterGenshinImpact.UnitTest/GameTaskTests/AutoFishingTests/BehavioursTests.GetFishpond.cs index 80a9f460..c0615176 100644 --- a/Test/BetterGenshinImpact.UnitTest/GameTaskTests/AutoFishingTests/BehavioursTests.GetFishpond.cs +++ b/Test/BetterGenshinImpact.UnitTest/GameTaskTests/AutoFishingTests/BehavioursTests.GetFishpond.cs @@ -1,8 +1,9 @@ -using BetterGenshinImpact.GameTask.AutoFishing; +using BetterGenshinImpact.GameTask.AutoFishing; using BehaviourTree; using BetterGenshinImpact.GameTask.Model.Area; using Microsoft.Extensions.Time.Testing; using OpenCvSharp; +using BetterGenshinImpact.GameTask.AutoFishing.Model; namespace BetterGenshinImpact.UnitTest.GameTaskTests.AutoFishingTests { @@ -38,10 +39,10 @@ namespace BetterGenshinImpact.UnitTest.GameTaskTests.AutoFishingTests } [Theory] - [InlineData("20250225101257889_GetFishpond_Succeeded.png", new string[] { "fruit paste bait", "fruit paste bait", "redrot bait", "redrot bait" }, new string[] { "false worm bait", "false worm bait", "fake fly bait", "fake fly bait" })] + [InlineData("20250225101257889_GetFishpond_Succeeded.png", new BaitType[] { BaitType.FruitPasteBait, BaitType.FruitPasteBait, BaitType.RedrotBait, BaitType.RedrotBait }, new BaitType[] { BaitType.FalseWormBait, BaitType.FalseWormBait, BaitType.FakeFlyBait, BaitType.FakeFlyBait })] /// 测试鱼的鱼饵均在失败列表中且被忽略,结果为运行中 /// - public void GetFishpondTest_AllIgnored_ShouldBeRunning(string screenshot1080p, IEnumerable chooseBaitfailures, IEnumerable throwRodNoTargetFishfailures) + public void GetFishpondTest_AllIgnored_ShouldBeRunning(string screenshot1080p, IEnumerable chooseBaitfailures, IEnumerable throwRodNoTargetFishfailures) { // Mat mat = new Mat(@$"..\..\..\Assets\AutoFishing\{screenshot1080p}"); diff --git a/Test/BetterGenshinImpact.UnitTest/GameTaskTests/AutoFishingTests/BehavioursTests.ThrowRod.cs b/Test/BetterGenshinImpact.UnitTest/GameTaskTests/AutoFishingTests/BehavioursTests.ThrowRod.cs index 0850d817..5c0bc914 100644 --- a/Test/BetterGenshinImpact.UnitTest/GameTaskTests/AutoFishingTests/BehavioursTests.ThrowRod.cs +++ b/Test/BetterGenshinImpact.UnitTest/GameTaskTests/AutoFishingTests/BehavioursTests.ThrowRod.cs @@ -1,4 +1,4 @@ -using BehaviourTree; +using BehaviourTree; using BetterGenshinImpact.GameTask.AutoFishing; using BetterGenshinImpact.GameTask.Model.Area.Converter; using BetterGenshinImpact.GameTask.Model.Area; @@ -6,18 +6,19 @@ using Microsoft.Extensions.Time.Testing; using OpenCvSharp; using BehaviourTree.Composites; using BehaviourTree.FluentBuilder; +using BetterGenshinImpact.GameTask.AutoFishing.Model; namespace BetterGenshinImpact.UnitTest.GameTaskTests.AutoFishingTests { public partial class BehavioursTests { [Theory] - [InlineData(@"20250225101304534_ThrowRod_Succeeded.png", "false worm bait")] - [InlineData(@"20250226162217468_ThrowRod_Succeeded.png", "fruit paste bait")] + [InlineData(@"20250225101304534_ThrowRod_Succeeded.png", BaitType.FalseWormBait)] + [InlineData(@"20250226162217468_ThrowRod_Succeeded.png", BaitType.FruitPasteBait)] /// /// 测试各种抛竿,结果为成功 /// - public void ThrowRodTest_VariousFish_ShouldSuccess(string screenshot1080p, string selectedBaitName) + public void ThrowRodTest_VariousFish_ShouldSuccess(string screenshot1080p, BaitType selectedBait) { // Mat mat = new Mat(@$"..\..\..\Assets\AutoFishing\{screenshot1080p}"); @@ -25,7 +26,7 @@ namespace BetterGenshinImpact.UnitTest.GameTaskTests.AutoFishingTests var blackboard = new Blackboard(Predictor, sleep: i => { }) { - selectedBaitName = selectedBaitName + selectedBait = selectedBait }; FakeTimeProvider fakeTimeProvider = new FakeTimeProvider(); @@ -40,12 +41,12 @@ namespace BetterGenshinImpact.UnitTest.GameTaskTests.AutoFishingTests } [Theory] - [InlineData(@"20250225101304534_ThrowRod_Succeeded.png", "redrot bait")] - [InlineData(@"20250225101304534_ThrowRod_Succeeded.png", "fake fly bait")] + [InlineData(@"20250225101304534_ThrowRod_Succeeded.png", BaitType.RedrotBait)] + [InlineData(@"20250225101304534_ThrowRod_Succeeded.png", BaitType.FakeFlyBait)] /// /// 测试各种抛竿,未满足HutaoFisher判定,结果为运行中 /// - public void ThrowRodTest_VariousFish_ShouldFail(string screenshot1080p, string selectedBaitName) + public void ThrowRodTest_VariousFish_ShouldFail(string screenshot1080p, BaitType selectedBait) { // Mat mat = new Mat(@$"..\..\..\Assets\AutoFishing\{screenshot1080p}"); @@ -53,7 +54,7 @@ namespace BetterGenshinImpact.UnitTest.GameTaskTests.AutoFishingTests var blackboard = new Blackboard(Predictor, sleep: i => { }) { - selectedBaitName = selectedBaitName + selectedBait = selectedBait }; FakeTimeProvider fakeTimeProvider = new FakeTimeProvider(); @@ -68,11 +69,11 @@ namespace BetterGenshinImpact.UnitTest.GameTaskTests.AutoFishingTests } [Theory] - [InlineData(@"20250225101304534_ThrowRod_Succeeded.png", "flashing maintenance mek bait")] + [InlineData(@"20250225101304534_ThrowRod_Succeeded.png", BaitType.FlashingMaintenanceMekBait)] /// /// 测试各种抛竿,无鱼饵适用鱼,结果为失败 /// - public void ThrowRodTest_NoBaitFish_ShouldFail(string screenshot1080p, string selectedBaitName) + public void ThrowRodTest_NoBaitFish_ShouldFail(string screenshot1080p, BaitType selectedBait) { // Mat mat = new Mat(@$"..\..\..\Assets\AutoFishing\{screenshot1080p}"); @@ -80,7 +81,7 @@ namespace BetterGenshinImpact.UnitTest.GameTaskTests.AutoFishingTests var blackboard = new Blackboard(Predictor, sleep: i => { }) { - selectedBaitName = selectedBaitName + selectedBait = selectedBait }; FakeTimeProvider fakeTimeProvider = new FakeTimeProvider(); @@ -119,7 +120,7 @@ namespace BetterGenshinImpact.UnitTest.GameTaskTests.AutoFishingTests var blackboard = new Blackboard(Predictor, sleep: i => { }) { - selectedBaitName = "fake fly bait" + selectedBait = GameTask.AutoFishing.Model.BaitType.FakeFlyBait }; // diff --git a/Test/BetterGenshinImpact.UnitTest/GameTaskTests/AutoFishingTests/BehavioursTests.cs b/Test/BetterGenshinImpact.UnitTest/GameTaskTests/AutoFishingTests/BehavioursTests.cs index a6fbfb1a..7507bee7 100644 --- a/Test/BetterGenshinImpact.UnitTest/GameTaskTests/AutoFishingTests/BehavioursTests.cs +++ b/Test/BetterGenshinImpact.UnitTest/GameTaskTests/AutoFishingTests/BehavioursTests.cs @@ -2,7 +2,9 @@ using BetterGenshinImpact.Core.Recognition.OCR; using BetterGenshinImpact.Core.Recognition.ONNX; using BetterGenshinImpact.GameTask.AutoFishing; using BetterGenshinImpact.UnitTest.CoreTests.RecognitionTests.OCRTests; +using BetterGenshinImpact.UnitTest.GameTaskTests.GetGridIconsTests; using Microsoft.Extensions.Localization; +using Microsoft.ML.OnnxRuntime; namespace BetterGenshinImpact.UnitTest.GameTaskTests.AutoFishingTests { @@ -15,12 +17,17 @@ namespace BetterGenshinImpact.UnitTest.GameTaskTests.AutoFishingTests private readonly PaddleFixture paddle; private readonly IStringLocalizer stringLocalizer; + private readonly InferenceSession session; + private readonly Dictionary prototypes; - public BehavioursTests(PaddleFixture paddle, TorchFixture torch, LocalizationFixture localization) + + public BehavioursTests(PaddleFixture paddle, TorchFixture torch, LocalizationFixture localization, GridIconModelFixture iconModel) { this.paddle = paddle; this.useTorch = torch.UseTorch; this.stringLocalizer = localization.CreateStringLocalizer(); + this.session = iconModel.modelLoader.Value.session; + this.prototypes = iconModel.modelLoader.Value.prototypes; } private IOcrService OcrService => paddle.Get();

@p#AOL0$(30Xn{}w7`%9c3W!aNz+F-XF8BmB- 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 W*FnYOyj6Sv0000 prototypes); Blackboard blackboard = new Blackboard(_predictor, this.Sleep, AutoFishingAssets.Instance); @@ -64,7 +70,7 @@ namespace BetterGenshinImpact.GameTask.AutoFishing .PushLeaf(() => new TurnAround("转圈圈调整视角", blackboard, _logger, param.SaveScreenshotOnKeyTick, input)) .PushLeaf(() => new FindFishTimeout("找到鱼", 20, blackboard, _logger, param.SaveScreenshotOnKeyTick)) .End() - .PushLeaf(() => new EnterFishingMode("进入钓鱼模式", blackboard, _logger, param.SaveScreenshotOnKeyTick, input, cultureInfo: param.GameCultureInfo, stringLocalizer: param.StringLocalizer)) + .PushLeaf(() => new EnterFishingMode("进入钓鱼模式", blackboard, _logger, param.SaveScreenshotOnKeyTick, input, session, prototypes, cultureInfo: param.GameCultureInfo, stringLocalizer: param.StringLocalizer)) .UntilFailed(@"\") .Sequence("一直钓鱼直到没鱼") .AlwaysSucceed(@"\") @@ -79,7 +85,7 @@ namespace BetterGenshinImpact.GameTask.AutoFishing .End() .PushLeaf(() => new FindFishTimeout("确认初始状态和找到鱼", 10, blackboard, _logger, param.SaveScreenshotOnKeyTick)) .End() - .PushLeaf(() => new ChooseBait("选择鱼饵", blackboard, _logger, param.SaveScreenshotOnKeyTick, TaskContext.Instance().SystemInfo, input)) + .PushLeaf(() => new ChooseBait("选择鱼饵", blackboard, _logger, param.SaveScreenshotOnKeyTick, TaskContext.Instance().SystemInfo, input, session, prototypes)) .MySimpleParallel("抛竿直到成功或出错", policy: SimpleParallelPolicy.OnlyOneMustSucceed) .UntilSuccess("重复抛竿") .Sequence("-") @@ -345,6 +351,8 @@ namespace BetterGenshinImpact.GameTask.AutoFishing { private readonly IInputSimulator input; private readonly Blackboard blackboard; + private readonly InferenceSession session; + private readonly Dictionary prototypes; private readonly TimeProvider timeProvider; private DateTimeOffset? pressFWaitEndTime; private DateTimeOffset? clickWhiteConfirmButtonWaitEndTime; @@ -352,11 +360,13 @@ namespace BetterGenshinImpact.GameTask.AutoFishing private readonly string fishingLocalizedString; public EnterFishingMode(string name, Blackboard blackboard, ILogger logger, bool saveScreenshotOnTerminate, - IInputSimulator input, TimeProvider? timeProvider = null, CultureInfo? cultureInfo = null, IStringLocalizer? stringLocalizer = null) : base(name, + IInputSimulator input, InferenceSession session, Dictionary prototypes, TimeProvider? timeProvider = null, CultureInfo? cultureInfo = null, IStringLocalizer? stringLocalizer = null) : base(name, logger, saveScreenshotOnTerminate) { this.blackboard = blackboard; this.input = input; + this.session = session; + this.prototypes = prototypes; this.timeProvider = timeProvider ?? TimeProvider.System; this.fishingLocalizedString = stringLocalizer == null ? "钓鱼" : stringLocalizer.WithCultureGet(cultureInfo, "钓鱼"); } @@ -380,7 +390,17 @@ namespace BetterGenshinImpact.GameTask.AutoFishing clickWhiteConfirmButtonWaitEndTime < timeProvider.GetLocalNow()) && Bv.ClickWhiteConfirmButton(imageRegion)) { - logger.LogInformation("点击开始钓鱼"); + Mat subMat = imageRegion.SrcMat.SubMat(new Rect((int)(0.824 * imageRegion.Width), (int)(0.669 * imageRegion.Height), (int)(0.065 * imageRegion.Width), (int)(0.065 * imageRegion.Width))); + using Mat resized = subMat.Resize(new Size(125, 125)); + (string predName, _) = GridIconsAccuracyTestTask.Infer(resized, this.session, this.prototypes); + if (predName.TryGetEnumValueFromDescription(out this.blackboard.selectedBait)) + { + logger.LogInformation("点击开始钓鱼,当前鱼饵为{bait}", this.blackboard.selectedBait.Value.GetDescription()); + } + else + { + logger.LogInformation("点击开始钓鱼,当前鱼饵未识别"); + } this.blackboard.pitchReset = true; diff --git a/BetterGenshinImpact/GameTask/AutoFishing/Behaviours.cs b/BetterGenshinImpact/GameTask/AutoFishing/Behaviours.cs index c06628b5..2aef44cc 100644 --- a/BetterGenshinImpact/GameTask/AutoFishing/Behaviours.cs +++ b/BetterGenshinImpact/GameTask/AutoFishing/Behaviours.cs @@ -1,26 +1,30 @@ using BehaviourTree; using BetterGenshinImpact.Core.Recognition; using BetterGenshinImpact.Core.Recognition.OCR; +using BetterGenshinImpact.Core.Recognition.OpenCv; +using BetterGenshinImpact.Core.Simulator; using BetterGenshinImpact.GameTask.AutoFishing.Model; +using BetterGenshinImpact.GameTask.GetGridIcons; +using BetterGenshinImpact.GameTask.Model; using BetterGenshinImpact.GameTask.Model.Area; +using BetterGenshinImpact.GameTask.Model.GameUI; using BetterGenshinImpact.Helpers; +using BetterGenshinImpact.Helpers.Extensions; using BetterGenshinImpact.View.Drawable; +using Compunet.YoloSharp; +using Fischless.WindowsInput; +using Microsoft.Extensions.Localization; using Microsoft.Extensions.Logging; +using Microsoft.ML.OnnxRuntime; using OpenCvSharp; using System; using System.Collections.Generic; using System.Diagnostics; +using System.Globalization; +using System.Linq; using static Vanara.PInvoke.User32; using Color = System.Drawing.Color; using Pen = System.Drawing.Pen; -using System.Linq; -using Fischless.WindowsInput; -using BetterGenshinImpact.Core.Recognition.OpenCv; -using BetterGenshinImpact.Core.Simulator; -using BetterGenshinImpact.GameTask.Model; -using System.Globalization; -using Compunet.YoloSharp; -using Microsoft.Extensions.Localization; namespace BetterGenshinImpact.GameTask.AutoFishing { @@ -66,11 +70,11 @@ namespace BetterGenshinImpact.GameTask.AutoFishing { blackboard.fishpond = fishpond; - string[] chooseBaitfailuresIgnoredBaits = blackboard.chooseBaitFailures.GroupBy(f => f).Where(g => g.Count() >= ChooseBait.MAX_FAILED_TIMES).Select(g => g.Key).ToArray(); - string[] throwRodNoTargetFishfailuresIgnoredBaits = blackboard.throwRodNoBaitFishFailures.GroupBy(f => f).Where(g => g.Count() >= ThrowRod.MAX_NO_BAIT_FISH_TIMES).Select(g => g.Key).ToArray(); + BaitType[] chooseBaitfailuresIgnoredBaits = blackboard.chooseBaitFailures.GroupBy(f => f).Where(g => g.Count() >= ChooseBait.MAX_FAILED_TIMES).Select(g => g.Key).ToArray(); + BaitType[] throwRodNoTargetFishfailuresIgnoredBaits = blackboard.throwRodNoBaitFishFailures.GroupBy(f => f).Where(g => g.Count() >= ThrowRod.MAX_NO_BAIT_FISH_TIMES).Select(g => g.Key).ToArray(); logger.LogInformation("定位到鱼塘:" + string.Join('、', fishpond.Fishes.GroupBy(f => f.FishType) - .Select(g => $"{g.Key.ChineseName}{g.Count()}条" + ((chooseBaitfailuresIgnoredBaits.Contains(g.Key.BaitName) || throwRodNoTargetFishfailuresIgnoredBaits.Contains(g.Key.BaitName)) ? "(忽略)" : "")) + .Select(g => $"{g.Key.ChineseName}{g.Count()}条" + ((chooseBaitfailuresIgnoredBaits.Contains(g.Key.BaitType) || throwRodNoTargetFishfailuresIgnoredBaits.Contains(g.Key.BaitType)) ? "(忽略)" : "")) )); int i = 0; foreach (var fish in fishpond.Fishes) @@ -80,8 +84,8 @@ namespace BetterGenshinImpact.GameTask.AutoFishing blackboard.Sleep(1000); drawContent.ClearAll(); if (blackboard.fishpond.Fishes.Any(f => - !chooseBaitfailuresIgnoredBaits.Contains(f.FishType.BaitName) - && !throwRodNoTargetFishfailuresIgnoredBaits.Contains(f.FishType.BaitName))) + !chooseBaitfailuresIgnoredBaits.Contains(f.FishType.BaitType) + && !throwRodNoTargetFishfailuresIgnoredBaits.Contains(f.FishType.BaitType))) { return BehaviourStatus.Succeeded; } @@ -100,6 +104,8 @@ namespace BetterGenshinImpact.GameTask.AutoFishing { private readonly ISystemInfo systemInfo; private readonly IInputSimulator input; + private readonly InferenceSession session; + private readonly Dictionary prototypes; private readonly Blackboard blackboard; private readonly TimeProvider timeProvider; private DateTimeOffset? chooseBaitUIOpenWaitEndTime; // 等待选鱼饵界面出现并尝试找鱼饵的结束时间 @@ -110,11 +116,13 @@ namespace BetterGenshinImpact.GameTask.AutoFishing /// /// /// - public ChooseBait(string name, Blackboard blackboard, ILogger logger, bool saveScreenshotOnTerminat, ISystemInfo systemInfo, IInputSimulator input, TimeProvider? timeProvider = null) : base(name, logger, saveScreenshotOnTerminat) + public ChooseBait(string name, Blackboard blackboard, ILogger logger, bool saveScreenshotOnTerminat, ISystemInfo systemInfo, IInputSimulator input, InferenceSession session, Dictionary prototypes, TimeProvider? timeProvider = null) : base(name, logger, saveScreenshotOnTerminat) { this.blackboard = blackboard; this.systemInfo = systemInfo; this.input = input; + this.session = session; + this.prototypes = prototypes; this.timeProvider = timeProvider ?? TimeProvider.System; } @@ -122,7 +130,7 @@ namespace BetterGenshinImpact.GameTask.AutoFishing { if (this.Status == BehaviourStatus.Ready) { - if (blackboard.fishpond.Fishes.Any(f => f.FishType.BaitName == blackboard.selectedBaitName)) // 如果该种鱼没钓完就不用换饵 + if (blackboard.fishpond.Fishes.Any(f => f.FishType.BaitType == blackboard.selectedBait)) // 如果该种鱼没钓完就不用换饵 { return BehaviourStatus.Succeeded; } @@ -136,72 +144,86 @@ namespace BetterGenshinImpact.GameTask.AutoFishing return BehaviourStatus.Running; } - blackboard.selectedBaitName = blackboard.fishpond.Fishes.GroupBy(f => f.FishType.BaitName) + blackboard.selectedBait = blackboard.fishpond.Fishes.GroupBy(f => f.FishType.BaitType) .Where(b => !blackboard.chooseBaitFailures.GroupBy(f => f).Where(g => g.Count() >= MAX_FAILED_TIMES).Any(g => g.Key == b.Key)) // 不能是已经失败两次的饵 .OrderByDescending(g => g.Count()).First().Key; // 选择最多鱼吃的饵料 - logger.LogInformation("选择鱼饵 {Text}", BaitType.FromName(blackboard.selectedBaitName).ChineseName); + logger.LogInformation("选择鱼饵 {Text}", blackboard.selectedBait.GetDescription()); // 寻找鱼饵 - var ro = new RecognitionObject - { - Name = "ChooseBait", - RecognitionType = RecognitionTypes.TemplateMatch, - TemplateImageMat = GameTaskManager.LoadAssetImage("AutoFishing", $"bait\\{blackboard.selectedBaitName}.png", systemInfo), - Threshold = 0.8, - Use3Channels = true, - DrawOnWindow = false - }.InitTemplate(); + using ImageRegion singleRowGrid = imageRegion.DeriveCrop(0.28 * imageRegion.Width, 0.37 * imageRegion.Height, 0.45 * imageRegion.Width, 0.22 * imageRegion.Height); + using Mat grey = singleRowGrid.SrcMat.CvtColor(ColorConversionCodes.BGR2GRAY); + using Mat canny = grey.Canny(20, 40); - using var resRa = imageRegion.Find(ro); - if (resRa.IsEmpty()) - { - if (timeProvider.GetLocalNow() >= chooseBaitUIOpenWaitEndTime) + Cv2.FindContours(canny, out Point[][] contours, out _, RetrievalModes.External, ContourApproximationModes.ApproxSimple, null); + contours = contours + .Where(c => { - logger.LogWarning("没有找到目标鱼饵"); - input.Keyboard.KeyPress(VK.VK_ESCAPE); + Rect r = Cv2.BoundingRect(c); + if (r.Width < 0.065 * imageRegion.Width * 0.80) // 剔除太小的 + { + return false; + } + if (r.Height == 0) + { + return false; + } + return Math.Abs((float)r.Width / r.Height - 0.81) < 0.05; // 按形状筛选 + }).ToArray(); + IEnumerable boxes = contours.Select(Cv2.BoundingRect); + + foreach (Rect box in boxes) + { + using ImageRegion resRa = singleRowGrid.DeriveCrop(box); + using Mat img125 = resRa.SrcMat.GetGridIcon(); + (string predName, _) = GridIconsAccuracyTestTask.Infer(img125, this.session, this.prototypes); + if (predName == blackboard.selectedBait.GetDescription()) + { + resRa.Click(); + blackboard.Sleep(700); + // 可能重复点击,所以固定界面点击下 + imageRegion.ClickTo((int)(imageRegion.Width * 0.675), (int)(imageRegion.Height / 3d)); + blackboard.Sleep(200); + // 点击确定 + using var ra = imageRegion.Find(new RecognitionObject + { + Name = "BtnWhiteConfirm", + RecognitionType = RecognitionTypes.TemplateMatch, + TemplateImageMat = GameTaskManager.LoadAssetImage(@"Common\Element", "btn_white_confirm.png", systemInfo), + Use3Channels = true + }.InitTemplate()); + if (ra.IsExist()) + { + ra.Click(); + } blackboard.chooseBaitUIOpening = false; logger.LogInformation("退出换饵界面"); + blackboard.Sleep(500); // 等待界面切换 - blackboard.chooseBaitFailures.Add(blackboard.selectedBaitName); - if (blackboard.chooseBaitFailures.Count(f => f == blackboard.selectedBaitName) >= MAX_FAILED_TIMES) - { - logger.LogWarning($"本次将忽略{BaitType.FromName(blackboard.selectedBaitName).ChineseName}"); - } - - blackboard.selectedBaitName = string.Empty; - - return BehaviourStatus.Failed; + return BehaviourStatus.Succeeded; } - else + } + + if (timeProvider.GetLocalNow() >= chooseBaitUIOpenWaitEndTime) + { + logger.LogWarning("没有找到目标鱼饵"); + input.Keyboard.KeyPress(VK.VK_ESCAPE); + blackboard.chooseBaitUIOpening = false; + logger.LogInformation("退出换饵界面"); + + blackboard.chooseBaitFailures.Add(blackboard.selectedBait.Value); + if (blackboard.chooseBaitFailures.Count(f => f == blackboard.selectedBait) >= MAX_FAILED_TIMES) { - return BehaviourStatus.Running; + logger.LogWarning($"本次将忽略{blackboard.selectedBait.GetDescription()}"); } + + blackboard.selectedBait = null; + + return BehaviourStatus.Failed; } else { - resRa.Click(); - blackboard.Sleep(700); - // 可能重复点击,所以固定界面点击下 - imageRegion.ClickTo((int)(imageRegion.Width * 0.675), (int)(imageRegion.Height / 3d)); - blackboard.Sleep(200); - // 点击确定 - using var ra = imageRegion.Find(new RecognitionObject - { - Name = "BtnWhiteConfirm", - RecognitionType = RecognitionTypes.TemplateMatch, - TemplateImageMat = GameTaskManager.LoadAssetImage(@"Common\Element", "btn_white_confirm.png", systemInfo), - Use3Channels = true - }.InitTemplate()); - if (ra.IsExist()) - { - ra.Click(); - } - blackboard.chooseBaitUIOpening = false; - logger.LogInformation("退出换饵界面"); - blackboard.Sleep(500); // 等待界面切换 + return BehaviourStatus.Running; } - - return BehaviourStatus.Succeeded; } } @@ -374,10 +396,10 @@ namespace BetterGenshinImpact.GameTask.AutoFishing // 找到落点最近的鱼 currentFish = null; - string[] ignoredBaits = blackboard.throwRodNoBaitFishFailures.GroupBy(f => f).Where(g => g.Count() >= MAX_NO_BAIT_FISH_TIMES).Select(g => g.Key).ToArray(); + BaitType[] ignoredBaits = blackboard.throwRodNoBaitFishFailures.GroupBy(f => f).Where(g => g.Count() >= MAX_NO_BAIT_FISH_TIMES).Select(g => g.Key).ToArray(); var list = fishpond.Fishes - .Where(f => !ignoredBaits.Contains(f.FishType.BaitName)) // 不能是已经失败两次的饵; - .Where(f => f.FishType.BaitName == blackboard.selectedBaitName).OrderByDescending(f => f.Confidence) + .Where(f => !ignoredBaits.Contains(f.FishType.BaitType)) // 不能是已经失败两次的饵; + .Where(f => f.FishType.BaitType == blackboard.selectedBait).OrderByDescending(f => f.Confidence) .ToList(); if (list.Count > 0) { @@ -393,13 +415,17 @@ namespace BetterGenshinImpact.GameTask.AutoFishing { // 没有找到鱼饵适用鱼,重新选择鱼饵 blackboard.throwRodNoBaitFish = true; - blackboard.throwRodNoBaitFishFailures.Add(blackboard.selectedBaitName); - if (blackboard.throwRodNoBaitFishFailures.Count(f => f == blackboard.selectedBaitName) >= MAX_NO_BAIT_FISH_TIMES) + if (blackboard.selectedBait == null) { - logger.LogWarning($"本次将忽略{BaitType.FromName(blackboard.selectedBaitName).ChineseName}"); + throw new NullReferenceException(); + } + blackboard.throwRodNoBaitFishFailures.Add(blackboard.selectedBait.Value); + if (blackboard.throwRodNoBaitFishFailures.Count(f => f == blackboard.selectedBait) >= MAX_NO_BAIT_FISH_TIMES) + { + logger.LogWarning("本次将忽略{bait}", blackboard.selectedBait.GetDescription()); } - blackboard.selectedBaitName = string.Empty; + blackboard.selectedBait = null; logger.LogInformation("没有找到鱼饵适用鱼"); input.Mouse.LeftButtonUp(); blackboard.Sleep(2000); diff --git a/BetterGenshinImpact/GameTask/AutoFishing/Blackboard.cs b/BetterGenshinImpact/GameTask/AutoFishing/Blackboard.cs index f460772f..1e17deaa 100644 --- a/BetterGenshinImpact/GameTask/AutoFishing/Blackboard.cs +++ b/BetterGenshinImpact/GameTask/AutoFishing/Blackboard.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using BetterGenshinImpact.Core.Recognition.ONNX; using BetterGenshinImpact.GameTask.AutoFishing.Assets; @@ -18,9 +18,9 @@ namespace BetterGenshinImpact.GameTask.AutoFishing public bool abort = false; ///