online multiplayer chess game (note server currently down)
Diffstat (limited to 'pieces/Pawn.gd')
| -rw-r--r-- | pieces/Pawn.gd | 90 |
1 files changed, 69 insertions, 21 deletions
diff --git a/pieces/Pawn.gd b/pieces/Pawn.gd index 8571e74..42ed456 100644 --- a/pieces/Pawn.gd +++ b/pieces/Pawn.gd @@ -1,12 +1,31 @@ extends Piece class_name Pawn, "res://assets/pieces/california/wP.png" -onready var whiteint := 1 if white else -1 +const promotables := ["Q.png", "N.png", "R.png", "B.png"] var twostepfirstmove := false var just_set := false var enpassant := [] +onready var whiteint := 1 if white else -1 +onready var sprites := [] +onready var darken = get_node("../../Darken") + + +func _ready(): + Events.connect("turn_over", self, "_on_turn_over") + Events.connect("just_before_turn_over", self, "_just_before_turn_over") + sprite.position = Globals.grid.piece_size / 2 + for i in range(0, 4): # add 3 sprites + var newsprite = load("res://ClickableSprite.tscn").instance() + newsprite.position = (sprite.position + Vector2(0, (i * Globals.grid.piece_size.y) * whiteint)) + newsprite.name = "Sprite%s" % str(i) + newsprite.connect("clicked", self, "handle_sprite_input_event") + newsprite.z_index = 5 + newsprite.hide() + add_child(newsprite) + sprites.append(newsprite) + func moveto(position, real = true, take = false): # check if 2 step @@ -20,14 +39,6 @@ func moveto(position, real = true, take = false): .moveto(position, real, take) -func _on_turn_over(): - if just_set: - just_set = false - return - if twostepfirstmove: - twostepfirstmove = false - - func get_moves(): var points := [Vector2.UP, Vector2.UP * 2] var moves := [] @@ -35,7 +46,7 @@ func get_moves(): var point: Vector2 = points[i] point *= whiteint point = pos_around(point) - if at_pos(point) == null: + if is_on_board(point) and at_pos(point) == null: if i == 1 and has_moved or at_pos(pos_around(points[0] * whiteint)) != null: continue if check_spots_check and checkcheck(point): @@ -46,6 +57,12 @@ func get_moves(): return moves +func can_promote(position): + if position.y >= 7 or position.y <= 0: + return true + return false + + func passant(position): enpassant.clear() moveto(position) @@ -72,14 +89,10 @@ func en_passant(turncheck = true): # in passing var passants := [pos_around(Vector2.LEFT), pos_around(Vector2.RIGHT)] var moves := [] for i in passants: - if !is_on_board(i): + if !is_on_board(i) or !at_pos(i): continue var spot = at_pos(i) - if !spot: - continue - if spot.white == white: - continue - if !Utils.is_pawn(spot): + if spot.white == white or !Utils.is_pawn(spot): continue if turncheck and white != Globals.turn: continue @@ -94,6 +107,46 @@ func en_passant(turncheck = true): # in passing return moves +func promote(position, type): + if type == "take": + take(at_pos(position)) + else: + moveto(position) + darken.show() + for i in range(len(promotables)): + sprites[i].sprite.texture = load("%s%s%s" % [Globals.grid.ASSETS_PATH, team.to_lower(), promotables[i]]) + sprites[i].show() + + +func handle_sprite_input_event(node): + darken.hide() + var script = piece(promotables[sprites.find(node)][0]) + Globals.grid.make_piece(real_position, script, white) + Globals.grid.turn_over() + clear_clicked() + queue_free() + + +func piece(string): + match string: + "Q": + return "res://pieces/Queen.gd" + "N": + return "res://pieces/Knight.gd" + "R": + return "res://pieces/Rook.gd" + "B": + return "res://pieces/Bishop.gd" + + +func _on_turn_over(): + if just_set: + just_set = false + return + if twostepfirstmove: + twostepfirstmove = false + + func _just_before_turn_over(): var had_a_enpassant := len(enpassant) > 0 enpassant.clear() @@ -108,8 +161,3 @@ func _just_before_turn_over(): Globals.grid.matrix[8].wcep.append_array(temporary) else: Globals.grid.matrix[8].bcep.append_array(temporary) - - -func _ready(): - Events.connect("turn_over", self, "_on_turn_over") - Events.connect("just_before_turn_over", self, "_just_before_turn_over") |