feat: merge Schritt 10 — spore overlay shader

This commit is contained in:
2026-04-16 00:28:13 +02:00
3 changed files with 60 additions and 0 deletions

View File

@@ -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")

View File

@@ -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]

View File

@@ -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;
}