diff --git a/Characters/Character.cs b/Characters/Character.cs index 4f4c7ae..38d6dc0 100644 --- a/Characters/Character.cs +++ b/Characters/Character.cs @@ -165,7 +165,8 @@ namespace SupaLidlGame.Characters } } - public void _on_hurtbox_received_damage(float damage, + public virtual void _on_hurtbox_received_damage( + float damage, Character inflictor, float knockback, Vector2 knockbackOrigin = default, @@ -173,12 +174,14 @@ namespace SupaLidlGame.Characters { Health -= damage; + // create damage text var textScene = GD.Load("res://UI/FloatingText.tscn"); var instance = textScene.Instantiate(); instance.Text = Mathf.Round(damage).ToString(); instance.GlobalPosition = GlobalPosition; this.GetAncestor().AddChild(instance); + // apply knockback Vector2 knockbackDir = knockbackVector; if (knockbackDir == default) { @@ -190,14 +193,22 @@ namespace SupaLidlGame.Characters knockbackDir = knockbackOrigin.DirectionTo(GlobalPosition); } - var player = GetNode("FlashAnimation"); - if (player != null) + ApplyImpulse(knockbackDir.Normalized() * knockback); + + // play damage animation + var anim = GetNode("FlashAnimation"); + if (anim != null) { - player.Stop(); - player.Play("Hurt"); + anim.Stop(); + anim.Play("Hurt"); } - ApplyImpulse(knockbackDir.Normalized() * knockback); + // if anyone involved is a player, shake their screen + Player plr = inflictor as Player ?? this as Player; + if (plr is not null) + { + plr.Camera.Shake(0.75f, 0.25f); + } } } } diff --git a/Characters/Player.cs b/Characters/Player.cs index 256e83d..405a62d 100644 --- a/Characters/Player.cs +++ b/Characters/Player.cs @@ -1,4 +1,5 @@ using Godot; +using SupaLidlGame.Utils; namespace SupaLidlGame.Characters { @@ -7,6 +8,9 @@ namespace SupaLidlGame.Characters private AnimatedSprite2D _sprite; private string _spriteAnim; + [Export] + public PlayerCamera Camera { get; set; } + public string Animation { get => _sprite.Animation; diff --git a/Characters/Player.tscn b/Characters/Player.tscn index 64158a7..9d87f01 100644 --- a/Characters/Player.tscn +++ b/Characters/Player.tscn @@ -1,10 +1,11 @@ -[gd_scene load_steps=26 format=3 uid="uid://b2254pup8k161"] +[gd_scene load_steps=27 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"] [ext_resource type="Texture2D" uid="uid://dxymfduyrbuvx" path="res://Assets/Sprites/Characters/forsen.png" id="3_ig4hs"] [ext_resource type="Script" path="res://Characters/States/Machine.cs" id="3_npkjp"] [ext_resource type="Script" path="res://Characters/States/PlayerIdleState.cs" id="4_4k4mb"] +[ext_resource type="PackedScene" uid="uid://cl56eadpklnbo" path="res://Utils/PlayerCamera.tscn" id="4_ym125"] [ext_resource type="Script" path="res://Characters/States/PlayerMoveState.cs" id="5_tx5rw"] [ext_resource type="Script" path="res://Characters/States/PlayerRollState.cs" id="6_6bgrj"] [ext_resource type="PackedScene" uid="uid://d72ehtv1ks0e" path="res://Items/Weapons/Sword.tscn" id="7_4rxuv"] @@ -103,12 +104,13 @@ _data = { "RESET": SubResource("Animation_k6l16") } -[node name="Player" type="CharacterBody2D" node_paths=PackedStringArray("Sprite", "Inventory", "StateMachine")] +[node name="Player" type="CharacterBody2D" node_paths=PackedStringArray("Camera", "Sprite", "Inventory", "StateMachine")] texture_filter = 3 material = SubResource("ShaderMaterial_h78y7") y_sort_enabled = true collision_layer = 2 script = ExtResource("1_flygr") +Camera = NodePath("Camera2D") Speed = 64.0 Mass = 1.0 Health = 100.0 @@ -127,9 +129,7 @@ playing = true position = Vector2(0, 8) shape = SubResource("RectangleShape2D_bfqew") -[node name="Camera2D" type="Camera2D" parent="."] -current = true -zoom = Vector2(4, 4) +[node name="Camera2D" parent="." instance=ExtResource("4_ym125")] [node name="StateMachine" type="Node" parent="." node_paths=PackedStringArray("InitialState", "Character")] script = ExtResource("3_npkjp") @@ -167,6 +167,7 @@ horizontal_alignment = 1 [node name="Node" type="Node" parent="."] [node name="Inventory" type="Node2D" parent="."] +position = Vector2(0, 2) y_sort_enabled = true script = ExtResource("7_xyenu") diff --git a/Characters/States/PlayerState.cs b/Characters/States/PlayerState.cs index a5cdf2c..4889bab 100644 --- a/Characters/States/PlayerState.cs +++ b/Characters/States/PlayerState.cs @@ -13,38 +13,12 @@ namespace SupaLidlGame.Characters.State public override CharacterState Input(InputEvent @event) { - /* - if (@event is InputEventKey inputEventKey) - { - GD.Print("hello"); - if (inputEventKey.Keycode == Key.G) - { - GD.Print("hi"); - } - }*/ + #if DEBUG if (@event.IsActionPressed("equip")) { Character.Inventory.SelectedItem = Character.Inventory.GetNode("Sword"); - //Character.Inventory.AddItem(); } - - if (@event.IsActionPressed("attack1")) - { - if (Character.Inventory.SelectedItem is not null) - { - Character.UseCurrentItem(); - //Character.Inventory.SelectedItem.Use(); - //return AttackState; - } - } - - //if (this is PlayerAttackState) - //{ - // if (@event.IsActionReleased("attack1")) - // { - // return IdleState; - // } - //} + #endif return base.Input(@event); } @@ -63,6 +37,16 @@ namespace SupaLidlGame.Characters.State } } + if (Godot.Input.IsActionPressed("attack1")) + { + if (Character.Inventory.SelectedItem is not null) + { + Character.UseCurrentItem(); + //Character.Inventory.SelectedItem.Use(); + //return AttackState; + } + } + return base.Process(delta); } } diff --git a/Extensions/Node.cs b/Extensions/Node.cs index c8bd05c..3b160f5 100644 --- a/Extensions/Node.cs +++ b/Extensions/Node.cs @@ -24,5 +24,13 @@ namespace SupaLidlGame.Extensions return null; } + + /// + /// + /// + public static T GetNode(this Node node, string name) where T : Node + { + return node.GetNode(name) as T; + } } } diff --git a/Items/Weapons/Sword.cs b/Items/Weapons/Sword.cs index 012666d..d13f378 100644 --- a/Items/Weapons/Sword.cs +++ b/Items/Weapons/Sword.cs @@ -53,6 +53,7 @@ namespace SupaLidlGame.Items.Weapons IsParried = false; AnimationPlayer.Stop(); + IsParryable = true; if (GetNode("Anchor").Rotation < Mathf.DegToRad(50)) { @@ -76,7 +77,6 @@ namespace SupaLidlGame.Items.Weapons public void Attack() { ParryTimeOrigin = Time.GetTicksMsec(); - IsParryable = true; //RemainingAttackTime = AttackTime; IsAttacking = true; Hitbox.IsDisabled = false; diff --git a/Items/Weapons/Sword.tscn b/Items/Weapons/Sword.tscn index cee317b..de2e194 100644 --- a/Items/Weapons/Sword.tscn +++ b/Items/Weapons/Sword.tscn @@ -50,19 +50,19 @@ resource_name = "idle" [sub_resource type="Animation" id="Animation_orc8t"] resource_name = "use" -length = 0.75 +length = 1.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/loop_wrap = false tracks/0/keys = { -"times": PackedFloat32Array(0.05, 0.1, 0.2, 0.4, 0.75), -"transitions": PackedFloat32Array(1, 4, 1, 2, 1), -"update": 0, -"values": [-0.610865, -0.959931, 3.92699, 3.92699, 3.75246] +"times": PackedFloat32Array(0.05, 0.1, 0.2, 0.25, 0.75, 1.5), +"transitions": PackedFloat32Array(1, 4, 1, 2, 4, 1), +"update": 3, +"values": [-0.610865, -0.959931, 3.92699, 3.92699, 3.75246, -0.785398] } tracks/1/type = "method" tracks/1/imported = false @@ -105,9 +105,9 @@ tracks/0/path = NodePath("Anchor:rotation") tracks/0/interp = 1 tracks/0/loop_wrap = true tracks/0/keys = { -"times": PackedFloat32Array(0.05, 0.1, 0.2, 0.4, 0.75), +"times": PackedFloat32Array(0.05, 0.1, 0.2, 0.25, 0.75), "transitions": PackedFloat32Array(1, 4, 1, 2, 1), -"update": 0, +"update": 3, "values": [3.75246, 4.10152, -0.785398, -0.785398, -0.610865] } tracks/1/type = "method" @@ -155,6 +155,7 @@ points = PackedVector2Array(-11.314, -11.314, 0, -16, 11.314, -11.314, 16, 0, 11 [node name="Sword" type="Node2D" node_paths=PackedStringArray("Hitbox", "AnimationPlayer", "ParryParticles")] texture_filter = 3 +position = Vector2(2, 0) y_sort_enabled = true script = ExtResource("1_mlo73") Hitbox = NodePath("Hitbox") @@ -171,7 +172,7 @@ rotation = -1.0472 y_sort_enabled = true [node name="Sprite2D" type="Sprite2D" parent="Anchor"] -position = Vector2(0, -8) +position = Vector2(0, -10) y_sort_enabled = true texture = ExtResource("2_rnfo4") diff --git a/Scenes/Level.tscn b/Scenes/Level.tscn index 9f8040e..8748a15 100644 --- a/Scenes/Level.tscn +++ b/Scenes/Level.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=8 format=3 uid="uid://dd6xy1y0m8smm"] +[gd_scene load_steps=9 format=3 uid="uid://dd6xy1y0m8smm"] [ext_resource type="Texture2D" uid="uid://gm2pcnfg7h8j" path="res://Assets/Sprites/tileset.png" id="1_k6myx"] [ext_resource type="PackedScene" uid="uid://b2254pup8k161" path="res://Characters/Player.tscn" id="1_m35hr"] @@ -1101,7 +1101,13 @@ texture = ExtResource("1_k6myx") physics_layer_0/collision_layer = 1 sources/0 = SubResource("TileSetAtlasSource_1pa1q") -[sub_resource type="ShaderMaterial" id="ShaderMaterial_mq5wa"] +[sub_resource type="ShaderMaterial" id="ShaderMaterial_whp32"] +resource_local_to_scene = true +shader = ExtResource("4_056cf") +shader_parameter/color = null +shader_parameter/intensity = 0.0 + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_rthg0"] resource_local_to_scene = true shader = ExtResource("4_056cf") shader_parameter/color = null @@ -1144,11 +1150,11 @@ position = Vector2(-81, -34) motion_mode = 1 [node name="ExampleEnemy" parent="TileMap" instance=ExtResource("2_uti3y")] -material = SubResource("ShaderMaterial_mq5wa") +material = SubResource("ShaderMaterial_whp32") position = Vector2(38, 42) scale = Vector2(1.00571, 1) [node name="ExampleEnemy2" parent="TileMap" instance=ExtResource("2_uti3y")] -material = SubResource("ShaderMaterial_mq5wa") +material = SubResource("ShaderMaterial_rthg0") position = Vector2(190, 99) scale = Vector2(1.00571, 1) diff --git a/Utils/PlayerCamera.cs b/Utils/PlayerCamera.cs index 21a52f6..78f974b 100644 --- a/Utils/PlayerCamera.cs +++ b/Utils/PlayerCamera.cs @@ -38,8 +38,8 @@ namespace SupaLidlGame.Utils { Vector2 ret = Vector2.Zero; var rng = new RandomNumberGenerator(); - ret.x = (rng.Randf() * 2 - 0.5f) * intensity; - ret.y = (rng.Randf() * 2 - 0.5f) * intensity; + ret.x = (rng.Randf() - 0.5f) * intensity; + ret.y = (rng.Randf() - 0.5f) * intensity; return ret; } }