3 - Implement the complete Winboard/Xboard protocol:
4 http://www.tim-mann.org/xboard/engine-intf.html
5 - Better evaluation function:
6 - more mobility evaluation
7 - Detect draws by material and likely draws by material (i.e. KR vs. KR).
8 This detection should happen in search() if possible.
9 - Full support for the PGN standard, including FEN strings
14 - Try returning alpha or beta even with mate scores
15 - Use a bitfield for move instead of an integer
16 - Use the BigTwo1 replacement scheme in hash table:
17 http://www.xs4all.nl/~breukerd/thesis/summary.html
18 - In critical parts use <unsigned> instead of <int> if possible
19 - Scale the 7th rank eval bonus with the opponent's pawn material (the more
20 pawns it has the bigger the bonus)
21 - make_move() should return a boolean value <is_check>.
22 - Add a command stack to struct Chess so that all the waiting non-urgent
23 commands can be executed when we're done searching.
24 UPDATE: turned out that no input ever needs to wait.
25 - Evaluation masks (passed pawns etc.) should be grouped in a struct
26 - Include ECO code and round number in the PGN log
27 - Use the "struct" keyword instead of the typedef name when declaring
28 variables in header files (eg. AvlNode *book in Chess).
29 - Use a lot more enums like Color, Square, Piece, etc. On the other hand,
30 enums aren't enforced so let's drop this plan.
31 - Add a global <notation> setting. It should accept values:
32 - NTN_SAN - use SAN notation for moves everywhere
33 - NTN_COORD - use coordinate notation everywhere
34 - NTN_MIX - use a mix of SAN and COORD, ie. Sloppy's current defaults
35 - Don't read the game log when writing to game.pgn. Instead backtrack to the
36 beginning and play the moves again.
37 - Add (static) function prototypes at the beginning of each source file.
38 - Don't try a null move if the side to move doesn't have any sliders.
39 UPDATE: this took away a lot of strength, can't use it.
40 - In Linux/Unix the default data folder is ~/.sloppy/ and in Windows it's
41 the same folder where the executable is. User should also be able to
42 choose the folder by running sloppy with -f <path> parameter.
43 - Always completing the search iteration after the first root move takes
44 about 5 - 8 % of the total search time, which is 5.3 - 8.7 % of the
45 allocated time. So cut about 7 % out of the allocated time.
46 - Use Verified Null-Move Pruning
47 - Extend 3 plies when the search transitions into a pawn endgame
48 - Generate (QUEEN) promotions in gen_qs_moves()
49 - Try storing 2 best moves in transposition table
50 - Order losing captures last
51 - Store 2 positions in each hash entry: always replace and depth preferred
52 - Try late move reductions in pv nodes
57 - gen_pc_moves() should be able to work with a const board pointer
58 - Don't search the book if we're past X plies
59 - Don't respond to ping while searching, unless in analyze/pondering mode
60 - Support "avoid move" test positions
61 - Implement pondering mode
62 - If there's only one book move available and it has a score of 0, try to
63 avoid choosing that move in search.
64 - Use some more advanced source control system
65 - Try the hash move boldly without any validation (move generation).
66 - King safety extensions: extend all moves that significantly increase
67 pressure against the enemy king.
68 - Write a is_stalemate() function that can be called in sq_search() when
69 gen_qs_moves() creates 0 moves.
70 - Dismiss moves with a bad SEE value already in gen_qs_moves()
71 - Carefully test all the commands in input.c and xboard.c
72 - En passant captures should be handled in a cleaner way in move generation.
73 The use of ep_sq should be consistent. In <Board> it's the <to> square,
74 and in <Move> it's the square of the enemy pawn.
75 - Optimize or get rid of get_threat_mask(), at least for generating legal
77 - Search all captures in QS (ignore SEE) if a double check or
78 discovered check is possible.
79 - Add support for the UCI protocol
80 - Special evals for endgames like KBNK
81 - Detect blockades in eval
82 - Get pointer arguments as constants if they're for reading only
83 - In make_move(): if the move captures a rook, make sure the opponent
84 loses castling rights in that corner. It's very unlikely that the other
85 rook would later move there without the king moving first, but
87 - Get rid of EPD test support. There are better ways to run the test suites
88 than having the engine support them.
89 - Order the root moves more carefully, perhaps based on the node counts of
91 - Write more sophisticated wrappers for the platform-dependent dynamic