eliot-dev
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Eliot-dev] eliot TODO configure.in dic/automaton.h dic/dic...


From: Olivier Teulière
Subject: [Eliot-dev] eliot TODO configure.in dic/automaton.h dic/dic...
Date: Sun, 29 Nov 2009 16:01:35 +0000

CVSROOT:        /cvsroot/eliot
Module name:    eliot
Changes by:     Olivier Teulière <ipkiss>       09/11/29 16:01:34

Modified files:
        .              : TODO configure.in 
        dic            : automaton.h dic.h dic_exception.h 
                         dic_internals.h encoding.cpp encoding.h 
                         grammar.cpp grammar.h header.cpp header.h 
                         regexp.h tile.h 
        extras/contrib : Makefile 
        game           : Makefile.am ai_percent.cpp ai_percent.h 
                         ai_player.h bag.cpp bag.h board.cpp board.h 
                         board_search.h command.h coord.cpp coord.h 
                         cross.cpp cross.h debug.h duplicate.cpp 
                         duplicate.h freegame.cpp freegame.h game.cpp 
                         game.h game_exception.cpp game_exception.h 
                         game_factory.cpp game_factory.h game_io.cpp 
                         game_move_cmd.cpp game_move_cmd.h history.h 
                         matrix.h move.cpp move.h navigation.cpp 
                         navigation.h player.h player_move_cmd.h 
                         player_points_cmd.h player_rack_cmd.h pldrack.h 
                         public_game.cpp public_game.h rack.h results.h 
                         round.h settings.h training.cpp training.h 
                         turn.h turn_cmd.h 
        qt             : Makefile.am main_window.cpp new_game.cpp 
        test           : driver duplicate_1_player.ref 
                         duplicate_2_ai.ref 
                         duplicate_explosive_variant.ref 
                         duplicate_humans_ai.ref 
                         duplicate_invalid_turn.ref 
                         duplicate_joker_variant.ref 
                         duplicate_navigation.ref duplicate_no_point.ref 
                         freegame_3_ai.ref freegame_change.ref 
                         freegame_explosive_variant.ref 
                         freegame_joker_variant.ref 
                         freegame_navigation.ref freegame_passing.ref 
                         freegame_play.ref load_game.ref 
                         load_saved_game.ref training_joker.input 
                         training_joker.ref training_joker_variant.ref 
                         training_navigation.ref training_rosace.input 
                         training_rosace.ref 
        utils          : Makefile.am eliottxt.cpp game_io.cpp game_io.h 
                         ncurses.cpp ncurses.h 
Added files:
        game           : mark_played_cmd.cpp mark_played_cmd.h 
                         xml_reader.cpp xml_reader.h xml_writer.cpp 
                         xml_writer.h 
Removed files:
        test           : rosace training_joker2.input 
                         training_joker2.ref 

Log message:
        Support saving/loading games (any game type) in XML format.
        
        Status:
        It works well, but there are still a few details to improve/fix
        
        More details about the changes:
         - New dependency on Arabica and Libxml2 to parse the XML
         - Loading the old format is still supported for this release, but 
won't be supported anymore in the next one
         - Games are now only saved in the new format
         - In training mode, the player is now created externally, like in the 
other modes
         - Avoid using GameIO (the one from game/) whenever possible
         - Do not use a FILE* argument anymore when loading a game
         - Throw and catch exceptions correctly when a game cannot be loaded or 
saved
         - The non-regression tests now use a new method to print the game 
history

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/eliot/TODO?cvsroot=eliot&r1=1.9&r2=1.10
http://cvs.savannah.gnu.org/viewcvs/eliot/configure.in?cvsroot=eliot&r1=1.38&r2=1.39
http://cvs.savannah.gnu.org/viewcvs/eliot/dic/automaton.h?cvsroot=eliot&r1=1.14&r2=1.15
http://cvs.savannah.gnu.org/viewcvs/eliot/dic/dic.h?cvsroot=eliot&r1=1.26&r2=1.27
http://cvs.savannah.gnu.org/viewcvs/eliot/dic/dic_exception.h?cvsroot=eliot&r1=1.3&r2=1.4
http://cvs.savannah.gnu.org/viewcvs/eliot/dic/dic_internals.h?cvsroot=eliot&r1=1.11&r2=1.12
http://cvs.savannah.gnu.org/viewcvs/eliot/dic/encoding.cpp?cvsroot=eliot&r1=1.11&r2=1.12
http://cvs.savannah.gnu.org/viewcvs/eliot/dic/encoding.h?cvsroot=eliot&r1=1.4&r2=1.5
http://cvs.savannah.gnu.org/viewcvs/eliot/dic/grammar.cpp?cvsroot=eliot&r1=1.6&r2=1.7
http://cvs.savannah.gnu.org/viewcvs/eliot/dic/grammar.h?cvsroot=eliot&r1=1.2&r2=1.3
http://cvs.savannah.gnu.org/viewcvs/eliot/dic/header.cpp?cvsroot=eliot&r1=1.14&r2=1.15
http://cvs.savannah.gnu.org/viewcvs/eliot/dic/header.h?cvsroot=eliot&r1=1.11&r2=1.12
http://cvs.savannah.gnu.org/viewcvs/eliot/dic/regexp.h?cvsroot=eliot&r1=1.19&r2=1.20
http://cvs.savannah.gnu.org/viewcvs/eliot/dic/tile.h?cvsroot=eliot&r1=1.6&r2=1.7
http://cvs.savannah.gnu.org/viewcvs/eliot/extras/contrib/Makefile?cvsroot=eliot&r1=1.6&r2=1.7
http://cvs.savannah.gnu.org/viewcvs/eliot/game/Makefile.am?cvsroot=eliot&r1=1.25&r2=1.26
http://cvs.savannah.gnu.org/viewcvs/eliot/game/ai_percent.cpp?cvsroot=eliot&r1=1.13&r2=1.14
http://cvs.savannah.gnu.org/viewcvs/eliot/game/ai_percent.h?cvsroot=eliot&r1=1.12&r2=1.13
http://cvs.savannah.gnu.org/viewcvs/eliot/game/ai_player.h?cvsroot=eliot&r1=1.11&r2=1.12
http://cvs.savannah.gnu.org/viewcvs/eliot/game/bag.cpp?cvsroot=eliot&r1=1.12&r2=1.13
http://cvs.savannah.gnu.org/viewcvs/eliot/game/bag.h?cvsroot=eliot&r1=1.12&r2=1.13
http://cvs.savannah.gnu.org/viewcvs/eliot/game/board.cpp?cvsroot=eliot&r1=1.25&r2=1.26
http://cvs.savannah.gnu.org/viewcvs/eliot/game/board.h?cvsroot=eliot&r1=1.20&r2=1.21
http://cvs.savannah.gnu.org/viewcvs/eliot/game/board_search.h?cvsroot=eliot&r1=1.1&r2=1.2
http://cvs.savannah.gnu.org/viewcvs/eliot/game/command.h?cvsroot=eliot&r1=1.3&r2=1.4
http://cvs.savannah.gnu.org/viewcvs/eliot/game/coord.cpp?cvsroot=eliot&r1=1.12&r2=1.13
http://cvs.savannah.gnu.org/viewcvs/eliot/game/coord.h?cvsroot=eliot&r1=1.10&r2=1.11
http://cvs.savannah.gnu.org/viewcvs/eliot/game/cross.cpp?cvsroot=eliot&r1=1.11&r2=1.12
http://cvs.savannah.gnu.org/viewcvs/eliot/game/cross.h?cvsroot=eliot&r1=1.11&r2=1.12
http://cvs.savannah.gnu.org/viewcvs/eliot/game/debug.h?cvsroot=eliot&r1=1.15&r2=1.16
http://cvs.savannah.gnu.org/viewcvs/eliot/game/duplicate.cpp?cvsroot=eliot&r1=1.32&r2=1.33
http://cvs.savannah.gnu.org/viewcvs/eliot/game/duplicate.h?cvsroot=eliot&r1=1.22&r2=1.23
http://cvs.savannah.gnu.org/viewcvs/eliot/game/freegame.cpp?cvsroot=eliot&r1=1.32&r2=1.33
http://cvs.savannah.gnu.org/viewcvs/eliot/game/freegame.h?cvsroot=eliot&r1=1.17&r2=1.18
http://cvs.savannah.gnu.org/viewcvs/eliot/game/game.cpp?cvsroot=eliot&r1=1.57&r2=1.58
http://cvs.savannah.gnu.org/viewcvs/eliot/game/game.h?cvsroot=eliot&r1=1.51&r2=1.52
http://cvs.savannah.gnu.org/viewcvs/eliot/game/game_exception.cpp?cvsroot=eliot&r1=1.2&r2=1.3
http://cvs.savannah.gnu.org/viewcvs/eliot/game/game_exception.h?cvsroot=eliot&r1=1.2&r2=1.3
http://cvs.savannah.gnu.org/viewcvs/eliot/game/game_factory.cpp?cvsroot=eliot&r1=1.12&r2=1.13
http://cvs.savannah.gnu.org/viewcvs/eliot/game/game_factory.h?cvsroot=eliot&r1=1.11&r2=1.12
http://cvs.savannah.gnu.org/viewcvs/eliot/game/game_io.cpp?cvsroot=eliot&r1=1.13&r2=1.14
http://cvs.savannah.gnu.org/viewcvs/eliot/game/game_move_cmd.cpp?cvsroot=eliot&r1=1.5&r2=1.6
http://cvs.savannah.gnu.org/viewcvs/eliot/game/game_move_cmd.h?cvsroot=eliot&r1=1.2&r2=1.3
http://cvs.savannah.gnu.org/viewcvs/eliot/game/history.h?cvsroot=eliot&r1=1.14&r2=1.15
http://cvs.savannah.gnu.org/viewcvs/eliot/game/matrix.h?cvsroot=eliot&r1=1.1&r2=1.2
http://cvs.savannah.gnu.org/viewcvs/eliot/game/move.cpp?cvsroot=eliot&r1=1.4&r2=1.5
http://cvs.savannah.gnu.org/viewcvs/eliot/game/move.h?cvsroot=eliot&r1=1.4&r2=1.5
http://cvs.savannah.gnu.org/viewcvs/eliot/game/navigation.cpp?cvsroot=eliot&r1=1.9&r2=1.10
http://cvs.savannah.gnu.org/viewcvs/eliot/game/navigation.h?cvsroot=eliot&r1=1.4&r2=1.5
http://cvs.savannah.gnu.org/viewcvs/eliot/game/player.h?cvsroot=eliot&r1=1.24&r2=1.25
http://cvs.savannah.gnu.org/viewcvs/eliot/game/player_move_cmd.h?cvsroot=eliot&r1=1.2&r2=1.3
http://cvs.savannah.gnu.org/viewcvs/eliot/game/player_points_cmd.h?cvsroot=eliot&r1=1.1&r2=1.2
http://cvs.savannah.gnu.org/viewcvs/eliot/game/player_rack_cmd.h?cvsroot=eliot&r1=1.2&r2=1.3
http://cvs.savannah.gnu.org/viewcvs/eliot/game/pldrack.h?cvsroot=eliot&r1=1.15&r2=1.16
http://cvs.savannah.gnu.org/viewcvs/eliot/game/public_game.cpp?cvsroot=eliot&r1=1.5&r2=1.6
http://cvs.savannah.gnu.org/viewcvs/eliot/game/public_game.h?cvsroot=eliot&r1=1.5&r2=1.6
http://cvs.savannah.gnu.org/viewcvs/eliot/game/rack.h?cvsroot=eliot&r1=1.12&r2=1.13
http://cvs.savannah.gnu.org/viewcvs/eliot/game/results.h?cvsroot=eliot&r1=1.14&r2=1.15
http://cvs.savannah.gnu.org/viewcvs/eliot/game/round.h?cvsroot=eliot&r1=1.15&r2=1.16
http://cvs.savannah.gnu.org/viewcvs/eliot/game/settings.h?cvsroot=eliot&r1=1.5&r2=1.6
http://cvs.savannah.gnu.org/viewcvs/eliot/game/training.cpp?cvsroot=eliot&r1=1.34&r2=1.35
http://cvs.savannah.gnu.org/viewcvs/eliot/game/training.h?cvsroot=eliot&r1=1.25&r2=1.26
http://cvs.savannah.gnu.org/viewcvs/eliot/game/turn.h?cvsroot=eliot&r1=1.12&r2=1.13
http://cvs.savannah.gnu.org/viewcvs/eliot/game/turn_cmd.h?cvsroot=eliot&r1=1.4&r2=1.5
http://cvs.savannah.gnu.org/viewcvs/eliot/game/mark_played_cmd.cpp?cvsroot=eliot&rev=1.1
http://cvs.savannah.gnu.org/viewcvs/eliot/game/mark_played_cmd.h?cvsroot=eliot&rev=1.1
http://cvs.savannah.gnu.org/viewcvs/eliot/game/xml_reader.cpp?cvsroot=eliot&rev=1.1
http://cvs.savannah.gnu.org/viewcvs/eliot/game/xml_reader.h?cvsroot=eliot&rev=1.1
http://cvs.savannah.gnu.org/viewcvs/eliot/game/xml_writer.cpp?cvsroot=eliot&rev=1.1
http://cvs.savannah.gnu.org/viewcvs/eliot/game/xml_writer.h?cvsroot=eliot&rev=1.1
http://cvs.savannah.gnu.org/viewcvs/eliot/qt/Makefile.am?cvsroot=eliot&r1=1.10&r2=1.11
http://cvs.savannah.gnu.org/viewcvs/eliot/qt/main_window.cpp?cvsroot=eliot&r1=1.32&r2=1.33
http://cvs.savannah.gnu.org/viewcvs/eliot/qt/new_game.cpp?cvsroot=eliot&r1=1.7&r2=1.8
http://cvs.savannah.gnu.org/viewcvs/eliot/test/driver?cvsroot=eliot&r1=1.14&r2=1.15
http://cvs.savannah.gnu.org/viewcvs/eliot/test/duplicate_1_player.ref?cvsroot=eliot&r1=1.2&r2=1.3
http://cvs.savannah.gnu.org/viewcvs/eliot/test/duplicate_2_ai.ref?cvsroot=eliot&r1=1.8&r2=1.9
http://cvs.savannah.gnu.org/viewcvs/eliot/test/duplicate_explosive_variant.ref?cvsroot=eliot&r1=1.3&r2=1.4
http://cvs.savannah.gnu.org/viewcvs/eliot/test/duplicate_humans_ai.ref?cvsroot=eliot&r1=1.7&r2=1.8
http://cvs.savannah.gnu.org/viewcvs/eliot/test/duplicate_invalid_turn.ref?cvsroot=eliot&r1=1.3&r2=1.4
http://cvs.savannah.gnu.org/viewcvs/eliot/test/duplicate_joker_variant.ref?cvsroot=eliot&r1=1.2&r2=1.3
http://cvs.savannah.gnu.org/viewcvs/eliot/test/duplicate_navigation.ref?cvsroot=eliot&r1=1.2&r2=1.3
http://cvs.savannah.gnu.org/viewcvs/eliot/test/duplicate_no_point.ref?cvsroot=eliot&r1=1.2&r2=1.3
http://cvs.savannah.gnu.org/viewcvs/eliot/test/freegame_3_ai.ref?cvsroot=eliot&r1=1.7&r2=1.8
http://cvs.savannah.gnu.org/viewcvs/eliot/test/freegame_change.ref?cvsroot=eliot&r1=1.4&r2=1.5
http://cvs.savannah.gnu.org/viewcvs/eliot/test/freegame_explosive_variant.ref?cvsroot=eliot&r1=1.3&r2=1.4
http://cvs.savannah.gnu.org/viewcvs/eliot/test/freegame_joker_variant.ref?cvsroot=eliot&r1=1.2&r2=1.3
http://cvs.savannah.gnu.org/viewcvs/eliot/test/freegame_navigation.ref?cvsroot=eliot&r1=1.2&r2=1.3
http://cvs.savannah.gnu.org/viewcvs/eliot/test/freegame_passing.ref?cvsroot=eliot&r1=1.8&r2=1.9
http://cvs.savannah.gnu.org/viewcvs/eliot/test/freegame_play.ref?cvsroot=eliot&r1=1.3&r2=1.4
http://cvs.savannah.gnu.org/viewcvs/eliot/test/load_game.ref?cvsroot=eliot&r1=1.4&r2=1.5
http://cvs.savannah.gnu.org/viewcvs/eliot/test/load_saved_game.ref?cvsroot=eliot&r1=1.7&r2=1.8
http://cvs.savannah.gnu.org/viewcvs/eliot/test/training_joker.input?cvsroot=eliot&r1=1.1&r2=1.2
http://cvs.savannah.gnu.org/viewcvs/eliot/test/training_joker.ref?cvsroot=eliot&r1=1.3&r2=1.4
http://cvs.savannah.gnu.org/viewcvs/eliot/test/training_joker_variant.ref?cvsroot=eliot&r1=1.2&r2=1.3
http://cvs.savannah.gnu.org/viewcvs/eliot/test/training_navigation.ref?cvsroot=eliot&r1=1.2&r2=1.3
http://cvs.savannah.gnu.org/viewcvs/eliot/test/training_rosace.input?cvsroot=eliot&r1=1.4&r2=1.5
http://cvs.savannah.gnu.org/viewcvs/eliot/test/training_rosace.ref?cvsroot=eliot&r1=1.8&r2=1.9
http://cvs.savannah.gnu.org/viewcvs/eliot/test/rosace?cvsroot=eliot&r1=1.1&r2=0
http://cvs.savannah.gnu.org/viewcvs/eliot/test/training_joker2.input?cvsroot=eliot&r1=1.3&r2=0
http://cvs.savannah.gnu.org/viewcvs/eliot/test/training_joker2.ref?cvsroot=eliot&r1=1.9&r2=0
http://cvs.savannah.gnu.org/viewcvs/eliot/utils/Makefile.am?cvsroot=eliot&r1=1.12&r2=1.13
http://cvs.savannah.gnu.org/viewcvs/eliot/utils/eliottxt.cpp?cvsroot=eliot&r1=1.39&r2=1.40
http://cvs.savannah.gnu.org/viewcvs/eliot/utils/game_io.cpp?cvsroot=eliot&r1=1.19&r2=1.20
http://cvs.savannah.gnu.org/viewcvs/eliot/utils/game_io.h?cvsroot=eliot&r1=1.6&r2=1.7
http://cvs.savannah.gnu.org/viewcvs/eliot/utils/ncurses.cpp?cvsroot=eliot&r1=1.33&r2=1.34
http://cvs.savannah.gnu.org/viewcvs/eliot/utils/ncurses.h?cvsroot=eliot&r1=1.8&r2=1.9

Patches:
Index: TODO
===================================================================
RCS file: /cvsroot/eliot/eliot/TODO,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -b -r1.9 -r1.10
--- TODO        22 Feb 2009 16:43:55 -0000      1.9
+++ TODO        29 Nov 2009 16:01:31 -0000      1.10
@@ -2,10 +2,6 @@
 ====
 
  - Improve error handling (use exceptions more)
- - Correct game save/load functions: Advanced format
-   file saving for freegames and duplicate need a serious
-   rewrite. We need to specify a file format that can handle
-   all the information contained in a multiplayer game.
  - getopt support for all the interfaces (only ncurses is done)?
  - detection of blocked positions?
  - distinguish misplaced and incorrect words?
@@ -13,10 +9,10 @@
 Requested by users
 ==================
 
- - Save/load games (03/02/09)
  - Drag & drop? (03/02/09)
  - Continue a real game on Eliot (03/02/09)
  - In duplicate mode, display the rack in the External board (19/02/09)
+ - Tiles on the rack more similar to the ones on the board 
(http://www.prise2tete.fr/forum/viewtopic.php?id=4956)
 
 Implementation details
 ======================
@@ -25,8 +21,6 @@
  - board.h included in coord.cpp!
  - use Boost.Format?
  - compile with -ansi -pedantic by default?
- - use Boost.Unorderedinstead of the custom hash map, when Boost 1.36
-   is in Ubuntu
 
 Not so urgent
 =============

Index: configure.in
===================================================================
RCS file: /cvsroot/eliot/eliot/configure.in,v
retrieving revision 1.38
retrieving revision 1.39
diff -u -b -r1.38 -r1.39
--- configure.in        28 Sep 2009 18:21:28 -0000      1.38
+++ configure.in        29 Nov 2009 16:01:31 -0000      1.39
@@ -113,6 +113,13 @@
                    AC_DEFINE(HAVE_LIBCONFIG, 1, [Define to 1 if you have the 
libconfig library])],
                   [has_libconfig=0])
 
+dnl Check for arabica and libxml2
+PKG_CHECK_MODULES(ARABICA, [arabica], [],
+                  [AC_MSG_ERROR([Could not find Arabica on your system (using 
pkg-config)])])
+
+PKG_CHECK_MODULES(LIBXML2, [libxml-2.0], [],
+                  [AC_MSG_ERROR([Could not find libxml2 on your system (using 
pkg-config)])])
+
 dnl Check for ncurses
 dnl We enable it if asked by the user, or if ncursesw is found
 AC_ARG_ENABLE([ncurses],AC_HELP_STRING([--enable-ncurses],

Index: dic/automaton.h
===================================================================
RCS file: /cvsroot/eliot/eliot/dic/automaton.h,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -b -r1.14 -r1.15
--- dic/automaton.h     27 Jul 2008 15:28:50 -0000      1.14
+++ dic/automaton.h     29 Nov 2009 16:01:31 -0000      1.15
@@ -18,8 +18,8 @@
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  *****************************************************************************/
 
-#ifndef _DIC_AUTOMATON_H_
-#define _DIC_AUTOMATON_H_
+#ifndef DIC_AUTOMATON_H_
+#define DIC_AUTOMATON_H_
 
 class AutomatonHelper;
 struct searchRegExpLists;

Index: dic/dic.h
===================================================================
RCS file: /cvsroot/eliot/eliot/dic/dic.h,v
retrieving revision 1.26
retrieving revision 1.27
diff -u -b -r1.26 -r1.27
--- dic/dic.h   21 Sep 2009 20:10:34 -0000      1.26
+++ dic/dic.h   29 Nov 2009 16:01:31 -0000      1.27
@@ -19,9 +19,10 @@
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  *****************************************************************************/
 
-#ifndef _DIC_H_
-#define _DIC_H_
+#ifndef DIC_H_
+#define DIC_H_
 
+#include <stdint.h>
 #include <string>
 #include <vector>
 #include <map>

Index: dic/dic_exception.h
===================================================================
RCS file: /cvsroot/eliot/eliot/dic/dic_exception.h,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -b -r1.3 -r1.4
--- dic/dic_exception.h 31 Aug 2008 11:48:13 -0000      1.3
+++ dic/dic_exception.h 29 Nov 2009 16:01:31 -0000      1.4
@@ -18,8 +18,8 @@
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  *****************************************************************************/
 
-#ifndef _DIC_EXCEPTION_H_
-#define _DIC_EXCEPTION_H_
+#ifndef DIC_EXCEPTION_H_
+#define DIC_EXCEPTION_H_
 
 #include <exception>
 #include <string>

Index: dic/dic_internals.h
===================================================================
RCS file: /cvsroot/eliot/eliot/dic/dic_internals.h,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -b -r1.11 -r1.12
--- dic/dic_internals.h 22 Nov 2008 13:11:48 -0000      1.11
+++ dic/dic_internals.h 29 Nov 2009 16:01:31 -0000      1.12
@@ -18,8 +18,8 @@
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  *****************************************************************************/
 
-#ifndef _DIC_INTERNALS_H_
-#define _DIC_INTERNALS_H_
+#ifndef DIC_INTERNALS_H_
+#define DIC_INTERNALS_H_
 
 #include <stdint.h>
 #include "config.h"

Index: dic/encoding.cpp
===================================================================
RCS file: /cvsroot/eliot/eliot/dic/encoding.cpp,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -b -r1.11 -r1.12
--- dic/encoding.cpp    23 Oct 2009 20:01:49 -0000      1.11
+++ dic/encoding.cpp    29 Nov 2009 16:01:31 -0000      1.12
@@ -223,10 +223,12 @@
         if (n == -1)
         {
             ostringstream ss;
-            ss << "truncAndConvert: non printable character: " << iWstr[pos];
             // XXX: Should we throw an exception instead? Just ignore the 
problem?
+#if 0
+            ss << "truncAndConvert: non printable character: " << iWstr[pos];
             cerr << ss.str() << endl;;
             //throw DicException(ss.str());
+#endif
             return convertToMb(iWstr);
         }
         if (width + n > iMaxWidth)
@@ -249,10 +251,12 @@
         if (n == -1)
         {
             ostringstream ss;
-            ss << "truncAndConvert: non printable character: " << wstr[pos];
             // XXX: Should we throw an exception instead? Just ignore the 
problem?
+#if 0
+            ss << "truncAndConvert: non printable character: " << wstr[pos];
             cerr << ss.str() << endl;;
             //throw DicException(ss.str());
+#endif
             return convertToMb(wstr);
         }
         if (width + n > iWidth)
@@ -277,10 +281,12 @@
         if (n == -1)
         {
             ostringstream ss;
-            ss << "padAndConvert: non printable character: " << iWstr[i];
             // XXX: Should we throw an exception instead? Just ignore the 
problem?
+#if 0
+            ss << "padAndConvert: non printable character: " << iWstr[i];
             cerr << ss.str() << endl;;
             //throw DicException(ss.str());
+#endif
             return convertToMb(iWstr);
         }
         width += n;
@@ -309,10 +315,12 @@
         if (n == -1)
         {
             ostringstream ss;
-            ss << "padAndConvert: non printable character: " << iWstr[i];
             // XXX: Should we throw an exception instead? Just ignore the 
problem?
+#if 0
+            ss << "padAndConvert: non printable character: " << iWstr[i];
             cerr << ss.str() << endl;;
             //throw DicException(ss.str());
+#endif
             return convertToMb(iWstr);
         }
         width += n;
@@ -441,3 +449,27 @@
 #endif
 }
 
+
+string writeInUTF8(const wstring &iWString, const string &iContext)
+{
+    // Temporary buffer for output
+    // Each character will take at most 4 bytes in the UTF-8 string
+    unsigned int bufSize = iWString.size() * 4;
+    char *buf = new char[bufSize];
+    unsigned int number;
+    try
+    {
+        number = writeInUTF8(iWString, buf, bufSize, iContext);
+    }
+    catch (...)
+    {
+        // Make sure not to leak
+        delete[] buf;
+        throw;
+    }
+    // Copy the string
+    string res(buf, number);
+    delete[] buf;
+    return res;
+}
+

Index: dic/encoding.h
===================================================================
RCS file: /cvsroot/eliot/eliot/dic/encoding.h,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -b -r1.4 -r1.5
--- dic/encoding.h      23 Jun 2009 21:36:33 -0000      1.4
+++ dic/encoding.h      29 Nov 2009 16:01:31 -0000      1.5
@@ -18,8 +18,8 @@
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  *****************************************************************************/
 
-#ifndef _ENCODING_H_
-#define _ENCODING_H_
+#ifndef ENCODING_H_
+#define ENCODING_H_
 
 #include <string>
 
@@ -120,5 +120,15 @@
 unsigned int writeInUTF8(const wstring &iWString, char *oBuffer,
                          unsigned int iBufSize, const string &iContext);
 
+/**
+ * Same as the other writeInUTF8 function, dealing with a string
+ * instead of a char*. Note that it performs an additional copy
+ * of the output string...
+ * @param iWString: the wide string to encode
+ * @param iContext: free text used in case of exception
+ * @return: the converted string
+ */
+string writeInUTF8(const wstring &iWString, const string &iContext);
+
 #endif
 

Index: dic/grammar.cpp
===================================================================
RCS file: /cvsroot/eliot/eliot/dic/grammar.cpp,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -b -r1.6 -r1.7
--- dic/grammar.cpp     22 Nov 2008 13:11:48 -0000      1.6
+++ dic/grammar.cpp     29 Nov 2009 16:01:31 -0000      1.7
@@ -20,11 +20,11 @@
 
 #include <string>
 #include <stack>
-#include <boost/spirit/core.hpp>
-#include <boost/spirit/utility/chset.hpp>
-#include <boost/spirit/tree/ast.hpp>
+#include <boost/spirit/include/classic_core.hpp>
+#include <boost/spirit/include/classic_chset.hpp>
+#include <boost/spirit/include/classic_ast.hpp>
 #ifdef DEBUG_RE
-#include <boost/spirit/tree/tree_to_xml.hpp>
+#include <boost/spirit/include/classic_tree_to_xml.hpp>
 #include <map>
 #include <iostream>
 #endif
@@ -33,7 +33,7 @@
 #include "header.h"
 #include "regexp.h"
 
-using namespace boost::spirit;
+using namespace boost::spirit::classic;
 using namespace std;
 
 // A few typedefs to simplify things

Index: dic/grammar.h
===================================================================
RCS file: /cvsroot/eliot/eliot/dic/grammar.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -b -r1.2 -r1.3
--- dic/grammar.h       27 Jul 2008 15:28:51 -0000      1.2
+++ dic/grammar.h       29 Nov 2009 16:01:31 -0000      1.3
@@ -18,8 +18,8 @@
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  *****************************************************************************/
 
-#ifndef _GRAMMAR_H_
-#define _GRAMMAR_H_
+#ifndef GRAMMAR_H_
+#define GRAMMAR_H_
 
 class Dictionary;
 class Node;

Index: dic/header.cpp
===================================================================
RCS file: /cvsroot/eliot/eliot/dic/header.cpp,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -b -r1.14 -r1.15
--- dic/header.cpp      3 Jul 2009 21:40:15 -0000       1.14
+++ dic/header.cpp      29 Nov 2009 16:01:31 -0000      1.15
@@ -21,6 +21,7 @@
 #include "config.h"
 
 #include <cstring> // for strcpy
+#include <cstdio> // for snprintf
 #include <string>
 #include <sstream>
 #include <iostream>

Index: dic/header.h
===================================================================
RCS file: /cvsroot/eliot/eliot/dic/header.h,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -b -r1.11 -r1.12
--- dic/header.h        3 Jul 2009 21:40:15 -0000       1.11
+++ dic/header.h        29 Nov 2009 16:01:31 -0000      1.12
@@ -18,13 +18,14 @@
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  *****************************************************************************/
 
-#ifndef _HEADER_H
-#define _HEADER_H
+#ifndef HEADER_H_
+#define HEADER_H_
 
 #include <iosfwd>
 #include <map>
 #include <vector>
 #include <time.h>
+#include <stdint.h>
 
 using namespace std;
 

Index: dic/regexp.h
===================================================================
RCS file: /cvsroot/eliot/eliot/dic/regexp.h,v
retrieving revision 1.19
retrieving revision 1.20
diff -u -b -r1.19 -r1.20
--- dic/regexp.h        22 Nov 2008 13:09:29 -0000      1.19
+++ dic/regexp.h        29 Nov 2009 16:01:31 -0000      1.20
@@ -18,8 +18,8 @@
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  *****************************************************************************/
 
-#ifndef _REGEXP_H_
-#define _REGEXP_H_
+#ifndef REGEXP_H_
+#define REGEXP_H_
 
 #include <string>
 

Index: dic/tile.h
===================================================================
RCS file: /cvsroot/eliot/eliot/dic/tile.h,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -b -r1.6 -r1.7
--- dic/tile.h  28 Jun 2009 11:48:17 -0000      1.6
+++ dic/tile.h  29 Nov 2009 16:01:31 -0000      1.7
@@ -19,8 +19,8 @@
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  *****************************************************************************/
 
-#ifndef _TILE_H_
-#define _TILE_H_
+#ifndef TILE_H_
+#define TILE_H_
 
 #include <list>
 #include <vector>

Index: extras/contrib/Makefile
===================================================================
RCS file: /cvsroot/eliot/eliot/extras/contrib/Makefile,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -b -r1.6 -r1.7
--- extras/contrib/Makefile     26 Sep 2009 08:15:31 -0000      1.6
+++ extras/contrib/Makefile     29 Nov 2009 16:01:32 -0000      1.7
@@ -2,6 +2,9 @@
 LIBCONFIG_VERSION = 1.3.2
 BOOST_VERSION = 1_39_0
 QT_VERSION = 4.5.3
+LIBXML2_VERSION = 2.7.5
+ARABICA_VERSION = 2009-march
+
 
 PREFIX = $(shell pwd)/inst
 WGET = wget -c
@@ -29,7 +32,7 @@
 ICONV_ARCHIVE = libiconv-$(ICONV_VERSION).tar.gz
 
 $(ICONV_ARCHIVE): $(PREFIX)
-       $(WGET) http://ftp.gnu.org/pub/gnu/libiconv/$(ICONV_ARCHIVE)
+       $(WGET) http://ftp.gnu.org/pub/gnu/libiconv/$@
 
 $(ICONV_DIR): $(ICONV_ARCHIVE)
        tar xzf $<
@@ -45,7 +48,7 @@
 LIBCONFIG_ARCHIVE = libconfig-$(LIBCONFIG_VERSION).tar.gz
 
 $(LIBCONFIG_ARCHIVE): $(PREFIX)
-       $(WGET) http://www.hyperrealm.com/libconfig/$(LIBCONFIG_ARCHIVE)
+       $(WGET) http://www.hyperrealm.com/libconfig/$@
 
 $(LIBCONFIG_DIR): $(LIBCONFIG_ARCHIVE)
        tar xvf $<
@@ -61,7 +64,7 @@
 BOOST_ARCHIVE = boost_$(BOOST_VERSION).tar.bz2
 
 $(BOOST_ARCHIVE): $(PREFIX)
-       $(WGET) 
http://garr.dl.sourceforge.net/sourceforge/boost/$(BOOST_ARCHIVE)
+       $(WGET) http://garr.dl.sourceforge.net/sourceforge/boost/$@
 
 $(BOOST_DIR): $(BOOST_ARCHIVE)
        tar xjf $<
@@ -81,7 +84,7 @@
 QT_DIR = qt4-$(QT_VERSION)-win32-bin
 
 $(QT_ARCHIVE): $(PREFIX)
-       $(WGET) 
http://dl.sv.nongnu.org/releases-noredirect/eliot/other/$(QT_ARCHIVE)
+       $(WGET) http://dl.sv.nongnu.org/releases-noredirect/eliot/other/$@
 
 $(QT_DIR): $(QT_ARCHIVE)
        tar xjf $<
@@ -91,3 +94,37 @@
        (cd $<; cp -r bin include lib share $(PREFIX); sed 
's,@@PREFIX@@,$(PREFIX),' $(PREFIX)/lib/pkgconfig/QtCore.pc.in > 
$(PREFIX)/lib/pkgconfig/QtCore.pc; sed 's,@@PREFIX@@,$(PREFIX),' 
lib/pkgconfig/QtGui.pc.in > $(PREFIX)/lib/pkgconfig/QtGui.pc; rm 
$(PREFIX)/lib/pkgconfig/*.in)
        touch $@
 
+
+### LibXML 2 ###
+
+LIBXML2_DIR = libxml2-$(LIBXML2_VERSION)
+LIBXML2_ARCHIVE = libxml2-$(LIBXML2_VERSION).tar.gz
+
+$(LIBXML2_ARCHIVE): $(PREFIX)
+       $(WGET) ftp://xmlsoft.org/libxml2/$@
+
+$(LIBXML2_DIR): $(LIBXML2_ARCHIVE)
+       tar xzf $<
+
+# TODO: add more --without-xxx flags (apparently needed for build: pattern, 
debug)
+# --with-legacy and --with-html are needed for arabica
+.libxml2: $(LIBXML2_DIR)
+       (cd $< && $(CONFIGURE) --enable-static --disable-shared --with-legacy 
--without-schematron --without-tree --without-zlib --without-http --without-ftp 
--without-html --without-python --without-docbook --without-regexps && make 
install)
+       touch $@
+
+
+### Arabica ###
+
+ARABICA_DIR = arabica-$(ARABICA_VERSION)
+ARABICA_ARCHIVE = arabica-$(ARABICA_VERSION).tar.bz2
+
+$(ARABICA_ARCHIVE): $(PREFIX)
+       $(WGET) 
http://downloads.sourceforge.net/project/arabica/arabica/March-09/address@hidden
+
+$(ARABICA_DIR): $(ARABICA_ARCHIVE)
+       tar xjf $<
+
+.arabica: $(ARABICA_DIR)
+       (cd $< && patch -p0 < ../arabica-no-example.patch && $(CONFIGURE) 
--enable-static --disable-shared --with-parser=libxml2 --with-libxml2=$(PREFIX) 
--with-boost=$(PREFIX) --with-tests=no --with-dom=no && make install)
+       touch $@
+

Index: game/Makefile.am
===================================================================
RCS file: /cvsroot/eliot/eliot/game/Makefile.am,v
retrieving revision 1.25
retrieving revision 1.26
diff -u -b -r1.25 -r1.26
--- game/Makefile.am    19 Feb 2009 18:25:17 -0000      1.25
+++ game/Makefile.am    29 Nov 2009 16:01:32 -0000      1.26
@@ -19,7 +19,7 @@
 
 noinst_LIBRARIES = libgame.a
 
-AM_CPPFLAGS = -I$(top_srcdir)/dic -I../intl -I$(top_srcdir)/intl 
@LIBCONFIG_CFLAGS@
+AM_CPPFLAGS = -I$(top_srcdir)/dic -I../intl -I$(top_srcdir)/intl 
@LIBCONFIG_CFLAGS@ @ARABICA_CFLAGS@ @LIBXML2_CFLAGS@
 
 libgame_a_SOURCES= \
     game_exception.cpp game_exception.h \
@@ -50,10 +50,13 @@
     game_move_cmd.h game_move_cmd.cpp \
     turn_cmd.cpp turn_cmd.h \
     duplicate.cpp duplicate.h \
+    mark_played_cmd.h mark_played_cmd.cpp \
     freegame.cpp freegame.h \
     training.cpp training.h \
     public_game.cpp public_game.h \
     game_factory.cpp game_factory.h \
     game_io.cpp \
+    xml_writer.cpp xml_writer.h \
+    xml_reader.cpp xml_reader.h \
     debug.h
 

Index: game/ai_percent.cpp
===================================================================
RCS file: /cvsroot/eliot/eliot/game/ai_percent.cpp,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -b -r1.13 -r1.14
--- game/ai_percent.cpp 24 Jan 2009 17:44:56 -0000      1.13
+++ game/ai_percent.cpp 29 Nov 2009 16:01:32 -0000      1.14
@@ -35,6 +35,8 @@
     if (iPercent > 1)
         iPercent = 1;
 
+    m_percent = iPercent;
+
     // Use BestResults to be slightly faster when the percentage is 100%
     if (iPercent == 1)
         m_results = new BestResults;

Index: game/ai_percent.h
===================================================================
RCS file: /cvsroot/eliot/eliot/game/ai_percent.h,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -b -r1.12 -r1.13
--- game/ai_percent.h   24 Jan 2009 17:44:56 -0000      1.12
+++ game/ai_percent.h   29 Nov 2009 16:01:32 -0000      1.13
@@ -18,8 +18,8 @@
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  *****************************************************************************/
 
-#ifndef _AI_PERCENT_H_
-#define _AI_PERCENT_H_
+#ifndef AI_PERCENT_H_
+#define AI_PERCENT_H_
 
 #include "ai_player.h"
 #include "results.h"
@@ -42,6 +42,8 @@
     AIPercent(float iPercent);
     virtual ~AIPercent();
 
+    float getPercent() const { return m_percent; }
+
     /**
      * This method does the actual computation. It will be called before any
      * of the following methods, so it must prepare everything for them.
@@ -52,6 +54,7 @@
     virtual Move getMove() const;
 
 private:
+    float m_percent;
     /// Container for all the found solutions
     Results *m_results;
 };

Index: game/ai_player.h
===================================================================
RCS file: /cvsroot/eliot/eliot/game/ai_player.h,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -b -r1.11 -r1.12
--- game/ai_player.h    22 Nov 2008 14:40:26 -0000      1.11
+++ game/ai_player.h    29 Nov 2009 16:01:32 -0000      1.12
@@ -18,8 +18,8 @@
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  *****************************************************************************/
 
-#ifndef _AI_PLAYER_H_
-#define _AI_PLAYER_H_
+#ifndef AI_PLAYER_H_
+#define AI_PLAYER_H_
 
 #include "player.h"
 

Index: game/bag.cpp
===================================================================
RCS file: /cvsroot/eliot/eliot/game/bag.cpp,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -b -r1.12 -r1.13
--- game/bag.cpp        23 Jun 2009 12:41:53 -0000      1.12
+++ game/bag.cpp        29 Nov 2009 16:01:32 -0000      1.13
@@ -22,6 +22,7 @@
 #include <boost/foreach.hpp>
 
 #include <string>
+#include <cstdio>
 #include <cstdlib> // For rand()
 
 #include <dic.h>

Index: game/bag.h
===================================================================
RCS file: /cvsroot/eliot/eliot/game/bag.h,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -b -r1.12 -r1.13
--- game/bag.h  22 Nov 2008 13:09:29 -0000      1.12
+++ game/bag.h  29 Nov 2009 16:01:32 -0000      1.13
@@ -19,8 +19,8 @@
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  *****************************************************************************/
 
-#ifndef _BAG_H_
-#define _BAG_H_
+#ifndef BAG_H_
+#define BAG_H_
 
 #include <map>
 #include "tile.h"

Index: game/board.cpp
===================================================================
RCS file: /cvsroot/eliot/eliot/game/board.cpp,v
retrieving revision 1.25
retrieving revision 1.26
diff -u -b -r1.25 -r1.26
--- game/board.cpp      23 Jun 2009 13:21:19 -0000      1.25
+++ game/board.cpp      29 Nov 2009 16:01:32 -0000      1.26
@@ -21,6 +21,7 @@
 
 #include <wctype.h>
 #include <algorithm>
+#include <cstdio>
 
 #include "dic.h"
 

Index: game/board.h
===================================================================
RCS file: /cvsroot/eliot/eliot/game/board.h,v
retrieving revision 1.20
retrieving revision 1.21
diff -u -b -r1.20 -r1.21
--- game/board.h        23 Jun 2009 13:21:19 -0000      1.20
+++ game/board.h        29 Nov 2009 16:01:32 -0000      1.21
@@ -19,8 +19,8 @@
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  *****************************************************************************/
 
-#ifndef _BOARD_H_
-#define _BOARD_H_
+#ifndef BOARD_H_
+#define BOARD_H_
 
 #include <string>
 

Index: game/board_search.h
===================================================================
RCS file: /cvsroot/eliot/eliot/game/board_search.h,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -b -r1.1 -r1.2
--- game/board_search.h 17 Jan 2009 14:57:32 -0000      1.1
+++ game/board_search.h 29 Nov 2009 16:01:32 -0000      1.2
@@ -18,8 +18,8 @@
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  *****************************************************************************/
 
-#ifndef _BOARD_SEARCH_H_
-#define _BOARD_SEARCH_H_
+#ifndef BOARD_SEARCH_H_
+#define BOARD_SEARCH_H_
 
 #include "coord.h"
 #include "matrix.h"

Index: game/command.h
===================================================================
RCS file: /cvsroot/eliot/eliot/game/command.h,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -b -r1.3 -r1.4
--- game/command.h      30 Nov 2008 20:55:46 -0000      1.3
+++ game/command.h      29 Nov 2009 16:01:32 -0000      1.4
@@ -18,8 +18,8 @@
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  *****************************************************************************/
 
-#ifndef _COMMAND_H
-#define _COMMAND_H
+#ifndef COMMAND_H_
+#define COMMAND_H_
 
 #include <string>
 

Index: game/coord.cpp
===================================================================
RCS file: /cvsroot/eliot/eliot/game/coord.cpp,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -b -r1.12 -r1.13
--- game/coord.cpp      19 Feb 2009 18:25:17 -0000      1.12
+++ game/coord.cpp      29 Nov 2009 16:01:32 -0000      1.13
@@ -20,6 +20,7 @@
  *****************************************************************************/
 
 #include <string>
+#include <cstdio>
 #include <wchar.h>
 #include "coord.h"
 #include "board.h" // for BOARD_MIN and BOARD_MAX (TODO: remove this include)

Index: game/coord.h
===================================================================
RCS file: /cvsroot/eliot/eliot/game/coord.h,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -b -r1.10 -r1.11
--- game/coord.h        19 Feb 2009 18:25:17 -0000      1.10
+++ game/coord.h        29 Nov 2009 16:01:32 -0000      1.11
@@ -19,8 +19,8 @@
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  *****************************************************************************/
 
-#ifndef _COORD_H
-#define _COORD_H
+#ifndef COORD_H_
+#define COORD_H_
 
 #include <string>
 

Index: game/cross.cpp
===================================================================
RCS file: /cvsroot/eliot/eliot/game/cross.cpp,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -b -r1.11 -r1.12
--- game/cross.cpp      22 Nov 2008 13:09:30 -0000      1.11
+++ game/cross.cpp      29 Nov 2009 16:01:32 -0000      1.12
@@ -20,6 +20,7 @@
  *****************************************************************************/
 
 #include <string>
+#include <cstdio>
 #include "cross.h"
 
 #define CROSS_MASK 0xFFFFFFFF

Index: game/cross.h
===================================================================
RCS file: /cvsroot/eliot/eliot/game/cross.h,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -b -r1.11 -r1.12
--- game/cross.h        28 Jun 2009 10:55:24 -0000      1.11
+++ game/cross.h        29 Nov 2009 16:01:32 -0000      1.12
@@ -19,8 +19,8 @@
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  *****************************************************************************/
 
-#ifndef _CROSS_H_
-#define _CROSS_H_
+#ifndef CROSS_H_
+#define CROSS_H_
 
 #include <set>
 #include "tile.h"

Index: game/debug.h
===================================================================
RCS file: /cvsroot/eliot/eliot/game/debug.h,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -b -r1.15 -r1.16
--- game/debug.h        23 Nov 2008 16:55:28 -0000      1.15
+++ game/debug.h        29 Nov 2009 16:01:32 -0000      1.16
@@ -19,8 +19,8 @@
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  *****************************************************************************/
 
-#ifndef _DEBUG_H_
-#define _DEBUG_H_
+#ifndef DEBUG_H_
+#define DEBUG_H_
 
 /**********
  * General

Index: game/duplicate.cpp
===================================================================
RCS file: /cvsroot/eliot/eliot/game/duplicate.cpp,v
retrieving revision 1.32
retrieving revision 1.33
diff -u -b -r1.32 -r1.33
--- game/duplicate.cpp  3 Jul 2009 21:40:15 -0000       1.32
+++ game/duplicate.cpp  29 Nov 2009 16:01:32 -0000      1.33
@@ -42,6 +42,7 @@
 #include "player_move_cmd.h"
 #include "player_rack_cmd.h"
 #include "game_move_cmd.h"
+#include "mark_played_cmd.h"
 #include "ai_player.h"
 #include "settings.h"
 #include "debug.h"
@@ -254,9 +255,7 @@
     }
 
     // Play the best word on the board
-    Command *pCmd = new GameMoveCmd(*this, bestMove,
-                                    bestPlayer->getLastRack(),
-                                    bestPlayer->getId());
+    Command *pCmd = new GameMoveCmd(*this, bestMove, bestPlayer->getId());
     accessNavigation().addAndExecute(pCmd);
 
     // Leave the same reliquate to all players
@@ -315,35 +314,3 @@
     m_hasPlayed[iPlayerId] = iNewFlag;
 }
 
-
-Duplicate::MarkPlayedCmd::MarkPlayedCmd(Duplicate &ioDuplicate,
-                             unsigned int iPlayerId,
-                             bool iPlayedFlag)
-    : m_duplicateGame(ioDuplicate), m_playerId(iPlayerId),
-      m_newPlayedFlag(iPlayedFlag)
-{
-}
-
-
-void Duplicate::MarkPlayedCmd::doExecute()
-{
-    m_oldPlayedFlag = m_duplicateGame.hasPlayed(m_playerId);
-    m_duplicateGame.setPlayedFlag(m_playerId, m_newPlayedFlag);
-}
-
-
-void Duplicate::MarkPlayedCmd::doUndo()
-{
-    m_duplicateGame.setPlayedFlag(m_playerId, m_oldPlayedFlag);
-}
-
-
-wstring Duplicate::MarkPlayedCmd::toString() const
-{
-    wostringstream oss;
-    oss << L"MarkPlayedCmd (player " << m_playerId
-        << L" marked " << m_newPlayedFlag << L")";
-    return oss.str();
-}
-
-

Index: game/duplicate.h
===================================================================
RCS file: /cvsroot/eliot/eliot/game/duplicate.h,v
retrieving revision 1.22
retrieving revision 1.23
diff -u -b -r1.22 -r1.23
--- game/duplicate.h    24 Jan 2009 17:44:56 -0000      1.22
+++ game/duplicate.h    29 Nov 2009 16:01:32 -0000      1.23
@@ -18,8 +18,8 @@
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  *****************************************************************************/
 
-#ifndef _DUPLICATE_H_
-#define _DUPLICATE_H_
+#ifndef DUPLICATE_H_
+#define DUPLICATE_H_
 
 #include "game.h"
 #include "command.h"
@@ -54,6 +54,7 @@
 class Duplicate: public Game
 {
     friend class GameFactory;
+    friend class MarkPlayedCmd;
 public:
     virtual GameMode getMode() const { return kDUPLICATE; }
     virtual string getModeAsString() const { return "Duplicate"; }
@@ -132,27 +133,6 @@
 
     /// m_hasPlayed[p] is true iff player p has played for this turn
     map<unsigned int, bool> m_hasPlayed;
-
-    /// Command used internally to change the "has played" flag of a player
-    class MarkPlayedCmd: public Command
-    {
-        public:
-            MarkPlayedCmd(Duplicate &ioDuplicate,
-                          unsigned int iPlayerId,
-                          bool iPlayedFlag);
-
-            virtual wstring toString() const;
-
-        protected:
-            virtual void doExecute();
-            virtual void doUndo();
-
-        private:
-            Duplicate &m_duplicateGame;
-            unsigned int m_playerId;
-            bool m_newPlayedFlag;
-            bool m_oldPlayedFlag;
-    };
 };
 
 #endif /* _DUPLICATE_H_ */

Index: game/freegame.cpp
===================================================================
RCS file: /cvsroot/eliot/eliot/game/freegame.cpp,v
retrieving revision 1.32
retrieving revision 1.33
diff -u -b -r1.32 -r1.33
--- game/freegame.cpp   3 Jul 2009 21:40:15 -0000       1.32
+++ game/freegame.cpp   29 Nov 2009 16:01:32 -0000      1.33
@@ -148,9 +148,7 @@
 {
     const Move &move = getCurrentPlayer().getLastMove();
     // Update the game
-    Command *pCmd = new GameMoveCmd(*this, move,
-                                    getCurrentPlayer().getLastRack(),
-                                    m_currPlayer);
+    Command *pCmd = new GameMoveCmd(*this, move, m_currPlayer);
     accessNavigation().addAndExecute(pCmd);
 
     // Complete the rack for the player that just played

Index: game/freegame.h
===================================================================
RCS file: /cvsroot/eliot/eliot/game/freegame.h,v
retrieving revision 1.17
retrieving revision 1.18
diff -u -b -r1.17 -r1.18
--- game/freegame.h     30 Nov 2008 20:55:46 -0000      1.17
+++ game/freegame.h     29 Nov 2009 16:01:32 -0000      1.18
@@ -18,8 +18,8 @@
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  *****************************************************************************/
 
-#ifndef _FREEGAME_H_
-#define _FREEGAME_H_
+#ifndef FREEGAME_H_
+#define FREEGAME_H_
 
 #include "game.h"
 

Index: game/game.cpp
===================================================================
RCS file: /cvsroot/eliot/eliot/game/game.cpp,v
retrieving revision 1.57
retrieving revision 1.58
diff -u -b -r1.57 -r1.58
--- game/game.cpp       18 Mar 2009 18:54:41 -0000      1.57
+++ game/game.cpp       29 Nov 2009 16:01:32 -0000      1.58
@@ -501,7 +501,8 @@
 
 
 int Game::checkPlayedWord(const wstring &iCoord,
-                          const wstring &iWord, Round &oRound) const
+                          const wstring &iWord,
+                          Round &oRound, bool checkRack) const
 {
     ASSERT(getNPlayers() != 0, "Expected at least one player");
 
@@ -550,6 +551,8 @@
             return 10;
     }
 
+    if (checkRack)
+    {
     // Check that the word can be formed with the tiles in the rack:
     // we first create a copy of the rack, then we remove the tiles
     // one by one
@@ -574,6 +577,7 @@
             rack.remove(t);
         }
     }
+    }
 
     return 0;
 }

Index: game/game.h
===================================================================
RCS file: /cvsroot/eliot/eliot/game/game.h,v
retrieving revision 1.51
retrieving revision 1.52
diff -u -b -r1.51 -r1.52
--- game/game.h 18 Mar 2009 18:54:41 -0000      1.51
+++ game/game.h 29 Nov 2009 16:01:32 -0000      1.52
@@ -19,8 +19,8 @@
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  *****************************************************************************/
 
-#ifndef _GAME_H_
-#define _GAME_H_
+#ifndef GAME_H_
+#define GAME_H_
 
 #include <string>
 #include <vector>
@@ -178,30 +178,13 @@
      ***************/
 
     /**
-     * Possible formats for the saved games
-     */
-    enum game_file_format
-    {
-        FILE_FORMAT_STANDARD,
-        FILE_FORMAT_ADVANCED
-    };
-
-    /**
+     * XXX FIXME XXX: these methods are deprecated, don't use them anymore.
      * load() returns the loaded game, or NULL if there was a problem
      * load() does need some more work to be robust enough to
      * handle "hand written" files
      */
     static Game * load(FILE *fin, const Dictionary &iDic);
-
-    /**
-     * Save a game to a file
-     * Standard format is used for training games so that it is compatible
-     * with previous versions of Eliot.
-     *
-     * Saving can be forced to advanced format for training games by
-     * setting the last parameter to FILE_FORMAT_ADVANCED
-     */
-    void save(ostream &out, game_file_format format = FILE_FORMAT_STANDARD) 
const;
+    static Game * load(const string &iFileName, const Dictionary &iDic);
 
     /***************
      * Setting the rack
@@ -214,6 +197,19 @@
     const Navigation & getNavigation() const { return m_navigation; }
     Navigation & accessNavigation() { return m_navigation; }
 
+    /**
+     * This function checks whether it is legal to play the given word at the
+     * given coordinates. If so, the function fills a Round object, also given
+     * as a parameter.
+     * Possible return values: same as the play() method
+     * If checkRack is false, the return value 4 is impossible to get
+     * (no check is done on the rack letters).
+     */
+    int checkPlayedWord(const wstring &iCoord,
+                        const wstring &iWord,
+                        Round &oRound,
+                        bool checkRack = true) const;
+
 private:
     /// Variant
     GameVariant m_variant;
@@ -318,15 +314,6 @@
     bool rackInBag(const Rack &iRack, const Bag &iBag) const;
 
     /**
-     * This function checks whether it is legal to play the given word at the
-     * given coordinates. If so, the function fills a Round object, also given
-     * as a parameter.
-     * Possible return values: same as the play() method
-     */
-    int checkPlayedWord(const wstring &iCoord,
-                        const wstring &iWord, Round &oRound) const;
-
-    /**
      * load games from File using the first format.
      * This format is used for Training games
      */
@@ -338,6 +325,7 @@
      */
     static Game* gameLoadFormat_15(FILE *fin, const Dictionary& iDic);
 
+#if 0
     /**
      * Training games ares saved using the initial Eliot format
      */
@@ -347,6 +335,7 @@
      * Advanced game file format output
      */
     void gameSaveFormat_15(ostream &out) const;
+#endif
 
 };
 

Index: game/game_exception.cpp
===================================================================
RCS file: /cvsroot/eliot/eliot/game/game_exception.cpp,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -b -r1.2 -r1.3
--- game/game_exception.cpp     22 Nov 2008 13:09:30 -0000      1.2
+++ game/game_exception.cpp     29 Nov 2009 16:01:32 -0000      1.3
@@ -40,3 +40,15 @@
 {
 }
 
+
+LoadGameException::LoadGameException(const string &iMessage)
+    : GameException(iMessage)
+{
+}
+
+
+SaveGameException::SaveGameException(const string &iMessage)
+    : GameException(iMessage)
+{
+}
+

Index: game/game_exception.h
===================================================================
RCS file: /cvsroot/eliot/eliot/game/game_exception.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -b -r1.2 -r1.3
--- game/game_exception.h       22 Nov 2008 13:09:30 -0000      1.2
+++ game/game_exception.h       29 Nov 2009 16:01:32 -0000      1.3
@@ -18,8 +18,8 @@
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  *****************************************************************************/
 
-#ifndef _GAME_EXCEPTION_H_
-#define _GAME_EXCEPTION_H_
+#ifndef GAME_EXCEPTION_H_
+#define GAME_EXCEPTION_H_
 
 #include <exception>
 #include <string>
@@ -48,4 +48,18 @@
         EndGameException(const std::string &iMessage);
 };
 
+
+class LoadGameException: public GameException
+{
+    public:
+        LoadGameException(const std::string &iMessage);
+};
+
+
+class SaveGameException: public GameException
+{
+    public:
+        SaveGameException(const std::string &iMessage);
+};
+
 #endif

Index: game/game_factory.cpp
===================================================================
RCS file: /cvsroot/eliot/eliot/game/game_factory.cpp,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -b -r1.12 -r1.13
--- game/game_factory.cpp       22 Nov 2008 13:09:30 -0000      1.12
+++ game/game_factory.cpp       29 Nov 2009 16:01:32 -0000      1.13
@@ -42,6 +42,7 @@
 #include "ai_percent.h"
 #include "dic.h"
 #include "encoding.h"
+#include "xml_reader.h"
 
 
 GameFactory *GameFactory::m_factory = NULL;
@@ -227,15 +228,7 @@
 
 Game* GameFactory::load(const string &iFileName, const Dictionary &iDic)
 {
-    FILE* fin = fopen(iFileName.c_str(), "r");
-    if (fin == NULL)
-    {
-        printf("Cannot open %s\n", iFileName.c_str());
-        return NULL;
-    }
-    Game *game = Game::load(fin, iDic);
-    fclose(fin);
-    return game;
+    return XmlReader::read(iFileName, iDic);
 }
 
 

Index: game/game_factory.h
===================================================================
RCS file: /cvsroot/eliot/eliot/game/game_factory.h,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -b -r1.11 -r1.12
--- game/game_factory.h 22 Nov 2008 13:09:30 -0000      1.11
+++ game/game_factory.h 29 Nov 2009 16:01:32 -0000      1.12
@@ -18,8 +18,8 @@
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  *****************************************************************************/
 
-#ifndef _GAME_FACTORY_H_
-#define _GAME_FACTORY_H_
+#ifndef GAME_FACTORY_H_
+#define GAME_FACTORY_H_
 
 #include <string>
 #include <vector>

Index: game/game_io.cpp
===================================================================
RCS file: /cvsroot/eliot/eliot/game/game_io.cpp,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -b -r1.13 -r1.14
--- game/game_io.cpp    18 Mar 2009 18:53:57 -0000      1.13
+++ game/game_io.cpp    29 Nov 2009 16:01:32 -0000      1.14
@@ -21,6 +21,7 @@
 
 #include <cstring>
 #include <cstdlib> // For atoi
+#include <cstdio>
 
 #include "dic.h"
 #include "pldrack.h"
@@ -106,6 +107,7 @@
     Game *pGame = NULL;
 
     pGame = GameFactory::Instance()->createTraining(iDic);
+    pGame->addPlayer(new HumanPlayer);
     pGame->start();
 
     /*    rack        word          ?bonus    pts  coord    */
@@ -390,9 +392,7 @@
 //                     pGame->m_players[player]->endTurn(round,num - 1);
 
         // Play the round
-        GameMoveCmd cmd(*pGame, Move(round),
-                        pGame->getCurrentPlayer().getLastRack(),
-                        pGame->m_currPlayer);
+        GameMoveCmd cmd(*pGame, Move(round), pGame->m_currPlayer);
         cmd.execute();
     }
 
@@ -437,170 +437,3 @@
     return pGame;
 }
 
-/********************************************************
- *
- * Loading games
- *
- ********************************************************/
-
-void Game::save(ostream &out, game_file_format format) const
-{
-    if (getMode() == kTRAINING && format == FILE_FORMAT_STANDARD)
-    {
-        gameSaveFormat_14(out);
-    }
-    else
-    {
-        gameSaveFormat_15(out);
-    }
-}
-
-
-void Game::gameSaveFormat_14(ostream &out) const
-{
-    char line[100];
-    const string decal = "   ";
-    out << IDENT_STRING << endl << endl;
-
-    for (unsigned int i = 0; i < m_history.getSize(); i++)
-    {
-        const Turn& turn = m_history.getTurn(i);
-        wstring rack = turn.getPlayedRack().toString(PlayedRack::RACK_EXTRA);
-        // FIXME: this will not work if the move does not correspond to a 
played round!
-        const Round &round = turn.getMove().getRound();
-        wstring word = round.getWord();
-        string coord = 
convertToMb(round.getCoord().toString(Coord::COORD_MODE_LONG));
-
-        // rack [space] word [space] bonus points coord
-        sprintf(line,"%s%s%c%4d %s",
-                padAndConvert(rack, 12, false).c_str(),
-                padAndConvert(word, 16, false).c_str(),
-                round.getBonus() ? '*' : ' ',
-                round.getPoints(),
-                coord.c_str()
-               );
-
-        out << decal << line << endl;
-    }
-
-    out << endl;
-    out << decal << "total" << string(24,' ');
-    sprintf(line, "%4d", getCurrentPlayer().getPoints());
-    out << line << endl;
-}
-
-
-void Game::gameSaveFormat_15(ostream &out) const
-{
-    const string decal = "   ";
-    // "Header" of the game
-    out << IDENT_STRING << " " << IDENT_FORMAT_15 << endl << endl;
-    // Game type
-    out << "Game type: " << getModeAsString() << endl;
-    // Player list
-    for (unsigned int i = 0; i < getNPlayers(); i++)
-    {
-        out << "Player " << i << ": ";
-        if (m_players[i]->isHuman())
-            out << "Human" << endl;
-        else
-            out << "Computer" << endl;
-    }
-    out << endl;
-
-    // Title of the columns
-    char line[100];
-    out << decal << " N |   RACK   |    SOLUTION     | REF | PTS | P | BONUS" 
<< endl;
-    out << decal << "===|==========|=================|=====|=====|===|======" 
<< endl;
-
-    // Print the game itself
-    for (unsigned int i = 0; i < m_history.getSize(); i++)
-    {
-        const Turn& turn = m_history.getTurn(i);
-        wstring rack = turn.getPlayedRack().toString(PlayedRack::RACK_EXTRA);
-        const Move &move = turn.getMove();
-        switch (move.getType())
-        {
-            case Move::VALID_ROUND:
-            {
-                const Round &round = move.getRound();
-                wstring word = round.getWord();
-                string coord = convertToMb(round.getCoord().toString());
-                sprintf(line, "%2d | %s | %s | %3s | %3d | %1d | %c",
-                        i + 1,
-                        padAndConvert(rack, 8).c_str(),             /* pldrack 
    */
-                        padAndConvert(word, 15, false).c_str(),     /* word    
    */
-                        coord.c_str(),                              /* coord   
    */
-                        move.getScore(),
-                        turn.getPlayer(),
-                        round.getBonus() ? '*' : ' ');
-                break;
-            }
-            case Move::INVALID_WORD:
-            {
-                wstring word = move.getBadWord();
-                string coord = convertToMb(move.getBadCoord());
-                sprintf(line, "%2d | %s | %s | %3s | %3d | %1d |",
-                        i + 1,
-                        padAndConvert(rack, 8).c_str(),             /* pldrack 
    */
-                        padAndConvert(word, 15, false).c_str(),     /* word    
    */
-                        coord.c_str(),                              /* coord   
    */
-                        move.getScore(),
-                        turn.getPlayer());
-                break;
-            }
-            case Move::PASS:
-            {
-                string action = "(PASS)";
-                string coord = " - ";
-                sprintf(line, "%2d | %s | %s | %3s | %3d | %1d |",
-                        i + 1,
-                        padAndConvert(rack, 8).c_str(),             /* pldrack 
    */
-                        truncOrPad(action, 15, ' ').c_str(),        /* word    
    */
-                        coord.c_str(),                              /* coord   
    */
-                        move.getScore(),
-                        turn.getPlayer());
-                break;
-            }
-            case Move::CHANGE_LETTERS:
-            {
-                wstring action = L"(-" + move.getChangedLetters() + L")";
-                string coord = " - ";
-                sprintf(line, "%2d | %s | %s | %3s | %3d | %1d |",
-                        i + 1,
-                        padAndConvert(rack, 8).c_str(),             /* pldrack 
    */
-                        padAndConvert(action, 15, false).c_str(),   /* word    
    */
-                        coord.c_str(),                              /* coord   
    */
-                        move.getScore(),
-                        turn.getPlayer());
-                break;
-            }
-
-        }
-
-        out << decal << line << endl;
-    }
-
-    switch (getMode())
-    {
-    case kDUPLICATE:
-        // TODO : we should note the score individualy
-        out << endl << decal << "Total: " << m_points << endl;
-        break;
-    case kFREEGAME:
-        out << endl << decal << "Total: " << m_points << endl;
-        break;
-    case kTRAINING:
-        out << endl << decal << "Total: " << m_points << endl;
-        break;
-    }
-
-    // Print current rack for all the players
-    out << endl;
-    for (unsigned int i = 0; i < getNPlayers(); i++)
-    {
-        wstring rack = m_players[i]->getCurrentRack().toString();
-        out << "Rack " << i << ": " << convertToMb(rack) << endl;
-    }
-}
-

Index: game/game_move_cmd.cpp
===================================================================
RCS file: /cvsroot/eliot/eliot/game/game_move_cmd.cpp,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -b -r1.5 -r1.6
--- game/game_move_cmd.cpp      21 Feb 2009 16:56:32 -0000      1.5
+++ game/game_move_cmd.cpp      29 Nov 2009 16:01:32 -0000      1.6
@@ -24,11 +24,13 @@
 #include "player.h"
 #include "game.h"
 #include "rack.h"
+#include "turn.h"
 
 
 GameMoveCmd::GameMoveCmd(Game &ioGame, const Move &iMove,
-                         const PlayedRack &iMoveRack, unsigned int iPlayerId)
-    : m_game(ioGame), m_move(iMove), m_moveRack(iMoveRack),
+                         unsigned int iPlayerId)
+    : m_game(ioGame), m_move(iMove),
+    
m_moveRack(ioGame.getPlayer(iPlayerId).getHistory().getPreviousTurn().getPlayedRack()),
     m_playerId(iPlayerId)
 {
 }

Index: game/game_move_cmd.h
===================================================================
RCS file: /cvsroot/eliot/eliot/game/game_move_cmd.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -b -r1.2 -r1.3
--- game/game_move_cmd.h        23 Nov 2008 17:02:33 -0000      1.2
+++ game/game_move_cmd.h        29 Nov 2009 16:01:32 -0000      1.3
@@ -18,8 +18,8 @@
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  *****************************************************************************/
 
-#ifndef _GAME_MOVE_CMD_H
-#define _GAME_MOVE_CMD_H
+#ifndef GAME_MOVE_CMD_H_
+#define GAME_MOVE_CMD_H_
 
 #include "command.h"
 #include "move.h"
@@ -44,11 +44,14 @@
 {
     public:
         GameMoveCmd(Game &ioGame, const Move &iMove,
-                    const PlayedRack &iMoveRack,
                     unsigned int iPlayerId);
 
         virtual wstring toString() const;
 
+        // Getters
+        const Move & getMove() const { return m_move; }
+        unsigned int getPlayerId() const { return m_playerId; }
+
     protected:
         virtual void doExecute();
         virtual void doUndo();

Index: game/history.h
===================================================================
RCS file: /cvsroot/eliot/eliot/game/history.h,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -b -r1.14 -r1.15
--- game/history.h      23 Nov 2008 08:18:08 -0000      1.14
+++ game/history.h      29 Nov 2009 16:01:32 -0000      1.15
@@ -19,8 +19,8 @@
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  *****************************************************************************/
 
-#ifndef _HISTORY_H
-#define _HISTORY_H
+#ifndef HISTORY_H_
+#define HISTORY_H_
 
 #include <string>
 #include <vector>

Index: game/matrix.h
===================================================================
RCS file: /cvsroot/eliot/eliot/game/matrix.h,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -b -r1.1 -r1.2
--- game/matrix.h       17 Jan 2009 14:57:33 -0000      1.1
+++ game/matrix.h       29 Nov 2009 16:01:32 -0000      1.2
@@ -18,8 +18,8 @@
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  *****************************************************************************/
 
-#ifndef _MATRIX_H_
-#define _MATRIX_H_
+#ifndef MATRIX_H_
+#define MATRIX_H_
 
 #include <vector>
 

Index: game/move.cpp
===================================================================
RCS file: /cvsroot/eliot/eliot/game/move.cpp,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -b -r1.4 -r1.5
--- game/move.cpp       23 Nov 2008 08:18:08 -0000      1.4
+++ game/move.cpp       29 Nov 2009 16:01:32 -0000      1.5
@@ -147,7 +147,7 @@
     else if (m_type == CHANGE_LETTERS)
         wss << "CHANGE=" << m_letters;
     else if (m_type == INVALID_WORD)
-        wss << "INVALID: word=" << m_round.toString() << "  coords=" << 
m_coord;
+        wss << "INVALID: word=" << m_word << "  coords=" << m_coord;
     else if (m_type == VALID_ROUND)
         wss << "VALID: word=" << m_round.toString();
     wss << "  score=" << m_score;

Index: game/move.h
===================================================================
RCS file: /cvsroot/eliot/eliot/game/move.h,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -b -r1.4 -r1.5
--- game/move.h 3 Jul 2009 21:40:15 -0000       1.4
+++ game/move.h 29 Nov 2009 16:01:32 -0000      1.5
@@ -18,8 +18,8 @@
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  *****************************************************************************/
 
-#ifndef _MOVE_H
-#define _MOVE_H
+#ifndef MOVE_H_
+#define MOVE_H_
 
 #include <string>
 
@@ -81,7 +81,7 @@
         Type getType() const { return m_type; }
 
         /// Get the score of this move (0 unless the round is valid)
-        int getScore() const { return m_score; };
+        int getScore() const { return m_score; }
 
         /**
          * Return the round associated with the move, or throw an exception

Index: game/navigation.cpp
===================================================================
RCS file: /cvsroot/eliot/eliot/game/navigation.cpp,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -b -r1.9 -r1.10
--- game/navigation.cpp 24 Jan 2009 17:44:56 -0000      1.9
+++ game/navigation.cpp 29 Nov 2009 16:01:32 -0000      1.10
@@ -172,12 +172,18 @@
 }
 
 
+const vector<TurnCmd *> & Navigation::getCommands() const
+{
+    return m_turnCommands;
+}
+
+
 void Navigation::print() const
 {
     cout << "=== Commands history ===" << endl;
-    cout << "Current position right after turn " << m_currTurn  - 1<< endl;
+    cout << "Current position right after turn " << m_currTurn  - 1 << endl;
     int index = 0;
-    BOOST_FOREACH(Command *c, m_turnCommands)
+    BOOST_FOREACH(const Command *c, m_turnCommands)
     {
         cout << index << " " << convertToMb(c->toString()) << endl;
         ++index;

Index: game/navigation.h
===================================================================
RCS file: /cvsroot/eliot/eliot/game/navigation.h,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -b -r1.4 -r1.5
--- game/navigation.h   30 Nov 2008 20:51:05 -0000      1.4
+++ game/navigation.h   29 Nov 2009 16:01:32 -0000      1.5
@@ -18,8 +18,8 @@
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  *****************************************************************************/
 
-#ifndef _NAVIGATION_H
-#define _NAVIGATION_H
+#ifndef NAVIGATION_H_
+#define NAVIGATION_H_
 
 #include <vector>
 
@@ -53,6 +53,8 @@
          */
         void clearFuture();
 
+        const vector<TurnCmd *> & getCommands() const;
+
         /**
          * Print the contents of the commands history, to ease debugging
          */

Index: game/player.h
===================================================================
RCS file: /cvsroot/eliot/eliot/game/player.h,v
retrieving revision 1.24
retrieving revision 1.25
diff -u -b -r1.24 -r1.25
--- game/player.h       23 Nov 2008 08:18:09 -0000      1.24
+++ game/player.h       29 Nov 2009 16:01:32 -0000      1.25
@@ -19,8 +19,8 @@
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  *****************************************************************************/
 
-#ifndef _PLAYER_H_
-#define _PLAYER_H_
+#ifndef PLAYER_H_
+#define PLAYER_H_
 
 #include <vector>
 #include <string>

Index: game/player_move_cmd.h
===================================================================
RCS file: /cvsroot/eliot/eliot/game/player_move_cmd.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -b -r1.2 -r1.3
--- game/player_move_cmd.h      23 Nov 2008 17:02:33 -0000      1.2
+++ game/player_move_cmd.h      29 Nov 2009 16:01:32 -0000      1.3
@@ -18,8 +18,8 @@
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  *****************************************************************************/
 
-#ifndef _PLAYER_MOVE_CMD_H
-#define _PLAYER_MOVE_CMD_H
+#ifndef PLAYER_MOVE_CMD_H_
+#define PLAYER_MOVE_CMD_H_
 
 #include "command.h"
 #include "move.h"
@@ -46,6 +46,10 @@
 
         virtual wstring toString() const;
 
+        // Getters
+        const Player & getPlayer() const { return m_player; }
+        const Move & getMove() const { return m_move; }
+
     protected:
         virtual void doExecute();
         virtual void doUndo();

Index: game/player_points_cmd.h
===================================================================
RCS file: /cvsroot/eliot/eliot/game/player_points_cmd.h,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -b -r1.1 -r1.2
--- game/player_points_cmd.h    30 Nov 2008 21:10:26 -0000      1.1
+++ game/player_points_cmd.h    29 Nov 2009 16:01:32 -0000      1.2
@@ -18,8 +18,8 @@
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  *****************************************************************************/
 
-#ifndef _PLAYER_POINTS_CMD_H
-#define _PLAYER_POINTS_CMD_H
+#ifndef PLAYER_POINTS_CMD_H_
+#define PLAYER_POINTS_CMD_H_
 
 #include "command.h"
 
@@ -37,6 +37,10 @@
 
         virtual wstring toString() const;
 
+        // Getters
+        const Player & getPlayer() const { return m_player; }
+        int getPoints() const { return m_points; }
+
     protected:
         virtual void doExecute();
         virtual void doUndo();

Index: game/player_rack_cmd.h
===================================================================
RCS file: /cvsroot/eliot/eliot/game/player_rack_cmd.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -b -r1.2 -r1.3
--- game/player_rack_cmd.h      23 Nov 2008 17:02:33 -0000      1.2
+++ game/player_rack_cmd.h      29 Nov 2009 16:01:32 -0000      1.3
@@ -18,8 +18,8 @@
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  *****************************************************************************/
 
-#ifndef _PLAYER_RACK_CMD_H
-#define _PLAYER_RACK_CMD_H
+#ifndef PLAYER_RACK_CMD_H_
+#define PLAYER_RACK_CMD_H_
 
 #include "command.h"
 #include "pldrack.h"
@@ -38,6 +38,10 @@
 
         virtual wstring toString() const;
 
+        // Getters
+        const Player & getPlayer() const { return m_player; }
+        const PlayedRack &getRack() const { return m_newRack; }
+
     protected:
         virtual void doExecute();
         virtual void doUndo();

Index: game/pldrack.h
===================================================================
RCS file: /cvsroot/eliot/eliot/game/pldrack.h,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -b -r1.15 -r1.16
--- game/pldrack.h      22 Nov 2008 13:09:31 -0000      1.15
+++ game/pldrack.h      29 Nov 2009 16:01:32 -0000      1.16
@@ -19,8 +19,8 @@
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  *****************************************************************************/
 
-#ifndef _PLAYEDRACK_H_
-#define _PLAYEDRACK_H_
+#ifndef PLAYEDRACK_H_
+#define PLAYEDRACK_H_
 
 #include <vector>
 #include <string>

Index: game/public_game.cpp
===================================================================
RCS file: /cvsroot/eliot/eliot/game/public_game.cpp,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -b -r1.5 -r1.6
--- game/public_game.cpp        24 Jan 2009 17:44:57 -0000      1.5
+++ game/public_game.cpp        29 Nov 2009 16:01:32 -0000      1.6
@@ -23,7 +23,9 @@
 #include "training.h"
 #include "duplicate.h"
 #include "freegame.h"
+#include "game_factory.h"
 #include "game_exception.h"
+#include "xml_writer.h"
 
 
 PublicGame::PublicGame(Game &iGame)
@@ -70,6 +72,8 @@
 {
     if (m_game.getVariant() == Game::kJOKER)
         return kJOKER;
+    else if (m_game.getVariant() == Game::kEXPLOSIVE)
+        return kEXPLOSIVE;
     else
         return kNONE;
 }
@@ -251,21 +255,16 @@
 
 /***************************/
 
-PublicGame *PublicGame::load(FILE *fin, const Dictionary &iDic)
+PublicGame *PublicGame::load(const string &iFileName, const Dictionary &iDic)
 {
-    Game *game = Game::load(fin, iDic);
-    if (game == NULL)
-        return NULL;
+    Game *game = GameFactory::Instance()->load(iFileName, iDic);
     return new PublicGame(*game);
 }
 
 
-void PublicGame::save(ostream &out, GameFileFormat format) const
+void PublicGame::save(const string &iFileName) const
 {
-    if (format == kFILE_FORMAT_ADVANCED)
-        m_game.save(out, Game::FILE_FORMAT_ADVANCED);
-    else
-        m_game.save(out, Game::FILE_FORMAT_STANDARD);
+    XmlWriter::write(m_game, iFileName);
 }
 
 /***************************/

Index: game/public_game.h
===================================================================
RCS file: /cvsroot/eliot/eliot/game/public_game.h,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -b -r1.5 -r1.6
--- game/public_game.h  24 Jan 2009 17:44:57 -0000      1.5
+++ game/public_game.h  29 Nov 2009 16:01:32 -0000      1.6
@@ -18,8 +18,8 @@
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  *****************************************************************************/
 
-#ifndef _PUBLIC_GAME_H_
-#define _PUBLIC_GAME_H_
+#ifndef PUBLIC_GAME_H_
+#define PUBLIC_GAME_H_
 
 #include <string>
 
@@ -241,30 +241,15 @@
      ***************/
 
     /**
-     * Possible formats for the saved games
+     * Return the loaded game, from an XML file.
+     * An exception is thrown in case of problem.
      */
-    enum GameFileFormat
-    {
-        kFILE_FORMAT_STANDARD,
-        kFILE_FORMAT_ADVANCED
-    };
-
-    /**
-     * load() returns the loaded game, or NULL if there was a problem
-     * load() does need some more work to be robust enough to
-     * handle "hand written" files
-     */
-    static PublicGame * load(FILE *fin, const Dictionary &iDic);
+    static PublicGame * load(const string &iFileName, const Dictionary &iDic);
 
     /**
-     * Save a game to a file
-     * Standard format is used for training games so that it is compatible
-     * with previous versions of Eliot.
-     *
-     * Saving can be forced to advanced format for training games by
-     * setting the last parameter to kFILE_FORMAT_ADVANCED
+     * Save a game to a XML file
      */
-    void save(ostream &out, GameFileFormat format = kFILE_FORMAT_STANDARD) 
const;
+    void save(const string &iFileName) const;
 
     /***************
      * Navigation in the game history

Index: game/rack.h
===================================================================
RCS file: /cvsroot/eliot/eliot/game/rack.h,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -b -r1.12 -r1.13
--- game/rack.h 22 Nov 2008 13:09:31 -0000      1.12
+++ game/rack.h 29 Nov 2009 16:01:32 -0000      1.13
@@ -19,8 +19,8 @@
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  *****************************************************************************/
 
-#ifndef _RACK_H_
-#define _RACK_H_
+#ifndef RACK_H_
+#define RACK_H_
 
 #include <vector>
 #include <string>

Index: game/results.h
===================================================================
RCS file: /cvsroot/eliot/eliot/game/results.h,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -b -r1.14 -r1.15
--- game/results.h      24 Jan 2009 17:44:57 -0000      1.14
+++ game/results.h      29 Nov 2009 16:01:32 -0000      1.15
@@ -19,8 +19,8 @@
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  *****************************************************************************/
 
-#ifndef _RESULTS_H_
-#define _RESULTS_H_
+#ifndef RESULTS_H_
+#define RESULTS_H_
 
 #include <vector>
 #include <map>

Index: game/round.h
===================================================================
RCS file: /cvsroot/eliot/eliot/game/round.h,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -b -r1.15 -r1.16
--- game/round.h        3 Jul 2009 23:00:13 -0000       1.15
+++ game/round.h        29 Nov 2009 16:01:32 -0000      1.16
@@ -19,8 +19,8 @@
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  *****************************************************************************/
 
-#ifndef _ROUND_H_
-#define _ROUND_H_
+#ifndef ROUND_H_
+#define ROUND_H_
 
 #include <vector>
 #include "tile.h"

Index: game/settings.h
===================================================================
RCS file: /cvsroot/eliot/eliot/game/settings.h,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -b -r1.5 -r1.6
--- game/settings.h     23 Nov 2008 20:13:02 -0000      1.5
+++ game/settings.h     29 Nov 2009 16:01:32 -0000      1.6
@@ -18,8 +18,8 @@
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  *****************************************************************************/
 
-#ifndef _SETTINGS_H_
-#define _SETTINGS_H_
+#ifndef SETTINGS_H_
+#define SETTINGS_H_
 
 #include <string>
 #include <map>

Index: game/training.cpp
===================================================================
RCS file: /cvsroot/eliot/eliot/game/training.cpp,v
retrieving revision 1.34
retrieving revision 1.35
diff -u -b -r1.34 -r1.35
--- game/training.cpp   19 Feb 2009 18:25:17 -0000      1.34
+++ game/training.cpp   29 Nov 2009 16:01:32 -0000      1.35
@@ -48,9 +48,6 @@
 Training::Training(const Dictionary &iDic)
     : Game(iDic), m_results(1000)
 {
-    // Training mode implicitly uses 1 human player
-    Game::addPlayer(new HumanPlayer);
-    m_players[0]->setName(convertToWc(_("Training")));
 }
 
 
@@ -135,9 +132,7 @@
 
     // Play the word on the board
     const Move &move = m_players[m_currPlayer]->getLastMove();
-    Command *pCmd = new GameMoveCmd(*this, move,
-                                    getCurrentPlayer().getLastRack(),
-                                    m_currPlayer);
+    Command *pCmd = new GameMoveCmd(*this, move, m_currPlayer);
     accessNavigation().addAndExecute(pCmd);
     accessNavigation().newTurn();
 }
@@ -172,9 +167,11 @@
 
 void Training::addPlayer(Player *iPlayer)
 {
-    // Override the default behaviour to do nothing
-    // except releasing memory
-    delete iPlayer;
+    ASSERT(getNPlayers() == 0,
+           "Only one player can be added in Training mode");
+    // Force the name of the player
+    iPlayer->setName(convertToWc(_("Training")));
+    Game::addPlayer(iPlayer);
 }
 
 

Index: game/training.h
===================================================================
RCS file: /cvsroot/eliot/eliot/game/training.h,v
retrieving revision 1.25
retrieving revision 1.26
diff -u -b -r1.25 -r1.26
--- game/training.h     24 Jan 2009 17:44:57 -0000      1.25
+++ game/training.h     29 Nov 2009 16:01:32 -0000      1.26
@@ -19,8 +19,8 @@
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  *****************************************************************************/
 
-#ifndef _TRAINING_H_
-#define _TRAINING_H_
+#ifndef TRAINING_H_
+#define TRAINING_H_
 
 #include <string>
 

Index: game/turn.h
===================================================================
RCS file: /cvsroot/eliot/eliot/game/turn.h,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -b -r1.12 -r1.13
--- game/turn.h 23 Nov 2008 08:18:10 -0000      1.12
+++ game/turn.h 29 Nov 2009 16:01:32 -0000      1.13
@@ -19,8 +19,8 @@
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  *****************************************************************************/
 
-#ifndef _TURN_H
-#define _TURN_H
+#ifndef TURN_H_
+#define TURN_H_
 
 #include <string>
 #include "pldrack.h"

Index: game/turn_cmd.h
===================================================================
RCS file: /cvsroot/eliot/eliot/game/turn_cmd.h,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -b -r1.4 -r1.5
--- game/turn_cmd.h     30 Nov 2008 20:55:46 -0000      1.4
+++ game/turn_cmd.h     29 Nov 2009 16:01:32 -0000      1.5
@@ -18,8 +18,8 @@
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  *****************************************************************************/
 
-#ifndef _TURN_CMD_H
-#define _TURN_CMD_H
+#ifndef TURN_CMD_H_
+#define TURN_CMD_H_
 
 #include <vector>
 
@@ -46,6 +46,8 @@
 
         bool isEmpty() const { return m_commands.empty(); }
 
+        const vector<Command *> & getCommands() const { return m_commands; }
+
         virtual bool isAutoExecution() const;
 
         virtual wstring toString() const;

Index: qt/Makefile.am
===================================================================
RCS file: /cvsroot/eliot/eliot/qt/Makefile.am,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -b -r1.10 -r1.11
--- qt/Makefile.am      19 Feb 2009 18:25:17 -0000      1.10
+++ qt/Makefile.am      29 Nov 2009 16:01:33 -0000      1.11
@@ -80,7 +80,7 @@
     main.cpp
 eliot_SOURCES += $(BUILT_SOURCES)
 
-eliot_LDADD = ../game/libgame.a ../dic/libdic.a @QT_LIBS@ @LIBINTL@ 
@LIBCONFIG_LIBS@
+eliot_LDADD = ../game/libgame.a ../dic/libdic.a @QT_LIBS@ @LIBINTL@ 
@LIBCONFIG_LIBS@ @ARABICA_LIBS@
 
 # Generate a cpp file from the resources
 resources.cpp: eliot.qrc $(RESOURCES)

Index: qt/main_window.cpp
===================================================================
RCS file: /cvsroot/eliot/eliot/qt/main_window.cpp,v
retrieving revision 1.32
retrieving revision 1.33
diff -u -b -r1.32 -r1.33
--- qt/main_window.cpp  23 Oct 2009 20:19:04 -0000      1.32
+++ qt/main_window.cpp  29 Nov 2009 16:01:33 -0000      1.33
@@ -21,7 +21,6 @@
 #include "config.h"
 
 #include <iostream>
-#include <fstream>
 #include <QtGui/QLabel>
 #include <QtGui/QMessageBox>
 #include <QtGui/QFileDialog>
@@ -263,19 +262,17 @@
     else
     {
         m_actionGamePrint->setEnabled(true);
+        m_actionGameSaveAs->setEnabled(true);
         if (iGame->getMode() == PublicGame::kTRAINING)
         {
-            m_actionGameSaveAs->setEnabled(true);
             setWindowTitle(_q("Training mode") + " - Eliot");
         }
         else if (iGame->getMode() == PublicGame::kDUPLICATE)
         {
-            m_actionGameSaveAs->setEnabled(false);
             setWindowTitle(_q("Duplicate game") + " - Eliot");
         }
         else
         {
-            m_actionGameSaveAs->setEnabled(false);
             setWindowTitle(_q("Free game") + " - Eliot");
         }
     }
@@ -503,14 +500,17 @@
     QString fileName = QFileDialog::getOpenFileName(this, _q("Load a game"));
     if (fileName != "")
     {
+        try
+        {
+            PublicGame *tmpGame = PublicGame::load(qtl(fileName), *m_dic);
         destroyCurrentGame();
-        Game *tmpGame = GameFactory::Instance()->load(qtl(fileName), *m_dic);
-        if (tmpGame == NULL)
+            m_game = tmpGame;
+        }
+        catch (std::exception &e)
         {
-            displayErrorMsg(_q("Error while loading the game"));
+            displayErrorMsg(_q("Error while loading the game:\n") + e.what());
             return;
         }
-        m_game = new PublicGame(*tmpGame);
         m_ui.groupBoxPlayers->show();
         emit gameChangedNonConst(m_game);
         emit gameChanged(m_game);
@@ -528,10 +528,16 @@
     QString fileName = QFileDialog::getSaveFileName(this, _q("Save a game"));
     if (fileName != "")
     {
-        ofstream fout(qtl(fileName));
-        m_game->save(fout);
+        try
+        {
+            m_game->save(qtl(fileName));
         displayInfoMsg(_q("Game saved"));
     }
+        catch (std::exception &e)
+        {
+            displayErrorMsg(_q("Error saving game: %1").arg(e.what()));
+        }
+    }
 }
 
 

Index: qt/new_game.cpp
===================================================================
RCS file: /cvsroot/eliot/eliot/qt/new_game.cpp,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -b -r1.7 -r1.8
--- qt/new_game.cpp     15 Jan 2009 18:33:32 -0000      1.7
+++ qt/new_game.cpp     29 Nov 2009 16:01:33 -0000      1.8
@@ -139,7 +139,7 @@
     }
     else
     {
-        const_cast<Player 
*>(&game->getPlayer(0))->setName(qtw(_q("Training")));
+        game->addPlayer(new HumanPlayer);
     }
 
     // Joker game?

Index: test/driver
===================================================================
RCS file: /cvsroot/eliot/eliot/test/driver,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -b -r1.14 -r1.15
--- test/driver 21 Feb 2009 16:56:32 -0000      1.14
+++ test/driver 29 Nov 2009 16:01:33 -0000      1.15
@@ -49,10 +49,6 @@
 # Joker problem on game load
 training_joker      0
 
-# Joker problem on game search
-# Eliot Rosace coup 10 nuageuse dans la recherche
-training_joker2     0
-
 #################
 # Duplicate mode
 #################

Index: test/duplicate_1_player.ref
===================================================================
RCS file: /cvsroot/eliot/eliot/test/duplicate_1_player.ref,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -b -r1.2 -r1.3
--- test/duplicate_1_player.ref 23 Jun 2009 21:36:33 -0000      1.2
+++ test/duplicate_1_player.ref 29 Nov 2009 16:01:33 -0000      1.3
@@ -4,15 +4,15 @@
 mode duplicate
 [?] pour l'aide
 commande> a T
-Joueur 0: UAXEHTS
+Rack 0: UAXEHTS
 commande> j SEAUX H8
 commande> a S
-Joueur 0:   48
+Score 0:   48
 commande> a T
-Joueur 0: HTIUONU
+Rack 0: HT+IUONU
 commande> j HUTIN i9
 commande> a S
-Joueur 0:   85
+Score 0:   85
 commande> a t
 OUNEUNE
 commande> a g
@@ -33,19 +33,18 @@
  N   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
  O   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
 commande> a p
-Eliot 1.5
+Game: player 1 out of 1
+Game: mode=Duplicate
+Game: variant=unknown
+Game: history:
+    N | P |   RACK   |    SOLUTION    | REF | PTS | BONUS
+   ===|===|==========|================|=====|=====|======
+    1 | 0 |  UAXEHTS | SEAUX          |  H8 |  48 |  
+    2 | 0 | HT+IUONU | HUTIN          |  I9 |  37 |  
 
-Game type: Duplicate
-Player 0: Human
-
-    N |   RACK   |    SOLUTION     | REF | PTS | P | BONUS
-   ===|==========|=================|=====|=====|===|======
-    1 |  UAXEHTS | SEAUX           |  H8 |  48 | 0 |  
-    2 | HT+IUONU | HUTIN           |  I9 |  37 | 0 |  
-
-   Total: 85
 
 Rack 0: OU+NEUNE
+Score 0:   85
 commande> q
 fin du mode duplicate
 commande> q

Index: test/duplicate_2_ai.ref
===================================================================
RCS file: /cvsroot/eliot/eliot/test/duplicate_2_ai.ref,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -b -r1.8 -r1.9
--- test/duplicate_2_ai.ref     23 Jun 2009 21:36:33 -0000      1.8
+++ test/duplicate_2_ai.ref     29 Nov 2009 16:01:33 -0000      1.9
@@ -4,48 +4,47 @@
 mode duplicate
 [?] pour l'aide
 commande> a S
-Joueur 0:  929
-Joueur 1:  929
+Score 0:  929
+Score 1:  929
 commande> a T
-Joueur 0: TTV
-Joueur 1: TTV
+Rack 0: TTV
+Rack 1: TTV
 commande> a l
  A B C D E F G H I J K L M N O P Q R S T U V W X Y Z ?
  0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 1 0 2 0 1 0 0 0 0 0
 commande> a p
-Eliot 1.5
-
-Game type: Duplicate
-Player 0: Computer
-Player 1: Computer
-
-    N |   RACK   |    SOLUTION     | REF | PTS | P | BONUS
-   ===|==========|=================|=====|=====|===|======
-    1 |  ?EBAAEF | FABAcEE         |  H4 |  80 | 0 | *
-    2 |  KEELIFE | KIEF            | 10F |  36 | 0 |  
-    3 | EEEL+IJX | FIXEE           |  4H |  34 | 0 |  
-    4 | EJL+RANS | JALES           |  J6 |  49 | 0 |  
-    5 | NR+OAHPU | HURON           |  5K |  28 | 0 |  
-    6 | AP+MOEIA | LIPOME          |  8J |  36 | 0 |  
-    7 | AA+SMOND | ADONNAMES       |  O1 |  86 | 0 | *
-    8 |  LEATCYL | CATLEYA         |  5B |  36 | 0 |  
-    9 | L+EARBHO | BROCHA          |  B2 |  42 | 0 |  
-   10 | EL+OSULA | ALLOUES         |  A6 |  81 | 0 | *
-   11 |  DSNIMEN | DEMIS           |  I1 |  28 | 0 |  
-   12 | INN+NQUS | QUINTS          |  D1 |  42 | 0 |  
-   13 | NN+IEUR? | MUNIRENt        |  N8 |  72 | 0 | *
-   14 |  ISITTIE | EDITS           |  1H |  21 | 0 |  
-   15 | IIT+NEOP | POTINIER        | 12G |  72 | 0 | *
-   16 |  DVZEAET | DZETA           | 15K |  72 | 0 |  
-   17 | ETV+RWEV | EWE             |  F5 |  32 | 0 |  
-   18 | ERTVV+TC | YET             |  G5 |  31 | 0 |  
-   19 | CRTVV+UR | REVUE           | M11 |  30 | 0 |  
-   20 | CRTV+TUL | CRUEL           |  2F |  21 | 0 |  
+Game: player 1 out of 2
+Game: mode=Duplicate
+Game: variant=unknown
+Game: history:
+    N | P |   RACK   |    SOLUTION    | REF | PTS | BONUS
+   ===|===|==========|================|=====|=====|======
+    1 | 0 |  ?EBAAEF | FABAcEE        |  H4 |  80 | *
+    2 | 0 |  KEELIFE | KIEF           | 10F |  36 |  
+    3 | 0 | EEEL+IJX | FIXEE          |  4H |  34 |  
+    4 | 0 | EJL+RANS | JALES          |  J6 |  49 |  
+    5 | 0 | NR+OAHPU | HURON          |  5K |  28 |  
+    6 | 0 | AP+MOEIA | LIPOME         |  8J |  36 |  
+    7 | 0 | AA+SMOND | ADONNAMES      |  O1 |  86 | *
+    8 | 0 |  LEATCYL | CATLEYA        |  5B |  36 |  
+    9 | 0 | L+EARBHO | BROCHA         |  B2 |  42 |  
+   10 | 0 | EL+OSULA | ALLOUES        |  A6 |  81 | *
+   11 | 0 |  DSNIMEN | DEMIS          |  I1 |  28 |  
+   12 | 0 | INN+NQUS | QUINTS         |  D1 |  42 |  
+   13 | 0 | NN+IEUR? | MUNIRENt       |  N8 |  72 | *
+   14 | 0 |  ISITTIE | EDITS          |  1H |  21 |  
+   15 | 0 | IIT+NEOP | POTINIER       | 12G |  72 | *
+   16 | 0 |  DVZEAET | DZETA          | 15K |  72 |  
+   17 | 0 | ETV+RWEV | EWE            |  F5 |  32 |  
+   18 | 0 | ERTVV+TC | YET            |  G5 |  31 |  
+   19 | 0 | CRTVV+UR | REVUE          | M11 |  30 |  
+   20 | 0 | CRTV+TUL | CRUEL          |  2F |  21 |  
 
-   Total: 929
 
 Rack 0: TTV
 Rack 1: TTV
+Score 0:  929
+Score 1:  929
 commande> a g
      1  2  3  4  5  6  7  8  9 10 11 12 13 14 15
  A   -  -  -  -  -  A  L  L  O  U  E  S  -  -  - 

Index: test/duplicate_explosive_variant.ref
===================================================================
RCS file: /cvsroot/eliot/eliot/test/duplicate_explosive_variant.ref,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -b -r1.3 -r1.4
--- test/duplicate_explosive_variant.ref        23 Jun 2009 21:36:33 -0000      
1.3
+++ test/duplicate_explosive_variant.ref        29 Nov 2009 16:01:33 -0000      
1.4
@@ -21,36 +21,35 @@
  N   -  -  -  U  -  -  -  I  -  V  I  D  E  R  - 
  O   F  A  U  X  -  -  -  S  -  -  -  E  -  -  - 
 commande> a p
-Eliot 1.5
+Game: player 1 out of 1
+Game: mode=Duplicate
+Game: variant=explosive
+Game: history:
+    N | P |   RACK   |    SOLUTION    | REF | PTS | BONUS
+   ===|===|==========|================|=====|=====|======
+    1 | 0 |  HSGPYEL | GLYPHES        |  H2 | 114 | *
+    2 | 0 |  OIAWEFR | FERIA          |  1D | 105 |  
+    3 | 0 | OW+HGBAE | BOGHEY         |  4C |  42 |  
+    4 | 0 | AW+EDESK | KWAS           |  2B |  51 |  
+    5 | 0 | DEE+PISA | SPEEDAIS       |  8H |  89 | *
+    6 | 0 |  OAADEIR | WEBRADIO       |  C2 |  46 |  
+    7 | 0 | A+ZTTNUE | ATTENUEZ       |  K5 | 118 | *
+    8 | 0 |  CEUIELN | GENICULE       |  E4 |  94 | *
+    9 | 0 |  TVIRETR | TREVIRAT       |  M2 |  76 | *
+   10 | 0 |  CSN?UXN | CEUX           |  4L |  50 |  
+   11 | 0 | NNS?+LOT | PLaNTONS       |  I8 |  61 | *
+   12 | 0 |  ?OUANAF | FAUX           |  O1 |  48 |  
+   13 | 0 | ANO?+RTI | NOTeRAIT       | 12B |  77 | *
+   14 | 0 |  MLIEDNO | ZOIDE          | 12K |  32 |  
+   15 | 0 | LMN+AUSE | SUA            |  I4 |  34 |  
+   16 | 0 | ELMN+ARE | LAINEE         | H10 |  31 |  
+   17 | 0 | MR+IVMEL | VIDER          | N10 |  34 |  
+   18 | 0 | LMM+QUEJ | JAUNE          |  6B |  30 |  
+   19 | 0 | LMMQ+OSM | MOS            | 10A |  27 |  
 
-Game type: Duplicate
-Player 0: Computer
-
-    N |   RACK   |    SOLUTION     | REF | PTS | P | BONUS
-   ===|==========|=================|=====|=====|===|======
-    1 |  HSGPYEL | GLYPHES         |  H2 | 114 | 0 | *
-    2 |  OIAWEFR | FERIA           |  1D | 105 | 0 |  
-    3 | OW+HGBAE | BOGHEY          |  4C |  42 | 0 |  
-    4 | AW+EDESK | KWAS            |  2B |  51 | 0 |  
-    5 | DEE+PISA | SPEEDAIS        |  8H |  89 | 0 | *
-    6 |  OAADEIR | WEBRADIO        |  C2 |  46 | 0 |  
-    7 | A+ZTTNUE | ATTENUEZ        |  K5 | 118 | 0 | *
-    8 |  CEUIELN | GENICULE        |  E4 |  94 | 0 | *
-    9 |  TVIRETR | TREVIRAT        |  M2 |  76 | 0 | *
-   10 |  CSN?UXN | CEUX            |  4L |  50 | 0 |  
-   11 | NNS?+LOT | PLaNTONS        |  I8 |  61 | 0 | *
-   12 |  ?OUANAF | FAUX            |  O1 |  48 | 0 |  
-   13 | ANO?+RTI | NOTeRAIT        | 12B |  77 | 0 | *
-   14 |  MLIEDNO | ZOIDE           | 12K |  32 | 0 |  
-   15 | LMN+AUSE | SUA             |  I4 |  34 | 0 |  
-   16 | ELMN+ARE | LAINEE          | H10 |  31 | 0 |  
-   17 | MR+IVMEL | VIDER           | N10 |  34 | 0 |  
-   18 | LMM+QUEJ | JAUNE           |  6B |  30 | 0 |  
-   19 | LMMQ+OSM | MOS             | 10A |  27 | 0 |  
-
-   Total: 1159
 
 Rack 0: LMMQ
+Score 0: 1159
 commande> q
 fin du mode duplicate
 commande> q

Index: test/duplicate_humans_ai.ref
===================================================================
RCS file: /cvsroot/eliot/eliot/test/duplicate_humans_ai.ref,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -b -r1.7 -r1.8
--- test/duplicate_humans_ai.ref        23 Jun 2009 21:36:33 -0000      1.7
+++ test/duplicate_humans_ai.ref        29 Nov 2009 16:01:33 -0000      1.8
@@ -4,38 +4,38 @@
 mode duplicate
 [?] pour l'aide
 commande> a T
-Joueur 0: ATOYDSI
-Joueur 1: ATOYDSI
-Joueur 2: ATOYDSI
+Rack 0: ATOYDSI
+Rack 1: ATOYDSI
+Rack 2: ATOYDSI
 commande> j DOSAIT H4
 commande> j DOSAIT h5
 commande> a S
-Joueur 0:   18
-Joueur 1:   14
-Joueur 2:   30
+Score 0:   18
+Score 1:   14
+Score 2:   30
 commande> a T
-Joueur 0: DIAEINS
-Joueur 1: DIAEINS
-Joueur 2: DIAEINS
+Rack 0: DI+AEINS
+Rack 1: DI+AEINS
+Rack 2: DI+AEINS
 commande> n 1
 commande> j DISAIENT 7A
 commande> a S
-Joueur 0:   18
-Joueur 1:   75
-Joueur 2:   30
+Score 0:   18
+Score 1:   75
+Score 2:   30
 commande> j DESTINAI 7E
 commande> a S
-Joueur 0:   79
-Joueur 1:   75
-Joueur 2:   93
+Score 0:   79
+Score 1:   75
+Score 2:   93
 commande> a t
 P?RBFEG
 commande> j FRaYE 5E
 commande> j BoY 5F
 commande> a S
-Joueur 0:  124
-Joueur 1:   93
-Joueur 2:  138
+Score 0:  124
+Score 1:   93
+Score 2:  138
 commande> a t
 BGPBEET
 commande> a g
@@ -56,24 +56,23 @@
  N   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
  O   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
 commande> a p
-Eliot 1.5
+Game: player 1 out of 3
+Game: mode=Duplicate
+Game: variant=unknown
+Game: history:
+    N | P |   RACK   |    SOLUTION    | REF | PTS | BONUS
+   ===|===|==========|================|=====|=====|======
+    1 | 2 |  ATOYDSI | OYATS          |  H4 |  30 |  
+    2 | 2 | DI+AEINS | DENIAISA       |  6A |  63 | *
+    3 | 0 |  P?RBFEG | FRaYE          |  5E |  45 |  
 
-Game type: Duplicate
-Player 0: Human
-Player 1: Human
-Player 2: Computer
-
-    N |   RACK   |    SOLUTION     | REF | PTS | P | BONUS
-   ===|==========|=================|=====|=====|===|======
-    1 |  ATOYDSI | OYATS           |  H4 |  30 | 2 |  
-    2 | DI+AEINS | DENIAISA        |  6A |  63 | 2 | *
-    3 |  P?RBFEG | FRaYE           |  5E |  45 | 0 |  
-
-   Total: 138
 
 Rack 0: BGP+BEET
 Rack 1: BGP+BEET
 Rack 2: BGP+BEET
+Score 0:  124
+Score 1:   93
+Score 2:  138
 commande> q
 fin du mode duplicate
 commande> q

Index: test/duplicate_invalid_turn.ref
===================================================================
RCS file: /cvsroot/eliot/eliot/test/duplicate_invalid_turn.ref,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -b -r1.3 -r1.4
--- test/duplicate_invalid_turn.ref     18 Mar 2009 18:54:41 -0000      1.3
+++ test/duplicate_invalid_turn.ref     29 Nov 2009 16:01:33 -0000      1.4
@@ -9,48 +9,46 @@
 commande> j RELIEUR 8E
 commande> j ERROR H2
 commande> a T
-Joueur 0: EEILRRU
-Joueur 1: EEILRRU
+Rack 0: EEILRRU
+Rack 1: EEILRRU
 commande> a S
-Joueur 0:    0
-Joueur 1:    0
+Score 0:    0
+Score 1:    0
 commande> a p
-Eliot 1.5
-
-Game type: Duplicate
-Player 0: Human
-Player 1: Human
-
-    N |   RACK   |    SOLUTION     | REF | PTS | P | BONUS
-   ===|==========|=================|=====|=====|===|======
+Game: player 1 out of 2
+Game: mode=Duplicate
+Game: variant=unknown
+Game: history:
+    N | P |   RACK   |    SOLUTION    | REF | PTS | BONUS
+   ===|===|==========|================|=====|=====|======
 
-   Total: 0
 
 Rack 0: EEILRRU
 Rack 1: EEILRRU
+Score 0:    0
+Score 1:    0
 commande> j RELIURE h4
 commande> j RELIEUR h4
 commande> a S
-Joueur 0:   66
-Joueur 1:   66
+Score 0:   66
+Score 1:   66
 commande> a T
-Joueur 0: GUAUVBP
-Joueur 1: GUAUVBP
+Rack 0: GUAUVBP
+Rack 1: GUAUVBP
 commande> a p
-Eliot 1.5
-
-Game type: Duplicate
-Player 0: Human
-Player 1: Human
-
-    N |   RACK   |    SOLUTION     | REF | PTS | P | BONUS
-   ===|==========|=================|=====|=====|===|======
-    1 |  EEILRRU | RELIURE         |  H4 |  66 | 0 | *
+Game: player 1 out of 2
+Game: mode=Duplicate
+Game: variant=unknown
+Game: history:
+    N | P |   RACK   |    SOLUTION    | REF | PTS | BONUS
+   ===|===|==========|================|=====|=====|======
+    1 | 0 |  EEILRRU | RELIURE        |  H4 |  66 | *
 
-   Total: 66
 
 Rack 0: GUAUVBP
 Rack 1: GUAUVBP
+Score 0:   66
+Score 1:   66
 commande> q
 fin du mode duplicate
 commande> q

Index: test/duplicate_joker_variant.ref
===================================================================
RCS file: /cvsroot/eliot/eliot/test/duplicate_joker_variant.ref,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -b -r1.2 -r1.3
--- test/duplicate_joker_variant.ref    23 Jun 2009 21:36:33 -0000      1.2
+++ test/duplicate_joker_variant.ref    29 Nov 2009 16:01:33 -0000      1.3
@@ -7,8 +7,8 @@
 AK?EZEN
 commande> j gENEZ h8
 commande> a S
-Joueur 0:   46
-Joueur 1:   48
+Score 0:   46
+Score 1:   48
 commande> a g
      1  2  3  4  5  6  7  8  9 10 11 12 13 14 15
  A   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
@@ -30,20 +30,19 @@
  A B C D  E F G H I J K L M N O P Q R S T U V W X Y Z ?
  8 2 2 3 13 2 2 2 8 1 0 5 3 5 6 2 1 6 5 6 6 2 1 1 1 1 2
 commande> a p
-Eliot 1.5
+Game: player 1 out of 2
+Game: mode=Duplicate
+Game: variant=joker
+Game: history:
+    N | P |   RACK   |    SOLUTION    | REF | PTS | BONUS
+   ===|===|==========|================|=====|=====|======
+    1 | 1 |  AK?EZEN | AKENEs         |  H3 |  48 |  
 
-Game type: Duplicate
-Player 0: Human
-Player 1: Computer
-
-    N |   RACK   |    SOLUTION     | REF | PTS | P | BONUS
-   ===|==========|=================|=====|=====|===|======
-    1 |  AK?EZEN | AKENEs          |  H3 |  48 | 1 |  
-
-   Total: 48
 
 Rack 0: Z+IL?ENT
 Rack 1: Z+IL?ENT
+Score 0:   46
+Score 1:   48
 commande> j pLANTIEZ 3f
 commande> a g
      1  2  3  4  5  6  7  8  9 10 11 12 13 14 15
@@ -66,21 +65,20 @@
  A B C D  E F G H I J K L M N O P Q R S T U V W X Y Z ?
  8 2 2 3 12 2 2 2 7 1 0 4 3 4 6 1 1 6 5 5 6 2 1 1 1 0 2
 commande> a p
-Eliot 1.5
+Game: player 1 out of 2
+Game: mode=Duplicate
+Game: variant=joker
+Game: history:
+    N | P |   RACK   |    SOLUTION    | REF | PTS | BONUS
+   ===|===|==========|================|=====|=====|======
+    1 | 1 |  AK?EZEN | AKENEs         |  H3 |  48 |  
+    2 | 0 | Z+IL?ENT | pLANTIEZ       |  3F |  86 | *
 
-Game type: Duplicate
-Player 0: Human
-Player 1: Computer
-
-    N |   RACK   |    SOLUTION     | REF | PTS | P | BONUS
-   ===|==========|=================|=====|=====|===|======
-    1 |  AK?EZEN | AKENEs          |  H3 |  48 | 1 |  
-    2 | Z+IL?ENT | pLANTIEZ        |  3F |  86 | 0 | *
-
-   Total: 134
 
 Rack 0: DEDOTC?
 Rack 1: DEDOTC?
+Score 0:  132
+Score 1:  134
 commande> j DECODaT g5
 commande> a g
      1  2  3  4  5  6  7  8  9 10 11 12 13 14 15
@@ -103,22 +101,21 @@
  A B C D  E F G H I J K L M N O P Q R S T U V W X Y Z ?
  7 2 1 1 11 2 2 2 7 1 0 4 3 4 5 1 1 6 5 4 6 2 1 1 1 0 2
 commande> a p
-Eliot 1.5
-
-Game type: Duplicate
-Player 0: Human
-Player 1: Computer
-
-    N |   RACK   |    SOLUTION     | REF | PTS | P | BONUS
-   ===|==========|=================|=====|=====|===|======
-    1 |  AK?EZEN | AKENEs          |  H3 |  48 | 1 |  
-    2 | Z+IL?ENT | pLANTIEZ        |  3F |  86 | 0 | *
-    3 |  DEDOTC? | DECODaT         |  G5 |  79 | 0 | *
+Game: player 1 out of 2
+Game: mode=Duplicate
+Game: variant=joker
+Game: history:
+    N | P |   RACK   |    SOLUTION    | REF | PTS | BONUS
+   ===|===|==========|================|=====|=====|======
+    1 | 1 |  AK?EZEN | AKENEs         |  H3 |  48 |  
+    2 | 0 | Z+IL?ENT | pLANTIEZ       |  3F |  86 | *
+    3 | 0 |  DEDOTC? | DECODaT        |  G5 |  79 | *
 
-   Total: 213
 
 Rack 0: RABEGE?
 Rack 1: RABEGE?
+Score 0:  211
+Score 1:  213
 commande> j dEPLANTIEZ 3d
 commande> a g
      1  2  3  4  5  6  7  8  9 10 11 12 13 14 15
@@ -141,23 +138,22 @@
  A B C D E F G H I J K L M N O P Q R S T U V W X Y Z ?
  6 1 1 1 9 2 1 1 7 1 0 4 3 4 5 1 1 5 5 4 6 2 1 1 1 0 2
 commande> a p
-Eliot 1.5
+Game: player 1 out of 2
+Game: mode=Duplicate
+Game: variant=joker
+Game: history:
+    N | P |   RACK   |    SOLUTION    | REF | PTS | BONUS
+   ===|===|==========|================|=====|=====|======
+    1 | 1 |  AK?EZEN | AKENEs         |  H3 |  48 |  
+    2 | 0 | Z+IL?ENT | pLANTIEZ       |  3F |  86 | *
+    3 | 0 |  DEDOTC? | DECODaT        |  G5 |  79 | *
+    4 | 1 |  RABEGE? | hEBERGEA       |  L2 |  72 | *
 
-Game type: Duplicate
-Player 0: Human
-Player 1: Computer
-
-    N |   RACK   |    SOLUTION     | REF | PTS | P | BONUS
-   ===|==========|=================|=====|=====|===|======
-    1 |  AK?EZEN | AKENEs          |  H3 |  48 | 1 |  
-    2 | Z+IL?ENT | pLANTIEZ        |  3F |  86 | 0 | *
-    3 |  DEDOTC? | DECODaT         |  G5 |  79 | 0 | *
-    4 |  RABEGE? | hEBERGEA        |  L2 |  72 | 1 | *
-
-   Total: 285
 
 Rack 0: X?MFETR
 Rack 1: X?MFETR
+Score 0:  231
+Score 1:  285
 commande> h p
 commande> a g
      1  2  3  4  5  6  7  8  9 10 11 12 13 14 15
@@ -177,22 +173,21 @@
  N   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
  O   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
 commande> a p
-Eliot 1.5
-
-Game type: Duplicate
-Player 0: Human
-Player 1: Computer
-
-    N |   RACK   |    SOLUTION     | REF | PTS | P | BONUS
-   ===|==========|=================|=====|=====|===|======
-    1 |  AK?EZEN | AKENEs          |  H3 |  48 | 1 |  
-    2 | Z+IL?ENT | pLANTIEZ        |  3F |  86 | 0 | *
-    3 |  DEDOTC? | DECODaT         |  G5 |  79 | 0 | *
+Game: player 1 out of 2
+Game: mode=Duplicate
+Game: variant=joker
+Game: history:
+    N | P |   RACK   |    SOLUTION    | REF | PTS | BONUS
+   ===|===|==========|================|=====|=====|======
+    1 | 1 |  AK?EZEN | AKENEs         |  H3 |  48 |  
+    2 | 0 | Z+IL?ENT | pLANTIEZ       |  3F |  86 | *
+    3 | 0 |  DEDOTC? | DECODaT        |  G5 |  79 | *
 
-   Total: 213
 
 Rack 0: RABEGE?
 Rack 1: RABEGE?
+Score 0:  211
+Score 1:  213
 commande> h p
 commande> a g
      1  2  3  4  5  6  7  8  9 10 11 12 13 14 15
@@ -212,21 +207,20 @@
  N   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
  O   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
 commande> a p
-Eliot 1.5
-
-Game type: Duplicate
-Player 0: Human
-Player 1: Computer
-
-    N |   RACK   |    SOLUTION     | REF | PTS | P | BONUS
-   ===|==========|=================|=====|=====|===|======
-    1 |  AK?EZEN | AKENEs          |  H3 |  48 | 1 |  
-    2 | Z+IL?ENT | pLANTIEZ        |  3F |  86 | 0 | *
+Game: player 1 out of 2
+Game: mode=Duplicate
+Game: variant=joker
+Game: history:
+    N | P |   RACK   |    SOLUTION    | REF | PTS | BONUS
+   ===|===|==========|================|=====|=====|======
+    1 | 1 |  AK?EZEN | AKENEs         |  H3 |  48 |  
+    2 | 0 | Z+IL?ENT | pLANTIEZ       |  3F |  86 | *
 
-   Total: 134
 
 Rack 0: DEDOTC?
 Rack 1: DEDOTC?
+Score 0:  132
+Score 1:  134
 commande> a l
  A B C D  E F G H I J K L M N O P Q R S T U V W X Y Z ?
  8 2 2 3 12 2 2 2 7 1 0 4 3 4 6 1 1 6 5 5 6 2 1 1 1 0 2

Index: test/duplicate_navigation.ref
===================================================================
RCS file: /cvsroot/eliot/eliot/test/duplicate_navigation.ref,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -b -r1.2 -r1.3
--- test/duplicate_navigation.ref       23 Jun 2009 21:36:33 -0000      1.2
+++ test/duplicate_navigation.ref       29 Nov 2009 16:01:33 -0000      1.3
@@ -24,21 +24,20 @@
  N   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
  O   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
 commande> a p
-Eliot 1.5
+Game: player 2 out of 3
+Game: mode=Duplicate
+Game: variant=unknown
+Game: history:
+    N | P |   RACK   |    SOLUTION    | REF | PTS | BONUS
+   ===|===|==========|================|=====|=====|======
 
-Game type: Duplicate
-Player 0: Human
-Player 1: Human
-Player 2: Computer
-
-    N |   RACK   |    SOLUTION     | REF | PTS | P | BONUS
-   ===|==========|=================|=====|=====|===|======
-
-   Total: 0
 
 Rack 0: JL
 Rack 1: IMEJVSL
 Rack 2: IMEJVSL
+Score 0:   26
+Score 1:    0
+Score 2:    0
 commande> h p
 commande> a g
      1  2  3  4  5  6  7  8  9 10 11 12 13 14 15
@@ -58,21 +57,20 @@
  N   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
  O   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
 commande> a p
-Eliot 1.5
-
-Game type: Duplicate
-Player 0: Human
-Player 1: Human
-Player 2: Computer
+Game: player 2 out of 3
+Game: mode=Duplicate
+Game: variant=unknown
+Game: history:
+    N | P |   RACK   |    SOLUTION    | REF | PTS | BONUS
+   ===|===|==========|================|=====|=====|======
 
-    N |   RACK   |    SOLUTION     | REF | PTS | P | BONUS
-   ===|==========|=================|=====|=====|===|======
-
-   Total: 0
 
 Rack 0: IMEJVSL
 Rack 1: IMEJVSL
 Rack 2: IMEJVSL
+Score 0:    0
+Score 1:    0
+Score 2:    0
 commande> h n
 commande> a g
      1  2  3  4  5  6  7  8  9 10 11 12 13 14 15
@@ -92,21 +90,20 @@
  N   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
  O   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
 commande> a p
-Eliot 1.5
-
-Game type: Duplicate
-Player 0: Human
-Player 1: Human
-Player 2: Computer
-
-    N |   RACK   |    SOLUTION     | REF | PTS | P | BONUS
-   ===|==========|=================|=====|=====|===|======
+Game: player 2 out of 3
+Game: mode=Duplicate
+Game: variant=unknown
+Game: history:
+    N | P |   RACK   |    SOLUTION    | REF | PTS | BONUS
+   ===|===|==========|================|=====|=====|======
 
-   Total: 0
 
 Rack 0: JL
 Rack 1: IMEJVSL
 Rack 2: IMEJVSL
+Score 0:   26
+Score 1:    0
+Score 2:    0
 commande> j JE h8
 commande> a g
      1  2  3  4  5  6  7  8  9 10 11 12 13 14 15
@@ -126,22 +123,21 @@
  N   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
  O   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
 commande> a p
-Eliot 1.5
+Game: player 1 out of 3
+Game: mode=Duplicate
+Game: variant=unknown
+Game: history:
+    N | P |   RACK   |    SOLUTION    | REF | PTS | BONUS
+   ===|===|==========|================|=====|=====|======
+    1 | 0 |  IMEJVSL | VIMES          |  H4 |  26 |  
 
-Game type: Duplicate
-Player 0: Human
-Player 1: Human
-Player 2: Computer
-
-    N |   RACK   |    SOLUTION     | REF | PTS | P | BONUS
-   ===|==========|=================|=====|=====|===|======
-    1 |  IMEJVSL | VIMES           |  H4 |  26 | 0 |  
-
-   Total: 26
 
 Rack 0: JL+NHAYG
 Rack 1: JL+NHAYG
 Rack 2: JL+NHAYG
+Score 0:   26
+Score 1:   18
+Score 2:   26
 commande> h p
 commande> a g
      1  2  3  4  5  6  7  8  9 10 11 12 13 14 15
@@ -161,21 +157,20 @@
  N   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
  O   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
 commande> a p
-Eliot 1.5
-
-Game type: Duplicate
-Player 0: Human
-Player 1: Human
-Player 2: Computer
-
-    N |   RACK   |    SOLUTION     | REF | PTS | P | BONUS
-   ===|==========|=================|=====|=====|===|======
+Game: player 1 out of 3
+Game: mode=Duplicate
+Game: variant=unknown
+Game: history:
+    N | P |   RACK   |    SOLUTION    | REF | PTS | BONUS
+   ===|===|==========|================|=====|=====|======
 
-   Total: 0
 
 Rack 0: IMEJVSL
 Rack 1: IMEJVSL
 Rack 2: IMEJVSL
+Score 0:    0
+Score 1:    0
+Score 2:    0
 commande> h n
 commande> a g
      1  2  3  4  5  6  7  8  9 10 11 12 13 14 15
@@ -195,32 +190,31 @@
  N   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
  O   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
 commande> a p
-Eliot 1.5
+Game: player 1 out of 3
+Game: mode=Duplicate
+Game: variant=unknown
+Game: history:
+    N | P |   RACK   |    SOLUTION    | REF | PTS | BONUS
+   ===|===|==========|================|=====|=====|======
+    1 | 0 |  IMEJVSL | VIMES          |  H4 |  26 |  
 
-Game type: Duplicate
-Player 0: Human
-Player 1: Human
-Player 2: Computer
-
-    N |   RACK   |    SOLUTION     | REF | PTS | P | BONUS
-   ===|==========|=================|=====|=====|===|======
-    1 |  IMEJVSL | VIMES           |  H4 |  26 | 0 |  
-
-   Total: 26
 
 Rack 0: JL+NHAYG
 Rack 1: JL+NHAYG
 Rack 2: JL+NHAYG
+Score 0:   26
+Score 1:   18
+Score 2:   26
 commande> n 1
 commande> j JAN g7
 commande> a T
-Joueur 0: JLNHAYG
-Joueur 1: GHLY
-Joueur 2: JLNHAYG
+Rack 0: JL+NHAYG
+Rack 1: GHLY
+Rack 2: JL+NHAYG
 commande> a S
-Joueur 0:   26
-Joueur 1:   56
-Joueur 2:   26
+Score 0:   26
+Score 1:   56
+Score 2:   26
 commande> h r
 commande> a g
      1  2  3  4  5  6  7  8  9 10 11 12 13 14 15
@@ -240,22 +234,21 @@
  N   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
  O   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
 commande> a p
-Eliot 1.5
-
-Game type: Duplicate
-Player 0: Human
-Player 1: Human
-Player 2: Computer
-
-    N |   RACK   |    SOLUTION     | REF | PTS | P | BONUS
-   ===|==========|=================|=====|=====|===|======
-    1 |  IMEJVSL | VIMES           |  H4 |  26 | 0 |  
+Game: player 1 out of 3
+Game: mode=Duplicate
+Game: variant=unknown
+Game: history:
+    N | P |   RACK   |    SOLUTION    | REF | PTS | BONUS
+   ===|===|==========|================|=====|=====|======
+    1 | 0 |  IMEJVSL | VIMES          |  H4 |  26 |  
 
-   Total: 26
 
 Rack 0: JL+NHAYG
 Rack 1: GHLY
 Rack 2: JL+NHAYG
+Score 0:   26
+Score 1:   56
+Score 2:   26
 commande> j AH i6
 commande> a g
      1  2  3  4  5  6  7  8  9 10 11 12 13 14 15
@@ -275,23 +268,22 @@
  N   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
  O   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
 commande> a p
-Eliot 1.5
-
-Game type: Duplicate
-Player 0: Human
-Player 1: Human
-Player 2: Computer
-
-    N |   RACK   |    SOLUTION     | REF | PTS | P | BONUS
-   ===|==========|=================|=====|=====|===|======
-    1 |  IMEJVSL | VIMES           |  H4 |  26 | 0 |  
-    2 | JL+NHAYG | JAN             |  G7 |  38 | 1 |  
+Game: player 1 out of 3
+Game: mode=Duplicate
+Game: variant=unknown
+Game: history:
+    N | P |   RACK   |    SOLUTION    | REF | PTS | BONUS
+   ===|===|==========|================|=====|=====|======
+    1 | 0 |  IMEJVSL | VIMES          |  H4 |  26 |  
+    2 | 1 | JL+NHAYG | JAN            |  G7 |  38 |  
 
-   Total: 64
 
 Rack 0: GHLY+ELA
 Rack 1: GHLY+ELA
 Rack 2: GHLY+ELA
+Score 0:   47
+Score 1:   56
+Score 2:   64
 commande> j AY f9
 commande> a g
      1  2  3  4  5  6  7  8  9 10 11 12 13 14 15
@@ -311,27 +303,26 @@
  N   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
  O   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
 commande> a p
-Eliot 1.5
+Game: player 2 out of 3
+Game: mode=Duplicate
+Game: variant=unknown
+Game: history:
+    N | P |   RACK   |    SOLUTION    | REF | PTS | BONUS
+   ===|===|==========|================|=====|=====|======
+    1 | 0 |  IMEJVSL | VIMES          |  H4 |  26 |  
+    2 | 1 | JL+NHAYG | JAN            |  G7 |  38 |  
 
-Game type: Duplicate
-Player 0: Human
-Player 1: Human
-Player 2: Computer
-
-    N |   RACK   |    SOLUTION     | REF | PTS | P | BONUS
-   ===|==========|=================|=====|=====|===|======
-    1 |  IMEJVSL | VIMES           |  H4 |  26 | 0 |  
-    2 | JL+NHAYG | JAN             |  G7 |  38 | 1 |  
-
-   Total: 64
 
 Rack 0: EGHLL
 Rack 1: GHLY+ELA
 Rack 2: GHLY+ELA
+Score 0:   80
+Score 1:   56
+Score 2:   64
 commande> a S
-Joueur 0:   80
-Joueur 1:   56
-Joueur 2:   64
+Score 0:   80
+Score 1:   56
+Score 2:   64
 commande> h f
 commande> a g
      1  2  3  4  5  6  7  8  9 10 11 12 13 14 15
@@ -351,21 +342,20 @@
  N   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
  O   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
 commande> a p
-Eliot 1.5
-
-Game type: Duplicate
-Player 0: Human
-Player 1: Human
-Player 2: Computer
-
-    N |   RACK   |    SOLUTION     | REF | PTS | P | BONUS
-   ===|==========|=================|=====|=====|===|======
+Game: player 2 out of 3
+Game: mode=Duplicate
+Game: variant=unknown
+Game: history:
+    N | P |   RACK   |    SOLUTION    | REF | PTS | BONUS
+   ===|===|==========|================|=====|=====|======
 
-   Total: 0
 
 Rack 0: IMEJVSL
 Rack 1: IMEJVSL
 Rack 2: IMEJVSL
+Score 0:    0
+Score 1:    0
+Score 2:    0
 commande> h n
 commande> a g
      1  2  3  4  5  6  7  8  9 10 11 12 13 14 15
@@ -385,22 +375,21 @@
  N   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
  O   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
 commande> a p
-Eliot 1.5
+Game: player 2 out of 3
+Game: mode=Duplicate
+Game: variant=unknown
+Game: history:
+    N | P |   RACK   |    SOLUTION    | REF | PTS | BONUS
+   ===|===|==========|================|=====|=====|======
+    1 | 0 |  IMEJVSL | VIMES          |  H4 |  26 |  
 
-Game type: Duplicate
-Player 0: Human
-Player 1: Human
-Player 2: Computer
-
-    N |   RACK   |    SOLUTION     | REF | PTS | P | BONUS
-   ===|==========|=================|=====|=====|===|======
-    1 |  IMEJVSL | VIMES           |  H4 |  26 | 0 |  
-
-   Total: 26
 
 Rack 0: JL+NHAYG
 Rack 1: JL+NHAYG
 Rack 2: JL+NHAYG
+Score 0:   26
+Score 1:   18
+Score 2:   26
 commande> h l
 commande> a g
      1  2  3  4  5  6  7  8  9 10 11 12 13 14 15
@@ -420,23 +409,22 @@
  N   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
  O   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
 commande> a p
-Eliot 1.5
-
-Game type: Duplicate
-Player 0: Human
-Player 1: Human
-Player 2: Computer
-
-    N |   RACK   |    SOLUTION     | REF | PTS | P | BONUS
-   ===|==========|=================|=====|=====|===|======
-    1 |  IMEJVSL | VIMES           |  H4 |  26 | 0 |  
-    2 | JL+NHAYG | JAN             |  G7 |  38 | 1 |  
+Game: player 2 out of 3
+Game: mode=Duplicate
+Game: variant=unknown
+Game: history:
+    N | P |   RACK   |    SOLUTION    | REF | PTS | BONUS
+   ===|===|==========|================|=====|=====|======
+    1 | 0 |  IMEJVSL | VIMES          |  H4 |  26 |  
+    2 | 1 | JL+NHAYG | JAN            |  G7 |  38 |  
 
-   Total: 64
 
 Rack 0: EGHLL
 Rack 1: GHLY+ELA
 Rack 2: GHLY+ELA
+Score 0:   80
+Score 1:   56
+Score 2:   64
 commande> h p
 commande> a g
      1  2  3  4  5  6  7  8  9 10 11 12 13 14 15
@@ -456,23 +444,22 @@
  N   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
  O   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
 commande> a p
-Eliot 1.5
-
-Game type: Duplicate
-Player 0: Human
-Player 1: Human
-Player 2: Computer
-
-    N |   RACK   |    SOLUTION     | REF | PTS | P | BONUS
-   ===|==========|=================|=====|=====|===|======
-    1 |  IMEJVSL | VIMES           |  H4 |  26 | 0 |  
-    2 | JL+NHAYG | JAN             |  G7 |  38 | 1 |  
+Game: player 2 out of 3
+Game: mode=Duplicate
+Game: variant=unknown
+Game: history:
+    N | P |   RACK   |    SOLUTION    | REF | PTS | BONUS
+   ===|===|==========|================|=====|=====|======
+    1 | 0 |  IMEJVSL | VIMES          |  H4 |  26 |  
+    2 | 1 | JL+NHAYG | JAN            |  G7 |  38 |  
 
-   Total: 64
 
 Rack 0: GHLY+ELA
 Rack 1: GHLY+ELA
 Rack 2: GHLY+ELA
+Score 0:   47
+Score 1:   56
+Score 2:   64
 commande> h p
 commande> a g
      1  2  3  4  5  6  7  8  9 10 11 12 13 14 15
@@ -492,22 +479,21 @@
  N   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
  O   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
 commande> a p
-Eliot 1.5
+Game: player 2 out of 3
+Game: mode=Duplicate
+Game: variant=unknown
+Game: history:
+    N | P |   RACK   |    SOLUTION    | REF | PTS | BONUS
+   ===|===|==========|================|=====|=====|======
+    1 | 0 |  IMEJVSL | VIMES          |  H4 |  26 |  
 
-Game type: Duplicate
-Player 0: Human
-Player 1: Human
-Player 2: Computer
-
-    N |   RACK   |    SOLUTION     | REF | PTS | P | BONUS
-   ===|==========|=================|=====|=====|===|======
-    1 |  IMEJVSL | VIMES           |  H4 |  26 | 0 |  
-
-   Total: 26
 
 Rack 0: JL+NHAYG
 Rack 1: JL+NHAYG
 Rack 2: JL+NHAYG
+Score 0:   26
+Score 1:   18
+Score 2:   26
 commande> j JAN g7
 Cannot add a command to an old turn
 commande> h r
@@ -529,22 +515,21 @@
  N   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
  O   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
 commande> a p
-Eliot 1.5
-
-Game type: Duplicate
-Player 0: Human
-Player 1: Human
-Player 2: Computer
-
-    N |   RACK   |    SOLUTION     | REF | PTS | P | BONUS
-   ===|==========|=================|=====|=====|===|======
-    1 |  IMEJVSL | VIMES           |  H4 |  26 | 0 |  
+Game: player 2 out of 3
+Game: mode=Duplicate
+Game: variant=unknown
+Game: history:
+    N | P |   RACK   |    SOLUTION    | REF | PTS | BONUS
+   ===|===|==========|================|=====|=====|======
+    1 | 0 |  IMEJVSL | VIMES          |  H4 |  26 |  
 
-   Total: 26
 
 Rack 0: JL+NHAYG
 Rack 1: JL+NHAYG
 Rack 2: JL+NHAYG
+Score 0:   26
+Score 1:   18
+Score 2:   26
 commande> j JAN g7
 commande> j JE 7G
 commande> a g
@@ -565,23 +550,22 @@
  N   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
  O   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
 commande> a p
-Eliot 1.5
-
-Game type: Duplicate
-Player 0: Human
-Player 1: Human
-Player 2: Computer
-
-    N |   RACK   |    SOLUTION     | REF | PTS | P | BONUS
-   ===|==========|=================|=====|=====|===|======
-    1 |  IMEJVSL | VIMES           |  H4 |  26 | 0 |  
-    2 | JL+NHAYG | JAN             |  G7 |  38 | 1 |  
+Game: player 1 out of 3
+Game: mode=Duplicate
+Game: variant=unknown
+Game: history:
+    N | P |   RACK   |    SOLUTION    | REF | PTS | BONUS
+   ===|===|==========|================|=====|=====|======
+    1 | 0 |  IMEJVSL | VIMES          |  H4 |  26 |  
+    2 | 1 | JL+NHAYG | JAN            |  G7 |  38 |  
 
-   Total: 64
 
 Rack 0: GHLY+ITA
 Rack 1: GHLY+ITA
 Rack 2: GHLY+ITA
+Score 0:   43
+Score 1:   56
+Score 2:   64
 commande> q
 fin du mode duplicate
 commande> q

Index: test/duplicate_no_point.ref
===================================================================
RCS file: /cvsroot/eliot/eliot/test/duplicate_no_point.ref,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -b -r1.2 -r1.3
--- test/duplicate_no_point.ref 23 Jun 2009 21:36:33 -0000      1.2
+++ test/duplicate_no_point.ref 29 Nov 2009 16:01:33 -0000      1.3
@@ -9,26 +9,25 @@
 commande> j XXX a1
 commande> j ay h8
 commande> a T
-Joueur 0: AAENTUL
-Joueur 1: AAENTUL
+Rack 0: AAENT+UL
+Rack 1: AAENT+UL
 commande> a S
-Joueur 0:    0
-Joueur 1:    0
+Score 0:    0
+Score 1:    0
 commande> a p
-Eliot 1.5
-
-Game type: Duplicate
-Player 0: Human
-Player 1: Human
-
-    N |   RACK   |    SOLUTION     | REF | PTS | P | BONUS
-   ===|==========|=================|=====|=====|===|======
-    1 |  ATNE??A | ay              |  H8 |   0 | 1 |  
+Game: player 1 out of 2
+Game: mode=Duplicate
+Game: variant=unknown
+Game: history:
+    N | P |   RACK   |    SOLUTION    | REF | PTS | BONUS
+   ===|===|==========|================|=====|=====|======
+    1 | 1 |  ATNE??A | ay             |  H8 |   0 |  
 
-   Total: 0
 
 Rack 0: AAENT+UL
 Rack 1: AAENT+UL
+Score 0:    0
+Score 1:    0
 commande> a g
      1  2  3  4  5  6  7  8  9 10 11 12 13 14 15
  A   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 

Index: test/freegame_3_ai.ref
===================================================================
RCS file: /cvsroot/eliot/eliot/test/freegame_3_ai.ref,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -b -r1.7 -r1.8
--- test/freegame_3_ai.ref      23 Jun 2009 21:36:33 -0000      1.7
+++ test/freegame_3_ai.ref      29 Nov 2009 16:01:33 -0000      1.8
@@ -4,46 +4,45 @@
 mode partie libre
 [?] pour l'aide
 commande> a T
-Joueur 0: KSROCT
-Joueur 1: 
-Joueur 2: DIUDGEA
+Rack 0: KS+ROCT
+Rack 1: 
+Rack 2: DIU+DGEA
 commande> a S
-Joueur 0:  296
-Joueur 1:  362
-Joueur 2:  263
+Score 0:  296
+Score 1:  362
+Score 2:  263
 commande> a p
-Eliot 1.5
-
-Game type: Free game
-Player 0: Computer
-Player 1: Computer
-Player 2: Computer
-
-    N |   RACK   |    SOLUTION     | REF | PTS | P | BONUS
-   ===|==========|=================|=====|=====|===|======
-    1 |  RAHITRD | HARDI           |  H4 |  26 | 0 |  
-    2 |  ?TIEXFA | FAXAIEnT        |  5E | 126 | 1 | *
-    3 |  ATOSBUF | BOUTEFAS        |  J1 |  73 | 2 | *
-    4 | RT+AREEN | ENTERRAI        |  8A |  77 | 0 | *
-    5 |  RZUGNSS | AZURS           |  F5 |  34 | 1 |  
-    6 |  MIMLLOP | PLOMB           |  1F |  30 | 2 |  
-    7 |  EEMNETV | VETEMENT        |  C6 |  78 | 0 | *
-    8 | GNRS+PEN | PURGES          |  3I |  24 | 1 |  
-    9 | ILM+HSVI | VIS             | 14A |  25 | 2 |  
-   10 |  AWELOUB | BAVE            | A12 |  36 | 0 |  
-   11 | NN+ELEEE | SELENE          |  8J |  21 | 1 |  
-   12 | HILM+?IC | aLCHIMIE        |  A1 | 101 | 2 | *
-   13 | LOUW+ULS | SLOW            |  N3 |  33 | 0 |  
-   14 | EN+STAAI | NANTAISE        |  N8 |  70 | 1 | *
-   15 |  DIJUUYO | JOYAU           | 12K |  44 | 2 |  
-   16 | LSUU+KAQ | AUQUEL          | 15J |  63 | 0 |  
-   17 |  OENIREN | NERONIEN        | 10G |  60 | 1 | *
+Game: player 2 out of 3
+Game: mode=Free game
+Game: variant=unknown
+Game: history:
+    N | P |   RACK   |    SOLUTION    | REF | PTS | BONUS
+   ===|===|==========|================|=====|=====|======
+    1 | 0 |  RAHITRD | HARDI          |  H4 |  26 |  
+    2 | 1 |  ?TIEXFA | FAXAIEnT       |  5E | 126 | *
+    3 | 2 |  ATOSBUF | BOUTEFAS       |  J1 |  73 | *
+    4 | 0 | RT+AREEN | ENTERRAI       |  8A |  77 | *
+    5 | 1 |  RZUGNSS | AZURS          |  F5 |  34 |  
+    6 | 2 |  MIMLLOP | PLOMB          |  1F |  30 |  
+    7 | 0 |  EEMNETV | VETEMENT       |  C6 |  78 | *
+    8 | 1 | GNRS+PEN | PURGES         |  3I |  24 |  
+    9 | 2 | ILM+HSVI | VIS            | 14A |  25 |  
+   10 | 0 |  AWELOUB | BAVE           | A12 |  36 |  
+   11 | 1 | NN+ELEEE | SELENE         |  8J |  21 |  
+   12 | 2 | HILM+?IC | aLCHIMIE       |  A1 | 101 | *
+   13 | 0 | LOUW+ULS | SLOW           |  N3 |  33 |  
+   14 | 1 | EN+STAAI | NANTAISE       |  N8 |  70 | *
+   15 | 2 |  DIJUUYO | JOYAU          | 12K |  44 |  
+   16 | 0 | LSUU+KAQ | AUQUEL         | 15J |  63 |  
+   17 | 1 |  OENIREN | NERONIEN       | 10G |  60 | *
 
-   Total: 921
 
 Rack 0: KS+ROCT
 Rack 1: 
 Rack 2: DIU+DGEA
+Score 0:  296
+Score 1:  362
+Score 2:  263
 commande> a g
      1  2  3  4  5  6  7  8  9 10 11 12 13 14 15
  A   a  L  C  H  I  M  I  E  -  -  -  B  A  V  E 

Index: test/freegame_change.ref
===================================================================
RCS file: /cvsroot/eliot/eliot/test/freegame_change.ref,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -b -r1.4 -r1.5
--- test/freegame_change.ref    23 Nov 2008 08:33:16 -0000      1.4
+++ test/freegame_change.ref    29 Nov 2009 16:01:33 -0000      1.5
@@ -4,46 +4,45 @@
 mode partie libre
 [?] pour l'aide
 commande> a T
-Joueur 0: JNNEDEI
-Joueur 1: TLAEOWA
+Rack 0: JNNEDEI
+Rack 1: TLAEOWA
 commande> p JID
 commande> a T
-Joueur 0: EENNMEN
-Joueur 1: TLAEOWA
+Rack 0: EENN+MEN
+Rack 1: TLAEOWA
 commande> p aowalt
 commande> a T
-Joueur 0: EENNMEN
-Joueur 1: EEEGAIS
+Rack 0: EENN+MEN
+Rack 1: E+EEGAIS
 commande> p MA
 commande> a T
-Joueur 0: EENNMEN
-Joueur 1: EEEGAIS
+Rack 0: EENN+MEN
+Rack 1: E+EEGAIS
 commande> p MN
 commande> a T
-Joueur 0: EEENNER
-Joueur 1: EEEGAIS
+Rack 0: EEENN+ER
+Rack 1: E+EEGAIS
 commande> p SGEEEAI
 commande> a T
-Joueur 0: EEENNER
-Joueur 1: HAAUAUO
+Rack 0: EEENN+ER
+Rack 1: HAAUAUO
 commande> a p
-Eliot 1.5
-
-Game type: Free game
-Player 0: Human
-Player 1: Human
-
-    N |   RACK   |    SOLUTION     | REF | PTS | P | BONUS
-   ===|==========|=================|=====|=====|===|======
-    1 |  JNNEDEI | (-JID)          |  -  |   0 | 0 |
-    2 |  TLAEOWA | (-AOWALT)       |  -  |   0 | 1 |
-    3 | EENN+MEN | (-MN)           |  -  |   0 | 0 |
-    4 | E+EEGAIS | (-SGEEEAI)      |  -  |   0 | 1 |
+Game: player 1 out of 2
+Game: mode=Free game
+Game: variant=unknown
+Game: history:
+    N | P |   RACK   |    SOLUTION    | REF | PTS | BONUS
+   ===|===|==========|================|=====|=====|======
+    1 | 0 |  JNNEDEI | [JID]          |  -  |   0 |  
+    2 | 1 |  TLAEOWA | [AOWALT]       |  -  |   0 |  
+    3 | 0 | EENN+MEN | [MN]           |  -  |   0 |  
+    4 | 1 | E+EEGAIS | [SGEEEAI]      |  -  |   0 |  
 
-   Total: 0
 
 Rack 0: EEENN+ER
 Rack 1: HAAUAUO
+Score 0:    0
+Score 1:    0
 commande> q
 fin du mode partie libre
 commande> q

Index: test/freegame_explosive_variant.ref
===================================================================
RCS file: /cvsroot/eliot/eliot/test/freegame_explosive_variant.ref,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -b -r1.3 -r1.4
--- test/freegame_explosive_variant.ref 23 Jun 2009 21:36:33 -0000      1.3
+++ test/freegame_explosive_variant.ref 29 Nov 2009 16:01:33 -0000      1.4
@@ -4,8 +4,8 @@
 mode partie libre
 [?] pour l'aide
 commande> a T
-Joueur 0: ETUDALN
-Joueur 1: HMIRCES
+Rack 0: ETUDALN
+Rack 1: HMIRCES
 commande> j ADULENT h3
 commande> a g
      1  2  3  4  5  6  7  8  9 10 11 12 13 14 15
@@ -25,8 +25,8 @@
  N   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
  O   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
 commande> a T
-Joueur 0: XRAETEL
-Joueur 1: UEQNIKN
+Rack 0: XRAETEL
+Rack 1: UEQNIKN
 commande> j EXULTERA 5f
 commande> a g
      1  2  3  4  5  6  7  8  9 10 11 12 13 14 15
@@ -46,8 +46,8 @@
  N   -  -  -  N  I  Q  U  E  -  -  -  -  -  -  - 
  O   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
 commande> a T
-Joueur 0: DITTSAE
-Joueur 1: KNPRRJE
+Rack 0: DITTSAE
+Rack 1: KN+PRRJE
 commande> j EDITATES F5
 commande> a gm
      1  2  3  4  5  6  7  8  9 10 11 12 13 14 15
@@ -67,8 +67,8 @@
  N   -  #  -  N  I  Q  U  E  -  *  -  -  -  #  -
  O   @  -  -  +  -  -  -  R  -  -  -  +  -  -  @
 commande> a T
-Joueur 0: ERIMASG
-Joueur 1: NPVRNOE
+Rack 0: ERIMASG
+Rack 1: NP+VRNOE
 commande> j EGERMAIS 11d
 commande> a g
      1  2  3  4  5  6  7  8  9 10 11 12 13 14 15
@@ -88,30 +88,29 @@
  N   -  -  -  N  I  Q  U  E  -  -  -  -  -  -  - 
  O   -  -  -  -  -  -  -  R  -  -  -  -  -  -  - 
 commande> a S
-Joueur 0:  309
-Joueur 1:  248
+Score 0:  309
+Score 1:  248
 commande> a p
-Eliot 1.5
+Game: player 1 out of 2
+Game: mode=Free game
+Game: variant=explosive
+Game: history:
+    N | P |   RACK   |    SOLUTION    | REF | PTS | BONUS
+   ===|===|==========|================|=====|=====|======
+    1 | 0 |  ETUDALN | ADULENT        |  H3 |  70 | *
+    2 | 1 |  HMIRCES | CHARISME       |  3F |  88 | *
+    3 | 0 |  XRAETEL | EXULTERA       |  5F |  84 | *
+    4 | 1 |  UEQNIKN | NIQUE          |  N4 |  46 |  
+    5 | 0 |  DITTSAE | EDITATES       |  F5 |  65 | *
+    6 | 1 | KN+PRRJE | JERKER         |  8J |  69 |  
+    7 | 0 |  ERIMASG | EGERMAIS       | 11D |  90 | *
+    8 | 1 | NP+VRNOE | PREVOT         |  8A |  45 |  
 
-Game type: Free game
-Player 0: Human
-Player 1: Computer
-
-    N |   RACK   |    SOLUTION     | REF | PTS | P | BONUS
-   ===|==========|=================|=====|=====|===|======
-    1 |  ETUDALN | ADULENT         |  H3 |  70 | 0 | *
-    2 |  HMIRCES | CHARISME        |  3F |  88 | 1 | *
-    3 |  XRAETEL | EXULTERA        |  5F |  84 | 0 | *
-    4 |  UEQNIKN | NIQUE           |  N4 |  46 | 1 |  
-    5 |  DITTSAE | EDITATES        |  F5 |  65 | 0 | *
-    6 | KN+PRRJE | JERKER          |  8J |  69 | 1 |  
-    7 |  ERIMASG | EGERMAIS        | 11D |  90 | 0 | *
-    8 | NP+VRNOE | PREVOT          |  8A |  45 | 1 |  
-
-   Total: 557
 
 Rack 0: LANBDII
 Rack 1: NN+ITEGU
+Score 0:  309
+Score 1:  248
 commande> q
 fin du mode partie libre
 commande> q

Index: test/freegame_joker_variant.ref
===================================================================
RCS file: /cvsroot/eliot/eliot/test/freegame_joker_variant.ref,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -b -r1.2 -r1.3
--- test/freegame_joker_variant.ref     23 Jun 2009 21:36:33 -0000      1.2
+++ test/freegame_joker_variant.ref     29 Nov 2009 16:01:33 -0000      1.3
@@ -4,8 +4,8 @@
 mode partie libre
 [?] pour l'aide
 commande> a T
-Joueur 0: ?AAUGOE
-Joueur 1: EP?TFTI
+Rack 0: ?AAUGOE
+Rack 1: EP?TFTI
 commande> p
 commande> p
 commande> p
@@ -32,29 +32,28 @@
  A B C D  E F G H I J K L M N O P Q R S T U V W X Y Z ?
  6 0 1 2 11 1 2 2 6 1 1 5 2 5 5 1 1 3 4 4 5 1 0 1 1 1 2
 commande> a p
-Eliot 1.5
+Game: player 1 out of 2
+Game: mode=Free game
+Game: variant=joker
+Game: history:
+    N | P |   RACK   |    SOLUTION    | REF | PTS | BONUS
+   ===|===|==========|================|=====|=====|======
+    1 | 0 |  ?AAUGOE | (PASS)         |  -  |   0 |  
+    2 | 1 |  EP?TFTI | FrIPE          |  H4 |  26 |  
+    3 | 0 |  AAEGOU? | (PASS)         |  -  |   0 |  
+    4 | 1 | TT+EB?AN | BATEReNT       |  5D |  86 | *
+    5 | 0 |  AAEGOU? | (PASS)         |  -  |   0 |  
+    6 | 1 |  RCWV?AB | WeB            |  9G |  36 |  
+    7 | 0 |  AAEGOU? | (PASS)         |  -  |   0 |  
+    8 | 1 | ACRV+SA? | VAiNCRAS       |  J2 |  91 | *
+    9 | 0 |  AAEGOU? | (PASS)         |  -  |   0 |  
+   10 | 1 |  USOM?DM | MOrDUS         | 10C |  34 |  
 
-Game type: Free game
-Player 0: Human
-Player 1: Computer
-
-    N |   RACK   |    SOLUTION     | REF | PTS | P | BONUS
-   ===|==========|=================|=====|=====|===|======
-    1 |  ?AAUGOE | (PASS)          |  -  |   0 | 0 |
-    2 |  EP?TFTI | FrIPE           |  H4 |  26 | 1 |  
-    3 |  AAEGOU? | (PASS)          |  -  |   0 | 0 |
-    4 | TT+EB?AN | BATEReNT        |  5D |  86 | 1 | *
-    5 |  AAEGOU? | (PASS)          |  -  |   0 | 0 |
-    6 |  RCWV?AB | WeB             |  9G |  36 | 1 |  
-    7 |  AAEGOU? | (PASS)          |  -  |   0 | 0 |
-    8 | ACRV+SA? | VAiNCRAS        |  J2 |  91 | 1 | *
-    9 |  AAEGOU? | (PASS)          |  -  |   0 | 0 |
-   10 |  USOM?DM | MOrDUS          | 10C |  34 | 1 |  
-
-   Total: 273
 
 Rack 0: AAEGOU?
 Rack 1: M+EEOSQ?
+Score 0:    0
+Score 1:  273
 commande> j VExA 2J
 commande> a g
      1  2  3  4  5  6  7  8  9 10 11 12 13 14 15
@@ -74,8 +73,8 @@
  N   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
  O   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
 commande> a T
-Joueur 0: AGOU?HD
-Joueur 1: IRLF?DN
+Rack 0: AGOU+?HD
+Rack 1: IRLF?DN
 commande> a l
  A B C D E F G H I J K L M N O P Q R S T U V W X Y Z ?
  5 0 1 2 8 1 2 2 6 1 1 5 1 5 4 1 0 3 3 4 4 1 0 0 1 1 2
@@ -98,42 +97,41 @@
  N   L  I  N  D  O  R  -  -  -  -  -  -  -  -  - 
  O   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
 commande> a T
-Joueur 0: ADGHUVC
-Joueur 1: FUI?ONL
+Rack 0: ADGHU+VC
+Rack 1: F+UI?ONL
 commande> a l
  A B C D E F G H I J K L M N O P Q R S T U V W X Y Z ?
  5 0 1 1 8 1 2 2 5 1 1 4 1 4 2 1 0 2 3 4 4 1 0 0 1 1 1
 commande> p
 commande> a p
-Eliot 1.5
-
-Game type: Free game
-Player 0: Human
-Player 1: Computer
-
-    N |   RACK   |    SOLUTION     | REF | PTS | P | BONUS
-   ===|==========|=================|=====|=====|===|======
-    1 |  ?AAUGOE | (PASS)          |  -  |   0 | 0 |
-    2 |  EP?TFTI | FrIPE           |  H4 |  26 | 1 |  
-    3 |  AAEGOU? | (PASS)          |  -  |   0 | 0 |
-    4 | TT+EB?AN | BATEReNT        |  5D |  86 | 1 | *
-    5 |  AAEGOU? | (PASS)          |  -  |   0 | 0 |
-    6 |  RCWV?AB | WeB             |  9G |  36 | 1 |  
-    7 |  AAEGOU? | (PASS)          |  -  |   0 | 0 |
-    8 | ACRV+SA? | VAiNCRAS        |  J2 |  91 | 1 | *
-    9 |  AAEGOU? | (PASS)          |  -  |   0 | 0 |
-   10 |  USOM?DM | MOrDUS          | 10C |  34 | 1 |  
-   11 |  AAEGOU? | VExA            |  2J |   6 | 0 |  
-   12 | M+EEOSQ? | MORESQuE        |  E8 |  80 | 1 | *
-   13 | AGOU+?HD | ExO             | 15E |   2 | 0 |  
-   14 |  IRLF?DN | LINDoR          |  N1 |  50 | 1 |  
-   15 | ADGHU+VC | (PASS)          |  -  |   0 | 0 |
-   16 | F+UI?ONL | FLIQUONs        | 13B |  86 | 1 | *
+Game: player 1 out of 2
+Game: mode=Free game
+Game: variant=joker
+Game: history:
+    N | P |   RACK   |    SOLUTION    | REF | PTS | BONUS
+   ===|===|==========|================|=====|=====|======
+    1 | 0 |  ?AAUGOE | (PASS)         |  -  |   0 |  
+    2 | 1 |  EP?TFTI | FrIPE          |  H4 |  26 |  
+    3 | 0 |  AAEGOU? | (PASS)         |  -  |   0 |  
+    4 | 1 | TT+EB?AN | BATEReNT       |  5D |  86 | *
+    5 | 0 |  AAEGOU? | (PASS)         |  -  |   0 |  
+    6 | 1 |  RCWV?AB | WeB            |  9G |  36 |  
+    7 | 0 |  AAEGOU? | (PASS)         |  -  |   0 |  
+    8 | 1 | ACRV+SA? | VAiNCRAS       |  J2 |  91 | *
+    9 | 0 |  AAEGOU? | (PASS)         |  -  |   0 |  
+   10 | 1 |  USOM?DM | MOrDUS         | 10C |  34 |  
+   11 | 0 |  AAEGOU? | VExA           |  2J |   6 |  
+   12 | 1 | M+EEOSQ? | MORESQuE       |  E8 |  80 | *
+   13 | 0 | AGOU+?HD | ExO            | 15E |   2 |  
+   14 | 1 |  IRLF?DN | LINDoR         |  N1 |  50 |  
+   15 | 0 | ADGHU+VC | (PASS)         |  -  |   0 |  
+   16 | 1 | F+UI?ONL | FLIQUONs       | 13B |  86 | *
 
-   Total: 497
 
 Rack 0: ACDGHUV
 Rack 1: EATLZL?
+Score 0:    8
+Score 1:  489
 commande> a l
  A B C D E F G H I J K L M N O P Q R S T U V W X Y Z ?
  5 0 1 1 8 0 2 2 4 1 1 3 1 3 1 1 0 2 2 4 3 1 0 0 1 1 1
@@ -156,30 +154,29 @@
  N   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
  O   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
 commande> a p
-Eliot 1.5
+Game: player 2 out of 2
+Game: mode=Free game
+Game: variant=joker
+Game: history:
+    N | P |   RACK   |    SOLUTION    | REF | PTS | BONUS
+   ===|===|==========|================|=====|=====|======
+    1 | 0 |  ?AAUGOE | (PASS)         |  -  |   0 |  
+    2 | 1 |  EP?TFTI | FrIPE          |  H4 |  26 |  
+    3 | 0 |  AAEGOU? | (PASS)         |  -  |   0 |  
+    4 | 1 | TT+EB?AN | BATEReNT       |  5D |  86 | *
+    5 | 0 |  AAEGOU? | (PASS)         |  -  |   0 |  
+    6 | 1 |  RCWV?AB | WeB            |  9G |  36 |  
+    7 | 0 |  AAEGOU? | (PASS)         |  -  |   0 |  
+    8 | 1 | ACRV+SA? | VAiNCRAS       |  J2 |  91 | *
+    9 | 0 |  AAEGOU? | (PASS)         |  -  |   0 |  
+   10 | 1 |  USOM?DM | MOrDUS         | 10C |  34 |  
+   11 | 0 |  AAEGOU? | VExA           |  2J |   6 |  
 
-Game type: Free game
-Player 0: Human
-Player 1: Computer
-
-    N |   RACK   |    SOLUTION     | REF | PTS | P | BONUS
-   ===|==========|=================|=====|=====|===|======
-    1 |  ?AAUGOE | (PASS)          |  -  |   0 | 0 |
-    2 |  EP?TFTI | FrIPE           |  H4 |  26 | 1 |  
-    3 |  AAEGOU? | (PASS)          |  -  |   0 | 0 |
-    4 | TT+EB?AN | BATEReNT        |  5D |  86 | 1 | *
-    5 |  AAEGOU? | (PASS)          |  -  |   0 | 0 |
-    6 |  RCWV?AB | WeB             |  9G |  36 | 1 |  
-    7 |  AAEGOU? | (PASS)          |  -  |   0 | 0 |
-    8 | ACRV+SA? | VAiNCRAS        |  J2 |  91 | 1 | *
-    9 |  AAEGOU? | (PASS)          |  -  |   0 | 0 |
-   10 |  USOM?DM | MOrDUS          | 10C |  34 | 1 |  
-   11 |  AAEGOU? | VExA            |  2J |   6 | 0 |  
-
-   Total: 279
 
 Rack 0: AGOU+?HD
 Rack 1: M+EEOSQ?
+Score 0:    6
+Score 1:  273
 commande> a l
  A B C D  E F G H I J K L M N O P Q R S T U V W X Y Z ?
  5 0 1 2 10 1 2 2 6 1 1 5 2 5 5 1 1 3 4 4 5 1 0 0 1 1 2
@@ -202,29 +199,28 @@
  N   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
  O   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
 commande> a p
-Eliot 1.5
-
-Game type: Free game
-Player 0: Human
-Player 1: Computer
-
-    N |   RACK   |    SOLUTION     | REF | PTS | P | BONUS
-   ===|==========|=================|=====|=====|===|======
-    1 |  ?AAUGOE | (PASS)          |  -  |   0 | 0 |
-    2 |  EP?TFTI | FrIPE           |  H4 |  26 | 1 |  
-    3 |  AAEGOU? | (PASS)          |  -  |   0 | 0 |
-    4 | TT+EB?AN | BATEReNT        |  5D |  86 | 1 | *
-    5 |  AAEGOU? | (PASS)          |  -  |   0 | 0 |
-    6 |  RCWV?AB | WeB             |  9G |  36 | 1 |  
-    7 |  AAEGOU? | (PASS)          |  -  |   0 | 0 |
-    8 | ACRV+SA? | VAiNCRAS        |  J2 |  91 | 1 | *
-    9 |  AAEGOU? | (PASS)          |  -  |   0 | 0 |
-   10 |  USOM?DM | MOrDUS          | 10C |  34 | 1 |  
+Game: player 1 out of 2
+Game: mode=Free game
+Game: variant=joker
+Game: history:
+    N | P |   RACK   |    SOLUTION    | REF | PTS | BONUS
+   ===|===|==========|================|=====|=====|======
+    1 | 0 |  ?AAUGOE | (PASS)         |  -  |   0 |  
+    2 | 1 |  EP?TFTI | FrIPE          |  H4 |  26 |  
+    3 | 0 |  AAEGOU? | (PASS)         |  -  |   0 |  
+    4 | 1 | TT+EB?AN | BATEReNT       |  5D |  86 | *
+    5 | 0 |  AAEGOU? | (PASS)         |  -  |   0 |  
+    6 | 1 |  RCWV?AB | WeB            |  9G |  36 |  
+    7 | 0 |  AAEGOU? | (PASS)         |  -  |   0 |  
+    8 | 1 | ACRV+SA? | VAiNCRAS       |  J2 |  91 | *
+    9 | 0 |  AAEGOU? | (PASS)         |  -  |   0 |  
+   10 | 1 |  USOM?DM | MOrDUS         | 10C |  34 |  
 
-   Total: 273
 
 Rack 0: AAEGOU?
 Rack 1: M+EEOSQ?
+Score 0:    0
+Score 1:  273
 commande> a l
  A B C D  E F G H I J K L M N O P Q R S T U V W X Y Z ?
  6 0 1 2 11 1 2 2 6 1 1 5 2 5 5 1 1 3 4 4 5 1 0 1 1 1 2

Index: test/freegame_navigation.ref
===================================================================
RCS file: /cvsroot/eliot/eliot/test/freegame_navigation.ref,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -b -r1.2 -r1.3
--- test/freegame_navigation.ref        23 Jun 2009 21:36:33 -0000      1.2
+++ test/freegame_navigation.ref        29 Nov 2009 16:01:33 -0000      1.3
@@ -4,9 +4,9 @@
 mode partie libre
 [?] pour l'aide
 commande> a T
-Joueur 0: NONTEEL
-Joueur 1: NBZEUAU
-Joueur 2: NUDATMG
+Rack 0: NONTEEL
+Rack 1: NBZEUAU
+Rack 2: NUDATMG
 commande> j TONNE h4
 commande> a g
      1  2  3  4  5  6  7  8  9 10 11 12 13 14 15
@@ -26,24 +26,23 @@
  N   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
  O   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
 commande> a p
-Eliot 1.5
+Game: player 1 out of 3
+Game: mode=Free game
+Game: variant=unknown
+Game: history:
+    N | P |   RACK   |    SOLUTION    | REF | PTS | BONUS
+   ===|===|==========|================|=====|=====|======
+    1 | 0 |  NONTEEL | TONNE          |  H4 |  12 |  
+    2 | 1 |  NBZEUAU | AUNEZ          |  6F |  36 |  
+    3 | 2 |  NUDATMG | MATON          |  5E |  18 |  
 
-Game type: Free game
-Player 0: Human
-Player 1: Computer
-Player 2: Computer
-
-    N |   RACK   |    SOLUTION     | REF | PTS | P | BONUS
-   ===|==========|=================|=====|=====|===|======
-    1 |  NONTEEL | TONNE           |  H4 |  12 | 0 |  
-    2 |  NBZEUAU | AUNEZ           |  6F |  36 | 1 |  
-    3 |  NUDATMG | MATON           |  5E |  18 | 2 |  
-
-   Total: 66
 
 Rack 0: EL+HI?WE
 Rack 1: BNU+FYTE
 Rack 2: DGU+IDVA
+Score 0:   12
+Score 1:   36
+Score 2:   18
 commande> j WELcHE 3c
 commande> a g
      1  2  3  4  5  6  7  8  9 10 11 12 13 14 15
@@ -63,27 +62,26 @@
  N   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
  O   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
 commande> a p
-Eliot 1.5
-
-Game type: Free game
-Player 0: Human
-Player 1: Computer
-Player 2: Computer
-
-    N |   RACK   |    SOLUTION     | REF | PTS | P | BONUS
-   ===|==========|=================|=====|=====|===|======
-    1 |  NONTEEL | TONNE           |  H4 |  12 | 0 |  
-    2 |  NBZEUAU | AUNEZ           |  6F |  36 | 1 |  
-    3 |  NUDATMG | MATON           |  5E |  18 | 2 |  
-    4 | EL+HI?WE | WELcHE          |  3C |  48 | 0 |  
-    5 | BNU+FYTE | BEY             |  2H |  43 | 1 |  
-    6 | DGU+IDVA | VAGI            |  1I |  25 | 2 |  
+Game: player 1 out of 3
+Game: mode=Free game
+Game: variant=unknown
+Game: history:
+    N | P |   RACK   |    SOLUTION    | REF | PTS | BONUS
+   ===|===|==========|================|=====|=====|======
+    1 | 0 |  NONTEEL | TONNE          |  H4 |  12 |  
+    2 | 1 |  NBZEUAU | AUNEZ          |  6F |  36 |  
+    3 | 2 |  NUDATMG | MATON          |  5E |  18 |  
+    4 | 0 | EL+HI?WE | WELcHE         |  3C |  48 |  
+    5 | 1 | BNU+FYTE | BEY            |  2H |  43 |  
+    6 | 2 | DGU+IDVA | VAGI           |  1I |  25 |  
 
-   Total: 182
 
 Rack 0: I+SSPRNS
 Rack 1: FNTU+FIA
 Rack 2: DDU+?ERA
+Score 0:   60
+Score 1:   79
+Score 2:   43
 commande> h p
 commande> a g
      1  2  3  4  5  6  7  8  9 10 11 12 13 14 15
@@ -103,26 +101,25 @@
  N   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
  O   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
 commande> a p
-Eliot 1.5
+Game: player 3 out of 3
+Game: mode=Free game
+Game: variant=unknown
+Game: history:
+    N | P |   RACK   |    SOLUTION    | REF | PTS | BONUS
+   ===|===|==========|================|=====|=====|======
+    1 | 0 |  NONTEEL | TONNE          |  H4 |  12 |  
+    2 | 1 |  NBZEUAU | AUNEZ          |  6F |  36 |  
+    3 | 2 |  NUDATMG | MATON          |  5E |  18 |  
+    4 | 0 | EL+HI?WE | WELcHE         |  3C |  48 |  
+    5 | 1 | BNU+FYTE | BEY            |  2H |  43 |  
 
-Game type: Free game
-Player 0: Human
-Player 1: Computer
-Player 2: Computer
-
-    N |   RACK   |    SOLUTION     | REF | PTS | P | BONUS
-   ===|==========|=================|=====|=====|===|======
-    1 |  NONTEEL | TONNE           |  H4 |  12 | 0 |  
-    2 |  NBZEUAU | AUNEZ           |  6F |  36 | 1 |  
-    3 |  NUDATMG | MATON           |  5E |  18 | 2 |  
-    4 | EL+HI?WE | WELcHE          |  3C |  48 | 0 |  
-    5 | BNU+FYTE | BEY             |  2H |  43 | 1 |  
-
-   Total: 157
 
 Rack 0: I+SSPRNS
 Rack 1: FNTU+FIA
 Rack 2: DGU+IDVA
+Score 0:   60
+Score 1:   79
+Score 2:   18
 commande> h p
 commande> a g
      1  2  3  4  5  6  7  8  9 10 11 12 13 14 15
@@ -142,48 +139,46 @@
  N   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
  O   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
 commande> a p
-Eliot 1.5
-
-Game type: Free game
-Player 0: Human
-Player 1: Computer
-Player 2: Computer
-
-    N |   RACK   |    SOLUTION     | REF | PTS | P | BONUS
-   ===|==========|=================|=====|=====|===|======
-    1 |  NONTEEL | TONNE           |  H4 |  12 | 0 |  
-    2 |  NBZEUAU | AUNEZ           |  6F |  36 | 1 |  
-    3 |  NUDATMG | MATON           |  5E |  18 | 2 |  
-    4 | EL+HI?WE | WELcHE          |  3C |  48 | 0 |  
+Game: player 2 out of 3
+Game: mode=Free game
+Game: variant=unknown
+Game: history:
+    N | P |   RACK   |    SOLUTION    | REF | PTS | BONUS
+   ===|===|==========|================|=====|=====|======
+    1 | 0 |  NONTEEL | TONNE          |  H4 |  12 |  
+    2 | 1 |  NBZEUAU | AUNEZ          |  6F |  36 |  
+    3 | 2 |  NUDATMG | MATON          |  5E |  18 |  
+    4 | 0 | EL+HI?WE | WELcHE         |  3C |  48 |  
 
-   Total: 114
 
 Rack 0: I+SSPRNS
 Rack 1: BNU+FYTE
 Rack 2: DGU+IDVA
+Score 0:   60
+Score 1:   36
+Score 2:   18
 commande> h r
 commande> a p
-Eliot 1.5
-
-Game type: Free game
-Player 0: Human
-Player 1: Computer
-Player 2: Computer
-
-    N |   RACK   |    SOLUTION     | REF | PTS | P | BONUS
-   ===|==========|=================|=====|=====|===|======
-    1 |  NONTEEL | TONNE           |  H4 |  12 | 0 |  
-    2 |  NBZEUAU | AUNEZ           |  6F |  36 | 1 |  
-    3 |  NUDATMG | MATON           |  5E |  18 | 2 |  
-    4 | EL+HI?WE | WELcHE          |  3C |  48 | 0 |  
-    5 | BNU+FYTE | BEY             |  2H |  43 | 1 |  
-    6 | DGU+IDVA | VAGI            |  1I |  25 | 2 |  
+Game: player 1 out of 3
+Game: mode=Free game
+Game: variant=unknown
+Game: history:
+    N | P |   RACK   |    SOLUTION    | REF | PTS | BONUS
+   ===|===|==========|================|=====|=====|======
+    1 | 0 |  NONTEEL | TONNE          |  H4 |  12 |  
+    2 | 1 |  NBZEUAU | AUNEZ          |  6F |  36 |  
+    3 | 2 |  NUDATMG | MATON          |  5E |  18 |  
+    4 | 0 | EL+HI?WE | WELcHE         |  3C |  48 |  
+    5 | 1 | BNU+FYTE | BEY            |  2H |  43 |  
+    6 | 2 | DGU+IDVA | VAGI           |  1I |  25 |  
 
-   Total: 182
 
 Rack 0: I+SSPRNS
 Rack 1: FNTU+FIA
 Rack 2: DDU+?ERA
+Score 0:   60
+Score 1:   79
+Score 2:   43
 commande> a g
      1  2  3  4  5  6  7  8  9 10 11 12 13 14 15
  A   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
@@ -203,21 +198,20 @@
  O   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
 commande> h f
 commande> a p
-Eliot 1.5
-
-Game type: Free game
-Player 0: Human
-Player 1: Computer
-Player 2: Computer
-
-    N |   RACK   |    SOLUTION     | REF | PTS | P | BONUS
-   ===|==========|=================|=====|=====|===|======
+Game: player 1 out of 3
+Game: mode=Free game
+Game: variant=unknown
+Game: history:
+    N | P |   RACK   |    SOLUTION    | REF | PTS | BONUS
+   ===|===|==========|================|=====|=====|======
 
-   Total: 0
 
 Rack 0: NONTEEL
 Rack 1: NBZEUAU
 Rack 2: NUDATMG
+Score 0:    0
+Score 1:    0
+Score 2:    0
 commande> a g
      1  2  3  4  5  6  7  8  9 10 11 12 13 14 15
  A   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
@@ -254,22 +248,21 @@
  N   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
  O   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
 commande> a p
-Eliot 1.5
+Game: player 2 out of 3
+Game: mode=Free game
+Game: variant=unknown
+Game: history:
+    N | P |   RACK   |    SOLUTION    | REF | PTS | BONUS
+   ===|===|==========|================|=====|=====|======
+    1 | 0 |  NONTEEL | TONNE          |  H4 |  12 |  
 
-Game type: Free game
-Player 0: Human
-Player 1: Computer
-Player 2: Computer
-
-    N |   RACK   |    SOLUTION     | REF | PTS | P | BONUS
-   ===|==========|=================|=====|=====|===|======
-    1 |  NONTEEL | TONNE           |  H4 |  12 | 0 |  
-
-   Total: 12
 
 Rack 0: EL+HI?WE
 Rack 1: NBZEUAU
 Rack 2: NUDATMG
+Score 0:   12
+Score 1:    0
+Score 2:    0
 commande> h n
 commande> a g
      1  2  3  4  5  6  7  8  9 10 11 12 13 14 15
@@ -289,23 +282,22 @@
  N   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
  O   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
 commande> a p
-Eliot 1.5
-
-Game type: Free game
-Player 0: Human
-Player 1: Computer
-Player 2: Computer
-
-    N |   RACK   |    SOLUTION     | REF | PTS | P | BONUS
-   ===|==========|=================|=====|=====|===|======
-    1 |  NONTEEL | TONNE           |  H4 |  12 | 0 |  
-    2 |  NBZEUAU | AUNEZ           |  6F |  36 | 1 |  
+Game: player 3 out of 3
+Game: mode=Free game
+Game: variant=unknown
+Game: history:
+    N | P |   RACK   |    SOLUTION    | REF | PTS | BONUS
+   ===|===|==========|================|=====|=====|======
+    1 | 0 |  NONTEEL | TONNE          |  H4 |  12 |  
+    2 | 1 |  NBZEUAU | AUNEZ          |  6F |  36 |  
 
-   Total: 48
 
 Rack 0: EL+HI?WE
 Rack 1: BNU+FYTE
 Rack 2: NUDATMG
+Score 0:   12
+Score 1:   36
+Score 2:    0
 commande> h r
 commande> a g
      1  2  3  4  5  6  7  8  9 10 11 12 13 14 15
@@ -325,24 +317,23 @@
  N   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
  O   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
 commande> a p
-Eliot 1.5
-
-Game type: Free game
-Player 0: Human
-Player 1: Computer
-Player 2: Computer
-
-    N |   RACK   |    SOLUTION     | REF | PTS | P | BONUS
-   ===|==========|=================|=====|=====|===|======
-    1 |  NONTEEL | TONNE           |  H4 |  12 | 0 |  
-    2 |  NBZEUAU | AUNEZ           |  6F |  36 | 1 |  
-    3 |  NUDATMG | MATON           |  5E |  18 | 2 |  
+Game: player 1 out of 3
+Game: mode=Free game
+Game: variant=unknown
+Game: history:
+    N | P |   RACK   |    SOLUTION    | REF | PTS | BONUS
+   ===|===|==========|================|=====|=====|======
+    1 | 0 |  NONTEEL | TONNE          |  H4 |  12 |  
+    2 | 1 |  NBZEUAU | AUNEZ          |  6F |  36 |  
+    3 | 2 |  NUDATMG | MATON          |  5E |  18 |  
 
-   Total: 66
 
 Rack 0: EL+HI?WE
 Rack 1: BNU+FYTE
 Rack 2: DGU+IDVA
+Score 0:   12
+Score 1:   36
+Score 2:   18
 commande> h n
 commande> j aWELE 3f
 commande> a g
@@ -363,27 +354,26 @@
  N   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
  O   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
 commande> a p
-Eliot 1.5
+Game: player 1 out of 3
+Game: mode=Free game
+Game: variant=unknown
+Game: history:
+    N | P |   RACK   |    SOLUTION    | REF | PTS | BONUS
+   ===|===|==========|================|=====|=====|======
+    1 | 0 |  NONTEEL | TONNE          |  H4 |  12 |  
+    2 | 1 |  NBZEUAU | AUNEZ          |  6F |  36 |  
+    3 | 2 |  NUDATMG | MATON          |  5E |  18 |  
+    4 | 0 | EL+HI?WE | aWELE          |  3F |  30 |  
+    5 | 1 | BNU+FYTE | BEY            |  9G |  34 |  
+    6 | 2 | DGU+IDVA | VAGI           |  2J |  29 |  
 
-Game type: Free game
-Player 0: Human
-Player 1: Computer
-Player 2: Computer
-
-    N |   RACK   |    SOLUTION     | REF | PTS | P | BONUS
-   ===|==========|=================|=====|=====|===|======
-    1 |  NONTEEL | TONNE           |  H4 |  12 | 0 |  
-    2 |  NBZEUAU | AUNEZ           |  6F |  36 | 1 |  
-    3 |  NUDATMG | MATON           |  5E |  18 | 2 |  
-    4 | EL+HI?WE | aWELE           |  3F |  30 | 0 |  
-    5 | BNU+FYTE | BEY             |  9G |  34 | 1 |  
-    6 | DGU+IDVA | VAGI            |  2J |  29 | 2 |  
-
-   Total: 159
 
 Rack 0: HI+CEEEP
 Rack 1: FNTU+FSR
 Rack 2: DDU+OREE
+Score 0:   42
+Score 1:   70
+Score 2:   47
 commande> p
 commande> a g
      1  2  3  4  5  6  7  8  9 10 11 12 13 14 15
@@ -403,30 +393,29 @@
  N   -  T  U  R  F  S  -  -  -  -  -  -  -  -  - 
  O   -  -  -  E  -  -  -  -  -  -  -  -  -  -  - 
 commande> a p
-Eliot 1.5
-
-Game type: Free game
-Player 0: Human
-Player 1: Computer
-Player 2: Computer
-
-    N |   RACK   |    SOLUTION     | REF | PTS | P | BONUS
-   ===|==========|=================|=====|=====|===|======
-    1 |  NONTEEL | TONNE           |  H4 |  12 | 0 |  
-    2 |  NBZEUAU | AUNEZ           |  6F |  36 | 1 |  
-    3 |  NUDATMG | MATON           |  5E |  18 | 2 |  
-    4 | EL+HI?WE | aWELE           |  3F |  30 | 0 |  
-    5 | BNU+FYTE | BEY             |  9G |  34 | 1 |  
-    6 | DGU+IDVA | VAGI            |  2J |  29 | 2 |  
-    7 | HI+CEEEP | (PASS)          |  -  |   0 | 0 |
-    8 | FNTU+FSR | TURFS           |  N2 |  38 | 1 |  
-    9 | DDU+OREE | REDORE          |  4J |  22 | 2 |  
+Game: player 1 out of 3
+Game: mode=Free game
+Game: variant=unknown
+Game: history:
+    N | P |   RACK   |    SOLUTION    | REF | PTS | BONUS
+   ===|===|==========|================|=====|=====|======
+    1 | 0 |  NONTEEL | TONNE          |  H4 |  12 |  
+    2 | 1 |  NBZEUAU | AUNEZ          |  6F |  36 |  
+    3 | 2 |  NUDATMG | MATON          |  5E |  18 |  
+    4 | 0 | EL+HI?WE | aWELE          |  3F |  30 |  
+    5 | 1 | BNU+FYTE | BEY            |  9G |  34 |  
+    6 | 2 | DGU+IDVA | VAGI           |  2J |  29 |  
+    7 | 0 | HI+CEEEP | (PASS)         |  -  |   0 |  
+    8 | 1 | FNTU+FSR | TURFS          |  N2 |  38 |  
+    9 | 2 | DDU+OREE | REDORE         |  4J |  22 |  
 
-   Total: 219
 
 Rack 0: CEEEHIP
 Rack 1: FN+IIGIA
 Rack 2: DU+LRIUS
+Score 0:   42
+Score 1:  108
+Score 2:   69
 commande> h f
 commande> a g
      1  2  3  4  5  6  7  8  9 10 11 12 13 14 15
@@ -446,21 +435,20 @@
  N   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
  O   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
 commande> a p
-Eliot 1.5
+Game: player 1 out of 3
+Game: mode=Free game
+Game: variant=unknown
+Game: history:
+    N | P |   RACK   |    SOLUTION    | REF | PTS | BONUS
+   ===|===|==========|================|=====|=====|======
 
-Game type: Free game
-Player 0: Human
-Player 1: Computer
-Player 2: Computer
-
-    N |   RACK   |    SOLUTION     | REF | PTS | P | BONUS
-   ===|==========|=================|=====|=====|===|======
-
-   Total: 0
 
 Rack 0: NONTEEL
 Rack 1: NBZEUAU
 Rack 2: NUDATMG
+Score 0:    0
+Score 1:    0
+Score 2:    0
 commande> h n
 commande> a g
      1  2  3  4  5  6  7  8  9 10 11 12 13 14 15
@@ -480,22 +468,21 @@
  N   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
  O   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
 commande> a p
-Eliot 1.5
+Game: player 2 out of 3
+Game: mode=Free game
+Game: variant=unknown
+Game: history:
+    N | P |   RACK   |    SOLUTION    | REF | PTS | BONUS
+   ===|===|==========|================|=====|=====|======
+    1 | 0 |  NONTEEL | TONNE          |  H4 |  12 |  
 
-Game type: Free game
-Player 0: Human
-Player 1: Computer
-Player 2: Computer
-
-    N |   RACK   |    SOLUTION     | REF | PTS | P | BONUS
-   ===|==========|=================|=====|=====|===|======
-    1 |  NONTEEL | TONNE           |  H4 |  12 | 0 |  
-
-   Total: 12
 
 Rack 0: EL+HI?WE
 Rack 1: NBZEUAU
 Rack 2: NUDATMG
+Score 0:   12
+Score 1:    0
+Score 2:    0
 commande> h l
 commande> a g
      1  2  3  4  5  6  7  8  9 10 11 12 13 14 15
@@ -515,30 +502,29 @@
  N   -  T  U  R  F  S  -  -  -  -  -  -  -  -  - 
  O   -  -  -  E  -  -  -  -  -  -  -  -  -  -  - 
 commande> a p
-Eliot 1.5
-
-Game type: Free game
-Player 0: Human
-Player 1: Computer
-Player 2: Computer
-
-    N |   RACK   |    SOLUTION     | REF | PTS | P | BONUS
-   ===|==========|=================|=====|=====|===|======
-    1 |  NONTEEL | TONNE           |  H4 |  12 | 0 |  
-    2 |  NBZEUAU | AUNEZ           |  6F |  36 | 1 |  
-    3 |  NUDATMG | MATON           |  5E |  18 | 2 |  
-    4 | EL+HI?WE | aWELE           |  3F |  30 | 0 |  
-    5 | BNU+FYTE | BEY             |  9G |  34 | 1 |  
-    6 | DGU+IDVA | VAGI            |  2J |  29 | 2 |  
-    7 | HI+CEEEP | (PASS)          |  -  |   0 | 0 |
-    8 | FNTU+FSR | TURFS           |  N2 |  38 | 1 |  
-    9 | DDU+OREE | REDORE          |  4J |  22 | 2 |  
+Game: player 1 out of 3
+Game: mode=Free game
+Game: variant=unknown
+Game: history:
+    N | P |   RACK   |    SOLUTION    | REF | PTS | BONUS
+   ===|===|==========|================|=====|=====|======
+    1 | 0 |  NONTEEL | TONNE          |  H4 |  12 |  
+    2 | 1 |  NBZEUAU | AUNEZ          |  6F |  36 |  
+    3 | 2 |  NUDATMG | MATON          |  5E |  18 |  
+    4 | 0 | EL+HI?WE | aWELE          |  3F |  30 |  
+    5 | 1 | BNU+FYTE | BEY            |  9G |  34 |  
+    6 | 2 | DGU+IDVA | VAGI           |  2J |  29 |  
+    7 | 0 | HI+CEEEP | (PASS)         |  -  |   0 |  
+    8 | 1 | FNTU+FSR | TURFS          |  N2 |  38 |  
+    9 | 2 | DDU+OREE | REDORE         |  4J |  22 |  
 
-   Total: 219
 
 Rack 0: CEEEHIP
 Rack 1: FN+IIGIA
 Rack 2: DU+LRIUS
+Score 0:   42
+Score 1:  108
+Score 2:   69
 commande> q
 fin du mode partie libre
 commande> q

Index: test/freegame_passing.ref
===================================================================
RCS file: /cvsroot/eliot/eliot/test/freegame_passing.ref,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -b -r1.8 -r1.9
--- test/freegame_passing.ref   23 Nov 2008 08:33:16 -0000      1.8
+++ test/freegame_passing.ref   29 Nov 2009 16:01:33 -0000      1.9
@@ -4,8 +4,8 @@
 mode partie libre
 [?] pour l'aide
 commande> a S
-Joueur 0:    0
-Joueur 1:    0
+Score 0:    0
+Score 1:    0
 commande> p
 commande> p
 commande> a t
@@ -35,69 +35,68 @@
 commande> p
 commande> p
 commande> a S
-Joueur 0:  -11
-Joueur 1:  793
+Score 0:  -11
+Score 1:  793
 commande> a T
-Joueur 0: AGSSTUV
-Joueur 1: 
+Rack 0: AGSSTUV
+Rack 1: 
 commande> a p
-Eliot 1.5
-
-Game type: Free game
-Player 0: Human
-Player 1: Computer
-
-    N |   RACK   |    SOLUTION     | REF | PTS | P | BONUS
-   ===|==========|=================|=====|=====|===|======
-    1 |  SEUTISG | (PASS)          |  -  |   0 | 0 |
-    2 |  LXCORNU | ROUX            |  H5 |  26 | 1 |  
-    3 |  EGISSTU | (PASS)          |  -  |   0 | 0 |
-    4 | CLN+?BEC | CiNECLUB        |  7B |  67 | 1 | *
-    5 |  EGISSTU | (-UIET)         |  -  |   0 | 0 |
-    6 |  LLESYEO | LYSEE           |  J5 |  48 | 1 |  
-    7 | GSS+TAUV | (PASS)          |  -  |   0 | 0 |
-    8 | LO+AAOGT | GALA            |  8A |  26 | 1 |  
-    9 |  AGSSTUV | (PASS)          |  -  |   0 | 0 |
-   10 | OOT+EMTU | EMOTTE          |  8J |  24 | 1 |  
-   11 |  AGSSTUV | (PASS)          |  -  |   0 | 0 |
-   12 | OU+AOILU | AUX             |  8F |  18 | 1 |  
-   13 |  AGSSTUV | (PASS)          |  -  |   0 | 0 |
-   14 | ILOOU+NF | FOULONNAI       |  D1 |  82 | 1 | *
-   15 |  AGSSTUV | (PASS)          |  -  |   0 | 0 |
-   16 |  UTEISEE | FETEES          |  1D |  27 | 1 |  
-   17 |  AGSSTUV | (PASS)          |  -  |   0 | 0 |
-   18 | IU+IURIO | MURI            |  K8 |  12 | 1 |  
-   19 |  AGSSTUV | (PASS)          |  -  |   0 | 0 |
-   20 | IIOU+VDS | VISOU           | 10B |  31 | 1 |  
-   21 |  AGSSTUV | (PASS)          |  -  |   0 | 0 |
-   22 | DI+IERNE | DENIER          | 12G |  22 | 1 |  
-   23 |  AGSSTUV | (PASS)          |  -  |   0 | 0 |
-   24 | I+TBIADK | BATIK           |  N6 |  42 | 1 |  
-   25 |  AGSSTUV | (PASS)          |  -  |   0 | 0 |
-   26 | DIT+EHEQ | EQUIDE          |  3B |  30 | 1 |  
-   27 |  AGSSTUV | (PASS)          |  -  |   0 | 0 |
-   28 | HT+EPARR | TEPHRA          |  O1 |  49 | 1 |  
-   29 |  AGSSTUV | (PASS)          |  -  |   0 | 0 |
-   30 | R+OE?NSF | rENFORTS        |  M2 |  85 | 1 | *
-   31 |  AGSSTUV | (PASS)          |  -  |   0 | 0 |
-   32 |  TMEAALP | EMPALAT         | 13B |  78 | 1 | *
-   33 |  AGSSTUV | (PASS)          |  -  |   0 | 0 |
-   34 |  ZDMAWER | DAMEZ           | M11 |  40 | 1 |  
-   35 |  AGSSTUV | (PASS)          |  -  |   0 | 0 |
-   36 | RW+HINJI | HIE             |  E5 |  24 | 1 |  
-   37 |  AGSSTUV | (PASS)          |  -  |   0 | 0 |
-   38 |  IJNRW+N | JE              |  B2 |  18 | 1 |  
-   39 |  AGSSTUV | (PASS)          |  -  |   0 | 0 |
-   40 |    INNRW | VINER           | B10 |  16 | 1 |  
-   41 |  AGSSTUV | (PASS)          |  -  |   0 | 0 |
-   42 |       NW | DAW             | G12 |  13 | 1 |  
-   43 |  AGSSTUV | (PASS)          |  -  |   0 | 0 |
-   44 |        N | EN              | 14M |   4 | 1 |  
+Game: player 2 out of 2
+Game: mode=Free game
+Game: variant=unknown
+Game: history:
+    N | P |   RACK   |    SOLUTION    | REF | PTS | BONUS
+   ===|===|==========|================|=====|=====|======
+    1 | 0 |  SEUTISG | (PASS)         |  -  |   0 |  
+    2 | 1 |  LXCORNU | ROUX           |  H5 |  26 |  
+    3 | 0 |  EGISSTU | (PASS)         |  -  |   0 |  
+    4 | 1 | CLN+?BEC | CiNECLUB       |  7B |  67 | *
+    5 | 0 |  EGISSTU | [UIET]         |  -  |   0 |  
+    6 | 1 |  LLESYEO | LYSEE          |  J5 |  48 |  
+    7 | 0 | GSS+TAUV | (PASS)         |  -  |   0 |  
+    8 | 1 | LO+AAOGT | GALA           |  8A |  26 |  
+    9 | 0 |  AGSSTUV | (PASS)         |  -  |   0 |  
+   10 | 1 | OOT+EMTU | EMOTTE         |  8J |  24 |  
+   11 | 0 |  AGSSTUV | (PASS)         |  -  |   0 |  
+   12 | 1 | OU+AOILU | AUX            |  8F |  18 |  
+   13 | 0 |  AGSSTUV | (PASS)         |  -  |   0 |  
+   14 | 1 | ILOOU+NF | FOULONNAI      |  D1 |  82 | *
+   15 | 0 |  AGSSTUV | (PASS)         |  -  |   0 |  
+   16 | 1 |  UTEISEE | FETEES         |  1D |  27 |  
+   17 | 0 |  AGSSTUV | (PASS)         |  -  |   0 |  
+   18 | 1 | IU+IURIO | MURI           |  K8 |  12 |  
+   19 | 0 |  AGSSTUV | (PASS)         |  -  |   0 |  
+   20 | 1 | IIOU+VDS | VISOU          | 10B |  31 |  
+   21 | 0 |  AGSSTUV | (PASS)         |  -  |   0 |  
+   22 | 1 | DI+IERNE | DENIER         | 12G |  22 |  
+   23 | 0 |  AGSSTUV | (PASS)         |  -  |   0 |  
+   24 | 1 | I+TBIADK | BATIK          |  N6 |  42 |  
+   25 | 0 |  AGSSTUV | (PASS)         |  -  |   0 |  
+   26 | 1 | DIT+EHEQ | EQUIDE         |  3B |  30 |  
+   27 | 0 |  AGSSTUV | (PASS)         |  -  |   0 |  
+   28 | 1 | HT+EPARR | TEPHRA         |  O1 |  49 |  
+   29 | 0 |  AGSSTUV | (PASS)         |  -  |   0 |  
+   30 | 1 | R+OE?NSF | rENFORTS       |  M2 |  85 | *
+   31 | 0 |  AGSSTUV | (PASS)         |  -  |   0 |  
+   32 | 1 |  TMEAALP | EMPALAT        | 13B |  78 | *
+   33 | 0 |  AGSSTUV | (PASS)         |  -  |   0 |  
+   34 | 1 |  ZDMAWER | DAMEZ          | M11 |  40 |  
+   35 | 0 |  AGSSTUV | (PASS)         |  -  |   0 |  
+   36 | 1 | RW+HINJI | HIE            |  E5 |  24 |  
+   37 | 0 |  AGSSTUV | (PASS)         |  -  |   0 |  
+   38 | 1 |  IJNRW+N | JE             |  B2 |  18 |  
+   39 | 0 |  AGSSTUV | (PASS)         |  -  |   0 |  
+   40 | 1 |    INNRW | VINER          | B10 |  16 |  
+   41 | 0 |  AGSSTUV | (PASS)         |  -  |   0 |  
+   42 | 1 |       NW | DAW            | G12 |  13 |  
+   43 | 0 |  AGSSTUV | (PASS)         |  -  |   0 |  
+   44 | 1 |        N | EN             | 14M |   4 |  
 
-   Total: 782
 
 Rack 0: AGSSTUV
 Rack 1: 
+Score 0:  -11
+Score 1:  793
 commande> q
 fin du mode partie libre
 commande> q

Index: test/freegame_play.ref
===================================================================
RCS file: /cvsroot/eliot/eliot/test/freegame_play.ref,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -b -r1.3 -r1.4
--- test/freegame_play.ref      23 Jun 2009 21:36:33 -0000      1.3
+++ test/freegame_play.ref      29 Nov 2009 16:01:33 -0000      1.4
@@ -9,56 +9,53 @@
 commande> a t
 AELMNU?
 commande> a p
-Eliot 1.5
+Game: player 1 out of 1
+Game: mode=Free game
+Game: variant=unknown
+Game: history:
+    N | P |   RACK   |    SOLUTION    | REF | PTS | BONUS
+   ===|===|==========|================|=====|=====|======
+    1 | 0 |  AMLUNE? | (PASS)         |  -  |   0 |  
 
-Game type: Free game
-Player 0: Human
-
-    N |   RACK   |    SOLUTION     | REF | PTS | P | BONUS
-   ===|==========|=================|=====|=====|===|======
-    1 |  AMLUNE? | (PASS)          |  -  |   0 | 0 |
-
-   Total: 0
 
 Rack 0: AELMNU?
+Score 0:    0
 commande> p
 commande> j MALvENU h4
 commande> a t
 ESEASTU
 commande> a p
-Eliot 1.5
-
-Game type: Free game
-Player 0: Human
+Game: player 1 out of 1
+Game: mode=Free game
+Game: variant=unknown
+Game: history:
+    N | P |   RACK   |    SOLUTION    | REF | PTS | BONUS
+   ===|===|==========|================|=====|=====|======
+    1 | 0 |  AMLUNE? | (PASS)         |  -  |   0 |  
+    2 | 0 |  AELMNU? | (PASS)         |  -  |   0 |  
+    3 | 0 |  AELMNU? | MALvENU        |  H4 |  68 | *
 
-    N |   RACK   |    SOLUTION     | REF | PTS | P | BONUS
-   ===|==========|=================|=====|=====|===|======
-    1 |  AMLUNE? | (PASS)          |  -  |   0 | 0 |
-    2 |  AELMNU? | (PASS)          |  -  |   0 | 0 |
-    3 |  AELMNU? | MALvENU         |  H4 |  68 | 0 | *
-
-   Total: 68
 
 Rack 0: ESEASTU
+Score 0:   68
 commande> p
 commande> j SAUTEES 11H
 commande> a p
-Eliot 1.5
-
-Game type: Free game
-Player 0: Human
-
-    N |   RACK   |    SOLUTION     | REF | PTS | P | BONUS
-   ===|==========|=================|=====|=====|===|======
-    1 |  AMLUNE? | (PASS)          |  -  |   0 | 0 |
-    2 |  AELMNU? | (PASS)          |  -  |   0 | 0 |
-    3 |  AELMNU? | MALvENU         |  H4 |  68 | 0 | *
-    4 |  ESEASTU | (PASS)          |  -  |   0 | 0 |
-    5 |  AEESSTU | SAUTEES         | 11H |  72 | 0 | *
+Game: player 1 out of 1
+Game: mode=Free game
+Game: variant=unknown
+Game: history:
+    N | P |   RACK   |    SOLUTION    | REF | PTS | BONUS
+   ===|===|==========|================|=====|=====|======
+    1 | 0 |  AMLUNE? | (PASS)         |  -  |   0 |  
+    2 | 0 |  AELMNU? | (PASS)         |  -  |   0 |  
+    3 | 0 |  AELMNU? | MALvENU        |  H4 |  68 | *
+    4 | 0 |  ESEASTU | (PASS)         |  -  |   0 |  
+    5 | 0 |  AEESSTU | SAUTEES        | 11H |  72 | *
 
-   Total: 140
 
 Rack 0: MIWBRAE
+Score 0:  140
 commande> a g
      1  2  3  4  5  6  7  8  9 10 11 12 13 14 15
  A   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 

Index: test/load_game.ref
===================================================================
RCS file: /cvsroot/eliot/eliot/test/load_game.ref,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -b -r1.4 -r1.5
--- test/load_game.ref  23 Jun 2009 21:36:33 -0000      1.4
+++ test/load_game.ref  29 Nov 2009 16:01:33 -0000      1.5
@@ -24,38 +24,37 @@
  A B C D E F G H I J K L M N O P Q R S T U V W X Y Z ?
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
 commande> a p
-Eliot 1.5
+Game: player 1 out of 1
+Game: mode=Training
+Game: variant=unknown
+Game: history:
+    N | P |   RACK   |    SOLUTION    | REF | PTS | BONUS
+   ===|===|==========|================|=====|=====|======
+    1 | 0 |  EUOFMIE | FUMEE          |  H4 |  26 |  
+    2 | 0 | IO+EOKAN | KIMONO         |  6F |  38 |  
+    3 | 0 | AE+EWTIS | WESTIE         |  L4 |  49 |  
+    4 | 0 | A+EAVSLS | LAVASSE        | 10H |  86 | *
+    5 | 0 |  BTUOMEQ | LOQUET         | H10 |  63 |  
+    6 | 0 | BM+UNOSI | OMNIBUS        |  O4 |  94 | *
+    7 | 0 |  IOZXEGP | EXPIEZ         | N10 |  52 |  
+    8 | 0 | GO+AETPI | TOPAZE         | 15J |  60 |  
+    9 | 0 | GI+AVNCO | VAINCU         | 13C |  28 |  
+   10 | 0 | GO+ESRAS | ESSORAGE       |  8A |  80 | *
+   11 | 0 |  JEUDIDR | JOUR           |  K5 |  44 |  
+   12 | 0 | DDEI+ALY | DIALYSE        |  C3 |  56 |  
+   13 | 0 | D+IHUEEB | HEU            | 10B |  32 |  
+   14 | 0 | BDEI+CIL | CIEL           |  D1 |  25 |  
+   15 | 0 | BDI+RRA? | BRADeRIE       |  A1 |  86 | *
+   16 | 0 |  EUGTDEA | DUT            |  M3 |  29 |  
+   17 | 0 | AEEG+LR? | CERcLAGE       |  1D |  80 | *
+   18 | 0 |  TFLATNN | JOURNAL        |  K5 |  30 |  
+   19 | 0 | AFNTT+HM | MATH           | D12 |  24 |  
+   20 | 0 | AFNT+NRE | FANON          |  I3 |  23 |  
+   21 | 0 |      ERT | ET             | I13 |  18 |  
 
-Game type: Training
-Player 0: Human
-
-    N |   RACK   |    SOLUTION     | REF | PTS | P | BONUS
-   ===|==========|=================|=====|=====|===|======
-    1 |  EUOFMIE | FUMEE           |  H4 |  26 | 0 |  
-    2 | IO+EOKAN | KIMONO          |  6F |  38 | 0 |  
-    3 | AE+EWTIS | WESTIE          |  L4 |  49 | 0 |  
-    4 | A+EAVSLS | LAVASSE         | 10H |  86 | 0 | *
-    5 |  BTUOMEQ | LOQUET          | H10 |  63 | 0 |  
-    6 | BM+UNOSI | OMNIBUS         |  O4 |  94 | 0 | *
-    7 |  IOZXEGP | EXPIEZ          | N10 |  52 | 0 |  
-    8 | GO+AETPI | TOPAZE          | 15J |  60 | 0 |  
-    9 | GI+AVNCO | VAINCU          | 13C |  28 | 0 |  
-   10 | GO+ESRAS | ESSORAGE        |  8A |  80 | 0 | *
-   11 |  JEUDIDR | JOUR            |  K5 |  44 | 0 |  
-   12 | DDEI+ALY | DIALYSE         |  C3 |  56 | 0 |  
-   13 | D+IHUEEB | HEU             | 10B |  32 | 0 |  
-   14 | BDEI+CIL | CIEL            |  D1 |  25 | 0 |  
-   15 | BDI+RRA? | BRADeRIE        |  A1 |  86 | 0 | *
-   16 |  EUGTDEA | DUT             |  M3 |  29 | 0 |  
-   17 | AEEG+LR? | CERcLAGE        |  1D |  80 | 0 | *
-   18 |  TFLATNN | JOURNAL         |  K5 |  30 | 0 |  
-   19 | AFNTT+HM | MATH            | D12 |  24 | 0 |  
-   20 | AFNT+NRE | FANON           |  I3 |  23 | 0 |  
-   21 |      ERT | ET              | I13 |  18 | 0 |  
-
-   Total: 1023
 
 Rack 0: R
+Score 0: 1023
 commande> q
 fin du mode entraînement
 commande> q

Index: test/load_saved_game.ref
===================================================================
RCS file: /cvsroot/eliot/eliot/test/load_saved_game.ref,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -b -r1.7 -r1.8
--- test/load_saved_game.ref    23 Jun 2009 21:36:33 -0000      1.7
+++ test/load_saved_game.ref    29 Nov 2009 16:01:33 -0000      1.8
@@ -50,21 +50,20 @@
  N   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
  O   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
 commande> a p
-Eliot 1.5
+Game: player 1 out of 1
+Game: mode=Training
+Game: variant=unknown
+Game: history:
+    N | P |   RACK   |    SOLUTION    | REF | PTS | BONUS
+   ===|===|==========|================|=====|=====|======
+    1 | 0 |  EA?AEBF | FABAcEE        |  H4 |  80 | *
+    2 | 0 |  LMUAEYE | AY             |  I6 |  46 |  
+    3 | 0 |  EELMUJE | JUMEL          |  J2 |  38 |  
+    4 | 0 |  EEIGLEH | EGAYEE         |  7F |  32 |  
 
-Game type: Training
-Player 0: Human
-
-    N |   RACK   |    SOLUTION     | REF | PTS | P | BONUS
-   ===|==========|=================|=====|=====|===|======
-    1 |  EA?AEBF | FABAcEE         |  H4 |  80 | 0 | *
-    2 |  LMUAEYE | AY              |  I6 |  46 | 0 |  
-    3 |  EELMUJE | JUMEL           |  J2 |  38 | 0 |  
-    4 |  EEIGLEH | EGAYEE          |  7F |  32 | 0 |  
-
-   Total: 196
 
 Rack 0: HIL
+Score 0:  196
 commande> a l
  A B C D E F G H I J K L M N O P Q R S T U V W X Y Z ?
  6 1 2 3 9 1 1 2 8 0 1 4 2 6 6 2 1 6 6 6 5 2 1 1 0 1 1
@@ -94,21 +93,20 @@
  N   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
  O   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
 commande> a p
-Eliot 1.5
-
-Game type: Training
-Player 0: Human
-
-    N |   RACK   |    SOLUTION     | REF | PTS | P | BONUS
-   ===|==========|=================|=====|=====|===|======
-    1 |  EA?AEBF | FABAcEE         |  H4 |  80 | 0 | *
-    2 |  LMUAEYE | AY              |  I6 |  46 | 0 |  
-    3 |  EELMUJE | JUMEL           |  J2 |  38 | 0 |  
-    4 |  EEIGLEH | EGAYEE          |  7F |  32 | 0 |  
+Game: player 1 out of 1
+Game: mode=Training
+Game: variant=unknown
+Game: history:
+    N | P |   RACK   |    SOLUTION    | REF | PTS | BONUS
+   ===|===|==========|================|=====|=====|======
+    1 | 0 |  EA?AEBF | FABAcEE        |  H4 |  80 | *
+    2 | 0 |  LMUAEYE | AY             |  I6 |  46 |  
+    3 | 0 |  EELMUJE | JUMEL          |  J2 |  38 |  
+    4 | 0 |  EEIGLEH | EGAYEE         |  7F |  32 |  
 
-   Total: 196
 
 Rack 0: HIL
+Score 0:  196
 commande> a l
  A B C D E F G H I J K L M N O P Q R S T U V W X Y Z ?
  6 1 2 3 9 1 1 2 8 0 1 4 2 6 6 2 1 6 6 6 5 2 1 1 0 1 1

Index: test/training_joker.input
===================================================================
RCS file: /cvsroot/eliot/eliot/test/training_joker.input,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -b -r1.1 -r1.2
--- test/training_joker.input   11 Aug 2006 22:04:45 -0000      1.1
+++ test/training_joker.input   29 Nov 2009 16:01:33 -0000      1.2
@@ -1,5 +1,5 @@
 c hutte
 a g
-a P
+a p
 q
 q

Index: test/training_joker.ref
===================================================================
RCS file: /cvsroot/eliot/eliot/test/training_joker.ref,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -b -r1.3 -r1.4
--- test/training_joker.ref     23 Jun 2009 21:36:33 -0000      1.3
+++ test/training_joker.ref     29 Nov 2009 16:01:33 -0000      1.4
@@ -20,33 +20,39 @@
  M   -  -  N  O  -  -  -  -  M  -  -  V  A  S  E 
  N   -  -  -  U  -  -  -  -  N  -  -  E  -  -  - 
  O   -  -  E  X  I  G  E  R  A  -  -  C  Z  A  R 
-commande> a P
-Eliot
+commande> a p
+Game: player 1 out of 1
+Game: mode=Training
+Game: variant=unknown
+Game: history:
+    N | P |   RACK   |    SOLUTION    | REF | PTS | BONUS
+   ===|===|==========|================|=====|=====|======
+    1 | 0 |  UTEHJDT | HUTTE          |  H4 |  24 |  
+    2 | 0 | DJ+NGILE | JUNGLE         |  5G |  28 |  
+    3 | 0 | DI+OBURX | DOUX           |  4L |  54 |  
+    4 | 0 | BIR+EEGI | EXIGER         |  O3 |  48 |  
+    5 | 0 | BI+TNE?N | oBTIENNE       |  8A |  80 | *
+    6 | 0 |  AMIEOLE | METEO          |  6F |  28 |  
+    7 | 0 | AIL+NEID | ENLAIDIT       |  C1 |  70 | *
+    8 | 0 |  WABFUNO | BOEUF          |  1A |  33 |  
+    9 | 0 | ANW+OALU | WON            |  3K |  32 |  
+   10 | 0 | AALU+PI? | MANiPULAI      |  F6 |  69 | *
+   11 | 0 |  ELSUICS | CELSIUS        | 15C |  92 | *
+   12 | 0 |  ETFYUSR | FRAYES         |  4A |  44 |  
+   13 | 0 | TU+DEMNH | HAUTE          |  7E |  31 |  
+   14 | 0 | DMNT+ARA | DAMNA          |  9K |  26 |  
+   15 | 0 | RT+SAIVI | SUIVRAIT       | 11E |  94 | *
+   16 | 0 |  ACAOVEP | AVEC           | 12L |  28 |  
+   17 | 0 | AOP+ARZO | CZAR           | O12 |  45 |  
+   18 | 0 | AOOP+REK | POKER          | 14H |  42 |  
+   19 | 0 | AO+TSTEM | MIES           |  9E |  34 |  
+   20 | 0 | AOTT+LEQ | QAT            | J10 |  26 |  
+   21 | 0 | AELOT+RS | VASE           | M12 |  31 |  
+   22 | 0 |     LORT | FORET          |  E1 |  16 |  
 
-   UTEHJDT     HUTTE              24  H  4
-   DJ+NGILE    JUNGLE             28  5  G
-   DI+OBURX    DOUX               54  4  L
-   BIR+EEGI    EXIGER             48  O  3
-   BI+TNE?N    oBTIENNE        *  80  8  A
-   AMIEOLE     METEO              28  6  F
-   AIL+NEID    ENLAIDIT        *  70  C  1
-   WABFUNO     BOEUF              33  1  A
-   ANW+OALU    WON                32  3  K
-   AALU+PI?    MANiPULAI       *  69  F  6
-   ELSUICS     CELSIUS         *  92 15  C
-   ETFYUSR     FRAYES             44  4  A
-   TU+DEMNH    HAUTE              31  7  E
-   DMNT+ARA    DAMNA              26  9  K
-   RT+SAIVI    SUIVRAIT        *  94 11  E
-   ACAOVEP     AVEC               28 12  L
-   AOP+ARZO    CZAR               45  O 12
-   AOOP+REK    POKER              42 14  H
-   AO+TSTEM    MIES               34  9  E
-   AOTT+LEQ    QAT                26  J 10
-   AELOT+RS    VASE               31  M 12
-   LORT        FORET              16  E  1
 
-   total                         975
+Rack 0: L
+Score 0:  975
 commande> q
 fin du mode entraînement
 commande> q

Index: test/training_joker_variant.ref
===================================================================
RCS file: /cvsroot/eliot/eliot/test/training_joker_variant.ref,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -b -r1.2 -r1.3
--- test/training_joker_variant.ref     23 Jun 2009 21:36:33 -0000      1.2
+++ test/training_joker_variant.ref     29 Nov 2009 16:01:33 -0000      1.3
@@ -116,21 +116,20 @@
  A B C D  E F G H I J K L M N O P Q R S T U V W X Y Z ?
  7 2 2 3 13 2 2 1 7 1 0 5 3 6 6 1 1 6 3 6 5 1 0 1 0 1 0
 commande> a p
-Eliot 1.5
+Game: player 1 out of 1
+Game: mode=Training
+Game: variant=joker
+Game: history:
+    N | P |   RACK   |    SOLUTION    | REF | PTS | BONUS
+   ===|===|==========|================|=====|=====|======
+    1 | 0 |  E?ESAVP | PAVEuSE        |  H2 |  80 | *
+    2 | 0 |  WHISKYS | WHISKEYS       |  5C | 126 | *
+    3 | 0 |  NII?NAX | kA             |  3G |   1 |  
+    4 | 0 | AIINNX+? | kAS            |  J3 |   2 |  
 
-Game type: Training
-Player 0: Human
-
-    N |   RACK   |    SOLUTION     | REF | PTS | P | BONUS
-   ===|==========|=================|=====|=====|===|======
-    1 |  E?ESAVP | PAVEuSE         |  H2 |  80 | 0 | *
-    2 |  WHISKYS | WHISKEYS        |  5C | 126 | 0 | *
-    3 |  NII?NAX | kA              |  3G |   1 | 0 |  
-    4 | AIINNX+? | kAS             |  J3 |   2 | 0 |  
-
-   Total: 209
 
 Rack 0: IINNX
+Score 0:  209
 commande> h p
 commande> a g
      1  2  3  4  5  6  7  8  9 10 11 12 13 14 15

Index: test/training_navigation.ref
===================================================================
RCS file: /cvsroot/eliot/eliot/test/training_navigation.ref,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -b -r1.2 -r1.3
--- test/training_navigation.ref        23 Jun 2009 21:36:33 -0000      1.2
+++ test/training_navigation.ref        29 Nov 2009 16:01:33 -0000      1.3
@@ -36,20 +36,19 @@
  N   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
  O   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
 commande> a p
-Eliot 1.5
+Game: player 1 out of 1
+Game: mode=Training
+Game: variant=unknown
+Game: history:
+    N | P |   RACK   |    SOLUTION    | REF | PTS | BONUS
+   ===|===|==========|================|=====|=====|======
+    1 | 0 |  SEUTISG | GITES          |  H4 |  16 |  
+    2 | 0 | SU+XULRO | LUX            |  I5 |  47 |  
+    3 | 0 | ORSU+SCD | SOURDS         |  J6 |  30 |  
 
-Game type: Training
-Player 0: Human
-
-    N |   RACK   |    SOLUTION     | REF | PTS | P | BONUS
-   ===|==========|=================|=====|=====|===|======
-    1 |  SEUTISG | GITES           |  H4 |  16 | 0 |  
-    2 | SU+XULRO | LUX             |  I5 |  47 | 0 |  
-    3 | ORSU+SCD | SOURDS          |  J6 |  30 | 0 |  
-
-   Total: 93
 
 Rack 0: C
+Score 0:   93
 commande> h n
 commande> a g
      1  2  3  4  5  6  7  8  9 10 11 12 13 14 15
@@ -69,20 +68,19 @@
  N   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
  O   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
 commande> a p
-Eliot 1.5
-
-Game type: Training
-Player 0: Human
+Game: player 1 out of 1
+Game: mode=Training
+Game: variant=unknown
+Game: history:
+    N | P |   RACK   |    SOLUTION    | REF | PTS | BONUS
+   ===|===|==========|================|=====|=====|======
+    1 | 0 |  SEUTISG | GITES          |  H4 |  16 |  
+    2 | 0 | SU+XULRO | LUX            |  I5 |  47 |  
+    3 | 0 | ORSU+SCD | SOURDS         |  J6 |  30 |  
 
-    N |   RACK   |    SOLUTION     | REF | PTS | P | BONUS
-   ===|==========|=================|=====|=====|===|======
-    1 |  SEUTISG | GITES           |  H4 |  16 | 0 |  
-    2 | SU+XULRO | LUX             |  I5 |  47 | 0 |  
-    3 | ORSU+SCD | SOURDS          |  J6 |  30 | 0 |  
-
-   Total: 93
 
 Rack 0: C
+Score 0:   93
 commande> h p
 commande> a g
      1  2  3  4  5  6  7  8  9 10 11 12 13 14 15
@@ -102,19 +100,18 @@
  N   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
  O   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
 commande> a p
-Eliot 1.5
-
-Game type: Training
-Player 0: Human
-
-    N |   RACK   |    SOLUTION     | REF | PTS | P | BONUS
-   ===|==========|=================|=====|=====|===|======
-    1 |  SEUTISG | GITES           |  H4 |  16 | 0 |  
-    2 | SU+XULRO | LUX             |  I5 |  47 | 0 |  
+Game: player 1 out of 1
+Game: mode=Training
+Game: variant=unknown
+Game: history:
+    N | P |   RACK   |    SOLUTION    | REF | PTS | BONUS
+   ===|===|==========|================|=====|=====|======
+    1 | 0 |  SEUTISG | GITES          |  H4 |  16 |  
+    2 | 0 | SU+XULRO | LUX            |  I5 |  47 |  
 
-   Total: 63
 
 Rack 0: ORSU
+Score 0:   63
 commande> h p
 commande> a g
      1  2  3  4  5  6  7  8  9 10 11 12 13 14 15
@@ -134,18 +131,17 @@
  N   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
  O   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
 commande> a p
-Eliot 1.5
+Game: player 1 out of 1
+Game: mode=Training
+Game: variant=unknown
+Game: history:
+    N | P |   RACK   |    SOLUTION    | REF | PTS | BONUS
+   ===|===|==========|================|=====|=====|======
+    1 | 0 |  SEUTISG | GITES          |  H4 |  16 |  
 
-Game type: Training
-Player 0: Human
-
-    N |   RACK   |    SOLUTION     | REF | PTS | P | BONUS
-   ===|==========|=================|=====|=====|===|======
-    1 |  SEUTISG | GITES           |  H4 |  16 | 0 |  
-
-   Total: 16
 
 Rack 0: SU
+Score 0:   16
 commande> h p
 commande> a g
      1  2  3  4  5  6  7  8  9 10 11 12 13 14 15
@@ -165,17 +161,16 @@
  N   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
  O   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
 commande> a p
-Eliot 1.5
-
-Game type: Training
-Player 0: Human
+Game: player 1 out of 1
+Game: mode=Training
+Game: variant=unknown
+Game: history:
+    N | P |   RACK   |    SOLUTION    | REF | PTS | BONUS
+   ===|===|==========|================|=====|=====|======
 
-    N |   RACK   |    SOLUTION     | REF | PTS | P | BONUS
-   ===|==========|=================|=====|=====|===|======
-
-   Total: 0
 
 Rack 0: 
+Score 0:    0
 commande> h l
 commande> a g
      1  2  3  4  5  6  7  8  9 10 11 12 13 14 15
@@ -195,20 +190,19 @@
  N   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
  O   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
 commande> a p
-Eliot 1.5
-
-Game type: Training
-Player 0: Human
+Game: player 1 out of 1
+Game: mode=Training
+Game: variant=unknown
+Game: history:
+    N | P |   RACK   |    SOLUTION    | REF | PTS | BONUS
+   ===|===|==========|================|=====|=====|======
+    1 | 0 |  SEUTISG | GITES          |  H4 |  16 |  
+    2 | 0 | SU+XULRO | LUX            |  I5 |  47 |  
+    3 | 0 | ORSU+SCD | SOURDS         |  J6 |  30 |  
 
-    N |   RACK   |    SOLUTION     | REF | PTS | P | BONUS
-   ===|==========|=================|=====|=====|===|======
-    1 |  SEUTISG | GITES           |  H4 |  16 | 0 |  
-    2 | SU+XULRO | LUX             |  I5 |  47 | 0 |  
-    3 | ORSU+SCD | SOURDS          |  J6 |  30 | 0 |  
-
-   Total: 93
 
 Rack 0: C
+Score 0:   93
 commande> +
 commande> a t
 C?BETNL
@@ -237,20 +231,19 @@
  N   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
  O   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
 commande> a p
-Eliot 1.5
-
-Game type: Training
-Player 0: Human
-
-    N |   RACK   |    SOLUTION     | REF | PTS | P | BONUS
-   ===|==========|=================|=====|=====|===|======
-    1 |  SEUTISG | GITES           |  H4 |  16 | 0 |  
-    2 | SU+XULRO | LUX             |  I5 |  47 | 0 |  
-    3 | ORSU+SCD | SOURDS          |  J6 |  30 | 0 |  
+Game: player 1 out of 1
+Game: mode=Training
+Game: variant=unknown
+Game: history:
+    N | P |   RACK   |    SOLUTION    | REF | PTS | BONUS
+   ===|===|==========|================|=====|=====|======
+    1 | 0 |  SEUTISG | GITES          |  H4 |  16 |  
+    2 | 0 | SU+XULRO | LUX            |  I5 |  47 |  
+    3 | 0 | ORSU+SCD | SOURDS         |  J6 |  30 |  
 
-   Total: 93
 
 Rack 0: C
+Score 0:   93
 commande> +
 Cannot add a command to an old turn
 commande> h f
@@ -272,17 +265,16 @@
  N   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
  O   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
 commande> a p
-Eliot 1.5
+Game: player 1 out of 1
+Game: mode=Training
+Game: variant=unknown
+Game: history:
+    N | P |   RACK   |    SOLUTION    | REF | PTS | BONUS
+   ===|===|==========|================|=====|=====|======
 
-Game type: Training
-Player 0: Human
-
-    N |   RACK   |    SOLUTION     | REF | PTS | P | BONUS
-   ===|==========|=================|=====|=====|===|======
-
-   Total: 0
 
 Rack 0: 
+Score 0:    0
 commande> h n
 commande> a g
      1  2  3  4  5  6  7  8  9 10 11 12 13 14 15
@@ -302,18 +294,17 @@
  N   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
  O   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
 commande> a p
-Eliot 1.5
-
-Game type: Training
-Player 0: Human
+Game: player 1 out of 1
+Game: mode=Training
+Game: variant=unknown
+Game: history:
+    N | P |   RACK   |    SOLUTION    | REF | PTS | BONUS
+   ===|===|==========|================|=====|=====|======
+    1 | 0 |  SEUTISG | GITES          |  H4 |  16 |  
 
-    N |   RACK   |    SOLUTION     | REF | PTS | P | BONUS
-   ===|==========|=================|=====|=====|===|======
-    1 |  SEUTISG | GITES           |  H4 |  16 | 0 |  
-
-   Total: 16
 
 Rack 0: SU
+Score 0:   16
 commande> h n
 commande> a g
      1  2  3  4  5  6  7  8  9 10 11 12 13 14 15
@@ -333,19 +324,18 @@
  N   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
  O   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
 commande> a p
-Eliot 1.5
-
-Game type: Training
-Player 0: Human
-
-    N |   RACK   |    SOLUTION     | REF | PTS | P | BONUS
-   ===|==========|=================|=====|=====|===|======
-    1 |  SEUTISG | GITES           |  H4 |  16 | 0 |  
-    2 | SU+XULRO | LUX             |  I5 |  47 | 0 |  
+Game: player 1 out of 1
+Game: mode=Training
+Game: variant=unknown
+Game: history:
+    N | P |   RACK   |    SOLUTION    | REF | PTS | BONUS
+   ===|===|==========|================|=====|=====|======
+    1 | 0 |  SEUTISG | GITES          |  H4 |  16 |  
+    2 | 0 | SU+XULRO | LUX            |  I5 |  47 |  
 
-   Total: 63
 
 Rack 0: ORSU
+Score 0:   63
 commande> *
 Cannot add a command to an old turn
 commande> +
@@ -376,20 +366,19 @@
  N   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
  O   -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
 commande> a p
-Eliot 1.5
-
-Game type: Training
-Player 0: Human
-
-    N |   RACK   |    SOLUTION     | REF | PTS | P | BONUS
-   ===|==========|=================|=====|=====|===|======
-    1 |  SEUTISG | GITES           |  H4 |  16 | 0 |  
-    2 | SU+XULRO | LUX             |  I5 |  47 | 0 |  
-    3 |    HELLO | OHE             |  J7 |  18 | 0 |  
+Game: player 1 out of 1
+Game: mode=Training
+Game: variant=unknown
+Game: history:
+    N | P |   RACK   |    SOLUTION    | REF | PTS | BONUS
+   ===|===|==========|================|=====|=====|======
+    1 | 0 |  SEUTISG | GITES          |  H4 |  16 |  
+    2 | 0 | SU+XULRO | LUX            |  I5 |  47 |  
+    3 | 0 |    HELLO | OHE            |  J7 |  18 |  
 
-   Total: 81
 
 Rack 0: LL
+Score 0:   81
 commande> q
 fin du mode entraînement
 commande> q

Index: test/training_rosace.input
===================================================================
RCS file: /cvsroot/eliot/eliot/test/training_rosace.input,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -b -r1.4 -r1.5
--- test/training_rosace.input  15 Jan 2009 20:55:57 -0000      1.4
+++ test/training_rosace.input  29 Nov 2009 16:01:33 -0000      1.5
@@ -19,7 +19,7 @@
 j TYPE O12
 a gd # r1
 t NUU+S?GE
-a P
+a p
 a t
 a l
 a g

Index: test/training_rosace.ref
===================================================================
RCS file: /cvsroot/eliot/eliot/test/training_rosace.ref,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -b -r1.8 -r1.9
--- test/training_rosace.ref    23 Jun 2009 21:36:33 -0000      1.8
+++ test/training_rosace.ref    29 Nov 2009 16:01:33 -0000      1.9
@@ -54,20 +54,26 @@
  Nc 
[ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][010d714e:
 1][00000000:-1][00005040: 1][ffffffff:-1][ffffffff:-1]
  Oc 
[ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][00000000:15][00000000:-1][00000000:-1][00000000:-1][00000000:-1]
 commande> t NUU+S?GE
-commande> a P
-Eliot
+commande> a p
+Game: player 1 out of 1
+Game: mode=Training
+Game: variant=unknown
+Game: history:
+    N | P |   RACK   |    SOLUTION    | REF | PTS | BONUS
+   ===|===|==========|================|=====|=====|======
+    1 | 0 |  WAEROSC | ROSACE         |  H8 |  22 |  
+    2 | 0 | W+TSREIN | WESTERN        | 13G |  54 |  
+    3 | 0 | I+RDTVI? | DIVeRTIR       |  8A |  83 | *
+    4 | 0 |  ELMOEAH | AH             |  I8 |  30 |  
+    5 | 0 | EELMO+PI | DIPLOMEE       |  A8 |  89 | *
+    6 | 0 |  OHUMJUI | JOUI           | 12K |  37 |  
+    7 | 0 | HMU+EAUA | HUE            | 14F |  34 |  
+    8 | 0 | AAMU+UBS | SAMBA          | 15H |  57 |  
+    9 | 0 | UU+NYTEP | TYPE           | O12 |  61 |  
 
-   WAEROSC     ROSACE             22  H  8
-   W+TSREIN    WESTERN            54 13  G
-   I+RDTVI?    DIVeRTIR        *  83  8  A
-   ELMOEAH     AH                 30  I  8
-   EELMO+PI    DIPLOMEE        *  89  A  8
-   OHUMJUI     JOUI               37 12  K
-   HMU+EAUA    HUE                34 14  F
-   AAMU+UBS    SAMBA              57 15  H
-   UU+NYTEP    TYPE               61  O 12
 
-   total                         467
+Rack 0: NUU+S?GE
+Score 0:  467
 commande> a t
 NUUS?GE
 commande> a l

Index: utils/Makefile.am
===================================================================
RCS file: /cvsroot/eliot/eliot/utils/Makefile.am,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -b -r1.12 -r1.13
--- utils/Makefile.am   22 Sep 2008 21:21:45 -0000      1.12
+++ utils/Makefile.am   29 Nov 2009 16:01:34 -0000      1.13
@@ -25,7 +25,8 @@
 if BUILD_TEXT
 noinst_PROGRAMS += eliottxt
 eliottxt_SOURCES = game_io.h game_io.cpp eliottxt.cpp
-eliottxt_LDADD = $(top_builddir)/game/libgame.a $(top_builddir)/dic/libdic.a 
@LIBINTL@ @LIBCONFIG_LIBS@
+eliottxt_LDADD = $(top_builddir)/game/libgame.a $(top_builddir)/dic/libdic.a 
@LIBINTL@ @LIBCONFIG_LIBS@ @ARABICA_LIBS@
+
 if HAS_READLINE
 eliottxt_LDADD += -lreadline
 endif
@@ -34,6 +35,6 @@
 if BUILD_NCURSES
 bin_PROGRAMS += eliotcurses
 eliotcurses_SOURCES = ncurses.cpp ncurses.h
-eliotcurses_LDADD = ../game/libgame.a ../dic/libdic.a -lncursesw @LIBINTL@ 
@LIBCONFIG_LIBS@
+eliotcurses_LDADD = ../game/libgame.a ../dic/libdic.a -lncursesw @LIBINTL@ 
@LIBCONFIG_LIBS@ @ARABICA_LIBS@
 endif
 

Index: utils/eliottxt.cpp
===================================================================
RCS file: /cvsroot/eliot/eliot/utils/eliottxt.cpp,v
retrieving revision 1.39
retrieving revision 1.40
diff -u -b -r1.39 -r1.40
--- utils/eliottxt.cpp  21 Sep 2009 20:10:34 -0000      1.39
+++ utils/eliottxt.cpp  29 Nov 2009 16:01:34 -0000      1.40
@@ -211,7 +211,6 @@
     printf("            l -- lettres non jouées\n");
     printf("            p -- partie\n");
     printf("            pd -- partie (debug)\n");
-    printf("            P -- partie (format standard)\n");
     printf("            r -- recherche\n");
     printf("            s -- score\n");
     printf("            S -- score de tous les joueurs\n");
@@ -244,7 +243,6 @@
     printf("            j -- joueur courant\n");
     printf("            l -- lettres non jouées\n");
     printf("            p -- partie\n");
-    printf("            P -- partie (format standard)\n");
     printf("            s -- score\n");
     printf("            S -- score de tous les joueurs\n");
     printf("            t -- tirage\n");
@@ -269,7 +267,6 @@
     printf("            j -- joueur courant\n");
     printf("            l -- lettres non jouées\n");
     printf("            p -- partie\n");
-    printf("            P -- partie (format standard)\n");
     printf("            s -- score\n");
     printf("            S -- score de tous les joueurs\n");
     printf("            t -- tirage\n");
@@ -335,11 +332,13 @@
     else if (displayType == L"l")
         GameIO::printNonPlayed(cout, iGame);
     else if (displayType == L"p")
-        iGame.save(cout, PublicGame::kFILE_FORMAT_ADVANCED);
+    {
+        GameIO::printGameDebug(cout, iGame);
+        GameIO::printAllRacks(cout, iGame);
+        GameIO::printAllPoints(cout, iGame);
+    }
     else if (displayType == L"pd")
         GameIO::printGameDebug(cout, iGame);
-    else if (displayType == L"P")
-        iGame.save(cout, PublicGame::kFILE_FORMAT_STANDARD);
     else if (displayType == L"r")
     {
         const wstring &limit = checkNumToken(tokens, 2);
@@ -430,15 +429,15 @@
         const wstring &word = checkFileNameToken(tokens, 1);
         if (word != L"")
         {
-            string filename = convertToMb(word);
-            ofstream fout(filename.c_str());
-            if (fout.rdstate() == ios::failbit)
+            try
+            {
+                iGame.save(convertToMb(word));
+            }
+            catch (std::exception &e)
             {
-                printf("impossible d'ouvrir %s\n", filename.c_str());
+                printf("Cannot save game to %ls: %s\n", word.c_str(), 
e.what());
                 return;
             }
-            iGame.save(fout);
-            fout.close();
         }
     }
 }
@@ -863,14 +862,9 @@
                         if (wfileName != L"")
                         {
                             string filename = convertToMb(wfileName);
-                            Game *tmpGame = 
GameFactory::Instance()->load(filename, iDic);
-                            if (tmpGame == NULL)
-                            {
-                                printf("erreur pendant le chargement de la 
partie\n");
-                            }
-                            else
+                            try
                             {
-                                PublicGame *game = new PublicGame(*tmpGame);
+                                PublicGame *game = PublicGame::load(filename, 
iDic);
                                 switch (game->getMode())
                                 {
                                     case PublicGame::kTRAINING:
@@ -886,6 +880,11 @@
                                 //GameFactory::Instance()->releaseGame(*game);
                                 delete game;
                             }
+                            catch (const std::exception &e)
+                            {
+                                string msg = string("Error loading the game: 
") + e.what();
+                                printf("%s\n", msg.c_str());
+                            }
                         }
                     }
                     break;
@@ -893,6 +892,7 @@
                     {
                         // New training game
                         Training *tmpGame = 
GameFactory::Instance()->createTraining(iDic);
+                        tmpGame->addPlayer(new HumanPlayer);
                         PublicGame *game = new PublicGame(*tmpGame);
                         // Set the variant
                         if (tokens[0].size() > 1)

Index: utils/game_io.cpp
===================================================================
RCS file: /cvsroot/eliot/eliot/utils/game_io.cpp,v
retrieving revision 1.19
retrieving revision 1.20
diff -u -b -r1.19 -r1.20
--- utils/game_io.cpp   23 Jun 2009 21:36:33 -0000      1.19
+++ utils/game_io.cpp   29 Nov 2009 16:01:34 -0000      1.20
@@ -19,6 +19,7 @@
  *****************************************************************************/
 
 #include <boost/foreach.hpp>
+#include <boost/format.hpp>
 
 #include <iomanip>
 #include <string>
@@ -32,9 +33,17 @@
 #include "results.h"
 #include "player.h"
 #include "encoding.h"
+#include "history.h"
+#include "turn.h"
+#include "move.h"
+#include "round.h"
 
 using namespace std;
 
+using boost::format;
+using boost::wformat;
+
+
 #define __UNUSED__ __attribute__((unused))
 
 void GameIO::printBoard(ostream &out, const PublicGame &iGame)
@@ -210,8 +219,8 @@
 {
     for (unsigned int j = 0; j < iGame.getNbPlayers(); j++)
     {
-        out << "Joueur " << j << ": ";
-        out << 
convertToMb(iGame.getPlayer(j).getCurrentRack().toString(PlayedRack::RACK_SIMPLE))
 << endl;
+        out << "Rack " << j << ": ";
+        out << 
convertToMb(iGame.getPlayer(j).getCurrentRack().toString(PlayedRack::RACK_EXTRA))
 << endl;
     }
 }
 
@@ -220,7 +229,7 @@
 {
     const Round &r = iResults.get(num);
     const wstring &word = r.getWord();
-    if (word.size() == 0)
+    if (word.empty())
         return;
     out << convertToMb(word) << string(16 - word.size(), ' ')
         << (r.getBonus() ? '*' : ' ')
@@ -250,7 +259,7 @@
 {
     for (unsigned int i = 0; i < iGame.getNbPlayers(); i++)
     {
-        out << "Joueur " << i << ": "
+        out << "Score " << i << ": "
             << setw(4) << iGame.getPlayer(i).getPoints() << endl;
     }
 }
@@ -258,24 +267,59 @@
 
 void GameIO::printGameDebug(ostream &out, const PublicGame &iGame)
 {
-    out << "Game:: joueur en cours " << iGame.getCurrentPlayer().getId()
-        << " sur " << iGame.getNbPlayers() << endl;
-    out << "Game:: mode " << iGame.getModeAsString() << endl;
-    out << "Game:: variante ";
+    out << "Game: player " << iGame.getCurrentPlayer().getId() + 1
+        << " out of " << iGame.getNbPlayers() << endl;
+    out << "Game: mode=" << iGame.getModeAsString() << endl;
+    out << "Game: variant=";
     switch (iGame.getVariant())
     {
-        case PublicGame::kNONE:
-            out << "aucune" << endl;
+        case PublicGame::kEXPLOSIVE:
+            out << "explosive" << endl;
             break;
         case PublicGame::kJOKER:
             out << "joker" << endl;
             break;
         default:
-            out << "inconnu" << endl;
+            out << "unknown" << endl;
             break;
     }
-    out << "Game:: history --" << endl;
-    out << convertToMb(iGame.getHistory().toString());
-    out << "--" << endl;
-    out << "" << endl;
+    out << "Game: history:" << endl;
+    out << "    N | P |   RACK   |    SOLUTION    | REF | PTS | BONUS" << endl;
+    out << "   ===|===|==========|================|=====|=====|======" << endl;
+    for (unsigned int i = 0; i < iGame.getHistory().getSize(); ++i)
+    {
+        const Turn &turn = iGame.getHistory().getTurn(i);
+        const Move &move = turn.getMove();
+        format fmter("%1% | %2% | %3% | %4% | %5% | %6% | %7%");
+        fmter % padAndConvert(str(wformat(L"%1%") % (i + 1)), 5);
+        fmter % padAndConvert(str(wformat(L"%1%") % turn.getPlayer()), 1);
+        fmter % padAndConvert(turn.getPlayedRack().toString(), 8);
+        if (move.getType() == Move::VALID_ROUND)
+        {
+            const Round &round = move.getRound();
+            fmter % padAndConvert(round.getWord(), 14, false);
+            fmter % padAndConvert(round.getCoord().toString(), 3);
+            fmter % padAndConvert(str(wformat(L"%1%") % round.getPoints()), 3);
+            fmter % padAndConvert(round.getBonus() ? L"*": L"", 1, false);
+        }
+        else
+        {
+            if (move.getType() == Move::INVALID_WORD)
+            {
+                fmter % padAndConvert(L"#" + move.getBadWord() + L"#", 14, 
false);
+                fmter % padAndConvert(move.getBadCoord(), 3);
+            }
+            else if (move.getType() == Move::CHANGE_LETTERS)
+            {
+                fmter % padAndConvert(L"[" + move.getChangedLetters() + L"]", 
14, false) % " - ";
+            }
+            else
+            {
+                fmter % padAndConvert(L"(PASS)", 14, false) % " - ";
+            }
+            fmter % "  0" % " ";
+        }
+        out << fmter.str() << endl;
+    }
+    out << endl << endl;
 }

Index: utils/game_io.h
===================================================================
RCS file: /cvsroot/eliot/eliot/utils/game_io.h,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -b -r1.6 -r1.7
--- utils/game_io.h     30 Nov 2008 20:53:46 -0000      1.6
+++ utils/game_io.h     29 Nov 2009 16:01:34 -0000      1.7
@@ -18,8 +18,8 @@
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  *****************************************************************************/
 
-#ifndef _GAME_IO_H_
-#define _GAME_IO_H_
+#ifndef GAME_IO_H_
+#define GAME_IO_H_
 
 #include <iostream>
 

Index: utils/ncurses.cpp
===================================================================
RCS file: /cvsroot/eliot/eliot/utils/ncurses.cpp,v
retrieving revision 1.33
retrieving revision 1.34
diff -u -b -r1.33 -r1.34
--- utils/ncurses.cpp   23 Jun 2009 12:41:54 -0000      1.33
+++ utils/ncurses.cpp   29 Nov 2009 16:01:34 -0000      1.34
@@ -30,7 +30,6 @@
 
 #include <ctype.h>
 #include <cstring> // For strlen
-#include <fstream>
 #include <algorithm>
 
 #include "ncurses.h"
@@ -614,21 +613,18 @@
     wstring filename;
     if (readString(win, y + 2, x + 2, 28, filename, kFILENAME))
     {
-        ofstream fout(convertToMb(filename).c_str());
         char s[100];
-        if (fout.rdstate() == ios::failbit)
-        {
-            snprintf(s, 100, _("Cannot open file %ls for writing"),
-                     filename.c_str());
-            drawStatus(win, s);
-        }
-        else
+        try
         {
-            m_game->save(fout, PublicGame::kFILE_FORMAT_ADVANCED);
-            fout.close();
+            m_game->save(convertToMb(filename));
             snprintf(s, 100, _("Game saved in '%ls'"), filename.c_str());
             drawStatus(win, s, false);
         }
+        catch (std::exception &e)
+        {
+            snprintf(s, 100, _("Error saving game %s:"), e.what());
+            drawStatus(win, s);
+        }
     }
     box.clear();
 }
@@ -644,30 +640,19 @@
     wstring filename;
     if (readString(win, y + 2, x + 2, 28, filename, kFILENAME))
     {
-        char s[100];
-        FILE *fin;
-        if ((fin = fopen(convertToMb(filename).c_str(), "r")) == NULL)
-        {
-            snprintf(s, 100, _("Cannot open file '%ls' for reading"),
-                     filename.c_str());
-        }
-        else
-        {
-            PublicGame *loaded = PublicGame::load(fin, m_game->getDic());
-            if (loaded == NULL)
-            {
-                snprintf(s, 100, _("Invalid saved game"));
-                drawStatus(win, s);
-            }
-            else
+        try
             {
-                snprintf(s, 100, _("Game loaded"));
+            PublicGame *loaded = PublicGame::load(convertToMb(filename), 
m_game->getDic());
                 //GameFactory::Instance()->releaseGame(*m_game);
                 delete m_game;
                 m_game = loaded;
+            char s[100];
+            snprintf(s, 100, _("Game loaded"));
                 drawStatus(win, s, false);
             }
-            fclose(fin);
+        catch (const GameException &e)
+        {
+            drawStatus(win, _("Unable to load game: ") + string(e.what()));
         }
     }
     box.clear();

Index: utils/ncurses.h
===================================================================
RCS file: /cvsroot/eliot/eliot/utils/ncurses.h,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -b -r1.8 -r1.9
--- utils/ncurses.h     30 Nov 2008 20:53:46 -0000      1.8
+++ utils/ncurses.h     29 Nov 2009 16:01:34 -0000      1.9
@@ -17,8 +17,8 @@
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  *****************************************************************************/
 
-#ifndef _NCURSES_H_
-#define _NCURSES_H_
+#ifndef NCURSES_H_
+#define NCURSES_H_
 
 #include <ncursesw/curses.h>
 #include <string>

Index: game/mark_played_cmd.cpp
===================================================================
RCS file: game/mark_played_cmd.cpp
diff -N game/mark_played_cmd.cpp
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ game/mark_played_cmd.cpp    29 Nov 2009 16:01:32 -0000      1.1
@@ -0,0 +1,57 @@
+/*****************************************************************************
+ * Eliot
+ * Copyright (C) 2009 Olivier Teulière
+ * Authors: Olivier Teulière <ipkiss @@ gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *****************************************************************************/
+
+#include <sstream>
+#include "mark_played_cmd.h"
+#include "duplicate.h"
+
+using namespace std;
+
+
+MarkPlayedCmd::MarkPlayedCmd(Duplicate &ioDuplicate,
+                             unsigned int iPlayerId,
+                             bool iPlayedFlag)
+    : m_duplicateGame(ioDuplicate), m_playerId(iPlayerId),
+      m_newPlayedFlag(iPlayedFlag)
+{
+}
+
+
+void MarkPlayedCmd::doExecute()
+{
+    m_oldPlayedFlag = m_duplicateGame.hasPlayed(m_playerId);
+    m_duplicateGame.setPlayedFlag(m_playerId, m_newPlayedFlag);
+}
+
+
+void MarkPlayedCmd::doUndo()
+{
+    m_duplicateGame.setPlayedFlag(m_playerId, m_oldPlayedFlag);
+}
+
+
+wstring MarkPlayedCmd::toString() const
+{
+    wostringstream oss;
+    oss << L"MarkPlayedCmd (player " << m_playerId
+        << L" marked " << m_newPlayedFlag << L")";
+    return oss.str();
+}
+

Index: game/mark_played_cmd.h
===================================================================
RCS file: game/mark_played_cmd.h
diff -N game/mark_played_cmd.h
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ game/mark_played_cmd.h      29 Nov 2009 16:01:32 -0000      1.1
@@ -0,0 +1,54 @@
+/*****************************************************************************
+ * Eliot
+ * Copyright (C) 2009 Olivier Teulière
+ * Authors: Olivier Teulière <ipkiss @@ gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *****************************************************************************/
+
+#ifndef MARK_PLAYED_CMD_H_
+#define MARK_PLAYED_CMD_H_
+
+#include "command.h"
+
+class Duplicate;
+
+
+/**
+ * Command used internally to change the "has played" flag of a player
+ * in a duplicate game.
+ */
+class MarkPlayedCmd: public Command
+{
+    public:
+        MarkPlayedCmd(Duplicate &ioDuplicate,
+                      unsigned int iPlayerId,
+                      bool iPlayedFlag);
+
+        virtual wstring toString() const;
+
+    protected:
+        virtual void doExecute();
+        virtual void doUndo();
+
+    private:
+        Duplicate &m_duplicateGame;
+        unsigned int m_playerId;
+        bool m_newPlayedFlag;
+        bool m_oldPlayedFlag;
+};
+
+#endif
+

Index: game/xml_reader.cpp
===================================================================
RCS file: game/xml_reader.cpp
diff -N game/xml_reader.cpp
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ game/xml_reader.cpp 29 Nov 2009 16:01:32 -0000      1.1
@@ -0,0 +1,337 @@
+/*******************************************************************
+ * Eliot
+ * Copyright (C) 2009 Olivier Teulière
+ * Authors: Olivier Teulière <ipkiss @@ gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *****************************************************************************/
+
+#include <fstream>
+#include <SAX/XMLReader.hpp>
+#include <SAX/InputSource.hpp>
+
+#include "xml_reader.h"
+#include "dic.h"
+#include "game_exception.h"
+#include "game_factory.h"
+#include "training.h"
+#include "duplicate.h"
+#include "freegame.h"
+#include "player.h"
+#include "ai_percent.h"
+#include "encoding.h"
+#include "game_move_cmd.h"
+#include "player_rack_cmd.h"
+#include "player_move_cmd.h"
+#include "player_points_cmd.h"
+#include "navigation.h"
+
+using namespace std;
+
+
+Game * XmlReader::read(const string &iFileName, const Dictionary &iDic)
+{
+    // Try to load the old format first
+    try
+    {
+        FILE *fin = fopen(iFileName.c_str(), "r");
+        if (fin != NULL)
+        {
+            Game *game = Game::load(fin, iDic);
+            fclose(fin);
+
+            if (game != NULL)
+                return game;
+        }
+    }
+    catch (const GameException &e)
+    {
+        // Ignore the exception
+    }
+
+    ifstream is(iFileName.c_str());
+    if (!is.is_open())
+        throw LoadGameException("Cannot open file '" + iFileName + "'");
+
+    XmlReader handler(iDic);
+
+    // Set up of the parser
+    Arabica::SAX::XMLReader<std::string> parser;
+    parser.setContentHandler(handler);
+    parser.setErrorHandler(handler);
+
+    // Parsing
+    Arabica::SAX::InputSource<std::string> source(is);
+    parser.parse(source);
+
+    Game *game = handler.getGame();
+    if (game == NULL)
+        throw LoadGameException(handler.errorMessage);
+    return game;
+}
+
+
+static wstring fromUtf8(const string &str)
+{
+    return readFromUTF8(str.c_str(), str.size(), "Loading game");
+}
+
+
+static int toInt(const string &str)
+{
+    if (str.empty())
+        throw LoadGameException("Invalid string to int conversion: empty 
string received");
+    return atoi(str.c_str());
+}
+
+
+static Player & getPlayer(map<string, Player*> &players, const string &id)
+{
+    if (players.find(id) == players.end())
+        throw LoadGameException("Invalid player ID: " + id);
+    return *players[id];
+}
+
+
+static Move buildMove(const Game &iGame, map<string, string> &attr,
+                      bool checkRack)
+{
+    // Build the Move object
+    string type = attr["type"];
+    if (type == "valid")
+    {
+        Round round;
+        int res = iGame.checkPlayedWord(fromUtf8(attr["coord"]),
+                                        fromUtf8(attr["word"]),
+                                        round, checkRack);
+        if (res != 0)
+        {
+            throw LoadGameException("Invalid move marked as valid: " +
+                                    attr["word"] + " (" + attr["coord"] + ")");
+        }
+        return Move(round);
+    }
+    else if (type == "invalid")
+    {
+        return Move(fromUtf8(attr["word"]),
+                    fromUtf8(attr["coord"]));
+    }
+    else if (type == "change")
+    {
+        return Move(fromUtf8(attr["letters"]));
+    }
+    else if (type == "pass")
+    {
+        return Move(L"");
+    }
+    else
+        throw LoadGameException("Invalid move type: " + type);
+}
+
+
+Game * XmlReader::getGame()
+{
+    // TODO
+    return m_game;
+}
+
+
+void XmlReader::startElement(const string& namespaceURI,
+                             const string& localName,
+                             const string& qName,
+                             const Arabica::SAX::Attributes<string>& atts)
+{
+    (void) namespaceURI;
+    (void) qName;
+#if 0
+    if (!localName.empty())
+        std::cout << "Start Element: " << namespaceURI << ":" << localName << 
std::endl;
+    else
+        std::cout << "Start Element: " << qName << std::endl;
+#endif
+    m_data.clear();
+    const string &tag = localName;
+    if (tag == "Player")
+    {
+        m_context = "Player";
+        m_attributes.clear();
+        for (int i = 0; i < atts.getLength(); ++i)
+        {
+            m_attributes[atts.getLocalName(i)] = atts.getValue(i);
+        }
+    }
+    else if (tag == "PlayerRack")
+    {
+        m_attributes.clear();
+        for (int i = 0; i < atts.getLength(); ++i)
+        {
+            m_attributes[atts.getLocalName(i)] = atts.getValue(i);
+        }
+    }
+    else if (tag == "PlayerMove" || tag == "GameMove")
+    {
+        m_attributes.clear();
+        for (int i = 0; i < atts.getLength(); ++i)
+        {
+            m_attributes[atts.getLocalName(i)] = atts.getValue(i);
+        }
+    }
+}
+
+
+void XmlReader::endElement(const string& namespaceURI,
+                           const string& localName,
+                           const string&)
+{
+    (void) namespaceURI;
+#if 0
+    std::cout << "endElement: " << namespaceURI << ":" << localName << "(" << 
m_data << ")" << std::endl;
+#endif
+    const string &tag = localName;
+    if (tag == "Mode")
+    {
+        if (m_data == "duplicate")
+            m_game = GameFactory::Instance()->createDuplicate(m_dic);
+        else if (m_data == "freegame")
+            m_game = GameFactory::Instance()->createFreeGame(m_dic);
+        else if (m_data == "training")
+            m_game = GameFactory::Instance()->createTraining(m_dic);
+        else
+            throw LoadGameException("Invalid game mode: " + m_data);
+        return;
+    }
+
+    // At this point, m_game must not be null anymore
+    if (m_game == NULL)
+        throw LoadGameException("The 'Mode' tag should be the first one to be 
closed");
+
+    if (tag == "Variant")
+    {
+        if (m_data == "bingo")
+            m_game->setVariant(Game::kJOKER);
+        else if (m_data == "explosive")
+            m_game->setVariant(Game::kEXPLOSIVE);
+        else
+            throw LoadGameException("Invalid game variant: " + m_data);
+    }
+
+    else if (m_context == "Player")
+    {
+        if (tag == "Name")
+            m_attributes["name"] = m_data;
+        else if (tag == "Type")
+            m_attributes["type"] = m_data;
+        else if (tag == "Level")
+            m_attributes["level"] = m_data;
+        else if (tag == "Player")
+        {
+            if (m_players.find(m_attributes["id"]) != m_players.end())
+                throw LoadGameException("A player ID must be unique: " + 
m_attributes["id"]);
+            // Create the player
+            Player *p;
+            if (m_attributes["type"] == "human")
+                p = new HumanPlayer();
+            else if (m_attributes["type"] == "computer")
+            {
+                int level = toInt(m_attributes["level"]);
+                p = new AIPercent(0.01 * level);
+            }
+            else
+                throw LoadGameException("Invalid player type: " + 
m_attributes["type"]);
+            m_players[m_attributes["id"]] = p;
+
+            // Set the name
+            p->setName(fromUtf8(m_attributes["name"]));
+
+            m_game->addPlayer(p);
+
+            m_context = "";
+        }
+    }
+
+    else if (tag == "Turn")
+    {
+        m_game->accessNavigation().newTurn();
+    }
+
+    else if (tag == "PlayerRack")
+    {
+        // Build a rack for the correct player
+        PlayedRack pldrack;
+        if (!m_dic.validateLetters(fromUtf8(m_data), L"-+"))
+        {
+            throw LoadGameException("Rack invalid for the current dictionary: 
" + m_data);
+        }
+        pldrack.setManual(fromUtf8(m_data));
+#if 0
+        cerr << "loaded rack: " << convertToMb(pldrack.toString()) << endl;
+#endif
+
+        Player &p = getPlayer(m_players, m_attributes["playerid"]);
+        PlayerRackCmd *cmd = new PlayerRackCmd(p, pldrack);
+        m_game->accessNavigation().addAndExecute(cmd);
+#if 0
+        cerr << "rack: " << convertToMb(pldrack.toString()) << endl;
+#endif
+    }
+
+    else if (tag == "PlayerMove")
+    {
+        const Move &move = buildMove(*m_game, m_attributes, /*XXX:true*/false);
+        Player &p = getPlayer(m_players, m_attributes["playerid"]);
+        PlayerMoveCmd *cmd = new PlayerMoveCmd(p, move);
+        m_game->accessNavigation().addAndExecute(cmd);
+    }
+
+    else if (tag == "GameMove")
+    {
+        const Move &move = buildMove(*m_game, m_attributes, false);
+        Player &p = getPlayer(m_players, m_attributes["playerid"]);
+        GameMoveCmd *cmd = new GameMoveCmd(*m_game, move, p.getId());
+        m_game->accessNavigation().addAndExecute(cmd);
+    }
+
+}
+
+
+void XmlReader::characters(const string& ch)
+{
+    m_data += ch;
+#if 0
+    std::cout << "Characters: " << ch << std::endl;
+#endif
+}
+
+
+void XmlReader::warning(const Arabica::SAX::SAXParseException<string>& 
exception)
+{
+    errorMessage = string("warning: ") + exception.what();
+    //throw LoadGameException(string("warning: ") + exception.what());
+}
+
+
+void XmlReader::error(const Arabica::SAX::SAXParseException<string>& exception)
+{
+    errorMessage = string("error: ") + exception.what();
+    //throw LoadGameException(string("error: ") + exception.what());
+}
+
+
+void XmlReader::fatalError(const Arabica::SAX::SAXParseException<string>& 
exception)
+{
+    errorMessage = string("fatal error: ") + exception.what();
+    //throw LoadGameException(string("fatal error: ") + exception.what());
+}
+

Index: game/xml_reader.h
===================================================================
RCS file: game/xml_reader.h
diff -N game/xml_reader.h
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ game/xml_reader.h   29 Nov 2009 16:01:33 -0000      1.1
@@ -0,0 +1,89 @@
+/*****************************************************************************
+ * Copyright (C) 2009 Eliot
+ * Authors: Olivier Teuliere  <address@hidden>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *****************************************************************************/
+
+#ifndef XML_READER_H_
+#define XML_READER_H_
+
+#include <map>
+#include <SAX/helpers/DefaultHandler.hpp>
+#include <SAX/Locator.hpp>
+#include <SAX/Attributes.hpp>
+#include <SAX/SAXException.hpp>
+
+class Dictionary;
+class Game;
+class Player;
+
+using std::string;
+using std::map;
+
+
+class XmlReader : public Arabica::SAX::DefaultHandler<string>
+{
+public:
+    virtual ~XmlReader() {}
+
+    /**
+     * Only entry point of the class.
+     * Create a Game object, from a XML file created using the XmlWriter class.
+     * The method throws an exception in case of problem.
+     */
+    static Game * read(const string &iFileName, const Dictionary &iDic);
+
+    // Return the built game
+    Game * getGame();
+
+    ////////////////////////////////////////////////////
+    // ContentHandler
+    virtual void startElement(const string& namespaceURI,
+                              const string& localName,
+                              const string& qName,
+                              const AttributesT& atts);
+    virtual void endElement(const string& namespaceURI,
+                            const string& localName,
+                            const string& qName);
+    virtual void characters(const string& ch);
+
+    /////////////////////////////////////////////////////
+    // ErrorHandler
+    virtual void warning(const Arabica::SAX::SAXParseException<string>&);
+    virtual void error(const Arabica::SAX::SAXParseException<string>&);
+    virtual void fatalError(const Arabica::SAX::SAXParseException<string>& 
exception);
+
+private:
+    const Dictionary &m_dic;
+    Game *m_game;
+    string errorMessage;
+
+    string m_context;
+    string m_data;
+    map<string, Player*> m_players;
+    map<string, string> m_attributes;
+
+    // Private constructor, because we only want the read() method
+    // to be called externally
+    XmlReader(const Dictionary &iDic) : m_dic(iDic), m_game(NULL) {}
+
+    XmlReader(const XmlReader&);
+    XmlReader& operator=(const XmlReader&);
+    bool operator==(const XmlReader&);
+};
+
+#endif
+

Index: game/xml_writer.cpp
===================================================================
RCS file: game/xml_writer.cpp
diff -N game/xml_writer.cpp
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ game/xml_writer.cpp 29 Nov 2009 16:01:33 -0000      1.1
@@ -0,0 +1,212 @@
+/*******************************************************************
+ * Eliot
+ * Copyright (C) 2009 Olivier Teulière
+ * Authors: Olivier Teulière <ipkiss @@ gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *****************************************************************************/
+
+#include <vector>
+#include <fstream>
+#include <boost/foreach.hpp>
+
+#include "xml_writer.h"
+#include "encoding.h"
+#include "turn_cmd.h"
+#include "game.h"
+#include "player.h"
+#include "ai_percent.h"
+#include "game_exception.h"
+#include "turn_cmd.h"
+#include "game_move_cmd.h"
+#include "player_rack_cmd.h"
+#include "player_move_cmd.h"
+#include "player_points_cmd.h"
+#include "mark_played_cmd.h"
+
+using namespace std;
+
+
+static void addIndent(string &s)
+{
+    s += "    ";
+}
+
+static void removeIndent(string &s)
+{
+    if (s.size() >= 4)
+        s.resize(s.size() - 4);
+}
+
+static string toUtf8(const wstring &s)
+{
+    return writeInUTF8(s, "Saving game");
+}
+
+static void writeMove(ostream &out, const Move &iMove,
+                      const string &iTag, unsigned int iPlayerId)
+{
+    out << "<" << iTag << " playerid=\"" << iPlayerId << "\" type=\"";
+    if (iMove.getType() == Move::VALID_ROUND)
+    {
+        const Round &round = iMove.getRound();
+        out << "valid\" word=\"" << toUtf8(round.getWord())
+            << "\" coord=\"" << toUtf8(round.getCoord().toString()) << "\" />";
+    }
+    else if (iMove.getType() == Move::INVALID_WORD)
+    {
+        out << "invalid\" word=\"" << toUtf8(iMove.getBadWord())
+            << "\" coord=\"" << toUtf8(iMove.getBadCoord()) << "\" />";
+    }
+    else if (iMove.getType() == Move::CHANGE_LETTERS)
+        out << "change\" letters=\"" << toUtf8(iMove.getChangedLetters()) << 
"\" />";
+    else if (iMove.getType() == Move::PASS)
+        out << "pass\" />";
+    else
+        throw SaveGameException("Unsupported move: " + 
convertToMb(iMove.toString()));
+}
+
+void XmlWriter::write(const Game &iGame, const string &iFileName)
+{
+    ofstream out(iFileName.c_str());
+    if (!out.is_open())
+        throw SaveGameException("Cannot open file for writing: '" + iFileName 
+ "'");
+
+
+    out << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" << endl;
+
+    string indent = "";
+    out << indent << "<EliotGame format=\"1\">" << endl;
+    addIndent(indent);
+
+    // ------------------------
+    // Write the header
+    out << indent << "<Game>" << endl;
+    addIndent(indent);
+    // Game type
+    out << indent << "<Mode>";
+    if (iGame.getMode() == Game::kDUPLICATE)
+        out << "duplicate";
+    else if (iGame.getMode() == Game::kFREEGAME)
+        out << "freegame";
+    else
+        out << "training";
+    out << "</Mode>" << endl;
+
+    // Game variant
+    if (iGame.getVariant() == Game::kJOKER)
+        out << indent << "<Variant>bingo</Variant>" << endl;
+    if (iGame.getVariant() == Game::kEXPLOSIVE)
+        out << indent << "<Variant>explosive</Variant>" << endl;
+
+    // Players
+    for (unsigned int i = 0; i < iGame.getNPlayers(); ++i)
+    {
+        const Player &player = iGame.getPlayer(i);
+        out << indent << "<Player id=\"" << player.getId() + 1 << "\">" << 
endl;
+        addIndent(indent);
+        out << indent << "<Name>" << toUtf8(player.getName()) << "</Name>" << 
endl;
+        out << indent << "<Type>" << (player.isHuman() ? "human" : "computer") 
<< "</Type>" << endl;
+        if (!player.isHuman())
+        {
+            const AIPercent *ai = dynamic_cast<const AIPercent *>(&player);
+            if (ai == NULL)
+                throw SaveGameException("Invalid player type for player " + i);
+            out << indent << "<Level>" << (int)(ai->getPercent() * 100) << 
"</Level>" << endl;
+        }
+        removeIndent(indent);
+        out << indent << "</Player>" << endl;
+    }
+
+    // Number of turns
+    out << indent << "<Turns>"
+        << iGame.getNavigation().getNbTurns() << "</Turns>" << endl;
+
+    removeIndent(indent);
+    out << indent << "</Game>" << endl;
+    // End of the header
+    // ------------------------
+
+    // ------------------------
+    // Write the game history
+    out << indent << "<History>" << endl;
+    addIndent(indent);
+
+#if 0
+    iGame.getNavigation().print();
+#endif
+    const vector<TurnCmd *> &turnCmdVect = iGame.getNavigation().getCommands();
+    BOOST_FOREACH(const TurnCmd *turn, turnCmdVect)
+    {
+        if (turn->getCommands().empty() && turn == turnCmdVect.back())
+            continue;
+        out << indent << "<Turn>" << endl;
+        addIndent(indent);
+        BOOST_FOREACH(const Command *cmd, turn->getCommands())
+        {
+            if (dynamic_cast<const PlayerRackCmd*>(cmd))
+            {
+                const PlayerRackCmd *rackCmd = static_cast<const 
PlayerRackCmd*>(cmd);
+                unsigned int id = rackCmd->getPlayer().getId() + 1;
+                out << indent << "<PlayerRack playerid=\"" << id << "\">"
+                    << toUtf8(rackCmd->getRack().toString())
+                    << "</PlayerRack>" << endl;
+            }
+            else if (dynamic_cast<const PlayerPointsCmd*>(cmd))
+            {
+                const PlayerPointsCmd *pointsCmd = static_cast<const 
PlayerPointsCmd*>(cmd);
+                unsigned int id = pointsCmd->getPlayer().getId() + 1;
+                out << indent << "<PlayerPoints playerid=\"" << id << "\">"
+                    << pointsCmd->getPoints() << "</PlayerPoints>" << endl;
+            }
+            else if (dynamic_cast<const PlayerMoveCmd*>(cmd))
+            {
+                const PlayerMoveCmd *moveCmd = static_cast<const 
PlayerMoveCmd*>(cmd);
+                unsigned int id = moveCmd->getPlayer().getId() + 1;
+                out << indent;
+                writeMove(out, moveCmd->getMove(), "PlayerMove", id);
+                out << endl;
+            }
+            else if (dynamic_cast<const GameMoveCmd*>(cmd))
+            {
+                const GameMoveCmd *moveCmd = static_cast<const 
GameMoveCmd*>(cmd);
+                unsigned int id = moveCmd->getPlayerId() + 1;
+                out << indent;
+                writeMove(out, moveCmd->getMove(), "GameMove", id);
+                out << endl;
+            }
+            else if (dynamic_cast<const MarkPlayedCmd*>(cmd))
+            {
+                // Ignore this command, as it is an implementation detail
+            }
+            else
+            {
+                // XXX
+                //throw SaveGameException("Unsupported command: " + 
convertToMb(cmd->toString()));
+            }
+            // TODO
+        }
+        removeIndent(indent);
+        out << indent << "</Turn>" << endl;
+    }
+
+    removeIndent(indent);
+    out << indent << "</History>" << endl;
+    // End of the game history
+    // ------------------------
+
+    out << "</EliotGame>" << endl;
+}
+

Index: game/xml_writer.h
===================================================================
RCS file: game/xml_writer.h
diff -N game/xml_writer.h
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ game/xml_writer.h   29 Nov 2009 16:01:33 -0000      1.1
@@ -0,0 +1,37 @@
+/*****************************************************************************
+ * Copyright (C) 2009 Eliot
+ * Authors: Olivier Teuliere  <address@hidden>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *****************************************************************************/
+
+#ifndef XML_WRITER_H_
+#define XML_WRITER_H_
+
+#include <iosfwd>
+
+class Game;
+
+using std::string;
+
+
+class XmlWriter
+{
+public:
+    static void write(const Game &iGame, const string &iFileName);
+};
+
+#endif
+

Index: test/rosace
===================================================================
RCS file: test/rosace
diff -N test/rosace
--- test/rosace 5 Nov 2006 13:34:27 -0000       1.1
+++ /dev/null   1 Jan 1970 00:00:00 -0000
@@ -1,26 +0,0 @@
-Eliot
-
-   WAEROSC     ROSACE             22  H  8
-   W+TSREIN    WESTERN            54 13  G
-   I+RDTVI?    DIVeRTIR        *  83  8  A
-   ELMOEAH     AH                 30  I  8
-   EELMO+PI    DIPLOMEE        *  89  A  8
-   OHUMJUI     JOUI               37 12  K
-   HMU+EAUA    HUE                34 14  F
-   AAMU+UBS    SAMBA              57 15  H
-   UU+NYTEP    TYPE               61  O 12
-   NUU+S?GE    SaUGRENU        *  82  E  4
-   EBOILLF     BIEF               36  J  7
-   LLO+TETE    TELETYPE           57  O  8
-   LOT+DGOE    GODET              23  D  1
-   LO+KRIIR    LOOK               33  2  C
-   IIRR+ACQ    CINQ               29 10  C
-   AIRR+TVE    VERRAIT         *  88  K  2
-   USAXANZ     SAX                51  B 12
-   ANUZ+MNE    RAMEZ              50  4  K
-   NNU+SALE    LAUZES             45  O  1
-   NN+EAURF    FRENE              38  N  2
-   ANU+NNID    ANDINE             20  3  F
-   NU+OL       GNOU               19  1  D
-
-   total                        1038

Index: test/training_joker2.input
===================================================================
RCS file: test/training_joker2.input
diff -N test/training_joker2.input
--- test/training_joker2.input  24 Jan 2009 17:43:57 -0000      1.3
+++ /dev/null   1 Jan 1970 00:00:00 -0000
@@ -1,14 +0,0 @@
-c rosace
-h p 13
-h r
-a P
-a t
-a l
-a g
-a gd # j1
-h r
-t NUUS?GE
-r
-a r
-q
-q

Index: test/training_joker2.ref
===================================================================
RCS file: test/training_joker2.ref
diff -N test/training_joker2.ref
--- test/training_joker2.ref    23 Jun 2009 21:36:33 -0000      1.9
+++ /dev/null   1 Jan 1970 00:00:00 -0000
@@ -1,92 +0,0 @@
-Using seed: 0
-[?] pour l'aide
-commande> c rosace
-mode entraînement
-[?] pour l'aide
-commande> h p 13
-commande> h r
-commande> a P
-Eliot
-
-   WAEROSC     ROSACE             22  H  8
-   W+TSREIN    WESTERN            54 13  G
-   I+RDTVI?    DIVeRTIR        *  83  8  A
-   ELMOEAH     AH                 30  I  8
-   EELMO+PI    DIPLOMEE        *  89  A  8
-   OHUMJUI     JOUI               37 12  K
-   HMU+EAUA    HUE                34 14  F
-   AAMU+UBS    SAMBA              57 15  H
-   UU+NYTEP    TYPE               61  O 12
-
-   total                         467
-commande> a t
-NUU
-commande> a l
- A B C D E F G H I J K L M N O P Q R S T U V W X Y Z ?
- 5 1 1 2 9 2 2 0 4 0 1 4 1 5 3 0 1 3 3 3 4 1 0 1 0 1 1
-commande> a g
-     1  2  3  4  5  6  7  8  9 10 11 12 13 14 15
- A   -  -  -  -  -  -  -  D  I  P  L  O  M  E  E 
- B   -  -  -  -  -  -  -  I  -  -  -  -  -  -  - 
- C   -  -  -  -  -  -  -  V  -  -  -  -  -  -  - 
- D   -  -  -  -  -  -  -  e  -  -  -  -  -  -  - 
- E   -  -  -  -  -  -  -  R  -  -  -  -  -  -  - 
- F   -  -  -  -  -  -  -  T  -  -  -  -  -  H  - 
- G   -  -  -  -  -  -  -  I  -  -  -  -  W  U  - 
- H   -  -  -  -  -  -  -  R  O  S  A  C  E  E  S 
- I   -  -  -  -  -  -  -  A  H  -  -  -  S  -  A 
- J   -  -  -  -  -  -  -  -  -  -  -  -  T  -  M 
- K   -  -  -  -  -  -  -  -  -  -  -  J  E  -  B 
- L   -  -  -  -  -  -  -  -  -  -  -  O  R  -  A 
- M   -  -  -  -  -  -  -  -  -  -  -  U  N  -  - 
- N   -  -  -  -  -  -  -  -  -  -  -  I  -  -  - 
- O   -  -  -  -  -  -  -  -  -  -  -  T  Y  P  E 
-commande> a gd # j1
- Ar 
[ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][00000000:-1][00000000:-1][00000000:-1][00000000:-1][00000000:-1][00000000:-1][00000000:-1][00000000:-1]
- Br 
[ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][00000000:-1][00005040:
 1][00200200: 3][00200222: 1][002c4108: 1][00200222: 2][01384100: 1][01384100: 
1]
- Cr 
[ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][00000000:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1]
- Dr 
[ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][00000000:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1]
- Er 
[ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][00000000:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][00000008:
 6][ffffffff:-1]
- Fr 
[ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][00000000:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][00000000:16][00000000:-1][ffffffff:-1]
- Gr 
[ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][00000000:-1][00000000:
 5][00608022: 1][005c795e: 1][00008000: 3][00000000:-1][00000000:-1][00000000: 
8]
- Hr 
[ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][00000000:-1][00000000:-1][00000000:-1][00000000:-1][00000000:-1][00000000:-1][00000000:-1][00000000:-1]
- Ir 
[ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][00000000:-1][00000000:-1][00200222:
 1][02284302: 1][00000222: 3][00000000:-1][040c0020: 6][00000000:-1]
- Jr 
[ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][00080200:12][00002020:
 
5][ffffffff:-1][ffffffff:-1][00000000:12][00000000:-1][ffffffff:-1][00000000:-1]
- Kr 
[ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][00000000:-1][00000000:-1][ffffffff:-1][00000000:-1]
- Lr 
[ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][00000000:-1][00000000:-1][ffffffff:-1][00000000:-1]
- Mr 
[ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][00000000:-1][00000000:-1][ffffffff:-1][00080000:
 8]
- Nr 
[ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][00000000:-1][00000000:26][00000000:
 3][005c751c: 1]
- Or 
[ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][00000000:-1][00000000:-1][00000000:-1][00000000:-1]
- -
- Ac 
[ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][00000000:12][00000000:-1][00000000:-1][00000000:-1][00000000:-1][00000000:-1][00000000:-1][00000000:-1][00000000:-1]
- Bc 
[ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][010d714e:
 1][00000000:-1][00005040: 
1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1]
- Cc 
[ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][00000000:
 4][00000000:-1][00280022: 
4][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1]
- Dc 
[ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][005c751c:
 0][00000000:-1][01384100: 
0][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1]
- Ec 
[ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][00008000:
 1][00000000:-1][00200222: 
1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1]
- Fc 
[ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][00200020:
 1][00000000:-1][00200022: 1][ffffffff:-1][ffffffff:-1][ffffffff:-1][00008022: 
4][00000000:-1][00008222: 4]
- Gc 
[ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][010d714e:
 1][00000000:-1][00005040: 
1][ffffffff:-1][ffffffff:-1][00000000:11][00000000:-1][00000000:-1][00080000:11]
- Hc 
[ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][00000000:10][00000000:-1][00000000:-1][00000000:-1][00000000:-1][00000000:-1][00000000:-1][00000000:-1][00000000:-1]
- Ic 
[ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][00000004:
 5][00000000:-1][00000000:-1][00000000: 5][ffffffff:-1][00608022: 
1][00000000:-1][00210800: 2][00000000:-1]
- Jc 
[ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][00200020:
 1][00000000:-1][00008000: 3][00000000:-1]
- Kc 
[ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][00000000:
 9][00000000:-1][00000000:-1][00000000:12][00000000:-1]
- Lc 
[ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][00002048:
 2][00000000:-1][00000000:-1][00004000: 3][00000000:-1]
- Mc 
[ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][00000144:
 2][00000000:-1][00000000:-1][00080220: 2][ffffffff:-1]
- Nc 
[ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][010d714e:
 1][00000000:-1][00005040: 1][ffffffff:-1][ffffffff:-1]
- Oc 
[ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][ffffffff:-1][00000000:15][00000000:-1][00000000:-1][00000000:-1][00000000:-1]
-commande> h r
-commande> t NUUS?GE
-commande> r
-commande> a r
-  1: SaUGRENU        *  82 E4
-  2: eNjUGUES        *  66 D8
-  3: GUEUSANt        *  66 11C
-  4: NUaGEUSe        *  66 D1
-  5: ENjUGUeS        *  64 D2
-  6: GUEUSeNt        *  64 D3
-  7: GUeUSENt        *  64 D6
-  8: NUaGeUSE        *  64 D4
-  9: GUeUSENT        *  62 F1
- 10: GUEUSaNT        *  60 F1
-commande> q
-fin du mode entraînement
-commande> q




reply via email to

[Prev in Thread] Current Thread [Next in Thread]