From 721f4ff5a643f1bec4040e18e4faeddd40891add Mon Sep 17 00:00:00 2001 From: Regalis Date: Wed, 21 Sep 2016 19:45:20 +0300 Subject: [PATCH] Particle system improvements: - particles can collide with the outer walls of the sub - drag + waterdrag parameters - fixed particles "twitching" when the submarine is moving fast - submarine velocity only affects the initial velocity of the particles (i.e. accelerating the sub doesn't automatically accelerate them) --- Subsurface/Barotrauma.csproj | 3 + .../Content/Particles/ParticlePrefabs.xml | 64 +++++++ Subsurface/Content/Particles/shrapnel.png | Bin 0 -> 48350 bytes Subsurface/Source/Map/Gap.cs | 2 + Subsurface/Source/Map/Structure.cs | 16 +- Subsurface/Source/Map/SubmarineBody.cs | 12 ++ Subsurface/Source/Particles/Particle.cs | 159 ++++++++++++------ .../Source/Particles/ParticleManager.cs | 8 + Subsurface/Source/Particles/ParticlePrefab.cs | 5 + Subsurface/Source/Screens/GameScreen.cs | 29 ++-- 10 files changed, 230 insertions(+), 68 deletions(-) create mode 100644 Subsurface/Content/Particles/shrapnel.png diff --git a/Subsurface/Barotrauma.csproj b/Subsurface/Barotrauma.csproj index 03b92baa8..98c44895a 100644 --- a/Subsurface/Barotrauma.csproj +++ b/Subsurface/Barotrauma.csproj @@ -817,6 +817,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest diff --git a/Subsurface/Content/Particles/ParticlePrefabs.xml b/Subsurface/Content/Particles/ParticlePrefabs.xml index d2be342c8..7182505bc 100644 --- a/Subsurface/Content/Particles/ParticlePrefabs.xml +++ b/Subsurface/Content/Particles/ParticlePrefabs.xml @@ -234,4 +234,68 @@ velocitychange="0.0, 1.0"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Subsurface/Content/Particles/shrapnel.png b/Subsurface/Content/Particles/shrapnel.png new file mode 100644 index 0000000000000000000000000000000000000000..ad42c6eeb0c21b8e370600fafb8c2e74c120a52b GIT binary patch literal 48350 zcmWh!2{e@78~$bt##S@7hNc>0EMpyOlO;>Y42j7)$(mhueo`1~mPt%wE7>w6`z~e8 zQk1nUNkl@(mdN_|Klgm+-gD3S&Rx#E@B6&(^W1o2qpMu(g6seQa1r!%NB{sjX@USK z%SmPJ_rm$4V)N0r@&^D8p8tO!;7JzZq!Z<+Pr3#GAtC@ki2{Is$0zk70Fa;nh|dxL zRMG+9jQ1G%LNWlnxlPc~G7bK+a`<0{lSQEDsaB7*(BY2_eu4eHB!jZ(XdPt%>ce)H zNk=Qt?t4OkNt9RPwp3f9i8;iIHJ#oNX4OGat_3y^cUX z^mgrt0`Bq66$s!zoQ;Rmhj*WzK48vP`+qr_L(Y224nEP6Wb40#XDu*nL$pB$QLefD zZC>E#iTZtsit8xeBVz@(KP(vzGgS3|wK*rhonP2(-f4Lx{lU=U(n1~CaR$GDBx1$O zHpgH9L#cp1NREAzIVLX{Rn5vg2YdThdtVP}{c}s7gAgdfviAiB3F^$YW0) z)Qm#-f`5^)i4hXT&kI`FT%q>%w|x*fuQo=Gi+}I59`03K=?i!aq71W>h%iSA36_fi zPv`ydnPlLDrXXs;@V8=0>%5fJJVW6nLoKyY-+8C>NdN5V=%L%%P@n#hv%-;VR&nnV z=f>9pR2H{G?5GiPKf8Qa_FGP)wHqcsYV_T=sTlKTkRmR0N!su^c(TT|7-+`Bk;H*i zS&oRd%vh2j<@e*!&pO1S+BnOO?MxO2@7p83Xn>tv5Tc!hp_m&}Br~>{T|?EyPH{2A z`s#RjiKJy&|MDRCMy9E{dKeVe<12HZ=MU1PVKVFIX0o16A3M-6<`rYhdL{u$qfPCI zr)i{qh?dVI(yta2bZ~jwxY$$*Eg{$44}w93%Jnz+XTWZAp%WUK|#T|i;vvyd#I4Z{1KrKVrM6LjH~gfU_}~d?7l|! zTC1L7c@Kam3sd)aivL~kY5(msXe<%=3C!=Z`?EDPaDE@g4q3a;QGVnNi2)-DFeJ6)v4pUqy<1>5lh1Ov(}B)!)E<~ z?6Nv=TQ1VP1s`9jh0T z;)pjKe!zt?a=>)~4#vbnAsPw#eD{9$BJ>QBykxctLTeHz__kUK3T491$!!hA^)W|* z8`L^g^s;oQ3j5MkqicLwM2Ol|kH74MO;H?27PQmCB`kHc5~9_sNG06nWMM(GL`I@D zB{D-;$ZL?Hbf{%fN_Ju!kYAEF|5;~tpmy{E=z9go@Y(8DVWyAP|9DJ({}T{yN7R7c zaJPwlxQFa{zcb+X7Oo4AhQYM$+`W!Ucf#H?FUZR2kb2enm2DVw?xe?pk@zGn9iLn2 z2**Iir~JFEYAsChskL! zneG>Ox3aWNwr{lXSx$VSIiImI1=B%-6VtXB#(g3Tl1(30vpi*oNtr^wzq@VW)Wcsw9yaD!uK>tUG2sl#>zHw#{)tLR%(3g+G=xt1 z@5-__({4k}vj$SJ6#V{HGo8EH=5+SLq0+)ZF>u+06P|b;r75gmC{qgZRb&>PBr{sLg#V7T9^ef$fcfr~2a9E5o}IbF&sag+Or| z(%tpN0=rkJ5q8^+>%L%{aA__gmF|+X^Xi$?azNqN5%oHD&bG$8Pk0s|Q^))0w7cxa zP762m|6^r}O5+wR_5+HF6e@Sz)LKrzp!c2`a=kL=epUp<2q>VpA|YB6uBy)&*FHRU zn@pf@UQ`<}km}39DA31QQ^sFH4y zaH`UbY}+SuMfY+(CISO~0C;kc*exr8eobTQ@?x3YN^__6X^Ad7Ite8X_2L-bd|U8C z^!KGTlTLF6I3VrELmG_gzX++s%SN+MXzvH$Ro8D?<22{9bDSlZIr0<$%PU$joCo(L zFEuROWnNCj=6(RbF5eFVE&|5DFMyoMnz8nHcA);wLfZZL{%o6BLPoOy1VkrQO7*R% zg4g9I>%-IIWZ>GGSS8#0kN#y@;|5ro_1Rp@6xT&u163o`W41okrIVu?FJJdKH1GbW zG`K5_MsmGfNAwG>xp2RHtY~d}?Zg7EoeS0~>Nb>`@ zHnxi`OHnfUck8ztJ78tnj~!D~q~K}%EGiPxTd@&H9kw%T%)-B^~W z)04P)+Y^ca%^Yx%v1$1SZZFZy8afgEK<^!O@>yZG(V8%s8R7BfdYKXp6X9f4DaApcwFTaS4KZuST?aKf7ubz7N(nIr0UIr2utv)ya9IdQ-Au5m5q`?}9z zkTRbe^4%fYaUs01sPqUpt1#Ove}O4<7NBy7i+~>bU*dViTBicoXo(3)^<6=B0b-hH zF7-x=!vXexYVgbel!&uoiQ2y5+3N!919PF->LFIQJ-n^g- z&li{9_&T6tQd`oP(e=Qiw(jmA*<-im5sp&<^pjO_y$BM@Q6?|$Ox5xkdNc>=MAY`H zSk`Q_I6ck-e7?5J~%W^Yw2z>#jRfMS`$uRB(LLgK*8`Q zB-Bu(5}{?xj$!8>G(K*6Vo+J5RyFF}P^mUnn#!VR!&xT%?5uPo5#xXr%FC@aw7q)Q z@aP)(yFbpn)vj(#oYC?GLzu9>QMmX3^c6fq8(I8IGVu62M0E728P$E17pHr>bzhkA zDW-@GAM##_snOw8kNw{{A}^c=sSSM}KgB%bm?e(ZOD1X&Q+uD0C}6tbFZr}FgVX~l z(39#dY4mw5PJEL?0w8S~wlSak8OZzW2kBJr!oeSAC9>H8U(4;<4OXC#JxG8qU!+ zAU@awAZ_jt$ym1T7uVm>4eK|aquM@vQtZG%su%K;+2dgc&&lmK?+7L%v{EQDV0~^) zEH2ebp{q^bYq%gq2Slqp?aJ)s^o<467NG-1G56!6uh`zs3J62UR>{% zzv~)*^-8fk0FU#>_2()PIak=b*VUxwron##i9G`2>4Gj>yQ!n%y=c|_x3H1=<-!Y{ zO97raDLQnu!zC4AP_pw<_lE*o1M9K@ZjQCJ=8yrL%COSmmwrA9sb8ByTtvbQ!#Ub@XN zU5{iI1&*OJ5`U3H{|2NnWYt z)>dy=wghy&`W(+ia=@UZz7M&-9ut2}rx0^ysanueXchw>3cOMO#)zIAhNOZD&5ONX z5?j8o5$5$zDb0m3&?G_Zz1xnE5<)RlxOlK!EcKY40!IIoeT?Zy!4um_sTlDKI}tb2 z%uK-|=#UoDueSp6V&Tc6t!HEH%OP}LIw4KX=f4u!NQCH!(=wLCCm=hyQ|B^s&-RR9zmX@!VUM5y`Xo3Lug^=6*P( z=@yPvOD$`)ofC97)6QVq-7lcaUJTYWdBL^rOph52(Z>cRj_wWTZ%a2#m8iEmSs7@P zfD7Qt(E?DS`Gjwl!xtYhczixL*5-IZ6DXc{v(}REF`A}yi`9v~m$$|`KGS;oNes@N z>2SslQs%3qm`&(4-WV~hy9+U(FR^Q8USj5|r2ofRR>Nx-yDJ<>p!aH`Qxi0tj)6dJ zk2jiS6u2WLom6bqeoE+ETVX+NtQE6luD<7MrD)Fm52h!9AtLs zRXj;Fm-zP4$0v!VTQyQl&y^axwDd2Q+HvZDsWWWDl^J!!t#qu9E6f+?a4ESUH=Ha< ziO}rK#ZJ{qad0SjS^g~$fO;muH6;1&X96ux;=Wn&qUVO6@=gm39%=y>J<4QLyRw2o zl4Li*!RS*lTgUR0^c=PilCvBW)7E9%U0vhTD?@0x#Sajv)V^ezAbK7aU9f%pyZ%h0 zAFtj*5=fH&MDm*Zjn8K{Czu zoL<=mkqKC7m)h){6*V+}WSrI9zXK z+BI`H@M8XTS>@y3=i;D9QqyThI}|2$Ekao^&^madYy9qn(WhV6Fr>({+`K8^b+Sx! ztHf!|IQmA9^!O7yD>oCaV!Z$MuBfP|xT|X)6XJm=SE5|9k+gQcKmi!i5F`rZhj|CG zUkCHEiDwq%-bkB>f7}^qE^Dqbe;EcCVU1r=*|YsHxtcnwsmARb;CTtg5hc#`Zm^5P z+I(krq&(sic^W)ZjZSX-!fO|Fo@J((yxi(QJ)GJc5Dz=@tA;zSY@&T!-=wC-JjLd8 zb0f2AKK05Y>4bxSgKKqWyhU_}p*|-D-0BJToy=?qV|%`O283k*z0iA-=0L7h z=ohKm8-%p=_m}mH70obpy?#_dfDG7ZMzdOwIB0I~B`9NhCVxi76J%~>_eo1oFoaDm zc#m92^S5XAh-UV-h1~6eG%S$c@ALDs1n600<{f{oc$!`2&xTuP)9z@wrN**!-au2k zZGh>U(ook)bj>%xN@gi8W9}>drzU5u#~swu**U=ly!t%&hCKWOQ4Sr>1O)yJ$}XKo z5G0n0Lf%!LPwN6_1^=A*K2Ki$xukZt_n&cbp8iE!=fk_AIAUKKo!vz^k`E$@%1>m_ z!$lcXL+UNVHR(rd=~gQs^j;*%{hx9y+%(2AVwpsp`E>^6W;y9R83g4brV^VA5h_o|%7`Fb?A`uM-{a(}cA+{$xWgi+h!KdLnX7D2EcOgjqpIu; zOi(?mH25zlx z35jqf9&i?8MMEZ76vme9)q4T^ZID#>yMdH!5@+cl-mRGc6pvNos-r!$Ecr8>XHY&p z;0EdOa^_j2+f*cl{tK-|9g(;x=USHX0@Hj^-aH+tc`Ou%%6J!?@<^BY`nkxJ;)Y6g zPWc;~x4Or@efwqYsD~w1`)IN0=ty0=aRgMTQw7KoM!#OXRQdy^{Z&)P+v&uqYv25X z?*C)ep4b;KrPDUd$}lk$@q z;mZ?SG@w;z3L_C)$%O6uWp$~etT-NYX$KQZnWm1}>8AR=ahb8gIF-Ofc9 z(0z;IQXTUmNP3OhZXf84Skjz-eB2rT*IjDirZ4=H@}Va&bIaO3;KdzTGhg*OjZpYz z@v07BH*6RB?9LwAzPmu>y`=~&A(*F(^iLm+GRn<|3WC|#lKEl$OukK&N$k(u+b=1v z<_ZchU8qLDaY;!h?=%931$SB^gRoPz$2s1MbWw;xId z6m}LEY1!v~tn}kDHJoA-I&VU3rpo=jU$*_tLG6xsi?b~+^yW{6a%bw{q5F%*iRPVz z(J67{)~laib)#-0N@DII?5I=k5c_A)>Yp z&%%r6|JjuBnHEC+Jj#P097DTD3}awL9BLU=hJ|VwmLUW56y|XW$&Fd)AX^;ce6lXm z@C7e~=~$o}O5kNOjPO5OFVYqtr2r5kJ-AYJDl=F`_~JJD#wAAVNbU&k8_27R|4n`j ztJpt}V!juscZsobK0Vn-UZU|kSTmnd5J?tdv80w=6XK#gl^;8h2KYI$wa+`s4m7x& z|KSn0DBT6KXU0yqu&F05z0QX{&G~qwXdid!ItX##2Al@(R%H3BJOvMu7qXRr=&%d& zN%pVL2b<4n>co%!VZOFfMx67WOynqPO5})(f^`n_=F{Yv=Gmy3lVcOJRK-$~-7@u^KCc8g< zwPH*Go2L$_`A0n>dzR(V8gn78sT~7C(XKgOmNYEp&exZUr%SfZ$6@nWbu7z{pP_dp zJYMT1(ezm)w zI@yqy0{&dzfA&rD*ZK)0)DbmqvSgz9>2P3pV(3BYsVXSR5kQafVed?|tWbU{sFJHq zHEvN;?u>11Zx>z2aYgoIl6(lwX~cz^9BS^_-|_avPt>h2r=ESc5u{dy+fhTWV3qzf z%IDIMWvBPlT^V+-ZOpAxZ46v|;j3NDq zE3TfSF7g2{Pl*}X#X^haWr?%hbrW{%S783ulB3E;^-_MdN zH_-UcgjdUhYqH)y@6p_NW!d0PXeR;OZF#1xsCM+o??>RP$s!uwz_C1=ws^4A6ZMzP50=33x)?2`4j0@T_gX@Vjt;Cx?%&cuU{)|;?b+AMO zJj$K}F)tL2UtUDL;pVMM7LjP7J?{mk&Hja2#O#`-O&P4pZOE^cAojH%P z)R-S9c9E3}H~aX>C-}2289PX^QBPZRO(Z3XKr^OcUd_vz@9@QFK!tUD!R`Mr@WboC ze!{6dja zsdCC4h%UVV%gFJH5t% zbutZT=4=yY=+It8hrv)(v`@c?*xqC63J>qx3kS8}LTwlmXE{p-iM(^&MI=CiQ(m%`+VDOrJb20t0Cs$+3ro6NVxDugC7Tr=cAeN`w5bz|W+Uk3a(0_gatECCX{ zkgj84HM0*XHv5Hos3R&nL<~*#*ODxV9PsG42l}ka#D@&wa~jfXG`yHSn_kt?#fxK}*#=n{PRa#s6^WJ08o$9efA<8o7>=nQEKkMNr^so_e0_q~~y zLP>&{SY@8?F@h+wnO~)xkWcJ(ibZ)N0awxrdv6_%JUQGis#$TnXc-9t`HrgjRE(*9 zS>7h=(gtX|wjR-$^9xx6{v9`!)+2hrHxgDV92`?F%)e86loVTxGm!twS8Wq2VE`hE z7o!-lbob|%KgL^reg!okw!Wh9pjD0bT%0ZdXFNjTg zy>_i>bu8IwhcP@@Qp!9?(s=B@AprIj5i!?iK6a4~+(nqK*AzyiFN~)@-|2pSGdq0X zi*F`!|LUcMiiNBa^kI;ahpj~FUd%w>v`1-^3AC$2Sa`Slrns{hofOLWG?_S&(4&GJ zV{!^fKwN2<(kuEL=`^`6!8e}7Ap^-rX})d-+L42YjAicRL3NXvIx5N$As(tfoH~1W(K)LgI`@ zXEbr^$N6(5(+ekk`ofxJNzj5^+jk&~UsQ))@sEB834CU@meqBAhUVY};eu$PZlfFR zO1H_zwc6<9-kUaC^G@ymRAgk!ts>nO{tm4ygyUGsUnrW-#0OE=&z8rtT?w6j0PFZ8 zYTa>Nu7cxj<>FmEoj*^L=8!kt2-TopUpP48oEo`s#hCpJ#P!=HC>PM57SKyb04fr-$AMe!vUzWC zHnbBS?R4dFq$W8VsS8hb#g_w)?5Wj>hmMPtQIQ(cX*n(I0(h(%FVgDK zm!ER8RHnzB0`2zU68e|6_tPmadM>TG&fKHwGos^7hf4L>vgED>|80addo@h22Ks+D zB51fZJu)%RqSdcZ=xmXSHeUC-`NuTGZM^h_5q;tlaJIUs z<{LFIe=LNS?Li~ku9i&Q#hd*4URpRM-yRK`EEskBi#3jEU2v60L zR=qE$u6sOteyDvy+`BG~^XH3yYy2ezj69I)u9!hfH_@nhYgg^~+cIM;Mb8<;WiO{S z$rH%@z+`>0IM?i{+xY;0l>9KQ9$Io;$5qp#j2@=$xCpQE`1pjq;P?IBqz~0dawsj1 ziEajyP`SmM#>Gm;vaBDfu66JPf35j)F+k$ z?5d&8vQko|aSz9BtfS}gKI*5_oT7Y_#5o7o>g}zR-;gdjwz0%T0z{%^5=Vn+Or?&@ z0Uc|D*2GSw#vfd~wsJ13N@J|;I?tchQcKXH=N?ByC}PlignUkw=@a-ThDP@^rcEjO-2y8Pnbb`!muc2Uc$N}t84#cFe<%Rr*O$#zL*e$p|%jI ztDnABrv%1de$A?BFuT*r^4yyc*n|-O$eD2&#K|5nAb9E>{ldE%Vu9GB|CgTj3sPrE zqKkoKK=H({;m_#LBJ5{eHd-h*Ubg$z1Z!-K$p5^n(j=YYrkB7_XUfCSaFOOOOH%jF z&zZ|m|2+R=aBnmCqyXhjd%as)D+`G44wTiUAl3f{1_q`AHanva2K-K6m!SNAG&AJc zi+4KP?Cw}&53O$EuU~V~DzM92+kZK=^hT805k8xxg{z<1?&X`T-uc?<^621tF(ChA za}0DapKvR47$WbS-gyzFHBq` zZ*;_-1?>;y@II@#u#n|{3crw%l?8#@ySlm()42+S~Xf2i-zrg+($TCT3YT_m9Gx>1$nJ*hiFvPwT#xUZr$pcf;#BmR*p&V zry%mh6ZQ|k{THWCP76(incouiz31+?>F-N>Q$FIAV=~jPah!i&!)f)eGS5&^TulP? zaa8A0?r5#8TWGRen7+habo}!;g|yY40B44im0KB+MnRBb#Tol%v2eP%rFGWTiV@w` zF?CfIVfjbJL4Z04Q}l(smLqaz8Sc%kj)li z1U09TI4bDM)25{M)Av8S{rBzcm)SWolNRFZLdg6*&z=c)E31uU(-UR|JXm2t)bR4R zoGltz8ngqHHMbH(h6_uu9GCCB7JUq%0)5r)q+cAbq-B2CS+#0JvRr1Hu}G<_QV2TR zCRkuN3AAB>b}K&0a#K*V%|LNV9a;LnzJ%wQ*V?ZYjSyVk4f8w)v9K;fqwxQ|e~veL z;3djt-E+Q%<(F#o-2I|&u1Px~?N{^lZ3KFLB_>_F!1{gJ(q4?+d{NlW3Y<1m`L#Ah zZ}1vGoUj(GcY}fRJq5Y@$a3!?5@~m#DOOcxSb*!G&dJJqU2QD>aj-SE3%E~@bI#WP ze*7rz5b<9#o~QcVzHHJsi5S6V?^JcsA+s7hQN0)OIf&UN?CXDPQH|^Q{>QHu%xv`p zgH&SDuXvnmP<^(BEjBKv3o$(Xz0MV~-%-M3tvpd}4huiOq&U}O3MM%zD2?pg)mdRL z8?UJ;d-{99l;Q$zUNDc^Bs4pkO@p3|{&9Iom8ZuDMCT&n(ZosK6fWeo`a z|89L(ecA;gY2idtbf4U*S}qQW+&m(}Aq|?qfv1iFyuE&9S#jJYE*>tjy~8cwjhcP> z7_Wtl(KvIps;I7s%k95ezO1YBBOWoU1)=}qg-qAm^R zb+B9~fr?9zPfruIu>YrliTh?Z86?OJEd1R+JX=5~VYjj9C%eaH-v_4lobEJJ9mJE8 zE>=k2wR!J1+w&rFK^ z^1H5@;%ipN9M=X(LMd*oEC!a53i}iBB+~n6xSWH|AbRzjy=qdB^+g*KsGZ8%lRbB= zh_kb^pGDb(r;OVKqyNjEW8eeF*U3aQyEaB%^Y!F|nfoQnO&4C6O3W=;ha4(SqC1VD zbjV5CYI614>$pD&R~>kU!sBOm-#+vDPyLKT(VU7g`-~B@h;!cLk|y`>wVjaT@zWiC z4C})>KZgA6c+U`Onw<_*J6`A4+P~1_oH_hu*%S$K9(Yge|K@1XB(={87(Wp|dcFHO z6mIRIzNN!)yt^y@WSh*aV}a`q{_M6`wJGv6W5=6DQCr+{;>xkwA@Sf40l-o1%UMfnDy> z88+y>-%VTPkJjF-4Exhf*HCEDXwBwt_wT`CEkt}3LDe}PlSa}>!a6A|*Nb*LX7hhF zF|PYoji0-4!J^3M+1{K&=+T!UdvS(Psy3P-&G^FCB}b>n%_4jkg$caenWT>=xhb+R zaX3>TtuogsQeV=?0o8v=et;sE7IbPulgI*0ozxNH4KdrC(lmlVl z8DzdVaeoDi&eT5_Gt`cPhQIaAdfGQ%-GzuU^J{ z%x_yAxv(!%VI7w8?&VBEs!P(G593ok3hEU%mr*;K)7QcNPsi#=$?vSd7BSL{a0^&A%?#t;a&<6cm>T55_l6r%?D!fl<6Y6~T+)U-&uw zpP$3*ArQ78S8X&%UZas(v^+v9=$k^=c}2>8{9+F1k3v|>GmOZekkAkPALnQMt8{ka zH-lwbe$1+*gm@Q?9L}VbJ^iMlpnj}uKVkac)N(GUm^Y+ZrZHEx%XhOUt#bF>yT#WF z&Mr9%Dqioo%?Tcd&VY+4P*YRmHd$5M)8;b~ILf8C?AHE>Zu~MS4Ceef*-f?|e=1KA zws$!)>;i;KhQyR#0Is=(>&`RH3MwJFr6mkw2PB_^6}o4de$&V{gNMqJxT9Z;7+hNJ0sZ0|dFg^UhJkJTWDU2ajK6gbI}kC+uG7 z_*?$m6LN#5taUd-E+knl7M}uryXcH{;w;Om72_95VQ*OrubW=GUgVgC$(;{%xwKuU z1$*=25+0guR-gIv|I)-Pe>zbFHl%l=fW1a5h^*xpE*9%uZIIfxFksN0(<6V%kJo!Zikq?|1?|UDGqf}+Xh}SYk{Sf#oDxB^%SBa%@|EZn@HRp%fWt? z`m@+>AcCtOeG!Wj7&BxkM^iX~=0z%2{AIkR3)$z90a|65z{J)Iz)^xEHl ztF^fH4bdY|dcjS28E=@IdV;pr&k@i&%V>*9 z9}wi-Oe${kMdG?~c>L~*)~hBEA)U)jiR$fyHVi=w?kjWDWG;PZ&R9tsqn=(xoEO}^ z)t%w=Gap+f#KSDKJMi#f67_XCmyo&5-?L6~g>y}?$W~p+bDh3%c+O!XHR~)@6_o>0 zPgSM!6x3UJd5zl|PXhUZqfH`F`ZM_7vL|W0Yz6K2fm>DIAN}`d@9<`ks2Cj5PGg~y zJ^t*6jtE~5&Te?-f8-8$Ln^=bz{9q7^77h=MU$^olAeF?^TQCnEKm@3a%agR>ywFb z_in9YKo$~r_=@JT!rXruRG&g77u2-#yQve9-IcB-f10@i#>H2~AZ!yUuF@2g8$ zD7F^F)qryk*koqz+OQZY`1DuaSKHz7_59NG-rzR-r)$>-&`GrTkuBM+vziSf%VGrO zhw&R;ykb>CBa#fSdmq$cu~0^|!-x6$d#`Sm=URK`nqJVXyA(%au=GeqAg=OuEe5H& z*6|N5N#&0%7ffIi-~NO=@bYXL@s9nAOu7x?viW<)y!G7kw zuwVI%W)n7h@rz&TcOK#iN6LgBA}5L091$L0)`f$q6RS7{WGmrt#&T26Y6DTrO?UU| zOeH{VX(*`8g&sK(!scn6fR(F!VF2{``cjfesaFwKA2tFO70t?(`tj^wa_9F?%P{@d zpY_Xz%Qcs*{S-Lh5N&YgDFP@$Zsf6Sf8T>wcH(!PaH6MVTFXa-dlU=kXwJ7tTZ#Ie z-r2n>6zBIZ%GHY2qt(>3XyAG@dOYx7d5Lw;;jPqn|49@lDW83q4(E}Dz;7$BQ{vjI z@APfInHK8sR!y24uRn~ym_!vlSeljNqY!65Fhn?VZ&^bv`B@356LrCoUggPQ4}7UV z3-P5Dl!wQ*?rJ5+K0;H5DP01d{Ulnl9cnCc2Km|Vt`mD(?av^j3xVo=zVu`d*l|g7 zVn~Q*gX&C{M$yEJxAo^>RnofbsPVPusCvrNl;Lk21tYHl$q}<3zF@gN0>evf zuyz4%(jX^nMxWM!j1RE;@O=2WJ)*-G>Ho~^F({doKeBWpZhZ~`wIy`GURvuFO|~C& z%yNT=h&KvdRAn014=g5V6>Pv3H^x97CXef+}hvLrIi^as- zzTj&##B~c?Md~&fU^QxS8m;>qk+)KnGfN|e{^<`}3o>bma6e%@E27il<{&2Ag*GwH zc3DoT;Xotv%>o6ql`>Ax=Tx`SZFEW}=p+rr8{^Q0vV&Vm|5blLgTBRiXRJR)W$Ktv z@xPC~7}jBg_x=r;RuDoyyld#(7Drt?&-tTjNQOUqyJDeMCLSedxnJ#>C$7 z?=%TGxwrpC=N(h-SlLRa8^E%z@CYS|l%T#D4SVs~y%RAxyuAGlrVFlnz2ajuqXTt{468^tDz5g#z}reaof|~;AJ_39 zeZk{t6k()K|95kUgccP;cyj{B9MsH^RlFF#_e{!deLN3A!PyU;Ys!`M(aQwykkgj+ z!mO+;mE-PDwfK3vh#Vf{orhxA_;8R8ukXzxR(8r0oysPF5Fj#CH5gJS|LiW#{>rTz+#r zeKDxXJ5BzT4x4Y;9G=qKGdcB&=ATM*5@$q@?rnbJ(ckxC@uiqL0m6~Zpnj`|=UFj-dA9i`%v`c9N!tUf?r z2u>sW#PEwZfAeGN1d(JE-Sk~8o%wY}c{)DCUYo2euEk57Wi!fh47iQwds7-r^hv@& zg&1I$C1{-v{%MJAAIx@IA}TD6Nriy ze=2v~Svj9X3T(PX8osUf&auowda3Ea!bc_rE(5^PAr9@GlD=3fJ+) z9&ym{)@D1lWxNHZaXf5&+_Kh|i{aXCZ?rrl*t}L%n0VlVAB04`)J__{ywjz1d&9)H z1KMAo;JRA~I;%L&>8a)IY}FHgt&Az1CBxvJld+>A((qO{ZkM)+gIIosp8CC5j_y16noEzudmv;#C+&?08UArtDiX`Nnt1us+D;e;`#HUXXPvvcvH0{`3-`{4 zE#~p9Qs_qIcet7r%G5riif1g%RlXTu$Frks1|HmI6a0p{os~Pi8i9zqSzh3{R1;+9 zoNdRe7k5Qt2V9_UCngt=+*B7OD=m!q&m$zWpT4ceCU$ z%b&h*z)!p1+ToXDg!W>$t~=5H9kqWfHBGQNbKO!b0Z!aPQQ479C1ZBO|G#X zCIWARYMWNG0d8N$sv*fRhtxJdq^X3GqWctGRtwN_%3=YhXcn6qExjzBkDzZR^=v9X z96Z}DE%AD`@-$$?tGgKV8X<^m`?8_rS~m%e#4V6``KA)!#|Hn=V6$7=ac9VpYyQX` zbYC@zaT_0851TqbOq@eFKdEp_y}ze*S?>JFYeeEk?0~rkUr$gL z&WJmJ{OnxkrG-c>n1RV%Eg$QKA*A^8y2i%nSHVGTVh^SJ7~FE*mzAAl&{riNbiXr9?Wx(9mGXj8G^yWuA*ZSdK=ZnVOXrUTyPD7f=-K>Wb! z_hG^G>2?4r%d&U5u~MspP}VX$^EJ|(d)V}u)3_!(oTv$6Q>;yZKY$15fy~L^1R-e1 zOoukNE>!qIAJG(^fEz; zN+?-D%UGQPL7z=y)wEWSp*xd;)J%bDrsuv z^VzdaO=wU~FzeU(^dwCIuJO%F_Pz#Gi55H`@T2Gb{Mt#9;eQ-m1ys~o7Y79dq!gr6 z5b18|QczG3De3O+loUznloXJqyGu%>M7m2D5oziA?tFXpY@A(&nfHJ1-e0{tZ|djR zElacB6i*zCs>uy}NeEmM!s!Uxy=bTGbCj{Z(vbc4PL)MV+!`OnX5c!xu`%R&Z&}jP z(F-q8{(yDY{DuddEy5ZxeymZ zG-eZxzUf-IR$vNfoYC?qyF2GNx^r5dP zR!(cVeyiSCu3lO;)FO-Cm3igS{V(~ojB{1i(hl`=Sd0F|jH^WqvF&Xanci*fRxc5b zVWP4`PQ!2q_$5Tk>y!%*55PjIx22FG__fO#SS`y3r-9RC`7aGuFWx81q{YEO8~25# z{SkJyI)4StTY4D=ety)qZ{Pl*okP>N`3fJy;*EzyQAxvNrL%iXa;X6&9JJ^;Mn$8$ zM=1FnWUXt*bG!dWFobw}|E^cxBpIWkVEjBKwGc>0xmQq70J%-kk=qDL6?KY=G?xlB zD`|zJbj6|@j(nR}89Px$>uO^Ie4gXObKrO~PoNjAb-BXn9*#nXLJd`HSI*M&!GaZ%`}3IqXxw36j> zGNsynt!qsc?CH$xQrew$MMI4z;lM@Snm(ks(%X9!Eb`d3;-A;hk|z@Ku_yM&G(J81Sr=llah+E0JN^>_cpO&1o`?;2?vY;ttm z&f7f22#eCJ!dko!zh9zK>PY|k{yJcPX|B#gfhhE7v&hmSpX&)PZvKOFDI8@SHj0CX z9WZ%JdVXhjcUmuYcFTUX zj1fNObhfEC(jw+F-V?<)!|~4l)mf@0MOMiYChgMf%b=1GIHr(LcXtiDTi8emnVmGdGsXQxo1Xgz`+x|eaXW-q#@-h5xz zWi@6DOnX;r8H4*h%_!#;cWnQ+E_df0SgH|UagL*(wv{)mOwD+Ij#xylX!%ogIvlAS=xF2lOrE_>=*N*kwV8UGdW%W?bX|C2 zm7p*8PDd5p%F7qz6*$c6XYY=~?y(t4DPT!<9nROv$l!WgSqWGPZ2fle5;wj@i_wc- zqu0o-EJ%FN8Ln5v;OpPXbuYe}`<{70q2DiWouWOGmc$_Kt@@*jt1j7p&ug`}Z_x$U z`z(+eJ5VC@=(?4e*Euaq9~l32Co}E~FaM-J%Uz%BJG6YWuVS$4IWQI|m;aG&wT=dD zIaMR=*jjBlHJ7{m?ap?|t%Te4Xv8ENG;X>ly;ilyZo`J3{XH6#t-rTuri+j4#UJ4GPdQpSdR zuPy83tQ7;8QVBUF&nn5Mlt5m>t=J<9J0e(Njb-h>X^}4y}+U7y} z(&Z$J2OW7g(R}z28iIs-^^7Rf<;M9r<`%PKoalWtI+R)M`@?3RRxvFL&`{QVomTwPsxQ%_&X+Fnm!`xgWk)=p*txcAE+uPxgeo~hGy zqAY~orNDfnZcXJhOjDx9LW9+{=aoOcZb-WGLwgC2_B`e@%4Bp@r{lJ}`twAk?ss0L z7>^#+D0^dnj+D*TFYm&?g(E|y~#vt z*JH6d>*_IB>U03pt$=1V8ZCIHBvJvO*~YP#@yml zG2_RkW#5RksDDxsN|`XQUh+pnrng_ZJg2U)5aE|8Ug-V(%|Sg_-a_Dy7HP5(EsOP+pPOz^DW|R)mRGkqy%rD4 zt`C$1kEnM=Fy6m^FFMk^RQZW+&h2NaFAIA?K%AvT4!>x5%}m{PdmKxt4_ZD0Wv|xv z^l=pPjOMbFiGa?|tqsHmbv4(ZV@CbGJUYV}eq}zEfPIGO$$lZ~h+GRUh1KvEYQorE zW`$E^@8rqe4TUV%nGzaD-tAOyz?(ZFNbu##9LB(rc_P@yT#1D#62bZ!MIml}g!F=J z_-u-8pehK*kU#&wvMnP!JC4T~l?jcP!Gj2Sc-*tBDI^!kE%DmC`wt5qn`WZ%{2Hp8de^We)mnP5l4qN+M)i@lQX>8&Zxh56I+zu2=i z?^63si4bn4s9$bhfB)+tm;d6>s;DuwS-U+E6u%zzO3u2NRMuiX*VKAyw0Yv~mz{8H zjqTQ#{&}AKQ>`FW&ChM($%>U*Rv^B71-;fiN+;`)XL1@E1H1ixGF2Q=lw`F7l8f0S=3 zNvHj(c`vDpMTtp>@v#TIl(li6#%>9T4U>|}RcRO1;4Xfy)k{#dq7yWJQxS zG*2NelEuKS2Rqxrhwow*XE`6G3~g^EcNxKP6n}BnZ=Be7`{J1WR>S(z84m-Bswy3} z%rI$jfh+1a5lUv1a9*=FymE=RgS4#+5=yM%n+7F?dWEO7`B6pAgxkcVC3*kg~R{j?{>s%dY{uK=|RXS6GrqQ@*I^n(R?5*rQW zSzgAN%bF|Y<6Q}a5T4E4@Z1~D5pr3TU@n|{Xv|o7nom?pvVBUt*%q_Tcxv>V?azKB z_MNpnUgc`t%uf)Gax*b8!MfA^?>%4Z8Bi66gI@~T&2FXC5L-)7%pb6s+o2S8GV!po zva+Y_dx{e@E}G}o9K{sAH(n@yq*Ao5TzI?B(JA`FRukFOr_MUtjiwz_LsASvLPGo$ ze#}7Hm=h%`$;#k`K~1I_ih*MEh%FQCCBl1FwdDUz{E6ex1gmXHiS@x$c7ula#mvaH zX4Zvq*KvV_q+{N-khErt!Wi}}X7)X4dP;ees1CB(1FQ0YFfL(XERe?--%Q3VIc7lO z?uMEEOQPZ<^EuPk-j_v1MfO93gD!bYw-A(VyIm)~7Ny)=T<`4aBix#8$#vO;cU`A+ zlb2vY7W{F7*u!)A@?ziU5zqL&tl{DM^yx)f{eqpbn;Wr=j7;M)jBv234R>n9=}oEi zyE=slEIC?M^=J)MUcnvIE-xgVvSnj_%VofvMLGwsZ}cz zHiNm#g3TG6ZKhK2@P8=JpbBf^M`0r(50&1{VVCkKaWt6tyoGHouCRo&e776~zN*{)mj z65K6RQ}oRr+w7Jb>HFa_G&@&kEAl6@M!U3Joh9-4Q+fI6Mnq~7eV^ALh;?9Y>zBoR=`T27pBaVl zJoDprx%AgS=i=eHwR8f}m(i^wYUe|-$sw_SKV)K@wxeDp4Vc2Gz@%eo+r7DkxWrA? zaZ+%$u=t&nnwpya@{`EX(1#Bn&ivZ5+#j*nmB8QcDwe9tH0p#_N*8=}yg1%&WaM8P z8d!H)IBY48iHg!S)gop|RBZG7zRm+@A`BC9Jm5{*Y)zKJOe5Wbg!3=E7g-FsdU>PY zbjMcB*cO}DgubX3Tkw%r*rxN7M`eMqBo)W-HtaVAz`)EfyrT=azZ0xio=jqvdh>ya zhRKLcKUTuNWXVbI$~ffFf}NnoR|)|ec+8}fl-<97Glem+w~BclkN_aK!INZHxQ~N} zx0+^M1`2zGa$!)=9eio)sLoC)cz_nAWM6$xz2R1X`OBJwDAGp zbIYj^61}j}xAjIYE<_p5I?hAr!pukU-(hylD_Qn zsNK+xEVMvt*9OB&DM25p3I!^1V3Oz0n;L{e0@6w8cf(MPciGww{bg zpK37CGM4qoe6N^)>!J4Cw%d{xOQK)C8p|8b#$We!{La=5B5fDid@pdN2)=RQ>^APU zU5I-DBlRD5%=n^LPLFx(-^G;=>Y$Gl9U2_54Fn>V;e(^`At~=6&z~sywJi{tG;F6U zP$>lMx-Tz%7SAjk9N^MAG8-QLFfuwiSG7npdQC?`wwctpJR*?Fx+UnXRMaBd=Eb6R%c(%UW&y3fl{l=7nMOd^JVu zl_B1BPm+|eAf3St-pS$Mdp*~I8^Ui`9;8efhc4Fw1bxQr2webWI*FnGj)48*<=4Xz z37S&%yU}aQ^Ufn7aK*=t1hy$KllOR3(v*FBRc>mv+P1buYE4qst?#*y+XwlH-+w1X zH=7f%ovqnC($IB%P-i;_lS7*p?EGTtY>lVNbU&&Z85!M*kB^s+t)hD3ChF|yxSxuA z3IneTm0P|2{I2ce7*rT*n6ckF-f~ot5{ZuYj_+MK_Vw=<$&A&3aKmMUp>^rRUi5U{}~-xucJm zgk*v+7sc;T(EqS!ZEY>9Y-%e%Cx?zNU1@M+#9qYjQb-8#WonC*jI1+4?_cie8qLjV zA3Q&N3Y0#Z@2e#O)nrj}rjdpNN$f(7tFm~jLeaNJ4kv}950(2I_1ZlT%@DKJ$sTJ#jz zNbWtHHJ+P`Q7AC zZCw?w30>e2R!>-o{bybAq5RIBJBL3CNLk2Y3Vxd1g^Q1$r^X_M84wbJ&MQifpQ+PsWjbX`={}9I@1v@rtKR;PdJ1ryQ zvSVkVS-;JGscmX-cv#$sC>yIiNuv?2lk=Ih?b0ixr+)UmLybtu%6bYbH?`GR_21MM z>`>UMDny0`1_u2I3j6FYw1Z-#F9#1>E^mP6-$$V#r=~6#N*AQZkqOd>(sf^Oy-5$d zo-0sFzut-uXQ2=cv8bO*NlB4xU+PQL(6dDD@Y|1- zGdzkMyCQI(z2PUjK2tLIV*j2(J~DxuIJK96afkPoy^+pg_3j01L{I1HnU-+p zXn0+Mdk{{Hc52LcF9c^u%k<43KbS1b{7ArN`rUJmMzlKHHK=ewpfrW57uQ-t;T?h5 zjjD<}*RiP8K2(Tf3pQ-XPDsP+aXB7_(oMPIGb%V$%x!a|jPUE0=}yVP>|Lpa z#D7h&p8f3Jwc10iW!j~o0RgBPLXHnlT$CcNas|yq4e~w?8Z4?71)EiWsI06k6i6R> znXLFoTtp;%e}8|z%T6F27NlW0@UGkSp~TIhQeIx3#!Dq7s>@0um?Af2Ki_b#76?oX zwH#$1H0*|dKcCYDOV-czxVK;EQi^#ILBaRwNA7Bixnqq;GyZ4)-4lmlm&-kMwve+V zxCi){HEn1^0v8WY#Coc%=k!!4^!A`w!I)|5B^iIosXWzh#q`B-hT7t&L#xLiZTv_2=afyjV0md-wi>8{cv!(dH z?!-Z9R-INcVuFX0VkY|0snI8Ks|oMjkM3qUbSQ-^K|w*B{9^?#JPZ=*?~Oyr>2}1) zgK2jdEQ#2_iDXjz+VMvY9iUuRDy0jQg2lYm#pUBg8VcoXAnSGESn5CDo9n!%F^m6S zHyXLoE5)K#*c*Z{&rB?Ymuf>K>VUhP-|*c`AH+u%^RNUDIz>WoQufv05zRsgZnHKq z`Q_Tx)wKiv1}hdBC*QsV3ynOB8HYKXe)|#nbFkVI@R`!}D{pzMQ7oOdFoiF6l2Tan zk#F_(^%cXNvTr2qAlbtI19!eUpw4m&358`{&1Ci1)-NDy>~hmq*+sGUZtID9sjI;% zt+PyzsMoy-zM?{S57)=vzJ-lh@BtU8fc6s^8JRs}^YySr=WW`Mk@!frY3~Fdu_atS z>pDN$k`NLWJ}ZMZbm0kbWl1LCD1x=Oy_aw$Lj&kZxFaES0N81jP;y1v^^4RXjvNMS zx1QwW;X&%`?A#dP{`&`=W>N^eD}$@^BS_zTJ!v~>&60rb8dbJ+-m1s>Qp}XYMvWu+ z@EkknIVt}4lPjMw(iM&ZsiD?%ZOCOE6(3!q zUQ9|#dg_Ui1qlIwlYAsBbZBWqjId5B#S<0q2g3u?$*D_yc#C!mBJe%{{J&6E4&-JG zCeVN;OtltDf_RA`Rl$pSt9foa7lI~abcBQytW3P44ZMe5LpUlwjx$fktkiOq{yCx#rdh{ou zO7tQ{h(@>Mpmo#=-$;UUn>yxx8I+4D+nK7KQuX4qnjL`9Km*EgQ79$+D96UeKB}%- zzVx0wro|L*cUu6~Q9_pM$TlxJf4QpliS zM79UJ8Kx5&oa`(B8B7( zkg)Jc^r8A(T}b03Anjh#|0Y=cHq8AnpeS&qe#n&;uyd+Zv1!!lot`EQ!?d0(;YQiG zo1nS`gOSxF;TlY`idSznm-ooW#K%^}m^aveRHZb$NM-|2$tc`ikwPBZ-1_PpfsA;aGtZG>MffKmWIs zeI!FeL%I-)8UYZ5JgrmXTSsPb3|UY?F7lKMoqrN!<}#g&l^#8*vzb{1bn{@sYQp0- zU=iWyNxS-cXs9@+zI)43IQaN$s}Y>?`Kq3?9|#|dqb>8Zs-ge_@;V2s6Ye}Le5Y-9 z?MIFbl=H6nc^!_wBsvbLWleurV2bHW|MM}}ii7%a%J=3G;wQS=Tl`O>DTN*34AUI> z-lVJv^<7+DW0kt9Wq4UTU1TB_kOx;WKdx{(Tu_S$`|w8uW|0a8Jw3f=i=Ds=Vv&rS zON7MDuJ~c1xyGq<<<;FwLr<9+YaOo zg#w*3VFlO<`3ltRu}w5+LVd8tNfj-T?naP1pP zOn+KOL_{>+XALDVv&A_!)>7Y5Abs>y77kaiDmHAQ&ItWWBhcsd&%QksKad$YOfn%D z{&oH~33(JVp1=?~j5~KWQ%8I@ilNM3B&brrl`<}V{zP+bob&PoufyxB3w>}>#d!n; zPXxE!F0NF+Cj&S!Kn#DHt}=Zd?MYg{RPuh`ESKqPC@zJ=s2m9_8C|rojzcFp5r z`uJS3!ozRccYM$>p`qVu3VK}E<)x_G?qU>_bR+m&zg9Y&AvIp(Tj1JOa^ zo}%Plc0mq*?j*q_)_g8LzJ$U|Aq3RhZ>RtP{nz85YaLF$wZAgpwlyPqwQT6kuzP{54|$^-B=vvOB|8i@KI>98a%iM8|S$jHA=ly~6w!f}MPglBUXj_}HbI84JmOepabn6To{ zQW^y)YgOyS&}JbT*{AuBT8Xh!^m*4Tz}abd6s$Y#H`hxI0EAWp0s`hu^>b2X>)k#oLQ@4Fx7J>TGaJm}7Eg}Ny-^Swm(9n6k@)I-W^>lM{bLWv#?b5GR zY*0N!BY{SAWQuuL_}}>1%v7Pnp=_+T$?W^}i$MqhzmlZwY{*^@V|o99WUaQYbxFil zlaS9T7f0Last=2GqmDcP6m%m)LsVF`um4h%xgn_$L~P(d$B=jG;oydI z+@#LxrYmJ=l$lb@Gj%g4aB*>=ES=OtI{DH+FihmLg=QXvC{4^hT|cBiTEjH5@Ka9RbkOPuJVil(inuQkL@DO@a1#clhjO7Kjk#@eKX^4G7N@ z^3EjHjUujU)Chi5MrwhbO2>Yj-wBR=&I1NI&1_e}Ah_)H^z^)(cVF^Nb{@u0;mfvk zCzcy!2My8D(eWNI`wk$5!34^_ZSaL_$jPcrp=!R(qm(;ZoCGwoFsx@@m8x?VPgp_GdlrWV6#<|o7Ikv4w9iO;+cq^5jS0uOoZ-E z)6NN;ZP39Y?{YMtAR&5GfkJ#5n_Q6^*#8`lP07#=MeiHG5*z7)6$8Es(DY+r%}{MB zSthW*o^RhUfvNjl8#BLaY1!ULx1R*d<7%$nzVCQ@4gmIk$8CHACnuhzj9zr^odMsI zh4)W(TL|Iw!j=`5hvm2zN(aRX(AURiSod;&%To0Lej)@Vkd62x(@$LKE*2I{OW)*j zLmgYgcN}B;?AdfkL*ewn(ls7{jD!?97hAnyGg(Ei`RG^=MQ~dbjzLoJ%#29xr_Fa- zOz3GLGVk#^U3HNZ9SWH68)S6bR;Oi5Jt$2ce9_f{NXmTF!a{RbkF;rJB~L%Y{)W>C;OU zkEhD@v*PVR!0qT?JtBUPq=Lst31&CIh@P>mYnSP|1-$3%Jwzi3D z+Qp%$y+36iQ79cp!}6`av$c2OjGb*o9q`d<6UiY~HIqliu3(^Y6g+az#GE4M2WvhOZXkd3K##J^9Mz za|QtWkkVUadZ>VZr$B4oh{<5pw5yUt`q!6|NpdI_L6hVXmn-=9`u6$PozAwkw|QDWYL){(F%%< zjTL1#8#bMD+d)r5Sm4B{2=xZ>jg&s?88Y$%Dec#8)51=%((FOyUW!xWd}dbGjbR*v z2AQ91-7YtPnxMwe9lKLTc~puW`PgEk&~(zsd{V^+ykZ;9xVv!iGe@R8n6L0!Y>jNBqgemSO2=z6AL)_6G`P@*?7TAN5@vsX;?{yX zyG}F$Iv8sPJXz4IZbAJPr1m>C1TtGQXZu1)DM!875ZHLbMw+$50DJv1(tKgAWqqFi z(|`bNe%=_^+CffM&x~6S>E!2`!7Ji{TwL46Q=iCe_~Di1&LB`Xg}d0TiL|?MIJm!$ z>CE+z=tt@{yRGk3Vc~=PolMk1)c*$Et|w00dsrAGIw)gMK^v14NXX6f-E?1Wx`<>! z6N^o_4@H|~IwT}Sl=XfeH)vPR$JtUVQP~u`-!Y9wtyx%ljr<34HB4D{tBCfBg%JGl z&idl$#VLvlz$ENFef7p!8cz4#9v5JcL%z%$UXl+=p$ulf5xqat z%Z)5lf4P!!bR##D+x9HK`4I}tqe(;-?1Fz)Gd8g1;3gSEGe;uig2KW|$2EDB4*D3; zKqw?eW@Z@R5~#7PfF9iivRTNk-$^rULWj0jZ|iKha{`e4o+m%aBKp(ldRtulPP6L0AU8>EW>-Jak|a7`7qi4ESa;` z_QF2=bud-m*|Q?GbK8fr27FG<3!w;4&1N@t;0a({#cXa`5}vGQ#};wJFc_#T;0OZz zA2K7vm$>8-u$vD9iQ!kk9cqsdgr|NbwhUXi#f_7Dlje73#DK&rA-BG2ph3F)1Jj4Qn|I`!iEa4lhfaYPBGVpTU_b$!U254XYqs;%L3daI z@K4+9ew4irWHGk8)|2(4D=WF@p`&^%2i!Su(W2}Va{2|C zgbvWVqSTAg>CiII2F;D&e@5a!Kr{DBQ63n%wwmq4FCw+-Wj`8oB+uqi9pST({xajW-$pL>r_gT!MX zbhCS_AA7wf4V5UY9WJVBcHiwC{`3T?m%(9|QvBe$HEHPJ;Gke1XoScxGBX7j!bt`N zxM8y(9WoZ4IFbXJJZq!>yjm~)2dc!qKw4iq5iPHBMkw1Xwg}_nMxg6rJmb~+1a@=Y zMekeQ#rOLnO51@_6G{yhlkjzIl-*{LNHw$JX!31(#-Z^*-+vD-utDAi^M1}}2_Gor zLZRq7vnROJZH>J~XVs{RN}q0=@XJ$lxtHDcTQPW9#@VM08m-U2^qxmn- zZQ_kb|H&p;OUoQl($Mq)L5E&|5oAU25+qhAAdDo_Jw0+Mj5MG{DPYhM)=(8BzjGYJ zp}&s;*v%QQ9*YwxrLgKnt|L3!_FO#z;q&KpR``2ruirhbdb?3_v*rP0DR&$0y`X=A zvBae~YlCTwg+r%c9d(DshX5(2fL$Vl0B-Os&gEbib}LfMgFiguN0&45#y022?do0Q z7`lb~zJ9%hM=A7KTJY$VIS+0L0{n~{G^nWq$<6mcXc@MxUj+nD= zrvj1WD>CK*UJc;&d62-T+x;Z~Z*zhB2sp|ZXf9OifJt(Y!m=DMDvbN^kX#8rUCG2L zO*%~M4nB2@K=fKVRo_gNitx6Tt6#QX?(7=psKG+aWH_!02 z5ytBCP?0AcI^;`gXJV6kCk!cr-x1lo#yEzg$d9z=+wNE(&(d?mMVE^3tXD6dFt;cL zqxmClYK~5)tH>ux6Tt@Qds$rH`*aFbR5x@sb_<@X#TFV>++RB3h9~&p0~YD(%o+>I z@ENY`zgj5V!yLCHk+PeT;6gBkeak(htp(@TVTgaq0B|Wt&0xW54CBo;IMO5g0X(L^ zGu3yzkN@^J4+1|!c5tLI^6%fjPob}>pw%1sUgZGzu+C#TZ`x`iiHVF{hR9OG)$trC zIeT%*Eojggl&NzePVsB<4F1zc)s4UHUafdjuH3x5L7-u-E3pp-3D&3*K1qEKcXaDe z4WPE@Rw)34B@OlT>KTU}|80DnsAf_KA_1UF*GvM;^IWW(+FAjJwKv?hOpQfW7MMgI zq?rzx68wd!U)dyR&36>sjoN(mZ(-L@urLrD^croroW=;>v$hG)SCAd7_xY`(4JDZv zTFj*EGjNbkn+R4_M-E@HBv!z}%*T<|&w6mk?+v-8WdYZalm%oq-RdpacG|-!51WM( zPS}z_wx&v01a-`r9~giQCyU-E>7*jj#sCKa@pJY5*mk2yJm5t)#3e*1*mV56EsS5cgI@3HI`U{`G;N9w-)V zb!sfW(#&!h&hYrwAU@Iq_$DiF0J#f5nK{thfGFMY+8%hSEtY|F88%C8V*XsyAxW|$C13iGPc?aui2#RjWP&OH^?ufd zB*Yo+vKj+gYWsI*NPgFY z(M~pYM4thNOlok_Tfcs;bqVtCrtPW3F88*8^RBd<{#W9 zPXAhNM8Q*i=Y`jdPW`<-qi+_!*z;Cp6hA;I_5?Gs%^g~<|LJlNelIHv#`&PR_@TdD z!%FB8e8Z#)bb!0scvK?6NN)q#xWU&1TTvV^$hzw^03TrzNo&AkA;`WgbaQ#g{p3jm zvgv7CBOfAIA-iy)i6mWze8_hG(_PLM2S+QbKkZ^r-1Yf&-$ZViYpc+R`<$wr`Mr*w zv#PCt*Z#ZMO3}8Pr&oRl9FR`o8+EW4^mKGujDf2KSQ?wMX(Sb#_d--`ccIF3U>E>5 zS8oO2BG7>V#3xi$4lqVB27l{9d7W(-JX3?eb>xLHElq%ibUERtWSH|m^dwt&#cy$J zct%;%^i}TXB28;R``|&sXcpLRsUnwmgb_Ek5WRR?kYw!WIGUh|+)OvMF8oE=bQ zB3$8Bdm7F{aW&P(d)jU@#@MPBIZ`5X8%Vr#1n^VOA7JjH=3k0eXs*d5e5vAuTB8%! zz*+u)6&st=Kt6mUgD(~w8+#8@F}b4_9aSas)x3$>a+KNA&n6oN?Cx~eLJyXg(Xe-}=!ieF|3?f(ZcAq`}njUJdh+&Dpo10g$?emi}@ z`An`y)kj@kD?MBx{=t@8Ghh&;{tM)c9$B{XU;6%e?OxJE_wBv-zZ{9S>+>x^kdZc` zplm=xlP;e43I-u&} zYunMZJ|seBEab5K&JyL%T{KSs8 z5XKyPwTjB}L>U46+|Vzdu%dZ;9T`=>r#Zx5)r51}w)-~8l?|sW3d6ugARWm~Kv}ez z>xC712L}!*4hU1LGK_Hb{zT1z+R(^c5O)EVHg^hVyc@?Jp}6(W*xuWkWet({co&~T z*5m8fK)d?6dh1eq{H{IQB-2(0u$5>a;&y7$E86owLni=Gm60>in8GZR*&2F^H#g~v zjY=tNB;`S#BoogxF@elCp9ceD~<10^)1<=m7OX*My*7S`0(B zi2iBxue(yR4L8>p&T`A1)JR|s^z%KuOOu-U198uS!_vkaP}VMc@%>M`5LW=czohFq zLzKx=>e~TERzZwBSS5IUW0*)><@if18Dny&KnAbp}+kN4;jl-#Ter}y+Lh4>QtzP=ui)73c z@UT0yHHk4zzqLe2P5%CoBU*1qc`V^F3naG2bQjWC- zj4kPF6yglPVTaQr1nH)>(e6=sEMPXDp17}e1l&eCyp@D{Z9$OTOrs31|N!p!RttFA^p~ZB1$2ri=0E?&(Vw8l7?g@OCi0)Ys z%_R!t;GVee@JXKLeN&WIk32D*oHw8Xjt&wWCIql{A-;STZ|`@Qu76qCd}|40r2}M2 zffG$?4}MDwbmDz39RHrfmV0w`kcvLYZ~=2K;PxGGCn|g|jzx#LYxL+p&vY%m{pCyI zT?4WR>=_81L%ILdu=n+@zqy&&hCK}s@r(tNgm6m}%by}41$2UNJ9`7-rT$(R>OuTErN6c5udCl|v5-u~WSp16cV9@ME@*R5c! z2|`!@q}*3ic0RdXzjQ5q8-u)NT4xLDr^Byrv7(pX(3(lmIv2p7jo#ec(sIgQpZ~OcqtdkXmk_O@dY5dj)B_A5gkYvMas}w2&3P<~;6Vj)H z#e^aWC>g}H=1l-F*F$T4F}wUGNe?Sbd01okZMuRVLh&m=EKGqne_%ss2By-QCq#qp z0tX-FMqlHhcvZS!m#4#l2+^c6rj2KqYQc7v0D05pYI%A2P7J($8mI5(^RV1+F3rPRt?<@Yz|Nq zuK;$xa&-f8S@EO>y9;S3Q*ar~{QJjuesvvWwlZYKmDW7HX%0mg?Dc}X`%CsSRqM%+ z|4)Pu?b$`}TFF%PWvYAze08}}vcBJ0)VA9b^X3On-9A}5eN+$w>L7ZJ-Q}r0j!$rPJ%}vG0e;zF;CGFrncf-Vbh^d0cdG8gOT#5=BmD~y*$8uoM*T_NIMMuK~>sQFJJ_ z)GWGt*e3eq$z4FViCp zh@=q>Ge?u{c*sS>76+`F6eo{T+_i>Zr^bQ~ z<>3jCNQO8~o%)ZrWn5d%Vk7tD`$Xh(UNMdG`F+TN5M0t6uBOXw_(MHg8Y2R-PB$?(@(xiG9(cr&E@nLr8 zl;cUgoPadOlmn&UFQ>+|aVyt|P6Mu*y1MUFz6^!B!rsPds`f_{Ky|45&8p#EbRyr# zVcZ)R-qftOeIExv#PH z?CXs5q+*7O4^JB7t#SWgR~<5i2YQI&aU?%~80sUA50|w#6+@&AHN><0g+3|o5}`@S z=BYK-*6LtK#Jl`XkCBsP$m(fF4;>4UMlDfi1@<8U8UJC7cgG&0eu@1iRoR4lmzOQ$ zc-;eZ=|hT#*cMvRhI|861bFZBZJ%nYbxD<-d-u`6S1xe3FWvax|Im%4md%mbW>drX zQap=J|5t!)Sdpyn_!(;YkQ)k$_NAZ1W6WD1Bp+gj1V;53QOc>bz_O~dJdo6Q7-{$G zb*%s4kR;gYiYOhoQT94|qbQy*hd05LHcx)?A=ygJ3{13J@q9`n#cKbt)TRA!#BetC ze1cxwb-G@$8e^EPUQC6|o!Kw8q$W0>e!C;Y<<#LuuRgvmoi!%hw3_hXyX=;*-O%pI zQlzloRfm_4_|hwLbHqpOQaxOh+r$y3TD98wTS=3ur&_y2r}VMkBuscxNnTy5mZ~E^ z|9z|Yezi*N(j^c(GH5aHph*d3jv!c14;~sCS;TO%9s5^$Fi6Nc^`-Y5zd5)`KrE70 zn)0ODg6cR|HfmA!OK2xjItQiGU@yu%%lDY1$7o;BuKr0>*4?}u`SkZcs;RdgXtII4 z8@KS5-T*V|4um3hA#~6TYAQs7-WL`YW{s>nC2ee&J!6c|9<|8M&zEDF49~>`<`ReX zl#4WBv09T&os5dgmzx071De&?#Q3<$SMylK{DQ-?OMf7Pmn(#il|OT<#$G68;0dAq zQ)m6{@UMaT4IZqi;ke*8EUm@pZgX3nROMKM_N@uyUAM+xrS*$m-&dbsR(LRx?AE<) zk#Hz_@aDAQ*Ins#JIMnQ|Y)<<|o#QIDImYnZsZEzUpwh4hmW;KM63ZEiX_$nzN~)D-@WbwF_(UHVlAXD0 zi#8tHC5IT9ULQ^AC*x5OJCv$#v8WLBXtKGf63JD}*c4JaojLb~FpwIWRBJhieEKmq zM*pCsLeX9zox*Nb>V6zW-DaKs zjkx%9_`A}}QPi!443b9ocP)00PFg=cm5RXCBe4(fWnQ>Zy+un)dzux|&V=6Zw`xFu zIZ^Q>{-yX?f)52Y-n_x}dqL8s!|Xz;jZdVRMi0(ENmHvDqCJcez5dDGb2Ii%FdQ7V zUn4>ioS1I5r46_xC%Pt#hfe(Sb}o`#S=|Irdm{8Td_2vCl3w^F}YRkM8nBe37{D zh6_JZ91(i+$*`{XR}8jrWYj6Ii{i@w?k{~F+q{MZ9^P$9+^9F8Siyy^xYrj;VJM60 zXbxStf<9G+g@{7xn5RV(Rsm}bF@WaTk!Qm!QPK6jvmmgWb;d9Mz8V!}o$*w^@!yAp z>`L}tSs@7_duETU>};~Koy<5PWM_xpF%m*nHpw_ecCxavvXdG2=iHC(C-<}a!TtB_ z_j>iK<9x60b-h3Db*%*8@GXD$fw*F`#deVIhIQ({%?ia3zMl??IhV;k{9Ix`>E*n3 zMNNt=W?}E&DUcyvUS2->`q#}u{vEszJXjyk14AMhU)OKM6oeb2dmi`{t~Z&L-t;?7 zy)Z11N}+#SP-!ii6*(|4ppDIt(C6gj%&DUFhOn_OJVfi)YFApZ<7Vn^zVJ3(B9Gl} z>N#N{ArEaAm$J@HU-hxT%%T~H)l5`2@AaR^vaq}vy2(UH30-WarIF9Yf(w0Pq@I6@ zsqeGJEgs>y@o8tS!=tUjLvqBep59ErsJLr>^&R!3v@tiO+n}wmpNmK)!M%9Ce5vb} zzegBXy9pM(BkyEert{U!YJOt9xUlggY$Eus0{D4YNSiGY0Xw!y{Gy@zR2`{X%Yh*v z0;`%yICW^51C|m`!TX3xG+Qbx+!JNJCg#le{#ru6ib!N?rJX{!?6vpC{6D=KMd!Cv zK`)3_E}T>4xV8d^WEl=ijMq$?k|I}L(WmVTi&uX_P@~$?9mhuOp$Q>pi)G+^2oHh{ zA+*TJ$pgpSk0(X~{G+qb8+%UMrQTetLlK6@!YtjP721p+n$L+4IYzcRwwyGXmKrc= zqV(vkkqoVYTs zp=yu5@en75F(gU<8JSiTLEq}om zN8SW@b21_)?SY@B%2E7wJ?ECB-sIJ$uuaJRXKiUIOK+Th$Hb( zygD7vQ6x{YgfqV6HBR%}3&QDCUakNU4#o7@4gcJW=4oO25Di2-b2YVJZ{a*@#w~sL zxguK?KMhGM9Ap>fWn;k)^L0GpTKR&v0xMdIOv|-?>tr;HQ!0_Srfg`b#|nmN?a3_?zi7 z;6`-#shHC*p2c>vt2V>+CZlt67gO=^@xBPhJ6T`tbF>IDH1L7X7Rej5jHn@P2qf(a z_`?U&Tl;?V^;)>Jgy~u|-iHq#0Ft^2P!cVyrMcqc;yBIXBK|{*_=h1vm-a&suB1d1 zx*^za0&sz?`L}PAe5rv&wpQ^Nysds{JvHIC0cBkYwgO^w9dutTFZs~cDT?~Xdn6fB z;Psg|6c%2hBneIWg_OS70UxXQNiIcu%niO0h(TFiLL|MT-i(9K zGrM}zx%P+K=zUDf!F&Jb){=i8-sX68#%A+k^2ZN}56ELL7+(>&E0y!&TNr=`?cdA= zJW7q4cyuW{HhnK;nh2AyH`4G>#-uZn^@xekeTAO2Ze^5qYm|Dafg2oSK^xE3#gufX z?}&>21^xeS+#Eq+PN4LRkwCf=V(0bOU(}gdSu*-%V@!(lf*$h(J1jg`F1)(+aYNt;Xa$IT1{2JV#uYF#6dQ6=W&!pg z0B#yEyQ8yn5<^x}-_jUZax2pxpb6ej2>RK59*7070@F#~%6_{L$?LE7PT{)wI$uo6 z#~aaPu*)0?Ex`Q?INsEw@~UBa|2q zHy>6ZU*2GPTHxP1ckT>3`*P63%uI^vvVf+zMGtXs_x9QfCz;WV7&M=KOC)f3_+FZ0 zPXC2H%dK0tLekFrl*~(TI-W5c<=SlaEPFjGZfc_cN7p6}j^}Q0#eRg;;cNd1JaC!& zZ^6v`V`^%O(}yt-Ll7ai3hynfL1y^v=mxkJ(_axA2sxyjR^%%qJ@H_)3$uRBYWB8I z=w-ypF*)>QGsf2US|##leQgyH7OtLI+2_Hc7&8F{777IT;k1gc^HX8Yy&BKxX8U7P zJ&*h*+=X*Gtd0U49Byv8CS48R5{%}gokIb8OGou@R*lC(1?|4B zr3T@D|N5G4J*&6rCc=8=UKAYl_NVfp9pCG!6dUk{_1Wr)h>3+%H#MDF#&j2y>u_g7 z=V1bI_)eU^lmO3_D&nxKteN$rd6@CPfB&8a1qP-~xrzcji1e1&yqonELyF(kt2f9< zfYIsvz3cy`zW%Vtx%T9KW>Fq7s>@P~EBWTo{?&Q~lXAn-i0}w!uZ*TIyAR${vzqjU zbvvKAl^lH%@vhpvsmvi>4^jU1HSb&;#C9&iOkg6wuyZ6m?k2b76JM2D4L z@ctt8=c%`DGw(orS}D>iUD2(H<1OhHECA9EDJ}EdvRb;u$66qLDol~hQc8FGnpAJ~ zZw;>G0B?Ky&k@HGfycX2GJ`@dIXa%CSlXxpUTkv{p-a#I&j`{k5;^#AHqLAEkau{} zUCTkOZz+`xuYJ%(>)p`lip#q(`Oka)<~rQjjV>*{0&;r0qlnuBu4FObzSrSR@;!b5 z&NK$lpxj@^#nsZqDFcc99O6l`5;^BspLOeRZ;9f(o>!*zjFkZgle%n%3w$Zw^ zwS|$Cltk0lxy9@?!Mi-{crMFCny;YOV)X>JntF(dI)f^mzBSt-xwBqYIs4)+34^ji zI>(=I*@Dmeq4wqC6p=&ng%Sj<>@;=@HQjMaQiJL)7}$tJoMN{0H8nN)5LVkwT%mn^ zeN7Bx1S7-4dxKJg^k77gqwE$73=9mu7Olu62|2CQhIU!$v(T)^>kn<=0##`ULJbyh zzs)LIyGAuYg<4Q$6Va^iz5f%&X_y)11=24S4*B;7%i2E5(W)=jE6t{jRtz@gg_|Rf zk%5InH2naHMnwJ*XNNy}myzzryk6EOz2q%njYKloRMD9E&qrck7*M-SZp100Tao6x z&5fqzv(sZ^2dy6&XrN-?&*5QZW^V5J-7cZ@`M6jm(PO3-bf}VHI_5Hd1P*+5QOHBi zvJ!Tl0nggGFp-&gG2tGCxV0TPmfcUsv{+I+pJTzXc`J7NHV&MWz{@7WI@+?SA`EV0 z1|5P8e9G(NV#LD1I#fAvS_SmA8Du9oBELe9R>RBjCsoGR4*vAKnb;W2cM8nW zDlU88H6H|2$yeuEi#o`9{qL#^wU6>#%EEmGxPNcK7y;?vOBCw^8a#B#mY(Kq)os7=4`$-{qn+GAYEoAbJtar?`ucz zCg!pnqHu`&)}Y)B2J9ceF%|M`(r&Af{)Abj47dHC*sTAeR!l)fLeHXPuK&Un9;EY= zC(nK?d$o|CZX7LpxTY0wD_L63K_>GO^IHR6K$>nN&b4#!EYe8WsASGgz6NGnzb5^D zAIxz3;^_hoN{y)C88<%gQOdBz6a+&zS`}1PJFWPOG?yL2Q63Rtbx#4+2?pwA2@CkA!V_ zqnx5=+)yw|*h7|~ed9pB%9sJr#mED+a12kU-jWe{J~KIf#N5Y)7(R}y4{2#s{t!RL zT4yKcJzo0w`i2j#1P$9%nLWpYG06zkHLqPdwr&~KHNUN;sYwe&C|-mdByg^PaC??4 zpZ{7>ta#)Z{%^WbF&6Wojw? zhP?cqEbKF%Pjx<9Vy`C9-^4IB$YmCVn3WqcgQXt4+?P`yVCw@y3b@w~x3A!^1pg^y z{)%Xqxplq*a>y58cn*JJLRlrN9pDQIgzIf&j*!wI)rG@=ucEI%q6^Pc=H5M?hk?t- z+B1%}{&2EJbla2?g?ogEX8pS{D@+rJ>AH#RUA?C=A_7O*;TvrRCQ#)-jvtldl4NhV|wdk%0PEt z!Md2x-R}V1yaz}KQE!k`$bg*b_m=o~18mU=iwzDyeJOqf+zJ~Xa7h-WI^5?oi@Vd{ zX$-TbAw+dydylMW@WDmQP8GX+xHl7E?9#E)`>KFp! z&-|gG;}=qz88@`)Ui@jPav_g3{fRgGhXy&?xi#2brYwRsYfqE<{;O#{`}?ZTHgjH_ zEWCrozs17oAziD!@nND0t$$6ShYz7z#StJccYrRV4I;u%Bf~PE$1W}#+!CYxe7Qafu`9`aOXG@cyC%AnmP!v9 zGUMR>`G6AZo3dMC4x(8dYu}*++`kW{rEB=p=AqT#eEFB?Ez$DD zN=Ur zy+TFY2X%^X1UI*WbhFjC!UTZKy{N72Vz6`eWN##fJ0=ffUnA%wl6mK={nKsGeF5R^ zuX}%dl$n_s93LyAV;?u>B=t!&YxA-kMFngyCVwPf)r+Km47e8`F*|Dk+v0Z6pCOgX zDUf(bA!J|<3sUB#B3pfJU7Z(K@)bA$DTyw}4z5JlVbbJ;Xz*eRV)!xAdV?q#=4eIf zgw|`0#xcZ?(%BFqk#Y&4C#>hSrse00z)HJ;LcHQHl}lb|{^aTS-ruNvtn67y8l`_UtMtO3~rqNkuFk2wfuup%5) z;l|x3Q==mz`{iS0MhfMI5tEaXr#L_Nw|Q`SPy4^;UWt_d>DyFq;XR}@5Fbwl67IB{ zm>HC(AP_~eEIUEEloRmO@S;3a5kBm3GF-`hGBz|^%z~*w{g3Gh`O4rRqfR!%;;npc zXU-q5AMsNWM#>ZK`k!sVTUi4jC}}zY(N$wp)eBws8?cyMnr3EgMCfGXbVtd)V5%O( z64OFe1e~Ci-HW@om=cN!CZ2+pvEwggAkJ|9Kp_1z=-n(hV}N~prOJ^eMR<_&qV1ZJ zZgQV(FcOmKV3j(Qso_7>%+WIX%#AOj-!hxz?Bo;%;}zf!9N0Ht=mk08zno~;V|LcG zL+F_Nf8yAee!NsCUN*L#9N2QM_T?TV=XhG2IE2nB0AvL?DWmfTVB%a(0m)ajqz+WE*rt!qELAiqK$$($$zHLZ|j4^*&1W+cE zz;nt&WtHR|x8NknZBbmRb(p82H(-mKl1L0xxO=hPorK{YeB%|MhPI4W+j@QSsGmM<#=Wv7{@%{nS4{vSv0}WgNE$`4;SaB zI9WYseYSGf(-j!Ab*>UUdGZ8X5aBZyxSEejf~RifhN?4wx(CAwv&I%6j^SSw$r+!V zyiz~yMU32ZvD^pG>UKPAQd!@K&4aI7*D}R1?)b|2F;Dx)2$Edu{PyjYS9i<}ZONR0 zCuFEg9&L<26d&@Yj_Z~FQHYekT{h&H+eL{-Z0*PtCWCz)R`!p#Gc=0yrA~I0HU7~aI`Po#VU-_ zhh>k9L>cM0B{%ZHU_*A&=h34qT!h>1>A!?ssWzCU&-qW1l9^45=}GW^idRSgVh;~G zUrJkoq9ZQ4IIX!z z%(#4f?lA{PUhFG(j?NSu_H|hn#In~tnEdAf&FVGXPJM8f!~vTE)RfNK#;u$n7Dy*9 z|4ahnVBY0W_qLU*h`;Z6V#2|agu&K5G=nFMQb|r*JHea&7%6T0;}uNKcZ}$ejk~Y% zpHNb1>UcwZTHEBiwGa)6Ue7wMgj~Biqo+3UYbN;{@h8$bWvh%yMD+?MH+}o;2-FBe zxC1`1`VDlX3uI_`xr32q;@d9aWqnmG{{{~sXP&zZft~Yd%(*Kel?J?VG_2MGaW0iq z<+yFCWn&g~&{vcIuU*-$iA@$a1)=QBE%BLEM1Q*W!Z(U@GOx)>BwCc0a=C0$D5XM> zsu3o&nXdgabCND8*k|3xHx5!^NPUH;>&Z(PE@J+ohT=dA0g*xA@2o&g8mDtB{yfK2 z-sgGq64A>g*1tBmCDa#b8DD=13c#SIsOt@Faw-pb#}G=oQWoAvva)GpY#|7FR1WBr;HWY; zBT1>pyuT@sb;}rv_*AOi*a&C5X>6p$lk@inYs|*CZ{K=u=d|-kM06l5Dyg5HA8JS}eZWe)MTD zQpxyBX_ZaCL^?L3PwY9Z6ln4JRDg*!yty5bfcWd%>R_B2{Y7M*Gs~n-@GZVSQ z8D<-Ol`iSF;YQW3ut;5RM=CtI{+6!!_ufsS>$ujv7NrKk;BG6bPzeLaK(3j-%HQ^(J3NG_yWxpQYkjFs1r1BYc0@;$z2+qJ*f%FY5gAAz;|P<;gYHFiF>>b+9=(V9XCvw?&|~KH}Xwu=Ks?S)|6g08eKRrB}DNQGI=C zaQ1y0ALn{_4p7}RqGLzD`6~5BzHVY90rWudfHCF5*~O*l*0pF72;c23CaNxpq4lmn z2Z{*89ZAWc$B!OOeay|xWg@B6sj;-QO@b1;MrDQDM|+qqVSbVRNG*SwrRSln{ImVS ztXDw)*7s^fM@vrOaO$2JIpm?UwhrM7>i5}Kd>%6gpL|wGBRND;kR1^5F~yr@VL;6`S?)Z+BUXWnw=2e$E ztUUUtSds$JdX1Z4@I=9Zn+k9T+7CVfZ$gzP_P~D^I-l>^&$T|QheC@cqYAT9m1PbD z@?qhSl#OWCpfC+d5_iScn!hV}TuwmGXP}{ZrT6xv_w**5irT;jdI2m)ApBsMg;3t0 znCGse`H0?_qsYy)x16w7zzeyvhY?iIdIb&_DbKKXGr8R_Rwg^wA^>9vr~Q$ z4ESvWgM$-knHuutbr5Ed$Qg)(1#(UQ1St(qb=cxQtcEIMSN16AnvfSyVJ|EC0jwq2 zDYA8-u1?gr(Tfx0xICu&f!;8XGW_wEO1h9lEJ4{~rB?As<>BAIZ#B8D|EI^JX3a?` zPch{gXMxvzysMnj^sC?fN%nBEu@xWUc!x>^txW!2 z2fpVp_u1dcrx;Xvj*%k!oJu^4hO--WUa{yXWwyt%bC06=R7MhwWkW<%1@AzyMAs!9Y2J9FT?zko4~ zcIw&QAD7_ZS+^?V6l~cgJPFtyfO2++8)n+@L!CbO_B^ywuT80${H+cW8FPJXK?&Z` zAnA}#r_|YMVS>H3Is#%C*7|T@7f--+b%-C4&rU%YYEdZ@1z zc_vd669fpvyoYg8rwtCe^>_Z@_MznI>1lG@p4D%j3C?(Ciz*u>2S301|5%!#8{%Nz z<0#rnsG-%c>{hRuqp$B@4`73MGBnN~gYpxSuk&W-mj?7;$mf6apiyaUeNe&ts*S^c zV}Z0?=;g4L&@|{p!38?pyfkkm7~%zM;T&l-=8uV#pT`^AmxPxIPRjSO^}_=3h%fg0 z8IYy)3jq$mXGEk0MqgPeCRA}=@Ci8>7-1I8%>Hk^v4kV3b5zaViw?%)R~lUCIC*v2 zs{TTjfJ_6+>*uvk2k#%&K)Bi>zolj7wN~-&C$%u}h#~B*-QFbO^kMM)u z6(gMzXuJ#F^bp@F7aVjwTCgD|TZWCuBoVVLeGe|R6@)&ay7{_gC?bN1M9K5}KLAzZ zuy8QT0Ard;3kx5s7#UF)@r_kfRGcd0f7@L1&g|mRymvMKk0?`uLY1+i4_YJufBKu8Kq)D8kEbA2Z1+2}2LgH2CEL-+ z$u;kAV0oY>4B}wMo51zA3DCu9EsAoa{8-$}Q1(CD?O|?SN>Y!fA;BldRMV!}jled2 zohWkHeG>o6vX@N0(}{u)CpDbNvcQ==1hRn<2I+s_)CF5o%#cDm#2^|F16c`c8CP?J zWv(O%v&@p*2V!U#xF5Ph0?O!jASmGKv|QiB0-vbyl4#&D)%W&{c46?nLr*p87>$~;F3^U8FY zMXXE-LEJHcU*zT7I6T2APZETOT2_+BIK-E>Pn?iZ1vLT~Z;{$m2a?!*Wy3Lm2XY}H7sVe;H>p7| zvjY6EtiwH8ro(*(Bn5W+X@?j>1I(Ipin^4scc{FAYP)r7&L$_69**gidLOQ?mbAey z3B76o$$cD8E~N$GjS^39!lJrp?wbD&=~(i!qaGQuf9ShXZ#(2XAo5$v7PmkQ&mBmg z85lfIsgy{-6_<}jUj{xg0&JC`_ue8gyjx?jifm&bdDF^K@W#2Z2UL}B>9#f1);?TM z_-H23J~#nS1?X&Mz+Wq#3^!|=U)|C#rBr0QswVeBP_2+2h7EO_8_1#eoe73E2Zp0c zlu9iPb{ML`xqmZrSOOeINswuV560(}h8zvBExx6isJkzUinuN#&dgzC;r&&xC!Ye( zA3{x^ws8AnJ@L=_`6>zQg}o0Mrec znP)5I(xWJ$a=17b*3Rc;$qn6kl*L7d6$Mcw?(;5d;1|(=^F12PiYaxfB)ud^6`}ju zTOzKoH>m1!=%!^e0tkjHU|hJIyOIG>Y9lPdH@=gh@xjdo7uF4sWDqL}mCp}_1}-?S z@3)T5CBz!O(iw^>KcA$8St>C51Bj&BU~q4P-}nZf;me$m^W!NoC@NM10}}c9tiSQ@ z`@$!=&8^SzLK|DUZH_GfK9lKE9(y(NYYy6UFcj+n#(7g-z9|VHf+|Pr@HtSz4QG3p z?G`wjZ)`hLwcAwrn+Z@;#wx+D@;xF2ISsn@6C)tNeii2iuHR@3Q!=mMeo^4>2L$@n zc(O$yGODub$=@Ncn<#L9bEG_f{GEdkS3_I-!p+L+=OT2+>6s%g?kDtM^%aU}#b4K> zpL?_0R5I9gH87K>8;Ri7ZFuaF=7j3J4)1Q&D@}ntIHS6z<~r0SbZj49Qqq+`>rI*n zq!+_=mfJA<8Ue@!?OO+`s9C9EJ0MbJ4SmWfc9U5!V(`TlGLJHT6Jh)`X4CM5`jI>Q zqwSv4)sV7dZaMyyHBm5H>xSl1BB4||aGP$}U4#6rJ`9Rr3x+D1J!SYxzA9tHmu`d{ zGs$U`K_kdL?C!M>G&2EkJ6NT0_{Z27r_yEkFJR=|MytSNvW6Q_cJIXrGTI;gKCKa91Hp=wlBi>PdU}K(L*(B8WT+6yQx%DvU?BJ)uGVm$T7&C4 z3@<1p-FE_<1j>5dC*iN!{9Zp(;G)CfcYlM-d{R=tiJDf6J?p z!Pqr20cFuz{va3!e}!~rK7?D zQz9%@0#Ndvfru&|pS;ew>yNBdE;?wU*V+hm*qLNS> zFhGUdO>RRd_Uv^5H`rB~;A24=j1>?LmTzzokC((wrWIq(S6})r-LgIY(!U@=sSgFn z{N~LhU8?8tsyZd8QUl(+nn_m!6%_&@l1s29nVOou(JM833cXoSdDF_4j#-}T6ZuI# zi`@S@2L=IbGzC4L3LZ677Y>k;X@Zs&(lGLOO+a`3%SqSZ+6wj0ohcB>g@)0~kUN5^ zkoTx)t}8TAVkcK$(d-BTu!O+GC^3*(Q_wHP5mDFsxI@5;GE$6ENli=(WZNIA z;$3R2;H;7#>N0> znMx{nqsWFcu}w_o)2HAMRg^aR5&^qwj2$@=?V$eBalVqi|!Sr*}Cx zMkW~?L5YyZ8an+!qP!H7c8^U}7fDxk!A#E-347{DhWSE%-?A4(9sgZT?)!tSNrZ`y z_6}K89OR&Q2s=p=RXNxXvr_IMEHR$bewth(4&d6qqd9_&H21;&W5q5Q)6KrN7ZJ4` z+p`z|V*|j!kO%oX{!2XaY>5qHFxa%Yx=!coB=pg7Nz0r$D#@%!$g3NN?U=3( z&Ui3ol|gZGdgt~nLR>H)b7g3>f`EkC=EmI#Y|&o!YLw-;=A;s#W)N&G{W8B=ukC|!;Bt~Mkgf(7cN+}f8MCf+(nckkqG7p!VhBK8K{_wJ(+Wu&&vgIf zANXPC$Pvt7Mo$FiLEI;!18OtVx8bNOl8Vc<9ADOSnLR!d zZ+V03w)hK9Z)^b&!!}i~KbSWd^9M5`f^SPnA(^^_ZUOuU6LSn$?@!&Eca`@TClJ`) z`#p#jZNo%%2(B0paR$Axx6+m5Kyku>kcU}5^SXVBD(byOC?gKi17-r7Nwk~Iu|khb zto7@;<^6zhD56+D9pltS0+5FL9Qv254R*WNZkt5|r#m}b$=t?1epP6*V?4I`)@#f% zlY_}$t?ZTwM-dfJ6fWmQHiy1Y<`T!Sq*IH14D)FA1^Y38uQr+FzGjY?0#Zr7?@1Dn zLDn{DiX5aK5tyb2J-r(W^BEoAhP(B}<=zVpHu=G#)wq)NPIZH8a>@9NDx{Y8e}d>oa<6dc2nwL`C=*v2F3BH3$wx@*`OfFpP`I&tLq0Rr6}fL|8;Yofb^26 z^OrE#L3S^0wJvsEQfmUF%j-~2R|0TdDbokWwPE#W31omVinp%b^a+1@=y=)o@9*Eg zZ$l)_i?o%aWNIZK7{BW&KktH-YLzh_L~0BWO$!osGLZ6uMVDki9M*Rq9PmdTF)#@7}XTz{a0G7j4={*j~P^RuvL z&$5>qUoCDJ0@zm=yAy2aDef+P7w9@8xbd|2*Xtgu)Musg6tgxZgkS=ri0#H!b*ES8 zaJ%jwBYC5&g)~ksF}afLRxKn5%8V24ppjza%n8_wTp5PSO}VGl;sP*@52xval>Xp|SfE7_0`IAGb^lSt|Y5Y`Rm?1nyS_Fz2r*$*pZ?9%7ZmRFB3@%s7 zBMu6_rNdB@4CQ?3Zw=nYJ`tVbofc_&|K4L|L|f*cpm=ixs|eLMz{UouT?_O~500h( zpxr{GR8=VtO6EU-c6I{@)=2Bu+E>CoTE5!r>r);mOEIONOMe-unhni#;z&lnSlN{J zerYl5-1JrQa{Rr*dJts6Ysd(H>B^PxomP;mIw60L2yT-BtG+Xjp1e$8_V?s%iS~eJ z&G+fl@-?}V|Ep}Ddb*3p!3#&ujeo%xeuuv&_n!|rN`(MVdsCdWbYcS=>)DP#rewMj zoNuG*TNsbtmR0P5#WnV_+#Be_$!G3Ua3I-Vzwx-VBuf7oP3B|A1XOKeiYM5}bSe`b z8bd{ZNX5o3Po(@140c)zvA6szyIY?E)jaB9{Ay!$^@w@@lC@jH;<$fPp~P=*s>dOz z)J3@w1)?}p#e0-5f4ZaECIdZial)ahdBKRNyFvd%S5HD80Y7R= LT8b6&R^k5(4o1bO literal 0 HcmV?d00001 diff --git a/Subsurface/Source/Map/Gap.cs b/Subsurface/Source/Map/Gap.cs index b976b4ebd..1f25e71b5 100644 --- a/Subsurface/Source/Map/Gap.cs +++ b/Subsurface/Source/Map/Gap.cs @@ -163,6 +163,8 @@ namespace Barotrauma hulls[1] = temp; } + flowTargetHull = hulls[0]; + for (int i = 0 ; i <2; i++) { if (hulls[i]==null) continue; diff --git a/Subsurface/Source/Map/Structure.cs b/Subsurface/Source/Map/Structure.cs index a2fb24ee6..5eddba372 100644 --- a/Subsurface/Source/Map/Structure.cs +++ b/Subsurface/Source/Map/Structure.cs @@ -537,8 +537,22 @@ namespace Barotrauma if (sectionIndex < 0 || sectionIndex > sections.Length - 1) return; - if (GameMain.Client == null) SetDamage(sectionIndex, sections[sectionIndex].damage + damage); + var section = sections[sectionIndex]; + int particleAmount = (int)(Math.Min(Health - section.damage, damage) * Rand.Range(0.1f, 1.0f)); + for (int i = 0; i < particleAmount; i++) + { + Vector2 particlePos = new Vector2( + Rand.Range(section.rect.X, section.rect.Right), + Rand.Range(section.rect.Y - section.rect.Height, section.rect.Y)); + + if (Submarine != null) particlePos += Submarine.DrawPosition; + + var particle = GameMain.ParticleManager.CreateParticle("shrapnel", particlePos, Rand.Vector(Rand.Range(1.0f, 50.0f))); + if (particle == null) break; + } + + if (GameMain.Client == null) SetDamage(sectionIndex, section.damage + damage); } public int FindSectionIndex(Vector2 displayPos) diff --git a/Subsurface/Source/Map/SubmarineBody.cs b/Subsurface/Source/Map/SubmarineBody.cs index 2d633ee98..4742058f2 100644 --- a/Subsurface/Source/Map/SubmarineBody.cs +++ b/Subsurface/Source/Map/SubmarineBody.cs @@ -444,6 +444,18 @@ namespace Barotrauma float wallImpact = Vector2.Dot(Velocity, -collisionNormal); ApplyImpact(wallImpact, -collisionNormal, contact); + + Vector2 n; + FixedArray2 particlePos; + contact.GetWorldManifold(out n, out particlePos); + + int particleAmount = (int)(wallImpact*10.0f); + for (int i = 0; i < particleAmount; i++) + { + var particle = GameMain.ParticleManager.CreateParticle("iceshards", + ConvertUnits.ToDisplayUnits(particlePos[0]) + Rand.Vector(Rand.Range(1.0f, 50.0f)), + Rand.Vector(Rand.Range(50.0f,500.0f)) + Velocity); + } return true; } diff --git a/Subsurface/Source/Particles/Particle.cs b/Subsurface/Source/Particles/Particle.cs index df76d43c8..4d9f87429 100644 --- a/Subsurface/Source/Particles/Particle.cs +++ b/Subsurface/Source/Particles/Particle.cs @@ -37,6 +37,7 @@ namespace Barotrauma.Particles private Vector2 velocityChange; private Vector2 drawPosition; + private float drawRotation; //private float checkCollisionTimer; @@ -65,6 +66,12 @@ namespace Barotrauma.Particles get { return velocityChange; } set { velocityChange = value; } } + + public Vector2 Velocity + { + get { return velocity; } + set { velocity = value; } + } public void Init(ParticlePrefab prefab, Vector2 position, Vector2 speed, float rotation, Hull hullGuess = null) { @@ -74,26 +81,19 @@ namespace Barotrauma.Particles spriteIndex = Rand.Int(prefab.Sprites.Count); currentHull = Hull.FindHull(position, hullGuess); - //if (currentHull != null && currentHull.Submarine != null) - //{ - // Vector2 subVel = ConvertUnits.ToDisplayUnits(currentHull.Submarine.Velocity); - // //subVel.Y = -subVel.Y; - // speed += subVel; - //} - //else - //{ - // int a = 1; - //} - //if (currentHull == null) position = Submarine.Loaded == null ? position : position + Submarine.Loaded.Position; this.position = position; prevPosition = position; - + drawPosition = position; - velocity = MathUtils.IsValid(speed) ? speed : Vector2.Zero; + if (currentHull != null && currentHull.Submarine != null) + { + velocity += ConvertUnits.ToDisplayUnits(currentHull.Submarine.Velocity); + } + this.rotation = rotation + Rand.Range(prefab.StartRotationMin, prefab.StartRotationMax); prevRotation = rotation; @@ -142,12 +142,12 @@ namespace Barotrauma.Particles public bool Update(float deltaTime) { - - Vector2 subVel = currentHull ==null || currentHull.Submarine==null ? Vector2.Zero : ConvertUnits.ToDisplayUnits(currentHull.Submarine.Velocity); + prevPosition = position; + prevRotation = rotation; //over 3 times faster than position += velocity * deltatime - position.X += (velocity.X+subVel.X) * deltaTime; - position.Y += (velocity.Y+subVel.Y) * deltaTime; + position.X += velocity.X * deltaTime; + position.Y += velocity.Y * deltaTime; if (prefab.RotateToDirection) { @@ -161,6 +161,16 @@ namespace Barotrauma.Particles rotation += angularVelocity * deltaTime; } + if (prefab.WaterDrag > 0.0f && + (currentHull == null || (currentHull.Submarine != null && position.Y - currentHull.Submarine.DrawPosition.Y < currentHull.Surface))) + { + ApplyDrag(prefab.WaterDrag, deltaTime); + } + else if (prefab.Drag > 0.0f) + { + ApplyDrag(prefab.Drag, deltaTime); + } + velocity.X += velocityChange.X * deltaTime; velocity.Y += velocityChange.Y * deltaTime; @@ -174,11 +184,20 @@ namespace Barotrauma.Particles color.G / 255.0f + prefab.ColorChange.Y * deltaTime, color.B / 255.0f + prefab.ColorChange.Z * deltaTime); - if ((prefab.DeleteOnCollision || prefab.CollidesWithWalls) && currentHull!=null) + if (prefab.DeleteOnCollision || prefab.CollidesWithWalls) { Vector2 edgePos = position + prefab.CollisionRadius * Vector2.Normalize(velocity) * size.X; - - if (!Submarine.RectContains(currentHull.WorldRect, edgePos)) + + if (currentHull == null) + { + var collidedHull = Hull.FindHullOld(edgePos); + if (collidedHull != null) + { + if (prefab.DeleteOnCollision) return false; + OnWallCollisionOutside(collidedHull); + } + } + else if (!Submarine.RectContains(currentHull.WorldRect, edgePos)) { if (prefab.DeleteOnCollision) return false; @@ -196,15 +215,13 @@ namespace Barotrauma.Particles if (Math.Sign(velocity.X) != Math.Sign(gap.WorldRect.Center.X - currentHull.WorldRect.Center.X)) continue; } - //Rectangle enlargedRect = new Rectangle(gap.Rect.X - 10, gap.Rect.Y + 10, gap.Rect.Width + 20, gap.Rect.Height + 20); - //if (!Submarine.RectContains(enlargedRect, position)) continue; gapFound = true; } if (!gapFound) { - OnWallCollision(currentHull, edgePos); + OnWallCollisionInside(currentHull, edgePos); } else { @@ -212,21 +229,9 @@ namespace Barotrauma.Particles hullGaps = currentHull == null ? new List() : currentHull.ConnectedGaps; if (OnChangeHull != null) OnChangeHull(edgePos, currentHull); - - } - - //Hull prevHull = Hull.FindHull(prevPosition, hullLimits, currentHull); - - //if (prevHull == null) return false; - + } } - - //if (position.Y < currentHull.Rect.Y-currentHull.Rect.Height) - //{ - // position.Y = currentHull.Rect.Y - currentHull.Rect.Height; - // velocity.Y *= -0.2f; - //} - //if (!Submarine.RectContains(currentHull.Rect, position)) return false; + } lifeTime -= deltaTime; @@ -236,10 +241,22 @@ namespace Barotrauma.Particles return true; } - private void OnWallCollision(Hull prevHull, Vector2 position) + private void ApplyDrag(float dragCoefficient, float deltaTime) + { + if (velocity == Vector2.Zero) return; + + float speed = velocity.Length(); + velocity -= (velocity / speed) * Math.Min(speed * speed * prefab.WaterDrag * deltaTime, 1.0f); + } + + private void OnWallCollisionInside(Hull prevHull, Vector2 position) { Rectangle prevHullRect = prevHull.WorldRect; + Vector2 subVel = ConvertUnits.ToDisplayUnits(prevHull.Submarine.Velocity); + + velocity -= subVel; + if (position.Y < prevHullRect.Y - prevHullRect.Height) { position.Y = prevHullRect.Y - prevHullRect.Height + 1.0f; @@ -264,30 +281,64 @@ namespace Barotrauma.Particles } velocity *= prefab.Restitution; + + velocity += subVel; } - - public void Draw(SpriteBatch spriteBatch) + + + private void OnWallCollisionOutside(Hull collisionHull) { - drawPosition = Physics.Interpolate(prevPosition, position); - float drawRotation = Physics.Interpolate(prevRotation, rotation); - - //drawPosition = ConvertUnits.ToDisplayUnits(drawPosition); - - Vector2 drawSize = size; - - if (prefab.GrowTime>0.0f && totalLifeTime-lifeTime < prefab.GrowTime) + Rectangle hullRect = collisionHull.WorldRect; + + if (position.Y < hullRect.Y - hullRect.Height) { - drawSize *= ((totalLifeTime - lifeTime) / prefab.GrowTime); + position.Y = hullRect.Y - hullRect.Height - 1.0f; + velocity.Y = -velocity.Y; + } + else if (position.Y > hullRect.Y) + { + position.Y = hullRect.Y + 1.0f; + velocity.X = Math.Abs(velocity.Y) * Math.Sign(velocity.X); + velocity.Y = -velocity.Y; } - prefab.Sprites[spriteIndex].Draw(spriteBatch, - new Vector2(drawPosition.X, -drawPosition.Y), - color * alpha, - prefab.Sprites[spriteIndex].Origin, drawRotation, - drawSize, SpriteEffects.None, prefab.Sprites[spriteIndex].Depth); + if (position.X < hullRect.X) + { + position.X = hullRect.X - 1.0f; + velocity.X = -velocity.X; + } + else if (position.X > hullRect.X + hullRect.Width) + { + position.X = hullRect.X + hullRect.Width + 1.0f; + velocity.X = -velocity.X; + } + + velocity *= prefab.Restitution; + } + + public void UpdateDrawPos() + { + drawPosition = Physics.Interpolate(prevPosition, position); + drawRotation = Physics.Interpolate(prevRotation, rotation); prevPosition = position; prevRotation = rotation; } + + public void Draw(SpriteBatch spriteBatch) + { + Vector2 drawSize = size; + + if (prefab.GrowTime > 0.0f && totalLifeTime - lifeTime < prefab.GrowTime) + { + drawSize *= ((totalLifeTime - lifeTime) / prefab.GrowTime); + } + + prefab.Sprites[spriteIndex].Draw(spriteBatch, + new Vector2(drawPosition.X, -drawPosition.Y), + color * alpha, + prefab.Sprites[spriteIndex].Origin, drawRotation, + drawSize, SpriteEffects.None, prefab.Sprites[spriteIndex].Depth); + } } } diff --git a/Subsurface/Source/Particles/ParticleManager.cs b/Subsurface/Source/Particles/ParticleManager.cs index 9759587c1..cf522d8d1 100644 --- a/Subsurface/Source/Particles/ParticleManager.cs +++ b/Subsurface/Source/Particles/ParticleManager.cs @@ -113,6 +113,14 @@ namespace Barotrauma.Particles } } + public void UpdateTransforms() + { + for (int i = 0; i < particleCount; i++) + { + particles[i].UpdateDrawPos(); + } + } + public void Draw(SpriteBatch spriteBatch, bool inWater, ParticleBlendState blendState) { ParticlePrefab.DrawTargetType drawTarget = inWater ? ParticlePrefab.DrawTargetType.Water : ParticlePrefab.DrawTargetType.Air; diff --git a/Subsurface/Source/Particles/ParticlePrefab.cs b/Subsurface/Source/Particles/ParticlePrefab.cs index 54efa74fa..c0af6a518 100644 --- a/Subsurface/Source/Particles/ParticlePrefab.cs +++ b/Subsurface/Source/Particles/ParticlePrefab.cs @@ -20,6 +20,8 @@ namespace Barotrauma.Particles public readonly Vector2 StartSizeMin, StartSizeMax; public readonly Vector2 SizeChangeMin, SizeChangeMax; + public readonly float Drag, WaterDrag; + public readonly Color StartColor; public readonly float StartAlpha; @@ -89,6 +91,9 @@ namespace Barotrauma.Particles SizeChangeMax = SizeChangeMin; } + Drag = ToolBox.GetAttributeFloat(element, "drag", 0.0f); + WaterDrag = ToolBox.GetAttributeFloat(element, "waterdrag", 0.0f); + Restitution = ToolBox.GetAttributeFloat(element, "restitution", 0.5f); switch (ToolBox.GetAttributeString(element, "blendstate", "alphablend")) diff --git a/Subsurface/Source/Screens/GameScreen.cs b/Subsurface/Source/Screens/GameScreen.cs index bb95df021..6fae5ad43 100644 --- a/Subsurface/Source/Screens/GameScreen.cs +++ b/Subsurface/Source/Screens/GameScreen.cs @@ -109,23 +109,24 @@ namespace Barotrauma } #endif - if (GameMain.GameSession!=null) GameMain.GameSession.Update((float)deltaTime); - //EventManager.Update(gameTime); - - if (Level.Loaded != null) Level.Loaded.Update((float)deltaTime); - - Character.UpdateAll(cam, (float)deltaTime); - - BackgroundCreatureManager.Update(cam, (float)deltaTime); - - GameMain.ParticleManager.Update((float)deltaTime); - - StatusEffect.UpdateAll((float)deltaTime); - Physics.accumulator = Math.Min(Physics.accumulator, Physics.step * 6); //Physics.accumulator = Physics.step; while (Physics.accumulator >= Physics.step) { + + if (GameMain.GameSession != null) GameMain.GameSession.Update((float)Physics.step); + //EventManager.Update(gameTime); + + if (Level.Loaded != null) Level.Loaded.Update((float)Physics.step); + + Character.UpdateAll(cam, (float)Physics.step); + + BackgroundCreatureManager.Update(cam, (float)Physics.step); + + GameMain.ParticleManager.Update((float)Physics.step); + + StatusEffect.UpdateAll((float)Physics.step); + if (Character.Controlled != null && Lights.LightManager.ViewTarget != null) { cam.TargetPos = Lights.LightManager.ViewTarget.WorldPosition; @@ -210,6 +211,8 @@ namespace Barotrauma sub.UpdateTransform(); } + GameMain.ParticleManager.UpdateTransforms(); + GameMain.LightManager.ObstructVision = Character.Controlled != null && Character.Controlled.ObstructVision; GameMain.LightManager.UpdateLightMap(graphics, spriteBatch, cam);