From af8370f958c4ba9469fb91ddd6c262ec0f06f8a7 Mon Sep 17 00:00:00 2001 From: Florian Kauder Date: Sun, 20 Nov 2022 04:31:20 +0100 Subject: [PATCH] feat(mod): Add skeleton for integration with Progress Renderer --- Assemblies/Diary.dll | Bin 40448 -> 45568 bytes Source/DiaryService.cs | 25 +++ Source/DiaryTypes.cs | 12 + Source/GUIDraggableTexture.cs | 212 ++++++++++++++++++ Source/MainTabWindow_Diary.cs | 57 ++++- .../ListenProgressRenderer_CreateFilePath.cs | 17 ++ Source/RimworldStories.csproj | 26 +++ 7 files changed, 348 insertions(+), 1 deletion(-) create mode 100644 Source/GUIDraggableTexture.cs create mode 100644 Source/Patches/ListenProgressRenderer_CreateFilePath.cs diff --git a/Assemblies/Diary.dll b/Assemblies/Diary.dll index e0502f59ed2bc1177c514b8dd3591a4ca5fdb003..f4aa3bf23325e8ee33e0de234219e37bc47e5c46 100644 GIT binary patch literal 45568 zcmeIbdth8uwLiY+oS8GvOmZg4B&^*!0lu57ZazCGF9o$0OLk*d%3b=Rl6>s!`ss_)8lq-Kx*iuOK;dZhwI9m8tP;FJOe?(cO6 znT+<$C}uX-#1jy}QnZs#o#EK&ztgvwfbNzu{_lH1 zrhl!&X#I0-@bAAh5A4_x`@>iqwYh3~#w7ZIF~CbMP6X!3JAE@(kC4nFtmyh_$bmIu zlLPUHt~s6;-{1sZ;F|TgM!jKw$XbRahefRv98b02)6h;o7+N%<$bruqoQQS}ON_~L z<~-3nq9|gRWK7<6<>bX9iXsLz{YT0eU}xr_tR1O43rOnDDw2ABDM2@n!WyHv&@ER3 zi9%MmLHVb1jtvEC4X2rd$6$;+i|}BXjo`_RrDny9j6WO)Dr20unZUBOLJi82aZH5< zBl_^>VCP|-aBafcBl$4FIm|^d>p3t5jP1=ppAhPt(+pxnNKN19kcHC8Ai0efJ@B@kW^Bd6bQOoKf8hP;=zkV_g_E#%$n8}hhHUizkuA-Edaw-hdQQ;-d>UF^uU87Qp%jf} zi3knz9ET@*ByF7I>!Z=s^c~7HG9h%N%#6&2nUUF;uExT?C!rB$2KLn}J)|sI%3TT^|cOd>jsp%@F+$&4J=s z*rbOZ#(B=b3qz54m!nzCNWcssEX3ddog;&V8LIR)Y>jyn^{o2PhC7w*8#n=%fmLLJ zM}|}$gXrfyAEpT<5Jp0kmTfhTK_i&ZZA6v~wlr8np<@gbYWmFcC$nlYR-F_;|`+Qblu@a5vsCWb}Mn-f?A&?S2bIE@3)$SdL$DPd(l4Vt5K_MW2p z6Gipk6xGE5+D2IXJyB-FJWqkTG?3zNKK3uPsK7& zFcroC+*lmK8a5rL3wew&z`cw9QcND3O$m9N-bM!Cyhrhj&mxDz2ooG0g!H3$Fi8i6 zX=2FXV)iz2G|bkOnk(XPF}FL4t4z$8pVI`)?fT~mcOI~`#jbr8;48e#MK6M-xZ-8q#$80gA&gY7j1tv2ZX=umF;e?i{no2J=3z=tM z!^D_R&$Fd$E11Cgg&W%bMoY!9#4+1GJ=@P_8)eQqWzuhGxE2ugoIX z$leJ1gyWULhITd1nPflL+dX2p+E~zCW^}cir;UNvWln@NH%}Xz{W?*y6vFC!IG;C9 z1P_8FLdNqxM1|*}f3RjtWzY^;Cv=BWvU7)83Qs(2KGevV8ZzxFNA4G28 z_1A0(TO$S3fg8%!Y$*#Ch?!F`1nddhE(jp@W*@?wMBxIjaLUhqvw`;--H-M;(TV`L(lp3;_iImdB3u;4|!zgizqAWG4esn%9f!X z7=Xih4`3DPh^&L7m8~w&m~V(zYnpB`fPn6;^xEFC;4;hs-6IdU;I8bFM7f{+h>$!#nz<+2f+2s9-)*NouAmN_b? z3KZoA*1TSrJZ2^8F=nM7qMhyvYWsDP(2R~GfJ8w~xnz~6FCiV?)<}BS(e$OHb88{J z?`Zlm(%~3FzvyUs3+WL%BJ^vHrY|SG%q|o9ZAa5TKzg}dUKzEcHCvY<_R9GO=a30w z2R=9g$>;cz4>$B!*{`@gHSDmm-zz|^R`%HfwA{-6rU1bw{#1bA6FBV3Z=vvsZ~=l( zj4wd2%yEEf^ESmU<2|!7?+kiV$J8^ym<2uwt$E&+;LR-J{EfjiJ20_eiE_e zjXLHfB!096@#7?3UxIiGiJvb)yobd5N)R6+@jE4mPm*}J1o4+7zEFbrdlFwSLHsL; z@01|=d>{rD}NeSZBB!0XE@n1;1r3CR`NxY{7@f##QRD$>ziBFawK272;OAvoU;_pik z|3uU4r;&691(H@pcmbwFL32Bz~g=@p~jbR)Y955}z(Xe2K*0 zlpy|*#6OiFzDuIVKl)^cfzOtgAl8vMz69}D5*tboPatuA3F1-`SCk-bAo27P#5NM! zOAxzA+*5)$K;nl=5D$@fc?setN&IvP;%y|}UV``)62Dr4_y~#LD?$7*i9ahre2&DI zN)TTq@sA~lZXu4T&2{5YHm9 ztpqVmVpj>`J`x8?5HBL}PzmBSB!034@v|h}R)TmJiC-x}e2~OPN)VqQ@y8{I&yx6D z3F0dxzFLC#XA<8oK{SIP`caJL2{wt#qyQiAv|or5}Sq*E$0qXA1L$80Vlzs1w((7 z#{<@|hX+>nB(%+Qdh~;Y+W!zv&+rEcl@&N7tiT~*Gmaa1Mza~`SeM{X<2f7)$)PK7 z#N)(B{Si1n&Xe+ZJ{xNTKFsr_$*8E1K1i#_ZEqwH_PY;N@t|Jb2x*wk$4mFNoEd7U z*AJ7<%EJ}<0g?+Vt22SKlTf;>K?SEzcAnHtpOISvr~lS{d>4;TjAWNW>HKRF zIXr~02Kkf*&(C-lZpyKZk->2ap6Y$fZRsn`gy*DT1uOGC5j;CW*Z6bBIp2pq<2f8Z zIiom_MbXAmc!24)@%qdnSu_`Ua7O9y=%?sMbMg6RSm7MX;WP21I_isBQGc-vzL7FK z;HqX0^6Uxv!(x2?$WswMALNOL5%mr7I76Oq^8AK>C0p_giYJ-KW5bGk!>qGya&Fz#yTT%h5F+ZB1;tF#}dSwX?nPPbJVlj&**5 zGe=Ki4eGYH=2MBasN6;r9?yAe9VWlu%5H-HjJX`XkB$=S$nLAz63?th4F|rqmDnIP zoHAVoi+XU*i_td{m)OM8s@a0)2u7k6z=AW~=XUU({5iEB51f=8fXd2)aSSy{{p*kP zayk`HNE0|^wGyYJxth+ic$@|E`Ma&moDUQ{fye-~!hSiEt(E7-x?aD*w&v$6w63yf^m>aCoSoA9w@DXa86a zt42EyWWa*gVMqw*{#1jcL##Hv}H2OB0unF*Y*HXuajDG3AuD}l9d(aS78d2^YxuKOVuwkE{r(Rf2XygQIk*_SC4!j2`= zo_#kj<7IfV<}t+$Dm>h`8q1ZO2Z77nOfQtawCMWGzxtCiUS6h!4{u&^aY)Xz*O zV7jVC$ku}PAlJ6^C=xdDhWuUJ)BU+Bho;CtA zqA!m^3}D^@KOFX6&@n*6byUNN*^5SW(U`q{1ZGV3o)MT~!$4+_%Ahj@+x$3K>ylpP z$C<~mRvtChsYi{~c+^;9vQLyA-OV3ASd`?zrI;QeM(I50ix?bv8P+hQ3^m3QSR|nV ztc+0nh!?>P52O)F>Qn+jFH|6AasWfB;auIUTqv1dX=b1eBFcoKHkm$9GJ9D#4QH#w zK7d%8uc@$fc{jkAM}Y^1P!tQyj^|7^M<=qU zBOaNJ8Z026iiaD)N0DgrhsR zv^iyxJ6S~%3hB50%f5tF>TI8~yWnMSavIs!3xo?eHmF`>fMw=Fz{U~lOsJE)2=&axC>T;@ zURNVhPmnPWYzKGZ5)ehDBVL$j9s;$C4(s|f;qh-xT*`j(xI+Md`v`HWVWZQGSh3X+ z11ou9zBd=WwJhJB;|53R6FA+c)8j{Vk4oV^6WpjYo}BNKgi2q&J3_W^YvM9oT^TQT zkXI0?8qRRKB-#;Dw%bMdE?vUbO8>Bqq3F>a1F1Wf_eVbkyTb1fSFS|&nX5RYaR7U~ zH*q!U#y}F)bI%GnxQ_{Lhv34x$u&R?T#G`c89jp;1}>vnuuIi)^k5unD&kXlPLpw;O^b-oeRvbI<*ABLlqEI0NC9F&gO! zOd&Tj@M&W}^c&btEe9B`6Q885975tc00?PI9lyUG;5f-ag6J7HCg>ub_!O{><=UIb zQKw(bW85O!8N#ODlV1wCPp{HToWQ zio_o{xO2aWl!*!ltr};`WO`+)hKWYzGw3VvFDSx^n^0zgXymV{;Tw|pmeBbs`!4fC z2!=Zvm%&({Ss-)>&ikDxx)#;F!xfaCD=Lw?UfCx80xp+im&6#EtqfR3#W@!3q0B%C$oQ zpKFfpb8T^->q_)_0py&f*V1;dAg_dX!Jqcz=U`w|@sHp(sSyj%5OU2{nTCdi#>A+e z5Ya6zF(F1SYG1SUr!qwi)j-e?XvT|CCuseBKlpcE9;}msJjr45OpG4kS}zE&MGJ6p z-koH?I!+|<*GI@%sI{SgCZ8=D`= znMV?&L)<=ULk*jAx`C)sH=-R0x}Br+bnR1jLY8A4S;TOnrO6XrEdajkqahJhHPq|z z%mm#_hKiDdkme|s%H$C-`hm&fd4V*}(V=lTw-z6pTvdVlXvt|qgg$LUrlTQcCcc0b zCFe@Cwpo1Z!&{a)a~-jZ37Ch_oUz)l!&-a@1bu5NUjXBH*#A|6cFNrjBK9h-(V7|f zY7{H_)(PHIi^H@#z>xVOibNPOjNiG#yYQN?c6bArg$=&M26v5UV4V*sywjR$jyWH4 zdXHEKVaXgas?f9{QZo0Tsw_G2gKUhmVMFoRhOKrWnygYKG}n?8zjCBc6g1vMU2q6StkSE0hTkzcZV0ibl(NcmxL4F zLnZMjA-p!+I8HgJc;frOsl*RZ)?^-I9o`m1%g3e8_~%tW!d5@M$S?TSi~nE!!duwV zGfzOUGH)^Fhrq~@=aa1PwQZi)Bz^=)JD)1$H#o70ak~F2ZWD6cCRD<0tb)f#Z4|fp zF(ew@W5Tx24v*q7IH@gG)yZeHXT86}@a^(Z9fqy}htWBY!5Em&379HmoaD6}0f(^3 z2N4!R*H0ij+lyLO;do%d;`9OaA%TD8|6Do{t!WZ-f4vw!tm&IilaWC?%c4djx0ZK1|7N z+cpL_Hz1aK5ZEA7hp+&&#etDH>c zG-_7euqk&TD{(t+3_^6M7`Lkjp|;nqvf~4+=tqn3Bi2R#RJH1wEkCWSwyT{nbQVLc zYV4Y(k87=}MryTq@#tC|kf~^Z_M>Q3YuD;?7Cn7+d@ycRj%nDKyO@=+_E=*O@^|LR_L_RoqU2lL7W`v6`}?f7FTNJM0?`=MIM1=DGqQY$~vp8x9b~M&^4}l zzv1-8Yu68)&4wqAYEc|;R8F!d&ByI)-c=^YE2lK<&Rt5yrrJ}DK^P1MooY`Rgps}W zWZkb``1aHRBK7ij$FZj#u@0gA`>%*8F!L09N>OmZG2%3PTGIvE(vyc-n&xEmW4uGX zzIn^=qYQ_%RbpWRPGqTh|KURuee*e5OLX&zr3r@JLNp8%s-pzP6VPou@e8yVg$N5< zc!fX~H);>S;h>=}L2VQTycMCI}J@$(-BRoOFoiNiB6d!{7SHGD?R8|=zi_AGo4c;0UG zVmBEBT^ME-ZkBkh)~8*w?b$q7vzv5IZ1cGCjpi*{Bst(dX`CG>0v*F_Ibvb}MvFQ2 zoJKq!7H#YRzNW~eoVHm^t2v%*&$OEo*ugMm`5`I;Y96vnh~L-bs5IA}J0JHcq7reH zCm8k#876#jSEUo}6R8rnvJxttWS{ikRB4_)@4ukZ2~g>rkt#tbPMqDOAFNi+x92Z7 z8Lz__c0i8168{cu5YagW@!1h)u8~C1lnd+y^DRB&nnPyYo$-_HlN)!y8;WRp<`>!v zGcTiG{M3PCe0VSbdNAeyfHBaA0TaIlBJmp(m8aNTj5jS#{1%XXO5zn<@T>rP`0;-7AbUsFhmU&FW%zxm|coUkzL`2 zi{F7Edp5z}qoz;%{vf*KlWqMz+IDNlx2-sR3(v`46$U(>dkqyF4ef<(rsFrOM#JMV zI&OL88KGAt(Y_HD!UVDnf<9?jjW|O{;Jcbh3Wp!O(XmY4ztJrEos(lRTu9|!$0dv( z0QnD!;b%M=dZ;S%M?lB;Gj9-y^^AK){mijkkGG%W@yIZbhw&*#|494{jX!TB{&S>$@woBM_wQARNBYl5yh(YC0~|j4AT|3>AmWKK-nT8$}P4G zS&l8O>>Bha`-o%Iw`f!YFE~;Dn#`X84zg-xKa}SbpJ9$Zv?%iz&~biLhJA%<3M;1d zt9jnyUePI~O)NqPC~6)F%>O)XCkbhp`U&(sYESkyv|`~G_GDk~GIYX|4Py`0NXlZT@If2-;%w0OTGnLvR7}({2_>do&R|m*^-0BJF=C1p@eR5qwB6`C1MhLoqIe z;rLkd_)Uh-gImJYjNA~&Lp(h#yz9>Qbu!?cP2PAY9yarv90F;zGG$vU91!9aq$rSx zcpk|HLdu)x$0>ES@{ZsSliyq5595jCR{R(Wwy%N=8zKKeNM*>qJD;9G2^ay<2u2{4 zH^PR#_e~v5#a0Qb+)3^nPCbIQmk9M@l+J+(5po!$X>x#K6x}Or16?1L6ogodj+mnx z1I*9mfmDG=2^lPm0S1Z$_M?&VbFCQzTxSWyypdFTq%lBm2XXcz)^NI1vzVNjPc#eqafgnfvf}hrEuj4k@U}A0mUQxsPWgj(dCr)4b1(>JQ-Al&QSd~LK7>yKAIPY%Jk+iD z5D(8&^Y9sq4}3>(K3w^!a$x#k5FgAV{!WZ&Z7g+6@DbZm*GPG0;9`V@m%w7F4+rin zvs5t1@()r!PwLC1Y?JbO!FLC4Mh~l{d{Qv?2Kqym`chRoVyS%*mVffHZ1OaimRcM+ z)3DUH%2_V=6aN*#|G`Q})~T>K+SjUI^M}+&t=If*g0a*s;0dY6BJZJx-<7fL+hyrU zR6Xn|_ea%bRV)`6<@mbFdGRwb`mDesc2w;xEB9OKbc_;G?*`v9mXo0zCYpHJrS)LST z87gPlEWDm_BLM1hwEsEvwUY7A$4mRWu7YdH!H~VEs^cZVzFO~Y=4&iFAtOd zmyjf+{w}h$O3#Z$_aE22P!&?g+AQBNS>9g7azm8-^QHg4`DvLi!P=A6gZ?w|WM)?x ztzCouk5NaeX_>2Gv5@*t|7-qZ)Oy%(y81$#{GSGYNIeuM^=Zs6yh|i(g@iNI@4WX$ zL+VYTmZ3yj%w|YEC74!&t$r~ zOZ}>r_{t@78QVTsa)h1>$O2faS+b zmd{66{vpWnQ#CC2`dB^-yrtf%Iv+m!fohhQMOpSlP+A{1wwRlT7W(%EHV>_@-WSMY zeis@5=7dU?%_uE(d+b9f*Hm7DGFEjZ%Ev42hlF>B+1pI%`RX$Cpb}-DKzSEhdDLl< zPoaFG{4>BTF53dm>ut9EOZ;Y(XIpom{FB8ViX?QT`eW6XF#6k4ez1b|OU*BV|I+F& zqrASF^^Bi=ex;l?xvTpAfUW+s<^kZ(w!V$>FV&FH>Fp%{qv&C|$?_N<%fE$LT6HYn z3bOpRP-hGNc$Ai!YJSvfslQ9vP$~5g%OAWyH{&m0l-0%yF2?r03`}Uu%PwYi41Jj`)h zE4P>%h8ALGJ?beh%e7U1#OR+4Z$bUNDwa=~Zvpd>_}eH?ffgQhiSX=|vaO1k@7I#^ zaO4OjhgChQuF?p4)c4?Z9yJED>`~(@UIFzSFZl<&eo)`B!zh0Vo=NJQ*p;9@>ZR`A z^4^d2^a+#YC6Lpj7F4|e{9Vu*5>~v5G9ta*6sruLs1im^FpelTE@-Kjt7+AHV^gJm z1e)gS#rXHHR~Gd%yuQ93OHN%}i(^wr-XqY}wd3sTd|t)3<2CIwrdKU=Aq(Gzy3U0v z0R6*-jt>Ua_R0BnCm@x2*o77c%T@i9JZ*KbO7&_;ZNcy2)vAv>(B{bT!8&!P1Ldk$ z2gj&QQ>C4nQ1%&fg1Xd!s>7Rulhv&*bQYi=xX_N^6!nG+rGrydWSZ`!I@}YSrsld( zfACoKK?iyUdsl<%cc4GQat-P#fqv_GUTBYM8fz%Qb8I#7#Ip;GD# z%Qfu}wNpYn)jtHfShdwn38mGh71F2buWJZ(sxAlGUQ>a6?pg=hP%}5QN7drKfEvAF zpB(B{>m6trIQOZ09jF7pAiH1vV--0cRR=9X)(157Ipmr9)m#TUx0=vmfj*(0wpNDr ztIHhddTVW{Up?bMcUi5W^VH(g*vlu>!`7Lh0rd@m^sF3E-*utwp#$ny4rgoG&d~Yl z+SR(^OY!REe_Cgac~I?lpihJI0(GkcJp;}Q)i(svQeUXPI}Fl4O@FcKHy=WFP`{2NT&zA2A~er| z2K*I(t`+E@niaFuMd~#s8<_Wr$jvWO*KX8MEi&MX)UBH|w6pRY|3&ITJl|)ZzM6CV z7prlnYud@`!=X!5r$ARLv-VKvQuUw%g=((~9a1m4v`>USqE6W?y~uj_s9HG;;;XnE zAzk~B`lveKK=%st69-yTYk{_Xi{`vRpcfqIidqk7Z#d9HksCvosRLUz=U<{8b-9{* zriN7Dme3XIR)G$xCu(mGU8Po@McP5tU2_kh?PqJ~{F-luu2Boybi21;iBG5=fgV+l z1Nx+T?Hr*&qY8B$zDOz4oRuijU0__S1y3zYe=tgy&1O2W1_0VV3 z%?@;O#h*g|qV9B{UqXkQl(#1@wWU6*%3R1B_^g^M(4&f+H>(y0T3h!Eb&EPnAib;I zqIS9MaCfVE1iAq4vA-R?~twVcWXjcrQebS-Xu-R?ui^FL5IV18D??hD(#q?!D(?Soj71*Ga5c_l@;s$vJKN&8*Mr}KJUCxBj;fo;jM>{) z%E@z=aQ?+D4dlnf<0q>yI>$1_4*8zh|9`Dd>S8$k>$)CAkNB`ya+>gHe4%bSGQ3(r zEBQjS@H@4XN@J#)#QYtlSE%^C0-;XD+!=y5k!O?IP{|qjJ9=PVUQyv!$3u4ya(B&1 z?R=Pbuk_$U|0Aglm`yKw;2BmE>X!82msSC36_i#uX_21sJ7DNPBiiZm`;g5*-YjE@ z&5y?1V~~e6b5>x!JnCuj&p2fE;P95Ew*Q&p znUn-pmHu^kG)DKfMS9a^qev3=vA6x=EjQJ%PDzl>V~y~xfaMQjl(tjkd{ovETbZ~! zB~@cCN83E6c$9B>r8krY?hRPiRISC)dTFZmA6@^JSaJgH4_4unF>ZT!fQ=lk4rK`M z{W99ml5)P3%~GzCa)XpxrA(r%#)$y=_ej|<<#8VNwhHAK>^ZDQq^y#1oRptMd7`=< z<*CYJFnfO6!_s3k1S;^|3*D;EY)4+o{5hfm_NVaN@@Lg|fXez@saGlT1dY&``%!)w z=N01wGgo~n{t)V!Vld+t&uB4Gp6~T^pyx+Do$B9f?|_7<>SsK*@mv23 zp81|dzF&I|so(lv_slo8m;c$*Y?PP32cXxZ<}A<6<`2R1R^(-r??zrh`PmxQ@2FwjDr3F8 zjPy_3vE@p|uZ z<|P$P-a7M4|6K2U(~d6iHk+?jFY+El4^QEAuCe+lwZUUXexX*G+hgmz8_agA)%&b^ zw0eh;_LNnA(3>`Ij;Fn8Pls{9yGPbwzm$)8X2n11ebe}$eUtY>nXmcA+rbCC&7O&& zhtaCG>T#5xj=$oaZ~Q9sH*eAti5>A?CKk9*t&5lYCYdKyFG6`m#UkGx(;Huo^4^Ly zC{K^J`mXm(3T*WqG+(J`^Vyy|!>^bdJja*q^lk7QuINOoyUi?kcsIMj(`h}WCYg1S z3w?*oXy7v6)#k4w*MTSQyTMmy)?-y}@LXSctM7XAiK;t%x0@G6zk>3WSb(>RR~u9l-BJKaEmB`5^_8F+*oD}`8o{iWR;|)%i-+=W7fgp>b_=G{(*S+DchyIK+0RB{En0_OKJMZzc|ct8D?;k z+JZf~2PY42s!5)uo?g#~J)iQ7Gfp$s8MhjD7!MhTjfv*5=JDo9<|4D#yu`f5yv}^a ze9e5%tnk))S9&k>Ug5pgd%gEI?-<|XzL>Scf1dwC{tNww{P+9AfeFYslsXW84_Q-F zm5D6wCT{@csTE}?-zkrU@iXbjTnyv{_&0e}7XP}B0bTLNJJufFdqIXV6VEMfQFp0d z;~zIz=()smh36s9Vb9~ngXX>7fG=o$-ujN^9b#@%{I>uZ5z-#_uQE`B{D)j#_38Ta zmV>uO8XPBzz|0GX9#mHt58?Bmx)0a;jAv2* zB|b|%TfHkhd%asdFMH3z=M~Rq{I7U!#^>|++=>0D1|vVUo3GMAe@ zvu!4@^V`~H&t`2!s&{o}SFSbVFrB(1Pg$KwcC_N3eC*4nh@3T78jkGlL}FVqXQaD3 zGW(Whx_eXIy*cs=dQ+;mm(SZrC66N7tWg9$u?^VKMi6xA5oW2ieVv`j9i6G|v(&0( z-F;oDtOGT-_og%5KrhX7^(3?DoB*rSxn8n%_s*F;iX1cBM#G*+>}b*ny0mn&)$+dX z_U*IPX{r9r$_ZjwULZ z=c|Q1Gf!0u*JL{SI#Z`AXXa|~6{&8NoBDITsjeBT)~VLa ziey(xzgV$6o9SA=ZnIj|p6M>GFU@pjvU$W_s@v8kLo{boNf{xRYDxAcRR@b*sou7Z zR3~a{lIiXxeZ9Sz?lUskb5q&2*37P5ovGI34z(=Tp6p32?aOB2aYU5hZArtFq_0e7 zyE5JVtJ6DFSFSyi?L-C3L#2C@o$2`W1A$tL$XmS3Lk6--7h>w4UwJ5;+?S_W{IE!xs*uu^Boifp<=?Z|X?sEz3^ z!Kh{39cnq2s9Kv@*4>-!U!Lg$fVGe57B#R)+cxzkyE~FuG)o~|w5ODqZc{3|Hw|EU zx-$jtlvh$+&wq;@9zI(yfoayc+77;6Nk zV>m;X!`O>|jki6?Ia!))-<=w!|EBh2XA1h|S2q_>t|yb@$ZD0IEvYAE;-soQYE}2% zbS_P{mP{Wn8~eI@(_N|7{+`rISOORrh!7pu!L(**2Z}CN+PsyBT#8JXr(FN^t9 zr+24&`h6G_ zcJCU6KBA*hI97G{^!2Vz?Mk-yJ5((6^-0WLHrca#Q*XakS64vdh#JTVjV53KkQsKo zx;5Q?ZcdQ!sVvO0Hnq>?SxaVEcKF=qu~=mY6>=4l- z)r#3uJJZ=*?`qgwWx6q})DY%(5K}ZGsKaQT#9}EpwM<{HVAf`UUJW0R7^5UU(-G9N zy$m+2QSDwnNpKv&rsUCmE>5zTGgd5+loo z2!GB>=wpCt?!_B(JNm$|qAy(pwWN0RX@v?LF!N@;qzbs^TrSnMqqDy?-P@TO1)W8F z>`G?OEs$E1SxB`U{~mX0AA){?knf5skIEt*98E+DvNOG_FDv2VXmU#`*Pc!HFqRaE z%mUId2ap?6oyq-D%N6MPf!AlTQrmlvCM?bL^k>t%c8^LzhSA+$XyZf~j)`%0q&pEL z3RKR=nshhqy`GSB4 z-MdyNd)Mt$>$>TWMO=)FIqq;+R~u8w4nz|rA)RhaU{x+(!@rmgxM(TOSexqQOcA{_ z1%+^RR)wSN3}?DXX~jB7b?9^fxr0-20}g#zI%39<2bM#FTppm5L| zk^9%}+|ZZo$o6$H-ovfaU431}nB@Ku7$;igc`(oj%pRw|_WoqI!d#@fk*&aTqEB;Y zdKa*eX+H+Tp6pbJ>Ca=NvLuCFnY;KJ1RK;4fp{UKvuZk+!m7PG%+O_!BT8JLDvnUA zGY)D*q;Agjcef*B(?LkB%cikw=*F3%y1olh%af9Bx=SXt(@8)X#S7`E%JeYBOfyQU z<=8opM|JnDlTd~k%gUWX|Jn>zFgCPh``c5R)RB?RLgzd(58NRfkP0KXBfnNF@TPOJ zQwQHw-8(bt%uJ?hBc&FzI4ZA6_K01PR(70$1YwxTS~Ho>-n7PXFV6KQyL!~pWcLU9 zaP7_XsC*=CTDoa>GTXzvbOlyukCF+|RVQ>{Qo2T*_vc`au*OZ3Rh7chR%%EST)_fZF=eFN#Zb= zzP(sb-MjkG9EQPt3Y6yECiMn@eM7=VQ$B9E7#E=fR1VCNLp1M1!lU#e)7cLL8kV60 zFc)yD6v0WQ+}x=swJzYCMghm|CEH!HDCVwvvlUA0qE72HGU9@gz-FbBXsni0=4Sw%ISYO=4F7%{lM z1(OvjHV zEJ2`~VvtV4w6-;axT_E^pbKu439t{zf(bYtjoYbR-5G3N?KyRBsvlcshfB+El(=_K zWivg_P1jLmovEapsT^WqvP15-a=4T3cWScRXps=zm*M^|4OUE;TxCXq z$9e-6iN*5terdQg0|BvIdV$6^k=~JNlY}EjYdSS}Xu1bGdQR<3=6Y!(V)z9M$b)4l zhd<&`u;L&02Y7IzQM;hubMTU+n$bdeDiY<4b$S4=HTwVdtTx~ z{1maVmA0p{-8tplTITfrw;sO%oa;(aT+dkUI($yHv8XfWUo~L*lwv&O5Z>hEcKtwUOw944lo~ z&XUBL2|Cp&@A@pfnddpYM{v(KW*~HQ174ll*{eEPY-EVh0?IdTPpu)aBlRx+B%vr*E2Fs3lW4Z`ufIO9q>&PzgD9)~i+Zr#d@<iarmcPqBeMaYC9c(&aQ-*0-+G>GmVlNbOAHf{lk)#)B*}&Q!;eeiit$^FE-^xyH~*buC3lVlY{T z8ylVkNMPy4sh@_N8==#C<(NQ6$$ZY3M;2`(dDI&B&H(Wew;bqqSyvBAHDv%#x2X=iBfS&<%~WaVr@9Hhg20_8_huwI1-P z%5AukvlpKvWbMV5hKbX3 zP0DqTjJXX@boD&$;jdkeK)&s$Wi4Xw3( z1+qz{b<;94;0HY;{?^IXp!Z=sJShR+ZelPe#h4D_pqIw!_PQ>kqc=kIUeMr!giv$( z-G_eZiG@D)u?`(}Vm##&>jP@%EZ`fRl#beW>o#Uk#>R#YOS0WU&`!lT3-RqiU86N- zI9M0Gi;^<^np#g-!re??NX6n&d(! z0eaNP_c9OAOqVtv&~|qOe9O|D@6wh4+UU}j0vdE7eCN=tbvWl^O?u2a7oybTT!>PS zcOgnW*@Y-|r3+E&Di@;EzjCCW56ht4B(1}Iyx-z6la4I&6{TL_wxiUWTpFc5--Rgk zeivE}=(9@q*(^HT>_XJx78jxpx4IB@xXp#A!{=OxI(*)RsKXarh&tTvLe$|77orYd zbRp_+rwdVsFS!tPxXXp8!`%+FM7-x77vijZ*@dXlS6ql1-RnZs=sp*sM))3@c;pgA zjlSwa)aYw2M2)`gLe%I17otYra3N~+O&6j@54sS(&1!zjg{a>{E=2tvcA%xA-y<$W z{l4u&)bBekME$<&Le%ejE=2tvbs_5aeHWsBKX4)H_m~S&zsFsO`aR)7)bEEbME#z0 zA?o)d7ovVYb|LEb69;M${SLbj_4}y{QNN$L5cT^v7ovVYcOmNclnYV6r(KBpJ>x>u z?^ze3e!p-b>i0_*qJF<}A?o*>3sJx4U5NU<;6l{zMF(0Y`n}{r)bHP2i2A+kLe%fq zE=2u)<3iN$w=P8eUU4Dn_d6G&e!q7i>h}j1qJFQs5cPY_g{a@_E=2wQ!-c5dA6(f+H6vu<66)IbE?bcO;A(oB{s*_$btL z-mH!TahMH5%&pPw7cJ#@-GOrKL3{;U8!`dtZUskx= z6y8Bco%zQuu|Z*URnDAGXHvAZno>M2`_78JIZ`Vm5UnPa=Gh3Y<(Qjdj%DZpC;5z!WFgC{< zt`#IQkHZ++@3l8Cz&IL~JC;So5-)dTYg0>yNz#T~W-oN0LG3*_+mYtBkgF zv|Lf#bDpEvCd2s|b!csUr>O6Hz_jm%hW%c+_v2B7;7KXpx@Wh60j9S&PHJ;cweF^vo zMM;a=LvLGPj19eO`3?M7auqJIaj|h;KiEyb$Iwk?vg1np4wVs`8Jo$=hS=$o{bf-* zS#77l8XG595RCw9QT#-hT@ek`D?(_g*}V05g<98V8del92^-NU1UFENMx%b^MH!8H zaWj?#nmU2W6CEG*Nw1bNNgv~nhze0Xl;K>AfDwhDl_~(K&o-g~s#vKiJ!AZ3Vt_y( z8W84KAQmtT@@ruNQ~b7cMosYBz*9vD>IyFW+4ybGC=6AJ?tJwWHQ@I~Xs>`*dCJOY zu9`@MEc6sE*iF(=?>6+N*7zM1*zehdEq;?Q$ZT;M#<#VQPQf~Pumu-TZP zCV2S4?@C6a_>!9m^w}=f=QpE<5rUJoXwwA2rfVUPbj|U$)~G)awHL#Ok|BGsy;x>_ z+&I|5LuUzz$Q!iZ{-&zJ@OmopLq+X_Tk(IS0?Oxce!t0HpqFX4Kr>!f+AHO{+FlK} zv+SXZILkv9;eWhX4tIocQ-&3gN*Y6f5b)Il+a;(yFq9_t8CC?|8wf?<1a?2nZuhee z@A9Fr`~CG^PXvE>3*Lww9K`>yU2N!TxGK84C;;Of0(?FE$}_GujD?oRg!};`qW^>1 z5w7Tn1;2|JTENTE1LO+&eJF{gNl^9seSjhnT*Z4M_;nn6=n(#o4PB1Gq39ttJ$OA# zYT(Nd82)ldWWg}2qXv+&1Y=#C`-Sw&*uj7G#17sQsqkQm1)6|Vj3_!FE(Y4h_G3+1 z24)(g(f~l>ACy8J4jhR3y`1E6h9MV;LE~u4q0a_60^-xq?X?vikTIA$iUXM;&p3QF z7^YcMph@d{+}8JD0S>+785a^0qE@M<`YW{JqWdFK#~dG$xrRR)v7zr7un5f~mxB*# z=rEm)RBX`nCK_ghLUcm-iNcdSz|-7@wEiAU zZ67?0LD8py8hnBX`{1+URnHyk$D-my;eT{qZ4W($UY`_1vD|@rnX-fTl+}CkOqc~k zE!|+~8hiPVn6Gllv7u+d zacyjs5f}$^-Y%>|_whpW-i{!F%YC@yr8^u`7HvZN=SA^5a!jocdEiek*$01vnLi{( zhToz7dod%{AC{U-FdgRS0hn95q7xr{6M<0-{VdkYIQ)nr+rtCIbP;YY5oc;(c#!Zv zmnFF%pWvQjRMRz75au|$3>DGX(C?iEb|_G9qDeFo<&s~_qJ_n37ArC9(Qt(aL1}`D zPQcH?LL)3B@S$j7v6{uo6Z|oDnK!Do<8`p3V+xJ9VK{hGNQQ=J5yTJpSOETq3*3;q z_@A-l16YNDz*o=Pwz+QZi-)`le_js@g9W5hULw8lIEAm7q2Sj-ya5*c7amD$MlrM5 zi|<0K=ZAQMKT#KJSkO z3PAL5srv9oQ*8*<`#f+5q$yQlRAU=-Jt)zdSTEN5IG7dNWI`_XRDG!r)FVeimQWw6 z_v%UjdjmSHMH!pP%nD^}9&z?mKq&2c_RMPlzsQ8$3Cz4mdK0VlB1B>ik*$qG(q!@y zn@0&|0>U}Z-j@1$8xbLZ}u(=7b&J*W@6Tjr?pM~Ee#eWLlN>t-!tXeS-)3!3VyTnq#3gz zZnVlJIxlYU)%Gg3s&^^%!oAz0+VWrQnBlyw*jPW}&AP_={1CHd%$+fB&fJq`%$hfE z*4)PWrFbm?U+FrfJJp8=!JUou>+$7>bUPlIwr0*vb)V9Ww@yrcg+&b=@~FQ2yKDKU zjx$QX4Tr8qzUVew3>f3THhy%(d$lTsA10wfDZc5!Z`=G|QJ7v)_`}a%4Eww32LrPcyAi|7&%OFSO2g6Pc6XTy_A2;erPx= zg8+6lc=1R);g$Goc@e)0%nj1{n`+KQZ8OgB+E6aT`Q#>iTY4Q%8{2SQi*ti@!ug>0 zk4KQ|q0SHg^mUO26yjykH%&FNMYuN0{eAxAXBAGYc%s9HIAeIoCO3@N|}P=I4iy zw&rN^E*9IaM_Zm-^8C2BNJ9lbe1DtH6`KxkKhm-z?K)4|G(!WPz;($vV?VV2XYKO( Z{*PWC*1z}t!+HOsQvAQc|A#E_zW`go{qq0- delta 17323 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 diff --git a/Source/DiaryService.cs b/Source/DiaryService.cs index 3e8e280..4b2de9e 100644 --- a/Source/DiaryService.cs +++ b/Source/DiaryService.cs @@ -3,6 +3,7 @@ using System.IO; using System.IO.Packaging; using System.Xml; +using HarmonyLib; using RimWorld; using RTFExporter; using Verse; @@ -12,10 +13,12 @@ namespace Diary public class DiaryService : GameComponent { private Dictionary entries; + private Dictionary> images; public DiaryService(Game game) { entries = new Dictionary(); + images = new Dictionary>(); } private string[] GetTextEntriesToExport() @@ -130,6 +133,28 @@ public void AppendEntryNow(string data, bool onNewLine = true, bool writeCurrent entries.SetOrAdd(key, $"{entries[key]}{data}"); } + public List ReadImages(int day, Quadrum quadrum, int year) + { + DefaultMessage defaultMessageSetting = LoadedModManager.GetMod().GetSettings().DefaultMessage; + + return images.TryGetValue(GetDictionaryKey(day, quadrum, year)); + } + + public void AddImageNow(string path) + { + string key = GetDictionaryKey(TimeTools.GetCurrentDay(), TimeTools.GetCurrentQuadrum(), TimeTools.GetCurrentYear()); + List currentImages = images.TryGetValue(key); + + if (currentImages == null) + { + currentImages = new List(); + } + + currentImages.Add(new DiaryImageEntry(path, TimeTools.GetCurrentHour())); + + images.SetOrAdd(key, currentImages); + } + public void Export() { string folder = LoadedModManager.GetMod().GetSettings().FolderPath; diff --git a/Source/DiaryTypes.cs b/Source/DiaryTypes.cs index dd06522..7a6f38f 100644 --- a/Source/DiaryTypes.cs +++ b/Source/DiaryTypes.cs @@ -85,4 +85,16 @@ public static string GetLogWriterFilterName(LogWriterFilter f) } } } + + public class DiaryImageEntry + { + public string Path; + public int Hours; + + public DiaryImageEntry(string path, int hours) + { + Path = path; + Hours = hours; + } + } } diff --git a/Source/GUIDraggableTexture.cs b/Source/GUIDraggableTexture.cs new file mode 100644 index 0000000..3b10063 --- /dev/null +++ b/Source/GUIDraggableTexture.cs @@ -0,0 +1,212 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; + +using UnityEngine; +using HarmonyLib; +using RimWorld; +using Verse; +using Verse.AI; +using Verse.Sound; +using RimWorld.Planet; +using UnityEngine.Networking; +using System.Windows; +using Rect = UnityEngine.Rect; +using Verse.Noise; +using RTFExporter; + +namespace Diary +{ + public class GUIDraggableTexture + { + private const float ZoomRatio = 0.2f; + + private float currentImageScale; + private Rect imageRect; + private int imageWidth; + private int imageHeight; + private Texture2D currentImageDisplayed; + private UnityWebRequest imageLoadRequest; + private bool imageLoading; + private Rect outerRect; + private Rect initialOuterRect; + private bool mustRecomputeOuterRect; + + public GUIDraggableTexture() + { + currentImageScale = 1.0f; + + imageRect = new Rect(0.0f, 0.0f, 1.0f, 1.0f); + mustRecomputeOuterRect = false; + } + + public bool HasImageLoaded() + { + return currentImageDisplayed != null; + } + + public bool IsLoading() + { + return imageLoading; + } + + public void LoadTexture(string path) + { + Log.Message($"Laod {path}"); + imageLoading = true; + imageLoadRequest = UnityWebRequestTexture.GetTexture($"file://{path}"); + + imageLoadRequest.SendWebRequest().completed += delegate + { + currentImageDisplayed = DownloadHandlerTexture.GetContent(imageLoadRequest); + + imageWidth = currentImageDisplayed.width; + imageHeight = currentImageDisplayed.height; + + imageLoading = false; + mustRecomputeOuterRect = true; + }; + } + + private void TryFixImageCoordinates() + { + if (imageRect.xMin < 0f) + { + float diff = imageRect.xMin; + + imageRect.xMin -= diff; + imageRect.xMax -= diff; + } + else if (imageRect.xMax > 1.0f) + { + float diff = imageRect.xMax - 1.0f; + + imageRect.xMin -= diff; + imageRect.xMax -= diff; + } + + if (imageRect.yMin < 0f) + { + float diff = imageRect.yMin; + + imageRect.yMin -= diff; + imageRect.yMax -= diff; + } + else if (imageRect.yMax > 1.0f) + { + float diff = imageRect.yMax - 1.0f; + + imageRect.yMin -= diff; + imageRect.yMax -= diff; + } + } + + private void OnScrollWheel() + { + Event.current.Use(); + + float xRatio = outerRect.width / (float)imageWidth; + float yRatio = outerRect.height / (float)imageHeight; + + if (Event.current.delta.y > 0 && currentImageScale > 1.00f) + { + + imageRect.xMin -= xRatio * ZoomRatio; + imageRect.xMax += xRatio * ZoomRatio; + imageRect.yMin -= yRatio * ZoomRatio; + imageRect.yMax += yRatio * ZoomRatio; + currentImageScale -= 0.1f; + + TryFixImageCoordinates(); + } + else if (Event.current.delta.y < 0 && currentImageScale < 2.0f) + { + + imageRect.xMin += xRatio * ZoomRatio; + imageRect.xMax -= xRatio * ZoomRatio; + imageRect.yMin += yRatio * ZoomRatio; + imageRect.yMax -= yRatio * ZoomRatio; + currentImageScale += 0.1f; + + TryFixImageCoordinates(); + } + } + + private void OnDrag() + { + var currentCenter = imageRect.center; + + float xDiff = Event.current.delta.x * -0.001f / currentImageScale / currentImageScale; + float yDiff = Event.current.delta.y * -0.001f / currentImageScale / currentImageScale; + + if ((xDiff > 0f && imageRect.xMax < 1.0f) || (xDiff < 0f && imageRect.xMin > 0.0f)) + { + currentCenter.x += xDiff; + } + + + if ((yDiff > 0f && imageRect.yMax < 1.0f) || (yDiff < 0f && imageRect.yMin > 0.0f)) + { + currentCenter.y += yDiff; + } + + imageRect.center = currentCenter; + + TryFixImageCoordinates(); + } + + private void ComputeDefaultRects(Rect inRect) + { + outerRect = new Rect(0.0f, inRect.yMin, inRect.width, inRect.height); + initialOuterRect = new Rect(0.0f, inRect.yMin, inRect.width, inRect.height); + + float displayRatio = inRect.width / inRect.height; + float imageRatio = (float)imageWidth / (float)imageHeight; + + if (displayRatio > imageRatio) + { + float updateRatio = imageRatio / displayRatio; + + imageRect = new Rect(0f, (1f - updateRatio) * 0.5f, 1f, updateRatio); + } + else + { + float updateRatio = displayRatio / imageRatio; + + imageRect = new Rect(0.5f - updateRatio * 0.5f, 0f, updateRatio, 1f); + } + + mustRecomputeOuterRect = false; + } + + public void Draw(Rect inRect) + { + if (HasImageLoaded()) + { + if (mustRecomputeOuterRect) + { + ComputeDefaultRects(inRect); + } + + + Widgets.DrawTexturePart(outerRect, imageRect, currentImageDisplayed); + } + if (Mouse.IsOver(outerRect)) + { + if (Event.current.type == EventType.ScrollWheel) + { + OnScrollWheel(); + } + + if (Input.GetMouseButton(0) && Event.current.type == EventType.MouseDrag) + { + OnDrag(); + } + } + } + } +} diff --git a/Source/MainTabWindow_Diary.cs b/Source/MainTabWindow_Diary.cs index be5a202..b500a39 100644 --- a/Source/MainTabWindow_Diary.cs +++ b/Source/MainTabWindow_Diary.cs @@ -13,7 +13,8 @@ using Verse.AI; using Verse.Sound; using RimWorld.Planet; -using static HarmonyLib.Code; +using UnityEngine.Networking; +using Verse.Noise; namespace Diary { @@ -26,6 +27,10 @@ public class MainTabWindow_Diary : MainTabWindow private int displayedMessageIndex = -1; private float messageLastHeight = 0f; private LogFilter logFilter; + private bool imageDisplayMode; + private GUIDraggableTexture draggableImage; + private List dayImages; + private int selectedDayImagesIndex; private readonly List fastHourStrings; private Dictionary truncationCache = new Dictionary(); @@ -80,7 +85,9 @@ public MainTabWindow_Diary() DiarySettings settings = LoadedModManager.GetMod().GetSettings(); + imageDisplayMode = false; logFilter = settings.DefaultLogFilter; + draggableImage = new GUIDraggableTexture(); } public bool CanAccessToPreviousDay() @@ -363,13 +370,36 @@ private void DoLogEntryRow(Rect rect, LogEntry logEntry, int index) } } + public void DoImageDisplayContents(Rect inRect) + { + if (draggableImage.HasImageLoaded()) + { + draggableImage.Draw(inRect); + } + + Widgets.EndGroup(); + } + public override void DoWindowContents(Rect inRect) { Rect dateRect = new Rect(0f, 0f, inRect.width, 40f); float widthPerButton = inRect.width / 5; + Text.Font = GameFont.Small; Widgets.BeginGroup(inRect); + + if (Widgets.ButtonText(new Rect(0.0f, dateRect.yMin, widthPerButton / 2, dateRect.yMax), "IMG")) + { + imageDisplayMode = !imageDisplayMode; + dayImages = Current.Game.GetComponent().ReadImages(this.day, this.quadrum, this.year); + selectedDayImagesIndex = 0; + if (dayImages.Count > 0) + { + draggableImage.LoadTexture(dayImages[0].Path); + } + } + if (CanAccessToPreviousDay()) { if (Widgets.ButtonText(new Rect(widthPerButton * 0.5f, dateRect.yMin, widthPerButton / 2, dateRect.yMax), "<")) @@ -429,6 +459,31 @@ public override void DoWindowContents(Rect inRect) } } + if (imageDisplayMode) + { + DiaryImageEntry d = dayImages[selectedDayImagesIndex]; + + if (d != null && Widgets.ButtonText(new Rect(widthPerButton * 4.5f, dateRect.yMin, widthPerButton / 2, dateRect.yMax), fastHourStrings[d.Hours])) + { + + List list = new List(); + for (int i = 0; i < dayImages.Count; i++) + { + int current = i; + list.Add(new FloatMenuOption(fastHourStrings[dayImages[current].Hours], delegate + { + selectedDayImagesIndex = current; + draggableImage.LoadTexture(dayImages[current].Path); + })); + } + Find.WindowStack.Add(new FloatMenu(list)); + } + + DoImageDisplayContents(new Rect(0f, dateRect.yMax + 10f, inRect.width, inRect.height - dateRect.yMax)); + + return; + } + Rect entryWritingRect = new Rect(0f, dateRect.yMax + 10f, inRect.width, 300f); Current.Game.GetComponent().WriteEntry(Widgets.TextArea(entryWritingRect, Current.Game.GetComponent().ReadEntry(this.day, this.quadrum, this.year)), this.day, this.quadrum, this.year); diff --git a/Source/Patches/ListenProgressRenderer_CreateFilePath.cs b/Source/Patches/ListenProgressRenderer_CreateFilePath.cs new file mode 100644 index 0000000..6c6c1c9 --- /dev/null +++ b/Source/Patches/ListenProgressRenderer_CreateFilePath.cs @@ -0,0 +1,17 @@ +using System.Linq; + +using HarmonyLib; +using Verse; + +namespace Diary +{ + [HarmonyPatch(typeof(ProgressRenderer.MapComponent_RenderManager), "CreateFilePath")] + public static class ListenProgressRenderer_CreateFilePath + { + static void Postfix(ref string __result) + { + Log.Message("Image created"); + Current.Game.GetComponent().AddImageNow(__result); + } + } +} diff --git a/Source/RimworldStories.csproj b/Source/RimworldStories.csproj index 94e0883..733c682 100644 --- a/Source/RimworldStories.csproj +++ b/Source/RimworldStories.csproj @@ -39,6 +39,10 @@ ..\..\..\RimWorldWin64_Data\Managed\Assembly-CSharp.dll False + + ..\..\..\dlldeps\Progress-Renderer.dll + False + @@ -63,6 +67,14 @@ ..\..\..\RimWorldWin64_Data\Managed\UnityEngine.IMGUIModule.dll False + + ..\..\..\RimWorldWin64_Data\Managed\UnityEngine.InputLegacyModule.dll + False + + + ..\..\..\RimWorldWin64_Data\Managed\UnityEngine.InputModule.dll + False + ..\..\..\RimWorldWin64_Data\Managed\UnityEngine.ScreenCaptureModule.dll False @@ -79,13 +91,27 @@ ..\..\..\RimWorldWin64_Data\Managed\UnityEngine.UI.dll False + + ..\..\..\RimWorldWin64_Data\Managed\UnityEngine.UnityWebRequestModule.dll + False + + + ..\..\..\RimWorldWin64_Data\Managed\UnityEngine.UnityWebRequestTextureModule.dll + False + + + ..\..\..\RimWorldWin64_Data\Managed\UnityEngine.UnityWebRequestWWWModule.dll + False + + +