FIXME++
[omaha.git] / README
blob2d44a1b2267600fc559d6b454916308704cd3b56
1 Omaha board game GUI
2 ====================
4 Omaha is a (wannabe) GUI to play arbitrary board games, aiming to be
5 completely extensible by plugins.
7 Primary purpose is trying ideas about a tagua/kaya-like GUI suitable
8 for inclusion on OpenMoko devices (that meant, no ruby and not forcing
9 the use of kde), so that I can get a suitable goban to help in
10 studying games while in the train. And since Qt is not included by
11 default in om2009 or shr, not forcing qt either - so for now it is
12 using gtk, although it should be easy to add support for other GUI.
14 Secondary purpose is to experiment with various programing techniques
15 in python, like the component-oriented approach (others to come, like
16 design-by-contract).
18 Homepage: https://alioth.debian.org/projects/omaha/
20 Copyright and license
21 =====================
23 Omaha is Copyright (c) 2009-2015 by Yann Dirson <ydirson@free.fr>.
25     This program and its libraries are free software; you can
26     redistribute them and/or modify it under the terms of the GNU
27     Lesser General Public License as published by the Free Software
28     Foundation; either version 2.1 of the License.
30     This program and these libraries are distributed in the hope that
31     it will be useful, but WITHOUT ANY WARRANTY; without even the
32     implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
33     PURPOSE.  See the GNU Lesser General Public License for more
34     details.
36     You should have received a copy of the GNU Lesser General Public
37     License along with this library; if not, write to the Free
38     Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
39     02110-1301 USA
41 plugins/Games/Chess.png:
42     32x32/apps/tagua.png from oxygen-icon-theme, LGPL v3
43 plugins/Games/Chess5x5.png:
44     22x22/apps/tagua.png from oxygen-icon-theme, LGPL v3
45 plugins/Renderers/Pieces/FantasyChess:
46     tagua FantasySVG theme from Maurizio Monge, GPL v2
47 plugins/Renderers/Pieces/SVGShogi/tile.svg:
48     lib/plugins/shogi/pics/tile.svg from kaya, GPL v2
51 Dependencies
52 ============
54 To use omaha, currently you will need at least:
56 - python 2.7, or 2.6 with argparse module (not python3 yet)
57 - distutils-extra (tested with v2.38)
58 - pyxdg (tested with v0.19)
59    v0.15 (Debian lenny) seems to work once the DesktopEntry.__cmp__ method
60    has been deleted from xdg/DesktopEntry.py (causes infinite recursion).
61 - flufl.enum (tested with v3.3.2 and v4.0.1)
62 - pygtk (tested with v2.14.1, but 2.4 may be sufficient)
63 - pygobject (tested with v2.20.0)
64 - pycairo (tested with v1.8.6)
65 - gnome-icon-theme (tested with v3.12.0) [Note for Ubuntu: this requires the
66   gnome-icon-theme-full package)
68 For SVG rendering with gtk:
69 - python-rsvg (from gnome-python-desktop, tested with v2.26.0)
71 For Shogi tiles traditional rendering:
72 - a font with the suitable Kanji characters (eg. "WenQuanYi Zen Hei")
74 To read PGN files:
75 - pyparsing (tested with v2.0.1)
77 To play against the computer:
78 - gnuchess, fairy-max or another xboard-compliant Chess engine
79 - gnushogi
80 - gnugo or another GTP2-compliant Go engine
81 - hachu
83 For the experimental Qt4 support:
84 - pyqt4 (tested with v4.9.1)
86 To run the unit tests:
87 - nose (tested with v1.1.2)
89 To run the automated UI tests:
90 - dogtail (tested with v0.8.1)
91 - at-spi2-core 2.6.3 or 2.7.3 or better (tested with 2.7.91.  2.5.3 in
92   Debian wheezy is known NOT to work)
94 Tested static analysis using pylint 1.3.1 (1.4.0 has a known bug
95 preventing full testing).  Before 1.2.1 commandline flags are required
96 to make use of the Overlord.pylintx plugin.
99 Implementation status of available games
100 ========================================
102 Here is a (possibly incomplete) status for each game known to Omaha,
103 including a list of things each game lacks to be touted as "properly
104 supported".  Are considered "blockers" the problems which prevent some
105 legal moves to be made - when no blocker remains, some "missing
106 checks" may remain, when some illegal moves are accepted by the Omaha
107 implementation.
109 Checkers
110 --------
112 Blockers:
113 - a king capturing should be allowed to land on any free tile
114 Missing checks:
115 - forced captures (let alone "force longest capture")
116 - moves should be auto-finalized when detected as forced
117 - moves could be auto-finalized when detected as valid
118 Visual issues:
119 - feedback for move being composed
120 Game-file formats: none yet
121 AI: none yet
123 Shogi and MiniShogi
124 -------------------
126 Blockers: none known
127 Missing checks:
128 - drop checks
129 - forced promotion
130 - checkmate
131 - no-repeat rule
132 Visual issues:
133 - proper theme
134 Game-file formats: PGN (shogi only for now)
136 - XShogi protocol (gnu(mini)shogi)
137 - XBoard protocol (gnu(mini)shogi 1.5.x, SjaakII)
139 Sho Shogi
140 ---------
142 Blockers: none known
143 Missing checks:
144 - CrownPrince should be a royal piece (not a big problem because we lack
145   "in-check" check, would become a blocker when we implement it)
146 - all other missing checks for Shogi
147 Game-file formats: none yet
149 - XBoard protocol (HaChu, SjaakII)
151 Tori Shogi
152 ----------
154 Blockers: none known
155 Missing checks:
156 - drop checks
157 - forced promotion
158 - checkmate
159 - no-repeat rule
160 Visual issues:
161 - kanji tiles do not distinguish left- from right-quail
162 Game-file formats: none
163 AI: none
165 Chess and Chess5x5
166 ------------------
168 Blockers: none known
169 Missing checks:
170 - checkmate, stalemate
171 - no-repeat rule
172 Visual issues: none
173 Game-file formats: PGN (Chess only, export not conformant with "PGN
174   export", but with "PGN import)
175 AI: XBoard protocol (GNU Chess, Fairy-Max, SjaakII)
180 Blockers:
181 - no territory counting
182 Missing checks:
183 - placed stone is not dead
184 - ko
185 Visual issues:
186 - rendering of captures
187 Game-file formats: SGF
188 AI: GTP2 (gnugo, etc.)
190 GliƄski's hexagonal Chess
191 -------------------------
193 Blockers:
194 - different rule for startup boost
195 - promotion
196 - en-passant
197 Missing checks:
198 - checkmate, stalemate
199 - no-repeat rule
200 Visual issues: none known
201 Game-file formats: none yet
202 AI: none yet
205 Running tests
206 =============
208 Unit tests
209 ----------
211 Run "nosetests" from the shell to run all tests expected to pass.
212 Run "nosetests -a known" to also run tests known to fail.
214 UI tests
215 --------
217 Make sure AT-SPI is activated on your desktop, by running "gconftool
218 --type bool --set /desktop/gnome/interface/accessibility"
220 First, run omaha, ensuring you have a single omaha instance running.
221 Make sure it uses the C locale, and make sure Gtk2 apps are starting
222 with accessibility support:
224  LC_ALL=C LANGUAGE= GTK_MODULES=gail:atk-bridge ./scripts/omaha
226 Do not open any window besides the launcher; then run:
228  ./scripts/uitest.py
231 Rough architectural overview
232 ============================
234 Note that this description is still partial, and the architecture
235 itself is still a moving target.  Use "git blame" on this section to
236 identify the version of the code that it is supposed to describe.
238 All our classes are under the Omaha namespace, which we will omit in
239 this doc for the sake of readability.  Hence when we refer to
240 Core.Game, we really mean Omaha.Core.Game, and so on.
242 Game stuff
243 ----------
245 The central class is the Core.Game class, tying together all other
246 parts.  Each type of game playable with Omaha (chess, checkers, etc)
247 is described by a subclass of Core.Game (eg. Games.Chess),
248 encapsulating all the knowledge of this particular game's mechanism.
249 To help sharing behaviour common to several games, several (abstract)
250 Game classes are provided (eg. Games.abstract.GenericChesslikeMoves,
251 Games.abstract.SingleBoardGame, Games.abstract.RectBoardGame), which
252 other Core.Game subclasses can reuse by (possibly multiple)
253 inheritance.
255 The games supported in Omaha make use of players (instances of
256 Core.Player created by the Game instance), game-specific pieces
257 (instances of a subclass of Core.Piece, available as class member "Piece"
258 inside the Core.Game subclass) and what we call "piece holders" for
259 lack of a better name (subclasses of Core.PieceHolder).  The latter includes
260 boards, bags, and other pools, in which pieces may be stored
261 (eg. Holders.RectBoard.RectBoard and Holders.Pool.PiecePool).
263 A game is a succession of moves (instances of a subclass of
264 Core.Move), done by each player on its turn.  All current Move
265 subclasses deal with moving pieces.  To allow dealing with the largest
266 set of games and to allow other plugins to be tied as little as
267 possible to specific games, the Omaha core provides very fine-grained
268 Move subclasses, such as moves where a piece is simply moved from one
269 location to another (Core.SimpleDisplaceMove), moves where pieces have
270 to go through other locations before reaching their target
271 (Core.WaypointDisplaceMove), moves where new pieces are just put on
272 the board (Core.PutOnlyMove) - and all those classes share behaviour
273 through more abstract classes.
275 Moves, like pieces, are game-specific, available as an attribute of
276 the Game subclass.  They are initiated by a Core.PlayerDriver instance
277 (eg. PlayerDrivers.MouseSingleClick for controlling a player through a
278 GUI, or Player.GnuShogi for controlling using an external gnushogi
279 program).
281 Plugability
282 -----------
284 Lots of things in Omaha can be added as plug-in without changing the
285 code.  At this time this include subclasses of the following Core classes:
286  * Game
287  * PlayerDriver
288  * GameRenderer, HolderRenderer, PieceRenderer
290 Plugins can also define new types of plugins for their own use.
291 Eg. those that are subclasses of Renderers.Pieces.abstract.StackedVector
292 are skinable through the use of "PieceSkin" plugins.
294 A plugin is declared to Omaha using a Desktop Entry (.desktop) file as
295 defined by FreeDesktop.org.  For this we define our own set of
296 DesktopEntry types (eg. X-Omaha-Game, X-Omaha-GameRenderer,
297 X-Omaha-HolderRenderer), as well as a number of custom fields for our
298 purpose.
300 Plugin declaration files are looked for in
301 /usr/share/games/omaha/plugins/ (which is structured by plugin type
302 for convenience, although the location within that tree is ignored).
303 For developing, and for people wanting to run from the source tree, a
304 "plugins" directory in the current working directory is used instead
305 if it is found.
307 The following standard fields are used:
309  Name, Name[xx]      : name displayed to the user
310  Type                : type of plugin (X-Omaha-*)
311  TryExec             : (optional) only enables the plugin if this program is found
312  Icon                : (optional) may be displayed by the UI
313  Comment, Comment[xx]: (optional) may be displayed by the UI
315 The following fields are defined for all Omaha plugins, unless
316 otherwise stated:
318  X-Omaha-ID          : identifier for the plugin, should be unique
320  X-Omaha-*-Categories: with which other plugins of given type this plugin is
321                        compatible, see description of specific plugin types
322                        for details.
324 Most plugins are implemented by a python class.  Those also provide:
326  X-Omaha-Package     : python package holding the plugin implementation
327  X-Omaha-Class       : name of the class inside the package specified by
328                        X-Omaha-Package
330 Other specific fields are available for specific plugin types.
331 FIXME: to be written
333 Parameters
334 ----------
336 Most plugins and instances of other Omaha classes can take parameters.
337 Classes whose instances may take parameters are subclasses of
338 Core.Parametrizable.  Values for those parameters can usually be
339 changed via the "preferences dialog".
341 Basically, the set of parameters taken by a Core.Parametrizable
342 instance are retrieved by the parameters_decl() class method (which
343 returns a dict of Overlord.ParamDecl keyed by string parameter
344 identifiers or "paramid"), and a specific set of parameters is applied
345 to an instance through the set_params() method.
347 The parameters_decl() method only has to add new parameters to the one
348 specified by parent classes.  Symetrically, the set_params() method
349 passes to the parent classes' set_params() only the parameters that it
350 did not use itself.
352 But indeed things are slightly complicated by the fact that some
353 parameters depend on others - eg. the "PieceRenderer" parameter in a
354 GameRenderer subclass is not the same for Chess and Go: they do not
355 allow to choose from the same set of choices, and must be stored
356 separately in the preferences.  So a given parameter
357 (Overlord.Param) is tied not only to its parameter declaration, but
358 also to a set of so-called "meta-parameters" ("metaparams" for short),
359 and set_params() expects as argument a dict of Param instances keyed
360 by a (metaparams, paramid) tuple.
362 The set of metaparams meaningful to a given Parametrizable is
363 available through the metaparams_set property.  It is a set object,
364 whose elements are frozendict objects (dict-like objects suitable for
365 inclusion in a set).  A commonly-used metaparam is the "gameclass"
366 one, whose value in the frozendict is as expected the class of the
367 game being played.
369 The parameters_decl() method takes a metaparams argument and only
370 returns the ParamDecl's which require compatible metaparams.  For this
371 reason, simple parameters which do not need any metaparams are tied to
372 an empty metaparams frozendict.
374 The Preferences system is naturally built on the Parametrizable stuff.
375 Omaha has a single Preferences repository (today only kept in memory,
376 but which is intended to be saved on disk for persistence once we are
377 sure it is adequate), which stores those parameters and the metaparams
378 they are related to, from one game to another.
380 UI stuff
381 --------
383 The Omaha UI is centered around Core.UI.App: a Core.Launcher App
384 allows to launch Core.GameApp subclasses.  Both Core.Launcher and
385 Core.GameApp are subclasses of Core.UI.App, which ties then to a
386 Core.UI.Toolkit implementation.
388 A GameApp creates a Game object, a GameRenderer object that usually
389 takes care of on-screen drawing, and PlayerDriver objects which send
390 their moves to the Game object.
392 A Game object usually has at least one Holder object - a board, and
393 board types may be shared by many games, the rendering of which is
394 usually delegated by a HolderRenderer, allowing to share board
395 rendering code among games.  This is handled by the
396 Core.HolderDelegatingGameRenderer class, from which are derived all
397 currently included game renderers.
399 Similarly, the Core.PieceDelegatingGameRenderer class allows to remove
400 that other game-specific aspect from GameRenderer, making it possible
401 to write really generic renderers suitable for many games
402 (eg. Renderers.FullscreenPieceDelegating).
404 On the graphical side, the idea is that renderers can be of several
405 types: plain and simple first for early implementation testing,
406 skinable 2D renderers (eg. reusing themes from tagua/kaya and other
407 GUIs out there), skinable 3D renderers, and whatever renderers one
408 would want to plug in.
410 Source organization
411 -------------------
416 HOWTO add a new UI Toolkit to Omaha
417 ===================================
419 - for convenience, let's say you want to add support for a toolkit
420   named Foo
422 - put a minimal launcher stub in place, which in turn requires a stub
423   Toolkit implementation, so that "./scripts/omaha --toolkit=Foo" is
424   minimally happy
426 - get an eventloop started, and a minimal window displayed
428 - add presentation of the available games, a "play" action, and a stub
429   "play game" app
431 Most games have parameters, so the natural next step is to implement
432 toolkit widgets:
434 - the most common widgets used for game params is the IntWidget, but
435   you will need to implement the Toolkit's open_params_dialog() and
436   create_param_widget() methods to make them useful.
438 - the ChoiceWidget is used a lot too, and its basic functionnality of
439   displaying choices and yielding corresponding value is quite easily
440   implemented.  More complex behaviours (disabled choices and
441   sub-parameters) can be left for later.
443 Now that we can start any game and switch settings at will, we can
444 go on to the canvas manipulation:
446 - let FooPlay._create_gui() instanciate a canvas, and teach
447   Toolkit.Foo to find colors
449 - catch mouse events in the canvas.
451   Event handlers are registered on mouse events (press, release,
452   move), are called in turn in undefined order, and must return a true
453   value when they have handled the event, to avoid propagating it to
454   remaining handlers.
456 - let the canvas refresh handler call the renderer
458   ... and deal with the parts the actual redraw relies on.  After
459   fill_rectangle, draw_rectangle, draw_line, draw_ and fill_circle
460   already allow to render some games.
462   AsciiShogi renderer will help test implementations of draw_polygon
463   and draw_centered_text.  Since we did not implement renderer
464   switching yet, a local change to plugins/Games/Shogi.desktop will
465   help.
467 - add SVG rendering: the default Chess renderer uses a StackedVector
468   piece renderer, which renders SVG to a bitmap; we thus need to
469   provide a BitmapImage on which we can draw, and a VectorImage
470   implementation with a render_to_bitmap() implementation.  A
471   Foo.draw_image() implementation is required to finish the work.
473 Other stuff to gradually implement:
475  - icon support in launcher
476  - disabled choices and sub-parameters in ChoiceWidget
478 - etc.; old guideslines read:
479   - implement the required Omaha.GUI methods (UI itself, event-loop, and
480     canvas drawing).
481   - gradually add support for other features:
482     - player driver setup
485 HOWTO add a new game to Omaha
486 =============================
491 Short term TODO list
492 ====================
494 Bugs to report
495 --------------
497 - distutils-extra:
498   - does not include MANIFEST.in
499   - "unrecognized files" warning has:
500     - false positives (files from MANIFEST.in, package_data)
501     - false negatives (.coveragerc, .version, COPYING)
502 - distutils 2.7:
503   - does not allow to use dotted notation in package_data
504     (must use non-intuitive "/" instead)
505 - gnuchess issues "resign" after moving
507 Known bugs
508 ----------
510 - setting up MultiplexerPlayerDriver gives "No sane default" warnings
511 - XBoard/CECP return error messages on unsupported commands, we should
512   find a way to use them, eg. to stop an "edit" before we send edit
513   instructions
514 - all royal pieces are reported as "king" when .checking_piece()
515   returns non-None
516 - player controls like "resign" should only be active when there is a
517   human player (currently we can make an AI resign)
519 - Linking class to desc through 'x-plugin-desc' is broken when using
520   parameter specialization (several plugin descs for a single class).
521   Causes a Go game launched after a Go19 game to get a window called
522   "Go 19x19", since we use the plugin desc for the name; causes
523   param-dialog defaults to be wrong because one class can only point to
524   a single plugin; etc.
525    => must instantiate a plugin subclass on parameter specialization
526 - A player driver by GNU Chess gets a default of Fairy Max in the "player
527   control" dialog (same problem ?)
528 - default playerdriver leaks from chess to chess5x5 if the former is
529   added a X-Omaha-DefaultPlayerDriver and is used first (same problem ?)
530 - depends_on handling is broken when one param depends on several others,
531   but luckily we do not need that yet (see pylint's cell-var-from-loop
532   warning)
534 - Go: PASS moves in go trigger PutMove assert_locations to complain about
535   self.__target
536 - Chess: castling moves are not forbidden when the king lands in check
537 - HorizontalHexDots does not implement point_to_location
538 - SquareDots does not catch IndexError when the cursor is on non-existent
539   tiles
540 - prefs window is not closed when game window is
541 - Generic PlayerDrivers (XBoard, etc) support a fixed set of variants,
542   plugin should reflect that
543 - castling not refused if it puts the king in check
545 - playerdriver params change of current field not validated on "OK" ?
546 - stray engines must be terminated
547 - overwriting file while saving requires confirmation
548 - PieceNotation should refer to a PieceSet, not to a Game
549 - an engine declaring the game is a draw without the other noticing
550   blocks the game
551   - AI/AI game gets stuck, UI should show a cue (eg. gnushogi vs. itself
552     at low depth)
553   - AI/human game : human should be presented proposed outcome
554 - engine init through game position should pass more game state
555   (cf. setboard for xboard; ko status for go)
556 - stream-callback mechanism is deeply flawed:
557   - cannot attach a handler to more than 1 stream
558   - support for error conditions should be improved (cannot distinguish
559     between error conditions, Gtk behaviour is strange)
560 - playerdrivers do not handle broken pipe on write
561 - Checkers with odd boardsize puts pieces on white squares instead of
562   black ones
563 - Games.FreePlay has been broken since 5e66377cb (removal of
564   Game.holder_classes had been necessary to fit this class into the
565   existing framework).  OTOH, 74cdead67 and 0d9144a7e were made possible
566   precisely by reintroducing them.  Sigh.
568 - closing the Gtk Launcher window quits without killing any running AI
569 - AI plugins not robust to missing program
570 - game setup should include initial playerdrivers choice (esp. because
571   of handicap settings)
572 - assertion when looking at captured stones when feeding position to
573   gtp engine
575 - the game window should have a minimum size
576 - using fullscreenpiecedelegating for go, or
577   using fullscreenpoolpiecedelecating with chess etc causes
578   exception
579 - holder renderer when openning prefs dialog is set to default, not
580   current
581 - fullscreenpoolpiecedelegating does not display shogi pieces in
582   correct orientation
583 - race condition at PlayerDriver init eg. causes problem when 2 gnushogi
584   at low depth battle each other (not anymore?)
585 - events triggering PlayerDriver moves should be flushed when meaningful,
586   to avoid them to be taken into account on next turns ?
587 - Should display warning for 2 plugins with same name.
588 - UI.PluginChoiceWidget() does not include Holder key in context
590 - uitest assumes that "Location:" field is always available, which is
591   apparently not true by default
593 Milestone 0.1 (first public announcement)
594 -------------
596 * Short-term goals (including a number of things otherwise listed
597   below)
599 - Go needs piece-stacking pool renderer
600 - Piece-stacking pool renderer requires Highlighter refactoring
601 - Highlighters (things done in t/highlight) requires a way to specify
602   default colors for hl roles, or at least a persistent prefs system
603 - specifying default colors for hl roles is really close to a
604   persistent prefs system
605 - persistent prefs system requires bare param values in preferences
606 - bare param values in preferences requires bare param values everywhere
607   in set_params
608 - bare param values in set_params was done by leveraging @parameter, and
609   the latter has to be generalized for HolderRenderer-*.  Possibly use
610   a special form of parameter, where the value is a dict - need to think
611   about how to deal with the dict's keys.
613 - full use of @parameter (proper override of boardwidth and
614   boardheight) in SquareBoardGame requires pinning a parameter decl in
615   a subclass
616 - pinning (or otherwise refining) a parameter decl in a subclass
617   requires a way to clone a ParamDecl (done)
618 - parameter pinning works only by chance
619   - pinned_value's should be set from X-Omaha-Parameter-* in Overlord.Plugin.Class()...
620   - ...but a Parametrizable does not cache its parameter's decls
621   - special-casing of pinned params should only occur in walk_action, not in
622     walk_params or PluginChoiceWidget or GtkChoiceWidget, but in fact today only
623     PluginChoiceWidget seems to matter
625 - split XBoard in CECP protocol and GnuChess support
628 * finish drawing context implementation
630 - make DrawingContext a standalone class ?
631 - add a GameRenderer.rotation parameter
632   - layout computation
633   - inverse transformation for mouse
634 - per-holder rotation
635   - draw pieces in a per-holder fashion,
636   - draw pieces relative to holder, use drawing context for the board offset
637   - demonstrate with a 3-player game made of 3 2-player games
638 - fix the issue of drawing_context for move highlighting
641 * essential user-visible features:
643 - finer expose events to avoid the need to always redraw everything
644 - Toolkit support for asynchronous notifications
646 - Add more filter types
647   - MoveHighlighters may depend on a Game and a HolderRenderer
649 - go: use GTP2 final_score to get engine's opinion about score
650 - draw letters/numbers on boards in renderers
651 - move (de)serialization for chess/checkers
652 - (gtk) use a double-buffer to get get rid of flickering
653 - undo support for checkers
654 - undo support in engine playerdrivers
655 - distinguish reasons for a draw (Chess: stalemate, repetition...)
656 - a problem in _iconview_hook() and other hooks should abort game
657   launch (currently causes unexpected behaviours in other places)
658 - rework parameter mechanism:
659   - change parameters with variable names to be dicts of parameters instead ?
660   - get rid of ParamDecl subclasses, use real types instead to encapsulate
661     the static constraints, use a Parameter/TypedProperty class instead ?
662     - ability to further restrict type of a parameter in subclasses
663   - use the changed_listeners mechanism to implement depends_on, for
664     dynamic constraints
665   - turn params into ctor args, moving default values there, and allowing
666     default-less params
667 - finalize preferences mechanism:
668   - factorize set_param call for plugin subparams
669   - add "color", and "multichoice-plugin" parameter types
670   - move playerdrivers to UI subparams ?
671   - use "multichoice-plugin" parameter type for playerdriver multiplexer
672   - multilevel prefs (current level = "all instances" (general default);
673     lacks "this instance", "default for game X", others depending
674     on the Parametrizable class)
675   - holder prefs in GameRenderer's are key'd to __name__ and not fullname
676     of game and holder
677   - parameters should be kept in an odict when available
678   - allow setting param values from plugin decl
679 - display message to user when parameters are refused
680 - let integer parameter have standard/preferred values for quick
681   selection (eg. 9/13/19 for go boardsize, 8/10 for checkers)
682 - display game description in launcher, add a "play" button
683 - MouseWaypoint should discard current path if an invalid waypoint is
684   selected (or maybe it is just Checkers not giving correct info ?)
685 - UI "Pause" support (cooperative suspend; get time to change playerdriver, etc)
686 - use icons in gtk toolbar
687 - move quit/save/prefs/players into a "game" menu
688 - either have dialogs disable the game window, or:
689   - optionally auto-pause game on dialog popup
690   - limit prefs/driver dialogs to one instance each
691 - promotion dialogs should not be fully modal, but that seems to
692   require: 1) surgery on PlayerDriver's click handling to get
693   __reset_move called at the correct time, and 2) a way to avoid
694   breaking UserCancel propagation
695 - notify dialogs should not be modal
696 - shogi PSN format
698 - let user react to opponent refusing move:
699   - "Protest" (threatening game stop) / "Ack refusal"
700   - if protest: "Insist and stop game" / "Retract refusal"
702 - make margin a parameter of fullscreen renderer
704 - alert on opponent move (phone buzzer)
705 - hourglass on app launch
706 - make plugins of read/write file formats
708 * code improvements:
710 - find a way to specify a __check_parameters__() method to be called after
711   set_params().  Using an Aspect Programming framework ?
713 - abstract event-loop handling from UI.Toolkit (look at twisted.internet.reactor)
715 - use better enums
717 - switch SimpleDrawnStones from hardcoded games to skinnability
719 - improve structuring for location highlighting
720   - pluginify
721   - allow highlighter parameters (color, etc)
722   - highlight last opponent move
723   - MoveHighlighter and PieceHighlighter classes
724   - WaypointMoveHighlighter classes
725   - SingleBoard mixes hl types in __highlights
726   - allow highlights to be draw above pieces in addition as below them
727     - "modifier" thingies for use a stateful vector canvas ?
728     - different kinds of hl actions ? (sort of layers: board, pre-location,
729       post-location, post-piece...)
730   - include captured pieces in last-move highlight ?  last-captured ?
732 - let new_piece_on_board call player_relative_pos itself
734 - move Move.piece into GenericChesslikeMoves
736 - make move-checking accept pre-composed special moves
737   (in chess: validate or fill source/target as needed)
739 - allow displaying captured pieces (eg. in Chess)
740   - change support no-drop shogi variants to allow this
742 - rework GUI Toolkit API to allow drawing onto image or canvas without
743   duplicating all methods.
744 - setup a unit-test system
746 - factorize all current gamerenderers into a single FullScreenBoard
747   one.
749 - Gtk: canvas mask is in Gtk.Play, while handling is in Toolkit.Gtk
751 Milestone 0.2
752 -------------
754 - code cleanups/refactorings
755   - privatization of all members, with property accessors
756   - audit for missing abstract method declarations
758 - Reduce the number of standalone renderers
759   - need a pool-enabled FullScreen
760   - TextOnSVGShogiRenderer should use FullScreen with pools
761     - requires a more generic FullScreen (not only SinglePieceSetGameRenderer)
763 - find a way to separate Judge/Referee (checks) from Game, while still
764   allowing eg. promotions in Chess/Shogi
766 - more games: crazyhouse, tablut, other hexagonal
767   chess variants, bridg-it (and 3-player hex variation), hex, GIPF
768   - asymetric games with different Move class for each player (eg. entropy)
769   - triangle board, support for Atride (3 players)
770 - history display
772 - add a shogi SVG renderer and skins
773 - multi-kanji character rendering
775 - capabilities for plugins (eg. svg, various UI support for player
776   drivers)
777 - restore PlayerDriver sub-parameters when reopening setup dialog
778 - make PlayerDriver default dependant on movetype and UI, not on game
779 - display PlayerDriver grayed-out when disabled because of TryExec check
780 - introduce Good/Experimental tags
781 - PlayerDrivers should only start to play when the game starts
783 - implement move checking in go
784 - add free-handicap support to go
785 - finish move checking in shogi
786 - finalize support for go (territory counting)
787   - use GTP2 command final_status
789 - integrate special-move code into movetype decl
790 - improve support for enforcing rules
792 - add GUIs for Qt (PyQt/PySide), E17 (elementary)
793 - make Location.board a possibly-computed attribute (eg. for go)
794 - make toolbar part of the game renderer
795 - handle captures as side-effects ?
796 - multiplexer player driver should filter choices
798 - implement a way to avoid AI or dumb PlayerDrivers to be selected by
799   default (would supercede X-Omaha-DefaultPlayerDriver)
801 - change of PlayerDriver (and their settings) should be kept and
802   recorded.  Right now we even have no means of storing the value
803   (data loss bug according to PGN spec)
805 Milestone 0.4 ?
806 -------------
808 - endgame detection
809 - implement move checking by AI
810 - i18n
811 - make AI engines portable
812   - look at wisted.internet.reactor.spawnProcess in twisted for
813     portable async process communication
815 Milestone 0.5 ?
816 -------------
818 - deal with the case of PieceHolder and Location, whose descendants'
819   __init__() have different prototypes, and thus can hardly use super()
820 - replace relevant assertions with some design-by-contract mechanism
821   (not sure how much zope.interface would fit, and python-contract looks
822    old, unmaintained and awkward)
823 - review method scopes
825 - replace relevant assertions with nice user feedback
826 - trap RuntimeError's and get them displayed as well
827 - robustness of plugin selection: open preferences when the selected
828   choice does not load (eg. missing python-rsvg)
829 - use a more generic mechanism than X-Omaha-RendererCompat ?
830 - distinguish LauncherGUI from GameGUI, allowing simultaneous games ?
831 - clock support in game and GUI
832 - arr/spacebar piece selection in HumanPlayer
833 - board rotations
834   - HolderRenderer parameter for orientation (unit vector?)
835   - GameRenderer parameter for general orientation
836     - preset values depending on orientations available in holders
837 - display messages with the suitable orientation for the target player
838 - 3D OpenGL board rendering
839 - support for 3D-board games (3DChess, etc)
841 - avoid destroying/creating new PlayerDriver when a choice did not change
842 - GUI.Gtk does not let the user specify arguments to multiplexed
843   PlayerDriver's:
844  - find a correct way to filter out those with arguments
845  - find a way to allow arguments there
847 - allow disambiguation of short serializations
848 - audit/fix lifecycle of objects (eg. locations)
849 - support for "bag" holders (for eg. entropy, scrabble)
850 - support for "hidden hand" holders (for eg. scrabble, possibly card games)
851 - support for games with mutable boards (isola, zizanie beach)
852 - support for multiple pieces per location (eg. Troke)
853 - pieces mutating on each turn (micro- and nano-shogi)
854 - add GUIs for Android, HTTP, text
855 - incremental board update, move animation
856 - chesslike-moves themes with arrows for moves
857 - golike-moves themes with numbers
858 - unconstrained position editing
859   - palette holder
860   - "set game" or "multiple moves/edits without an order" as part of history
861   - special input modes for (eg. for go, allow cycling white/black/empty)
862   - tools to allow reconstructing full history from game snapshots
863 - generic undo support by full-replay for game not providing specific
864   undo implementation ?
865 - "refuse" should not be so close to "undo"
867 Milestone 1.0 ?
868 -------------
870 - move history display, forking history
871 - editing history
872 - DnD moves
873 - UI playerdriver for PutMove with visual cues on "touch" and validate
874   on "release"
875 - network play
876   - using existing standard protocols for supported games
877   - generic protocol
878     - check whether fedmsg or another generic messenging framework could
879       be leveraged (http://fedmsg.com/)
880     - over chat channels (irc/xmpp/whatever - use libpurple or similar ?)
881     - p2p protocol for serverless operation
882     - use of advertize/discovery protocol (avahi ?) for finding nearby
883       network opponents
884 - free position editing / problem solving support
885 - global themes to tie renderers and skins all together
886 - easy installation for plugins / additional packages (packagekit,
887   sessioninstaller ?
888 - the current design makes it so that multiplexed player drivers send
889   signal_ready() to the game even when they are attached to a
890   Multiplexer.  It is not known to cause any problem today, but that's not
891   clean and will eventually cause problems.
893 Post 1.0 ?
894 --------
896 - sandboxed plugins (RestrictedPython looks like the best candidate,
897   but zope is told to be moving away from it, investigate)
898 - investigate alternative (preexisting) plugin systems (eg. ethos)
899 - support for Phalanx game (en: http://www.boardgamegeek.com/boardgame/4554
900   fr: http://jeuxstrategieter.free.fr/Phalanx_presentation.php)
901 - support for Ploy game (possible moves depending on piece orientation)
902 - support for game-analysis engines
903 - other common (?) notations for chess ? (initials in native language,
904   ICCF numeric notation)
905 - voice annotation, speech-to-text support
906 - world domination
908 Other ideas of games to add
909 ---------------------------
911 - classical ones: hip, gomoku, chinese checkers, halma
912 - seen in "les jeux de table pour tous": jumpin, "blocus maritime"
914 About the name
915 ==============
917 - it starts with "om", which sounds nice for an OpenMoko-enabled app
918 - it ends with "a", much like tagua and kaya, to whom it owes much
919 - I was on Omaha Beach when I thought it was cool to use this name :)
920 - a couple of days before, we played Beach Go with my son on that very
921 beach :)
924 Useful sites for game rules
925 ===========================
927 http://en.wikipedia.org/wiki/Category:Abstract_strategy_games
928 http://www.boardgamegeek.com/boardgamecategory/1009
929 [fr] http://jeuxstrategie.free.fr/
930 http://www.boardspace.net/ [+ SGF game archives]
933 File formats references
934 =======================
936 - PGN
937   http://en.wikipedia.org/wiki/Portable_Game_Notation
938 - PSN
939   http://japanesechess.org/psn_white_sheet.php
940 - SGF
941   http://www.red-bean.com/sgf/
944 Additional standalone AIs we may want to support
945 ================================================
947 xboard-compatible (chess and variants)
948  (phalanx, crafty, sjeng, fairymax, stockfish, hoichess)
949 UCI-compatible chess engines (natively or through polyglot)
950  (fruit, toga2, glaurung, stockfish)
951 orego, pachi, fuego, amigogtp (go)
952 grhino (othello, amazons?)
953 eleeye, hoichess (xiangqi)
954 GPSshogi
957 GUI programs with builtin AI (from which AI would need to be split)
958 ============================
960 gf1 (gipf) - http://repo.or.cz/w/gf1.git
961 3Dchess
964 Other programs we may want to interface with
965 ============================================
967 http://remi.coulom.free.fr/Bayesian-Elo/ to produce ratings from
968   tournament matches
971 Sources for game art
972 ====================
974 http://mucho.girly.jp/bona/ (CC, includes some vector shogi pieces)
975 http://www.kiseido.com/shogi/shogi_equipment.htm (info on traditional
976  calligraphy used for shogi tiles)
977 xboard has a nice SVG theme, for standard shogio only
980 Other UI programs (possibly steal themes/ideas)
981 =================
983 (for playing)
984 tagua
985 kaya
986 knights
987 eboard
988 gnome-chess
989 fltk-chess
990 quarry
991 gmchess
992 gogui
993 xistrat
994 pychess
995 brutalchess, dreamchess, pouetchess (3D/animated)
996 tofu
997 cgoban
998 cgoban3(KGS)
1000 gpe-go
1001 android apps (go droid, gobandroid, ...)
1002 pidgin-gmchess
1003 http://www.playwitharena.com/
1005 (for other tasks)
1006 scid
1007 uligo
1009 cutechess