diff --git a/Characters/Player.cs b/Characters/Player.cs index 1ffd795..e64e68d 100644 --- a/Characters/Player.cs +++ b/Characters/Player.cs @@ -137,7 +137,8 @@ public sealed partial class Player : Character { base.Stun(time); Camera.Shake(2, 0.8f); - // TODO: implement visual effects for stun + Events.EventBus.Instance.EmitSignal( + Events.EventBus.SignalName.PlayerStun); } protected override void OnReceivedDamage( diff --git a/Events/EventBus.cs b/Events/EventBus.cs index fe2e150..9aa4885 100644 --- a/Events/EventBus.cs +++ b/Events/EventBus.cs @@ -33,6 +33,9 @@ public partial class EventBus : Node [Signal] public delegate void PlayerHealthChangedEventHandler(HealthChangedArgs args); + [Signal] + public delegate void PlayerStunEventHandler(); + [Signal] public delegate void RegisteredBossEventHandler(Characters.Boss boss); diff --git a/Shaders/Grayscale.gdshader b/Shaders/Grayscale.gdshader new file mode 100644 index 0000000..030e002 --- /dev/null +++ b/Shaders/Grayscale.gdshader @@ -0,0 +1,11 @@ +shader_type canvas_item; + +uniform float grayscale_intensity : hint_range(0.0, 1.0) = 0.0; + +uniform sampler2D SCREEN_TEXTURE : hint_screen_texture, filter_linear_mipmap; + +void fragment() { + vec4 color = texture(SCREEN_TEXTURE, SCREEN_UV); + float average = (color.r + color.g + color.b) / 3.0; + COLOR = vec4(vec3(average), grayscale_intensity); +} diff --git a/Shaders/Vignette.gdshader b/Shaders/Vignette.gdshader index fcdeb26..7591530 100644 --- a/Shaders/Vignette.gdshader +++ b/Shaders/Vignette.gdshader @@ -6,18 +6,18 @@ uniform vec4 vignette_rgb : source_color = vec4(0.0, 0.0, 0.0, 1.0); uniform sampler2D SCREEN_TEXTURE : hint_screen_texture, filter_linear_mipmap; -float vignette(vec2 uv){ +float vignette(vec2 uv) { uv *= 1.0 - uv.xy; float vignette = uv.x * uv.y * 15.0; return pow(vignette, vignette_intensity * vignette_opacity); } -void fragment(){ +void fragment() { vec4 color = texture(SCREEN_TEXTURE, SCREEN_UV); vec4 text = texture(TEXTURE, UV); text.rgba *= (vignette_rgb.rgba); text.rgba *= (1.0 - vignette(UV)); - COLOR = vec4((text.rgb)*color.rgb,text.a); + COLOR = vec4((text.rgb) * color.rgb, text.a); } diff --git a/UI/Base.tscn b/UI/Base.tscn index b1b7a9e..c9699d4 100644 --- a/UI/Base.tscn +++ b/UI/Base.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=10 format=3 uid="uid://c271rdjhd1gfo"] +[gd_scene load_steps=14 format=3 uid="uid://c271rdjhd1gfo"] [ext_resource type="PackedScene" uid="uid://73jm5qjy52vq" path="res://Dialogue/balloon.tscn" id="1_atjb1"] [ext_resource type="Script" path="res://UI/UIController.cs" id="2_b4b6l"] @@ -9,6 +9,13 @@ [ext_resource type="PackedScene" uid="uid://sfs8dpfitpdu" path="res://UI/Hotbar.tscn" id="5_mmp18"] [ext_resource type="PackedScene" uid="uid://d3q1yu3n7cqfj" path="res://UI/SceneTransition.tscn" id="6_j0nhv"] [ext_resource type="PackedScene" uid="uid://2afbrf8asy2a" path="res://UI/PostProcessing/Vignette.tscn" id="9_p1ubd"] +[ext_resource type="PackedScene" uid="uid://b1wsryv4bn0cn" path="res://UI/PostProcessing/StunEffect.tscn" id="10_646ma"] +[ext_resource type="Shader" path="res://Shaders/Grayscale.gdshader" id="11_w4gn1"] +[ext_resource type="Texture2D" uid="uid://bw052v8ikfget" path="res://icon.svg" id="12_tyv35"] + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_kbd61"] +shader = ExtResource("11_w4gn1") +shader_parameter/grayscale_intensity = 0.0 [node name="BaseUI" type="CanvasLayer"] process_mode = 3 @@ -105,7 +112,22 @@ layout_mode = 2 [node name="SceneTransition" parent="SubViewportContainer/UIViewport/MainUILayer" instance=ExtResource("6_j0nhv")] z_index = 1 -[node name="PostProcessing" type="CanvasLayer" parent="SubViewportContainer/UIViewport"] -layer = 2 +[node name="PostProcessing" type="CanvasLayer" parent="."] -[node name="TextureRect" parent="SubViewportContainer/UIViewport/PostProcessing" instance=ExtResource("9_p1ubd")] +[node name="Vignette" parent="PostProcessing" instance=ExtResource("9_p1ubd")] + +[node name="StunEffect" parent="PostProcessing" instance=ExtResource("10_646ma")] + +[node name="Sprite2D" type="TextureRect" parent="PostProcessing"] +visible = false +material = SubResource("ShaderMaterial_kbd61") +anchors_preset = 3 +anchor_left = 1.0 +anchor_top = 1.0 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_left = -128.0 +offset_top = -128.0 +grow_horizontal = 0 +grow_vertical = 0 +texture = ExtResource("12_tyv35") diff --git a/UI/PostProcessing/StunEffect.cs b/UI/PostProcessing/StunEffect.cs new file mode 100644 index 0000000..6fbef8a --- /dev/null +++ b/UI/PostProcessing/StunEffect.cs @@ -0,0 +1,15 @@ +using Godot; + +namespace SupaLidlGame.UI.PostProcessing; + +public partial class StunEffect : ColorRect +{ + public override void _Ready() + { + Events.EventBus.Instance.PlayerStun += () => + { + GD.Print("PLAYER STUNNED!!!"); + GetNode("AnimationPlayer").Play("tighten"); + }; + } +} diff --git a/UI/PostProcessing/StunEffect.tscn b/UI/PostProcessing/StunEffect.tscn new file mode 100644 index 0000000..9f5e63a --- /dev/null +++ b/UI/PostProcessing/StunEffect.tscn @@ -0,0 +1,58 @@ +[gd_scene load_steps=7 format=3 uid="uid://b1wsryv4bn0cn"] + +[ext_resource type="Shader" path="res://Shaders/Grayscale.gdshader" id="2_dlm7y"] +[ext_resource type="Script" path="res://UI/PostProcessing/StunEffect.cs" id="3_h8rlj"] + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_uawkd"] +shader = ExtResource("2_dlm7y") +shader_parameter/grayscale_intensity = 0.0 + +[sub_resource type="Animation" id="Animation_5d4h1"] +length = 0.001 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath(".:material:shader_parameter/grayscale_intensity") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} + +[sub_resource type="Animation" id="Animation_txpv1"] +resource_name = "tighten" +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath(".:material:shader_parameter/grayscale_intensity") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 1), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [1.0, 0.0] +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_kyxik"] +_data = { +"RESET": SubResource("Animation_5d4h1"), +"tighten": SubResource("Animation_txpv1") +} + +[node name="StunEffect" type="ColorRect"] +material = SubResource("ShaderMaterial_uawkd") +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("3_h8rlj") + +[node name="AnimationPlayer" type="AnimationPlayer" parent="."] +libraries = { +"": SubResource("AnimationLibrary_kyxik") +} diff --git a/UI/PostProcessing/Vignette.tscn b/UI/PostProcessing/Vignette.tscn index adf2ef7..11345cd 100644 --- a/UI/PostProcessing/Vignette.tscn +++ b/UI/PostProcessing/Vignette.tscn @@ -7,7 +7,7 @@ [sub_resource type="ShaderMaterial" id="ShaderMaterial_fmdjb"] shader = ExtResource("1_nrekm") shader_parameter/vignette_intensity = 0.1 -shader_parameter/vignette_opacity = 0.1 +shader_parameter/vignette_opacity = 0.2 shader_parameter/vignette_rgb = Color(0, 0, 0, 1) [sub_resource type="Animation" id="Animation_ph4f2"] @@ -34,7 +34,7 @@ tracks/1/keys = { "times": PackedFloat32Array(0), "transitions": PackedFloat32Array(1), "update": 0, -"values": [0.1] +"values": [0.2] } [sub_resource type="Animation" id="Animation_sqaf2"] @@ -50,7 +50,7 @@ tracks/0/keys = { "times": PackedFloat32Array(0, 0.2, 0.5), "transitions": PackedFloat32Array(1, 1, 1), "update": 0, -"values": [0.1, 0.1, 0.1] +"values": [0.4, 0.1, 0.1] } tracks/1/type = "value" tracks/1/imported = false @@ -62,7 +62,7 @@ tracks/1/keys = { "times": PackedFloat32Array(0.2, 0.5), "transitions": PackedFloat32Array(1, 0.25), "update": 0, -"values": [1.0, 0.1] +"values": [1.0, 0.2] } [sub_resource type="AnimationLibrary" id="AnimationLibrary_s4mrn"] @@ -71,7 +71,7 @@ _data = { "tighten": SubResource("Animation_sqaf2") } -[node name="TextureRect" type="TextureRect"] +[node name="Vignette" type="TextureRect"] material = SubResource("ShaderMaterial_fmdjb") anchors_preset = 15 anchor_right = 1.0