feat: merge Schritt 11 — sporennebel slider

This commit is contained in:
2026-04-16 00:32:03 +02:00
6 changed files with 63 additions and 2 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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