356 lines
9.5 KiB
GDScript
356 lines
9.5 KiB
GDScript
extends Node2D
|
|
|
|
var current_player: int = 0
|
|
var player_states := ["Circle", "Cross"]
|
|
var won := ""
|
|
var sequence_needed = 4
|
|
var _sequence = []
|
|
var enable_remove = false
|
|
var move_allowed = true
|
|
var zuege = 0
|
|
var wuerfeln_erlaubt = false
|
|
var wheel_spin_allowed = false
|
|
var active = Theme.new()
|
|
var schnickLost = false
|
|
var schnickActive = false
|
|
|
|
@onready var gui := $GUI as Node2D
|
|
@onready var board := $Board as Board
|
|
@onready var nextPlayer := $GUI/NextPlayer as Sprite2D
|
|
@onready var wonPlayer := $GUI/WonPlayer as Sprite2D
|
|
@onready var diceButton := $GUI/DiceButton as Button
|
|
@onready var diceSprite = $GUI/DiceSprite as Sprite2D
|
|
@onready var player1Sprite = $GUI/Player1Sprite as Sprite2D
|
|
@onready var player2Sprite = $GUI/Player2Sprite as Sprite2D
|
|
@onready var ereignis = $GUI/Event as Label
|
|
@onready var sequenz = $GUI/Sequenz as Label
|
|
@onready var schnick = $Schnick
|
|
@onready var numbers = $Numbers as TileMap
|
|
@onready var blindBoard = $BlindBoard as TileMap
|
|
@onready var spinButton = $GUI/WheelSpin as Button
|
|
@onready var luckyWheel = $LuckyWheel as Control
|
|
|
|
# Called when the node enters the scene tree for the first time.
|
|
func _ready():
|
|
current_player = 0
|
|
zuege = 0
|
|
wuerfeln_erlaubt = false
|
|
move_allowed = true
|
|
wheel_spin_allowed = false
|
|
blindBoard.visible = false
|
|
sequence_needed = 4
|
|
board.reset()
|
|
won = ""
|
|
ereignis.text = "Ereignis: "
|
|
sequenz.text = "4 - Gewinnt!"
|
|
wonPlayer.hide()
|
|
nextPlayer.region_rect.position.x = current_player * 300
|
|
nextPlayer.show()
|
|
_update_dice_sprite(0)
|
|
board.active = true
|
|
schnickLost = false
|
|
luckyWheel.wheelActive = false
|
|
schnickActive = false
|
|
|
|
|
|
# Called every frame. 'delta' is the elapsed time since the previous frame.
|
|
func _process(_delta):
|
|
_check_dice_color()
|
|
move_allowed = move_allowed and !schnickLost and !luckyWheel.wheelActive and !schnickActive
|
|
if won == "":
|
|
if Input.is_action_just_pressed("Click") and move_allowed:
|
|
var grid_pos = board.gridpos_at_mouse()
|
|
if enable_remove:
|
|
print(grid_pos)
|
|
board._clear_enemy_tile(grid_pos)
|
|
enable_remove = false
|
|
elif board.get_state(Vector2(grid_pos.x, 0)) == board.empty_state:
|
|
var new_pos = board._calculate_drop_pos(grid_pos)
|
|
if board.set_state(new_pos, player_states[current_player]):
|
|
if zuege >= 1:
|
|
move_allowed = false #Damit vor jedem Zug gewürfelt wird (Ab Runde 2)
|
|
wuerfeln_erlaubt = true
|
|
zuege += 1
|
|
blindBoard.visible = false
|
|
won = _check_win()
|
|
if won=="":
|
|
switch_player()
|
|
else:
|
|
print("Winner: ", won)
|
|
wonPlayer.region_rect.position.x = player_states.find(won) * 300
|
|
if won == player_states[0]:
|
|
for tile in _sequence:
|
|
board.set_cell(1, tile, 1, Vector2i(0, 2), 0)
|
|
else:
|
|
for tile in _sequence:
|
|
board.set_cell(1, tile, 1, Vector2i(3, 2), 0)
|
|
wonPlayer.show()
|
|
nextPlayer.hide()
|
|
board.active = false
|
|
|
|
|
|
func switch_player():
|
|
current_player = 1 - current_player
|
|
nextPlayer.region_rect.position.x = current_player * 300
|
|
|
|
func _on_restart_button_pressed():
|
|
_ready()
|
|
|
|
|
|
var _checks = [
|
|
[Vector2i(-1,0), Vector2i(1,0)],
|
|
[Vector2i(0,-1), Vector2i(0,1)],
|
|
[Vector2i(-1,-1), Vector2i(1,1)],
|
|
[Vector2i(-1,1), Vector2i(1,-1)],
|
|
]
|
|
|
|
|
|
func _check_win() -> String:
|
|
for cell in board.get_used_cells(board.layer_by_name[board.state_layer]):
|
|
var state = board.get_state(cell)
|
|
_sequence.clear()
|
|
for check in _checks:
|
|
for i in range(3):
|
|
var same = true
|
|
for j in range(sequence_needed):
|
|
if board.get_state(cell + check[0] * (i + j)) != state:
|
|
same = false
|
|
break
|
|
elif board.get_state(cell + check[0] * (i + j)) == "Triangle2":
|
|
same = false
|
|
break
|
|
_sequence.append(Vector2i(cell + check[0] * (i + j)))
|
|
if same:
|
|
return state
|
|
return ""
|
|
|
|
|
|
#Generiert die Zufallszahl von 1-6
|
|
func _roll_dice() -> int:
|
|
schnickLost = false
|
|
wuerfeln_erlaubt = false
|
|
move_allowed = false
|
|
var zahl = randi() % 6 + 1
|
|
var animation_help
|
|
var zahl_davor
|
|
for i in range(6):
|
|
if animation_help == zahl_davor:
|
|
zahl_davor = randi() % 6 + 1
|
|
_update_dice_sprite(zahl_davor)
|
|
animation_help = zahl_davor
|
|
|
|
await get_tree().create_timer(0.25).timeout
|
|
_update_dice_sprite(zahl)
|
|
print(zahl) #Debug ausgabe, später löschen
|
|
|
|
if zahl == 1:
|
|
switch_to_schnick()
|
|
if zahl == 3:
|
|
blindBoard.visible = true
|
|
if zahl == 6:
|
|
board.active = false
|
|
luckyWheel.is_spin = true
|
|
switch_to_wheel()
|
|
var number = randi() % 100 + 1
|
|
while luckyWheel.spun == false: #damit erst nach dem drehen 3s gewartet wird
|
|
await get_tree().create_timer(0.1).timeout
|
|
_spin_the_wheel(number)
|
|
await get_tree().create_timer(3.2).timeout
|
|
luckyWheel.spun = false
|
|
luckyWheel.hide()
|
|
switch_to_game()
|
|
board.active = true
|
|
|
|
move_allowed = true
|
|
return zahl
|
|
|
|
|
|
|
|
#Funktion um Knopf und Methode zu verbinden
|
|
func _on_dice_button_pressed():
|
|
if wuerfeln_erlaubt:
|
|
move_allowed = true
|
|
_roll_dice()
|
|
|
|
|
|
|
|
#Sucht sich für die entsprechende Augenzahl
|
|
#die X und Y-Koordinaten in der Tilemap
|
|
func _update_dice_sprite(result :int):
|
|
diceSprite.region_rect.position.x = _get_dice_pos_x(result)
|
|
diceSprite.region_rect.position.y = _get_dice_pos_y(result)
|
|
|
|
|
|
#X-Koordinaten der Augenzahlen in der Tilemap
|
|
func _get_dice_pos_x(result: int) -> int:
|
|
match result:
|
|
1: return 8
|
|
2: return 108
|
|
3: return 208
|
|
4: return 308
|
|
5: return 108
|
|
6: return 208
|
|
return 208
|
|
|
|
|
|
#Y-Koordinaten in der Tilemap
|
|
func _get_dice_pos_y(result: int) -> int:
|
|
match result:
|
|
1: return 308
|
|
2: return 308
|
|
3: return 308
|
|
4: return 308
|
|
5: return 410
|
|
6: return 410
|
|
return 410
|
|
|
|
|
|
|
|
#Nach dem Glücksradereignis wird die Siegesbedingung auf 5 gewinnt geändert
|
|
func _five_wins() -> void:
|
|
print("5 Gewinnt aktiv") #Debug
|
|
sequence_needed = 5
|
|
|
|
#Nach dem Glücksradereignis tauschen die Spieler die Symbole
|
|
func _change_symbols():
|
|
print("tausch") #debug
|
|
current_player = 1 - current_player
|
|
nextPlayer.region_rect.position.x = current_player * 300
|
|
var tempX = player1Sprite.region_rect.position.x
|
|
var tempY = player1Sprite.region_rect.position.y
|
|
player1Sprite.region_rect.position.x = player2Sprite.region_rect.position.x
|
|
player1Sprite.region_rect.position.y = player2Sprite.region_rect.position.y
|
|
player2Sprite.region_rect.position.x = tempX
|
|
player2Sprite.region_rect.position.y = tempY
|
|
|
|
#Nach dem Glücksradereignis gewinnt der Spieler sofort
|
|
func _instant_win():
|
|
won = player_states[current_player]
|
|
print("Winner: ", won)
|
|
wonPlayer.region_rect.position.x = player_states.find(won) * 300
|
|
wonPlayer.show()
|
|
nextPlayer.hide()
|
|
board.active = false
|
|
|
|
func _instant_loose():
|
|
current_player = 1 - current_player
|
|
won = player_states[current_player]
|
|
print("Winner: ", won)
|
|
wonPlayer.region_rect.position.x = player_states.find(won) * 300
|
|
wonPlayer.show()
|
|
nextPlayer.hide()
|
|
board.active = false
|
|
|
|
#Zum Testen der Events
|
|
func _on_test_pressed():
|
|
var rand = randi() % 6 + 1
|
|
_dead_zone(rand)
|
|
|
|
|
|
func _spin_the_wheel(result: int) -> void:
|
|
wheel_spin_allowed = false
|
|
ereignis.text = "Ereignis: "
|
|
if result <= 3:
|
|
ereignis.text += "Instant win!"
|
|
_instant_win()
|
|
elif result <= 6:
|
|
ereignis.text += "Instant loose!"
|
|
_instant_loose()
|
|
elif result <= 15:
|
|
enable_remove = true
|
|
ereignis.text += "Du darfst einen Stein entfernen!"
|
|
elif result <= 30:
|
|
ereignis.text += "Symboltausch!"
|
|
_change_symbols()
|
|
elif result <= 45:
|
|
if sequence_needed == 5:
|
|
_spin_the_wheel(randi() % 100 + 1)
|
|
else:
|
|
ereignis.text += "Ab jetzt gilt 5 - Gewinnt!"
|
|
sequenz.text = "5 - Gewinnt!"
|
|
_five_wins()
|
|
elif result <= 65:
|
|
var zeile_zum_loeschen = randi() % 6 + 1
|
|
ereignis.text += "Zeile " + str(zeile_zum_loeschen) + " wird entfernt!"
|
|
await get_tree().create_timer(4).timeout
|
|
board.delete_column(zeile_zum_loeschen)
|
|
|
|
elif result <= 85:
|
|
var spalte_zum_loeschen = randi() % 6 + 1
|
|
ereignis.text += "Spalte " + str(spalte_zum_loeschen) + " wird entfernt!"
|
|
await get_tree().create_timer(4).timeout
|
|
board.delete_row(spalte_zum_loeschen)
|
|
elif result <= 100:
|
|
var spalte = randi() % 6 + 1
|
|
ereignis.text += "Totes Feld in Spalte " + str(spalte)
|
|
_dead_zone(spalte)
|
|
move_allowed = true
|
|
|
|
|
|
func _dead_zone(spalte :int):
|
|
var pos = board._calculate_drop_pos(Vector2(spalte-3,0))
|
|
if pos.y == 0:
|
|
_spin_the_wheel(randi() % 100 + 1)
|
|
else:
|
|
board.set_state(pos, "Triangle2")
|
|
|
|
|
|
#Am Glücksrad drehen
|
|
func _on_spin_the_wheel_pressed():
|
|
if wheel_spin_allowed:
|
|
var zahl = randi() % 100 + 1
|
|
_spin_the_wheel(zahl)
|
|
|
|
func hide_schnick():
|
|
schnick.hide()
|
|
schnickActive = false
|
|
move_allowed = true
|
|
|
|
func switch_to_schnick():
|
|
schnickActive = true
|
|
move_allowed = false
|
|
board.hide()
|
|
numbers.hide()
|
|
gui.hide()
|
|
schnick.show()
|
|
|
|
func switch_to_wheel():
|
|
luckyWheel.wheelActive = true
|
|
move_allowed = false
|
|
gui.hide()
|
|
numbers.hide()
|
|
board.hide()
|
|
luckyWheel.show()
|
|
|
|
func switch_to_game():
|
|
luckyWheel.wheelActive = false
|
|
move_allowed = true
|
|
gui.show()
|
|
numbers.show()
|
|
board.show()
|
|
|
|
func _on_gewonnen_pressed():
|
|
schnickLost = false
|
|
wuerfeln_erlaubt = false
|
|
hide_schnick()
|
|
switch_to_game()
|
|
|
|
func _on_verloren_pressed():
|
|
schnickLost = true
|
|
wuerfeln_erlaubt = true
|
|
switch_player()
|
|
hide_schnick()
|
|
switch_to_game()
|
|
|
|
func _check_dice_color():
|
|
if wuerfeln_erlaubt == false:
|
|
diceButton.add_theme_color_override("font_color", Color.RED)
|
|
diceButton.add_theme_color_override("font_hover_color", Color.RED)
|
|
diceButton.add_theme_color_override("font_pressed_color", Color.RED)
|
|
diceButton.add_theme_color_override("font_focus_color", Color.RED)
|
|
elif wuerfeln_erlaubt == true:
|
|
diceButton.add_theme_color_override("font_color", Color.SEA_GREEN)
|
|
diceButton.add_theme_color_override("font_hover_color", Color.SEA_GREEN)
|
|
diceButton.add_theme_color_override("font_pressed_color", Color.SEA_GREEN)
|
|
diceButton.add_theme_color_override("font_focus_color", Color.SEA_GREEN)
|