From db4c2d3833e01e8cc01528c4831b14d799a4a516 Mon Sep 17 00:00:00 2001 From: c0ffee Date: Wed, 17 Apr 2024 16:57:18 -0700 Subject: [PATCH] Added animation selecting based on defined contexts --- 1.5/Assemblies/Rimworld-Animations.dll | Bin 21504 -> 23552 bytes 1.5/Defs/AnimationDefs/TestAnimation1.xml | 25 +-- 1.5/Defs/AnimationDefs/TestAnimation2.xml | 36 ++-- .../TestGroupAnimation1.xml | 71 +++----- 1.5/Patches/AnimationPatchHSK.xml | 31 ++++ .../AnimationPatch_CompExtendedAnimator.xml | 35 ++++ 1.5/Patches/CompPatches/AutoCleaner.xml | 19 +++ 1.5/Patches/CompPatches/CombatExtended.xml | 18 ++ 1.5/Patches/CompPatches/ZombieLand.xml | 18 ++ 1.5/Patches/CompatibilityPatch_HCSK.xml | 39 +++++ 1.5/Source/Comps/CompExtendedAnimator.cs | 18 ++ .../Comps/CompProperties_ExtendedAnimator.cs | 17 ++ .../BaseGroupAnimationContext.cs | 18 ++ .../GroupAnimationContext_RJWSex.cs | 29 ++++ .../GroupAnimations/GroupAnimationDef.cs | 32 ++++ .../GroupAnimationStages/AnimationStage.cs | 0 .../AnimationStage_Branch.cs | 2 +- .../AnimationStage_LoopRandomSelectChance.cs | 12 +- .../AnimationStage_TicksDuration.cs | 0 1.5/Source/Keyframes/ExtendedKeyframe.cs | 2 +- ...HarmonyPatch_JobDriver_SexBaseInitiator.cs | 22 +-- ...onyPatch_JobDriver_SexBaseReceiverLoved.cs | 46 ------ ...onyPatch_JobDriver_SexBaseReceiverLoved.cs | 23 +++ ...onyPatch_JobDriver_SexBaseReceiverRaped.cs | 23 +++ .../HarmonyPatch_PawnRenderNode.cs | 2 +- .../HarmonyPatch_PawnRenderTree.cs | 35 ++++ .../HarmonyPatch_Pawn_DrawTracker.cs | 14 +- 1.5/Source/Utilities/AnimationUtility.cs | 155 ++++++------------ Rimworld-Animations.csproj | 23 ++- 29 files changed, 506 insertions(+), 259 deletions(-) create mode 100644 1.5/Patches/AnimationPatchHSK.xml create mode 100644 1.5/Patches/AnimationPatch_CompExtendedAnimator.xml create mode 100644 1.5/Patches/CompPatches/AutoCleaner.xml create mode 100644 1.5/Patches/CompPatches/CombatExtended.xml create mode 100644 1.5/Patches/CompPatches/ZombieLand.xml create mode 100644 1.5/Patches/CompatibilityPatch_HCSK.xml create mode 100644 1.5/Source/Comps/CompExtendedAnimator.cs create mode 100644 1.5/Source/Comps/CompProperties_ExtendedAnimator.cs create mode 100644 1.5/Source/GroupAnimations/GroupAnimationContexts/BaseGroupAnimationContext.cs create mode 100644 1.5/Source/GroupAnimations/GroupAnimationContexts/GroupAnimationContext_RJWSex.cs create mode 100644 1.5/Source/GroupAnimations/GroupAnimationDef.cs rename 1.5/Source/{ => GroupAnimations}/GroupAnimationStages/AnimationStage.cs (100%) rename 1.5/Source/{ => GroupAnimations}/GroupAnimationStages/AnimationStage_Branch.cs (90%) rename 1.5/Source/{ => GroupAnimations}/GroupAnimationStages/AnimationStage_LoopRandomSelectChance.cs (79%) rename 1.5/Source/{ => GroupAnimations}/GroupAnimationStages/AnimationStage_TicksDuration.cs (100%) delete mode 100644 1.5/Source/Patches/RJWPatches/JobDrivers/HarmonyPatch_JobDriver_SexBaseReceiverLoved.cs create mode 100644 1.5/Source/Patches/RJWPatches/JobDrivers/SexBaseReceivers/HarmonyPatch_JobDriver_SexBaseReceiverLoved.cs create mode 100644 1.5/Source/Patches/RJWPatches/JobDrivers/SexBaseReceivers/HarmonyPatch_JobDriver_SexBaseReceiverRaped.cs create mode 100644 1.5/Source/Patches/RimworldPatches/HarmonyPatch_PawnRenderTree.cs diff --git a/1.5/Assemblies/Rimworld-Animations.dll b/1.5/Assemblies/Rimworld-Animations.dll index 634cfa93563cced5a2c595f3f14c72e54f2b243d..a394dd9c818cdc8c457ca41b2d8ad6703a148e44 100644 GIT binary patch literal 23552 zcmeHv3w&H?Y)r{B2w{w?KPs$*|b+KKvs(QNFuO*|8Lm+&SEi@I#<%?O8$=y3qR^Gl)2uVq&L zUwt|tqwu;0a(8g0MD*X;5HnwQ64e1W0>0B`(%uM85cynmAK(jIa9cqiF91H)ivlz; zR!46@;*}t}yv?-CG$5f{2^DtKZoFNu^>A04spkwZvaWO|-Yjb`-mcerq75!kR6oyl z#fx>5$wQBKSqQIemsKV~rp&(Zm za8prOvp`SAnF(V8e-l?jTushKm6k3zp>npYsGg9TJca4BG}f+?fq~$EgcN!5RG=s4 zpoklAWnl7j6vyTGajD+lvXD-o7o#xA77`}_oRy5$kxT@}cgYmlN%WD+$x%A;N#Y)O3932f z@kTsJ%(>>pV$Nd5!jUTGDQ17`6W*8?5#qJ&rqXfri_Bc^cj|1g3U96DHrj>g#6lI` zVoDP3Z4M~&*6h{xK^aF`;~X&5H}8%rNvs-ym`c8gI=LGBm(+QEBD*@7Pz9dHG=&!K zZZ6_()`@PIl7uIl`y$DknRc zXX%CoRQgjF+JCuAEOXEy*6yK8&<`Rpg6M3Jk{iH^N08D;yG$wc;TJwn!axCRTeB2ttxCN494$E_IO`T88_dG?Y>vNquG6<07f2$d2COSk)FXu; zKm&-`xS|={-e6@7=9rEl$+MF^6>r7bCC-V+`tVh}Jey~Ondgr}%Ov6?5h1k*q||c2 ze%jhcP8(Q$T8l}EC&!s& z>jr0Fwl_GCLxK{M6Lymr@_P$UM#5YJ0YYCe)-(zGyif}s80-AgXD~3u+PZG{*4r-GOPEJ8eQ#^SU z9(6wLxQ2A3StUS8AGj8Kn|#LG0g-hz%6dOIb}+{^fDT=Y!aLhNfrv=I4!s2A z9^;*OiU0}%xE?^Am*;%cd-4dX_oFLb!`DIp3#tl;d7%u#T59o5wV`wF(}$kk1)(v2 zJQnbaIP)gqljbDSVRI}P2}bLAVbNlBkvf(fiiBE16bVM^BK67jAYinJ10~iFX=sU~ zzX*mj`EH2Z8wp%`h%4fJCDS6PBYZh^COVhxD7pdkB(hyIyon7LTnTq#<7Uo&52l^8 zC~n?@#C`XoCi6@DEOFDN=auclE1%dLvF($Pk69YAdVplVp9fy{I}%Vc9Ef$rcA)V- zR;n6k+z#y*;)#_eVqx78?XjQW_GsGodQJK4@_V!sFFAQ53%&~eRL$=}-FTdLpUret zJ7bz87p8?VeQpfYSIv*OG3+DrTW-t}#>|pka+(>l#f{;xGOu!DS{d^-H)bhgJPM6r z3fLMhXUs*wEWl9K$CC|0?-h)_4p@u?uER)HGUh28gGpwe0B#ocA-knqqHqG*eP(>?+owkwx=8LFs(sRu-X|txRK`PC^@C8tZrx+DDnj zqd0*!#aLv`Mo9lYxVXFW_6n$i2MyW3Cp6T|JDA3PJqhherm+c6Li-cb*o-Hkd1ODwozTQJpxj*Jhp5V=V#Y%UtsQ-=l@^Bly!jL<-= z!xxaO&1j%Zo`x22alF#hOJw6P|-`cW=Km!vgaf)pb7j>EI9pInOb zqbx4P&^aPsHtqy>p!qbM5AQ+^N5`syjgA!1?gp*(yY|@;qb?sxptpTy^wW~%_F3Xq zl3V5Gxw5lMQ5H8xoedJI-o~U*OpI3{Y$thd8?pMGT(utK!>;rYb_;6qW9Tz(+=Frw z%YVQ=Vhb#C8Ft5-bsx}CDT#F1yjamDxmCXx=^d-N>aA~98^yV{&DsR!(kf7^*)p%3 zxbPrec!jGnwOQTVa&1jZY*SY=0?$vN|H>0veb`iN#(B-Z2xH@yELLi<4@=$;dh2Qz z#@-7&0CZczg|@3=?M!|WM6nZ!+jmUwhs;yicP{=J`z(wBEwB{jXo_XK#XVSo#VVX+ zIQc0Q!4u^DH(h!H^*mu8sG_?&I>m+84oeVwGwRy8?RdS05-scGl;w-ot%jM z+jE8E)JRkQ{nHet`fpGDxyZwF) zi~b<3;E67wTEM#nZzx9yK*Ao3FnF=%!bpOL`S@Liv9l2SYp8|S;{m3zMc(86VMwDt zi1G>TnotAD4UB(D`)Lpv%FE?WQNAe3Pl@t~C`pvhX7RoL&wDDA$nJ0`!WH%QNe^{9TmGt5hyOBXRk250^VY z)o8!Ot+^mrsd4=7w_(PNzAjf$+%EbZk$oR0YwjODzr&`q@ZgWze< z7@tC4QF;hEM5()x%PE=l`5mzZ9tb=s1!#%PYMpZ>@h)iqbE`-0wngYV;7wQ)#y6 znz{geKybc2#{8cZ_VhLWG#H@y!k&)_%M1z0=cBIx{YQ|?*`ge3WNoJ~t^nOHIKLd@ z9yf}9`_v~TjeabA`VV2Qe?RzgAW8*|$F*CO*9BOs_xM@=kBA=c6qd}wk{W$jjH^yy zRN;3MJqBnc^bF8Hi*mM)d(_Y)$L<$I$@5XdOv;6(!kwbdP$wOrz&RKJK9jcMH>yxi7}h zDL9>T?>7T#!OUwA&~xCto#r4_GUxLubI!%ynmO#C3D{EKxYctFY0X0B?7t-nsGbMdtv&Zur5Q~Zpe|@A~+v)INJnt0M_Mp%cz9@ z{K770QoDd2RhX8f6++6N1!t003MlW;&Jxhi8m7V#DM@PtWQ3=}r%0>l9MQwBMwYUQ z&L?Glm|Bq}8QKV6hbe{(+DWTvi;K1vpRp;>g~O#2xpJEeI*)o>(D~FWpeqFDdVDm9 z`PQ%=*{U_n<#~}UC_fY8`pflukr(c(JECYb?C1JZGMCqRxV*7p2e*n|jPl&*r6@mG z$E}VEY2Wp5t8=3Rzyv&LlntU>8sz$i0$hGMlJ-cn)VJRgr$y2@%6FmEXnS-LT0PeA zHq-+Vu16ZKMg6|Wdr)d&uD=jw{E_f2kZ>mI5`D7a4&c8Ud!4?xj?{h9 z6QS;ghamsG7*U)IQEpPXetm??PX@XCRe;Oi3;ZI1e^p}4fX&(Xc}Tc0@&%M%4L;>L zi#{hkgL<64#eFrhKCA=dj{$!+y@+z9^a{%R=oRpst^Q7we-tGlBlJeT4{dLkCaEU@ zhtNA_4S>jr*)khwy?~Ao(;BGYY8RoBix#2(uxYd>+OEZ@ z5$FDL53?vCAX~~T+U24((OYVuqRr{s>|3if(L0@X1CdkZCVItzPQ!j-HtoSqhi$eI zmYz*{0ogX2O$P;J+iW(yt3vCOXVWcCyZ1#kWYdRSoTt!t1avDs7duZog)%th5i!)Q z%^`7wb!;}5+BsmMyq06-dEfkQg%Y167(1x}7G|ZbSN6HyACLr#?($1iJ z9OzhVQd>+398p>3vDmw{B%O;RE<;BnH)~61R6zFlmeRW%+H>GsN{1cjSnNai5ab&I zvUO>tV-?y1S}O&yA1v##j2Z=Wgr3F9x{R7|8m-b20)KiL zP6t{R{HC^=ek~wdm$h_UK=%07l6NIbxf<)+_qDaOP(U{AY{Ccjc-igFrZqLRPN!WL z{X{#Px*cep^on*4?R20|(<|D!w8zzM9c3KaZIqDK(H9-)+sH)gXfIA-WecvOw1BRr z+XU@k4UNxhthG)1Kn?994(%%XwZ?mJiRSuw*S@TdKa*8sI6Ke>RmQ&^JNRL#UFBU|OJqOoyXo zYMI~G|Mx;pGg6S7$6c4`c~I?E<+fF6WzHW9`L|McFCJZc*+OSH+Ft&Sa`C+MosHz_M$ zQ~xh?RQi4R7){8(jJ=2*Q*Zc}bS_;I@=F`(JJC5P`(p`dTHcO)+aWaHDtg>1bm$l5 zWdf5CyCcP-+ z?2)dIh2%Zb&qVo>pX=jME{8%x#hvh%T(x`tfkd>dMVErV@ zudCDY{Ze~iik_vPVQ+Gmw8Z}o`FUE__%2X?9KKC{On%09hkR7-leyfA@>zN|`Z2V6 zulh0h3HosTqw>Sj*7`5X&&p3g+EHm<{S&}^GyJst0qFUf^Z{DyOGtj1utRxXjx_$8 z+#>9GRO-U+?5MO5d#Yk=Ib(sB!rcEHEMaw7v36@+OZ@ zIV#Fp~GV|Ux@?&F*zZ70!P5v8$OEi zoY;$y^FM>XROZXP%Is7=8u+8K2W5jgU*9t)`@B+O2#w zatSau*1ZK(UTL0{v%##|BI50U^0cR*W`unn#3`TzJjd-LBDx+C5%ooC_dlpUDR??0 z-W`8kjPZH-;pmgAo)oK|j-zptJmeMmV~c~*MA{1f$h|zHk`f|p1Wcfq_gDnPg_2iYCyb%*q?cGu^gmmV0{n6<`o zsfn&!%Cg!A+UeZ$)(#AGaHT7i@62aMQ-!RN-=OcZ^vrpK4vBeIGS9GHsPJqxjIkYK zf_vg(Jv%&7V1B_ivm=4roXuypm_~7|B7ylKw8yXtL)mc$vis_IbA5r$)w+W=7xU@M zJ7{|`mrD)ibX2=H<%^@b=|CIxp^d3RYA|Int;f_e*>tMF^{rW}fJeV>RYwTvwl>S( zoHont{+CmKaSWX=r;XV(+b3mC0D$cVx(oU!$nH*-lc^hKMmLw!ZarNvD$fb>w{+B809SUQh~E;h_urpp)|GxB=AFtBSZgHdfuW%K>1 zK{AGhEWND z4CAocw&;1?%%-VxY%GPZ3SXe7GSr#L(1v0*m%+vGzy>`d2Fg#Tx1LlXJu(2H8_n#M zx`|pg-;D^%P&PkcrAGCELDVZjfuZaN*G2lo5WfDcTbsrUdOiaVOXnum=3;t3DqSOb zdjFs?zBM(d=Kxpb_vzys;NM<7oz>A_Z)yzW*U_cQtFvx4?}-zE(kIM~*Y9wvapjxt z(B?&C6kv;-XxN(_72c$S?9;!Xcy~Tq$fgi918^UE1*W1N%x?^=&nN=0M7c#TAcRDa zvzPh`seC47x~vY&us*<3x)&s4v=2s27rI7L`Ls?01KGTVCa4N=J76j^o6!lb9YMzs zty4xHEDnnrr0f@!8l(554(5B=lje42Hw~j8DtU%BnyG`^i>SO#lYUc26VX~!3k+}5 zEel##Lq`k(YzK;%VDNt`J)+Z4%AV1i4RdEPo8F&A!&FYE&H5-mI<0Dgpl;5NhQ-N( z28)G)k>8!QvJ746Jhxy@VV(^cW?{2wjCSd{T=x)Ckj>Rw%onnwdjG_jegVvgb}&3c z%-8Bt%XN?@P4wM`Nem7?-7j+xlP&5a@KwYNJ4|~P~ zMB2i5O_5tb$aEI)Ars6G>lL#uXd_41FgvHpfyR!Ds<=+e(nkk#6aCqOo3(;AQyKW) z++S_cpE5BAH*>zhtaA~{Z8k$e9ubmYwN;r|Hjh|2Pb6>Dt+bgH3uTpP4_dV7)pMzF zQM0P_vg{rc{!SN8By<^L6DBXZCnJrHrScP1f)ke9C;A!8<`7aT8 z#zVClUZEK0te=kc+no4eO21)$j#^I0 zwAC1%k;Vo#m`J!IwSBQ=>_xOY--lquA}Utb8ZM#u!EB~5LOCNp?CdqR>iJ<{OeBw< zRC+%lk05Tbv=#)|ZNbAM!cteJa-3Q0@s}e(U^sw8#mR=91p(Ria)27!U=)U>dtnDP=)%6qqI4d&F#n|Mdx`ZxC3h^ZP1Zui5*ENZda)fskt`b zfJ&K#nK;)b*=DF{Jk!Z+9cyFJ6w{wF& zrw=)sHXdJf3&-Y%-!s@Y;CnC?y{db8G25`>4~$_V!zpP*gUF8E`5{Ai#v0&Y7e*T9 zh`}#F}(~`f}Jpm}0rkVj~VU8637B z&YlW$TBy7aQIxg2O@V3dP!rB?S5xvbr@; z-XGXwhgA08Ns+EbBCXZ5sKsp23(gjb^=xB@6M_*Xa<0IL#}&q)RrdeJY-%`uS+p4$jOW_v)G6R9dezFK1Mdu8grh-Mlh;5;6~tHx?DTy@5ai=H019sd91? z`$lWVI#ad43@g%hBM%>7h`mlSMVRpR%PQ}~tm?$FgR6R)q5b7^4Gr2W5AVP*GHekB z^#QTQx-{d(2eaF~ep$TqS)9N7#IXVOi_L67uRxW+u3+GyN*z0Z5sPzzNIjL5V?&6f z0XSv9<(`$iO|^}~A&Mz7YVia?$qNXUaO-5LnNO(IIaXzHREZoP7%i zbv-{&7%__$uxV~SjtZZ>hV>q6V#r7rEi6_Awl{7oocOa9LvY}rQ=lD#SMY-qiJh(~ z>pZbQ0n08zEaoz8I34BzcjmHso@bRkD6tRXP;@{JP8Vp1bAY3AP9G}RmP39+72+#y ztS%%QoJ%30(}=hqB4cczdvq)Zn-zF{O>u(bw1xG?)U9H!ATqCGQtCG+?8E4$953R9 z8MhqF%UB+>b8}%^uZ+W{6yq#U@*Wsnh_B5!CnWGn8s$?mn(#hgYs$i>1qN>ek)UzB zEb5!HCV*`?vTujGh*N*Xs>^;kMjHq0- z#Hz^2J8!XUezo=!E*J1!z$|Wbhbe*D24;vj7!P(kW%U2@2x4Dz(9+E6}3cADy|4il7#O!FE*OGtkNago`Nj zHH>fA^bpN+^RX8D(U&3G3i{e!x{xjwch$8zTh0wOW05b=Y7ni4F%knk=p>!NCI{jGzP9d5hqTct6#50EA$%y zcM8356zo91ThZs0!jDo{Z9Dc$5A2eni5VJhN1Hs_>oo4fMJJ_W!<>pBLB6VO+O zrP$uA!w%?Eww|=9R*Pz6vOacfmhIICJ&I_bfdqT(CPwm?V}`9z_E0z47lbC*VxTrb z(z-X&pgb?Cdby*{`U}xIbGFTB+w6|!1gumZU*d!jQb(8YLOFU9GvYUKLIl(KWp5@B zX&kEs=tK&&v7I7RVW<(;L-&ye=>sIz4=a&5INOF6YN;mhS5l^~N$NB844BXlZ zRf_16#biJ~C~6C+3)oTM><(~;59$P94tW!jIDiWHpeP{%n1{?MCLuzz0E(TSIDHn- zmXj#U;B=P2hlMNf@shNp*5q!5%LcGRix$;#_Cgx#!KSE&6Roc0a!)rN8;`P_+;h;y zo_c4JbfD^-6GN=(l04efPCXu#J^2#&0Br;iPl(zC-2yFn>8Pe;eA8-et)?dngxbX< zL3UE5i`*k#R+I1&bmD|!z1Y*7?uwZHZ2jfTJs-AP?F+g{4PhCa6Y^aANPyp-0E>@> zC16Xx0?K*JC4ZpYd7~HI`fLSDhtVetbJ!2YySU=x#?YeN`Yy=!c>)+YbQ2>MN;304 zp9=gwb~;?)l_RB3MN1E3v~^y%vJNi|Bw&3B1!bsC1Vx?ZRfU&kMW<)Up~y}Qk1KT^ z{8n`?iLP$shSAcOWKH&XQF#iVc}J)B2<-HpfLDt)+L7T&06(Ao^PHkZM!h5h9~t$) z*^ROw?qd(85I~424@ZDJE3ykwC#a?8nVN-{qAAVBqaN9&cwqytCZb7p0xuN^Bcj>% zbBV{D;?AO_7kxes@)T+saYa_WXeatU#L^E%y=t^{4>ydKerx{^LzFGaF|-)tA1gP5HU%l?E%3WdQ^hbRhp zNDhTUT0-Gaf=faiY0-VKuTRET^L(&_m@7QVq@Wj$Cg2XAk`+wg^}rJk)}TP*2{LEvhoMlYeJWh6K8eKvl}rR zMo@3Vdna%#YiFHcb;b>beLi~}NKbZUjq_|N6An8Fo(H9Sx%ez&5Gf&9tMj93&qC%G z(~wziV@RY(hVBe7WM>C%;LLqcegX2dpNo3;QACJb(h?8Gn8eQ*@g^`20sbnPXgcp2bW&7y%Co2 z^AxoB1)>cD!nE;{B!w}{?Iza?^0dD~Mqii>_2Bp|evl%jU^KuZ6c+KS>(e%sli*W~wTbxbfXBVlpGYikUyiRJFOles)g6QFt1_!QTF+WNxV&{` zd&kPwHOteP){Zsl;v zwauE>gShl7zm9M{QHE-t<-b*FV+Zhkm5sR^e<{HJPMofbPnDVa+9Jr9*-fpm|AJ0p z0sd7bR#&1@Es>XHA}oa`;F<3Nye|PIhfPcQl~eeKF1vBjFo1Fst~vT}%-(^&)i;3W zcHHLd5UgKP|NXfAykx_@1$_B(<3vfH5IpS|xBYJ=4*jr!_$91_i=OJGkhq@~ zlKHo{#UjBuSWmLE%1K;q|47L literal 21504 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 diff --git a/1.5/Defs/AnimationDefs/TestAnimation1.xml b/1.5/Defs/AnimationDefs/TestAnimation1.xml index f106da7..6ca49b0 100644 --- a/1.5/Defs/AnimationDefs/TestAnimation1.xml +++ b/1.5/Defs/AnimationDefs/TestAnimation1.xml @@ -4,13 +4,8 @@ TestAnimation1 400 False - -
  • - Pawn -
  • -
    - +
  • Root @@ -19,58 +14,52 @@
  • 30 0 - North true
  • 100 0 - East true
  • 200 0 - South true
  • 300 0 - West true
  • -
  • Head diff --git a/1.5/Defs/AnimationDefs/TestAnimation2.xml b/1.5/Defs/AnimationDefs/TestAnimation2.xml index 712cb2c..81923af 100644 --- a/1.5/Defs/AnimationDefs/TestAnimation2.xml +++ b/1.5/Defs/AnimationDefs/TestAnimation2.xml @@ -10,23 +10,31 @@
  • Root - AnimationWorker_Keyframes + Rimworld_Animations.AnimationWorker_KeyframesExtended -
  • +
  • + (0, -1, 0) 0 23 + North
  • -
  • +
  • + (0, -1, 0) 6 -5 + North
  • -
  • +
  • + (0, -1, 0) 12 4 + North
  • -
  • +
  • + (0, -1, 0) 188 -1 + North
  • @@ -34,23 +42,27 @@
  • Head - AnimationWorker_Keyframes + Rimworld_Animations.AnimationWorker_KeyframesExtended -
  • +
  • 0 - 5 + 0 + North
  • -
  • +
  • 6 -5 + North
  • -
  • +
  • 12 4 + North
  • -
  • +
  • 128 - -1 + 0 + North
  • diff --git a/1.5/Defs/GroupAnimationDefs/TestGroupAnimation1.xml b/1.5/Defs/GroupAnimationDefs/TestGroupAnimation1.xml index 0bf9f68..701c56d 100644 --- a/1.5/Defs/GroupAnimationDefs/TestGroupAnimation1.xml +++ b/1.5/Defs/GroupAnimationDefs/TestGroupAnimation1.xml @@ -1,41 +1,41 @@  - + TestGroupAnimation1 2 - +
  • 200 -
  • Pawn1_Stage1_TestAnimation1
  • -
  • Pawn2_Stage1_TestAnimation2
  • +
  • TestAnimation1
  • +
  • TestAnimation2
  • 10 - +
  • 3 -
  • Pawn1_Stage2_Variant1
  • -
  • Pawn2_Stage2_Variant1
  • +
  • TestAnimation1
  • +
  • TestAnimation2
  • 1 -
  • Pawn1_Stage2_Variant2
  • -
  • Pawn2_Stage2_Variant2
  • +
  • TestAnimation1
  • +
  • TestAnimation2
  • - + - + +
    -
  • - -
  • Sex
  • - - 0 +
  • + +
  • Sex_Anal
  • +
  • Sex_Vaginal
  • + -
  • - -
  • Sex_Reverse
  • - - 1 - -
  • - -
  • Sex
  • - - -
  • Human
  • -
  • Dog
  • -
    - 0 - -
  • - -
  • Sex_Reverse
  • - - -
  • Dog
  • -
  • Human
  • -
    +
  • 1 + +
  • Sex_Reverse_Anal
  • +
  • Sex_Reverse_Vaginal
  • + +
    -
    +
    diff --git a/1.5/Patches/AnimationPatchHSK.xml b/1.5/Patches/AnimationPatchHSK.xml new file mode 100644 index 0000000..e061299 --- /dev/null +++ b/1.5/Patches/AnimationPatchHSK.xml @@ -0,0 +1,31 @@ + + + + +
  • Core SK
  • +
    + + + +
  • + Defs/ThingDef/comps + Always + + Defs/ThingDef + + + + +
  • + +
  • + Defs/ThingDef[@Name="BaseAnimalPawn" or @Name="SK_BasePawn" or @Name="BasePawnSkynet"]/comps + +
  • + +
  • + +
    +
    +
    +
    diff --git a/1.5/Patches/AnimationPatch_CompExtendedAnimator.xml b/1.5/Patches/AnimationPatch_CompExtendedAnimator.xml new file mode 100644 index 0000000..87f9f7d --- /dev/null +++ b/1.5/Patches/AnimationPatch_CompExtendedAnimator.xml @@ -0,0 +1,35 @@ + + + + Always + +
  • + Always + Defs/ThingDef[race][not(comps)] + + + +
  • +
  • + Always + Defs/AlienRace.ThingDef_AlienRace[not(comps)] + + + +
  • + +
  • + Defs/ThingDef[@Name="BasePawn"]/comps + +
  • + +
  • +
  • + Defs/AlienRace.ThingDef_AlienRace/comps + +
  • + +
  • +
    +
    +
    diff --git a/1.5/Patches/CompPatches/AutoCleaner.xml b/1.5/Patches/CompPatches/AutoCleaner.xml new file mode 100644 index 0000000..c6ba2bb --- /dev/null +++ b/1.5/Patches/CompPatches/AutoCleaner.xml @@ -0,0 +1,19 @@ + + + + Always + +
  • + /Defs/ThingDef[@Name="BaseBaseAutocleaner"]/comps + Always + + /Defs/ThingDef[@Name="BaseBaseAutocleaner"]/comps + +
  • + + +
  • +
    +
    +
    + diff --git a/1.5/Patches/CompPatches/CombatExtended.xml b/1.5/Patches/CompPatches/CombatExtended.xml new file mode 100644 index 0000000..aed123b --- /dev/null +++ b/1.5/Patches/CompPatches/CombatExtended.xml @@ -0,0 +1,18 @@ + + + + Always + +
  • + /Defs/ThingDef[@Name="BasePawnSimple"]/comps + Always + + /Defs/ThingDef[@Name="BasePawnSimple"]/comps + +
  • + + +
  • +
    +
    +
    diff --git a/1.5/Patches/CompPatches/ZombieLand.xml b/1.5/Patches/CompPatches/ZombieLand.xml new file mode 100644 index 0000000..87f618c --- /dev/null +++ b/1.5/Patches/CompPatches/ZombieLand.xml @@ -0,0 +1,18 @@ + + + + Always + +
  • + /Defs/ThingDef[@Name="BaseZombie"]/comps + Always + + /Defs/ThingDef[@Name="BaseZombie"]/comps + +
  • + + +
  • +
    +
    +
    diff --git a/1.5/Patches/CompatibilityPatch_HCSK.xml b/1.5/Patches/CompatibilityPatch_HCSK.xml new file mode 100644 index 0000000..576a07f --- /dev/null +++ b/1.5/Patches/CompatibilityPatch_HCSK.xml @@ -0,0 +1,39 @@ + + + + + +
  • Core SK
  • +
    + + Always + +
  • + /Defs/ThingDef/comps + Always + + /Defs/ThingDef + + + + +
  • + +
  • + /Defs/ThingDef[@Name="SK_BasePawn"]/comps + +
  • + +
  • + +
  • + /Defs/ThingDef[@Name="BaseAnimalPawn"]/comps + +
  • + +
  • +
    +
    +
    + +
    \ No newline at end of file diff --git a/1.5/Source/Comps/CompExtendedAnimator.cs b/1.5/Source/Comps/CompExtendedAnimator.cs new file mode 100644 index 0000000..17231e2 --- /dev/null +++ b/1.5/Source/Comps/CompExtendedAnimator.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using RimWorld; +using rjw; +using UnityEngine; +using Verse; +using Verse.AI; +using Verse.Sound; + +namespace Rimworld_Animations { + public class CompExtendedAnimator : ThingComp + { + List> animationQueue; + + } + +} diff --git a/1.5/Source/Comps/CompProperties_ExtendedAnimator.cs b/1.5/Source/Comps/CompProperties_ExtendedAnimator.cs new file mode 100644 index 0000000..c74848a --- /dev/null +++ b/1.5/Source/Comps/CompProperties_ExtendedAnimator.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Verse; +using RimWorld; + +namespace Rimworld_Animations { + public class CompProperties_ExtendedAnimator : CompProperties + { + public CompProperties_ExtendedAnimator() + { + base.compClass = typeof(CompExtendedAnimator); + } + } +} diff --git a/1.5/Source/GroupAnimations/GroupAnimationContexts/BaseGroupAnimationContext.cs b/1.5/Source/GroupAnimations/GroupAnimationContexts/BaseGroupAnimationContext.cs new file mode 100644 index 0000000..f5ee3dc --- /dev/null +++ b/1.5/Source/GroupAnimations/GroupAnimationContexts/BaseGroupAnimationContext.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Verse; + +namespace Rimworld_Animations +{ + public abstract class BaseGroupAnimationContext + { + public int actorShift = 0; + public abstract bool CanAnimationBeUsed(List actors, out int reorder); + + //cool class for designating contexts for animations + // configure CanAnimationBeUsed to test whether it can be used + } +} diff --git a/1.5/Source/GroupAnimations/GroupAnimationContexts/GroupAnimationContext_RJWSex.cs b/1.5/Source/GroupAnimations/GroupAnimationContexts/GroupAnimationContext_RJWSex.cs new file mode 100644 index 0000000..7c2033e --- /dev/null +++ b/1.5/Source/GroupAnimations/GroupAnimationContexts/GroupAnimationContext_RJWSex.cs @@ -0,0 +1,29 @@ +using RimWorld; +using rjw; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Verse; +using static rjw.xxx; + +namespace Rimworld_Animations +{ + public class GroupAnimationContext_RJWSex : BaseGroupAnimationContext + { + + public List interactionDefs; + + public override bool CanAnimationBeUsed(List actors, out int reorder) + { + Log.Message("Testing this animation"); + + JobDriver_SexBaseInitiator latestSexBaseInitiator = (actors.FindLast(x => x.jobs?.curDriver is JobDriver_SexBaseInitiator).jobs.curDriver as JobDriver_SexBaseInitiator); + reorder = base.actorShift; + + + return interactionDefs.Contains(latestSexBaseInitiator.Sexprops.dictionaryKey); + } + } +} diff --git a/1.5/Source/GroupAnimations/GroupAnimationDef.cs b/1.5/Source/GroupAnimations/GroupAnimationDef.cs new file mode 100644 index 0000000..36eb64a --- /dev/null +++ b/1.5/Source/GroupAnimations/GroupAnimationDef.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Verse; + +namespace Rimworld_Animations +{ + public class GroupAnimationDef : Def + { + public int numActors; + public List animationStages; + public List contexts; + + + public bool canAnimationBeUsed(List actors, out int reorder) + { + + foreach (BaseGroupAnimationContext context in contexts) + { + if (context.CanAnimationBeUsed(actors, out reorder)) + { + return true; + } + } + + reorder = 0; + return false; + } + } +} diff --git a/1.5/Source/GroupAnimationStages/AnimationStage.cs b/1.5/Source/GroupAnimations/GroupAnimationStages/AnimationStage.cs similarity index 100% rename from 1.5/Source/GroupAnimationStages/AnimationStage.cs rename to 1.5/Source/GroupAnimations/GroupAnimationStages/AnimationStage.cs diff --git a/1.5/Source/GroupAnimationStages/AnimationStage_Branch.cs b/1.5/Source/GroupAnimations/GroupAnimationStages/AnimationStage_Branch.cs similarity index 90% rename from 1.5/Source/GroupAnimationStages/AnimationStage_Branch.cs rename to 1.5/Source/GroupAnimations/GroupAnimationStages/AnimationStage_Branch.cs index deb7751..889b06e 100644 --- a/1.5/Source/GroupAnimationStages/AnimationStage_Branch.cs +++ b/1.5/Source/GroupAnimations/GroupAnimationStages/AnimationStage_Branch.cs @@ -9,7 +9,7 @@ namespace Rimworld_Animations { public class AnimationStage_Branch : AnimationStage { - List paths; + public List paths; public override List> GetAnimations(int actor, int seed) { return paths[(seed * 59) % paths.Count].GetAnimations(actor, seed); diff --git a/1.5/Source/GroupAnimationStages/AnimationStage_LoopRandomSelectChance.cs b/1.5/Source/GroupAnimations/GroupAnimationStages/AnimationStage_LoopRandomSelectChance.cs similarity index 79% rename from 1.5/Source/GroupAnimationStages/AnimationStage_LoopRandomSelectChance.cs rename to 1.5/Source/GroupAnimations/GroupAnimationStages/AnimationStage_LoopRandomSelectChance.cs index 6ef1ad4..a6fa374 100644 --- a/1.5/Source/GroupAnimationStages/AnimationStage_LoopRandomSelectChance.cs +++ b/1.5/Source/GroupAnimations/GroupAnimationStages/AnimationStage_LoopRandomSelectChance.cs @@ -10,11 +10,11 @@ namespace Rimworld_Animations public class AnimationStage_LoopRandomSelectChance : AnimationStage { public int loops; - public List animationOptions; + public List loopOptions; public override List> GetAnimations(int actor, int seed) { - int numberOfActors = animationOptions[0].animationDefs.Count; + int numberOfActors = loopOptions[0].animationDefs.Count; List> animations = new List>(); for (int i = 0; i < loops; i++) @@ -37,11 +37,11 @@ namespace Rimworld_Animations //select random element from loop options by weight; also calculate the longest anim length public AnimationLoopOption getAnimationLoopOptionByWeight(int seed, out int longestAnimLength) { - int totalWeight = animationOptions.Sum(x => x.probability); + int totalWeight = loopOptions.Sum(x => x.probability); int randomNumber = (seed * 56) % totalWeight; int cumulativeWeight = 0; - foreach(AnimationLoopOption option in animationOptions) { + foreach(AnimationLoopOption option in loopOptions) { cumulativeWeight += option.probability; if (randomNumber <= cumulativeWeight) { @@ -50,8 +50,8 @@ namespace Rimworld_Animations } } - longestAnimLength = animationOptions[0].animationDefs.Max(x => x.durationTicks); - return animationOptions[0]; + longestAnimLength = loopOptions[0].animationDefs.Max(x => x.durationTicks); + return loopOptions[0]; } diff --git a/1.5/Source/GroupAnimationStages/AnimationStage_TicksDuration.cs b/1.5/Source/GroupAnimations/GroupAnimationStages/AnimationStage_TicksDuration.cs similarity index 100% rename from 1.5/Source/GroupAnimationStages/AnimationStage_TicksDuration.cs rename to 1.5/Source/GroupAnimations/GroupAnimationStages/AnimationStage_TicksDuration.cs diff --git a/1.5/Source/Keyframes/ExtendedKeyframe.cs b/1.5/Source/Keyframes/ExtendedKeyframe.cs index e5e6701..893c879 100644 --- a/1.5/Source/Keyframes/ExtendedKeyframe.cs +++ b/1.5/Source/Keyframes/ExtendedKeyframe.cs @@ -13,7 +13,7 @@ namespace Rimworld_Animations public Rot4 rotation; public SoundDef sound = null; - public bool visible; + public bool visible = true; } } diff --git a/1.5/Source/Patches/RJWPatches/JobDrivers/HarmonyPatch_JobDriver_SexBaseInitiator.cs b/1.5/Source/Patches/RJWPatches/JobDrivers/HarmonyPatch_JobDriver_SexBaseInitiator.cs index 9f11a1c..830ac41 100644 --- a/1.5/Source/Patches/RJWPatches/JobDrivers/HarmonyPatch_JobDriver_SexBaseInitiator.cs +++ b/1.5/Source/Patches/RJWPatches/JobDrivers/HarmonyPatch_JobDriver_SexBaseInitiator.cs @@ -40,8 +40,14 @@ namespace Rimworld_Animations { int AnimationTimeTicks = 0; List participants = partnerSexBaseReceiver.parteners.Append(partner).ToList(); - RerollAnimations(participants); + GroupAnimationDef groupAnimation = AnimationUtility.FindGroupAnimation(participants, out int reorder); + + if (groupAnimation != null) + { + AnimationUtility.StartGroupAnimation(participants, groupAnimation, reorder); + } + //Modify Orgasm ticks to only orgasm as many times as RJW stock orgasm allows if (AnimationTimeTicks != 0) @@ -53,14 +59,6 @@ namespace Rimworld_Animations { } } - public static void RerollAnimations(List participants) { - - participants[0].Drawer.renderer.SetAnimation(AnimationDefOf.TestAnimation1); - participants[1].Drawer.renderer.SetAnimation(AnimationDefOf.TestAnimation2); - - } - - static IEnumerable NonSexActRulePackDefNames = new String[] { "MutualHandholdingRP", @@ -77,12 +75,14 @@ namespace Rimworld_Animations { } } + [HarmonyPatch(typeof(JobDriver_SexBaseInitiator), "End")] static class HarmonyPatch_JobDriver_SexBaseInitiator_End { - public static void Postfix(ref JobDriver_SexBaseInitiator __instance) + public static void Prefix(ref JobDriver_SexBaseInitiator __instance) { - //stop animation + + AnimationUtility.StopGroupAnimation(__instance.pawn); } } } diff --git a/1.5/Source/Patches/RJWPatches/JobDrivers/HarmonyPatch_JobDriver_SexBaseReceiverLoved.cs b/1.5/Source/Patches/RJWPatches/JobDrivers/HarmonyPatch_JobDriver_SexBaseReceiverLoved.cs deleted file mode 100644 index dfa116e..0000000 --- a/1.5/Source/Patches/RJWPatches/JobDrivers/HarmonyPatch_JobDriver_SexBaseReceiverLoved.cs +++ /dev/null @@ -1,46 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using HarmonyLib; -using RimWorld; -using Verse; -using rjw; -using System.Reflection.Emit; -using Verse.AI; - -namespace Rimworld_Animations -{ - - [HarmonyPatch(typeof(JobDriver_SexBaseRecieverLoved), "MakeSexToil")] - public static class HarmonyPatch_JobDriver_SexBaseReceiverLoved - { - public static IEnumerable Transpiler(IEnumerable codeInstructions) - { - - var ins = codeInstructions.ToList(); - for(int i = 0; i < ins.Count; i++) - { - if(i < ins.Count && ins[i].opcode == OpCodes.Call && ins[i].OperandIs(AccessTools.DeclaredMethod(typeof(Toils_LayDown), "LayDown"))) { - - ins[i].operand = AccessTools.DeclaredMethod(typeof(HarmonyPatch_JobDriver_SexBaseReceiverLoved), "DoNotLayDown"); - yield return ins[i]; - - } - - else - { - yield return ins[i]; - } - } - - } - - public static Toil DoNotLayDown(TargetIndex bedOrRestSpotIndex, bool hasBed, bool lookForOtherJobs, bool canSleep = true, bool gainRestAndHealth = true, PawnPosture noBedLayingPosture = PawnPosture.LayingMask, bool deathrest = false) - { - return new Toil(); - } - - } -} diff --git a/1.5/Source/Patches/RJWPatches/JobDrivers/SexBaseReceivers/HarmonyPatch_JobDriver_SexBaseReceiverLoved.cs b/1.5/Source/Patches/RJWPatches/JobDrivers/SexBaseReceivers/HarmonyPatch_JobDriver_SexBaseReceiverLoved.cs new file mode 100644 index 0000000..6c4faa8 --- /dev/null +++ b/1.5/Source/Patches/RJWPatches/JobDrivers/SexBaseReceivers/HarmonyPatch_JobDriver_SexBaseReceiverLoved.cs @@ -0,0 +1,23 @@ +using HarmonyLib; +using rjw; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Verse.AI; + +namespace Rimworld_Animations +{ + [HarmonyPatch(typeof(JobDriver_SexBaseRecieverLoved), "MakeSexToil")] + public class HarmonyPatch_JobDriver_SexBaseReceiverLoved + { + public static void Postfix(JobDriver_SexBaseRecieverLoved __instance, ref Toil __result) + { + //added for sudden end of jobdriver + __result.AddFinishAction(delegate { + AnimationUtility.StopGroupAnimation(__instance.pawn); + }); + } + } +} diff --git a/1.5/Source/Patches/RJWPatches/JobDrivers/SexBaseReceivers/HarmonyPatch_JobDriver_SexBaseReceiverRaped.cs b/1.5/Source/Patches/RJWPatches/JobDrivers/SexBaseReceivers/HarmonyPatch_JobDriver_SexBaseReceiverRaped.cs new file mode 100644 index 0000000..e0b115d --- /dev/null +++ b/1.5/Source/Patches/RJWPatches/JobDrivers/SexBaseReceivers/HarmonyPatch_JobDriver_SexBaseReceiverRaped.cs @@ -0,0 +1,23 @@ +using HarmonyLib; +using rjw; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Verse.AI; + +namespace Rimworld_Animations +{ + [HarmonyPatch(typeof(JobDriver_SexBaseRecieverRaped), "MakeNewToils")] + public class HarmonyPatch_JobDriver_SexBaseReceiverRaped + { + public static void Postfix(JobDriver_SexBaseRecieverRaped __instance, ref IEnumerable __result) + { + //added for sudden end of jobdriver + __result.Last().AddFinishAction(delegate { + AnimationUtility.StopGroupAnimation(__instance.pawn); + }); + } + } +} diff --git a/1.5/Source/Patches/RimworldPatches/HarmonyPatch_PawnRenderNode.cs b/1.5/Source/Patches/RimworldPatches/HarmonyPatch_PawnRenderNode.cs index 8855f47..c7cff4f 100644 --- a/1.5/Source/Patches/RimworldPatches/HarmonyPatch_PawnRenderNode.cs +++ b/1.5/Source/Patches/RimworldPatches/HarmonyPatch_PawnRenderNode.cs @@ -27,7 +27,7 @@ namespace Rimworld_Animations } - // HEAD ROTATION ADJUST FACING + // HEAD ROTATION ADJUST FACING get rotated textures Rot4 animFacing = extendedAnimWorker.facingAtTick(__instance.tree.AnimationTick); diff --git a/1.5/Source/Patches/RimworldPatches/HarmonyPatch_PawnRenderTree.cs b/1.5/Source/Patches/RimworldPatches/HarmonyPatch_PawnRenderTree.cs new file mode 100644 index 0000000..edc16af --- /dev/null +++ b/1.5/Source/Patches/RimworldPatches/HarmonyPatch_PawnRenderTree.cs @@ -0,0 +1,35 @@ +using HarmonyLib; +using RimWorld; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Verse; + +namespace Rimworld_Animations +{ + [HarmonyPatch(typeof(PawnRenderTree), "TryGetMatrix")] + public class HarmonyPatch_PawnRenderTree + { + public static void Prefix(PawnRenderTree __instance, PawnRenderNode node, ref PawnDrawParms parms) + { + //Note: Maybe need to change this to check all ancestors if it's the head node + //in case of deeper nodes in the PawnRenderTree + //This code only checks for node and parent, if either are head + + + // Change facing for all head and apparelhead nodes + // So that the offset is based on body rotation, not head rotation + + //fixes misaligned hairs and headaddons + if ((node.Props.tagDef == PawnRenderNodeTagDefOf.Head || node.Props.tagDef == PawnRenderNodeTagDefOf.ApparelHead + || node?.parent?.Props?.tagDef == PawnRenderNodeTagDefOf.Head || node?.parent?.Props?.tagDef == PawnRenderNodeTagDefOf.ApparelHead) + && node.tree.rootNode.AnimationWorker is AnimationWorker_KeyframesExtended rootNodeAnimationWorker) + { + + parms.facing = rootNodeAnimationWorker.facingAtTick(node.tree.AnimationTick); + } + } + } +} diff --git a/1.5/Source/Patches/RimworldPatches/HarmonyPatch_Pawn_DrawTracker.cs b/1.5/Source/Patches/RimworldPatches/HarmonyPatch_Pawn_DrawTracker.cs index b02b20a..65b34e9 100644 --- a/1.5/Source/Patches/RimworldPatches/HarmonyPatch_Pawn_DrawTracker.cs +++ b/1.5/Source/Patches/RimworldPatches/HarmonyPatch_Pawn_DrawTracker.cs @@ -9,19 +9,23 @@ namespace Rimworld_Animations { public static class HarmonyPatch_Pawn_DrawTracker { public static bool Prefix(ref Pawn ___pawn, ref Vector3 __result) { + // If animating and is sexbaseinitiator jobdriver, if (___pawn?.Drawer?.renderer?.renderTree?.rootNode?.AnimationWorker is AnimationWorker_KeyframesExtended && ___pawn.jobs?.curDriver is JobDriver_SexBaseInitiator sexdriver) { - //align pos on top of partner - __result = sexdriver.Partner.Drawer.DrawPos; - //change height so that they're all layered properly - if (sexdriver.Partner.jobs.curDriver is JobDriver_SexBaseReciever) - for (int i = 0; i < ) + //align pos on top of partner + if (sexdriver?.Partner?.Drawer?.DrawPos != null) + __result = sexdriver.Partner.Drawer.DrawPos; + + return false; + } return true; + + } } } diff --git a/1.5/Source/Utilities/AnimationUtility.cs b/1.5/Source/Utilities/AnimationUtility.cs index 7df7d42..d06d203 100644 --- a/1.5/Source/Utilities/AnimationUtility.cs +++ b/1.5/Source/Utilities/AnimationUtility.cs @@ -15,120 +15,57 @@ namespace Rimworld_Animations { public static class AnimationUtility { - public static bool GenitalCheckForPawn(List requiredGenitals, Pawn pawn, out string failReason) + public static void StartAnimation(List participants) { + participants[0].Drawer.renderer.SetAnimation(AnimationDefOf.TestAnimation1); + participants[1].Drawer.renderer.SetAnimation(AnimationDefOf.TestAnimation2); + } - failReason = null; - if (requiredGenitals != null) + + public static void StartGroupAnimation(List participants, GroupAnimationDef groupAnimationDef, int reorder) + { + for(int i = 0; i < participants.Count; i++) { - if (requiredGenitals.Contains("Vagina")) - { - - if (!rjw.Genital_Helper.has_vagina(pawn)) - { - failReason = "missing vagina"; - return false; - } - - } - - if (requiredGenitals.Contains("Penis")) - { - - if (!(rjw.Genital_Helper.has_multipenis(pawn) || rjw.Genital_Helper.has_penis_infertile(pawn) || rjw.Genital_Helper.has_penis_fertile(pawn) || rjw.Genital_Helper.has_ovipositorM(pawn) || rjw.Genital_Helper.has_ovipositorF(pawn))) - { - failReason = "missing penis"; - return false; - } - - } - - if (requiredGenitals.Contains("Mouth")) - { - - if (!rjw.Genital_Helper.has_mouth(pawn)) - { - failReason = "missing mouth"; - return false; - } - - } - - if (requiredGenitals.Contains("Anus")) - { - - if (!rjw.Genital_Helper.has_anus(pawn)) - { - failReason = "missing anus"; - return false; - } - - } - - if (requiredGenitals.Contains("Breasts")) - { - if (!rjw.Genital_Helper.can_do_breastjob(pawn)) - { - failReason = "missing breasts"; - return false; - } - } - - if (requiredGenitals.Contains("NoVagina")) - { - - if (rjw.Genital_Helper.has_vagina(pawn)) - { - failReason = "has vagina"; - return false; - } - - } - - if (requiredGenitals.Contains("NoPenis")) - { - - if ((rjw.Genital_Helper.has_multipenis(pawn) || rjw.Genital_Helper.has_penis_infertile(pawn) || rjw.Genital_Helper.has_penis_fertile(pawn))) - { - failReason = "has penis"; - return false; - } - - } - - if (requiredGenitals.Contains("NoMouth")) - { - - if (rjw.Genital_Helper.has_mouth(pawn)) - { - failReason = "has mouth"; - return false; - } - - } - - if (requiredGenitals.Contains("NoAnus")) - { - - if (rjw.Genital_Helper.has_anus(pawn)) - { - failReason = "has anus"; - return false; - } - - } - - if (requiredGenitals.Contains("NoBreasts")) - { - if (rjw.Genital_Helper.can_do_breastjob(pawn)) - { - failReason = "has breasts"; - return false; - } - } + //todo: pass all animationstages to ExtendedAnimator, and queue animations + participants[i].Drawer.renderer.SetAnimation( + groupAnimationDef.animationStages[0] + .GetAnimations((i + reorder) % participants.Count, GenTicks.TicksGame)[0].Item2); } + } - return true; + + public static void StopGroupAnimation(List participants) + { + foreach(Pawn pawn in participants) + { + pawn.Drawer.renderer.SetAnimation(null); + } + } + + public static void StopGroupAnimation(Pawn participant) + { + participant?.Drawer?.renderer?.SetAnimation(null); + } + + public static GroupAnimationDef FindGroupAnimation(List participants, out int reorder) + { + // go through each context in each GroupAnimationDef + // if you find one where it returns canAnimationBeUsed (and reorders), + // return that animation + + int reorder2 = 0; + + Log.Message(DefDatabase.AllDefsListForReading[0].defName); + + DefDatabase.AllDefsListForReading.TryRandomElement((GroupAnimationDef x) => + x.canAnimationBeUsed(participants, out reorder2), out GroupAnimationDef result); + + reorder = reorder2; + if (result != null) return result; + + return null; + + } } diff --git a/Rimworld-Animations.csproj b/Rimworld-Animations.csproj index 4aff51e..cd6b26a 100644 --- a/Rimworld-Animations.csproj +++ b/Rimworld-Animations.csproj @@ -73,19 +73,25 @@ + + - - - - + + + + + + + + @@ -94,7 +100,8 @@ - + + @@ -108,7 +115,13 @@ + + + + + +