centurion and legionary enemies
|  | @ -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 | ||||
| After Width: | Height: | Size: 914 B | 
|  | @ -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 | ||||
| After Width: | Height: | Size: 547 B | 
|  | @ -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 | ||||
| After Width: | Height: | Size: 802 B | 
|  | @ -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 | ||||
| After Width: | Height: | Size: 184 B | 
|  | @ -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 | ||||
| After Width: | Height: | Size: 169 B | 
|  | @ -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 | ||||
| After Width: | Height: | Size: 137 B | 
|  | @ -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 | ||||
| After Width: | Height: | Size: 383 B | 
|  | @ -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 | ||||
| After Width: | Height: | Size: 444 B | 
|  | @ -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 | ||||
|  | @ -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; | ||||
|     } | ||||
| } | ||||
|  |  | |||
|  | @ -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"] | ||||
|  | @ -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"] | ||||
|  | @ -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 | ||||
|  |  | |||
|  | @ -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) | ||||
|  |  | |||
|  | @ -0,0 +1,5 @@ | |||
| namespace SupaLidlGame.Entities; | ||||
| 
 | ||||
| public partial class Bullet : Projectile | ||||
| { | ||||
| } | ||||
|  | @ -1,5 +1,7 @@ | |||
| using Godot; | ||||
| 
 | ||||
| namespace SupaLidlGame.Extensions; | ||||
| 
 | ||||
| public static class AnimationPlayerExtensions | ||||
| { | ||||
|     public static bool TryPlay(this AnimationPlayer player, string name) | ||||
|  |  | |||
|  | @ -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() | ||||
|     { | ||||
| 
 | ||||
|     } | ||||
| } | ||||
|  |  | |||
|  | @ -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; | ||||
| 
 | ||||
|     /// <summary> | ||||
|     /// 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; | ||||
| 
 | ||||
|     /// <summary> | ||||
|     /// The magnitude of the knockback force of the weapon. | ||||
|     /// </summary> | ||||
|  |  | |||
|  | @ -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")] | ||||
|  |  | |||
|  | @ -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) | ||||
|         { | ||||
|  |  | |||
|  | @ -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"] | ||||
|  | @ -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; | ||||
|  |  | |||
|  | @ -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" | ||||
|  | @ -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<GpuParticles2D>().EmitOneShot(); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 otherParryable.Stun(); | ||||
|                 Stun(); | ||||
| 
 | ||||
|                 if (otherParryable is Sword sword) | ||||
|                 { | ||||
|                     if (sword.StateMachine.CurrentState is SwordBlockState b) | ||||
|                     { | ||||
|                         b.HasBlocked = true; | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  |  | |||
|  | @ -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) | ||||
|  |  | |||
|  | @ -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) | ||||
|  |  | |||
|  | @ -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"] | ||||
|  |  | |||
|  | @ -20,7 +20,6 @@ public partial class NPCMoveState : NPCState | |||
|     public override IState<CharacterState> Enter(IState<CharacterState> prev) | ||||
|     { | ||||
|         Character.MovementAnimation.Play("move"); | ||||
|         GD.Print("playing anim " + Character.MovementAnimation.CurrentAnimation); | ||||
|         return base.Enter(prev); | ||||
|     } | ||||
| } | ||||
|  |  | |||
|  | @ -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; | ||||
|         } | ||||
|  |  | |||
|  | @ -5,6 +5,9 @@ namespace SupaLidlGame.State; | |||
| 
 | ||||
| public abstract partial class StateMachine<T> : Node where T : Node, IState<T> | ||||
| { | ||||
|     [Signal] | ||||
|     public delegate void OnStateChangedEventHandler(Node state); | ||||
| 
 | ||||
|     public T CurrentState { get; protected set; } | ||||
| 
 | ||||
|     public abstract T InitialState { get; set; } | ||||
|  |  | |||
|  | @ -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(); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  |  | |||
|  | @ -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(); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | @ -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); | ||||
|     } | ||||
| } | ||||
|  |  | |||
|  | @ -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<WeaponState> Enter(IState<WeaponState> 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; | ||||
|     } | ||||
| 
 | ||||
|  |  | |||
|  | @ -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<WeaponState> Enter(IState<WeaponState> prev) | ||||
|     { | ||||
|         Weapon.Visible = !Weapon.ShouldHideIdle; | ||||
|         AnimationPlayer?.TryPlay(AnimationKey); | ||||
|         return null; | ||||
|     } | ||||
| 
 | ||||
|  |  | |||
|  | @ -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; | ||||
|     } | ||||
|  |  | |||
|  | @ -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<WeaponState> 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<WeaponState> 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; | ||||
|     } | ||||
| } | ||||
|  | @ -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) | ||||
|  |  | |||
|  | @ -8,6 +8,10 @@ public abstract partial class WeaponState : Node, IState<WeaponState> | |||
| 
 | ||||
|     public virtual WeaponState Deuse() => null; | ||||
| 
 | ||||
|     public virtual WeaponState UseAlt() => null; | ||||
| 
 | ||||
|     public virtual WeaponState DeuseAlt() => null; | ||||
| 
 | ||||
|     public abstract IState<WeaponState> Enter(IState<WeaponState> previousState); | ||||
| 
 | ||||
|     public virtual void Exit(IState<WeaponState> nextState) | ||||
|  |  | |||
|  | @ -25,6 +25,24 @@ public partial class WeaponStateMachine : StateMachine<WeaponState> | |||
|         } | ||||
|     } | ||||
| 
 | ||||
|     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); | ||||
|  |  | |||
|  | @ -26,12 +26,12 @@ public partial class BossBar : VBoxContainer | |||
|         BossNameLabel = GetNode<Label>("LabelMargin/BossNameLabel"); | ||||
|     } | ||||
| 
 | ||||
|     private void OnBossHurt(Events.HealthChangedArgs args) | ||||
|     private void OnBossHurt(Events.HurtArgs args) | ||||
|     { | ||||
|         ProgressBar.Value = args.NewHealth; | ||||
|     } | ||||
| 
 | ||||
|     private void OnBossDeath(Events.HealthChangedArgs args) | ||||
|     private void OnBossDeath(Events.HurtArgs args) | ||||
|     { | ||||
|         Visible = false; | ||||
|         Boss = null; | ||||
|  |  | |||
|  | @ -18,7 +18,7 @@ public partial class DamageTime : Node | |||
|         } | ||||
|     } | ||||
| 
 | ||||
|     private void PlayerHurt(Events.HealthChangedArgs args) | ||||
|     private void PlayerHurt(Events.HurtArgs args) | ||||
|     { | ||||
|         if (args.Damage > 10) | ||||
|         { | ||||
|  |  | |||
|  | @ -0,0 +1,27 @@ | |||
| using Godot; | ||||
| using SupaLidlGame.BoundingBoxes; | ||||
| using SupaLidlGame.Extensions; | ||||
| 
 | ||||
| namespace SupaLidlGame.State; | ||||
| 
 | ||||
| public partial class InteractionTriggerDialogue : Node2D | ||||
| { | ||||
|     [Export] | ||||
|     public InteractionTrigger InteractionTrigger { get; set; } | ||||
| 
 | ||||
|     [Export(PropertyHint.File, "*.dialogue")] | ||||
|     public Resource DialogueResource { get; set; } | ||||
| 
 | ||||
|     [Export] | ||||
|     public string DialogueTitle { get; set; } | ||||
| 
 | ||||
|     public override void _Ready() | ||||
|     { | ||||
|         InteractionTrigger.Interaction += OnInteraction; | ||||
|     } | ||||
| 
 | ||||
|     private void OnInteraction() | ||||
|     { | ||||
|         this.GetWorld().DialogueBalloon.Start(DialogueResource, DialogueTitle); | ||||
|     } | ||||
| } | ||||
|  | @ -19,3 +19,9 @@ bus/3/mute = false | |||
| bus/3/bypass_fx = false | ||||
| bus/3/volume_db = 0.0 | ||||
| bus/3/send = &"Master" | ||||
| bus/4/name = &"UI" | ||||
| bus/4/solo = false | ||||
| bus/4/mute = false | ||||
| bus/4/bypass_fx = false | ||||
| bus/4/volume_db = 0.0 | ||||
| bus/4/send = &"Master" | ||||
|  |  | |||
|  | @ -42,7 +42,7 @@ project/assembly_name="SupaLidlGame" | |||
| 
 | ||||
| [editor_plugins] | ||||
| 
 | ||||
| enabled=PackedStringArray("res://addons/dialogue_manager/plugin.cfg", "res://addons/panku_console/plugin.cfg") | ||||
| enabled=PackedStringArray("res://addons/panku_console/plugin.cfg", "res://addons/dialogue_manager/plugin.cfg") | ||||
| 
 | ||||
| [input] | ||||
| 
 | ||||
|  | @ -87,6 +87,11 @@ attack1={ | |||
| "events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":0,"position":Vector2(0, 0),"global_position":Vector2(0, 0),"factor":1.0,"button_index":1,"pressed":false,"double_click":false,"script":null) | ||||
| ] | ||||
| } | ||||
| attack2={ | ||||
| "deadzone": 0.5, | ||||
| "events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":0,"position":Vector2(0, 0),"global_position":Vector2(0, 0),"factor":1.0,"button_index":2,"pressed":false,"double_click":false,"script":null) | ||||
| ] | ||||
| } | ||||
| equip={ | ||||
| "deadzone": 0.5, | ||||
| "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":69,"key_label":0,"unicode":0,"echo":false,"script":null) | ||||
|  |  | |||