From 2dfce67f5311fdb7aa1af4d691045580237be4b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=A8=E8=90=BD=E5=9F=BA=E5=9B=B4=E8=99=BE?= <3161880837@qq.com> Date: Sun, 14 Sep 2025 14:39:50 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E8=A7=92=E8=89=B2):=20=E6=B7=BB=E5=8A=A0K?= =?UTF-8?q?ukeChild=E8=A7=92=E8=89=B2=E5=B9=B6=E5=A2=9E=E5=BC=BAKukeMC?= =?UTF-8?q?=E8=83=BD=E5=8A=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增KukeChild角色及相关资源文件,包括贴图、场景和脚本 调整KukeMC属性,增加新攻击类型可召唤KukeChild 修改EntityBase基础逻辑,添加spawnTime属性和timeLived方法 移除Rooster.gd中未使用的heal方法 --- components/Characters/KukeChild.tscn | 37 +++++++++++++ components/Characters/KukeMC.tscn | 1 + resources/characters/kukechild/KukeChild.png | Bin 0 -> 11726 bytes .../characters/kukechild/KukeChild.png.import | 34 ++++++++++++ scripts/Contents/Characters/KukeChild.gd | 21 ++++++++ scripts/Contents/Characters/KukeMC.gd | 16 ++++-- scripts/Contents/Characters/Rooster.gd | 4 -- scripts/Statemachine/EntityBase.gd | 51 ++++++++++-------- 8 files changed, 134 insertions(+), 30 deletions(-) create mode 100644 components/Characters/KukeChild.tscn create mode 100644 resources/characters/kukechild/KukeChild.png create mode 100644 resources/characters/kukechild/KukeChild.png.import create mode 100644 scripts/Contents/Characters/KukeChild.gd diff --git a/components/Characters/KukeChild.tscn b/components/Characters/KukeChild.tscn new file mode 100644 index 0000000..5126795 --- /dev/null +++ b/components/Characters/KukeChild.tscn @@ -0,0 +1,37 @@ +[gd_scene load_steps=5 format=3 uid="uid://c5q7djx12phem"] + +[ext_resource type="PackedScene" uid="uid://cvogxi7mktumf" path="res://components/Abstracts/EntityBase.tscn" id="1_3ohuq"] +[ext_resource type="Texture2D" uid="uid://lorraj4pe2lt" path="res://resources/characters/kukechild/KukeChild.png" id="2_7vbs6"] +[ext_resource type="Script" path="res://scripts/Contents/Characters/KukeChild.gd" id="2_ywxbd"] + +[sub_resource type="SpriteFrames" id="SpriteFrames_5rcbd"] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": ExtResource("2_7vbs6") +}], +"loop": true, +"name": &"idle", +"speed": 5.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": ExtResource("2_7vbs6") +}], +"loop": true, +"name": &"walk", +"speed": 5.0 +}] + +[node name="KukeChild" instance=ExtResource("1_3ohuq")] +script = ExtResource("2_ywxbd") + +[node name="texture" parent="." index="2"] +sprite_frames = SubResource("SpriteFrames_5rcbd") +animation = &"walk" + +[node name="normal" type="Node2D" parent="texture/weapons" index="0"] +position = Vector2(47, 11) + +[node name="statebar" parent="." index="3"] +position = Vector2(0, -125) diff --git a/components/Characters/KukeMC.tscn b/components/Characters/KukeMC.tscn index 15484c5..a47b4ee 100644 --- a/components/Characters/KukeMC.tscn +++ b/components/Characters/KukeMC.tscn @@ -38,6 +38,7 @@ animation = &"walk" shape = SubResource("RectangleShape2D_farlp") [node name="normal" type="Node2D" parent="texture/weapons" index="0"] +position = Vector2(-22, 18) [node name="statebar" parent="." index="3"] position = Vector2(0, -140) diff --git a/resources/characters/kukechild/KukeChild.png b/resources/characters/kukechild/KukeChild.png new file mode 100644 index 0000000000000000000000000000000000000000..a69c6c7e3d2f325036e4009030baef48068e082b GIT binary patch literal 11726 zcma)?LwsFdw8vxK*yc@R+qSL7ZtOJHjqS#^?WD1tG-|BIcJlHcyuq8j!9M%5*7^&Xx9v0(n**qjGZE@iHiMkT9H#{V-p)(`ECE-)WZbWxJZQlJm@%j5G4<=8u=<)}H%n zkJ{!31Nb?scU|JLU|8M3ieNQ8+Cc1jUHY=9|I8>oJz2d$8>c)*Vk@*tMteINJG4{J z9pT{DRdUT>BEK&774qe4)_J50%P4Im_owT5{V45`32CmjTm}=4KRY9GE(|6_Oca~j zel6ikMqzPW9=0R8gS;&xkKy+<5>*t3FQ%P4*!8jJ*8(QpKhRFY+dux;w@Fl)di%s_ zUw$b~YJ^${?9qPs_~_O1+zCf%yBtrZRyd(Fg>zg)Y1$$S%#tq?@-`ORY(O%Y#Jm<@ zWs3b53!COguc&I4b*yW#q;O#-YEI^2sAp`y*ds9XzXlGq>N`tZ1bOJIv~4F&MB;Sq zHOz;8?lsimJD7IhJM=y^#D|9~-)uRLndb}d2DKWz)a>#&^m2Q@9|=CzHgi|tnL9ks zBH2bWj?mpR_h}5d>HU3ffGS@UH>(w7YbMXA# zfOWMnNhD781t3u37MDgCT-52NIug%*fSC_8$Y#3kAwB;lnkjoYU}&G5bh@Od4$y+h z*C^k;lV|W*{M$IV0vp z9Hh?5v5F_9xAw^IK*<*=&I(TreeR8cT9@m?oe(JXBu%p=73|j`a=y3`ZJD0}J<5O^ z3MpzMqP zH!k%b48@RHHpUmA!#1TbS|7@+1+W~-2ugU42{VJiib4T@o{7|7Vuc`}YRhodl`5R; zlda$$W4^#aaAoRP1RyU;2p{dNqJlrFeK!bt77=Gzo?Gsl9dqSWE7&^@ zRUJ4Ul_1hZ!VoL$-0!n1qEtnZS0#n!LP!Q=*a&ALIPjic~UaOQphS-|+e_Wl=TCThs zWQLvEPkTb{qLQWIQY&U4=RqQ&yJ{gwWQ*o72}m^5?yJPfh)Ce|y`X+~3|VmPsX=!%tM{2 zEA9?RVB$s@i7aU&a(a=<6=o)H>Xk>e-&C5CSZvKd=m~oMuiB(Pg20$%JflGDb3fZp z$E&bzp=KeZ9?RaNTY80==u91|IzW4MdDe`|-|U4cs;W&$ww3q?KV$!d<7>aaX~SyL zf$tQ%%u{W`^L9TmgktR_y>Glio-Ik;ESLE`fC_R|uOAne>m+UGKVJB@-a0;(H`(?+ zIvo~rpA1*rKdwt>5QTgfWZ#BzYx)d7##rB;zoqehS=D`p?-52o!PgPG>kOr=fZm=1 zj<)@*G}f6<&w-2WK!TfY6rYBxeMkoy4OGGFK0QKW@2jceT)(5P`5EH2*1O+HLbT={ z{$=cS_nSN1HOR0n-(|Z@VWf5N_zc@Ae<8J~Dc0Go1Lx>!6`^jYrqi~JTkQP2o1AA# zZ*aOF5?Z!=<9@qc%JBHS{h}27IE{eU{_H_6VQc#c_I#*M6_3AyZE4ACKU|;4l zQKJQeV&|kZN{vFu`q|SNO`n{Wvb|M{Vf?F9Ux`&S=13~NigRNqe2NIu9Ceii-|GLx zSj2fLrv9XR`B^BX-J4}WX!jh(tRxU=b}e;0w5PpM4~^JiAnrecs6G2kj_qpK|9hGh z+pQ-W__dgrNkor4rYH@}8M?^ILF#uH309lsBw2rV5weRia7`mH!m2d_)x2?b zBWl{2W^m`@Zim(?^<^y*=yR*K(dAO-d(jJV(aSCtO5VqREK4o!c*8xaw1H7rkl8VA zMw_T?8%3$S0A@=8ibt0HM?x5h9pM9*qGd_`L!Sr8n0^qMg}D%MgC>3@7?B7ovAdx< zGvY{g)>XdDt?_`2ncXTYtwZzW$>Nm8*ZM9Rs41$Jwsf`5B0|5ES6a7I$o4%rY#M8M z|Bfqrns=WFV=xgrg}RMH&#T92KuiBQZeSxhzL?TvTV!* zH3tXs8XI^+;#kL}PFi*H$ZW6)oK=}DwbPYlJEktdwTmW{H{3^Fq*%ut*^-S$&^lZG znE!?v5e=f=V8PK4JWG1kJCNXJRc6{^fMV{0Oem`c>#EV<4P@FL9*!RwJ^7# z`Yg)#89@?VA-GFMn)u1(u9+d6tT$(uJhY=ov?9=6wJlV#z0!rNod6f;69_UoeG*uV~la>6hMT0c~=9 zR$`1~;u>N}@IXrEqKZW8L@SDJ^%ce=KFwMJtKKKE_0F31layGL&8EV4G5e%5##Qm!*eCgZ9R~f47B0z3tRg1wddaZ z6OQiQ`?McNzIV5!Gq0n)S!*7f)wLNOd*`($@9&pPa=v%Zp?0}%uuDCZ1g=f_mc}?^ zOPmZHI-LF|{F8dTBpDZ+0fzTvKd@uBl{A_e8tpW0w&!Hnw)^P_8wOd#s&oam^A}2j zFl9lO(VQdIN`JvqUs=Er)OirnjsHk9k28<(=XAIGq82vmtEJY<9&igG)2*sO(0F7} zhEZUOl^{h}n9qEhAUCEHzDK9Iff(od$7>&fMLtHMqwq;ED)@ty6xNjxaLV~EkvxO< z4B<#!WV2|cXkYqEKOkFQf9CF5j=r}jk}~cf&1OPN+OH-rSB72iT{A^0U%mxZGgbI; zENGB?l{8)iqi(s1@n48hL*2fHsq?eSFG2eV^WX?&EOaEB(5Ppu3a^Q-}$Z-_MO*RubDWy(+&3ScR5!yrx3qV5rkb(lMpPS_g zY2Q=>Ud?Wd(GvlYyH(52h#EPYrI@U$TmhI8!5FnY%u5VN6iPej6bX7W1Jl7tc4HRQ zr#63k(D-}i(wAbUPI_&_ygn5_nMv3Xo_0*hofO1s-(ton%{jrJp#cslm4^^P$?yzf zs|M~fB`32x*7auXE>6$IOid+}6w1fojE{qD0nFeCsM)z1UuvD?woj%RHC*Iw7w?!omB$LQHo}Y z_D%MRcZ9yO$tn$)KkN1(q_!FmF@#qfx0C0xC;`bxG+LCD>{ZaB14v1%)H904Kqy2E zaRlrGJjMMINT6j;mcg7t9>m%{ZTRv5-F``X$Vaw&i`;9c#V*})@1m}Na7*Xg$g!Ai&QO16L?`oEQqdoDd#QwJhVp~iMm==ocweG)knr= z#{{Q|1d%VLOrjVT_eT%Bws(NrrC^&11e*OywHesFjrbkDNVYGoPeecFmRb+5b>E&VQ+Ejc%zhAeaSK9vY^J3lUSHs3n^-#1DKK3IoK6bL?S zZX3DY+6N8^1UtQMUuNw7Hhnm7+I8&6WpZs^Elp)|ZM1kT+&Qvcu$)?JIb>(E2&B?Xva!jFR&_5-Y3bf$!hFZ#(LRahiFAb#j1aWbhKg9c(3D3wtFY?DOam3LyEg6(%ZS zX{<45abMmIV@#(806Q0%p@@FsX5&hf;x8Z{h5c_YK%$jcM2kZ`l@&J7f@iK0#JqJO z(ov`9QG&=(&9k9LV@l_LlSoz)*oVK4AK@mj=9-XbsmlL&1ffmX z@t^+5?Y0Xxj`^n%b0ej=k#IW7;ZM!L6|MbCDVLP9ftUD*NU@Fj%ovfwx-NB*Ra~JN zncVi7VGI}X5%%&-Jjo26-{?MK7xUmso)l|gvihK*DIdRiQGjrDjUn6jhiT&3pFdad z`N;pa>wh)InKjy3Jj^HW!=yV%M^By)_54oMUq&i3&ax$&Yl~tU$rzO9j;C?Th8&Yu zqjJZ!L>yD>EI})m(-aFI0>^BXKM63A!m`;LzyvZ5kfyD3*%8#V1#;ny;!>p$d}HgP8(6;gKX5^ z2vHOC+yNUWdHB_`xulOU=gkzP+ntuDEop(tjBsXN7%N9!plKW+$XF3Q+8ur&J$Gq zPV3C?Z+@?~K|5}irUPzAyEFD(xc-itnR6+l{jFg_ren4!7nM*6Z<_^0AfzzI7wf2N z03R1d?}J^_99D^^(aV=Ddc@5b!Q^mJDgT(U9s{>Ahk|4C7N zT)d-nk9#osFbWtNuoM3YKz#hh0_q1~qul5D^37)K(Hp~ny#jphxgqW;Ay5InAi*3^ zo`5GZd?P$>Z;F(H*z8882+g1}dk;SM_KfgYG!TXS)QK+Cj21lESvdmkWDu1%5puRY zmm>Hmz9BOqn$ziIJzBmA&(4Cag6J6EFilUCKDbXSR;sBWp9+7`E-y^|s@iY(tq zkym*xb1Zs!F^%*lf!aKt)|EWzl30v)E7-}kkYOuU9S!bD0PZK$mAlw0YNMiYBbwYKQg#m|E^A7dMaU2N-0Br6*!)VUoNJAQdqp*Y(U@{i_Gupn zmdX~H%wkw%mg?kqBG!(lNp6Kh2-uGk>FgD*yrpyq@58m( zvkQ?CrpaI`Z!G2jUuX$&|_Wr_(I z@pyGM(e$8m?>i!mXxpg{()J)EhZ4f;r;dcf9mQHdO{E=|Ho(IYFe-yfqp=s%=a%S- zAciS0gn+fSq#d+)PQ~^bMw`45ao$C08`50vrlAX#4p3@h)d&4%<$n>&$+t;{or<@j zcSWWbD!!1ZF50x+-aUiJ9X8VHu=#`XmxyV+4^i#vsp$u%Oe0=ix`T*bS<=KeI2}oW z1_cWkV9{>FeyWTPtww5)geK{r;1FeVFiK({s{ztjC8*%9je6RU6R?B()zL5LU_f`b zijJB#6nz+tHfof$T9(?A2lJk#4HKW2)D*G^~pY&(x+=c;F+ns zC8qqM>vl3Le5H)^H;!zB!!cXReR#kVQFvkk2z6pFcn2QbEMQd-6IvaPTRKa4X(om3 z(oxKMBEL$n(bp#QNrtrD{8J{{sC^VJD`s+6UflT;8 zGpjUsHbsA;!6=i26SN&0Yf<(Fqw_qQG#f{Ls;?Rg#9Z zsWL!5|x@x1iOzxB&2(2XmAiuF0#CUPpG?yHIg$5Wk~YORz< z8|<+98o{?<1k^uEGtjTBL3VWgEjanC0crD1-aWh37imrEkCFj;nCRa*7rSw3+)SCz zhLsm%MNBAd2BiP6fQ*O5`~~N;>GCk5j0z2SJ8+iep?`b9Aqre+kjNVAO8PAO;ypaB z5zUcGuEDTuaPoulAB+carvMb|Duc@CxQC4al&dMTbv-CniMn|eyNNk~6bNLnp$3+# zAB*x0?7F(Adtj~*9yfY+>kTBn3u$#~C(C#r) zon?DUD=Ho-|1xbkxs5+B=F$1^v#9zUov|d7=$Lsx*_du14QdBoo3 zE9--pdjTr;wDKQNo^z_0k{#!c(@Yv1p0j1~R9*=1jnr}dz&%`DRpDrnVGoZ>(I!A$ zRQWuCM8Z~hLw;Oc{7y&;_`d(1D)~-{Si=1i_#`$)GQ-!U;I}AGdyq}^xpL@#KOAvW zmi>KYx4h3!$r=^^gAZ+hh>i%frX-0+hgY*N)`$??KZg6DWjtsY8)Pu3wOnaM|L@}m zTz#^t`)b7_gF(|n$HSmRTIuiBcjMg{oDW6Ezk0PO%iZrWA38YQ`9VK09NO-JjIMuq z)cicQe4X?l@q~Z;+lcqL^-fQ=Bfc^5=6$&p;@$gR^mC`4$e7_T@4;KjLu4k?h!@u< z?R3|{Z_NhxSsbswq9NY23}4$Et*$1so7=2%M5(m zSG&kvZ}ShVEzDKhDLAc-AKY2C`e8d0OfuaFEr7ag@UB6}bwo(iui^>I*4G*($LCFg zaqiY>{w=eCwf=j{-M{=55yLsrxN21?ggB6lfZH^xK4 z?S0bmSk3o*?{Jw`UpAx^M!Sw`65&*-`CVVT3?UZ-xb81N&chYi=Vl5upY1o%Asb^q{e>6k2 z@M?eG-~^Z_Td#-Z&-q^65Wf+w3>Ach=k6DpBpQRM(GNJgqlp(o$p|Xc=btrE z+oWgotupTu5FrSvi|~2szW^+o)t%AO_LJm2Mo2d2w*2o$BQ`HrTl3xr_|jT^U0>%X zUt1aeJ#VKLe<#`K>e?G1P`dcIn$ev4JT8n{0%p})9OVwA%!gIx8Qd!@R=WN{GUY>C zy}(luMG-=1*-PG0vt?-6$ME7vBo358fyj7YD70gm?a4IvRsr1D=Q27N8YBn!ILC8I z#xnLPVQzAV!HyZF&KvT(+I3-^N@(kbl z!(ABB}_cdHSiVZVg~g^u}CBuD;l-1c34%Rrc?!^7>H z4EKDe$BqrECN43=@#ahVERo%CixC6f0!c!fJ^S2#tvfjE&DTyZcUEtOp4xmL6wwkE z$6Nd8z&E~72!cev6XXCX>g6YC;Cg;DilOzB?!ZF8!*Ks)ADCGm5@sn5Y;ii5AKq1` z2G(wisf4VTa)xh6O3jFZ|Is`vdMv~npigZ!4W+I0Fj<_X!JV4SGRWn9;ROVt@?`>`0*bXa1QW5chdds+X-T+^Tn}@LZwsG zjmFSo9CijxXk`UpDE$gQpi46u8k?x|Jb`e%Z=uMBH4Q#@Lt5qF-Y(sH2CQd*|5*Mrew)Aree7;#@kGzGh zNX1TQyMNGO?zSR)3wW=r6NdR4VCY!~LDBI%EeCVT3lQMd{r-1vlN%Aepe*7SftY;90#Bbv;iljMywJM$DR*hJoV zFiFQxMh_4{ik!eBW8YIcrp&N=2$=o0Ot`c5GTkmjJw}t2g)*5Pnm6f78SM5A&Gvc; zs+{sNMS~+$vilH(QB_Fjl$(ZkWjj42=2K%xTP=R#h^+?=au=1EBc>(AlyBI`x4(r) zzKP=={)0dfoeZy{PN)O(77WpGHKw9?aP?oWWXmbDYH0l0DZ1f z=EiCUCdO*`l7$t|1N%?KxH0)7gm&q2SLIrw$dY8{EM}xoi6uq)td(Gx$vR@9frF;u z@xt?r`!PsqNNkjVg)ViT;EiRMi_nR6^c3c-Y-lyHMIz4N zqO^ZEi|NO`to|CV-cU8oEaV`m%3wabbuuGS_F{&P-fBx)#EIsERbwWrs(BA&z-F17 zg!5Czxj+fywDmKD={`t@RGfv%YloDn%YtX6Br6KjU9_v05dOp;r-<kS=~spoZjn!!h^TUyU)0UKlc z8HjDm{aO+TsVrd1<8f>4A@?`m!^D+6O1*<%bqN-8(IZlW_`kNnn_%~wWK_y(ldvRl?&i+)b8{ zxoq!*^>z|;5{sYd*IfbE8$A$`5h5m@4i~e0nn%CBu!G84pU;8I-iw*P?-!5uPlblw zm*09kr#QI$Uca(I$C29ajXO0zYE~V$YP*kyKRaH0PkVh=Uu!;l)4snxmNFQ+NIH35 z5(^H+syOz_E+*=;0QPDo&uho)PcE)+(svpNuzk-qehvD1ob`KL0IvJa`yc_mE?VK2 zf6cGYJ25YM*LOd>$u~T5`@0`g9WQ;M`Jc_0a(pT>kFx^4<@^)J+w|Q3c1~#%L~Xp% zLg{`!X}r=$I$(UZ$`bjV4*_bz9S(sXb;fjk*%%}d4Y=*kn0}%f{h@2J^e;1U`R%Xr ziQ%JPRJw#YHp}GT^5hWJB#S- z&R${=gQ3$cQ$EP*{{%YW$Vw)Oo!L5L91VBDL*i8KPhv>{)txKBMX5!QG?2+@2gsNwkFx@C^v9+1{t2XJVaV!AlR*}7i@`PR(5r)| z!^*qG?aB`wz`8)|^fzZhr!16f@Tf=TYhF=O@-r(QBP5&f1X8`9P&HRtG>)^)2X<1h zLag>7mRAs<1!!_1?Ff3cqBoG(hSI*y$A0u}!ik zRdPG4vrYu7%g7^$Gftzk>P(Z%YFHo+?==h{W!rN!Vw0s|MpZ*3B=f^(qNU7PNiNtl zkF}w|0prNL&D*1O81;+$9ip95|T4Pue3^$yb03Gd)JA$cCtxmL6lvjNZD4w_ld}$5&rp>gN(eCUTwJ$ehNS^6u=Ih=Kxwk zs_YLbkyPvhvnZ%EltyqzFrSC5UdpF{Vp<=VEgVfh^WFfAv4syAwqh~jMk_1^3nH9w zmWUxVcL7H6&j4W?3vnl7jU3qxMFOo&?)q?vX^dDwk}iKHTxPqU$1aj>$`LtE2rFv*aqXY;Xy z|1dXgD2NTVetYq)YhikNTF-ZRv}?%{8SzCkmu1moEu%0xZkq3X5-n^=KG)A8^}1@p z(D%^l@?=tP>PvT+p7ssFw{nL5u11h;%loB6^zq+HT8EOi3pnBoeEoLJFr#NMspuzx z*!ri1h#AhCvlUKPPx!}*B~2?|dhY{DvZ{hi&DSl`y)OHoEhc?1Xt(bxIy@)7b`5>| zyT_pKSK8`1wDLAY*ORE-uuCT+BDM87;X3)c-U6iis6MZ{?a9{h{(ElsW9w=uHli)% zL~nhiXJ@%(Vdgb%a*gZF^fff?({5(!^XN5$K=66!0g21E=XN;r!y|2gA@{Q9I+e-Q z7Iot-bQ&p0FTLj(@jSY<(?b~h1W84 zu1u}K<3vRBsr}1ny!kx%jahD-0C zPq~SjciYA(^?HF3K>aRq^Y6o}F9>&v1$iV3>kI955nCf9vO%ll8Qw{6ERd+uL9&)B z)BGZEH7ZARZyImDw2jVc|9=-@^Cjl7P=Vu{M`}T{3g8m2V=!7Bw literal 0 HcmV?d00001 diff --git a/resources/characters/kukechild/KukeChild.png.import b/resources/characters/kukechild/KukeChild.png.import new file mode 100644 index 0000000..f19073d --- /dev/null +++ b/resources/characters/kukechild/KukeChild.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://lorraj4pe2lt" +path="res://.godot/imported/KukeChild.png-4ca0607e1c4594e36fa458519a8a0756.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resources/characters/kukechild/KukeChild.png" +dest_files=["res://.godot/imported/KukeChild.png-4ca0607e1c4594e36fa458519a8a0756.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/scripts/Contents/Characters/KukeChild.gd b/scripts/Contents/Characters/KukeChild.gd new file mode 100644 index 0000000..2fb3138 --- /dev/null +++ b/scripts/Contents/Characters/KukeChild.gd @@ -0,0 +1,21 @@ +extends EntityBase + +var masterMine: KukeMC + +func register(): + fields[FieldStore.Entity.MAX_HEALTH] = 25 + fields[FieldStore.Entity.OFFSET_SHOOT] = 2 + fields[FieldStore.Entity.MOVEMENT_SPEED] = 0.25 + fields[FieldStore.Entity.DAMAGE_MULTIPILER] = 0.1 + attackCooldownMap[0] = 200 +func ai(): + PresetEntityAI.follow(self, currentFocusedBoss, 500) + tryAttack(0) + if timeLived() > 10000: + masterMine.tryHeal(100) + tryDie(null) +func attack(type): + if type == 0: + for i in randi_range(1, 3): + BulletBase.generate(preload("res://components/Bullets/PurpleCrystal.tscn"), self, findWeaponAnchor("normal"), position.angle_to_point(currentFocusedBoss.position)) + await TickTool.millseconds(randi_range(5, 25)) diff --git a/scripts/Contents/Characters/KukeMC.gd b/scripts/Contents/Characters/KukeMC.gd index aa1c51f..9aa6dd0 100644 --- a/scripts/Contents/Characters/KukeMC.gd +++ b/scripts/Contents/Characters/KukeMC.gd @@ -1,10 +1,12 @@ extends EntityBase class_name KukeMC + func register(): - fields[FieldStore.Entity.MAX_HEALTH] = 2500 - fields[FieldStore.Entity.OFFSET_SHOOT] = 15 + fields[FieldStore.Entity.MAX_HEALTH] = 3500 + fields[FieldStore.Entity.OFFSET_SHOOT] = 25 fields[FieldStore.Entity.MOVEMENT_SPEED] = 0.5 - attackCooldownMap[0] = 2000 + attackCooldownMap[0] = 8000 + attackCooldownMap[1] = 5000 func ai(): PresetEntityAI.follow(self, currentFocusedBoss, 500) for bullet in get_tree().get_nodes_in_group("bullets"): @@ -13,9 +15,15 @@ func ai(): bullet.position.distance_to(self.position) < 200 # 酷可mc会去摧毁200半径以内的七彩飞星 ): bullet.tryDestroy() - tryAttack(0) + for i in len(attackCooldownMap.keys()): + tryAttack(i) func attack(type): if type == 0: for i in randi_range(8, 16): BulletBase.generate(preload("res://components/Bullets/PurpleCrystal.tscn"), self, findWeaponAnchor("normal"), position.angle_to_point(currentFocusedBoss.position)) await TickTool.millseconds(randi_range(10, 50)) + elif type == 1: + for i in randi_range(1, 2): + var child = EntityBase.generate(preload("res://components/Characters/KukeChild.tscn"), position + MathTool.randv2_range(500)) + child.currentFocusedBoss = currentFocusedBoss + child.masterMine = self diff --git a/scripts/Contents/Characters/Rooster.gd b/scripts/Contents/Characters/Rooster.gd index 8290dca..0850646 100644 --- a/scripts/Contents/Characters/Rooster.gd +++ b/scripts/Contents/Characters/Rooster.gd @@ -33,7 +33,3 @@ func sprint(): Input.get_axis("m_left", "m_right"), Input.get_axis("m_up", "m_down") ) * sprintMultiplier, true) -func heal(count: float): - health += count - DamageLabel.create(-count, false, damageAnchor.global_position + MathTool.randv2_range(GameRule.damageLabelSpawnOffset)) - return count diff --git a/scripts/Statemachine/EntityBase.gd b/scripts/Statemachine/EntityBase.gd index 8b0edfc..8535fc4 100644 --- a/scripts/Statemachine/EntityBase.gd +++ b/scripts/Statemachine/EntityBase.gd @@ -96,8 +96,10 @@ var charginup: bool = false var weapons: Array[Weapon] = [] var canRunAi: bool = true var currentStage: int = 0 +var spawnTime: float = 0 func _ready(): + spawnTime = WorldManager.getTime() register() var selfStatebar: EntityStateBar = $"%statebar" if isBoss: @@ -166,6 +168,8 @@ func _physics_process(_delta: float) -> void: trailParticle.emitting = trailing # 通用方法 +func timeLived(): + return WorldManager.getTime() - spawnTime func setStage(stage: int): if currentStage == stage: return @@ -284,30 +288,32 @@ func sprintTo(target: Vector2, speed: float): position = target trailing = false targetableSprinting = false -func tryDie(by: BulletBase): +func tryDie(by: BulletBase = null): if is_queued_for_deletion(): return - for drop in range(min(len(drops), len(dropCounts))): - var item = drops[drop] - var count = ceil(randf_range(dropCounts[drop].x, dropCounts[drop].y)) - for i in range(count): - ItemDropped.generate(item, randi_range(1, int(sqrt(count) + GameRule.difficulty)), position + MathTool.randv2_range(GameRule.itemDroppedSpawnOffset)) - if MathTool.rate( - GameRule.appleDropRate + - by.launcher.fields.get(FieldStore.Entity.DROP_APPLE_RATE) + - GameRule.appleDropRateInfluenceByLuckValue * by.launcher.fields[FieldStore.Entity.LUCK_VALUE] - ) or isBoss: - for i in randi_range(appleCount.x, appleCount.y): - ItemDropped.generate(ItemStore.ItemType.APPLE, 1, position + MathTool.randv2_range(GameRule.itemDroppedSpawnOffset)) - ItemDropped.generate( - ItemStore.ItemType.BEACHBALL, - fields[FieldStore.Entity.MAX_HEALTH] * randf_range(1 - GameRule.beachballOffset, 1 + GameRule.beachballOffset), - position + MathTool.randv2_range(GameRule.itemDroppedSpawnOffset) - ) - if isPlayer(): - if UIState.player == self: - UIState.setPanel("GameOver", [displayName, by.launcher.displayName, by.displayName]) + if is_instance_valid(by): + for drop in range(min(len(drops), len(dropCounts))): + var item = drops[drop] + var count = ceil(randf_range(dropCounts[drop].x, dropCounts[drop].y)) + for i in range(count): + ItemDropped.generate(item, randi_range(1, int(sqrt(count) + GameRule.difficulty)), position + MathTool.randv2_range(GameRule.itemDroppedSpawnOffset)) + if MathTool.rate( + GameRule.appleDropRate + + by.launcher.fields.get(FieldStore.Entity.DROP_APPLE_RATE) + + GameRule.appleDropRateInfluenceByLuckValue * by.launcher.fields[FieldStore.Entity.LUCK_VALUE] + ) or isBoss: + for i in randi_range(appleCount.x, appleCount.y): + ItemDropped.generate(ItemStore.ItemType.APPLE, 1, position + MathTool.randv2_range(GameRule.itemDroppedSpawnOffset)) + ItemDropped.generate( + ItemStore.ItemType.BEACHBALL, + fields[FieldStore.Entity.MAX_HEALTH] * randf_range(1 - GameRule.beachballOffset, 1 + GameRule.beachballOffset), + position + MathTool.randv2_range(GameRule.itemDroppedSpawnOffset) + ) + if isPlayer(): + if UIState.player == self: + UIState.setPanel("GameOver", [displayName, by.launcher.displayName, by.displayName]) EffectController.create(preload("res://components/Effects/DeadBlood.tscn"), texture.global_position).shot() await die() + queue_free() func tryHeal(count: float): if inventory[ItemStore.ItemType.APPLE] > 0 and health < fields.get(FieldStore.Entity.MAX_HEALTH): inventory[ItemStore.ItemType.APPLE] -= 1 @@ -347,11 +353,12 @@ func ai(): func attack(_type: int): pass func die(): - queue_free() + pass func sprint(): pass func heal(count: float): health += count + DamageLabel.create(-count, false, damageAnchor.global_position + MathTool.randv2_range(GameRule.damageLabelSpawnOffset)) return count func register(): pass