From 458969be87679b85ad2bfcd43e268c7f3327c105 Mon Sep 17 00:00:00 2001 From: ArthurErlich Date: Tue, 24 Jun 2025 19:28:06 +0200 Subject: [PATCH 1/6] chore: update godot version --- project.godot | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project.godot b/project.godot index 13329fd..c1f860d 100644 --- a/project.godot +++ b/project.godot @@ -12,5 +12,5 @@ config_version=5 config/name="dujorak" run/main_scene="res://src/scenes/game.tscn" -config/features=PackedStringArray("4.3", "Forward Plus") +config/features=PackedStringArray("4.4", "Forward Plus") config/icon="res://icon.svg" -- 2.49.1 From 40caea11419ab88117ec8b83caeca0eafd66221b Mon Sep 17 00:00:00 2001 From: ArthurErlich Date: Tue, 24 Jun 2025 19:28:21 +0200 Subject: [PATCH 2/6] fix: added launch json for vscode --- .vscode/launch.json | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 .vscode/launch.json diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..d77cb62 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,18 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "GDScript: Launch Project", + "type": "godot", + "request": "launch", + "project": "${workspaceFolder}", + "debug_collisions": false, + "debug_paths": false, + "debug_navigation": false, + "additional_options": "" + } + ] +} \ No newline at end of file -- 2.49.1 From 099e55a9429595adaaa95ae04f6fb8975d449162 Mon Sep 17 00:00:00 2001 From: ArthurErlich Date: Tue, 24 Jun 2025 19:30:09 +0200 Subject: [PATCH 3/6] chore: removed global godot editor path. NOTE: please do not submitt those config into the worcspace settings path. --- .vscode/settings.json | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 .vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index 9457256..0000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "godotTools.editorPath.godot4": "c:\\Program Files\\Godot\\Godot_v4.3-stable_win64.exe" -} \ No newline at end of file -- 2.49.1 From 9ed12eb4e15a0c6858cdd41e25a77aaefd9a60f3 Mon Sep 17 00:00:00 2001 From: ArthurErlich Date: Tue, 24 Jun 2025 19:31:51 +0200 Subject: [PATCH 4/6] chore: update to newer godot version. Added UID --- src/scenes/game.tscn | 4 +- src/scripts/game.gd.uid | 1 + src/scripts/ui.gd | 96 ++++++++++++++++++++--------------------- src/scripts/ui.gd.uid | 1 + 4 files changed, 52 insertions(+), 50 deletions(-) create mode 100644 src/scripts/game.gd.uid create mode 100644 src/scripts/ui.gd.uid diff --git a/src/scenes/game.tscn b/src/scenes/game.tscn index f964a9c..d89c0d1 100644 --- a/src/scenes/game.tscn +++ b/src/scenes/game.tscn @@ -1,7 +1,7 @@ [gd_scene load_steps=3 format=3 uid="uid://b3cyy67wp6hd0"] -[ext_resource type="Script" path="res://src/scripts/game.gd" id="1_vl3q8"] -[ext_resource type="Script" path="res://src/scripts/ui.gd" id="2_dljv7"] +[ext_resource type="Script" uid="uid://dvscisoria6aj" path="res://src/scripts/game.gd" id="1_vl3q8"] +[ext_resource type="Script" uid="uid://j8w01uew0ovu" path="res://src/scripts/ui.gd" id="2_dljv7"] [node name="Game" type="Node2D"] script = ExtResource("1_vl3q8") diff --git a/src/scripts/game.gd.uid b/src/scripts/game.gd.uid new file mode 100644 index 0000000..3f355a0 --- /dev/null +++ b/src/scripts/game.gd.uid @@ -0,0 +1 @@ +uid://dvscisoria6aj diff --git a/src/scripts/ui.gd b/src/scripts/ui.gd index b122c61..22cf142 100644 --- a/src/scripts/ui.gd +++ b/src/scripts/ui.gd @@ -26,7 +26,7 @@ func _ready(): # Load card atlas if exists if FileAccess.file_exists("res://src/assets/card_atlas.png"): card_atlas = load("res://src/assets/card_atlas.png") - + setup_ui() func setup_ui(): @@ -34,64 +34,64 @@ func setup_ui(): var main_vbox = VBoxContainer.new() add_child(main_vbox) main_vbox.set_anchors_and_offsets_preset(Control.PRESET_FULL_RECT) - + # Game state info game_state_label = Label.new() game_state_label.text = "Spiel wird geladen..." game_state_label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER main_vbox.add_child(game_state_label) - + # Top area (Opponent + Jokers) var top_hbox = HBoxContainer.new() main_vbox.add_child(top_hbox) - + setup_opponent_area(top_hbox) setup_joker_area(top_hbox) - + # Middle area (Table + Trump) var middle_hbox = HBoxContainer.new() main_vbox.add_child(middle_hbox) - + setup_table_area(middle_hbox) setup_trump_area(middle_hbox) - + # Action buttons action_buttons = HBoxContainer.new() action_buttons.alignment = BoxContainer.ALIGNMENT_CENTER main_vbox.add_child(action_buttons) - + setup_action_buttons() - + # Bottom area (Player hand + Controls) var bottom_vbox = VBoxContainer.new() main_vbox.add_child(bottom_vbox) - + setup_controls(bottom_vbox) setup_player_area(bottom_vbox) func setup_opponent_area(parent): var area = VBoxContainer.new() parent.add_child(area) - + var label = Label.new() label.text = "Gegner" area.add_child(label) - + opponent_hand_container = HBoxContainer.new() area.add_child(opponent_hand_container) func setup_joker_area(parent): var area = VBoxContainer.new() parent.add_child(area) - + var label = Label.new() label.text = "Joker (0/3)" label.name = "JokerLabel" area.add_child(label) - + joker_slots_container = HBoxContainer.new() area.add_child(joker_slots_container) - + # Create 3 joker slots for i in range(3): var slot = create_joker_slot() @@ -100,12 +100,12 @@ func setup_joker_area(parent): func setup_table_area(parent): var table_container = VBoxContainer.new() parent.add_child(table_container) - + var label = Label.new() label.text = "Spielfeld" label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER table_container.add_child(label) - + table_area = GridContainer.new() table_area.columns = 4 # Angriff/Verteidigung Paare table_container.add_child(table_area) @@ -113,18 +113,18 @@ func setup_table_area(parent): func setup_trump_area(parent): var area = VBoxContainer.new() parent.add_child(area) - + var label = Label.new() label.text = "Trump" area.add_child(label) - + trump_display = create_card_back() area.add_child(trump_display) - + var deck_label = Label.new() deck_label.text = "Deck" area.add_child(deck_label) - + deck_display = create_card_back() area.add_child(deck_display) @@ -133,23 +133,23 @@ func setup_action_buttons(): defend_btn.text = "Verteidigung beenden" defend_btn.pressed.connect(_on_defend_button_pressed) action_buttons.add_child(defend_btn) - + var take_btn = Button.new() take_btn.text = "Karten nehmen" take_btn.pressed.connect(_on_take_cards_pressed) action_buttons.add_child(take_btn) - + # Initially hidden action_buttons.visible = false func setup_controls(parent): var controls = HBoxContainer.new() parent.add_child(controls) - + coins_label = Label.new() coins_label.text = "Münzen: 100" controls.add_child(coins_label) - + var booster_btn = Button.new() booster_btn.text = "Booster kaufen (50)" booster_btn.pressed.connect(_on_booster_button_pressed) @@ -158,11 +158,11 @@ func setup_controls(parent): func setup_player_area(parent): var area = VBoxContainer.new() parent.add_child(area) - + var label = Label.new() label.text = "Deine Karten" area.add_child(label) - + player_hand_container = HBoxContainer.new() area.add_child(player_hand_container) @@ -171,7 +171,7 @@ func create_card_ui(card, clickable: bool = true) -> Control: var card_button = Button.new() card_button.custom_minimum_size = card_size card_button.disabled = not clickable - + if card.is_joker: card_button.text = "JOKER\n" + str(card.joker_type) card_button.modulate = Color.GOLD @@ -179,35 +179,35 @@ func create_card_ui(card, clickable: bool = true) -> Control: var suit_symbols = ["♥", "♦", "♣", "♠"] var suit_text = suit_symbols[card.suit] card_button.text = str(card.value) + "\n" + suit_text - + # Color coding if card.suit in [0, 1]: # Hearts, Diamonds card_button.modulate = Color.RED else: # Clubs, Spades card_button.modulate = Color.BLACK - + if clickable: card_button.pressed.connect(_on_card_clicked.bind(card)) - + return card_button func create_card_back() -> Control: var card_back = ColorRect.new() card_back.color = Color.BLUE card_back.custom_minimum_size = card_size - + var label = Label.new() label.text = "🂠" label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER label.vertical_alignment = VERTICAL_ALIGNMENT_CENTER card_back.add_child(label) - + return card_back func create_joker_slot() -> Control: var slot = Panel.new() slot.custom_minimum_size = card_size * 0.7 - + var style = StyleBoxFlat.new() style.bg_color = Color.GRAY style.border_width_left = 2 @@ -216,7 +216,7 @@ func create_joker_slot() -> Control: style.border_width_bottom = 2 style.border_color = Color.WHITE slot.add_theme_stylebox_override("panel", style) - + return slot # Update Functions @@ -224,7 +224,7 @@ func update_player_hand(cards: Array): # Clear existing cards for child in player_hand_container.get_children(): child.queue_free() - + # Add new cards for card in cards: var card_ui = create_card_ui(card, true) @@ -234,7 +234,7 @@ func update_opponent_hand(card_count: int): # Clear existing cards for child in opponent_hand_container.get_children(): child.queue_free() - + # Add card backs for i in range(card_count): var card_back = create_card_back() @@ -245,23 +245,23 @@ func update_table(table_pairs: Array, attacking_cards: Array): # Clear existing table for child in table_area.get_children(): child.queue_free() - + # Show completed pairs for pair in table_pairs: var attack_card = create_card_ui(pair.attack, false) attack_card.modulate = Color.ORANGE # Angriff table_area.add_child(attack_card) - + var defend_card = create_card_ui(pair.defend, false) defend_card.modulate = Color.GREEN # Verteidigung table_area.add_child(defend_card) - + # Show undefended attacks for card in attacking_cards: var attack_card = create_card_ui(card, false) attack_card.modulate = Color.RED # Unverteidigt table_area.add_child(attack_card) - + # Empty slot for defense var empty_slot = Panel.new() empty_slot.custom_minimum_size = card_size @@ -273,13 +273,13 @@ func update_table(table_pairs: Array, attacking_cards: Array): func update_joker_slots(active_jokers: Array): var label = joker_slots_container.get_parent().get_node("JokerLabel") label.text = "Joker (" + str(active_jokers.size()) + "/3)" - + # Update slots for i in range(3): var slot = joker_slots_container.get_child(i) if i < active_jokers.size(): slot.modulate = Color.GREEN - + # Add joker label var joker_label = Label.new() joker_label.text = str(active_jokers[i]) @@ -329,23 +329,23 @@ func update_game_state(state, is_player_turn: bool): func show_joker_choice(joker_type): var dialog = AcceptDialog.new() dialog.title = "Joker gezogen!" - + var vbox = VBoxContainer.new() - + var info_label = Label.new() info_label.text = "Du hast einen " + str(joker_type) + " Joker gezogen!" vbox.add_child(info_label) - + var play_btn = Button.new() play_btn.text = "Sofort spielen" play_btn.pressed.connect(_on_joker_play_immediate.bind(joker_type, dialog)) vbox.add_child(play_btn) - + var keep_btn = Button.new() keep_btn.text = "Behalten (Risiko!)" keep_btn.pressed.connect(_on_joker_keep.bind(dialog)) vbox.add_child(keep_btn) - + dialog.add_child(vbox) add_child(dialog) dialog.popup_centered() diff --git a/src/scripts/ui.gd.uid b/src/scripts/ui.gd.uid new file mode 100644 index 0000000..9a345f2 --- /dev/null +++ b/src/scripts/ui.gd.uid @@ -0,0 +1 @@ +uid://j8w01uew0ovu -- 2.49.1 From ad525e67e9b51d2db92b2d6480f723a6bc5c2ec1 Mon Sep 17 00:00:00 2001 From: ArthurErlich Date: Tue, 24 Jun 2025 19:51:16 +0200 Subject: [PATCH 5/6] feat: added global variables --- project.godot | 4 ++++ src/scripts/globals.gd | 6 ++++++ src/scripts/globals.gd.uid | 1 + 3 files changed, 11 insertions(+) create mode 100644 src/scripts/globals.gd create mode 100644 src/scripts/globals.gd.uid diff --git a/project.godot b/project.godot index c1f860d..ea104dd 100644 --- a/project.godot +++ b/project.godot @@ -14,3 +14,7 @@ config/name="dujorak" run/main_scene="res://src/scenes/game.tscn" config/features=PackedStringArray("4.4", "Forward Plus") config/icon="res://icon.svg" + +[autoload] + +Globals="*res://src/scripts/globals.gd" diff --git a/src/scripts/globals.gd b/src/scripts/globals.gd new file mode 100644 index 0000000..168f574 --- /dev/null +++ b/src/scripts/globals.gd @@ -0,0 +1,6 @@ +extends Node + +enum Suits {HEARTS, DIAMONDS, CLUBS, SPADES} +enum Values {SIX = 6, SEVEN, EIGHT, NINE, TEN, JACK, QUEEN, KING, ACE} +enum GameState {SETUP, ATTACK, DEFEND, DRAW_PHASE, GAME_OVER} +enum JokerType {DOUBLE_ATTACK, TRUMP_CHANGE, DRAW_BLOCK} diff --git a/src/scripts/globals.gd.uid b/src/scripts/globals.gd.uid new file mode 100644 index 0000000..3d51916 --- /dev/null +++ b/src/scripts/globals.gd.uid @@ -0,0 +1 @@ +uid://cp7yt3d324xiv -- 2.49.1 From 9111602ef80ec60064f477af8d3a86aac6e42051 Mon Sep 17 00:00:00 2001 From: ArthurErlich Date: Tue, 24 Jun 2025 19:51:28 +0200 Subject: [PATCH 6/6] feat: switched to global variables --- src/scripts/game.gd | 158 +++++++++++++++++++++----------------------- 1 file changed, 76 insertions(+), 82 deletions(-) diff --git a/src/scripts/game.gd b/src/scripts/game.gd index 8f7dd96..e2fc30b 100644 --- a/src/scripts/game.gd +++ b/src/scripts/game.gd @@ -1,25 +1,19 @@ extends Node2D - -enum Suits {HEARTS, DIAMONDS, CLUBS, SPADES} -enum Values {SIX = 6, SEVEN, EIGHT, NINE, TEN, JACK, QUEEN, KING, ACE} -enum GameState {SETUP, ATTACK, DEFEND, DRAW_PHASE, GAME_OVER} -enum JokerType {DOUBLE_ATTACK, TRUMP_CHANGE, DRAW_BLOCK} - class Player: var hand: Array = [] var jokers_hand: Array = [] var coins: int = 100 var is_attacker: bool = false - - func add_joker_to_hand(joker_type: JokerType): + + func add_joker_to_hand(joker_type: Globals.JokerType): jokers_hand.append(joker_type) - + func has_jokers_in_hand() -> bool: return jokers_hand.size() > 0 - + func remove_card(card): hand.erase(card) - + func has_card_value(value) -> bool: for card in hand: if card.value == value: @@ -28,19 +22,19 @@ class Player: # Game Variables var deck: Array = [] -var trump_suit: Suits +var trump_suit: Globals.Suits var player1: Player var player2: Player var current_attacker: Player var current_defender: Player -var game_phase: GameState = GameState.SETUP +var game_phase: Globals.GameState = Globals.GameState.SETUP var active_jokers: Array = [] var MAX_JOKERS: int = 3 # Battle Variables var attacking_cards: Array = [] var defending_cards: Array = [] -var table_pairs: Array = [] # [{attack: card, defend: card}] +var table_pairs: Array = [] # [{attack: card, defend: card}] var can_add_attack: bool = false # UI Reference @@ -52,14 +46,14 @@ func _ready(): current_attacker = player1 current_defender = player2 player1.is_attacker = true - + if ui: ui.card_played.connect(_on_card_played) ui.joker_played.connect(_on_joker_played) ui.booster_bought.connect(_on_booster_bought) ui.defend_button_pressed.connect(_on_defend_complete) ui.take_cards_pressed.connect(_on_take_cards) - + start_new_game() func start_new_game(): @@ -68,14 +62,14 @@ func start_new_game(): shuffle_deck() deal_cards() set_trump() - game_phase = GameState.ATTACK + game_phase = Globals.GameState.ATTACK update_ui() print("Spiel gestartet! ", current_attacker, " greift an") func create_deck(): deck.clear() - for suit in [Suits.HEARTS, Suits.DIAMONDS, Suits.CLUBS, Suits.SPADES]: - for value in [Values.SIX, Values.SEVEN, Values.EIGHT, Values.NINE, Values.TEN, Values.JACK, Values.QUEEN, Values.KING, Values.ACE]: + for suit in [Globals.Suits.HEARTS, Globals.Suits.DIAMONDS, Globals.Suits.CLUBS, Globals.Suits.SPADES]: + for value in [Globals.Values.SIX, Globals.Values.SEVEN, Globals.Values.EIGHT, Globals.Values.NINE, Globals.Values.TEN, Globals.Values.JACK, Globals.Values.QUEEN, Globals.Values.KING, Globals.Values.ACE]: deck.append({"suit": suit, "value": value, "is_joker": false}) func setup_initial_jokers(): @@ -92,7 +86,7 @@ func deal_cards(): player1.add_joker_to_hand(card.joker_type) else: player1.hand.append(card) - + if deck.size() > 0: var card = deck.pop_back() if card.is_joker: @@ -109,9 +103,9 @@ func set_trump(): # MAIN GAME LOGIC func _on_card_played(card): match game_phase: - GameState.ATTACK: + Globals.GameState.ATTACK: handle_attack(card) - GameState.DEFEND: + Globals.GameState.DEFEND: handle_defense(card) func handle_attack(card): @@ -119,35 +113,35 @@ func handle_attack(card): if not can_attack_with_card(card): print("Angriff mit dieser Karte nicht möglich!") return - + # Karte vom Angreifer entfernen current_attacker.remove_card(card) attacking_cards.append(card) - + print("Angriff mit: ", card) - + # Wechsel zu Verteidigung - game_phase = GameState.DEFEND + game_phase = Globals.GameState.DEFEND update_ui() func handle_defense(card): if attacking_cards.size() == 0: print("Nichts zu verteidigen!") return - - var attack_card = attacking_cards[-1] # Letzte Angriffskarte - + + var attack_card = attacking_cards[-1] # Letzte Angriffskarte + if can_beat_card(attack_card, card): # Erfolgreiche Verteidigung current_defender.remove_card(card) defending_cards.append(card) - + # Paar erstellen table_pairs.append({"attack": attack_card, "defend": card}) attacking_cards.pop_back() - + print("Verteidigt: ", attack_card, " mit ", card) - + # Prüfen ob weitere Angriffe möglich can_add_attack = true check_round_end() @@ -158,26 +152,26 @@ func can_attack_with_card(card) -> bool: # Erster Angriff: Jede Karte erlaubt if attacking_cards.size() == 0 and table_pairs.size() == 0: return true - + # Weitere Angriffe: Nur Werte die schon auf dem Tisch liegen - var table_values = [] + var table_Globals = [] for pair in table_pairs: - table_values.append(pair.attack.value) - table_values.append(pair.defend.value) + table_Globals.Values.append(pair.attack.value) + table_Globals.Values.append(pair.defend.value) for attack in attacking_cards: - table_values.append(attack.value) - - return card.value in table_values + table_Globals.Values.append(attack.value) + + return card.value in table_Globals.Values func can_beat_card(attacking_card, defending_card) -> bool: # Trump schlägt alles außer höheren Trump if defending_card.suit == trump_suit and attacking_card.suit != trump_suit: return true - + # Gleiche Farbe: höherer Wert gewinnt if attacking_card.suit == defending_card.suit: return defending_card.value > attacking_card.value - + return false func check_round_end(): @@ -185,7 +179,7 @@ func check_round_end(): if attacking_cards.size() == 0: if can_add_attack and current_attacker.hand.size() > 0: # Angreifer kann weitere Karten spielen - game_phase = GameState.ATTACK + game_phase = Globals.GameState.ATTACK print("Weitere Angriffe möglich") else: # Runde erfolgreich verteidigt @@ -196,36 +190,36 @@ func check_round_end(): func end_round_defended(): print("Runde erfolgreich verteidigt!") - + # Karten vom Tisch entfernen table_pairs.clear() attacking_cards.clear() defending_cards.clear() can_add_attack = false - + # Rollen tauschen: Verteidiger wird Angreifer swap_roles() - + # Karten nachziehen draw_phase() func end_round_taken(): print("Verteidiger nimmt alle Karten!") - + # Alle Karten an Verteidiger geben for pair in table_pairs: current_defender.hand.append(pair.attack) current_defender.hand.append(pair.defend) - + for card in attacking_cards: current_defender.hand.append(card) - + # Aufräumen table_pairs.clear() attacking_cards.clear() defending_cards.clear() can_add_attack = false - + # Angreifer bleibt Angreifer (Verteidiger nimmt) # Karten nachziehen draw_phase() @@ -234,27 +228,27 @@ func swap_roles(): var temp = current_attacker current_attacker = current_defender current_defender = temp - + current_attacker.is_attacker = true current_defender.is_attacker = false - + print("Rollen getauscht: ", current_attacker, " greift an") func draw_phase(): - game_phase = GameState.DRAW_PHASE - + game_phase = Globals.GameState.DRAW_PHASE + # Angreifer zieht zuerst auf 6 Karten draw_cards_to_six(current_attacker) - + # Dann Verteidiger draw_cards_to_six(current_defender) - + # Spielende prüfen if check_game_end(): return - + # Nächste Runde starten - game_phase = GameState.ATTACK + game_phase = Globals.GameState.ATTACK update_ui() func draw_cards_to_six(player: Player): @@ -267,23 +261,23 @@ func draw_cards_to_six(player: Player): else: player.hand.append(card) -func show_joker_dialog(player: Player, joker_type: JokerType): - if player == player1: # Nur für menschlichen Spieler +func show_joker_dialog(player: Player, joker_type: Globals.JokerType): + if player == player1: # Nur für menschlichen Spieler ui.show_joker_choice(joker_type) -func _on_joker_choice(play_immediately: bool, joker_type: JokerType): +func _on_joker_choice(play_immediately: bool, joker_type: Globals.JokerType): if play_immediately: play_joker_to_field(player1, joker_type) # Sonst bleibt Joker auf der Hand (Risiko!) # UI Event Handlers func _on_defend_complete(): - if game_phase == GameState.DEFEND: + if game_phase == Globals.GameState.DEFEND: # Verteidiger gibt auf, nimmt alle Karten end_round_taken() func _on_take_cards(): - if game_phase == GameState.DEFEND: + if game_phase == Globals.GameState.DEFEND: end_round_taken() func _on_joker_played(joker_type): @@ -306,31 +300,31 @@ func check_game_end() -> bool: if player1.hand.size() == 0: if player1.has_jokers_in_hand(): print("Spieler 1 verliert - Joker auf der Hand!") - game_phase = GameState.GAME_OVER + game_phase = Globals.GameState.GAME_OVER return true else: print("Spieler 1 gewinnt!") - game_phase = GameState.GAME_OVER + game_phase = Globals.GameState.GAME_OVER return true - + if player2.hand.size() == 0: if player2.has_jokers_in_hand(): print("Spieler 2 verliert - Joker auf der Hand!") - game_phase = GameState.GAME_OVER + game_phase = Globals.GameState.GAME_OVER return true else: print("Spieler 2 gewinnt!") - game_phase = GameState.GAME_OVER + game_phase = Globals.GameState.GAME_OVER return true - + return false # Joker System -func play_joker_to_field(player: Player, joker_type: JokerType) -> bool: +func play_joker_to_field(player: Player, joker_type: Globals.JokerType) -> bool: if active_jokers.size() >= MAX_JOKERS: print("Maximale Joker-Anzahl erreicht!") return false - + if joker_type in player.jokers_hand: player.jokers_hand.erase(joker_type) active_jokers.append(joker_type) @@ -339,15 +333,15 @@ func play_joker_to_field(player: Player, joker_type: JokerType) -> bool: return true return false -func apply_joker_effect(joker_type: JokerType): +func apply_joker_effect(joker_type: Globals.JokerType): match joker_type: - JokerType.TRUMP_CHANGE: + Globals.JokerType.TRUMP_CHANGE: print("Trump-Wechsel verfügbar!") # UI für Trump-Auswahl - JokerType.DOUBLE_ATTACK: + Globals.JokerType.DOUBLE_ATTACK: print("Doppel-Angriff möglich!") # Ermöglicht 2 Karten gleichzeitig - JokerType.DRAW_BLOCK: + Globals.JokerType.DRAW_BLOCK: print("Zieh-Block aktiv!") # Gegner kann nicht ziehen @@ -355,15 +349,15 @@ func buy_booster(player: Player, cost: int = 50) -> Array: if player.coins >= cost: player.coins -= cost var booster_content = [] - + for i in range(3): if randf() < 0.3: - var joker_types = [JokerType.DOUBLE_ATTACK, JokerType.TRUMP_CHANGE, JokerType.DRAW_BLOCK] + var joker_types = [Globals.JokerType.DOUBLE_ATTACK, Globals.JokerType.TRUMP_CHANGE, Globals.JokerType.DRAW_BLOCK] var random_joker = joker_types[randi() % joker_types.size()] booster_content.append({"type": "joker", "joker_type": random_joker}) else: booster_content.append({"type": "coins", "amount": randi() % 20 + 10}) - + return booster_content return [] @@ -375,15 +369,15 @@ func update_ui(): ui.update_coins(player1.coins) ui.update_table(table_pairs, attacking_cards) ui.update_game_state(game_phase, current_attacker == player1) - - if deck.size() > 0: + + if deck.is_empty(): ui.update_trump(deck[0]) # Input for testing func _input(event): if event.is_action_pressed("ui_accept"): _on_booster_bought() - + if event.is_action_pressed("ui_cancel"): - if game_phase == GameState.DEFEND: - _on_take_cards() \ No newline at end of file + if game_phase == Globals.GameState.DEFEND: + _on_take_cards() -- 2.49.1