From 5186a858033cb4debde4e5fad6f4dc125cdfb15c Mon Sep 17 00:00:00 2001 From: HumanoidSandvichDispenser Date: Sat, 22 Jul 2023 20:23:48 -0700 Subject: [PATCH] improved visuals --- Assets/Sounds/whoosh.wav | Bin 0 -> 49120 bytes Assets/Sounds/whoosh.wav.import | 24 ++ Assets/Sprites/Characters/doc.ase | Bin 4331 -> 4383 bytes Assets/Sprites/Characters/doc.png | Bin 1214 -> 1240 bytes Assets/Sprites/Characters/forsen-hand.ase | Bin 0 -> 666 bytes Assets/Sprites/Characters/forsen-hand.png | Bin 0 -> 78 bytes .../Sprites/Characters/forsen-hand.png.import | 34 +++ Assets/Sprites/Characters/forsen2.ase | Bin 7254 -> 7479 bytes Assets/Sprites/Characters/forsen2.png | Bin 2173 -> 2276 bytes .../Particles/NPCDamageProcessMaterial.tres | 25 ++ .../PlayerDamageProcessMaterial.tres | 42 ++++ Assets/Sprites/Particles/circle-16.png | Bin 0 -> 131 bytes Assets/Sprites/Particles/circle-16.png.import | 34 +++ Assets/Sprites/Particles/circle-64.png | Bin 0 -> 765 bytes Assets/Sprites/Particles/circle-64.png.import | 34 +++ Assets/Sprites/UI/over-under-bar.png | Bin 0 -> 78 bytes Assets/Sprites/UI/over-under-bar.png.import | 34 +++ Assets/Sprites/UI/progress-bar.ase | Bin 0 -> 748 bytes Assets/Sprites/UI/progress-bar.png | Bin 0 -> 102 bytes Assets/Sprites/UI/progress-bar.png.import | 34 +++ Assets/Sprites/arena-tileset-normal.png | Bin 1383 -> 1032 bytes Assets/Sprites/arena-tileset.ase | Bin 3815 -> 3645 bytes Assets/Sprites/sword-swing-large.ase | Bin 0 -> 2848 bytes Assets/Sprites/sword-swing-large.png | Bin 0 -> 785 bytes Assets/Sprites/sword-swing-large.png.import | 34 +++ Assets/Sprites/sword.ase | Bin 708 -> 683 bytes Assets/Sprites/sword.png | Bin 325 -> 299 bytes BoundingBoxes/CameraBounds.cs | 21 ++ Characters/Boss.cs | 14 ++ Characters/Character.cs | 16 +- Characters/Doc.cs | 51 +++- Characters/Doc.tscn | 139 ++++++++--- Characters/Player.tscn | 137 ++++++----- Entities/TorchLamp.tscn | 10 +- Entities/UnwantedFrequency.tscn | 8 +- Items/Weapon.cs | 9 + Items/Weapons/Sword.tscn | 44 +++- Items/Weapons/SwordCollisionShape.tres | 4 + Scenes/Level.tscn | 23 +- Scenes/Maps/Arena.tscn | 228 ++++++++---------- State/Character/NPCIdleState.cs | 2 +- State/Character/PlayerIdleState.cs | 12 +- State/Character/PlayerMoveState.cs | 4 + State/Character/PlayerRollState.cs | 5 + State/NPC/Doc/DocChooseAttackState.cs | 5 +- State/NPC/Doc/DocShungiteDartState.cs | 1 - State/NPC/Doc/DocShungiteSpikeState.cs | 10 +- State/NPC/Doc/DocTelegraphState.cs | 4 +- State/NPC/Doc/DocUnwantedFrequencyState.cs | 10 +- UI/HealthBar.cs | 13 + UI/HealthBar.tscn | 24 +- Utils/AnimationManager.cs | 10 +- Utils/PlayerCamera.tscn | 3 +- Utils/World.cs | 10 + default_bus_layout.tres | 3 + project-todo.org | 27 ++- project.godot | 7 + todo.org | 13 - 58 files changed, 852 insertions(+), 310 deletions(-) create mode 100644 Assets/Sounds/whoosh.wav create mode 100644 Assets/Sounds/whoosh.wav.import create mode 100644 Assets/Sprites/Characters/forsen-hand.ase create mode 100644 Assets/Sprites/Characters/forsen-hand.png create mode 100644 Assets/Sprites/Characters/forsen-hand.png.import create mode 100644 Assets/Sprites/Particles/NPCDamageProcessMaterial.tres create mode 100644 Assets/Sprites/Particles/PlayerDamageProcessMaterial.tres create mode 100644 Assets/Sprites/Particles/circle-16.png create mode 100644 Assets/Sprites/Particles/circle-16.png.import create mode 100644 Assets/Sprites/Particles/circle-64.png create mode 100644 Assets/Sprites/Particles/circle-64.png.import create mode 100644 Assets/Sprites/UI/over-under-bar.png create mode 100644 Assets/Sprites/UI/over-under-bar.png.import create mode 100644 Assets/Sprites/UI/progress-bar.ase create mode 100644 Assets/Sprites/UI/progress-bar.png create mode 100644 Assets/Sprites/UI/progress-bar.png.import create mode 100644 Assets/Sprites/sword-swing-large.ase create mode 100644 Assets/Sprites/sword-swing-large.png create mode 100644 Assets/Sprites/sword-swing-large.png.import create mode 100644 BoundingBoxes/CameraBounds.cs create mode 100644 Characters/Boss.cs create mode 100644 Items/Weapons/SwordCollisionShape.tres create mode 100644 UI/HealthBar.cs create mode 100644 default_bus_layout.tres diff --git a/Assets/Sounds/whoosh.wav b/Assets/Sounds/whoosh.wav new file mode 100644 index 0000000000000000000000000000000000000000..7d4d197cb40110c2f33dde2fdf5539a3b3884640 GIT binary patch literal 49120 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 Qr(b8LTca8OzaQ{_02NI;ssI20 literal 0 HcmV?d00001 diff --git a/Assets/Sounds/whoosh.wav.import b/Assets/Sounds/whoosh.wav.import new file mode 100644 index 0000000..f336874 --- /dev/null +++ b/Assets/Sounds/whoosh.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://qvthq6tppp63" +path="res://.godot/imported/whoosh.wav-ed2d61376c9fa3c90f1bcd8d0d47a04b.sample" + +[deps] + +source_file="res://Assets/Sounds/whoosh.wav" +dest_files=["res://.godot/imported/whoosh.wav-ed2d61376c9fa3c90f1bcd8d0d47a04b.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/Assets/Sprites/Characters/doc.ase b/Assets/Sprites/Characters/doc.ase index b47036286cb3a48f8a67269b7bd3e3fbe8af2bf3..98350fca489aee80f3a77d86bacd735a31ba23d6 100644 GIT binary patch delta 719 zcmaE@IA4iLUT`8)9b?MI#_3GKK@1EGtO^VaYz&+X|CxXsFyLZfXQ-GXEHLr^{woI_ z*sD+HU}Nhvc3|xBUt<*`v5arNRLSQLi4$hMj$WS7vGBEP`0)mo4V{b(UMvBQRg)L+ z$WM-Ci4uGPH0#$#CWaKKsd1B^G0WLAFbe+s@6F5euehi)Az^|AGatib^>BH;9&dR& z+ZVsq<j-;((4;o%dn3ST;xS)0|q_~(4B*_(%j;ci&c@5zM%Rq;2_O!fov3Hf3_ z!vwcub7GVd3fVLS6ar=Sc!Jygc{f>2_}OBx%ZkmU!JFTXf#K}}&#wp{VAwNxE~}hA z+y~7WDQ8ZqGKr--Fh5y!y!GPM#GaphY?l@>*J@My>yn||eya%o@GH5$_{YSX&7Mhs>ATy1y zm>CT8Y!LtDX8z_gO)HPKCw_bMNV)qV(}`CM4_ykAjnkQ&of#MySQQu;*cdn&{xbnNV8Fq^&QLKYIxFGB{K?)= z{s$@a_Dnq5G4Xg?=fvZx?YzbgjCPhOl>*WXufDnaPQK4pRsRU6@7G5rh7_m?5kMMb zE;EX`d|-2v6C4_rva$WQ-0AYKIU|KfIQamh#?^M-VDI~1*9QM>!2D#@@ixy;{=)`aTdoKuv*|G~l;3typ4`q+C3qRlXwS*LY;sy?CMX2U zn)!5D#T31eND;G=XDjGTW;Q5gxYY{@ZNY13hWLOC(Zym&kB+;C>Si&q!kx^0u6URUz<1;g|>2{l)J X#lo1XPD6P$HU^s$DV39#3RD3AL5$`5 diff --git a/Assets/Sprites/Characters/doc.png b/Assets/Sprites/Characters/doc.png index 399ae0bbe20b525ca43d21ebc59229b98c97b7af..3c5fb028037948740ac8d4b4f2ead3e2a991f28f 100644 GIT binary patch delta 1220 zcmV;#1Uvh_3D^mcB!8btL_t(|ob8)GXj4HP$G;JwBra`}QfQ+NtrjVQgd)_z!Noy} zIJgORcn(54x!FNQGO0MU(xpR@Iy)2>K}V+|LJ?_A7j1-+1Ui_+Oy?jMFE4lZ?%w;o zyw~P^p)@ad@00Ic-tU*+y+0`=YHKDx#Q@;2_5Z!W0bpx?Cw~={r!duT<4u&vE$x9G z_W+^vm(Jwa_^B)g2mbN+{~%22`RljwrZYJvd%xMJCcK14BIO6gJwPb^r87A;J)G_E zCHgyT0p)tl>WiVCzkVFAuH80B65jFV0siufv?1;RLhX-x1Axu-#jf_b`DJS!wZDEF zuSvgzm+(ZUpMU&vQU&BYs{+JEVt{b2XzsA}uaC`uDgAM8PsY>uytLNU{$xB2XV(fz z>W`Xt6vmq;^P68z=)gQE_?v3V%FjcOMI5lUNv=1OR;b4Xpes8Sih)vsDnDtm-o5=_)oVe?fWNqs}X(KR@|J zTLFsNTwj!ymnI6U;-K;e09E#^@uo95raL*l@~b2b4Ap)|fp_Ng zv8&5eb%wv zYSgiIK95qx?lul;fBiOIQDR^Osa~SwZR~w#cP7pm&8e+Fo?wFVOsnZ$&0nQ6}VD2mffLHk;SF3xw_x`APaU8GheP6u4 zYJb15cpH1)*}aRi*1S6t=g9qiy0yx#yuGjWZNn4wPqKC!-bi*- z+5YX_3cGM)q0O|(FXFz^1X!xn5vMIFH1oX(T9Hn-{gpT8jzf4v&7Us3yO zHmcf+CQP1JrN-NW`V&9L?|5a2CJ0ZIn1B3icq&iS{s8%Rpvo`hdQIA2SpiZezEWi; z_2$wgvI82R4d8Sp$4st3*(5=#`Qu+2<#+)EzJli#wLc2kEIYYu`&#Js9WFOtuSuZl*jw)`kMITOj}OS=MclX%YU7c z=f(6h2T?vM_2A<+dvWcemLK;=xu|$N>BrSy+;~P;ft!tLit+*Fuy}5+Y2uLW8^nu> zPr;P2{IIFcodx+UQ4c+aGz4!X+^Dh3w%S%SL?L<9) iViKeBXL9`N`uqhfjW7J&T_vUf0000I*ABU#2A-05hMv@XcL^SLwND!eDB?R zcfZS>=Dr{%ckg}f`(Ez%%kSM?LJ+8@h4`!i0MNR+-ZnY{aDPxe4SD6sO%2<40|hcm zc%u6~KrsDj;iwUN5P{K=E|2_o!o;4xVH>X&jvB1(opvMO1w0gS59Id%!SttvqefyZ z(&vlz*SZ3z{c9?HFxc}qjN=vUR}GSYcei-}_VNpJhu;GP+aK`;08lDsZ|qN{^U6GI zf5SFjnRWp$;D6CfJNe~44@f%m0z^f0fDkTiu65OIqcUJjf5h8HOoPMK?Hl_yVjAdW zB_ygpY~F1cZ=gW3a*|(|31=ZbYmflpNiSDDt2nUz5nid7?Ina{P6q(!z29tfq^nf7 z{0+-^NrkXI6AyR;;?)$S!mf<)+BQ}x8g{QMc|;_km9)Ij~4kRak5;+ z@^_cVYkw7ZdbtXjhf|PwI0XOzM}Gkd7ZvILsytOW;jyYNS)Qn3!}8~pM?8wWV*0a_ zUxXDPtx_?|EH7o`R>gtk51{+)k$kh>W6@mJbuv{s^@q*#+jzBb)DT@9FI-fZfx+u{ z8+eZ&C3rYX9-UC?%}WErA6-pj@QBCp$V3Qx{(opW$uHal=(hkd%PoKA@|hf?QdfJ7 z1KZ!Qjh7Z37*47eFL^uXXVOb`Rex5Mpe#?enjX~rsa)PLOE$l7?*bEV8>By`u;vew=g0A?KKDi1^ZL2P+c`fo-pxHz<}FW7qx;)m z+J7>he}6CZt-_=A`_C_>%L|0_^VLTno>==;c;k@??*5bAg7IWA(_^aS7rHMq0lFC= zq)MRWrvPS2FISZw)4}#P=<%uw+h3>M2+2MxhRxeKKQopmr@5aq+2_vWhELX zJX&<}Q{nMEVfzCB_&VP`=hkYS-Zox-*?)*>K+aKGmK7j|=l~gnRD)0pM-7=is?RE7 z2s07T5{=i7N!E_6k{L^??PWz*Yi=ILj?CU}gXroH0GP>**4v|_>-LM8-b>+6;Y2{0 zL~ycOFaWw{Wq5RZE4EBxknw2dI8AVFJ>`zcvtrtr122CnwX%0?e1176-nRT7?wYo^Hq2l+?149Aw$W zg?6D97iy^~NljjENDi(pkI%2g_yhc&o=?B$t>5?a{XJWHA)aD7q32M9P6#o|nHy?u z`Y*F`*8lu4{H&@H!K{3*>iV;0snVheVQ(9P?x9uKw|)#Klh<(X{tlWOT+lwC!p_Bd z7~1cE@zfx^%51=1r@TMo^TLC00G>uB;cX%UpKp#}V}%0_*VMq3ZYNBJB_DR=S1)H1 z&}NeFcrA4>WRuxqwY4xEaKp^92Uc2IVY|Z*XPRc=u4fIN`=ju2DFzFRjIhLLg(gcC zRMckJ+SLyO!7yBiZo+ut5MHD&;oJMG7NH-5+%=VMD27(3ggz*PCa8f9C;)rZ@kSbB zba6!#OBC@#4l}fHLI@jF@IV3s;**`=q$Vzopr00qepPyhe` literal 0 HcmV?d00001 diff --git a/Assets/Sprites/Characters/forsen-hand.png.import b/Assets/Sprites/Characters/forsen-hand.png.import new file mode 100644 index 0000000..c7966e6 --- /dev/null +++ b/Assets/Sprites/Characters/forsen-hand.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dpepm54hjuyga" +path="res://.godot/imported/forsen-hand.png-d22d8449d49935bb2be976828e8a6ea2.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/Sprites/Characters/forsen-hand.png" +dest_files=["res://.godot/imported/forsen-hand.png-d22d8449d49935bb2be976828e8a6ea2.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/Assets/Sprites/Characters/forsen2.ase b/Assets/Sprites/Characters/forsen2.ase index d9282b3303140202de5f7e2b9f8764d99b48cbd6..561ec0faf5788d756687af7b15ea33480b31000a 100644 GIT binary patch delta 1808 zcmbuAeM}Q~7{`A{Tdwrwpu8S^!BZF%U9kujK`KQY1%>e%5fp7LQ$pAj6csY1tO}SR zUj0R2a53fr588T#epc(^phq8$Y_8V&mmRMg`ePzMH7(80xJ>Z-CC01<_31P+1n+#b zmE5e(QmH?PlgP9iM4BeZUIsnPQNcX=#aXEGM_n2QEg!=zc8NeT^?UbCvL@pu=f%yw>004ua0~By!FH3;LTeTH3S#UM#x*|CBn#Clg@$u|o^3H=>adjd}ovu1~ zBEec_0~o*oSZt^l>%#^p>}861ktwKC*JI^gvorvB`et7{0L$58ILYC`)pp!ay_u+$ zADZE8!m6-T`_jmLo>3A`+jCVL5lqUB!+P_4jfu6BLkl!QDMt(onFN1M-LXe@>b>7S z8S)=Mh7IxH&kEE)?^rT@+4I z!+D$=K>8~EB4tkJj$vd6!h3gRB^28F!euNs&J|v6m>~p|(vzZRV_XUw+1Q5v7hNu1 zInq+xYpxt=D{eRv#EFlvHweM8Loe(WC_%!k(K)k)?$)tVMqCGUQ@aYB#SOwTF2HQw zdyUrah~9k_^;%9Wu~;Vid{vz7p7$7ST{kNb4JnKf89W@gCv;c2RUWDKva&if zeYu}yfVIn^ve+Xd80`6KG-F}^HB|q({Za0`4j86(vP0hiZmjiJMp1#dK|afe<+r~m z6WrP!cXT!xacYWO_R4ICvP<)_>8wJF!*iv1#sWoP6gIRdyP#g3AvgVNm~)0Ex)&;P zr#9LLHe*8Pm-rYxs>=k)XI54w!cmGD&uC2elpBcbrU;_pUbq;6#bpnJ_{PBw(ci^R zuPBDUVe!bmIqD>HDUA4OVqa3l)(B&^1;55SQnP_ZR0I)JWPy*j`iY?5wdZ7U(u$xB! z7GQw`pJ-GH?cH75W|UnV`d~xNTW&%6gc8k`0{xwVM7E>T9H5)~jalUtVYE}aZqFZy zX(Aslu8HU(@`%Fb+v+`n7;cQHtg{*usgh8zujSqjF#^Ek7#(C#odK++3y=_~a9kvK z=?Rx};lBxT_tq`44^ziY`slw?OZ`ejAwrXQN(j|sqP9{jD+BEUA zhwE#?H=;=&UXOhI(7;Z&j}n2JzWuSUcFCD@skOT7Dt502Te5O~4L=p2Pf)fz86K7KMFOkd60aWEyn|9U_I_)VEf99B$}fG^Op$2YyXM PKaIhyg5eNpqDp{Ty@pvk`@){HL58kPd z@x5aK4#43RZaA_H+R<1Tjgb;mIq!8*ObJopwvJ8wpuG@56NM-@p4|*fFfrtE1#p}r z3w*~<1US$n64F$GuefeRpKNxXKUb>v+`qB9^J-h6TC?Q!Tr3zO9GOLj7Z=0qL~i7Z z3ALFA1AB@qh&Iv3{Nww-5bIUBymcFQXvVx|DzSH3$748mmjbX*G_~hxojE?8Z*d;$ zJT(=dJMi`NFY9k1WDUrYC4ab?HY5&?aY*DaOyjOa(%?^6xJqYeXi=Hp)46qStH-p{ zDs}P?7%8QT%Ec3nF6y(HoczmQ?gd>WyS_Q;J?mO4gjv;tER_Rw7ea628)@H|=<+;=opn zZEr_Gy!`Gyzbb!p8lNSsK&ixcCF+dpfaP+Of@Y#eYT<#YXA>W4e9>8g#BgVz5HZ3o zEDpZT4c2lxvc|C=nZr&4OEc+x^=1lcNw3f=r~gz}QPoa^dP6opIcU^VIy`L{_2`CO z--NSQQi?aw^NYbi)cm$5a#l>r;l#l~mQ=JN=8fwBbvdjfwh_>EPF|P&$R!Ff(eA{- zaV#WH?QU#Q&C8D4Je*pmcW|JZOPF1h(&^R_Yp{Y77ch-^vh>a2HY_}I+}tHTeYEoZ z=Q!tUJG_`K|K1Q#^n%NbyTN`LkFr8m)0K;bAMvH3PwF~TXWj`?-%b)jJ1-wO1eyGD zAyvJ$)m>`QMpPYY{oV{fqUm;Lv>&_bU$EQZC7ux8<6@$*2ms<&dYkZ&JfsHh4S7vi?7NoGe2h6gN74=Y?dOCg0Bv{-WD7|D?T)G&UZ7*? zbLgr_31D4Jjesh_76hfg3?Xb0D3O@IEdZJj&gg?ahZ+EhU18e_XIZhZB=i|NKnWgM zhIZc^SZr(vvx5q^y*=x++?IEue5L+bMS%i3&F_wGOAMhB$f(9LMUYH&l)bL8OQebJ z#M(0oPd4aw>)dLh`K5GXvQS@54b;aS?4@e%*)xln44{qwy=4}vq&r}lDB^O1upRpg DdiNB@ diff --git a/Assets/Sprites/Characters/forsen2.png b/Assets/Sprites/Characters/forsen2.png index f5602e58db8b601d4e8d193cf339dcee01c75e35..15d9adcd58afb8289dfe6ee0908f7267b1b46665 100644 GIT binary patch delta 2253 zcmV;;2r~Em5abbmiBL{Q4GJ0x0000DNk~Le0006&0000O2nGNE020_jg#Z8ut4Tyb zRCt{2oj+*XR}jZfr4Z6WF?Ni=wGAjz%-@E(SKj%JR zsQ&bO_wL@iJN@)i3!ss)9g(mXf676TI%o%u3Ojq-f$jO;p0vgoG(JZe&8_k-^Xu>T zt^5D`uP^BSKjgHPprcUWB-h~5j>8654m3XT>c(j!>A7{;;;uiowIm@2rL|S7c5Zki zG4)vz$pK|%t`JOqcggzNA1i;d*hu<-CGEeDe#nW*Na{@ zTKVpyeGvNG@v+%3k&1m128bl@eU}}|yPkuv23)RGS%x6#0qgh&C#?FfU+o_10flOp zD^PIieo_Z)qk&DW3~e4Dthf=D?Iei z_MUd=?MbJ~l`51g)rRLK)?iYu)nIWx4~z48DA#I{G!1UQl>c=-0ev$zlJPO&j*ql% zoHiu%F}LMf4RTj+)}PN^y$R)7jlIc8g6qIIao0G6b4a9c<~NQ3i((GXzOkYHBU1Z6 zKX%1g+m?R(Ig;-4t*vHT4F1o|6@pXQevlrps6HY!Ao}P#e+M9JVp!lx3sX(+DJ@K~ z9RltFi(Z=LZoo7)W)f(eY%yyWN<wdwbF;98yfU;)6&GSX5g=7ohokaodpAHz_Sl zHRYBgzW{G@?D|l^Wn*zZ-{dn#jiWiBgCfU}DAjM^feu zd>m`&?MXN3&Mw`CamV+-tD75fUr176gV4_4M3s+<3E?yR)fK8 z#>2aCI}!s#T>6MaeCQCw?SCA5U)qMWzH12OLgGq~30=eZwOQ+Xq;oL4bQ=Jm;~_|* z0f&*qe*yi$%0tokJXm=M=SR=N%QyRvZTB*DO2bXNbA`~_d>HeK{?E)6f{n_iNc=Y{ zn{X=I@10-g0E7ouvdG2JWYB-90VV8{s_!pgC{q5%q3_b>h>ui$<7)0wcH%g{$Y3@D z%j?CatF;`11GQmNsXk#nU$aZMoxkRZO1t|rf9fx)BpNUh$AI}@-X z&+>ZFYYk>&d6DXF_~Ss*e?(HB#z-PQ0J8q$-nZ?4AMku(ewWvatTD0an{Zye1%Ub* ze_o`zz2ilP0b7303|(aZaN&xR5A^)HazJZsyWqVXNa<;@-h|Os)SqBe9;`eBfc*x8 zO@@otuXa=AosHD$=0-|FpRQdZKDK{%x4R2=ySt)FI+6BYBK{O^|EDJ=Qylqic@Ge6 zV9V=8C|9cWg3;TPj^aB2G~OSA+MJ&tf2lUY*toP1`3%^ur3md48!K0GasM@HtnAYp~+bHubqQ<3@78av?SNNKyFd z7W~q;0_nle005wW=vx2)_~wUOe*gfG9vBU_|6WPVnz-{D7N2LuyR5dN5SkdX$>2dY zK1H%MF;0D#wn?R0>R6u^H`?5(RyLEXzbC4VR{lrPMQ!@{@&)_PO{40&z?k^zw&Op? zCv2BJ%z33+O8GW;mo@-+UkO5O+(&c|aa`dr?bvMjtih&BwSD%H85^pLfB5Vn)OVdN zuKk%F7!5w^`?TI*D9?&_!MFKJ>q{f)KWYO2{JZs6)9as{yX0kq>L)e7>4DMEE4T;k zzw<>~lgEOS&Ex{E;w+)x$$;WhM16-G7p?r~8YB>^$E|I%C7~^q3#xtR{@a^1xrPVS zH?`@NP_D0G@M~vW57$?1f2fITFoz(nK^B#Y0SIG5A9L&>Yyf5h z_HDj#=}Y7CAHcu)qP|UwHh$kB%l15HekJweKsv__&BgXOY5GS2sWl}vR@qE0kc~LwuQ6HrCkInbe+G%`PvDR>q%m~ bqWb$E1%GTSAA(OF00000NkvXXu0mjf;LVDn delta 2149 zcmV-r2%7ig5&aNx4)5^|J8g7o0YLz+Vm z#Zw7x@EEOFTD&9_K`25l8#Od22&V2qHz5#`i1eT<6kZP)^6c zT3m3(sIRjtHT6>x$pK!As~zX>!M>o;@G!-Q4?JHYD|J?WA*?M1AnJ5!E2em1UM8MS1`_c<6{z z|IO=-Jv~5}+U3eJ#st0g;C%HX-`wp2t`XKt2Mbe&~TDHuyZ&8fa5KPL$9thgH(KW*kP(Ylv~>W-2P8Y6$8p`RDQqc?TMY= zdc%W{|D5^_e-9`CZ*#Fpq6q*pYoN{JD#|ymjj^tS!~ed{t_+=7*+T?Ze9SX9iTH#K zSyFpca_=W)Lvrtzt5x(3U#Y#`H+%)lb4&Rh<_3TkcmBf`VOF`|Af^3 z92++GNxZ-2}E|p)&y`R+HOzQY8O<&rP+qn5Pp<}@O;lMn0 z%avuZ_((NKr!9d7pFMz@@Ad%dJEXi=T}?DT9JPlA2tdaF@sZKYQe{Pa03v^^1?u14;Tlq0T7Uii1Az3zzh3HLgOd?XrV6lolA@6JCEjnCcr2RPk(l68M>d#H1&7+HJvVt&d0iK$|+R9O*;|59ZI zf5-Ce-uVq3Q0U;LBE(&QOdHY#8jxv_q)Yt!VRq{uFJA%h`vwEBy#Y)4Pe|%hjJV@t z+mIR%CHKD6@s-5!OBC`sl%8&Vz8t1Lh9+B>$5$=RD2I(?2kJ`xR* zNMZnb^)`HX^T9ro=Z=r9@7kZf-=H#)fAU{yfG}+Uy#AZM6LIxJpFuGnq@)5wNd~qO z%rQLlb#`T_xzHlGAZ@cjQh+vEvfgV5W1}UDjg~Bn*81jJVESKc^6<|AA*t`W4Z|59 zK-PcP-lx6e107$K-_p}LR^O%d!{ErR`Ro!M!#3UhgDf`88e!KrpB&S(1ca-8f5!ca ztI6H@2LK>aKi|CG$duQYG7Bq983}!J?Go{E{a^0dLrD8C5q}eI|Hns0GaUJ?`wWWR zU?yj8?l_x?gZ&%<=NT9g)*Lx-{hbeP!u|jg=NhE+_d|TB!PD>5u&6n%Z>|NLf6?^e zy%}`(58~my85TX)vm9K^nC)sm7681r_Dv*)ha{2mUpl{pbo`suj~q~3P3G+I1>Bmxib6i;U7%h18!cJf zn!XCaufQeIAWd9nbUtT!(*8^8Q&XXs;Op)0QP2N4x}+aM`?X& zB>g9C0QhJ1?;Y=deCmvs4O2g@`EBj!jl4p++x~~X>1x7M5IRoue*|2`Q$oL)0m7%q z`3@mr)bpRK(G#W~x3q%q0 b;`;j^t2+1VneW+%00000NkvXXu0mjfl`B&; diff --git a/Assets/Sprites/Particles/NPCDamageProcessMaterial.tres b/Assets/Sprites/Particles/NPCDamageProcessMaterial.tres new file mode 100644 index 0000000..7789477 --- /dev/null +++ b/Assets/Sprites/Particles/NPCDamageProcessMaterial.tres @@ -0,0 +1,25 @@ +[gd_resource type="ParticleProcessMaterial" load_steps=3 format=3 uid="uid://bat28samf7ukd"] + +[sub_resource type="Curve" id="Curve_jqr7v"] +_data = [Vector2(0, 0), 0.0, 2.0, 0, 1, Vector2(0.5, 1), 0.0, 0.0, 0, 0, Vector2(1, 0), -2.0, 0.0, 1, 0] +point_count = 3 + +[sub_resource type="CurveTexture" id="CurveTexture_s2csc"] +curve = SubResource("Curve_jqr7v") + +[resource] +emission_shape = 1 +emission_sphere_radius = 8.0 +particle_flag_disable_z = true +direction = Vector3(0, -1, 0) +gravity = Vector3(0, 0, 0) +initial_velocity_min = 64.0 +initial_velocity_max = 128.0 +orbit_velocity_min = 0.0 +orbit_velocity_max = 0.0 +linear_accel_min = -256.0 +linear_accel_max = -128.0 +scale_min = 0.01 +scale_max = 0.02 +scale_curve = SubResource("CurveTexture_s2csc") +attractor_interaction_enabled = false diff --git a/Assets/Sprites/Particles/PlayerDamageProcessMaterial.tres b/Assets/Sprites/Particles/PlayerDamageProcessMaterial.tres new file mode 100644 index 0000000..1436696 --- /dev/null +++ b/Assets/Sprites/Particles/PlayerDamageProcessMaterial.tres @@ -0,0 +1,42 @@ +[gd_resource type="ParticleProcessMaterial" load_steps=7 format=3 uid="uid://x5qcq5muvc3g"] + +[sub_resource type="Gradient" id="Gradient_6k7fi"] +offsets = PackedFloat32Array(0, 0.540741, 0.592593, 1) +colors = PackedColorArray(0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1) + +[sub_resource type="GradientTexture1D" id="GradientTexture1D_1phkb"] +gradient = SubResource("Gradient_6k7fi") + +[sub_resource type="Gradient" id="Gradient_3tax5"] +offsets = PackedFloat32Array(0, 0.533333, 1) +colors = PackedColorArray(1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0) + +[sub_resource type="GradientTexture1D" id="GradientTexture1D_13jjx"] +gradient = SubResource("Gradient_3tax5") + +[sub_resource type="Curve" id="Curve_0565g"] +_data = [Vector2(0, 0.5), 0.0, 5.0, 0, 1, Vector2(0.1, 1), 0.0, 0.0, 0, 0, Vector2(1, 0), -1.11111, 0.0, 1, 0] +point_count = 3 + +[sub_resource type="CurveTexture" id="CurveTexture_k4txv"] +curve = SubResource("Curve_0565g") + +[resource] +emission_shape = 2 +emission_sphere_radius = 32.0 +particle_flag_disable_z = true +direction = Vector3(0, -1, 0) +gravity = Vector3(0, 0, 0) +initial_velocity_min = 128.0 +initial_velocity_max = 256.0 +orbit_velocity_min = 0.0 +orbit_velocity_max = 0.0 +tangential_accel_min = -16.0 +tangential_accel_max = 16.0 +scale_min = 0.25 +scale_max = 0.25 +scale_curve = SubResource("CurveTexture_k4txv") +color_ramp = SubResource("GradientTexture1D_13jjx") +color_initial_ramp = SubResource("GradientTexture1D_1phkb") +turbulence_enabled = true +turbulence_noise_scale = 4.0 diff --git a/Assets/Sprites/Particles/circle-16.png b/Assets/Sprites/Particles/circle-16.png new file mode 100644 index 0000000000000000000000000000000000000000..4d99d1ba1f70eb4098b68838ae059c63c2f907f9 GIT binary patch literal 131 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`UY;(FAr`&KDF>MT{r~@8ezt`& z5VT1cN_~`MNf%fxc~`)#$V6HCkV~JNi1Uf9vTPb<2UjpQE6E;^5K&DH;ypNPW``k1 cbQv4NdVUp==leL^fTl8dy85}Sb4q9e0OX-1(EtDd literal 0 HcmV?d00001 diff --git a/Assets/Sprites/Particles/circle-16.png.import b/Assets/Sprites/Particles/circle-16.png.import new file mode 100644 index 0000000..539b139 --- /dev/null +++ b/Assets/Sprites/Particles/circle-16.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c1a7lvb4uuwfy" +path="res://.godot/imported/circle-16.png-2c9910635b94cf262d735877f73c9d54.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/Sprites/Particles/circle-16.png" +dest_files=["res://.godot/imported/circle-16.png-2c9910635b94cf262d735877f73c9d54.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/Assets/Sprites/Particles/circle-64.png b/Assets/Sprites/Particles/circle-64.png new file mode 100644 index 0000000000000000000000000000000000000000..6318d34cbccbfdb3a8feca682bdedb67ba054e4a GIT binary patch literal 765 zcmV=HaM@O1X#h6dd4Ow@zAY=zrhrX$zG6qxe$&Oq0JyGh zEF3j;kqcXh5lFv@xkj-`0b_I?;Qj0ma|&34v3+Q!RIn%jW3BxO^$1L*fTX?n=ESF7 z$2N0e^tE46sbHdjjC=?F`CCtcydnSx;8I}3{r*zS%qj(JCAB0Gk|qksuJ#@Gau2|j z<(mH$gRKi}Dh05e+K7}Cz>CyIq@)0zrZyraCh44V%`HnT<1P>=Q{Z=MBT`ZT-%}fr zk^*>_+K80=9|@*5AT>p(%}1L;?h5!)1>iKP8R>YO^^_P;PKo8(4w%_g8*q`#k~G|b z+QLX~X)w1il35xYSO3f|jX@qNn5>T$GruOWCNiJfmd9b-Dwx_IFgFr(7tbOZ6qDUq zm1ng_Xwk08h2H|M+}Ij~h5j^t47nh@4rNVb8n?{0*0Q7@!2O{uipVoF``C1`^>cXD zUDs>M;WFo8_4xn;uKL>(l|wUo(^kl

rFLcRHICkEOD&ee4 literal 0 HcmV?d00001 diff --git a/Assets/Sprites/UI/over-under-bar.png.import b/Assets/Sprites/UI/over-under-bar.png.import new file mode 100644 index 0000000..d13d8ef --- /dev/null +++ b/Assets/Sprites/UI/over-under-bar.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b75oak1nd2q6x" +path="res://.godot/imported/over-under-bar.png-2dd8e0831ce7b8d0ab833d2ac7ca543b.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/Sprites/UI/over-under-bar.png" +dest_files=["res://.godot/imported/over-under-bar.png-2dd8e0831ce7b8d0ab833d2ac7ca543b.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/Assets/Sprites/UI/progress-bar.ase b/Assets/Sprites/UI/progress-bar.ase new file mode 100644 index 0000000000000000000000000000000000000000..1cc8c778192d1ddc08827da0c67d0e14aba73ee0 GIT binary patch literal 748 zcmcJNO(+Cm9EabvZ0yOwCS{pKh@JJ7W!n}hiG%~|AUW*jA~YK-d-0VNwaLaslx$pF zXfF=pLP=4QA|Dqa99$ek>v@x}a`jI0G|l{{_xJo}9-@S}3h6{Fhaz-B2sh{VQok?% z<*JkYU!DwKyQ)M;Qa*RJ{Ms{7DTxS?VQ+(uwh34t*nr;6Be-;a29pXcFr!(8Rl^0a zcexU-?6ttd(0T=7cHcQdpkZ2nUM&aM3vlcN%Bm+aAzUT-$fW8@Gk!vFEHuK_4+a*>MofBPc8>180~*uE82|tP literal 0 HcmV?d00001 diff --git a/Assets/Sprites/UI/progress-bar.png b/Assets/Sprites/UI/progress-bar.png new file mode 100644 index 0000000000000000000000000000000000000000..50a789740bd617c74b32e478a403c3ea99f14ed5 GIT binary patch literal 102 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqx}GkMAre!Q6BHOEBqbyy;`Z16 zl%Kt1#RdyyVMXB=3mRG*8yg>pL849I-w1A0L9#_BiVMukJnn{*~YGcYec(xkCbo9Dfo(ML=Fica!3FR;`GP;9EMkq$DwP$ zdpr>o8xhDbtbLwGAK^RR^gRCQ?FFAdeCmC5-|@G=w;y5U_5Y_OAbLmukrTB5p59)@ zp2FxvEdYW95Pv-+fXErWBk0;X?7L3WI&Wrl0m%FGYx{N{Ox-y)R{Jovod zpwJu>>^4BA9}mEMjfam`6V+n#X&4jRalfAcy}zBo0Du3^0E=t0DlL)kH)x4qcMcp9 z3lU^xbAC;p0M!8~YGGIji3o>-s2Bin5di1F0RXZRMS2dNl?YnsvjQ-YqP0le@NHCzN=AT2Wh@bjDNoQZ%i zIq0}G1ZJ^^(AlJLHd;ZY> z;Du+6mI;(aAgJpB$eNd21I-O!VOSc7aS$eu2Y*x!tj-ry>ACvHD}I7R{U%}w$l9;x z`wc35?LB$IA5jTZp)3<~vJ%~jU&{ni8F&`3(5}4VcY5s^3QF^nX1IO;3j8cEmV!n4 zSCxSQ?V5jq?|5P`nCW@`BY*%&d^ z0hA*8OO?PeVY1;HydOYiIDZ*t7r8^f1*{3iZTbPIKr}6;*AFl?7M_KS{Q%;F9S5M5 zAwu>83=J7TBTWX_ZBS)(QAhFxs>isd>TID3tpTLvV00Q2m`VKrBH$WdP@B2u1nnjd zQ$K(r*jM`j?vIO4!DG`@0u_i(9>;!w^Uu@|Fb7!ZG%WWMJ|bKtkr;--`T-_q1_>p` hQm{zh)DN&&{sUNWnZw7i#vlLy002ovPDHLkV1jm)%Uu8f delta 1365 zcmV-b1*-ap28n`5Xb*Kusg6&7brl06a;adgaCemAb|J= zp{}_nI3Vof#J!C36S$JxUbV#O5d<8}R>#7fTM6(3@CtJIrR9<$De-H5mBrnqDbH}` zzq4cI_J{AIA~v>I;Y-!!u(8Fx^%4H37XX0r@5g9taX8?!bAQCQRXjgC&ORScu5+vn zuwK2uwt;)=be!MA`F&FP`5VE~>#bMnEm!L;Z-9*s#SZ@noA~ks9)KehJ8&?6wFNeM zYJ6!=uwK2SuE%%)fO~vN-8ac3oHJ&AY5M`n!X2UPb)p=-aR3pY@Y41p^q%%p0MRT~ zL0ZeCOLBk#!G9Jzn425voW)`X$BF0kIt36hYj`jnx$yzOac*EG#Bb{nz+Y{J*Vh2P z0q{|MTy}pxM|mgSB94XD9f0rQ`M%$l?Ad>Fj(86U=agBW9S`aN^}j=(Y25+1DB=5l z@t!^ye~%;VoPB+n_1ST%1CRz7J>&o*ha6z!kOPbya({qsU^^VxA^NP` zYX4L}4z_{Ss(9X|);B@xb%2JBgSqj|gZy}VF$s+Cm_gA9AM;(+5y<)P&}yzutl->%d!a9jM@Q)z#1M* z<-^(Q9Dn5lEO_JqgMhuOyoMZL+4dv9j6(TANqg( z?3E$q1pB~n&sy-YloKSFX@L8N$T6gjRM!FePRkCU0)RU;F$>>T_bnVTOw6Z&@d_is zNq+>$j|xP$h(ur%0Sq%`yu!D?Bs?7u-J<+9a4#@m$+vtyHOT=wO5^~uG6pg-Izb=+ zPxM3xcY;5VNHakDB5dTSNyF#u1^}GC?fi2hGR(C6dqg_oHRCkPv!9u05S1IOR0I%_ zFs3^VBfy(%4vE7qk$6t|x8mDHG(%Jg6u~2caNIDFt@x!xV3{&7(K>3=Ie**b zZ+fU1<`m{T&E@(5$nd>DS_+QBzo-lhWJV3!F}fFTI; zXY>PPBft;~LPI4Mfrg2h2I>bG8GqCdFmkTi4@7Td>8Kr5DCsDMTRy} zV`E&WAE0jqB7Fn+UbR|eV(SFet-fjt9qT_sln&C6w-cx=pQ@YfK-GSQ9r=Y zi6g+C!8O97PC^%mj&WtxLlLJaL4~k*BQD6*@_tOdEgIDmf2ML_q%!_fmn_eg~YAo}0(xyfCiKeR1Eu ze{+6hjq~R{YefGJO9kKe~U)>oo@c_~Va%Xb!xz$G_@uJ+&MV z+u~n!NT!y+zwU_kkNE60&j0bv>wkN@Jev1!F+P-QL$rE-?--GP_aFS7r@;S*+B{Nx zuf;Owsk+@c7S; zfqxzTtq_6!Y7XIFg#WPqYyQ%nA7DQo=jP@T{#m1UU;G^4)_tBaUfSSa%=};EFU@~p zpV)N$U!&~-{nw~}|4e(ozm4{1Urk{B z`J{$)^9cW}vBbHr``o?WI{&-&_-FUG?&sPy%e!Cv^ZPHU=R(&9tyaK)=l*>T;9sr( z;48iR^}O$y_-p;~&l{fe``GotJ4R~X*zx!7FRjzY^MCh$nbCcwhzd z`9J<;_$zC9((`}(>+nx?{-4_4XNdn~4_Ez#8o^QziaCUT-Y}fq`%HtzaC0WLJ^sP- zf04g5|1IbL_!r}!<@~>N|I|^4zmx+*-5yc*W%u8rzSx6*`+xpFe*ZJO=NtTIYd`$+ z`zv$WSNFL&YeSOrfBe(?EBm>Y1JX6iyI=eZ@b}bnR{ycBuWrPDzy2ZD@h{td^3Fzx QVE>r&fBcii55$Rr=MR6qu>b%7 delta 909 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 SoEGwM6v;dDxdVKX-v1XM5i)K7 literal 0 HcmV?d00001 diff --git a/Assets/Sprites/sword-swing-large.png b/Assets/Sprites/sword-swing-large.png new file mode 100644 index 0000000000000000000000000000000000000000..5a9daf02ed08e9b7f634c1e988ee93cf71052174 GIT binary patch literal 785 zcmV+s1Md8ZP) zK~BUl3`H}D8z98}k2gY`VOXG`s%qLKwH<%^za>Jh?fNyLj3$pl{`vlSzIuM|^W*EG zol8d8|8Y_`qIY1f;6Tk0t^X??KrRZm=BUvAmZ0n{XO03nR8e1c73+Xy6^B>6_ZpgecyDj&I zrsk*r}P|JHRSVpQM;3js>p7q^F_YtK9c ztRx=2PERdoG2w;^g$NRFYp|4fK2ompWKo+3lx&NaQzv-rv8_$E{0qOok==W$16nFtE-o(zbA1Lp+OME1DHD@*K zbEm+{L|7Hjh|u%i8Yu80ysrXhAmn}}0CEl6+$k`*B*Kao6$)$s1z1CbzF*Zqfe8VI z0xtyN@30ogxmS>DsJT;M5}N4SXbMaSFcg>&U??yNPlRoB3kpmKFcjDTkn*m|-C-%wyeoOAX7qQFW- zIEpmFw`#UPu3?)y1y&%!mMuaJrNpVD1qBx7?ok;Yh<^4lQVmz%%bi+a>8Epqr+tJP zDv@ewky_wV{%*3wjb3%Mhg7Vdc*rYP1*wKTJX&P~57%nPI|6O+vm7o5Rge@s-m)*& zY|Pa}khhe+<6Ys3x(g4OUbkzoAd|eMl=5zqPF_|H&)tU=+TdrCx0GZnu=VP@@?`tF zpbdUTc}qzoFy-w>WALTV0^Y_w`Z=n+qj|#>c?T;Aw1!7Jf9;_kU0r%&9f2tCENKee zq9ua$;7HZsA#aIueKUz$NmuX|Q~_G7_%O*GqV<0TX$wCBO@L^y|Kt1ufrS(-_3*)O P00000NkvXXu0mjfMww>I literal 0 HcmV?d00001 diff --git a/Assets/Sprites/sword-swing-large.png.import b/Assets/Sprites/sword-swing-large.png.import new file mode 100644 index 0000000..e400a73 --- /dev/null +++ b/Assets/Sprites/sword-swing-large.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cmvh6pc71ir1m" +path="res://.godot/imported/sword-swing-large.png-d24bea57b216aba22c9a1cccd93085d2.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/Sprites/sword-swing-large.png" +dest_files=["res://.godot/imported/sword-swing-large.png-d24bea57b216aba22c9a1cccd93085d2.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/Assets/Sprites/sword.ase b/Assets/Sprites/sword.ase index 1826a216d3afe1b36e2b711bd740196f1cfc5408..4c3fa58628cf4771951de20fffe402bb9dec0d45 100644 GIT binary patch delta 76 zcmX@Yx|)@7^+d*cM(vG_?-*@t7#J8>6&M&88JHOUGXXhZz{ViNP%$StVZ!9(goFu~ duTEXuF(sLaN#W=T4xxhz2e&aWd^y9R4gl_U7Fz%S delta 101 zcmZ3@dW4nn$VA3^Mwg9^?-)Zv85kH?6@UZ-GsAx-5Dfwx41x?5b5hS9~7sn8enaK$U*q%IDuw~sknOw;t9|wj+LnEi91;z?|%nUE}In>#n Rw=y#Tfv2mV%Q~loCIHvu6ypE@ delta 88 zcmV-e0H^<}0>uK5^ie!XL_t&tnPXtU3sh8~w2rO{gx1jov#>C<5eywPhL$#hp@Ym& u;pOGw;pGLffJ}&OD!e=pTQM0B_W%G5$qY*4i$ZGv0000 _health; set @@ -186,6 +189,13 @@ public partial class Character : CharacterBody2D, IFaction } } + protected virtual float ReceiveDamage( + float damage, + Character inflictor, + float knockback, + Vector2 knockbackDir = default) => damage; + + public virtual void OnReceivedDamage( float damage, Character inflictor, @@ -198,7 +208,7 @@ public partial class Character : CharacterBody2D, IFaction } float oldHealth = Health; - Health -= damage; + Health -= ReceiveDamage(damage, inflictor, knockback, knockbackDir); // create damage text var textScene = GD.Load("res://UI/FloatingText.tscn"); @@ -226,7 +236,7 @@ public partial class Character : CharacterBody2D, IFaction Player plr = inflictor as Player ?? this as Player; if (plr is not null) { - plr.Camera.Shake(1, 0.4f); + //plr.Camera.Shake(1, 0.4f); } if (this.GetNode("HurtSound") is AudioStreamPlayer2D sound) diff --git a/Characters/Doc.cs b/Characters/Doc.cs index ce75296..8292190 100644 --- a/Characters/Doc.cs +++ b/Characters/Doc.cs @@ -3,12 +3,29 @@ using GodotUtilities; namespace SupaLidlGame.Characters; -public partial class Doc : Enemy +public partial class Doc : Boss { - [Export] - public State.NPC.NPCStateMachine BossStateMachine { get; set; } + public AnimationPlayer TelegraphAnimation { get; set; } - public int Intensity + public override float Health + { + get => base.Health; + set + { + if (IsActive) + { + base.Health = value; + } + else + { + // play opening animation + // then become active when it finishes + base.Health = value; + } + } + } + + public override int Intensity { get { @@ -24,17 +41,41 @@ public partial class Doc : Enemy } } + public Doc() + { + ShouldMove = false; + } + public override void _Ready() { + TelegraphAnimation = GetNode("Animations/Telegraph"); base._Ready(); } public override void _Process(double delta) { - BossStateMachine.Process(delta); + if (IsActive) + { + BossStateMachine.Process(delta); + } base._Process(delta); } + protected override float ReceiveDamage( + float damage, + Character inflictor, + float knockback, + Vector2 knockbackDir = default) + { + if (IsActive) + { + return base.ReceiveDamage( + damage, inflictor, knockback, knockbackDir); + } + + return 1; + } + public override void OnReceivedDamage( float damage, Character inflictor, diff --git a/Characters/Doc.tscn b/Characters/Doc.tscn index 7b1df8f..6752851 100644 --- a/Characters/Doc.tscn +++ b/Characters/Doc.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=48 format=3 uid="uid://d2skjvvx6fal0"] +[gd_scene load_steps=47 format=3 uid="uid://d2skjvvx6fal0"] [ext_resource type="Script" path="res://Characters/Doc.cs" id="2_3elet"] [ext_resource type="Shader" path="res://Shaders/Flash.gdshader" id="2_5jxom"] @@ -19,7 +19,9 @@ [ext_resource type="Script" path="res://State/NPC/Doc/DocChooseAttackState.cs" id="12_45x13"] [ext_resource type="Script" path="res://State/NPC/Doc/DocUnwantedFrequencyState.cs" id="12_d51jv"] [ext_resource type="PackedScene" uid="uid://1y5r6sklwgrp" path="res://Entities/UnwantedFrequency.tscn" id="13_lpj21"] +[ext_resource type="Script" path="res://Utils/AnimationManager.cs" id="16_bsvls"] [ext_resource type="Texture2D" uid="uid://bd8l8kafb42dt" path="res://Assets/Sprites/Particles/circle.png" id="16_x277j"] +[ext_resource type="Material" uid="uid://bat28samf7ukd" path="res://Assets/Sprites/Particles/NPCDamageProcessMaterial.tres" id="17_iomdx"] [sub_resource type="ShaderMaterial" id="ShaderMaterial_7n7iy"] resource_local_to_scene = true @@ -121,6 +123,18 @@ tracks/2/keys = { "update": 0, "values": [Vector2(1, 1)] } +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("../Sprite:modulate") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Color(1, 1, 1, 1)] +} [sub_resource type="Animation" id="Animation_7oukw"] resource_name = "enter_in" @@ -149,6 +163,30 @@ tracks/1/keys = { "update": 0, "values": [Color(1, 1, 1, 0), Color(1, 1, 1, 0.5)] } +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("../Sprite:frame") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [0] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("../Effects/UnwantedFrequenciesParticles:emitting") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [false] +} [sub_resource type="Animation" id="Animation_j3s0y"] resource_name = "exit_out" @@ -177,6 +215,30 @@ tracks/1/keys = { "update": 0, "values": [Color(1, 1, 1, 0.5), Color(1, 1, 1, 0)] } +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("../Sprite:frame") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [0] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("../Effects/UnwantedFrequenciesParticles:emitting") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [false] +} [sub_resource type="Animation" id="Animation_8dhub"] resource_name = "shungite_spike" @@ -207,7 +269,6 @@ tracks/1/keys = { [sub_resource type="Animation" id="Animation_qggcf"] resource_name = "unwanted_frequencies" -length = 3.0 tracks/0/type = "value" tracks/0/imported = false tracks/0/enabled = true @@ -215,7 +276,7 @@ tracks/0/path = NodePath("../Effects/UnwantedFrequenciesParticles:emitting") tracks/0/interp = 1 tracks/0/loop_wrap = true tracks/0/keys = { -"times": PackedFloat32Array(0, 3), +"times": PackedFloat32Array(0, 1), "transitions": PackedFloat32Array(1, 1), "update": 1, "values": [true, false] @@ -227,10 +288,10 @@ tracks/1/path = NodePath("../Sprite:frame") tracks/1/interp = 1 tracks/1/loop_wrap = true tracks/1/keys = { -"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8, 2.9), -"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), +"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1, 1), "update": 1, -"values": [8, 9, 10, 11, 12, 13, 14, 8, 9, 10, 11, 12, 13, 14, 8, 9, 10, 11, 12, 13, 14, 9, 10, 11, 12, 13, 14, 8, 9, 10] +"values": [8, 9, 10, 11, 12, 13, 14, 8, 9] } tracks/2/type = "value" tracks/2/imported = false @@ -268,6 +329,18 @@ tracks/0/keys = { "update": 0, "values": [0.0] } +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Effects/HurtParticles:emitting") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [false] +} [sub_resource type="Animation" id="Animation_dxevc"] resource_name = "hurt" @@ -284,6 +357,18 @@ tracks/0/keys = { "update": 0, "values": [0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0] } +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Effects/HurtParticles:emitting") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0, 0.1), +"transitions": PackedFloat32Array(1, 1), +"update": 1, +"values": [true, false] +} [sub_resource type="AnimationLibrary" id="AnimationLibrary_xe5eq"] _data = { @@ -330,32 +415,11 @@ color_initial_ramp = SubResource("GradientTexture1D_5606i") [sub_resource type="CanvasTexture" id="CanvasTexture_hs7xn"] -[sub_resource type="Curve" id="Curve_jqr7v"] -_data = [Vector2(0, 0), 0.0, 2.0, 0, 1, Vector2(0.5, 1), 0.0, 0.0, 0, 0, Vector2(1, 0), -2.0, 0.0, 1, 0] -point_count = 3 - -[sub_resource type="CurveTexture" id="CurveTexture_s2csc"] -curve = SubResource("Curve_jqr7v") - -[sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_wkgo8"] -emission_shape = 1 -emission_sphere_radius = 8.0 -particle_flag_disable_z = true -direction = Vector3(0, -1, 0) -gravity = Vector3(0, 0, 0) -initial_velocity_min = 20.0 -initial_velocity_max = 30.0 -orbit_velocity_min = 0.0 -orbit_velocity_max = 0.0 -scale_min = 0.01 -scale_max = 0.01 -scale_curve = SubResource("CurveTexture_s2csc") - [sub_resource type="RectangleShape2D" id="RectangleShape2D_uict5"] -size = Vector2(16, 8) +size = Vector2(11, 5) [sub_resource type="RectangleShape2D" id="RectangleShape2D_8lxmf"] -size = Vector2(16, 18) +size = Vector2(16, 19) [node name="Doc" type="CharacterBody2D" node_paths=PackedStringArray("BossStateMachine", "Sprite", "Inventory", "StateMachine", "Hurtbox")] y_sort_enabled = true @@ -370,7 +434,6 @@ Sprite = NodePath("Sprite") Inventory = NodePath("Inventory") StateMachine = NodePath("StateMachine") Hurtbox = NodePath("Hurtbox") -Faction = 2 [node name="StateMachine" type="Node" parent="." node_paths=PackedStringArray("InitialState", "Character")] script = ExtResource("3_t5jjc") @@ -439,6 +502,7 @@ TelegraphState = NodePath("../Telegraph") NPC = NodePath("../..") [node name="Animations" type="Node" parent="."] +script = ExtResource("16_bsvls") [node name="Movement" type="AnimationPlayer" parent="Animations"] libraries = { @@ -459,7 +523,6 @@ libraries = { [node name="Effects" type="Node2D" parent="."] [node name="UnwantedFrequenciesParticles" type="GPUParticles2D" parent="Effects"] -position = Vector2(0, 8) emitting = false process_material = SubResource("ParticleProcessMaterial_s1tqp") texture = SubResource("CanvasTexture_hs7xn") @@ -468,33 +531,31 @@ trail_enabled = true trail_sections = 4 [node name="HurtParticles" type="GPUParticles2D" parent="Effects"] +position = Vector2(0, -8) emitting = false -process_material = SubResource("ParticleProcessMaterial_wkgo8") +process_material = ExtResource("17_iomdx") texture = ExtResource("16_x277j") lifetime = 0.4 one_shot = true explosiveness = 1.0 [node name="Sprite" type="Sprite2D" parent="."] -modulate = Color(1, 1, 1, 0.08) +y_sort_enabled = true use_parent_material = true -position = Vector2(0, -4) texture = ExtResource("3_rs44f") -offset = Vector2(0, 4) +offset = Vector2(0, -8) hframes = 16 [node name="CollisionShape2D" type="CollisionShape2D" parent="."] -visible = false -position = Vector2(0, 4) +position = Vector2(-0.5, -1.5) shape = SubResource("RectangleShape2D_uict5") [node name="Hurtbox" parent="." instance=ExtResource("7_tnve0")] -visible = false position = Vector2(0, -4) Faction = 2 [node name="CollisionShape2D" parent="Hurtbox" index="0"] -position = Vector2(0, 4) +position = Vector2(0, -3.5) shape = SubResource("RectangleShape2D_8lxmf") [node name="Inventory" type="Node2D" parent="."] diff --git a/Characters/Player.tscn b/Characters/Player.tscn index 5bef0c9..1012180 100644 --- a/Characters/Player.tscn +++ b/Characters/Player.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=57 format=3 uid="uid://b2254pup8k161"] +[gd_scene load_steps=52 format=3 uid="uid://b2254pup8k161"] [ext_resource type="Script" path="res://Characters/Player.cs" id="1_flygr"] [ext_resource type="Shader" path="res://Shaders/Flash.gdshader" id="2_ngsgt"] @@ -11,7 +11,8 @@ [ext_resource type="Script" path="res://Utils/AnimationManager.cs" id="7_sdgvb"] [ext_resource type="Script" path="res://Items/Inventory.cs" id="7_xyenu"] [ext_resource type="Script" path="res://State/Character/PlayerRollState.cs" id="8_fy0v5"] -[ext_resource type="Texture2D" uid="uid://bd8l8kafb42dt" path="res://Assets/Sprites/Particles/circle.png" id="8_ohe3r"] +[ext_resource type="Material" uid="uid://x5qcq5muvc3g" path="res://Assets/Sprites/Particles/PlayerDamageProcessMaterial.tres" id="8_yf112"] +[ext_resource type="Texture2D" uid="uid://c1a7lvb4uuwfy" path="res://Assets/Sprites/Particles/circle-16.png" id="9_7gumm"] [ext_resource type="PackedScene" uid="uid://cjgxyhgcyvsv7" path="res://BoundingBoxes/Hurtbox.tscn" id="9_avyu4"] [ext_resource type="AudioStream" uid="uid://bkeyg8weaqnuu" path="res://Assets/Sounds/splat-player.ogg" id="12_vvem5"] [ext_resource type="Script" path="res://BoundingBoxes/InteractionRay.cs" id="13_hs3u1"] @@ -28,7 +29,7 @@ length = 0.001 tracks/0/type = "value" tracks/0/imported = false tracks/0/enabled = true -tracks/0/path = NodePath("../Sprites/Character:frame") +tracks/0/path = NodePath("../Sprites/Node2D/Character:frame") tracks/0/interp = 1 tracks/0/loop_wrap = true tracks/0/keys = { @@ -40,7 +41,7 @@ tracks/0/keys = { tracks/1/type = "value" tracks/1/imported = false tracks/1/enabled = true -tracks/1/path = NodePath("../Sprites/Character:rotation") +tracks/1/path = NodePath("../Sprites/Node2D/Character:rotation") tracks/1/interp = 1 tracks/1/loop_wrap = true tracks/1/keys = { @@ -57,7 +58,7 @@ loop_mode = 1 tracks/0/type = "value" tracks/0/imported = false tracks/0/enabled = true -tracks/0/path = NodePath("../Sprites/Character:frame") +tracks/0/path = NodePath("../Sprites/Node2D/Character:frame") tracks/0/interp = 1 tracks/0/loop_wrap = true tracks/0/keys = { @@ -74,7 +75,7 @@ loop_mode = 1 tracks/0/type = "value" tracks/0/imported = false tracks/0/enabled = true -tracks/0/path = NodePath("../Sprites/Character:frame") +tracks/0/path = NodePath("../Sprites/Node2D/Character:frame") tracks/0/interp = 1 tracks/0/loop_wrap = true tracks/0/keys = { @@ -91,7 +92,7 @@ step = 0.05 tracks/0/type = "value" tracks/0/imported = false tracks/0/enabled = true -tracks/0/path = NodePath("../Sprites/Character:rotation") +tracks/0/path = NodePath("../Sprites/Node2D/Character:rotation") tracks/0/interp = 1 tracks/0/loop_wrap = true tracks/0/keys = { @@ -107,7 +108,7 @@ length = 0.2 tracks/0/type = "value" tracks/0/imported = false tracks/0/enabled = true -tracks/0/path = NodePath("../Sprites/Character:frame") +tracks/0/path = NodePath("../Sprites/Node2D/Character:frame") tracks/0/interp = 1 tracks/0/loop_wrap = true tracks/0/keys = { @@ -131,30 +132,30 @@ length = 0.001 tracks/0/type = "value" tracks/0/imported = false tracks/0/enabled = true -tracks/0/path = NodePath("../Sprites/Character:frame") +tracks/0/path = NodePath("../Sprites/Node2D/Character:frame") tracks/0/interp = 1 tracks/0/loop_wrap = true tracks/0/keys = { "times": PackedFloat32Array(0), "transitions": PackedFloat32Array(1), "update": 1, -"values": [12] +"values": [0] } [sub_resource type="Animation" id="Animation_3w3u1"] resource_name = "sword" -length = 0.2 +length = 0.3 tracks/0/type = "value" tracks/0/imported = false tracks/0/enabled = true -tracks/0/path = NodePath("../Sprites/Character:frame") +tracks/0/path = NodePath("../Sprites/Node2D/Character:frame") tracks/0/interp = 1 tracks/0/loop_wrap = true tracks/0/keys = { "times": PackedFloat32Array(0, 0.1, 0.2), "transitions": PackedFloat32Array(1, 1, 1), "update": 1, -"values": [12, 13, 0] +"values": [12, 13, 14] } [sub_resource type="AnimationLibrary" id="AnimationLibrary_73mj7"] @@ -180,7 +181,7 @@ tracks/0/keys = { tracks/1/type = "value" tracks/1/imported = false tracks/1/enabled = true -tracks/1/path = NodePath("Sprites/Character:frame") +tracks/1/path = NodePath("Sprites/Node2D/Character:frame") tracks/1/interp = 1 tracks/1/loop_wrap = true tracks/1/keys = { @@ -221,7 +222,7 @@ tracks/0/keys = { tracks/1/type = "value" tracks/1/imported = false tracks/1/enabled = true -tracks/1/path = NodePath("Sprites/Character:frame") +tracks/1/path = NodePath("Sprites/Node2D/Character:frame") tracks/1/interp = 1 tracks/1/loop_wrap = true tracks/1/keys = { @@ -242,6 +243,20 @@ tracks/2/keys = { "update": 1, "values": [true, false] } +tracks/3/type = "method" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("Effects/HurtParticles") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0.2), +"transitions": PackedFloat32Array(1), +"values": [{ +"args": [], +"method": &"restart" +}] +} [sub_resource type="Animation" id="Animation_pjey7"] resource_name = "hurt_flash" @@ -321,48 +336,21 @@ graph_offset = Vector2(-335.315, -63.5708) [sub_resource type="AnimationNodeStateMachinePlayback" id="AnimationNodeStateMachinePlayback_jln87"] -[sub_resource type="Gradient" id="Gradient_6k7fi"] -offsets = PackedFloat32Array(0, 0.540741, 0.592593, 1) -colors = PackedColorArray(0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1) - -[sub_resource type="GradientTexture1D" id="GradientTexture1D_1phkb"] -gradient = SubResource("Gradient_6k7fi") - -[sub_resource type="Gradient" id="Gradient_3tax5"] -offsets = PackedFloat32Array(0, 0.533333, 1) -colors = PackedColorArray(1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0) - -[sub_resource type="GradientTexture1D" id="GradientTexture1D_13jjx"] -gradient = SubResource("Gradient_3tax5") - -[sub_resource type="Curve" id="Curve_0565g"] -_data = [Vector2(0, 0.5), 0.0, 5.0, 0, 1, Vector2(0.1, 1), 0.0, 0.0, 0, 0, Vector2(1, 0), -1.11111, 0.0, 1, 0] -point_count = 3 - -[sub_resource type="CurveTexture" id="CurveTexture_k4txv"] -curve = SubResource("Curve_0565g") - -[sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_humq0"] -emission_shape = 2 -emission_sphere_radius = 32.0 +[sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_852jj"] particle_flag_disable_z = true -direction = Vector3(0, -1, 0) +spread = 180.0 gravity = Vector3(0, 0, 0) -initial_velocity_min = 128.0 -initial_velocity_max = 256.0 +initial_velocity_min = 8.0 +initial_velocity_max = 16.0 orbit_velocity_min = 0.0 orbit_velocity_max = 0.0 -tangential_accel_min = -8.0 -tangential_accel_max = -4.0 -scale_min = 0.01 -scale_max = 0.01 -scale_curve = SubResource("CurveTexture_k4txv") -color_ramp = SubResource("GradientTexture1D_13jjx") -color_initial_ramp = SubResource("GradientTexture1D_1phkb") -turbulence_enabled = true -turbulence_noise_scale = 4.0 +linear_accel_min = -32.0 +linear_accel_max = -16.0 +scale_min = 0.1 +scale_max = 0.1 [sub_resource type="CanvasTexture" id="CanvasTexture_pited"] +diffuse_texture = ExtResource("9_7gumm") [sub_resource type="RectangleShape2D" id="RectangleShape2D_bfqew"] size = Vector2(12, 8) @@ -377,14 +365,13 @@ size = Vector2(8, 8) y_sort_enabled = true texture_filter = 3 material = SubResource("ShaderMaterial_h78y7") -position = Vector2(0, -8) collision_layer = 6 collision_mask = 17 script = ExtResource("1_flygr") Camera = NodePath("Camera2D") DirectionMarker = NodePath("Direction2D") Speed = 80.0 -Sprite = NodePath("Sprites/Character") +Sprite = NodePath("Sprites/Node2D/Character") Inventory = NodePath("Inventory") StateMachine = NodePath("StateMachine") Hurtbox = NodePath("Hurtbox") @@ -441,21 +428,31 @@ parameters/conditions/roll = false [node name="Effects" type="Node2D" parent="."] -[node name="DeathParticles" type="GPUParticles2D" parent="Effects"] +[node name="RollParticles" type="GPUParticles2D" parent="Effects"] emitting = false amount = 16 -process_material = SubResource("ParticleProcessMaterial_humq0") +process_material = SubResource("ParticleProcessMaterial_852jj") +texture = ExtResource("9_7gumm") +lifetime = 0.8 + +[node name="DeathParticles" type="GPUParticles2D" parent="Effects"] +emitting = false +amount = 32 +process_material = ExtResource("8_yf112") texture = SubResource("CanvasTexture_pited") -one_shot = true +lifetime = 2.0 +preprocess = 0.1 explosiveness = 0.9 [node name="HurtParticles" type="GPUParticles2D" parent="Effects"] emitting = false amount = 32 -process_material = SubResource("ParticleProcessMaterial_humq0") -texture = ExtResource("8_ohe3r") +process_material = ExtResource("8_yf112") +texture = ExtResource("9_7gumm") +lifetime = 1.5 one_shot = true -explosiveness = 1.0 +preprocess = 0.1 +explosiveness = 0.9 [node name="Camera2D" parent="." instance=ExtResource("4_ym125")] limit_left = -256 @@ -465,17 +462,21 @@ limit_bottom = 256 position_smoothing_speed = 8.0 [node name="Sprites" type="Node2D" parent="."] -use_parent_material = true - -[node name="Character" type="Sprite2D" parent="Sprites"] y_sort_enabled = true use_parent_material = true +rotation = 6.28319 + +[node name="Node2D" type="Node2D" parent="Sprites"] + +[node name="Character" type="Sprite2D" parent="Sprites/Node2D"] +use_parent_material = true +position = Vector2(0, -8) texture = ExtResource("4_5vird") offset = Vector2(0, -4) -hframes = 23 +hframes = 24 [node name="CollisionShape2D" type="CollisionShape2D" parent="."] -position = Vector2(0, 4) +position = Vector2(0, -4) shape = SubResource("RectangleShape2D_bfqew") [node name="Debug" type="Control" parent="."] @@ -494,6 +495,7 @@ label_settings = SubResource("LabelSettings_q5h1n") horizontal_alignment = 1 [node name="Inventory" type="Node2D" parent="."] +position = Vector2(0, -4) script = ExtResource("7_xyenu") InventoryMap = { "equip_1": 0, @@ -504,10 +506,12 @@ InventoryMap = { visible = false [node name="Hurtbox" parent="." node_paths=PackedStringArray("InvincibilityTimer") instance=ExtResource("9_avyu4")] +visible = false InvincibilityTimer = NodePath("Timer") Faction = 1 [node name="CollisionShape2D" parent="Hurtbox" index="0"] +visible = false position = Vector2(0, 4) shape = SubResource("RectangleShape2D_cjk6b") @@ -515,22 +519,27 @@ shape = SubResource("RectangleShape2D_cjk6b") one_shot = true [node name="HurtSound" type="AudioStreamPlayer2D" parent="."] +visible = false stream = ExtResource("12_vvem5") max_distance = 64.0 [node name="AudioListener2D" type="AudioListener2D" parent="."] +visible = false current = true [node name="Direction2D" type="Marker2D" parent="."] +visible = false position = Vector2(0, 6) [node name="InteractionRay" type="RayCast2D" parent="Direction2D"] +visible = false target_position = Vector2(16, 0) collision_mask = 64 collide_with_areas = true script = ExtResource("13_hs3u1") [node name="PointLight2D" type="PointLight2D" parent="."] +visible = false blend_mode = 2 shadow_enabled = true shadow_filter = 2 diff --git a/Entities/TorchLamp.tscn b/Entities/TorchLamp.tscn index 5aa4f34..973648d 100644 --- a/Entities/TorchLamp.tscn +++ b/Entities/TorchLamp.tscn @@ -1,7 +1,7 @@ [gd_scene load_steps=16 format=3 uid="uid://ceadk7pam7vab"] [ext_resource type="Texture2D" uid="uid://cyldr0ck3yfrp" path="res://Assets/Sprites/Misc/torch-lamp.png" id="1_dlkl0"] -[ext_resource type="Texture2D" uid="uid://b8ann6yb8qox4" path="res://Assets/Sprites/Particles/light-pixel.png" id="2_yuj6j"] +[ext_resource type="Texture2D" uid="uid://coarr28adgo1u" path="res://Assets/Sprites/Particles/point-light.png" id="2_0xpf8"] [sub_resource type="AtlasTexture" id="AtlasTexture_ikvnd"] atlas = ExtResource("1_dlkl0") @@ -107,9 +107,9 @@ frame_progress = 0.743234 offset = Vector2(0, -12) [node name="PointLight2D" type="PointLight2D" parent="."] -color = Color(1, 0.827451, 0.619608, 1) +color = Color(1, 0.803922, 0.698039, 1) +energy = 1.2 blend_mode = 2 -shadow_enabled = true shadow_filter_smooth = 3.0 -texture = ExtResource("2_yuj6j") -offset = Vector2(0, 2) +texture = ExtResource("2_0xpf8") +texture_scale = 0.25 diff --git a/Entities/UnwantedFrequency.tscn b/Entities/UnwantedFrequency.tscn index 43c12da..0fa78c1 100644 --- a/Entities/UnwantedFrequency.tscn +++ b/Entities/UnwantedFrequency.tscn @@ -1,10 +1,9 @@ -[gd_scene load_steps=20 format=3 uid="uid://1y5r6sklwgrp"] +[gd_scene load_steps=19 format=3 uid="uid://1y5r6sklwgrp"] [ext_resource type="Script" path="res://Entities/UnwantedFrequency.cs" id="1_6sbe0"] [ext_resource type="PackedScene" uid="uid://du5vhccg75nrq" path="res://BoundingBoxes/Hitbox.tscn" id="2_gxtvd"] [ext_resource type="PackedScene" uid="uid://cojxmcin13ihm" path="res://Utils/Trail.tscn" id="3_67uhs"] [ext_resource type="AudioStream" uid="uid://cn2wop7rfxku8" path="res://Assets/Sounds/karabast.mp3" id="4_pbgsi"] -[ext_resource type="Texture2D" uid="uid://d1ukste16yq6v" path="res://Assets/Sprites/Particles/player-light.png" id="5_d8kx8"] [sub_resource type="RectangleShape2D" id="RectangleShape2D_30y8q"] size = Vector2(8, 8) @@ -166,9 +165,4 @@ libraries = { "": SubResource("AnimationLibrary_v8fdt") } -[node name="PointLight2D" type="PointLight2D" parent="."] -energy = 1.2 -blend_mode = 2 -texture = ExtResource("5_d8kx8") - [editable path="Hitbox"] diff --git a/Items/Weapon.cs b/Items/Weapon.cs index 2d6a497..2afa5a3 100644 --- a/Items/Weapon.cs +++ b/Items/Weapon.cs @@ -53,6 +53,9 @@ public abstract partial class Weapon : Item [Export] public float MaxDistanceHint { get; set; } + [Export] + public Sprite2D HandAnchor { get; set; } + public virtual bool IsParryable { get; protected set; } = false; public bool IsParried { get; set; } @@ -70,6 +73,12 @@ public abstract partial class Weapon : Item Visible = true; } Character = character; + + // set the hand textures to the character's + if (HandAnchor is not null && character.HandTexture is not null) + { + HandAnchor.Texture = character.HandTexture; + } } public override void Unequip(Character character) diff --git a/Items/Weapons/Sword.tscn b/Items/Weapons/Sword.tscn index 0262c92..25e73f3 100644 --- a/Items/Weapons/Sword.tscn +++ b/Items/Weapons/Sword.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=35 format=3 uid="uid://dvqap2uhcah63"] +[gd_scene load_steps=36 format=3 uid="uid://dvqap2uhcah63"] [ext_resource type="Script" path="res://Items/Weapons/Sword.cs" id="1_mlo73"] [ext_resource type="Script" path="res://State/Weapon/WeaponStateMachine.cs" id="2_vwirq"] @@ -8,8 +8,9 @@ [ext_resource type="Script" path="res://State/Weapon/SwordAnticipateState.cs" id="4_j3cud"] [ext_resource type="PackedScene" uid="uid://cojxmcin13ihm" path="res://Utils/Trail.tscn" id="4_pt6lq"] [ext_resource type="Script" path="res://State/Weapon/SwordAttackState.cs" id="5_hmisb"] -[ext_resource type="Texture2D" uid="uid://do1bui3bblkk7" path="res://Assets/Sprites/sword-swing.png" id="5_pywek"] [ext_resource type="AudioStream" uid="uid://c4n7ioxpukdwi" path="res://Assets/Sounds/parry.wav" id="6_8nxjm"] +[ext_resource type="Texture2D" uid="uid://cmvh6pc71ir1m" path="res://Assets/Sprites/sword-swing-large.png" id="10_672jv"] +[ext_resource type="AudioStream" uid="uid://qvthq6tppp63" path="res://Assets/Sounds/whoosh.wav" id="10_mfnl7"] [sub_resource type="Environment" id="Environment_72txp"] background_mode = 3 @@ -174,7 +175,7 @@ tracks/1/path = NodePath("SwingSprite:frame") tracks/1/interp = 1 tracks/1/loop_wrap = true tracks/1/keys = { -"times": PackedFloat32Array(0.1, 0.2, 0.4), +"times": PackedFloat32Array(0.1, 0.3, 0.35), "transitions": PackedFloat32Array(1, 1, 1), "update": 1, "values": [1, 2, 0] @@ -214,6 +215,20 @@ tracks/4/keys = { "transitions": PackedFloat32Array(), "values": [] } +tracks/5/type = "method" +tracks/5/imported = false +tracks/5/enabled = true +tracks/5/path = NodePath("SwingSound") +tracks/5/interp = 1 +tracks/5/loop_wrap = true +tracks/5/keys = { +"times": PackedFloat32Array(0.1), +"transitions": PackedFloat32Array(1), +"values": [{ +"args": [0.0], +"method": &"play" +}] +} [sub_resource type="Animation" id="Animation_pclfs"] resource_name = "attack_alternate" @@ -237,10 +252,10 @@ tracks/1/path = NodePath("SwingSprite:frame") tracks/1/interp = 1 tracks/1/loop_wrap = true tracks/1/keys = { -"times": PackedFloat32Array(0.1, 0.2, 0.4), +"times": PackedFloat32Array(0.1, 0.3, 0.35), "transitions": PackedFloat32Array(1, 1, 1), "update": 1, -"values": [1, 3, 0] +"values": [3, 4, 0] } tracks/2/type = "value" tracks/2/imported = false @@ -340,11 +355,10 @@ graph_offset = Vector2(0, -104.073) [sub_resource type="AnimationNodeStateMachinePlayback" id="AnimationNodeStateMachinePlayback_o5g2u"] -[sub_resource type="CapsuleShape2D" id="CapsuleShape2D_ic623"] -radius = 20.0 -height = 48.0 +[sub_resource type="ConvexPolygonShape2D" id="ConvexPolygonShape2D_fcgvv"] +points = PackedVector2Array(0, 0, -21.213, 21.213, -30, 0, -21.213, -21.213, 0, -30, 21.213, -21.213, 30, 0, 21.213, 21.213, 0, 0) -[node name="Sword" type="Node2D" node_paths=PackedStringArray("Hitbox", "AnimationPlayer", "AnimationTree", "ParryParticles", "StateMachine", "Anchor")] +[node name="Sword" type="Node2D" node_paths=PackedStringArray("Hitbox", "AnimationPlayer", "AnimationTree", "ParryParticles", "StateMachine", "Anchor", "HandAnchor")] y_sort_enabled = true texture_filter = 3 script = ExtResource("1_mlo73") @@ -361,6 +375,7 @@ Damage = 20.0 UseTime = 0.55 Knockback = 64.0 ShouldHideIdle = true +HandAnchor = NodePath("Anchor/Node2D/Sprite2D/Hand") [node name="State" type="Node" parent="." node_paths=PackedStringArray("InitialState")] script = ExtResource("2_vwirq") @@ -422,6 +437,10 @@ initial_velocity_min = 8.0 initial_velocity_max = 64.0 color_ramp = SubResource("Gradient_jjxq2") +[node name="Hand" type="Sprite2D" parent="Anchor/Node2D/Sprite2D"] +position = Vector2(-2.52724e-05, 7) +rotation = 1.5708 + [node name="AnimationPlayer" type="AnimationPlayer" parent="."] libraries = { "": SubResource("AnimationLibrary_tao4k") @@ -440,16 +459,17 @@ IsDisabled = true [node name="CollisionShape2D" parent="Hitbox" index="0"] position = Vector2(4, 0) rotation = 1.5708 -shape = SubResource("CapsuleShape2D_ic623") +shape = SubResource("ConvexPolygonShape2D_fcgvv") disabled = true [node name="SwingSprite" type="Sprite2D" parent="."] modulate = Color(2, 2, 2, 1) -texture = ExtResource("5_pywek") +texture = ExtResource("10_672jv") offset = Vector2(8, 0) -hframes = 4 +hframes = 5 [node name="SwingSound" type="AudioStreamPlayer2D" parent="."] +stream = ExtResource("10_mfnl7") max_distance = 256.0 [node name="ParrySound" type="AudioStreamPlayer2D" parent="."] diff --git a/Items/Weapons/SwordCollisionShape.tres b/Items/Weapons/SwordCollisionShape.tres new file mode 100644 index 0000000..5a21280 --- /dev/null +++ b/Items/Weapons/SwordCollisionShape.tres @@ -0,0 +1,4 @@ +[gd_resource type="ConvexPolygonShape2D" format=3 uid="uid://dw4e4r2yxwk1b"] + +[resource] +points = PackedVector2Array(0, 0, -21.213, 21.213, -30, 0, -21.213, -21.213, 0, -30, 21.213, -21.213, 30, 0, 21.213, 21.213, 0, 0) diff --git a/Scenes/Level.tscn b/Scenes/Level.tscn index 910e672..fed8edc 100644 --- a/Scenes/Level.tscn +++ b/Scenes/Level.tscn @@ -1,8 +1,27 @@ -[gd_scene load_steps=3 format=3 uid="uid://1pb3mpmrl7lc"] +[gd_scene load_steps=4 format=3 uid="uid://1pb3mpmrl7lc"] [ext_resource type="Script" path="res://Utils/World.cs" id="1_1k6ew"] [ext_resource type="PackedScene" uid="uid://b2x17su05ou5w" path="res://Scenes/Maps/Arena.tscn" id="2_avsrq"] +[ext_resource type="PackedScene" uid="uid://bxo553hblp6nf" path="res://UI/HealthBar.tscn" id="3_5rhge"] -[node name="World" type="Node2D"] +[node name="World" type="Node2D" node_paths=PackedStringArray("Control")] script = ExtResource("1_1k6ew") StartingArea = ExtResource("2_avsrq") +Control = NodePath("CanvasLayer/UI") + +[node name="CanvasLayer" type="CanvasLayer" parent="."] + +[node name="UI" type="Control" parent="CanvasLayer"] +z_index = 128 +layout_mode = 3 +anchors_preset = 0 +offset_right = 640.0 +offset_bottom = 480.0 + +[node name="HealthBar" parent="CanvasLayer/UI" instance=ExtResource("3_5rhge")] +layout_mode = 1 +anchors_preset = 1 +anchor_left = 1.0 +anchor_bottom = 0.0 +grow_horizontal = 0 +grow_vertical = 1 diff --git a/Scenes/Maps/Arena.tscn b/Scenes/Maps/Arena.tscn index b4530ab..3a2ba13 100644 --- a/Scenes/Maps/Arena.tscn +++ b/Scenes/Maps/Arena.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=14 format=3 uid="uid://b2x17su05ou5w"] +[gd_scene load_steps=15 format=3 uid="uid://b2x17su05ou5w"] [ext_resource type="PackedScene" uid="uid://clwv2owvk6abe" path="res://Scenes/BaseMap.tscn" id="1_ifiic"] [ext_resource type="Texture2D" uid="uid://b0yiy7w8nxmas" path="res://Assets/Sprites/arena-tileset.png" id="2_wnjm0"] @@ -6,18 +6,46 @@ [ext_resource type="Shader" path="res://Shaders/Flash.gdshader" id="5_h8k5p"] [ext_resource type="PackedScene" uid="uid://c1w7t6irnohfx" path="res://Entities/Torch.tscn" id="6_1wwor"] [ext_resource type="PackedScene" uid="uid://ceadk7pam7vab" path="res://Entities/TorchLamp.tscn" id="6_jy3pc"] +[ext_resource type="Texture2D" uid="uid://d1ukste16yq6v" path="res://Assets/Sprites/Particles/player-light.png" id="7_y7j0e"] -[sub_resource type="OccluderPolygon2D" id="OccluderPolygon2D_8jil2"] -polygon = PackedVector2Array(-8, -4, -6, -5, -6, -18, 6, -18, 6, -5, 8, -4, 8, 4, 4, 8, -4, 8, -8, 3.5) +[sub_resource type="CanvasTexture" id="CanvasTexture_3n6aa"] +diffuse_texture = ExtResource("2_wnjm0") [sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_fcd6d"] -texture = ExtResource("2_wnjm0") +texture = SubResource("CanvasTexture_3n6aa") +use_texture_padding = false 0:0/0 = 0 0:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) 0:0/0/physics_layer_0/angular_velocity = 0.0 +1:1/0 = 0 +1:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) +1:1/0/physics_layer_0/angular_velocity = 0.0 +2:1/0 = 0 +2:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) +2:1/0/physics_layer_0/angular_velocity = 0.0 +2:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +2:2/0 = 0 +2:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) +2:2/0/physics_layer_0/angular_velocity = 0.0 +2:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, 0, 8, 0, 8, 8, -8, 8) 1:0/0 = 0 1:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) 1:0/0/physics_layer_0/angular_velocity = 0.0 +0:1/0 = 0 +0:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) +0:1/0/physics_layer_0/angular_velocity = 0.0 +0:2/0 = 0 +0:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) +0:2/0/physics_layer_0/angular_velocity = 0.0 +0:3/0 = 0 +0:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) +0:3/0/physics_layer_0/angular_velocity = 0.0 +1:3/0 = 0 +1:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) +1:3/0/physics_layer_0/angular_velocity = 0.0 +1:2/0 = 0 +1:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) +1:2/0/physics_layer_0/angular_velocity = 0.0 2:0/0 = 0 2:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) 2:0/0/physics_layer_0/angular_velocity = 0.0 @@ -35,94 +63,68 @@ texture = ExtResource("2_wnjm0") 6:0/0 = 0 6:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) 6:0/0/physics_layer_0/angular_velocity = 0.0 -7:0/size_in_atlas = Vector2i(1, 2) -7:0/0 = 0 -7:0/0/texture_origin = Vector2i(0, 8) -7:0/0/occlusion_layer_0/polygon = SubResource("OccluderPolygon2D_8jil2") -7:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:0/0/physics_layer_0/angular_velocity = 0.0 -7:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -4, 8, -4, 8, 3.5, 4.5, 8, -4, 8, -8, 4) -0:1/0 = 0 -0:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -0:1/0/physics_layer_0/angular_velocity = 0.0 -1:1/0 = 0 -1:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -1:1/0/physics_layer_0/angular_velocity = 0.0 -2:1/0 = 0 -2:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:1/0/physics_layer_0/angular_velocity = 0.0 -2:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -3:1/0 = 0 -3:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:1/0/physics_layer_0/angular_velocity = 0.0 -3:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -4:1/0 = 0 -4:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:1/0/physics_layer_0/angular_velocity = 0.0 -4:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -5:1/0 = 0 -5:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:1/0/physics_layer_0/angular_velocity = 0.0 -5:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) 6:1/0 = 0 6:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) 6:1/0/physics_layer_0/angular_velocity = 0.0 6:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -0:2/0 = 0 -0:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -0:2/0/physics_layer_0/angular_velocity = 0.0 -0:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -1:2/0 = 0 -1:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -1:2/0/physics_layer_0/angular_velocity = 0.0 -1:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -2:2/0 = 0 -2:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:2/0/physics_layer_0/angular_velocity = 0.0 +5:1/0 = 0 +5:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) +5:1/0/physics_layer_0/angular_velocity = 0.0 +5:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +4:1/0 = 0 +4:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) +4:1/0/physics_layer_0/angular_velocity = 0.0 +4:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +3:1/0 = 0 +3:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) +3:1/0/physics_layer_0/angular_velocity = 0.0 +3:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) 3:2/0 = 0 3:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) 3:2/0/physics_layer_0/angular_velocity = 0.0 -3:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +3:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 0, -8, 0) +3:3/0 = 0 +3:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) +3:3/0/physics_layer_0/angular_velocity = 0.0 +3:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(0, -8, 8, -8, 8, 8, 0, 8) +2:3/0 = 0 +2:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) +2:3/0/physics_layer_0/angular_velocity = 0.0 +2:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 0, -8, 0, 8, -8, 8) +4:3/0 = 0 +4:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) +4:3/0/physics_layer_0/angular_velocity = 0.0 +4:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(8, -8, 8, 0, 0, 0, 0, -8) 4:2/0 = 0 4:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) 4:2/0/physics_layer_0/angular_velocity = 0.0 +4:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(0, 0, 8, 0, 8, 8, 0, 8) 5:2/0 = 0 5:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) 5:2/0/physics_layer_0/angular_velocity = 0.0 +5:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, 0, 0, 0, 0, 8, -8, 8) +5:3/0 = 0 +5:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) +5:3/0/physics_layer_0/angular_velocity = 0.0 +5:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 0, -8, 0, 0, -8, 0) +6:3/0 = 0 +6:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) +6:3/0/physics_layer_0/angular_velocity = 0.0 6:2/0 = 0 6:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) 6:2/0/physics_layer_0/angular_velocity = 0.0 7:2/0 = 0 7:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) 7:2/0/physics_layer_0/angular_velocity = 0.0 -0:3/0 = 0 -0:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -0:3/0/physics_layer_0/angular_velocity = 0.0 -0:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -1:3/0 = 0 -1:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -1:3/0/physics_layer_0/angular_velocity = 0.0 -1:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -2:3/0 = 0 -2:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:3/0/physics_layer_0/angular_velocity = 0.0 -2:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -3:3/0 = 0 -3:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:3/0/physics_layer_0/angular_velocity = 0.0 -3:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -4:3/0 = 0 -4:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:3/0/physics_layer_0/angular_velocity = 0.0 -5:3/0 = 0 -5:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:3/0/physics_layer_0/angular_velocity = 0.0 -6:3/0 = 0 -6:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -6:3/0/physics_layer_0/angular_velocity = 0.0 7:3/0 = 0 7:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) 7:3/0/physics_layer_0/angular_velocity = 0.0 +7:0/size_in_atlas = Vector2i(1, 2) +7:0/0 = 0 +7:0/0/texture_origin = Vector2i(0, 8) +7:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +7:0/0/physics_layer_0/angular_velocity = 0.0 +7:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -5, 8, -5, 8, 4, 4, 8, -4, 8, -8, 4) [sub_resource type="OccluderPolygon2D" id="OccluderPolygon2D_kbvre"] polygon = PackedVector2Array(-4, 8, -8, 4, -8, -4, -6, -4, -6, -20, 6, -20, 6, -4, 8, -4, 8, 4, 4, 8) @@ -249,7 +251,7 @@ physics_layer_0/collision_layer = 1 sources/2 = SubResource("TileSetAtlasSource_5yxvt") sources/0 = SubResource("TileSetAtlasSource_fcd6d") -[sub_resource type="ShaderMaterial" id="ShaderMaterial_hcbtx"] +[sub_resource type="ShaderMaterial" id="ShaderMaterial_88hwc"] resource_local_to_scene = true shader = ExtResource("5_h8k5p") shader_parameter/color = Quaternion(1, 1, 1, 1) @@ -265,114 +267,94 @@ layer_3/tile_data = PackedInt32Array(-196612, 65536, 1, -131076, 65536, 1, -6554 layer_4/tile_data = PackedInt32Array(-524296, 327680, 0, -589818, 262144, 0, -589817, 262144, 1, -589819, 327680, 0, -589820, 196608, 1, -589821, 327680, 1, -589822, 131072, 1, -589823, 262144, 1, -589824, 327680, 0, -524289, 131072, 1, -524290, 327680, 0, -524291, 327680, 1, -524292, 327680, 1, -524293, 327680, 0, -524294, 131072, 1, -524295, 262144, 1, -589832, 131072, 2, -589831, 131072, 2, -589830, 131072, 2, -589829, 131072, 2, -589828, 131072, 2, -589827, 131072, 2, -589826, 131072, 2, -589825, 131072, 2, -655360, 131072, 2, -655359, 131072, 2, -655358, 131072, 2, -655357, 131072, 2, -655356, 131072, 2, -655355, 131072, 2, -655354, 131072, 2, -655353, 131072, 2, -655352, 327680, 2, -589833, 262144, 2, -524297, 196608, 3, -458761, 196608, 3, -393225, 196608, 3, -327689, 196608, 3, -262153, 196608, 3, -196617, 196608, 3, -131081, 196608, 3, -65545, 196608, 3, -9, 196608, 3, 65527, 196608, 3, 131063, 196608, 3, 196599, 196608, 3, 262135, 196608, 3, 327671, 196608, 3, 393207, 196608, 3, 458743, 196608, 3, 524279, 196608, 3, 262152, 131072, 3, 327688, 131072, 3, 393224, 131072, 3, 458760, 131072, 3, 196616, 131072, 3, 131080, 131072, 3, 65544, 131072, 3, 8, 131072, 3, -65528, 131072, 3, -131064, 131072, 3, -196600, 131072, 3, -262136, 131072, 3, -589816, 131072, 3, -524280, 131072, 3, -458744, 131072, 3, -393208, 131072, 3, -327672, 131072, 3, 589816, 196608, 2, 589817, 196608, 2, 589818, 196608, 2, 589819, 196608, 2, 589820, 196608, 2, 589821, 196608, 2, 589822, 196608, 2, 589823, 196608, 2, 524288, 196608, 2, 524289, 196608, 2, 524290, 196608, 2, 524291, 196608, 2, 524292, 196608, 2, 524293, 196608, 2, 524294, 196608, 2, 524295, 196608, 2, 524296, 327680, 3, 589815, 262144, 3) [node name="CanvasModulate" parent="." index="0"] -color = Color(0.588235, 0.588235, 0.588235, 1) +color = Color(0.682353, 0.643137, 0.866667, 1) [node name="TorchLamp" parent="Entities" index="0" instance=ExtResource("6_jy3pc")] y_sort_enabled = true position = Vector2(-96, -120) -[node name="TorchLamp2" parent="Entities" index="1" instance=ExtResource("6_jy3pc")] -y_sort_enabled = true -position = Vector2(-48, -120) - -[node name="TorchLamp3" parent="Entities" index="2" instance=ExtResource("6_jy3pc")] +[node name="TorchLamp3" parent="Entities" index="1" instance=ExtResource("6_jy3pc")] y_sort_enabled = true position = Vector2(0, -120) -[node name="TorchLamp4" parent="Entities" index="3" instance=ExtResource("6_jy3pc")] -y_sort_enabled = true -position = Vector2(48, -120) - -[node name="TorchLamp5" parent="Entities" index="4" instance=ExtResource("6_jy3pc")] +[node name="TorchLamp5" parent="Entities" index="2" instance=ExtResource("6_jy3pc")] y_sort_enabled = true position = Vector2(96, -120) -[node name="TorchLamp6" parent="Entities" index="5" instance=ExtResource("6_jy3pc")] +[node name="TorchLamp6" parent="Entities" index="3" instance=ExtResource("6_jy3pc")] y_sort_enabled = true position = Vector2(-120, -96) -[node name="TorchLamp7" parent="Entities" index="6" instance=ExtResource("6_jy3pc")] +[node name="TorchLamp7" parent="Entities" index="4" instance=ExtResource("6_jy3pc")] y_sort_enabled = true position = Vector2(120, -96) -[node name="TorchLamp8" parent="Entities" index="7" instance=ExtResource("6_jy3pc")] -y_sort_enabled = true -position = Vector2(120, -49) - -[node name="TorchLamp9" parent="Entities" index="8" instance=ExtResource("6_jy3pc")] +[node name="TorchLamp9" parent="Entities" index="5" instance=ExtResource("6_jy3pc")] y_sort_enabled = true position = Vector2(120, -1) -[node name="TorchLamp10" parent="Entities" index="9" instance=ExtResource("6_jy3pc")] -y_sort_enabled = true -position = Vector2(120, 47) - -[node name="TorchLamp11" parent="Entities" index="10" instance=ExtResource("6_jy3pc")] +[node name="TorchLamp11" parent="Entities" index="6" instance=ExtResource("6_jy3pc")] y_sort_enabled = true position = Vector2(120, 95) -[node name="TorchLamp12" parent="Entities" index="11" instance=ExtResource("6_jy3pc")] +[node name="TorchLamp12" parent="Entities" index="7" instance=ExtResource("6_jy3pc")] y_sort_enabled = true position = Vector2(97, 120) -[node name="TorchLamp13" parent="Entities" index="12" instance=ExtResource("6_jy3pc")] -y_sort_enabled = true -position = Vector2(47, 120) - -[node name="TorchLamp14" parent="Entities" index="13" instance=ExtResource("6_jy3pc")] +[node name="TorchLamp14" parent="Entities" index="8" instance=ExtResource("6_jy3pc")] y_sort_enabled = true position = Vector2(0, 120) -[node name="TorchLamp15" parent="Entities" index="14" instance=ExtResource("6_jy3pc")] -y_sort_enabled = true -position = Vector2(-48, 120) - -[node name="TorchLamp16" parent="Entities" index="15" instance=ExtResource("6_jy3pc")] +[node name="TorchLamp16" parent="Entities" index="9" instance=ExtResource("6_jy3pc")] y_sort_enabled = true position = Vector2(-96, 120) -[node name="TorchLamp17" parent="Entities" index="16" instance=ExtResource("6_jy3pc")] +[node name="TorchLamp17" parent="Entities" index="10" instance=ExtResource("6_jy3pc")] y_sort_enabled = true position = Vector2(-120, 95) -[node name="TorchLamp18" parent="Entities" index="17" instance=ExtResource("6_jy3pc")] -y_sort_enabled = true -position = Vector2(-120, 47) - -[node name="TorchLamp19" parent="Entities" index="18" instance=ExtResource("6_jy3pc")] +[node name="TorchLamp19" parent="Entities" index="11" instance=ExtResource("6_jy3pc")] y_sort_enabled = true position = Vector2(-120, -1) -[node name="TorchLamp20" parent="Entities" index="19" instance=ExtResource("6_jy3pc")] -y_sort_enabled = true -position = Vector2(-120, -49) - -[node name="Torch" parent="Entities" index="20" instance=ExtResource("6_1wwor")] +[node name="Torch" parent="Entities" index="12" instance=ExtResource("6_1wwor")] visible = false position = Vector2(-120, -112) -[node name="Torch2" parent="Entities" index="21" instance=ExtResource("6_1wwor")] +[node name="Torch2" parent="Entities" index="13" instance=ExtResource("6_1wwor")] visible = false position = Vector2(-72, -112) -[node name="Torch3" parent="Entities" index="22" instance=ExtResource("6_1wwor")] +[node name="Torch3" parent="Entities" index="14" instance=ExtResource("6_1wwor")] visible = false position = Vector2(-24, -113) -[node name="Torch4" parent="Entities" index="23" instance=ExtResource("6_1wwor")] +[node name="Torch4" parent="Entities" index="15" instance=ExtResource("6_1wwor")] visible = false position = Vector2(24, -112) -[node name="Torch5" parent="Entities" index="24" instance=ExtResource("6_1wwor")] +[node name="Torch5" parent="Entities" index="16" instance=ExtResource("6_1wwor")] visible = false position = Vector2(72, -112) -[node name="Torch6" parent="Entities" index="25" instance=ExtResource("6_1wwor")] +[node name="Torch6" parent="Entities" index="17" instance=ExtResource("6_1wwor")] visible = false position = Vector2(120, -112) -[node name="Doc" parent="Entities" index="26" instance=ExtResource("4_ej0f3")] -material = SubResource("ShaderMaterial_hcbtx") +[node name="Doc" parent="Entities" index="18" instance=ExtResource("4_ej0f3")] +material = SubResource("ShaderMaterial_88hwc") + +[node name="PointLight2D" type="PointLight2D" parent="Entities" index="19"] +position = Vector2(168, -42) +energy = 1.5 +blend_mode = 2 +range_item_cull_mask = 0 +shadow_enabled = true +shadow_color = Color(0.572549, 0.572549, 0.572549, 0) +texture = ExtResource("7_y7j0e") +height = 16.0 + +[node name="CanvasGroup" type="CanvasGroup" parent="Entities" index="20"] [node name="Areas" parent="." index="2"] visible = false diff --git a/State/Character/NPCIdleState.cs b/State/Character/NPCIdleState.cs index 597bf5f..910b978 100644 --- a/State/Character/NPCIdleState.cs +++ b/State/Character/NPCIdleState.cs @@ -10,7 +10,7 @@ public partial class NPCIdleState : NPCState public override CharacterState Process(double delta) { base.Process(delta); - if (Character.Direction.LengthSquared() > 0) + if (Character.Direction.LengthSquared() > 0.01f) { return MoveState; } diff --git a/State/Character/PlayerIdleState.cs b/State/Character/PlayerIdleState.cs index 9810b43..e6eff0e 100644 --- a/State/Character/PlayerIdleState.cs +++ b/State/Character/PlayerIdleState.cs @@ -21,8 +21,16 @@ public partial class PlayerIdleState : PlayerState } } - var velocity = _player.Velocity.LengthSquared(); - if (previousState is PlayerMoveState && velocity > 16) + // must be moving at least 4 u/s for more than 0.5 seconds + bool shouldPlayStopAnim = false; + + if (previousState is PlayerMoveState move) + { + shouldPlayStopAnim = move.MoveDuration > 0.5; + // NOTE: more conditions may be added soon + } + + if (shouldPlayStopAnim) { _player.MovementAnimation.Play("stop"); _player.MovementAnimation.Queue("idle"); diff --git a/State/Character/PlayerMoveState.cs b/State/Character/PlayerMoveState.cs index 9800d66..64d3732 100644 --- a/State/Character/PlayerMoveState.cs +++ b/State/Character/PlayerMoveState.cs @@ -7,15 +7,19 @@ public partial class PlayerMoveState : PlayerState [Export] public PlayerRollState RollState { get; set; } + public double MoveDuration { get; private set; } + public override IState Enter(IState previousState) { _player.MovementAnimation.Play("move"); + MoveDuration = 0; return base.Enter(previousState); } public override CharacterState Process(double delta) { base.Process(delta); + MoveDuration += delta; if (Character.Direction.LengthSquared() == 0) { return IdleState; diff --git a/State/Character/PlayerRollState.cs b/State/Character/PlayerRollState.cs index 7c4cac4..dde6ce3 100644 --- a/State/Character/PlayerRollState.cs +++ b/State/Character/PlayerRollState.cs @@ -8,9 +8,12 @@ public partial class PlayerRollState : PlayerState private Vector2 _rollDirection = Vector2.Zero; + private GpuParticles2D _particles; + public override void _Ready() { base._Ready(); + _particles = _player.GetNode("Effects/RollParticles"); } public override IState Enter(IState previousState) @@ -28,6 +31,7 @@ public partial class PlayerRollState : PlayerState _player.MovementAnimation.PlayBackwards("roll"); } _player.MovementAnimation.Queue("idle"); + _particles.Emitting = true; return base.Enter(previousState); } @@ -37,6 +41,7 @@ public partial class PlayerRollState : PlayerState // this state (e.g. from death) _timeLeftToRoll = 0; _rollDirection = Character.Direction; + _particles.Emitting = false; base.Exit(nextState); } diff --git a/State/NPC/Doc/DocChooseAttackState.cs b/State/NPC/Doc/DocChooseAttackState.cs index 0a31395..39cadee 100644 --- a/State/NPC/Doc/DocChooseAttackState.cs +++ b/State/NPC/Doc/DocChooseAttackState.cs @@ -45,12 +45,13 @@ public partial class DocChooseAttackState : NPCState } else { - _consecutiveAttacks = 0; + _consecutiveAttacks = 1; } if (_consecutiveAttacks > Doc.Intensity) { - _consecutiveAttacks = 0; + _consecutiveAttacks = 1; + ResetStates(); return ExitState; } diff --git a/State/NPC/Doc/DocShungiteDartState.cs b/State/NPC/Doc/DocShungiteDartState.cs index 23d90d5..a92973d 100644 --- a/State/NPC/Doc/DocShungiteDartState.cs +++ b/State/NPC/Doc/DocShungiteDartState.cs @@ -38,7 +38,6 @@ public partial class DocShungiteDartState : DocAttackState public override void Exit(IState nextState) { - } protected virtual Projectile SpawnProjectile( diff --git a/State/NPC/Doc/DocShungiteSpikeState.cs b/State/NPC/Doc/DocShungiteSpikeState.cs index 01f5ec0..af34fa6 100644 --- a/State/NPC/Doc/DocShungiteSpikeState.cs +++ b/State/NPC/Doc/DocShungiteSpikeState.cs @@ -11,8 +11,7 @@ public partial class DocShungiteSpikeState : DocShungiteDartState { if (this is not DocUnwantedFrequencyState) { - GetNode("../../Animations/Telegraph") - .Play("shungite_spike"); + Doc.TelegraphAnimation.Play("shungite_spike"); } _currentAttacks = 0; _currentAttackDuration = 1; @@ -22,7 +21,8 @@ public partial class DocShungiteSpikeState : DocShungiteDartState public override void Exit(IState nextState) { - GetNode("../../Animations/Telegraph").Stop(); + //Doc.TelegraphAnimation.Stop(); + //Doc.TelegraphAnimation.Stop(); NPC.ShouldMove = true; } @@ -30,8 +30,7 @@ public partial class DocShungiteSpikeState : DocShungiteDartState Vector2 position, Vector2 direction) { - GetNode("../../Animations/Telegraph") - .Play("shungite_spike"); + Doc.TelegraphAnimation.Play("shungite_spike"); var projectile = base.SpawnProjectile(position, direction) as ShungiteSpike; projectile.GlobalRotation = 0; @@ -46,6 +45,7 @@ public partial class DocShungiteSpikeState : DocShungiteDartState protected override void Attack() { + GD.Print("shungite spike"); var player = _world.CurrentPlayer; var playerPos = player.GlobalPosition; var docPos = NPC.GlobalPosition; diff --git a/State/NPC/Doc/DocTelegraphState.cs b/State/NPC/Doc/DocTelegraphState.cs index 33649af..37d157c 100644 --- a/State/NPC/Doc/DocTelegraphState.cs +++ b/State/NPC/Doc/DocTelegraphState.cs @@ -19,8 +19,8 @@ public partial class DocTelegraphState : NPCState { _currentDuration = Duration; TelegraphAnimationPlayer.Play("enter_in"); - float randX = GD.RandRange(-128, 128); - float randY = GD.RandRange(-128, 128); + float randX = GD.RandRange(-112, 112); + float randY = GD.RandRange(-112, 112); NPC.GlobalPosition = new Vector2(randX, randY); return null; } diff --git a/State/NPC/Doc/DocUnwantedFrequencyState.cs b/State/NPC/Doc/DocUnwantedFrequencyState.cs index b74ced0..f65d405 100644 --- a/State/NPC/Doc/DocUnwantedFrequencyState.cs +++ b/State/NPC/Doc/DocUnwantedFrequencyState.cs @@ -7,18 +7,16 @@ public partial class DocUnwantedFrequencyState : DocShungiteSpikeState { public override NPCState Enter(IState previous) { - GetNode("../../Animations/Telegraph") - .Play("unwanted_frequencies"); - NPC.ShouldMove = false; + Doc.TelegraphAnimation.Play("unwanted_frequencies"); return base.Enter(previous); } public override void Exit(IState nextState) { - GetNode("../../Animations/Telegraph").Stop(); GetNode("../../Effects/UnwantedFrequenciesParticles") .Emitting = false; - NPC.ShouldMove = true; + GD.Print("Exit unwanted frequency"); + base.Exit(nextState); } protected override Projectile SpawnProjectile( @@ -35,6 +33,8 @@ public partial class DocUnwantedFrequencyState : DocShungiteSpikeState protected override void Attack() { + Doc.TelegraphAnimation.Play("unwanted_frequencies"); + GD.Print("unwanted frequency"); var player = _world.CurrentPlayer; var playerPos = player.GlobalPosition; var docPos = NPC.GlobalPosition; diff --git a/UI/HealthBar.cs b/UI/HealthBar.cs new file mode 100644 index 0000000..896e59a --- /dev/null +++ b/UI/HealthBar.cs @@ -0,0 +1,13 @@ +using Godot; + +namespace SupaLidlGame.UI; + +public partial class HealthBar : Control +{ + public TextureProgressBar ProgressBar { get; set; } + + public override void _Ready() + { + ProgressBar = GetNode("TextureProgressBar"); + } +} diff --git a/UI/HealthBar.tscn b/UI/HealthBar.tscn index deac9df..5ff1820 100644 --- a/UI/HealthBar.tscn +++ b/UI/HealthBar.tscn @@ -1,6 +1,8 @@ -[gd_scene load_steps=2 format=3 uid="uid://bxo553hblp6nf"] +[gd_scene load_steps=4 format=3 uid="uid://bxo553hblp6nf"] -[ext_resource type="FontFile" uid="uid://cgwa8bjiyv534" path="res://Assets/Fonts/alagard.ttf" id="1_700b8"] +[ext_resource type="Script" path="res://UI/HealthBar.cs" id="1_54tsn"] +[ext_resource type="Texture2D" uid="uid://b75oak1nd2q6x" path="res://Assets/Sprites/UI/over-under-bar.png" id="1_hlbrd"] +[ext_resource type="Texture2D" uid="uid://co7xm7i5f6n51" path="res://Assets/Sprites/UI/progress-bar.png" id="2_62osq"] [node name="HealthBar" type="Control"] layout_mode = 3 @@ -9,10 +11,18 @@ anchor_right = 1.0 anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 +script = ExtResource("1_54tsn") -[node name="ProgressBar" type="ProgressBar" parent="."] +[node name="TextureProgressBar" type="TextureProgressBar" parent="."] +texture_filter = 1 +layout_mode = 0 offset_right = 128.0 -offset_bottom = 32.0 -theme_override_fonts/font = ExtResource("1_700b8") -step = 1.0 -value = 84.0 +offset_bottom = 8.0 +value = 50.0 +nine_patch_stretch = true +stretch_margin_left = 3 +stretch_margin_top = 3 +stretch_margin_right = 3 +stretch_margin_bottom = 3 +texture_under = ExtResource("1_hlbrd") +texture_progress = ExtResource("2_62osq") diff --git a/Utils/AnimationManager.cs b/Utils/AnimationManager.cs index 70d8421..4608aa3 100644 --- a/Utils/AnimationManager.cs +++ b/Utils/AnimationManager.cs @@ -53,7 +53,7 @@ public partial class AnimationManager : Node p1.AnimationChanged += (StringName oldName, StringName newName) => { var anim = p1.GetAnimation(oldName); - GD.Print(oldName + "resolve"); + //GD.Print(oldName + "resolve"); ResolveConflicts(anim); RemoveAllHolds(anim); }; @@ -108,7 +108,7 @@ public partial class AnimationManager : Node hold.TrackIndex = p1Track; anim1.TrackSetEnabled(p1Track, false); } - GD.Print($"{hold.PriorityAnim.ResourceName} > {hold.HoldAnim.ResourceName}"); + //GD.Print($"{hold.PriorityAnim.ResourceName} > {hold.HoldAnim.ResourceName}"); _holds.Add(hold); break; } @@ -129,7 +129,7 @@ public partial class AnimationManager : Node // be enabled if (hold.PriorityAnim == anim) { - GD.Print($"{anim.ResourceName} was holding ${hold.HoldAnim.ResourceName}"); + //GD.Print($"{anim.ResourceName} was holding ${hold.HoldAnim.ResourceName}"); _holds.RemoveAt(i); i--; @@ -137,13 +137,13 @@ public partial class AnimationManager : Node // enable the track if (_holds.FindIndex(h => h.HoldAnim == hold.HoldAnim && h.TrackIndex == hold.TrackIndex) < 0) { - GD.Print($"{hold.HoldAnim.ResourceName} is now free"); + //GD.Print($"{hold.HoldAnim.ResourceName} is now free"); hold.HoldAnim.TrackSetEnabled(hold.TrackIndex, true); } } } - GD.Print("There are currently " + _holds.Count + " holds"); + //GD.Print("There are currently " + _holds.Count + " holds"); } private void RemoveAllHolds(Animation anim) diff --git a/Utils/PlayerCamera.tscn b/Utils/PlayerCamera.tscn index d468774..b461607 100644 --- a/Utils/PlayerCamera.tscn +++ b/Utils/PlayerCamera.tscn @@ -3,8 +3,7 @@ [ext_resource type="Script" path="res://Utils/PlayerCamera.cs" id="1_jabhk"] [node name="Camera2D" type="Camera2D"] -current = true -zoom = Vector2(4, 4) +zoom = Vector2(2, 2) script = ExtResource("1_jabhk") [node name="AnimationPlayer" type="AnimationPlayer" parent="."] diff --git a/Utils/World.cs b/Utils/World.cs index 7278e8c..981209e 100644 --- a/Utils/World.cs +++ b/Utils/World.cs @@ -17,6 +17,9 @@ public partial class World : Node2D [Export] public Player CurrentPlayer { get; set; } + [Export] + public Control Control { get; set; } + private Dictionary _maps; private string _currentConnector; @@ -56,6 +59,13 @@ public partial class World : Node2D }; }; + CurrentPlayer.Hurt += (Events.HealthChangedArgs args) => + { + var bar = Control.GetNode("HealthBar"); + GD.Print("Set health bar"); + bar.ProgressBar.Value = args.NewHealth; + }; + base._Ready(); } diff --git a/default_bus_layout.tres b/default_bus_layout.tres new file mode 100644 index 0000000..b710e55 --- /dev/null +++ b/default_bus_layout.tres @@ -0,0 +1,3 @@ +[gd_resource type="AudioBusLayout" format=3 uid="uid://ljp6denwxmye"] + +[resource] diff --git a/project-todo.org b/project-todo.org index 7241270..c5fb291 100644 --- a/project-todo.org +++ b/project-todo.org @@ -1,11 +1,28 @@ #+TITLE: SupaLidlGame To-do List -* List of what to add - -** STARTED Campfires +* STARTED Campfires DEADLINE: <2022-12-03 Sat> -** TODO Enemy Spawning +* TODO Enemy Spawning -** TODO Handle Character Death +* DONE Handle Character Death DEADLINE: <2022-12-04 Sun> + +* Doc Boss + +** DONE Reset possible attacks after each cycle +CLOSED: [2023-07-21 Fri] + +** DONE Attack animations +CLOSED: [2023-07-20 Thu] + +** TODO Boss Music + +* TODO Boss cards + +* TODO Dialog + +* TODO Short arena entrance + +* TODO Video demonstration + diff --git a/project.godot b/project.godot index e50529c..7f6eba5 100644 --- a/project.godot +++ b/project.godot @@ -15,6 +15,13 @@ run/main_scene="res://Scenes/Level.tscn" config/features=PackedStringArray("4.1", "C#", "Forward Plus") config/icon="res://icon.svg" +[display] + +window/size/viewport_width=640 +window/size/viewport_height=480 +window/stretch/mode="viewport" +window/stretch/aspect="expand" + [dotnet] project/assembly_name="SupaLidlGame" diff --git a/todo.org b/todo.org index 10322cc..d0928cf 100644 --- a/todo.org +++ b/todo.org @@ -1,15 +1,2 @@ #+title: TODO LIST -* Doc Boss - -** TODO Reset possible attacks after each cycle - -** TODO Attack animations - -* TODO Boss cards - -* TODO Dialog - -* TODO Short arena entrance - -* TODO Video demonstration