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
18 Homepage: https://alioth.debian.org/projects/omaha/
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
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
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
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")
75 - pyparsing (tested with v2.0.1)
77 To play against the computer:
78 - gnuchess, fairy-max or another xboard-compliant Chess engine
80 - gnugo or another GTP2-compliant Go engine
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
113 - a king capturing should be allowed to land on any free tile
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
119 - feedback for move being composed
120 Game-file formats: none yet
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)
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)
161 - kanji tiles do not distinguish left- from right-quail
162 Game-file formats: none
170 - checkmate, stalemate
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)
181 - no territory counting
183 - placed stone is not dead
186 - rendering of captures
187 Game-file formats: SGF
188 AI: GTP2 (gnugo, etc.)
190 GliĆski's hexagonal Chess
191 -------------------------
194 - different rule for startup boost
198 - checkmate, stalemate
200 Visual issues: none known
201 Game-file formats: none yet
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.
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:
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.
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)
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
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:
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
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
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
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
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
330 Other specific fields are available for specific plugin types.
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
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
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.
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.
416 HOWTO add a new UI Toolkit to Omaha
417 ===================================
419 - for convenience, let's say you want to add support for a toolkit
422 - put a minimal launcher stub in place, which in turn requires a stub
423 Toolkit implementation, so that "./scripts/omaha --toolkit=Foo" is
426 - get an eventloop started, and a minimal window displayed
428 - add presentation of the available games, a "play" action, and a stub
431 Most games have parameters, so the natural next step is to implement
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
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
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
481 - gradually add support for other features:
482 - player driver setup
485 HOWTO add a new game to Omaha
486 =============================
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)
503 - does not allow to use dotted notation in package_data
504 (must use non-intuitive "/" instead)
505 - gnuchess issues "resign" after moving
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
514 - all royal pieces are reported as "king" when .checking_piece()
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
534 - Go: PASS moves in go trigger PutMove assert_locations to complain about
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
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
551 - AI/AI game gets stuck, UI should show a cue (eg. gnushogi vs. itself
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
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
575 - the game window should have a minimum size
576 - using fullscreenpiecedelegating for go, or
577 using fullscreenpoolpiecedelecating with chess etc causes
579 - holder renderer when openning prefs dialog is set to default, not
581 - fullscreenpoolpiecedelegating does not display shogi pieces in
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)
596 * Short-term goals (including a number of things otherwise listed
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
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
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
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
665 - turn params into ctor args, moving default values there, and allowing
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
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
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
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)
717 - switch SimpleDrawnStones from hardcoded games to skinnability
719 - improve structuring for location highlighting
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
749 - Gtk: canvas mask is in Gtk.Play, while handling is in Toolkit.Gtk
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)
772 - add a shogi SVG renderer and skins
773 - multi-kanji character rendering
775 - capabilities for plugins (eg. svg, various UI support for player
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)
809 - implement move checking by AI
811 - make AI engines portable
812 - look at wisted.internet.reactor.spawnProcess in twisted for
813 portable async process communication
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
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
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
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"
870 - move history display, forking history
873 - UI playerdriver for PutMove with visual cues on "touch" and validate
876 - using existing standard protocols for supported games
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
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,
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.
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
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"
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
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 =======================
937 http://en.wikipedia.org/wiki/Portable_Game_Notation
939 http://japanesechess.org/psn_white_sheet.php
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)
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
964 Other programs we may want to interface with
965 ============================================
967 http://remi.coulom.free.fr/Bayesian-Elo/ to produce ratings from
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)
995 brutalchess, dreamchess, pouetchess (3D/animated)
1001 android apps (go droid, gobandroid, ...)
1003 http://www.playwitharena.com/