feat: merge Schritt 11 — sporennebel slider
This commit is contained in:
@@ -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]
|
||||
|
||||
|
||||
@@ -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"]
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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:
|
||||
|
||||
8
ruf-der-pilze/scripts/spore_level.gd
Normal file
8
ruf-der-pilze/scripts/spore_level.gd
Normal 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)
|
||||
@@ -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)
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user