ref: 715de9d3e1e26dbee3490ac3ad53f6b2069536da
parent: bb0853c09800c2e32c6474b0ba6550012bed869e
author: kitzman <[email protected]>
date: Thu Jan 18 03:40:26 EST 2024
fixed bugs; added play script
--- a/README
+++ b/README
@@ -10,7 +10,9 @@
SYNOPSIS
chessfs [-verbose] [-addr addr] [-srv srv] [-group gid]
+ rc/play [-r] player directory
+
DESCRIPTION
Chessfs is a filesystem for playing chess games. It posts a
server named after the argument, which by default is
@@ -41,7 +43,7 @@
The board files, white and black, show the current pieces'
position, depending on the player. Writing to the file makes
- a move on behalf of the specified player.
+ a move on behalf of the corresponding player.
draw Offer a draw, or accept a draw if the other player
offered one.
@@ -52,6 +54,12 @@
For reading the game in the PGN notation, the moves files
can be read.
+ The package comes with two scripts. Play is an interactive
+ script which prints the board and game status, and waits for
+ your or your opponent's move. The -r flag transcribes the
+ UTF-8 piece symbols into other symbols, in case the used
+ font doesn't have them.
+
EXAMPLES
Run the filesystem:
@@ -74,7 +82,7 @@
https://shithub.us/kitzman/chess/HEAD/info.html
- BUGS AND TODOS
+ BUGS AND TODO
The board does not have the right coordinates for the right
player.
--- a/chessfs.4
+++ b/chessfs.4
@@ -4,6 +4,8 @@
.SH SYNOPSIS
chessfs [-verbose] [-addr addr] [-srv srv] [-group gid]
+rc/play [-r] player directory
+
.SH DESCRIPTION
Chessfs is a filesystem for playing chess games. It posts a
server named after the argument, which by default is "chessfs".
@@ -39,7 +41,7 @@
.PP
The board files, white and black, show the current pieces' position,
depending on the player. Writing to the file makes a move on behalf
-of the specified player.
+of the corresponding player.
.TF "\fLresign\fR"
.TP
.BI "draw"
@@ -54,6 +56,12 @@
.RE
.PP
For reading the game in the PGN notation, the moves files can be read.
+.PP
+The package comes with two scripts. Play is an interactive script
+which prints the board and game status, and waits for your or
+your opponent's move. The -r flag transcribes
+the UTF-8 piece symbols into other symbols, in case the used font
+doesn't have them.
.SH EXAMPLES
Run the filesystem:
.IP
@@ -79,7 +87,7 @@
https://git.disroot.org/kitzman/chessfs
https://shithub.us/kitzman/chess/HEAD/info.html
-.SH BUGS AND TODOS
+.SH BUGS AND TODO
The board does not have the right coordinates for the right player.
--- a/chessfs.go
+++ b/chessfs.go
@@ -302,16 +302,28 @@
switch cmdline {
case "draw":
+ turn := f.game.GetTurn()
+ if turn != f.player {
+ return 0, fmt.Errorf("not your turn")
+ }
err := f.game.OfferDraw(f.player)
if err != nil {
return 0, err
}
case "resign":
+ turn := f.game.GetTurn()
+ if turn != f.player {
+ return 0, fmt.Errorf("not your turn")
+ }
err := f.game.Resign(f.player)
if err != nil {
return 0, err
}
default:
+ turn := f.game.GetTurn()
+ if turn != f.player {
+ return 0, fmt.Errorf("not your turn")
+ }
err := f.game.Move(cmdline)
if err != nil {
return 0, err
--- a/game.go
+++ b/game.go
@@ -251,11 +251,11 @@
switch player {
case White:
- g.state = WhiteWon
+ g.state = BlackWon
g.board.Resign(chess.White)
break
case Black:
- g.state = BlackWon
+ g.state = WhiteWon
g.board.Resign(chess.Black)
break
}
--- /dev/null
+++ b/rc/play
@@ -1,0 +1,112 @@
+#!/bin/rc
+
+rfork e
+flagfmt='r:transcribe, h:help'
+args='player gamedir'
+eval `{aux/getflags $*}
+
+player=$1
+game=$2
+lstat=()
+lmsg=()
+uppid=()
+
+if(~ $help 1 || ! ~ $#* 2 || ! ~ $player (white black)) {
+ aux/usage
+ exit usage
+}
+
+board=$game/$player
+ctl=$game/ctl
+
+fn prtboard {
+ if(~ $#transcribe 0) {
+ cat $board
+ }
+ if not {
+ cat $board | \
+ sed 's/♙/p/g' | sed 's/♟/q/g' | \
+ sed 's/♖/ᴙ/g' | sed 's/♜/ᴚ/g' | \
+ sed 's/♘/N/g' | sed 's/♞/ᴎ/g' | \
+ sed 's/♗/ᴇ/g' | sed 's/♝/ᴈ/g' | \
+ sed 's/♕/S/g' | sed 's/♛/Z/g' | \
+ sed 's/♔/ᴍ/g' | sed 's/♚/ᴡ/g'
+ }
+}
+
+fn status {
+ gst=`{cat $ctl | sed 1q}
+ msg=`{cat $ctl | sed 2q | tail -n 1}
+ wtm=`{cat $ctl | sed 3q | tail -n 1 | awk '{print $3}'}
+ wtb=`{cat $ctl | sed 4q | tail -n 1 | awk '{print $3}'}
+
+ echo $msg ' W' $wtm 'B' $wtb
+}
+
+fn shutdown {
+ echo 'shutting down play script'
+ echo kill >/proc/$uppid/note
+ echo 'exiting'
+ exit
+}
+fn sighup sigint sigterm{
+ shutdown
+}
+
+oifs=$ifs
+
+while() {
+ if(! test -f $ctl) {
+ echo 'ctl file' $ctl 'not found'
+ exit
+ }
+ cstat=`{cat $ctl | sed 1q}
+ msg=`{cat $ctl | sed 2q | tail -n 1}
+ if(! ~ $"msg $"lmsg) {
+ lmsg=$msg
+ prtboard
+ status
+ }
+ if(! ~ $"cstat $"lstat) {
+ lstat=$cstat
+ echo '!!!' $cstat
+ }
+ sleep 0.5
+} &
+uppid=$apid
+echo $uppid
+
+sleep 0.5
+while(echo -n '> '; ifs=() line=`{read | tr -d \xa}) {
+ ifs=$oifs
+ if(! ~ $line '') {
+ switch($line) {
+ case start
+ echo start >$ctl
+ case time*
+ if(! ~ $line(1) '') {
+ echo time $line(1) >$ctl
+ }
+ if not {
+ echo malformed time
+ }
+ case /h
+ echo '/h help'
+ echo '/p print board'
+ echo '/q quit'
+ echo 'start start game'
+ echo 'time set time'
+ echo '* move/draw/resign'
+ prtt=()
+ case /p
+ prtboard
+ status
+ case /q
+ shutdown
+ case *
+ echo $line >$board
+ sleep 0.5
+ }
+ }
+}
+shutdown