From d63d02fa7767d53deb62714cafbb67471af876b8 Mon Sep 17 00:00:00 2001 From: "s0wlz (Matthias Puchstein)" Date: Thu, 16 Apr 2026 00:30:02 +0200 Subject: [PATCH 1/5] =?UTF-8?q?feat:=20add=20SporeLevel=20autoload=20?= =?UTF-8?q?=E2=80=94=20spore=20density=20with=20level=5Fchanged=20signal?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ruf-der-pilze/project.godot | 1 + ruf-der-pilze/scripts/spore_level.gd | 8 ++++++++ 2 files changed, 9 insertions(+) create mode 100644 ruf-der-pilze/scripts/spore_level.gd diff --git a/ruf-der-pilze/project.godot b/ruf-der-pilze/project.godot index f7f0ea8..48a33f9 100644 --- a/ruf-der-pilze/project.godot +++ b/ruf-der-pilze/project.godot @@ -21,6 +21,7 @@ MCPGameBridge="res://addons/godot_mcp/game_bridge/mcp_game_bridge.gd" NetworkManager="*res://scripts/network_manager.gd" SceneManager="*res://scripts/scene_manager.gd" GameState="*res://scripts/game_state.gd" +SporeLevel="*res://scripts/spore_level.gd" [editor_plugins] diff --git a/ruf-der-pilze/scripts/spore_level.gd b/ruf-der-pilze/scripts/spore_level.gd new file mode 100644 index 0000000..42a1e8c --- /dev/null +++ b/ruf-der-pilze/scripts/spore_level.gd @@ -0,0 +1,8 @@ +extends Node + +signal level_changed(new_level: float) + +var current_level: float = 0.0: + set(value): + current_level = clampf(value, 0.0, 1.0) + level_changed.emit(current_level) From 7abc5258334217c769aebe3e9f21bb49c79aad36 Mon Sep 17 00:00:00 2001 From: "s0wlz (Matthias Puchstein)" Date: Thu, 16 Apr 2026 00:30:15 +0200 Subject: [PATCH 2/5] =?UTF-8?q?feat:=20network=5Fmanager=20=E2=80=94=20add?= =?UTF-8?q?=20request=5Fspore=5Flevel=20+=20=5Frelay=5Fspore=5Flevel=20RPC?= =?UTF-8?q?s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ruf-der-pilze/scripts/network_manager.gd | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/ruf-der-pilze/scripts/network_manager.gd b/ruf-der-pilze/scripts/network_manager.gd index 2d4143b..b45c638 100644 --- a/ruf-der-pilze/scripts/network_manager.gd +++ b/ruf-der-pilze/scripts/network_manager.gd @@ -169,6 +169,21 @@ func sync_player_position(player_id: int, position: Vector3, rotation: Vector3) GameState.update_player_transform(player_id, position, rotation) +# DM calls this on server only via rpc_id(1, level) +@rpc("any_peer", "call_remote", "reliable") +func request_spore_level(level: float) -> void: + if not multiplayer.is_server(): return + var requester_id := multiplayer.get_remote_sender_id() + if players.get(requester_id, {}).get("role", "") != "dm": return + _relay_spore_level.rpc(level) + + +# Server broadcasts to all clients including itself +@rpc("authority", "call_local", "reliable") +func _relay_spore_level(level: float) -> void: + SporeLevel.current_level = level + + # Client calls this on server only (rpc_id(1, ...)) @rpc("any_peer", "call_remote", "reliable") func broadcast_roll(roller_peer_id: int, d20_result: int, modifier: int) -> void: From 8c6302c2a339b6053e8f9f90c2df3eb62d0f22b2 Mon Sep 17 00:00:00 2001 From: "s0wlz (Matthias Puchstein)" Date: Thu, 16 Apr 2026 00:31:14 +0200 Subject: [PATCH 3/5] =?UTF-8?q?feat:=20dm=5Fview=20=E2=80=94=20add=20spore?= =?UTF-8?q?nnebel=20slider=20to=20SidePanel?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ruf-der-pilze/scenes/dm_view.tscn | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/ruf-der-pilze/scenes/dm_view.tscn b/ruf-der-pilze/scenes/dm_view.tscn index 36a314d..eaca3b4 100644 --- a/ruf-der-pilze/scenes/dm_view.tscn +++ b/ruf-der-pilze/scenes/dm_view.tscn @@ -78,6 +78,23 @@ size_flags_vertical = 3 bbcode_enabled = true fit_content = true +[node name="SepSpore" type="HSeparator" parent="RootLayout/TopSection/SidePanel"] + +[node name="LblSpore" type="Label" parent="RootLayout/TopSection/SidePanel"] +text = "Sporennebel" + +[node name="SporeLevelRow" type="HBoxContainer" parent="RootLayout/TopSection/SidePanel"] + +[node name="SporeSlider" type="HSlider" parent="RootLayout/TopSection/SidePanel/SporeLevelRow"] +size_flags_horizontal = 3 +max_value = 1.0 +step = 0.05 +value = 0.0 + +[node name="SporeValueLabel" type="Label" parent="RootLayout/TopSection/SidePanel/SporeLevelRow"] +custom_minimum_size = Vector2(35, 0) +text = "0%" + [node name="HSeparator" type="HSeparator" parent="RootLayout"] [node name="PlayerCamsRow" type="HBoxContainer" parent="RootLayout"] From 767f3981f987b72b7e0b23f290cd56d8d093844d Mon Sep 17 00:00:00 2001 From: "s0wlz (Matthias Puchstein)" Date: Thu, 16 Apr 2026 00:31:34 +0200 Subject: [PATCH 4/5] =?UTF-8?q?feat:=20dm=5Fview=20=E2=80=94=20wire=20spor?= =?UTF-8?q?ennebel=20slider=20to=20request=5Fspore=5Flevel=20RPC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ruf-der-pilze/scripts/dm_view.gd | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/ruf-der-pilze/scripts/dm_view.gd b/ruf-der-pilze/scripts/dm_view.gd index ace9feb..916a36c 100644 --- a/ruf-der-pilze/scripts/dm_view.gd +++ b/ruf-der-pilze/scripts/dm_view.gd @@ -19,6 +19,7 @@ func _ready() -> void: _setup_player_cams() _setup_overlay_panel() _setup_dc_section() + _setup_spore_slider() func _load_tavern_into_viewports() -> void: @@ -199,6 +200,15 @@ func _peer_color(peer_id: int) -> Color: return colors[peer_id % colors.size()] +func _setup_spore_slider() -> void: + var slider := $RootLayout/TopSection/SidePanel/SporeLevelRow/SporeSlider as HSlider + var value_label := $RootLayout/TopSection/SidePanel/SporeLevelRow/SporeValueLabel as Label + slider.value_changed.connect(func(val: float) -> void: + value_label.text = "%d%%" % roundi(val * 100.0) + NetworkManager.request_spore_level.rpc_id(1, val) + ) + + func _setup_dc_section() -> void: _dm_roll_log = $RootLayout/TopSection/SidePanel/RollLogScroll/RollLog as RichTextLabel NetworkManager.roll_received.connect(_on_roll_received_dm) From a1a7e24683a4fde01517de385c603fc0364b3063 Mon Sep 17 00:00:00 2001 From: "s0wlz (Matthias Puchstein)" Date: Thu, 16 Apr 2026 00:31:59 +0200 Subject: [PATCH 5/5] =?UTF-8?q?feat:=20tavern=20=E2=80=94=20spore=20overla?= =?UTF-8?q?y=20intensity=20driven=20by=20SporeLevel=20(continuous=20slider?= =?UTF-8?q?=20control)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ruf-der-pilze/scripts/tavern.gd | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/ruf-der-pilze/scripts/tavern.gd b/ruf-der-pilze/scripts/tavern.gd index e96f163..079b356 100644 --- a/ruf-der-pilze/scripts/tavern.gd +++ b/ruf-der-pilze/scripts/tavern.gd @@ -159,10 +159,20 @@ func _setup_spore_overlay() -> void: canvas.add_child(rect) NetworkManager.overlay_changed.connect(_on_overlay_changed) + SporeLevel.level_changed.connect(_on_spore_level_changed) -func _on_overlay_changed(overlay_name: String) -> void: - var intensity := 1.0 if overlay_name == "spore_active" else 0.0 +func _on_overlay_changed(_overlay_name: String) -> void: + _apply_spore_intensity() + + +func _on_spore_level_changed(_level: float) -> void: + _apply_spore_intensity() + + +func _apply_spore_intensity() -> void: + var overlay_name := GameState.get_overlay(NetworkManager.my_id) + var intensity := SporeLevel.current_level if overlay_name == "spore_active" else 0.0 _spore_mat.set_shader_parameter("intensity", intensity)