Merge branch 'maint' into HEAD
authorYann Dirson <ydirson@free.fr>
Mon, 17 Feb 2014 22:01:48 +0000 (23:01 +0100)
committerYann Dirson <ydirson@free.fr>
Mon, 17 Feb 2014 22:01:48 +0000 (23:01 +0100)
Conflicts:
NEWS
configure.ac
gnushogi/cursesdsp.c

ChangeLog
NEWS
README
README.maint
TODO
configure.ac
gnushogi/commondsp.c
gnushogi/cursesdsp.c
gnushogi/gnushogi.h
gnushogi/rawdsp.c
gnushogi/util.c

index d9ab26a..a54db49 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,312 @@
+2014-02-16  Yann Dirson <ydirson@free.fr>
+
+       * TODO: Note remaining known bugs
+
+2014-02-16  Yann Dirson <ydirson@free.fr>
+
+       * NEWS, gnushogi/commondsp.c: Ensure the player names are refreshed
+       after a switch (impacts Curses mode).
+
+2014-02-16  Yann Dirson <ydirson@free.fr>
+
+       * gnushogi/rawdsp.c: EditBoard: use printf for conciseness
+
+2014-02-16  Yann Dirson <ydirson@free.fr>
+
+       * NEWS, gnushogi/cursesdsp.c: Curses: parametrize hardcoded values
+       for captures pieces, fixing minishogi display.
+
+2014-02-16  Yann Dirson <ydirson@free.fr>
+
+       * NEWS, gnushogi/cursesdsp.c: Curses: shift board one char to the
+       right to leave enough space for captures.  There was not really enough space to display top player's captures
+       correctly.
+
+2014-02-16  Yann Dirson <ydirson@free.fr>
+
+       * NEWS, gnushogi/cursesdsp.c, gnushogi/rawdsp.c: EditBoard: display
+       message on wrong input.
+
+2014-02-16  Yann Dirson <ydirson@free.fr>
+
+       * NEWS, gnushogi/cursesdsp.c, gnushogi/rawdsp.c: EditBoard: fix
+       error handling in piece setting.  On invalid piece name, the code was anyway destroying any piece in
+       the target location, and the whole logic was diluted.
+
+2014-02-16  Yann Dirson <ydirson@free.fr>
+
+       * gnushogi/cursesdsp.c: Curses: move things around in EditBoard to
+       free the message line.
+
+2014-02-16  Yann Dirson <ydirson@free.fr>
+
+       * NEWS, gnushogi/cursesdsp.c: Curses: fix position of lower clock
+       for minishogi.  The hunt for hardcoded values goes on...
+
+2014-02-16  Yann Dirson <ydirson@free.fr>
+
+       * NEWS, gnushogi/cursesdsp.c: Curses: avoid getting out of 80
+       columns when editing board.  Now print user-provided chars on line following the long prompt.
+
+2014-02-16  Yann Dirson <ydirson@free.fr>
+
+       * NEWS, gnushogi/cursesdsp.c: Curses: fix inverted column numbers
+       display for minishogi.
+
+2014-02-16  Yann Dirson <ydirson@free.fr>
+
+       * gnushogi/cursesdsp.c: Curses: use a macro for left margin of
+       display
+
+2014-02-15  Yann Dirson <ydirson@free.fr>
+
+       * gnushogi/cursesdsp.c, gnushogi/rawdsp.c: EditBoard: simplify loop
+       logic by ending iterations early.
+
+2014-02-15  Yann Dirson <ydirson@free.fr>
+
+       * gnushogi/cursesdsp.c, gnushogi/rawdsp.c: EditBoard: restructure
+       loop for consistency.
+
+2014-02-16  Yann Dirson <ydirson@free.fr>
+
+       * gnushogi/cursesdsp.c: EditBoard: resync Curses implementation with
+       the Raw one.
+
+2014-02-15  Yann Dirson <ydirson@free.fr>
+
+       * NEWS, gnushogi/commondsp.c, gnushogi/cursesdsp.c,
+       gnushogi/gnushogi.h, gnushogi/rawdsp.c, gnushogi/util.c: Fix use of
+       (COL|ROW)_NAME macros to compute numbers from names.  The formula is reversible for the somewhat-standard default position
+       notation, but that does not mean we should write silly things.  As a
+       proof, if that was needed, the formula necessary to support the
+       xboard protocol is not reversible.
+
+2014-02-05  Yann Dirson <ydirson@free.fr>
+
+       * doc/gnushogi.texi: Remove XShogi doc from the manual, and add
+       information about available GUIs.
+
+2014-02-05  Yann Dirson <ydirson@free.fr>
+
+       * Makefile.in, NEWS, configure.ac, doc/xshogi.6, xshogi/BUGS,
+       xshogi/Makefile.in, xshogi/NEWS, xshogi/README,
+       xshogi/README.xboard, xshogi/REMOTEHOSTS, xshogi/bitmaps.h,
+       xshogi/eastern_bitmaps/bigblank.xbm,
+       xshogi/eastern_bitmaps/bigblankR.xbm,
+       xshogi/eastern_bitmaps/biglight.xbm,
+       xshogi/eastern_bitmaps/bigsolid.xbm,
+       xshogi/eastern_bitmaps/bigsolidR.xbm,
+       xshogi/eastern_bitmaps/bigsolidR_l.xbm,
+       xshogi/eastern_bitmaps/bigsolidR_m.xbm,
+       xshogi/eastern_bitmaps/bigsolid_l.xbm,
+       xshogi/eastern_bitmaps/bigsolid_m.xbm,
+       xshogi/eastern_bitmaps/bishop.xbm,
+       xshogi/eastern_bitmaps/bishopP.top.xbm,
+       xshogi/eastern_bitmaps/bishopP.xbm,
+       xshogi/eastern_bitmaps/bishopPR.top.xbm,
+       xshogi/eastern_bitmaps/bishopPR.xbm,
+       xshogi/eastern_bitmaps/bishopPR_l.top.xbm,
+       xshogi/eastern_bitmaps/bishopPR_l.xbm,
+       xshogi/eastern_bitmaps/bishopPR_m.top.xbm,
+       xshogi/eastern_bitmaps/bishopPR_m.xbm,
+       xshogi/eastern_bitmaps/bishopP_l.top.xbm,
+       xshogi/eastern_bitmaps/bishopP_l.xbm,
+       xshogi/eastern_bitmaps/bishopP_m.top.xbm,
+       xshogi/eastern_bitmaps/bishopP_m.xbm,
+       xshogi/eastern_bitmaps/bishopR.xbm,
+       xshogi/eastern_bitmaps/bishopR_l.xbm,
+       xshogi/eastern_bitmaps/bishopR_m.xbm,
+       xshogi/eastern_bitmaps/bishop_l.xbm,
+       xshogi/eastern_bitmaps/bishop_m.xbm,
+       xshogi/eastern_bitmaps/gold.xbm, xshogi/eastern_bitmaps/goldR.xbm,
+       xshogi/eastern_bitmaps/goldR_l.xbm,
+       xshogi/eastern_bitmaps/goldR_m.xbm,
+       xshogi/eastern_bitmaps/gold_l.xbm,
+       xshogi/eastern_bitmaps/gold_m.xbm, xshogi/eastern_bitmaps/icon.xbm,
+       xshogi/eastern_bitmaps/king.xbm, xshogi/eastern_bitmaps/kingR.xbm,
+       xshogi/eastern_bitmaps/kingR_l.xbm,
+       xshogi/eastern_bitmaps/kingR_m.xbm,
+       xshogi/eastern_bitmaps/king_l.xbm,
+       xshogi/eastern_bitmaps/king_m.xbm,
+       xshogi/eastern_bitmaps/knight.xbm,
+       xshogi/eastern_bitmaps/knightP.xbm,
+       xshogi/eastern_bitmaps/knightPR.xbm,
+       xshogi/eastern_bitmaps/knightPR_l.xbm,
+       xshogi/eastern_bitmaps/knightPR_m.xbm,
+       xshogi/eastern_bitmaps/knightP_l.xbm,
+       xshogi/eastern_bitmaps/knightP_m.xbm,
+       xshogi/eastern_bitmaps/knightR.xbm,
+       xshogi/eastern_bitmaps/knightR_l.xbm,
+       xshogi/eastern_bitmaps/knightR_m.xbm,
+       xshogi/eastern_bitmaps/knight_l.xbm,
+       xshogi/eastern_bitmaps/knight_m.xbm,
+       xshogi/eastern_bitmaps/lance.xbm,
+       xshogi/eastern_bitmaps/lanceP.xbm,
+       xshogi/eastern_bitmaps/lancePR.xbm,
+       xshogi/eastern_bitmaps/lancePR_l.xbm,
+       xshogi/eastern_bitmaps/lancePR_m.xbm,
+       xshogi/eastern_bitmaps/lanceP_l.xbm,
+       xshogi/eastern_bitmaps/lanceP_m.xbm,
+       xshogi/eastern_bitmaps/lanceR.xbm,
+       xshogi/eastern_bitmaps/lanceR_l.xbm,
+       xshogi/eastern_bitmaps/lanceR_m.xbm,
+       xshogi/eastern_bitmaps/lance_l.xbm,
+       xshogi/eastern_bitmaps/lance_m.xbm,
+       xshogi/eastern_bitmaps/none.xbm, xshogi/eastern_bitmaps/none_l.xbm,
+       xshogi/eastern_bitmaps/none_m.xbm, xshogi/eastern_bitmaps/pawn.xbm,
+       xshogi/eastern_bitmaps/pawnP.xbm,
+       xshogi/eastern_bitmaps/pawnPR.xbm,
+       xshogi/eastern_bitmaps/pawnPR_l.xbm,
+       xshogi/eastern_bitmaps/pawnPR_m.xbm,
+       xshogi/eastern_bitmaps/pawnP_l.xbm,
+       xshogi/eastern_bitmaps/pawnP_m.xbm,
+       xshogi/eastern_bitmaps/pawnR.xbm,
+       xshogi/eastern_bitmaps/pawnR_l.xbm,
+       xshogi/eastern_bitmaps/pawnR_m.xbm,
+       xshogi/eastern_bitmaps/pawn_l.xbm,
+       xshogi/eastern_bitmaps/pawn_m.xbm, xshogi/eastern_bitmaps/rook.xbm,
+       xshogi/eastern_bitmaps/rookP.top.xbm,
+       xshogi/eastern_bitmaps/rookP.xbm,
+       xshogi/eastern_bitmaps/rookPR.top.xbm,
+       xshogi/eastern_bitmaps/rookPR.xbm,
+       xshogi/eastern_bitmaps/rookPR_l.top.xbm,
+       xshogi/eastern_bitmaps/rookPR_l.xbm,
+       xshogi/eastern_bitmaps/rookPR_m.top.xbm,
+       xshogi/eastern_bitmaps/rookPR_m.xbm,
+       xshogi/eastern_bitmaps/rookP_l.top.xbm,
+       xshogi/eastern_bitmaps/rookP_l.xbm,
+       xshogi/eastern_bitmaps/rookP_m.top.xbm,
+       xshogi/eastern_bitmaps/rookP_m.xbm,
+       xshogi/eastern_bitmaps/rookR.xbm,
+       xshogi/eastern_bitmaps/rookR_l.xbm,
+       xshogi/eastern_bitmaps/rookR_m.xbm,
+       xshogi/eastern_bitmaps/rook_l.xbm,
+       xshogi/eastern_bitmaps/rook_m.xbm,
+       xshogi/eastern_bitmaps/silver.xbm,
+       xshogi/eastern_bitmaps/silverP.xbm,
+       xshogi/eastern_bitmaps/silverPR.xbm,
+       xshogi/eastern_bitmaps/silverPR_l.xbm,
+       xshogi/eastern_bitmaps/silverPR_m.xbm,
+       xshogi/eastern_bitmaps/silverP_l.xbm,
+       xshogi/eastern_bitmaps/silverP_m.xbm,
+       xshogi/eastern_bitmaps/silverR.xbm,
+       xshogi/eastern_bitmaps/silverR_l.xbm,
+       xshogi/eastern_bitmaps/silverR_m.xbm,
+       xshogi/eastern_bitmaps/silver_l.xbm,
+       xshogi/eastern_bitmaps/silver_m.xbm,
+       xshogi/eastern_bitmaps/smallblank.xbm,
+       xshogi/eastern_bitmaps/smallblankR.xbm,
+       xshogi/eastern_bitmaps/smalllight.xbm,
+       xshogi/eastern_bitmaps/smallsolid.xbm,
+       xshogi/eastern_bitmaps/smallsolidR.xbm,
+       xshogi/eastern_bitmaps/smallsolidR_l.xbm,
+       xshogi/eastern_bitmaps/smallsolidR_m.xbm,
+       xshogi/eastern_bitmaps/smallsolid_l.xbm,
+       xshogi/eastern_bitmaps/smallsolid_m.xbm,
+       xshogi/new_eastern_bitmaps/bigsolidR_l.xbm,
+       xshogi/new_eastern_bitmaps/bigsolid_l.xbm,
+       xshogi/new_eastern_bitmaps/bishopPR_l.xbm,
+       xshogi/new_eastern_bitmaps/bishopP_l.xbm,
+       xshogi/new_eastern_bitmaps/bishopR_l.xbm,
+       xshogi/new_eastern_bitmaps/bishop_l.xbm,
+       xshogi/new_eastern_bitmaps/goldR_l.xbm,
+       xshogi/new_eastern_bitmaps/gold_l.xbm,
+       xshogi/new_eastern_bitmaps/kingR_l.xbm,
+       xshogi/new_eastern_bitmaps/king_l.xbm,
+       xshogi/new_eastern_bitmaps/knightPR_l.xbm,
+       xshogi/new_eastern_bitmaps/knightP_l.xbm,
+       xshogi/new_eastern_bitmaps/knightR_l.xbm,
+       xshogi/new_eastern_bitmaps/knight_l.xbm,
+       xshogi/new_eastern_bitmaps/lancePR_l.xbm,
+       xshogi/new_eastern_bitmaps/lanceP_l.xbm,
+       xshogi/new_eastern_bitmaps/lanceR_l.xbm,
+       xshogi/new_eastern_bitmaps/lance_l.xbm,
+       xshogi/new_eastern_bitmaps/none_l.xbm,
+       xshogi/new_eastern_bitmaps/pawnPR_l.xbm,
+       xshogi/new_eastern_bitmaps/pawnP_l.xbm,
+       xshogi/new_eastern_bitmaps/pawnR_l.xbm,
+       xshogi/new_eastern_bitmaps/pawn_l.xbm,
+       xshogi/new_eastern_bitmaps/rookPR_l.xbm,
+       xshogi/new_eastern_bitmaps/rookP_l.xbm,
+       xshogi/new_eastern_bitmaps/rookR_l.xbm,
+       xshogi/new_eastern_bitmaps/rook_l.xbm,
+       xshogi/new_eastern_bitmaps/silverPR_l.xbm,
+       xshogi/new_eastern_bitmaps/silverP_l.xbm,
+       xshogi/new_eastern_bitmaps/silverR_l.xbm,
+       xshogi/new_eastern_bitmaps/silver_l.xbm,
+       xshogi/new_eastern_bitmaps/smallsolidR_l.xbm,
+       xshogi/new_eastern_bitmaps/smallsolid_l.xbm,
+       xshogi/new_western_bitmaps/bishopPRW.xbm,
+       xshogi/new_western_bitmaps/bishopPW.xbm,
+       xshogi/new_western_bitmaps/bishopRW.xbm,
+       xshogi/new_western_bitmaps/bishopW.xbm,
+       xshogi/new_western_bitmaps/goldRW.xbm,
+       xshogi/new_western_bitmaps/goldW.xbm,
+       xshogi/new_western_bitmaps/kingRW.xbm,
+       xshogi/new_western_bitmaps/kingW.xbm,
+       xshogi/new_western_bitmaps/knightPRW.xbm,
+       xshogi/new_western_bitmaps/knightPW.xbm,
+       xshogi/new_western_bitmaps/knightRW.xbm,
+       xshogi/new_western_bitmaps/knightW.xbm,
+       xshogi/new_western_bitmaps/lancePRW.xbm,
+       xshogi/new_western_bitmaps/lancePW.xbm,
+       xshogi/new_western_bitmaps/lanceRW.xbm,
+       xshogi/new_western_bitmaps/lanceW.xbm,
+       xshogi/new_western_bitmaps/noneW.xbm,
+       xshogi/new_western_bitmaps/pawnPRW.xbm,
+       xshogi/new_western_bitmaps/pawnPW.xbm,
+       xshogi/new_western_bitmaps/pawnRW.xbm,
+       xshogi/new_western_bitmaps/pawnW.xbm,
+       xshogi/new_western_bitmaps/rookPRW.xbm,
+       xshogi/new_western_bitmaps/rookPW.xbm,
+       xshogi/new_western_bitmaps/rookRW.xbm,
+       xshogi/new_western_bitmaps/rookW.xbm,
+       xshogi/new_western_bitmaps/silverPRW.xbm,
+       xshogi/new_western_bitmaps/silverPW.xbm,
+       xshogi/new_western_bitmaps/silverRW.xbm,
+       xshogi/new_western_bitmaps/silverW.xbm, xshogi/parser.y,
+       xshogi/scanner.l, xshogi/sysdeps.h,
+       xshogi/western_bitmaps/bishopPRW.xbm,
+       xshogi/western_bitmaps/bishopPW.xbm,
+       xshogi/western_bitmaps/bishopRW.xbm,
+       xshogi/western_bitmaps/bishopW.xbm,
+       xshogi/western_bitmaps/goldRW.xbm,
+       xshogi/western_bitmaps/goldW.xbm,
+       xshogi/western_bitmaps/kingRW.xbm,
+       xshogi/western_bitmaps/kingW.xbm,
+       xshogi/western_bitmaps/knightPRW.xbm,
+       xshogi/western_bitmaps/knightPW.xbm,
+       xshogi/western_bitmaps/knightRW.xbm,
+       xshogi/western_bitmaps/knightW.xbm,
+       xshogi/western_bitmaps/lancePRW.xbm,
+       xshogi/western_bitmaps/lancePW.xbm,
+       xshogi/western_bitmaps/lanceRW.xbm,
+       xshogi/western_bitmaps/lanceW.xbm,
+       xshogi/western_bitmaps/noneW.xbm,
+       xshogi/western_bitmaps/pawnPRW.xbm,
+       xshogi/western_bitmaps/pawnPW.xbm,
+       xshogi/western_bitmaps/pawnRW.xbm,
+       xshogi/western_bitmaps/pawnW.xbm,
+       xshogi/western_bitmaps/rookPRW.xbm,
+       xshogi/western_bitmaps/rookPW.xbm,
+       xshogi/western_bitmaps/rookRW.xbm,
+       xshogi/western_bitmaps/rookW.xbm,
+       xshogi/western_bitmaps/silverPRW.xbm,
+       xshogi/western_bitmaps/silverPW.xbm,
+       xshogi/western_bitmaps/silverRW.xbm,
+       xshogi/western_bitmaps/silverW.xbm, xshogi/xshogi.c,
+       xshogi/xshogi.h, xshogi/xshogifn.h: Remove XShogi from the source
+       tree
+
+2014-01-16  Yann Dirson <ydirson@free.fr>
+
+       * configure.ac: Bump version to "1.4.1+".
+
+2014-01-14  Yann Dirson <ydirson@free.fr>
+
+       * ChangeLog, NEWS, README, configure.ac: Prepare v1.4.1
+
 2014-01-14  Yann Dirson <ydirson@free.fr>
 
        * AUTHORS: Update maintainership info in AUTHORS.
diff --git a/NEWS b/NEWS
index b32a839..05e43f8 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -8,10 +8,19 @@ Changes in version 1.5.0 (unreleased):
   including building windows binaries (both 32bit and 64bit) using
   the gcc-mingw toolchain
 
-Changes in version 1.4.2 (unreleased):
+Changes in version 1.4.2 (02/2014):
 
 * XShogi is no longer included in the GNU Shogi source, it is
   available as a separate source archive.
+* Fixes for edit mode:
+  - fixed clobbering of board on invalid input
+  - display a message on wrong input
+* Fixed Curses mode display:
+  - reversed column number for MiniShogi
+  - clock and captures position for MiniShogi
+  - refresh display after "switch" to get player names updated
+  - layout fixes, notably when using only 80 columns
+* Minor code cleanups.
 
 Changes in version 1.4.1 (01/2014):
 
diff --git a/README b/README
index 918b108..a50c2dc 100644 (file)
--- a/README
+++ b/README
@@ -1,7 +1,7 @@
-GNU Shogi, release 1.4.1
+GNU Shogi, release 1.4.2
 ------------------------
 
-This is release 1.4.1 of GNU shogi, a program which plays shogi
+This is release 1.4.2 of GNU shogi, a program which plays shogi
 (Japanese chess), as well as xshogi, the graphical interface to GNU
 shogi.
 
index 7d69bb6..8d2e600 100644 (file)
@@ -10,3 +10,11 @@ Profiling
 ---------
 
 Build with "-g -pg -fprofile-arcs -ftest-coverage"
+
+Announcing new releases
+-----------------------
+
+* gnushogi-devel@gnu.org
+* info-gnu@gnu.org
+* https://savannah.gnu.org/news/submit.php?group=gnushogi
+* https://freecode.com/projects/gnu-shogi
diff --git a/TODO b/TODO
index 054e46a..8a41e7b 100644 (file)
--- a/TODO
+++ b/TODO
@@ -1,3 +1,10 @@
+Known bugs:
+
+- some positions show problem in the evaluation algorithm
+- minishogi repetition rule, different from standard shogi, is
+  not implemented
+- with no piece on board, computer generates invalid move
+
 Target for v1.5:
 
 - integrate H.G.Muller's work on the xboard protocol on top of new driver-like
index 60dac7a..bdfde4e 100644 (file)
@@ -5,7 +5,7 @@
 dnl Process this file with autoconf to produce a configure script.
 
 AC_PREREQ(2.57)
-AC_INIT([gnushogi],[1.4.1+],[https://savannah.gnu.org/bugs/?group=gnushogi])
+AC_INIT([gnushogi],[1.4.2+],[https://savannah.gnu.org/bugs/?group=gnushogi])
 AM_INIT_AUTOMAKE
 AC_CONFIG_SRCDIR([gnushogi/gnushogi.h])
 AC_CONFIG_HEADER(config.h)
index 90a3ca0..e5efc17 100644 (file)
@@ -384,17 +384,17 @@ parser(char *f, short *fpiece)
 
     if (f[1] == '*' || f[1] == '\'')
     {
-        c2 = COL_NAME(f[2]);
-        r2 = ROW_NAME(f[3]);
+        c2 = COL_NUM(f[2]);
+        r2 = ROW_NUM(f[3]);
 
         return ((NO_SQUARES + *fpiece) << 8) | locn(r2, c2);
     }
     else
     {
-        c1 = COL_NAME(f[1]);
-        r1 = ROW_NAME(f[2]);
-        c2 = COL_NAME(f[3]);
-        r2 = ROW_NAME(f[4]);
+        c1 = COL_NUM(f[1]);
+        r1 = ROW_NUM(f[2]);
+        c2 = COL_NUM(f[3]);
+        r2 = ROW_NUM(f[4]);
         p = (f[5] == '+') ? 0x80 : 0;
 
         return (locn(r1, c1) << 8) | locn(r2, c2) | p;
@@ -1755,6 +1755,7 @@ InputCommand(char *command)
             flag.force = false;
             Sdepth = 0;
             ok = true;
+            dsp->UpdateDisplay(0, 0, 1, 0);
         }
         else if (strcmp(s, "black") == 0)
         {
index bf37999..2ee21ae 100644 (file)
@@ -62,6 +62,7 @@
 
 #define FLUSH_SCANW fflush(stdout), scanw
 
+#define MARGIN (5)
 #define TAB (58)
 
 #define VIR_C(s)  ((flag.reverse) ? (NO_COLS - 1 - column(s)) : column(s))
@@ -107,6 +108,13 @@ gotoXY(short x, short y)
 
 
 static void
+ClearMessage(void)
+{
+    gotoXY(TAB, 6);
+    ClearEoln();
+}
+
+static void
 Curses_ShowCurrentMove(short pnt, short f, short t)
 {
     algbr(f, t, false);
@@ -442,8 +450,8 @@ Curses_help(void)
 }
 
 
-static const short x0[2] = { 54, 2 };
-static const short y0[2] = { 20, 4 };
+static const short x0[2] = { MARGIN + 5*NO_COLS + 4, 2 };
+static const short y0[2] = { 4 + 2 * (NO_ROWS - 1), 4 };
 
 
 /*
@@ -455,7 +463,7 @@ static const short y0[2] = { 20, 4 };
 static void
 Curses_EditBoard(void)
 {
-    short a, c, sq, i;
+    short a, c, sq, i, found;
     short r = 0;
     char s[80];
 
@@ -463,23 +471,28 @@ Curses_EditBoard(void)
     Book = BOOKFAIL;
     Curses_ClearScreen();
     Curses_UpdateDisplay(0, 0, 1, 0);
-    gotoXY(TAB, 3);
+    gotoXY(TAB, 11);
     printw(".   Exit to main\n");
-    gotoXY(TAB, 4);
+    gotoXY(TAB, 12);
     printw("#   Clear board\n");
-    gotoXY(TAB, 5);
+    gotoXY(TAB, 13);
     printw("c   Change sides\n");
     gotoXY(TAB, 7);
     printw("Enter piece & location: ");
     a = black;
 
-    do
+    while(1)
     {
-        gotoXY(TAB, 6);
+        gotoXY(TAB, 4);
         printw("Editing: %s", ColorStr[a]);
-        gotoXY(TAB + 24, 7);
+        gotoXY(TAB + 2, 8);
         ClearEoln();
         FLUSH_SCANW("%s", s);
+        found = 0;
+        ClearMessage();
+
+        if (s[0] == '.')
+            break;
 
         if (s[0] == '#')
         {
@@ -492,50 +505,61 @@ Curses_EditBoard(void)
 
             ClearCaptured();
             UpdateCatched();
+            continue;
         }
 
-        if (s[0] == 'c')
+        if (s[0] == 'c') {
             a = otherside[a];
+            continue;
+        }
 
         if (s[1] == '*')
         {
             for (i = NO_PIECES; i > no_piece; i--)
             {
                 if ((s[0] == pxx[i]) || (s[0] == qxx[i]))
+                {
+                    Captured[a][unpromoted[i]]++;
+                    UpdateCatched();
+                    found = 1;
                     break;
+                }
             }
-
-            Captured[a][unpromoted[i]]++;
-            UpdateCatched();
-            c = -1;
+            if (!found)
+                dsp->AlwaysShowMessage("Invalid piece type '%c'", s[0]);
+            continue;
         }
-        else
-        {
-            c = COL_NAME(s[1]);
-            r = ROW_NAME(s[2]);
+
+        c = COL_NUM(s[1]);
+        r = ROW_NUM(s[2]);
+
+        if ((c < 0) || (c >= NO_COLS) || (r < 0) || (r >= NO_ROWS)) {
+            dsp->AlwaysShowMessage("Out-of-board '%c%c'", s[1], s[2]);
+            continue;
         }
 
-        if ((c >= 0) && (c < NO_COLS) && (r >= 0) && (r < NO_ROWS))
-        {
-            sq = locn(r, c);
+        sq = locn(r, c);
 
-            for (i = NO_PIECES; i > no_piece; i--)
+        for (i = NO_PIECES; i > no_piece; i--)
+        {
+            if ((s[0] == pxx[i]) || (s[0] == qxx[i]))
             {
-                if ((s[0] == pxx[i]) || (s[0] == qxx[i]))
-                    break;
+                color[sq] = a;
+                if (s[3] == '+')
+                    board[sq] = promoted[i];
+                else
+                    board[sq] = unpromoted[i];
+
+                found = 1;
+                break;
             }
+        }
 
-            if (s[3] == '+')
-                i = promoted[i];
-            else
-                i = unpromoted[i];
+        if (!found)
+            dsp->AlwaysShowMessage("Invalid piece type '%c'", s[0]);
 
-            board[sq] = i;
-            color[sq] = ((board[sq] == no_piece) ? neutral : a);
-            DrawPiece(sq);
-        }
+        DrawPiece(sq);
     }
-    while (s[0] != '.');
 
     for (sq = 0; sq < NO_SQUARES; sq++)
         Mvboard[sq] = ((board[sq] != Stboard[sq]) ? 10 : 0);
@@ -706,9 +730,9 @@ Curses_UpdateClocks(void)
         s = 0;
 
     if (player == black)
-        gotoXY(20, (flag.reverse) ? 2 : 23);
+        gotoXY(20, (flag.reverse) ? 2 : (5 + 2*NO_ROWS));
     else
-        gotoXY(20, (flag.reverse) ? 23 : 2);
+        gotoXY(20, (flag.reverse) ? (5 + 2*NO_ROWS) : 2);
 
     /* printw("%d:%02d %ld  ", m, s, dt); */
     printw("%d:%02d  ", m, s); 
@@ -753,7 +777,7 @@ DrawPiece(short sq)
         y = pxx[(int)piece];
     }
 
-    gotoXY(8 + 5 * VIR_C(sq), 4 + 2 * ((NO_ROWS - 1) - VIR_R(sq)));
+    gotoXY(MARGIN + 3 + 5 * VIR_C(sq), 4 + 2 * ((NO_ROWS - 1) - VIR_R(sq)));
     printw("%c%c%c%c", l, p, y, r);
 }
 
@@ -816,42 +840,41 @@ Curses_UpdateDisplay(short f, short t, short redraw, short isspec)
         ShowPlayers();
 
         i = 2;
-        gotoXY(3, ++i);
+        gotoXY(MARGIN, ++i);
 
-        printw("    +");
+        printw("  +");
        for (j=0; j<NO_COLS; j++)
            printw("----+");
 
         while (i <= 1 + 2*NO_ROWS)
         {
-            gotoXY(1, ++i);
+            gotoXY(MARGIN, ++i);
 
             if (flag.reverse)
                 z = (i / 2) - 1;
             else
                 z = NO_ROWS + 2 - ((i + 1) / 2);
 
-            printw("    %c |", ROW_NAME(z+1));
+            printw("%c |", ROW_NAME(z+1));
            for (j=0; j<NO_COLS; j++)
                printw("    |");
 
-            gotoXY(3, ++i);
+            gotoXY(MARGIN, ++i);
 
             if (i < 2 + 2*NO_ROWS)
             {
-               printw("    +");
+               printw("  +");
                for (j=0; j<NO_COLS; j++)
                    printw("----+");
             }
         }
 
-       printw("    +");
+       printw("  +");
        for (j=0; j<NO_COLS; j++)
            printw("----+");
 
-        gotoXY(3, 4 + 2*NO_ROWS);
-        printw("    ");
-
+        gotoXY(MARGIN, 4 + 2*NO_ROWS);
+        printw("  ");
 #ifndef MINISHOGI
         if (flag.reverse)
             printw("  1    2    3    4    5    6    7    8    9");
@@ -861,7 +884,7 @@ Curses_UpdateDisplay(short f, short t, short redraw, short isspec)
         if (flag.reverse)
             printw("  1    2    3    4    5");
         else
-            printw("  1    2    3    4    5");
+            printw("  5    4    3    2    1");
 #endif
 
         for (sq = 0; sq < NO_SQUARES; sq++)
index 29d9abe..7854113 100644 (file)
@@ -183,6 +183,8 @@ extern void movealgbr(short m, char *s);
 
 #define ROW_NAME(n) ('a' + NO_ROWS - 1 - n)
 #define COL_NAME(n) ('1' + NO_COLS - 1 - n)
+#define ROW_NUM(c) ('a' + NO_ROWS - 1 - c)
+#define COL_NUM(c) ('1' + NO_COLS - 1 - c)
 
 #if defined HASHFILE || defined CACHE
 #  define PTBLBDSIZE (NO_SQUARES + NO_PIECES)
index 0a4e473..588f13f 100644 (file)
@@ -352,18 +352,21 @@ Raw_EditBoard(void)
     Book = BOOKFAIL;
     Raw_ClearScreen();
     Raw_UpdateDisplay(0, 0, 1, 0);
-    fputs(".   Exit to main\n", stdout);
-    fputs("#   Clear board\n", stdout);
-    fputs("c   Change sides\n", stdout);
-    fputs("enter piece & location: \n", stdout);
+    printf(".   Exit to main\n");
+    printf("#   Clear board\n");
+    printf("c   Change sides\n");
+    printf("enter piece & location:\n");
 
     a = black;
 
-    do
+    while(1)
     {
         scanf("%s", s);
         found = 0;
 
+        if (s[0] == '.')
+            break;
+
         if (s[0] == '#')
         {
             for (sq = 0; sq < NO_SQUARES; sq++)
@@ -373,10 +376,13 @@ Raw_EditBoard(void)
             }
 
             ClearCaptured();
+            continue;
         }
 
-        if (s[0] == 'c')
+        if (s[0] == 'c') {
             a = otherside[a];
+            continue;
+        }
 
         if (s[1] == '*')
         {
@@ -389,41 +395,39 @@ Raw_EditBoard(void)
                     break;
                 }
             }
-
-            c = -1;
-            r = -1;
+            if (!found)
+                printf("# Invalid piece type '%c'\n", s[0]);
+            continue;
         }
-        else
-        {
-            c = COL_NAME(s[1]);
-            r = ROW_NAME(s[2]);
+
+        c = COL_NUM(s[1]);
+        r = ROW_NUM(s[2]);
+
+        if ((c < 0) || (c >= NO_COLS) || (r < 0) || (r >= NO_ROWS)) {
+            printf("# Out-of-board position '%c%c'\n", s[1], s[2]);
+            continue;
         }
 
-        if ((c >= 0) && (c < NO_COLS) && (r >= 0) && (r < NO_ROWS))
-        {
-            sq = locn(r, c);
-            color[sq] = a;
-            board[sq] = no_piece;
+        sq = locn(r, c);
 
-            for (i = no_piece; i <= king; i++)
+        for (i = no_piece; i <= king; i++)
+        {
+            if ((s[0] == pxx[i]) || (s[0] == qxx[i]))
             {
-                if ((s[0] == pxx[i]) || (s[0] == qxx[i]))
-                {
-                    if (s[3] == '+')
-                        board[sq] = promoted[i];
-                    else
-                        board[sq] = i;
+                color[sq] = a;
+                if (s[3] == '+')
+                    board[sq] = promoted[i];
+                else
+                    board[sq] = i;
 
-                    found = 1;
-                    break;
-                }
+                found = 1;
+                break;
             }
-
-            if (found == 0)
-                color[sq] = neutral;
         }
+
+        if (!found)
+            printf("# Invalid piece type '%c'\n", s[0]);
     }
-    while (s[0] != '.');
 
     for (sq = 0; sq < NO_SQUARES; sq++)
         Mvboard[sq] = ((board[sq] != Stboard[sq]) ? 10 : 0);
index 927f3d8..96c702f 100644 (file)
@@ -85,10 +85,10 @@ parse(FILE * fd, unsigned short *mv, char *opening)
         return 0;
     }
 
-    c1 = COL_NAME(s[0]);
-    r1 = ROW_NAME(s[1]);
-    c2 = COL_NAME(s[2]);
-    r2 = ROW_NAME(s[3]);
+    c1 = COL_NUM(s[0]);
+    r1 = ROW_NUM(s[1]);
+    c2 = COL_NUM(s[2]);
+    r2 = ROW_NUM(s[3]);
     *mv = (locn(r1, c1) << 8) | locn(r2, c2);
 
     if (c == '?')