From 6d4ed2a9e3063e183969bd2a265a6029859f5132 Mon Sep 17 00:00:00 2001 From: c0ffee Date: Wed, 21 Jul 2021 12:24:23 -0700 Subject: [PATCH] pre-1.3 update WIP --- 1.3/Assemblies/Rimworld-Animations.dll | Bin 0 -> 61440 bytes About/About.xml | 1 + LoadFolders.xml | 5 + Rimworld-Animations.csproj | 7 +- Source/AnimationUtility.cs | 12 +- Source/Comps/CompBodyAnimator.cs | 21 ++- ...Driver_SexBaseRecieverLovedForAnimation.cs | 3 +- .../JobDriver_SexCasualForAnimation.cs | 2 +- .../MainTabWindow_OffsetConfigure.cs | 2 - .../HarmonyPatch_HatsDisplaySelection.cs | 5 +- Source/Patches/HarmonyPatch_PawnRenderer.cs | 150 +++++++----------- Source/Patches/HarmonyPatch_PawnRotation.cs | 21 +++ .../Patches/HarmonyPatch_SetPawnAnimatable.cs | 40 +++++ Source/Patches/HarmonyPatch_SetPawnLaying.cs | 28 ++++ 14 files changed, 190 insertions(+), 107 deletions(-) create mode 100644 1.3/Assemblies/Rimworld-Animations.dll create mode 100644 Source/Patches/HarmonyPatch_SetPawnAnimatable.cs create mode 100644 Source/Patches/HarmonyPatch_SetPawnLaying.cs diff --git a/1.3/Assemblies/Rimworld-Animations.dll b/1.3/Assemblies/Rimworld-Animations.dll new file mode 100644 index 0000000000000000000000000000000000000000..fff73285efb998c51037d184ff9ae006874ed38c GIT binary patch literal 61440 zcmcG131D1R)&F^K-n?0|P9~WoO_wAk>Cj0+OIw;iX`AkaZnUKvOFB&^?a=AGbY{|p zA*BVxf}pa9qWG~1xS)Wdf*&8CY@#0s;s%0J1Vu#!+`b}~|L>gp-YiKd@aOxgIq#lx z&pr3td(S=h-23humT&qbxroTX-#hOR-Ge9pn=A0>U_Y|UCw!-z?)E*=bdR>|iKeyN z;_1eLl(jV#-O<<^O(v~Ot}!d zd8f7)skyO4n?m#|D5j#W@MuJhNH^k1R4Hj)>CFV2jc7CSLFa!i+WZk_<^SiOHp(RY zd)w4#B_|;F``i)3|IO8?6tow?H+Fd5(eOqhZ$Z8n_>uy=BNN+`0lxNk0LYWJ+Ij<% ze~oBOM=G7_1tz*dM;WL;sC);`#c*|`VhIb3tSdoh>4QHz9O^ljXkIaeXbSf${;_U4 zx#_%%i25!dQdG(MKp;59MQiO6dT7WEh4JvH2Rei?A3xGfME)VaB+>8YPzfiSxu}3N zpg%m3nb0Of55r>oG`V?1f~aANPG_PVbPk{u*?RC>EnxRYrdCn76{!;PSTGTjJlO`8 zmaPRmqL+Hx%1KwWAtn)_z$6rCfAm)sRdgf-%^NI8_0#i{HQ13(lN}tv+>Ba!jM)P30CRhW05K&)0d5azQIo*P3F2^M&0_6 z5cS^lb7e~drCb&xG+J5V8&-BI zmzAC`3zV_Su)xvE3SY6x(AF+m9w_Icu>H}B3SUvt>~wHeA8`dM0u^n|FpkDyCF23N z@L1?%Og8HL7td^Gs72k%KxNx_WfGqEV+Vmifce=D9R8yYepR4~`FZdi{-cg~Fc4&Z z9&v~NsKZPDNvWL!7JY2xoHPm*LW5i}46-K@Oh!zUg2kP6xCQ(jUh!R zmdbKAl!&)rA9LcP|9a;gxEZ6!%}l0l7!*5=O8hnA4AlB7?l8Jd8q^fbo6Kh!8m$n+1fZh9Jx@DFjv*hzLoc9IRsPI6D%Nj4ih$rfQJ zc~09&9!5P3KW)-vwLqx!Y`u1f8|`>!tQ@7nluHERpTDJXoIrte26=wd7>c2Y=^EOK z2kH8%eQ_jO+G|_)ZA0RSnFU)KPS)SDpL4<}9x;!YgAQ2;`_3sYbe@yjvY&Ip=*Y;v z?ZrGpc^=LYIbmoPInC5prBCE;>u35&NTI@A%svb0Fa{!0;t9KzBDNkQ)cGs}&&y1|&82aq})#PEEi!V3V%%e@*2nw?i-aC0^6 zDXO8&r)uDJWURg-1F)ZC+2<2Nt$#UMZSvIqdpNQn#>D zqL0TZ;;s&w5ek?vPQh*~`=!h24YD+wA6{NcicexQh zgbbyZ%k>Lc1nCH8(GB~HyNao$Q)*0Q49+_bLBRfN1>^<>T-3p<3_1h9gf zrehKDn_bl)k)C=5eQvEnB~W?-xvImbA&nkF-&By1`YWL0agU=fM#=xoh@Ph z)!=WRgv1(7j7MTECu)#@k@?$8k$@{%o*YvY4{i33LNmo53yhrt~mEdQN$zIP zTg$rgM1FtmWziH_G)#Z=r7S8V+pG9TwoB-+Eac>eDL1lWO9p)vjuYkwTQbDNTs#$~ zxUy)d;kM#D2JJ>`b!1%D1&T@s^dlzXKr?*~vcp*A{eBZh0Ux`(xSz_6_A>K4gjYs3 z0j@}(0O5gsVAHVCw)1y@8GWE;h+Stk38G57vlh~*5ymwS3#QE|9Fnzf0Qu7vqb;Gx zoZ_~WwIWok8G{{Zz=({=mPn(Di0&-rr6HEO6Jp>3V5z%`8&)V&WSqxk!YS}eOVMzT zSZ>5UYCDfs-fn#7R&==Pfr5smKUBj4!x|oggI6XZyE;;@7Xji^lbT0-34va&Iz0esC-T)x_y%`yHo5JTJr&U>`l|{Ne zS?pH1&5m0=59ziQ?~xxldj22+77h_qM65O~rRWaT0*d&YR*>Be7o7}kRoo;EKuH8h zF6^URdX~cjJ&SFV5ysBae*j~rfv^aKb#6U-3Z4fhf~NXJopB?s;n;|yHHm3ju>cOu z1O_IKXV4{7ruxm^F`+&^5?A4r+T!4V(pEWgnyzPgSZg=PSSrL0y;gyK#K3j}{9(9y zgp-jbBqK;-*MI^J#da|^L2imM^VqR;h=7@A3^NU4rNd` zdJ7BhvCPOO2}ZHZVta#TL__nCkA9K-eB@~DL%)g~G^1-&-5YZ{sj<(p(PY_Ltn&dN zTZR?mfcA5Y>Z1SD@J>bgSkKN?dhui5e(>YaDqIKNY$GTt+d9B>&prghJQ-lae z)k%zLCwWgCN?!mNz7U{fq@;^LE*-9?SY`Gj$ik>pQI&Sy#YnfT*!NL9HmxIXYA0_Z z4g!bgQXfUR@TFXiH-8NUqCY0(g;-&@_q9OWTR7LNgI!WR-ISC@JTQXornS$T^?i%_x?FEv5{f3%A%{ePbHAW?5iD` zE1at1x7*ShK-+$Xn1~*3;ek}+co#+i0bGFgVK-v5g;mEoF&W!Iq4RJizYJkp)*ipS zxk$cUAbbT1m)P@YHH42oW>j2QZC7!M? zqlH*0Sq*#t^#3LB^ITm5ptvVEFc;BkoAm!L+FoLv?uU;k?tV7g_6j|F5w*{n40+~GbjEx(LbsSp6!t60RhSTphu0x9@cNw7CcG`s?_b7$nYYf`g2Z+Jq z#|Is(>(yY1N7Cwz zI^sO0a}aLR4Z;B?VV@0p_%=v{^W$QvD|iJ)92^0Gt@nziey*8TBd$lMBhw{wcoL@$APWi-|oas5>#m@WoUeH~z&ytA{VA>YQh#s)NgiB6DQ}WuJJ)QDIAaX)7)v z$dQjXQg5I56w=gz4==Mj!LJrqL}a|U@+jJiYe7Q_q>py^V=q!iJpg)t((JXf^9|Q1 zZBIklX&=7rnCM19+sk}iAFS~A; z);7(yG|rISy=>Ro#*RwPeg$0Z`$pt-U?*}4Kn-nI5A?_Oru22!eqpT^-5 z4ouusi+6G%2`sM3oy@6ow_%-D&?k5CP~#ssI#uuTQV)z*HavJcqSr`N1ZqNjcKAz5&D^ zIR>`~??#HR9by5-38bD~h1xxG*tubd(|ptLo8W1GM%^?VpTF&gpg`R3J+xXq*6<_zE!F|W5FhG%M(4aY4S!qo!3)*d6ON?!u@&n>7K%*XgaeJW zT()lLbP;inh(J%UwPo*R@Eri_KLK!9#_w(KWBk7W)EUQe)KklS5b{T+An3dwIi~dh zGd&29`a9yB+VFRgl#3WRZiCI0MjFVh-QYJBzx6%N#_qEH{!nRzys8aG!P%zNs%IYp zU-)4Fm~N}BN-t152|Mubdjz2QWdF}+haW{M*B?#L6Nfn*7qf~|W$1{m&P&}?hiQPR zfLGJt<2bqvPmki~7Ka}LK&=gSRc8V%c+vcQpnTuMBlQ)O)5DK*=^p^-*&hP#`)`0y zwJZDto)Vq&pj@m51&fm!lyz!Q*2|zg2~J}3e3wD_hsp{62z>1w3Q?WkU^<=O5mI!e ze)uU?LatpneGRjqdS%O8&G7OvcxeAwl*$XWg-PSWPotEyGyG$uaJDGgiaUG;1P{lN zjWBPo^%J0&GP(SQ+FI+UOryzPFVMbiTme#0t8<}e@|Sr=$>979rQ302$0Eawz`G6o z98W#`3qT$ezKa9vrZM?8%Dn{V-VfSV4cicL&?FMFLOf?}Qi18gg89xJGpe&yl^o6X z9Q~AHwYA}ASs8`FiS3^geohD?fxX&Xhww|#m389e4kvc!Gv8#K#fP7l)VCbHq{(_# z+M0cVOX=BP;h|@*1PuRLxF_qb@Qa+H$y*@e5GVI-fNkyD3^4Q(@X7O$L!X({iau!IKC2?!ZTJmX@pxH1UQv(V;t~EGK>AgH5|3&99#8V57Q+0voexx7 ze*mSGqx!ks)*m@H{2HM3CjhwwqFzYfhz-#299%Br@sM$nAagG>*~Cd0qoCVH!i<=x z1DdPDu%K6AKHrEp;Lb5)rOL{mFb35TBW_F1gL1z7DiQEknZphfgM9m^pX7k=Jqvsu z;^eR}==lHzcA!+yOOaXcuNG;q02xK=&nS-5@ji_6dn$N6SH-6+Q{HER8@PavBFDc! zeo@Q%i)iGTP;&WJtZ*%%R2)`vQ%kMSdL20`!g0%4?@cXrsoj!UUoZ?ewTwx9RHzMw z<6d4>E`xJZ%h=Q{l07cqzo}(>>S;kH_|W_}P{BL<+ZD`fXM>^^W#e~7_+#qRT@ z{s8uB>z`Z~Uni?o-&+iyHdHucJ*gx4Lb!I;1wR7Qio&#le9x?mQgvSEnkI#U!OokQ zL3MWaRJOpN1O`FeG?O{q((Y=FnEbheNrCENfhs(LTteG8G7Ce=VbBnJ$r0t8%>OxB z=3!*QsRe5{@TIr{6(ugfp)78DpV<8lK86Z>kja{W*lC>s?+2XU&WaY~JL9-Oi;(6$ zXKTO{@Tw{PmTHUd{Y~;4z%BI!`O5im?{DS?eAd6D7C2(I`wbXp*i&wnAi{l{^D&Yf zd%`4~cf|i@vNTA&p>0$KgGIC?^^2Ufq>q4YKQ~+H1756qHZQ*lPQ9MzeTRA3q0!{k zSk3Uo4_1=^FA+K?Ia+r~;uLxcYq$#J!-kNsmO;NJ=r@+vG}?DAvZy&LQ3 zIMkWOx{PZE?xFLz1$uk4$-6~E$*CzoM3%&8wek+cTN`wD%J)lBK-Q(fh0v(Pqizh8 zo15hgg%?+8I~SokPZr;G`LkXIJ_de(Qd8AoRiVd*hER1uon?5@+4)yqU%dg3RSI@~ zJ7E_n0}6fQ7OA`QF>nRE*>VuueMnRw!M9iW7HNuna)BUR31S#GgZ=F*Y|2+Lc#6_t zQ>t=2Xx(^!CbtkFWT70={e= z>(Q9U>w&klSG49S%+b=0>v19b&KwR{%`D<<+yty^HF1CcDmJ?@%oeO2;*3CTIEY~x zR?43p3!XIYMdMm-RgIjqwtK?kfk!;RCvb+pNV`VPE6}b9c(HcOF{~bFhd48*-PNpJ zGqVNjhBzZo$7jtWwVMc@_t36Hc4WcQ=C3V|-j5i=CpL2o3QA|TAQ9x@Z$+ZLqWQDe zUVA?<&fgd*V|2ESZou_uZ*~&%S0W+iSB3UTZMJ!m+{KS8kJ`gN}JA?D8q(EsvMQMQ&3D!1jK#*4k8V6#a@dGrj^W7`Y zSzE9n(12^yfzlYHRK_5`Du5a)0%hS(Ly(!}379<=8ezUoX2r0Q>TN+tj{uV~4!0pC z{nd^H`b*{E(ZLy>@NrBov1P$M`NLBI(4YtBgpWsRXc~Z{uQONMCKSy3wyFZeabm%- zfw5gLaJTq|ec})tr#d+}-Y1_#*bd@Mv`F^EDp%fQg{O1f!T1|~pN8BUL!1VuFUA}kPiAF|M${y=5^9UE#sk!4mXm8z|i zfa&V{59-8vfr~aquyNm67>2I>($r;0w(SXc)kODZXQ4#fHt56&>tx0@*;vS$4b%=< zvvW9WPEnT7)Ta@1k=s6glw7|LcV{>k-V;kluqn`l*wQEOVe<_MHd3GppS5rgx$LgM zhb%|w))8INXm>@qySN(=;vft{MC!G=AsxX_bD;Uew+_Ga4i*x8VdKu9f1!hht)J*K zte>CxAnT_=DaaYm>#x0RV!5nTAKgpeAGWd>X*+1Fb(IS;rM@rkE$65I}BrgViSw$}Un~OzIXix9}Y=&JTgc63`p&Sn(mU8YO&PPY`NeuU-?MP~Kr(8Fyj`}!v6zh*Zbk5du{LtS^ zuDaEEtw-1#A}HA0*WSO)@d?|Vs%}`SsvBE0jspXf!Y9@P=>^c+Z-((Hk>6SbAh93Y z%3SclXW{#eRq`^mZ3bKIVz89pxrA9=1&5p-IRf*9mm(v78g?3=4VnZGK@-I;Rt??= zqiiqLR}J2T1SDhj!}3h(#4?W>daXbsGC?LBf$MqnB^bd9@L3j!I z9CU_^d>IZP3$|CxX&=;{0zEmX<4Y(L=-s$Zc{&_v+K zVW?d3WjR$I5ArZl{s1#ACi5WpbH2M}pJq1G@Ucpj251_m%q~6x#`b56B#L2W} zcMaxz1>rhb4OCZo*xMSBESUjAwzFdE*s;hR#$&}uf z*5$x5=nDn?k+IO;0H4mAA(!2=6 z!a1Rd3uusBK*rv2j10U(EilAel*tCmoIL4E53qnYPzEmx&%!^~z`K2X7J@HQ0-oWw z#y1Abozex8VWC=}TuunyJ@+(p&AaEaVY>q5Yxg0p;hVy8P%<&sxM7twVi3+BdI)7; zl%?oI91Z4138y6|K5_)72@xEUjPd6VNhYiP@`LEr7UdW6b5_~%yU%l6^Mxhnd_~^l z;(8<2yJ82Rg!v0}&e?mZd^G6w$v_q`bn#Sg9i1*(VrJfl=E}#lvO^8p%%X~8P`=s? zWj?QCu6Rw}ewFQ+3fT&smAq<^o$N_PPE1aVYQh+e5pQ0Kimw(gF{~(mhBa#Q?N(T8 zPzvYks!d7-{!|24c@!ysPfLAT_$xF*idCE5cyM!Gy;->VdC_{pkb%mUkRFVKqY7!0}LHu0EL| z`Kbv*C_ER+6#_rs`^N^5@J0jQVyn1ur+PZWIqC}6wp20Y`$z%-S>E}xkw{zk-5EkM z>0QqGBL)y&v(S19-$B2^y}|$VaE7%$KZ?~L6)VYK13Z5- zQ?4(h@OCow%R{4Gq`2ud^5o@?KBJRi{)K4S+Jw=rvlkIzt3&nQYAQ`m}kaU*42(g+7B@~?J3 zS5mv5)d}tA#)bB?BBA}AuF7*P@OjVTA!1-KvwY8UvnW>YQ!W!f#JD9?H|$wj&U9AWA>9le#6;o!HnIII}?)|UN-#=eb*3<2(~5G32J zoNJklX&QrM>pYal4UPu*!)^}4WuD}tJU!dbT;GFI;tpgV2H#%`-cV^L{4Gw)haiK$ zrRF&~6LXY{cvS?r4_R0oM4(r`ea?E3E4u`I+vDYRliI?gD8f%B%E_JJ?0c8+?r+$J?!MnsFq1U3Fgp;FWe8E5Y zf7_T@f#SxXE$zeGf>~+EOHa|0m+r1xSjoc1NTkGW8e4?ICh&{#|Klc{IkE}oxS(Dq zBBo+1!&nuKfVCecl|2ApT>!x9Pvw`LLkl~%hL=^q!*o8F*O^}h@3Xxdzp4E{R`}5o3P&2rTf3putA^Y;3BXT| zo%lB#4d?F4sXL0lc7;6#P9KOab!FFZ!|K%2UVOS?Mb;%~9fo7_E?0InvtYI0r=G<{ z5JNsw@a0_B0P^%KL%dj8Hs^?ezyp^CnM*+lnkV#a7~5Em?s>+LCz&2^WRIt zgjx6wjMw&JB}536;HNF({#;VkF9(Dw&*oUmeKZbTiF=y)1|2bHVsO(}K;7{8k(r(E zo|!$J1zv@MPN!$NirP?h_-YV`@Lmp|`pXE_IzwfTjucf|$Sp-H2JMT=)eS3`{uGPc z$s)4~aubf2usmD&2}*g+Y#6!*+=?+Y^yyr>cIY#?w5t7xc_IsNgKS+308=WIeiCPX zmNP#$GILh0!5t*j{c|ioc&KYG7WJN&kva? z(@Jo)SSF4?5)8>zVZNiwjh73Ok=PFQkqGvgG zNaWQGlc#KLx5!XX$(ZL1_|WyJ1g6ZHN<{srBKC*~1(k^T!_>%fremUQ$`4@*?Uf90F-! zys`49UI(qZI(##VJXOovW}%L+%2Cr_Kvp$aZo#uPFC%phc*3`Wn7S^{T_EG@d1|o? znv9>%x{V9I%p#y$!50wyuIv|)rK>wga2$U24!p5E+m-#20FU%HGaoUp&G$Fw*!|tMsGze` zp`g=In~`!lyFS<1=jN&J)=>vpgmhFv0CE8;wEZGnCVwBy{V&DV*J%at$jEaV)}isBbkAbu6=FGU(7 zEu9Y_(OISe%wvFaOzOnaK%M^y5c0q97d#N(uuA+@&qw8{^KX90n{NNmL8SBv{}zr; ztZ}>uGtEL3{-H~RKg*BoS1_9UZs+0uDnMJ4F607}evmusYs_#5075<-hU3eTTB#Lc zS<29b03fkKwf+}YafNp6Bq!Z^mUV2aQS8|}A!*!Yusls7e!K(y0a{G@zPpf7o&GwY z5?SYn{5NOYB6ZRCsg=1|_X|hGf|B)4NrXWKCBKoYxqx?!!wb7D;Jq8XPnCkAX7Nh} zhLzW_!7lr&vmN#1S8)paWvs(;QjUdx<&Znh9+fJL%848C#z|Qd=kjQU{J-+*{970% zJ&$;}dn{RIfVgCw0YYefiiGRHj)WY}z^U9e=aJ?hv5$6}oquSg&y7g%D=s1|vRMC^m zV;;HCaI`-+k0Pbm1AG;P&L09`j=aMRHABqK)_*yk{L}Q2A*=*B3f~Ly4}B689vbHD z{5+S_vrJR71&aX3GW>XIea_}8t8>mrCI)83$uMBC83?s)1~>2=7p3g&V~~Q0!Zp?U zmCcBT5&V*ps$)o4>Kqoa8DU|oU?ptb#AepuHKxwLIe^dAs-+#uX1>6b;WpEPKIFeb zn_Iis!-v(fGLVwxX->guN&a|3gGo~~92 zwIJsg)9e6C%tijL5Wd0aoC^^!P$6ZR zVto^yOXt%sLu?bTm|p@*v48y(OQ;>ni!dB&F8nxeP#4U!`%Ws<(z&-(ys|D7x+l&k5Kkzft!SK zY}v;vO`6{PPL)Z2)FSv;;p-KV(sFuRZ!IaOO94&%-pe~xi|I?Sc0X-FF5b6}iIkc& zq%;2~%bBt@6e+Eul1X)~Y08xF@5#K{h@0tj17wy{EWpzK8e}-TsJD^EVqbL3JNPy|9Yndlj&yu5FhEvB!O2^QKz;(tLx}t>P4{I29 zBMlwum}fjKsr|Vgt#p9Xhdm?jzl>K=9dgweyq_tp_ zO-wA-VYbwGKfd1ZQ@v>ZisbIWnEI*R$MmyB^0x(^EYdWoce|wLizfdib)6LE@%;~> zZ^oa_#mX{{+_*P@3HR=3GU#am^1!}CKsiiy?et~sW+z-nqaKGJRa{6&E^E@Q| zv!ax>y+?HZj#y?h+Es;5X_)g5=+!D}mLA)Rp7+yq*iRMppzLG%vR1aMzshVn1wB?y z6_|ZhbSn6Nso#lQlfFEW+qF~r=dwngDIXWhd}9)~{Q~rfpWI%CCqpZfX2Q<>^s^9C z4tq@4c+k@^K8W63cu7JSKe|X_Hn4ajy{nzQM6Eyd3|p zl3r}6ZtTus*EKVSAKsL_`vk))DZ#Gua$XI>kOL^^tz~QsTEbG=fz{y#uvf4#f=xyr zFy}Y@%o)LNTruZez>dM0eVJf43pNuq9>Df^a+o=1;^z^V^QU8~8?Oac4Q(swUSMCP z6}(#pb}6uKUy74aL9WPj{y1MaR{P(Na+gH*jfxUuXdN^6~294^* zH)wYkJc${lVCLgg`FYTpDGo07BJkdZ&KLVf_hFva7`_Y4+ zXi<4v1go;O?i0@MqqVGOOxp0UOJTecR?>B26}ClVo3_zj$@?{y>Taz6`wFlWU0lF{hPpWUen(J?;p$Q{bLTgOnM8yS8viqm7MN08Q$q*_=$1<2G0+h-B_Fd-s}VX zV=b2&#Mv2B$}wX#Um57-0>2#O^zISmxUeoZdOE1@x*h?SM0yrUJfM-v#(>UpL^Z001RpEO4d4l$iqW5g4dk3(9L148zT=&ztpUApLrPId_kJQrGC0&|jlP z=r;|y41XYyHP`4)Vw znGEyk5Vh4^Q4*q8pmT^G5csl()Au(qJfVhRTae)|ybP~27*3Y-1>s&jL_JN{K*H9V z>rvMmjb5)wTbo$J-jXL>C(s?P+mNf#?SQ7v@Jc|9ww7`abhdm8=^bt!0X2G=xQ8vBN;P_1XC6nN(fKE6esJdbS)X93(&xR(npz#o zF4tMY<9eIHWyjfNS2e;l(8YDn;YUj}y0Zwow+MS!Vf1)8bIxi)v0OP$6FutojOV;% zl6R3U^Gv}WC6%`TD|NoylY%*UPZ#AqCzvDU4@G%@EyCUw>>Bb_H=~6QV*f+%W>cz< zFEwbxu@1HX5yk)5*oM&h(g00qQ+X?@`%0@RCD_H@Oz3gg;C>r>q_PRo&}VGyr02+RA=~4P!z{HnV_smdvGbVkybOK?(@b6-JuEOnVrm;45(%3JQHdENf@Vg#3 zIlt4!uEacnhYL7c zsPYu9?*RU5m`(VqV6u(Z$#+F{1al*};dYo$wV>~84NO5e6I1NF7i%QnWf zx6&7vt8z)fzHVcm73@X9xb{2Tt@KC19;KBNP28k5R&cpTz1NjLS~`j96h;>}z2crk z%hpOBT>*Ou)4ewK3Orbto)k>AC`>;W?20;l><>%B^jZ`N1V zR(dQop2>Mi$`oo7Oi7tS3Bj(Rw_9H=okFkWu(wNR&`D=0nNQRO%VyCs8+*I;n6i`U z?i_Yp*&KQ`hs`YOrdelmxhv>?@2&cL>J#i5VkrwKV`Fc(c9$)r8x*IsXfeH5z`2-S zFUVU$bv;TK*Q8U+mQY^~TUT}p-MLxig&WTQHZ4oBlnZG+upY8(>_T9h>2kr8E>XHxFeNieH`$zi zdd!T{w{5IKf6UxM-?OpL0qdn79@p1TuiANBUq40m=IiUHX@aR<>Zdt^sb1=*C4ybZ9vD(8&*gF# z(u4GENNE;Kac-rEo%cz)zicZlw6U|bN6NO*X2Dbqak`-hyIn9PB~JI)<+#2$b!GGQ z#pzVRRKJ`<+XPeNu${hWW85#>sd^umJ3w!0h~sIhV26D7AM@X3+o?-o(o5TEuARrd zw4IjNc_%dd7@QxoF&>rebd_ML_U&}1oyVh+px14TYfsRU{rTDx6cbFcIp(Bbe&51U)a98lwcAb%5|sjZuOu!IaiJ=u*K{ zpC#!s8)L1LG;kr8Q+g(8kHSRHB%N>Pv7SjfXy>t>N&2CUv7SkKMlhvkl720i(lbe~ z3a0c-Qv9O4o_zYN(cY%YN*%FyWu*(zIaAIF@Cot?>@Zz)1gC}uEw18I>WLHigl13Z z{qR&)dg!kW%(-g=S&OG->dS4}{D^MeT*|CXhf4iZw(!k!S z5}W29)K}s>7(b^2o<-12r?-8~6OdB-$1=Ta62p(1d06V-Az2qqpeOk8We#e`f0`Qln6$2h z<#dl{Ip<636#o!vcO;KYtG-qIKf@`kPKrlSRKF<-OVgxRb*h-aV>jL8zT$CoqnEg^ z)MzSBF2$q3rApCzN`I#nOn1@g(o2f79D$5R3tJdA37z$EdRXTUfHniP8KBJsZ6;`Znl=-(nV|WIy?g-B#QTru8vOV&=edSTyenteC9qrIQh}!l z+$b;#SOYJ~oI3^X71*S)v`YZT(2bgoGukg{JjY9^t)&C$k6}IflGcW~Turw&%%OX= zTQPUPE2Vt8Xd>_mz?F0@;2HSM0WN!t@H0I{42N(|$ow|~UIy4U@k)4Irc4Lt?KDeD z%_6RSfl!tSWtmXc(x&nzoXV{#=idFU`!Hf?rkp91K2XZEgitb)?i0xwflmuO5Aam2 z-c>*8G{6%p8NS-GQ@aTC%eBj>W&HKp)i%%hC3k7pN%{+PW7P}VRM*v${-nJ@(MkWK zMKwMb>T=aIYkIfqQmbh=XnZDFDv<>x|{w~^=o~) zz;5kV<}1+92>na%*51-z(GTfcS~S;E?bsT(t6sZ!qUO4m9)+Iw3ID^=5C4rf7Smlf zincdOE1spVPnzqx!nM6*q3cFhpn0L|C({2vkrBDkRqkWDCh*HaPEW5|=z5kWjXllv zhW_J{b*`xz?>WEZx;}g>G{3;zL~rQ7tlx~$!%HxlYsCCSC)|pQ^5R9oAP>9R%gK4ZZrku3!3l^)A;Xfm>box*n7CJ(IqI z^jk>Z>nbhj)gO0VZ{Fp4+BMX2k1HcGGq#*J>K=zQKH+&@M&w!7xxr^$PgAP&pRPl$ zx-oAWDye(&Nm+e5&3S){!z(%x{bDsM7g6Uu8ssmH9*@I_s= zl>0ea)kKF~>s#84y*f3YVED9ylV%%JHQwK9MpxBF15&HD823p(9M=ETdJwfg5$f0L zwa*2v1}D#*jRFs7m-;?yY}BfoZZ_%--lN_vGw5$JgZ?HnC@P$Xb>1iLl=QQ7b>IP` z$(S?lVdGfikKQJ_%f;tQ&(e?0CfcdFaNczhH2*b5=Y)#qjkoDK^N*nLxE$8+Y-%%> zx_%OP)95lTX?e?7YCIWy$2dgmgSW!!mcZ%`>!&nVyH7LPCXR96*G;WAx(}hQ zI{}n!smi3tn?ZwLMkJGnnR$23v)u51FM%H`!}C(L^7@s_KNF1@Ge=jOAxI=&s0aim3_N&Q>e=|?h`Lz5e(7DQUBW$$}=`$yGP`7@^xN)9t{W`$0!oN{C zyY$~T_v+mOyYxwuSf96XGTf#ASIa@yPCYgD1kW+H&Q%l3A@ku$i#=WXgXQIbKPf*5 zk92%VooA9-nq)c(cc+?QQAz95TMqINA#+fXDQP3AegRh2Ev{9JyCt;Ja0S8g^1i zhmG{4Cp}N=cUAqwqq%F$L!P*CDD*0z-~6-ZBJm^_!A`0?hxNB`l6+V%#prjtW{mM- zy*Sl#thdR%)_)S{37m3Ib>9(w6{WJ}SLt2umGFC)xUR0f6(0WP+E+b?=wX>J*OxHm zLClC}>8#SIx7+>QaKCq{`+F7Jy&K&-%C~#(b^Qq=dx#GD2fR@?uT#&`Z;f5vr{T5E z^TypD3!UfP=^kpuYU2KP-2pFbGH{vq5Ixs=9?EXSN%+&+eXgs(|67577WiDlXP{>{ z?DMex2t2@H{g+L5fwHKSVK1!rUVW4AKFm{}|Dem~;$8nF_;E&o$2X-RNF5X{oPG z`tx@2Z_^Q(bkKB(Sia;g39Lb>NEQ2&ZuHVDjaSvX++S_o?E9{JwVQi*^8}p8(~l<& zK<4iz?D9R1|FC)1_q6-xRR??v#4?|DFA09ecgQ^yy4Cl4_rdZzeOJg_yFv?jA4YnG z_i?~~RvdI)q3y4E(zi@XU7`K0=2xH(fTEe)QlFWr{5vRD)M);@jIoua{&?G_zuw%9dh1>3 zmhbz$h$vt3SK;mLOa4;orr-H>#D=c{4hq~0h{#lX37lPkI-RUBr5ouEeA!%%SS(1j zfDLp4;6$1O7@-Y-(*&L*aK6w_rL#d_Ba|})_R=m;w$lxOY5HpUL;4TtU**5ip8=fc zVmROROS-qR*Yz(-1ut~Dv|k5rMtW8CLr6bX{TslOYFvi!3!HDbv^#2g0mGpS0Y4tP z8Su@}Lx88({s!o}3_@Y3nW_qK*xdJx}+%ND&fm9NOjx&}R%Z<~Fj~HJxo-oSX z^W2xXzvVvBoNM0U`IhIqp6`2p>G_AJ)H}z!()&g4cf5b`8a}UYo9_=k)1UC)=)cYX z4gbCVXZ(D7p$4}dIxruOgI!O@jF^FY3p26TBJ4h2C?k5d@+H7~yuSsUU;9VEIb)de zMD^={54HXs@P_ikfd4)52;k|*7&s#+O#6@Vf}-f7r*-VHT-fi{U_Y+mZI2u2TI|Pl zd@z9jz$Ny4C4iHl9sj;u1>h;rP{%F`|EV;b;?w|Mf)YA?47@u12j-G-^9Cv4myH#2R6Q(*0o81hITBVsYL+2T05X$I}ZI)u1y521m|)1 zkAY4CtOnIfK@Ma|W#g=SB4 zoSYw}bLb;<3tIRJ;-|l&b*5IMHE8p+i?vT{U(}w|ex_Zn|3V+{YQcX>{S?=aUG+wb z@eSi8;~e(`<{!*f&m7Nfp5?v`zAJn`^@aQo`i=d3Hcr6#TM`UA8di5uBCq=|^F`pTSwp@OnRjGaLSHwiMqEmSVK3Fb+Z7 zrK!caKrL=@)WH|mqsPafFUQjf)QBEx#C^)+$)fGrPW+{DGbBro)7koI+T+?9EorRLQuy12zjN_-zTwi_&076lbEfX~%+#lNuGbHs`~mHc`p><8 z)L-zvq5s}{IZg9jPF?sr+1KQ{%-14+_apr}(ywE8IMol|@89YAs_K_nv%7kFru0mq zS((({Me$@`cQU>snu%M<*<0+4j^5skmCB*BdwY5o#M1+b=-&B>XgV#0hZB!yiOZwg zV=H32*IMyJnu||k;+jk}l_{!Z+6hb-J!sadRIER~r$;fwmc*ic-Fe#$tes)-BU%wUt3$Q59n4Ge$1}@<`qjM&|{2 zB=1b_9AsF1gNfK|LI-02x@k!?wZls8T@}srZtGcvX~~o46f3SQeD(5qHmCEPPursD z9&1;8z)Hu_=ZnzysdTKPd+D%@<(O{?tG8zjtv+Qv&9nOUuI%qm$1)peOF=qM-&8=~ zB(iozx5CnBm6gsc+=J?3Y^k)~N+tT{TRR4TcCwI~*z>E4I*Y?HnU6RXoI)5<5j0=-}NTpCOW4+O2PoLGZ zB^8UNGv|OXYj&?RRGiKdOr`$*#i{7Pws^9x8I0lD+tdwPC zmf;sA(OG2I#WgICCZk(peQUQteBaVO2v79%z^pRyXd*{s{sqXVXd=EfxjvrR#%(Na z&;l!&S+gy=E4I-Z6jvray37I}6s38C@kAfK0_cH5llu9I=5g~=J-ObX1+guITbEf| z^Az@b%1p@a6)w6s=1knB$>n>Q5>NJ|qdQ_fTR1Hsy=bs^J239SEwP?{g)OnH?Slj9 zg-Lc;eU!EalYQx)n2pZg7VF)<#oDthx+TWhYh!yd3zL{z4k4CGS*exDMNzm!QDX%v zm8L96Nn7AZ=E2Xcj`hZ4Xxr-O0J7uhp8nKeI+KDGsrD~OMf*9Oo8xP?#f7jS)|-gJ zLoSNP5`D1le!$i79b%BQo6WMgpgYP}_QKj2$(PCRWNM);ly~8&J6Up6*0EmRud}jX5RM zoX?YCLpB2&8eDJ^yfO+a(Os!{UyN1`%!ijIl-!0UK$#f2DW2fzn22E-GNCWlA013& zhS6X=lDiCpED3JDwPTId3wstqI-gt++ogD{3`S$Oq^$v7Ac*l5gHo^hdSy+tKSo%7 z)0i#zQl)o0T8>mMNKk0+U`i!;#-M57n4gG6Q}d&}+t3~>1p|m@(hBXzeCG0ttkh|P zkQk4ti5bPB-@O}71M9#p3y<7A&Tam}!PNjO`2~t)9jt8nF6m4rEQsf9Z%uzh-q*aPtw@O7t_8Qn0s)%FK z_U+ABaCKZE76@1~&#YJ~Q%s2`9op$oV(-EvTzm{}F~zong-JSkE&4pY7_(O}p2j3Y zCMlSgJh{E|_DYh+bO72WnG;c^7|o&-V`BZM#`g9L#!bp0t7CAa=tjrU?6Ts$v7TL4 z0x^?Ai*h`h=&_PLcB(kLcW}qB0tg@+%Hrt2GBl0~8Y=C34I*45E6kcOF4P%w3QjEQ&EEe+{ZB3)|JLi(3h}QjF*TimXi` zvOsvCd|Cn9a*WboY702+nX2^YSq>dBQ9<63OU;@+wTI^{hzoZ`6N8-KAzwKFb>l$T z)o>gvD=KpPx-7o;ohZmq3dK@O;(dLwWWIo-z#=q@<0}LVBQu>L zlnvL&>;QOtNd@gL}w87Y5jLvZqJgDn1z-oAxMAHi4F=tak2$R4DD~2bnj_ttK zK^C8M&+1q@mIAgW&dU&D5u{nx>e$Y~7~-xz1cYni=VFp!p|^JM5ZgAo z4tv^gPCU)hRcbvvBB$0`DtwUPh^Osv0U6k$^c3QDK;`&W6*R5kAa{2X{mQb?Km^7r zLKb(r8jV0pQm{ZyFl%?FM~W89Szs;0Rtn3keQYw41#3il8|`3#NwiJW-5u{kYGJYu zqs695a7d|4T9R1p6E@olL=W32DNwr88U)U(^A1TNv;z+1;Yc#rajc5=Zbv+VdACgr z3-gXwVsWpMh-Tzb6eVCW5~7vb8cpv&?1=(w+PRQhA}ERUIn1XegNf}t*xT9Qu>XnT z>YS6XyFIZ|bx1-Q3xzOZ=R!rWO01719$Ns3_0r2?{TY};nxjxyd=&O)rB+~p6oMQ{ zC2(<1ZF1EJbb~M-2N)c?OVr+;>;7~{ALzV;Seb-v4q)73eJfLZq@r}e9!?AdE5Q!i z;6x9WKv4#R=@|DXLR((^PETVc6eKz@kU%8ABbKyV$9{RGbedfuCccG`6c^~yJ=+F% zAc6Iada+eRA;HEbBG8?Q-a%exyK&~0lg#HgD-n6oycohNnX)V4tC8dx!^5IB zb+*;z`b%sOJP1Ls@JE-TPV|s?KiSIWH??#cuf8evWVAD%9Dc&V8w4CDuq%in&a{mi z^*OVF9Sa-w(!A-*#9=xPMheMA##Fd}gVxxKS*g7IBG&oQ^k6hmly7@pxS0GIBEfxH zDFos67B(+UCRH9y^DeNPnGq~u7migm*#{rXQ!mfO_P<~dQ3Cf+pOX-0Xd!}ODtfmd z3P)=dxoB3g$H?WR92N`)EE)$(P=h4_$B6UvvkAP8*-2}lXU*Ui>}nLN;~ZoC_W1)F zSN=2tbG$FM6nnlD7JU|t;*c)QWV>M_RtTtYJb9d(=5z?p5!ReXF-PO2j1LP-MrC0c4TX(<33iOhcZRbZRU%u#9KK0tC)* z4147%d-J8qeoHN^l2XB}o!qe{mXainT;Sg%FcX{`a&9bT*)avLGqfIiz0(Jz&gD_{ zw9SN39_#su_yDn0=1f2+vO*P;xD~||uCbTP3pYneB%5(b$!1(qa3hOjvYnPCJ+m^& zs~I_wTKjw)?xd7*g9EuatqxNVA@ruusbVB>lI$7n91ddRy%mst1p2jE@1-VO5G2;|C(ptEdILiS7*cVor_|AMv49icN|S z-%={BQAzF~oHuPjpohbul=y=lm=cz=A`-`~Y@=z1I%4MZ$o8pF%oqs&eVmR3X-^N%?GUo?MmE(mkcz`B!NVhFpGp&sc>7?Ia;#5rCt;f| z^iH58yeK;%tdR}@!Pm-uJ5yY_omTy7BO@B*#1j|>6BrIi;3xe0aeNJ63UKfD!P6`+@ry$?ilZp22yHgqT>F z5oqRUn7h1Mb|-rgbYXdv$3i})6A8=XlH8#l3zKQs%u>vJtQm;8`{0r>YI&V{(2d*@ z#ll(a?&7>5lMn@47IZleX-~oQvol9h3fMVz#&afNsDbD5wlYTOEE`D=rgRO&YN<~S=cI8dJ7p? z+%q_kNb|m6)c4|IGKlD~m=2Es7w*B9kk6gcSaj?KceEW7zumK6xC^thsVbr&tV-nf z0cqYDvC~oP+|gJv=!v*iHhJ0inQSp`YOH?R^BI`yB&v zvjOo7?}65Avvx0u##1bNNi+jt{9b2ae?Pn=G{d}Ckx@Fo$#Mvmyv$7Vi@|7u{d2q* zaYhowxYiu9z)}ahJlfdVzyVo~0T0U%OTr7c%!r+%Q;M9 zPhk6TC@W4v#p3qs=G=?54!i+Nf@74G*IDGSE_JXCWz>#WdQC;rJcLR)%K1SXcO0IL z^18-e&qkfSmyJqTW2Y@8Uv*mo#}A_Xwius@QlEXIxXN~`IseKVs--xc#Hi)kvO2dJ z>sYu0WbExE^5Fmnd!UTC*Oh#3$M4gSol0l&XirZnmS#E!W8K)mW{5qx*8Xvn?^lDE%wGHQt+xY|zicBO7}+^nObpEv7k&sKS9h z3fue8m;34iN;sO%?;);G??TpDvyboT=~WjAS+=1Y=^YZBP$!aJ== zSa?Axol9&SM|#Jro8-)p91Yn`(lR%Cv}_AY#v+%Lsil;KR*^;7qAg0I zB){Y+3Q3J*!W_z`L`w|dWQKwcKIpIs_7wQwgMc-V!yeYyMGymVkc)v8kN^n~0|~G> z_@Kigrv%8sNq+yTu6c1Z)~>Zd0)&t0?s|Oh@2jt;tEw%A4Wb~=Wmj*UzM`0u4m?E# zKzr?O>FlY3P<7DeIi>Aio9CnwxHx{RxU{Zp$$tZ&*fM8xla&pUkPS1D3WR~nrA5b} z>neA^aIa6=ALrXUO+>SCX_cFMcO`p+J3md0$99s>bFc6eSB)_$JMqn5Yp}gm@>lvo zPQw(#p}$A>Rn^qU7bsq*4<~$)B;wEQaIB%&7tsEOKR;Kzn2rj(pfeVoSSHt*-khJ=O(nxEY$HY-{?SN18>bASF@D-OVi*8|$M}z;EDb=q=m3 ziI+aLtK(stw&o7 z%vhr(-(J?*Ki3X}Z!cY}S>9K{8H~2;BOBn$N2ImJYrfmHTtaqyKU3u*_;$P2&TB2y zw)iE*C9M1F@n5#Olnl?%8fib<4*y%UUNB6)qwV6?Xp&itv?Q`a%T*ht+H2m!u4{jw z9W5_Hi)=--uhe5X)~?qQR7ro*&5C&_jJ7uCDSZLVOHd&G+FPlYMMICa+(~m+fqxxe zn8!wziFC5RVDC#%E}XOcKTjEx@HlJqH!~{EZt$y?C+VTyEn7alwRd9Xz^r&HzhXlf zV#oq?6wU8wgy>6*V!EP$z22EXfkq(FoLIVKRkvL2vx&79Swd1bE{s6g6-tC>gFOZ; zq+vm7=Ec?wB;c?4lz1_{Cv4mi1XKRA*8sI!1)53RN2PR`?Ym8je<3 z=5mAco0bTjiG{>Ej)1CPf)gpY={lkI3cnh@6zccclGPNVU@u!t&FzAr*J*jWuCHZj z=t9fVvtW@)OLd~rv40lG4zENcF3j*bXp;~{c})QfK}Tve&NwAzub}I+R%xq5Asur6 zScAAvE7UF_TrMCd^>P7AL!R8oNwWs871Y*p)!@rqFKaT5ay8peQF9YqP36PBT+UlB zBhyFZTjxm&~#Jqc)5*L&u)$^Q7W0yI1nip3tFsxAK`_*(I+1<2s zOAe=MQm^c={YC$sez>D zXk5Xz*9bBi8q`OAAwDEkQ7SL;2`C!?(Z<=!n^^5B!o?i*F9G9uu+EYi9Vfh86c^>& zGW&N>qL_0cby<=WDkqR>x@a#D&2iC{Et(m~^YODr%2xHZYHtp;8%>VFs95C7D=1wg zR4}UsIu!qc@3rfBoSqBxkek(qhV!;Gm~Gd$-5Ay!K7ym|AYB2QGAPf-3(&rnjyFrJ znw5LBAK7FCay}Pw(lKiKVK~RY=0?vouwI9AKRQXf?P(Pr*}{gs$B8O1sL*F58j*28z_!?;@!ir=B8m zYUK6^d9BeyxPrn9^zV6F=tVdi>vMpxLEz zjpm&&5=ia}9P1c_j9|Y{--c>IP${GfgC@QGX{}-zLcOfb)3q^BBdO0q+$gQAE-^s| zqvnxTqo(`PL*t-E*diMZC~?-A#(0+pih5Go-O{>rs}QW=fi__c_B56+f?rPLYDG(sb%9HgRF-wZ>;Xmj7!EELIJ`eCQWN#&d_ zyOrh2cgEQSU%2&EgHrf2T=7*tJw>Cz7DUfYsJzUt+E6;#NK?I?vI>Bny18uZQA_eQ zyi1QYT52~U(&T<>2aG5h%(oXx%N$x^BI>J_B=GVFx%?+Fw<|6 z$DAZ*aiLMEig35KcvHTu8QP~zzmR`5-f?sLGo~qY?&1bKPW~ zphh$~YmlsKEhOPdxZ&jvd%XtdXnP$<%8PH>f#sxyXsKY(t?}qN@)GwwA0qR)8Ee}- zhyuFHf8BlO8WcHuZuXRi%hv4n^m?6$G7bCsva-lq!5lUhL24M2^j_CV#$k0bn9$Px z=a2pS?%?8|y!02pzwPYq%!f~y&LjwOMA4v&lPJ<dE3C>k&sS2L3RRxW2xN8%BG3|suT{v)p2 zNY_yGN|4V$Mm`_fiyRG#VXh#02Fw6^D$zn%DGYaKd*kwtEx$9C&h#@3;~C)+gFg)8 zQYi9wJUQGShC^}X2f;2R^S=G0dY9Q1boHoJUw;q?jIZwO3F49?u+)vj)M>yVtjZ6A zc!qsET|tUvCfwd10N(+w10M>`jJi#7bns^S5{qg87!(hf9&poH$gR3Q2{VO^=_v5i zY0!Hw^`5Q_=Y?IoaxRG0(|$si%XY?7VHnK`K;`2u-V{~&xX*N<#|mmI--*i~ggFZ* zF5eSTQ(=bP=}k13Ga>c)Xzt1E6D^cPQI}{dU^n3aTT39|k`;L6(=HQmk;#I%e77?b zS3c{=q9B9$Nbb<^hDs0fQU0(q8^nW70)xOBFgeUNn(NQ@(EB3`!lI`i*I0ATp52YJ zJ#n5IDL+=Y(fUBPuYetg;*B2&fUE@LN2>W~!8t-6ITSiF@x`p^ zlsy#Sxfm9r`3~M@14z#EVJ3$P#78!fkCyL3g^qWkISG9RrR1`4C&=?JgGC^GlTot~v5hcMYoD`9 zzmM$$Cd39hrM2?CFtzUdHiKkAV^z2Ag7UvTl^u@CU&R%91z{+c&*x=EVm{2dw&*jT z1sYYvIzoH-D{%2y$lLgi_K^-Tm(MvYp|G=nC7^gV^~28k6(H4@sD{;b^#^R`g0|xF zpJRd247MCsq6^ul1d4a&?|IBDb^~Z_|LqCEj$hzocDdleBUwGZp>HgP4VxQQHfo7I)`YU0?WR& z!)jyM>hyhUB%AMd;Z*npZiM-uVUAe^k9VA=)Hne8yNy?CRvx8h>0l zU~TtDc(}YKi`NzUZAiu930s9E`z>InvDjfMD9#jok*NAyANLirHt!R{3WACA$c6q6 z0nU;)&;u0*N{}$j@+U|<+WcoEpY5^&g8zIh%iR1DL&H}YTSYh#?^BJIC(!ujFN1Jf zTI{Z{9~AcmZ3tMTU7Xk;WSO#5{f9{V%4vRqkOz#Ye4mku48WbsLdriAj+2<10}|ct z7AXt1?l0M%+qu&L#Z2;u$^mIT%@}Nvivg5FMx{s;u$i8+J&U?h989`YaeFAf9aaBi zgEZB+hY+Cj_ONx;+r#cGzP(5FDvK-g@$JztvqQNUwL2_nf2-)2bIvz!Oa9)*`dpYg z;Ji{4s8)(%>;EbD(?9&ZSBIy5@d2J}x3DT72~5WN6YtlueCE^REV}E*_2;;@V|ZHr zWO}@q9!F@ipmUomx}zLtIj!FZc>3qvA?FTaw|tjYGij^A^oT`^ifBD`^71EY`6>FS zbgRgYzG|bPm(uc2y18(vrY=7R<_Z2!>f*0d=Ts&DhkDYc1la27m`2O;&sA?D8wq@6 z-ohlecSVY&%3#X>s8$NTuJgRl1& zdKBI6(wn%9uMFyAhjaFitl5elJM0Yz z&WD{-Wiu6CsSt$yU}ChkAy!B=q%iV#sY2icm(u?53DI3SZ1IGui7H2<%JF_CG0Wh=k?`++oxm#?(spS9q~**U;pMa>5Z4 z>SRzKJM=L_QH~SFI<7FJ5wk;Q*g%lJzt=h@fMJNH!$C84XM?P z^A-R$e;Swtw@9fT`@Y0aDNGj??n}IlOpZS{K7DX{a(rrXYWm>5wYbhQ zla+nRne{~`H#0@?JR9Sz9$sb1bnJv740bIIvzvKshFPrJ5QSCxc7ox)q`t7W9ZZb? zYsKRekB0d|I-A*TAh0j-JAl=|>FwD3em%Iw>FI?7O9#F?dFZ*R;>5v2Z>FHr#oCV* z_8U$m%p;w8%&Pcuw=coPK_-o$z zpKy|H&HQy+Dw+3qEmTd8^{ZGPGox8q0n1?=pB#Sk!607?21jog1I{Hvm|cr7t_YFN z=zYwL_Ap->KJA`H=2l?ds^VmfYS;|naU<5MZPv%N3#RJG{z zD+RkQH=o}u{YJ5L9ACXm><-M?loKbt>TZDFgoB=XVf|5Ht~w_;I%_SXZcX@OR#F7s z^Q=QlH%7I(y2L9`x9IAdFqd!G!p~fI-0-tZhd<8}L1QkapsOn&wDjYfkluqtPOsWX z%edY6)8BY$o^d&?E&aaElcomgLmG0ziK2;cLzofShtj`-3k6*PXe=|v^D)%>6qf|RUVC9;#1SQ&hdEiG!Nk} zaXiHX*weP5qF{Q<=CUT@n?q10H}JX`9k_YQIF^}(M&(j*j}}V zj(W)Nr&QVo=Et2s2WS9IH-NEB->WSk{m8bNfN%FZ#Y0tOz)shahkI1)X0q7X{}%L9 zb#;1_tH#a{ba_m77u=TuntXpcU^_| zs(oyzN5CGA9*9m<|Aqfa+BZM8tx@@Cc*l7NYbT?k{}^~D!K=Ag>{JBici>x+Wfv}Z zGA+syc8gE=-4AX0H|Dp2QV+*zP>*^wxnqq96XMqWyl#2Wq#NOo28G$nR9Di>qsp+J z7wJZi_%($^6ESWy=
  • 1.1
  • 1.2
  • +
  • 1.3
  • c0ffee.rimworld.animations diff --git a/LoadFolders.xml b/LoadFolders.xml index 4093021..1ed37eb 100644 --- a/LoadFolders.xml +++ b/LoadFolders.xml @@ -9,5 +9,10 @@
  • 1.2
  • Patch_HatsDisplaySelection/1.2
  • + +
  • /
  • +
  • 1.3
  • +
  • Patch_HatsDisplaySelection/1.2
  • +
    diff --git a/Rimworld-Animations.csproj b/Rimworld-Animations.csproj index ee98d47..e183076 100644 --- a/Rimworld-Animations.csproj +++ b/Rimworld-Animations.csproj @@ -39,8 +39,12 @@ ..\..\..\..\workshop\content\294100\839005762\1.2\Assemblies\AlienRace.dll False + + ..\..\RimWorldWin64_Data\Managed\Assembly-CSharp.dll + False + - ..\rjw-master\1.2\Assemblies\RJW.dll + ..\rjw\1.3\Assemblies\RJW.dll False @@ -93,6 +97,7 @@ + diff --git a/Source/AnimationUtility.cs b/Source/AnimationUtility.cs index 5bb091a..ca284e7 100644 --- a/Source/AnimationUtility.cs +++ b/Source/AnimationUtility.cs @@ -51,7 +51,7 @@ namespace Rimworld_Animations { " ", localParticipants[i].Name.ToStringSafe(), " does not match required gender" - }), false); + })); } return false; } @@ -276,5 +276,15 @@ namespace Rimworld_Animations { return true; } + + public static Rot4 PawnHeadRotInAnimation(Pawn pawn, Rot4 regularPos) + { + if(pawn?.TryGetComp() != null && pawn.TryGetComp().isAnimating) + { + return pawn.TryGetComp().headFacing; + } + + return regularPos; + } } } diff --git a/Source/Comps/CompBodyAnimator.cs b/Source/Comps/CompBodyAnimator.cs index 568afb2..8ce0aca 100644 --- a/Source/Comps/CompBodyAnimator.cs +++ b/Source/Comps/CompBodyAnimator.cs @@ -32,7 +32,6 @@ namespace Rimworld_Animations { actorsInCurrentAnimation = null; } - PortraitsCache.SetDirty(pawn); } } private bool Animating = false; @@ -179,6 +178,9 @@ namespace Rimworld_Animations { base.CompTick(); if(isAnimating) { + + GlobalTextureAtlasManager.TryMarkPawnFrameSetDirty(pawn); + if (pawn.Dead || pawn?.jobs?.curDriver == null || (pawn?.jobs?.curDriver != null && !(pawn?.jobs?.curDriver is rjw.JobDriver_Sex))) { isAnimating = false; } @@ -187,7 +189,7 @@ namespace Rimworld_Animations { } } } - public void animatePawn(ref Vector3 rootLoc, ref float angle, ref Rot4 bodyFacing, ref Rot4 headFacing) { + public void animatePawnBody(ref Vector3 rootLoc, ref float angle, ref Rot4 bodyFacing) { if(!isAnimating) { return; @@ -195,19 +197,23 @@ namespace Rimworld_Animations { rootLoc = anchor + deltaPos; angle = bodyAngle; bodyFacing = this.bodyFacing; - headFacing = this.headFacing; - - - } + public Rot4 AnimateHeadFacing() + { + return this.headFacing; + } + + public void tickGraphics(PawnGraphicSet graphics) { this.Graphics = graphics; } public void tickAnim() { + + if (!isAnimating) return; if (anim == null) { @@ -231,6 +237,9 @@ namespace Rimworld_Animations { } + + + } public void tickStage() diff --git a/Source/JobDrivers/JobDriver_SexBaseRecieverLovedForAnimation.cs b/Source/JobDrivers/JobDriver_SexBaseRecieverLovedForAnimation.cs index d8d99d2..9efa508 100644 --- a/Source/JobDrivers/JobDriver_SexBaseRecieverLovedForAnimation.cs +++ b/Source/JobDrivers/JobDriver_SexBaseRecieverLovedForAnimation.cs @@ -65,7 +65,8 @@ namespace Rimworld_Animations { get_loved.handlingFacing = true; get_loved.AddPreTickAction(delegate { if (pawn.IsHashIntervalTick(ticks_between_hearts)) - MoteMaker.ThrowMetaIcon(pawn.Position, pawn.Map, ThingDefOf.Mote_Heart); + FleckMaker.ThrowMetaIcon(pawn.Position, pawn.Map, FleckDefOf.Heart); + }); get_loved.AddEndCondition(() => { diff --git a/Source/JobDrivers/JobDriver_SexCasualForAnimation.cs b/Source/JobDrivers/JobDriver_SexCasualForAnimation.cs index 7b9aba0..285c542 100644 --- a/Source/JobDrivers/JobDriver_SexCasualForAnimation.cs +++ b/Source/JobDrivers/JobDriver_SexCasualForAnimation.cs @@ -65,7 +65,7 @@ namespace Rimworld_Animations { } if(Gen.IsHashIntervalTick(pawn, ticks_between_hearts)) { - MoteMaker.ThrowMetaIcon(pawn.Position, pawn.Map, ThingDefOf.Mote_Heart); + FleckMaker.ThrowMetaIcon(pawn.Position, pawn.Map, FleckDefOf.Heart); } SexTick(pawn, Partner); SexUtility.reduce_rest(Partner); diff --git a/Source/MainTabWindows/MainTabWindow_OffsetConfigure.cs b/Source/MainTabWindows/MainTabWindow_OffsetConfigure.cs index 6cc2b13..2ce39df 100644 --- a/Source/MainTabWindows/MainTabWindow_OffsetConfigure.cs +++ b/Source/MainTabWindows/MainTabWindow_OffsetConfigure.cs @@ -119,8 +119,6 @@ namespace Rimworld_Animations { listingStandard.End(); - base.DoWindowContents(inRect); - } public override void PreOpen() { diff --git a/Source/Patches/HarmonyPatch_HatsDisplaySelection.cs b/Source/Patches/HarmonyPatch_HatsDisplaySelection.cs index 10ada03..1cd5707 100644 --- a/Source/Patches/HarmonyPatch_HatsDisplaySelection.cs +++ b/Source/Patches/HarmonyPatch_HatsDisplaySelection.cs @@ -54,7 +54,10 @@ namespace Rimworld_Animations { for (int i = 0; i < instructions.Count(); i++) { - if (codes[i].OperandIs(drawMeshNowOrLater)) { + if (codes[i]. + + +(drawMeshNowOrLater)) { yield return new CodeInstruction(OpCodes.Ldarg_0); yield return new CodeInstruction(OpCodes.Ldfld, AccessTools.DeclaredField(AccessTools.TypeByName("HatDisplaySelection.Patch"), "pawn")); diff --git a/Source/Patches/HarmonyPatch_PawnRenderer.cs b/Source/Patches/HarmonyPatch_PawnRenderer.cs index 94ad8d6..6e31a1d 100644 --- a/Source/Patches/HarmonyPatch_PawnRenderer.cs +++ b/Source/Patches/HarmonyPatch_PawnRenderer.cs @@ -11,112 +11,74 @@ using System.Reflection; using System.Reflection.Emit; namespace Rimworld_Animations { - + [HarmonyPatch(typeof(PawnRenderer), "RenderPawnInternal", new Type[] { - typeof(Vector3), - typeof(float), - typeof(bool), - typeof(Rot4), - typeof(Rot4), - typeof(RotDrawMode), - typeof(bool), - typeof(bool), - typeof(bool) - } - )] - public static class HarmonyPatch_PawnRenderer { - - [HarmonyBefore(new string[] { "showhair.kv.rw", "erdelf.HumanoidAlienRaces", "Nals.FacialAnimation" })] - public static void Prefix(PawnRenderer __instance, ref Vector3 rootLoc, ref float angle, bool renderBody, ref Rot4 bodyFacing, ref Rot4 headFacing, RotDrawMode bodyDrawType, bool portrait, bool headStump, bool invisible) { - PawnGraphicSet graphics = __instance.graphics; - Pawn pawn = graphics.pawn; - CompBodyAnimator bodyAnim = pawn.TryGetComp(); - - if (!graphics.AllResolved) { - graphics.ResolveAllGraphics(); - } - - - if (bodyAnim != null && bodyAnim.isAnimating && !portrait && pawn.Map == Find.CurrentMap) { - bodyAnim.tickGraphics(graphics); - bodyAnim.animatePawn(ref rootLoc, ref angle, ref bodyFacing, ref headFacing); - - } - } - } - - [StaticConstructorOnStartup] - public static class HarmonyPatch_Animate - { - - static HarmonyPatch_Animate() { - // hats display selection patch -- broken - /* - if (LoadedModManager.RunningModsListForReading.Any(x => x.Name == "Hats Display Selection")) { - HarmonyPatch_HatsDisplaySelection.PatchHatsDisplaySelectionArgs(); - } - else { - PatchRimworldFunctionsNormally(); - } - */ - - - PatchRimworldFunctionsNormally(); - - } - - - static void PatchRimworldFunctionsNormally() { - (new Harmony("rjw")).Patch(AccessTools.Method(typeof(PawnRenderer), "RenderPawnInternal", parameters: new Type[] - { typeof(Vector3), typeof(float), typeof(bool), typeof(Rot4), - typeof(Rot4), typeof(RotDrawMode), - typeof(bool), - typeof(bool), - typeof(bool) - }), - transpiler: new HarmonyMethod(AccessTools.Method(typeof(HarmonyPatch_Animate), "Transpiler"))); + typeof(PawnRenderFlags) } + )] + public static class HarmonyPatch_PawnRenderer + { - [HarmonyAfter(new string[] { "showhair.kv.rw", "erdelf.HumanoidAlienRaces", "Nals.FacialAnimation" })] - [HarmonyReversePatch(HarmonyReversePatchType.Snapshot)] - public static IEnumerable Transpiler(IEnumerable instructions) { - - MethodInfo drawMeshNowOrLater = AccessTools.Method(typeof(GenDraw), "DrawMeshNowOrLater"); - FieldInfo headGraphic = AccessTools.Field(typeof(PawnGraphicSet), "headGraphic"); + [HarmonyBefore(new string[] { "showhair.kv.rw", "erdelf.HumanoidAlienRaces", "Nals.FacialAnimation" })] + public static void Prefix(PawnRenderer __instance, ref Vector3 rootLoc, ref float angle, bool renderBody, ref Rot4 bodyFacing, RotDrawMode bodyDrawType, PawnRenderFlags flags) + { + PawnGraphicSet graphics = __instance.graphics; + Pawn pawn = graphics.pawn; + CompBodyAnimator bodyAnim = pawn.TryGetComp(); - List codes = instructions.ToList(); - bool forHead = true; - for(int i = 0; i < codes.Count(); i++) { + if (bodyAnim != null && bodyAnim.isAnimating && pawn.Map == Find.CurrentMap) + { + bodyAnim.animatePawnBody(ref rootLoc, ref angle, ref bodyFacing); - //Instead of calling drawmeshnoworlater, add pawn to the stack and call my special static method - if (codes[i].OperandIs(drawMeshNowOrLater) && forHead) { - - yield return new CodeInstruction(OpCodes.Ldarg_0); - yield return new CodeInstruction(OpCodes.Ldfld, AccessTools.DeclaredField(typeof(PawnRenderer), "pawn")); - yield return new CodeInstruction(OpCodes.Call, AccessTools.DeclaredMethod(typeof(AnimationUtility), nameof(AnimationUtility.RenderPawnHeadMeshInAnimation), new Type[] { typeof(Mesh), typeof(Vector3), typeof(Quaternion), typeof(Material), typeof(bool), typeof(Pawn) })); - - } - //checking for if(graphics.headGraphic != null) - else if (codes[i].opcode == OpCodes.Ldfld && codes[i].OperandIs(headGraphic)) { - forHead = true; - yield return codes[i]; - } - //checking for if(renderbody) - else if(codes[i].opcode == OpCodes.Ldarg_3) { - forHead = false; - yield return codes[i]; - } - else { - yield return codes[i]; - } } } - } + + public static IEnumerable Transpiler(IEnumerable instructions) + { + bool forHead = false; + + foreach (CodeInstruction i in instructions) + { + + + + + if (i.opcode == OpCodes.Ldfld && i.OperandIs(AccessTools.Field(typeof(PawnGraphicSet), "headGraphic"))) + { + + forHead = true; + yield return i; + } + + else if (forHead && i.operand == (object)7) + { + + yield return new CodeInstruction(OpCodes.Ldarg_0); + yield return new CodeInstruction(OpCodes.Ldfld, AccessTools.Field(typeof(PawnRenderer), "pawn")); + yield return new CodeInstruction(OpCodes.Ldloc_S, operand: 7); + yield return new CodeInstruction(OpCodes.Call, AccessTools.Method(typeof(AnimationUtility), "PawnHeadRotInAnimation")); + } + + else + { + yield return i; + } + + + } + + } + + } + + + + } diff --git a/Source/Patches/HarmonyPatch_PawnRotation.cs b/Source/Patches/HarmonyPatch_PawnRotation.cs index 9fb95ef..d09b1f6 100644 --- a/Source/Patches/HarmonyPatch_PawnRotation.cs +++ b/Source/Patches/HarmonyPatch_PawnRotation.cs @@ -25,4 +25,25 @@ namespace Rimworld_Animations { } } + + [HarmonyPatch(typeof(PawnRenderer), "BodyAngle")] + public static class HarmonyPatch_PawnAngle + { + public static bool Prefix(Pawn ___pawn, ref float __result) + { + + if(___pawn.TryGetComp().isAnimating) + { + __result = ___pawn.TryGetComp().bodyAngle; + return false; + } + + return true; + + } + } + + + + } diff --git a/Source/Patches/HarmonyPatch_SetPawnAnimatable.cs b/Source/Patches/HarmonyPatch_SetPawnAnimatable.cs new file mode 100644 index 0000000..4ddff2c --- /dev/null +++ b/Source/Patches/HarmonyPatch_SetPawnAnimatable.cs @@ -0,0 +1,40 @@ +using HarmonyLib; +using RimWorld; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection.Emit; +using System.Text; +using System.Threading.Tasks; +using UnityEngine; +using Verse; + +namespace Rimworld_Animations +{ + [HarmonyPatch(typeof(PawnRenderer), "RenderPawnAt")] + public static class PawnRenderer_RenderPawnAt_Patch + { + static bool ClearCache(Pawn pawn) + { + return pawn.IsInvisible() || pawn.TryGetComp().isAnimating; + } + + public static IEnumerable Transpiler(IEnumerable instructions) + { + var list = instructions.ToList(); + + foreach (CodeInstruction i in instructions) + { + if (i.OperandIs(AccessTools.Method(typeof(PawnUtility), "IsInvisible"))) + { + yield return new CodeInstruction(OpCodes.Call, AccessTools.Method(typeof(PawnRenderer_RenderPawnAt_Patch), "ClearCache")); + } + else + { + yield return i; + } + } + } + } + +} diff --git a/Source/Patches/HarmonyPatch_SetPawnLaying.cs b/Source/Patches/HarmonyPatch_SetPawnLaying.cs new file mode 100644 index 0000000..1eef30f --- /dev/null +++ b/Source/Patches/HarmonyPatch_SetPawnLaying.cs @@ -0,0 +1,28 @@ +using HarmonyLib; +using Verse; +using RimWorld; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Rimworld_Animations +{ + [HarmonyPatch(typeof(PawnUtility), "GetPosture")] + public static class HarmonyPatch_SetPawnLaying + { + + public static bool Prefix(Pawn p, ref PawnPosture __result) + { + if(p.TryGetComp().isAnimating) + { + __result = PawnPosture.LayingOnGroundNormal; + return false; + } + + return true; + } + + } +}