online multiplayer chess game (note server currently down)
Diffstat (limited to 'pieces/Pawn.gd')
-rw-r--r--pieces/Pawn.gd90
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")