From 9b24f9bc7c7d8c77bafec46ff1032a1364a19439 Mon Sep 17 00:00:00 2001 From: "s0wlz (Matthias Puchstein)" Date: Thu, 16 Apr 2026 00:27:32 +0200 Subject: [PATCH 1/3] =?UTF-8?q?feat:=20add=20spore=5Foverlay.gdshader=20?= =?UTF-8?q?=E2=80=94=20screen-space=20tint,=20vignette,=20distortion?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ruf-der-pilze/shaders/spore_overlay.gdshader | 34 ++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 ruf-der-pilze/shaders/spore_overlay.gdshader diff --git a/ruf-der-pilze/shaders/spore_overlay.gdshader b/ruf-der-pilze/shaders/spore_overlay.gdshader new file mode 100644 index 0000000..66562d3 --- /dev/null +++ b/ruf-der-pilze/shaders/spore_overlay.gdshader @@ -0,0 +1,34 @@ +shader_type canvas_item; + +uniform float intensity : hint_range(0.0, 1.0) = 0.0; +uniform sampler2D screen_texture : hint_screen_texture, filter_linear_mipmap; + +void fragment() { + vec2 uv = SCREEN_UV; + + // Subtle distortion — wavy lines, stronger at higher intensity + float distort_x = sin(uv.y * 35.0 + TIME * 1.8) * 0.003 * intensity; + float distort_y = cos(uv.x * 28.0 + TIME * 1.2) * 0.002 * intensity; + + // Sample screen with slight RGB split for chromatic aberration feel + float split = 0.003 * intensity; + vec4 r = texture(screen_texture, uv + vec2(distort_x + split, distort_y)); + vec4 g = texture(screen_texture, uv + vec2(distort_x, distort_y)); + vec4 b = texture(screen_texture, uv + vec2(distort_x - split, distort_y)); + vec4 screen = vec4(r.r, g.g, b.b, 1.0); + + // Vignette — darken edges + vec2 center = uv - 0.5; + float vignette = 1.0 - smoothstep(0.25, 0.75, length(center) * 1.6); + screen.rgb *= mix(1.0, vignette, intensity * 0.6); + + // Green spore tint + vec3 spore_tint = vec3(0.05, 0.45, 0.12); + screen.rgb = mix(screen.rgb, screen.rgb * spore_tint * 2.2, intensity * 0.35); + + // Slight brightness pulse + float pulse = 1.0 + sin(TIME * 1.5) * 0.04 * intensity; + screen.rgb *= pulse; + + COLOR = screen; +} From 5cce32286b1f2e031dc6f7ab2af52b82c0a35cb3 Mon Sep 17 00:00:00 2001 From: "s0wlz (Matthias Puchstein)" Date: Thu, 16 Apr 2026 00:27:46 +0200 Subject: [PATCH 2/3] =?UTF-8?q?feat:=20network=5Fmanager=20=E2=80=94=20emi?= =?UTF-8?q?t=20overlay=5Fchanged=20signal=20from=20set=5Foverlay=20RPC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ruf-der-pilze/scripts/network_manager.gd | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ruf-der-pilze/scripts/network_manager.gd b/ruf-der-pilze/scripts/network_manager.gd index 61f0389..2d4143b 100644 --- a/ruf-der-pilze/scripts/network_manager.gd +++ b/ruf-der-pilze/scripts/network_manager.gd @@ -15,6 +15,7 @@ signal player_left(peer_id: int) signal player_list_synced() signal game_started() signal roll_received(roller_peer_id: int, player_name: String, d20_result: int, modifier: int, total: int) +signal overlay_changed(overlay_name: String) func start_server(port: int, max_clients: int) -> void: @@ -160,6 +161,7 @@ func request_set_overlay(target_peer_id: int, overlay_name: String) -> void: @rpc("authority", "call_remote", "reliable") func set_overlay(overlay_name: String) -> void: GameState.set_overlay_local(my_id, overlay_name) + overlay_changed.emit(overlay_name) @rpc("any_peer", "call_remote", "unreliable") From 3e985b08e7a21931bd2b9f4136ebb794093dd27f Mon Sep 17 00:00:00 2001 From: "s0wlz (Matthias Puchstein)" Date: Thu, 16 Apr 2026 00:28:09 +0200 Subject: [PATCH 3/3] =?UTF-8?q?feat:=20tavern=20=E2=80=94=20add=20spore=20?= =?UTF-8?q?overlay=20CanvasLayer=20+=20shader=20driven=20by=20overlay=5Fch?= =?UTF-8?q?anged=20signal?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ruf-der-pilze/scripts/tavern.gd | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/ruf-der-pilze/scripts/tavern.gd b/ruf-der-pilze/scripts/tavern.gd index 27c053b..e96f163 100644 --- a/ruf-der-pilze/scripts/tavern.gd +++ b/ruf-der-pilze/scripts/tavern.gd @@ -5,6 +5,7 @@ const INTERACT_DISTANCE := 2.5 var _modifier: int = 0 var _roll_log: RichTextLabel +var _spore_mat: ShaderMaterial func _ready() -> void: @@ -23,6 +24,7 @@ func _ready() -> void: timer.timeout.connect(_broadcast_camera_transform) add_child(timer) _setup_dice_ui() + _setup_spore_overlay() func _get_dm_peer_id() -> int: @@ -142,6 +144,28 @@ func _on_roll_pressed() -> void: NetworkManager.broadcast_roll.rpc_id(1, NetworkManager.my_id, d20, _modifier) +func _setup_spore_overlay() -> void: + var canvas := CanvasLayer.new() + canvas.name = "SporeOverlay" + canvas.layer = 10 + add_child(canvas) + + var rect := ColorRect.new() + rect.set_anchors_and_offsets_preset(Control.PRESET_FULL_RECT) + rect.mouse_filter = Control.MOUSE_FILTER_IGNORE + _spore_mat = ShaderMaterial.new() + _spore_mat.shader = load("res://shaders/spore_overlay.gdshader") as Shader + rect.material = _spore_mat + canvas.add_child(rect) + + NetworkManager.overlay_changed.connect(_on_overlay_changed) + + +func _on_overlay_changed(overlay_name: String) -> void: + var intensity := 1.0 if overlay_name == "spore_active" else 0.0 + _spore_mat.set_shader_parameter("intensity", intensity) + + func _on_roll_received(roller_peer_id: int, player_name: String, d20_result: int, modifier: int, total: int) -> void: var mod_str := " %+d" % modifier if modifier != 0 else "" var line := "[b]%s[/b] würfelt %d%s = [b]%d[/b]" % [player_name, d20_result, mod_str, total]