From d751b677c30459575d173c4efc9bde65cd0ec154 Mon Sep 17 00:00:00 2001 From: hz Date: Fri, 31 Oct 2025 21:21:59 -0500 Subject: [PATCH] Creating basic sound system for menu background music --- assets/audio/silly-test.ogg | Bin 0 -> 28911 bytes assets/audio/silly-test.ogg.import | 19 ++++++ project.godot | 4 ++ scenes/UI/Settings.gd | 62 +++++++++++++++++- scenes/UI/Settings.tscn | 79 +++++++++++++++++++++++ scenes/UI/menu_music.gd | 100 +++++++++++++++++++++++++++++ scenes/UI/menu_music.gd.uid | 1 + scenes/UI/menu_music.tscn | 11 ++++ scenes/UI/start_screen.tscn | 1 - 9 files changed, 274 insertions(+), 3 deletions(-) create mode 100644 assets/audio/silly-test.ogg create mode 100644 assets/audio/silly-test.ogg.import create mode 100644 scenes/UI/menu_music.gd create mode 100644 scenes/UI/menu_music.gd.uid create mode 100644 scenes/UI/menu_music.tscn diff --git a/assets/audio/silly-test.ogg b/assets/audio/silly-test.ogg new file mode 100644 index 0000000000000000000000000000000000000000..a6b11d8af892d60dd4ec2edc4bc9daec5245d5a6 GIT binary patch literal 28911 zcmeEtcT`hPx9ABW5FjAk&_fRpdRNeZ^xiv2N$4Qb1QAW>U3!-$y>|fx>4Nm$5f!ii zHb6y1UeMon*LUxFYrVVHyMMj)W=-bI?3vm7%$~hx_SrMhcX2TWh=6~>yj`*WdG^xl z=Qlv?puiixj&6SE03wyz^9Lauf&M%?K>FuB|0A6DJg@O}tGGvNb@pF^0{AZ~DMAYi zHy>9KeP0)Zr<30?iXG0twDSPHZx?T``cy+ zzEYh&B<4K#x>kMqc1$NB_o2IjIb@6g^Fv5s7yy76zzINeeYcd~cYkAN+NCjM7JPP| zi;NXZXNpwJShd>YOj}oeulR-?N@)opumwOvIV0$eG&m#wl?aq&JH`o=XFEO@s9^OQ z7k`Ebr@HjEG|fPnOrX?2OR%am-AGG#(aP^bH|d7oN2TwG2x?^ll7A(C#(^Nb3jv7v z13bt47vJAuApjhK6@X?6{a6$0#0=}iXVxhiUPD^m842MzBWYtvMN<>i1rt+qQ(N0x zUJHR<3z=R^W`8nfUY6}%YyUa^89D+46miR^atow#38cQ3OC^qoswDz2=PW5g#=VwH z+SW+obxU;)&UA^*t<1@NTU9{*rwITeG&v7jL2++_l3apQ|D?GUZn@?E-H3J_5d_c# zUOv0Y`Zuck@{s=F@CZPdQ?wD!GhdXtpVTuy1$BRwXZ|{)=_aFXHWdGw1j4iv0-6q` zYOL@qO<{^odTLH;f=<^^N_XzR5sm5bf8>QQ5Y7kAneI5KWU|8_w%`b8;lX|CU`%iFsfL*x2<_Zvb4jaKEC_uqr*n5JJLw6z*z`R9woa43`2HaE zo2;_SpX`%=N$3%~n&;6;W=qJOVDdjqke$N_bpJ`n{)i8nFmDda@Zkqxh|nYwM|#e3 z&NO!a`&4N~;v)j3?1@QgT2VKDF&M3HJ3};2YFS%f4X=;QUQxiqg|5I2vS1kf#GXQ`I00vsOXMLve_DJi1`1sq^>`76KuCdJrN0 zE%$y==%rKarBnUCBJxjX*8f6_Fd_n>DY}1X5k^EH^gl%Ff8u@rKaT&WIY1CQ5EbFa zs9ek`M1+$A0nt24sR+$!DICUfTFRAKhYn%MC`Fk|GWU0TKj#Me3!y@avILqebs?8T zHyrsNb|ZjrBUI#)7!qroSClLLONR)(rgi8_poS4{L<(~eNM(A5-2XjeaR7h=kpeh? z?m7BD-l@cb5dh>;oh%9VgJFs{{eT2C`|p+ z+V*0>o8S^;TzOS>J%u5?D#7p}EZ|EJ0#X8~`h6Gr97X`yUX1yRvVM=~pGFzBIJfHR zYQla)WI|}L6o6$aI`2|1GzKgM*e+#YElIWrwa=STgo)?{0f=7crP0b}D2r~#CxD*0 znG1*^$U=gHmUtP=iB_4s*g;2GgA-$9Bq&fut}Mu#VWgx{R%#@nC0v$i1mVm`)v7|2 z8W{;d034ef;b#GjjH)FDz7VWEr}Itw4Ue*x_-?)*EoT{=VA)jBJDuA&>8aubLq|{R zT{Z#6Uxpbcz|xE^of|)z0%iV$CIs7B`7NtI!TxyQN2Lq`(0{od=cy+~Yx0NP3_$PJ z`E(WV$CbNjrj`d6yooKZc26z+1F5S14}P9k{NaA?XKyvdxlw6ix)gbC z;8s`f^|zn1bt%AMjle_#mwE{-Bd~DfeEUXG0D!&^00=fZ1Vp5jH1!fTI->LaGC~|G zK(M(+5T(@08Um5Y|5^M&I1>VZ+M|wOP`ffQK7sY1Or5E4*QiFtTzN9^RIJ zgD9Q1N)YE;B8;Rg(=ooOgHc&fpl#8yb`+jreUbKoA zzx0S!J3)NdDuQNsh|#IGZHX&^rg>=As;-U1DWR#eZP|UI6V9DbFWhG4F#!Rx732Uk z@3P#0)~w}AS0BPE0m7{lKEen>;&d(xgeiws870UQUX1YJRGe;P^hbIK)}Vp1Kv`*m z`0k&IbNkdy06Q*!UO})_(`SwL^8E-s{ur*jW%Gpb{H-w3(h?@1LK0A&wL`BB1$$ijWWp8EO4fVWg!^z;{mL zPwk)7Ijh3Wxy{DXFtq#7c6#y5!P5G0Kg}c5tA47qDcT&1dj#?h=fE@(Qu&? zh`_I3&5{5JXbKY-O%t4l&jhSGNLp z@~?jyWGV0or}K}~V*B$whXVryE02c-t)e33$I8aef#Brg=Hcbz|GVvMkpLV7^N^gH zhGv3QJ^C4`M$8CQGj^0r3jh#=<(d$n2ml27V_^L$gZ^<@^ve9H1At1_Y8T)amIQkA}gnUMfnVMcHxZSjEkQ0rpcO6i>e0e!q?~feI|ks z167<-V%y^He>ppTl5ndfz{MR0p;yRFI5n?kNg77-oZ3tdb^>?ESq*^MW;KS}oWB)& zb{{wuBP+|A3#zL<@6mbx-q=vwWP1|jrD9bGPR!LU0< zu5_RX)iDwy4W?_wJeOluiHl2}96N5&qXsw&bEZt5d?SA#0{QXYD>Nzj!hcOTn=8P+7mKX9O%9lzS= zK6-JwjcGk@wM@Ziu{-IwXAk|VuFX3B0?HW_`|+Ybb>cHqp2YlEg>(yhz)_-{UMe`~ z@X6W51l%{d?6cmWi{_i3i&SaXU-u1x=-4YszdZ@=y$t#SmIr#qHjV=HlX3jt13L@% zQfSG7!amND>=wnpn~qI2tYJ10CoIbLl5CXRW|p3>a1&ty?qlwEQ(dg$J7W70+1bQ! zA$lcs6;_SQ&&WzB^Ge7WN`#@|b|WGd++(=YR3n}yKFLC{=vOvB5Cmt?i=a}5L^NOl zV}Co58nbOIrIEn@+X!w^uSSyQS%z1Mv59AbVOBoB65I81r=%bQE}1;dn3PIxYD{3= zAAVC9VJE5jEkpU+FWEjXkqMnn=SNj#(kp3?Y;Q88?uCF&k1af-VyPVk+;C8$L+IWuPiD)f z66?_Bu4^8qdkuPP?=Mvs+v&QvnES2g+=?=5vz~NWUw?p^s$s#F7b;bRRry`6U(3+` z`K6qUW$6o#i{B2)q#%NQ{NWQ82>MgL{-o$z@(x5(r03;3je!@g#TDZDuB&!0jxpGI?&kO}V zB{`ekU6R<1*?r=_q4xgKjSP=Qotw1bB`KAH!vwqdb*9tA_m}J*f$j1s3Y-Zqi)-3{ z){J`RMceVmSBYFdfQjy9{P;B9z2I{6t4h-%Y;X04V$GaF!Q^<)S@N6r}N*r+l7Umi_!<}Op&~8#MeNP>uUv7(KpGwF;CZA zLG@~VGOyfxmNRr=T2HPZ#J1ses z`{sIPXU7w%n=i2sYHu1Gc3kN;UpTd(Kg!s%U(6|8!jFm1zbpA7+7$gZI5FAG{;QYB z^A4Mw4>j%;Gt~q>9}QQx`sJ39BiyhH$FT)+4iF|*0tqLm@9>So z9g1q!)(DF<*1b0Gwds;Ns{}U%>20RWC_$X+yT#Xv%ahV##jBbFCw)~{_|u#x1A0+{ zAt?i_XXfhxOwPp(s{K^QgFD%iBrXI0uS}<>RP;QCekkCP@eX=U35xVGWGfz|S-FX>4^3h0gDOW%yd!5}_>tfdW4a~>uzB$7k`qV%9WA{&E zUVA>CJmQRBNEeD;|M_)bFVuX{wq-@FtWQ%{Pm7+p>U>p7qH2=uf1$AQLipD5N$t-( z--2)5se5tV_xalLzCH28c96=(YpzyHc07^&>G=_fmtJvcP`+VzzfY%)1ta*AIpxc~eWe@f1F%~=C^?obR{PWqS+q;nw)0z+WLn6tnrk;*! z*_V^NM}^yxON)K8JQ@2O=ym~VKGW0gfTo;lI0Y|0$EVG9pMBP>OlS^tP9+B{<8UOv z@Ix>=F1NwGnG-EbgfeD`2Swb`ChFC&Pl&iuzu)_5Z-}WR5~~cdHCZ*zeH}hv>OR+Q zFg5({{d(ML`pjM=dEE>Z%%81lZEG)UfvuU;rOBM)n6!7?1b!Vqu~+$7`3bGcm8azI zI$MuRK3zG`Ow4V-h`hU7Jwn2HIiJ&QQ{P2zQ~|@N|AK7b_+b3Sy;Z9bcLeeN?wq+o|7dMKVc zT%BN#0giw>M-8sxg_?sq{PHEzcA~FhclpvKbFk6PFWeJZ|89QX(={x}`g(w1n7A zr%DU}NFsKc4uf zC!-f4kB0}}^q@l0U|DS7aTR%~`-3LQ3Nqm&BY+lzG)OjrmSpl^01liBFj-eQ}36i{LK555!B&>z1&LSj_en5`-k&h zvBr9d^*Pc=LvB2>)B%gnYb31OJCT_k)@3saI4`s0p^I0z+N&gZ&9}tJv0=%*w4CDi zK9RIPR&!1RUXpXbwd8;?M?j;L0*>D3jyvLXoTdWf#) zZ^i~LLL}#U>EQ9hC)Y{n7oW@;OG=(@G;T`{jA~G?yE8p-wkoB%2&y=`(#PtUI}0~Q zJ~;e@zB$#a3v9ZSCUa9zAQ>F^?rU&9qb4D*<4O-2?PE0@ekaK-+hf97UssDNQy^=) z2IE8~VXB1tzP{O9bA}%x+r%Vc;v?xA?kU-fD~w`&w5T*67^k>$m!Vgtp1p)aB$D39 zL~Mi|+S?3pWJ+k~tXfc8$QT%Dz%2~yg_TMyz>QLdV?`2mmg2o%X0sk5?TbntdZJL2 zP;qa%Wo8W`F`(q4H5~MjWpc3W4V&i4HVDHSB+dwsO+%;w#^T3%8$%NX2sxscIK=fK zyaUHl<Q)Lu4}p;^jafwX5{xrdsU8*ex7;Z z8E+=xnOn?L{tpxy0=C$Z#c{wzw zha=`plcOct;!QYmn+a=qS3)=ZA|UdgHV4Vg9u zG>KgL$b*09gJZAl5Ov3jGHvkneCctKLKm1#ErJV}Q{JJsi8(J{bY{6o1lo0l{}O=w zy%~YNasD9z{Bbj!pD@WUZHsWr%F9a2%BrAMm6Xm9XH;jfGj1&0_ab*2l0xaRHpK(B!ozK>apx4lvSYQ zi2Vx-&&Poo0hFL$WP8N3VSPWsRE_G^#by`k>v-sEZrccb<)BR zyw`deNY@;VpJ$|sSOnEFkm11wj2LQ@WomiJ!}xK8brf%+(2Jk&L-Q6>WF(`;^~Zw4 zQFgyrc=OU4JY7dbww!@+8c4kL84mx1l5pGNN!2UjRwJ6vx|%Xg){+4ET>2xILUH&9W(oQ08Pl@&|DIovII=>+YpK>Cy}vGy|t! z(|(v7JzY09<&j;?tdx4XDkQ=D64I)+XZOBaAiR2LF)7C2+9 zm~=5e%&5dAGiyVVa;ls{MmRs*l_tK#cwFK~d3?5*OQ1d?f zXf~-R zs^=U}Q$vg=V^tcN>1Bk4tVO|&Gk}ke8`{lt4#*Dt=$t7(ho<5 zbG}u)K6E(_p9+sp|4#7oaW#FZR-??sGEJnktDr~#TrCq9kd%~^St+2^y283|Cb>fM zxe9D%!kE`97kf2M^l6);q7f;@T-<`-XbZjZY_%Ao+XAg9I#6w!Sh+*p>`9`GxrSlQ zrnRuAVWLH`M)c!Tz-S@zKyE+`hq1?~+t0>nV#I(b1L|6jv4Nw_(#>hM|B9|W90qIeHbN`2*Zrla=)?Y>Q!`p6ON;+Zm`_k_s&-S`~ zj9QrAFKuES){6xpl9v@DFia>E#Y=M{bl#2IY+u!`f4RFl-&}JG0A9Lqau)@=O!}vu zz6}U97~g-<#ne+;hKF1R?&|zTuC0GSgL(2~+phSD0b3;tshU*xu+2cM z4+IM80axkVFQL05!Hsc!$wFAlJ^?6sS_Hr< zU^)iJH~DjtqHcL#Fz+mR3FIb{0(Lr^Qm4-0J8w7a(Me+*r*7c9Fn%*wdVF9=>IxIe zG)*{jCaA{7lprkt%$j$l&x&6Cac;Gluy8HIVEx!}^mwoEyPf6)9R|=E+ar<5H<7&LH=*UX^8ifNbLBQ-j6SU+V3%o_@>W=Be?)1TOq@Qw%oNA!suM8A$~*%d0_U3`Q&>)DX$2USdt0rI?ZSD7=wTb2eg_T2+E=O@s8R za}aIvo%L7qTYwEN0%}{#rHKeIL8W4!);cl_8t7l^hE3Dnd6SUV>5Chez_tIDzZIbS zn^FH6xY4gtO|-*+rqVB9I`8hu(%@40@EI{tvbg+S(Ss%Pa*NB{ewhnAsdst8LACz3 zR8NWTdE^D-pW!IGXb?UzM&eSqife6d@skJg(pgPCER8UtER0pn6~vJv8;S2jP(sok z-TN_?3H_<#%lmm3-(J88GgxVCF}enjr{b_gb)^caw70YpvyZp)-)n}k6dv92GDrmG z<2Wvc3FRf(9G*fxJG;bOD3V}k269)W$Rf?cuQADsTiC6O>HkhE4e1_~{7}B$JIP3J z#E!=mRz!aKMK&e;RG%W{MDhe&YlY_&On##FI;*6Tni{DUKj1x54V0iBaUUEvs^W7TfP7*Lbh zx$Nh=-;2f%^e^&dDGR*Ewf37-x;tG5)tbd#vwdc4-O^iZ_iWDY)SWY8LARKWw*x_b zO&vmYjSHW=?J7lVAmx5?-Rn1p*4tC^=Fw5btF+-n`BrJQ<3DA@j9cu?7Vok6Ogei# zhox~C8PwL!qP{UXQ9pMW?BD7gQ~0qBwHS_|8F&e6y93g1H-4;x1y!kz5jr zU47*xx8cX?G%4?9e#SJ9gvw2pU#eKjXKc$zC}A$vz$ZSVcrqO;z?V#LeOAVa>%|Q; z2HyU7fg#}sQk)jr#}ltbtwD|OumvX-^$2wg zgLy&eMJ`PoYQuiBU9!gTDg*0{3LJf@UZ{Z%^a$pF;9ID?<-KgdG4J=_Y2{Q{lvuuy z6nHe+<^t{l-zb?Al;%Z)6lP#a5WP731x$G)2I9y@6GMnL)m!O7W;&wApwBPNO@i@_ zj=@aiF>7VSeD}@QIk^~2cvX0rd6tzZ<2T&11LFm`v{ttVjU@LQ-QAqDC&YZVvhj|s zDTu*1xfrHpkZTj2yteOD=;pz$*eIJE9Ye1u_X=^cGQ!iqaXWeWg`XE>7zA}7x89ab zzTWnP+W;yTF*xrpFQ2CWUdoS!CK3;Fz&HZjD6Nu9b@WS*o_0D{I|a~&+%dT3Az)2K zR@1Mik|z!l6f4jlvAC(AM+xI*>lZ*ql>qo4y*n}i^L`Rq&o{uoALM>-N^ z26Pd17au(zmZ_HrmJO&W3n1xT8EPWrZS<|>bryegXCrZF&Y%p)G%Z&n87zOIFBbqThi$^6FF^UR=sQ19{}sX@9lip=7`H8ifVyS*ohD`;s)khNhHp zX$NY&f;X-G+1TVdy(DZ0)W=Q`!?;p28=(u&YZ+eS*-mmaZK6K7jJ*#tE(a`LW-pjo ze}3=O4+#hHID(e@pown<<*ViFECHfCWI8Cno!(I_0`I34CDYvB@5@b|d~?-45<$59 zNSf3S+nKWDL&er(;KW3*%OG+vs>pz*<__8l|J(=;!r=|nkm*=faeO2LS4Fs3rCh2f zh6v?b&ysVs7pvRno>a%pPx|$(>KEybgqC$GQfFz8X8}_0%5J#3_xlQO#_@n`Qog^m zWi`HByh42hqFr8GkI{GT&D?sxvm>{)g}4k9)P#mfs?*CrhJ9cpHv~JJt)3;%A&?=W zt`O_QSI+Um?MyLRCWM1h^h8JOM760e=27OLhJj>_SB-nh5RtaFHbcCj8LX`}m)Q(O zn;7NXyXje~MC;&MMn8=pdq(B8MuK1=10X2~YIfR&;%IT4uBbr}j0s0+PyDGQIGQ{R z9hRA?BlxYJ6b1yfd94Myf_Ic~z@=m$-6!p+q>wlh)P#-XZmJytYl%I~w2jo{64J0^ z&sZd4K`iO%kSSON`N}RzrlW6D<2h{~Z0>RmsrJV7ORZOu&Wq`z<1`+dOcf9nQQi4s zIP0pLqiQJ+mcSx8;WU^Wg-KARiCRP^E?(A9`gw*x0ZZON(GR<-_2*KbOOv6EyX_K z-?OgbRJz;}zLg3}GDZx9KiIcXY)uZ@n=K&qnd%ZgN?-ungPUEB-QxNp?lH$>DQ5)? zu6}m~dbIDhn4f4s>O6&>ALVlFOWvn37$)u^0%{+A+44jUh*guHj~K`iBtr)$TnFGv-!f(ux2xLrwke2ctuu~Uh$V46zVT5;&rChl;vtkw;B*V= zdf(Vl^uVHp)HS`@j*@1iIHLfEBb;dJ{H_$$78!ECpC~c3bN@#(zASx+l?7{OkZvgO zkeO?uGCNmjj0Yp6Ofawrp>pl$#}9@CW~dozaF&GIx;%Tu{oSDJ6JN8a_s;yc$lDBN z7N~KMktPWr%A*2HBCwKH>NX4cj9n|5;&vX zBG-CcOk}e70joGMn)WTd1m$R0e}Pubev05%A`-pHiNOJdxt;k(KbXtUj1DLt5O5oS zjK@HAZVr}v?Gn8zuC!vVBiVG+5uPKxcp^98UoM1)e_s2K3xSxBJ*sv3%(HVzLR{|J z6~YY#>NA=%p)>U}#WOQPswXQcD}PDplH8R`M}e2FjH{nWLqcw(TksZs;J$7wHl-Fz z@X~mVVjiWeyh_l5vC&ljL7ps(S%l#qUQ_Va^{r$of4B@IB`x*xcGyj%2${?})IR17 zjd?&47Q2IRG;FGMcA6-kCm1aWkT1l-DbwlVI0(p@8ZCx+#K2{FxpCj1x8u9cF0=@? zj6dilS9;h71@c9RbinFM$`aI(v9V+qg=iPIweqFqQC-y3&Z5?uY5@8^GcEJXCxJ^w zx4eX-%ZrM$$&DvBYwfUSLn^$vcrQsY{Z>%2C+;Btc_vMLA4v+l>;P|NY5SUcVMSt(ema{+sU_)~+UqY+dSWw1)p5wywD!KYp zf0E{ckHzWevth}-*oJZ|XAMbX;B|CzOe!6v?EJ{feK$s8hir~4_TjUJ&9P{D?z;)V zle-KTxi2Vn$33974F!KD&9=GtL4+J(co=h|n>;Cs9MP;E34K_jB-gsi`D$EKNddvE z3~wVEQn`JX_m;9xB|Lzs)cXMlE92Srd_p3f!{R-ug#w2I*;Yr&P{?u@)X;~TnwECi zFj)tlAw-QRjrs8gts#COuegZ7rBb)h0;`tNkZ$*IbyacFARI&Hf_hS^0A=`xwr0 zdKJikBTso-(#RtkikdJ75-O-NYX*vlSlPY~%K4J2kCW2@m*S?ZvgS>Vg+rojAX335y4J z-fAtxl7X7#l36RQk{+Nlc`r46l#wHX_DU$cJ~>Qq@QdB4=1?I#!o&h4YNXdX}P&o-%oZ-uH7IgZ};Y%sB+4Q#JCQ?;{y6VBS1^A1r zMUJKdZDzGyCmkKhmntXRnH}wK@{)&%#l)^#8NQVg7H&=2iHmkStf}Kyag9VP2u^DW zpr6adcAv?RD^cO7$DTobx@(zyxQ9#}M#-^A5RiT1#sJR)B54Q*3d3=NP;3(fsNv!q z=`Bei>y;C}vn7%f0kP(^$MlO3qfNLz6+HK~G=NpJ~XZp1l8ZYtO! zdMVOx-l$t1u%4)Q{}3wJ3$WhZy+*FNC_HWl=6@cO98uaFxe4|8P1tokO@}nYC(`UR zOKHOi$Cg?oiD>uF_0RpMS5pFw4NltkFXvIuZH`p9Z)cH=?!;$whtx-v#P`(ss2;z~ zluWRfvX6j5;K>Z4nQo&xWckpc1N*QJ*R-$G4cK!~Mn9Z0v-9o;5Q(5u+~>7!vNlmfT=812HS7) zK-co|c}6mS|5el@y~jel(j0Dwl9G9;Hjv!XOgEtr#>n~;fZF}dg)QTHnp78xlNsD@ z7v?vK6dcV&%2Je22|_R=lF@%Actv21H>>5ww@t7n=_+cKY8FF)LF{Tr!SF_{ZRYmv zw{=0TkqNQnmep61-w5pO>--Ly+`np{WD~UeJ`xqZk<0h!_R448Td7m}-Tv}{sGa^$ zb=Ai|8d`m=Y^CV;#Bzi_tarCacsL(;uR3n49F7A=(<((Je6_}uU8jn-Uuv_}1?L>F|imN8DG*aK-;PZuN!3|s?uvpd5SNS$MZ)yuW zB!yajWs~q_uBrwanMcBag(WHOUNlR2IKieKz=DZH0rcHrYx7V3FCfz%+!Vn6Jx0!= zG5`b++2!`U-P>tXn1QW|ex3+lSKd~hJ&ax|`WRgfzc zYFbk5sQoa96#IEXQ95ckko}a?o^cWF`|$Nxlk3rDS!3U44r8EBt-7vTTrFoZhUr< zRY`i30h5=ZtYaK;M7+4kQ7F6Ym4F(G?&%@t;Mcn|rgP)HJKvGX`me?L7OA+gxrlb;xbJ?@bJZG3+<^C5&m z`?`>ejOBdgLobyQXw9;=NZ1YWGFhqsZ0&76zmJM8e*W%~FXRF`-@J9r`?kLD_VC!d zqA+u+t`j>Su0R;gYY!=NwQ)~VAi~c&bR)5rUTf~Cs#nm{8w)8-xWvq?)@<;C-st%dX3H~4CP&qoB!d{5ZC4AAo zuYUbXRTg8`gU^nhK&JCP#p`W1Jo@{#=z*L_Dt{Toq&RNv8znG(@^}?_$R=Lg2z zh|lBi%0H`oowD8T0QK_E^#069`=Y#@)(=!4Gaij+-uMuIDKEH?_H9r5w}={hxQva( zv)4Ud9v;=-ZRugXX>o3~Ou( z@*I+bHD zK2oLxShmPK7H0Em?PMNdFXfD|1t?K%ee}=|ae7AL^9(kOq&BC>FrcIQ4qDB`ZRDx3 z}l9GL->_xo`3_OFNbqRUEN8t#!6%8##BTs))K>zn-M@T?Ao3ZDhQQwXW6CmZ$|F z%6Djm?p8@o4*7k(L@ z6qvIymwrZ*DY)R0ATKfK;_Yjbc1@2IGJ5vhc|{VoKMGZo77>ZvYS)sa0;5jgOshEE zyLYa{XDjW4T`iGyw|W;3e?7>3$CO@C#vM@Z(?44dS2TCO#}MARX)gEJ@<#jZnL`cm zJVezXGpEW)6j|cS6+9%(fX(T*vglqvP(>A&-3$_Ztf(8H0BlW4wqcSs|XbeZ-wj%XdDT@OQ zAssa~@hs-W*>g+56Hyt*?jWg0qI2^Yz1EO>x%sS9HS@95I`vP8Ljy#Ukb(15y044w zBgiZU0v4w`N)tpk7gfGl5mo@T^0)>c0HT)0Nb1=|6Uxd%FCw}s*@0Zs7TaM4j zbUu3%F4?cHnG`HFLvvPM3kO^f6Zm_9p?BktgW!+%0Yb>~o`%VB{5m83ct&)_cP2&n z$tzsaxO(+WfbgFQGD4B}Om>sv?w(|W!1Eym^o{RW?;Y+3?T+C;Rn;m5$W0o{XpAS) zjTj6~8NdJzeX&c%5R$;qR=pTi<{-^wy<*ljlAmZ%nwiQhm`Oq#Iu$4Ps+Um$K}rX= zZ08w`rNubcLZOy|QaA{)0TBWWvtSIA`zkINO-=#g5s+6$3uuKaqp5G8%`|z4uenny zbMkEfBUU>Zh&)_|B_w97{0BKsIx*2qth8Q7dpd)Uksfg$xON#iBIg^1^7YB}rzgsu zhCYp+^!mZVcaWK0wUJY&=K>F!^;!M%UAy0%3@8zO&j_mIl#`WHG z^-^ro%s7DZ3T$)!v-AO+G8d5_Kh*HM-~*JI6~EP=-I!SIoL1$?q-DL+K)C%1h}E`t zFpcM?&@Tuh%H1ritO7i=wddj(wCAjZ{p{Vs-Lm0EoYa(G-Q)2Rj<^xb79hG7uge1J zYc)kgE|ajxc8F(|Ie-wu%MLk!c1kU^0EyW;z(@_??X&fCDRPSRva-H zXFuuVbiTu6mhqwe9=RVAi^w0+@7DPms*)q zl8sy!qwI+*FD6Gwm_TrteFLrp6c=X)w_tX3C<+`2&8&oK(NqC(_QV#q7x=Ir8AH;5wV=FrHi}WHrU^9S6#ktKlqmk$TmxqCP$?X$ zjN##~)r(lXX-z`BH6$iT*`a8)Bh_K=NTPn7FGs2*4qs8m6u0>^|6LnLat{}7z5j>8 z?w38|dg-t(*M=F_fmc^#+=#ZSbTZb$Pb$BAW;%8xG6EDD?u8i?09E}|GQ@)G0|1uN zPqSN*N;U(lL2us>Z#|J{cgtl7ns_u43MGxZw8iX9xtViE&*^Kq6w3aGXHWU&dRIOv zxzEbbvfvWo9+$3KqKTU^^YMh4%!LQb-;~QMr0>*R zuDVg!X>}UYbA`MwyeiN##H=D17g4{V*qs+&oIG(PAdyO%d%Gc2#u&wzxB02CfUITX zq5A1sow14`K&4dJ5qDg?j48n%a#k2kMVdOQCGlr zvM6USvq=#~i)^^u1*GaUyS!&7QAshDAG`KOZgT4LPm=kau5u)TY~!v~0gR<>svFWf z#`4BmVQ^L=$ZvV?mtDSy47VP1^p_H#VNYazIFzj!sSeWvt=2al8nwNUH>>uwE7)>fx`&1i^1k@DHTiV}JKa&(8yKlt2p-eVIdoijmt}so|C?-M@9VJq zx)8E`sp9dZ`A57%RsM}F#g+T`gx3)tN{-y|N>lZtI}w-Guj{uU@4DzNT0#07wCRrZ z7h-NNglcD%vq6bKEQ`EVX4}lsIXiU9<7n{$E9$ zRajJSxVIM!GYl}`kj_xj(hlAJhwknkx)D%196AIf1Zj~jkq&8)?rv0CQba%$pRc+*WqzJm8eKpH zlUZ3Trsyi3-*_zy0IA-YlgDKrL&LLNem=qPeidmf;wyZt@oe{je#BIvGeY#&zXAnv zkBfK1I9Rh)fWWO`g9!E=X$W%X#bfz_59`1glBc`rolT!>0P&@6j}4bZ*so9e@Jz?N zxNe^w9xkGvaY}D(*L}TNC3NsqqEG*doZ&yN%pApa1*uh7v7s!b-d8JA!e?g>hH|~l z3{m+c1K6sm{j;vCX5ib_=SH&7?np$zijRP?SU%XUf;@e)!g@Z%Q6!sk7B%TI82>NX zBgV7C1orrDd1asR|mCwuA_Tzwl| zh+7VVJ~hOh`@I|PuM#^suoLu`0?XfMi3yr7CuYyodI1bvUCrF0me)Dife%n12XPKB zqf%PM*I)HRx+;H3c8FLzj~T&6|6BbPm|@YEfK*VfzlN zP5q1Esn1kL|83hSJx~$ZdP~BhxP?Gi2hU(UI>b&LjC468weqR&?C)fjkRh>tBCQs!R_F(HFHGm-S)vP5 zg2H7-9@YkpK38a?+t9%IljTNs&lV?1YzTo%LEX0yU};KKY_*Kk;c=-zYY7V;Yn(ox zOuBO`gG{}wxC2p%Y~4cphcdeUR@Ik{@49+cn~u}S1?Dzw<}hyLK5sjU=hrYC{!i(R zbksQX2tf)yc;PBT2ozh<%m|83h9z4MS%)EIFM$@=+S=j#!Cb2CYyyVui&wt;Yw5a2))2Ii7sEY$CFKT zMzu9u2IP%!lp?0=A`fqv1%9dEh+BUsACsxY|G9^h5qGrrxI14O`k>)W0j`o&I;k+* zY!Nkw1r44k1q?!)Pv@AQQCL;6tw%Wy#*AbLL*P$aLxmPBKf<_bxCd)G@@abrmia(5 zkqm5zv)6cp$*`|OgrFJ(MFcLOg~@?_ig$YfLm>z8Bhuy%G80E^cyTpHakWsLPLc%A z65$!n9E1-K1c>c<_gIh$l$-Rkp5HU)XLKNexT4((( zR_CDq;h+LoEeiknX!2%(pTAljjail+dQcL%KtD2<)s#sotS3bm9%?#q!KINAVGs@? z1YC_&*a4}@=THlp&J2!^0tQLQZ85_jA(y9yX1HX^*MxuvQ{+5tT6TCJNdR-+PZm20 z6fTgYo$@&hiKG%7wx&$L$)Bxg5>Ba7p!tl5Vq7ShS4%hGNt?zPy+J9!S9q+TOmGDd z2A?rb-Vg(-<>4wJhZg|^G1eePc#5zLloXB22yZ2ICjzkV^T6CjMt$eH;!~#O`S6tP+F;Ir!L?YJ`QtFzH>YUGHxB-KDo|L5F ze&O54ub}H0C|TUhwHd$KeUnx>LfZ3 zDto-D2z9>F02s2dmBdX!a;ZMA-vw$cI%Qt>-DJKkkRhxmxJ)5iOmJw zhXsI3Jt|A7EWL(PoL;%BqUVv*9e(@DNzP}9MMOfm_^wmvD~IIXq| zj)*BdSU(R=3_e!lEUgE!;x?4`ZMA%wffV=0Kz=0`s;F6+#u(mQ6Uk~M4KVx{*^2Lq zW`N(+CsR_Zah02gmt%yDjV_|?t|nqcXaY&__O6)lSlg$Q(GkzmaU}n?(Orh)MApd{ z3%FXbB)@Yf_kj08LqY$(2N@)M_XNH^ihSzaEBP;9fGcwS)H+aVY!~CD-b8jUa9|ed z4ULgz^`25PqalbT=p?JmL^$=sh_a6a+HMI866U{g{I~RAIJ=?BThhMy3xp(x3UFz{ zJdEh^DdKo`H5eWGRyVyDhG0NGJ06x(=&T&$>$K9DYe=e zv%RXDlKNaOM};fLPn@Oi>uKxo5i@IjhsM(hwP;ragYyqJF*&87qAH&JBW}%KxA*|E zdq&03Wsmrva5p%USJQF|*S4ni2@Hw~=_B&?6;W_-+-MxyxMVT|0X<*_kcyT6O%eej zLk9``l3(GB3&R5cH{HNe-XH${`5z0!|Ma2dZ3%jh?xgQz@8rZJ1cXJT#igWfe_#Cj zb1#DsxO;M^EF>mIub88NPFKUPRYaXOZDydLv!V1GzU7UQZA%q#dCQ`)JMigrhtInD zwZHzmG#lLSySRGWXSuypeP4%-bnIxeO?Hf5mi}z{r#R~;9x~zYaJk$m=K15;fOsOzQ zwF#($J1a&pZlxKuA5A^Fl>F98I0Hjr_&{P&|Bn=X{rNpH!|g}0jH^6(Ete|~kGO3m zhnB~7{q9*5`Z|+NWWj2x z@0pRH>uFF9N0u8^b1rnee(~i}adq_` zT{maR3*p3?c2wNmaiKmw%-Y(SM<^_j$nIz{zu9kXvlh+in!QdZ8O*s6({eZm!nE-t zI1N2V=eD_jgc-=|9nbgk=`Bc@%U_z98@KL>b?f;E&rHz7=2Ms1iRvMH6Yzdeg9f(W zxeB>W^RF~fBq}CF7wT=75jAngHmCgt{cda;a7rl0nx%cojIv zd8xcJu+6@@wd>0#SyoX#5mc7%JS7m$lg^l8Kn&53f9a!sxY}_;wAFfU9Q54zF8Jf& zBz?=RV>asKWdn`XgqL`!uG3t}*-hoO^S?X&z`ehI;}(@dC`Z`r?QW~jrT6~VQ{2aC zkv8ZK50^MdZMJy8@ojlrim86ks_ zdqc#NrrYta8$jx>iWhS=D9jAzGr`C<_1XSmKA`^B6d%<2dJb^WbdVRYa?1F4U9pl1 zTya4I;!+sE1Ts=r>8y&P&wlesl7`1VP#fTndWmZj+L5pRP-!QnZr(1>1@c?qjIf8V z>%FE~@I}|cT(HcOpR7#a6xlo*8@V!;?#ggg4C_quooAoFe_kj@yX+< zf6jzYv7A*gD>x6Tb8VYau_$*Q8Wq)tjUo71w@CKZ4gNp|51I;l6ccaCExYZtXc)N6 zxa;eyo_5p_zE)(~3A6M+mQ%GKCh7W|f70lKojvOIqbA~ryxiU;tf(`zRZ^3GpIxDE zfT*1TAmI0b9Rwuswc@Y04Y6A@i$U2Zap zpzAP#aYCPwpJEY3JtK?1GNXAiS(U#N(k#uqIU#tJ_M4e9Rfcal>zZ_NKEYMLY_<7K zAuV8bjfY+&W~eiK8WW0la50t;*s5co^6U76#M92H_2(5?+mD7ESJj*ZDD9@vhc_5Tb@j~dqd8LyWY+_%Mh1k)L1m6L}_ykX~P{| zDF}ua8a@|e8i{FW2(*=8d`}mNzH~fkqo7EQ25u)M?4SSHRCwiJu3d^YqVa>yB=9XL zSoLc0xh*k5@#5rg$&!wEP<@1wPdER;5ES1J$fT}r;J~jsegC1R)r&_y(SGMkMz<$G zBQ6o=*Pn}e`ddO6B3*eFc-$64;s{|6vrklaTo`xt)%4+qft|tZY#Q88DwnPVpBSuw zkGo6@`Q&)mM*v#ENnE}Ww>a2N_v=Z%qxm!mPGRBi8AkYk(oS!9(Nc0=bi$*=65x*ZjvBZ-A%2h;Xp#L@=JHM&rtvNH@& z_fk7?>2QtFOVa2zr(=tKXG1I7nebvrZaGE{TfwF(WTDoXz$)`lwiieoy{hf^o~B^I zKD2dHH@25nxD;da-H(Ij=8tTV?vUOSMp~rIO~xN7`E04(C}(GmDPFPk)zrMEdx%VA zVmEMYL>Spp>W6x1*D#5&!Q_ z`S3Z^$vKMN_-`{lX4D3BsEJlLejp!u^b?%xQD=6)>W(n9bp2&@H7&fczD2zCynk)+ z@V3+>xWL%rPEf@Cigm0muIQV}Ygf|5=%;2=;W%r(-7QZ`rK;7_qeDQX^{ID^d1vhV z*zQlGdJB6+LMw1K4P+{vT4f$#Cs${GO13?a?;CW*BQgre^cezJ9=13c%D5;4eWqmg zd!EWz4uDFHn=7J{YssuIPP0c?=?xhq9vG zIUDWaS*(8?L}p|9{fuP^T+IonDrsSGh>l}17irruF+TOc3joVtb}yyYVgFV;8v_p| zgt>7vbn{G)H5;b#0Yq^)Ym0xk8CYdTv6#0@26k(HuEJQDfnwCKk349m-tJEKwN~9) zWrRP^VPR%E``43>#uCeuy)k}9`(R|<-W$`Oa%E~buVuc9U!0%vD!!p3TZ;sG)FW_V zNjMus|KdN0)gdY3Wov$qHrtDgj^UEfw`9bc2iJ>nc_!G|gjM{n+^EEym`AwJz(tUh zNc)~nbCvr*?bt+nSTZZ>7ZRuG{mMK(%Vnq)&XC0kl_+Xx%DBa{XbELU+vji9@!(Uv ze<6{k!Vf63EOGL41R4pt2dcIa6gJ5qV`yPAZZ?tBIQN^X(Ud_y4tc%6<|KXjR2r;$ zEODckLUSWvPX6aRHXOBP1 zheD=?%8`hSO^&`7f&jdFnXOKCz}B)-OVGD(q03cPguvm5!8Z{d332il zD6p6zK~brjqi$q9^aBWqsNdL#oe%%EOWJUZ_|8vcWj{h%LomVRpz(TeRidC@un{Kq zXJBjouwU%cYf&otSvR#zKEFihVU06!uBc*;$J%QQXv05<-kTb(5-t|&t#{q}L4Ye< zp?|FA8JDSkzZWO6yh6bmHf1doxVjMTl$+QjksYVzeB^%OcqS?w`0m?s``M4SE!c(M z%a>o9cFX)W{b+^p^aym9J| zbHa)%#;6g-KCFWC-|4oCKW^!XW`qwMcppwE*UDT0Hk^GsCgkWm#_vCI!RB5+e%JrZ zPq784Mxl(3V3wWN4?o#}BB?GKhBGvk;v)2)Fk4LTMMY6Nkuxkdsfx5H4Se}z!l7rP z5Gs$rLF5=tU30nl?8;{G3Uth4SQ&&d6`WE*6d#+Wjmsfq< zhn_M{1AQE_Y<-m<$s49!;x3;&t1qvbb*CG|f;Rv7emvge<3Bdu9uVF8H=MH;$QAsX z-_Mh{%fW`P{TBrqL{9at^YPmrz0~!pciGu>cw2r^AtA8b)WtZ)miHD>W1RcxOEd+GzR}Qj&(sM%InY64V_a3Vl|laNxYpV zTQQqeAE&!}#ajCH9?XO5M`AJZAS8YJdTD6I2r?tk#A!SCxLQ$>MLLHvhlK)(M;6UajZ=EhvyCs^?yhx^$T6+AmfD5JM|wuGBbveCT~0q` zqMTu+*@%sh>)Camk`qU!NrZ6-3Zm?w~XK{r}^1ZC|K9wQPRN}Xr zY;)WAZuQR@e)GqxoB7>?r^DBYe#~1Bkk=0K?l(s#A(qIiWyRO=a3@MLEy{en$9Xx| z%FVf&hSqTeJ-_v$%eSn>D@!pAUX@&Z^GkOT zhfnQI50jJ;2@>BcL(o|rc}Zj3oY_a&txU39ygxYn-%FsV5bs~K2SJ#=-C8^725Dn1 zE1Ku)>wj5<#jd~fY^EkZMzN7SNgL(9%k1Ln-qqjjZ=+wB zCP7w~&-LkZw3UnhXMMKhSmFXXKW2D7b$yD-Lt3`Eo80VKOq`hIooSA?r}S>WL}ZrMWcG1;-#dPOEXlsh{nPtOzq_0J@`kSMAJGhCk2^@yd>yiB0E@ z>tQmk{1;4(ikGLvPwnTgE^1@@GQnwGZ?%=0w211<#s!v1>&{^U z6qH!#`x^cwFM$k9?e&~@aATimaN>10^C>twoL(*^Yt(*ye#qpgDEY>Xm(@IV++$ee zU31H@(vzXi1*Q)Cain+@8V3Qm5+pz^nbw%cj;vhBEXU0K8)?t-_eDTviwVEDr<#N_T{x=*Wp@BHA)eD<7~9?$4rhFF`K zO8jwd@2lF{8#=Q3nDgfsmuEtOCr!{#; zPgm1tc5pGi`P^4kajGfWc~V>Ce|_e*o2H>m=nfFa_M9Qx_K z@`2`#^X`eTu#lLLqLkFVT$1#j9(CIeoXbBr-Zpgxn<;xjo5x!mdpIj@l$~BFgaKJpHMp3Nd6PESBsY zJyXJXuUshsTblsP^*=HJ5WZWhEvfR9*|7+AX8Zg!kSR z=cw+>+a}a^Bc&!ryl&~y?sme{#2MM!PYI?>m}sl{nlS-lIi4_MM#i?b!9lcA3}viS zXr6?ca##aaaQWGY3(}^h07`kxm!vW%`v_uiVqw1@E z>b6)L zT&Y~lh%#Ujqq9b{>S`ku-UE2rp_I5(GUzD)LaoR1frn=vjk5^_xbYa)8Lm-~NGj4Q zC`60_8jd21K%@n;g@;<%usgGJ4v|5iW1M@lv-I0k3`gAnb|)qR$fB#o7bR`JbjyEF z_P}lGutJg?`%);(hShVDGCXC|iz4=|EbIipTOkNX(W)CJe??!U*qlW(ieI)7Cjz)N zut~pvM^{Th*lJmb5Stp-C?m@{#klx6eICKwlkzr-5C;|p>1tf5mEO&6+T`w-HP(PP ziL7evfE?1BE4jYq)zc5`ed-UBH9OJbEDdJFar)qUa6mYCf$!L+k>AMFB(6g$6V|6! z<;W6`TqaEzj999-@(`3k;KWA|Ma19}T}0FwgFrP~OJ5{DLy<`Ut~N&@PzBnB!m7r>Ye7Oy`=Rdgk; z#4#E1mXHNstCy(;1$c(e88d-q;$^PXHgnc8jtzcnC4Yw78;V-9fUuO$%Ai6DnL^hH zJZwP<)>Xdtl9TW_FVe~n+Cypz7(t}0zWof`{Hbqo45t8Pe1;a4)c_g#n~FRcp!Cgl zU$sH{m!pFz*Vp`)p@6|I=-z^hH#Q|?%Yx73I|Kd^0stdSKUs>Ew$r)#XTN&bo2BXG z;c$_Hq^I18%^K3h|Jw?32{_DK@cVvXarVU`_rDFdcE3*T@|A4c<&wak4vtO-Cp>Yl z%>q14p9NrY-NUphBEVv%2EB3kzaiQLDn|8`TG}6_L~M#tnUpm$n7VXQ?ngq{1xy+M z_dR_^pJWhWP(dUd%ZP(jP0`UYXbUt!<|@|U!))}Mx1ty=$-I7KESm=`C&A)ftD5jX z{Hkh6Fbb=41c^hn%aTktqi_I1IYwQ+6iOVl9=2I@dvoGT-#aFFR&aYi#TEID|OidZg9%8p3Kz5-s#OfXJN~zeAA1)Q#qfefgqT#+y+@Bjs zy1j(kfGmd%g(|I01z=feJ*D(#pNm|o$uG?gJiLpyXSEa1rF>+I7C|miyqF?ktw(o# zFN>=nrdlIz#Ut+)@|20Q!d<%7d4{u`QQ_p;^l89K-()Cl^aZQ?v(A9|b!mYsC$I9~ ziNn+J(Sj5?#Ig8&(73P0Nke6u_+Wo~`(3^;&iRF_ua(2)0%`iNPn!HB)&|6>a-;iT z%!GyoNm8i0+gL2_8{2j99+4{e+m z;%3;H`=saNYvJFuK~)5;u?Xp+V+UhV^lu!mR6`yxQ+h|gU^dO+=AmE5x2q?N+`XD) z)7jx7{f&2`XMsu2+)N|RQf2%Grr);ABsX??S}yLA#A}#GJwi6w_u<`r=$pMPr({dW z$~-n8SC(BRkRapb!AX==R6f@oL;8t(W3AgW1(+H|e6};)JeG_w07dp|iOr8dfWY6N zM_YvGr`~bUvHO)!P;)uKfLFVljE@3dR(C-SMaZq@rC>k+TGG$+n@_bx#m!BiHLbYI z#*9nAZZ~=LQQpVR%uET7zEKgN`!YbPXM}G0{VSdTl2J}pZ9TpL0IQ^}O6GAXYgOdW zQp=d_S?fp^7uZ;ghks&nvU*w~7eW}2ksjyd&0ZI`j(I>L8|lLCf&FSz63|fND!mdx z2!p5&BBM9 zaaMg@cVGC;Xj0Cj#CACYy1vL|^v`}u)o0>5Em(BNWb7um?K_IGu|)sXzdR zwQJ<*E1?SOGOLIEagCIuL;_!8kTKnX`@ZXCYgga$9G|gv@bP=5-D4GUfE_X^^eG{0 za=SkP$lXah22Oy7A)vq|1>$9dBe+=qWuRqkRaN0a%FtudUZS{CIA{t3!S0O9Q~0$! z?m+R+MOq=LMiO5uvg#V^iE~UfmgD`AGBl%N8BLm0`%g)V07DrIPA4?FjJOq zhyFRl?J`@z=5YIaF%G}&eefu#_!@EPiS~AWW<@z+biHzhUT(x%MW?BH>aWbpt#XGh)8yyO)Z%eCKl5M zHv@JxkZ9Pz_-N)JdnD~A06oZzn7O>O{xyY*|;^U+-3QLMtQ~CDs7{V3HKnX(4 z6@-uFHk#!;^Cw{`lkb;}=nFKq!bVjq5B+LB#m`EdV%7ncQx6kvOH17Mt2(i`_D5)B zN?aaxm~ZWm z7YiGamm6j_WC|Y+ddt%nY!#lDk0pSh2p4~R+o_O$12W>S81cRaQOK`sjga-|$rL{< zy5b#*_;fDk3>?u+&F7d_5@Six^diZux27fMRxg~A?-bP@g!BDVg#yH{g`j-Tray~{ z;*fI`GybU~SsUnu;6ymsCmxs>h}n{`0(lbuRGKgEm$Zuf*JgpE*=$nxb8+>>60ikB zh4%FbB0>|GhmFuQA5H6kNV9cjR_7U%;(9Zo%ya3*;u3h+&T>!;5mP zA7nI-_C%#qd;(*@P3;*%HFkU?_QiMnLv7axV}vmTpN>%xg1k?|cy33iq>;K{Nk6NI zB!Ffi#DunF!}!JS2nFxVROW{&0&YQ88NVG_zp^>}x_dev1sdCOhb-Lg{RKEQR%=O` z7sk!U`IFTDo!TKBv4>+x`luiAxW-{{wW4E@Hobk)%DkLtZ&d{&;QNp-+N`Yd@Vkb} zrx!OjpE*i8ZYcznc0;dBQU+%Mohc?;z#{YJ-I;i{A`U^0KRk;M4b#68tx7F9~nTcC6LI^A5>4T@y)0hI%|9w4sfzh%w8ICsv zGa7`&S|-Uj@$pA?yArRzv2f?`^GmBuiPtcbFq5=J;Jk;j&Vpeuets|c>LJQjCPQ0A z8&cT3oKPy~!;Y~V<)#tNO4_tSFTKPOZ81*8oiZNol1%%YyWqgTUqtp^&My}tA1M1% zP4)@SDwjX$I|J)~bnY_0Z1uUgYz?Xw6MKBu-!axcR%e>rS literal 0 HcmV?d00001 diff --git a/assets/audio/silly-test.ogg.import b/assets/audio/silly-test.ogg.import new file mode 100644 index 0000000..3a487af --- /dev/null +++ b/assets/audio/silly-test.ogg.import @@ -0,0 +1,19 @@ +[remap] + +importer="oggvorbisstr" +type="AudioStreamOggVorbis" +uid="uid://bftct74auklgw" +path="res://.godot/imported/silly-test.ogg-4a08df8a26b9ee1e5d13235e013c7cfc.oggvorbisstr" + +[deps] + +source_file="res://assets/audio/silly-test.ogg" +dest_files=["res://.godot/imported/silly-test.ogg-4a08df8a26b9ee1e5d13235e013c7cfc.oggvorbisstr"] + +[params] + +loop=true +loop_offset=0.0 +bpm=130.0 +beat_count=0 +bar_beats=4 diff --git a/project.godot b/project.godot index 039fd59..3e531ef 100644 --- a/project.godot +++ b/project.godot @@ -15,6 +15,10 @@ run/main_scene="uid://b4k81taauef4q" config/features=PackedStringArray("4.5", "Forward Plus") config/icon="res://icon.svg" +[autoload] + +MenuMusic="*res://scenes/UI/menu_music.tscn" + [dotnet] project/assembly_name="Promiscuity" diff --git a/scenes/UI/Settings.gd b/scenes/UI/Settings.gd index dcb6380..3a2c0d7 100644 --- a/scenes/UI/Settings.gd +++ b/scenes/UI/Settings.gd @@ -1,5 +1,63 @@ -extends Node +extends Node2D + +@onready var _tab_bar: TabBar = $MarginContainer/VBoxContainer/TabBar +@onready var _tab_container: TabContainer = $MarginContainer/VBoxContainer/TabContainer +@onready var _music_volume_slider: HSlider = $MarginContainer/VBoxContainer/TabContainer/Audio/AudioVBox/MusicVolumeGroup/MusicVolumeSlider +@onready var _music_volume_value: Label = $MarginContainer/VBoxContainer/TabContainer/Audio/AudioVBox/MusicVolumeGroup/MusicVolumeValue +@onready var _music_mute_checkbox: CheckBox = $MarginContainer/VBoxContainer/TabContainer/Audio/AudioVBox/MusicVolumeGroup/MusicMuteCheckBox +@onready var _menu_music: AudioStreamPlayer = get_tree().get_root().get_node_or_null("MenuMusic") + +func _ready() -> void: + _tab_bar.tab_changed.connect(_on_tab_bar_tab_changed) + _tab_container.tab_changed.connect(_on_tab_container_tab_changed) + _tab_container.current_tab = _tab_bar.current_tab + _music_volume_slider.value_changed.connect(_on_music_volume_changed) + _music_mute_checkbox.toggled.connect(_on_music_mute_toggled) + _sync_audio_controls() func _input(event): - if event.is_action_pressed("ui_cancel"): # 'ui_cancel' is a built-in action defined in Project > Project Settings > Input Map + if event.is_action_pressed("ui_cancel"): get_tree().change_scene_to_file("uid://b4k81taauef4q") + +func _on_tab_bar_tab_changed(tab_index: int) -> void: + if _tab_container.current_tab != tab_index: + _tab_container.current_tab = tab_index + +func _on_tab_container_tab_changed(tab_index: int) -> void: + if _tab_bar.current_tab != tab_index: + _tab_bar.current_tab = tab_index + +func _sync_audio_controls() -> void: + var value: float = 0.7 + var muted: bool = false + if _menu_music: + if _menu_music.has_method("get_user_volume"): + value = _menu_music.get_user_volume() + if _menu_music.has_method("is_user_muted"): + muted = _menu_music.is_user_muted() + _music_volume_slider.set_block_signals(true) + _music_volume_slider.value = value + _music_volume_slider.set_block_signals(false) + _music_volume_slider.editable = not muted + _music_mute_checkbox.set_block_signals(true) + _music_mute_checkbox.button_pressed = muted + _music_mute_checkbox.set_block_signals(false) + _update_music_volume_label(value, muted) + +func _on_music_volume_changed(value: float) -> void: + if _menu_music and _menu_music.has_method("set_user_volume"): + _menu_music.set_user_volume(value) + _update_music_volume_label(value, _music_mute_checkbox.button_pressed) + +func _on_music_mute_toggled(pressed: bool) -> void: + if _menu_music and _menu_music.has_method("set_user_muted"): + _menu_music.set_user_muted(pressed) + _music_volume_slider.editable = not pressed + _update_music_volume_label(_music_volume_slider.value, pressed) + +func _update_music_volume_label(value: float, muted: bool) -> void: + if muted: + _music_volume_value.text = "Muted" + else: + var percent: int = int(round(value * 100.0)) + _music_volume_value.text = str(percent) + "%" diff --git a/scenes/UI/Settings.tscn b/scenes/UI/Settings.tscn index 71eabce..836a799 100644 --- a/scenes/UI/Settings.tscn +++ b/scenes/UI/Settings.tscn @@ -43,3 +43,82 @@ tab_3/title = "Dev" [node name="TabContainer" type="TabContainer" parent="MarginContainer/VBoxContainer"] layout_mode = 2 +tabs_visible = false + +[node name="Gameplay" type="Control" parent="MarginContainer/VBoxContainer/TabContainer"] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="Video" type="Control" parent="MarginContainer/VBoxContainer/TabContainer"] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="Audio" type="Control" parent="MarginContainer/VBoxContainer/TabContainer"] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="AudioVBox" type="VBoxContainer" parent="MarginContainer/VBoxContainer/TabContainer/Audio"] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme_override_constants/separation = 10 +offset_left = 120.0 +offset_top = 120.0 +offset_right = -120.0 +offset_bottom = -120.0 + +[node name="MusicVolumeLabel" type="Label" parent="MarginContainer/VBoxContainer/TabContainer/Audio/AudioVBox"] +layout_mode = 2 +text = "Music Volume" +horizontal_alignment = 1 +size_flags_horizontal = 4 + +[node name="MusicVolumeGroup" type="HBoxContainer" parent="MarginContainer/VBoxContainer/TabContainer/Audio/AudioVBox"] +layout_mode = 2 +size_flags_horizontal = 4 +theme_override_constants/separation = 12 +alignment = 1 +custom_minimum_size = Vector2(0, 40) + +[node name="MusicVolumeSlider" type="HSlider" parent="MarginContainer/VBoxContainer/TabContainer/Audio/AudioVBox/MusicVolumeGroup"] +layout_mode = 2 +min_value = 0.0 +max_value = 1.0 +step = 0.01 +size_flags_horizontal = 3 +custom_minimum_size = Vector2(320, 0) + +[node name="MusicVolumeValue" type="Label" parent="MarginContainer/VBoxContainer/TabContainer/Audio/AudioVBox/MusicVolumeGroup"] +layout_mode = 2 +text = "70%" +size_flags_horizontal = 1 +horizontal_alignment = 1 +custom_minimum_size = Vector2(60, 0) + +[node name="MusicMuteCheckBox" type="CheckBox" parent="MarginContainer/VBoxContainer/TabContainer/Audio/AudioVBox/MusicVolumeGroup"] +layout_mode = 2 +text = "Mute" +size_flags_horizontal = 1 + +[node name="Dev" type="Control" parent="MarginContainer/VBoxContainer/TabContainer"] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 diff --git a/scenes/UI/menu_music.gd b/scenes/UI/menu_music.gd new file mode 100644 index 0000000..098b414 --- /dev/null +++ b/scenes/UI/menu_music.gd @@ -0,0 +1,100 @@ +extends AudioStreamPlayer + +const MENU_SCENES: Dictionary = { + "res://scenes/UI/start_screen.tscn": true, + "res://scenes/UI/Settings.tscn": true, +} + +const CONFIG_PATH := "user://settings.cfg" +const CONFIG_SECTION := "audio" +const CONFIG_KEY_MUSIC_VOLUME := "menu_music_volume" +const CONFIG_KEY_MUSIC_MUTED := "menu_music_muted" +const DEFAULT_VOLUME := 0.7 + +var _last_scene: Node = null +var _user_volume_linear: float = DEFAULT_VOLUME +var _is_muted: bool = false + +func _ready() -> void: + set_process(true) + _load_settings() + _apply_volume() + _update_playback(get_tree().current_scene) + +func _process(_delta: float) -> void: + var current := get_tree().current_scene + if current != _last_scene: + _update_playback(current) + +func _update_playback(scene: Node) -> void: + if scene == null: + _last_scene = null + return + + _last_scene = scene + var should_play := false + var scene_path := scene.get_scene_file_path() + should_play = MENU_SCENES.has(scene_path) + if should_play: + if not playing: + play() + elif playing: + stop() + +func set_user_volume(value: float) -> void: + var clamped_value: float = clamp(value, 0.0, 1.0) + if is_equal_approx(_user_volume_linear, clamped_value): + return + _user_volume_linear = clamped_value + _apply_volume() + _save_settings() + +func get_user_volume() -> float: + return _user_volume_linear + +func set_user_muted(muted: bool) -> void: + var new_muted: bool = muted + if _is_muted == new_muted: + return + _is_muted = new_muted + _apply_volume() + _save_settings() + +func is_user_muted() -> bool: + return _is_muted + +func _apply_volume() -> void: + if _is_muted or _user_volume_linear <= 0.0: + volume_db = -80.0 + else: + volume_db = linear_to_db(_user_volume_linear) + +func _load_settings() -> void: + var config: ConfigFile = ConfigFile.new() + var err: int = config.load(CONFIG_PATH) + if err == OK: + var stored_volume: float = float(config.get_value(CONFIG_SECTION, CONFIG_KEY_MUSIC_VOLUME, DEFAULT_VOLUME)) + _user_volume_linear = clamp(stored_volume, 0.0, 1.0) + var stored_muted: bool = bool(config.get_value(CONFIG_SECTION, CONFIG_KEY_MUSIC_MUTED, false)) + _is_muted = stored_muted + elif err == ERR_DOES_NOT_EXIST: + _user_volume_linear = DEFAULT_VOLUME + _is_muted = false + else: + push_warning("Failed to load settings.cfg: %s" % err) + _user_volume_linear = DEFAULT_VOLUME + _is_muted = false + +func _save_settings() -> void: + var config: ConfigFile = ConfigFile.new() + var err: int = config.load(CONFIG_PATH) + if err != OK and err != ERR_DOES_NOT_EXIST: + push_warning("Failed to load settings.cfg before saving: %s" % err) + config = ConfigFile.new() + elif err != OK: + config = ConfigFile.new() + config.set_value(CONFIG_SECTION, CONFIG_KEY_MUSIC_VOLUME, _user_volume_linear) + config.set_value(CONFIG_SECTION, CONFIG_KEY_MUSIC_MUTED, _is_muted) + var save_err: int = config.save(CONFIG_PATH) + if save_err != OK: + push_warning("Failed to save settings.cfg: %s" % save_err) diff --git a/scenes/UI/menu_music.gd.uid b/scenes/UI/menu_music.gd.uid new file mode 100644 index 0000000..579cdad --- /dev/null +++ b/scenes/UI/menu_music.gd.uid @@ -0,0 +1 @@ +uid://l0cqi7dvoou3 diff --git a/scenes/UI/menu_music.tscn b/scenes/UI/menu_music.tscn new file mode 100644 index 0000000..1b4ed67 --- /dev/null +++ b/scenes/UI/menu_music.tscn @@ -0,0 +1,11 @@ +[gd_scene load_steps=3 format=3 uid="uid://dfmq1n507y7d3"] + +[ext_resource type="AudioStream" uid="uid://bftct74auklgw" path="res://assets/audio/silly-test.ogg" id="1_ek0t3"] + +[ext_resource type="Script" path="res://scenes/UI/menu_music.gd" id="2_21d4q"] + +[node name="MenuMusic" type="AudioStreamPlayer"] +stream = ExtResource("1_ek0t3") +autoplay = true +volume_db = -3.0 +script = ExtResource("2_21d4q") diff --git a/scenes/UI/start_screen.tscn b/scenes/UI/start_screen.tscn index fac67b3..943271b 100644 --- a/scenes/UI/start_screen.tscn +++ b/scenes/UI/start_screen.tscn @@ -4,7 +4,6 @@ [ext_resource type="Theme" uid="uid://wpxmub0n2dr3" path="res://themes/button_theme.tres" id="1_tx5wa"] [ext_resource type="Texture2D" uid="uid://dhuosr0p605gj" path="res://assets/images/pp_start_bg.png" id="2_r2jwc"] [ext_resource type="Theme" uid="uid://tn8qndst18d6" path="res://themes/title_font_theme.tres" id="4_hm208"] - [node name="StartScreen" type="Control"] layout_mode = 3 anchors_preset = 15