From 731428fb449ef9a9257cc0468367dfbfaf699186 Mon Sep 17 00:00:00 2001 From: Leonid Pershin Date: Fri, 31 Oct 2025 10:13:42 +0300 Subject: [PATCH] Refactor character information display in AIImages mod by modularizing the rendering of basic info, traits, genes, hediffs, and apparel into separate methods. Enhance height calculation logic for improved layout consistency. Update AIImages.dll to reflect these changes. --- Assemblies/AIImages.dll | Bin 104448 -> 105472 bytes Source/AIImages/Window_AIImage.cs | 406 ++++++++++++++++++------------ 2 files changed, 244 insertions(+), 162 deletions(-) diff --git a/Assemblies/AIImages.dll b/Assemblies/AIImages.dll index d3306cda103a93363cf9de6b80da613ea069631c..26489bc918a11fbe5f2a2ae0acee83c82985211b 100644 GIT binary patch delta 41715 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 CoIHsD delta 40756 zcmb@v2Vhjywl}`cnVB;!37I4_>Ai50NgxSOMfZ%(IO+j~MlfNMLem|K%CpmU zE0hL&%>4?DGRxI^^F*b)Z}l}OSO)U7<`qg8>m_cPSP5acJOwhvR=LxoGNI zqOblSQm$XLL}@igs;4Ozn-8kJj~$4r{qD$6B%ux^%~PL8#sZ@0?#R&~=~YBNy&8bX z9f2|}-OCbhi^TB#Bv6$$;}Wygaa$p)^=S#Ues_H>8NF4Su0@VEe{yVAO4dE@{D-2< zHxJQ9D|5|dS_|OI+5p&=;eO7%Cfyghp2$f7E#QhRMa~m&1+)&WecgBN%M_)rd6D;g zrPln;8&(c7i+v5|vl-><&h}L*O5M6^{O2o5*woT5SL)4c(@T^F^E-E6^UsV*Gc6-s z>0uURTwc~wAuU@AXj<%=WIb1R*3-yE*8Q0=Q$4r|l0MB5yB1tcjV)qvSkesgj4AMp zF(r+r>n@-*b?|m}qe=}(Gl>E-dYShJLYXZ|(M2L^?g%`u^fs4gl_-784Ow60&w;mM z#ZatjkvQi|to&SaWA^YWFN%|@Mnxc+1y#};)18b#Su|aZTm*k;kr1f*#oTke=4E-T;%-2n`C?u* z@_X}wZDNt}LpFN%!pZ2B`Y|HS4K)Vk&~)bk)T=;+x`Xq3D+A0K`Dew4iYfYyC>XmP z4MS+|;3ODZ&B<)0Ws&Y73R{SNGeqk+JOdD(JPyy1DLNjqbgbvZ5nIPeFosbBRm_4a zuc%@Ks=>rb*~m^in|ZUs@`h8U)YLB2aCRKDr|I7o13T* z6_e9fLG<7te>X+%1*Pg5$=0&8j!-}I*5Ycs{~ zZu6DmioyQ^GUGm!Umb+r>U?8B2zDFro zKGNJ{d=&8Jj>+~0yaCVEQwB8r_19l!K(BHaS#37&Juc7PEzqsKgUD>EtXJITyQO7- z@yd`HC@TpMM9gPA24&TA(RZABIvblwfy~I`AZ7=`hXewVCpepRT~$$UtA68aI4+Q7 zO@}F#1R@wyzJ`Z)r3V7_9uy1!rJd%3dVYDXWl(e@NRcN2^bAxLRzlg?f$a8TMa;9C zZTw*FDb2U7oL-(kVh~&T6be<(y@{>thN5%Oft}S2xixcEAk(28!ZMpghB-QBoN#sy z1#%+KfS4UbOM;PSIU7Pt;;AhO>Cb_#-vVI!G}zgaAX*Z%TS9gtHbb(y!C8|N4n&_% z=3UV($k*GhkFt<(g{;FD(%jrYZhM7dwbzcPQJ8BED$lbTd`{PLb5?b2=3s6n#sOTx z9337H&w=Hst{B2H=%|okj*iY9&d#Gio)y%5xFX*QY5`nvW~wU+4hU*~rz`T|iv0at zfgxzS!ll26e6}m#s`mz5dXC-R!a!lWqib`AN^_^U(W`0Tm@&SPj;3JX1Y8jeVqbPq zIF?nUzr@*M3KU1SA*bWxqGgv@U9ZHLk&7N!9DNy_=qP5_vUF*nv~$*YVbF>CD@-jj zm8v{*Z@DvGCgUtnY7d`48O9H4dKFTAFTl{*)h(;2BUFazBhkt_rG=La|5isdJ1{ml z-`6?fa;KfY(>3B}mz`g(UDe%@#|Dp4^vjpN6& zE2ctcjvhrGU%xCSUo<#f^CF!-2;n6*HSLfwVshCapOtYA9^>18s!DeTob~-h9wp65 zx}LrRTF*xL2M3)5dCVm7|2&g$*Bg^4Eww#3$f^w8%%|-?1I@V=cBjlBhw`v_1NBwU zWsZ(!g_Bh$hkl#|{+DAPE3Eoc{zn7%n*eU>YGwQ|HuEhplUaJ`@66nPSYn0ZaVN*5 zJK(Ob`_Fc`BUsUj*I#9?i{RlLzidyK(gPmu1}b6ILM7|=)#WNmsTrs*N`B>A>Z<}} z+&|>IPKWq2T#knGZD_ zuDoLY-Y{kGPMDJ2Eu_DXlydc5oS;9D1+p?^$$;boFr))}tkE6lmMmi4*`rn|H@Ek= zvwAnA^mVMGz+$_NSxFP5zoRDe#-620h52O9df4zq&;ClKS=)G0Xe|WQXg+*i$@LSR zIPj!}i_B$>?UOzb7RI}C;iBXM4g=T6AO8w6{`%XZ2}wUzN22#^eGkgi*z=)nq2{(4 z#D=vu6;?oP0FGG2jZmYAzOy0C=$3B}+OW?!!aTp}Iwfv;n-7go#}rU^q#7-Om>R{L z?2MetB%Y)kG#8D)ToIrdBY8?ub2=1slmOOnS3+OpC=jut4WFt;b(GZfK}=AiO`@z> zNQYRYo`MXvkVZj<0Et5yb)o98&eSKVsSD5D{3; zB9B5OWzP^9X5Q3NuJkiEwFH%6=9|cW%K1#IDBSF#YhjFT7WXbt#+z-uOSA2YOLID$ zaCvu_{)~B6@8V{wh+5j*p^7~Y$@<TDi{232C>%mWDNxtLx^osH%>jUi0F(~&}k1DwV< zCeKZk4m0^$Ca+H=^AI*(0Hw4fq{p!%WX(L3jU6B&TzdzGbj*HC<{7~F1mrR-h$y7n z(mW*?-wWB1Lhi+6s-o$^q$E~VPQwRMSBrZyxe?^JF&Z%0Kx`nL#+xkub1IqV5u>OY zh0wp)37gz>k$>cPQE+nkQoW{~FB&^Du#550iTp_eEe-6s z$X_;#qa4A`L3Fc6B3M@o!rqL)DnZzXk?+j4ee)~0lf<~ssN&`rYfz;##JEz`SZ{vS zcVaHPI>yCRac_)ut40rV%0UhBy>?qQ(h=!;ZmR>IiEK~6Q=evdYG^t(#Tj7D_zsdj zXXG20p~KxgA!hpmzWPSeENb3WOEA8xL#6dMR_B(M-5B{EQtT{Wjb=1Mla+_{D%zzV z2ZrAa_N$B^D54o{NqI*E+aWElhuatq8kQGhkfdpz12t>L1h5>Dt&mTdR}WCHI(Q$V z=_dfBdv){Ceu2;dLZmwMG3Ks*1%J;v(abow;BPF4?l)NXNdSD}mUI<%>Gin;%7J#H zs>oYhXe<}P;w@PyGmt5T+<#L@Q=M_klP9B?EfBevef}drX+3vMU$!@lBLqye8hwb) z+#sDQH5in1Mw`O3XFm z{A55i<9ErMv-%gtJ7qL?)P;^|H3SVxwgk#?@`4V{n-dL_WslBAXvUoG=vWwc=wzzH zsgGh`SZL%|p&Iw6NI3Q5y9mUkbMEStF!FR9$Z^+A?LwA9qlfU&U@hfSX7h##4=%9E zIk|RQ#l^70w#k?*V!weWOPZq+bWHuIwgdEFk4!7$&r*0p=|h*l0$gheWH*hSBP%QR zib^*jv^~xD2NcFJ>G;xf8x-;yH*g`;PBvS7+)+dqfUgOy$QW4gT zmw=@q)oM8{GbTuyXRMYq(|A@=kMW_Tglf$T2IiG-Uo za9}8Icf!|McpQLVOZM^(=(G9(M#gp)I0eASsKb|_2!Ll(pV7?dzyz8yBb?4OYd}jc zN_3z?%;-^=(Zpt$hYrd)bs8l7;ZtDKAL7uaELH!LJxJatV&RKo7^8E~IT#%?;LLLI zTv~pU+XKW1A7yivj#ICZf7D+(qC+fRmRtM4hr+I=)3P!kUpW zUC6>$v-a^gnD@!t-5r++yhc7tvrbmL0e8S_IVIqh;}v_LL2NgBICV;|qJUdXFxd5f zTTn!HCZZGh!F=YBkdE=`>wCC$*5c|2;p3F>hczE~^e@pS2>*3Rt#9rQ`0_<*i&cjlSB;+a|z-c~n{h|5wxU%ud)MHJKEQg7Ju;M}e(R6Ut zXa?XIHQLSGcW7bZWZ0b6_5@`36l>ss4i|z$P+4vsby#7+gDe%Es>#)b zh{z=1Fj;w$jgJ_l3y|_luwK zwIqx!wBHzl+GI1^P@ozk8OcJihIG}KkU+vpZpvn-KgwdY&3mhf=BA;!?USI~-?={F z-LTW09`>sG**>HrWBO)yM3BoXl5S%Wc+;8B44DwJ6JJpB{8dCmn34HM{NZ{ zd@xCb1E>wt8YEv%67ORomM_$A=@DaYqt8DLl^D2rNB(vhl8@qm17q9cC2trtx45 zG5YmpfquqFNn4D`lGYpZC9N`6Nm^t)D`}4Lk)&zHACfwAQe#^JzjX0({gG$Kv-;T0 zY&gAbiP&G0q>O31L@51|l;Po-nlUPg4h^5F8IzOf!0>3zxG0IXhlgs$wMn!&+-BSX zEIr&}EJs&Q57!$H;){n&m9aq5B7+A%_ZZdaNN~6(d*ZFO26SZ^$XOux+in!mngmn6G=2$& zzipoI8k0OeX!aOwTrNCWHI7U&_#5PrNch7eRAY3K!6&XBV*;0mhx@3;>?FsU2sqgO zaItD!kz`mC0Y}#lZ}`LHwkJ&P+y{v_x=xteUV77Kvan(P|#hm?WJJ@us-LS-NtJ3iD8Ac4>8jf4tf$yf4~psQ$ofo1kAqK zm?I)Tntu%oHuMv-Dth&rVNH|>lE-)%vg{{I15a{@kjHq}9CUPO_+DZ5W#&uv)X0;D z$M{Vcc~V|5;*Oj6q`DxHR|ez1A_(WQsiGo!5)xLWb)?{~u|(j!`gTqb0` zY3*=I^p6xWA7-l+Ctq_2yM+z#8)MA0;duoUh5Z(H05oeIv)RFZW2V_3?5l-+yRaWC zaSgDY>Nl2~(}(Bfu4Z=ld==k?8s_nS*ke3y-aI_muvvIVsuel+4`m)Mjlp|cs4Xf& zbRtu6aSZAw=APlf<9`&M$8ff@R&F^Djyb5@_B-MS1I6hXA~T8gaHz%ORYE(Ct@#8r zG~Z)9WF9r5thre@C93s_vvz16<1nFG3njb%725Yd{mmOkl*Zpd*Q$2NI|u7Z#1+Xw zXQ*z_YK&1R9KpnjGYLmD$X(Tdi|jC?BWvPsfbNKj%179aM_ITKd?H5_ zM+FI^cfi&rZzvD=A_9Qslxb}~`XvKB9ZM9FwC%|Xzl|N0CfbqV_=QcJXf+69H zVAZV=Zx*sVdN~L(2?Vgt4|rx&u)x1r04seA1ufu?RDvcgh0}d~(~=ANGV_~b>f!@< z9&j``a>BN2ab$!p7&IoJS9D%(rnhNW23RLYSaO4Bb(N4_1@$^km3=zKmQQX%6FcEo zMJ(BgcwxA|RJ_IxDEBElWc3YL4B#t*Dw5qz`q|%BLk@jB8k(|{;mM~2D*8f&`#+Si zH0LV?R;@fyoQoneJ8R818;{EyBAax}4(W+CxqPZq--Hgwwh2uihx)TUn(-h?2RsMV zXf8bN(D;wwS?+wUtD9_1(as+I2L!Tx;mRzZ>|pU)MKkISf@*)Hnw?$66^mg65!tiu zz@F9DWzT9KyCjwv=EzZb@qwwa=JAqdPh-P8yS!OmL-y=Rq zte0m6&PYvHNANQz9t*Isk{rfss8`dwv&`T1Ozbmx_@cX^r|Xb+_TwWPrbTovRLfw$ z?mQ5scsM#`6v~`@v`sqOqMbb!lky9PoHQld=`h+vB^Qux4+*n$bipXA`A+Mh1P)Am z`~c5-ict@3JVRK!e9d7@hYGmlZ(HE7j>PJC?`mE(`e5r8LJoZKQAs1?4iuhI2i+H` zj@TjCX{a+|@NEp^9obVki|&ATc=Org#$yoIYfwAkfYCuGqXVE2?-u5Qe_kn$gA?!P zyy#j1mc-jWel4f*m18M1Nxl_IXZ!GkD3r{G@87z9E*pTow zmKyGfI?RnHR4A93ADmE_Xozh7(UbrgJD@_YQf7puJ$gM7r;d{`Uu+1sA<9ti0URq9 z=*++dQApU9_-aU<(TLQc<3Xga3}q>TH;}&kvdpou$b~%j_bJm!`I0^@5 z9EY76_B*|qhp!_))WewJM|N1NIyGkuUrByz_dF-FSpuC9j>5A&MszG|e0A2w4Nj*+ zS?6h%&NkNh8<$gK811a{cTR#a97;H~_-y7uTbXEMMDHuwcolINl;MAY86z!a2eGmz zxtto?#EB#J6erHu)0_lj8#$TH5>x^r9e^&Y?7gS?dJFwEX zIB~|_<|G)yw-`!U0!k}HDI@y8u1XJQr6*d3ip~$YoErO>6G!adoH%12aT1K};biuQ z_|US_N>R%4`zt+ym7biU6gL^H6vt1j6xS=P6q`y`itjp7C1S1I|QlX>fCfXDiA`?Y?3Wm>02G|;?yY$(5EU?-_hN`ADt zb*!E<4U`#!5crGa8n^)p2b->w55l$ipp&cO)o?n#G`Ms3yW8i3Nye=xp~-4A(#M*36A%?KI3W#>4%#a zpYl)TYxBrcPaiu>y3?bW0;@y3rsMm*$b+1AIz9|fq{!ta!|=&SS#VF+)K{t|oO%TAb(0XTFyx`@Xigll;hZ>QIEV8=CFan$ zPn*pm(AiydGGgl#rN=|*2v&Lw7zw4va(Oj|j|3|n#fdX^JSVOgCQ+Z3;f$TYX)rd1 zli6GVRp48R4+JBLD%w$rgKsiuBv*2}c)=0F9fFhWcRp%3PsP*yGr;1>)Tf^W5E*MO zJY(@`$DmL`E|ZMq+!Jw9tx--|xKZWTmUw8?0jmAVy}@ma94xo56Oh=?-C5px-veWu zbSI2Cmh~Fb&G>{+9D8oWPESLUSOttF;}eumeLC;Z=OA>t2;=?{`$jA*E*+8(a-`H{ z>;u_)hQDxj;wgz$lENiq9CIj2$)-frFCug5nVvkHHEaAphn;m1?8CGL`<^(|9Cv0; z?tTXHBA}d%fO*=P!J!FfgpG3#OVx^?q`vrP^%fy{8|S2pQ4w}`sOV$XbwE8>KPKwQ z5*tG4;a*m|{6;S`V`8o!+aJw#jM+Fb$AjJkbGqj0xsNlZx;gi0da+A0b_$Yd64) znH($95*h`+FCZGtP2|HS?ld@NNZcM4Vz^^Uq!Ucnz4*tmJX#o?VmEq2WA3 z<1yu{p377nvku0?Yi7SGg-V$@W=dP(iChH?#q@(`i@seIeljjT3Oxl^0&AuWQbOj} zQ*z@cv6QNx$wI2mLG{g<2qYIPPRZn9-)y|h<)VYRI(c~NicCUY_zTyfpIaqU#z__# zCk&(MIrfVfH%@vEqr$7kL$*3(oCnse)p$lbm{-23DsQdMGoBG{zIJPMfw7hI`eaDq z$0qlml^5TZEc*YUBw7VeXu36Y3y=Q0##l{Ib!^x*YwUK8dj6(NL48!0hA{K&-UI1a z^O&=<4?7EVZ9HChlX8;Jojb94d(d1*qA2aKq468=of}j&&GWSKMLQKck zGOX8|_nh56Kt6le*2J(hQ1uA7F?>Xvb;KR4Kgx0kRHMxHX{CSm@Zil?ZVxq_M!Vdq zUT#)Q?XR3-j-T496q(DW&WmH`h@P4gyOi}su|jc1F)2AC)1kROoJu*DDfy`sgKe7u zAPXFH$#d}yo(a6#cozQa+*QZU6XI80iRUx1+Nc=L7n&CUiCxGPtA-8@$3xl-tPy;% zS>{vcl;ipC?sJX`T?CPfO4KME@01l6wk~w4IcQo=4m+clUkzEl@rB)?871bFY32C2 z6yCk{n1SuBHuoP~PL>ikPs{U(H!bv;X=SPCm($9u#Q_G5L=zWCbQ*j+;~c0-d|&i}8(S8a{Rn^08yY`q*)uR+KySjbnZAbW&dxYfxh_82U!WDmk6aL?}de z!q=0Lzf}`5B$vO}wB?@6zn>^wM~L_S1@l zpTy<`4y!}tIwH~yx;Y|UgI`zTkOLY{qliOYvqLWP?OR zH^!n?-dGMtq;$*NBnKNV>t8HCNejgal6kw<91tSkn`fU}5f>{;k^<4}&a6mH$2u>D z#e@^T0^DC#1kPoFyI5exJ;Z|B>kk+J5Ap znT(a-e&k=7eDeWh?6$SYEeDYQVDfEU$=IjLJD}KyO|IJ zL`x+&Xl}wQYLt;k95K_e#nEDGm}fbxRI*aeB5+VeG%^GGWGylmrP6Q}KM!fcU^P_j zliv}lp4bCiG+niRP^e}(Sa+D-Uy4P%%0Gj1rm3?z=?M10zDf-yNDjgtCA$hFwpm9ZuNMD0XOK2Q#ys z>TFIsf`j=JnJ@&}7C;-(E>{fz?aJ0dJ^5%yyfu%)$a9iJ2|f8ItP zhX>83nFZFm%%~s16p_8pJY{CCwWc*L>Lla)Z2xXpRzOw&>}66c$c?ZfU}Y^$TtwDR z7SFgB>i*l<+B-nTmhsUDSHi%Y0k&CEKNg(!3fis>>nT($wTVDFCMGh5k4&~^t$EaW zrS1hnkOnu3`4m3bo+b=B#x~06!?^)mML&R;J@m~d&dWF7JFhH`2y;d6n{Z)GqV&W> z>CQ67txU73*)=6w!vmw({V13y@*~(P|KQRY>CTnm)WxdIa2}iBSo?mzwB~S7;WZ~V z(zDGA&aZCcAsv!Ai+1iRKn0~8Rt-T;k;|crALw1dUDp~x@U&BP#~$MZqvRo^^4_IMdaeqs zYLuCNbv7p*!M4N*l9Et%C6vV;;qoe<>^ox*1F(aI#&-wK`gB#&$R=1JKXGW^2**P; zn`!f)UbCm;6zbzlwI=2iDoSgyLMfX2L@N>ac=)YK7rs$U+!pJg{&Ej7k zTCW|k#J&-RI0H(c)@RC3RyTxdi%XSCGeLC*7?tHP=LIhNKM4$xfmP z;*jT|&|2H5VfJOX2+2!#UrF!N@7Q=C&(q>CmFxgb- z*Tay=4FE>-D3rrq)Ms69s56!!kF`azcw{*UyxI`TQYeh9NTuAsl$9xzcw{+9QzJK~ z&>|~Y>ZVl6O-#8tm9mN{t5PYqGUb+3%4$%~irkt?!YT+$52nOkM4Q#PI7xa)WHrcY zRLId6*de!r5V->&9Ub9Lqzyx4QNVsyy|LFh;bFA}nJfoJQj2t!O){r37afU{j$pq; zXOW`Nb~m)eUcs`9dka!$>|X%rEu2@QjM!UL{T_(c2Q6BJk;obV99ZBbkL>vo(7qfP z3}4Oveh;oaMH)w@5ZCVmh`q$h4TFX62fpwrEPJe<9>umX%jz<6-=jvEVqFZq%sjr# z2V@ml?v5a)7X?r9AAlNbV!|INuvRRG$%;i9if`EtE|qkW1}F6vCn4bIp*!MW_ z#ZqP_E)9LMW-;!Cy;k+|^|Sk)Sdy@cyPJ;B0ovaP#WiFU9gjv<^Ymg|!CA{W=)26^ z%@izzd=xkOj81ZY#wgGBr~yyxRp=vQ99U|U^C=Two#?#o?^sqHSbkBqR}FY$+eOP` zBFgy#w0KU4a}E3PM9r>qvVCg67kf=~l%2qGoEIJPn<*RDVUPR{oR4GBT5G|O6t!Gt zsVsm>%q9{V>9he~zWyL0Xiqbp47a}496I-=#EzBc-FM--Gi92217@VmyYB$)GVdOX zz%tPqRS!YG8hx8hU&ozgJpj+W4?cQ+>(GH)W4xwj8`2Ugh=q^mF&lP@P7 z!GVeKBt@a^QD}?pWCd!Jli0hQ&#_2y6%~7rDN&{;p0iv^{0}9V7U2*Zr2b1jbS%^r(x?TBLZ0A^{`ZSvr;9%{9 zI9G(PfCQMUh)e^={+*6_?RX1i-<32B{rP zR)}DJ#R-D>AyNrus};;K5=`bIn4EM3ha`e2MWO9kXp4Qu3e+eku}?UkW09<2e#(?6 z(-T)%=Sw7+5_yixe~w(Z2^u&P*{sm1zStMYB9c~NMk3Ecv@>)}vI|J)o=t>~b#UlJ zS2A>rVKR|md}_{{Uoeq1`*#huV)do4OUCff<$TKUujc5hQStWGJZ)ha<>Ij^E)b`6 zjbnozY~H8kGWFqsb(Wrm&LHWQ>fnBwRm8G+A>pn!gD9 zUSV_oz-WrMuSt!jxImoNHJY9D1ET4q-!MWZOEmYPnv}8m2hane$wVuf7}JR6?`+yD z?1xtYIGWp$+RE){6-}Hxz@N-TG&$)A4ogH+ibC7#&=%`pJu3ee z$Qk>S^EpDAu^ElW;*Uv@9c;q}5O_H#ls7=(MNKH|(%)q66G<+g{-m^!kS5PT4I6xn4uaec;)V+8~iXBAcnbcD6upX?uHS)hd7X_`Qc>FJzjJt1%F6Z}; zuGO?;b#}u-b`wIjt(|c^OD)K&33>CBv{bLjuOo;3P@E2V*-n#HO>_q#*LqR0@j^hQh z_KMQD+-t~Efx_J#kq=M?C+)>#7?4+^ENm=9Hf5bpshco<3yZ^bI!n5!3URxOf@bZz z4nZe!f*#q;Mxj&5k${|L4OZiPs>Y>oCgA1-UCn`1&IJ0(_r4gK)F?A?CcsI`!jMbi zNWePGdjENN2Fp3iau-1ie<%7xOtM@Im<~;;AIO$m7_%m`BVPd^O0yXeslu+o_!{&B zgJDt4epi;%e!~h53;|1Y3Bfn!s;h!JOGo~L%SEZ>@^8$6*A_J4P$Dl~KBg#TxulEl zrQzZ!{W7+q&b;>89JAlm2d4&s52mI{5WbZl>}3o7QxLx8irlg9I6)A;M=C++CqcMN zg1}4!fs>RVNXbMHe&F)>pdpF<$obiv75Bywgr9&Ug23!#5E!w8kdC^NBjRV!4-CRD zpknU8?Pw;38Do)O0bptg@Xj*UctJPM#Z{5H`kKtzeJplh%(zIGnC;`34QJ^CVx~s% zdE@G3=NdwVjH^)*{vBDE(Sz*4B(_+Q-G|6lSBba8y_i4$!P3^bWhWh@>GEs4ERI^? zk#i)Fm{$^WRg{dUWW1Jw7QGg;?*V5UQDH6OiP_4s6n@MqJ6})aJj`~HKVSkMcm9dg z9*FBhf`{<>z>-Xk8}`WpMm?ZO7o2CYVxi- zDX}3|qt&PY4}@9;uj_@apB3eZAl)!YnCOhu9moxmW-5%fGxmc|L-kv z=?WYitA`At&q++@e2ztu-~^(UvzQU{&7sKmPIOtf$>74F2VoCf_D6Ibk{EV zv#L}%^!OvNaiqs~nRQE><8UhB2AR_Ezg&>vMao8c1aNe8`NO$~A&udG<@g`EA{Mwr ze*6zj#BzY-wFA*R829{7qbCcltkbAlA;Yoxjdk5<4LHNA((|ySUW5wI)aTRbm=;vOzsk$qK> zk2Z^0w~8~rggPI6h&K7?zEVfPN9{Fi$|0ySg9g-csY{Xf(c8V4+dY>hPY@sE>s(m| zyj4OQOV})@G+=anJP*I}Zq8>#zk;OE_tgitX|%|BPJ@q*ZFdAT+MLI>N6>-_+SoE2 z@Q{|pXvd>yK?U{CyC7Uc|E`!;T|tW~E{3;$EkCEBf}U>Gn=5E)>0;zZcW3yVz}FiW zL-XjKT;oMm1?9dtJbzlo!6J)P2#OrnrnOcs8agP>*zN=8U;^l^cKR6W6TSj@w^bt%DJ;T zgCa#7<4;>ysI&*emmun+Tk!XdP)tnO9O5wTK&R6vALeFY2gRkH?aeaR2N}LCWxItr z-@VQe$e>?CEHgs14e7)5t32_%I=bA7x3`^b$?eXq%#!$hP{aAXh_R14ni)ETn}Igf zQNO-i{k>>G3F!g$*4UDJJU+S$RciD~HETPv$Pp-^N81MXD53Lu4DR8hFU5bGMW+fb zj4O(BQW9pEEAE=um-A!9ftLYl6qRsn2lUZ^2Bw_beve0^rB(NMDzIq!vRR{A;WkS3 z>tI$Eec!+X?7{BblZJ|(uX673^q?!s*b`GE9LHwIS=}Ep*xqa53aFf`|GJD@oFhW7 zB0w4q5+l~4PgKxr(z%ughNENNB4y{avJZX?G1s5Poir-&N`apWd@ql??PTcTN$La- zL%h4ioTX%vD}QuDZ=e=-1%@1BD*l&Aje*DO1|jdDd0<~(^LX9ynDzX^`=Idgx>JCq z3D#P~n2*vSnMsq1Suz9v$C&A{ux=tbGyCzn?RchG85icn+T~@(WBEByn4?-OY^Y$v z>wDH0D?0Aa*_e*nsZe?_-h;BzGqM=#Pvhto@bZE2WPFZbH`>^A!9EUHycwdUw_R=) zw?C8K>Tao-Bg{sfvBC5YsbY3<2e8BFI^n(9I=|s~{77T5U}v^4b}X$C?Da;*PN2sG z+u>pC6nb8;L0-lt(Yu0~^^8rYZ)jc|t@y3`jK<^fmsDH|x9Q3n3-b!5=@yozu%QQ6 zFKjwbiBd=+H4ZU6o@P^_;y}3q#FMci!LGz-?09^%N)$(VCe89P_7CbVyoW^c3JL>@ zXW}fGnO9Q1Fdc~T@pKjS5bS&5T}?d&%NO3Y)Fjvt!LFlTg3T7Ci>bF@J%zV~S_Si9 z(Re&9r8dFt72XZhm$5hQ81=wK1W+gB7^O+y7+E!bK*GDY%nI$C&7xmj`} zjTEdzu;=MG!9Ex44H_+2mUwLsohVqmub^Mk$%0-XqWkdcXm%+MEumCVP8V#p_(D}C z2v&v<|MBEeCJELgSU@>Txdi3z5S>NJIl{XLqxyI%wz1O%t5l{dHFR;=7jb`p^0H%D z<@8zid084wY0X!$Q0T+(k1)e`!z>p0B}ht_=I#|x$shTD5FJiVP|m>!@<%P-9e z&?zYKd+q)!@G0czD> z_!T;|C&R&Yt6jWYhd=5JsA!_0gXnYVvWws*@hOUw)Gbu)9b}UkBd5A zh!uTZ%y2^kduVscGH0@4M;*PX6KrZUG3Gnrn z&4B48><<$?%N~mib2D*M6odBd{B!z$HRjFRgi1;OYMl z?XD7SK2(OqY&Lhm&-2*m7kht${DTOkLN~U2A4j}zX!#x_7Sbq7M1OJo2FjbRzW}Fb z-{3EBGr2OsMRrHc>Rp4sO=8Aix%Ih#bLUfWc7_ite9I(IZM8F1ZBH$+NT)<;#HsC|*0_fqk zYE)eFGT^X=YqJ&F>fm@k<6^i#8v)Yz-)u()%0_Lgq~u!^N6aYQ0^GO@9&wy+FfLG(3yEH54s9@nH=wqQErA%c6*3 zLec9f#okB$v)0$(#zgg8YM0{^z_VOm0-mUG-~LMD_Vsr&e8k9-S#uqM9EE1N9)Ri_HO{xX3jxQus{tQ&TP?0b*@VOYUe8sIcF130 z>*0K>dobWscl_uSMaTY+idH(tL;glv5$9XoX9Hg3J}*VjMJakNM?TeO_c^YErK;WL}?b_e^U{{nc13@mRWs!J=$@qgQuxCT@3S`8xD|p1~PLU9K?sj zbLVNCPj_Puh|?`@M&1#qdN`l&+>$f04BuW_kQc%l7o97K@xo`SU`su}X1xx@D+F8Q zab>>^>^7S>s2&G=wBE+%)cqUSCc#+e94u!q!4j5h&2H&c2NcOugVFg)5sbNTT`DC>_$_&TUaf40lG`Ku<77s(^PD~xm;FL zPB2JsV*Sh58{p;AuQoOkBNX+lqn*|)qn zSWc^K?7ot!U?sg{V}E4V2dl~3Xi3g$>J`-Ka2wm|J1SUD3vKM>I!CZ4y=r0N!$#UE z7^XSW7jNuPiu_PUfJrTrO7+XL} z)tF!trS%rflU8*q&RTN>TS_nX_=1}0@IK62L>D%n0p3mJvyGAM1O zR|T6#4|vx&TPdfFdGn~z7YVk~X*Tv6wp(p9)5e|=Y?EMH=mqqrHY&qW6qh@-><;`% zDJO1K7<;Stg?Rrr`w$B|r|gb6{uWIRA4h??yw`T@Y~~(jVR6B37;0f_1>0?7p7MC` zU>b9z#hcx>6i*?B9A#n0HZKhxMi1K9)749HvA%Pd#rvvqY4AvT@n{QE@b`G*!|2~O zx=dY8!{}GRmeRF(H{uR={%{suL|UKK!J}!y2n%!fSQ8vUt4G>c&vn6LY2YyyHY(@w z;3(Q_V~e{#gJbH(V=dm!;?=0-eacsBTT8XKqUY&3{J0x_0uwXyk)J2S@8JvQd4 zXKcNN(TLhiNba_=r;0N1Go`fSxQYc-S-c#Zu0|W{CfFz&`?ZL9Us;&UET>RBZ4?*W zLVeKLPNCJuTWS{7Zw;P8!*If$n1oKD`V$!YL>bWfGI--ow6JY`-VB~bBTurh=PO?h zj-v@Ua^!#xtlSwqoib0hu-eK!!854Q#^S&x&gjQdd2-klno7#X3`C3;Ta*L_tykN=P?KWwzxj^ z6oxLa5MaMnRD>=}VpA$BLbH+>hvK3n#-ZSCDF55y;!yCRE&to%dcdoPq^*J->T3*F%AlOoBs9p+Dl7L&idleN5w!kx| z&vIHtl{R*HpG;u&HnteNTd2jx?gZ}^I@rd3=<%(3D;;WM@jrWDM@GYKv~SLKx{XHL z*wCCjchYS(_Ob6<^)6atW8YxkcNeX2BI+W2cv90(;)Z zj>PZV@1borHeMeO>`e=kS#J$}VDqkTjO#eP`qV~m!(6e3_S#sQ_r}n@^s9{(cy9%! z$Y@*Oc{h7G-A7&<`x5^Ntota-#vZ|>dp{M}*yiF)V3js@XX{;|2PkY~>ss%N18os> zDb?kz3q43D+t~Rn8$xTzv_!@3^|aD1xS{dU%=NU|#MJO!#4JF z74`}Al#O-o`K|g0ZLzUFIHig|La*59sfCYbK1y%d*tEhG8IRI#8@s$v$GP5THny~I zJh1O<>|Xd{1MRc1C*g|?xEkZ0Z;kZF$!}qvmBHooIAz<|?ZHfXJWfS6T37R2=n1N_ zvEDUXfi>9JgzRtCjnv!5regcFk^0-%`?<^MNjl8NzR1l4Hp0gK(!bW8q7!T^z4q16 zQ#8)TE`TvlQ+%?GUJ7fTrgLrVywGymM6(jSP$sa8ZLF~NYwa1j!p3T$^cga3tfJ|y z(6h9{#u}PF1h(47t}6W|^c>x5W6Mf^1@>^& zyPv1MHufgWexCN(*!LyN@hMm2Be1~pS4k!?pN$Pflm1CrHZ}@P`X?36mT$rW&+YAw z+!v_QX0C0|09J2f@4<;%sl~=V)?W>6rGstk894t%I@HEqf%9La;WqYL`?u=9Xta%a z`zrJ=I?cxN`hKgvM3ZLA_iurx4$PNmy3M?!Wjk%7MHVKW*+$E4p4Pe?yjyK7zcmxs z8XMzT?`2wNV?67%B(5*ci`xuUQwR(8;sj>x3tRJPtfO>%C3^8=DB;4$5bYzkfXI?Vt*q z$+O-YRA*y6>%Bp}Y>a2UH|Zc7<5}-b8e(G~qF=m4!))wl^ozG>jD?90-=^JyEu}r) zg50;M9(Ts5pV8XfcWJJmj19?spFXm&!d_EyKcp(@B};J`w}d{Tkv8^B(GvQYtRA$K zPO4o(pU_=4Z+P{&xt|iv1V2fyd(--)gNmFH|vWN~3FV6jz@-F3ai|F4u z-_u^2EZ721F-FCAG~LE}U{riZvurHxZ_(*{S}5oiYQ`$~dwNM0Jl5>>J-scMNjDcS z!@4l*A6$jS`+RVGacOp8*PhfXyMN^tqbphF4$aKvP>jz=)zlV z^WId}IDe+kI(cy@{n2JVBTV`4G1(6OnTA}+Exd&KiPHIkS#A26uIhp6HA7z8B1DASoS!S>;HHyO&yR+74@Q zjv$!DRFp=+tm+kI>h+yU6=j-WmZYj&X!E#wRhhf8Q&Lqf7R-`#C<|>KOFEQI@tZnD z9m=zUS)xwmC7Z{hPUXi{osv%FXTdB<9P{5|@mSKO=(lxBx|BM>EJ;miv3V@1DbsJ4 z`O0#srWm(#K}*!F@Xvg?>z$;2l7J%gS3Oo&btUrvo}DB3!1c^d+E!GI0Rsq{)ql zKhEXh1C<^LGvg@nhoz#bin&FA)<3>VWXeN$JEqdACYB!ssNjT~q2<31#fuvNRoaG| zP=)rVIEaE={Z70;!GB)-7B4@J`WEM!Zroue3aIo#vhe?ux6EZ9sB|;Jr{La@^V@r| zi56uf4lWbiGjkGo+<%^mxWZDvgy`4B2{x`8YFXXZB8Gp$AS>#LevnG}C6{GRL1Plo z5Z^pp%9Mf-!zBWb5S`*n+<$i>)Lq#B30jg?hi#BBabBel#ralfQemobmWNU)pS5OY zsuVxCEHg6^zk)tYvSRsvlTWS8%Ab$ct7NsE{r|rgwt9drEqe{NJ77Dv;J=spzvSX)wEzDo`d{in|3A>u8@wEwHPRVxkaj=N zn3?JL8_Jm4%uFZljxsY{Huvk2&a&Mw%oIw6ojpdSaTubw|LG(prWcE1brTDICyFdX z@gGKj($Di4TKU_nId4In<|B{)$X61cDnr+T7TwB6MP`JRSPU!w-{G-1$xdJ7)>@7%$`4 zV-Z~$ST5X~K<6#cJY1*6??A#gXZeo8wnwNI1)iX_P?rh#YAK#-NHw)$&@!4;vYnQJ z@&+|IrnbFL?T+L4&cu<4Bg`hpscm1Nf@}JIPlFua;sE~$$AfvKY*z|f+)Ax7xHLm) zcl68617%owF(@nAyT?J=RF$WA9dETaDESVZjZltg>jm~7zEMh%RDX=4s(rH34kIoE z<$2!Oy8fGRP%R>|-;IcAE6 zyB&osBOPnwaM1~le8;c7AHjb`vZGwYze`9%UjBx z9@$RC`DBkg=R%<`7W!5?vuCr@>#WYvX(i?0qI)H|v?0#L60G^u5=YEd!XYO(Z&CP4 z?_5V^-9-FX2v$MSYH`#tj$SP@o%zlkp{tzBl)Lk;2fVQLM!=6s);P+`>}H^y!#cnX{A3qZ*i<^`x9_P*`J{7YV*6AoS(GCgRXXG zb6&CQZsHz$ub6VLSbDEmy3FBjU+o&?e5>$D*LQF%_x$Jm|8#Mcue!F(+nV;c){D{09Pc&%?%F8*X|wH#bHloJqVv3>2JIzVhVl-NYdZwlDWV^VC=ZVX zIL5l88}B%- z=m)LbIkVTVn$wzmVEP87-Fawjw);Ef_q+mkj>6qDUL=fT92fRE)LkX{KcoYuDZO%9 zXrA-@nk8uQ%A6(ca_8gvO2Fs!TLE9Fy4$^sw&ALiy|TgGY2EM0S^^Uxs z+_maf9OKohbMPl{YSkG%8ES1j1+6GiJjVp(@j73Jpi_uP&4 z@mtvsN)Gq5t9;ehj`5AxLjt{yw7_i7F=|oZVwB1$V|8hP%R#vWJ^UE8DfeRJn{sah z_e!0)|H8cDbxaRD?#aPCi#bF5q^QRg?ew%L@d1UOd+NnSTtOx+bCl&2di#m!5E1=O zd8@sjcZkSra83`L=w*0@w*~Fi@E<;Y-gkoYJLM72Oz#m+KE(Y_=~1`M@ttyJF~bYI z+Z@9b9?V`;d6(Dg=x9)2+{)%NyxScM;y5GRN&{;$d|PQpO}1~l^J1KPAL0BZH_vy3 zvu9B;ARpr9DD0c@jx&oYe6ySnm+HRHou=O48}InO>05QYgPOlp_c@OX|t58OIp*WxGJiTO*>b7bFOPe_>#1{A#-`! zEY~I3*QC|D285qWTPdZMVNAUS$shBUpfP+}H_vri_77=Z*9{0d_kds1K9AeIdRb5W zR?oqGc$VYZ=8W`Zj>mKJ0eiKC)0erH_*&Dq(l4z##&-j*;>SDwC>xZ1i|ampX!_j} znzgQe_@=FOjrQfMtCdfiN2jlK#mY_rS1Hd*dq!lu>Kt5+1k`IW83&|KVE*U0u2ss* zmZaaSRO`2;uUF!zV3{)6|1k3NTUuxq=-co@km+z_iw5rIik<1pl&g{7D5W+_sm&tK z-;tb*S&GtLn6XH?5v69SuX+b&yd;u4L~^R=-=WNpqk?&Aw|1STiqff2xygGlVL>s;q;Hh>P6~vbvrY@l1cGL8LywawijKJ z_MPjhwjVOib$#L8mvOR~c(Rx{OTE7#+-;xhPj6GVKSU}1&JfxB-azLc7! z<~QbMdbMI-ab`b}A0qNYM1Gjaj}rNUUzER)i5CJDFK5nDO1SmJ zUyZ3M54Nc)55k!$Q)WxW^QGdcYQD2PFjbX-8kg#)s{96Ss><)-rm8$@7o*q;Wva?! zcdE*7<5r5&m7;W|s8}f~R!Z5GQg)@3T`8qjsyvwYL61f&Z4ErgSBvI*#h~?SoMX0L zjMylo&0^zbp=99~X1Q5e%Mtq zm>S>IjVZeYQYPoi1P&BPfq&7D`4o7a>B#plD3km^9j4Un>|V`MJm!70#9X zD&!{@uCnB_E`f%*S*(ARz)b>oH%mg=rQD{z&-O#*jkk2P<5ZGidNYyHf| z*ZZWG<#EY@0>_z?ULUGbfqBpCE#^nBAEK->%Xie8qj&W4P^nZZz;1z?Dxc%Lz=2hqA183Gz*Pb_2^?7SFFLwtU=3@Y zi~P++b0uF^%cbTD99UAv$SQ#p7IgwQ2`n>jc_Y`eyMgHgdzi1i(Kp_qmAS{e&vDOi z-|yb!-r|1M{crb|Zq3up6ZABB#(B>4TZEV`< zX=kO)NV_3zW!htDAE$kp)=`t@Nk1t4^z_N;Gt=j$f0*7QV_HT=xB1oz^}natNS zKg&EaFfVYw`ShE;;@<2pvBfTK*b8`T-A{lI6#fR7Sw+~qKk0V?=GQa4tkDZtRL`(? zRu4yeU}S1<8-Dwx4-w>-T(XV?t7cu z-v0N)z^^r{h+5WLM1=>6Y<3k2%(4^#uce9jW4#16`~ASL3d?{ubHrWu7#YmT6fx^F z#a-_k@_)<_@`3)tflsFi$uGN!7&UJcaCy4m%MF==JWWJZdBy>^_nri-G>Xz_B%2IA z+2BV4L8Mj~Doz>dJogCIgALr~6}5ci|E;}sP+#1ZsQpc&TobZH>6~6sn_J!*U}Jwc3QHPr5yogSK8QuJoJBB@LHJSM1AH;d1g>Gd5c4XK!@$`a zTnBQt7K>yFKUw>LuV?+hHvl<)kL7}I1d7wO2Y_z^Vh~xw=!mdi6I1>P6Jv&ezlCuW!ekc@_-|M-_&Y$3`6pt<+72LRJ28tBYYc!KBMt%Z z-vK$>&4z;S0dn>prdkqyk!#qY6_YY55cmU-V`jw&@clr}4zNn_gFwy>;qV|#;0JPc z7)!v29RYI8J{Svr6v#27;Ah~+fE+#WD)8e#4#WR=@DG3(Xl7z1+lN378~g+@0C)oD zC}6N!tTloKeIocNtRo{B#V3J(${q$k4dgIsPXRvz_7wwgjAj95%J3;3go);Om$2W0`|Kb)}dQQC@ zYde>w?Hwe{HFuoko`qpyF%T-V4LSWsCsH2AIBZv!1w)T838X+a>BO-bUG>TMf7I3a zjC+yqW1T6I+mS5-XcsUXC7t-j5DL*|I-KIJ{gJ}RhQg#w;yN)s*4*?$k3BH$Ft> zt`45KI{BWM_Spb!mlUF1(kk|aR8M!wt5~V5QK?){HQ-ypw}Kx4|5V3I@eIpBTo2;@S^OJoJy&h>d5%rvW$M-%)os)b+RkW7c*Pr;iN$&{<)nx-lbm_CG;oU=?*;ZMVlbN$-%wo5Xd zhaaR$rYGUIz<&$-C0yCaIl*}k&YbaNLuFmf+*!5dPgGZX3u9lMzbp2_`J&9qU`=Rl zO|T(cSy$T-u5B0-7NUkw?ArOVSh&Rq3Y_9GwYwO3C^#q3D(#9lS+^?l>ArD ze`{$ctH=OpMICA8M5(G{A6-0}Oe^l1_R6KFl4;&9X}jAm{iXZv6aOBRqRS@QAdQ+C zu9+4;Y@)Aa{eYE%@q8OCmg4WZD4*+68s)@aPovw|WIeJ(pPfnF_2x{n#}D?TZ!`4w zhftbc?m@W4LpRD~^I)9QF*tsvmhLvY=1kKT_1k=V^peYuPx;BQ&o{&q9=8(O`&j~%X8x*EB})yNgakZ?y@)ks_Fo!C^7 z^n)Ph>F&8CgqM<{7y(EaL0s|alCDPHASlI0QS6q^%?**o+` zNf5l#XfMf)nkAwWFBMfxCR+5R3(2b=SxEVkWH#Bk-nx+dG*-`DL?5M#hl&@MiZbBM zL`jtGVcnupFr^*2>$Mu)-6M!eCkmX!Y(^V_xMIiD5|R8mk~5+bo){NOjQU0;p(Lyy z(r8kSc-8J2HR|ChGMbV|nJHkFfZ2E+coh232>Awz+|7(Dkm8wUvpbsCS#30|I}Ink zHbN5!jrwYo_VE-cn=A1*pQk#GsElQ>=uo?U`BxOW-)QbQ#H*vlD4kT|_GGMh(Vg)Y zeupYX%M%Y*O0f9i<Kj+knY4^-vt6ySD=xGr@yf)r*z_VzO(Scz@#lc|UW4~& zB)C^%y?3j=U?olI-zH~^m)mh^?`$(svLT`40h0c&mE=>eqwVZhdb-GjtH?(m(TFl! z*B@=9XHu4hOwYggoA&aA{%D zbbrtjC=L0i`Ads^MFHRRVoyn-wa&Nk&ya7vGJ~!oRZvJ?5A1d>IRd zsV?Y@GnTUxCfL<_?HcOqs%rQDv|zt={J|T?9(Z=tZM(jC4gI31BUY>Eh!xtyjzxp} zW(|z3_+-UP_0W)Xje=*d?vuf_o%+OAXam=(C5>L-pchfDpo7biTsq zL>1yX9UZG6;zZXf1U?PE6!Jc#i7wf6a1Seite2JO1?%V&%VuJBWV^W{uCAwRw7Ssz EAM++6UjP6A diff --git a/Source/AIImages/Window_AIImage.cs b/Source/AIImages/Window_AIImage.cs index 0dc845c..293c55c 100644 --- a/Source/AIImages/Window_AIImage.cs +++ b/Source/AIImages/Window_AIImage.cs @@ -572,12 +572,25 @@ namespace AIImages { float contentY = startY; float lineHeight = 22f; + + contentY = DrawBasicInfo(parentRect, contentY, lineHeight); + contentY = DrawTraits(parentRect, contentY, lineHeight); + contentY = DrawGenes(parentRect, contentY, lineHeight); + contentY = DrawHediffs(parentRect, contentY, lineHeight); + DrawApparel(parentRect, contentY, lineHeight); + } + + /// + /// Отрисовывает базовую информацию о персонаже + /// + private float DrawBasicInfo(Rect parentRect, float startY, float lineHeight) + { + float contentY = startY; float labelWidth = parentRect.width * 0.45f; float valueWidth = parentRect.width * 0.50f; Text.Font = GameFont.Tiny; - // Базовая информация var info = new[] { ("AIImages.Info.Gender".Translate(), appearanceData.Gender.ToString()), @@ -618,123 +631,161 @@ namespace AIImages contentY += lineHeight; } - // Черты характера - if (pawn.story?.traits?.allTraits != null && pawn.story.traits.allTraits.Any()) - { - contentY += 15f; - Text.Font = GameFont.Small; - Widgets.Label( - new Rect(parentRect.x + 5f, contentY, parentRect.width - 10f, lineHeight), - "AIImages.Info.Traits".Translate() + ":" - ); - contentY += lineHeight + 2f; + return contentY; + } - Text.Font = GameFont.Tiny; - var traitLabels = pawn.story.traits.allTraits.Select(trait => trait.LabelCap); - foreach (var traitLabel in traitLabels) - { - Widgets.Label( - new Rect(parentRect.x + 15f, contentY, parentRect.width - 20f, lineHeight), - "• " + traitLabel - ); - contentY += lineHeight; - } + /// + /// Отрисовывает черты характера персонажа + /// + private float DrawTraits(Rect parentRect, float startY, float lineHeight) + { + float contentY = startY; + + if (pawn.story?.traits?.allTraits == null || !pawn.story.traits.allTraits.Any()) + return contentY; + + contentY += 15f; + Text.Font = GameFont.Small; + Widgets.Label( + new Rect(parentRect.x + 5f, contentY, parentRect.width - 10f, lineHeight), + "AIImages.Info.Traits".Translate() + ":" + ); + contentY += lineHeight + 2f; + + Text.Font = GameFont.Tiny; + var traitLabels = pawn.story.traits.allTraits.Select(trait => trait.LabelCap); + foreach (var traitLabel in traitLabels) + { + Widgets.Label( + new Rect(parentRect.x + 15f, contentY, parentRect.width - 20f, lineHeight), + "• " + traitLabel + ); + contentY += lineHeight; } - // Гены - if (pawn.genes?.GenesListForReading != null && pawn.genes.GenesListForReading.Any()) - { - contentY += 15f; - Text.Font = GameFont.Small; - Widgets.Label( - new Rect(parentRect.x + 5f, contentY, parentRect.width - 10f, lineHeight), - "AIImages.Info.Genes".Translate() + ":" - ); - contentY += lineHeight + 2f; + return contentY; + } - Text.Font = GameFont.Tiny; - var activeGenes = pawn.genes.GenesListForReading.Where(gene => gene.Active).ToList(); - foreach (var gene in activeGenes) - { - // Получаем лейбл гена (предпочитаем Label, если доступен, иначе LabelCap) - string geneLabel = gene.Label ?? gene.def.LabelCap; - - // Собираем дополнительную информацию - string geneInfo = geneLabel; - - // Добавляем описание, если оно есть и не слишком длинное - if (!string.IsNullOrEmpty(gene.def.description) && gene.def.description.Length < 100) - { - geneInfo += " - " + gene.def.description; - } - - // Рассчитываем высоту текста - float textHeight = Text.CalcHeight(geneInfo, parentRect.width - 25f); - - Widgets.Label( - new Rect(parentRect.x + 15f, contentY, parentRect.width - 25f, textHeight), - "• " + geneInfo - ); - contentY += textHeight; - } + /// + /// Отрисовывает гены персонажа + /// + private float DrawGenes(Rect parentRect, float startY, float lineHeight) + { + float contentY = startY; + + if (pawn.genes?.GenesListForReading == null || !pawn.genes.GenesListForReading.Any()) + return contentY; + + contentY += 15f; + Text.Font = GameFont.Small; + Widgets.Label( + new Rect(parentRect.x + 5f, contentY, parentRect.width - 10f, lineHeight), + "AIImages.Info.Genes".Translate() + ":" + ); + contentY += lineHeight + 2f; + + Text.Font = GameFont.Tiny; + var activeGenes = pawn.genes.GenesListForReading.Where(gene => gene.Active).ToList(); + foreach (var gene in activeGenes) + { + string geneInfo = BuildGeneInfo(gene); + float textHeight = Text.CalcHeight(geneInfo, parentRect.width - 25f); + + Widgets.Label( + new Rect(parentRect.x + 15f, contentY, parentRect.width - 25f, textHeight), + "• " + geneInfo + ); + contentY += textHeight; } - // Хедифы (состояния) - if (pawn.health?.hediffSet?.hediffs != null && pawn.health.hediffSet.hediffs.Any()) - { - contentY += 15f; - Text.Font = GameFont.Small; - Widgets.Label( - new Rect(parentRect.x + 5f, contentY, parentRect.width - 10f, lineHeight), - "AIImages.Info.Hediffs".Translate() + ":" - ); - contentY += lineHeight + 2f; + return contentY; + } - Text.Font = GameFont.Tiny; - var hediffLabels = pawn - .health.hediffSet.hediffs.Where(hediff => hediff.Visible) - .Select(hediff => hediff.LabelCap); - foreach (var hediffLabel in hediffLabels) + /// + /// Строит информационную строку для гена + /// + private string BuildGeneInfo(Gene gene) + { + string geneLabel = gene.Label ?? gene.def.LabelCap; + string geneInfo = geneLabel; + + if (!string.IsNullOrEmpty(gene.def.description)) + { + string description = gene.def.description; + if (description.Length > 200) { - Widgets.Label( - new Rect(parentRect.x + 15f, contentY, parentRect.width - 20f, lineHeight), - "• " + hediffLabel - ); - contentY += lineHeight; + description = description.Substring(0, 197) + "..."; } + geneInfo += " - " + description; } - // Одежда + return geneInfo; + } + + /// + /// Отрисовывает хедифы (состояния здоровья) персонажа + /// + private float DrawHediffs(Rect parentRect, float startY, float lineHeight) + { + float contentY = startY; + + if (pawn.health?.hediffSet?.hediffs == null || !pawn.health.hediffSet.hediffs.Any()) + return contentY; + + contentY += 15f; + Text.Font = GameFont.Small; + Widgets.Label( + new Rect(parentRect.x + 5f, contentY, parentRect.width - 10f, lineHeight), + "AIImages.Info.Hediffs".Translate() + ":" + ); + contentY += lineHeight + 2f; + + Text.Font = GameFont.Tiny; + var hediffLabels = pawn + .health.hediffSet.hediffs.Where(hediff => hediff.Visible) + .Select(hediff => hediff.LabelCap); + foreach (var hediffLabel in hediffLabels) + { + Widgets.Label( + new Rect(parentRect.x + 15f, contentY, parentRect.width - 20f, lineHeight), + "• " + hediffLabel + ); + contentY += lineHeight; + } + + return contentY; + } + + /// + /// Отрисовывает одежду персонажа + /// + private void DrawApparel(Rect parentRect, float startY, float lineHeight) + { + float contentY = startY; var apparel = pawn.apparel?.WornApparel; - if (apparel != null && apparel.Any()) - { - contentY += 15f; - Text.Font = GameFont.Small; - Widgets.Label( - new Rect(parentRect.x + 5f, contentY, parentRect.width - 10f, lineHeight), - "AIImages.Info.Apparel".Translate() + ":" - ); - contentY += lineHeight + 2f; - Text.Font = GameFont.Tiny; - foreach (var item in apparel) - { - var colorDesc = ColorDescriptionService.GetApparelColorDescription( - item.DrawColor - ); - string apparelLabel = $"• {colorDesc} {item.def.label}"; - float apparelHeight = Text.CalcHeight(apparelLabel, parentRect.width - 25f); - Widgets.Label( - new Rect( - parentRect.x + 15f, - contentY, - parentRect.width - 25f, - apparelHeight - ), - apparelLabel - ); - contentY += apparelHeight; - } + if (apparel == null || !apparel.Any()) + return; + + contentY += 15f; + Text.Font = GameFont.Small; + Widgets.Label( + new Rect(parentRect.x + 5f, contentY, parentRect.width - 10f, lineHeight), + "AIImages.Info.Apparel".Translate() + ":" + ); + contentY += lineHeight + 2f; + + Text.Font = GameFont.Tiny; + foreach (var item in apparel) + { + var colorDesc = ColorDescriptionService.GetApparelColorDescription(item.DrawColor); + string apparelLabel = $"• {colorDesc} {item.def.label}"; + float apparelHeight = Text.CalcHeight(apparelLabel, parentRect.width - 25f); + Widgets.Label( + new Rect(parentRect.x + 15f, contentY, parentRect.width - 25f, apparelHeight), + apparelLabel + ); + contentY += apparelHeight; } } @@ -803,79 +854,110 @@ namespace AIImages private float CalculateContentHeight() { - float height = 0f; + float height = CalculatePortraitHeight(); + height += CalculateBasicInfoHeight(); + height += CalculateTraitsHeight(); + height += CalculateGenesHeight(); + height += CalculateHediffsHeight(); + height += CalculateApparelHeight(); + height += 50f; // Дополнительный отступ + return height; + } - // Портрет персонажа (если есть) + /// + /// Рассчитывает высоту портрета персонажа + /// + private float CalculatePortraitHeight() + { if (generatedImage != null) { float portraitSize = 250f; // Максимальный размер портрета - height += portraitSize + 15f; + return portraitSize + 15f; } + return 0f; + } - // Заголовок "Информация о персонаже" - height += 35f; + /// + /// Рассчитывает высоту базовой информации + /// + private float CalculateBasicInfoHeight() + { + float height = 35f; // Заголовок "Информация о персонаже" + height += 10f; // Разделитель + height += 6 * 22f; // Базовая информация (6 строк по 22px) + return height; + } - // Разделитель - height += 10f; + /// + /// Рассчитывает высоту секции черт характера + /// + private float CalculateTraitsHeight() + { + if (pawn.story?.traits?.allTraits == null || !pawn.story.traits.allTraits.Any()) + return 0f; - // Базовая информация (6 строк по 22px) - height += 6 * 22f; + float height = 15f; // Отступ + height += 22f; // Заголовок "Черты характера" + height += 2f; // Отступ + height += pawn.story.traits.allTraits.Count * 22f; // Каждая черта + return height; + } - // Черты характера (если есть) - if (pawn.story?.traits?.allTraits != null && pawn.story.traits.allTraits.Any()) + /// + /// Рассчитывает высоту секции генов + /// + private float CalculateGenesHeight() + { + if (pawn.genes?.GenesListForReading == null || !pawn.genes.GenesListForReading.Any()) + return 0f; + + float height = 15f; // Отступ + height += 22f; // Заголовок "Гены" + height += 2f; // Отступ + + // Рассчитываем высоту для каждого гена с учетом описания + Text.Font = GameFont.Tiny; + var activeGenes = pawn.genes.GenesListForReading.Where(gene => gene.Active).ToList(); + float approximateColumnWidth = 900f * 0.35f; // Примерная ширина левой колонки + float labelWidth = approximateColumnWidth - 25f; + + foreach (var gene in activeGenes) { - height += 15f; // Отступ - height += 22f; // Заголовок "Черты характера" - height += 2f; // Отступ - height += pawn.story.traits.allTraits.Count * 22f; // Каждая черта + string geneInfo = BuildGeneInfo(gene); + height += Text.CalcHeight("• " + geneInfo, labelWidth); } - // Гены (если есть) - if (pawn.genes?.GenesListForReading != null && pawn.genes.GenesListForReading.Any()) - { - height += 15f; // Отступ - height += 22f; // Заголовок "Гены" - height += 2f; // Отступ - - // Рассчитываем высоту для каждого гена с учетом описания - Text.Font = GameFont.Tiny; - var activeGenes = pawn.genes.GenesListForReading.Where(gene => gene.Active).ToList(); - float labelWidth = parentRect.width - 25f; - foreach (var gene in activeGenes) - { - string geneLabel = gene.Label ?? gene.def.LabelCap; - string geneInfo = geneLabel; - if (!string.IsNullOrEmpty(gene.def.description) && gene.def.description.Length < 100) - { - geneInfo += " - " + gene.def.description; - } - height += Text.CalcHeight("• " + geneInfo, labelWidth); - } - } + return height; + } - // Хедифы (если есть) - if (pawn.health?.hediffSet?.hediffs != null && pawn.health.hediffSet.hediffs.Any()) - { - height += 15f; // Отступ - height += 22f; // Заголовок "Хедифы" - height += 2f; // Отступ - height += pawn.health.hediffSet.hediffs.Count(hediff => hediff.Visible) * 22f; // Каждый видимый хедиф - } + /// + /// Рассчитывает высоту секции хедифов + /// + private float CalculateHediffsHeight() + { + if (pawn.health?.hediffSet?.hediffs == null || !pawn.health.hediffSet.hediffs.Any()) + return 0f; - // Одежда (если есть) + float height = 15f; // Отступ + height += 22f; // Заголовок "Хедифы" + height += 2f; // Отступ + height += pawn.health.hediffSet.hediffs.Count(hediff => hediff.Visible) * 22f; // Каждый видимый хедиф + return height; + } + + /// + /// Рассчитывает высоту секции одежды + /// + private float CalculateApparelHeight() + { var apparel = pawn.apparel?.WornApparel; - if (apparel != null && apparel.Any()) - { - height += 15f; // Отступ - height += 22f; // Заголовок "Одежда" - height += 2f; // Отступ - // Примерно по 22-30px на предмет одежды - height += apparel.Count * 26f; - } - - // Дополнительный отступ - height += 50f; + if (apparel == null || !apparel.Any()) + return 0f; + float height = 15f; // Отступ + height += 22f; // Заголовок "Одежда" + height += 2f; // Отступ + height += apparel.Count * 26f; // Примерно по 22-30px на предмет одежды return height; }