From c9c8fc9a1dc56cf26b82fce6f99ce567d072517a Mon Sep 17 00:00:00 2001 From: "s0wlz (Matthias Puchstein)" Date: Thu, 16 Apr 2026 00:21:54 +0200 Subject: [PATCH] =?UTF-8?q?feat:=20tavern=20=E2=80=94=20add=20dice=20rolle?= =?UTF-8?q?r=20UI=20with=20roll=20log=20for=20players?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ruf-der-pilze/scripts/tavern.gd | 74 +++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) diff --git a/ruf-der-pilze/scripts/tavern.gd b/ruf-der-pilze/scripts/tavern.gd index 640e2f8..3f671bf 100644 --- a/ruf-der-pilze/scripts/tavern.gd +++ b/ruf-der-pilze/scripts/tavern.gd @@ -2,6 +2,9 @@ extends Node3D const ROOM_COUNT := 8 +var _modifier: int = 0 +var _roll_log: RichTextLabel + func _ready() -> void: var args := OS.get_cmdline_args() + OS.get_cmdline_user_args() @@ -18,6 +21,7 @@ func _ready() -> void: timer.autostart = true timer.timeout.connect(_broadcast_camera_transform) add_child(timer) + _setup_dice_ui() func _get_dm_peer_id() -> int: @@ -56,3 +60,73 @@ func _spawn_player(room_index: int) -> void: add_child(controller) controller.global_transform = spawn.global_transform print("[Tavern] Spieler gespawnt in %s" % spawn_path) + + +func _setup_dice_ui() -> void: + var canvas := CanvasLayer.new() + canvas.name = "DiceUI" + add_child(canvas) + + var panel := PanelContainer.new() + panel.set_anchors_and_offsets_preset(Control.PRESET_BOTTOM_LEFT) + panel.offset_top = -120 + panel.offset_right = 400 + canvas.add_child(panel) + + var vbox := VBoxContainer.new() + panel.add_child(vbox) + + _roll_log = RichTextLabel.new() + _roll_log.custom_minimum_size = Vector2(380, 60) + _roll_log.bbcode_enabled = true + vbox.add_child(_roll_log) + + var hbox := HBoxContainer.new() + vbox.add_child(hbox) + + var roll_btn := Button.new() + roll_btn.text = "d20 Würfeln" + roll_btn.pressed.connect(_on_roll_pressed) + hbox.add_child(roll_btn) + + var mod_label := Label.new() + mod_label.text = " Mod:" + hbox.add_child(mod_label) + + var mod_display := Label.new() + mod_display.text = "0" + mod_display.custom_minimum_size = Vector2(30, 0) + mod_display.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER + + var mod_minus := Button.new() + mod_minus.text = "-" + mod_minus.pressed.connect(func() -> void: _modifier -= 1; _update_mod_display(mod_display)) + hbox.add_child(mod_minus) + + hbox.add_child(mod_display) + + var mod_plus := Button.new() + mod_plus.text = "+" + mod_plus.pressed.connect(func() -> void: _modifier += 1; _update_mod_display(mod_display)) + hbox.add_child(mod_plus) + + NetworkManager.roll_received.connect(_on_roll_received) + + +func _update_mod_display(label: Label) -> void: + label.text = "%+d" % _modifier if _modifier != 0 else "0" + + +func _on_roll_pressed() -> void: + var d20 := randi() % 20 + 1 + NetworkManager.broadcast_roll.rpc_id(1, NetworkManager.my_id, d20, _modifier) + + +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] + if d20_result == 20: + line = "[color=gold]" + line + " ★ NAT 20![/color]" + elif d20_result == 1: + line = "[color=red]" + line + " ☠ NAT 1[/color]" + _roll_log.append_text(line + "\n")