diff --git a/Assets/Animations/stun.res b/Assets/Animations/stun.res index 24458f6..238ca6a 100644 Binary files a/Assets/Animations/stun.res and b/Assets/Animations/stun.res differ diff --git a/Assets/Sounds/shotgun.wav b/Assets/Sounds/shotgun.wav new file mode 100644 index 0000000..be23bde Binary files /dev/null and b/Assets/Sounds/shotgun.wav differ diff --git a/Assets/Sounds/shotgun.wav.import b/Assets/Sounds/shotgun.wav.import new file mode 100644 index 0000000..81b0a6c --- /dev/null +++ b/Assets/Sounds/shotgun.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://5fybh24xashp" +path="res://.godot/imported/shotgun.wav-534a563afe0baae28e1f7171107beab0.sample" + +[deps] + +source_file="res://Assets/Sounds/shotgun.wav" +dest_files=["res://.godot/imported/shotgun.wav-534a563afe0baae28e1f7171107beab0.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-cannon.ase b/Assets/Sprites/Characters/doc-cannon.ase new file mode 100644 index 0000000..4b5529b Binary files /dev/null and b/Assets/Sprites/Characters/doc-cannon.ase differ diff --git a/Assets/Sprites/Characters/doc-centurion.ase b/Assets/Sprites/Characters/doc-centurion.ase new file mode 100644 index 0000000..23714bb Binary files /dev/null and b/Assets/Sprites/Characters/doc-centurion.ase differ diff --git a/Assets/Sprites/Characters/doc-centurion.png b/Assets/Sprites/Characters/doc-centurion.png new file mode 100644 index 0000000..4567f63 Binary files /dev/null and b/Assets/Sprites/Characters/doc-centurion.png differ diff --git a/Assets/Sprites/Characters/doc-centurion.png.import b/Assets/Sprites/Characters/doc-centurion.png.import new file mode 100644 index 0000000..3d2761d --- /dev/null +++ b/Assets/Sprites/Characters/doc-centurion.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cfyd6sv4yeplt" +path="res://.godot/imported/doc-centurion.png-c338efa15de1dcb536f9d92bf71e8760.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/Sprites/Characters/doc-centurion.png" +dest_files=["res://.godot/imported/doc-centurion.png-c338efa15de1dcb536f9d92bf71e8760.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/doc-knight.ase b/Assets/Sprites/Characters/doc-knight.ase new file mode 100644 index 0000000..4a8f4b4 Binary files /dev/null and b/Assets/Sprites/Characters/doc-knight.ase differ diff --git a/Assets/Sprites/Characters/doc-knight.png b/Assets/Sprites/Characters/doc-knight.png new file mode 100644 index 0000000..b8d3628 Binary files /dev/null and b/Assets/Sprites/Characters/doc-knight.png differ diff --git a/Assets/Sprites/Characters/doc-knight.png.import b/Assets/Sprites/Characters/doc-knight.png.import new file mode 100644 index 0000000..3489217 --- /dev/null +++ b/Assets/Sprites/Characters/doc-knight.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://byseosv8hwgg7" +path="res://.godot/imported/doc-knight.png-6234ac8c9efcb03f74510b500e695043.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/Sprites/Characters/doc-knight.png" +dest_files=["res://.godot/imported/doc-knight.png-6234ac8c9efcb03f74510b500e695043.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/doc-legionary.ase b/Assets/Sprites/Characters/doc-legionary.ase new file mode 100644 index 0000000..88c5fc3 Binary files /dev/null and b/Assets/Sprites/Characters/doc-legionary.ase differ diff --git a/Assets/Sprites/Characters/doc-legionary.png b/Assets/Sprites/Characters/doc-legionary.png new file mode 100644 index 0000000..b739327 Binary files /dev/null and b/Assets/Sprites/Characters/doc-legionary.png differ diff --git a/Assets/Sprites/Characters/doc-legionary.png.import b/Assets/Sprites/Characters/doc-legionary.png.import new file mode 100644 index 0000000..9336266 --- /dev/null +++ b/Assets/Sprites/Characters/doc-legionary.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://khq0ujwl6xrt" +path="res://.godot/imported/doc-legionary.png-8f5899d31c08d0ed2ab7302c091c6dab.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/Sprites/Characters/doc-legionary.png" +dest_files=["res://.godot/imported/doc-legionary.png-8f5899d31c08d0ed2ab7302c091c6dab.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/Items/doc-shield.ase b/Assets/Sprites/Items/doc-shield.ase new file mode 100644 index 0000000..886c367 Binary files /dev/null and b/Assets/Sprites/Items/doc-shield.ase differ diff --git a/Assets/Sprites/Items/doc-shield.png b/Assets/Sprites/Items/doc-shield.png new file mode 100644 index 0000000..cf1530d Binary files /dev/null and b/Assets/Sprites/Items/doc-shield.png differ diff --git a/Assets/Sprites/Items/doc-shield.png.import b/Assets/Sprites/Items/doc-shield.png.import new file mode 100644 index 0000000..b5b1b13 --- /dev/null +++ b/Assets/Sprites/Items/doc-shield.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://417j1ckcjg2i" +path="res://.godot/imported/doc-shield.png-2a52fb5fee10b1e22bca5cf89c2678c2.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/Sprites/Items/doc-shield.png" +dest_files=["res://.godot/imported/doc-shield.png-2a52fb5fee10b1e22bca5cf89c2678c2.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/Items/pugio.ase b/Assets/Sprites/Items/pugio.ase new file mode 100644 index 0000000..d5f5817 Binary files /dev/null and b/Assets/Sprites/Items/pugio.ase differ diff --git a/Assets/Sprites/Items/pugio.png b/Assets/Sprites/Items/pugio.png new file mode 100644 index 0000000..b90ec00 Binary files /dev/null and b/Assets/Sprites/Items/pugio.png differ diff --git a/Assets/Sprites/Items/pugio.png.import b/Assets/Sprites/Items/pugio.png.import new file mode 100644 index 0000000..2f5724b --- /dev/null +++ b/Assets/Sprites/Items/pugio.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dfpe74vxvuwal" +path="res://.godot/imported/pugio.png-fa7453f4b1eaf635e43eebc786b17fec.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/Sprites/Items/pugio.png" +dest_files=["res://.godot/imported/pugio.png-fa7453f4b1eaf635e43eebc786b17fec.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/Items/shotgun.ase b/Assets/Sprites/Items/shotgun.ase new file mode 100644 index 0000000..2ec7020 Binary files /dev/null and b/Assets/Sprites/Items/shotgun.ase differ diff --git a/Assets/Sprites/Items/shotgun.png b/Assets/Sprites/Items/shotgun.png new file mode 100644 index 0000000..ffff38c Binary files /dev/null and b/Assets/Sprites/Items/shotgun.png differ diff --git a/Assets/Sprites/Items/shotgun.png.import b/Assets/Sprites/Items/shotgun.png.import new file mode 100644 index 0000000..6fd99c8 --- /dev/null +++ b/Assets/Sprites/Items/shotgun.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b1omx2kdb2x1n" +path="res://.godot/imported/shotgun.png-d8cfd36a55586388c595635947678d36.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/Sprites/Items/shotgun.png" +dest_files=["res://.godot/imported/shotgun.png-d8cfd36a55586388c595635947678d36.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-swing-32.ase b/Assets/Sprites/sword-swing-32.ase new file mode 100644 index 0000000..ebe9d42 Binary files /dev/null and b/Assets/Sprites/sword-swing-32.ase differ diff --git a/Assets/Sprites/sword-swing-32.png b/Assets/Sprites/sword-swing-32.png new file mode 100644 index 0000000..449da4b Binary files /dev/null and b/Assets/Sprites/sword-swing-32.png differ diff --git a/Assets/Sprites/sword-swing-32.png.import b/Assets/Sprites/sword-swing-32.png.import new file mode 100644 index 0000000..7ebbac8 --- /dev/null +++ b/Assets/Sprites/sword-swing-32.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dev6i1j37lauo" +path="res://.godot/imported/sword-swing-32.png-11d82306b8a2f9ee744192fd27b2bd25.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/Sprites/sword-swing-32.png" +dest_files=["res://.godot/imported/sword-swing-32.png-11d82306b8a2f9ee744192fd27b2bd25.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-swing-small.ase b/Assets/Sprites/sword-swing-small.ase new file mode 100644 index 0000000..e17de42 Binary files /dev/null and b/Assets/Sprites/sword-swing-small.ase differ diff --git a/Assets/Sprites/sword-swing-small.png b/Assets/Sprites/sword-swing-small.png new file mode 100644 index 0000000..7ecba10 Binary files /dev/null and b/Assets/Sprites/sword-swing-small.png differ diff --git a/Assets/Sprites/sword-swing-small.png.import b/Assets/Sprites/sword-swing-small.png.import new file mode 100644 index 0000000..533e032 --- /dev/null +++ b/Assets/Sprites/sword-swing-small.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ct0m4lk2icx3p" +path="res://.godot/imported/sword-swing-small.png-29f84988161446fee5ee3a6b6f1fbc14.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/Sprites/sword-swing-small.png" +dest_files=["res://.godot/imported/sword-swing-small.png-29f84988161446fee5ee3a6b6f1fbc14.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/Characters/Character.cs b/Characters/Character.cs index 03662a5..45686c7 100644 --- a/Characters/Character.cs +++ b/Characters/Character.cs @@ -213,11 +213,11 @@ public partial class Character : CharacterBody2D, IFaction if (Inventory.SelectedItem is Weapon weapon) { - weapon.Use(); - if (weapon.IsUsing) + if (!weapon.IsUsing) { Inventory.EmitSignal(Inventory.SignalName.UsedItem, weapon); } + weapon.Use(); } } @@ -230,6 +230,27 @@ public partial class Character : CharacterBody2D, IFaction } } + public void UseCurrentItemAlt() + { + if (StunTime > 0 || !IsAlive) + { + return; + } + + if (Inventory.SelectedItem is Weapon weapon) + { + weapon.UseAlt(); + } + } + + public void DeuseCurrentItemAlt() + { + if (Inventory.SelectedItem is Weapon weapon) + { + weapon.DeuseAlt(); + } + } + public void LookTowardsDirection() { if (!Direction.IsZeroApprox()) @@ -343,8 +364,6 @@ public partial class Character : CharacterBody2D, IFaction }; var spaceState = GetWorld2D().DirectSpaceState; var result = spaceState.IntersectRay(rayParams); - if (result.Count > 0) - GD.Print(result["collider"]); return result.Count == 0; } } diff --git a/Characters/DocCenturion.tscn b/Characters/DocCenturion.tscn new file mode 100644 index 0000000..56f7b2a --- /dev/null +++ b/Characters/DocCenturion.tscn @@ -0,0 +1,420 @@ +[gd_scene load_steps=41 format=3 uid="uid://dhamcei7tfta8"] + +[ext_resource type="Shader" path="res://Shaders/Flash.gdshader" id="1_msit5"] +[ext_resource type="Script" path="res://Characters/Enemy.cs" id="2_pkari"] +[ext_resource type="Script" path="res://State/Character/CharacterStateMachine.cs" id="3_2dbgx"] +[ext_resource type="Script" path="res://State/Character/NPCIdleState.cs" id="4_47f2d"] +[ext_resource type="Script" path="res://State/Character/NPCMoveState.cs" id="5_iphm1"] +[ext_resource type="Script" path="res://State/Thinker/ThinkerStateMachine.cs" id="6_6516i"] +[ext_resource type="Script" path="res://State/Thinker/BlockAttackState.cs" id="7_vgjig"] +[ext_resource type="Script" path="res://State/Thinker/IdleState.cs" id="8_5neew"] +[ext_resource type="Script" path="res://Utils/AnimationManager.cs" id="9_fgnr2"] +[ext_resource type="Animation" uid="uid://8e8r3y1imvsx" path="res://Assets/Animations/stun.res" id="10_1erll"] +[ext_resource type="Material" uid="uid://bat28samf7ukd" path="res://Assets/Sprites/Particles/NPCDamageProcessMaterial.tres" id="11_p7yev"] +[ext_resource type="Texture2D" uid="uid://bd8l8kafb42dt" path="res://Assets/Sprites/Particles/circle.png" id="12_t3nnt"] +[ext_resource type="Material" uid="uid://2tsvsp45elru" path="res://Assets/Sprites/Particles/NPCDeathParticles.tres" id="13_nm3wd"] +[ext_resource type="Texture2D" uid="uid://c1a7lvb4uuwfy" path="res://Assets/Sprites/Particles/circle-16.png" id="14_o5rd3"] +[ext_resource type="AudioStream" uid="uid://k6kpdj1kv0jg" path="res://Assets/Sounds/splat.ogg" id="15_8yg1g"] +[ext_resource type="Texture2D" uid="uid://cfyd6sv4yeplt" path="res://Assets/Sprites/Characters/doc-centurion.png" id="16_6uxxp"] +[ext_resource type="Script" path="res://Items/Inventory.cs" id="17_6fh5y"] +[ext_resource type="PackedScene" uid="uid://5y1acxl4j4n7" path="res://Items/Weapons/Pugio.tscn" id="18_7l8tj"] +[ext_resource type="PackedScene" uid="uid://cjgxyhgcyvsv7" path="res://BoundingBoxes/Hurtbox.tscn" id="19_xol7n"] + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_2fq6c"] +resource_local_to_scene = true +shader = ExtResource("1_msit5") +shader_parameter/color = Vector4(1, 1, 1, 1) +shader_parameter/intensity = 0.0 +shader_parameter/alpha_modulate = 1.0 + +[sub_resource type="Animation" id="Animation_rqtrh"] +length = 0.001 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +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": [0] +} + +[sub_resource type="Animation" id="Animation_qws2q"] +resource_name = "idle" +length = 0.8 +loop_mode = 1 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +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": [0] +} + +[sub_resource type="Animation" id="Animation_dwyme"] +resource_name = "move" +length = 0.6 +loop_mode = 1 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +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, 0.3, 0.4, 0.5), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1), +"update": 1, +"values": [1, 2, 3, 4, 5, 6] +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_uqsue"] +_data = { +"RESET": SubResource("Animation_rqtrh"), +"idle": SubResource("Animation_qws2q"), +"move": SubResource("Animation_dwyme") +} + +[sub_resource type="Animation" id="Animation_adxyh"] +resource_local_to_scene = true +length = 0.001 + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_sxq14"] +_data = { +"RESET": SubResource("Animation_adxyh") +} + +[sub_resource type="Animation" id="Animation_k6l16"] +length = 0.001 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath(".:material:shader_parameter/intensity") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath(".:material:shader_parameter/alpha_modulate") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [1.0] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("Effects/DeathParticles:emitting") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [false] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("Effects/HurtParticles: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_lhc4c"] +resource_name = "death" +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Effects/DeathParticles:emitting") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [true] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath(".:material:shader_parameter/alpha_modulate") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0, 0.1), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [1.0, 0.0] +} + +[sub_resource type="Animation" id="Animation_0vgmg"] +resource_local_to_scene = true +resource_name = "hurt" +length = 0.2 +step = 0.05 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath(".:material:shader_parameter/intensity") +tracks/0/interp = 2 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.05, 0.1, 0.2), +"transitions": PackedFloat32Array(4, 4, 4, 4), +"update": 0, +"values": [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), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [true] +} +tracks/2/type = "method" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("Effects/HurtParticles") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0.1), +"transitions": PackedFloat32Array(1), +"values": [{ +"args": [], +"method": &"restart" +}] +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_rc55s"] +_data = { +"RESET": SubResource("Animation_k6l16"), +"death": SubResource("Animation_lhc4c"), +"hurt": SubResource("Animation_0vgmg") +} + +[sub_resource type="Animation" id="Animation_7j54f"] +length = 0.001 + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_kks2p"] +_data = { +"RESET": SubResource("Animation_7j54f"), +"stun": ExtResource("10_1erll") +} + +[sub_resource type="CanvasTexture" id="CanvasTexture_pited"] +diffuse_texture = ExtResource("14_o5rd3") + +[sub_resource type="Gradient" id="Gradient_b2o0f"] +colors = PackedColorArray(1, 1, 1, 1, 1, 1, 1, 0) + +[sub_resource type="GradientTexture1D" id="GradientTexture1D_iyaih"] +gradient = SubResource("Gradient_b2o0f") + +[sub_resource type="Curve" id="Curve_30p4b"] +_data = [Vector2(0, 0), 0.0, 0.0, 0, 0, Vector2(0.2, 1), 0.0, 0.0, 0, 0, Vector2(1, 0.5), 0.0, 0.0, 0, 0] +point_count = 3 + +[sub_resource type="CurveTexture" id="CurveTexture_5uulw"] +curve = SubResource("Curve_30p4b") + +[sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_qdhau"] +particle_flag_disable_z = true +spread = 180.0 +gravity = Vector3(0, 0, 0) +initial_velocity_min = 32.0 +initial_velocity_max = 32.0 +angular_velocity_min = 90.0 +angular_velocity_max = 90.0 +orbit_velocity_min = 0.0 +orbit_velocity_max = 0.0 +linear_accel_min = -64.0 +linear_accel_max = -32.0 +tangential_accel_min = 8.0 +tangential_accel_max = 8.0 +scale_min = 0.13 +scale_max = 0.25 +scale_curve = SubResource("CurveTexture_5uulw") +color = Color(1, 0, 0, 1) +color_ramp = SubResource("GradientTexture1D_iyaih") + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_bfqew"] +size = Vector2(12, 8) + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_1gjgc"] +size = Vector2(12, 16) + +[node name="Centurion" type="CharacterBody2D" node_paths=PackedStringArray("DefaultSelectedItem", "ThinkerStateMachine", "Sprite", "Inventory", "StateMachine", "Hurtbox")] +y_sort_enabled = true +texture_filter = 3 +material = SubResource("ShaderMaterial_2fq6c") +collision_layer = 6 +collision_mask = 17 +script = ExtResource("2_pkari") +DefaultSelectedItem = NodePath("Inventory/Sword") +ThinkerStateMachine = NodePath("ThinkerStateMachine") +Speed = 40.0 +Mass = 2.0 +Health = 80.0 +Sprite = NodePath("Sprites/Node2D/Character") +Inventory = NodePath("Inventory") +StateMachine = NodePath("StateMachine") +Hurtbox = NodePath("Hurtbox") + +[node name="StateMachine" type="Node" parent="." node_paths=PackedStringArray("InitialState", "Character")] +script = ExtResource("3_2dbgx") +InitialState = NodePath("Idle") +Character = NodePath("..") + +[node name="Idle" type="Node" parent="StateMachine" node_paths=PackedStringArray("MoveState", "Character")] +script = ExtResource("4_47f2d") +MoveState = NodePath("../Move") +Character = NodePath("../..") + +[node name="Move" type="Node" parent="StateMachine" node_paths=PackedStringArray("IdleState", "Character")] +script = ExtResource("5_iphm1") +IdleState = NodePath("../Idle") +Character = NodePath("../..") + +[node name="ThinkerStateMachine" type="Node" parent="." node_paths=PackedStringArray("InitialState")] +script = ExtResource("6_6516i") +InitialState = NodePath("Idle") + +[node name="Attack" type="Node" parent="ThinkerStateMachine" node_paths=PackedStringArray("PassiveState", "PursueState", "NPC")] +script = ExtResource("7_vgjig") +PreferredWeightDistance = 24.0 +MaxDistanceToTarget = 128.0 +UseItemDistance = 48.0 +PassiveState = NodePath("../Idle") +PursueState = NodePath("../Idle") +NPC = NodePath("../..") + +[node name="Idle" type="Node" parent="ThinkerStateMachine" node_paths=PackedStringArray("PursueState", "NavigationAgent", "NPC")] +script = ExtResource("8_5neew") +PursueState = NodePath("../Attack") +MinTargetDistance = 24.0 +PursueOnLineOfSight = true +MinLineOfSightDistance = 256.0 +ShouldReturnToOriginalPosition = true +NavigationAgent = NodePath("../../NavigationAgent2D") +NPC = NodePath("../..") + +[node name="NavigationAgent2D" type="NavigationAgent2D" parent="."] +target_desired_distance = 16.0 +debug_enabled = true + +[node name="Animations" type="Node" parent="."] +script = ExtResource("9_fgnr2") + +[node name="Movement" type="AnimationPlayer" parent="Animations"] +libraries = { +"": SubResource("AnimationLibrary_uqsue") +} + +[node name="Attack" type="AnimationPlayer" parent="Animations"] +libraries = { +"": SubResource("AnimationLibrary_sxq14") +} + +[node name="Hurt" type="AnimationPlayer" parent="Animations"] +root_node = NodePath("../..") +libraries = { +"": SubResource("AnimationLibrary_rc55s") +} + +[node name="Stun" type="AnimationPlayer" parent="Animations"] +libraries = { +"": SubResource("AnimationLibrary_kks2p") +} + +[node name="Effects" type="Node2D" parent="."] + +[node name="HurtParticles" type="GPUParticles2D" parent="Effects"] +position = Vector2(0, -8) +emitting = false +process_material = ExtResource("11_p7yev") +texture = ExtResource("12_t3nnt") +lifetime = 0.4 +one_shot = true +explosiveness = 1.0 + +[node name="DeathParticles" type="GPUParticles2D" parent="Effects"] +emitting = false +amount = 32 +process_material = ExtResource("13_nm3wd") +texture = SubResource("CanvasTexture_pited") +lifetime = 2.0 +one_shot = true +preprocess = 0.1 +explosiveness = 0.9 + +[node name="SpawnParticles" type="GPUParticles2D" parent="Effects"] +emitting = false +amount = 24 +process_material = SubResource("ParticleProcessMaterial_qdhau") +texture = ExtResource("14_o5rd3") + +[node name="HurtSound" type="AudioStreamPlayer2D" parent="Effects"] +stream = ExtResource("15_8yg1g") + +[node name="Sprites" type="Node2D" parent="."] +y_sort_enabled = true +use_parent_material = true +position = Vector2(-0.5, 0) +rotation = 6.28319 + +[node name="Node2D" type="Node2D" parent="Sprites"] +use_parent_material = true + +[node name="Character" type="Sprite2D" parent="Sprites/Node2D"] +use_parent_material = true +texture = ExtResource("16_6uxxp") +offset = Vector2(0, -12) +hframes = 7 + +[node name="CollisionShape2D" type="CollisionShape2D" parent="."] +position = Vector2(0, -4) +shape = SubResource("RectangleShape2D_bfqew") + +[node name="Inventory" type="Node2D" parent="."] +y_sort_enabled = true +position = Vector2(0, -4) +script = ExtResource("17_6fh5y") + +[node name="Sword" parent="Inventory" instance=ExtResource("18_7l8tj")] + +[node name="Hurtbox" parent="." instance=ExtResource("19_xol7n")] + +[node name="CollisionShape2D" parent="Hurtbox" index="0"] +position = Vector2(0, -8) +shape = SubResource("RectangleShape2D_1gjgc") + +[editable path="Hurtbox"] diff --git a/Characters/DocLegionary.tscn b/Characters/DocLegionary.tscn new file mode 100644 index 0000000..5e887ae --- /dev/null +++ b/Characters/DocLegionary.tscn @@ -0,0 +1,442 @@ +[gd_scene load_steps=41 format=3 uid="uid://cdj50hb84aujp"] + +[ext_resource type="Shader" path="res://Shaders/Flash.gdshader" id="1_hvgeb"] +[ext_resource type="Script" path="res://Characters/Enemy.cs" id="2_h5w5n"] +[ext_resource type="Script" path="res://State/Character/CharacterStateMachine.cs" id="3_04p3j"] +[ext_resource type="Script" path="res://State/Character/NPCIdleState.cs" id="4_1ngkf"] +[ext_resource type="Script" path="res://State/Character/NPCMoveState.cs" id="5_wcpa1"] +[ext_resource type="Script" path="res://State/Thinker/ThinkerStateMachine.cs" id="6_121gp"] +[ext_resource type="Script" path="res://State/Thinker/AttackState.cs" id="8_8a6v2"] +[ext_resource type="Script" path="res://State/Thinker/IdleState.cs" id="9_ewnq3"] +[ext_resource type="Script" path="res://Utils/AnimationManager.cs" id="9_ssmee"] +[ext_resource type="Animation" uid="uid://8e8r3y1imvsx" path="res://Assets/Animations/stun.res" id="10_oplmj"] +[ext_resource type="Material" uid="uid://bat28samf7ukd" path="res://Assets/Sprites/Particles/NPCDamageProcessMaterial.tres" id="11_qcw5x"] +[ext_resource type="Texture2D" uid="uid://bd8l8kafb42dt" path="res://Assets/Sprites/Particles/circle.png" id="12_rlelw"] +[ext_resource type="Material" uid="uid://2tsvsp45elru" path="res://Assets/Sprites/Particles/NPCDeathParticles.tres" id="13_kgmsk"] +[ext_resource type="Texture2D" uid="uid://c1a7lvb4uuwfy" path="res://Assets/Sprites/Particles/circle-16.png" id="14_88n3w"] +[ext_resource type="AudioStream" uid="uid://k6kpdj1kv0jg" path="res://Assets/Sounds/splat.ogg" id="15_w7mkq"] +[ext_resource type="Texture2D" uid="uid://khq0ujwl6xrt" path="res://Assets/Sprites/Characters/doc-legionary.png" id="16_vtfwo"] +[ext_resource type="Script" path="res://Items/Inventory.cs" id="17_5rur0"] +[ext_resource type="PackedScene" uid="uid://p7oijq6dbvvk" path="res://Items/Weapons/DocLance.tscn" id="18_jblpi"] +[ext_resource type="PackedScene" uid="uid://cjgxyhgcyvsv7" path="res://BoundingBoxes/Hurtbox.tscn" id="20_dwjfv"] + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_2fq6c"] +resource_local_to_scene = true +shader = ExtResource("1_hvgeb") +shader_parameter/color = Vector4(1, 1, 1, 1) +shader_parameter/intensity = 0.0 +shader_parameter/alpha_modulate = 1.0 + +[sub_resource type="Animation" id="Animation_rqtrh"] +length = 0.001 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +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": [0] +} + +[sub_resource type="Animation" id="Animation_qws2q"] +resource_name = "idle" +length = 0.8 +loop_mode = 1 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +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": [0] +} + +[sub_resource type="Animation" id="Animation_dwyme"] +resource_name = "move" +length = 0.6 +loop_mode = 1 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +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, 0.3, 0.4, 0.5), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1), +"update": 1, +"values": [1, 2, 3, 4, 5, 6] +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_uqsue"] +_data = { +"RESET": SubResource("Animation_rqtrh"), +"idle": SubResource("Animation_qws2q"), +"move": SubResource("Animation_dwyme") +} + +[sub_resource type="Animation" id="Animation_adxyh"] +resource_local_to_scene = true +length = 0.001 + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_sxq14"] +_data = { +"RESET": SubResource("Animation_adxyh") +} + +[sub_resource type="Animation" id="Animation_k6l16"] +length = 0.001 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath(".:material:shader_parameter/intensity") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath(".:material:shader_parameter/alpha_modulate") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [1.0] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("Effects/DeathParticles:emitting") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [false] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("Effects/HurtParticles:emitting") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [false] +} +tracks/4/type = "value" +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/path = NodePath("Sprites/Node2D/Character:frame") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [8] +} + +[sub_resource type="Animation" id="Animation_lhc4c"] +resource_name = "death" +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Effects/DeathParticles:emitting") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [true] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath(".:material:shader_parameter/alpha_modulate") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0, 0.1), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [1.0, 0.0] +} + +[sub_resource type="Animation" id="Animation_0vgmg"] +resource_local_to_scene = true +resource_name = "hurt" +length = 0.2 +step = 0.05 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath(".:material:shader_parameter/intensity") +tracks/0/interp = 2 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.05, 0.1, 0.2), +"transitions": PackedFloat32Array(4, 4, 4, 4), +"update": 0, +"values": [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), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [true] +} +tracks/2/type = "method" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("Effects/HurtParticles") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0.1), +"transitions": PackedFloat32Array(1), +"values": [{ +"args": [], +"method": &"restart" +}] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = false +tracks/3/path = NodePath("Sprites/Node2D/Character:frame") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [8] +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_rc55s"] +_data = { +"RESET": SubResource("Animation_k6l16"), +"death": SubResource("Animation_lhc4c"), +"hurt": SubResource("Animation_0vgmg") +} + +[sub_resource type="Animation" id="Animation_7j54f"] +length = 0.001 + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_kks2p"] +_data = { +"RESET": SubResource("Animation_7j54f"), +"stun": ExtResource("10_oplmj") +} + +[sub_resource type="CanvasTexture" id="CanvasTexture_pited"] +diffuse_texture = ExtResource("14_88n3w") + +[sub_resource type="Gradient" id="Gradient_b2o0f"] +colors = PackedColorArray(1, 1, 1, 1, 1, 1, 1, 0) + +[sub_resource type="GradientTexture1D" id="GradientTexture1D_iyaih"] +gradient = SubResource("Gradient_b2o0f") + +[sub_resource type="Curve" id="Curve_30p4b"] +_data = [Vector2(0, 0), 0.0, 0.0, 0, 0, Vector2(0.2, 1), 0.0, 0.0, 0, 0, Vector2(1, 0.5), 0.0, 0.0, 0, 0] +point_count = 3 + +[sub_resource type="CurveTexture" id="CurveTexture_5uulw"] +curve = SubResource("Curve_30p4b") + +[sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_qdhau"] +particle_flag_disable_z = true +spread = 180.0 +gravity = Vector3(0, 0, 0) +initial_velocity_min = 32.0 +initial_velocity_max = 32.0 +angular_velocity_min = 90.0 +angular_velocity_max = 90.0 +orbit_velocity_min = 0.0 +orbit_velocity_max = 0.0 +linear_accel_min = -64.0 +linear_accel_max = -32.0 +tangential_accel_min = 8.0 +tangential_accel_max = 8.0 +scale_min = 0.13 +scale_max = 0.25 +scale_curve = SubResource("CurveTexture_5uulw") +color = Color(1, 0, 0, 1) +color_ramp = SubResource("GradientTexture1D_iyaih") + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_bfqew"] +size = Vector2(12, 8) + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_1gjgc"] +size = Vector2(12, 16) + +[node name="Legionary" type="CharacterBody2D" node_paths=PackedStringArray("DefaultSelectedItem", "ThinkerStateMachine", "Sprite", "Inventory", "StateMachine", "Hurtbox")] +y_sort_enabled = true +texture_filter = 3 +material = SubResource("ShaderMaterial_2fq6c") +collision_layer = 6 +collision_mask = 17 +script = ExtResource("2_h5w5n") +DefaultSelectedItem = NodePath("Inventory/DocLance") +ThinkerStateMachine = NodePath("ThinkerStateMachine") +Speed = 56.0 +Health = 170.0 +Sprite = NodePath("Sprites/Node2D/Character") +Inventory = NodePath("Inventory") +StateMachine = NodePath("StateMachine") +Hurtbox = NodePath("Hurtbox") + +[node name="StateMachine" type="Node" parent="." node_paths=PackedStringArray("InitialState", "Character")] +script = ExtResource("3_04p3j") +InitialState = NodePath("Idle") +Character = NodePath("..") + +[node name="Idle" type="Node" parent="StateMachine" node_paths=PackedStringArray("MoveState", "Character")] +script = ExtResource("4_1ngkf") +MoveState = NodePath("../Move") +Character = NodePath("../..") + +[node name="Move" type="Node" parent="StateMachine" node_paths=PackedStringArray("IdleState", "Character")] +script = ExtResource("5_wcpa1") +IdleState = NodePath("../Idle") +Character = NodePath("../..") + +[node name="ThinkerStateMachine" type="Node" parent="." node_paths=PackedStringArray("InitialState")] +script = ExtResource("6_121gp") +InitialState = NodePath("Idle") + +[node name="Attack" type="Node" parent="ThinkerStateMachine" node_paths=PackedStringArray("PassiveState", "PursueState", "NPC")] +script = ExtResource("8_8a6v2") +MaxDistanceToTarget = 128.0 +UseItemDistance = 64.0 +PassiveState = NodePath("../Idle") +PursueState = NodePath("../Idle") +NPC = NodePath("../..") + +[node name="Idle" type="Node" parent="ThinkerStateMachine" node_paths=PackedStringArray("PursueState", "NavigationAgent", "NPC")] +script = ExtResource("9_ewnq3") +PursueState = NodePath("../Attack") +MinTargetDistance = 24.0 +PursueOnLineOfSight = true +MinLineOfSightDistance = 256.0 +ShouldReturnToOriginalPosition = true +NavigationAgent = NodePath("../../NavigationAgent2D") +NPC = NodePath("../..") + +[node name="NavigationAgent2D" type="NavigationAgent2D" parent="."] +target_desired_distance = 16.0 +debug_enabled = true + +[node name="Animations" type="Node" parent="."] +script = ExtResource("9_ssmee") + +[node name="Movement" type="AnimationPlayer" parent="Animations"] +libraries = { +"": SubResource("AnimationLibrary_uqsue") +} + +[node name="Attack" type="AnimationPlayer" parent="Animations"] +libraries = { +"": SubResource("AnimationLibrary_sxq14") +} + +[node name="Hurt" type="AnimationPlayer" parent="Animations"] +root_node = NodePath("../..") +libraries = { +"": SubResource("AnimationLibrary_rc55s") +} + +[node name="Stun" type="AnimationPlayer" parent="Animations"] +libraries = { +"": SubResource("AnimationLibrary_kks2p") +} + +[node name="Effects" type="Node2D" parent="."] + +[node name="HurtParticles" type="GPUParticles2D" parent="Effects"] +position = Vector2(0, -8) +emitting = false +process_material = ExtResource("11_qcw5x") +texture = ExtResource("12_rlelw") +lifetime = 0.4 +one_shot = true +explosiveness = 1.0 + +[node name="DeathParticles" type="GPUParticles2D" parent="Effects"] +emitting = false +amount = 32 +process_material = ExtResource("13_kgmsk") +texture = SubResource("CanvasTexture_pited") +lifetime = 2.0 +one_shot = true +preprocess = 0.1 +explosiveness = 0.9 + +[node name="SpawnParticles" type="GPUParticles2D" parent="Effects"] +emitting = false +amount = 24 +process_material = SubResource("ParticleProcessMaterial_qdhau") +texture = ExtResource("14_88n3w") + +[node name="HurtSound" type="AudioStreamPlayer2D" parent="Effects"] +stream = ExtResource("15_w7mkq") + +[node name="Sprites" type="Node2D" parent="."] +y_sort_enabled = true +use_parent_material = true +position = Vector2(-0.5, 0) +rotation = 6.28319 + +[node name="Node2D" type="Node2D" parent="Sprites"] +use_parent_material = true + +[node name="Character" type="Sprite2D" parent="Sprites/Node2D"] +use_parent_material = true +texture = ExtResource("16_vtfwo") +offset = Vector2(0, -12) +hframes = 7 + +[node name="CollisionShape2D" type="CollisionShape2D" parent="."] +position = Vector2(0, -4) +shape = SubResource("RectangleShape2D_bfqew") + +[node name="Inventory" type="Node2D" parent="."] +position = Vector2(0, -4) +script = ExtResource("17_5rur0") + +[node name="DocLance" parent="Inventory" instance=ExtResource("18_jblpi")] +position = Vector2(0, 4) + +[node name="Hurtbox" parent="." instance=ExtResource("20_dwjfv")] + +[node name="CollisionShape2D" parent="Hurtbox" index="0"] +position = Vector2(0, -8) +shape = SubResource("RectangleShape2D_1gjgc") + +[editable path="Hurtbox"] diff --git a/Characters/Player.tscn b/Characters/Player.tscn index f81f2e6..25ddeb9 100644 --- a/Characters/Player.tscn +++ b/Characters/Player.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=61 format=3 uid="uid://b2254pup8k161"] +[gd_scene load_steps=63 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"] @@ -28,6 +28,8 @@ [ext_resource type="Texture2D" uid="uid://d1ukste16yq6v" path="res://Assets/Sprites/Particles/player-light.png" id="15_3hahh"] [ext_resource type="Script" path="res://Utils/DamageTime.cs" id="15_4xl06"] [ext_resource type="PackedScene" uid="uid://g7wfcubs6bdd" path="res://Items/Weapons/Railgun.tscn" id="21_n8w32"] +[ext_resource type="PackedScene" uid="uid://5y1acxl4j4n7" path="res://Items/Weapons/Pugio.tscn" id="22_mqpn7"] +[ext_resource type="PackedScene" uid="uid://d1d4vg7we5rjr" path="res://Items/Weapons/Shotgun.tscn" id="22_rmciq"] [sub_resource type="ShaderMaterial" id="ShaderMaterial_h78y7"] shader = ExtResource("2_ngsgt") @@ -479,6 +481,7 @@ label_settings = SubResource("LabelSettings_q5h1n") horizontal_alignment = 1 [node name="Inventory" type="Node2D" parent="."] +y_sort_enabled = true position = Vector2(0, -4) script = ExtResource("7_xyenu") InventoryMap = { @@ -486,15 +489,12 @@ InventoryMap = { "equip_2": 1 } +[node name="Sword" parent="Inventory" instance=ExtResource("22_mqpn7")] + +[node name="Shotgun" parent="Inventory" instance=ExtResource("22_rmciq")] + [node name="Node2D" parent="Inventory" instance=ExtResource("7_4rxuv")] visible = false -InitialVelocity = 0.0 -ShouldFreezeAngleOnUse = true -MinDistanceHint = 0.0 -MaxDistanceHint = 0.0 -ItemName = "" -Description = "" -CanStack = false [node name="Railgun" parent="Inventory" instance=ExtResource("21_n8w32")] UseTime = 0.2 diff --git a/Characters/doc-cultist.tscn b/Characters/doc-cultist.tscn index 8d669c7..27852da 100644 --- a/Characters/doc-cultist.tscn +++ b/Characters/doc-cultist.tscn @@ -393,21 +393,17 @@ material = SubResource("ShaderMaterial_2fq6c") collision_layer = 6 collision_mask = 17 script = ExtResource("2_l16dp") -PreferredWeightDistance = null -MaxWeightDistance = null DefaultSelectedItem = NodePath("Inventory/ProjectileSpawner") ShouldMoveWhenUsingItem = false ThinkerStateMachine = NodePath("ThinkerStateMachine") Speed = 40.0 Friction = 8.0 Mass = 0.5 -Stealth = null Health = 170.0 Sprite = NodePath("Sprites/Node2D/Character") Inventory = NodePath("Inventory") StateMachine = NodePath("StateMachine") Hurtbox = NodePath("Hurtbox") -Faction = null [node name="StateMachine" type="Node" parent="." node_paths=PackedStringArray("InitialState", "Character")] script = ExtResource("3_lj2a2") @@ -433,25 +429,19 @@ script = ExtResource("7_q01ij") NavigationAgent = NodePath("../../NavigationAgent2D") AttackState = NodePath("../Attack") MinDistanceToTarget = 96.0 -MaxDistanceFromOrigin = null -LastSeenPosition = null ThinkDelta = 0.05 NPC = NodePath("../..") [node name="Attack" type="Node" parent="ThinkerStateMachine" node_paths=PackedStringArray("PassiveState", "PursueState", "NPC")] script = ExtResource("8_woh6n") -PreferredWeightDistance = null -MaxWeightDistance = null MaxDistanceToTarget = 128.0 PassiveState = NodePath("../Pursue") PursueState = NodePath("../Pursue") -ThinkDelta = null NPC = NodePath("../..") [node name="Idle" type="Node" parent="ThinkerStateMachine"] [node name="NavigationAgent2D" type="NavigationAgent2D" parent="."] -path_postprocessing = 1 debug_enabled = true [node name="Animations" type="Node" parent="."] @@ -527,31 +517,17 @@ hframes = 6 position = Vector2(0, -4) shape = SubResource("RectangleShape2D_bfqew") -[node name="Inventory" type="Node2D" parent="." node_paths=PackedStringArray("Items")] +[node name="Inventory" type="Node2D" parent="."] position = Vector2(0, -4) script = ExtResource("17_sjq8t") -Items = [] [node name="ProjectileSpawner" parent="Inventory" instance=ExtResource("17_dmlbb")] Projectile = ExtResource("18_lwg36") ShouldOverrideProjectileDamage = false ShouldRotate = false -AngleDeviation = null -ChargeTime = null -Damage = null UseTime = 2.0 -Knockback = null -InitialVelocity = null -ShouldHideIdle = null -ShouldFreezeAngleOnUse = null -MinDistanceHint = null -MaxDistanceHint = null -ItemName = null -Description = null -CanStack = null [node name="Hurtbox" parent="." instance=ExtResource("18_ajs2x")] -Faction = null [node name="CollisionShape2D" parent="Hurtbox" index="0"] position = Vector2(0, -8) diff --git a/Entities/Bullet.cs b/Entities/Bullet.cs new file mode 100644 index 0000000..8a914bf --- /dev/null +++ b/Entities/Bullet.cs @@ -0,0 +1,5 @@ +namespace SupaLidlGame.Entities; + +public partial class Bullet : Projectile +{ +} diff --git a/Extensions/AnimationPlayer.cs b/Extensions/AnimationPlayer.cs index 8f736d8..0576b37 100644 --- a/Extensions/AnimationPlayer.cs +++ b/Extensions/AnimationPlayer.cs @@ -1,5 +1,7 @@ using Godot; +namespace SupaLidlGame.Extensions; + public static class AnimationPlayerExtensions { public static bool TryPlay(this AnimationPlayer player, string name) diff --git a/Items/Item.cs b/Items/Item.cs index d717582..0d32169 100644 --- a/Items/Item.cs +++ b/Items/Item.cs @@ -49,4 +49,14 @@ public abstract partial class Item : Node2D public abstract void Use(); public abstract void Deuse(); + + public virtual void UseAlt() + { + + } + + public virtual void DeuseAlt() + { + + } } diff --git a/Items/Weapon.cs b/Items/Weapon.cs index 26d74eb..29146b5 100644 --- a/Items/Weapon.cs +++ b/Items/Weapon.cs @@ -8,7 +8,11 @@ public abstract partial class Weapon : Item { public double RemainingUseTime { get; protected set; } = 0; - public override bool IsUsing => RemainingUseTime > 0; + public override bool IsUsing => IsUsingPrimary || IsUsingAlt; + + public virtual bool IsUsingPrimary => false; + + public virtual bool IsUsingAlt => false; /// /// How much damage in HP that this weapon deals. @@ -23,6 +27,9 @@ public abstract partial class Weapon : Item [Export] public double UseTime { get; set; } = 0; + [Export] + public double UseAltTime { get; set; } = 0; + /// /// The magnitude of the knockback force of the weapon. /// diff --git a/Items/Weapons/DocLance.tscn b/Items/Weapons/DocLance.tscn index 6db849d..3e39e34 100644 --- a/Items/Weapons/DocLance.tscn +++ b/Items/Weapons/DocLance.tscn @@ -207,9 +207,9 @@ Description = "\"Violence. Speed. Momentum.\"" script = ExtResource("2_c41ov") InitialState = NodePath("Idle") -[node name="Idle" type="Node" parent="State" node_paths=PackedStringArray("AnticipateState", "Sword")] +[node name="Idle" type="Node" parent="State" node_paths=PackedStringArray("UseState", "Sword")] script = ExtResource("3_sxffm") -AnticipateState = NodePath("../Anticipate") +UseState = NodePath("../Anticipate") Sword = NodePath("../..") [node name="Anticipate" type="Node" parent="State" node_paths=PackedStringArray("Sword", "AttackState")] diff --git a/Items/Weapons/ProjectileSpawner.cs b/Items/Weapons/ProjectileSpawner.cs index 82f80ac..fb0a800 100644 --- a/Items/Weapons/ProjectileSpawner.cs +++ b/Items/Weapons/ProjectileSpawner.cs @@ -10,6 +10,9 @@ public partial class ProjectileSpawner : Ranged [Export] public bool ShouldOverrideProjectileDamage { get; set; } = true; + [Export] + public bool ShouldOverrideVelocity { get; set; } = true; + [Export] public bool ShouldRotate { get; set; } = true; @@ -20,6 +23,7 @@ public partial class ProjectileSpawner : Ranged projectile.Hitbox.Faction = Character.Faction; projectile.Direction = Character.Target.Normalized(); projectile.GlobalPosition = GlobalPosition; + projectile.Speed = InitialVelocity; if (ShouldRotate) { diff --git a/Items/Weapons/Pugio.tscn b/Items/Weapons/Pugio.tscn new file mode 100644 index 0000000..537c847 --- /dev/null +++ b/Items/Weapons/Pugio.tscn @@ -0,0 +1,463 @@ +[gd_scene load_steps=26 format=3 uid="uid://5y1acxl4j4n7"] + +[ext_resource type="Script" path="res://Items/Weapons/Sword.cs" id="1_mai31"] +[ext_resource type="Script" path="res://State/Weapon/WeaponStateMachine.cs" id="2_5ramr"] +[ext_resource type="Script" path="res://State/Weapon/SwordIdleState.cs" id="3_fwkit"] +[ext_resource type="Script" path="res://State/Weapon/SwordAnticipateState.cs" id="4_nsn1q"] +[ext_resource type="Script" path="res://State/Weapon/SwordAttackState.cs" id="5_g1en5"] +[ext_resource type="Texture2D" uid="uid://dfpe74vxvuwal" path="res://Assets/Sprites/Items/pugio.png" id="6_d28k5"] +[ext_resource type="Script" path="res://State/Weapon/SwordBlockState.cs" id="6_yvm8x"] +[ext_resource type="Material" uid="uid://cbfaqolx1ydvv" path="res://Assets/Sprites/Particles/ParryParticles.tres" id="8_we1sv"] +[ext_resource type="PackedScene" uid="uid://du5vhccg75nrq" path="res://BoundingBoxes/Hitbox.tscn" id="9_qimey"] +[ext_resource type="Texture2D" uid="uid://ct0m4lk2icx3p" path="res://Assets/Sprites/sword-swing-small.png" id="10_q8b54"] +[ext_resource type="Shader" path="res://Shaders/Flash.gdshader" id="11_b1fwx"] +[ext_resource type="Texture2D" uid="uid://417j1ckcjg2i" path="res://Assets/Sprites/Items/doc-shield.png" id="11_qpejo"] +[ext_resource type="AudioStream" uid="uid://qvthq6tppp63" path="res://Assets/Sounds/whoosh.wav" id="12_a8o3x"] +[ext_resource type="AudioStream" uid="uid://c4n7ioxpukdwi" path="res://Assets/Sounds/parry.wav" id="13_t5wmj"] + +[sub_resource type="Environment" id="Environment_72txp"] +background_mode = 3 +glow_enabled = true +glow_hdr_threshold = 1.42 + +[sub_resource type="Animation" id="Animation_b7327"] +length = 0.001 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Anchor:rotation") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [3.14159] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("SwingSprite:frame") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [0] +} +tracks/2/type = "method" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath(".") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"values": [{ +"args": ["is_alternate", false], +"method": &"SetAnimationCondition" +}] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("SwingSprite:modulate") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Color(2, 2, 2, 1)] +} +tracks/4/type = "value" +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/path = NodePath("Anchor/Node2D/Sprite2D:visible") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [false] +} +tracks/5/type = "value" +tracks/5/imported = false +tracks/5/enabled = true +tracks/5/path = NodePath("Shield:scale") +tracks/5/interp = 1 +tracks/5/loop_wrap = true +tracks/5/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(1, 1)] +} +tracks/6/type = "value" +tracks/6/imported = false +tracks/6/enabled = true +tracks/6/path = NodePath("Shield:material:shader_parameter/intensity") +tracks/6/interp = 1 +tracks/6/loop_wrap = true +tracks/6/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} + +[sub_resource type="Animation" id="Animation_ameas"] +resource_name = "anticipate" +length = 0.1 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Anchor:rotation") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(0.933033), +"update": 1, +"values": [3.14159] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Anchor/Node2D/Sprite2D:visible") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [true] +} + +[sub_resource type="Animation" id="Animation_bj2ky"] +resource_name = "anticipate_alternate" +length = 0.1 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Anchor:rotation") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [2.35619] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Anchor/Node2D:rotation") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [3.14159] +} + +[sub_resource type="Animation" id="Animation_b8r8j"] +resource_name = "anticipate_bot" + +[sub_resource type="Animation" id="Animation_6jphj"] +resource_name = "attack" +length = 0.5 +step = 0.05 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Anchor:rotation") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.35), +"transitions": PackedFloat32Array(1, 1), +"update": 1, +"values": [0.0, 1.5708] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("SwingSprite:frame") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0, 0.2, 0.25), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 1, +"values": [1, 2, 0] +} +tracks/2/type = "method" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath(".") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(), +"transitions": PackedFloat32Array(), +"values": [] +} +tracks/3/type = "method" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("SwingSound") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0.1), +"transitions": PackedFloat32Array(1), +"values": [{ +"args": [0.0], +"method": &"play" +}] +} +tracks/4/type = "value" +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/path = NodePath("Anchor/Node2D/Sprite2D:visible") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/keys = { +"times": PackedFloat32Array(0, 0.35), +"transitions": PackedFloat32Array(1, 1), +"update": 1, +"values": [true, false] +} + +[sub_resource type="Animation" id="Animation_pclfs"] +resource_name = "attack_alternate" +step = 0.05 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Anchor:rotation") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.15, 0.35), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 1, +"values": [1.5708, -1.5708, -1.5708] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("SwingSprite:frame") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0.1, 0.3, 0.35), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 1, +"values": [3, 4, 0] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = false +tracks/2/path = NodePath("Anchor:position") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0, 0.1, 0.35), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 1, +"values": [Vector2(0, 0), Vector2(0, -4), Vector2(0, 0)] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("Anchor/Node2D:rotation") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0, 0.15), +"transitions": PackedFloat32Array(1, 1), +"update": 1, +"values": [3.14159, 0.785398] +} +tracks/4/type = "method" +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/path = NodePath(".") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/keys = { +"times": PackedFloat32Array(0.2), +"transitions": PackedFloat32Array(1), +"values": [{ +"args": ["is_alternate", false], +"method": &"SetAnimationCondition" +}] +} + +[sub_resource type="Animation" id="Animation_x1aou"] +resource_name = "block" +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Shield:scale") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.5, 1), +"transitions": PackedFloat32Array(1, 0.25, 1), +"update": 0, +"values": [Vector2(1.4, 1.4), Vector2(1.4, 1.4), Vector2(1, 1)] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Shield:material:shader_parameter/intensity") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0, 0.5, 1), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [1.0, 1.0, 0.0] +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_11u25"] +_data = { +"RESET": SubResource("Animation_b7327"), +"anticipate": SubResource("Animation_ameas"), +"anticipate_alternate": SubResource("Animation_bj2ky"), +"anticipate_bot": SubResource("Animation_b8r8j"), +"attack": SubResource("Animation_6jphj"), +"attack_alternate": SubResource("Animation_pclfs"), +"block": SubResource("Animation_x1aou") +} + +[sub_resource type="ConvexPolygonShape2D" id="ConvexPolygonShape2D_ycxcw"] +points = PackedVector2Array(0, 0, -30, 0, -21.213, -21.213, 0, -30, 21.213, -21.213, 30, 0, 0, 0) + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_rgypv"] +resource_local_to_scene = true +shader = ExtResource("11_b1fwx") +shader_parameter/color = Quaternion(1, 1, 1, 1) +shader_parameter/intensity = 0.0 +shader_parameter/alpha_modulate = 1.0 + +[node name="Pugio" type="Node2D" node_paths=PackedStringArray("Hitbox", "AnimationPlayer", "ParryParticles", "StateMachine", "Anchor", "HandAnchor")] +y_sort_enabled = true +texture_filter = 3 +script = ExtResource("1_mai31") +Hitbox = NodePath("Hitbox") +AnimationPlayer = NodePath("AnimationPlayer") +AttackTime = 0.2 +AttackAltTime = 0.75 +AttackAnimationDuration = 0.5 +ParryParticles = NodePath("Anchor/Node2D/Sprite2D/ParryParticles") +NPCAnticipateTime = 0.3 +StateMachine = NodePath("State") +Anchor = NodePath("Anchor") +Damage = 20.0 +UseTime = 0.55 +UseAltTime = 1.5 +Knockback = 64.0 +HandAnchor = NodePath("Anchor/Node2D/Sprite2D/Hand") + +[node name="State" type="Node" parent="." node_paths=PackedStringArray("InitialState")] +script = ExtResource("2_5ramr") +InitialState = NodePath("Idle") + +[node name="Idle" type="Node" parent="State" node_paths=PackedStringArray("UseState", "UseAltState", "Sword")] +script = ExtResource("3_fwkit") +UseState = NodePath("../Anticipate") +UseAltState = NodePath("../Block") +Sword = NodePath("../..") + +[node name="Anticipate" type="Node" parent="State" node_paths=PackedStringArray("Sword", "AttackState")] +script = ExtResource("4_nsn1q") +Sword = NodePath("../..") +AttackState = NodePath("../Attack") + +[node name="Attack" type="Node" parent="State" node_paths=PackedStringArray("Sword", "IdleState")] +script = ExtResource("5_g1en5") +Sword = NodePath("../..") +IdleState = NodePath("../Idle") + +[node name="Block" type="Node" parent="State" node_paths=PackedStringArray("Sword", "IdleState", "UseState")] +script = ExtResource("6_yvm8x") +Sword = NodePath("../..") +IdleState = NodePath("../Idle") +UseState = NodePath("../Anticipate") +BlockAnimKey = "block" + +[node name="WorldEnvironment" type="WorldEnvironment" parent="."] +environment = SubResource("Environment_72txp") + +[node name="Anchor" type="Node2D" parent="."] +y_sort_enabled = true +rotation = 3.14159 + +[node name="Node2D" type="Node2D" parent="Anchor"] +y_sort_enabled = true +position = Vector2(0, -20) + +[node name="Sprite2D" type="Sprite2D" parent="Anchor/Node2D"] +visible = false +y_sort_enabled = true +texture = ExtResource("6_d28k5") + +[node name="ParryParticles" type="GPUParticles2D" parent="Anchor/Node2D/Sprite2D"] +modulate = Color(1.2, 1.2, 1.2, 1) +position = Vector2(-0.221825, -3.12132) +rotation = 0.785398 +emitting = false +amount = 16 +process_material = ExtResource("8_we1sv") +lifetime = 2.0 +one_shot = true +explosiveness = 1.0 +trail_enabled = true +trail_lifetime = 0.1 +trail_sections = 4 + +[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_11u25") +} + +[node name="Hitbox" parent="." instance=ExtResource("9_qimey")] +IsDisabled = true + +[node name="CollisionShape2D" parent="Hitbox" index="0"] +rotation = 1.5708 +shape = SubResource("ConvexPolygonShape2D_ycxcw") +disabled = true + +[node name="SwingSprite" type="Sprite2D" parent="."] +modulate = Color(2, 2, 2, 1) +texture = ExtResource("10_q8b54") +hframes = 3 + +[node name="Shield" type="Sprite2D" parent="."] +y_sort_enabled = true +material = SubResource("ShaderMaterial_rgypv") +position = Vector2(7, 8) +texture = ExtResource("11_qpejo") +offset = Vector2(0, -12) + +[node name="SwingSound" type="AudioStreamPlayer2D" parent="."] +stream = ExtResource("12_a8o3x") +pitch_scale = 1.2 + +[node name="ParrySound" type="AudioStreamPlayer2D" parent="."] +stream = ExtResource("13_t5wmj") + +[editable path="Hitbox"] diff --git a/Items/Weapons/Ranged.cs b/Items/Weapons/Ranged.cs index 06af707..5c324b1 100644 --- a/Items/Weapons/Ranged.cs +++ b/Items/Weapons/Ranged.cs @@ -13,7 +13,7 @@ public abstract partial class Ranged : Weapon [Export] public State.Weapon.WeaponStateMachine StateMachine { get; set; } - public override bool IsUsing => StateMachine.CurrentState + public override bool IsUsingPrimary => StateMachine.CurrentState is State.Weapon.RangedFireState; public bool IsChargeable => ChargeTime > 0; diff --git a/Items/Weapons/Shotgun.tscn b/Items/Weapons/Shotgun.tscn new file mode 100644 index 0000000..4b04822 --- /dev/null +++ b/Items/Weapons/Shotgun.tscn @@ -0,0 +1,216 @@ +[gd_scene load_steps=18 format=3 uid="uid://d1d4vg7we5rjr"] + +[ext_resource type="Script" path="res://Items/Weapons/ProjectileSpawner.cs" id="1_4xyyt"] +[ext_resource type="Script" path="res://State/Weapon/WeaponStateMachine.cs" id="2_ag6rd"] +[ext_resource type="PackedScene" uid="uid://bqvseo3sbs1aj" path="res://Entities/RailBeam.tscn" id="2_k2n4h"] +[ext_resource type="Script" path="res://State/Weapon/RangedIdleState.cs" id="3_dd6bh"] +[ext_resource type="Script" path="res://State/Weapon/RangedFireState.cs" id="4_bwqd6"] +[ext_resource type="Texture2D" uid="uid://b1omx2kdb2x1n" path="res://Assets/Sprites/Items/shotgun.png" id="5_g8d45"] +[ext_resource type="Texture2D" uid="uid://c1a7lvb4uuwfy" path="res://Assets/Sprites/Particles/circle-16.png" id="6_va8ee"] +[ext_resource type="AudioStream" uid="uid://5fybh24xashp" path="res://Assets/Sounds/shotgun.wav" id="7_ucxp5"] + +[sub_resource type="Animation" id="Animation_i0e06"] +resource_name = "fire" +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Sprite2D:position") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.2), +"transitions": PackedFloat32Array(1, 1), +"update": 1, +"values": [Vector2(-4, 0), Vector2(0, 0)] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("GPUParticles2D:emitting") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0, 0.2), +"transitions": PackedFloat32Array(1, 1), +"update": 1, +"values": [true, false] +} +tracks/2/type = "audio" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("AudioStreamPlayer2D") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"clips": [{ +"end_offset": 0.0, +"start_offset": 0.0, +"stream": ExtResource("7_ucxp5") +}], +"times": PackedFloat32Array(0) +} +tracks/2/use_blend = true +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("Sprite2D:rotation") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0.5, 1), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [0.0, 6.28319] +} + +[sub_resource type="Animation" id="Animation_sqn2o"] +resource_name = "idle" +length = 0.1 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Sprite2D:position") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(0, 0)] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Sprite2D:rotation") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} + +[sub_resource type="Animation" id="Animation_vijrc"] +length = 0.001 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Sprite2D:position") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(0, 0)] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("GPUParticles2D:emitting") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [false] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("Sprite2D:rotation") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_si0kh"] +_data = { +"RESET": SubResource("Animation_vijrc"), +"fire": SubResource("Animation_i0e06"), +"idle": SubResource("Animation_sqn2o") +} + +[sub_resource type="Gradient" id="Gradient_uphon"] +colors = PackedColorArray(1, 1, 1, 0.498039, 1, 1, 1, 0) + +[sub_resource type="GradientTexture1D" id="GradientTexture1D_83h4s"] +gradient = SubResource("Gradient_uphon") + +[sub_resource type="Curve" id="Curve_mqgo6"] +_data = [Vector2(0.5, 1), 0.0, 0.0, 0, 0, Vector2(1, 0), 0.0, 0.0, 0, 0] +point_count = 2 + +[sub_resource type="CurveTexture" id="CurveTexture_3omj5"] +curve = SubResource("Curve_mqgo6") + +[sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_uexo4"] +particle_flag_disable_z = true +direction = Vector3(0, -1, 0) +spread = 90.0 +gravity = Vector3(0, -4, 0) +initial_velocity_min = 3.0 +initial_velocity_max = 4.0 +orbit_velocity_min = 0.0 +orbit_velocity_max = 0.0 +scale_min = 0.1 +scale_max = 0.1 +scale_curve = SubResource("CurveTexture_3omj5") +color_ramp = SubResource("GradientTexture1D_83h4s") + +[node name="Shotgun" type="Node2D" node_paths=PackedStringArray("StateMachine")] +script = ExtResource("1_4xyyt") +Projectile = ExtResource("2_k2n4h") +StateMachine = NodePath("State") +Damage = 20.0 +UseTime = 1.0 +InitialVelocity = 256.0 + +[node name="State" type="Node" parent="." node_paths=PackedStringArray("InitialState")] +script = ExtResource("2_ag6rd") +InitialState = NodePath("Idle") + +[node name="Idle" type="Node" parent="State" node_paths=PackedStringArray("FireState", "Weapon", "AnimationPlayer")] +script = ExtResource("3_dd6bh") +FireState = NodePath("../Fire") +Weapon = NodePath("../..") +AnimationPlayer = NodePath("../../AnimationPlayer") +AnimationKey = "idle" + +[node name="Fire" type="Node" parent="State" node_paths=PackedStringArray("Weapon", "IdleState", "AnimationPlayer")] +script = ExtResource("4_bwqd6") +Weapon = NodePath("../..") +IdleState = NodePath("../Idle") +AnimationPlayer = NodePath("../../AnimationPlayer") +AnimationKey = "fire" + +[node name="Sprite2D" type="Sprite2D" parent="."] +texture_filter = 1 +texture = ExtResource("5_g8d45") +centered = false +offset = Vector2(0, -2) + +[node name="AnimationPlayer" type="AnimationPlayer" parent="."] +libraries = { +"": SubResource("AnimationLibrary_si0kh") +} + +[node name="GPUParticles2D" type="GPUParticles2D" parent="."] +position = Vector2(16, -1) +emitting = false +amount = 4 +process_material = SubResource("ParticleProcessMaterial_uexo4") +texture = ExtResource("6_va8ee") +lifetime = 0.5 +one_shot = true +explosiveness = 1.0 + +[node name="AudioStreamPlayer2D" type="AudioStreamPlayer2D" parent="."] +max_distance = 256.0 +bus = &"Effects" diff --git a/Items/Weapons/Sword.cs b/Items/Weapons/Sword.cs index 2098562..178cd23 100644 --- a/Items/Weapons/Sword.cs +++ b/Items/Weapons/Sword.cs @@ -11,8 +11,13 @@ public partial class Sword : Weapon, IParryable { public bool IsAttacking { get; protected set; } - public override bool IsUsing => StateMachine.CurrentState - is SwordAttackState; + public override bool IsUsing => IsUsingPrimary || IsUsingAlt; + + public override bool IsUsingPrimary => StateMachine.CurrentState is + SwordAttackState; + + public override bool IsUsingAlt => StateMachine.CurrentState is + SwordBlockState; [Export] public Hitbox Hitbox { get; set; } @@ -30,6 +35,9 @@ public partial class Sword : Weapon, IParryable [Export] public double AttackTime { get; set; } = 0; + [Export] + public double AttackAltTime { get; set; } = 0; + [Export] public double AttackAnimationDuration { get; set; } @@ -64,17 +72,16 @@ public partial class Sword : Weapon, IParryable base.Unequip(character); } - public override void Use() + public void EnableParry() { - StateMachine.Use(); - base.Use(); + EnableParry(Time.GetTicksMsec()); } - public void EnableParry() + public void EnableParry(ulong parryTimeOrigin) { IsParried = false; IsParryable = true; - ParryTimeOrigin = Time.GetTicksMsec(); + ParryTimeOrigin = parryTimeOrigin; } public void DisableParry() @@ -82,14 +89,30 @@ public partial class Sword : Weapon, IParryable IsParryable = false; } + public override void Use() + { + StateMachine.Use(); + base.Use(); + } + public override void Deuse() { - //AnimationPlayer.Stop(); - //Deattack(); StateMachine.Deuse(); base.Deuse(); } + public override void UseAlt() + { + StateMachine.UseAlt(); + base.UseAlt(); + } + + public override void DeuseAlt() + { + StateMachine.DeuseAlt(); + base.DeuseAlt(); + } + public void Attack() { //RemainingAttackTime = AttackTime; @@ -130,7 +153,6 @@ public partial class Sword : Weapon, IParryable { if (box is Hurtbox hurtbox) { - GD.Print("LUL"); hurtbox.InflictDamage(Damage, Character, Knockback); } } @@ -145,10 +167,15 @@ public partial class Sword : Weapon, IParryable { // our character was parried ParryParticles.CloneOnWorld().EmitOneShot(); - } - else - { - otherParryable.Stun(); + Stun(); + + if (otherParryable is Sword sword) + { + if (sword.StateMachine.CurrentState is SwordBlockState b) + { + b.HasBlocked = true; + } + } } } } diff --git a/Items/Weapons/Sword.tscn b/Items/Weapons/Sword.tscn index 15cbbc3..c573b67 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"] @@ -351,6 +351,8 @@ states/use/position = Vector2(609, 75) transitions = ["Start", "anticipate", SubResource("AnimationNodeStateMachineTransition_esyoj"), "use", "RESET", SubResource("AnimationNodeStateMachineTransition_kg3rd"), "RESET", "anticipate", SubResource("AnimationNodeStateMachineTransition_twtoe"), "anticipate", "anticipate_bot", SubResource("AnimationNodeStateMachineTransition_73wvy"), "anticipate_bot", "use", SubResource("AnimationNodeStateMachineTransition_4wst0"), "anticipate", "use", SubResource("AnimationNodeStateMachineTransition_2lfol")] graph_offset = Vector2(0, -104.073) +[sub_resource type="AnimationNodeStateMachinePlayback" id="AnimationNodeStateMachinePlayback_37556"] + [node name="Sword" type="Node2D" node_paths=PackedStringArray("Hitbox", "AnimationPlayer", "ParryParticles", "StateMachine", "Anchor", "HandAnchor")] y_sort_enabled = true texture_filter = 3 @@ -366,36 +368,27 @@ Anchor = NodePath("Anchor") Damage = 20.0 UseTime = 0.55 Knockback = 64.0 -InitialVelocity = null ShouldHideIdle = true -ShouldFreezeAngleOnUse = null -MinDistanceHint = null -MaxDistanceHint = null HandAnchor = NodePath("Anchor/Node2D/Sprite2D/Hand") -ItemName = null -Description = null -CanStack = null [node name="State" type="Node" parent="." node_paths=PackedStringArray("InitialState")] script = ExtResource("2_vwirq") InitialState = NodePath("Idle") -[node name="Idle" type="Node" parent="State" node_paths=PackedStringArray("AnticipateState", "Sword")] +[node name="Idle" type="Node" parent="State" node_paths=PackedStringArray("UseState", "Sword")] script = ExtResource("3_nw6r0") -AnticipateState = NodePath("../Anticipate") +UseState = NodePath("../Anticipate") Sword = NodePath("../..") [node name="Anticipate" type="Node" parent="State" node_paths=PackedStringArray("Sword", "AttackState")] script = ExtResource("4_j3cud") Sword = NodePath("../..") AttackState = NodePath("../Attack") -HasAlternateAninmation = null [node name="Attack" type="Node" parent="State" node_paths=PackedStringArray("Sword", "IdleState")] script = ExtResource("5_hmisb") Sword = NodePath("../..") IdleState = NodePath("../Idle") -HasAlternateAnimation = null [node name="WorldEnvironment" type="WorldEnvironment" parent="."] environment = SubResource("Environment_72txp") @@ -409,7 +402,6 @@ position = Vector2(2.40734, -0.55655) rotation = 0.945464 width_curve = SubResource("Curve_4cxtp") gradient = SubResource("Gradient_2ablm") -Frequency = null [node name="Node2D" type="Node2D" parent="Anchor"] y_sort_enabled = true @@ -447,14 +439,11 @@ libraries = { tree_root = SubResource("AnimationNodeStateMachine_q4hbp") anim_player = NodePath("../AnimationPlayer") active = true +parameters/playback = SubResource("AnimationNodeStateMachinePlayback_37556") parameters/conditions/is_player = false [node name="Hitbox" parent="." instance=ExtResource("3_up3ob")] -priority = 5 -Damage = null IsDisabled = true -Knockback = null -Faction = null [node name="CollisionShape2D" parent="Hitbox" index="0"] position = Vector2(4, 0) diff --git a/Scenes/Maps/Arena.tscn b/Scenes/Maps/Arena.tscn index e4f4b96..546f2ed 100644 --- a/Scenes/Maps/Arena.tscn +++ b/Scenes/Maps/Arena.tscn @@ -11,7 +11,7 @@ [ext_resource type="PackedScene" uid="uid://dldnp8eunxj3q" path="res://BoundingBoxes/InteractionTrigger.tscn" id="9_3401j"] [ext_resource type="Script" path="res://BoundingBoxes/ConnectorBox.cs" id="9_fg062"] -[sub_resource type="ShaderMaterial" id="ShaderMaterial_4fu3e"] +[sub_resource type="ShaderMaterial" id="ShaderMaterial_tr5pw"] resource_local_to_scene = true shader = ExtResource("5_h8k5p") shader_parameter/color = Vector4(1, 1, 1, 1) @@ -113,7 +113,7 @@ visible = false position = Vector2(120, -112) [node name="Doc" parent="Entities" index="0" instance=ExtResource("4_ej0f3")] -material = SubResource("ShaderMaterial_4fu3e") +material = SubResource("ShaderMaterial_tr5pw") [node name="PointLight2D" type="PointLight2D" parent="Entities" index="1"] position = Vector2(168, -42) diff --git a/Scenes/Maps/ArenaExterior.tscn b/Scenes/Maps/ArenaExterior.tscn index a3f3d2e..512d13c 100644 --- a/Scenes/Maps/ArenaExterior.tscn +++ b/Scenes/Maps/ArenaExterior.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=46 format=3 uid="uid://c72uqjjtxpi3g"] +[gd_scene load_steps=53 format=3 uid="uid://dr3bcvql7burk"] [ext_resource type="PackedScene" uid="uid://clwv2owvk6abe" path="res://Scenes/BaseMap.tscn" id="1_ci4ij"] [ext_resource type="TileSet" uid="uid://l61kbx31ug4p" path="res://Scenes/Maps/ArenaTileset.tres" id="2_m6h7j"] @@ -26,6 +26,9 @@ [ext_resource type="PackedScene" uid="uid://c5i3cq1kewljv" path="res://Props/ArenaDoor.tscn" id="21_nvrif"] [ext_resource type="PackedScene" uid="uid://bs6xuujve2tsf" path="res://Props/ArenaDoorSwitch.tscn" id="22_ay852"] [ext_resource type="PackedScene" uid="uid://dhl071rj5wyvx" path="res://Entities/Campfire.tscn" id="23_mykt8"] +[ext_resource type="PackedScene" uid="uid://cdj50hb84aujp" path="res://Characters/DocLegionary.tscn" id="27_84gw4"] +[ext_resource type="Shader" path="res://Shaders/Flash.gdshader" id="28_b3suq"] +[ext_resource type="PackedScene" uid="uid://dhamcei7tfta8" path="res://Characters/DocCenturion.tscn" id="30_qfl2k"] [sub_resource type="Gradient" id="Gradient_jupxw"] offsets = PackedFloat32Array(0.00740741, 0.2, 1) @@ -158,6 +161,34 @@ size = Vector2(64, 97) [sub_resource type="RectangleShape2D" id="RectangleShape2D_5pcme"] size = Vector2(18, 6) +[sub_resource type="ShaderMaterial" id="ShaderMaterial_73smm"] +resource_local_to_scene = true +shader = ExtResource("28_b3suq") +shader_parameter/color = Vector4(1, 1, 1, 1) +shader_parameter/intensity = 0.0 +shader_parameter/alpha_modulate = 1.0 + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_o3w21"] +resource_local_to_scene = true +shader = ExtResource("28_b3suq") +shader_parameter/color = Vector4(1, 1, 1, 1) +shader_parameter/intensity = 0.0 +shader_parameter/alpha_modulate = 1.0 + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_gp117"] +resource_local_to_scene = true +shader = ExtResource("28_b3suq") +shader_parameter/color = Vector4(1, 1, 1, 1) +shader_parameter/intensity = 0.0 +shader_parameter/alpha_modulate = 1.0 + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_7e6lj"] +resource_local_to_scene = true +shader = ExtResource("28_b3suq") +shader_parameter/color = Vector4(1, 1, 1, 1) +shader_parameter/intensity = 0.0 +shader_parameter/alpha_modulate = 1.0 + [node name="ArenaExterior" instance=ExtResource("1_ci4ij")] tile_set = ExtResource("2_m6h7j") layer_0/tile_data = PackedInt32Array(-1703963, 393216, 0, -1703954, 393216, 0, -1703953, 458752, 2, -393224, 196608, 4, -262152, 196608, 4, -131080, 196608, 4, 196600, 196608, 4, 327672, 196608, 4, 458744, 196608, 4, -458759, 131072, 4, 589817, 458752, 4, -458757, 131072, 4, 589819, 458752, 4, -458755, 131072, 4, 589821, 458752, 4, -524286, 131072, 4, 524290, 458752, 4, -524284, 131072, 4, 524292, 458752, 4, -524282, 131072, 4, 524294, 458752, 4, -458744, 327680, 4, -327672, 327680, 4, -196600, 327680, 4, 131080, 327680, 4, 262152, 327680, 4, 393224, 327680, 4, -589819, 458752, 2, -524294, 458752, 2, -524292, 393216, 2, -589821, 393216, 2, 131070, 458752, 0, 131068, 458752, 0, 131066, 458752, 0, 262142, 458752, 0, 393214, 458752, 0, 327681, 458752, 0, 196609, 458752, 0, 65537, 458752, 0, 65539, 458752, 0, 65541, 458752, 0, -131067, 458752, 0, -131069, 458752, 0, -131071, 458752, 0, -262143, 458752, 0, -393215, 458752, 0, -327682, 458752, 0, -196610, 458752, 0, -65538, 458752, 0, -65540, 458752, 0, -65542, 458752, 0, -1638415, 131072, 4, -1638426, 131072, 4, -1507340, 131072, 4, -1572862, 131072, 4, -1507333, 131072, 4, -1703960, 393216, 2, 1900541, 131072, 4, 1835010, 131072, 4, 1835020, 131072, 4, 1835025, 131072, 4, 2883581, 458752, 4, 2818050, 458752, 4, 2818055, 458752, 4, 2818060, 458752, 4, 2818065, 458752, 4, 2097152, 458752, 0, 2097156, 458752, 0, 2097160, 458752, 0, 2097164, 458752, 0, 2490380, 458752, 0, 2490376, 458752, 0, 2490372, 458752, 0, 2490368, 458752, 0, 2097162, 458752, 0, 2097154, 458752, 0, 2490370, 458752, 0, 2490374, 458752, 0, 2097158, 458752, 0, 2490378, 458752, 0, 2097166, 458752, 0, 2228238, 458752, 0, 2359310, 458752, 0, 2490382, 458752, 0, 1835015, 131072, 4, 1835039, 786432, 0, 1835040, 851968, 0) @@ -603,6 +634,22 @@ position = Vector2(256, -9) [node name="Campfire2" parent="Entities" index="6" instance=ExtResource("23_mykt8")] position = Vector2(80, 373) +[node name="Centurion" parent="Entities" index="7" instance=ExtResource("30_qfl2k")] +material = SubResource("ShaderMaterial_73smm") +position = Vector2(-360, 31) + +[node name="Legionary" parent="Entities" index="8" instance=ExtResource("27_84gw4")] +material = SubResource("ShaderMaterial_o3w21") +position = Vector2(-214, 72) + +[node name="Legionary2" parent="Entities" index="9" instance=ExtResource("27_84gw4")] +material = SubResource("ShaderMaterial_gp117") +position = Vector2(-496, 15) + +[node name="Legionary3" parent="Entities" index="10" instance=ExtResource("27_84gw4")] +material = SubResource("ShaderMaterial_7e6lj") +position = Vector2(-240, 152) + [editable path="Props/StaticBookshelf"] [editable path="Props/StaticBookshelf/InteractionTrigger"] [editable path="Props/StaticBookshelf2"] diff --git a/State/Character/NPCMoveState.cs b/State/Character/NPCMoveState.cs index 9dc57af..b428d72 100644 --- a/State/Character/NPCMoveState.cs +++ b/State/Character/NPCMoveState.cs @@ -20,7 +20,6 @@ public partial class NPCMoveState : NPCState public override IState Enter(IState prev) { Character.MovementAnimation.Play("move"); - GD.Print("playing anim " + Character.MovementAnimation.CurrentAnimation); return base.Enter(prev); } } diff --git a/State/Character/PlayerState.cs b/State/Character/PlayerState.cs index 6ceaffa..cb35851 100644 --- a/State/Character/PlayerState.cs +++ b/State/Character/PlayerState.cs @@ -51,31 +51,30 @@ public abstract partial class PlayerState : CharacterState { if (Character.Inventory.SelectedItem is Items.Weapon weapon) { - var isPressed = Godot.Input.IsActionPressed("attack1"); + var isAttack1On = Godot.Input.IsActionPressed("attack1"); + var isAttack2On = Godot.Input.IsActionPressed("attack2"); + + var ret = false; if (!weapon.IsUsing) { - var ret = false; - if (!weapon.ShouldHideIdle || isPressed) + if (!weapon.ShouldHideIdle || isAttack1On) { Character.Target = dirToMouse; ret = true; } - - if (isPressed) - { - Character.UseCurrentItem(); - } - - return ret; } - else + + if (isAttack1On) { - if (!isPressed) - { - Character.DeuseCurrentItem(); - } + Character.UseCurrentItem(); } + else if (isAttack2On) + { + Character.UseCurrentItemAlt(); + } + + return ret; } return false; } diff --git a/State/StateMachine.cs b/State/StateMachine.cs index 3c2bc6d..5b68073 100644 --- a/State/StateMachine.cs +++ b/State/StateMachine.cs @@ -5,6 +5,9 @@ namespace SupaLidlGame.State; public abstract partial class StateMachine : Node where T : Node, IState { + [Signal] + public delegate void OnStateChangedEventHandler(Node state); + public T CurrentState { get; protected set; } public abstract T InitialState { get; set; } diff --git a/State/Thinker/AttackState.cs b/State/Thinker/AttackState.cs index a638602..eec8f91 100644 --- a/State/Thinker/AttackState.cs +++ b/State/Thinker/AttackState.cs @@ -31,12 +31,17 @@ public partial class AttackState : ThinkerState [Export] public float MaxDistanceToTarget { get; set; } + [Export] + public float UseItemDistance { get; set; } = 40; + [Export] public ThinkerState PassiveState { get; set; } [Export] public ThinkerState PursueState { get; set; } + protected Characters.Character _bestTarget; + protected float _preferredWeightDistance = 64.0f; protected float _maxWeightDistance = 8.0f; protected float _preferredWeightDistanceSq = 4096.0f; @@ -150,6 +155,7 @@ public partial class AttackState : ThinkerState { // TODO: the entity should wander if it doesn't find a best target var bestTarget = NPC.FindBestTarget(); + _bestTarget = bestTarget; if (bestTarget is not null) { @@ -169,12 +175,9 @@ public partial class AttackState : ThinkerState UpdateWeights(pos); - if (dist < 40 && NPC.CanAttack) + if (dist <= UseItemDistance && NPC.CanAttack) { - if (NPC.Inventory.SelectedItem is Items.Weapon weapon) - { - NPC.UseCurrentItem(); - } + Attack(bestTarget); } } else @@ -199,4 +202,12 @@ public partial class AttackState : ThinkerState return base.Process(delta); } + + public virtual void Attack(Characters.Character bestTarget) + { + if (NPC.Inventory.SelectedItem is Items.Weapon weapon) + { + NPC.UseCurrentItem(); + } + } } diff --git a/State/Thinker/BlockAttackState.cs b/State/Thinker/BlockAttackState.cs new file mode 100644 index 0000000..216b447 --- /dev/null +++ b/State/Thinker/BlockAttackState.cs @@ -0,0 +1,27 @@ +using Godot; +using SupaLidlGame.Items.Weapons; + +namespace SupaLidlGame.State.Thinker; + +public partial class BlockAttackState : AttackState +{ + public override void Attack(Characters.Character bestTarget) + { + if (NPC.Inventory.SelectedItem is Sword sword) + { + var stateMachine = sword.StateMachine; + if (bestTarget.StunTime > 0) + { + NPC.UseCurrentItem(); + } + else if (bestTarget.Inventory.SelectedItem is not Sword) + { + NPC.UseCurrentItem(); + } + else + { + NPC.UseCurrentItemAlt(); + } + } + } +} diff --git a/State/Thinker/IdleState.cs b/State/Thinker/IdleState.cs index 9a6511b..6c15a95 100644 --- a/State/Thinker/IdleState.cs +++ b/State/Thinker/IdleState.cs @@ -1,4 +1,5 @@ using Godot; +using GodotUtilities; namespace SupaLidlGame.State.Thinker; @@ -10,9 +11,33 @@ public partial class IdleState : ThinkerState [Export] public float MinTargetDistance { get; set; } + [ExportGroup("Line of Sight")] + [Export] + public bool PursueOnLineOfSight { get; set; } + + [Export] + public float MinLineOfSightDistance { get; set; } + + [ExportGroup("Returning")] + [Export] + public bool ShouldReturnToOriginalPosition { get; set; } + + [Export] + public NavigationAgent2D NavigationAgent { get; set; } + + protected Vector2 _originalPosition; + protected bool _isReturning; + + public override void _Ready() + { + _originalPosition = NPC.GlobalPosition; + base._Ready(); + } + public override ThinkerState Think() { var bestTarget = NPC.FindBestTarget(); + if (bestTarget is not null) { var pos = bestTarget.GlobalPosition; @@ -21,8 +46,46 @@ public partial class IdleState : ThinkerState { return PursueState; } + else if (PursueOnLineOfSight && NPC.HasLineOfSight(bestTarget)) + { + if (dist < MinLineOfSightDistance) + { + return PursueState; + } + } + _isReturning = false; + } + + if (ShouldReturnToOriginalPosition) + { + if (NavigationAgent is not null) + { + // if we're less than 8 units away then we don't move + var pos = NPC.GlobalPosition; + if (!pos.IsWithinDistanceSquared(_originalPosition, 64)) + { + NavigationAgent.TargetPosition = _originalPosition; + } + } + _isReturning = true; } return base.Think(); } + + public override ThinkerState PhysicsProcess(double delta) + { + if (_isReturning && NavigationAgent.IsTargetReachable()) + { + var navPos = NavigationAgent.GetNextPathPosition(); + NPC.Direction = NPC.GlobalPosition.DirectionTo(navPos); + } + + if (NavigationAgent.IsTargetReached()) + { + NPC.Direction = Vector2.Zero; + } + + return base.PhysicsProcess(delta); + } } diff --git a/State/Weapon/RangedFireState.cs b/State/Weapon/RangedFireState.cs index de65088..6da6614 100644 --- a/State/Weapon/RangedFireState.cs +++ b/State/Weapon/RangedFireState.cs @@ -1,4 +1,5 @@ using Godot; +using SupaLidlGame.Extensions; namespace SupaLidlGame.State.Weapon; @@ -10,6 +11,12 @@ public partial class RangedFireState : WeaponState [Export] public RangedIdleState IdleState { get; set; } + [Export] + public AnimationPlayer AnimationPlayer { get; set; } + + [Export] + public string AnimationKey { get; set; } + private double _timeLeft = 0; public override IState Enter(IState prev) @@ -18,6 +25,7 @@ public partial class RangedFireState : WeaponState _timeLeft = Weapon.UseTime; Weapon.Attack(); Weapon.UseDirection = Weapon.Character.Target; + AnimationPlayer?.TryPlay(AnimationKey); return null; } diff --git a/State/Weapon/RangedIdleState.cs b/State/Weapon/RangedIdleState.cs index e887307..2b8a6da 100644 --- a/State/Weapon/RangedIdleState.cs +++ b/State/Weapon/RangedIdleState.cs @@ -1,4 +1,5 @@ using Godot; +using SupaLidlGame.Extensions; namespace SupaLidlGame.State.Weapon; @@ -10,9 +11,17 @@ public partial class RangedIdleState : WeaponState [Export] public Items.Weapons.Ranged Weapon { get; set; } + [Export] + public AnimationPlayer AnimationPlayer { get; set; } + + [Export] + public string AnimationKey { get; set; } + + public override IState Enter(IState prev) { Weapon.Visible = !Weapon.ShouldHideIdle; + AnimationPlayer?.TryPlay(AnimationKey); return null; } diff --git a/State/Weapon/SwordAttackState.cs b/State/Weapon/SwordAttackState.cs index 3b921bd..d326a8a 100644 --- a/State/Weapon/SwordAttackState.cs +++ b/State/Weapon/SwordAttackState.cs @@ -51,6 +51,7 @@ public partial class SwordAttackState : WeaponState public override WeaponState Use() { + /* if (_useDuration <= 0) { // if we are still playing the current attack animation, we should alternate @@ -60,6 +61,7 @@ public partial class SwordAttackState : WeaponState } return IdleState; } + */ return null; } diff --git a/State/Weapon/SwordBlockState.cs b/State/Weapon/SwordBlockState.cs new file mode 100644 index 0000000..4f01ef7 --- /dev/null +++ b/State/Weapon/SwordBlockState.cs @@ -0,0 +1,80 @@ +using Godot; +using SupaLidlGame.Extensions; + +namespace SupaLidlGame.State.Weapon; + +public partial class SwordBlockState : WeaponState +{ + [Export] + public SupaLidlGame.Items.Weapons.Sword Sword { get; set; } + + [Export] + public SwordIdleState IdleState { get; set; } + + [Export] + public WeaponState UseState { get; set; } + + [Export] + public string BlockAnimKey { get; set; } + + public bool HasBlocked { get; set; } + + private double _attackDuration = 0; + + private double _useDuration = 0; + + private bool _isAlternate = false; + + public override WeaponState Enter(IState prevState) + { + Sword.EnableParry(ulong.MaxValue); + + _useDuration = Sword.UseAltTime; + _attackDuration = Sword.AttackAltTime; + + Sword.UseDirection = Sword.Character.Target; + + Sword.AnimationPlayer.TryPlay(BlockAnimKey); + + return null; + } + + public override WeaponState Use() + { + if (_attackDuration <= 0 && HasBlocked) + { + return UseState; + } + return null; + } + + public void Deattack() + { + Sword.DisableParry(); + } + + public override void Exit(IState nextState) + { + Deattack(); + HasBlocked = false; + } + + public override WeaponState Process(double delta) + { + if (_attackDuration > 0) + { + if ((_attackDuration -= delta) <= 0) + { + Deattack(); + } + } + + if ((_useDuration -= delta) <= 0) + { + Sword.AnimationPlayer.Play("RESET"); + return IdleState; + } + + return null; + } +} diff --git a/State/Weapon/SwordIdleState.cs b/State/Weapon/SwordIdleState.cs index bcaf07e..94a3542 100644 --- a/State/Weapon/SwordIdleState.cs +++ b/State/Weapon/SwordIdleState.cs @@ -5,7 +5,10 @@ namespace SupaLidlGame.State.Weapon; public partial class SwordIdleState : WeaponState { [Export] - public SwordAnticipateState AnticipateState { get; set; } + public WeaponState UseState { get; set; } + + [Export] + public WeaponState UseAltState { get; set; } [Export] public SupaLidlGame.Items.Weapons.Sword Sword { get; set; } @@ -31,12 +34,12 @@ public partial class SwordIdleState : WeaponState public override WeaponState Use() { - if (_attackCooldown <= 0) - { - return AnticipateState; - } + return UseState; + } - return AnticipateState; + public override WeaponState UseAlt() + { + return UseAltState; } public override WeaponState Process(double delta) diff --git a/State/Weapon/WeaponState.cs b/State/Weapon/WeaponState.cs index e57582f..54ceb05 100644 --- a/State/Weapon/WeaponState.cs +++ b/State/Weapon/WeaponState.cs @@ -8,6 +8,10 @@ public abstract partial class WeaponState : Node, IState public virtual WeaponState Deuse() => null; + public virtual WeaponState UseAlt() => null; + + public virtual WeaponState DeuseAlt() => null; + public abstract IState Enter(IState previousState); public virtual void Exit(IState nextState) diff --git a/State/Weapon/WeaponStateMachine.cs b/State/Weapon/WeaponStateMachine.cs index aefb826..d38daeb 100644 --- a/State/Weapon/WeaponStateMachine.cs +++ b/State/Weapon/WeaponStateMachine.cs @@ -25,6 +25,24 @@ public partial class WeaponStateMachine : StateMachine } } + public void UseAlt() + { + var state = CurrentState.UseAlt(); + if (state is WeaponState) + { + ChangeState(state); + } + } + + public void DeuseAlt() + { + var state = CurrentState.DeuseAlt(); + if (state is WeaponState) + { + ChangeState(state); + } + } + public void Process(double delta) { var state = CurrentState.Process(delta); diff --git a/UI/BossBar.cs b/UI/BossBar.cs index cc09fd6..391ee76 100644 --- a/UI/BossBar.cs +++ b/UI/BossBar.cs @@ -26,12 +26,12 @@ public partial class BossBar : VBoxContainer BossNameLabel = GetNode