Version 0.2.2 (07/09/2009):
    - Use the XDG Base Directory Specification for configuration and
      data file locations
    - Configuration strings can have whitespace if they're wrapped in quotes
    - Parallel perft works reliably on all platforms
    - Send "done=1" as the last feature string, as required by the Xboard
      protocol specification
    - Support the "egtpath" command for setting the path to Scorpio bitbases
    - Support the "memory" command for setting the hash size. The bitbases'
      memory usage can't be controlled accurately enough, which is why "memory"
      only affects the hash table.
    - Better error checking for invalid Xboard commands
    - Minor bugfixes

Version 0.2.0 (02/05/2008):
    - Pawn hash table
    - Support for Scorpio's endgame bitbases
    - Slightly improved time allocation
    - Improved search
    - Minor bugfixes
    - Minor code cleanup

Version 0.1.1 (10/21/2007):
    - Improved search
    - Replaced command line arguments with a config file
    - The source now compiles with the MSVC++ compiler
    - Cleaned up some of the code
    - Complete rewrite of king-attack evaluation
    - Minor bugfixes
    - Quiescense nodes are also counted in print_pv()


Completed tasks:
   
    - Passed pawn pushes mustn't be reduced
    - Don't update history tables (not even on fail low) with captures
    - Implement recapture extensions
    - Ditch longjmp() for stopping the search
    - search_book() shouldn't open and close the book file. Instead it
      should have a FILE pointer and the position count passed to it.
    - Drop null move if all the officers have fallen
    - Don't use a custom struct to read/write book positions
    - Add king square to Board structure
    - Encode enpassant square in Move
    - Write an undo_move() function
    - Use SEE for move ordering
    - No null move pruning at PV nodes or when beta is a mate score
    - Replace all occurences of strtok() with strtok_r()
    - Create another version of gen_moves() with <pc> and <to> arguments
      so that we can read a SAN string and create only the moves that we need.
    - Replace age_hash() with a more robust solution. Even with a 35MB hash
      table it takes 5% of the CPU cycles.
    - Improvements to fen_to_board():
      - Does not crash on invalid input
      - Recognizes invalid FEN strings fairly accurately
    - Use a square table for passed pawns instead of a rank table
    - Replace rotated bitboards with antirotated magic bitboards
    - Don't accept repetitions from the opening book
    - Add the ability to convert a board position to FEN
    - When reading PGN files, store book positions in an AVL tree before
      writing to book.
    - Make sure illegal castling is detected correctly
    - Make sure mate scores are accurate
    - Generate only legal moves. This will solve a lot of problems and won't
      hopefully slow the program down too much.
    - Add passed pawn moves to quiescence search
    - Add <U64 check_mask> and <bool double_check> to Board struct.
      The values are updated in make_move().
    - Smooth transition from middlegame to endgame evaluation.
    - Implement futility pruning:
      http://members.home.nl/matador/chess840.htm#FUTILITY
    - Store all necessary information in hash keys, including castling and
      en-passant data.
    - Implement a help command which displays all the available commands
    - Change opening book data structure to:
      - U64 key
      - U16 games
      - U16 wins
    - No promotion argument in get_move(...). The promotion should be included
      in the <U32 move> argument.
    - Use the same hash keys in the Linux and Windows version to make sure that
      the same opening book can be used.
    - pcsq should be defined as pcsq[color][pc][sq], not pcsq[pc][color][sq]
    - Use a function called progressbar() to display the progress while
      running benchmark or reading PGN files.
    - Use the bool type in <stdbool.h> instead of a typedef
    - Moves should be of type U32, not int
    - Eval should never favor a player who has insufficient mating material.
    - Add 50 move rule
    - Get totally rid of path dependent castling evaluation and replace it with
      a better king safety eval.
    - Implement quiescence search
    - Make sure that the "U64 target" argument is taken into consideration
      in each of the gen_x_moves() (i.e. pawn moves) functions.
    - Implement book learning
    - Encode check (one bit) in <U32 move>
    - Order moves with high scores first and not the other way around
    - Replace the global <nnodes> mess with a cleaner solution so that <nnodes>
      won't have to be manually cleared all the time.
    - Penalize backward pawns in eval()
    - Do Internal Iterative Deepening in PV nodes with no hash hit
    - In main(), group the variables of a game in one struct (Chess)
    - Tactical moves shouldn't get a score from the history table
    - Drop null move in extended positions
    - Accept Xboard commands even in the PROTO_NONE mode
    - Sloppy shouldn't go crazy in analyze mode when it reaches the maximum
      search depth (eg. after finding a forced mate).
    - Calculate branching factor somewhat correctly
    - Try checks after captures on the first ply of QS
    - input_available() should call a get_cmd_type() function which
      has the following return values:
        CMDT_EXEC_AND_CONTINUE
        CMDT_FINISH
        CMDT_CANCEL
        CMDT_CONTINUE
    - Separate Xboard commands from Sloppy's own commands.
    - Use the types in <inttypes.h> (C99) for fixed-size integers.
    - The age of a hashnode should be replaced with a birthdate (i.e. move #2).
      The birthdate is the number of moves played in the game, not the move
      number of the move in the search tree.
    - Replace file_mask[square] etc. with file_mask[file] to save memory. It
      won't really be slower because we get the file with just "sq & 7".
    - Use an endianess-independent opening book format. The book is now
      always in little-endian format.
    - Board.nmove should be the number of moves made, and also an index
      for the last move.
    - Replace strcpy() and strncpy() with the safer strlcpy()
    - Replace strcat() and strncat() with the safer strlcat()
    - Improvements to book management:
      - Add a command line parameter to use or not use the book.
      - Add a command line parameter to load or not load it in RAM.
      - Add a command line parameter to enable or disable learning.
      - If not using the "book in memory" mode, disable learning.
    - Rename pop_count() to popcount() so that "pop" wouldn't be confused with
      popping a stack.
    - Rename first_one() to lsb()
    - Add a pop_lsb() function for getting the lsb AND clearing that bit.
      It will make code shorter, not faster.
    - Commands like "hint" and "bk" should use the CMDT_EXEC_AND_CONTINUE mode.
      To do that we need separate boards for the game and the search.
    - Analyze mode should have its own get_input_type() function so that
      normal xboard commands wouldn't get accepted.
    - Switch from mixed case to lower case
    - Quiescence search should have its own simple score_moves() function
    - Make san_to_move() more flexible but still intolerant of illegal moves
    - Get rid of "ULL" in long long literals, we'll have to use C99 anyway
    - Use some getopt() clone + a switch statement to parse input.
      The Xboard and UCI protocols could actually have their own modules.
    - Get rid of verified null move pruning. Just use NULL_R=3.
    - Cancelling the search while running a benchmark or test should also
      cancel the whole benchmark/test.
    - Merge print_debug_info() and print_search_info()
    - Get rid of circular includes when possible. Can't be done for headers
      like chess.h or util.h.
    - Chess.cmd[] and Chess.ncmd should be global variables in util.c.
      The "quit" command must work in the middle of running a testsuite.
    - These things need a better name:
      - int cancel (in struct _SearchData) - DONE (now "CmdType")
      - GameData (struct) and game_data (the variables) - DONE (now "PosInfo")
      - PreMoves (struct) - DONE (now "MoveMasks")
      - pc_type[64] (in struct _Board) - DONE (now "mailbox")
    - Compile with the pedantic flag
    - Fix CastleMask (in util.h). Only half of its contents are masks.
    - Use a sign (int) variable instead of SELF(color)
    - Cleanup or rename some of the ridiculous stuff in sloppy.h
    - Combine define.h, chess.h and chess.c into sloppy.h and sloppy.c, OR
      rename define.h to sloppy.h
    - Use PeekNamedPipe() (in winbase.h) or GetNumberOfConsoleInputEvents()
      (in wincon.h) to poll stdin in Windows.
    - Totally get rid of global.c
    - Implement version 2 of the Xboard protocol, and don't use any
      protover 1 commands (like "white" and "black")
    - Make sure that hash keys in the pv line aren't easily overwritten
    - Rename CAPTURE() to GET_CAPT(), SQ_FROM() to GET_FROM(), etc.
    - Cleanup eval.c and search.c
    - Rewrite the position parser in test_pos()
    - Do something to push_history() and push_killers(). Pushing them takes
      take and doesn't guarantee that the tables are in sync with the game.
    - print_moves() shouldn't be a debug mode function/command
    - The config file is enough for setting options. Get rid of cmdline args.
    - Don't use _WIN32 to mean WINDOWS
    - Test input_available() in Windows pipe mode
    - Fix MSVC++ threading issues in perft
    - Get rid of struct _Masks (in movegen.c)
    - Count also QS nodes in print_pv()
    - Don't overwrite the book file if the book wasn't modified
    - Don't reduce killer moves
    - Add a "logfile on/off" setting
    - Change NO_MOVE to NULLMOVE
    - Always deallocate the book when exiting
    - Add a pawn structure hash table
    - Add support for Scorpio's endgame bitbases

