diff options
Diffstat (limited to 'Main.gd')
-rw-r--r-- | Main.gd | 324 |
1 files changed, 324 insertions, 0 deletions
@@ -0,0 +1,324 @@ +extends Node + +export (PackedScene) var piece_scene +export (PackedScene) var movetile_scene + +var board = new_board2() +var board_cell = 128 +const BOARD_WIDTH = 7 # starting at 0..7 +const BOARD_HEIGHT = 7 + +var movement_layer = false +var movement_layer_piece = null + +var safely_handle_movement = false + +var team1 = 1 +var team2 = 2 + +func _ready(): + make_player1("green") + make_player2("red") + print(OS.set_window_size(Vector2(700,700))) + +# horrifying discovery: this occurs after the signal capturing functions +func _process(delta): + # hack to prevent 'clicking' on a killed piece + safely_handle_movement = false + +func remove_movement_layer(): + movement_layer = false + movement_layer_piece = null + var movement_tiles = get_tree().get_nodes_in_group("tile") + for e in movement_tiles: + e.queue_free() + +func piece_clicked(piece): + if movement_layer: + print("I was clicked on, but the movement layer is toggled") + if movement_layer_piece == click_spot(): + remove_movement_layer() + else: + if ! safely_handle_movement: + var piece_name = piece.get_piece() + print("You clicked on a %s, team %s" % [piece_name, piece.get_team()]) + var location = click_spot() + print("Spot: %s " % location) + var pattern = get_move_pattern(piece, location) + if can_chess_move(pattern, location): + movement_layer = true + movement_layer_piece = location + +func click_spot(): + var square = get_viewport().get_mouse_position() + square[0] = floor(square[0] / board_cell) + square[1] = floor(square[1] / board_cell) + return square + +func make_player2(color): + spawn_piece('rook', color, 0, 0, team2) + spawn_piece('knight', color, 1, 0, team2) + spawn_piece('bishop', color, 2, 0, team2) + spawn_piece('queen', color, 3, 0, team2) + spawn_piece('king', color, 4, 0, team2) + spawn_piece('bishop', color, 5, 0, team2) + spawn_piece('knight', color, 6, 0, team2) + spawn_piece('rook', color, 7, 0, team2) + for i in BOARD_WIDTH + 1: + spawn_piece('pawn', color, i , 1, team2) + +func make_player1(color): + spawn_piece('rook', color, 0, 7, team1) + spawn_piece('knight', color, 1, 7, team1) + spawn_piece('bishop', color, 2, 7, team1) + spawn_piece('queen', color, 3, 7, team1) + spawn_piece('king', color, 4, 7, team1) + spawn_piece('bishop', color, 5, 7, team1) + spawn_piece('knight', color, 6, 7, team1) + spawn_piece('rook', color, 7, 7, team1) + for i in BOARD_WIDTH + 1: + spawn_piece('pawn', color, i , 6, team1) + +func spawn_piece(piece_name, color, x=0, y=0, team=0): + var piece = piece_scene.instance() + piece.init(piece.piece_map.get(piece_name), piece.piece_color.get(color), team) + add_child(piece) + piece.connect("clicked", self, "piece_clicked", [piece]) + board_add_piece(piece, x, y) + piece.position = in_square(Vector2(x * board_cell, y * board_cell)) + return piece + +func rand_pos(): + return Vector2(rand_range(0, get_viewport().size.x),rand_range(0, get_viewport().size.y)) + +# needs to be Vector2 as that is what object.position takes +func in_square(vect2): + #print(vect2) + vect2.x = ceil(vect2.x / board_cell) + #print(vect2.x) + vect2.x *= board_cell + vect2.x += board_cell / 2 + + vect2.y = ceil(vect2.y / board_cell) + #print(vect2.y) + vect2.y *= board_cell + vect2.y += board_cell / 2 + + #print(vect2) + return vect2 + +func new_board2(): + # x → + # y + # ↓ + # [0][0] = top left, [0][7] = bottom left, [7][0] = top right, [7][7] = bottom right + var board = [] + for i in BOARD_HEIGHT + 1: + board.append([]) + board[i].resize(BOARD_WIDTH + 1) + for j in BOARD_WIDTH + 1: + board[i][j] = 0 + return board + +func new_board(): + return [[0,0,0,0,0,0,0,0], + [0,0,0,0,0,0,0,0], + [0,0,0,0,0,0,0,0], + [0,0,0,0,0,0,0,0], + [0,0,0,0,0,0,0,0], + [0,0,0,0,0,0,0,0], + [0,0,0,0,0,0,0,0], + [0,0,0,0,0,0,0,0]] + +func board_add_piece(piece, x, y): + board[x][y] = piece + +enum { + move_2_up_pawn, + move_1_up_pawn, + attack_1_nw, + attack_1_ne, + + move_2_down_pawn, + move_1_down_pawn, + attack_1_sw, + attack_1_se, + + move_1_up, + move_1_down, + move_1_left, + move_1_right, + move_1_nw, + move_1_ne, + move_1_sw, + move_1_se, + + move_up_inf, + move_down_inf, + move_left_inf, + move_right_inf, + + move_nw_inf, + move_ne_inf, + move_sw_inf, + move_se_inf, + + knight, +} + +func get_move_pattern(piece, coords): + var piece_name = piece.get_piece() + match (piece_name): + "pawn": + if piece.get_team() == team1: + if coords[1] == 6: + print("This pawn piece hasn't moved!") + return [attack_1_nw, move_2_up_pawn, attack_1_ne] + else: + print("This pawn piece has moved and that is hecking brave!") + return [attack_1_nw, move_1_up_pawn, attack_1_ne] + else: + if coords[1] == 1: + return [attack_1_sw, move_2_down_pawn, attack_1_se] + else: + return [attack_1_sw, move_1_down_pawn, attack_1_se] + "rook": + return [move_up_inf, move_left_inf, move_right_inf, move_down_inf] + "knight": + return [knight] + "bishop": + return [move_ne_inf, move_nw_inf, move_sw_inf, move_se_inf] + "queen": + return [move_up_inf, move_down_inf, move_left_inf, move_right_inf, move_ne_inf, move_nw_inf, move_sw_inf, move_se_inf] + "king": + return [move_1_down, move_1_left, move_1_right, move_1_up, move_1_ne, move_1_nw, move_1_se, move_1_sw] + _: + print("no pattern for this one") + +func can_chess_move(pattern, coords): + var can_move = false + var curr_team = board[coords[0]][coords[1]].get_team() + for e in pattern: + match (e): + move_1_down_pawn: + if make_tiles(coords, [0,1], 1, true, curr_team): can_move = true + move_2_down_pawn: + if make_tiles(coords, [0,1], 2, true, curr_team): can_move = true + attack_1_sw: + if make_tiles(coords, [-1,1], 1, false, curr_team, true): can_move = true + attack_1_se: + if make_tiles(coords, [1,1], 1, false, curr_team, true): can_move = true + + move_1_up_pawn: + if make_tiles(coords, [0,-1], 1, true, curr_team): can_move = true + move_2_up_pawn: + if make_tiles(coords, [0,-1], 2, true, curr_team): can_move = true + attack_1_nw: + if make_tiles(coords, [-1,-1], 1, false, curr_team, true): can_move = true + attack_1_ne: + if make_tiles(coords, [1,-1], 1, false, curr_team, true): can_move = true + + move_up_inf: + if make_tiles(coords, [0,-1], BOARD_HEIGHT, false, curr_team): can_move =true + move_down_inf: + if make_tiles(coords, [0,1], BOARD_HEIGHT, false, curr_team): can_move = true + move_left_inf: + if make_tiles(coords, [-1,0], BOARD_WIDTH, false, curr_team): can_move = true + move_right_inf: + if make_tiles(coords, [1,0], BOARD_WIDTH, false, curr_team): can_move = true + + move_ne_inf: + if make_tiles(coords, [1,-1], 8, false, curr_team): can_move = true + move_nw_inf: + if make_tiles(coords, [-1,-1], 8, false, curr_team): can_move = true + move_sw_inf: + if make_tiles(coords, [-1,1], 8, false, curr_team): can_move = true + move_se_inf: + if make_tiles(coords, [1,1], 8, false, curr_team): can_move = true + + knight: + if make_tiles(coords, [1,2], 1, false, curr_team): can_move = true + if make_tiles(coords, [1,-2], 1, false, curr_team): can_move = true + if make_tiles(coords, [-1,-2], 1, false, curr_team): can_move = true + if make_tiles(coords, [-1,2], 1, false, curr_team): can_move = true + if make_tiles(coords, [2,1], 1, false, curr_team): can_move = true + if make_tiles(coords, [2,-1], 1, false, curr_team): can_move = true + if make_tiles(coords, [-2,-1], 1, false, curr_team): can_move = true + if make_tiles(coords, [-2,1], 1, false, curr_team): can_move = true + + move_1_down: + if make_tiles(coords, [0,1], 1, false, curr_team): can_move = true + move_1_up: + if make_tiles(coords, [0,-1], 1, false, curr_team): can_move = true + move_1_right: + if make_tiles(coords, [1,0], 1, false, curr_team): can_move = true + move_1_left: + if make_tiles(coords, [-1,0], 1, false, curr_team): can_move = true + move_1_ne: + if make_tiles(coords, [1,-1], 1, false, curr_team): can_move = true + move_1_nw: + if make_tiles(coords, [-1,-1], 1, false, curr_team): can_move = true + move_1_se: + if make_tiles(coords, [1,1], 1, false, curr_team): can_move = true + move_1_sw: + if make_tiles(coords, [-1,1], 1, false, curr_team): can_move = true + return can_move + +func movetile_clicked(move_tile): + print("Yep, I was clicked") + var location = click_spot() + var check = board[location[0]][location[1]] + if ! check: + pass + else: + check.kill() + + board[location[0]][location[1]] = board[movement_layer_piece[0]][movement_layer_piece[1]] + board[movement_layer_piece[0]][movement_layer_piece[1]].position = \ + in_square(Vector2(location[0] * board_cell, location[1] * board_cell)) + board[movement_layer_piece[0]][movement_layer_piece[1]] = 0 + remove_movement_layer() + safely_handle_movement = true + + +func spawn_move_tile(coords): + var move_tile = movetile_scene.instance() + add_child(move_tile) + move_tile.connect("move_clicked", self, "movetile_clicked", [move_tile]) + move_tile.position = in_square(Vector2(coords[0] * board_cell, coords[1] * board_cell)) + print(move_tile.position) + +func make_tiles(coords, pattern, go_range, cant_attack, curr_team, must_attack = false): + var x = coords[0] + var y = coords[1] + var pattern0 = pattern[0] + var pattern1 = pattern[1] + var a = 0 + var b = 0 + var board_size_x = 7 # starting at 0 + var board_size_y = 7 + + var made_tile = false + + for i in range(1,go_range+1): + a += pattern0 + b += pattern1 + # dont go out of bounds: not bigger than board size but not smaller than 0 + if (x + a) <= board_size_x and (y + b) <= board_size_y and (x + a) >= 0 and (y + b) >= 0 : + var check = board[x + a][y + b] + if ! check and ! must_attack: + spawn_move_tile([x + a, y + b]) + made_tile = true + elif must_attack: + if ! check: + pass + elif check.get_team() != curr_team: + spawn_move_tile([x + a, y + b]) + made_tile = true + elif ! cant_attack and check.get_team() != curr_team: + spawn_move_tile([x + a, y + b]) + made_tile = true + break # rules of chess say pieces cant go past another + else: + break + return made_tile |