From 3effe5f10609605499bcf4424cbedfba6656178c Mon Sep 17 00:00:00 2001 From: Kellan KOZUME Date: Tue, 14 Jul 2026 21:30:17 -0400 Subject: [PATCH] feat(combat): add HealthComponent, HitBox/HurtBox, Creeper enemy, and looming Entity --- assets/images/sprites/Enemies/Entity/Agis.png | Bin 0 -> 66441 bytes .../sprites/Enemies/Entity/Agis.png.import | 40 ++ scenes/actors/Creeper.tscn | 476 ++++++++++++++++++ scenes/actors/creeper.gd | 175 +++++++ scenes/actors/creeper.gd.uid | 1 + scenes/actors/entity.tscn | 123 +++++ scenes/components/health_component.gd | 28 ++ scenes/components/health_component.gd.uid | 1 + scenes/components/hit_box.gd | 4 + scenes/components/hit_box.gd.uid | 1 + scenes/components/hurt_box.gd | 11 + scenes/components/hurt_box.gd.uid | 1 + scenes/components/hurt_box.tscn | 12 + 13 files changed, 873 insertions(+) create mode 100644 assets/images/sprites/Enemies/Entity/Agis.png create mode 100644 assets/images/sprites/Enemies/Entity/Agis.png.import create mode 100644 scenes/actors/Creeper.tscn create mode 100644 scenes/actors/creeper.gd create mode 100644 scenes/actors/creeper.gd.uid create mode 100644 scenes/actors/entity.tscn create mode 100644 scenes/components/health_component.gd create mode 100644 scenes/components/health_component.gd.uid create mode 100644 scenes/components/hit_box.gd create mode 100644 scenes/components/hit_box.gd.uid create mode 100644 scenes/components/hurt_box.gd create mode 100644 scenes/components/hurt_box.gd.uid create mode 100644 scenes/components/hurt_box.tscn diff --git a/assets/images/sprites/Enemies/Entity/Agis.png b/assets/images/sprites/Enemies/Entity/Agis.png new file mode 100644 index 0000000000000000000000000000000000000000..c63608d9101ab1eea729df5ae45aa3d26c270464 GIT binary patch literal 66441 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

&UHIN*hv$Ia5=)fgC$05bx5(=8?0uDC zQk3{C+33TbK+GT^v6QajY!%Iz*s(iaF;7^-y&#nEL;7`);>e?s5S}GM&bp==b&ov< z^WI*5&Uu!U^PQPz@Av@ToRX^P!v5#!Z>N-m@@(=8_rp^Ls(gF``<}|~48W(r>kdar zVE)ipl*b=CH}hVR=9hgvU-obaSA(Bs>K&B#bZ`zcgomt2U-4(1R=#les3d%5)pK>x zj=i;XcSlrvjfNXq|8&U(UG^F?N)mefRBcO%U)NEa&xf1yW%Xf~&oS|)zy7q=b}5>&;TCXFn%{B< z?M&g*jT6*5VsqljL$F<5;ej}jbbEiEmC}IsEN0C?-Dr%8yETk{=bHd)AN$W5)}JxT zo`ooz^ghSSZ}$R94~g;=inpZ{3!6jCq*vGky(AHAG4Gc!7PP~OhU+O{%jKr!IJa4w zg(rS7?G-xsHIqFZ1YO(UH?_c3QEEP(b9e=uC2>tpm>3?`a_4P20n45Es|>@QvYHj7 z78R(KZD619X2b%VjW&+fGO^jo)*b1euTVvet_?*HO)U_)a#ZPR(iN`TD@Bx?Am!V& z4kMe|(B3WT&y!7$y4K5tO&x_Elx^TRCI(a6(IXQMjXrXNJ?KXkx`rD??0E>SQkvlA za8wJ`C6kh46Q>3e3!$=hsC=jB23zzp`E3DYbasBQyS((By5JD?N}PAOLLIFq?gH&; z?}m+R9T{imqqTG)Ms8wIod0AfrO=3(xSd$pVJd^V$)(7gi&5|hH1bgAujMXc*yE|N z&%YCJ{PiuQ?wuo>O9Vv*fVU*^KKFiY z-(78U+oQC%=y+u9sLO$uYq%`k%=X#RPeOsP6f=h}Ma z$I^flBBFEKpjuh?2zxh6aWy?w?ZTjj^yHnmo?~LzcRyATOk;{8o5?)3Ufn%tqf?wU zN6``q6JW~@*PVgk=p((#n&*kc>n5VUWx}F7#+z}9X}2?(Qh(yPMl^*N5lokL0*zr) zC8jYf(x%t`fy8cY&{62|ulj}E62aTDdpq;*>nSsZGuR}#PnjG01OC)2zL$Ue&XQp+ zf2~;MFoLja1C4TZy<)zW9iF(@FrXr+ad_$-MA_&axI!|x$DzG2I42@Wob=xoGdP_lBA0F@kRUsdOGkb}3jH8+gDbjOn~nCw@)^p{wEkVRwfmg-1JRRb<*jNn z&897j*(?o-ao;g65*!U#R_Z4cyD~YQ@_Xk6z4^3`Oh|s&QI?;X;HJasO{+U_v*_%| z0<)4cxc$=cW}zNf@&@@Dqg>|GBmptnXjo*Y4%)fh1@vGL&Eh-vJVI@5bl2@F6tMFa zh^Flug4wo*L<61;X7V&w9T)iZ+nLDE3=8SvrsD!V=0RkJj-+et9?>Vrr&2XiN+{a&(|VT;mB$ z`%>(ANP4QukJB>O?dmUrISih-s24AgsEIx?%dHZtgBLgZ@F|FfF8a!nT*9CiHQQ&R zbr#o5HeD>wvl?`=@gonM#=bhYpN4kpMVMujgwQKKN10f)I8=m`auuoYRj@lcy&N{2 z;Yl~TU$*1=5Rq&5?SV-olVc%l(L86YPZr*ol^ z-?!lf7}J!@2TUAa-^q9#I@0>cWoY=zOAn%oJxzk8$ij-n0cbzW{c8>fdM(0&@V1y5 z&^VhKB(t=tm&)n3I?8i0SpA7>?Qw(m7{_vw zo~s3IyIRHR_5wxZO(VK*?akU

g+TU2Eit?ng|;fWYgN4~M;|iP&`z3AUK`pc8w6 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 literal 0 HcmV?d00001 diff --git a/assets/images/sprites/Enemies/Entity/Agis.png.import b/assets/images/sprites/Enemies/Entity/Agis.png.import new file mode 100644 index 0000000..eee4166 --- /dev/null +++ b/assets/images/sprites/Enemies/Entity/Agis.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cvgfsm4ocwxsw" +path="res://.godot/imported/Agis.png-e1611e9d4c4f9014531b1d534d2161fd.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/images/sprites/Enemies/Entity/Agis.png" +dest_files=["res://.godot/imported/Agis.png-e1611e9d4c4f9014531b1d534d2161fd.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +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/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +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/scenes/actors/Creeper.tscn b/scenes/actors/Creeper.tscn new file mode 100644 index 0000000..bce83b9 --- /dev/null +++ b/scenes/actors/Creeper.tscn @@ -0,0 +1,476 @@ +[gd_scene format=3 uid="uid://cr7ibxkl174o1"] + +[ext_resource type="Script" uid="uid://cj5w74n7beula" path="res://scenes/actors/creeper.gd" id="1_683kk"] +[ext_resource type="Texture2D" uid="uid://mta76reo0an0" path="res://assets/images/sprites/Enemies/Monsters/monster.png" id="1_noq3l"] +[ext_resource type="Script" uid="uid://cxsbkcxpnu3t6" path="res://scenes/components/hurt_box.gd" id="2_hurtbox"] +[ext_resource type="Script" uid="uid://ev7uglfcbl02" path="res://scenes/components/health_component.gd" id="3_health"] +[ext_resource type="Script" uid="uid://dw1cot7pm0rp6" path="res://scenes/components/hit_box.gd" id="5_7og3g"] + +[sub_resource type="AtlasTexture" id="AtlasTexture_6gm0u"] +atlas = ExtResource("1_noq3l") +region = Rect2(0, 144, 48, 48) + +[sub_resource type="AtlasTexture" id="AtlasTexture_o77sm"] +atlas = ExtResource("1_noq3l") +region = Rect2(48, 144, 48, 48) + +[sub_resource type="AtlasTexture" id="AtlasTexture_fiwxl"] +atlas = ExtResource("1_noq3l") +region = Rect2(96, 144, 48, 48) + +[sub_resource type="AtlasTexture" id="AtlasTexture_xxnpd"] +atlas = ExtResource("1_noq3l") +region = Rect2(144, 144, 48, 48) + +[sub_resource type="AtlasTexture" id="AtlasTexture_hk1d6"] +atlas = ExtResource("1_noq3l") +region = Rect2(192, 144, 48, 48) + +[sub_resource type="AtlasTexture" id="AtlasTexture_1334s"] +atlas = ExtResource("1_noq3l") +region = Rect2(240, 144, 48, 48) + +[sub_resource type="AtlasTexture" id="AtlasTexture_h12pd"] +atlas = ExtResource("1_noq3l") +region = Rect2(288, 144, 48, 48) + +[sub_resource type="AtlasTexture" id="AtlasTexture_ef3yn"] +atlas = ExtResource("1_noq3l") +region = Rect2(336, 144, 48, 48) + +[sub_resource type="AtlasTexture" id="AtlasTexture_bcab8"] +atlas = ExtResource("1_noq3l") +region = Rect2(0, 288, 48, 48) + +[sub_resource type="AtlasTexture" id="AtlasTexture_q5rkb"] +atlas = ExtResource("1_noq3l") +region = Rect2(48, 288, 48, 48) + +[sub_resource type="AtlasTexture" id="AtlasTexture_53wdg"] +atlas = ExtResource("1_noq3l") +region = Rect2(96, 288, 48, 48) + +[sub_resource type="AtlasTexture" id="AtlasTexture_qc2f3"] +atlas = ExtResource("1_noq3l") +region = Rect2(144, 288, 48, 48) + +[sub_resource type="AtlasTexture" id="AtlasTexture_h6kpp"] +atlas = ExtResource("1_noq3l") +region = Rect2(192, 288, 48, 48) + +[sub_resource type="AtlasTexture" id="AtlasTexture_vxsoj"] +atlas = ExtResource("1_noq3l") +region = Rect2(240, 288, 48, 48) + +[sub_resource type="AtlasTexture" id="AtlasTexture_53fqn"] +atlas = ExtResource("1_noq3l") +region = Rect2(288, 288, 48, 48) + +[sub_resource type="AtlasTexture" id="AtlasTexture_ib8sr"] +atlas = ExtResource("1_noq3l") +region = Rect2(336, 288, 48, 48) + +[sub_resource type="AtlasTexture" id="AtlasTexture_wrhl5"] +atlas = ExtResource("1_noq3l") +region = Rect2(0, 336, 48, 48) + +[sub_resource type="AtlasTexture" id="AtlasTexture_o07x0"] +atlas = ExtResource("1_noq3l") +region = Rect2(48, 336, 48, 48) + +[sub_resource type="AtlasTexture" id="AtlasTexture_4xuc4"] +atlas = ExtResource("1_noq3l") +region = Rect2(96, 336, 48, 48) + +[sub_resource type="AtlasTexture" id="AtlasTexture_f4n60"] +atlas = ExtResource("1_noq3l") +region = Rect2(144, 336, 48, 48) + +[sub_resource type="AtlasTexture" id="AtlasTexture_6fyr1"] +atlas = ExtResource("1_noq3l") +region = Rect2(192, 336, 48, 48) + +[sub_resource type="AtlasTexture" id="AtlasTexture_isrvx"] +atlas = ExtResource("1_noq3l") +region = Rect2(240, 336, 48, 48) + +[sub_resource type="AtlasTexture" id="AtlasTexture_7jb5g"] +atlas = ExtResource("1_noq3l") +region = Rect2(288, 336, 48, 48) + +[sub_resource type="AtlasTexture" id="AtlasTexture_4snpt"] +atlas = ExtResource("1_noq3l") +region = Rect2(336, 336, 48, 48) + +[sub_resource type="AtlasTexture" id="AtlasTexture_0bs3p"] +atlas = ExtResource("1_noq3l") +region = Rect2(0, 240, 48, 48) + +[sub_resource type="AtlasTexture" id="AtlasTexture_6er14"] +atlas = ExtResource("1_noq3l") +region = Rect2(48, 240, 48, 48) + +[sub_resource type="AtlasTexture" id="AtlasTexture_2ousp"] +atlas = ExtResource("1_noq3l") +region = Rect2(96, 240, 48, 48) + +[sub_resource type="AtlasTexture" id="AtlasTexture_683kk"] +atlas = ExtResource("1_noq3l") +region = Rect2(0, 0, 48, 48) + +[sub_resource type="AtlasTexture" id="AtlasTexture_7psr3"] +atlas = ExtResource("1_noq3l") +region = Rect2(48, 0, 48, 48) + +[sub_resource type="AtlasTexture" id="AtlasTexture_usrw5"] +atlas = ExtResource("1_noq3l") +region = Rect2(96, 0, 48, 48) + +[sub_resource type="AtlasTexture" id="AtlasTexture_7og3g"] +atlas = ExtResource("1_noq3l") +region = Rect2(144, 0, 48, 48) + +[sub_resource type="AtlasTexture" id="AtlasTexture_blets"] +atlas = ExtResource("1_noq3l") +region = Rect2(192, 0, 48, 48) + +[sub_resource type="AtlasTexture" id="AtlasTexture_nt051"] +atlas = ExtResource("1_noq3l") +region = Rect2(240, 0, 48, 48) + +[sub_resource type="AtlasTexture" id="AtlasTexture_mck3s"] +atlas = ExtResource("1_noq3l") +region = Rect2(288, 0, 48, 48) + +[sub_resource type="AtlasTexture" id="AtlasTexture_ipyt4"] +atlas = ExtResource("1_noq3l") +region = Rect2(336, 0, 48, 48) + +[sub_resource type="AtlasTexture" id="AtlasTexture_m1exi"] +atlas = ExtResource("1_noq3l") +region = Rect2(0, 48, 48, 48) + +[sub_resource type="AtlasTexture" id="AtlasTexture_u4pvs"] +atlas = ExtResource("1_noq3l") +region = Rect2(48, 48, 48, 48) + +[sub_resource type="AtlasTexture" id="AtlasTexture_pdeun"] +atlas = ExtResource("1_noq3l") +region = Rect2(96, 48, 48, 48) + +[sub_resource type="AtlasTexture" id="AtlasTexture_ajc8e"] +atlas = ExtResource("1_noq3l") +region = Rect2(144, 48, 48, 48) + +[sub_resource type="AtlasTexture" id="AtlasTexture_4a32r"] +atlas = ExtResource("1_noq3l") +region = Rect2(192, 48, 48, 48) + +[sub_resource type="AtlasTexture" id="AtlasTexture_0lcgg"] +atlas = ExtResource("1_noq3l") +region = Rect2(240, 48, 48, 48) + +[sub_resource type="AtlasTexture" id="AtlasTexture_vn5sj"] +atlas = ExtResource("1_noq3l") +region = Rect2(288, 48, 48, 48) + +[sub_resource type="AtlasTexture" id="AtlasTexture_rw06l"] +atlas = ExtResource("1_noq3l") +region = Rect2(336, 48, 48, 48) + +[sub_resource type="AtlasTexture" id="AtlasTexture_oqjui"] +atlas = ExtResource("1_noq3l") +region = Rect2(0, 96, 48, 48) + +[sub_resource type="AtlasTexture" id="AtlasTexture_oh0i5"] +atlas = ExtResource("1_noq3l") +region = Rect2(48, 96, 48, 48) + +[sub_resource type="AtlasTexture" id="AtlasTexture_etdul"] +atlas = ExtResource("1_noq3l") +region = Rect2(96, 96, 48, 48) + +[sub_resource type="AtlasTexture" id="AtlasTexture_b67jb"] +atlas = ExtResource("1_noq3l") +region = Rect2(144, 96, 48, 48) + +[sub_resource type="AtlasTexture" id="AtlasTexture_odu4t"] +atlas = ExtResource("1_noq3l") +region = Rect2(192, 96, 48, 48) + +[sub_resource type="AtlasTexture" id="AtlasTexture_i755r"] +atlas = ExtResource("1_noq3l") +region = Rect2(240, 96, 48, 48) + +[sub_resource type="AtlasTexture" id="AtlasTexture_p4bqm"] +atlas = ExtResource("1_noq3l") +region = Rect2(288, 96, 48, 48) + +[sub_resource type="AtlasTexture" id="AtlasTexture_pinoy"] +atlas = ExtResource("1_noq3l") +region = Rect2(336, 96, 48, 48) + +[sub_resource type="SpriteFrames" id="SpriteFrames_uvqlf"] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_6gm0u") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_o77sm") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_fiwxl") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_xxnpd") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_hk1d6") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_1334s") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_h12pd") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_ef3yn") +}], +"loop": 0, +"name": &"attack", +"speed": 10.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_bcab8") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_q5rkb") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_53wdg") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_qc2f3") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_h6kpp") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_vxsoj") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_53fqn") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_ib8sr") +}], +"loop": 0, +"name": &"death_1", +"speed": 7.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_wrhl5") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_o07x0") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_4xuc4") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_f4n60") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_6fyr1") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_isrvx") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_7jb5g") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_4snpt") +}], +"loop": 0, +"name": &"death_2", +"speed": 7.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_0bs3p") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_6er14") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_2ousp") +}], +"loop": 0, +"name": &"hurt", +"speed": 10.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_683kk") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_7psr3") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_usrw5") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_7og3g") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_blets") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_nt051") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_mck3s") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_ipyt4") +}], +"loop": 1, +"name": &"idle", +"speed": 10.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_m1exi") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_u4pvs") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_pdeun") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_ajc8e") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_4a32r") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_0lcgg") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_vn5sj") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_rw06l") +}], +"loop": 1, +"name": &"walk_1", +"speed": 10.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_oqjui") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_oh0i5") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_etdul") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_b67jb") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_odu4t") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_i755r") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_p4bqm") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_pinoy") +}], +"loop": 1, +"name": &"walk_2", +"speed": 10.0 +}] + +[sub_resource type="CapsuleShape2D" id="CapsuleShape2D_gy2im"] +radius = 6.0 +height = 18.0 + +[sub_resource type="CapsuleShape2D" id="CapsuleShape2D_uvqlf"] +radius = 5.0 +height = 16.0 + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_uvqlf"] +size = Vector2(178.875, 27) + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_gy2im"] +size = Vector2(17, 6) + +[node name="Creeper" type="CharacterBody2D" unique_id=1458442942] +collision_layer = 8 +script = ExtResource("1_683kk") + +[node name="HealthComponent" type="Node" parent="." unique_id=391872171] +script = ExtResource("3_health") +max_health = 15 + +[node name="AnimatedSprite2D" type="AnimatedSprite2D" parent="." unique_id=1045569955] +position = Vector2(0, -8) +scale = Vector2(1.2, 1.2) +sprite_frames = SubResource("SpriteFrames_uvqlf") +animation = &"idle" +autoplay = "idle" + +[node name="CollisionShape2D" type="CollisionShape2D" parent="." unique_id=101852921] +position = Vector2(1, -9) +shape = SubResource("CapsuleShape2D_gy2im") + +[node name="HurtBox" type="Area2D" parent="." unique_id=1950866404] +collision_layer = 4 +collision_mask = 2 +script = ExtResource("2_hurtbox") + +[node name="CollisionShape2D" type="CollisionShape2D" parent="HurtBox" unique_id=1935738172] +position = Vector2(1, -8) +shape = SubResource("CapsuleShape2D_uvqlf") +debug_color = Color(1, 0, 0, 0.41960785) + +[node name="DetectionArea" type="Area2D" parent="." unique_id=2027089166] +collision_layer = 0 +collision_mask = 16 + +[node name="CollisionShape2D" type="CollisionShape2D" parent="DetectionArea" unique_id=1536337340] +position = Vector2(1, -14) +shape = SubResource("RectangleShape2D_uvqlf") +debug_color = Color(0.77266294, 0.44344115, 3.85046e-07, 0.41960785) + +[node name="HitBox" type="Area2D" parent="." unique_id=1279016534] +collision_layer = 2 +collision_mask = 4 +script = ExtResource("5_7og3g") +damage = 1 + +[node name="CollisionShape2D" type="CollisionShape2D" parent="HitBox" unique_id=622613801] +position = Vector2(-14.5, -14) +shape = SubResource("RectangleShape2D_gy2im") + +[node name="AttackRangeArea" type="Area2D" parent="." unique_id=-473062739] +collision_layer = 0 +collision_mask = 4 + +[node name="CollisionShape2D" type="CollisionShape2D" parent="AttackRangeArea" unique_id=1058720448] +position = Vector2(-14.5, -14) +shape = SubResource("RectangleShape2D_gy2im") +debug_color = Color(0.9622, 0.6, 0.1, 0.41960785) + +[node name="RayCast2D" type="RayCast2D" parent="." unique_id=562937948] +target_position = Vector2(0, 15) diff --git a/scenes/actors/creeper.gd b/scenes/actors/creeper.gd new file mode 100644 index 0000000..c130fe4 --- /dev/null +++ b/scenes/actors/creeper.gd @@ -0,0 +1,175 @@ +class_name Creeper +extends CharacterBody2D + +@onready var _hurtbox: HurtBox = $HurtBox +@onready var _health: HealthComponent = $HealthComponent +@onready var _sprite: AnimatedSprite2D = $AnimatedSprite2D +@onready var _detection_area: Area2D = $DetectionArea +@onready var _hitbox: HitBox = $HitBox +@onready var _hitbox_collision: CollisionShape2D = $HitBox/CollisionShape2D +@onready var _attack_range_area: Area2D = $AttackRangeArea +@onready var _ledge_detector: RayCast2D = $RayCast2D + +# Creeper Exported Variables +@export_group("Movement") +@export var move_speed: float = 60.0 +@export var patrol_speed: float = 20.0 +@export var ledge_check_offset: float = 10.0 + +@export_group("Combat") +@export var attack_cooldown: float = 1.0 +@export var backoff_min_distance: float = 30.0 +@export var attack_hit_frame_start: int = 4 +@export var attack_hit_frame_end: int = 5 + +# Creeper Runtime Variables +var _player: Node2D = null +var _player_in_attack_range: bool = false +var _is_attacking: bool = false +var _is_hurt: bool = false +var _is_dead: bool = false +var _attack_cooldown_timer: float = 0.0 +var _facing_direction: float = 1.0 +var _patrol_direction: float = 1.0 + +func _ready() -> void: + _hurtbox.hit_received.connect(_on_hurtbox_hit_received) + _health.health_changed.connect(_on_health_changed) + _health.died.connect(_on_died) + _sprite.animation_finished.connect(_on_animation_finished) + _detection_area.body_entered.connect(_on_detection_area_body_entered) + _detection_area.body_exited.connect(_on_detection_area_body_exited) + _attack_range_area.area_entered.connect(_on_hitbox_area_entered) + _attack_range_area.area_exited.connect(_on_hitbox_area_exited) + +func _physics_process(delta: float) -> void: + _apply_gravity(delta) + _update_attack_cooldown(delta) + + if not _is_dead: + _process_ai() + _update_hitbox() + + move_and_slide() + +func _update_hitbox() -> void: + var is_active_hit_frame: bool = _sprite.animation == &"attack" \ + and _sprite.frame >= attack_hit_frame_start \ + and _sprite.frame <= attack_hit_frame_end + _hitbox_collision.disabled = not (_is_attacking and is_active_hit_frame) + +func _apply_gravity(delta: float) -> void: + if not is_on_floor(): + velocity.y += ProjectSettings.get_setting("physics/2d/default_gravity") * delta + +func _update_attack_cooldown(delta: float) -> void: + if _attack_cooldown_timer > 0.0: + _attack_cooldown_timer -= delta + +func _process_ai() -> void: + if _is_hurt: + velocity.x = 0.0 + return + + if _is_attacking: + velocity.x = 0.0 + return + + if _player_in_attack_range and _attack_cooldown_timer <= 0.0: + _start_attack() + return + + if _player_in_attack_range: + _facing_direction = signf(_player.global_position.x - global_position.x) + var distance_to_player: float = absf(_player.global_position.x - global_position.x) + if distance_to_player < backoff_min_distance: + velocity.x = -_facing_direction * move_speed + if _sprite.animation != &"walk_1": + _sprite.play(&"walk_1") + else: + velocity.x = 0.0 + if _sprite.animation != &"idle": + _sprite.play(&"idle") + _sprite.flip_h = _facing_direction > 0.0 + _hitbox.scale.x = -_facing_direction + _attack_range_area.scale.x = -_facing_direction + return + + if _player: + _facing_direction = signf(_player.global_position.x - global_position.x) + if _has_ground_ahead(_facing_direction): + velocity.x = _facing_direction * move_speed + if _sprite.animation != &"walk_1": + _sprite.play(&"walk_1") + else: + velocity.x = 0.0 + if _sprite.animation != &"idle": + _sprite.play(&"idle") + else: + _facing_direction = _patrol_direction + velocity.x = _patrol_direction * patrol_speed + if _sprite.animation != &"walk_2": + _sprite.play(&"walk_2") + + _sprite.flip_h = _facing_direction > 0.0 + _hitbox.scale.x = -_facing_direction + _attack_range_area.scale.x = -_facing_direction + + if not _player: + _update_patrol_direction() + +func _has_ground_ahead(direction: float) -> bool: + _ledge_detector.position.x = ledge_check_offset * direction + _ledge_detector.force_raycast_update() + return _ledge_detector.is_colliding() + +func _update_patrol_direction() -> void: + if is_on_wall() or not _has_ground_ahead(_patrol_direction): + _patrol_direction = -_patrol_direction + +func _start_attack() -> void: + _is_attacking = true + _attack_cooldown_timer = attack_cooldown + velocity.x = 0.0 + _sprite.play(&"attack") + +func _on_detection_area_body_entered(body: Node2D) -> void: + _player = body + +func _on_detection_area_body_exited(body: Node2D) -> void: + if body == _player: + _player = null + +func _on_hitbox_area_entered(area: Area2D) -> void: + if area is HurtBox and area.get_parent() == _player: + _player_in_attack_range = true + +func _on_hitbox_area_exited(area: Area2D) -> void: + if area is HurtBox and area.get_parent() == _player: + _player_in_attack_range = false + +func _on_hurtbox_hit_received(hitbox: HitBox) -> void: + _health.take_damage(hitbox.damage) + +func _on_health_changed(_new_value: int, _max_value: int) -> void: + _is_attacking = false + _is_hurt = true + _sprite.play(&"hurt") + +func _on_died() -> void: + _is_dead = true + velocity = Vector2.ZERO + _hurtbox.set_deferred("monitoring", false) + _hitbox_collision.set_deferred("disabled", true) + +func _on_animation_finished() -> void: + if _sprite.animation == &"hurt": + _is_hurt = false + if _is_dead: + _sprite.play(&"death_1") + else: + _sprite.play(&"idle") + elif _sprite.animation == &"attack": + _is_attacking = false + elif _sprite.animation == &"death_1": + queue_free() diff --git a/scenes/actors/creeper.gd.uid b/scenes/actors/creeper.gd.uid new file mode 100644 index 0000000..a37a237 --- /dev/null +++ b/scenes/actors/creeper.gd.uid @@ -0,0 +1 @@ +uid://cj5w74n7beula diff --git a/scenes/actors/entity.tscn b/scenes/actors/entity.tscn new file mode 100644 index 0000000..fdfed4e --- /dev/null +++ b/scenes/actors/entity.tscn @@ -0,0 +1,123 @@ +[gd_scene format=3 uid="uid://cwq8mu0hub5qd"] + +[ext_resource type="Texture2D" uid="uid://cvgfsm4ocwxsw" path="res://assets/images/sprites/Enemies/Entity/Agis.png" id="1_hfkv4"] + +[sub_resource type="AtlasTexture" id="AtlasTexture_n1j25"] +atlas = ExtResource("1_hfkv4") +region = Rect2(0, 0, 224, 240) + +[sub_resource type="AtlasTexture" id="AtlasTexture_7us7e"] +atlas = ExtResource("1_hfkv4") +region = Rect2(224, 0, 224, 240) + +[sub_resource type="AtlasTexture" id="AtlasTexture_rf7ig"] +atlas = ExtResource("1_hfkv4") +region = Rect2(448, 0, 224, 240) + +[sub_resource type="AtlasTexture" id="AtlasTexture_078wo"] +atlas = ExtResource("1_hfkv4") +region = Rect2(672, 0, 224, 240) + +[sub_resource type="AtlasTexture" id="AtlasTexture_21adn"] +atlas = ExtResource("1_hfkv4") +region = Rect2(896, 0, 224, 240) + +[sub_resource type="AtlasTexture" id="AtlasTexture_2x2mf"] +atlas = ExtResource("1_hfkv4") +region = Rect2(1120, 0, 224, 240) + +[sub_resource type="AtlasTexture" id="AtlasTexture_g1arv"] +atlas = ExtResource("1_hfkv4") +region = Rect2(1344, 0, 224, 240) + +[sub_resource type="AtlasTexture" id="AtlasTexture_chiue"] +atlas = ExtResource("1_hfkv4") +region = Rect2(1568, 0, 224, 240) + +[sub_resource type="AtlasTexture" id="AtlasTexture_f3a0o"] +atlas = ExtResource("1_hfkv4") +region = Rect2(1792, 0, 224, 240) + +[sub_resource type="AtlasTexture" id="AtlasTexture_xy100"] +atlas = ExtResource("1_hfkv4") +region = Rect2(2016, 0, 224, 240) + +[sub_resource type="AtlasTexture" id="AtlasTexture_fv5mp"] +atlas = ExtResource("1_hfkv4") +region = Rect2(2240, 0, 224, 240) + +[sub_resource type="AtlasTexture" id="AtlasTexture_wunnd"] +atlas = ExtResource("1_hfkv4") +region = Rect2(2464, 0, 224, 240) + +[sub_resource type="AtlasTexture" id="AtlasTexture_u15hw"] +atlas = ExtResource("1_hfkv4") +region = Rect2(2688, 0, 224, 240) + +[sub_resource type="AtlasTexture" id="AtlasTexture_ai8gr"] +atlas = ExtResource("1_hfkv4") +region = Rect2(2912, 0, 224, 240) + +[sub_resource type="AtlasTexture" id="AtlasTexture_retyq"] +atlas = ExtResource("1_hfkv4") +region = Rect2(3136, 0, 224, 240) + +[sub_resource type="SpriteFrames" id="SpriteFrames_uvqlf"] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_n1j25") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_7us7e") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_rf7ig") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_078wo") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_21adn") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_2x2mf") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_g1arv") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_chiue") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_f3a0o") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_xy100") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_fv5mp") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_wunnd") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_u15hw") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_ai8gr") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_retyq") +}], +"loop": 1, +"name": &"idle", +"speed": 8.0 +}] + +[node name="Entity" type="AnimatedSprite2D" unique_id=286688007] +scale = Vector2(2, 2) +sprite_frames = SubResource("SpriteFrames_uvqlf") +animation = &"idle" +autoplay = "idle" +frame_progress = 0.9163391 diff --git a/scenes/components/health_component.gd b/scenes/components/health_component.gd new file mode 100644 index 0000000..74875c1 --- /dev/null +++ b/scenes/components/health_component.gd @@ -0,0 +1,28 @@ +class_name HealthComponent +extends Node + +signal health_changed(new_value: int, max_value: int) +signal died + +@export var max_health: int = 1 + +var current_health: int + +func _ready() -> void: + current_health = max_health + +func take_damage(amount: int) -> void: + if current_health <= 0: + return + + current_health = max(current_health - amount, 0) + health_changed.emit(current_health, max_health) + + if current_health == 0: + died.emit() + +func heal(amount: int) -> void: + if current_health <= 0: + return + current_health = min(current_health + amount, max_health) + health_changed.emit(current_health, max_health) diff --git a/scenes/components/health_component.gd.uid b/scenes/components/health_component.gd.uid new file mode 100644 index 0000000..47bcbea --- /dev/null +++ b/scenes/components/health_component.gd.uid @@ -0,0 +1 @@ +uid://ev7uglfcbl02 diff --git a/scenes/components/hit_box.gd b/scenes/components/hit_box.gd new file mode 100644 index 0000000..b3c57e6 --- /dev/null +++ b/scenes/components/hit_box.gd @@ -0,0 +1,4 @@ +class_name HitBox +extends Area2D + +@export var damage: int = 0 diff --git a/scenes/components/hit_box.gd.uid b/scenes/components/hit_box.gd.uid new file mode 100644 index 0000000..6eb4dfd --- /dev/null +++ b/scenes/components/hit_box.gd.uid @@ -0,0 +1 @@ +uid://dw1cot7pm0rp6 diff --git a/scenes/components/hurt_box.gd b/scenes/components/hurt_box.gd new file mode 100644 index 0000000..5d67129 --- /dev/null +++ b/scenes/components/hurt_box.gd @@ -0,0 +1,11 @@ +class_name HurtBox +extends Area2D + +signal hit_received(hitbox: HitBox) + +func _ready() -> void: + area_entered.connect(_on_area_entered) + +func _on_area_entered(area: Area2D) -> void: + if area is HitBox and area.get_parent() != get_parent(): + hit_received.emit(area) diff --git a/scenes/components/hurt_box.gd.uid b/scenes/components/hurt_box.gd.uid new file mode 100644 index 0000000..c480efd --- /dev/null +++ b/scenes/components/hurt_box.gd.uid @@ -0,0 +1 @@ +uid://cxsbkcxpnu3t6 diff --git a/scenes/components/hurt_box.tscn b/scenes/components/hurt_box.tscn new file mode 100644 index 0000000..6d1c11e --- /dev/null +++ b/scenes/components/hurt_box.tscn @@ -0,0 +1,12 @@ +[gd_scene format=3 uid="uid://y8ge2udsupng"] + +[ext_resource type="Script" uid="uid://cxsbkcxpnu3t6" path="res://scenes/components/hurt_box.gd" id="1_eeq1w"] + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_cg0qn"] + +[node name="HurtBox" type="Area2D" unique_id=208381358] +script = ExtResource("1_eeq1w") + +[node name="CollisionShape2D" type="CollisionShape2D" parent="." unique_id=497117705] +position = Vector2(23, -12) +shape = SubResource("RectangleShape2D_cg0qn")