From ebfd5f0e608044236068ed6815427ac898e2b638 Mon Sep 17 00:00:00 2001 From: Gabriel Kaszewski Date: Thu, 1 May 2025 20:36:40 +0200 Subject: [PATCH] Add ice effect component to enemies and adjust collapsing bridge collapse time --- objects/collapsing_bridge.tscn | 3 +- objects/enemy.tscn | 9 ++++-- objects/ice_fx.tscn | 22 +++++++++++++ scripts/components/ice_effect_component.gd | 12 +++++++- shaders/shine_shader.gdshader | 21 +++++++++++++ shaders/shine_shader.tres | 11 +++++++ sprites/ice.png | Bin 0 -> 195 bytes sprites/ice.png.import | 34 +++++++++++++++++++++ 8 files changed, 107 insertions(+), 5 deletions(-) create mode 100644 objects/ice_fx.tscn create mode 100644 shaders/shine_shader.gdshader create mode 100644 shaders/shine_shader.tres create mode 100644 sprites/ice.png create mode 100644 sprites/ice.png.import diff --git a/objects/collapsing_bridge.tscn b/objects/collapsing_bridge.tscn index 00662ea..5a9607e 100644 --- a/objects/collapsing_bridge.tscn +++ b/objects/collapsing_bridge.tscn @@ -40,9 +40,8 @@ to_collapse_timer = NodePath("../ToCollapseTimer") reset_timer = NodePath("../ResetTimer") sprite2d = NodePath("../Sprite2D") collision_shape = NodePath("../CollisionShape2D") -collapse_time = 2.0 +collapse_time = 0.75 reset_time = 3.0 -anim_time = 0.5 [connection signal="body_entered" from="Collapsable detector" to="CollapsableComponent" method="_on_collapsable_detector_body_entered"] [connection signal="body_exited" from="Collapsable detector" to="CollapsableComponent" method="_on_collapsable_detector_body_exited"] diff --git a/objects/enemy.tscn b/objects/enemy.tscn index b985ed0..e76aff7 100644 --- a/objects/enemy.tscn +++ b/objects/enemy.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=19 format=3 uid="uid://bwdlmualj6xbw"] +[gd_scene load_steps=20 format=3 uid="uid://bwdlmualj6xbw"] [ext_resource type="Shader" uid="uid://bs4xvm4qkurpr" path="res://shaders/hit_flash.tres" id="1_ep4yr"] [ext_resource type="Texture2D" uid="uid://cu72810eyk4dx" path="res://sprites/enemy-robot.png" id="2_hjtwe"] @@ -15,6 +15,7 @@ [ext_resource type="AudioStream" uid="uid://b3tsqhr06pbrs" path="res://sfx/enemy_hurt.wav" id="13_u4k3d"] [ext_resource type="AudioStream" uid="uid://dyev46uqusimi" path="res://sfx/shoot.wav" id="14_tdjks"] [ext_resource type="PackedScene" uid="uid://dx80ivlvuuew4" path="res://objects/fire_fx.tscn" id="15_mc6rj"] +[ext_resource type="PackedScene" uid="uid://ck6nml06tm6ue" path="res://objects/ice_fx.tscn" id="16_68hnm"] [sub_resource type="RectangleShape2D" id="RectangleShape2D_pwwji"] size = Vector2(25, 31) @@ -123,10 +124,11 @@ status_effect_component = NodePath("../StatusEffectComponent") root = NodePath("..") fire_fx = NodePath("../FireFX") -[node name="IceEffectComponent" type="Node" parent="." node_paths=PackedStringArray("status_effect_component")] +[node name="IceEffectComponent" type="Node" parent="." node_paths=PackedStringArray("status_effect_component", "ice_fx")] script = ExtResource("11_pq0k7") components_to_disable = [NodePath("../SideToSideMovement"), NodePath("../PeriodicShootingComponent"), NodePath("../DamageComponent")] status_effect_component = NodePath("../StatusEffectComponent") +ice_fx = NodePath("../Ice FX") [node name="sfx_hurt" type="AudioStreamPlayer2D" parent="."] stream = ExtResource("13_u4k3d") @@ -138,3 +140,6 @@ stream = ExtResource("14_tdjks") position = Vector2(0, 9) emitting = false amount = 2048 + +[node name="Ice FX" parent="." instance=ExtResource("16_68hnm")] +visible = false diff --git a/objects/ice_fx.tscn b/objects/ice_fx.tscn new file mode 100644 index 0000000..01660fd --- /dev/null +++ b/objects/ice_fx.tscn @@ -0,0 +1,22 @@ +[gd_scene load_steps=4 format=3 uid="uid://ck6nml06tm6ue"] + +[ext_resource type="Material" uid="uid://d1m2qrclercr" path="res://shaders/shine_shader.tres" id="2_t41v2"] + +[sub_resource type="Gradient" id="Gradient_yh4st"] +offsets = PackedFloat32Array(0, 0.461783, 0.993631) +colors = PackedColorArray(0.380392, 0.827451, 0.890196, 0.501961, 0.188235, 0.317647, 0.509804, 0.501961, 0.380392, 0.827451, 0.890196, 0.501961) + +[sub_resource type="GradientTexture2D" id="GradientTexture2D_of20b"] +gradient = SubResource("Gradient_yh4st") +width = 16 +height = 16 + +[node name="Ice FX" type="Node2D"] + +[node name="Ice" type="Sprite2D" parent="."] +modulate = Color(1, 1, 1, 0.392157) +self_modulate = Color(1, 1, 1, 0.556863) +material = ExtResource("2_t41v2") +position = Vector2(-1.25, 0.75) +scale = Vector2(1.96875, 1.96875) +texture = SubResource("GradientTexture2D_of20b") diff --git a/scripts/components/ice_effect_component.gd b/scripts/components/ice_effect_component.gd index 95a20e9..efa4678 100644 --- a/scripts/components/ice_effect_component.gd +++ b/scripts/components/ice_effect_component.gd @@ -3,6 +3,7 @@ extends Node @export var components_to_disable: Array = [] @export var status_effect_component: StatusEffectComponent +@export var ice_fx: Node2D var data: StatusEffectDataResource = null var ice_effects_applied: int = 0 @@ -35,6 +36,9 @@ func on_effect_removed(effect_type: StatusEffectComponent.EffectType) -> void: func apply_freeze() -> void: + if ice_fx: + ice_fx.visible = true + for component_path in components_to_disable: var component: Node = get_node_or_null(component_path) if not component or ice_effects_applied == 0: @@ -44,9 +48,15 @@ func apply_freeze() -> void: func remove_freeze() -> void: + if ice_effects_applied > 0: + return + + if ice_fx: + ice_fx.visible = false + for component_path in components_to_disable: var component: Node = get_node_or_null(component_path) - if not component or ice_effects_applied > 0: + if not component: continue component.process_mode = PROCESS_MODE_ALWAYS \ No newline at end of file diff --git a/shaders/shine_shader.gdshader b/shaders/shine_shader.gdshader new file mode 100644 index 0000000..67e7d93 --- /dev/null +++ b/shaders/shine_shader.gdshader @@ -0,0 +1,21 @@ +shader_type canvas_item; + +uniform vec4 shine_color : source_color = vec4(1.0); +uniform float shine_speed : hint_range(-10.0, 10.0, 0.1) = 1.0; +uniform float shine_size : hint_range(0.001, 1.0, 0.01) = 0.01; +uniform float shine_frequency: hint_range(1.0, 45.0, 0.5) = 5.0; +uniform float shine_angle_deg : hint_range(-360.0, 360.0, 1.0) = 45.0; + +void fragment() { + COLOR = texture(TEXTURE, UV); + // Convert degrees to radians + float angle_rad = radians(shine_angle_deg); + + // Calculate direction vector for the shine line + vec2 shine_dir = vec2(cos(angle_rad), sin(angle_rad)); + + // Project UV onto shine direction + float projection = dot(UV, shine_dir); + float shine = step(1.0 - shine_size * 0.5, 0.5 + 0.5 * sin(projection + TIME * shine_speed * shine_frequency)); + COLOR.rgb = mix(COLOR.rgb, shine_color.rgb, shine * shine_color.a); +} \ No newline at end of file diff --git a/shaders/shine_shader.tres b/shaders/shine_shader.tres new file mode 100644 index 0000000..6599468 --- /dev/null +++ b/shaders/shine_shader.tres @@ -0,0 +1,11 @@ +[gd_resource type="ShaderMaterial" load_steps=2 format=3 uid="uid://d1m2qrclercr"] + +[ext_resource type="Shader" path="res://shaders/shine_shader.gdshader" id="1_a47lf"] + +[resource] +shader = ExtResource("1_a47lf") +shader_parameter/shine_color = Color(1, 1, 1, 1) +shader_parameter/shine_speed = -1.0 +shader_parameter/shine_size = 0.011 +shader_parameter/shine_frequency = 3.0 +shader_parameter/shine_angle_deg = 45.0 diff --git a/sprites/ice.png b/sprites/ice.png new file mode 100644 index 0000000000000000000000000000000000000000..2a17ef857551dd442a7eaf4ae970696d9eccd649 GIT binary patch literal 195 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|YCT;XLo9li zPTtMiV8G*|zo9|$pmHUPzR*U`vV@5uItRr96j~Kr?D}?Z{<5xO+T5JqojDzx7uh#> zUCxtgjC`uO;Q+%sCT$;|8Ey|=FsI3!&T5Th)!Xl+KSw4aF)3^MkLj~jrWJ)I>58kG sS#LP>QhbfU>KfH=&!!)VlVH#bOIi2Z=Cu3)phFluUHx3vIVCg!07Mu?RR910 literal 0 HcmV?d00001 diff --git a/sprites/ice.png.import b/sprites/ice.png.import new file mode 100644 index 0000000..8b7c71c --- /dev/null +++ b/sprites/ice.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cfx1se2ffypeh" +path="res://.godot/imported/ice.png-0c1ed6b8c4de11f3b863ad9105ae6ec3.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://sprites/ice.png" +dest_files=["res://.godot/imported/ice.png-0c1ed6b8c4de11f3b863ad9105ae6ec3.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