From 32d4f20d335a7a53a3b882ef20568192bab21855 Mon Sep 17 00:00:00 2001 From: "ProjectKoi-Kalo\\Kalo" Date: Mon, 1 Sep 2025 14:01:35 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9A=82=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1.6/1.6/Assemblies/ArachnaeSwarm.dll | Bin 14848 -> 22528 bytes 1.6/1.6/Defs/AbilityDefs/ARA_Abilities.xml | 40 +++- 1.6/1.6/Defs/DamageDefs/ARA_Damages.xml | 17 ++ 1.6/1.6/Defs/HediffDefs/ARA_Hediffs.xml | 89 ++++++++ 1.6/1.6/Defs/PawnKindDef/ARA_PawnKinds.xml | 1 + .../Thing_building/ARA_InteractiveEggSac.xml | 4 +- Source/ARA.code-workspace | 13 ++ Source/ArachnaeSwarm/ArachnaeSwarm.csproj | 3 + .../CompAbilityEffect_SprayLiquidMulti.cs | 177 ++++++++++++++++ .../CompProperties_AbilitySprayLiquidMulti.cs | 17 ++ .../Hediffs/Hediff_CurseFlame.cs | 197 ++++++++++++++++++ 11 files changed, 552 insertions(+), 6 deletions(-) create mode 100644 1.6/1.6/Defs/DamageDefs/ARA_Damages.xml create mode 100644 1.6/1.6/Defs/HediffDefs/ARA_Hediffs.xml create mode 100644 Source/ARA.code-workspace create mode 100644 Source/ArachnaeSwarm/CompAbilityEffect_SprayLiquidMulti.cs create mode 100644 Source/ArachnaeSwarm/CompProperties_AbilitySprayLiquidMulti.cs create mode 100644 Source/ArachnaeSwarm/Hediffs/Hediff_CurseFlame.cs diff --git a/1.6/1.6/Assemblies/ArachnaeSwarm.dll b/1.6/1.6/Assemblies/ArachnaeSwarm.dll index 426b9e4a1857bc93141e68a5211895c95c1c482d..59b7d73fbba8bb9eb689300b593d27e90d13feff 100644 GIT binary patch literal 22528 zcmeHveSBMIb^p09x_YrJ>q@fhyfjvtmnxCt#!b@3C4@MRleo>ho%9_?wytfZvaTb^ zNnOW54lP@t1CwbsI-j>oi2*B77|$oN`NXE3y@^pfW3|=S2Nt`m zcXbnOQ#88!g6|)%jCPtXOw=hWiFN^FIN0?z?g?CFTts21tB%}^aLI@s2LL>OG}?bF zlk(rp-31wi&r5ltom?qn?ruK@tDk#`f&iWY-TW%@H>f0td^Kb~z*}qJwvu&I3GgN! z9Bne!bH)dHe_Nqg7(}zkRz`&vY7efO&ju`4TfxfNAY@tTUR=y;AFi6u2BM8Mpi~pA zSA1ADl|1zGONqX78IdB`-@dp|O~!}hZHmN{I)I)&?Gh2S{Ql@MT`}R$fN8V;%5k!Wv^|l{#;$Nd@p8 zODYdu zHhM9zKOT=a#X(tq6Yfn-02v~ZA|?$nd?NbUM$B!VslRT`bG8vvnrC{LmU-}#n5luJF&-~2VG)<22pE_|)N6WMucLXlcR{U7;)N9ojor7TNt?U~6!$G@ zE}Rg=oSKO&S)nhDr98aip&D-aEs zf!4RoYDmKH0wpY`60NJ5j#&X@S(EMDIcNqA`x0S)sv}xYh09bdv15`vhN}X56-cTo zFwFYoY9O4+)2Zs<>{8K?8DcvWbE=3=r(nj7V%};@Jb=D~X;UZI@aK8xZxikdRH6>t zA)$h*`2WqQOyYv^$|t(gM>nCSiElVgaaM)#?{-~e#y_s9^TyAru-#Qu_#sbBd}DGA z%Z>;W@QPI?;jRvxT+1~G5U5YhrBsv(5e-gq`3zQ%)u+h6{PS3cHvmiO5q8SLI*>KS zlbA&cD0aZYwcHb8r#J|?Q%|nvKA1Sq0aoSu_vD*^Rwp;0Y_dCN>Wwiip4R@hfZ-Uo755U1LS>)_z~mL&5?!g$F^rAH$Jm;lyb@Rl(ExU^ zVl2!7L?tbW5NS+Bc#KId?QI~#>L3{PaMWTP$6NzIGK%{o%hhzv6xJPGxOCQXETr?9zV@{Vpbx)W7Q5Ar0p&q&iG(j0|sOzn&v;jtOSNWvp^1KMXsYdcpqX{(6k zN;)G!wJT;`?{5tgHX4yNCR1k#=dJWp2P_4eWcjd98LbKDZYLmYYt-esg8_pBHUcoz zSYKhb_E+HJ672*LRux)YQ;Tx>!PKz9@DMg!DsUl(VtW^AL7%-FH}KKyJ*d>Ly$$t< zmh1%()m^!4?jJ>DP4=PE>W}DB!Cn*fm>xva8cAP&#CUQqdX^B~Bmg@^E-CVYfT<_1 znz=P0wA)t$c4WB*waZ6dd+oJT4cJoRL4FxBPWePOR>4xND`SsG=^_52s;01j$#UyySI2)yJcHs*U`n zZeI^j7`Zge6G595V^BP5oLWn!-gI?TH+8>#12^it2d(%rfjv)c#od^fGHYJc6g5(0 z8Z5Unza^BrgJgcul^()W2pTY{_+~H&6#G%u8TNkM$ZMzhW;7_t0aPxe$0s%w2T`*# zjCYsHLcQs%%2IWNV1=_*+8^;Jhd_`VMiKS6oT9VQMh&MHo)m9DAv!w3eY^{zK1wyy z(X2oFwTQwJC|&W(*` zW9t%P@DPJ>Gu|3B60W%_=5}DIvPXLTIo6W6t zW^fX=2i*Y5Fnex#rxp3 z*~;M#(N|9%LF*JZRGSfFl2kZ?ea#^$e37@fDbP8IfO_<3r4KYIOoJ)%E&sAwcpj8f z%vO~Ugkr;nB9fNC6k-!LpX3y>aBMzhpqv=qKrcW(I5PX}G^5qYW4PJaX0Va9BA2-Z zpc5Rir+L;s2zrB4YNO5zG@`F(?FWH#2%XTHaDiLVbw$(xj7c6l`8J?9u)#4}N8C=6 zzXRmt@1jU1z?aja6gzklu{#wtOr!OU6!ChEBRq>FLW$#bJjXA^K!%W$ip671P0da5 z!P9cfV zu|4vQb7A`q^f%5L+t6Hm59*xzr|MGVnjlZ-U~Y3dpP~TCZ2@dLsFHKe`6Aw)~Dv6fS}Qp4dh2O2|4`l23_(V6f2gh zlLEY-fjMr^3(!fOY({zGSq;A8Y;OjweF`GL{+KCtSiS*bx~8l7B!*6m!^VwHb>0pz zW%_f(abX;=^k788EJWG`08y!&Jsh#@4?wI~Tus7G0yC==(VCJcfWeHp!SAe=1I(C2 z4Ga7CK_-^t=j4RdC#eYZqR}N76agH1*ODJ%u38di?IdGxsX3$?GDl~o5@ckuwEUl8 z6+G?2zp_{Q;n< zg{Ur?%_2 zU+3*cD$9pi)-fk}l=7!Sso}N%glatS!YjBT-)2!zQ70F(Op}<0o0c7k+ zOvF8^wYEG1u@rf-;0Pv-_Q%m#+#rrXb}^}i0x#A~Z#ir`vNXH0oQhTE7!RC+jkmHY zz9V@;WUxXT(lAi#TI*A~o^HE)wb7k@YAd{a&QQM?WF5_{q7FZVPkmL@Z0+|sn z{vmF0`_m|w*4k`}sbwBhD^NYxX1V!wZ1!?Y;n&)19sN0Uj$H-%;{Nb*SiHBXO;34K z!L>FTVW=O+4a*_p7gvMdR6C0@>69x`pW^ve5bzRxisys)&5f0VFH8n`Rp5ndn4PpZ zr+0XX-n#r;jKghG^nwjDV1I_SA|V(XrZ5Vh!w9a1+fSv0;4vNK^;>FK1Gx!5LE{oC>IJJSjmh0@AB8W5Y!yvtUAMzxX&-gfb z3i@m#(w=$HDLd9$#*1Us`qksm5nn#h2hoAbLOKlM%)mLSuvf7#HC`nk+q&adpmpuU z@hi5%8NU+q5Wl(%lCWQiWpIJ|#kfteWr$xPBfvgA6OLh271O>H)#V2A0G;5nZan7p zfN_32HBv@uWojzE9J68?*cArXo03Q$QcKmQ=6LcERx(zXmCPhf6_gu zacP6AKNd%xpoq>kv(DOzJ-C(Ep`|7+;h6Fm#GAqJm>PkPe6-0wK`Vk9(WUL$(J`9m2In5u4?aK zjE8b4V^N|-M~TX~|867dy`@4nKU`!A9~|cA2=t5g_R_z@Xu`lP+OoH26YfFS#4~=t z8*}ym6XT;|>$$4szB)hRBmJwgiePv=`a5yOa6wMmh6_W4{*jk{fz)XF2(T zDBNB8GY$Izj02yaa2kjYj=#NgH|ywQL`*Mzxz zs}T(Z=SwLyf-x812>-mRpfO>-5`b(Y5b~PEq;{`1lG-zQR({!uP zC>PVKm|TD!4nCs<=#OJu{>abe6T-7gv$O!+7v}O-h57uU@O(2Q576C^Ge8-^p9X!1 zZdd-y6QE~;O#de`yAC|YHRuL~N6ZJ9{$ZJWG|crg8kY~qSdR~_P(SIVC=RA!0 zs^~|@SOL00#(kT}uu$+jQ9|b-9>or__C8mPY1qfwcZg@b8H+&4^H5B;|z6_c19?L5CsA`B=|y5S?sS znf@olf@I?TB3gD$BTwWk&O46pzSr zDMmM_8*2xvHo0sR%b61XLo(9|v7CbM8O5MaV66i*F1`Hd6`~Vimh*FAw#M%^upXYR z)o6AXqWDi2l?bL#!2tyoKw$nwlTA+^zw2amWbeB-3=rV!$YpLy^+W?5D8*_dd z-w13aZDE+MLkQbW>lgx0Gy_^sSJF~?XW$iB^Y+kUuR%LvTs|3N%;CCL)K5k)M%kg3 z(C7F3uYmFUwHpnEj-%XN&TFf@yURDBH0YC2?sXu{G`ozoUWJ|nMxnVTm)A9{1I_z9 zC$Ng&(z{W=yn*q5==~!dqnNu9alRqr4(ZJ2=RO|&327|}roG`s*vjXlFJkm74etB) z=m|xkyHu`U>HAx7*eqqZp$DV?6>Ud(rNSeI8~VV_s^d`}faC^Uq+HFdE}!dBclbCo z`-PHwDfDN=l>3zZC~s77P9hd404g>9oB+_PEzi*SpXs zV^4Ymv>1Ck(KHP-{H3>!_9F?b=sHMa4&=Mr`)zNKUYOMu=FJ*f`Ygr^(yK012T6j| zj2waJ4th;HgML>DAU!Qj&qQZwAhys{hJw5J15BUEDl;1+0 z!Q(xyp7w+&j&zivS75CT)aOD^`|ia9dQMd zF{=1X`kn)coF@IqZDTo2`nlWoj(P)>UC4BK?kuNCR|@2eZqkt3##)Ndhzs%P5t@e- z82$X;h&1>jw8(*Eya+9K+jzVPt#;eC)Hj0iunX~c5qgV2cQjuZYC+pO1ah<#p*sb7 zD<zK1Wd1F+K@aIwAa#xb{M$b8+2(D~@Y7 zuD$qfh1b?ZY0w;$$VgCzsa-HVC>v=4()_ahSMpLNAOvW6Aeq;2@ z`pXefe+hlgm)6CCX_fkFsdosUEXpCsz&sC9rzeN{&Tt7ON6jZ_UHBNis_Y8B4PT3w zJ+}eF5yh{5!S^N9Pnv&9S>?y-LX_XBdy3|$?+yPIT7MAy5-^{^{=H0{ANnOtsJ(S} zDbwmlv4bsC-|4wmnWMfd{1GLqyb}0?a$G%L_aHFu4SyM!fX3W@6njcJNG5W#lj={k zZz=by-_%YiigIP$&y>%&9Nrs#1w5bhpHLoAJ58_pg!&~dq&}s-!Dv>W1!jr*9O|v= z6T}hujQR!tD)mK_UBK{s7buM8 zl0a^HJv9H4nvqr5tz3ke^4wojvx+wy);g31o$6mCHk!TGp$oug$!c1@~RrvI<*hcziB<%Sc9(b z)>3sSm6rkmeOh@e5J%apg|%trE71$}TfkwRevLNa+o+dh#I$xGFo-(KaD=Xor6{Xi z70T)z+6yX|r-DWOxRMSmq&eCi^)32A?Ok=Z>eq`5J)*ta==%&m2eCTO%k+Ic?zu+0)|~5k3fz`@vdVROx91Us_n)Vh*7vz|L;UMIC5 zdXA%&SNS<*UHD_3=M>&?o>O?Ic}_WLKJ0l>dsuxG;X)kmd$VL(v)YLHfR$ zGI-rDF-*M^*7_{132iYx0{Wk6bMzLq514m*Z!|thw=^6=$@cR(u^+bcTa0Dkvrc~s z^zSr2CpNQN-x&CUagBbb@6U{Ok)d7rSm2wezd?WAI6|M(zHdCCEDOEJrT-11RUwag>Yb zJ-#mFXf56@#K0EspwtK5`YO8DU#2(EcYOB>{$4!QZSkH4W|9BH3itYol&6(9(6Ik| zQrA?*C!|~?<)D;rm2$s_Ih3V5EhQO@Nl3Xt%KcKFmXaV>i+8`2Whw8K@^L9oOG%gk zI7qo)%CeOAO8K~yr=@&1zvZDGQctK4sgJ6gv?JP``eXVHo|B#jJkNVx^>~dsqsf?W z3>u#`z6)(C$iP%YcpaMaU{~;B7w{w2V?&}#!+0SF$b*i0nbRII^!=|ABd(TUW8;Xc!|3{wkus7v+46q2h#8hjI}{Rq0~nI4X7&d?5tg zM^U~J&r|qWU=zx2>^t>zHSqOxE%5d9X5f*b34Q=8T~8Uh0Ob%)SI9{~8Kwd#!*mGm zO@)zH&p~-JD8qCFV}|J{C{4Vh6GeFoC{21B;j3u+T~L~MgJK@a+i*HF@hqqXEvs?D z+KJaT-%Q`8zlY`hgg&MIQq60Bt)13d^$+TA@my$ZGi>9Cp_ie&S)UZ1F6lLxdT$)N zJnzf~ePHp@ElyJyd-%DZtcNkP`~HjI>VXYGrwzEmxJ>YhU^Sz-VzBNBdXqXy+thc^ zJJs*fKHaOF(xZyU(}-&hu7%3go{MnrRDSB2pkH_nDqlhNK8f*?VOb#w3sK_y6n-h%{e<=+HU2?caD{^c3y_#!SYOTP08l^IU=s< zZ>M$H{NVUNx@4_i1F1l>*0~k=wqrb(<1zQQQ%`q(eAFtq&?akWQySu=i`=%WU}ds{ z;DLJQAdg8roAN{1;qF4gE)>@T zbs6|}fT^7s&spoiqENKjI(z6)IyY|h_Yi-UF{mmQ$K!bBfTVP_#@L04DcG3qwEAorYmXG>xH0bCe-fQGG7{~@km*{FA- z2&J@j*|{79;N@-GV&$zuc2MZL#tQ{2U)r9|r-!Xf-$=nqXL>T|nd|S*=Ch@2I#)$9 z-%V(z&P;}SihWi-V`XF>Ec|w>01jlaUUud;r?WXgo3j`;LtCuUj`S!h%%XQJeK?PL zpY3Y9cO*LmQ>$?9DFNQ``rL$L_WHj)`n3;LaM}Rj|jbLMdw% z`#T4+xol~ocdU?}*p@vw4vIb5(W{`(40R6=_ofGX@)_8~;rx}^e1_|=BcxasYskt} z8mP#E;xTs>!7z7mreO`*sP@^;qV{D6Z!GrNyP#RT=;V4YFBNUHGZXB3d(Z)37gSub zU=XD=+>l<^IU!tWq&uI1O<8nRcFd9r#{!;e&MG;Gj5U-V&y{B3Tm?EEU>TdzqgYug zIpWnq5Y+{@!U>0lm`y*7yOhn3+vCOa+G;d>9@Qr65Z<^S8-*#QbG;=VF(U)-N#{}L zWk)SzkM`spjKmzL3g2@ovW#p=5W6;NP!C5(yT}oQ_KZWoQLAra%-RZ$z`(c|+FYslhTu%w195GTx+@2mB!Q5wB`_c#krOo)ki*?v8+&I(V zu(AqUvydu3gWqEf^`?ic(!?IDMR5l2NSo$>wa3b(Z<1O~yK4qah9<}1XL_@}aT8W& zJeS#HjoOD`Iabjs;O-bUR(9u*DAgLO#sVPeMmRX%#b&LdojYV@s$HnRa30Drbnb%R z`nbl%&>njN!82RRSq!n-`ChRHt~=JmwMvZWOAj-MUk>G^((P>X1x7mZiz2qAC*ZtH zSV(6}Tv@k%Re%3jnqxVG6@FaL;BrPnSSpRkq%jWl+J(}_3B-#*1age$cmj`1TkMi8 zGE_{}Rd*Y2Zdekgxhh?dJ6Iv^J3&y4OqSY(E71`eE|hwT+q18adG-9Q5rIDIhi~-76T=KHI0p3v#_LFLy-;QXQ{jawJhYTyynK^*XWNW%Of*=Ir z;Po23(Fy!}5oa8bhZH9 z_a`gEsn^cJX1g#Tz9wvUj)87_HV>B`f_%t8tUNCyi#ZE+7nlPI7R(7WOvkx^lb{K| z&1uOc$R6wO9UnkCUoI>0$8DDALIz2jqJuuu!a z4r1lGi=%4njaaKZ^2Kas<2Wk92~+31g!gJ5l!Fu!UI5}5*xLn=+(T*^C(+oM7Zi7K zD#*7u8>q&0R(zjLJsHb(BS%ku$foTU0&GF5+c+b20-wN=viGwKiDcW;W3KzL`8cla z)Cv>OzEoXR>-R#Ct5Y@o5C5+y=3U71G$B z2a25Q7b|MplubkZ#Zq>#h`{P(s70J;HrnI)OqHq#8Gde2sF%`?YrovXtj|WePHC3V>1mp zhnrbvWdw->Y3z6Eo&Mf(N*zP+0qD;Vnp7QXF!Q}IPPG%r3CBhfs_W(L!Kf~ zH63zdQ_(pCY_v*;Ed;v}yHsTFM5J|hV&0-f6*!NRGkxS7gLtA0mb128lC#v#0Zw*Y zVG#t}Mdcd!I)f6n5r|tof3-QOdBt>V6jk+fSbQ5RwM0dhaho+%swM(kt?ckfiLmj> z>h;;M8s1cTa45O~w^3OEhG7LcS1O3tU9 zg<(9Z0C7(dr=wAvB2ag-s@D@)TsAvcEBd)X$~|BIroGPzPyemn=LM$!gi9qPvC{t& zvfp5$Y?QwxhjS+T-{x@Mg#QapwUe$TUAO*{{{BHHW{5v_A%emTIjFi-Sfo>PlK#$7 zq1a@X9OsgpaR+|O&h8~F*r_DlMfzGS$sX$ldL%S^tb+)Qj=Qjn^P{eFv)5|I!ih+g z;CyVKEscjq@C+=+e0XL!Z8FE|an(unXghWimhv2NI0`Zr0&*mh!0+t$h;@gu)?w=G z=}PAv&)$Kb3^}zPq#ZY5dU$+^c#+ObIJ)38G&?jwonvD;l=%tlD@A^`gM-I-VbJPA zf;MayCTRCK9_o}PsxbR=9-0wsWoJS9BTwe`A}I&48+9sBO%Sf2BxZ8tsv!7DQLzGS zw<=FNcj0*rhXSJVbQjq)ibvVKxYBf(^7wxUocm@x+UB-xlqCdGx||Z!2V9o$qyTk9 zA(RNnE`6e=HbCQOpTS&-UU})oyb`F7<0Z=+;T?wZAN+PAbYZwW{@F6X>kZ$A0eBJx z2$~nFNqmzt1#D&TbNf0Ive6@f38yiU8QQ9#_HQTWX7I^kinYob7Ktp3lZIRtMwwBb zjc*kabYoRfG%o>+BhwJ*2hk%7I1eiFR}@GZRQNw2+3V>sK^48Rv<$UFi@ao?{_RxJ zjR~_Yv3dtlS~7jMh+$y1NlS*VzX*a^J3gDxd=VGXywN`Nnn!{RRNsE}NW8zux zMo5@9)6xgYYR9LATk%!dF5vpba0}22OYE!=uO_wp`rfQ%+LHSNn835Ggjy==#H%xiz5|#YuaaX$H0Rf~(<^`a*H2EIp4$B0f&2^KOL+67Cltk} zCGfH{DyGR`NU96DjC7z$^)yDVQ9^nG-+KX^53o}S`4YtFC^%4Lufg?*gj}y zATp=tIAqLL4N57sU?dxCj7(pkM6%Tz<}$rdri5EXE)mX^FcgYRFNsVqV-Agx6(C>X z-XhZ&ZH)u82hHh@#z^^Dm9gzI{)AJapUS7DVwO*s<-72Osfy{8PcYIKnV!NNy;>v&j4G@45I86cuzU|OhZryCtz6vh z@oEso591L|Ctyx1P`#gp#%GQfvPR0EYBbBYGa7%YsO2*dqMJF~5lm z@$GG;OW09ow?hGKik6@7K^-jn{mls<>=(*@!jZt7z6&Eh6zRsd>M&rD#>aA07^06X za`_?FBff8UA!h)Y0QzGMAjDqpd~QY8M_6u{oAAR*`2b_YCoTZmhfC!Ga1fW&t9@7j zUsXZ=l#B$j`dK{vRZ6@}fkE-@GzXf-1&9Z*=>@bv2?kgp&a8s)NuSRLHq0NB19Qmi)WuUD2_=R+0 zh?kc=Qhv?{$9oLwe-6eRCDy?=>XGR)7}_6J@Pas8L*6gLCFDgSt zZGsm$(o{;(rK)?C$V!&_7j<5bs0HJwjCcY52sOPdK6HkoaF(ODibw$T84m_;WdM@D zT=B4%S*})it%^X4z=CKQ!W)qsc75z^K6oU0ckrmIJt*L^&MF+kt5GUeL3Mlslb3Zo z9y#WLYe1f3^+m^plwYn-uu9K3*7LIO;hV4DH)r+f<9N{!TMItAg2L-c zts0nvxdv>?ccHS?;Q~VjFoD^H4G?0ZL^XzMEiMZ*&Ljb><5jx{m1bPq!XU=9X8eR# zFdT69#fTMg0(CoPjuizcZ&0 zE@`u*?H(V${luRI{DOX;8o#QL9@}B(tIzoHvVncLsDKVX0>GySKYD1}(cM@5O0kun z8sO~wM*L1~Em(wN)h72H8h(-!;Xa9KO9Hf;73!S*50}_AWBO0d@;hqhe%|CFblhv$3U(7p{H8_@G@Ee% z;Zrsr1o*tnpT)$z_+bSfs)}gm!+~>p76N)ue-uM1kf{VJ=ZJPbr@Mt_CFbq?Ta9A| zbbz-*`FCCwdOnsFaR^~PGsjOJCxL4vynlvvA87HlQjIJtaiX5N`2S+#--7XMoI__G zvge>LJ_cIg*D13aq!Cc0f$7Duk`H#H;FAGm4m1cv;IR#@!_u3N>ti@dv4q3uSprQ0 z*EShzr;BGT@K}|3G4z{{xmxDA3%qQ|F%Er{utKwEJ2Ow7GlGKj>4ZM;6$i!|z~~c@ h?7!-VuK)M>pVGj7=Xb>$Dh~HQ#rOaC{IAf!e*pevC~W`$ delta 6262 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 Se{-R9!{N~KFT|b(=l=i%mRpek diff --git a/1.6/1.6/Defs/AbilityDefs/ARA_Abilities.xml b/1.6/1.6/Defs/AbilityDefs/ARA_Abilities.xml index 1b2d358..b9dc14f 100644 --- a/1.6/1.6/Defs/AbilityDefs/ARA_Abilities.xml +++ b/1.6/1.6/Defs/AbilityDefs/ARA_Abilities.xml @@ -22,16 +22,46 @@ -
  • - ARA_Proj_StrongSludgeSpray - 18 - AcidSpray_Directional -
  • ARA_Proj_EggSac
  • + + + ARA_AcidSprayBurst + + 快速连续喷射多次腐蚀性酸液,覆盖一片区域。 + UI/Abilities/AcidSpray + 5000 + true + 300 + true + false + AcidSpray_Warmup + + Verb_CastAbility + 14.9 + 0.25 + AcidSpray_Resolve + + true + + + +
  • + + ARA_Proj_StrongSludgeSpray + 18 + AcidSpray_Directional + + + 32 + 12 +
  • +
    +
    + ARA_Proj_StrongSludgeSpray diff --git a/1.6/1.6/Defs/DamageDefs/ARA_Damages.xml b/1.6/1.6/Defs/DamageDefs/ARA_Damages.xml new file mode 100644 index 0000000..0456014 --- /dev/null +++ b/1.6/1.6/Defs/DamageDefs/ARA_Damages.xml @@ -0,0 +1,17 @@ + + + + ARA_AcidBurn + + +
  • + ARA_AcidCoverd + 0.01 +
  • +
    + DamageWorker_AddInjury + Sharp + AcidBurn + false +
    +
    \ No newline at end of file diff --git a/1.6/1.6/Defs/HediffDefs/ARA_Hediffs.xml b/1.6/1.6/Defs/HediffDefs/ARA_Hediffs.xml new file mode 100644 index 0000000..e7e4cdb --- /dev/null +++ b/1.6/1.6/Defs/HediffDefs/ARA_Hediffs.xml @@ -0,0 +1,89 @@ + + + + + ARA_AcidCoverd + + 你的身上沾上了虫族强酸,可能会痛一会。 + (1, 1, 0.8) + ArachnaeSwarm.HediffCurseFlame + +
  • + -4 +
  • +
  • + 1800 +
  • +
  • + + +
  • + ARA_AcidBurn + 1~5 + 40 +
  • + + +
  • + + true +
  • +
  • + + 0.2 + + 1.25 + + + -0.15 + -0.1 + +
  • +
  • + + 0.35 + + 1.75 + + + -0.35 + -0.3 + +
  • +
  • + + 0.5 + + 2.35 + + + -0.65 + -0.6 + +
  • +
  • + + 0.65 + + 2.85 + + + -0.8 + -0.75 + +
  • +
  • + + 0.85 + + 3.25 + + + -2 + -2 + +
  • +
    +
    + +
    \ No newline at end of file diff --git a/1.6/1.6/Defs/PawnKindDef/ARA_PawnKinds.xml b/1.6/1.6/Defs/PawnKindDef/ARA_PawnKinds.xml index bb11623..bafb722 100644 --- a/1.6/1.6/Defs/PawnKindDef/ARA_PawnKinds.xml +++ b/1.6/1.6/Defs/PawnKindDef/ARA_PawnKinds.xml @@ -16,6 +16,7 @@ false
  • ARA_EggSpew
  • +
  • ARA_AcidSprayBurst
  • diff --git a/1.6/1.6/Defs/Thing_building/ARA_InteractiveEggSac.xml b/1.6/1.6/Defs/Thing_building/ARA_InteractiveEggSac.xml index d9ba36b..efd5b1b 100644 --- a/1.6/1.6/Defs/Thing_building/ARA_InteractiveEggSac.xml +++ b/1.6/1.6/Defs/Thing_building/ARA_InteractiveEggSac.xml @@ -7,9 +7,11 @@ 一个黏滑的囊状物,可以通过交互来孵化特定的昆虫。 Building Building + (1,1) Things/Building/EggSac Graphic_Random + (1.5,1.5) Building PassThroughOnly @@ -18,7 +20,7 @@ Normal Light - 20 + 200 0.4 -6 diff --git a/Source/ARA.code-workspace b/Source/ARA.code-workspace new file mode 100644 index 0000000..40c75ee --- /dev/null +++ b/Source/ARA.code-workspace @@ -0,0 +1,13 @@ +{ + "folders": [ + { + "name": "ArachnaeSwarm", + "path": ".." + }, + { + "name": "Data", + "path": "../../../Data" + } + ], + "settings": {} +} \ No newline at end of file diff --git a/Source/ArachnaeSwarm/ArachnaeSwarm.csproj b/Source/ArachnaeSwarm/ArachnaeSwarm.csproj index 943fcf2..1ee6c58 100644 --- a/Source/ArachnaeSwarm/ArachnaeSwarm.csproj +++ b/Source/ArachnaeSwarm/ArachnaeSwarm.csproj @@ -71,6 +71,9 @@ + + + diff --git a/Source/ArachnaeSwarm/CompAbilityEffect_SprayLiquidMulti.cs b/Source/ArachnaeSwarm/CompAbilityEffect_SprayLiquidMulti.cs new file mode 100644 index 0000000..b20154f --- /dev/null +++ b/Source/ArachnaeSwarm/CompAbilityEffect_SprayLiquidMulti.cs @@ -0,0 +1,177 @@ +using System.Collections.Generic; +using RimWorld; +using UnityEngine; +using Verse; + +namespace ArachnaeSwarm +{ + public class CompAbilityEffect_SprayLiquidMulti : CompAbilityEffect + { + private enum State + { + Ready, + Shooting + } + + private State state = State.Ready; + private int ticksUntilNextShot; + private int shotsLeft; + private List currentAffectedCells; + + private new CompProperties_AbilitySprayLiquidMulti Props => (CompProperties_AbilitySprayLiquidMulti)props; + private Pawn Pawn => parent.pawn; + + public override void Apply(LocalTargetInfo target, LocalTargetInfo dest) + { + base.Apply(target, dest); + + if (state == State.Ready) + { + currentAffectedCells = AffectedCells(target); + if (currentAffectedCells.Count > 0) + { + Fire(currentAffectedCells); + + shotsLeft = Props.shotCount - 1; + if (shotsLeft > 0) + { + state = State.Shooting; + ticksUntilNextShot = Props.ticksBetweenShots; + } + } + } + } + + public override void CompTick() + { + base.CompTick(); + + if (state == State.Shooting) + { + if (ticksUntilNextShot > 0) + { + ticksUntilNextShot--; + } + else + { + if (shotsLeft > 0) + { + Fire(currentAffectedCells); + shotsLeft--; + ticksUntilNextShot = Props.ticksBetweenShots; + } + + if (shotsLeft <= 0) + { + state = State.Ready; + currentAffectedCells = null; + } + } + } + } + + private void Fire(List cells) + { + if (Pawn == null || !Pawn.Spawned || Props.projectileDef == null || cells == null) + { + state = State.Ready; + return; + } + + if (Props.sprayEffecter != null) + { + Effecter eff = Props.sprayEffecter.Spawn(Pawn.Position, Pawn.Map); + eff.Cleanup(); + } + + foreach (var cell in cells) + { + if (Pawn.Position.IsValid && cell.IsValid) + { + Projectile projectile = (Projectile)GenSpawn.Spawn(Props.projectileDef, Pawn.Position, Pawn.Map); + projectile.Launch(Pawn, Pawn.DrawPos, cell, cell, ProjectileHitFlags.IntendedTarget); + } + } + } + + public override void DrawEffectPreview(LocalTargetInfo target) + { + GenDraw.DrawFieldEdges(AffectedCells(target)); + } + + public override bool AICanTargetNow(LocalTargetInfo target) + { + if (Pawn.Faction != null) + { + foreach (IntVec3 item in AffectedCells(target)) + { + List thingList = item.GetThingList(Pawn.Map); + for (int i = 0; i < thingList.Count; i++) + { + if (thingList[i].Faction == Pawn.Faction) + { + return false; + } + } + } + } + return true; + } + + private List AffectedCells(LocalTargetInfo target) + { + List> tmpCellDots = new List>(); + List tmpCells = new List(); + + tmpCellDots.Clear(); + tmpCells.Clear(); + tmpCellDots.Add(new Pair(target.Cell, 999f)); + + if (Props.numCellsToHit > 1) + { + Vector3 vector = Pawn.Position.ToVector3Shifted().Yto0(); + Vector3 vector2 = target.Cell.ToVector3Shifted().Yto0(); + IntVec3[] array; + int num; + if (Props.numCellsToHit < 10) + { + array = GenAdj.AdjacentCells; + num = 8; + } + else + { + array = GenRadial.RadialPattern; + num = Props.numCellsToHit + 5; + } + for (int i = 0; i < num; i++) + { + IntVec3 first = target.Cell + array[i]; + Vector3 vector3 = first.ToVector3Shifted().Yto0(); + float second = Vector3.Dot((vector3 - vector).normalized, (vector3 - vector2).normalized); + tmpCellDots.Add(new Pair(first, second)); + } + tmpCellDots.SortByDescending(x => x.Second); + } + + Map map = Pawn.Map; + int num2 = Mathf.Min(tmpCellDots.Count, Props.numCellsToHit); + for (int j = 0; j < num2; j++) + { + IntVec3 first2 = tmpCellDots[j].First; + if (!first2.InBounds(map)) continue; + + if (first2.Filled(map)) + { + Building_Door door = first2.GetDoor(map); + if (door == null || !door.Open) continue; + } + + if (parent.verb.TryFindShootLineFromTo(Pawn.Position, first2, out var _, ignoreRange: true)) + { + tmpCells.Add(first2); + } + } + return tmpCells; + } + } +} \ No newline at end of file diff --git a/Source/ArachnaeSwarm/CompProperties_AbilitySprayLiquidMulti.cs b/Source/ArachnaeSwarm/CompProperties_AbilitySprayLiquidMulti.cs new file mode 100644 index 0000000..8c62c43 --- /dev/null +++ b/Source/ArachnaeSwarm/CompProperties_AbilitySprayLiquidMulti.cs @@ -0,0 +1,17 @@ +using RimWorld; +using Verse; + +namespace ArachnaeSwarm +{ + public class CompProperties_AbilitySprayLiquidMulti : CompProperties_AbilitySprayLiquid + { + public int shotCount = 1; + + public int ticksBetweenShots = 10; + + public CompProperties_AbilitySprayLiquidMulti() + { + compClass = typeof(CompAbilityEffect_SprayLiquidMulti); + } + } +} \ No newline at end of file diff --git a/Source/ArachnaeSwarm/Hediffs/Hediff_CurseFlame.cs b/Source/ArachnaeSwarm/Hediffs/Hediff_CurseFlame.cs new file mode 100644 index 0000000..90baad3 --- /dev/null +++ b/Source/ArachnaeSwarm/Hediffs/Hediff_CurseFlame.cs @@ -0,0 +1,197 @@ +using RimWorld; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using UnityEngine; +using Verse; + +namespace ArachnaeSwarm +{ + public class CurseFlameModExt : DefModExtension + { + // XML 配置字段 + public string damageDefName = "AcidBurn"; // 默认 AcidBurn + public FloatRange damageRange = new FloatRange(1f, 3f); + public int damageIntervalTicks = 40; + + // 延迟加载的 DamageDef + private DamageDef _resolvedDamageDef; + public DamageDef ResolvedDamageDef + { + get + { + if (_resolvedDamageDef == null) + { + // 从 DefDatabase 解析 DamageDef + _resolvedDamageDef = DefDatabase.GetNamedSilentFail(damageDefName); + + // 回退逻辑:如果配置的 DefName 无效,使用 AcidBurn + if (_resolvedDamageDef == null) + { + Log.Error($"[DragonianMix] 未找到 DamageDef: {damageDefName}, 已回退到 AcidBurn"); + _resolvedDamageDef = DamageDefOf.AcidBurn; + } + } + return _resolvedDamageDef; + } + } + } + public class HediffCurseFlame : HediffWithComps + { + public override void Tick() + { + base.Tick(); + + // 1. 获取 ModExtension 配置 + var modExt = def.GetModExtension(); + if (modExt == null || pawn == null) return; + + // 2. 解析 DamageDef(此时 DefOf 已初始化) + DamageDef damageDef = modExt.ResolvedDamageDef; + if (damageDef == null) return; + + // 3. 触发伤害逻辑 + if (pawn.Spawned && !pawn.Dead && pawn.IsHashIntervalTick(modExt.damageIntervalTicks)) + { + var hittableParts = HittablePartsViolence(pawn.health.hediffSet).ToList(); + if (hittableParts.Any()) + { + DamageInfo damage = new DamageInfo( + def: damageDef, + amount: modExt.damageRange.RandomInRange, + armorPenetration: 999f, + hitPart: hittableParts.RandomElement(), + instigator: null + ); + pawn.TakeDamage(damage); + } + } + } + + public override void ExposeData() + { + base.ExposeData(); + Scribe_References.Look(ref parent, "parent", false); + } + + private static IEnumerable HittablePartsViolence(HediffSet bodyModel) + { + return bodyModel.GetNotMissingParts() + .Where(part => + part.coverageAbs > 0 && // 关键过滤:只选可被击中的部位 + (part.depth == BodyPartDepth.Outside || + (part.depth == BodyPartDepth.Inside && part.def.IsSolid(part, bodyModel.hediffs))) + ); + } + + public Pawn parent; + } + public class HediffComp_ContinuousDamage : HediffComp + { + // Token: 0x1700000E RID: 14 + // (get) Token: 0x0600004F RID: 79 RVA: 0x00003885 File Offset: 0x00001A85 + public HediffCompProperties_ContinuousDamage Props + { + get + { + return (HediffCompProperties_ContinuousDamage)this.props; + } + } + + // Token: 0x1700000F RID: 15 + // (get) Token: 0x06000050 RID: 80 RVA: 0x00003892 File Offset: 0x00001A92 + public override bool CompShouldRemove + { + get + { + return this.partMissing || base.CompShouldRemove; + } + } + + // Token: 0x06000051 RID: 81 RVA: 0x000038A4 File Offset: 0x00001AA4 + public override void CompPostMake() + { + base.CompPostMake(); + this.ticksToDamage = this.Props.ticksPerDamage; + } + + // Token: 0x06000052 RID: 82 RVA: 0x000038C0 File Offset: 0x00001AC0 + public override void CompPostTick(ref float severityAdjustment) + { + if (this.parent.IsTended() || this.parent.IsPermanent() || this.Props.endTicks <= (float)this.ticksNullify) + { + return; + } + this.ticksToDamage--; + this.ticksNullify++; + if (this.ticksToDamage <= 0) + { + this.ticksToDamage = this.Props.ticksPerDamage; + DamageDef damageDef = this.Props.damageDef; + DamageInfo dinfo = new DamageInfo(damageDef, this.Props.damageAmount, 0f, 0f, null, this.parent.Part, null, DamageInfo.SourceCategory.ThingOrUnknown, base.Pawn, true, true, QualityCategory.Normal, true); + dinfo.SetIgnoreArmor(true); + base.Pawn.TakeDamage(dinfo); + if (base.Pawn.health.hediffSet.PartIsMissing(this.parent.Part)) + { + this.partMissing = true; + } + } + } + + // Token: 0x06000053 RID: 83 RVA: 0x000039B4 File Offset: 0x00001BB4 + public override void CompPostMerged(Hediff other) + { + base.CompPostMerged(other); + HediffComp_ContinuousDamage hediffComp_ContinuousDamage = other.TryGetComp(); + if (hediffComp_ContinuousDamage != null) + { + this.ticksNullify = Mathf.Min(hediffComp_ContinuousDamage.ticksNullify, this.ticksNullify); + } + } + + // Token: 0x06000054 RID: 84 RVA: 0x000039E9 File Offset: 0x00001BE9 + public override void CompExposeData() + { + Scribe_Values.Look(ref this.ticksNullify, "ticksNullify", 0, false); + Scribe_Values.Look(ref this.ticksToDamage, "ticksToDamage", 0, false); + Scribe_Values.Look(ref this.partMissing, "HCPD_partMissing", false, false); + } + + // Token: 0x06000055 RID: 85 RVA: 0x00003A21 File Offset: 0x00001C21 + public override string CompDebugString() + { + return "ticksToDamage: " + this.ticksToDamage.ToString(); + } + + // Token: 0x0400002C RID: 44 + public int ticksNullify; + + // Token: 0x0400002D RID: 45 + public int ticksToDamage; + + // Token: 0x0400002E RID: 46 + public bool partMissing; + } + public class HediffCompProperties_ContinuousDamage : HediffCompProperties + { + // Token: 0x0600004E RID: 78 RVA: 0x0000384F File Offset: 0x00001A4F + public HediffCompProperties_ContinuousDamage() + { + this.compClass = typeof(HediffComp_ContinuousDamage); + } + + // Token: 0x04000028 RID: 40 + public DamageDef damageDef; + + // Token: 0x04000029 RID: 41 + public int ticksPerDamage = 100; + + // Token: 0x0400002A RID: 42 + public float endTicks = -1f; + + // Token: 0x0400002B RID: 43 + public float damageAmount = 1f; + } +} \ No newline at end of file