From 97f56340af36e85a13d85b02d477edee596f7f34 Mon Sep 17 00:00:00 2001
From: Salman Ahmed <frenzibyte@gmail.com>
Date: Mon, 1 Mar 2021 20:57:25 +0300
Subject: [PATCH 01/13] Add legacy score font to testing old skin

---
 .../Resources/old-skin/score-0.png               | Bin 0 -> 3092 bytes
 .../Resources/old-skin/score-1.png               | Bin 0 -> 1237 bytes
 .../Resources/old-skin/score-2.png               | Bin 0 -> 3134 bytes
 .../Resources/old-skin/score-3.png               | Bin 0 -> 3712 bytes
 .../Resources/old-skin/score-4.png               | Bin 0 -> 2395 bytes
 .../Resources/old-skin/score-5.png               | Bin 0 -> 3067 bytes
 .../Resources/old-skin/score-6.png               | Bin 0 -> 3337 bytes
 .../Resources/old-skin/score-7.png               | Bin 0 -> 1910 bytes
 .../Resources/old-skin/score-8.png               | Bin 0 -> 3652 bytes
 .../Resources/old-skin/score-9.png               | Bin 0 -> 3561 bytes
 .../Resources/old-skin/score-comma.png           | Bin 0 -> 865 bytes
 .../Resources/old-skin/score-dot.png             | Bin 0 -> 771 bytes
 .../Resources/old-skin/score-percent.png         | Bin 0 -> 4904 bytes
 .../Resources/old-skin/score-x.png               | Bin 0 -> 2536 bytes
 .../Resources/old-skin/skin.ini                  |   6 +++++-
 15 files changed, 5 insertions(+), 1 deletion(-)
 create mode 100644 osu.Game.Rulesets.Osu.Tests/Resources/old-skin/score-0.png
 create mode 100644 osu.Game.Rulesets.Osu.Tests/Resources/old-skin/score-1.png
 create mode 100644 osu.Game.Rulesets.Osu.Tests/Resources/old-skin/score-2.png
 create mode 100644 osu.Game.Rulesets.Osu.Tests/Resources/old-skin/score-3.png
 create mode 100644 osu.Game.Rulesets.Osu.Tests/Resources/old-skin/score-4.png
 create mode 100644 osu.Game.Rulesets.Osu.Tests/Resources/old-skin/score-5.png
 create mode 100644 osu.Game.Rulesets.Osu.Tests/Resources/old-skin/score-6.png
 create mode 100644 osu.Game.Rulesets.Osu.Tests/Resources/old-skin/score-7.png
 create mode 100644 osu.Game.Rulesets.Osu.Tests/Resources/old-skin/score-8.png
 create mode 100644 osu.Game.Rulesets.Osu.Tests/Resources/old-skin/score-9.png
 create mode 100644 osu.Game.Rulesets.Osu.Tests/Resources/old-skin/score-comma.png
 create mode 100644 osu.Game.Rulesets.Osu.Tests/Resources/old-skin/score-dot.png
 create mode 100644 osu.Game.Rulesets.Osu.Tests/Resources/old-skin/score-percent.png
 create mode 100644 osu.Game.Rulesets.Osu.Tests/Resources/old-skin/score-x.png

diff --git a/osu.Game.Rulesets.Osu.Tests/Resources/old-skin/score-0.png b/osu.Game.Rulesets.Osu.Tests/Resources/old-skin/score-0.png
new file mode 100644
index 0000000000000000000000000000000000000000..8304617d8c94a8400b50a90f364941bb02983065
GIT binary patch
literal 3092
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

literal 0
HcmV?d00001

diff --git a/osu.Game.Rulesets.Osu.Tests/Resources/old-skin/score-1.png b/osu.Game.Rulesets.Osu.Tests/Resources/old-skin/score-1.png
new file mode 100644
index 0000000000000000000000000000000000000000..c3b85eb873a9f46dcc300d92afda6155353bab39
GIT binary patch
literal 1237
zcmV;`1S<Q9P)<h;3K|Lk000e1NJLTq001HY002A)1^@s61Dj|m0000PbVXQnQ*UN;
zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU$cS%G+RCwC#Sx-wFK@^|eO?GXqjnxSK
zM@tc;77>wp5aXdYkHvliKZD@OPa^24A3!|xAgxEeM50JaMX=Hu|InJ&7&j)_-M*K+
zDPx*sXOc}TGy^|Y;_STN{N}wkGjBD|^Vm&jI=dk)RQZFZX^l)q6P~=G)UNPk_0<1^
z$ol$v&CcWF<DyZ6-VYN(g2E0UFQ5qHI!cNNMm51`hzz4aQ$U9Ri~8d1bASxsC*T5b
z3FCnvo~uNJX3h<xf!hK)g(t@yz%3$jMFfrkhcp?7;HoNO5CJq00rV1j0Qcy(yYws}
z7K=R`92~q2uykFwmzS5{t*x!ShyN7-HmM}PG^9qDW*P-N20R5k0XzcSpO~0<*5BXX
zJ1{WNH8eD2j*gBp%d(hhnk*Cwv0N_4Iy*aG1CdYA{|u0(rBd<{oz@>``VcTUGc)t%
zdAW6ujEorEXgD1HZCs2t{QWL8__GhtMdRtJL^OI42YN6yHT7zKetx2_udk}nY7N6Q
zpU?9#ELv)<5k<n}eBIO2(__(S6s49<EX87x?d<HhL?Yxz!Y{LyA}11wn1*2}WjNP$
z+4=doCnPrUDNV!^64GTNkw{%!TrkIRR5PwCgsj^rkpg-7>Ehzz>eABEX)2Y%S(ap%
zY2Zg_yeN=SCgKW7>G0&_WOHtA?(O8{WPEmZmhJ8Bp(FY(O%)<c)mdFy7F6Vf6FxXN
z&=(dKym&nRa&>i;_4M@A92A#vcX#))BBQD)0-F=}5t|Ybrs+MvM?i9ObMx4?ZC^#Q
z*=(K^;UtuohS5%mesW2f5%-O+fG>a)8j|o4M@5mEyDyL_c{`+hhjvi(nI8n1<}@2M
z)d+Eg`1!&&vyvjsElrJ(_QcbcpO0iRnVih_-{_gucV;|lwzjr@HWf8K1YB7~DoM~1
z2cifk;h-UjYltK3AB`&FY;SMN>^)uu0wcns$2mJYQy~)Q1xqPvT7A>=WRuh1x^jB|
zT9N<b65b}#CekL->ddONf3$*#cy09H7$`$V6YjiPD->}RCaKAgXyh1BItqB@CNs9d
z2~kZhuwy{!Jd#W%i}minx~?;!%BWW<eFmclT*jSxmn<yi#A30iP>l?X$hA`%U9kNW
z(Pc?AdP0*5VelbCAQGq|s^?InLXkk1hAAkb3uLrb_=s;p!>S_@(PVRpYSduN=D-;X
zbxRBoHDhCA9kTacRU$ZOsn~CtX0~2J!>9o=IjXM|g1m%#RF233zNgda6xPvdk-=nV
zSyqN>DK;tDSfQpyUF{rjw7<Wf*x1;3F+4mRp`3B89UUDNR#sL%Pz^3as?_(Z%2|Pd
zKRVHe0{k@64Y<$B9|@kZ@<#&9pk34z75heYw|&58Dtloq&IVgfvx@NAE0(ZM$zM>N
z16KZ&(n0;Mh)kLYeW!PP{X~igRvJN-A~~yAheZOWFb=O+=ZKI^eT!7BY}!Xkl}7v=
zM#iparj>iiwW<M!Uy-J&kF*cZZ6X!zmjD9*_`52{RF+Q&00000NkvXXu0mjf@8UPi

literal 0
HcmV?d00001

diff --git a/osu.Game.Rulesets.Osu.Tests/Resources/old-skin/score-2.png b/osu.Game.Rulesets.Osu.Tests/Resources/old-skin/score-2.png
new file mode 100644
index 0000000000000000000000000000000000000000..7f65eb7ca7e52a69d645d3550d932ec55c44acd7
GIT binary patch
literal 3134
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
Y0OO;-v8NaCZ2$lO07*qoM6N<$f&jDokN^Mx

literal 0
HcmV?d00001

diff --git a/osu.Game.Rulesets.Osu.Tests/Resources/old-skin/score-3.png b/osu.Game.Rulesets.Osu.Tests/Resources/old-skin/score-3.png
new file mode 100644
index 0000000000000000000000000000000000000000..82bec3babebd59263dc486e5900a3a01ea4aaed7
GIT binary patch
literal 3712
zcmV-`4uA29P)<h;3K|Lk000e1NJLTq001li002A)1^@s69a31D0000PbVXQnQ*UN;
zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU=B1uF+RCwCdT6t_$br!yF=|Y#+QfT{X
zDFvZyr3kW=ttb*k9U<b35k_K+NQeZD7=nTsHHynW#C4)%j3|sIGBQXc%n(s_<H$0y
z6b7L{%VO#Npv!xG+nw*bbAI*5<G$B2noPXOXYsxJ?mhSX&iT%F&hI)*(=>ifhvOHz
zhC{oSeoa&R8~uM7%-=W#Zb1^@5;(PUqk@Qru>6f`==sgR{r1})oj7UIB!^~XGSCZ1
z6Y$?Dn&A%3t6@P9=mY}V-=KisM`261#=CoHtZryJ-~qCM9H6)SKR-{^yliU5(m+4Z
z0ki|H8rtOZ0PYi__hESCe>PZ*O%g9=0et~4Pzc;4|L!|&+Oz@DXfy>$+;vTd!x3q1
zZS@~Ha-=~s)CaTxO&XfzbAIo~JuR=>dEDItW0Pgs>CFOQATSsh^1uTRl;3mDJ%zX5
zetS|%N{ZohI<NUX83+$ygu`K@sj10;;gS9O_qQHCe7N?TZ@xK&Q+^a&0xkn}V*FJx
zTzTB=Hik9Na;f_O{ehuC+1+>FJ^ksYpDr0Wa-=gOBg05ePQK3A*dr2&ScZ3Yb{c^|
zz^JXQHMVZu+Oc87hSNun9zBLr&I0Fv^J09HgiEJxbRrMCBqkZ7MZgGP+=>+|W<UAl
zlf7|RhGN-!l(a6F%K}%z<M9|dIXT9lL4(pBdE}8>wr}5F`u_XxpW3%?-#>Bczk$=T
zvi0KafaHR`hv8jiY>s%g3@Cr~)mMMNXwjm~?Cfmo=D)<jkfGPFT)AR=_St9t7hZT_
zS4&IF0en>nREf8*(9>2j(qJ7zNu;P;U<@!H_!B%)+tAQpVp+|e9x%p)F=ks^n|bx>
zRkOXl-3*07*5|PYLdH60=gytc(W6JxkX69%#96swlfy0~obqM1u)vT}qee}B>7|#v
zJ@qVOwWFiM07DoD4jeGB)CP<(ii(O1B&dPdH!?Fb4Y&KJ+cO844-+R&bgWyquKeML
zAC4e76%G0&mc#M9OE#DUEC&Ai`RAWU{C<D89;KIHq=_Ul5jve&Sy{*N`|ZHr1Us2n
zbLY-A>+0$(Z`&PsSQGaoL;M9;2uuL-8Q1PO-u1`{gYLio{>f9PPIWR_y7Q{f=QBR}
z<P#HdSc#aVu{A)0WV=H+d@z`y4G%MN_3G7@r(=)Q)KsIQqQbpk!Ghb?u3cL#)Yr)C
zIBl4rmn0ht!=NQgmJ~9p6R`n}ZES2bmM&e|4txn?x8dVmz&_wR;Gl-@fuo?bX2i6;
zUckNhAP+tC5N+ru51K)mb=nk(OgW)HygR<EtjtJCO6u0w#fumF;9VNJ2OvHD3pgPZ
zbuI=qmo8m8UteEu@w45*dk!5s)QJQv5o%>UNOmR&hyL^D&o5vi#Pcq1#xPjEe0kgE
z&6~dxL+Qbj5)O4**}Wp1s{XbeJ9f;7r^k6u@_a!-f$}bC*6p+j2eLzcadB};d3m{$
zKe9V`BhZ!c-h1zbKmPdR9r%dc$%=JG<IVt*IizU<rT8o<%GFC0YGkC6l9DW0c`mcl
ztw~2!hAqu7Z{EBiiM&g)2WJ|uzy7-N>Iv~`qfk+oq1yFRl-dKu_07x6yO9E98k*Qv
z;gBi1!F$(TcV#kL<Haq-%yZ8@SA~!`B<0lB*qAc!k?ZF}-4*ug)vH_Psj8~-b#X8X
zqf@(Jio{9|!l4)ee+{wg2ebR-mtPK4R#qO=;?>qzDf7x1xsvq*7A{<vmdId+Tre0k
zPM$njE40Ys5z;-}CC;Z$pI*d^*@Xk2x~8Va`1I3HkBG6=B2uVjgEqz{izD)YVxVNs
zoH=7qJrlAIii&aS)T!v%vuA5WKX=3$+|{4WoH^4I@99}`*Q{C7icqK&in>;uTx)ES
zW-N8|FqHSvFTVJqhddiEKj>YS^>^QW_kw6;B{hTYn4qS2g1A{PyQe3OQB`f*w(Wc2
z*GuyBerYV@d6veO0=FVbZ-J~#=v{^aC@%{2#)Q70g<III85<V2x1bP&k-=^zoyuZG
zV+e)DbLY+-5bvr`VBI&R_~<dKjHTk500A}azWeSo62&e<4yw?2{`u!w+J6v(e{zb5
zo)qcL#sUvcnKES^1a%!-n)Bz+n?!YWH3dm)Zf@=xoU;I!ED4mZwfgB&B?pOk`h&>C
zf56xvm?fb+<#(ulCMxVjN?MV&W8}fFk(W_X^?Z^V^jq73A4Iiz<eaM#uhqf|mt~ov
zTHBu~JnoeQ8wQMqu~VQ)To62Qc~^-iII4By#*JS}5vtb1fo+m*aHk}XA+v%;>5>&0
z`{nyatx*h#XVWx8`-z8#p*W0r>#es+?zrO)OY6onmN83SNBh;he*OBtOCe&DS}XSn
zs)37TFtb}a)OLwwzhq{r*7t>E6*}bmu&_%nC6*}mf#IO>ThURELhqN%-i^6n#|UhX
zptFrLXU-T;J@r)kjvYJpN^5jlB&AR8d3_U#55h27O=<$#=t<4ZVn<F+@vKKeXV|!L
z<7T3js<`*wd($aN)6&x7dX-5`V>fNuWIXfCGwh;kw06Hqk~t7NpSY%!$rsA#?glJL
z5)O=8FS>}|y!P5_cjo8kTORGM?We)?>?^OlVzvCjR8CDCsee1V9i)g@xo!<(^npWu
zZ)pU0^;R&5<<%Yy^$;Q~|9kfAF_7TKJMX-6GsIMlghI1~Cu5i4YIYSRt(S9YQ=TkI
zqFg~Ak)7#6FUn9hsZ)R@D_5>O!LIj44|dRjK)}3w`Lg-;+iwRD^ILGe6~J$WWpczW
zYb4<oZ@RVlS-K!iohS+Cm#1!*#4`o-LObHo$8yRFM$yFB?a7dZ=dfSo>Y!6j>EFNq
zo#^F4&CSg!!PS)0${klsW$Gin+yJRi1B9k>CAm^G8Z@=ANQNNtL+ls8Q>hm(UUb0-
zCo3aC?aZ>yxF+l#M0FU2g@vvGI8da16dG+6!-F4u@PT#1WKH@N$)IoG;K753^y}Bp
zi&b+#PWlcWJgAh}X-!TBB{bA;i{*jyWGOumJG~LBg{Yo+EX!1B>FMcl*@INa9ubuI
z17yH@e6(LUnca8DAxqy^ZdQurc<}MZAD@hDcPTxr_!3R#X^8eev+EV(n}t!*q)}9{
z?h)aWE`Rwz13-0U%a$$c|HKnd7_55nn1uKG@WT)NsE%v#zq^H-S+0Ysk5kjhk!#nk
zom*O3>f)4#o*-DI$g5CUeNLP>5d<Aw(3Z=uP1oCm?3+XwU6yKP4fPNjfnB?HWn$TT
zC(^_8J{*?x=9_OS)@YE57j<gwOBQtSXs_4nvTHnf5vnXay;nSzA&DB%%65a?phm{0
zr$yu+7j0lEu#Z0a$ns*mgPtdsqm3FE!%UX=QIwX7%uMQTWC}0$19$cjgB9JV>KBT$
z)!>(NIX-BptE+2;*vU+EFB*;fNs`~WRS|J&TT{lNLx-+XH6=0_+3%5r%Fv$N_RuP4
zMB6QL6ciM=de|+;Zlzfv5f#rc20NIc@uo3MLd2gMWo4;pjC2_B=FCbbXG^Z+&YnFx
zt-Fqyi4Lj@X&XCHWpG5unF-W_G8v%UvpX2u6%`c@S=zp0H1DhmkYUp%sm_D6cQdGR
z*rSg=YQ!5M=p8dc@4Vt*RXCiQoMh6}@7=riN4D{HBP1^4h!G=<^78VbVnDvo8EGwv
zF)K*csO~1=cJ_3)tXj3InA;7BLW0I3JR?Gzt(u(e@~~g%=<<dQ8xB@hR&sW0Ta8F@
zk3IHSo@~&R2!DIEFi}hI)tgUlIiOpfgcd)ccU5Qp#TQ@H%WO`y_?E%C-c^Do9h6fv
zW5$eZyV(RigJq=$a?y--$OAjH@_t>51Wup&?6c2KK|ykm&l7o<Nl)1cF|`+Vd@uB9
z?eme1Trty2D@l$YKW;*V3>`jvcv9?65&uoXpD<xUGKxSRl2mma9*Jv~=9|T{V^D;q
zL4}phn>VjpW0`0iBfRm(8+Ew$*D|kDU32Hcg$qq3FJ0mtF5wJd8D$;>NSIpycAF@a
zgbbZovu1^)RC6}G5!eKLjehR*qD70s5JD!m8|<zTD>Eri*R5Me0-%Oi1Wc41NLBLE
z`j0kU%urheTuLNI1xob{G?6aGZfxymoKsT5aAWuG-NuCr7pxKvCNaj3A8$?38CLOT
zbh>A$>d@1L!64gEz&I2?tc61dTevO(FJ4wln<s;hIlv#`>8<Dn{M_<F_S$-en=9PX
zqKCM}#jURHJgN>}lh@`wM7*yAX30ioAIS};vh$ja#h6KBp6FpF&L}jOGnOu0S}<_n
zz=X|ZPY)&+^#l^vfXJzZI{QjO%Wl9JiM!VfquttEtdBNl7>W=nTfTgG`TY6wGr06z
z?i<;@<<c{ZNLz?)W6PE;ZL3$W{;s8^<*1CM&Weoe+Gmb^6(P~qts?(y@peDeiNNq7
zXgbTlseQ+e9qS~ok~!#g#;bY&mUy)(PD8mVj_eNujhi=bu7shd)FzD>S}*mWBi6G$
z+0AzeH>(iI7Fp?)IRxQ_@i$GJII$QiE(h8<1(h)6zwGBQeLi3G<jIo(c+_82Rn@p}
z-@bE_MD?PR)hh=LLS1V2J{<2QkA$z#2zw|2lPY22k&>(4M#+{6m!UPTE^Q(jkV@Jr
zBHX9F<l$30N^;(H??>Fw3m)>r*ojc9)c9Jh!%i25>Duj4xuq#V{S}%HZR8b{b9(g7
z&yBuSrEgoQ<V@BKRa1O*U0v9RG~+@sZ&#T&V!+QioHo#>MrO?GUeTZX4x8iG_GX~d
e_>~?15nuodi5A$|t>!iW0000<MNUMnLSTZ_KSS*R

literal 0
HcmV?d00001

diff --git a/osu.Game.Rulesets.Osu.Tests/Resources/old-skin/score-4.png b/osu.Game.Rulesets.Osu.Tests/Resources/old-skin/score-4.png
new file mode 100644
index 0000000000000000000000000000000000000000..5e38c75a9ddf9dc183531b5332ecede96a3f0053
GIT binary patch
literal 2395
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
N002ovPDHLkV1f?Fo=yM&

literal 0
HcmV?d00001

diff --git a/osu.Game.Rulesets.Osu.Tests/Resources/old-skin/score-5.png b/osu.Game.Rulesets.Osu.Tests/Resources/old-skin/score-5.png
new file mode 100644
index 0000000000000000000000000000000000000000..a562d9f2accc9592595b3b07669195d5b75406f8
GIT binary patch
literal 3067
zcmV<X3k39uP)<h;3K|Lk000e1NJLTq001fg002A)1^@s65KJiD0000PbVXQnQ*UN;
zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU-ok>JNRCwC#T6<^|`xTzuoqgt=XiRRh
z_ond~O^gpp;_Di<pte{m_^7oMsS2g2|EQpCDX2&*6e}nd5w&VX6pEN$BrSxhM6Iv-
zs9JBliH&-_d1zjn-DI<wnSN(EzvY*?v%AS{<Z__{AG<TVJM+!?oyT|1tj#bC<(shC
zm2b#qGrhMldAqc4OYnO`dNnNe#e4mKAxW#Q-n@BJnKf&c1N$oA1l)j&->XTiZb(Gp
zz3LX<Gv9=G)x>YWOE+88!KA!EDv$}J0V#lo$=Z^T9CQ)WzWKOrA~yg;fPSEl5$59>
z2pg4^l~EE7CPV~tfdU{8$YJ7c3l|U;(WQ%N2_S!Nz6l~20s=rM&<=F-F@wJoBTCjA
z1r(Q-md>uKs+yy!>ZpN%0iUL6P78mI61CZE2B7!!^bFM3*N5<4Bhbm|H4q4dA3l88
z#Y6`r!tyH-qVKc;uYs5BZn6PlewoTv9Dn@y@t=(yI~F`uA~GaL*L7XN4JmS}laJG@
z*l545t}gmYU$fio8m`rkn+;S~S6}@E8@qyVgNRI&ESghMQ8C@`_p3QMIqxma5a~5*
z)(G-8=AicX_xr|=AOC&ue8S5wTp*T5RSu*Kuh*OJa5&y?;<norr_-sp-R?n1O-)rm
z)Puk&<9PA1TgHgm*{VMHWXe#M`@JM|T$k|t`Exsy9F%SBl2u*sE7#XqeaIc&y?fVh
zQ8WfsAp6%@Qi&v1RN)K|;)stCRb`T}sC_6W42Q!?Utgbs0EnJkj_O29Oa4hQAV8Ug
zKt3CZM3mdNZ&Mz9!(@AzY>cR|qyt19iF}k&4$_En=FA!8!i5V&xb@bpTTS?=htr5I
zTS3adQTNKs%=Au~G9?S=agQ4}E<GhB#f`k}C@(Kpv$C?Bmo8nphVT6cc*j=N%oe5S
za!i;o!IvoN>8`I`yQb{gwJV5Zeh-H}WeWtPrHV(?(b?IlUcY{w;=q05#tkoP3WKdj
z>F9HSZu~7D)2uA2B1NdQJn=SKa@@57k`J+a2YAXS@8Odg3FM?*(iKig_}F+gLQ)Cs
z;$*MK_0dF2Pd?e$*hr)rfO_B=6AeixwX&!jutKSc@@?baL|BaU@@vG3sEvu*k_A#I
z6r#Ir1zH&NK5Uj{<_%KPCS@7BN%ty}0MR9>Hz?|rB;wdyS;SrUvGN&6Mv^wZs5TO<
zh;1l@;Tp0E(i8aQh;Hgv=?qLd!Nnbd%|cYi6#P)Eo{Xq%IMo9nk(~}?1EV=04Abi9
zl2E3gh~Q>~lGm(!aHtj?N+TE5kdGff_Tg<ICuIkx5;;)h7DKcby(UEco5^cKv9@Z_
zc_u7_$f0D#5+<1s1VzD+h-wnaAm`a`&XZk?0Dsm8!u?haotdbdj1%TjpU<bPUAtB}
zckW!-q)C%L%E-tF78VvN`T6;7%E6T0M0*kp2K&*TbiR4>=G}`IFTUUvcxy^)wBNxu
zLWC)UXvr+9mXwsJiApGHvvTCf5#_*v1GJlt@1_fZA>W{ALm*i4sO+}3wknq|U+%kq
z|9)F-ZSB81Iyye%n%=|(qlK*<B<os{l`U$Ah3tullG4F<q8QGWo13dZM|gUBd;PGm
zAMM8MW5<r&ho%3?dZB?EJF;*O$cD{i)#2pOubf&~&XMcTO%@dur7l~xY~InMM<*RV
zeE4tNT)N~c#bk9k;m0BrRY!mCi5rB|($W<8xUzfq?$M`Com!Qho&7OBqF$+p(_XX{
z;j$aE=m1A&fT|As%Q>99N<xK1G$|_~qJ>Cyxm=3J<B5U@nh8UnDl1m3aHXfGFWInR
zgWlfW-e(den%vj-bJV?UXlQ7I^M6PuP9&ZwK;Unbs+5ZtFB(whJr5o{Xhn{F%jdI$
zMB2oO6Z7ZJojZE{`t`Kj(WRGVB)zBZbK$~;>YhD&zO#Ar<~Gg(U7WhYf~buL50t<s
zZ`!o!C)>7dTZE;Ewg<wu$U-u~r%#_MCr+H`gotizYHE7HQ;rUndl7aiFHc{JV6mxt
z_wFqq!nEw>6v$1TvSrJbhV$po{|Sd~agb3q2pKHvGWmob0uzbw{Q2`M%F4=$kd9K2
zvfSLt>aSnF?n9b+SyxwA&&s}8BH1IUavRUAve@sY0<$5yixw|l9PQ(+v@TS?zF@(E
z)7bqx@Q}wl-QcOoKH9|>_FTPswIBGDYr2E26l6kgnOvKs#s$fK4o(}Z_cZ>Tj-??b
z70#PCPqiXSD~JHIPn$Na1a9;%{;iu=M^jCyNn^hVasuw-V?id>$`DozSUA5f^<iCH
zQt6_8xXNn;UQxXAOgAuN#tc7*W=Sc_E`rI${*=z6#?g#S{*o98_AtROn5?*wfjD(q
zLwYgzw?w$3ySuv`!lo!*ppsR`j2V;0Bt5(;F`_=sU4@9ykLS#pQ;ECIK&tUj-9|9=
zB5k}mefo3_yN1q79Of1znN%}Ro)hL+EWd}B+$qaYl_z<*=&xrUJb3WO#l^*g>OJ@J
z1rQ#o`}gk;unTms8nPw1xPw=WF7EUD{Tb$bYBi*=c#aTDBbfyS1>>NEXb_+voy0&T
z56eNSi88`?mUijVBsyL*CrFYZNF3zA|MIK?N!GjQ{dLoH+E65U=RuB4Nwg$+d3h9(
z<xDhFn(teYv@^*x_Ivt`A5|#T>-EMZN|o)|vu7bGgA9n4*)A9((mHuaWx0_hrcRwY
z7H>abpC*TQGAT1jC;NU5KNBdfsHiAgvSdlLtR|YoKoWLK=`JD@rJx8QU^?(6BOX~Q
zt21ZLqzn6jG4ilghzE&eim8Z{?%cUEpWG<kB!*&vG{fDycbkMZWo|K|z5GGT$&)AB
zpv)~#M3%tPk<XH!e#Fa}&7|BQ>1Hcta9J(}rU28oZ{J>7RaK=V@=vNvckbNLpivvS
z8|aY=NR()hKluFY*|T>W8yllPvKncVMOLp~UBW%n1SV6+#PWEVzr~+V2P&2?UtYCi
z#}21ejhC%S0tYS5E9}1F>K9<5v8+NCm<0R)*bhHyXl`yM7ck5le8_n6<cWd$Ph#Ob
z@C)Ea!1sXf0;_<Z1HS`mKr#SDAN^gT4MN9&3L~F83v2?u&Ck4C^kh*yZSn9jRsb7;
zKknPNFNic@K-GNdq@hsAsIIOykj{wgUxA~*Z-L(chk-xC@{ggy^p=*Eq$KI{moHx$
z<>lox9sD)01Q^R1!yyw@`5-OXB48V2-e2eru^e9_OZ)I+1KQKrxN##9Zszgh6GV0k
z2x^ZWJu<qwx-3`4Op+|VYSk)g^nMTg5Gdyo9?jD-Q5)yHY<2-!#$O`w*AQ8{AQG|V
zMd&kflUJ`^8IXVmWevKyWLBgNaS$cBa^*_$$s@o|flBuI6k*L6QF_Bc<>5Oi1(pN9
zf@MEBbm&lTTU%T7#3QlMO`{|mWOW24iS9qJU(RFgN>$G(ND87Vj|6q37oj=Z*vizy
zgrU0I(T^|Mx^?RZ)J{-upQv6Zdq@EVrPS2aM9|pXMk@LTxeV}}`+Heh4%Pu|QBhTd
z>`UdUQpmnL0j^NCZr!?>Xu@*fm(c=1xs{}uRT3vFQ0=B_Lj);5*VfiXAfBJ2L%7S+
z>d#okH_MN0%#x8FgAXEV5)(eIKBGB5`Z>{mxOC~#QbcLq<jIp$px7N`Vex22)NCRN
zi_uUmeDB`9jw@HLG+@7;i8b-Sp_y}dKs=+jnm<_*mB^|bd8wRhM=|MKe$AHtgy2Qj
z>4O%Cj!>ZFTcu8+%hbY%nNvFx3~^%D;%VEsM5UR#L;CxMk4dF7gcA2jPdLP^RLnwq
zP1C$?saxnB>S$g310vDPeE@`Y>G^qpm&(I%OKRL9sWD9=8#es~L;f4akZ1bCoj1uN
zN;Bj^uKZ^f^WQXvJ@==;9I3&WEzS&oM7Ai=|NoP0gtz|+FaQZ$3c`e8^P>O&002ov
JPDHLkV1kmK?iT<6

literal 0
HcmV?d00001

diff --git a/osu.Game.Rulesets.Osu.Tests/Resources/old-skin/score-6.png b/osu.Game.Rulesets.Osu.Tests/Resources/old-skin/score-6.png
new file mode 100644
index 0000000000000000000000000000000000000000..b4cf81f26e5cab5a068ce282ee22b15b92d0df12
GIT binary patch
literal 3337
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
TZ*tsI00000NkvXXu0mjfuoP_o

literal 0
HcmV?d00001

diff --git a/osu.Game.Rulesets.Osu.Tests/Resources/old-skin/score-7.png b/osu.Game.Rulesets.Osu.Tests/Resources/old-skin/score-7.png
new file mode 100644
index 0000000000000000000000000000000000000000..a23f5379b223d61079e055162fdd93f107f0ec02
GIT binary patch
literal 1910
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

literal 0
HcmV?d00001

diff --git a/osu.Game.Rulesets.Osu.Tests/Resources/old-skin/score-8.png b/osu.Game.Rulesets.Osu.Tests/Resources/old-skin/score-8.png
new file mode 100644
index 0000000000000000000000000000000000000000..430b18509d3b38dba358be5c825d62b5e3e96134
GIT binary patch
literal 3652
zcmV-K4!iM*P)<h;3K|Lk000e1NJLTq001ih002A)1^@s6|BgfB0000PbVXQnQ*UN;
zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU<=1D|BRCwCVS_y0v=NX+n>|I~@SmOii
z#9)VD4g&!vF(sT0U<eRG5~xxkg(PZIIjBe_w4zmss?r82Qc6OjCMF50s}iM@BY`w6
zM20{q4&}0`xdOq)*v2=$ubsX({eCnoJF_-Pq>l8oyEC&hZ@&LK-uM6G(C%(?n4mUY
zKK<Iav^fTNo>R_s0d62nK3%43kZix8&-A@tj`_cBvQ7cXd4LEYQs4!`g|KEK*$wo_
zXSeBhujwJ~ioE0K(W5~R<mKflE0R<+5DUZu2|yeWBgewzFN$av&;hgufcrY-c(;kX
z9~|_7kaY(ksfL?YixOf<Kq@dC7{=cT2?<H##*ItSb=|l|Yin!QsZ*!wgjg$Z6KDon
z1nT=uIo_to<DQ1aLE1kkvO?4&mKzGB0V9C>MvfervtYr3@sB?GXu_mPlU(89;hNLw
z)IeDC`~6x^Pmcz|T17=g@40j5+VQ>i$dMyg@ZWl%F5t5PXp#qL6Vg3mX@5vJz{zeQ
zIs`}tMgrNu_=19hIcwLhO^l6=)gmGyw6L%+&EdG+<w?4)ug?I96P=x%T5)l4|7V|l
z)^zgZ$;vZl&RoK&Rf6k4wLCzxSe$Os2VVV_WW`6rg(!zS3&@F&kI#Ge-FIism@&g0
z6BDDk-R?mJ1ufp&+iQ^S>gv*9asB=G->=`jdv{rLbMr-<@+EK;xCYb;X}VHRAYp^7
z_-U97JuP}4@W8~06X(A7-g^&?8a2v6YX(|!up2E;;vF3w+Rd9cwW6Y;j>5vilUJ@>
z`8N)q6XKQPBCU527R$PXD2M&Kz{{}c-|+PPxUfEu4J34)3v20hb#(?>T3U2iQ}6HZ
zzvFzkijJVvOG`_2xY!Ncvk3SJun-s{@xpB5Bu7G3p>Rn{_i*TeM=(??o_OMk@aX7h
zTZ__CZEbB@Wo4zdXU`t(+O=z4@J&9U6C)EnZQ3;Vym|99`nt#Cx#L>&Z(8}|k3a5S
zvu4ewjg5^*u=@;fS$w$-M0?HAA0tD*2>8uYPd)V&EfdTlYJ)H8?d|P40!Cl7Xc2?r
zIIs)Y3Ty%X0Bi>i=jP@%W0VX_@_&IF?*qd6&Ye4Zd_La}{HK5h1JWgZ8rD^bpGiMO
z2v6CvWlLUGR+hsqm>4ko_wU!9dFGkQ<HwH|V^;}q3Md!f`%0p{{`&Rn&HMK4i-M)&
zGcq#n2vS;`X)rZ4)djanIehqVwWPFG$;G|TKmWXu&gd8S0&{_1KK=C5mub~t7El{f
zl3~%bw6qHR=a0Y|8I^~CvB3SnXkaps5BwPTQ+9Ut4G=f{HQ2`ea3g*C^yv(^mw{Pg
zT`w)`6w5|PrAo$$!=j?1Z2gozx_<roZd~{a{5&B(RxW;4ArZ|~#DZ`E_zzH4US59c
zop;_bQdqFf<#K6padBFHe*P#aMm}+aFlH<>S>{(C0>Z-~vDz3A45p7h`lw9O%|*$R
zDn~LPls332)v8L)xw3cf-Uhmm)#mkjwG}H?L`$wuP-N-1iY%*EB+6;h(4j+(C$!pF
zl@KhNSdS!b2+1x+tr8{t1p1^R(f1ljyriV0s=K?}^7_1YWMrg<5zZ6?MhIDll7J)}
z4j+sSRiQ}s{Q2`8VzFka>)oQDf^AAV_DHaFvZ~n%7H~kY#R^f6@G~rXoAM7;rRWBi
zE?sI9$=4+$`a;M&b$!D)q3%I(l$@L#DQQ&+f5Wo6>FN7IJ#}COwL2(f+$}|iR*Ftf
zPfrLndgM@3Q`0E|-LLNB6rvo)jzfnIRdASD!|i-3B_$<NZmzloH;6ech(?HTPoxfp
zv`k?o3pIKm+ahk$BOHy3-4+BVPMqjVN=kBDU69fc1tVH&w@-*rc=Ui^uUNrMG(jSp
zxqKu_coapEomH9I%F4<r%|(INbqd)I5yCa7@3mA#RvRB;@#4jr2=Wo4CsKuYoJ4S(
z{7w~d!~!vH_Uze{Al@~*)JUR8i=EI2m6Ac)6<L?b3N&T()vH${mn>OwKiU>YuoOn;
zrzpXBNqG7Wxsb!u2E~dsQ{-W&peCbwO@}V_4Ie(-QWMjvAgR6b$}4Aaeab-!^%}8o
zzsnS@Mj#+zd(f7oKq>h+Tu!I+jylep<>cfzjvYIeit_0c-yI?(lcoA(nTS5Jef#!g
z=wi*vy%;B~j5x3Tt+(F#1iMP5kTi%Z=&m5C#f{XY!>XB+Cr|eB;(>%|@gYNoXpcYs
zco@`D#*G^{lJM!1hB5<Sxg3WPn6h%^%7<XlC}aU!qEK+!fddEnC=+3@FQiP@NEPfc
zcM2*P62-?J0A_61uwnj-FTUu45H|uVSk$s~Li%Y?UPiN6RaK>9s2vj~OwguGnWC{3
zVnwnWdRi1cnt#=*RR@}ynhuJ3yCl`I9UOa%>>{0l8p>oLx>EG$mkSpz)Y&(&6R^{^
zRASV()TR97Z#(72W9%YoYisq_UVBZ4fT8IAHLy$?fTX}q!74lZRiS|J&@wYKwN0Bg
zSz3pFOv?wezFmibjzU|vZk>kwepQD3s&u<elA-#{ZMoYtso@b3u7V_G^yty48#iv$
zX3m^xD{k&)qYKdhAgW28?=+WhF_u4YE=v)OHKm*EWy_Z3efZ&rG4tooH#FuzN+hjC
zMMba@qFu2(pSkw!x8K&bZr!TE$CISUB$$+zF^?w3yfq`^mi#zWh>m~q$tUM--n=;_
zF)`70Xi0`ioJEBA{PWLm5o88okfAhd6!X-n=F#E9BbRH-moL|lb>b1oxft>W(?mzF
zX%g?2qKlO_gl);MP+`g$(V+qgSwLrtf&{K3kFwWdr0xU$D&Y5{I9APbs;jGwfC{!@
zB#d^3jVk{0JK+1$5~YZhooX_MB{2{95uS86oZinr+ii??cB>#lP5Y^Iv%dgV13wh3
zmVLhm{sI4QJbn7KC1Dzegwd&#Nmf`QQ&*fK2vcOU#Hzo2>7|!yk>_lQG9~e*C<>L*
zYX1ya4$J`_7K==l@7(u2;OD?!@Nji!&z?1|VP#<mDIIxzpEQ}%r5e(@4wrO~ECdr?
zef8Cck)|A0k<Uug($b=>UcI`zw6v6Ad`z0fi_+rMiTG#=nBrs_>aVY_cfuGW=gyt$
zqz?y^pPW=d@TH)dsZy){Z%lMd<x`-i|0jLWE|GJn4jw#6hi9w25m+pxHCCecRsxqy
z6D|sjs%t5*2{_G>v5E<{;}9{l?k6(Y@vx-QFjcvt(ewD2PV8C^rX!FwH;c6@fwLr<
z6S#cu6^Yj<b)M~c1*e&q=B&g$OZ3vEOUFxwij~yrQcv%NppFZb_?gI&DY{LQ!0l>2
zHQ4#mm-WjzZQ>dYXytpX$STc@j>0Fw6)j|)su^=)1VT28%%P~|-BNATx<J2OvnUqs
zm&#;RDqh2`U@!;64Z?(|YMl(S#>J4-dk4`h>H}#Q?{*{EsZ*!AOiNf!Mb_x&FI>3L
z#9<yliySV)V!lwQ4p+^p8_QF;hR4q3m~}V}8o1jjL(`5-P#>zZ<rBmCz2fvSs)oxH
zzg;WtHLd(4j2$~RJk%5wQe$6$urbIoNSZHSzFcwf;zixgy1c<-k3FWz@=~%ig(U3>
zBrL7@ZIgb|Nu<x3HOp3WF!&IJT>&}P?>42D>K!|F)Fa;xrOL9h?3giQv<Dx2FuSCr
z<V#6i9TKFi(u(^{B1w(Hy)yTEKOS~WT3VWBS9mCnkc(@Cml8Hc!{}AH7M6`de#`Rt
ze0TI+N@R0C+LVZ0yLLHLi)^xBR6r|!OLDRU0m<*6AB!6{Y?vikS`{VNzjp1~zjK;Y
zCZ&z0(Pff}UObT(!;=XMMFpGxS4n%sh!G^5TwGl2324E6lE_nKJ|WZ8;ZA$~_19A&
z2en|OR%v3CW47X7K|>spDb*^;=|<BSAwEdu^#jgiZ`-!5o4u4(>19des?5%vJN4Y$
zTo#Cb$$G*zpitHo{!B%N4)@#(FTBuC0mIcCt7~#US9jig^UZeo|0*C?eBEOVtVw*U
z&UPZC;tVMGd2{B>aZ@-4a|!wuI|6pL<>lo@KZQ>vm>m!#VL3TD&e^kP8*TdlJKVnK
zo_lU@V`JkX>2TFjYKK}6a|&~x3>oF(dJx`A3pX@0gcRax4UD5f>kwR-v04KQl$>0{
zc;k&XI&sfExc5(i1tNYD#LfP<5^7qsi;(troDg2ep)4pUsIRD~Fa&p~8xLkvi*{T{
zdG^_7t7RcYE!vG0-;cO$(Jo-^R&}_EqH`(CvokU>rfk@-;Q{E-Fe)Mj$Y9rS1N%1k
zyoQnMEG#TMA<Lm^N$Q$JzcHh3UJeah6*s?U5HHSskN9#Hd@u(M9&=?RB&9)`g@VNG
z@}^oPr;pP&i;9XmKltE-bFk_u5$=~ocB(~`4$FmRi#IqTq&g*tdkm8ngBYHlpP!BH
zH5n->5}z)1s){sI9)pHfWZtCME-NcDUY^*$fB$);rz@r<sOv(qQN4E%atS|3sZ^>b
zQd~p5a*`-edNWRrN5NfU)6>(VrJ`{WxdFr7Dpjait=LHWQ)gO4X*JDq5A5X#3)1Rs
zBd-vT2|$$WR|Uc?WL2l2W?R}!ucN3}PufjlCFE--gLzfTX<E$i2)w56fv-;~(cNo$
z(WlGwLXYJ%(bpv#jJV4JYOYr|Pw<&O{ei16-}FmpU*|14{hR729Cl*+|84uP00RK#
WlYXW<G5A^l0000<MNUMnLSTZTCi=1f

literal 0
HcmV?d00001

diff --git a/osu.Game.Rulesets.Osu.Tests/Resources/old-skin/score-9.png b/osu.Game.Rulesets.Osu.Tests/Resources/old-skin/score-9.png
new file mode 100644
index 0000000000000000000000000000000000000000..add1202c31255cdf492a9f8bcdfeb21d105e8ef9
GIT binary patch
literal 3561
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

literal 0
HcmV?d00001

diff --git a/osu.Game.Rulesets.Osu.Tests/Resources/old-skin/score-comma.png b/osu.Game.Rulesets.Osu.Tests/Resources/old-skin/score-comma.png
new file mode 100644
index 0000000000000000000000000000000000000000..f68d32957ff8dc2e6e26e2b739eab85385548faf
GIT binary patch
literal 865
zcmV-n1D^beP)<h;3K|Lk000e1NJLTq000vJ002A)1^@s6gsOor0000PbVXQnQ*UN;
zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU#14%?dRCwC#m`zUGKorNvj_nX=O4AUM
zHmRaYfI`Iq2=p4<pi;M-g41w_?t;_}0;O5eC=gZoE-g?8C${^4?we@hIILK7;gSB>
z8ION{U-N9C`MxinYv|$`M+}Q$F)W6~uoxD@Vpt6OzhDOaIXgR>o2*u=8V;)D@TF?C
z+T17S{{H?ym;%w+TADXmhT?$-O-NWvN0;UR_GXqT)+8VcT7_OfX+F1jnFIZS?x8!#
zh8}URz_+nygyLs1<TaFs3VgoGYX~%gdQgYY$=&gsWeiI~>rfHeIXpZ(*xcNFpGu`(
zwcG8nVHo$9mzUrA{eGSAow*&jOrP%XnP4jnsY0KQkB@6tS64o6^aq1MaO`wCezV#1
zPfkt<_8IyJm7o-H)Y71MrP!@^ySuwPg+f7WY;1^ZHX9uC`MfBVO5*6~=mXZgWiM7_
zg2J#BUQj3&i!V*nT&N{Y(}Zo?<X(njY0B~m!;+kU?B3oULS!t!T-OyB7Z)CTVXAeg
zEA^$8MLLm41XhH{bUGEI(a2W|m^HIZ))+l0SuU3|1dAF3Ycv{TE{8{&;;b&f$S(^)
zPCo_f^?DCnbB|mWb1+@8%tD$iUDubwP$Ivcf@#WrOm1&)FSTqknTUG5-ecG}%FQ{;
z*4EY{Eu%~hheL6T!TZu-*g^u-Zec{h$i?&XbDuZ5EfXNSMmPb1b(KoRigJ@+H#avF
zqX)$@H{5B}g7Pw%j93Ok@X0EffJm6nlXTIBi_>M9#738`=bqh+giU0>f>loV9|82+
zaU80#CVuw0IXW_vYCm)NDP(>JPj7d--Su=j9k?q&C<*&31~<mve9sJ~(L(G&lUsBS
zDnk|Q*MqICt({yhm%(+f)oNXzo}PZewFdMZ`T_l<TBDZ>y-*}fwjTm!p*P&Jvpnyz
z)m?^=o3|X6i423GymcH7s?X++lz!!LDcrGp4_y83T(4ux)LkG8*W#nj518@;Wz|pB
rcm*5<CX||!J0kK0tU^@SUjYUHNv2`hoe|eD00000NkvXXu0mjf`J|EL

literal 0
HcmV?d00001

diff --git a/osu.Game.Rulesets.Osu.Tests/Resources/old-skin/score-dot.png b/osu.Game.Rulesets.Osu.Tests/Resources/old-skin/score-dot.png
new file mode 100644
index 0000000000000000000000000000000000000000..80c39b874533f1996978af8ada97133b743870a8
GIT binary patch
literal 771
zcmV+e1N{7nP)<h;3K|Lk000e1NJLTq000sI002A)1^@s6YiQ~b0000PbVXQnQ*UN;
zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!rAb6VRCwC#n7@w_K@`V#*;_mj;;F2}
zKtgfXoSGO53StEfv9_@@v7z!mkb+L+Pq3Ae%8G=71PPSHXtWRvM#STX5JZmKU3UDw
z&0DkHp_iDebSL>_XP0^3eKYf&7eE$5NN3S}(it^R$P@B}JRwiW6Y_*SAy4SP5!!0C
zTE9F<CX+HQGQY&>JKtC>>NlHB>x7U?fC3eMrUE}-6&6|p1Lzp5^Zgp4;-?Tka0Ir&
z1rTBaEJ%Zoz;`eQ3$UbTh&3rgX9|7}x(Kd<2wyLO^E@RI`3er0F^e8jrdymkWwHaJ
zU>EG6-At#`*8_n7WhgqG&Jb^YGairM;r=~O+gUez%_x%?%@8~chr`cux!mVouO}vx
ziI~l1Vmh6Q;czJ0?Y5Q8W=ZG?xDRe~_LPX7{ta*sJS`LoBN8x8Qyg!)u8YB7AXw}%
zxJ%jddP>*89q=fXO1<p&`x`~vVw4#&e~y?3oYfUt=yR;7WipxlP$(oRit=0Isj4bP
zqfr@SZ{hYb@3QK1ZF?vdiv?)lX^qBcnzrMzhvIX&*zTkK^;si_>TEF6vaC~s48xE{
zqtTROY?u4ELr$I4>-A5|<x=|7k3kZ_hFFzKrA;wxRD*<8U<L-|a=G4UG**knLfVuW
zXCf7gMaP&2>~39QXWMIpY}VCkbsmq$cd@;G3M5vml{BBvrEa%t<@5R1rBdky#=iw0
zIjg12+aCmBcDQpy_7jQ3UL+DBYmj&PwOZ{J`d!cgAHWx$%}VBs{OkvExyH8F_z-XN
zhAjBd4tYuwo)#^QA>$xAWkltmAR9EuCtu}5>6DRg%ppIcnq=Aa2%R;=oZ@xF169W7
zDr`CzH^QVBIE8JK`;M1drwJD)wp9Li|3LU5zyS0^RhH-3lmq|(002ovPDHLkV1mea
BUy%R+

literal 0
HcmV?d00001

diff --git a/osu.Game.Rulesets.Osu.Tests/Resources/old-skin/score-percent.png b/osu.Game.Rulesets.Osu.Tests/Resources/old-skin/score-percent.png
new file mode 100644
index 0000000000000000000000000000000000000000..fc750abc7e80287192efb65633e58b6b19e47125
GIT binary patch
literal 4904
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
aBftRVw!D&5)M2&&0000<MNUMnLSTaY-$WSz

literal 0
HcmV?d00001

diff --git a/osu.Game.Rulesets.Osu.Tests/Resources/old-skin/score-x.png b/osu.Game.Rulesets.Osu.Tests/Resources/old-skin/score-x.png
new file mode 100644
index 0000000000000000000000000000000000000000..779773f8bdedd6c382b39e66b967b206cc5cdbda
GIT binary patch
literal 2536
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

literal 0
HcmV?d00001

diff --git a/osu.Game.Rulesets.Osu.Tests/Resources/old-skin/skin.ini b/osu.Game.Rulesets.Osu.Tests/Resources/old-skin/skin.ini
index 5369de24e9..89bcd68343 100644
--- a/osu.Game.Rulesets.Osu.Tests/Resources/old-skin/skin.ini
+++ b/osu.Game.Rulesets.Osu.Tests/Resources/old-skin/skin.ini
@@ -1,2 +1,6 @@
 [General]
-Version: 1.0
\ No newline at end of file
+Version: 1.0
+
+[Fonts]
+HitCircleOverlap: 3
+ScoreOverlap: 3
\ No newline at end of file

From e4afe717d5b569fe9a6a7bca1bb8891b2cffee62 Mon Sep 17 00:00:00 2001
From: Salman Ahmed <frenzibyte@gmail.com>
Date: Tue, 2 Mar 2021 21:23:38 +0300
Subject: [PATCH 02/13] Publicize legacy coordinates container and sprite scale

---
 osu.Game.Rulesets.Osu/Skinning/Legacy/LegacySpinner.cs | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/osu.Game.Rulesets.Osu/Skinning/Legacy/LegacySpinner.cs b/osu.Game.Rulesets.Osu/Skinning/Legacy/LegacySpinner.cs
index 5df8f8a485..06443ca8b8 100644
--- a/osu.Game.Rulesets.Osu/Skinning/Legacy/LegacySpinner.cs
+++ b/osu.Game.Rulesets.Osu/Skinning/Legacy/LegacySpinner.cs
@@ -16,7 +16,7 @@ namespace osu.Game.Rulesets.Osu.Skinning.Legacy
 {
     public abstract class LegacySpinner : CompositeDrawable
     {
-        protected const float SPRITE_SCALE = 0.625f;
+        public const float SPRITE_SCALE = 0.625f;
 
         protected DrawableSpinner DrawableSpinner { get; private set; }
 
@@ -134,7 +134,7 @@ namespace osu.Game.Rulesets.Osu.Skinning.Legacy
         /// A <see cref="Container"/> simulating osu!stable's absolute screen-space,
         /// for perfect placements of legacy spinner components with legacy coordinates.
         /// </summary>
-        protected class LegacyCoordinatesContainer : Container
+        public class LegacyCoordinatesContainer : Container
         {
             /// <summary>
             /// An offset that simulates stable's spinner top offset,

From 1841a4d1c977e04377d7427681a93ad09d8c293d Mon Sep 17 00:00:00 2001
From: Salman Ahmed <frenzibyte@gmail.com>
Date: Tue, 2 Mar 2021 21:37:25 +0300
Subject: [PATCH 03/13] Extract legacy spinner presence to lazy field

---
 .../Legacy/OsuLegacySkinTransformer.cs        | 30 ++++++++++++++++---
 1 file changed, 26 insertions(+), 4 deletions(-)

diff --git a/osu.Game.Rulesets.Osu/Skinning/Legacy/OsuLegacySkinTransformer.cs b/osu.Game.Rulesets.Osu/Skinning/Legacy/OsuLegacySkinTransformer.cs
index d74f885573..d4a403fbd2 100644
--- a/osu.Game.Rulesets.Osu/Skinning/Legacy/OsuLegacySkinTransformer.cs
+++ b/osu.Game.Rulesets.Osu/Skinning/Legacy/OsuLegacySkinTransformer.cs
@@ -13,6 +13,10 @@ namespace osu.Game.Rulesets.Osu.Skinning.Legacy
     {
         private Lazy<bool> hasHitCircle;
 
+        private Lazy<SpinnerStyle> spinnerStyle;
+
+        private bool hasSpinner => spinnerStyle.Value != SpinnerStyle.Modern;
+
         /// <summary>
         /// On osu-stable, hitcircles have 5 pixels of transparent padding on each side to allow for shadows etc.
         /// Their hittable area is 128px, but the actual circle portion is 118px.
@@ -30,6 +34,19 @@ namespace osu.Game.Rulesets.Osu.Skinning.Legacy
         private void sourceChanged()
         {
             hasHitCircle = new Lazy<bool>(() => Source.GetTexture("hitcircle") != null);
+
+            spinnerStyle = new Lazy<SpinnerStyle>(() =>
+            {
+                bool hasBackground = Source.GetTexture("spinner-background") != null;
+
+                if (Source.GetTexture("spinner-top") != null && !hasBackground)
+                    return SpinnerStyle.NewLegacy;
+
+                if (hasBackground)
+                    return SpinnerStyle.OldLegacy;
+
+                return SpinnerStyle.Modern;
+            });
         }
 
         public override Drawable GetDrawableComponent(ISkinComponent component)
@@ -110,11 +127,9 @@ namespace osu.Game.Rulesets.Osu.Skinning.Legacy
                         };
 
                 case OsuSkinComponents.SpinnerBody:
-                    bool hasBackground = Source.GetTexture("spinner-background") != null;
-
-                    if (Source.GetTexture("spinner-top") != null && !hasBackground)
+                    if (spinnerStyle.Value == SpinnerStyle.NewLegacy)
                         return new LegacyNewStyleSpinner();
-                    else if (hasBackground)
+                    else if (spinnerStyle.Value == SpinnerStyle.OldLegacy)
                         return new LegacyOldStyleSpinner();
 
                     return null;
@@ -151,5 +166,12 @@ namespace osu.Game.Rulesets.Osu.Skinning.Legacy
 
             return Source.GetConfig<TLookup, TValue>(lookup);
         }
+
+        private enum SpinnerStyle
+        {
+            NewLegacy,
+            OldLegacy,
+            Modern,
+        }
     }
 }

From c441e993ff5961cba259e56b162c7ee384f0afc7 Mon Sep 17 00:00:00 2001
From: Salman Ahmed <frenzibyte@gmail.com>
Date: Tue, 2 Mar 2021 21:43:32 +0300
Subject: [PATCH 04/13] Separate "gained bonus" to a read-only bindable

---
 .../Objects/Drawables/DrawableSpinner.cs      | 17 +++----
 osu.Game.Rulesets.Osu/OsuSkinComponents.cs    |  3 +-
 .../Skinning/Default/SpinnerBonusDisplay.cs   | 47 -------------------
 3 files changed, 11 insertions(+), 56 deletions(-)
 delete mode 100644 osu.Game.Rulesets.Osu/Skinning/Default/SpinnerBonusDisplay.cs

diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs
index d02376b6c3..f16c1fc9d9 100644
--- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs
+++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs
@@ -33,12 +33,18 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
         public SpinnerSpmCounter SpmCounter { get; private set; }
 
         private Container<DrawableSpinnerTick> ticks;
-        private SpinnerBonusDisplay bonusDisplay;
         private PausableSkinnableSound spinningSample;
 
         private Bindable<bool> isSpinning;
         private bool spinnerFrequencyModulate;
 
+        /// <summary>
+        /// The amount of bonus score gained from spinning after the required number of spins, for display purposes.
+        /// </summary>
+        public IBindable<double> GainedBonus => gainedBonus;
+
+        private readonly Bindable<double> gainedBonus = new Bindable<double>();
+
         public DrawableSpinner()
             : this(null)
         {
@@ -76,12 +82,6 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
                     Y = 120,
                     Alpha = 0
                 },
-                bonusDisplay = new SpinnerBonusDisplay
-                {
-                    Anchor = Anchor.Centre,
-                    Origin = Anchor.Centre,
-                    Y = -120,
-                },
                 spinningSample = new PausableSkinnableSound
                 {
                     Volume = { Value = 0 },
@@ -293,8 +293,9 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
                 if (tick != null)
                 {
                     tick.TriggerResult(true);
+
                     if (tick is DrawableSpinnerBonusTick)
-                        bonusDisplay.SetBonusCount(spins - HitObject.SpinsRequired);
+                        gainedBonus.Value = tick.Result.Judgement.MaxNumericResult * (spins - HitObject.SpinsRequired);
                 }
 
                 wholeSpins++;
diff --git a/osu.Game.Rulesets.Osu/OsuSkinComponents.cs b/osu.Game.Rulesets.Osu/OsuSkinComponents.cs
index 2883f0c187..131645406e 100644
--- a/osu.Game.Rulesets.Osu/OsuSkinComponents.cs
+++ b/osu.Game.Rulesets.Osu/OsuSkinComponents.cs
@@ -18,6 +18,7 @@ namespace osu.Game.Rulesets.Osu
         SliderFollowCircle,
         SliderBall,
         SliderBody,
-        SpinnerBody
+        SpinnerBody,
+        SpinnerBonusCounter,
     }
 }
diff --git a/osu.Game.Rulesets.Osu/Skinning/Default/SpinnerBonusDisplay.cs b/osu.Game.Rulesets.Osu/Skinning/Default/SpinnerBonusDisplay.cs
deleted file mode 100644
index c0db6228ef..0000000000
--- a/osu.Game.Rulesets.Osu/Skinning/Default/SpinnerBonusDisplay.cs
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
-// See the LICENCE file in the repository root for full licence text.
-
-using osu.Framework.Graphics;
-using osu.Framework.Graphics.Containers;
-using osu.Game.Graphics;
-using osu.Game.Graphics.Sprites;
-using osu.Game.Rulesets.Osu.Objects;
-
-namespace osu.Game.Rulesets.Osu.Skinning.Default
-{
-    /// <summary>
-    /// Shows incremental bonus score achieved for a spinner.
-    /// </summary>
-    public class SpinnerBonusDisplay : CompositeDrawable
-    {
-        private static readonly int score_per_tick = new SpinnerBonusTick().CreateJudgement().MaxNumericResult;
-
-        private readonly OsuSpriteText bonusCounter;
-
-        public SpinnerBonusDisplay()
-        {
-            AutoSizeAxes = Axes.Both;
-
-            InternalChild = bonusCounter = new OsuSpriteText
-            {
-                Anchor = Anchor.Centre,
-                Origin = Anchor.Centre,
-                Font = OsuFont.Numeric.With(size: 24),
-                Alpha = 0,
-            };
-        }
-
-        private int displayedCount;
-
-        public void SetBonusCount(int count)
-        {
-            if (displayedCount == count)
-                return;
-
-            displayedCount = count;
-            bonusCounter.Text = $"{score_per_tick * count}";
-            bonusCounter.FadeOutFromOne(1500);
-            bonusCounter.ScaleTo(1.5f).Then().ScaleTo(1f, 1000, Easing.OutQuint);
-        }
-    }
-}

From 3f1d36ee6bced20b47a167b8780d2a736001c282 Mon Sep 17 00:00:00 2001
From: Salman Ahmed <frenzibyte@gmail.com>
Date: Tue, 2 Mar 2021 21:49:38 +0300
Subject: [PATCH 05/13] Add default spinner bonus counter piece

---
 .../Objects/Drawables/DrawableSpinner.cs      |  1 +
 .../Default/DefaultSpinnerBonusCounter.cs     | 51 +++++++++++++++++++
 2 files changed, 52 insertions(+)
 create mode 100644 osu.Game.Rulesets.Osu/Skinning/Default/DefaultSpinnerBonusCounter.cs

diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs
index f16c1fc9d9..4f5afc85ab 100644
--- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs
+++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs
@@ -82,6 +82,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
                     Y = 120,
                     Alpha = 0
                 },
+                new SkinnableDrawable(new OsuSkinComponent(OsuSkinComponents.SpinnerBonusCounter), _ => new DefaultSpinnerBonusCounter()),
                 spinningSample = new PausableSkinnableSound
                 {
                     Volume = { Value = 0 },
diff --git a/osu.Game.Rulesets.Osu/Skinning/Default/DefaultSpinnerBonusCounter.cs b/osu.Game.Rulesets.Osu/Skinning/Default/DefaultSpinnerBonusCounter.cs
new file mode 100644
index 0000000000..633766290f
--- /dev/null
+++ b/osu.Game.Rulesets.Osu/Skinning/Default/DefaultSpinnerBonusCounter.cs
@@ -0,0 +1,51 @@
+// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
+// See the LICENCE file in the repository root for full licence text.
+
+using osu.Framework.Allocation;
+using osu.Framework.Bindables;
+using osu.Framework.Graphics;
+using osu.Framework.Graphics.Containers;
+using osu.Game.Graphics;
+using osu.Game.Graphics.Sprites;
+using osu.Game.Rulesets.Objects.Drawables;
+using osu.Game.Rulesets.Osu.Objects.Drawables;
+
+namespace osu.Game.Rulesets.Osu.Skinning.Default
+{
+    public class DefaultSpinnerBonusCounter : CompositeDrawable
+    {
+        private OsuSpriteText bonusCounter;
+
+        private DrawableSpinner drawableSpinner;
+
+        private IBindable<double> gainedBonus;
+
+        [BackgroundDependencyLoader]
+        private void load(DrawableHitObject drawableHitObject)
+        {
+            drawableSpinner = (DrawableSpinner)drawableHitObject;
+
+            InternalChild = bonusCounter = new OsuSpriteText
+            {
+                Alpha = 0,
+                Anchor = Anchor.Centre,
+                Origin = Anchor.Centre,
+                Font = OsuFont.Numeric.With(size: 24),
+                Y = -120,
+            };
+        }
+
+        protected override void LoadComplete()
+        {
+            base.LoadComplete();
+
+            gainedBonus = drawableSpinner.GainedBonus.GetBoundCopy();
+            gainedBonus.BindValueChanged(bonus =>
+            {
+                bonusCounter.Text = $"{bonus.NewValue}";
+                bonusCounter.FadeOutFromOne(1500);
+                bonusCounter.ScaleTo(1.5f).Then().ScaleTo(1f, 1000, Easing.OutQuint);
+            });
+        }
+    }
+}

From 30f07aa9fcc22167e429be3bb798309ab3964ec4 Mon Sep 17 00:00:00 2001
From: Salman Ahmed <frenzibyte@gmail.com>
Date: Tue, 2 Mar 2021 21:49:46 +0300
Subject: [PATCH 06/13] Add legacy spinner bonus counter piece

---
 .../Legacy/LegacySpinnerBonusCounter.cs       | 56 +++++++++++++++++++
 .../Legacy/OsuLegacySkinTransformer.cs        |  9 +++
 2 files changed, 65 insertions(+)
 create mode 100644 osu.Game.Rulesets.Osu/Skinning/Legacy/LegacySpinnerBonusCounter.cs

diff --git a/osu.Game.Rulesets.Osu/Skinning/Legacy/LegacySpinnerBonusCounter.cs b/osu.Game.Rulesets.Osu/Skinning/Legacy/LegacySpinnerBonusCounter.cs
new file mode 100644
index 0000000000..3c4a6be4dd
--- /dev/null
+++ b/osu.Game.Rulesets.Osu/Skinning/Legacy/LegacySpinnerBonusCounter.cs
@@ -0,0 +1,56 @@
+// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
+// See the LICENCE file in the repository root for full licence text.
+
+using osu.Framework.Allocation;
+using osu.Framework.Bindables;
+using osu.Framework.Graphics;
+using osu.Framework.Graphics.Containers;
+using osu.Game.Rulesets.Objects.Drawables;
+using osu.Game.Rulesets.Osu.Objects.Drawables;
+using osu.Game.Skinning;
+using osuTK;
+using static osu.Game.Rulesets.Osu.Skinning.Legacy.LegacySpinner;
+
+namespace osu.Game.Rulesets.Osu.Skinning.Legacy
+{
+    public class LegacySpinnerBonusCounter : CompositeDrawable
+    {
+        private LegacySpriteText bonusCounter;
+
+        private DrawableSpinner drawableSpinner;
+
+        private IBindable<double> gainedBonus;
+
+        [BackgroundDependencyLoader]
+        private void load(DrawableHitObject drawableHitObject, ISkinSource source)
+        {
+            drawableSpinner = (DrawableSpinner)drawableHitObject;
+
+            InternalChild = new LegacyCoordinatesContainer
+            {
+                Child = bonusCounter = ((LegacySpriteText)source.GetDrawableComponent(new HUDSkinComponent(HUDSkinComponents.ScoreText))).With(s =>
+                {
+                    s.Alpha = 0f;
+                    s.Anchor = Anchor.TopCentre;
+                    s.Origin = Anchor.Centre;
+                    s.Font = s.Font.With(fixedWidth: false);
+                    s.Scale = new Vector2(SPRITE_SCALE);
+                    s.Y = LegacyCoordinatesContainer.SPINNER_TOP_OFFSET + 299;
+                }),
+            };
+        }
+
+        protected override void LoadComplete()
+        {
+            base.LoadComplete();
+
+            gainedBonus = drawableSpinner.GainedBonus.GetBoundCopy();
+            gainedBonus.BindValueChanged(bonus =>
+            {
+                bonusCounter.Text = $"{bonus.NewValue}";
+                bonusCounter.FadeOutFromOne(800, Easing.Out);
+                bonusCounter.ScaleTo(SPRITE_SCALE * 2f).Then().ScaleTo(SPRITE_SCALE * 1.28f, 800, Easing.Out);
+            });
+        }
+    }
+}
diff --git a/osu.Game.Rulesets.Osu/Skinning/Legacy/OsuLegacySkinTransformer.cs b/osu.Game.Rulesets.Osu/Skinning/Legacy/OsuLegacySkinTransformer.cs
index d4a403fbd2..ed09031fc1 100644
--- a/osu.Game.Rulesets.Osu/Skinning/Legacy/OsuLegacySkinTransformer.cs
+++ b/osu.Game.Rulesets.Osu/Skinning/Legacy/OsuLegacySkinTransformer.cs
@@ -6,6 +6,7 @@ using osu.Framework.Bindables;
 using osu.Framework.Graphics;
 using osu.Game.Skinning;
 using osuTK;
+using static osu.Game.Skinning.LegacySkinConfiguration;
 
 namespace osu.Game.Rulesets.Osu.Skinning.Legacy
 {
@@ -17,6 +18,8 @@ namespace osu.Game.Rulesets.Osu.Skinning.Legacy
 
         private bool hasSpinner => spinnerStyle.Value != SpinnerStyle.Modern;
 
+        private bool hasScoreFont => this.HasFont(GetConfig<LegacySetting, string>(LegacySetting.ScorePrefix)?.Value ?? "score");
+
         /// <summary>
         /// On osu-stable, hitcircles have 5 pixels of transparent padding on each side to allow for shadows etc.
         /// Their hittable area is 128px, but the actual circle portion is 118px.
@@ -133,6 +136,12 @@ namespace osu.Game.Rulesets.Osu.Skinning.Legacy
                         return new LegacyOldStyleSpinner();
 
                     return null;
+
+                case OsuSkinComponents.SpinnerBonusCounter:
+                    if (hasSpinner && hasScoreFont)
+                        return new LegacySpinnerBonusCounter();
+
+                    return null;
             }
 
             return null;

From 020a03e01ee7284d37359a67704b3e72ed8ff50a Mon Sep 17 00:00:00 2001
From: Salman Ahmed <frenzibyte@gmail.com>
Date: Sat, 13 Mar 2021 05:22:20 +0300
Subject: [PATCH 07/13] Use sensible "score per tick" constant

---
 osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs
index 8534cd89d7..1ec3c877e9 100644
--- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs
+++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs
@@ -289,6 +289,8 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
 
         private void fadeInCounter() => SpmCounter.FadeIn(HitObject.TimeFadeIn);
 
+        private static readonly int score_per_tick = new SpinnerBonusTick.OsuSpinnerBonusTickJudgement().MaxNumericResult;
+
         private int wholeSpins;
 
         private void updateBonusScore()
@@ -315,7 +317,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
                     tick.TriggerResult(true);
 
                     if (tick is DrawableSpinnerBonusTick)
-                        gainedBonus.Value = tick.Result.Judgement.MaxNumericResult * (spins - HitObject.SpinsRequired);
+                        gainedBonus.Value = score_per_tick * (spins - HitObject.SpinsRequired);
                 }
 
                 wholeSpins++;

From 8fdab5a7de4a881604ebb5da7547106a153bf9dc Mon Sep 17 00:00:00 2001
From: Salman Ahmed <frenzibyte@gmail.com>
Date: Fri, 12 Mar 2021 02:37:07 +0300
Subject: [PATCH 08/13] Revert legacy spinner presence changes and bonus
 counter component

No longer necessary, after inlining legacy coordinates logic to `LegacySpinner` and limiting precisely-positioned legacy components there
---
 .../Objects/Drawables/DrawableSpinner.cs      |  1 -
 osu.Game.Rulesets.Osu/OsuSkinComponents.cs    |  1 -
 .../Legacy/OsuLegacySkinTransformer.cs        | 39 ++-----------------
 3 files changed, 4 insertions(+), 37 deletions(-)

diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs
index 1ec3c877e9..a4919d5061 100644
--- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs
+++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs
@@ -82,7 +82,6 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
                     Y = 120,
                     Alpha = 0
                 },
-                new SkinnableDrawable(new OsuSkinComponent(OsuSkinComponents.SpinnerBonusCounter), _ => new DefaultSpinnerBonusCounter()),
                 spinningSample = new PausableSkinnableSound
                 {
                     Volume = { Value = 0 },
diff --git a/osu.Game.Rulesets.Osu/OsuSkinComponents.cs b/osu.Game.Rulesets.Osu/OsuSkinComponents.cs
index 131645406e..fcb544fa5b 100644
--- a/osu.Game.Rulesets.Osu/OsuSkinComponents.cs
+++ b/osu.Game.Rulesets.Osu/OsuSkinComponents.cs
@@ -19,6 +19,5 @@ namespace osu.Game.Rulesets.Osu
         SliderBall,
         SliderBody,
         SpinnerBody,
-        SpinnerBonusCounter,
     }
 }
diff --git a/osu.Game.Rulesets.Osu/Skinning/Legacy/OsuLegacySkinTransformer.cs b/osu.Game.Rulesets.Osu/Skinning/Legacy/OsuLegacySkinTransformer.cs
index ed09031fc1..d74f885573 100644
--- a/osu.Game.Rulesets.Osu/Skinning/Legacy/OsuLegacySkinTransformer.cs
+++ b/osu.Game.Rulesets.Osu/Skinning/Legacy/OsuLegacySkinTransformer.cs
@@ -6,7 +6,6 @@ using osu.Framework.Bindables;
 using osu.Framework.Graphics;
 using osu.Game.Skinning;
 using osuTK;
-using static osu.Game.Skinning.LegacySkinConfiguration;
 
 namespace osu.Game.Rulesets.Osu.Skinning.Legacy
 {
@@ -14,12 +13,6 @@ namespace osu.Game.Rulesets.Osu.Skinning.Legacy
     {
         private Lazy<bool> hasHitCircle;
 
-        private Lazy<SpinnerStyle> spinnerStyle;
-
-        private bool hasSpinner => spinnerStyle.Value != SpinnerStyle.Modern;
-
-        private bool hasScoreFont => this.HasFont(GetConfig<LegacySetting, string>(LegacySetting.ScorePrefix)?.Value ?? "score");
-
         /// <summary>
         /// On osu-stable, hitcircles have 5 pixels of transparent padding on each side to allow for shadows etc.
         /// Their hittable area is 128px, but the actual circle portion is 118px.
@@ -37,19 +30,6 @@ namespace osu.Game.Rulesets.Osu.Skinning.Legacy
         private void sourceChanged()
         {
             hasHitCircle = new Lazy<bool>(() => Source.GetTexture("hitcircle") != null);
-
-            spinnerStyle = new Lazy<SpinnerStyle>(() =>
-            {
-                bool hasBackground = Source.GetTexture("spinner-background") != null;
-
-                if (Source.GetTexture("spinner-top") != null && !hasBackground)
-                    return SpinnerStyle.NewLegacy;
-
-                if (hasBackground)
-                    return SpinnerStyle.OldLegacy;
-
-                return SpinnerStyle.Modern;
-            });
         }
 
         public override Drawable GetDrawableComponent(ISkinComponent component)
@@ -130,18 +110,14 @@ namespace osu.Game.Rulesets.Osu.Skinning.Legacy
                         };
 
                 case OsuSkinComponents.SpinnerBody:
-                    if (spinnerStyle.Value == SpinnerStyle.NewLegacy)
+                    bool hasBackground = Source.GetTexture("spinner-background") != null;
+
+                    if (Source.GetTexture("spinner-top") != null && !hasBackground)
                         return new LegacyNewStyleSpinner();
-                    else if (spinnerStyle.Value == SpinnerStyle.OldLegacy)
+                    else if (hasBackground)
                         return new LegacyOldStyleSpinner();
 
                     return null;
-
-                case OsuSkinComponents.SpinnerBonusCounter:
-                    if (hasSpinner && hasScoreFont)
-                        return new LegacySpinnerBonusCounter();
-
-                    return null;
             }
 
             return null;
@@ -175,12 +151,5 @@ namespace osu.Game.Rulesets.Osu.Skinning.Legacy
 
             return Source.GetConfig<TLookup, TValue>(lookup);
         }
-
-        private enum SpinnerStyle
-        {
-            NewLegacy,
-            OldLegacy,
-            Modern,
-        }
     }
 }

From 774ebf50bca5d5c0022c824db4e0d5d50e60281b Mon Sep 17 00:00:00 2001
From: Salman Ahmed <frenzibyte@gmail.com>
Date: Fri, 12 Mar 2021 02:38:25 +0300
Subject: [PATCH 09/13] Move legacy spinner bonus counter to `LegacySpinner`

---
 .../Skinning/Legacy/LegacySpinner.cs          | 62 +++++++++++++------
 .../Legacy/LegacySpinnerBonusCounter.cs       | 56 -----------------
 2 files changed, 43 insertions(+), 75 deletions(-)
 delete mode 100644 osu.Game.Rulesets.Osu/Skinning/Legacy/LegacySpinnerBonusCounter.cs

diff --git a/osu.Game.Rulesets.Osu/Skinning/Legacy/LegacySpinner.cs b/osu.Game.Rulesets.Osu/Skinning/Legacy/LegacySpinner.cs
index 513888db53..b0b9cba2bd 100644
--- a/osu.Game.Rulesets.Osu/Skinning/Legacy/LegacySpinner.cs
+++ b/osu.Game.Rulesets.Osu/Skinning/Legacy/LegacySpinner.cs
@@ -32,6 +32,8 @@ namespace osu.Game.Rulesets.Osu.Skinning.Legacy
         private Sprite spin;
         private Sprite clear;
 
+        private LegacySpriteText bonusCounter;
+
         [BackgroundDependencyLoader]
         private void load(DrawableHitObject drawableHitObject, ISkinSource source)
         {
@@ -45,36 +47,58 @@ namespace osu.Game.Rulesets.Osu.Skinning.Legacy
 
             DrawableSpinner = (DrawableSpinner)drawableHitObject;
 
-            AddRangeInternal(new[]
+            AddInternal(new Container
             {
-                spin = new Sprite
+                Depth = float.MinValue,
+                RelativeSizeAxes = Axes.Both,
+                Children = new Drawable[]
                 {
-                    Anchor = Anchor.TopCentre,
-                    Origin = Anchor.Centre,
-                    Depth = float.MinValue,
-                    Texture = source.GetTexture("spinner-spin"),
-                    Scale = new Vector2(SPRITE_SCALE),
-                    Y = SPINNER_TOP_OFFSET + 335,
-                },
-                clear = new Sprite
-                {
-                    Alpha = 0,
-                    Anchor = Anchor.TopCentre,
-                    Origin = Anchor.Centre,
-                    Depth = float.MinValue,
-                    Texture = source.GetTexture("spinner-clear"),
-                    Scale = new Vector2(SPRITE_SCALE),
-                    Y = SPINNER_TOP_OFFSET + 115,
-                },
+                    spin = new Sprite
+                    {
+                        Anchor = Anchor.TopCentre,
+                        Origin = Anchor.Centre,
+                        Texture = source.GetTexture("spinner-spin"),
+                        Scale = new Vector2(SPRITE_SCALE),
+                        Y = SPINNER_TOP_OFFSET + 335,
+                    },
+                    clear = new Sprite
+                    {
+                        Alpha = 0,
+                        Anchor = Anchor.TopCentre,
+                        Origin = Anchor.Centre,
+                        Texture = source.GetTexture("spinner-clear"),
+                        Scale = new Vector2(SPRITE_SCALE),
+                        Y = SPINNER_TOP_OFFSET + 115,
+                    },
+                    bonusCounter = ((LegacySpriteText)source.GetDrawableComponent(new HUDSkinComponent(HUDSkinComponents.ScoreText))).With(s =>
+                    {
+                        s.Alpha = 0f;
+                        s.Anchor = Anchor.TopCentre;
+                        s.Origin = Anchor.Centre;
+                        s.Font = s.Font.With(fixedWidth: false);
+                        s.Scale = new Vector2(SPRITE_SCALE);
+                        s.Y = SPINNER_TOP_OFFSET + 299;
+                    }),
+                }
             });
         }
 
+        private IBindable<double> gainedBonus;
+
         private readonly Bindable<bool> completed = new Bindable<bool>();
 
         protected override void LoadComplete()
         {
             base.LoadComplete();
 
+            gainedBonus = DrawableSpinner.GainedBonus.GetBoundCopy();
+            gainedBonus.BindValueChanged(bonus =>
+            {
+                bonusCounter.Text = $"{bonus.NewValue}";
+                bonusCounter.FadeOutFromOne(800, Easing.Out);
+                bonusCounter.ScaleTo(SPRITE_SCALE * 2f).Then().ScaleTo(SPRITE_SCALE * 1.28f, 800, Easing.Out);
+            });
+
             completed.BindValueChanged(onCompletedChanged, true);
 
             DrawableSpinner.ApplyCustomUpdateState += UpdateStateTransforms;
diff --git a/osu.Game.Rulesets.Osu/Skinning/Legacy/LegacySpinnerBonusCounter.cs b/osu.Game.Rulesets.Osu/Skinning/Legacy/LegacySpinnerBonusCounter.cs
deleted file mode 100644
index 3c4a6be4dd..0000000000
--- a/osu.Game.Rulesets.Osu/Skinning/Legacy/LegacySpinnerBonusCounter.cs
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
-// See the LICENCE file in the repository root for full licence text.
-
-using osu.Framework.Allocation;
-using osu.Framework.Bindables;
-using osu.Framework.Graphics;
-using osu.Framework.Graphics.Containers;
-using osu.Game.Rulesets.Objects.Drawables;
-using osu.Game.Rulesets.Osu.Objects.Drawables;
-using osu.Game.Skinning;
-using osuTK;
-using static osu.Game.Rulesets.Osu.Skinning.Legacy.LegacySpinner;
-
-namespace osu.Game.Rulesets.Osu.Skinning.Legacy
-{
-    public class LegacySpinnerBonusCounter : CompositeDrawable
-    {
-        private LegacySpriteText bonusCounter;
-
-        private DrawableSpinner drawableSpinner;
-
-        private IBindable<double> gainedBonus;
-
-        [BackgroundDependencyLoader]
-        private void load(DrawableHitObject drawableHitObject, ISkinSource source)
-        {
-            drawableSpinner = (DrawableSpinner)drawableHitObject;
-
-            InternalChild = new LegacyCoordinatesContainer
-            {
-                Child = bonusCounter = ((LegacySpriteText)source.GetDrawableComponent(new HUDSkinComponent(HUDSkinComponents.ScoreText))).With(s =>
-                {
-                    s.Alpha = 0f;
-                    s.Anchor = Anchor.TopCentre;
-                    s.Origin = Anchor.Centre;
-                    s.Font = s.Font.With(fixedWidth: false);
-                    s.Scale = new Vector2(SPRITE_SCALE);
-                    s.Y = LegacyCoordinatesContainer.SPINNER_TOP_OFFSET + 299;
-                }),
-            };
-        }
-
-        protected override void LoadComplete()
-        {
-            base.LoadComplete();
-
-            gainedBonus = drawableSpinner.GainedBonus.GetBoundCopy();
-            gainedBonus.BindValueChanged(bonus =>
-            {
-                bonusCounter.Text = $"{bonus.NewValue}";
-                bonusCounter.FadeOutFromOne(800, Easing.Out);
-                bonusCounter.ScaleTo(SPRITE_SCALE * 2f).Then().ScaleTo(SPRITE_SCALE * 1.28f, 800, Easing.Out);
-            });
-        }
-    }
-}

From 98f6e16113debd5a4890d7e6eb6aad4a70226bad Mon Sep 17 00:00:00 2001
From: Salman Ahmed <frenzibyte@gmail.com>
Date: Fri, 12 Mar 2021 02:38:40 +0300
Subject: [PATCH 10/13] Move default spinner bonus counter to new
 `DefaultSpinner`

---
 .../Objects/Drawables/DrawableSpinner.cs      |  2 +-
 ...innerBonusCounter.cs => DefaultSpinner.cs} | 38 +++++++++++++------
 .../Skinning/Default/DefaultSpinnerDisc.cs    |  5 ---
 3 files changed, 28 insertions(+), 17 deletions(-)
 rename osu.Game.Rulesets.Osu/Skinning/Default/{DefaultSpinnerBonusCounter.cs => DefaultSpinner.cs} (62%)

diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs
index a4919d5061..f995140123 100644
--- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs
+++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs
@@ -71,7 +71,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
                     RelativeSizeAxes = Axes.Y,
                     Children = new Drawable[]
                     {
-                        new SkinnableDrawable(new OsuSkinComponent(OsuSkinComponents.SpinnerBody), _ => new DefaultSpinnerDisc()),
+                        new SkinnableDrawable(new OsuSkinComponent(OsuSkinComponents.SpinnerBody), _ => new DefaultSpinner()),
                         RotationTracker = new SpinnerRotationTracker(this)
                     }
                 },
diff --git a/osu.Game.Rulesets.Osu/Skinning/Default/DefaultSpinnerBonusCounter.cs b/osu.Game.Rulesets.Osu/Skinning/Default/DefaultSpinner.cs
similarity index 62%
rename from osu.Game.Rulesets.Osu/Skinning/Default/DefaultSpinnerBonusCounter.cs
rename to osu.Game.Rulesets.Osu/Skinning/Default/DefaultSpinner.cs
index 633766290f..83676d3784 100644
--- a/osu.Game.Rulesets.Osu/Skinning/Default/DefaultSpinnerBonusCounter.cs
+++ b/osu.Game.Rulesets.Osu/Skinning/Default/DefaultSpinner.cs
@@ -12,29 +12,45 @@ using osu.Game.Rulesets.Osu.Objects.Drawables;
 
 namespace osu.Game.Rulesets.Osu.Skinning.Default
 {
-    public class DefaultSpinnerBonusCounter : CompositeDrawable
+    public class DefaultSpinner : CompositeDrawable
     {
-        private OsuSpriteText bonusCounter;
-
         private DrawableSpinner drawableSpinner;
 
-        private IBindable<double> gainedBonus;
+        private OsuSpriteText bonusCounter;
+
+        public DefaultSpinner()
+        {
+            RelativeSizeAxes = Axes.Both;
+            Anchor = Anchor.Centre;
+            Origin = Anchor.Centre;
+        }
 
         [BackgroundDependencyLoader]
         private void load(DrawableHitObject drawableHitObject)
         {
             drawableSpinner = (DrawableSpinner)drawableHitObject;
 
-            InternalChild = bonusCounter = new OsuSpriteText
+            AddRangeInternal(new Drawable[]
             {
-                Alpha = 0,
-                Anchor = Anchor.Centre,
-                Origin = Anchor.Centre,
-                Font = OsuFont.Numeric.With(size: 24),
-                Y = -120,
-            };
+                new DefaultSpinnerDisc
+                {
+                    RelativeSizeAxes = Axes.Both,
+                    Anchor = Anchor.Centre,
+                    Origin = Anchor.Centre,
+                },
+                bonusCounter = new OsuSpriteText
+                {
+                    Alpha = 0,
+                    Anchor = Anchor.Centre,
+                    Origin = Anchor.Centre,
+                    Font = OsuFont.Numeric.With(size: 24),
+                    Y = -120,
+                }
+            });
         }
 
+        private IBindable<double> gainedBonus;
+
         protected override void LoadComplete()
         {
             base.LoadComplete();
diff --git a/osu.Game.Rulesets.Osu/Skinning/Default/DefaultSpinnerDisc.cs b/osu.Game.Rulesets.Osu/Skinning/Default/DefaultSpinnerDisc.cs
index 667fee1495..542f3eff0d 100644
--- a/osu.Game.Rulesets.Osu/Skinning/Default/DefaultSpinnerDisc.cs
+++ b/osu.Game.Rulesets.Osu/Skinning/Default/DefaultSpinnerDisc.cs
@@ -40,14 +40,9 @@ namespace osu.Game.Rulesets.Osu.Skinning.Default
 
         public DefaultSpinnerDisc()
         {
-            RelativeSizeAxes = Axes.Both;
-
             // we are slightly bigger than our parent, to clip the top and bottom of the circle
             // this should probably be revisited when scaled spinners are a thing.
             Scale = new Vector2(initial_scale);
-
-            Anchor = Anchor.Centre;
-            Origin = Anchor.Centre;
         }
 
         [BackgroundDependencyLoader]

From 779c55d768a6723c1735ef92a26fedaec1dd6760 Mon Sep 17 00:00:00 2001
From: Salman Ahmed <frenzibyte@gmail.com>
Date: Sat, 13 Mar 2021 06:05:08 +0300
Subject: [PATCH 11/13] Fix potentially adding null legacy text to hierarchy

---
 .../Skinning/Legacy/LegacySpinner.cs          | 41 +++++++++++--------
 1 file changed, 25 insertions(+), 16 deletions(-)

diff --git a/osu.Game.Rulesets.Osu/Skinning/Legacy/LegacySpinner.cs b/osu.Game.Rulesets.Osu/Skinning/Legacy/LegacySpinner.cs
index b0b9cba2bd..610eb54316 100644
--- a/osu.Game.Rulesets.Osu/Skinning/Legacy/LegacySpinner.cs
+++ b/osu.Game.Rulesets.Osu/Skinning/Legacy/LegacySpinner.cs
@@ -47,7 +47,9 @@ namespace osu.Game.Rulesets.Osu.Skinning.Legacy
 
             DrawableSpinner = (DrawableSpinner)drawableHitObject;
 
-            AddInternal(new Container
+            Container overlayContainer;
+
+            AddInternal(overlayContainer = new Container
             {
                 Depth = float.MinValue,
                 RelativeSizeAxes = Axes.Both,
@@ -70,17 +72,21 @@ namespace osu.Game.Rulesets.Osu.Skinning.Legacy
                         Scale = new Vector2(SPRITE_SCALE),
                         Y = SPINNER_TOP_OFFSET + 115,
                     },
-                    bonusCounter = ((LegacySpriteText)source.GetDrawableComponent(new HUDSkinComponent(HUDSkinComponents.ScoreText))).With(s =>
-                    {
-                        s.Alpha = 0f;
-                        s.Anchor = Anchor.TopCentre;
-                        s.Origin = Anchor.Centre;
-                        s.Font = s.Font.With(fixedWidth: false);
-                        s.Scale = new Vector2(SPRITE_SCALE);
-                        s.Y = SPINNER_TOP_OFFSET + 299;
-                    }),
                 }
             });
+
+            bonusCounter = (LegacySpriteText)source.GetDrawableComponent(new HUDSkinComponent(HUDSkinComponents.ScoreText));
+
+            if (bonusCounter != null)
+            {
+                bonusCounter.Alpha = 0f;
+                bonusCounter.Anchor = Anchor.TopCentre;
+                bonusCounter.Origin = Anchor.Centre;
+                bonusCounter.Font = bonusCounter.Font.With(fixedWidth: false);
+                bonusCounter.Scale = new Vector2(SPRITE_SCALE);
+                bonusCounter.Y = SPINNER_TOP_OFFSET + 299;
+                overlayContainer.Add(bonusCounter);
+            }
         }
 
         private IBindable<double> gainedBonus;
@@ -91,13 +97,16 @@ namespace osu.Game.Rulesets.Osu.Skinning.Legacy
         {
             base.LoadComplete();
 
-            gainedBonus = DrawableSpinner.GainedBonus.GetBoundCopy();
-            gainedBonus.BindValueChanged(bonus =>
+            if (bonusCounter != null)
             {
-                bonusCounter.Text = $"{bonus.NewValue}";
-                bonusCounter.FadeOutFromOne(800, Easing.Out);
-                bonusCounter.ScaleTo(SPRITE_SCALE * 2f).Then().ScaleTo(SPRITE_SCALE * 1.28f, 800, Easing.Out);
-            });
+                gainedBonus = DrawableSpinner.GainedBonus.GetBoundCopy();
+                gainedBonus.BindValueChanged(bonus =>
+                {
+                    bonusCounter.Text = $"{bonus.NewValue}";
+                    bonusCounter.FadeOutFromOne(800, Easing.Out);
+                    bonusCounter.ScaleTo(SPRITE_SCALE * 2f).Then().ScaleTo(SPRITE_SCALE * 1.28f, 800, Easing.Out);
+                });
+            }
 
             completed.BindValueChanged(onCompletedChanged, true);
 

From 848adddd9285c3b22c93e6fa06f12c2e9f825c48 Mon Sep 17 00:00:00 2001
From: Salman Ahmed <frenzibyte@gmail.com>
Date: Mon, 15 Mar 2021 11:05:29 +0300
Subject: [PATCH 12/13] Use `double.ToString(InvariantInfo)` instead

---
 osu.Game.Rulesets.Osu/Skinning/Default/DefaultSpinner.cs | 3 ++-
 osu.Game.Rulesets.Osu/Skinning/Legacy/LegacySpinner.cs   | 3 ++-
 2 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/osu.Game.Rulesets.Osu/Skinning/Default/DefaultSpinner.cs b/osu.Game.Rulesets.Osu/Skinning/Default/DefaultSpinner.cs
index 83676d3784..891821fe2f 100644
--- a/osu.Game.Rulesets.Osu/Skinning/Default/DefaultSpinner.cs
+++ b/osu.Game.Rulesets.Osu/Skinning/Default/DefaultSpinner.cs
@@ -1,6 +1,7 @@
 // Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
 // See the LICENCE file in the repository root for full licence text.
 
+using System.Globalization;
 using osu.Framework.Allocation;
 using osu.Framework.Bindables;
 using osu.Framework.Graphics;
@@ -58,7 +59,7 @@ namespace osu.Game.Rulesets.Osu.Skinning.Default
             gainedBonus = drawableSpinner.GainedBonus.GetBoundCopy();
             gainedBonus.BindValueChanged(bonus =>
             {
-                bonusCounter.Text = $"{bonus.NewValue}";
+                bonusCounter.Text = bonus.NewValue.ToString(NumberFormatInfo.InvariantInfo);
                 bonusCounter.FadeOutFromOne(1500);
                 bonusCounter.ScaleTo(1.5f).Then().ScaleTo(1f, 1000, Easing.OutQuint);
             });
diff --git a/osu.Game.Rulesets.Osu/Skinning/Legacy/LegacySpinner.cs b/osu.Game.Rulesets.Osu/Skinning/Legacy/LegacySpinner.cs
index 610eb54316..6d4fbd7445 100644
--- a/osu.Game.Rulesets.Osu/Skinning/Legacy/LegacySpinner.cs
+++ b/osu.Game.Rulesets.Osu/Skinning/Legacy/LegacySpinner.cs
@@ -2,6 +2,7 @@
 // See the LICENCE file in the repository root for full licence text.
 
 using System;
+using System.Globalization;
 using osu.Framework.Allocation;
 using osu.Framework.Bindables;
 using osu.Framework.Graphics;
@@ -102,7 +103,7 @@ namespace osu.Game.Rulesets.Osu.Skinning.Legacy
                 gainedBonus = DrawableSpinner.GainedBonus.GetBoundCopy();
                 gainedBonus.BindValueChanged(bonus =>
                 {
-                    bonusCounter.Text = $"{bonus.NewValue}";
+                    bonusCounter.Text = bonus.NewValue.ToString(NumberFormatInfo.InvariantInfo);
                     bonusCounter.FadeOutFromOne(800, Easing.Out);
                     bonusCounter.ScaleTo(SPRITE_SCALE * 2f).Then().ScaleTo(SPRITE_SCALE * 1.28f, 800, Easing.Out);
                 });

From b4bccc19baaddaaa2c3f643da5ff15eb822b9c7d Mon Sep 17 00:00:00 2001
From: Dean Herbert <pe@ppy.sh>
Date: Thu, 25 Mar 2021 18:37:13 +0900
Subject: [PATCH 13/13] Refactor LegacySpriteText initialisation

---
 .../Skinning/Legacy/LegacySpinner.cs           | 18 +++++++++---------
 1 file changed, 9 insertions(+), 9 deletions(-)

diff --git a/osu.Game.Rulesets.Osu/Skinning/Legacy/LegacySpinner.cs b/osu.Game.Rulesets.Osu/Skinning/Legacy/LegacySpinner.cs
index 6d4fbd7445..dd1c6cad77 100644
--- a/osu.Game.Rulesets.Osu/Skinning/Legacy/LegacySpinner.cs
+++ b/osu.Game.Rulesets.Osu/Skinning/Legacy/LegacySpinner.cs
@@ -76,18 +76,18 @@ namespace osu.Game.Rulesets.Osu.Skinning.Legacy
                 }
             });
 
-            bonusCounter = (LegacySpriteText)source.GetDrawableComponent(new HUDSkinComponent(HUDSkinComponents.ScoreText));
+            bonusCounter = (source.GetDrawableComponent(new HUDSkinComponent(HUDSkinComponents.ScoreText)) as LegacySpriteText)?.With(c =>
+            {
+                c.Alpha = 0f;
+                c.Anchor = Anchor.TopCentre;
+                c.Origin = Anchor.Centre;
+                c.Font = c.Font.With(fixedWidth: false);
+                c.Scale = new Vector2(SPRITE_SCALE);
+                c.Y = SPINNER_TOP_OFFSET + 299;
+            });
 
             if (bonusCounter != null)
-            {
-                bonusCounter.Alpha = 0f;
-                bonusCounter.Anchor = Anchor.TopCentre;
-                bonusCounter.Origin = Anchor.Centre;
-                bonusCounter.Font = bonusCounter.Font.With(fixedWidth: false);
-                bonusCounter.Scale = new Vector2(SPRITE_SCALE);
-                bonusCounter.Y = SPINNER_TOP_OFFSET + 299;
                 overlayContainer.Add(bonusCounter);
-            }
         }
 
         private IBindable<double> gainedBonus;