Permalink
Browse files

Chess!

  • Loading branch information...
1 parent 9870aee commit e52ef491036559d1da55df9c2827baa05efe7ed9 @thallium205 thallium205 committed Dec 15, 2012
Showing with 91 additions and 0 deletions.
  1. +91 −0 src/scripts/chess.coffee
View
@@ -0,0 +1,91 @@
+# Description:
+# Play a game of chess!
+#
+# Dependencies:
+# "chess": "0.1.3"
+#
+# Configuration:
+# None
+#
+# Commands:
+# hubot chess me - Creates a new game between yourself and another person in the room
+# hubot chess status - Gets the current state of the board
+# hubot chess move <to> - Moves a piece to the coordinate position using standard chess notation
+#
+# Author:
+# thallium205
+#
+
+Chess = require 'chess'
+
+module.exports = (robot) ->
+ robot.respond /chess me$/i, (msg) ->
+ robot.brain.data.chess = Chess.create()
+ boardToFen robot.brain.data.chess.getStatus(), (status, fen) ->
+ msg.send 'http://webchess.freehostia.com/diag/chessdiag.php?fen=' + encodeURIComponent(fen) + '&size=large&coord=yes&cap=yes&stm=yes&fb=no&theme=classic&format=auto&color1=E3CEAA&color2=635147&color3=000000&.png'
+ robot.respond /chess status/i, (msg) ->
+ try
+ boardToFen robot.brain.data.chess.getStatus(), (status, fen) ->
+ if status
+ msg.send status
+ msg.send 'http://webchess.freehostia.com/diag/chessdiag.php?fen=' + encodeURIComponent(fen) + '&size=large&coord=yes&cap=yes&stm=yes&fb=no&theme=classic&format=auto&color1=E3CEAA&color2=635147&color3=000000&.png'
+ catch e
+ msg.send e
+
+ robot.respond /chess move (.*)/i, (msg) ->
+ try
+ robot.brain.data.chess.move msg.match[1]
+ boardToFen robot.brain.data.chess.getStatus(), (status, fen) ->
+ if status
+ msg.send status
+ msg.send 'http://webchess.freehostia.com/diag/chessdiag.php?fen=' + encodeURIComponent(fen) + '&size=large&coord=yes&cap=yes&stm=yes&fb=no&theme=classic&format=auto&color1=E3CEAA&color2=635147&color3=000000&.png'
+ catch e
+ msg.send e
+
+boardToFen = (status, callback) ->
+ fen = [[],[],[],[],[],[],[],[]]
+ blank = 0
+ lastRank = 0
+ for square in status.board.squares
+ if lastRank isnt square.rank
+ if blank isnt 0
+ fen[lastRank - 1].push(blank)
+ blank = 0
+ if square.piece is null
+ blank = blank + 1
+ else
+ if square.piece.type is 'pawn'
+ if blank is 0
+ fen[square.rank - 1].push(if square.piece.side.name is 'white' then 'P' else 'p')
+ else
+ fen[square.rank - 1].push(blank)
+ fen[square.rank - 1].push(if square.piece.side.name is 'white' then 'P' else 'p')
+ blank = 0
+ else
+ if blank is 0
+ fen[square.rank - 1].push(if square.piece.side.name is 'white' then square.piece.notation.toUpperCase() else square.piece.notation.toLowerCase())
+ else
+ fen[square.rank - 1].push(blank)
+ fen[square.rank - 1].push(if square.piece.side.name is 'white' then square.piece.notation.toUpperCase() else square.piece.notation.toLowerCase())
+ blank = 0
+ lastRank = square.rank
+ for rank in fen
+ rank = rank.join()
+ fen = fen.reverse().join('/').replace(/,/g,'')
+
+ msg = ''
+ if status.isCheck
+ msg += 'Check! '
+ if status.isCheckmate
+ msg += 'Checkmate! '
+ if status.isRepetition
+ msg += 'Threefold Repetition! A draw can be called. '
+ if status.isStalemate
+ msg += 'Stalemate! '
+ if Object.keys(status.notatedMoves).length > 0
+ if status.notatedMoves[Object.keys(status.notatedMoves)[0]].src.piece.side.name is 'white'
+ fen += ' w';
+ else
+ fen += ' b';
+
+ callback msg, fen

4 comments on commit e52ef49

I'm failing to figure out the "standard notation" for moves. I tried hubot chess move c2 to c4 but.. nothing.

Contributor

Omit the "to".
Try: "hubot chess move c2 c4"

@ericboehs would you mind opening an issue for this? Thanks!

Please sign in to comment.