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/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"] 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) 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: 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) 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)