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()