diff --git a/ruf-der-pilze/scripts/tavern_lobby.gd b/ruf-der-pilze/scripts/tavern_lobby.gd index 6c7c3c4..198afb6 100644 --- a/ruf-der-pilze/scripts/tavern_lobby.gd +++ b/ruf-der-pilze/scripts/tavern_lobby.gd @@ -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: