From 77c399a2a8c9150a27dc9ca451a517a523d9e5d7 Mon Sep 17 00:00:00 2001 From: HumanoidSandvichDispenser Date: Sat, 9 Sep 2023 22:33:57 -0700 Subject: [PATCH] healing; resolves #21 --- Assets/Animations/player_hurt.res | Bin 1448 -> 1444 bytes Assets/Sprites/Characters/forsen2.ase | Bin 9696 -> 9954 bytes Assets/Sprites/Characters/forsen2.png | Bin 1768 -> 1823 bytes Characters/Player.cs | 5 + Characters/Player.tscn | 292 +++++++++++++++++++------- State/Character/PlayerHealState.cs | 74 +++++++ State/Character/PlayerIdleState.cs | 13 ++ project.godot | 8 +- 8 files changed, 313 insertions(+), 79 deletions(-) create mode 100644 State/Character/PlayerHealState.cs diff --git a/Assets/Animations/player_hurt.res b/Assets/Animations/player_hurt.res index e9627397571bd1767bbd8e0527a0a0299164820e..2a497df51a7f212161a90c988a610f3c05af9fb7 100644 GIT binary patch literal 1444 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 CY?}fA diff --git a/Assets/Sprites/Characters/forsen2.ase b/Assets/Sprites/Characters/forsen2.ase index 7aa1e656a16fce72b05d52e772a187ab1c11aad0..93a147514c303c2e97bf86d558e8c9fa36ac7528 100644 GIT binary patch delta 454 zcmaFh{m7U7ks1TTgQY4H*((_zZfu;+qz2?OuqX%tNf`JKWbiS#7iFd>1f`~>7NzDT zr%twFE@9sVl#ozhpS+cMu9z}|GE6;$W@ZS^EZH2yGGB<1ck)L?^~sXrI;kA&M}$*a zR;Q#ee0=yzLQ%@mXNRVO-V}C*b#~U|?manB#h~k(0rI zgZbc@3HR%-*B!mY;dSoF0}&&}S1SuLO`YxT*4oDY`^pf#g-J4W@_ZrD&HKb1nHV|2 z7VArMOxBmOWptmMDf>aEAs;}Z6wt4w`hVr4WAAniBL{Q4GJ0x0000DNk~Le000AE0000O2m=5B0ISt*r?DX`0e`+p zL_t(|ob6d#vg9fZ3t2(ORMx^@_P?y*nTIW*14``o+o(A zy3_t}gP+FvRuA!K;aNG4C-n038lPX>pAqNJW=7U*bjB~l`CdNNyTwsj-Y8#B2<`ul zeO>R<2|qr8I_vq%^R{aLIVCQj_-`a%74FG7sSPH z>*up9>xy}p5urT^Ua~#9NsIBD3B4T$2(pDPw4G99EXKp3%u!$D}S85BQQvRCqHlT$pr@cnF~*#0Fo{uo~{5D2>XA*Z5$!~ zr2Lz8kqIU3N0(n#7Uc~#SU#T_WKIdd&c9^7l`qfmn+d%g2jj5tYsBKnCR$(-pFd(7 zajrz$28H~mqZrcP$RsA;W$Kio`36tuM3w0)B3u> zVgwd3oO!S4SH2PV^5q#$2YNe;#9`srh{X{gummT`sI;?GftfEO$iFZA+kNch=OsQ< zU%AAaGwr|{i}ybkQu-BxapvC_2j^wg&~@?h6TTsTEU-FZqjj3Y_!ZluKg9Wj-j2g@ zXx@m$5v!zxCRpowZhuT)1;+TV2Rfj?kDr(Lyg9h1&PHSc$gdOVr#%%O!TaK1U9@$X z0k+;0KE>ZmoP4N)*P%E;Q07u+#B~eR#bMcnXb89dbmIxm2KqaT3H453mWHA`Z~T4m z^}4!NQ}_?|d}H)?^3#oDfpNX$h6V@0MEf5KAkmPz1U*w?!G923NF3rX9ttDp4QRl_ z^|l3odn(Hdbbo&Ega-{y&<2sjLa`_QB|3QA${Vb&&D67@OgN1!F4}R?dWf6&0VVd{ zB{&$|<*N$5E^fixYng+huq#^iWvEG>VMC9&kcV!Z@!Teu3zZ$*xv|jKjNm>YLaH>_ z4rRgO>34gEjKmNah!DPK~0uz|8k*qsAA5M0{!`UAAr%tyEh<#onxT|v%OvOc( z(?~pULl%s?UKu%h!LName=@7!f@@eD^!HAxyIR2Fioi5+uJ9b(qSEg5U>-=`AWlyZ zv@FIm$LkjsfN{qWoC%=mNFOzK{s7Nk1Wc#6bEQbnet$|;7zBa@(Kzq~Z3n9sSS>&3 zT~t=_pzXk+e-0&XS)A^la|0bC-boXN6Q{ntcHzmYicqJzj>Vg_G-Ah zw5UKl#$SlQV1p)AxHJ$%4L;JR6feDF|KFQR zH(o>jZ}4s-lIe@VbVurBcwaez@<8-H6{#MGxxf4#0P3qAsWC=-qqgh92Nn}jkHCI{ v6XsYw6Qi2$OILrs!~=J?xa>~^`|kb$T87{Yre|JE00000NkvXXu0mjfum}4? delta 1490 zcmV;@1ugoY4(JUbiBL{Q4GJ0x0000DNk~Le0009>0000O2m=5B0QX-lgRvni0e^={ zL_t(|ob6d#vg{}f3t2&9Dr?~{`(M`OnFp5A;atwt%oP3<#x_QRG`%d-rcIkRZQ8VH z)22KCQv}x0({Uhd*{d?m4H_}e~zgRbc$OPve2YxFKEq_$nJOtpS zFTp75T-UE3aL@G+e-fT2X7#)-bAK2HOiDxV4OecES2yiYL7y3_t} zgWtyaRuA!K;aNGaC-nAbR6i+!AndNDMz&;h#xKPAUOv^e#!*^Mh_5F>>p#Z6uJ`SP zAD=Xx_59_z+B=~){>XYDfk-1n$bq90!pI+mU!R4+`v0~Mqj25_x37`6t0oZQg9HTtqDObx zKkLV?c6;Mb@EC@~fdUH?_D!P?0}Kyo*O(Ucfo|j$ItM1~+XfUl$d2u5*F|tXp_f@W z4hz3!cyE=Fdp1T$u>GC=8GqGJ!hbF>fkcn|4|qJ%n?TtA3$Eh`@h9a!tcy&@X+LfG zd1XPyU?b)8SwZHQ0POG}bG3YVhd)f{WfqLX!fyc!BfGRh3i$dFEts`5S_ujFKOVWT z{hj?8)z3sMz<)}(g%e%&JsigG{5ihhI7DEM^PjH^mjlzfvXP>M6n`+B`KahuzU_|k zJ!UzyjgrhW?w5t>$sV^Paf0z5O_p!4-qx$J6fjG~xVB)U~j5Ghf zI5;n>hOUd3AMqXeVu^=DK+!+JUi$A5^PUJ1}oY$`B<_r<~duj^6+Y`rmjjK8Zm>5v4kH(`RH%(>2h zw^S*M!}9XM5U%~{2KNeS6#ghA-G;0$r~I9F<@&j2&HeZK9AoY8?a!coX5s>2FO=ty z=yAD`4d}TL3xnW7;t+pvPyi{fM*|M7w=MwOJ4r@><>`SD9)Bn}K^;U=^4Z?_=jh-u zDQ$3j4MuMIJmE58O|bLgbP!kZJxc7HiLh6=Nmmbi&D*`Yr&15HlJ02Hk!nr!^gDVq zg?;G8S)c0!bg+gYc;G@l5W$q?Y9=y)2^I{G!vvOjj^FzkOx6o0Fd?}TNxQRi;9?it zU+sl|WVBvD;D2+DVD8RA7X=rwmyvML`y>o=zXDS9jNb!EiKCU8@fH>X{avX?ohH^~ zA+?P&xzFC%ChbuV?gPo|#i-Xdv@F(VjtgNH!5Pu3UfQGM$sge9CTDuY43#V~{RvcH z5C}Jd#epYcJt$itmGXVNTa6Xmw|3&tKZO!wt!a63C4b5};*7{4B-4B|9Rib+qfQ9! zPC+)Z#sZcsq;SPG{xy!4O!OtMc8XT+6soxo)c6a@E2ce`jE!~b0|NCq_a ztY+)&aetGT_M55V=0-(ozboAkt z_^99B6I^b#cQ;k+glUh5r6?e*;U!)K6L&#(A*~RE@kkm8!#WB>7{$NGQ~N=j1cPs{ z_$dRfsx(1MCT}g0wuAM=dtbm82fks5kcxayC4XHb<$kt83Yv+yUDS!IZvhU4<_KB;<7+;ih50jPM)F>`` sPbYBFIabfYT21$*i=Tt~z};{7A1t2KC9z-#N&o-=07*qoM6N<$f-lV8YybcN diff --git a/Characters/Player.cs b/Characters/Player.cs index 1ea3afd..7bca225 100644 --- a/Characters/Player.cs +++ b/Characters/Player.cs @@ -37,6 +37,9 @@ public sealed partial class Player : Character [Export] public AnimationTree AnimationTree { get; private set; } + [Export] + public PlayerStats Stats { get; private set; } + public InteractionRay InteractionRay { get; private set; } public override void _Ready() @@ -45,6 +48,8 @@ public sealed partial class Player : Character _targetTracer = GetNode("%TargetTracer"); + Stats = GetNode("Stats"); + base._Ready(); Inventory.UsedItem += (Items.Item item) => diff --git a/Characters/Player.tscn b/Characters/Player.tscn index ad25718..29cd76b 100644 --- a/Characters/Player.tscn +++ b/Characters/Player.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=67 format=3 uid="uid://b2254pup8k161"] +[gd_scene load_steps=64 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"] @@ -27,6 +27,7 @@ [ext_resource type="AudioStream" uid="uid://bkeyg8weaqnuu" path="res://Assets/Sounds/splat-player.ogg" id="12_vvem5"] [ext_resource type="AudioStream" uid="uid://cruylv4pu2fo1" path="res://Assets/Sounds/footstep-tile.wav" id="13_bxguv"] [ext_resource type="Script" path="res://BoundingBoxes/InteractionRay.cs" id="13_hs3u1"] +[ext_resource type="Script" path="res://State/Character/PlayerHealState.cs" id="13_t103m"] [ext_resource type="PackedScene" uid="uid://p7oijq6dbvvk" path="res://Items/Weapons/DocLance.tscn" id="14_bj0lo"] [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"] @@ -46,38 +47,50 @@ 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/path = NodePath("%Sprites/Node2D/Character:rotation") tracks/0/interp = 1 tracks/0/loop_wrap = true tracks/0/keys = { "times": PackedFloat32Array(0), "transitions": PackedFloat32Array(1), -"update": 1, -"values": [0] +"update": 0, +"values": [0.0] } tracks/1/type = "value" tracks/1/imported = false tracks/1/enabled = true -tracks/1/path = NodePath("../Sprites/Node2D/Character:rotation") +tracks/1/path = NodePath("%Sprites/Node2D/Character:frame") tracks/1/interp = 1 tracks/1/loop_wrap = true tracks/1/keys = { "times": PackedFloat32Array(0), "transitions": PackedFloat32Array(1), -"update": 0, -"values": [0.0] +"update": 1, +"values": [0] } tracks/2/type = "value" tracks/2/imported = false tracks/2/enabled = true -tracks/2/path = NodePath("%Sprites/Node2D/Character:frame") +tracks/2/path = NodePath("%Effects/HealParticles:emitting") tracks/2/interp = 1 tracks/2/loop_wrap = true tracks/2/keys = { "times": PackedFloat32Array(0), "transitions": PackedFloat32Array(1), "update": 1, -"values": [0] +"values": [false] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("%Effects/HealParticlesPop: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_xt1sg"] @@ -105,7 +118,7 @@ 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/path = NodePath("%Sprites/Node2D/Character:frame") tracks/0/interp = 1 tracks/0/loop_wrap = true tracks/0/keys = { @@ -198,15 +211,39 @@ 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/path = NodePath("%Effects/HealParticles:emitting") tracks/0/interp = 1 tracks/0/loop_wrap = true tracks/0/keys = { "times": PackedFloat32Array(0), "transitions": PackedFloat32Array(1), "update": 1, +"values": [false] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("%Sprites/Node2D/Character: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 = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("%Effects/HealParticlesPop:emitting") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [false] +} [sub_resource type="Animation" id="Animation_3w3u1"] resource_name = "sword" @@ -214,7 +251,7 @@ length = 0.3 tracks/0/type = "value" tracks/0/imported = false tracks/0/enabled = true -tracks/0/path = NodePath("../Sprites/Node2D/Character:frame") +tracks/0/path = NodePath("%Sprites/Node2D/Character:frame") tracks/0/interp = 1 tracks/0/loop_wrap = true tracks/0/keys = { @@ -224,9 +261,101 @@ tracks/0/keys = { "values": [12, 13, 14] } +[sub_resource type="Animation" id="Animation_60iyy"] +resource_name = "heal_cancel" +length = 0.001 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("%Effects/HealParticles:emitting") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [false] +} + +[sub_resource type="Animation" id="Animation_6twa8"] +resource_name = "heal_start" +length = 0.25 +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": [35] +} + +[sub_resource type="Animation" id="Animation_dyfl4"] +resource_name = "heal_end" +length = 0.001 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("%Effects/HealParticles:emitting") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [false] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("%Effects/HealParticlesPop:emitting") +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_audkv"] +resource_name = "heal" +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": [35] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("%Effects/HealParticles:emitting") +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="AnimationLibrary" id="AnimationLibrary_73mj7"] _data = { "RESET": SubResource("Animation_adxyh"), +"heal": SubResource("Animation_audkv"), +"heal_cancel": SubResource("Animation_60iyy"), +"heal_end": SubResource("Animation_dyfl4"), +"heal_start": SubResource("Animation_6twa8"), "sword": SubResource("Animation_3w3u1") } @@ -235,60 +364,6 @@ _data = { "stun": ExtResource("8_m08fh") } -[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_kwett"] -animation = &"idle" - -[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_vqdng"] -animation = &"move" - -[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_4np0m"] -animation = &"roll" - -[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_suhx1"] -animation = &"stop" - -[sub_resource type="AnimationNodeStateMachineTransition" id="AnimationNodeStateMachineTransition_sorqc"] -advance_mode = 2 - -[sub_resource type="AnimationNodeStateMachineTransition" id="AnimationNodeStateMachineTransition_ujrp0"] -advance_condition = &"move" - -[sub_resource type="AnimationNodeStateMachineTransition" id="AnimationNodeStateMachineTransition_kjkm8"] -advance_condition = &"idle" - -[sub_resource type="AnimationNodeStateMachineTransition" id="AnimationNodeStateMachineTransition_1ywlq"] -switch_mode = 2 -advance_mode = 2 -advance_condition = &"idle" - -[sub_resource type="AnimationNodeStateMachineTransition" id="AnimationNodeStateMachineTransition_abs7t"] -advance_condition = &"roll" - -[sub_resource type="AnimationNodeStateMachineTransition" id="AnimationNodeStateMachineTransition_qlka8"] -advance_condition = &"idle" - -[sub_resource type="AnimationNodeStateMachineTransition" id="AnimationNodeStateMachineTransition_ql2f3"] -advance_condition = &"move" - -[sub_resource type="AnimationNodeStateMachineTransition" id="AnimationNodeStateMachineTransition_g1yba"] -advance_condition = &"roll" - -[sub_resource type="AnimationNodeStateMachine" id="AnimationNodeStateMachine_0ukul"] -states/End/position = Vector2(613, 100) -states/Start/position = Vector2(89, 100) -states/idle/node = SubResource("AnimationNodeAnimation_kwett") -states/idle/position = Vector2(259, 100) -states/move/node = SubResource("AnimationNodeAnimation_vqdng") -states/move/position = Vector2(259, 18) -states/roll/node = SubResource("AnimationNodeAnimation_4np0m") -states/roll/position = Vector2(89, 18) -states/stop/node = SubResource("AnimationNodeAnimation_suhx1") -states/stop/position = Vector2(438, 100) -transitions = ["Start", "idle", SubResource("AnimationNodeStateMachineTransition_sorqc"), "idle", "move", SubResource("AnimationNodeStateMachineTransition_ujrp0"), "move", "stop", SubResource("AnimationNodeStateMachineTransition_kjkm8"), "stop", "idle", SubResource("AnimationNodeStateMachineTransition_1ywlq"), "idle", "roll", SubResource("AnimationNodeStateMachineTransition_abs7t"), "roll", "idle", SubResource("AnimationNodeStateMachineTransition_qlka8"), "roll", "move", SubResource("AnimationNodeStateMachineTransition_ql2f3"), "move", "roll", SubResource("AnimationNodeStateMachineTransition_g1yba")] -graph_offset = Vector2(-335.315, -63.5708) - -[sub_resource type="AnimationNodeStateMachinePlayback" id="AnimationNodeStateMachinePlayback_lrnca"] - [sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_852jj"] particle_flag_disable_z = true spread = 180.0 @@ -305,6 +380,47 @@ scale_max = 0.1 [sub_resource type="CanvasTexture" id="CanvasTexture_pited"] diffuse_texture = ExtResource("9_7gumm") +[sub_resource type="Gradient" id="Gradient_8w5b1"] +offsets = PackedFloat32Array(0, 0.2) +colors = PackedColorArray(1, 1, 1, 0, 1, 1, 1, 1) + +[sub_resource type="GradientTexture1D" id="GradientTexture1D_rvqsx"] +gradient = SubResource("Gradient_8w5b1") + +[sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_untv1"] +emission_shape = 2 +emission_sphere_radius = 24.0 +particle_flag_disable_z = true +gravity = Vector3(0, 0, 0) +orbit_velocity_min = 0.01 +orbit_velocity_max = 0.02 +radial_accel_min = -128.0 +radial_accel_max = -128.0 +scale_min = 0.1 +scale_max = 0.1 +color_ramp = SubResource("GradientTexture1D_rvqsx") + +[sub_resource type="Gradient" id="Gradient_61bqd"] +colors = PackedColorArray(1, 1, 1, 1, 1, 1, 1, 0) + +[sub_resource type="GradientTexture1D" id="GradientTexture1D_jb8kb"] +gradient = SubResource("Gradient_61bqd") + +[sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_1umee"] +particle_flag_disable_z = true +spread = 180.0 +gravity = Vector3(0, 0, 0) +initial_velocity_min = 64.0 +initial_velocity_max = 64.0 +orbit_velocity_min = 0.0 +orbit_velocity_max = 0.0 +linear_accel_min = -128.0 +linear_accel_max = -128.0 +scale_min = 0.25 +scale_max = 0.25 +color = Color(0, 0, 0, 1) +color_ramp = SubResource("GradientTexture1D_jb8kb") + [sub_resource type="RectangleShape2D" id="RectangleShape2D_bfqew"] size = Vector2(12, 8) @@ -318,7 +434,7 @@ size = Vector2(8, 8) closed = false polygon = PackedVector2Array(-3, 0, 2, 0) -[node name="Player" type="CharacterBody2D" node_paths=PackedStringArray("Camera", "DirectionMarker", "Sprite", "Inventory", "StateMachine", "Hurtbox")] +[node name="Player" type="CharacterBody2D" node_paths=PackedStringArray("Camera", "DirectionMarker", "Stats", "Sprite", "Inventory", "StateMachine", "Hurtbox")] y_sort_enabled = true texture_filter = 3 material = SubResource("ShaderMaterial_h78y7") @@ -327,6 +443,7 @@ collision_mask = 17 script = ExtResource("1_flygr") Camera = NodePath("Camera2D") DirectionMarker = NodePath("Direction2D") +Stats = NodePath("Stats") Speed = 80.0 HandTexture = ExtResource("3_3dqh7") Sprite = NodePath("Sprites/Node2D/Character") @@ -349,10 +466,11 @@ script = ExtResource("5_rgckv") InitialState = NodePath("Idle") Character = NodePath("..") -[node name="Idle" type="Node" parent="StateMachine" node_paths=PackedStringArray("MoveState", "EmoteState", "IdleState", "Character")] +[node name="Idle" type="Node" parent="StateMachine" node_paths=PackedStringArray("MoveState", "EmoteState", "HealState", "IdleState", "Character")] script = ExtResource("6_wkfdm") MoveState = NodePath("../Move") EmoteState = NodePath("../Emote") +HealState = NodePath("../Heal") IdleState = NodePath(".") Character = NodePath("../..") @@ -380,6 +498,13 @@ script = ExtResource("8_hd2lw") IdleState = NodePath("../Idle") Character = NodePath("../..") +[node name="Heal" type="Node" parent="StateMachine" node_paths=PackedStringArray("IdleState", "Character")] +script = ExtResource("13_t103m") +TimeToHeal = 1.0 +HealAmount = 20.0 +IdleState = NodePath("../Idle") +Character = NodePath("../..") + [node name="Animations" type="Node" parent="."] unique_name_in_owner = true script = ExtResource("7_sdgvb") @@ -405,14 +530,6 @@ libraries = { "": SubResource("AnimationLibrary_kks2p") } -[node name="AnimationTree" type="AnimationTree" parent="Animations"] -tree_root = SubResource("AnimationNodeStateMachine_0ukul") -anim_player = NodePath("../Movement") -parameters/playback = SubResource("AnimationNodeStateMachinePlayback_lrnca") -parameters/conditions/idle = false -parameters/conditions/move = false -parameters/conditions/roll = false - [node name="Effects" type="Node2D" parent="."] unique_name_in_owner = true @@ -443,6 +560,24 @@ one_shot = true preprocess = 0.1 explosiveness = 0.9 +[node name="HealParticles" type="GPUParticles2D" parent="Effects"] +position = Vector2(0, -4) +emitting = false +amount = 12 +process_material = SubResource("ParticleProcessMaterial_untv1") +texture = ExtResource("9_7gumm") +lifetime = 0.5 + +[node name="HealParticlesPop" type="GPUParticles2D" parent="Effects"] +position = Vector2(0, -4) +emitting = false +amount = 16 +process_material = SubResource("ParticleProcessMaterial_1umee") +texture = ExtResource("9_7gumm") +lifetime = 0.8 +one_shot = true +explosiveness = 1.0 + [node name="DeathCry" type="AudioStreamPlayer2D" parent="Effects"] stream = ExtResource("12_vd7j4") volume_db = 2.0 @@ -453,6 +588,8 @@ stream = ExtResource("13_bxguv") [node name="HurtSound" type="AudioStreamPlayer2D" parent="Effects"] stream = ExtResource("12_vvem5") +[node name="Healing" type="AudioStreamPlayer2D" parent="Effects"] + [node name="TargetTracer" parent="Effects" instance=ExtResource("22_hxi53")] unique_name_in_owner = true position = Vector2(0, -4) @@ -465,6 +602,7 @@ position_smoothing_speed = 8.0 unique_name_in_owner = true y_sort_enabled = true use_parent_material = true +position = Vector2(-0.5, 0) rotation = 6.28319 [node name="Node2D" type="Node2D" parent="Sprites"] @@ -475,7 +613,7 @@ use_parent_material = true position = Vector2(0, -8) texture = ExtResource("4_5vird") offset = Vector2(0, -4) -hframes = 35 +hframes = 36 [node name="CollisionShape2D" type="CollisionShape2D" parent="."] position = Vector2(0, -4) diff --git a/State/Character/PlayerHealState.cs b/State/Character/PlayerHealState.cs new file mode 100644 index 0000000..f0c193c --- /dev/null +++ b/State/Character/PlayerHealState.cs @@ -0,0 +1,74 @@ +using Godot; + +namespace SupaLidlGame.State.Character; + +public partial class PlayerHealState : PlayerState +{ + [Export] + public double TimeToHeal { get; set; } + + [Export] + public float HealAmount { get; set; } + + private double _timeLeftToHeal = 0; + + private bool _hasHealed = false; + + public override IState Enter(IState prevState) + { + if (_player.Stats.Level.Value < 1) + { + return IdleState; + } + _timeLeftToHeal = TimeToHeal; + GD.Print("Heal anim"); + _player.AttackAnimation.Play("heal_start"); + _player.AttackAnimation.Queue("heal"); + _hasHealed = false; + return base.Enter(prevState); + } + + public override void Exit(IState nextState) + { + if (_hasHealed) + { + _player.AttackAnimation.Play("heal_end"); + } + else + { + _player.AttackAnimation.Play("heal_cancel"); + } + } + + public override CharacterState Process(double delta) + { + // lock player - no base.Process(delta) + + // if somehow the player's level decreased mid-heal and is not enough + // then we return to idle + if (_player.Stats.Level.Value < 1) + { + return IdleState; + } + + if ((_timeLeftToHeal -= delta) <= 0) + { + // heal player + _player.Stats.Level.Value--; + _player.Health = Mathf.Min(_player.Health + HealAmount, 100); + _hasHealed = true; + return IdleState; + } + return null; + } + + public override CharacterState Input(InputEvent @event) + { + if (@event.IsActionReleased("ability")) + { + _player.AttackAnimation.Play("heal_cancel"); + return IdleState; + } + return null; + } +} diff --git a/State/Character/PlayerIdleState.cs b/State/Character/PlayerIdleState.cs index b9796f5..2769cf2 100644 --- a/State/Character/PlayerIdleState.cs +++ b/State/Character/PlayerIdleState.cs @@ -10,6 +10,9 @@ public partial class PlayerIdleState : PlayerState [Export] public PlayerEmoteState EmoteState { get; set; } + [Export] + public PlayerHealState HealState { get; set; } + public override IState Enter(IState previousState) { if (previousState is not PlayerMoveState) @@ -52,6 +55,7 @@ public partial class PlayerIdleState : PlayerState { return EmoteState; } + return base.Input(@event); } @@ -62,6 +66,15 @@ public partial class PlayerIdleState : PlayerState { return MoveState; } + + if (Godot.Input.IsActionPressed("ability")) + { + if (!_player.Inventory.IsUsingItem) + { + return HealState; + } + } + return null; } } diff --git a/project.godot b/project.godot index 46e43de..994f587 100644 --- a/project.godot +++ b/project.godot @@ -100,8 +100,7 @@ attack2={ } 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) -] +"events": [] } interact={ "deadzone": 0.5, @@ -183,6 +182,11 @@ prev_item={ "events": [Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":4,"pressure":0.0,"pressed":false,"script":null) ] } +ability={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"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":101,"echo":false,"script":null) +] +} [internationalization]