From a9a5af2b5e268b295be157a262ad30469f096cb3 Mon Sep 17 00:00:00 2001 From: guoh064 <50830808+guoh064@users.noreply.github.com> Date: Sat, 1 Aug 2026 23:31:54 +0800 Subject: [PATCH] Upd: Shop Scroll --- .../cn/shop/MEDAL_SHOP_SCROLL_AREA_250814.png | Bin 4002 -> 8798 bytes .../en/shop/MEDAL_SHOP_SCROLL_AREA_250814.png | Bin 4002 -> 0 bytes module/shop/assets.py | 2 +- module/shop/shop_medal.py | 45 +++++++++--------- 4 files changed, 23 insertions(+), 24 deletions(-) delete mode 100644 assets/en/shop/MEDAL_SHOP_SCROLL_AREA_250814.png diff --git a/assets/cn/shop/MEDAL_SHOP_SCROLL_AREA_250814.png b/assets/cn/shop/MEDAL_SHOP_SCROLL_AREA_250814.png index fb1b080af8d0f8542cee31cdf9a83545619cfe3a..c0c0848b2037bff9856bdb01ad9ebbefb61a103a 100644 GIT binary patch literal 8798 zcmeHLYgAKL7QP8VLO=-!EmhPIXbaVl2O*FQksyem14g7u)i$|FZZw6EKq3T{5-h&j zT5U)B)D~B@PCJaH?^dluskK$7+IFTxORM-8tu4jST57A{oO|{Ogf%m3mTS$-p8=PP zn{)Tsk8gkbJ11<=m&_U~m>{4iYHU$qeknzTqDSsYJ{SGcO_|N1C{E&vvT}DRT_Sn%-kA2W zu3?Vl^4~n#NomYSgUK(y=KEsaS@Z2bY+e6S!aFg?Cq(?&-jlSy#PiT!Y%jh4oc+eW zO`WGcd12i6?T(Y!u?T-mA5r*!X# zr+}>hV<-CYpe?0l}gCFfOoZOjM zR9zjrBx2kH(-urxvTgZtXB_Wfl(6n#(I+!!UpJI4i#~U-I_K2aE5CX#q}jUlCF|Ts zea5lEJI|WZ+V2{3U-bJTu27yTpFh`n%j^CG!_WS{pVE%LzW>C4`q!LJ zzdxeAp7dzW%(SPM#K~%=wTy{-{9M?L2Tye*D ze#i6Yge+Wi#8AO?J-;(kv*h=jLFL4eK2Rsd%bJM)-j zw!#%P%={H4W#$zXX0=6}GhLAF(I5wQ#!ZVn_R1=k#-kNuzZ&$+E=$ECY~rraipz`j zqC7_pBT}X*(`1sF9$T$KJY68luCZ7(rTGQK1^T2FFLS${8mY9dt}d-EJ9#qlM66HRVKzK+!v{NcilS%D%Y48r0duAS;|y0c4X>8QRO2-&MGR_5A9$fSZcF7@h$}R2urukIt z#Hz|LTWK>*o8_m8)7A08JrdC%7R?UGU#-(Nnw^)ELN37skW*mYFWBTqB5mhEg2@1 z5yN0t7PF?nQDdi3J8gD)DI;}OEyXWbz%{x0BCS}F22t^fzLIuZ(FQaFwknIG&NXaY zX0tQ%-874*JX0l8spT0NGFeu-La81$TENt}5Eogma#>os62D;^qe0~$Xla(I$N^qQ z)oAi+7~1WqDRVd~wPH2}5xaBfbuk(!3+<-!X*YwM$`lzIxlAL^ER(A=8EW)ARhFfZ z1=%|+Hf#OAvu4LflnqTUw7F3Hdb|WPHJ_=5Pw=tQhKETc!egPK%}|1iu4ODZPvi?; znU~R3OBtjegs_2i+dmmAQMYTu~Jqs0@Y?q{{fF|Y!DdNjyQ;X4Y~C|oy%z)cyCvTGEsn?m5Gj7Qn^ zAA?IU{AG%%LN}l~^i}C@UGru1HEWD%&a8au2K%q&z1_buqcikCt-_Ox6zEPhM@@*gTG5Rx#!2b&ZorevLgEas8<>v}e$=6pL;|qQ0LFDC7 zUP-HZEQb?GQ9N#E(6YUglZ0MV0})&_ah*FGpX3%$Ar!TSQgL}QirUOKhCV`#L0;Is z6l+AW>lELJ{usETdm*2!b{i&iM6%&@EsayS@vL<$_iCz^UGiR`+GkLdG3q&r4dyMN za^hsHs}!Dp^JLaj%RHae%Z3pQOvPJtVz1pB&ALnU5_ic*^I$u5=Sg-C#k%%QuLLu3 zV<>jHELJx35?4;?*m@imNjiSmKrQf%h}fSA8&jOzjcf)n7qkJOJg3$|Qk=>V41$2O zsta=PE{5Ovl%b@BO5BkN*quKsC?3XG=%LyGPfLa+nY~aBNn_if_3weA7wn;h4yo?zz3o4h>ee# zA@r#NOS{3IpJf0_2U-|@@fQW&FXTr}#0cx137_Jyv4_stfGu3ozC)hbQMd+vw>%Qh zU~Q@7klnERu^%dY8c~~rr5vRbefFk3a@43pq1(S-Xf?%5tq{{=X@viOz zy0!R1G5b>dIoP$1!eI7?8$oZ@Q2l&7{mEqdHwHM)fud0!L@$Vth+)jbp*bQS3=b6Q zQ*l}WfFy4~LSYUN8dyB;@D7ZPVV^K-+QR+?{D*X)U#wHH~v5d%@_$I8524UWF9K%q3fZ6F{?r+u%)57Ux7!}%fJibuxks67)mNX zsDv{|wi7GJvRG2uCC&qDP(iE@im3T*oZ%Wbs0YSlJ>i#=gXcI==NZ(AE+Hn)VDEP@ zutfY8KlL_rbM^Uw@ zQ3R2JmGM~1`OQb_LDl&ItrPk%7WWdl;5~ANXkhcY_S_k)z&}PbudV$}&{pEUzin~{ zu0|*FZU;K9u6PCm!GC8r&;hCLZGiQ6L`pe1aK07t{I>&jyrlAQqv0S9xQ03afp~=V z>v?U&##v0{jo;k`$GbNI1fjbTysajB9MD$&Q=|!GPztGMA;of{s@?Z3fFbnFYGZq& zJESE?z3)ogG*;_IoL2r^PPP>E>e{|n0`2@f(2Cw;kf2cJ0IIhLee+?O19THyxB@ej z%lWJXtp6*EY1CK0eYxFZ`^e6XIhEo)pRmTpn^6;O%T{o{sogXGHX495yXh@(w7!QgW$ zpfvobTd|Lp?)cAu9zJsTcRxpT&08P1wyXq!6gs~iy0%Ekm0^$&CNxJHNZ|mWz*|CE zdKIwV?7SC<=o`F1?qpuVtq0*;;=t8YC(d3=MCBq}1$DmaLUI@y3A6mg(5}^&4KPi~ z+^b4_xa#>vm?t9BQSA+rU?%&29;ko`OBv$b)&AGu^1yi|K!6{KQgxH;#MwM@@i;;z z*qFTwYfVb?x*xE#gq|Y<+j+X0j}H?)f73ZY+}L=8+}RSdp~V65J_~_JOKQV6k?Vz! zzlpRyF?$@r`2&*O3=fITk1xP9nLu<@x1(|0B%CKIE(uSYFxAKsCrARPbO0-`%wrkv zcD;jc)<{3FGfdy0`#LL^-3$G3*jN-tSq`-hr*}0Wz{JL%q^ynJ2Lk!) zU*Tpt^i3d%3}qk-Zvl5ANXz+GK!o7T+d%W!TZJgvH#Z!v?b$$#u_`v((VzbX0{dTW ar1qWP`t;pz-v137uV`jT{+=1e)qe-t+Ughp literal 4002 zcmeHJZ%kWN6u^=qM4QjC5{7U6>ZE45lN?+yXHIZ$Tq7%Rn)qOBT5h zWSGFLU)*NQ=n_9Tra;Vejv0BQaUm$NhKwwl3R{>X#tml30t}e%p8NW4`+Q`?M88Ns zyxwPaTV-y|9m?z z+>uz2^zKh*4`-rmkEtn}g%ll$^6(+NId+3!MRS7GL9awkaY#zuC&ePr$ajk;y8pE6L{i(DDFQ{*c$J z7K)!~jZ$Ce`Nz&44@8m#tY^082AYVb_@na+-xv10P)x zF*CO-1lF1XgGHyR@#?!NqKb|;E|a}Lbm>hu*P$x?{B@z7yd>GfF{8Br{imf&RxsUP zb0cco3i@E_?ap~i2$)(KshLVPEw4D@Z_=nst#(H+fZpEn zB0CwR?}+Y{U@n+j$B-?2dK~xFVzVR<5WU9H$s1Bl9klpB9gKbKn_gd|lBmO*wh4)? zv~}OyTHvKEOQdscF-9$(jXvqzoY@|}KkoPjGc^0M@-(6esfSgTKiF^Gq}IRN0btV(gp?tmla&mGBwTX3>A zU;yrmjp8~8W5orejVk!rcea9wEJgZ@d_WGAXDx^VQ;#@&P$2mFtLD;zIgBKNP)%ZB z2W?31jUzntPXd39=9f_(jI)_WmZw7fdYFQOPNF&t6iZ{?? zn-8!%(HldjzPC}~);+R8IpEkGka5)2E&0uG0+&x|GvBLd0HE5?uT(UASM{@$rI}k) zPfzl*6LggxA|Mw( zLoZewHBj8Y4hZ3GgPW|0LR~n_hqk*p4fZ2nH*R0e5tFuP;CAStmo|E diff --git a/assets/en/shop/MEDAL_SHOP_SCROLL_AREA_250814.png b/assets/en/shop/MEDAL_SHOP_SCROLL_AREA_250814.png deleted file mode 100644 index fb1b080af8d0f8542cee31cdf9a83545619cfe3a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4002 zcmeHJZ%kWN6u^=qM4QjC5{7U6>ZE45lN?+yXHIZ$Tq7%Rn)qOBT5h zWSGFLU)*NQ=n_9Tra;Vejv0BQaUm$NhKwwl3R{>X#tml30t}e%p8NW4`+Q`?M88Ns zyxwPaTV-y|9m?z z+>uz2^zKh*4`-rmkEtn}g%ll$^6(+NId+3!MRS7GL9awkaY#zuC&ePr$ajk;y8pE6L{i(DDFQ{*c$J z7K)!~jZ$Ce`Nz&44@8m#tY^082AYVb_@na+-xv10P)x zF*CO-1lF1XgGHyR@#?!NqKb|;E|a}Lbm>hu*P$x?{B@z7yd>GfF{8Br{imf&RxsUP zb0cco3i@E_?ap~i2$)(KshLVPEw4D@Z_=nst#(H+fZpEn zB0CwR?}+Y{U@n+j$B-?2dK~xFVzVR<5WU9H$s1Bl9klpB9gKbKn_gd|lBmO*wh4)? zv~}OyTHvKEOQdscF-9$(jXvqzoY@|}KkoPjGc^0M@-(6esfSgTKiF^Gq}IRN0btV(gp?tmla&mGBwTX3>A zU;yrmjp8~8W5orejVk!rcea9wEJgZ@d_WGAXDx^VQ;#@&P$2mFtLD;zIgBKNP)%ZB z2W?31jUzntPXd39=9f_(jI)_WmZw7fdYFQOPNF&t6iZ{?? zn-8!%(HldjzPC}~);+R8IpEkGka5)2E&0uG0+&x|GvBLd0HE5?uT(UASM{@$rI}k) zPfzl*6LggxA|Mw( zLoZewHBj8Y4hZ3GgPW|0LR~n_hqk*p4fZ2nH*R0e5tFuP;CAStmo|E diff --git a/module/shop/assets.py b/module/shop/assets.py index d21e2b672..e53a45d4e 100644 --- a/module/shop/assets.py +++ b/module/shop/assets.py @@ -7,7 +7,7 @@ from module.base.template import Template AMOUNT_MAX = Button(area={'cn': (762, 314, 830, 342), 'en': (772, 316, 822, 332), 'jp': (772, 316, 822, 332), 'tw': (772, 316, 822, 332)}, color={'cn': (104, 145, 209), 'en': (148, 178, 225), 'jp': (148, 178, 225), 'tw': (148, 178, 225)}, button={'cn': (762, 314, 830, 342), 'en': (772, 316, 822, 332), 'jp': (772, 316, 822, 332), 'tw': (772, 316, 822, 332)}, file={'cn': './assets/cn/shop/AMOUNT_MAX.png', 'en': './assets/en/shop/AMOUNT_MAX.png', 'jp': './assets/jp/shop/AMOUNT_MAX.png', 'tw': './assets/tw/shop/AMOUNT_MAX.png'}) AMOUNT_MINUS = Button(area={'cn': (549, 311, 582, 345), 'en': (546, 304, 586, 344), 'jp': (546, 304, 586, 344), 'tw': (546, 304, 586, 344)}, color={'cn': (82, 129, 194), 'en': (76, 127, 195), 'jp': (76, 127, 195), 'tw': (76, 127, 195)}, button={'cn': (549, 311, 582, 345), 'en': (546, 304, 586, 344), 'jp': (546, 304, 586, 344), 'tw': (546, 304, 586, 344)}, file={'cn': './assets/cn/shop/AMOUNT_MINUS.png', 'en': './assets/en/shop/AMOUNT_MINUS.png', 'jp': './assets/jp/shop/AMOUNT_MINUS.png', 'tw': './assets/tw/shop/AMOUNT_MINUS.png'}) AMOUNT_PLUS = Button(area={'cn': (696, 312, 732, 345), 'en': (693, 304, 735, 344), 'jp': (693, 304, 735, 344), 'tw': (693, 304, 735, 344)}, color={'cn': (88, 133, 199), 'en': (81, 130, 196), 'jp': (81, 130, 196), 'tw': (81, 130, 196)}, button={'cn': (696, 312, 732, 345), 'en': (693, 304, 735, 344), 'jp': (693, 304, 735, 344), 'tw': (693, 304, 735, 344)}, file={'cn': './assets/cn/shop/AMOUNT_PLUS.png', 'en': './assets/en/shop/AMOUNT_PLUS.png', 'jp': './assets/jp/shop/AMOUNT_PLUS.png', 'tw': './assets/tw/shop/AMOUNT_PLUS.png'}) -MEDAL_SHOP_SCROLL_AREA_250814 = Button(area={'cn': (1063, 201, 1064, 623), 'en': (1063, 201, 1064, 623), 'jp': (1063, 201, 1064, 623), 'tw': (1063, 201, 1064, 623)}, color={'cn': (128, 143, 153), 'en': (128, 143, 153), 'jp': (128, 143, 153), 'tw': (128, 143, 153)}, button={'cn': (1063, 201, 1064, 623), 'en': (1063, 201, 1064, 623), 'jp': (1063, 201, 1064, 623), 'tw': (1063, 201, 1064, 623)}, file={'cn': './assets/cn/shop/MEDAL_SHOP_SCROLL_AREA_250814.png', 'en': './assets/en/shop/MEDAL_SHOP_SCROLL_AREA_250814.png', 'jp': './assets/cn/shop/MEDAL_SHOP_SCROLL_AREA_250814.png', 'tw': './assets/cn/shop/MEDAL_SHOP_SCROLL_AREA_250814.png'}) +MEDAL_SHOP_SCROLL_AREA_250814 = Button(area={'cn': (1064, 201, 1065, 623), 'en': (1064, 201, 1065, 623), 'jp': (1064, 201, 1065, 623), 'tw': (1064, 201, 1065, 623)}, color={'cn': (130, 130, 141), 'en': (130, 130, 141), 'jp': (130, 130, 141), 'tw': (130, 130, 141)}, button={'cn': (1064, 201, 1065, 623), 'en': (1064, 201, 1065, 623), 'jp': (1064, 201, 1065, 623), 'tw': (1064, 201, 1065, 623)}, file={'cn': './assets/cn/shop/MEDAL_SHOP_SCROLL_AREA_250814.png', 'en': './assets/cn/shop/MEDAL_SHOP_SCROLL_AREA_250814.png', 'jp': './assets/cn/shop/MEDAL_SHOP_SCROLL_AREA_250814.png', 'tw': './assets/cn/shop/MEDAL_SHOP_SCROLL_AREA_250814.png'}) NAV_GENERAL = Button(area={'cn': (52, 436, 127, 457), 'en': (47, 438, 127, 458), 'jp': (50, 438, 94, 458), 'tw': (53, 436, 126, 459)}, color={'cn': (126, 178, 207), 'en': (137, 185, 211), 'jp': (149, 194, 218), 'tw': (146, 191, 214)}, button={'cn': (52, 436, 127, 457), 'en': (47, 438, 127, 458), 'jp': (50, 438, 94, 458), 'tw': (53, 436, 126, 459)}, file={'cn': './assets/cn/shop/NAV_GENERAL.png', 'en': './assets/en/shop/NAV_GENERAL.png', 'jp': './assets/jp/shop/NAV_GENERAL.png', 'tw': './assets/tw/shop/NAV_GENERAL.png'}) NAV_MONTHLY = Button(area={'cn': (52, 486, 127, 508), 'en': (51, 487, 131, 507), 'jp': (53, 488, 125, 508), 'tw': (53, 487, 125, 507)}, color={'cn': (127, 178, 207), 'en': (129, 179, 207), 'jp': (161, 201, 219), 'tw': (143, 187, 210)}, button={'cn': (52, 486, 127, 508), 'en': (51, 487, 131, 507), 'jp': (53, 488, 125, 508), 'tw': (53, 487, 125, 507)}, file={'cn': './assets/cn/shop/NAV_MONTHLY.png', 'en': './assets/en/shop/NAV_MONTHLY.png', 'jp': './assets/jp/shop/NAV_MONTHLY.png', 'tw': './assets/tw/shop/NAV_MONTHLY.png'}) SELECT_MINUS = Button(area={'cn': (562, 201, 588, 227), 'en': (562, 201, 588, 227), 'jp': (562, 201, 588, 227), 'tw': (562, 201, 588, 227)}, color={'cn': (86, 70, 70), 'en': (86, 70, 70), 'jp': (86, 70, 70), 'tw': (86, 70, 70)}, button={'cn': (562, 201, 588, 227), 'en': (562, 201, 588, 227), 'jp': (562, 201, 588, 227), 'tw': (562, 201, 588, 227)}, file={'cn': './assets/cn/shop/SELECT_MINUS.png', 'en': './assets/en/shop/SELECT_MINUS.png', 'jp': './assets/jp/shop/SELECT_MINUS.png', 'tw': './assets/tw/shop/SELECT_MINUS.png'}) diff --git a/module/shop/shop_medal.py b/module/shop/shop_medal.py index 059dadbb9..05d6bbeda 100644 --- a/module/shop/shop_medal.py +++ b/module/shop/shop_medal.py @@ -14,36 +14,35 @@ from module.shop.assets import * from module.shop.base import ShopItemGrid_250814 from module.shop.clerk import ShopClerk from module.shop.shop_status import ShopStatus -from module.ui.scroll import AdaptiveScroll +from module.ui.scroll import Scroll -class ShopAdaptiveScroll(AdaptiveScroll): +class ShopScroll(Scroll): def match_color(self, main): - area = (self.area[0] - self.background, self.area[1], self.area[2] + self.background, self.area[3]) - image = main.image_crop(area, copy=False) - - image = rgb2gray(image) - cv2.bitwise_not(image, dst=image) - image = image.flatten() - wlen = area[2] - area[0] - parameters = { - 'height': (100, 200), - 'prominence': 35, - 'width': 1 - } - parameters.update(self.parameters) - peaks, _ = signal.find_peaks(image, **parameters) - peaks = peaks[15: 123] - peaks //= wlen - self.length = 123 - mask = np.zeros((self.total,), dtype=np.bool_) - mask[peaks] = 1 + background_transparency = 0.2 + button_transparency = 0.5 + delta_x = 3 + area = ( + self.area[0] - delta_x, + self.area[1], + self.area[2] + delta_x, + self.area[3] + ) + image = main.image_crop(area, copy=False).astype(np.float) + baseline_color = np.mean(image[:, [0, -1], :], axis=1) + masked_color = image[:, image.shape[1] // 2, :] + background_mask = background_transparency * np.array(self.color) + (1 - background_transparency) * baseline_color + button_mask = button_transparency * np.array(self.color) + (1 - button_transparency) * baseline_color + err_background = np.sum((masked_color - background_mask) ** 2, axis=1) + err_button = np.sum((masked_color - button_mask) ** 2, axis=1) + mask = err_button < err_background + self.length = np.sum(mask) return mask -MEDAL_SHOP_SCROLL_250814 = ShopAdaptiveScroll( +MEDAL_SHOP_SCROLL_250814 = ShopScroll( MEDAL_SHOP_SCROLL_AREA_250814.button, - background=1, + color=(44, 48, 56), name="MEDAL_SHOP_SCROLL_250814" ) MEDAL_SHOP_SCROLL_250814.drag_threshold = 0.1