Skip to content
This repository has been archived by the owner on Jun 8, 2023. It is now read-only.

Commit

Permalink
Chess!
Browse files Browse the repository at this point in the history
  • Loading branch information
thallium205 committed Dec 15, 2012
1 parent 9870aee commit e52ef49
Showing 1 changed file with 91 additions and 0 deletions.
91 changes: 91 additions & 0 deletions src/scripts/chess.coffee
@@ -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

@ericboehs
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

@thallium205
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

@ericboehs
Copy link

@ericboehs ericboehs commented on e52ef49 Jul 16, 2013 via email

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@technicalpickles
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

Please sign in to comment.