lobby: wire character sheet form — archetypes, modifier spinboxes, auto-sync RPC

This commit is contained in:
2026-04-16 00:52:02 +02:00
parent 5d2d97d064
commit bea3f5867b

View File

@@ -3,6 +3,63 @@ extends Node3D
var _local_role: String = ""
var _pending_player_name: String = ""
const ARCHETYPES := {
"Krieger": {"race": "Mensch", "class": "Krieger", "STR": 3, "DEX": 1, "CON": 2, "INT": 0, "WIS": 0, "CHA": 0},
"Magier": {"race": "Elf", "class": "Magier", "STR":-1, "DEX": 2, "CON": 0, "INT": 4, "WIS": 2, "CHA": 1},
"Kleriker": {"race": "Zwerg", "class": "Kleriker", "STR": 1, "DEX": 0, "CON": 2, "INT": 1, "WIS": 3, "CHA": 0},
"Schurke": {"race": "Halbelf", "class": "Schurke", "STR": 0, "DEX": 4, "CON": 1, "INT": 1, "WIS": 1, "CHA": 2},
"Druide": {"race": "Mensch", "class": "Druide", "STR": 0, "DEX": 1, "CON": 1, "INT": 1, "WIS": 3, "CHA": 0},
"Barbar": {"race": "Halbork", "class": "Barbar", "STR": 4, "DEX": 2, "CON": 3, "INT":-1, "WIS": 0, "CHA":-1},
}
func _collect_char_data() -> Dictionary:
var race_opt := $CanvasLayer/WaitPanel/CharSheet/CharGrid/RaceOption as OptionButton
var class_opt := $CanvasLayer/WaitPanel/CharSheet/CharGrid/ClassOption as OptionButton
return {
"race": race_opt.get_item_text(race_opt.selected),
"class": class_opt.get_item_text(class_opt.selected),
"STR": int($CanvasLayer/WaitPanel/CharSheet/ModGrid/SpinSTR.value),
"DEX": int($CanvasLayer/WaitPanel/CharSheet/ModGrid/SpinDEX.value),
"CON": int($CanvasLayer/WaitPanel/CharSheet/ModGrid/SpinCON.value),
"INT": int($CanvasLayer/WaitPanel/CharSheet/ModGrid/SpinINT.value),
"WIS": int($CanvasLayer/WaitPanel/CharSheet/ModGrid/SpinWIS.value),
"CHA": int($CanvasLayer/WaitPanel/CharSheet/ModGrid/SpinCHA.value),
}
func _send_char_data() -> void:
NetworkManager.request_update_character.rpc_id(1, _collect_char_data())
func _setup_char_sheet() -> void:
var race_opt := $CanvasLayer/WaitPanel/CharSheet/CharGrid/RaceOption as OptionButton
var class_opt := $CanvasLayer/WaitPanel/CharSheet/CharGrid/ClassOption as OptionButton
for race in ["Mensch", "Elf", "Zwerg", "Halbork", "Halbelf", "Tiefling"]:
race_opt.add_item(race)
for cls in ["Krieger", "Magier", "Kleriker", "Schurke", "Druide", "Barbar"]:
class_opt.add_item(cls)
for archetype_name: String in ARCHETYPES:
var btn := $CanvasLayer/WaitPanel/CharSheet/ArchetypeRow.get_node(
NodePath("Btn" + archetype_name)) as Button
var preset: Dictionary = ARCHETYPES[archetype_name]
btn.pressed.connect(func():
var r_opt := $CanvasLayer/WaitPanel/CharSheet/CharGrid/RaceOption as OptionButton
var c_opt := $CanvasLayer/WaitPanel/CharSheet/CharGrid/ClassOption as OptionButton
for i in r_opt.item_count:
if r_opt.get_item_text(i) == preset["race"]:
r_opt.selected = i
for i in c_opt.item_count:
if c_opt.get_item_text(i) == preset["class"]:
c_opt.selected = i
for stat: String in ["STR", "DEX", "CON", "INT", "WIS", "CHA"]:
($CanvasLayer/WaitPanel/CharSheet/ModGrid.get_node(
NodePath("Spin" + stat)) as SpinBox).value = preset[stat]
_send_char_data()
)
for spin_name: String in ["SpinSTR", "SpinDEX", "SpinCON", "SpinINT", "SpinWIS", "SpinCHA"]:
($CanvasLayer/WaitPanel/CharSheet/ModGrid.get_node(NodePath(spin_name)) as SpinBox
).value_changed.connect(func(_v: float): _send_char_data())
(race_opt as OptionButton).item_selected.connect(func(_i: int): _send_char_data())
(class_opt as OptionButton).item_selected.connect(func(_i: int): _send_char_data())
func _ready() -> void:
$CanvasLayer/JoinPanel/RoleOption.add_item("Spieler")
@@ -16,6 +73,7 @@ func _ready() -> void:
NetworkManager.player_joined.connect(_on_player_joined)
NetworkManager.player_left.connect(_on_player_left)
NetworkManager.player_list_synced.connect(_rebuild_player_list)
_setup_char_sheet()
func _on_join_pressed() -> void:
@@ -32,6 +90,7 @@ func _on_connected() -> void:
$CanvasLayer/JoinPanel.visible = false
$CanvasLayer/WaitPanel.visible = true
$CanvasLayer/WaitPanel/StartButton.visible = (_local_role == "dm")
$CanvasLayer/WaitPanel/CharSheet.visible = true
func _exit_tree() -> void: