From 76f1e81b3426b94e1d80c9daa309f78045e5335b Mon Sep 17 00:00:00 2001 From: H.G. Muller Date: Mon, 18 Jan 2010 13:16:33 +0100 Subject: [PATCH] Check-in Lasker-2.2.3 tar ball from samba.org --- lasker-2.2.3/COPYING | 339 + lasker-2.2.3/CVS/Entries | 12 + lasker-2.2.3/CVS/Repository | 1 + lasker-2.2.3/CVS/Root | 1 + lasker-2.2.3/README | 168 + lasker-2.2.3/bots/CVS/Entries | 1 + lasker-2.2.3/bots/CVS/Repository | 1 + lasker-2.2.3/bots/CVS/Root | 1 + lasker-2.2.3/bots/mamer/CVS/Entries | 34 + lasker-2.2.3/bots/mamer/CVS/Repository | 1 + lasker-2.2.3/bots/mamer/CVS/Root | 1 + lasker-2.2.3/bots/mamer/Command.cc | 156 + lasker-2.2.3/bots/mamer/Command.hh | 77 + lasker-2.2.3/bots/mamer/CommandEntry.cc | 1148 +++ lasker-2.2.3/bots/mamer/CommandEntry.hh | 98 + lasker-2.2.3/bots/mamer/Game.cc | 59 + lasker-2.2.3/bots/mamer/Game.hh | 87 + lasker-2.2.3/bots/mamer/Makefile | 136 + lasker-2.2.3/bots/mamer/Mamer.cc | 2032 +++++ lasker-2.2.3/bots/mamer/Mamer.hh | 205 + lasker-2.2.3/bots/mamer/Player.cc | 78 + lasker-2.2.3/bots/mamer/Player.hh | 91 + lasker-2.2.3/bots/mamer/Storage.cc | 58 + lasker-2.2.3/bots/mamer/Storage.hh | 87 + lasker-2.2.3/bots/mamer/Tourney.cc | 1014 +++ lasker-2.2.3/bots/mamer/Tourney.hh | 180 + lasker-2.2.3/bots/mamer/TourneyParameters.cc | 33 + lasker-2.2.3/bots/mamer/TourneyParameters.hh | 57 + lasker-2.2.3/bots/mamer/TourneyPlayers.cc | 270 + lasker-2.2.3/bots/mamer/TourneyPlayers.hh | 125 + lasker-2.2.3/bots/mamer/User.cc | 419 + lasker-2.2.3/bots/mamer/User.hh | 161 + lasker-2.2.3/bots/mamer/bin/CVS/Entries | 4 + lasker-2.2.3/bots/mamer/bin/CVS/Repository | 1 + lasker-2.2.3/bots/mamer/bin/CVS/Root | 1 + lasker-2.2.3/bots/mamer/bin/cleaner.pl | 20 + lasker-2.2.3/bots/mamer/bin/hindex.pl | 32 + lasker-2.2.3/bots/mamer/bin/rank.pl | 50 + lasker-2.2.3/bots/mamer/command_list.h | 131 + lasker-2.2.3/bots/mamer/config.h | 149 + lasker-2.2.3/bots/mamer/data/CVS/Entries | 2 + lasker-2.2.3/bots/mamer/data/CVS/Repository | 1 + lasker-2.2.3/bots/mamer/data/CVS/Root | 1 + lasker-2.2.3/bots/mamer/help/CVS/Entries | 40 + lasker-2.2.3/bots/mamer/help/CVS/Repository | 1 + lasker-2.2.3/bots/mamer/help/CVS/Root | 1 + lasker-2.2.3/bots/mamer/help/about | 32 + lasker-2.2.3/bots/mamer/help/addchaos | 16 + lasker-2.2.3/bots/mamer/help/addtotourney | 18 + lasker-2.2.3/bots/mamer/help/announce | 19 + lasker-2.2.3/bots/mamer/help/chaos | 20 + lasker-2.2.3/bots/mamer/help/close | 16 + lasker-2.2.3/bots/mamer/help/create | 12 + lasker-2.2.3/bots/mamer/help/delete | 15 + lasker-2.2.3/bots/mamer/help/finger | 38 + lasker-2.2.3/bots/mamer/help/forfeit | 21 + lasker-2.2.3/bots/mamer/help/help | 16 + lasker-2.2.3/bots/mamer/help/index | 10 + lasker-2.2.3/bots/mamer/help/join | 13 + lasker-2.2.3/bots/mamer/help/keep | 17 + lasker-2.2.3/bots/mamer/help/listmanagers | 14 + lasker-2.2.3/bots/mamer/help/listplayers | 45 + lasker-2.2.3/bots/mamer/help/listtourneys | 32 + lasker-2.2.3/bots/mamer/help/listtourneyvars | 46 + lasker-2.2.3/bots/mamer/help/loadedusers | 13 + lasker-2.2.3/bots/mamer/help/manager_commands | 23 + lasker-2.2.3/bots/mamer/help/manager_help | 341 + lasker-2.2.3/bots/mamer/help/manager_level | 40 + lasker-2.2.3/bots/mamer/help/messman | 12 + lasker-2.2.3/bots/mamer/help/open | 16 + lasker-2.2.3/bots/mamer/help/performance | 14 + lasker-2.2.3/bots/mamer/help/rating | 40 + lasker-2.2.3/bots/mamer/help/setcommandlevel | 14 + lasker-2.2.3/bots/mamer/help/setmanagerlevel | 18 + lasker-2.2.3/bots/mamer/help/setres | 15 + lasker-2.2.3/bots/mamer/help/setstat | 23 + lasker-2.2.3/bots/mamer/help/settourneyvar | 14 + lasker-2.2.3/bots/mamer/help/showcommands | 16 + lasker-2.2.3/bots/mamer/help/showhelpfile | 11 + lasker-2.2.3/bots/mamer/help/shutdown | 11 + lasker-2.2.3/bots/mamer/help/swiss | 23 + lasker-2.2.3/bots/mamer/help/upset | 14 + lasker-2.2.3/bots/mamer/help/user_commands | 16 + lasker-2.2.3/bots/mamer/help/who | 43 + lasker-2.2.3/bots/mamer/help/withdraw | 17 + lasker-2.2.3/bots/mamer/link.cc | 179 + lasker-2.2.3/bots/mamer/link.hh | 86 + lasker-2.2.3/bots/mamer/linklist.hh | 64 + lasker-2.2.3/bots/mamer/logs/CVS/Entries | 1 + lasker-2.2.3/bots/mamer/logs/CVS/Repository | 1 + lasker-2.2.3/bots/mamer/logs/CVS/Root | 1 + lasker-2.2.3/bots/mamer/main.cc | 71 + lasker-2.2.3/bots/mamer/mamer.config | 11 + lasker-2.2.3/bots/mamer/template/CVS/Entries | 3 + lasker-2.2.3/bots/mamer/template/CVS/Repository | 1 + lasker-2.2.3/bots/mamer/template/CVS/Root | 1 + lasker-2.2.3/bots/mamer/template/template.cc | 19 + lasker-2.2.3/bots/mamer/template/template.hh | 22 + lasker-2.2.3/bots/mamer/types.h | 157 + lasker-2.2.3/data/CVS/Entries | 8 + lasker-2.2.3/data/CVS/Repository | 1 + lasker-2.2.3/data/CVS/Root | 1 + lasker-2.2.3/data/admin/CVS/Entries | 69 + lasker-2.2.3/data/admin/CVS/Repository | 1 + lasker-2.2.3/data/admin/CVS/Root | 1 + lasker-2.2.3/data/admin/accounts | 19 + lasker-2.2.3/data/admin/acheckhelp | 8 + lasker-2.2.3/data/admin/aconfig | 15 + lasker-2.2.3/data/admin/addaccounts | 101 + lasker-2.2.3/data/admin/addcomment | 20 + lasker-2.2.3/data/admin/addplayer | 19 + lasker-2.2.3/data/admin/adjud_info | 32 + lasker-2.2.3/data/admin/adjudicate | 26 + lasker-2.2.3/data/admin/admin | 14 + lasker-2.2.3/data/admin/admin_hierarchy | 8 + lasker-2.2.3/data/admin/adump | 8 + lasker-2.2.3/data/admin/ahelp | 15 + lasker-2.2.3/data/admin/amotd | 7 + lasker-2.2.3/data/admin/anews | 16 + lasker-2.2.3/data/admin/announce | 14 + lasker-2.2.3/data/admin/annunreg | 15 + lasker-2.2.3/data/admin/areload | 11 + lasker-2.2.3/data/admin/asetadmin | 25 + lasker-2.2.3/data/admin/asetblitz | 15 + lasker-2.2.3/data/admin/asetbughouse | 11 + lasker-2.2.3/data/admin/asetemail | 16 + lasker-2.2.3/data/admin/asethandle | 15 + lasker-2.2.3/data/admin/asetlight | 11 + lasker-2.2.3/data/admin/asetmaxplayer | 21 + lasker-2.2.3/data/admin/asetpasswd | 19 + lasker-2.2.3/data/admin/asetrealname | 14 + lasker-2.2.3/data/admin/asetstd | 15 + lasker-2.2.3/data/admin/asetv | 15 + lasker-2.2.3/data/admin/asetwild | 15 + lasker-2.2.3/data/admin/ban | 26 + lasker-2.2.3/data/admin/buglist | 95 + lasker-2.2.3/data/admin/canewsd | 9 + lasker-2.2.3/data/admin/canewse | 18 + lasker-2.2.3/data/admin/canewsf | 16 + lasker-2.2.3/data/admin/canewsi | 21 + lasker-2.2.3/data/admin/canewsp | 13 + lasker-2.2.3/data/admin/canewst | 14 + lasker-2.2.3/data/admin/chkgame | 30 + lasker-2.2.3/data/admin/chkip | 19 + lasker-2.2.3/data/admin/chkpl | 33 + lasker-2.2.3/data/admin/chksc | 13 + lasker-2.2.3/data/admin/chkts | 13 + lasker-2.2.3/data/admin/cmuzzle | 23 + lasker-2.2.3/data/admin/cnewsd | 9 + lasker-2.2.3/data/admin/cnewse | 17 + lasker-2.2.3/data/admin/cnewsf | 16 + lasker-2.2.3/data/admin/cnewsi | 16 + lasker-2.2.3/data/admin/cnewsp | 13 + lasker-2.2.3/data/admin/cnewst | 14 + lasker-2.2.3/data/admin/createanews | 11 + lasker-2.2.3/data/admin/filter | 22 + lasker-2.2.3/data/admin/finger | 13 + lasker-2.2.3/data/admin/ftell | 8 + lasker-2.2.3/data/admin/hideinfo | 8 + lasker-2.2.3/data/admin/lists | 30 + lasker-2.2.3/data/admin/muzzle | 23 + lasker-2.2.3/data/admin/nuke | 16 + lasker-2.2.3/data/admin/pose | 15 + lasker-2.2.3/data/admin/projects | 35 + lasker-2.2.3/data/admin/quota | 15 + lasker-2.2.3/data/admin/raisedead | 20 + lasker-2.2.3/data/admin/register | 43 + lasker-2.2.3/data/admin/remplayer | 23 + lasker-2.2.3/data/admin/rerank | 14 + lasker-2.2.3/data/admin/server_com | 41 + lasker-2.2.3/data/admin/showcomment | 13 + lasker-2.2.3/data/admin/shutdown | 29 + lasker-2.2.3/data/admin/summon | 15 + lasker-2.2.3/data/boards/CVS/Entries | 1 + lasker-2.2.3/data/boards/CVS/Repository | 1 + lasker-2.2.3/data/boards/CVS/Root | 1 + lasker-2.2.3/data/boards/wild/CVS/Entries | 1 + lasker-2.2.3/data/boards/wild/CVS/Repository | 1 + lasker-2.2.3/data/boards/wild/CVS/Root | 1 + lasker-2.2.3/data/book/CVS/Entries | 10 + lasker-2.2.3/data/book/CVS/Repository | 1 + lasker-2.2.3/data/book/CVS/Root | 1 + lasker-2.2.3/data/book/changes.txt | 25 + lasker-2.2.3/data/book/eco000.idx | 2008 +++++ lasker-2.2.3/data/book/eco999.idx | 2008 +++++ lasker-2.2.3/data/book/fen.doc | 130 + lasker-2.2.3/data/book/long001.idx | 8076 ++++++++++++++++++++ lasker-2.2.3/data/book/long999.idx | 8076 ++++++++++++++++++++ lasker-2.2.3/data/book/nic000.idx | 2172 ++++++ lasker-2.2.3/data/book/nic999.idx | 2172 ++++++ lasker-2.2.3/data/book/opening.doc | 27 + lasker-2.2.3/data/com_help/CVS/Entries | 1 + lasker-2.2.3/data/com_help/CVS/Repository | 1 + lasker-2.2.3/data/com_help/CVS/Root | 1 + lasker-2.2.3/data/help/CVS/Entries | 211 + lasker-2.2.3/data/help/CVS/Repository | 1 + lasker-2.2.3/data/help/CVS/Root | 1 + lasker-2.2.3/data/help/_help | 18 + lasker-2.2.3/data/help/abort | 27 + lasker-2.2.3/data/help/abuser | 22 + lasker-2.2.3/data/help/accept | 17 + lasker-2.2.3/data/help/addlist | 16 + lasker-2.2.3/data/help/addresses | 39 + lasker-2.2.3/data/help/adjourn | 23 + lasker-2.2.3/data/help/adjournments | 45 + lasker-2.2.3/data/help/adjud_info | 28 + lasker-2.2.3/data/help/adjudication | 46 + lasker-2.2.3/data/help/adm-info | 21 + lasker-2.2.3/data/help/adm-new | 24 + lasker-2.2.3/data/help/adm_info | 31 + lasker-2.2.3/data/help/adm_new | 24 + lasker-2.2.3/data/help/admins | 35 + lasker-2.2.3/data/help/alias | 107 + lasker-2.2.3/data/help/allobservers | 24 + lasker-2.2.3/data/help/analysis | 6 + lasker-2.2.3/data/help/assess | 16 + lasker-2.2.3/data/help/backward | 18 + lasker-2.2.3/data/help/bell | 12 + lasker-2.2.3/data/help/best | 20 + lasker-2.2.3/data/help/blitz | 57 + lasker-2.2.3/data/help/bname | 8 + lasker-2.2.3/data/help/boards | 40 + lasker-2.2.3/data/help/bsetup | 174 + lasker-2.2.3/data/help/busy | 27 + lasker-2.2.3/data/help/censor | 21 + lasker-2.2.3/data/help/chan_1 | 35 + lasker-2.2.3/data/help/channel | 52 + lasker-2.2.3/data/help/clearmessages | 13 + lasker-2.2.3/data/help/clrsquare | 13 + lasker-2.2.3/data/help/cls | 1 + lasker-2.2.3/data/help/cls_info | 11 + lasker-2.2.3/data/help/computers | 15 + lasker-2.2.3/data/help/courtesyabort | 10 + lasker-2.2.3/data/help/credit | 10 + lasker-2.2.3/data/help/cshout | 17 + lasker-2.2.3/data/help/date | 13 + lasker-2.2.3/data/help/decline | 19 + lasker-2.2.3/data/help/draw | 22 + lasker-2.2.3/data/help/eco | 28 + lasker-2.2.3/data/help/eggo | 137 + lasker-2.2.3/data/help/etiquette | 71 + lasker-2.2.3/data/help/examine | 94 + lasker-2.2.3/data/help/fics-lingo | 70 + lasker-2.2.3/data/help/fics_lingo | 66 + lasker-2.2.3/data/help/ficsfaq | 160 + lasker-2.2.3/data/help/finger | 54 + lasker-2.2.3/data/help/fixes | 18 + lasker-2.2.3/data/help/flag | 40 + lasker-2.2.3/data/help/flip | 16 + lasker-2.2.3/data/help/fmessage | 18 + lasker-2.2.3/data/help/formula | 179 + lasker-2.2.3/data/help/forward | 23 + lasker-2.2.3/data/help/ftp-hints | 66 + lasker-2.2.3/data/help/ftp_hints | 124 + lasker-2.2.3/data/help/games | 58 + lasker-2.2.3/data/help/getgi | 6 + lasker-2.2.3/data/help/getpi | 6 + lasker-2.2.3/data/help/glicko | 219 + lasker-2.2.3/data/help/gm_game | 18 + lasker-2.2.3/data/help/gnotify | 18 + lasker-2.2.3/data/help/goboard | 13 + lasker-2.2.3/data/help/gonum | 12 + lasker-2.2.3/data/help/handle | 26 + lasker-2.2.3/data/help/handles | 15 + lasker-2.2.3/data/help/hbest | 20 + lasker-2.2.3/data/help/help | 24 + lasker-2.2.3/data/help/highlight | 20 + lasker-2.2.3/data/help/history | 58 + lasker-2.2.3/data/help/hrank | 33 + lasker-2.2.3/data/help/inchannel | 14 + lasker-2.2.3/data/help/index | 20 + lasker-2.2.3/data/help/inetchesslib | 184 + lasker-2.2.3/data/help/interfaces | 216 + lasker-2.2.3/data/help/intro0 | 44 + lasker-2.2.3/data/help/intro1 | 35 + lasker-2.2.3/data/help/intro2 | 63 + lasker-2.2.3/data/help/intro3 | 46 + lasker-2.2.3/data/help/intro4 | 36 + lasker-2.2.3/data/help/intro5 | 24 + lasker-2.2.3/data/help/intro6 | 50 + lasker-2.2.3/data/help/intro7 | 83 + lasker-2.2.3/data/help/intro_basics | 21 + lasker-2.2.3/data/help/intro_general | 41 + lasker-2.2.3/data/help/intro_information | 67 + lasker-2.2.3/data/help/intro_moving | 83 + lasker-2.2.3/data/help/intro_playing | 66 + lasker-2.2.3/data/help/intro_settings | 36 + lasker-2.2.3/data/help/intro_special | 25 + lasker-2.2.3/data/help/intro_talking | 67 + lasker-2.2.3/data/help/intro_welcome | 49 + lasker-2.2.3/data/help/iset | 26 + lasker-2.2.3/data/help/it | 46 + lasker-2.2.3/data/help/jkill | 12 + lasker-2.2.3/data/help/journal | 54 + lasker-2.2.3/data/help/jsave | 43 + lasker-2.2.3/data/help/kibitz | 36 + lasker-2.2.3/data/help/kiblevel | 46 + lasker-2.2.3/data/help/lag | 37 + lasker-2.2.3/data/help/lecture1 | 260 + lasker-2.2.3/data/help/lightning | 35 + lasker-2.2.3/data/help/limits | 16 + lasker-2.2.3/data/help/lists | 24 + lasker-2.2.3/data/help/llogons | 11 + lasker-2.2.3/data/help/logons | 13 + lasker-2.2.3/data/help/ltell | 9 + lasker-2.2.3/data/help/mailmess | 27 + lasker-2.2.3/data/help/mailmoves | 15 + lasker-2.2.3/data/help/mailoldmoves | 10 + lasker-2.2.3/data/help/mailstored | 21 + lasker-2.2.3/data/help/match | 123 + lasker-2.2.3/data/help/messages | 30 + lasker-2.2.3/data/help/mexamine | 18 + lasker-2.2.3/data/help/moretime | 25 + lasker-2.2.3/data/help/motd.std | 10 + lasker-2.2.3/data/help/motd_help | 12 + lasker-2.2.3/data/help/moves | 13 + lasker-2.2.3/data/help/newrating | 41 + lasker-2.2.3/data/help/news | 16 + lasker-2.2.3/data/help/next | 13 + lasker-2.2.3/data/help/noplay | 20 + lasker-2.2.3/data/help/notes | 17 + lasker-2.2.3/data/help/notify | 43 + lasker-2.2.3/data/help/observe | 38 + lasker-2.2.3/data/help/oldmoves | 10 + lasker-2.2.3/data/help/open | 14 + lasker-2.2.3/data/help/partner | 23 + lasker-2.2.3/data/help/password | 12 + lasker-2.2.3/data/help/pause | 16 + lasker-2.2.3/data/help/pending | 12 + lasker-2.2.3/data/help/play | 36 + lasker-2.2.3/data/help/prefresh | 12 + lasker-2.2.3/data/help/private | 16 + lasker-2.2.3/data/help/promote | 15 + lasker-2.2.3/data/help/pstat | 201 + lasker-2.2.3/data/help/ptell | 12 + lasker-2.2.3/data/help/ptime | 17 + lasker-2.2.3/data/help/qtell | 12 + lasker-2.2.3/data/help/quit | 16 + lasker-2.2.3/data/help/rank | 32 + lasker-2.2.3/data/help/ratings | 54 + lasker-2.2.3/data/help/refresh | 16 + lasker-2.2.3/data/help/register | 56 + lasker-2.2.3/data/help/register.dist | 16 + lasker-2.2.3/data/help/register.email | 25 + lasker-2.2.3/data/help/remote | 22 + lasker-2.2.3/data/help/resign | 17 + lasker-2.2.3/data/help/revert | 13 + lasker-2.2.3/data/help/rmatch | 11 + lasker-2.2.3/data/help/say | 18 + lasker-2.2.3/data/help/seek | 102 + lasker-2.2.3/data/help/servers | 6 + lasker-2.2.3/data/help/set | 43 + lasker-2.2.3/data/help/shout | 47 + lasker-2.2.3/data/help/shout_abuse | 64 + lasker-2.2.3/data/help/shout_quota | 18 + lasker-2.2.3/data/help/showlist | 18 + lasker-2.2.3/data/help/simabort | 15 + lasker-2.2.3/data/help/simadjourn | 18 + lasker-2.2.3/data/help/simallabort | 14 + lasker-2.2.3/data/help/simalladjourn | 18 + lasker-2.2.3/data/help/simgames | 13 + lasker-2.2.3/data/help/simmatch | 17 + lasker-2.2.3/data/help/simnext | 15 + lasker-2.2.3/data/help/simopen | 14 + lasker-2.2.3/data/help/simpass | 14 + lasker-2.2.3/data/help/simprev | 15 + lasker-2.2.3/data/help/simuls | 76 + lasker-2.2.3/data/help/smoves | 23 + lasker-2.2.3/data/help/soapbox | 39 + lasker-2.2.3/data/help/sought | 30 + lasker-2.2.3/data/help/sourcecode | 14 + lasker-2.2.3/data/help/sposition | 12 + lasker-2.2.3/data/help/standard | 48 + lasker-2.2.3/data/help/statistics | 14 + lasker-2.2.3/data/help/stored | 32 + lasker-2.2.3/data/help/style | 33 + lasker-2.2.3/data/help/sublist | 15 + lasker-2.2.3/data/help/switch | 13 + lasker-2.2.3/data/help/takeback | 24 + lasker-2.2.3/data/help/teamgames | 57 + lasker-2.2.3/data/help/tell | 48 + lasker-2.2.3/data/help/time | 15 + lasker-2.2.3/data/help/timeseal | 144 + lasker-2.2.3/data/help/todo | 7 + lasker-2.2.3/data/help/toggle | 8 + lasker-2.2.3/data/help/tomove | 13 + lasker-2.2.3/data/help/totals | 5 + lasker-2.2.3/data/help/tournset | 14 + lasker-2.2.3/data/help/unalias | 12 + lasker-2.2.3/data/help/uncensor | 12 + lasker-2.2.3/data/help/unexamine | 14 + lasker-2.2.3/data/help/unnotify | 12 + lasker-2.2.3/data/help/unobserve | 18 + lasker-2.2.3/data/help/unpause | 14 + lasker-2.2.3/data/help/unseek | 13 + lasker-2.2.3/data/help/untimed | 17 + lasker-2.2.3/data/help/uptime | 14 + lasker-2.2.3/data/help/uscf_faq | 222 + lasker-2.2.3/data/help/variables | 85 + lasker-2.2.3/data/help/whenshut | 13 + lasker-2.2.3/data/help/whisper | 17 + lasker-2.2.3/data/help/who | 125 + lasker-2.2.3/data/help/wild | 45 + lasker-2.2.3/data/help/withdraw | 26 + lasker-2.2.3/data/help/wname | 8 + lasker-2.2.3/data/help/xtell | 21 + lasker-2.2.3/data/help/znotify | 14 + lasker-2.2.3/data/messages/CVS/Entries | 8 + lasker-2.2.3/data/messages/CVS/Repository | 1 + lasker-2.2.3/data/messages/CVS/Root | 1 + lasker-2.2.3/data/messages/admotd | 6 + lasker-2.2.3/data/messages/login | 2 + lasker-2.2.3/data/messages/logout | 3 + lasker-2.2.3/data/messages/logout.fancy | 19 + lasker-2.2.3/data/messages/motd | 6 + lasker-2.2.3/data/messages/unregistered | 5 + lasker-2.2.3/data/messages/welcome | 17 + lasker-2.2.3/data/stats/CVS/Entries | 2 + lasker-2.2.3/data/stats/CVS/Repository | 1 + lasker-2.2.3/data/stats/CVS/Root | 1 + lasker-2.2.3/data/usage/CVS/Entries | 193 + lasker-2.2.3/data/usage/CVS/Repository | 1 + lasker-2.2.3/data/usage/CVS/Root | 1 + lasker-2.2.3/data/usage/abort | 4 + lasker-2.2.3/data/usage/accept | 5 + lasker-2.2.3/data/usage/acheckhelp | 3 + lasker-2.2.3/data/usage/aconfig | 4 + lasker-2.2.3/data/usage/addcomment | 4 + lasker-2.2.3/data/usage/addlist | 5 + lasker-2.2.3/data/usage/addplayer | 4 + lasker-2.2.3/data/usage/adjourn | 5 + lasker-2.2.3/data/usage/adjudicate | 5 + lasker-2.2.3/data/usage/admin | 4 + lasker-2.2.3/data/usage/adump | 4 + lasker-2.2.3/data/usage/ahelp | 4 + lasker-2.2.3/data/usage/alias | 4 + lasker-2.2.3/data/usage/allobservers | 4 + lasker-2.2.3/data/usage/anews | 4 + lasker-2.2.3/data/usage/announce | 4 + lasker-2.2.3/data/usage/annunreg | 4 + lasker-2.2.3/data/usage/areload | 3 + lasker-2.2.3/data/usage/asetadmin | 4 + lasker-2.2.3/data/usage/asetblitz | 4 + lasker-2.2.3/data/usage/asetbughouse | 4 + lasker-2.2.3/data/usage/asetclock | 4 + lasker-2.2.3/data/usage/asetemail | 4 + lasker-2.2.3/data/usage/asethandle | 4 + lasker-2.2.3/data/usage/asetlight | 4 + lasker-2.2.3/data/usage/asetmaxplayer | 4 + lasker-2.2.3/data/usage/asetpasswd | 4 + lasker-2.2.3/data/usage/asetrealname | 4 + lasker-2.2.3/data/usage/asetstd | 4 + lasker-2.2.3/data/usage/asetsuicide | 4 + lasker-2.2.3/data/usage/asetv | 4 + lasker-2.2.3/data/usage/asetwild | 4 + lasker-2.2.3/data/usage/assess | 6 + lasker-2.2.3/data/usage/backward | 4 + lasker-2.2.3/data/usage/bell | 4 + lasker-2.2.3/data/usage/best | 4 + lasker-2.2.3/data/usage/bname | 4 + lasker-2.2.3/data/usage/boards | 4 + lasker-2.2.3/data/usage/bsetup | 4 + lasker-2.2.3/data/usage/bugwho | 4 + lasker-2.2.3/data/usage/canewsd | 4 + lasker-2.2.3/data/usage/canewse | 4 + lasker-2.2.3/data/usage/canewsf | 4 + lasker-2.2.3/data/usage/canewsi | 4 + lasker-2.2.3/data/usage/canewsp | 4 + lasker-2.2.3/data/usage/canewst | 4 + lasker-2.2.3/data/usage/cbest | 4 + lasker-2.2.3/data/usage/chkgame | 4 + lasker-2.2.3/data/usage/chkip | 4 + lasker-2.2.3/data/usage/chkpl | 6 + lasker-2.2.3/data/usage/chksc | 4 + lasker-2.2.3/data/usage/chkts | 4 + lasker-2.2.3/data/usage/clearmessages | 5 + lasker-2.2.3/data/usage/clrsquare | 4 + lasker-2.2.3/data/usage/cnewsd | 4 + lasker-2.2.3/data/usage/cnewse | 4 + lasker-2.2.3/data/usage/cnewsf | 4 + lasker-2.2.3/data/usage/cnewsi | 4 + lasker-2.2.3/data/usage/cnewsp | 4 + lasker-2.2.3/data/usage/cnewst | 4 + lasker-2.2.3/data/usage/copygame | 4 + lasker-2.2.3/data/usage/crank | 6 + lasker-2.2.3/data/usage/cshout | 4 + lasker-2.2.3/data/usage/date | 4 + lasker-2.2.3/data/usage/decline | 5 + lasker-2.2.3/data/usage/draw | 4 + lasker-2.2.3/data/usage/eco | 4 + lasker-2.2.3/data/usage/examine | 6 + lasker-2.2.3/data/usage/finger | 5 + lasker-2.2.3/data/usage/flag | 4 + lasker-2.2.3/data/usage/flip | 4 + lasker-2.2.3/data/usage/fmessage | 4 + lasker-2.2.3/data/usage/follow | 4 + lasker-2.2.3/data/usage/forward | 4 + lasker-2.2.3/data/usage/ftell | 4 + lasker-2.2.3/data/usage/games | 4 + lasker-2.2.3/data/usage/getgi | 2 + lasker-2.2.3/data/usage/getpi | 2 + lasker-2.2.3/data/usage/ginfo | 4 + lasker-2.2.3/data/usage/goboard | 4 + lasker-2.2.3/data/usage/handles | 4 + lasker-2.2.3/data/usage/hbest | 4 + lasker-2.2.3/data/usage/help | 4 + lasker-2.2.3/data/usage/hideinfo | 4 + lasker-2.2.3/data/usage/history | 4 + lasker-2.2.3/data/usage/hrank | 6 + lasker-2.2.3/data/usage/inchannel | 5 + lasker-2.2.3/data/usage/info | 4 + lasker-2.2.3/data/usage/iset | 3 + lasker-2.2.3/data/usage/it | 4 + lasker-2.2.3/data/usage/jkill | 4 + lasker-2.2.3/data/usage/journal | 4 + lasker-2.2.3/data/usage/jsave | 6 + lasker-2.2.3/data/usage/kibitz | 4 + lasker-2.2.3/data/usage/limits | 4 + lasker-2.2.3/data/usage/llogons | 4 + lasker-2.2.3/data/usage/logons | 4 + lasker-2.2.3/data/usage/ltell | 4 + lasker-2.2.3/data/usage/mailhelp | 4 + lasker-2.2.3/data/usage/mailmess | 4 + lasker-2.2.3/data/usage/mailmoves | 4 + lasker-2.2.3/data/usage/mailoldmoves | 5 + lasker-2.2.3/data/usage/mailstored | 5 + lasker-2.2.3/data/usage/match | 5 + lasker-2.2.3/data/usage/messages | 5 + lasker-2.2.3/data/usage/mexamine | 4 + lasker-2.2.3/data/usage/moretime | 4 + lasker-2.2.3/data/usage/moves | 4 + lasker-2.2.3/data/usage/news | 4 + lasker-2.2.3/data/usage/next | 4 + lasker-2.2.3/data/usage/nuke | 4 + lasker-2.2.3/data/usage/observe | 4 + lasker-2.2.3/data/usage/oldmoves | 5 + lasker-2.2.3/data/usage/oldpstat | 4 + lasker-2.2.3/data/usage/open | 4 + lasker-2.2.3/data/usage/partner | 4 + lasker-2.2.3/data/usage/password | 4 + lasker-2.2.3/data/usage/pause | 4 + lasker-2.2.3/data/usage/pending | 4 + lasker-2.2.3/data/usage/pfollow | 4 + lasker-2.2.3/data/usage/play | 4 + lasker-2.2.3/data/usage/pobserve | 4 + lasker-2.2.3/data/usage/pose | 4 + lasker-2.2.3/data/usage/prefresh | 4 + lasker-2.2.3/data/usage/primary | 4 + lasker-2.2.3/data/usage/promote | 4 + lasker-2.2.3/data/usage/pstat | 4 + lasker-2.2.3/data/usage/ptell | 4 + lasker-2.2.3/data/usage/ptime | 4 + lasker-2.2.3/data/usage/qtell | 2 + lasker-2.2.3/data/usage/quit | 4 + lasker-2.2.3/data/usage/quota | 4 + lasker-2.2.3/data/usage/raisedead | 4 + lasker-2.2.3/data/usage/rank | 5 + lasker-2.2.3/data/usage/refresh | 4 + lasker-2.2.3/data/usage/rematch | 4 + lasker-2.2.3/data/usage/remplayer | 4 + lasker-2.2.3/data/usage/rerank | 4 + lasker-2.2.3/data/usage/resign | 4 + lasker-2.2.3/data/usage/resume | 4 + lasker-2.2.3/data/usage/revert | 4 + lasker-2.2.3/data/usage/rmatch | 3 + lasker-2.2.3/data/usage/say | 4 + lasker-2.2.3/data/usage/seek | 6 + lasker-2.2.3/data/usage/set | 5 + lasker-2.2.3/data/usage/shout | 4 + lasker-2.2.3/data/usage/showcomment | 4 + lasker-2.2.3/data/usage/showlist | 5 + lasker-2.2.3/data/usage/shutdown | 5 + lasker-2.2.3/data/usage/simabort | 4 + lasker-2.2.3/data/usage/simadjourn | 4 + lasker-2.2.3/data/usage/simallabort | 4 + lasker-2.2.3/data/usage/simalladjourn | 4 + lasker-2.2.3/data/usage/simgames | 4 + lasker-2.2.3/data/usage/simmatch | 4 + lasker-2.2.3/data/usage/simnext | 4 + lasker-2.2.3/data/usage/simopen | 4 + lasker-2.2.3/data/usage/simpass | 4 + lasker-2.2.3/data/usage/simprev | 4 + lasker-2.2.3/data/usage/smoves | 5 + lasker-2.2.3/data/usage/smposition | 6 + lasker-2.2.3/data/usage/sought | 4 + lasker-2.2.3/data/usage/sposition | 5 + lasker-2.2.3/data/usage/statistics | 4 + lasker-2.2.3/data/usage/stored | 4 + lasker-2.2.3/data/usage/style | 4 + lasker-2.2.3/data/usage/sublist | 5 + lasker-2.2.3/data/usage/summon | 4 + lasker-2.2.3/data/usage/switch | 4 + lasker-2.2.3/data/usage/takeback | 4 + lasker-2.2.3/data/usage/tell | 4 + lasker-2.2.3/data/usage/time | 4 + lasker-2.2.3/data/usage/toggle | 4 + lasker-2.2.3/data/usage/tomove | 4 + lasker-2.2.3/data/usage/tournset | 2 + lasker-2.2.3/data/usage/unalias | 4 + lasker-2.2.3/data/usage/unexamine | 4 + lasker-2.2.3/data/usage/unobserve | 4 + lasker-2.2.3/data/usage/unpause | 4 + lasker-2.2.3/data/usage/unseek | 4 + lasker-2.2.3/data/usage/uptime | 4 + lasker-2.2.3/data/usage/ustat | 4 + lasker-2.2.3/data/usage/variables | 4 + lasker-2.2.3/data/usage/whenshut | 5 + lasker-2.2.3/data/usage/whisper | 4 + lasker-2.2.3/data/usage/who | 4 + lasker-2.2.3/data/usage/withdraw | 5 + lasker-2.2.3/data/usage/wname | 4 + lasker-2.2.3/data/usage/xkibitz | 4 + lasker-2.2.3/data/usage/xtell | 5 + lasker-2.2.3/data/usage/xwhisper | 5 + lasker-2.2.3/data/usage/znotify | 5 + lasker-2.2.3/doc/CREDITS | 79 + lasker-2.2.3/doc/CVS/Entries | 5 + lasker-2.2.3/doc/CVS/Repository | 1 + lasker-2.2.3/doc/CVS/Root | 1 + lasker-2.2.3/doc/Changelog | 196 + lasker-2.2.3/doc/README_LEGAL | 64 + lasker-2.2.3/doc/README_Nash | 37 + lasker-2.2.3/games/CVS/Entries | 1 + lasker-2.2.3/games/CVS/Repository | 1 + lasker-2.2.3/games/CVS/Root | 1 + lasker-2.2.3/games/history/CVS/Entries | 1 + lasker-2.2.3/games/history/CVS/Repository | 1 + lasker-2.2.3/games/history/CVS/Root | 1 + lasker-2.2.3/scripts/CVS/Entries | 3 + lasker-2.2.3/scripts/CVS/Repository | 1 + lasker-2.2.3/scripts/CVS/Root | 1 + lasker-2.2.3/scripts/spool_sendmail | 18 + lasker-2.2.3/scripts/start_chessd | 12 + lasker-2.2.3/src/.cvsignore | 11 + lasker-2.2.3/src/CVS/Entries | 85 + lasker-2.2.3/src/CVS/Repository | 1 + lasker-2.2.3/src/CVS/Root | 1 + lasker-2.2.3/src/Makefile.in | 149 + lasker-2.2.3/src/acconfig.h | 58 + lasker-2.2.3/src/adminproc.c | 1223 +++ lasker-2.2.3/src/algcheck.c | 513 ++ lasker-2.2.3/src/autoconfig.h.in | 112 + lasker-2.2.3/src/board.c | 1056 +++ lasker-2.2.3/src/board.h | 116 + lasker-2.2.3/src/command.c | 1141 +++ lasker-2.2.3/src/command.h | 84 + lasker-2.2.3/src/command_list.h | 286 + lasker-2.2.3/src/common.h | 94 + lasker-2.2.3/src/comproc.c | 1347 ++++ lasker-2.2.3/src/config.c | 218 + lasker-2.2.3/src/config.h | 97 + lasker-2.2.3/src/configure | 2432 ++++++ lasker-2.2.3/src/configure.in | 58 + lasker-2.2.3/src/crypt-md5.c | 134 + lasker-2.2.3/src/crypt-md5c.c | 322 + lasker-2.2.3/src/crypt-misc.c | 44 + lasker-2.2.3/src/crypt.c | 40 + lasker-2.2.3/src/eco.c | 397 + lasker-2.2.3/src/fics_addplayer.c | 135 + lasker-2.2.3/src/ficsmain.c | 236 + lasker-2.2.3/src/ficsmain.h | 36 + lasker-2.2.3/src/findstatic.pl | 70 + lasker-2.2.3/src/follow.c | 62 + lasker-2.2.3/src/formula.c | 569 ++ lasker-2.2.3/src/formula.h | 65 + lasker-2.2.3/src/gamedb.c | 1471 ++++ lasker-2.2.3/src/gamedb.h | 147 + lasker-2.2.3/src/gamedb_old.c | 454 ++ lasker-2.2.3/src/gameproc.c | 1944 +++++ lasker-2.2.3/src/gameproc.h | 27 + lasker-2.2.3/src/gics.c | 240 + lasker-2.2.3/src/gics.h | 43 + lasker-2.2.3/src/globals.h | 98 + lasker-2.2.3/src/help.c | 120 + lasker-2.2.3/src/includes.h | 82 + lasker-2.2.3/src/install-sh | 238 + lasker-2.2.3/src/iset.c | 67 + lasker-2.2.3/src/iset.h | 28 + lasker-2.2.3/src/journal.h | 11 + lasker-2.2.3/src/lists.c | 551 ++ lasker-2.2.3/src/lists.h | 29 + lasker-2.2.3/src/makerank.c | 235 + lasker-2.2.3/src/malloc.c | 303 + lasker-2.2.3/src/malloc.h | 39 + lasker-2.2.3/src/matchproc.c | 943 +++ lasker-2.2.3/src/matchproc.h | 27 + lasker-2.2.3/src/md5.h | 36 + lasker-2.2.3/src/mkproto.awk | 88 + lasker-2.2.3/src/movecheck.c | 1274 +++ lasker-2.2.3/src/movecheck.h | 41 + lasker-2.2.3/src/multicol.c | 140 + lasker-2.2.3/src/multicol.h | 31 + lasker-2.2.3/src/network.c | 621 ++ lasker-2.2.3/src/network.h | 60 + lasker-2.2.3/src/news.c | 539 ++ lasker-2.2.3/src/news.h | 29 + lasker-2.2.3/src/newvers.sh | 74 + lasker-2.2.3/src/obsproc.c | 1792 +++++ lasker-2.2.3/src/obsproc.h | 11 + lasker-2.2.3/src/parsers/.cvsignore | 1 + lasker-2.2.3/src/parsers/CVS/Entries | 7 + lasker-2.2.3/src/parsers/CVS/Repository | 1 + lasker-2.2.3/src/parsers/CVS/Root | 1 + lasker-2.2.3/src/parsers/README | 45 + lasker-2.2.3/src/parsers/genparser.c | 788 ++ lasker-2.2.3/src/parsers/genparser.h | 100 + lasker-2.2.3/src/parsers/genstruct.pl | 299 + lasker-2.2.3/src/parsers/parser.c | 165 + lasker-2.2.3/src/pending.c | 744 ++ lasker-2.2.3/src/pending.h | 44 + lasker-2.2.3/src/playerdb.c | 1499 ++++ lasker-2.2.3/src/playerdb.h | 179 + lasker-2.2.3/src/playerdb_old.c | 694 ++ lasker-2.2.3/src/ratings.c | 1438 ++++ lasker-2.2.3/src/ratings.h | 46 + lasker-2.2.3/src/reload.c | 68 + lasker-2.2.3/src/seekproc.c | 255 + lasker-2.2.3/src/setup.c | 330 + lasker-2.2.3/src/shutdown.c | 241 + lasker-2.2.3/src/talkproc.c | 907 +++ lasker-2.2.3/src/talkproc.h | 37 + lasker-2.2.3/src/tdb/CVS/Entries | 5 + lasker-2.2.3/src/tdb/CVS/Repository | 1 + lasker-2.2.3/src/tdb/CVS/Root | 1 + lasker-2.2.3/src/tdb/spinlock.c | 429 ++ lasker-2.2.3/src/tdb/spinlock.h | 55 + lasker-2.2.3/src/tdb/tdb.c | 1828 +++++ lasker-2.2.3/src/tdb/tdb.h | 142 + lasker-2.2.3/src/timeseal.c | 188 + lasker-2.2.3/src/utils.c | 1210 +++ lasker-2.2.3/src/utils.h | 51 + lasker-2.2.3/src/variable.c | 997 +++ lasker-2.2.3/src/variable.h | 47 + lasker-2.2.3/src/vers.h | 9 + lasker-2.2.3/testplay/CVS/Entries | 2 + lasker-2.2.3/testplay/CVS/Repository | 1 + lasker-2.2.3/testplay/CVS/Root | 1 + lasker-2.2.3/testplay/play2.pl | 326 + lasker-2.2.3/tests/CVS/Entries | 3 + lasker-2.2.3/tests/CVS/Repository | 1 + lasker-2.2.3/tests/CVS/Root | 1 + lasker-2.2.3/tests/setup.exp | 62 + lasker-2.2.3/tests/test1.exp | 90 + lasker-2.2.3/timeseal/CVS/Entries | 3 + lasker-2.2.3/timeseal/CVS/Repository | 1 + lasker-2.2.3/timeseal/CVS/Root | 1 + lasker-2.2.3/timeseal/README | 37 + .../timeseal/timeseal_decoder-Linux-ELF-2.4 | Bin 0 -> 334028 bytes lasker-2.2.3/web/CVS/Entries | 2 + lasker-2.2.3/web/CVS/Repository | 1 + lasker-2.2.3/web/CVS/Root | 1 + lasker-2.2.3/web/index.html | 96 + 752 files changed, 81539 insertions(+), 0 deletions(-) create mode 100644 lasker-2.2.3/COPYING create mode 100644 lasker-2.2.3/CVS/Entries create mode 100644 lasker-2.2.3/CVS/Repository create mode 100644 lasker-2.2.3/CVS/Root create mode 100644 lasker-2.2.3/README create mode 100644 lasker-2.2.3/bots/CVS/Entries create mode 100644 lasker-2.2.3/bots/CVS/Repository create mode 100644 lasker-2.2.3/bots/CVS/Root create mode 100644 lasker-2.2.3/bots/mamer/CVS/Entries create mode 100644 lasker-2.2.3/bots/mamer/CVS/Repository create mode 100644 lasker-2.2.3/bots/mamer/CVS/Root create mode 100644 lasker-2.2.3/bots/mamer/Command.cc create mode 100644 lasker-2.2.3/bots/mamer/Command.hh create mode 100644 lasker-2.2.3/bots/mamer/CommandEntry.cc create mode 100644 lasker-2.2.3/bots/mamer/CommandEntry.hh create mode 100644 lasker-2.2.3/bots/mamer/Game.cc create mode 100644 lasker-2.2.3/bots/mamer/Game.hh create mode 100644 lasker-2.2.3/bots/mamer/Makefile create mode 100644 lasker-2.2.3/bots/mamer/Mamer.cc create mode 100644 lasker-2.2.3/bots/mamer/Mamer.hh create mode 100644 lasker-2.2.3/bots/mamer/Player.cc create mode 100644 lasker-2.2.3/bots/mamer/Player.hh create mode 100644 lasker-2.2.3/bots/mamer/Storage.cc create mode 100644 lasker-2.2.3/bots/mamer/Storage.hh create mode 100644 lasker-2.2.3/bots/mamer/Tourney.cc create mode 100644 lasker-2.2.3/bots/mamer/Tourney.hh create mode 100644 lasker-2.2.3/bots/mamer/TourneyParameters.cc create mode 100644 lasker-2.2.3/bots/mamer/TourneyParameters.hh create mode 100644 lasker-2.2.3/bots/mamer/TourneyPlayers.cc create mode 100644 lasker-2.2.3/bots/mamer/TourneyPlayers.hh create mode 100644 lasker-2.2.3/bots/mamer/User.cc create mode 100644 lasker-2.2.3/bots/mamer/User.hh create mode 100644 lasker-2.2.3/bots/mamer/bin/CVS/Entries create mode 100644 lasker-2.2.3/bots/mamer/bin/CVS/Repository create mode 100644 lasker-2.2.3/bots/mamer/bin/CVS/Root create mode 100755 lasker-2.2.3/bots/mamer/bin/cleaner.pl create mode 100755 lasker-2.2.3/bots/mamer/bin/hindex.pl create mode 100755 lasker-2.2.3/bots/mamer/bin/rank.pl create mode 100644 lasker-2.2.3/bots/mamer/command_list.h create mode 100644 lasker-2.2.3/bots/mamer/config.h create mode 100644 lasker-2.2.3/bots/mamer/data/CVS/Entries create mode 100644 lasker-2.2.3/bots/mamer/data/CVS/Repository create mode 100644 lasker-2.2.3/bots/mamer/data/CVS/Root create mode 100644 lasker-2.2.3/bots/mamer/data/managers create mode 100644 lasker-2.2.3/bots/mamer/help/CVS/Entries create mode 100644 lasker-2.2.3/bots/mamer/help/CVS/Repository create mode 100644 lasker-2.2.3/bots/mamer/help/CVS/Root create mode 100644 lasker-2.2.3/bots/mamer/help/about create mode 100644 lasker-2.2.3/bots/mamer/help/addchaos create mode 100644 lasker-2.2.3/bots/mamer/help/addtotourney create mode 100644 lasker-2.2.3/bots/mamer/help/announce create mode 100644 lasker-2.2.3/bots/mamer/help/chaos create mode 100644 lasker-2.2.3/bots/mamer/help/close create mode 100644 lasker-2.2.3/bots/mamer/help/create create mode 100644 lasker-2.2.3/bots/mamer/help/delete create mode 100644 lasker-2.2.3/bots/mamer/help/finger create mode 100644 lasker-2.2.3/bots/mamer/help/forfeit create mode 100644 lasker-2.2.3/bots/mamer/help/help create mode 100644 lasker-2.2.3/bots/mamer/help/index create mode 100644 lasker-2.2.3/bots/mamer/help/join create mode 100644 lasker-2.2.3/bots/mamer/help/keep create mode 100644 lasker-2.2.3/bots/mamer/help/listmanagers create mode 100644 lasker-2.2.3/bots/mamer/help/listplayers create mode 100644 lasker-2.2.3/bots/mamer/help/listtourneys create mode 100644 lasker-2.2.3/bots/mamer/help/listtourneyvars create mode 100644 lasker-2.2.3/bots/mamer/help/loadedusers create mode 100644 lasker-2.2.3/bots/mamer/help/manager_commands create mode 100644 lasker-2.2.3/bots/mamer/help/manager_help create mode 100644 lasker-2.2.3/bots/mamer/help/manager_level create mode 100644 lasker-2.2.3/bots/mamer/help/messman create mode 100644 lasker-2.2.3/bots/mamer/help/open create mode 100644 lasker-2.2.3/bots/mamer/help/performance create mode 100644 lasker-2.2.3/bots/mamer/help/rating create mode 100644 lasker-2.2.3/bots/mamer/help/setcommandlevel create mode 100644 lasker-2.2.3/bots/mamer/help/setmanagerlevel create mode 100644 lasker-2.2.3/bots/mamer/help/setres create mode 100644 lasker-2.2.3/bots/mamer/help/setstat create mode 100644 lasker-2.2.3/bots/mamer/help/settourneyvar create mode 100644 lasker-2.2.3/bots/mamer/help/showcommands create mode 100644 lasker-2.2.3/bots/mamer/help/showhelpfile create mode 100644 lasker-2.2.3/bots/mamer/help/shutdown create mode 100644 lasker-2.2.3/bots/mamer/help/swiss create mode 100644 lasker-2.2.3/bots/mamer/help/upset create mode 100644 lasker-2.2.3/bots/mamer/help/user_commands create mode 100644 lasker-2.2.3/bots/mamer/help/who create mode 100644 lasker-2.2.3/bots/mamer/help/withdraw create mode 100644 lasker-2.2.3/bots/mamer/link.cc create mode 100644 lasker-2.2.3/bots/mamer/link.hh create mode 100644 lasker-2.2.3/bots/mamer/linklist.hh create mode 100644 lasker-2.2.3/bots/mamer/logs/CVS/Entries create mode 100644 lasker-2.2.3/bots/mamer/logs/CVS/Repository create mode 100644 lasker-2.2.3/bots/mamer/logs/CVS/Root create mode 100644 lasker-2.2.3/bots/mamer/main.cc create mode 100644 lasker-2.2.3/bots/mamer/mamer.config create mode 100644 lasker-2.2.3/bots/mamer/template/CVS/Entries create mode 100644 lasker-2.2.3/bots/mamer/template/CVS/Repository create mode 100644 lasker-2.2.3/bots/mamer/template/CVS/Root create mode 100644 lasker-2.2.3/bots/mamer/template/template.cc create mode 100644 lasker-2.2.3/bots/mamer/template/template.hh create mode 100644 lasker-2.2.3/bots/mamer/types.h create mode 100644 lasker-2.2.3/data/CVS/Entries create mode 100644 lasker-2.2.3/data/CVS/Repository create mode 100644 lasker-2.2.3/data/CVS/Root create mode 100644 lasker-2.2.3/data/admin/CVS/Entries create mode 100644 lasker-2.2.3/data/admin/CVS/Repository create mode 100644 lasker-2.2.3/data/admin/CVS/Root create mode 100644 lasker-2.2.3/data/admin/accounts create mode 100644 lasker-2.2.3/data/admin/acheckhelp create mode 100644 lasker-2.2.3/data/admin/aconfig create mode 100644 lasker-2.2.3/data/admin/addaccounts create mode 100644 lasker-2.2.3/data/admin/addcomment create mode 100644 lasker-2.2.3/data/admin/addplayer create mode 100644 lasker-2.2.3/data/admin/adjud_info create mode 100644 lasker-2.2.3/data/admin/adjudicate create mode 100644 lasker-2.2.3/data/admin/admin create mode 100644 lasker-2.2.3/data/admin/admin_hierarchy create mode 100644 lasker-2.2.3/data/admin/adump create mode 100644 lasker-2.2.3/data/admin/ahelp create mode 100755 lasker-2.2.3/data/admin/amotd create mode 100644 lasker-2.2.3/data/admin/anews create mode 100644 lasker-2.2.3/data/admin/announce create mode 100644 lasker-2.2.3/data/admin/annunreg create mode 100644 lasker-2.2.3/data/admin/areload create mode 100644 lasker-2.2.3/data/admin/asetadmin create mode 100644 lasker-2.2.3/data/admin/asetblitz create mode 100644 lasker-2.2.3/data/admin/asetbughouse create mode 100644 lasker-2.2.3/data/admin/asetemail create mode 100644 lasker-2.2.3/data/admin/asethandle create mode 100644 lasker-2.2.3/data/admin/asetlight create mode 100644 lasker-2.2.3/data/admin/asetmaxplayer create mode 100644 lasker-2.2.3/data/admin/asetpasswd create mode 100644 lasker-2.2.3/data/admin/asetrealname create mode 100644 lasker-2.2.3/data/admin/asetstd create mode 100644 lasker-2.2.3/data/admin/asetv create mode 100644 lasker-2.2.3/data/admin/asetwild create mode 100644 lasker-2.2.3/data/admin/ban create mode 100644 lasker-2.2.3/data/admin/buglist create mode 100644 lasker-2.2.3/data/admin/canewsd create mode 100644 lasker-2.2.3/data/admin/canewse create mode 100644 lasker-2.2.3/data/admin/canewsf create mode 100644 lasker-2.2.3/data/admin/canewsi create mode 100644 lasker-2.2.3/data/admin/canewsp create mode 100644 lasker-2.2.3/data/admin/canewst create mode 100644 lasker-2.2.3/data/admin/chkgame create mode 100644 lasker-2.2.3/data/admin/chkip create mode 100644 lasker-2.2.3/data/admin/chkpl create mode 100644 lasker-2.2.3/data/admin/chksc create mode 100644 lasker-2.2.3/data/admin/chkts create mode 100644 lasker-2.2.3/data/admin/cmuzzle create mode 100644 lasker-2.2.3/data/admin/cnewsd create mode 100644 lasker-2.2.3/data/admin/cnewse create mode 100644 lasker-2.2.3/data/admin/cnewsf create mode 100644 lasker-2.2.3/data/admin/cnewsi create mode 100644 lasker-2.2.3/data/admin/cnewsp create mode 100644 lasker-2.2.3/data/admin/cnewst create mode 100644 lasker-2.2.3/data/admin/createanews create mode 100644 lasker-2.2.3/data/admin/filter create mode 100644 lasker-2.2.3/data/admin/finger create mode 100644 lasker-2.2.3/data/admin/ftell create mode 100644 lasker-2.2.3/data/admin/hideinfo create mode 100644 lasker-2.2.3/data/admin/lists create mode 100644 lasker-2.2.3/data/admin/muzzle create mode 100644 lasker-2.2.3/data/admin/nuke create mode 100644 lasker-2.2.3/data/admin/pose create mode 100644 lasker-2.2.3/data/admin/projects create mode 100644 lasker-2.2.3/data/admin/quota create mode 100644 lasker-2.2.3/data/admin/raisedead create mode 100644 lasker-2.2.3/data/admin/register create mode 100644 lasker-2.2.3/data/admin/remplayer create mode 100644 lasker-2.2.3/data/admin/rerank create mode 100644 lasker-2.2.3/data/admin/server_com create mode 100644 lasker-2.2.3/data/admin/showcomment create mode 100644 lasker-2.2.3/data/admin/shutdown create mode 100644 lasker-2.2.3/data/admin/summon create mode 100644 lasker-2.2.3/data/boards/CVS/Entries create mode 100644 lasker-2.2.3/data/boards/CVS/Repository create mode 100644 lasker-2.2.3/data/boards/CVS/Root create mode 100644 lasker-2.2.3/data/boards/wild/CVS/Entries create mode 100644 lasker-2.2.3/data/boards/wild/CVS/Repository create mode 100644 lasker-2.2.3/data/boards/wild/CVS/Root create mode 100644 lasker-2.2.3/data/book/CVS/Entries create mode 100644 lasker-2.2.3/data/book/CVS/Repository create mode 100644 lasker-2.2.3/data/book/CVS/Root create mode 100644 lasker-2.2.3/data/book/changes.txt create mode 100644 lasker-2.2.3/data/book/eco000.idx create mode 100755 lasker-2.2.3/data/book/eco999.idx create mode 100644 lasker-2.2.3/data/book/fen.doc create mode 100644 lasker-2.2.3/data/book/long001.idx create mode 100755 lasker-2.2.3/data/book/long999.idx create mode 100644 lasker-2.2.3/data/book/nic000.idx create mode 100755 lasker-2.2.3/data/book/nic999.idx create mode 100644 lasker-2.2.3/data/book/opening.doc create mode 100644 lasker-2.2.3/data/com_help/CVS/Entries create mode 100644 lasker-2.2.3/data/com_help/CVS/Repository create mode 100644 lasker-2.2.3/data/com_help/CVS/Root create mode 100644 lasker-2.2.3/data/help/CVS/Entries create mode 100644 lasker-2.2.3/data/help/CVS/Repository create mode 100644 lasker-2.2.3/data/help/CVS/Root create mode 100755 lasker-2.2.3/data/help/_help create mode 100755 lasker-2.2.3/data/help/abort create mode 100755 lasker-2.2.3/data/help/abuser create mode 100755 lasker-2.2.3/data/help/accept create mode 100755 lasker-2.2.3/data/help/addlist create mode 100755 lasker-2.2.3/data/help/addresses create mode 100755 lasker-2.2.3/data/help/adjourn create mode 100755 lasker-2.2.3/data/help/adjournments create mode 100755 lasker-2.2.3/data/help/adjud_info create mode 100755 lasker-2.2.3/data/help/adjudication create mode 100755 lasker-2.2.3/data/help/adm-info create mode 100755 lasker-2.2.3/data/help/adm-new create mode 100755 lasker-2.2.3/data/help/adm_info create mode 100755 lasker-2.2.3/data/help/adm_new create mode 100755 lasker-2.2.3/data/help/admins create mode 100755 lasker-2.2.3/data/help/alias create mode 100755 lasker-2.2.3/data/help/allobservers create mode 100755 lasker-2.2.3/data/help/analysis create mode 100755 lasker-2.2.3/data/help/assess create mode 100755 lasker-2.2.3/data/help/backward create mode 100755 lasker-2.2.3/data/help/bell create mode 100755 lasker-2.2.3/data/help/best create mode 100755 lasker-2.2.3/data/help/blitz create mode 100644 lasker-2.2.3/data/help/bname create mode 100755 lasker-2.2.3/data/help/boards create mode 100644 lasker-2.2.3/data/help/bsetup create mode 100755 lasker-2.2.3/data/help/busy create mode 100755 lasker-2.2.3/data/help/censor create mode 100755 lasker-2.2.3/data/help/chan_1 create mode 100755 lasker-2.2.3/data/help/channel create mode 100755 lasker-2.2.3/data/help/clearmessages create mode 100644 lasker-2.2.3/data/help/clrsquare create mode 100755 lasker-2.2.3/data/help/cls create mode 100755 lasker-2.2.3/data/help/cls_info create mode 100755 lasker-2.2.3/data/help/computers create mode 100755 lasker-2.2.3/data/help/courtesyabort create mode 100755 lasker-2.2.3/data/help/credit create mode 100755 lasker-2.2.3/data/help/cshout create mode 100755 lasker-2.2.3/data/help/date create mode 100755 lasker-2.2.3/data/help/decline create mode 100755 lasker-2.2.3/data/help/draw create mode 100755 lasker-2.2.3/data/help/eco create mode 100755 lasker-2.2.3/data/help/eggo create mode 100755 lasker-2.2.3/data/help/etiquette create mode 100755 lasker-2.2.3/data/help/examine create mode 100755 lasker-2.2.3/data/help/fics-lingo create mode 100755 lasker-2.2.3/data/help/fics_lingo create mode 100755 lasker-2.2.3/data/help/ficsfaq create mode 100755 lasker-2.2.3/data/help/finger create mode 100755 lasker-2.2.3/data/help/fixes create mode 100755 lasker-2.2.3/data/help/flag create mode 100755 lasker-2.2.3/data/help/flip create mode 100755 lasker-2.2.3/data/help/fmessage create mode 100755 lasker-2.2.3/data/help/formula create mode 100755 lasker-2.2.3/data/help/forward create mode 100755 lasker-2.2.3/data/help/ftp-hints create mode 100755 lasker-2.2.3/data/help/ftp_hints create mode 100755 lasker-2.2.3/data/help/games create mode 100755 lasker-2.2.3/data/help/getgi create mode 100755 lasker-2.2.3/data/help/getpi create mode 100755 lasker-2.2.3/data/help/glicko create mode 100755 lasker-2.2.3/data/help/gm_game create mode 100644 lasker-2.2.3/data/help/gnotify create mode 100755 lasker-2.2.3/data/help/goboard create mode 100755 lasker-2.2.3/data/help/gonum create mode 100755 lasker-2.2.3/data/help/handle create mode 100755 lasker-2.2.3/data/help/handles create mode 100755 lasker-2.2.3/data/help/hbest create mode 100755 lasker-2.2.3/data/help/help create mode 100755 lasker-2.2.3/data/help/highlight create mode 100755 lasker-2.2.3/data/help/history create mode 100755 lasker-2.2.3/data/help/hrank create mode 100755 lasker-2.2.3/data/help/inchannel create mode 100755 lasker-2.2.3/data/help/index create mode 100755 lasker-2.2.3/data/help/inetchesslib create mode 100755 lasker-2.2.3/data/help/interfaces create mode 100755 lasker-2.2.3/data/help/intro0 create mode 100755 lasker-2.2.3/data/help/intro1 create mode 100755 lasker-2.2.3/data/help/intro2 create mode 100755 lasker-2.2.3/data/help/intro3 create mode 100755 lasker-2.2.3/data/help/intro4 create mode 100755 lasker-2.2.3/data/help/intro5 create mode 100755 lasker-2.2.3/data/help/intro6 create mode 100755 lasker-2.2.3/data/help/intro7 create mode 100644 lasker-2.2.3/data/help/intro_basics create mode 100755 lasker-2.2.3/data/help/intro_general create mode 100755 lasker-2.2.3/data/help/intro_information create mode 100755 lasker-2.2.3/data/help/intro_moving create mode 100755 lasker-2.2.3/data/help/intro_playing create mode 100755 lasker-2.2.3/data/help/intro_settings create mode 100755 lasker-2.2.3/data/help/intro_special create mode 100755 lasker-2.2.3/data/help/intro_talking create mode 100755 lasker-2.2.3/data/help/intro_welcome create mode 100644 lasker-2.2.3/data/help/iset create mode 100755 lasker-2.2.3/data/help/it create mode 100755 lasker-2.2.3/data/help/jkill create mode 100644 lasker-2.2.3/data/help/journal create mode 100644 lasker-2.2.3/data/help/jsave create mode 100755 lasker-2.2.3/data/help/kibitz create mode 100644 lasker-2.2.3/data/help/kiblevel create mode 100755 lasker-2.2.3/data/help/lag create mode 100755 lasker-2.2.3/data/help/lecture1 create mode 100644 lasker-2.2.3/data/help/lightning create mode 100755 lasker-2.2.3/data/help/limits create mode 100755 lasker-2.2.3/data/help/lists create mode 100755 lasker-2.2.3/data/help/llogons create mode 100755 lasker-2.2.3/data/help/logons create mode 100644 lasker-2.2.3/data/help/ltell create mode 100755 lasker-2.2.3/data/help/mailmess create mode 100755 lasker-2.2.3/data/help/mailmoves create mode 100755 lasker-2.2.3/data/help/mailoldmoves create mode 100755 lasker-2.2.3/data/help/mailstored create mode 100755 lasker-2.2.3/data/help/match create mode 100755 lasker-2.2.3/data/help/messages create mode 100755 lasker-2.2.3/data/help/mexamine create mode 100755 lasker-2.2.3/data/help/moretime create mode 100755 lasker-2.2.3/data/help/motd.std create mode 100755 lasker-2.2.3/data/help/motd_help create mode 100755 lasker-2.2.3/data/help/moves create mode 100755 lasker-2.2.3/data/help/newrating create mode 100755 lasker-2.2.3/data/help/news create mode 100755 lasker-2.2.3/data/help/next create mode 100644 lasker-2.2.3/data/help/noplay create mode 100644 lasker-2.2.3/data/help/notes create mode 100755 lasker-2.2.3/data/help/notify create mode 100755 lasker-2.2.3/data/help/observe create mode 100755 lasker-2.2.3/data/help/oldmoves create mode 100755 lasker-2.2.3/data/help/open create mode 100755 lasker-2.2.3/data/help/partner create mode 100755 lasker-2.2.3/data/help/password create mode 100755 lasker-2.2.3/data/help/pause create mode 100755 lasker-2.2.3/data/help/pending create mode 100755 lasker-2.2.3/data/help/play create mode 100755 lasker-2.2.3/data/help/prefresh create mode 100755 lasker-2.2.3/data/help/private create mode 100755 lasker-2.2.3/data/help/promote create mode 100755 lasker-2.2.3/data/help/pstat create mode 100755 lasker-2.2.3/data/help/ptell create mode 100755 lasker-2.2.3/data/help/ptime create mode 100755 lasker-2.2.3/data/help/qtell create mode 100755 lasker-2.2.3/data/help/quit create mode 100755 lasker-2.2.3/data/help/rank create mode 100755 lasker-2.2.3/data/help/ratings create mode 100755 lasker-2.2.3/data/help/refresh create mode 100755 lasker-2.2.3/data/help/register create mode 100755 lasker-2.2.3/data/help/register.dist create mode 100755 lasker-2.2.3/data/help/register.email create mode 100644 lasker-2.2.3/data/help/remote create mode 100755 lasker-2.2.3/data/help/resign create mode 100755 lasker-2.2.3/data/help/revert create mode 100644 lasker-2.2.3/data/help/rmatch create mode 100755 lasker-2.2.3/data/help/say create mode 100755 lasker-2.2.3/data/help/seek create mode 100755 lasker-2.2.3/data/help/servers create mode 100755 lasker-2.2.3/data/help/set create mode 100755 lasker-2.2.3/data/help/shout create mode 100755 lasker-2.2.3/data/help/shout_abuse create mode 100755 lasker-2.2.3/data/help/shout_quota create mode 100755 lasker-2.2.3/data/help/showlist create mode 100755 lasker-2.2.3/data/help/simabort create mode 100755 lasker-2.2.3/data/help/simadjourn create mode 100755 lasker-2.2.3/data/help/simallabort create mode 100755 lasker-2.2.3/data/help/simalladjourn create mode 100755 lasker-2.2.3/data/help/simgames create mode 100755 lasker-2.2.3/data/help/simmatch create mode 100755 lasker-2.2.3/data/help/simnext create mode 100755 lasker-2.2.3/data/help/simopen create mode 100755 lasker-2.2.3/data/help/simpass create mode 100755 lasker-2.2.3/data/help/simprev create mode 100755 lasker-2.2.3/data/help/simuls create mode 100755 lasker-2.2.3/data/help/smoves create mode 100755 lasker-2.2.3/data/help/soapbox create mode 100755 lasker-2.2.3/data/help/sought create mode 100755 lasker-2.2.3/data/help/sourcecode create mode 100755 lasker-2.2.3/data/help/sposition create mode 100644 lasker-2.2.3/data/help/standard create mode 100755 lasker-2.2.3/data/help/statistics create mode 100755 lasker-2.2.3/data/help/stored create mode 100755 lasker-2.2.3/data/help/style create mode 100755 lasker-2.2.3/data/help/sublist create mode 100755 lasker-2.2.3/data/help/switch create mode 100755 lasker-2.2.3/data/help/takeback create mode 100755 lasker-2.2.3/data/help/teamgames create mode 100755 lasker-2.2.3/data/help/tell create mode 100755 lasker-2.2.3/data/help/time create mode 100755 lasker-2.2.3/data/help/timeseal create mode 100755 lasker-2.2.3/data/help/todo create mode 100644 lasker-2.2.3/data/help/toggle create mode 100755 lasker-2.2.3/data/help/tomove create mode 100755 lasker-2.2.3/data/help/totals create mode 100755 lasker-2.2.3/data/help/tournset create mode 100755 lasker-2.2.3/data/help/unalias create mode 100755 lasker-2.2.3/data/help/uncensor create mode 100755 lasker-2.2.3/data/help/unexamine create mode 100755 lasker-2.2.3/data/help/unnotify create mode 100755 lasker-2.2.3/data/help/unobserve create mode 100755 lasker-2.2.3/data/help/unpause create mode 100755 lasker-2.2.3/data/help/unseek create mode 100644 lasker-2.2.3/data/help/untimed create mode 100755 lasker-2.2.3/data/help/uptime create mode 100755 lasker-2.2.3/data/help/uscf_faq create mode 100755 lasker-2.2.3/data/help/variables create mode 100755 lasker-2.2.3/data/help/whenshut create mode 100755 lasker-2.2.3/data/help/whisper create mode 100755 lasker-2.2.3/data/help/who create mode 100755 lasker-2.2.3/data/help/wild create mode 100755 lasker-2.2.3/data/help/withdraw create mode 100644 lasker-2.2.3/data/help/wname create mode 100755 lasker-2.2.3/data/help/xtell create mode 100755 lasker-2.2.3/data/help/znotify create mode 100644 lasker-2.2.3/data/messages/CVS/Entries create mode 100644 lasker-2.2.3/data/messages/CVS/Repository create mode 100644 lasker-2.2.3/data/messages/CVS/Root create mode 100755 lasker-2.2.3/data/messages/admotd create mode 100755 lasker-2.2.3/data/messages/login create mode 100755 lasker-2.2.3/data/messages/logout create mode 100755 lasker-2.2.3/data/messages/logout.fancy create mode 100755 lasker-2.2.3/data/messages/motd create mode 100755 lasker-2.2.3/data/messages/unregistered create mode 100755 lasker-2.2.3/data/messages/welcome create mode 100644 lasker-2.2.3/data/stats/CVS/Entries create mode 100644 lasker-2.2.3/data/stats/CVS/Repository create mode 100644 lasker-2.2.3/data/stats/CVS/Root create mode 100755 lasker-2.2.3/data/stats/newratings_data create mode 100644 lasker-2.2.3/data/usage/CVS/Entries create mode 100644 lasker-2.2.3/data/usage/CVS/Repository create mode 100644 lasker-2.2.3/data/usage/CVS/Root create mode 100755 lasker-2.2.3/data/usage/abort create mode 100755 lasker-2.2.3/data/usage/accept create mode 100644 lasker-2.2.3/data/usage/acheckhelp create mode 100644 lasker-2.2.3/data/usage/aconfig create mode 100755 lasker-2.2.3/data/usage/addcomment create mode 100755 lasker-2.2.3/data/usage/addlist create mode 100755 lasker-2.2.3/data/usage/addplayer create mode 100755 lasker-2.2.3/data/usage/adjourn create mode 100755 lasker-2.2.3/data/usage/adjudicate create mode 100755 lasker-2.2.3/data/usage/admin create mode 100644 lasker-2.2.3/data/usage/adump create mode 100755 lasker-2.2.3/data/usage/ahelp create mode 100755 lasker-2.2.3/data/usage/alias create mode 100755 lasker-2.2.3/data/usage/allobservers create mode 100755 lasker-2.2.3/data/usage/anews create mode 100755 lasker-2.2.3/data/usage/announce create mode 100755 lasker-2.2.3/data/usage/annunreg create mode 100644 lasker-2.2.3/data/usage/areload create mode 100755 lasker-2.2.3/data/usage/asetadmin create mode 100755 lasker-2.2.3/data/usage/asetblitz create mode 100755 lasker-2.2.3/data/usage/asetbughouse create mode 100755 lasker-2.2.3/data/usage/asetclock create mode 100755 lasker-2.2.3/data/usage/asetemail create mode 100755 lasker-2.2.3/data/usage/asethandle create mode 100755 lasker-2.2.3/data/usage/asetlight create mode 100755 lasker-2.2.3/data/usage/asetmaxplayer create mode 100755 lasker-2.2.3/data/usage/asetpasswd create mode 100755 lasker-2.2.3/data/usage/asetrealname create mode 100755 lasker-2.2.3/data/usage/asetstd create mode 100755 lasker-2.2.3/data/usage/asetsuicide create mode 100755 lasker-2.2.3/data/usage/asetv create mode 100755 lasker-2.2.3/data/usage/asetwild create mode 100755 lasker-2.2.3/data/usage/assess create mode 100755 lasker-2.2.3/data/usage/backward create mode 100755 lasker-2.2.3/data/usage/bell create mode 100755 lasker-2.2.3/data/usage/best create mode 100755 lasker-2.2.3/data/usage/bname create mode 100755 lasker-2.2.3/data/usage/boards create mode 100755 lasker-2.2.3/data/usage/bsetup create mode 100755 lasker-2.2.3/data/usage/bugwho create mode 100644 lasker-2.2.3/data/usage/canewsd create mode 100644 lasker-2.2.3/data/usage/canewse create mode 100755 lasker-2.2.3/data/usage/canewsf create mode 100755 lasker-2.2.3/data/usage/canewsi create mode 100644 lasker-2.2.3/data/usage/canewsp create mode 100644 lasker-2.2.3/data/usage/canewst create mode 100755 lasker-2.2.3/data/usage/cbest create mode 100755 lasker-2.2.3/data/usage/chkgame create mode 100755 lasker-2.2.3/data/usage/chkip create mode 100755 lasker-2.2.3/data/usage/chkpl create mode 100755 lasker-2.2.3/data/usage/chksc create mode 100755 lasker-2.2.3/data/usage/chkts create mode 100755 lasker-2.2.3/data/usage/clearmessages create mode 100755 lasker-2.2.3/data/usage/clrsquare create mode 100644 lasker-2.2.3/data/usage/cnewsd create mode 100644 lasker-2.2.3/data/usage/cnewse create mode 100755 lasker-2.2.3/data/usage/cnewsf create mode 100755 lasker-2.2.3/data/usage/cnewsi create mode 100644 lasker-2.2.3/data/usage/cnewsp create mode 100644 lasker-2.2.3/data/usage/cnewst create mode 100755 lasker-2.2.3/data/usage/copygame create mode 100755 lasker-2.2.3/data/usage/crank create mode 100755 lasker-2.2.3/data/usage/cshout create mode 100755 lasker-2.2.3/data/usage/date create mode 100755 lasker-2.2.3/data/usage/decline create mode 100755 lasker-2.2.3/data/usage/draw create mode 100755 lasker-2.2.3/data/usage/eco create mode 100755 lasker-2.2.3/data/usage/examine create mode 100755 lasker-2.2.3/data/usage/finger create mode 100755 lasker-2.2.3/data/usage/flag create mode 100755 lasker-2.2.3/data/usage/flip create mode 100755 lasker-2.2.3/data/usage/fmessage create mode 100755 lasker-2.2.3/data/usage/follow create mode 100755 lasker-2.2.3/data/usage/forward create mode 100755 lasker-2.2.3/data/usage/ftell create mode 100755 lasker-2.2.3/data/usage/games create mode 100644 lasker-2.2.3/data/usage/getgi create mode 100644 lasker-2.2.3/data/usage/getpi create mode 100755 lasker-2.2.3/data/usage/ginfo create mode 100755 lasker-2.2.3/data/usage/goboard create mode 100755 lasker-2.2.3/data/usage/handles create mode 100755 lasker-2.2.3/data/usage/hbest create mode 100755 lasker-2.2.3/data/usage/help create mode 100755 lasker-2.2.3/data/usage/hideinfo create mode 100755 lasker-2.2.3/data/usage/history create mode 100755 lasker-2.2.3/data/usage/hrank create mode 100755 lasker-2.2.3/data/usage/inchannel create mode 100755 lasker-2.2.3/data/usage/info create mode 100644 lasker-2.2.3/data/usage/iset create mode 100755 lasker-2.2.3/data/usage/it create mode 100755 lasker-2.2.3/data/usage/jkill create mode 100755 lasker-2.2.3/data/usage/journal create mode 100755 lasker-2.2.3/data/usage/jsave create mode 100755 lasker-2.2.3/data/usage/kibitz create mode 100755 lasker-2.2.3/data/usage/limits create mode 100755 lasker-2.2.3/data/usage/llogons create mode 100755 lasker-2.2.3/data/usage/logons create mode 100644 lasker-2.2.3/data/usage/ltell create mode 100755 lasker-2.2.3/data/usage/mailhelp create mode 100755 lasker-2.2.3/data/usage/mailmess create mode 100755 lasker-2.2.3/data/usage/mailmoves create mode 100755 lasker-2.2.3/data/usage/mailoldmoves create mode 100755 lasker-2.2.3/data/usage/mailstored create mode 100755 lasker-2.2.3/data/usage/match create mode 100755 lasker-2.2.3/data/usage/messages create mode 100755 lasker-2.2.3/data/usage/mexamine create mode 100755 lasker-2.2.3/data/usage/moretime create mode 100755 lasker-2.2.3/data/usage/moves create mode 100755 lasker-2.2.3/data/usage/news create mode 100755 lasker-2.2.3/data/usage/next create mode 100755 lasker-2.2.3/data/usage/nuke create mode 100755 lasker-2.2.3/data/usage/observe create mode 100755 lasker-2.2.3/data/usage/oldmoves create mode 100755 lasker-2.2.3/data/usage/oldpstat create mode 100755 lasker-2.2.3/data/usage/open create mode 100755 lasker-2.2.3/data/usage/partner create mode 100755 lasker-2.2.3/data/usage/password create mode 100755 lasker-2.2.3/data/usage/pause create mode 100755 lasker-2.2.3/data/usage/pending create mode 100755 lasker-2.2.3/data/usage/pfollow create mode 100755 lasker-2.2.3/data/usage/play create mode 100755 lasker-2.2.3/data/usage/pobserve create mode 100755 lasker-2.2.3/data/usage/pose create mode 100755 lasker-2.2.3/data/usage/prefresh create mode 100755 lasker-2.2.3/data/usage/primary create mode 100755 lasker-2.2.3/data/usage/promote create mode 100644 lasker-2.2.3/data/usage/pstat create mode 100755 lasker-2.2.3/data/usage/ptell create mode 100755 lasker-2.2.3/data/usage/ptime create mode 100644 lasker-2.2.3/data/usage/qtell create mode 100755 lasker-2.2.3/data/usage/quit create mode 100755 lasker-2.2.3/data/usage/quota create mode 100755 lasker-2.2.3/data/usage/raisedead create mode 100755 lasker-2.2.3/data/usage/rank create mode 100755 lasker-2.2.3/data/usage/refresh create mode 100755 lasker-2.2.3/data/usage/rematch create mode 100755 lasker-2.2.3/data/usage/remplayer create mode 100755 lasker-2.2.3/data/usage/rerank create mode 100755 lasker-2.2.3/data/usage/resign create mode 100755 lasker-2.2.3/data/usage/resume create mode 100755 lasker-2.2.3/data/usage/revert create mode 100644 lasker-2.2.3/data/usage/rmatch create mode 100755 lasker-2.2.3/data/usage/say create mode 100755 lasker-2.2.3/data/usage/seek create mode 100755 lasker-2.2.3/data/usage/set create mode 100755 lasker-2.2.3/data/usage/shout create mode 100755 lasker-2.2.3/data/usage/showcomment create mode 100755 lasker-2.2.3/data/usage/showlist create mode 100755 lasker-2.2.3/data/usage/shutdown create mode 100755 lasker-2.2.3/data/usage/simabort create mode 100755 lasker-2.2.3/data/usage/simadjourn create mode 100755 lasker-2.2.3/data/usage/simallabort create mode 100755 lasker-2.2.3/data/usage/simalladjourn create mode 100755 lasker-2.2.3/data/usage/simgames create mode 100755 lasker-2.2.3/data/usage/simmatch create mode 100755 lasker-2.2.3/data/usage/simnext create mode 100755 lasker-2.2.3/data/usage/simopen create mode 100755 lasker-2.2.3/data/usage/simpass create mode 100755 lasker-2.2.3/data/usage/simprev create mode 100755 lasker-2.2.3/data/usage/smoves create mode 100755 lasker-2.2.3/data/usage/smposition create mode 100755 lasker-2.2.3/data/usage/sought create mode 100755 lasker-2.2.3/data/usage/sposition create mode 100755 lasker-2.2.3/data/usage/statistics create mode 100755 lasker-2.2.3/data/usage/stored create mode 100755 lasker-2.2.3/data/usage/style create mode 100755 lasker-2.2.3/data/usage/sublist create mode 100755 lasker-2.2.3/data/usage/summon create mode 100755 lasker-2.2.3/data/usage/switch create mode 100755 lasker-2.2.3/data/usage/takeback create mode 100755 lasker-2.2.3/data/usage/tell create mode 100755 lasker-2.2.3/data/usage/time create mode 100644 lasker-2.2.3/data/usage/toggle create mode 100755 lasker-2.2.3/data/usage/tomove create mode 100644 lasker-2.2.3/data/usage/tournset create mode 100755 lasker-2.2.3/data/usage/unalias create mode 100755 lasker-2.2.3/data/usage/unexamine create mode 100755 lasker-2.2.3/data/usage/unobserve create mode 100755 lasker-2.2.3/data/usage/unpause create mode 100755 lasker-2.2.3/data/usage/unseek create mode 100755 lasker-2.2.3/data/usage/uptime create mode 100755 lasker-2.2.3/data/usage/ustat create mode 100755 lasker-2.2.3/data/usage/variables create mode 100755 lasker-2.2.3/data/usage/whenshut create mode 100755 lasker-2.2.3/data/usage/whisper create mode 100755 lasker-2.2.3/data/usage/who create mode 100755 lasker-2.2.3/data/usage/withdraw create mode 100755 lasker-2.2.3/data/usage/wname create mode 100755 lasker-2.2.3/data/usage/xkibitz create mode 100755 lasker-2.2.3/data/usage/xtell create mode 100755 lasker-2.2.3/data/usage/xwhisper create mode 100755 lasker-2.2.3/data/usage/znotify create mode 100644 lasker-2.2.3/doc/CREDITS create mode 100644 lasker-2.2.3/doc/CVS/Entries create mode 100644 lasker-2.2.3/doc/CVS/Repository create mode 100644 lasker-2.2.3/doc/CVS/Root create mode 100644 lasker-2.2.3/doc/Changelog create mode 100644 lasker-2.2.3/doc/README_LEGAL create mode 100644 lasker-2.2.3/doc/README_Nash create mode 100644 lasker-2.2.3/games/CVS/Entries create mode 100644 lasker-2.2.3/games/CVS/Repository create mode 100644 lasker-2.2.3/games/CVS/Root create mode 100644 lasker-2.2.3/games/history/CVS/Entries create mode 100644 lasker-2.2.3/games/history/CVS/Repository create mode 100644 lasker-2.2.3/games/history/CVS/Root create mode 100644 lasker-2.2.3/scripts/CVS/Entries create mode 100644 lasker-2.2.3/scripts/CVS/Repository create mode 100644 lasker-2.2.3/scripts/CVS/Root create mode 100755 lasker-2.2.3/scripts/spool_sendmail create mode 100755 lasker-2.2.3/scripts/start_chessd create mode 100644 lasker-2.2.3/src/.cvsignore create mode 100644 lasker-2.2.3/src/CVS/Entries create mode 100644 lasker-2.2.3/src/CVS/Repository create mode 100644 lasker-2.2.3/src/CVS/Root create mode 100644 lasker-2.2.3/src/Makefile.in create mode 100644 lasker-2.2.3/src/acconfig.h create mode 100644 lasker-2.2.3/src/adminproc.c create mode 100644 lasker-2.2.3/src/algcheck.c create mode 100644 lasker-2.2.3/src/autoconfig.h.in create mode 100644 lasker-2.2.3/src/board.c create mode 100644 lasker-2.2.3/src/board.h create mode 100644 lasker-2.2.3/src/command.c create mode 100644 lasker-2.2.3/src/command.h create mode 100644 lasker-2.2.3/src/command_list.h create mode 100644 lasker-2.2.3/src/common.h create mode 100644 lasker-2.2.3/src/comproc.c create mode 100644 lasker-2.2.3/src/comproc.h create mode 100644 lasker-2.2.3/src/config.c create mode 100644 lasker-2.2.3/src/config.h create mode 100755 lasker-2.2.3/src/configure create mode 100644 lasker-2.2.3/src/configure.in create mode 100644 lasker-2.2.3/src/crypt-md5.c create mode 100644 lasker-2.2.3/src/crypt-md5c.c create mode 100644 lasker-2.2.3/src/crypt-misc.c create mode 100644 lasker-2.2.3/src/crypt.c create mode 100644 lasker-2.2.3/src/eco.c create mode 100644 lasker-2.2.3/src/fics_addplayer.c create mode 100644 lasker-2.2.3/src/ficsmain.c create mode 100644 lasker-2.2.3/src/ficsmain.h create mode 100755 lasker-2.2.3/src/findstatic.pl create mode 100644 lasker-2.2.3/src/follow.c create mode 100644 lasker-2.2.3/src/formula.c create mode 100644 lasker-2.2.3/src/formula.h create mode 100644 lasker-2.2.3/src/gamedb.c create mode 100644 lasker-2.2.3/src/gamedb.h create mode 100644 lasker-2.2.3/src/gamedb_old.c create mode 100644 lasker-2.2.3/src/gameproc.c create mode 100644 lasker-2.2.3/src/gameproc.h create mode 100644 lasker-2.2.3/src/gics.c create mode 100644 lasker-2.2.3/src/gics.h create mode 100644 lasker-2.2.3/src/globals.h create mode 100644 lasker-2.2.3/src/help.c create mode 100644 lasker-2.2.3/src/includes.h create mode 100755 lasker-2.2.3/src/install-sh create mode 100644 lasker-2.2.3/src/iset.c create mode 100644 lasker-2.2.3/src/iset.h create mode 100644 lasker-2.2.3/src/journal.h create mode 100644 lasker-2.2.3/src/lists.c create mode 100644 lasker-2.2.3/src/lists.h create mode 100644 lasker-2.2.3/src/makerank.c create mode 100644 lasker-2.2.3/src/malloc.c create mode 100644 lasker-2.2.3/src/malloc.h create mode 100644 lasker-2.2.3/src/matchproc.c create mode 100644 lasker-2.2.3/src/matchproc.h create mode 100644 lasker-2.2.3/src/md5.h create mode 100644 lasker-2.2.3/src/mkproto.awk create mode 100644 lasker-2.2.3/src/movecheck.c create mode 100644 lasker-2.2.3/src/movecheck.h create mode 100644 lasker-2.2.3/src/multicol.c create mode 100644 lasker-2.2.3/src/multicol.h create mode 100644 lasker-2.2.3/src/network.c create mode 100644 lasker-2.2.3/src/network.h create mode 100644 lasker-2.2.3/src/news.c create mode 100644 lasker-2.2.3/src/news.h create mode 100755 lasker-2.2.3/src/newvers.sh create mode 100644 lasker-2.2.3/src/obsproc.c create mode 100644 lasker-2.2.3/src/obsproc.h create mode 100644 lasker-2.2.3/src/parsers/.cvsignore create mode 100644 lasker-2.2.3/src/parsers/CVS/Entries create mode 100644 lasker-2.2.3/src/parsers/CVS/Repository create mode 100644 lasker-2.2.3/src/parsers/CVS/Root create mode 100644 lasker-2.2.3/src/parsers/README create mode 100644 lasker-2.2.3/src/parsers/genparser.c create mode 100644 lasker-2.2.3/src/parsers/genparser.h create mode 100755 lasker-2.2.3/src/parsers/genstruct.pl create mode 100644 lasker-2.2.3/src/parsers/parser.c create mode 100644 lasker-2.2.3/src/pending.c create mode 100644 lasker-2.2.3/src/pending.h create mode 100644 lasker-2.2.3/src/playerdb.c create mode 100644 lasker-2.2.3/src/playerdb.h create mode 100644 lasker-2.2.3/src/playerdb_old.c create mode 100644 lasker-2.2.3/src/ratings.c create mode 100644 lasker-2.2.3/src/ratings.h create mode 100644 lasker-2.2.3/src/reload.c create mode 100755 lasker-2.2.3/src/seekproc.c create mode 100644 lasker-2.2.3/src/setup.c create mode 100644 lasker-2.2.3/src/shutdown.c create mode 100644 lasker-2.2.3/src/talkproc.c create mode 100644 lasker-2.2.3/src/talkproc.h create mode 100644 lasker-2.2.3/src/tdb/CVS/Entries create mode 100644 lasker-2.2.3/src/tdb/CVS/Repository create mode 100644 lasker-2.2.3/src/tdb/CVS/Root create mode 100644 lasker-2.2.3/src/tdb/spinlock.c create mode 100644 lasker-2.2.3/src/tdb/spinlock.h create mode 100644 lasker-2.2.3/src/tdb/tdb.c create mode 100644 lasker-2.2.3/src/tdb/tdb.h create mode 100644 lasker-2.2.3/src/timeseal.c create mode 100644 lasker-2.2.3/src/utils.c create mode 100644 lasker-2.2.3/src/utils.h create mode 100644 lasker-2.2.3/src/variable.c create mode 100644 lasker-2.2.3/src/variable.h create mode 100644 lasker-2.2.3/src/vers.h create mode 100644 lasker-2.2.3/testplay/CVS/Entries create mode 100644 lasker-2.2.3/testplay/CVS/Repository create mode 100644 lasker-2.2.3/testplay/CVS/Root create mode 100755 lasker-2.2.3/testplay/play2.pl create mode 100644 lasker-2.2.3/tests/CVS/Entries create mode 100644 lasker-2.2.3/tests/CVS/Repository create mode 100644 lasker-2.2.3/tests/CVS/Root create mode 100755 lasker-2.2.3/tests/setup.exp create mode 100755 lasker-2.2.3/tests/test1.exp create mode 100644 lasker-2.2.3/timeseal/CVS/Entries create mode 100644 lasker-2.2.3/timeseal/CVS/Repository create mode 100644 lasker-2.2.3/timeseal/CVS/Root create mode 100644 lasker-2.2.3/timeseal/README create mode 100755 lasker-2.2.3/timeseal/timeseal_decoder-Linux-ELF-2.4 create mode 100644 lasker-2.2.3/web/CVS/Entries create mode 100644 lasker-2.2.3/web/CVS/Repository create mode 100644 lasker-2.2.3/web/CVS/Root create mode 100644 lasker-2.2.3/web/index.html diff --git a/lasker-2.2.3/COPYING b/lasker-2.2.3/COPYING new file mode 100644 index 0000000..a43ea21 --- /dev/null +++ b/lasker-2.2.3/COPYING @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 675 Mass Ave, Cambridge, MA 02139, USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + Appendix: How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) 19yy + + 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., 675 Mass Ave, Cambridge, MA 02139, USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) 19yy name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/lasker-2.2.3/CVS/Entries b/lasker-2.2.3/CVS/Entries new file mode 100644 index 0000000..64fe199 --- /dev/null +++ b/lasker-2.2.3/CVS/Entries @@ -0,0 +1,12 @@ +/COPYING/1.2/Wed Jun 12 01:03:49 2002// +/README/1.3/Thu Jun 13 04:19:09 2002// +D/data//// +D/doc//// +D/scripts//// +D/src//// +D/timeseal//// +D/web//// +D/tests//// +D/bots//// +D/games//// +D/testplay//// diff --git a/lasker-2.2.3/CVS/Repository b/lasker-2.2.3/CVS/Repository new file mode 100644 index 0000000..ab59128 --- /dev/null +++ b/lasker-2.2.3/CVS/Repository @@ -0,0 +1 @@ +lasker diff --git a/lasker-2.2.3/CVS/Root b/lasker-2.2.3/CVS/Root new file mode 100644 index 0000000..c42ba94 --- /dev/null +++ b/lasker-2.2.3/CVS/Root @@ -0,0 +1 @@ +/home/cvs diff --git a/lasker-2.2.3/README b/lasker-2.2.3/README new file mode 100644 index 0000000..7fad5ae --- /dev/null +++ b/lasker-2.2.3/README @@ -0,0 +1,168 @@ +Introduction +------------ + +This is an enhanced version of the 'lasker' internet chess server. I +started to enhance Lasker when I needed a working chess server for a +local school. You can get the original 'lasker' release from +http://chessd.sourceforge.net/ and you can get my enhanced version +from http://chess.samba.org/ + +Here is a list of some of the new features in this version: + + - lots and lots of bugs fixed + - timeseal support added (see timeseal/README for details) + - server configuration via 'aconfig' command instead of config.h + - added multi-part command parsing (commands separated by ';') + - enhanced aliases + - build/install process fixed + - fixed help system + - transparent server reload (upgrade without disturbing connections or games) + + +Installation +------------ + +First you need to configure and compile the chessd server. Do +something like the following: + + cd src + ./configure --prefix=/usr/local + make + +Then to install the server run "make install". That will install a +basic skeleton installation in /usr/local/chessd. + +Setting up +---------- + +Next you will want to launch your chess server using the command: + bin/chessd -f -p 5000 +while in the chessd/ directory. This will launch the chess server +using the skeleton data you installed above. + +I highly recommend creating a separate account on your machine to run +the chess daemon. This user should own all files in the chessd +directory. + +After you launch chessd for the first time you will need to login as +the special user 'admin'. That username will be recognised as the +server administrator and you will be logged in with the rather unusual +combination of a head administrator who is also an unregistered +player. + +The first thing you will want to do as the admin user is create a +proper 'admin' account with a password. Use the command 'addplayer' +while logged in as the admin user to create the admin account. You +will be told the password. Then you should immediately logout and log +back in using the admin password you have just been given. You will +probably want to change this password using the 'asetpass' command. + +You may also find the following commands useful: + ahelp addplayer + ahelp asetpass + ahelp commands + + +Securing your server +-------------------- + +The source code for this chess server has been hacked on by dozens of +people over the years. It almost certainly has exploitable buffer +overruns or other security holes. If you are like me then you won't +like the idea of running an insecure program like that on your server. + +To make it a lot more secure you can choose to run the chess server in +a chroot jail. This makes it much harder for an attacker to gain a +foothold on your server. It won't prevent them from crashing the +chessd process but it will prevent them from gaining access to other +parts of the system. + +To run chessd in a chroot jail you need to do the following: + + 1) chessd needs to be setuid root. I know this sounds bizarre, but + it needs root privileges to use the chroot() system + call. Immediately after the chroot chessd will permanently lose + its root privileges and instead become the user that launched + chessd. To make chessd setuid root do this as root: + chown root chessd + chmod u+s chessd + + 2) pass the command line option -R to tell chessd that it should + chroot to the current directory. So to launch chessd you can use + this: + chessd -p 5000 -T /usr/local/bin/timeseal_decoder -R /usr/local/chessd + + You may also like to look at the start_chessd script in the + scripts directory. This is the script I use to keep chessd + always running on my machine. + +If you do use the -R option then I also recommend that you don't place +any of the chess server binaries (or any other binaries or libraries) +inside the chessd directory. That will increase the security of your +server a little. + + +Email spool +----------- + +This chess server does not send emails directly, instead it puts +outgoing emails in the spool/ directory and waits for some external +program or script to deliver them. I designed it this way as it makes +it possible to send email from a chess server in a chroot jail, and +offers more flexibility in how email is handled (as that tends to vary +a lot between systems). + +If you run sendmail then the sample script in scripts/spool_sendmail +might be good enough. Just run this script at startup and it will send +all spooled mail every minute. + + +Server reload +------------- + +This version of chessd supports reloading the server code without +having to shutdown the server or disturb any games that are in +progress. This allows for on the fly upgrades, hopefully without the +users even noticing that the system is being upgraded. + +In order to support this functionality I had to make the source code +rather more Linux specific than it was previously, but I think that is +worth it for the functionality. It would be possible to port the code +to many other platforms, but I have not yet done so. + +To reload the server use the command 'areload'. You must be at the +ADMIN_GOD admin level to issue this command. + +Updates +------- + +Updates will be available on http://chess.samba.org/ + +You may wish to use the cvs version to enable you to update more +easily. I will only be doing tar ball releases occasionally. + +License +------- + +This chess server release is under the GNU General Public License, +which is the license used by the original chess server written by +Richard Nash. Various parts of the server are under different +licenses, depending on who wrote what part, but I believe that all of +the licenses are compatible with the GPL. + +The reason I chose the GPL for this release is that I don't want this +code to become proprietary again. This has happened at least 3 times +in the past with this source code and while I'm sure there were very +good reasons at the time, it does mean that the freely available chess +servers have not benefited from the considerable development that has +happened over the past seven years. + +I also chose the GPL because it allows me to incorporate source code +from other GPLd projects. This saved me quite a lot of time, and is +sure to be useful again. + + +-------------------------------- +Andrew Tridgell +tridge@chess.samba.org June 2002 +-------------------------------- diff --git a/lasker-2.2.3/bots/CVS/Entries b/lasker-2.2.3/bots/CVS/Entries new file mode 100644 index 0000000..e8df309 --- /dev/null +++ b/lasker-2.2.3/bots/CVS/Entries @@ -0,0 +1 @@ +D/mamer//// diff --git a/lasker-2.2.3/bots/CVS/Repository b/lasker-2.2.3/bots/CVS/Repository new file mode 100644 index 0000000..99f0fee --- /dev/null +++ b/lasker-2.2.3/bots/CVS/Repository @@ -0,0 +1 @@ +lasker/bots diff --git a/lasker-2.2.3/bots/CVS/Root b/lasker-2.2.3/bots/CVS/Root new file mode 100644 index 0000000..c42ba94 --- /dev/null +++ b/lasker-2.2.3/bots/CVS/Root @@ -0,0 +1 @@ +/home/cvs diff --git a/lasker-2.2.3/bots/mamer/CVS/Entries b/lasker-2.2.3/bots/mamer/CVS/Entries new file mode 100644 index 0000000..b3af5b5 --- /dev/null +++ b/lasker-2.2.3/bots/mamer/CVS/Entries @@ -0,0 +1,34 @@ +/Command.cc/1.9/Tue Jul 2 00:05:19 2002// +/Command.hh/1.5/Thu Sep 10 19:58:31 1998// +/CommandEntry.cc/1.15/Tue Jul 2 00:05:19 2002// +/CommandEntry.hh/1.11/Thu Sep 10 19:58:31 1998// +/Game.cc/1.4/Tue Jul 2 00:05:19 2002// +/Game.hh/1.5/Tue Jul 2 00:05:19 2002// +/Makefile/1.8/Fri Sep 11 15:47:50 1998// +/Mamer.cc/1.19/Tue Jul 2 00:05:19 2002// +/Mamer.hh/1.13/Tue Jul 2 00:05:19 2002// +/Player.cc/1.4/Thu Sep 10 19:57:17 1998// +/Player.hh/1.4/Tue Jul 2 00:02:40 2002// +/Storage.cc/1.1/Thu Sep 10 19:57:17 1998// +/Storage.hh/1.1/Thu Sep 10 19:58:41 1998// +/Tourney.cc/1.12/Tue Jul 2 00:02:40 2002// +/Tourney.hh/1.12/Tue Jul 2 00:02:40 2002// +/TourneyParameters.cc/1.2/Thu Sep 10 19:57:17 1998// +/TourneyParameters.hh/1.3/Thu Sep 10 19:58:41 1998// +/TourneyPlayers.cc/1.7/Thu Sep 10 19:57:17 1998// +/TourneyPlayers.hh/1.6/Thu Sep 10 19:58:41 1998// +/User.cc/1.10/Thu Sep 10 19:57:17 1998// +/User.hh/1.8/Thu Sep 10 19:58:41 1998// +/command_list.h/1.2/Wed Oct 8 21:03:08 1997// +/config.h/1.5/Thu Sep 10 19:58:20 1998// +/link.cc/1.5/Thu Sep 10 19:57:17 1998// +/link.hh/1.2/Wed Apr 15 16:56:34 1998// +/linklist.hh/1.3/Thu Sep 10 19:58:41 1998// +/main.cc/1.4/Thu Sep 10 19:57:17 1998// +/mamer.config/1.1/Thu Sep 10 19:59:41 1998// +/types.h/1.11/Thu Sep 10 19:58:20 1998// +D/bin//// +D/data//// +D/help//// +D/logs//// +D/template//// diff --git a/lasker-2.2.3/bots/mamer/CVS/Repository b/lasker-2.2.3/bots/mamer/CVS/Repository new file mode 100644 index 0000000..d93f63a --- /dev/null +++ b/lasker-2.2.3/bots/mamer/CVS/Repository @@ -0,0 +1 @@ +lasker/bots/mamer diff --git a/lasker-2.2.3/bots/mamer/CVS/Root b/lasker-2.2.3/bots/mamer/CVS/Root new file mode 100644 index 0000000..c42ba94 --- /dev/null +++ b/lasker-2.2.3/bots/mamer/CVS/Root @@ -0,0 +1 @@ +/home/cvs diff --git a/lasker-2.2.3/bots/mamer/Command.cc b/lasker-2.2.3/bots/mamer/Command.cc new file mode 100644 index 0000000..62f0b00 --- /dev/null +++ b/lasker-2.2.3/bots/mamer/Command.cc @@ -0,0 +1,156 @@ +//-------------------------------------------------------------------------- +// Command.cc - Source file for the Command class +// +// Matthew E. Moses +// +// $Revision: 1.9 $ +// $Date: 2002/07/02 00:05:19 $ +// +// $Author: tridge $ +// $Locker: $ +// +// $Log: Command.cc,v $ +// Revision 1.9 2002/07/02 00:05:19 tridge +// got rid of a bunch of RCS tags now that its in CVS +// +// Revision 1.8 1998/09/10 19:57:17 mlong +// lots of little bug fixes and a few new features +// +// Revision 1.7 1998/04/15 16:56:17 mlong +// *** empty log message *** +// +// Revision 1.6 1998/02/12 18:43:26 mlong +// *** empty log message *** +// +// Revision 1.5 1997/05/15 18:27:53 chess +// added pending and TourneyPlayers support +// added HandleGetPlayerInfo & HandleGetGameInfo +// +// Revision 1.4 1997/04/13 03:14:35 chess +// command class changed to have a parameter list. +// +// Revision 1.3 1997/04/07 22:21:49 chess +// *** empty log message *** +// +// Revision 1.2 1996/10/03 18:11:10 moses +// made sure string are null termindated +// +// Revision 1.1 1996/10/01 20:14:43 moses +// Initial revision +// +// +//-------------------------------------------------------------------------- + +#include "Command.hh" + +//- constructor ----------------------------------------------------------- +Command::Command() { + name = alias = description = NULL; + managerLevel = USER; + userFunction = 0; + tournFunction = 0; +} //- End of constructor + +Command::Command(char *n, char *a, ranks m, char *d, char *paramTypeList, USERFP u) { + name = new char[strlen(n)+1]; + + if(NULL == name) return; + memset(name, '\0', strlen(n)); + strncpy(name, n, strlen(n)); + name[strlen(n)] = '\0'; + + memset(parameterList, '\0', MAXNUMPARAMS); + strncpy(parameterList, paramTypeList, strlen(paramTypeList)); + parameterList[strlen(paramTypeList)] = '\0'; + + alias = new char[strlen(a)+1]; + if(NULL == alias) return; + memset(alias, '\0', strlen(a)); + strncpy(alias, a, strlen(a)); + alias[strlen(a)] = '\0'; + + managerLevel = m; + + description = new char[strlen(d)+1]; + if(NULL == description) return; + memset(description, '\0', strlen(d)); + strncpy(description, d, strlen(d)); + description[strlen(d)] = '\0'; + + userFunction = u; +} //- End of constructor + +Command::Command(char *n, char *a, ranks m, char *d, char *paramTypeList, TOURNFP t) { + name = new char[strlen(n)+1]; + if(NULL == name) return; + memset(name, '\0', strlen(n)); + strncpy(name, n, strlen(n)); + name[strlen(n)] = '\0'; + + memset(parameterList, '\0', MAXNUMPARAMS); + strncpy(parameterList, paramTypeList, strlen(paramTypeList)); + parameterList[strlen(paramTypeList)] = '\0'; + + alias = new char[strlen(a)+1]; + if(NULL == alias) return; + memset(alias, '\0', strlen(a)); + strncpy(alias, a, strlen(a)); + alias[strlen(a)] = '\0'; + + managerLevel = m; + + description = new char[strlen(d)+1]; + if(NULL == description) return; + memset(description, '\0', strlen(d)); + strncpy(description, d, strlen(d)); + description[strlen(d)] = '\0'; + + tournFunction = t; +} //- End of constructor + +//- deconstructor --------------------------------------------------------- +Command::~Command() { + if(NULL != name) + delete [] name; + + if(NULL != alias) + delete [] alias; + + if(NULL != description) + delete [] description; +} //- End of deconstructor + +//- IsCommand ------------------------------------------------------ +int Command::IsCommand(char *comm) { + int length = strlen(comm); + if((0 == strncasecmp(comm, name, MIN(length, (int)strlen(name)))) || + (0 == strncasecmp(comm, alias, MIN(length, (int)strlen(alias))))) + return(1); + + return(0); +} //- End of IsCommand + +//- GetCommandName ------------------------------------------------ +char *Command::GetCommandName() { + return name; +} //- End of GetCommandName + +//- GetCommandDescription ------------------------------------------------ +char *Command::GetCommandDescription() { + return description; +} //- End of GetCommandDescription + +//- GetCommandAlias ------------------------------------------------ +char *Command::GetCommandAlias() { + return alias; +} //- End of GetCommandAlias + +//- GetManagerLevel ----------------------------------------------- +ranks Command::GetManagerLevel() { + return managerLevel; +} //- End of GetManagerLevel + +//- SetManagerLevel ----------------------------------------------- +void Command::SetManagerLevel(ranks newvalue) { + managerLevel = newvalue; +} //- end of SetManagerLevel diff --git a/lasker-2.2.3/bots/mamer/Command.hh b/lasker-2.2.3/bots/mamer/Command.hh new file mode 100644 index 0000000..4312d93 --- /dev/null +++ b/lasker-2.2.3/bots/mamer/Command.hh @@ -0,0 +1,77 @@ +//-------------------------------------------------------------------------- +// Command.hh - Class header for the Command class +// +// Matthew E. Moses +// +// $Revision: 1.5 $ +// $Date: 1998/09/10 19:58:31 $ +// +// $Author: mlong $ +// $Locker: $ +// +// $Log: Command.hh,v $ +// Revision 1.5 1998/09/10 19:58:31 mlong +// *** empty log message *** +// +// Revision 1.4 1997/05/15 18:29:12 chess +// added pending and TourneyPlayers support +// added HandleGetPlayerInfo & HandleGetGameInfo +// +// Revision 1.3 1997/04/13 03:21:32 chess +// constructor changed to accomodate the params list +// +// Revision 1.2 1997/04/07 22:21:43 chess +// *** empty log message *** +// +// Revision 1.1 1996/10/01 20:14:43 moses +// Initial revision +// +// +//-------------------------------------------------------------------------- + +#ifndef _COMMAND_ +#define _COMMAND_ + +extern "C" { + #include + #include +} + +#include "link.hh" +#include "types.h" +#include "User.hh" + +class Command : public Link { +public: + Command(); + Command(char *, char *, ranks, char *, char *, USERFP); + Command(char *, char *, ranks, char *, char *, TOURNFP); + ~Command(); + + int IsCommand(char *); + ranks GetManagerLevel(); + void SetManagerLevel(ranks); + char *GetCommandName(); + char *GetCommandAlias(); + char *GetCommandDescription(); + + private: + + public: + USERFP userFunction; + TOURNFP tournFunction; + + char parameterList[MAXNUMPARAMS]; + param_list params; + reasons badUsage; + + private: + char *name; + char *alias; + + ranks managerLevel; + char *description; + +}; + +#endif diff --git a/lasker-2.2.3/bots/mamer/CommandEntry.cc b/lasker-2.2.3/bots/mamer/CommandEntry.cc new file mode 100644 index 0000000..c9b25f0 --- /dev/null +++ b/lasker-2.2.3/bots/mamer/CommandEntry.cc @@ -0,0 +1,1148 @@ +//-------------------------------------------------------------------------- +// CommandEntry.cc - Source file for the CommandEntry +// +// Matthew E. Moses & Michael A. Long +// +// $Log: CommandEntry.cc,v $ +// Revision 1.15 2002/07/02 00:05:19 tridge +// got rid of a bunch of RCS tags now that its in CVS +// +// Revision 1.14 2002/07/02 00:02:40 tridge +// - fixed compile on g++ 2.96 +// - updated for lasker 'rmatch' +// +// Revision 1.13 1998/09/10 19:57:17 mlong +// lots of little bug fixes and a few new features +// +// Revision 1.12 1998/06/18 18:41:30 mlong +// prepairing for yet another move. +// +// Revision 1.11 1998/06/08 20:41:17 mlong +// changes to the list tournies function +// +// Revision 1.10 1998/04/29 15:23:19 mlong +// prepairing for the move to daimi +// new sorting routine. +// +// Revision 1.9 1998/04/18 18:46:04 mlong +// fixed delete bug & +// added delete tourney function +// +// Revision 1.5 1997/10/08 21:03:35 chess +// preparing for move to oracle machine at eworks. +// +// Revision 1.4 1997/05/15 18:27:53 chess +// added Player and TourneyPlayers support +// added HandleGetPlayerInfo & HandleGetGameInfo +// +// Revision 1.3 1997/04/13 03:14:35 chess +// commands to do user statistic manipulationn added: +// setinfo - sets a whole line of information +// setstat - sets a particular stat +// addabuse - adds (or deletes) abuse points. +// +// Revision 1.2 1997/03/21 15:32:36 moses +// added the shutdown command. +// +// Revision 1.1 1996/10/01 20:14:43 moses +// Initial revision +// +//-------------------------------------------------------------------------- + +#include "CommandEntry.hh" +#include "Mamer.hh" + +extern Mamer gMamer; + +//- AddAbuse ------------------------------------------------------- +int CommandEntry::AddAbuse(User *user, param_list params) { + User *u = NULL; + char name[MAX_WORD_SIZE]; + int needToDelete=0; + + if(params[0].type == TYPE_WORD) { + strcpy(name, params[0].val.word); + } + + u = gMamer.FindUser(name); + if(u == NULL) { + u = new User(); + u->LoadPlayer(gMamer.userFilePath, name); // Loads the player info into memory and saves current info to disk + needToDelete = 1; + } + + if((u->GetManagerLevel() >= user->GetManagerLevel()) && + (user->GetManagerLevel() != PRESIDENT)) { + if(needToDelete) delete u; + gMamer.TellUser(NoPermissions, user->name); + return 0; + } + + if(u != NULL) { + if(params[1].type == TYPE_INT) { + u->AddAbuse(params[1].val.integer); + } else { + u->AddAbuse(10); + } + u->SavePlayer(gMamer.userFilePath); + if(u->GetAbuse() >= MAX_CHAOS_POINTS) + gMamer.XServerCom("%s %s%s", "+ censor", u->name, "\n"); + gMamer.TellUser(ChangedAbuse, user->name, u->name, u->GetAbuse()); + } else { + gMamer.TellUser(NotFound, user->name, name); + } + if(needToDelete) delete u; + + return(1); +} //- End of AddAbuse + +//- FingerUser ------------------------------------------------------- +int CommandEntry::FingerUser(User *user, param_list params) { + User *u = NULL; + int notFound=1; + char name[32]; + + memset(name, '\0', 32); + if(params[0].type == TYPE_WORD) { + strncpy(name, params[0].val.word, MIN(31, (int)strlen(params[0].val.word))); + } else { + strcpy(name, user->name); + } + + u = gMamer.FindUser(name); + if(u != NULL) notFound = 0; + + if(notFound) { + u = new User(); + notFound = u->LoadPlayer(gMamer.userFilePath, name); + notFound = !notFound; + } + if(!notFound) { + gMamer.XServerCom("%s %s %s%s%s", "qtell", user->name, "\\n", u->name, "'s Stats:\\n\\n"); + gMamer.XServerCom("%-17s %5s %4s %4s %3s %3s %3s %3s %5s %6s%-17s %4s %3s %3s %3s %3s %3s %3s %5s %6s", + "Name", " Tnys", " W ", " L ", " D ", "1st", "2nd", "3rd", "Chaos", "Rating\\n", + "-----------------", "-----", "----", "----", "---", "---", "---", "---", "-----","------\\n"); + gMamer.XServerCom("%-17s %5ld %4ld %4ld %3ld %3ld %3ld %3ld %5d %6.2f %s", + u->name, u->GetPlayedTourneys(), u->GetWins(), u->GetLosses(), u->GetDraws(), + u->GetFirsts(), u->GetSeconds(), u->GetThirds(), u->GetAbuse(), u->GetRating(), "\\n"); + if(u->GetManagerLevel() > USER) { + gMamer.XServerCom("%s %d %s %d %s", "\\nManager Level:", u->GetManagerLevel(), + " Managed Tourneys:", u->GetManagedTourneys(), "\\n"); + } + gMamer.XServerCom("%s", "\n"); + } else { + gMamer.TellUser(NotFound, user->name, name); + } + if(notFound) delete u; + + return(1); +} //- End of FingerUser + +//- ListRank ---------------------------------------------------------- +int CommandEntry::ListRank(User *user, param_list params) { + float rating=0; + int start=0, i=0, end=0, tourneys=0, counter=0; + char filename[128], name[32], name2[32]; + FILE *theFile; + + memset(name, '\0', 32); + memset(name2, '\0', 32); + switch (params[0].type) { + case TYPE_WORD: + strcpy(name, params[0].val.word); + break; + case TYPE_INT: + start = params[0].val.integer; + if(start <= 0) {start = 1;} + break; + default: + strcpy(name, user->name); + break; + } + + sprintf(filename, "%s/rank", gMamer.dataFilePath); + if(params[0].type != TYPE_INT) { + if((theFile = fopen(filename, "r"))) { + while(fscanf(theFile, "%s %d %f", name2, &tourneys, &rating) > 0) { + if(!(strncasecmp(name2, name, strlen(name)))) { + start = i+1; + break; + } + i++; + } + fclose(theFile); + } else { + gMamer.TellUser(NotFound, user->name, filename); + return(0); + } + } + if(!(start)) { + gMamer.TellUser(NotFound, user->name, name); + return(1); + } + start = start - 10; + end = start + 20; + if(start <= 0) {start = 1; end = 21;} + gMamer.XServerCom("%s %s %s %s%s %-5s %-18s %5s %6s %5s %-18s %5s %6s", "qtell", user->name, "\\n", gMamer.username, + "'s Rankings:\\n\\n", "Rank", "Name", "Trnys", "Rating\\n", + "-----", "------------------", "-----", "------\n"); + gMamer.XServerCom("%s %s %s", "qtell", user->name, "\\n"); + if(!(theFile = fopen(filename, "r"))) { return(0); } + i = 1; counter = 1; + while(fscanf(theFile, "%s %d %f", name2, &tourneys, &rating) > 0) { + if((i >= start) && (i < end)) { + if(i == start) { counter = 1; } + gMamer.XServerCom(" %-5d %-18s %5d %6.2f\\n", i, name2, tourneys, rating); + if(((counter % 10) == 0) && (counter > 0)) { + gMamer.XServerCom("%s", "\n"); + if(i != (end -1)) { + gMamer.XServerCom("%s %s %s", "qtell", user->name, "\\n"); + } + } + } + if(i > end) { break; } + i++; counter++; + } + fclose(theFile); + + if(i <= end) { gMamer.XServerCom("%s", "\n"); } + + return(1); +} + +//- ListManagers ------------------------------------------------------ +int CommandEntry::ListManagers(User *user, param_list params) { + int i=1, needToDelete=0; + long last; + char filename[256], manager[NAMELEN], date[16]; + User *u=NULL, *newUser = NULL; + struct tm *tmpDate; + FILE *theFile; + + i = params[0].type; // just to get rid of the compiler messages + sprintf(filename, "%s/managers", gMamer.dataFilePath); + if((theFile = fopen(filename, "r"))) { + gMamer.XServerCom("%s %s %s %s%s", "qtell", user->name, "\\n", gMamer.username, "'s Manager List:\\n\\n"); + gMamer.XServerCom("%2s%-18s %3s %4s %-8s%2s%-18s %3s %4s %-8s%s", + "","Name","Lvl","Tnys","Last", "","Name","Lvl","Tnys","Last", "\\n"); + gMamer.XServerCom(" %-18s %3s %4s %-8s%2s%-18s %3s %4s %-8s%s", + "-----------------", "---", "----", "--------", "", + "-----------------", "---", "----", "--------", "", "\\n"); + i=1; + memset(date, '\0', 64); + gMamer.XServerCom("\n%s %s ", "qtell", user->name); + while(fscanf(theFile, "%s", manager) > 0) { + needToDelete = 0; + u = gMamer.FindUser(manager); + if(u == NULL) { + needToDelete = 1; + newUser = new User(); + u = newUser; + } + if(0 != u->LoadPlayer(gMamer.userFilePath, manager)) { + last = u->GetLast(); + if(last) { + tmpDate = localtime(&last); + sprintf(date, "%02d/%02d/%02d", tmpDate->tm_mon+1, tmpDate->tm_mday, tmpDate->tm_year); + } else { + sprintf(date, "none"); + } + } else { + sprintf(date, "%s", "none"); + } + gMamer.XServerCom("%2s%-18s %3d %4d %8s%s", + ((gMamer.UserIsLoaded(manager)) ? "+" : " "), + manager, u->GetManagerLevel(), u->GetManagedTourneys(), date, (i%2)==0 ? "\\n":""); + if(((i % 20) == 0) && (i > 0)) { + i = 0; + gMamer.XServerCom("%s %s %s %s", "\n", "qtell", user->name, "\\n"); + } + i++; + if(needToDelete) { + u = NULL; + delete(newUser); + } + } + fclose(theFile); + gMamer.XServerCom("%s", "\n"); + + return(1); + } + gMamer.TellUser(NotFound, user->name, filename); + return(0); +} + +//- LoadedUsers ------------------------------------------------------- +int CommandEntry::LoadedUsers(User *user, param_list params) { + User *u = NULL; + LinkListIter userIter(gMamer.userList); + int i, count=0; + + i = params[0].type; + i = 1; + + gMamer.XServerCom("qtell %s \\nLoaded Users:\\n\\n", user->name); + while((u = userIter.Next())) { + count++; + gMamer.XServerCom(" %18s%s", u->name, (i%3)==0 ? "\\n":""); + if(((i % 30) == 0) && (i > 0)) { + i = 0; + gMamer.XServerCom("%s %s %s %s", "\n", "qtell", user->name, "\\n"); + } + i++; + } + gMamer.XServerCom("%sTotal: %i%s", "\\n", count, "\n"); + + return(1); +} //- End of LoadedUser + +//- SetCommandLevel ---------------------------------------------------- +int CommandEntry::SetCommandLevel(User *user, param_list params) { + Command *c = NULL; + + c = gMamer.FindCommand(params[0].val.word, user->name); + + if(c != NULL) { + if((c->GetManagerLevel() <= user->GetManagerLevel()) && + (params[1].val.integer <= user->GetManagerLevel())) { + c->SetManagerLevel((ranks)params[1].val.integer); + gMamer.TellUser(ChangedCommandLevel, user->name, params[0].val.word, params[1].val.integer); + } else + gMamer.TellUser(NoPermissions, user->name); + } else + return 0; + + return 1; +} + +//- SetInfo ------------------------------------------------------- +int CommandEntry::SetInfo(User *user, param_list params) { + User *u = NULL; + int notFound=1, i; + char name[32]; + + memset(name, '\0', 32); + if(params[0].type == TYPE_WORD) { + strncpy(name, params[0].val.word, MIN(31, (int)strlen(params[0].val.word))); + } + + u = gMamer.FindUser(name); + if(u != NULL) notFound = 0; + + if(notFound) { + u = new User(); + u->LoadPlayer(gMamer.userFilePath, name); + } + + if(u != NULL) { + if((u->GetManagerLevel() >= user->GetManagerLevel()) && + (user->GetManagerLevel() != PRESIDENT)) { + if(notFound) delete u; + gMamer.TellUser(NoPermissions, user->name); + return 0; + } + for(i=1; i<=7; i++) + u->SetStatistic(i, params[i].val.integer); + u->SavePlayer(gMamer.userFilePath); + gMamer.TellUser(ChangedInfo, user->name, u->name); + } else { + gMamer.TellUser(NotFound, user->name, name); + } + if(notFound) delete u; + + return(1); +} //- End of SetInfo + +//- SetManagerLevel ------------------------------------------------------- +int CommandEntry::SetManagerLevel(User *user, param_list params) { + User *u = NULL; + int notFound=1, new_level=1, length=0, i=0; + char name[32]; + + if(params[0].type == TYPE_WORD) { + length = strlen(params[0].val.word); + memset(name, '\0', 32); + while((i < 31) && (i < length)) { + name[i] = tolower(params[0].val.word[i]); + i++; + } + } + new_level = params[1].val.integer; + + u = gMamer.FindUser(name); + if(u != NULL) notFound = 0; + + if(notFound) { + u = new User(); + u->LoadPlayer(gMamer.userFilePath, name); + } + if(((u->GetManagerLevel() >= user->GetManagerLevel()) || + (new_level >= user->GetManagerLevel())) && + (user->GetManagerLevel() != PRESIDENT)) { + if(notFound) delete u; + gMamer.TellUser(NoPermissions, user->name); + return 0; + } + + if(u != NULL) { + u->ChangeManagerLevel(new_level); + u->SavePlayer(gMamer.userFilePath); + gMamer.TellUser(ChangedManagerLevel, user->name, u->name, new_level); + } else { + gMamer.TellUser(NotFound, user->name, name); + } + if(notFound) delete u; + + if(new_level > 0) + return(1); + else + return -1; +} //- End of SetManagerLevel + + +//- SetStat ------------------------------------------------------- +int CommandEntry::SetStat(User *user, param_list params) { + User *u = NULL; + int notFound=1, new_value, i, ret=0, size=0, counter=0; + char which_stat[64], name[32]; + strings statAliases[] = { + {"tourneys", 1}, {"tnys", 1}, + {"wins", 2}, + {"losses", 3}, {"lose", 3}, + {"draws", 4}, + {"firsts", 5}, {"1sts", 5}, + {"seconds", 6}, {"2nds", 6}, + {"thirds", 7}, {"3rds", 7}, + {"abuse", 8}, + {"rating", 9}, + {"managedtourneys", 10}, + {NULL} + }; + + memset(which_stat, '\0', 64); + if(params[0].type == TYPE_WORD) { strcpy(name, params[0].val.word); } + if(params[1].type == TYPE_WORD) { strncpy(which_stat, params[1].val.word, MIN(63, strlen(params[1].val.word))); } + size = strlen(which_stat); + new_value = params[2].val.integer; + + u = gMamer.FindUser(name); + if(u != NULL) notFound = 0; + + if(notFound) { + u = new User(); + u->LoadPlayer(gMamer.userFilePath, name); + } + if(u != NULL) { + if((u->GetManagerLevel() >= user->GetManagerLevel()) && + (user->GetManagerLevel() != PRESIDENT)) { + if(notFound) delete u; + gMamer.TellUser(NoPermissions, user->name); + return 0; + } + i=0; + while(statAliases[i].string != NULL) { + if (!(strncasecmp(statAliases[i].string, which_stat, MIN(size, (int)strlen(statAliases[i].string))))) { + counter++; + if(counter > 1) break; + } + i++; + } + if(counter > 1) { + gMamer.TellUser(CanNotChange, user->name, u->name, which_stat, new_value); + } else if(counter == 0) { + gMamer.TellUser(NotFound, user->name, which_stat); + } else { + i=0; + while(statAliases[i].string != NULL) { + if (!(strncasecmp(statAliases[i].string, which_stat, MIN(size, (int)strlen(statAliases[i].string))))) { + ret = u->SetStatistic(statAliases[i].number, new_value); + memset(which_stat, '\0', 64); + strcpy(which_stat, statAliases[i].string); + break; + } + i++; + } + u->SavePlayer(gMamer.userFilePath); + if(ret) + gMamer.TellUser(ChangedInfo, user->name, u->name, which_stat, new_value); + else + gMamer.TellUser(NotFound, user->name, which_stat); + } + } else { + gMamer.TellUser(NotFound, user->name, name); + } + if(notFound) delete u; + + return(1); +} //- End of SetStat + +//- ShowCommands -------------------------------------------- +int CommandEntry::ShowCommands(User *user, param_list params) { + Command *c = NULL; + LinkListIter commIter(gMamer.commandList); + char *command; + int i; + + if(params[0].type == TYPE_WORD) { + command = params[0].val.word; + while((c = commIter.Next())) if(1 == c->IsCommand(command)) break; + if(c == NULL) { + gMamer.TellUser(NotFound, user->name, command); + return 0; + } + gMamer.XServerCom("qtell %s %s Notes: %-16s | %-5s | %3d | %s \n", + user->name, gMamer.username, c->GetCommandName(), + c->GetCommandAlias(), c->GetManagerLevel(), c->GetCommandDescription()); + return(1); + } + gMamer.XServerCom("qtell %s %s's Command List:\\n\\n", user->name, gMamer.username); + i = 0; + while((c = commIter.Next())) { + gMamer.XServerCom(" %-16s | %-5s | %3d | %s\\n", + c->GetCommandName(), c->GetCommandAlias(), c->GetManagerLevel(), c->GetCommandDescription()); + if((!(i % 9)) && (i > 0)) { + i = 0; + gMamer.XServerCom("%s", "\n"); + gMamer.XServerCom("qtell %s \\n", user->name); + } + i++; + } + gMamer.XServerCom("%s", "\n"); + return(1); +} + +//- ShowHelp ----------------------------------------------- +int CommandEntry::ShowHelp(User *user, param_list params) { + int i=1; + char tmpBuffer[1024], request[128], filename[256]; + FILE *theFile; + + memset(request, '\0', 128); + if(params[0].type == TYPE_WORD) { + strcpy(request, params[0].val.word); + } else { + strcpy(request, "index"); + } + sprintf(filename, "%s/%s", gMamer.helpFilePath, request); + if((theFile = fopen(filename, "r"))) { + gMamer.XServerCom("qtell %s \\nThe %s Help File:\\n\\n", user->name, request); + i=1; + memset(filename, '\0', 256); + while(fgets(filename, 79, theFile)) { /* Just reusing the variable filename could be any char [] */ + memset(tmpBuffer, '\0', 1024); + strcpy(tmpBuffer, gMamer.s_and_r(filename, "\n", "\\n")); + gMamer.XServerCom("%s", tmpBuffer); + if(((i % 10) == 0) && (i > 0)) { + i = 0; + gMamer.XServerCom("\nqtell %s \\n", user->name); + } + i++; + memset(filename, '\0', 256); + } + fclose(theFile); + gMamer.XServerCom("\n"); + + return(1); + } + gMamer.TellUser(NotFound, user->name, request); + return(0); +}//- End of ShowHelp + +//- CreateTourney ------------------------------------------------------------ +int CommandEntry::CreateTourney(User *user, param_list params) { + Tourney *t = NULL; + int num = gMamer.GenerateTourneyNumber(); + + params[0].type = params[0].type; // Just to stop the annoying unused variable messages during compile. + t = new Tourney(num, user, &(gMamer.tourneyParams)); + gMamer.tourneyList.Append(t); + gMamer.XServerCom("%s %s %s %d %s", "xtell", user->name, "Created tourney number: ", t->number, "\n"); + return(1); +}//- End CreateTourney + +//- OpenTourney ------------------------------------------------------------ +int CommandEntry::OpenTourney(User *user, param_list params) { + Tourney *tourn = NULL; + + tourn = gMamer.FindTourney(params[0].val.integer); + if(NULL != tourn) { + if(tourn->Open()) { + tourn->Announce(); + return(1); + } + } + gMamer.TellUser(NotFound, user->name, "tourney"); + return(0); +}//- End OpenTourney + +//- AnnounceTourney ---------------------------------------------------------- +int CommandEntry::AnnounceTourney(User *user, param_list params) { + Tourney *tourn = NULL; + + tourn = gMamer.FindTourney(params[0].val.integer); + if(NULL != tourn) { + if(tourn->GetStatus() == OPEN) { + tourn->Announce(); + return(1); + } else { + gMamer.TellUser(TourneyNotOpen, user->name, params[0].val.integer); + return 0; + } + } else { + gMamer.TellUser(NotFound, user->name, "tourney"); + return(0); + } +}//- AnnounceTourney --------------------------------------------------------- + +//- KeepTourney ------------------------------------------------------------ +int CommandEntry::KeepTourney(User *user, param_list params) { + Tourney *t = NULL; + + t = gMamer.FindTourney(params[0].val.integer); + if(NULL != t) { + if(params[1].type != TYPE_NULL) + if(params[1].type == TYPE_WORD) { + if(strncasecmp("y", params[1].val.word, 1) == 0) { + t->SetPersist(1); + gMamer.TellUser(WillKeepTourney, user->name, params[0].val.integer); + } else { + t->SetPersist(0); + gMamer.TellUser(NotKeepTourney, user->name, params[0].val.integer); + } + } else if(params[1].type == TYPE_INT) { + t->SetPersist(params[1].val.integer); + if(params[1].val.integer) + gMamer.TellUser(WillKeepTourney, user->name, params[0].val.integer); + else + gMamer.TellUser(NotKeepTourney, user->name, params[0].val.integer); + } else { + gMamer.TellUser(NotFound, user->name, "tourney"); + return(0); + } + return(1); + } + + gMamer.TellUser(NotFound, user->name, "tourney"); + return(0); +}//- End KeepTourney + +//- DeleteTourney ------------------------------------------------------------ +int CommandEntry::DeleteTourney(User *user, param_list params) { + Tourney *t = NULL; + TourneyPlayers *tp = NULL; + + t = gMamer.FindTourney(params[0].val.integer); + if(NULL != t) { + if(t->GetStatus() != DONE) { + LinkListIter playerIter(t->playerList); + playerIter.Reset(); + while((tp = playerIter.Next())) { + gMamer.XServerCom("%s %s %d%s", "tournset", tp->name, 0, "\n"); + gMamer.XServerCom("tell %s Tourney#%d has been deleted.%s", tp->name, t->number, "\n"); + } + gMamer.XServerCom("%s %d %s%d %s", "tell", gMamer.channelNumber, + "Tourney #", params[0].val.integer, "has been deleted.\n"); + } + gMamer.tourneyList.Delete(t); // delete the tourney + return(1); + } + + gMamer.TellUser(NotFound, user->name, "tourney"); + return(0); +}//- End DeleteTourney + +//- CloseTourney ------------------------------------------------------------ +int CommandEntry::CloseTourney(User *user, param_list params) { + Tourney *tourn = NULL; + + tourn = gMamer.FindTourney(params[0].val.integer); + if(NULL != tourn) { + if(tourn->GetPlayerCount() >= MINIMUM_PLAYERS) { + if(tourn->GetStatus() == OPEN) { + tourn->CloseAndStart(); + gMamer.XServerCom("qtell %s %s Notes: %s %d %s", + user->name,gMamer.username,"Tourney #", + tourn->number, " is now closed.\n"); + return(1); + } else { + gMamer.TellUser(TourneyNotOpen, user->name, tourn->number); + } + } else { + gMamer.TellUser(NotEnoughPlayers, user->name, tourn->number); + } + } else { + gMamer.TellUser(TourneyNotFound, user->name, params[0].val.integer); + } + + return(0); +}//- End CloseTourney + +int CommandEntry::ListTourneys(User *user, param_list params) { + Tourney *t = NULL; + LinkListIter tournIter(gMamer.tourneyList); + int notourneys = 1, Tstatus=0, i=3; + long stDate, enDate, timeNow; + struct tm *start, *end; + char outStart[128], outEnd[128], outStatus[128]; + + params[0].type = params[0].type; // Just to stop the annoying unused var messages in compile. + while((t = tournIter.Next())) notourneys = 0; + + if(notourneys == 0) { + gMamer.XServerCom("qtell %s %s Notes: \\n", user->name, gMamer.username); + gMamer.XServerCom(" %3s %3s %3s %4s %3s %2s %4s %9s %6s %-14s %-14s\\n", + "No.","Rds","Sty", "Time", "Inc", "Md", "Vrnt", "Rtng Rnge", "Status"," Started at ", " Ended at "); + gMamer.XServerCom(" %3s %3s %3s %4s %3s %2s %4s %9s %6s %-14s %-14s\\n", + "---","---","---", "----", "---", "--", "----", "---------", "------","--------------", "--------------"); + tournIter.Reset(); + while((t = tournIter.Next())) { + stDate = t->GetStartDate(); + enDate = t->GetEndDate(); + Tstatus = t->GetStatus(); + if((Tstatus == DONE) && (t->GetPersist() == 0)){ + timeNow = time(0); + if((timeNow - enDate) > KEEP_TOURNEY_TIME) { + gMamer.tourneyList.Delete(t); + continue; + } + } + if(stDate > 0) { + start = localtime(&stDate); + sprintf(outStart, "%02d:%02d %02d/%02d/%02d", + start->tm_hour, start->tm_min, start->tm_mon+1, start->tm_mday, start->tm_year); + } else { strcpy(outStart, "n/a"); } + if(enDate > 0) { + end = localtime(&enDate); + sprintf(outEnd, "%02d:%02d %02d/%02d/%02d", + end->tm_hour, end->tm_min, end->tm_mon+1, end->tm_mday, end->tm_year); + } else { strcpy(outEnd, "n/a"); } + if(Tstatus == NEW) + sprintf(outStatus, "%s", "new"); + else if(Tstatus == OPEN) + sprintf(outStatus, "%s", "open"); + else if(Tstatus == CLOSED) + sprintf(outStatus, "%s", "closed"); + else if(Tstatus == DONE) + sprintf(outStatus, "%s", "done"); + else + memset(outStatus, '\0', 128); + + gMamer.XServerCom(" %3d %3d %3c %4d %3d %2c %4c %4d-%4d %6s %-14s %-14s\\n", + t->number, t->params.rounds, t->params.style, t->params.time, t->params.inc, + t->params.mode, t->params.variant, t->params.ratingLow, t->params.ratingHigh, + outStatus, outStart, outEnd); + if(((i % 12) == 0) && (i > 0)) { + i = 0; + gMamer.XServerCom("%s %s %s %s", "\n", "qtell", user->name, "\\n"); + } + i++; + } + gMamer.XServerCom("%s", "\n"); + } else { + gMamer.XServerCom("qtell %s %s Notes: %s", user->name, gMamer.username, "No tourneys right now.\n"); + } + + return (1); +} + +//- JoinTourney ------------------------------------------------------------ +int CommandEntry::JoinTourney(User *user, param_list params) { + Tourney *tourn = NULL; + Player *newEntry = NULL; + + tourn = gMamer.FindTourney(params[0].val.integer); + + if(NULL != tourn) { + newEntry = new Player(user->name, params[0].val.integer); + gMamer.pendingList.Append(newEntry); + gMamer.XServerCom("getpi %s%s", user->name, "\n"); + return(1); + } + + gMamer.TellUser(TourneyNotFound, user->name, params[0].val.integer); + return(0); +} + +//- AddToTourney ------------------------------------------------------------ +int CommandEntry::AddToTourney(User *user, param_list params) { + Tourney *tourn = NULL; + Player *newEntry = NULL; + + tourn = gMamer.FindTourney(params[1].val.integer); + + if(NULL != tourn) { + newEntry = new Player(params[0].val.word, params[1].val.integer); + gMamer.pendingList.Append(newEntry); + gMamer.XServerCom("getpi %s%s", params[0].val.word, "\n"); + return(1); + } + + gMamer.TellUser(TourneyNotFound, user->name, params[1].val.integer); + return(0); +} + +//- RemoveFromTourney ------------------------------------------------------------ +int CommandEntry::RemoveFromTourney(User *user, param_list params) { + Tourney *tourn = NULL; + TourneyPlayers *tp=NULL; + char name[NAMELEN], reason[64]; + int num=0; + User *u=NULL; + int chaosPointsEarned=0, needToDelete=0; + + memset(name, '\0', NAMELEN); + memset(reason, '\0', 64); + if(params[0].type == TYPE_INT) { // if we are withdrawing ourselves + tourn = gMamer.FindTourney(params[0].val.integer); + strcpy(name, user->name); + u = user; + num = params[0].val.integer; + strcpy(reason, "withdrew"); + } else { // if a manager is forfeiting us + tourn = gMamer.FindTourney(params[1].val.integer); + strcpy(name, params[0].val.word); + u = gMamer.FindUser(params[0].val.word); + num = params[1].val.integer; + strcpy(reason, "was forfeited"); + } + + if(NULL == tourn) { + gMamer.TellUser(TourneyNotFound, user->name, num); + return 0; + } + if(tourn->GetStatus() == DONE) { + gMamer.TellUser(TourneyDone, user->name, num); + return 0; + } + tp = tourn->GetPlayer(name); //Get the players info + if(tp == NULL) { + gMamer.TellUser(NotFound, user->name, name, num);// Player is not found in this tourney + return 0; + } + + gMamer.XServerCom("%s %s %d%s", "tournset", name, 0, "\n"); + if(tourn->IsNotClosed()) { //If we get past this check it will cost the user chaos points + tourn->playerList.Delete(tp); + tourn->CalculateAverage(); + gMamer.TellUser(PlayerRemoved, user->name, name, num); + gMamer.XServerCom("%s %d %s %s %s%d %d%s\n","tell", gMamer.channelNumber, name, reason, "from tourney #", + tourn->number, tourn->GetPlayerCount(), " player(s) now"); + return 0; + } // otherwise tourney is closed and started + + chaosPointsEarned = tourn->RemovePlayer(name); // RemovePlayer will return the number of rounds + if(chaosPointsEarned >= 0) { // that were disturbed + if(NULL == u) { + u = new User(gMamer.userFilePath, name); // Make a new user - this will create a file but there + needToDelete = 1; // should already be one cause they are in the tourney + } + u->AddAbuse(chaosPointsEarned * PENALTY_PER_ROUND); // add the choas points and save them + u->SavePlayer(gMamer.userFilePath); + if(u->GetAbuse() >= MAX_CHAOS_POINTS) + gMamer.XServerCom("%s %s%s", "+ censor", u->name, "\n"); + if(needToDelete) delete(u); // we created a new user so we should delete him here + gMamer.TellUser(PlayerRemoved, user->name, name, num); + gMamer.XServerCom("%s %d %s %s %s%d\n","tell",gMamer.channelNumber,name, reason, + "from tourney #", tourn->number); + return 1; + } + return 1; +} + +//- ListTourneyGames ------------------------------------------------------------ +int CommandEntry::ListTourneyGames(User *user, param_list params) { + Tourney *t = NULL; + TourneyPlayers *white, *black; + int i = 0; + Game *g = NULL; + + t = gMamer.FindTourney(params[0].val.integer); + if(NULL != t) { + LinkListIter gameIter(t->gameList); + gameIter.Reset(); + gMamer.XServerCom("%s %s %s %d %s", "qtell", user->name, "Tourney Games for Round #", t->GetRound(), "\\n\\n"); + gMamer.XServerCom("%3s %18s %6s %6s %2s %-18s %6s %6s %s", + "", "White", "[SCR ]", "[Rtng]", "vs", "Black", "[SCR ]", "[Rtng]", + "\\n---------------------------------------------------------------------------\\n"); + while((g = gameIter.Next())) { + if(!(i % 10) && (i>0)) { + gMamer.XServerCom("\nqtell %s %s", user->name, "\\n"); + } + + white = t->GetPlayer(g->whiteName); + black = t->GetPlayer(g->blackName); + + if(g->gameNumber > 0) { + gMamer.XServerCom("%3d %18s [%4.1f] [%4i] vs %-18s [%4.1f] [%4i] %3i%s", + i+1, g->whiteName, white->score, white->rating, + g->blackName, black->score, black->rating, g->gameNumber, "\\n"); + } else { + gMamer.XServerCom("%3d %18s [%4.1f] [%4i] vs %-18s [%4.1f] [%4i] none%s", + i+1, g->whiteName, white->score, white->rating, + g->blackName, black->score, black->rating, "\\n"); + } + i++; + } + gMamer.XServerCom("%s", "\\n\n"); + return(1); + } + + gMamer.TellUser(TourneyNotFound, user->name, params[0].val.integer); + return(0); +}//- End of ListTourneyGames + +//- ListTourneyPlayers ------------------------------------------------------------ +int CommandEntry::ListTourneyPlayers(User *user, param_list params) { + Tourney *t = NULL; + Player *p = NULL, *opp=NULL; + TourneyPlayers *tp = NULL; + char color, result; + int i = 0, counter = 0; + + t = gMamer.FindTourney(params[0].val.integer); + if(NULL != t) { + if(t->GetPlayerCount() == 0) { + gMamer.TellUser(NoPlayers, user->name, params[0].val.integer); + return 0; + } + t->SortPlayers(); + gMamer.XServerCom("%s %s %s %s %d %s %d %s %3s %-17s %6s %5s %6s %-6s %-7s %s %3s %-17s %6s %5s %6s %6s %-7s %s", + "qtell", user->name, "Tourney Players:", "Round", t->GetRound(), "of", t->params.rounds, + "\\n\\n", "", "Name", "Rating", "Score", "Perfrm", "Upset ", "Results", "\\n", + "", "-----------------", "------", "-----", "------", "------", "-------", "\\n"); + LinkListIter playerIter(t->playerList); + playerIter.Reset(); + while((tp = playerIter.Next())) { counter++; } // count the number of players + for(i=1; i<=counter; i++) { + p = t->GetSortPlayer(i); + tp = t->GetPlayer(p->name); + if(tp->activeFlag > 0) + gMamer.XServerCom("%3d %s%-17s [%4d] %3.1f [%4d] [%4d] ", + i, ((tp->location == ONLINE) ? "+" : "-"), + tp->name, tp->rating, tp->score, tp->perform, tp->upset); + else + gMamer.XServerCom("%3d %s%-17s [%4s] %3.1f [%4d] [%4d] ", + i, ((tp->location == ONLINE) ? "+" : "-"), + tp->name, "forf", tp->score, tp->perform, tp->upset); + LinkListIter opponentIter(tp->opponentList); // List of opponents this player has had + opponentIter.Reset(); + while((opp = opponentIter.Next())) { + p = t->GetSortPlayer(opp->name); + if(opp->value) { color = 'w'; } else { color = 'b'; } + if(opp->floatValue == 1.0) { + result = '+'; + } else if(opp->floatValue == 0.5) { + result = '='; + } else if(opp->floatValue == 0.0) { + result = '-'; + } else { + result = '*'; + } + gMamer.XServerCom("%c%-0.2d%c ", result, p->value, color); + } + if(((i % 9) == 0) && (i > 0)) { + gMamer.XServerCom("%s %s %s %s", "\n", "qtell", user->name, "\\n"); + } else { + gMamer.XServerCom("%s", "\\n"); + } + } + gMamer.XServerCom("%-24s %6.1f %s", "\\n Average Rating", t->GetAverageRating(), "\\n\n"); + return(1); + } + + gMamer.TellUser(TourneyNotFound, user->name, params[0].val.integer); + return(0); +}//- End of ListTourneyPlayers + +//- ListTourneyVars ----------------------------------------------------- +int CommandEntry::ListTourneyVars(User *user, param_list params) { + Tourney *tourn = NULL; + + tourn = gMamer.FindTourney(params[0].val.integer); + + if(NULL != tourn) { + gMamer.XServerCom("%s %s %s", "qtell", user->name, "\\n"); + gMamer.XServerCom(" %18s %4d %s", "(T)ime: ", tourn->params.time, "\\n"); + gMamer.XServerCom(" %18s %4d %s", "(I)ncrement: ", tourn->params.inc, "\\n"); + gMamer.XServerCom(" %18s %4d %s", "(R)ounds: ", tourn->params.rounds, "\\n"); + gMamer.XServerCom(" %18s %4d %s", "Max (P)layers: ", tourn->params.maxPlayers, "\\n"); + gMamer.XServerCom(" %18s %4c %s", "(M)ode: ", tourn->params.mode, "(r)ated or (u)nrated\\n"); + gMamer.XServerCom(" %18s %4c %s", "(S)tyle: ", tourn->params.style, "(s)wiss or (r)oundrobin\\n"); + gMamer.XServerCom(" %18s %4c %s","(V)ariant: ",tourn->params.variant, "(w)ild, (r)egular, (b)ug, or (s)uicide\\n"); + if(tourn->params.variant == 'w') + gMamer.XServerCom(" %18s %4d %s", + "(W)ild Type: ", + tourn->params.wild, "(0), (1), (2), (3), (4), (5), (8), (9)8a, (10)fr\\n"); + gMamer.XServerCom(" %18s %4d %s", "Rating (L)ow: ", tourn->params.ratingLow, "\\n"); + gMamer.XServerCom(" %18s %4d %s", "Rating (H)igh: ", tourn->params.ratingHigh, "\\n\\n"); + gMamer.XServerCom(" %18s %-18s %s", "Manager: ", tourn->manager, "\\n\n"); + } else { + gMamer.TellUser(NotFound, user->name, "tourney"); + } + + return 1; +}//- End ListTourneyVars + +//- MessageManagers ----------------------------------------------------- +int CommandEntry::MessageManagers(User *user, param_list params) { + int i, level, tourneys; + long last; + char filename[256], manager[NAMELEN]; + FILE *theFile; + + i = 1; + level = params[0].type; + sprintf(filename, "%s/managers", gMamer.dataFilePath); + if((theFile = fopen(filename, "r"))) { + while(fscanf(theFile, "%s %d %d %ld", manager, &level, &tourneys, &last) > 0) { + gMamer.XServerCom("%s %s %s %s", "message", manager, params[0].val.string, "\n"); + } + fclose(theFile); + + return(1); + } + gMamer.TellUser(NotFound, user->name, "Manager List"); + return(0); +}//- MessageManagers + +//- SetResult ------------------------------------------------------------ +int CommandEntry::SetResult(User *user, param_list params) { + Tourney *t; + int result, return_val = 0; + char answer[128]; + + t = gMamer.FindTourney(params[0].val.integer); + + if(NULL != t) { + switch (params[3].type) { // try and set the result + case TYPE_INT: + switch(params[3].val.integer) { + case 1: result = 1; break; + case 0: result = 0; break; + + } + break; + case TYPE_WORD: + if(!strcmp("=", params[3].val.word)) { result = 2; + } else if(!strcmp("draw", params[3].val.word)) { result = 2; + } else if(!strcmp("win", params[3].val.word)) { result = 1; + } else if(!strcmp("white", params[3].val.word)) { result = 1; + } else if(!strcmp("loss", params[3].val.word)) { result = 0; + } else if(!strcmp("black", params[3].val.word)) { result = 0; + } else { + gMamer.TellUser(GameResultNotFound, user->name, params[3].val.word); + return 0; + } + break; + default: + gMamer.TellUser(GameResultNotFound, user->name, params[3].val.string); + return 0; + break; + } + return_val = t->SetGameResult(params[1].val.word, params[2].val.word, result); + } + switch (return_val) { + case 0: + sprintf(answer, "a game with %s as white and %s as black", params[1].val.word, params[2].val.word); + gMamer.TellUser(NotFound, user->name, answer); + break; + default: + gMamer.TellUser(GameResultSet, user->name, params[1].val.word, params[2].val.word, result); + switch (result) { + case 1: + sprintf(answer, "1-0"); + break; + case 0: + sprintf(answer, "0-1"); + break; + default: + sprintf(answer, "1/2-1/2"); + break; + } + gMamer.XServerCom("%s %d The game %s vs. %s in tourney #%d has been set %s by %s\n", "tell", gMamer.channelNumber, + params[1].val.word, params[2].val.word, t->number, answer, user->name); + break; + } + return return_val; +}//- End of SetResult + +//- SetTourneyVariable ----------------------------------------------------- +int CommandEntry::SetTourneyVariable(User *user, param_list params) { + Tourney *tourn = NULL; + int i=0; + char which_var[16]; + strings varAliases[] = { + {"time", 0}, {"t", 0}, {"inc", 1}, {"i", 1}, {"rounds", 2}, {"r", 2}, + {"style", 3}, {"s", 3}, {"variant", 4}, {"v", 4}, {"mode", 5}, {"m", 5}, + {"wild", 6}, {"w", 6}, + {"ratingLow", 7}, {"l", 7}, {"ratingHigh", 8}, {"h", 8}, {"maxplayers", 9}, {"p", 9}, {NULL} }; + + tourn = gMamer.FindTourney(params[0].val.integer); // what tourney are we talking about + if(NULL == tourn) { + gMamer.TellUser(NotFound, user->name, "tourney"); // wrong tourney number + return 0; + } + if(FALSE == tourn->IsNotClosed()) { + gMamer.TellUser(TourneyClosed, user->name, params[0].val.integer); + return 0; + } + if(TRUE == tourn->IsNotNew()) { + if((0 != strncasecmp(params[1].val.word, "rounds", strlen(params[1].val.word))) && // even if it is open + (0 != strncasecmp(params[1].val.word, "r", strlen(params[1].val.word))) && // we can still change rounds + (0 != strncasecmp(params[1].val.word, "maxplayers", strlen(params[1].val.word))) && // or max players + (0 != strncasecmp(params[1].val.word, "p", strlen(params[1].val.word))) && // + (0 != strncasecmp(params[1].val.word, "style", strlen(params[1].val.word))) && // or style (rr) to (ss) + (0 != strncasecmp(params[1].val.word, "s", strlen(params[1].val.word)))) { + gMamer.TellUser(TourneyNotNew, user->name, params[0].val.integer); + return(0); + } + } + if(strcasecmp(user->name, tourn->manager) != 0) { + gMamer.TellUser(NoPermissions, user->name, params[0].val.integer); + return(0); + } + while(varAliases[i].string != NULL) { + if (!(strcasecmp(varAliases[i].string, params[1].val.word))) { //lets check the vars + if(strlen(varAliases[i].string) == 1) + strcpy(which_var, varAliases[i-1].string); + else //copy the whole word + strcpy(which_var, varAliases[i].string); + + if((varAliases[i].number <= 2) || (varAliases[i].number >= 6)) + if(params[2].type == TYPE_INT) { // if var is one that should be int + tourn->SetVariable(varAliases[i].number, params[2].val.integer); + gMamer.TellUser(ChangedInfo, user->name, which_var, params[2].val.integer); + return 1; + } else { + gMamer.TellUser(CanNotChange, user->name, which_var, params[2].val.word); + return 0; + } + else + if(params[2].type == TYPE_WORD) { + tourn->SetVariable(varAliases[i].number, params[2].val.word); + gMamer.TellUser(ChangedInfo, user->name, which_var, params[2].val.word); + return 1; + } else { + gMamer.TellUser(CanNotChange, user->name, which_var, params[2].val.integer); + return 0; + } + } + i++; + } + + gMamer.TellUser(NotFound, user->name, params[1].val.word); // Bad Variable + return 0; +} + +//- ShutdownCommand ---------------------------------------------------------- +int CommandEntry::Shutdown(User *user, param_list params) { + int i; + + i = params[0].type; + i = user->GetManagerLevel(); + + gMamer.Shutdown(); + exit(0); + + return(1); +} //- end of Shutdown diff --git a/lasker-2.2.3/bots/mamer/CommandEntry.hh b/lasker-2.2.3/bots/mamer/CommandEntry.hh new file mode 100644 index 0000000..d1f36bf --- /dev/null +++ b/lasker-2.2.3/bots/mamer/CommandEntry.hh @@ -0,0 +1,98 @@ +//-------------------------------------------------------------------------- +// CommandEntry.hh - Class definition for CommandEntry +// +// Matthew E. Moses +// +// $Revision: 1.11 $ +// $Date: 1998/09/10 19:58:31 $ +// +// $Author: mlong $ +// $Locker: $ +// +// $Log: CommandEntry.hh,v $ +// Revision 1.11 1998/09/10 19:58:31 mlong +// *** empty log message *** +// +// Revision 1.10 1998/06/18 18:41:52 mlong +// prepairing for yet another move. +// +// Revision 1.9 1998/04/29 15:24:07 mlong +// prepairing for the move to daimi +// new sorting routine. +// +// Revision 1.8 1998/04/18 18:46:31 mlong +// fixed delete bug and +// added delete tourney function +// +// Revision 1.7 1998/02/12 18:44:25 mlong +// *** empty log message *** +// +// Revision 1.6 1997/10/28 21:03:48 mlong +// *** empty log message *** +// +// Revision 1.5 1997/10/23 20:13:37 mlong +// *** empty log message *** +// +// Revision 1.5 1997/10/23 19:56:12 chess +// *** empty log message *** +// +// Revision 1.4 1997/05/15 18:29:12 chess +// added pending and TourneyPlayers support +// added HandleGetPlayerInfo & HandleGetGameInfo +// +// Revision 1.3 1997/04/13 03:21:32 chess +// new commands added SetInfo SetStat AddAbuse +// +// Revision 1.2 1997/03/21 15:32:36 moses +// added the shutdown command. +// +// Revision 1.1 1996/10/01 20:14:43 moses +// Initial revision +// +//-------------------------------------------------------------------------- + +#ifndef _UserCommands_ +#define _UserCommands_ + +#include "types.h" +#include "User.hh" +#include "Tourney.hh" + +class CommandEntry { + public: + int AddAbuse(User *, param_list); + int AnnounceTourney(User *, param_list); + int CreateTourney(User *, param_list); + int CloseTourney(User *, param_list); + int DeleteTourney(User *, param_list); + int FingerUser(User *, param_list); + int JoinTourney(User *, param_list); + int KeepTourney(User *, param_list); + int AddToTourney(User *, param_list); + int RemoveFromTourney(User *, param_list); + int ListRank(User *, param_list); + int ListManagers(User *, param_list); + int ListTourneys(User *, param_list); + int ListTourneyPlayers(User *, param_list); + int ListTourneyGames(User *, param_list); + int ListTourneyVars(User *, param_list); + int LoadedUsers(User *, param_list); + int MessageManagers(User *, param_list); + int OpenTourney(User *, param_list); + int SetCommandLevel(User *, param_list); + int SetInfo(User *, param_list); + int SetManagerLevel(User *, param_list); + int SetResult(User *, param_list); + int SetStat(User *, param_list); + int SetTourneyVariable(User *, param_list); + int ShowCommands(User *, param_list); + int ShowHelp(User *, param_list); + int Shutdown(User *, param_list); + int Withdraw(User *, param_list); + +}; + +#endif + + + diff --git a/lasker-2.2.3/bots/mamer/Game.cc b/lasker-2.2.3/bots/mamer/Game.cc new file mode 100644 index 0000000..8ab9ff8 --- /dev/null +++ b/lasker-2.2.3/bots/mamer/Game.cc @@ -0,0 +1,59 @@ +//-------------------------------------------------------------------------- +// Game.cc - Source file for the Game class +// +// Matthew E. Moses && Michael A. Long +// +// $Revision: 1.4 $ +// $Date: 2002/07/02 00:05:19 $ +// +// $Author: tridge $ +// $Locker: $ +// +// $Log: Game.cc,v $ +// Revision 1.4 2002/07/02 00:05:19 tridge +// got rid of a bunch of RCS tags now that its in CVS +// +// Revision 1.3 1998/09/10 19:57:17 mlong +// lots of little bug fixes and a few new features +// +// Revision 1.2 1998/04/29 15:23:19 mlong +// prepairing for the move to daimi +// new sorting routine. +// +// Revision 1.1 1997/07/18 15:42:13 chess +// Initial revision +// +// +//-------------------------------------------------------------------------- + +#include "Game.hh" + +//- Constructor ----------------------------------------------------------- +Game::Game(char *wn, char *bn, int t, int i, int r, char v) { + strcpy(whiteName, wn); + strcpy(blackName, bn); + time = t; + inc = i; + rated = r; + variation = v; + + gameNumber = -1; +} + +//- DeConstructor --------------------------------------------------------- +Game::~Game() { +} + +//- IsGame ----------------------------------------------------------------- +int Game::IsGame(char *whiteUser, char *blackUser, int t, int i, int r, char v) { + if( + (0 == strcasecmp(whiteUser, whiteName)) && + (0 == strcasecmp(blackUser, blackName)) && + (time == t) && + (inc == i) && + (rated == r) && + (variation == v)) + return(1); + else + return(0); +} //- End of IsGame diff --git a/lasker-2.2.3/bots/mamer/Game.hh b/lasker-2.2.3/bots/mamer/Game.hh new file mode 100644 index 0000000..5247cdb --- /dev/null +++ b/lasker-2.2.3/bots/mamer/Game.hh @@ -0,0 +1,87 @@ +//-------------------------------------------------------------------------- +// Game.hh - Class header for the Game class +// +// Matthew E. Moses & Michael A. Long +// +// $Revision: 1.5 $ +// $Date: 2002/07/02 00:05:19 $ +// +// $Log: Game.hh,v $ +// Revision 1.5 2002/07/02 00:05:19 tridge +// got rid of a bunch of RCS tags now that its in CVS +// +// Revision 1.4 2002/07/02 00:02:40 tridge +// - fixed compile on g++ 2.96 +// - updated for lasker 'rmatch' +// +// Revision 1.3 1998/09/10 19:58:41 mlong +// lots of little bug fixes and a few new features. +// +// Revision 1.2 1998/04/29 15:24:07 mlong +// prepairing for the move to daimi +// new sorting routine. +// +// Revision 1.1 1997/07/18 15:42:58 chess +// Initial revision +// +// +//-------------------------------------------------------------------------- + +#ifndef _Game_ +#define _Game_ + +#include +#include + +extern "C" { +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +} + +#include "config.h" +#include "User.hh" +#include "link.hh" +#include "linklist.hh" + +class Game : public Link { +public: + + Game(char *, char *, int, int, int, char); + ~Game(); + +int IsGame(char *, char *, int, int, int, char); + +private: + +public: + + char whiteName[NAMELEN]; + char blackName[NAMELEN]; + int rated; + int time; + int inc; + char variation; + int gameNumber; + +private: + +}; + + +#endif + + + + + + diff --git a/lasker-2.2.3/bots/mamer/Makefile b/lasker-2.2.3/bots/mamer/Makefile new file mode 100644 index 0000000..0bc956a --- /dev/null +++ b/lasker-2.2.3/bots/mamer/Makefile @@ -0,0 +1,136 @@ +#!make +# +# $Revision: 1.8 $ +# $Author: mlong $ +# +# $Date: 1998/09/11 15:47:50 $ +# +# $Locker: $ +# + +ifeq (${USE_INSURE}, 1) + CFLAGS = -Wall -ggdb + C++FLAGS = -Wall -ggdb + CC = insure + C++ = insure +else + ifeq (${USE_CHECKER}, 1) + CFLAGS = -Wall ##-ggdb + CC = checker -gcc + C++ = checker -g++ + else + CFLAGS = -Wall -ggdb + C++FLAGS = -Wall -ggdb + CC = gcc + C++ = g++ + endif +endif + + +#DEFINES = -DSUN + +#LDFLAGS = -lsocket -lnls -lnsl + +MAMER=mamer +MAMER-HEADERS = config.h Mamer.hh User.hh Tourney.hh link.hh linklist.hh\ + Command.hh CommandEntry.hh TourneyParameters.hh TourneyPlayers.hh\ + Game.hh Player.hh Storage.hh +MAMER-SRCS = main.cc Mamer.cc User.cc Tourney.cc link.cc Command.cc\ + CommandEntry.cc TourneyParameters.cc TourneyPlayers.cc\ + Game.cc Player.cc Storage.cc +MAMER-OBJS = main.o Mamer.o User.o Tourney.o link.o Command.o \ + CommandEntry.o TourneyParameters.o TourneyPlayers.o\ + Game.o Player.o Storage.o + +HEADERS = $(MAMER-HEADERS) +SRCS = $(MAMER-SRCS) +OBJS = $(MAMER-OBJS) + +default:: $(MAMER) + +all:: $(MAMER) + +# Object file rules +%.o: %.cc + $(C++) $(DEFINES) $(C++FLAGS) -c $< + +%.o: %.c + $(CC) $(DEFINES) $(CFLAGS) -c $< + +$(MAMER): $(MAMER-OBJS) + $(C++) $(C++FLAGS) -o bin/$@ $(MAMER-OBJS) $(LDFLAGS) + +clean: + rm -f $(OBJS) bin/mamer *~ #* + +count: + wc -l $(HEADERS) $(SRCS) + +tar: + make clean + (cd ..; tar -cf mamer.tar mamer; gzip -f mamer.tar; mv mamer.tar.gz mamer) + +bak: + mv bin/mamer bin/mamer_bak + +# File Dependencies + +main.o: main.cc\ + Mamer.hh\ + config.h + +Mamer.o: Mamer.cc\ + Mamer.hh\ + User.hh\ + Tourney.hh\ + config.h\ + link.hh\ + linklist.hh\ + CommandEntry.hh\ + TourneyParameters.hh\ + Player.hh\ + Game.hh\ + Storage.hh + +User.o: User.cc\ + User.hh\ + config.h\ + link.hh + +Tourney.o: Tourney.cc\ + Tourney.hh\ + config.h\ + link.hh\ + TourneyParameters.hh\ + TourneyPlayers.hh\ + Player.hh\ + Game.hh\ + Storage.hh + +Command.o: Command.cc\ + Command.hh\ + config.h\ + link.hh\ + types.h\ + Game.hh + +CommandEntry.o: CommandEntry.cc\ + CommandEntry.hh\ + User.hh\ + types.h\ + Game.hh + +TourneyParameters.o: TourneyParameters.cc\ + TourneyParameters.hh + +TourneyPlayers.o: TourneyPlayers.cc\ + TourneyPlayers.hh + +Storage.o: Storage.cc\ + Storage.hh + +Player.o: Player.cc\ + Player.hh + +Game.o: Game.cc\ + Game.hh diff --git a/lasker-2.2.3/bots/mamer/Mamer.cc b/lasker-2.2.3/bots/mamer/Mamer.cc new file mode 100644 index 0000000..38bfd59 --- /dev/null +++ b/lasker-2.2.3/bots/mamer/Mamer.cc @@ -0,0 +1,2032 @@ +//-------------------------------------------------------------------------- +// Mamer.cc - Source file for the Mamer class +// +// Matthew E. Moses & Michael A. Long +// +// $Revision: 1.19 $ +// $Date: 2002/07/02 00:05:19 $ +// +//-------------------------------------------------------------------------- + +#include "Mamer.hh" + +extern void HandleSignals(int); + +//- Constructor ------------------------------------------------------------ +Mamer::Mamer() { + time_t theTime; + struct tm *timeStruct; + + theTime = time((time_t *)NULL); + timeStruct = localtime(&theTime); + + loggedInFlag = FALSE; + + memset(configFilename, '\0', MAXPATHLEN); + strncpy(configFilename, CONFIG_FILENAME, MIN(strlen(CONFIG_FILENAME), MAXPATHLEN)); + + channelNumber = DEFAULT_CHANNEL; + memset(hostname, '\0', 256); + strncpy(hostname, DEFAULT_HOSTNAME, MIN(strlen(DEFAULT_HOSTNAME), 256)); + portNumber = DEFAULT_PORT; + + debugLevel = 0; + + memset(username, '\0', 80); + memset(password, '\0', 80); + strncpy(username, DEFAULT_USERNAME, MIN(strlen(DEFAULT_USERNAME), 80)); + strncpy(password, DEFAULT_PASSWORD, MIN(strlen(DEFAULT_PASSWORD), 80)); + + sprintf(logFilename, "%s/%s.%04d%02d%02d", + DEFAULT_PATH, DEFAULT_LOG_FILE, + 1900 + timeStruct->tm_year, timeStruct->tm_mon + 1, + timeStruct->tm_mday); + + sprintf(userFilePath, "%s/%s", DEFAULT_PATH, DEFAULT_USER_PATH); + sprintf(dataFilePath, "%s/%s", DEFAULT_PATH, DEFAULT_DATA_PATH); + sprintf(homeFilePath, "%s", DEFAULT_PATH); + + tourneyParams.time = DEFAULT_TIME; + tourneyParams.inc = DEFAULT_INCREMENT; + tourneyParams.mode = 'r'; + tourneyParams.style = 's'; + tourneyParams.variant = 'r'; + tourneyParams.rounds = DEFAULT_ROUNDS; + tourneyParams.ratingHigh = 9999; + tourneyParams.ratingLow = 0; + tourneyParams.maxPlayers = DEFAULT_MAX_PLAYERS; + +} //- End of Mamer + +//- Deconstructor ---------------------------------------------------------- +Mamer::~Mamer() { + User *u = NULL; + Tourney *t = NULL; + Command *c = NULL; + + while(0 != (u = userList.Head())) + userList.Delete(); + + while(0 != (t = tourneyList.Head())) + tourneyList.Delete(); + + while(0 != (c = commandList.Head())) + commandList.Delete(); + +} //- End of ~Mamer + +//- Initialize ------------------------------------------------------------- +int Mamer::Initialize(int argc, char **argv) { + struct stat statBuffer; + char c; + + LoadConfigurationFile(); + + while(EOF != (c = getopt(argc, argv, + "d:D:c:C:s:S:p:P:u:U:l:L:hHa:A:n:N:"))) { + switch(c) { + case 'd': + case 'D': + debugLevel = atoi(optarg); + break; + case 'c': + case 'C': + channelNumber = atoi(optarg); + break; + case 's': + case 'S': + memset(hostname, '\0', 256); + strncpy(hostname, optarg, MIN(strlen(optarg), 256)); + break; + case 'n': + case 'N': + portNumber = atoi(optarg); + break; + case 'u': + case 'U': + memset(userFilePath, '\0', MAXPATHLEN); + strncpy(userFilePath, optarg, MIN(strlen(optarg), MAXPATHLEN)); + break; + case 'l': + case 'L': + memset(userFilePath, '\0', MAXPATHLEN); + strncpy(logFilename, optarg, MIN(strlen(optarg), MAXPATHLEN)); + break; + case 'a': + case 'A': + memset(username, '\0', 80); + strncpy(username, optarg, MIN(strlen(optarg), 80)); + break; + case 'p': + case 'P': + memset(password, '\0', 80); + strncpy(password, optarg, MIN(strlen(optarg), 80)); + break; + case 'h': + case 'H': + default: + Usage(); + exit(0); + } + } + + if(-1 == stat(userFilePath, &statBuffer)) { + switch(errno) { + case ENOENT: + if(-1 == mkdir(userFilePath, S_IRUSR|S_IWUSR|S_IXUSR|S_IRGRP|S_IWGRP|S_IXGRP|S_IROTH|S_IXOTH)) { + perror("create user file path"); + return(0); + } + } + } + + if(10 <= debugLevel) + DumpConfiguration(); + + signal(SIGPIPE, SIG_IGN); + signal(SIGTERM, HandleSignals); + signal(SIGKILL, HandleSignals); + signal(SIGUSR1, HandleSignals); + signal(SIGUSR2, HandleSignals); + + BuildCommandList(); + + return(1); +} //- End of Initialize + +//- s_and_r - Search and Replace a string within a string ------------ +char *Mamer::s_and_r(char *s, char *tofind, char *toreplace) { + char *toReturn = NULL; + int currSize = 0; + char *return_offset; + char *replace_offset; + int find_len; + int toreplace_len; + register int x; + + /* if nothing to look at, and nothing to replace.... return nothing */ + if ( s == NULL || tofind == NULL) + return NULL; + + find_len = strlen(tofind); + if ( toreplace != NULL ) + toreplace_len = strlen(toreplace); + else + toreplace_len = 0; /* allow us to have nothing to replace... acts the same a delstring */ + + currSize = (strlen(s) * 2) + 100; /* add the 100 in case s is small */ + toReturn = (char*)malloc(currSize); + return_offset = toReturn; + while ( *s != '\0' ) { + if ( *s == *tofind && strncmp(s, tofind, MIN(find_len, (int)strlen(s))) == 0 ) { + /* if the first letter matches, and so does the rest.. */ + /* copy in the replace string */ + replace_offset = toreplace; + for ( x = 0; x < toreplace_len; x++ ) { + *return_offset = *replace_offset; + return_offset++; + replace_offset++; + } + /* and move up the current position in s to just past the find string */ + s += find_len; + } else { /* it doesn't match.... just copy to the return and continue */ + *return_offset = *s; + return_offset++; + s++; + } + } + *return_offset = '\0'; + + return toReturn; +} + +//- OpenServerConnection --------------------------------------------------- +int Mamer::OpenServerConnection(void) { + struct sockaddr_in socketAddr; + struct hostent *hostEntry = NULL; +// char mesg[MAXPATHLEN] = {'\0'}; + unsigned long inAddr; + + //- Check is we have a decimal notation host address + socketAddr.sin_family = AF_INET; + if((unsigned long)INADDR_NONE != (inAddr = inet_addr(hostname))) + socketAddr.sin_addr.s_addr = inAddr; + else { //- Try to query a namserver to get an address + if(NULL == (hostEntry = gethostbyname(hostname))) { + cerr << "ERROR: can't resolve hostname '" << hostname + << "'." << endl; + cerr << endl; + return(0); + } + + bcopy(hostEntry->h_addr, (char *)&socketAddr.sin_addr, + hostEntry->h_length); + } + + serverSocket = socket(AF_INET, SOCK_STREAM, 0); + if(0 > serverSocket) { + cerr << "ERROR: can't create TCP socket." << endl; + cerr << endl; + return(0); + } + + socketAddr.sin_port = htons(portNumber); + if(0 > connect(serverSocket, (struct sockaddr *)&socketAddr, + sizeof(struct sockaddr_in))) { + cerr << "ERROR: can't create connection to server '" + << hostname << "' on port " << portNumber << "." << endl; + cerr << " " << strerror(errno) << endl; + cerr << endl; + return(0); + } + + return(1); +} //- End of OpenServerConnection + +//- ListenLoop ------------------------------------------------------------- +void Mamer::ListenLoop(void) { + struct timeval timeout; + char readBuffer[4096], writeBuffer[4096], commandBuffer[4096], channelCmpStr[16]; + char *p = NULL, *buffer = NULL, *tmpBuffer = NULL; + fd_set fdMask; + long size = 0; + int i = 0, j = 0; + + sprintf(channelCmpStr, "(%d): ", channelNumber); + buffer = new char[4096]; + if(NULL == buffer) { + cerr << "ERROR: problems allocating memory" << endl; + cerr << endl; + return; + } + + tmpBuffer = new char[4096]; + if(NULL == tmpBuffer) { + cerr << "ERROR: problems allocating memory" << endl; + cerr << endl; + return; + } + + timeout.tv_sec = timeout.tv_usec = 0; + + while(1) { + FD_ZERO(&fdMask); + FD_SET(serverSocket, &fdMask); + +#ifdef HPUX + select(serverSocket + 3, (int *)&fdMask, (int *)0, (int *)0, &timeout); +#else + select(serverSocket + 3, &fdMask, (fd_set *)0, (fd_set *)0, &timeout); +#endif + + if(FD_ISSET(serverSocket, &fdMask)) { + size = 0; + memset(readBuffer, '\0', 4096); + memset(writeBuffer, '\0', 4096); + size = read(serverSocket, readBuffer, (sizeof(readBuffer) - 1)); + + if(size > 0) { + //- fix newlines/linefeeds + memset(buffer, '\0', 4096); + strncpy(buffer, readBuffer, size); + buffer[size] = '\0'; + + if(NULL != (strstr(buffer, "\n\r\\ "))) { + strcpy(tmpBuffer, s_and_r(buffer, "\n\r\\ ", "")); + memset(buffer, '\0', 4096); + strcpy(buffer, tmpBuffer); + size = strlen(buffer); + } + + if(NULL != (strstr(buffer, "\r\n\\ "))) { + strcpy(tmpBuffer, s_and_r(buffer, "\r\n\\ ", "")); + memset(buffer, '\0', 4096); + strcpy(buffer, tmpBuffer); + size = strlen(buffer); + } + + if(NULL != (strstr(buffer, "\n\r "))) { + strcpy(tmpBuffer, s_and_r(buffer, "\n\r ", "")); + memset(buffer, '\0', 4096); + strcpy(buffer, tmpBuffer); + size = strlen(buffer); + } + + if((FALSE == loggedInFlag) && + (NULL != strstr(buffer, "login:"))) { + sprintf(writeBuffer, "%s\n", username); + write(serverSocket, writeBuffer, strlen(writeBuffer)); + } else if((FALSE == loggedInFlag) && + (NULL != strstr(buffer, "password:"))) { + sprintf(writeBuffer, + "%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s %d\n", + password, + "set prompt %", + "set pinform 1", + "set ginform 1", + "set mamer 1", + "set shout 0", + "set cshout 0", + "set seek 0", + "set open 0", + "admin", + "set tell 0", + "+ channel ", + channelNumber + ); + write(serverSocket, writeBuffer, strlen(writeBuffer)); + FILE *theFile; + char manager[NAMELEN], filename[128]; + sprintf(filename, "%s/managers", dataFilePath); + if((theFile = fopen(filename, "r"))) { + while(fscanf(theFile, "%s", manager) > 0) { + XServerCom("qtell %s %s %s %s", + manager, "Howdy, ", username, " is here!\n"); + } + } + fclose(theFile); + + loggedInFlag = TRUE; + } + else if(TRUE == loggedInFlag) { + i = 0; + while(i < size) { + while(('\r' == buffer[i]) || + ('\n' == buffer[i]) || + ('%' == buffer[i]) || + (' ' == buffer[i])) + i++; + j = 0; + while(('\r' != buffer[i]) && + ('\n' != buffer[i]) && + (i < size)) + commandBuffer[j++] = buffer[i++]; + commandBuffer[j] = '\0'; + + if(NULL != (p = strstr(commandBuffer, channelCmpStr))) + HandleChannel(commandBuffer); + else if(NULL != (p = strstr(commandBuffer, "tells you:"))) + HandleTell(commandBuffer); + else if(NULL != (p = strstr(commandBuffer, "has connected"))) + HandleConnect(commandBuffer); + else if(NULL != (p = strstr(commandBuffer, "has disconnected"))) + HandleDisconnect(commandBuffer); + else if(0 == strncmp(commandBuffer, "{Game ", 6)) + HandleGame(commandBuffer); + else if(0 == strncmp(commandBuffer, "*qtell ", 7)) + HandleQtell(commandBuffer); + else if(0 == strncmp(commandBuffer, "*getgi ", 7)) + HandleGameInfo(commandBuffer); + else if(0 == strncmp(commandBuffer, "*getpi ", 7)) + HandlePlayerInfo(commandBuffer); + else { + /* + cout << "Unsupported: " << commandBuffer << endl; + cout << endl; + */ + } + + while(('\r' == buffer[i]) || + ('\n' == buffer[i]) || + ('%' == buffer[i]) || + (' ' == buffer[i])) + i++; + } + } + } else { + if((errno == EINTR) || (errno == EAGAIN) || (errno == EIO) || + (errno == EBADF) || (errno == EINVAL) || (errno == EFAULT)) { + switch (errno) { + case EINTR: + printf("Error = %s\n", "EINTR"); + break; + case EAGAIN: + printf("Error = %s\n", "EAGAIN"); + break; + case EIO: + printf("Error = %s\n", "EIO"); + break; + case EBADF: + printf("Error = %s\n", "EBADF"); + break; + case EINVAL: + printf("Error = %s\n", "EINVAL"); + break; + case EFAULT: + printf("Error = %s\n", "EFAULT"); + break; + default: + break; + } + } + break; + } + } + sleep(1); + } //- end while(1) + + if(NULL != buffer) + delete [] buffer; + + if(NULL != tmpBuffer) + delete [] tmpBuffer; + +} //- End of ListenLoop + +//- Start of GivePlace ---------------------------- +int Mamer::GivePlace(int i, Tourney *t) { + TourneyPlayers *tp = NULL, *place = NULL; + User *u = NULL; + Player *opp = NULL; + LinkListIter playerIter(t->playerList); + float score=0.0; + int counter=0; + char placeName[7]; + + memset(placeName, '\0', 7); + switch(i) { + case 1: + strcpy(placeName, "First"); + break; + case 2: + strcpy(placeName, "Second"); + break; + case 3: + strcpy(placeName, "Third"); + break; + default: + break; + } + + XServerCom("%s %i %s %s %s%i %s ", "tell", channelNumber, "Tourney Results:", placeName, + "place in tourney #", t->number, "goes to: "); + + opp = t->GetSortPlayer(i); + place = t->GetPlayer(opp->name); + score = place->score; + + while((tp = playerIter.Next())) { + if(tp->score == score) { + XServerCom("%s ", tp->name); + counter++; + u = FindUser(tp->name); + if(u == NULL) { + CheckUser(tp->name); + u = FindUser(tp->name); + } + // if(NULL != u) + u->AddStat(i); // Adds a first/second/third place finish to everyone with the same score as the 1st + } + } + XServerCom("\n"); + + return counter; +} + +//- Start of AnnounceTourneyEnd +void Mamer::AnnounceTourneyEnd(Tourney *t) { + TourneyPlayers *tp = NULL; + int first=0, second=0, third=0; + int numberOfPlayers = 0; + + t->EndTourney(); + t->SortPlayers(); + t->SetEndDate(); + + LinkListIter playerIter(t->playerList); + + while((tp = playerIter.Next())) { + if((tp->activeFlag) && (strcasecmp(tp->name, "_BYE_") != 0)) + numberOfPlayers++; + } + + first = GivePlace(1, t); //first = number of people tied for first + + if(numberOfPlayers >= 5) { + if(first == 1) { second = GivePlace(2, t); } + if(first == 2) { third = GivePlace(3, t); } + if(numberOfPlayers >= 7) { + if(second == 1) { third = GivePlace(3, t); } + } + } +} + +//- savePlayerData -------------------------------------------------------------- +void Mamer::savePlayerData(Tourney *t) { + LinkListIter playerIter(t->playerList); + TourneyPlayers *tp = NULL, *tmpOpp = NULL; + User *u = NULL, *manager=NULL; + Player *opp; + int w, d, l; + float r, tourn_expect=0.0, pre_expect=0.0, delta = 0.0; + + manager = FindUser(t->manager); // save the manager info + if(manager == NULL) { + manager = new User(userFilePath, t->manager); // manager isn't online + manager->SetLast(time(0)); // so we have to load him/her + manager->AddManagedTourney(); + manager->SavePlayer(userFilePath); + delete(manager); + } else { // manager is online + manager->SetLast(time(0)); + manager->AddManagedTourney(); + manager->SavePlayer(userFilePath); + } + + while((tp = playerIter.Next())) { + tourn_expect = 0.0; + u = FindUser(tp->name); + if(u == NULL) { + User *newUser = NULL; + newUser = new User(userFilePath, tp->name); + u = newUser; + } + if(debugLevel >= 5) + cout << "savePlayerData::" << tp->name << " " << u->name << endl; + r = u->GetRating(); + w = u->GetWins(); + l = u->GetLosses(); + d = u->GetDraws(); + pre_expect = ((float)w + (0.5 * (float)d)) / r; + + LinkListIter opponentIter(tp->opponentList); // List of opponents this player has had + while((opp = opponentIter.Next())) { + tmpOpp = t->GetPlayer(opp->name); // need the player's information to do tourn_expect + delta = (float)(((tp->rating != 0) ? tp->rating : 1600) - + ((tmpOpp->rating != 0) ? tmpOpp->rating : 1600)); // difference in rating + tourn_expect = tourn_expect + (1 / (1+pow(10,(delta/400.0)))); + u->AddStat(opp->floatValue); + } + u->AddPlayedTourney(); + if(tp->activeFlag) { // If I didn't withdraw or get forfeited reduce my abuse points + u->AddAbuse(-1 * t->GetRound()); // This will be the # of rounds played because the tourney is DONE + XServerCom("%s %s %d%s", "tournset", tp->name, 0, "\n"); + } + u->CalculateRating(tourn_expect, pre_expect); + u->SavePlayer(userFilePath); + } +} //- End of savePlayerData ------------------------------------------ + +//- Shutdown -------------------------------------------------------------- +void Mamer::Shutdown(void) { + LinkListIter userIter(userList); + User *u = NULL; + + while((u = userIter.Next())) { + // u->SavePlayer(userFilePath); + userList.Delete(u); + } + + write(serverSocket, "exit\n", 5); + close(serverSocket); + exit(0); +} //- End of Shutdown + +//- Usage ----------------------------------------------------------------- +void Mamer::Usage(void) { + cerr << "Usage: mamer [-c channel] [-s server] [-n port number] " << endl; + cerr << " [-d debug level] [-u users database filename] " + << endl; + cerr << " [-l log filename] [-a mamer account name] " << endl; + cerr << " [-p mamer password] [-h help] " << endl; + cerr << endl; + cerr << "\t-h show usage information." << endl; + cerr << "\t-c sets which channel mamer should work on.\n\t (default = " + << channelNumber << ")" << endl; + cerr << "\t-s sets the server hostname that mamer connects to.\n\t" + << " (default = " << hostname << ")" << endl; + cerr << "\t-n sets the port number on the server to connect to.\n\t" + << " (default = " << portNumber << ")" << endl; + cerr << "\t-a sets the username for the account to mamer logs in as.\n\t" + << " (default = " << username << ")" << endl; + cerr << "\t-p sets the password for the mamer account.\n\t" + << " (default = " << password << ")" << endl; + cerr << "\t-d sets the debugging level. This determines how much of " + << "the\n\t activity of mamer is written to the logs." << endl; + cerr << "\t-u set the location of the users database file.\n\t" + << " (default = " << userFilePath << ")" << endl; + cerr << "\t-l sets the location of the log file.\n\t (default = " + << logFilename << ")" << endl; + cerr << endl; +} //- End of Usage + +//- LoadConfigurationFile ------------------------------------------------- +void Mamer::LoadConfigurationFile(void) { + struct stat statBuffer; + int length=0; + + if(-1 != stat(configFilename, &statBuffer)) { + char *buffer = NULL; + fstream theFile(configFilename, ios::in); + + buffer = new char[MAXPATHLEN + 80]; + if(NULL == buffer) + return; + + memset(buffer, '\0', MAXPATHLEN + 80); + + while(theFile.good()) { + theFile.getline(buffer, MAXPATHLEN + 80 - 1, '\n'); + + if(buffer[0] == '#') continue; + length = strlen(buffer); + + if(length >= 4) { + if(0 == strncasecmp(buffer, "HOST", 4)) { + buffer += 4; + while(isspace(buffer[0])) buffer++; + + memset(hostname, '\0', MAXPATHLEN); + strncpy(hostname, buffer, MIN(length, MAXPATHLEN)); + } else if(0 == strncasecmp(buffer, "DATA", 4)) { + buffer += 4; + while(isspace(buffer[0])) buffer++; + + memset(dataFilePath, '\0', MAXPATHLEN); + strncpy(dataFilePath, buffer, MIN(length, MAXPATHLEN)); + } else if(0 == strncasecmp(buffer, "HOME", 4)) { + buffer += 4; + while(isspace(buffer[0])) buffer++; + + memset(homeFilePath, '\0', MAXPATHLEN); + strncpy(homeFilePath, buffer, MIN(length, MAXPATHLEN)); + } else if(0 == strncasecmp(buffer, "HELP", 4)) { + buffer += 4; + while(isspace(buffer[0])) buffer++; + + memset(helpFilePath, '\0', MAXPATHLEN); + strncpy(helpFilePath, buffer, MIN(length, MAXPATHLEN)); + } else if(0 == strncasecmp(buffer, "USER", 4)) { + buffer += 4; + while(isspace(buffer[0])) buffer++; + + memset(username, '\0', 80); + strncpy(username, buffer, MIN(length, 80)); + } else if(0 == strncasecmp(buffer, "PASS", 4)) { + buffer += 4; + while(isspace(buffer[0])) buffer++; + + memset(password, '\0', 80); + strncpy(password, buffer, MIN(length, 80)); + } else if(0 == strncasecmp(buffer, "PORT", 4)) { + buffer += 4; + while(isspace(buffer[0])) buffer++; + + portNumber = atoi(buffer); + } else if(0 == strncasecmp(buffer, "CHAN", 4)) { + buffer += 4; + while(isspace(buffer[0])) buffer++; + + channelNumber = atoi(buffer); + } else if(0 == strncasecmp(buffer, "DBUG", 4)) { + buffer += 4; + while(isspace(buffer[0])) buffer++; + + debugLevel = atoi(buffer); + } + } + if(length >= 3) { + if(0 == strncasecmp(buffer, "LOG", 3)) { + buffer += 3; + while(isspace(buffer[0])) buffer++; + + memset(logFilename, '\0', MAXPATHLEN); + strncpy(logFilename, buffer, MIN(length, MAXPATHLEN)); + } else if((strlen(buffer) > 3) && (0 == strncasecmp(buffer, "UDB", 3))) { + buffer += 3; + while(isspace(buffer[0])) buffer++; + + memset(userFilePath, '\0', MAXPATHLEN); + strncpy(userFilePath, buffer, MIN(length, MAXPATHLEN)); + } + } + } //- theFile.good() + } + else { + switch(errno) { + case EACCES: + cerr << "ERROR: permission denied for configuration file '" + << configFilename << "' using compiled defaults." << endl; + cerr << endl; + break; + case ENOENT: + cerr << "WARNING: configuration file '" << configFilename + << "' doesn't exist, using " << endl; + cerr << " compiled defaults." << endl; + cerr << endl; + break; + } + } + +} //- End of LoadConfigurationFile + +//- DumpConfiguration ----------------------------------------------------- +void Mamer::DumpConfiguration(void) { + cout << "Mamer Configuration" << endl; + cout << "-------------------" << endl; + cout << "Hostname : " << hostname << endl; + cout << "Port : " << portNumber << endl; + cout << "Channel : " << channelNumber << endl; + cout << endl; + cout << "Username : " << username << endl; + cout << "Password : " << password << endl; + cout << endl; + cout << "Home Path: " << homeFilePath << endl; + cout << "Data Path: " << dataFilePath << endl; + cout << "Help Path: " << helpFilePath << endl; + cout << "User File: " << userFilePath << endl; + cout << "Log File : " << logFilename << endl; + cout << endl; + cout << "Debug Lvl: " << debugLevel << endl; + cout << endl; + +} //- End of DumpConfiguration + +//- HandleQtell ------------------------------------------------------------ +int Mamer::HandleQtell(char *message) { + char name[NAMELEN]; + int isOnline; // Opposite of what is returned in qtell report + + sscanf(message, "*qtell %s %d*", name, &isOnline); + isOnline = !isOnline; + + User *u = NULL; + u = FindUser(name); + + if(isOnline) { + if(NULL == u) { + CheckUser(name); + } + } + + return 1; +} + +//- HandleTell ------------------------------------------------------------ +int Mamer::HandleTell(char *message) { + char *p = NULL, *q = NULL, *command = NULL, *tmpCom=NULL; + char user[32] = {'\0'}; + int i=0, pos = 0, tmp=0, len = 0, ret = 0, tellSize=12; /* size of " tells you:" */ + + //- Parse apart tell message + //- tells you: + //- (*) tells you: + //- (TM)(GM)(*)..... tells you: + if((p = strstr(message, "(")) && (q = strstr(message, " tells you:")) && (strlen(p) > strlen(q))) { + tmp = strlen(p) - strlen(q); /* get the diff to add back in later */ + pos = strlen(message) - strlen(p); + memset(user, '\0', 32); + strncpy(user, message, MIN(pos, 31)); + pos += (tellSize + tmp); + } else { + p = strstr(message, " tells you:"); + pos = strlen(message) - strlen(p); + memset(user, '\0', 32); + strncpy(user, message, MIN(pos, 31)); + pos += tellSize; + } + + CheckUser(user); + + len = strlen(&(message[pos])); + command = new char[len + 1]; memset(command, '\0', (len + 1)); + tmpCom = new char[len + 1]; memset(tmpCom, '\0', (len + 1)); + if(NULL == command) { + cerr << "ERROR: problems allocating memory" << endl; + cerr << endl; + return(ret); + } + strncpy(command, &(message[pos]), len); + command[len] = '\0'; + while((command[i] != '\0') && (command[i] != ' ')) tmpCom[i] = command[i++]; + tmpCom[i] = '\0'; + + Command *comm = NULL; + comm = FindCommand(tmpCom, user); + if(comm == NULL) { + if(NULL != command) + delete [] command; + if(NULL != tmpCom) + delete [] tmpCom; + return 0; + } + + if(10 <= debugLevel) { + cout << "Tell Msg: " << message << endl; + cout << "User is: " << user << " Command is: " << command<< "\n" << endl; + } + + if(ParseParams(comm, command) == COM_BADPARAMETERS) { + TellUser(comm, user); + if(NULL != command) + delete [] command; + if(NULL != tmpCom) + delete [] tmpCom; + return 0; + } + + if(NULL != comm) { + User *u = NULL; + u = FindUser(user); + if(NULL == u) { + CheckUser(user); // This should never happen because we did it above. + u = FindUser(user); + if(NULL == u) + abort(); + } + if((u->GetManagerLevel()) >= (comm->GetManagerLevel())) { + ret = (this->*(comm->userFunction))(u, comm->params); + if(debugLevel >= 5) + cout << comm->GetCommandName() << " return value " << ret << endl; + if(((ret == 2) && (!(strcasecmp(comm->GetCommandName(), "setres")))) || + ((ret == 1) && (!(strcasecmp(comm->GetCommandName(), "withdraw")))) || + ((ret == 1) && (!(strcasecmp(comm->GetCommandName(), "forfeit"))))) { + NextRound(); + } else if ((ret != 0) && (!(strcasecmp(comm->GetCommandName(), "setmanagerlevel")))) { + AdjustManagerList(ret, comm->params[0].val.word); + } + } else { + TellUser(NoPermissions, user); + } + } + + if(NULL != command) + delete [] command; + if(NULL != tmpCom) + delete [] tmpCom; + + return(ret); +} //- End of HandleTell + +//- HandleChannel ------------------------------------------------------------ +int Mamer::HandleChannel(char *message) { + char *q, *p = NULL, channel[8], mess[1024]; + char user[NAMELEN] = {'\0'}; + int pos = 0, index=0; + char *hilist[] = {"hi ", "hello ", "howdy ", "aloha ", "hola ", "bonjour ", "tag ", NULL }; + char *thanklist[] = {"thanks ", "thank you ", "thanx ", "gracias ", NULL }; + char *byelist[] = {"bye ", "later ", "caio ", "adios ", "hasta la vista ", NULL }; + char *swearlist[] = {"fuck", "shit", "god damn", "asshole", "cunt", "cock", "bullshit", "nigger", "asswipe", NULL }; + + //- Parse apart channel message + //- (1): + //- (*)(24): + //- (TM)(49): + if((p = strchr(message, '('))) { + pos = strlen(message) - strlen(p); + memset(user, '\0', NAMELEN); + strncpy(user, message, MIN(pos, NAMELEN-1)); + } else + return 0; + + if(0 == strcasecmp(user, username)) return 1; + CheckUser(user); + p = strchr(message, ':'); + while(*p != '(') p--; + q = channel; p++; + while(*p != ')') { *q++ = *p++; } + *q = '\0'; + + p = strchr(message, ':'); p++; + q = mess; + while(*p != '\0') { *q++ = *p++; } + *q = '\0'; + + if(debugLevel >= 5) + printf("%s %s %s\n", user, channel, mess); + + mess[strlen(mess)] = '\0'; + stolower(mess); + + pos = 0; + index=0; + while (swearlist[index] != NULL) { + if (strstr(mess, swearlist[index])) { + printf("ABUSE - %s %s\n", user, mess); + XServerCom("%s %s\n", "+ c49muzzle", user); + pos = 1; + } + index++; + } + if ((strstr(mess, username)) && (pos == 0)) { + pos = 0; + index = 0; + while (hilist[index] != NULL) { + if (strstr(mess, hilist[index])) { + XServerCom("%s %s Hi %s :-)\n", "tell", channel, user); + pos = 1; + } + index++; + } + index = 0; + if(pos == 0) + while (thanklist[index] != NULL) { + if (strstr(mess, thanklist[index])) { + XServerCom("%s %s You're welcome %s!\n", "tell", channel, user); + pos = 1; + } + index++; + } + index = 0; + if(pos == 0) + while (byelist[index] != NULL) { + if (strstr(mess, byelist[index])) { + XServerCom("%s %s Sad to see you going, %s :(\n", "tell", channel, user); + pos = 1; + } + index++; + } + } + if (strstr(mess, "tourn")) + XServerCom("%s %s %s %s %s\n", + "tell", channel, "To see a list of tourneys type: tell", username, "lt"); + + return(1); +} //- End of HandleChannel + +//- HandleConnect ------------------------------------------------------------ +int Mamer::HandleConnect(char *message) { + char *p = NULL, *reg = NULL, user[80] = {'\0'}, output[256] = {'\0'}, tmp[32] = {'\0'}; + Tourney *t = NULL; + TourneyPlayers *tp = NULL; + LinkListIter tourneyIter(tourneyList); + int announceConnect = 0; + + //- Parse apart connect message + //- [ (R: 123.123.123.123) has connected.] + if(5 <= debugLevel) + cout << "\nConnect Msg: " << message << endl; + + if((p = strstr(message, " (U:"))) { return(1); } + if(!(p = strstr(message, " (R: "))) { return(1); } + strncpy(user, &(message[1]), MIN(strlen(message) - strlen(p) - 1, 79)); + reg = strstr(message, " (R: "); + if(reg) { //If this is a registered user + CheckUser(user); + while((t = tourneyIter.Next())) { + if((tp = t->GetPlayer(user))) { + tp->location = ONLINE; + announceConnect = 1; + } + } + if(announceConnect) { // If the player arriving is in a tourney tell us he is arriving. + announceConnect = 0; + sprintf(output, "%s %d %s %s", "tell", channelNumber, user, "has connected. Entered in tourney(s):"); + tourneyIter.Reset(); + while((t = tourneyIter.Next())) { + if(t->GetStatus() != DONE) { + if((tp = t->GetPlayer(user))) { + sprintf(tmp, " %d", t->number); + strcat(output, tmp); + announceConnect = 1; + } + } + } + if(announceConnect) { + XServerCom("%s %s %d%s", "tournset", user, 1, "\n"); + XServerCom("%s%s", output, "\n"); + } + } + } else { + if(15 <= debugLevel) { + cout << "\nConnect Msg: " << message << endl; + cout << "Ignoring User: " << user << endl; + } + } + return(1); +} //- End of HandleConnect + +//- HandleDisconnect -------------------------------------------------------- +int Mamer::HandleDisconnect(char *message) { + char *p = NULL, user[80] = {'\0'}, output[256] = {'\0'}, tmp[32] = {'\0'}; + Tourney *t = NULL; + TourneyPlayers *tp = NULL; + LinkListIter tourneyIter(tourneyList); + int announceDisconnect = 0; + + //- Parse apart disconnect message + //- [ has disconnected.] + p = strstr(message, " has disconnected."); + strncpy(user, &(message[1]), MIN(strlen(message) - strlen(p) - 1, 79)); + + if(10 <= debugLevel) { + cout << "Disconnect Msg: " << message << endl; + cout << "User is: " << user << "\n" << endl; + } + + LinkListIter userIter(userList); + User *u = NULL; + while((u = userIter.Next())) + if(1 == u->IsUser(user)) + break; + + if(NULL != u) { + tourneyIter.Reset(); + while((t = tourneyIter.Next())) { + if((tp = t->GetPlayer(user))) { + tp->location = GONE; + announceDisconnect = 1; + } + } + if(announceDisconnect) { // If the player arriving is in a tourney tell us he is arriving. + announceDisconnect = 0; + sprintf(output, "%s %d %s %s", "tell", channelNumber, user, "has disconnected. Entered in tourney(s):"); + tourneyIter.Reset(); + while((t = tourneyIter.Next())) { + if(t->GetStatus() != DONE) { + if((tp = t->GetPlayer(user))) { + sprintf(tmp, " %d", t->number); + strcat(output, tmp); + announceDisconnect = 1; + } + } + } + if(announceDisconnect) { + XServerCom("%s %s %d%s", "tournset", user, 1, "\n"); + XServerCom("%s%s", output, "\n"); + } + } + u->SavePlayer(userFilePath); + userList.Delete(u); + } + + return(1); +} //- End of HandleDisconnect + +//- AdjustManagerList ---------------------- +void Mamer::AdjustManagerList(int value, char *name) { + Storage *tmp=NULL, *newName=NULL; + LinkListIter managerIter(storageList); + FILE *theFile=NULL; + char filename[128], manager[NAMELEN]; + int added=0, needToAdd=1; + + memset(filename, '\0', 128); + sprintf(filename, "%s/managers", dataFilePath); + theFile = fopen(filename, "r"); + if(theFile == NULL) return; + + memset(manager, '\0', NAMELEN); + while(fscanf(theFile, "%s", manager) > 0) { // build the temporary list + tmp = new Storage(manager, 0); + storageList.Append(tmp); + tmp = NULL; + memset(manager, '\0', NAMELEN); + } + fclose(theFile); + + switch(value) { + case -1: + managerIter.Reset(); // remove a manager from the list that is printed later + while((tmp = managerIter.Next())) + if(strlen(tmp->name) == strlen(name)) + if(0 == (strcasecmp(tmp->name, name))) + storageList.Delete(tmp); + XServerCom("%s %s\n", "- mamermgr", name); + break; + case 1: + newName = new Storage(name, 0); + added = 0; // Add a user to the manager list that is later printed + needToAdd = 1; + managerIter.Reset(); // Got through the list see if the name is there + while((tmp = managerIter.Next())) + if(strlen(tmp->name) == strlen(newName->name)) + if(0 == strcasecmp(tmp->name, newName->name)) { + needToAdd = 0; + break; + } + if(needToAdd) { // If its not there we have to add it + managerIter.Reset(); + while((tmp = managerIter.Next())) // if the name in the list is > new name + if((strncasecmp(tmp->name, newName->name, MIN(strlen(tmp->name), strlen(newName->name)))) > 0) { + added = 1; + storageList.Insert(tmp, newName); // insert the new name before the list name + break; + } + if(!added) storageList.Append(newName); + XServerCom("%s %s\n", "+ mamermgr", name); + } + break; + default: + break; + } + theFile = fopen(filename, "w"); + if(!theFile) return; + managerIter.Reset(); // Lets write the new manager file + while((tmp = managerIter.Next())) { + fprintf(theFile, "%s\n", tmp->name); + storageList.Delete(tmp); + } + fclose(theFile); + // if(newName != NULL) delete(newName); +} + +//- UserIsLoaded -------------------------- +int Mamer::UserIsLoaded(char *uname) { + User *u = NULL; + LinkListIter userIter(userList); + + while((u = userIter.Next())) { + if(0 == strcasecmp(u->name, uname)) + return 1; + } + + return 0; +}//- end UserIsLoaded ------------------------------------------------------ + +/* this function checks if the user is loaded and if not loads the user */ +//- CheckUser --------------------------------------------------------------- +void Mamer::CheckUser(char *user) { + if(!UserIsLoaded(user)) { + if(debugLevel >= 5) + cout << "CheckUser - Adding User:" << user << ":" << endl; + + User *newUser = NULL; + newUser = new User(userFilePath, user); + if(NULL != newUser) + userList.Append(newUser); + } +}//- end of CheckUser ----------------------------------------------------- + +//- HandleGame ------------------------------------------------------------ +int Mamer::HandleGame(char *message) { + char *p, *q, user1[NAMELEN], user2[NAMELEN], action[256], result[8], tmp[256]; + int gameNumber, clocktime, inc, rated, isPrivate, result_code, moreGames=1, moreRounds=1, madeMoreGames=0, gameType=-2; + Tourney *t = NULL; + Game *g = NULL; + TourneyPlayers *tp = NULL; + + // {Game 8 (Blammor vs. Havard) Blammor resigns} 0-1 + + sscanf(message, "{Game %d (%s vs. %s", &gameNumber, user1, user2); + user2[strlen(user2)-1] = '\0'; + + if((p = strchr(message, ')'))) { + q = action; p++; p++; + while((*p != '\0') && (*p != '}')) { *q++ = *p++; } + *q = '\0'; + } else { return 0; } + + memset(result, '\0', 8); + if((p = strchr(message, '}')) && + ((strstr(message, ") Creating ") == NULL) && (strstr(message, ") Continuing ") == NULL))) { + // sscanf(p, "} %s [%d %d %d %d", result, &clocktime, &inc, &rated, &isPrivate); + sscanf(p, "} %s [%d %d %d %d %d", result, &clocktime, &inc, &rated, &isPrivate, &gameType); + + if(!strcmp(result, "1-0")) { result_code = 1; + } else if(!strcmp(result, "0-1")) { result_code = 0; + } else if(!strcmp(result, "1/2-1/2")) { result_code = 2; + } else { result_code = -1; } + + if(debugLevel >= 5) + // printf("\nGame #%d %s vs. %s action=%s result=%s time=%d inc=%d rated=%d private=%d\n", + // gameNumber, user1, user2, action, result, clocktime, inc, rated, isPrivate); + printf("\nGame #%d %s vs. %s action=%s result=%s time=%d inc=%d rated=%d private=%d gameType=%d\n", + gameNumber, user1, user2, action, result, clocktime, inc, rated, isPrivate, gameType); + + LinkListIter tourneyIter(tourneyList); + tourneyIter.Reset(); + while((t = tourneyIter.Next())) { + if(t->GetStatus() != CLOSED) continue; + LinkListIter gameIter(t->gameList); + gameIter.Reset(); + while((g = gameIter.Next())) { + if(g->IsGame(user1, user2, clocktime, inc, rated, 'r')) { //- There is room to add isPrivate later + XServerCom("%s %i %s %s %s %s%i %s %s %s\n", "tell", channelNumber, g->whiteName, "vs.", g->blackName, + "a game in tourney #", t->number, "just ended. ", action, result); + if(strcmp(result, "*") == 0) { + g->gameNumber = -1; + continue; + } + moreGames = t->SetGameResult(user1, user2, result_code); //- SetGameResult deletes the game for us + if(moreGames == 2) { + moreRounds = (t->GetRoundsRemaining()); + LinkListIter playerIter(t->playerList); + playerIter.Reset(); + if(moreRounds) { + madeMoreGames = t->MakeAssignments(); + while((tp = playerIter.Next())) { + sprintf(tmp, "%s tells you: listplayers %d\n", tp->name, t->number); + HandleTell(tmp); + } + if(madeMoreGames) { + t->TellThemWhoTheyPlay(); + } else { // tourney over! + AnnounceTourneyEnd(t); + savePlayerData(t); + } + } else { // tourney over! + /* + while((tp = playerIter.Next())) { + sprintf(tmp, "%s tells you: listplayers %d\n", tp->name, t->number); + HandleTell(tmp); + } + */ + AnnounceTourneyEnd(t); + savePlayerData(t); + } + } + break; + } + } + } + } else { + XServerCom("%s %s %s", "getgi", user1, "\n"); + } + return(1); +} //- End of HandleGame + +//- HandleGameInfo ---------------------------------------------------------- +int Mamer::HandleGameInfo(char *message) { + char white[NAMELEN], black[NAMELEN], player[NAMELEN]; + int gameNumber, gameTime, inc, rated, isPrivate; + Tourney *t=NULL; + Game *g=NULL; + + sscanf(message, "*getgi %s %s %s %d %d %d %d %d*", player, white, black, + &gameNumber, &gameTime, &inc, &rated, &isPrivate); + + gameTime = gameTime / 600; // Values for getgi are in micro and nano seconds + inc = inc / 10; + + LinkListIter tourneyIter(tourneyList); + tourneyIter.Reset(); + while((t = tourneyIter.Next())) { + if(t->GetStatus() != CLOSED) continue; + LinkListIter gameIter(t->gameList); + gameIter.Reset(); + while((g = gameIter.Next())) { + if(g->IsGame(white, black, gameTime, inc, rated, 'r')) { //- There is room to add isPrivate later + if(g->gameNumber < 0){ + XServerCom("%s %i %s %s %s %s%i %s\n", "tell", channelNumber, white, "vs.", black, + "a game in tourney #", t->number, "just started."); + } else { + XServerCom("%s %i %s %s %s %s%i %s\n", "tell", channelNumber, white, "vs.", black, + "a game in tourney #", t->number, "just Restarted."); + } + g->gameNumber = gameNumber; + } + } + } + return(1); +} //- End of HandleGameInfo + +//- HandlePlayerInfo -------------------------------------------------------- +int Mamer::HandlePlayerInfo(char *message) { + char player[NAMELEN]; + int ratings[6], return_from_AddPlayer, tourneyNumber; + Tourney *t = NULL; + Player *p = NULL; + + sscanf(message, "*getpi %s %d %d %d %d %d %d*", // Scan in the info + player, &ratings[0], &ratings[2], &ratings[3], &ratings[1], &ratings[4], &ratings[5]); + + if(debugLevel >=15) + printf("Get Player Info: %s blitz=%d stand=%d light=%d wild=%d bug=%d suicide=%d\n", + player, ratings[2], ratings[3], ratings[1], ratings[0], ratings[4], ratings[5]); + + p = FindPending(player); + + if(p != NULL) { + tourneyNumber = p->value; // find out which tourney we want + t = FindTourney(tourneyNumber); // Get the tourney. If its in the list it should be valid + } else { + return 0; + } //Check for valid tourney is done in CommandEntry::JoinTourney + + return_from_AddPlayer = t->AddPlayer(player, ratings[t->GetVariant()], 0.0); + TellUser(JoinedTourney, player, return_from_AddPlayer); + if(return_from_AddPlayer == 1) + XServerCom("%s %s %d%s", "tournset", player, 1, "\n"); + pendingList.Delete(p); //This is safe cause to get here we had to find a Player p + + return 1; +} //- End of HandlePlayerInfo + +//- FindPending --------------------------------------------------------------- +Player *Mamer::FindPending(char *user) { + Player *p = NULL; + LinkListIter pendingIter(pendingList); + + while((p = pendingIter.Next())) + if(1 == p->IsPlayer(user)) + break; + + return(p); +} //- End of FindPending + +//- FindUser --------------------------------------------------------------- +User *Mamer::FindUser(char *user) { + User *u = NULL; + LinkListIter userIter(userList); + + // printf("FindUser: %18s\n", user); + + while((u = userIter.Next())) + if(1 == u->IsUser(user)) + break; + + return(u); +} //- End of FindUser + +//- FindTourney ------------------------------------------------------------ +Tourney *Mamer::FindTourney(int tourn) { + Tourney *t = NULL; + LinkListIter tourneyIter(tourneyList); + + while((t = tourneyIter.Next())) { + if(1 == t->IsTourney(tourn)) + break; + } + return(t); +} //- End of FindUser + +//- FindCommand --------------------------------------------------------------- +Command *Mamer::FindCommand(char *comm, char *user) { + Command *c = NULL, *cnull=NULL; + LinkListIter commIter(commandList); + int commandsFound=0; + char* output = NULL; + + output = new char[MAX_LINE_SIZE]; + memset(output, '\0', MAX_LINE_SIZE); + commIter.Reset(); + while((c = commIter.Next())) { + if(c->IsCommand(comm)) { + commandsFound++; + if((int)(strlen(output) + strlen(c->GetCommandName())) < (MAX_LINE_SIZE - 1)) + sprintf(output, "%s %s", output, c->GetCommandName()); + } + } + output[strlen(output)] = '\0'; + + commIter.Reset(); + while((c = commIter.Next())) + if(1 == c->IsCommand(comm)) + break; + + switch (commandsFound) { + case 0: + TellUser(BadCommand, user); + return(cnull); + case 1: + return(c); + default: + TellUser(MultiCommand, user, output); + return(cnull); + } +} //- End of FindUser + +/* + Parameter string format + w - a word + o - an optional word + d - integer + p - optional integer + i - word or integer + n - optional word or integer + s - string to end + t - optional string to end + + If the parameter option is given in lower case then the parameter is + converted to lower case before being passsed to the function. If it is + in upper case, then the parameter is passed as typed. + + Calling these Appends adds commands to the link list. They are called with: + 1) the text command Mamer should look for + 2) an alias or substitute for that text + 3) the manager level one needs to be to execute this command + 4) a BRIEF description of the command's function + 5) the parameter types for each parameter (see comments above) + 6) what code to use when telling the user they did something wrong (see TellUser) + 7) and the function pointer to the CommandEntry.cc code that is this command */ + +//- BuildCommandList --------------------------------------------------------- +void Mamer::BuildCommandList(void) { + commandList.Append(new Command("addchaos", "ac", MANAGER, "Adds (or subs) chaos points.", + "wp", (USERFP)&Mamer::AddAbuse)); + + commandList.Append(new Command("announce", "ann", DIRECTOR, "Announce the tournament to the working channel.", + "d", (USERFP)&Mamer::AnnounceTourney)); + + commandList.Append(new Command("addtotourney", "att", VICE, "Add a user to a tourney.", + "Wd", (USERFP)&Mamer::AddToTourney)); + + commandList.Append(new Command("create", "cr", DIRECTOR, "Creates a new tournament.", + "", (USERFP)&Mamer::CreateTourney)); + + commandList.Append(new Command("close", "cl", DIRECTOR, "Closes and starts a tournament.", + "d", (USERFP)&Mamer::CloseTourney)); + + commandList.Append(new Command("delete", "del", DIRECTOR, "Deletes a tournament.", + "d", (USERFP)&Mamer::DeleteTourney)); + + commandList.Append(new Command("finger", "fi", USER, "Displays the stats for a user.", + "O", (USERFP)&Mamer::FingerUser)); + + commandList.Append(new Command("forfeit", "fo", DIRECTOR, "Remove a user from a tourney.", + "wd", (USERFP)&Mamer::RemoveFromTourney)); + + commandList.Append(new Command("join", "j", USER, "Request to enter a tourney.", + "d", (USERFP)&Mamer::JoinTourney)); + + commandList.Append(new Command("keep", "k", MANAGER, "Keep a tourney in memory.", + "di", (USERFP)&Mamer::KeepTourney)); + + commandList.Append(new Command("listmanagers", "lm", USER, "Displays the Managers list.", + "", (USERFP)&Mamer::ListManagers)); + + commandList.Append(new Command("listtourneys", "lt", USER, "Displays the tournament list.", + "", (USERFP)&Mamer::ListTourneys)); + + commandList.Append(new Command("listtourneyvars", "vars", USER, "Displays the tournament variables.", + "d", (USERFP)&Mamer::ListTourneyVars)); + + commandList.Append(new Command("listtourneygames", "games", USER, "Displays the tournament games.", + "d", (USERFP)&Mamer::ListTourneyGames)); + + commandList.Append(new Command("listplayers", "lp", USER, "Displays the players in the tourney.", + "d", (USERFP)&Mamer::ListTourneyPlayers)); + + commandList.Append(new Command("listrank", "rank", USER, "Displays player rank.", + "n", (USERFP)&Mamer::ListRank)); + + commandList.Append(new Command("loadedusers", "lu", MANAGER, "Displays the loaded users.", + "", (USERFP)&Mamer::LoadedUsers)); + + commandList.Append(new Command("messman", "mm", VICE, "Message all of the Managers.", + "s", (USERFP)&Mamer::MessageManagers)); + + commandList.Append(new Command("open", "ot", DIRECTOR, "Opens the tournament to players.", + "d", (USERFP)&Mamer::OpenTourney)); + + commandList.Append(new Command("setcommandlevel", "setcl", VICE, "Set the level required to execute a command.", + "wd", (USERFP)&Mamer::SetCommandLevel)); + + commandList.Append(new Command("setinfo", "si", VICE, "Set a user's finger info.", + "Wddddddd", (USERFP)&Mamer::SetInfo)); + + commandList.Append(new Command("setmanagerlevel", "sml", VICE, "Sets manager's level.", + "Wd", (USERFP)&Mamer::SetManagerLevel)); + + commandList.Append(new Command("setres", "sr", DIRECTOR, "Sets the result of a game.", + "dWWi", (USERFP)&Mamer::SetResult)); + + commandList.Append(new Command("setstat", "ss", VICE, "Sets a specific finger stat.", + "Wwd", (USERFP)&Mamer::SetStat)); + + commandList.Append(new Command("settourneyvar", "stv", DIRECTOR, "Sets a Tourney's Variables.", + "dwi", (USERFP)&Mamer::SetTourneyVariable)); + + commandList.Append(new Command("showcommands", "sc", USER, "List commands and descripts.", + "o", (USERFP)&Mamer::ShowCommands)); + + commandList.Append(new Command("showhelpfile", "shf", USER, "Shows a help file.", + "o", (USERFP)&Mamer::ShowHelp)); + + commandList.Append(new Command("help", "help", USER, "Shows a help file.", + "o", (USERFP)&Mamer::ShowHelp)); + + commandList.Append(new Command("shutdown", "sd", VICE, "Shuts down Mamer.", + "", (USERFP)&Mamer::Shutdown)); + + commandList.Append(new Command("who", "who", USER, "Displays the tournament games.", + "d", (USERFP)&Mamer::ListTourneyPlayers)); + + commandList.Append(new Command("withdraw", "with", USER, "Remove yourself from a tourney.", + "d", (USERFP)&Mamer::RemoveFromTourney)); + +} //- End of BuildCommandList + +//- NextRound ------------------------- +void Mamer::NextRound() { + int moreGames=0, moreRounds=1, madeMoreGames=0; + Tourney *t = NULL; + Game *g = NULL; + + LinkListIter tourneyIter(tourneyList); + tourneyIter.Reset(); + while((t = tourneyIter.Next())) { + if(t->GetStatus() != CLOSED) continue; + moreRounds = (t->GetRoundsRemaining()); + moreGames = 0; + LinkListIter gameIter(t->gameList); + gameIter.Reset(); + while((g = gameIter.Next())) moreGames++; + + if(moreGames == 0) { + if(debugLevel >= 10) + cout << "No more games! Next Round Please! From Next Round" << endl; + cerr << "No more games! Next Round Please! From Next Round" << endl; + if(moreRounds) { + madeMoreGames = t->MakeAssignments(); + if(madeMoreGames) + t->TellThemWhoTheyPlay(); + else { // tourney over! + cerr << "Coulnd't make any more games. End of Tourney. From Next Round" << endl; + AnnounceTourneyEnd(t); + savePlayerData(t); + } + } else { // tourney over! + cerr << "No more rounds. End of Tourney. From Next Round" << endl; + AnnounceTourneyEnd(t); + savePlayerData(t); + } + } + } +} //- End of NextRound + +//- XServerCom --------------------------------------------- +int Mamer::XServerCom(char *fmt, ...) +{ + va_list argptr; + char buffer[1024]; + int count; + + va_start(argptr, fmt); + count = vsprintf(buffer, fmt, argptr); + write(serverSocket, buffer, strlen(buffer)); + va_end(argptr); + + /* returns number of elements written */ + return (count); +} +//- End of XServerCom + +//- TellUser ------------------------------------------------ +void Mamer::TellUser(reasons reason, char *name) { + switch (reason) { + case NoPermissions: + XServerCom("qtell %s %s notes: Sorry you do not have permission to do that.\n", name, username); + break; + case BadCommand: + XServerCom("qtell %s %s notes: Command not found.\n", name, username); + break; + default: + break; + } +}//- End of TellUser + +//- TellUser ------------------------------------------------ +void Mamer::TellUser(reasons reason, char *name, int number) { + switch (reason) { + case JoinedTourney: + switch (number) { + case 0: + XServerCom("qtell %s %s notes: %s\n", name, username, + "Can not join\\nYour rating does not fit into current limits. "); + break; + case 1: + XServerCom("qtell %s %s notes: %s\n", name, username, "You joined the tournament."); + break; + case 2: + XServerCom("qtell %s %s notes: %s\n", name, username, "You are already in this tourney."); + break; + case 3: + XServerCom("qtell %s %s notes: %s\n", name, username, "You can not join. Tourney is not open."); + break; + default: + break; + } + break; + case NotEnoughPlayers: + XServerCom("qtell %s %s notes: Tourney#%d %s\n", name, username, number, "does not have enough players."); + break; + case NoPlayers: + XServerCom("qtell %s %s notes: Tourney#%d %s\n", name, username, number, "has no players."); + break; + case WillKeepTourney: + XServerCom("qtell %s %s notes: Tourney#%d %s\n", name, username, number, "will be kept."); + break; + case NotKeepTourney: + XServerCom("qtell %s %s notes: Tourney#%d %s\n", name, username, number, "will not be kept."); + break; + case TourneyNotFound: + XServerCom("qtell %s %s notes: %s%d %s\n", name, username, "Tourney #", number, "not found."); + break; + case NotFound: + XServerCom("qtell %s %s notes: %s%d\n", name, username, "Player not found in tourney #", number); + break; + case GameResultNotFound: + XServerCom("qtell %s %s notes: %s%d\n", name, username, "Can not set result to ", number); + break; + case NoPermissions: + XServerCom("qtell %s %s notes: You don't have change permissions for tourney #%d.\n", name, username, number); + break; + case TourneyNotNew: + XServerCom("qtell %s %s notes: %s %s%d %s\n", name, username, "Can not do that right now.", + "Tourney #", number, "is not new."); + break; + case TourneyNotOpen: + XServerCom("qtell %s %s notes: %s %s%d %s\n", name, username, "Can not do that right now.", + "Tourney #", number, "is not open."); + break; + case TourneyNotClosed: + XServerCom("qtell %s %s notes: %s %s%d %s\n", name, username, "Can not do that right now.", + "Tourney #", number, "is not closed."); + break; + case TourneyDone: + XServerCom("qtell %s %s notes: %s %s%d %s\n", name, username, "Can not do that anymore.", + "Tourney #", number, "is done."); + break; + case TourneyClosed: + XServerCom("qtell %s %s notes: %s %s%d %s\n", name, username, "Can not do that anymore.", + "Tourney #", number, "is closed."); + break; + case TourneyDeleted: + XServerCom("qtell %s %s Notes: %s %s%d %s\n", name, username, "\\n", "Tourney #", + number, " has been deleted."); + break; + default: + break; + } +}//- End of TellUser + +//- TellUser ------------------------------------------------ +void Mamer::TellUser(Command *comm, char *name) { + char line[512]; + int i, length=strlen(comm->parameterList); + + sprintf(line, "qtell %s %s notes: Usage: %s ", name, username, comm->GetCommandName()); + + for(i=0; iparameterList[i]) { + case 'w': + strcat(line, " "); + break; + case 'o': + strcat(line, " "); + break; + case 'd': + strcat(line, " "); + break; + case 'p': + strcat(line, " "); + break; + case 'i': + strcat(line, " "); + break; + case 'n': + strcat(line, " "); + break; + case 's': + strcat(line, " "); + break; + case 't': + strcat(line, " "); + break; + default: + break; + } + } + strcat(line, "\n"); + write(serverSocket, line, strlen(line)); +}//- End of TellUser + +//- TellUser ------------------------------------------------ +void Mamer::TellUser(reasons reason, char *name, char *request) { + switch (reason) { + case NotFound: + XServerCom("qtell %s %s notes: Sorry %s is not found.\n", name, username, request); + break; + case GenericTell: + XServerCom("qtell %s %s notes: %s\n", name, username, request); + break; + case ChangedInfo: + XServerCom("qtell %s %s notes: Changed the info for %s.\n", name, username, request); + break; + case GameResultNotFound: + XServerCom("qtell %s %s notes: %s %s\n", name, username, "Can not set result to", request); + break; + case MultiCommand: + XServerCom("qtell %s %s notes: Ambiguous Command Matches:\\n %s\n", name, username, request); + break; + default: + break; + } +}//- End of TellUser + +//- TellUser ------------------------------------------------ +void Mamer::TellUser(reasons reason, char *name, char *who, char *which, int new_value) { + switch (reason) { + case ChangedInfo: + XServerCom("qtell %s %s notes: Changed the %s stat for %s to %d.\n", name, username, which, who, new_value); + break; + case GameResultSet: + switch (new_value) { + case 1: + XServerCom("qtell %s %s notes: The game %s(w) vs. %s(b) has been set to 1-0\n", name, username, who, which); + break; + case 0: + XServerCom("qtell %s %s notes: The game %s(w) vs. %s(b) has been set to 0-1\n", name, username, who, which); + break; + default: + XServerCom("qtell %s %s notes: The game %s(w) vs. %s(b) has been set to 1/2-1/2\n", name, username, who, which); + break; + } + break; + default: + break; + } +}//- End of TellUser + +//- TellUser ------------------------------------------------ +void Mamer::TellUser(reasons reason, char *name, char *which, char *new_value) { + switch (reason) { + case CanNotChange: + XServerCom("qtell %s %s notes: Can not change the %s var to %s.\n", name, username, which, new_value); + break; + case ChangedInfo: + XServerCom("qtell %s %s notes: Changed %s to %s.\n", name, username, which, new_value); + break; + default: + break; + } +}//- End of TellUser + + +//- TellUser ------------------------------------------------ +void Mamer::TellUser(reasons reason, char *name, char *uname, int new_value) { + switch (reason) { + case ChangedManagerLevel: + XServerCom("qtell %s %s notes: %s's Manager Level has been changed to %d\n", name, username, uname,new_value); + break; + case ChangedCommandLevel: + XServerCom("qtell %s %s notes: The %s command's manager Level has been changed to %d\n",name,username,uname, new_value); + break; + case PlayerRemoved: + XServerCom("qtell %s %s notes: %s Has been removed from tourney #%i\n", name, username, uname, new_value); + break; + case NotFound: + XServerCom("qtell %s %s notes: %s Is not found in tourney #%i\n", name, username, uname, new_value); + break; + case ChangedAbuse: + XServerCom("qtell %s %s notes: %s's Chaos Points have been changed to %d\n",name, username, uname, new_value); + break; + case CanNotChange: + XServerCom("qtell %s %s notes: Can Not Change the %s stat to %d.\n", name, username, uname, new_value); + break; + case ChangedInfo: + XServerCom("qtell %s %s notes: Changed %s to %d.\n", name, username, uname, new_value); + break; + default: + break; + } +}//- End of TellUser + +//- ParseParams ---------------------------------------------- +int Mamer::ParseParams(Command *comm, char *parameters) { + int i, parlen; + int paramLower; + char c; + + for (i = 0; i < MAXNUMPARAMS; i++) + comm->params[i].type = TYPE_NULL; /* Set all parameters to NULL */ + parlen = strlen(comm->parameterList); + parameters = eatWhite(parameters); /* remove and spaces before the command */ + parameters = eatWord(parameters); /* remove the command itself */ + for (i = 0; i < parlen; i++) { + c = comm->parameterList[i]; + if (isupper(c)) { + paramLower = 0; + c = tolower(c); + } else { + paramLower = 1; + } + switch (c) { + case 'w': + case 'o': /* word or optional word */ + parameters = eatWhite(parameters); + if (!*parameters) + return (c == 'o' ? COM_OK : COM_BADPARAMETERS); + comm->params[i].val.word = parameters; + comm->params[i].type = TYPE_WORD; + parameters = eatWord(parameters); + if (*parameters != '\0') { + *parameters = '\0'; + parameters++; + } + if (paramLower) + stolower(comm->params[i].val.word); + break; + + case 'd': + case 'p': /* optional or required integer */ + parameters = eatWhite(parameters); + if (!*parameters) + return (c == 'p' ? COM_OK : COM_BADPARAMETERS); + if (sscanf(parameters, "%d", &comm->params[i].val.integer) != 1) + return COM_BADPARAMETERS; + comm->params[i].type = TYPE_INT; + parameters = eatWord(parameters); + if (*parameters != '\0') { + *parameters = '\0'; + parameters++; + } + break; + + case 'i': + case 'n': /* optional or required word or integer */ + parameters = eatWhite(parameters); + if (!*parameters) + return (c == 'n' ? COM_OK : COM_BADPARAMETERS); + if (sscanf(parameters, "%d", &comm->params[i].val.integer) != 1) { + comm->params[i].val.word = parameters; + comm->params[i].type = TYPE_WORD; + } else { + comm->params[i].type = TYPE_INT; + } + parameters = eatWord(parameters); + if (*parameters != '\0') { + *parameters = '\0'; + parameters++; + } + if (comm->params[i].type == TYPE_WORD) + if (paramLower) + stolower(comm->params[i].val.word); + break; + + case 's': + case 't': /* optional or required string to end */ + if (!*parameters) + return (c == 't' ? COM_OK : COM_BADPARAMETERS); + comm->params[i].val.string = parameters; + comm->params[i].type = TYPE_STRING; + while (*parameters) + parameters = nextWord(parameters); + if (paramLower) + stolower(comm->params[i].val.string); + break; + } + } + if (*parameters) + return COM_BADPARAMETERS; + else + return COM_OK; +} //- End ParseParams ------------------ + +//- isWhiteSpace ------------------------------------------- +int Mamer::isWhiteSpace (int c) { + if ((c < ' ') || (c == '\b') || (c == '\n') || + (c == '\t') || (c == ' ')) { /* white */ + return 1; + } else { + return 0; + } +} //- End isWhiteSpace ------- + +//- getWord ------------------------------------------------ +char *Mamer::getWord (char *str) { + int i; + static char word[MAX_WORD_SIZE]; + + i = 0; + while (*str && !isWhiteSpace(*str)) { + word[i] = *str; + str++; + i++; + if (i == MAX_WORD_SIZE) { + i = i - 1; + break; + } + } + word[i] = '\0'; + return word; +} //- End getWord ------------- + +//- eatWord ------------------------------------------- +char *Mamer::eatWord (char *str) { + while (*str && !isWhiteSpace(*str)) + str++; + return str; +} //- eatWord ---- + +//- eatWhite ------------------------------------------ +char *Mamer::eatWhite (char *str) { + while (*str && isWhiteSpace(*str)) + str++; + return str; +} //- eatWhite -------- + +//- eatTailWhite ------------------------------------------- +char *Mamer::eatTailWhite (char *str) { + int len; + if (str == NULL) + return NULL; + + len = strlen(str); + while (len > 0 && isWhiteSpace(str[len - 1])) + len--; + str[len] = '\0'; + return (str); +} //- End of eatTailWhite ----------- + +//- nextWord ----------------------------------------------- +char *Mamer::nextWord(char *str) { + return eatWhite(eatWord(str)); +} //- End of nextWord + +char *Mamer::stolower(char *str) { + int i; + + if (!str) + return NULL; + for (i = 0; str[i]; i++) { + if (isupper(str[i])) { + str[i] = tolower(str[i]); + } + } + return str; +} + +//- GenerateTourneyNumber ---------------------------------------------- +int Mamer::GenerateTourneyNumber(void) { + Tourney *t = NULL; + int maxT = 0, used=0, i, count=0; + LinkListIter tourneyIter(tourneyList); + + if(NULL != tourneyList.Head()) { + while((t = tourneyIter.Next())) + count++; + + for(i=1; i<=count; i++) { + used = 0; + tourneyIter.Reset(); + while((t = tourneyIter.Next())) { + if(i == t->number) + used = 1; + if(t->number > maxT) + maxT = t->number; + } + if(!used) + return i; + } + return(maxT + 1); + } + + return(1); +} + + +// $Log: Mamer.cc,v $ +// Revision 1.19 2002/07/02 00:05:19 tridge +// got rid of a bunch of RCS tags now that its in CVS +// +// Revision 1.18 2002/07/02 00:02:40 tridge +// - fixed compile on g++ 2.96 +// - updated for lasker 'rmatch' +// +// Revision 1.17 1998/09/10 19:57:17 mlong +// lots of little bug fixes and a few new features +// +// Revision 1.16 1998/08/04 21:02:13 mlong +// changes to correct a few bugs including the this->* change that +// correctly uses the function pointers now +// +// Revision 1.15 1998/06/18 18:41:30 mlong +// prepairing for yet another move. +// +// Revision 1.14 1998/06/04 19:55:00 mlong +// quick change to the load config file stuff to +// allow for a commented out line +// +// Revision 1.13 1998/04/29 15:23:19 mlong +// prepairing for the move to daimi +// new sorting routine. +// +// Revision 1.12 1998/04/18 18:46:04 mlong +// fixed delete bug & +// added delete tourney function +// +// Revision 1.11 1998/04/17 00:14:37 mlong +// fixes to the setres working with the Link delete method +// +// Revision 1.7 1997/10/22 19:47:38 mlong +// fixed bug for parsing tells into user and command. +// +// Revision 1.6 1997/10/08 21:03:35 chess +// preparing for move to oracle machine at eworks. +// +// Revision 1.5 1997/05/15 18:27:53 chess +// added Player and TourneyPlayers support +// added HandleGetPlayerInfo & HandleetGameInfo +// +// Revision 1.4 1997/04/13 03:14:35 chess +// commands to do user stats manipulation added +// also TellUser function added to make for easier reporting and bug checking +// also added ParseParams that takes the commands parameter list definition +// and parses out the input from the user to determine if the paramters +// supplied are correct. If so it then sends those params to the +// command. +// +// Revision 1.3 1997/03/21 15:31:04 moses +// added the cleanup of commands +// added the cleanup of tourneys +// added the mamer shutdown command +// +// Revision 1.2 1996/10/01 20:14:43 moses +// Changes to incorparte the new usage of the command list +// +// Revision 1.1 1996/09/30 20:52:48 moses +// Initial revision +// diff --git a/lasker-2.2.3/bots/mamer/Mamer.hh b/lasker-2.2.3/bots/mamer/Mamer.hh new file mode 100644 index 0000000..a8b8cab --- /dev/null +++ b/lasker-2.2.3/bots/mamer/Mamer.hh @@ -0,0 +1,205 @@ +//-------------------------------------------------------------------------- +// Mamer.hh - Class header for the Mamer class +// +// Matthew E. Moses & Michael A. Long +// +// $Revision: 1.13 $ +// $Date: 2002/07/02 00:05:19 $ +// +// $Log: Mamer.hh,v $ +// Revision 1.13 2002/07/02 00:05:19 tridge +// got rid of a bunch of RCS tags now that its in CVS +// +// Revision 1.12 2002/07/02 00:02:40 tridge +// - fixed compile on g++ 2.96 +// - updated for lasker 'rmatch' +// +// Revision 1.11 1998/09/10 19:58:41 mlong +// lots of little bug fixes and a few new features. +// +// Revision 1.10 1998/06/18 18:41:52 mlong +// prepairing for yet another move. +// +// Revision 1.9 1998/04/29 15:24:07 mlong +// prepairing for the move to daimi +// new sorting routine. +// +// Revision 1.8 1998/04/18 18:46:31 mlong +// fixed delete bug and +// added delete tourney function +// +// Revision 1.5 1997/05/15 18:29:12 chess +// added pending and TourneyPlayers support +// added HandleGetPlayerInfo & HandleGetGameInfo +// +// Revision 1.4 1997/04/13 03:21:32 chess +// TellUser and ParseParams added +// +// Revision 1.3 1997/03/21 15:31:49 moses +// added some defines to support the solaris sun compile +// +// Revision 1.2 1996/10/01 20:14:43 moses +// Changes to support the new command list, +// to correctly have the commands, I had to derive this class from the +// CommandEntry class +// +// Revision 1.1 1996/09/30 20:52:48 moses +// Initial revision +// +//-------------------------------------------------------------------------- + +#ifndef _MAMER_ +#define _MAMER_ + +#include +#include + +extern "C" { +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +} + +#ifdef SUN +#define INADDR_NONE -1 +#endif + +#include "config.h" +#include "link.hh" +#include "linklist.hh" +#include "User.hh" +#include "Tourney.hh" +#include "Command.hh" +#include "CommandEntry.hh" +#include "Player.hh" +#include "Game.hh" +#include "Storage.hh" +#include "types.h" + +extern char *optarg; +extern int optind; + +#define TRUE 1 +#define FALSE 0 + +//#define MAX(X,Y) ((X) > (Y) ? (X) : (Y)) +//#define MIN(X,Y) ((X) < (Y) ? (X) : (Y)) + +class Mamer : public CommandEntry { + public: + + Mamer(); + ~Mamer(); + + int Initialize(int argc, char **argv); + char *s_and_r(char *, char *, char *); + int OpenServerConnection(void); + void ListenLoop(void); + void Shutdown(void); + int GivePlace(int, Tourney *); + void AnnounceTourneyEnd(Tourney *); + void savePlayerData(Tourney *); + + void DumpConfiguration(void); + + int XServerCom(char *, ...); + void TellUser(reasons, char *); + void TellUser(Command *, char *); + void TellUser(reasons, char *, char *); + void TellUser(reasons, char *, int); + void TellUser(reasons, char *, char *, int); + void TellUser(reasons, char *, char *, char *); + void TellUser(reasons, char *, char *, char *, int); + +#define MAX_WORD_SIZE 1024 +#define MAX_LINE_SIZE 1024 + + int UserIsLoaded(char *); + int ParseParams(Command *, char *); + int isWhiteSpace(int); + char *getWord(char *); + char *eatWord(char *); + char *eatWhite(char *); + char *eatTailWhite(char *); + char *nextWord(char *); + char *stolower(char *); + + int GenerateTourneyNumber(void); + + Tourney *FindTourney(int); + User *FindUser(char *); + Command *FindCommand(char *, char *); + +private: + void Usage(void); + void LoadConfigurationFile(void); + void BuildCommandList(void); + void CheckUser(char *); + void AdjustManagerList(int, char *); + + int HandleQtell(char *); + int HandleTell(char *); + int HandleChannel(char *); + int HandleConnect(char *); + int HandleDisconnect(char *); + int HandleGame(char *); + int HandleGameInfo(char *); + int HandlePlayerInfo(char *); + + void NextRound(); + + Player *FindPending(char *); + +public: + char configFilename[MAXPATHLEN]; + + char hostname[256]; + int portNumber; + int channelNumber; + char username[80]; + char password[80]; + + int serverSocket; + + int debugLevel; + + char logFilename[MAXPATHLEN]; + char dataFilePath[MAXPATHLEN]; + char homeFilePath[MAXPATHLEN]; + char userFilePath[MAXPATHLEN]; + char helpFilePath[MAXPATHLEN]; + + short loggedInFlag; + + long countOfTourneysSinceRestart; + + TourneyParameters tourneyParams; + + LinkList tourneyList; + LinkList pendingList; + LinkList userList; + LinkList commandList; + LinkList storageList; +}; + +#endif diff --git a/lasker-2.2.3/bots/mamer/Player.cc b/lasker-2.2.3/bots/mamer/Player.cc new file mode 100644 index 0000000..b6fd181 --- /dev/null +++ b/lasker-2.2.3/bots/mamer/Player.cc @@ -0,0 +1,78 @@ +//-------------------------------------------------------------------------- +// Player.cc - Source file for the Player class +// +// Matthew E. Moses && Michael A. Long +// +// $Revision: 1.4 $ +// $Date: 1998/09/10 19:57:17 $ +// +// $Author: mlong $ +// $Locker: $ +// +// $Log: Player.cc,v $ +// Revision 1.4 1998/09/10 19:57:17 mlong +// lots of little bug fixes and a few new features +// +// Revision 1.3 1998/02/12 18:44:04 mlong +// .. +// +// Revision 1.2 1997/10/08 21:03:35 chess +// preparing for move to oracle machine at eworks. +// +// Revision 1.1 1997/05/16 03:22:36 chess +// Initial revision +// +// Revision 1.1 1997/05/14 17:00:30 chess +// Initial revision +// +// +//-------------------------------------------------------------------------- + +// static char RCSid[] = "$Id: Player.cc,v 1.4 1998/09/10 19:57:17 mlong Exp $"; + +#include "Player.hh" + +//- Constructor ----------------------------------------------------------- +Player::Player(char *n, int wt) { + strcpy(name, n); + value = wt; +} + +//- Constructor ----------------------------------------------------------- +Player::Player(char *n, float wt) { + strcpy(name, n); + floatValue = wt; +} + +//- Constructor ----------------------------------------------------------- +Player::Player(char *n, double wt) { + strcpy(name, n); + floatValue = wt; +} + +//- Constructor ----------------------------------------------------------- +Player::Player(char *n, float f, int i) { + strcpy(name, n); + floatValue = f; + value = i; +} + +//- Constructor ----------------------------------------------------------- +Player::Player(char *n, float f, int i, int r) { + strcpy(name, n); + floatValue = f; + value = i; + rating = r; +} + +//- DeConstructor --------------------------------------------------------- +Player::~Player() { +} + +//- IsPlayer ----------------------------------------------------------------- +int Player::IsPlayer(char *user) { + if(0 == strcasecmp(user, name)) + return(1); + else + return(0); +} //- End of IsPlayer diff --git a/lasker-2.2.3/bots/mamer/Player.hh b/lasker-2.2.3/bots/mamer/Player.hh new file mode 100644 index 0000000..917c905 --- /dev/null +++ b/lasker-2.2.3/bots/mamer/Player.hh @@ -0,0 +1,91 @@ +//-------------------------------------------------------------------------- +// Player.hh - Class header for the Player class +// +// Matthew E. Moses & Michael A. Long +// +// $Revision: 1.4 $ +// $Date: 2002/07/02 00:02:40 $ +// +// $Author: tridge $ +// $Locker: $ +// +// $Log: Player.hh,v $ +// Revision 1.4 2002/07/02 00:02:40 tridge +// - fixed compile on g++ 2.96 +// - updated for lasker 'rmatch' +// +// Revision 1.3 1998/02/12 18:44:25 mlong +// *** empty log message *** +// +// Revision 1.2 1997/11/11 16:48:06 chess +// *** empty log message *** +// +// Revision 1.2 1997/10/23 19:56:12 chess +// *** empty log message *** +// +// Revision 1.1 1997/05/16 03:22:36 chess +// Initial revision +// +// +// +//-------------------------------------------------------------------------- + +#ifndef _Player_ +#define _Player_ + +#include +#include + +extern "C" { +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +} + +#include "config.h" +#include "User.hh" +#include "link.hh" +#include "linklist.hh" + +class Player : public Link { +public: + + Player(char *, int); + Player(char *, float); + Player(char *, double); + Player(char *, float, int); + Player(char *, float, int, int); + ~Player(); + +int IsPlayer(char *); + +private: + +public: + + char name[NAMELEN]; + int value; + double floatValue; + int rating; + +private: + +}; + + +#endif + + + + + + diff --git a/lasker-2.2.3/bots/mamer/Storage.cc b/lasker-2.2.3/bots/mamer/Storage.cc new file mode 100644 index 0000000..ebd3f4c --- /dev/null +++ b/lasker-2.2.3/bots/mamer/Storage.cc @@ -0,0 +1,58 @@ +//-------------------------------------------------------------------------- +// Storage.cc - Source file for the Storage class +// +// Matthew E. Moses && Michael A. Long +// +// $Revision: 1.1 $ +// $Date: 1998/09/10 19:57:17 $ +// +// $Author: mlong $ +// $Locker: $ +// +// $Log: Storage.cc,v $ +// Revision 1.1 1998/09/10 19:57:17 mlong +// Initial revision +// +// +//-------------------------------------------------------------------------- + +// static char RCSid[] = "$Id: Storage.cc,v 1.1 1998/09/10 19:57:17 mlong Exp $"; + +#include "Storage.hh" + +//- Constructor ----------------------------------------------------------- +Storage::Storage(char *n, int wt) { + strcpy(name, n); + value = wt; +} + +//- Constructor ----------------------------------------------------------- +Storage::Storage(char *n, float wt) { + strcpy(name, n); + floatValue = wt; +} + +//- Constructor ----------------------------------------------------------- +Storage::Storage(char *n, double wt) { + strcpy(name, n); + floatValue = wt; +} + +//- Constructor ----------------------------------------------------------- +Storage::Storage(char *n, float f, int i) { + strcpy(name, n); + floatValue = f; + value = i; +} + +//- Constructor ----------------------------------------------------------- +Storage::Storage(char *n, float f, int i, int r) { + strcpy(name, n); + floatValue = f; + value = i; + rating = r; +} + +//- DeConstructor --------------------------------------------------------- +Storage::~Storage() { +} diff --git a/lasker-2.2.3/bots/mamer/Storage.hh b/lasker-2.2.3/bots/mamer/Storage.hh new file mode 100644 index 0000000..efb5394 --- /dev/null +++ b/lasker-2.2.3/bots/mamer/Storage.hh @@ -0,0 +1,87 @@ +//-------------------------------------------------------------------------- +// Storage.hh - Class header for the Storage class +// +// Matthew E. Moses & Michael A. Long +// +// $Revision: 1.1 $ +// $Date: 1998/09/10 19:58:41 $ +// +// $Author: mlong $ +// $Locker: $ +// +// $Log: Storage.hh,v $ +// Revision 1.1 1998/09/10 19:58:41 mlong +// Initial revision +// +// Revision 1.3 1998/02/12 18:44:25 mlong +// *** empty log message *** +// +// Revision 1.2 1997/11/11 16:48:06 chess +// *** empty log message *** +// +// Revision 1.2 1997/10/23 19:56:12 chess +// *** empty log message *** +// +// Revision 1.1 1997/05/16 03:22:36 chess +// Initial revision +// +// +// +//-------------------------------------------------------------------------- + +#ifndef _Storage_ +#define _Storage_ + +#include +#include + +extern "C" { +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +} + +#include "config.h" +#include "User.hh" +#include "link.hh" +#include "linklist.hh" + +class Storage : public Link { +public: + + Storage(char *, int); + Storage(char *, float); + Storage(char *, double); + Storage(char *, float, int); + Storage(char *, float, int, int); + ~Storage(); +private: + +public: + + char name[NAMELEN]; + int value; + double floatValue; + int rating; + +private: + +}; + + +#endif + + + + + + diff --git a/lasker-2.2.3/bots/mamer/Tourney.cc b/lasker-2.2.3/bots/mamer/Tourney.cc new file mode 100644 index 0000000..0532f44 --- /dev/null +++ b/lasker-2.2.3/bots/mamer/Tourney.cc @@ -0,0 +1,1014 @@ +//-------------------------------------------------------------------------- +// Tourney.cc - Source file for Tourney class +// +// Matthew E. Moses +// +// $Revision: 1.12 $ +// $Date: 2002/07/02 00:02:40 $ +// +// $Author: tridge $ +// $Locker: $ +// +// $Log: Tourney.cc,v $ +// Revision 1.12 2002/07/02 00:02:40 tridge +// - fixed compile on g++ 2.96 +// - updated for lasker 'rmatch' +// +// Revision 1.11 1998/09/10 19:57:17 mlong +// lots of little bug fixes and a few new features +// +// Revision 1.10 1998/04/29 15:23:19 mlong +// prepairing for the move to daimi +// new sorting routine. +// +// Revision 1.9 1998/04/18 20:05:14 mlong +// fixed BYE bug +// +// Revision 1.8 1998/04/18 18:46:04 mlong +// fixed delete bug & +// added delete tourney function +// +// Revision 1.4 1997/10/08 21:03:35 chess +// preparing for move to oracle machine at eworks. +// +// Revision 1.3 1997/05/15 18:27:53 chess +// added pending and TourneyPlayers support +// added HandleGetPlayerInfo & HandleGetGameInfo +// +// Revision 1.2 1996/10/01 20:14:43 moses +// Added a new method IsTourney +// +// Revision 1.1 1996/09/30 20:52:48 moses +// Initial revision +// +//-------------------------------------------------------------------------- + +//static char RCSid[] = "$Id: Tourney.cc,v 1.12 2002/07/02 00:02:40 tridge Exp $"; + +#include "Tourney.hh" +#include "Mamer.hh" + +extern Mamer gMamer; + +//- Constructor ------------------------------------------------------------ +Tourney::Tourney() { +} //- End of Tourney + +Tourney::Tourney(int n,User *u, TourneyParameters *tp) { + InitTourney(n, u, tp->time, tp->inc, tp->mode, tp->style, tp->rounds, tp->variant, tp->ratingLow, tp->ratingHigh); +} + +Tourney::Tourney(int n, User *u, TourneyParameters *tp, int t, int i, char m, char s, int r) { + InitTourney(n, u, t, i, m, s, r, tp->variant, tp->ratingLow, tp->ratingHigh); +} + +Tourney::Tourney(int n, User *u, TourneyParameters *tp, int t, int i, char m, char s, int r, char v) { + InitTourney(n, u, t, i, m, s, r, v, tp->ratingLow, tp->ratingHigh); +} + +void Tourney::InitTourney(int n, User *u, int t, int i, char m, char s, int r, char v, int rl, int rh) { + number = n; + strncpy(manager, u->name, NAMELEN - 1); + managerLevel = u->GetManagerLevel(); + averageRating = 0; + params.time = t; + params.inc = i; + params.mode = m; + params.style = s; + params.rounds = r; + params.variant = v; + params.wild = 10; + params.ratingLow = rl; + params.ratingHigh = rh; + params.currentRound = 0; + params.maxPlayers = DEFAULT_MAX_PLAYERS; + + startDate = 0; + endDate = 0; + persist = 0; + lastCshouted = 0; + + status = NEW; +} + +//- Deconstructor --------------------------------------------------------- +Tourney::~Tourney() { + +} //- End of ~Tourney + +//- IsTourney ------------------------------------------------------------- +int Tourney::IsTourney(int tourn) { + if(tourn == number) + return(1); + else + return(0); +} //- End of IsTourney + +//- IsNotNew------------------------------------------------------------- +short Tourney::IsNotNew(void) { + if(NEW != status) + return(TRUE); + return(FALSE); +} + +//- IsNotClosed------------------------------------------------------------- +short Tourney::IsNotClosed(void) { + if(CLOSED != status) + return(TRUE); + return(FALSE); +} + +//- AddPlayer ---------------------------------------------------------- +int Tourney::AddPlayer(char *name, int rating, float score) { + TourneyPlayers *newPlayer = NULL, *tp = NULL; + Player *newSortPlayer = NULL; + + if (status != OPEN) return 3; // If we are not open then we can't enter the tourney + + tp = GetPlayer(name); + + if(tp != NULL) return(2); // if we are already in the tourney we can't enter it again/ + + if(rating >= params.ratingLow && rating <= params.ratingHigh && status == OPEN) { + + newPlayer = new TourneyPlayers(name, rating, score); + newSortPlayer = new Player(name, 0); + + playerList.Append(newPlayer); + SortPlayers(); + gMamer.XServerCom("%s %i %s %s%i%s %s%i %i %s%s", "tell", gMamer.channelNumber, name, "(", rating, ")", + "has joined tourney #", number, GetPlayerCount(), "players now.", "\n"); + CalculateAverage(); + if(GetPlayerCount() >= params.maxPlayers) + CloseAndStart(); + return(1); // we entered the tourney + } else + return(0); // sucks to be us cause our rating doesn't fit the params +} + +//- RemovePlayer ---------------------------------------------------------- +int Tourney::RemovePlayer(char *name) { + TourneyPlayers *tp = NULL, *p=NULL; + Player *opp=NULL; + int roundsRemaining=0; + + tp = GetPlayer(name); + printf("forfeiting %s\n", tp->name); + if(tp == NULL) return -1; // Player not in THIS tourney + + tp->activeFlag = 0; + + roundsRemaining = GetRoundsRemaining(); + + // This code will go through a forfeited players list and give him a loss for current opponent + // with a quick modification it will give losses for all games played as well... + LinkListIter opponentIter(tp->opponentList); // List of opponents this player has had + opponentIter.Reset(); + while((opp = opponentIter.Next())) { + if(strcmp("_BYE_", opp->name) != 0) { // If I am not _BYE_ + p = GetPlayer(opp->name); + if(opp->floatValue == -1) { // floatValue stores the game result for this player + if(opp->value) { // if player leaving was white + SetGameResult(tp->name, opp->name, 0); + } else { + SetGameResult(opp->name, tp->name, 1); + } + roundsRemaining++; + } + } + } + + LinkListIter playerIter(playerList); + playerIter.Reset(); + while((p = playerIter.Next())) { + if(strcmp(p->name, "_BYE_") == 0) { + if(p->activeFlag != 0) + p->activeFlag = 0; + else + p->activeFlag = 1; + break; + } + } + + SortPlayers(); + + return roundsRemaining; +} + +//- GetPlayer ---------------------------------------------------------- +TourneyPlayers *Tourney::GetPlayer(char *name) { + LinkListIter playerIter(playerList); + TourneyPlayers *tp = NULL; + + playerIter.Reset(); + while((tp = playerIter.Next())) + if(!strcasecmp(tp->name, name)) + return tp; + + return NULL; +} + +//- GetRound ---------------------------------------------------------- +int Tourney::GetRound() { + return params.currentRound; +}//- end of GetRound -------------------------------------------------- + +//- GetRoundsRemaining ------------------------------------------------ +int Tourney::GetRoundsRemaining() { + return (params.rounds - params.currentRound); +}//- end of GetRoundsRemaining ----------------------------------------- + +//- SortPlayers ---------------------------------- +void Tourney::SortPlayers() { + Player *temp=NULL, *s=NULL; + TourneyPlayers *tp = NULL; + int i=0, added=0; + + LinkListIter playerIter(playerList); + LinkListIter sortIter(sortList); + + sortIter.Reset(); + while((s = sortIter.Next())) sortList.Delete(s); + + i=0; + while((tp = playerIter.Next())) { + (tp->activeFlag) ? tp->sortValue = (tp->score + tp->rating/10000.0) : tp->sortValue = -1.0; + tp->ClearWhites(); + tp->ClearBlacks(); + if((status == OPEN) && (i < (GetPlayerCount()/2))) + (i % 2) ? tp->AddWhite() : tp->AddBlack(); + i++; + } + + playerIter.Reset(); + while((tp = playerIter.Next())) { + added=0; + sortIter.Reset(); + temp = new Player(tp->name, tp->sortValue); + while((s = sortIter.Next())) { + if(tp->sortValue > s->floatValue) { + sortList.Insert(s, temp); + added = 1; + break; + } + } + if(!added) + sortList.Append(temp); + } + + i = 1; + sortIter.Reset(); + while((s = sortIter.Next())) { + s->value = i; + if(gMamer.debugLevel >= 10) printf("%4d %-18s\n", s->value, s->name); + i++; + } +}//- end of Sort Players ---------------------- + +//- GetSortValueCount ------------------------------------------------------- +int Tourney::GetSortValueCount(double value) { + LinkListIter playerIter(playerList); + int count=0; + TourneyPlayers *tp=NULL; + Player *s=NULL; + + while((tp = playerIter.Next())) { + if(tp->sortValue == value) { + s = GetSortPlayer(tp->name); + if(s->value != 0) + count++; + } + } + + return count; +} + +//- GetSortPlayer ---------- +Player *Tourney::GetSortPlayer(char *name) { + Player *p = NULL; + LinkListIter sortIter(sortList); + + while((p = sortIter.Next())) { + if(strcasecmp(p->name, name) == 0) { + return p; + } + } + + return p; +}//- end of GetSortPlayer ----- + +//- GetSortPlayer ------------------------------ +Player *Tourney::GetSortPlayer(int place) { + Player *p = NULL; + LinkListIter sortIter(sortList); + + while((p = sortIter.Next())) { + if(p->value == place) { + return p; + } + } + + return p; +}//- end of GetSortPlayer ----- + +//- CalculateAverage -------------------------------------------------- +void Tourney::CalculateAverage(void) { + int total=0, count=0; + TourneyPlayers *p; + LinkListIter playerIter(playerList); + + while((p = playerIter.Next())) { + if(p->rating > 0) { + total += p->rating; + count++; + } + } + if(count) + averageRating = ((float)total/(float)count); + else + averageRating = 0; +}//- end CalculateAverage + +//- GetAverageRating ---------------------------------------------------------- +float Tourney::GetAverageRating(void) { + return averageRating; +}//end GetAverageRating + +//- GetVariant ---------------------------------------------------------- +int Tourney::GetVariant(void) { + float eTime; + + switch(params.variant) { + case 'w': + return(0); + case 'r': + eTime = (float)params.time + (0.6666667 * (float)params.inc); + if(eTime < 3) + return(1); + else if(eTime < 15) + return(2); + else + return(3); + case 'b': + return(4); + case 's': + return(5); + default: + return(2); + } +} + +//- Open ---------------------------------------------------------- +int Tourney::Open(void) { + if(status == NEW) { + status = OPEN; + return 1; + } else { + return 0; + } +} + +//- GetPlayerCount ---------------------------------------------------------- +int Tourney::GetPlayerCount() { + int count=0; + TourneyPlayers *p; + LinkListIter playerIter(playerList); + + while((p = playerIter.Next())) { + if(p->activeFlag != 0) + count++; + } + + return count; +}//- end GetPlayerCount ---------------------------------- + +//- SetPersist ------------------------------------------------------------- +void Tourney::SetPersist(int i) { + persist = i; +} //- end SetPersist + +//- GetPersist ------------------------------------------------------------- +int Tourney::GetPersist() { + return persist; +} //- end GetPersist + +//- SetEndDate ------------------------------------------------------------- +void Tourney::SetEndDate() { + endDate = time(0); +} //- end of SetEndDate ---------------------------------------------------- + +//- CloseAndStart ---------------------------------------------------------- +void Tourney::CloseAndStart(void) { + status = CLOSED; + params.currentRound = 0; + + startDate = time(0); + + cout << "tourney started at: " << ctime(&startDate) << endl; + + if(params.rounds == 0) { + switch(params.style) { + case 'r': + params.rounds = GetPlayerCount() - 1; + break; + case 's': + params.rounds = (int)ceil(log2(GetPlayerCount())); + break; + default: + params.rounds = DEFAULT_ROUNDS; + break; + } + } + + // this is to stop a 4 player tourney from having 2 rounds + params.rounds = (params.rounds < MINIMUM_ROUNDS) ? MINIMUM_ROUNDS : params.rounds; + + MakeAssignments(); + TellThemWhoTheyPlay(); // tell them who they play +} + +int Tourney::PopLastPairedPlayer() { + Storage *p=NULL, *lastPlayer=NULL; + LinkListIter pairedIter(pairedPlayers); + int last=0; + + while((p = pairedIter.Next())) { + lastPlayer = p; + last = p->value; + } + + if(last) { + cout << "Popping: " << lastPlayer->name << " from the paired list " << endl; + pairedPlayers.Delete(lastPlayer); + } else + cout << "Popping: _NOBODY_" << " from the paired list " << endl; + + return last; +} + +void Tourney::ClearPairedPlayers() { + Storage *p=NULL; + LinkListIter pairedIter(pairedPlayers); + + while((p = pairedIter.Next())) pairedPlayers.Delete(p); +} + +int Tourney::MakeAssignments(void) { + TourneyPlayers *tp = NULL, *opponent = NULL, *bye = NULL; + Storage *newPairedPlayer=NULL; + Player *p=NULL, *opp=NULL; + int everybodyPaired=0, byeFlag=1, playerCount=0, i=1; + LinkListIter playerIter(playerList); + + params.currentRound++; + if(params.currentRound > params.rounds) { + cout << "Returning because current round is > rounds" << endl; + cerr << "Returning because current round is > rounds" << endl; + return 0; + } + // Initialize a few things...make sure nobody is paired, + playerIter.Reset(); + while((tp = playerIter.Next())) { + UnPairPlayer(tp); + if(strcmp(tp->name, "_BYE_") == 0) { byeFlag = 0; } // unset the byeFlag + } + playerCount = GetPlayerCount(); + if((byeFlag) && (playerCount % 2)){ // we need to add a bye + bye = new TourneyPlayers("_BYE_", 0, 0); + playerList.Append(bye); // add the bye to the tourney players list + SortPlayers(); + playerCount++; + } + + // Set up the PairingScores + playerIter.Reset(); + while((tp = playerIter.Next())) { if(!tp->IsPaired()) SetPairingScores(tp); } + + playerIter.Reset(); + while((tp = playerIter.Next())) { UnPairPlayer(tp); tp->oppChoice=0; } // unpair all the players + + i = 1; + ClearPairedPlayers(); + while(everybodyPaired == 0) { + everybodyPaired = 0; + p = GetSortPlayer(i); + tp = GetPlayer(p->name); + opponent = (TourneyPlayers *)NULL; + // PrintPotentialLists(); + if((tp->IsPaired() == FALSE) && tp->activeFlag) { // If I am not paired and I am active pair me + if((opponent = FindBestOpponent(tp))) { + newPairedPlayer = new Storage(tp->name, i); + pairedPlayers.Append(newPairedPlayer); + cerr << "Adding: " << tp->name << " " << i << " " << "to the paired list " << opponent->name << endl; + everybodyPaired = PairPlayers(tp, opponent); // Actually Pair me + i++; // go to the next player + } else { // If there is no opponent for me go back and repair up the tree + if(tp->oppChoice > playerCount) { // If I have tried all my opponents + tp->oppChoice = 0; // reset me so I can try again later + i = PopLastPairedPlayer(); // returns the last player paired & removes him from the paired list + cerr << "i=" << i << endl; + if(i <= 0) { // this would be really bad means we can't even find + cout << "Returning because we can't find pairings" << endl; + cerr << "Returning because we can't find pairings" << endl; + return 0; // an opponent for the first player. Tourney has to be over now + } + p = GetSortPlayer(i); + tp = GetPlayer(p->name); + opponent = GetPlayer(tp->oppName); + cout << "UnPairing: " << tp->name << " " << opponent->name << " choice: " << tp->oppChoice << endl; + tp->RemoveLastOpponent(); // removes the person we were planning on playing + opponent->RemoveLastOpponent(); + UnPairPlayer(tp); // unpair us so we can be re-paired + UnPairPlayer(opponent); + tp->oppChoice++; // try his next possible opponent + } else { + tp->oppChoice++; // Try my next opponent + } + } + } else { // if I am already paired go to the next player and pair him + i++; + } + } + + if(everybodyPaired > 0) { + playerIter.Reset(); + while((tp = playerIter.Next())) UnPairPlayer(tp); // unpair all players so we can use that to tell + playerIter.Reset(); // if they have been assiged a color + while((tp = playerIter.Next())) { + if((!tp->IsPaired()) && (tp->activeFlag != 0)) { + opponent = GetPlayer(tp->oppName); + AssignColors(tp, opponent); + tp->NowPaired(TRUE); // mark BOTH players as having a color + opponent->NowPaired(TRUE); // this is important for when we hit this player later in the Iter + } + } + } + + playerIter.Reset(); + while((tp = playerIter.Next())) { + if(0 == strcmp(tp->name, "_BYE_")) { // If I am the bye + LinkListIter opponentIter(tp->opponentList); + while((opp = opponentIter.Next())) { // Got through my opponents and find the one I am playing now + if(0 == strcasecmp(opp->name, tp->oppName)) { // & Give him a win + if(opp->value) + SetGameResult(tp->name, tp->oppName, 0); + else + SetGameResult(tp->oppName, tp->name, 1); + gMamer.XServerCom("tell %s you get a BYE this round.%s", opp->name, "\n"); + } + } + } + } + return 1; +} + +//- PrintPotentialLists +void Tourney::PrintPotentialLists() { + TourneyPlayers *tp=NULL; + Player *o=NULL; + + LinkListIter playerIter(playerList); + + while((tp = playerIter.Next())) { + printf("%-10s %i\n", tp->name, tp->oppChoice); + LinkListIter oppIter(tp->potentialOpponentList); + while((o = oppIter.Next())) { + printf("%d %-10s ", o->value, o->name); + } + printf("\n\n"); + } +} + +//- Start of FindBestOpponent +TourneyPlayers *Tourney::FindBestOpponent(TourneyPlayers *tp) { + Player *tmp = NULL; + + LinkListIter opponentIter(tp->potentialOpponentList); + while((tmp = opponentIter.Next())) { + if((tmp->value == tp->oppChoice) && (0 == GetPlayer(tmp->name)->IsPaired())) { + return GetPlayer(tmp->name); + } + } + + return NULL; +} + +//- Start of SetPairingSores ------------------------------- +void Tourney::SetPairingScores(TourneyPlayers *tp) { + double score; + TourneyPlayers *opponent = NULL; + Player *temp=NULL, *newOpp=NULL, *t=NULL, *me=NULL; + int offset=2, place=1, i=0, added=0; + + tp->RemovePotentialOppList(); + + LinkListIter playerIter(playerList); + + SortPlayers(); + + while((opponent = playerIter.Next())) { + if((strcmp(tp->name, opponent->name) != 0) && + (tp->score == opponent->score)) { + offset++; + if(opponent->rating > tp->rating) { + place++; + } + } + } + offset = offset / 2; + if(place > offset) { offset *= -1; } + + me = GetSortPlayer(tp->name); + playerIter.Reset(); + while((opponent = playerIter.Next())) { + if(strcmp(tp->name, opponent->name) && (tp->activeFlag !=0)) { // If this isn't MY name & I am active + if((!tp->AlreadyPlayed(opponent->name)) && (!opponent->IsPaired()) && (opponent->activeFlag != 0)) { + // and I haven't played this person and this person is active. (not forfeited) + t = GetSortPlayer(opponent->name); + score = ((abs(t->value - (me->value + offset))) * 1000); + if(opponent->score >= tp->score) { + score = score + ((opponent->score - tp->score) * 10.0); + } else { + score = score + ((tp->score - opponent->score) * 10.0); + } + score += abs(opponent->ColorDue() - tp->ColorDue()); + score += (abs(opponent->rating - tp->rating)) * 0.0001; + + if(!strcmp(opponent->name, "_BYE_")) { score = 999999; } + + added=0; + newOpp = new Player(opponent->name, score); + LinkListIter opponentIter(tp->potentialOpponentList); + opponentIter.Reset(); + while((temp = opponentIter.Next())) { + if(score < temp->floatValue) { + tp->potentialOpponentList.Insert(temp, newOpp); + added = 1; + break; + } + } + if(!added) + tp->potentialOpponentList.Append(newOpp); + opponentIter.Reset(); + i = 0; + while((temp = opponentIter.Next())) { + temp->value = i; + i++; + } + } + } + } +} + +//- Start of PairPlayers ---------------------------------- +int Tourney::PairPlayers(TourneyPlayers *p1, TourneyPlayers *p2) { + TourneyPlayers *tp; + Player *temp = NULL; + + LinkListIter playerIter(playerList); + + temp = new Player(p2->name, -1.0, 0, p2->rating); + p1->opponentList.Append(temp); + p1->NowPaired(TRUE); + strcpy(p1->oppName, p2->name); + + temp = new Player(p1->name, -1.0, 0, p1->rating); + p2->opponentList.Append(temp); + p2->NowPaired(TRUE); + strcpy(p2->oppName, p1->name); + + playerIter.Reset(); + while((tp = playerIter.Next())) { + if((!tp->IsPaired()) && (tp->activeFlag != 0)) + return 0; + } + + return 1; +} + +//- Start of UnPairPlayer ---------------------------------- +void Tourney::UnPairPlayer(TourneyPlayers *p1) { + if(p1 != NULL) + p1->NowPaired(FALSE); +}//- end of UnPairPlayer + +//- intcmp ---- +int Tourney::intcmp(int a, int b) { + if(a > b) { + return 1; + } else { + if (a == b) { + return 0; + } else { + return -1; + } + } +} +//- end intcmp ---- + +//- AssignColors ---------------------------------------------------------- +void Tourney::AssignColors(TourneyPlayers *p1, TourneyPlayers *p2) { + int p1Color=0, rated = 1; + Game *g = NULL; + Player *opp1 = NULL, *opp2 = NULL; + + if(params.mode != 'r') { rated = 0; } + if(intcmp(p1->ColorDue(), p2->ColorDue()) != 0) { + if(p1->ColorDue()) { p1Color = 1; } + } else { + if(p1->ColorDue()) { // Both are due white; need to find out how due. + switch (intcmp(p1->GetConsecutiveBlacks(), p2->GetConsecutiveBlacks())) { + case 1: + p1Color = 1; + break; + case -1: break; + case 0: + switch (intcmp(p1->GetTotalBlacks(), p2->GetTotalBlacks())) { + case 1: + p1Color = 1; + break; + case -1: break; + case 0: + if((p1->score * 10000 + p1->rating) >= (p2->score * 10000 + p2->rating)) + p1Color = 1; + break; + } + break; + } + } else { + switch (intcmp(p1->GetConsecutiveWhites(), p2->GetConsecutiveWhites())) { + case 1: break; + case -1: + p1Color = 1; + break; + case 0: + switch (intcmp(p1->GetTotalWhites(), p2->GetTotalWhites())) { + case 1: break; + case -1: + p1Color = 1; + break; + case 0: + if((p1->score * 10000 + p1->rating) >= (p2->score * 10000 + p2->rating)) + p1Color = 1; + break; + } + break; + } + } + } + LinkListIter opponentIter1(p1->opponentList); + LinkListIter opponentIter2(p2->opponentList); + while((opp1 = opponentIter1.Next())) { + if(!strcasecmp(opp1->name, p2->name)) { break; } + } + while((opp2 = opponentIter2.Next())) { + if(!strcasecmp(opp2->name, p1->name)) { break; } + } + if(p1Color) { + p1->AddWhite(); p2->AddBlack(); + opp1->value = 1; + g = new Game(p1->name, p2->name, params.time, params.inc, rated, 'r'); + } else { + p1->AddBlack(); p2->AddWhite(); + opp2->value = 1; + g = new Game(p2->name, p1->name, params.time, params.inc, rated, 'r'); + } + gameList.Append(g); +} + +//- GetStatus -------------------------------------------------------- +int Tourney::GetStatus(void) { + return status; +} + +//- EndTourney ----------------------- +void Tourney::EndTourney(void) { + status = DONE; +}//- End EndTourney + +//- Announce ---------------------------------------------------------- +void Tourney::Announce(void) { + char temp[128]; + char *announce; + long now=0; + + announce = new char[MAX_LINE_SIZE]; + memset(announce, '\0', MAX_LINE_SIZE); + sprintf(announce, "*****Tourney Announcement***** %80s Trny #%d %d %d %c ", + "", number, params.time, params.inc, params.mode); + if(params.style == 's') { strcat(announce, " SWISS"); } else { strcat(announce, " RR"); } + switch(params.variant) { + case 'w': + strcat(announce, " Wild "); + strcat(announce, GetWild(params.wild)); + break; + case 'b': + strcat(announce, " Bug"); break; + case 's': + strcat(announce, " Suicide"); break; + default: + break; + } + memset(temp, '\0', 128); + sprintf(temp, " %i-%i %i plr(s). tell %s join %d. Avg: %5.1f", + params.ratingLow, params.ratingHigh, GetPlayerCount(), gMamer.username, number, averageRating); + strcat(announce, temp); + + printf("%s + cha 49\n", announce); + fflush(stdout); + + gMamer.XServerCom("%s %i %s%s", "tell", gMamer.channelNumber, announce, "\n"); + + now = time(0); + if((now - lastCshouted) > (SEC_BETWEEN_CSHOUTS)) { + gMamer.XServerCom("%s %s%s", "cshout", announce, "\n"); + lastCshouted = now; + } + + delete(announce); +} + +//- SetVariable --------------------------------------------------------------- +void Tourney::SetVariable(int why, int newValue) { + + switch (why) { + case 0: + if((newValue >= 0) && (newValue <= MAX_TIME)) + params.time = newValue; + break; + case 1: + if((newValue >= 0) && (newValue <= MAX_INCREMENT)) + params.inc = newValue; + break; + case 2: + params.rounds = newValue; + params.rounds = MIN(params.rounds, MAX_ROUNDS); + params.rounds = MIN((params.maxPlayers - 1), params.rounds); + break; + case 6: + if(((newValue >= 0) && (newValue <= 5)) || + ((newValue >= 8) || (newValue <= 10))) + params.wild = newValue; + break; + case 7: + params.ratingLow = newValue; + params.ratingLow = MAX(0, params.ratingLow); + if(params.ratingLow >= (params.ratingHigh - 200)) + params.ratingLow = params.ratingHigh - 200; + break; + case 8: + params.ratingHigh = newValue; + if(params.ratingHigh <= (params.ratingLow + 200)) + params.ratingHigh = params.ratingLow + 200; + break; + case 9: + params.maxPlayers = newValue; + params.maxPlayers = MAX(params.maxPlayers, MINIMUM_PLAYERS); + params.maxPlayers = MAX(params.maxPlayers, (params.rounds + 1)); + break; + default: + break; + } +}//- End SetVariable + +//- SetVariable --------------------------------------------------------------- +void Tourney::SetVariable(int why, char *newValue) { + + switch (why) { + case 3: + if((newValue[0] == 's') || (newValue[0] == 'r')) + params.style = newValue[0]; + break; + case 4: + if((newValue[0] == 'r') || (newValue[0] == 'w') || (newValue[0] == 'b') || (newValue[0] == 's')) + params.variant = newValue[0]; + break; + case 5: + if((newValue[0] == 'r') || (newValue[0] == 'u')) + params.mode = newValue[0]; + break; + default: + break; + } +}//- End SetVariable + +//- Begin GetWild - take a int return a string +char *Tourney::GetWild(int w) { + switch (w) { + case 0: + return "0"; + case 1: + return "1"; + case 2: + return "2"; + case 3: + return "3"; + case 4: + return "4"; + case 5: + return "5"; + case 8: + return "8"; + case 9: + return "8a"; + case 10: + return "fr"; + default: + return ""; + } +}//- end GetWild + +//- TellThemWhoTheyPlay ------------------------------------------ +void Tourney::TellThemWhoTheyPlay() { + Game *g = NULL; + LinkListIter gameIter(gameList); // List of games in this tourney + char *Variant=new char[MAX_LINE_SIZE]; + + memset(Variant, '\0', MAX_LINE_SIZE); + + if(params.variant == 'w') + sprintf(Variant, "wild %2s", GetWild(params.wild)); + else if(params.variant == 's') + sprintf(Variant, "suicide"); + else if(params.variant == 'b') + sprintf(Variant, "bug"); + + while((g = gameIter.Next())) { + /* note that we rely on rmatch and on the ; separated commands from lasker */ + gMamer.XServerCom("rmatch %s %s %i %i %c %s white ; rmatch %s %s %i %i %c %s black\n", + g->whiteName, g->blackName, g->time, g->inc, params.mode, Variant, + g->blackName, g->whiteName, g->time, g->inc, params.mode, Variant); + } + delete(Variant); +}//- end TellThemWhoTheyPlay -------------------------------------- + +//- SetGameResult -------------------------------------------- +int Tourney::SetGameResult(char *white, char *black, int result) { + Player *opp1 = NULL, *opp2 = NULL; + TourneyPlayers *tp1 = NULL, *tp2 = NULL; + Game *g = NULL; + int found=0; + + tp1 = GetPlayer(white); + tp2 = GetPlayer(black); + + if((NULL == tp1) || (NULL == tp2)) { return 0; } + + LinkListIter opponentIter1(tp1->opponentList); // List of opponents this player has had + while((opp1 = opponentIter1.Next())) { + if(!strcasecmp(opp1->name, black)) { break; } + } + LinkListIter opponentIter2(tp2->opponentList); + while((opp2 = opponentIter2.Next())) { + if(!strcasecmp(opp2->name, white)) { break; } + } + if((NULL == opp1) || (NULL == opp2)) { return -1; } + + switch (result) { // set the result + case 1: + opp1->floatValue = 1.0; + opp2->floatValue = 0.0; + break; + case 0: + opp1->floatValue = 0.0; + opp2->floatValue = 1.0; + break; + case 2: + opp1->floatValue = 0.5; + opp2->floatValue = 0.5; + break; + default: + return 0; + } + tp1->CalculateScore(); + tp2->CalculateScore(); + + LinkListIter gameIter(gameList); // List of games in this tourney + while((g = gameIter.Next())) { + if(!(strcasecmp(g->whiteName, white)) && !(strcasecmp(g->blackName, black))) { + gameList.Delete(g); + found=1; + break; + } + } + if(found) { + gameIter.Reset(); + if((g = gameIter.Next())) { + return 1; + } else { + return 2; + } + } else { + return 1; + } +} //- End SetGameResult -------------------------------------- + +//- GetStartDate --------------------------------------------- +long Tourney::GetStartDate() { + return startDate; +} //- end of GetStartDate ------------------------------------ + +//- GetEndDate --------------------------------------------- +long Tourney::GetEndDate() { + return endDate; +} //- end of GetEndDate ------------------------------------ diff --git a/lasker-2.2.3/bots/mamer/Tourney.hh b/lasker-2.2.3/bots/mamer/Tourney.hh new file mode 100644 index 0000000..5186d85 --- /dev/null +++ b/lasker-2.2.3/bots/mamer/Tourney.hh @@ -0,0 +1,180 @@ +//-------------------------------------------------------------------------- +// Tourney.hh - Class header for the Tourney class +// +// Matthew E. Moses & Michael A. Long +// +// $Revision: 1.12 $ +// $Date: 2002/07/02 00:02:40 $ +// +// $Author: tridge $ +// $Locker: $ +// +//-------------------------------------------------------------------------- + +#ifndef _TOURNEY_ +#define _TOURNEY_ + +#define log2(x) (log(x)/log(2)) + +#include +#include + +extern "C" { +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +} + +#include "config.h" +#include "link.hh" +#include "linklist.hh" +#include "User.hh" +#include "TourneyParameters.hh" +#include "TourneyPlayers.hh" +#include "Game.hh" +#include "Storage.hh" + +class Tourney : public Link { + public: + Tourney(); + Tourney(int, User *, TourneyParameters *); + Tourney(int, User *, TourneyParameters *, int, int, char, char, int); + Tourney(int, User *, TourneyParameters *, int, int, char, char, int, char); + ~Tourney(); + + void InitTourney(int, User *, int, int, char, char, int, char, int, int); + + int intcmp(int, int); + + void TellThemWhoTheyPlay(void); + + int IsTourney(int); + short IsNotNew(void); + short IsNotClosed(void); + int Open(void); + void CloseAndStart(void); + int GetStatus(void); + void EndTourney(); + + void Announce(void); + + int AddPlayer(char *, int, float); + int RemovePlayer(char *); + void SetVariable(int, int); + void SetVariable(int, char *); + char *GetWild(int); + void CalculateAverage(); + + void SortPlayers(); + int GetSortValueCount(double); + Player *GetSortPlayer(char *); + Player *GetSortPlayer(int); + + TourneyPlayers *GetPlayer(char *); + int GetPlayerCount(); + int GetVariant(); + int GetRound(); + int GetRoundsRemaining(); + float GetAverageRating(); + + int MakeAssignments(); + void SetOffsets(); + void SetPairingScores(TourneyPlayers *); + TourneyPlayers *FindBestOpponent(TourneyPlayers *); + int PairPlayers(TourneyPlayers *, TourneyPlayers *); + void UnPairPlayer(TourneyPlayers *); + void AssignColors(TourneyPlayers *, TourneyPlayers *); + int SetGameResult(char *, char *, int); + + long GetStartDate(); + long GetEndDate(); + void SetEndDate(); + void SetPersist(int); + int GetPersist(); + + int PopLastPairedPlayer(); + void ClearPairedPlayers(); + + void PrintPotentialLists(); + + public: + int number; + long lastCshouted; + + LinkList playerList; + LinkList gameList; + LinkList sortList; + LinkList pairedPlayers; + + TourneyParameters params; + + char manager[NAMELEN]; + int managerLevel; + + private: + int persist; + time_t startDate; + time_t endDate; + + int status; + + float averageRating; + + int currentRound; +}; + +#endif + +//--------------------------------------------------------- +// $Log: Tourney.hh,v $ +// Revision 1.12 2002/07/02 00:02:40 tridge +// - fixed compile on g++ 2.96 +// - updated for lasker 'rmatch' +// +// Revision 1.11 1998/09/10 19:58:41 mlong +// lots of little bug fixes and a few new features. +// +// Revision 1.10 1998/04/29 15:24:07 mlong +// prepairing for the move to daimi +// new sorting routine. +// +// Revision 1.9 1998/04/18 18:46:31 mlong +// fixed delete bug and +// added delete tourney function +// +// Revision 1.8 1998/02/12 18:44:25 mlong +// *** empty log message *** +// +// Revision 1.7 1997/10/28 21:03:48 mlong +// *** empty log message *** +// +// Revision 1.6 1997/10/23 19:56:44 mlong +// *** empty log message *** +// +// Revision 1.5 1997/10/23 19:37:22 chess +// lots of new stuff +// +// Revision 1.4 1997/05/15 18:29:12 chess +// added pending and TourneyPlayers support +// added HandleGetPlayerInfo & HandleGetGameInfo +// +// Revision 1.3 1997/05/02 23:55:18 chess +// added TourneyParameters class include +// +// Revision 1.2 1996/10/01 20:14:43 moses +// added methods +// +// Revision 1.1 1996/09/30 20:52:48 moses +// Initial revision +// +//-------------------------------------------------------------------------- diff --git a/lasker-2.2.3/bots/mamer/TourneyParameters.cc b/lasker-2.2.3/bots/mamer/TourneyParameters.cc new file mode 100644 index 0000000..c6bb0c7 --- /dev/null +++ b/lasker-2.2.3/bots/mamer/TourneyParameters.cc @@ -0,0 +1,33 @@ +//-------------------------------------------------------------------------- +// TourneyParameters.cc - Source file for the TourneyParameters class +// +// Matthew E. Moses & Michael A. Long +// +// $Revision: 1.2 $ +// $Date: 1998/09/10 19:57:17 $ +// +// $Author: mlong $ +// $Locker: $ +// +// $Log: TourneyParameters.cc,v $ +// Revision 1.2 1998/09/10 19:57:17 mlong +// lots of little bug fixes and a few new features +// +// Revision 1.1 1997/05/02 23:52:06 chess +// Initial revision +// +// +//-------------------------------------------------------------------------- + +// static char RCSid[] = "$Id: TourneyParameters.cc,v 1.2 1998/09/10 19:57:17 mlong Exp $"; + +#include "TourneyParameters.hh" + +//- Constructor ----------------------------------------------------------- +TourneyParameters::TourneyParameters() { +} + +//- DeConstructor --------------------------------------------------------- +TourneyParameters::~TourneyParameters() { +} + diff --git a/lasker-2.2.3/bots/mamer/TourneyParameters.hh b/lasker-2.2.3/bots/mamer/TourneyParameters.hh new file mode 100644 index 0000000..94e6b33 --- /dev/null +++ b/lasker-2.2.3/bots/mamer/TourneyParameters.hh @@ -0,0 +1,57 @@ +//-------------------------------------------------------------------------- +// TourneyParameters.hh - Class header for the TourneyParameters class +// +// Matthew E. Moses & Michael A. Long +// +// $Revision: 1.3 $ +// $Date: 1998/09/10 19:58:41 $ +// +// $Author: mlong $ +// $Locker: $ +// +// $Log: TourneyParameters.hh,v $ +// Revision 1.3 1998/09/10 19:58:41 mlong +// lots of little bug fixes and a few new features. +// +// Revision 1.2 1998/02/12 18:44:25 mlong +// *** empty log message *** +// +// Revision 1.2 1997/10/23 19:56:12 chess +// *** empty log message *** +// +// Revision 1.1 1997/05/02 23:52:06 chess +// Initial revision +// +// +//-------------------------------------------------------------------------- + +#ifndef _TOURNEYPARAMETERS_ +#define _TOURNEYPARAMETERS_ + +class TourneyParameters { + public: + TourneyParameters(); + ~TourneyParameters(); + + private: + + public: + + int time; + int inc; + char variant; + int wild; + char mode; + char style; + int ratingHigh; + int ratingLow; + int rounds; + int currentRound; + int maxPlayers; + + private: + +}; + +#endif + diff --git a/lasker-2.2.3/bots/mamer/TourneyPlayers.cc b/lasker-2.2.3/bots/mamer/TourneyPlayers.cc new file mode 100644 index 0000000..2d9ea53 --- /dev/null +++ b/lasker-2.2.3/bots/mamer/TourneyPlayers.cc @@ -0,0 +1,270 @@ +//-------------------------------------------------------------------------- +// TourneyPlayers.cc - Source file for the TourneyPlayers class +// +// Matthew E. Moses && Michael A. Long +// +// $Revision: 1.7 $ +// $Date: 1998/09/10 19:57:17 $ +// +// $Author: mlong $ +// $Locker: $ +// +// $Log: TourneyPlayers.cc,v $ +// Revision 1.7 1998/09/10 19:57:17 mlong +// lots of little bug fixes and a few new features +// +// Revision 1.6 1998/04/29 15:23:19 mlong +// prepairing for the move to daimi +// new sorting routine. +// +// +// Revision 1.2 1997/10/08 21:03:35 chess +// preparing for move to oracle machine at eworks. +// +// Revision 1.1 1997/05/14 16:59:13 chess +// Initial revision +// +// +//-------------------------------------------------------------------------- + +// static char RCSid[] = "$Id: TourneyPlayers.cc,v 1.7 1998/09/10 19:57:17 mlong Exp $"; + +#include "TourneyPlayers.hh" + +//- Constructor ----------------------------------------------------------- +TourneyPlayers::TourneyPlayers(char *n, int r, float s) { + perform=0; + upset=0; + + totalWhites = 0; + totalBlacks = 0; + consecutiveBlacks = 0; + consecutiveWhites = 0; + + activeFlag = 1; + sortValue = r/10000.0; + + dueColor = 0; + paired = 0; + + memset(oppName, '\0', NAMELEN); + + memset(name, '\0', NAMELEN); + strcpy(name, n); + + rating = r; + score = s; + + oppChoice=0; + location=ONLINE; +} + +//- Constructor ----------------------------------------------------------- +TourneyPlayers::TourneyPlayers() { + perform=0; + upset=0; + + totalWhites = 0; + totalBlacks = 0; + consecutiveBlacks = 0; + consecutiveWhites = 0; + + activeFlag = 1; + sortValue = 0.0; + + dueColor = 0; + paired = 0; + + memset(oppName, '\0', NAMELEN); + + memset(name, '\0', NAMELEN); + rating = 0; + score = 0; + + oppChoice=0; + location=ONLINE; +} + +//- DeConstructor --------------------------------------------------------- +TourneyPlayers::~TourneyPlayers() { +} + +//- AlreadyPlayed -------------------------------------------------------- +int TourneyPlayers::AlreadyPlayed(char *oppName) { + Player *temp; + + LinkListIter opponentIter(opponentList); + + while((temp = opponentIter.Next())) { + if(!strcmp(oppName, temp->name)) { + return 1; + } + } + + return 0; +} + +//- Start of RemovePotentialOppList +int TourneyPlayers::RemovePotentialOppList() { + Player *temp; + + LinkListIter opponentIter(potentialOpponentList); + + while((temp = opponentIter.Next())) { + potentialOpponentList.Delete(temp); + } + return 1; +}//- end of RemovePotentialOppList + +//- Start of RemoveFromOppList ------------------------------------------------- +void TourneyPlayers::RemoveFromOppList(char *name) { + Player *p=NULL; + + LinkListIter opponentIter(opponentList); + + while((p = opponentIter.Next())) { + if(strcasecmp(p->name, name) == 0) { + opponentList.Delete(p); + break; + } + } +}//- end RemoveFromOppList ----------------------------------------------------- + +//- Start of RemoveLastOpponent ------------------------------------------------- +void TourneyPlayers::RemoveLastOpponent() { + Player *p=NULL, *last=NULL; + LinkListIter opponentIter(opponentList); + + opponentIter.Reset(); + while((p = opponentIter.Next())) + last = p; + + cout << name << " " << last->name << endl; + opponentList.Delete(last); +}//- end RemoveLastOpponent ----------------------------------------------------- + +//- Start GetOpponentPlayer -------------------------------------------------------- +Player *TourneyPlayers::GetOpponentPlayer(char *oppName) { + Player *temp=NULL; + LinkListIter opponentIter(opponentList); + + while((temp = opponentIter.Next())) { + if(!strcmp(oppName, temp->name)) { + return temp; + } + } + + return NULL; +}//- end of GetOpponentPlayer + +//- IsPaired --------------------------------- +int TourneyPlayers::IsPaired(void) { + return paired; +}//- end IsPaired + +//- ColorDue --------------------------------- +int TourneyPlayers::ColorDue(void) { + return dueColor; +}//- end colorDue + +//- NowPaired --------------------------------- +void TourneyPlayers::NowPaired(int value) { + paired = value; +}//- end NowPaired + +//-ChangeColorDue --------------------------------- +void TourneyPlayers::ChangeColorDue(int value) { + dueColor = value; +}//- end ToggleColorDue + +//- AddWhite --------------------------------- +void TourneyPlayers::AddWhite(void) { + consecutiveWhites++; + ChangeColorDue(0); + ClearBlacks(); +}//- end AddWhite + +//- AddBlack --------------------------------- +void TourneyPlayers::AddBlack(void) { + consecutiveBlacks++; + ChangeColorDue(1); + ClearWhites(); +}//- end AddBlack + +//- ClearWhites --------------------------------- +void TourneyPlayers::ClearWhites(void) { + consecutiveWhites = 0; +}//- end ClearWhites + +//- ClearBlacks --------------------------------- +void TourneyPlayers::ClearBlacks(void) { + consecutiveBlacks = 0; +}//- end ClearBlacks + +//- GetTotalWhites --------------------------------- +int TourneyPlayers::GetTotalWhites(void) { + return totalWhites; +}//- end GetTotalWhites + +//- GetTotalBlacks --------------------------------- +int TourneyPlayers::GetTotalBlacks(void) { + return totalBlacks; +}//- end GetTotalBlacks + +//- GetConsecutiveWhites --------------------------------- +int TourneyPlayers::GetConsecutiveWhites(void) { + return consecutiveWhites; +}//- end GetConsecutiveWhites + +//- GetConsecutiveBlacks --------------------------------- +int TourneyPlayers::GetConsecutiveBlacks(void) { + return consecutiveBlacks; +}//- end GetConsecutiveBlacks + +//- CalculateScore -------------------------------------- +void TourneyPlayers::CalculateScore(void) { + score = 0.0; + Player *opp; + LinkListIter opponentIter(opponentList); + + while((opp = opponentIter.Next())) { + if(opp->floatValue > 0.0) { + score += opp->floatValue; + } + } + CalculatePerform(); +}//- End of CalculateScore ------------------- + +//- CalculatePerform -------------------------------------- +void TourneyPlayers::CalculatePerform(void) { + int total=0, counter=0, upsetpoints=0, rtng=0; + Player *opp; + LinkListIter opponentIter(opponentList); + + while((opp = opponentIter.Next())) { + if(!strcmp(opp->name, "_BYE_")) continue; + rtng = opp->rating; + if(opp->rating <= 0) rtng = 1675; + if(opp->floatValue == 0.5) { + total += rtng; + if(rtng > rating) + upsetpoints += (rtng - rating)/2; + } else if(opp->floatValue == 1.0) { + total += (rtng + 400); + if(rtng > rating) + upsetpoints += (rtng - rating); + } else if(opp->floatValue == 0.0) { + total += (rtng - 400); + } + counter++; + } + + if(counter > 0) + perform = total/counter; + else + perform = 0; + upset = upsetpoints; +}//- End of CalculatePerform ------------------- + + + diff --git a/lasker-2.2.3/bots/mamer/TourneyPlayers.hh b/lasker-2.2.3/bots/mamer/TourneyPlayers.hh new file mode 100644 index 0000000..3dc083f --- /dev/null +++ b/lasker-2.2.3/bots/mamer/TourneyPlayers.hh @@ -0,0 +1,125 @@ +//-------------------------------------------------------------------------- +// TourneyPlayers.hh - Class header for the TourneyPlayers class +// +// Matthew E. Moses & Michael A. Long +// +// $Revision: 1.6 $ +// $Date: 1998/09/10 19:58:41 $ +// +// $Author: mlong $ +// $Locker: $ +// +// $Log: TourneyPlayers.hh,v $ +// Revision 1.6 1998/09/10 19:58:41 mlong +// lots of little bug fixes and a few new features. +// +// Revision 1.5 1998/04/29 15:24:07 mlong +// prepairing for the move to daimi +// new sorting routine. +// +// Revision 1.4 1998/02/12 18:44:25 mlong +// *** empty log message *** +// +// Revision 1.3 1997/10/28 21:03:48 mlong +// *** empty log message *** +// +// Revision 1.2 1997/10/23 19:56:12 chess +// *** empty log message *** +// +// Revision 1.1 1997/05/14 16:59:13 chess +// Initial revision +// +// +//-------------------------------------------------------------------------- + +#ifndef _TOURNEYPLAYERS_ +#define _TOURNEYPLAYERS_ + +#include +#include + +extern "C" { +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +} + +#include "config.h" +#include "User.hh" +#include "link.hh" +#include "linklist.hh" +#include "Player.hh" +#include "types.h" + +class TourneyPlayers : public Link { +public: + TourneyPlayers(char *, int, float); + TourneyPlayers(); + ~TourneyPlayers(); + + void AddWhite(); + void AddBlack(); + void ClearWhites(); + void ClearBlacks(); + + int GetConsecutiveWhites(); + int GetConsecutiveBlacks(); + int GetTotalWhites(); + int GetTotalBlacks(); + int ColorDue(); + + int IsPaired(); + void NowPaired(int); + + int AlreadyPlayed(char *); + void CalculateScore(); + + int RemovePotentialOppList(); + Player *GetOpponentPlayer(char *); + void RemoveFromOppList(char *); + void RemoveLastOpponent(); + +private: + void ChangeColorDue(int); + + void CalculatePerform(); + +public: + + char name[NAMELEN]; + int rating; + float score; + int perform; + int upset; + int activeFlag; + double sortValue; + int oppChoice; + int location; + + char oppName[NAMELEN]; + + LinkList opponentList; + LinkList potentialOpponentList; + +private: + + int totalWhites; + int totalBlacks; + int consecutiveWhites; + int consecutiveBlacks; + int dueColor; + int paired; + +}; + + +#endif diff --git a/lasker-2.2.3/bots/mamer/User.cc b/lasker-2.2.3/bots/mamer/User.cc new file mode 100644 index 0000000..e7a7428 --- /dev/null +++ b/lasker-2.2.3/bots/mamer/User.cc @@ -0,0 +1,419 @@ +//-------------------------------------------------------------------------- +// User.cc - Source file for User class +// +// Matthew E. Moses +// +// $Revision: 1.10 $ +// $Date: 1998/09/10 19:57:17 $ +// +// $Author: mlong $ +// $Locker: $ +// +// $Log: User.cc,v $ +// Revision 1.10 1998/09/10 19:57:17 mlong +// lots of little bug fixes and a few new features +// +// Revision 1.9 1998/04/29 15:23:19 mlong +// prepairing for the move to daimi +// new sorting routine. +// +// +// Revision 1.7 1997/05/15 18:27:53 chess +// added pending and TourneyPlayers support +// added HandleGetPlayerInfo & HandleGetGameInfo +// +// Revision 1.6 1997/04/13 03:14:35 chess +// setstatistic and addabuse added for data manipulation +// +// Revision 1.4 1997/03/27 13:45:58 chess +// added functions to return user's statistics +// +// Revision 1.3 1997/03/21 15:29:53 moses +// changed the initial clearing of the name variable +// +// Revision 1.2 1996/10/01 20:14:43 moses +// added a new Method IsUser +// added a new Method GetManagerLevel +// +// Revision 1.1 1996/09/30 20:52:48 moses +// Initial revision +// +//-------------------------------------------------------------------------- + +// static char RCSid[] = "$Id: User.cc,v 1.10 1998/09/10 19:57:17 mlong Exp $"; + +#include "User.hh" + +//- Constructors ------------------------------------------------------------ +User::User() { + memset(name, '\0', NAMELEN); + abuse = 0; + playedTourneys = wins = losses = draws = 0; + firsts = seconds = thirds = 0; + rating = placePoints = 0.0; + + managerLevel = 0; + managedTourneys = 0; + last = 0; + tourneyLocation = 0; + + inTourney = 0; + + managerLevel = 0; + managedTourneys = 0; + last = 0; + +} //- End of User + +User::User(char *path, char *inName) { + abuse = 0; + playedTourneys = wins = losses = draws = 0; + firsts = seconds = thirds = 0; + rating = placePoints = 0.0; + char *lowername; + int i=0, length=strlen(inName); + + lowername = new char[NAMELEN]; + memset(name, '\0', NAMELEN); + memset(lowername, '\0', NAMELEN); + for(i = 0; i < length; i++) lowername[i] = tolower(inName[i]); + + strncpy(name, lowername, MIN(length, NAMELEN)); + + // printf("User:%s::%s::%s\n", inName, name, path); + + delete(lowername); + + managerLevel = 0; + managedTourneys = 0; + last = 0; + tourneyLocation = 0; + + inTourney = 0; + + // printf("User:%s::%s::%s\n", inName, name, path); + + if(0 == LoadPlayer(path, name)) + SavePlayer(path); +} //- End of User + +//- Deconstructor ---------------------------------------------------------- +User::~User() { + +} //- End of ~User + +//- IsUser ----------------------------------------------------------------- +int User::IsUser(char *user) { + // printf("IsUser: %18s :: %s\n", user, name); + + if(0 == strcasecmp(user, name)) + return(1); + else + return(0); +} //- End of IsUser + +//- LoadPlayer ------------------------------------------------------------- +void User::LoadPlayer(char *filePath) { + char filename[MAXPATHLEN]; + fstream theFile; + + CreateDirectory(filePath, name); + sprintf(filename, "%s/%c/%s", filePath, name[0], name); + theFile.open(filename, ios::in); + + theFile >> name >> abuse >> playedTourneys >> wins >> losses >> draws + >> firsts >> seconds >> thirds >> rating >> placePoints + >> managerLevel >> managedTourneys >> last >> tourneyLocation; + + CalculateRating(); + theFile.close(); +} //- End of LoadPlayer + +//- LoadPlayer ------------------------------------------------------------- +short User::LoadPlayer(char *filePath, char *user) { + struct stat statBuffer; + char filename[MAXPATHLEN]; + fstream theFile; + char *lowername; + int i=0, length=strlen(user); + + // printf("LoadPlayer: %18s :: %s :: %i\n", user, filePath, length); + + lowername = new char[NAMELEN]; + memset(lowername, '\0', NAMELEN); + for(i = 0; i < length; i++) lowername[i] = tolower(user[i]); + + user = lowername; + sprintf(filename, "%s/%c/%s", filePath, user[0], user); + + i = stat(filename, &statBuffer); + + // printf("%i filename: %s :: User: %18s :: %s\n", i, filename, name, user); + + if(0 == i) { + theFile.open(filename, ios::in); + + theFile >> name >> abuse >> playedTourneys >> wins >> losses >> draws + >> firsts >> seconds >> thirds >> rating >> placePoints + >> managerLevel >> managedTourneys >> last >> tourneyLocation; + + theFile.close(); + + // printf("%i filename: %s :: User: %18s :: %s\n", i, filename, name, user); + + return(1); + } + + delete(lowername); + + return(0); +} //- End of LoadPlayer + +//- SavePlayer ----------------------------------------------------------- +void User::SavePlayer(char *filePath) { + char filename[MAXPATHLEN]; + fstream theFile; + + CreateDirectory(filePath, name); + sprintf(filename, "%s/%c/%s", filePath, name[0], name); + + CalculateRating(); + + theFile.open(filename, ios::out); + + printf("Saving=%s Abuse=%i\n", name, abuse); + + theFile << name << " " << abuse << " " << playedTourneys << " " + << wins << " " << losses << " " << draws << " " << firsts << " " + << seconds << " " << thirds << " " << rating << " " + << placePoints << " " << managerLevel << " " + << managedTourneys << " " << last << " " << tourneyLocation + << endl; + theFile.close(); +} //- End of SavePlayer + +//- GetRating -------------------------------------------------------------- +float User::GetRating(void) { + return(rating); +} //- End of GetRating + +int User::GetAbuse(void) { + return(abuse); +} + +long User::GetWins(void) { + return(wins); +} + +long User::GetLosses(void) { + return(losses); +} + +long User::GetDraws(void) { + return(draws); +} + +long User::GetFirsts(void) { + return(firsts); +} + +long User::GetSeconds(void) { + return(seconds); +} + +long User::GetThirds(void) { + return(thirds); +} + +float User::GetPlacePoints(void) { + return(placePoints); +} + +long User::GetPlayedTourneys(void) { + return(playedTourneys); +} + +long User::GetManagedTourneys(void) { + return(managedTourneys); +} + +long User::GetLast(void) { + return(last); +} + +void User::SetLast(long n) { + last = n; +} + +//- AddAbuse --------------------------------------------------------------- +void User::AddAbuse(int num) { + abuse += num; + if(abuse < 0) + abuse = 0; +} //- End of AddAbuse + +//- ResetAbuse ------------------------------------------------------------- +void User::ResetAbuse(void) { + abuse = ABUSE_RESET_VALUE; +} //- End of ResetAbuse + +//- Start AddStat ----------------------------------------- +void User::AddStat(double i) { + if(i == 0.0) { + AddLoss(); + } else if(i == 0.5) { + AddDraw(); + } else if(i == 1.0) { + AddWin(); + } +}//- End AddStat ----------------------------------------- + +//- Start AddStat ----------------------------------------- +void User::AddStat(int i) { + switch(i) { + case 1: + AddFirst(); + break; + case 2: + AddSecond(); + break; + case 3: + AddThird(); + break; + default: + break; + } +}//- End AddStat ----------------------------------------- + +//- AddWin ----------------------------------------------------------------- +void User::AddWin(void) { + wins++; +} //- End of AddWin + +//- AddLoss ----------------------------------------------------------------- +void User::AddLoss(void) { + losses++; +} //- End of AddLoss + +//- AddDraw ----------------------------------------------------------------- +void User::AddDraw(void) { + draws++; +} //- End of AddDraw + +//- AddFirst ----------------------------------------------------------------- +void User::AddFirst(void) { + firsts++; +} //- End of AddFirst + +//- AddSecond ----------------------------------------------------------------- +void User::AddSecond(void) { + seconds++; +} //- End of AddSecond + +//- AddThird ----------------------------------------------------------------- +void User::AddThird(void) { + thirds++; +} //- End of AddThird + +//- AddPlayedTourney ------------------------------------------------------- +void User::AddPlayedTourney(void) { + playedTourneys++; +} //- End of playedTourney + +//- SetStatistic --------------------------------------------------------------- +int User::SetStatistic(int why, int newValue) { + + switch (why) { + case 1: + playedTourneys = newValue; + break; + case 2: + wins = newValue; + break; + case 3: + losses = newValue; + break; + case 4: + draws = newValue; + break; + case 5: + firsts = newValue; + break; + case 6: + seconds = newValue; + break; + case 7: + thirds = newValue; + break; + case 8: + abuse = newValue; + break; + case 9: + rating = (float)newValue/100.0; + break; + case 10: + managedTourneys = newValue; + break; + default: + return 0; + break; + } + + CalculateRating(); + return 1; +} //- End of SetStatistic + +//- CalculateRating --------------------------------------------------------- +void User::CalculateRating(void) { + int games = (wins + losses + draws); + + if((rating == 0.0) && ((wins + draws) > 0)) { + if(games != 0) + rating = (wins +(0.5 * draws)) / (games * 0.5); + } +} //- End of CalculateRating + +//- CalculateRating --------------------------------------------------------- +void User::CalculateRating(float tourn_expect, float pre_expect) { + if((tourn_expect + pre_expect) > 0) + rating = (wins + (draws * 0.5)) / (pre_expect + tourn_expect); +} //-End of CalculateRating + +//- AddManagedTourney ------------------------------------------------------- +void User::AddManagedTourney(void) { + managedTourneys++; +} //- End of AddManagedTourney + +//- ChangeManagerLevel ------------------------------------------------------ +void User::ChangeManagerLevel(int newLevel) { + managerLevel = newLevel; +} //- End of ChangeManagerLevel + +//- CreateDirectory --------------------------------------------------------- +void User::CreateDirectory(char *path, char *user) { + struct stat statBuffer; + char filename[MAXPATHLEN]; + + sprintf(filename, "%s/%c", path, user[0]); + if(-1 == stat(filename, &statBuffer)) { + switch(errno) { + case ENOENT: + if(-1 == mkdir(filename, S_IRUSR|S_IWUSR|S_IXUSR|S_IRGRP|S_IWGRP|S_IXGRP|S_IROTH|S_IXOTH)) { + switch(errno) { + case EACCES: + break; + case ENOENT: + break; + case ENOTDIR: + break; + } + } + break; + } + } +} //- End of CreateDirectory + +//- GetMangerLevel ---------------------------------------------------------- +int User::GetManagerLevel(void) { + return(managerLevel); +} //- End of GetManagerLevel diff --git a/lasker-2.2.3/bots/mamer/User.hh b/lasker-2.2.3/bots/mamer/User.hh new file mode 100644 index 0000000..9ef55e6 --- /dev/null +++ b/lasker-2.2.3/bots/mamer/User.hh @@ -0,0 +1,161 @@ +//-------------------------------------------------------------------------- +// User.hh - Class header for the User class +// +// Matthew E. Moses +// +// $Revision: 1.8 $ +// $Date: 1998/09/10 19:58:41 $ +// +// $Author: mlong $ +// $Locker: $ +// +// $Log: User.hh,v $ +// Revision 1.8 1998/09/10 19:58:41 mlong +// lots of little bug fixes and a few new features. +// +// Revision 1.7 1998/02/12 18:44:25 mlong +// *** empty log message *** +// +// Revision 1.6 1997/04/13 03:21:32 chess +// AddAbuse and SetStatistic added +// +// Revision 1.5 1997/04/07 22:22:12 chess +// *** empty log message *** +// +// Revision 1.4 1997/03/27 13:45:28 chess +// added functions to return user's statistics +// +// Revision 1.3 1997/03/21 15:29:53 moses +// *** empty log message *** +// +// Revision 1.2 1996/10/01 20:14:43 moses +// added methods +// +// Revision 1.1 1996/09/30 20:52:48 moses +// Initial revision +// +// +//-------------------------------------------------------------------------- + +#ifndef _USER_ +#define _USER_ + +#include +#include + +extern "C" { +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +} + +#include "config.h" +#include "link.hh" + +#ifndef NAMELEN +#define NAMELEN 19 +#endif + +class User : public Link { +public: + + User(); + User(char *, char *); + ~User(); + + int IsUser(char *); + + void LoadPlayer(char *); + short LoadPlayer(char *, char *); + + void SavePlayer(char *); + + float GetRating(void); + int GetManagerLevel(void); + + int GetAbuse(void); + long GetWins(void); + long GetLosses(void); + long GetDraws(void); + long GetFirsts(void); + long GetSeconds(void); + long GetThirds(void); + float GetPlacePoints(void); + long GetPlayedTourneys(void); + long GetManagedTourneys(void); + long GetLast(void); + void SetLast(long); + + void AddAbuse(int); + void ResetAbuse(void); + + void AddManagedTourney(); + void ChangeManagerLevel(int); + + void AddPlayedTourney(); + + int SetStatistic(int, int); + + void AddStat(double); + void AddStat(int); + void CalculateRating(float, float); + + private: + void CalculateRating(void); + + void AddWin(void); + void AddLoss(void); + void AddDraw(void); + + void AddFirst(void); + void AddSecond(void); + void AddThird(void); + + void CreateDirectory(char *, char *); + + public: + + int inTourney; + char name[NAMELEN]; + + private: + + int abuse; + + long playedTourneys; + + long wins; + long losses; + long draws; + + long firsts; + long seconds; + long thirds; + + float rating; + float placePoints; + + int managerLevel; + + long managedTourneys; + + long last; + int tourneyLocation; +}; + +#endif + + + + + diff --git a/lasker-2.2.3/bots/mamer/bin/CVS/Entries b/lasker-2.2.3/bots/mamer/bin/CVS/Entries new file mode 100644 index 0000000..3a2fd10 --- /dev/null +++ b/lasker-2.2.3/bots/mamer/bin/CVS/Entries @@ -0,0 +1,4 @@ +/cleaner.pl/1.1/Mon Jul 1 23:55:37 2002// +/hindex.pl/1.1/Mon Jul 1 23:55:37 2002// +/rank.pl/1.1/Mon Jul 1 23:55:37 2002// +D diff --git a/lasker-2.2.3/bots/mamer/bin/CVS/Repository b/lasker-2.2.3/bots/mamer/bin/CVS/Repository new file mode 100644 index 0000000..36abfc2 --- /dev/null +++ b/lasker-2.2.3/bots/mamer/bin/CVS/Repository @@ -0,0 +1 @@ +lasker/bots/mamer/bin diff --git a/lasker-2.2.3/bots/mamer/bin/CVS/Root b/lasker-2.2.3/bots/mamer/bin/CVS/Root new file mode 100644 index 0000000..c42ba94 --- /dev/null +++ b/lasker-2.2.3/bots/mamer/bin/CVS/Root @@ -0,0 +1 @@ +/home/cvs diff --git a/lasker-2.2.3/bots/mamer/bin/cleaner.pl b/lasker-2.2.3/bots/mamer/bin/cleaner.pl new file mode 100755 index 0000000..c4424fc --- /dev/null +++ b/lasker-2.2.3/bots/mamer/bin/cleaner.pl @@ -0,0 +1,20 @@ +#!/usr/local/bin/perl + +@dirList = ("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"); + +foreach $i (@dirList) { + opendir(THISDIR, "/Users/mlong/mamer/players/$i"); + @tempdir = sort(readdir(THISDIR)); + close(THISDIR); + + foreach $file (@tempdir) { +## print ("FILE = :$file:\n"); + if($file !~ /\.$/) { + if($file =~ /\s*/) { + print("unlink :$file :\n"); + unlink("/Users/mlong/mamer/players/$i/$file"); + } + } + } +} diff --git a/lasker-2.2.3/bots/mamer/bin/hindex.pl b/lasker-2.2.3/bots/mamer/bin/hindex.pl new file mode 100755 index 0000000..4c08a40 --- /dev/null +++ b/lasker-2.2.3/bots/mamer/bin/hindex.pl @@ -0,0 +1,32 @@ +#!/usr/local/bin/perl + +$dirpath = "/home/mlong/mamer/help/"; + +opendir(FILELIST, "$dirpath"); +@allfiles = readdir(FILELIST); +closedir(FILELIST); + +open(OUT, ">$dirpath/index"); +$i = 0; +$j = 0; +$offset = $#allfiles/4; +@allfiles = sort @allfiles; +foreach $a (@allfiles) { + if($allfiles[$i] !~ /\./) { + $temp[$j] = $allfiles[$i]; + $j++; + } + $i++; +} +@allfiles = @temp; +$i = 0; +#print OUT "$#allfiles files listed\n"; +while ($i <= ($#allfiles/4)) { + printf OUT + (" %-18s %-18s %-18s %-18s\n", + $allfiles[$i], $allfiles[$i+($offset*1)], + $allfiles[$i+($offset*2)], $allfiles[$i+($offset*3)]); + $i++; +} +#print OUT "\n"; +close(OUT); diff --git a/lasker-2.2.3/bots/mamer/bin/rank.pl b/lasker-2.2.3/bots/mamer/bin/rank.pl new file mode 100755 index 0000000..33e4590 --- /dev/null +++ b/lasker-2.2.3/bots/mamer/bin/rank.pl @@ -0,0 +1,50 @@ +#!/usr/local/bin/perl + +$PLAYER_DATA_PATH = "/home/mlong/mamer/players"; +$OUTFILE = "/home/mlong/mamer/data/rank.new"; + +# you should not have to change this its just where it belongs +@dirList = ("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", "_"); + +&main(); + +sub main { + foreach $a (@dirList) { + if(-d "$PLAYER_DATA_PATH/$a") { +# printf("$PLAYER_DATA_PATH/$a\n"); + opendir(THISDIR, "$PLAYER_DATA_PATH/$a"); + @tempdir = sort(readdir(THISDIR)); + close(THISDIR); + + foreach $file (@tempdir) { + if(!(-d "$PLAYER_DATA_PATH/$a/$file")) { +# printf ("Converting %s %s\n", $file, $PLAYER_DATA_PATH); + open(IN, "$PLAYER_DATA_PATH/$a/$file") || die "Can't open $file\n"; + while($line = ) { + chop($line); + ($n, $abuse, $tourneys, $w, $l, $d, $fsts, $scds, $thds, $rating, + $placePoints, $managerLevel, $managedTourneys, $last, $tourneyLocation) = split(/ /, $line); + if($tourneys > 4) { + $rank{$n} = "$rating $n $tourneys"; + } + } + close(IN); + } + } + } + } + $i = 0; + $last = 0; + foreach $a (reverse (sort (values %rank))) { + ($b, $c, $d) = split(/ /, $a); + if($b != $last) { + $i++; + $last = $b; + } + open(OUT, ">>$OUTFILE") || die "Can't open $OUTFILE\n"; + printf OUT ("%-18s %d %4.2f\n", $c, $d, $b); + close(OUT); + } +} + diff --git a/lasker-2.2.3/bots/mamer/command_list.h b/lasker-2.2.3/bots/mamer/command_list.h new file mode 100644 index 0000000..085492b --- /dev/null +++ b/lasker-2.2.3/bots/mamer/command_list.h @@ -0,0 +1,131 @@ +//-------------------------------------------------------------------------- +// command_list.h - List of all the commands for mamer and their respective +// parameter lists. +// +// Matthew E. Moses & Michael A. Long +// +// $Revision: 1.2 $ +// $Date: 1997/10/08 21:03:08 $ +// +// $Author: chess $ +// $Locker: $ +// +// $Log: command_list.h,v $ +// Revision 1.2 1997/10/08 21:03:08 chess +// no log message +// +// Revision 1.1 1997/04/08 23:12:33 chess +// Initial revision +// +// +//-------------------------------------------------------------------------- + +#ifndef _COMLIST_ +#define _COMLIST_ + +/* + Parameter string format + w - a word + o - an optional word + d - integer + p - optional integer + i - word or integer + n - optional word or integer + s - string to end + t - optional string to end + + If the parameter option is given in lower case then the parameter is + converted to lower case before being passsed to the function. If it is + in upper case, then the parameter is passed as typed. + */ + + +/*********************** + * Command List * + ***********************/ +t_cmds commands[] = { + {"abort", "d", AbortTourney, MANAGER }, + {"addabuse", "w", AddAbuse, MANAGER }, + {"announce", "d", AnnounceTourney, MANAGER }, + {"best", "", ListBest, USER }, + {"close", "d", CloseTourney, MANAGER }, + {"finger", "o", FingerUser, USER }, + {"forfeit", "wd", ForfeitUser, MANAGER }, + {"games", "d", ListGamesInTourney, USER }, + {"grid", "d", ListGridForTourney, USER }, + {"help", "o", Help, USER }, + {"info", "p", ListTourneyInfo, USER }, + {"join", "d", JoinTourney, USER }, + {"last", "", LastFinishedTourneys, USER }, + {"load", "o", LoadSavedTourney, MANAGER }, + {"loadedusers", "", LoadedUsers, MANAGER }, + {"manage", "d", ManageTourney, MANAGER }, + {"managers", "", ListManagers, USER }, + {"messman", "", MessageManagers, SUPERMANAGER }, + {"newmgr", "w", AddManagerToList, SUPERMANAGER }, + {"open", "d", OpenTourney, MANAGER }, + {"pairings", "d", PairingsInTourney, USER }, + {"players", "d", ListPlayersInTourney, USER }, + {"pose", "wT", PoseAsMamer, PRESIDENT }, + {"quit", "", Shutdown, SUPERMANAGER }, + {"rank", "o", RankUser, USER }, + {"reopen", "d", ReopenTourney, MANAGER }, + {"resetabuse", "w", ResetAbuse, SUPERMANAGER }, + {"results", "d", ResultsFromTourney, USER }, + {"rmmgr", "w", DeleteManagerFromList, SUPERMANAGER }, + {"set", "wn", SetVariable, MANAGER }, + {"setlevel", "wd", SetManagerLevel, SUPERMANAGER }, + {"setres", "dwwd", SetResult, MANAGER }, + {"setscore", "dwd", SetScore, MANAGER }, + {"standings", "d", ListStandingsTourney, USER }, + {"start", "d", StartTourney, MANAGER }, + {"subabuse", "d", SubtractAbuse, SUPERMANAGER }, + {"tourneys", "", ListTourneys, USER }, + {"unmanage", "d", UnmanageTourney, MANAGER }, + {"uncensor", "w", UncensorUser, SUPERMANAGER }, + {"version", "", ShowVersion, USER }, + {"who", "d", ListPlayerInTourney, USER }, + {"withdraw", "d", WithdrawFromTourney, USER }, + {"worst", "", ListWorst, USER }, + { NULL, NULL } +}; + + +/************************ + * Command Aliases * + ************************/ +t_cmds aliases[] = { + {"abor", do_abort }, + {"adda", do_addabuse }, + {"ann", do_announce }, + {"cl", do_close }, + {"fi", do_finger }, + {"for", do_forfeit }, + {"ga", do_games }, + {"gr", do_grid }, + {"he", do_help }, + {"inf", do_set }, + {"mm", do_messman }, + {"op", do_open }, + {"pair", do_games }, + {"pl", do_players }, + {"po", do_pose }, + {"qui", do_quit }, + {"reopen", do_reopen }, + {"reseta", do_resetabuse }, + {"resu", do_results }, + {"rm", do_rmmgr }, + {"setl", do_setlevel }, + {"setr", do_setres }, + {"sets", do_setscore }, + {"stand", do_standings }, + {"suba", do_subabuse }, + {"unm", do_unmanage }, + {"unc", do_uncensor }, + {"ver", do_version }, + {"wo", do_worst }, + {NULL, NULL } +}; + + +#endif diff --git a/lasker-2.2.3/bots/mamer/config.h b/lasker-2.2.3/bots/mamer/config.h new file mode 100644 index 0000000..73a9b4c --- /dev/null +++ b/lasker-2.2.3/bots/mamer/config.h @@ -0,0 +1,149 @@ + //-------------------------------------------------------------------------- +// config.h - default configuration parameters if the config file doesn't +// exist, or the value isn't in the config file. Can be +// overridden during the build by using the DEFINES flags. +// +// Matthew E. Moses & Michael A. Long +// +// $Revision: 1.5 $ +// $Date: 1998/09/10 19:58:20 $ +// +// $Author: mlong $ +// $Locker: $ +// +// $Log: config.h,v $ +// Revision 1.5 1998/09/10 19:58:20 mlong +// *** empty log message *** +// +// Revision 1.4 1998/06/18 18:42:09 mlong +// prepairing for yet another move. +// +// Revision 1.3 1998/04/18 19:00:07 mlong +// y +// +// Revision 1.2 1997/10/08 21:03:08 chess +// no log message +// +// Revision 1.1 1996/09/30 20:52:48 moses +// Initial revision +// +// +//-------------------------------------------------------------------------- + +#ifndef _CONFIG_ +#define _CONFIG_ + +#ifndef CONFIG_FILENAME +#define CONFIG_FILENAME "./mamer.config" +#endif + +#ifndef DEFAULT_PATH +#define DEFAULT_PATH "/home/mlong/mamer" +#endif + +#ifndef DEFAULT_HELP_FILE_PATH +#define DEFAULT_HELP_FILE_PATH "help" +#endif + +#ifndef DEFAULT_DATA_PATH +#define DEFAULT_DATA_PATH "data" +#endif + +#ifndef DEFAULT_LOG_FILE +#define DEFAULT_LOG_FILE "logs/mamer" +#endif + +#ifndef DEFAULT_USER_PATH +#define DEFAULT_USER_PATH "players" +#endif + +#ifndef DEFAULT_HOSTNAME +#define DEFAULT_HOSTNAME "ics.onenet.net" +#endif + +#ifndef DEFAULT_PORT +#define DEFAULT_PORT 5000 +#endif + +#ifndef DEFAULT_CHANNEL +#define DEFAULT_CHANNEL 49 +#endif + +#ifndef DEFAULT_USERNAME +#define DEFAULT_USERNAME "mamertesti" +#endif + +#ifndef DEFAULT_PASSWORD +#define DEFAULT_PASSWORD "fkdi29s" +#endif + +#ifndef ABUSE_INCREMENT_VALUE +#define ABUSE_INCREMENT_VALUE 1 +#endif + +#ifndef ABUSE_RESET_VALUE +#define ABUSE_RESET_VALUE 5 +#endif + +#ifndef FIRSTPLACEVALUE +#define FIRSTPLACEVALUE 5 +#endif + +#ifndef MAX_ROUNDS +#define MAX_ROUNDS 10 +#endif + +#ifndef MAX_INCREMENT +#define MAX_INCREMENT 60 +#endif + +#ifndef MAX_TIME +#define MAX_TIME 9000 +#endif + +#ifndef DEFAULT_MAX_PLAYERS +#define DEFAULT_MAX_PLAYERS 16 +#endif + +#ifndef DEFAULT_TIME +#define DEFAULT_TIME 4 +#endif + +#ifndef DEFAULT_INCREMENT +#define DEFAULT_INCREMENT 0 +#endif + +#ifndef DEFAULT_ROUNDS +#define DEFAULT_ROUNDS 0 +#endif + +#ifndef PENALTY_PER_ROUND +#define PENALTY_PER_ROUND 10 +#endif + +#ifndef KEEP_TOURNEY_TIME +#define KEEP_TOURNEY_TIME 7200 +#endif + +#ifndef SEC_BETWEEN_CSHOUTS +#define SEC_BETWEEN_CSHOUTS 240 +#endif + +#ifndef MAX_CHAOS_POINTS +#define MAX_CHAOS_POINTS 100 +#endif + +// MINIMUM_ROUNDS should always be less than MINIMUM_PLAYERS + +#ifndef MINIMUM_ROUNDS +#define MINIMUM_ROUNDS 3 +#endif + +#ifndef MINIMUM_PLAYERS +#define MINIMUM_PLAYERS 4 +#endif + +#endif + + + diff --git a/lasker-2.2.3/bots/mamer/data/CVS/Entries b/lasker-2.2.3/bots/mamer/data/CVS/Entries new file mode 100644 index 0000000..5afe01a --- /dev/null +++ b/lasker-2.2.3/bots/mamer/data/CVS/Entries @@ -0,0 +1,2 @@ +/managers/1.1/Mon Jul 1 23:55:42 2002// +D diff --git a/lasker-2.2.3/bots/mamer/data/CVS/Repository b/lasker-2.2.3/bots/mamer/data/CVS/Repository new file mode 100644 index 0000000..bb6500e --- /dev/null +++ b/lasker-2.2.3/bots/mamer/data/CVS/Repository @@ -0,0 +1 @@ +lasker/bots/mamer/data diff --git a/lasker-2.2.3/bots/mamer/data/CVS/Root b/lasker-2.2.3/bots/mamer/data/CVS/Root new file mode 100644 index 0000000..c42ba94 --- /dev/null +++ b/lasker-2.2.3/bots/mamer/data/CVS/Root @@ -0,0 +1 @@ +/home/cvs diff --git a/lasker-2.2.3/bots/mamer/data/managers b/lasker-2.2.3/bots/mamer/data/managers new file mode 100644 index 0000000..e69de29 diff --git a/lasker-2.2.3/bots/mamer/help/CVS/Entries b/lasker-2.2.3/bots/mamer/help/CVS/Entries new file mode 100644 index 0000000..fe12bd6 --- /dev/null +++ b/lasker-2.2.3/bots/mamer/help/CVS/Entries @@ -0,0 +1,40 @@ +/about/1.1/Mon Jul 1 23:55:47 2002// +/addchaos/1.1/Mon Jul 1 23:55:47 2002// +/addtotourney/1.1/Mon Jul 1 23:55:47 2002// +/announce/1.1/Mon Jul 1 23:55:47 2002// +/chaos/1.1/Mon Jul 1 23:55:47 2002// +/close/1.1/Mon Jul 1 23:55:47 2002// +/create/1.1/Mon Jul 1 23:55:47 2002// +/delete/1.1/Mon Jul 1 23:55:47 2002// +/finger/1.1/Mon Jul 1 23:55:47 2002// +/forfeit/1.1/Mon Jul 1 23:55:47 2002// +/help/1.1/Mon Jul 1 23:55:47 2002// +/index/1.1/Mon Jul 1 23:55:47 2002// +/join/1.1/Mon Jul 1 23:55:47 2002// +/keep/1.1/Mon Jul 1 23:55:47 2002// +/listmanagers/1.1/Mon Jul 1 23:55:47 2002// +/listplayers/1.1/Mon Jul 1 23:55:47 2002// +/listtourneys/1.1/Mon Jul 1 23:55:47 2002// +/listtourneyvars/1.1/Mon Jul 1 23:55:47 2002// +/loadedusers/1.1/Mon Jul 1 23:55:47 2002// +/manager_commands/1.1/Mon Jul 1 23:55:47 2002// +/manager_help/1.1/Mon Jul 1 23:55:47 2002// +/manager_level/1.1/Mon Jul 1 23:55:47 2002// +/messman/1.1/Mon Jul 1 23:55:47 2002// +/open/1.1/Mon Jul 1 23:55:47 2002// +/performance/1.1/Mon Jul 1 23:55:47 2002// +/rating/1.1/Mon Jul 1 23:55:47 2002// +/setcommandlevel/1.1/Mon Jul 1 23:55:47 2002// +/setmanagerlevel/1.1/Mon Jul 1 23:55:47 2002// +/setres/1.1/Mon Jul 1 23:55:47 2002// +/setstat/1.1/Mon Jul 1 23:55:47 2002// +/settourneyvar/1.1/Mon Jul 1 23:55:47 2002// +/showcommands/1.1/Mon Jul 1 23:55:47 2002// +/showhelpfile/1.1/Mon Jul 1 23:55:47 2002// +/shutdown/1.1/Mon Jul 1 23:55:47 2002// +/swiss/1.1/Mon Jul 1 23:55:47 2002// +/upset/1.1/Mon Jul 1 23:55:47 2002// +/user_commands/1.1/Mon Jul 1 23:55:47 2002// +/who/1.1/Mon Jul 1 23:55:47 2002// +/withdraw/1.1/Mon Jul 1 23:55:47 2002// +D diff --git a/lasker-2.2.3/bots/mamer/help/CVS/Repository b/lasker-2.2.3/bots/mamer/help/CVS/Repository new file mode 100644 index 0000000..67d2184 --- /dev/null +++ b/lasker-2.2.3/bots/mamer/help/CVS/Repository @@ -0,0 +1 @@ +lasker/bots/mamer/help diff --git a/lasker-2.2.3/bots/mamer/help/CVS/Root b/lasker-2.2.3/bots/mamer/help/CVS/Root new file mode 100644 index 0000000..c42ba94 --- /dev/null +++ b/lasker-2.2.3/bots/mamer/help/CVS/Root @@ -0,0 +1 @@ +/home/cvs diff --git a/lasker-2.2.3/bots/mamer/help/about b/lasker-2.2.3/bots/mamer/help/about new file mode 100644 index 0000000..706a7ff --- /dev/null +++ b/lasker-2.2.3/bots/mamer/help/about @@ -0,0 +1,32 @@ + NOTE: This file dates back to 1996, and some of the information in it + is no longer accurate. However, it has been preserved because it + contains interesting historical information. + + This program is an automated Tournament Direct for use with online + Chess servers mainly FICS. If it is used with anything other than + FICS at this time it will crash with out question. It is programmed + to respond to the parsing of FICS text only. Fred Baumgarten + originally wrote this code because there was a need and Chevier Joel + the creator of Tomato would not share the code. Fred gave me the code + in mid 1995 with the stipulation I not release it to anyone. I + have modified and (I hope) improved mame (now mamer). + Jean (current programmer of Tomato) and I are working very + closely on developing similar features and improving both tournament + directors. Our current project is to create a rating system that will + be used by both Mamer and Tomato. + + Mamer stands for "manage me". Plus the -r- for the + differentiation between mame (Fred's) code and mamer (mlong's) code. + Fred's words follow: The intention to write this tournament director + program came out of the need to have such a program. Tomato - used at + FICS and written by darkside was not released to the public. Darkside + even did not want to accept a non disclosure agreement - so I decided + to write such a program myself. The program is written in C and will + support a bunch of new features soon. It is beta state since Version + 0.5 but there _are_ bugs. + Fred Baumgarten . Have fun !!! + + Mamer is maintained and coded here on FICS by mlong. PLEASE! FOR BUGS + PERTAINING TO MAMER TALK TO mlong. + +[Last modified: September 12, 1998 -- toddmf] diff --git a/lasker-2.2.3/bots/mamer/help/addchaos b/lasker-2.2.3/bots/mamer/help/addchaos new file mode 100644 index 0000000..dd7811d --- /dev/null +++ b/lasker-2.2.3/bots/mamer/help/addchaos @@ -0,0 +1,16 @@ +addchaos + +Alias: ac + +Usage: addchaos + +Reserved for mamer managers (level of 25 or higher) + +Use this command to give chaos points to . If you do not +specify the number of points, 1 will be added. To take chaos points away, add +a negative number of chaos points ("addchaos abc -10" removes 10 of abc's +chaos points). + +See also: chaos + +[Last modified: August 29, 1998 -- toddmf] diff --git a/lasker-2.2.3/bots/mamer/help/addtotourney b/lasker-2.2.3/bots/mamer/help/addtotourney new file mode 100644 index 0000000..fedbc7f --- /dev/null +++ b/lasker-2.2.3/bots/mamer/help/addtotourney @@ -0,0 +1,18 @@ +addtotourney + +Alias: att + +Usage: addtotourney + +Reserved for mamer managers (level of 50 or higher) + +This command forces to join the specified tourney number. Its main +usage is to quickly create a test tourney, but it can also be used to get a +player new to mamer in to a tourney that is about to start when he/she cannot +figure out how to join. If you use this command in this fashion, please +inform the player how to join future tourneys so that the player does not rely +on managers to add him/her to the tourney. + +See also: join + +[Last modified: August 29, 1998 -- toddmf] diff --git a/lasker-2.2.3/bots/mamer/help/announce b/lasker-2.2.3/bots/mamer/help/announce new file mode 100644 index 0000000..66154d4 --- /dev/null +++ b/lasker-2.2.3/bots/mamer/help/announce @@ -0,0 +1,19 @@ +announce + +Alias: ann + +Usage: announce + +Reserved for mamer managers (level 10 or higher) + +The announce command causes the specified tourney to be announced in channel +49. The tourney announcement looks like this: + +mamer(TD)(49): *****Tourney Announcement***** +\ Trny #5 3 0 r SWISS 0-9999 6 plr(s). tell mamer join 5. Avg: 1543.5 + +This announcement is also cshouted when the tourney is opened, but "announce" +will only cshout the announcement once every four minutes. Please do not spam +channel 49 with tourney announcements; 1 or 2 per minute is sufficient. + +[Last modified: September 12, 1998 -- toddmf] diff --git a/lasker-2.2.3/bots/mamer/help/chaos b/lasker-2.2.3/bots/mamer/help/chaos new file mode 100644 index 0000000..4453f96 --- /dev/null +++ b/lasker-2.2.3/bots/mamer/help/chaos @@ -0,0 +1,20 @@ +chaos + +Chaos points are gained for disrupting a tourney and lost when you complete a +tourney successfully. If you are forfeited or withdraw from a tourney in +progress, you will gain 10 chaos points for every game you miss. Other +tourney disruptions, including(but not limited to) profanity, playing +non-tourney games, and misuse of the the tourney channel(telling channel 49 +"hi mamer" repeatedly, for example) will usually be rewarded with 10 to 20 +chaos points at the manager's discretion. If you are given chaos points by +the manager, you will be sent a message explaining why you gained the points. +If you feel you have been unfairly given chaos points, contact mamer's Chief +Operating Officer(currently toddmf). If you complete a tourney without +withdrawing or being forfeited, you will lose one chaos point per round +played. If you reach 100 chaos points, mamer will censor you, preventing you +from playing in mamer tournaments. You can check how many chaos points you +have by using mamer's "finger" command(type "mam finger"). + +See also: finger, forfeit, withdraw + +[Last modified: September 1, 1998 -- toddmf] diff --git a/lasker-2.2.3/bots/mamer/help/close b/lasker-2.2.3/bots/mamer/help/close new file mode 100644 index 0000000..b527e1d --- /dev/null +++ b/lasker-2.2.3/bots/mamer/help/close @@ -0,0 +1,16 @@ +close + +Alias: cl + +Usage: close + +Reserved for mamer managers (level 10 or higher) + +This command closes the specified tourney and starts it, preventing more +players from joining. If the amount of players who have joined reaches the +"Max Players" set in the tourney's variables, the tourney will close and start +automatically. + +See also: listtourneyvars, settourneyvar + +[Last modified: August 29, 1998 -- toddmf] diff --git a/lasker-2.2.3/bots/mamer/help/create b/lasker-2.2.3/bots/mamer/help/create new file mode 100644 index 0000000..3cc0ecd --- /dev/null +++ b/lasker-2.2.3/bots/mamer/help/create @@ -0,0 +1,12 @@ +create + +Usage: create + +Alias: cr + +Reserved for mamer managers (level of 10 or higher) + +This command creates a new tourney and assigns it a tourney number. + +[Last modified: July 31, 1998 -- toddmf] + diff --git a/lasker-2.2.3/bots/mamer/help/delete b/lasker-2.2.3/bots/mamer/help/delete new file mode 100644 index 0000000..0e79c37 --- /dev/null +++ b/lasker-2.2.3/bots/mamer/help/delete @@ -0,0 +1,15 @@ +delete + +Alias: del + +Usage: delete + +Use the "delete" command to delete the specified tourney. The most common +usage of this is to delete a tourney in which there are not enough players to +close and start. Mamer deletes tourneys that are not "kept" two hours after +their completion. Please do not delete the tourneys before then, as many +users view the standings of recent tourneys. + +See also: close, keep + +[Last modified: August 29, 1998 -- toddmf] diff --git a/lasker-2.2.3/bots/mamer/help/finger b/lasker-2.2.3/bots/mamer/help/finger new file mode 100644 index 0000000..5502d31 --- /dev/null +++ b/lasker-2.2.3/bots/mamer/help/finger @@ -0,0 +1,38 @@ +finger + +Alias: fi + +Usage: finger + +Use the "finger" command to find out a player's mamer statistics. If you do +not specify the handle, you will see your own statistics. Here is a sample +"finger": + +:toddmf's Stats: +: +:Name Tnys W L D 1st 2nd 3rd Chaos Rating +:----------------- ----- ---- ---- --- --- --- --- ----- ------ +:toddmf 751 1894 767 133 355 219 0 0 1.41 +: +:Manager Level: 75 + +"Name" is the handle of the player you are fingering. +"Tnys" is the number of tourneys he/she has played in. +"W" is the number of games he/she has won in tourneys. +"L" is the number of games he/she has lost in tourneys. +"D" is the number of games he/she has drawn in tourneys. +"1st" is the number times he/she has finished in or tied for first place. +"2nd" is the number times he/she has finished in or tied for second place. +"3rd" is the number times he/she has finished in or tied for first place. +"Chaos" is the number of Chaos Points he/she has. +"Rating" is the player's mamer rating. +"Manager Level" is only displayed for mamer managers. + + +NOTE: "3rd"s have been recorded for a much shorter time than "1st"s and + "2nd"s. Thus, many players have finished in 3rd more than the amount + of times indicated. + +See also: chaos, manager_level, mamer_rating + +[Last modified: August 29, 1998 -- toddmf] diff --git a/lasker-2.2.3/bots/mamer/help/forfeit b/lasker-2.2.3/bots/mamer/help/forfeit new file mode 100644 index 0000000..2e76fce --- /dev/null +++ b/lasker-2.2.3/bots/mamer/help/forfeit @@ -0,0 +1,21 @@ +forfeit + +Alias: fo + +Usage: forfeit + +Reserved for mamer managers (level 10 or higher) + +The "forfeit" command forfeits the specified handle from the specified +tourney. If a player is forfeited from an open tourney, he is removed from the +tourney with no penalty. If the tourney is in progress when the player is +forfeited, the player will gain chaos points equal to 10 times the number of +rounds he/she missed. Please remove these chaos points if you feel they are +unwarranted. If the tourney is in progress and it is a round robin, the +results of the player's games are all set to 0-0. If the tourney is in +progress and it is a swiss, the player's results for completed games stand, +but he/she loses all uncompleted games by forfeit. + +See also: chaos, swiss + +[Last modified: September 1, 1998 -- toddmf] diff --git a/lasker-2.2.3/bots/mamer/help/help b/lasker-2.2.3/bots/mamer/help/help new file mode 100644 index 0000000..918a2e5 --- /dev/null +++ b/lasker-2.2.3/bots/mamer/help/help @@ -0,0 +1,16 @@ +help + +Alias: h + +Usage: help + +This command displays a list of all of mamer's commands, their aliases, the +minimum manager level needed to use them, and a short summary of the command's +function. If you are not a mamer manager, you can use the commands marked as +level 0 commands. + +NOTE: The "help" command is equivalent to the "showcommands" command. + +See also: manager_level, showcommands, usage + +[Last modified: August 29, 1998 -- toddmf] diff --git a/lasker-2.2.3/bots/mamer/help/index b/lasker-2.2.3/bots/mamer/help/index new file mode 100644 index 0000000..f135302 --- /dev/null +++ b/lasker-2.2.3/bots/mamer/help/index @@ -0,0 +1,10 @@ + about forfeit manager_commands settourneyvar + addchaos help manager_help showcommands + addtotourney index manager_level showhelpfile + announce join messman shutdown + chaos keep open swiss + close listmanagers performance upset + create listplayers rating user_commands + delete listtourneys setmanagerlevel who + finger listtourneyvars setres withdraw + forfeit loadedusers setstat diff --git a/lasker-2.2.3/bots/mamer/help/join b/lasker-2.2.3/bots/mamer/help/join new file mode 100644 index 0000000..2392be1 --- /dev/null +++ b/lasker-2.2.3/bots/mamer/help/join @@ -0,0 +1,13 @@ +join + +Alias: j + +Usage: join + +Use this command to join the specified tourney. You can only join an open +tourney. To find a list of open tourneys, use the "listtourneys" command and +look for tourneys with a status of "open". + +See also: listtourneys + +[Last modified: August 29, 1998 -- toddmf] diff --git a/lasker-2.2.3/bots/mamer/help/keep b/lasker-2.2.3/bots/mamer/help/keep new file mode 100644 index 0000000..3c914b6 --- /dev/null +++ b/lasker-2.2.3/bots/mamer/help/keep @@ -0,0 +1,17 @@ +keep + +Alias: k + +Usage: keep + +This command is used to edit the "keep" status of a tourney. If the keep +status is true, mamer will not automatically delete the tourney. If it is +false, mamer will automatically delete the tourney two hours after its +completion. "keep # 1" or "keep # y"(y is short for yes) will set the keep +status to true. Using anything else but 1 or y will set it to false. This +command is most commonly used to save a scheduled tourney or a tourney with +bugs so that it can be examined later. + +See also: delete + +[Last modified: August 29, 1998 -- toddmf] diff --git a/lasker-2.2.3/bots/mamer/help/listmanagers b/lasker-2.2.3/bots/mamer/help/listmanagers new file mode 100644 index 0000000..a174cf8 --- /dev/null +++ b/lasker-2.2.3/bots/mamer/help/listmanagers @@ -0,0 +1,14 @@ +listmanagers + +Alias: lm + +Usage: listmanagers + +This command displays a list of all the managers, their manager level, the +total number of tourneys they have managed, and the date of the last tourney +they managed. Managers marked with a "+" before their handle are currently +online. + +See also: manager_level + +[Last modified: August 29, 1998 -- toddmf] diff --git a/lasker-2.2.3/bots/mamer/help/listplayers b/lasker-2.2.3/bots/mamer/help/listplayers new file mode 100644 index 0000000..9922cc4 --- /dev/null +++ b/lasker-2.2.3/bots/mamer/help/listplayers @@ -0,0 +1,45 @@ +listplayers + +Alias: lp + +Usage: listplayers + +This command lists all the players in the specified tourney and other +information about the players in the tourney. + +: Name Rating Score Perfrm Upset Results +: ----------------- ------ ----- ------ ------ ------- +: 1 +ghettoCHECKMATE [1651] 3.0 [2242] [ 573] +07b +02b +04w +: 2 +TheOnlyOne [1914] 2.0 [1764] [ 0] +03b -01w +05w +: 3 +westham [1725] 2.0 [1843] [ 47] -02w +04b +06w +: 4 +frankenschach [1772] 1.0 [1497] [ 0] +05w -03w -01b +: 5 +Arbakov [1516] 1.0 [1443] [ 0] -04b +06w -02b +: 6 +Ostap [forf] 0.0 [1251] [ 0] -01w +: +: Average Rating 1736.3 + +The number in the leftmost column is the player's current ranking in the +tourney. + +"Name" is the player's handle. A "+" to the left indicates that the player is + currently logged in. A "-" indicates that he is not. +"Rating" is the player's FICS rating before the tourney started in the + category of games played in the tourney. "forf" means the player is no + longer in the tourney. +"Score" is the number of tourney points the player has. 1.0 is awarded for + each win, 0.5 for each draw, and 0.0 for each loss. +"Perfrm" is the player's performance rating for the tourney. +"Upset is the number of upset points the player has. +"Results" is a grid of the tourney results. "+" represents a win, "=" + represents a draw, and "-" represents a loss. The number following is + the ranking of the opponent in the tourney(see the leftmost column). + The letter following that is the color played. "b" is black; "w" is + white. +"Average Rating" is the average rating of all the players in the tourney. + The ratings used are ratings when the players join the tourney. + +NOTE: This command is the same as the "who" command. + +See also: performance, upset, who + +[Last modified: August 29, 1998 -- toddmf] diff --git a/lasker-2.2.3/bots/mamer/help/listtourneys b/lasker-2.2.3/bots/mamer/help/listtourneys new file mode 100644 index 0000000..6fc2d2e --- /dev/null +++ b/lasker-2.2.3/bots/mamer/help/listtourneys @@ -0,0 +1,32 @@ +listtourneys + +Alias: lt + +Usage: listtourneys + +This command lists all tourneys in mamer's memory. This includes all tourneys +currently open, all tourneys in progress, recent tourneys that have ended, +and tourneys that have been marked for saving. Here is a sample tourney list: + +:mamer Notes: +: No. Rds Sty Time Inc Md Vrnt Rtng Rnge Status Started at Ended at +: --- --- --- ---- --- -- ---- --------- ------ ---------- -------- +: 1 3 r 3 0 r r 0-9999 done 00:23 08/30/98 00:58 08/30/98 +: 2 3 s 3 0 r r 0-9999 closed 01:00 08/30/98 n/a +: 3 0 s 0 1 u s 0-9999 open n/a n/a + + +"No." indicates the tourney number. +"Rds", "Sty", "Time", "Inc", "Md", "Vrnt", and "Rtng Rnge" are + variables that determine who may join a tourney and the type of games + played in the tourney. See "mam help listtourneyvars" for more detailed + information about these variables. +"Status" indicates the current status of the tourney: open, closed, or done. +"Started at" indicates the time(using server time) and date the tourney + started. n/a indicates that the tourney has not yet started. +"Ended at" indicates the time(using server time) and date the tourney ended. + n/a indicates that the tourney has not yet ended. + +See also: listtourneyvars + +[Last modified: August 29, 1998 -- toddmf] diff --git a/lasker-2.2.3/bots/mamer/help/listtourneyvars b/lasker-2.2.3/bots/mamer/help/listtourneyvars new file mode 100644 index 0000000..bfd44ed --- /dev/null +++ b/lasker-2.2.3/bots/mamer/help/listtourneyvars @@ -0,0 +1,46 @@ +listtourneyvars + +Alias: vars + +Usage: listtourneyvars + +This command lists thr variables for the specified tourney number. Here is a +sample variable listing: + +: (T)ime: 4 +: (I)ncrement: 0 +: (R)ounds: 0 +: Max (P)layers: 16 +: (M)ode: r (r)ated or (u)nrated +: (S)tyle: s (s)wiss or (r)oundrobin +: (V)ariant: w (w)ild, (r)egular, (b)ug, or (s)uicide +: (W)ild Type: 10 (0), (1), (2), (3), (4), (5), (8), (9)8a, (10)fr +: Rating (L)ow: 0 +: Rating (H)igh: 9999 +: +: Manager: toddmf + +The letters in () refer to the variable shortcut to be used when changing a +value for a variable. Here is what the variables mean: + + Time -- Same as always: minutes to start the game with + Increment -- Same as always: additional seconds per move + Rounds -- Number of rounds in the tourney. If this is 0, mamer will + choose an optimal number of rounds. + Max Players -- The tourney will automatically close and start when this + many players have joined. + Mode -- Will the tourney games be rated or unrated? + Style -- Round Robin(everyone plays everyone) or Swiss System(system + where, generally speaking, players play opponents with the + same score in the tourney each round). + Variant -- What type of game is being played? Regular is used for + blitz, standard, and lightning. + Wild Type -- This only appears when Variant is set to Wild. This is the + type of wild that will be played. + Rating Low -- Players with a rating lower than this cannot join. + Rating High -- Players with a rating higher than this cannot join. + Manager -- The handle of this tourney's manager. + +See also: settourneyvar, swiss + +[Last modified: September 1, 1998 -- toddmf] diff --git a/lasker-2.2.3/bots/mamer/help/loadedusers b/lasker-2.2.3/bots/mamer/help/loadedusers new file mode 100644 index 0000000..b4da362 --- /dev/null +++ b/lasker-2.2.3/bots/mamer/help/loadedusers @@ -0,0 +1,13 @@ +loadedusers + +Alias: lu + +Usage: loadedusers + +Reserved for mamer managers (level 25 or higher) + +This command lists all players who have sent mamer a tell since it has been +logged in. This can be used to find out if a player who is having trouble +using mamer has even reached the point of sending a tell to it. + +[Last modified: August 29, 1998 -- toddmf] diff --git a/lasker-2.2.3/bots/mamer/help/manager_commands b/lasker-2.2.3/bots/mamer/help/manager_commands new file mode 100644 index 0000000..2cda736 --- /dev/null +++ b/lasker-2.2.3/bots/mamer/help/manager_commands @@ -0,0 +1,23 @@ +manager_commands + +addchaos | ac | 25 | Adds (or subs) chaos points. +announce | ann | 10 | Announce the tournament to the working +\ channel. +addtotourney | att | 50 | Add a user to a tourney. +create | cr | 10 | Creates a new tournament. +close | cl | 10 | Closes and starts a tournament. +delete | del | 10 | Deletes a tournament. +forfeit | fo | 10 | Remove a user from a tourney. +keep | k | 25 | Keep a tourney in memory. +listrank | rank | 100 | Displays player rank. +loadedusers | lu | 25 | Displays the loaded users. +messman | mm | 50 | Message all of the Managers. +open | ot | 10 | Opens the tournament to players. +setinfo | si | 100 | Set a user's finger info. +setmanagerlevel | sml | 50 | Sets manager's level. +setres | sr | 10 | Sets the result of a game. +setstat | ss | 50 | Sets a specific finger stat. +settourneyvar | stv | 10 | Sets a Tourney's Variables. +shutdown | sd | 50 | Shuts down Mamer. + +[Last modified: September 1, 1998 -- toddmf] diff --git a/lasker-2.2.3/bots/mamer/help/manager_help b/lasker-2.2.3/bots/mamer/help/manager_help new file mode 100644 index 0000000..ea24e3f --- /dev/null +++ b/lasker-2.2.3/bots/mamer/help/manager_help @@ -0,0 +1,341 @@ +New mamer manager help file + +This file contains portions of server help files(written by Friar) and mamer +help files(written by mlong) relevant to new mamer managers. toddmf merged +these files, updated out of date information, added some new things, and +removed some contradictions, hopefully resulting in a file useful for new mamer +managers. With the release of mamer 2.0, much of this document has been +rewritten by toddmf. Send questions, comments, suggestions, etc. to toddmf. + +Introduction and general server considerations +---------------------------------------------- + + Congratulations on becoming a mamer manager! You have earned this position +through your high level of maturity and interest in FICS chess(tournaments in +particular). Less than 1% of FICS users have been given the honor of being a +TM. That being said, being a TM is also a responsibility. It is essential that +you continue to maintain a higher standard of maturity than most users for +several reasons. The most obvious situations are problems in tourneys. Users +often get angry or impatient for several reasons during a tourney. For example: +User has just been given chaos points, user is angry because he was flagged in +a drawn game, user strongly disagrees with mamer policy, etc. In these +situations, it is necessary for you to stay calm, be competent, and keep +channel 49 and/or the tourney under control without reacting too harshly. +Another reason is that TMs are often mistaken for admins, especially by +new/intermediate users. Please kindly help them if possible, but refer them to +an admin if one really is necessary. + +Expectations +------------ + + Apart from staying out of trouble on FICS, the only requirement that you must +meet in order to remain a mamer manager is to meet a monthly quota for tourneys +managed. Currently, it is 5 tourneys per month. This is only a minimum, +though. Feel free to manage as many as you like. This is fun, remember? :) +This quota does not apply to admins, several of whom only manage when there is +a need for a tourney and no other TMs are online. The quota is in place in +order to keep the manager staff active. If you are unable to remain active as +a manager temporarily, message the COO(currently toddmf) and explain why. If +you plan on being inactive for a long period of time(at least 3 months, or +longer than summer break for students), it is probably best if you step down as +TM(if you've done well as a TM you would probably be able to return as TM when +you return to FICS). + +Mamer's user commands +--------------------- + + Before you get to the the details of manager commands and how to manage a +tourney, you should first make sure you are well equipped to deal with users' +questions about how to use mamer. If you are unfamiliar with any of these +commands, you should try them. + + Command Abbrev Level Basic info + --------------------------------------------------------------------- + finger | fi | 0 | Displays the stats for a user. + help | h | 0 | List commands and descripts. + join | j | 0 | Request to enter a tourney. + listmanagers | lm | 0 | Displays the Managers list. + listtourneys | lt | 0 | Displays the tournament list. + listtourneyvars | vars | 0 | Displays the tournament variables. + listtourneygames | games | 0 | Displays the tournament games. + listplayers | lp | 0 | Displays the players in the tourney. + showcommands | sc | 0 | List commands and descripts. + showhelpfile | shf | 0 | Shows a help file. + who | who | 0 | Displays the tournament games. + withdraw | with | 0 | Remove yourself from a tourney. + +User commands notes: + The "finger" command shows your statistics by default. You can see other + players' stats by "mam finger name". + + "help" is the same as "showcommands". To see help files, use "showhelpfile". + + The old commands "grid" and "standings" are now all neatly packaged in the + "who" command. The players are listed in rank order. + + The "upset points" in the "who" listing are temporary points(they are deleted + when the tourney is deleted). They are calculated like this: If you beat a + higher rated player, you get the difference in rating in upset points. If you + draw a higher rated player, you get half the difference in rating points, + rounded down. For example, a 2000 who beats a 2101 gets 101 upset points. If + he had drawn, the 2000 would have gained 50 upset points. Ratings from when + the players join the tourney are used. + + The "Perfrm" (performance rating) in the "who" listing is a measure of what + the player's USCF(and several other similar systems) rating would be if this + was the only tourney he played in. Again, the ratings from when the players + join the tourney are used. Here is the formula: + + Perf. Rating = Avg. opp. rating + 400 * ((wins-losses)/rounds) + + Most commands now require you to specify the tourney number! Remember this + when giving help. + + Players very often ask about how to find out who is in a tourney, how to see + the standings, how to see a grid, how to see which games are in progress, and + how to see tourney variables. It is useful to have an alias for telling 49 + something along the lines of "Please use the commands 'mam games #', + 'mam vars #', and 'mam who #' for information about the tourney." + +Introduction to managing tourneys +--------------------------------- + + The first thing you should do after becoming a manager is to join channel +48. You can ask for the advice of more experienced TMs in the channel if you +run in to any problems while managing. Channel 48 is also used to discuss +other mamer issues, and it is just as often used for friendly chat among TMs. +Here is a tutorial on how to manage a typical tourney. + +The first thing you need to know is that you will be sending a lot of tells to +mamer while managing. To save yourself some typing, you should either use the +server alias "mam"(short for xtell mamer) or create an even shorter alias like +m. In this tutorial, I will use "mam". + + Step 1: Create a tourney + ------------------------ + + To create a new tourney, type "mam create". You should get the following + response: + + mamer(TD) tells you: Created tourney number: 6 + + Contact the COO if mamer tells you that "you do not have permission". If you + did create the tourney successfully, all you need to remember is the tourney + number. In this tutorial, we'll continue managing tourney number 6. + + Step 2: Select the tournament variable settings + ----------------------------------------------- + + Assuming you are now the manager for tourney 6, type "mam vars 6". + You get back a listing of the current tournament variable settings: + +: +: (T)ime: 4 +: (I)ncrement: 0 +: (R)ounds: 0 +: Max (P)layers: 16 +: (M)ode: r (r)ated or (u)nrated +: (S)tyle: s (s)wiss or (r)oundrobin +: (V)ariant: w (w)ild, (r)egular, (b)ug, or (s)uicide +: (W)ild Type: 10 (0), (1), (2), (3), (4), (5), (8), (9)8a, (10)fr +: Rating (L)ow: 0 +: Rating (H)igh: 9999 +: +: Manager: toddmf + + The letters in () refer to the variable shortcut to be used when changing a + value for a variable. Here is what the variables mean: + + Time -- Same as always: minutes to start the game with + Increment -- Same as always: additional seconds per move + Rounds -- Number of rounds in the tourney. If you leave this at 0, + mamer will choose an optimal number of rounds. + Max Players -- The tourney will automatically close and start when this + many players have joined. + Mode -- Will the tourney games be rated or unrated? + Style -- Round Robin(everyone plays everyone) or Swiss System(system + where, generally speaking, players play opponents with the + same score in the tourney each round). + Variant -- What type of game is being played? Regular is used for + blitz, standard, and lightning. + Wild Type -- This only appears when Variant is set to Wild. Use this to + set which wild type will be played. + Rating Low -- Players with a rating lower than this cannot join. + Rating High -- Players with a rating higher than this cannot join. + + You can change these variables before the tourney starts by using "mam stv # + var value". For example, "mam stv 6 t 1" would change the time variable to 1. + Once the tourney has opened, you can only change the Max Players and Style + variants, and once it has closed and started, you cannot change any variables! + + Step 3: Beginning the tournament + -------------------------------- + + After you have set the variables, you need to open the tournament so that + players may join. To do so, type "mam open #" ("mam open 6" in our case). + + At this point, mamer will announce the tourney in channel 49 and with a + cshout. You can duplicate the announcements by using the "mam announce #" + command to announce tourney number #. At the moment, there is no limit on how + often you can announce. I hope not to hear many complaints about mamer making + too many cshouts, so please use announce reasonably(somewhere around once per + 30-60 seconds is reasonable). + + When you have enough players, you can close and start the tournament. To do + so, "mam close #". If you are unable to find enough players(a minimum of 4 is + needed for mamer to run a tourney) in a reasonable amount of time, you should + delete the tourney by using "mam delete #" where # is the tourney number. + + Step 4: Running the tournament itself + ------------------------------------- + + If nobody leaves the tournament, there should be no problems. Mamer should + take care of itself. If someone leaves the tourney or logs off of FICS, you + may have some work to do. After managing several tourneys, you will have a + good sense of how long to wait for someone to return before taking action. + The commands you're going to need are "forfeit" and "setres". "mam forfeit + handle #" forfeits a player from tourney number #. Use the forfeit command if + a player has left, you don't expect him back, and there is at least another + round left in the tourney. "mam setres # white black 1/=/0" sets the result + of white vs black in tourney # to a win for white/draw/win for black. Use + this if you are late in the tourney so that the player doesn't have to forfeit + his previous points. Also use setres if you simply want to keep the tourney + moving but expect the player to be back(this is useful for tourneys at very + fast time controls). + + Step 5: The tournament ends + --------------------------- + + Mamer will usually end the tournament automatically and post the final + results. If it does not, type "mam games #" to see any uncompleted games. + Check if those players are logged in(a fast way to do this is "in handle"), + and use forfeit/setres accordingly. + + If there are any problems with the data of the tourney then "message mlong" + the correct values and let the players know that the results will be + corrected. Points in the tourneys are not recorded; what is important is + wins, losses, and placement in the final tourney standings. + + If you have just managed a scheduled tourney(see "help motd" for a list of + them), please message the COO the names of the winner(s) and anyone else who + may have managed the tourney, so that he can create a news item each week. + Also, please "mam keep # 1" to set tourney #'s keep variable to 1. This + allows people to view the scheduled tourney's standings days after the + tourney. + +Chaos points +------------ + + As a TM, you will soon have the power to penalize tourney abuse by giving +someone chaos points. This is done by typing "mam addchaos handle #", where # +is the number of chaos points(use a negative number to remove chaos points). +When someone has 100 chaos points, mamer will censor him, thus preventing him +from playing in tourneys. Firstly, let's talk about when you should not give +someone chaos points. If you forfeit someone or they withdraw before the +tourney ends, mamer will automatically give that person 10 chaos points per +round missed. Chaos points should be given out for non tourney games, +profanity, and other distractions(such as telling 49 "hi mamer" repeatedly +after being warned about overuse of it). Use good judgement. If a player is +playing a non tourney game that will end in 30 seconds, maybe you should not +act. However, if he is in a standard game and ignores your request to end it +and start the tourney, chaos points are warranted. You should probably give +somewhere between 10 and 20 chaos points per disruption. If you find yourself +wanting to give out less than 10, you should consider giving a warning instead. +If you find yourself wanting to give more than 20, you should probably contact +an admin about the abuse. In any case, whenever you add chaos points, please +send them a message explaining how many points were given, why you did so, +and note that decisions can be appealed to the COO. If you don't send a +message, the player may never knew he did anything wrong, repeat his actions, +and soon find himself censored by mamer. By sending a message, the player has +a better chance of not repeating his actions, and it also necessitates having a +good reason for adding the points. + +Manager commands +---------------- + + Here is a summary of all the manager commands. + +: addchaos | ac | 25 | Adds (or subs) chaos points. +: announce | ann | 10 | Announce the tournament to the working + channel. +: addtotourney | att | 25 | Add a user to a tourney. +: create | cr | 10 | Creates a new tournament. +: close | cl | 10 | Closes and starts a tournament. +: delete | del | 10 | Deletes a tournament. +: forfeit | fo | 10 | Remove a user from a tourney. +: keep | k | 25 | Keep a tourney in memory. +: loadedusers | lu | 25 | Displays the loaded users. +: messman | mm | 50 | Message all of the Managers. +: open | ot | 10 | Opens the tournament to players. +: setinfo | si | 100 | Set a user's finger info. +: setmanagerlevel | sml | 50 | Sets manager's level. +: setres | sr | 10 | Sets the result of a game. +: setstat | ss | 50 | Sets a specific finger stat. +: settourneyvar | stv | 10 | Sets a Tourney's Variables. +: shutdown | sd | 50 | Shuts down Mamer. + +All of the level 10 and 25 commands have been covered except for +"addtotourney" and "loadedusers". "addtotourney player #" forces player to join +tourney number #. This is useful for players who want to play in a tourney +that is about to close but can't figure out how to join the first time. If you +need to use this, please try to tell the person how to join future tournaments +so that he doesn't rely on the manager to use addtotourney. It is also useful +to create test tournaments, but aside from mlong testing code, there is rarely +a need for that. "loadedusers" is simply a list of players in mamer's +"memory"; players who have told mamer something recently. The only practical +application for most managers that I can think of is trying to check if a new +mamer player having trouble is even getting as far as telling mamer something. +A note on "delete": Tourneys that aren't "kept"(using keep) are automatically +deleted after two hours. Please don't delete them before this unless you +either want to abort a tourney in progress or open or the tourney list is +getting very cluttered with many fast(ie 1 0, 0 1 suicide) tourneys. Keeping +tourney standings available for some time after the tourney ends was a feature +requested by many users, so please don't negate it by deleting the tourneys +prematurely. + + + +Historical information about mamer +---------------------------------- + + Users sometimes ask about this information. You may also find it +interesting. The following is a cleaned up and up-to-date version of mamer +1.x's "mam help about". + + "Mamer is an automated tournament director for use on FICS only. + Fred Baumgarten originally wrote this code because there was a need and + Chevrier Joel, the creator of Tomato(another TD program), would not + share the code. Fred gave me(mlong) the code in mid 1995 with the + stipulation I not release it to anyone. I have modified and (I hope) + improved mame (now mamer). + + Mamer stands for "manage me". Plus the -r- for the + differentiation between mame (Fred's) code and mamer (mlong's) code. + + Fred's words follow: The intention to write this tournament director + program came out of the need to have such a program. Tomato - used at + FICS and written by darkside was not released to the public. Darkside + even did not want to accept a non disclosure agreement - so I decided + to write such a program myself. (Tomato was sold to ICC shortly after + and has been used there ever since - toddmf). + The program is written in C and will support a bunch of new features soon. + It is beta state since Version 0.5 but there _are_ bugs. + Fred Baumgarten . Have fun !!! + + Mamer is maintained and coded here on FICS by mlong. PLEASE! FOR BUGS + PERTAINING TO MAMER TALK TO mlong." + + mlong has always maintained the mamer code. He also was in control of +mamer's day to day operations at first. GBPacker soon took over this position, +and fpawn followed. toddmf currently holds this position. + + Mamer's largest(in terms of number of players) tourneys occurred shortly +after games in the 1997 Deep Blue-Kasparov rematch. Some of these tourneys +drew 50-60+ players(if anyone knows the exact numbers, please tell me). The +longest tourney(in terms of number of rounds) was probably a 15 round, 16 +player 1 0 RR tourney held in early 1998(again, please tell me if this is not +accurate). + +See also: every other help file + +[Last modified: September 1, 1998 -- toddmf] diff --git a/lasker-2.2.3/bots/mamer/help/manager_level b/lasker-2.2.3/bots/mamer/help/manager_level new file mode 100644 index 0000000..6cb0388 --- /dev/null +++ b/lasker-2.2.3/bots/mamer/help/manager_level @@ -0,0 +1,40 @@ +manager_level + +Here is a list of all of mamer's manager levels and their functions. For a +list of all mamer managers and their levels, use mamer's "listmanagers" +command. + +Level 0 : All non-managers are level 0. + +Level 5 : Mamer managers who cannot use mamer's manager commands. This level + is reserved for the rare case when a manager's manager ablities are + suspended. + +Level 10 : This is an introductory manager level. Enough manager commands to + be able to run a tourney are available, and nothing more. + +Level 25 : This is the standard manager level. The ability to add and remove + chaos points, keep tourneys in mamer's list for longer than two + hours, and other minor perks are now available. + +Level 50 : Managers at this level are co-mamer Vice Presidents. Additional + abilites include the ability to shut down mamer and add players to + a tourney manually. Level 50 managers can also modify the manager + level of managers below level 50, send a message to all mamer + managers, and modify some parts of mamer's player database, but + these commands are usually used by only the mamer COO. Additional + responsibilities include keeping up to date with mamer activities, + consulting with the mamer COO when decisions need to be made, and + assisting less experienced managers. + +Level 75 : The manager at this level is mamer's Chief Operating Officer. The + COO handles day to day operations of mamer. These include new + manager applications, chaos point appeals, periodic review of the + manager staff, keeping the manager staff updated, and basically all + non-programming mamer issues. + +Level 100: This level is reserved for mamer's programmer(mlong). + +See also: listmanagers + +[Last modified: September 12, 1998 -- toddmf] diff --git a/lasker-2.2.3/bots/mamer/help/messman b/lasker-2.2.3/bots/mamer/help/messman new file mode 100644 index 0000000..e4de945 --- /dev/null +++ b/lasker-2.2.3/bots/mamer/help/messman @@ -0,0 +1,12 @@ +messman + +Alias: mm + +Usage: messman + +Reserved for mamer managers (level 50 or higher) + +This command sends a message containing to all of mamer's managers. +This is useful for updating managers on mamer news. + +[Last updated: August 29, 1998 -- toddmf] diff --git a/lasker-2.2.3/bots/mamer/help/open b/lasker-2.2.3/bots/mamer/help/open new file mode 100644 index 0000000..1366dad --- /dev/null +++ b/lasker-2.2.3/bots/mamer/help/open @@ -0,0 +1,16 @@ +open + +Alias: ot + +Usage: open + +Reserved for mamer managers (level 10 or higher) + +This causes the specified tourney to be opened, allowing players to join the +tourney. Mamer cshouts and tells channel 49 the tourney announcement when the +tourney is opened. Once a tourney is open, the only variables that can be +changed are "Max Players" and "Style". + +See also: announce, listtourneyvars, settourneyvar + +[Last modified: August 29, 1998 -- toddmf] diff --git a/lasker-2.2.3/bots/mamer/help/performance b/lasker-2.2.3/bots/mamer/help/performance new file mode 100644 index 0000000..d77cf78 --- /dev/null +++ b/lasker-2.2.3/bots/mamer/help/performance @@ -0,0 +1,14 @@ +performance + +mamer's "who"(also known as "listplayers") command lists performance ratings +for the players in the tourney. A performance rating is what the player's +USCF(several other organizations use the same formula) rating would be if this +tourney was the player's first tourney. Here is the formula. + + Perf. Rating = Avg. opp. rating + 400 * ((wins-losses)/rounds) + +Your performance rating is for the current tourney only. + +See also: listplayers, who + +[Last modified: September 1, 1998 -- toddmf] diff --git a/lasker-2.2.3/bots/mamer/help/rating b/lasker-2.2.3/bots/mamer/help/rating new file mode 100644 index 0000000..27163a0 --- /dev/null +++ b/lasker-2.2.3/bots/mamer/help/rating @@ -0,0 +1,40 @@ +mamer_rating + +mamer rating formula +-------------------- + + Pre_tourney stats: + pre_wins + pre_draws + pre_losses + pre_rating - this is what we have to initialize + + + From the tourney just completed: + tourn_wins, tourn_draws, tourn_losses + + Post tourney stats: stuff that is saved. + post_wins, post_draws, post_losses, post_rating + + + Calculations: + tourn_expect = sigma(over all rounds) {1/[1+10^(delta/400)]} + delta = player_FICS_rating - opponent_FICS_rating + + pre_expect = (pre_wins + 0.5*pre_draws)/pre_rating + + post_wins = pre_wins + tourn_wins + post_draws = pre_draws + tourn_draws + post_losses = pre_losses + tourn_losses + + post_rating = (post_wins + 0.5*post_draws)/(pre_expect + tourn_expect) + + + Comments: +---------------- +Ratings will tend to be near 1.0, and a typical range is 0.5 to 1.5. +Ratings are initialized based on your win percentage. + + Questions, comments, suggestions?? contact mlong. + +[Last modified: August 19, 1998 -- fpawn & mlong] diff --git a/lasker-2.2.3/bots/mamer/help/setcommandlevel b/lasker-2.2.3/bots/mamer/help/setcommandlevel new file mode 100644 index 0000000..90462e6 --- /dev/null +++ b/lasker-2.2.3/bots/mamer/help/setcommandlevel @@ -0,0 +1,14 @@ +setcommandlevel + +Alias: setcl + +Usage: setcommandlevel + +This command sets the minimum manager level required to use to +. You can only modify the permissions of commands that require a +level lower than yours to use. The most common use for this is to disable +a buggy command. + +See also: manager_level, showcommands + +[Last modified: September 12, 1998 -- toddmf] diff --git a/lasker-2.2.3/bots/mamer/help/setmanagerlevel b/lasker-2.2.3/bots/mamer/help/setmanagerlevel new file mode 100644 index 0000000..062b677 --- /dev/null +++ b/lasker-2.2.3/bots/mamer/help/setmanagerlevel @@ -0,0 +1,18 @@ +setmanagerlevel + +Alias: sml + +Usage: setmanagerlevel + +Reserved for mamer managers (level 50 or higher) + +This command sets 's manager level. You may only modify the +levels of managers with a manager level lower than yours, and you can only +set manager levels to levels lower than yours. Use the "listmanagers" +command for a list of all the mamer managers and their manager levels(and +other useful manager information). + +See also: listmanagers + +[Last modified: September 12, 1998 -- toddmf] + diff --git a/lasker-2.2.3/bots/mamer/help/setres b/lasker-2.2.3/bots/mamer/help/setres new file mode 100644 index 0000000..4cbe344 --- /dev/null +++ b/lasker-2.2.3/bots/mamer/help/setres @@ -0,0 +1,15 @@ + + +Alias: sr + +Usage: setres + +Reserved for mamer managers (level 10 or higher) + +The setres command is used to set the result of a game that is unable to be +completed by the players. Normally, the result is set against the person who +is unable to complete the game unless he has no mating material. The +is "1" for a white win, "=" for a draw, and "0" for a black win. + +[Last modified: September 3, 1998 -- toddmf] + diff --git a/lasker-2.2.3/bots/mamer/help/setstat b/lasker-2.2.3/bots/mamer/help/setstat new file mode 100644 index 0000000..d8fc298 --- /dev/null +++ b/lasker-2.2.3/bots/mamer/help/setstat @@ -0,0 +1,23 @@ +setstat + +Alias: ss + +Usage: setstat + +Reserved for mamer managers (level 50 or higher) + +This command is used to set 's tourney finger statistics in the event +that something goes wrong in a tourney. Statistics that can be modified are: + +t - Modifies the "Tnys" (tourneys played) statistic. +w - Modifies the "W" (wins) statistic. +l - Modifies the "L" (losses) statistic. +d - Modifies the "D" (draws) statistic. +1 - Modifies the "1st" (first places) statistic. +2 - Modifies the "2nd" (second places) statistic. +3 - Modifies the "3rd" (third places) statistic. + +See also: finger + +[Last modified: September 3, 1998 -- toddmf] + diff --git a/lasker-2.2.3/bots/mamer/help/settourneyvar b/lasker-2.2.3/bots/mamer/help/settourneyvar new file mode 100644 index 0000000..3fdbe54 --- /dev/null +++ b/lasker-2.2.3/bots/mamer/help/settourneyvar @@ -0,0 +1,14 @@ +settourneyvar + +Alias: stv + +Usage: settourneyvar + +Reserved for mamer managers (level 10 or higher) + +This command sets the the value of a tourney variable. To see a list of the +variables and their function, read "mam help listtourneyvars". + +See also: listtourneyvars + +[Last modified: August 29, 1998 -- toddmf] diff --git a/lasker-2.2.3/bots/mamer/help/showcommands b/lasker-2.2.3/bots/mamer/help/showcommands new file mode 100644 index 0000000..2ab53e6 --- /dev/null +++ b/lasker-2.2.3/bots/mamer/help/showcommands @@ -0,0 +1,16 @@ +showcommands + +Alias: sc + +Usage: showcommands + +This command displays a list of all of mamer's commands, their aliases, the +minimum manager level needed to use them, and a short summary of the command's +function. If you are not a mamer manager, you can use the commands marked as +level 0 commands. + +NOTE: The "showcommands" command is equivalent to the "help" command. + +See also: help, manager_level, usage + +[Last modified: August 29, 1998 -- toddmf] diff --git a/lasker-2.2.3/bots/mamer/help/showhelpfile b/lasker-2.2.3/bots/mamer/help/showhelpfile new file mode 100644 index 0000000..ab11b8a --- /dev/null +++ b/lasker-2.2.3/bots/mamer/help/showhelpfile @@ -0,0 +1,11 @@ +showhelpfile + +Alias: shf + +Usage: showhelpfile + +The showhelpfile command displays the requested help file. If you do not +specify a file, the "index" file(a listing of all help files) will be +displayed. + +[Last modified: September 1, 1998 -- toddmf] diff --git a/lasker-2.2.3/bots/mamer/help/shutdown b/lasker-2.2.3/bots/mamer/help/shutdown new file mode 100644 index 0000000..c21900b --- /dev/null +++ b/lasker-2.2.3/bots/mamer/help/shutdown @@ -0,0 +1,11 @@ +shutdown + +Alias: sd + +Usage: shutdown + +Reserved for mamer managers (level 50 or higher) + +This command causes mamer to shut down and log off. + +[Last modified: September 1, 1998 -- toddmf] diff --git a/lasker-2.2.3/bots/mamer/help/swiss b/lasker-2.2.3/bots/mamer/help/swiss new file mode 100644 index 0000000..bfa9f99 --- /dev/null +++ b/lasker-2.2.3/bots/mamer/help/swiss @@ -0,0 +1,23 @@ +swiss + +The swiss system is a fairly complicated pairing system(books have been +written on it). Here is a short summary. For the first round, the players +are ranked by rating. The top player of the top half plays the top player of +the bottom half, the #2 player from the top half plays the #2 player from the +bottom half, and so on. Colors alternate for the top players. A sample first +round pairing for an 8 player tourney would be 1-5, 6-2, 3-7, 8-4. After each +round, the players are sorted again. This time, they are sorted by score in +the tourney(1.0 for each win, 0.5 for each draw, 0.0 for each loss). The +swiss algorithm mentioned above is then applied to each group. As the tourney +goes on, the number of groups(and thus the number of groups with an odd number +of players) grows. There are many techniques used to pair players that are at +least very close in score while avoiding having two players play each other +more than once and giving very lopsided color distribution(for example, having +4 whites and one black in a 5 round tourney) which are beyond the scope of +this short summary. To sum up, you play people who are doing close to as well +(or poorly) as you in the tourney, you play close to an equal number of +games with white as with black, and you don't play the same player twice. +Mamer does its best to make good swiss pairings, but occasionally it will +produce some odd pairings. + +[Last modified: September 1, 1998 -- toddmf] diff --git a/lasker-2.2.3/bots/mamer/help/upset b/lasker-2.2.3/bots/mamer/help/upset new file mode 100644 index 0000000..fe2ec6b --- /dev/null +++ b/lasker-2.2.3/bots/mamer/help/upset @@ -0,0 +1,14 @@ +upset + +mamer's "who"(also known as "listplayers") command lists upset points for each +player in the tourney. Upset points are gained for beating or drawing higher +rated players. If you beat a higher rated player, you gain the difference in +ratings in upset points. If you draw a higher rated player, you gain half the +difference(rounded down) in upset points. For example, a 1600 who beats a +2001 would gain 401 upset points. If the game had ended in a draw, the 1600 +would have gained 200 upset points. Upset points do not carry from tourney to +tourney. + +See also: listplayers, who + +[Last modified: September 1, 1998 -- toddmf] diff --git a/lasker-2.2.3/bots/mamer/help/user_commands b/lasker-2.2.3/bots/mamer/help/user_commands new file mode 100644 index 0000000..1f6c3f7 --- /dev/null +++ b/lasker-2.2.3/bots/mamer/help/user_commands @@ -0,0 +1,16 @@ +user_commands + +finger | fi | 0 | Displays the stats for a user. +help | h | 0 | List commands and descripts. +join | j | 0 | Request to enter a tourney. +listmanagers | lm | 0 | Displays the Managers list. +listtourneys | lt | 0 | Displays the tournament list. +listtourneyvars | vars | 0 | Displays the tournament variables. +listtourneygames | games | 0 | Displays the tournament games. +listplayers | lp | 0 | Displays the players in the tourney. +showcommands | sc | 0 | List commands and descripts. +showhelpfile | shf | 0 | Shows a help file. +who | who | 0 | Displays the tournament games. +withdraw | with | 0 | Remove yourself from a tourney. + +[Last modified: September 1, 1998 -- toddmf] diff --git a/lasker-2.2.3/bots/mamer/help/who b/lasker-2.2.3/bots/mamer/help/who new file mode 100644 index 0000000..3be1bc8 --- /dev/null +++ b/lasker-2.2.3/bots/mamer/help/who @@ -0,0 +1,43 @@ +who + +Usage: who + +This command lists all the players in the specified tourney and other +information about the players in the tourney. + +: Name Rating Score Perfrm Upset Results +: ----------------- ------ ----- ------ ------ ------- +: 1 +ghettoCHECKMATE [1651] 3.0 [2242] [ 573] +07b +02b +04w +: 2 +TheOnlyOne [1914] 2.0 [1764] [ 0] +03b -01w +05w +: 3 +westham [1725] 2.0 [1843] [ 47] -02w +04b +06w +: 4 +frankenschach [1772] 1.0 [1497] [ 0] +05w -03w -01b +: 5 +Arbakov [1516] 1.0 [1443] [ 0] -04b +06w -02b +: 6 +Ostap [forf] 0.0 [1251] [ 0] -01w +: +: Average Rating 1736.3 + +The number in the leftmost column is the player's current ranking in the +tourney. + +"Name" is the player's handle. A "+" to the left indicates that the player is + currently logged in. A "-" indicates that he is not. +"Rating" is the player's FICS rating before the tourney started in the + category of games played in the tourney. "forf" means the player is no + longer in the tourney. +"Score" is the number of tourney points the player has. 1.0 is awarded for + each win, 0.5 for each draw, and 0.0 for each loss. +"Perfrm" is the player's performance rating for the tourney. +"Upset is the number of upset points the player has. +"Results" is a grid of the tourney results. "+" represents a win, "=" + represents a draw, and "-" represents a loss. The number following is + the ranking of the opponent in the tourney(see the leftmost column). + The letter following that is the color played. "b" is black; "w" is + white. +"Average Rating" is the average rating of all the players in the tourney. + The ratings used are ratings when the players join the tourney. + +NOTE: This is the same as the "listplayers" command. + +See also: listplayers, performance, upset + +[Last modified: August 29, 1998 -- toddmf] diff --git a/lasker-2.2.3/bots/mamer/help/withdraw b/lasker-2.2.3/bots/mamer/help/withdraw new file mode 100644 index 0000000..40148b9 --- /dev/null +++ b/lasker-2.2.3/bots/mamer/help/withdraw @@ -0,0 +1,17 @@ +withdraw + +Alias: with + +Usage: withdraw + +Use this command to withdraw from(in other words, leave) a tourney. If the +tourney has not started yet, you may withdraw without penalty. However, if +you leave a tourney in progress, you will gain chaos points equal to 10 times +the number of rounds you miss. If you were playing in a round robin tourney, +the results of your games will all be set to 0-0. If you were playing in a +swiss, the results of your completed games will stand, but you will lose +remaining games by forfeit. + +See also: chaos, swiss + +[Last modified: September 1, 1998 -- toddmf] diff --git a/lasker-2.2.3/bots/mamer/link.cc b/lasker-2.2.3/bots/mamer/link.cc new file mode 100644 index 0000000..769e942 --- /dev/null +++ b/lasker-2.2.3/bots/mamer/link.cc @@ -0,0 +1,179 @@ +//-------------------------------------------------------------------------- +// link.cc - Source file for the link list classes +// +// Matthew E. Moses +// +// $Revision: 1.5 $ +// $Date: 1998/09/10 19:57:17 $ +// +// $Author: mlong $ +// $Locker: $ +// +// $Log: link.cc,v $ +// Revision 1.5 1998/09/10 19:57:17 mlong +// lots of little bug fixes and a few new features +// +// Revision 1.4 1998/06/04 19:55:00 mlong +// changed this? +// +// Revision 1.3 1998/04/18 18:46:04 mlong +// fixed delete bug & +// added delete tourney function +// +// Revision 1.2 1998/04/15 16:56:17 mlong +// *** empty log message *** +// +// Revision 1.1 1998/03/16 18:09:27 moses +// Initial revision +// +// Revision 1.2 1998/03/16 19:47:54 chess +// cfi *.h +// +// Revision 1.1 1998/03/14 03:13:00 chess +// Initial revision +// +// Revision 1.1 1996/09/30 20:52:48 moses +// Initial revision +// +// +//-------------------------------------------------------------------------- + +// static char RCSid[] = "$Id: link.cc,v 1.5 1998/09/10 19:57:17 mlong Exp $"; + +#include "link.hh" + +//---------------------------------------------------------------------------- +// Link class methods +// + +// default constructor +Link::Link(void) { next = 0; } + +// constructor +Link::Link(Link *p) { next = p; } + +Link::~Link(void) {} + + +//---------------------------------------------------------------------------- +// LinkListBase class methods +// + +// default constructor +LinkListBase::LinkListBase(void) { head = 0; } + +LinkListBase::~LinkListBase(void) {} + +void LinkListBase::Insert(Link *p) +{ + if(head) + p->next = head; + + head = p; +} + +void LinkListBase::Insert(Link *p, Link *q) { + Link *tmp = 0; + + if(head) + if(head == p) + Insert(q); + else { + for(tmp = head; (tmp->next != 0); tmp = tmp->next) { + if(tmp->next == p) { + q->next = p; + tmp->next = q; + break; + } + } + if(tmp->next == 0) + Append(q); + } + else + head = q; +} + +//-------------------------- +// Head +// +Link *LinkListBase::Head(void) { return(head); } + +void LinkListBase::Append(Link *p) +{ + if(head) { + Link *tmp = 0; + + for(tmp = head; tmp->next != 0; tmp = tmp->next) + ; + tmp->next = p; + } + else + head = p; +} + +void LinkListBase::Delete(void) +{ + Link *p = 0; + + if(head) { + p = head->next; + delete head; + head = p; + } + else + head = 0; +} + +void LinkListBase::Delete(Link *p) +{ + Link *tmp = 0; + + if(head != p) { + for(tmp = head; (tmp != 0 && tmp->next != p); tmp = tmp->next) + ; + + if(tmp->next == p) { + tmp->next = p->next; + delete p; + } + } else if(head == p) { + tmp = head->next; + delete head; + /* + head = 0; + */ /* This line will delete the entire list */ + head = tmp; /* This one does not delete the entire list. */ + } else { + head = 0; + } +} + + +//---------------------------------------------------------------------------- +// LinkListIterBase class methods +// + +// constructor +LinkListIterBase::LinkListIterBase(LinkListBase& list) +{ + currentList = &list; + currentItem = currentList->head; +} + +void LinkListIterBase::Reset(void) +{ + currentItem = currentList->head; +} + +Link *LinkListIterBase::Next(void) +{ + Link *ret = 0; + + ret = currentItem; + if(0 != currentItem) + currentItem = currentItem->next; + + return(ret); +} + + diff --git a/lasker-2.2.3/bots/mamer/link.hh b/lasker-2.2.3/bots/mamer/link.hh new file mode 100644 index 0000000..e9fe1df --- /dev/null +++ b/lasker-2.2.3/bots/mamer/link.hh @@ -0,0 +1,86 @@ +//-------------------------------------------------------------------------- +// link.hh - Class header for the link and linklistbase classes +// +// Matthew E. Moses +// +// $Revision: 1.2 $ +// $Date: 1998/04/15 16:56:34 $ +// +// $Author: mlong $ +// $Locker: $ +// +// $Log: link.hh,v $ +// Revision 1.2 1998/04/15 16:56:34 mlong +// *** empty log message *** +// +// Revision 1.2 1998/03/16 19:48:17 chess +// *** empty log message *** +// +// Revision 1.1 1998/03/14 03:14:09 chess +// Initial revision +// +// Revision 1.1 1996/09/30 20:52:48 moses +// Initial revision +// +// +//-------------------------------------------------------------------------- + +#ifndef _link_ +#define _link_ + +//-------------------------------------------- +// Base class for a link list element +// + +class Link +{ +public: + Link *next; + + Link(void); + Link(Link *p); + ~Link(void); +}; + +//----------------------------------------------- +// Base class for a Link List +// + +class LinkListBase { +public: + + friend class LinkListIterBase; + + LinkListBase(void); + ~LinkListBase(void); + + void Insert(Link *p); + void Insert(Link *p, Link *q); + void Append(Link *p); + void Delete(void); + void Delete(Link *p); + + Link *Head(void); + +private: + Link *head; +}; + +//----------------------------------- +// Base class for a link list iterator +// + +class LinkListIterBase +{ +private: + Link *currentItem; + LinkListBase *currentList; + +public: + LinkListIterBase(LinkListBase& list); + void Reset(void); + Link *Next(void); +}; + +#endif + diff --git a/lasker-2.2.3/bots/mamer/linklist.hh b/lasker-2.2.3/bots/mamer/linklist.hh new file mode 100644 index 0000000..1bc9136 --- /dev/null +++ b/lasker-2.2.3/bots/mamer/linklist.hh @@ -0,0 +1,64 @@ +//-------------------------------------------------------------------------- +// linklist.hh - Class header for the template linklist class +// +// Matthew E. Moses +// +// $Revision: 1.3 $ +// $Date: 1998/09/10 19:58:41 $ +// +// $Author: mlong $ +// $Locker: $ +// +// $Log: linklist.hh,v $ +// Revision 1.3 1998/09/10 19:58:41 mlong +// lots of little bug fixes and a few new features. +// +// Revision 1.2 1998/04/15 16:56:34 mlong +// *** empty log message *** +// +// Revision 1.2 1998/03/16 19:48:17 chess +// *** empty log message *** +// +// Revision 1.1 1998/03/14 03:14:15 chess +// Initial revision +// +// Revision 1.1 1996/09/30 20:52:48 moses +// Initial revision +// +// +//-------------------------------------------------------------------------- + +#ifndef _linklist_ +#define _linklist_ + +#include "link.hh" + +//---------------------------------------------------------------------------- +// Generic LinkList Class - derived from class LinkListBase +// + +template +class LinkList : public LinkListBase { +public: + void Insert(T *p) { LinkListBase::Insert(p); } + void Insert(T *p, T *q) { LinkListBase::Insert(p, q); } + void Append(T *p) { LinkListBase::Append(p); } + void Delete(void) { LinkListBase::Delete(); } + void Delete(T *p) { LinkListBase::Delete(p); } + T *Head(void) { return((T *)LinkListBase::Head()); } +}; + +//---------------------------------------------------------------------------- +// Generic LinkListIterator Class - derived from class LinkListIterBase +// + +template +class LinkListIter : public LinkListIterBase { +public: + LinkListIter(LinkList& list) : LinkListIterBase(list) { } + inline void Reset(void) { LinkListIterBase::Reset(); } + inline T *Next(void) { return((T *) LinkListIterBase::Next()); } +}; + +#endif + diff --git a/lasker-2.2.3/bots/mamer/logs/CVS/Entries b/lasker-2.2.3/bots/mamer/logs/CVS/Entries new file mode 100644 index 0000000..1784810 --- /dev/null +++ b/lasker-2.2.3/bots/mamer/logs/CVS/Entries @@ -0,0 +1 @@ +D diff --git a/lasker-2.2.3/bots/mamer/logs/CVS/Repository b/lasker-2.2.3/bots/mamer/logs/CVS/Repository new file mode 100644 index 0000000..5e48c36 --- /dev/null +++ b/lasker-2.2.3/bots/mamer/logs/CVS/Repository @@ -0,0 +1 @@ +lasker/bots/mamer/logs diff --git a/lasker-2.2.3/bots/mamer/logs/CVS/Root b/lasker-2.2.3/bots/mamer/logs/CVS/Root new file mode 100644 index 0000000..c42ba94 --- /dev/null +++ b/lasker-2.2.3/bots/mamer/logs/CVS/Root @@ -0,0 +1 @@ +/home/cvs diff --git a/lasker-2.2.3/bots/mamer/main.cc b/lasker-2.2.3/bots/mamer/main.cc new file mode 100644 index 0000000..9144604 --- /dev/null +++ b/lasker-2.2.3/bots/mamer/main.cc @@ -0,0 +1,71 @@ +//-------------------------------------------------------------------------- +// main.cc - main source file that starts Mamer +// +// Matthew E. Moses +// +// $Revision: 1.4 $ +// $Date: 1998/09/10 19:57:17 $ +// +// $Author: mlong $ +// $Locker: $ +// +// $Log: main.cc,v $ +// Revision 1.4 1998/09/10 19:57:17 mlong +// lots of little bug fixes and a few new features +// +// Revision 1.3 1998/04/18 20:05:14 mlong +// *** empty log message *** +// +// Revision 1.2 1998/04/18 18:46:04 mlong +// fixed delete bug & +// added delete tourney function +// +// Revision 1.1 1996/09/30 20:52:48 moses +// Initial revision +// +// +//-------------------------------------------------------------------------- + +//static char RCSid[] = "$Id: main.cc,v 1.4 1998/09/10 19:57:17 mlong Exp $"; + +#include "Mamer.hh" + +//- Globals ---------------------------------------------------------------- +Mamer gMamer; + +//- Prototypes ------------------------------------------------------------- +int main(int, char **); + +//- main ------------------------------------------------------------------- +int main(int argc, char **argv) { + + if(gMamer.Initialize(argc, argv)) + if(gMamer.OpenServerConnection()) { + gMamer.ListenLoop(); + gMamer.Shutdown(); + } + else + cerr << "ERROR: couldn't open server connection!" << endl; + else + cerr << "ERROR: couldn't initialize mamer!" << endl; + + exit(0); +} //- End of main + +//- HandleSignals --------------------------------------------------------- +void HandleSignals(int theSignal) { + switch(theSignal) { + case SIGTERM: + case SIGKILL: + gMamer.Shutdown(); + exit(0); + break; + case SIGUSR1: + gMamer.Shutdown(); + exit(0); + case SIGUSR2: + gMamer.DumpConfiguration(); + default: + break; + } +} //- End of HandleSignals diff --git a/lasker-2.2.3/bots/mamer/mamer.config b/lasker-2.2.3/bots/mamer/mamer.config new file mode 100644 index 0000000..24449b5 --- /dev/null +++ b/lasker-2.2.3/bots/mamer/mamer.config @@ -0,0 +1,11 @@ +HOST freechess.org +PORT 5000 +CHAN 49 +DBUG 5 +HOME /home/mlong/mamer +DATA /home/mlong/mamer/data +HELP /home/mlong/mamer/help +UDB /home/mlong/mamer/players +LOG /home/mlong/mamer/logs/mamer +USER mamer +PASS lmwi39s8 diff --git a/lasker-2.2.3/bots/mamer/template/CVS/Entries b/lasker-2.2.3/bots/mamer/template/CVS/Entries new file mode 100644 index 0000000..156fa20 --- /dev/null +++ b/lasker-2.2.3/bots/mamer/template/CVS/Entries @@ -0,0 +1,3 @@ +/template.cc/1.1/Mon Jul 1 23:55:52 2002// +/template.hh/1.1/Mon Jul 1 23:55:52 2002// +D diff --git a/lasker-2.2.3/bots/mamer/template/CVS/Repository b/lasker-2.2.3/bots/mamer/template/CVS/Repository new file mode 100644 index 0000000..556f5f3 --- /dev/null +++ b/lasker-2.2.3/bots/mamer/template/CVS/Repository @@ -0,0 +1 @@ +lasker/bots/mamer/template diff --git a/lasker-2.2.3/bots/mamer/template/CVS/Root b/lasker-2.2.3/bots/mamer/template/CVS/Root new file mode 100644 index 0000000..c42ba94 --- /dev/null +++ b/lasker-2.2.3/bots/mamer/template/CVS/Root @@ -0,0 +1 @@ +/home/cvs diff --git a/lasker-2.2.3/bots/mamer/template/template.cc b/lasker-2.2.3/bots/mamer/template/template.cc new file mode 100644 index 0000000..57b8225 --- /dev/null +++ b/lasker-2.2.3/bots/mamer/template/template.cc @@ -0,0 +1,19 @@ +//-------------------------------------------------------------------------- +// .cc - Source file for the class +// +// Matthew E. Moses && Michael A. Long +// +// $Revision: 1.1 $ +// $Date: 2002/07/01 23:55:52 $ +// +// $Author: tridge $ +// $Locker: $ +// +// $Log: template.cc,v $ +// Revision 1.1 2002/07/01 23:55:52 tridge +// import from mlong +// +// +//-------------------------------------------------------------------------- + +static char RCSid[] = "$Id: template.cc,v 1.1 2002/07/01 23:55:52 tridge Exp $"; diff --git a/lasker-2.2.3/bots/mamer/template/template.hh b/lasker-2.2.3/bots/mamer/template/template.hh new file mode 100644 index 0000000..4fe1889 --- /dev/null +++ b/lasker-2.2.3/bots/mamer/template/template.hh @@ -0,0 +1,22 @@ +//-------------------------------------------------------------------------- +// .hh - +// +// Matthew E. Moses & Michael A. Long +// +// $Revision: 1.1 $ +// $Date: 2002/07/01 23:55:52 $ +// +// $Author: tridge $ +// $Locker: $ +// +// $Log: template.hh,v $ +// Revision 1.1 2002/07/01 23:55:52 tridge +// import from mlong +// +// +//-------------------------------------------------------------------------- + +#ifndef __ +#define __ + +#endif diff --git a/lasker-2.2.3/bots/mamer/types.h b/lasker-2.2.3/bots/mamer/types.h new file mode 100644 index 0000000..4acc5e9 --- /dev/null +++ b/lasker-2.2.3/bots/mamer/types.h @@ -0,0 +1,157 @@ +//-------------------------------------------------------------------------- +// types.h - Header file for types +// +// Matthew E. Moses & Michael A. Long +// +// $Revision: 1.11 $ +// $Date: 1998/09/10 19:58:20 $ +// +// $Author: mlong $ +// $Locker: $ +// +// $Log: types.h,v $ +// Revision 1.11 1998/09/10 19:58:20 mlong +// *** empty log message *** +// +// Revision 1.10 1998/06/18 18:42:09 mlong +// prepairing for yet another move. +// +// Revision 1.9 1998/06/04 19:56:02 mlong +// *** empty log message *** +// +// Revision 1.8 1998/04/18 19:00:07 mlong +// fixed delete bug and added delete tourney fuction +// +// Revision 1.7 1998/02/12 18:44:34 mlong +// *** empty log message *** +// +// Revision 1.6 1997/11/06 20:51:29 chess +// *** empty log message *** +// +// Revision 1.5 1997/10/08 21:03:08 chess +// no log message +// +// Revision 1.4 1997/05/15 18:30:27 chess +// *** empty log message *** +// +// Revision 1.3 1997/04/13 03:24:42 chess +// added several enumerated types for params stuff and for TellUser outputs +// +// Revision 1.2 1997/04/07 22:22:26 chess +// added enum ranks +// and added enum reasons for why we are calling a centralized telluser function +// +// Revision 1.1 1996/10/01 20:17:34 moses +// Initial revision +// +// +//-------------------------------------------------------------------------- + +#ifndef _TYPES_ +#define _TYPES_ + +class Mamer; +class User; +class Tourney; +class CommandEntry; +class Player; +class Storage; + +typedef enum { + USER=0, + DIRECTOR=10, + MANAGER=25, + VICE=50, + PRESIDENT=100 +} ranks; + +typedef enum { + BadCommand, + MultiCommand, + CanNotChange, + ChangedManagerLevel, + ChangedCommandLevel, + ChangedInfo, + ChangedAbuse, + GenericTell, + JoinedTourney, + WillKeepTourney, + NoPermissions, + NotEnoughPlayers, + NotFound, + NotKeepTourney, + NoPlayers, + PlayerRemoved, + TourneyDeleted, + TourneyNotFound, + TourneyNotNew, + TourneyNotOpen, + TourneyNotClosed, + TourneyDone, + TourneyClosed, + GameResultNotFound, + GameResultSet +} reasons; + +#define COM_OK 0 +#define COM_FAILED 1 +#define COM_AMBIGUOUS 2 +#define COM_BADPARAMETERS 3 +#define COM_BADCOMMAND 4 + +typedef enum { + ONLINE, + GONE, +} locations; + +typedef enum { + TYPE_NONE=-1, + TYPE_UNTIMED, + TYPE_BLITZ, + TYPE_STAND, + TYPE_NONSTANDARD, + TYPE_WILD, + TYPE_LIGHT, + TYPE_BUGHOUSE, + TYPE_FR, + TYPE_SUICIDE +} gametype; + +typedef enum { + NEW, + OPEN, + CLOSED, + DONE +} status; + + +typedef enum { + TYPE_NULL, + TYPE_WORD, + TYPE_STRING, + TYPE_INT +} types; + +typedef struct u_parameter { + types type; + union { + char *word; + char *string; + int integer; + } val; +} parameter; + +struct string_list { + char *string; + int number; +}; + +typedef struct string_list strings; + +#define MAXNUMPARAMS 10 +typedef parameter param_list[MAXNUMPARAMS]; +typedef int (Mamer::*USERFP) (User *, param_list); +typedef int (Mamer::*TOURNFP) (User *, param_list, Tourney *); + +#endif + diff --git a/lasker-2.2.3/data/CVS/Entries b/lasker-2.2.3/data/CVS/Entries new file mode 100644 index 0000000..8bd3268 --- /dev/null +++ b/lasker-2.2.3/data/CVS/Entries @@ -0,0 +1,8 @@ +D/admin//// +D/book//// +D/help//// +D/messages//// +D/stats//// +D/usage//// +D/boards//// +D/com_help//// diff --git a/lasker-2.2.3/data/CVS/Repository b/lasker-2.2.3/data/CVS/Repository new file mode 100644 index 0000000..fc67a47 --- /dev/null +++ b/lasker-2.2.3/data/CVS/Repository @@ -0,0 +1 @@ +lasker/data diff --git a/lasker-2.2.3/data/CVS/Root b/lasker-2.2.3/data/CVS/Root new file mode 100644 index 0000000..c42ba94 --- /dev/null +++ b/lasker-2.2.3/data/CVS/Root @@ -0,0 +1 @@ +/home/cvs diff --git a/lasker-2.2.3/data/admin/CVS/Entries b/lasker-2.2.3/data/admin/CVS/Entries new file mode 100644 index 0000000..85576a8 --- /dev/null +++ b/lasker-2.2.3/data/admin/CVS/Entries @@ -0,0 +1,69 @@ +/accounts/1.1/Thu Jun 6 11:41:21 2002// +/addaccounts/1.1/Thu Jun 6 11:41:21 2002// +/addcomment/1.1/Thu Jun 6 11:41:21 2002// +/addplayer/1.1/Thu Jun 6 11:41:21 2002// +/adjud_info/1.1/Thu Jun 6 11:41:21 2002// +/adjudicate/1.1/Thu Jun 6 11:41:21 2002// +/admin/1.1/Thu Jun 6 11:41:21 2002// +/admin_hierarchy/1.1/Thu Jun 6 11:41:21 2002// +/ahelp/1.1/Thu Jun 6 11:41:21 2002// +/amotd/1.1/Thu Jun 6 11:41:21 2002// +/anews/1.1/Thu Jun 6 11:41:21 2002// +/announce/1.1/Thu Jun 6 11:41:21 2002// +/annunreg/1.1/Thu Jun 6 11:41:21 2002// +/areload/1.1/Thu Jun 13 04:19:13 2002// +/asetadmin/1.1/Thu Jun 6 11:41:21 2002// +/asetblitz/1.1/Thu Jun 6 11:41:21 2002// +/asetemail/1.1/Thu Jun 6 11:41:21 2002// +/asethandle/1.1/Thu Jun 6 11:41:21 2002// +/asetmaxplayer/1.1/Thu Jun 6 11:41:21 2002// +/asetpasswd/1.1/Thu Jun 6 11:41:21 2002// +/asetrealname/1.1/Thu Jun 6 11:41:21 2002// +/asetstd/1.1/Thu Jun 6 11:41:21 2002// +/asetv/1.1/Thu Jun 6 11:41:21 2002// +/asetwild/1.1/Thu Jun 6 11:41:21 2002// +/ban/1.1/Thu Jun 6 11:41:21 2002// +/buglist/1.1/Thu Jun 6 11:41:21 2002// +/canewsf/1.1/Thu Jun 6 11:41:21 2002// +/canewsi/1.1/Thu Jun 6 11:41:21 2002// +/chkgame/1.1/Thu Jun 6 11:41:21 2002// +/chkip/1.1/Thu Jun 6 11:41:21 2002// +/chkpl/1.1/Thu Jun 6 11:41:21 2002// +/chksc/1.1/Thu Jun 6 11:41:21 2002// +/chkts/1.1/Thu Jun 6 11:41:21 2002// +/cmuzzle/1.1/Thu Jun 6 11:41:21 2002// +/createanews/1.1/Thu Jun 6 11:41:21 2002// +/filter/1.1/Thu Jun 6 11:41:21 2002// +/finger/1.1/Thu Jun 6 11:41:21 2002// +/lists/1.1/Thu Jun 6 11:41:21 2002// +/muzzle/1.1/Thu Jun 6 11:41:21 2002// +/nuke/1.1/Thu Jun 6 11:41:21 2002// +/pose/1.1/Thu Jun 6 11:41:21 2002// +/projects/1.1/Thu Jun 6 11:41:21 2002// +/quota/1.1/Thu Jun 6 11:41:21 2002// +/raisedead/1.1/Thu Jun 6 11:41:21 2002// +/register/1.1/Thu Jun 6 11:41:21 2002// +/remplayer/1.1/Thu Jun 6 11:41:21 2002// +/rerank/1.1/Thu Jun 6 11:41:21 2002// +/server_com/1.1/Thu Jun 6 11:41:21 2002// +/showcomment/1.1/Thu Jun 6 11:41:21 2002// +/shutdown/1.1/Thu Jun 6 11:41:21 2002// +/summon/1.1/Thu Jun 6 11:41:21 2002// +/aconfig/1.2/Tue Jun 18 06:16:44 2002// +/acheckhelp/1.1/Sun Jun 23 07:51:06 2002// +/adump/1.1/Sun Jun 23 06:43:35 2002// +/asetbughouse/1.1/Sun Jun 23 07:20:46 2002// +/asetlight/1.1/Sun Jun 23 07:20:46 2002// +/ftell/1.1/Sun Jun 23 07:20:47 2002// +/hideinfo/1.1/Sun Jun 23 07:20:47 2002// +/canewsd/1.1/Mon Jun 24 11:12:56 2002// +/canewse/1.1/Sun Jun 23 22:40:37 2002// +/canewsp/1.1/Sun Jun 23 22:40:37 2002// +/canewst/1.1/Sun Jun 23 22:40:37 2002// +/cnewsd/1.1/Mon Jun 24 11:12:56 2002// +/cnewse/1.1/Sun Jun 23 22:40:37 2002// +/cnewsf/1.2/Sat Jun 29 00:06:12 2002// +/cnewsi/1.2/Sat Jun 29 00:06:12 2002// +/cnewsp/1.1/Sun Jun 23 22:40:37 2002// +/cnewst/1.1/Sun Jun 23 22:40:37 2002// +D diff --git a/lasker-2.2.3/data/admin/CVS/Repository b/lasker-2.2.3/data/admin/CVS/Repository new file mode 100644 index 0000000..546e5d1 --- /dev/null +++ b/lasker-2.2.3/data/admin/CVS/Repository @@ -0,0 +1 @@ +lasker/data/admin diff --git a/lasker-2.2.3/data/admin/CVS/Root b/lasker-2.2.3/data/admin/CVS/Root new file mode 100644 index 0000000..c42ba94 --- /dev/null +++ b/lasker-2.2.3/data/admin/CVS/Root @@ -0,0 +1 @@ +/home/cvs diff --git a/lasker-2.2.3/data/admin/accounts b/lasker-2.2.3/data/admin/accounts new file mode 100644 index 0000000..fdb6b08 --- /dev/null +++ b/lasker-2.2.3/data/admin/accounts @@ -0,0 +1,19 @@ + +accounts + +These accounts were created in order to aid admins with their work. They +shouldn't be used for any other purpose. Some of these accounts have admin +status. + + adjudicate - an account for adjudication requests + Bug - an account for bug reports + filter - an account to log filtered sites/reasons for filtering + Suggestion - an account for suggestions + vacation - an account for admin holiday notification + helpfiles - an account for help file updating requests + +If you need to use an account but don't know the password, ask an admin who +does. + +[Last modified: December 25, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/admin/acheckhelp b/lasker-2.2.3/data/admin/acheckhelp new file mode 100644 index 0000000..6d420e5 --- /dev/null +++ b/lasker-2.2.3/data/admin/acheckhelp @@ -0,0 +1,8 @@ + +ahelpcheck + +Usage: ahelpcheck +RESTRICTED TO ADMINISTRATORS. + + This prints a report on any commands that are missing help pages + diff --git a/lasker-2.2.3/data/admin/aconfig b/lasker-2.2.3/data/admin/aconfig new file mode 100644 index 0000000..af48925 --- /dev/null +++ b/lasker-2.2.3/data/admin/aconfig @@ -0,0 +1,15 @@ + +aconfig + +Usage: aconfig variable value +RESTRICTED TO ADMINISTRATORS. + + sets the server config variable 'variable' to 'value' + + If used with no parameters then displays all current server + variables + + If the value is set to '-' then the variable is deleted + + Example: + aconfig SERVER_LOCATION Canberra, Australia diff --git a/lasker-2.2.3/data/admin/addaccounts b/lasker-2.2.3/data/admin/addaccounts new file mode 100644 index 0000000..80e3011 --- /dev/null +++ b/lasker-2.2.3/data/admin/addaccounts @@ -0,0 +1,101 @@ +addaccounts + + This help file documents the rules for adding extra accounts for players. + + The file is for the AFICS site, please feel free to modify the contents +or admin names for your particular site. + +Types of account allowed: + + playing account or | only 1 of these allowed per person + chatting account or | admins may have one of these in addition + playing/chatting account | to their normal account - see below. + + - This is the default registered account. + + blind account - for blindfold chess ONLY! + + - may shout with it, but NOT to be used as + - an excuse to abuse/get round quota/get + - past censor lists etc. + + - must use style 9 (although may set to + - another style to examine afterward) + + team account - for team chess ONLY! + - see rules for blind accounts + + - advise player not to let members other + - than from his/her site to use it as + - is responsible for their behaviour. + - this is not a hard fixed rule though. + + computer account or | maximum 1 per player + 'cyborg' account | (more if automatic moving) + + - non-automatic computers should NOT be + - used as a shouting mechanism (except for + - match pairings, greetings etc) + + - A cyborg account is where the player is + - using a computer to analyse the moves, + - but a human is deciding which one to play. + - (can make a very strong player) + + - Useful if computer specifications/house + - rules are placed in notes (eg no aborts) + +(any problems with the above three - remove immediately and comment the + player account) + + admin account - may be used to play/chat + + - advise to get a player account to save + - getting questions in the middle of a game + + tester account - admins/programmers only. + - maximum of 2 per person (or more if only + - for a temporary period) + + helper account - receives messages from players (eg bug) + + - admins only, unless authorised by Sparky + - or sveshi (AFICS) + - do NOT put passwords in admin help files. + +1> Extra admins accounts. + Admins can have as many accounts as they wish as long as the above rules + are followed. + +2> Extra user accounts. + + Must satisfy the following criterea: + + + 1> Is not currently being sanctioned (eg on abuser list) + + 2> Comment file is clean or nearly clean (check the comments don't + assume because someone has more than one comment they have been + an abuser). Repeat offenders must be refused additional accounts. + + 3> The player is not known to cause (much) trouble. + + If in doubt please check with sveshi (AFICS) first. + + Must put in comments list of the player applying for it the name and type + of account + + Eg. addcomment FishFood DAV's blind account + + Must add in the realname of the account, the handle of the player and what + type of account it is. + + Finally add it to a list with +listname [name] if appropriate. + + Do NOT revert an additional account to a player account without good reason + (eg old account was destroyed somehow). Check with sveshi (AFICS) if unsure.. + +See ahelp: accounts, addplayer +See help: addlist, sublist + +[Last modified 11/28/95 - DAV] diff --git a/lasker-2.2.3/data/admin/addcomment b/lasker-2.2.3/data/admin/addcomment new file mode 100644 index 0000000..faadf3f --- /dev/null +++ b/lasker-2.2.3/data/admin/addcomment @@ -0,0 +1,20 @@ + +addcomment + +Usage: addcomment user comment +RESTRICTED TO ADMINISTRATORS. + + Places "comment" in the user's comments. If a user has comments, the number +of comments is indicated to admins using the "finger" command. The comments +themselves are displayed by the "showcomments" command. + + Please add comments when action is taken regarding the user's account, such +as admin actions, changes in settings or even complaints from other users. +Comments provide a ready source of documentation and reference for all admins +to review as needed. + +See ahelp: finger showcomment +See help: + +[Last modified: September 14, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/admin/addplayer b/lasker-2.2.3/data/admin/addplayer new file mode 100644 index 0000000..6b162fb --- /dev/null +++ b/lasker-2.2.3/data/admin/addplayer @@ -0,0 +1,19 @@ + +addplayer + +Usage: addplayer playername emailaddress realname +RESTRICTED TO ADMINISTRATORS. + + Adds a local player to the server with the handle of "playername". For +example: + + addplayer Hawk u940456@daimi.aau.dk Henrik Gram + +If there is no email address, use "none". Settings can be revised using +asetemail, asethandle ans asetname. + +See ahelp: asetemail asethandle asetrealname raisedead remplayer +See help: register + +[Last modified: September 14, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/admin/adjud_info b/lasker-2.2.3/data/admin/adjud_info new file mode 100644 index 0000000..de68878 --- /dev/null +++ b/lasker-2.2.3/data/admin/adjud_info @@ -0,0 +1,32 @@ + +adjud_info + + Games should be adjudicated as a win for a player only if the game is an +obvious (theoretical) win. For example, (a) K+R vs. K, or (b) up a queen in +the middlegame. You may also grant a win due to time IF (1) the player +requests a win on this basis and (2) the conditions (namely clocking settings) +warrant it. + + If the player seeks a draw, then the game should be dead equal in the +endgame. + + Abort adjudications are appropriate if the game has lasted only a few moves +and neither player can speak of an advantage: i.e., 1. d4 d5, 2. c4 c6, 3. Nf3 +could be aborted. Games should *not* be aborted if one side has an advantage. +For example, 1. d4 d5, 2. c4 e6, 3. c5 should *not* be adjudicated as an +abort, especially if white wants the abort. + + In rare cases, it might be necessary to adjudicate a game that is in +progress. These occasions can occur when one opponent is a computer that +either (a) fails to move, in which case an abort may be granted, or (b) +continues play in a clearly drawn position, in which case a draw may be +granted. + + To list games for which adjudications have been requested, type "ahelp +adjrequests". + +See ahelp: adjudicate +See help: adjudication + +[Last modified: September 18, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/admin/adjudicate b/lasker-2.2.3/data/admin/adjudicate new file mode 100644 index 0000000..57d399c --- /dev/null +++ b/lasker-2.2.3/data/admin/adjudicate @@ -0,0 +1,26 @@ + +adjudicate + +Usage: adjudicate white_player black_player result +RESTRICTED TO ADMINISTRATORS. + + Adjudicates a game between white_player and black_player. The result is one +of: abort, draw, white, black. "Abort" cancels the game (no win, loss or +draw), "white" gives white_player the win, "black" gives black_player the win, +and "draw" gives a draw. Both white_player and black_player will be notified +by server messages concerning the adjudication. + + In most cases, the game will be a stored (adjourned) game for which one +opponent has made an adjudication request. To list games for which +adjudications have been requested, type "ahelp adjrequests". However, there +may be occasions when a game in progress needs to be adjudicated online -- +such as when a computer fails to move or cannot accept a draw in a clearly +drawn position. + + For guidelines about adjudications, see "adjud_info". + +See ahelp: adjud_info +See help: adjourn adjudicate_request stored + +[Last modified: September 18, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/admin/admin b/lasker-2.2.3/data/admin/admin new file mode 100644 index 0000000..c4ff054 --- /dev/null +++ b/lasker-2.2.3/data/admin/admin @@ -0,0 +1,14 @@ + +admin + +Usage: admin +RESTRICTED TO ADMINISTRATORS. + + This command toggles your admin symbol (*) on/off. This symbol appears in +who listings. + +See ahelp: +See help: who + +[Last modified: June 22, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/admin/admin_hierarchy b/lasker-2.2.3/data/admin/admin_hierarchy new file mode 100644 index 0000000..bbcd9ce --- /dev/null +++ b/lasker-2.2.3/data/admin/admin_hierarchy @@ -0,0 +1,8 @@ +0 "Normal User" +5 "Authorized Helper Person" (DAV says no, we can't do this. Hmmm!) +10 "Administrator" +15 "Help File Librarian/Administrator" +20 "Master Administrator" +50 "Master Help File Librarian/Administrator" +60 "Assistant Super User" +100 "Super User" diff --git a/lasker-2.2.3/data/admin/adump b/lasker-2.2.3/data/admin/adump new file mode 100644 index 0000000..b2b8cea --- /dev/null +++ b/lasker-2.2.3/data/admin/adump @@ -0,0 +1,8 @@ + +adump + +Usage: adump +RESTRICTED TO GODS + +This dumps the complete server internal state to a file called +'globals.dat' in the main directory. Used for debugging. diff --git a/lasker-2.2.3/data/admin/ahelp b/lasker-2.2.3/data/admin/ahelp new file mode 100644 index 0000000..1dbc9db --- /dev/null +++ b/lasker-2.2.3/data/admin/ahelp @@ -0,0 +1,15 @@ + +ahelp + +Usage: ahelp [topic] +RESTRICTED TO ADMINISTRATORS. + + If a topic is specified, this command prints help on the given administrator +topic. If topic is omitted, this command lists help files that only admins +may read. + +See ahelp: admin_commands +See help: admins + +[Last modified: July 1, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/admin/amotd b/lasker-2.2.3/data/admin/amotd new file mode 100755 index 0000000..6a4d319 --- /dev/null +++ b/lasker-2.2.3/data/admin/amotd @@ -0,0 +1,7 @@ + +This is the admin motd. Type "help motd" to see the user motd. + + Admin command helpfiles are shown by ahelp. Many don't have helpfiles yet. + "ahelp admin_commands" gives a list of all the admin commands. + Type "anews" for admin news. "anews all" to catch up if you forgot. +__________________________________________________________________________ diff --git a/lasker-2.2.3/data/admin/anews b/lasker-2.2.3/data/admin/anews new file mode 100644 index 0000000..08bf7bb --- /dev/null +++ b/lasker-2.2.3/data/admin/anews @@ -0,0 +1,16 @@ + +anews + +Usage: anews [#, all] +RESTRICTED TO ADMINISTRATORS. + + This command is used to display anews (admin news) entries. The entries are +numbered. "Anews #" displays that anews item. "Anews all" will display all +items. Anews items are created by the "canewsi" command with further +information archived by the "canewsf" command. + +See ahelp: canewsf canewsi cnewsf cnewsi +See help: motd_help news + +[Last modified: September 14, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/admin/announce b/lasker-2.2.3/data/admin/announce new file mode 100644 index 0000000..dd9fa75 --- /dev/null +++ b/lasker-2.2.3/data/admin/announce @@ -0,0 +1,14 @@ + +announce + +Usage: announce message +RESTRICTED TO ADMINISTRATORS. + + Broadcasts your message to all logged on users. Announcements reach all +users and cannot be censored in any way (such as by "set shout 0"). + +See ahelp: annunreg +See help: shout + +[Last modified: June 22, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/admin/annunreg b/lasker-2.2.3/data/admin/annunreg new file mode 100644 index 0000000..d468b45 --- /dev/null +++ b/lasker-2.2.3/data/admin/annunreg @@ -0,0 +1,15 @@ + +annunreg + +Usage: annunreg message +RESTRICTED TO ADMINISTRATORS. + + Broadcasts your message to all logged on unregistered users, and admins, +too. Announcements reach all unregistered users and admins and cannot be +censored in any way (such as by "set shout 0"). + +See ahelp: announce +See help: shout + +[Last modified: June 22, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/admin/areload b/lasker-2.2.3/data/admin/areload new file mode 100644 index 0000000..8f4ac3c --- /dev/null +++ b/lasker-2.2.3/data/admin/areload @@ -0,0 +1,11 @@ + +areload + +Usage: areload +RESTRICTED TO GODS + + This reloads the server code without disturbing any games that are + in progress or losing connections to users. + + This makes it possible to add new commands or fix bugs on the fly. + diff --git a/lasker-2.2.3/data/admin/asetadmin b/lasker-2.2.3/data/admin/asetadmin new file mode 100644 index 0000000..f199b16 --- /dev/null +++ b/lasker-2.2.3/data/admin/asetadmin @@ -0,0 +1,25 @@ + +asetadmin + +Usage: asetadmin player AdminLevel +RESTRICTED TO ADMINISTRATORS. + + Sets the admin level of the player with the following restrictions. + 1. You can only set the admin level of players lower than yourself. + 2. You can only set the admin level to a level that is lower than + yourself. + + Levels + ------ + 0 - Normal user. Almost everyone is admin level 0. + 10 - Administrator. This level allows you to execute administrator + commands. + 20 - Master Administrator. Allows you to make and break + administrators. + 100 - God. You can do anything. + +See ahelp: admin-hierarchy +See help: + +[Last modified: June 22, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/admin/asetblitz b/lasker-2.2.3/data/admin/asetblitz new file mode 100644 index 0000000..e1112a8 --- /dev/null +++ b/lasker-2.2.3/data/admin/asetblitz @@ -0,0 +1,15 @@ + +asetblitz + +Usage: asetblitz handle rating won lost drew RD +RESTRICTED TO ADMINISTRATORS. + + This command allows admins to set a user's statistics for Blitz games. The +parameters are self-explanatory: rating, # of wins, # of losses, # of draws, +and ratings deviation. + +See ahelp: asetstd asetwild +See help: glicko ratings + +[Last modified: July 17, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/admin/asetbughouse b/lasker-2.2.3/data/admin/asetbughouse new file mode 100644 index 0000000..2df3726 --- /dev/null +++ b/lasker-2.2.3/data/admin/asetbughouse @@ -0,0 +1,11 @@ + +asetbughouse + +Usage: asetbughouse handle rating won lost drew RD +RESTRICTED TO ADMINISTRATORS. + + This command allows admins to set a user's statistics for bughouse games. +The parameters are self-explanatory: rating, # of wins, # of losses, # of +draws, and ratings deviation. + +See ahelp: asetblitz asetwild asetstd diff --git a/lasker-2.2.3/data/admin/asetemail b/lasker-2.2.3/data/admin/asetemail new file mode 100644 index 0000000..c1e5800 --- /dev/null +++ b/lasker-2.2.3/data/admin/asetemail @@ -0,0 +1,16 @@ + +asetemail + +Usage: asetemail player [address] +RESTRICTED TO ADMINISTRATORS. + + Sets the email address of the player to the address given. If the address +is omited, then the player's email address is cleared. The person's email +address is revealed to them when they use the "finger" command, but no other +users -- except admins -- will have another player's email address displayed. + +See ahelp: finger +See help: finger + +[Last modified: June 22, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/admin/asethandle b/lasker-2.2.3/data/admin/asethandle new file mode 100644 index 0000000..cfb324a --- /dev/null +++ b/lasker-2.2.3/data/admin/asethandle @@ -0,0 +1,15 @@ + +asethandle + +Usage: asethandle oldname newname +RESTRICTED TO ADMINISTRATORS. + + This command changes the handle of the player from oldname to newname. The +various player information, messages, logins, comments and games should be +automatically transferred to the new account. + +See ahelp: asetpasswd +See help: + +[Last modified: June 22, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/admin/asetlight b/lasker-2.2.3/data/admin/asetlight new file mode 100644 index 0000000..1f45f95 --- /dev/null +++ b/lasker-2.2.3/data/admin/asetlight @@ -0,0 +1,11 @@ + +asetlight + +Usage: asetlight handle rating won lost drew RD +RESTRICTED TO ADMINISTRATORS. + + This command allows admins to set a user's statistics for lightning games. +The parameters are self-explanatory: rating, # of wins, # of losses, # of +draws, and ratings deviation. + +See ahelp: asetblitz asetwild asetstd diff --git a/lasker-2.2.3/data/admin/asetmaxplayer b/lasker-2.2.3/data/admin/asetmaxplayer new file mode 100644 index 0000000..97f795f --- /dev/null +++ b/lasker-2.2.3/data/admin/asetmaxplayer @@ -0,0 +1,21 @@ + +asetmaxplayer + +Usage: asetmaxplayer [n] +RESTRICTED TO ADMINISTRATORS. + + With an argument, this command raises or lowers the level at which logons +from non-admins will be filtered. If an argument is supplied, it is checked +to make sure it is both within the limits of the operating system and at least +minimally safe. Without an argument, the command displays detailed +information about the current limits. + + The greater of max_connections-50 and 200 is a threshhold for triggering +guest login restrictions. When the number of non-admin users is above that +value, unregistered logins are turned away with a nice message. + +See ahelp: +See help: limits + +[Last modified: October 9, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/admin/asetpasswd b/lasker-2.2.3/data/admin/asetpasswd new file mode 100644 index 0000000..7485e16 --- /dev/null +++ b/lasker-2.2.3/data/admin/asetpasswd @@ -0,0 +1,19 @@ + +asetpasswd + +Usage: asetpasswd player {password,*} +RESTRICTED TO ADMINISTRATORS. + + This command sets the password of the player to the password given. If '*' +is specified then the player's account is locked, and no password will work +until a new one is set by asetpasswd.. + + If the player is connected, he is told of the new password and the name of +the admin who changed it, or likewise of his account status. An email message +is mailed to the player's email address as well. + +See ahelp: +See help: password + +[Last modified: July 1, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/admin/asetrealname b/lasker-2.2.3/data/admin/asetrealname new file mode 100644 index 0000000..10aa74c --- /dev/null +++ b/lasker-2.2.3/data/admin/asetrealname @@ -0,0 +1,14 @@ + +asetrealname + +Usage: asetrealname user newname +RESTRICTED TO ADMINISTRATORS. + + This command sets the user's real name (as displayed to admins on finger +notes) to "newname". + +See ahelp: finger +See help: + +[Last modified: June 22, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/admin/asetstd b/lasker-2.2.3/data/admin/asetstd new file mode 100644 index 0000000..2fa3080 --- /dev/null +++ b/lasker-2.2.3/data/admin/asetstd @@ -0,0 +1,15 @@ + +asetstd + +Usage: asetstd handle rating won lost drew RD +RESTRICTED TO ADMINISTRATORS. + + This command allows admins to set a user's statistics for Standard games. +The parameters are self-explanatory: rating, # of wins, # of losses, # of +draws, and ratings deviation. + +See ahelp: asetblitz asetwild +See help: glicko ratings + +[Last modified: July 17, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/admin/asetv b/lasker-2.2.3/data/admin/asetv new file mode 100644 index 0000000..b341068 --- /dev/null +++ b/lasker-2.2.3/data/admin/asetv @@ -0,0 +1,15 @@ + +asetv + +Usage: asetv user instruction +RESTRICTED TO ADMINISTRATORS. + + This command executes "set" instructions as if they had been made by the +user indicated. For example, "asetv DAV shout 0" would set DAV's shout +variable to 0. + +See ahelp: pose +See help: set variables + +[Last modified: October 1, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/admin/asetwild b/lasker-2.2.3/data/admin/asetwild new file mode 100644 index 0000000..daf28a7 --- /dev/null +++ b/lasker-2.2.3/data/admin/asetwild @@ -0,0 +1,15 @@ + +asetwild + +Usage: asetwild handle rating won lost drew RD +RESTRICTED TO ADMINISTRATORS. + + This command allows admins to set a user's statistics for Wild games. The +parameters are self-explanatory: rating, # of wins, # of losses, # of draws, +and ratings deviation. + +See ahelp: asetblitz asetstd +See help: glicko ratings + +[Last modified: July 17, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/admin/ban b/lasker-2.2.3/data/admin/ban new file mode 100644 index 0000000..819407f --- /dev/null +++ b/lasker-2.2.3/data/admin/ban @@ -0,0 +1,26 @@ + +ban + +Usage: [+,-,=]ban handle +RESTRICTED TO ADMINISTRATORS. + + Adds to (+ban), removes from (-ban) or lists users on (=ban) the ban list. +Users on the ban list cannot log onto the server. The user's account will +still be active, however. As a result, autoregistration will screen out the +user's email address and prevent additional accounts from being created from +there, and the handle cannot be adopted by another user. + + When you ban (or unban) a user, please leave a message in the player's +comments file using the "addcom" command. You may also want to lock the +account by "asetpasswd handle *". + + Concerning when to ban a user, please refer to the admin guidelines that +have been developed. See also help files on server conduct, such as abuser, +etiquette and shout_abuse. It is also best to consult without admins abut the +case in question. Documentation of user behavior is important. + +See ahelp: addcom asetpasswd filter +See help: abuser etiquette lists shout_abuse showlists + +[Last modified: October 16, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/admin/buglist b/lasker-2.2.3/data/admin/buglist new file mode 100644 index 0000000..fa2acd0 --- /dev/null +++ b/lasker-2.2.3/data/admin/buglist @@ -0,0 +1,95 @@ +FICS bugs as of 7/22/95: + +The bugs followed by a (?) are not verified. They could be caused +by some operator error or other anomoly. After verification by a +few admins that they do not exist, they will be removed from the list. + +FIXED If you are observing a game and type moves it says that you are + not playing, observing, or examining a game. + +2. The ratings system needs to be verified for accuracy. Several + people have reported discrepencies. (E.g. According to the + formulas, RD can increase only due to the passage of time, + never because of playing a game. Yet sometimes people who + have just played play again and their RD increases. According + to Glickman, this must be a bug. (Courtesy fritzl)) + +3. Draw by repetition being claim even though a position only came up + on time. (?) + +FIXED Some people stay logged into channels and notify lists even though + they are not logged in. + +FIXED Private games can be watched by repeated typing refresh. + +6. When challanged to a wild 5 game, after accepting, it becomes a + wild 0 game. Reported several times. (?) + +7. An ambiguity in the move list occurs when two rooks can capture on + the same square. (?) + +8. The width variable is not considered in who. Some reports even say + that it is not considered at all. + +9. History recognizes a stalemate as a win for the person who stalemated. (?) + +10. When you want to log in as an unregistered user, if you first choose + a handle which is already registered, the server tells you to hit + return and try again. But it doesn't let you try again! It + disconnects you instead. + +11. When loading a 2 12 rated game on move 19, an unrated untimed game + on move 1 comes up. (?) + +FIXED Even if kibitz is set to 0, you still hear kibitzes. + +13. The time and date that is sent with mailmoves is wrong. (?) + +FIXED When you offer an abort, your opponent is not told to type abort + to accept. + +15. Unregistered players can set stats and make notify lists and keep + a history, from login to login! + +16. Before the game the server reports "your new RD is x." However, after + the game, x does not correspond with your new RD. + +17. When someone makes the move "bc3" the server needs to check for Bishop + captures c3 or Pawn captures c3. + +FIXED Wins can be awarded on time even if there are no pieces left. (?) + +19. There are discrepencies in the 'assess' command's predictions. (?) + +FIXED Wild5 reverses the players ratings in the match challenge. (?) + (Has been report for other games too.) + +21. After mailing old moves, the server claims "No such game," but it + still mails the moves. (?) + +22. Someone sends a draw offer and then they move, which causes the + server to decline the draw. Then the person types decline + and it sends another draw offer. (?) + +23. When a player has two adjourned games, the 'accept' command tried to + load the other. The players are unable to play each other. (See + pdeck Jun 7) (?) + +24. A player cannot play 0 8 (or any other increment) because it parses as + untimed. (?) + +25. When a player is challenged to a normal match, and then a wild match by + a different person, if the normal game is accepted, the game becomes + a wild match with the person who challenged to the normal game. (?) + +26. If a player has been idle for example for 2:30 (2 hours 30 minutes), + when someone tells something to that person it says the player has + been idle for only 30 minutes (not 2:30). + +FIXED If you do 'sa' for say, it tries to simabort instead. + +28. With auto=1, drawn games are not sent. (?) + +[Last Modified: July 22, 1995 -- Marsalis] + + diff --git a/lasker-2.2.3/data/admin/canewsd b/lasker-2.2.3/data/admin/canewsd new file mode 100644 index 0000000..fa77f7c --- /dev/null +++ b/lasker-2.2.3/data/admin/canewsd @@ -0,0 +1,9 @@ +canewsd + +Usage: canewsd # +RESTRICTED TO ADMINISTRATORS. + +This command removes the last line of an admin news item + +See ahelp: canewse canewsi canewsp canewst +See help: anews diff --git a/lasker-2.2.3/data/admin/canewse b/lasker-2.2.3/data/admin/canewse new file mode 100644 index 0000000..b2abdcf --- /dev/null +++ b/lasker-2.2.3/data/admin/canewse @@ -0,0 +1,18 @@ +canewse + +Usage: canewse # [n] +RESTRICTED TO ADMINISTRATORS. + + This command sets the expiration of the anews item to a number of days [n]. +The '#' is the number of the anews index. If the number of days is not +specified, the anews item will be perpetual; otherwise, it will expire in +the specified number of days and be removed from the anews index altogether. +The expiration of anews items will force the anews index out of its running +sequence. + +NOTICE: To expire an anews item immediately, use 'canewse # 0'. + +See ahelp: canewsf canewsi canewsp canewst +See help: anews + +[Last modified: December 12, 1999 -- carlsbad] diff --git a/lasker-2.2.3/data/admin/canewsf b/lasker-2.2.3/data/admin/canewsf new file mode 100644 index 0000000..00dfe4b --- /dev/null +++ b/lasker-2.2.3/data/admin/canewsf @@ -0,0 +1,16 @@ + +canewsf + +Usage: canewsf # message +RESTRICTED TO ADMINISTRATORS. + + This command allows you to add additional information about an anews item +that had previously been created using 'canewsi'. The '#' is the number of +the news index and 'message' is the additional text. You can also modify a +previous anews item description and thus update the anews item easily. + +See ahelp: canewsi +See help: anews + +[Last modified: September 14, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/admin/canewsi b/lasker-2.2.3/data/admin/canewsi new file mode 100644 index 0000000..1d2a963 --- /dev/null +++ b/lasker-2.2.3/data/admin/canewsi @@ -0,0 +1,21 @@ + +canewsi + +Usage: canewsi message +RESTRICTED TO ADMINISTRATORS. + + This command adds a new item to the anews index. The message is limited to +45 characters for formating purposes. In essence, the anews index works like +a newspaper headline, giving admins enough information to know whether they +should read the entire anews file for that item. A list of recent anews items +is displayed by the 'anews' command. + + After creating the anews item, the command reports the anews item number +along with a reminder to create an anews file if necessary. This command +replaced the 'createanews' command. + +See ahelp: canewsf +See help: anews + +[Last modified: September 14, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/admin/canewsp b/lasker-2.2.3/data/admin/canewsp new file mode 100644 index 0000000..89488d2 --- /dev/null +++ b/lasker-2.2.3/data/admin/canewsp @@ -0,0 +1,13 @@ +canewsp + +Usage: canewsp # +RESTRICTED TO ADMINISTRATORS. + + This command allows you to change the poster of an anews item. The 'Posted +by ' line at the end of the anews item will reflect the admin account +which executed the command. The '#' is the number of the anews index. + +See ahelp: canewse canewsf canewsi canewst +See help: anews + +[Last modified: December 12, 1999 -- carlsbad] diff --git a/lasker-2.2.3/data/admin/canewst b/lasker-2.2.3/data/admin/canewst new file mode 100644 index 0000000..47711c1 --- /dev/null +++ b/lasker-2.2.3/data/admin/canewst @@ -0,0 +1,14 @@ +canewst + +Usage: cnewst # message +RESTRICTED TO ADMINISTRATORS. + + This command allows you to change the title of an anews item that had +previously been created using 'canewsi'. The '#' is the number of the anews +index and 'message' is the new title. The message length limit in 'canewsi' +also applies here. + +See ahelp: canewse canewsf canewsi canewsp +See help: anews + +[Last modified: December 12, 1999 -- carlsbad] diff --git a/lasker-2.2.3/data/admin/chkgame b/lasker-2.2.3/data/admin/chkgame new file mode 100644 index 0000000..9dc2bb6 --- /dev/null +++ b/lasker-2.2.3/data/admin/chkgame @@ -0,0 +1,30 @@ + +chkgame + +Usage: chkgame # +RESTRICTED TO ADMINISTRATORS. + + This command is a debugging tool primarlity, but might be useful for other +occasions as well. The following information on a game is displayed: + +Current stored info for game # (garray[#]): +Initial white time: # Initial white increment # +Initial black time: # Initial black increment # +Time of starting: DATE +Game is: User1 (rating) vs. User2 (rating) +White parray entry: # Black parray entry # +Game is not bughouse or link to partner's game not found. + [versus bughouse links exist] +Game is rated [or unrated] +Game is not private [or is private] +Games is of type blitz [or other type] +## halfmove(s) have been made +White's time # Black's time # +The clock is [is not] ticking +Game status: GAME_NEW [versus GAME_EXAMINE for instance] + +See ahelp: +See help: games + +[Last modified: December 25, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/admin/chkip b/lasker-2.2.3/data/admin/chkip new file mode 100644 index 0000000..093c7c1 --- /dev/null +++ b/lasker-2.2.3/data/admin/chkip @@ -0,0 +1,19 @@ + +chkip + +Usage: chkip ip_address +RESTRICTED TO ADMINISTRATORS. + + This command returns the names and IPs of all users currently logged on from +a given IP address. You can use the '*' wildcard in this command. For +example: + + chkip 129.1.* + +will give all users with IP's beginning with "129.1.1". + +See ahelp: +See help: + +[Last modified: October 8, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/admin/chkpl b/lasker-2.2.3/data/admin/chkpl new file mode 100644 index 0000000..d524cdc --- /dev/null +++ b/lasker-2.2.3/data/admin/chkpl @@ -0,0 +1,33 @@ + +chkpl + +Usage: chkpl handle +RESTRICTED TO ADMINISTRATORS. + + This command displays server information about a given user. Items +displayed are: + + number X in parray of size Y + name + login + fullName + emailAddress + socket + registered + last_tell + last_channel + logon_time + adminLevel + muzzled + cmuzzled + network_player + thisHost + lastHost + num_notify + num_comments + +See ahelp: chkip +See help: finger + +[Last modified: October 8, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/admin/chksc b/lasker-2.2.3/data/admin/chksc new file mode 100644 index 0000000..5bdc052 --- /dev/null +++ b/lasker-2.2.3/data/admin/chksc @@ -0,0 +1,13 @@ + +chksc + +Usage: chksc n +RESTRICTED TO ADMINISTRATORS. + + Shows which user is logged on to socket n. + +See ahelp: +See help: + +[Last modified: October 11, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/admin/chkts b/lasker-2.2.3/data/admin/chkts new file mode 100644 index 0000000..ae91d22 --- /dev/null +++ b/lasker-2.2.3/data/admin/chkts @@ -0,0 +1,13 @@ + +chkts + +Usage: chkts +RESTRICTED TO ADMINISTRATORS. + + This command displays all current users who are using timeseal. + +See ahelp: +See help: timeseal + +[Last modified: August 20, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/admin/cmuzzle b/lasker-2.2.3/data/admin/cmuzzle new file mode 100644 index 0000000..fed8131 --- /dev/null +++ b/lasker-2.2.3/data/admin/cmuzzle @@ -0,0 +1,23 @@ + +cmuzzle + +Usage: [=,-,=]cmuzzle +RESTRICTED TO ADMINISTRATORS. + + Adds to (+cmuzzle), removes from (-cmuzzle) or lists users on (=cmuzzle) the +cmuzzle list. Users on the cmuzzle list cannot use "cshout". Other forms of +communication are not affected. + + When you cmuzzle (or uncmuzzle) a user, please leave a message in the +player's comments file using the "addcom" command. Documentation of user +behavior is important. + + Concerning when to cmuzzle a user, please refer to the admin guidelines that +have been developed. See also help files on server conduct, such as abuser, +etiquette and shout_abuse. + +See ahelp: addcom muzzle +See help: etiquette lists shout shout_abuse + +[Last modified: October 16, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/admin/cnewsd b/lasker-2.2.3/data/admin/cnewsd new file mode 100644 index 0000000..1c6b87e --- /dev/null +++ b/lasker-2.2.3/data/admin/cnewsd @@ -0,0 +1,9 @@ +cnewsd + +Usage: cnewsd # +RESTRICTED TO ADMINISTRATORS. + +This command removes the last line of a news item + +See ahelp: cnewse cnewsi cnewsp cnewst +See help: news diff --git a/lasker-2.2.3/data/admin/cnewse b/lasker-2.2.3/data/admin/cnewse new file mode 100644 index 0000000..0620732 --- /dev/null +++ b/lasker-2.2.3/data/admin/cnewse @@ -0,0 +1,17 @@ +cnewse + +Usage: cnewse # [n] +RESTRICTED TO ADMINISTRATORS. + + This command sets the expiration of the news item to a number of days [n]. +The '#' is the number of the news index. If the number of days is not +specified, the news item will be perpetual; otherwise, it will expire in the +specified number of days and be removed from the news index altogether. The +expiration of news items will force the news index out of its running sequence. + +NOTICE: To expire a news item immediately, use 'cnewse # 0'. + +See ahelp: cnewsf cnewsi cnewsp cnewst +See help: news + +[Last modified: December 12, 1999 -- carlsbad] diff --git a/lasker-2.2.3/data/admin/cnewsf b/lasker-2.2.3/data/admin/cnewsf new file mode 100644 index 0000000..b6c807e --- /dev/null +++ b/lasker-2.2.3/data/admin/cnewsf @@ -0,0 +1,16 @@ +cnewsf + +Usage: cnewsf # message +RESTRICTED TO ADMINISTRATORS. + + This command allows you to add additional information about a news item +that had previously been created using 'cnewsi'. The '#' is the number of the +news index and 'message' is the additional text. You can also modify a +previous news item description and thus update the news item easily. + +NOTICE: To remove the text in a news item, use 'cnews #'. + +See ahelp: cnewse cnewsi cnewsp cnewst +See help: news + +[Last modified: December 12, 1999 -- carlsbad] diff --git a/lasker-2.2.3/data/admin/cnewsi b/lasker-2.2.3/data/admin/cnewsi new file mode 100644 index 0000000..56fbddf --- /dev/null +++ b/lasker-2.2.3/data/admin/cnewsi @@ -0,0 +1,16 @@ +cnewsi + +Usage: cnewsi message +RESTRICTED TO ADMINISTRATORS. + + This command adds a new item to the news index. The message is limited to +45 characters for formating purposes. In essence, the news index works like a +newspaper headline, giving the user enough information to know whether they +should read the entire news file for that item. After creating the news item, +the command reports the news item number along with a reminder to create a +news file if necessary. + +See ahelp: cnewse cnewsf cnewsp cnewst +See help: news + +[Last modified: December 12, 1999 -- carlsbad] diff --git a/lasker-2.2.3/data/admin/cnewsp b/lasker-2.2.3/data/admin/cnewsp new file mode 100644 index 0000000..83c5a67 --- /dev/null +++ b/lasker-2.2.3/data/admin/cnewsp @@ -0,0 +1,13 @@ +cnewsp + +Usage: cnewsp # +RESTRICTED TO ADMINISTRATORS. + + This command allows you to change the poster of a news item. The 'Posted by +' line at the end of the news item will reflect the admin account which +executed the command. The '#' is the number of the news index. + +See ahelp: cnewse cnewsf cnewsi cnewst +See help: news + +[Last modified: December 12, 1999 -- carlsbad] diff --git a/lasker-2.2.3/data/admin/cnewst b/lasker-2.2.3/data/admin/cnewst new file mode 100644 index 0000000..9bee407 --- /dev/null +++ b/lasker-2.2.3/data/admin/cnewst @@ -0,0 +1,14 @@ +cnewst + +Usage: cnewst # message +RESTRICTED TO ADMINISTRATORS. + + This command allows you to change the title of a news item that had +previously been created using 'cnewsi'. The '#' is the number of the news +index and 'message' is the new title. The message length limit in 'cnewsi' +also applies here. + +See ahelp: cnewse cnewsf cnewsi cnewsp +See help: news + +[Last modified: December 12, 1999 -- carlsbad] diff --git a/lasker-2.2.3/data/admin/createanews b/lasker-2.2.3/data/admin/createanews new file mode 100644 index 0000000..0f279de --- /dev/null +++ b/lasker-2.2.3/data/admin/createanews @@ -0,0 +1,11 @@ + +createanews + + This command has been superceded by the canewsi and canewsf commands. +Please review those help files. + +See ahelp: anews canewsi canewsf +See help: news + +[Last modified: September 14, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/admin/filter b/lasker-2.2.3/data/admin/filter new file mode 100644 index 0000000..833d7a0 --- /dev/null +++ b/lasker-2.2.3/data/admin/filter @@ -0,0 +1,22 @@ + +filter + +Usage: [+,-,=]filter ip +RESTRICTED TO ADMINISTRATORS. + + + This list bans unreg logins from a site where "ip" is a full or partial ip +address. The number of levels in the "ip" affects how much filtering is made. +An "ip" of 123.124.125.126 will ban a machine, 123.124.125 will ban the +server, and 123.124 will probably ban the whole site. A special account has +been established for documenting the need to filter logins: "filter". + + When you filter a site, please leave a message in the filter account: +"message filter ". To read the log of messages in this account, +type "ahelp filtered". + +See ahelp: accounts lists +See help: + +[Last modified: July 16, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/admin/finger b/lasker-2.2.3/data/admin/finger new file mode 100644 index 0000000..78f0d1e --- /dev/null +++ b/lasker-2.2.3/data/admin/finger @@ -0,0 +1,13 @@ + +finger + + Private, confidential information about a user is revealed to admins when +they use the "finger" command. This information includes the player's real +name, email address and whether the player has any comments attached to +his/her account. + +See ahelp: showcomment +See help: finger + +[Last modified: June 22, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/admin/ftell b/lasker-2.2.3/data/admin/ftell new file mode 100644 index 0000000..0ea0518 --- /dev/null +++ b/lasker-2.2.3/data/admin/ftell @@ -0,0 +1,8 @@ +ftell + +Usage: ftell user + + This command forwards all further conversation between an admin and a + user to all those listening in channel 0. + It is unset as soon as the user logs off or ftell is typed without a + parameter. diff --git a/lasker-2.2.3/data/admin/hideinfo b/lasker-2.2.3/data/admin/hideinfo new file mode 100644 index 0000000..1fc8276 --- /dev/null +++ b/lasker-2.2.3/data/admin/hideinfo @@ -0,0 +1,8 @@ + +hideinfo + +Usage: hideinfo +RESTRICTED TO ADMINISTRATORS. + +This command enables/disables the displaying of private player +information to administrators. diff --git a/lasker-2.2.3/data/admin/lists b/lasker-2.2.3/data/admin/lists new file mode 100644 index 0000000..30e57f1 --- /dev/null +++ b/lasker-2.2.3/data/admin/lists @@ -0,0 +1,30 @@ + +lists + +RESTRICTED TO ADMINISTRATORS. + + There are several lists restricted to admin use. They are: + + abuser for users who have abused server etiquette + cmuzzle prevents user from using cshouts + computer identifies user as a computer + filter prevents unreg logons from certain sites + fm adds FM label to a user + gm adds GM label to a user + im adds IM label to a user + muzzle prevents user from using shouts + quota limits frequency of a user's shouts + + To add a user to one of these lists, use "+list_name". To remove a user, +use "-list_name". And "=list_name" lists users on that list. For most lists, +comments are automatically added to the user's file, and you may want to add +one of your own comments as well in order to record your action and reasons. + + Some lists are private, for admin reading only. Some can be read by all +users. The "showlists" help file gives the security level for the lists. + +See ahelp: cmuzzle filter muzzle quota +See help: abuser etiquette showlists + +[Last modified: June 26, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/admin/muzzle b/lasker-2.2.3/data/admin/muzzle new file mode 100644 index 0000000..fe59bec --- /dev/null +++ b/lasker-2.2.3/data/admin/muzzle @@ -0,0 +1,23 @@ + +muzzle + +Usage: [=,-,=]muzzle +RESTRICTED TO ADMINISTRATORS. + + Adds to (+muzzle), removes from (-muzzle) or lists users on (=muzzle) the +muzzle list. Users on the muzzle list cannot use "shout" or "it". They can, +however, use "tell" (including tells to channels). + + When you muzzle (or unmuzzle) a user, please leave a message in the player's +comments file using the "addcom" command. Documentation of user behavior is +important. + + Concerning when to muzzle a user, please refer to the admin guidelines that +have been developed. See also help files on server conduct, such as abuser, +etiquette and shout_abuse. + +See ahelp: addcom cmuzzle +See help: etiquette lists shout shout_abuse + +[Last modified: October 16, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/admin/nuke b/lasker-2.2.3/data/admin/nuke new file mode 100644 index 0000000..f51fe2e --- /dev/null +++ b/lasker-2.2.3/data/admin/nuke @@ -0,0 +1,16 @@ + +nuke + +Usage: nuke user +RESTRICTED TO ADMINISTRATORS. + + This command disconnects the user from the server. The user is informed +that she/he has been nuked by the admin named and a comment is automatically +placed in the user's files (if she/he is a registered user, of course). Do +not nuke someone for fun! + +See ahelp: +See help: etiquette shout_abuse + +[Last modified: July 1, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/admin/pose b/lasker-2.2.3/data/admin/pose new file mode 100644 index 0000000..1ac9b8a --- /dev/null +++ b/lasker-2.2.3/data/admin/pose @@ -0,0 +1,15 @@ + +pose + +Usage: pose user command +RESTRICTED TO ADMINISTRATORS -- Super Users ONLY!!! + + Executes 'command' as if it were typed by 'user'. This command goes beyond +the "asetv" command because "asetv" relates only to variable settings while +"pose" relates to ALL commands a user might execute. + +See ahelp: asetv +See help: + +[Last modified: October 1, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/admin/projects b/lasker-2.2.3/data/admin/projects new file mode 100644 index 0000000..967a0df --- /dev/null +++ b/lasker-2.2.3/data/admin/projects @@ -0,0 +1,35 @@ +Projects for FICS: + +Big projects: + +1. Set up commands for examine mode; allow examiners to add or remove pieces + to or from a position. Also allow users to clear the board except for + kings. + +2. Network many servers together. + + +Medium projects: + +3. Rank information in RAM. UpdateRank takes too long. + + +Smaller projects: + +4. Channel names (like "admin channel") instead of channel numbers + ("channel 0"). If we do this, I think we could seriously consider + eliminating the "shout" and "it" commands. + +5. Draw offers and aborts for adjourned games. + +6. On line registration. I don't see any reason not to allow this now that + we also have autoreg by e-mail. + +7. Apparently some limits are not checked; MAX_CHANNEL, MAX_ALIAS, probably + some others as well. We should fix this. + +Well, these are my immediate thoughts; feel free to add your own, or to +program these. + +[Last modified: November 16, 1995 -- hersco] + diff --git a/lasker-2.2.3/data/admin/quota b/lasker-2.2.3/data/admin/quota new file mode 100644 index 0000000..cbf847d --- /dev/null +++ b/lasker-2.2.3/data/admin/quota @@ -0,0 +1,15 @@ + +quota + +Usage: quota [n] +RESTRICTED TO ADMINISTRATORS. + + The command sets the number of seconds (n) for the shout quota, which +affects only those persons on the shout quota list. If no parameter (n) is +given, the current setting is displayed. + +See ahelp: lists +See help: it shout shout_abuse shout_quota + +[Last modified: June 23, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/admin/raisedead b/lasker-2.2.3/data/admin/raisedead new file mode 100644 index 0000000..6274371 --- /dev/null +++ b/lasker-2.2.3/data/admin/raisedead @@ -0,0 +1,20 @@ + +raisedead + +Usage: raisedead oldname [newname] +RESTRICTED TO ADMINISTRATORS + + Restores an account that has been previously removed using "remplayer". +The zombie files from which it came are removed. Under most circumstances, +you restore the account to the same handle it had before (oldname). However, +in some circumstances you may need to restore the account to a different +handle, in which case you include "newname" as the new handle. After +"raisedead", you may need to use the "asetpasswd" command to get the player +started again as a registered user, especially if the account had been locked +by setting the password to *. + +See ahelp: addplayer asethandle asetpasswd remplayer +See help: + +[Last modified: July 1, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/admin/register b/lasker-2.2.3/data/admin/register new file mode 100644 index 0000000..bd90ec7 --- /dev/null +++ b/lasker-2.2.3/data/admin/register @@ -0,0 +1,43 @@ + +register + + + *** Email registration is now automated! *** + + +To get a registered account, send a message to this address: + + chess@caissa.onenet.net + +... and use as the Subject: "Fics Registration" + +Include a line like the following as the text of your message (please make the +appropriate substitutions as indicated by the <>'s markers): + + fics_addplayer "" + +Here is an example which would register Sparky with the correct name and email +information: + + Ex: fics_addplayer Sparky "Chris L. Petroff" chris@onenet.net + or: fics_addplayer Sparky "Chris L. Petroff" chris@onenet.net human + + +SPECIAL NOTES: + +(1) Quotation marks MUST be used around the name field. + +(2) If this is a human account, 'human' need not be specified. However, + 'computer' MUST be used if you are registering a computer on FICS (see + "computers" help file). + +(3) Do NOT include the <>'s markers in your text. They are used above only + to indicate where you need to place information. + +(4) Please tell us if you are an FM, IM or GM (master's titles for + international competition). + + +See Also: computers + +[Last modified: June 23, 1995 -- Friar] \ No newline at end of file diff --git a/lasker-2.2.3/data/admin/remplayer b/lasker-2.2.3/data/admin/remplayer new file mode 100644 index 0000000..0356697 --- /dev/null +++ b/lasker-2.2.3/data/admin/remplayer @@ -0,0 +1,23 @@ + +remplayer + +Usage: remplayer name +RESTRICTED TO ADMINISTRATORS. + + Removes an account. A copy of its files are saved under .rem.* which can +be found in the appropriate directory (useful in case of an accident). + + The account's details, messages, games and logons are all saved as 'zombie' +files. These zombie accounts are not listed in handles or totals. Although a +handle may have been removed, it is not possible for another user to register +with this handle -OR- to register for a new account using email registration. +The autoregister program checks for regular as well as remplayered accounts. + + Please do not use this command unless necessary, such as for multiple +accounts or inappropriate handles. To stop a player from having access to an +account, it may be preferable to use the "asetpasswd" command instead. + +See also: addplayer asetpasswd raisedead + +[Last modified: October 17, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/admin/rerank b/lasker-2.2.3/data/admin/rerank new file mode 100644 index 0000000..0b4ea93 --- /dev/null +++ b/lasker-2.2.3/data/admin/rerank @@ -0,0 +1,14 @@ + +rerank + +Usage: rerank name +RESTRICTED TO ADMINISTRATORS. + + Use this command to reset a player's rank if there has been a calculation +error. + +See ahelp: +See help: best hbest hrank rank + +[Last modified: June 22, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/admin/server_com b/lasker-2.2.3/data/admin/server_com new file mode 100644 index 0000000..f923473 --- /dev/null +++ b/lasker-2.2.3/data/admin/server_com @@ -0,0 +1,41 @@ + +SERVER COMMANDS [taken from ONENET chess site] + + The following text is displayed when you telnet to ics.onenet.net and log in +through the admin doorway. + +/~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\ +| It's BACK!! ;-> Sveshi's Power-Admin command set: Commands now defined: | +| | +| 'ckemail' - search for anything you like in the address database. | +| (will show matches for any part of email, realname) | +| 'ckname' - search for A NAME (two words) in the address database. | +| 'cklog' - search connect log for a player. | +| 'host' - Tells you an alpha host name from the numeric. | +| 'players' - gives last 24 autoregister attempts. | +| 'uscf' - Searches for the USCF rating of a person (two words) | +| 'fide' - Searches for the ELO rating of a person (two words) | +| 'icswho' - Print name and email info for a player handle | +| | +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Friar's notes +------------- + The commands are typed at the server prompt. They may come in handy when +trying to verify certain user information or dealing with problem situations, +such as duplicate accounts or whether a user is a titled chess master. + + +Usage Result +______________________ _____________________________________________ + +ckemail string Hits for 'string' in address database +ckname name1 name2 Hits for 'name1 name2' in address database +cklog user_handle Lists connect log for user_handle +host ip_number Provides alpha name for IP address +players Lists last 24 autoregister attempts +uscf name1 name2 USCF rating for 'name1 name 2' +fide name1 name2 FIDE rating for 'name1 name 2' +icswho user_handle Real_name and email address for user_handle + +[Last update: September 24, 1995 -- Friar] diff --git a/lasker-2.2.3/data/admin/showcomment b/lasker-2.2.3/data/admin/showcomment new file mode 100644 index 0000000..2572caa --- /dev/null +++ b/lasker-2.2.3/data/admin/showcomment @@ -0,0 +1,13 @@ + +showcomment + +Usage: showcomment user +RESTRICTED TO ADMINISTRATORS. + + This command will display all of the comments added to the user's account. + +See ahelp: addcomment +See help: + +[Last modified: June 22, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/admin/shutdown b/lasker-2.2.3/data/admin/shutdown new file mode 100644 index 0000000..a68a8e5 --- /dev/null +++ b/lasker-2.2.3/data/admin/shutdown @@ -0,0 +1,29 @@ + +shutdown + +Usage: shutdown [now,cancel,time,die] [comment] +RESTRICTED TO ADMINISTRATORS. + + This command shuts down the server, but with different consequences. If the +parameter is omitted or is 'now' then the server is immediately halted cleanly +(including games being saved). If a time is given then a countdown commences +and the server is halted when time is up; "time" is given in seconds (not +minutes). If 'cancel' is given then the countdown is stopped. If the +parameter is 'die', the server will be halted immediately without saving +games; this version can be useful for debugging purposes, but users will need +to be warned in advance because the consequences differ from a normal, +announced shutdown. + + You can add an optional comment to this command. If there is a comment, it +will be displayed to users each time the countdown is updated. Having a +comment is a useful way to explain the reason for the shutdown and cut down on +the number of questions admins will have to answer about the shutdown. + + Using "announce" may be useful during a coutdown so that users can be +informed of special information, such as how long the shutdown will last. + +See ahelp: announce +See help: + +[Last modified: December 25, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/admin/summon b/lasker-2.2.3/data/admin/summon new file mode 100644 index 0000000..4845e33 --- /dev/null +++ b/lasker-2.2.3/data/admin/summon @@ -0,0 +1,15 @@ + +summon + +Usage: summon player +RESTRICTED TO ADMINISTRATORS. + + This command gives a beep and a message to the player indicating that you +want to talk with him/her. The command is useful for waking someone up, for +example a sleepy admin or an ignorant player. + +See ahelp: +See help: + +[Last modified: June 22, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/boards/CVS/Entries b/lasker-2.2.3/data/boards/CVS/Entries new file mode 100644 index 0000000..6ac2699 --- /dev/null +++ b/lasker-2.2.3/data/boards/CVS/Entries @@ -0,0 +1 @@ +D/wild//// diff --git a/lasker-2.2.3/data/boards/CVS/Repository b/lasker-2.2.3/data/boards/CVS/Repository new file mode 100644 index 0000000..716664d --- /dev/null +++ b/lasker-2.2.3/data/boards/CVS/Repository @@ -0,0 +1 @@ +lasker/data/boards diff --git a/lasker-2.2.3/data/boards/CVS/Root b/lasker-2.2.3/data/boards/CVS/Root new file mode 100644 index 0000000..c42ba94 --- /dev/null +++ b/lasker-2.2.3/data/boards/CVS/Root @@ -0,0 +1 @@ +/home/cvs diff --git a/lasker-2.2.3/data/boards/wild/CVS/Entries b/lasker-2.2.3/data/boards/wild/CVS/Entries new file mode 100644 index 0000000..1784810 --- /dev/null +++ b/lasker-2.2.3/data/boards/wild/CVS/Entries @@ -0,0 +1 @@ +D diff --git a/lasker-2.2.3/data/boards/wild/CVS/Repository b/lasker-2.2.3/data/boards/wild/CVS/Repository new file mode 100644 index 0000000..5cc55ef --- /dev/null +++ b/lasker-2.2.3/data/boards/wild/CVS/Repository @@ -0,0 +1 @@ +lasker/data/boards/wild diff --git a/lasker-2.2.3/data/boards/wild/CVS/Root b/lasker-2.2.3/data/boards/wild/CVS/Root new file mode 100644 index 0000000..c42ba94 --- /dev/null +++ b/lasker-2.2.3/data/boards/wild/CVS/Root @@ -0,0 +1 @@ +/home/cvs diff --git a/lasker-2.2.3/data/book/CVS/Entries b/lasker-2.2.3/data/book/CVS/Entries new file mode 100644 index 0000000..664fbc0 --- /dev/null +++ b/lasker-2.2.3/data/book/CVS/Entries @@ -0,0 +1,10 @@ +/changes.txt/1.1/Thu Jun 6 12:09:14 2002// +/eco000.idx/1.1/Thu Jun 6 12:09:14 2002// +/eco999.idx/1.2/Thu Jun 6 12:09:14 2002// +/fen.doc/1.1/Thu Jun 6 12:09:14 2002// +/long001.idx/1.1/Thu Jun 6 12:09:14 2002// +/long999.idx/1.2/Thu Jun 6 12:09:14 2002// +/nic000.idx/1.1/Thu Jun 6 12:09:14 2002// +/nic999.idx/1.2/Thu Jun 6 12:09:14 2002// +/opening.doc/1.1/Thu Jun 6 12:09:14 2002// +D diff --git a/lasker-2.2.3/data/book/CVS/Repository b/lasker-2.2.3/data/book/CVS/Repository new file mode 100644 index 0000000..3d2d14f --- /dev/null +++ b/lasker-2.2.3/data/book/CVS/Repository @@ -0,0 +1 @@ +lasker/data/book diff --git a/lasker-2.2.3/data/book/CVS/Root b/lasker-2.2.3/data/book/CVS/Root new file mode 100644 index 0000000..c42ba94 --- /dev/null +++ b/lasker-2.2.3/data/book/CVS/Root @@ -0,0 +1 @@ +/home/cvs diff --git a/lasker-2.2.3/data/book/changes.txt b/lasker-2.2.3/data/book/changes.txt new file mode 100644 index 0000000..3314120 --- /dev/null +++ b/lasker-2.2.3/data/book/changes.txt @@ -0,0 +1,25 @@ + +To long001.idx: + +Changed: + + KGA: bishop's gambit, Chigorin's attack/Gifford variation + KGA: bishop's gambit, Chigorin's attack (Gifford variation) + + Santasiere's folly + Santasiere's Folly + + Nimzo-Indian: 4.e3 c5, 5.Ne2 (Rubinstein) + Nimzo-Indian: 4.e3 c5, 5.Ne2 (Rubinstein, anti-H\"ubner system) + + Ruy Lopez: closed (8...Na5) + Ruy Lopez: closed (9...Na5) + + All occurences of "defence" to "defense" + All occurences of "manoevre" to "maneuver" + All occurences of "centre" to "center" + +Added: + + Queen's pawn: London system + d2d4 g8f6 c1f4 diff --git a/lasker-2.2.3/data/book/eco000.idx b/lasker-2.2.3/data/book/eco000.idx new file mode 100644 index 0000000..9cfbbea --- /dev/null +++ b/lasker-2.2.3/data/book/eco000.idx @@ -0,0 +1,2008 @@ +1rbq1rk1/1pp1ppbp/p1np1np1/8/2PPP3/2N1BP2/PP1QN1PP/R3KB1R w KQ - +E84 +2kr1b1r/ppp3pp/2n2q2/3npp2/6b1/P2PPN2/1PQNBPPP/R1B1K2R b KQ - +B99* +2kr1b1r/ppp3pp/2n5/3qpp2/6b1/3PPN2/PP2BPPP/R1BQ1RK1 w - - +B65* +2kr1b1r/pppq1ppp/2n5/3np3/6b1/P1NPPN2/1P1B1PPP/R2QKB1R b KQ - +B67* +2kr1b1r/pppq2pp/2n2n2/4pp2/1P6/P1NPPb2/3BBPPP/R2QK2R w KQ - +B69* +2kr1b1r/pppq2pp/2n5/3npp2/6b1/2NPPN2/PP2BPPP/R1BQ1RK1 w - - +B64* +2kr1b1r/pppq2pp/2n5/3npp2/6b1/P1NPPN2/1P1BBPPP/R2QK2R b KQ - +B68* +2kr3r/pppq2p1/1bn1bp2/3np2p/Q7/2NP1NP1/PP1BPPBP/R1R3K1 w - - +B79* +2kr3r/pppq2pp/2n1bp2/2bnp3/8/2NP1NP1/PP1BPPBP/R2Q1RK1 w - - +B78* +2r1kb1r/ppq2ppp/2n1pn2/2pp4/3P2b1/2P1PN2/PP1NBPPP/R1BQ1RK1 w k - +D64* +2r1kb1r/ppq2ppp/2n1pn2/3p4/3p2b1/P1P1PN2/1P1NBPPP/R1BQ1RK1 w k - +D65* +2rqk2r/pp3ppp/2n1pn2/2bp4/3N2b1/2P1P3/PP1NBPPP/R1BQ1RK1 b k - +D67* +2rqk2r/pp3ppp/2nbpn2/2pp4/3P2b1/2P1PN2/PP1NBPPP/R1BQ1RK1 w k - +D66* +2rqkb1r/pp3ppp/2n1pn2/2pp4/3P2b1/4PN2/PPPNBPPP/R1BQ1RK1 w k - +D63* +2rqkbnr/pp3ppp/2n1p3/2pp4/3P2b1/4PN2/PPP1BPPP/RNBQ1RK1 w k - +D54* +3q1rk1/pp3ppp/2r1p3/2b5/4Q3/2P5/PP3PPP/R1B2RK1 b - - +D69* +3q1rk1/pp3ppp/2r1pn2/2bp4/4P3/2P5/PP1NQPPP/R1B2RK1 b - - +D68* +r1b1k2r/1pqnbppp/p2ppn2/6B1/3NPP2/2N2Q2/PPP3PP/2KR1B1R w kq - +B99 +r1b1kb1r/1pq2ppp/p1nppn2/8/3NPP2/2N5/PPP1B1PP/R1BQ1RK1 w kq - +B85 +r1b1kb1r/pp2pppp/1qn2n2/2pp4/3P4/5NP1/PPP1PPBP/RNBQK2R w KQkq - +D96* +r1b1kb1r/pp3ppp/1qn1pn2/2pp4/3P4/5NP1/PPP1PPBP/RNBQ1RK1 w kq - +D95* +r1b1kb1r/pp3ppp/2n2n2/2qpp1B1/8/5NP1/PPP1PPBP/RN1Q1RK1 b kq - +D98* +r1b1kb1r/pp3ppp/2n2n2/2qpp3/8/5NP1/PPP1PPBP/RNBQ1RK1 w kq - +D97* +r1b1kbnr/1pq1pppp/p1n5/1Bpp4/3P4/4PN2/PPP2PPP/RNBQK2R w KQkq - +E36* +r1b1kbnr/1pq1pppp/p7/2ppN3/3P4/4P3/PPP2PPP/RNBQK2R w KQkq - +E37* +r1b1kbnr/1pqp1ppp/p1n1p3/8/3NP3/2N1B3/PPP1BPPP/R2QK2R b KQkq - +B49 +r1b1kbnr/pp2pppp/1qn5/1Bp5/2p5/2N1PN2/PP1P1PPP/R1BQK2R b KQkq - +E23* +r1b1kbnr/pp2pppp/1qn5/1Bpp4/8/4PN2/PPPP1PPP/RNBQK2R w KQkq - +E22* +r1b1kbnr/pp2pppp/1qn5/2pp4/3P4/5NP1/PPP1PP1P/RNBQKB1R w KQkq - +D81* +r1b1kbnr/ppq1pppp/2n5/1B1p4/3P4/5N2/PPP2PPP/RNBQK2R b KQkq - +E35* +r1b1kbnr/ppq1pppp/2n5/1Bp5/2p5/4PN2/PP1P1PPP/RNBQ1RK1 b kq - +E39* +r1b1kbnr/ppq1pppp/2n5/1Bpp4/2P5/4PN2/PP1P1PPP/RNBQK2R b KQkq - +E38* +r1b1kbnr/ppq1pppp/2n5/1Bpp4/3P4/4PN2/PPP2PPP/RNBQK2R b KQkq - +E34* +r1b1kbnr/ppq1pppp/2n5/1Bpp4/8/2N1PN2/PPPP1PPP/R1BQK2R b KQkq - +E33* +r1b1kbnr/ppq1pppp/2n5/1Bpp4/8/4PN2/PPPP1PPP/RNBQK2R w KQkq - +E32* +r1b1kbnr/ppqp1ppp/2n1p3/8/3NP3/2N1B3/PPP2PPP/R2QKB1R b KQkq - +B48 +r1b1kbnr/ppqp1ppp/2n1p3/8/3NP3/2N5/PPP2PPP/R1BQKB1R w KQkq - +B47 +r1b2rk1/1p2qppp/2n1pn2/pBbp4/5B2/2P1PN2/PP3PPP/RN1Q1RK1 w - - +D19* +r1b2rk1/2q1bppp/p1np1n2/1pp1p3/3PP3/2P2N1P/PPBN1PP1/R1BQR1K1 w - - +C98 +r1b2rk1/2q1bppp/p2p1n2/np2p3/3PP3/5N1P/PPBN1PP1/R1BQR1K1 b - - +C99 +r1b2rk1/2q1bppp/p2p1n2/npp1p3/3PP3/2P2N1P/PPB2PP1/RNBQR1K1 w - - +C97 +r1b2rk1/pp1nqppp/2p5/4p3/2BP4/2R1PN2/PP3PPP/3Q1RK1 w - - +D68 +r1b2rk1/pp2ppbp/2q2np1/2pp4/8/1P2P3/PBPPBPPP/RN1Q1RK1 w - - +E19* +r1b2rk1/pp3ppp/2p5/4q3/2B5/2R1P3/PP3PPP/3Q1RK1 w - - +D69 +r1b2rk1/ppq1ppbp/2n2np1/2pp4/5P2/3PPN2/PPP1B1PP/RNB1QRK1 w - - +A98* +r1b2rk1/ppqnppbp/5np1/2pp4/3P4/2P1PN2/PP1NBPPP/R1BQ1RK1 w - - +E09* +r1bq1rk1/1p1n1pbp/2pp1np1/p3p3/2PPP3/2N2N2/PP3PPP/R1BQRBK1 w - - +E96 +r1bq1rk1/1p1nbppp/p1p1pn2/3P2B1/3P4/2N1PN2/PPQ2PPP/2R1KB1R b K - +D65 +r1bq1rk1/1p1nppbp/2n3p1/p7/2Pp4/P2P1NP1/1P1N1PBP/R1BQR1K1 b - - +A64* +r1bq1rk1/1p2bppp/2n2n2/p3p1B1/2Pp4/P2P1NP1/1P3PBP/RN1Q1RK1 b - - +A75* +r1bq1rk1/1p3ppp/p1n1pn2/1BbP4/8/2N1PN2/PP3PPP/R1BQ1RK1 b - - +E57* +r1bq1rk1/1pp1ppbp/p1np1np1/8/2PP4/2N2NP1/PP2PPBP/R1BQ1RK1 w - - +E63 +r1bq1rk1/2p1bpp1/p1np1n1p/1p2p3/4P3/1BP2N1P/PP1P1PP1/RNBQR1K1 w - - +C93 +r1bq1rk1/2p1bppp/p1n2n2/1p1pp3/4P3/1BP2N2/PP1P1PPP/RNBQR1K1 w - - +C89 +r1bq1rk1/2p1bppp/p1np1n2/1p2p3/3PP3/1BP2N2/PP3PPP/RNBQR1K1 b - - +C91 +r1bq1rk1/2p1bppp/p1np1n2/1p2p3/4P3/1BP2N1P/PP1P1PP1/RNBQR1K1 b - - +C92 +r1bq1rk1/2p1bppp/p1np1n2/1p2p3/4P3/1BP2N2/PP1P1PPP/RNBQR1K1 w - - +C90 +r1bq1rk1/2p1bppp/p2p1n2/np2p3/4P3/2P2N1P/PPBP1PP1/RNBQR1K1 b - - +C96 +r1bq1rk1/5ppp/p1p1pn2/2bp4/2P5/2N1PN2/PP3PPP/R1BQ1RK1 w - - +E59* +r1bq1rk1/5ppp/p1pbpn2/2pp4/2PP4/2N1PN2/PP3PPP/R1BQ1RK1 w - - +E58* +r1bq1rk1/p3ppbp/1pn2np1/2pp4/5P2/3PPN2/PPP1B1PP/RNB1QRK1 w - - +A99* +r1bq1rk1/pp1n1pbp/2pp1np1/4p3/2PPP3/2N2NPP/PP3PB1/R1BQ1RK1 b - - +E69 +r1bq1rk1/pp1n1pbp/3p1np1/2pP4/8/2N2NP1/PP2PPBP/R1BQ1RK1 w - - +A63 +r1bq1rk1/pp1n1ppp/4pn2/2p5/1bBP4/2N1PN2/PP3PPP/R1BQ1RK1 w - - +E55 +r1bq1rk1/pp1nb1pp/2n2p2/4p3/2Pp4/3P1NP1/PPN2PBP/R1BQR1K1 b - - +A79* +r1bq1rk1/pp1nbppp/2n5/4p3/2Pp4/3P1NP1/PP3PBP/RNBQR1K1 w - - +A77* +r1bq1rk1/pp1nbppp/2n5/4p3/2Pp4/N2P1NP1/PP3PBP/R1BQR1K1 b - - +A78* +r1bq1rk1/pp1nbppp/2p1p3/3n2B1/2BP4/2N1PN2/PP3PPP/2RQK2R w K - +D67 +r1bq1rk1/pp1nbppp/2p1pn2/3p2B1/2PP4/2N1PN2/PPQ2PPP/2R1KB1R b K - +D64 +r1bq1rk1/pp1nbppp/2p1pn2/3p2B1/2PP4/2NBPN2/PP3PPP/2RQK2R b K - +D66 +r1bq1rk1/pp1nbppp/2p1pn2/3p4/2PP4/5NP1/PPQNPPBP/R1B2RK1 b - - +E09 +r1bq1rk1/pp1nbppp/4pn2/2Pp2B1/2P5/2N1PN2/PPQ2PPP/R3KB1R b KQ - +D62 +r1bq1rk1/pp1p1ppp/2n1pn2/2p5/2PP4/P1PBP3/5PPP/R1BQK1NR w KQ - +E29 +r1bq1rk1/pp1pppbp/2n2np1/2p5/2PP4/2N2NP1/PP2PPBP/R1BQ1RK1 b - - +A39 +r1bq1rk1/pp2bppp/2n2n2/2ppp3/4P3/2NP1NP1/PPP2PBP/R1BQ1RK1 b - - +E97* +r1bq1rk1/pp2bppp/2n2n2/2ppp3/4P3/3P1NP1/PPP2PBP/RNBQ1RK1 w - - +E94* +r1bq1rk1/pp2bppp/2n2n2/4p3/2Pp4/3P1NP1/PP3PBP/RNBQ1RK1 w - - +A73* +r1bq1rk1/pp2bppp/2n2n2/4p3/2Pp4/3P1NP1/PP3PBP/RNBQR1K1 b - - +A76* +r1bq1rk1/pp2bppp/2n2n2/4p3/2Pp4/P2P1NP1/1P3PBP/RNBQ1RK1 b - - +A74* +r1bq1rk1/pp2bppp/2nppn2/6B1/3NPP2/2N5/PPPQ2PP/2KR1B1R b - - +B64 +r1bq1rk1/pp2bppp/3ppn2/6B1/3QPP2/2N5/PPP3PP/2KR1B1R b - - +B65 +r1bq1rk1/pp2ppbp/2n2np1/2p5/2Pp4/2NP1NP1/PP2PPBP/R1BQ1RK1 w - - +E66* +r1bq1rk1/pp2ppbp/2n2np1/2pp4/2P5/2N2NP1/PP1PPPBP/R1BQ1RK1 w - - +A39* +r1bq1rk1/pp2ppbp/2n2np1/2pp4/2P5/3P1NP1/PP2PPBP/RNBQ1RK1 w - - +E65* +r1bq1rk1/pp2ppbp/2n2np1/2pp4/3P1P2/2P1PN2/PP2B1PP/RNBQ1RK1 b - - +A95* +r1bq1rk1/pp2ppbp/2n2np1/2pp4/5P2/2NP1NP1/PPP1P1BP/R1BQ1RK1 b - - +A89* +r1bq1rk1/pp2ppbp/2n2np1/2pp4/5P2/2PP1NP1/PP2P1BP/RNBQ1RK1 b - - +A88* +r1bq1rk1/pp2ppbp/2n2np1/2pp4/5P2/3PPN2/PPP1B1PP/RNB1QRK1 b - - +A97* +r1bq1rk1/pp2ppbp/2n2np1/2pp4/8/1P2PN2/PBPPBPPP/RN1Q1RK1 w - - +E18* +r1bq1rk1/pp2ppbp/2n2np1/2pp4/8/P1NP1NP1/1PP1PPBP/R1BQ1RK1 b - - +E63* +r1bq1rk1/pp2ppbp/2n2np1/8/2Pp4/3P1NP1/PP1N1PBP/R1BQ1RK1 b - - +A63* +r1bq1rk1/pp2ppbp/2n3p1/8/2BPP3/4B3/P3NPPP/R2Q1RK1 b - - +D88 +r1bq1rk1/pp2ppbp/2np1np1/2pP4/2P5/2N2NP1/PP2PPBP/R1BQ1RK1 b - - +E66 +r1bq1rk1/pp2ppbp/2np1np1/8/2BNP3/2N1BP2/PPPQ2PP/R3K2R b KQ - +B77 +r1bq1rk1/pp2ppbp/2np1np1/8/2PNPP2/2N1B3/PP2B1PP/R2QK2R b KQ - +E79 +r1bq1rk1/pp2ppbp/2np1np1/8/4P3/1NN1B3/PPP1BPPP/R2Q1RK1 b - - +B74 +r1bq1rk1/pp3pb1/2n2npp/2ppp3/4P3/2PP1NP1/PP1N1PBP/R1BQ1RK1 w - - +E69* +r1bq1rk1/pp3pbp/2n2np1/2ppp3/4P3/3P1NP1/PPPN1PBP/R1BQ1RK1 w - - +E68* +r1bq1rk1/pp3ppp/2n1pn2/1Bbp4/2P5/4PN2/PP1N1PPP/R1BQ1RK1 b - - +E55* +r1bq1rk1/pp3ppp/2n1pn2/1Bbp4/2P5/4PN2/PP3PPP/RNBQ1RK1 w - - +E54* +r1bq1rk1/pp3ppp/2n1pn2/2p5/2BP4/P1P1PN2/5PPP/R1BQ1RK1 b - - +E59 +r1bq1rk1/pp3ppp/2n1pn2/2pp4/1bPP4/2NBPN2/PP3PPP/R1BQ1RK1 w - - +E56 +r1bq1rk1/pp3ppp/2n1pn2/2pp4/2PP4/P1PBPN2/5PPP/R1BQ1RK1 b - - +E58 +r1bq1rk1/pp3ppp/2n1pn2/8/1bBp4/P1N1PN2/1P3PPP/R1BQ1RK1 w - - +E57 +r1bq1rk1/pp3ppp/2nbpn2/1Bpp4/2PP4/2N1PN2/PP3PPP/R1BQ1RK1 b - - +E56* +r1bq1rk1/ppp1b1pp/2n5/3npp2/8/P1NPPN2/1PQ2PPP/R1B1KB1R b KQ - +B85* +r1bq1rk1/ppp1npbp/3p1np1/3Pp3/2P1P3/2N5/PP2BPPP/R1BQNRK1 b - - +E98 +r1bq1rk1/ppp1p1bp/2np1np1/5p2/2PP4/2N2NP1/PP2PPBP/R1BQ1RK1 w - - +A89 +r1bq1rk1/ppp1ppbp/2np1np1/8/2PPP3/2N1BP2/PP4PP/R2QKBNR w KQ - +E83 +r1bq1rk1/ppp2pbp/2np1np1/4p3/2PPP3/2N2N2/PP2BPPP/R1BQ1RK1 w - - +E97 +r1bq1rk1/pppn1pbp/3p1np1/3Pp3/2P1P3/2N2N2/PP2BPPP/R1BQK2R w KQ - +E93 +r1bq1rk1/pppn1pbp/3p1np1/4p3/2PPP3/2N2N2/PP2BPPP/R1BQR1K1 b - - +E95 +r1bq1rk1/pppn1pbp/3p1np1/4p3/2PPP3/2N2NP1/PP3PBP/R1BQ1RK1 b - - +E68 +r1bq1rk1/pppnbppp/4pn2/3p2B1/2PP4/2N1PN2/PP3PPP/2RQKB1R b K - +D63 +r1bq1rk1/pppnbppp/4pn2/3p2B1/2PP4/2N1PN2/PP3PPP/R2QKB1R w KQ - +D60 +r1bq1rk1/pppnbppp/4pn2/3p2B1/2PP4/2N1PN2/PPQ2PPP/R3KB1R b KQ - +D61 +r1bq1rk1/pppnbppp/4pn2/3p4/2PP4/5NP1/PP2PPBP/RNBQ1RK1 w - - +E07 +r1bq1rk1/pppnbppp/4pn2/3p4/2PP4/5NP1/PPQ1PPBP/RNB2RK1 b - - +E08 +r1bq1rk1/pppnn1bp/3p2p1/3Ppp2/2P1P3/2N2P2/PP2B1PP/R1BQNRK1 w - - +E99 +r1bq1rk1/pppnppbp/3p1np1/8/2PP4/2N2NP1/PP2PPBP/R1BQK2R w KQ - +E67 +r1bqk1nr/5ppp/p1pbp3/2pp4/2P5/2N1PN2/PP1P1PPP/R1BQ1RK1 b kq - +E29* +r1bqk1nr/5ppp/p1pbp3/2pp4/3P4/4PN2/PPP2PPP/RNBQ1RK1 w kq - +E49* +r1bqk1nr/p4ppp/2p5/2bpp3/8/6P1/PPP1PPBP/RNBQK2R w KQkq - +D86* +r1bqk1nr/pp1pppbp/2n3p1/2p5/2P5/2N2NP1/PP1PPPBP/R1BQK2R b KQkq - +A37 +r1bqk1nr/pp1pppbp/2n3p1/8/2PNP3/4B3/PP3PPP/RN1QKB1R b KQkq - +B38 +r1bqk1nr/pp1pppbp/2n3p1/8/2PNP3/8/PP3PPP/RNBQKB1R w KQkq - +B37 +r1bqk1nr/pp2b1pp/2n5/2pppp2/8/3P1NP1/PPP1PPBP/RNBQ1RK1 w kq - +E77* +r1bqk1nr/pp2bppp/2n5/2ppp3/8/3P1NP1/PPP1PPBP/RNBQK2R w KQkq - +E73* +r1bqk1nr/pp2ppbp/2np2p1/2p5/4P3/2NP2P1/PPP2PBP/R1BQK1NR b KQkq - +A26* +r1bqk1nr/pp2ppbp/2np2p1/2p5/4P3/2NP2P1/PPP2PBP/R1BQK1NR w KQkq - +B25 +r1bqk1nr/pp2ppbp/2np2p1/2p5/4P3/2NPB1P1/PPP2PBP/R2QK1NR b KQkq - +B26 +r1bqk1nr/pp3ppp/2nbp3/1Bpp4/3P4/4PN2/PPP2PPP/RNBQ1RK1 b kq - +E48* +r1bqk1nr/pp3ppp/2nbp3/1Bpp4/8/4PN2/PPPP1PPP/RNBQ1RK1 w kq - +E47* +r1bqk1nr/pp4pp/2n5/4pp2/1bPp4/3P1NP1/PP3PBP/RNBQK2R w KQkq - +A67* +r1bqk1nr/ppp2pbp/2np2p1/4p3/2P5/2NP2P1/PP2PPBP/R1BQK1NR b KQkq - +B25* +r1bqk1nr/ppp2pbp/2np2p1/4p3/2P5/2NP2P1/PP2PPBP/R1BQK1NR w KQkq - +A26 +r1bqk1nr/pppp1ppp/2n5/1Bb1p3/4P3/5N2/PPPP1PPP/RNBQK2R w KQkq - +C64 +r1bqk1nr/pppp1ppp/2n5/2b1N3/4P3/8/PPPP1PPP/RNBQKB1R b KQkq - +C27* +r1bqk1nr/pppp1ppp/2n5/2b1p3/1PB1P3/5N2/P1PP1PPP/RNBQK2R b KQkq - +C51 +r1bqk1nr/pppp1ppp/2n5/2b1p3/2B1P3/2P2N2/PP1P1PPP/RNBQK2R b KQkq - +C53 +r1bqk1nr/pppp1ppp/2n5/2b1p3/4P3/2N2N2/PPPP1PPP/R1BQKB1R b KQkq - +C28* +r1bqk1nr/pppp1ppp/2n5/b3p3/2B1P3/2P2N2/P2P1PPP/RNBQK2R w KQkq - +C52 +r1bqk2r/1pp1bppp/p1np1n2/4p3/B3P3/5N2/PPPP1PPP/RNBQR1K1 w kq - +C87 +r1bqk2r/1pp1bppp/p1p2n2/4p3/4P3/5N2/PPPP1PPP/RNBQ1RK1 w kq - +C85 +r1bqk2r/1pppbppp/p1n2n2/4p3/B3P3/5N2/PPPP1PPP/RNBQ1RK1 w kq - +C84 +r1bqk2r/1pppbppp/p1n2n2/4p3/B3P3/5N2/PPPPQPPP/RNB2RK1 b kq - +C86 +r1bqk2r/2ppbppp/p1n2n2/1p2p3/4P3/1B3N2/PPPP1PPP/RNBQR1K1 b kq - +C88 +r1bqk2r/p3nppp/2p5/2bpp3/2P5/6P1/PP2PPBP/RNBQ1RK1 b kq - +D87* +r1bqk2r/pp1nnppp/3b4/3p4/3Pp3/2N1P3/PP1N1PPP/R1BQKB1R w KQkq - +C06* +r1bqk2r/pp1p1ppp/2n1pn2/2P5/1bP5/1QN5/PP2PPPP/R1B1KBNR w KQkq - +E23 +r1bqk2r/pp1pppbp/2n2np1/2p5/2P5/2N2NP1/PP1PPPBP/R1BQK2R b KQkq - +A38* +r1bqk2r/pp1pppbp/2n2np1/2p5/2P5/2N2NP1/PP1PPPBP/R1BQK2R w KQkq - +A38 +r1bqk2r/pp1pppbp/2n2np1/2p5/2P5/2N3P1/PP1PPPBP/R1BQK1NR w KQkq - +A37* +r1bqk2r/pp1pppbp/2n2np1/8/2BNP3/2N1B3/PPP2PPP/R2QK2R b KQkq - +B35 +r1bqk2r/pp1pppbp/2n3p1/8/2PNP1n1/2N1B3/PP3PPP/R2QKB1R w KQkq - +B39 +r1bqk2r/pp2b1pp/2n2n2/2pppp2/2P5/3P1NP1/PP2PPBP/RNBQ1RK1 w kq - +E78* +r1bqk2r/pp2b1pp/2n2n2/4pp2/2Pp4/3P1NP1/PP3PBP/RNBQR1K1 b kq - +A69* +r1bqk2r/pp2bppp/2n2n2/2p1p3/3pP3/3P1NP1/PPPN1PBP/R1BQ1RK1 b kq - +E93* +r1bqk2r/pp2bppp/2n2n2/2pp4/3P4/2N2NP1/PP2PPBP/R1BQK2R w KQkq - +D34 +r1bqk2r/pp2bppp/2n2n2/2ppp3/4P3/3P1NP1/PPP2PBP/RNBQ1RK1 b kq - +E92* +r1bqk2r/pp2bppp/2n2n2/2ppp3/8/3P1NP1/PPP1PPBP/RNBQ1RK1 w kq - +E91* +r1bqk2r/pp2bppp/2n2n2/4p3/2Pp4/3P1NP1/PP3PBP/RNBQ1RK1 b kq - +A72* +r1bqk2r/pp2bppp/2n2n2/4p3/2Pp4/3P1NP1/PP3PBP/RNBQK2R w KQkq - +A71* +r1bqk2r/pp2ppbp/2n2np1/2pp4/2P5/3P1NP1/PP2PPBP/RNBQ1RK1 b kq - +E64* +r1bqk2r/pp2ppbp/2n2np1/2pp4/8/3P1NP1/PPPNPPBP/R1BQ1RK1 b kq - +E67* +r1bqk2r/pp2ppbp/2n2np1/3p4/2PP4/2N2N2/PP2BPPP/R1BQK2R b KQkq - +D34* +r1bqk2r/pp2ppbp/2n2np1/8/2Pp4/3P1NP1/PP3PBP/RNBQ1RK1 b kq - +A62* +r1bqk2r/pp2ppbp/2np1np1/8/3NP3/2N1B3/PPP1BPPP/R2Q1RK1 b kq - +B73 +r1bqk2r/pp3ppp/2n1pn2/2bp4/8/2P1PN2/PP1N1PPP/R1BQKB1R w KQkq - +D47* +r1bqk2r/pp3ppp/2nbpn2/1Bpp4/2PP4/4PN2/PP3PPP/RNBQ1RK1 b kq - +E53* +r1bqk2r/pp3ppp/2nbpn2/1Bpp4/3P4/1P2PN2/P1P2PPP/RNBQ1RK1 b kq - +E52* +r1bqk2r/pp3ppp/2nbpn2/2pp4/3P4/2P1PN2/PP1N1PPP/R1BQKB1R w KQkq - +D46* +r1bqk2r/pp3ppp/2nbpn2/3p4/1P6/P1P1PN2/3N1PPP/R1BQKB1R b KQkq - +D48* +r1bqk2r/pp3ppp/2nbpn2/3p4/2PN4/2N1P3/PP3PPP/R1BQKB1R w KQkq - +D42* +r1bqk2r/pp3ppp/3b1n2/3P4/1n2p3/P3PN2/3N1PPP/R1BQKB1R w KQkq - +D49* +r1bqk2r/ppp1bppp/1nn5/4p3/4P3/2NP1N2/PP3PPP/R1BQKB1R w KQkq - +B59* +r1bqk2r/ppp1bppp/2n5/3np3/8/2NP1N2/PP2PPPP/R1BQKB1R w KQkq - +B58* +r1bqk2r/ppp1bppp/2n5/3np3/8/3PPN2/PP3PPP/RNBQKB1R w KQkq - +B83* +r1bqk2r/ppp1bppp/2n5/3np3/8/P2P1N2/1P2PPPP/RNBQKB1R w KQkq - +B92* +r1bqk2r/ppp1bppp/2n5/3np3/8/P2PPN2/1P3PPP/RNBQKB1R b KQkq - +B84* +r1bqk2r/ppp2ppp/1bn5/3np3/1P6/P2PPN2/5PPP/RNBQKB1R b KQkq - +B87* +r1bqk2r/ppp2ppp/2n5/2bnp3/8/2NP1N2/PP2PPPP/R1BQKB1R w KQkq - +B57* +r1bqk2r/ppp2ppp/2n5/2bnp3/8/2NPPN2/PP3PPP/R1BQKB1R b KQkq - +B88* +r1bqk2r/ppp2ppp/2n5/2bnp3/8/3PPN2/PP3PPP/RNBQKB1R w KQkq - +B86* +r1bqk2r/pppp1ppp/2n1pn2/8/1bPP4/2N5/PPQ1PPPP/R1B1KBNR w KQkq - +E33 +r1bqk2r/pppp1ppp/2n2n2/1B2p3/1b2P3/2N2N2/PPPP1PPP/R1BQK2R b KQkq - +C49* +r1bqk2r/pppp1ppp/2n2n2/1B2p3/1b2P3/2N2N2/PPPP1PPP/R1BQK2R w KQkq - +C49 +r1bqk2r/pppp1ppp/2n2n2/2b5/2BPP3/5N2/PP3PPP/RNBQK2R b KQkq - +C54 +r1bqk2r/pppp1ppp/2n2n2/4p3/1b2P3/2N2N2/PPPP1PPP/R1BQKB1R w KQkq - +C48* +r1bqkb1r/1p2pppp/2n2n2/p1Pp4/5B2/2P2N2/PP2PPPP/RN1QKB1R b KQkq - +D17* +r1bqkb1r/1p2pppp/2n2n2/p1Pp4/8/2P2N2/PP2PPPP/RNBQKB1R w KQkq - +D16* +r1bqkb1r/1p3ppp/2n1pn2/p1Pp4/5B2/2P2N2/PP2PPPP/RN1QKB1R w KQkq - +D18* +r1bqkb1r/1p3ppp/p1nppn2/6B1/3NP3/2N5/PPPQ1PPP/R3KB1R w KQkq - +B66 +r1bqkb1r/1pp2ppp/p1np1n2/4p3/B3P3/5N2/PPPP1PPP/RNBQ1RK1 w kq - +C79 +r1bqkb1r/1ppp1ppp/p1n2n2/4p3/B3P3/5N2/PPPP1PPP/RNBQ1RK1 b kq - +C78 +r1bqkb1r/1ppp1ppp/p1n2n2/4p3/B3P3/5N2/PPPP1PPP/RNBQK2R w KQkq - +C77 +r1bqkb1r/1ppp1ppp/p1n5/4p3/B3n3/5N2/PPPP1PPP/RNBQ1RK1 w kq - +C80 +r1bqkb1r/3n1ppp/p1p1pn2/1p6/3P4/2NBPN2/PP3PPP/R1BQK2R w KQkq - +D48 +r1bqkb1r/3n1ppp/p3pn2/1N2P3/3p4/3B1N2/PP3PPP/R1BQK2R b KQkq - +D49 +r1bqkb1r/p4pp1/2p2n1p/n3p1N1/8/8/PPPPBPPP/RNBQK2R w KQkq - +C59 +r1bqkb1r/pp1n1ppp/2n1p3/3pP3/3P4/3B4/PP1NNPPP/R1BQK2R b KQkq - +C06 +r1bqkb1r/pp1n1ppp/2p1pn2/3p2B1/2PP4/2N1PN2/PP3PPP/R2QKB1R b KQkq - +D52 +r1bqkb1r/pp1n1ppp/2p1pn2/3p4/2PP4/2NBPN2/PP3PPP/R1BQK2R b KQkq - +D46 +r1bqkb1r/pp1n1ppp/2p1pn2/8/2BP4/2N1PN2/PP3PPP/R1BQK2R b KQkq - +D47 +r1bqkb1r/pp1p1ppp/2n1pn2/8/2PN4/2N5/PP2PPPP/R1BQKB1R w KQkq - +A33 +r1bqkb1r/pp1ppp1p/2n2np1/2p5/4P3/2N2N2/PPPP1PPP/R1BQKB1R w KQkq - +A29* +r1bqkb1r/pp1ppppp/2n2n2/2p5/4P3/2N2N2/PPPP1PPP/R1BQKB1R b KQkq - +A28* +r1bqkb1r/pp1ppppp/2n2n2/2p5/4P3/2N5/PPPP1PPP/R1BQKBNR w KQkq - +A27* +r1bqkb1r/pp2nppp/2n1p3/1Bpp4/2P5/4PN2/PP1P1PPP/RNBQK2R w KQkq - +E42* +r1bqkb1r/pp2nppp/2n1p3/1Bpp4/8/1P2PN2/P1PP1PPP/RNBQK2R w KQkq - +E44* +r1bqkb1r/pp2nppp/2n1p3/1Bpp4/8/BP2PN2/P1PP1PPP/RN1QK2R b KQkq - +E45* +r1bqkb1r/pp2pp1p/2n2np1/2pp4/8/3P1NP1/PPP1PPBP/RNBQK2R w KQkq - +E62* +r1bqkb1r/pp2pp1p/2n2np1/3p4/2PP4/2N5/PP3PPP/R1BQKBNR w KQkq - +D33* +r1bqkb1r/pp2pppp/2n2n2/1Bpp4/3P4/4PN2/PPP2PPP/RNBQK2R b KQkq - +D38* +r1bqkb1r/pp2pppp/2n2n2/1Bpp4/8/4PN2/PPPP1PPP/RNBQK2R w KQkq - +E21* +r1bqkb1r/pp2pppp/2n2n2/2Pp4/8/5N2/PPP1PPPP/RNBQKB1R w KQkq - +D24* +r1bqkb1r/pp2pppp/2n2n2/2pp4/2PP4/4PN2/PP3PPP/RNBQKB1R b KQkq - +D40* +r1bqkb1r/pp2pppp/2n2n2/2pp4/3P4/2P1PN2/PP3PPP/RNBQKB1R b KQkq - +D43* +r1bqkb1r/pp2pppp/2n2n2/2pp4/3P4/2P2N2/PP2PPPP/RNBQKB1R w KQkq - +D15* +r1bqkb1r/pp2pppp/2n2n2/2pp4/3P4/4PN2/PPP2PPP/RNBQKB1R w KQkq - +D37* +r1bqkb1r/pp2pppp/2n2n2/2pp4/3P4/5NP1/PPP1PP1P/RNBQKB1R w KQkq - +D90* +r1bqkb1r/pp2pppp/2n2n2/2pp4/4P3/3P1N2/PPP2PPP/RNBQKB1R w KQkq - +A54* +r1bqkb1r/pp2pppp/2n2n2/3p4/2Pp4/4PN2/PP3PPP/RNBQKB1R w KQkq - +D41* +r1bqkb1r/pp2pppp/2n2n2/8/2Pp4/3P1NP1/PP3P1P/RNBQKB1R b KQkq - +A61* +r1bqkb1r/pp2pppp/2n5/2pn4/8/2N1PN2/PP1P1PPP/R1BQKB1R b KQkq - +A33* +r1bqkb1r/pp2pppp/2np1n2/6B1/3NP3/2N5/PPP2PPP/R2QKB1R b KQkq - +B60 +r1bqkb1r/pp2pppp/2np1n2/8/2BNP3/2N5/PPP2PPP/R1BQK2R b KQkq - +B57 +r1bqkb1r/pp2pppp/2np1n2/8/3NP3/2N5/PPP1BPPP/R1BQK2R b KQkq - +B58 +r1bqkb1r/pp3ppp/2n1p3/2pn4/3P4/2NBPN2/PP3PPP/R1BQK2R b KQkq - +D42 +r1bqkb1r/pp3ppp/2n1pn2/1Bpp4/3P4/4PN2/PPP2PPP/RNBQ1RK1 b kq - +E51* +r1bqkb1r/pp3ppp/2n1pn2/1Bpp4/8/4PN2/PPPP1PPP/RNBQ1RK1 w kq - +E50* +r1bqkb1r/pp3ppp/2n1pn2/2pp4/3P4/2P1PN2/PP3PPP/RNBQKB1R w KQkq - +D45* +r1bqkb1r/pp3ppp/2n1pn2/2pp4/3P4/5NP1/PPP1PPBP/RNBQK2R w KQkq - +D94* +r1bqkb1r/pp3ppp/2n2n2/2ppp3/4P3/3P1N2/PPPN1PPP/R1BQKB1R w KQkq - +A55* +r1bqkb1r/pp3ppp/2n2n2/2ppp3/8/3P1NP1/PPP1PPBP/RNBQK2R w KQkq - +E90* +r1bqkb1r/pp3ppp/2n2n2/4p3/2Pp4/3P1NP1/PP3P1P/RNBQKB1R w KQkq - +A70* +r1bqkb1r/pp3ppp/2np1n2/4p3/4P3/1NN5/PPP1BPPP/R1BQK2R b KQkq - +B59 +r1bqkb1r/pp3ppp/2nppn2/6B1/3NP3/2N5/PPP2PPP/R2QKB1R w KQkq - +B62 +r1bqkb1r/pp3ppp/2nppn2/6B1/3NP3/2N5/PPPQ1PPP/R3KB1R b KQkq - +B63 +r1bqkb1r/pp3ppp/2nppn2/8/2BNP3/2N1B3/PPP2PPP/R2QK2R b KQkq - +B89 +r1bqkb1r/pp3ppp/2nppn2/8/2BNP3/2N5/PPP2PPP/R1BQK2R w KQkq - +B88 +r1bqkb1r/pp4pp/2n2n2/4pp2/2Pp4/3P1NP1/PP3PBP/RNBQ1RK1 b kq - +A68* +r1bqkb1r/ppp2p1p/2n3p1/3np3/8/P2P1N2/1P2PPPP/RNBQKB1R w KQkq - +B91* +r1bqkb1r/ppp2p1p/2n5/3np1p1/8/3PPN2/PP3PPP/RNBQKB1R w KQkq - +B81* +r1bqkb1r/ppp2pp1/5nn1/3p3p/8/2P3BP/PP1NPPP1/R2QKBNR b KQkq - +B19* +r1bqkb1r/ppp2ppp/2n1pn2/3p4/3PP3/5N2/PPPN1PPP/R1BQKB1R w KQkq - +C04 +r1bqkb1r/ppp2ppp/2n2n2/3pp3/4P3/2N2N2/PPPP1PPP/R1BQKB1R w KQkq - +C47* +r1bqkb1r/ppp2ppp/2n2n2/3pp3/8/3P1NP1/PPP1PP1P/RNBQKB1R w KQkq - +B07* +r1bqkb1r/ppp2ppp/2n5/3np3/8/2N1P3/PP1P1PPP/R1BQKBNR w KQkq - +B45* +r1bqkb1r/ppp2ppp/2n5/3np3/8/2N1P3/PPQP1PPP/R1B1KBNR b KQkq - +B47* +r1bqkb1r/ppp2ppp/2n5/3np3/8/3P1N2/PP2PPPP/RNBQKB1R w KQkq - +B56* +r1bqkb1r/ppp2ppp/2n5/3np3/8/3P1NP1/PP2PP1P/RNBQKB1R b KQkq - +B70* +r1bqkb1r/ppp2ppp/2n5/3np3/8/3PPN2/PP3PPP/RNBQKB1R b KQkq - +B80* +r1bqkb1r/ppp2ppp/2n5/3np3/8/P1N1P3/1P1P1PPP/R1BQKBNR b KQkq - +B46* +r1bqkb1r/ppp2ppp/2n5/3np3/8/P2P1N2/1P2PPPP/RNBQKB1R b KQkq - +B90* +r1bqkb1r/ppp2ppp/2n5/3np3/8/P3P3/1P1P1PPP/RNBQKBNR w KQkq - +B43* +r1bqkb1r/ppp2ppp/2np1n2/1B2p3/4P3/5N2/PPPP1PPP/RNBQ1RK1 w kq - +C66 +r1bqkb1r/ppp2ppp/5n2/n2Pp1N1/2B5/8/PPPP1PPP/RNBQK2R w KQkq - +C58 +r1bqkb1r/ppp3pp/2n5/3npp2/8/3P1NP1/PP2PP1P/RNBQKB1R w KQkq - +B71* +r1bqkb1r/ppp3pp/2n5/3npp2/8/3PPN2/PP3PPP/RNBQKB1R w KQkq - +B82* +r1bqkb1r/ppp3pp/2n5/3npp2/8/P2P1N2/1P2PPPP/RNBQKB1R w KQkq - +B93* +r1bqkb1r/pppn1ppp/3p1n2/4p3/2PPP3/2N2N2/PP3PPP/R1BQKB1R b KQkq - +A55 +r1bqkb1r/pppn1ppp/4pn2/3p2B1/2PP4/2N5/PP2PPPP/R2QKBNR w KQkq - +D51 +r1bqkb1r/pppn1ppp/4pn2/8/2QP4/6P1/PP2PPBP/RNB1K1NR b KQkq - +E03 +r1bqkb1r/pppn1ppp/5n2/3p4/2PP4/2N5/PP3PPP/R1BQKBNR b KQkq - +C09* +r1bqkb1r/pppn1ppp/5n2/3pp3/3P4/2N1PN2/PPP2PPP/R1BQKB1R b KQkq - +C04* +r1bqkb1r/pppp1ppp/2n2n2/1B2p3/4P3/2N2N2/PPPP1PPP/R1BQK2R b KQkq - +C48 +r1bqkb1r/pppp1ppp/2n2n2/1B2p3/4P3/5N2/PPPP1PPP/RNBQK2R w KQkq - +C65 +r1bqkb1r/pppp1ppp/2n2n2/4p1B1/3P4/2P5/PP2PPPP/RN1QKBNR b KQkq - +B11* +r1bqkb1r/pppp1ppp/2n2n2/4p1N1/2B1P3/8/PPPP1PPP/RNBQK2R b KQkq - +C57 +r1bqkb1r/pppp1ppp/2n2n2/4p3/2B1P3/2N5/PPPP1PPP/R1BQK1NR w KQkq - +C28 +r1bqkb1r/pppp1ppp/2n2n2/4p3/2B1P3/5N2/PPPP1PPP/RNBQK2R w KQkq - +C55 +r1bqkb1r/pppp1ppp/2n2n2/4p3/2P5/2N2N2/PP1PPPPP/R1BQKB1R w KQkq - +A28 +r1bqkb1r/pppp1ppp/2n2n2/4p3/2P5/2N2NP1/PP1PPP1P/R1BQKB1R b KQkq - +A29 +r1bqkb1r/pppp1ppp/2n2n2/4p3/3PP3/2N2N2/PPP2PPP/R1BQKB1R b KQkq - +C47 +r1bqkb1r/pppp1ppp/2n2n2/4p3/4P3/2N5/PPPP1PPP/R1BQKBNR w KQkq - +C46* +r1bqkb1r/pppp1ppp/2n5/1B2p3/4n3/5N2/PPPP1PPP/RNBQ1RK1 w kq - +C67 +r1bqkb1r/pppp1ppp/2n5/8/2Bpn3/5N2/PPP2PPP/RNBQ1RK1 w kq - +C56 +r1bqkbnr/1p1p1ppp/p1n1p3/8/3NP3/2N5/PPP2PPP/R1BQKB1R w KQkq - +B46 +r1bqkbnr/1pp2ppp/p1np4/4p3/B3P3/2P2N2/PP1P1PPP/RNBQK2R b KQkq - +C74 +r1bqkbnr/1pp2ppp/p1np4/4p3/B3P3/5N2/PPPP1PPP/RNBQ1RK1 b kq - +C72 +r1bqkbnr/1pp2ppp/p1np4/4p3/B3P3/5N2/PPPP1PPP/RNBQK2R w KQkq - +C71 +r1bqkbnr/1pp2ppp/p1p5/4p3/4P3/5N2/PPPP1PPP/RNBQ1RK1 b kq - +C69 +r1bqkbnr/1ppp1ppp/p1B5/4p3/4P3/5N2/PPPP1PPP/RNBQK2R b KQkq - +C68 +r1bqkbnr/1ppp1ppp/p1n5/4p3/B3P3/5N2/PPPP1PPP/RNBQK2R b KQkq - +C70 +r1bqkbnr/2p2ppp/p1p5/3p4/2PPp3/4P3/PP2NPPP/RNBQK2R b KQkq - +C19* +r1bqkbnr/2p2ppp/p1p5/3p4/2PPp3/4P3/PP3PPP/RNBQK1NR w KQkq - +C18* +r1bqkbnr/2p2ppp/p1pp4/4p3/3PP3/5N2/PPP2PPP/RNBQK2R b KQkq - +C73 +r1bqkbnr/4p1pp/p1p2p2/3p4/2Pp4/4PN2/PP3PPP/RNBQK2R w KQkq - +E25* +r1bqkbnr/4pppp/p1p5/2pp4/8/4PN2/PPPP1PPP/RNBQ1RK1 b kq - +E27* +r1bqkbnr/4pppp/p1p5/2pp4/8/4PN2/PPPP1PPP/RNBQK2R w KQkq - +E24* +r1bqkbnr/5ppp/p1p1p3/2pp4/2P5/4PN2/PP1P1PPP/RNBQK2R w KQkq - +E26* +r1bqkbnr/5ppp/p1p1p3/2pp4/8/4PN2/PPPP1PPP/RNBQ1RK1 w kq - +E28* +r1bqkbnr/pp1npppp/2p5/8/3PN3/8/PPP2PPP/R1BQKBNR w KQkq - +B17 +r1bqkbnr/pp1p1ppp/2n1p3/8/3NP3/2N5/PPP2PPP/R1BQKB1R b KQkq - +B45 +r1bqkbnr/pp1p1ppp/2n1p3/8/3NP3/8/PPP2PPP/RNBQKB1R w KQkq - +B44 +r1bqkbnr/pp1p1ppp/2n5/2p1p3/2P5/4PN2/PP1P1PPP/RNBQKB1R b KQkq - +A19* +r1bqkbnr/pp1p1ppp/2n5/2p1p3/8/4PN2/PPPP1PPP/RNBQKB1R w KQkq - +A18* +r1bqkbnr/pp1ppp1p/2n3p1/1Bp5/4P3/5N2/PPPP1PPP/RNBQK2R w KQkq - +B31 +r1bqkbnr/pp1ppp1p/2n3p1/2p5/2P5/2N5/PP1PPPPP/R1BQKBNR w KQkq - +A36* +r1bqkbnr/pp1ppp1p/2n3p1/2p5/4P3/2P2N2/PP1P1PPP/RNBQKB1R b KQkq - +A23* +r1bqkbnr/pp1ppp1p/2n3p1/2p5/4P3/5NP1/PPPP1P1P/RNBQKB1R b KQkq - +A24* +r1bqkbnr/pp1ppp1p/2n3p1/8/2PNP3/8/PP3PPP/RNBQKB1R b KQkq - +B36 +r1bqkbnr/pp1ppp1p/2n3p1/8/3NP3/8/PPP2PPP/RNBQKB1R w KQkq - +B34 +r1bqkbnr/pp1ppppp/2n5/2p5/2P5/2N3P1/PP1PPP1P/R1BQKBNR b KQkq - +A36 +r1bqkbnr/pp1ppppp/2n5/2p5/2P5/2N5/PP1PPPPP/R1BQKBNR b KQkq - +A35* +r1bqkbnr/pp1ppppp/2n5/2p5/2P5/2N5/PP1PPPPP/R1BQKBNR w KQkq - +A35 +r1bqkbnr/pp1ppppp/2n5/2p5/2P5/8/PP1PPPPP/RNBQKBNR w KQkq - +A34* +r1bqkbnr/pp1ppppp/2n5/2p5/3PP3/5N2/PPP2PPP/RNBQKB1R b KQkq - +B32 +r1bqkbnr/pp1ppppp/2n5/2p5/4P3/2N3P1/PPPP1P1P/R1BQKBNR b KQkq - +B24 +r1bqkbnr/pp1ppppp/2n5/2p5/4P3/2N5/PPPP1PPP/R1BQKBNR b KQkq - +A25* +r1bqkbnr/pp1ppppp/2n5/2p5/4P3/5N2/PPPP1PPP/RNBQKB1R b KQkq - +A22* +r1bqkbnr/pp1ppppp/2n5/2p5/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - +B30 +r1bqkbnr/pp1ppppp/2n5/2p5/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +A21* +r1bqkbnr/pp1ppppp/2n5/2p5/8/4PN2/PPPP1PPP/RNBQKB1R b KQkq - +A17* +r1bqkbnr/pp1ppppp/2n5/2p5/8/5N2/PPPPPPPP/RNBQKB1R w KQkq - +A16* +r1bqkbnr/pp1ppppp/2n5/8/3NP3/8/PPP2PPP/RNBQKB1R b KQkq - +B33 +r1bqkbnr/pp2pppp/2n5/1Bpp4/8/4PN2/PPPP1PPP/RNBQK2R b KQkq - +E20* +r1bqkbnr/pp2pppp/2n5/2pp4/2PP4/4P3/PP3PPP/RNBQKBNR b KQkq - +D32* +r1bqkbnr/pp2pppp/2n5/2pp4/3P4/4P3/PPP2PPP/RNBQKBNR w KQkq - +D31* +r1bqkbnr/pp2pppp/2n5/2pp4/3P4/4PN2/PPP2PPP/RNBQKB1R b KQkq - +D35* +r1bqkbnr/pp2pppp/2n5/2pp4/5P2/5N2/PPPPP1PP/RNBQKB1R w KQkq - +A85* +r1bqkbnr/pp2pppp/2n5/2pp4/8/5NP1/PPPPPP1P/RNBQKB1R w KQkq - +E61* +r1bqkbnr/pp2pppp/2n5/3p4/3N4/6P1/PPP1PP1P/RNBQKB1R b KQkq - +D85* +r1bqkbnr/pp3p1p/2n3p1/2ppp3/8/3P1NP1/PPP1PPBP/RNBQK2R w KQkq - +E72* +r1bqkbnr/pp3pp1/2n4p/2ppp3/8/3P1NP1/PPP1PPBP/RNBQK2R w KQkq - +E71* +r1bqkbnr/pp3ppp/2n1p3/1Bpp4/2P5/4PN2/PP1P1PPP/RNBQK2R b KQkq - +E41* +r1bqkbnr/pp3ppp/2n1p3/1Bpp4/8/1P2PN2/P1PP1PPP/RNBQK2R b KQkq - +E43* +r1bqkbnr/pp3ppp/2n1p3/1Bpp4/8/4PN2/PPPP1PPP/RNBQ1RK1 b kq - +E46* +r1bqkbnr/pp3ppp/2n1p3/1Bpp4/8/4PN2/PPPP1PPP/RNBQK2R w KQkq - +E40* +r1bqkbnr/pp3ppp/2n5/2pp4/3P4/2N2NP1/PP2PP1P/R1BQKB1R b KQkq - +D33 +r1bqkbnr/pp3ppp/2n5/2pp4/3P4/5N2/PP2PPPP/RNBQKB1R w KQkq - +B14* +r1bqkbnr/pp3ppp/2n5/2pp4/3P4/5N2/PPPN1PPP/R1BQKB1R w KQkq - +C09 +r1bqkbnr/pp3ppp/2n5/2ppp3/8/3P2P1/PPP1PPBP/RNBQK1NR w KQkq - +A42* +r1bqkbnr/pp3ppp/2n5/2ppp3/8/5NP1/PPPPPPBP/RNBQK2R w KQkq - +E70* +r1bqkbnr/pp3ppp/2n5/4p3/2Pp4/3P1N2/PP3PPP/RNBQKB1R w KQkq - +A65* +r1bqkbnr/pp3ppp/2n5/4p3/2Pp4/B2P1N2/4PPPP/RN1QKB1R w KQkq - +A59* +r1bqkbnr/pp4pp/2n2p2/2ppp3/8/3P1NP1/PPP1PPBP/RNBQ1RK1 b kq - +E81* +r1bqkbnr/pp4pp/2n2p2/2ppp3/8/3P1NP1/PPP1PPBP/RNBQK2R w KQkq - +E80* +r1bqkbnr/pp4pp/2n5/2pppp2/8/3P1NP1/PPP1PPBP/RNBQK2R w KQkq - +E76* +r1bqkbnr/pp4pp/2n5/4pp2/2Pp4/3P1NP1/PP3P1P/RNBQKB1R w KQkq - +A66* +r1bqkbnr/ppp1pppp/2n5/3p4/2PP4/8/PP2PPPP/RNBQKBNR w KQkq - +D07 +r1bqkbnr/ppp2ppp/2n5/1B1p4/2PPp3/4P3/PP3PPP/RNBQK1NR b KQkq - +C17* +r1bqkbnr/ppp2ppp/2n5/1B1p4/3Pp3/4P3/PPP2PPP/RNBQK1NR w KQkq - +C16* +r1bqkbnr/ppp2ppp/2n5/1B1pp3/3P4/4P3/PPP2PPP/RNBQK1NR b KQkq - +C15* +r1bqkbnr/ppp2ppp/2n5/3pp3/3P4/2P5/PP2PPPP/RNBQKBNR w KQkq - +B15* +r1bqkbnr/ppp2ppp/2n5/3pp3/3P4/4P3/PPP2PPP/RNBQKBNR w KQkq - +C10* +r1bqkbnr/ppp2ppp/2n5/3pp3/3P4/4PN2/PPP2PPP/RNBQKB1R b KQkq - +C11* +r1bqkbnr/ppp2ppp/2n5/4P3/2Pp4/5NP1/PP2PP1P/RNBQKB1R b KQkq - +D09 +r1bqkbnr/ppp2ppp/2np4/1B2p3/4P3/5N2/PPPP1PPP/RNBQK2R w KQkq - +C62 +r1bqkbnr/ppp2ppp/8/3p4/8/2P2P2/PP2PP1P/RNBQKB1R b KQkq - +B16* +r1bqkbnr/ppp2ppp/8/3pn3/5B2/2P5/PP2PPPP/RN1QKBNR b KQkq - +B18* +r1bqkbnr/ppp2ppp/8/3pn3/8/2P5/PP1NPPPP/R1BQKBNR b KQkq - +B17* +r1bqkbnr/ppp3pp/2n5/3ppp2/8/3P1NP1/PPP1PP1P/RNBQKB1R w KQkq - +B08* +r1bqkbnr/pppn1ppp/8/3p4/2PP4/8/PP3PPP/RNBQKBNR b KQkq - +C08* +r1bqkbnr/pppn1ppp/8/3pp3/2PP4/4P3/PP3PPP/RNBQKBNR b KQkq - +C07* +r1bqkbnr/pppn1ppp/8/3pp3/3P4/4P3/PPP2PPP/RNBQKBNR w KQkq - +C03* +r1bqkbnr/pppn1ppp/8/3pp3/3P4/4PN2/PPP2PPP/RNBQKB1R b KQkq - +C05* +r1bqkbnr/pppp1p1p/2n3p1/4p3/2P5/2N5/PP1PPPPP/R1BQKBNR w KQkq - +B24* +r1bqkbnr/pppp1ppp/2n5/1B2p3/4P3/5N2/PPPP1PPP/RNBQK2R b KQkq - +C60 +r1bqkbnr/pppp1ppp/2n5/4p3/2B1P3/5N2/PPPP1PPP/RNBQK2R b KQkq - +C50 +r1bqkbnr/pppp1ppp/2n5/4p3/2P5/2N2N2/PP1PPPPP/R1BQKB1R b KQkq - +A27 +r1bqkbnr/pppp1ppp/2n5/4p3/2P5/2N5/PP1PPPPP/R1BQKBNR w KQkq - +A25 +r1bqkbnr/pppp1ppp/2n5/4p3/2P5/8/PP1PPPPP/RNBQKBNR w KQkq - +B23* +r1bqkbnr/pppp1ppp/2n5/4p3/4P3/2N2N2/PPPP1PPP/R1BQKB1R b KQkq - +C46 +r1bqkbnr/pppp1ppp/2n5/4p3/4P3/5N2/PPPP1PPP/RNBQKB1R b KQkq - +C26* +r1bqkbnr/pppp1ppp/2n5/4p3/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - +C44 +r1bqkbnr/pppp1ppp/2n5/4p3/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +C25* +r1bqkbnr/pppp1ppp/2n5/8/3NP3/8/PPP2PPP/RNBQKB1R b KQkq - +C45 +r1bqkbnr/pppp1ppp/2n5/8/3QP3/8/PPP2PPP/RNB1KBNR w KQkq - +C22 +r1bqkbnr/pppp1ppp/8/1B2p3/3nP3/5N2/PPPP1PPP/RNBQK2R w KQkq - +C61 +r1bqkbnr/pppp2pp/2n5/1B2pp2/4P3/5N2/PPPP1PPP/RNBQK2R w KQkq - +C63 +r1bqkbnr/pppp2pp/2n5/4pp2/3PP3/5N2/PPP2PPP/RNBQKB1R b KQkq - +C29* +r1bqnrk1/pp2b1pp/2n2p2/2p1p3/3pPP2/3P2P1/PPPNN1BP/R1BQ1RK1 b - - +E99* +r1bqnrk1/pp2bppp/2n5/2p1p3/3pP3/3P1NP1/PPP1NPBP/R1BQ1RK1 w - - +E98* +r1bqr1k1/1p1n1pbp/p2p1np1/2pP4/P7/2N3P1/1P1NPPBP/R1BQ1RK1 w - - +A64 +r1bqr1k1/pp2bppp/2n2n2/2ppp3/4P3/3P1NP1/PPPN1PBP/R1BQ1RK1 w - - +E95* +r1bqr1k1/pp3pbp/n2p1np1/2pP4/4P3/2N5/PP1NBPPP/R1BQ1RK1 w - - +A78 +r1bqr1k1/ppbn1pp1/2p2n1p/3pp3/1PP1P3/P1NP1N2/2Q1BPPP/R1B2RK1 b - - +C98* +r1bqr1k1/ppbn1pp1/5n1p/3pp3/NP2P3/P2P1N2/2Q1BPPP/R1B2RK1 w - - +C99* +r1bqr1k1/ppn2pbp/3p1np1/2pP4/4P3/2N2P2/PP1NB1PP/R1BQ1RK1 w - - +A79 +r1bqrbk1/pp3ppp/2n2n2/2ppp3/P3P3/2PP1NP1/1P1N1PBP/R1BQ1RK1 b - - +E96* +r1r3k1/pp1bppbp/2np1np1/q7/3NP2P/1BN1BP2/PPPQ2P1/2KR3R b - - +B79 +r2q1rk1/p3n1pp/3bbp2/3pp1B1/N7/6P1/PP2PPBP/R2Q1RK1 w - - +D89* +r2q1rk1/p3nppp/4b3/2bpp3/8/2N3P1/PP2PPBP/R1BQ1RK1 w - - +D88* +r2q1rk1/pp1bppbp/2np1np1/8/2BNP3/2N1BP2/PPPQ2PP/2KR3R b - - +B78 +r2q1rk1/pp2ppbp/6p1/n7/3PP1b1/3BBP2/P3N1PP/R2Q1RK1 b - - +D89 +r2q1rk1/ppp1bppp/1nn1b3/4p3/8/2NP1NP1/PP2PPBP/R1BQ1RK1 w - - +B74* +r2q1rk1/ppp1bppp/2n1b3/3np3/8/2NP1NP1/PP2PPBP/R1BQK2R w KQ - +B73* +r2qk1nr/pp2bppp/2n5/2p1p3/2Pp2b1/3PPNP1/PP3PBP/RNBQ1RK1 b kq - +E75* +r2qk1nr/pp2bppp/2n5/2ppp3/2P3b1/3P1NP1/PP2PPBP/RNBQ1RK1 b kq - +E74* +r2qk1nr/ppp2pbp/2npb1p1/4p3/2P5/2NP2P1/PP2PPBP/R1BQK1NR w KQkq - +B26* +r2qk2r/1p1bbppp/p1nppn2/6B1/3NPP2/2N5/PPPQ2PP/2KR1B1R w kq - +B68 +r2qk2r/2p1bppp/p1n1b3/1p1pP3/4n3/1BP2N2/PP3PPP/RNBQ1RK1 w kq - +C83 +r2qk2r/3bbppp/p1nppB2/1p6/4PP2/2N2N2/PPPQ2PP/2KR1B1R b kq - +B69 +r2qk2r/pp2b1pp/2n1b3/2pnpp2/8/2NP1NP1/PP2PPBP/R1BQ1RK1 w kq - +E79* +r2qk2r/ppp1bppp/2n1b3/3np3/8/P1N1P3/1PQP1PPP/R1B1KBNR w KQkq - +B49* +r2qk2r/ppp2ppp/2n1b3/2bnp3/8/2N2NP1/PP1PPPBP/R1BQK2R w KQkq - +B35* +r2qk2r/ppp2ppp/2n1b3/2bnp3/8/2NPPN2/PP3PPP/R1BQKB1R w KQkq - +B89* +r2qkb1r/1p1b1ppp/p1nppn2/6B1/3NP3/2N5/PPPQ1PPP/2KR1B1R w kq - +B67 +r2qkb1r/2p2ppp/p1n1b3/1p1pP3/4n3/1B3N2/PPP1QPPP/RNB2RK1 b kq - +C81 +r2qkb1r/2p2ppp/p1n1b3/1p1pP3/4n3/1BP2N2/PP3PPP/RNBQ1RK1 b kq - +C82 +r2qkb1r/p4ppp/2p1pn2/3p4/3p4/4P2P/PPP1QPP1/RNB2RK1 w kq - +D57* +r2qkb1r/pp1bpppp/2np1n2/6B1/3NP3/2N5/PPPQ1PPP/R3KB1R b KQkq - +B61 +r2qkb1r/pp2n1pp/2n1bp2/2p1p3/3PP3/3P1NP1/PP3PBP/RNBQ1RK1 b kq - +E89* +r2qkb1r/pp2n1pp/2n1bp2/2ppp3/4P3/2PP1NP1/PP3PBP/RNBQ1RK1 b kq - +E86* +r2qkb1r/pp2pppp/2n2n2/1BPp4/6b1/4PN2/PPP2PPP/RNBQK2R b KQkq - +D39* +r2qkb1r/pp2pppp/2n2n2/1Bpp3b/8/1P2PN1P/PBPP1PP1/RN1QK2R b KQkq - +E13* +r2qkb1r/pp2pppp/2n2n2/2Pp4/6b1/2P1PN2/PP3PPP/RNBQKB1R b KQkq - +D44* +r2qkb1r/pp2pppp/2n2n2/2pp1b2/3P4/5NP1/PPP1PPBP/RNBQK2R w KQkq - +D92* +r2qkb1r/pp2pppp/2n2n2/2pp4/3P2b1/5NP1/PPP1PPBP/RNBQK2R w KQkq - +D91* +r2qkb1r/pp3ppp/2n1b3/2pnp1N1/8/2N3P1/PP1PPPBP/R1BQK2R b KQkq - +B39* +r2qkb1r/pp3ppp/2n1pn2/2pp1b2/3P4/5NP1/PPP1PPBP/RNBQ1RK1 w kq - +D93* +r2qkb1r/pp3ppp/2n1pn2/2pp3b/3P4/1P2PN1P/P1P1BPP1/RNBQ1RK1 b kq - +D58* +r2qkb1r/pp3ppp/2n1pn2/2pp3b/3P4/4PN1P/PPP1BPP1/RNBQ1RK1 w kq - +D56* +r2qkb1r/pp3ppp/2n1pn2/2pp4/3P2b1/2P1PN2/PP1N1PPP/R1BQKB1R w KQkq - +D52* +r2qkb1r/pp3ppp/2n1pn2/2pp4/3P2b1/4PN2/PPP1BPPP/RNBQ1RK1 w kq - +D55* +r2qkb1r/pp3ppp/2n1pn2/2pp4/3P2b1/4PN2/PPPNBPPP/R1BQ1RK1 b kq - +D60* +r2qkb1r/pp3ppp/2n1pn2/3p3b/3N4/1P2P2P/P1P1BPP1/RNBQ1RK1 b kq - +D59* +r2qkb1r/ppp2ppp/2n1b3/3np3/8/2N1P3/PPQP1PPP/R1B1KBNR w KQkq - +B48* +r2qkb1r/ppp2ppp/2n1b3/3np3/8/3P1NP1/PP2PP1P/RNBQKB1R w KQkq - +B72* +r2qkb1r/ppp2ppp/2n5/3np3/6b1/2NP1N2/PP2PPPP/R1BQKB1R w KQkq - +B60* +r2qkb1r/ppp2ppp/2n5/3np3/6b1/2NPPN2/PP3PPP/R1BQKB1R b KQkq - +B62* +r2qkb1r/ppp2ppp/2n5/3np3/6b1/P2P1N2/1P2PPPP/RNBQKB1R w KQkq - +B94* +r2qkb1r/ppp2ppp/2n5/3np3/6b1/P2PPN2/1P3PPP/RNBQKB1R b KQkq - +B95* +r2qkb1r/ppp3pp/2n1bp2/3np3/8/3P1NP1/PP2PPBP/RNBQ1RK1 b kq - +B76* +r2qkb1r/ppp3pp/2n1bp2/3np3/8/3P1NP1/PP2PPBP/RNBQK2R w KQkq - +B75* +r2qkb1r/ppp3pp/2n5/3npp2/6b1/P2PPN2/1P2BPPP/RNBQK2R b KQkq - +B98* +r2qkb1r/ppp3pp/2n5/3npp2/6b1/P2PPN2/1P3PPP/RNBQKB1R w KQkq - +B96* +r2qkb1r/ppp3pp/2n5/3npp2/6b1/PQ1PPN2/1P3PPP/RNB1KB1R b KQkq - +B97* +r2qkbnr/1ppb1p1p/p1np2p1/4p3/B2PP3/2P2N2/PP3PPP/RNBQK2R w KQkq - +C76 +r2qkbnr/1ppb1ppp/p1np4/4p3/B3P3/2P2N2/PP1P1PPP/RNBQK2R w KQkq - +C75 +r2qkbnr/pp1nppp1/2p3bp/8/3P3P/5NN1/PPP2PP1/R1BQKB1R w KQkq - +B19 +r2qkbnr/pp2pppp/2n5/1Bp4b/2Pp4/3PPN1P/PP3PP1/RNBQK2R b KQkq - +E31* +r2qkbnr/pp2pppp/2n5/1Bpp4/6b1/4PN2/PPPP1PPP/RNBQK2R w KQkq - +E30* +r2qkbnr/pp2pppp/2n5/2pp1b2/3P4/5NP1/PPP1PP1P/RNBQKB1R w KQkq - +D82* +r2qkbnr/pp2pppp/2n5/2pp4/3P2b1/4PN2/PPP1BPPP/RNBQK2R b KQkq - +D53* +r2qkbnr/pp2pppp/2n5/2pp4/3P2b1/4PN2/PPP2PPP/RNBQKB1R w KQkq - +D50* +r2qkbnr/pp2pppp/2n5/2pp4/3P2b1/4PN2/PPPN1PPP/R1BQKB1R b KQkq - +D51* +r2qkbnr/pp2pppp/2n5/2pp4/3P2b1/5NP1/PPP1PP1P/RNBQKB1R w KQkq - +D80* +r2qkbnr/pp3ppp/2n1p3/2pp1b2/3P4/5NP1/PPP1PPBP/RNBQ1RK1 b kq - +D83* +r2qkbnr/pp3ppp/4p3/3p4/3Q4/6P1/PPb1PPBP/RNB2RK1 w kq - +D84* +r2qkbnr/pp4pp/2n1bp2/2p1p3/3pP3/2PP1NP1/PP3PBP/RNBQ1RK1 b kq - +E88* +r2qkbnr/pp4pp/2n1bp2/2p1p3/3pP3/3P1NP1/PPP2PBP/RNBQ1RK1 w kq - +E87* +r2qkbnr/pp4pp/2n1bp2/2ppp3/4P3/3P1NP1/PPP2PBP/RNBQ1RK1 b kq - +E85* +r2qkbnr/pp4pp/2n1bp2/2ppp3/8/1P1P1NP1/P1P1PPBP/RNBQ1RK1 b kq - +E82* +r2qkbnr/pp4pp/2n1bp2/2ppp3/8/2NP1NP1/PPP1PPBP/R1BQ1RK1 b kq - +E83* +r2qkbnr/ppp1pppp/2n5/3p4/3P2b1/5N2/PPP1PPPP/RNBQKB1R w KQkq - +D01* +r2qkbnr/ppp2ppp/2n5/1B1pp3/3P2b1/4PN2/PPP2PPP/RNBQK2R b KQkq - +C12* +r2qkbnr/ppp2ppp/2n5/3p4/3Pp3/4P3/PPPNQPPP/RNB1K2R b KQkq - +C14* +r2qkbnr/ppp2ppp/2n5/3pP3/6b1/5N2/PPPPP1PP/RNBQKB1R w KQkq - +A83* +r2qkbnr/ppp2ppp/2n5/3pp3/3P2b1/4PN2/PPP1BPPP/RNBQK2R b KQkq - +C13* +r3k2r/pppq2pp/2n1bp2/2bnp3/8/2NP1NP1/PP2PPBP/R1BQ1RK1 w kq - +B77* +r3kb1r/pp1qn1pp/2n1bp2/2ppp3/8/P1NP1NP1/1PP1PPBP/1RBQ1RK1 b kq - +E84* +r3kb1r/pp3ppp/1qn1bn2/3pp1B1/8/6P1/PPPNPPBP/RN1Q1RK1 w kq - +D99* +r3kb1r/pppq1ppp/2n5/3np3/6b1/2NP1N2/PP1BPPPP/R2QKB1R w KQkq - +B61* +r3kb1r/pppq1ppp/2n5/3np3/6b1/2NPPN2/PP3PPP/R1BQKB1R w KQkq - +B63* +r3kb1r/pppq1ppp/2n5/3np3/6b1/P1NPPN2/1P3PPP/R1BQKB1R b KQkq - +B66* +r3kb1r/ppq2ppp/2n1pn2/2p5/2pP2b1/4PN2/PP1NBPPP/R1BQ1RK1 w kq - +D62* +r3kb1r/ppq2ppp/2n1pn2/2pp4/3P2b1/4PN2/PPPNBPPP/R1BQ1RK1 w kq - +D61* +r3kbnr/ppq1pppp/2n5/3p4/3P2b1/2P2N2/PP3PPP/RNBQKB1R w KQkq - +D36* +rn1q1rk1/1p3pbp/p2p1np1/2pP4/P3P1b1/2N2N2/1P2BPPP/R1BQ1RK1 w - - +A75 +rn1q1rk1/p3ppbp/bp3np1/2pp4/3P1P2/2P1PN2/PP2B1PP/RNBQ1RK1 w - - +A94* +rn1q1rk1/pbppbppp/1p2p3/8/2PP4/2Q2NP1/PP2PPBP/R1B2RK1 b - - +E19 +rn1q1rk1/pbppbppp/1p2pn2/8/2PP4/2N2NP1/PP2PPBP/R1BQ1RK1 b - - +E18 +rn1q1rk1/pp3ppp/2p1pn2/5b2/PbBP4/2N1PN2/1P2QPPP/R1B2RK1 b - - +D19 +rn1q1rk1/ppp1ppbp/5np1/8/2QPP1b1/2N2N2/PP3PPP/R1B1KB1R w KQ - +D98 +rn1q1rk1/pppnppbp/6p1/8/3PP1b1/1QN1BN2/PP3PPP/R3KB1R b KQ - +D99 +rn1qk2r/p1pp1ppp/bp2pn2/8/1bPP4/2N1P3/PP2NPPP/R1BQKB1R w KQkq - +E45 +rn1qk2r/pbpp1pp1/1p2pn1p/8/1bPP3B/2N2N2/PP2PPPP/R2QKB1R w KQkq - +E13 +rn1qk2r/pbpp1ppp/1p2pn2/8/1bPP4/5NP1/PP2PPBP/RNBQK2R w KQkq - +E16 +rn1qk2r/pbppbppp/1p2pn2/8/2PP4/5NP1/PP2PPBP/RNBQK2R w KQkq - +E17 +rn1qkb1r/1b3ppp/p3pn2/1pp5/3P4/1B2PN2/PP2QPPP/RNB2RK1 w kq - +D29 +rn1qkb1r/4pppp/b2p1n2/2pP4/4P3/2N5/PP3PPP/R1BQKBNR b KQkq - +A59 +rn1qkb1r/pp2pppp/2p2n2/3p1b2/2PP4/4PN2/PP3PPP/RNBQKB1R w KQkq - +D12 +rn1qkb1r/pp2pppp/2p2n2/5b2/P1pP4/2N1PN2/1P3PPP/R1BQKB1R b KQkq - +D18 +rn1qkb1r/pp2pppp/2p2n2/5b2/P1pP4/2N2N2/1P2PPPP/R1BQKB1R w KQkq - +D17 +rn1qkb1r/pp2pppp/5n2/3p1b2/3P1B2/5N2/PP2PPPP/RN1QKB1R b KQkq - +D14* +rn1qkb1r/pp2pppp/5n2/3p1b2/3P1B2/5N2/PP2PPPP/RN1QKB1R w KQkq - +D14 +rn1qkb1r/pp3ppp/4b3/2pnp3/8/2N3P1/PP1PPPBP/R1BQK1NR w KQkq - +B38* +rn1qkb1r/ppp1pppp/3p4/3nP3/3P2b1/5N2/PPP2PPP/RNBQKB1R w KQkq - +B05 +rn1qkb1r/ppp1pppp/5n2/3p4/3P2b1/5N2/PPP1PPPP/RNBQKB1R w KQkq - +D03* +rn1qkbnr/pp1bpppp/3p4/1Bp5/4P3/5N2/PPPP1PPP/RNBQK2R w KQkq - +B52 +rn1qkbnr/pp2pppp/2p5/3p4/4P1b1/2N2N2/PPPP1PPP/R1BQKB1R w KQkq - +B11 +rn1qkbnr/pp2pppp/2p5/5b2/3PN3/8/PPP2PPP/R1BQKBNR w KQkq - +B18 +rnb1k1nr/pp2ppbp/6p1/2qp4/8/4PN2/PPPN1PPP/R1BQKB1R w KQkq - +E03* +rnb1k1nr/pp2ppbp/6p1/q1Pp4/8/4PN2/PPP2PPP/RNBQKB1R w KQkq - +E02* +rnb1k2r/pppnqppp/4p3/3pP3/3P4/2N5/PPP2PPP/R2QKBNR w KQkq - +C14 +rnb1kb1r/1p3ppp/pq1ppn2/6B1/3NPP2/2N5/PPP3PP/R2QKB1R w KQkq - +B97 +rnb1kb1r/ppp2ppp/5n2/3qp3/8/3P4/PP2PPPP/RNBQKBNR w KQkq - +B53* +rnb1kbnr/ppp2ppp/8/3qp3/8/2N5/PPPP1PPP/R1BQKBNR b KQkq - +C22* +rnb1qrk1/ppp1b1pp/3ppn2/5p2/2PP4/1PN2NP1/P3PPBP/R1BQ1RK1 b - - +A99 +rnb1qrk1/ppp1b1pp/3ppn2/5p2/2PP4/2N2NP1/PP2PPBP/R1BQ1RK1 w - - +A97 +rnb1qrk1/ppp1b1pp/3ppn2/5p2/2PP4/2N2NP1/PPQ1PPBP/R1B2RK1 b - - +A98 +rnb2rk1/pp2qppp/1b2pn2/3p4/1PP5/P3PN2/1B3PPP/RN1QKB1R b KQ - +D29* +rnb2rk1/pp2qppp/4pn2/2bp4/2P5/P3PN2/1P3PPP/RNBQKB1R w KQ - +D28* +rnb2rk1/ppB1ppbp/6p1/3q4/3P4/4P3/PP3PPP/R2QKBNR b KQ - +D84 +rnb2rk1/ppp1qpp1/4p2p/3P4/3P4/2P1PN2/P4PPP/R2QKB1R b KQ - +D57 +rnb2rk1/ppp1qppp/1b3n2/4N3/1P1Pp3/P1N1B3/2P2PPP/R2QKB1R w KQ - +C81* +rnb2rk1/ppppqppp/5n2/b3p3/4P3/P1N2N2/1PPPBPPP/R1BQK2R w KQ - +C86* +rnb2rk1/ppq1ppbp/5np1/2pp4/3P4/4PN2/PPPNBPPP/R1BQ1RK1 w - - +E08* +rnbq1rk1/1p3pbp/p2p1np1/2pP4/4P3/2N2N2/PP2BPPP/R1BQ1RK1 w - - +A74 +rnbq1rk1/2p1bppp/p2p1n2/1p2p3/3PP3/1BP2N1P/PP3PP1/RNBQR1K1 b - - +C95 +rnbq1rk1/2p1bppp/p2p1n2/1p2p3/4P3/1BP2N1P/PP1P1PP1/RNBQR1K1 w - - +C94 +rnbq1rk1/p1p1bpp1/1p2p2p/3n4/3P3B/2N1PN2/PP3PPP/R2QKB1R w KQ - +D59 +rnbq1rk1/p1p1bpp1/1p2pn1p/3p4/2PP3B/2N1PN2/PP3PPP/R2QKB1R w KQ - +D58 +rnbq1rk1/p1p1ppbp/1p1p1np1/8/2PPP3/2N1BP2/PP4PP/R2QKBNR w KQ - +E82 +rnbq1rk1/p1p2ppp/1p2pn2/3p4/1bPP4/2NBPN2/PP3PPP/R1BQK2R w KQ - +E52 +rnbq1rk1/p3ppbp/1p3np1/2pp4/3P1P2/4PN2/PPP1B1PP/RNBQ1RK1 w - - +A93* +rnbq1rk1/pp1p1ppp/4pn2/2P5/1bP5/2N5/PPQ1PPPP/R1B1KBNR w KQ - +E39 +rnbq1rk1/pp1pppbp/5np1/2p5/3P4/4PN2/PPP1BPPP/RNBQK2R w KQ - +A14* +rnbq1rk1/pp2b1pp/2p1pn2/3p1p2/2PP4/2N2NP1/PP2PPBP/R1BQ1RK1 w - - +A95 +rnbq1rk1/pp2b1pp/2p1pn2/3p1p2/2PP4/BP3NP1/P3PPBP/RN1Q1RK1 b - - +A94 +rnbq1rk1/pp2p1bp/2pp1np1/5p2/2PP4/2N2NP1/PP2PPBP/R1BQ1RK1 w - - +A88 +rnbq1rk1/pp2ppbp/2p2np1/3p4/2PP4/5NP1/PP2PPBP/RNBQ1RK1 w - - +D78 +rnbq1rk1/pp2ppbp/3p1np1/2p3B1/2PPP3/2N5/PP2BPPP/R2QK1NR w KQ - +E74 +rnbq1rk1/pp2ppbp/3p1np1/2p5/2PP4/2N2NP1/PP2PPBP/R1BQ1RK1 b - - +E65 +rnbq1rk1/pp2ppbp/3p1np1/2p5/2PP4/2N2NP1/PP2PPBP/R1BQK2R w KQ - +E64 +rnbq1rk1/pp2ppbp/3p1np1/2p5/2PPPP2/2N2N2/PP2B1PP/R1BQK2R b KQ - +E78 +rnbq1rk1/pp2ppbp/3p1np1/8/3NP3/2N1BP2/PPP3PP/R2QKB1R w KQ - +B76 +rnbq1rk1/pp2ppbp/5np1/2pp4/3P4/2P2NP1/PP2PPBP/RNBQ1RK1 b - - +D78* +rnbq1rk1/pp2ppbp/5np1/2pp4/3P4/4PN2/PPPNBPPP/R1BQ1RK1 b - - +E07* +rnbq1rk1/pp2ppbp/5np1/2pp4/3P4/5NP1/PPP1PPBP/RNBQ1RK1 w - - +D77* +rnbq1rk1/pp2ppbp/5np1/2pp4/5P2/3PPN2/PPP1B1PP/RNBQ1RK1 b - - +A96* +rnbq1rk1/pp2ppbp/5np1/3p4/2PN4/6P1/PP2PPBP/RNBQ1RK1 b - - +D75* +rnbq1rk1/pp2ppbp/5np1/3p4/3N4/6P1/PPP1PPBP/RNBQ1RK1 w - - +D74* +rnbq1rk1/pp2ppbp/5np1/3p4/3P4/5NP1/PP2PPBP/RNBQ1RK1 b - - +D79* +rnbq1rk1/pp2ppbp/5np1/3p4/3P4/5NP1/PP2PPBP/RNBQ1RK1 w - - +D79 +rnbq1rk1/pp2ppbp/5np1/3p4/8/1N4P1/PPP1PPBP/RNBQ1RK1 b - - +D76* +rnbq1rk1/pp2ppbp/6p1/2p5/2BPP3/2P5/P3NPPP/R1BQK2R w KQ - +D87 +rnbq1rk1/pp2ppbp/6p1/2pn4/3P4/5NP1/PP2PPBP/RNBQ1RK1 w - - +D75 +rnbq1rk1/pp3pbp/2pp1np1/3Pp3/2P1P3/2N1BP2/PP4PP/R2QKBNR w KQ - +E88 +rnbq1rk1/pp3pbp/2pp1np1/4p3/2PPP3/2N1BP2/PP2N1PP/R2QKB1R w KQ - +E86 +rnbq1rk1/pp3pbp/3p1np1/2pP4/4P3/2N2N2/PP2BPPP/R1BQ1RK1 b - - +A73 +rnbq1rk1/pp3pbp/3p1np1/2pP4/4P3/2N2N2/PP2BPPP/R1BQK2R w KQ - +A72 +rnbq1rk1/pp3pbp/3p1np1/2pP4/4PP2/2N2N2/PP4PP/R1BQKB1R w KQ - +A68 +rnbq1rk1/pp3pbp/3p1np1/2pP4/8/2N2NP1/PP2PPBP/R1BQK2R w KQ - +A62 +rnbq1rk1/pp3pbp/3p1np1/3pp3/2P1P3/2N1BP2/PP2N1PP/R2QKB1R w KQ - +E89 +rnbq1rk1/pp3pbp/3ppnp1/2pP2B1/2P1P3/2N5/PP2BPPP/R2QK1NR w KQ - +E75 +rnbq1rk1/pp3ppp/1bp2n2/4N3/1P1Pp3/P1N1B3/2P1BPPP/R2QK2R b KQ - +C83* +rnbq1rk1/pp3ppp/1bp2n2/4N3/1P1Pp3/P1N1B3/2P2PPP/R2QKB1R w KQ - +C82* +rnbq1rk1/pp3ppp/4pn2/2bp4/2P5/P3PN2/1P3PPP/RNBQKB1R b KQ - +D27* +rnbq1rk1/pp3ppp/4pn2/2p5/1bBP4/2N1PN2/PP3PPP/R1BQ1RK1 b - - +E54 +rnbq1rk1/pp3ppp/4pn2/2pp4/1bPP4/2NBPN2/PP3PPP/R1BQK2R w KQ - +E53 +rnbq1rk1/ppp1b1pp/3ppn2/5p2/2PP4/5NP1/PP2PPBP/RNBQ1RK1 w - - +A96 +rnbq1rk1/ppp1b1pp/4pn2/3p1p2/2PP4/1P3NP1/P3PPBP/RNBQ1RK1 b - - +A93 +rnbq1rk1/ppp1bpp1/4pn1p/3p4/2PP3B/2N1PN2/PP3PPP/R2QKB1R b KQ - +D56 +rnbq1rk1/ppp1bppp/4pn2/3p2B1/2PP4/2N1P3/PP3PPP/2RQKBNR b K - +D54 +rnbq1rk1/ppp1bppp/4pn2/3p2B1/2PP4/2N1PN2/PP3PPP/R2QKB1R b KQ - +D55 +rnbq1rk1/ppp1ppbp/1n4p1/8/3P4/5NP1/PP2PPBP/RNBQ1RK1 w - - +D76 +rnbq1rk1/ppp1ppbp/3p1np1/8/2PPP3/2N2N2/PP2BPPP/R1BQK2R b KQ - +E91 +rnbq1rk1/ppp1ppbp/3p1np1/8/2PPP3/2N2P2/PP4PP/R1BQKBNR w KQ - +E81 +rnbq1rk1/ppp1ppbp/3p1np1/8/2PPPP2/2N5/PP2B1PP/R1BQK1NR b KQ - +E77 +rnbq1rk1/ppp1ppbp/5np1/3p4/2PP1B2/2N1P3/PP3PPP/R2QKBNR w KQ - +D83 +rnbq1rk1/ppp1ppbp/5np1/3p4/2PP1B2/2N1PN2/PP3PPP/R2QKB1R b KQ - +D93 +rnbq1rk1/ppp1ppbp/5np1/3p4/2PP4/1QN1PN2/PP3PPP/R1B1KB1R b KQ - +D95 +rnbq1rk1/ppp1ppbp/5np1/3p4/2PP4/5NP1/PP2PPBP/RNBQ1RK1 b - - +D77 +rnbq1rk1/ppp1ppbp/5np1/3p4/2PP4/5NP1/PP2PPBP/RNBQK2R w KQ - +D73 +rnbq1rk1/ppp1ppbp/5np1/8/2QPP3/2N2N2/PP3PPP/R1B1KB1R b KQ - +D97 +rnbq1rk1/ppp1ppbp/6p1/3n4/3P4/5NP1/PP2PPBP/RNBQ1RK1 b - - +D74 +rnbq1rk1/ppp2pbp/3p1np1/3Pp3/2P1P3/2N1BP2/PP4PP/R2QKBNR b KQ - +E87 +rnbq1rk1/ppp2pbp/3p1np1/4p3/2PPP3/2N1BP2/PP4PP/R2QKBNR w KQ - +E85 +rnbq1rk1/ppp2pbp/3p1np1/4p3/2PPP3/2N2N2/PP2BPPP/R1BQ1RK1 b - - +E94 +rnbq1rk1/ppp2pbp/3p1np1/4p3/2PPP3/2N2N2/PP2BPPP/R1BQK2R w KQ - +E92 +rnbq1rk1/ppp2ppp/4pn2/3p4/1bPP4/2N1PN2/PP3PPP/R1BQKB1R w KQ - +E51 +rnbq1rk1/ppp2ppp/4pn2/3p4/1bPP4/2NBP3/PP3PPP/R1BQK1NR w KQ - +E48 +rnbq1rk1/ppp2ppp/4pn2/3p4/2PP4/P1PBP3/5PPP/R1BQK1NR b KQ - +E49 +rnbq1rk1/ppp2ppp/5n2/2bPN3/8/2N5/PPPP1PPP/R1BQKB1R b KQ - +C56* +rnbq1rk1/pppp1ppp/4pn2/8/1bPP4/2N1P3/PP3PPP/R1BQKBNR w KQ - +E46 +rnbq1rk1/pppp1ppp/4pn2/8/1bPP4/2N1PN2/PP3PPP/R1BQKB1R b KQ - +E50 +rnbq1rk1/pppp1ppp/4pn2/8/1bPP4/2NBP3/PP3PPP/R1BQK1NR b KQ - +E47 +rnbq1rk1/pppp1ppp/4pn2/8/2PP4/P1P1P3/5PPP/R1BQKBNR b KQ - +E28 +rnbq1rk1/pppp1ppp/4pn2/8/2PP4/P1P5/4PPPP/R1BQKBNR w KQ - +E27 +rnbq1rk1/pppp1ppp/5n2/4N3/1b2P3/2N5/PPPP1PPP/R1BQKB1R b KQ - +C67* +rnbq1rk1/pppp1ppp/5n2/4p3/1b2P3/2NP1N2/PPP2PPP/R1BQKB1R b KQ - +C66* +rnbq1rk1/pppp1ppp/5n2/4p3/4P3/P1P2N2/1PP1BPPP/R1BQK2R b KQ - +C85* +rnbq1rk1/pppp1ppp/5n2/4p3/4P3/P1P5/1PP2PPP/R1BQKBNR w KQ - +C69* +rnbq1rk1/pppp1ppp/5n2/b3N3/4P3/P1N5/1PPP1PPP/R1BQKB1R b KQ - +C80* +rnbq1rk1/pppp1ppp/5n2/b3p3/4P3/P1N2N2/1PPP1PPP/R1BQKB1R w KQ - +C78* +rnbq1rk1/pppp1ppp/5n2/b3p3/4P3/P1N2N2/1PPPBPPP/R1BQK2R b KQ - +C84* +rnbq1rk1/pppp1ppp/5n2/b3p3/4P3/P1NP1N2/1PP2PPP/R1BQKB1R b KQ - +C79* +rnbq1rk1/pppp1ppp/5n2/b3p3/4P3/P1NP4/1PP2PPP/R1BQKBNR w KQ - +C72* +rnbq1rk1/ppppb1pp/4pn2/5p2/2PP4/5NP1/PP2PPBP/RNBQK2R w KQ - +A92 +rnbqk1nr/pp2ppbp/6p1/2pp4/3P4/4PN2/PPP2PPP/RNBQKB1R w KQkq - +E01* +rnbqk1nr/pp2ppbp/6p1/2pp4/5P2/4PN2/PPPP2PP/RNBQKB1R w KQkq - +A90* +rnbqk1nr/pp2ppbp/6p1/2pp4/5P2/4PN2/PPPPB1PP/RNBQK2R b KQkq - +A91* +rnbqk1nr/pp2ppbp/6p1/3p4/3N4/6P1/PPP1PPBP/RNBQK2R b KQkq - +D71* +rnbqk1nr/pp3ppp/4p3/2ppP3/1b1P4/2N5/PPP2PPP/R1BQKBNR w KQkq - +C17 +rnbqk1nr/pp3ppp/4p3/2ppP3/3P4/P1P5/2P2PPP/R1BQKBNR b KQkq - +C18 +rnbqk1nr/ppp1ppbp/3p2p1/8/2PPP3/2N5/PP3PPP/R1BQKBNR b KQkq - +A42 +rnbqk1nr/ppp2ppp/4p3/3p4/1b1PP3/2N5/PPP2PPP/R1BQKBNR w KQkq - +C15 +rnbqk1nr/ppp2ppp/4p3/3pP3/1b1P4/2N5/PPP2PPP/R1BQKBNR b KQkq - +C16 +rnbqk1nr/pppp1pbp/8/6p1/2B1Pp2/5N2/PPPP2PP/RNBQK2R w KQkq - +C38 +rnbqk1nr/pppp1ppp/8/2b1p3/4P3/5N2/PPPP1PPP/RNBQKB1R b KQkq - +C24* +rnbqk1nr/pppp1ppp/8/2b1p3/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +C23* +rnbqk1nr/ppppbppp/8/8/4Pp2/5N2/PPPP2PP/RNBQKB1R w KQkq - +C35 +rnbqk2r/1p2bppp/p2ppn2/6B1/3NPP2/2N5/PPP3PP/R2QKB1R w KQkq - +B98 +rnbqk2r/p1pp1ppp/1p2pn2/8/1bPP4/2N1P3/PP2NPPP/R1BQKB1R b KQkq - +E44 +rnbqk2r/p1pp1ppp/1p2pn2/8/1bPP4/2N1P3/PP3PPP/R1BQKBNR w KQkq - +E43 +rnbqk2r/p1pp1ppp/5n2/1pb1p3/2B1P3/2N5/PPPP1PPP/R1BQK1NR w KQkq - +C51* +rnbqk2r/p2p1ppp/2p2n2/2b1p3/B3P3/2N5/PPPP1PPP/R1BQK1NR b KQkq - +C52* +rnbqk2r/pp1p1ppp/2p2n2/2b1p3/2B1P3/2N5/PPPP1PPP/R1BQK1NR w KQkq - +C53* +rnbqk2r/pp1p1ppp/2p2n2/b3p3/4P3/P1NP4/1PP2PPP/R1BQKBNR w KQkq - +C74* +rnbqk2r/pp1p1ppp/2p2n2/b3p3/4P3/P1NP4/1PPB1PPP/R2QKBNR b KQkq - +C75* +rnbqk2r/pp1p1ppp/4pn2/2p5/1bPP4/2N1P3/PP2NPPP/R1BQKB1R b KQkq - +E42 +rnbqk2r/pp1p1ppp/4pn2/2p5/1bPP4/2N1P3/PP3PPP/R1BQKBNR w KQkq - +E41 +rnbqk2r/pp1p1ppp/4pn2/2p5/1bPP4/2N5/PPQ1PPPP/R1B1KBNR w KQkq - +E38 +rnbqk2r/pp1p1ppp/4pn2/2p5/2PP4/P1P1P3/5PPP/R1BQKBNR b KQkq - +E26 +rnbqk2r/pp2npbp/6p1/3pp3/8/1N4P1/PPP1PPBP/RNBQK2R w KQkq - +D72* +rnbqk2r/pp2nppp/4p3/2ppP3/3P4/P1P5/2P2PPP/R1BQKBNR w KQkq - +C19 +rnbqk2r/pp2ppbp/3p1np1/8/3NP3/2N1BP2/PPP3PP/R2QKB1R b KQkq - +B75 +rnbqk2r/pp2ppbp/5np1/1Bpp4/8/1P2PN2/PBPP1PPP/RN1QK2R b KQkq - +E16* +rnbqk2r/pp2ppbp/5np1/2Pp4/8/4PN2/PPP1BPPP/RNBQK2R b KQkq - +E05* +rnbqk2r/pp2ppbp/5np1/2Pp4/8/4PN2/PPP2PPP/RNBQKB1R w KQkq - +E04* +rnbqk2r/pp2ppbp/5np1/2pp4/3P4/4PN2/PPP1BPPP/RNBQK2R w KQkq - +E06* +rnbqk2r/pp2ppbp/5np1/2pp4/3P4/5NP1/PPP1PPBP/RNBQ1RK1 b kq - +D73* +rnbqk2r/pp2ppbp/5np1/2pp4/5P2/4PN2/PPPPB1PP/RNBQ1RK1 b kq - +A92* +rnbqk2r/pp2ppbp/5np1/2pp4/5P2/5NP1/PPPPP1BP/RNBQK2R w KQkq - +A87* +rnbqk2r/pp2ppbp/5np1/2pp4/8/1P2PN2/PBPPBPPP/RN1QK2R b KQkq - +E17* +rnbqk2r/pp3pbp/3p1np1/1BpP4/4PP2/2N5/PP4PP/R1BQK1NR b KQkq - +A67 +rnbqk2r/pp3pbp/3p1np1/2pP4/4P3/2N2N2/PP2BPPP/R1BQK2R b KQkq - +A71 +rnbqk2r/pp3pp1/3ppn1p/2pP4/1bP4B/2N5/PP2PPPP/R2QKBNR w KQkq - +E31 +rnbqk2r/pp3ppp/2p2n2/b2pp3/4P3/P1NP2P1/1PPB1P1P/R2QKBNR b KQkq - +C76* +rnbqk2r/pp3ppp/4pn2/2pP4/3P4/P1P2P2/4P1PP/R1BQKBNR b KQkq - +E25 +rnbqk2r/pp3ppp/5n2/2bpp3/2B5/2N2N2/PPPP1PPP/R1BQK2R w KQkq - +C54* +rnbqk2r/ppp1bppp/4pn2/3p2B1/2PP4/2N5/PP2PPPP/R2QKBNR w KQkq - +D53 +rnbqk2r/ppp1bppp/4pn2/3p2B1/3PP3/2N5/PPP2PPP/R2QKBNR w KQkq - +C13 +rnbqk2r/ppp1bppp/4pn2/3p4/2P5/5NP1/PP1PPPBP/RNBQ1RK1 b kq - +A14 +rnbqk2r/ppp1bppp/4pn2/3p4/2PP4/5NP1/PP2PPBP/RNBQK2R b KQkq - +E06 +rnbqk2r/ppp1bppp/4pn2/8/2pP4/5NP1/PP2PPBP/RNBQK2R w KQkq - +E05 +rnbqk2r/ppp1ppbp/1n4p1/8/3PP3/6P1/PP2NPBP/RNBQK2R b KQkq - +D72 +rnbqk2r/ppp1ppbp/3p1np1/8/2PP4/2N2NP1/PP2PP1P/R1BQKB1R b KQkq - +E62 +rnbqk2r/ppp1ppbp/3p1np1/8/2PPP3/2N2N2/PP3PPP/R1BQKB1R b KQkq - +E90 +rnbqk2r/ppp1ppbp/3p1np1/8/2PPP3/2N2P2/PP4PP/R1BQKBNR b KQkq - +E80 +rnbqk2r/ppp1ppbp/3p1np1/8/2PPP3/2N3P1/PP3P1P/R1BQKBNR b KQkq - +E72 +rnbqk2r/ppp1ppbp/3p1np1/8/2PPP3/2N4P/PP3PP1/R1BQKBNR b KQkq - +E71 +rnbqk2r/ppp1ppbp/3p1np1/8/2PPP3/2N5/PP2BPPP/R1BQK1NR b KQkq - +E73 +rnbqk2r/ppp1ppbp/3p1np1/8/2PPPP2/2N5/PP4PP/R1BQKBNR b KQkq - +E76 +rnbqk2r/ppp1ppbp/5np1/3p2B1/2PP4/2N2N2/PP2PPPP/R2QKB1R b KQkq - +D91 +rnbqk2r/ppp1ppbp/5np1/3p4/2PP1B2/2N2N2/PP2PPPP/R2QKB1R b KQkq - +D92 +rnbqk2r/ppp1ppbp/5np1/3p4/2PP4/1QN2N2/PP2PPPP/R1B1KB1R b KQkq - +D96 +rnbqk2r/ppp1ppbp/5np1/3p4/2PP4/2N1PN2/PP3PPP/R1BQKB1R b KQkq - +D94 +rnbqk2r/ppp1ppbp/6p1/3n4/3P4/6P1/PP2PPBP/RNBQK1NR w KQkq - +D71 +rnbqk2r/ppp1ppbp/6p1/8/2BPP3/2P5/P4PPP/R1BQK1NR b KQkq - +D86 +rnbqk2r/ppp2ppp/3b4/3np3/8/P3P3/1P1P1PPP/RNBQKBNR w KQkq - +B42* +rnbqk2r/ppp2ppp/4p3/3p4/2PPn3/P7/1PQ1PPPP/R1B1KBNR b KQkq - +E37 +rnbqk2r/ppp2ppp/4pn2/3p2B1/1b1PP3/2N5/PPP2PPP/R2QKBNR w KQkq - +C12 +rnbqk2r/ppp2ppp/4pn2/3p4/1bPP4/2N2N2/PP2PPPP/R1BQKB1R w KQkq - +D38 +rnbqk2r/ppp2ppp/4pn2/3p4/1bPP4/2N5/PPQ1PPPP/R1B1KBNR w KQkq - +E34 +rnbqk2r/ppp2ppp/4pn2/3p4/1bPP4/P1N5/1PQ1PPPP/R1B1KBNR b KQkq - +E36 +rnbqk2r/ppp2ppp/4pn2/6B1/1bpP4/2N2N2/PP2PPPP/R2QKB1R w KQkq - +D39 +rnbqk2r/ppp2ppp/5n2/3p4/1b1P4/2N5/PPQ1PPPP/R1B1KBNR w KQkq - +E35 +rnbqk2r/ppp2ppp/5n2/3pp3/4P3/P1PP4/2P2PPP/R1BQKBNR w KQkq - +C73* +rnbqk2r/ppp3pp/5p2/3np3/1b2P3/3P1N2/PP3PPP/RNBQKB1R w KQkq - +B55* +rnbqk2r/pppp1ppp/4pn2/6B1/1bPP4/2N5/PP2PPPP/R2QKBNR b KQkq - +E30 +rnbqk2r/pppp1ppp/4pn2/8/1bPP4/1QN5/PP2PPPP/R1B1KBNR b KQkq - +E22 +rnbqk2r/pppp1ppp/4pn2/8/1bPP4/2N1P3/PP3PPP/R1BQKBNR b KQkq - +E40 +rnbqk2r/pppp1ppp/4pn2/8/1bPP4/2N2N2/PP2PPPP/R1BQKB1R b KQkq - +E21 +rnbqk2r/pppp1ppp/4pn2/8/1bPP4/2N5/PP2PPPP/R1BQKBNR w KQkq - +E20 +rnbqk2r/pppp1ppp/4pn2/8/1bPP4/2N5/PPQ1PPPP/R1B1KBNR b KQkq - +E32 +rnbqk2r/pppp1ppp/4pn2/8/1bPP4/5N2/PP2PPPP/RNBQKB1R w KQkq - +E11 +rnbqk2r/pppp1ppp/4pn2/8/2PP4/P1P5/4PPPP/R1BQKBNR b KQkq - +E24 +rnbqk2r/pppp1ppp/5n2/2b1p3/4P3/2N2N2/PPPP1PPP/R1BQKB1R b KQkq - +C55* +rnbqk2r/pppp1ppp/5n2/2b1p3/4P3/2N5/PPPP1PPP/R1BQKBNR w KQkq - +C50* +rnbqk2r/pppp1ppp/5n2/3Np3/1b2P3/8/PPPP1PPP/R1BQKBNR b KQkq - +C61* +rnbqk2r/pppp1ppp/5n2/4p3/1b2P3/2N2N2/PPPP1PPP/R1BQKB1R b KQkq - +C65* +rnbqk2r/pppp1ppp/5n2/4p3/1b2P3/2N5/PPPP1PPP/R1BQKBNR w KQkq - +C60* +rnbqk2r/pppp1ppp/5n2/4p3/1b2P3/2NP4/PPP2PPP/R1BQKBNR b KQkq - +C62* +rnbqk2r/pppp1ppp/5n2/4p3/1b2PP2/2N5/PPPP2PP/R1BQKBNR b KQkq - +C63* +rnbqk2r/pppp1ppp/5n2/4p3/1bB1P3/2N5/PPPP1PPP/R1BQK1NR b KQkq - +C64* +rnbqk2r/pppp1ppp/5n2/4p3/1bP5/2N3P1/PP1PPP1P/R1BQKBNR b KQkq - +B31* +rnbqk2r/pppp1ppp/5n2/4p3/1bP5/3P4/PP1BPPPP/RN1QKBNR b KQkq - +B52* +rnbqk2r/pppp1ppp/5n2/4p3/1bP5/3P4/PP2PPPP/RNBQKBNR w KQkq - +B51* +rnbqk2r/pppp1ppp/5n2/4p3/4P3/P1b5/1PPP1PPP/R1BQKBNR w KQkq - +C68* +rnbqk2r/pppp1ppp/5n2/b3p3/4P3/P1N2N2/1PPP1PPP/R1BQKB1R b KQkq - +C77* +rnbqk2r/pppp1ppp/5n2/b3p3/4P3/P1N5/1PPP1PPP/R1BQKBNR w KQkq - +C70* +rnbqk2r/pppp1ppp/5n2/b3p3/4P3/P1NP4/1PP2PPP/R1BQKBNR b KQkq - +C71* +rnbqk2r/pppp1ppp/8/2b1p3/4P1n1/2N2N2/PPPP1PPP/R1BQKB1R w KQkq - +C57* +rnbqk2r/pppp1ppp/8/2b5/N2pP1n1/5N2/PPP2PPP/R1BQKB1R b KQkq - +C58* +rnbqk2r/pppp2pp/5n2/2b1pP2/6P1/8/PPPP1PBP/RNBQK1NR b KQkq - +C38* +rnbqk2r/ppppb1pp/4pn2/5p2/2PP4/6P1/PP2PPBP/RNBQK1NR w KQkq - +A91 +rnbqk2r/ppppbppp/8/8/N3P1n1/2P2N1P/P4PP1/R1BQKB1R b KQkq - +C59* +rnbqk2r/ppppp1bp/5np1/5p2/2PP4/5NP1/PP2PPBP/RNBQK2R b KQkq - +A87 +rnbqk2r/ppppppbp/5np1/8/2PP4/8/PP2PPPP/RNBQKBNR w KQkq - +A08* +rnbqk2r/ppppppbp/5np1/8/2PPP3/2N5/PP3PPP/R1BQKBNR b KQkq - +E70 +rnbqkb1r/1p2pppp/p2p1n2/6B1/3NP3/2N5/PPP2PPP/R2QKB1R b KQkq - +B94 +rnbqkb1r/1p2pppp/p2p1n2/8/3NP3/2N3P1/PPP2P1P/R1BQKB1R b KQkq - +B91 +rnbqkb1r/1p2pppp/p2p1n2/8/3NP3/2N5/PPP1BPPP/R1BQK2R b KQkq - +B92 +rnbqkb1r/1p2pppp/p2p1n2/8/3NP3/2N5/PPP2PPP/R1BQKB1R w KQkq - +B90 +rnbqkb1r/1p2pppp/p2p1n2/8/3NPP2/2N5/PPP3PP/R1BQKB1R b KQkq - +B93 +rnbqkb1r/1p3ppp/p2ppn2/6B1/3NP3/2N5/PPP2PPP/R2QKB1R w KQkq - +B95 +rnbqkb1r/1p3ppp/p2ppn2/6B1/3NPP2/2N5/PPP3PP/R2QKB1R b KQkq - +B96 +rnbqkb1r/1p3ppp/p2ppn2/8/3NP3/2N5/PPP1BPPP/R1BQK2R w KQkq - +B84 +rnbqkb1r/1p3ppp/p3pn2/2p5/2BP4/4PN2/PP2QPPP/RNB2RK1 b kq - +D28 +rnbqkb1r/1p3ppp/p3pn2/2p5/2BP4/4PN2/PP3PPP/RNBQ1RK1 w kq - +D27 +rnbqkb1r/3ppppp/P4n2/2pP4/8/8/PP2PPPP/RNBQKBNR b KQkq - +A58 +rnbqkb1r/5ppp/p2ppn2/1p6/3NP3/1BN5/PPP2PPP/R1BQK2R w KQkq - +B87 +rnbqkb1r/p1pp1ppp/1p2pn2/8/2PP4/4PN2/PP3PPP/RNBQKB1R b KQkq - +E14 +rnbqkb1r/p1pp1ppp/1p2pn2/8/2PP4/5N2/PP2PPPP/RNBQKB1R w KQkq - +E12 +rnbqkb1r/p1pp1ppp/1p2pn2/8/2PP4/5NP1/PP2PP1P/RNBQKB1R b KQkq - +E15 +rnbqkb1r/p1pppppp/1p3n2/8/3P4/5N2/PPP1PPPP/RNBQKB1R w KQkq - +A47 +rnbqkb1r/p2ppppp/1p3n2/2p5/3P4/2P5/PP2PPPP/RNBQKBNR w KQkq - +A12* +rnbqkb1r/p2ppppp/5n2/1ppP4/2P5/8/PP2PPPP/RNBQKBNR w KQkq - +A57 +rnbqkb1r/pp1p1ppp/2p2n2/4p3/2P5/2N3P1/PP1PPP1P/R1BQKBNR w KQkq - +A23 +rnbqkb1r/pp1p1ppp/4pn2/2p5/2P1P3/2N5/PP1P1PPP/R1BQKBNR w KQkq - +A19 +rnbqkb1r/pp1p1ppp/4pn2/2pP4/2P5/8/PP2PPPP/RNBQKBNR w KQkq - +A60 +rnbqkb1r/pp1p1ppp/4pn2/8/2PN4/8/PP2PPPP/RNBQKB1R w KQkq - +A32 +rnbqkb1r/pp1ppppp/5n2/2p5/2PP4/5N2/PP2PPPP/RNBQKB1R b KQkq - +A31 +rnbqkb1r/pp1ppppp/5n2/2p5/2PP4/8/PP2PPPP/RNBQKBNR w KQkq - +A56 +rnbqkb1r/pp1ppppp/5n2/2p5/3P4/8/PPP1PPPP/RNBQKBNR w KQkq - +A09* +rnbqkb1r/pp1ppppp/5n2/2p5/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - +B29 +rnbqkb1r/pp2pp1p/2p2p2/8/3P4/8/PPP2PPP/R1BQKBNR w KQkq - +B16 +rnbqkb1r/pp2pp1p/3p1np1/8/3NP3/2N1B3/PPP2PPP/R2QKB1R b KQkq - +B72 +rnbqkb1r/pp2pp1p/3p1np1/8/3NP3/2N5/PPP2PPP/R1BQKB1R w KQkq - +B70 +rnbqkb1r/pp2pp1p/3p1np1/8/3NPP2/2N5/PPP3PP/R1BQKB1R b KQkq - +B71 +rnbqkb1r/pp2pp1p/5np1/2pP4/4p3/2N5/PPP2PPP/R1BQKBNR w KQkq - +D09* +rnbqkb1r/pp2pp1p/5np1/2pp4/8/1P2PN2/P1PP1PPP/RNBQKB1R w KQkq - +E15* +rnbqkb1r/pp2pppp/2p2n2/3p4/2PP4/2N2N2/PP2PPPP/R1BQKB1R b KQkq - +D15 +rnbqkb1r/pp2pppp/2p2n2/8/P1pP4/2N2N2/1P2PPPP/R1BQKB1R b KQkq - +D16 +rnbqkb1r/pp2pppp/3p1n2/8/3NP3/2N5/PPP2PPP/R1BQKB1R b KQkq - +B56 +rnbqkb1r/pp2pppp/5n2/1Bpp4/8/4PN2/PPPP1PPP/RNBQK2R b KQkq - +E11* +rnbqkb1r/pp2pppp/5n2/2Pp4/8/5N2/PPP1PPPP/RNBQKB1R b KQkq - +D23* +rnbqkb1r/pp2pppp/5n2/2Pp4/8/8/PPP1PPPP/RNBQKBNR w KQkq - +D21* +rnbqkb1r/pp2pppp/5n2/2pp4/2P5/5N2/PP1PPPPP/RNBQKB1R w KQkq - +A31* +rnbqkb1r/pp2pppp/5n2/2pp4/3P4/2P5/PP2PPPP/RNBQKBNR w KQkq - +D11* +rnbqkb1r/pp2pppp/5n2/2pp4/3P4/5NP1/PPP1PP1P/RNBQKB1R b KQkq - +D70* +rnbqkb1r/pp2pppp/5n2/2pp4/8/1P2PN2/P1PP1PPP/RNBQKB1R b KQkq - +E12* +rnbqkb1r/pp2pppp/5n2/2pp4/8/4PN2/PPPP1PPP/RNBQKB1R w KQkq - +E10* +rnbqkb1r/pp2pppp/5n2/3p4/2PP4/2N5/PP3PPP/R1BQKBNR b KQkq - +B14 +rnbqkb1r/pp2pppp/5n2/3p4/3P4/5N2/PP2PPPP/RNBQKB1R b KQkq - +D13* +rnbqkb1r/pp2pppp/5n2/3p4/3P4/5N2/PP2PPPP/RNBQKB1R w KQkq - +D13 +rnbqkb1r/pp2pppp/8/2pn4/8/4PN2/PP1P1PPP/RNBQKB1R b KQkq - +A32* +rnbqkb1r/pp3p1p/3p1np1/2pP4/4P3/2N2N2/PP3PPP/R1BQKB1R b KQkq - +A70 +rnbqkb1r/pp3p1p/3p1np1/2pP4/4PP2/2N5/PP4PP/R1BQKBNR b KQkq - +A66 +rnbqkb1r/pp3p1p/3p1np1/2pP4/8/2N2N2/PP2PPPP/R1BQKB1R w KQkq - +A61 +rnbqkb1r/pp3ppp/2p1pn2/3p4/2PP4/2N1PN2/PP3PPP/R1BQKB1R b KQkq - +D45 +rnbqkb1r/pp3ppp/2p1pn2/3p4/2PP4/2N2N2/PP2PPPP/R1BQKB1R w KQkq - +D43 +rnbqkb1r/pp3ppp/2p1pn2/6B1/2pP4/2N2N2/PP2PPPP/R2QKB1R w KQkq - +D44 +rnbqkb1r/pp3ppp/2p2n2/3p2B1/3P4/2N5/PPQ1PPPP/R3KBNR b KQkq - +D36 +rnbqkb1r/pp3ppp/3p1n2/1B2p3/3NP3/5P2/PPP3PP/RNBQK2R b KQkq - +B55 +rnbqkb1r/pp3ppp/3p1n2/2pP4/4P3/2N5/PP3PPP/R1BQKBNR b KQkq - +A65 +rnbqkb1r/pp3ppp/3ppn2/8/2BNP3/2N5/PPP2PPP/R1BQK2R b KQkq - +B86 +rnbqkb1r/pp3ppp/3ppn2/8/3NP1P1/2N5/PPP2P1P/R1BQKB1R b KQkq - +B81 +rnbqkb1r/pp3ppp/3ppn2/8/3NP3/2N5/PPP1BPPP/R1BQK2R b KQkq - +B83 +rnbqkb1r/pp3ppp/3ppn2/8/3NP3/2N5/PPP2PPP/R1BQKB1R w KQkq - +B80 +rnbqkb1r/pp3ppp/3ppn2/8/3NPP2/2N5/PPP3PP/R1BQKB1R b KQkq - +B82 +rnbqkb1r/pp3ppp/4pn2/2Pp4/8/4PN2/PPP2PPP/RNBQKB1R b KQkq - +D26* +rnbqkb1r/pp3ppp/4pn2/2Pp4/8/5N2/PPP1PPPP/RNBQKB1R w KQkq - +D25* +rnbqkb1r/pp3ppp/4pn2/2Pp4/8/P7/1PP1PPPP/RNBQKBNR w KQkq - +D22* +rnbqkb1r/pp3ppp/4pn2/2pP4/3P4/2N2N2/PP2PPPP/R1BQKB1R b KQkq - +D41 +rnbqkb1r/pp3ppp/4pn2/2pp4/2PP4/2N2N2/PP2PPPP/R1BQKB1R w KQkq - +D40 +rnbqkb1r/pp3ppp/4pn2/2pp4/3P1B2/2P2N2/PP2PPPP/RN1QKB1R b KQkq - +D12* +rnbqkb1r/pp3ppp/4pn2/2pp4/8/1P2PN2/P1PP1PPP/RNBQKB1R w KQkq - +E14* +rnbqkb1r/pp3ppp/8/2pnp3/8/2N3P1/PP1PPP1P/R1BQKBNR w KQkq - +B36* +rnbqkb1r/pp3ppp/8/2pnp3/8/2N3P1/PP1PPPBP/R1BQK1NR b KQkq - +B37* +rnbqkb1r/ppp1pp1p/3p1np1/8/3PP3/2N2N2/PPP2PPP/R1BQKB1R b KQkq - +B07 +rnbqkb1r/ppp1pp1p/3p1np1/8/3PPP2/2N5/PPP3PP/R1BQKBNR b KQkq - +B08 +rnbqkb1r/ppp1pp1p/5np1/3p2B1/2PP4/2N5/PP2PPPP/R2QKBNR b KQkq - +D80 +rnbqkb1r/ppp1pp1p/5np1/3p4/2PP1B2/2N5/PP2PPPP/R2QKBNR b KQkq - +D82 +rnbqkb1r/ppp1pp1p/5np1/3p4/2PP4/1QN5/PP2PPPP/R1B1KBNR b KQkq - +D81 +rnbqkb1r/ppp1pp1p/5np1/3p4/2PP4/2N2N2/PP2PPPP/R1BQKB1R b KQkq - +D90 +rnbqkb1r/ppp1pp1p/5np1/3p4/2PP4/5N2/PP2PPPP/RNBQKB1R w KQkq - +D70 +rnbqkb1r/ppp1pp1p/5np1/3p4/2PP4/5P2/PP2P1PP/RNBQKBNR w KQkq - +D70 +rnbqkb1r/ppp1pp1p/5np1/3p4/8/5NP1/PPPPPP1P/RNBQKB1R w KQkq - +A49* +rnbqkb1r/ppp1pp1p/6p1/3n4/3P4/2N5/PP2PPPP/R1BQKBNR w KQkq - +D85 +rnbqkb1r/ppp1pppp/3p1n2/8/2PP4/8/PP2PPPP/RNBQKBNR w KQkq - +A53 +rnbqkb1r/ppp1pppp/3p1n2/8/3PP3/8/PPP2PPP/RNBQKBNR w KQkq - +B09 +rnbqkb1r/ppp1pppp/3p4/3nP3/3P4/5N2/PPP2PPP/RNBQKB1R b KQkq - +B04 +rnbqkb1r/ppp1pppp/5n2/3p2B1/3P4/2N5/PPP1PPPP/R2QKBNR b KQkq - +D01 +rnbqkb1r/ppp1pppp/5n2/3p2B1/3P4/5N2/PPP1PPPP/RN1QKB1R b KQkq - +D03 +rnbqkb1r/ppp1pppp/5n2/3p4/3P4/4PN2/PPP2PPP/RNBQKB1R b KQkq - +D04 +rnbqkb1r/ppp1pppp/5n2/3p4/3P4/8/PPP1PPPP/RNBQKBNR w KQkq - +D02* +rnbqkb1r/ppp1pppp/5n2/3p4/8/1P3N2/P1PPPPPP/RNBQKB1R b KQkq - +A47* +rnbqkb1r/ppp1pppp/5n2/3p4/8/5N2/PPPPPPPP/RNBQKB1R w KQkq - +A46* +rnbqkb1r/ppp1pppp/5n2/3p4/8/5NP1/PPPPPP1P/RNBQKB1R b KQkq - +A48* +rnbqkb1r/ppp1pppp/5n2/8/2pP4/2N2N2/PP2PPPP/R1BQKB1R b KQkq - +D24 +rnbqkb1r/ppp1pppp/5n2/8/2pP4/4PN2/PP3PPP/RNBQKB1R b KQkq - +D25 +rnbqkb1r/ppp1pppp/5n2/8/2pP4/5N2/PP2PPPP/RNBQKB1R w KQkq - +D23 +rnbqkb1r/ppp2ppp/3p1n2/4p3/2PP4/2N2N2/PP2PPPP/R1BQKB1R b KQkq - +A54 +rnbqkb1r/ppp2ppp/4pn2/3p2B1/2PP4/2N5/PP2PPPP/R2QKBNR b KQkq - +D50 +rnbqkb1r/ppp2ppp/4pn2/3p4/2PP4/2N2N2/PP2PPPP/R1BQKB1R b KQkq - +D37 +rnbqkb1r/ppp2ppp/4pn2/3p4/2PP4/2N5/PP2PPPP/R1BQKBNR w KQkq - +D35 +rnbqkb1r/ppp2ppp/4pn2/3p4/2PP4/6P1/PP2PPBP/RNBQK1NR b KQkq - +E01 +rnbqkb1r/ppp2ppp/4pn2/3p4/3P4/4PN2/PPP2PPP/RNBQKB1R b KQkq - +D05* +rnbqkb1r/ppp2ppp/4pn2/3p4/3P4/4PN2/PPP2PPP/RNBQKB1R w KQkq - +D05 +rnbqkb1r/ppp2ppp/4pn2/3p4/3P4/5N2/PPP1PPPP/RNBQKB1R w KQkq - +D04* +rnbqkb1r/ppp2ppp/4pn2/3p4/3PP3/2N5/PPP2PPP/R1BQKBNR w KQkq - +C11 +rnbqkb1r/ppp2ppp/4pn2/3p4/3PP3/8/PPPN1PPP/R1BQKBNR w KQkq - +C05 +rnbqkb1r/ppp2ppp/4pn2/8/2pP4/4PN2/PP3PPP/RNBQKB1R w KQkq - +D26 +rnbqkb1r/ppp2ppp/4pn2/8/2pP4/5NP1/PP2PPBP/RNBQK2R b KQkq - +E04 +rnbqkb1r/ppp2ppp/4pn2/8/Q1pP4/6P1/PP2PPBP/RNB1K1NR b KQkq - +E02 +rnbqkb1r/ppp2ppp/5n2/3P4/4pP2/3P4/PPP3PP/RNBQKBNR w KQkq - +C32 +rnbqkb1r/ppp2ppp/5n2/3p2B1/3Np3/3P4/PPP1PPPP/RN1QKB1R b KQkq - +B05* +rnbqkb1r/ppp2ppp/5n2/3p4/3Np3/3P4/PPP1PPPP/RNBQKB1R w KQkq - +B04* +rnbqkb1r/ppp2ppp/5n2/3pp3/2P5/2N5/PP1PPPPP/R1BQKBNR w KQkq - +B32* +rnbqkb1r/ppp2ppp/5n2/3pp3/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - +C43* +rnbqkb1r/ppp2ppp/5n2/3pp3/4PP2/2N5/PPPP2PP/R1BQKBNR w KQkq - +C29 +rnbqkb1r/ppp2ppp/8/3np3/8/2N1P3/PP1P1PPP/R1BQKBNR b KQkq - +B44* +rnbqkb1r/ppp2ppp/8/3np3/8/2N3P1/PP1PPP1P/R1BQKBNR b KQkq - +B34* +rnbqkb1r/ppp2ppp/8/3np3/8/2N5/PP1PPPPP/R1BQKBNR w KQkq - +B33* +rnbqkb1r/ppp2ppp/8/3np3/8/2N5/PPPP1PPP/R1BQKBNR w KQkq - +C45* +rnbqkb1r/ppp2ppp/8/3np3/8/3P4/PP2PPPP/RNBQKBNR w KQkq - +B54* +rnbqkb1r/ppp2ppp/8/3np3/8/P3P3/1P1P1PPP/RNBQKBNR b KQkq - +B41* +rnbqkb1r/pppp1p1p/5np1/4p3/2P5/2N3P1/PP1PPP1P/R1BQKBNR w KQkq - +A24 +rnbqkb1r/pppp1ppp/4pn2/8/2P1P3/2N5/PP1P1PPP/R1BQKBNR b KQkq - +A18 +rnbqkb1r/pppp1ppp/4pn2/8/2P5/2N5/PP1PPPPP/R1BQKBNR w KQkq - +A17 +rnbqkb1r/pppp1ppp/4pn2/8/2PP4/5N2/PP2PPPP/RNBQKB1R b KQkq - +E10 +rnbqkb1r/pppp1ppp/4pn2/8/2PP4/6P1/PP2PP1P/RNBQKBNR b KQkq - +E00 +rnbqkb1r/pppp1ppp/5n2/4p3/2B1P3/8/PPPP1PPP/RNBQK1NR w KQkq - +C24 +rnbqkb1r/pppp1ppp/5n2/4p3/2P5/2N5/PP1PPPPP/R1BQKBNR b KQkq - +B30* +rnbqkb1r/pppp1ppp/5n2/4p3/2P5/2N5/PP1PPPPP/R1BQKBNR w KQkq - +A22 +rnbqkb1r/pppp1ppp/5n2/4p3/2P5/3P4/PP2PPPP/RNBQKBNR b KQkq - +B50* +rnbqkb1r/pppp1ppp/5n2/4p3/2P5/4P3/PP1P1PPP/RNBQKBNR b KQkq - +B40* +rnbqkb1r/pppp1ppp/5n2/4p3/2P5/5N2/PP1PPPPP/RNBQKB1R b KQkq - +B29* +rnbqkb1r/pppp1ppp/5n2/4p3/2P5/8/PP1PPPPP/RNBQKBNR w KQkq - +B27* +rnbqkb1r/pppp1ppp/5n2/4p3/2P5/P7/1P1PPPPP/RNBQKBNR b KQkq - +B28* +rnbqkb1r/pppp1ppp/5n2/4p3/2PP4/8/PP2PPPP/RNBQKBNR w KQkq - +A51 +rnbqkb1r/pppp1ppp/5n2/4p3/3PP3/5N2/PPP2PPP/RNBQKB1R b KQkq - +C43 +rnbqkb1r/pppp1ppp/5n2/4p3/4P3/2N5/PPPP1PPP/R1BQKBNR b KQkq - +C44* +rnbqkb1r/pppp1ppp/5n2/4p3/4P3/2N5/PPPP1PPP/R1BQKBNR w KQkq - +C26 +rnbqkb1r/pppp1ppp/5n2/4p3/4P3/3P4/PPP2PPP/RNBQKBNR b KQkq - +C41* +rnbqkb1r/pppp1ppp/5n2/4p3/4P3/5N2/PPPP1PPP/RNBQKB1R b KQkq - +C42* +rnbqkb1r/pppp1ppp/5n2/4p3/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - +C42 +rnbqkb1r/pppp1ppp/5n2/4p3/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +C40* +rnbqkb1r/pppp1ppp/8/4P3/2P3n1/8/PP2PPPP/RNBQKBNR w KQkq - +A52 +rnbqkb1r/pppp1ppp/8/4p3/2B1n3/2N5/PPPP1PPP/R1BQK1NR w KQkq - +C27 +rnbqkb1r/pppp2p1/5n2/4pP1p/6P1/8/PPPP1P1P/RNBQKBNR w KQkq - +C39* +rnbqkb1r/pppp2pp/4pn2/5p2/2PP4/6P1/PP2PPBP/RNBQK1NR b KQkq - +A90 +rnbqkb1r/pppp2pp/5n2/4pP2/3P4/8/PPP2PPP/RNBQKBNR b KQkq - +C36* +rnbqkb1r/pppp2pp/5n2/4pP2/6P1/8/PPPP1P1P/RNBQKBNR b KQkq - +C37* +rnbqkb1r/pppp2pp/5n2/4pP2/8/8/PPPP1PPP/RNBQKBNR w KQkq - +C34* +rnbqkb1r/pppp2pp/5n2/4pP2/8/8/PPPPBPPP/RNBQK1NR b KQkq - +C35* +rnbqkb1r/ppppp1pp/5n2/5p2/2PP4/2N5/PP2PPPP/R1BQKBNR b KQkq - +A85 +rnbqkb1r/ppppp1pp/5n2/5p2/2PP4/6P1/PP2PP1P/RNBQKBNR b KQkq - +A86 +rnbqkb1r/ppppp1pp/5n2/6B1/3Pp3/2N5/PPP2PPP/R2QKBNR b KQkq - +A83 +rnbqkb1r/pppppp1p/5np1/8/2PP4/2N5/PP2PPPP/R1BQKBNR b KQkq - +E61 +rnbqkb1r/pppppp1p/5np1/8/2PP4/8/PP2PPPP/RNBQKBNR w KQkq - +E60 +rnbqkb1r/pppppp1p/5np1/8/3P4/5N2/PPP1PPPP/RNBQKB1R w KQkq - +A48 +rnbqkb1r/pppppp1p/5np1/8/3P4/5NP1/PPP1PP1P/RNBQKB1R b KQkq - +A49 +rnbqkb1r/pppppp1p/5np1/8/3P4/8/PPP1PPPP/RNBQKBNR w KQkq - +A07* +rnbqkb1r/pppppppp/5n2/8/2P5/2N5/PP1PPPPP/R1BQKBNR b KQkq - +A16 +rnbqkb1r/pppppppp/5n2/8/2P5/8/PP1PPPPP/RNBQKBNR w KQkq - +A15 +rnbqkb1r/pppppppp/5n2/8/2PP4/8/PP2PPPP/RNBQKBNR b KQkq - +A50 +rnbqkb1r/pppppppp/5n2/8/3P4/5N2/PPP1PPPP/RNBQKB1R b KQkq - +A46 +rnbqkb1r/pppppppp/5n2/8/3P4/8/PPP1PPPP/RNBQKBNR b KQkq - +A06* +rnbqkb1r/pppppppp/5n2/8/3P4/8/PPP1PPPP/RNBQKBNR w KQkq - +A45 +rnbqkb1r/pppppppp/5n2/8/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +B02 +rnbqkb1r/pppppppp/5n2/8/8/5N2/PPPPPPPP/RNBQKB1R b KQkq - +A05* +rnbqkb1r/pppppppp/5n2/8/8/5N2/PPPPPPPP/RNBQKB1R w KQkq - +A05 +rnbqkb1r/pppppppp/5n2/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - +A04* +rnbqkb1r/pppppppp/8/3nP3/3P4/8/PPP2PPP/RNBQKBNR b KQkq - +B03 +rnbqkbnr/1p1p1ppp/p3p3/8/3NP3/2N5/PPP2PPP/R1BQKB1R b KQkq - +B43 +rnbqkbnr/1p1p1ppp/p3p3/8/3NP3/3B4/PPP2PPP/RNBQK2R b KQkq - +B42 +rnbqkbnr/1p1p1ppp/p3p3/8/3NP3/8/PPP2PPP/RNBQKB1R w KQkq - +B41 +rnbqkbnr/1p1ppppp/p7/2p5/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - +B28 +rnbqkbnr/1pp1pppp/p7/8/2pP4/4PN2/PP3PPP/RNBQKB1R b KQkq - +D22 +rnbqkbnr/p1pppppp/1p6/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - +A01* +rnbqkbnr/pp1p1ppp/2p5/4p3/2P5/8/PP1PPPPP/RNBQKBNR w KQkq - +B22* +rnbqkbnr/pp1p1ppp/4p3/2p5/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - +B40 +rnbqkbnr/pp1p1ppp/8/2pPp3/8/8/PPP1PPPP/RNBQKBNR w KQkq e6 +A44 +rnbqkbnr/pp1ppppp/2p5/8/2P5/8/PP1PPPPP/RNBQKBNR w KQkq - +A11 +rnbqkbnr/pp1ppppp/2p5/8/3PP3/8/PPP2PPP/RNBQKBNR b KQkq - +B12 +rnbqkbnr/pp1ppppp/2p5/8/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +B10 +rnbqkbnr/pp1ppppp/8/2p5/2P5/2N5/PP1PPPPP/R1BQKBNR b KQkq - +A34 +rnbqkbnr/pp1ppppp/8/2p5/2P5/8/PP1PPPPP/RNBQKBNR b KQkq - +A30* +rnbqkbnr/pp1ppppp/8/2p5/2P5/8/PP1PPPPP/RNBQKBNR w KQkq - +A30 +rnbqkbnr/pp1ppppp/8/2p5/3P4/8/PPP1PPPP/RNBQKBNR w KQkq - +A43 +rnbqkbnr/pp1ppppp/8/2p5/3PP3/8/PPP2PPP/RNBQKBNR b KQkq - +B21 +rnbqkbnr/pp1ppppp/8/2p5/4P3/2N5/PPPP1PPP/R1BQKBNR b KQkq - +B23 +rnbqkbnr/pp1ppppp/8/2p5/4P3/2P5/PP1P1PPP/RNBQKBNR b KQkq - +B22 +rnbqkbnr/pp1ppppp/8/2p5/4P3/5N2/PPPP1PPP/RNBQKB1R b KQkq - +B27 +rnbqkbnr/pp1ppppp/8/2p5/4P3/8/PPPP1PPP/RNBQKBNR b KQkq - +A20* +rnbqkbnr/pp1ppppp/8/2p5/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +B20 +rnbqkbnr/pp1ppppp/8/2p5/4PP2/8/PPPP2PP/RNBQKBNR b KQkq - +B21 +rnbqkbnr/pp1ppppp/8/2p5/8/2P5/PP1PPPPP/RNBQKBNR b KQkq - +A11* +rnbqkbnr/pp1ppppp/8/2p5/8/4P3/PPPP1PPP/RNBQKBNR b KQkq - +A13* +rnbqkbnr/pp1ppppp/8/2p5/8/5N2/PPPPPPPP/RNBQKB1R b KQkq - +A15* +rnbqkbnr/pp1ppppp/8/2p5/8/8/PPPPPPPP/RNBQKBNR w KQkq - +A10* +rnbqkbnr/pp2p1pp/5p2/2pp4/3P4/5NP1/PPP1PP1P/RNBQKB1R b KQkq - +D70* +rnbqkbnr/pp2pp1p/6p1/2pp4/5P2/5N2/PPPPP1PP/RNBQKB1R w KQkq - +A86* +rnbqkbnr/pp2pp1p/6p1/2pp4/8/4PN2/PPPP1PPP/RNBQKB1R w KQkq - +E00* +rnbqkbnr/pp2pppp/2p5/3p4/2P5/1P3N2/P2PPPPP/RNBQKB1R b KQkq - +A12 +rnbqkbnr/pp2pppp/2p5/3p4/2PP4/5N2/PP2PPPP/RNBQKB1R b KQkq - +D11 +rnbqkbnr/pp2pppp/2p5/3p4/2PP4/8/PP2PPPP/RNBQKBNR w KQkq - +D10 +rnbqkbnr/pp2pppp/2p5/3p4/3PP3/2N5/PPP2PPP/R1BQKBNR b KQkq - +B15 +rnbqkbnr/pp2pppp/3p4/1Bp5/4P3/5N2/PPPP1PPP/RNBQK2R b KQkq - +B51 +rnbqkbnr/pp2pppp/3p4/2p5/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - +B50 +rnbqkbnr/pp2pppp/3p4/8/3NP3/8/PPP2PPP/RNBQKB1R b KQkq - +B54 +rnbqkbnr/pp2pppp/3p4/8/3QP3/5N2/PPP2PPP/RNB1KB1R b KQkq - +B53 +rnbqkbnr/pp2pppp/8/2Pp4/8/8/PPP1PPPP/RNBQKBNR b KQkq - +D20* +rnbqkbnr/pp2pppp/8/2p3N1/4p3/8/PPPP1PPP/RNBQKB1R b KQkq - +A52* +rnbqkbnr/pp2pppp/8/2p5/1PPp4/5N2/P2PPPPP/RNBQKB1R b KQkq - +A57* +rnbqkbnr/pp2pppp/8/2p5/2Pp4/4PN2/PP1P1PPP/RNBQKB1R b KQkq - +A60* +rnbqkbnr/pp2pppp/8/2pp4/2P5/5N2/PP1PPPPP/RNBQKB1R b KQkq - +A56* +rnbqkbnr/pp2pppp/8/2pp4/3P4/2N5/PPP1PPPP/R1BQKBNR b KQkq - +D07* +rnbqkbnr/pp2pppp/8/2pp4/3P4/2P5/PP2PPPP/RNBQKBNR b KQkq - +D10* +rnbqkbnr/pp2pppp/8/2pp4/3P4/4P3/PPP2PPP/RNBQKBNR b KQkq - +D30* +rnbqkbnr/pp2pppp/8/2pp4/3P4/8/PPP1PPPP/RNBQKBNR w KQkq - +D06* +rnbqkbnr/pp2pppp/8/2pp4/3PP3/8/PPP2PPP/RNBQKBNR b KQkq - +D08* +rnbqkbnr/pp2pppp/8/2pp4/4P3/5N2/PPPP1PPP/RNBQKB1R b KQkq - +A51* +rnbqkbnr/pp2pppp/8/2pp4/5P2/8/PPPPP1PP/RNBQKBNR w KQkq - +A84* +rnbqkbnr/pp2pppp/8/2pp4/8/3P1N2/PPP1PPPP/RNBQKB1R b KQkq - +A53* +rnbqkbnr/pp2pppp/8/2pp4/8/5N2/PPPPPPPP/RNBQKB1R w KQkq - +A50* +rnbqkbnr/pp2pppp/8/2pp4/8/5NP1/PPPPPP1P/RNBQKB1R b KQkq - +E60* +rnbqkbnr/pp2pppp/8/2pp4/8/5NP1/PPPPPPBP/RNBQK2R b KQkq - +A08 +rnbqkbnr/pp2pppp/8/3p4/3P4/8/PPP2PPP/RNBQKBNR w KQkq - +B13 +rnbqkbnr/pp2pppp/8/8/2Pp4/p4N2/3PPPPP/RNBQKB1R w KQkq - +A58* +rnbqkbnr/pp3ppp/4p3/2pp4/2PP4/2N5/PP2PPPP/R1BQKBNR w KQkq - +D32 +rnbqkbnr/pp3ppp/4p3/2pp4/3PP3/8/PPPN1PPP/R1BQKBNR w KQkq - +C07 +rnbqkbnr/pp3ppp/8/2pp4/3P4/8/PPPN1PPP/R1BQKBNR w KQkq - +C08 +rnbqkbnr/ppp1pp1p/6p1/3p4/5P2/8/PPPPP1PP/RNBQKBNR w KQkq - +A81* +rnbqkbnr/ppp1pppp/3p4/8/3P4/8/PPP1PPPP/RNBQKBNR w KQkq - +A41 +rnbqkbnr/ppp1pppp/8/3p4/2P5/5N2/PP1PPPPP/RNBQKB1R b KQkq - +A09 +rnbqkbnr/ppp1pppp/8/3p4/2P5/8/PP1PPPPP/RNBQKBNR b KQkq - +A43* +rnbqkbnr/ppp1pppp/8/3p4/2PP4/8/PP2PPPP/RNBQKBNR b KQkq - +D06 +rnbqkbnr/ppp1pppp/8/3p4/3P4/5N2/PPP1PPPP/RNBQKB1R b KQkq - +D02 +rnbqkbnr/ppp1pppp/8/3p4/3P4/8/PPP1PPPP/RNBQKBNR b KQkq - +D00* +rnbqkbnr/ppp1pppp/8/3p4/3P4/8/PPP1PPPP/RNBQKBNR w KQkq - +D00 +rnbqkbnr/ppp1pppp/8/3p4/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +B01 +rnbqkbnr/ppp1pppp/8/3p4/5P2/8/PPPPP1PP/RNBQKBNR b KQkq - +A80* +rnbqkbnr/ppp1pppp/8/3p4/5P2/8/PPPPP1PP/RNBQKBNR w KQkq - +A03 +rnbqkbnr/ppp1pppp/8/3p4/8/3P4/PPP1PPPP/RNBQKBNR b KQkq - +A41* +rnbqkbnr/ppp1pppp/8/3p4/8/5N2/PPPPPPPP/RNBQKB1R b KQkq - +A45* +rnbqkbnr/ppp1pppp/8/3p4/8/5N2/PPPPPPPP/RNBQKB1R w KQkq - +A06 +rnbqkbnr/ppp1pppp/8/3p4/8/5NP1/PPPPPP1P/RNBQKB1R b KQkq - +A07 +rnbqkbnr/ppp1pppp/8/3p4/8/8/PPPPPPPP/RNBQKBNR w KQkq - +A40* +rnbqkbnr/ppp1pppp/8/8/2PpP3/8/PP1P1PPP/RNBQKBNR b KQkq e3 +A44* +rnbqkbnr/ppp1pppp/8/8/2pP4/5N2/PP2PPPP/RNBQKB1R b KQkq - +D21 +rnbqkbnr/ppp1pppp/8/8/2pP4/8/PP2PPPP/RNBQKBNR w KQkq - +D20 +rnbqkbnr/ppp2ppp/3p4/4p3/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - +C41 +rnbqkbnr/ppp2ppp/4p3/3p4/2PP4/2N5/PP2PPPP/R1BQKBNR b KQkq - +D31 +rnbqkbnr/ppp2ppp/4p3/3p4/2PP4/8/PP2PPPP/RNBQKBNR w KQkq - +D30 +rnbqkbnr/ppp2ppp/4p3/3p4/3PP3/2N5/PPP2PPP/R1BQKBNR b KQkq - +C10 +rnbqkbnr/ppp2ppp/4p3/3p4/3PP3/8/PPPN1PPP/R1BQKBNR b KQkq - +C03 +rnbqkbnr/ppp2ppp/4p3/3pP3/3P4/8/PPP2PPP/RNBQKBNR b KQkq - +C02 +rnbqkbnr/ppp2ppp/8/3Pp3/8/8/PPPP1PPP/RNBQKBNR b KQkq - +C21* +rnbqkbnr/ppp2ppp/8/3p4/3Np3/8/PPPPPPPP/RNBQKB1R w KQkq - +B03* +rnbqkbnr/ppp2ppp/8/3p4/3P4/8/PP2PPPP/RNBQKBNR b KQkq - +B13* +rnbqkbnr/ppp2ppp/8/3p4/3P4/8/PPP2PPP/RNBQKBNR b KQkq - +C01* +rnbqkbnr/ppp2ppp/8/3p4/3P4/8/PPP2PPP/RNBQKBNR w KQkq - +C01 +rnbqkbnr/ppp2ppp/8/3p4/3Pp3/4P3/PPP2PPP/RNBQKBNR w KQkq - +C02* +rnbqkbnr/ppp2ppp/8/3p4/4Pp2/5N2/PPPP2PP/RNBQKB1R w KQkq - +C36 +rnbqkbnr/ppp2ppp/8/3pp3/2P5/8/PP1PPPPP/RNBQKBNR w KQkq - +B21* +rnbqkbnr/ppp2ppp/8/3pp3/2PP4/8/PP2PPPP/RNBQKBNR w KQkq - +D08 +rnbqkbnr/ppp2ppp/8/3pp3/4PP2/8/PPPP2PP/RNBQKBNR w KQkq - +C31 +rnbqkbnr/ppp2ppp/8/3pp3/5P2/8/PPPPP1PP/RNBQKBNR w KQkq - +A82* +rnbqkbnr/ppp2ppp/8/3pp3/8/2P5/PP1PPPPP/RNBQKBNR w KQkq - +B12* +rnbqkbnr/ppp2ppp/8/3pp3/8/3P1N2/PPP1PPPP/RNBQKB1R b KQkq - +B09* +rnbqkbnr/ppp3pp/3p4/4Pp2/3p4/5N2/PPP2PPP/RNBQKB1R b KQkq - +C32* +rnbqkbnr/pppp1p1p/8/6p1/4Pp1P/5N2/PPPP2P1/RNBQKB1R b KQkq - +C39 +rnbqkbnr/pppp1p1p/8/6p1/4Pp2/5N2/PPPP2PP/RNBQKB1R w KQkq - +C37 +rnbqkbnr/pppp1ppp/4p3/8/2P5/8/PP1PPPPP/RNBQKBNR w KQkq - +A13 +rnbqkbnr/pppp1ppp/4p3/8/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +C00 +rnbqkbnr/pppp1ppp/8/4p3/2B1P3/8/PPPP1PPP/RNBQK1NR b KQkq - +C23 +rnbqkbnr/pppp1ppp/8/4p3/2P5/2N5/PP1PPPPP/R1BQKBNR b KQkq - +A21 +rnbqkbnr/pppp1ppp/8/4p3/2P5/8/PP1PPPPP/RNBQKBNR b KQkq - +B20* +rnbqkbnr/pppp1ppp/8/4p3/2P5/8/PP1PPPPP/RNBQKBNR w KQkq - +A20 +rnbqkbnr/pppp1ppp/8/4p3/3P4/8/PPP1PPPP/RNBQKBNR b KQkq - +B01* +rnbqkbnr/pppp1ppp/8/4p3/4P3/2N5/PPPP1PPP/R1BQKBNR b KQkq - +C25 +rnbqkbnr/pppp1ppp/8/4p3/4P3/5N2/PPPP1PPP/RNBQKB1R b KQkq - +C40 +rnbqkbnr/pppp1ppp/8/4p3/4P3/8/PPPP1PPP/RNBQKBNR b KQkq - +C20* +rnbqkbnr/pppp1ppp/8/4p3/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +C20 +rnbqkbnr/pppp1ppp/8/4p3/4PP2/8/PPPP2PP/RNBQKBNR b KQkq - +C30 +rnbqkbnr/pppp1ppp/8/4p3/8/2P5/PP1PPPPP/RNBQKBNR b KQkq - +B10* +rnbqkbnr/pppp1ppp/8/4p3/8/4P3/PPPP1PPP/RNBQKBNR b KQkq - +C00* +rnbqkbnr/pppp1ppp/8/4p3/8/5N2/PPPPPPPP/RNBQKB1R b KQkq - +B02* +rnbqkbnr/pppp1ppp/8/4p3/8/6P1/PPPPPP1P/RNBQKBNR b KQkq - +B06* +rnbqkbnr/pppp1ppp/8/4p3/8/8/PPPPPPPP/RNBQKBNR w KQkq - +B00* +rnbqkbnr/pppp1ppp/8/8/3pP3/8/PPP2PPP/RNBQKBNR w KQkq - +C21 +rnbqkbnr/pppp1ppp/8/8/4Pp2/5N2/PPPP2PP/RNBQKB1R b KQkq - +C34 +rnbqkbnr/pppp1ppp/8/8/4Pp2/8/PPPP2PP/RNBQKBNR w KQkq - +C33 +rnbqkbnr/pppp2pp/8/4pP2/8/8/PPPP1PPP/RNBQKBNR b KQkq - +C33* +rnbqkbnr/pppp2pp/8/4pp2/2P5/8/PP1PPPPP/RNBQKBNR w KQkq - +B21* +rnbqkbnr/pppp2pp/8/4pp2/3PP3/8/PPP2PPP/RNBQKBNR b KQkq - +C31* +rnbqkbnr/pppp2pp/8/4pp2/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +C30* +rnbqkbnr/ppppp1pp/8/5p2/2PP4/8/PP2PPPP/RNBQKBNR b KQkq - +A84 +rnbqkbnr/ppppp1pp/8/5p2/3P4/6P1/PPP1PP1P/RNBQKBNR b KQkq - +A81 +rnbqkbnr/ppppp1pp/8/5p2/3P4/8/PPP1PPPP/RNBQKBNR b KQkq - +A03* +rnbqkbnr/ppppp1pp/8/5p2/3P4/8/PPP1PPPP/RNBQKBNR w KQkq - +A80 +rnbqkbnr/ppppp1pp/8/5p2/3PP3/8/PPP2PPP/RNBQKBNR b KQkq - +A82 +rnbqkbnr/ppppp1pp/8/5p2/8/8/PPPPPPPP/RNBQKBNR w KQkq - +A02* +rnbqkbnr/pppppp1p/6p1/8/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +B06 +rnbqkbnr/pppppppp/8/8/2P5/8/PP1PPPPP/RNBQKBNR b KQkq - +A10 +rnbqkbnr/pppppppp/8/8/3P4/8/PPP1PPPP/RNBQKBNR b KQkq - +A40 +rnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBNR b KQkq - +B00 +rnbqkbnr/pppppppp/8/8/5P2/8/PPPPP1PP/RNBQKBNR b KQkq - +A02 +rnbqkbnr/pppppppp/8/8/8/1P6/P1PPPPPP/RNBQKBNR b KQkq - +A01 +rnbqkbnr/pppppppp/8/8/8/5N2/PPPPPPPP/RNBQKB1R b KQkq - +A04 +rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR b KQkq - +A00* +rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - +A00 +rnbqr1k1/pp1p1pp1/1bp2n1p/4p3/1P2P3/P1NP1N1P/2P1BPP1/R1BQ1RK1 b - - +C93* +rnbqr1k1/pp1p1pp1/1bp2n1p/4p3/1P2P3/P1NP1N2/2P1BPPP/R1BQ1RK1 w - - +C92* +rnbqr1k1/pp1p1pp1/1bp2n1p/4p3/1P2P3/P2P1N2/2P1BPPP/RNBQ1RK1 b - - +C94* +rnbqr1k1/pp1p1ppp/1bp2n2/4p3/1P1PP3/P1N2N2/2P1BPPP/R1BQ1RK1 b - - +C89* +rnbqr1k1/pp1p1ppp/1bp2n2/4p3/1P2P3/P1NP1N2/2P1BPPP/R1BQ1RK1 b - - +C90* +rnbqr1k1/pp3pbp/3p1np1/2pP4/4P3/2N2N2/PP2BPPP/R1BQ1RK1 w - - +A76 +rnbqr1k1/pp3pbp/3p1np1/2pP4/4P3/2N5/PP1NBPPP/R1BQ1RK1 b - - +A77 +rnbqr1k1/pp3pbp/3p1np1/2pP4/4PP2/2N2N2/PP2B1PP/R1BQK2R w KQ - +A69 +rnbqr1k1/pp3pp1/1bp2n1p/3pp3/1P2P3/P2P1N2/2P1BPPP/RNBQ1RK1 w - - +C95* +rnbqr1k1/pp3ppp/1bp2n2/3pp3/1P2P3/P1NP1N2/2P1BPPP/R1BQ1RK1 w - - +C91* +rnbqr1k1/ppb2pp1/2p2n1p/3pp3/NPP1P3/P2P1N2/2Q1BPPP/R1B2RK1 b - - +C97* +rnbqr1k1/ppbp1pp1/2p2n1p/4p3/NP2P3/P2P1N2/2P1BPPP/R1BQ1RK1 w - - +C96* +rnbqr1k1/pppp1ppp/1b3n2/4p3/1P2P3/P1N2N2/2PPBPPP/R1BQK2R w KQ - +C88* +rnbqr1k1/pppp1ppp/5n2/b3p3/4P3/P1NP1N2/1PP1BPPP/R1BQK2R b KQ - +C87* diff --git a/lasker-2.2.3/data/book/eco999.idx b/lasker-2.2.3/data/book/eco999.idx new file mode 100755 index 0000000..9cfbbea --- /dev/null +++ b/lasker-2.2.3/data/book/eco999.idx @@ -0,0 +1,2008 @@ +1rbq1rk1/1pp1ppbp/p1np1np1/8/2PPP3/2N1BP2/PP1QN1PP/R3KB1R w KQ - +E84 +2kr1b1r/ppp3pp/2n2q2/3npp2/6b1/P2PPN2/1PQNBPPP/R1B1K2R b KQ - +B99* +2kr1b1r/ppp3pp/2n5/3qpp2/6b1/3PPN2/PP2BPPP/R1BQ1RK1 w - - +B65* +2kr1b1r/pppq1ppp/2n5/3np3/6b1/P1NPPN2/1P1B1PPP/R2QKB1R b KQ - +B67* +2kr1b1r/pppq2pp/2n2n2/4pp2/1P6/P1NPPb2/3BBPPP/R2QK2R w KQ - +B69* +2kr1b1r/pppq2pp/2n5/3npp2/6b1/2NPPN2/PP2BPPP/R1BQ1RK1 w - - +B64* +2kr1b1r/pppq2pp/2n5/3npp2/6b1/P1NPPN2/1P1BBPPP/R2QK2R b KQ - +B68* +2kr3r/pppq2p1/1bn1bp2/3np2p/Q7/2NP1NP1/PP1BPPBP/R1R3K1 w - - +B79* +2kr3r/pppq2pp/2n1bp2/2bnp3/8/2NP1NP1/PP1BPPBP/R2Q1RK1 w - - +B78* +2r1kb1r/ppq2ppp/2n1pn2/2pp4/3P2b1/2P1PN2/PP1NBPPP/R1BQ1RK1 w k - +D64* +2r1kb1r/ppq2ppp/2n1pn2/3p4/3p2b1/P1P1PN2/1P1NBPPP/R1BQ1RK1 w k - +D65* +2rqk2r/pp3ppp/2n1pn2/2bp4/3N2b1/2P1P3/PP1NBPPP/R1BQ1RK1 b k - +D67* +2rqk2r/pp3ppp/2nbpn2/2pp4/3P2b1/2P1PN2/PP1NBPPP/R1BQ1RK1 w k - +D66* +2rqkb1r/pp3ppp/2n1pn2/2pp4/3P2b1/4PN2/PPPNBPPP/R1BQ1RK1 w k - +D63* +2rqkbnr/pp3ppp/2n1p3/2pp4/3P2b1/4PN2/PPP1BPPP/RNBQ1RK1 w k - +D54* +3q1rk1/pp3ppp/2r1p3/2b5/4Q3/2P5/PP3PPP/R1B2RK1 b - - +D69* +3q1rk1/pp3ppp/2r1pn2/2bp4/4P3/2P5/PP1NQPPP/R1B2RK1 b - - +D68* +r1b1k2r/1pqnbppp/p2ppn2/6B1/3NPP2/2N2Q2/PPP3PP/2KR1B1R w kq - +B99 +r1b1kb1r/1pq2ppp/p1nppn2/8/3NPP2/2N5/PPP1B1PP/R1BQ1RK1 w kq - +B85 +r1b1kb1r/pp2pppp/1qn2n2/2pp4/3P4/5NP1/PPP1PPBP/RNBQK2R w KQkq - +D96* +r1b1kb1r/pp3ppp/1qn1pn2/2pp4/3P4/5NP1/PPP1PPBP/RNBQ1RK1 w kq - +D95* +r1b1kb1r/pp3ppp/2n2n2/2qpp1B1/8/5NP1/PPP1PPBP/RN1Q1RK1 b kq - +D98* +r1b1kb1r/pp3ppp/2n2n2/2qpp3/8/5NP1/PPP1PPBP/RNBQ1RK1 w kq - +D97* +r1b1kbnr/1pq1pppp/p1n5/1Bpp4/3P4/4PN2/PPP2PPP/RNBQK2R w KQkq - +E36* +r1b1kbnr/1pq1pppp/p7/2ppN3/3P4/4P3/PPP2PPP/RNBQK2R w KQkq - +E37* +r1b1kbnr/1pqp1ppp/p1n1p3/8/3NP3/2N1B3/PPP1BPPP/R2QK2R b KQkq - +B49 +r1b1kbnr/pp2pppp/1qn5/1Bp5/2p5/2N1PN2/PP1P1PPP/R1BQK2R b KQkq - +E23* +r1b1kbnr/pp2pppp/1qn5/1Bpp4/8/4PN2/PPPP1PPP/RNBQK2R w KQkq - +E22* +r1b1kbnr/pp2pppp/1qn5/2pp4/3P4/5NP1/PPP1PP1P/RNBQKB1R w KQkq - +D81* +r1b1kbnr/ppq1pppp/2n5/1B1p4/3P4/5N2/PPP2PPP/RNBQK2R b KQkq - +E35* +r1b1kbnr/ppq1pppp/2n5/1Bp5/2p5/4PN2/PP1P1PPP/RNBQ1RK1 b kq - +E39* +r1b1kbnr/ppq1pppp/2n5/1Bpp4/2P5/4PN2/PP1P1PPP/RNBQK2R b KQkq - +E38* +r1b1kbnr/ppq1pppp/2n5/1Bpp4/3P4/4PN2/PPP2PPP/RNBQK2R b KQkq - +E34* +r1b1kbnr/ppq1pppp/2n5/1Bpp4/8/2N1PN2/PPPP1PPP/R1BQK2R b KQkq - +E33* +r1b1kbnr/ppq1pppp/2n5/1Bpp4/8/4PN2/PPPP1PPP/RNBQK2R w KQkq - +E32* +r1b1kbnr/ppqp1ppp/2n1p3/8/3NP3/2N1B3/PPP2PPP/R2QKB1R b KQkq - +B48 +r1b1kbnr/ppqp1ppp/2n1p3/8/3NP3/2N5/PPP2PPP/R1BQKB1R w KQkq - +B47 +r1b2rk1/1p2qppp/2n1pn2/pBbp4/5B2/2P1PN2/PP3PPP/RN1Q1RK1 w - - +D19* +r1b2rk1/2q1bppp/p1np1n2/1pp1p3/3PP3/2P2N1P/PPBN1PP1/R1BQR1K1 w - - +C98 +r1b2rk1/2q1bppp/p2p1n2/np2p3/3PP3/5N1P/PPBN1PP1/R1BQR1K1 b - - +C99 +r1b2rk1/2q1bppp/p2p1n2/npp1p3/3PP3/2P2N1P/PPB2PP1/RNBQR1K1 w - - +C97 +r1b2rk1/pp1nqppp/2p5/4p3/2BP4/2R1PN2/PP3PPP/3Q1RK1 w - - +D68 +r1b2rk1/pp2ppbp/2q2np1/2pp4/8/1P2P3/PBPPBPPP/RN1Q1RK1 w - - +E19* +r1b2rk1/pp3ppp/2p5/4q3/2B5/2R1P3/PP3PPP/3Q1RK1 w - - +D69 +r1b2rk1/ppq1ppbp/2n2np1/2pp4/5P2/3PPN2/PPP1B1PP/RNB1QRK1 w - - +A98* +r1b2rk1/ppqnppbp/5np1/2pp4/3P4/2P1PN2/PP1NBPPP/R1BQ1RK1 w - - +E09* +r1bq1rk1/1p1n1pbp/2pp1np1/p3p3/2PPP3/2N2N2/PP3PPP/R1BQRBK1 w - - +E96 +r1bq1rk1/1p1nbppp/p1p1pn2/3P2B1/3P4/2N1PN2/PPQ2PPP/2R1KB1R b K - +D65 +r1bq1rk1/1p1nppbp/2n3p1/p7/2Pp4/P2P1NP1/1P1N1PBP/R1BQR1K1 b - - +A64* +r1bq1rk1/1p2bppp/2n2n2/p3p1B1/2Pp4/P2P1NP1/1P3PBP/RN1Q1RK1 b - - +A75* +r1bq1rk1/1p3ppp/p1n1pn2/1BbP4/8/2N1PN2/PP3PPP/R1BQ1RK1 b - - +E57* +r1bq1rk1/1pp1ppbp/p1np1np1/8/2PP4/2N2NP1/PP2PPBP/R1BQ1RK1 w - - +E63 +r1bq1rk1/2p1bpp1/p1np1n1p/1p2p3/4P3/1BP2N1P/PP1P1PP1/RNBQR1K1 w - - +C93 +r1bq1rk1/2p1bppp/p1n2n2/1p1pp3/4P3/1BP2N2/PP1P1PPP/RNBQR1K1 w - - +C89 +r1bq1rk1/2p1bppp/p1np1n2/1p2p3/3PP3/1BP2N2/PP3PPP/RNBQR1K1 b - - +C91 +r1bq1rk1/2p1bppp/p1np1n2/1p2p3/4P3/1BP2N1P/PP1P1PP1/RNBQR1K1 b - - +C92 +r1bq1rk1/2p1bppp/p1np1n2/1p2p3/4P3/1BP2N2/PP1P1PPP/RNBQR1K1 w - - +C90 +r1bq1rk1/2p1bppp/p2p1n2/np2p3/4P3/2P2N1P/PPBP1PP1/RNBQR1K1 b - - +C96 +r1bq1rk1/5ppp/p1p1pn2/2bp4/2P5/2N1PN2/PP3PPP/R1BQ1RK1 w - - +E59* +r1bq1rk1/5ppp/p1pbpn2/2pp4/2PP4/2N1PN2/PP3PPP/R1BQ1RK1 w - - +E58* +r1bq1rk1/p3ppbp/1pn2np1/2pp4/5P2/3PPN2/PPP1B1PP/RNB1QRK1 w - - +A99* +r1bq1rk1/pp1n1pbp/2pp1np1/4p3/2PPP3/2N2NPP/PP3PB1/R1BQ1RK1 b - - +E69 +r1bq1rk1/pp1n1pbp/3p1np1/2pP4/8/2N2NP1/PP2PPBP/R1BQ1RK1 w - - +A63 +r1bq1rk1/pp1n1ppp/4pn2/2p5/1bBP4/2N1PN2/PP3PPP/R1BQ1RK1 w - - +E55 +r1bq1rk1/pp1nb1pp/2n2p2/4p3/2Pp4/3P1NP1/PPN2PBP/R1BQR1K1 b - - +A79* +r1bq1rk1/pp1nbppp/2n5/4p3/2Pp4/3P1NP1/PP3PBP/RNBQR1K1 w - - +A77* +r1bq1rk1/pp1nbppp/2n5/4p3/2Pp4/N2P1NP1/PP3PBP/R1BQR1K1 b - - +A78* +r1bq1rk1/pp1nbppp/2p1p3/3n2B1/2BP4/2N1PN2/PP3PPP/2RQK2R w K - +D67 +r1bq1rk1/pp1nbppp/2p1pn2/3p2B1/2PP4/2N1PN2/PPQ2PPP/2R1KB1R b K - +D64 +r1bq1rk1/pp1nbppp/2p1pn2/3p2B1/2PP4/2NBPN2/PP3PPP/2RQK2R b K - +D66 +r1bq1rk1/pp1nbppp/2p1pn2/3p4/2PP4/5NP1/PPQNPPBP/R1B2RK1 b - - +E09 +r1bq1rk1/pp1nbppp/4pn2/2Pp2B1/2P5/2N1PN2/PPQ2PPP/R3KB1R b KQ - +D62 +r1bq1rk1/pp1p1ppp/2n1pn2/2p5/2PP4/P1PBP3/5PPP/R1BQK1NR w KQ - +E29 +r1bq1rk1/pp1pppbp/2n2np1/2p5/2PP4/2N2NP1/PP2PPBP/R1BQ1RK1 b - - +A39 +r1bq1rk1/pp2bppp/2n2n2/2ppp3/4P3/2NP1NP1/PPP2PBP/R1BQ1RK1 b - - +E97* +r1bq1rk1/pp2bppp/2n2n2/2ppp3/4P3/3P1NP1/PPP2PBP/RNBQ1RK1 w - - +E94* +r1bq1rk1/pp2bppp/2n2n2/4p3/2Pp4/3P1NP1/PP3PBP/RNBQ1RK1 w - - +A73* +r1bq1rk1/pp2bppp/2n2n2/4p3/2Pp4/3P1NP1/PP3PBP/RNBQR1K1 b - - +A76* +r1bq1rk1/pp2bppp/2n2n2/4p3/2Pp4/P2P1NP1/1P3PBP/RNBQ1RK1 b - - +A74* +r1bq1rk1/pp2bppp/2nppn2/6B1/3NPP2/2N5/PPPQ2PP/2KR1B1R b - - +B64 +r1bq1rk1/pp2bppp/3ppn2/6B1/3QPP2/2N5/PPP3PP/2KR1B1R b - - +B65 +r1bq1rk1/pp2ppbp/2n2np1/2p5/2Pp4/2NP1NP1/PP2PPBP/R1BQ1RK1 w - - +E66* +r1bq1rk1/pp2ppbp/2n2np1/2pp4/2P5/2N2NP1/PP1PPPBP/R1BQ1RK1 w - - +A39* +r1bq1rk1/pp2ppbp/2n2np1/2pp4/2P5/3P1NP1/PP2PPBP/RNBQ1RK1 w - - +E65* +r1bq1rk1/pp2ppbp/2n2np1/2pp4/3P1P2/2P1PN2/PP2B1PP/RNBQ1RK1 b - - +A95* +r1bq1rk1/pp2ppbp/2n2np1/2pp4/5P2/2NP1NP1/PPP1P1BP/R1BQ1RK1 b - - +A89* +r1bq1rk1/pp2ppbp/2n2np1/2pp4/5P2/2PP1NP1/PP2P1BP/RNBQ1RK1 b - - +A88* +r1bq1rk1/pp2ppbp/2n2np1/2pp4/5P2/3PPN2/PPP1B1PP/RNB1QRK1 b - - +A97* +r1bq1rk1/pp2ppbp/2n2np1/2pp4/8/1P2PN2/PBPPBPPP/RN1Q1RK1 w - - +E18* +r1bq1rk1/pp2ppbp/2n2np1/2pp4/8/P1NP1NP1/1PP1PPBP/R1BQ1RK1 b - - +E63* +r1bq1rk1/pp2ppbp/2n2np1/8/2Pp4/3P1NP1/PP1N1PBP/R1BQ1RK1 b - - +A63* +r1bq1rk1/pp2ppbp/2n3p1/8/2BPP3/4B3/P3NPPP/R2Q1RK1 b - - +D88 +r1bq1rk1/pp2ppbp/2np1np1/2pP4/2P5/2N2NP1/PP2PPBP/R1BQ1RK1 b - - +E66 +r1bq1rk1/pp2ppbp/2np1np1/8/2BNP3/2N1BP2/PPPQ2PP/R3K2R b KQ - +B77 +r1bq1rk1/pp2ppbp/2np1np1/8/2PNPP2/2N1B3/PP2B1PP/R2QK2R b KQ - +E79 +r1bq1rk1/pp2ppbp/2np1np1/8/4P3/1NN1B3/PPP1BPPP/R2Q1RK1 b - - +B74 +r1bq1rk1/pp3pb1/2n2npp/2ppp3/4P3/2PP1NP1/PP1N1PBP/R1BQ1RK1 w - - +E69* +r1bq1rk1/pp3pbp/2n2np1/2ppp3/4P3/3P1NP1/PPPN1PBP/R1BQ1RK1 w - - +E68* +r1bq1rk1/pp3ppp/2n1pn2/1Bbp4/2P5/4PN2/PP1N1PPP/R1BQ1RK1 b - - +E55* +r1bq1rk1/pp3ppp/2n1pn2/1Bbp4/2P5/4PN2/PP3PPP/RNBQ1RK1 w - - +E54* +r1bq1rk1/pp3ppp/2n1pn2/2p5/2BP4/P1P1PN2/5PPP/R1BQ1RK1 b - - +E59 +r1bq1rk1/pp3ppp/2n1pn2/2pp4/1bPP4/2NBPN2/PP3PPP/R1BQ1RK1 w - - +E56 +r1bq1rk1/pp3ppp/2n1pn2/2pp4/2PP4/P1PBPN2/5PPP/R1BQ1RK1 b - - +E58 +r1bq1rk1/pp3ppp/2n1pn2/8/1bBp4/P1N1PN2/1P3PPP/R1BQ1RK1 w - - +E57 +r1bq1rk1/pp3ppp/2nbpn2/1Bpp4/2PP4/2N1PN2/PP3PPP/R1BQ1RK1 b - - +E56* +r1bq1rk1/ppp1b1pp/2n5/3npp2/8/P1NPPN2/1PQ2PPP/R1B1KB1R b KQ - +B85* +r1bq1rk1/ppp1npbp/3p1np1/3Pp3/2P1P3/2N5/PP2BPPP/R1BQNRK1 b - - +E98 +r1bq1rk1/ppp1p1bp/2np1np1/5p2/2PP4/2N2NP1/PP2PPBP/R1BQ1RK1 w - - +A89 +r1bq1rk1/ppp1ppbp/2np1np1/8/2PPP3/2N1BP2/PP4PP/R2QKBNR w KQ - +E83 +r1bq1rk1/ppp2pbp/2np1np1/4p3/2PPP3/2N2N2/PP2BPPP/R1BQ1RK1 w - - +E97 +r1bq1rk1/pppn1pbp/3p1np1/3Pp3/2P1P3/2N2N2/PP2BPPP/R1BQK2R w KQ - +E93 +r1bq1rk1/pppn1pbp/3p1np1/4p3/2PPP3/2N2N2/PP2BPPP/R1BQR1K1 b - - +E95 +r1bq1rk1/pppn1pbp/3p1np1/4p3/2PPP3/2N2NP1/PP3PBP/R1BQ1RK1 b - - +E68 +r1bq1rk1/pppnbppp/4pn2/3p2B1/2PP4/2N1PN2/PP3PPP/2RQKB1R b K - +D63 +r1bq1rk1/pppnbppp/4pn2/3p2B1/2PP4/2N1PN2/PP3PPP/R2QKB1R w KQ - +D60 +r1bq1rk1/pppnbppp/4pn2/3p2B1/2PP4/2N1PN2/PPQ2PPP/R3KB1R b KQ - +D61 +r1bq1rk1/pppnbppp/4pn2/3p4/2PP4/5NP1/PP2PPBP/RNBQ1RK1 w - - +E07 +r1bq1rk1/pppnbppp/4pn2/3p4/2PP4/5NP1/PPQ1PPBP/RNB2RK1 b - - +E08 +r1bq1rk1/pppnn1bp/3p2p1/3Ppp2/2P1P3/2N2P2/PP2B1PP/R1BQNRK1 w - - +E99 +r1bq1rk1/pppnppbp/3p1np1/8/2PP4/2N2NP1/PP2PPBP/R1BQK2R w KQ - +E67 +r1bqk1nr/5ppp/p1pbp3/2pp4/2P5/2N1PN2/PP1P1PPP/R1BQ1RK1 b kq - +E29* +r1bqk1nr/5ppp/p1pbp3/2pp4/3P4/4PN2/PPP2PPP/RNBQ1RK1 w kq - +E49* +r1bqk1nr/p4ppp/2p5/2bpp3/8/6P1/PPP1PPBP/RNBQK2R w KQkq - +D86* +r1bqk1nr/pp1pppbp/2n3p1/2p5/2P5/2N2NP1/PP1PPPBP/R1BQK2R b KQkq - +A37 +r1bqk1nr/pp1pppbp/2n3p1/8/2PNP3/4B3/PP3PPP/RN1QKB1R b KQkq - +B38 +r1bqk1nr/pp1pppbp/2n3p1/8/2PNP3/8/PP3PPP/RNBQKB1R w KQkq - +B37 +r1bqk1nr/pp2b1pp/2n5/2pppp2/8/3P1NP1/PPP1PPBP/RNBQ1RK1 w kq - +E77* +r1bqk1nr/pp2bppp/2n5/2ppp3/8/3P1NP1/PPP1PPBP/RNBQK2R w KQkq - +E73* +r1bqk1nr/pp2ppbp/2np2p1/2p5/4P3/2NP2P1/PPP2PBP/R1BQK1NR b KQkq - +A26* +r1bqk1nr/pp2ppbp/2np2p1/2p5/4P3/2NP2P1/PPP2PBP/R1BQK1NR w KQkq - +B25 +r1bqk1nr/pp2ppbp/2np2p1/2p5/4P3/2NPB1P1/PPP2PBP/R2QK1NR b KQkq - +B26 +r1bqk1nr/pp3ppp/2nbp3/1Bpp4/3P4/4PN2/PPP2PPP/RNBQ1RK1 b kq - +E48* +r1bqk1nr/pp3ppp/2nbp3/1Bpp4/8/4PN2/PPPP1PPP/RNBQ1RK1 w kq - +E47* +r1bqk1nr/pp4pp/2n5/4pp2/1bPp4/3P1NP1/PP3PBP/RNBQK2R w KQkq - +A67* +r1bqk1nr/ppp2pbp/2np2p1/4p3/2P5/2NP2P1/PP2PPBP/R1BQK1NR b KQkq - +B25* +r1bqk1nr/ppp2pbp/2np2p1/4p3/2P5/2NP2P1/PP2PPBP/R1BQK1NR w KQkq - +A26 +r1bqk1nr/pppp1ppp/2n5/1Bb1p3/4P3/5N2/PPPP1PPP/RNBQK2R w KQkq - +C64 +r1bqk1nr/pppp1ppp/2n5/2b1N3/4P3/8/PPPP1PPP/RNBQKB1R b KQkq - +C27* +r1bqk1nr/pppp1ppp/2n5/2b1p3/1PB1P3/5N2/P1PP1PPP/RNBQK2R b KQkq - +C51 +r1bqk1nr/pppp1ppp/2n5/2b1p3/2B1P3/2P2N2/PP1P1PPP/RNBQK2R b KQkq - +C53 +r1bqk1nr/pppp1ppp/2n5/2b1p3/4P3/2N2N2/PPPP1PPP/R1BQKB1R b KQkq - +C28* +r1bqk1nr/pppp1ppp/2n5/b3p3/2B1P3/2P2N2/P2P1PPP/RNBQK2R w KQkq - +C52 +r1bqk2r/1pp1bppp/p1np1n2/4p3/B3P3/5N2/PPPP1PPP/RNBQR1K1 w kq - +C87 +r1bqk2r/1pp1bppp/p1p2n2/4p3/4P3/5N2/PPPP1PPP/RNBQ1RK1 w kq - +C85 +r1bqk2r/1pppbppp/p1n2n2/4p3/B3P3/5N2/PPPP1PPP/RNBQ1RK1 w kq - +C84 +r1bqk2r/1pppbppp/p1n2n2/4p3/B3P3/5N2/PPPPQPPP/RNB2RK1 b kq - +C86 +r1bqk2r/2ppbppp/p1n2n2/1p2p3/4P3/1B3N2/PPPP1PPP/RNBQR1K1 b kq - +C88 +r1bqk2r/p3nppp/2p5/2bpp3/2P5/6P1/PP2PPBP/RNBQ1RK1 b kq - +D87* +r1bqk2r/pp1nnppp/3b4/3p4/3Pp3/2N1P3/PP1N1PPP/R1BQKB1R w KQkq - +C06* +r1bqk2r/pp1p1ppp/2n1pn2/2P5/1bP5/1QN5/PP2PPPP/R1B1KBNR w KQkq - +E23 +r1bqk2r/pp1pppbp/2n2np1/2p5/2P5/2N2NP1/PP1PPPBP/R1BQK2R b KQkq - +A38* +r1bqk2r/pp1pppbp/2n2np1/2p5/2P5/2N2NP1/PP1PPPBP/R1BQK2R w KQkq - +A38 +r1bqk2r/pp1pppbp/2n2np1/2p5/2P5/2N3P1/PP1PPPBP/R1BQK1NR w KQkq - +A37* +r1bqk2r/pp1pppbp/2n2np1/8/2BNP3/2N1B3/PPP2PPP/R2QK2R b KQkq - +B35 +r1bqk2r/pp1pppbp/2n3p1/8/2PNP1n1/2N1B3/PP3PPP/R2QKB1R w KQkq - +B39 +r1bqk2r/pp2b1pp/2n2n2/2pppp2/2P5/3P1NP1/PP2PPBP/RNBQ1RK1 w kq - +E78* +r1bqk2r/pp2b1pp/2n2n2/4pp2/2Pp4/3P1NP1/PP3PBP/RNBQR1K1 b kq - +A69* +r1bqk2r/pp2bppp/2n2n2/2p1p3/3pP3/3P1NP1/PPPN1PBP/R1BQ1RK1 b kq - +E93* +r1bqk2r/pp2bppp/2n2n2/2pp4/3P4/2N2NP1/PP2PPBP/R1BQK2R w KQkq - +D34 +r1bqk2r/pp2bppp/2n2n2/2ppp3/4P3/3P1NP1/PPP2PBP/RNBQ1RK1 b kq - +E92* +r1bqk2r/pp2bppp/2n2n2/2ppp3/8/3P1NP1/PPP1PPBP/RNBQ1RK1 w kq - +E91* +r1bqk2r/pp2bppp/2n2n2/4p3/2Pp4/3P1NP1/PP3PBP/RNBQ1RK1 b kq - +A72* +r1bqk2r/pp2bppp/2n2n2/4p3/2Pp4/3P1NP1/PP3PBP/RNBQK2R w KQkq - +A71* +r1bqk2r/pp2ppbp/2n2np1/2pp4/2P5/3P1NP1/PP2PPBP/RNBQ1RK1 b kq - +E64* +r1bqk2r/pp2ppbp/2n2np1/2pp4/8/3P1NP1/PPPNPPBP/R1BQ1RK1 b kq - +E67* +r1bqk2r/pp2ppbp/2n2np1/3p4/2PP4/2N2N2/PP2BPPP/R1BQK2R b KQkq - +D34* +r1bqk2r/pp2ppbp/2n2np1/8/2Pp4/3P1NP1/PP3PBP/RNBQ1RK1 b kq - +A62* +r1bqk2r/pp2ppbp/2np1np1/8/3NP3/2N1B3/PPP1BPPP/R2Q1RK1 b kq - +B73 +r1bqk2r/pp3ppp/2n1pn2/2bp4/8/2P1PN2/PP1N1PPP/R1BQKB1R w KQkq - +D47* +r1bqk2r/pp3ppp/2nbpn2/1Bpp4/2PP4/4PN2/PP3PPP/RNBQ1RK1 b kq - +E53* +r1bqk2r/pp3ppp/2nbpn2/1Bpp4/3P4/1P2PN2/P1P2PPP/RNBQ1RK1 b kq - +E52* +r1bqk2r/pp3ppp/2nbpn2/2pp4/3P4/2P1PN2/PP1N1PPP/R1BQKB1R w KQkq - +D46* +r1bqk2r/pp3ppp/2nbpn2/3p4/1P6/P1P1PN2/3N1PPP/R1BQKB1R b KQkq - +D48* +r1bqk2r/pp3ppp/2nbpn2/3p4/2PN4/2N1P3/PP3PPP/R1BQKB1R w KQkq - +D42* +r1bqk2r/pp3ppp/3b1n2/3P4/1n2p3/P3PN2/3N1PPP/R1BQKB1R w KQkq - +D49* +r1bqk2r/ppp1bppp/1nn5/4p3/4P3/2NP1N2/PP3PPP/R1BQKB1R w KQkq - +B59* +r1bqk2r/ppp1bppp/2n5/3np3/8/2NP1N2/PP2PPPP/R1BQKB1R w KQkq - +B58* +r1bqk2r/ppp1bppp/2n5/3np3/8/3PPN2/PP3PPP/RNBQKB1R w KQkq - +B83* +r1bqk2r/ppp1bppp/2n5/3np3/8/P2P1N2/1P2PPPP/RNBQKB1R w KQkq - +B92* +r1bqk2r/ppp1bppp/2n5/3np3/8/P2PPN2/1P3PPP/RNBQKB1R b KQkq - +B84* +r1bqk2r/ppp2ppp/1bn5/3np3/1P6/P2PPN2/5PPP/RNBQKB1R b KQkq - +B87* +r1bqk2r/ppp2ppp/2n5/2bnp3/8/2NP1N2/PP2PPPP/R1BQKB1R w KQkq - +B57* +r1bqk2r/ppp2ppp/2n5/2bnp3/8/2NPPN2/PP3PPP/R1BQKB1R b KQkq - +B88* +r1bqk2r/ppp2ppp/2n5/2bnp3/8/3PPN2/PP3PPP/RNBQKB1R w KQkq - +B86* +r1bqk2r/pppp1ppp/2n1pn2/8/1bPP4/2N5/PPQ1PPPP/R1B1KBNR w KQkq - +E33 +r1bqk2r/pppp1ppp/2n2n2/1B2p3/1b2P3/2N2N2/PPPP1PPP/R1BQK2R b KQkq - +C49* +r1bqk2r/pppp1ppp/2n2n2/1B2p3/1b2P3/2N2N2/PPPP1PPP/R1BQK2R w KQkq - +C49 +r1bqk2r/pppp1ppp/2n2n2/2b5/2BPP3/5N2/PP3PPP/RNBQK2R b KQkq - +C54 +r1bqk2r/pppp1ppp/2n2n2/4p3/1b2P3/2N2N2/PPPP1PPP/R1BQKB1R w KQkq - +C48* +r1bqkb1r/1p2pppp/2n2n2/p1Pp4/5B2/2P2N2/PP2PPPP/RN1QKB1R b KQkq - +D17* +r1bqkb1r/1p2pppp/2n2n2/p1Pp4/8/2P2N2/PP2PPPP/RNBQKB1R w KQkq - +D16* +r1bqkb1r/1p3ppp/2n1pn2/p1Pp4/5B2/2P2N2/PP2PPPP/RN1QKB1R w KQkq - +D18* +r1bqkb1r/1p3ppp/p1nppn2/6B1/3NP3/2N5/PPPQ1PPP/R3KB1R w KQkq - +B66 +r1bqkb1r/1pp2ppp/p1np1n2/4p3/B3P3/5N2/PPPP1PPP/RNBQ1RK1 w kq - +C79 +r1bqkb1r/1ppp1ppp/p1n2n2/4p3/B3P3/5N2/PPPP1PPP/RNBQ1RK1 b kq - +C78 +r1bqkb1r/1ppp1ppp/p1n2n2/4p3/B3P3/5N2/PPPP1PPP/RNBQK2R w KQkq - +C77 +r1bqkb1r/1ppp1ppp/p1n5/4p3/B3n3/5N2/PPPP1PPP/RNBQ1RK1 w kq - +C80 +r1bqkb1r/3n1ppp/p1p1pn2/1p6/3P4/2NBPN2/PP3PPP/R1BQK2R w KQkq - +D48 +r1bqkb1r/3n1ppp/p3pn2/1N2P3/3p4/3B1N2/PP3PPP/R1BQK2R b KQkq - +D49 +r1bqkb1r/p4pp1/2p2n1p/n3p1N1/8/8/PPPPBPPP/RNBQK2R w KQkq - +C59 +r1bqkb1r/pp1n1ppp/2n1p3/3pP3/3P4/3B4/PP1NNPPP/R1BQK2R b KQkq - +C06 +r1bqkb1r/pp1n1ppp/2p1pn2/3p2B1/2PP4/2N1PN2/PP3PPP/R2QKB1R b KQkq - +D52 +r1bqkb1r/pp1n1ppp/2p1pn2/3p4/2PP4/2NBPN2/PP3PPP/R1BQK2R b KQkq - +D46 +r1bqkb1r/pp1n1ppp/2p1pn2/8/2BP4/2N1PN2/PP3PPP/R1BQK2R b KQkq - +D47 +r1bqkb1r/pp1p1ppp/2n1pn2/8/2PN4/2N5/PP2PPPP/R1BQKB1R w KQkq - +A33 +r1bqkb1r/pp1ppp1p/2n2np1/2p5/4P3/2N2N2/PPPP1PPP/R1BQKB1R w KQkq - +A29* +r1bqkb1r/pp1ppppp/2n2n2/2p5/4P3/2N2N2/PPPP1PPP/R1BQKB1R b KQkq - +A28* +r1bqkb1r/pp1ppppp/2n2n2/2p5/4P3/2N5/PPPP1PPP/R1BQKBNR w KQkq - +A27* +r1bqkb1r/pp2nppp/2n1p3/1Bpp4/2P5/4PN2/PP1P1PPP/RNBQK2R w KQkq - +E42* +r1bqkb1r/pp2nppp/2n1p3/1Bpp4/8/1P2PN2/P1PP1PPP/RNBQK2R w KQkq - +E44* +r1bqkb1r/pp2nppp/2n1p3/1Bpp4/8/BP2PN2/P1PP1PPP/RN1QK2R b KQkq - +E45* +r1bqkb1r/pp2pp1p/2n2np1/2pp4/8/3P1NP1/PPP1PPBP/RNBQK2R w KQkq - +E62* +r1bqkb1r/pp2pp1p/2n2np1/3p4/2PP4/2N5/PP3PPP/R1BQKBNR w KQkq - +D33* +r1bqkb1r/pp2pppp/2n2n2/1Bpp4/3P4/4PN2/PPP2PPP/RNBQK2R b KQkq - +D38* +r1bqkb1r/pp2pppp/2n2n2/1Bpp4/8/4PN2/PPPP1PPP/RNBQK2R w KQkq - +E21* +r1bqkb1r/pp2pppp/2n2n2/2Pp4/8/5N2/PPP1PPPP/RNBQKB1R w KQkq - +D24* +r1bqkb1r/pp2pppp/2n2n2/2pp4/2PP4/4PN2/PP3PPP/RNBQKB1R b KQkq - +D40* +r1bqkb1r/pp2pppp/2n2n2/2pp4/3P4/2P1PN2/PP3PPP/RNBQKB1R b KQkq - +D43* +r1bqkb1r/pp2pppp/2n2n2/2pp4/3P4/2P2N2/PP2PPPP/RNBQKB1R w KQkq - +D15* +r1bqkb1r/pp2pppp/2n2n2/2pp4/3P4/4PN2/PPP2PPP/RNBQKB1R w KQkq - +D37* +r1bqkb1r/pp2pppp/2n2n2/2pp4/3P4/5NP1/PPP1PP1P/RNBQKB1R w KQkq - +D90* +r1bqkb1r/pp2pppp/2n2n2/2pp4/4P3/3P1N2/PPP2PPP/RNBQKB1R w KQkq - +A54* +r1bqkb1r/pp2pppp/2n2n2/3p4/2Pp4/4PN2/PP3PPP/RNBQKB1R w KQkq - +D41* +r1bqkb1r/pp2pppp/2n2n2/8/2Pp4/3P1NP1/PP3P1P/RNBQKB1R b KQkq - +A61* +r1bqkb1r/pp2pppp/2n5/2pn4/8/2N1PN2/PP1P1PPP/R1BQKB1R b KQkq - +A33* +r1bqkb1r/pp2pppp/2np1n2/6B1/3NP3/2N5/PPP2PPP/R2QKB1R b KQkq - +B60 +r1bqkb1r/pp2pppp/2np1n2/8/2BNP3/2N5/PPP2PPP/R1BQK2R b KQkq - +B57 +r1bqkb1r/pp2pppp/2np1n2/8/3NP3/2N5/PPP1BPPP/R1BQK2R b KQkq - +B58 +r1bqkb1r/pp3ppp/2n1p3/2pn4/3P4/2NBPN2/PP3PPP/R1BQK2R b KQkq - +D42 +r1bqkb1r/pp3ppp/2n1pn2/1Bpp4/3P4/4PN2/PPP2PPP/RNBQ1RK1 b kq - +E51* +r1bqkb1r/pp3ppp/2n1pn2/1Bpp4/8/4PN2/PPPP1PPP/RNBQ1RK1 w kq - +E50* +r1bqkb1r/pp3ppp/2n1pn2/2pp4/3P4/2P1PN2/PP3PPP/RNBQKB1R w KQkq - +D45* +r1bqkb1r/pp3ppp/2n1pn2/2pp4/3P4/5NP1/PPP1PPBP/RNBQK2R w KQkq - +D94* +r1bqkb1r/pp3ppp/2n2n2/2ppp3/4P3/3P1N2/PPPN1PPP/R1BQKB1R w KQkq - +A55* +r1bqkb1r/pp3ppp/2n2n2/2ppp3/8/3P1NP1/PPP1PPBP/RNBQK2R w KQkq - +E90* +r1bqkb1r/pp3ppp/2n2n2/4p3/2Pp4/3P1NP1/PP3P1P/RNBQKB1R w KQkq - +A70* +r1bqkb1r/pp3ppp/2np1n2/4p3/4P3/1NN5/PPP1BPPP/R1BQK2R b KQkq - +B59 +r1bqkb1r/pp3ppp/2nppn2/6B1/3NP3/2N5/PPP2PPP/R2QKB1R w KQkq - +B62 +r1bqkb1r/pp3ppp/2nppn2/6B1/3NP3/2N5/PPPQ1PPP/R3KB1R b KQkq - +B63 +r1bqkb1r/pp3ppp/2nppn2/8/2BNP3/2N1B3/PPP2PPP/R2QK2R b KQkq - +B89 +r1bqkb1r/pp3ppp/2nppn2/8/2BNP3/2N5/PPP2PPP/R1BQK2R w KQkq - +B88 +r1bqkb1r/pp4pp/2n2n2/4pp2/2Pp4/3P1NP1/PP3PBP/RNBQ1RK1 b kq - +A68* +r1bqkb1r/ppp2p1p/2n3p1/3np3/8/P2P1N2/1P2PPPP/RNBQKB1R w KQkq - +B91* +r1bqkb1r/ppp2p1p/2n5/3np1p1/8/3PPN2/PP3PPP/RNBQKB1R w KQkq - +B81* +r1bqkb1r/ppp2pp1/5nn1/3p3p/8/2P3BP/PP1NPPP1/R2QKBNR b KQkq - +B19* +r1bqkb1r/ppp2ppp/2n1pn2/3p4/3PP3/5N2/PPPN1PPP/R1BQKB1R w KQkq - +C04 +r1bqkb1r/ppp2ppp/2n2n2/3pp3/4P3/2N2N2/PPPP1PPP/R1BQKB1R w KQkq - +C47* +r1bqkb1r/ppp2ppp/2n2n2/3pp3/8/3P1NP1/PPP1PP1P/RNBQKB1R w KQkq - +B07* +r1bqkb1r/ppp2ppp/2n5/3np3/8/2N1P3/PP1P1PPP/R1BQKBNR w KQkq - +B45* +r1bqkb1r/ppp2ppp/2n5/3np3/8/2N1P3/PPQP1PPP/R1B1KBNR b KQkq - +B47* +r1bqkb1r/ppp2ppp/2n5/3np3/8/3P1N2/PP2PPPP/RNBQKB1R w KQkq - +B56* +r1bqkb1r/ppp2ppp/2n5/3np3/8/3P1NP1/PP2PP1P/RNBQKB1R b KQkq - +B70* +r1bqkb1r/ppp2ppp/2n5/3np3/8/3PPN2/PP3PPP/RNBQKB1R b KQkq - +B80* +r1bqkb1r/ppp2ppp/2n5/3np3/8/P1N1P3/1P1P1PPP/R1BQKBNR b KQkq - +B46* +r1bqkb1r/ppp2ppp/2n5/3np3/8/P2P1N2/1P2PPPP/RNBQKB1R b KQkq - +B90* +r1bqkb1r/ppp2ppp/2n5/3np3/8/P3P3/1P1P1PPP/RNBQKBNR w KQkq - +B43* +r1bqkb1r/ppp2ppp/2np1n2/1B2p3/4P3/5N2/PPPP1PPP/RNBQ1RK1 w kq - +C66 +r1bqkb1r/ppp2ppp/5n2/n2Pp1N1/2B5/8/PPPP1PPP/RNBQK2R w KQkq - +C58 +r1bqkb1r/ppp3pp/2n5/3npp2/8/3P1NP1/PP2PP1P/RNBQKB1R w KQkq - +B71* +r1bqkb1r/ppp3pp/2n5/3npp2/8/3PPN2/PP3PPP/RNBQKB1R w KQkq - +B82* +r1bqkb1r/ppp3pp/2n5/3npp2/8/P2P1N2/1P2PPPP/RNBQKB1R w KQkq - +B93* +r1bqkb1r/pppn1ppp/3p1n2/4p3/2PPP3/2N2N2/PP3PPP/R1BQKB1R b KQkq - +A55 +r1bqkb1r/pppn1ppp/4pn2/3p2B1/2PP4/2N5/PP2PPPP/R2QKBNR w KQkq - +D51 +r1bqkb1r/pppn1ppp/4pn2/8/2QP4/6P1/PP2PPBP/RNB1K1NR b KQkq - +E03 +r1bqkb1r/pppn1ppp/5n2/3p4/2PP4/2N5/PP3PPP/R1BQKBNR b KQkq - +C09* +r1bqkb1r/pppn1ppp/5n2/3pp3/3P4/2N1PN2/PPP2PPP/R1BQKB1R b KQkq - +C04* +r1bqkb1r/pppp1ppp/2n2n2/1B2p3/4P3/2N2N2/PPPP1PPP/R1BQK2R b KQkq - +C48 +r1bqkb1r/pppp1ppp/2n2n2/1B2p3/4P3/5N2/PPPP1PPP/RNBQK2R w KQkq - +C65 +r1bqkb1r/pppp1ppp/2n2n2/4p1B1/3P4/2P5/PP2PPPP/RN1QKBNR b KQkq - +B11* +r1bqkb1r/pppp1ppp/2n2n2/4p1N1/2B1P3/8/PPPP1PPP/RNBQK2R b KQkq - +C57 +r1bqkb1r/pppp1ppp/2n2n2/4p3/2B1P3/2N5/PPPP1PPP/R1BQK1NR w KQkq - +C28 +r1bqkb1r/pppp1ppp/2n2n2/4p3/2B1P3/5N2/PPPP1PPP/RNBQK2R w KQkq - +C55 +r1bqkb1r/pppp1ppp/2n2n2/4p3/2P5/2N2N2/PP1PPPPP/R1BQKB1R w KQkq - +A28 +r1bqkb1r/pppp1ppp/2n2n2/4p3/2P5/2N2NP1/PP1PPP1P/R1BQKB1R b KQkq - +A29 +r1bqkb1r/pppp1ppp/2n2n2/4p3/3PP3/2N2N2/PPP2PPP/R1BQKB1R b KQkq - +C47 +r1bqkb1r/pppp1ppp/2n2n2/4p3/4P3/2N5/PPPP1PPP/R1BQKBNR w KQkq - +C46* +r1bqkb1r/pppp1ppp/2n5/1B2p3/4n3/5N2/PPPP1PPP/RNBQ1RK1 w kq - +C67 +r1bqkb1r/pppp1ppp/2n5/8/2Bpn3/5N2/PPP2PPP/RNBQ1RK1 w kq - +C56 +r1bqkbnr/1p1p1ppp/p1n1p3/8/3NP3/2N5/PPP2PPP/R1BQKB1R w KQkq - +B46 +r1bqkbnr/1pp2ppp/p1np4/4p3/B3P3/2P2N2/PP1P1PPP/RNBQK2R b KQkq - +C74 +r1bqkbnr/1pp2ppp/p1np4/4p3/B3P3/5N2/PPPP1PPP/RNBQ1RK1 b kq - +C72 +r1bqkbnr/1pp2ppp/p1np4/4p3/B3P3/5N2/PPPP1PPP/RNBQK2R w KQkq - +C71 +r1bqkbnr/1pp2ppp/p1p5/4p3/4P3/5N2/PPPP1PPP/RNBQ1RK1 b kq - +C69 +r1bqkbnr/1ppp1ppp/p1B5/4p3/4P3/5N2/PPPP1PPP/RNBQK2R b KQkq - +C68 +r1bqkbnr/1ppp1ppp/p1n5/4p3/B3P3/5N2/PPPP1PPP/RNBQK2R b KQkq - +C70 +r1bqkbnr/2p2ppp/p1p5/3p4/2PPp3/4P3/PP2NPPP/RNBQK2R b KQkq - +C19* +r1bqkbnr/2p2ppp/p1p5/3p4/2PPp3/4P3/PP3PPP/RNBQK1NR w KQkq - +C18* +r1bqkbnr/2p2ppp/p1pp4/4p3/3PP3/5N2/PPP2PPP/RNBQK2R b KQkq - +C73 +r1bqkbnr/4p1pp/p1p2p2/3p4/2Pp4/4PN2/PP3PPP/RNBQK2R w KQkq - +E25* +r1bqkbnr/4pppp/p1p5/2pp4/8/4PN2/PPPP1PPP/RNBQ1RK1 b kq - +E27* +r1bqkbnr/4pppp/p1p5/2pp4/8/4PN2/PPPP1PPP/RNBQK2R w KQkq - +E24* +r1bqkbnr/5ppp/p1p1p3/2pp4/2P5/4PN2/PP1P1PPP/RNBQK2R w KQkq - +E26* +r1bqkbnr/5ppp/p1p1p3/2pp4/8/4PN2/PPPP1PPP/RNBQ1RK1 w kq - +E28* +r1bqkbnr/pp1npppp/2p5/8/3PN3/8/PPP2PPP/R1BQKBNR w KQkq - +B17 +r1bqkbnr/pp1p1ppp/2n1p3/8/3NP3/2N5/PPP2PPP/R1BQKB1R b KQkq - +B45 +r1bqkbnr/pp1p1ppp/2n1p3/8/3NP3/8/PPP2PPP/RNBQKB1R w KQkq - +B44 +r1bqkbnr/pp1p1ppp/2n5/2p1p3/2P5/4PN2/PP1P1PPP/RNBQKB1R b KQkq - +A19* +r1bqkbnr/pp1p1ppp/2n5/2p1p3/8/4PN2/PPPP1PPP/RNBQKB1R w KQkq - +A18* +r1bqkbnr/pp1ppp1p/2n3p1/1Bp5/4P3/5N2/PPPP1PPP/RNBQK2R w KQkq - +B31 +r1bqkbnr/pp1ppp1p/2n3p1/2p5/2P5/2N5/PP1PPPPP/R1BQKBNR w KQkq - +A36* +r1bqkbnr/pp1ppp1p/2n3p1/2p5/4P3/2P2N2/PP1P1PPP/RNBQKB1R b KQkq - +A23* +r1bqkbnr/pp1ppp1p/2n3p1/2p5/4P3/5NP1/PPPP1P1P/RNBQKB1R b KQkq - +A24* +r1bqkbnr/pp1ppp1p/2n3p1/8/2PNP3/8/PP3PPP/RNBQKB1R b KQkq - +B36 +r1bqkbnr/pp1ppp1p/2n3p1/8/3NP3/8/PPP2PPP/RNBQKB1R w KQkq - +B34 +r1bqkbnr/pp1ppppp/2n5/2p5/2P5/2N3P1/PP1PPP1P/R1BQKBNR b KQkq - +A36 +r1bqkbnr/pp1ppppp/2n5/2p5/2P5/2N5/PP1PPPPP/R1BQKBNR b KQkq - +A35* +r1bqkbnr/pp1ppppp/2n5/2p5/2P5/2N5/PP1PPPPP/R1BQKBNR w KQkq - +A35 +r1bqkbnr/pp1ppppp/2n5/2p5/2P5/8/PP1PPPPP/RNBQKBNR w KQkq - +A34* +r1bqkbnr/pp1ppppp/2n5/2p5/3PP3/5N2/PPP2PPP/RNBQKB1R b KQkq - +B32 +r1bqkbnr/pp1ppppp/2n5/2p5/4P3/2N3P1/PPPP1P1P/R1BQKBNR b KQkq - +B24 +r1bqkbnr/pp1ppppp/2n5/2p5/4P3/2N5/PPPP1PPP/R1BQKBNR b KQkq - +A25* +r1bqkbnr/pp1ppppp/2n5/2p5/4P3/5N2/PPPP1PPP/RNBQKB1R b KQkq - +A22* +r1bqkbnr/pp1ppppp/2n5/2p5/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - +B30 +r1bqkbnr/pp1ppppp/2n5/2p5/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +A21* +r1bqkbnr/pp1ppppp/2n5/2p5/8/4PN2/PPPP1PPP/RNBQKB1R b KQkq - +A17* +r1bqkbnr/pp1ppppp/2n5/2p5/8/5N2/PPPPPPPP/RNBQKB1R w KQkq - +A16* +r1bqkbnr/pp1ppppp/2n5/8/3NP3/8/PPP2PPP/RNBQKB1R b KQkq - +B33 +r1bqkbnr/pp2pppp/2n5/1Bpp4/8/4PN2/PPPP1PPP/RNBQK2R b KQkq - +E20* +r1bqkbnr/pp2pppp/2n5/2pp4/2PP4/4P3/PP3PPP/RNBQKBNR b KQkq - +D32* +r1bqkbnr/pp2pppp/2n5/2pp4/3P4/4P3/PPP2PPP/RNBQKBNR w KQkq - +D31* +r1bqkbnr/pp2pppp/2n5/2pp4/3P4/4PN2/PPP2PPP/RNBQKB1R b KQkq - +D35* +r1bqkbnr/pp2pppp/2n5/2pp4/5P2/5N2/PPPPP1PP/RNBQKB1R w KQkq - +A85* +r1bqkbnr/pp2pppp/2n5/2pp4/8/5NP1/PPPPPP1P/RNBQKB1R w KQkq - +E61* +r1bqkbnr/pp2pppp/2n5/3p4/3N4/6P1/PPP1PP1P/RNBQKB1R b KQkq - +D85* +r1bqkbnr/pp3p1p/2n3p1/2ppp3/8/3P1NP1/PPP1PPBP/RNBQK2R w KQkq - +E72* +r1bqkbnr/pp3pp1/2n4p/2ppp3/8/3P1NP1/PPP1PPBP/RNBQK2R w KQkq - +E71* +r1bqkbnr/pp3ppp/2n1p3/1Bpp4/2P5/4PN2/PP1P1PPP/RNBQK2R b KQkq - +E41* +r1bqkbnr/pp3ppp/2n1p3/1Bpp4/8/1P2PN2/P1PP1PPP/RNBQK2R b KQkq - +E43* +r1bqkbnr/pp3ppp/2n1p3/1Bpp4/8/4PN2/PPPP1PPP/RNBQ1RK1 b kq - +E46* +r1bqkbnr/pp3ppp/2n1p3/1Bpp4/8/4PN2/PPPP1PPP/RNBQK2R w KQkq - +E40* +r1bqkbnr/pp3ppp/2n5/2pp4/3P4/2N2NP1/PP2PP1P/R1BQKB1R b KQkq - +D33 +r1bqkbnr/pp3ppp/2n5/2pp4/3P4/5N2/PP2PPPP/RNBQKB1R w KQkq - +B14* +r1bqkbnr/pp3ppp/2n5/2pp4/3P4/5N2/PPPN1PPP/R1BQKB1R w KQkq - +C09 +r1bqkbnr/pp3ppp/2n5/2ppp3/8/3P2P1/PPP1PPBP/RNBQK1NR w KQkq - +A42* +r1bqkbnr/pp3ppp/2n5/2ppp3/8/5NP1/PPPPPPBP/RNBQK2R w KQkq - +E70* +r1bqkbnr/pp3ppp/2n5/4p3/2Pp4/3P1N2/PP3PPP/RNBQKB1R w KQkq - +A65* +r1bqkbnr/pp3ppp/2n5/4p3/2Pp4/B2P1N2/4PPPP/RN1QKB1R w KQkq - +A59* +r1bqkbnr/pp4pp/2n2p2/2ppp3/8/3P1NP1/PPP1PPBP/RNBQ1RK1 b kq - +E81* +r1bqkbnr/pp4pp/2n2p2/2ppp3/8/3P1NP1/PPP1PPBP/RNBQK2R w KQkq - +E80* +r1bqkbnr/pp4pp/2n5/2pppp2/8/3P1NP1/PPP1PPBP/RNBQK2R w KQkq - +E76* +r1bqkbnr/pp4pp/2n5/4pp2/2Pp4/3P1NP1/PP3P1P/RNBQKB1R w KQkq - +A66* +r1bqkbnr/ppp1pppp/2n5/3p4/2PP4/8/PP2PPPP/RNBQKBNR w KQkq - +D07 +r1bqkbnr/ppp2ppp/2n5/1B1p4/2PPp3/4P3/PP3PPP/RNBQK1NR b KQkq - +C17* +r1bqkbnr/ppp2ppp/2n5/1B1p4/3Pp3/4P3/PPP2PPP/RNBQK1NR w KQkq - +C16* +r1bqkbnr/ppp2ppp/2n5/1B1pp3/3P4/4P3/PPP2PPP/RNBQK1NR b KQkq - +C15* +r1bqkbnr/ppp2ppp/2n5/3pp3/3P4/2P5/PP2PPPP/RNBQKBNR w KQkq - +B15* +r1bqkbnr/ppp2ppp/2n5/3pp3/3P4/4P3/PPP2PPP/RNBQKBNR w KQkq - +C10* +r1bqkbnr/ppp2ppp/2n5/3pp3/3P4/4PN2/PPP2PPP/RNBQKB1R b KQkq - +C11* +r1bqkbnr/ppp2ppp/2n5/4P3/2Pp4/5NP1/PP2PP1P/RNBQKB1R b KQkq - +D09 +r1bqkbnr/ppp2ppp/2np4/1B2p3/4P3/5N2/PPPP1PPP/RNBQK2R w KQkq - +C62 +r1bqkbnr/ppp2ppp/8/3p4/8/2P2P2/PP2PP1P/RNBQKB1R b KQkq - +B16* +r1bqkbnr/ppp2ppp/8/3pn3/5B2/2P5/PP2PPPP/RN1QKBNR b KQkq - +B18* +r1bqkbnr/ppp2ppp/8/3pn3/8/2P5/PP1NPPPP/R1BQKBNR b KQkq - +B17* +r1bqkbnr/ppp3pp/2n5/3ppp2/8/3P1NP1/PPP1PP1P/RNBQKB1R w KQkq - +B08* +r1bqkbnr/pppn1ppp/8/3p4/2PP4/8/PP3PPP/RNBQKBNR b KQkq - +C08* +r1bqkbnr/pppn1ppp/8/3pp3/2PP4/4P3/PP3PPP/RNBQKBNR b KQkq - +C07* +r1bqkbnr/pppn1ppp/8/3pp3/3P4/4P3/PPP2PPP/RNBQKBNR w KQkq - +C03* +r1bqkbnr/pppn1ppp/8/3pp3/3P4/4PN2/PPP2PPP/RNBQKB1R b KQkq - +C05* +r1bqkbnr/pppp1p1p/2n3p1/4p3/2P5/2N5/PP1PPPPP/R1BQKBNR w KQkq - +B24* +r1bqkbnr/pppp1ppp/2n5/1B2p3/4P3/5N2/PPPP1PPP/RNBQK2R b KQkq - +C60 +r1bqkbnr/pppp1ppp/2n5/4p3/2B1P3/5N2/PPPP1PPP/RNBQK2R b KQkq - +C50 +r1bqkbnr/pppp1ppp/2n5/4p3/2P5/2N2N2/PP1PPPPP/R1BQKB1R b KQkq - +A27 +r1bqkbnr/pppp1ppp/2n5/4p3/2P5/2N5/PP1PPPPP/R1BQKBNR w KQkq - +A25 +r1bqkbnr/pppp1ppp/2n5/4p3/2P5/8/PP1PPPPP/RNBQKBNR w KQkq - +B23* +r1bqkbnr/pppp1ppp/2n5/4p3/4P3/2N2N2/PPPP1PPP/R1BQKB1R b KQkq - +C46 +r1bqkbnr/pppp1ppp/2n5/4p3/4P3/5N2/PPPP1PPP/RNBQKB1R b KQkq - +C26* +r1bqkbnr/pppp1ppp/2n5/4p3/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - +C44 +r1bqkbnr/pppp1ppp/2n5/4p3/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +C25* +r1bqkbnr/pppp1ppp/2n5/8/3NP3/8/PPP2PPP/RNBQKB1R b KQkq - +C45 +r1bqkbnr/pppp1ppp/2n5/8/3QP3/8/PPP2PPP/RNB1KBNR w KQkq - +C22 +r1bqkbnr/pppp1ppp/8/1B2p3/3nP3/5N2/PPPP1PPP/RNBQK2R w KQkq - +C61 +r1bqkbnr/pppp2pp/2n5/1B2pp2/4P3/5N2/PPPP1PPP/RNBQK2R w KQkq - +C63 +r1bqkbnr/pppp2pp/2n5/4pp2/3PP3/5N2/PPP2PPP/RNBQKB1R b KQkq - +C29* +r1bqnrk1/pp2b1pp/2n2p2/2p1p3/3pPP2/3P2P1/PPPNN1BP/R1BQ1RK1 b - - +E99* +r1bqnrk1/pp2bppp/2n5/2p1p3/3pP3/3P1NP1/PPP1NPBP/R1BQ1RK1 w - - +E98* +r1bqr1k1/1p1n1pbp/p2p1np1/2pP4/P7/2N3P1/1P1NPPBP/R1BQ1RK1 w - - +A64 +r1bqr1k1/pp2bppp/2n2n2/2ppp3/4P3/3P1NP1/PPPN1PBP/R1BQ1RK1 w - - +E95* +r1bqr1k1/pp3pbp/n2p1np1/2pP4/4P3/2N5/PP1NBPPP/R1BQ1RK1 w - - +A78 +r1bqr1k1/ppbn1pp1/2p2n1p/3pp3/1PP1P3/P1NP1N2/2Q1BPPP/R1B2RK1 b - - +C98* +r1bqr1k1/ppbn1pp1/5n1p/3pp3/NP2P3/P2P1N2/2Q1BPPP/R1B2RK1 w - - +C99* +r1bqr1k1/ppn2pbp/3p1np1/2pP4/4P3/2N2P2/PP1NB1PP/R1BQ1RK1 w - - +A79 +r1bqrbk1/pp3ppp/2n2n2/2ppp3/P3P3/2PP1NP1/1P1N1PBP/R1BQ1RK1 b - - +E96* +r1r3k1/pp1bppbp/2np1np1/q7/3NP2P/1BN1BP2/PPPQ2P1/2KR3R b - - +B79 +r2q1rk1/p3n1pp/3bbp2/3pp1B1/N7/6P1/PP2PPBP/R2Q1RK1 w - - +D89* +r2q1rk1/p3nppp/4b3/2bpp3/8/2N3P1/PP2PPBP/R1BQ1RK1 w - - +D88* +r2q1rk1/pp1bppbp/2np1np1/8/2BNP3/2N1BP2/PPPQ2PP/2KR3R b - - +B78 +r2q1rk1/pp2ppbp/6p1/n7/3PP1b1/3BBP2/P3N1PP/R2Q1RK1 b - - +D89 +r2q1rk1/ppp1bppp/1nn1b3/4p3/8/2NP1NP1/PP2PPBP/R1BQ1RK1 w - - +B74* +r2q1rk1/ppp1bppp/2n1b3/3np3/8/2NP1NP1/PP2PPBP/R1BQK2R w KQ - +B73* +r2qk1nr/pp2bppp/2n5/2p1p3/2Pp2b1/3PPNP1/PP3PBP/RNBQ1RK1 b kq - +E75* +r2qk1nr/pp2bppp/2n5/2ppp3/2P3b1/3P1NP1/PP2PPBP/RNBQ1RK1 b kq - +E74* +r2qk1nr/ppp2pbp/2npb1p1/4p3/2P5/2NP2P1/PP2PPBP/R1BQK1NR w KQkq - +B26* +r2qk2r/1p1bbppp/p1nppn2/6B1/3NPP2/2N5/PPPQ2PP/2KR1B1R w kq - +B68 +r2qk2r/2p1bppp/p1n1b3/1p1pP3/4n3/1BP2N2/PP3PPP/RNBQ1RK1 w kq - +C83 +r2qk2r/3bbppp/p1nppB2/1p6/4PP2/2N2N2/PPPQ2PP/2KR1B1R b kq - +B69 +r2qk2r/pp2b1pp/2n1b3/2pnpp2/8/2NP1NP1/PP2PPBP/R1BQ1RK1 w kq - +E79* +r2qk2r/ppp1bppp/2n1b3/3np3/8/P1N1P3/1PQP1PPP/R1B1KBNR w KQkq - +B49* +r2qk2r/ppp2ppp/2n1b3/2bnp3/8/2N2NP1/PP1PPPBP/R1BQK2R w KQkq - +B35* +r2qk2r/ppp2ppp/2n1b3/2bnp3/8/2NPPN2/PP3PPP/R1BQKB1R w KQkq - +B89* +r2qkb1r/1p1b1ppp/p1nppn2/6B1/3NP3/2N5/PPPQ1PPP/2KR1B1R w kq - +B67 +r2qkb1r/2p2ppp/p1n1b3/1p1pP3/4n3/1B3N2/PPP1QPPP/RNB2RK1 b kq - +C81 +r2qkb1r/2p2ppp/p1n1b3/1p1pP3/4n3/1BP2N2/PP3PPP/RNBQ1RK1 b kq - +C82 +r2qkb1r/p4ppp/2p1pn2/3p4/3p4/4P2P/PPP1QPP1/RNB2RK1 w kq - +D57* +r2qkb1r/pp1bpppp/2np1n2/6B1/3NP3/2N5/PPPQ1PPP/R3KB1R b KQkq - +B61 +r2qkb1r/pp2n1pp/2n1bp2/2p1p3/3PP3/3P1NP1/PP3PBP/RNBQ1RK1 b kq - +E89* +r2qkb1r/pp2n1pp/2n1bp2/2ppp3/4P3/2PP1NP1/PP3PBP/RNBQ1RK1 b kq - +E86* +r2qkb1r/pp2pppp/2n2n2/1BPp4/6b1/4PN2/PPP2PPP/RNBQK2R b KQkq - +D39* +r2qkb1r/pp2pppp/2n2n2/1Bpp3b/8/1P2PN1P/PBPP1PP1/RN1QK2R b KQkq - +E13* +r2qkb1r/pp2pppp/2n2n2/2Pp4/6b1/2P1PN2/PP3PPP/RNBQKB1R b KQkq - +D44* +r2qkb1r/pp2pppp/2n2n2/2pp1b2/3P4/5NP1/PPP1PPBP/RNBQK2R w KQkq - +D92* +r2qkb1r/pp2pppp/2n2n2/2pp4/3P2b1/5NP1/PPP1PPBP/RNBQK2R w KQkq - +D91* +r2qkb1r/pp3ppp/2n1b3/2pnp1N1/8/2N3P1/PP1PPPBP/R1BQK2R b KQkq - +B39* +r2qkb1r/pp3ppp/2n1pn2/2pp1b2/3P4/5NP1/PPP1PPBP/RNBQ1RK1 w kq - +D93* +r2qkb1r/pp3ppp/2n1pn2/2pp3b/3P4/1P2PN1P/P1P1BPP1/RNBQ1RK1 b kq - +D58* +r2qkb1r/pp3ppp/2n1pn2/2pp3b/3P4/4PN1P/PPP1BPP1/RNBQ1RK1 w kq - +D56* +r2qkb1r/pp3ppp/2n1pn2/2pp4/3P2b1/2P1PN2/PP1N1PPP/R1BQKB1R w KQkq - +D52* +r2qkb1r/pp3ppp/2n1pn2/2pp4/3P2b1/4PN2/PPP1BPPP/RNBQ1RK1 w kq - +D55* +r2qkb1r/pp3ppp/2n1pn2/2pp4/3P2b1/4PN2/PPPNBPPP/R1BQ1RK1 b kq - +D60* +r2qkb1r/pp3ppp/2n1pn2/3p3b/3N4/1P2P2P/P1P1BPP1/RNBQ1RK1 b kq - +D59* +r2qkb1r/ppp2ppp/2n1b3/3np3/8/2N1P3/PPQP1PPP/R1B1KBNR w KQkq - +B48* +r2qkb1r/ppp2ppp/2n1b3/3np3/8/3P1NP1/PP2PP1P/RNBQKB1R w KQkq - +B72* +r2qkb1r/ppp2ppp/2n5/3np3/6b1/2NP1N2/PP2PPPP/R1BQKB1R w KQkq - +B60* +r2qkb1r/ppp2ppp/2n5/3np3/6b1/2NPPN2/PP3PPP/R1BQKB1R b KQkq - +B62* +r2qkb1r/ppp2ppp/2n5/3np3/6b1/P2P1N2/1P2PPPP/RNBQKB1R w KQkq - +B94* +r2qkb1r/ppp2ppp/2n5/3np3/6b1/P2PPN2/1P3PPP/RNBQKB1R b KQkq - +B95* +r2qkb1r/ppp3pp/2n1bp2/3np3/8/3P1NP1/PP2PPBP/RNBQ1RK1 b kq - +B76* +r2qkb1r/ppp3pp/2n1bp2/3np3/8/3P1NP1/PP2PPBP/RNBQK2R w KQkq - +B75* +r2qkb1r/ppp3pp/2n5/3npp2/6b1/P2PPN2/1P2BPPP/RNBQK2R b KQkq - +B98* +r2qkb1r/ppp3pp/2n5/3npp2/6b1/P2PPN2/1P3PPP/RNBQKB1R w KQkq - +B96* +r2qkb1r/ppp3pp/2n5/3npp2/6b1/PQ1PPN2/1P3PPP/RNB1KB1R b KQkq - +B97* +r2qkbnr/1ppb1p1p/p1np2p1/4p3/B2PP3/2P2N2/PP3PPP/RNBQK2R w KQkq - +C76 +r2qkbnr/1ppb1ppp/p1np4/4p3/B3P3/2P2N2/PP1P1PPP/RNBQK2R w KQkq - +C75 +r2qkbnr/pp1nppp1/2p3bp/8/3P3P/5NN1/PPP2PP1/R1BQKB1R w KQkq - +B19 +r2qkbnr/pp2pppp/2n5/1Bp4b/2Pp4/3PPN1P/PP3PP1/RNBQK2R b KQkq - +E31* +r2qkbnr/pp2pppp/2n5/1Bpp4/6b1/4PN2/PPPP1PPP/RNBQK2R w KQkq - +E30* +r2qkbnr/pp2pppp/2n5/2pp1b2/3P4/5NP1/PPP1PP1P/RNBQKB1R w KQkq - +D82* +r2qkbnr/pp2pppp/2n5/2pp4/3P2b1/4PN2/PPP1BPPP/RNBQK2R b KQkq - +D53* +r2qkbnr/pp2pppp/2n5/2pp4/3P2b1/4PN2/PPP2PPP/RNBQKB1R w KQkq - +D50* +r2qkbnr/pp2pppp/2n5/2pp4/3P2b1/4PN2/PPPN1PPP/R1BQKB1R b KQkq - +D51* +r2qkbnr/pp2pppp/2n5/2pp4/3P2b1/5NP1/PPP1PP1P/RNBQKB1R w KQkq - +D80* +r2qkbnr/pp3ppp/2n1p3/2pp1b2/3P4/5NP1/PPP1PPBP/RNBQ1RK1 b kq - +D83* +r2qkbnr/pp3ppp/4p3/3p4/3Q4/6P1/PPb1PPBP/RNB2RK1 w kq - +D84* +r2qkbnr/pp4pp/2n1bp2/2p1p3/3pP3/2PP1NP1/PP3PBP/RNBQ1RK1 b kq - +E88* +r2qkbnr/pp4pp/2n1bp2/2p1p3/3pP3/3P1NP1/PPP2PBP/RNBQ1RK1 w kq - +E87* +r2qkbnr/pp4pp/2n1bp2/2ppp3/4P3/3P1NP1/PPP2PBP/RNBQ1RK1 b kq - +E85* +r2qkbnr/pp4pp/2n1bp2/2ppp3/8/1P1P1NP1/P1P1PPBP/RNBQ1RK1 b kq - +E82* +r2qkbnr/pp4pp/2n1bp2/2ppp3/8/2NP1NP1/PPP1PPBP/R1BQ1RK1 b kq - +E83* +r2qkbnr/ppp1pppp/2n5/3p4/3P2b1/5N2/PPP1PPPP/RNBQKB1R w KQkq - +D01* +r2qkbnr/ppp2ppp/2n5/1B1pp3/3P2b1/4PN2/PPP2PPP/RNBQK2R b KQkq - +C12* +r2qkbnr/ppp2ppp/2n5/3p4/3Pp3/4P3/PPPNQPPP/RNB1K2R b KQkq - +C14* +r2qkbnr/ppp2ppp/2n5/3pP3/6b1/5N2/PPPPP1PP/RNBQKB1R w KQkq - +A83* +r2qkbnr/ppp2ppp/2n5/3pp3/3P2b1/4PN2/PPP1BPPP/RNBQK2R b KQkq - +C13* +r3k2r/pppq2pp/2n1bp2/2bnp3/8/2NP1NP1/PP2PPBP/R1BQ1RK1 w kq - +B77* +r3kb1r/pp1qn1pp/2n1bp2/2ppp3/8/P1NP1NP1/1PP1PPBP/1RBQ1RK1 b kq - +E84* +r3kb1r/pp3ppp/1qn1bn2/3pp1B1/8/6P1/PPPNPPBP/RN1Q1RK1 w kq - +D99* +r3kb1r/pppq1ppp/2n5/3np3/6b1/2NP1N2/PP1BPPPP/R2QKB1R w KQkq - +B61* +r3kb1r/pppq1ppp/2n5/3np3/6b1/2NPPN2/PP3PPP/R1BQKB1R w KQkq - +B63* +r3kb1r/pppq1ppp/2n5/3np3/6b1/P1NPPN2/1P3PPP/R1BQKB1R b KQkq - +B66* +r3kb1r/ppq2ppp/2n1pn2/2p5/2pP2b1/4PN2/PP1NBPPP/R1BQ1RK1 w kq - +D62* +r3kb1r/ppq2ppp/2n1pn2/2pp4/3P2b1/4PN2/PPPNBPPP/R1BQ1RK1 w kq - +D61* +r3kbnr/ppq1pppp/2n5/3p4/3P2b1/2P2N2/PP3PPP/RNBQKB1R w KQkq - +D36* +rn1q1rk1/1p3pbp/p2p1np1/2pP4/P3P1b1/2N2N2/1P2BPPP/R1BQ1RK1 w - - +A75 +rn1q1rk1/p3ppbp/bp3np1/2pp4/3P1P2/2P1PN2/PP2B1PP/RNBQ1RK1 w - - +A94* +rn1q1rk1/pbppbppp/1p2p3/8/2PP4/2Q2NP1/PP2PPBP/R1B2RK1 b - - +E19 +rn1q1rk1/pbppbppp/1p2pn2/8/2PP4/2N2NP1/PP2PPBP/R1BQ1RK1 b - - +E18 +rn1q1rk1/pp3ppp/2p1pn2/5b2/PbBP4/2N1PN2/1P2QPPP/R1B2RK1 b - - +D19 +rn1q1rk1/ppp1ppbp/5np1/8/2QPP1b1/2N2N2/PP3PPP/R1B1KB1R w KQ - +D98 +rn1q1rk1/pppnppbp/6p1/8/3PP1b1/1QN1BN2/PP3PPP/R3KB1R b KQ - +D99 +rn1qk2r/p1pp1ppp/bp2pn2/8/1bPP4/2N1P3/PP2NPPP/R1BQKB1R w KQkq - +E45 +rn1qk2r/pbpp1pp1/1p2pn1p/8/1bPP3B/2N2N2/PP2PPPP/R2QKB1R w KQkq - +E13 +rn1qk2r/pbpp1ppp/1p2pn2/8/1bPP4/5NP1/PP2PPBP/RNBQK2R w KQkq - +E16 +rn1qk2r/pbppbppp/1p2pn2/8/2PP4/5NP1/PP2PPBP/RNBQK2R w KQkq - +E17 +rn1qkb1r/1b3ppp/p3pn2/1pp5/3P4/1B2PN2/PP2QPPP/RNB2RK1 w kq - +D29 +rn1qkb1r/4pppp/b2p1n2/2pP4/4P3/2N5/PP3PPP/R1BQKBNR b KQkq - +A59 +rn1qkb1r/pp2pppp/2p2n2/3p1b2/2PP4/4PN2/PP3PPP/RNBQKB1R w KQkq - +D12 +rn1qkb1r/pp2pppp/2p2n2/5b2/P1pP4/2N1PN2/1P3PPP/R1BQKB1R b KQkq - +D18 +rn1qkb1r/pp2pppp/2p2n2/5b2/P1pP4/2N2N2/1P2PPPP/R1BQKB1R w KQkq - +D17 +rn1qkb1r/pp2pppp/5n2/3p1b2/3P1B2/5N2/PP2PPPP/RN1QKB1R b KQkq - +D14* +rn1qkb1r/pp2pppp/5n2/3p1b2/3P1B2/5N2/PP2PPPP/RN1QKB1R w KQkq - +D14 +rn1qkb1r/pp3ppp/4b3/2pnp3/8/2N3P1/PP1PPPBP/R1BQK1NR w KQkq - +B38* +rn1qkb1r/ppp1pppp/3p4/3nP3/3P2b1/5N2/PPP2PPP/RNBQKB1R w KQkq - +B05 +rn1qkb1r/ppp1pppp/5n2/3p4/3P2b1/5N2/PPP1PPPP/RNBQKB1R w KQkq - +D03* +rn1qkbnr/pp1bpppp/3p4/1Bp5/4P3/5N2/PPPP1PPP/RNBQK2R w KQkq - +B52 +rn1qkbnr/pp2pppp/2p5/3p4/4P1b1/2N2N2/PPPP1PPP/R1BQKB1R w KQkq - +B11 +rn1qkbnr/pp2pppp/2p5/5b2/3PN3/8/PPP2PPP/R1BQKBNR w KQkq - +B18 +rnb1k1nr/pp2ppbp/6p1/2qp4/8/4PN2/PPPN1PPP/R1BQKB1R w KQkq - +E03* +rnb1k1nr/pp2ppbp/6p1/q1Pp4/8/4PN2/PPP2PPP/RNBQKB1R w KQkq - +E02* +rnb1k2r/pppnqppp/4p3/3pP3/3P4/2N5/PPP2PPP/R2QKBNR w KQkq - +C14 +rnb1kb1r/1p3ppp/pq1ppn2/6B1/3NPP2/2N5/PPP3PP/R2QKB1R w KQkq - +B97 +rnb1kb1r/ppp2ppp/5n2/3qp3/8/3P4/PP2PPPP/RNBQKBNR w KQkq - +B53* +rnb1kbnr/ppp2ppp/8/3qp3/8/2N5/PPPP1PPP/R1BQKBNR b KQkq - +C22* +rnb1qrk1/ppp1b1pp/3ppn2/5p2/2PP4/1PN2NP1/P3PPBP/R1BQ1RK1 b - - +A99 +rnb1qrk1/ppp1b1pp/3ppn2/5p2/2PP4/2N2NP1/PP2PPBP/R1BQ1RK1 w - - +A97 +rnb1qrk1/ppp1b1pp/3ppn2/5p2/2PP4/2N2NP1/PPQ1PPBP/R1B2RK1 b - - +A98 +rnb2rk1/pp2qppp/1b2pn2/3p4/1PP5/P3PN2/1B3PPP/RN1QKB1R b KQ - +D29* +rnb2rk1/pp2qppp/4pn2/2bp4/2P5/P3PN2/1P3PPP/RNBQKB1R w KQ - +D28* +rnb2rk1/ppB1ppbp/6p1/3q4/3P4/4P3/PP3PPP/R2QKBNR b KQ - +D84 +rnb2rk1/ppp1qpp1/4p2p/3P4/3P4/2P1PN2/P4PPP/R2QKB1R b KQ - +D57 +rnb2rk1/ppp1qppp/1b3n2/4N3/1P1Pp3/P1N1B3/2P2PPP/R2QKB1R w KQ - +C81* +rnb2rk1/ppppqppp/5n2/b3p3/4P3/P1N2N2/1PPPBPPP/R1BQK2R w KQ - +C86* +rnb2rk1/ppq1ppbp/5np1/2pp4/3P4/4PN2/PPPNBPPP/R1BQ1RK1 w - - +E08* +rnbq1rk1/1p3pbp/p2p1np1/2pP4/4P3/2N2N2/PP2BPPP/R1BQ1RK1 w - - +A74 +rnbq1rk1/2p1bppp/p2p1n2/1p2p3/3PP3/1BP2N1P/PP3PP1/RNBQR1K1 b - - +C95 +rnbq1rk1/2p1bppp/p2p1n2/1p2p3/4P3/1BP2N1P/PP1P1PP1/RNBQR1K1 w - - +C94 +rnbq1rk1/p1p1bpp1/1p2p2p/3n4/3P3B/2N1PN2/PP3PPP/R2QKB1R w KQ - +D59 +rnbq1rk1/p1p1bpp1/1p2pn1p/3p4/2PP3B/2N1PN2/PP3PPP/R2QKB1R w KQ - +D58 +rnbq1rk1/p1p1ppbp/1p1p1np1/8/2PPP3/2N1BP2/PP4PP/R2QKBNR w KQ - +E82 +rnbq1rk1/p1p2ppp/1p2pn2/3p4/1bPP4/2NBPN2/PP3PPP/R1BQK2R w KQ - +E52 +rnbq1rk1/p3ppbp/1p3np1/2pp4/3P1P2/4PN2/PPP1B1PP/RNBQ1RK1 w - - +A93* +rnbq1rk1/pp1p1ppp/4pn2/2P5/1bP5/2N5/PPQ1PPPP/R1B1KBNR w KQ - +E39 +rnbq1rk1/pp1pppbp/5np1/2p5/3P4/4PN2/PPP1BPPP/RNBQK2R w KQ - +A14* +rnbq1rk1/pp2b1pp/2p1pn2/3p1p2/2PP4/2N2NP1/PP2PPBP/R1BQ1RK1 w - - +A95 +rnbq1rk1/pp2b1pp/2p1pn2/3p1p2/2PP4/BP3NP1/P3PPBP/RN1Q1RK1 b - - +A94 +rnbq1rk1/pp2p1bp/2pp1np1/5p2/2PP4/2N2NP1/PP2PPBP/R1BQ1RK1 w - - +A88 +rnbq1rk1/pp2ppbp/2p2np1/3p4/2PP4/5NP1/PP2PPBP/RNBQ1RK1 w - - +D78 +rnbq1rk1/pp2ppbp/3p1np1/2p3B1/2PPP3/2N5/PP2BPPP/R2QK1NR w KQ - +E74 +rnbq1rk1/pp2ppbp/3p1np1/2p5/2PP4/2N2NP1/PP2PPBP/R1BQ1RK1 b - - +E65 +rnbq1rk1/pp2ppbp/3p1np1/2p5/2PP4/2N2NP1/PP2PPBP/R1BQK2R w KQ - +E64 +rnbq1rk1/pp2ppbp/3p1np1/2p5/2PPPP2/2N2N2/PP2B1PP/R1BQK2R b KQ - +E78 +rnbq1rk1/pp2ppbp/3p1np1/8/3NP3/2N1BP2/PPP3PP/R2QKB1R w KQ - +B76 +rnbq1rk1/pp2ppbp/5np1/2pp4/3P4/2P2NP1/PP2PPBP/RNBQ1RK1 b - - +D78* +rnbq1rk1/pp2ppbp/5np1/2pp4/3P4/4PN2/PPPNBPPP/R1BQ1RK1 b - - +E07* +rnbq1rk1/pp2ppbp/5np1/2pp4/3P4/5NP1/PPP1PPBP/RNBQ1RK1 w - - +D77* +rnbq1rk1/pp2ppbp/5np1/2pp4/5P2/3PPN2/PPP1B1PP/RNBQ1RK1 b - - +A96* +rnbq1rk1/pp2ppbp/5np1/3p4/2PN4/6P1/PP2PPBP/RNBQ1RK1 b - - +D75* +rnbq1rk1/pp2ppbp/5np1/3p4/3N4/6P1/PPP1PPBP/RNBQ1RK1 w - - +D74* +rnbq1rk1/pp2ppbp/5np1/3p4/3P4/5NP1/PP2PPBP/RNBQ1RK1 b - - +D79* +rnbq1rk1/pp2ppbp/5np1/3p4/3P4/5NP1/PP2PPBP/RNBQ1RK1 w - - +D79 +rnbq1rk1/pp2ppbp/5np1/3p4/8/1N4P1/PPP1PPBP/RNBQ1RK1 b - - +D76* +rnbq1rk1/pp2ppbp/6p1/2p5/2BPP3/2P5/P3NPPP/R1BQK2R w KQ - +D87 +rnbq1rk1/pp2ppbp/6p1/2pn4/3P4/5NP1/PP2PPBP/RNBQ1RK1 w - - +D75 +rnbq1rk1/pp3pbp/2pp1np1/3Pp3/2P1P3/2N1BP2/PP4PP/R2QKBNR w KQ - +E88 +rnbq1rk1/pp3pbp/2pp1np1/4p3/2PPP3/2N1BP2/PP2N1PP/R2QKB1R w KQ - +E86 +rnbq1rk1/pp3pbp/3p1np1/2pP4/4P3/2N2N2/PP2BPPP/R1BQ1RK1 b - - +A73 +rnbq1rk1/pp3pbp/3p1np1/2pP4/4P3/2N2N2/PP2BPPP/R1BQK2R w KQ - +A72 +rnbq1rk1/pp3pbp/3p1np1/2pP4/4PP2/2N2N2/PP4PP/R1BQKB1R w KQ - +A68 +rnbq1rk1/pp3pbp/3p1np1/2pP4/8/2N2NP1/PP2PPBP/R1BQK2R w KQ - +A62 +rnbq1rk1/pp3pbp/3p1np1/3pp3/2P1P3/2N1BP2/PP2N1PP/R2QKB1R w KQ - +E89 +rnbq1rk1/pp3pbp/3ppnp1/2pP2B1/2P1P3/2N5/PP2BPPP/R2QK1NR w KQ - +E75 +rnbq1rk1/pp3ppp/1bp2n2/4N3/1P1Pp3/P1N1B3/2P1BPPP/R2QK2R b KQ - +C83* +rnbq1rk1/pp3ppp/1bp2n2/4N3/1P1Pp3/P1N1B3/2P2PPP/R2QKB1R w KQ - +C82* +rnbq1rk1/pp3ppp/4pn2/2bp4/2P5/P3PN2/1P3PPP/RNBQKB1R b KQ - +D27* +rnbq1rk1/pp3ppp/4pn2/2p5/1bBP4/2N1PN2/PP3PPP/R1BQ1RK1 b - - +E54 +rnbq1rk1/pp3ppp/4pn2/2pp4/1bPP4/2NBPN2/PP3PPP/R1BQK2R w KQ - +E53 +rnbq1rk1/ppp1b1pp/3ppn2/5p2/2PP4/5NP1/PP2PPBP/RNBQ1RK1 w - - +A96 +rnbq1rk1/ppp1b1pp/4pn2/3p1p2/2PP4/1P3NP1/P3PPBP/RNBQ1RK1 b - - +A93 +rnbq1rk1/ppp1bpp1/4pn1p/3p4/2PP3B/2N1PN2/PP3PPP/R2QKB1R b KQ - +D56 +rnbq1rk1/ppp1bppp/4pn2/3p2B1/2PP4/2N1P3/PP3PPP/2RQKBNR b K - +D54 +rnbq1rk1/ppp1bppp/4pn2/3p2B1/2PP4/2N1PN2/PP3PPP/R2QKB1R b KQ - +D55 +rnbq1rk1/ppp1ppbp/1n4p1/8/3P4/5NP1/PP2PPBP/RNBQ1RK1 w - - +D76 +rnbq1rk1/ppp1ppbp/3p1np1/8/2PPP3/2N2N2/PP2BPPP/R1BQK2R b KQ - +E91 +rnbq1rk1/ppp1ppbp/3p1np1/8/2PPP3/2N2P2/PP4PP/R1BQKBNR w KQ - +E81 +rnbq1rk1/ppp1ppbp/3p1np1/8/2PPPP2/2N5/PP2B1PP/R1BQK1NR b KQ - +E77 +rnbq1rk1/ppp1ppbp/5np1/3p4/2PP1B2/2N1P3/PP3PPP/R2QKBNR w KQ - +D83 +rnbq1rk1/ppp1ppbp/5np1/3p4/2PP1B2/2N1PN2/PP3PPP/R2QKB1R b KQ - +D93 +rnbq1rk1/ppp1ppbp/5np1/3p4/2PP4/1QN1PN2/PP3PPP/R1B1KB1R b KQ - +D95 +rnbq1rk1/ppp1ppbp/5np1/3p4/2PP4/5NP1/PP2PPBP/RNBQ1RK1 b - - +D77 +rnbq1rk1/ppp1ppbp/5np1/3p4/2PP4/5NP1/PP2PPBP/RNBQK2R w KQ - +D73 +rnbq1rk1/ppp1ppbp/5np1/8/2QPP3/2N2N2/PP3PPP/R1B1KB1R b KQ - +D97 +rnbq1rk1/ppp1ppbp/6p1/3n4/3P4/5NP1/PP2PPBP/RNBQ1RK1 b - - +D74 +rnbq1rk1/ppp2pbp/3p1np1/3Pp3/2P1P3/2N1BP2/PP4PP/R2QKBNR b KQ - +E87 +rnbq1rk1/ppp2pbp/3p1np1/4p3/2PPP3/2N1BP2/PP4PP/R2QKBNR w KQ - +E85 +rnbq1rk1/ppp2pbp/3p1np1/4p3/2PPP3/2N2N2/PP2BPPP/R1BQ1RK1 b - - +E94 +rnbq1rk1/ppp2pbp/3p1np1/4p3/2PPP3/2N2N2/PP2BPPP/R1BQK2R w KQ - +E92 +rnbq1rk1/ppp2ppp/4pn2/3p4/1bPP4/2N1PN2/PP3PPP/R1BQKB1R w KQ - +E51 +rnbq1rk1/ppp2ppp/4pn2/3p4/1bPP4/2NBP3/PP3PPP/R1BQK1NR w KQ - +E48 +rnbq1rk1/ppp2ppp/4pn2/3p4/2PP4/P1PBP3/5PPP/R1BQK1NR b KQ - +E49 +rnbq1rk1/ppp2ppp/5n2/2bPN3/8/2N5/PPPP1PPP/R1BQKB1R b KQ - +C56* +rnbq1rk1/pppp1ppp/4pn2/8/1bPP4/2N1P3/PP3PPP/R1BQKBNR w KQ - +E46 +rnbq1rk1/pppp1ppp/4pn2/8/1bPP4/2N1PN2/PP3PPP/R1BQKB1R b KQ - +E50 +rnbq1rk1/pppp1ppp/4pn2/8/1bPP4/2NBP3/PP3PPP/R1BQK1NR b KQ - +E47 +rnbq1rk1/pppp1ppp/4pn2/8/2PP4/P1P1P3/5PPP/R1BQKBNR b KQ - +E28 +rnbq1rk1/pppp1ppp/4pn2/8/2PP4/P1P5/4PPPP/R1BQKBNR w KQ - +E27 +rnbq1rk1/pppp1ppp/5n2/4N3/1b2P3/2N5/PPPP1PPP/R1BQKB1R b KQ - +C67* +rnbq1rk1/pppp1ppp/5n2/4p3/1b2P3/2NP1N2/PPP2PPP/R1BQKB1R b KQ - +C66* +rnbq1rk1/pppp1ppp/5n2/4p3/4P3/P1P2N2/1PP1BPPP/R1BQK2R b KQ - +C85* +rnbq1rk1/pppp1ppp/5n2/4p3/4P3/P1P5/1PP2PPP/R1BQKBNR w KQ - +C69* +rnbq1rk1/pppp1ppp/5n2/b3N3/4P3/P1N5/1PPP1PPP/R1BQKB1R b KQ - +C80* +rnbq1rk1/pppp1ppp/5n2/b3p3/4P3/P1N2N2/1PPP1PPP/R1BQKB1R w KQ - +C78* +rnbq1rk1/pppp1ppp/5n2/b3p3/4P3/P1N2N2/1PPPBPPP/R1BQK2R b KQ - +C84* +rnbq1rk1/pppp1ppp/5n2/b3p3/4P3/P1NP1N2/1PP2PPP/R1BQKB1R b KQ - +C79* +rnbq1rk1/pppp1ppp/5n2/b3p3/4P3/P1NP4/1PP2PPP/R1BQKBNR w KQ - +C72* +rnbq1rk1/ppppb1pp/4pn2/5p2/2PP4/5NP1/PP2PPBP/RNBQK2R w KQ - +A92 +rnbqk1nr/pp2ppbp/6p1/2pp4/3P4/4PN2/PPP2PPP/RNBQKB1R w KQkq - +E01* +rnbqk1nr/pp2ppbp/6p1/2pp4/5P2/4PN2/PPPP2PP/RNBQKB1R w KQkq - +A90* +rnbqk1nr/pp2ppbp/6p1/2pp4/5P2/4PN2/PPPPB1PP/RNBQK2R b KQkq - +A91* +rnbqk1nr/pp2ppbp/6p1/3p4/3N4/6P1/PPP1PPBP/RNBQK2R b KQkq - +D71* +rnbqk1nr/pp3ppp/4p3/2ppP3/1b1P4/2N5/PPP2PPP/R1BQKBNR w KQkq - +C17 +rnbqk1nr/pp3ppp/4p3/2ppP3/3P4/P1P5/2P2PPP/R1BQKBNR b KQkq - +C18 +rnbqk1nr/ppp1ppbp/3p2p1/8/2PPP3/2N5/PP3PPP/R1BQKBNR b KQkq - +A42 +rnbqk1nr/ppp2ppp/4p3/3p4/1b1PP3/2N5/PPP2PPP/R1BQKBNR w KQkq - +C15 +rnbqk1nr/ppp2ppp/4p3/3pP3/1b1P4/2N5/PPP2PPP/R1BQKBNR b KQkq - +C16 +rnbqk1nr/pppp1pbp/8/6p1/2B1Pp2/5N2/PPPP2PP/RNBQK2R w KQkq - +C38 +rnbqk1nr/pppp1ppp/8/2b1p3/4P3/5N2/PPPP1PPP/RNBQKB1R b KQkq - +C24* +rnbqk1nr/pppp1ppp/8/2b1p3/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +C23* +rnbqk1nr/ppppbppp/8/8/4Pp2/5N2/PPPP2PP/RNBQKB1R w KQkq - +C35 +rnbqk2r/1p2bppp/p2ppn2/6B1/3NPP2/2N5/PPP3PP/R2QKB1R w KQkq - +B98 +rnbqk2r/p1pp1ppp/1p2pn2/8/1bPP4/2N1P3/PP2NPPP/R1BQKB1R b KQkq - +E44 +rnbqk2r/p1pp1ppp/1p2pn2/8/1bPP4/2N1P3/PP3PPP/R1BQKBNR w KQkq - +E43 +rnbqk2r/p1pp1ppp/5n2/1pb1p3/2B1P3/2N5/PPPP1PPP/R1BQK1NR w KQkq - +C51* +rnbqk2r/p2p1ppp/2p2n2/2b1p3/B3P3/2N5/PPPP1PPP/R1BQK1NR b KQkq - +C52* +rnbqk2r/pp1p1ppp/2p2n2/2b1p3/2B1P3/2N5/PPPP1PPP/R1BQK1NR w KQkq - +C53* +rnbqk2r/pp1p1ppp/2p2n2/b3p3/4P3/P1NP4/1PP2PPP/R1BQKBNR w KQkq - +C74* +rnbqk2r/pp1p1ppp/2p2n2/b3p3/4P3/P1NP4/1PPB1PPP/R2QKBNR b KQkq - +C75* +rnbqk2r/pp1p1ppp/4pn2/2p5/1bPP4/2N1P3/PP2NPPP/R1BQKB1R b KQkq - +E42 +rnbqk2r/pp1p1ppp/4pn2/2p5/1bPP4/2N1P3/PP3PPP/R1BQKBNR w KQkq - +E41 +rnbqk2r/pp1p1ppp/4pn2/2p5/1bPP4/2N5/PPQ1PPPP/R1B1KBNR w KQkq - +E38 +rnbqk2r/pp1p1ppp/4pn2/2p5/2PP4/P1P1P3/5PPP/R1BQKBNR b KQkq - +E26 +rnbqk2r/pp2npbp/6p1/3pp3/8/1N4P1/PPP1PPBP/RNBQK2R w KQkq - +D72* +rnbqk2r/pp2nppp/4p3/2ppP3/3P4/P1P5/2P2PPP/R1BQKBNR w KQkq - +C19 +rnbqk2r/pp2ppbp/3p1np1/8/3NP3/2N1BP2/PPP3PP/R2QKB1R b KQkq - +B75 +rnbqk2r/pp2ppbp/5np1/1Bpp4/8/1P2PN2/PBPP1PPP/RN1QK2R b KQkq - +E16* +rnbqk2r/pp2ppbp/5np1/2Pp4/8/4PN2/PPP1BPPP/RNBQK2R b KQkq - +E05* +rnbqk2r/pp2ppbp/5np1/2Pp4/8/4PN2/PPP2PPP/RNBQKB1R w KQkq - +E04* +rnbqk2r/pp2ppbp/5np1/2pp4/3P4/4PN2/PPP1BPPP/RNBQK2R w KQkq - +E06* +rnbqk2r/pp2ppbp/5np1/2pp4/3P4/5NP1/PPP1PPBP/RNBQ1RK1 b kq - +D73* +rnbqk2r/pp2ppbp/5np1/2pp4/5P2/4PN2/PPPPB1PP/RNBQ1RK1 b kq - +A92* +rnbqk2r/pp2ppbp/5np1/2pp4/5P2/5NP1/PPPPP1BP/RNBQK2R w KQkq - +A87* +rnbqk2r/pp2ppbp/5np1/2pp4/8/1P2PN2/PBPPBPPP/RN1QK2R b KQkq - +E17* +rnbqk2r/pp3pbp/3p1np1/1BpP4/4PP2/2N5/PP4PP/R1BQK1NR b KQkq - +A67 +rnbqk2r/pp3pbp/3p1np1/2pP4/4P3/2N2N2/PP2BPPP/R1BQK2R b KQkq - +A71 +rnbqk2r/pp3pp1/3ppn1p/2pP4/1bP4B/2N5/PP2PPPP/R2QKBNR w KQkq - +E31 +rnbqk2r/pp3ppp/2p2n2/b2pp3/4P3/P1NP2P1/1PPB1P1P/R2QKBNR b KQkq - +C76* +rnbqk2r/pp3ppp/4pn2/2pP4/3P4/P1P2P2/4P1PP/R1BQKBNR b KQkq - +E25 +rnbqk2r/pp3ppp/5n2/2bpp3/2B5/2N2N2/PPPP1PPP/R1BQK2R w KQkq - +C54* +rnbqk2r/ppp1bppp/4pn2/3p2B1/2PP4/2N5/PP2PPPP/R2QKBNR w KQkq - +D53 +rnbqk2r/ppp1bppp/4pn2/3p2B1/3PP3/2N5/PPP2PPP/R2QKBNR w KQkq - +C13 +rnbqk2r/ppp1bppp/4pn2/3p4/2P5/5NP1/PP1PPPBP/RNBQ1RK1 b kq - +A14 +rnbqk2r/ppp1bppp/4pn2/3p4/2PP4/5NP1/PP2PPBP/RNBQK2R b KQkq - +E06 +rnbqk2r/ppp1bppp/4pn2/8/2pP4/5NP1/PP2PPBP/RNBQK2R w KQkq - +E05 +rnbqk2r/ppp1ppbp/1n4p1/8/3PP3/6P1/PP2NPBP/RNBQK2R b KQkq - +D72 +rnbqk2r/ppp1ppbp/3p1np1/8/2PP4/2N2NP1/PP2PP1P/R1BQKB1R b KQkq - +E62 +rnbqk2r/ppp1ppbp/3p1np1/8/2PPP3/2N2N2/PP3PPP/R1BQKB1R b KQkq - +E90 +rnbqk2r/ppp1ppbp/3p1np1/8/2PPP3/2N2P2/PP4PP/R1BQKBNR b KQkq - +E80 +rnbqk2r/ppp1ppbp/3p1np1/8/2PPP3/2N3P1/PP3P1P/R1BQKBNR b KQkq - +E72 +rnbqk2r/ppp1ppbp/3p1np1/8/2PPP3/2N4P/PP3PP1/R1BQKBNR b KQkq - +E71 +rnbqk2r/ppp1ppbp/3p1np1/8/2PPP3/2N5/PP2BPPP/R1BQK1NR b KQkq - +E73 +rnbqk2r/ppp1ppbp/3p1np1/8/2PPPP2/2N5/PP4PP/R1BQKBNR b KQkq - +E76 +rnbqk2r/ppp1ppbp/5np1/3p2B1/2PP4/2N2N2/PP2PPPP/R2QKB1R b KQkq - +D91 +rnbqk2r/ppp1ppbp/5np1/3p4/2PP1B2/2N2N2/PP2PPPP/R2QKB1R b KQkq - +D92 +rnbqk2r/ppp1ppbp/5np1/3p4/2PP4/1QN2N2/PP2PPPP/R1B1KB1R b KQkq - +D96 +rnbqk2r/ppp1ppbp/5np1/3p4/2PP4/2N1PN2/PP3PPP/R1BQKB1R b KQkq - +D94 +rnbqk2r/ppp1ppbp/6p1/3n4/3P4/6P1/PP2PPBP/RNBQK1NR w KQkq - +D71 +rnbqk2r/ppp1ppbp/6p1/8/2BPP3/2P5/P4PPP/R1BQK1NR b KQkq - +D86 +rnbqk2r/ppp2ppp/3b4/3np3/8/P3P3/1P1P1PPP/RNBQKBNR w KQkq - +B42* +rnbqk2r/ppp2ppp/4p3/3p4/2PPn3/P7/1PQ1PPPP/R1B1KBNR b KQkq - +E37 +rnbqk2r/ppp2ppp/4pn2/3p2B1/1b1PP3/2N5/PPP2PPP/R2QKBNR w KQkq - +C12 +rnbqk2r/ppp2ppp/4pn2/3p4/1bPP4/2N2N2/PP2PPPP/R1BQKB1R w KQkq - +D38 +rnbqk2r/ppp2ppp/4pn2/3p4/1bPP4/2N5/PPQ1PPPP/R1B1KBNR w KQkq - +E34 +rnbqk2r/ppp2ppp/4pn2/3p4/1bPP4/P1N5/1PQ1PPPP/R1B1KBNR b KQkq - +E36 +rnbqk2r/ppp2ppp/4pn2/6B1/1bpP4/2N2N2/PP2PPPP/R2QKB1R w KQkq - +D39 +rnbqk2r/ppp2ppp/5n2/3p4/1b1P4/2N5/PPQ1PPPP/R1B1KBNR w KQkq - +E35 +rnbqk2r/ppp2ppp/5n2/3pp3/4P3/P1PP4/2P2PPP/R1BQKBNR w KQkq - +C73* +rnbqk2r/ppp3pp/5p2/3np3/1b2P3/3P1N2/PP3PPP/RNBQKB1R w KQkq - +B55* +rnbqk2r/pppp1ppp/4pn2/6B1/1bPP4/2N5/PP2PPPP/R2QKBNR b KQkq - +E30 +rnbqk2r/pppp1ppp/4pn2/8/1bPP4/1QN5/PP2PPPP/R1B1KBNR b KQkq - +E22 +rnbqk2r/pppp1ppp/4pn2/8/1bPP4/2N1P3/PP3PPP/R1BQKBNR b KQkq - +E40 +rnbqk2r/pppp1ppp/4pn2/8/1bPP4/2N2N2/PP2PPPP/R1BQKB1R b KQkq - +E21 +rnbqk2r/pppp1ppp/4pn2/8/1bPP4/2N5/PP2PPPP/R1BQKBNR w KQkq - +E20 +rnbqk2r/pppp1ppp/4pn2/8/1bPP4/2N5/PPQ1PPPP/R1B1KBNR b KQkq - +E32 +rnbqk2r/pppp1ppp/4pn2/8/1bPP4/5N2/PP2PPPP/RNBQKB1R w KQkq - +E11 +rnbqk2r/pppp1ppp/4pn2/8/2PP4/P1P5/4PPPP/R1BQKBNR b KQkq - +E24 +rnbqk2r/pppp1ppp/5n2/2b1p3/4P3/2N2N2/PPPP1PPP/R1BQKB1R b KQkq - +C55* +rnbqk2r/pppp1ppp/5n2/2b1p3/4P3/2N5/PPPP1PPP/R1BQKBNR w KQkq - +C50* +rnbqk2r/pppp1ppp/5n2/3Np3/1b2P3/8/PPPP1PPP/R1BQKBNR b KQkq - +C61* +rnbqk2r/pppp1ppp/5n2/4p3/1b2P3/2N2N2/PPPP1PPP/R1BQKB1R b KQkq - +C65* +rnbqk2r/pppp1ppp/5n2/4p3/1b2P3/2N5/PPPP1PPP/R1BQKBNR w KQkq - +C60* +rnbqk2r/pppp1ppp/5n2/4p3/1b2P3/2NP4/PPP2PPP/R1BQKBNR b KQkq - +C62* +rnbqk2r/pppp1ppp/5n2/4p3/1b2PP2/2N5/PPPP2PP/R1BQKBNR b KQkq - +C63* +rnbqk2r/pppp1ppp/5n2/4p3/1bB1P3/2N5/PPPP1PPP/R1BQK1NR b KQkq - +C64* +rnbqk2r/pppp1ppp/5n2/4p3/1bP5/2N3P1/PP1PPP1P/R1BQKBNR b KQkq - +B31* +rnbqk2r/pppp1ppp/5n2/4p3/1bP5/3P4/PP1BPPPP/RN1QKBNR b KQkq - +B52* +rnbqk2r/pppp1ppp/5n2/4p3/1bP5/3P4/PP2PPPP/RNBQKBNR w KQkq - +B51* +rnbqk2r/pppp1ppp/5n2/4p3/4P3/P1b5/1PPP1PPP/R1BQKBNR w KQkq - +C68* +rnbqk2r/pppp1ppp/5n2/b3p3/4P3/P1N2N2/1PPP1PPP/R1BQKB1R b KQkq - +C77* +rnbqk2r/pppp1ppp/5n2/b3p3/4P3/P1N5/1PPP1PPP/R1BQKBNR w KQkq - +C70* +rnbqk2r/pppp1ppp/5n2/b3p3/4P3/P1NP4/1PP2PPP/R1BQKBNR b KQkq - +C71* +rnbqk2r/pppp1ppp/8/2b1p3/4P1n1/2N2N2/PPPP1PPP/R1BQKB1R w KQkq - +C57* +rnbqk2r/pppp1ppp/8/2b5/N2pP1n1/5N2/PPP2PPP/R1BQKB1R b KQkq - +C58* +rnbqk2r/pppp2pp/5n2/2b1pP2/6P1/8/PPPP1PBP/RNBQK1NR b KQkq - +C38* +rnbqk2r/ppppb1pp/4pn2/5p2/2PP4/6P1/PP2PPBP/RNBQK1NR w KQkq - +A91 +rnbqk2r/ppppbppp/8/8/N3P1n1/2P2N1P/P4PP1/R1BQKB1R b KQkq - +C59* +rnbqk2r/ppppp1bp/5np1/5p2/2PP4/5NP1/PP2PPBP/RNBQK2R b KQkq - +A87 +rnbqk2r/ppppppbp/5np1/8/2PP4/8/PP2PPPP/RNBQKBNR w KQkq - +A08* +rnbqk2r/ppppppbp/5np1/8/2PPP3/2N5/PP3PPP/R1BQKBNR b KQkq - +E70 +rnbqkb1r/1p2pppp/p2p1n2/6B1/3NP3/2N5/PPP2PPP/R2QKB1R b KQkq - +B94 +rnbqkb1r/1p2pppp/p2p1n2/8/3NP3/2N3P1/PPP2P1P/R1BQKB1R b KQkq - +B91 +rnbqkb1r/1p2pppp/p2p1n2/8/3NP3/2N5/PPP1BPPP/R1BQK2R b KQkq - +B92 +rnbqkb1r/1p2pppp/p2p1n2/8/3NP3/2N5/PPP2PPP/R1BQKB1R w KQkq - +B90 +rnbqkb1r/1p2pppp/p2p1n2/8/3NPP2/2N5/PPP3PP/R1BQKB1R b KQkq - +B93 +rnbqkb1r/1p3ppp/p2ppn2/6B1/3NP3/2N5/PPP2PPP/R2QKB1R w KQkq - +B95 +rnbqkb1r/1p3ppp/p2ppn2/6B1/3NPP2/2N5/PPP3PP/R2QKB1R b KQkq - +B96 +rnbqkb1r/1p3ppp/p2ppn2/8/3NP3/2N5/PPP1BPPP/R1BQK2R w KQkq - +B84 +rnbqkb1r/1p3ppp/p3pn2/2p5/2BP4/4PN2/PP2QPPP/RNB2RK1 b kq - +D28 +rnbqkb1r/1p3ppp/p3pn2/2p5/2BP4/4PN2/PP3PPP/RNBQ1RK1 w kq - +D27 +rnbqkb1r/3ppppp/P4n2/2pP4/8/8/PP2PPPP/RNBQKBNR b KQkq - +A58 +rnbqkb1r/5ppp/p2ppn2/1p6/3NP3/1BN5/PPP2PPP/R1BQK2R w KQkq - +B87 +rnbqkb1r/p1pp1ppp/1p2pn2/8/2PP4/4PN2/PP3PPP/RNBQKB1R b KQkq - +E14 +rnbqkb1r/p1pp1ppp/1p2pn2/8/2PP4/5N2/PP2PPPP/RNBQKB1R w KQkq - +E12 +rnbqkb1r/p1pp1ppp/1p2pn2/8/2PP4/5NP1/PP2PP1P/RNBQKB1R b KQkq - +E15 +rnbqkb1r/p1pppppp/1p3n2/8/3P4/5N2/PPP1PPPP/RNBQKB1R w KQkq - +A47 +rnbqkb1r/p2ppppp/1p3n2/2p5/3P4/2P5/PP2PPPP/RNBQKBNR w KQkq - +A12* +rnbqkb1r/p2ppppp/5n2/1ppP4/2P5/8/PP2PPPP/RNBQKBNR w KQkq - +A57 +rnbqkb1r/pp1p1ppp/2p2n2/4p3/2P5/2N3P1/PP1PPP1P/R1BQKBNR w KQkq - +A23 +rnbqkb1r/pp1p1ppp/4pn2/2p5/2P1P3/2N5/PP1P1PPP/R1BQKBNR w KQkq - +A19 +rnbqkb1r/pp1p1ppp/4pn2/2pP4/2P5/8/PP2PPPP/RNBQKBNR w KQkq - +A60 +rnbqkb1r/pp1p1ppp/4pn2/8/2PN4/8/PP2PPPP/RNBQKB1R w KQkq - +A32 +rnbqkb1r/pp1ppppp/5n2/2p5/2PP4/5N2/PP2PPPP/RNBQKB1R b KQkq - +A31 +rnbqkb1r/pp1ppppp/5n2/2p5/2PP4/8/PP2PPPP/RNBQKBNR w KQkq - +A56 +rnbqkb1r/pp1ppppp/5n2/2p5/3P4/8/PPP1PPPP/RNBQKBNR w KQkq - +A09* +rnbqkb1r/pp1ppppp/5n2/2p5/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - +B29 +rnbqkb1r/pp2pp1p/2p2p2/8/3P4/8/PPP2PPP/R1BQKBNR w KQkq - +B16 +rnbqkb1r/pp2pp1p/3p1np1/8/3NP3/2N1B3/PPP2PPP/R2QKB1R b KQkq - +B72 +rnbqkb1r/pp2pp1p/3p1np1/8/3NP3/2N5/PPP2PPP/R1BQKB1R w KQkq - +B70 +rnbqkb1r/pp2pp1p/3p1np1/8/3NPP2/2N5/PPP3PP/R1BQKB1R b KQkq - +B71 +rnbqkb1r/pp2pp1p/5np1/2pP4/4p3/2N5/PPP2PPP/R1BQKBNR w KQkq - +D09* +rnbqkb1r/pp2pp1p/5np1/2pp4/8/1P2PN2/P1PP1PPP/RNBQKB1R w KQkq - +E15* +rnbqkb1r/pp2pppp/2p2n2/3p4/2PP4/2N2N2/PP2PPPP/R1BQKB1R b KQkq - +D15 +rnbqkb1r/pp2pppp/2p2n2/8/P1pP4/2N2N2/1P2PPPP/R1BQKB1R b KQkq - +D16 +rnbqkb1r/pp2pppp/3p1n2/8/3NP3/2N5/PPP2PPP/R1BQKB1R b KQkq - +B56 +rnbqkb1r/pp2pppp/5n2/1Bpp4/8/4PN2/PPPP1PPP/RNBQK2R b KQkq - +E11* +rnbqkb1r/pp2pppp/5n2/2Pp4/8/5N2/PPP1PPPP/RNBQKB1R b KQkq - +D23* +rnbqkb1r/pp2pppp/5n2/2Pp4/8/8/PPP1PPPP/RNBQKBNR w KQkq - +D21* +rnbqkb1r/pp2pppp/5n2/2pp4/2P5/5N2/PP1PPPPP/RNBQKB1R w KQkq - +A31* +rnbqkb1r/pp2pppp/5n2/2pp4/3P4/2P5/PP2PPPP/RNBQKBNR w KQkq - +D11* +rnbqkb1r/pp2pppp/5n2/2pp4/3P4/5NP1/PPP1PP1P/RNBQKB1R b KQkq - +D70* +rnbqkb1r/pp2pppp/5n2/2pp4/8/1P2PN2/P1PP1PPP/RNBQKB1R b KQkq - +E12* +rnbqkb1r/pp2pppp/5n2/2pp4/8/4PN2/PPPP1PPP/RNBQKB1R w KQkq - +E10* +rnbqkb1r/pp2pppp/5n2/3p4/2PP4/2N5/PP3PPP/R1BQKBNR b KQkq - +B14 +rnbqkb1r/pp2pppp/5n2/3p4/3P4/5N2/PP2PPPP/RNBQKB1R b KQkq - +D13* +rnbqkb1r/pp2pppp/5n2/3p4/3P4/5N2/PP2PPPP/RNBQKB1R w KQkq - +D13 +rnbqkb1r/pp2pppp/8/2pn4/8/4PN2/PP1P1PPP/RNBQKB1R b KQkq - +A32* +rnbqkb1r/pp3p1p/3p1np1/2pP4/4P3/2N2N2/PP3PPP/R1BQKB1R b KQkq - +A70 +rnbqkb1r/pp3p1p/3p1np1/2pP4/4PP2/2N5/PP4PP/R1BQKBNR b KQkq - +A66 +rnbqkb1r/pp3p1p/3p1np1/2pP4/8/2N2N2/PP2PPPP/R1BQKB1R w KQkq - +A61 +rnbqkb1r/pp3ppp/2p1pn2/3p4/2PP4/2N1PN2/PP3PPP/R1BQKB1R b KQkq - +D45 +rnbqkb1r/pp3ppp/2p1pn2/3p4/2PP4/2N2N2/PP2PPPP/R1BQKB1R w KQkq - +D43 +rnbqkb1r/pp3ppp/2p1pn2/6B1/2pP4/2N2N2/PP2PPPP/R2QKB1R w KQkq - +D44 +rnbqkb1r/pp3ppp/2p2n2/3p2B1/3P4/2N5/PPQ1PPPP/R3KBNR b KQkq - +D36 +rnbqkb1r/pp3ppp/3p1n2/1B2p3/3NP3/5P2/PPP3PP/RNBQK2R b KQkq - +B55 +rnbqkb1r/pp3ppp/3p1n2/2pP4/4P3/2N5/PP3PPP/R1BQKBNR b KQkq - +A65 +rnbqkb1r/pp3ppp/3ppn2/8/2BNP3/2N5/PPP2PPP/R1BQK2R b KQkq - +B86 +rnbqkb1r/pp3ppp/3ppn2/8/3NP1P1/2N5/PPP2P1P/R1BQKB1R b KQkq - +B81 +rnbqkb1r/pp3ppp/3ppn2/8/3NP3/2N5/PPP1BPPP/R1BQK2R b KQkq - +B83 +rnbqkb1r/pp3ppp/3ppn2/8/3NP3/2N5/PPP2PPP/R1BQKB1R w KQkq - +B80 +rnbqkb1r/pp3ppp/3ppn2/8/3NPP2/2N5/PPP3PP/R1BQKB1R b KQkq - +B82 +rnbqkb1r/pp3ppp/4pn2/2Pp4/8/4PN2/PPP2PPP/RNBQKB1R b KQkq - +D26* +rnbqkb1r/pp3ppp/4pn2/2Pp4/8/5N2/PPP1PPPP/RNBQKB1R w KQkq - +D25* +rnbqkb1r/pp3ppp/4pn2/2Pp4/8/P7/1PP1PPPP/RNBQKBNR w KQkq - +D22* +rnbqkb1r/pp3ppp/4pn2/2pP4/3P4/2N2N2/PP2PPPP/R1BQKB1R b KQkq - +D41 +rnbqkb1r/pp3ppp/4pn2/2pp4/2PP4/2N2N2/PP2PPPP/R1BQKB1R w KQkq - +D40 +rnbqkb1r/pp3ppp/4pn2/2pp4/3P1B2/2P2N2/PP2PPPP/RN1QKB1R b KQkq - +D12* +rnbqkb1r/pp3ppp/4pn2/2pp4/8/1P2PN2/P1PP1PPP/RNBQKB1R w KQkq - +E14* +rnbqkb1r/pp3ppp/8/2pnp3/8/2N3P1/PP1PPP1P/R1BQKBNR w KQkq - +B36* +rnbqkb1r/pp3ppp/8/2pnp3/8/2N3P1/PP1PPPBP/R1BQK1NR b KQkq - +B37* +rnbqkb1r/ppp1pp1p/3p1np1/8/3PP3/2N2N2/PPP2PPP/R1BQKB1R b KQkq - +B07 +rnbqkb1r/ppp1pp1p/3p1np1/8/3PPP2/2N5/PPP3PP/R1BQKBNR b KQkq - +B08 +rnbqkb1r/ppp1pp1p/5np1/3p2B1/2PP4/2N5/PP2PPPP/R2QKBNR b KQkq - +D80 +rnbqkb1r/ppp1pp1p/5np1/3p4/2PP1B2/2N5/PP2PPPP/R2QKBNR b KQkq - +D82 +rnbqkb1r/ppp1pp1p/5np1/3p4/2PP4/1QN5/PP2PPPP/R1B1KBNR b KQkq - +D81 +rnbqkb1r/ppp1pp1p/5np1/3p4/2PP4/2N2N2/PP2PPPP/R1BQKB1R b KQkq - +D90 +rnbqkb1r/ppp1pp1p/5np1/3p4/2PP4/5N2/PP2PPPP/RNBQKB1R w KQkq - +D70 +rnbqkb1r/ppp1pp1p/5np1/3p4/2PP4/5P2/PP2P1PP/RNBQKBNR w KQkq - +D70 +rnbqkb1r/ppp1pp1p/5np1/3p4/8/5NP1/PPPPPP1P/RNBQKB1R w KQkq - +A49* +rnbqkb1r/ppp1pp1p/6p1/3n4/3P4/2N5/PP2PPPP/R1BQKBNR w KQkq - +D85 +rnbqkb1r/ppp1pppp/3p1n2/8/2PP4/8/PP2PPPP/RNBQKBNR w KQkq - +A53 +rnbqkb1r/ppp1pppp/3p1n2/8/3PP3/8/PPP2PPP/RNBQKBNR w KQkq - +B09 +rnbqkb1r/ppp1pppp/3p4/3nP3/3P4/5N2/PPP2PPP/RNBQKB1R b KQkq - +B04 +rnbqkb1r/ppp1pppp/5n2/3p2B1/3P4/2N5/PPP1PPPP/R2QKBNR b KQkq - +D01 +rnbqkb1r/ppp1pppp/5n2/3p2B1/3P4/5N2/PPP1PPPP/RN1QKB1R b KQkq - +D03 +rnbqkb1r/ppp1pppp/5n2/3p4/3P4/4PN2/PPP2PPP/RNBQKB1R b KQkq - +D04 +rnbqkb1r/ppp1pppp/5n2/3p4/3P4/8/PPP1PPPP/RNBQKBNR w KQkq - +D02* +rnbqkb1r/ppp1pppp/5n2/3p4/8/1P3N2/P1PPPPPP/RNBQKB1R b KQkq - +A47* +rnbqkb1r/ppp1pppp/5n2/3p4/8/5N2/PPPPPPPP/RNBQKB1R w KQkq - +A46* +rnbqkb1r/ppp1pppp/5n2/3p4/8/5NP1/PPPPPP1P/RNBQKB1R b KQkq - +A48* +rnbqkb1r/ppp1pppp/5n2/8/2pP4/2N2N2/PP2PPPP/R1BQKB1R b KQkq - +D24 +rnbqkb1r/ppp1pppp/5n2/8/2pP4/4PN2/PP3PPP/RNBQKB1R b KQkq - +D25 +rnbqkb1r/ppp1pppp/5n2/8/2pP4/5N2/PP2PPPP/RNBQKB1R w KQkq - +D23 +rnbqkb1r/ppp2ppp/3p1n2/4p3/2PP4/2N2N2/PP2PPPP/R1BQKB1R b KQkq - +A54 +rnbqkb1r/ppp2ppp/4pn2/3p2B1/2PP4/2N5/PP2PPPP/R2QKBNR b KQkq - +D50 +rnbqkb1r/ppp2ppp/4pn2/3p4/2PP4/2N2N2/PP2PPPP/R1BQKB1R b KQkq - +D37 +rnbqkb1r/ppp2ppp/4pn2/3p4/2PP4/2N5/PP2PPPP/R1BQKBNR w KQkq - +D35 +rnbqkb1r/ppp2ppp/4pn2/3p4/2PP4/6P1/PP2PPBP/RNBQK1NR b KQkq - +E01 +rnbqkb1r/ppp2ppp/4pn2/3p4/3P4/4PN2/PPP2PPP/RNBQKB1R b KQkq - +D05* +rnbqkb1r/ppp2ppp/4pn2/3p4/3P4/4PN2/PPP2PPP/RNBQKB1R w KQkq - +D05 +rnbqkb1r/ppp2ppp/4pn2/3p4/3P4/5N2/PPP1PPPP/RNBQKB1R w KQkq - +D04* +rnbqkb1r/ppp2ppp/4pn2/3p4/3PP3/2N5/PPP2PPP/R1BQKBNR w KQkq - +C11 +rnbqkb1r/ppp2ppp/4pn2/3p4/3PP3/8/PPPN1PPP/R1BQKBNR w KQkq - +C05 +rnbqkb1r/ppp2ppp/4pn2/8/2pP4/4PN2/PP3PPP/RNBQKB1R w KQkq - +D26 +rnbqkb1r/ppp2ppp/4pn2/8/2pP4/5NP1/PP2PPBP/RNBQK2R b KQkq - +E04 +rnbqkb1r/ppp2ppp/4pn2/8/Q1pP4/6P1/PP2PPBP/RNB1K1NR b KQkq - +E02 +rnbqkb1r/ppp2ppp/5n2/3P4/4pP2/3P4/PPP3PP/RNBQKBNR w KQkq - +C32 +rnbqkb1r/ppp2ppp/5n2/3p2B1/3Np3/3P4/PPP1PPPP/RN1QKB1R b KQkq - +B05* +rnbqkb1r/ppp2ppp/5n2/3p4/3Np3/3P4/PPP1PPPP/RNBQKB1R w KQkq - +B04* +rnbqkb1r/ppp2ppp/5n2/3pp3/2P5/2N5/PP1PPPPP/R1BQKBNR w KQkq - +B32* +rnbqkb1r/ppp2ppp/5n2/3pp3/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - +C43* +rnbqkb1r/ppp2ppp/5n2/3pp3/4PP2/2N5/PPPP2PP/R1BQKBNR w KQkq - +C29 +rnbqkb1r/ppp2ppp/8/3np3/8/2N1P3/PP1P1PPP/R1BQKBNR b KQkq - +B44* +rnbqkb1r/ppp2ppp/8/3np3/8/2N3P1/PP1PPP1P/R1BQKBNR b KQkq - +B34* +rnbqkb1r/ppp2ppp/8/3np3/8/2N5/PP1PPPPP/R1BQKBNR w KQkq - +B33* +rnbqkb1r/ppp2ppp/8/3np3/8/2N5/PPPP1PPP/R1BQKBNR w KQkq - +C45* +rnbqkb1r/ppp2ppp/8/3np3/8/3P4/PP2PPPP/RNBQKBNR w KQkq - +B54* +rnbqkb1r/ppp2ppp/8/3np3/8/P3P3/1P1P1PPP/RNBQKBNR b KQkq - +B41* +rnbqkb1r/pppp1p1p/5np1/4p3/2P5/2N3P1/PP1PPP1P/R1BQKBNR w KQkq - +A24 +rnbqkb1r/pppp1ppp/4pn2/8/2P1P3/2N5/PP1P1PPP/R1BQKBNR b KQkq - +A18 +rnbqkb1r/pppp1ppp/4pn2/8/2P5/2N5/PP1PPPPP/R1BQKBNR w KQkq - +A17 +rnbqkb1r/pppp1ppp/4pn2/8/2PP4/5N2/PP2PPPP/RNBQKB1R b KQkq - +E10 +rnbqkb1r/pppp1ppp/4pn2/8/2PP4/6P1/PP2PP1P/RNBQKBNR b KQkq - +E00 +rnbqkb1r/pppp1ppp/5n2/4p3/2B1P3/8/PPPP1PPP/RNBQK1NR w KQkq - +C24 +rnbqkb1r/pppp1ppp/5n2/4p3/2P5/2N5/PP1PPPPP/R1BQKBNR b KQkq - +B30* +rnbqkb1r/pppp1ppp/5n2/4p3/2P5/2N5/PP1PPPPP/R1BQKBNR w KQkq - +A22 +rnbqkb1r/pppp1ppp/5n2/4p3/2P5/3P4/PP2PPPP/RNBQKBNR b KQkq - +B50* +rnbqkb1r/pppp1ppp/5n2/4p3/2P5/4P3/PP1P1PPP/RNBQKBNR b KQkq - +B40* +rnbqkb1r/pppp1ppp/5n2/4p3/2P5/5N2/PP1PPPPP/RNBQKB1R b KQkq - +B29* +rnbqkb1r/pppp1ppp/5n2/4p3/2P5/8/PP1PPPPP/RNBQKBNR w KQkq - +B27* +rnbqkb1r/pppp1ppp/5n2/4p3/2P5/P7/1P1PPPPP/RNBQKBNR b KQkq - +B28* +rnbqkb1r/pppp1ppp/5n2/4p3/2PP4/8/PP2PPPP/RNBQKBNR w KQkq - +A51 +rnbqkb1r/pppp1ppp/5n2/4p3/3PP3/5N2/PPP2PPP/RNBQKB1R b KQkq - +C43 +rnbqkb1r/pppp1ppp/5n2/4p3/4P3/2N5/PPPP1PPP/R1BQKBNR b KQkq - +C44* +rnbqkb1r/pppp1ppp/5n2/4p3/4P3/2N5/PPPP1PPP/R1BQKBNR w KQkq - +C26 +rnbqkb1r/pppp1ppp/5n2/4p3/4P3/3P4/PPP2PPP/RNBQKBNR b KQkq - +C41* +rnbqkb1r/pppp1ppp/5n2/4p3/4P3/5N2/PPPP1PPP/RNBQKB1R b KQkq - +C42* +rnbqkb1r/pppp1ppp/5n2/4p3/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - +C42 +rnbqkb1r/pppp1ppp/5n2/4p3/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +C40* +rnbqkb1r/pppp1ppp/8/4P3/2P3n1/8/PP2PPPP/RNBQKBNR w KQkq - +A52 +rnbqkb1r/pppp1ppp/8/4p3/2B1n3/2N5/PPPP1PPP/R1BQK1NR w KQkq - +C27 +rnbqkb1r/pppp2p1/5n2/4pP1p/6P1/8/PPPP1P1P/RNBQKBNR w KQkq - +C39* +rnbqkb1r/pppp2pp/4pn2/5p2/2PP4/6P1/PP2PPBP/RNBQK1NR b KQkq - +A90 +rnbqkb1r/pppp2pp/5n2/4pP2/3P4/8/PPP2PPP/RNBQKBNR b KQkq - +C36* +rnbqkb1r/pppp2pp/5n2/4pP2/6P1/8/PPPP1P1P/RNBQKBNR b KQkq - +C37* +rnbqkb1r/pppp2pp/5n2/4pP2/8/8/PPPP1PPP/RNBQKBNR w KQkq - +C34* +rnbqkb1r/pppp2pp/5n2/4pP2/8/8/PPPPBPPP/RNBQK1NR b KQkq - +C35* +rnbqkb1r/ppppp1pp/5n2/5p2/2PP4/2N5/PP2PPPP/R1BQKBNR b KQkq - +A85 +rnbqkb1r/ppppp1pp/5n2/5p2/2PP4/6P1/PP2PP1P/RNBQKBNR b KQkq - +A86 +rnbqkb1r/ppppp1pp/5n2/6B1/3Pp3/2N5/PPP2PPP/R2QKBNR b KQkq - +A83 +rnbqkb1r/pppppp1p/5np1/8/2PP4/2N5/PP2PPPP/R1BQKBNR b KQkq - +E61 +rnbqkb1r/pppppp1p/5np1/8/2PP4/8/PP2PPPP/RNBQKBNR w KQkq - +E60 +rnbqkb1r/pppppp1p/5np1/8/3P4/5N2/PPP1PPPP/RNBQKB1R w KQkq - +A48 +rnbqkb1r/pppppp1p/5np1/8/3P4/5NP1/PPP1PP1P/RNBQKB1R b KQkq - +A49 +rnbqkb1r/pppppp1p/5np1/8/3P4/8/PPP1PPPP/RNBQKBNR w KQkq - +A07* +rnbqkb1r/pppppppp/5n2/8/2P5/2N5/PP1PPPPP/R1BQKBNR b KQkq - +A16 +rnbqkb1r/pppppppp/5n2/8/2P5/8/PP1PPPPP/RNBQKBNR w KQkq - +A15 +rnbqkb1r/pppppppp/5n2/8/2PP4/8/PP2PPPP/RNBQKBNR b KQkq - +A50 +rnbqkb1r/pppppppp/5n2/8/3P4/5N2/PPP1PPPP/RNBQKB1R b KQkq - +A46 +rnbqkb1r/pppppppp/5n2/8/3P4/8/PPP1PPPP/RNBQKBNR b KQkq - +A06* +rnbqkb1r/pppppppp/5n2/8/3P4/8/PPP1PPPP/RNBQKBNR w KQkq - +A45 +rnbqkb1r/pppppppp/5n2/8/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +B02 +rnbqkb1r/pppppppp/5n2/8/8/5N2/PPPPPPPP/RNBQKB1R b KQkq - +A05* +rnbqkb1r/pppppppp/5n2/8/8/5N2/PPPPPPPP/RNBQKB1R w KQkq - +A05 +rnbqkb1r/pppppppp/5n2/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - +A04* +rnbqkb1r/pppppppp/8/3nP3/3P4/8/PPP2PPP/RNBQKBNR b KQkq - +B03 +rnbqkbnr/1p1p1ppp/p3p3/8/3NP3/2N5/PPP2PPP/R1BQKB1R b KQkq - +B43 +rnbqkbnr/1p1p1ppp/p3p3/8/3NP3/3B4/PPP2PPP/RNBQK2R b KQkq - +B42 +rnbqkbnr/1p1p1ppp/p3p3/8/3NP3/8/PPP2PPP/RNBQKB1R w KQkq - +B41 +rnbqkbnr/1p1ppppp/p7/2p5/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - +B28 +rnbqkbnr/1pp1pppp/p7/8/2pP4/4PN2/PP3PPP/RNBQKB1R b KQkq - +D22 +rnbqkbnr/p1pppppp/1p6/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - +A01* +rnbqkbnr/pp1p1ppp/2p5/4p3/2P5/8/PP1PPPPP/RNBQKBNR w KQkq - +B22* +rnbqkbnr/pp1p1ppp/4p3/2p5/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - +B40 +rnbqkbnr/pp1p1ppp/8/2pPp3/8/8/PPP1PPPP/RNBQKBNR w KQkq e6 +A44 +rnbqkbnr/pp1ppppp/2p5/8/2P5/8/PP1PPPPP/RNBQKBNR w KQkq - +A11 +rnbqkbnr/pp1ppppp/2p5/8/3PP3/8/PPP2PPP/RNBQKBNR b KQkq - +B12 +rnbqkbnr/pp1ppppp/2p5/8/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +B10 +rnbqkbnr/pp1ppppp/8/2p5/2P5/2N5/PP1PPPPP/R1BQKBNR b KQkq - +A34 +rnbqkbnr/pp1ppppp/8/2p5/2P5/8/PP1PPPPP/RNBQKBNR b KQkq - +A30* +rnbqkbnr/pp1ppppp/8/2p5/2P5/8/PP1PPPPP/RNBQKBNR w KQkq - +A30 +rnbqkbnr/pp1ppppp/8/2p5/3P4/8/PPP1PPPP/RNBQKBNR w KQkq - +A43 +rnbqkbnr/pp1ppppp/8/2p5/3PP3/8/PPP2PPP/RNBQKBNR b KQkq - +B21 +rnbqkbnr/pp1ppppp/8/2p5/4P3/2N5/PPPP1PPP/R1BQKBNR b KQkq - +B23 +rnbqkbnr/pp1ppppp/8/2p5/4P3/2P5/PP1P1PPP/RNBQKBNR b KQkq - +B22 +rnbqkbnr/pp1ppppp/8/2p5/4P3/5N2/PPPP1PPP/RNBQKB1R b KQkq - +B27 +rnbqkbnr/pp1ppppp/8/2p5/4P3/8/PPPP1PPP/RNBQKBNR b KQkq - +A20* +rnbqkbnr/pp1ppppp/8/2p5/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +B20 +rnbqkbnr/pp1ppppp/8/2p5/4PP2/8/PPPP2PP/RNBQKBNR b KQkq - +B21 +rnbqkbnr/pp1ppppp/8/2p5/8/2P5/PP1PPPPP/RNBQKBNR b KQkq - +A11* +rnbqkbnr/pp1ppppp/8/2p5/8/4P3/PPPP1PPP/RNBQKBNR b KQkq - +A13* +rnbqkbnr/pp1ppppp/8/2p5/8/5N2/PPPPPPPP/RNBQKB1R b KQkq - +A15* +rnbqkbnr/pp1ppppp/8/2p5/8/8/PPPPPPPP/RNBQKBNR w KQkq - +A10* +rnbqkbnr/pp2p1pp/5p2/2pp4/3P4/5NP1/PPP1PP1P/RNBQKB1R b KQkq - +D70* +rnbqkbnr/pp2pp1p/6p1/2pp4/5P2/5N2/PPPPP1PP/RNBQKB1R w KQkq - +A86* +rnbqkbnr/pp2pp1p/6p1/2pp4/8/4PN2/PPPP1PPP/RNBQKB1R w KQkq - +E00* +rnbqkbnr/pp2pppp/2p5/3p4/2P5/1P3N2/P2PPPPP/RNBQKB1R b KQkq - +A12 +rnbqkbnr/pp2pppp/2p5/3p4/2PP4/5N2/PP2PPPP/RNBQKB1R b KQkq - +D11 +rnbqkbnr/pp2pppp/2p5/3p4/2PP4/8/PP2PPPP/RNBQKBNR w KQkq - +D10 +rnbqkbnr/pp2pppp/2p5/3p4/3PP3/2N5/PPP2PPP/R1BQKBNR b KQkq - +B15 +rnbqkbnr/pp2pppp/3p4/1Bp5/4P3/5N2/PPPP1PPP/RNBQK2R b KQkq - +B51 +rnbqkbnr/pp2pppp/3p4/2p5/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - +B50 +rnbqkbnr/pp2pppp/3p4/8/3NP3/8/PPP2PPP/RNBQKB1R b KQkq - +B54 +rnbqkbnr/pp2pppp/3p4/8/3QP3/5N2/PPP2PPP/RNB1KB1R b KQkq - +B53 +rnbqkbnr/pp2pppp/8/2Pp4/8/8/PPP1PPPP/RNBQKBNR b KQkq - +D20* +rnbqkbnr/pp2pppp/8/2p3N1/4p3/8/PPPP1PPP/RNBQKB1R b KQkq - +A52* +rnbqkbnr/pp2pppp/8/2p5/1PPp4/5N2/P2PPPPP/RNBQKB1R b KQkq - +A57* +rnbqkbnr/pp2pppp/8/2p5/2Pp4/4PN2/PP1P1PPP/RNBQKB1R b KQkq - +A60* +rnbqkbnr/pp2pppp/8/2pp4/2P5/5N2/PP1PPPPP/RNBQKB1R b KQkq - +A56* +rnbqkbnr/pp2pppp/8/2pp4/3P4/2N5/PPP1PPPP/R1BQKBNR b KQkq - +D07* +rnbqkbnr/pp2pppp/8/2pp4/3P4/2P5/PP2PPPP/RNBQKBNR b KQkq - +D10* +rnbqkbnr/pp2pppp/8/2pp4/3P4/4P3/PPP2PPP/RNBQKBNR b KQkq - +D30* +rnbqkbnr/pp2pppp/8/2pp4/3P4/8/PPP1PPPP/RNBQKBNR w KQkq - +D06* +rnbqkbnr/pp2pppp/8/2pp4/3PP3/8/PPP2PPP/RNBQKBNR b KQkq - +D08* +rnbqkbnr/pp2pppp/8/2pp4/4P3/5N2/PPPP1PPP/RNBQKB1R b KQkq - +A51* +rnbqkbnr/pp2pppp/8/2pp4/5P2/8/PPPPP1PP/RNBQKBNR w KQkq - +A84* +rnbqkbnr/pp2pppp/8/2pp4/8/3P1N2/PPP1PPPP/RNBQKB1R b KQkq - +A53* +rnbqkbnr/pp2pppp/8/2pp4/8/5N2/PPPPPPPP/RNBQKB1R w KQkq - +A50* +rnbqkbnr/pp2pppp/8/2pp4/8/5NP1/PPPPPP1P/RNBQKB1R b KQkq - +E60* +rnbqkbnr/pp2pppp/8/2pp4/8/5NP1/PPPPPPBP/RNBQK2R b KQkq - +A08 +rnbqkbnr/pp2pppp/8/3p4/3P4/8/PPP2PPP/RNBQKBNR w KQkq - +B13 +rnbqkbnr/pp2pppp/8/8/2Pp4/p4N2/3PPPPP/RNBQKB1R w KQkq - +A58* +rnbqkbnr/pp3ppp/4p3/2pp4/2PP4/2N5/PP2PPPP/R1BQKBNR w KQkq - +D32 +rnbqkbnr/pp3ppp/4p3/2pp4/3PP3/8/PPPN1PPP/R1BQKBNR w KQkq - +C07 +rnbqkbnr/pp3ppp/8/2pp4/3P4/8/PPPN1PPP/R1BQKBNR w KQkq - +C08 +rnbqkbnr/ppp1pp1p/6p1/3p4/5P2/8/PPPPP1PP/RNBQKBNR w KQkq - +A81* +rnbqkbnr/ppp1pppp/3p4/8/3P4/8/PPP1PPPP/RNBQKBNR w KQkq - +A41 +rnbqkbnr/ppp1pppp/8/3p4/2P5/5N2/PP1PPPPP/RNBQKB1R b KQkq - +A09 +rnbqkbnr/ppp1pppp/8/3p4/2P5/8/PP1PPPPP/RNBQKBNR b KQkq - +A43* +rnbqkbnr/ppp1pppp/8/3p4/2PP4/8/PP2PPPP/RNBQKBNR b KQkq - +D06 +rnbqkbnr/ppp1pppp/8/3p4/3P4/5N2/PPP1PPPP/RNBQKB1R b KQkq - +D02 +rnbqkbnr/ppp1pppp/8/3p4/3P4/8/PPP1PPPP/RNBQKBNR b KQkq - +D00* +rnbqkbnr/ppp1pppp/8/3p4/3P4/8/PPP1PPPP/RNBQKBNR w KQkq - +D00 +rnbqkbnr/ppp1pppp/8/3p4/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +B01 +rnbqkbnr/ppp1pppp/8/3p4/5P2/8/PPPPP1PP/RNBQKBNR b KQkq - +A80* +rnbqkbnr/ppp1pppp/8/3p4/5P2/8/PPPPP1PP/RNBQKBNR w KQkq - +A03 +rnbqkbnr/ppp1pppp/8/3p4/8/3P4/PPP1PPPP/RNBQKBNR b KQkq - +A41* +rnbqkbnr/ppp1pppp/8/3p4/8/5N2/PPPPPPPP/RNBQKB1R b KQkq - +A45* +rnbqkbnr/ppp1pppp/8/3p4/8/5N2/PPPPPPPP/RNBQKB1R w KQkq - +A06 +rnbqkbnr/ppp1pppp/8/3p4/8/5NP1/PPPPPP1P/RNBQKB1R b KQkq - +A07 +rnbqkbnr/ppp1pppp/8/3p4/8/8/PPPPPPPP/RNBQKBNR w KQkq - +A40* +rnbqkbnr/ppp1pppp/8/8/2PpP3/8/PP1P1PPP/RNBQKBNR b KQkq e3 +A44* +rnbqkbnr/ppp1pppp/8/8/2pP4/5N2/PP2PPPP/RNBQKB1R b KQkq - +D21 +rnbqkbnr/ppp1pppp/8/8/2pP4/8/PP2PPPP/RNBQKBNR w KQkq - +D20 +rnbqkbnr/ppp2ppp/3p4/4p3/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - +C41 +rnbqkbnr/ppp2ppp/4p3/3p4/2PP4/2N5/PP2PPPP/R1BQKBNR b KQkq - +D31 +rnbqkbnr/ppp2ppp/4p3/3p4/2PP4/8/PP2PPPP/RNBQKBNR w KQkq - +D30 +rnbqkbnr/ppp2ppp/4p3/3p4/3PP3/2N5/PPP2PPP/R1BQKBNR b KQkq - +C10 +rnbqkbnr/ppp2ppp/4p3/3p4/3PP3/8/PPPN1PPP/R1BQKBNR b KQkq - +C03 +rnbqkbnr/ppp2ppp/4p3/3pP3/3P4/8/PPP2PPP/RNBQKBNR b KQkq - +C02 +rnbqkbnr/ppp2ppp/8/3Pp3/8/8/PPPP1PPP/RNBQKBNR b KQkq - +C21* +rnbqkbnr/ppp2ppp/8/3p4/3Np3/8/PPPPPPPP/RNBQKB1R w KQkq - +B03* +rnbqkbnr/ppp2ppp/8/3p4/3P4/8/PP2PPPP/RNBQKBNR b KQkq - +B13* +rnbqkbnr/ppp2ppp/8/3p4/3P4/8/PPP2PPP/RNBQKBNR b KQkq - +C01* +rnbqkbnr/ppp2ppp/8/3p4/3P4/8/PPP2PPP/RNBQKBNR w KQkq - +C01 +rnbqkbnr/ppp2ppp/8/3p4/3Pp3/4P3/PPP2PPP/RNBQKBNR w KQkq - +C02* +rnbqkbnr/ppp2ppp/8/3p4/4Pp2/5N2/PPPP2PP/RNBQKB1R w KQkq - +C36 +rnbqkbnr/ppp2ppp/8/3pp3/2P5/8/PP1PPPPP/RNBQKBNR w KQkq - +B21* +rnbqkbnr/ppp2ppp/8/3pp3/2PP4/8/PP2PPPP/RNBQKBNR w KQkq - +D08 +rnbqkbnr/ppp2ppp/8/3pp3/4PP2/8/PPPP2PP/RNBQKBNR w KQkq - +C31 +rnbqkbnr/ppp2ppp/8/3pp3/5P2/8/PPPPP1PP/RNBQKBNR w KQkq - +A82* +rnbqkbnr/ppp2ppp/8/3pp3/8/2P5/PP1PPPPP/RNBQKBNR w KQkq - +B12* +rnbqkbnr/ppp2ppp/8/3pp3/8/3P1N2/PPP1PPPP/RNBQKB1R b KQkq - +B09* +rnbqkbnr/ppp3pp/3p4/4Pp2/3p4/5N2/PPP2PPP/RNBQKB1R b KQkq - +C32* +rnbqkbnr/pppp1p1p/8/6p1/4Pp1P/5N2/PPPP2P1/RNBQKB1R b KQkq - +C39 +rnbqkbnr/pppp1p1p/8/6p1/4Pp2/5N2/PPPP2PP/RNBQKB1R w KQkq - +C37 +rnbqkbnr/pppp1ppp/4p3/8/2P5/8/PP1PPPPP/RNBQKBNR w KQkq - +A13 +rnbqkbnr/pppp1ppp/4p3/8/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +C00 +rnbqkbnr/pppp1ppp/8/4p3/2B1P3/8/PPPP1PPP/RNBQK1NR b KQkq - +C23 +rnbqkbnr/pppp1ppp/8/4p3/2P5/2N5/PP1PPPPP/R1BQKBNR b KQkq - +A21 +rnbqkbnr/pppp1ppp/8/4p3/2P5/8/PP1PPPPP/RNBQKBNR b KQkq - +B20* +rnbqkbnr/pppp1ppp/8/4p3/2P5/8/PP1PPPPP/RNBQKBNR w KQkq - +A20 +rnbqkbnr/pppp1ppp/8/4p3/3P4/8/PPP1PPPP/RNBQKBNR b KQkq - +B01* +rnbqkbnr/pppp1ppp/8/4p3/4P3/2N5/PPPP1PPP/R1BQKBNR b KQkq - +C25 +rnbqkbnr/pppp1ppp/8/4p3/4P3/5N2/PPPP1PPP/RNBQKB1R b KQkq - +C40 +rnbqkbnr/pppp1ppp/8/4p3/4P3/8/PPPP1PPP/RNBQKBNR b KQkq - +C20* +rnbqkbnr/pppp1ppp/8/4p3/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +C20 +rnbqkbnr/pppp1ppp/8/4p3/4PP2/8/PPPP2PP/RNBQKBNR b KQkq - +C30 +rnbqkbnr/pppp1ppp/8/4p3/8/2P5/PP1PPPPP/RNBQKBNR b KQkq - +B10* +rnbqkbnr/pppp1ppp/8/4p3/8/4P3/PPPP1PPP/RNBQKBNR b KQkq - +C00* +rnbqkbnr/pppp1ppp/8/4p3/8/5N2/PPPPPPPP/RNBQKB1R b KQkq - +B02* +rnbqkbnr/pppp1ppp/8/4p3/8/6P1/PPPPPP1P/RNBQKBNR b KQkq - +B06* +rnbqkbnr/pppp1ppp/8/4p3/8/8/PPPPPPPP/RNBQKBNR w KQkq - +B00* +rnbqkbnr/pppp1ppp/8/8/3pP3/8/PPP2PPP/RNBQKBNR w KQkq - +C21 +rnbqkbnr/pppp1ppp/8/8/4Pp2/5N2/PPPP2PP/RNBQKB1R b KQkq - +C34 +rnbqkbnr/pppp1ppp/8/8/4Pp2/8/PPPP2PP/RNBQKBNR w KQkq - +C33 +rnbqkbnr/pppp2pp/8/4pP2/8/8/PPPP1PPP/RNBQKBNR b KQkq - +C33* +rnbqkbnr/pppp2pp/8/4pp2/2P5/8/PP1PPPPP/RNBQKBNR w KQkq - +B21* +rnbqkbnr/pppp2pp/8/4pp2/3PP3/8/PPP2PPP/RNBQKBNR b KQkq - +C31* +rnbqkbnr/pppp2pp/8/4pp2/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +C30* +rnbqkbnr/ppppp1pp/8/5p2/2PP4/8/PP2PPPP/RNBQKBNR b KQkq - +A84 +rnbqkbnr/ppppp1pp/8/5p2/3P4/6P1/PPP1PP1P/RNBQKBNR b KQkq - +A81 +rnbqkbnr/ppppp1pp/8/5p2/3P4/8/PPP1PPPP/RNBQKBNR b KQkq - +A03* +rnbqkbnr/ppppp1pp/8/5p2/3P4/8/PPP1PPPP/RNBQKBNR w KQkq - +A80 +rnbqkbnr/ppppp1pp/8/5p2/3PP3/8/PPP2PPP/RNBQKBNR b KQkq - +A82 +rnbqkbnr/ppppp1pp/8/5p2/8/8/PPPPPPPP/RNBQKBNR w KQkq - +A02* +rnbqkbnr/pppppp1p/6p1/8/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +B06 +rnbqkbnr/pppppppp/8/8/2P5/8/PP1PPPPP/RNBQKBNR b KQkq - +A10 +rnbqkbnr/pppppppp/8/8/3P4/8/PPP1PPPP/RNBQKBNR b KQkq - +A40 +rnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBNR b KQkq - +B00 +rnbqkbnr/pppppppp/8/8/5P2/8/PPPPP1PP/RNBQKBNR b KQkq - +A02 +rnbqkbnr/pppppppp/8/8/8/1P6/P1PPPPPP/RNBQKBNR b KQkq - +A01 +rnbqkbnr/pppppppp/8/8/8/5N2/PPPPPPPP/RNBQKB1R b KQkq - +A04 +rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR b KQkq - +A00* +rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - +A00 +rnbqr1k1/pp1p1pp1/1bp2n1p/4p3/1P2P3/P1NP1N1P/2P1BPP1/R1BQ1RK1 b - - +C93* +rnbqr1k1/pp1p1pp1/1bp2n1p/4p3/1P2P3/P1NP1N2/2P1BPPP/R1BQ1RK1 w - - +C92* +rnbqr1k1/pp1p1pp1/1bp2n1p/4p3/1P2P3/P2P1N2/2P1BPPP/RNBQ1RK1 b - - +C94* +rnbqr1k1/pp1p1ppp/1bp2n2/4p3/1P1PP3/P1N2N2/2P1BPPP/R1BQ1RK1 b - - +C89* +rnbqr1k1/pp1p1ppp/1bp2n2/4p3/1P2P3/P1NP1N2/2P1BPPP/R1BQ1RK1 b - - +C90* +rnbqr1k1/pp3pbp/3p1np1/2pP4/4P3/2N2N2/PP2BPPP/R1BQ1RK1 w - - +A76 +rnbqr1k1/pp3pbp/3p1np1/2pP4/4P3/2N5/PP1NBPPP/R1BQ1RK1 b - - +A77 +rnbqr1k1/pp3pbp/3p1np1/2pP4/4PP2/2N2N2/PP2B1PP/R1BQK2R w KQ - +A69 +rnbqr1k1/pp3pp1/1bp2n1p/3pp3/1P2P3/P2P1N2/2P1BPPP/RNBQ1RK1 w - - +C95* +rnbqr1k1/pp3ppp/1bp2n2/3pp3/1P2P3/P1NP1N2/2P1BPPP/R1BQ1RK1 w - - +C91* +rnbqr1k1/ppb2pp1/2p2n1p/3pp3/NPP1P3/P2P1N2/2Q1BPPP/R1B2RK1 b - - +C97* +rnbqr1k1/ppbp1pp1/2p2n1p/4p3/NP2P3/P2P1N2/2P1BPPP/R1BQ1RK1 w - - +C96* +rnbqr1k1/pppp1ppp/1b3n2/4p3/1P2P3/P1N2N2/2PPBPPP/R1BQK2R w KQ - +C88* +rnbqr1k1/pppp1ppp/5n2/b3p3/4P3/P1NP1N2/1PP1BPPP/R1BQK2R b KQ - +C87* diff --git a/lasker-2.2.3/data/book/fen.doc b/lasker-2.2.3/data/book/fen.doc new file mode 100644 index 0000000..da5570c --- /dev/null +++ b/lasker-2.2.3/data/book/fen.doc @@ -0,0 +1,130 @@ + +Opening classification uses modified FEN notation, i.e. the halfmove and +fullmove numbers are dropped since these are irrelvant for opening positions. + +--- + +16.1.1: History + +FEN is based on a 19th century standard for position recording designed by the +Scotsman David Forsyth, a newspaper journalist. The original Forsyth standard +has been slightly extended for use with chess software by Steven Edwards with +assistance from commentators on the Internet. This new standard, FEN, was +first implemented in Edwards' SAN Kit. + +16.1.2: Uses for a position notation + +Having a standard position notation is particularly important for chess +programmers as it allows them to share position databases. For example, +there exist standard position notation databases with many of the classical +benchmark tests for chessplaying programs, and by using a common position +notation format many hours of tedious data entry can be saved. Additionally, +a position notation can be useful for page layout programs and for confirming +position status for e-mail competition. + +Many interesting chess problem sets represented using FEN can be found at the +chess.uoknor.edu ftp site in the directory pub/chess/SAN_testsuites. + + +16.1.3: Data fields + +FEN specifies the piece placement, the active color, the castling +availability, the en passant target square, the halfmove clock, and the +fullmove number. These can all fit on a single text line in an easily +read format. The length of a FEN position description varies somewhat +according to the position. In some cases, the description could be eighty +or more characters in length and so may not fit conveniently on some +displays. However, these positions aren't too common. + +A FEN description has six fields. Each field is composed only of non-blank +printing ASCII characters. Adjacent fields are separated by a single ASCII +space character. + + +16.1.3.1: Piece placement data + +The first field represents the placement of the pieces on the board. The +board contents are specified starting with the eighth rank and ending with +the first rank. For each rank, the squares are specified from file a to +file h. White pieces are identified by uppercase SAN piece letters +("PNBRQK") and black pieces are identified by lowercase SAN piece letters +("pnbrqk"). Empty squares are represented by the digits one through eight; +the digit used represents the count of contiguous empty squares along a +rank. A solidus character "/" is used to separate data of adjacent ranks. + + +16.1.3.2: Active color + +The second field represents the active color. A lower case "w" is used if +White is to move; a lower case "b" is used if Black is the active player. + + +16.1.3.3: Castling availability + +The third field represents castling availability. This indicates potential +future castling that may of may not be possible at the moment due to blocking +pieces or enemy attacks. If there is no castling availability for either +side, the single character symbol "-" is used. Otherwise, a combination of +from one to four characters are present. If White has kingside castling +availability, the uppercase letter "K" appears. If White has queenside +castling availability, the uppercase letter "Q" appears. If Black has +kingside castling availability, the lowercase letter "k" appears. If +Black has queenside castling availability, then the lowercase letter "q" +appears. Those letters which appear will be ordered first uppercase before +lowercase and second kingside before queenside. There is no white space +between the letters. + + +16.1.3.4: En passant target square + +The fourth field is the en passant target square. If there is no en passant +target square then the single character symbol "-" appears. If there is an +en passant target square then is represented by a lowercase file character +immediately followed by a rank digit. Obviously, the rank digit will be "3" +following a white pawn double advance (Black is the active color) or else be +the digit "6" after a black pawn double advance (White being the active +color). + +An en passant target square is given if and only if the last move was a pawn +advance of two squares. Therefore, an en passant target square field may have +a square name even if there is no pawn of the opposing side that may +immediately execute the en passant capture. + + +16.1.3.5: Halfmove clock + +The fifth field is a nonnegative integer representing the halfmove clock. +This number is the count of halfmoves (or ply) since the last pawn advance +or capturing move. This value is used for the fifty move draw rule. + + +16.1.3.6: Fullmove number + +The sixth and last field is a positive integer that gives the fullmove number. +This will have the value "1" for the first move of a game for both White and +Black. It is incremented by one immediately after each move by Black. + + +16.1.4: Examples + +Here's the FEN for the starting position: + +rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1 + +And after the move 1. e4: + +rnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBNR b KQkq e3 0 1 + +And then after 1. ... c5: + +rnbqkbnr/pp1ppppp/8/2p5/4P3/8/PPPP1PPP/RNBQKBNR w KQkq c6 0 2 + +And then after 2. Nf3: + +rnbqkbnr/pp1ppppp/8/2p5/4P3/5N2/PPPP1PPP/RNBQKB1R b KQkq - 1 2 + +For two kings on their home squares and a white pawn on e2 (White to move) +with thirty eight full moves played with five halfmoves since the last pawn +move or capture: + +4k3/8/8/8/8/8/4P3/4K3 w - - 5 39 diff --git a/lasker-2.2.3/data/book/long001.idx b/lasker-2.2.3/data/book/long001.idx new file mode 100644 index 0000000..a370e2e --- /dev/null +++ b/lasker-2.2.3/data/book/long001.idx @@ -0,0 +1,8076 @@ +1q3rk1/pp3ppp/2r1pn2/2bp4/4P3/2P5/PP1NQPPP/R1B2RK1 w - - +QGD: Orthodox defense, classical, 13.d1b1 (Mar\'oczy) * +1r2kb1r/p1pq2pp/Q1n5/3npp2/6b1/P2PPN2/1P3PPP/RNB1KB1R b KQk - +Sicilian: Najdorf, Poisoned pawn variation * +1rb2rk1/pp3ppp/5q2/3P4/1n6/2P1Q3/PP3PPP/RN2KB1R w KQ - +Scotch: Gottschall variation +1rbq1rk1/1pp1ppbp/p1np1np1/8/2PPP3/2N1BP2/PP1QN1PP/R3KB1R w KQ - +King's Indian: S\"amisch, Panno main line +1rbq1rk1/ppp1ppbp/2np1np1/8/2PPP3/2N1BP2/PP2N1PP/R2QKB1R w KQ - +King's Indian: S\"amisch, Ruban variation +1rbqk1nr/pp1pppbp/2n3p1/2p5/4P3/2N3P1/PPPP1PBP/R1BQK1NR w KQk - +English: closed, 5.Rb1 * +1rbqk1nr/pp1pppbp/2n3p1/2p5/4P3/2N3PN/PPPP1PBP/R1BQK2R b KQk - +English: closed, 5.Rb1 Taimanov variation * +1rbqkb1r/p4ppp/2p2n2/nB2p1N1/8/5Q2/PPPP1PPP/RNB1K2R w KQk - +two knights defense: Colman variation +2bqkbnr/r4ppp/p1npp3/1p6/4P3/1BN2N2/PP2QPPP/R1B2RK1 w k - +Sicilian: Smith-Morra gambit, Chicago defense +2kr1b1r/ppp3pp/2n2q2/3npp2/6b1/P2PPN2/1PQNBPPP/R1B1K2R b KQ - +Sicilian: Najdorf, 7...Be7 main line * +2kr1b1r/ppp3pp/2n5/3qpp2/6b1/3PPN2/PP2BPPP/R1BQ1RK1 w - - +Sicilian: Richter-Rauzer, Rauzer attack, 7...Be7 defense, 9...Nxd4 * +2kr1b1r/pppq1ppp/2n5/3np3/6b1/P1NPPN2/1P1B1PPP/R2QKB1R b KQ - +Sicilian: Richter-Rauzer, Rauzer attack, 7...a6 defense, 8...Bd7 * +2kr1b1r/pppq2pp/2n1bp2/3np3/8/2NP1NP1/PP2PPBP/R1BQ1RK1 w - - +Sicilian: dragon, Yugoslav attack, Rauser variation * +2kr1b1r/pppq2pp/2n2n2/2Pp1p2/3Pp3/2N1P3/PP1NQPPP/R1B2RK1 b - - +French: classical, St\a hlberg variation * +2kr1b1r/pppq2pp/2n2n2/4pp2/1P6/P1NPPb2/3BBPPP/R2QK2R w KQ - +Sicilian: Richter-Rauzer, Rauzer attack, 7...a6 defense, 11.Bxf6 * +2kr1b1r/pppq2pp/2n5/3Npp2/6b1/3PPN2/PP2BPPP/R1BQ1RK1 b - - +Sicilian: Richter-Rauzer, Rauzer attack, 7...Be7 defense, 9...Nxd4 * +2kr1b1r/pppq2pp/2n5/3npp2/4P1b1/2NP1N2/PP2BPPP/R1BQ1RK1 b - - +Sicilian: Richter-Rauzer, Rauzer attack, Geller variation * +2kr1b1r/pppq2pp/2n5/3npp2/6b1/2NPPN2/PP2BPPP/R1BQ1RK1 w - - +Sicilian: Richter-Rauzer, Rauzer attack, 7...Be7 defense, 9.f4 * +2kr1b1r/pppq2pp/2n5/3npp2/6b1/P1NPPN2/1P1BBPPP/R2QK2R b KQ - +Sicilian: Richter-Rauzer, Rauzer attack, 7...a6 defense, 9...Be7 * +2kr3r/pp2bppp/2nqbn2/3pp1B1/8/1NN3P1/PPP1PPBP/R2Q1RK1 w - - +Gr\"unfeld: Russian, Keres variation * +2kr3r/ppp2ppp/1bn1bPq1/6N1/2ppNPP1/8/PPP4P/R1BQR1K1 w - - +two knights: Max Lange attack, Berger variation +2kr3r/pppb1ppp/2n1q2n/1Bb1p3/8/2NP1N2/PPP2PPP/R1BQR1K1 w - - +Center game: Kupreichik variation * +2kr3r/pppq2p1/1bn1bp2/3np2p/Q7/2NP1NP1/PP1BPPBP/R1R3K1 w - - +Sicilian: dragon, Yugoslav attack, 12.h4 * +2kr3r/pppq2pp/2n1bp2/2bnp3/8/2NP1NP1/PP1BPPBP/R2Q1RK1 w - - +Sicilian: dragon, Yugoslav attack, 10.O-O-O * +2kr3r/pppqbppp/1nn1p3/4Pb2/2PP4/2N1BN2/PP2B1PP/R2Q1RK1 w - - +Alekhine's defense: four pawns attack, Tartakower variation +2kr3r/pppqbppp/2n1b3/3np3/8/2NP1NP1/PP2PPBP/R1BQ1RK1 w - - +Sicilian: dragon, classical, Grigoriev variation * +2kr3r/ppq1nppp/2nbp3/3p4/3P2b1/5N2/PPP1BPPP/R1BQRNK1 w - - +QGD: exchange, chameleon variation * +2krr3/pppq1ppp/1bn5/3n4/QPN1p1b1/P2PPN2/1B3PPP/R3KB1R w KQ - +Sicilian: Najdorf, Ivkov variation * +2r1kb1r/1pq2ppp/p1n1pn2/2pp4/3P2b1/P1P1PN2/1P1NBPPP/R1BQ1RK1 w k - +QGD: Orthodox defense, Rubinstein attack, Gr\"unfeld variation * +2r1kb1r/ppq2ppp/2n1pn2/2pp4/3P2b1/2P1PN2/PP1NBPPP/R1BQ1RK1 w k - +QGD: Orthodox defense, Rubinstein attack (with Rc1) * +2r1kb1r/ppq2ppp/2n1pn2/2pp4/3P2b1/P1P1PN2/1P1NBPPP/R1BQ1RK1 b k - +QGD: Orthodox defense, Rubinstein attack, Karlsbad variation * +2r1kb1r/ppq2ppp/2n1pn2/2ppN3/3P2b1/2P1P3/PP1NBPPP/R1BQ1RK1 b k - +QGD: Orthodox defense, Rubinstein attack, Wolf variation * +2r1kb1r/ppq2ppp/2n1pn2/3p4/3p2b1/P1P1PN2/1P1NBPPP/R1BQ1RK1 w k - +QGD: Orthodox defense, Rubinstein attack, main line * +2rq1rk1/pp2ppbp/2n2np1/2Pp4/3P2b1/2N1BN2/PP2BPPP/R2Q1RK1 b - - +QGD: Tarrasch, Bogolyubov variation * +2rq1rk1/pp2ppbp/2n2np1/3p4/2PP2b1/1PN1BN2/P3BPPP/R2Q1RK1 b - - +QGD: Tarrasch, Stoltz variation * +2rq1rk1/pp3ppp/2n1pn2/2bp4/3N4/2P1P3/PP1NQPPP/R1B2RK1 w - - +QGD: Orthodox defense, Bd3 line, 11.O-O * +2rq1rk1/pp3ppp/2n1pn2/2bp4/8/2P1PB1P/PP1N1PP1/R1BQ1RK1 w - - +QGD: Petrosian variation * +2rqk2r/pp3pp1/2n1pn2/2bp3p/3N2b1/2P1P3/PP1NBPPP/R1BQ1RK1 w k - +QGD: Orthodox defense, Bd3 line, Janowski variation * +2rqk2r/pp3ppp/2n1pn2/2bp4/1P4b1/2P1PN2/P2NBPPP/R1BQ1RK1 b k - +QGD: Orthodox defense, Bd3 line, fianchetto variation * +2rqk2r/pp3ppp/2n1pn2/2bp4/3N2b1/2P1P3/PP1NBPPP/R1BQ1RK1 b k - +QGD: Orthodox defense, Bd3 line, Capablanca freeing maneuver * +2rqk2r/pp3ppp/2n1pn2/2bp4/3N4/2P1P3/PP1NQPPP/R1B2RK1 b k - +QGD: Orthodox defense, Bd3 line * +2rqk2r/pp3ppp/2n1pn2/3p4/1b1P2b1/1P3N2/P1PNBPPP/R1BQ1RK1 w k - +QGD: Orthodox defense, Capablanca variation * +2rqk2r/pp3ppp/2nbpn2/2pp4/3P2b1/2P1PN2/PP1NBPPP/R1BQ1RK1 w k - +QGD: Orthodox defense, Bd3 line * +2rqk2r/pp3ppp/2nbpn2/3p4/3P2b1/1P3N2/P1PNBPPP/R1BQ1RK1 w k - +QGD: Orthodox defense, Pillsbury attack * +2rqk2r/pp3ppp/4pn2/2bpn3/3N4/2P1P3/PP1NQPPP/R1B2RK1 w k - +QGD: Orthodox defense, Bd3 line, Alekhine variation * +2rqkb1r/pp1bpppp/2n2n2/2pp4/Q2P4/2P1PN2/PP1N1PPP/R1B1KB1R w KQk - +QGD: Rochlin variation * +2rqkb1r/pp3ppp/2n1pn2/2pp4/3P2b1/2P1PN2/PP1NBPPP/R1BQ1RK1 b k - +QGD: Orthodox defense * +2rqkb1r/pp3ppp/2n1pn2/2pp4/3P2b1/4PN2/PPPNBPPP/R1BQ1RK1 w k - +QGD: Orthodox defense, 7.Rc1 * +2rqkb1r/pp3ppp/2n1pn2/2pp4/3P2b1/P3PN2/1PPNBPPP/R1BQ1RK1 b k - +QGD: Orthodox defense, Swiss (Henneberger) variation * +2rqkb1r/pp3ppp/2n1pn2/3p4/3p2b1/P3PN2/1PPNBPPP/R1BQ1RK1 w k - +QGD: Orthodox defense, Swiss, Karlsbad variation * +2rqkb1r/pp3ppp/4pn2/3p4/3P4/1P2B2P/P1P1QPP1/RN3RK1 b k - +QGD: Tartakower variation * +2rqkbnr/pp3ppp/2n1p3/2p2b2/2pP4/4BNP1/PP2PPBP/RN1Q1RK1 b k - +Gr\"unfeld: Gr\"unfeld gambit, Botvinnik variation * +2rqkbnr/pp3ppp/2n1p3/2pp1b2/3P4/5NP1/PPP1PPBP/RNBQ1RK1 w k - +Gr\"unfeld: Gr\"unfeld gambit, Capablanca variation * +2rqkbnr/pp3ppp/2n1p3/2pp4/3P2b1/4PN2/PPP1BPPP/RNBQ1RK1 w k - +QGD: Anti-neo-orthodox variation * +3q1rk1/pp3ppp/2r1p3/2b5/4Q3/2P5/PP3PPP/R1B2RK1 b - - +QGD: Orthodox defense, classical, 13.de * +3q1rk1/pp3ppp/2r1pn2/2bp4/4P3/2P5/PP1NQPPP/R1B2RK1 b - - +QGD: Orthodox defense, classical variation * +4rrk1/pppb2pp/2np1q2/2b2P2/4Q3/2N4B/PPPPNP1P/R1B1K2R w KQ - +KGA: Muzio gambit, Paulsen variation * +5rk1/5ppp/p1pbr3/1p1n3q/P2P2b1/1BPQB1P1/1P1N1P1P/R3R1K1 w - - +Ruy Lopez: Marshall, main line, Spassky variation +5rk1/ppq2ppp/2r1pn2/2bp4/4P3/2P5/PP1NQPPP/R1B2RK1 w - - +QGD: Orthodox defense, classical, 13.d1c2 (Vidmar) * +N1bk1b1r/p2pq2p/1pnn2p1/3Qpp2/8/1B6/PPPP1PPP/R1B1K1NR w KQ - +Vienna: `Frankenstein-Dracula' variation +N1bk3r/pp1p1ppp/2n2n2/8/1b6/P4B1q/1PPN1P1P/R1BQK2R b KQ - +Scotch: Berger variation +r1b1k1nr/ppp2ppp/1bn5/3p4/4P2q/2NN4/PPPP1PPP/R1BQKB1R w KQkq - +Vienna: Adams' gambit * +r1b1k1nr/ppp2ppp/2n5/q3P3/1b6/2N2N2/PPPB1PPP/R2QKB1R b KQkq - +Scandinavian: Anderssen counter-attack orthodox attack +r1b1k1nr/pppp1ppp/1b6/8/3qPP2/1PNN2P1/P2PQ2P/n1BK1B1R b kq - +Vienna: `Frankenstein-Dracula' variation * +r1b1k1nr/pppp1ppp/1b6/nP2N1q1/2B1P3/8/P1PP1PPP/RNBQK2R w KQkq - +Evans gambit declined, Hirschbach variation +r1b1k1nr/pppp1ppp/1bn5/8/4P2q/3N4/PPPPBPPP/RNBQK2R b KQkq - +Vienna game * +r1b1k1nr/pppp1ppp/2n2q2/1Nb5/4P3/4B3/PPP2PPP/RN1QKB1R b KQkq - +Scotch: Blumenfeld attack +r1b1k1nr/pppp1ppp/2n5/1N6/1b2P2q/8/PPPB1PPP/RN1QKB1R b KQkq - +Scotch game +r1b1k1nr/ppppqppp/1bn5/4p1B1/2BPP3/2P2N2/PP3PPP/RN1QK2R b KQkq - +Giuoco Piano: Mestel variation +r1b1k1nr/ppppqppp/1bn5/4p3/2BPP3/2P2N2/PP3PPP/RNBQK2R w KQkq - +Giuoco Piano: center-holding variation +r1b1k1nr/ppppqppp/2n5/1Bb1p3/4P3/2P2N2/PP1P1PPP/RNBQK2R w KQkq - +Ruy Lopez: classical defense, Boden variation +r1b1k1nr/ppppqppp/2n5/2b1p3/2B1P3/2P2N2/PP1P1PPP/RNBQK2R w KQkq - +Giuoco Piano: close variation +r1b1k1nr/pppq1ppp/1b6/n3N3/2B1P3/BQP5/P4PPP/RN3RK1 b kq - +Evans gambit: Levenfish variation +r1b1k2r/1pp1qppp/pbnp1n2/4p3/P1BPP3/2P2N1P/1P3PP1/RNBQR1K1 b kq - +Giuoco Piano: Tarrasch variation +r1b1k2r/1pp2ppp/p1n5/2bpq3/3NP3/2P1K3/PPN3PP/R1BQ1B1R b kq - +two knights defense: Fegatello attack, Leonhardt variation * +r1b1k2r/1pq1bppp/p1nppn2/8/P2NPP2/2N5/1PP1B1PP/R1BQ1R1K b kq - +Sicilian: Scheveningen, classical, Mar\'oczy system +r1b1k2r/1pqnbppp/p2ppn2/6B1/3NPP2/2N2Q2/PPP3PP/2KR1B1R w kq - +Sicilian: Najdorf, 7...Be7 main line +r1b1k2r/2q1bppp/p2p1n2/npp1p3/P2PP3/2P2N2/1PB2PPP/RNBQR1K1 b kq - +Ruy Lopez: closed, Balla variation +r1b1k2r/p1q2pp1/2pb1n1p/n3N3/3Pp3/8/PPPBBPPP/RN1QK2R b KQkq - +two knights defense: Knorre variation +r1b1k2r/pp1n1ppp/2p1pn2/q2p2B1/1bPP4/2N1P3/PPQN1PPP/R3KB1R b KQkq - +QGD: Cambridge Springs defense, Bogolyubov variation +r1b1k2r/pp3ppp/1qn1p3/2bp4/6n1/5NP1/PPPNPPBP/R1BQ1RK1 w kq - +Gr\"unfeld: Pachman variation * +r1b1k2r/pp3ppp/3b1q2/3P4/1P2n3/4PN2/5PPP/R1BQKB1R w KQkq - +QGD semi-Slav: Meran, Stahlberg variation * +r1b1k2r/ppp1qppp/5n2/4p1B1/2BnP3/2N5/PPP3PP/R2Q1RK1 b kq - +Giuoco piano: Holzhausen attack +r1b1k2r/ppp2ppp/2N5/1B1pP3/4n2q/8/PPP2bPP/RNBQ1K1R w kq - +Two knights defense, Keidanz variation +r1b1k2r/ppp3p1/2np1q1p/2b1pP2/2B5/2NP1N2/PPP2PPP/R2QK2R b KQkq - +KGD: classical, Svenonius variation * +r1b1k2r/pppp1ppp/1bn5/8/4n2q/2NN4/PPPPBPPP/R1BQK2R w KQkq - +Vienna: Alekhine variation * +r1b1k2r/pppp1ppp/2n2q2/2b5/3NP3/4K3/PPP1N1PP/R1BQ1B1R b kq - +two knights defense: Fegatello attack, Polerio defense * +r1b1k2r/ppppnp1p/2n4b/4q3/2B2p2/2NP1Q2/PPPB2PP/4RRK1 b kq - +KGA: Muzio gambit, Paulsen variation +r1b1k2r/ppppnppp/2n2q2/1Bb5/3NP3/2P1B3/PP3PPP/RN1QK2R b KQkq - +Scotch: Paulsen attack +r1b1k2r/ppppnppp/2n2q2/2b5/3NP3/2P1B3/PP1Q1PPP/RN2KB1R b KQkq - +Scotch: Blackburne attack +r1b1k2r/ppppnppp/2n2q2/2b5/4P3/2P1B3/PPN2PPP/RN1QKB1R b KQkq - +Scotch: Meitner variation +r1b1k2r/ppppnppp/2n3q1/b3P3/2B5/1QN2N2/P4PPP/R1BR2K1 b kq - +Evans gambit: compromised defense, Potter variation +r1b1k2r/ppppnppp/2n3q1/b3P3/2B5/BQN2N2/P4PPP/R4RK1 b kq - +Evans gambit: compromised defense, Paulsen variation +r1b1kb1r/1pp3pp/p1n2n2/5pq1/2BPp3/2N1PP2/PP1N2PP/R1BQ1RK1 b kq - +French: Steinitz, Brodsky-Jones variation * +r1b1kb1r/1pq2ppp/p1nppn2/8/3NPP2/2N1B3/PPP1B1PP/R2Q1RK1 b kq - +Sicilian: Scheveningen, classical +r1b1kb1r/1pq2ppp/p1nppn2/8/3NPP2/2N5/PPP1B1PP/R1BQ1RK1 w kq - +Sicilian: Scheveningen, classical variation with ...Qc7 and ...Nc6 +r1b1kb1r/2p1nppp/p1p5/3P4/3Pp3/4P3/PPQ1NP1q/RNB1K1R1 w Qkq - +French: Winawer, advance, poisoned pawn, Konstantinopolsky variation * +r1b1kb1r/p1q2pp1/2p2n1p/n3N3/4p3/8/PPPPBPPP/RNBQK2R w KQkq - +two knights defense: G\"oring variation +r1b1kb1r/p1q2ppp/2p2n2/n3p1N1/8/3B1Q2/PPPP1PPP/RNB1K2R b KQkq - +two knights defense: Paoli variation +r1b1kb1r/pp1n1ppp/2p1p3/q2n2B1/3P4/2N1PN2/PP3PPP/R2QKB1R w KQkq - +QGD: Cambridge Springs defense, Yugoslav variation +r1b1kb1r/pp1n1ppp/2p1pB2/q2p4/2PP4/2N1PN2/PP3PPP/R2QKB1R b KQkq - +QGD: Cambridge Springs defense, Capablanca variation +r1b1kb1r/pp1n1ppp/2p1pn2/q2P2B1/3P4/2N1PN2/PP3PPP/R2QKB1R b KQkq - +QGD: Cambridge Springs defense, 7.cd +r1b1kb1r/pp1n1ppp/2p1pn2/q2p2B1/2PP4/2N1PN2/PP3PPP/R2QKB1R w KQkq - +QGD: Cambridge Springs defense +r1b1kb1r/pp1n1ppp/2p1pn2/q2p4/2PP4/2N2N2/PP1BPPPP/2RQKB1R b Kkq - +QGD: Rochlin variation +r1b1kb1r/pp1n1ppp/2p1pn2/q5B1/2pP4/2N1P3/PP1N1PPP/R2QKB1R w KQkq - +QGD: Cambridge Springs defense, Rubinstein variation +r1b1kb1r/pp1p1ppp/1qn1pn2/8/2PN4/2N3P1/PP2PP1P/R1BQKB1R w KQkq - +English: symmetrical, Geller variation +r1b1kb1r/pp1p1ppp/4pn2/1Bp5/3nPq2/2N2N2/PPPP1PPP/R1BQR1K1 w kq - +English: four knights, Stean variation * +r1b1kb1r/pp2pppp/1qn2n2/2pp4/3P4/5NP1/PPP1PPBP/RNBQK2R w KQkq - +Gr\"unfeld: Russian variation * +r1b1kb1r/pp2pppp/1qn2n2/3p2B1/2PP4/2N5/PP3PPP/R2QKBNR w KQkq - +Caro-Kann: Panov-Botvinnik, Reifir (Spielmann) variation +r1b1kb1r/pp2pppp/1qnp1n2/8/2BNP3/2N5/PPP2PPP/R1BQK2R w KQkq - +Sicilian: Sozin, Benk\"o variation +r1b1kb1r/pp2pppp/2n2n2/q1pp4/3P4/5NP1/PPP1PPBP/RNBQK2R w KQkq - +Gr\"unfeld: Flohr variation * +r1b1kb1r/pp2pppp/2n2n2/q2p2B1/2PP4/2N5/PP3PPP/R2QKBNR w KQkq - +Caro-Kann: Panov-Botvinnik, Czerniak variation +r1b1kb1r/pp3ppp/1qn1pn2/2pp4/3P4/4PNP1/PPP2PBP/RNBQ1RK1 b kq - +Gr\"unfeld: Botvinnik variation * +r1b1kb1r/pp3ppp/1qn1pn2/2pp4/3P4/5NP1/PPP1PPBP/RNBQ1RK1 w kq - +Gr\"unfeld with e3 & Qb3 * +r1b1kb1r/pp3ppp/2n2n2/2qpp1B1/8/5NP1/PPP1PPBP/RN1Q1RK1 b kq - +Gr\"unfeld: Russian, Smyslov variation * +r1b1kb1r/pp3ppp/2n2n2/2qpp3/8/1P3NP1/P1P1PPBP/RNBQ1RK1 b kq - +Gr\"unfeld: Russian, Levenfish variation * +r1b1kb1r/pp3ppp/2n2n2/2qpp3/8/2N2NP1/PPP1PPBP/R1BQ1RK1 b kq - +Gr\"unfeld: Russian, Byrne (Simagin) variation * +r1b1kb1r/pp3ppp/2n2n2/2qpp3/8/2P2NP1/PP2PPBP/RNBQ1RK1 b kq - +Gr\"unfeld: Russian, Szabo (Boleslavsky) variation * +r1b1kb1r/pp3ppp/2n2n2/2qpp3/8/5NP1/PPP1PPBP/RNBQ1RK1 w kq - +Gr\"unfeld: Russian variation with e4 * +r1b1kb1r/pp3ppp/2n2n2/2qpp3/8/N4NP1/PPP1PPBP/R1BQ1RK1 b kq - +Gr\"unfeld: Russian, Prins variation * +r1b1kb1r/pp3ppp/2n2n2/2qpp3/8/P4NP1/1PP1PPBP/RNBQ1RK1 b kq - +Gr\"unfeld: Russian, Alekhine (Hungarian) variation * +r1b1kb1r/pp3ppp/2n5/2pqp3/8/3P1NP1/PP2PP1P/R1BQKB1R b KQkq - +Sicilian: accelerated fianchetto, Gurgenidze variation * +r1b1kb1r/ppppq1pp/2n2n2/3Q4/8/5N2/PPP1PPPP/RNB1KB1R w KQkq - +Queen's pawn: Englund gambit +r1b1kb1r/ppppq1pp/2n2n2/4N1B1/3Pp3/8/PPP2PPP/RN1QKB1R w KQkq - +Vienna gambit: Kaufmann variation * +r1b1kb1r/ppppqppp/5n2/1B2N3/3nPP2/2N5/PPPP2PP/R1BQK2R b KQkq - +Four knights: Rubinstein counter-gambit, Bogolyubov variation +r1b1kb1r/ppq1pppp/2n2n2/1Bpp4/8/2NPPN2/PPP2PPP/R1BQK2R b KQkq - +Nimzo-Indian: classical, Milner-Barry (Zurich) variation * +r1b1kb1r/ppq2ppp/2n1pn2/2pp4/3P4/2P1PN2/PP1N1PPP/R1BQKB1R w KQkq - +QGD semi-Slav: Stoltz variation * +r1b1kb1r/ppqp1ppp/2B1pn2/2p5/4P3/2N2N2/PPPP1PPP/R1BQK2R b KQkq - +English: four knights, Romanishin variation * +r1b1kbnr/1p2pppp/p1q5/2pp4/1P6/4PN2/P1PP1PPP/RNBQ1RK1 b kq - +Nimzo-Indian: classical, Adorjan gambit * +r1b1kbnr/1p2pppp/p1q5/2pp4/3P4/2N1PN2/PPP2PPP/R1BQK2R b KQkq - +Nimzo-Indian: classical, Botvinnik variation * +r1b1kbnr/1p2pppp/p1q5/2ppN3/3P4/4P3/PPP2PPP/RNBQK2R b KQkq - +Nimzo-Indian: classical, Noa variation, main line * +r1b1kbnr/1pp2ppp/p1pq4/4p3/4P3/5N2/PPPP1PPP/RNBQ1RK1 w kq - +Ruy Lopez: exchange, Bronstein variation +r1b1kbnr/1pq1pppp/p1n5/1Bpp4/3P4/4PN2/PPP2PPP/RNBQK2R w KQkq - +Nimzo-Indian: classical, Noa variation, 5.a3 * +r1b1kbnr/1pq1pppp/p7/2ppN3/3P4/4P3/PPP2PPP/RNBQK2R w KQkq - +Nimzo-Indian: classical, Noa variation, main line, 7.Qc2 * +r1b1kbnr/1pq2ppp/p3p3/2ppN3/3PP3/2N5/PPP2PPP/R1BQK2R b KQkq - +Nimzo-Indian: classical, San Remo variation * +r1b1kbnr/1pqp1ppp/p1n1p3/8/3NP3/2N1B3/PPP1BPPP/R2QK2R b KQkq - +Sicilian: Taimanov variation +r1b1kbnr/2p2ppp/p1p5/3p2q1/2PPp3/4P3/PP2NPPP/RNBQK2R w KQkq - +French: Winawer, advance, poisoned pawn variation * +r1b1kbnr/p1p2ppp/2p5/3pN1q1/3Pp3/4P2P/PPP2PP1/RNBQ1K1R w kq - +French: MacCutcheon, Duras variation * +r1b1kbnr/p1pp1ppp/1pn5/8/3PPp1q/2N5/PPP1K1PP/R1BQ1BNR w kq - +Vienna: Steinitz gambit, Fraser-Minckwitz variation +r1b1kbnr/pp1qpppp/2np4/1B6/3QP3/5N2/PPP2PPP/RNB1K2R w KQkq - +Sicilian: Chekhover, Zaitsev variation +r1b1kbnr/pp2pppp/1qn5/1Bp5/2p5/2N1PN2/PP1P1PPP/R1BQK2R b KQkq - +Nimzo-Indian: Spielmann, 4...c5, 5.dc Nc6 * +r1b1kbnr/pp2pppp/1qn5/1Bpp4/8/4PN2/PPPP1PPP/RNBQK2R w KQkq - +Nimzo-Indian: Spielmann variation * +r1b1kbnr/pp2pppp/1qn5/2pp4/3P4/5NP1/PPP1PP1P/RNBQKB1R w KQkq - +Gr\"unfeld: Russian variation * +r1b1kbnr/pp2pppp/2nq4/1Bpp4/8/4PN2/PPPP1PPP/RNBQK2R w KQkq - +Nimzo-Indian: Mikenas attack * +r1b1kbnr/pp3ppp/1qn1p3/2ppP3/3P4/2PB1N2/PP3PPP/RNBQK2R b KQkq - +French: advance, Milner-Barry gambit +r1b1kbnr/ppp1pppp/2n5/3q4/3P4/2N5/PPP2PPP/R1BQKBNR b KQkq - +KP: Nimzovich defense, Marshall gambit +r1b1kbnr/ppp1pppp/2n5/7q/8/2N5/PP1PPPPP/R1BQKBNR w KQkq - +Novosibirsk opening * +r1b1kbnr/ppp1qppp/2n5/4P3/2Pp4/5N2/PP1NPPPP/R1BQKB1R w KQkq - +QGD: Albin counter-gambit, Balogh variation +r1b1kbnr/ppp2ppp/2n5/1B1p2q1/2PPp3/4P3/PP3PPP/RNBQK1NR w KQkq - +French: Winawer, advance, Russian variation * +r1b1kbnr/ppp2ppp/2n5/3p2q1/3Pp3/4P3/PPPN1PPP/RNBQKB1R w KQkq - +French: Steinitz, Gledhill attack * +r1b1kbnr/ppp2ppp/2n5/3p4/3PPp1q/2N5/PPP1K1PP/R1BQ1BNR w kq - +Vienna: Steinitz gambit, Zukertort defense +r1b1kbnr/ppp3pp/2n2q2/3pN3/3PpP2/8/PPP3PP/RNBQKB1R w KQkq - +Vienna gambit: Heyde variation * +r1b1kbnr/ppp3pp/2n5/5pq1/2BPp3/4P3/PP1N1PPP/RNBQK2R w KQkq - +French: Steinitz, Bradford attack * +r1b1kbnr/pppnq2p/8/4Npp1/3Q1P2/8/PPP3PP/RNB1KB1R w KQkq - +KGD: Falkbeer, Charousek variation * +r1b1kbnr/pppp1Npp/8/8/4q3/5n2/PPPPBP1P/RNBQKR2 w Qkq - +Blackburne shilling gambit +r1b1kbnr/pppp1p1p/2n5/4N3/2B1Pppq/8/PPPP2PP/RNBQ1K1R w kq - +KGA: Herzfeld gambit +r1b1kbnr/pppp1p1p/5q2/4n3/2B1PQ2/2N5/PPPP2PP/R1B2RK1 w kq - +Vienna: Hamppe-Muzio, Dubois variation +r1b1kbnr/pppp1ppp/2n2q2/4p3/3P4/2P5/PP2PPPP/RNBQKBNR w KQkq - +Caro-Kann: Goldman (Spielmann) variation * +r1b1kbnr/pppp1ppp/2n5/1B2p1q1/4P3/5N2/PPPP1PPP/RNBQK2R b KQkq - +Vienna: Zhuravlev countergambit * +r1b1kbnr/pppp1ppp/2n5/1N6/4P2q/8/PPP2PPP/RNBQKB1R b KQkq - +Scotch: Horwitz attack +r1b1kbnr/pppp1ppp/2n5/8/2B1Pp1q/8/PPPP2PP/RNBQ1KNR w kq - +KGA: bishop's gambit, Boden defense +r1b1kbnr/pppp1ppp/2n5/8/3NP2q/2N5/PPP2PPP/R1BQKB1R b KQkq - +Scotch: Steinitz variation +r1b1kbnr/pppp1ppp/2n5/8/3NP2q/8/PPP2PPP/RNBQKB1R w KQkq - +Scotch: Pulling counter-attack +r1b1kbnr/pppp1ppp/2n5/8/4P2q/5N2/PPP2PPP/RNBQKB1R b KQkq - +Scotch: Fraser attack +r1b1kbnr/pppp2pp/2n2q2/4N3/3Pp3/8/PPP2PPP/RNBQKB1R w KQkq - +Vienna gambit: Paulsen attack * +r1b1kbnr/pppp2pp/2n2q2/4N3/3PpP2/8/PPP3PP/RNBQKB1R b KQkq f3 +Vienna gambit: Bardeleben variation * +r1b1kbnr/ppppq1pp/2n5/4Pp2/3p4/5N2/PPP2PPP/RNBQKB1R w KQkq - +KGD: Falkbeer, Rubinstein variation * +r1b1kbnr/ppppqppp/2n5/1B2p3/4P3/5N2/PPPP1PPP/RNBQK2R w KQkq - +Ruy Lopez: Vinogradov variation +r1b1kbnr/ppq1pppp/2n5/1B1p4/3P4/5N2/PPP2PPP/RNBQK2R b KQkq - +Nimzo-Indian: classical, Noa variation, 5.cd ed * +r1b1kbnr/ppq1pppp/2n5/1Bp5/2p5/4PN2/PP1P1PPP/RNBQ1RK1 b kq - +Nimzo-Indian: classical, Pir\'c variation * +r1b1kbnr/ppq1pppp/2n5/1Bpp4/2P5/4PN2/PP1P1PPP/RNBQK2R b KQkq - +Nimzo-Indian: classical, 4...c5 * +r1b1kbnr/ppq1pppp/2n5/1Bpp4/3P4/4PN2/PPP2PPP/RNBQK2R b KQkq - +Nimzo-Indian: classical, Noa variation * +r1b1kbnr/ppq1pppp/2n5/1Bpp4/8/2N1PN2/PPPP1PPP/R1BQK2R b KQkq - +Nimzo-Indian: classical, 4...Nc6 * +r1b1kbnr/ppq1pppp/2n5/1Bpp4/8/4PN2/PPPP1PPP/RNBQK2R w KQkq - +Nimzo-Indian: classical variation * +r1b1kbnr/ppqp1ppp/2n1p3/8/3NP3/2N1B3/PPP2PPP/R2QKB1R b KQkq - +Sicilian: Taimanov variation +r1b1kbnr/ppqp1ppp/2n1p3/8/3NP3/2N5/PPP2PPP/R1BQKB1R w KQkq - +Sicilian: Taimanov (Bastrikov) variation +r1b1kbnr/ppqppppp/2n5/8/3NP3/8/PPP2PPP/RNBQKB1R w KQkq - +Sicilian: Flohr variation +r1b2knr/pppp3p/2n2qP1/2b1p2Q/6P1/8/PPPP1PBP/RNB1K1NR w KQ - +KGA: bishop's gambit, Fraser variation * +r1b2rk1/1p2qp1p/2n1pn2/pBbpN1p1/5B2/2P1P3/PP3PPP/RN1Q1RK1 w - - +QGD Slav: Dutch, S\"amisch variation * +r1b2rk1/1p2qppp/2n1pn2/pBbp4/5B2/2P1PN2/PP3PPP/RN1Q1RK1 w - - +QGD Slav: Dutch variation, main line * +r1b2rk1/1pp1qppp/2n2n2/p1bPp3/8/2PP1N2/PP1NBPPP/R1BQ1RK1 b - - +Philidor: Nimzovich, Sozin variation * +r1b2rk1/1pq1bppp/p1nppn2/8/3NPP2/2N1B3/PPP1B1PP/R3QRK1 w - - +Sicilian: Scheveningen, classical main line +r1b2rk1/2q1bppp/p1np1n2/1pP1p3/4P3/2P2N1P/PPBN1PP1/R1BQR1K1 b - - +Ruy Lopez: closed, Chigorin, Rauzer attack +r1b2rk1/2q1bppp/p1np1n2/1pp1p3/3PP3/2P2N1P/PPBN1PP1/R1BQR1K1 w - - +Ruy Lopez: closed, Chigorin, 12...Nc6 +r1b2rk1/2q1bppp/p1pp1n2/np2p3/3PP3/2P2N1P/PPB2PP1/RNBQR1K1 w - - +Ruy Lopez: closed, Rossolimo defense +r1b2rk1/2q1bppp/p2p1n2/np2p3/3PP3/5N1P/PPBN1PP1/R1BQR1K1 b - - +Ruy Lopez: closed, Chigorin, 12...c5d4 +r1b2rk1/2q1bppp/p2p1n2/npp1p3/3PP3/2P2N1P/PPB2PP1/RNBQR1K1 w - - +Ruy Lopez: closed, Chigorin defense +r1b2rk1/5ppp/p1pb4/1p1n4/3P4/1BP3Pq/PP3P1P/RNBQR1K1 w - - +Ruy Lopez: Marshall, main line, 14...Qh3 +r1b2rk1/p1q2ppp/2n2n2/3pp3/N7/1B1P4/PPPB1bPP/R2Q1KNR w - - +Evans gambit: Fraser-Mortimer attack * +r1b2rk1/p4ppp/1qB2n2/2bp4/3P4/2N5/PPP2PPP/R1BQK2R b KQ - +Giuoco Piano: Bernstein variation * +r1b2rk1/p4ppp/2n2n2/q1bpp1B1/8/1BNP4/PPP2PPP/R2QK1NR w KQ - +Evans gambit: Fraser attack * +r1b2rk1/pp1n1ppp/2p1pn2/q2p4/1bPP3B/2N1P3/PPQN1PPP/R3KB1R b KQ - +QGD: Cambridge Springs defense, Argentine variation +r1b2rk1/pp1nqppp/1bp2n2/4N3/1P1Pp3/P1N1B3/2P1BPPP/R2Q1RK1 w - - +Ruy Lopez: open, Malkin variation * +r1b2rk1/pp1nqppp/2n1p3/3pP3/2pP1P2/2N2N2/PPPQ2PP/2KR1B1R w - - +French: classical, St\a hlberg variation +r1b2rk1/pp1nqppp/2p1p3/3n4/2BP4/2N1PN2/PP3PPP/2RQ1RK1 b - - +QGD: Orthodox defense, Bd3 line, 11.O-O +r1b2rk1/pp1nqppp/2p1p3/3n4/2BP4/2N1PN2/PP3PPP/2RQK2R w K - +QGD: Orthodox defense, Bd3 line +r1b2rk1/pp1nqppp/2p1p3/3n4/2BPN3/4PN2/PP3PPP/2RQK2R b K - +QGD: Orthodox defense, Bd3 line, Alekhine variation +r1b2rk1/pp1nqppp/2p5/4p3/2BP4/2R1PN2/PP3PPP/1Q3RK1 b - - +QGD: Orthodox defense, classical, 13.d1b1 (Mar\'oczy) +r1b2rk1/pp1nqppp/2p5/4p3/2BP4/2R1PN2/PP3PPP/3Q1RK1 w - - +QGD: Orthodox defense, classical variation +r1b2rk1/pp1nqppp/2p5/4p3/2BP4/2R1PN2/PPQ2PPP/5RK1 b - - +QGD: Orthodox defense, classical, 13.d1c2 (Vidmar) +r1b2rk1/pp2nppp/2pq1n2/3pp1B1/1b2P2N/1BNP4/PPP2PPP/R2Q1RK1 w - - +Four knights: symmetrical, Blake variation +r1b2rk1/pp2ppbp/1qnp1np1/4P3/3N1P2/2N1B3/PPP1B1PP/R2Q1RK1 b - - +Sicilian: dragon, classical, Zollner gambit +r1b2rk1/pp2ppbp/2nq1np1/2pp4/3P4/2P1PN2/PP1NBPPP/R1BQ1RK1 w - - +Catalan: closed, Botvinnik variation * +r1b2rk1/pp2ppbp/2q2np1/2pp4/8/1P2P3/PBPPBPPP/RN1Q1RK1 w - - +Queen's Indian: old main line, 9.Qxc3 * +r1b2rk1/pp2qppp/1bn2n2/4p3/1P6/P1NPP3/R4PPP/2BQKBNR b K - +Sicilian: Smith-Morra gambit, Chicago defense * +r1b2rk1/pp2qppp/2n1pn2/2bp4/2P1P3/2NB1N2/PP2QPPP/R1B2RK1 b - - +QGD: Semi-Tarrasch, Levenfish variation +r1b2rk1/pp2qppp/2nb1n2/2p1p3/2BP4/2N1PN2/PP2QPPP/R1B2RK1 w - - +QGD: Semi-Tarrasch, Levenfish variation * +r1b2rk1/pp3ppp/2p5/4q3/2B5/2R1P3/PP3PPP/3Q1RK1 w - - +QGD: Orthodox defense, classical, 13.de +r1b2rk1/ppp1qppp/2n2n2/1B1pp3/1b2P3/3P1N2/PPP1NPPP/R1BQ1RK1 w - - +Four knights: Alatortsev variation +r1b2rk1/ppp1qppp/2np1n2/1B2p1B1/4P3/2PP1N2/P1P2PPP/R2Q1RK1 w - - +Four knights: symmetrical, Metger unpin +r1b2rk1/pppp2pp/2n5/2b1pq2/4N3/5Q2/PPPP1P1P/R1B1KBNR b KQ - +Vienna: Hamppe-Muzio, Dubois variation * +r1b2rk1/ppq1ppbp/2n2np1/2pp4/5P2/3PPN2/PPP1B1PP/RNB1QRK1 w - - +Dutch: Ilyin-Genevsky variation with Qc2 * +r1b2rk1/ppqnppbp/5np1/2pp4/3P4/2P1PN2/PP1NBPPP/R1BQ1RK1 w - - +Catalan: closed, main line * +r1b3nr/ppppkBpp/1b6/nP2N1qQ/4P3/8/P1PP1PPP/RNB1K2R b KQ - +Evans gambit declined, V\'asquez variation +r1b3r1/ppp2k1p/1b6/nP2B1q1/3PP3/8/P1PN1PPP/R2QK2R b KQ - +Evans gambit declined, Pavlov variation +r1bB1rk1/pp3ppp/8/4p3/3nn3/3P4/PPP1KbPP/R2Q1BNR w - - +Scotch: Sea-cadet mate * +r1bk1bnr/2p2ppp/p1p5/3P4/3Pp3/4P3/PPQ1NP1q/RNB1K1R1 w Q - +French: Winawer, advance, poisoned pawn, Euwe-Gligori\'c variation * +r1bk2nr/pppp1Qpp/1b6/nP2q3/2B1P3/8/PBPP1PPP/RN2K2R b KQ - +Evans gambit declined, Hicken variation +r1bk2nr/pppp1ppp/2n3q1/1N6/8/8/PPPNBPPP/R2Q1RK1 w - - +Scotch: Rosenthal variation +r1bk2nr/ppppq1pp/2n5/2b1PP1Q/8/8/PPPP2PP/RNBK1BNR b - - +KGA: L\'opez-Gianutio counter-gambit, Hein variation * +r1bnk2r/ppppnppp/5q2/1Bb5/3NP3/2P1B3/PP3PPP/RN1QK2R w KQkq - +Scotch: Paulsen, Gunsberg defense +r1bq1b1r/ppn3pp/2p1k3/3np3/2BPQ3/P1N5/1PP2PPP/R1B1K2R w KQ - +two knights defense: Fegatello attack, Leonhardt variation +r1bq1b1r/ppp1n1pp/4k3/3np3/2B5/2N2Q2/PPPP1PPP/R1B1K2R w KQ - +two knights defense: Fegatello attack, Polerio defense +r1bq1b1r/ppp2kp1/2n5/1B1p1PPp/3Qn3/5N2/PPP2P1P/RNB1K2R w KQ - +KGA: Kieseritsky, Brentano defense, Kaplanek variation * +r1bq1bnr/ppp1k1pp/2n5/3ppP1Q/3P4/2N5/PPP2PPP/R1B1KBNR b KQ - +Vienna: Steinitz gambit, Zukertort defense * +r1bq1bnr/ppp1k1pp/2n5/3ppP1Q/8/1PN5/P1PP1PPP/R1B1KBNR b KQ - +Vienna: Steinitz gambit, Fraser-Minckwitz variation * +r1bq1k1r/2p2ppp/p4n2/1pbPR1N1/3n4/1B6/PPPP1PPP/RNBQ2K1 w - - +Ruy Lopez: Rabinovich variation +r1bq1k1r/pp2nppp/2n5/4p3/2Pp4/3P1NP1/4PP1P/RN1QKB1R w KQ - +Benk\"o gambit: Ne2 variation * +r1bq1knr/pp3p1p/2n3p1/4p3/2Pp4/3P1NP1/4PP1P/RN1QKB1R w KQ - +Benk\"o gambit * +r1bq1knr/ppp3pp/2n5/2bp1P1Q/4p1P1/3P4/PPP2PBP/RNB1K1NR w KQ - +KGA: bishop's gambit, Grimm attack * +r1bq1knr/ppp3pp/2n5/2bppP1Q/6P1/8/PPPPNPBP/RNB1K2R b KQ - +KGA: bishop's gambit, classical defense * +r1bq1knr/ppp4p/2n3p1/2bppP1Q/6P1/8/PPPPNPBP/RNB1K2R w KQ - +KGA: bishop's gambit, McDonnell attack * +r1bq1knr/pppp3p/2n3p1/2b1pP1Q/6P1/8/PPPP1PBP/RNB1K1NR w KQ - +KGA: bishop's gambit, McDonnell attack * +r1bq1r1k/1pp1b1pp/2n5/p2npp2/8/P1NPPN2/1PQ1BPPP/R1B1K2R w KQ - +Sicilian: Scheveningen, classical, Mar\'oczy system * +r1bq1rk1/1p1n1pbp/2pp1np1/p3p3/2PPP3/2N2N2/PP3PPP/R1BQRBK1 w - - +King's Indian: orthodox, 7...Nbd7, main line +r1bq1rk1/1p1nbppp/p1p1pn2/3P2B1/3P4/2N1PN2/PPQ2PPP/2R1KB1R b K - +QGD: Orthodox defense, Rubinstein attack, main line +r1bq1rk1/1p1nbppp/p1p1pn2/3p2B1/2PP4/2N1PN2/PPQ2PPP/2R1KB1R w K - +QGD: Orthodox defense, Rubinstein attack, Karlsbad variation +r1bq1rk1/1p1nbppp/p1p1pn2/3p2B1/2PP4/P1N1PN2/1PQ2PPP/2R1KB1R b K - +QGD: Orthodox defense, Rubinstein attack, Gr\"unfeld variation +r1bq1rk1/1p1nppbp/2n3p1/p7/2Pp4/P2P1NP1/1P1N1PBP/R1BQR1K1 b - - +Benoni: fianchetto, 11...Re8 * +r1bq1rk1/1p2bppp/2n2n2/p3p1B1/2Pp4/P2P1NP1/1P3PBP/RN1Q1RK1 b - - +Benoni: classical with ...a6 and 10...Bg4 * +r1bq1rk1/1p2bppp/2n2n2/p3p3/2Pp4/P2P1NP1/1P3PBP/RNBQ1RK1 w - - +Benoni: classical, 9...a6, 10.a4 * +r1bq1rk1/1p2ppbp/2np1np1/p7/2BNP3/2N1BP2/PPPQ2PP/R3K2R w KQ - +Sicilian: dragon, Yugoslav attack, Byrne variation +r1bq1rk1/1p2ppbp/2np1np1/p7/4P3/1NN1B3/PPP1BPPP/R2Q1RK1 w - - +Sicilian: dragon, classical, Alekhine variation +r1bq1rk1/1p3ppp/2n1pn2/pBbp4/5B2/2P1PN2/PP3PPP/RN1QK2R w KQ - +QGD Slav: Dutch variation * +r1bq1rk1/1p3ppp/p1n1pn2/1BbP4/8/2N1PN2/PP3PPP/R1BQ1RK1 b - - +Nimzo-Indian: 4.e3, main line with 8...dc and 9...cd * +r1bq1rk1/1pp1ppbp/p1np1np1/8/2PP4/2N2NP1/PP2PPBP/R1BQ1RK1 w - - +King's Indian: fianchetto, Panno variation +r1bq1rk1/1pp1ppbp/p1np1np1/8/2PPP3/2N1BP2/PP2N1PP/R2QKB1R w KQ - +King's Indian: S\"amisch, Panno formation +r1bq1rk1/1pp2ppp/1bn5/p2PN3/1P1P4/P7/2P2PPP/R1BQKB1R w KQ - +Ruy Lopez: open, Berger variation * +r1bq1rk1/1ppnbppp/p3pn2/3P2B1/3P4/2N1PN2/PP3PPP/2RQKB1R b K - +QGD: Orthodox defense, Swiss, Karlsbad variation +r1bq1rk1/1ppnbppp/p3pn2/3p2B1/2PP4/2N1PN2/PP3PPP/2RQKB1R w K - +QGD: Orthodox defense, Swiss (Henneberger) variation +r1bq1rk1/2p1bpp1/p1np1n1p/1p2p3/4P3/1BP2N1P/PP1P1PP1/RNBQR1K1 w - - +Ruy Lopez: closed, Smyslov defense +r1bq1rk1/2p1bppp/2np1n2/pp2p3/4P3/1BP2N1P/PP1P1PP1/RNBQR1K1 w - - +Ruy Lopez: closed, Keres (9...a5) variation +r1bq1rk1/2p1bppp/p1n2n2/1p1P4/4p3/1BP2N2/PP1P1PPP/RNBQR1K1 w - - +Ruy Lopez: Marshall, Herman Steiner variation +r1bq1rk1/2p1bppp/p1n2n2/1p1pp3/4P3/1BP2N2/PP1P1PPP/RNBQR1K1 w - - +Ruy Lopez: Marshall counter-attack +r1bq1rk1/2p1bppp/p1np1n2/1p2p3/3PP3/1BP2N2/PP3PPP/RNBQR1K1 b - - +Ruy Lopez: closed, 9.d4 +r1bq1rk1/2p1bppp/p1np1n2/1p2p3/4P3/1BP2N1P/PP1P1PP1/RNBQR1K1 b - - +Ruy Lopez: closed, 9.h3 +r1bq1rk1/2p1bppp/p1np1n2/1p2p3/4P3/1BP2N2/PP1P1PPP/RNBQR1K1 w - - +Ruy Lopez: closed (with ...d6) +r1bq1rk1/2p1bppp/p1np1n2/1p2p3/4P3/1BPP1N2/PP3PPP/RNBQR1K1 b - - +Ruy Lopez: closed, Pilnik variation +r1bq1rk1/2p1bppp/p1np1n2/1p2p3/4P3/2P2N2/PPBP1PPP/RNBQR1K1 b - - +Ruy Lopez: closed, Lutikov variation +r1bq1rk1/2p1bppp/p1np1n2/1p2p3/4P3/PBP2N2/1P1P1PPP/RNBQR1K1 b - - +Ruy Lopez: closed, Suetin variation +r1bq1rk1/2p1bppp/p2p1n2/np2p3/4P3/2P2N1P/PPBP1PP1/RNBQR1K1 b - - +Ruy Lopez: closed (9...Na5) +r1bq1rk1/2pnbppp/p1np4/1p2p3/4P3/1BP2N1P/PP1P1PP1/RNBQR1K1 w - - +Ruy Lopez: closed, Ragozin-Petrosian (`Keres') variation +r1bq1rk1/2pnbppp/p2p1n2/1p2p3/3PP2N/1BP4P/PP3PP1/RNBQR1K1 b - - +Ruy Lopez: closed, Breyer, Simagin variation +r1bq1rk1/2pnbppp/p2p1n2/1p2p3/3PP3/1BP2N1P/PP3PP1/RNBQR1K1 w - - +Ruy Lopez: closed, Breyer, Borisenko variation +r1bq1rk1/2ppbppp/p1n2n2/1p2p3/4P3/1B3N2/PPPP1PPP/RNBQR1K1 w - - +Ruy Lopez: closed, 7...O-O +r1bq1rk1/2ppbppp/p1n2n2/1p2p3/4P3/1B3N2/PPPPQPPP/RNB2RK1 w - - +Ruy Lopez: Worrall attack, sharp line +r1bq1rk1/2ppbppp/p1n2n2/1p2p3/4P3/1BP2N2/PP1P1PPP/RNBQR1K1 b - - +Ruy Lopez: closed, 8.c3 +r1bq1rk1/2ppbppp/p1n2n2/1p2p3/P3P3/1B3N2/1PPP1PPP/RNBQR1K1 b - - +Ruy Lopez: closed, anti-Marshall 8.a4 +r1bq1rk1/3nbppp/p2p4/npp1p3/3PP3/2P2N1P/PPB2PP1/RNBQR1K1 w - - +Ruy Lopez: closed, Keres (...Nd7) defense +r1bq1rk1/4bppp/p1np1n2/1pp1p3/3PP3/2P2N1P/PPB2PP1/RNBQR1K1 w - - +Ruy Lopez: closed, Borisenko defense +r1bq1rk1/4bppp/p1p5/1p1nR3/3P4/1BP5/PP3PPP/RNBQ2K1 b - - +Ruy Lopez: Marshall, main line, 12.d2d4 +r1bq1rk1/4bppp/p1p5/1p1nR3/8/1BP5/PP1P1PPP/RNBQ2K1 w - - +Ruy Lopez: Marshall counter-attack, 11...c6 +r1bq1rk1/4bppp/p2p1n2/npp1p3/4P3/2P2N1P/PPBP1PP1/RNBQR1K1 w - - +Ruy Lopez: closed (10...c5) +r1bq1rk1/4bppp/ppnppn2/8/2P1P3/N1N5/PP2BPPP/R1BQ1RK1 w - - +Sicilian, Sz\'en, hedgehog variation +r1bq1rk1/5ppp/p1p1pn2/2bp4/2P5/2N1PN2/PP3PPP/R1BQ1RK1 w - - +Nimzo-Indian: 4.e3, main line * +r1bq1rk1/5ppp/p1pbpn2/2pp4/2PP4/2N1PN2/PP3PPP/R1BQ1RK1 w - - +Nimzo-Indian: 4.e3, main line with 8...Bxc3 * +r1bq1rk1/5ppp/p2b4/1p1p4/3P4/2P1R3/PP3PPP/RNBQ2K1 b - - +Ruy Lopez: Marshall, Kevitz variation +r1bq1rk1/p1p2ppp/2pp1n2/4p3/1b1PP3/2N2N2/PPP2PPP/R1BQ1RK1 b - - +Four knights: Svenonius variation * +r1bq1rk1/p1pnbppp/1p3n2/1B1p2B1/3P4/2N1PN2/PP3PPP/2RQK2R b K - +QGD: Orthodox defense, Capablanca variation +r1bq1rk1/p1pnbppp/1p3n2/3p2B1/3P4/2NBPN2/PP3PPP/2RQK2R b K - +QGD: Orthodox defense, Pillsbury attack +r1bq1rk1/p1ppbppp/8/2p1P3/3B4/2N5/PPP1QPPP/R3R1K1 w - - +Ruy Lopez: Berlin defense, Rio de Janeiro variation +r1bq1rk1/p2nbppp/1pp1pn2/3p4/P1PP4/5NP1/1PQ1PPBP/RNBR2K1 b - - +Catalan: closed, Zagoryansky variation +r1bq1rk1/p2nbppp/2p1pn2/1p4B1/2BP4/2N1PN2/PP3PPP/2RQK2R w K - +QGD: Orthodox defense, Bd3 line, fianchetto variation +r1bq1rk1/p2pppbp/1pn2np1/2p5/2P5/2N2NP1/PP1PPPBP/R1BQ1RK1 w - - +English: symmetrical, main line with b3 * +r1bq1rk1/p3bppp/2n2n2/1pp1p3/3pP3/3P1NP1/PPP1NPBP/R1BQ1RK1 w - - +King's Indian: orthodox, Aronin-Taimanov, bayonet attack * +r1bq1rk1/p3nppp/2p5/2bpp3/8/1P4P1/P1PQPPBP/RNB2RK1 b - - +Gr\"unfeld: exchange, Larsen variation * +r1bq1rk1/p3ppbp/1pn2np1/2pp4/5P2/3PPN2/PPP1B1PP/RNB1QRK1 w - - +Dutch: Ilyin-Genevsky variation with b3 * +r1bq1rk1/p4ppp/2n2n2/2bpp1B1/8/1BNP4/PPP2PPP/R2QK1NR b KQ - +Evans gambit * +r1bq1rk1/p4ppp/2n2n2/2bpp3/8/1BNP4/PPP2PPP/R1BQK1NR w KQ - +Evans gambit: Morphy attack * +r1bq1rk1/pp1n1pbp/2pp1np1/4p3/2PPP3/2N2NPP/PP3PB1/R1BQ1RK1 b - - +King's Indian: fianchetto, classical main line +r1bq1rk1/pp1n1pbp/3p1np1/2pP4/8/2N2NP1/PP2PPBP/R1BQ1RK1 w - - +Benoni: fianchetto, 9...Nbd7 +r1bq1rk1/pp1n1pp1/2p1pb1p/8/2BP4/2N1PN2/PP3PPP/2RQ1RK1 b - - +QGD: Petrosian variation +r1bq1rk1/pp1n1ppp/1bp2n2/4N3/1PBPp3/P1N1B3/2P2PPP/R2QK2R w KQ - +Ruy Lopez: open, St. Petersburg variation * +r1bq1rk1/pp1n1ppp/1bp5/3P4/1PN1p1n1/P1N1B3/2P2PPP/R2QKB1R w KQ - +Ruy Lopez: open, Bernstein variation, Karpov gambit * +r1bq1rk1/pp1n1ppp/4pn2/2p5/1bBP4/2N1PN2/PP3PPP/R1BQ1RK1 w - - +Nimzo-Indian: 4.e3, Gligori\'c system, Bronstein variation +r1bq1rk1/pp1n1ppp/4pn2/2pp4/1bPP4/2NBPN2/PP3PPP/R1BQ1RK1 w - - +Nimzo-Indian: 4.e3, Gligori\'c system with 7...Nbd7 +r1bq1rk1/pp1n2pp/2n1pp2/2bpP3/5PQ1/P1N2N2/1PP3PP/R1B1KB1R w KQ - +French: Steinitz, Brodsky-Jones variation +r1bq1rk1/pp1nb1pp/2n2p2/4p3/2Pp4/N2P1NP1/PP3PBP/R1BQR1K1 w - - +Benoni: classical, 11.f3 * +r1bq1rk1/pp1nbppp/2n5/4p3/2Pp4/3P1NP1/PP3PBP/RNBQR1K1 w - - +Benoni: classical, 9...Re8, 10.Nd2 * +r1bq1rk1/pp1nbppp/2n5/4p3/2Pp4/N2P1NP1/PP3PBP/R1BQR1K1 b - - +Benoni: classical with ...Re8 and ...Na6 * +r1bq1rk1/pp1nbppp/2p1p3/3n2B1/2BP3P/2N1PN2/PP3PP1/2RQK2R b K - +QGD: Orthodox defense, Bd3 line, Janowski variation +r1bq1rk1/pp1nbppp/2p1p3/3n2B1/2BP4/2N1PN2/PP3PPP/2RQK2R w K - +QGD: Orthodox defense, Bd3 line, Capablanca freeing maneuver +r1bq1rk1/pp1nbppp/2p1p3/3p2B1/2PPn3/2N1PN2/PPQ2PPP/2R1KB1R w K - +QGD: Orthodox defense, Rubinstein attack, Wolf variation +r1bq1rk1/pp1nbppp/2p1pn2/3p2B1/2PP4/2N1PN2/PP3PPP/2RQKB1R w K - +QGD: Orthodox defense +r1bq1rk1/pp1nbppp/2p1pn2/3p2B1/2PP4/2N1PN2/PPQ2PPP/2R1KB1R b K - +QGD: Orthodox defense, Rubinstein attack (with Rc1) +r1bq1rk1/pp1nbppp/2p1pn2/3p2B1/2PP4/2NBPN2/PP3PPP/2RQK2R b K - +QGD: Orthodox defense, Bd3 line +r1bq1rk1/pp1nbppp/2p1pn2/3p4/2PP4/1P3NP1/P1Q1PPBP/RNB2RK1 b - - +Catalan: closed, Qc2 & b3 +r1bq1rk1/pp1nbppp/2p1pn2/3p4/2PP4/2NQ1NP1/PP2PPBP/R1B2RK1 b - - +Catalan: closed, Botvinnik variation +r1bq1rk1/pp1nbppp/2p1pn2/3p4/2PP4/5NP1/PPQNPPBP/R1B2RK1 b - - +Catalan: closed, main line +r1bq1rk1/pp1nbppp/2p4n/3pp1N1/2BPPP2/2P5/PP4PP/RNBQ1RK1 w - - +Philidor: Hanham, Berger variation +r1bq1rk1/pp1nbppp/2pp1n2/8/P1BpP3/2N2N2/1PP1QPPP/R1B2RK1 w - - +Philidor: Nimzovich, Sozin variation +r1bq1rk1/pp1nbppp/4pn2/2pP2B1/3P4/2N1PN2/PPQ2PPP/R3KB1R b KQ - +QGD: Orthodox defense, 7.Qc2 c5, 8.cd (Rubinstein) +r1bq1rk1/pp1p1ppp/2n1pn2/2p5/2PP4/P1PBP3/5PPP/R1BQK1NR w KQ - +Nimzo-Indian: S\"amisch, main line +r1bq1rk1/pp1pppbp/2n2np1/2p5/2P5/1P2PN2/PB1PBPPP/RN1QK2R b KQ - +English: symmetrical, hedgehog system * +r1bq1rk1/pp1pppbp/2n2np1/2p5/2P5/1PN2NP1/P2PPPBP/R1BQ1RK1 b - - +English: symmetrical, main line with b3 +r1bq1rk1/pp1pppbp/2n2np1/2p5/2P5/2NP1NP1/PP2PPBP/R1BQ1RK1 b - - +English: symmetrical, main line with d3 +r1bq1rk1/pp1pppbp/2n2np1/2p5/2PP4/2N2NP1/PP2PPBP/R1BQ1RK1 b - - +English: symmetrical, main line with d4 +r1bq1rk1/pp1pppbp/2n2np1/8/2PN4/2N1P3/PP2BPPP/R1BQK2R b KQ - +English: Symmetrical, Keres defense * +r1bq1rk1/pp2b1pp/2n2n2/2pp4/4pB2/1N2PP2/PPP1B1PP/RN1Q1RK1 b - - +Alekhine's defense: four pawns attack, Korchnoi variation * +r1bq1rk1/pp2bppp/2n1pn2/2pp4/4P3/3P1NP1/PPPN1PBP/R1BQR1K1 b - - +R\'eti: King's Indian attack, French variation +r1bq1rk1/pp2bppp/2n2n2/2pp2B1/3P4/2N2NP1/PP2PPBP/R2Q1RK1 b - - +QGD: Tarrasch, Prague variation, 9.Bg5 +r1bq1rk1/pp2bppp/2n2n2/2pp4/3P4/2N2NP1/PP2PPBP/R1BQ1RK1 w - - +QGD: Tarrasch, Prague variation, Normal position +r1bq1rk1/pp2bppp/2n2n2/2ppp3/4P3/2NP1NP1/PPP2PBP/R1BQ1RK1 b - - +King's Indian: orthodox, Aronin-Taimanov variation (Yugoslav attack / Mar del Plata variation) * +r1bq1rk1/pp2bppp/2n2n2/2ppp3/4P3/2PP1NP1/PP3PBP/RNBQ1RK1 b - - +King's Indian: orthodox, Donner variation * +r1bq1rk1/pp2bppp/2n2n2/2ppp3/4P3/3P1NP1/PPP2PBP/RNBQ1RK1 w - - +King's Indian: orthodox variation * +r1bq1rk1/pp2bppp/2n2n2/2ppp3/4P3/3P1NP1/PPPN1PBP/R1BQ1RK1 b - - +King's Indian: orthodox, 7...Nbd7 * +r1bq1rk1/pp2bppp/2n2n2/4p3/2Pp4/3P1NP1/PP3PBP/RNBQ1RK1 w - - +Benoni: classical, 9.O-O * +r1bq1rk1/pp2bppp/2n2n2/4p3/2Pp4/3P1NP1/PP3PBP/RNBQR1K1 b - - +Benoni: classical, 9...Re8 * +r1bq1rk1/pp2bppp/2np1n2/4p1B1/3NPP2/2N5/PPPQ2PP/2KR1B1R w - - +Sicilian: Richter-Rauzer, Rauzer attack, Geller variation +r1bq1rk1/pp2bppp/2nppn2/6B1/3NPP2/2N5/PPPQ2PP/2KR1B1R b - - +Sicilian: Richter-Rauzer, Rauzer attack, 7...Be7 defense, 9.f4 +r1bq1rk1/pp2bppp/2nppn2/8/3NPP2/1BN1B3/PPP3PP/R2QK2R b KQ - +Sicilian: Sozin, Fischer variation +r1bq1rk1/pp2bppp/2nppn2/8/3NPP2/2N1B3/PPP1B1PP/R2Q1RK1 b - - +Sicilian: modern Scheveningen, main line +r1bq1rk1/pp2bppp/3ppn2/6B1/3QPP2/2N5/PPP3PP/2KR1B1R b - - +Sicilian: Richter-Rauzer, Rauzer attack, 7...Be7 defense, 9...Nxd4 +r1bq1rk1/pp2bppp/3ppn2/6B1/3nPP2/2N5/PPPQ2PP/2KR1B1R w - - +Sicilian: Richter-Rauzer, Rauzer attack, 7...Be7 defense, 9...Nxd4 +r1bq1rk1/pp2bppp/n1n5/2p1p3/8/PPNPPN2/4BPPP/R1BQ1RK1 b - - +Sicilian, Sz\'en, hedgehog variation * +r1bq1rk1/pp2ppbp/2n2np1/2p5/2Pp4/2NP1NP1/PP2PPBP/R1BQ1RK1 w - - +King's Indian: fianchetto, Yugoslav Panno * +r1bq1rk1/pp2ppbp/2n2np1/2pp2B1/8/2NP1NP1/PPP1PPBP/R2Q1RK1 b - - +King's Indian: fianchetto, Simagin variation * +r1bq1rk1/pp2ppbp/2n2np1/2pp4/2P5/2N2NP1/PP1PPPBP/R1BQ1RK1 w - - +English: symmetrical, main line with d4 * +r1bq1rk1/pp2ppbp/2n2np1/2pp4/2P5/3P1NP1/PP2PPBP/RNBQ1RK1 w - - +King's Indian: fianchetto, Yugoslav, 7.O-O * +r1bq1rk1/pp2ppbp/2n2np1/2pp4/3P1P2/2P1PN2/PP2B1PP/RNBQ1RK1 b - - +Dutch: stonewall with Nc3 * +r1bq1rk1/pp2ppbp/2n2np1/2pp4/3P1P2/4PN2/PPP1B1PP/RNBQ1RK1 w - - +Dutch: stonewall with Nc3 * +r1bq1rk1/pp2ppbp/2n2np1/2pp4/4P3/2NP1NP1/PPP2PBP/R1BQ1RK1 b - - +King's Indian: fianchetto, Uhlmann (Szabo) variation * +r1bq1rk1/pp2ppbp/2n2np1/2pp4/4P3/3P1NP1/PPPN1PBP/R1BQ1RK1 b - - +King's Indian: fianchetto, classical variation * +r1bq1rk1/pp2ppbp/2n2np1/2pp4/5B2/2NP1NP1/PPP1PPBP/R2Q1RK1 b - - +King's Indian: fianchetto, lesser Simagin (Spassky) variation * +r1bq1rk1/pp2ppbp/2n2np1/2pp4/5B2/2PP1NP1/PP2PPBP/RN1Q1RK1 b - - +King's Indian: fianchetto, Larsen system * +r1bq1rk1/pp2ppbp/2n2np1/2pp4/5P2/2NP1NP1/PPP1P1BP/R1BQ1RK1 b - - +Dutch: Leningrad, main variation with Nc6 * +r1bq1rk1/pp2ppbp/2n2np1/2pp4/5P2/2PP1NP1/PP2P1BP/RNBQ1RK1 b - - +Dutch: Leningrad, main variation with c6 * +r1bq1rk1/pp2ppbp/2n2np1/2pp4/5P2/3PPN2/PPP1B1PP/RNB1QRK1 b - - +Dutch: Ilyin-Genevsky variation * +r1bq1rk1/pp2ppbp/2n2np1/2pp4/8/1P2PN2/PBPPBPPP/RN1Q1RK1 w - - +Queen's Indian: old main line, 7.Nc3 * +r1bq1rk1/pp2ppbp/2n2np1/2pp4/8/P1NP1NP1/1PP1PPBP/R1BQ1RK1 b - - +King's Indian: fianchetto, Panno variation * +r1bq1rk1/pp2ppbp/2n2np1/2pp4/Q7/2PP1NP1/PP2PPBP/RNB2RK1 b - - +King's Indian: fianchetto, Kavalek (Bronstein) variation * +r1bq1rk1/pp2ppbp/2n2np1/3p4/2PN4/6P1/PP2PPBP/RNBQ1RK1 w - - +Neo-Gr\"unfeld, 6.cd Nxd5, 7.O-O c5, 8.Nc3 * +r1bq1rk1/pp2ppbp/2n2np1/3p4/2PP4/2N2N2/PP2BPPP/R1BQ1RK1 b - - +QGD: Tarrasch, Prague variation, Normal position * +r1bq1rk1/pp2ppbp/2n2np1/8/2Pp4/3P1NP1/PP1N1PBP/R1BQ1RK1 b - - +Benoni: fianchetto, 9...Nbd7 * +r1bq1rk1/pp2ppbp/2n3p1/8/2BPP3/4B3/P3NPPP/R2Q1RK1 b - - +Gr\"unfeld: Spassky variation, main line, 10...cd, 11.cd +r1bq1rk1/pp2ppbp/2np1np1/2p5/2P5/2N2NP1/PP1PPPBP/R1BQ1RK1 w - - +English: symmetrical, main line with d3 * +r1bq1rk1/pp2ppbp/2np1np1/2pP4/2P5/2N2NP1/PP2PPBP/R1BQ1RK1 b - - +King's Indian: fianchetto, Yugoslav Panno +r1bq1rk1/pp2ppbp/2np1np1/8/2BNP3/2N1BP2/PPPQ2PP/R3K2R b KQ - +Sicilian: dragon, Yugoslav attack, 9.Bc4 +r1bq1rk1/pp2ppbp/2np1np1/8/2PNPP2/2N1B3/PP2B1PP/R2QK2R b KQ - +King's Indian: Four pawns attack, main line +r1bq1rk1/pp2ppbp/2np1np1/8/3NP3/2N1B3/PPPQBPPP/2KR3R b - - +Sicilian: dragon, classical, Grigoriev variation +r1bq1rk1/pp2ppbp/2np1np1/8/3NP3/2N1B3/PPPQBPPP/R4RK1 b - - +Sicilian: dragon, classical, Richter variation +r1bq1rk1/pp2ppbp/2np1np1/8/3NP3/2N1BP2/PPPQ2PP/2KR1B1R b - - +Sicilian: dragon, Yugoslav attack, Rauser variation +r1bq1rk1/pp2ppbp/2np1np1/8/4P3/1NN1B3/PPP1BPPP/R2Q1RK1 b - - +Sicilian: dragon, classical, 9.Nb3 +r1bq1rk1/pp2ppbp/5np1/n7/2BP4/2N2N2/PP3PPP/R1BQ1RK1 w - - +QGD: Tarrasch, R\'eti variation * +r1bq1rk1/pp3pb1/2n2npp/2ppp3/4P3/2PP1NP1/PP1N1PBP/R1BQ1RK1 w - - +King's Indian: fianchetto, classical main line * +r1bq1rk1/pp3pbp/2n2np1/2ppp3/4P3/3P1NP1/PPPN1PBP/R1BQ1RK1 w - - +King's Indian: fianchetto, classical variation, 8.e4 * +r1bq1rk1/pp3ppp/2B2n2/2b1N3/3p4/2N5/PPPP1PPP/R1BQK2R w KQ - +Giuoco Piano: M\"oller (Therkatz) attack * +r1bq1rk1/pp3ppp/2B2n2/2bpN3/8/2N5/PPPP1PPP/R1BQK2R b KQ - +Giuoco Piano * +r1bq1rk1/pp3ppp/2N2n2/1Bbp4/8/2N5/PPPP1PPP/R1BQK2R b KQ - +Giuoco Piano: Greco variation * +r1bq1rk1/pp3ppp/2n1pn2/1Bbp4/2P5/4PN2/PP1N1PPP/R1BQ1RK1 b - - +Nimzo-Indian: 4.e3, Gligori\'c system, Bronstein variation * +r1bq1rk1/pp3ppp/2n1pn2/1Bbp4/2P5/4PN2/PP2QPPP/RNB2RK1 b - - +Nimzo-Indian: 4.e3, Gligori\'c system, Smyslov variation * +r1bq1rk1/pp3ppp/2n1pn2/1Bbp4/2P5/4PN2/PP3PPP/RNBQ1RK1 w - - +Nimzo-Indian: 4.e3, Gligori\'c system with 7...dc * +r1bq1rk1/pp3ppp/2n1pn2/2p5/2BP4/P1P1PN2/5PPP/R1BQ1RK1 b - - +Nimzo-Indian: 4.e3, main line +r1bq1rk1/pp3ppp/2n1pn2/2pp4/1bPP4/2NBPN2/PP3PPP/R1BQ1RK1 w - - +Nimzo-Indian: 4.e3, main line with 7...Nc6 +r1bq1rk1/pp3ppp/2n1pn2/2pp4/2PP4/P1PBPN2/5PPP/R1BQ1RK1 b - - +Nimzo-Indian: 4.e3, main line with 8...Bxc3 +r1bq1rk1/pp3ppp/2n1pn2/8/1bBp4/P1N1PN2/1P3PPP/R1BQ1RK1 w - - +Nimzo-Indian: 4.e3, main line with 8...dc and 9...cd +r1bq1rk1/pp3ppp/2n2n2/2bp4/N7/5NP1/PP2PPBP/R1BQ1RK1 b - - +QGD: Tarrasch, R\'eti variation +r1bq1rk1/pp3ppp/2nbpn2/1BPp4/8/2N1PN2/PPP2PPP/R1BQ1RK1 b - - +Nimzo-Indian: 4.e3, Ragozin variation * +r1bq1rk1/pp3ppp/2nbpn2/1Bpp4/2PP4/1P2PN2/P4PPP/RNBQ1RK1 b - - +Nimzo-Indian: 4.e3, Keres variation * +r1bq1rk1/pp3ppp/2nbpn2/1Bpp4/2PP4/2N1PN2/PP3PPP/R1BQ1RK1 b - - +Nimzo-Indian: 4.e3, main line with 7...Nc6 * +r1bq1rk1/pp3ppp/2nbpn2/1Bpp4/2PP4/4PN2/PP1N1PPP/R1BQ1RK1 b - - +Nimzo-Indian: 4.e3, Gligori\'c system with 7...Nbd7 * +r1bq1rk1/pp3ppp/2nbpn2/2pp2B1/3P4/2P2NP1/PP2PPBP/RN1Q1RK1 b - - +Gr\"unfeld: Smyslov defense * +r1bq1rk1/pp3ppp/2nbpn2/2pp4/2PP4/2NBPN2/PP3PPP/R1BQ1RK1 b - - +QGD: Semi-Tarrasch, symmetrical variation * +r1bq1rk1/pp3ppp/2nbpn2/2pp4/2PP4/2NBPN2/PP3PPP/R1BQ1RK1 w - - +QGD: Semi-Tarrasch, symmetrical variation +r1bq1rk1/pp3ppp/2nbpn2/2pp4/3P1B2/2P2NP1/PP2PPBP/RN1Q1RK1 b - - +Gr\"unfeld: Flohr defense * +r1bq1rk1/pp3ppp/3b4/3P4/1P2n3/4PN2/5PPP/R1BQKB1R w KQ - +QGD semi-Slav: Meran, Sozin variation * +r1bq1rk1/pp4bp/2nppnp1/2p5/2P1PPPP/2N5/PP2B3/R1BQK1NR b KQ - +King's Indian: Six pawns attack +r1bq1rk1/ppbn1Npp/2p2n2/8/1PBPp3/P1N1B3/2P2PPP/R2Q1RK1 b - - +Ruy Lopez: open, Dilworth variation * +r1bq1rk1/ppp1b1pp/2n5/3npp2/8/P1NPPN2/1PQ2PPP/R1B1KB1R b KQ - +Sicilian: Scheveningen, classical variation with ...Qc7 and ...Nc6 * +r1bq1rk1/ppp1bppp/2n1pn2/8/3PN3/P5N1/1PP1BPPP/R1BQK2R w KQ - +French: Winawer, Alekhine gambit, Alatortsev variation +r1bq1rk1/ppp1bppp/2n5/3np3/8/P2PPN2/1P1N1PPP/R1BQKB1R b KQ - +Sicilian: Scheveningen, classical, Nd7 system * +r1bq1rk1/ppp1bppp/2n5/3np3/8/P2PPN2/1PQ2PPP/RNB1KB1R b KQ - +Sicilian: Scheveningen (Paulsen), classical variation * +r1bq1rk1/ppp1npbp/3p1np1/3Pp3/1PP1P3/2N2N2/P3BPPP/R1BQ1RK1 b - - +King's Indian: orthodox, Aronin-Taimanov, bayonet attack +r1bq1rk1/ppp1npbp/3p1np1/3Pp3/2P1P3/2N5/PP2BPPP/R1BQNRK1 b - - +King's Indian: orthodox, Aronin-Taimanov, 9.Ne1 +r1bq1rk1/ppp1nppN/3p4/3P4/2B1R3/8/PP3PPP/R2Q2K1 b - - +Giuoco Piano: Therkatz-Herzog variation +r1bq1rk1/ppp1nppp/3p1n2/1B2p1B1/1b2P3/2NP1N2/PPP2PPP/R2Q1RK1 w - - +Four knights: symmetrical, Pillsbury variation +r1bq1rk1/ppp1nppp/3p1n2/1B2p3/1b1PP3/2N2N2/PPP1QPPP/R1B2RK1 b - - +Four knights: Alatortsev variation * +r1bq1rk1/ppp1nppp/3p1n2/1B2p3/1b2P3/2NP1N2/PPP2PPP/R1BQ1RK1 w - - +Four knights: symmetrical, Mar\'oczy system * +r1bq1rk1/ppp1p1bp/2np1np1/5p2/2PP4/2N2NP1/PP2PPBP/R1BQ1RK1 w - - +Dutch: Leningrad, main variation with Nc6 +r1bq1rk1/ppp1ppbp/2n2np1/8/2QPP3/2N2N2/PP3PPP/R1B1KB1R w KQ - +Gr\"unfeld: Russian, Byrne (Simagin) variation +r1bq1rk1/ppp1ppbp/2n3p1/8/2BPP3/2P5/P3NPPP/R1BQK2R w KQ - +Gr\"unfeld: exchange, Simagin's improved variation +r1bq1rk1/ppp1ppbp/2np1np1/8/2PP4/2N2NP1/PP2PPBP/R1BQK2R w KQ - +King's Indian: fianchetto with ...Nc6 +r1bq1rk1/ppp1ppbp/2np1np1/8/2PPP3/2N1BP2/PP4PP/R2QKBNR w KQ - +King's Indian: S\"amisch, 6...Nc6 +r1bq1rk1/ppp1ppbp/n2p1np1/8/2PPP3/2N2N2/PP2BPPP/R1BQK2R w KQ - +King's Indian: Kazakh variation +r1bq1rk1/ppp1ppbp/n4np1/8/2QPP3/2N2N2/PP3PPP/R1B1KB1R w KQ - +Gr\"unfeld: Russian, Prins variation +r1bq1rk1/ppp2pbp/2np1np1/4p3/2PP4/2N2NP1/PP2PPBP/R1BQ1RK1 w - - +King's Indian: fianchetto, Uhlmann (Szabo) variation +r1bq1rk1/ppp2pbp/2np1np1/4p3/2PPP3/2N2N2/PP2BPPP/R1BQ1RK1 w - - +King's Indian: orthodox, Aronin-Taimanov variation (Yugoslav attack / Mar del Plata variation) +r1bq1rk1/ppp2ppp/1b1p1n2/4p3/N3P3/3P1B2/PPP2PPP/R1BQ1RK1 w - - +Four knights: Rubinstein counter-gambit Mar\'oczy variation +r1bq1rk1/ppp2ppp/2Bp1n2/4p3/1b2P3/2N2N2/PPPP1PPP/R1BQ1RK1 b - - +Four knights * +r1bq1rk1/ppp2ppp/2n1pn2/8/1bpP4/2NBPN2/PP3PPP/R1BQ1RK1 w - - +Nimzo-Indian: 4.e3, Ragozin variation +r1bq1rk1/ppp2ppp/2n2n2/1B1pp3/4P3/2PP1N2/P1P2PPP/R1BQ1RK1 w - - +Four knights: Svenonius variation +r1bq1rk1/ppp2ppp/2n2n2/3Pp3/1b6/2NP1N2/PPPB1PPP/R2QKB1R b KQ - +Ruy Lopez: closed Berlin defense, Wolf variation * +r1bq1rk1/ppp2ppp/2n2n2/3pp3/1b2P3/2NP1N2/PPPBBPPP/R2QK2R b KQ - +Ruy Lopez: Berlin defense, hedgehog variation * +r1bq1rk1/ppp2ppp/2n2n2/3pp3/4P3/2bP1N2/PPPBBPPP/R2QK2R w KQ - +Ruy Lopez: closed Berlin defense, Showalter variation * +r1bq1rk1/ppp2ppp/2np1n2/1B2p3/1b2P3/2N2N2/PPPP1PPP/R1BQ1RK1 w - - +Four knights: double Ruy Lopez * +r1bq1rk1/ppp2ppp/2np1n2/1B2p3/1b2P3/2NP1N2/PPP2PPP/R1BQ1RK1 b - - +Four knights: symmetrical variation * +r1bq1rk1/ppp2ppp/2np1n2/1B2p3/1b2P3/2NP1N2/PPP2PPP/R1BQ1RK1 w - - +Four knights: symmetrical variation +r1bq1rk1/ppp2ppp/2np1n2/1B2p3/1b2P3/3P1N2/PPP1NPPP/R1BQ1RK1 b - - +Four knights: symmetrical, Mar\'oczy system +r1bq1rk1/ppp2ppp/2np1n2/1B2p3/4P3/2PP1N2/P1P2PPP/R1BQR1K1 b - - +Four knights: Janowski variation +r1bq1rk1/ppp2ppp/3p1b2/n3p3/4P3/1B1P1N2/PPP2PPP/R1BQ1RK1 b - - +Four knights: Rubinstein counter-gambit Mar\'oczy variation * +r1bq1rk1/ppp3pp/2n2P2/2bp1PB1/8/2p5/PPP2P1P/R2QKBNR w KQ - +Vienna: Pierce gambit, Rushmere attack * +r1bq1rk1/ppp3pp/2n5/1B1p1p2/1b2p3/2N2N2/PPPP1PPP/R1BQ1RK1 b - - +Four knights: Bardeleben variation * +r1bq1rk1/pppn1pb1/3p3p/3Pp1pn/2P1P2P/2N2NB1/PP2BPP1/R2QK2R b KQ - +King's Indian: Petrosian system, Keres variation +r1bq1rk1/pppn1pbp/3p1np1/3Pp3/2P1P3/2N2N2/PP2BPPP/R1BQK2R w KQ - +King's Indian: Petrosian system, main line +r1bq1rk1/pppn1pbp/3p1np1/4p3/2PP4/2N2NP1/PP2PPBP/R1BQ1RK1 w - - +King's Indian: fianchetto, classical variation +r1bq1rk1/pppn1pbp/3p1np1/4p3/2PPP3/2N2N2/PP2BPPP/R1BQ1RK1 w - - +King's Indian: orthodox, 7...Nbd7 +r1bq1rk1/pppn1pbp/3p1np1/4p3/2PPP3/2N2N2/PP2BPPP/R1BQR1K1 b - - +King's Indian: orthodox, 7...Nbd7, 8.Re1 +r1bq1rk1/pppn1pbp/3p1np1/4p3/2PPP3/2N2NP1/PP3PBP/R1BQ1RK1 b - - +King's Indian: fianchetto, classical variation, 8.e4 +r1bq1rk1/pppn1ppp/1b3n2/4N3/1P1Pp3/P1N1B3/2P2PPP/R2QKB1R w KQ - +Ruy Lopez: open, Bernstein variation * +r1bq1rk1/pppnbBpp/3p1n2/4p1N1/3PP3/2N5/PPP2PPP/R1BQK2R b KQ - +Philidor: Nimzovich, L\"arobok variation +r1bq1rk1/pppnbppp/4pn2/3p2B1/2PP4/1QN1PN2/PP3PPP/R3KB1R b KQ - +QGD: Orthodox defense, Rauzer variation +r1bq1rk1/pppnbppp/4pn2/3p2B1/2PP4/2N1PN2/PP3PPP/2RQKB1R b K - +QGD: Orthodox defense, 7.Rc1 +r1bq1rk1/pppnbppp/4pn2/3p2B1/2PP4/2N1PN2/PP3PPP/R2QKB1R w KQ - +QGD: Orthodox defense +r1bq1rk1/pppnbppp/4pn2/3p2B1/2PP4/2N1PN2/PPQ2PPP/R3KB1R b KQ - +QGD: Orthodox defense, Rubinstein variation +r1bq1rk1/pppnbppp/4pn2/3p2B1/2PP4/2NBPN2/PP3PPP/R2QK2R b KQ - +QGD: Orthodox defense, Botvinnik variation +r1bq1rk1/pppnbppp/4pn2/3p4/2PP4/5NP1/PP2PPBP/RNBQ1RK1 w - - +Catalan: closed, 6...Nbd7 +r1bq1rk1/pppnbppp/4pn2/3p4/2PP4/5NP1/PPQ1PPBP/RNB2RK1 b - - +Catalan: closed, 7.Qc2 +r1bq1rk1/pppnn1bp/3p2p1/3Ppp2/2P1P1P1/2N2P2/PP2B2P/R1BQNRK1 b - - +King's Indian: orthodox, Aronin-Taimanov, Benk\"o attack +r1bq1rk1/pppnn1bp/3p2p1/3Ppp2/2P1P3/2N2P2/PP2B1PP/R1BQNRK1 w - - +King's Indian: orthodox, Aronin-Taimanov, main line +r1bq1rk1/pppnppbp/3p1np1/8/2PP4/2N2NP1/PP2PPBP/R1BQK2R w KQ - +King's Indian: fianchetto with ...Nd7 +r1bq1rk1/pppnppbp/5np1/6N1/2BP4/1QN1P3/PP3PPP/R1B1K2R b KQ - +Gr\"unfeld: Pachman variation +r1bq1rk1/pppp1ppp/1bn2n2/1B2p3/3PP3/2P2N2/PP3PPP/RNBQ1RK1 w - - +Ruy Lopez: classical defense, Benelux variation +r1bq1rk1/pppp1ppp/2B2n2/4p3/1b2P3/2N2N2/PPPP1PPP/R1BQ1RK1 b - - +Four knights: Nimzovich (Paulsen) variation +r1bq1rk1/pppp1ppp/2n2n2/1B2P3/1b1P1P2/2N5/PPP3PP/R1BQ1RK1 w - - +Four knights: Bardeleben variation +r1bq1rk1/pppp1ppp/2n2n2/1B2p3/1b2P3/2NP1N2/PPP2PPP/R1BQ1RK1 b - - +Four knights: double Ruy Lopez +r1bq1rk1/pppp1ppp/2n2n2/1B2p3/4P3/2b2N2/PPPP1PPP/R1BQ1RK1 w - - +Four knights: Nimzovich (Paulsen) variation * +r1bq1rk1/pppp1ppp/2n2n2/1B2p3/4P3/2bP1N2/PPP2PPP/R1BQ1RK1 w - - +Four knights +r1bq1rk1/pppp1ppp/2n2n2/3Np3/1b2P3/5N2/PPPP1PPP/R1BQKB1R w KQ - +Four knights: Rubinstein counter-gambit, Henneberger variation * +r1bq1rk1/pppp1ppp/2n2n2/b3N3/2BPP3/2P5/P4PPP/RNBQ1RK1 b - - +Evans gambit: Richardson attack +r1bq1rk1/pppp1ppp/2n2n2/b3N3/4P3/P1N5/1PPP1PPP/R1BQKB1R w KQ - +Ruy Lopez: open, Knorre variation * +r1bq1rk1/pppp1ppp/2n5/1B1P4/1b2p3/5N2/PPPP1PPP/R1BQ1RK1 w - - +Four knights: Gunsberg counter-attack +r1bq1rk1/pppp1ppp/2n5/3Np3/1bB1n3/5N2/PPPP1PPP/R1BQ1RK1 b - - +Four knights: Marshall variation * +r1bq1rk1/pppp1ppp/5n2/1B2P3/1b1p4/2N5/PPPP1PPP/R1BQ1RK1 b - - +Four knights: Gunsberg counter-attack * +r1bq1rk1/pppp1ppp/5n2/1Bb1N3/3nP3/2N5/PPPP1PPP/R1BQ1RK1 w - - +Four knights: Marshall variation +r1bq1rk1/pppp1ppp/5n2/4n1N1/1bB5/8/PB3PPP/RN1Q1RK1 w - - +Scotch gambit: Hanneken variation +r1bq1rk1/pppp2pp/2n2n2/2b1pPP1/8/2N5/PPPP1P1P/R1BQKBNR w KQ - +Vienna: Hamppe-Muzio gambit * +r1bq2k1/pp3p1p/5n2/2b1r1p1/3p4/3P1B2/PPP1NPPP/R1BQK2R w KQ - +Giuoco Piano: M\"oller, bayonet attack * +r1bq3r/pp3pkp/2n2np1/4p3/2Pp4/3P1NP1/4PPBP/RN1Q1RK1 w - - +Benk\"o gambit: main line * +r1bq3r/ppp2k1p/2n3p1/2Qp4/3pP3/8/PPP2PPP/RNB1K2R w KQ - +Scotch gambit: Cochrane-Shumov defense +r1bq3r/ppp3pp/5k2/3pN3/1n1Pn3/1Q3P2/PP4PP/RN2K2R b KQ - +Giuoco Piano: Krause variation +r1bqk1nr/1ppp1ppp/p1n5/2b1p3/B3P3/5N2/PPPP1PPP/RNBQK2R w KQkq - +Ruy Lopez: Classical defense deferred +r1bqk1nr/1ppp1ppp/p1n5/4p3/Bb2P3/5N2/PPPP1PPP/RNBQK2R w KQkq - +Ruy Lopez: Alapin's defense deferred +r1bqk1nr/1ppp1ppp/pbn5/4p3/PPB1P3/2N2N2/2PP1PPP/R1BQK2R b KQkq - +Evans gambit declined, Showalter variation +r1bqk1nr/2pp1ppp/p1n5/1pb1p3/4P3/1B3N2/PPPP1PPP/RNBQK2R w KQkq - +Ruy Lopez: Graz variation +r1bqk1nr/5ppp/p1pbp3/2pp4/2P5/2N1PN2/PP1P1PPP/R1BQ1RK1 b kq - +Nimzo-Indian: S\"amisch, main line * +r1bqk1nr/5ppp/p1pbp3/2pp4/3P4/4PN2/PPP2PPP/RNBQ1RK1 w kq - +Nimzo-Indian: 4.e3, Botvinnik system * +r1bqk1nr/p1pp1ppp/2n5/bp2p3/2BPP3/2P2N2/P4PPP/RNBQK2R w KQkq - +Evans gambit: Leonhardt variation +r1bqk1nr/p4ppp/2p5/2bpp3/8/6P1/PPP1PPBP/RNBQK2R w KQkq - +Gr\"unfeld: exchange, classical variation * +r1bqk1nr/pp1n1ppp/2pb4/3p4/2PPp3/1P2P3/P2N1PPP/RNBQKB1R b KQkq - +French: Tarrasch, Botvinnik variation * +r1bqk1nr/pp1n1ppp/2pb4/3p4/2PPp3/2N1P3/PP1N1PPP/R1BQKB1R b KQkq - +French: Tarrasch, closed variation * +r1bqk1nr/pp1nbppp/2pp4/4P3/2B1P3/5N2/PPP2PPP/RNBQ1RK1 b kq - +Philidor: Hanham, Steiner variation +r1bqk1nr/pp1p1pbp/2n1p1p1/2p2P2/2B1P3/2N2N2/PPPP2PP/R1BQK2R b KQkq - +Sicilian: Grand Prix attack, Schofman variation +r1bqk1nr/pp1p1pbp/2n1p1p1/2p5/2P1P3/2N3P1/PP1P1PBP/R1BQK1NR b KQkq - +English: symmetrical, Botvinnik system reversed * +r1bqk1nr/pp1p1pbp/2n3p1/1Bp1p3/1P2P3/5N2/P1PP1PPP/RNBQR1K1 b kq - +Sicilian: Nimzovich-Rossolimo attack, Gurgenidze variation +r1bqk1nr/pp1p1pbp/2n3p1/2p1p3/2P5/2N1P1P1/PP1P1PBP/R1BQK1NR w KQkq - +English: symmetrical, Botvinnik system reversed +r1bqk1nr/pp1p1pbp/2n3p1/2p1p3/2P5/2N2NP1/PP1PPPBP/R1BQK2R w KQkq - +English: symmetrical, Botvinnik system reversed +r1bqk1nr/pp1p1pbp/2n3p1/2p1p3/2P5/2N3P1/PP1PPPBP/R1BQK1NR w KQkq - +English: symmetrical, Botvinnik system * +r1bqk1nr/pp1p1pbp/4p1p1/2p5/3nP3/3PB1P1/PPP1NPBP/R2QK1NR b KQkq - +Sicilian: closed, Smyslov variation +r1bqk1nr/pp1p1ppp/2n5/2b5/2pNp3/3PP3/PPP2PPP/RNBQKB1R b KQkq - +Alekhine's defense: two pawns' attack, Mikenas variation * +r1bqk1nr/pp1pppbp/2N3p1/8/8/6P1/PPP1PP1P/RNBQKB1R b KQkq - +English: Anglo-Gr\"unfeld, Smyslov defense * +r1bqk1nr/pp1pppbp/2n3p1/2p5/2P1P3/2N3P1/PP1P1PBP/R1BQK1NR b KQkq - +English: symmetrical, Botvinnik system +r1bqk1nr/pp1pppbp/2n3p1/2p5/2P5/2N2NP1/PP1PPPBP/R1BQK2R b KQkq - +English: symmetrical variation +r1bqk1nr/pp1pppbp/2n3p1/2p5/2P5/2N3P1/PP1PPPBP/R1BQK1NR b KQkq - +English: ultra-symmetrical variation * +r1bqk1nr/pp1pppbp/2n3p1/2p5/2P5/2N3P1/PP1PPPBP/R1BQK1NR w KQkq - +English: ultra-symmetrical variation +r1bqk1nr/pp1pppbp/2n3p1/2p5/4P3/2N3P1/PPPP1PBP/R1BQK1NR b KQkq - +English: closed system * +r1bqk1nr/pp1pppbp/2n3p1/2p5/4P3/2NPB3/PPP2PPP/R2QKBNR b KQkq - +English, Tr\"oger defense * +r1bqk1nr/pp1pppbp/2n3p1/8/2P5/8/PPN1PPPP/RNBQKB1R b KQkq - +English: symmetrical, Rubinstein system * +r1bqk1nr/pp1pppbp/2n3p1/8/2PNP3/4B3/PP3PPP/RN1QKB1R b KQkq - +Sicilian: accelerated fianchetto, Mar\'oczy bind, 6.Be3 +r1bqk1nr/pp1pppbp/2n3p1/8/2PNP3/8/PP3PPP/RNBQKB1R w KQkq - +Sicilian: accelerated fianchetto, Mar\'oczy bind, 5...Bg7 +r1bqk1nr/pp1pppbp/2n3p1/8/8/1N4P1/PPP1PP1P/RNBQKB1R b KQkq - +English: Anglo-Gr\"unfeld, Czech defense * +r1bqk1nr/pp2b1pp/2n5/2pppp2/8/3P1NP1/PPP1PPBP/RNBQ1RK1 w kq - +King's Indian: Four pawns attack, 6.Be2 * +r1bqk1nr/pp2b3/2n5/2p1pppp/2P5/2NPPNP1/PP4BP/R1BQ1RK1 w kq - +King's Indian: Six pawns attack * +r1bqk1nr/pp2bppp/2n5/2ppp3/8/3P1NP1/PPP1PPBP/RNBQK2R w KQkq - +King's Indian: 5.Be2 * +r1bqk1nr/pp2ppbp/2n3p1/2pp4/5P2/2PP1N2/PPQ1P1PP/RNB1KB1R b KQkq - +Dutch: Hort-Antoshin system * +r1bqk1nr/pp2ppbp/2np2p1/2p5/4P3/2N3P1/PPPP1PBP/R1BQK1NR w KQkq - +English: closed system (without ...d6) * +r1bqk1nr/pp2ppbp/2np2p1/2p5/4P3/2NP2P1/PPP2PBP/R1BQK1NR b KQkq - +English: closed system * +r1bqk1nr/pp2ppbp/2np2p1/2p5/4P3/2NP2P1/PPP2PBP/R1BQK1NR w KQkq - +Sicilian: closed +r1bqk1nr/pp2ppbp/2np2p1/2p5/4P3/2NPB1P1/PPP2PBP/R2QK1NR b KQkq - +Sicilian: closed, 6.Be3 +r1bqk1nr/pp2ppbp/2np2p1/2p5/4PP2/2NP2P1/PPP3BP/R1BQK1NR b KQkq - +Sicilian: closed, 6.f4 +r1bqk1nr/pp3pbp/2np2p1/2p1p3/4P3/2NP2P1/PPP1NPBP/R1BQK2R w KQkq - +Sicilian: closed, 6.Ne2 e5 (Botvinnik) +r1bqk1nr/pp3pbp/2np2p1/2p1p3/4P3/2NP2P1/PPP2PBP/R1BQK1NR w KQkq - +English: Botvinnik system * +r1bqk1nr/pp3pbp/2np2p1/2p1p3/4PP2/2NP2P1/PPP3BP/R1BQK1NR w KQkq - +Sicilian: closed, 6.f4 e5 (Botvinnik) +r1bqk1nr/pp3ppp/2nbp3/1Bpp4/3P4/4PN2/PPP2PPP/RNBQ1RK1 b kq - +Nimzo-Indian: 4.e3 O-O, 5.Bd3 d5 * +r1bqk1nr/pp3ppp/2nbp3/1Bpp4/8/4PN2/PPPP1PPP/RNBQ1RK1 w kq - +Nimzo-Indian: 4.e3 O-O, 5.Bd3 * +r1bqk1nr/pp3ppp/2nbp3/2pp4/4P3/3P1N2/PPPN1PPP/R1BQKB1R w KQkq - +Old Indian: Dus-Khotimirsky variation * +r1bqk1nr/pp3ppp/8/1Pb1p3/1nPp4/3P1N2/4PPPP/RNBQKB1R w KQkq - +Benk\"o gambit: Nescaf\'e Frapp\'e attack * +r1bqk1nr/pp4pp/2n5/4pp2/1bPp4/3P1NP1/PP3PBP/RNBQK2R w KQkq - +Benoni: Taimanov variation * +r1bqk1nr/ppp1bp1p/2n5/3pp1p1/8/3P1NP1/PPP1PPBP/RNBQK2R w KQkq - +Pirc: Chinese variation * +r1bqk1nr/ppp1bpp1/2n5/3pp2p/8/3P1NP1/PPP1PPBP/RNBQK2R w KQkq - +Pirc: bayonet (Mariotti) attack * +r1bqk1nr/ppp1bppp/2n5/3pp3/8/3P1NP1/PPP1PP1P/RNBQKB1R w KQkq - +Pirc defense * +r1bqk1nr/ppp1ppbp/2np2p1/8/2PPP3/2N5/PP3PPP/R1BQKBNR w KQkq - +Modern defense: Averbakh system, Kotov variation +r1bqk1nr/ppp2pbp/2np2p1/4p3/2P1P3/2NP2P1/PP3PBP/R1BQK1NR b KQkq - +English: Botvinnik system +r1bqk1nr/ppp2pbp/2np2p1/4p3/2P5/2NP2P1/PP2PPBP/R1BQK1NR b KQkq - +Sicilian: closed * +r1bqk1nr/ppp2pbp/2np2p1/4p3/2P5/2NP2P1/PP2PPBP/R1BQK1NR w KQkq - +English: closed system +r1bqk1nr/ppp2ppp/1b1p4/n2P4/2B1P3/5N2/PB3PPP/RN1Q1RK1 b kq - +Evans gambit: Ulvestad variation +r1bqk1nr/ppp2ppp/1b1p4/n5B1/2BPP3/2N2N2/P4PPP/R2Q1RK1 b kq - +Evans gambit: G\"oring attack +r1bqk1nr/ppp2ppp/1bnp4/4p3/2BPP3/2P2N2/P4PPP/RNBQ1RK1 w kq - +Evans gambit: Lasker defense +r1bqk1nr/ppp2ppp/1bnp4/8/2BPP3/2N2N2/P4PPP/R1BQ1RK1 b kq - +Evans gambit: Morphy attack +r1bqk1nr/ppp2ppp/1bnp4/8/2BPP3/5N2/P4PPP/RNBQ1RK1 w kq - +Evans gambit: normal variation +r1bqk1nr/ppp2ppp/1bnp4/8/2BPP3/5N2/PP3PPP/RNBQK2R w KQkq - +Giuoco Piano: LaBourdonnais variation +r1bqk1nr/ppp2ppp/2n1p3/8/3Pp3/P1N5/1PP2PPP/R1BQKB1R w KQkq - +French: Winawer, Alekhine gambit, Kan variation +r1bqk1nr/ppp2ppp/2n5/2bpp3/1PB1P3/5N2/P1PP1PPP/RNBQK2R w KQkq - +Evans counter-gambit +r1bqk1nr/ppp2ppp/2n5/2bpp3/8/3P1NP1/PPP1PP1P/RNBQKB1R w KQkq - +Pirc: Holmov system * +r1bqk1nr/ppp2ppp/2nb4/3pp3/3P4/4PN2/PPP2PPP/RNBQKB1R w KQkq - +French: Swiss variation * +r1bqk1nr/ppp2ppp/2np4/b3p1B1/2BPP3/2P2N2/P4PPP/RN1QK2R b KQkq - +Evans gambit: Sokolsky variation +r1bqk1nr/ppp2ppp/2np4/b3p3/2B1P3/2P2N2/P2P1PPP/RNBQ1RK1 w kq - +Evans gambit +r1bqk1nr/ppp2ppp/2np4/b3p3/2BPP3/1QP2N2/P4PPP/RNB1K2R b KQkq - +Evans gambit: Tartakower attack +r1bqk1nr/ppp2ppp/2np4/b3p3/2BPP3/2P2N2/P4PPP/RNBQK2R w KQkq - +Evans gambit +r1bqk1nr/ppp2ppp/2np4/b7/2BpP3/1QP2N2/P4PPP/RNB2RK1 b kq - +Evans gambit: Waller attack +r1bqk1nr/ppp2ppp/3b4/3pn3/8/2P2N2/PP2PPPP/RNBQKB1R w KQkq - +Caro-Kann: Alekhine gambit * +r1bqk1nr/ppp2ppp/8/2bp4/8/2P2P2/PP3PPP/RNBQKB1R w KQkq - +Caro-Kann: Forg\'acs variation * +r1bqk1nr/ppp3bp/2np2p1/4pp2/2P1P3/2NP2P1/PP3PBP/R1BQK1NR b KQkq - +Sicilian: closed, 6.f4 e5 (Botvinnik) * +r1bqk1nr/ppp3bp/2np2p1/4pp2/2P5/2NP2P1/PP2PPBP/R1BQK1NR w KQkq - +Sicilian: closed, 6.f4 * +r1bqk1nr/ppp3pp/1b1p1p2/n7/2BPP3/2N1BN2/P4PPP/R2Q1RK1 b kq - +Evans gambit: Steinitz variation +r1bqk1nr/ppp3pp/2n5/2bppp2/8/3P1NP1/PPP1PPBP/RNBQK2R w KQkq - +Pirc: Austrian attack, Ljubojevi\'c variation * +r1bqk1nr/pppn1ppp/3p4/2b1p3/4PP2/2N2N2/PPPP2PP/R1BQKB1R w KQkq - +KGD: classical, Hanham variation +r1bqk1nr/pppp1Bpp/2n5/2b1p3/4P3/5N2/PPPP1PPP/RNBQK2R b KQkq - +Giuoco Piano: Jerome gambit +r1bqk1nr/pppp1pbp/2n3p1/4p3/2P5/2N3P1/PP1PPPBP/1RBQK1NR b Kkq - +English: closed, 5.Rb1 +r1bqk1nr/pppp1pbp/2n3p1/4p3/2P5/2N3P1/PP1PPPBP/R1BQK1NR w KQkq - +English: closed system +r1bqk1nr/pppp1pbp/2n3p1/4p3/2P5/2NP2P1/PP2PPBP/R1BQK1NR b KQkq - +English: closed system (without ...d6) +r1bqk1nr/pppp1ppp/1bn5/1B2p3/4P3/2P2N2/PP1P1PPP/RNBQK2R w KQkq - +Ruy Lopez: classical defense, Charousek variation +r1bqk1nr/pppp1ppp/1bn5/4p3/1PB1P3/5N2/PBPP1PPP/RN1QK2R b KQkq - +Evans gambit declined, Cordel variation +r1bqk1nr/pppp1ppp/1bn5/4p3/PPB1P3/5N2/2PP1PPP/RNBQK2R b KQkq - +Evans gambit declined, 5.a4 +r1bqk1nr/pppp1ppp/2n5/1B2p3/1b2P3/5N2/PPPP1PPP/RNBQK2R w KQkq - +Ruy Lopez: Alapin's defense +r1bqk1nr/pppp1ppp/2n5/1Bb1p3/4P3/2P2N2/PP1P1PPP/RNBQK2R b KQkq - +Ruy Lopez: classical defense, 4.c3 +r1bqk1nr/pppp1ppp/2n5/1Bb1p3/4P3/5N2/PPPP1PPP/RNBQK2R w KQkq - +Ruy Lopez: classical (Cordel) defense +r1bqk1nr/pppp1ppp/2n5/2b1N3/4P3/8/PPPP1PPP/RNBQKB1R b KQkq - +Vienna game * +r1bqk1nr/pppp1ppp/2n5/2b1p3/1PB1P3/5N2/P1PP1PPP/RNBQK2R b KQkq - +Evans gambit declined +r1bqk1nr/pppp1ppp/2n5/2b1p3/2B1P3/2P2N2/PP1P1PPP/RNBQK2R b KQkq - +Giuoco Piano +r1bqk1nr/pppp1ppp/2n5/2b1p3/2B1P3/3P1N2/PPP2PPP/RNBQK2R b KQkq - +Giuoco Pianissimo +r1bqk1nr/pppp1ppp/2n5/2b1p3/2B1P3/5N2/PPPP1PPP/RNBQK2R w KQkq - +Giuoco Piano +r1bqk1nr/pppp1ppp/2n5/2b1p3/4P3/2N2N2/PPPP1PPP/R1BQKB1R b KQkq - +Vienna game * +r1bqk1nr/pppp1ppp/2n5/2b1p3/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - +Vienna game * +r1bqk1nr/pppp1ppp/2n5/2b3N1/2BpP3/8/PPP2PPP/RNBQK2R b KQkq - +Scotch gambit +r1bqk1nr/pppp1ppp/2n5/2b5/3NP3/8/PPP2PPP/RNBQKB1R w KQkq - +Scotch game +r1bqk1nr/pppp1ppp/2n5/2b5/4P3/1N6/PPP2PPP/RNBQKB1R b KQkq - +Scotch: Potter variation +r1bqk1nr/pppp1ppp/2n5/4p3/1bB1P3/5N2/P1PP1PPP/RNBQK2R w KQkq - +Evans gambit +r1bqk1nr/pppp1ppp/2n5/8/1b2P3/1N6/PPP2PPP/RNBQKB1R w KQkq - +Scotch: Romanishin variation +r1bqk1nr/pppp1ppp/2n5/8/1b2P3/2N2N2/PP3PPP/R1BQKB1R w KQkq - +Scotch: G\"oring gambit +r1bqk1nr/pppp1ppp/2n5/8/1bB1P3/2P2N2/P4PPP/RNBQK2R b KQkq - +Scotch gambit +r1bqk1nr/pppp1ppp/2n5/8/1bBpP3/5N2/PPP2PPP/RNBQK2R w KQkq - +Scotch gambit +r1bqk1nr/pppp1ppp/2n5/b3P3/2B5/2P2N2/P4PPP/RNBQK2R b KQkq - +Scotch gambit: Cochrane variation +r1bqk1nr/pppp1ppp/2n5/b3p3/2B1P3/2P2N2/P2P1PPP/RNBQ1RK1 b kq - +Evans gambit +r1bqk1nr/pppp1ppp/2n5/b3p3/2B1P3/2P2N2/P2P1PPP/RNBQK2R w KQkq - +Evans gambit +r1bqk1nr/pppp1ppp/2n5/b7/2B1P3/2p2N2/P4PPP/RNBQ1RK1 w kq - +Evans gambit: compromised defense +r1bqk1nr/pppp1ppp/2nb4/4p3/2B1P3/2P2N2/P2P1PPP/RNBQK2R w KQkq - +Evans gambit: Stone-Ware variation +r1bqk1nr/pppp1ppp/8/1Bb1p3/1P1nP3/5N2/P1PP1PPP/RNBQ1RK1 b kq - +Ruy Lopez: classical defense, Zaitsev variation +r1bqk1nr/pppp2pp/2n5/1Bb1pp2/4P3/2P2N2/PP1P1PPP/RNBQK2R w KQkq - +Ruy Lopez: Cordel gambit +r1bqk1nr/pppp2pp/2n5/1Bb2P2/4p3/5N2/PPPP1PPP/RNBQK2R w KQkq - +KGA: bishop's gambit, Paulsen attack * +r1bqk1nr/pppp2pp/2n5/2b1p1N1/2B1Pp2/3P4/PPP2PPP/RNBQK2R w KQkq - +Giuoco Pianissimo: Dubois variation +r1bqk1nr/pppp2pp/2n5/2b1pP2/8/2P2N2/PP1P1PPP/RNBQKB1R b KQkq - +KGA: bishop's gambit, Jaenisch variation * +r1bqk1nr/pppp2pp/2n5/2b1pP2/8/5N2/PPPP1PPP/RNBQKB1R w KQkq - +KGA: bishop's gambit, Bogolyubov variation * +r1bqk1nr/ppppbppp/2n5/1B2p3/4P3/5N2/PPPP1PPP/RNBQK2R w KQkq - +Ruy Lopez: Lucena defense +r1bqk1nr/ppppbppp/2n5/4p3/2B1P3/2P2N2/P2P1PPP/RNBQK2R w KQkq - +Evans gambit: 5...Be7 +r1bqk1nr/ppppbppp/2n5/4p3/2B1P3/5N2/PPPP1PPP/RNBQK2R w KQkq - +Hungarian defense +r1bqk1nr/ppppbppp/2n5/4p3/4P3/2P2N2/PP1P1PPP/RNBQKB1R w KQkq - +Ponziani: Romanishin variation +r1bqk1nr/ppppbppp/2n5/8/2BpP3/5N2/PPP2PPP/RNBQK2R w KQkq - +Scotch gambit: Benima defense +r1bqk1nr/ppppbppp/2n5/8/4P3/2P1Q3/PP3PPP/RNB1KBNR w KQkq - +Center game: Charousek variation +r1bqk1nr/ppppbppp/8/n3p3/2BPP3/2P2N2/P4PPP/RNBQK2R w KQkq - +Evans gambit: Cordel variation +r1bqk2r/1p1p1ppp/p1n1pn2/8/1bPNP3/2N5/PPB2PPP/R1BQK2R b KQkq - +Sicilian: Kan, Mar\'oczy bind - Bronstein variation +r1bqk2r/1pp1bppp/p1np1n2/4p3/B3P3/5N2/PPPP1PPP/RNBQR1K1 w kq - +Ruy Lopez: closed, Averbach variation +r1bqk2r/1pp1bppp/p5n1/3pn3/8/2N1PN2/PPP1BPPP/R1BQ1RK1 b kq - +French: Winawer, Alekhine gambit, Alatortsev variation * +r1bqk2r/1ppn1p1p/p4b1Q/1B6/8/2N2N2/PP1P1PPP/n1BK3R w kq - +Scotch: Berger variation * +r1bqk2r/1ppp1ppp/p1n2n2/2b1p3/B3P3/5N2/PPPP1PPP/RNBQ1RK1 w kq - +Ruy Lopez: M\"oller defense +r1bqk2r/1pppbppp/p1B2n2/4p3/4P3/5N2/PPPP1PPP/RNBQ1RK1 b kq - +Ruy Lopez: Exchange variation doubly deferred (DERLD) +r1bqk2r/1pppbppp/p1n2n2/4p3/B2PP3/5N2/PPP2PPP/RNBQ1RK1 b kq - +Ruy Lopez: closed, center attack +r1bqk2r/1pppbppp/p1n2n2/4p3/B3P3/5N2/PPPP1PPP/RNBQ1RK1 w kq - +Ruy Lopez: closed defense +r1bqk2r/1pppbppp/p1n2n2/4p3/B3P3/5N2/PPPPQPPP/RNB2RK1 b kq - +Ruy Lopez: Worrall attack +r1bqk2r/1pppbppp/p1n5/4P3/B2pn3/2P2N2/PP3PPP/RNBQ1RK1 b kq - +Ruy Lopez: closed, Basque gambit (North Spanish variation) +r1bqk2r/2p1bppp/p1np1n2/1p2p3/3PP3/1B3N2/PPP2PPP/RNBQR1K1 b kq - +Ruy Lopez: closed, 7...d6, 8.d4 +r1bqk2r/2p1bppp/p1np1n2/1p2p3/4P3/1B3N2/PPPPQPPP/RNB2RK1 w kq - +Ruy Lopez: Worrall attack, solid line +r1bqk2r/2pp1ppp/2n2n2/ppb1p3/4P3/PBN5/1PPP1PPP/R1BQK1NR w KQkq - +Evans gambit declined, Showalter variation * +r1bqk2r/2ppbppp/p1n2n2/1p2p3/4P3/1B3N2/PPPP1PPP/RNBQR1K1 b kq - +Ruy Lopez: closed +r1bqk2r/2ppbppp/p1n2n2/1p2p3/P3P3/1B3N2/1PPP1PPP/RNBQ1RK1 b kq - +Ruy Lopez: Wing attack +r1bqk2r/4bppp/p2p1n2/1pp5/3QP3/1B6/PPP2PPP/RNB1R1K1 w kq - +Ruy Lopez: Noah's ark trap +r1bqk2r/4nppp/p1pb4/2ppp3/2P5/1PN1P3/P2P1PPP/R1BQNRK1 b kq - +Nimzo-Indian: S\"amisch, Capablanca variation * +r1bqk2r/5ppp/p1n1pn2/1pb1P3/2B5/5N2/PP2QPPP/RNB2RK1 b kq - +QGA: classical, Furman variation +r1bqk2r/p1ppbppp/2p5/4Pn2/8/5N2/PPP1QPPP/RNB2RK1 w kq - +Ruy Lopez: Berlin defense, Cordel variation +r1bqk2r/p3nppp/2p5/2bpp3/2P5/6P1/PP2PPBP/RNBQ1RK1 b kq - +Gr\"unfeld: exchange, Spassky variation * +r1bqk2r/p3nppp/2p5/2bpp3/8/1P4P1/P1P1PPBP/RNBQ1RK1 b kq - +Gr\"unfeld: exchange, Simagin's lesser variation * +r1bqk2r/p3nppp/2p5/2bpp3/8/2N3P1/PPP1PPBP/R1BQ1RK1 b kq - +Gr\"unfeld: exchange, Simagin's improved variation * +r1bqk2r/p4ppp/2pbpn2/2pp4/2P5/2NPPN2/PP3PPP/R1BQK2R b KQkq - +Nimzo-Indian: e3, H\"ubner variation * +r1bqk2r/pnppbppp/2p5/4P3/2P5/5N2/PP2QPPP/RNB2RK1 b kq - +Ruy Lopez: Berlin defense, Zukertort variation +r1bqk2r/pnppbppp/2p5/4P3/3N4/8/PPP1QPPP/RNB2RK1 b kq - +Ruy Lopez: Berlin defense, Winawer attack +r1bqk2r/pnppbppp/2p5/4P3/8/1P3N2/P1P1QPPP/RNB2RK1 b kq - +Ruy Lopez: Berlin defense, Pillsbury variation +r1bqk2r/pp1n1ppp/2p1pn2/3p4/1bPP4/2NBPN2/PP3PPP/R1BQK2R w KQkq - +QGD semi-Slav: Romih variation +r1bqk2r/pp1n1ppp/2pbpn2/3p4/2PP4/2NBPN2/PP3PPP/R1BQK2R w KQkq - +QGD semi-Slav: Chigorin defense +r1bqk2r/pp1n1ppp/3bpn2/2pp4/2PP4/4PN2/PP1N1PPP/R1BQKB1R b KQkq - +QGD Slav: Semmering variation * +r1bqk2r/pp1n1ppp/3bpn2/2ppN3/3P1P2/2P1P3/PP4PP/RNBQKB1R b KQkq - +QGD: Stonewall variation * +r1bqk2r/pp1nbppp/2p1pn2/3p4/2PP4/2NBPN2/PP3PPP/R1BQK2R w KQkq - +QGD semi-Slav: Bogolyubov variation +r1bqk2r/pp1nnppp/3b4/3p4/3Pp3/1NN1P3/PP3PPP/R1BQKB1R b KQkq - +French: Tarrasch, Leningrad variation * +r1bqk2r/pp1nnppp/3b4/3p4/3Pp3/2N1P3/PP1N1PPP/R1BQKB1R w KQkq - +French: Tarrasch, closed variation, main line * +r1bqk2r/pp1p1ppp/2n1p3/2P5/1bP5/1QN2N2/PP1nPPPP/R3KB1R w KQkq - +Nimzo-Indian: Spielmann, Karlsbad variation +r1bqk2r/pp1p1ppp/2n1p3/2n5/1bP5/1QN2N2/PP1BPPPP/R3KB1R w KQkq - +Nimzo-Indian: Spielmann, San Remo variation +r1bqk2r/pp1p1ppp/2n1pn2/2P5/1bP5/1QN5/PP2PPPP/R1B1KBNR w KQkq - +Nimzo-Indian: Spielmann, 4...c5, 5.dc Nc6 +r1bqk2r/pp1p1ppp/2nNpn2/8/1b2P3/2N5/PPP2PPP/R1BQKB1R b KQkq - +Sicilian: Taimanov, American attack +r1bqk2r/pp1p1ppp/2nb1n2/2p1p3/8/1P2PN2/PBPP1PPP/RN1QKB1R w KQkq - +English: Queens Indian, Romanishin variation * +r1bqk2r/pp1p2pp/2n1p3/2n2p2/1bP5/2N2NP1/PPQBPP1P/R3KB1R b KQkq - +Nimzo-Indian: Spielmann, St\aa hlberg variation +r1bqk2r/pp1pnpbp/2n1p1p1/2p5/4P3/2NP2PN/PPP2PBP/R1BQK2R b KQkq - +English: closed, Taimanov variation * +r1bqk2r/pp1pnpbp/2n1p1p1/2p5/4P3/2NPB1P1/PPP2PBP/R2QK1NR b KQkq - +English: closed, Hort variation * +r1bqk2r/pp1pppbp/2n2np1/2p5/2P1P3/2N3P1/PP1P1PBP/R1BQK1NR b KQkq - +English: symmetrical, Botvinnik system reversed * +r1bqk2r/pp1pppbp/2n2np1/2p5/2P5/2N2NP1/PP1PPPBP/R1BQK2R b KQkq - +English: symmetrical variation * +r1bqk2r/pp1pppbp/2n2np1/2p5/2P5/2N2NP1/PP1PPPBP/R1BQK2R w KQkq - +English: symmetrical variation +r1bqk2r/pp1pppbp/2n2np1/2p5/2P5/2N3P1/PP1PPPBP/R1BQK1NR w KQkq - +English: symmetrical variation * +r1bqk2r/pp1pppbp/2n2np1/8/2BNP3/2N1B3/PPP2PPP/R2QK2R b KQkq - +Sicilian: accelerated fianchetto, modern variation with Bc4 +r1bqk2r/pp1pppbp/2n2np1/8/3NP3/6P1/PPP2PBP/RNBQK2R b KQkq - +English: Anglo-Gr\"unfeld defense, Korchnoi variation * +r1bqk2r/pp1pppbp/2n3p1/8/2PNP1n1/2N1B3/PP3PPP/R2QKB1R w KQkq - +Sicilian: accelerated fianchetto, Breyer variation +r1bqk2r/pp2b1pp/2n2n2/2p1pp2/2Pp4/3PPNP1/PP3PBP/RNBQ1RK1 w kq - +King's Indian: Four pawns attack * +r1bqk2r/pp2b1pp/2n2n2/2p2p2/2PPp3/3P1NP1/PP3PBP/RNBQ1RK1 w kq - +King's Indian: Four pawns attack, Florentine gambit * +r1bqk2r/pp2b1pp/2n2n2/2pppp2/2P5/3P1NP1/PP2PPBP/RNBQ1RK1 w kq - +King's Indian: Four pawns attack, with Be2 and Nf3 * +r1bqk2r/pp2b1pp/2n2n2/4pp2/2Pp4/3P1NP1/PP3PBP/RNBQR1K1 b kq - +Benoni: four pawns attack, main line * +r1bqk2r/pp2bppp/2n1p3/2pn4/8/2N2NP1/PP1PPPBP/R1BQ1RK1 w kq - +English: Symmetrical, Keres defense +r1bqk2r/pp2bppp/2n2n2/2p1p3/3pP3/3P1NP1/PPP2PBP/RNBQ1RK1 w kq - +King's Indian: Petrosian system * +r1bqk2r/pp2bppp/2n2n2/2p1p3/3pP3/3P1NP1/PPPN1PBP/R1BQ1RK1 b kq - +King's Indian: Petrosian system, main line * +r1bqk2r/pp2bppp/2n2n2/2p1p3/4p3/3P1NP1/PPP2PBP/RNBQ1RK1 w kq - +King's Indian: Andersson variation * +r1bqk2r/pp2bppp/2n2n2/2p1p3/P2pP3/3P1NP1/1PP2PBP/RNBQ1RK1 b kq - +King's Indian: Petrosian system, Stein variation * +r1bqk2r/pp2bppp/2n2n2/2pp4/3P4/2N2NP1/PP2PPBP/R1BQK2R w KQkq - +QGD: Tarrasch, Prague variation, 7...Be7 +r1bqk2r/pp2bppp/2n2n2/2ppp3/4P3/3P1NP1/PPP2PBP/RNBQ1RK1 b kq - +King's Indian: classical variation * +r1bqk2r/pp2bppp/2n2n2/2ppp3/8/3P1NP1/PPP1PPBP/RNBQ1RK1 w kq - +King's Indian: 6.Be2 * +r1bqk2r/pp2bppp/2n2n2/2ppp3/8/N2P1NP1/PPP1PPBP/R1BQ1RK1 b kq - +King's Indian: Kazakh variation * +r1bqk2r/pp2bppp/2n2n2/4p3/2Pp4/3P1NP1/PP3PBP/RNBQ1RK1 b kq - +Benoni: classical without 9.O-O * +r1bqk2r/pp2bppp/2n2n2/4p3/2Pp4/3P1NP1/PP3PBP/RNBQK2R w KQkq - +Benoni: classical without 9.O-O * +r1bqk2r/pp2bppp/2nppn2/6B1/3NP3/2N5/PPPQ1PPP/R3KB1R w KQkq - +Sicilian: Richter-Rauzer, Rauzer attack, 7...Be7 +r1bqk2r/pp2bppp/2nppn2/8/2BNP3/2N1B3/PPP1QPPP/R3K2R b KQkq - +Sicilian: Velimirovi\'c attack +r1bqk2r/pp2bppp/2nppn2/8/3NPP2/2N1BQ2/PPP3PP/R3KB1R b KQkq - +Sicilian: Scheveningen, Tal variation +r1bqk2r/pp2npbp/2n3p1/2ppp3/4P3/3P1NP1/PPP2PBP/RNBQ1RK1 w kq - +King's Indian: Pomar system * +r1bqk2r/pp2ppbp/2n2np1/2pp4/2P5/3P1NP1/PP2PPBP/RNBQ1RK1 b kq - +King's Indian: fianchetto, Yugoslav system * +r1bqk2r/pp2ppbp/2n2np1/2pp4/8/1P2PN2/PBPPBPPP/RN1QK2R w KQkq - +Queen's Indian: anti-Queen's Indian system * +r1bqk2r/pp2ppbp/2n2np1/2pp4/8/2NP1NP1/PPP1PPBP/R1BQ1RK1 b kq - +King's Indian: fianchetto with ...Nc6 * +r1bqk2r/pp2ppbp/2n2np1/2pp4/8/3P1NP1/PPPNPPBP/R1BQ1RK1 b kq - +King's Indian: fianchetto with ...Nd7 * +r1bqk2r/pp2ppbp/2n2np1/3p2B1/2PP4/2N2N2/PP3PPP/R2QKB1R b KQkq - +QGD: Tarrasch, Wagner variation * +r1bqk2r/pp2ppbp/2n2np1/3p4/2PP4/2N2N2/PP2BPPP/R1BQK2R b KQkq - +QGD: Tarrasch, Prague variation, 7...Be7 * +r1bqk2r/pp2ppbp/2n2np1/8/2Pp4/3P1NP1/PP3PBP/RNBQ1RK1 b kq - +Benoni: fianchetto variation * +r1bqk2r/pp2ppbp/2np1np1/8/3NP3/2N1B3/PPP1BPPP/R2Q1RK1 b kq - +Sicilian: dragon, classical, 8.O-O +r1bqk2r/pp2ppbp/2np1np1/8/3NP3/2N1B3/PPPQBPPP/R3K2R b KQkq - +Sicilian: dragon, classical, Amsterdam variation +r1bqk2r/pp2ppbp/2np1np1/8/4P3/1NN1B3/PPP1BPPP/R2QK2R b KQkq - +Sicilian: dragon, classical, Nottingham variation +r1bqk2r/pp2ppbp/2np2pn/8/2P1P3/8/PPN1BPPP/RNBQK2R w KQkq - +Sicilian: accelerated fianchetto, Simagin variation +r1bqk2r/pp3ppp/2n1pn2/2bp4/1P6/2P1PN2/P2N1PPP/R1BQKB1R b KQkq - +QGD semi-Slav: Meran variation * +r1bqk2r/pp3ppp/2n1pn2/2bp4/8/2P1PN2/PP1N1PPP/R1BQKB1R w KQkq - +QGD semi-Slav: 7.Bc4 * +r1bqk2r/pp3ppp/2n2n2/1Bb1p3/8/2N2N2/PPPP1PPP/R1BQK2R b KQkq - +Scotch: G\"oring gambit, Bardeleben variation * +r1bqk2r/pp3ppp/2n2n2/1Bbpp3/8/2N2N2/PPPP1PPP/R1BQK2R w KQkq - +Giuoco Piano: Greco's attack * +r1bqk2r/pp3ppp/2nb1n2/1P1pp3/8/P1P1PN2/3N1PPP/R1BQKB1R b KQkq - +QGD semi-Slav: Meran, Pir\'c variation * +r1bqk2r/pp3ppp/2nb1n2/3p4/1PP1p3/P3PN2/3N1PPP/R1BQKB1R w KQkq - +QGD semi-Slav: Meran, old main line * +r1bqk2r/pp3ppp/2nb1n2/3pp3/1PP5/P3PN2/3N1PPP/R1BQKB1R b KQkq - +QGD semi-Slav: Meran * +r1bqk2r/pp3ppp/2nb1n2/4p3/1PPp4/P3PN2/3N1PPP/R1BQKB1R w KQkq - +QGD semi-Slav: Meran, Reynolds' variation * +r1bqk2r/pp3ppp/2nbpn2/1Bpp4/2PP4/4PN2/PP3PPP/RNBQ1RK1 b kq - +Nimzo-Indian: 4.e3, main line with ...c5 * +r1bqk2r/pp3ppp/2nbpn2/1Bpp4/3P4/1P2PN2/P1P2PPP/RNBQ1RK1 b kq - +Nimzo-Indian: 4.e3, main line with ...b6 * +r1bqk2r/pp3ppp/2nbpn2/1Bpp4/3P4/2P1PN2/PP1N1PPP/R1BQK2R b KQkq - +QGD semi-Slav: Romih variation * +r1bqk2r/pp3ppp/2nbpn2/1P1p4/8/2P1PN2/P2N1PPP/R1BQKB1R b KQkq - +QGD semi-Slav: neo-Meran (Lundin variation) * +r1bqk2r/pp3ppp/2nbpn2/2pp4/3P4/2P1PN2/PP1N1PPP/R1BQKB1R w KQkq - +QGD semi-Slav: 6.Bd3 * +r1bqk2r/pp3ppp/2nbpn2/2pp4/3P4/2P1PN2/PP1NBPPP/R1BQK2R b KQkq - +QGD semi-Slav: Bogolyubov variation * +r1bqk2r/pp3ppp/2nbpn2/2pp4/3P4/2PBPN2/PP1N1PPP/R1BQK2R b KQkq - +QGD semi-Slav: Chigorin defense * +r1bqk2r/pp3ppp/2nbpn2/2pp4/3P4/5NP1/PPP1PPBP/RNBQ1RK1 w kq - +Gr\"unfeld with e3 & Bd3 * +r1bqk2r/pp3ppp/2nbpn2/2ppN3/3P1P2/2P1P3/PP4PP/RNBQKB1R b KQkq - +QGD semi-Slav: stonewall defense * +r1bqk2r/pp3ppp/2nbpn2/3p4/1P6/2P1PN2/PB1N1PPP/R2QKB1R b KQkq - +QGD semi-Slav: Meran, Wade variation * +r1bqk2r/pp3ppp/2nbpn2/3p4/1P6/P1P1PN2/3N1PPP/R1BQKB1R b KQkq - +QGD semi-Slav: Meran, 8...a6 * +r1bqk2r/pp3ppp/2nbpn2/3p4/2PN4/2N1P3/PP3PPP/R1BQKB1R w KQkq - +QGD: Semi-Tarrasch, 7.Bd3 * +r1bqk2r/pp3ppp/2nppn2/2p5/2PP4/2PBPN2/P4PPP/R1BQK2R w KQkq - +Nimzo-Indian: e3, H\"ubner variation +r1bqk2r/pp3ppp/3b1n2/3P2N1/1n2p3/P3P3/3N1PPP/R1BQKB1R b KQkq - +QGD semi-Slav: Meran, Rabinovich variation * +r1bqk2r/pp3ppp/3b1n2/3P4/1n2N3/P3PN2/5PPP/R1BQKB1R b KQkq - +QGD semi-Slav: Meran, Sozin variation * +r1bqk2r/pp3ppp/3b1n2/3P4/1n2p3/P3PN2/3N1PPP/R1BQKB1R w KQkq - +QGD semi-Slav: Meran, Blumenfeld variation * +r1bqk2r/ppb2ppp/2n5/1Bpnp3/8/P1N1PN2/1P1P1PPP/R1BQK2R w KQkq - +Sicilian: Kan, Mar\'oczy bind - Bronstein variation * +r1bqk2r/ppp1bpp1/5n1p/3P4/2P1p3/5N2/PPP1QPPP/RNB1K2R w KQkq - +two knights defense: Mar\'oczy variation +r1bqk2r/ppp1bppp/1nn5/4p3/4P3/2NP1N2/PP3PPP/R1BQKB1R w KQkq - +Sicilian: Boleslavsky variation, 7.Nb3 * +r1bqk2r/ppp1bppp/2n2n2/3pp3/8/3P1NP1/PPP1PPBP/RNBQK2R w KQkq - +Pirc: classical system, 5.Be2 * +r1bqk2r/ppp1bppp/2n5/1B1pp3/3Pn3/5N2/PPP1QPPP/RNB2RK1 w kq - +Ruy Lopez: Berlin defense, Trifunovi\'c variation +r1bqk2r/ppp1bppp/2n5/3np3/4P3/2NP1N2/PP3PPP/R1BQKB1R b KQkq - +Sicilian: Boleslavsky variation * +r1bqk2r/ppp1bppp/2n5/3np3/8/2NP1N2/PP2PPPP/R1BQKB1R w KQkq - +Sicilian: classical * +r1bqk2r/ppp1bppp/2n5/3np3/8/2NPPN2/PP3PPP/R1BQKB1R b KQkq - +Sicilian: modern Scheveningen * +r1bqk2r/ppp1bppp/2n5/3np3/8/3PPN2/PP3PPP/RNBQKB1R w KQkq - +Sicilian: Scheveningen, 6.Be2 * +r1bqk2r/ppp1bppp/2n5/3np3/8/P2P1N2/1P2PPPP/RNBQKB1R w KQkq - +Sicilian: Najdorf, Opo\v censky variation * +r1bqk2r/ppp1bppp/2n5/3np3/8/P2PPN2/1P3PPP/RNBQKB1R b KQkq - +Sicilian: Scheveningen (Paulsen), classical variation * +r1bqk2r/ppp1bppp/2n5/3p4/2PPn3/3B1N2/PP3PPP/RNBQ1RK1 b kq - +Petrov: classical attack, Jaenisch variation +r1bqk2r/ppp1bppp/2n5/3p4/3Pn3/3B1N2/PPP2PPP/RNBQR1K1 b kq - +Petrov: classical attack, Chigorin variation +r1bqk2r/ppp1bppp/2n5/4p3/4P3/2nP1N2/PP3PPP/R1BQKB1R w KQkq - +Sicilian: Boleslavsky, Louma variation * +r1bqk2r/ppp1npbp/2np2p1/4p3/2P1P3/2NP2P1/PP3PBP/R1BQK1NR b KQkq - +Sicilian: closed, 6.Ne2 e5 (Botvinnik) * +r1bqk2r/ppp1nppp/1b1p4/n2P4/2B1P3/5N2/PB3PPP/RN1Q1RK1 w kq - +Evans gambit: Paulsen variation +r1bqk2r/ppp1nppp/3p1b2/3P4/2B1R1P1/5N2/PP3P1P/R1BQ2K1 b kq - +Giuoco Piano: M\"oller, bayonet attack +r1bqk2r/ppp2pbp/2np2pn/4p3/2P5/2N1P1P1/PP1PNPBP/R1BQK2R w KQkq - +English: closed, Taimanov variation +r1bqk2r/ppp2pp1/5n1p/2bP4/2P1p3/8/PPPNQPPP/RNB1K2R b KQkq - +two knights defense: Yankovich variation +r1bqk2r/ppp2ppp/1bn5/3np3/1P6/P2PPN2/5PPP/RNBQKB1R b KQkq - +Sicilian: Sozin with ...a6 and ...b5 * +r1bqk2r/ppp2ppp/2n1pn2/3p4/2PP4/P1Q5/1P2PPPP/R1B1KBNR w KQkq - +Nimzo-Indian: classical, Botvinnik variation +r1bqk2r/ppp2ppp/2n2n2/2bpP3/2Bp4/2P2N2/PP3PPP/RNBQK2R w KQkq d6 +Giuoco Piano +r1bqk2r/ppp2ppp/2n2n2/2bpp3/4P3/2PP4/PP1N1PPP/R1BQKBNR w KQkq - +Philidor: Hanham, Schlechter variation * +r1bqk2r/ppp2ppp/2n2n2/3pp3/4P3/2bP1N2/PPPB1PPP/R2QKB1R w KQkq - +Ruy Lopez: old Steinitz defense, Nimzovich attack * +r1bqk2r/ppp2ppp/2n5/1B1pP3/1b1Pn3/5N2/PP3PPP/RNBQK2R w KQkq - +Giuoco Piano: Anderssen variation +r1bqk2r/ppp2ppp/2n5/2b5/4p3/2PP1NP1/P3PP1P/R1BQKB1R w KQkq - +Sicilian: Magnus Smith trap * +r1bqk2r/ppp2ppp/2n5/2bnp3/8/1QNP1N2/PP2PPPP/R1B1KB1R b KQkq - +Sicilian: Sozin, Benk\"o variation * +r1bqk2r/ppp2ppp/2n5/2bnp3/8/2NP1N2/PP2PPPP/R1BQKB1R w KQkq - +Sicilian: Sozin, not Scheveningen * +r1bqk2r/ppp2ppp/2n5/2bnp3/8/2NPPN2/PP3PPP/R1BQKB1R b KQkq - +Sicilian: Sozin, Leonhardt variation * +r1bqk2r/ppp2ppp/2n5/2bnp3/8/3PPN2/PP3PPP/RNBQKB1R w KQkq - +Sicilian: Sozin attack * +r1bqk2r/ppp2ppp/2n5/2bnp3/8/P2P1N2/1P2PPPP/RNBQKB1R w KQkq - +Sicilian: Najdorf, Lipnitzky attack * +r1bqk2r/ppp2ppp/2n5/3np1N1/1bBP4/8/PPP2PPP/RNBQK2R w KQkq - +two knights defense: Pincus variation +r1bqk2r/ppp2ppp/2n5/3np3/1b2P3/3P1N2/PP3PPP/RNBQKB1R w KQkq - +Sicilian: Venice attack * +r1bqk2r/ppp2ppp/2n5/3np3/1b6/3PPN2/PP3PPP/RNBQKB1R w KQkq - +Sicilian: Scheveningen, Vitoli\'n\'s variation * +r1bqk2r/ppp2ppp/2n5/3p4/2BP4/1Qb2N2/P4PPP/R1B2RK1 w kq - +Giuoco Piano: Bernstein variation +r1bqk2r/ppp2ppp/2n5/3p4/2BPn3/B1P2N2/P4PPP/R2Q1RK1 b kq - +Giuoco Piano: Steinitz variation +r1bqk2r/ppp2ppp/2n5/3pp3/2PPn3/P3P3/1PQ2PPP/R1B1KBNR w KQkq - +Nimzo-Indian: classical, San Remo variation +r1bqk2r/ppp2ppp/2n5/3pp3/4P1n1/3P1N2/PPPNBbPP/R1BQ1RK1 w kq - +Philidor: Nimzovich, L\"arobok variation * +r1bqk2r/ppp2ppp/2nb4/1B1np3/4P3/5N2/PP1P1PPP/RNBQK2R b KQkq - +Sicilian: Pin, Jaffe variation * +r1bqk2r/ppp2ppp/2np1n2/2b1p1B1/2B1P3/2NP1N2/PPP2PPP/R2QK2R b KQkq - +Giuoco Pianissimo: Canal variation +r1bqk2r/ppp2ppp/2np1n2/2b1p3/2B1P3/2N2N2/PPPP1PPP/R1BQK2R w KQkq - +Giuoco Pianissimo: Italian four knights variation * +r1bqk2r/ppp2ppp/2np1n2/4p3/4P3/P1P2P2/1PP3PP/R1BQKBNR w KQkq - +Ruy Lopez: exchange, Romanovsky variation * +r1bqk2r/ppp2ppp/2nppn2/8/1bPP4/2N2N2/PPQ1PPPP/R1B1KB1R w KQkq - +Nimzo-Indian: classical, Milner-Barry (Zurich) variation +r1bqk2r/ppp2ppp/3p1n2/4p1B1/2BnP3/8/PPP2PPP/RN1Q1RK1 w kq - +Giuoco piano +r1bqk2r/ppp3p1/2n5/2bppPPp/4n2P/7B/PPPP1P1R/RNBQK1N1 w Qkq - +KGA: Kieseritsky, long whip defense, Jaenisch variation * +r1bqk2r/ppp3pp/2nb1n2/3ppp2/8/3P1NP1/PPP1PPBP/RNBQ1RK1 w kq - +Pirc: Austrian attack, 6.Bd3 * +r1bqk2r/pppn1ppp/4pn2/3p2B1/1bPP4/2N1P3/PP3PPP/R2QKBNR w KQkq - +QGD: Manhattan variation +r1bqk2r/pppn1ppp/5n2/2bP4/8/4P3/PP3PPP/RNBQKBNR b KQkq - +French: Tarrasch, Eliskases variation * +r1bqk2r/pppnbppp/3p1n2/4p3/3P4/2N1PN2/PPP2PPP/R1BQKB1R w KQkq - +French: Reversed Philidor formation * +r1bqk2r/pppnbppp/3p1n2/4p3/3PP3/2N2N2/PPP2PPP/R1BQKB1R w KQkq - +Inverted Hanham * +r1bqk2r/pppp1p2/5n1p/4p1p1/2BnPP1B/8/PPP3PP/RN1Q1RK1 b kq - +Giuoco piano: Rosentreter variation +r1bqk2r/pppp1pbp/2n3pn/4p3/2P5/2N3P1/PP1PPPBP/1RBQK1NR w Kkq - +English: closed, 5.Rb1 Taimanov variation +r1bqk2r/pppp1pp1/5n1p/4n3/2PN3B/2P5/P3PPPP/R2QKB1R w KQkq - +English: Nenarokov variation +r1bqk2r/pppp1ppp/1b5n/nP2N3/2B1P3/8/P1PP1PPP/RNBQK2R w KQkq - +Evans gambit declined, Lange variation +r1bqk2r/pppp1ppp/2n1pn2/8/1bPP4/2N1P3/PP3PPP/R1BQKBNR w KQkq - +Nimzo-Indian: 4.e3, Taimanov variation +r1bqk2r/pppp1ppp/2n1pn2/8/1bPP4/2N5/PPQ1PPPP/R1B1KBNR w KQkq - +Nimzo-Indian: classical, 4...Nc6 +r1bqk2r/pppp1ppp/2n2n2/1B2p3/1b2P3/2N2N2/PPPP1PPP/R1BQK2R b KQkq - +Four knights: double Ruy Lopez * +r1bqk2r/pppp1ppp/2n2n2/1B2p3/1b2P3/2N2N2/PPPP1PPP/R1BQK2R w KQkq - +Four knights: double Ruy Lopez +r1bqk2r/pppp1ppp/2n2n2/1Bb1p3/4P3/2N2N2/PPPP1PPP/R1BQK2R w KQkq - +Four knights: Spanish, classical defense +r1bqk2r/pppp1ppp/2n2n2/1Bb1p3/4P3/3PBN2/PPP2PPP/RN1QK2R b KQkq - +Ruy Lopez: Berlin defense, Kaufmann variation +r1bqk2r/pppp1ppp/2n2n2/1Bb1p3/4P3/5N2/PPPP1PPP/RNBQ1RK1 w kq - +Ruy Lopez: Berlin defense, Beverwijk variation +r1bqk2r/pppp1ppp/2n2n2/2b1N3/3PP3/8/PPP2PPP/RNBQKB1R b KQkq - +Boden-Kieseritsky gambit: Lichtenhein defense * +r1bqk2r/pppp1ppp/2n2n2/2b1N3/4P3/8/PPPP1PPP/RNBQKB1R w KQkq - +Boden-Kieseritsky gambit * +r1bqk2r/pppp1ppp/2n2n2/2b1P3/2Bp4/5N2/PPP2PPP/RNBQ1RK1 b kq - +two knights: Max Lange attack +r1bqk2r/pppp1ppp/2n2n2/2b1p1N1/2B1P3/8/PPPP1PPP/RNBQK2R w KQkq - +two knights defense: Wilkes Barre (Traxler) variation +r1bqk2r/pppp1ppp/2n2n2/2b1p3/1PB1P3/2P2N2/P2P1PPP/RNBQK2R b KQkq - +Giuoco Piano: Bird's attack +r1bqk2r/pppp1ppp/2n2n2/2b1p3/2B1P3/2N2N2/PPPP1PPP/R1BQK2R b KQkq - +Giuoco Piano: four knights variation * +r1bqk2r/pppp1ppp/2n2n2/2b1p3/2B1P3/2N2N2/PPPP1PPP/R1BQK2R w KQkq - +Giuoco Piano: four knights variation +r1bqk2r/pppp1ppp/2n2n2/2b1p3/2B1P3/2NP1N2/PPP2PPP/R1BQK2R b KQkq - +Giuoco Pianissimo: Italian four knights variation +r1bqk2r/pppp1ppp/2n2n2/2b1p3/2B1P3/2P2N2/PP1P1PPP/RNBQK2R w KQkq - +Giuoco Piano +r1bqk2r/pppp1ppp/2n2n2/2b1p3/2B1P3/3P1N2/PPP2PPP/RNBQK2R w KQkq - +Giuoco Pianissimo +r1bqk2r/pppp1ppp/2n2n2/2b1p3/2B1PP2/2P5/PP1PQ1PP/RNB1K1NR b KQkq - +Bishop's opening: Lopez gambit +r1bqk2r/pppp1ppp/2n2n2/2b1p3/2BPP3/2P2N2/PP3PPP/RNBQK2R b KQkq - +Giuoco Piano +r1bqk2r/pppp1ppp/2n2n2/2b1p3/4P3/2N2N2/PPPP1PPP/R1BQKB1R w KQkq - +Four knights: Italian variation * +r1bqk2r/pppp1ppp/2n2n2/2b5/2BPP3/5N2/PP3PPP/RNBQK2R b KQkq - +Giuoco Piano +r1bqk2r/pppp1ppp/2n2n2/3Np3/1b2P3/5N2/PPPP1PPP/R1BQKB1R b KQkq - +Four knights: Rubinstein counter-gambit * +r1bqk2r/pppp1ppp/2n2n2/3Np3/1b2P3/5N2/PPPP1PPP/R1BQKB1R w KQkq - +Three knights: Schlechter variation +r1bqk2r/pppp1ppp/2n2n2/4N3/1b1PP3/2N5/PPP2PPP/R1BQKB1R b KQkq - +Four knights: Scotch, Krause variation +r1bqk2r/pppp1ppp/2n2n2/4p3/1b2P3/2N2N2/PPPP1PPP/R1BQKB1R w KQkq - +Four knights: Spanish variation * +r1bqk2r/pppp1ppp/2n2n2/4p3/1b2P3/2N3P1/PPPPNP1P/R1BQKB1R b KQkq - +Ruy Lopez: Cozio defense, Paulsen variation * +r1bqk2r/pppp1ppp/2n2n2/4p3/1b2PP2/2N5/PPPP2PP/R1BQKBNR w KQkq - +Ruy Lopez: Schliemann defense, Berger variation * +r1bqk2r/pppp1ppp/2n2n2/4p3/1bB1P3/2N2N2/PPPP1PPP/R1BQK2R b KQkq - +Four knights: Spanish, classical defense * +r1bqk2r/pppp1ppp/2n2n2/4p3/2P5/2b1PN2/PPQP1PPP/R1B1KB1R w KQkq - +English: four knights, Romanishin variation +r1bqk2r/pppp1ppp/2n2n2/4p3/4P3/P1P5/1PP2PPP/R1BQKBNR w KQkq - +Ruy Lopez: exchange, Keres variation * +r1bqk2r/pppp1ppp/2n2n2/4p3/4P3/P1b2N2/1PPP1PPP/R1BQKB1R w KQkq - +Four knights: Ranken variation * +r1bqk2r/pppp1ppp/2n2n2/8/1bB1P3/2N2N2/PP3PPP/R1BQK2R w KQkq - +Scotch: G\"oring gambit, Bardeleben variation +r1bqk2r/pppp1ppp/2n2n2/8/1bBPP3/2N2N2/PP3PPP/R1BQK2R b KQkq - +Giuoco Piano: Greco's attack +r1bqk2r/pppp1ppp/2n2n2/8/1bBPP3/5N2/PP3PPP/RNBQ1K1R b kq - +Giuoco Piano: Cracow variation +r1bqk2r/pppp1ppp/2n2n2/b3p3/4P3/P1N2N2/1PPP1PPP/R1BQKB1R w KQkq - +Ruy Lopez: four knights (Tarrasch) variation * +r1bqk2r/pppp1ppp/2n2n2/b3p3/4P3/P1NP4/1PP2PPP/R1BQKBNR w KQkq - +Ruy Lopez: modern Steinitz defense, Three knights variation * +r1bqk2r/pppp1ppp/2n4n/2b3NQ/2BpP3/8/PPP2PPP/RNB1K2R b KQkq - +Scotch gambit: Vitzhum attack +r1bqk2r/pppp1ppp/2n5/2b1P3/2Bp2n1/2P2N2/PP3PPP/RNBQ1RK1 b kq - +two knights: Max Lange attack, Krause variation +r1bqk2r/pppp1ppp/2n5/2b1P3/2Bp2n1/5N2/PPP2PPP/RNBQ1RK1 w kq - +two knights: Max Lange attack, Steinitz variation +r1bqk2r/pppp1ppp/2n5/2bBP3/8/2p2NK1/PP4PP/RNBQ3R b kq - +Giuoco Piano: Ghulam Kassim variation +r1bqk2r/pppp1ppp/2n5/2bPp3/4n3/2P2N2/PP3PPP/RNBQKB1R w KQkq - +Ponziani: Fraser defense +r1bqk2r/pppp1ppp/2n5/3P4/2B1n3/2b2N2/PP3PPP/R1BQ1RK1 b kq - +Giuoco Piano: M\"oller (Therkatz) attack +r1bqk2r/pppp1ppp/2n5/3np3/1b2P3/5N2/PPPP1PPP/R1BQKB1R w KQkq - +Four knights: Rubinstein counter-gambit, exchange variation * +r1bqk2r/pppp1ppp/2n5/8/1bBP4/2n2N2/PP3PPP/R1BQ1RK1 w kq - +Giuoco Piano: Greco variation +r1bqk2r/pppp1ppp/2n5/8/2BP4/B1b2N2/P4PPP/R2Q1RK1 b kq - +Giuoco Piano: Aitken variation +r1bqk2r/pppp1ppp/2n5/8/2BPn3/2b2N2/PP3PPP/R1BQ1RK1 w kq - +Giuoco Piano +r1bqk2r/pppp2pp/2n2n2/1Bb1pQ2/4P3/8/PPPP1PPP/RNB1K1NR w KQkq - +KGD: Norwalde variation, B\"ucker gambit * +r1bqk2r/pppp2pp/2n2n2/2b1p3/2P2p2/2N1P1P1/PP1P1PBP/R1BQK1NR w KQkq - +Sicilian: Grand Prix attack, Schofman variation * +r1bqk2r/pppp2pp/2n2n2/2b1pPP1/8/8/PPPP1P1P/RNBQKBNR w KQkq - +KGA: MacDonnell gambit * +r1bqk2r/pppp2pp/2n5/3Npp2/1b2n3/5N2/PPPPQPPP/R1B1KB1R w KQkq - +Four knights: Rubinstein counter-gambit, Bogolyubov variation * +r1bqk2r/ppppbppp/2n2n2/3Np3/4P3/5N2/PPPP1PPP/R1BQKB1R w KQkq - +Four knights: Rubinstein counter-gambit, 5.Be2 * +r1bqk2r/ppppbppp/2n5/1B2P3/4n3/5N2/PPP2PPP/RNBQ1RK1 b kq - +Ruy Lopez: Berlin defense, Minckwitz variation +r1bqk2r/ppppbppp/2n5/1B2p3/3Pn3/5N2/PPP2PPP/RNBQ1RK1 w kq - +Ruy Lopez: open Berlin defense, 5...Be7 +r1bqk2r/ppppbppp/2n5/4P3/2Bpn3/2P2N2/PP3PPP/RNBQK2R w KQkq - +Hungarian defense: Tartakower variation +r1bqk2r/ppppbppp/2nn4/4N2Q/8/1BN5/PPPP1PPP/R1B1K2R b KQkq - +Vienna: Alekhine variation +r1bqk3/ppp3p1/2n5/2bppP2/4n1P1/2PP4/PP3P2/RNBQK1NB w KQq - +KGA: Greco gambit * +r1bqkb1r/1p1n1ppp/p2ppn2/8/3NP3/2N5/PPP1BPPP/R1BQ1RK1 w kq - +Sicilian: Scheveningen, classical, Nd7 system +r1bqkb1r/1p1ppppp/p1n2n2/2p5/4P3/2N2N2/PPPP1PPP/R1BQKB1R w KQkq - +English: four knights, Marini variation * +r1bqkb1r/1p2nppp/p1n1p3/2pp4/3P4/3BPN2/PPP2PPP/RNBQ1RK1 b kq - +Nimzo-Indian: Simagin variation * +r1bqkb1r/1p2pp1p/2n3p1/p1np4/4PB2/2P2N2/PPQN1PPP/R3KB1R b KQkq - +QGD Slav: Carlsbad variation * +r1bqkb1r/1p2pppp/2n2n2/p1Pp2B1/8/2P2N2/PP2PPPP/RN1QKB1R b KQkq - +QGD Slav: Steiner variation * +r1bqkb1r/1p2pppp/2n2n2/p1Pp4/5B2/2P2N2/PP2PPPP/RN1QKB1R b KQkq - +QGD Slav: Czech defense * +r1bqkb1r/1p2pppp/2n2n2/p1Pp4/8/2P1PN2/PP3PPP/RNBQKB1R b KQkq - +QGD Slav: Soultanb\'eieff variation * +r1bqkb1r/1p2pppp/2n2n2/p1Pp4/8/2P2N2/PP2PPPP/RNBQKB1R w KQkq - +QGD Slav accepted: Alapin variation * +r1bqkb1r/1p2pppp/2n5/p1Pp4/4nB2/2P1PN2/PP3PPP/RN1QKB1R b KQkq - +QGD Slav: Wiesbaden variation * +r1bqkb1r/1p2pppp/2n5/p1Pp4/4nB2/2P2N2/PP2PPPP/RN1QKB1R w KQkq - +QGD Slav: Krause attack * +r1bqkb1r/1p3ppp/2n1pn2/p1Pp4/5B2/2P2N2/PP2PPPP/RN1QKB1R w KQkq - +QGD Slav: Dutch variation * +r1bqkb1r/1p3ppp/2n1pn2/p1Pp4/5B2/N1P2N2/PP2PPPP/R2QKB1R b KQkq - +QGD Slav: Dutch, Lasker variation * +r1bqkb1r/1p3ppp/2n2n2/p1Ppp1B1/8/N1P2N2/PP2PPPP/R2QKB1R b KQkq - +QGD Slav: Smyslov variation * +r1bqkb1r/1p3ppp/p1n1pn2/3p4/2P1P3/N1N5/PP3PPP/R1BQKB1R w KQkq - +Sicilian, Sz\'en variation, Dely-Kasparov gambit +r1bqkb1r/1p3ppp/p1nppn2/6B1/3NP3/2N5/PPPQ1PPP/R3KB1R w KQkq - +Sicilian: Richter-Rauzer, Rauzer attack, 7...a6 +r1bqkb1r/1pp1nppp/p1B5/3pP3/8/4P3/PPP2PPP/RNBQK1NR b KQkq - +French: Winawer, Alekhine gambit * +r1bqkb1r/1pp2ppp/2P2n2/1p6/3Pp3/4P3/PP3PPP/RNBQK1NR w KQkq - +French: Winawer, advance, Rauzer variation * +r1bqkb1r/1pp2ppp/p1n5/3pP3/8/2N1P3/PPP2PPP/R1BQK1NR b KQkq - +French: Winawer, Alekhine gambit, Kan variation * +r1bqkb1r/1pp2ppp/p1np1n2/4p3/B1P1P3/3P1N2/PP3PPP/RNBQK2R b KQkq - +Ruy Lopez: Morphy defense, Duras variation +r1bqkb1r/1pp2ppp/p1np1n2/4p3/B3P3/5N2/PPPP1PPP/RNBQ1RK1 w kq - +Ruy Lopez: Steinitz defense deferred (Russian defense) +r1bqkb1r/1ppn1ppp/p3pn2/8/3P4/6P1/PPQ1PPBP/RNB1K1NR b KQkq - +Catalan: open, Alekhine variation +r1bqkb1r/1ppp1ppp/p1B2n2/4p3/4P3/2N2N2/PPPP1PPP/R1BQK2R b KQkq - +Four knights: Ranken variation +r1bqkb1r/1ppp1ppp/p1B2n2/4p3/4P3/5N2/PPPP1PPP/RNBQK2R b KQkq - +Ruy Lopez: Treybal (Bayreuth) variation (exchange var. deferred) +r1bqkb1r/1ppp1ppp/p1n2n2/4p3/4P3/2N2N2/PPPP1PPP/R1BQKB1R w KQkq - +Four knights: Gunsberg variation * +r1bqkb1r/1ppp1ppp/p1n2n2/4p3/B3P3/2N2N2/PPPP1PPP/R1BQK2R b KQkq - +Ruy Lopez: four knights (Tarrasch) variation +r1bqkb1r/1ppp1ppp/p1n2n2/4p3/B3P3/3P1N2/PPP2PPP/RNBQK2R b KQkq - +Ruy Lopez: Anderssen variation +r1bqkb1r/1ppp1ppp/p1n2n2/4p3/B3P3/5N2/PPPP1PPP/RNBQ1RK1 b kq - +Ruy Lopez: 5.O-O +r1bqkb1r/1ppp1ppp/p1n2n2/4p3/B3P3/5N2/PPPP1PPP/RNBQK2R w KQkq - +Ruy Lopez: Morphy defense +r1bqkb1r/1ppp1ppp/p1n2n2/4p3/B3P3/5N2/PPPPQPPP/RNB1K2R b KQkq - +Ruy Lopez: Wormald (Alapin) attack +r1bqkb1r/1ppp1ppp/p1n5/1B2p3/3Pn3/5N2/PPP2PPP/RNBQ1RK1 w kq - +Ruy Lopez: Berlin defense, Rosenthal variation +r1bqkb1r/1ppp1ppp/p1n5/4p3/B2Pn3/5N2/PPP2PPP/RNBQ1RK1 b kq - +Ruy Lopez: open, 6.d4 +r1bqkb1r/1ppp1ppp/p1n5/4p3/B3n3/2N2N2/PPPP1PPP/R1BQ1RK1 b kq - +Ruy Lopez: open, Knorre variation +r1bqkb1r/1ppp1ppp/p1n5/4p3/B3n3/5N2/PPPP1PPP/RNBQ1RK1 w kq - +Ruy Lopez: open (Tarrasch) defense +r1bqkb1r/1ppp1ppp/p1n5/4p3/B3n3/5N2/PPPPQPPP/RNB2RK1 b kq - +Ruy Lopez: open, Tartakower variation +r1bqkb1r/1ppp1ppp/p1n5/8/B2pn3/5N2/PPP2PPP/RNBQ1RK1 w kq - +Ruy Lopez: open, Riga variation +r1bqkb1r/1pppnppp/p1n5/4p3/B3P3/5N2/PPPP1PPP/RNBQK2R w KQkq - +Ruy Lopez: Cozio defense deferred +r1bqkb1r/2p1nppp/p7/1p1pP3/4n3/1B3N2/PPP2PPP/RNBQ1RK1 w kq - +Ruy Lopez: open, Zukertort variation +r1bqkb1r/2p2ppp/p1n5/1p1pP3/4n3/1B3N2/PPP2PPP/RNBQ1RK1 b kq - +Ruy Lopez: open, 8.de +r1bqkb1r/2p2ppp/p1n5/1p1pp3/2PPn3/1B3N2/PP3PPP/RNBQ1RK1 b kq - +Ruy Lopez: open, Harksen gambit +r1bqkb1r/2p2ppp/p1np1n2/1p2p3/4P3/1B3N2/PPPP1PPP/RNBQ1RK1 w kq - +Ruy Lopez: ...b5 & ...d6 +r1bqkb1r/2p2ppp/p1p2n2/3p4/2PPp3/4P3/PP2NPPP/RNBQK2R w KQkq - +French: Winawer, advance, positional main line * +r1bqkb1r/2p2ppp/p1pp4/4p3/3Pn3/5N2/PPP2PPP/RNBQ1RK1 w kq - +Ruy Lopez: Steinitz defense deferred, Rubinstein variation +r1bqkb1r/2p2ppp/p7/1p1p4/P2pn3/1BN5/1PP2PPP/R1BQ1RK1 b kq - +Ruy Lopez: open, Berger variation +r1bqkb1r/2p2ppp/p7/1p1pp3/P2nn3/1B3N2/1PP2PPP/RNBQ1RK1 w kq - +Ruy Lopez: open, Schlechter defense +r1bqkb1r/2p3pp/p1p5/3pPp2/4n3/2N2N2/PPP2PPP/R1BQR1K1 b kq - +Ruy Lopez: Steinitz defense deferred, Boleslavsky variation +r1bqkb1r/2pp1ppp/p1n5/1p1Pp3/B3n3/5N2/PPP2PPP/RNBQ1RK1 b kq - +Ruy Lopez: open, Richter variation +r1bqkb1r/2pp1ppp/p1n5/1p2N3/B2Pn3/8/PPP2PPP/RNBQ1RK1 b kq - +Ruy Lopez: open, Friess attack +r1bqkb1r/2pp1ppp/p1n5/1p2p3/3Pn3/1B3N2/PPP2PPP/RNBQ1RK1 b kq - +Ruy Lopez: open, 7.Bb3 +r1bqkb1r/2pp1ppp/p1n5/1p2p3/B2Pn3/5N2/PPP2PPP/RNBQ1RK1 w kq - +Ruy Lopez: open, 6.d4 b5 +r1bqkb1r/3n1ppp/p1p1pn2/1p6/3P4/2NBPN2/PP3PPP/R1BQK2R w KQkq - +QGD semi-Slav: Meran, 8...a6 +r1bqkb1r/3n1ppp/p1p1pn2/8/1p1PP3/2NB1N2/PP3PPP/R1BQK2R w KQkq - +QGD semi-Slav: Meran, Pir\'c variation +r1bqkb1r/3n1ppp/p3p3/1N2P3/3p2n1/3B1N2/PP3PPP/R1BQK2R w KQkq - +QGD semi-Slav: Meran, Rabinovich variation +r1bqkb1r/3n1ppp/p3pn2/1N2P3/3p4/3B1N2/PP3PPP/R1BQK2R b KQkq - +QGD semi-Slav: Meran, Blumenfeld variation +r1bqkb1r/3n1ppp/p3pn2/1pp1P3/3P4/2NB1N2/PP3PPP/R1BQK2R b KQkq - +QGD semi-Slav: Meran, old main line +r1bqkb1r/3n1ppp/p3pn2/1pp5/3PP3/2NB1N2/PP3PPP/R1BQK2R w KQkq - +QGD semi-Slav: Meran +r1bqkb1r/3n1ppp/p3pn2/1ppP4/4P3/2NB1N2/PP3PPP/R1BQK2R b KQkq - +QGD semi-Slav: Meran, Reynolds' variation +r1bqkb1r/5p1p/p1np4/1p1Npp2/4P3/N7/PPP2PPP/R2QKB1R w KQkq - +Sicilian: Sveshnikov variation +r1bqkb1r/5ppp/4pn2/1p2N3/3p4/3B1Q2/PP3PPP/R1B1K2R b KQkq - +QGD semi-Slav: Meran, Stahlberg variation +r1bqkb1r/5ppp/4pn2/1p2N3/3p4/3B4/PP3PPP/R1BQ1RK1 b kq - +QGD semi-Slav: Meran, Sozin variation +r1bqkb1r/5ppp/p1np1n2/1p2p1B1/4P3/N1N5/PPP2PPP/R2QKB1R w KQkq - +Sicilian: Pelikan, Chelyabinsk variation +r1bqkb1r/5ppp/p3pn2/1N2n3/3p4/3B1N2/PP3PPP/R1BQK2R w KQkq - +QGD semi-Slav: Meran, Sozin variation +r1bqkb1r/p1p2ppp/2n2n2/1p1Pp1N1/2B5/8/PPPP1PPP/RNBQK2R w KQkq - +two knights defense: Ulvestad variation +r1bqkb1r/p1p2ppp/8/1p1np3/3nN3/2P5/PP1P1PPP/RNBQKB1R b KQkq - +two knights defense: Fritz, Gruber variation +r1bqkb1r/p1pn1ppp/1p2pn2/3p4/2PP4/4PN2/PP3PPP/RNBQKB1R w KQkq - +Queen's pawn game, Zukertort variation * +r1bqkb1r/p1pp1ppp/2p2n2/4P3/8/8/PPP2PPP/RNBQKB1R b KQkq - +Scotch: Mieses variation +r1bqkb1r/p1pp1ppp/2p2n2/8/4P3/8/PPPN1PPP/R1BQKB1R b KQkq - +Scotch: Tartakower variation +r1bqkb1r/p2n1p2/2p1pn2/1p2P1B1/2pP4/2N2Q2/PP3PPP/R3KB1R b KQkq - +QGD semi-Slav: anti-Meran, Szab\'o variation +r1bqkb1r/p2n1p2/2p1pn2/1p2P1B1/2pP4/2N3P1/PP3P1P/R2QKB1R b KQkq - +QGD semi-Slav: anti-Meran, Lilienthal variation +r1bqkb1r/p2n1ppp/2p1pn2/1p6/2BP4/2N1PN2/PP3PPP/R1BQK2R w KQkq - +QGD semi-Slav: Meran variation +r1bqkb1r/p2n1ppp/2p1pn2/8/1p1P4/2NBPN2/PP3PPP/R1BQK2R w KQkq - +QGD semi-Slav: neo-Meran (Lundin variation) +r1bqkb1r/p3pp1p/2pp1np1/4P3/2B5/2N5/PPP2PPP/R1BQK2R b KQkq - +Sicilian: Magnus Smith trap +r1bqkb1r/p4pp1/2p2n1p/n3p1N1/8/8/PPPPBPPP/RNBQK2R w KQkq - +Two knights defense +r1bqkb1r/p4pp1/2p2n1p/n3p3/8/7N/PPPPBPPP/RNBQK2R b KQkq - +two knights defense: Steinitz variation +r1bqkb1r/p4ppp/2n1pn2/1ppp4/3P4/5NP1/PPP1PPBP/RNBQ1RK1 w kq - +Gr\"unfeld: Makogonov variation * +r1bqkb1r/p4ppp/2p2n2/3pp3/8/6P1/PPP1PPBP/RNBQK2R w KQkq - +Gr\"unfeld: modern exchange variation * +r1bqkb1r/p4ppp/2p2n2/n3p1N1/8/8/PPPPBPPP/RNBQK2R b KQkq - +Two knights defense +r1bqkb1r/p4ppp/2p2n2/nB2p1N1/8/5Q2/PPPP1PPP/RNB1K2R b KQkq - +two knights defense: Bogolyubov variation +r1bqkb1r/p4ppp/5n2/np2p1N1/8/5Q2/PPPP1PPP/RNB1K2R w KQkq - +two knights defense: Blackburne variation +r1bqkb1r/pp1n1ppp/2n1p3/2PpP3/5P2/2N5/PPP3PP/R1BQKBNR w KQkq - +French: Steinitz variation +r1bqkb1r/pp1n1ppp/2n1p3/2ppP3/3P1P2/2N1BN2/PPP3PP/R2QKB1R b KQkq - +French: Steinitz, Boleslavsky variation +r1bqkb1r/pp1n1ppp/2n1p3/2ppP3/3P4/2PB4/PP1N1PPP/R1BQK1NR w KQkq - +French: Tarrasch, closed variation +r1bqkb1r/pp1n1ppp/2n1p3/3pP3/3P4/3B4/PP1NNPPP/R1BQK2R b KQkq - +French: Tarrasch, closed variation, main line +r1bqkb1r/pp1n1ppp/2p1pn2/3p2B1/2PP4/2N1P3/PP3PPP/R2QKBNR w KQkq - +QGD: 5...c6 +r1bqkb1r/pp1n1ppp/2p1pn2/3p2B1/2PP4/2N1PN2/PP3PPP/R2QKB1R b KQkq - +QGD +r1bqkb1r/pp1n1ppp/2p1pn2/3p2B1/2PP4/4PN2/PP1N1PPP/R2QKB1R b KQkq - +QGD: Capablanca variation +r1bqkb1r/pp1n1ppp/2p1pn2/3p2B1/2PP4/P1N1P3/1P3PPP/R2QKBNR b KQkq - +QGD: Capablanca anti-Cambridge Springs variation +r1bqkb1r/pp1n1ppp/2p1pn2/3p2B1/2PPP3/2N2N2/PP3PPP/R2QKB1R b KQkq - +QGD: Alekhine variation +r1bqkb1r/pp1n1ppp/2p1pn2/3p4/2PP4/2N1PN2/PP3PPP/R1BQKB1R w KQkq - +QGD semi-Slav: 5...Nd7 +r1bqkb1r/pp1n1ppp/2p1pn2/3p4/2PP4/2N1PN2/PPQ2PPP/R1B1KB1R b KQkq - +QGD semi-Slav: Stoltz variation +r1bqkb1r/pp1n1ppp/2p1pn2/3p4/2PP4/2NBPN2/PP3PPP/R1BQK2R b KQkq - +QGD semi-Slav: 6.Bd3 +r1bqkb1r/pp1n1ppp/2p1pn2/3p4/2PP4/4PN2/PP1N1PPP/R1BQKB1R w KQkq - +QGD Slav +r1bqkb1r/pp1n1ppp/2p1pn2/3pN3/2PP4/2N1P3/PP3PPP/R1BQKB1R b KQkq - +QGD semi-Slav: Rubinstein (anti-Meran) system +r1bqkb1r/pp1n1ppp/2p1pn2/8/2BP4/2N1PN2/PP3PPP/R1BQK2R b KQkq - +QGD semi-Slav: 7.Bc4 +r1bqkb1r/pp1n1ppp/4pn2/2pp4/2PP4/3BPN2/PP1N1PPP/R1BQK2R w KQkq - +QGD Slav: Semmering variation +r1bqkb1r/pp1n1ppp/4pn2/2pp4/3P4/2P1PN2/PP1N1PPP/R1BQKB1R b KQkq - +QGD Slav * +r1bqkb1r/pp1n1ppp/4pn2/2pp4/3P4/2P1PN2/PP3PPP/RNBQKB1R w KQkq - +QGD Slav * +r1bqkb1r/pp1n1ppp/4pn2/2pp4/3P4/2P1PNP1/PP3P1P/RNBQKB1R b KQkq - +QGD: Spielmann variation * +r1bqkb1r/pp1npp1p/3p1np1/8/3NPP2/2N5/PPP3PP/R1BQKB1R w KQkq - +Sicilian: dragon, Levenfish; Flohr variation +r1bqkb1r/pp1npppp/2n5/8/2Pp4/3P1NP1/PP3P1P/RNBQKB1R w KQkq - +Benoni: Nimzovich (knight's tour) variation * +r1bqkb1r/pp1npppp/2n5/8/2Pp4/B2P1NP1/4PP1P/RN1QKB1R w KQkq - +Benk\"o gambit: Nd2 variation * +r1bqkb1r/pp1npppp/5n2/1Bpp4/8/4PN2/PPPP1PPP/RNBQK2R w KQkq - +Bogo-Indian defense, Gr\"unfeld variation * +r1bqkb1r/pp1npppp/5n2/2pP4/4p3/2N2P2/PPP3PP/R1BQKBNR b KQkq - +QGD: Albin counter-gambit, Janowski variation * +r1bqkb1r/pp1npppp/5n2/2pP4/4p3/2N5/PPP1QPPP/R1B1KBNR b KQkq - +QGD: Albin counter-gambit, Balogh variation * +r1bqkb1r/pp1npppp/5n2/2pP4/4p3/2N5/PPP2PPP/R1BQKBNR w KQkq - +QGD: Albin counter-gambit, Alapin variation * +r1bqkb1r/pp1npppp/5n2/2pp4/3P4/2P2N2/PP2PPPP/RNBQKB1R w KQkq - +QGD Slav: Breyer variation * +r1bqkb1r/pp1p1Npp/2p1nn2/8/2B1P3/8/PPP2PPP/RNBQ1RK1 b kq - +Scotch: Cochrane variation +r1bqkb1r/pp1p1ppp/2n1pn2/2p5/4P3/2N2N2/PPPP1PPP/R1BQKB1R w KQkq - +English: four knights, 4.e3 * +r1bqkb1r/pp1p1ppp/2n1pn2/8/2PN4/2N5/PP2PPPP/R1BQKB1R w KQkq - +English: symmetrical variation +r1bqkb1r/pp1p1ppp/2n2n2/2p1p3/4P3/2N2N2/PPPP1PPP/R1BQKB1R w KQkq - +English: four knights, Nimzovich variation * +r1bqkb1r/pp1p1ppp/2n2n2/4p3/3NP3/2N5/PPP2PPP/R1BQKB1R w KQkq - +Sicilian: Pelikan (Lasker/Sveshnikov) variation +r1bqkb1r/pp1p1ppp/2n5/2ppP3/3P4/5N2/PPP2PPP/R1BQKB1R w KQkq - +Sicilian: Nimzovich-Rubinstein; Rubinstein counter-gambit +r1bqkb1r/pp1p1ppp/n1p2n2/8/2PNp3/2N5/PP1PPPPP/R1BQKB1R w KQkq - +Sicilian: 2.c3, Heidenfeld variation * +r1bqkb1r/pp1pnppp/2p2n2/1B2N3/4P3/3P4/PPP2PPP/RNBQK2R w KQkq - +Ruy Lopez: Berlin defense, Mortimer trap +r1bqkb1r/pp1ppp1p/2n2np1/2p5/4P3/2N2N2/PPPP1PPP/R1BQKB1R w KQkq - +English: four knights, kingside fianchetto * +r1bqkb1r/pp1ppppp/2n2n2/1Bp5/8/4PN2/PPPP1PPP/RNBQK2R b KQkq - +English: Nimzo-English opening * +r1bqkb1r/pp1ppppp/2n2n2/2p3B1/4P3/3P4/PPP2PPP/RN1QKBNR b KQkq - +English, Smyslov defense * +r1bqkb1r/pp1ppppp/2n2n2/2p5/2P5/2N2N2/PP1PPPPP/R1BQKB1R b KQkq - +English: symmetrical, four knights system * +r1bqkb1r/pp1ppppp/2n2n2/2p5/2P5/2N2N2/PP1PPPPP/R1BQKB1R w KQkq - +English: symmetrical, four knights system +r1bqkb1r/pp1ppppp/2n2n2/2p5/4P3/2N2N2/PPPP1PPP/R1BQKB1R b KQkq - +English: four knights system * +r1bqkb1r/pp1ppppp/2n2n2/2p5/4P3/2N5/PPPP1PPP/R1BQKBNR w KQkq - +English: three knights system * +r1bqkb1r/pp1ppppp/2n2n2/2p5/4P3/3P4/PPP2PPP/RNBQKBNR w KQkq - +English opening * +r1bqkb1r/pp1ppppp/2n2n2/2p5/8/1P2PN2/P1PP1PPP/RNBQKB1R b KQkq - +English: Queens Indian formation * +r1bqkb1r/pp1ppppp/2n2n2/8/2PN4/8/PP2PPPP/RNBQKB1R b KQkq - +English: symmetrical, three knights system * +r1bqkb1r/pp1ppppp/2n2n2/8/3N4/8/PPP1PPPP/RNBQKB1R w KQkq - +English: Anglo-Gr\"unfeld defense * +r1bqkb1r/pp1ppppp/2n2n2/8/3NP3/8/PPP2PPP/RNBQKB1R w KQkq - +Sicilian defense +r1bqkb1r/pp1ppppp/2n5/2p1P3/1P4n1/5N2/P1PP1PPP/RNBQKB1R b KQkq - +English: Bellon gambit * +r1bqkb1r/pp1ppppp/2n5/2pnP3/8/N1P2N2/PP1P1PPP/R1BQKB1R b KQkq - +Sicilian: 2.c3, Heidenfeld variation +r1bqkb1r/pp2nppp/2n1p3/1Bpp4/2P5/4PN2/PP1P1PPP/RNBQK2R w KQkq - +Nimzo-Indian: 4.e3 c5, 5.Ne2 (Rubinstein, anti-H\"ubner system) * +r1bqkb1r/pp2nppp/2n1p3/1Bpp4/8/1P2PN2/P1PP1PPP/RNBQK2R w KQkq - +Nimzo-Indian: Fischer variation, 5.Ne2 * +r1bqkb1r/pp2nppp/2n1p3/1Bpp4/8/4PN2/PPPP1PPP/RNBQ1RK1 w kq - +Nimzo-Indian: Reshevsky variation * +r1bqkb1r/pp2nppp/2n1p3/1Bpp4/8/BP2PN2/P1PP1PPP/RN1QK2R b KQkq - +Nimzo-Indian: 4.e3, Bronstein (Byrne) variation * +r1bqkb1r/pp2nppp/2n5/2ppp3/8/3P1NP1/PPP1PPBP/RNBQK2R w KQkq - +King's Indian: Kramer system * +r1bqkb1r/pp2pp1p/2n2np1/2Pp4/3P4/2N5/PP3PPP/R1BQKBNR b KQkq - +QGD: Tarrasch, Folkestone (Swedish) variation * +r1bqkb1r/pp2pp1p/2n2np1/2pp4/8/3P1NP1/PPP1PPBP/RNBQK2R w KQkq - +King's Indian: fianchetto variation * +r1bqkb1r/pp2pp1p/2n2np1/3p4/2PP4/2N2N2/PP3PPP/R1BQKB1R b KQkq - +QGD: Tarrasch, Prague variation * +r1bqkb1r/pp2pp1p/2n2np1/3p4/2PP4/2N5/PP3PPP/R1BQKBNR w KQkq - +QGD: Tarrasch, Schlechter-Rubinstein system * +r1bqkb1r/pp2pp1p/2n2np1/8/2Pp4/3P1NP1/PP3P1P/RNBQKB1R w KQkq - +Benoni: fianchetto variation * +r1bqkb1r/pp2pp1p/2n2np1/8/2Pp4/B2P1NP1/4PP1P/RN1QKB1R w KQkq - +Benk\"o gambit: fianchetto variation * +r1bqkb1r/pp2pp1p/2n3p1/2pn4/8/1QN1PN2/PP1P1PPP/R1B1KB1R b KQkq - +English: symmetrical, Geller variation * +r1bqkb1r/pp2pp1p/2np1np1/6B1/3NP3/2N5/PPP2PPP/R2QKB1R w KQkq - +Sicilian: Richter-Rauzer, Bondarevsky variation +r1bqkb1r/pp2pp1p/3p1np1/8/2PQP3/2N5/PP3PPP/R1B1KB1R w KQkq - +Sicilian: accelerated fianchetto, Gurgenidze variation +r1bqkb1r/pp2pppp/2n2n2/1Bp1N3/2Pp4/4P3/PP1P1PPP/RNBQK2R b KQkq - +Nimzo-Indian: three knights, Euwe variation * +r1bqkb1r/pp2pppp/2n2n2/1Bp5/2Pp4/4PN2/PP1P1PPP/RNBQK2R w KQkq - +Nimzo-Indian: three knights, Korchnoi variation * +r1bqkb1r/pp2pppp/2n2n2/1Bpp4/3P4/4PN2/PPP2PPP/RNBQK2R b KQkq - +QGD: Ragozin variation * +r1bqkb1r/pp2pppp/2n2n2/1Bpp4/8/4PN2/PPPP1PPP/RNBQK2R w KQkq - +Nimzo-Indian: three knights variation * +r1bqkb1r/pp2pppp/2n2n2/2Pp4/8/2N5/PPP1PPPP/R1BQKBNR w KQkq - +QGD: Chigorin defense, Janowski variation * +r1bqkb1r/pp2pppp/2n2n2/2Pp4/8/2P1P3/PP3PPP/RNBQKBNR b KQkq - +QGD: semi-Slav, Noteboom variation * +r1bqkb1r/pp2pppp/2n2n2/2Pp4/8/2P2N2/PP2PPPP/RNBQKB1R b KQkq - +QGD Slav accepted * +r1bqkb1r/pp2pppp/2n2n2/2Pp4/8/5N2/PPP1PPPP/RNBQKB1R w KQkq - +QGA, 4.Nc3 * +r1bqkb1r/pp2pppp/2n2n2/2pp4/2PP4/4PN2/PP3PPP/RNBQKB1R b KQkq - +QGD: Semi-Tarrasch defense * +r1bqkb1r/pp2pppp/2n2n2/2pp4/3P4/1QP2N2/PP2PPPP/RNB1KB1R b KQkq - +QGD Slav: S\"uchting variation * +r1bqkb1r/pp2pppp/2n2n2/2pp4/3P4/2P1PN2/PP3PPP/RNBQKB1R b KQkq - +QGD semi-Slav * +r1bqkb1r/pp2pppp/2n2n2/2pp4/3P4/2P2N2/PP2PPPP/RNBQKB1R w KQkq - +QGD Slav: 4.Nc3 * +r1bqkb1r/pp2pppp/2n2n2/2pp4/3P4/2P2NP1/PP2PP1P/RNBQKB1R b KQkq - +QGD Slav\Gr\"unfeld: Schlechter variation * +r1bqkb1r/pp2pppp/2n2n2/2pp4/3P4/4PN2/PPP2PPP/RNBQKB1R w KQkq - +QGD: 4.Nf3 * +r1bqkb1r/pp2pppp/2n2n2/2pp4/3P4/5NP1/PPP1PP1P/RNBQKB1R w KQkq - +Gr\"unfeld: Three knights variation * +r1bqkb1r/pp2pppp/2n2n2/2pp4/3P4/5NP1/PPP1PPBP/RNBQK2R b KQkq - +Gr\"unfeld: Three knights variation * +r1bqkb1r/pp2pppp/2n2n2/2pp4/4P3/3P1N2/PPP2PPP/RNBQKB1R w KQkq - +Old Indian: Ukrainian variation, 4.Nf3 * +r1bqkb1r/pp2pppp/2n2n2/2pp4/8/1P2PN2/P1PP1PPP/RNBQKB1R w KQkq - +Queen's Indian: 4.Nc3 * +r1bqkb1r/pp2pppp/2n2n2/2ppP3/8/2N2N2/PPPP1PPP/R1BQKB1R b KQkq - +English: Bradley Beach variation * +r1bqkb1r/pp2pppp/2n2n2/3p4/2PP4/8/PP3PPP/RNBQKBNR w KQkq - +QGD: Tarrasch defense * +r1bqkb1r/pp2pppp/2n2n2/3p4/2Pp4/4PN2/PP3PPP/RNBQKB1R w KQkq - +QGD: Semi-Tarrasch, 5.cd * +r1bqkb1r/pp2pppp/2n2n2/3p4/3P1B2/2PB4/PP3PPP/RN1QK1NR b KQkq - +Caro-Kann: exchange, Rubinstein variation +r1bqkb1r/pp2pppp/2n2n2/8/2Pp4/3P1NP1/PP3P1P/RNBQKB1R b KQkq - +Benoni defense * +r1bqkb1r/pp2pppp/2n5/2pn4/8/2N1PN2/PP1P1PPP/R1BQKB1R b KQkq - +English: symmetrical variation * +r1bqkb1r/pp2pppp/2np1n2/2p5/4P3/2N2N2/PPPP1PPP/R1BQKB1R w KQkq - +English: four knights, Capablanca variation * +r1bqkb1r/pp2pppp/2np1n2/6B1/3NP3/2N5/PPP2PPP/R2QKB1R b KQkq - +Sicilian: Richter-Rauzer +r1bqkb1r/pp2pppp/2np1n2/8/2BNP3/2N5/PPP2PPP/R1BQK2R b KQkq - +Sicilian: Sozin, not Scheveningen +r1bqkb1r/pp2pppp/2np1n2/8/3NP3/2N5/PPP1BPPP/R1BQK2R b KQkq - +Sicilian: classical +r1bqkb1r/pp2pppp/2np1n2/8/3NP3/2N5/PPP2PPP/R1BQKB1R w KQkq - +Sicilian +r1bqkb1r/pp2pppp/5n2/n2P2B1/2p5/2N5/PP3PPP/R2QKBNR w KQkq - +Caro-Kann: Panov-Botvinnik, Herzog defense +r1bqkb1r/pp3p1p/2n2np1/2Ppp3/3P4/2N5/PP3PPP/R1BQKBNR w KQkq - +QGD: Tarrasch, Schlechter-Rubinstein system, Rey Ardid variation * +r1bqkb1r/pp3ppp/1nn1p3/3pP3/3P4/3B4/PP1NNPPP/R1BQK2R w KQkq - +French: Tarrasch, Leningrad variation +r1bqkb1r/pp3ppp/2Np1n2/4p3/4P3/2N5/PPP1BPPP/R1BQK2R b KQkq - +Sicilian: Boleslavsky, Louma variation +r1bqkb1r/pp3ppp/2Nppn2/6B1/4P3/2N5/PPP2PPP/R2QKB1R b KQkq - +Sicilian: Richter-Rauzer, Richter attack +r1bqkb1r/pp3ppp/2n1p3/2pn4/3P4/2NBPN2/PP3PPP/R1BQK2R b KQkq - +QGD: Semi-Tarrasch, 7.Bd3 +r1bqkb1r/pp3ppp/2n1p3/2pp4/3Pn3/2P1PN2/PP1N1PPP/R1BQKB1R w KQkq - +QGD semi-Slav: Rubinstein (anti-Meran) system * +r1bqkb1r/pp3ppp/2n1p3/3p4/3PnB2/4P3/PP1N1PPP/RN1QKB1R b KQkq - +QGD Slav: Amsterdam variation * +r1bqkb1r/pp3ppp/2n1pn2/1Bpp4/3P4/4PN2/PPP2PPP/RNBQ1RK1 b kq - +Nimzo-Indian: 4.e3 e8g8, 5.Nf3 d7d5 * +r1bqkb1r/pp3ppp/2n1pn2/1Bpp4/8/4PN2/PPPP1PPP/RNBQ1RK1 w kq - +Nimzo-Indian: 4.e3 e8g8, 5.Nf3, without ...d5 * +r1bqkb1r/pp3ppp/2n1pn2/2Pp4/8/2P2N2/PP2PPPP/RNBQKB1R w KQkq - +QGD Slav: 5.e3 (Alekhine variation) * +r1bqkb1r/pp3ppp/2n1pn2/2pp4/3P4/2P1PN2/PP1N1PPP/R1BQKB1R b KQkq - +QGD semi-Slav: 5...Nd7 * +r1bqkb1r/pp3ppp/2n1pn2/2pp4/3P4/2P1PN2/PP3PPP/RNBQKB1R w KQkq - +QGD semi-Slav: 5.e3 * +r1bqkb1r/pp3ppp/2n1pn2/2pp4/3P4/5NP1/PPP1PPBP/RNBQK2R w KQkq - +Gr\"unfeld: 5.e3 * +r1bqkb1r/pp3ppp/2n1pn2/2pp4/3P4/P1P1PN2/1P3PPP/RNBQKB1R b KQkq - +QGD semi-Slav: accelerated Meran (Alekhine variation) * +r1bqkb1r/pp3ppp/2n1pn2/3p2B1/2PP4/2N5/PP3PPP/R2QKBNR w KQkq - +Caro-Kann: Panov-Botvinnik, normal variation +r1bqkb1r/pp3ppp/2n1pn2/3p4/2PN4/4P3/PP3PPP/RNBQKB1R w KQkq - +QGD: Semi-Tarrasch with e3 * +r1bqkb1r/pp3ppp/2n1pn2/3p4/3P1B2/5N2/PP2PPPP/RN1QKB1R w KQkq - +QGD Slav: exchange variation * +r1bqkb1r/pp3ppp/2n2n2/1B2p3/8/2N5/PPPP1PPP/R1BQK1NR b KQkq - +Scotch: G\"oring gambit * +r1bqkb1r/pp3ppp/2n2n2/2Pp4/1P2p3/2P2N2/P3PPPP/RNBQKB1R w KQkq - +QGD Slav: Tolush-Geller gambit * +r1bqkb1r/pp3ppp/2n2n2/2Ppp3/8/2P2N2/PP2PPPP/RNBQKB1R w KQkq - +QGD Slav: Slav gambit * +r1bqkb1r/pp3ppp/2n2n2/2Ppp3/8/P4N2/1PP1PPPP/RNBQKB1R w KQkq - +QGA, Bogolyubov variation * +r1bqkb1r/pp3ppp/2n2n2/2pp4/3P4/2N2NP1/PP2PP1P/R1BQKB1R w KQkq - +QGD: Tarrasch, Prague variation +r1bqkb1r/pp3ppp/2n2n2/2ppp3/4P3/3P1N2/PPPN1PPP/R1BQKB1R w KQkq - +Old Indian: main line * +r1bqkb1r/pp3ppp/2n2n2/2ppp3/8/3P1NP1/PPP1PPBP/RNBQK2R w KQkq - +King's Indian: 5.Nf3 * +r1bqkb1r/pp3ppp/2n2n2/2ppp3/Q1P5/3P2P1/PP2PPBP/RNB1K1NR b KQkq - +Pterodactyl defense * +r1bqkb1r/pp3ppp/2n2n2/4p3/2Pp4/3P1NP1/PP3P1P/RNBQKB1R w KQkq - +Benoni: classical with e4 and Nf3 * +r1bqkb1r/pp3ppp/2np1n2/4p3/3NP3/2N5/PPP1BPPP/R1BQK2R w KQkq - +Sicilian: Boleslavsky variation +r1bqkb1r/pp3ppp/2np1n2/4p3/4P3/1NN5/PPP1BPPP/R1BQK2R b KQkq - +Sicilian: Boleslavsky variation, 7.Nb3 +r1bqkb1r/pp3ppp/2nppn2/1B4B1/3NP3/2N5/PPP2PPP/R2QK2R b KQkq - +Sicilian: Richter-Rauzer, Margate (Alekhine) variation +r1bqkb1r/pp3ppp/2nppn2/6B1/3NP3/2N5/PPP2PPP/R2QKB1R w KQkq - +Sicilian: Richter-Rauzer, 6...e6 +r1bqkb1r/pp3ppp/2nppn2/6B1/3NP3/2N5/PPPQ1PPP/R3KB1R b KQkq - +Sicilian: Richter-Rauzer, Rauzer attack +r1bqkb1r/pp3ppp/2nppn2/6B1/3NP3/2NQ4/PPP2PPP/R3KB1R b KQkq - +Sicilian: Richter-Rauzer, Keres variation +r1bqkb1r/pp3ppp/2nppn2/6B1/4P3/1NN5/PPP2PPP/R2QKB1R b KQkq - +Sicilian: Richter-Rauzer, Pod\v ebrady variation +r1bqkb1r/pp3ppp/2nppn2/8/2BNP3/2N1B3/PPP2PPP/R2QK2R b KQkq - +Sicilian: Sozin, 7.Be3 +r1bqkb1r/pp3ppp/2nppn2/8/2BNP3/2N5/PPP2PPP/R1BQK2R w KQkq - +Sicilian: Sozin, Leonhardt variation +r1bqkb1r/pp3ppp/2nppn2/8/3NP3/2N5/PPP1BPPP/R1BQK2R w KQkq - +Sicilian: modern Scheveningen +r1bqkb1r/pp3ppp/n1n5/2p1p3/3P4/P1N1PN2/1P3PPP/R1BQKB1R b KQkq - +Sicilian, Sz\'en variation, Dely-Kasparov gambit * +r1bqkb1r/pp4pp/2n2n2/2p1pp2/2Pp4/3P1NP1/PP2PPBP/RNBQ1RK1 w kq - +King's Indian: Four pawns attack, dynamic line * +r1bqkb1r/pp4pp/2n2n2/4pp2/2Pp4/3P1NP1/PP3PBP/RNBQ1RK1 b kq - +Benoni: four pawns attack * +r1bqkb1r/ppp1nppp/2n5/1B1pp3/3P4/4P3/PPP2PPP/RNBQK1NR w KQkq - +French: Winawer, Alekhine (Mar\'oczy) gambit * +r1bqkb1r/ppp1pppp/1nn5/4P3/2PP4/4B3/PP4PP/RN1QKBNR b KQkq - +Alekhine's defense: four pawns attack, 7.Be3 +r1bqkb1r/ppp1pppp/1nn5/4P3/2PP4/8/PP4PP/RNBQKBNR w KQkq - +Alekhine's defense: four pawns attack, 6...Nc6 +r1bqkb1r/ppp2Npp/2n5/3np3/2B5/8/PPPP1PPP/RNBQK2R b KQkq - +two knights defense: Fegatello attack +r1bqkb1r/ppp2p1p/2n3p1/3np3/8/3PPN2/PP3PPP/RNBQKB1R w KQkq - +Sicilian: Scheveningen, fianchetto variation * +r1bqkb1r/ppp2p1p/2n3p1/3np3/8/P2P1N2/1P2PPPP/RNBQKB1R w KQkq - +Sicilian: Najdorf, Zagreb (fianchetto) variation * +r1bqkb1r/ppp2p1p/2n5/3np1p1/8/3PPN2/PP3PPP/RNBQKB1R w KQkq - +Sicilian: Scheveningen, Keres attack * +r1bqkb1r/ppp2p1p/2n5/3p2p1/Q3nB2/2P2N2/PP2PPPP/RN2KB1R w KQkq - +Scandinavian defense, Gr\"unfeld variation * +r1bqkb1r/ppp2pp1/2n2n1p/3p2B1/Q7/5N2/PPP1PPPP/RN2KB1R w KQkq - +Scandinavian defense, Lasker variation * +r1bqkb1r/ppp2pp1/2n2n1p/3pp3/8/3P1NP1/PPP1PPBP/RNBQK2R w KQkq - +Pirc: classical, h3 system * +r1bqkb1r/ppp2pp1/2n4p/3np3/8/P2P1N2/1P2PPPP/RNBQKB1R w KQkq - +Sicilian: Najdorf, Adams attack * +r1bqkb1r/ppp2pp1/5nn1/3p3p/8/2P3BP/PP1NPPP1/R2QKBNR b KQkq - +Caro-Kann: classical, 7...Nd7 * +r1bqkb1r/ppp2pp1/5nn1/3p4/7p/2P3BP/PP1NPPP1/R2QKBNR w KQkq - +Caro-Kann: classical, Spassky variation * +r1bqkb1r/ppp2ppp/2Bp1n2/4p3/4P3/3P1N2/PPP2PPP/RNBQK2R b KQkq - +Ruy Lopez: Berlin defense, Anderssen variation +r1bqkb1r/ppp2ppp/2n1pn2/3p4/3PP3/5N2/PPPN1PPP/R1BQKB1R w KQkq - +French: Tarrasch, Guimard main line +r1bqkb1r/ppp2ppp/2n1pn2/3p4/4P3/3P1N2/PPPNBPPP/R1BQK2R b KQkq - +French: Reversed Philidor formation +r1bqkb1r/ppp2ppp/2n2n2/3Pp3/8/2N2N2/PPPP1PPP/R1BQKB1R b KQkq - +Four knights: Scotch, 4...exd4 * +r1bqkb1r/ppp2ppp/2n2n2/3p2B1/3P4/2N5/PPP2PPP/R2QKBNR w KQkq - +French: exchange, Bogolyubov variation +r1bqkb1r/ppp2ppp/2n2n2/3p2B1/Q3P3/8/PPP2PPP/RN2KBNR b KQkq - +Scandinavian: Anderssen counter-attack, Collijn variation * +r1bqkb1r/ppp2ppp/2n2n2/3p4/Q3P3/8/PPP2PPP/RNB1KBNR w KQkq - +Scandinavian: Anderssen counter-attack, Goteborg system * +r1bqkb1r/ppp2ppp/2n2n2/3p4/Q4B2/5N2/PPP1PPPP/RN2KB1R b KQkq - +Scandinavian defense * +r1bqkb1r/ppp2ppp/2n2n2/3pp3/4P3/2N2N2/PPPP1PPP/R1BQKB1R w KQkq - +Four knights: Scotch variation * +r1bqkb1r/ppp2ppp/2n2n2/3pp3/4P3/3P1N2/PPPN1PPP/R1BQKB1R b KQkq - +Philidor: Improved Hanham variation * +r1bqkb1r/ppp2ppp/2n2n2/3pp3/4P3/3P1N2/PPPNBPPP/R1BQK2R b KQkq - +Inverted Hanham +r1bqkb1r/ppp2ppp/2n2n2/3pp3/4PP2/3P4/PPP3PP/RNBQKBNR w KQkq - +Philidor: Philidor counter-gambit, Zukertort variation * +r1bqkb1r/ppp2ppp/2n2n2/3pp3/8/2PP2P1/PP2PPBP/RNBQK1NR b KQkq - +Robatsch defense: two knights, Suttles variation * +r1bqkb1r/ppp2ppp/2n2n2/3pp3/8/3P1NP1/PPP1PP1P/RNBQKB1R w KQkq - +Pirc: classical (two knights) system * +r1bqkb1r/ppp2ppp/2n2n2/3pp3/8/3P1NP1/PPP1PPBP/RNBQK2R b KQkq - +Pirc: classical (two knights) system * +r1bqkb1r/ppp2ppp/2n2n2/3pp3/8/3P2P1/PPP1PPBP/RNBQK1NR w KQkq - +Robatsch defense: two knights variation * +r1bqkb1r/ppp2ppp/2n2n2/3pp3/Q3P3/2P2N2/PP1P1PPP/RNB1KB1R w KQkq - +Ponziani: Leonhardt variation +r1bqkb1r/ppp2ppp/2n5/1B1n4/4p3/4PN2/PP1P1PPP/RNBQK2R w KQkq - +Sicilian: Pin, Koch variation * +r1bqkb1r/ppp2ppp/2n5/1B1np3/8/4PN2/PP1P1PPP/RNBQK2R b KQkq - +Sicilian: Pin variation (Sicilian counter-attack) * +r1bqkb1r/ppp2ppp/2n5/1B1pp3/4n3/2N2N2/PPPP1PPP/R1BQK2R w KQkq - +Four knights: Scotch, Krause variation * +r1bqkb1r/ppp2ppp/2n5/1B2p3/8/2NnPN2/PP1P1PPP/R1BQK2R w KQkq - +Sicilian: Taimanov, American attack * +r1bqkb1r/ppp2ppp/2n5/3np1N1/2BP4/8/PPP2PPP/RNBQK2R b KQkq - +two knights defense: Lolli attack +r1bqkb1r/ppp2ppp/2n5/3np2Q/8/2N5/PPPP1PPP/R1B1KBNR w KQkq - +Scotch: Steinitz variation * +r1bqkb1r/ppp2ppp/2n5/3np3/4P3/2N2N2/PP1P1PPP/R1BQKB1R b KQkq - +Sicilian: Pelikan (Lasker/Sveshnikov) variation * +r1bqkb1r/ppp2ppp/2n5/3np3/8/2N1P3/PP1P1PPP/R1BQKBNR w KQkq - +Sicilian: Taimanov variation * +r1bqkb1r/ppp2ppp/2n5/3np3/8/2N1P3/PPQP1PPP/R1B1KBNR b KQkq - +Sicilian: Taimanov (Bastrikov) variation * +r1bqkb1r/ppp2ppp/2n5/3np3/8/2N3P1/PP1PPP1P/R1BQKBNR w KQkq - +Sicilian: accelerated fianchetto, modern variation * +r1bqkb1r/ppp2ppp/2n5/3np3/8/2NP1N2/PP2PPPP/R1BQKB1R b KQkq - +Sicilian * +r1bqkb1r/ppp2ppp/2n5/3np3/8/3P1N2/PP2PPPP/RNBQKB1R w KQkq - +Sicilian * +r1bqkb1r/ppp2ppp/2n5/3np3/8/3P1NP1/PP2PP1P/RNBQKB1R b KQkq - +Sicilian: dragon variation * +r1bqkb1r/ppp2ppp/2n5/3np3/8/3PPN2/PP3PPP/RNBQKB1R b KQkq - +Sicilian: Scheveningen variation * +r1bqkb1r/ppp2ppp/2n5/3np3/8/P1N1P3/1P1P1PPP/R1BQKBNR b KQkq - +Sicilian: Taimanov variation * +r1bqkb1r/ppp2ppp/2n5/3np3/8/P2P1N2/1P2PPPP/RNBQKB1R b KQkq - +Sicilian: Najdorf * +r1bqkb1r/ppp2ppp/2n5/3np3/8/P3P3/1P1P1PPP/RNBQKBNR w KQkq - +Sicilian: Kan, 5.Nc3 * +r1bqkb1r/ppp2ppp/2n5/3p4/2Bpn3/2N2N2/PPP2PPP/R1BQR1K1 b kq - +two knights defense: Canal variation +r1bqkb1r/ppp2ppp/2n5/4P3/2BP2n1/4p3/PPP3PP/RNBQK1NR w KQkq - +Philidor: Philidor counter-gambit, Berger variation * +r1bqkb1r/ppp2ppp/2np1n2/1B2p3/2P1P3/3P1N2/PP3PPP/RNBQK2R b KQkq - +Ruy Lopez: Berlin defense, Duras variation +r1bqkb1r/ppp2ppp/2np1n2/1B2p3/4P3/5N2/PPPP1PPP/RNBQ1RK1 w kq - +Ruy Lopez: Berlin defense, 4.O-O, d6 +r1bqkb1r/ppp2ppp/2np1n2/4p3/2P5/1PN1P3/P2P1PPP/R1BQKBNR w KQkq - +Amsterdam attack +r1bqkb1r/ppp2ppp/4pn2/4N3/3P4/8/PPP2PPP/R1BQKB1R b KQkq - +French: Rubinstein, Capablanca line +r1bqkb1r/ppp2ppp/5n2/3Pp1N1/2Bn4/8/PPPP1PPP/RNBQK2R w KQkq - +two knights defense: Fritz variation +r1bqkb1r/ppp2ppp/5n2/3Pp3/3n4/2N2N2/PPPP1PPP/R1BQKB1R w KQkq - +Four knights: Belgrade gambit * +r1bqkb1r/ppp2ppp/5n2/3Pp3/3n4/2N3P1/PPPP1P1P/R1BQKBNR w KQkq - +Three knights: Steinitz, Rosenthal variation * +r1bqkb1r/ppp2ppp/5n2/3p4/2PPp3/2N5/PP1P1PPP/R1BQKB1R b KQkq - +Sicilian: Nimzovich-Rubinstein; Rubinstein counter-gambit * +r1bqkb1r/ppp2ppp/5n2/3pn3/8/2B1P3/PPP2PPP/RN1QKBNR b KQkq - +French: Fort Knox variation * +r1bqkb1r/ppp2ppp/5n2/n2Pp1N1/2B5/3P4/PPP2PPP/RNBQK2R b KQkq - +two knights defense: Kieseritsky variation +r1bqkb1r/ppp2ppp/5n2/n2Pp1N1/2B5/8/PPPP1PPP/RNBQK2R w KQkq - +two knights defense +r1bqkb1r/ppp2ppp/5n2/nB1Pp1N1/8/8/PPPP1PPP/RNBQK2R b KQkq - +Two knights defense +r1bqkb1r/ppp2ppp/6nn/3p4/8/2P3B1/PP2PPPP/RN1QKBNR w KQkq - +Caro-Kann: classical, Flohr variation * +r1bqkb1r/ppp2ppp/8/3p4/4n3/4PN2/PPP2PPP/R1BQKB1R w KQkq - +French: Rubinstein, Capablanca line * +r1bqkb1r/ppp3pp/2n2n2/3p1p2/2PPp3/4P3/PP1N1PPP/RNBQKB1R w KQkq - +French: Steinitz variation * +r1bqkb1r/ppp3pp/2n2n2/3p1p2/4p3/3P1NP1/PPP1PPBP/RNBQ1RK1 w kq - +Pirc: Austrian attack, 6.e5 * +r1bqkb1r/ppp3pp/2n2n2/3p4/8/4PN2/PPP2PPP/RNBQKB1R b KQkq - +Blackmar-Diemer: Euwe defense * +r1bqkb1r/ppp3pp/2n2n2/3ppP2/6P1/2N5/PPPP1P1P/R1BQKBNR w KQkq - +Vienna: Pierce gambit * +r1bqkb1r/ppp3pp/2n2n2/3ppp2/2P5/3P1NP1/PP2PPBP/RNBQK2R b KQkq - +Pirc: Austrian attack, dragon formation * +r1bqkb1r/ppp3pp/2n2n2/3ppp2/8/3P1NP1/PPP1PPBP/RNBQ1RK1 b kq - +Pirc: Austrian attack * +r1bqkb1r/ppp3pp/2n5/3npp2/8/3P1NP1/PP1NPP1P/R1BQKB1R b KQkq - +Sicilian: dragon, Levenfish; Flohr variation * +r1bqkb1r/ppp3pp/2n5/3npp2/8/3P1NP1/PP2PP1P/RNBQKB1R w KQkq - +Sicilian: dragon, Levenfish variation * +r1bqkb1r/ppp3pp/2n5/3npp2/8/3PPN2/PP3PPP/RNBQKB1R w KQkq - +Sicilian: Scheveningen, 6.f4 * +r1bqkb1r/ppp3pp/2n5/3npp2/8/P2P1N2/1P2PPPP/RNBQKB1R w KQkq - +Sicilian: Najdorf, 6.f4 * +r1bqkb1r/ppp4p/3p1nN1/8/3np2Q/8/PPP2PPP/RNB1KB1R w KQkq - +Vienna gambit, Wurzburger trap * +r1bqkb1r/pppn1ppp/2np4/1B2p3/3PP3/5N2/PPP2PPP/RNBQ1RK1 w kq - +Ruy Lopez: closed Berlin defense, Chigorin variation +r1bqkb1r/pppn1ppp/3p1n2/4p3/2PP4/2NBP3/PP3PPP/R1BQK1NR b KQkq - +Old Indian: Dus-Khotimirsky variation +r1bqkb1r/pppn1ppp/3p1n2/4p3/2PPP3/2N2N2/PP3PPP/R1BQKB1R b KQkq - +Old Indian: main line +r1bqkb1r/pppn1ppp/3p1n2/4p3/3PP3/2N2N2/PPP2PPP/R1BQKB1R w KQkq - +Philidor: Improved Hanham variation +r1bqkb1r/pppn1ppp/4pn2/3p2B1/2PP4/2N1P3/PP3PPP/R2QKBNR b KQkq - +QGD +r1bqkb1r/pppn1ppp/4pn2/3p2B1/2PP4/2N5/PP2PPPP/R2QKBNR w KQkq - +QGD: 4.Bg5 Nbd7 +r1bqkb1r/pppn1ppp/4pn2/8/2QP4/6P1/PP2PPBP/RNB1K1NR b KQkq - +Catalan: open, 5.Qa4 Nbd7, 6.Qxc4 +r1bqkb1r/pppn1ppp/5n2/3p4/2PP4/2N5/PP3PPP/R1BQKBNR b KQkq - +French: Tarrasch, open variation, main line * +r1bqkb1r/pppn1ppp/5n2/3p4/3P1B2/2N2N2/PP2PPPP/R2QKB1R b KQkq - +QGD: exchange, S\"amisch variation +r1bqkb1r/pppn1ppp/5n2/3pp3/3P4/2N1PN2/PPP2PPP/R1BQKB1R b KQkq - +French: Tarrasch, Guimard main line * +r1bqkb1r/pppn1ppp/5n2/4N3/4p3/3P4/PPP2PPP/RNBQKB1R w KQkq - +Philidor: Nimzovich, Sokolsky variation * +r1bqkb1r/pppn1ppp/8/4p3/8/2P2N2/P1PP1PPP/R1BQKB1R w KQkq - +Scotch: Tartakower variation * +r1bqkb1r/pppp1ppp/2n1pn2/8/2P1P3/2N5/PP1P1PPP/R1BQKBNR w KQkq - +English: Mikenas-Carls, Kevitz variation +r1bqkb1r/pppp1ppp/2n2n2/1B2p3/4P3/2N2N2/PPPP1PPP/R1BQK2R b KQkq - +Four knights: Spanish variation +r1bqkb1r/pppp1ppp/2n2n2/1B2p3/4P3/5N2/PPPP1PPP/RNBQ1RK1 b kq - +Ruy Lopez: Berlin defense, 4.O-O +r1bqkb1r/pppp1ppp/2n2n2/1B2p3/4P3/5N2/PPPP1PPP/RNBQK2R w KQkq - +Ruy Lopez: Berlin defense +r1bqkb1r/pppp1ppp/2n2n2/1B6/3pP3/5N2/PPP2PPP/RNBQ1RK1 b kq - +Ruy Lopez: Berlin defense, Nyholm attack +r1bqkb1r/pppp1ppp/2n2n2/3N4/3pP3/5N2/PPP2PPP/R1BQKB1R b KQkq - +Four knights: Belgrade gambit +r1bqkb1r/pppp1ppp/2n2n2/4N3/4P3/2N5/PPPP1PPP/R1BQKB1R b KQkq - +Four knights: Schultze-M\"uller gambit +r1bqkb1r/pppp1ppp/2n2n2/4N3/8/3P4/PPP2PPP/RNBQKB1R w KQkq - +Petrov: Nimzovich attack * +r1bqkb1r/pppp1ppp/2n2n2/4p1B1/3P4/2P5/PP2PPPP/RN1QKBNR b KQkq - +Caro-Kann: two knights, 3...Bg4 * +r1bqkb1r/pppp1ppp/2n2n2/4p1N1/2B1P3/8/PPPP1PPP/RNBQK2R b KQkq - +Two knights defense +r1bqkb1r/pppp1ppp/2n2n2/4p3/2B1P3/2N2N2/PPPP1PPP/R1BQK2R b KQkq - +Four knights: Italian variation +r1bqkb1r/pppp1ppp/2n2n2/4p3/2B1P3/2N5/PPPP1PPP/R1BQK1NR w KQkq - +Vienna game +r1bqkb1r/pppp1ppp/2n2n2/4p3/2B1P3/3P1N2/PPP2PPP/RNBQK2R b KQkq - +Two knights defense (Modern bishop's opening) +r1bqkb1r/pppp1ppp/2n2n2/4p3/2B1P3/5N2/PPPP1PPP/RNBQK2R w KQkq - +Two knights defense +r1bqkb1r/pppp1ppp/2n2n2/4p3/2BPP3/5N2/PPP2PPP/RNBQK2R b KQkq - +Two knights defense +r1bqkb1r/pppp1ppp/2n2n2/4p3/2P1P3/2N2N2/PP1P1PPP/R1BQKB1R b KQkq - +English: four knights, Nimzovich variation +r1bqkb1r/pppp1ppp/2n2n2/4p3/2P5/2N1PN2/PP1P1PPP/R1BQKB1R b KQkq - +English: four knights, 4.e3 +r1bqkb1r/pppp1ppp/2n2n2/4p3/2P5/2N2N2/PP1PPPPP/R1BQKB1R w KQkq - +English: four knights system +r1bqkb1r/pppp1ppp/2n2n2/4p3/2P5/2N2NP1/PP1PPP1P/R1BQKB1R b KQkq - +English: four knights, kingside fianchetto +r1bqkb1r/pppp1ppp/2n2n2/4p3/2P5/2NP1N2/PP2PPPP/R1BQKB1R b KQkq - +English: four knights, Capablanca variation +r1bqkb1r/pppp1ppp/2n2n2/4p3/2P5/P1N2N2/1P1PPPPP/R1BQKB1R b KQkq - +English: four knights, Marini variation +r1bqkb1r/pppp1ppp/2n2n2/4p3/3P4/2P5/PP2PPPP/RNBQKBNR w KQkq - +Caro-Kann: two knights variation * +r1bqkb1r/pppp1ppp/2n2n2/4p3/3P4/4P3/PPP2PPP/RNBQKBNR w KQkq - +French: Two knights variation * +r1bqkb1r/pppp1ppp/2n2n2/4p3/3PP3/2N2N2/PPP2PPP/R1BQKB1R b KQkq - +Four knights: Scotch variation +r1bqkb1r/pppp1ppp/2n2n2/4p3/3PP3/5N2/PPP1BPPP/RNBQK2R b KQkq - +Tayler opening +r1bqkb1r/pppp1ppp/2n2n2/4p3/4P3/2N2N2/PPPP1PPP/R1BQKB1R b KQkq - +Four knights game * +r1bqkb1r/pppp1ppp/2n2n2/4p3/4P3/2N2N2/PPPP1PPP/R1BQKB1R w KQkq - +Four knights game +r1bqkb1r/pppp1ppp/2n2n2/4p3/4P3/2N3P1/PPPP1P1P/R1BQKBNR b KQkq - +Three knights: Steinitz variation * +r1bqkb1r/pppp1ppp/2n2n2/4p3/4P3/2N5/PPPP1PPP/R1BQKBNR w KQkq - +Three knights game * +r1bqkb1r/pppp1ppp/2n2n2/4p3/4P3/2P2N2/PP1P1PPP/RNBQKB1R w KQkq - +Ponziani: Jaenisch counter-attack +r1bqkb1r/pppp1ppp/2n2n2/4p3/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - +Petrov three knights game * +r1bqkb1r/pppp1ppp/2n2n2/4p3/4P3/P1N2N2/1PPP1PPP/R1BQKB1R b KQkq - +Four knights: Gunsberg variation +r1bqkb1r/pppp1ppp/2n2n2/4p3/4PP2/2N5/PPPP2PP/R1BQKBNR b KQkq - +Three knights: Winawer defense (Gothic defense) * +r1bqkb1r/pppp1ppp/2n2n2/6N1/2BpP3/8/PPP2PPP/RNBQK2R b KQkq - +Two knights defense, Perreux variation +r1bqkb1r/pppp1ppp/2n2n2/8/2BpP3/5N2/PPP2PPP/RNBQ1RK1 b kq - +Two knights defense +r1bqkb1r/pppp1ppp/2n2n2/8/2BpP3/5N2/PPP2PPP/RNBQK2R w KQkq - +Scotch gambit: Dubois-R\'eti defense +r1bqkb1r/pppp1ppp/2n2n2/8/2PPp3/2N2N2/PP2PPPP/R1BQKB1R w KQkq - +English: Bradley Beach variation +r1bqkb1r/pppp1ppp/2n2n2/8/3NP3/8/PPP2PPP/RNBQKB1R w KQkq - +Scotch: Schmidt variation +r1bqkb1r/pppp1ppp/2n2n2/8/3pP3/2N2N2/PPP2PPP/R1BQKB1R w KQkq - +Four knights: Scotch, 4...exd4 +r1bqkb1r/pppp1ppp/2n2n2/8/4P3/4Q3/PPP2PPP/RNB1KBNR w KQkq - +Center game: Berger variation +r1bqkb1r/pppp1ppp/2n5/1B2p3/4n3/5N2/PPPP1PPP/RNBQ1RK1 w kq - +Ruy Lopez: Berlin defense, open variation +r1bqkb1r/pppp1ppp/2n5/2n1P3/3N4/8/PPP1QPPP/RNB1KB1R w KQkq - +Petrov: modern attack, Bardeleben variation +r1bqkb1r/pppp1ppp/2n5/4p3/4n3/2N2N2/PPPP1PPP/R1BQKB1R w KQkq - +Four knights: Schultze-M\"uller gambit * +r1bqkb1r/pppp1ppp/2n5/8/2Bpn3/5N2/PPP2PPP/RNBQ1RK1 w kq - +Two knights defense +r1bqkb1r/pppp1ppp/2nn4/1B2P3/8/5N2/PPP2PPP/RNBQ1RK1 b kq - +Ruy Lopez: open Berlin defense, l'Hermet variation +r1bqkb1r/pppp1ppp/2nn4/4p2Q/3P4/1BN5/PPP2PPP/R1B1K1NR b KQkq - +Vienna: Adams' gambit +r1bqkb1r/pppp1ppp/2nn4/4p3/B2P4/5N2/PPP2PPP/RNBQ1RK1 b kq - +Ruy Lopez: open Berlin defense, Showalter variation +r1bqkb1r/pppp1ppp/5n2/1B2p3/3NP3/2N5/PPPP1PPP/R1BQK2R b KQkq - +Four knights: Rubinstein counter-gambit, exchange variation +r1bqkb1r/pppp1ppp/5n2/1B2p3/3nP3/2N2N2/PPPP1PPP/R1BQ1RK1 b kq - +Four knights: Rubinstein counter-gambit, Henneberger variation +r1bqkb1r/pppp1ppp/5n2/1B2p3/3nP3/2N2N2/PPPP1PPP/R1BQK2R b KQkq - +Three knights: Schlechter variation * +r1bqkb1r/pppp1ppp/5n2/1B2p3/3nP3/2N2N2/PPPP1PPP/R1BQK2R w KQkq - +Four knights: Rubinstein counter-gambit +r1bqkb1r/pppp1ppp/5n2/4p3/3nP3/2N2N2/PPPPBPPP/R1BQK2R b KQkq - +Four knights: Rubinstein counter-gambit, 5.Be2 +r1bqkb1r/pppp2p1/2n5/4pPPp/6n1/2N5/PPPP1P1P/R1BQKBNR w KQkq - +Vienna: Hamppe-Allgaier gambit * +r1bqkb1r/pppp2p1/2n5/4pPPp/6n1/2NP4/PPP2P1P/R1BQKBNR b KQkq - +Vienna: Hamppe-Allgaier gambit, Alapin variation * +r1bqkb1r/pppp2p1/2n5/4pPPp/8/7P/PPPP1K2/RNBQ1BNR w kq - +KGA: Allgaier, Blackburne gambit * +r1bqkb1r/pppp2pp/2n2n2/4N3/3Pp3/8/PPP1BPPP/RNBQK2R b KQkq - +Vienna gambit: Breyer variation * +r1bqkb1r/pppp2pp/2n2n2/4pP2/6P1/8/PPPP1P1P/RNBQKBNR w KQkq - +KGA: Quaade gambit * +r1bqkb1r/pppp2pp/2n2n2/4pP2/8/2N5/PPPP1PPP/R1BQKBNR w KQkq - +Vienna gambit * +r1bqkb1r/pppp2pp/2n2n2/4pp2/2B1P3/3P4/PPPN1PPP/R1BQK1NR b KQkq - +KGD: classical, Hanham variation * +r1bqkb1r/ppppnp1p/2n3p1/1B2p3/4P3/2N2N2/PPPP1PPP/R1BQK2R w KQkq - +Ruy Lopez: Cozio defense, Paulsen variation +r1bqkb1r/ppppnppp/2n5/1B2p3/4P3/5N2/PPPP1PPP/RNBQK2R w KQkq - +Ruy Lopez: Cozio defense +r1bqkb1r/ppppnppp/2n5/4p3/2P5/2N5/PP1PPPPP/R1BQKBNR w KQkq - +Sicilian: chameleon variation * +r1bqkb1r/ppppnppp/2n5/4p3/4P3/2P2N2/PP1P1PPP/RNBQKB1R w KQkq - +Ponziani: R\'eti variation +r1bqkb1r/ppppnppp/5n2/1B2p3/4P3/3P1N2/PPP2PPP/RNBQK2R w KQkq - +Ruy Lopez: Berlin defense, Mortimer variation +r1bqkb1r/ppppnppp/8/1B6/3pP3/8/PPPP1PPP/RNBQ1RK1 w kq - +Ruy Lopez: Bird's defense, Paulsen variation +r1bqkb1r/pppppppp/2n2n2/8/2PP4/8/PP2PPPP/RNBQKBNR w KQkq - +Kevitz-Trajkovich defense +r1bqkbnr/1p1p1ppp/p1n1p3/8/3NP3/2N5/PPP2PPP/R1BQKB1R w KQkq - +Sicilian: Taimanov variation +r1bqkbnr/1pp2ppp/p1n5/1B1p4/2PPp3/4P3/PP3PPP/RNBQK1NR w KQkq - +French: Winawer, advance, 5.a3 * +r1bqkbnr/1pp2ppp/p1np4/4p3/B1P1P3/5N2/PP1P1PPP/RNBQK2R b KQkq - +Ruy Lopez: modern Steinitz defense, Duras (Keres) variation +r1bqkbnr/1pp2ppp/p1np4/4p3/B3P3/2N2N2/PPPP1PPP/R1BQK2R b KQkq - +Ruy Lopez: modern Steinitz defense, Three knights variation +r1bqkbnr/1pp2ppp/p1np4/4p3/B3P3/2P2N2/PP1P1PPP/RNBQK2R b KQkq - +Ruy Lopez: modern Steinitz defense +r1bqkbnr/1pp2ppp/p1np4/4p3/B3P3/5N2/PPPP1PPP/RNBQ1RK1 b kq - +Ruy Lopez: modern Steinitz defense, 5.O-O +r1bqkbnr/1pp2ppp/p1np4/4p3/B3P3/5N2/PPPP1PPP/RNBQK2R w KQkq - +Ruy Lopez: modern Steinitz defense +r1bqkbnr/1pp2ppp/p1p5/4p3/4P3/2N2N2/PPPP1PPP/R1BQK2R b KQkq - +Ruy Lopez: exchange, Keres variation +r1bqkbnr/1pp2ppp/p1p5/4p3/4P3/5N2/PPPP1PPP/RNBQ1RK1 b kq - +Ruy Lopez: exchange variation, 5.O-O +r1bqkbnr/1pp3pp/p1np4/4pp2/B3P3/2P2N2/PP1P1PPP/RNBQK2R w KQkq - +Ruy Lopez: modern Steinitz defense, siesta variation +r1bqkbnr/1pp3pp/p1p2p2/4p3/4P3/2NP1N2/PPP2PPP/R1BQK2R b KQkq - +Ruy Lopez: exchange, Romanovsky variation +r1bqkbnr/1pp3pp/p1p2p2/4p3/4P3/5N2/PPPP1PPP/RNBQ1RK1 w kq - +Ruy Lopez: exchange, Gligori\'c variation +r1bqkbnr/1ppp1p1p/p1n3p1/4p3/B3P3/5N2/PPPP1PPP/RNBQK2R w KQkq - +Ruy Lopez: fianchetto defense deferred +r1bqkbnr/1ppp1ppp/p1B5/4p3/4P3/5N2/PPPP1PPP/RNBQK2R b KQkq - +Ruy Lopez: exchange variation +r1bqkbnr/1ppp1ppp/p1n5/4p3/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - +Vienna: Mengarini variation * +r1bqkbnr/1ppp1ppp/p1n5/4p3/B3P3/5N2/PPPP1PPP/RNBQK2R b KQkq - +Ruy Lopez +r1bqkbnr/1ppp1ppp/p7/4p3/B2nP3/5N2/PPPP1PPP/RNBQK2R w KQkq - +Ruy Lopez: Bird's defense deferred +r1bqkbnr/1ppp2pp/p1n5/4pp2/B3P3/5N2/PPPP1PPP/RNBQK2R w KQkq - +Ruy Lopez: Schliemann defense deferred +r1bqkbnr/1ppppppp/p1n5/8/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +Battambang opening * +r1bqkbnr/2p2ppp/2p5/p2p4/2PPp3/4P3/PP2NPPP/RNBQK2R w KQkq - +French: Winawer, advance, Smyslov variation * +r1bqkbnr/2p2ppp/p1p5/3p4/2PPp3/4P3/PP2NPPP/RNBQK2R b KQkq - +French: Winawer, advance, 6...Ne7 * +r1bqkbnr/2p2ppp/p1p5/3p4/2PPp3/4P3/PP3PPP/RNBQK1NR w KQkq - +French: Winawer, advance variation * +r1bqkbnr/2p2ppp/p1p5/3p4/2PPp3/4P3/PPQ2PPP/RNB1K1NR b KQkq - +French: Winawer, classical variation * +r1bqkbnr/2p2ppp/p1pp4/4p3/3PP3/5N2/PPP2PPP/RNBQK2R b KQkq - +Ruy Lopez: modern Steinitz defense, Richter variation +r1bqkbnr/2p2ppp/p1pp4/4p3/4P3/5N2/PPPP1PPP/RNBQK2R w KQkq - +Ruy Lopez: modern Steinitz defense, exchange variation +r1bqkbnr/2p3pp/p1pp1p2/4p3/3PP3/5N2/PPP2PPP/RNBQK2R w KQkq - +Ruy Lopez: modern Steinitz defense, Alapin variation +r1bqkbnr/2pp1ppp/p1n5/1p2p3/B3P3/5N2/PPPP1PPP/RNBQK2R w KQkq - +Ruy Lopez: Caro variation +r1bqkbnr/2pp1ppp/p7/np2p3/4P3/1B3N2/PPPP1PPP/RNBQK2R w KQkq - +Ruy Lopez: Taimanov (chase/wing/accelerated counterthrust) variation +r1bqkbnr/4p1pp/p1p2p2/3p4/2Pp4/4PN2/PP3PPP/RNBQK2R w KQkq - +Nimzo-Indian: S\"amisch variation * +r1bqkbnr/4p1pp/p1p2p2/8/2pN1P2/4P3/PP4PP/RNBQK2R b KQkq - +Nimzo-Indian: S\"amisch, Romanovsky variation * +r1bqkbnr/4p1pp/p1p2p2/8/2pN4/4P3/PP3PPP/RNBQK2R w KQkq - +Nimzo-Indian: S\"amisch, Keres variation * +r1bqkbnr/4pppp/p1p5/2pp4/8/4PN2/PPPP1PPP/RNBQ1RK1 b kq - +Nimzo-Indian: S\"amisch variation * +r1bqkbnr/4pppp/p1p5/2pp4/8/4PN2/PPPP1PPP/RNBQK2R w KQkq - +Nimzo-Indian: S\"amisch variation * +r1bqkbnr/5ppp/p1p1p3/2pp4/2P5/1P2PN2/P2P1PPP/RNBQK2R b KQkq - +Nimzo-Indian: S\"amisch, O'Kelly variation * +r1bqkbnr/5ppp/p1p1p3/2pp4/2P5/4PN2/PP1P1PPP/RNBQK2R w KQkq - +Nimzo-Indian: S\"amisch variation * +r1bqkbnr/5ppp/p1p1p3/2pp4/8/4PN2/PPPP1PPP/RNBQ1RK1 w kq - +Nimzo-Indian: S\"amisch variation * +r1bqkbnr/5ppp/p2p4/1pp5/3QP3/1B6/PPP2PPP/RNB1K2R w KQkq - +Ruy Lopez: Noah's ark trap +r1bqkbnr/6pp/p1p1pp2/3p4/2PN4/4P3/PP3PPP/RNBQ1RK1 b kq - +Nimzo-Indian: S\"amisch, Botvinnik variation * +r1bqkbnr/p1pp1ppp/2n5/1p6/Q7/8/PPP1PPPP/RNB1KBNR w KQkq - +Scandinavian, Mieses-Kotr\v c gambit * +r1bqkbnr/p2p1ppp/1pn1p3/2p5/4P3/2NP1N2/PPP2PPP/R1BQKB1R b KQkq - +Amsterdam attack * +r1bqkbnr/p3pppp/2p5/2p5/2Pp1P2/6P1/PP1PP2P/RNBQK1NR b KQkq - +Beefeater defense * +r1bqkbnr/pp1n1ppp/2pp4/4p1N1/2BPP3/8/PPP2PPP/RNBQK2R b KQkq - +Philidor: Hanham, Kmoch variation +r1bqkbnr/pp1n1ppp/2pp4/4p3/2BPP3/2N2N2/PPP2PPP/R1BQK2R b KQkq - +Philidor: Hanham, Schlechter variation +r1bqkbnr/pp1n1ppp/2pp4/4p3/2BPP3/2P2N2/PP3PPP/RNBQK2R b KQkq - +Philidor: Hanham, Delmar variation +r1bqkbnr/pp1n1ppp/2pp4/4p3/2BPP3/5N2/PPP2PPP/RNBQ1RK1 b kq - +Philidor: Hanham, Krause variation +r1bqkbnr/pp1npppp/2p5/8/3PN3/8/PPP2PPP/R1BQKBNR w KQkq - +Caro-Kann: Steinitz variation +r1bqkbnr/pp1p1p1p/2n3p1/2p1p3/2P4P/2NP4/PP2PPP1/R1BQKBNR b KQkq - +Sicilian: Gloria variation * +r1bqkbnr/pp1p1ppp/2n1p3/1N6/4P3/8/PPP2PPP/RNBQKB1R b KQkq - +Sicilian, Sz\'en (`anti-Taimanov') variation +r1bqkbnr/pp1p1ppp/2n1p3/8/3NP3/2N5/PPP2PPP/R1BQKB1R b KQkq - +Sicilian: Taimanov variation +r1bqkbnr/pp1p1ppp/2n1p3/8/3NP3/8/PPP2PPP/RNBQKB1R w KQkq - +Sicilian defense +r1bqkbnr/pp1p1ppp/2n5/2p1p3/2P5/4PN2/PP1P1PPP/RNBQKB1R b KQkq - +English: Mikenas-Carls, Sicilian variation * +r1bqkbnr/pp1p1ppp/2n5/2p1p3/8/2N1PN2/PPPP1PPP/R1BQKB1R b KQkq - +English: Mikenas-Carls, Kevitz variation * +r1bqkbnr/pp1p1ppp/2n5/2p1p3/8/4PN2/PPPP1PPP/RNBQKB1R w KQkq - +English: Mikenas-Carls variation * +r1bqkbnr/pp1p1ppp/2n5/2p5/3Pp3/4PN2/PPP2PPP/RNBQKB1R w KQkq - +English: Mikenas-Carls, Flohr variation * +r1bqkbnr/pp1p1ppp/2n5/4p3/3NP3/8/PPP2PPP/RNBQKB1R w KQkq - +Sicilian: Labourdonnais-L\"owenthal variation +r1bqkbnr/pp1ppp1p/2N3p1/8/4P3/8/PPP2PPP/RNBQKB1R b KQkq - +Sicilian: accelerated fianchetto, exchange variation +r1bqkbnr/pp1ppp1p/2n3p1/1Bp5/4P3/5N2/PPPP1PPP/RNBQK2R b KQkq - +English: Bremen, Smyslov system * +r1bqkbnr/pp1ppp1p/2n3p1/1Bp5/4P3/5N2/PPPP1PPP/RNBQK2R w KQkq - +Sicilian: Nimzovich-Rossolimo attack (with ...g6, without ...d6) +r1bqkbnr/pp1ppp1p/2n3p1/2p5/2P5/2N5/PP1PPPPP/R1BQKBNR w KQkq - +English: symmetrical variation * +r1bqkbnr/pp1ppp1p/2n3p1/2p5/2P5/5N2/PP1PPPPP/RNBQKB1R w KQkq - +English: symmetrical variation * +r1bqkbnr/pp1ppp1p/2n3p1/2p5/3PP3/5N2/PPP2PPP/RNBQKB1R b KQkq - +English: Bremen, reverse dragon * +r1bqkbnr/pp1ppp1p/2n3p1/2p5/4P3/2P2N2/PP1P1PPP/RNBQKB1R b KQkq - +English: Bremen system, Keres variation * +r1bqkbnr/pp1ppp1p/2n3p1/2p5/4P3/2PP4/PP3PPP/RNBQKBNR b KQkq - +English, Keres variation * +r1bqkbnr/pp1ppp1p/2n3p1/2p5/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - +English: Carls' Bremen system * +r1bqkbnr/pp1ppp1p/2n3p1/2p5/4P3/5NP1/PPPP1P1P/RNBQKB1R b KQkq - +English: Bremen system with ...g6 * +r1bqkbnr/pp1ppp1p/2n3p1/8/2PNP3/8/PP3PPP/RNBQKB1R b KQkq - +Sicilian: accelerated fianchetto, Mar\'oczy bind +r1bqkbnr/pp1ppp1p/2n3p1/8/3NP3/2N5/PPP2PPP/R1BQKB1R b KQkq - +Sicilian: accelerated fianchetto, modern variation +r1bqkbnr/pp1ppppp/2n5/1Bp5/4P3/5N2/PPPP1PPP/RNBQK2R b KQkq - +Sicilian: Nimzovich-Rossolimo attack (without ...d6) +r1bqkbnr/pp1ppppp/2n5/1Bp5/4P3/8/PPPP1PPP/RNBQK1NR b KQkq - +English, Kramnik-Shirov counterattack * +r1bqkbnr/pp1ppppp/2n5/2p5/2P5/2N3P1/PP1PPP1P/R1BQKBNR b KQkq - +English: symmetrical variation +r1bqkbnr/pp1ppppp/2n5/2p5/2P5/2N5/PP1PPPPP/R1BQKBNR b KQkq - +English: symmetrical variation * +r1bqkbnr/pp1ppppp/2n5/2p5/2P5/2N5/PP1PPPPP/R1BQKBNR w KQkq - +English: symmetrical variation +r1bqkbnr/pp1ppppp/2n5/2p5/2P5/8/PP1PPPPP/RNBQKBNR w KQkq - +English: symmetrical variation * +r1bqkbnr/pp1ppppp/2n5/2p5/3P4/5N2/PPP1PPPP/RNBQKB1R b KQkq - +English: Anglo-Gr\"unfeld defense * +r1bqkbnr/pp1ppppp/2n5/2p5/3PP3/5N2/PPP2PPP/RNBQKB1R b KQkq - +Sicilian defense +r1bqkbnr/pp1ppppp/2n5/2p5/4P3/2N3P1/PPPP1P1P/R1BQKBNR b KQkq - +Sicilian: closed +r1bqkbnr/pp1ppppp/2n5/2p5/4P3/2N5/PPPP1PPP/R1BQKBNR b KQkq - +English: Sicilian reversed * +r1bqkbnr/pp1ppppp/2n5/2p5/4P3/2N5/PPPP1PPP/R1BQKBNR w KQkq - +Sicilian: closed, 2...Nc6 +r1bqkbnr/pp1ppppp/2n5/2p5/4P3/2N5/PPPPNPPP/R1BQKB1R b KQkq - +Sicilian: chameleon variation +r1bqkbnr/pp1ppppp/2n5/2p5/4P3/5N2/PPPP1PPP/RNBQKB1R b KQkq - +English opening * +r1bqkbnr/pp1ppppp/2n5/2p5/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - +Sicilian defense +r1bqkbnr/pp1ppppp/2n5/2p5/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +English opening * +r1bqkbnr/pp1ppppp/2n5/2p5/4PP2/2N5/PPPP2PP/R1BQKBNR b KQkq - +Sicilian: Grand Prix attack +r1bqkbnr/pp1ppppp/2n5/2p5/8/2NP2P1/PPP1PP1P/R1BQKBNR b KQkq - +Venezolana opening +r1bqkbnr/pp1ppppp/2n5/2p5/8/4PN2/PPPP1PPP/RNBQKB1R b KQkq - +English opening * +r1bqkbnr/pp1ppppp/2n5/2p5/8/5N2/PPPPPPPP/RNBQKB1R w KQkq - +English opening * +r1bqkbnr/pp1ppppp/2n5/8/7Q/2N5/PPP1PPPP/R1B1KBNR b KQkq - +Novosibirsk opening +r1bqkbnr/pp2p1pp/2n2p2/1Bpp4/8/4PN2/PPPP1PPP/RNBQK2R w KQkq - +Nimzo-Indian: Kmoch variation * +r1bqkbnr/pp2pp1p/2n3p1/1Bpp4/8/4PN2/PPPP1PPP/RNBQK2R w KQkq - +Nimzo-Indian: Romanishin-Kasparov (Steiner) system * +r1bqkbnr/pp2pp1p/2n5/2pp2p1/3P4/5NP1/PPP1PP1P/RNBQKB1R w KQkq - +Gr\"unfeld: Spike gambit * +r1bqkbnr/pp2ppp1/2np4/2p4p/2P1P3/2N3P1/PP1P1P1P/R1BQKBNR w KQkq - +Sicilian: Gloria variation +r1bqkbnr/pp2pppp/2n5/1Bpp4/8/4PN2/PPPP1PPP/RNBQK2R b KQkq - +Nimzo-Indian defense * +r1bqkbnr/pp2pppp/2n5/2pp4/2PP4/4P3/PP3PPP/RNBQKBNR b KQkq - +QGD: Tarrasch defense * +r1bqkbnr/pp2pppp/2n5/2pp4/3P4/1P2P3/P1P2PPP/RNBQKBNR b KQkq - +QGD: Alapin variation * +r1bqkbnr/pp2pppp/2n5/2pp4/3P4/2P1P3/PP3PPP/RNBQKBNR b KQkq - +QGD: semi-Slav * +r1bqkbnr/pp2pppp/2n5/2pp4/3P4/4P3/PPP1BPPP/RNBQK1NR b KQkq - +QGD: Charousek (Petrosian) variation * +r1bqkbnr/pp2pppp/2n5/2pp4/3P4/4P3/PPP2PPP/RNBQKBNR w KQkq - +QGD: 3.Nc3 * +r1bqkbnr/pp2pppp/2n5/2pp4/3P4/4PN2/PPP2PPP/RNBQKB1R b KQkq - +QGD: 3...Nf6 * +r1bqkbnr/pp2pppp/2n5/2pp4/3P4/5NP1/PPP1PP1P/RNBQKB1R b KQkq - +Gr\"unfeld defense * +r1bqkbnr/pp2pppp/2n5/2pp4/3P4/P3P3/1PP2PPP/RNBQKBNR b KQkq - +QGD: Janowski variation * +r1bqkbnr/pp2pppp/2n5/2pp4/3PP3/2P5/PP3PPP/RNBQKBNR b KQkq - +QGD Slav: Winawer counter-gambit * +r1bqkbnr/pp2pppp/2n5/2pp4/4P3/3P1N2/PPP2PPP/RNBQKB1R b KQkq - +Old Indian: Ukrainian variation * +r1bqkbnr/pp2pppp/2n5/2pp4/5B2/3P1N2/PPP1PPPP/RN1QKB1R b KQkq - +Old Indian: Janowski variation * +r1bqkbnr/pp2pppp/2n5/2pp4/5P2/4P3/PPPP2PP/RNBQKBNR w KQkq - +Dutch defense, Rubinstein variation * +r1bqkbnr/pp2pppp/2n5/2pp4/5P2/5N2/PPPPP1PP/RNBQKB1R w KQkq - +Dutch with c4 & Nc3 * +r1bqkbnr/pp2pppp/2n5/2pp4/5P2/6PN/PPPPP2P/RNBQKB1R b KQkq - +Dutch defense: Bladel variation * +r1bqkbnr/pp2pppp/2n5/2pp4/8/3P2P1/PPP1PPBP/RNBQK1NR b KQkq - +Modern defense * +r1bqkbnr/pp2pppp/2n5/2pp4/8/5NP1/PPPPPP1P/RNBQKB1R w KQkq - +King's Indian defense, 3.Nc3 * +r1bqkbnr/pp2pppp/2n5/3P4/3p4/4P3/PP3PPP/RNBQKBNR b KQkq - +QGD: Tarrasch, von Hennig-Schara gambit * +r1bqkbnr/pp2pppp/2n5/3p4/2PP4/8/PP3PPP/RNBQKBNR b KQkq - +QGD: Tarrasch defense, 4.cd ed * +r1bqkbnr/pp2pppp/2n5/3p4/3N4/6P1/PPP1PP1P/RNBQKB1R b KQkq - +Gr\"unfeld: exchange variation * +r1bqkbnr/pp2pppp/2n5/3p4/3NP3/8/PPP2PPP/RNBQKB1R w KQkq - +Sicilian: Nimzovich variation +r1bqkbnr/pp2pppp/2n5/3p4/3p4/4PN2/PPP2PPP/RNBQKB1R w KQkq - +QGD: exchange variation * +r1bqkbnr/pp2pppp/2n5/8/1pPp4/P4N2/3PPPPP/RNBQKB1R w KQkq - +Benk\"o gambit: Zaitsev system * +r1bqkbnr/pp2pppp/8/n2P4/1Pp5/8/P4PPP/RNBQKBNR b KQkq b3 +QGD: Tarrasch defense, Tarrasch gambit * +r1bqkbnr/pp3p1p/2n3p1/2ppp3/8/3P1NP1/PPP1PPBP/RNBQK2R w KQkq - +King's Indian with e4 & g3 * +r1bqkbnr/pp3pp1/2n4p/2ppp3/8/3P1NP1/PPP1PPBP/RNBQK2R w KQkq - +King's Indian: Makagonov system (5.h3) * +r1bqkbnr/pp3ppp/2n1p3/1Bpp4/2P5/4PN2/PP1P1PPP/RNBQK2R b KQkq - +Nimzo-Indian: 4.e3 c5 * +r1bqkbnr/pp3ppp/2n1p3/1Bpp4/8/1P2PN2/P1PP1PPP/RNBQK2R b KQkq - +Nimzo-Indian: Fischer variation * +r1bqkbnr/pp3ppp/2n1p3/1Bpp4/8/2N1PN2/PPPP1PPP/R1BQK2R b KQkq - +Nimzo-Indian: 4.e3, Taimanov variation * +r1bqkbnr/pp3ppp/2n1p3/1Bpp4/8/4PN2/PPPP1PPP/RNBQ1RK1 b kq - +Nimzo-Indian: 4.e3 O-O * +r1bqkbnr/pp3ppp/2n1p3/1Bpp4/8/4PN2/PPPP1PPP/RNBQK2R w KQkq - +Nimzo-Indian: 4.e3 * +r1bqkbnr/pp3ppp/2n1p3/2ppP3/3P4/2P2N2/PP3PPP/RNBQKB1R b KQkq - +French: advance, Paulsen attack +r1bqkbnr/pp3ppp/2n1p3/2ppP3/3P4/2P5/PP3PPP/RNBQKBNR w KQkq - +French: advance variation +r1bqkbnr/pp3ppp/2n5/2P1p3/1PPp4/5N2/P3PPPP/RNBQKB1R b KQkq - +QGA: Linares variation * +r1bqkbnr/pp3ppp/2n5/2Ppp3/8/2P5/PP2PPPP/RNBQKBNR w KQkq - +QGD Slav defense, Alekhine variation * +r1bqkbnr/pp3ppp/2n5/2p1p3/2PpP3/3P1NP1/PP3P1P/RNBQKB1R b KQkq - +Czech Benoni: King's Indian system * +r1bqkbnr/pp3ppp/2n5/2pp4/3P4/2N2NP1/PP2PP1P/R1BQKB1R b KQkq - +QGD: Tarrasch, Schlechter-Rubinstein system +r1bqkbnr/pp3ppp/2n5/2pp4/3P4/4PN2/PP3PPP/RNBQKB1R b KQkq - +Caro-Kann: Panov-Botvinnik attack, 5...e6 * +r1bqkbnr/pp3ppp/2n5/2pp4/3P4/5N2/PP2PPPP/RNBQKB1R w KQkq - +Caro-Kann: Panov-Botvinnik attack * +r1bqkbnr/pp3ppp/2n5/2pp4/3P4/5N2/PPPN1PPP/R1BQKB1R w KQkq - +French: Tarrasch, open variation, main line +r1bqkbnr/pp3ppp/2n5/2pp4/3P4/5NP1/PP2PP1P/RNBQKB1R b KQkq - +Caro-Kann: Panov-Botvinnik attack, 5...g6 * +r1bqkbnr/pp3ppp/2n5/2ppp3/3P4/2P1P3/PP3PPP/RNBQKBNR w KQkq - +QGD: semi-Slav, Marshall gambit * +r1bqkbnr/pp3ppp/2n5/2ppp3/5P2/3P2P1/PPP1P1BP/RNBQK1NR b KQkq - +Modern defense: Averbakh system, Randspringer variation * +r1bqkbnr/pp3ppp/2n5/2ppp3/8/2NP2P1/PPP1PPBP/R1BQK1NR b KQkq - +Modern defense: Averbakh system, Kotov variation * +r1bqkbnr/pp3ppp/2n5/2ppp3/8/3P2P1/PPP1PPBP/RNBQK1NR w KQkq - +Modern defense: Averbakh system * +r1bqkbnr/pp3ppp/2n5/2ppp3/8/5NP1/PPPPPPBP/RNBQK2R w KQkq - +King's Indian: 4.e4 * +r1bqkbnr/pp3ppp/2n5/3p4/2pP4/2N2NP1/PP2PP1P/R1BQKB1R w KQkq - +QGD: Tarrasch, Folkestone (Swedish) variation +r1bqkbnr/pp3ppp/2n5/3p4/2pPP3/2N2NP1/PP3P1P/R1BQKB1R b KQkq - +QGD: Tarrasch, Schlechter-Rubinstein system, Rey Ardid variation +r1bqkbnr/pp3ppp/2n5/3pp3/2PP4/8/PP3PPP/RNBQKBNR w KQkq - +QGD: Tarrasch defense, Marshall gambit * +r1bqkbnr/pp3ppp/2n5/4p3/2Pp4/3P1N2/PP3PPP/RNBQKB1R w KQkq - +Benoni: 6.e4 * +r1bqkbnr/pp3ppp/2n5/4p3/2Pp4/B2P1N2/4PPPP/RN1QKB1R w KQkq - +Benk\"o gambit: 7.e4 * +r1bqkbnr/pp3ppp/2np4/1N2p3/4P3/8/PPP2PPP/RNBQKB1R w KQkq - +Sicilian: Labourdonnais-L\"owenthal (Kalashnikov) variation +r1bqkbnr/pp4pp/2n2p2/2ppp3/8/3P1NP1/PPP1PPBP/RNBQ1RK1 b kq - +King's Indian: S\"amisch, 5...O-O * +r1bqkbnr/pp4pp/2n2p2/2ppp3/8/3P1NP1/PPP1PPBP/RNBQK2R w KQkq - +King's Indian: S\"amisch variation * +r1bqkbnr/pp4pp/2n5/2pppp2/8/3P1NP1/PPP1PPBP/RNBQK2R w KQkq - +King's Indian: Four pawns attack * +r1bqkbnr/pp4pp/2n5/4pp2/2Pp4/3P1NP1/PP3P1P/RNBQKB1R w KQkq - +Benoni: pawn storm variation * +r1bqkbnr/pp4pp/2n5/5p2/2Ppp3/3P1NP1/PP3PBP/RNBQK2R w KQkq - +Benoni: Mikenas variation * +r1bqkbnr/ppnppppp/2p5/8/3PP3/2N5/PPP2PPP/R1BQKBNR w KQkq - +de Bruycker defense +r1bqkbnr/ppp1pp1p/2n5/3p2p1/5P2/5N2/PPPPP1PP/RNBQKB1R w KQkq - +Dutch, Spielmann gambit * +r1bqkbnr/ppp1pp1p/2np2p1/8/2P5/2N5/PP1PPPPP/R1BQKBNR w KQkq - +Venezolana opening * +r1bqkbnr/ppp1pppp/2n5/3p2B1/3P4/8/PPP1PPPP/RN1QKBNR b KQkq - +Queen's pawn: Anti-Veresov * +r1bqkbnr/ppp1pppp/2n5/3p4/2PP4/8/PP2PPPP/RNBQKBNR w KQkq - +QGD: Chigorin defense +r1bqkbnr/ppp1pppp/2n5/3p4/3P4/5N2/PPP1PPPP/RNBQKB1R w KQkq - +Queen's pawn game, Chigorin variation +r1bqkbnr/ppp1pppp/2n5/3p4/3P4/8/PPP1PPPP/RNBQKBNR w KQkq - +Queen's pawn: Chigorin variation * +r1bqkbnr/ppp1pppp/2n5/3p4/3PP3/2N5/PPP2PPP/R1BQKBNR b KQkq - +KP: Nimzovich defense, Bogolyubov variation +r1bqkbnr/ppp1pppp/2n5/8/2Pp4/3P2P1/PP2PP1P/RNBQKBNR b KQkq - +Old Benoni: Schmid's system * +r1bqkbnr/ppp1pppp/2n5/8/2pP4/2N2N2/PP2PPPP/R1BQKB1R b KQkq - +QGD: Chigorin defense, Janowski variation +r1bqkbnr/ppp1pppp/2n5/8/Q1Pp4/5N2/PP1PPPPP/RNB1KB1R b KQkq - +Woozle defense * +r1bqkbnr/ppp2p1p/2n3p1/3pp3/8/3P1NP1/PPP1PP1P/RNBQKB1R w KQkq - +Pirc: Sveshnikov system * +r1bqkbnr/ppp2p1p/2n5/3pP1p1/8/5N2/PPPPP1PP/RNBQKB1R w KQkq - +Dutch: Staunton gambit, Tartakower variation * +r1bqkbnr/ppp2p1p/2np4/6N1/4PppP/2N5/PPPP2P1/R1BQKB1R w KQkq - +Vienna: Hamppe-Allgaier gambit, Alapin variation +r1bqkbnr/ppp2pp1/6n1/3p3p/8/2P3B1/PP2PPPP/RN1QKBNR w KQkq - +Caro-Kann: classical, 6.h4 * +r1bqkbnr/ppp2ppp/2n1p3/3p4/3PP3/8/PPPN1PPP/R1BQKBNR w KQkq - +French: Tarrasch, Guimard variation +r1bqkbnr/ppp2ppp/2n5/1B1p4/2PPp3/4P3/PP3PPP/RNBQK1NR b KQkq - +French: Winawer, advance variation * +r1bqkbnr/ppp2ppp/2n5/1B1p4/3Pp3/4P3/PPP2PPP/RNBQK1NR w KQkq - +French: Winawer, advance variation * +r1bqkbnr/ppp2ppp/2n5/1B1p4/3Pp3/4P3/PPPQ1PPP/RNB1K1NR b KQkq - +French: Winawer, Petrosian variation * +r1bqkbnr/ppp2ppp/2n5/1B1p4/3Pp3/4PN1P/PPP2PP1/RNBQK2R w KQkq - +French: MacCutcheon, Dr. Olland (Dutch) variation * +r1bqkbnr/ppp2ppp/2n5/1B1pp3/3P4/4P3/PPP2PPP/RNBQK1NR b KQkq - +French: Winawer (Nimzovich) variation * +r1bqkbnr/ppp2ppp/2n5/3p4/3Pp3/4PN2/PPP2PPP/RNBQKB1R w KQkq - +French: Steinitz variation * +r1bqkbnr/ppp2ppp/2n5/3p4/3Q4/2N5/PPP1PPPP/R1B1KBNR w KQkq - +KP: Nimzovich defense, Marshall gambit * +r1bqkbnr/ppp2ppp/2n5/3p4/Q3P3/8/PPP2PPP/RNB1KBNR b KQkq - +Scandinavian: Anderssen counter-attack * +r1bqkbnr/ppp2ppp/2n5/3pP3/8/4P3/PPP2PPP/RNBQKBNR b KQkq - +French: Rubinstein variation * +r1bqkbnr/ppp2ppp/2n5/3pp3/1P1P4/2P5/P3PPPP/RNBQKBNR b KQkq - +Caro-Kann: Gurgenidze counter-attack * +r1bqkbnr/ppp2ppp/2n5/3pp3/2PP4/4P3/PP3PPP/RNBQKBNR b KQkq - +French: Marshall variation * +r1bqkbnr/ppp2ppp/2n5/3pp3/3P4/2N5/PPP1PPPP/R1BQKBNR w KQkq - +KP: Nimzovich defense, Bogolyubov variation * +r1bqkbnr/ppp2ppp/2n5/3pp3/3P4/2P3P1/PP2PP1P/RNBQKBNR b KQkq - +Caro-Kann: Gurgenidze system * +r1bqkbnr/ppp2ppp/2n5/3pp3/3P4/2P5/PP2PPPP/RNBQKBNR w KQkq - +Caro-Kann defense * +r1bqkbnr/ppp2ppp/2n5/3pp3/3P4/4P3/PPP2PPP/RNBQKBNR w KQkq - +French: Paulsen variation * +r1bqkbnr/ppp2ppp/2n5/3pp3/3P4/4PN2/PPP2PPP/RNBQKB1R b KQkq - +French defense * +r1bqkbnr/ppp2ppp/2n5/3pp3/3P4/5N2/PPP1PPPP/RNBQKB1R w KQkq - +Blackmar-Diemer gambit * +r1bqkbnr/ppp2ppp/2n5/3pp3/3PP3/5N2/PPP2PPP/RNBQKB1R b KQkq - +Blackmar-Diemer: Lemberg counter-gambit * +r1bqkbnr/ppp2ppp/2n5/3pp3/4P3/2N5/PPPP1PPP/R1BQKBNR w KQkq - +Vienna: Fyfe gambit * +r1bqkbnr/ppp2ppp/2n5/3pp3/8/2P5/PPNPPPPP/R1BQKBNR b KQkq - +de Bruycker defense * +r1bqkbnr/ppp2ppp/2n5/3pp3/8/2PP1N2/PP2PPPP/RNBQKB1R b KQkq - +Pirc: Ufimtsev-Pytel variation * +r1bqkbnr/ppp2ppp/2n5/3pp3/8/3P1NP1/PPP1PP1P/RNBQKB1R b KQkq - +Pirc defense * +r1bqkbnr/ppp2ppp/2n5/3pp3/8/3P2P1/PPP1PPBP/RNBQK1NR b KQkq - +Robatsch (modern) defense * +r1bqkbnr/ppp2ppp/2n5/3pp3/8/6P1/PPPPPPBP/RNBQK1NR w KQkq - +Robatsch defense * +r1bqkbnr/ppp2ppp/2n5/4P3/2Pp4/5N2/PP1NPPPP/R1BQKB1R b KQkq - +QGD: Albin counter-gambit, Alapin variation +r1bqkbnr/ppp2ppp/2n5/4P3/2Pp4/5NP1/PP2PP1P/RNBQKB1R b KQkq - +QGD: Albin counter-gambit, 5.g3 +r1bqkbnr/ppp2ppp/2np4/1B2p3/4P3/5N2/PPPP1PPP/RNBQK2R w KQkq - +Ruy Lopez: old Steinitz defense +r1bqkbnr/ppp2ppp/3p4/8/3QP3/3B4/PPP2PPP/RNB1K2R b KQkq - +Scotch: Ghulam Kassim variation +r1bqkbnr/ppp2ppp/8/3p4/8/2P2P2/PP2PP1P/RNBQKB1R b KQkq - +Caro-Kann: Bronstein-Larsen variation * +r1bqkbnr/ppp2ppp/8/3p4/8/2P2P2/PP3PPP/RNBQKB1R b KQkq - +Caro-Kann: Tartakower (Nimzovich) variation * +r1bqkbnr/ppp2ppp/8/3pn3/3Q4/4P3/PPP2PPP/RNB1KBNR b KQkq - +French: Frere (Becker) variation * +r1bqkbnr/ppp2ppp/8/3pn3/5B2/2P5/PP2PPPP/RN1QKBNR b KQkq - +Caro-Kann: classical variation * +r1bqkbnr/ppp2ppp/8/3pn3/8/2P5/PP1NPPPP/R1BQKBNR b KQkq - +Caro-Kann: Steinitz variation * +r1bqkbnr/ppp2ppp/8/3pn3/8/2P5/PP2PPPP/RNBQKBNR w KQkq - +Caro-Kann defense * +r1bqkbnr/ppp2ppp/8/3pn3/8/4P3/PPPN1PPP/R1BQKBNR b KQkq - +French: Rubinstein variation * +r1bqkbnr/ppp3pp/2n2p2/3pP3/8/2P5/PP2PPPP/RNBQKBNR w KQkq - +Caro-Kann: Rasa-Studier gambit * +r1bqkbnr/ppp3pp/2n2p2/3pp3/Q3P3/2P2N2/PP1P1PPP/RNB1KB1R w KQkq - +Ponziani: Steinitz variation +r1bqkbnr/ppp3pp/2n2p2/4P3/2Pp4/5N2/PP1NPPPP/R1BQKB1R w KQkq - +QGD: Albin counter-gambit, Janowski variation +r1bqkbnr/ppp3pp/2n5/3p1p2/3Pp2P/2P3P1/PP2PPB1/RNBQK1NR b KQkq - +Robatsch defense: Gurgenidze variation * +r1bqkbnr/ppp3pp/2n5/3ppP2/8/2N5/PPPP1PPP/R1BQKBNR w KQkq - +Vienna: Steinitz gambit * +r1bqkbnr/ppp3pp/2n5/3ppp2/8/3P1NP1/PPP1PP1P/RNBQKB1R w KQkq - +Pirc: Austrian attack * +r1bqkbnr/ppp3pp/2n5/3ppp2/8/3P2P1/PPP1PPBP/RNBQK1NR w KQkq - +Robatsch defense: Pseudo-Austrian attack * +r1bqkbnr/ppp3pp/2n5/5p2/2pPp3/2N1P3/PP1N1PPP/R1BQKB1R b KQkq - +French: Steinitz variation * +r1bqkbnr/ppp3pp/2np4/3Ppp2/4P3/2P2N2/PP3PPP/RNBQKB1R b KQkq - +Ponziani counter-gambit, Schmidt attack +r1bqkbnr/ppp3pp/2np4/4N3/3Pp3/8/PPP2PPP/RNBQKB1R w KQkq - +Vienna gambit * +r1bqkbnr/ppp3pp/2np4/4pp2/3PP3/5N2/PPP2PPP/RNBQKB1R w KQkq - +Vienna gambit, Steinitz variation * +r1bqkbnr/ppp3pp/6n1/3p1p2/8/2P3B1/PP2PPPP/RN1QKBNR w KQkq - +Caro-Kann: classical, Mar\'oczy attack * +r1bqkbnr/pppn1ppp/3p4/4p3/3PP3/5N2/PPP2PPP/RNBQKB1R w KQkq - +Philidor: Hanham variation +r1bqkbnr/pppn1ppp/4p3/8/3PN3/8/PPP2PPP/R1BQKBNR w KQkq - +French: Rubinstein variation +r1bqkbnr/pppn1ppp/8/3p4/2PP4/8/PP3PPP/RNBQKBNR b KQkq - +French: Tarrasch, open, 4.ed ed * +r1bqkbnr/pppn1ppp/8/3pp3/2PP4/4P3/PP3PPP/RNBQKBNR b KQkq - +French: Tarrasch, open variation * +r1bqkbnr/pppn1ppp/8/3pp3/3P1P2/4P3/PPP3PP/RNBQKBNR b KQkq - +French: Tarrasch, Haberditz variation * +r1bqkbnr/pppn1ppp/8/3pp3/3P4/1QP5/PP2PPPP/RNB1KBNR b KQkq - +Caro-Kann: Edinburgh variation * +r1bqkbnr/pppn1ppp/8/3pp3/3P4/2N1P3/PPP2PPP/R1BQKBNR b KQkq - +French: Tarrasch, Guimard variation * +r1bqkbnr/pppn1ppp/8/3pp3/3P4/2P5/PP2PPPP/RNBQKBNR w KQkq - +Caro-Kann: 3.Nd2 * +r1bqkbnr/pppn1ppp/8/3pp3/3P4/4P3/PPP2PPP/RNBQKBNR w KQkq - +French: Tarrasch * +r1bqkbnr/pppn1ppp/8/3pp3/3P4/4PN2/PPP2PPP/RNBQKB1R b KQkq - +French: Tarrasch, closed variation * +r1bqkbnr/pppn2pp/3p4/4Pp2/3p4/5N2/PPP2PPP/RNBQKB1R w KQkq - +KGD: Falkbeer, Keres variation * +r1bqkbnr/pppnpppp/3p4/8/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +Valencia opening * +r1bqkbnr/pppp1p1p/2n3p1/1B2p3/4P3/5N2/PPPP1PPP/RNBQK2R w KQkq - +Ruy Lopez: fianchetto (Smyslov/Barnes) defense +r1bqkbnr/pppp1p1p/2n3p1/3N4/3pP3/5N2/PPP2PPP/R1BQKB1R b KQkq - +Three knights: Steinitz, Rosenthal variation +r1bqkbnr/pppp1p1p/2n3p1/4p3/2P5/2N5/PP1PPPPP/R1BQKBNR w KQkq - +Sicilian: closed * +r1bqkbnr/pppp1p1p/2n3p1/4p3/2PP4/4P3/PP3PPP/RNBQKBNR b KQkq - +Sicilian: closed, Korchnoi variation * +r1bqkbnr/pppp1p1p/2n3p1/4p3/4P3/2N2N2/PPPP1PPP/R1BQKB1R w KQkq - +Three knights: Steinitz variation +r1bqkbnr/pppp1p1p/2n3p1/4p3/4P3/2N5/PPPP1PPP/R1BQKBNR w KQkq - +Vienna: Paulsen variation * +r1bqkbnr/pppp1p1p/2n3p1/4p3/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - +Vienna: Paulsen-Mieses variation * +r1bqkbnr/pppp1p1p/2n5/1B2p1p1/4P3/5N2/PPPP1PPP/RNBQK2R w KQkq - +Ruy Lopez: Brentano defense +r1bqkbnr/pppp1p1p/2n5/4N3/4PppP/8/PPPP2P1/RNBQKB1R w KQkq - +KGA: Kieseritsky, Neumann defense +r1bqkbnr/pppp1p1p/2n5/6N1/4PppP/2N5/PPPP2P1/R1BQKB1R b KQkq - +Vienna: Hamppe-Allgaier gambit +r1bqkbnr/pppp1p1p/2n5/6p1/2B1Pp2/5N2/PPPP2PP/RNBQK2R w KQkq - +KGA: Blachly gambit +r1bqkbnr/pppp1p1p/2n5/6p1/3PPp2/2N2N2/PPP3PP/R1BQKB1R b KQkq - +Vienna: Pierce gambit +r1bqkbnr/pppp1p1p/2n5/8/2B1Pp2/5Q2/PPPP2PP/RNB2RK1 w kq - +KGA: Muzio gambit, Holloway defense +r1bqkbnr/pppp1p1p/2n5/8/2B1Ppp1/2N2N2/PPPP2PP/R1BQ1RK1 b kq - +Vienna: Hamppe-Muzio gambit +r1bqkbnr/pppp1ppp/2n5/1B2p3/4P3/5N2/PPPP1PPP/RNBQK2R b KQkq - +Ruy Lopez (Spanish opening) +r1bqkbnr/pppp1ppp/2n5/1B6/3pP3/5N2/PPP2PPP/RNBQK2R b KQkq - +Scotch: Relfsson gambit (`MacLopez') +r1bqkbnr/pppp1ppp/2n5/4p3/2B1P3/2P2N2/P2P1PPP/RNBQK2R w KQkq - +Evans gambit: Mayet defense +r1bqkbnr/pppp1ppp/2n5/4p3/2B1P3/5N2/PPPP1PPP/RNBQK2R b KQkq - +King's pawn game +r1bqkbnr/pppp1ppp/2n5/4p3/2P1P3/5N2/PP1P1PPP/RNBQKB1R b KQkq - +Dresden opening +r1bqkbnr/pppp1ppp/2n5/4p3/2P5/2N2N2/PP1PPPPP/R1BQKB1R b KQkq - +English: three knights system +r1bqkbnr/pppp1ppp/2n5/4p3/2P5/2N5/PP1PPPPP/R1BQKBNR b KQkq - +Sicilian: closed, 2...Nc6 * +r1bqkbnr/pppp1ppp/2n5/4p3/2P5/2N5/PP1PPPPP/R1BQKBNR w KQkq - +English: Sicilian reversed +r1bqkbnr/pppp1ppp/2n5/4p3/2P5/8/PP1PPPPP/RNBQKBNR w KQkq - +Sicilian: closed * +r1bqkbnr/pppp1ppp/2n5/4p3/3P4/5N2/PPP1PPPP/RNBQKB1R b KQkq - +Alekhine's defense: Scandinavian variation * +r1bqkbnr/pppp1ppp/2n5/4p3/3PP3/2N5/PPP2PPP/R1BQKBNR b KQkq - +Vienna: Fyfe gambit +r1bqkbnr/pppp1ppp/2n5/4p3/3PP3/5N2/PPP2PPP/RNBQKB1R b KQkq - +Scotch opening +r1bqkbnr/pppp1ppp/2n5/4p3/4P3/2N2N2/PPPP1PPP/R1BQKB1R b KQkq - +Three knights game +r1bqkbnr/pppp1ppp/2n5/4p3/4P3/2N3P1/PPPP1P1P/R1BQKBNR b KQkq - +Vienna: Paulsen variation +r1bqkbnr/pppp1ppp/2n5/4p3/4P3/2N5/PPPP1PPP/R1BQKBNR b KQkq - +Vienna game, Max Lange defense * +r1bqkbnr/pppp1ppp/2n5/4p3/4P3/2N5/PPPP1PPP/R1BQKBNR w KQkq - +Vienna game, Max Lange defense +r1bqkbnr/pppp1ppp/2n5/4p3/4P3/2P2N2/PP1P1PPP/RNBQKB1R b KQkq - +Ponziani opening +r1bqkbnr/pppp1ppp/2n5/4p3/4P3/5N2/PPPP1PPP/RNBQKB1R b KQkq - +Vienna: Falkbeer variation * +r1bqkbnr/pppp1ppp/2n5/4p3/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - +King's pawn game +r1bqkbnr/pppp1ppp/2n5/4p3/4P3/5N2/PPPPBPPP/RNBQK2R b KQkq - +Inverted Hungarian +r1bqkbnr/pppp1ppp/2n5/4p3/4P3/5NP1/PPPP1P1P/RNBQKB1R b KQkq - +Konstantinopolsky opening +r1bqkbnr/pppp1ppp/2n5/4p3/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +Vienna game * +r1bqkbnr/pppp1ppp/2n5/4p3/4PP2/2N5/PPPP2PP/R1BQKBNR b KQkq - +Vienna gambit +r1bqkbnr/pppp1ppp/2n5/4p3/8/2P5/PP1PPPPP/RNBQKBNR w KQkq - +Caro-Kann defense * +r1bqkbnr/pppp1ppp/2n5/4p3/8/4P3/PPPP1PPP/RNBQKBNR w KQkq - +French defense * +r1bqkbnr/pppp1ppp/2n5/8/2B1Pp2/8/PPPP2PP/RNBQK1NR w KQkq - +KGA: bishop's gambit, Maurian defense +r1bqkbnr/pppp1ppp/2n5/8/2BpP3/5N2/PPP2PPP/RNBQK2R b KQkq - +Scotch gambit +r1bqkbnr/pppp1ppp/2n5/8/2Q1P3/8/PPP2PPP/RNB1KBNR b KQkq - +Center game: Hall variation +r1bqkbnr/pppp1ppp/2n5/8/3NP3/8/PPP2PPP/RNBQKB1R b KQkq - +Scotch game +r1bqkbnr/pppp1ppp/2n5/8/3Np3/8/PPPPPPPP/RNBQKB1R w KQkq - +Alekhine's defense: S\"amisch attack * +r1bqkbnr/pppp1ppp/2n5/8/3P4/4p3/PPPNPPPP/RNBQKB1R w KQkq - +Alekhine's defense: Spielmann variation * +r1bqkbnr/pppp1ppp/2n5/8/3PPp2/2N5/PPP3PP/R1BQKBNR b KQkq - +Vienna: Steinitz gambit +r1bqkbnr/pppp1ppp/2n5/8/3QP3/8/PPP2PPP/RNB1KBNR w KQkq - +Center game +r1bqkbnr/pppp1ppp/2n5/8/3pP3/2P2N2/PP3PPP/RNBQKB1R b KQkq - +Scotch: G\"oring gambit +r1bqkbnr/pppp1ppp/2n5/8/4P3/4Q3/PPP2PPP/RNB1KBNR b KQkq - +Center game: Paulsen attack +r1bqkbnr/pppp1ppp/2n5/8/4Pp2/2N2N2/PPPP2PP/R1BQKB1R b KQkq - +Vienna gambit +r1bqkbnr/pppp1ppp/2n5/8/8/3Q4/PPP1PPPP/RNB1KBNR b KQkq - +Scandinavian: Pytel-Wade variation * +r1bqkbnr/pppp1ppp/8/1B2p3/3nP3/5N2/PPPP1PPP/RNBQK2R w KQkq - +Ruy Lopez: Bird's defense +r1bqkbnr/pppp1ppp/8/4n3/3PP3/8/PPP2PPP/RNBQKB1R b KQkq - +Irish (Chicago) gambit +r1bqkbnr/pppp1ppp/8/4p3/3nP3/5N2/PPP2PPP/RNBQKB1R w KQkq - +Scotch: Lolli variation +r1bqkbnr/pppp1ppp/8/nB2p3/4P3/5N2/PPPP1PPP/RNBQK2R w KQkq - +Ruy Lopez: Pollock defense +r1bqkbnr/pppp2pp/2n2p2/1B2p3/4P3/5N2/PPPP1PPP/RNBQK2R w KQkq - +Ruy Lopez: Nuremberg variation +r1bqkbnr/pppp2pp/2n5/1B2pp2/4P3/2N2N2/PPPP1PPP/R1BQK2R b KQkq - +Ruy Lopez: Schliemann defense, Berger variation +r1bqkbnr/pppp2pp/2n5/1B2pp2/4P3/5N2/PPPP1PPP/RNBQK2R w KQkq - +Ruy Lopez: Schliemann defense +r1bqkbnr/pppp2pp/2n5/4Np2/4P3/8/PPPP1PPP/RNBQKB1R w KQkq - +Latvian: Fraser defense +r1bqkbnr/pppp2pp/2n5/4pP2/8/8/PPPP1PPP/RNBQKBNR w KQkq - +KGA: Keres (Mason-Steinitz) gambit * +r1bqkbnr/pppp2pp/2n5/4pp2/2B1P3/5N2/PPPP1PPP/RNBQK2R w KQkq - +Rousseau gambit +r1bqkbnr/pppp2pp/2n5/4pp2/2P5/2N5/PP1PPPPP/R1BQKBNR w KQkq - +Sicilian: Grand Prix attack * +r1bqkbnr/pppp2pp/2n5/4pp2/3P4/4P3/PPP2PPP/RNBQKBNR w KQkq - +French: Pelikan variation * +r1bqkbnr/pppp2pp/2n5/4pp2/3PP3/5N2/PPP2PPP/RNBQKB1R b KQkq - +Vienna gambit * +r1bqkbnr/pppp2pp/2n5/4pp2/3PP3/8/PPP2PPP/RNBQKBNR w KQkq - +KGD: Falkbeer, Milner-Barry variation * +r1bqkbnr/pppp2pp/2n5/4pp2/4P3/2N2N2/PPPP1PPP/R1BQKB1R w KQkq - +Three knights: Winawer defense (Gothic defense) +r1bqkbnr/pppp2pp/2n5/4pp2/4P3/2N5/PPPP1PPP/R1BQKBNR w KQkq - +Vienna gambit * +r1bqkbnr/pppp2pp/2n5/4pp2/4P3/2P2N2/PP1P1PPP/RNBQKB1R w KQkq - +Ponziani counter-gambit +r1bqkbnr/pppp2pp/2n5/4pp2/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - +Vienna gambit * +r1bqkbnr/pppp2pp/2n5/5p2/4P3/4Q3/PPP2PPP/RNB1KBNR w KQkq - +Center game: l'Hermet variation +r1bqkbnr/pppp3p/2n5/4Ppp1/8/5N2/PPPPP1PP/RNBQKB1R w KQkq - +Bird's opening, Swiss gambit * +r1bqkbnr/ppppp1pp/2n2p2/8/3PP3/8/PPP2PPP/RNBQKBNR w KQkq - +KP: Neo-Mongoloid defense +r1bqkbnr/ppppp1pp/2n5/5p2/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - +KP: Colorado counter +r1bqkbnr/pppppppp/2n5/8/3P4/8/PPP1PPPP/RNBQKBNR w KQkq - +Queen's pawn: Lundin (Kevitz-Mikenas) defense +r1bqkbnr/pppppppp/2n5/8/3PP3/2P5/P4PPP/RNBQKBNR b KQkq - +KP: Nimzovich defense, Wheeler gambit +r1bqkbnr/pppppppp/2n5/8/3PP3/8/PPP2PPP/RNBQKBNR b KQkq - +KP: Nimzovich defense +r1bqkbnr/pppppppp/2n5/8/4P3/5N2/PPPP1PPP/RNBQKB1R b KQkq - +KP: Nimzovich defense +r1bqkbnr/pppppppp/2n5/8/4P3/8/PPPP1PPP/RNBQKBNR b KQkq - +Dunst (Sleipner,Heinrichsen) opening * +r1bqkbnr/pppppppp/2n5/8/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +KP: Nimzovich defense +r1bqkbnr/pppppppp/2n5/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - +Dunst (Sleipner, Heinrichsen) opening * +r1bqkbnr/pppppppp/n7/8/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +Lemming defense +r1bqkbnr/pppppppp/n7/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - +Durkin's attack * +r1bqnrk1/p2p1ppp/1pn1p3/2p5/2PPP3/P1PB4/4NPPP/R1BQK2R w KQ - +Nimzo-Indian: S\"amisch, Capablanca variation +r1bqnrk1/pp2b1pp/2n2p2/2p1p3/3pPP2/3P2P1/PPPNN1BP/R1BQ1RK1 b - - +King's Indian: orthodox, Aronin-Taimanov, main line * +r1bqnrk1/pp2b2p/2n2p2/2p1p1p1/3pPP2/3P2P1/PPPNN1BP/R1BQ1RK1 w - - +King's Indian: orthodox, Aronin-Taimanov, Benk\"o attack * +r1bqnrk1/pp2bppp/2n5/2p1p3/3pP3/3P1NP1/PPP1NPBP/R1BQ1RK1 w - - +King's Indian: orthodox, Aronin-Taimanov, 9.Ne1 * +r1bqr1k1/1p1n1pbp/p2p1np1/2pP4/P7/2N3P1/1P1NPPBP/R1BQ1RK1 w - - +Benoni: fianchetto, 11...Re8 +r1bqr1k1/p1p2ppp/2pp1n2/4p3/1b2P3/2NP1N2/PPP2PPP/R1BQ1RK1 w - - +Four knights: Janowski variation * +r1bqr1k1/pp1n1ppp/2p2n2/b2pp3/4P3/P1NP1N2/1PP1BPPP/R2QBRK1 b - - +Ruy Lopez: Kecskem\'et variation * +r1bqr1k1/pp1n1ppp/2pb1n2/3pN1B1/3P1P2/2N5/PPP1B1PP/R2QK2R w KQ - +Petrov: classical attack, Berger variation * +r1bqr1k1/pp2bppp/2n2n2/2ppp3/4P3/3P1NP1/PPPN1PBP/R1BQ1RK1 w - - +King's Indian: orthodox, 7...Nbd7, 8.Re1 * +r1bqr1k1/pp2ppbp/2n2np1/2pp4/5P2/3PPN2/PPP1B1PP/RNB1QRK1 w - - +Dutch: Ilyin-Genevsky, Winter variation * +r1bqr1k1/pp3pbp/n2p1np1/2pP4/4P3/2N2P2/PP1NB1PP/R1BQ1RK1 b - - +Benoni: classical, 11.f3 +r1bqr1k1/pp3pbp/n2p1np1/2pP4/4P3/2N5/PP1NBPPP/R1BQ1RK1 w - - +Benoni: classical with ...Re8 and ...Na6 +r1bqr1k1/ppb2pp1/2p1nn1p/3pp3/NPP1P3/P2P1NP1/2QBBP1P/R3R1K1 b - - +Ruy Lopez: closed, Chigorin, Yugoslav system * +r1bqr1k1/ppbn1pp1/2p2n1p/3pp3/1PP1P3/P1NP1N2/2Q1BPPP/R1B2RK1 b - - +Ruy Lopez: closed, Chigorin, 12...Nc6 * +r1bqr1k1/ppbn1pp1/2p2n1p/3pp3/1PP1P3/P2P1N2/1B1NBPPP/R2Q1RK1 b - - +Ruy Lopez: closed, Breyer, Gligori\'c variation * +r1bqr1k1/ppbn1pp1/2p2n1p/4p3/1PPpP1P1/P2P1N2/2Q1BP1P/RNB1K2R b KQ - +Ruy Lopez: closed, Leonhardt variation * +r1bqr1k1/ppbn1pp1/2p2n1p/4p3/1Pp1P3/P1NP1N2/2Q1BPPP/R1B2RK1 w - - +Ruy Lopez: closed, Chigorin, Rauzer attack * +r1bqr1k1/ppbn1pp1/5n1p/3pp3/NP2P3/P2P1N2/2Q1BPPP/R1B2RK1 w - - +Ruy Lopez: closed, Chigorin, 12...c5d4 * +r1bqr1k1/ppp2ppp/2n2n2/2bPN3/3P4/2N5/PPP2PPP/R1BQKB1R w KQ - +two knights defense: Canal variation * +r1bqr1k1/ppp2ppp/2n2n2/3pp3/1b2P3/2NP1N2/PPPBBPPP/R2Q1RK1 b - - +Ruy Lopez: Berlin defense, Tarrasch trap * +r1bqr1k1/ppp2ppp/2n2n2/4N3/3PpP2/P1P5/2P3PP/R1BQKB1R w KQ - +Ruy Lopez: Steinitz defense deferred, Boleslavsky variation * +r1bqr1k1/ppp2ppp/2np1n2/8/1bB1P3/2N1Q2N/PPPB1PPP/2KR3R b - - +Center game: Kupreichik variation +r1bqr1k1/ppp2ppp/8/2PPn3/2B2Qn1/2N1Bp2/PPP2PPP/R3K2R w KQ - +two knights: Max Lange attack, Marshall variation * +r1bqr1k1/ppp2ppp/8/2PPn3/5Qn1/2N1Bp2/PPP2PPP/R3KB1R b KQ - +two knights: Max Lange attack, Rubinstein variation * +r1bqr1k1/ppp2ppp/8/3pn3/3Q4/P1P1B3/1PP2PPP/R3KB1R b KQ - +Four knights: Spielmann variation * +r1bqr1k1/ppp4p/8/2PPnpp1/6n1/1BN1BpQ1/PPP2PPP/2KR3R b - - +two knights: Max Lange attack, Berger variation * +r1bqr1k1/pppn1pbp/3p1np1/4p3/2PP4/2N1PN2/PP2BPPP/R1BQ1RK1 w - - +R\'eti: King's Indian attack, French variation * +r1bqr1k1/pppp1ppp/2n2n2/3NpQ2/1bP5/4PN2/PP1P1PPP/R1B1KB1R b KQ - +English: four knights, Stean variation +r1bqrbk1/pp3ppp/2n2n2/2ppp3/P3P3/2PP1NP1/1P1N1PBP/R1BQ1RK1 b - - +King's Indian: orthodox, 7...Nbd7, main line * +r1bqrnk1/ppp1bppp/5n2/3p2B1/3P4/2NBP3/PPQ1NPPP/2KR3R b - - +QGD: exchange, chameleon variation +r1br2k1/p1q1ppbp/1pn2np1/2pp4/1P1P4/2P1PN2/PB1NBPPP/R2Q1RK1 b - - +Catalan: closed, Spassky gambit * +r1br2k1/p3ppbp/1pn2np1/2pq4/8/PP1PPN2/1B1NBPPP/R2QK2R b KQ - +English: symmetrical, hedgehog, flexible formation * +r1br2k1/p4ppp/1qn2n2/2b5/B3p3/2N3Q1/PPPPNPPP/R1B1K2R w KQ - +Evans gambit: compromised defense, Potter variation * +r1br2k1/pp2qppp/1bn1pn2/3p4/1PP5/P2BPN2/1B1N1PPP/R2QK2R b KQ - +QGA: classical, Smyslov variation * +r1br2k1/ppq2ppp/2n1pn2/2P5/1P1p4/P3PN2/1BQ2PPP/R3KB1R b KQ - +QGA: classical, Flohr variation * +r1q2rk1/pp2ppbp/2npbnp1/8/4PP2/1NN1B3/PPP1B1PP/R2Q1RK1 w - - +Sicilian: dragon, classical, R\'eti-Tartakower variation +r1r3k1/pp1bppbp/2np1np1/q7/3NP2P/1BN1BP2/PPPQ2P1/2KR3R b - - +Sicilian: dragon, Yugoslav attack, 12.h4 +r2n1rk1/ppp1qppp/3p1n2/1B2p1B1/3PP1b1/2P2N2/P1P2PPP/R2QR1K1 w - - +Four knights: symmetrical, Capablanca variation +r2q1bnr/ppp1kBpp/3p4/3NN3/4P3/8/PP3PPP/R1Bb1RK1 b - - +Scotch: Sea-cadet mate +r2q1knr/pppb1Bpp/1b1p4/n7/3PP3/2N2N2/P1Q2PPP/R1B2RK1 b - - +Evans gambit: Fraser-Mortimer attack +r2q1rk1/1b1nbppp/p2p1n2/1pp1p3/3PP3/2P2N1P/PPBN1PP1/R1BQR1K1 w - - +Ruy Lopez: closed, Breyer, Gligori\'c variation +r2q1rk1/1bp1bppp/p1np1n2/1p2p3/4P3/1BP2N1P/PP1P1PP1/RNBQR1K1 w - - +Ruy Lopez: closed, Flohr-Zaitsev system (Lenzerheide variation) +r2q1rk1/2p1bppp/p1n1b3/1p1pP3/4n3/1BP2N2/PP1NQPPP/R1B2RK1 b - - +Ruy Lopez: open, Malkin variation +r2q1rk1/2p1bppp/p1np1n2/1p2p3/3PP1b1/1BP2N2/PP3PPP/RNBQR1K1 w - - +Ruy Lopez: closed, Bogolyubov variation +r2q1rk1/2p1bppp/p1npbn2/1p2p3/4P3/1BP2N1P/PP1P1PP1/RNBQR1K1 w - - +Ruy Lopez: closed, Kholmov variation +r2q1rk1/2p1bppp/p3b3/1p1pn3/3Nn3/1BP5/PP3PPP/RNBQR1K1 w - - +Ruy Lopez: open, Breslau variation +r2q1rk1/2p2ppp/p1n1b3/1pbpP3/8/2P2N2/PPBN1nPP/R1BQ1RK1 w - - +Ruy Lopez: open, Dilworth variation +r2q1rk1/3nbppp/bpp1pn2/p2p4/2PP4/1P3NP1/PBQNPPBP/R4RK1 w - - +Catalan: closed, Sokolsky variation +r2q1rk1/p1p2ppp/2pp1n2/4p3/1b2P1b1/2NP1N2/PPP1QPPP/R1B2RK1 b - - +Four knights: symmetrical, Metger unpin * +r2q1rk1/p3bppp/1pn1bn2/2pp2B1/3P4/2N2NP1/PP2PPBP/2RQ1RK1 w - - +QGD: Tarrasch, Stoltz variation +r2q1rk1/p3n1pp/2p1bp2/3pp1B1/N1P5/6P1/PP2PbBP/R2Q1RK1 w - - +Gr\"unfeld: exchange, Seville variation * +r2q1rk1/p3n1pp/3bbp2/3pp3/N7/4B1P1/PP2PPBP/R2Q1RK1 b - - +Gr\"unfeld: Spassky variation, main line, 13.Bd3 * +r2q1rk1/p3n1pp/3bbp2/4p3/N2p4/4B1P1/PP2PPBP/R2Q1RK1 w - - +Gr\"unfeld: exchange, Sokolsky variation * +r2q1rk1/p3nppp/4b3/2bpp3/8/2N3P1/PP2PPBP/R1BQ1RK1 w - - +Gr\"unfeld: Spassky variation, main line, 10...cd, 11.cd * +r2q1rk1/p4ppp/2n1bn2/2bpp3/N7/1B1P1P2/PPP3PP/R1BQK1NR w KQ - +Evans gambit: Steinitz variation * +r2q1rk1/p4ppp/2n2n2/2bpp3/N5b1/1B1P4/PPP2PPP/R1BQK1NR w KQ - +Evans gambit: G\"oring attack * +r2q1rk1/p4ppp/b1B2n2/2bp4/8/2N5/PPPP1PPP/R1BQK2R w KQ - +Giuoco Piano: Aitken variation * +r2q1rk1/p4ppp/b1p2n2/2bpN3/3P4/2N5/PPP2PPP/R1BQK2R w KQ - +Giuoco Piano: Steinitz variation * +r2q1rk1/pb1nbppp/2p1pn2/1p1p4/2PP4/1PN2NP1/P1Q1PPBP/R1BR2K1 w - - +Catalan: closed, Spassky gambit +r2q1rk1/pp1bbppp/2nppn2/8/4PP2/1NN1B3/PPP1B1PP/R2Q1RK1 b - - +Sicilian: modern Scheveningen, main line with Nb3 +r2q1rk1/pp1bppbp/2np1np1/8/2BNP3/2N1BP2/PPPQ2PP/2KR3R b - - +Sicilian: dragon, Yugoslav attack, 10.O-O-O +r2q1rk1/pp1bppbp/2np1np1/8/2BNP3/2N1BP2/PPPQ2PP/R3K2R w KQ - +Sicilian: dragon, Yugoslav attack, 9...Bd7 +r2q1rk1/pp2b1pp/2n1bn2/2pp4/4pB2/1NN1P3/PPPQBPPP/2KR3R b - - +Alekhine's defense: four pawns attack, Tartakower variation * +r2q1rk1/pp2bpp1/2n2n1p/2pp1b2/5B2/1NNP2P1/PP2PPBP/R2Q1RK1 w - - +Alekhine's defense: exchange, Karpov variation * +r2q1rk1/pp2bppp/2n1bn2/3p2B1/2pP4/2N2NP1/PP2PPBP/2RQ1RK1 w - - +QGD: Tarrasch, Bogolyubov variation +r2q1rk1/pp2bppp/2npbn2/2p3B1/4P3/2N2N2/PPP1BPPP/R2QR1K1 b - - +Philidor: Berger variation +r2q1rk1/pp2pBbp/6p1/n1p5/3PP1b1/2P1BP2/P3N1PP/R2Q1RK1 b - - +Gr\"unfeld: exchange, Seville variation +r2q1rk1/pp2ppbp/1nnp2p1/5b2/2PP1B2/2N2N1P/PP2BPP1/R2Q1RK1 b - - +Alekhine's defense: exchange, Karpov variation +r2q1rk1/pp2ppbp/2n2np1/3p4/2PP2b1/2N2N2/PP2BPPP/R1BQ1RK1 w - - +QGD: Tarrasch, Prague variation, 9.Bg5 * +r2q1rk1/pp2ppbp/3p1np1/n4P2/2b1P3/1NNBB3/PPP3PP/R2Q1RK1 b - - +Sicilian: dragon, classical, Spielmann variation +r2q1rk1/pp2ppbp/4b1p1/n2P4/4P3/3BBP2/P3N1PP/R2Q1RK1 b - - +Gr\"unfeld: exchange, Sokolsky variation +r2q1rk1/pp2ppbp/4b1p1/n7/3PP3/3BBP2/P3N1PP/R2Q1RK1 w - - +Gr\"unfeld: Spassky variation, main line, 13.Bd3 +r2q1rk1/pp2ppbp/5np1/n2p1P2/4P3/1NNPB3/PP4PP/R2Q1RK1 w - - +Sicilian: dragon, classical, Bernard defense +r2q1rk1/pp4pp/1nnpb3/4p3/N2P1p2/5NP1/PP2PPBP/R2Q1RK1 b - - +Sicilian: dragon, classical, Bernard defense * +r2q1rk1/ppp1b1pp/1nn1b3/4pp2/8/2NPBNP1/PP2PPBP/R1Q2RK1 b - - +Sicilian: dragon, classical, R\'eti-Tartakower variation * +r2q1rk1/ppp1b1pp/1nn1b3/4pp2/8/2NPPN2/PP1BBPPP/R2Q1RK1 w - - +Sicilian: modern Scheveningen, main line with Nb3 * +r2q1rk1/ppp1b1pp/2n1b3/3n1p2/4p3/1QNP1NP1/PP2PPBP/R1B2RK1 w - - +Sicilian: dragon, classical, Zollner gambit * +r2q1rk1/ppp1b1pp/2n1b3/3npp2/8/2NPPN2/PP2BPPP/R1BQ1RK1 w - - +Sicilian: modern Scheveningen, main line * +r2q1rk1/ppp1b1pp/2n1b3/3npp2/8/P1NPPN2/1PQ2PPP/R1B1KB1R w KQ - +Sicilian: Scheveningen, classical * +r2q1rk1/ppp1bppp/1nn1b3/4p3/8/2NP1NP1/PP2PPBP/R1BQ1RK1 w - - +Sicilian: dragon, classical, 9.Nb3 * +r2q1rk1/ppp1bppp/1nn1b3/4p3/P7/2NP1NP1/1P2PPBP/R1BQ1RK1 b - - +Sicilian: dragon, classical, Alekhine variation * +r2q1rk1/ppp1bppp/2n1b3/3np3/8/2NP1NP1/PP2PPBP/R1BQK2R w KQ - +Sicilian: dragon, classical, 8.O-O * +r2q1rk1/ppp1ppbp/1nn3p1/8/3PP1b1/2NQBN2/PP2BPPP/2KR3R b - - +Gr\"unfeld: Russian, Keres variation +r2q1rk1/ppp1ppbp/2np1np1/5b2/2PP4/2N2NP1/PP2PPBP/R1BQ1RK1 w - - +King's Indian: fianchetto, lesser Simagin (Spassky) variation +r2q1rk1/ppp1ppbp/2np1np1/8/2PP2b1/2N2NP1/PP2PPBP/R1BQ1RK1 w - - +King's Indian: fianchetto, Simagin variation +r2q1rk1/ppp2ppp/1bnp4/1B2p2n/3PP1b1/2PQ1N2/PP2NPPP/R1B2RK1 b - - +Four knights: symmetrical, Blake variation * +r2q1rk1/ppp2ppp/2n2n2/3pp3/1b2P1b1/2NP1N2/PPPBBPPP/R2QK2R w KQ - +Ruy Lopez: closed Berlin defense, Bernstein variation * +r2q1rk1/ppp2ppp/2np1n2/1B2p3/1b2P1b1/2NPBN2/PPP2PPP/R2Q1RK1 b - - +Four knights: symmetrical, Tarrasch variation * +r2q1rk1/ppp2ppp/2np1n2/1B2p3/1b2P1b1/3P1N2/PPP1NPPP/R1BQ1RK1 b - - +Four knights: symmetrical, Pillsbury variation * +r2q1rk1/ppp2ppp/2npbn2/1B2p1B1/1b2P3/2NP1N2/PPP2PPP/R2Q1RK1 w - - +Four knights: symmetrical, Tarrasch variation +r2q1rk1/ppp3pp/1nnbb3/2B1p3/N4p2/3P1NP1/PP2PPBP/R2Q1RK1 w - - +Sicilian: dragon, classical, Spielmann variation * +r2q1rk1/ppp3pp/2n5/2bNp3/4P1b1/5N2/PPP1QPPP/R1B1K2R w KQ - +Giuoco piano: Holzhausen attack * +r2q1rk1/pppbbppp/2np1n2/1B2p3/3PP3/2N2N2/PPP2PPP/R1BQR1K1 w - - +Ruy Lopez: Berlin defense, Tarrasch trap +r2q1rk1/pppnbppp/8/8/1n6/2N3Q1/PPPP1PPP/R1BK2NR b - - +Scotch: Rosenthal variation * +r2q2k1/pp3ppp/8/2b1r3/3p4/3P4/PPP1NPPn/R1BQ1RK1 w - - +Giuoco Piano: Therkatz-Herzog variation * +r2qbrk1/1pp1bppp/p1np1n2/4p3/B2PP3/2P2N2/PP1N1PPP/R1BQR1K1 w - - +Ruy Lopez: Kecskem\'et variation +r2qk1nr/pp2bppp/2n1b3/2ppp3/8/3P1NP1/PPP1PPBP/RNBQ1RK1 w kq - +King's Indian: Semi-Averbakh system * +r2qk1nr/pp2bppp/2n5/2p1p3/2Pp2b1/3PPNP1/PP3PBP/RNBQ1RK1 b kq - +King's Indian: Averbakh, main line * +r2qk1nr/pp2bppp/2n5/2ppp3/2P3b1/3P1NP1/PP2PPBP/RNBQ1RK1 b kq - +King's Indian: Averbakh, 6...c5 * +r2qk1nr/pp2bppp/2n5/2ppp3/6b1/3P1NP1/PPP1PPBP/RNBQ1RK1 w kq - +King's Indian: Averbakh system * +r2qk1nr/pp4pp/2nbbp2/2ppp3/8/P1PP1NP1/1P2PPBP/RNBQ1RK1 b kq - +King's Indian: S\"amisch, Byrne variation * +r2qk1nr/ppp1npbp/3pb1p1/3Np3/2P5/4P1P1/PP1P1PBP/R1BQK1NR w KQkq - +Sicilian: closed, Smyslov variation * +r2qk1nr/ppp2pbp/2npb1p1/4p3/2P5/2N1P1P1/PP1PNPBP/R1BQK2R w KQkq - +English: closed, Hort variation +r2qk1nr/ppp2pbp/2npb1p1/4p3/2P5/2NP2P1/PP2PPBP/R1BQK1NR w KQkq - +Sicilian: closed, 6.Be3 * +r2qk1nr/ppp2ppp/1bnp4/8/2BPP1b1/2N2N2/P4PPP/R1BQ1RK1 w kq - +Evans gambit +r2qk1nr/ppp2ppp/1bnp4/8/Q1BPP1b1/2N2N2/P4PPP/R1B2RK1 b kq - +Evans gambit: Fraser attack +r2qk1nr/ppp2ppp/2nb4/3p4/3Pp3/4P3/PPPNQPPP/RNB1K2R w KQkq - +French: classical, Tarrasch variation * +r2qk1nr/ppp2ppp/2np4/2b5/2BpP1b1/2P2N2/PP3PPP/RNBQ1RK1 w kq - +Scotch gambit: Anderssen (Paulsen, Suhle) counter-attack +r2qk1nr/ppp2ppp/2np4/b3p3/2BPP1b1/2P2N2/P4PPP/RNBQ1RK1 w kq - +Evans gambit: Alapin-Steinitz variation +r2qk1nr/pppb1ppp/2nb4/1B1p4/2PQ4/4P3/PP3PPP/RNB1K1NR w KQkq - +French: Winawer, Kondratiyev variation * +r2qk1nr/pppb1ppp/2np4/b3p3/2BPP3/2P2N2/P4PPP/RNBQ1RK1 w kq - +Evans gambit: Sanders-Alapin variation +r2qk2r/1b1n1ppp/p2bpn2/1pp5/3P4/1BN1PN2/PP2QPPP/R1BR2K1 w kq - +QGA: classical, Smyslov variation +r2qk2r/1b1nbppp/pp1ppn2/8/2PQ4/1PN2NP1/P3PPBP/R1BR2K1 w kq - +English: symmetrical, hedgehog, flexible formation +r2qk2r/1bppbppp/p1n2n2/1p2p3/4P3/1B3N2/PPPP1PPP/RNBQR1K1 w kq - +Ruy Lopez: Trajkovi\'c counter-attack +r2qk2r/1p1bbppp/p1nppn2/6B1/3NPP2/2N5/PPPQ2PP/2KR1B1R w kq - +Sicilian: Richter-Rauzer, Rauzer attack, 7...a6 defense, 9...Be7 +r2qk2r/2p1bppp/p1n1b3/1p1pP3/2P1n3/1B3N2/PP2QPPP/RNB2RK1 b kq - +Ruy Lopez: open, Howell attack, Adam variation +r2qk2r/2p1bppp/p1n1b3/1p1pP3/4n3/1BP2N2/PP3PPP/RNBQ1RK1 w kq - +Ruy Lopez: open, classical defense +r2qk2r/2p1bppp/p1n1b3/1p1pP3/4n3/1BP2N2/PP3PPP/RNBQR1K1 b kq - +Ruy Lopez: open, 9...Be7, 10.Re1 +r2qk2r/2p1bppp/p1np1n2/1p2p3/3PP1b1/1BP2N2/PP2QPPP/RNB1K2R w KQkq - +Ruy Lopez: Wormald attack, Gr\"unfeld variation +r2qk2r/2p1nppp/p3b3/1pbpP3/4n3/1BPQ1N2/PP3PPP/RNB2RK1 w kq - +Ruy Lopez: open, Motzko attack, Nenarokov variation +r2qk2r/2p2ppp/p1n1b3/1pbpP3/4n3/1BP2N2/PP1N1PPP/R1BQ1RK1 b kq - +Ruy Lopez: open, St. Petersburg variation +r2qk2r/2p2ppp/p1n1b3/1pbpP3/4n3/1BP2N2/PP3PPP/RNBQ1RK1 w kq - +Ruy Lopez: open, Italian variation +r2qk2r/2p2ppp/p1n1b3/1pbpP3/4n3/1BPQ1N2/PP3PPP/RNB2RK1 b kq - +Ruy Lopez: open, Motzko attack +r2qk2r/3bbppp/p1nppB2/1p6/4PP2/2N2N2/PPPQ2PP/2KR1B1R b kq - +Sicilian: Richter-Rauzer, Rauzer attack, 7...a6 defense, 11.Bxf6 +r2qk2r/p1pn1ppp/8/3pp3/Np2b1Q1/1B6/PPP2K1P/R1B3R1 w kq - +Evans gambit declined, Pavlov variation * +r2qk2r/pp1bppbp/2n2np1/2ppN3/8/1P2P3/PBPPBPPP/RN1QK2R w KQkq - +Queen's Indian: Opo\v censky variation * +r2qk2r/pp2b1pp/2n1b3/2pnpp2/8/2NP1NP1/PP2PPBP/R1BQ1RK1 w kq - +King's Indian: Four pawns attack, main line * +r2qk2r/pp2bpp1/2n2nb1/2p1p2p/3pP1PN/3P3P/PPPN1PB1/R1BQ1RK1 w kq - +King's Indian: Petrosian system, Keres variation * +r2qk2r/pp2bppp/2n1bn2/2ppp3/4P3/3P1NP1/PPP2PBP/RNBQ1RK1 w kq - +King's Indian: Gligori\'c-Taimanov system * +r2qk2r/pp3ppp/2n1pn2/3p1b2/1b1P1B2/1QN1PN2/PP3PPP/R3KB1R w KQkq - +QGD Slav: exchange, Trifunovi\'c variation +r2qk2r/pp3ppp/2nbp3/3p4/3Pn1b1/1P3N2/PBP1BPPP/RN1Q1RK1 w kq - +QGD: Pillsbury attack * +r2qk2r/pp3ppp/2nbpn2/2pp4/3P2b1/4PN2/PPPNBPPP/R1BQ1RK1 w kq - +QGD: Orthodox defense, Botvinnik variation * +r2qk2r/ppp1b1pp/2n5/3p1p2/2PPn1b1/3B1N2/PP3PPP/RNBQR1K1 b kq - +Petrov: classical attack, Krause variation +r2qk2r/ppp1b1pp/2n5/3p1p2/3Pn1b1/2PB1N2/PP1N1PPP/R1BQR1K1 b kq - +Petrov: classical attack, Berger variation +r2qk2r/ppp1bppp/1nn1b3/4p3/8/2NP1NP1/PP2PPBP/R1BQK2R w KQkq - +Sicilian: dragon, classical, Nottingham variation * +r2qk2r/ppp1bppp/2n1b3/3np3/8/3P1NP1/PP2PPBP/RNBQK2R w KQkq - +Sicilian: dragon, classical attack * +r2qk2r/ppp1bppp/2n1b3/3np3/8/P1N1P3/1PQP1PPP/R1B1KBNR w KQkq - +Sicilian: Taimanov variation * +r2qk2r/ppp2p1p/2n1bPp1/2b3N1/2pp4/8/PPP2PPP/RNBQR1K1 w kq - +two knights: Max Lange attack, Loman defense +r2qk2r/ppp2pPp/2n1b3/2b5/2pp4/5N2/PPP2PPP/RNBQR1K1 b kq - +two knights: Max Lange attack, Schlechter variation +r2qk2r/ppp2ppp/2n1b3/2bnp3/8/2N2NP1/PP1PPPBP/R1BQK2R w KQkq - +Sicilian: accelerated fianchetto, modern variation with Bc4 * +r2qk2r/ppp2ppp/2n1b3/2bnp3/8/2NPPN2/PP3PPP/R1BQKB1R w KQkq - +Sicilian: Sozin, 7.Be3 * +r2qk2r/ppp2ppp/2n5/3np3/1b4b1/2NPPN2/PP3PPP/R1BQKB1R w KQkq - +Sicilian: Richter-Rauzer, Margate (Alekhine) variation * +r2qk2r/ppp2ppp/2np1n2/2b1p3/2B1P1b1/2NP1N2/PPP2PPP/R1BQK2R w KQkq - +Giuoco Pianissimo: Canal variation * +r2qk2r/ppp2ppp/2np1n2/2b5/2B1Pp2/2NP1Q1P/PPP3P1/R1B1K2R w KQkq - +KGD: classical, Svenonius variation +r2qk2r/ppp3pp/1bn1b3/3npp2/8/2NPPN2/PP2BPPP/R1BQ1RK1 w kq - +Sicilian: Sozin, Fischer variation * +r2qk2r/ppp3pp/2n5/3p1p2/2PPn1bb/3B1N2/PP3PPP/RNBQR1K1 w kq - +Petrov: classical attack, Mar\'oczy variation +r2qk2r/pppbbppp/2Bp1n2/4p3/3PP3/2N2N2/PPP2PPP/R1BQ1RK1 b kq - +Ruy Lopez: closed Berlin defense, Showalter variation +r2qk2r/pppbbppp/2np1n2/1B2p1B1/3PP3/2N2N2/PPP2PPP/R2Q1RK1 b kq - +Ruy Lopez: closed Berlin defense, Bernstein variation +r2qk2r/pppbbppp/2np1n2/1B2p3/3PP3/2N2N2/PPP2PPP/R1BQ1RK1 w kq - +Ruy Lopez: Berlin defense, hedgehog variation +r2qkb1r/1bpp1ppp/p1n2n2/1p2p3/4P3/1B3N2/PPPP1PPP/RNBQ1RK1 w kq - +Ruy Lopez: Archangelsk (counterthrust) variation +r2qkb1r/1p1b1ppp/2n1pn2/pBPp4/1P6/1QP1P3/P4PPP/RNB1K1NR b KQkq - +QGD: semi-Slav, Junge variation * +r2qkb1r/1p1b1ppp/2n1pn2/pBPp4/1P6/2P1P3/P3QPPP/RNB1K1NR b KQkq - +QGD: semi-Slav, Koomen variation * +r2qkb1r/1p1b1ppp/2n1pn2/pBPp4/PP6/2P1P3/5PPP/RNBQK1NR b KQkq - +QGD: semi-Slav, Abrahams variation * +r2qkb1r/1p1b1ppp/p1nppn2/6B1/3NP3/2N5/PPPQ1PPP/2KR1B1R w kq - +Sicilian: Richter-Rauzer, Rauzer attack, 7...a6 defense, 8...Bd7 +r2qkb1r/1p3ppp/p1npbn2/4p1B1/4P3/N1N5/PPP2PPP/R2QKB1R w KQkq - +Sicilian: Pelikan, Bird variation +r2qkb1r/1ppbnppp/p1np4/4p3/B2PP3/2P2N2/PP3PPP/RNBQK2R w KQkq - +Ruy Lopez: modern Steinitz defense, Rubinstein variation +r2qkb1r/2p2ppp/p1n1b3/1p1pP3/4n3/1B3N2/PPP1QPPP/RNB2RK1 b kq - +Ruy Lopez: open, Howell attack +r2qkb1r/2p2ppp/p1n1b3/1p1pP3/4n3/1B3N2/PPP2PPP/RNBQ1RK1 w kq - +Ruy Lopez: open, 8...Be6 +r2qkb1r/2p2ppp/p1n1b3/1p1pP3/4n3/1B3N2/PPPN1PPP/R1BQ1RK1 b kq - +Ruy Lopez: open, Bernstein variation +r2qkb1r/2p2ppp/p1n1b3/1p1pP3/4n3/1BP2N2/PP3PPP/RNBQ1RK1 b kq - +Ruy Lopez: open, 9.c3 +r2qkb1r/2p2ppp/p1n1b3/1pn1P1N1/3p4/1BP5/PP1N1PPP/R1BQ1RK1 b kq - +Ruy Lopez: open, Bernstein variation, Karpov gambit +r2qkb1r/2p2ppp/p1n1b3/1pnpP3/8/1BP2N2/PP3PPP/RNBQ1RK1 w kq - +Ruy Lopez: open, Berlin variation +r2qkb1r/2p2ppp/p1pp1n2/4p3/3PP1b1/5N2/PPP2PPP/RNBQ1RK1 w kq - +Ruy Lopez: Steinitz defense deferred, Lipnitsky variation +r2qkb1r/p2b1ppp/5n2/1B1pp3/Q7/4P3/PP3PPP/RNB1K2R b KQkq - +QGD: Semi-Tarrasch, San Sebastian variation * +r2qkb1r/p3pppp/2p5/2pn3b/4N3/5N1P/PPPP1PP1/R1BQK2R b KQkq - +English: Nenarokov variation * +r2qkb1r/p4ppp/2p1pn2/3p4/3p4/4P2P/PPP1QPP1/RNB2RK1 w kq - +QGD: Lasker defense, main line * +r2qkb1r/pb1n1ppp/2p1pn2/1p6/3P4/2NBPN2/PP3PPP/R1BQK2R w KQkq - +QGD semi-Slav: Meran, Wade variation +r2qkb1r/pp1b1ppp/2n1pn2/2pp4/3P4/5NP1/PPP1PPBP/RNBQ1RK1 w kq - +Gr\"unfeld: Opo\v censky variation * +r2qkb1r/pp1bppp1/5n1p/1BpP4/4p3/2N5/PPP1QPPP/R3K1NR b KQkq - +QGD: Albin counter-gambit, Kr\'enosz variation * +r2qkb1r/pp1bpppp/2np1n2/6B1/3NP3/2N5/PPP2PPP/R2QKB1R w KQkq - +Sicilian: Richter-Rauzer, Larsen variation +r2qkb1r/pp1bpppp/2np1n2/6B1/3NP3/2N5/PPPQ1PPP/R3KB1R b KQkq - +Sicilian: Richter-Rauzer, Larsen variation, 7.Qd2 +r2qkb1r/pp1n1ppp/2n1p3/2Pp4/Q5b1/2P1PN2/PP1N1PPP/R1B1KB1R b KQkq - +QGD: Cambridge Springs defense, Rubinstein variation * +r2qkb1r/pp1n1ppp/4pn2/2pp4/3P2b1/2P1PN2/PP1N1PPP/R1BQKB1R w KQkq - +QGD: Capablanca variation * +r2qkb1r/pp2n1pp/2n1bp2/2p1p3/3PP3/3P1NP1/PP3PBP/RNBQ1RK1 b kq - +King's Indian: S\"amisch, orthodox main line * +r2qkb1r/pp2n1pp/2n1bp2/2ppp3/4P3/2PP1NP1/PP3PBP/RNBQ1RK1 b kq - +King's Indian: S\"amisch, orthodox, 7.Nge2 c6 * +r2qkb1r/pp2n1pp/2n1bp2/2ppp3/8/2NP1NP1/PPP1PPBP/1RBQ1RK1 b kq - +King's Indian: S\"amisch, Ruban variation * +r2qkb1r/pp2n1pp/2n1bp2/2ppp3/8/P1NP1NP1/1PP1PPBP/R1BQ1RK1 b kq - +King's Indian: S\"amisch, Panno formation * +r2qkb1r/pp2pppp/2n2n2/1BPp4/6b1/4PN2/PPP2PPP/RNBQK2R b KQkq - +QGD: Ragozin, Vienna variation * +r2qkb1r/pp2pppp/2n2n2/1Bpp3b/8/1P2PN1P/PBPP1PP1/RN1QK2R b KQkq - +Queen's Indian: 4.Nc3, main line * +r2qkb1r/pp2pppp/2n2n2/2Pp4/6b1/2P1PN2/PP3PPP/RNBQKB1R b KQkq - +QGD semi-Slav: 5.Bg5 dc * +r2qkb1r/pp2pppp/2n2n2/2pp1b2/3P4/4PN2/PPP1BPPP/RNBQK2R w KQkq - +QGD: classical variation (5.Bf4) * +r2qkb1r/pp2pppp/2n2n2/2pp1b2/3P4/5NP1/PPP1PPBP/RNBQK2R w KQkq - +Gr\"unfeld: 5.Bf4 * +r2qkb1r/pp2pppp/2n2n2/2pp4/2PP2b1/4PN2/PP3PPP/RNBQKB1R w KQkq - +QGD: Semi-Tarrasch defense, Pillsbury variation * +r2qkb1r/pp2pppp/2n2n2/2pp4/3P2b1/5NP1/PPP1PPBP/RNBQK2R w KQkq - +Gr\"unfeld: 5.Bg5 * +r2qkb1r/pp2pppp/2n2n2/2pp4/6b1/3P1NP1/PPP1PPBP/RNBQK2R w KQkq - +King's Indian: Smyslov system * +r2qkb1r/pp2pppp/2n2n2/3p1b2/3P1B2/2N2N2/PP2PPPP/R2QKB1R b KQkq - +QGD Slav: exchange variation, 6.Bf4 Bf5 * +r2qkb1r/pp2pppp/2n2n2/3p1b2/3P1B2/2N2N2/PP2PPPP/R2QKB1R w KQkq - +QGD Slav: exchange variation, 6.Bf4 Bf5 +r2qkb1r/pp2pppp/2n2n2/3p1b2/3P4/5N2/PPPN1PPP/R1BQKB1R w KQkq - +QGD: exchange, S\"amisch variation * +r2qkb1r/pp2pppp/2n2n2/8/2Pp2b1/3P1NP1/PP3P1P/RNBQKB1R w KQkq - +Benoni: Uhlmann variation * +r2qkb1r/pp2pppp/2n2nb1/2pp4/6PN/1P2P2P/PBPP1P2/RN1QKB1R b KQkq - +Queen's Indian: 4.Nc3, Botvinnik variation * +r2qkb1r/pp2pppp/n1p2n2/5b2/P1pP4/2N1PN2/1P3PPP/R1BQKB1R w KQkq - +QGD Slav: Dutch, Lasker variation +r2qkb1r/pp2pppp/n1p2n2/8/P1pPP1b1/2N2N2/1P3PPP/R1BQKB1R w KQkq - +QGD Slav: Smyslov variation +r2qkb1r/pp3p1p/2n3p1/2Pp4/1P2p1b1/2P1PN2/P2N1P2/R1BQKB1R w KQkq - +QGD semi-Slav: anti-Meran, Lilienthal variation * +r2qkb1r/pp3ppp/2n1b3/2pnp1N1/8/2N3P1/PP1PPPBP/R1BQK2R b KQkq - +Sicilian: accelerated fianchetto, Breyer variation * +r2qkb1r/pp3ppp/2n1bn2/2ppp3/8/3P1NP1/PPP1PPBP/RNBQ1RK1 w kq - +King's Indian: Larsen variation * +r2qkb1r/pp3ppp/2n1pn2/2pp1b2/3P4/5NP1/PPP1PPBP/RNBQ1RK1 w kq - +Gr\"unfeld with Bf4 & e3 * +r2qkb1r/pp3ppp/2n1pn2/2pp3b/3P4/1P2PN1P/P1P1BPP1/RNBQ1RK1 b kq - +QGD: Tartakower (Makagonov-Bondarevsky) system * +r2qkb1r/pp3ppp/2n1pn2/2pp3b/3P4/4PN1P/PPP1BPP1/RNBQ1RK1 w kq - +QGD: Neo-orthodox variation, 7.Bh4 * +r2qkb1r/pp3ppp/2n1pn2/2pp4/3P2b1/2P1PN2/PP1N1PPP/R1BQKB1R w KQkq - +QGD * +r2qkb1r/pp3ppp/2n1pn2/2pp4/3P2b1/4PN1P/PPP1BPP1/RNBQ1RK1 b kq - +QGD: Neo-orthodox variation * +r2qkb1r/pp3ppp/2n1pn2/2pp4/3P2b1/4PN2/PPP1BPPP/RNBQ1RK1 w kq - +QGD: 6.Nf3 * +r2qkb1r/pp3ppp/2n1pn2/2pp4/3P2b1/4PN2/PPPNBPPP/R1BQ1RK1 b kq - +QGD: Orthodox defense * +r2qkb1r/pp3ppp/2n1pn2/2pp4/3P4/4Pb1P/PPP1BPP1/RNBQ1RK1 w kq - +QGD: Neo-orthodox variation, 7.Bxf6 * +r2qkb1r/pp3ppp/2n1pn2/2pp4/Q2P2b1/2P1PN2/PP1N1PPP/R1B1KB1R b KQkq - +QGD: Cambridge Springs defense * +r2qkb1r/pp3ppp/2n1pn2/2pp4/Q2P4/2P1Pb2/PP1N1PPP/R1B1KB1R w KQkq - +QGD: Cambridge Springs defense, Capablanca variation * +r2qkb1r/pp3ppp/2n1pn2/2ppN2b/3P4/4P2P/PPP1BPP1/RNBQ1RK1 b kq - +QGD: Lasker defense * +r2qkb1r/pp3ppp/2n1pn2/3p3b/3N4/1P2P2P/P1P1BPP1/RNBQ1RK1 b kq - +QGD: Tartakower (Makagonov-Bondarevsky) system, 8.cd Nxd5 * +r2qkb1r/pp3ppp/2n1pn2/3p4/Q2N2b1/2P1P3/PP1N1PPP/R1B1KB1R b KQkq - +QGD: Cambridge Springs defense, Yugoslav variation * +r2qkb1r/pp3ppp/2n1pn2/3p4/Q2p2b1/2P1PN2/PP1N1PPP/R1B1KB1R w KQkq - +QGD: Cambridge Springs defense, 7.cd * +r2qkb1r/pp3ppp/2n2n2/2Ppp3/6b1/2P1PN2/PP3PPP/RNBQKB1R w KQkq - +QGD semi-Slav: Botvinnik system (anti-Meran) * +r2qkb1r/pp3ppp/2n2n2/2pp4/3P2b1/2N2NP1/PP2PPBP/R1BQK2R w KQkq - +QGD: Tarrasch, Wagner variation +r2qkb1r/pp3ppp/2n2n2/2ppp3/3P2b1/2P1PN2/PP1N1PPP/R1BQKB1R w KQkq - +QGD: Alekhine variation * +r2qkb1r/pp3ppp/2n2n2/2ppp3/6b1/3P1NP1/PPP1PPBP/RNBQ1RK1 w kq - +King's Indian: Zinnowitz variation * +r2qkb1r/pp3ppp/2n2n2/4p3/2Pp2b1/3P1NP1/PP3PBP/RNBQK2R w KQkq - +Benoni: classical, 8.Bg5 * +r2qkb1r/pp3ppp/2n5/2Pp3P/1P2n3/2P1Pp1P/P4P2/RNBQKB1R w KQkq - +QGD semi-Slav: Ekstrom variation * +r2qkb1r/pp3ppp/2n5/2Pp3b/1P1Np1n1/2P1P2P/P4P2/RNBQKB1R b KQkq - +QGD semi-Slav: anti-Meran, Alatortsev system * +r2qkb1r/pp3ppp/2n5/2Pp3b/1P2p1n1/2P1PN1P/P4P2/RNBQKB1R w KQkq - +QGD semi-Slav: anti-Meran gambit * +r2qkb1r/ppp1p1pp/1nn1p3/2P5/3P2b1/5N2/PP4PP/RNBQKB1R b KQkq - +Alekhine's defense: four pawns attack, Ilyin-Genevsky variation +r2qkb1r/ppp2ppp/1nn5/4p3/6b1/2NPPN2/PP3PPP/R1BQKB1R w KQkq - +Sicilian: Richter-Rauzer, Pod\v ebrady variation * +r2qkb1r/ppp2ppp/2n1b3/3np3/8/2N1P3/PPQP1PPP/R1B1KBNR w KQkq - +Sicilian: Taimanov variation * +r2qkb1r/ppp2ppp/2n1b3/3np3/8/3P1NP1/PP2PP1P/RNBQKB1R w KQkq - +Sicilian: dragon, 6.Be3 * +r2qkb1r/ppp2ppp/2n1b3/3np3/8/P2P1N2/1P2PPPP/RNBQKB1R w KQkq - +Sicilian: Najdorf, Byrne (English) attack * +r2qkb1r/ppp2ppp/2n5/3np3/6b1/2NP1N2/PP1BPPPP/R2QKB1R b KQkq - +Sicilian: Richter-Rauzer, Larsen variation * +r2qkb1r/ppp2ppp/2n5/3np3/6b1/2NP1N2/PP2PPPP/R1BQKB1R w KQkq - +Sicilian: Richter-Rauzer * +r2qkb1r/ppp2ppp/2n5/3np3/6b1/2NP1NP1/PP2PP1P/R1BQKB1R b KQkq - +Sicilian: Richter-Rauzer, Bondarevsky variation * +r2qkb1r/ppp2ppp/2n5/3np3/6b1/2NPPN2/PP3PPP/R1BQKB1R b KQkq - +Sicilian: Richter-Rauzer, 6...e6 * +r2qkb1r/ppp2ppp/2n5/3np3/6b1/P2P1N2/1P2PPPP/RNBQKB1R w KQkq - +Sicilian: Najdorf, 6.Bg5 * +r2qkb1r/ppp2ppp/2n5/3np3/6b1/P2PPN2/1P3PPP/RNBQKB1R b KQkq - +Sicilian: Najdorf, 6...e6 * +r2qkb1r/ppp2ppp/2n5/4p3/6b1/2nPPN2/PP3PPP/R1BQKB1R w KQkq - +Sicilian: Richter-Rauzer, Richter attack * +r2qkb1r/ppp2ppp/n1n5/4p3/1P2P1b1/P1NP1N2/5PPP/R1BQKB1R b KQkq - +Sicilian: Pelikan, Chelyabinsk variation * +r2qkb1r/ppp2ppp/n1n5/4p3/4P1b1/P1NPBN2/1P3PPP/R2QKB1R b KQkq - +Sicilian: Pelikan, Bird variation * +r2qkb1r/ppp2ppp/n7/4p3/1P1nPP2/P1NP4/5P1P/R1BQKB1R b KQkq - +Sicilian: Sveshnikov variation * +r2qkb1r/ppp3pp/2n1bn2/3p1p2/2PPp3/2N1P3/PP1N1PPP/R1BQKB1R w KQkq - +French: Steinitz, Boleslavsky variation * +r2qkb1r/ppp3pp/2n1bn2/3ppp2/8/3P1NP1/PPP1PPBP/RNBQ1RK1 w kq - +Pirc: Austrian attack, 6.Be3 * +r2qkb1r/ppp3pp/2n1bp2/3np3/8/3P1NP1/PP2PPBP/RNBQ1RK1 b kq - +Sicilian: dragon, Yugoslav attack, 7...O-O * +r2qkb1r/ppp3pp/2n1bp2/3np3/8/3P1NP1/PP2PPBP/RNBQK2R w KQkq - +Sicilian: dragon, Yugoslav attack * +r2qkb1r/ppp3pp/2n5/3npp2/1P4b1/P2PPN2/5PPP/RNBQKB1R b KQkq - +Sicilian: Najdorf, Polugayevsky variation * +r2qkb1r/ppp3pp/2n5/3npp2/6b1/P2PPN2/1P2BPPP/RNBQK2R b KQkq - +Sicilian: Najdorf, 7...Be7 * +r2qkb1r/ppp3pp/2n5/3npp2/6b1/P2PPN2/1P3PPP/RNBQKB1R w KQkq - +Sicilian: Najdorf, 7.f4 * +r2qkb1r/ppp3pp/2n5/3npp2/6b1/PQ1PPN2/1P3PPP/RNB1KB1R b KQkq - +Sicilian: Najdorf, 7...Qb6 * +r2qkb1r/pppb1ppp/2Bp1n2/4p3/3PP3/2N2N2/PPP2PPP/R1BQK2R b KQkq - +Ruy Lopez: old Steinitz defense, Nimzovich attack +r2qkb1r/pppb1ppp/2n2n2/1B6/Q3p3/2N5/PPP2PPP/R1B1K1NR w KQkq - +Scandinavian: Anderssen counter-attack orthodox attack * +r2qkb1r/pppb1ppp/2np1n2/1B6/3pP3/2N2N2/PPP2PPP/R1BQ1RK1 w kq - +Ruy Lopez: closed Berlin defense, Wolf variation +r2qkb1r/pppn2p1/8/3pNbPp/3Pn3/8/PPP2P1P/RNBQKB1R w KQkq - +KGA: Kieseritsky, Brentano defense, Caro variation * +r2qkbnr/1p3ppp/p1n1p3/2pp4/3P2b1/2P1PN2/PP1N1PPP/R1BQKB1R w KQkq - +QGD: Capablanca anti-Cambridge Springs variation * +r2qkbnr/1pp2pp1/p1p5/4p2p/4P1b1/5N1P/PPPP1PP1/RNBQ1RK1 w kq - +Ruy Lopez: exchange variation, Alapin gambit +r2qkbnr/1pp3pp/p1np4/4pb2/B7/2P2N2/PP1P1PPP/RNBQ1RK1 b kq - +Ruy Lopez: Siesta, Kopayev variation +r2qkbnr/1ppb1p1p/p1np2p1/4p3/B2PP3/2P2N2/PP3PPP/RNBQK2R w KQkq - +Ruy Lopez: modern Steinitz defense, fianchetto (Bronstein) variation +r2qkbnr/1ppb1ppp/p1np4/4p3/B3P3/2P2N2/PP1P1PPP/RNBQK2R w KQkq - +Ruy Lopez: modern Steinitz defense +r2qkbnr/pp1b1ppp/2n1p3/2ppP3/3P4/2P2N2/PP3PPP/RNBQKB1R w KQkq - +French: advance, Euwe variation +r2qkbnr/pp1nppp1/2p3bp/7P/3P4/5NN1/PPP2PP1/R1BQKB1R b KQkq - +Caro-Kann: classical, Spassky variation +r2qkbnr/pp1nppp1/2p3bp/8/3P3P/5NN1/PPP2PP1/R1BQKB1R w KQkq - +Caro-Kann: classical, 7...Nd7 +r2qkbnr/pp2pppp/2n5/1Bp4b/1PPp4/4PN1P/P2P1PP1/RNBQK2R b KQkq - +Nimzo-Indian: Leningrad, ...b5 gambit * +r2qkbnr/pp2pppp/2n5/1Bp4b/2Pp4/3PPN1P/PP3PP1/RNBQK2R b KQkq - +Nimzo-Indian: Leningrad, main line * +r2qkbnr/pp2pppp/2n5/1Bpp4/6b1/4PN2/PPPP1PPP/RNBQK2R w KQkq - +Nimzo-Indian: Leningrad variation * +r2qkbnr/pp2pppp/2n5/2pp1b2/3P4/4PN2/PPP2PPP/RNBQKB1R w KQkq - +QGD: Harrwitz attack * +r2qkbnr/pp2pppp/2n5/2pp1b2/3P4/5NP1/PPP1PP1P/RNBQKB1R w KQkq - +Gr\"unfeld: 4.Bf4 * +r2qkbnr/pp2pppp/2n5/2pp4/2PP2b1/4PN2/PP3PPP/RNBQKB1R b KQkq - +QGD: Been-Koomen variation * +r2qkbnr/pp2pppp/2n5/2pp4/3P2b1/4PN2/PPP1BPPP/RNBQK2R b KQkq - +QGD: 4.Bg5 Be7 * +r2qkbnr/pp2pppp/2n5/2pp4/3P2b1/4PN2/PPP2PPP/RNBQKB1R w KQkq - +QGD: 4.Bg5 * +r2qkbnr/pp2pppp/2n5/2pp4/3P2b1/4PN2/PPPN1PPP/R1BQKB1R b KQkq - +QGD: 4.Bg5 Nbd7 * +r2qkbnr/pp2pppp/2n5/2pp4/3P2b1/5NP1/PPP1PP1P/RNBQKB1R w KQkq - +Gr\"unfeld: Stockholm variation * +r2qkbnr/pp2pppp/2n5/3p4/2Pp2b1/1Q2PN2/PP3PPP/RNB1KB1R b KQkq - +QGD: Canal (Venice) variation * +r2qkbnr/pp2pppp/2n5/3p4/2Pp2b1/4PN2/PP3PPP/RNBQKB1R w KQkq - +QGD: Semi-Tarrasch * +r2qkbnr/pp2pppp/2n5/3p4/3P2b1/2P2N2/PP3PPP/RNBQKB1R b KQkq - +QGD: exchange, positional line, 5...c6 * +r2qkbnr/pp2pppp/2n5/3p4/3P2b1/5N2/PPP2PPP/RNBQKB1R w KQkq - +QGD: exchange, positional line * +r2qkbnr/pp3ppp/2n1p3/1Bpp4/3P2b1/4PN2/PPPN1PPP/R1BQK2R b KQkq - +QGD: Manhattan variation * +r2qkbnr/pp3ppp/2n1p3/2pp1b2/3P4/5NP1/PPP1PPBP/RNBQ1RK1 b kq - +Gr\"unfeld: Gr\"unfeld gambit * +r2qkbnr/pp3ppp/2n1p3/2pp4/3P2b1/2P1PN2/PP1N1PPP/R1BQKB1R b KQkq - +QGD: 5...c6 * +r2qkbnr/pp3ppp/2n1p3/2pp4/3P2b1/4PN2/PPP1BPPP/RNBQ1RK1 b kq - +QGD: 4.Bg5 Be7, 5.e3 O-O * +r2qkbnr/pp3ppp/2n1p3/2pp4/3P2b1/4PN2/PPPN1PPP/R1BQKB1R w KQkq - +QGD * +r2qkbnr/pp3ppp/2n1p3/2ppN3/3P2b1/4P3/PPP1BPPP/RNBQK2R b KQkq - +QGD: Lasker variation * +r2qkbnr/pp3ppp/2n5/2P5/N2p2b1/5N2/PP2PPPP/R1BQKB1R b KQkq - +Caro-Kann: Panov-Botvinnik, Herzog defense * +r2qkbnr/pp3ppp/2n5/2pp4/3P2b1/1QN2N2/PP2PPPP/R1B1KB1R b KQkq - +Caro-Kann: Panov-Botvinnik, Reifir (Spielmann) variation * +r2qkbnr/pp3ppp/2n5/2pp4/3P2b1/2N1PN2/PP3PPP/R1BQKB1R b KQkq - +Caro-Kann: Panov-Botvinnik, normal variation * +r2qkbnr/pp3ppp/2n5/2pp4/Q2P2b1/2N2N2/PP2PPPP/R1B1KB1R b KQkq - +Caro-Kann: Panov-Botvinnik, Czerniak variation * +r2qkbnr/pp3ppp/2n5/2ppp3/6b1/3P1NP1/PPP1PPBP/RNBQK2R w KQkq - +King's Indian: accelerated Averbakh system * +r2qkbnr/pp3ppp/4p3/3p4/3Q4/6P1/PPb1PPBP/RNB2RK1 w kq - +Gr\"unfeld: Gr\"unfeld gambit accepted * +r2qkbnr/pp3ppp/8/3pn3/8/8/PPP1NPPP/RNBQK2R b KQkq - +Bishop's opening: Lisitsyn variation +r2qkbnr/pp4pp/2n1bp2/2p1p3/3pP3/2PP1NP1/PP3PBP/RNBQ1RK1 b kq - +King's Indian: S\"amisch, orthodox, 7.d5 c6 * +r2qkbnr/pp4pp/2n1bp2/2p1p3/3pP3/3P1NP1/PPP2PBP/RNBQ1RK1 w kq - +King's Indian: S\"amisch, orthodox, 7.d5 * +r2qkbnr/pp4pp/2n1bp2/2ppp3/4P3/3P1NP1/PPP2PBP/RNBQ1RK1 b kq - +King's Indian: S\"amisch, orthodox variation * +r2qkbnr/pp4pp/2n1bp2/2ppp3/8/1P1P1NP1/P1P1PPBP/RNBQ1RK1 b kq - +King's Indian: S\"amisch, double fianchetto variation * +r2qkbnr/pp4pp/2n1bp2/2ppp3/8/2NP1NP1/PPP1PPBP/R1BQ1RK1 b kq - +King's Indian: S\"amisch, 6...Nc6 * +r2qkbnr/ppp1p1pp/2n2p2/3p4/3P1Bb1/5N2/PPP1PPPP/RN1QKB1R w KQkq - +Richter-Veresov attack, Richter variation * +r2qkbnr/ppp1pppp/2n5/3p4/3P1B2/5b2/PPP1PPPP/RN1QKB1R w KQkq - +Richter-Veresov attack, Veresov variation * +r2qkbnr/ppp1pppp/2n5/3p4/3P2b1/5N2/PPP1PPPP/RNBQKB1R w KQkq - +Richter-Veresov attack * +r2qkbnr/ppp2p1p/2P5/8/2BP1pb1/2N2p2/PPP3PP/R1BQ1RK1 b kq - +Vienna: Pierce gambit, Rushmere attack +r2qkbnr/ppp2pp1/2n5/3p3p/2PPp1b1/4P3/PP1NBPPP/RNBQK2R b KQkq - +French: Albin-Alekhine-Ch\^atard attack, Breyer variation * +r2qkbnr/ppp2pp1/2n5/3p3p/3Pp1b1/4P3/PPPNBPPP/RNBQ1RK1 b kq - +French: Albin-Alekhine-Ch\^atard attack, Spielmann variation * +r2qkbnr/ppp2pp1/2n5/3p3p/3Pp1b1/4P3/PPPNBPPP/RNBQK2R w KQkq - +French: Albin-Alekhine-Ch\^atard attack * +r2qkbnr/ppp2pp1/2n5/3p3p/3Pp1b1/4PP2/PPPNB1PP/RNBQK2R b KQkq - +French: Albin-Alekhine-Ch\^atard attack, Teichmann variation * +r2qkbnr/ppp2pp1/2n5/3p3p/3Pp1b1/P3P3/1PPNBPPP/RNBQK2R b KQkq - +French: Albin-Alekhine-Ch\^atard attack, Mar\'oczy variation * +r2qkbnr/ppp2pp1/2n5/3pP2p/6b1/5NP1/PPPPP2P/RNBQKB1R w KQkq - +Dutch: Staunton gambit, Alekhine variation * +r2qkbnr/ppp2ppp/2n1b3/1B1p4/3Pp3/4PN1P/PPP2PP1/RNBQK2R w KQkq - +French: MacCutcheon, Janowski variation * +r2qkbnr/ppp2ppp/2n1b3/3p4/3Pp3/1P2P3/P1P1BPPP/RNBQK1NR b KQkq - +French: classical, Frankfurt variation * +r2qkbnr/ppp2ppp/2n1b3/3pp3/3P4/4PN2/PPP2PPP/RNBQKB1R w KQkq - +French: Henneberger variation * +r2qkbnr/ppp2ppp/2n5/1B1p3b/3Pp3/4PN1P/PPP2PP1/RNBQK2R w KQkq - +French: MacCutcheon, Bernstein variation * +r2qkbnr/ppp2ppp/2n5/1B1p4/3P2b1/4Pp1P/PPP2PP1/RNBQK2R w KQkq - +French: MacCutcheon, Chigorin variation * +r2qkbnr/ppp2ppp/2n5/1B1p4/3Pp1b1/4PN2/PPP2PPP/RNBQK2R w KQkq - +French: MacCutcheon, advance variation * +r2qkbnr/ppp2ppp/2n5/1B1pp3/3P2b1/4PN2/PPP2PPP/RNBQK2R b KQkq - +French: MacCutcheon variation * +r2qkbnr/ppp2ppp/2n5/3p4/3P2b1/2N2N2/PPP2PPP/R1BQKB1R b KQkq - +French: exchange, Bogolyubov variation * +r2qkbnr/ppp2ppp/2n5/3p4/3P2b1/5N2/PPP2PPP/RNBQKB1R w KQkq - +French: exchange, Svenonius variation * +r2qkbnr/ppp2ppp/2n5/3p4/3Pp1b1/4P3/PPP1BPPP/RNBQK1NR b KQkq - +French: classical, Vistaneckis (Nimzovich) variation * +r2qkbnr/ppp2ppp/2n5/3p4/3Pp3/4P3/PPPNQPPP/RNB1K2R b KQkq - +French: classical variation * +r2qkbnr/ppp2ppp/2n5/3pN3/3Pp1b1/4P3/PPP1BPPP/RNBQK2R b KQkq - +French: classical, Tartakower variation * +r2qkbnr/ppp2ppp/2n5/3pP3/6b1/1P3N2/P1PPP1PP/RNBQKB1R b KQkq - +Dutch: Staunton gambit, Nimzovich variation * +r2qkbnr/ppp2ppp/2n5/3pP3/6b1/2P2N2/PP1PP1PP/RNBQKB1R b KQkq - +Dutch: Staunton gambit, Chigorin variation * +r2qkbnr/ppp2ppp/2n5/3pP3/6b1/4PN2/PPP2PPP/RNBQKB1R b KQkq - +French: Burn variation * +r2qkbnr/ppp2ppp/2n5/3pP3/6b1/5N2/PPPPP1PP/RNBQKB1R w KQkq - +Dutch: Staunton gambit, Staunton's line * +r2qkbnr/ppp2ppp/2n5/3pp3/3P2b1/4PN2/PPP1BPPP/RNBQK2R b KQkq - +French: classical * +r2qkbnr/ppp2ppp/2n5/3pp3/3P4/4Pb2/PPP1BPPP/RNBQK2R w KQkq - +French: classical, Anderssen variation * +r2qkbnr/ppp2ppp/2n5/3pp3/6b1/3P1NP1/PPP1PP1P/RNBQKB1R w KQkq - +Pirc: Byrne variation * +r2qkbnr/ppp2ppp/2npb3/4p3/2P5/2N3P1/PP1PPPBP/R1BQK1NR w KQkq - +English, Tr\"oger defense +r2qkbnr/ppp2ppp/8/3p4/1n1Pp3/4P3/PPPNQPPP/RNB1K2R w KQkq - +French: classical, Alapin variation * +r2qkbnr/ppp3pp/2n2p2/3pP3/6b1/5NP1/PPPPP2P/RNBQKB1R w KQkq - +Dutch: Staunton gambit, Lasker variation * +r2qkbnr/ppp3pp/2n5/3p1p2/3Pp3/4P3/PPPNQPPP/RNB1K2R w KQkq - +French: classical, Steinitz variation * +r2qkbnr/pppb1ppp/2B5/3p4/3Pp3/4PN1P/PPP2PP1/RNBQK2R b KQkq - +French: MacCutcheon, Lasker variation * +r2qkbnr/pppb1ppp/2n5/1B1p4/2PPp3/4P3/PP3PPP/RNBQK1NR w KQkq - +French: Winawer, advance, Bogolyubov variation * +r2qkbnr/pppb1ppp/2n5/1B1p4/3Pp3/4P2P/PPPN1PP1/RNBQK2R b KQkq - +French: MacCutcheon, Tartakower variation * +r2qkbnr/pppb1ppp/2n5/1B1pp3/3P4/4P3/PPP2PPP/RNBQK1NR w KQkq - +French: Winawer, fingerslip variation * +r2qkbnr/pppb1ppp/2n5/3pp3/Q3P3/2P2N2/PP1P1PPP/RNB1KB1R w KQkq - +Ponziani: Caro variation +r2qkbnr/pppb1ppp/2np4/1B2p3/2PPP3/5N2/PP3PPP/RNBQK2R b KQkq - +Ruy Lopez: old Steinitz defense, semi-Duras variation +r2qkbnr/pppb2pp/2npP3/1B3p2/3p4/5N2/PPP2PPP/RNBQK2R b KQkq - +KGD: Falkbeer, Morphy gambit * +r2qkbnr/pppnpppp/8/3p4/6b1/5NP1/PPPPPPBP/RNBQK2R w KQkq - +R\'eti: King's Indian attack, Keres variation +r2qr1k1/p1p2ppp/2p2n2/3pp1B1/1b2P1b1/3P1N2/PPP1QPPP/R2N1RK1 b - - +Four knights: symmetrical, Capablanca variation * +r2qr1k1/p1p2ppp/5n2/1p1P3b/Q5P1/2N1Bn1P/PPP1KP2/R4B1R w - - +two knights defense: Yurdansky attack * +r2qr1k1/ppp1bppp/2n2n2/4p3/2P3b1/2NPBN2/PP2BPPP/R2Q1RK1 w - - +Philidor: Berger variation * +r2r2k1/ppq2ppp/2n1pn2/2bp4/2P5/2N1PN1P/PP1BQPP1/R4RK1 b - - +QGD: Lasker defense, Russian variation * +r3k1nr/ppp1qppp/2n5/4P3/1bPp4/5N1P/PP1BPPP1/R2QKB1R w KQkq - +QGD: Albin counter-gambit, Kr\'enosz variation +r3k2r/p2q1ppp/5n2/3pp3/1b6/4P3/PP3PPP/RNBQ1RK1 w kq - +QGD: Semi-Tarrasch, Kmoch variation * +r3k2r/ppp1qppp/2n1b3/2bnp3/8/2NPPN2/PP2BPPP/R1BQK2R w KQkq - +Sicilian: Velimirovi\'c attack * +r3k2r/ppp2ppp/2n1bP2/2b2qN1/2ppN3/8/PPP2PPP/R1BQR1K1 b kq - +two knights: Max Lange attack, Marshall variation +r3k2r/pppq2pp/2n1bp2/2bnp3/8/2NP1NP1/PP1BPPBP/R2Q1RK1 b kq - +Sicilian: dragon, Yugoslav attack, 9...Bd7 * +r3k2r/pppq2pp/2n1bp2/2bnp3/8/2NP1NP1/PP2PPBP/R1BQ1RK1 w kq - +Sicilian: dragon, Yugoslav attack, 9.Bc4 * +r3k2r/pppq2pp/2n1bp2/2bnp3/P7/2NP1NP1/1P2PPBP/R1BQ1RK1 b kq - +Sicilian: dragon, Yugoslav attack, Byrne variation * +r3k2r/pppqbppp/2n1b3/3np3/8/2NP1NP1/PP2PPBP/R1BQK2R w KQkq - +Sicilian: dragon, classical, Amsterdam variation * +r3k2r/ppq1ppbp/2N3p1/2pp4/6n1/1P2P3/PBPP1PPP/RN1Q1RK1 w kq - +Bogo-Indian defense, Monticelli trap * +r3kb1r/1b3ppp/p2ppn2/qpn1P1B1/3N4/1BN5/PPPQ1PPP/2KRR3 b kq - +Sicilian: Najdorf, Ivkov variation +r3kb1r/1bq2ppp/p3pn2/1p1P4/2p5/2N1PN2/PPQ2PPP/R1BR2K1 w kq - +QGA: classical, Flohr variation +r3kb1r/1pp2ppp/p1p1b3/3q4/3PN3/8/PPP2PPP/R1BQR1K1 w kq - +Four knights: Spielmann variation +r3kb1r/5ppp/b3pn2/1p1qN1B1/3p4/3B4/PP2QPPP/R4RK1 b kq - +QGD semi-Slav: Meran, Rellstab attack +r3kb1r/p4ppp/1qp1pn2/3p4/3P4/3Q3P/PPP2PP1/RNB2RK1 b kq - +QGD: Lasker defense, Bernstein variation * +r3kb1r/pp1Npppp/1qn2n2/1Bp5/2p5/2N1P3/PP1P1PPP/R1BQK2R b KQkq - +Nimzo-Indian: Spielmann, Karlsbad variation * +r3kb1r/pp1b1ppp/nq2pn2/3p4/3P1B2/4PN2/PP3PPP/RNQ1KB1R w KQkq - +QGD Slav: Landau variation * +r3kb1r/pp1bpppp/1qn2n2/1Bp5/2N5/2N1P3/PP1P1PPP/R1BQK2R b KQkq - +Nimzo-Indian: Spielmann, San Remo variation * +r3kb1r/pp1qn1pp/2n1bp2/2ppp3/8/P1NP1NP1/1PP1PPBP/1RBQ1RK1 b kq - +King's Indian: S\"amisch, Panno main line * +r3kb1r/pp1qpppp/2np1n2/2p5/3PP3/2P2N2/PP3PPP/RNBQ1RK1 b kq - +Sicilian: Canal-Sokolsky attack, Bronstein gambit +r3kb1r/pp2pppp/1qn2n2/2pp4/3P4/2P1PQ1P/PP3PP1/RNB1KB1R w KQkq - +QGD/QGD semi-Slav: Hastings variation * +r3kb1r/pp2pppp/2n2n2/2pq4/3P2b1/4PN2/PP3PPP/RNBQKB1R w KQkq - +QGD: Semi-Tarrasch, Primitive Pillsbury variation * +r3kb1r/pp2pppp/2n5/q1p5/1n1PP1b1/P4N2/1P3PPP/RNBQKB1R w KQkq - +QGD: Semi-Tarrasch, Krause variation * +r3kb1r/pp3ppp/1qn1bn2/3pp1B1/2P5/6P1/PP1NPPBP/RN1Q1RK1 b kq - +Gr\"unfeld defense: Smyslov, Yugoslav variation * +r3kb1r/pp3ppp/1qn1bn2/3pp1B1/8/6P1/PPPNPPBP/RN1Q1RK1 w kq - +Gr\"unfeld defense: Smyslov, main line * +r3kb1r/pp3ppp/1qn1pn2/1B1p1b2/3P1B2/2N1PN2/PP3PPP/R2QK2R b KQkq - +QGD Slav: exchange, Trifunovi\'c variation * +r3kb1r/pp3ppp/1qn1pn2/2pp4/3P2b1/4PN2/PPPNBPPP/R1BQ1RK1 w kq - +QGD: Orthodox defense, Rauzer variation * +r3kb1r/pp3ppp/2n2q2/2Pp4/1P2p1b1/2P1PN2/P2N1P2/R1BQKB1R w KQkq - +QGD semi-Slav: anti-Meran, Szab\'o variation * +r3kb1r/ppp1q1pp/2n5/3n4/1P2p1b1/P3PN2/2Q2PPP/RNB1KB1R w KQkq - +Sicilian: Najdorf, Polugayevsky, Simagin variation * +r3kb1r/ppp2ppp/2n1bP2/5qN1/2ppN3/8/PPP2PPP/R1BQR1K1 w kq - +two knights: Max Lange attack, Rubinstein variation +r3kb1r/ppp2ppp/2nq4/3np3/6b1/2NPPN2/PP3PPP/R1BQKB1R w KQkq - +Sicilian: Richter-Rauzer, Keres variation * +r3kb1r/ppp3pp/2n1bq2/3npp2/8/2NPPN2/PP2BPPP/R1BQK2R w KQkq - +Sicilian: Scheveningen, Tal variation * +r3kb1r/ppp3pp/2n2q2/3npp1b/6P1/P2PPN1P/1P2BP2/RNBQK2R b KQkq - +Sicilian: Najdorf, G\"oteborg (Argentine) variation * +r3kb1r/ppp3pp/2n2q2/3npp1b/8/P2PPN1P/1PQ1BPP1/RNB1K2R b KQkq - +Sicilian: Najdorf, Browne variation * +r3kb1r/ppp3pp/2n2q2/3npp2/6b1/P2PPN2/1PQ1BPPP/RNB1K2R b KQkq - +Sicilian: Najdorf variation * +r3kb1r/pppq1ppp/2n1b3/3np3/8/P2PPN2/1P3PPP/RNBQKB1R w KQkq - +Sicilian: Scheveningen, English variation * +r3kb1r/pppq1ppp/2n5/3np3/6b1/2NP1N2/PP1BPPPP/R2QKB1R w KQkq - +Sicilian: Richter-Rauzer, Larsen variation, 7.Qd2 * +r3kb1r/pppq1ppp/2n5/3np3/6b1/2NPPN2/PP2BPPP/R1BQK2R b KQkq - +Sicilian: Richter-Rauzer, Rauzer attack, 7...Be7 * +r3kb1r/pppq1ppp/2n5/3np3/6b1/2NPPN2/PP3PPP/R1BQKB1R w KQkq - +Sicilian: Richter-Rauzer, Rauzer attack * +r3kb1r/pppq1ppp/2n5/3np3/6b1/P1NPPN2/1P3PPP/R1BQKB1R b KQkq - +Sicilian: Richter-Rauzer, Rauzer attack, 7...a6 * +r3kb1r/ppq2ppp/2n1pn2/2pp4/3P2b1/4PN2/PPPNBPPP/R1BQ1RK1 w kq - +QGD: Orthodox defense, Rubinstein variation * +r3kb1r/ppq2ppp/2n1pn2/2ppN3/3P4/4P2P/PPP1QPP1/RNB2RK1 w kq - +QGD: Lasker defense, Teichmann variation * +r3kb1r/ppq2ppp/2n1pn2/3p4/2Pp2b1/4PN2/PP1NBPPP/R1BQ1RK1 w kq - +QGD: Orthodox defense, 7.Qc2 c5, 8.cd (Rubinstein) * +r3kb1r/ppqbpp1p/2n2np1/1Bp5/2N2P2/2N1P3/PP1P2PP/R1BQK2R w KQkq - +Nimzo-Indian: Spielmann, St\aa hlberg variation * +r3kb1r/ppqn1ppp/2n1p3/1Bpp3b/Q2P4/2P1PN2/PP1N1PPP/R1B2RK1 w kq - +QGD: Cambridge Springs defense, Argentine variation * +r3kb1r/ppqn1ppp/2n1p3/1Bpp4/Q2P2b1/2P1PN2/PP1N1PPP/R1B1K2R w KQkq - +QGD: Cambridge Springs defense, Bogolyubov variation * +r3kb1r/ppqn1ppp/2p2n2/4pb2/P1NP4/2N3P1/1P2PP1P/R1BQKB1R w KQkq - +QGD Slav: Carlsbad variation +r3kbnr/1ppb1ppp/p1p5/8/3NP3/8/PPP2PPP/RNB1K2R w KQkq - +Ruy Lopez: exchange, Alekhine variation +r3kbnr/p1pb1ppp/2p5/3pN1q1/3Pp3/4P1PP/PPP2P2/RNBQK2R b KQkq - +French: MacCutcheon, Lasker variation, 8...g6 * +r3kbnr/pp1qpppp/8/2ppP3/2P3b1/6P1/PP2PP1P/RNBQKB1R b KQkq - +Gr\"unfeld: Lundin variation * +r3kbnr/ppp2pp1/2n5/1B1p2qP/3P4/4P3/PPP2Pp1/RNBQK1R1 w Qkq - +French: MacCutcheon, Grigoriev variation * +r3kbnr/ppp2ppp/2n5/3p2q1/3Pp3/4P3/PPP1BPPP/RNBQK2R w KQkq - +French: classical, Anderssen-Richter variation * +r3kbnr/ppp2ppp/2n5/3p2q1/3Pp3/4P3/PPPNQPPP/RNB1K2R w KQkq - +French: classical, Pollock variation * +r3kbnr/pppq1ppp/2n1b3/3pp3/8/2PP1NP1/PP2PP1P/RNBQKB1R w KQkq - +Pirc: 150 attack * +r3kbnr/pppq1ppp/2n5/1B1p4/Q7/4PP2/PPP2P1P/RNB1K2R b KQkq - +French: MacCutcheon, Bogolyubov variation * +r3kbnr/pppq1ppp/2n5/3p4/3Pp3/4P3/PPPNQPPP/RNB1K2R w KQkq - +French: classical, Rubinstein variation * +r3kbnr/ppq1pppp/2n5/3p4/3P2b1/2P2N2/PP3PPP/RNBQKB1R w KQkq - +QGD: exchange, positional line, 6.Qc2 * +r3qrk1/ppp1b1pp/2n1b3/3npp2/8/P1NPPN2/1PQ1BPPP/R1B2RK1 b - - +Sicilian: Scheveningen, classical main line * +r3r1k1/1p1n1p1p/1bpqb1p1/p2p2B1/1P1N3Q/P1PBR3/5PPP/5RK1 b - - +Ruy Lopez: Marshall, main line, Spassky variation * +r3r1k1/2qbbp1p/p2p1np1/npp1p3/3PP3/2P1NN1P/PPB2PP1/R1BQR1K1 w - - +Ruy Lopez: closed, Chigorin, Yugoslav system +r3r1k1/ppp1qppp/2n5/3b4/2P1p3/8/P1PPBPPP/R1BQ1RK1 b - - +Ruy Lopez: Berlin defense, Rio de Janeiro variation * +r4b1r/ppp1kp2/2n1bN1p/q5p1/1P1p3B/5N2/P1P2PPP/R2QR1K1 b - - +two knights defense: Yurdansky attack +r4rk1/2pqb1pp/p1n1p3/1p1pP3/4R3/1BP5/PP3PPP/RNBQ2K1 b - - +Ruy Lopez: open, Tarrasch trap +r4rk1/2pqbppp/p1n1b3/3pP3/2B1n3/5N2/PP2QPPP/RNBR2K1 w - - +Ruy Lopez: open, Howell attack, Ekstr\"om variation +r4rk1/p4ppp/bqn2n2/2b5/B3p3/2N3Q1/PPPPNPPP/R1B1K2R w KQ - +Evans gambit: compromised defense, Paulsen variation * +r4rk1/pbqnppbp/1p3np1/2pp4/P2P4/BPP1PN2/3NBPPP/R2Q1RK1 b - - +Catalan: closed, Sokolsky variation * +r4rk1/pp1bqpp1/2n1pn1p/2p5/2BP4/2N1PN2/PPQ2PPP/R2R2K1 w - - +QGD: Lasker defense, Russian variation +r4rk1/pp2ppbp/3p1np1/q4P2/4P1P1/2N1B3/PPP1Q2P/R4RK1 b - - +Sicilian: dragon, classical, Stockholm attack +r4rk1/pp2qppp/3b4/3P4/1P1Qn1b1/B3PN2/5PPP/R3KB1R w KQ - +QGD semi-Slav: Meran, Rellstab attack * +r4rk1/ppp1q2p/2n1b3/4p1p1/Q4p2/3P1NP1/PP2PPBP/R4RK1 w - - +Sicilian: dragon, classical, Stockholm attack * +r4rk1/ppp3pp/2n1bq2/4pP2/8/5Q2/PPPP1K1P/RNB2BNR w - - +KGA: Lolli gambit, Young variation * +r4rk1/pppqbppp/2n1b3/3np3/8/2NP1NP1/PP2PPBP/R1BQ1RK1 w - - +Sicilian: dragon, classical, Richter variation * +r4rk1/ppq1ppbp/2n2np1/2pp4/3P1Pb1/2P1PN2/PP2B1PP/RNB1QRK1 w - - +Dutch: stonewall: Chekhover variation * +r5nr/pp2k2p/2n2p2/2N1p2q/3pP3/3P2P1/PPP2PBP/RNB2RK1 b - - +King's Indian: S\"amisch, orthodox, Bronstein variation * +rn1q1rk1/1p3pbp/p2p1np1/2pP4/P3P1b1/2N2N2/1P2BPPP/R1BQ1RK1 w - - +Benoni: classical with ...a6 and 10...Bg4 +rn1q1rk1/4ppbp/3p1np1/2pP4/4P3/2N2NP1/PP3PKP/R1BQ3R b - - +Benk\"o gambit: main line +rn1q1rk1/p3ppbp/bp3np1/2pp4/3P1P2/2P1PN2/PP2B1PP/RNBQ1RK1 w - - +Dutch: stonewall with Ba3 * +rn1q1rk1/pb1pbppp/1p2pn2/8/2PN4/1P1BP3/PB3PPP/RN1Q1RK1 b - - +Queen's Indian: Averbakh variation +rn1q1rk1/pb3ppp/1p1bp3/2pn4/8/1P2PN2/PB1PBPPP/RN1Q1RK1 w - - +Queen's Indian: Averbakh variation * +rn1q1rk1/pb3ppp/5n2/2b1p3/N2p4/1B1P4/PPP1NPPP/R1BQK2R b KQ - +Evans gambit: Paulsen variation * +rn1q1rk1/pb3ppp/5n2/2b1p3/N2p4/1B1P4/PPP2PPP/R1BQK1NR w KQ - +Evans gambit: Ulvestad variation * +rn1q1rk1/pb3ppp/8/1Bb5/4N1n1/5N2/PPPP1PPP/R1BQ1RK1 b - - +Scotch gambit: Hanneken variation * +rn1q1rk1/pbp1bppp/1p3n2/3pN1B1/3P4/2NBP3/PP3PPP/R2QK2R b KQ - +QGD: Pillsbury attack +rn1q1rk1/pbpp1ppp/1p2p3/6N1/2PP4/2n3P1/PPQ1PPBP/R3K2R b KQ - +Bogo-Indian defense, Monticelli trap +rn1q1rk1/pbppbppp/1p2p3/8/2PP4/2Q2NP1/PP2PPBP/R1B2RK1 b - - +Queen's Indian: old main line, 9.Qxc3 +rn1q1rk1/pbppbppp/1p2pn2/8/2PP4/1P3NP1/P3PPBP/RNBQ1RK1 b - - +Queen's Indian: Euwe variation +rn1q1rk1/pbppbppp/1p2pn2/8/2PP4/2N2NP1/PP2PPBP/R1BQ1RK1 b - - +Queen's Indian: old main line, 7.Nc3 +rn1q1rk1/pp1nppbp/6p1/2p5/3PP1b1/1QN1BN2/PP3PPP/R3KB1R w KQ - +Gr\"unfeld defense: Smyslov, Yugoslav variation +rn1q1rk1/pp2ppbp/2p2np1/3p1b2/2PP4/2NBPN2/PP3PPP/R1BQ1RK1 w - - +Gr\"unfeld: Flohr defense +rn1q1rk1/pp2ppbp/2p2np1/3p4/2PP2b1/2NBPN2/PP3PPP/R1BQ1RK1 w - - +Gr\"unfeld: Smyslov defense +rn1q1rk1/pp2ppbp/2pp1np1/5b2/2PP4/2N2NP1/PP2PPBP/R1BQ1RK1 w - - +King's Indian: fianchetto, Larsen system +rn1q1rk1/pp2ppbp/4bnp1/2Pp4/2P2B2/2N1P3/PP3PPP/2RQKBNR w K - +Gr\"unfeld: Gr\"unfeld gambit, Botvinnik variation +rn1q1rk1/pp3ppp/2p1p3/5b2/PbBPn1P1/2N1PN2/1P2QP1P/R1B2RK1 b - - +QGD Slav: Dutch, S\"amisch variation +rn1q1rk1/pp3ppp/2p1pn2/5b2/PbBP4/2N1PN2/1P2QPPP/R1B2RK1 b - - +QGD Slav: Dutch variation, main line +rn1q1rk1/ppp1b1pp/1n2pp2/4Pb2/2PP4/2N2N2/PP2B1PP/R1BQ1RK1 w - - +Alekhine's defense: four pawns attack, Korchnoi variation +rn1q1rk1/ppp1ppbp/5np1/8/2QPP1b1/2N2N2/PP3PPP/R1B1KB1R w KQ - +Gr\"unfeld: Russian, Smyslov variation +rn1q1rk1/ppp2ppp/3b4/3p4/2PPn1b1/3B1N2/PP3PPP/RNBQ1RK1 w - - +Petrov: classical attack, Tarrasch variation +rn1q1rk1/ppp2ppp/8/2bNp3/4P1b1/3P1N2/PPP2PPP/R1BQK2R b KQ - +Giuoco piano * +rn1q1rk1/ppp2ppp/8/2bP1b2/4nPP1/5N2/PPP1Q2P/RNB1KB1R w KQ - +KGD: Falkbeer, Tarrasch variation +rn1q1rk1/ppp3pp/8/2bNpp1b/4P1P1/5N1P/PPPP1P2/R1BQK2R w KQ - +Giuoco piano: Rosentreter variation * +rn1q1rk1/ppp3pp/8/3P1p2/3Pn1b1/3B1N2/PP3PPb/RNBQR1K1 w - - +Petrov: classical attack, Marshall trap +rn1q1rk1/pppnppbp/6p1/8/3PP1b1/1QN1BN2/PP3PPP/R3KB1R b KQ - +Gr\"unfeld defense: Smyslov, main line +rn1qk1nr/pb3ppp/8/2b1p3/3P4/8/PPP2PPP/RNBQKBNR b KQkq - +Danish gambit: Schlechter defense * +rn1qk1nr/pb3ppp/8/2b1p3/8/8/PPPPQPPP/RNB1KBNR b KQkq - +Danish gambit: Collijn defense * +rn1qk1nr/pp1bppbp/6p1/2pp4/5P2/4PN2/PPPPB1PP/RNBQK2R b KQkq - +Dutch-Indian, Alekhine variation * +rn1qk1nr/pp3ppp/2pb4/3p1b2/3P4/2N2N2/PP2PPPP/R1BQKB1R w KQkq - +Caro-Kann: exchange, Rubinstein variation * +rn1qk1nr/ppp1ppbp/3p2p1/8/2PPP1b1/5N2/PP3PPP/RNBQKB1R w KQkq - +Robatsch defense: Rossolimo variation +rn1qk1nr/ppp2ppp/8/2b1p3/Q3P1b1/2P2N2/PP1P2PP/RNB1KB1R b KQkq - +KGD: classical, Marshall attack +rn1qk2r/1bpp1ppp/1p2pn2/p7/1bPP4/5NP1/PP1BPPBP/RN1QK2R w KQkq - +Queen's Indian: Yates variation +rn1qk2r/p1pp1ppp/bp2pn2/8/1bPP4/2N1P3/PP2NPPP/R1BQKB1R w KQkq - +Nimzo-Indian: 4.e3, Bronstein (Byrne) variation +rn1qk2r/p4ppp/2p2n2/2bpp3/B3P1b1/2NP4/PPP2PPP/R1BQK1NR w KQkq - +Evans gambit: Sokolsky variation * +rn1qk2r/pb1pbppp/1p2pn2/2p5/2P5/2N2NP1/PP1PPPBP/R1BQ1RK1 w kq - +English: symmetrical, hedgehog system +rn1qk2r/pbpp1pp1/1p2pn1p/8/1bPP3B/2N2N2/PP2PPPP/R2QKB1R w KQkq - +Queen's Indian: 4.Nc3, main line +rn1qk2r/pbpp1ppp/1p2pn2/8/1bPP4/5NP1/PP2PPBP/RNBQK2R w KQkq - +Queen's Indian: Capablanca variation +rn1qk2r/pbpp1ppp/5n2/1pb1p3/4P3/1BN5/PPPP1PPP/R1BQK1NR w KQkq - +Evans gambit declined, Cordel variation * +rn1qk2r/pbppbppp/1p2p3/8/2PPn3/2N2NP1/PP1BPPBP/R2QK2R b KQkq - +Queen's Indian: Opo\v censky variation +rn1qk2r/pbppbppp/1p2pn2/8/2PP4/2N2NP1/PP2PPBP/R1BQK2R b KQkq - +Queen's Indian: anti-Queen's Indian system +rn1qk2r/pbppbppp/1p2pn2/8/2PP4/5NP1/PP1BPPBP/RN1QK2R w KQkq - +Queen's Indian: Riumin variation +rn1qk2r/pbppbppp/1p2pn2/8/2PP4/5NP1/PP2PPBP/RNBQ1RK1 b kq - +Queen's Indian: old main line, 6.O-O +rn1qk2r/pbppbppp/1p2pn2/8/2PP4/5NP1/PP2PPBP/RNBQK2R w KQkq - +Queen's Indian: 5.Bg2 Be7 +rn1qk2r/pp1bppbp/5np1/1Bpp4/P7/1P2PN2/1BPP1PPP/RN1QK2R b KQkq - +Queen's Indian: Yates variation * +rn1qk2r/pp1bppbp/5np1/2pp4/8/1P2PN2/PBPPBPPP/RN1QK2R b KQkq - +Queen's Indian: Riumin variation * +rn1qk2r/pp3ppp/2p1b3/3np3/1bB5/2N2Q2/PPPPNPPP/R1B1K2R w KQkq - +Scotch: Paulsen attack * +rn1qk2r/pp3ppp/2p1b3/3np3/1bB5/5Q2/PPPPNPPP/R1BNK2R b KQkq - +Scotch: Paulsen, Gunsberg defense * +rn1qk2r/pp3ppp/2p1pn2/5b2/PbBP4/2N1PN2/1P3PPP/R1BQ1RK1 b kq - +QGD Slav: Dutch variation +rn1qk2r/pp3ppp/2p2n2/2bpp3/4P1b1/1BN5/PPPPQPPP/R1B1K1NR w KQkq - +Giuoco Piano: Mestel variation * +rn1qk2r/ppp2ppp/3pbn2/4p3/1bB1P3/2N2N2/PPPP1PPP/R1BQK2R w KQkq - +Ruy Lopez: Berlin defense, Kaufmann variation * +rn1qk2r/ppp2ppp/8/2bP1b2/4nP2/5N2/PPP1Q1PP/RNB1KB1R w KQkq - +KGD: Falkbeer, main line, 7...Bf5 +rn1qk2r/ppp3p1/8/2bpP1Pp/4b3/7P/PPP3K1/RNBQ1BNR w kq - +KGA: Allgaier, Cook variation * +rn1qk2r/pppbbppp/8/3pP3/N3n3/2PB1N1P/P1Q2PP1/R1B1K2R w KQkq - +two knights defense: Knorre variation * +rn1qkb1r/1b3ppp/p3pn2/1pp5/3P4/1B2PN2/PP2QPPP/RNB2RK1 w kq - +QGA: classical, 8...Bb7 +rn1qkb1r/4pp1p/3p1np1/2pP4/4P3/2N3P1/PP3P1P/R1BQ1KNR b kq - +Benk\"o gambit +rn1qkb1r/4pp1p/3p1np1/2pP4/4P3/2N5/PP2NPPP/R1BQ1K1R b kq - +Benk\"o gambit: Ne2 variation +rn1qkb1r/4pp1p/b2p1np1/2pP4/8/2N2NP1/PP2PP1P/R1BQKB1R b KQkq - +Benk\"o gambit: fianchetto variation +rn1qkb1r/4pp1p/b2p1np1/2pP4/8/2N5/PP1NPPPP/R1BQKB1R b KQkq - +Benk\"o gambit: Nd2 variation +rn1qkb1r/4pppp/b2p1n2/2pP4/4P3/2N5/PP3PPP/R1BQKBNR b KQkq - +Benk\"o gambit: 7.e4 +rn1qkb1r/p1pp1ppp/bp2pn2/8/2PP4/5NP1/PP2PP1P/RNBQKB1R w KQkq - +Queen's Indian: Nimzovich variation (exaggerated fianchetto) +rn1qkb1r/pb1p1ppp/1p2pn2/2p5/2PP4/4PN2/PP3PPP/RNBQKB1R w KQkq - +English: Wimpey system * +rn1qkb1r/pb1p1ppp/1p3n2/2pp2N1/2P5/6P1/PP2PPBP/RNBQK2R b KQkq - +Queen's Indian: B\"urger variation +rn1qkb1r/pb1p1ppp/1p3n2/2pp4/2P4N/6P1/PP2PPBP/RNBQK2R b KQkq - +Queen's Indian: Rubinstein variation +rn1qkb1r/pb1ppppp/1p3n2/2p3B1/3P4/2P2N2/PP2PPPP/RN1QKB1R b KQkq - +English: Capablanca's variation * +rn1qkb1r/pb1ppppp/1p3n2/2p5/3P1B2/2P2N2/PP2PPPP/RN1QKB1R b KQkq - +English: New York (London) defensive system * +rn1qkb1r/pb1ppppp/1p3n2/2p5/3P4/2P2N2/PP2PPPP/RNBQKB1R w KQkq - +English: Caro-Kann defensive system * +rn1qkb1r/pb1ppppp/1p3n2/2p5/3P4/2P2NP1/PP2PP1P/RNBQKB1R b KQkq - +English: Bled variation * +rn1qkb1r/pb1ppppp/1p3n2/2p5/3P4/5NP1/PPP1PPBP/RNBQK2R w KQkq - +Queen's Indian: Marienbad system +rn1qkb1r/pb1ppppp/1p3n2/8/2PQ4/5NP1/PP2PPBP/RNB1K2R b KQkq - +Queen's Indian: Marienbad system, Berg variation +rn1qkb1r/pbpp1p2/1p2p2p/6pn/2PP4/2N2NB1/PP2PPPP/R2QKB1R w KQkq - +Queen's Indian: 4.Nc3, Botvinnik variation +rn1qkb1r/pbpp1ppp/1p2pn2/8/2P1P3/2NB1N2/PP1P1PPP/R1BQK2R b KQkq - +English: Queens Indian, Romanishin variation +rn1qkb1r/pbpp1ppp/1p2pn2/8/2PP4/5NP1/PP2PP1P/RNBQKB1R w KQkq - +Queen's Indian: 4.g3 Bb7 +rn1qkb1r/pp1bpppp/5n2/1Bpp4/8/4PN2/PPPPQPPP/RNB1K2R b KQkq - +Bogo-Indian defense, Nimzovich variation * +rn1qkb1r/pp1n1ppp/4p3/3pNb2/3P4/2N1P3/PP3PPP/R1BQKB1R w KQkq - +QGD Slav: Amsterdam variation +rn1qkb1r/pp2pppp/2p2n2/3p1b2/2P5/1P3N2/PB1PPPPP/RN1QKB1R w KQkq - +English: New York (London) defensive system +rn1qkb1r/pp2pppp/2p2n2/3p1b2/2P5/1P3NP1/P2PPP1P/RNBQKB1R w KQkq - +English: London defensive system +rn1qkb1r/pp2pppp/2p2n2/3p1b2/2PP4/4PN2/PP3PPP/RNBQKB1R w KQkq - +QGD Slav: 4.e3 Bf5 +rn1qkb1r/pp2pppp/2p2n2/3p4/2P3b1/1P3N2/PB1PPPPP/RN1QKB1R w KQkq - +English: Capablanca's variation +rn1qkb1r/pp2pppp/2p2n2/3p4/2P3b1/1P3NP1/P2PPP1P/RNBQKB1R w KQkq - +English: Torre defensive system +rn1qkb1r/pp2pppp/2p2n2/3p4/6b1/5NP1/PPPPPPBP/RNBQ1RK1 w kq - +R\'eti: King's Indian attack, Yugoslav variation +rn1qkb1r/pp2pppp/2p2n2/4Nb2/P1pP4/2N5/1P2PPPP/R1BQKB1R b KQkq - +QGD Slav: Krause attack +rn1qkb1r/pp2pppp/2p2n2/5b2/P1pP4/2N1PN2/1P3PPP/R1BQKB1R b KQkq - +QGD Slav: Dutch variation +rn1qkb1r/pp2pppp/2p2n2/5b2/P1pP4/2N2N2/1P2PPPP/R1BQKB1R w KQkq - +QGD Slav: Czech defense +rn1qkb1r/pp2pppp/2p2n2/8/P1pP2b1/2N2N2/1P2PPPP/R1BQKB1R w KQkq - +QGD Slav: Steiner variation +rn1qkb1r/pp2pppp/2pp4/3nP3/3P2b1/5N2/PPP1BPPP/RNBQK2R w KQkq - +Alekhine's defense: modern, Flohr variation +rn1qkb1r/pp2pppp/5n2/1Bpp4/3P2b1/4PN2/PPP2PPP/RNBQK2R b KQkq - +QGD: Vienna variation * +rn1qkb1r/pp2pppp/5n2/2p5/1PPp2b1/4PN2/P2P1PPP/RNBQKB1R w KQkq - +Blumenfeld counter-gambit, Dus-Chotimursky variation * +rn1qkb1r/pp2pppp/5n2/2pp1b2/8/1P2PN2/P1PP1PPP/RNBQKB1R w KQkq - +Queen's Indian: Miles variation * +rn1qkb1r/pp2pppp/5n2/2pp4/3P2b1/4PN1P/PPP2PP1/RNBQKB1R b KQkq - +QGD: Capablanca-Duras variation * +rn1qkb1r/pp2pppp/5n2/2pp4/3P2b1/4PN2/PPP2PPP/RNBQKB1R w KQkq - +QGD * +rn1qkb1r/pp2pppp/5n2/3p1b2/3P4/2N1PN2/PP3PPP/R1BQKB1R b KQkq - +QGD Slav: exchange variation +rn1qkb1r/pp2pppp/5n2/8/1PPp2b1/5N1P/P2P1PP1/RNBQKB1R b KQkq - +Blumenfeld counter-gambit, Spielmann variation * +rn1qkb1r/pp3ppp/2p1pn2/4Nb2/P1pP4/2N5/1P2PPPP/R1BQKB1R w KQkq - +QGD Slav: Wiesbaden variation +rn1qkb1r/pp3ppp/4b3/2pnp3/8/2N3P1/PP1PPPBP/R1BQK1NR w KQkq - +Sicilian: accelerated fianchetto, Mar\'oczy bind, 6.Be3 * +rn1qkb1r/ppn2ppp/2p1b3/4p3/2B5/2N2Q2/PPPPNPPP/R1B1K2R w KQkq - +Scotch: Meitner variation * +rn1qkb1r/ppp1pppp/1n1p4/3PP3/2P3b1/5N2/PP3PPP/RNBQKB1R b KQkq - +Alekhine's defense: modern, Vitolins attack +rn1qkb1r/ppp1pppp/1n1p4/4Pb2/2PP1P2/8/PP4PP/RNBQKBNR w KQkq - +Alekhine's defense: four pawns attack, Trifunovi\'c variation +rn1qkb1r/ppp1pppp/3p1n2/5b2/2PP4/2N5/PP2PPPP/R1BQKBNR w KQkq - +Old Indian: Janowski variation +rn1qkb1r/ppp1pppp/3p4/3nP3/2PP2b1/5N2/PP3PPP/RNBQKB1R b KQkq - +Alekhine's defense: modern, Alekhine variation +rn1qkb1r/ppp1pppp/3p4/3nP3/3P2b1/5N1P/PPP2PP1/RNBQKB1R b KQkq - +Alekhine's defense: modern, Panov variation +rn1qkb1r/ppp1pppp/3p4/3nP3/3P2b1/5N2/PPP2PPP/RNBQKB1R w KQkq - +Alekhine's defense: modern variation, 4...Bg4 +rn1qkb1r/ppp1pppp/4bn2/8/2pP4/4PN2/PP3PPP/RNBQKB1R w KQkq - +QGA, Flohr variation +rn1qkb1r/ppp1pppp/5B2/3p1b2/3P4/2N5/PPP1PPPP/R2QKBNR b KQkq - +Richter-Veresov attack, Veresov variation +rn1qkb1r/ppp1pppp/5n2/3p1b2/3P4/5N2/PPP1PPPP/RNBQKB1R w KQkq - +Queen's bishop game * +rn1qkb1r/ppp1pppp/5n2/3p1b2/8/5NP1/PPPPPP1P/RNBQKB1R w KQkq - +King's Indian: London system * +rn1qkb1r/ppp1pppp/5n2/3p1bB1/3P4/2N2P2/PPP1P1PP/R2QKBNR b KQkq - +Richter-Veresov attack, Richter variation +rn1qkb1r/ppp1pppp/5n2/3p4/3P2b1/5N2/PPP1PPPP/RNBQKB1R w KQkq - +Torre attack (Tartakower variation) * +rn1qkb1r/ppp1pppp/5n2/3p4/6b1/4PN2/PPPP1PPP/RNBQKB1R w KQkq - +Queen's pawn: Torre attack * +rn1qkb1r/ppp1pppp/5n2/3p4/6b1/5NP1/PPPPPP1P/RNBQKB1R w KQkq - +King's Indian: Torre attack * +rn1qkb1r/ppp1pppp/5n2/8/2pP2b1/4PN2/PP3PPP/RNBQKB1R w KQkq - +QGA, Janowsky-Larsen variation +rn1qkb1r/ppp2ppp/4b3/4p3/1nB5/2N2Q2/PPPP1PPP/R1B1K1NR w KQkq - +Scotch: Blumenfeld attack * +rn1qkb1r/ppp2ppp/5n2/3pp3/2P3b1/4PN2/PP1P1PPP/RNBQKB1R w KQkq - +Queen's pawn: Torre attack, Wagner gambit * +rn1qkb1r/ppp2ppp/8/3pP3/4n1b1/2N2N2/PPPPQ1PP/R1B1KB1R b KQkq - +Vienna gambit: Kaufmann variation +rn1qkb1r/ppp3p1/8/3ppbPp/3Pn3/5N2/PPP2P1P/RNBQKB1R w KQkq - +KGA: Kieseritsky, Brentano defense * +rn1qkb1r/pppb1ppp/8/1B2p2Q/1n6/2N5/PPPP1PPP/R1B1K1NR w KQkq - +Scotch game * +rn1qkbnr/1bpp1ppp/p7/1P6/3Q4/8/PP2PPPP/RNB1KBNR w KQkq - +Sicilian: wing gambit, Marienbad variation * +rn1qkbnr/1pp2ppp/p3p3/3P4/2B3b1/4PN2/PP3PPP/RNBQK2R b KQkq - +QGA: Alekhine defense, Alatortsev variation +rn1qkbnr/p1pppppp/bp6/8/3PP3/8/PPP2PPP/RNBQKBNR w KQkq - +Guatemala defense +rn1qkbnr/pp1b1ppp/4P3/1Bp5/4p3/8/PPP2PPP/RNBQK1NR b KQkq - +QGD: Albin counter-gambit, Lasker trap * +rn1qkbnr/pp1bpppp/3p4/1Bp5/4P3/5N2/PPPP1PPP/RNBQK2R w KQkq - +Sicilian: Canal-Sokolsky attack, 3...Bd7 +rn1qkbnr/pp2pppp/2p3b1/8/3P1P2/6N1/PPP3PP/R1BQKBNR b KQkq - +Caro-Kann: classical, Mar\'oczy attack +rn1qkbnr/pp2pppp/2p3b1/8/3P3P/6N1/PPP2PP1/R1BQKBNR b KQkq - +Caro-Kann: classical, 6.h4 +rn1qkbnr/pp2pppp/2p3b1/8/3P4/6NN/PPP2PPP/R1BQKB1R b KQkq - +Caro-Kann: classical, Flohr variation +rn1qkbnr/pp2pppp/2p5/3p4/2P3b1/1P3N2/P2PPPPP/RNBQKB1R w KQkq - +English: Caro-Kann defensive system, Bogolyubov variation +rn1qkbnr/pp2pppp/2p5/3p4/4P1b1/2N2N2/PPPP1PPP/R1BQKB1R w KQkq - +Caro-Kann: two knights, 3...Bg4 +rn1qkbnr/pp2pppp/2p5/5b2/3PN3/8/PPP2PPP/R1BQKBNR w KQkq - +Caro-Kann: classical variation +rn1qkbnr/pp2pppp/8/2p2bN1/4p3/8/PPPP1PPP/RNBQKB1R w KQkq - +Budapest: Rubinstein variation * +rn1qkbnr/pp2pppp/8/2pp4/6b1/4PN2/PPPP1PPP/RNBQKB1R w KQkq - +Neo-Indian (Seirawan) attack * +rn1qkbnr/pp3ppp/2p1p3/3pPb2/3P4/2P5/PP2BPPP/RNBQK1NR b KQkq - +Caro-Kann: advance, Short variation +rn1qkbnr/pp4pp/4b3/2pp4/4p3/1NN5/PPP1PPPP/R1BQKB1R w KQkq - +Alekhine's defense: four pawns attack, 7.Be3 * +rn1qkbnr/ppp1pppp/3p4/8/3P2b1/5N2/PPP1PPPP/RNBQKB1R w KQkq - +Old Indian: Tartakower (Wade) variation +rn1qkbnr/ppp1pppp/3p4/8/4P1b1/5N2/PPPP1PPP/RNBQKB1R w KQkq - +R\'eti: Wade defense +rn1qkbnr/ppp1pppp/4b3/8/2p5/4PN2/PP1P1PPP/RNBQKB1R w KQkq - +R\'eti accepted: Keres variation +rn1qkbnr/ppp1pppp/8/3p1b2/2PP4/8/PP2PPPP/RNBQKBNR b KQkq - +Queen's pawn, Mason variation, Steinitz counter-gambit * +rn1qkbnr/ppp1pppp/8/3p1b2/2PP4/8/PP2PPPP/RNBQKBNR w KQkq - +QGD: Grau (Sahovic) defense +rn1qkbnr/ppp1pppp/8/3p1b2/3P4/8/PPP1PPPP/RNBQKBNR w KQkq - +Queen's pawn, Mason variation * +rn1qkbnr/ppp1pppp/8/3p1b2/8/5N2/PPPPPPPP/RNBQKB1R w KQkq - +Queen's pawn: London system * +rn1qkbnr/ppp1pppp/8/3p4/2P3b1/8/PP1PPPBP/RNBQK1NR b KQkq - +Grob: Fritz gambit +rn1qkbnr/ppp1pppp/8/3p4/3P2b1/2N5/PPP1PPPP/R1BQKBNR w KQkq - +Queen's pawn: Anti-Veresov +rn1qkbnr/ppp1pppp/8/3p4/3P2b1/8/PPP1PPPP/RNBQKBNR w KQkq - +Levitsky attack (Queen's bishop attack) * +rn1qkbnr/ppp1pppp/8/3p4/5Pb1/8/PPPPP1PP/RNBQKBNR w KQkq - +Dutch, 2.Bg5 variation * +rn1qkbnr/ppp1pppp/8/3p4/6b1/5N2/PPPPPPPP/RNBQKB1R w KQkq - +Trompovsky attack (Ruth, Opo\v censk\'y opening) * +rn1qkbnr/ppp1pppp/8/8/2Pp2b1/8/PP1PPPBP/RNBQK1NR w KQkq - +Grob: Romford counter-gambit +rn1qkbnr/ppp2ppp/2b1p3/8/3PN3/5N2/PPP2PPP/R1BQKB1R w KQkq - +French: Fort Knox variation +rn1qkbnr/ppp2ppp/3p4/4p3/2P3b1/2N2N2/PP1PPPPP/R1BQKB1R w KQkq - +English, Smyslov defense +rn1qkbnr/ppp2ppp/4b3/3pp3/3P4/4P3/PPP2PPP/RNBQKBNR w KQkq - +French: Alapin variation * +rn1qkbnr/ppp2ppp/8/3p4/5p2/6PB/PPPPP2P/RNBQK2R w KQkq - +Amar gambit +rn1qkbnr/pppb1ppp/3p4/8/3QP3/5N2/PPP2PPP/RNB1KB1R w KQkq - +Philidor: Boden variation +rn2k2r/pbpp1ppp/8/2b1p3/Np2Q3/1B6/PPPP1qPP/R1BK2NR w kq - +Evans gambit declined, Hicken variation * +rn2k2r/pp4pp/1q3p2/1N1pN3/3Pn3/5K2/PPP3PP/R1BQ3R w kq - +Giuoco Piano: Krause variation * +rn2kb1r/pp1q1ppp/2p1b3/3np3/2B5/2N2Q2/PPPPNPPP/R1B1K2R w KQkq - +Scotch: Blackburne attack * +rn2kb1r/pp2pppp/2p2n2/q3Nb2/3P2P1/2N5/PPP2P1P/R1BQKB1R b KQkq - +Scandinavian defense, Gr\"unfeld variation +rn2kb1r/pp3ppp/2p1q3/1N6/3p4/5Q2/PP3PPP/1RB2RK1 b kq - +Scotch: Gottschall variation * +rn2kb1r/ppp1pppp/5n2/q4b2/3P4/2N2N2/PPP2PPP/R1BQKB1R w KQkq - +Scandinavian defense +rn2kb1r/ppp1pppp/5n2/q7/3P2b1/2N2N1P/PPP2PP1/R1BQKB1R b KQkq - +Scandinavian defense, Lasker variation +rn2kbnr/pp1b1ppp/1q2p3/2ppP3/3P4/2P2N2/PP3PPP/RNBQKB1R w KQkq - +French: advance, Wade variation +rn2kbnr/pp1qpppp/3p4/2p5/2P1P3/5N2/PP1P1PPP/RNBQK2R b KQkq - +Sicilian: Canal-Sokolsky attack, Sokolsky variation +rn2kbnr/ppp2ppp/8/q3p3/3P2b1/2N2N2/PPP2PPP/R1BQKB1R w KQkq - +Scandinavian: Anderssen counter-attack, Collijn variation +rn3rk1/p1p1qpp1/1p2b2p/3p4/3P4/4PN2/PP3PPP/2RQKB1R w K - +QGD: Tartakower variation +rn3rk1/p4ppp/bqp5/2b1p3/N3n3/1B6/PPPQ1PPP/R1B1K1NR w KQ - +Evans gambit: Levenfish variation * +rnb1k1nr/p3qppp/2p1p3/1p6/PbpP4/2N1PN2/1P1B1PPP/R2QKB1R w KQkq - +QGD: semi-Slav, Koomen variation +rnb1k1nr/p4ppp/1qp1p3/1p6/PbpP4/2N1PN2/1P1B1PPP/R2QKB1R w KQkq - +QGD: semi-Slav, Junge variation +rnb1k1nr/pp1pq1pp/2p5/2b1pp2/2B1P3/2N2N2/PPPP1PPP/R1BQK2R w KQkq - +Bishop's opening: Lopez gambit * +rnb1k1nr/pp2ppbp/3p2p1/q1p5/2PPP3/2N2N2/PP3PPP/R1BQKB1R w KQkq - +Pterodactyl defense +rnb1k1nr/pp2ppbp/6p1/2qp4/8/4PN2/PPPN1PPP/R1BQKB1R w KQkq - +Catalan: open, 5.Qa4 Nbd7, 6.Qxc4 * +rnb1k1nr/pp2ppbp/6p1/q1Pp4/8/4PN2/PPP2PPP/RNBQKB1R w KQkq - +Catalan: open, 5.Qa4 * +rnb1k1nr/pp3ppp/2p5/2PP4/2B4q/5p2/PPP2PPP/RNBQ1RK1 b kq - +Bishop's opening: Pratt variation * +rnb1k1nr/pp3ppp/4p3/2pq4/1b1P4/2NB4/PPPB1PPP/R2QK1NR b KQkq - +French: Winawer, Kondratiyev variation +rnb1k1nr/ppp2pbp/3p4/4P1p1/2BP1p1q/2N5/PPP3PP/R1BQ1KNR b kq - +KGA: bishop's gambit, Grimm attack +rnb1k1nr/ppp2ppp/3b4/3B4/4Pp1q/8/PPPP2PP/RNBQ1KNR w kq - +KGA: bishop's gambit, Bor\'en-Svenonius variation +rnb1k1nr/pppp1pbp/8/6p1/2B1P2q/2N2Qp1/PPPP3P/R1B2KNR b kq - +KGA: bishop's gambit, Fraser variation +rnb1k1nr/pppp1pbp/8/6p1/2B1Pp1q/2N3P1/PPPP3P/R1BQ1KNR b kq - +KGA: bishop's gambit, McDonnell attack +rnb1k1nr/pppp1ppp/8/2b1p1q1/2B1P3/2P5/PP1P1PPP/RNBQK1NR w KQkq - +Bishop's opening: del Rio variation +rnb1k1nr/pppp1ppp/8/2b5/2B1Pp1q/8/PPPP2PP/RNBQ1KNR w kq - +KGA: bishop's gambit, Greco variation +rnb1k1nr/pppp1ppp/8/4p3/1bB1Pq2/2N2N2/PPPP2PP/R1BQK2R b KQkq - +KGD: Norwalde variation, B\"ucker gambit +rnb1k1nr/ppppqppp/1b1P4/4p3/2B1P3/2P2N2/PP3PPP/RNBQK2R b KQkq - +Giuoco Piano: Eisinger variation +rnb1k1nr/pppq1ppp/4p3/3pP3/1b1P4/2N5/PPP2PPP/R1BQKBNR w KQkq - +French: Winawer, Petrosian variation +rnb1k1nr/ppq1ppbp/6p1/3p4/8/P3PN2/1PPN1PPP/R1BQKB1R w KQkq - +Catalan: open, Alekhine variation * +rnb1k1nr/ppq2ppp/4p3/2ppP3/3P4/P1P5/2P2PPP/R1BQKBNR w KQkq - +French: Winawer, classical variation +rnb1k1r1/ppq1np1Q/4p3/3pP3/3p4/P1P5/2P1NPPP/R1B1KB1R b KQq - +French: Winawer, advance, poisoned pawn, Konstantinopolsky variation +rnb1k1r1/ppq1np1Q/4p3/3pP3/3p4/P1P5/2P2PPP/R1BK1BNR b q - +French: Winawer, advance, poisoned pawn, Euwe-Gligori\'c variation +rnb1k2r/1pq1bpp1/p2ppn1p/8/3NPP1B/2N2Q2/PPP3PP/R3KB1R w KQkq - +Sicilian: Najdorf, Browne variation +rnb1k2r/1pq1bppp/p2ppn2/6B1/3NPP2/2N2Q2/PPP3PP/R3KB1R w KQkq - +Sicilian: Najdorf variation +rnb1k2r/2q1bp1p/p2p1n2/1ppPp1p1/4P3/2P2N1P/PPBN1PP1/R1BQR1K1 w kq - +Ruy Lopez: closed, Leonhardt variation +rnb1k2r/p1pp1ppp/8/4p3/Np2n1Qq/1B6/PPPPKbPP/R1B3NR w kq - +Evans gambit declined, V\'asquez variation * +rnb1k2r/p4ppp/1qp2n2/2bpp3/B3P3/2NP4/PPP2PPP/R1BQK1NR w KQkq - +Evans gambit: Tartakower attack * +rnb1k2r/pp2ppbp/5np1/2pq4/8/1P3N2/PB1PPPPP/RN1QKB1R w KQkq - +Queen's Indian: Marienbad system, Berg variation * +rnb1k2r/pp2qppp/1bp2n2/3pp1B1/1P2P3/P1NP1N2/2P1BPPP/R2QK2R b KQkq - +Ruy Lopez: Wormald attack, Gr\"unfeld variation * +rnb1k2r/pp3ppp/4p3/q7/1b1PP3/5N2/P2B1PPP/R2QKB1R w KQkq - +QGD: Semi-Tarrasch, San Sebastian variation +rnb1k2r/ppp1qppp/5n2/2p1P3/3p4/5N1P/PPP1BPP1/R1BQK2R b KQkq - +two knights defense: Mar\'oczy variation * +rnb1k2r/ppp1qppp/5n2/3P4/1bBp4/2P2N2/PP3PPP/RNBQK2R w KQkq - +Bishop's opening: Urusov gambit, Panov variation +rnb1k2r/ppp2p1p/4pp2/q7/1b1P4/2N5/PPPQ1PPP/R3KBNR w KQkq - +French: MacCutcheon, Bogolyubov variation +rnb1k2r/ppp2p1p/5n2/3qN3/1b1P1ppP/2N5/PPP2KP1/R1BQ1B1R b kq - +KGA: Kieseritsky, Brentano defense, Kaplanek variation +rnb1k2r/ppp2ppp/1b6/3qp3/1PP5/P2P4/5PPP/R1BQKBNR b KQkq - +Ruy Lopez: Noah's ark trap * +rnb1k2r/ppp2ppp/3b4/3qp3/8/3P4/PPP2PPP/R1BQKBNR w KQkq - +Scotch: Ghulam Kassim variation * +rnb1k2r/ppp2ppp/5n2/3qp3/1b6/2NP4/PP1QPPPP/R1B1KBNR b KQkq - +Sicilian: Chekhover, Zaitsev variation * +rnb1k2r/ppp2ppp/8/2bPp3/2B3nq/2N4N/PPPP1PPP/R1BQK2R w KQkq - +Scotch gambit: Vitzhum attack * +rnb1k2r/ppp2ppp/8/3Pp3/2qP4/2N3P1/PPP2K1P/R1BQ3R b kq - +Scotch gambit: Cochrane-Shumov defense * +rnb1k2r/ppp2ppp/8/3np3/8/P1P5/1PPB1PPP/R3KBNR b KQkq - +Ruy Lopez: exchange, Alekhine variation * +rnb1k2r/ppp2ppp/8/3q4/4nP2/8/PPPNQbPP/RNBK1B1R b kq - +KGD: Falkbeer, Alapin variation +rnb1k2r/ppp3p1/3q1n2/2bppP1p/6P1/3P3P/PPP2PB1/RNBQK1NR w KQkq - +KGA: Philidor gambit, Schultz variation * +rnb1k2r/pppnqppp/4p3/1N1pP3/3P4/8/PPP2PPP/R2QKBNR b KQkq - +French: classical, Alapin variation +rnb1k2r/pppnqppp/4p3/3pP3/3P1P2/2N5/PPP3PP/R2QKBNR b KQkq - +French: classical, Steinitz variation +rnb1k2r/pppnqppp/4p3/3pP3/3P2Q1/2N5/PPP2PPP/R3KBNR b KQkq - +French: classical, Pollock variation +rnb1k2r/pppnqppp/4p3/3pP3/3P4/2N5/PPP2PPP/R2QKBNR w KQkq - +French: classical variation +rnb1k2r/pppnqppp/4p3/3pP3/3P4/2N5/PPPQ1PPP/R3KBNR b KQkq - +French: classical, Rubinstein variation +rnb1k2r/pppnqppp/4p3/3pP3/3P4/2NB4/PPP2PPP/R2QK1NR b KQkq - +French: classical, Tarrasch variation +rnb1k2r/pppnqppp/8/2p1P3/2Bp4/5N1P/PPP2PP1/R1BQK2R w KQkq - +two knights defense: Yankovich variation * +rnb1k2r/pppp1ppp/3b1q2/8/N3P1n1/2P2N2/P1Q2PPP/R1B1KB1R w KQkq - +two knights defense: Paoli variation * +rnb1k2r/pppp1ppp/5q2/8/NP2P1n1/5N2/P4PPP/R1BQKB1R b KQkq - +two knights defense: Blackburne variation * +rnb1k2r/pppp1ppp/5q2/8/Nb2P1n1/2P2N2/P4PPP/1RBQKB1R b Kkq - +two knights defense: Colman variation * +rnb1k2r/pppp1ppp/5q2/8/Nb2P1n1/2P2N2/P4PPP/R1BQKB1R w KQkq - +two knights defense: Bogolyubov variation * +rnb1k2r/ppppnpbp/8/6p1/2BPPp1q/2N3P1/PPP4P/R1BQ1KNR b kq - +KGA: bishop's gambit, McDonnell attack +rnb1k2r/ppppnpbp/8/6p1/2BPPp1q/2N5/PPP3PP/R1BQ1KNR w kq - +KGA: bishop's gambit, classical defense +rnb1k2r/ppppqppp/4pn2/8/1bPP4/5N2/PP1BPPPP/RN1QKB1R w KQkq - +Bogo-Indian defense, Nimzovich variation +rnb1k2r/ppppqppp/5n2/b3p3/4P3/P1N2N2/1PPP1PPP/R1BQKB1R w KQkq - +Ruy Lopez: Wormald (Alapin) attack * +rnb1kb1N/ppp3pp/5n2/3p4/2B1p3/8/PPPP1PqP/RNBQKR2 w Qkq - +Latvian: Behting variation +rnb1kb1r/1p3ppp/p2ppn2/6B1/3NPP2/q1N5/P1PQ2PP/1R2KB1R w Kkq - +Sicilian: Najdorf, Poisoned pawn variation +rnb1kb1r/1p3ppp/pq1ppn2/6B1/3NPP2/2N5/PPP3PP/R2QKB1R w KQkq - +Sicilian: Najdorf, 7...Qb6 +rnb1kb1r/1pq2ppp/p2ppn2/8/3NP3/2N5/PPP1BPPP/R1BQ1RK1 w kq - +Sicilian: Scheveningen (Paulsen), classical variation +rnb1kb1r/2q2ppp/p3pn2/1p2P1B1/3N4/2N5/PPP1Q1PP/R3KB1R b KQkq - +Sicilian: Najdorf, Polugayevsky, Simagin variation +rnb1kb1r/pp1p1ppp/2p2n2/q3p3/3PP3/2N2N2/PPP2PPP/R1BQKB1R b KQkq - +Ponziani: Leonhardt variation * +rnb1kb1r/pp1p1ppp/2p2n2/q3p3/3PP3/2N2P2/PPP3PP/R1BQKBNR b KQkq - +Ponziani: Steinitz variation * +rnb1kb1r/pp1p1ppp/2p2n2/q3p3/3PP3/2N5/PPPB1PPP/R2QKBNR b KQkq - +Ponziani: Caro variation * +rnb1kb1r/pp1p2pp/2p2n2/q3p1B1/2B1P3/8/PPP2PPP/RN1QK1NR w KQkq - +KGD: classical, Marshall attack * +rnb1kb1r/pp1ppppp/5n2/q1pP4/8/2N5/PPP1PPPP/R1BQKBNR w KQkq - +Woozle defense +rnb1kb1r/pp2pppp/1qp2n2/3p4/2PP4/2N2N2/PP2PPPP/R1BQKB1R w KQkq - +QGD Slav: S\"uchting variation +rnb1kb1r/pp2pppp/5n2/q1Pp4/8/5N2/PPP1PPPP/RNBQKB1R w KQkq - +QGA: Mannheim variation * +rnb1kb1r/pp3pp1/2p1pq1p/3p4/2PP4/1QN2N2/PP2PPPP/R3KB1R b KQkq - +QGD/QGD semi-Slav: Hastings variation +rnb1kb1r/pp3ppp/1q2pn2/2pP2B1/3P4/2N5/PP2PPPP/R2QKBNR w KQkq - +QGD: Canal (Venice) variation +rnb1kb1r/ppp1pppp/5n2/8/3q4/2N2N2/PPPPQ1PP/R1B1KB1R b KQkq - +Queen's pawn: Englund gambit * +rnb1kb1r/ppp1q1pp/5n2/4Np2/2Bp1B2/8/PPP2PPP/RN1QK2R b KQkq - +KGD: Falkbeer, main line, 7...Bf5 * +rnb1kb1r/ppp1q2p/5n2/4Npp1/2Bp1B2/8/PPP2PPP/RN1Q1RK1 b kq - +KGD: Falkbeer, Tarrasch variation * +rnb1kb1r/ppp1qppp/5n2/3PN3/4p3/8/PPPP1PPP/RNBQKB1R w KQkq - +Petrov: modern attack, Steinitz variation * +rnb1kb1r/ppp1qppp/8/3n4/2N1p3/2N5/PPPP1PPP/R1BQKB1R b KQkq - +Petrov: modern attack, Bardeleben variation * +rnb1kb1r/ppp2p1p/3p3n/4N3/2BPPppq/8/PPP3PP/RNBQ1K1R w kq - +KGA: Salvio gambit, Anderssen counter-attack +rnb1kb1r/ppp2ppp/5n2/3qN3/4p3/8/PPPP1PPP/RNBQKB1R w KQkq - +Petrov: modern attack, main line * +rnb1kb1r/ppp2ppp/5n2/3qp3/8/3P4/PP2PPPP/RNBQKBNR w KQkq - +Sicilian, Chekhover variation * +rnb1kb1r/ppp2ppp/5n2/3qp3/8/3P4/PPPB1PPP/RN1QKBNR b KQkq - +Philidor: Boden variation * +rnb1kb1r/ppp2ppp/5n2/4N3/3qp3/3P4/PPP2PPP/RNBQKB1R w KQkq - +Philidor: Nimzovich, Rellstab variation * +rnb1kb1r/ppp2ppp/8/3NP2q/8/3P1Nn1/PPP4P/R1BQKB1R b KQkq - +Vienna gambit, Wurzburger trap +rnb1kb1r/ppp3pp/8/3q1p2/4nPP1/8/PPPNQ2P/R1B1KBNR b KQkq - +KGD: Falkbeer, Charousek variation +rnb1kb1r/pppp1p1p/7n/4N3/2BPP1pq/5p2/PPP3PP/RNBQ1K1R w kq - +KGA: Silberschmidt gambit +rnb1kb1r/pppp2p1/8/4pq1p/8/3B1N1P/PPPP1K2/RNBQ3R b kq - +KGA: Allgaier, Horny defense * +rnb1kb1r/ppppqppp/5n2/4N3/8/3P4/PPP2PPP/RNBQKB1R w KQkq - +Petrov: Cozio (Lasker) attack * +rnb1kb1r/ppq1p1pp/2pp1n2/5p2/2PP4/2N3P1/PP2PPBP/R1BQK1NR w KQkq - +Dutch: Hort-Antoshin system +rnb1kbnr/p1pp1ppp/8/1p6/2B1Pp1q/8/PPPP2PP/RNBQ1KNR w kq - +KGA: bishop's gambit, Bryan counter-gambit +rnb1kbnr/pp1ppppp/8/q1p5/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - +Sicilian: Stiletto (Althouse) variation +rnb1kbnr/pp2pppp/1qp5/3p4/3PP3/8/PPPN1PPP/R1BQKBNR w KQkq - +Caro-Kann: Edinburgh variation +rnb1kbnr/pp2pppp/8/3q4/1p6/P7/1BPP1PPP/RN1QKBNR b KQkq - +Sicilian: wing gambit, Marienbad variation +rnb1kbnr/pp3ppp/2p1q3/4p3/8/2N5/PPPPBPPP/R1BQK1NR b KQkq - +Center game: Charousek variation * +rnb1kbnr/ppp1pp1p/3q4/3p2p1/5P2/4P3/PPPP2PP/RNBQKBNR w KQkq - +Dutch, Von Pretzel gambit * +rnb1kbnr/ppp1pppp/3q4/3p4/5P2/8/PPPPP1PP/RNBQKBNR w KQkq - +Dutch, Manhattan (Alapin, Ulvestad) variation * +rnb1kbnr/ppp1pppp/3q4/8/8/2N5/PPPP1PPP/R1BQKBNR w KQkq - +Scandinavian: Pytel-Wade variation +rnb1kbnr/ppp1pppp/8/q7/1P6/2N5/P1PP1PPP/R1BQKBNR b KQkq - +Scandinavian, Mieses-Kotr\v c gambit +rnb1kbnr/ppp1q1pp/3p4/4Pp2/3p4/5N2/PPP2PPP/RNBQKB1R w KQkq - +KGD: Falkbeer, R\'eti variation * +rnb1kbnr/ppp1q1pp/8/4Np2/3p4/8/PPP2PPP/RNBQKB1R w KQkq - +KGD: Falkbeer, Charousek gambit * +rnb1kbnr/ppp2p1p/8/3B2p1/4Pp1q/6P1/PPPP3P/RNBQ1KNR b kq - +KGA: bishop's gambit, Chigorin's attack (Gifford variation) +rnb1kbnr/ppp2ppp/4p3/3q4/3PN3/8/PPP2PPP/R1BQKBNR w KQkq - +French: Frere (Becker) variation +rnb1kbnr/ppp2ppp/4q3/4p3/5P2/2N5/PPPP2PP/R1BQKBNR b KQkq - +Center game: l'Hermet variation * +rnb1kbnr/ppp2ppp/4q3/4p3/8/2N2N2/PPPP1PPP/R1BQKB1R b KQkq - +Center game: Berger variation * +rnb1kbnr/ppp2ppp/4q3/4p3/8/2N5/PPPP1PPP/R1BQKBNR w KQkq - +Center game: Paulsen attack * +rnb1kbnr/ppp2ppp/8/2q1p3/8/2N5/PPPP1PPP/R1BQKBNR w KQkq - +Center game: Hall variation * +rnb1kbnr/ppp2ppp/8/3p2q1/2PPp3/4P3/PP3PPP/RNBQKBNR w KQkq - +French: advance, Nimzovich variation * +rnb1kbnr/ppp2ppp/8/3qp3/8/2N5/PPPP1PPP/R1BQKBNR b KQkq - +Center game * +rnb1kbnr/ppp2ppp/8/3qp3/8/8/PPPP1PPP/RNBQKBNR w KQkq - +Center game * +rnb1kbnr/ppp2ppp/8/q3p3/3P4/2N2N2/PPP2PPP/R1BQKB1R b KQkq - +Scandinavian: Anderssen counter-attack, Goteborg system +rnb1kbnr/ppp2ppp/8/q3p3/3P4/2N5/PPP2PPP/R1BQKBNR w KQkq - +Scandinavian: Anderssen counter-attack +rnb1kbnr/ppp3pp/3p1q2/8/3Pp3/4N3/PPP2PPP/RNBQKB1R b KQkq - +Latvian: Nimzovich variation +rnb1kbnr/pppp1B1p/8/4q3/5p2/5Q2/PPPP2PP/RNB2RK1 b kq - +KGA: double Muzio gambit +rnb1kbnr/pppp1p1p/8/4N3/2B1P1pq/5p2/PPPP2PP/RNBQ1K1R w kq - +KGA: Cochrane gambit +rnb1kbnr/pppp1p1p/8/6p1/2B1Pp1q/5Q2/PPPP2PP/RNB2KNR b kq - +KGA: bishop's gambit, classical defense, Cozio attack +rnb1kbnr/pppp1p1p/8/6p1/2B1Pp1q/8/PPPP2PP/RNBQ1KNR w kq - +KGA: bishop's gambit, classical defense +rnb1kbnr/pppp1ppp/5q2/4p3/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - +Greco defense +rnb1kbnr/pppp1ppp/5q2/4p3/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +KP: Napoleon's opening * +rnb1kbnr/pppp1ppp/5q2/4p3/4PP2/8/PPPP2PP/RNBQKBNR w KQkq - +KGD: Norwalde variation +rnb1kbnr/pppp1ppp/8/4p3/4P2q/8/PPPP1PPP/RNBQKBNR w KQkq - +KP: Patzer opening * +rnb1kbnr/pppp2pp/5q2/4pP2/8/8/PPPP1PPP/RNBQKBNR w KQkq - +KGA: Breyer gambit * +rnb1kbnr/ppppq1pp/8/4pP2/8/8/PPPP1PPP/RNBQKBNR w KQkq - +KGA: Carrera (Basman) gambit * +rnb1kbnr/ppppq2p/8/4Np2/2BPPppP/8/PPP3P1/RNBQK2R b KQkq - +KGA: Kieseritsky, Salvio defense, Cozio variation +rnb1kbnr/ppppqp1p/8/4N3/4PppP/8/PPPP2P1/RNBQKB1R w KQkq - +KGA: Kieseritsky, Salvio (Rosenthal) defense +rnb1kbnr/ppppqp1p/8/8/2B1Pp2/5Q2/PPPP2PP/RNB2RK1 w kq - +KGA: Muzio gambit, From defense +rnb1kbnr/ppppqp1p/8/8/2B1Ppp1/5N2/PPPP2PP/RNBQ1RK1 w kq - +KGA: Muzio gambit, Kling and Horwitz counter-attack +rnb1kbnr/ppppqppp/8/4p3/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - +Gunderam defense +rnb1kbnr/ppppqppp/8/4p3/4PP2/6P1/PPPP3P/RNBQKBNR w KQkq - +KGD: Keene's defense +rnb1kbnr/ppppqppp/8/4p3/8/4P3/PPPP1PPP/RNBQKBNR w KQkq - +French: Chigorin variation * +rnb1kbnr/ppppqppp/8/8/2B1P3/8/PB3PPP/RN1QK1NR w KQkq - +Danish gambit: Collijn defense +rnb1kbnr/ppq1pppp/8/2p1N3/4p3/8/PPPP1PPP/RNBQKB1R w KQkq - +Budapest: Fajarowicz, Steiner variation * +rnb1kbnr/ppq1pppp/8/2pp4/8/5NP1/PPPPPP1P/RNBQKB1R w KQkq - +Queen's pawn: Mengarini attack * +rnb1kbnr/ppqppppp/8/2p5/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - +Sicilian: Quinteros variation +rnb1qrk1/pp2b1pp/2p1pn2/3p1pB1/2PP4/2N2NP1/PPQ1PPBP/R4RK1 b - - +Dutch: stonewall: Chekhover variation +rnb1qrk1/ppp1b1pp/3ppn2/5p2/2PP4/1PN2NP1/P3PPBP/R1BQ1RK1 b - - +Dutch: Ilyin-Genevsky variation with b3 +rnb1qrk1/ppp1b1pp/3ppn2/5p2/2PP4/2N2NP1/PP2PPBP/R1BQ1RK1 w - - +Dutch: Ilyin-Genevsky variation +rnb1qrk1/ppp1b1pp/3ppn2/5p2/2PP4/2N2NP1/PP2PPBP/R1BQR1K1 b - - +Dutch: Ilyin-Genevsky, Winter variation +rnb1qrk1/ppp1b1pp/3ppn2/5p2/2PP4/2N2NP1/PPQ1PPBP/R1B2RK1 b - - +Dutch: Ilyin-Genevsky variation with Qc2 +rnb1r1k1/ppp2ppp/1b6/3qp3/1PP5/P2P1N2/4BPPP/R1BQK2R b KQ - +Ruy Lopez: Noah's ark trap * +rnb2bnr/pppp1k1p/5q2/8/4Pp2/2N1BQ2/PPP3PP/R4RK1 b - - +KGA: Lolli gambit, Young variation +rnb2knr/pppp2pp/5q2/2b1pP1Q/6P1/8/PPPP1P1P/RNB1KBNR w KQ - +KGA: bishop's gambit, classical defense, Cozio attack * +rnb2rk1/p1p1qppp/1p3n2/8/4p3/2P5/PNPPBPPP/R1BQK2R w KQ - +Ruy Lopez: Berlin defense, Pillsbury variation * +rnb2rk1/p1pqppbp/1p4p1/8/2BPP3/2P5/P3NPPP/R1BQ1RK1 w - - +Gr\"unfeld: exchange, Larsen variation +rnb2rk1/p1q1ppbp/1p3np1/2pp4/3P4/2P1PN2/PP1NBPPP/R1BQ1RK1 w - - +Catalan: closed, Qc2 & b3 * +rnb2rk1/p4ppp/1qp2n2/2bPp3/B7/2NP4/PPP2PPP/R1BQK1NR w KQ - +Evans gambit: Waller attack * +rnb2rk1/pp2ppbp/2pp1np1/q7/2PP4/2N2NP1/PP2PPBP/R1BQ1RK1 w - - +King's Indian: fianchetto, Kavalek (Bronstein) variation +rnb2rk1/pp2qppp/1b2pn2/3p4/1PP5/P3PN2/1B3PPP/RN1QKB1R b KQ - +QGA: classical, 8...Bb7 * +rnb2rk1/pp2qppp/1b3n2/2p1N3/1P1Pp3/P1N1B3/2P1BPPP/R2QK2R w KQ - +Ruy Lopez: open, Howell attack, Adam variation * +rnb2rk1/pp2qppp/4pn2/2bp4/1PP5/P3PN2/5PPP/RNBQKB1R b KQ - +QGA: classical, 7...b5 * +rnb2rk1/pp2qppp/4pn2/2bp4/2P5/P3PN2/1P3PPP/RNBQKB1R w KQ - +QGA: classical, 7.Qe2 * +rnb2rk1/pp2qppp/4pn2/2p5/1bBP4/2N1PN2/PP3PPP/R1BQ1RK1 w - - +Nimzo-Indian: 4.e3, Gligori\'c system, Smyslov variation +rnb2rk1/pp2qppp/5n2/2b5/1PB1p3/P1N1PN2/5PPP/R1BQK2R w KQ - +QGA: classical, Furman variation * +rnb2rk1/pp2qppp/5n2/2p5/4p3/2P5/PNPPBPPP/R1BQK2R w KQ - +Ruy Lopez: Berlin defense, Zukertort variation * +rnb2rk1/pp3ppp/1bpq1n2/4N3/1PBPp3/P1N1B3/2P2PPP/R2QK2R w KQ - +Ruy Lopez: open, Motzko attack * +rnb2rk1/pp3ppp/1bpq1n2/4N3/1PBPp3/P3B3/2P1NPPP/R2QK2R b KQ - +Ruy Lopez: open, Motzko attack, Nenarokov variation * +rnb2rk1/ppB1ppbp/6p1/3q4/3P4/4P3/PP3PPP/R2QKBNR b KQ - +Gr\"unfeld: Gr\"unfeld gambit accepted +rnb2rk1/ppp1qpp1/4p2p/3P4/3P4/2P1PN2/P4PPP/R2QKB1R b KQ - +QGD: Lasker defense, main line +rnb2rk1/ppp1qpp1/4p2p/3p4/2PPn3/2N1PN2/PPQ2PPP/R3KB1R b KQ - +QGD: Lasker defense, Teichmann variation +rnb2rk1/ppp1qppp/1b3n2/4N3/1P1Pp3/P1N1B3/2P2PPP/R2QKB1R w KQ - +Ruy Lopez: open, Howell attack * +rnb2rk1/ppp1qppp/5n2/3pN3/1b1PP3/2N5/PPP1BPPP/R1BQK2R b KQ - +Ruy Lopez: Berlin defense, Trifunovi\'c variation * +rnb2rk1/ppp1qppp/5n2/8/4pN2/2P5/P1PPBPPP/R1BQK2R b KQ - +Ruy Lopez: Berlin defense, Cordel variation * +rnb2rk1/ppp1qppp/8/3n4/4p3/2P5/PNPPBPPP/R1BQK2R w KQ - +Ruy Lopez: Berlin defense, Winawer attack * +rnb2rk1/ppp2pbp/3p2p1/3Pp3/2n1P2Q/2N2P2/PP2K2P/R5NR w - - +King's Indian: S\"amisch, orthodox, Bronstein variation +rnb2rk1/ppp2pp1/3q3p/3p4/3P4/1QP1PN2/P4PPP/R3KB1R w KQ - +QGD: Lasker defense, Bernstein variation +rnb2rk1/pppp2pp/5q2/2b1pP2/8/2N5/PPPP1P1P/R1BQKBNR b KQ - +KGA: Muzio gambit, Holloway defense * +rnb2rk1/pppp2pp/5q2/2b1pP2/8/8/PPPPQP1P/RNB1KBNR b KQ - +KGA: Muzio gambit, From defense * +rnb2rk1/pppp2pp/5q2/5P2/4Q3/8/PPPP1b1P/RNB1KBNR w KQ - +KGA: double Muzio gambit * +rnb2rk1/ppppqppp/1b3n2/4p3/1P2P3/P1N2N2/2PPBPPP/R1BQ1RK1 b - - +Ruy Lopez: Worrall attack, sharp line * +rnb2rk1/ppppqppp/1b3n2/4p3/1P2P3/P1NP1N2/2P1BPPP/R1BQK2R b KQ - +Ruy Lopez: Worrall attack, solid line * +rnb2rk1/ppppqppp/5n2/b3N3/4P3/P1N5/1PPP1PPP/R1BQKB1R w KQ - +Ruy Lopez: open, Tartakower variation * +rnb2rk1/ppppqppp/5n2/b3p3/4P3/P1N2N2/1PPPBPPP/R1BQK2R w KQ - +Ruy Lopez: Worrall attack * +rnb2rk1/ppq1ppbp/5np1/2pp4/3P4/4PN2/PPPNBPPP/R1BQ1RK1 w - - +Catalan: closed, 7.Qc2 * +rnbk1b1r/pppnqBpp/8/4Np2/3Q4/8/PPP2PPP/RNB1K2R w KQ - +KGD: Falkbeer, Alapin variation * +rnbk1bnr/pppp2pp/8/8/2B1pp1q/2N5/PPPPQ1PP/R1BK2NR w - - +KGA: L\'opez-Gianutio counter-gambit, Hein variation +rnbq1bnr/ppp3k1/7p/3B4/3PPppP/8/PPP3P1/RNBQK2R b KQ - +KGA: Allgaier, Urusov attack +rnbq1bnr/ppp3k1/7p/4B3/2BPp1pP/8/PPP3P1/RN1QK2R b KQ - +KGA: Allgaier, Cook variation +rnbq1bnr/pppp1k2/7p/8/2B1PppP/8/PPPP2P1/RNBQK2R b KQ - +KGA: Allgaier, Walker attack +rnbq1bnr/pppp1k2/7p/8/3PPppP/8/PPP3P1/RNBQKB1R b KQ - +KGA: Allgaier, Thorold variation +rnbq1bnr/pppp1k2/7p/8/4PppP/2N5/PPPP2P1/R1BQKB1R b KQ - +KGA: Allgaier, Blackburne gambit +rnbq1bnr/pppp1kpp/8/4pP2/8/8/PPPP1PPP/RNBQKBNR w KQ - +KGA: Tumbleweed gambit * +rnbq1bnr/pppppkpp/5p2/8/3PP3/8/PPP2PPP/RNBQKBNR w KQ - +Fried fox defense +rnbq1bnr/pppppkpp/5p2/8/4P3/8/PPPP1PPP/RNBQKBNR w KQ - +Hammerschlag (Fried fox/Pork chop opening) * +rnbq1k1r/pp3ppp/5n2/1Bbpp3/8/2N2N2/PPPP1PPP/R1BQK2R w KQ - +Giuoco Piano: Cracow variation * +rnbq1k1r/ppp2Bpp/8/4N2Q/1b1Pp3/2n5/PPP2PPP/R1B1K2R b KQ - +Two knights defense, Keidanz variation * +rnbq1k1r/ppp2pp1/4p2p/3pP3/3Pn1Q1/2P5/P1P2PPP/R1B1KBNR b KQ - +French: MacCutcheon, Duras variation +rnbq1k1r/ppp3pp/5P2/2bpp1PQ/4n3/7N/PPPP1P1P/RNB1KB1R b KQ - +KGA: Silberschmidt gambit * +rnbq1k1r/ppp3pp/8/2bppPPQ/4n3/3P3N/PPP2P1P/RNB1KB1R b KQ - +KGA: Salvio gambit, Anderssen counter-attack * +rnbq1k1r/pppp2pp/5P2/2b1p1PQ/4n3/8/PPPP1P1P/RNB1KBNR b KQ - +KGA: Cochrane gambit * +rnbq1k1r/pppp2pp/8/2b1pPPQ/4n3/2N5/PPPP1P1P/R1B1KBNR b KQ - +KGA: Herzfeld gambit * +rnbq1knr/pppp2pp/8/2b1pP1Q/1P6/8/P1PP1PPP/RNB1KBNR b KQ - +KGA: bishop's gambit, Bryan counter-gambit * +rnbq1knr/pppp2pp/8/2b1pP1Q/2B5/8/PPPP1PPP/RNB1K1NR b KQ - +KGA: bishop's gambit, Greco variation * +rnbq1knr/pppp2pp/8/2b1pP1Q/6P1/8/PPPP1P1P/RNB1KBNR b KQ - +KGA: bishop's gambit, classical defense * +rnbq1knr/pppp2pp/8/2b1pP1Q/8/2N5/PPPP1PPP/R1B1KBNR b KQ - +KGA: bishop's gambit, Boden defense * +rnbq1knr/pppp2pp/8/4pP1Q/3b4/3B4/PPP2PPP/RNB1K1NR b KQ - +KGA: bishop's gambit, Bor\'en-Svenonius variation * +rnbq1knr/pppp3p/6p1/4pP1Q/3b2P1/8/PPP2P1P/RNB1KBNR w KQ - +KGA: bishop's gambit, Chigorin's attack (Gifford variation) * +rnbq1r1k/p1p4P/5n2/2bpp2B/8/8/PPPP1PPP/RNBQK1NR w KQ - +Bishop's opening: Four pawns' gambit * +rnbq1r1k/pppp3P/5n2/2b1p2B/8/8/PPPP1PPP/RNBQK1NR w KQ - +KGA: Cunningham, three pawns gambit * +rnbq1rk1/1p2ppbp/p1pp1np1/8/2PPP3/2NBBP2/PP4PP/R2QK1NR w KQ - +King's Indian: S\"amisch, Byrne variation +rnbq1rk1/1p3pbp/p2p1np1/2pP4/P3P3/2N2N2/1P2BPPP/R1BQ1RK1 b - - +Benoni: classical, 9...a6, 10.a4 +rnbq1rk1/1p3ppp/4pn2/p1bp4/2P5/P3PN2/1P3PPP/RNBQKB1R w KQ - +QGA: classical, Rubinstein variation * +rnbq1rk1/1pp1ppbp/p4np1/8/2QPP3/2N2N2/PP3PPP/R1B1KB1R w KQ - +Gr\"unfeld: Russian, Alekhine (Hungarian) variation +rnbq1rk1/1pp2pbp/3p1np1/p2Pp3/2P1P3/2N2N2/PP2BPPP/R1BQK2R w KQ - +King's Indian: Petrosian system, Stein variation +rnbq1rk1/1pp2ppp/1b3n2/p2NN3/1P1PP3/P7/2P2PPP/R1BQKB1R b KQ - +Ruy Lopez: open, Schlechter defense * +rnbq1rk1/1ppp1ppp/1b3n2/p3p3/1P2P3/P1N2N2/2PPBPPP/R1BQK2R w KQ - +Ruy Lopez: Wing attack * +rnbq1rk1/2p1bppp/p2p1n2/1p2p3/3PP3/1BP2N1P/PP3PP1/RNBQR1K1 b - - +Ruy Lopez: closed, Breyer, 10.d4 +rnbq1rk1/2p1bppp/p2p1n2/1p2p3/4P3/1BP2N1P/PP1P1PP1/RNBQR1K1 w - - +Ruy Lopez: closed, Breyer defense +rnbq1rk1/p1p1bpp1/1p2p2p/3n4/3P3B/2N1PN2/PP3PPP/R2QKB1R w KQ - +QGD: Tartakower (Makagonov-Bondarevsky) system, 8.cd Nxd5 +rnbq1rk1/p1p1bpp1/1p2pn1p/3p4/2PP3B/2N1PN2/PP3PPP/R2QKB1R w KQ - +QGD: Tartakower (Makagonov-Bondarevsky) system +rnbq1rk1/p1p1ppbp/1p1p1np1/8/2PPP3/2N1BP2/PP4PP/R2QKBNR w KQ - +King's Indian: S\"amisch, double fianchetto variation +rnbq1rk1/p1p1ppbp/1p3np1/8/2QPP3/2N2N2/PP3PPP/R1B1KB1R w KQ - +Gr\"unfeld: Russian, Levenfish variation +rnbq1rk1/p1p1ppbp/1p4p1/8/2BPP3/2P5/P3NPPP/R1BQK2R w KQ - +Gr\"unfeld: exchange, Simagin's lesser variation +rnbq1rk1/p1p2ppp/1p2pn2/3p4/1bPP4/2NBPN2/PP3PPP/R1BQK2R w KQ - +Nimzo-Indian: 4.e3, main line with ...b6 +rnbq1rk1/p1pp1ppp/4pn2/1p6/2PP4/P1Q5/1P2PPPP/R1B1KBNR w KQ - +Nimzo-Indian: classical, Adorjan gambit +rnbq1rk1/p1pp1ppp/5n2/1p1Np3/1bB1P3/8/PPPP1PPP/R1BQK1NR w KQ - +Ruy Lopez: classical defense, Zaitsev variation * +rnbq1rk1/p2p1ppp/2p2n2/2b1p3/B3P3/2N5/PPPP1PPP/R1BQK1NR w KQ - +Evans gambit * +rnbq1rk1/p2p1ppp/2p2n2/2b1p3/B3P3/2NP4/PPP2PPP/R1BQK1NR b KQ - +Evans gambit * +rnbq1rk1/p3ppbp/1p3np1/2pp4/3P1P2/4PN2/PPP1B1PP/RNBQ1RK1 w - - +Dutch: stonewall, Botwinnik variation * +rnbq1rk1/p3ppbp/1p3np1/2pp4/8/1P2PN2/PBPPBPPP/RN1Q1RK1 w - - +Queen's Indian: Euwe variation * +rnbq1rk1/p4ppp/1p2pn2/2pp4/1bPP4/2NBPN2/PP3PPP/R1BQ1RK1 w - - +Nimzo-Indian: 4.e3, Keres variation +rnbq1rk1/p4ppp/2P2n2/2b1p3/B7/2N5/PPPP1PPP/R1BQK1NR b KQ - +Evans gambit: compromised defense * +rnbq1rk1/p4ppp/2p2n2/2bpp1B1/B3P3/2NP4/PPP2PPP/R2QK1NR b KQ - +Evans gambit: Alapin-Steinitz variation * +rnbq1rk1/p4ppp/2p2n2/2bpp3/4P3/1BNP4/PPP2PPP/R1BQK1NR b KQ - +Evans gambit: Lasker defense * +rnbq1rk1/p4ppp/2p2n2/2bpp3/B3P3/2NP4/PPPB1PPP/R2QK1NR b KQ - +Evans gambit: Sanders-Alapin variation * +rnbq1rk1/p4ppp/2p5/2bpp3/B3n3/2N2N2/PPPP1PPP/R1BQ1RK1 w - - +Evans gambit: Richardson attack * +rnbq1rk1/p4ppp/5n2/2bpp3/8/1BNP4/PPP2PPP/R1BQK1NR b KQ - +Evans gambit: normal variation * +rnbq1rk1/pp1p1ppp/2p2n2/b7/4PB2/P1NP4/1PP3PP/R2QKBNR w KQ - +Ruy Lopez: Siesta, Kopayev variation * +rnbq1rk1/pp1p1ppp/4pn2/2P5/1bP5/2N5/PPQ1PPPP/R1B1KBNR w KQ - +Nimzo-Indian: classical, Pir\'c variation +rnbq1rk1/pp1pppbp/5np1/2p5/3P4/4PN2/PPP1BPPP/RNBQK2R w KQ - +English: Neo-Catalan declined * +rnbq1rk1/pp2b1pp/2p1pn2/3p1p2/2PP4/2N2NP1/PP2PPBP/R1BQ1RK1 w - - +Dutch: stonewall with Nc3 +rnbq1rk1/pp2b1pp/2p1pn2/3p1p2/2PP4/BP3NP1/P3PPBP/RN1Q1RK1 b - - +Dutch: stonewall with Ba3 +rnbq1rk1/pp2p1bp/2pp1np1/5p2/2PP4/2N2NP1/PP2PPBP/R1BQ1RK1 w - - +Dutch: Leningrad, main variation with c6 +rnbq1rk1/pp2ppbp/2p2np1/3p4/2PP4/5NP1/PP2PPBP/RNBQ1RK1 w - - +Neo-Gr\"unfeld, 6.O-O c6 +rnbq1rk1/pp2ppbp/2p2np1/8/2QPP3/2N2N2/PP3PPP/R1B1KB1R w KQ - +Gr\"unfeld: Russian, Szabo (Boleslavsky) variation +rnbq1rk1/pp2ppbp/3p1np1/2p3B1/2PPP3/2N5/PP2BPPP/R2QK1NR w KQ - +King's Indian: Averbakh, 6...c5 +rnbq1rk1/pp2ppbp/3p1np1/2p5/2PP4/2N2NP1/PP2PPBP/R1BQ1RK1 b - - +King's Indian: fianchetto, Yugoslav, 7.O-O +rnbq1rk1/pp2ppbp/3p1np1/2p5/2PP4/2N2NP1/PP2PPBP/R1BQK2R w KQ - +King's Indian: fianchetto, Yugoslav system +rnbq1rk1/pp2ppbp/3p1np1/2p5/2PPPP2/2N2N2/PP2B1PP/R1BQK2R b KQ - +King's Indian: Four pawns attack, with Be2 and Nf3 +rnbq1rk1/pp2ppbp/3p1np1/2pP4/2P1PP2/2N2N2/PP4PP/R1BQKB1R b KQ - +King's Indian: Four pawns attack, dynamic line +rnbq1rk1/pp2ppbp/3p1np1/8/3NP3/2N1BP2/PPP3PP/R2QKB1R w KQ - +Sicilian: dragon, Yugoslav attack, 7...O-O +rnbq1rk1/pp2ppbp/5np1/2pp4/3P1P2/4PN2/PPP1B1PP/RNBQ1RK1 b - - +Dutch: stonewall variation * +rnbq1rk1/pp2ppbp/5np1/2pp4/3P4/2P2NP1/PP2PPBP/RNBQ1RK1 b - - +Neo-Gr\"unfeld, 6.O-O c6 * +rnbq1rk1/pp2ppbp/5np1/2pp4/3P4/4PN2/PPPNBPPP/R1BQ1RK1 b - - +Catalan: closed, 6...Nbd7 * +rnbq1rk1/pp2ppbp/5np1/2pp4/3P4/5NP1/PPP1PPBP/RNBQ1RK1 w - - +Neo-Gr\"unfeld, 6.O-O * +rnbq1rk1/pp2ppbp/5np1/2pp4/5P2/3PPN2/PPP1B1PP/RNBQ1RK1 b - - +Dutch: classical variation * +rnbq1rk1/pp2ppbp/5np1/2pp4/8/1P2PN2/PBPPBPPP/RN1QK2R w KQ - +Queen's Indian: old main line, 6.O-O * +rnbq1rk1/pp2ppbp/5np1/2ppN3/5P2/4P3/PPPPB1PP/RNBQ1RK1 b - - +Dutch defense, Alekhine variation * +rnbq1rk1/pp2ppbp/5np1/3p4/3N4/6P1/PPP1PPBP/RNBQ1RK1 w - - +Neo-Gr\"unfeld, 6.cd Nxd5, 7.O-O * +rnbq1rk1/pp2ppbp/5np1/3p4/3P4/5NP1/PP2PPBP/RNBQ1RK1 b - - +Neo-Gr\"unfeld, 6.O-O, main line * +rnbq1rk1/pp2ppbp/5np1/3p4/3P4/5NP1/PP2PPBP/RNBQ1RK1 w - - +Neo-Gr\"unfeld, 6.O-O, main line +rnbq1rk1/pp2ppbp/5np1/3p4/8/1N4P1/PPP1PPBP/RNBQ1RK1 b - - +Neo-Gr\"unfeld, 6.cd Nxd5, 7.O-O Nb6 * +rnbq1rk1/pp2ppbp/5np1/8/2pN4/6P1/PP2PPBP/RNBQ1RK1 w - - +Neo-Gr\"unfeld, 6.cd Nxd5, 7.O-O c5, 8.dc * +rnbq1rk1/pp2ppbp/6p1/2Pn4/8/5NP1/PP2PPBP/RNBQ1RK1 b - - +Neo-Gr\"unfeld, 6.cd Nxd5, 7.O-O c5, 8.dc +rnbq1rk1/pp2ppbp/6p1/2p5/2BPP3/2P5/P3NPPP/R1BQK2R w KQ - +Gr\"unfeld: exchange, Spassky variation +rnbq1rk1/pp2ppbp/6p1/2pn4/3P4/2N2NP1/PP2PPBP/R1BQ1RK1 b - - +Neo-Gr\"unfeld, 6.cd Nxd5, 7.O-O c5, 8.Nc3 +rnbq1rk1/pp3pbp/2pp1np1/3Pp3/2P1P3/2N1BP2/PP4PP/R2QKBNR w KQ - +King's Indian: S\"amisch, orthodox, 7.d5 c6 +rnbq1rk1/pp3pbp/2pp1np1/4p3/2PPP3/2N1BP2/PP2N1PP/R2QKB1R w KQ - +King's Indian: S\"amisch, orthodox, 7.Nge2 c6 +rnbq1rk1/pp3pbp/2pp1np1/4p3/2PPP3/2N2N2/PP2BPPP/R1BQ1RK1 w - - +King's Indian: orthodox, Donner variation +rnbq1rk1/pp3pbp/3p1np1/2pP4/4P3/2N2N2/PP2BPPP/R1BQ1RK1 b - - +Benoni: classical, 9.O-O +rnbq1rk1/pp3pbp/3p1np1/2pP4/4P3/2N2N2/PP2BPPP/R1BQK2R w KQ - +Benoni: classical without 9.O-O +rnbq1rk1/pp3pbp/3p1np1/2pP4/4PP2/2N2N2/PP4PP/R1BQKB1R w KQ - +Benoni: four pawns attack +rnbq1rk1/pp3pbp/3p1np1/2pP4/8/2N2NP1/PP2PPBP/R1BQK2R w KQ - +Benoni: fianchetto variation +rnbq1rk1/pp3pbp/3p1np1/2ppP3/2P2P2/2N2N2/PP2B1PP/R1BQK2R b KQ - +King's Indian: Four pawns attack, Florentine gambit +rnbq1rk1/pp3pbp/3p1np1/3pp3/2P1P3/2N1BP2/PP2N1PP/R2QKB1R w KQ - +King's Indian: S\"amisch, orthodox main line +rnbq1rk1/pp3pbp/3ppnp1/2pP2B1/2P1P3/2N5/PP2BPPP/R2QK1NR w KQ - +King's Indian: Averbakh, main line +rnbq1rk1/pp3pbp/3ppnp1/2pP4/2P1PP2/2N2N2/PP2B1PP/R1BQK2R b KQ - +King's Indian: Four pawns attack +rnbq1rk1/pp3ppp/1b3n2/2ppN3/1P1PP3/P1N5/2P2PPP/R1BQKB1R w KQ - +Ruy Lopez: open, Harksen gambit * +rnbq1rk1/pp3ppp/1bp2n2/4N3/1P1Pp3/P1N1B3/2P1BPPP/R2QK2R b KQ - +Ruy Lopez: open, classical defense * +rnbq1rk1/pp3ppp/1bp2n2/4N3/1P1Pp3/P1N1B3/2P2PPP/R2QKB1R w KQ - +Ruy Lopez: open, 9.c3 * +rnbq1rk1/pp3ppp/1bp2n2/4N3/1PBPp3/P1N1B3/2P2PPP/R2QK2R b KQ - +Ruy Lopez: open, Italian variation * +rnbq1rk1/pp3ppp/1bp2n2/8/1PNPp3/P1N1B3/2P2PPP/R2QKB1R b KQ - +Ruy Lopez: open, Berlin variation * +rnbq1rk1/pp3ppp/2p2n2/2bP2N1/2B1p3/2N5/PPPP1PPP/R1BQK2R w KQ - +two knights: Max Lange attack, Krause variation * +rnbq1rk1/pp3ppp/2p2n2/2bPp1B1/2B5/2NP4/PPP2PPP/R2QK1NR b KQ - +Scotch gambit: Anderssen (Paulsen, Suhle) counter-attack * +rnbq1rk1/pp3ppp/2p2n2/3pp3/1b2P3/1BN2N2/PPPP1PPP/R1BQ1RK1 b - - +Ruy Lopez: classical defense, Benelux variation * +rnbq1rk1/pp3ppp/2p2n2/3pp3/2P5/2NP1N2/PP1QPPPP/R3KB1R w KQ - +Sicilian: Canal-Sokolsky attack, Bronstein gambit * +rnbq1rk1/pp3ppp/2p2n2/b2PN3/4p3/P1N5/1PPPBPPP/R1BQK2R w KQ - +Ruy Lopez: closed, Basque gambit (North Spanish variation) * +rnbq1rk1/pp3ppp/3b1n2/2ppN1B1/3P4/3B4/PPP2PPP/RN1Q1RK1 b - - +Petrov: classical attack, Tarrasch variation * +rnbq1rk1/pp3ppp/3b1n2/2ppN3/3P4/2N5/PPP1BPPP/R1BQK2R w KQ - +Petrov: classical attack, Jaenisch variation * +rnbq1rk1/pp3ppp/3b4/2pnp3/8/P2PPNP1/1P3P1P/RNBQKB1R b KQ - +Sicilian: Kan, Gipslis variation * +rnbq1rk1/pp3ppp/3b4/2ppN3/3PB3/8/PPP2PPP/RNBQ1RK1 b - - +Petrov: modern attack, Trifunovi\'c variation * +rnbq1rk1/pp3ppp/4p3/1B6/3PP3/5N2/P2Q1PPP/R3K2R b KQ - +QGD: Semi-Tarrasch, Kmoch variation +rnbq1rk1/pp3ppp/4p3/2pn4/3P4/P1P1PP2/6PP/R1BQKBNR w KQ - +Nimzo-Indian: S\"amisch, Botvinnik variation +rnbq1rk1/pp3ppp/4pn2/2bP4/8/4PN2/PP3PPP/RNBQKB1R b KQ - +QGA: classical, Steinitz variation * +rnbq1rk1/pp3ppp/4pn2/2bp4/2P5/4PN2/PP3PPP/RNBQKB1R w KQ - +QGA: classical variation, 6.O-O * +rnbq1rk1/pp3ppp/4pn2/2bp4/2P5/P3PN2/1P3PPP/RNBQKB1R b KQ - +QGA: classical, 6...a6 * +rnbq1rk1/pp3ppp/4pn2/2p5/1bBP4/2N1PN2/PP3PPP/R1BQ1RK1 b - - +Nimzo-Indian: 4.e3, Gligori\'c system with 7...dc +rnbq1rk1/pp3ppp/4pn2/2pp4/1bPP4/2NBPN2/PP3PPP/R1BQK2R w KQ - +Nimzo-Indian: 4.e3, main line with ...c5 +rnbq1rk1/pp3ppp/5n2/2bpp3/2P5/P3PN2/1P3PPP/RNBQKB1R w KQ - +QGA: classical, Geller variation * +rnbq1rk1/pp4pp/2p5/2bppp2/3PP1n1/2P4N/PP1NBPPP/R1BQ1RK1 b - - +Philidor: Hanham, Berger variation * +rnbq1rk1/ppp1b1pp/3ppn2/5p2/2PP4/5NP1/PP2PPBP/RNBQ1RK1 w - - +Dutch: classical variation +rnbq1rk1/ppp1b1pp/4pn2/3p1p2/2PP4/1P3NP1/P3PPBP/RNBQ1RK1 b - - +Dutch: stonewall, Botwinnik variation +rnbq1rk1/ppp1b1pp/4pn2/3p1p2/2PP4/2N2NP1/PP2PPBP/R1BQ1RK1 b - - +Dutch: stonewall with Nc3 +rnbq1rk1/ppp1b1pp/4pn2/3p1p2/2PP4/5NP1/PP2PPBP/RNBQ1RK1 w - - +Dutch: stonewall variation +rnbq1rk1/ppp1bpp1/4p2p/3p4/2PPn2B/2N1PN2/PP3PPP/R2QKB1R w KQ - +QGD: Lasker defense +rnbq1rk1/ppp1bpp1/4pB1p/3p4/2PP4/2N1PN2/PP3PPP/R2QKB1R b KQ - +QGD: Neo-orthodox variation, 7.Bxf6 +rnbq1rk1/ppp1bpp1/4pn1p/3p2B1/2PP4/2N1PN2/PP3PPP/R2QKB1R w KQ - +QGD: Neo-orthodox variation +rnbq1rk1/ppp1bpp1/4pn1p/3p4/2PP3B/2N1PN2/PP3PPP/R2QKB1R b KQ - +QGD: Neo-orthodox variation, 7.Bh4 +rnbq1rk1/ppp1bppp/4pn2/3p2B1/2PP4/2N1P3/PP3PPP/2RQKBNR b K - +QGD: Anti-neo-orthodox variation +rnbq1rk1/ppp1bppp/4pn2/3p2B1/2PP4/2N1P3/PP3PPP/R2QKBNR w KQ - +QGD: 4.Bg5 Be7, 5.e3 O-O +rnbq1rk1/ppp1bppp/4pn2/3p2B1/2PP4/2N1PN2/PP3PPP/R2QKB1R b KQ - +QGD: 6.Nf3 +rnbq1rk1/ppp1bppp/8/3p4/3Pn3/3B1N2/PPP2PPP/RNBQ1RK1 w - - +Petrov: classical attack, Mason variation +rnbq1rk1/ppp1ppbp/1n4p1/8/3P4/5NP1/PP2PPBP/RNBQ1RK1 w - - +Neo-Gr\"unfeld, 6.cd Nxd5, 7.O-O Nb6 +rnbq1rk1/ppp1ppbp/3p1np1/4P3/3P1P2/2N2N2/PPP3PP/R1BQKB1R b KQ - +Pirc: Austrian attack, 6.e5 +rnbq1rk1/ppp1ppbp/3p1np1/6B1/2PPP3/2N2N2/PP3PPP/R2QKB1R b KQ - +King's Indian: Zinnowitz variation +rnbq1rk1/ppp1ppbp/3p1np1/6B1/2PPP3/2N5/PP2BPPP/R2QK1NR b KQ - +King's Indian: Averbakh system +rnbq1rk1/ppp1ppbp/3p1np1/8/2PPP3/2N1B3/PP2BPPP/R2QK1NR b KQ - +King's Indian: Semi-Averbakh system +rnbq1rk1/ppp1ppbp/3p1np1/8/2PPP3/2N1BN2/PP3PPP/R2QKB1R b KQ - +King's Indian: Larsen variation +rnbq1rk1/ppp1ppbp/3p1np1/8/2PPP3/2N2N2/PP2BPPP/R1BQK2R b KQ - +King's Indian: 6.Be2 +rnbq1rk1/ppp1ppbp/3p1np1/8/2PPP3/2N2P2/PP4PP/R1BQKBNR w KQ - +King's Indian: S\"amisch, 5...O-O +rnbq1rk1/ppp1ppbp/3p1np1/8/2PPPP2/2N5/PP2B1PP/R1BQK1NR b KQ - +King's Indian: Four pawns attack, 6.Be2 +rnbq1rk1/ppp1ppbp/3p1np1/8/3PP3/6P1/PPP1NPBP/RNBQK2R b KQ - +R\'eti: King's Indian attack, Pachman system * +rnbq1rk1/ppp1ppbp/3p1np1/8/3PPP2/2N1BN2/PPP3PP/R2QKB1R b KQ - +Pirc: Austrian attack, 6.Be3 +rnbq1rk1/ppp1ppbp/3p1np1/8/3PPP2/2N2N2/PPP3PP/R1BQKB1R w KQ - +Pirc: Austrian attack +rnbq1rk1/ppp1ppbp/3p1np1/8/3PPP2/2NB1N2/PPP3PP/R1BQK2R b KQ - +Pirc: Austrian attack, 6.Bd3 +rnbq1rk1/ppp1ppbp/5np1/3p4/1PPP4/2N1PN2/P4PPP/R1BQKB1R b KQ - +Gr\"unfeld: Makogonov variation +rnbq1rk1/ppp1ppbp/5np1/3p4/2PP1B2/2N1P3/PP3PPP/2RQKBNR b K - +Gr\"unfeld: Gr\"unfeld gambit, Capablanca variation +rnbq1rk1/ppp1ppbp/5np1/3p4/2PP1B2/2N1P3/PP3PPP/R2QKBNR w KQ - +Gr\"unfeld: Gr\"unfeld gambit +rnbq1rk1/ppp1ppbp/5np1/3p4/2PP1B2/2N1PN2/PP3PPP/R2QKB1R b KQ - +Gr\"unfeld with Bf4 & e3 +rnbq1rk1/ppp1ppbp/5np1/3p4/2PP4/1QN1PN2/PP3PPP/R1B1KB1R b KQ - +Gr\"unfeld with e3 & Qb3 +rnbq1rk1/ppp1ppbp/5np1/3p4/2PP4/2N1PN2/PP1B1PPP/R2QKB1R b KQ - +Gr\"unfeld: Opo\v censky variation +rnbq1rk1/ppp1ppbp/5np1/3p4/2PP4/2NBPN2/PP3PPP/R1BQK2R b KQ - +Gr\"unfeld with e3 & Bd3 +rnbq1rk1/ppp1ppbp/5np1/3p4/2PP4/5NP1/PP2PPBP/RNBQ1RK1 b - - +Neo-Gr\"unfeld, 6.O-O +rnbq1rk1/ppp1ppbp/5np1/3p4/5P2/2P3PN/PP1PP1BP/RNBQK2R b KQ - +Dutch: Leningrad, Basman system * +rnbq1rk1/ppp1ppbp/5np1/8/2QPP3/2N2N2/PP3PPP/R1B1KB1R b KQ - +Gr\"unfeld: Russian variation with e4 +rnbq1rk1/ppp1ppbp/6p1/3n4/3P4/5NP1/PP2PPBP/RNBQ1RK1 b - - +Neo-Gr\"unfeld, 6.cd Nxd5, 7.O-O +rnbq1rk1/ppp2pbp/3p1np1/3Pp3/2P1P3/2N1BP2/PP4PP/R2QKBNR b KQ - +King's Indian: S\"amisch, orthodox, 7.d5 +rnbq1rk1/ppp2pbp/3p1np1/3Pp3/2P1P3/2N2N2/PP2BPPP/R1BQK2R b KQ - +King's Indian: Petrosian system +rnbq1rk1/ppp2pbp/3p1np1/4P3/2P1P3/2N2N2/PP2BPPP/R1BQK2R b KQ - +King's Indian: Andersson variation +rnbq1rk1/ppp2pbp/3p1np1/4p3/2PPP3/2N1BN2/PP2BPPP/R2QK2R b KQ - +King's Indian: Gligori\'c-Taimanov system +rnbq1rk1/ppp2pbp/3p1np1/4p3/2PPP3/2N1BP2/PP4PP/R2QKBNR w KQ - +King's Indian: S\"amisch, orthodox variation +rnbq1rk1/ppp2pbp/3p1np1/4p3/2PPP3/2N2N2/PP2BPPP/R1BQ1RK1 b - - +King's Indian: orthodox variation +rnbq1rk1/ppp2pbp/3p1np1/4p3/2PPP3/2N2N2/PP2BPPP/R1BQK2R w KQ - +King's Indian: classical variation +rnbq1rk1/ppp2pbp/3p1np1/4p3/2PPP3/2N3P1/PP2NPBP/R1BQK2R b KQ - +King's Indian: Pomar system +rnbq1rk1/ppp2pbp/4pnp1/3p4/2PP4/1QN1PN2/PP3PPP/R1B1KB1R w KQ - +Gr\"unfeld: Botvinnik variation +rnbq1rk1/ppp2ppp/1b3n2/3pN3/1P2P3/P1N5/2PP1PPP/R1BQKB1R w KQ - +Ruy Lopez: open, 7.Bb3 * +rnbq1rk1/ppp2ppp/1b3n2/4N3/1P1Pp3/P1N1B3/2P2PPP/R2QKB1R b KQ - +Ruy Lopez: open, 8...Be6 * +rnbq1rk1/ppp2ppp/1b3n2/4N3/1P1Pp3/P1N5/2P2PPP/R1BQKB1R w KQ - +Ruy Lopez: open, 8.de * +rnbq1rk1/ppp2ppp/1b3n2/4N3/1P1Pp3/P7/2P1NPPP/R1BQKB1R b KQ - +Ruy Lopez: open, Zukertort variation * +rnbq1rk1/ppp2ppp/3b1n2/3pN3/3P4/8/PPP1BPPP/RNBQ1RK1 b - - +Petrov: classical attack, Mason variation * +rnbq1rk1/ppp2ppp/3bpn2/3p4/2PP4/P1N1P3/1P2NPPP/R1BQKB1R w KQ - +Nimzo-Indian: Simagin variation +rnbq1rk1/ppp2ppp/4pn2/3p4/1bPP4/2N1PN2/PP3PPP/R1BQKB1R w KQ - +Nimzo-Indian: 4.e3 e8g8, 5.Nf3 d7d5 +rnbq1rk1/ppp2ppp/4pn2/3p4/1bPP4/2NBP3/PP3PPP/R1BQK1NR w KQ - +Nimzo-Indian: 4.e3 O-O, 5.Bd3 d5 +rnbq1rk1/ppp2ppp/4pn2/3p4/2PP4/P1PBP3/5PPP/R1BQK1NR b KQ - +Nimzo-Indian: 4.e3, Botvinnik system +rnbq1rk1/ppp2ppp/5P2/2b4Q/2pp4/2P5/PP3PPP/RNB1K1NR w KQ - +Bishop's opening: Pratt variation +rnbq1rk1/ppp2ppp/5n2/2b1p3/4p3/2PP4/PP1NBPPP/R1BQK1NR w KQ - +Philidor: Hanham, Steiner variation * +rnbq1rk1/ppp2ppp/5n2/2bP2N1/2B1p3/2N5/PPPP1PPP/R1BQK2R b KQ - +two knights: Max Lange attack, Steinitz variation * +rnbq1rk1/ppp2ppp/5n2/2bP4/2B1p3/2N2N2/PPPP1PPP/R1BQK2R w KQ - +two knights: Max Lange attack * +rnbq1rk1/ppp2ppp/5n2/2bPN3/8/2N5/PPPP1PPP/R1BQKB1R b KQ - +Two knights defense * +rnbq1rk1/ppp2ppp/5n2/2bPp3/8/2N2N2/PPPP1PPP/R1BQKB1R w KQ - +Two knights defense * +rnbq1rk1/ppp2ppp/5n2/2bpp3/4P3/2PP4/PP1N1PPP/R1BQKBNR w KQ - +Philidor: Hanham, Krause variation * +rnbq1rk1/ppp2ppp/5n2/3Pp3/1b6/2N2N2/PPPP1PPP/R1BQKB1R w KQ - +Ruy Lopez: Berlin defense, Nyholm attack * +rnbq1rk1/ppp2ppp/5n2/3pN3/1b2P3/2N5/PPPPBPPP/R1BQK2R b KQ - +Ruy Lopez: open Berlin defense, 5...Be7 * +rnbq1rk1/ppp2ppp/5n2/3pN3/1b2P3/P1N5/1PPP1PPP/R1BQKB1R b KQ - +Ruy Lopez: Berlin defense, Rosenthal variation * +rnbq1rk1/ppp2ppp/5n2/3pN3/4P3/P1PP4/2P2PPP/R1BQKB1R b KQ - +Ruy Lopez: Steinitz defense deferred, Rubinstein variation * +rnbq1rk1/ppp2ppp/5n2/3pp1B1/4P3/P1PP1N2/2P2PPP/R2QKB1R b KQ - +Ruy Lopez: Steinitz defense deferred, Lipnitsky variation * +rnbq1rk1/ppp2ppp/5n2/3pp3/1b2P3/2NP4/PPPN1PPP/R1BQKB1R b KQ - +Ruy Lopez: closed Berlin defense, Chigorin variation * +rnbq1rk1/ppp2ppp/5n2/4N3/1b2p3/2N5/PPPPBPPP/R1BQK2R w KQ - +Ruy Lopez: Berlin defense, Minckwitz variation * +rnbq1rk1/ppp2ppp/5n2/8/1b2p3/2NN4/PPPP1PPP/R1BQKB1R w KQ - +Ruy Lopez: open Berlin defense, l'Hermet variation * +rnbq1rk1/ppp2ppp/5n2/b2PN3/8/P1N5/1PPP1PPP/R1BQKB1R b KQ - +Ruy Lopez: open, Riga variation * +rnbq1rk1/ppp2ppp/5n2/b2p4/4P3/2NN4/PPPP1PPP/R1BQKB1R w KQ - +Ruy Lopez: open Berlin defense, Showalter variation * +rnbq1rk1/ppp2ppp/5n2/b2pN3/1P2P3/P1N5/2PP1PPP/R1BQKB1R b KQ - +Ruy Lopez: open, 6.d4 b5 * +rnbq1rk1/ppp2ppp/5n2/b2pN3/4P3/P1N5/1PPP1PPP/R1BQKB1R w KQ - +Ruy Lopez: open, 6.d4 * +rnbq1rk1/ppp2ppp/5n2/b2pp3/4P3/P1N2N2/1PPPBPPP/R1BQK2R w KQ - +Ruy Lopez: closed, center attack * +rnbq1rk1/ppp2ppp/5n2/b3N3/1P1pP3/P1N5/2PP1PPP/R1BQKB1R w KQ - +Ruy Lopez: open, Richter variation * +rnbq1rk1/ppp2ppp/8/2b1p3/8/2P1NN2/PP1P1nPP/R1BQKB1R w KQ - +Scotch: Cochrane variation * +rnbq1rk1/ppp2ppp/8/3pb3/2PPn3/3B4/PP3PPP/RNBQ1RK1 w - - +Petrov: modern attack, Trifunovi\'c variation +rnbq1rk1/ppp2ppp/8/b2pN3/1P2n3/P1N5/2PP1PPP/R1BQKB1R w KQ - +Ruy Lopez: open, Friess attack * +rnbq1rk1/pppnbppp/4p3/3pP1B1/3P3P/2N5/PPP2PP1/R2QKBNR w KQ - +French: Albin-Alekhine-Ch\^atard attack, Spielmann variation +rnbq1rk1/pppp1pp1/5n1p/4p1B1/4P2P/P1P5/1PP2PP1/R2QKBNR b KQ - +Ruy Lopez: exchange variation, Alapin gambit * +rnbq1rk1/pppp1ppp/1b3n2/4p3/1P2P3/P1N2N2/1BPP1PPP/R2QKB1R b KQ - +Ruy Lopez: Archangelsk (counterthrust) variation * +rnbq1rk1/pppp1ppp/1b3n2/4p3/1P2P3/P1NP1N2/2P2PPP/R1BQKB1R b KQ - +Ruy Lopez: ...b5 & ...d6 * +rnbq1rk1/pppp1ppp/4pn2/8/1bPP4/2N1P3/PP2NPPP/R1BQKB1R b KQ - +Nimzo-Indian: Reshevsky variation +rnbq1rk1/pppp1ppp/4pn2/8/1bPP4/2N1P3/PP3PPP/R1BQKBNR w KQ - +Nimzo-Indian: 4.e3 O-O +rnbq1rk1/pppp1ppp/4pn2/8/1bPP4/2N1PN2/PP3PPP/R1BQKB1R b KQ - +Nimzo-Indian: 4.e3 e8g8, 5.Nf3, without ...d5 +rnbq1rk1/pppp1ppp/4pn2/8/1bPP4/2NBP3/PP3PPP/R1BQK1NR b KQ - +Nimzo-Indian: 4.e3 O-O, 5.Bd3 +rnbq1rk1/pppp1ppp/4pn2/8/2PP4/P1P1P3/5PPP/R1BQKBNR b KQ - +Nimzo-Indian: S\"amisch variation +rnbq1rk1/pppp1ppp/4pn2/8/2PP4/P1P5/4PPPP/R1BQKBNR w KQ - +Nimzo-Indian: S\"amisch variation +rnbq1rk1/pppp1ppp/5n2/4N3/1b2P3/2N5/PPPP1PPP/R1BQKB1R b KQ - +Ruy Lopez: Berlin defense, open variation * +rnbq1rk1/pppp1ppp/5n2/4p3/1b2P3/2N2N2/PPPP1PPP/R1BQKB1R w KQ - +Ruy Lopez: Berlin defense, 4.O-O * +rnbq1rk1/pppp1ppp/5n2/4p3/1b2P3/2NP1N2/PPP2PPP/R1BQKB1R b KQ - +Ruy Lopez: Berlin defense, 4.O-O, d6 * +rnbq1rk1/pppp1ppp/5n2/4p3/1bB1P3/2N2N2/PPPP1PPP/R1BQK2R b KQ - +Ruy Lopez: Berlin defense, Beverwijk variation * +rnbq1rk1/pppp1ppp/5n2/4p3/4P3/P1P2P2/1PP3PP/R1BQKBNR b KQ - +Ruy Lopez: exchange, Gligori\'c variation * +rnbq1rk1/pppp1ppp/5n2/4p3/4P3/P1P5/1PP2PPP/R1BQKBNR w KQ - +Ruy Lopez: exchange variation, 5.O-O * +rnbq1rk1/pppp1ppp/5n2/4p3/4P3/P1PQ4/1PP2PPP/R1B1KBNR b KQ - +Ruy Lopez: exchange, Bronstein variation * +rnbq1rk1/pppp1ppp/5n2/4p3/4P3/P1b2N2/1PPPBPPP/R1BQK2R w KQ - +Ruy Lopez: Exchange variation doubly deferred (DERLD) * +rnbq1rk1/pppp1ppp/5n2/b3N3/4P3/P1N5/1PPP1PPP/R1BQKB1R b KQ - +Ruy Lopez: open (Tarrasch) defense * +rnbq1rk1/pppp1ppp/5n2/b3p3/2B1P3/P1N2N2/1PPP1PPP/R1BQK2R b KQ - +Ruy Lopez: M\"oller defense * +rnbq1rk1/pppp1ppp/5n2/b3p3/4P3/P1N2N2/1PPP1PPP/R1BQKB1R w KQ - +Ruy Lopez: 5.O-O * +rnbq1rk1/pppp1ppp/5n2/b3p3/4P3/P1N2N2/1PPPBPPP/R1BQK2R b KQ - +Ruy Lopez: closed defense * +rnbq1rk1/pppp1ppp/5n2/b3p3/4P3/P1NP1N2/1PP2PPP/R1BQKB1R b KQ - +Ruy Lopez: Steinitz defense deferred (Russian defense) * +rnbq1rk1/pppp1ppp/5n2/b3p3/4P3/P1NP4/1PP2PPP/R1BQKBNR w KQ - +Ruy Lopez: modern Steinitz defense, 5.O-O * +rnbq1rk1/pppp1ppp/8/3Pp3/1b6/8/PPPPNPPP/R1BQKB1R b KQ - +Ruy Lopez: Bird's defense, Paulsen variation * +rnbq1rk1/pppp2p1/8/2b2PPp/3pn3/3B1N2/PPP2P1P/RNBQK2R w KQ - +KGA: Kieseritsky, Rice gambit * +rnbq1rk1/pppp2pp/5n2/2b1pP2/6P1/8/PPPP1PBP/RNBQK1NR w KQ - +KGA: Hanstein gambit * +rnbq1rk1/pppp2pp/5n2/2b1pPP1/3P4/8/PPP2P1P/RNBQKBNR b KQ - +KGA: Muzio gambit, Brentano defense * +rnbq1rk1/pppp2pp/5n2/2b1pPP1/8/8/PPPP1P1P/RNBQKBNR w KQ - +KGA: Muzio gambit * +rnbq1rk1/pppp2pp/5n2/2b1pPP1/8/8/PPPPQP1P/RNB1KBNR b KQ - +KGA: Muzio gambit, Kling and Horwitz counter-attack * +rnbq1rk1/ppppb1pp/4p3/5p2/2PPn3/5NP1/PP2PPBP/RNBQ1RK1 w - - +Dutch defense, Alekhine variation +rnbq1rk1/ppppb1pp/4pn2/5p2/2PP4/5NP1/PP2PPBP/RNBQK2R w KQ - +Dutch defense +rnbq1rk1/ppppppbp/5np1/6B1/3P4/2P2N2/PP2PPPP/RN1QKB1R b KQ - +R\'eti: King's Indian attack, Yugoslav variation * +rnbq2k1/pp1p1ppp/1bp5/8/1P1Nr3/P1P5/4BPPP/R1BQ1RK1 b - - +Ruy Lopez: Marshall counter-attack, 11...c6 * +rnbq2k1/pp3ppp/1bp5/3p4/1P1Nr3/P1P5/4BPPP/R1BQ1RK1 w - - +Ruy Lopez: Marshall, main line, 12.d2d4 * +rnbq2k1/pp3ppp/1bp5/4r3/1P1Pp3/P1N1P3/2PQB1PP/R4RK1 w - - +Ruy Lopez: open, Tarrasch trap * +rnbq2k1/pp3ppp/2p1r3/3p4/1P1P4/P2B4/5PPP/R1BQ1RK1 w - - +Ruy Lopez: Marshall, Kevitz variation * +rnbq2k1/pppp1ppp/1b6/3N4/1PBpr1n1/P4N2/2P2PPP/R1BQ1K1R b - - +Ruy Lopez: Rabinovich variation * +rnbq3r/pp4pp/2P2nk1/8/2Bbp3/2N5/PPPP1PPP/R1BQK2R w KQ - +Giuoco Piano: Ghulam Kassim variation * +rnbq3r/pppp1k2/3b1n1p/8/4PQ1P/8/PPPP2P1/RNB1KB1R w KQ - +KGA: Allgaier, Horny defense +rnbqk1n1/pppp1p1r/7b/4N2p/2BPPppP/2N5/PPP3P1/R1BQK2R b KQq - +KGA: Kieseritsky, long whip defense, Jaenisch variation +rnbqk1nb/pp3p2/2pp4/4N1p1/2BPPp2/2N5/PPP3P1/R1BQK3 b Qkq - +KGA: Greco gambit +rnbqk1nr/1p1p1ppp/p3p3/2b5/3NP3/3B4/PPP2PPP/RNBQK2R w KQkq - +Sicilian: Kan, Polugaievsky variation +rnbqk1nr/5ppp/2p1p3/pp6/PbpP4/2N1PN2/1P1B1PPP/R2QKB1R w KQkq - +QGD: semi-Slav, Abrahams variation +rnbqk1nr/p1p1bppp/1p2p3/3pP3/3P4/2N1B3/PPP2PPP/R2QKBNR w KQkq - +French: classical, Frankfurt variation +rnbqk1nr/p1pp1ppp/8/1pb1p3/2B1P3/8/PPPP1PPP/RNBQK1NR w KQkq - +Bishop's opening: Wing gambit * +rnbqk1nr/p1pp2pp/8/1Bb1pp2/4P3/8/PPPP1PPP/RNBQK1NR w KQkq - +Bishop's opening: MacDonnell double gambit * +rnbqk1nr/pp1p1ppp/2p5/2b1p3/2B1P1Q1/8/PPPP1PPP/RNB1K1NR b KQkq - +Bishop's opening: del Rio variation * +rnbqk1nr/pp1p1ppp/2p5/2b1p3/2B1P3/8/PPPP1PPP/RNBQK1NR w KQkq - +Bishop's opening: Philidor variation * +rnbqk1nr/pp1p1ppp/2p5/2b1p3/2BPP3/8/PPP2PPP/RNBQK1NR b KQkq - +Bishop's opening: Lewis counter-gambit * +rnbqk1nr/pp1pp2p/6p1/2pP1p2/2P5/2P5/P3PPPP/R1BQKBNR w KQkq - +Beefeater defense +rnbqk1nr/pp1ppp1p/6pb/2p5/2P1P3/5N2/PP1P1PPP/RNBQKB1R w KQkq - +Sicilian: Acton extension +rnbqk1nr/pp1pppbp/8/2p3B1/3P4/8/PPP1PPPP/RN1QKBNR w KQkq - +Grob: Fritz gambit * +rnbqk1nr/pp1pppbp/8/2pP2B1/8/8/PPP1PPPP/RN1QKBNR b KQkq - +Grob: Romford counter-gambit * +rnbqk1nr/pp2bppp/2p5/3p4/3PpB2/2P1P3/PP3PPP/RN1QKBNR w KQkq - +Caro-Kann: advance, Short variation * +rnbqk1nr/pp2ppb1/2p3p1/3pP2p/3P1P2/2N5/PPP3PP/R1BQKBNR w KQkq - +Robatsch defense: Gurgenidze variation +rnbqk1nr/pp2ppbp/2pp2p1/8/3PP3/2N2N2/PPP2PPP/R1BQKB1R w KQkq - +Robatsch defense: two knights, Suttles variation +rnbqk1nr/pp2ppbp/6p1/1Bpp4/5P2/4PN2/PPPP2PP/RNBQK2R b KQkq - +Dutch defense: Dutch-Indian (Nimzo-Dutch) variation * +rnbqk1nr/pp2ppbp/6p1/2pp4/3P4/4PN2/PPP2PPP/RNBQKB1R w KQkq - +Catalan: closed * +rnbqk1nr/pp2ppbp/6p1/2pp4/3P4/5NP1/PPP1PPBP/RNBQK2R b KQkq - +King's Indian: 3.g3, counterthrust variation * +rnbqk1nr/pp2ppbp/6p1/2pp4/5P2/4PN2/PPPP2PP/RNBQKB1R w KQkq - +Dutch defense * +rnbqk1nr/pp2ppbp/6p1/2pp4/5P2/4PN2/PPPPB1PP/RNBQK2R b KQkq - +Dutch defense * +rnbqk1nr/pp2ppbp/6p1/3p4/3N4/6P1/PPP1PPBP/RNBQK2R b KQkq - +Neo-Gr\"unfeld, 5.cd * +rnbqk1nr/pp3ppp/4p3/2ppP3/1b1P2Q1/2N5/PPP2PPP/R1B1KBNR b KQkq - +French: Winawer, advance, Russian variation +rnbqk1nr/pp3ppp/4p3/2ppP3/1b1P4/2N5/PPP2PPP/R1BQKBNR w KQkq - +French: Winawer, advance variation +rnbqk1nr/pp3ppp/4p3/2ppP3/1b1P4/2N5/PPPB1PPP/R2QKBNR b KQkq - +French: Winawer, advance, Bogolyubov variation +rnbqk1nr/pp3ppp/4p3/2ppP3/1b1P4/P1N5/1PP2PPP/R1BQKBNR b KQkq - +French: Winawer, advance, 5.a3 +rnbqk1nr/pp3ppp/4p3/2ppP3/3P4/P1P5/2P2PPP/R1BQKBNR b KQkq - +French: Winawer, advance variation +rnbqk1nr/pp3ppp/4p3/3pP3/1P6/2p2N2/1PP2PPP/R1BQKB1R b KQkq - +French: Winawer, advance, Rauzer variation +rnbqk1nr/ppp1bppp/3p4/4p3/2B1P3/2P2N2/PP1P1PPP/RNBQK2R b KQkq - +Philidor: Steinitz variation +rnbqk1nr/ppp1bppp/4p3/3p4/2PP4/2N5/PP2PPPP/R1BQKBNR w KQkq - +QGD: Charousek (Petrosian) variation +rnbqk1nr/ppp1bppp/4p3/3pP1B1/3P4/2N5/PPP2PPP/R2QKBNR w KQkq - +French: classical, Vistaneckis (Nimzovich) variation +rnbqk1nr/ppp1p1bp/3p2p1/5p2/2PPP3/2N5/PP3PPP/R1BQKBNR w KQkq - +Modern defense: Averbakh system, Randspringer variation +rnbqk1nr/ppp1ppbp/3p2p1/8/2PP4/2N5/PP2PPPP/R1BQKBNR w KQkq - +Modern defense +rnbqk1nr/ppp1ppbp/3p2p1/8/2PPP3/2N5/PP3PPP/R1BQKBNR b KQkq - +Modern defense: Averbakh system +rnbqk1nr/ppp1ppbp/3p2p1/8/3PP3/2N2N2/PPP2PPP/R1BQKB1R b KQkq - +Robatsch defense: two knights variation +rnbqk1nr/ppp1ppbp/3p2p1/8/3PP3/2N5/PPP2PPP/R1BQKBNR w KQkq - +Robatsch (modern) defense +rnbqk1nr/ppp1ppbp/3p2p1/8/3PP3/2P2N2/PP3PPP/RNBQKB1R b KQkq - +Robatsch defense: Geller's system +rnbqk1nr/ppp1ppbp/3p2p1/8/3PPP2/2N5/PPP3PP/R1BQKBNR b KQkq - +Robatsch defense: Pseudo-Austrian attack +rnbqk1nr/ppp1ppbp/6p1/3p4/5P2/5NP1/PPPPP2P/RNBQKB1R b KQkq - +Dutch defense * +rnbqk1nr/ppp2p1p/3b4/6p1/8/5N2/PPPPP1PP/RNBQKB1R w KQkq - +Bird: From gambit, Lasker variation +rnbqk1nr/ppp2pb1/3p3p/6p1/2BPPp1P/3Q1N2/PPP3P1/RNB1K2R b KQkq - +KGA: Philidor gambit, Schultz variation +rnbqk1nr/ppp2ppp/1b1p4/8/2P1p3/1N6/PP1PPPPP/RNBQKB1R w KQkq - +Alekhine's defense: Kmoch variation * +rnbqk1nr/ppp2ppp/3b4/3Pp3/8/5N2/PPPP1PPP/RNBQKB1R w KQkq - +QP counter-gambit: Maroczy gambit +rnbqk1nr/ppp2ppp/3b4/3pp3/3P4/4P3/PPP2PPP/RNBQKBNR w KQkq - +French: Schlechter variation * +rnbqk1nr/ppp2ppp/3bp3/3p4/3P4/5N2/PPP1PPPP/RNBQKB1R w KQkq - +Queen's pawn: stonewall attack * +rnbqk1nr/ppp2ppp/3p4/2b1P3/4P3/5N2/PPPP2PP/RNBQKB1R b KQkq - +KGD: classical, Soldatenkov variation +rnbqk1nr/ppp2ppp/3p4/2b1p3/1P2PP2/5N2/P1PP2PP/RNBQKB1R b KQkq - +KGD: classical, Heath variation +rnbqk1nr/ppp2ppp/3p4/2b1p3/4PP2/2P2N2/PP1P2PP/RNBQKB1R b KQkq - +KGD: classical, 4.c3 +rnbqk1nr/ppp2ppp/3p4/2b1p3/4PP2/8/PPPP2PP/RNBQKBNR w KQkq - +Bishop's opening: Calabrese counter-gambit, Jaenisch variation * +rnbqk1nr/ppp2ppp/4p3/3p4/1b1PP3/2N5/PPP1NPPP/R1BQKB1R b KQkq - +French: Winawer, Alekhine (Mar\'oczy) gambit +rnbqk1nr/ppp2ppp/4p3/3p4/1b1PP3/2N5/PPP2PPP/R1BQKBNR w KQkq - +French: Winawer (Nimzovich) variation +rnbqk1nr/ppp2ppp/4p3/3p4/1b1PP3/2N5/PPPB1PPP/R2QKBNR b KQkq - +French: Winawer, fingerslip variation +rnbqk1nr/ppp2ppp/4p3/3pP3/1b1P4/2N5/PPP2PPP/R1BQKBNR b KQkq - +French: Winawer, advance variation +rnbqk1nr/ppp2ppp/4p3/8/3Pp3/P1b5/1PP1NPPP/R1BQKB1R w KQkq - +French: Winawer, Alekhine gambit +rnbqk1nr/ppp2ppp/8/2bp4/3Np3/3P4/PPP1PPPP/RNBQKB1R w KQkq - +Alekhine's defense: Balogh variation * +rnbqk1nr/ppp2ppp/8/2bpp3/2B1P3/2P5/PP1P1PPP/RNBQK1NR w KQkq - +Bishop's opening: Lewis counter-gambit +rnbqk1nr/ppp2ppp/8/2bpp3/2B1P3/8/PPPP1PPP/RNBQK1NR w KQkq - +Bishop's opening: Lewis gambit * +rnbqk1nr/ppp2ppp/8/2bpp3/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - +Bishop's opening: Ponziani gambit * +rnbqk1nr/ppp2ppp/8/4P3/1bP5/4p3/PP1B1PPP/RN1QKBNR w KQkq - +QGD: Albin counter-gambit, Lasker trap +rnbqk1nr/ppp3pp/3p4/2b1pp2/4PP2/2P2N2/PP1P2PP/RNBQKB1R w KQkq - +KGD: classical counter-gambit +rnbqk1nr/ppp3pp/4P3/2bp2N1/4p3/2N5/PPP2PPP/R1BQKB1R b KQkq - +Philidor: Philidor counter-gambit, Berger variation +rnbqk1nr/ppp3pp/8/2b2p2/2BpP3/2P2N2/PP4PP/RNBQK2R b KQkq - +KGD: classical, R\'eti variation +rnbqk1nr/pppp1pbp/8/4N3/4PppP/8/PPPP2P1/RNBQKB1R w KQkq - +KGA: Kieseritsky, Paulsen defense +rnbqk1nr/pppp1pbp/8/6p1/2B1Pp1P/5N2/PPPP2P1/RNBQK2R b KQkq - +KGA: Philidor gambit +rnbqk1nr/pppp1pbp/8/6p1/2B1Pp2/5N2/PPPP2PP/RNBQ1RK1 b kq - +KGA: Hanstein gambit +rnbqk1nr/pppp1pbp/8/6p1/2B1Pp2/5N2/PPPP2PP/RNBQK2R w KQkq - +King's knight's gambit +rnbqk1nr/pppp1ppp/4p3/8/1bPP4/8/PP2PPPP/RNBQKBNR w KQkq - +Queen's pawn: Franco-Indian (Keres) defense +rnbqk1nr/pppp1ppp/8/2b1p3/1PB1P3/8/P1PP1PPP/RNBQK1NR b KQkq - +Bishop's opening: Wing gambit +rnbqk1nr/pppp1ppp/8/2b1p3/2B1P3/2P5/PP1P1PPP/RNBQK1NR b KQkq - +Bishop's opening: Philidor variation +rnbqk1nr/pppp1ppp/8/2b1p3/2B1P3/8/PPPP1PPP/RNBQK1NR b KQkq - +Bishop's opening: Classical variation * +rnbqk1nr/pppp1ppp/8/2b1p3/2B1P3/8/PPPP1PPP/RNBQK1NR w KQkq - +Bishop's opening: Classical variation +rnbqk1nr/pppp1ppp/8/2b1p3/2BPP3/8/PPP2PPP/RNBQK1NR b KQkq - +Bishop's opening: Lewis gambit +rnbqk1nr/pppp1ppp/8/2b1p3/4P3/2P5/PP1P1PPP/RNBQKBNR b KQkq - +Bishop's opening: Philidor counter-attack * +rnbqk1nr/pppp1ppp/8/2b1p3/4P3/5N2/PPPP1PPP/RNBQKB1R b KQkq - +Bishop's opening: Berlin defense * +rnbqk1nr/pppp1ppp/8/2b1p3/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +Bishop's opening * +rnbqk1nr/pppp1ppp/8/2b1p3/4PP2/8/PPPP2PP/RNBQKBNR b KQkq - +Bishop's opening: Calabrese counter-gambit * +rnbqk1nr/pppp1ppp/8/2b1p3/4PP2/8/PPPP2PP/RNBQKBNR w KQkq - +KGD: classical variation +rnbqk1nr/pppp1ppp/8/2b1p3/8/2P5/PP1PPPPP/RNBQKBNR w KQkq - +Caro-Kann: Hillbilly attack * +rnbqk1nr/pppp1ppp/8/2b1p3/8/5N2/PPPPPPPP/RNBQKB1R w KQkq - +Alekhine's defense: Krejcik variation * +rnbqk1nr/pppp1ppp/8/4p3/1bB1PP2/8/P1PP2PP/RNBQK1NR b KQkq - +Bishop's opening: MacDonnell double gambit +rnbqk1nr/pppp1ppp/8/4p3/1bP5/2N5/PP1PPPPP/R1BQKBNR w KQkq - +English, Kramnik-Shirov counterattack +rnbqk1nr/pppp1ppp/8/8/2B1P2b/5N2/PPPP3p/RNBQ1R1K b kq - +KGA: Cunningham, three pawns gambit +rnbqk1nr/pppp1ppp/8/8/2B1Pp1b/5NP1/PPPP3P/RNBQK2R b KQkq - +KGA: Cunningham, Bertin gambit +rnbqk1nr/pppp1ppp/8/8/2BPP2b/5N2/P1P4p/RNBQ1R1K b kq - +Bishop's opening: Four pawns' gambit +rnbqk1nr/pppp2pp/3b4/4pP2/8/8/PPPP1PPP/RNBQKBNR w KQkq - +KGA: Schurig gambit * +rnbqk1nr/pppp2pp/8/2b1pP2/1P6/8/P1PP1PPP/RNBQKBNR b KQkq - +KGA: bishop's gambit, Bryan counter-gambit * +rnbqk1nr/pppp2pp/8/2b1pP2/3P4/8/PPP2PPP/RNBQKBNR b KQkq - +KGA: bishop's gambit, Bledow variation * +rnbqk1nr/pppp2pp/8/2b1pP2/5P2/8/PPPP2PP/RNBQKBNR b KQkq - +KGA: bishop's gambit, L\'opez-Gianutio counter-gambit * +rnbqk1nr/pppp2pp/8/2b1pP2/8/2N5/PPPP1PPP/R1BQKBNR b KQkq - +KGA: bishop's gambit, Maurian defense * +rnbqk1nr/pppp2pp/8/2b1pP2/8/2P5/PP1P1PPP/RNBQKBNR b KQkq - +KGA: bishop's gambit, Ruy L\'opez defense * +rnbqk1nr/pppp2pp/8/2b1pP2/8/5N2/PPPP1PPP/RNBQKB1R b KQkq - +KGA: bishop's gambit, Cozio (Morphy) defense * +rnbqk1nr/pppp2pp/8/2b1pP2/8/8/PPPP1PPP/RNBQKBNR w KQkq - +KGA: bishop's gambit * +rnbqk1nr/pppp2pp/8/2b1pP2/8/8/PPPPNPPP/RNBQKB1R b KQkq - +KGA: bishop's gambit, Steinitz defense * +rnbqk1nr/pppp2pp/8/2b1pp2/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - +Bishop's opening: Greco gambit * +rnbqk1nr/pppp2pp/8/4Pp2/1b1p4/8/PPP2PPP/RNBQKBNR w KQkq - +KGD: Falkbeer, Nimzovich variation * +rnbqk1nr/pppp2pp/8/4pP2/3b4/2P5/PP3PPP/RNBQKBNR b KQkq - +KGA: bishop's gambit, Anderssen variation * +rnbqk1nr/pppp2pp/8/4pP2/3b4/5N2/PPP2PPP/RNBQKB1R b KQkq - +KGA: bishop's gambit, Morphy variation * +rnbqk1nr/ppppb1pp/8/4pP2/8/8/PPPP1PPP/RNBQKBNR w KQkq - +KGA: Lesser bishop's (Petroff-Jaenisch-Tartakower) gambit * +rnbqk1nr/ppppbp1p/8/4N3/4PppP/8/PPPP2P1/RNBQKB1R w KQkq - +KGA: Kieseritsky, Polerio defense +rnbqk1nr/ppppbppp/8/8/4Pp2/5N2/PPPP2PP/RNBQKB1R w KQkq - +KGA: Cunningham defense +rnbqk1nr/ppppp1bp/6p1/5p2/3P4/6PN/PPP1PPBP/RNBQK2R b KQkq - +Dutch: Leningrad, Karlsbad variation +rnbqk1nr/ppppppbp/6p1/8/3PP3/2N5/PPP2PPP/R1BQKBNR b KQkq - +Robatsch defense +rnbqk1nr/ppppppbp/6p1/8/3PP3/8/PPP2PPP/RNBQKBNR w KQkq - +Robatsch (modern) defense +rnbqk1nr/ppppppbp/6p1/8/3PPP2/8/PPP3PP/RNBQKBNR b KQkq - +Robatsch defense: three pawns attack +rnbqk1nr/ppppppbp/8/8/3P2p1/2P5/PP2PPPP/RNBQKBNR w KQkq - +Grob: spike attack * +rnbqk1r1/ppp2pP1/4p3/3p4/1b1P2Qp/2N5/PPP2PP1/R3KBNR b KQq - +French: MacCutcheon, Grigoriev variation +rnbqk2r/1p2bp2/p2ppn1p/6p1/3NPP1B/2N2Q2/PPP3PP/R3KB1R w KQkq - +Sicilian: Najdorf, G\"oteborg (Argentine) variation +rnbqk2r/1p2bppp/p2ppn2/6B1/3NPP2/2N5/PPP3PP/R2QKB1R w KQkq - +Sicilian: Najdorf, 7...Be7 +rnbqk2r/1pp2ppp/1b3n2/p2p4/4p3/1N1P2P1/PPP1PPBP/RNBQK2R w KQkq - +Alekhine's defense: modern, Keres variation * +rnbqk2r/1ppnbppp/p3p3/3pP1B1/3P3P/2N5/PPP2PP1/R2QKBNR w KQkq - +French: Albin-Alekhine-Ch\^atard attack, Mar\'oczy variation +rnbqk2r/2pp1ppp/5n2/ppb1p3/4P3/1BN5/PPPP1PPP/R1BQK1NR w KQkq - +Evans gambit declined, 5.a4 * +rnbqk2r/p1p2ppp/1p1bpn2/3p4/2PP4/4PN2/PP3PPP/RNBQKB1R w KQkq - +Queen's pawn game, Rubinstein (Colle-Zukertort) variation * +rnbqk2r/p1pp1ppp/1p2pn2/8/1bPP4/2N1P3/PP2NPPP/R1BQKB1R b KQkq - +Nimzo-Indian: Fischer variation, 5.Ne2 +rnbqk2r/p1pp1ppp/1p2pn2/8/1bPP4/2N1P3/PP3PPP/R1BQKBNR w KQkq - +Nimzo-Indian: Fischer variation +rnbqk2r/p1pp1ppp/5n2/1Bb1p3/4P3/2N5/PPPP1PPP/R1BQK1NR b KQkq - +Evans gambit * +rnbqk2r/p1pp1ppp/5n2/1pb1p3/2B1P3/2N5/PPPP1PPP/R1BQK1NR w KQkq - +Evans gambit declined * +rnbqk2r/p1pp1ppp/5n2/1pb1p3/2BPP3/2N5/PPP2PPP/R1BQK1NR b KQkq - +Evans counter-gambit * +rnbqk2r/p1pp1ppp/8/2b1p3/Np2n1Q1/1B6/PPPP1PPP/R1B1K1NR b KQkq - +Evans gambit declined, Hirschbach variation * +rnbqk2r/p1pp1ppp/8/2b1p3/Np2n3/1B5N/PPPP1PPP/R1BQK2R b KQkq - +Evans gambit declined, Lange variation * +rnbqk2r/p2p1pp1/4pn1p/1ppP4/1bP4B/2N5/PP2PPPP/R2QKBNR w KQkq - +Nimzo-Indian: Leningrad, ...b5 gambit +rnbqk2r/p2p1ppp/1p2pn2/2p5/2PP4/P1P1P3/5PPP/R1BQKBNR w KQkq - +Nimzo-Indian: S\"amisch, O'Kelly variation +rnbqk2r/p2p1ppp/2p2n2/1pb1p3/2B1P3/2N2N2/PPPP1PPP/R1BQK2R w KQkq - +Giuoco Piano: Bird's attack * +rnbqk2r/p2p1ppp/2p2n2/2b1p3/4P3/2N5/PPPP1PPP/R1BQKBNR b KQkq - +Evans gambit: Mayet defense * +rnbqk2r/p2p1ppp/2p2n2/2b1p3/4P3/2N5/PPPPBPPP/R1BQK1NR b KQkq - +Evans gambit: 5...Be7 * +rnbqk2r/p2p1ppp/2p2n2/2b1p3/4P3/2NB4/PPPP1PPP/R1BQK1NR b KQkq - +Evans gambit: Stone-Ware variation * +rnbqk2r/p2p1ppp/2p2n2/2b1p3/B3P3/2N5/PPPP1PPP/R1BQK1NR b KQkq - +Evans gambit * +rnbqk2r/p4ppp/2p2n2/1Bb1p3/8/2N5/PPPP1PPP/R1BQK1NR w KQkq - +Scotch gambit * +rnbqk2r/p4ppp/2p2n2/2b5/B3p3/2N5/PPPP1PPP/R1BQK1NR w KQkq - +Scotch gambit: Cochrane variation * +rnbqk2r/p4ppp/2p2n2/2bpp3/B3P3/2NP4/PPP2PPP/R1BQK1NR b KQkq - +Evans gambit * +rnbqk2r/p4ppp/2p2n2/2bpp3/BP2P3/2N5/P1PP1PPP/R1BQK1NR b KQkq - +Evans gambit: Leonhardt variation * +rnbqk2r/p4ppp/2p2n2/2bpp3/N3P3/8/PPPPBPPP/R1BQK1NR b KQkq - +Evans gambit: Cordel variation * +rnbqk2r/pp1n1ppp/4p3/2bpP3/5PQ1/2N5/PPP3PP/R1B1KBNR b KQkq - +French: Steinitz, Bradford attack +rnbqk2r/pp1nbppp/4p3/2ppP1B1/3P3P/2N5/PPP2PP1/R2QKBNR w KQkq - +French: Albin-Alekhine-Ch\^atard attack, Breyer variation +rnbqk2r/pp1p1ppp/2p2n2/2b1p3/2B1P3/2N2N2/PPPP1PPP/R1BQK2R b KQkq - +Giuoco Piano * +rnbqk2r/pp1p1ppp/2p2n2/2b1p3/2B1P3/2N5/PPPP1PPP/R1BQK1NR w KQkq - +Giuoco Piano * +rnbqk2r/pp1p1ppp/2p2n2/2b1p3/2B1P3/2N5/PPPPQPPP/R1B1K1NR b KQkq - +Giuoco Piano: close variation * +rnbqk2r/pp1p1ppp/2p2n2/2b1p3/4P3/3P4/PPP1BPPP/RNBQK1NR w KQkq - +Philidor: Steinitz variation * +rnbqk2r/pp1p1ppp/2p2n2/4p3/1b2P3/1BN5/PPPP1PPP/R1BQK1NR b KQkq - +Ruy Lopez: classical defense, Charousek variation * +rnbqk2r/pp1p1ppp/2p2n2/4p3/1bB1P3/2N5/PPPP1PPP/R1BQK1NR w KQkq - +Ruy Lopez: classical defense, 4.c3 * +rnbqk2r/pp1p1ppp/2p2n2/4p3/1bB1P3/2N5/PPPPQPPP/R1B1K1NR b KQkq - +Ruy Lopez: classical defense, Boden variation * +rnbqk2r/pp1p1ppp/2p2n2/4p3/1bB1PP2/2N5/PPPP2PP/R1BQK1NR b KQkq - +Ruy Lopez: Cordel gambit * +rnbqk2r/pp1p1ppp/2p2n2/b3p3/4P3/P1NP4/1PP2PPP/R1BQKBNR w KQkq - +Ruy Lopez: modern Steinitz defense * +rnbqk2r/pp1p1ppp/2p2n2/b3p3/4P3/P1NP4/1PPB1PPP/R2QKBNR b KQkq - +Ruy Lopez: modern Steinitz defense * +rnbqk2r/pp1p1ppp/2p2n2/b3p3/4PP2/P1NP4/1PP3PP/R1BQKBNR b KQkq - +Ruy Lopez: modern Steinitz defense, siesta variation * +rnbqk2r/pp1p1ppp/4p3/2pP4/1bP1n3/2N2N2/PP2PPPP/R1BQKB1R w KQkq - +Nimzo-Indian: three knights, Euwe variation +rnbqk2r/pp1p1ppp/4pn2/2p5/1bPP4/2N1P3/PP2NPPP/R1BQKB1R b KQkq - +Nimzo-Indian: 4.e3 c5, 5.Ne2 (Rubinstein, anti-H\"ubner system) +rnbqk2r/pp1p1ppp/4pn2/2p5/1bPP4/2N1P3/PP3PPP/R1BQKBNR w KQkq - +Nimzo-Indian: 4.e3 c5 +rnbqk2r/pp1p1ppp/4pn2/2p5/1bPP4/2N5/PPQ1PPPP/R1B1KBNR w KQkq - +Nimzo-Indian: classical, 4...c5 +rnbqk2r/pp1p1ppp/4pn2/2p5/2PP4/P1P1P3/5PPP/R1BQKBNR b KQkq - +Nimzo-Indian: S\"amisch variation +rnbqk2r/pp1p1ppp/4pn2/2pP4/1bP5/2N2N2/PP2PPPP/R1BQKB1R b KQkq - +Nimzo-Indian: three knights, Korchnoi variation +rnbqk2r/pp1p1ppp/4pn2/4P3/1b1N4/2N5/PPP2PPP/R1BQKB1R b KQkq - +Sicilian: Pin, Koch variation +rnbqk2r/pp1p1ppp/4pn2/8/1b1NP3/2N5/PPP2PPP/R1BQKB1R w KQkq - +Sicilian: Pin variation (Sicilian counter-attack) +rnbqk2r/pp1p1ppp/5n2/2p1p3/2P5/3P4/PP1QPPPP/RN2KBNR w KQkq - +Sicilian: Canal-Sokolsky attack, Sokolsky variation * +rnbqk2r/pp1p1ppp/5n2/4p3/1b1NP3/2NB4/PPP2PPP/R1BQK2R w KQkq - +Sicilian: Pin, Jaffe variation +rnbqk2r/pp1p1ppp/5n2/b1p1p3/4P3/P1NP4/1PP2PPP/R1BQKBNR w KQkq - +Ruy Lopez: modern Steinitz defense, Duras (Keres) variation * +rnbqk2r/pp1pp1bp/2p3pn/5p2/3P4/5NP1/PPP1PPBP/RNBQ1RK1 w kq - +Dutch: Leningrad, Basman system +rnbqk2r/pp1pppbp/5np1/2P5/8/4PN2/PPP2PPP/RNBQKB1R b KQkq - +English: Neo-Catalan accepted * +rnbqk2r/pp1pppbp/5np1/2p5/1P6/P3PN2/2PP1PPP/RNBQKB1R b KQkq - +English: Romanishin gambit * +rnbqk2r/pp2npbp/6p1/3pp3/8/1N4P1/PPP1PPBP/RNBQK2R w KQkq - +Neo-Gr\"unfeld, 5.cd, main line * +rnbqk2r/pp2nppp/4p3/2ppP3/3P2Q1/P1P5/2P2PPP/R1B1KBNR b KQkq - +French: Winawer, advance, poisoned pawn variation +rnbqk2r/pp2nppp/4p3/2ppP3/3P4/P1P2N2/2P2PPP/R1BQKB1R b KQkq - +French: Winawer, advance, positional main line +rnbqk2r/pp2nppp/4p3/2ppP3/3P4/P1P5/2P2PPP/R1BQKBNR w KQkq - +French: Winawer, advance, 6...Ne7 +rnbqk2r/pp2nppp/4p3/2ppP3/P2P4/2P5/2P2PPP/R1BQKBNR b KQkq - +French: Winawer, advance, Smyslov variation +rnbqk2r/pp2ppbp/3p1np1/2p5/3PPP2/2N2N2/PPP3PP/R1BQKB1R w KQkq - +Pirc: Austrian attack, dragon formation +rnbqk2r/pp2ppbp/3p1np1/8/3NP3/2N1B3/PPP1BPPP/R2QK2R b KQkq - +Sicilian: dragon, classical attack +rnbqk2r/pp2ppbp/3p1np1/8/3NP3/2N1BP2/PPP3PP/R2QKB1R b KQkq - +Sicilian: dragon, Yugoslav attack +rnbqk2r/pp2ppbp/5np1/1Bpp4/8/1P2PN2/PBPP1PPP/RN1QK2R b KQkq - +Queen's Indian: Capablanca variation * +rnbqk2r/pp2ppbp/5np1/2Pp4/8/4PN2/PPP1BPPP/RNBQK2R b KQkq - +Catalan: open, classical line * +rnbqk2r/pp2ppbp/5np1/2Pp4/8/4PN2/PPP2PPP/RNBQKB1R w KQkq - +Catalan: open, 5.Nf3 * +rnbqk2r/pp2ppbp/5np1/2pp4/3P4/4PN2/PPP1BPPP/RNBQK2R w KQkq - +Catalan: closed, 5.Nf3 * +rnbqk2r/pp2ppbp/5np1/2pp4/3P4/5NP1/PPP1PPBP/RNBQK2R w KQkq - +Neo-Gr\"unfeld, 5.Nf3 * +rnbqk2r/pp2ppbp/5np1/2pp4/5P2/4PN2/PPPPB1PP/RNBQ1RK1 b kq - +Dutch defense * +rnbqk2r/pp2ppbp/5np1/2pp4/5P2/5NP1/PPPPP1BP/RNBQK2R w KQkq - +Dutch: Leningrad, main variation * +rnbqk2r/pp2ppbp/5np1/2pp4/8/1P2PN2/PBPPBPPP/RN1QK2R b KQkq - +Queen's Indian: 5.Bg2 Be7 * +rnbqk2r/pp2ppbp/6p1/2p4n/2PP4/1P3N2/PB1P1PPP/RN1QKB1R w KQkq - +Queen's Indian: Rubinstein variation * +rnbqk2r/pp2ppbp/6p1/2p5/2PP2n1/1P3N2/PB1P1PPP/RN1QKB1R w KQkq - +Queen's Indian: B\"urger variation * +rnbqk2r/pp3pbp/3p1np1/1BpP4/4PP2/2N5/PP4PP/R1BQK1NR b KQkq - +Benoni: Taimanov variation +rnbqk2r/pp3pbp/3p1np1/2pP2B1/4P3/2N2N2/PP3PPP/R2QKB1R b KQkq - +Benoni: classical, 8.Bg5 +rnbqk2r/pp3pbp/3p1np1/2pP4/4P3/2N2N2/PP2BPPP/R1BQK2R b KQkq - +Benoni: classical without 9.O-O +rnbqk2r/pp3pbp/3p1np1/2pPP3/5P2/2N5/PP4PP/R1BQKBNR b KQkq - +Benoni: Mikenas variation +rnbqk2r/pp3pp1/3ppn1p/2pP4/1bP4B/2N5/PP2PPPP/R2QKBNR w KQkq - +Nimzo-Indian: Leningrad, main line +rnbqk2r/pp3ppp/2p2n2/1BbP4/3p4/5N2/PPP1QPPP/RNB1K2R b KQkq - +Bishop's opening: Urusov gambit, Panov variation * +rnbqk2r/pp3ppp/2p2n2/2b1p3/4P3/1B1p4/PPPPQPPP/RNB1K1NR w KQkq - +Giuoco Piano: Eisinger variation * +rnbqk2r/pp3ppp/2p2n2/2bP4/2BPp3/2N2N2/PPP2PPP/R1BQK2R b KQkq d3 +Giuoco Piano * +rnbqk2r/pp3ppp/2p2n2/2bPN3/4p3/2N5/PPPPBPPP/R1BQK2R b KQkq - +Hungarian defense: Tartakower variation * +rnbqk2r/pp3ppp/2p2n2/2bpp3/2B1P3/2N2N2/PPPP1PPP/R1BQK2R w KQkq - +Giuoco Piano * +rnbqk2r/pp3ppp/2p2n2/2bpp3/4P3/1BN5/PPPPQPPP/R1B1K1NR b KQkq - +Giuoco Piano: center-holding variation * +rnbqk2r/pp3ppp/2p2n2/2bpp3/4P3/2PP4/PP1N1PPP/R1BQKBNR w KQkq - +Philidor: Hanham, Delmar variation * +rnbqk2r/pp3ppp/2p2n2/b2pp3/4P3/P1NP2P1/1PPB1P1P/R2QKBNR b KQkq - +Ruy Lopez: modern Steinitz defense, fianchetto (Bronstein) variation * +rnbqk2r/pp3ppp/2p2n2/b2pp3/4P3/P1NP4/1PPBNPPP/R2QKB1R b KQkq - +Ruy Lopez: modern Steinitz defense, Rubinstein variation * +rnbqk2r/pp3ppp/2pb1n2/3p4/2PPp3/1QN1P3/PP3PPP/R1B1KBNR w KQkq - +French: advance, Milner-Barry gambit * +rnbqk2r/pp3ppp/2pb4/4n3/3pP3/3P1N2/PPP1B1PP/RNBQK2R b KQkq - +Ponziani counter-gambit, Cordel variation * +rnbqk2r/pp3ppp/2pbpn2/3p4/2PP4/4PN2/PP3PPP/RNBQKB1R w KQkq - +Colle system * +rnbqk2r/pp3ppp/3p1n2/2p1p3/1b2P3/2NP1N2/PPP2PPP/R1BQKB1R w KQkq - +Ruy Lopez: Berlin defense, Duras variation * +rnbqk2r/pp3ppp/3p1n2/b1p1p3/4P3/P1NP1N2/1PP2PPP/R1BQKB1R w KQkq - +Ruy Lopez: Morphy defense, Duras variation * +rnbqk2r/pp3ppp/4p3/2Pn4/8/P1P2P2/4P1PP/R1BQKBNR b KQkq - +Nimzo-Indian: S\"amisch, Keres variation +rnbqk2r/pp3ppp/4pn2/2b3B1/3p4/P3P3/1PP2PPP/RN1QKBNR w KQkq - +QGA: Alekhine defense, Alatortsev variation * +rnbqk2r/pp3ppp/4pn2/2bp4/2P5/4PN2/PP3PPP/RNBQKB1R b KQkq - +QGA: classical variation * +rnbqk2r/pp3ppp/4pn2/2pP4/3P4/P1P2P2/4P1PP/R1BQKBNR b KQkq - +Nimzo-Indian: S\"amisch variation +rnbqk2r/pp3ppp/5n2/1B1pN3/1b1Pp3/2N5/PPP2PPP/R1BQK2R b KQkq - +Giuoco Piano: Anderssen variation * +rnbqk2r/pp3ppp/5n2/2bpp3/2B5/2N2N2/PPPP1PPP/R1BQK2R w KQkq - +Giuoco Piano * +rnbqk2r/pp3ppp/5n2/2bpp3/8/1BNP4/PPP2PPP/R1BQK1NR b KQkq - +Giuoco Piano: LaBourdonnais variation * +rnbqk2r/pp3ppp/5n2/2ppp3/1b2P3/2NP4/PPPB1PPP/R2QKBNR w KQkq - +Ruy Lopez: old Steinitz defense, semi-Duras variation * +rnbqk2r/pp4pp/2p2n2/2bPp3/2B2P2/8/PPP3PP/RNBQK1NR w KQkq - +KGD: classical, R\'eti variation * +rnbqk2r/pp4pp/4p3/2Pn1p2/8/P1P2P2/4P1PP/R1BQKBNR w KQkq - +Nimzo-Indian: S\"amisch, Romanovsky variation +rnbqk2r/ppn1bppp/8/2p1p3/8/2NP2PN/PP2PPBP/R1BQK2R b KQkq - +Sicilian: accelerated fianchetto, Simagin variation * +rnbqk2r/ppp1b1pp/3p1n2/3Pp3/4N3/2PB4/PP3PPP/RNBQK2R w KQkq - +Ponziani counter-gambit, Cordel variation +rnbqk2r/ppp1bppp/4p3/3p2B1/2PPn3/2N1P3/PP3PPP/R2QKBNR w KQkq - +QGD: Lasker variation +rnbqk2r/ppp1bppp/4p3/3pP1B1/3Pn3/2N5/PPP2PPP/R2QKBNR w KQkq - +French: classical, Tartakower variation +rnbqk2r/ppp1bppp/4p3/3pP3/3P2Q1/2N5/PPP2PPP/R3KBNR b KQkq - +French: classical, Anderssen-Richter variation +rnbqk2r/ppp1bppp/4pB2/3p4/3PP3/2N5/PPP2PPP/R2QKBNR b KQkq - +French: classical, Anderssen variation +rnbqk2r/ppp1bppp/4pn2/3p2B1/2PP4/2N5/PP2PPPP/R2QKBNR w KQkq - +QGD: 4.Bg5 Be7 +rnbqk2r/ppp1bppp/4pn2/3p2B1/3PP3/2N5/PPP2PPP/R2QKBNR w KQkq - +French: classical +rnbqk2r/ppp1bppp/4pn2/3p4/2P5/5NP1/PP1PPPBP/RNBQ1RK1 b kq - +English: Neo-Catalan declined +rnbqk2r/ppp1bppp/4pn2/3p4/2PP1B2/2N2N2/PP2PPPP/R2QKB1R b KQkq - +QGD: classical variation (5.Bf4) +rnbqk2r/ppp1bppp/4pn2/3p4/2PP4/5NP1/PP2PPBP/RNBQK2R b KQkq - +Catalan: closed, 5.Nf3 +rnbqk2r/ppp1bppp/4pn2/8/2pP4/5NP1/PP2PPBP/RNBQK2R w KQkq - +Catalan: open, classical line +rnbqk2r/ppp1bppp/5n2/3p2B1/3Np3/2PP4/PP2PPPP/RN1QKB1R b KQkq - +Alekhine's defense: modern, Flohr variation * +rnbqk2r/ppp1bppp/5n2/3pp3/4P3/2N2N2/PPPP1PPP/R1BQKB1R w KQkq - +Tayler opening * +rnbqk2r/ppp1bppp/8/3pP3/4n3/2N2N2/PPPP2PP/R1BQKB1R w KQkq - +Vienna gambit: Breyer variation +rnbqk2r/ppp1npbp/6p1/3pp3/8/3P1NP1/PPP1PPBP/RNBQ1RK1 w kq - +R\'eti: King's Indian attack, Pachman system +rnbqk2r/ppp1nppp/8/8/3PN3/8/PP3PPP/R2QKBNR w KQkq - +Bishop's opening: Lisitsyn variation * +rnbqk2r/ppp1ppbp/1n1p2p1/4P3/P2P4/1B3N2/1PP2PPP/RNBQK2R b KQkq - +Alekhine's defense: modern, Keres variation +rnbqk2r/ppp1ppbp/1n4p1/8/3PP3/6P1/PP2NPBP/RNBQK2R b KQkq - +Neo-Gr\"unfeld, 5.cd, main line +rnbqk2r/ppp1ppbp/3p1np1/6B1/2PP4/2N2N2/PP2PPPP/R2QKB1R b KQkq - +King's Indian: Smyslov system +rnbqk2r/ppp1ppbp/3p1np1/6B1/2PPP3/2N5/PP3PPP/R2QKBNR b KQkq - +King's Indian: accelerated Averbakh system +rnbqk2r/ppp1ppbp/3p1np1/8/2BPPP2/2N5/PPP3PP/R1BQK1NR b KQkq - +Pirc: Austrian attack, Ljubojevi\'c variation +rnbqk2r/ppp1ppbp/3p1np1/8/2PP4/2N2NP1/PP2PP1P/R1BQKB1R b KQkq - +King's Indian: fianchetto variation +rnbqk2r/ppp1ppbp/3p1np1/8/2PPP3/2N2N2/PP3PPP/R1BQKB1R b KQkq - +King's Indian: 5.Nf3 +rnbqk2r/ppp1ppbp/3p1np1/8/2PPP3/2N2P2/PP4PP/R1BQKBNR b KQkq - +King's Indian: S\"amisch variation +rnbqk2r/ppp1ppbp/3p1np1/8/2PPP3/2N3P1/PP3P1P/R1BQKBNR b KQkq - +King's Indian with e4 & g3 +rnbqk2r/ppp1ppbp/3p1np1/8/2PPP3/2N4P/PP3PP1/R1BQKBNR b KQkq - +King's Indian: Makagonov system (5.h3) +rnbqk2r/ppp1ppbp/3p1np1/8/2PPP3/2N5/PP2BPPP/R1BQK1NR b KQkq - +King's Indian: 5.Be2 +rnbqk2r/ppp1ppbp/3p1np1/8/2PPP3/2N5/PP2NPPP/R1BQKB1R b KQkq - +King's Indian: Kramer system +rnbqk2r/ppp1ppbp/3p1np1/8/2PPPP2/2N5/PP4PP/R1BQKBNR b KQkq - +King's Indian: Four pawns attack +rnbqk2r/ppp1ppbp/3p1np1/8/3PP1P1/2N5/PPP1BP1P/R1BQK1NR b KQkq - +Pirc: Chinese variation +rnbqk2r/ppp1ppbp/3p1np1/8/3PP2P/2N5/PPP1BPP1/R1BQK1NR b KQkq - +Pirc: bayonet (Mariotti) attack +rnbqk2r/ppp1ppbp/3p1np1/8/3PP3/2N2N1P/PPP2PP1/R1BQKB1R b KQkq - +Pirc: classical, h3 system +rnbqk2r/ppp1ppbp/3p1np1/8/3PP3/2N2N2/PPP1BPPP/R1BQK2R b KQkq - +Pirc: classical system, 5.Be2 +rnbqk2r/ppp1ppbp/3p1np1/8/3PP3/2N2N2/PPP2PPP/R1BQKB1R w KQkq - +Pirc: classical (two knights) system +rnbqk2r/ppp1ppbp/5np1/3p2B1/2PP4/2N2N2/PP2PPPP/R2QKB1R b KQkq - +Gr\"unfeld: 5.Bg5 +rnbqk2r/ppp1ppbp/5np1/3p4/2P5/1P3N2/PB1PPPPP/RN1QKB1R b KQkq - +Queen's Indian: Marienbad system * +rnbqk2r/ppp1ppbp/5np1/3p4/2PP1B2/2N2N2/PP2PPPP/R2QKB1R b KQkq - +Gr\"unfeld: 5.Bf4 +rnbqk2r/ppp1ppbp/5np1/3p4/2PP4/1QN2N2/PP2PPPP/R1B1KB1R b KQkq - +Gr\"unfeld: Russian variation +rnbqk2r/ppp1ppbp/5np1/3p4/2PP4/2N1PN2/PP3PPP/R1BQKB1R b KQkq - +Gr\"unfeld: 5.e3 +rnbqk2r/ppp1ppbp/5np1/3p4/2PP4/2N2N2/PP2PPPP/R1BQKB1R w KQkq - +Gr\"unfeld: Three knights variation +rnbqk2r/ppp1ppbp/5np1/3p4/2PP4/5NP1/PP2PPBP/RNBQK2R b KQkq - +Neo-Gr\"unfeld, 5.Nf3 +rnbqk2r/ppp1ppbp/5np1/3p4/2PP4/6P1/PP2PPBP/RNBQK1NR w KQkq - +King's Indian: 3.g3, counterthrust variation +rnbqk2r/ppp1ppbp/5np1/3p4/Q1PP4/2N2N2/PP2PPPP/R1B1KB1R b KQkq - +Gr\"unfeld: Flohr variation +rnbqk2r/ppp1ppbp/6p1/3n4/3P4/6P1/PP2PPBP/RNBQK1NR w KQkq - +Neo-Gr\"unfeld, 5.cd +rnbqk2r/ppp1ppbp/6p1/8/2BPP3/2P5/P4PPP/R1BQK1NR b KQkq - +Gr\"unfeld: exchange, classical variation +rnbqk2r/ppp1ppbp/6p1/8/3PP3/2P2N2/P4PPP/R1BQKB1R b KQkq - +Gr\"unfeld: modern exchange variation +rnbqk2r/ppp1ppbp/6pn/3p4/5P2/4PN2/PPPP2PP/RNBQKB1R w KQkq - +Dutch defense, Blackburne variation * +rnbqk2r/ppp1ppbp/6pn/3p4/5P2/6P1/PPPPP1BP/RNBQK1NR w KQkq - +Dutch: Leningrad, Karlsbad variation * +rnbqk2r/ppp2p1p/3b1n2/3PN3/2B2ppP/8/PPPP2P1/RNBQ1RK1 b kq - +KGA: Kieseritsky, Rice gambit +rnbqk2r/ppp2p2/4p1pp/3pP3/3Pn1Q1/2P5/P1PB1PPP/R3KBNR w KQkq - +French: MacCutcheon, Lasker variation, 8...g6 +rnbqk2r/ppp2pbp/6p1/3np3/8/2N2NP1/PP1PPPBP/R1BQK2R w KQkq - +English: Anglo-Gr\"unfeld defense, Korchnoi variation +rnbqk2r/ppp2pp1/4pP1p/3p2B1/1b1P4/2N5/PPP2PPP/R2QKBNR b KQkq - +French: MacCutcheon, Chigorin variation +rnbqk2r/ppp2pp1/4pn1p/3pP3/1b1P3B/2N5/PPP2PPP/R2QKBNR b KQkq - +French: MacCutcheon, Bernstein variation +rnbqk2r/ppp2pp1/4pn1p/3pP3/1b1P4/2N1B3/PPP2PPP/R2QKBNR b KQkq - +French: MacCutcheon, Janowski variation +rnbqk2r/ppp2pp1/4pn1p/3pP3/1b1P4/2N5/PPP2PPP/R1BQKBNR b KQkq - +French: MacCutcheon, Dr. Olland (Dutch) variation +rnbqk2r/ppp2pp1/4pn1p/3pP3/3P4/2b5/PPPB1PPP/R2QKBNR w KQkq - +French: MacCutcheon, Lasker variation +rnbqk2r/ppp2ppp/3b1n2/3pN3/3P4/3B4/PPP2PPP/RNBQK2R b KQkq - +Petrov: classical attack, Marshall variation * +rnbqk2r/ppp2ppp/3b3n/8/3P4/5N2/PPP1P1PP/RNBQKB1R b KQkq - +Bird: From gambit, Lipke variation +rnbqk2r/ppp2ppp/3b4/3np3/2B5/P3P3/1P1P1PPP/RNBQK1NR b KQkq - +Sicilian: Kan, Polugaievsky variation * +rnbqk2r/ppp2ppp/3b4/3np3/8/P3P1P1/1P1P1P1P/RNBQKBNR b KQkq - +Sicilian: Kan, Swiss cheese variation * +rnbqk2r/ppp2ppp/3b4/3np3/8/P3P3/1P1P1PPP/RNBQKBNR w KQkq - +Sicilian: Kan, 5.Bd3 * +rnbqk2r/ppp2ppp/3b4/3p4/3Pn3/3B1N2/PPP2PPP/RNBQK2R w KQkq - +Petrov: classical attack, Marshall variation +rnbqk2r/ppp2ppp/3bpn2/3p4/3P4/4PN2/PPP2PPP/RNBQKB1R w KQkq - +Queen's pawn game * +rnbqk2r/ppp2ppp/3p1n2/2b1p3/2B1P3/2N2N2/PPPP1PPP/R1BQK2R b KQkq - +Giuoco Pianissimo * +rnbqk2r/ppp2ppp/3p1n2/2b1p3/2B1P3/2N5/PPPP1PPP/R1BQK1NR w KQkq - +Giuoco Pianissimo * +rnbqk2r/ppp2ppp/3p1n2/2b1p3/4P3/2N2N2/PPPP1PPP/R1BQKB1R w KQkq - +Two knights defense (Modern bishop's opening) * +rnbqk2r/ppp2ppp/3p1n2/4p3/1b2P3/5N2/PPPPNPPP/R1BQKB1R b KQkq - +Ruy Lopez: Berlin defense, Mortimer variation * +rnbqk2r/ppp2ppp/3p1n2/4p3/4P3/2bP1N2/PPP2PPP/R1BQKB1R w KQkq - +Ruy Lopez: Berlin defense, Anderssen variation * +rnbqk2r/ppp2ppp/3p1n2/b3p3/4P3/P1N2N2/1PPP1PPP/R1BQKB1R w KQkq - +Ruy Lopez: Anderssen variation * +rnbqk2r/ppp2ppp/3p4/2b1pP2/2B1P1n1/2N5/PPPP2PP/R1BQK1NR b KQkq - +Giuoco Pianissimo: Dubois variation * +rnbqk2r/ppp2ppp/3p4/2b5/N2pP1n1/5N2/PPP2PPP/R1BQKB1R w KQkq - +two knights defense: Kieseritsky variation * +rnbqk2r/ppp2ppp/3p4/4p3/1b2n3/2P2N2/PP1PNPPP/R1BQKB1R b KQkq - +Ruy Lopez: Berlin defense, Mortimer trap * +rnbqk2r/ppp2ppp/4p3/3p4/2PPn3/P1Q5/1P2PPPP/R1B1KBNR w KQkq - +Nimzo-Indian: classical, Noa variation, main line +rnbqk2r/ppp2ppp/4p3/3p4/2PPn3/P7/1PQ1PPPP/R1B1KBNR b KQkq - +Nimzo-Indian: classical, Noa variation, main line, 7.Qc2 +rnbqk2r/ppp2ppp/4pn2/3p2B1/1b1PP3/2N5/PPP2PPP/R2QKBNR w KQkq - +French: MacCutcheon variation +rnbqk2r/ppp2ppp/4pn2/3p2B1/1bPP4/5N2/PP2PPPP/RN1QKB1R w KQkq - +QGD: Vienna variation +rnbqk2r/ppp2ppp/4pn2/3p4/1bPP4/2N2N2/PP2PPPP/R1BQKB1R w KQkq - +QGD: Ragozin variation +rnbqk2r/ppp2ppp/4pn2/3p4/1bPP4/2N5/PPQ1PPPP/R1B1KBNR w KQkq - +Nimzo-Indian: classical, Noa variation +rnbqk2r/ppp2ppp/4pn2/3p4/1bPP4/P1N5/1PQ1PPPP/R1B1KBNR b KQkq - +Nimzo-Indian: classical, Noa variation, 5.a3 +rnbqk2r/ppp2ppp/4pn2/3pP1B1/1b1P4/2N5/PPP2PPP/R2QKBNR b KQkq - +French: MacCutcheon, advance variation +rnbqk2r/ppp2ppp/4pn2/6B1/1bpP4/2N2N2/PP2PPPP/R2QKB1R w KQkq - +QGD: Ragozin, Vienna variation +rnbqk2r/ppp2ppp/5n2/1BbPp3/8/2N5/PPPP1PPP/R1BQK1NR b KQkq - +Scotch gambit * +rnbqk2r/ppp2ppp/5n2/2bPp3/1PP5/8/P2P1PPP/RNBQKBNR b KQkq - +Center game, Kieseritsky variation * +rnbqk2r/ppp2ppp/5n2/2bPp3/8/2N2N2/PPPP1PPP/R1BQKB1R b KQkq - +Scotch gambit: Dubois-R\'eti defense * +rnbqk2r/ppp2ppp/5n2/2bPp3/8/2N5/PPPP1PPP/R1BQKBNR w KQkq - +Scotch gambit * +rnbqk2r/ppp2ppp/5n2/2bPp3/8/2N5/PPPPBPPP/R1BQK1NR b KQkq - +Scotch gambit: Benima defense * +rnbqk2r/ppp2ppp/5n2/2bPp3/8/5N2/PPPP1PPP/RNBQKB1R w KQkq - +Bishop's opening/Petrov: Urusov gambit * +rnbqk2r/ppp2ppp/5n2/2bpp3/4P3/2N2N2/PPPP1PPP/R1BQKB1R w KQkq - +Two knights defense * +rnbqk2r/ppp2ppp/5n2/2bpp3/4P3/3P1N2/PPP2PPP/RNBQKB1R w KQkq - +Philidor: Nimzovich, Klein variation * +rnbqk2r/ppp2ppp/5n2/3P4/1b3P2/2NPp3/PPPB2PP/R2QKBNR w KQkq - +KGD: Falkbeer, Morphy gambit +rnbqk2r/ppp2ppp/5n2/3Pp3/1b6/2N5/PPPP1PPP/R1BQKBNR w KQkq - +Scotch: Relfsson gambit (`MacLopez') * +rnbqk2r/ppp2ppp/5n2/3p4/1b1P4/2N5/PPQ1PPPP/R1B1KBNR w KQkq - +Nimzo-Indian: classical, Noa variation, 5.cd ed +rnbqk2r/ppp2ppp/5n2/3pp3/4P3/P1PP1P2/2P3PP/R1BQKBNR b KQkq - +Ruy Lopez: modern Steinitz defense, Alapin variation * +rnbqk2r/ppp2ppp/5n2/3pp3/4P3/P1PP4/2P2PPP/R1BQKBNR w KQkq - +Ruy Lopez: modern Steinitz defense, Richter variation * +rnbqk2r/ppp2ppp/8/1Bbp4/3NP1n1/2N5/PPP2PPP/R1BQK2R b KQkq - +two knights defense: Pincus variation * +rnbqk2r/ppp2ppp/8/2bPp3/2B3n1/2N5/PPPP1PPP/R1BQK1NR w KQkq - +Scotch gambit * +rnbqk2r/ppp2ppp/8/2bPp3/5P2/3P3N/PPP3Pn/RNBQKB1R w KQkq - +Philidor: L\'opez counter-gambit, Jaenisch variation * +rnbqk2r/ppp2ppp/8/2bPp3/6n1/2N2N2/PPPP1PPP/R1BQKB1R w KQkq - +Two knights defense, Perreux variation * +rnbqk2r/ppp2ppp/8/2bp4/3NP1n1/2N5/PPP2PPP/R1BQKB1R w KQkq - +two knights defense: Lolli attack * +rnbqk2r/ppp2ppp/8/2bpp3/4P1n1/2PP4/PP1N1PPP/R1BQKBNR w KQkq - +Philidor: Hanham, Kmoch variation * +rnbqk2r/ppp3p1/8/2bppPPp/4nP2/8/PPPPQ2P/RNB1KBNR w KQkq - +KGA: Kieseritsky, Salvio defense, Cozio variation * +rnbqk2r/ppp3p1/8/3ppPPp/3b4/7P/PPP3K1/RNBQ1BNR w kq - +KGA: Allgaier, Urusov attack * +rnbqk2r/ppp3pp/5n2/2bppPP1/8/8/PPPP1P1P/RNBQKBNR w KQkq - +KGA: Ghulam Kassim gambit * +rnbqk2r/ppp3pp/5p2/3np3/1b2P3/3P1N2/PP3PPP/RNBQKB1R w KQkq - +Sicilian: Prins variation, Venice attack * +rnbqk2r/pppn1pp1/4p2p/3pP3/1b1P4/2N5/PPPB1PPP/R2QKBNR w KQkq - +French: MacCutcheon, Tartakower variation +rnbqk2r/pppnb1pp/4pp2/3pP1B1/3P3P/2N5/PPP2PP1/R2QKBNR w KQkq - +French: Albin-Alekhine-Ch\^atard attack, Teichmann variation +rnbqk2r/pppnbppp/4p3/3pP1B1/3P3P/2N5/PPP2PP1/R2QKBNR b KQkq - +French: Albin-Alekhine-Ch\^atard attack +rnbqk2r/pppp1ppp/1b3n2/4p3/1PB1P3/P1N5/2PP1PPP/R1BQK1NR b KQkq - +Ruy Lopez: Graz variation * +rnbqk2r/pppp1ppp/1b3n2/4p3/NP2P3/P7/2PP1PPP/R1BQKBNR b KQkq - +Ruy Lopez: Taimanov (chase/wing/accelerated counterthrust) variation * +rnbqk2r/pppp1ppp/4pn2/6B1/1bPP4/2N5/PP2PPPP/R2QKBNR b KQkq - +Nimzo-Indian: Leningrad variation +rnbqk2r/pppp1ppp/4pn2/8/1bP5/2N2N2/PP1PPPPP/R1BQKB1R w KQkq - +English: Nimzo-English opening +rnbqk2r/pppp1ppp/4pn2/8/1bPP4/1QN5/PP2PPPP/R1B1KBNR b KQkq - +Nimzo-Indian: Spielmann variation +rnbqk2r/pppp1ppp/4pn2/8/1bPP4/2N1P3/PP3PPP/R1BQKBNR b KQkq - +Nimzo-Indian: 4.e3 +rnbqk2r/pppp1ppp/4pn2/8/1bPP4/2N2N2/PP2PPPP/R1BQKB1R b KQkq - +Nimzo-Indian: three knights variation +rnbqk2r/pppp1ppp/4pn2/8/1bPP4/2N2P2/PP2P1PP/R1BQKBNR b KQkq - +Nimzo-Indian: Kmoch variation +rnbqk2r/pppp1ppp/4pn2/8/1bPP4/2N3P1/PP2PP1P/R1BQKBNR b KQkq - +Nimzo-Indian: Romanishin-Kasparov (Steiner) system +rnbqk2r/pppp1ppp/4pn2/8/1bPP4/2N5/PP2PPPP/R1BQKBNR w KQkq - +Nimzo-Indian defense +rnbqk2r/pppp1ppp/4pn2/8/1bPP4/2N5/PPQ1PPPP/R1B1KBNR b KQkq - +Nimzo-Indian: classical variation +rnbqk2r/pppp1ppp/4pn2/8/1bPP4/2NQ4/PP2PPPP/R1B1KBNR b KQkq - +Nimzo-Indian: Mikenas attack +rnbqk2r/pppp1ppp/4pn2/8/1bPP4/5N2/PP1NPPPP/R1BQKB1R b KQkq - +Bogo-Indian defense, Gr\"unfeld variation +rnbqk2r/pppp1ppp/4pn2/8/1bPP4/5N2/PP2PPPP/RNBQKB1R w KQkq - +Bogo-Indian defense +rnbqk2r/pppp1ppp/4pn2/8/2PP4/P1P5/4PPPP/R1BQKBNR b KQkq - +Nimzo-Indian: S\"amisch variation +rnbqk2r/pppp1ppp/5n2/1B2p3/1b2P3/2N5/PPPP1PPP/R1BQK1NR b KQkq - +Ruy Lopez: Alapin's defense * +rnbqk2r/pppp1ppp/5n2/2b1p3/2B1P3/2N5/PPPP1PPP/R1BQK1NR b KQkq - +Giuoco Piano * +rnbqk2r/pppp1ppp/5n2/2b1p3/4P3/2N2N2/PPPP1PPP/R1BQKB1R b KQkq - +Two knights defense * +rnbqk2r/pppp1ppp/5n2/2b1p3/4P3/2N5/PPPP1PPP/R1BQKBNR w KQkq - +King's pawn game * +rnbqk2r/pppp1ppp/5n2/2b1p3/4P3/2N5/PPPPBPPP/R1BQK1NR b KQkq - +Hungarian defense * +rnbqk2r/pppp1ppp/5n2/2b1p3/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - +Petrov: Italian variation * +rnbqk2r/pppp1ppp/5n2/2b1p3/4PP2/2N5/PPPP2PP/R1BQKBNR b KQkq - +Rousseau gambit * +rnbqk2r/pppp1ppp/5n2/2b1p3/4PP2/3P4/PPP3PP/RNBQKBNR b KQkq - +Philidor: L\'opez counter-gambit * +rnbqk2r/pppp1ppp/5n2/2b1p3/4PP2/8/PPPP2PP/RNBQKBNR w KQkq - +Latvian gambit, 3.Bc4 * +rnbqk2r/pppp1ppp/5n2/3Np3/1b2P3/8/PPPP1PPP/R1BQKBNR b KQkq - +Ruy Lopez: Bird's defense * +rnbqk2r/pppp1ppp/5n2/4P3/1bB2p2/2N5/PPPP2PP/R1BQK1NR b KQkq - +KGA: bishop's gambit, Paulsen attack +rnbqk2r/pppp1ppp/5n2/4p3/1b2P1P1/2N5/PPPP1P1P/R1BQKBNR b KQkq - +Ruy Lopez: Brentano defense * +rnbqk2r/pppp1ppp/5n2/4p3/1b2P1Q1/2N5/PPPP1PPP/R1B1KBNR w KQkq - +Vienna: Zhuravlev countergambit +rnbqk2r/pppp1ppp/5n2/4p3/1b2P3/2N2N2/PPPP1PPP/R1BQKB1R b KQkq - +Ruy Lopez: Berlin defense * +rnbqk2r/pppp1ppp/5n2/4p3/1b2P3/2N2P2/PPPP2PP/R1BQKBNR b KQkq - +Ruy Lopez: Nuremberg variation * +rnbqk2r/pppp1ppp/5n2/4p3/1b2P3/2N3P1/PPPP1P1P/R1BQKBNR b KQkq - +Ruy Lopez: fianchetto (Smyslov/Barnes) defense * +rnbqk2r/pppp1ppp/5n2/4p3/1b2P3/2N5/PPPP1PPP/R1BQKBNR w KQkq - +Ruy Lopez (Spanish opening) * +rnbqk2r/pppp1ppp/5n2/4p3/1b2P3/2N5/PPPPBPPP/R1BQK1NR b KQkq - +Ruy Lopez: Lucena defense * +rnbqk2r/pppp1ppp/5n2/4p3/1b2P3/2N5/PPPPNPPP/R1BQKB1R b KQkq - +Ruy Lopez: Cozio defense * +rnbqk2r/pppp1ppp/5n2/4p3/1b2P3/2N5/PPPPQPPP/R1B1KBNR b KQkq - +Ruy Lopez: Vinogradov variation * +rnbqk2r/pppp1ppp/5n2/4p3/1b2P3/2NP4/PPP2PPP/R1BQKBNR b KQkq - +Ruy Lopez: old Steinitz defense * +rnbqk2r/pppp1ppp/5n2/4p3/1b2PP2/2N5/PPPP2PP/R1BQKBNR b KQkq - +Ruy Lopez: Schliemann defense * +rnbqk2r/pppp1ppp/5n2/4p3/1bB1P3/2N5/PPPP1PPP/R1BQK1NR b KQkq - +Ruy Lopez: classical (Cordel) defense * +rnbqk2r/pppp1ppp/5n2/4p3/1bP5/2N3P1/PP1PPP1P/R1BQKBNR b KQkq - +Sicilian: Nimzovich-Rossolimo attack (with ...g6, without ...d6) * +rnbqk2r/pppp1ppp/5n2/4p3/1bP5/2N3P1/PP1PPP1P/R1BQKBNR w KQkq - +English: Bremen, Smyslov system +rnbqk2r/pppp1ppp/5n2/4p3/1bP5/2N5/PP1PPPPP/R1BQKBNR w KQkq - +Sicilian: Nimzovich-Rossolimo attack (without ...d6) * +rnbqk2r/pppp1ppp/5n2/4p3/1bP5/3P4/PP1BPPPP/RN1QKBNR b KQkq - +Sicilian: Canal-Sokolsky attack, 3...Bd7 * +rnbqk2r/pppp1ppp/5n2/4p3/1bP5/3P4/PP2PPPP/RNBQKBNR w KQkq - +Sicilian: Canal-Sokolsky (Nimzovich-Rossolimo, Moscow) attack * +rnbqk2r/pppp1ppp/5n2/4p3/2B1P3/2N5/PPPP1bPP/R1BQK1NR w KQkq - +Giuoco Piano: Jerome gambit * +rnbqk2r/pppp1ppp/5n2/4p3/4P3/P1PP4/2P2PPP/R1BQKBNR b KQkq - +Ruy Lopez: modern Steinitz defense, exchange variation * +rnbqk2r/pppp1ppp/5n2/4p3/4P3/P1b2N2/1PPP1PPP/R1BQKB1R w KQkq - +Ruy Lopez: Treybal (Bayreuth) variation (exchange var. deferred) * +rnbqk2r/pppp1ppp/5n2/4p3/4P3/P1b5/1PPP1PPP/R1BQKBNR w KQkq - +Ruy Lopez: exchange variation * +rnbqk2r/pppp1ppp/5n2/4p3/Nb2P3/8/PPPP1PPP/R1BQKBNR b KQkq - +Ruy Lopez: Pollock defense * +rnbqk2r/pppp1ppp/5n2/b2Np3/4P3/P7/1PPP1PPP/R1BQKBNR b KQkq - +Ruy Lopez: Bird's defense deferred * +rnbqk2r/pppp1ppp/5n2/b3p3/1P2P3/P1N5/2PP1PPP/R1BQKBNR b KQkq - +Ruy Lopez: Caro variation * +rnbqk2r/pppp1ppp/5n2/b3p3/2B1P3/P1N5/1PPP1PPP/R1BQK1NR b KQkq - +Ruy Lopez: Classical defense deferred * +rnbqk2r/pppp1ppp/5n2/b3p3/4P3/P1N2N2/1PPP1PPP/R1BQKB1R b KQkq - +Ruy Lopez: Morphy defense * +rnbqk2r/pppp1ppp/5n2/b3p3/4P3/P1N3P1/1PPP1P1P/R1BQKBNR b KQkq - +Ruy Lopez: fianchetto defense deferred * +rnbqk2r/pppp1ppp/5n2/b3p3/4P3/P1N5/1PPP1PPP/R1BQKBNR w KQkq - +Ruy Lopez * +rnbqk2r/pppp1ppp/5n2/b3p3/4P3/P1N5/1PPPNPPP/R1BQKB1R b KQkq - +Ruy Lopez: Cozio defense deferred * +rnbqk2r/pppp1ppp/5n2/b3p3/4P3/P1NP4/1PP2PPP/R1BQKBNR b KQkq - +Ruy Lopez: modern Steinitz defense * +rnbqk2r/pppp1ppp/5n2/b3p3/4PP2/P1N5/1PPP2PP/R1BQKBNR b KQkq - +Ruy Lopez: Schliemann defense deferred * +rnbqk2r/pppp1ppp/5n2/bB2p3/4P3/P1N5/1PPP1PPP/R1BQK1NR b KQkq - +Ruy Lopez: Alapin's defense deferred * +rnbqk2r/pppp1ppp/8/2b1P3/3Pn3/8/PPP3PP/RNBQKBNR b KQkq - +Latvian: Polerio variation * +rnbqk2r/pppp1ppp/8/2b1P3/4n3/5N2/PPPP2PP/RNBQKB1R b KQkq - +Latvian: corkscrew counter-gambit * +rnbqk2r/pppp1ppp/8/2b1p3/2B1P1n1/2N2N2/PPPP1PPP/R1BQK2R b KQkq - +two knights defense: Wilkes Barre (Traxler) variation * +rnbqk2r/pppp1ppp/8/2b1p3/4P1n1/2N2N2/PPPP1PPP/R1BQKB1R w KQkq - +Two knights defense * +rnbqk2r/pppp1ppp/8/2b5/1P1pP1n1/2N2N2/P1P2PPP/R1BQKB1R b KQkq - +two knights defense: Ulvestad variation * +rnbqk2r/pppp1ppp/8/2b5/3NP3/2N5/PPP2nPP/R1BQKB1R w KQkq - +two knights defense: Fegatello attack * +rnbqk2r/pppp1ppp/8/2b5/N2pP1n1/5N2/PPP2PPP/R1BQKB1R b KQkq - +two knights defense * +rnbqk2r/pppp1ppp/8/2bN4/3pP1n1/5N2/PPP2PPP/R1BQKB1R b KQkq - +two knights defense: Fritz variation * +rnbqk2r/pppp1ppp/8/8/Nb1pP1n1/5N2/PPP2PPP/R1BQKB1R w KQkq - +Two knights defense * +rnbqk2r/pppp2p1/5n2/2b1pP1p/6P1/8/PPPP1PBP/RNBQK1NR w KQkq - +KGA: Philidor gambit * +rnbqk2r/pppp2p1/8/2b1pPPp/4n3/5N2/PPPP1P1P/RNBQKB1R w KQkq - +KGA: Kieseritsky, Berlin defense, 6.Bc4 * +rnbqk2r/pppp2p1/8/2b1pPPp/8/7P/PPPP1K2/RNBQ1BNR w kq - +KGA: Allgaier, Walker attack * +rnbqk2r/pppp2pp/4pn2/5p2/1bPP4/6P1/PP2PPBP/RNBQK1NR w KQkq - +Dutch defense: Dutch-Indian (Nimzo-Dutch) variation +rnbqk2r/pppp2pp/5n2/2b1pP2/6P1/2N5/PPPP1P1P/R1BQKBNR b KQkq - +KGA: Blachly gambit * +rnbqk2r/pppp2pp/5n2/2b1pP2/6P1/8/PPPP1P1P/RNBQKBNR w KQkq - +KGA: King's knight's gambit * +rnbqk2r/pppp2pp/5n2/2b1pP2/6P1/8/PPPP1PBP/RNBQK1NR b KQkq - +King's knight's gambit * +rnbqk2r/pppp2pp/5n2/2b1pP2/8/5N2/PPPPBPPP/RNBQK2R b KQkq - +KGA: Cunningham, Euwe defense * +rnbqk2r/pppp2pp/5n2/2b2P2/3N4/2P5/P4PPP/RNBQKB1R b KQkq - +KGA: Abbazia defense, Botvinnik variation * +rnbqk2r/pppp2pp/5n2/4pPP1/8/8/PPPP1b1P/RNBQKBNR w KQkq - +KGA: Lolli gambit (wild Muzio gambit) * +rnbqk2r/pppp2pp/8/2b1pPP1/4n3/8/PPPP1P1P/RNBQKBNR w KQkq - +KGA: Salvio gambit * +rnbqk2r/pppp3p/5np1/2b1pP1B/8/8/PPPP1PPP/RNBQK1NR w KQkq - +KGA: Cunningham, Bertin gambit * +rnbqk2r/ppppb1pp/4pn2/5p2/2PP4/6P1/PP1BPPBP/RN1QK1NR w KQkq - +Dutch-Indian, Alekhine variation +rnbqk2r/ppppb1pp/4pn2/5p2/2PP4/6P1/PP2PPBP/RNBQK1NR w KQkq - +Dutch defense +rnbqk2r/ppppbppp/3n4/4p2Q/8/1BN5/PPPP1PPP/R1B1K1NR w KQkq - +Vienna game +rnbqk2r/ppppbppp/5n2/4p3/4P3/2N5/PPPP1PPP/R1BQKBNR w KQkq - +Inverted Hungarian * +rnbqk2r/ppppbppp/5n2/8/2B1Pp2/5N2/PPPP2PP/RNBQK2R w KQkq - +KGA: Cunningham, Euwe defense +rnbqk2r/ppppbppp/7n/8/N3P3/2P2N1P/P4PP1/R1BQKB1R w KQkq - +two knights defense: Steinitz variation * +rnbqk2r/ppppbppp/8/4P3/N3n3/2P2N1P/P1Q2PP1/R1B1KB1R b KQkq - +two knights defense: G\"oring variation * +rnbqk2r/ppppbppp/8/8/N3P1n1/2P2N1P/P4PP1/R1BQKB1R b KQkq - +Two knights defense * +rnbqk2r/ppppbppp/8/8/N3P1n1/2P2N2/P4PPP/R1BQKB1R w KQkq - +Two knights defense * +rnbqk2r/ppppp1bp/5np1/5p2/2PP4/5NP1/PP2PPBP/RNBQK2R b KQkq - +Dutch: Leningrad, main variation +rnbqk2r/ppppp2p/6pb/5P2/3P4/8/PPP2PPP/RN1QKBNR b KQkq - +Amar gambit * +rnbqk2r/ppppppbp/5np1/6B1/3P4/8/PPPNPPPP/R2QKBNR b KQkq - +R\'eti: King's Indian attack, Keres variation * +rnbqk2r/ppppppbp/5np1/8/2PP4/8/PP2PPPP/RNBQKBNR w KQkq - +R\'eti: King's Indian attack * +rnbqk2r/ppppppbp/5np1/8/2PPP3/2N5/PP3PPP/R1BQKBNR b KQkq - +King's Indian: 4.e4 +rnbqkb1r/1p2pppp/p2p1n2/6B1/3NP3/2N5/PPP2PPP/R2QKB1R b KQkq - +Sicilian: Najdorf, 6.Bg5 +rnbqkb1r/1p2pppp/p2p1n2/8/2BNP3/2N5/PPP2PPP/R1BQK2R b KQkq - +Sicilian: Najdorf, Lipnitzky attack +rnbqkb1r/1p2pppp/p2p1n2/8/3NP3/2N1B3/PPP2PPP/R2QKB1R b KQkq - +Sicilian: Najdorf, Byrne (English) attack +rnbqkb1r/1p2pppp/p2p1n2/8/3NP3/2N3P1/PPP2P1P/R1BQKB1R b KQkq - +Sicilian: Najdorf, Zagreb (fianchetto) variation +rnbqkb1r/1p2pppp/p2p1n2/8/3NP3/2N4P/PPP2PP1/R1BQKB1R b KQkq - +Sicilian: Najdorf, Adams attack +rnbqkb1r/1p2pppp/p2p1n2/8/3NP3/2N5/PPP1BPPP/R1BQK2R b KQkq - +Sicilian: Najdorf, Opo\v censky variation +rnbqkb1r/1p2pppp/p2p1n2/8/3NP3/2N5/PPP2PPP/R1BQKB1R w KQkq - +Sicilian: Najdorf +rnbqkb1r/1p2pppp/p2p1n2/8/3NPP2/2N5/PPP3PP/R1BQKB1R b KQkq - +Sicilian: Najdorf, 6.f4 +rnbqkb1r/1p2pppp/p4n2/2pp4/8/1P2PN2/P1PP1PPP/RNBQKB1R w KQkq - +Queen's Indian: Petrosian system * +rnbqkb1r/1p3p1p/p2ppnp1/8/2PNP3/3B4/PP3PPP/RNBQ1RK1 w kq - +Sicilian: Kan, Gipslis variation +rnbqkb1r/1p3ppp/p1p1pn2/3p4/2PP4/2N1PN2/PP3PPP/R1BQKB1R w KQkq - +QGD semi-Slav: accelerated Meran (Alekhine variation) +rnbqkb1r/1p3ppp/p2ppn2/6B1/3NP3/2N5/PPP2PPP/R2QKB1R w KQkq - +Sicilian: Najdorf, 6...e6 +rnbqkb1r/1p3ppp/p2ppn2/6B1/3NPP2/2N5/PPP3PP/R2QKB1R b KQkq - +Sicilian: Najdorf, 7.f4 +rnbqkb1r/1p3ppp/p2ppn2/8/3NP3/2N1B3/PPPQ1PPP/R3KB1R b KQkq - +Sicilian: Scheveningen, English variation +rnbqkb1r/1p3ppp/p2ppn2/8/3NP3/2N5/PPP1BPPP/R1BQK2R w KQkq - +Sicilian: Scheveningen (Paulsen), classical variation +rnbqkb1r/1p3ppp/p3pn2/2p5/2BP4/4PN2/PP2QPPP/RNB2RK1 b kq - +QGA: classical, 7.Qe2 +rnbqkb1r/1p3ppp/p3pn2/2p5/2BP4/4PN2/PP3PPP/RNBQ1RK1 w kq - +QGA: classical, 6...a6 +rnbqkb1r/1p3ppp/p3pn2/2p5/2BPP3/5N2/PP3PPP/RNBQ1RK1 b kq - +QGA: classical, Geller variation +rnbqkb1r/1p3ppp/p3pn2/2p5/P1BP4/4PN2/1P3PPP/RNBQ1RK1 b kq - +QGA: classical, Rubinstein variation +rnbqkb1r/1p3ppp/p4n2/1N1pp1B1/Q1P5/2N5/PP2PPPP/R3KB1R b KQkq - +QGD: Semi-Tarrasch, Krause variation +rnbqkb1r/1pp1pppp/p4n2/8/2pPP3/2N2N2/PP3PPP/R1BQKB1R b KQkq - +QGA, Bogolyubov variation +rnbqkb1r/1ppp1ppp/p3pn2/8/2PP4/5N2/PP2PPPP/RNBQKB1R w KQkq - +Dzindzikhashvili defense +rnbqkb1r/2pp1ppp/p3pn2/1p6/2P5/5NP1/PP1PPPBP/RNBQK2R w KQkq - +English: Romanishin gambit +rnbqkb1r/3ppppp/P4n2/2pP4/8/8/PP2PPPP/RNBQKBNR b KQkq - +Benk\"o gambit accepted +rnbqkb1r/3ppppp/p4n2/1PpP4/8/2N5/PP2PPPP/R1BQKBNR b KQkq - +Benk\"o gambit: Zaitsev system +rnbqkb1r/3ppppp/p4n2/1PpP4/8/8/PP2PPPP/RNBQKBNR w KQkq - +Benk\"o gambit half accepted +rnbqkb1r/4pppp/3p1n2/1NpP4/1pB1P3/8/PP3PPP/R1BQK1NR b KQkq - +Benk\"o gambit: Nescaf\'e Frapp\'e attack +rnbqkb1r/5ppp/p2ppn2/1p4B1/3NPP2/2N5/PPP3PP/R2QKB1R w KQkq - +Sicilian: Najdorf, Polugayevsky variation +rnbqkb1r/5ppp/p2ppn2/1p6/3NP3/1BN5/PPP2PPP/R1BQK2R w KQkq - +Sicilian: Sozin with ...a6 and ...b5 +rnbqkb1r/5ppp/p3pn2/1pp5/2BP4/4PN2/PP2QPPP/RNB2RK1 w kq - +QGA: classical, 7...b5 +rnbqkb1r/p1pp1ppp/1p2pn2/8/2P5/2N2N2/PP1PPPPP/R1BQKB1R w KQkq - +English: Queens Indian formation +rnbqkb1r/p1pp1ppp/1p2pn2/8/2PP1B2/5N2/PP2PPPP/RN1QKB1R b KQkq - +Queen's Indian: Miles variation +rnbqkb1r/p1pp1ppp/1p2pn2/8/2PP4/2N2N2/PP2PPPP/R1BQKB1R b KQkq - +Queen's Indian: 4.Nc3 +rnbqkb1r/p1pp1ppp/1p2pn2/8/2PP4/4PN2/PP3PPP/RNBQKB1R b KQkq - +Queen's Indian: 4.e3 +rnbqkb1r/p1pp1ppp/1p2pn2/8/2PP4/5N2/PP2PPPP/RNBQKB1R w KQkq - +Queen's Indian defense +rnbqkb1r/p1pp1ppp/1p2pn2/8/2PP4/5NP1/PP2PP1P/RNBQKB1R b KQkq - +Queen's Indian: 4.g3 +rnbqkb1r/p1pp1ppp/1p2pn2/8/2PP4/P4N2/1P2PPPP/RNBQKB1R b KQkq - +Queen's Indian: Petrosian system +rnbqkb1r/p1pp1ppp/5n2/1p2p3/2P5/3P4/PP2PPPP/RNBQKBNR w KQkq - +Sicilian: wing gambit deferred * +rnbqkb1r/p1pp1ppp/5n2/1p4N1/2P1p3/2N5/PP1PPPPP/R1BQKB1R w KQkq - +English: Bellon gambit +rnbqkb1r/p1pp1ppp/5n2/1p6/2PPp3/4P3/PP3PPP/RNBQKBNR w KQkq - +French: Wing gambit * +rnbqkb1r/p1pp2pp/5n2/1p2pp2/2B1P3/3P4/PPP2PPP/RNBQK1NR w KQkq - +KGD: classical, Heath variation * +rnbqkb1r/p1ppp1pp/1p3n2/6B1/3Pp3/2N5/PPP2PPP/R2QKBNR w KQkq - +Dutch: Staunton gambit, Nimzovich variation +rnbqkb1r/p1pppp1p/5np1/1p1P4/2P5/8/PP2PPPP/RNBQKBNR w KQkq - +King's Indian: Danube gambit +rnbqkb1r/p1pppp1p/5np1/1p6/8/5NP1/PPPPPP1P/RNBQKB1R w KQkq - +R\'eti: King's Indian attack, R\'eti-Smyslov variation * +rnbqkb1r/p1pppppp/1p3n2/8/2PP4/8/PP2PPPP/RNBQKBNR w KQkq - +Queen's Indian accelerated +rnbqkb1r/p1pppppp/1p3n2/8/3P4/5N2/PPP1PPPP/RNBQKB1R w KQkq - +Queen's Indian defense +rnbqkb1r/p1pppppp/1p3n2/8/3P4/8/PPP1PPPP/RNBQKBNR w KQkq - +R\'eti: Nimzovich-Larsen attack * +rnbqkb1r/p1pppppp/5n2/1p6/3P4/8/PPP1PPPP/RNBQKBNR w KQkq - +Santasiere's folly * +rnbqkb1r/p1pppppp/5n2/1p6/8/5NP1/PPPPPP1P/RNBQKB1R w KQkq - +R\'eti: King's Indian attack, Spassky's variation +rnbqkb1r/p1pppppp/8/1p1nP3/3P4/8/PPP2PPP/RNBQKBNR w KQkq - +Alekhine's defense: O'Sullivan gambit +rnbqkb1r/p2n1ppp/1p2p3/2ppP3/3P4/2PB4/PP1N1PPP/R1BQK1NR w KQkq - +French: Tarrasch, Botvinnik variation +rnbqkb1r/p2p1pp1/5n1p/1ppP2B1/8/5N2/PP2PPPP/RN1QKB1R w KQkq - +Blumenfeld counter-gambit, Spielmann variation +rnbqkb1r/p2p1ppp/4pn2/1ppP2B1/2P5/5N2/PP2PPPP/RN1QKB1R b KQkq - +Blumenfeld counter-gambit, Dus-Chotimursky variation +rnbqkb1r/p2p1ppp/4pn2/1ppP4/2P5/5N2/PP2PPPP/RNBQKB1R w KQkq - +Blumenfeld counter-gambit +rnbqkb1r/p2ppp1p/1p3np1/2p3B1/3P4/2P2N2/PP2PPPP/RN1QKB1R b KQkq - +English: Torre defensive system * +rnbqkb1r/p2ppp1p/1p3np1/2p5/3P1B2/2P2N2/PP2PPPP/RN1QKB1R b KQkq - +English: London defensive system * +rnbqkb1r/p2ppppp/1p3n2/2p3B1/3P4/2P5/PP2PPPP/RN1QKBNR b KQkq - +English: Caro-Kann defensive system, Bogolyubov variation * +rnbqkb1r/p2ppppp/1p3n2/2p5/3P4/2P5/PP2PPPP/RNBQKBNR w KQkq - +English: Caro-Kann defensive system * +rnbqkb1r/p2ppppp/5n2/1ppP4/2P5/8/PP2PPPP/RNBQKBNR w KQkq - +Benk\"o gambit +rnbqkb1r/p3pppp/2p2n2/1p2P3/2pP4/2N2N2/PP3PPP/R1BQKB1R b KQkq - +QGD Slav: Tolush-Geller gambit +rnbqkb1r/p3pppp/5n2/1ppP4/2p1P3/2N5/PP3PPP/R1BQKBNR w KQkq - +QGA: Linares variation +rnbqkb1r/p4p2/2p1p2p/1p1nP1N1/2pP3B/2N5/PP3PPP/R2QKB1R w KQkq - +QGD semi-Slav: anti-Meran, Alatortsev system +rnbqkb1r/p4p2/2p1pP1p/1p2N3/2pP3p/2N5/PP3PPP/R2QKB1R b KQkq - +QGD semi-Slav: Ekstrom variation +rnbqkb1r/p4p2/2p1pn1p/1p2P1N1/2pP3B/2N5/PP3PPP/R2QKB1R b KQkq - +QGD semi-Slav: anti-Meran gambit +rnbqkb1r/p4ppp/2p5/3n4/2B2p2/5N2/PPPP2PP/RNBQK2R w KQkq - +KGA: Abbazia defense, Botvinnik variation +rnbqkb1r/p5pp/4pn2/1Ppp4/8/5N2/PP2PPPP/RNBQKB1R w KQkq - +Blumenfeld counter-gambit accepted +rnbqkb1r/pp1n1ppp/4p3/2ppP3/3P1P2/2N2N2/PPP3PP/R1BQKB1R b KQkq - +French: Steinitz variation +rnbqkb1r/pp1p1ppp/2p2n2/4p3/2P5/2N3P1/PP1PPP1P/R1BQKBNR w KQkq - +English: Bremen system, Keres variation +rnbqkb1r/pp1p1ppp/2p2n2/4p3/4P3/2N2N2/PPPP1PPP/R1BQKB1R b KQkq - +Ponziani: Jaenisch counter-attack * +rnbqkb1r/pp1p1ppp/2p2n2/4p3/4P3/2N5/PPPP1PPP/R1BQKBNR w KQkq - +Ponziani opening * +rnbqkb1r/pp1p1ppp/2p2n2/4p3/4P3/2N5/PPPPBPPP/R1BQK1NR b KQkq - +Ponziani: Romanishin variation * +rnbqkb1r/pp1p1ppp/2p2n2/4p3/4P3/2N5/PPPPNPPP/R1BQKB1R b KQkq - +Ponziani: R\'eti variation * +rnbqkb1r/pp1p1ppp/2p2n2/4p3/4PP2/2N5/PPPP2PP/R1BQKBNR b KQkq - +Ponziani counter-gambit * +rnbqkb1r/pp1p1ppp/2p2n2/8/2B1Pp2/2N5/PPPP2PP/R1BQK1NR w KQkq - +KGA: bishop's gambit, Jaenisch variation +rnbqkb1r/pp1p1ppp/2p5/3Nn3/1P1NP3/8/P1P2PPP/R1BQKB1R w KQkq - +two knights defense: Fritz, Gruber variation * +rnbqkb1r/pp1p1ppp/4pn2/2P5/8/4B3/PPP1PPPP/RN1QKBNR b KQkq - +R\'eti accepted: Keres variation * +rnbqkb1r/pp1p1ppp/4pn2/2p3B1/3PP3/5N2/PPP2PPP/RN1QKB1R b KQkq - +Queen's pawn: Torre attack, Wagner gambit +rnbqkb1r/pp1p1ppp/4pn2/2p5/2P1P3/2N5/PP1P1PPP/R1BQKBNR w KQkq - +English: Mikenas-Carls, Sicilian variation +rnbqkb1r/pp1p1ppp/4pn2/2pP4/2P5/8/PP2PPPP/RNBQKBNR w KQkq - +Benoni defense +rnbqkb1r/pp1p1ppp/4pn2/8/2PN4/8/PP2PPPP/RNBQKB1R w KQkq - +English: symmetrical variation +rnbqkb1r/pp1p1ppp/4pn2/8/3NP3/8/PPP2PPP/RNBQKB1R w KQkq - +Sicilian: Anderssen variation +rnbqkb1r/pp1p1ppp/5n2/2p1N3/8/3P4/PPP2PPP/RNBQKB1R w KQkq - +Petrov: Kaufmann attack * +rnbqkb1r/pp1p1ppp/5n2/2p1p3/2P5/6PB/PP1PPP1P/RNBQK1NR b KQkq - +Sicilian: Acton extension * +rnbqkb1r/pp1p1ppp/5n2/2p1p3/4P3/2N5/PPPP1PPP/R1BQKBNR w KQkq - +Dresden opening * +rnbqkb1r/pp1p1ppp/5n2/2pPp3/2P5/8/PP2PPPP/RNBQKBNR w KQkq e6 +Czech Benoni defense +rnbqkb1r/pp1p2pp/2p2n2/4pp2/2B1P3/3P4/PPP2PPP/RNBQK1NR w KQkq - +KGD: classical, 4.c3 * +rnbqkb1r/pp1p2pp/2p2n2/4pp2/2B1PP2/3P4/PPP3PP/RNBQK1NR b KQkq - +KGD: classical counter-gambit * +rnbqkb1r/pp1pp1pp/2p2n2/6B1/3Pp3/2N5/PPP2PPP/R2QKBNR w KQkq - +Dutch: Staunton gambit, Chigorin variation +rnbqkb1r/pp1ppp1p/5np1/2p5/3P4/2P1P3/PP3PPP/RNBQKBNR b KQkq - +English: Kurajica defense * +rnbqkb1r/pp1ppp1p/5np1/2p5/3P4/4P3/PPP2PPP/RNBQKBNR w KQkq - +English opening: Agincourt variation * +rnbqkb1r/pp1ppp1p/5np1/2p5/3P4/4PN2/PPP2PPP/RNBQKB1R b KQkq - +English: Neo-Catalan * +rnbqkb1r/pp1ppppp/1n6/2p1P3/8/1B1P4/PPP2PPP/RNBQK1NR b KQkq - +Alekhine's defense: Kmoch variation +rnbqkb1r/pp1ppppp/2p2n2/8/3PP3/8/PPP2PPP/RNBQKBNR w KQkq - +Caro-Masi defense +rnbqkb1r/pp1ppppp/5n2/2P5/8/8/PPP1PPPP/RNBQKBNR b KQkq - +R\'eti accepted * +rnbqkb1r/pp1ppppp/5n2/2p1P3/8/8/PPPP1PPP/RNBQKBNR b KQkq - +English, Nimzovich, Flohr variation * +rnbqkb1r/pp1ppppp/5n2/2p5/2P5/2N3P1/PP1PPP1P/R1BQKBNR b KQkq - +English: symmetrical variation +rnbqkb1r/pp1ppppp/5n2/2p5/2PP4/5N2/PP2PPPP/RNBQKB1R b KQkq - +English: symmetrical, Benoni formation +rnbqkb1r/pp1ppppp/5n2/2p5/2PP4/8/PP2PPPP/RNBQKBNR w KQkq - +Benoni defense +rnbqkb1r/pp1ppppp/5n2/2p5/3P4/4P3/PPP2PPP/RNBQKBNR b KQkq - +English opening: Agincourt variation * +rnbqkb1r/pp1ppppp/5n2/2p5/3P4/8/PPP1PPPP/RNBQKBNR w KQkq - +R\'eti opening * +rnbqkb1r/pp1ppppp/5n2/2p5/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - +Sicilian: Nimzovich-Rubinstein variation +rnbqkb1r/pp1ppppp/5n2/2p5/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +English, Nimzovich variation * +rnbqkb1r/pp1ppppp/5n2/2p5/8/5N2/PPPPPPPP/RNBQKB1R w KQkq - +English opening * +rnbqkb1r/pp1ppppp/5n2/2pP4/8/5N2/PPP1PPPP/RNBQKB1R b KQkq - +Old Benoni defense +rnbqkb1r/pp1ppppp/5n2/2pP4/8/8/PPP1PPPP/RNBQKBNR b KQkq - +R\'eti: advance variation * +rnbqkb1r/pp1ppppp/5n2/2pP4/8/8/PPP1PPPP/RNBQKBNR w KQkq - +Old Benoni defense +rnbqkb1r/pp1ppppp/5n2/3P4/2p5/5N2/PPP1PPPP/RNBQKB1R w KQkq - +Hawk (Habichd) defense +rnbqkb1r/pp1ppppp/8/2pP4/2P1n3/8/PP2PPPP/RNBQKBNR w KQkq - +Vulture defense +rnbqkb1r/pp2pp1p/2p2np1/3p4/2P5/1P3N2/PB1PPPPP/RN1QKB1R w KQkq - +English: Bled variation +rnbqkb1r/pp2pp1p/2p2np1/3p4/2PP4/2N2N2/PP2PPPP/R1BQKB1R w KQkq - +QGD Slav\Gr\"unfeld: Schlechter variation +rnbqkb1r/pp2pp1p/2p2p2/8/3P4/8/PPP2PPP/R1BQKBNR w KQkq - +Caro-Kann: Bronstein-Larsen variation +rnbqkb1r/pp2pp1p/2pp1np1/8/3PP3/2N1B3/PPPQ1PPP/R3KBNR b KQkq - +Pirc: 150 attack +rnbqkb1r/pp2pp1p/3p1np1/8/3NP3/2N1B3/PPP2PPP/R2QKB1R b KQkq - +Sicilian: dragon, 6.Be3 +rnbqkb1r/pp2pp1p/3p1np1/8/3NP3/2N5/PPP2PPP/R1BQKB1R w KQkq - +Sicilian: dragon variation +rnbqkb1r/pp2pp1p/3p1np1/8/3NPP2/2N5/PPP3PP/R1BQKB1R b KQkq - +Sicilian: dragon, Levenfish variation +rnbqkb1r/pp2pp1p/5np1/2pP4/4p3/2N5/PPP2PPP/R1BQKBNR w KQkq - +QGD: Albin counter-gambit, 5.g3 * +rnbqkb1r/pp2pp1p/5np1/2pp4/8/1P2PN2/P1PP1PPP/RNBQKB1R w KQkq - +Queen's Indian: 4.g3 * +rnbqkb1r/pp2pp1p/5np1/2pp4/8/1P2PN2/PBPP1PPP/RN1QKB1R b KQkq - +Queen's Indian: 4.g3 Bb7 * +rnbqkb1r/pp2pp1p/5np1/2pp4/8/BP2PN2/P1PP1PPP/RN1QKB1R b KQkq - +Queen's Indian: Nimzovich variation (exaggerated fianchetto) * +rnbqkb1r/pp2pp1p/5np1/3p4/2PP4/2N5/PP3PPP/R1BQKBNR w KQkq - +Caro-Kann: Panov-Botvinnik attack, 5...g6 +rnbqkb1r/pp2pp1p/6p1/2p3B1/2PPp3/8/PP1QPPPP/R3KBNR w KQkq - +Gr\"unfeld: Lundin variation +rnbqkb1r/pp2pppp/2p2n2/3P4/2P5/8/PP1P1PPP/RNBQKBNR w KQkq - +Scandinavian gambit +rnbqkb1r/pp2pppp/2p2n2/3p4/2P5/1P3N2/PB1PPPPP/RN1QKB1R b KQkq - +English: Caro-Kann defensive system +rnbqkb1r/pp2pppp/2p2n2/3p4/2PP4/2N2N2/PP2PPPP/R1BQKB1R b KQkq - +QGD Slav: 4.Nc3 +rnbqkb1r/pp2pppp/2p2n2/3p4/2PP4/4PN2/PP3PPP/RNBQKB1R b KQkq - +QGD Slav: 4.e3 +rnbqkb1r/pp2pppp/2p2n2/3p4/2PP4/5N2/PP1NPPPP/R1BQKB1R b KQkq - +QGD Slav: Breyer variation +rnbqkb1r/pp2pppp/2p2n2/8/2pP4/2N1PN2/PP3PPP/R1BQKB1R b KQkq - +QGD Slav: 5.e3 (Alekhine variation) +rnbqkb1r/pp2pppp/2p2n2/8/2pP4/2N2N2/PP2PPPP/R1BQKB1R w KQkq - +QGD Slav accepted +rnbqkb1r/pp2pppp/2p2n2/8/2pPP3/2N2N2/PP3PPP/R1BQKB1R b KQkq - +QGD Slav: Slav gambit +rnbqkb1r/pp2pppp/2p2n2/8/3PN3/3B4/PPP2PPP/R1BQK1NR b KQkq - +Caro-Kann: Alekhine gambit +rnbqkb1r/pp2pppp/2p2n2/8/P1pP4/2N2N2/1P2PPPP/R1BQKB1R b KQkq - +QGD Slav accepted: Alapin variation +rnbqkb1r/pp2pppp/2pp1n2/8/3PP3/2N5/PPP2PPP/R1BQKBNR w KQkq - +Pirc: Ufimtsev-Pytel variation +rnbqkb1r/pp2pppp/3p1n2/2p5/3PP3/5N2/PPP2PPP/RNBQKB1R w KQkq - +Sicilian: Cortlever (Alatortsev) variation +rnbqkb1r/pp2pppp/3p1n2/2pP4/2P5/8/PP2PPPP/RNBQKBNR w KQkq - +Benoni defense, Hromodka system +rnbqkb1r/pp2pppp/3p1n2/8/3NP3/2N5/PPP2PPP/R1BQKB1R b KQkq - +Sicilian +rnbqkb1r/pp2pppp/3p1n2/8/3NP3/5P2/PPP3PP/RNBQKB1R b KQkq - +Sicilian: Prins (Moscow) variation +rnbqkb1r/pp2pppp/5n2/1Bpp4/8/4PN2/PPPP1PPP/RNBQK2R b KQkq - +Bogo-Indian defense * +rnbqkb1r/pp2pppp/5n2/2Pp4/1P6/8/P1P1PPPP/RNBQKBNR b KQkq - +QGA: Ericson variation * +rnbqkb1r/pp2pppp/5n2/2Pp4/3P4/8/PP3PPP/RNBQKBNR b KQkq - +Caro-Kann: Panov-Botvinnik, Gunderam attack +rnbqkb1r/pp2pppp/5n2/2Pp4/8/5N2/PPP1PPPP/RNBQKB1R b KQkq - +Queen's gambit accepted * +rnbqkb1r/pp2pppp/5n2/2Pp4/8/8/PPP1PPPP/RNBQKBNR w KQkq - +QGA: 3.Nf3 * +rnbqkb1r/pp2pppp/5n2/2Pp4/8/P7/1PP1PPPP/RNBQKBNR b KQkq - +QGA: Alekhine defense * +rnbqkb1r/pp2pppp/5n2/2p3N1/4p3/8/PPPP1PPP/RNBQKB1R w KQkq - +Budapest: Adler variation * +rnbqkb1r/pp2pppp/5n2/2p5/1PPp4/4PN2/P2P1PPP/RNBQKB1R b KQkq - +Blumenfeld counter-gambit * +rnbqkb1r/pp2pppp/5n2/2pP4/4p3/8/PPP2PPP/RNBQKBNR w KQkq - +QGD: Albin counter-gambit * +rnbqkb1r/pp2pppp/5n2/2pp4/2P5/5N2/PP1PPPPP/RNBQKB1R w KQkq - +English: symmetrical, Benoni formation * +rnbqkb1r/pp2pppp/5n2/2pp4/3P4/2P5/PP2PPPP/RNBQKBNR w KQkq - +QGD Slav: 3.Nf3 * +rnbqkb1r/pp2pppp/5n2/2pp4/3P4/5NP1/PPP1PP1P/RNBQKB1R b KQkq - +Neo-Gr\"unfeld defense * +rnbqkb1r/pp2pppp/5n2/2pp4/5P2/4PN2/PPPP2PP/RNBQKB1R w KQkq - +Bird's opening: Lasker variation +rnbqkb1r/pp2pppp/5n2/2pp4/8/1P2PN2/P1PP1PPP/RNBQKB1R b KQkq - +Queen's Indian defense * +rnbqkb1r/pp2pppp/5n2/2pp4/8/4PN2/PPPP1PPP/RNBQKB1R w KQkq - +Queen's pawn game * +rnbqkb1r/pp2pppp/5n2/2pp4/8/5NP1/PPPPPP1P/RNBQKB1R w KQkq - +King's Indian, 3.Nf3 * +rnbqkb1r/pp2pppp/5n2/2pp4/8/P3PN2/1PPP1PPP/RNBQKB1R b KQkq - +Dzindzikhashvili defense * +rnbqkb1r/pp2pppp/5n2/2ppN3/8/4P3/PPPP1PPP/RNBQKB1R b KQkq - +D\"ory defense * +rnbqkb1r/pp2pppp/5n2/3p4/2PP4/2N5/PP3PPP/R1BQKBNR b KQkq - +Caro-Kann: Panov-Botvinnik attack +rnbqkb1r/pp2pppp/5n2/3p4/3P4/5N2/PP2PPPP/RNBQKB1R b KQkq - +QGD Slav: exchange variation * +rnbqkb1r/pp2pppp/5n2/3p4/3P4/5N2/PP2PPPP/RNBQKB1R w KQkq - +QGD Slav: exchange variation +rnbqkb1r/pp2pppp/5n2/8/1pPP4/4PN2/P5PP/RNBQKB1R b KQkq - +Blumenfeld counter-gambit accepted * +rnbqkb1r/pp2pppp/8/2pn4/8/2N2N2/PP1PPPPP/R1BQKB1R w KQkq - +English: symmetrical, three knights system +rnbqkb1r/pp2pppp/8/2pn4/8/4PN2/PP1P1PPP/RNBQKB1R b KQkq - +English: symmetrical variation * +rnbqkb1r/pp3p1p/2p1pnp1/3p4/2PP4/4PN2/PP1N1PPP/R1BQKB1R w KQkq - +QGD: Spielmann variation +rnbqkb1r/pp3p1p/3p1np1/2pP2B1/8/2N2N2/PP2PPPP/R2QKB1R b KQkq - +Benoni: Uhlmann variation +rnbqkb1r/pp3p1p/3p1np1/2pP4/4P3/2N2N2/PP3PPP/R1BQKB1R b KQkq - +Benoni: classical with e4 and Nf3 +rnbqkb1r/pp3p1p/3p1np1/2pP4/4PP2/2N5/PP4PP/R1BQKBNR b KQkq - +Benoni: pawn storm variation +rnbqkb1r/pp3p1p/3p1np1/2pP4/8/2N2N2/PP2PPPP/R1BQKB1R w KQkq - +Benoni defense +rnbqkb1r/pp3p1p/3p1np1/2pP4/8/2N2NP1/PP2PP1P/R1BQKB1R b KQkq - +Benoni: fianchetto variation +rnbqkb1r/pp3p1p/3p1np1/2pP4/8/2N5/PP1NPPPP/R1BQKB1R b KQkq - +Benoni: Nimzovich (knight's tour) variation +rnbqkb1r/pp3p1p/3p1np1/2pPp3/2P1P3/2N5/PP3PPP/R1BQKBNR w KQkq - +Czech Benoni: King's Indian system +rnbqkb1r/pp3ppp/2p1pn2/3p4/2PP4/2N1PN2/PP3PPP/R1BQKB1R b KQkq - +QGD semi-Slav: 5.e3 +rnbqkb1r/pp3ppp/2p1pn2/3p4/2PP4/2N2N2/PP2PPPP/R1BQKB1R w KQkq - +QGD semi-Slav +rnbqkb1r/pp3ppp/2p1pn2/3p4/2PP4/4PN2/PP1N1PPP/R1BQKB1R b KQkq - +QGD Slav +rnbqkb1r/pp3ppp/2p1pn2/6B1/2pP4/2N2N2/PP2PPPP/R2QKB1R w KQkq - +QGD semi-Slav: 5.Bg5 dc +rnbqkb1r/pp3ppp/2p1pn2/6B1/2pPP3/2N2N2/PP3PPP/R2QKB1R b KQkq - +QGD semi-Slav: Botvinnik system (anti-Meran) +rnbqkb1r/pp3ppp/2p1pn2/8/P1pP4/2N2N2/1P2PPPP/R1BQKB1R w KQkq - +QGD Slav: Soultanb\'eieff variation +rnbqkb1r/pp3ppp/2p2n2/3Pp3/4P3/8/PP1P1PPP/RNBQKBNR w KQkq - +Sicilian: Andreaschek gambit * +rnbqkb1r/pp3ppp/2p2n2/3Pp3/8/2N5/PPPP1PPP/R1BQKBNR w KQkq - +Scotch: G\"oring gambit * +rnbqkb1r/pp3ppp/2p2n2/3Pp3/8/3P4/PP2PPPP/RNBQKBNR w KQkq - +Sicilian: Tartakower variation * +rnbqkb1r/pp3ppp/2p2n2/3p2B1/3P4/2N5/PP2PPPP/R2QKBNR w KQkq - +QGD: exchange, positional line, 5...c6 +rnbqkb1r/pp3ppp/2p2n2/3p2B1/3P4/2N5/PPQ1PPPP/R3KBNR b KQkq - +QGD: exchange, positional line, 6.Qc2 +rnbqkb1r/pp3ppp/2p2n2/3p4/2PPp3/1Q2P3/PP1B1PPP/RN2KBNR b KQkq - +French: advance, Wade variation * +rnbqkb1r/pp3ppp/2p2n2/3p4/2PPp3/2N1P3/PP1B1PPP/R2QKBNR b KQkq - +French: advance, Euwe variation * +rnbqkb1r/pp3ppp/2p2n2/3p4/2PPp3/2N1P3/PP3PPP/R1BQKBNR w KQkq - +French: advance, Paulsen attack * +rnbqkb1r/pp3ppp/2p2n2/3pp3/8/3P2P1/PPP1PPBP/RNBQK1NR w KQkq - +Robatsch defense: Geller's system * +rnbqkb1r/pp3ppp/2p2n2/4N3/2BpP3/2N5/PPPP1PPP/R1BQK2R b KQkq - +Ponziani: Fraser defense * +rnbqkb1r/pp3ppp/2p2n2/4p3/3pPP2/2NP4/PPP3PP/R1BQKBNR w KQkq - +Ponziani counter-gambit, Schmidt attack * +rnbqkb1r/pp3ppp/2p2p2/8/2BP4/8/PPP2PPP/R1BQK1NR b KQkq - +Caro-Kann: Forg\'acs variation +rnbqkb1r/pp3ppp/2p2p2/8/3P4/8/PPP2PPP/R1BQKBNR w KQkq - +Caro-Kann: Tartakower (Nimzovich) variation +rnbqkb1r/pp3ppp/3p1n2/1B2p3/3NP3/2N5/PPP2PPP/R1BQK2R b KQkq - +Sicilian: Venice attack +rnbqkb1r/pp3ppp/3p1n2/1B2p3/3NP3/5P2/PPP3PP/RNBQK2R b KQkq - +Sicilian: Prins variation, Venice attack +rnbqkb1r/pp3ppp/3p1n2/2pP4/4P3/2N5/PP3PPP/R1BQKBNR b KQkq - +Benoni: 6.e4 +rnbqkb1r/pp3ppp/3ppn2/1B6/3NP3/2N5/PPP2PPP/R1BQK2R b KQkq - +Sicilian: Scheveningen, Vitoli\'n\'s variation +rnbqkb1r/pp3ppp/3ppn2/8/2BNP3/2N5/PPP2PPP/R1BQK2R b KQkq - +Sicilian: Sozin attack +rnbqkb1r/pp3ppp/3ppn2/8/3NP1P1/2N5/PPP2P1P/R1BQKB1R b KQkq - +Sicilian: Scheveningen, Keres attack +rnbqkb1r/pp3ppp/3ppn2/8/3NP3/2N3P1/PPP2P1P/R1BQKB1R b KQkq - +Sicilian: Scheveningen, fianchetto variation +rnbqkb1r/pp3ppp/3ppn2/8/3NP3/2N5/PPP1BPPP/R1BQK2R b KQkq - +Sicilian: Scheveningen, 6.Be2 +rnbqkb1r/pp3ppp/3ppn2/8/3NP3/2N5/PPP2PPP/R1BQKB1R w KQkq - +Sicilian: Scheveningen variation +rnbqkb1r/pp3ppp/3ppn2/8/3NPP2/2N5/PPP3PP/R1BQKB1R b KQkq - +Sicilian: Scheveningen, 6.f4 +rnbqkb1r/pp3ppp/4p3/2pn4/3P4/2N1PN2/PP3PPP/R1BQKB1R b KQkq - +QGD: Semi-Tarrasch with e3 +rnbqkb1r/pp3ppp/4pn2/2Pp2B1/8/5N2/PPP1PPPP/RN1QKB1R b KQkq - +QGA, Janowsky-Larsen variation * +rnbqkb1r/pp3ppp/4pn2/2Pp4/1P6/P7/2P1PPPP/RNBQKBNR b KQkq - +QGA: Haberditz variation * +rnbqkb1r/pp3ppp/4pn2/2Pp4/8/4BN2/PPP1PPPP/RN1QKB1R b KQkq - +QGA, Flohr variation * +rnbqkb1r/pp3ppp/4pn2/2Pp4/8/4PN2/PPP2PPP/RNBQKB1R b KQkq - +QGA: 4...e6 * +rnbqkb1r/pp3ppp/4pn2/2Pp4/8/5N2/PPP1PPPP/RNBQKB1R w KQkq - +QGA, 4.e3 * +rnbqkb1r/pp3ppp/4pn2/2Pp4/8/5NP1/PPP1PP1P/RNBQKB1R b KQkq - +QGA, Smyslov variation * +rnbqkb1r/pp3ppp/4pn2/2p5/2BP4/4PN2/PP3PPP/RNBQ1RK1 b kq - +QGA: classical variation, 6.O-O +rnbqkb1r/pp3ppp/4pn2/2p5/2BP4/4PN2/PP3PPP/RNBQK2R w KQkq - +QGA: classical variation +rnbqkb1r/pp3ppp/4pn2/2pP2B1/3P4/2N5/PP2PPPP/R2QKBNR b KQkq - +QGD: Semi-Tarrasch +rnbqkb1r/pp3ppp/4pn2/2pP4/3P4/2N2N2/PP2PPPP/R1BQKB1R b KQkq - +QGD: Semi-Tarrasch, 5.cd +rnbqkb1r/pp3ppp/4pn2/2pp2B1/2PP4/2N2N2/PP2PPPP/R2QKB1R b KQkq - +QGD: Semi-Tarrasch defense, Pillsbury variation +rnbqkb1r/pp3ppp/4pn2/2pp2B1/2PP4/2N5/PP2PPPP/R2QKBNR w KQkq - +QGD: Been-Koomen variation +rnbqkb1r/pp3ppp/4pn2/2pp4/2P5/1P2PN2/PB1P1PPP/RN1QKB1R b KQkq - +English: Wimpey system +rnbqkb1r/pp3ppp/4pn2/2pp4/2PP4/2N2N2/PP2PPPP/R1BQKB1R w KQkq - +QGD: Semi-Tarrasch defense +rnbqkb1r/pp3ppp/4pn2/2pp4/3P1B2/2P2N2/PP2PPPP/RN1QKB1R b KQkq - +QGD Slav: 4.e3 Bf5 * +rnbqkb1r/pp3ppp/4pn2/2pp4/3P4/1P1BPN2/P1P2PPP/RNBQK2R b KQkq - +Queen's pawn game, Rubinstein (Colle-Zukertort) variation +rnbqkb1r/pp3ppp/4pn2/2pp4/3P4/1P2PN2/P1PN1PPP/R1BQKB1R b KQkq - +Queen's pawn game, Zukertort variation +rnbqkb1r/pp3ppp/4pn2/2pp4/3P4/2P2N2/PP2PPPP/RNBQKB1R w KQkq - +QGD Slav: 4.e3 * +rnbqkb1r/pp3ppp/4pn2/2pp4/3P4/2PBPN2/PP3PPP/RNBQK2R b KQkq - +Colle system +rnbqkb1r/pp3ppp/4pn2/2pp4/8/1P2PN2/P1PP1PPP/RNBQKB1R w KQkq - +Queen's Indian: 4.e3 * +rnbqkb1r/pp3ppp/4pn2/3p2B1/2PQ4/2N2N2/PP2PPPP/R3KB1R b KQkq - +QGD: Semi-Tarrasch, Primitive Pillsbury variation +rnbqkb1r/pp3ppp/4pn2/3p4/2PP4/2N5/PP3PPP/R1BQKBNR w KQkq - +Caro-Kann: Panov-Botvinnik attack, 5...e6 +rnbqkb1r/pp3ppp/4pn2/8/2Bp4/4PN2/PP3PPP/RNBQ1RK1 w kq - +QGA: classical, Steinitz variation +rnbqkb1r/pp3ppp/5n2/2Ppp3/8/P7/1PP1PPPP/RNBQKBNR w KQkq - +QGA: Alekhine defense, Borisenko-Furman variation * +rnbqkb1r/pp3ppp/5n2/2p3B1/3pp3/1N1P4/PPP1PPPP/RN1QKB1R w KQkq - +Alekhine's defense: modern, Vitolins attack * +rnbqkb1r/pp3ppp/5n2/2pp2B1/3Np3/3P4/PPP1PPPP/RN1QKB1R w KQkq - +Alekhine's defense: modern, Alekhine variation * +rnbqkb1r/pp3ppp/5n2/2ppp1B1/8/3P2P1/PPP1PPBP/RN1QK1NR b KQkq - +Robatsch defense: Rossolimo variation * +rnbqkb1r/pp3ppp/8/2pnp3/8/2N3P1/PP1PPP1P/R1BQKBNR w KQkq - +Sicilian: accelerated fianchetto, Mar\'oczy bind * +rnbqkb1r/pp3ppp/8/2pnp3/8/2N3P1/PP1PPPBP/R1BQK1NR b KQkq - +Sicilian: accelerated fianchetto, Mar\'oczy bind, 5...Bg7 * +rnbqkb1r/pp3ppp/8/2pnp3/8/P3P3/1P1P1PPP/RNBQKBNR w KQkq - +Sicilian: Kan, Mar\'oczy bind (R\'eti variation) * +rnbqkb1r/pp4pp/2p1p3/3p1p2/2PPn3/2NBPN2/PP3PPP/R1BQK2R w KQkq - +QGD semi-Slav: stonewall defense +rnbqkb1r/pp4pp/2p1p3/3p1p2/2PPn3/3BPN2/PP1N1PPP/R1BQK2R w KQkq - +QGD: Stonewall variation +rnbqkb1r/pp4pp/5n2/3p2B1/2p5/1NN1P3/PPP1P1PP/R2QKB1R w KQkq - +Alekhine's defense: four pawns attack, Ilyin-Genevsky variation * +rnbqkb1r/ppn1pppp/8/2p5/8/2N3P1/PP1PPPBP/R1BQK1NR w KQkq - +English: symmetrical, Rubinstein system +rnbqkb1r/ppp1p1pp/5n2/3p4/8/3B3N/PPP2PPP/RNBQK2R w KQkq - +Bird: From gambit, Lipke variation * +rnbqkb1r/ppp1pp1p/1n1p2p1/4P3/2PP1P2/8/PP4PP/RNBQKBNR w KQkq - +Alekhine's defense: four pawns attack, fianchetto variation +rnbqkb1r/ppp1pp1p/1n1p4/4P1p1/2PP1P2/8/PP4PP/RNBQKBNR w KQkq - +Alekhine's defense: four pawns attack, Planinc variation +rnbqkb1r/ppp1pp1p/1n4p1/8/8/2N3P1/PP1PPPBP/R1BQK1NR w KQkq - +English: Anglo-Gr\"unfeld, Czech defense +rnbqkb1r/ppp1pp1p/3p1np1/6B1/3PP3/2N5/PPP2PPP/R2QKBNR b KQkq - +Pirc: Byrne variation +rnbqkb1r/ppp1pp1p/3p1np1/8/2BPP3/2N5/PPP2PPP/R1BQK1NR b KQkq - +Pirc: Holmov system +rnbqkb1r/ppp1pp1p/3p1np1/8/3PP3/2N2N2/PPP2PPP/R1BQKB1R b KQkq - +Pirc: classical (two knights) system +rnbqkb1r/ppp1pp1p/3p1np1/8/3PP3/2N3P1/PPP2P1P/R1BQKBNR b KQkq - +Pirc: Sveshnikov system +rnbqkb1r/ppp1pp1p/3p1np1/8/3PP3/2N5/PPP1BPPP/R1BQK1NR b KQkq - +Pirc defense +rnbqkb1r/ppp1pp1p/3p1np1/8/3PP3/2N5/PPP2PPP/R1BQKBNR w KQkq - +Pirc defense +rnbqkb1r/ppp1pp1p/3p1np1/8/3PPP2/2N5/PPP3PP/R1BQKBNR b KQkq - +Pirc: Austrian attack +rnbqkb1r/ppp1pp1p/3p2p1/3nP3/3P4/5N2/PPP2PPP/RNBQKB1R w KQkq - +Alekhine's defense: modern, fianchetto variation +rnbqkb1r/ppp1pp1p/5np1/3P4/3P4/8/PPP2PPP/RNBQKBNR w KQkq - +Scandinavian: Richter variation +rnbqkb1r/ppp1pp1p/5np1/3p2B1/2PP4/2N5/PP2PPPP/R2QKBNR b KQkq - +Gr\"unfeld: Stockholm variation +rnbqkb1r/ppp1pp1p/5np1/3p4/2PP1B2/2N5/PP2PPPP/R2QKBNR b KQkq - +Gr\"unfeld: 4.Bf4 +rnbqkb1r/ppp1pp1p/5np1/3p4/2PP2P1/2N5/PP2PP1P/R1BQKBNR b KQkq - +Gr\"unfeld: Spike gambit +rnbqkb1r/ppp1pp1p/5np1/3p4/2PP4/1QN5/PP2PPPP/R1B1KBNR b KQkq - +Gr\"unfeld: Russian variation +rnbqkb1r/ppp1pp1p/5np1/3p4/2PP4/2N2N2/PP2PPPP/R1BQKB1R b KQkq - +Gr\"unfeld: Three knights variation +rnbqkb1r/ppp1pp1p/5np1/3p4/2PP4/2N5/PP2PPPP/R1BQKBNR w KQkq - +Gr\"unfeld defense +rnbqkb1r/ppp1pp1p/5np1/3p4/2PP4/5N2/PP2PPPP/RNBQKB1R w KQkq - +Neo-Gr\"unfeld defense +rnbqkb1r/ppp1pp1p/5np1/3p4/2PP4/5P2/PP2P1PP/RNBQKBNR w KQkq - +Neo-Gr\"unfeld defense +rnbqkb1r/ppp1pp1p/5np1/3p4/2PP4/6P1/PP2PP1P/RNBQKBNR w KQkq - +Neo-Gr\"unfeld (Kemeri) defense +rnbqkb1r/ppp1pp1p/5np1/3p4/8/5NP1/PPPPPP1P/RNBQKB1R w KQkq - +King's Indian: fianchetto without c4 * +rnbqkb1r/ppp1pp1p/5np1/8/2pP4/4PN2/PP3PPP/RNBQKB1R w KQkq - +QGA, Smyslov variation +rnbqkb1r/ppp1pp1p/6p1/3n4/3P4/2N5/PP2PPPP/R1BQKBNR w KQkq - +Gr\"unfeld: exchange variation +rnbqkb1r/ppp1pp1p/6p1/8/8/2n3P1/PP1PPPBP/R1BQK1NR w KQkq - +English: Anglo-Gr\"unfeld, Smyslov defense +rnbqkb1r/ppp1pppp/1n1P4/8/2PP4/8/PP3PPP/RNBQKBNR b KQkq - +Alekhine's defense: exchange variation +rnbqkb1r/ppp1pppp/1n1p4/4P3/2PP1P2/8/PP4PP/RNBQKBNR b KQkq - +Alekhine's defense: four pawns attack +rnbqkb1r/ppp1pppp/1n1p4/4P3/3P4/5N2/PPP2PPP/RNBQKB1R w KQkq - +Alekhine's defense: modern, Schmid variation +rnbqkb1r/ppp1pppp/3p1n2/8/2PP4/8/PP2PPPP/RNBQKBNR w KQkq - +Old Indian defense +rnbqkb1r/ppp1pppp/3p1n2/8/3P4/8/PPP1PPPP/RNBQKBNR w KQkq - +R\'eti: old Indian attack * +rnbqkb1r/ppp1pppp/3p1n2/8/3PP3/8/PPP2PPP/RNBQKBNR w KQkq - +Pirc defense +rnbqkb1r/ppp1pppp/3p4/3nP3/2BP4/8/PPP2PPP/RNBQK1NR b KQkq - +Alekhine's defense: Balogh variation +rnbqkb1r/ppp1pppp/3p4/3nP3/2PP4/8/PP3PPP/RNBQKBNR b KQkq - +Alekhine's defense +rnbqkb1r/ppp1pppp/3p4/3nP3/3P4/5N2/PPP2PPP/RNBQKB1R b KQkq - +Alekhine's defense: modern variation +rnbqkb1r/ppp1pppp/3p4/3nP3/3P4/8/PPP2PPP/RNBQKBNR w KQkq - +Alekhine's defense +rnbqkb1r/ppp1pppp/5n2/2P5/3p4/5N2/PP1PPPPP/RNBQKB1R b KQkq - +Hawk (Habichd) defense * +rnbqkb1r/ppp1pppp/5n2/3P4/3P4/8/PPP2PPP/RNBQKBNR b KQkq - +Scandinavian defense +rnbqkb1r/ppp1pppp/5n2/3P4/8/8/PPPP1PPP/RNBQKBNR w KQkq - +Scandinavian defense +rnbqkb1r/ppp1pppp/5n2/3p2B1/3P4/2N5/PPP1PPPP/R2QKBNR b KQkq - +Richter-Veresov attack +rnbqkb1r/ppp1pppp/5n2/3p2B1/3P4/5N2/PPP1PPPP/RN1QKB1R b KQkq - +Torre attack (Tartakower variation) +rnbqkb1r/ppp1pppp/5n2/3p2B1/8/3P4/PPP1PPPP/RN1QKBNR b KQkq - +Old Indian: Tartakower (Wade) variation * +rnbqkb1r/ppp1pppp/5n2/3p4/2P5/2N5/PP1PPPPP/R1BQKBNR w KQkq - +English: Anglo-Gr\"unfeld defense +rnbqkb1r/ppp1pppp/5n2/3p4/2PP4/8/PP2PPPP/RNBQKBNR b KQkq - +Queen's pawn game, Krause variation * +rnbqkb1r/ppp1pppp/5n2/3p4/2PP4/8/PP2PPPP/RNBQKBNR w KQkq - +QGD: Marshall defense +rnbqkb1r/ppp1pppp/5n2/3p4/3P1B2/5N2/PPP1PPPP/RN1QKB1R b KQkq - +Queen's bishop game +rnbqkb1r/ppp1pppp/5n2/3p4/3P2P1/5P2/PPP1P2P/RNBQKBNR b KQkq - +Gedult attack +rnbqkb1r/ppp1pppp/5n2/3p4/3P4/2N5/PPP1PPPP/R1BQKBNR b KQkq - +Queen's pawn game, Chigorin variation * +rnbqkb1r/ppp1pppp/5n2/3p4/3P4/3BP3/PPP2PPP/RNBQK1NR b KQkq - +Queen's pawn: stonewall attack +rnbqkb1r/ppp1pppp/5n2/3p4/3P4/4PN2/PPP2PPP/RNBQKB1R b KQkq - +Queen's pawn game +rnbqkb1r/ppp1pppp/5n2/3p4/3P4/5N2/PPP1PPPP/RNBQKB1R b KQkq - +Queen's pawn game * +rnbqkb1r/ppp1pppp/5n2/3p4/3P4/5N2/PPP1PPPP/RNBQKB1R w KQkq - +Queen's pawn game +rnbqkb1r/ppp1pppp/5n2/3p4/3P4/8/PPP1PPPP/RNBQKBNR w KQkq - +Queen's pawn game * +rnbqkb1r/ppp1pppp/5n2/3p4/3PP3/2N5/PPP2PPP/R1BQKBNR b KQkq - +Blackmar-Diemer gambit +rnbqkb1r/ppp1pppp/5n2/3p4/3PP3/5P2/PPP3PP/RNBQKBNR b KQkq - +Blackmar-Diemer gambit +rnbqkb1r/ppp1pppp/5n2/3p4/4P3/2N5/PPPP1PPP/R1BQKBNR w KQkq - +Alekhine's defense: Scandinavian variation +rnbqkb1r/ppp1pppp/5n2/3p4/8/1P3N2/P1PPPPPP/RNBQKB1R b KQkq - +Queen's Indian defense * +rnbqkb1r/ppp1pppp/5n2/3p4/8/5N2/PPPPPPPP/RNBQKB1R w KQkq - +Queen's pawn game * +rnbqkb1r/ppp1pppp/5n2/3p4/8/5NP1/PPPPPP1P/RNBQKB1R b KQkq - +King's Indian: East Indian defense * +rnbqkb1r/ppp1pppp/5n2/3pN3/8/8/PPPPPPPP/RNBQKB1R b KQkq - +D\"ory defense * +rnbqkb1r/ppp1pppp/5n2/8/2Pp4/5N2/PP1PPPPP/RNBQKB1R w KQkq - +Old Benoni defense * +rnbqkb1r/ppp1pppp/5n2/8/2pP4/2N2N2/PP2PPPP/R1BQKB1R b KQkq - +QGA, 4.Nc3 +rnbqkb1r/ppp1pppp/5n2/8/2pP4/4PN2/PP3PPP/RNBQKB1R b KQkq - +QGA, 4.e3 +rnbqkb1r/ppp1pppp/5n2/8/2pP4/5N2/PP2PPPP/RNBQKB1R w KQkq - +Queen's gambit accepted +rnbqkb1r/ppp1pppp/5n2/8/Q1pP4/5N2/PP2PPPP/RNB1KB1R b KQkq - +QGA: Mannheim variation +rnbqkb1r/ppp1pppp/8/3n4/3P4/8/PPP2PPP/RNBQKBNR w KQkq - +Scandinavian: Marshall variation +rnbqkb1r/ppp1pppp/8/3n4/8/2N2N2/PP1PPPPP/R1BQKB1R b KQkq - +English: Anglo-Gr\"unfeld defense +rnbqkb1r/ppp1pppp/8/3np3/3P4/5N2/PPP2PPP/RNBQKB1R w KQkq - +Alekhine's defense: modern, Larsen variation +rnbqkb1r/ppp1pppp/8/8/1nPP4/8/PP3PPP/RNBQKBNR w KQkq - +Scandinavian: Kiel variation +rnbqkb1r/ppp2Npp/3p1n2/8/4P3/8/PPPP1PPP/RNBQKB1R b KQkq - +Petrov: Cochrane gambit +rnbqkb1r/ppp2p1p/5n2/3p4/4PpNP/8/PPPP2P1/RNBQKB1R w KQkq - +KGA: Kieseritsky, Berlin defense, Rivi\`ere variation +rnbqkb1r/ppp2p1p/5n2/3pN3/3PPBpP/8/PPP3P1/RN1QKB1R b KQkq - +KGA: Kieseritsky, Brentano defense +rnbqkb1r/ppp2p1p/8/3pN3/3PnBpP/8/PPPN2P1/R2QKB1R b KQkq - +KGA: Kieseritsky, Brentano defense, Caro variation +rnbqkb1r/ppp2pp1/4pn1p/3p2B1/2PP4/5N2/PP2PPPP/RN1QKB1R w KQkq - +QGD: Capablanca-Duras variation +rnbqkb1r/ppp2pp1/5n1p/3p2B1/3Np3/3P4/PPP1PPPP/RN1QKB1R w KQkq - +Alekhine's defense: modern, Panov variation * +rnbqkb1r/ppp2ppp/1n6/1B2p3/8/2N5/PPPP1PPP/R1BQK1NR b KQkq - +Scotch: Romanishin variation * +rnbqkb1r/ppp2ppp/1n6/4p3/2B5/2N5/PPPP1PPP/R1BQK1NR w KQkq - +Scotch: Potter variation * +rnbqkb1r/ppp2ppp/3p1n2/4N3/8/3P4/PPP2PPP/RNBQKB1R w KQkq - +Petrov: French attack * +rnbqkb1r/ppp2ppp/3p1n2/4P3/4P3/5N2/PPP2PPP/RNBQKB1R b KQkq - +Philidor: Nimzovich variation +rnbqkb1r/ppp2ppp/3p1n2/4p1N1/3PP3/8/PPP2PPP/RNBQKB1R b KQkq - +Philidor: Nimzovich, Locock variation +rnbqkb1r/ppp2ppp/3p1n2/4p3/2BPP3/5N2/PPP2PPP/RNBQK2R b KQkq - +Philidor: Nimzovich, Klein variation +rnbqkb1r/ppp2ppp/3p1n2/4p3/2PP4/2N2N2/PP2PPPP/R1BQKB1R b KQkq - +Old Indian: Ukrainian variation, 4.Nf3 +rnbqkb1r/ppp2ppp/3p1n2/4p3/2PP4/2N5/PP2PPPP/R1BQKBNR w KQkq - +Old Indian: Ukrainian variation +rnbqkb1r/ppp2ppp/3p1n2/4p3/3PP3/5N2/PPP2PPP/RNBQKB1R w KQkq - +Philidor: Nimzovich (Jaenisch) variation +rnbqkb1r/ppp2ppp/3p1n2/4p3/5P2/5N2/PPPPP1PP/RNBQKB1R w KQkq - +R\'eti: Lisitsin gambit deferred * +rnbqkb1r/ppp2ppp/3p1n2/8/2N1P3/8/PPPP1PPP/RNBQKB1R b KQkq - +Petrov: Paulsen attack +rnbqkb1r/ppp2ppp/3p1n2/8/3NP3/8/PPP2PPP/RNBQKB1R w KQkq - +Philidor: exchange variation +rnbqkb1r/ppp2ppp/3p1n2/8/3P4/5N2/PPP2PPP/RNBQKB1R w KQkq - +Petrov: classical attack, close variation +rnbqkb1r/ppp2ppp/3p4/3QP3/4n3/5N2/PPP2PPP/RNB1KB1R b KQkq - +Philidor: Nimzovich, Rellstab variation +rnbqkb1r/ppp2ppp/3p4/4P3/2P1P1n1/8/PP3PPP/RNBQKBNR w KQkq - +Budapest: Alekhine variation, Balogh gambit +rnbqkb1r/ppp2ppp/3p4/4P3/4n3/5N2/PPPN1PPP/R1BQKB1R b KQkq - +Philidor: Nimzovich, Sokolsky variation +rnbqkb1r/ppp2ppp/3p4/8/2P1n3/5N2/PP1P1PPP/RNBQKB1R b KQkq - +Petrov: Kaufmann attack +rnbqkb1r/ppp2ppp/3p4/8/3Pn3/5N2/PPP2PPP/RNBQKB1R b KQkq - +Petrov: classical attack +rnbqkb1r/ppp2ppp/3p4/8/4n3/2N2N2/PPPP1PPP/R1BQKB1R b KQkq - +Petrov: Nimzovich attack +rnbqkb1r/ppp2ppp/3p4/8/4n3/3P1N2/PPP2PPP/RNBQKB1R b KQkq - +Petrov: French attack +rnbqkb1r/ppp2ppp/3p4/8/4n3/5N2/PPPPQPPP/RNB1KB1R b KQkq - +Petrov: Cozio (Lasker) attack +rnbqkb1r/ppp2ppp/3pp3/2PnP3/2B5/2N5/PP1P1PPP/R1BQK1NR w KQkq - +Alekhine's defense: two pawns' attack, Mikenas variation +rnbqkb1r/ppp2ppp/4n3/3pP3/8/3P1Q2/PPP3PP/RNB1KBNR w KQkq - +Latvian: Nimzovich variation * +rnbqkb1r/ppp2ppp/4pn2/3P4/2P5/8/PP1P1PPP/RNBQKBNR w KQkq - +Scandinavian: Icelandic gambit +rnbqkb1r/ppp2ppp/4pn2/3P4/3P4/2N5/PP2PPPP/R1BQKBNR b KQkq - +QGD: exchange variation +rnbqkb1r/ppp2ppp/4pn2/3p2B1/2PP4/2N5/PP2PPPP/R2QKBNR b KQkq - +QGD: 4.Bg5 +rnbqkb1r/ppp2ppp/4pn2/3p2B1/2PP4/5N2/PP2PPPP/RN1QKB1R b KQkq - +QGD +rnbqkb1r/ppp2ppp/4pn2/3p4/2P5/5NP1/PP1PPP1P/RNBQKB1R w KQkq - +English: Neo-Catalan +rnbqkb1r/ppp2ppp/4pn2/3p4/2PP1B2/2N5/PP2PPPP/R2QKBNR b KQkq - +QGD: Harrwitz attack +rnbqkb1r/ppp2ppp/4pn2/3p4/2PP4/2N2N2/PP2PPPP/R1BQKB1R b KQkq - +QGD: 4.Nf3 +rnbqkb1r/ppp2ppp/4pn2/3p4/2PP4/2N5/PP2PPPP/R1BQKBNR w KQkq - +QGD: 3...Nf6 +rnbqkb1r/ppp2ppp/4pn2/3p4/2PP4/6P1/PP2PPBP/RNBQK1NR b KQkq - +Catalan: closed +rnbqkb1r/ppp2ppp/4pn2/3p4/3P4/3BPN2/PPP2PPP/RNBQK2R b KQkq - +Queen's pawn game +rnbqkb1r/ppp2ppp/4pn2/3p4/3P4/4PN2/PPP2PPP/RNBQKB1R b KQkq - +Queen's pawn game * +rnbqkb1r/ppp2ppp/4pn2/3p4/3P4/4PN2/PPP2PPP/RNBQKB1R w KQkq - +Queen's pawn game +rnbqkb1r/ppp2ppp/4pn2/3p4/3P4/5N2/PPP1PPPP/RNBQKB1R w KQkq - +Queen's pawn game * +rnbqkb1r/ppp2ppp/4pn2/3p4/3PP3/2N1B3/PPP2PPP/R2QKBNR b KQkq - +French: Henneberger variation +rnbqkb1r/ppp2ppp/4pn2/3p4/3PP3/2N5/PPP2PPP/R1BQKBNR w KQkq - +French defense +rnbqkb1r/ppp2ppp/4pn2/3p4/3PP3/2NB4/PPP2PPP/R1BQK1NR b KQkq - +French: Swiss variation +rnbqkb1r/ppp2ppp/4pn2/3p4/3PP3/8/PPPN1PPP/R1BQKBNR w KQkq - +French: Tarrasch, closed variation +rnbqkb1r/ppp2ppp/4pn2/3p4/8/4PN2/PPPP1PPP/RNBQKB1R w KQkq - +Queen's pawn: Yusupov-Rubinstein system * +rnbqkb1r/ppp2ppp/4pn2/3pP3/2P5/2N5/PP1P1PPP/R1BQKBNR b KQkq - +English: Mikenas-Carls, Flohr variation +rnbqkb1r/ppp2ppp/4pn2/3pP3/3P4/2N5/PPP2PPP/R1BQKBNR b KQkq - +French: Steinitz variation +rnbqkb1r/ppp2ppp/4pn2/6B1/3Pp3/2N5/PPP2PPP/R2QKBNR w KQkq - +French: Burn variation +rnbqkb1r/ppp2ppp/4pn2/8/2p5/5NP1/PP1PPPBP/RNBQK2R w KQkq - +English: Neo-Catalan accepted +rnbqkb1r/ppp2ppp/4pn2/8/2pP4/4PN2/PP3PPP/RNBQKB1R w KQkq - +QGA: 4...e6 +rnbqkb1r/ppp2ppp/4pn2/8/2pP4/5NP1/PP2PPBP/RNBQK2R b KQkq - +Catalan: open, 5.Nf3 +rnbqkb1r/ppp2ppp/4pn2/8/3P4/2N2N2/PPP3PP/R1BQKB1R w KQkq - +Blackmar-Diemer: Euwe defense +rnbqkb1r/ppp2ppp/4pn2/8/Q1pP4/6P1/PP2PPBP/RNB1K1NR b KQkq - +Catalan: open, 5.Qa4 +rnbqkb1r/ppp2ppp/5n2/3B4/4Pp2/8/PPPP2PP/RNBQK1NR w KQkq - +KGA: bishop's gambit, Morphy variation +rnbqkb1r/ppp2ppp/5n2/3Np3/4P3/8/PPPP1PPP/R1BQKBNR b KQkq - +Scotch: Lolli variation * +rnbqkb1r/ppp2ppp/5n2/3P4/4PP2/8/PPP3PP/RNBQKBNR b KQkq - +KGD: Falkbeer, 5.de +rnbqkb1r/ppp2ppp/5n2/3P4/4pP2/2N5/PPPPQ1PP/R1B1KBNR b KQkq - +KGD: Falkbeer, Rubinstein variation +rnbqkb1r/ppp2ppp/5n2/3P4/4pP2/3P4/PPP1Q1PP/RNB1KBNR b KQkq - +KGD: Falkbeer, R\'eti variation +rnbqkb1r/ppp2ppp/5n2/3P4/4pP2/3P4/PPPN2PP/R1BQKBNR b KQkq - +KGD: Falkbeer, Keres variation +rnbqkb1r/ppp2ppp/5n2/3P4/5p2/5N2/PPPP2PP/RNBQKB1R w KQkq - +KGA: Abbazia defense, modern variation +rnbqkb1r/ppp2ppp/5n2/3Pp3/8/3P4/PP2PPPP/RNBQKBNR b KQkq - +Sicilian * +rnbqkb1r/ppp2ppp/5n2/3Pp3/8/3P4/PPP2PPP/RNBQKBNR b KQkq - +Philidor: exchange variation * +rnbqkb1r/ppp2ppp/5n2/3Pp3/8/4P3/PP1P1PPP/RNBQKBNR b KQkq - +Sicilian defense * +rnbqkb1r/ppp2ppp/5n2/3p2B1/3Np3/3P4/PPP1PPPP/RN1QKB1R b KQkq - +Alekhine's defense: modern variation, 4...Bg4 * +rnbqkb1r/ppp2ppp/5n2/3p2B1/3P4/2N5/PP2PPPP/R2QKBNR b KQkq - +QGD: exchange, positional line +rnbqkb1r/ppp2ppp/5n2/3p2B1/3P4/2N5/PPP2PPP/R2QKBNR b KQkq - +French: exchange, Svenonius variation +rnbqkb1r/ppp2ppp/5n2/3p4/2PPp3/4P3/PP3PPP/RNBQKBNR w KQkq - +French: advance, Nimzovich system * +rnbqkb1r/ppp2ppp/5n2/3p4/3NP3/8/PPP1PPPP/RNBQKB1R b KQkq - +Alekhine's defense: modern, Larsen variation * +rnbqkb1r/ppp2ppp/5n2/3p4/3Np3/3P2P1/PPP1PP1P/RNBQKB1R b KQkq - +Alekhine's defense: modern, fianchetto variation * +rnbqkb1r/ppp2ppp/5n2/3p4/3Np3/3P4/PPP1PPPP/RNBQKB1R w KQkq - +Alekhine's defense: modern variation * +rnbqkb1r/ppp2ppp/5n2/3p4/4p3/1N1P4/PPP1PPPP/RNBQKB1R b KQkq - +Alekhine's defense: modern, Schmid variation * +rnbqkb1r/ppp2ppp/5n2/3p4/8/3P1N2/PPP2PPP/RNBQKB1R b KQkq - +Petrov: classical attack, close variation * +rnbqkb1r/ppp2ppp/5n2/3pN3/4P3/8/PPPP1PPP/RNBQKB1R b KQkq - +Petrov: modern attack, Symmetrical variation * +rnbqkb1r/ppp2ppp/5n2/3pN3/8/3P4/PPP2PPP/RNBQKB1R w KQkq - +Petrov: classical attack * +rnbqkb1r/ppp2ppp/5n2/3pp3/2P5/2N3P1/PP1PPP1P/R1BQKBNR w KQkq - +English: Bremen, reverse dragon +rnbqkb1r/ppp2ppp/5n2/3pp3/2P5/2N5/PP1PPPPP/R1BQKBNR w KQkq - +Sicilian defense * +rnbqkb1r/ppp2ppp/5n2/3pp3/2P5/3P1N2/PP2PPPP/RNBQKB1R b KQkq - +Sicilian: Cortlever (Alatortsev) variation * +rnbqkb1r/ppp2ppp/5n2/3pp3/2PP4/4P3/PP3PPP/RNBQKBNR b KQkq - +Sicilian: Marshall variation * +rnbqkb1r/ppp2ppp/5n2/3pp3/3PP3/2N5/PPP2PPP/R1BQKBNR w KQkq - +Blackmar-Diemer: Lemberg counter-gambit +rnbqkb1r/ppp2ppp/5n2/3pp3/4P3/2N5/PPPP1PPP/R1BQKBNR w KQkq - +Scotch opening * +rnbqkb1r/ppp2ppp/5n2/3pp3/4P3/3P1N2/PPP2PPP/RNBQKB1R b KQkq - +Philidor: Nimzovich (Jaenisch) variation * +rnbqkb1r/ppp2ppp/5n2/3pp3/4P3/3P4/PPP2PPP/RNBQKBNR w KQkq - +Philidor's defense * +rnbqkb1r/ppp2ppp/5n2/3pp3/4P3/3P4/PPPN1PPP/R1BQKBNR b KQkq - +Philidor: Hanham variation * +rnbqkb1r/ppp2ppp/5n2/3pp3/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - +Petrov: modern (Steinitz) attack * +rnbqkb1r/ppp2ppp/5n2/3pp3/4PP2/2N5/PPPP2PP/R1BQKBNR w KQkq - +Vienna gambit +rnbqkb1r/ppp2ppp/5n2/3pp3/4PP2/2NP4/PPP3PP/R1BQKBNR b KQkq - +Vienna gambit, Steinitz variation +rnbqkb1r/ppp2ppp/5n2/3pp3/4PP2/3P4/PPP3PP/RNBQKBNR b KQkq - +Philidor: Philidor counter-gambit * +rnbqkb1r/ppp2ppp/5n2/4p2Q/8/2N5/PPPP1PPP/R1B1KBNR w KQkq - +Scotch: Fraser attack * +rnbqkb1r/ppp2ppp/5n2/4p3/4p3/3P1N2/PPP2PPP/RNBQKB1R w KQkq - +Philidor: Nimzovich variation * +rnbqkb1r/ppp2ppp/8/3P4/4nP2/8/PPP1Q1PP/RNB1KBNR b KQkq - +KGD: Falkbeer, Charousek gambit +rnbqkb1r/ppp2ppp/8/3n4/3p4/8/PPP2PPP/RNBQKBNR w KQkq - +Philidor: Paulsen attack * +rnbqkb1r/ppp2ppp/8/3np2Q/8/2N5/PPPP1PPP/R1B1KBNR b KQkq - +Scotch: Pulling counter-attack * +rnbqkb1r/ppp2ppp/8/3np3/2B5/2N5/PPPP1PPP/R1BQK1NR b KQkq - +Scotch game * +rnbqkb1r/ppp2ppp/8/3np3/3P4/2N5/PP2PPPP/R1BQKBNR b KQkq - +Sicilian: Nimzovich variation * +rnbqkb1r/ppp2ppp/8/3np3/4P3/2N5/PP1P1PPP/R1BQKBNR b KQkq - +Sicilian: Labourdonnais-L\"owenthal variation * +rnbqkb1r/ppp2ppp/8/3np3/8/2N1P3/PP1P1PPP/R1BQKBNR b KQkq - +Sicilian defense * +rnbqkb1r/ppp2ppp/8/3np3/8/2N2N2/PP1PPPPP/R1BQKB1R b KQkq - +Sicilian defense * +rnbqkb1r/ppp2ppp/8/3np3/8/2N2N2/PPPP1PPP/R1BQKB1R b KQkq - +Scotch: Schmidt variation * +rnbqkb1r/ppp2ppp/8/3np3/8/2N5/PPPP1PPP/R1BQKBNR w KQkq - +Scotch game * +rnbqkb1r/ppp2ppp/8/3np3/8/2N5/PPQPPPPP/R1B1KBNR b KQkq - +Sicilian: Flohr variation * +rnbqkb1r/ppp2ppp/8/3np3/8/3P1N2/PPP2PPP/RNBQKB1R b KQkq - +Philidor: exchange variation * +rnbqkb1r/ppp2ppp/8/3np3/8/3P2P1/PPP2P1P/RNBQKBNR b KQkq - +Philidor: Larsen variation * +rnbqkb1r/ppp2ppp/8/3np3/8/3P4/PP2PPPP/RNBQKBNR w KQkq - +Sicilian * +rnbqkb1r/ppp2ppp/8/3np3/8/3P4/PPP2PPP/RNBQKBNR w KQkq - +Philidor: exchange variation * +rnbqkb1r/ppp2ppp/8/3np3/8/4PN2/PP1P1PPP/RNBQKB1R b KQkq - +Sicilian: Anderssen variation * +rnbqkb1r/ppp2ppp/8/3np3/8/P3P3/1P1P1PPP/RNBQKBNR b KQkq - +Sicilian: Kan variation * +rnbqkb1r/ppp2ppp/8/3pP3/4n3/2N2Q2/PPPP2PP/R1B1KBNR b KQkq - +Vienna gambit: Paulsen attack +rnbqkb1r/ppp2ppp/8/3pP3/4n3/2NP4/PPP3PP/R1BQKBNR b KQkq - +Vienna gambit +rnbqkb1r/ppp2ppp/8/3pp3/2B1n3/2N2N2/PPPP1PPP/R1BQK2R w KQkq - +Boden-Kieseritsky gambit: Lichtenhein defense +rnbqkb1r/ppp2ppp/8/3pp3/4N3/8/PPPP1PPP/R1BQKBNR w KQkq - +Irish (Chicago) gambit * +rnbqkb1r/ppp2ppp/8/3pp3/4P1n1/3P1N2/PPP2PPP/RNBQKB1R w KQkq - +Philidor: Nimzovich, Locock variation * +rnbqkb1r/ppp2ppp/8/4P3/3P2n1/4p3/PPP3PP/RNBQKBNR w KQkq - +Philidor: Philidor counter-gambit, del Rio attack * +rnbqkb1r/ppp2ppp/8/4p2Q/1n6/2N5/PPPP1PPP/R1B1KBNR w KQkq - +Scotch: Horwitz attack * +rnbqkb1r/ppp2ppp/8/4p3/1n2P3/2NP4/PP3PPP/R1BQKBNR b KQkq - +Sicilian: Labourdonnais-L\"owenthal (Kalashnikov) variation * +rnbqkb1r/ppp2ppp/8/4p3/1n6/2N1P3/PP1P1PPP/R1BQKBNR w KQkq - +Sicilian, Sz\'en (`anti-Taimanov') variation * +rnbqkb1r/ppp2ppp/8/4p3/8/2n3P1/PP1PPP1P/R1BQKBNR w KQkq - +Sicilian: accelerated fianchetto, exchange variation * +rnbqkb1r/ppp2ppp/8/8/4p3/2P2N2/P1PP1PPP/R1BQKB1R w KQkq - +Scotch: Mieses variation * +rnbqkb1r/ppp3p1/8/3ppPPp/8/7P/PPPP1K2/RNBQ1BNR w kq - +KGA: Allgaier, Thorold variation * +rnbqkb1r/ppp3pN/3p3n/5p2/2BpP3/8/PPP2PPP/RNBQK2R b KQkq - +Philidor: L\'opez counter-gambit, Jaenisch variation +rnbqkb1r/ppp3pp/5n2/3ppP2/6P1/8/PPPP1P1P/RNBQKBNR w KQkq - +KGA: Rosentreter gambit * +rnbqkb1r/ppp3pp/5p2/3np3/8/3P1N2/PP2PPPP/RNBQKB1R w KQkq - +Sicilian: Prins (Moscow) variation * +rnbqkb1r/ppp3pp/8/3pPp2/3Pn3/2N2Q2/PPP3PP/R1B1KBNR b KQkq - +Vienna gambit: Heyde variation +rnbqkb1r/ppp3pp/8/3pPp2/4n3/2N2Q2/PPPP2PP/R1B1KBNR w KQkq f6 +Vienna gambit: Bardeleben variation +rnbqkb1r/ppp3pp/8/3ppPP1/4n3/8/PPPP1P1P/RNBQKBNR w KQkq - +KGA: S\o rensen gambit * +rnbqkb1r/pppn1ppp/4p3/3pP3/3P2Q1/2N5/PPP2PPP/R1B1KBNR b KQkq - +French: Steinitz, Gledhill attack +rnbqkb1r/pppnpppp/4P3/3p4/8/2N5/PPPP1PPP/R1BQKBNR b KQkq - +Alekhine's defense: Spielmann variation +rnbqkb1r/pppp1p1p/5n2/4N3/2B1PppP/8/PPPP2P1/RNBQK2R b KQkq - +KGA: Kieseritsky, Berlin defense, 6.Bc4 +rnbqkb1r/pppp1p1p/5n2/4N3/4PppP/8/PPPP2P1/RNBQKB1R w KQkq - +KGA: Kieseritsky, Berlin defense +rnbqkb1r/pppp1p1p/5n2/6N1/4PppP/8/PPPP2P1/RNBQKB1R w KQkq - +KGA: Allgaier, Schlechter defense +rnbqkb1r/pppp1p1p/5np1/4p3/2P5/2N3P1/PP1PPP1P/R1BQKBNR w KQkq - +English: Bremen system with ...g6 +rnbqkb1r/pppp1p1p/5np1/4p3/4P3/2N5/PPPP1PPP/R1BQKBNR w KQkq - +Konstantinopolsky opening * +rnbqkb1r/pppp1ppp/2n5/8/2P1PP2/8/PP4PP/RNBQKBNR w KQkq - +Budapest: Alekhine, Abonyi variation +rnbqkb1r/pppp1ppp/4p3/8/2PPn3/5N2/PP2PPPP/RNBQKB1R w KQkq - +D\"ory defense +rnbqkb1r/pppp1ppp/4pn2/6B1/2PP4/8/PP2PPPP/RN1QKBNR b KQkq - +Neo-Indian (Seirawan) attack +rnbqkb1r/pppp1ppp/4pn2/6B1/3P4/5N2/PPP1PPPP/RN1QKB1R b KQkq - +Queen's pawn: Torre attack +rnbqkb1r/pppp1ppp/4pn2/8/2P1P3/2N5/PP1P1PPP/R1BQKBNR b KQkq - +English: Mikenas-Carls variation +rnbqkb1r/pppp1ppp/4pn2/8/2P5/2N5/PP1PPPPP/R1BQKBNR w KQkq - +English opening +rnbqkb1r/pppp1ppp/4pn2/8/2PP4/5N2/PP2PPPP/RNBQKB1R b KQkq - +Queen's pawn game +rnbqkb1r/pppp1ppp/4pn2/8/2PP4/6P1/PP2PP1P/RNBQKBNR b KQkq - +Catalan opening +rnbqkb1r/pppp1ppp/4pn2/8/2PP4/8/PP2PPPP/RNBQKBNR w KQkq - +Queen's pawn game +rnbqkb1r/pppp1ppp/4pn2/8/3P4/4PN2/PPP2PPP/RNBQKB1R b KQkq - +Queen's pawn: Yusupov-Rubinstein system +rnbqkb1r/pppp1ppp/5n2/4p1B1/8/3P4/PPP1PPPP/RN1QKBNR b KQkq - +R\'eti: Wade defense * +rnbqkb1r/pppp1ppp/5n2/4p3/2B1P3/2N5/PPPP1PPP/R1BQK1NR b KQkq - +Vienna game +rnbqkb1r/pppp1ppp/5n2/4p3/2B1P3/5N2/PPPP1PPP/RNBQK2R b KQkq - +Petrov: Italian variation +rnbqkb1r/pppp1ppp/5n2/4p3/2B1P3/8/PPPP1PPP/RNBQK1NR w KQkq - +Bishop's opening: Berlin defense +rnbqkb1r/pppp1ppp/5n2/4p3/2B1PP2/8/PPPP2PP/RNBQK1NR b KQkq - +Bishop's opening: Greco gambit +rnbqkb1r/pppp1ppp/5n2/4p3/2BPP3/8/PPP2PPP/RNBQK1NR b KQkq - +Bishop's opening: Ponziani gambit +rnbqkb1r/pppp1ppp/5n2/4p3/2P5/1P6/P2PPPPP/RNBQKBNR b KQkq - +Sicilian: Katalimov variation * +rnbqkb1r/pppp1ppp/5n2/4p3/2P5/2N3P1/PP1PPP1P/R1BQKBNR b KQkq - +English: Carls' Bremen system +rnbqkb1r/pppp1ppp/5n2/4p3/2P5/2N5/PP1PPPPP/R1BQKBNR b KQkq - +Sicilian defense * +rnbqkb1r/pppp1ppp/5n2/4p3/2P5/2N5/PP1PPPPP/R1BQKBNR w KQkq - +English opening +rnbqkb1r/pppp1ppp/5n2/4p3/2P5/3P4/PP2PPPP/RNBQKBNR b KQkq - +Sicilian * +rnbqkb1r/pppp1ppp/5n2/4p3/2P5/4P3/PP1P1PPP/RNBQKBNR b KQkq - +Sicilian defense * +rnbqkb1r/pppp1ppp/5n2/4p3/2P5/5N2/PP1PPPPP/RNBQKB1R b KQkq - +Sicilian: Nimzovich-Rubinstein variation * +rnbqkb1r/pppp1ppp/5n2/4p3/2P5/6P1/PP1PPP1P/RNBQKBNR b KQkq - +Sicilian: Hungarian variation * +rnbqkb1r/pppp1ppp/5n2/4p3/2P5/8/PP1PPPPP/RNBQKBNR w KQkq - +Sicilian defense * +rnbqkb1r/pppp1ppp/5n2/4p3/2P5/8/PPQPPPPP/RNB1KBNR b KQkq - +Sicilian: Quinteros variation * +rnbqkb1r/pppp1ppp/5n2/4p3/2P5/P7/1P1PPPPP/RNBQKBNR b KQkq - +Sicilian: O'Kelly variation * +rnbqkb1r/pppp1ppp/5n2/4p3/2PP4/8/PP2PPPP/RNBQKBNR w KQkq - +Budapest defense declined +rnbqkb1r/pppp1ppp/5n2/4p3/3P4/8/PPP1PPPP/RNBQKBNR w KQkq - +Tennison (Lemberg, Zukertort) gambit * +rnbqkb1r/pppp1ppp/5n2/4p3/3PP3/5N2/PPP2PPP/RNBQKB1R b KQkq - +Petrov: modern (Steinitz) attack +rnbqkb1r/pppp1ppp/5n2/4p3/3PP3/8/PPP2PPP/RNBQKBNR b KQkq - +QP counter-gambit (elephant gambit) * +rnbqkb1r/pppp1ppp/5n2/4p3/4P3/2N2N2/PPPP1PPP/R1BQKB1R b KQkq - +Petrov three knights game +rnbqkb1r/pppp1ppp/5n2/4p3/4P3/2N3P1/PPPP1P1P/R1BQKBNR b KQkq - +Vienna: Paulsen-Mieses variation +rnbqkb1r/pppp1ppp/5n2/4p3/4P3/2N5/PPPP1PPP/R1BQKBNR b KQkq - +King's pawn game * +rnbqkb1r/pppp1ppp/5n2/4p3/4P3/2N5/PPPP1PPP/R1BQKBNR w KQkq - +Vienna: Falkbeer variation +rnbqkb1r/pppp1ppp/5n2/4p3/4P3/3P4/PPP2PPP/RNBQKBNR b KQkq - +Philidor's defense * +rnbqkb1r/pppp1ppp/5n2/4p3/4P3/5N2/PPPP1PPP/RNBQKB1R b KQkq - +Petrov's defense * +rnbqkb1r/pppp1ppp/5n2/4p3/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - +Petrov's defense +rnbqkb1r/pppp1ppp/5n2/4p3/4P3/5P2/PPPP2PP/RNBQKBNR b KQkq - +Damiano's defense * +rnbqkb1r/pppp1ppp/5n2/4p3/4P3/5Q2/PPPP1PPP/RNB1KBNR b KQkq - +Greco defense * +rnbqkb1r/pppp1ppp/5n2/4p3/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +King's knight opening * +rnbqkb1r/pppp1ppp/5n2/4p3/4P3/8/PPPPQPPP/RNB1KBNR b KQkq - +Gunderam defense * +rnbqkb1r/pppp1ppp/5n2/4p3/4P3/P1N5/1PPP1PPP/R1BQKBNR b KQkq - +Vienna: Mengarini variation +rnbqkb1r/pppp1ppp/5n2/4p3/4PP2/2N5/PPPP2PP/R1BQKBNR b KQkq - +Vienna gambit +rnbqkb1r/pppp1ppp/5n2/4p3/4PP2/8/PPPP2PP/RNBQKBNR b KQkq - +Latvian counter-gambit * +rnbqkb1r/pppp1ppp/5n2/4p3/4PP2/8/PPPP2PP/RNBQKBNR w KQkq - +KGD: 2...Nf6 +rnbqkb1r/pppp1ppp/5n2/4p3/5P2/2N5/PPPPP1PP/R1BQKBNR b KQkq - +KP: Colorado counter * +rnbqkb1r/pppp1ppp/5n2/4p3/5P2/8/PPPPP1PP/RNBQKBNR w KQkq - +R\'eti: Pirc-Lisitsin gambit * +rnbqkb1r/pppp1ppp/5n2/4p3/8/2N5/PPPPPPPP/R1BQKBNR w KQkq - +KP: Nimzovich defense * +rnbqkb1r/pppp1ppp/5n2/4p3/8/4P3/PPPP1PPP/RNBQKBNR w KQkq - +French defense * +rnbqkb1r/pppp1ppp/5n2/4p3/Q1P5/8/PP1PPPPP/RNB1KBNR b KQkq - +Sicilian: Stiletto (Althouse) variation * +rnbqkb1r/pppp1ppp/5n2/8/2B1Pp2/2N5/PPPP2PP/R1BQK1NR b KQkq - +KGA: bishop's gambit, Bogolyubov variation +rnbqkb1r/pppp1ppp/5n2/8/2B1Pp2/8/PPPP2PP/RNBQK1NR w KQkq - +KGA: bishop's gambit, Cozio (Morphy) defense +rnbqkb1r/pppp1ppp/5n2/8/2BpP3/5N2/PPP2PPP/RNBQK2R b KQkq - +Bishop's opening/Petrov: Urusov gambit +rnbqkb1r/pppp1ppp/5n2/8/3pP3/3B4/PPP2PPP/RNBQK1NR b KQkq - +QP counter-gambit: Maroczy gambit * +rnbqkb1r/pppp1ppp/5n2/8/4Pp2/5N2/PPPP2PP/RNBQKB1R w KQkq - +KGA: Schallop defense +rnbqkb1r/pppp1ppp/8/2n1p3/8/3P1N2/PPP2PPP/RNBQKB1R w KQkq - +Petrov: Paulsen attack * +rnbqkb1r/pppp1ppp/8/4N3/4n3/8/PPPP1PPP/RNBQKB1R b KQkq - +Petrov: Damiano variation * +rnbqkb1r/pppp1ppp/8/4N3/4n3/8/PPPP1PPP/RNBQKB1R w KQkq - +Petrov: Damiano variation +rnbqkb1r/pppp1ppp/8/4P3/2P1P1n1/8/PP3PPP/RNBQKBNR b KQkq - +Budapest: Alekhine variation +rnbqkb1r/pppp1ppp/8/4P3/2P1n3/8/PP2PPPP/RNBQKBNR w KQkq - +Budapest: Fajarowicz variation +rnbqkb1r/pppp1ppp/8/4P3/2P1n3/8/PPQ1PPPP/RNB1KBNR b KQkq - +Budapest: Fajarowicz, Steiner variation +rnbqkb1r/pppp1ppp/8/4P3/2P2Bn1/8/PP2PPPP/RN1QKBNR b KQkq - +Budapest: Rubinstein variation +rnbqkb1r/pppp1ppp/8/4P3/2P3n1/5N2/PP2PPPP/RNBQKB1R b KQkq - +Budapest: Adler variation +rnbqkb1r/pppp1ppp/8/4P3/2P3n1/8/PP2PPPP/RNBQKBNR w KQkq - +Budapest defense +rnbqkb1r/pppp1ppp/8/4P3/3Qn3/5N2/PPP2PPP/RNB1KB1R b KQkq - +Petrov: modern attack, main line +rnbqkb1r/pppp1ppp/8/4P3/3pn3/5N2/PPP1QPPP/RNB1KB1R b KQkq - +Petrov: modern attack, Steinitz variation +rnbqkb1r/pppp1ppp/8/4p3/2B1n3/2N2N2/PPPP1PPP/R1BQK2R b KQkq - +Boden-Kieseritsky gambit +rnbqkb1r/pppp1ppp/8/4p3/2B1n3/2N5/PPPP1PPP/R1BQK1NR w KQkq - +Vienna game +rnbqkb1r/pppp1ppp/8/4p3/3Pn3/5N2/PPP2PPP/RNBQKB1R w KQkq - +Petrov: modern attack, Symmetrical variation +rnbqkb1r/pppp1ppp/8/4p3/4nP2/2N5/PPPP2PP/R1BQKBNR b KQkq - +Latvian: Fraser defense * +rnbqkb1r/pppp1ppp/8/4p3/8/3P1N2/PPP2nPP/RNBQKB1R w KQkq - +Petrov: Cochrane gambit * +rnbqkb1r/pppp2p1/5n2/4pP1p/6P1/8/PPPP1P1P/RNBQKBNR w KQkq - +King's knight's gambit * +rnbqkb1r/pppp2p1/8/4pPPp/3Pn3/8/PPP2P1P/RNBQKBNR b KQkq - +KGA: Kieseritsky, Brentano (Campbell) defense * +rnbqkb1r/pppp2p1/8/4pPPp/4n2P/8/PPPP1P2/RNBQKBNR b KQkq - +KGA: Kieseritsky, long whip (Stockwhip, classical) defense * +rnbqkb1r/pppp2p1/8/4pPPp/4n3/2N5/PPPP1P1P/R1BQKBNR b KQkq - +KGA: Kieseritsky, Neumann defense * +rnbqkb1r/pppp2p1/8/4pPPp/4n3/3P4/PPP2P1P/RNBQKBNR b KQkq - +KGA: Kieseritsky, Kolisch defense * +rnbqkb1r/pppp2p1/8/4pPPp/4n3/5N2/PPPP1P1P/RNBQKB1R b KQkq - +KGA: Kieseritsky, Berlin defense * +rnbqkb1r/pppp2p1/8/4pPPp/4n3/8/PPPP1PBP/RNBQK1NR b KQkq - +KGA: Kieseritsky, Paulsen defense * +rnbqkb1r/pppp2p1/8/4pPPp/4n3/8/PPPPBP1P/RNBQK1NR b KQkq - +KGA: Kieseritsky, Polerio defense * +rnbqkb1r/pppp2p1/8/4pPPp/4n3/8/PPPPQP1P/RNB1KBNR b KQkq - +KGA: Kieseritsky, Salvio (Rosenthal) defense * +rnbqkb1r/pppp2p1/8/4pPPp/6n1/5N2/PPPP1P1P/RNBQKB1R b KQkq - +KGA: Allgaier, Schlechter defense * +rnbqkb1r/pppp2p1/8/4pPPp/6n1/8/PPPP1P1P/RNBQKBNR w KQkq - +KGA: Allgaier gambit * +rnbqkb1r/pppp2p1/8/4pPnp/3P4/5N2/PPP2P1P/RNBQKB1R b KQkq - +KGA: Kieseritsky, Berlin defense, Rivi\`ere variation * +rnbqkb1r/pppp2pp/4pn2/5p2/2PP4/5N2/PP2PPPP/RNBQKB1R b KQkq - +Bird's opening: Lasker variation * +rnbqkb1r/pppp2pp/4pn2/5p2/2PP4/6P1/PP2PPBP/RNBQK1NR b KQkq - +Dutch defense +rnbqkb1r/pppp2pp/4pn2/5p2/3P4/6PN/PPP1PPBP/RNBQK2R b KQkq - +Dutch defense, Blackburne variation +rnbqkb1r/pppp2pp/5n2/4N3/2B1p3/8/PPPP1PPP/RNBQK2R w KQkq - +Latvian: corkscrew counter-gambit +rnbqkb1r/pppp2pp/5n2/4p3/2B1p3/3P4/PPP2PPP/RNBQK1NR w KQkq - +KGD: classical, Soldatenkov variation * +rnbqkb1r/pppp2pp/5n2/4pP2/3P4/8/PPP2PPP/RNBQKBNR b KQkq - +KGA: Abbazia defense (classical defense, modern defense[!]) * +rnbqkb1r/pppp2pp/5n2/4pP2/5P2/8/PPPP2PP/RNBQKBNR b KQkq - +KGA: Gianutio counter-gambit * +rnbqkb1r/pppp2pp/5n2/4pP2/8/3P4/PPP2PPP/RNBQKBNR b KQkq - +KGA: Fischer defense * +rnbqkb1r/pppp2pp/5n2/4pP2/8/5N2/PPPP1PPP/RNBQKB1R b KQkq - +KGA: Schallop defense * +rnbqkb1r/pppp2pp/5n2/4pP2/8/7P/PPPP1PP1/RNBQKBNR b KQkq - +KGA: Becker defense * +rnbqkb1r/pppp2pp/5n2/4pP2/8/8/PPPP1PPP/RNBQKBNR w KQkq - +King's knight's gambit * +rnbqkb1r/pppp2pp/5n2/4pP2/8/8/PPPPBPPP/RNBQK1NR b KQkq - +KGA: Cunningham defense * +rnbqkb1r/pppp2pp/5n2/4pP2/8/8/PPPPNPPP/RNBQKB1R b KQkq - +KGA: Bonsch-Osmolovsky variation * +rnbqkb1r/pppp2pp/5n2/4pp2/3PP3/8/PPP2PPP/RNBQKBNR w KQkq - +KGD: Falkbeer, Tartakower variation * +rnbqkb1r/pppp2pp/5n2/5P2/3p4/5N2/PPP2PPP/RNBQKB1R b KQkq - +KGA: Abbazia defense, modern variation * +rnbqkb1r/ppppnppp/8/4p3/2P5/8/PP1PPPPP/RNBQKBNR w KQkq - +Sicilian: Keres variation (2.Ne2) * +rnbqkb1r/ppppnppp/8/4p3/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +Alapin's opening * +rnbqkb1r/ppppnppp/8/8/2B1Pp2/8/PPPP2PP/RNBQK1NR w KQkq - +KGA: bishop's gambit, Steinitz defense +rnbqkb1r/ppppnppp/8/8/4Pp2/5N2/PPPP2PP/RNBQKB1R w KQkq - +KGA: Bonsch-Osmolovsky variation +rnbqkb1r/ppppp1pp/5n2/5p2/2PP4/2N5/PP2PPPP/R1BQKBNR b KQkq - +Dutch with c4 & Nc3 +rnbqkb1r/ppppp1pp/5n2/5p2/2PP4/6P1/PP2PP1P/RNBQKBNR b KQkq - +Dutch with c4 & g3 +rnbqkb1r/ppppp1pp/5n2/5p2/2PP4/8/PP2PPPP/RNBQKBNR w KQkq - +Dutch defense +rnbqkb1r/ppppp1pp/5n2/5p2/3P2P1/2N5/PPP1PP1P/R1BQKBNR b KQkq - +Dutch, Spielmann gambit +rnbqkb1r/ppppp1pp/5n2/5p2/4P3/3P1N2/PPP2PPP/RNBQKB1R b KQkq - +R\'eti: Lisitsin gambit deferred +rnbqkb1r/ppppp1pp/5n2/6B1/3Pp3/2N5/PPP2PPP/R2QKBNR b KQkq - +Dutch: Staunton gambit, Staunton's line +rnbqkb1r/ppppp1pp/5n2/8/3Pp1P1/2N5/PPP2P1P/R1BQKBNR b KQkq - +Dutch: Staunton gambit, Tartakower variation +rnbqkb1r/ppppp1pp/5n2/8/4pPP1/2N5/PPPP3P/R1BQKBNR b KQkq - +Bird's opening, Swiss gambit +rnbqkb1r/ppppp1pp/5n2/8/6P1/3B4/PPP2P1P/RNBQK1NR b KQkq - +Bird: From gambit, Lasker variation * +rnbqkb1r/ppppp2p/5np1/5p2/2PP4/6P1/PP2PP1P/RNBQKBNR w KQkq - +Dutch: Leningrad variation +rnbqkb1r/ppppp2p/5np1/5p2/3P4/6P1/PPP1PPBP/RNBQK1NR w KQkq - +Dutch defense +rnbqkb1r/ppppp2p/5np1/6B1/3Pp2P/2N5/PPP2PP1/R2QKBNR b KQkq - +Dutch: Staunton gambit, Alekhine variation +rnbqkb1r/ppppp2p/5np1/6B1/3Pp3/2N2P2/PPP3PP/R2QKBNR b KQkq - +Dutch: Staunton gambit, Lasker variation +rnbqkb1r/ppppp2p/5ppn/8/2PPP3/8/PP3PPP/RNBQKBNR w KQkq - +Hippopotamus defense +rnbqkb1r/ppppp2p/6pn/5p2/2PP4/2N5/PP2PPPP/R1BQKBNR w KQkq - +Dutch defense: Bladel variation +rnbqkb1r/pppppp1p/5np1/3P4/2P5/8/PP2PPPP/RNBQKBNR b KQkq - +King's Indian: Anti-Gr\"unfeld +rnbqkb1r/pppppp1p/5np1/6B1/3P4/5N2/PPP1PPPP/RN1QKB1R b KQkq - +King's Indian: Torre attack +rnbqkb1r/pppppp1p/5np1/8/1P6/5N2/P1PPPPPP/RNBQKB1R b KQkq - +R\'eti: King's Indian attack, Spassky's variation * +rnbqkb1r/pppppp1p/5np1/8/1P6/5NP1/P1PPPP1P/RNBQKB1R b KQkq - +R\'eti: King's Indian attack, R\'eti-Smyslov variation +rnbqkb1r/pppppp1p/5np1/8/2PP4/2N5/PP2PPPP/R1BQKBNR b KQkq - +King's Indian defense, 3.Nc3 +rnbqkb1r/pppppp1p/5np1/8/2PP4/5N2/PP2PPPP/RNBQKB1R b KQkq - +King's Indian, 3.Nf3 +rnbqkb1r/pppppp1p/5np1/8/2PP4/6P1/PP2PP1P/RNBQKBNR b KQkq - +King's Indian: 3.g3 +rnbqkb1r/pppppp1p/5np1/8/2PP4/8/PP2PPPP/RNBQKBNR b KQkq - +R\'eti: King's Indian attack (with ...c5) * +rnbqkb1r/pppppp1p/5np1/8/2PP4/8/PP2PPPP/RNBQKBNR w KQkq - +King's Indian defense +rnbqkb1r/pppppp1p/5np1/8/2PP4/8/PPQ1PPPP/RNB1KBNR b KQkq - +Queen's pawn: Mengarini attack +rnbqkb1r/pppppp1p/5np1/8/3P1B2/5N2/PPP1PPPP/RN1QKB1R b KQkq - +King's Indian: London system +rnbqkb1r/pppppp1p/5np1/8/3P4/5N2/PPP1PPPP/RNBQKB1R w KQkq - +King's Indian: East Indian defense +rnbqkb1r/pppppp1p/5np1/8/3P4/5NP1/PPP1PP1P/RNBQKB1R b KQkq - +King's Indian: fianchetto without c4 +rnbqkb1r/pppppp1p/5np1/8/3P4/6P1/PPP1PP1P/RNBQKBNR b KQkq - +R\'eti: King's Indian attack * +rnbqkb1r/pppppp1p/5np1/8/3P4/8/PPP1PPPP/RNBQKBNR w KQkq - +R\'eti: King's Indian attack (Barcza system) * +rnbqkb1r/pppppp1p/5np1/8/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +Benko's opening: reversed Alekhine * +rnbqkb1r/pppppp1p/5np1/8/8/5NP1/PPPPPP1P/RNBQKB1R b KQkq - +R\'eti: King's Indian attack * +rnbqkb1r/pppppp1p/5np1/8/8/5NP1/PPPPPP1P/RNBQKB1R w KQkq - +R\'eti: King's Indian attack +rnbqkb1r/ppppppnp/6p1/4P3/3P2P1/8/PPP2P1P/RNBQKBNR w KQkq - +Norwegian defense +rnbqkb1r/pppppppp/1n6/2P1P3/8/8/PP1P1PPP/RNBQKBNR b KQkq - +Alekhine's defense: two pawns' (Lasker's) attack +rnbqkb1r/pppppppp/1n6/4P3/2P5/1P6/P2P1PPP/RNBQKBNR b KQkq - +Alekhine's defense: Steiner variation +rnbqkb1r/pppppppp/5n2/6B1/3P4/8/PPP1PPPP/RN1QKBNR b KQkq - +Trompovsky attack (Ruth, Opo\v censk\'y opening) +rnbqkb1r/pppppppp/5n2/8/1PP5/8/P2PPPPP/RNBQKBNR b KQkq - +English orang-utan +rnbqkb1r/pppppppp/5n2/8/2B1P3/8/PPPP1PPP/RNBQK1NR b KQkq - +Alekhine's defense: Krejcik variation +rnbqkb1r/pppppppp/5n2/8/2P5/2N5/PP1PPPPP/R1BQKBNR b KQkq - +English opening +rnbqkb1r/pppppppp/5n2/8/2P5/5N2/PP1PPPPP/RNBQKB1R b KQkq - +English opening +rnbqkb1r/pppppppp/5n2/8/2P5/8/PP1PPPPP/RNBQKBNR w KQkq - +English, 1...Nf6 (Anglo-Indian defense) +rnbqkb1r/pppppppp/5n2/8/2PP4/8/PP2PPPP/RNBQKBNR b KQkq - +Queen's pawn game +rnbqkb1r/pppppppp/5n2/8/3P1B2/8/PPP1PPPP/RN1QKBNR b KQkq - +Queen's pawn: London system +rnbqkb1r/pppppppp/5n2/8/3P1P2/8/PPP1P1PP/RNBQKBNR b KQkq - +Canard opening +rnbqkb1r/pppppppp/5n2/8/3P2P1/8/PPP1PP1P/RNBQKBNR b KQkq - +Queen's pawn: Bronstein gambit +rnbqkb1r/pppppppp/5n2/8/3P4/5N2/PPP1PPPP/RNBQKB1R b KQkq - +Queen's pawn game +rnbqkb1r/pppppppp/5n2/8/3P4/5P2/PPP1P1PP/RNBQKBNR b KQkq - +Paleface attack +rnbqkb1r/pppppppp/5n2/8/3P4/8/PPP1PPPP/RNBQKBNR b KQkq - +R\'eti opening * +rnbqkb1r/pppppppp/5n2/8/3P4/8/PPP1PPPP/RNBQKBNR w KQkq - +Queen's pawn game +rnbqkb1r/pppppppp/5n2/8/4P3/3P4/PPP2PPP/RNBQKBNR b KQkq - +Alekhine's defense: Mar\'oczy variation +rnbqkb1r/pppppppp/5n2/8/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +Alekhine's defense +rnbqkb1r/pppppppp/5n2/8/5P2/8/PPPPP1PP/RNBQKBNR b KQkq - +R\'eti v Dutch * +rnbqkb1r/pppppppp/5n2/8/6P1/8/PPPPPP1P/RNBQKBNR b KQkq - +R\'eti: Herrstr\"om gambit * +rnbqkb1r/pppppppp/5n2/8/8/1P6/P1PPPPPP/RNBQKBNR w KQkq - +Nimzovich-Larsen attack: Indian variation +rnbqkb1r/pppppppp/5n2/8/8/3P4/PPP1PPPP/RNBQKBNR b KQkq - +R\'eti opening * +rnbqkb1r/pppppppp/5n2/8/8/5N2/PPPPPPPP/RNBQKB1R b KQkq - +R\'eti opening * +rnbqkb1r/pppppppp/5n2/8/8/5N2/PPPPPPPP/RNBQKB1R w KQkq - +R\'eti opening +rnbqkb1r/pppppppp/5n2/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - +R\'eti opening * +rnbqkb1r/pppppppp/7n/8/1P6/8/P1PPPPPP/RNBQKBNR w KQkq - +Polish: T\"ubingen variation +rnbqkb1r/pppppppp/7n/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - +Amar (Paris) opening * +rnbqkb1r/pppppppp/8/3nP3/2P5/8/PP1P1PPP/RNBQKBNR b KQkq - +Alekhine's defense +rnbqkb1r/pppppppp/8/3nP3/3P4/8/PPP2PPP/RNBQKBNR b KQkq - +Alekhine's defense +rnbqkb1r/pppppppp/8/3nP3/8/1P6/P1PP1PPP/RNBQKBNR b KQkq - +Alekhine's defense: Welling variation +rnbqkb1r/pppppppp/8/3nP3/8/2N5/PPPP1PPP/R1BQKBNR b KQkq - +Alekhine's defense: S\"amisch attack +rnbqkb1r/pppppppp/8/3nP3/8/8/PPPP1PPP/RNBQKBNR w KQkq - +Alekhine's defense +rnbqkb1r/pppppppp/8/4P3/4n3/8/PPPP1PPP/RNBQKBNR w KQkq - +Alekhine's defense: Mokele Mbembe (B\"ucker) variation +rnbqkb1r/pppppppp/8/8/3Pn3/5N2/PPP1PPPP/RNBQKB1R w KQkq - +D\"ory defense +rnbqkbnr/1p1p1p1p/p3p1p1/8/3NP3/3B4/PPP2PPP/RNBQK2R w KQkq - +Sicilian: Kan, Swiss cheese variation +rnbqkbnr/1p1p1ppp/p3p3/8/2PNP3/8/PP3PPP/RNBQKB1R b KQkq - +Sicilian: Kan, Mar\'oczy bind (R\'eti variation) +rnbqkbnr/1p1p1ppp/p3p3/8/3NP3/2N5/PPP2PPP/R1BQKB1R b KQkq - +Sicilian: Kan, 5.Nc3 +rnbqkbnr/1p1p1ppp/p3p3/8/3NP3/3B4/PPP2PPP/RNBQK2R b KQkq - +Sicilian: Kan, 5.Bd3 +rnbqkbnr/1p1p1ppp/p3p3/8/3NP3/8/PPP2PPP/RNBQKB1R w KQkq - +Sicilian: Kan variation +rnbqkbnr/1p1ppppp/p7/2p5/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - +Sicilian: O'Kelly variation +rnbqkbnr/1pp1pppp/p7/8/2pP4/5N2/PP2PPPP/RNBQKB1R w KQkq - +QGA: Alekhine defense +rnbqkbnr/1pp1pppp/p7/8/2pPP3/5N2/PP3PPP/RNBQKB1R b KQkq - +QGA: Alekhine defense, Borisenko-Furman variation +rnbqkbnr/1pp2ppp/p3p3/3p4/2PP4/2N5/PP2PPPP/R1BQKBNR w KQkq - +QGD: Janowski variation +rnbqkbnr/1ppp1ppp/p3p3/8/3PP3/8/PPP2PPP/RNBQKBNR w KQkq - +St. George defense +rnbqkbnr/1ppp1ppp/p7/4p3/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +KP: Mengarini's opening * +rnbqkbnr/1pppppp1/8/p6p/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +Crab opening * +rnbqkbnr/1pppppp1/p6p/8/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +Global opening * +rnbqkbnr/1ppppppp/8/p7/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +Corn stalk defense +rnbqkbnr/1ppppppp/8/p7/8/8/PPPPPPPP/RNBQKBNR w KQkq - +Ware (Meadow Hay) opening * +rnbqkbnr/1ppppppp/p7/8/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +St. George (Baker) defense +rnbqkbnr/1ppppppp/p7/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - +Anderssen's opening * +rnbqkbnr/2p1pppp/p7/1p6/2pP4/4PN2/PP3PPP/RNBQKB1R w KQkq - +QGA: Haberditz variation +rnbqkbnr/2pp1ppp/P7/4p3/8/8/PP1PPPPP/RNBQKBNR b KQkq - +Sicilian: wing gambit, Carlsbad variation * +rnbqkbnr/2pp1ppp/p7/1P2p3/8/8/PP1PPPPP/RNBQKBNR w KQkq - +Sicilian: wing gambit, Marshall variation * +rnbqkbnr/p1p1pppp/8/1p6/2pP4/5N2/PP2PPPP/RNBQKB1R w KQkq - +QGA: Ericson variation +rnbqkbnr/p1p2ppp/1p2p3/3p4/2PP4/2N5/PP2PPPP/R1BQKBNR w KQkq - +QGD: Alapin variation +rnbqkbnr/p1pp1ppp/1p2p3/8/2PP4/8/PP2PPPP/RNBQKBNR w KQkq - +Queen's pawn: Keres defense +rnbqkbnr/p1pp1ppp/1p6/4p3/8/4P3/PPPP1PPP/RNBQKBNR w KQkq - +French: R\'eti (Spielmann) variation * +rnbqkbnr/p1pp1ppp/1p6/8/3Np3/8/PPPPPPPP/RNBQKB1R w KQkq - +Alekhine's defense: Welling variation * +rnbqkbnr/p1pp1ppp/8/1p2p3/2P5/8/PP1PPPPP/RNBQKBNR w KQkq - +Sicilian: wing gambit * +rnbqkbnr/p1pp1ppp/8/1p6/2B1Pp2/8/PPPP2PP/RNBQK1NR w KQkq - +KGA: bishop's gambit, Bryan counter-gambit +rnbqkbnr/p1pp2pp/1p6/4pP2/8/8/PPPP1PPP/RNBQKBNR w KQkq - +KGA: Orsini gambit * +rnbqkbnr/p1pppppp/1p6/8/1P6/8/P1PPPPPP/RNBQKBNR b KQkq - +Nimzovich-Larsen attack: Polish variation * +rnbqkbnr/p1pppppp/1p6/8/2P5/8/PP1PPPPP/RNBQKBNR b KQkq - +Nimzovich-Larsen attack: English variation * +rnbqkbnr/p1pppppp/1p6/8/3P4/8/PPP1PPPP/RNBQKBNR b KQkq - +Nimzovich-Larsen attack: classical variation * +rnbqkbnr/p1pppppp/1p6/8/3P4/8/PPP1PPPP/RNBQKBNR w KQkq - +Queen's pawn: English defense +rnbqkbnr/p1pppppp/1p6/8/4P3/8/PPPP1PPP/RNBQKBNR b KQkq - +Nimzovich-Larsen attack: modern variation * +rnbqkbnr/p1pppppp/1p6/8/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +Owen defense +rnbqkbnr/p1pppppp/1p6/8/5P2/8/PPPPP1PP/RNBQKBNR b KQkq - +Nimzovich-Larsen attack: Dutch variation * +rnbqkbnr/p1pppppp/1p6/8/8/1P6/P1PPPPPP/RNBQKBNR b KQkq - +Nimzovich-Larsen attack: symmetrical variation * +rnbqkbnr/p1pppppp/1p6/8/8/1P6/P1PPPPPP/RNBQKBNR w KQkq - +Nimzovich-Larsen attack: symmetrical variation +rnbqkbnr/p1pppppp/1p6/8/8/5N2/PPPPPPPP/RNBQKB1R b KQkq - +Nimzovich-Larsen attack: Indian variation * +rnbqkbnr/p1pppppp/1p6/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - +Nimzovich-Larsen attack * +rnbqkbnr/p1pppppp/8/1p6/2P5/8/PP1PPPPP/RNBQKBNR w KQkq - +English: Jaenisch gambit +rnbqkbnr/p1pppppp/8/1p6/3P4/8/PPP1PPPP/RNBQKBNR w KQkq - +Polish defense +rnbqkbnr/p1pppppp/8/1p6/8/1P6/P1PPPPPP/RNBQKBNR w KQkq - +Nimzovich-Larsen attack: Polish variation +rnbqkbnr/p1pppppp/8/1p6/8/2P5/PP1PPPPP/RNBQKBNR b KQkq - +Polish: Outflank variation * +rnbqkbnr/p1pppppp/8/1p6/8/7N/PPPPPPPP/RNBQKB1R b KQkq - +Polish: T\"ubingen variation * +rnbqkbnr/p1pppppp/8/1p6/8/8/PPPPPPPP/RNBQKBNR w KQkq - +Polish (Sokolsky) opening * +rnbqkbnr/p2p1ppp/1p6/2p5/4p3/1N6/PPPPPPPP/RNBQKB1R w KQkq - +Alekhine's defense: Steiner variation * +rnbqkbnr/p2p1ppp/8/1Pp1p3/8/8/PP1PPPPP/RNBQKBNR w KQkq c6 +Sicilian: wing gambit, Santasiere variation * +rnbqkbnr/p2p1ppp/8/1pp5/2BpP3/5N2/PPP2PPP/RNBQK2R w KQkq - +Center game, Kieseritsky variation +rnbqkbnr/p2ppppp/1p6/2p5/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - +Sicilian: Katalimov variation +rnbqkbnr/p2ppppp/8/1pp5/8/5N2/PPPPPPPP/RNBQKB1R w KQkq - +English orang-utan * +rnbqkbnr/p3pppp/2p5/1p1p4/3PP3/2N5/PPP2PPP/R1BQKBNR w KQkq - +Caro-Kann: Gurgenidze counter-attack +rnbqkbnr/p4ppp/2p5/3pp3/8/2N5/PPPPPPPP/R1BQKBNR w KQkq - +KP: Nimzovich defense, Wheeler gambit * +rnbqkbnr/p4ppp/8/1pP5/N2p4/8/PP2PPPP/R1BQKBNR w KQkq b6 +QGD: Tarrasch defense, Tarrasch gambit +rnbqkbnr/pp1p1ppp/2p5/4p3/2B1P3/8/PPPP1PPP/RNBQK1NR w KQkq - +Bishop's opening: Philidor counter-attack +rnbqkbnr/pp1p1ppp/2p5/4p3/2P5/8/PP1PPPPP/RNBQKBNR w KQkq - +Sicilian: Alapin's variation (2.c3) * +rnbqkbnr/pp1p1ppp/2p5/4p3/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +KP: Lopez opening * +rnbqkbnr/pp1p1ppp/2p5/8/2B1Pp2/8/PPPP2PP/RNBQK1NR w KQkq - +KGA: bishop's gambit, Ruy L\'opez defense +rnbqkbnr/pp1p1ppp/4p3/2p5/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - +Sicilian defense +rnbqkbnr/pp1p1ppp/4p3/2pP4/4P3/8/PPP2PPP/RNBQKBNR b KQkq - +Old Benoni: Franco-Benoni defense +rnbqkbnr/pp1p1ppp/4p3/8/3pP3/5N2/PPP2PPP/RNBQKB1R w KQkq - +Sicilian defense +rnbqkbnr/pp1p1ppp/8/2p1p3/3P4/2P5/PP2PPPP/RNBQKBNR b KQkq - +Caro-Kann: anti-anti-Caro-Kann defense * +rnbqkbnr/pp1p1ppp/8/2p1p3/4P3/6P1/PPPP1P1P/RNBQKBNR b KQkq - +English: Adorjan defense * +rnbqkbnr/pp1p1ppp/8/2p1p3/4PP2/8/PPPP2PP/RNBQKBNR w KQkq - +KGD: Mafia defense +rnbqkbnr/pp1p1ppp/8/2p1p3/8/2P5/PP1PPPPP/RNBQKBNR w KQkq - +Caro-Kann: anti-Caro-Kann defense * +rnbqkbnr/pp1p1ppp/8/2p1p3/8/4P3/PPPP1PPP/RNBQKBNR w KQkq - +French defense, Steiner variation * +rnbqkbnr/pp1p1ppp/8/2p5/3Np3/8/PPPPPPPP/RNBQKB1R w KQkq - +Alekhine's defense * +rnbqkbnr/pp1p1ppp/8/2p5/3p4/2P2N2/PP2PPPP/RNBQKB1R b KQkq - +Scandinavian gambit * +rnbqkbnr/pp1p1ppp/8/2p5/3p4/4PN2/PPP2PPP/RNBQKB1R b KQkq - +Scandinavian: Icelandic gambit * +rnbqkbnr/pp1p1ppp/8/2pPp3/8/8/PPP1PPPP/RNBQKBNR w KQkq e6 +Old Benoni defense +rnbqkbnr/pp1p1ppp/8/4p3/3pP3/2P2N2/PP3PPP/RNBQKB1R b KQkq - +Sicilian: Andreaschek gambit +rnbqkbnr/pp1p1ppp/8/8/2p1p3/1N6/PPPPPPPP/RNBQKB1R w KQkq - +Alekhine's defense: two pawns' (Lasker's) attack * +rnbqkbnr/pp1pp1pp/8/2p2p2/3P4/8/PPP1PPPP/RNBQKBNR w KQkq - +Mujannah opening * +rnbqkbnr/pp1pp1pp/8/2pP1p2/8/8/PPP1PPPP/RNBQKBNR w KQkq - +Old Benoni: Mujannah formation +rnbqkbnr/pp1ppp1p/6p1/2p5/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - +Sicilian: Hungarian variation +rnbqkbnr/pp1ppppp/2p5/8/1P6/8/P1PPPPPP/RNBQKBNR w KQkq - +Polish: Outflank variation +rnbqkbnr/pp1ppppp/2p5/8/2B1P3/8/PPPP1PPP/RNBQK1NR b KQkq - +Caro-Kann: Hillbilly attack +rnbqkbnr/pp1ppppp/2p5/8/2P1P3/8/PP1P1PPP/RNBQKBNR b KQkq - +Caro-Kann: anti-Caro-Kann defense +rnbqkbnr/pp1ppppp/2p5/8/2P5/8/PP1PPPPP/RNBQKBNR w KQkq - +English: Caro-Kann defensive system +rnbqkbnr/pp1ppppp/2p5/8/3PP3/8/PPP2PPP/RNBQKBNR b KQkq - +Caro-Kann defense +rnbqkbnr/pp1ppppp/2p5/8/4P3/2N5/PPPP1PPP/R1BQKBNR b KQkq - +Caro-Kann defense +rnbqkbnr/pp1ppppp/2p5/8/4P3/3P4/PPP2PPP/RNBQKBNR b KQkq - +Caro-Kann: closed (Breyer) variation +rnbqkbnr/pp1ppppp/2p5/8/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +Caro-Kann defense +rnbqkbnr/pp1ppppp/2p5/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - +Saragossa opening * +rnbqkbnr/pp1ppppp/8/2p5/1P2P3/8/P1PP1PPP/RNBQKBNR b KQkq - +Sicilian: wing gambit +rnbqkbnr/pp1ppppp/8/2p5/1P6/8/P1PPPPPP/RNBQKBNR b KQkq - +English: Jaenisch gambit * +rnbqkbnr/pp1ppppp/8/2p5/2P5/2N5/PP1PPPPP/R1BQKBNR b KQkq - +English: symmetrical variation +rnbqkbnr/pp1ppppp/8/2p5/2P5/8/PP1PPPPP/RNBQKBNR b KQkq - +English: symmetrical variation * +rnbqkbnr/pp1ppppp/8/2p5/2P5/8/PP1PPPPP/RNBQKBNR w KQkq - +English: symmetrical variation +rnbqkbnr/pp1ppppp/8/2p5/3P4/8/PPP1PPPP/RNBQKBNR w KQkq - +Old Benoni defense +rnbqkbnr/pp1ppppp/8/2p5/3PP3/8/PPP2PPP/RNBQKBNR b KQkq - +Sicilian: Smith-Morra gambit +rnbqkbnr/pp1ppppp/8/2p5/4P3/2N5/PPPP1PPP/R1BQKBNR b KQkq - +Sicilian: closed +rnbqkbnr/pp1ppppp/8/2p5/4P3/2P5/PP1P1PPP/RNBQKBNR b KQkq - +Sicilian: Alapin's variation (2.c3) +rnbqkbnr/pp1ppppp/8/2p5/4P3/5N2/PPPP1PPP/RNBQKB1R b KQkq - +Sicilian defense +rnbqkbnr/pp1ppppp/8/2p5/4P3/6P1/PPPP1P1P/RNBQKBNR b KQkq - +Sicilian: Steinitz variation +rnbqkbnr/pp1ppppp/8/2p5/4P3/8/PPPP1PPP/RNBQKBNR b KQkq - +English opening * +rnbqkbnr/pp1ppppp/8/2p5/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +Sicilian defense +rnbqkbnr/pp1ppppp/8/2p5/4P3/8/PPPPNPPP/RNBQKB1R b KQkq - +Sicilian: Keres variation (2.Ne2) +rnbqkbnr/pp1ppppp/8/2p5/4PP2/8/PPPP2PP/RNBQKBNR b KQkq - +Sicilian: Grand Prix attack +rnbqkbnr/pp1ppppp/8/2p5/5P2/8/PPPPP1PP/RNBQKBNR b KQkq - +English: Anglo-Dutch defense * +rnbqkbnr/pp1ppppp/8/2p5/8/1P6/P1PPPPPP/RNBQKBNR w KQkq - +Nimzovich-Larsen attack: English variation +rnbqkbnr/pp1ppppp/8/2p5/8/2P5/PP1PPPPP/RNBQKBNR b KQkq - +English: Caro-Kann defensive system * +rnbqkbnr/pp1ppppp/8/2p5/8/4P3/PPPP1PPP/RNBQKBNR b KQkq - +English opening * +rnbqkbnr/pp1ppppp/8/2p5/8/5N2/PPPPPPPP/RNBQKB1R b KQkq - +English, 1...Nf6 (Anglo-Indian defense) * +rnbqkbnr/pp1ppppp/8/2p5/8/6P1/PPPPPP1P/RNBQKBNR b KQkq - +English opening * +rnbqkbnr/pp1ppppp/8/2p5/8/8/PPPPPPPP/RNBQKBNR w KQkq - +English opening * +rnbqkbnr/pp1ppppp/8/8/1p2P3/P7/2PP1PPP/RNBQKBNR b KQkq - +Sicilian: wing gambit, Marshall variation +rnbqkbnr/pp1ppppp/8/8/1pP1P3/8/P2P1PPP/RNBQKBNR b KQkq c3 +Sicilian: wing gambit, Santasiere variation +rnbqkbnr/pp1ppppp/8/8/3pP3/2P5/PP3PPP/RNBQKBNR b KQkq - +Sicilian: Smith-Morra gambit +rnbqkbnr/pp1ppppp/8/8/4P3/p7/2PP1PPP/RNBQKBNR w KQkq - +Sicilian: wing gambit, Carlsbad variation +rnbqkbnr/pp2p1pp/5p2/2pp4/3P4/5NP1/PPP1PP1P/RNBQKB1R b KQkq - +Neo-Gr\"unfeld defense * +rnbqkbnr/pp2pp1p/2p3p1/3p4/3PP3/2N5/PPP2PPP/R1BQKBNR w KQkq - +Caro-Kann: Gurgenidze system +rnbqkbnr/pp2pp1p/3p2p1/2pP4/8/2N5/PPP1PPPP/R1BQKBNR w KQkq - +Old Benoni: Schmid's system +rnbqkbnr/pp2pp1p/6p1/2pp4/3P4/5NP1/PPP1PP1P/RNBQKB1R b KQkq - +Neo-Gr\"unfeld (Kemeri) defense * +rnbqkbnr/pp2pp1p/6p1/2pp4/5P2/5N2/PPPPP1PP/RNBQKB1R w KQkq - +Dutch with c4 & g3 * +rnbqkbnr/pp2pp1p/6p1/2pp4/5P2/5NP1/PPPPP2P/RNBQKB1R b KQkq - +Dutch: Leningrad variation * +rnbqkbnr/pp2pp1p/6p1/2pp4/8/4PN2/PPPP1PPP/RNBQKB1R w KQkq - +Catalan opening * +rnbqkbnr/pp2pp1p/6p1/2pp4/8/5NP1/PPPPPP1P/RNBQKB1R w KQkq - +King's Indian: 3.g3 * +rnbqkbnr/pp2pppp/2p5/3P4/3P4/8/PP2PPPP/RNBQKBNR b KQkq - +QGD Slav defense: exchange variation +rnbqkbnr/pp2pppp/2p5/3P4/3P4/8/PPP2PPP/RNBQKBNR b KQkq - +Caro-Kann: exchange variation +rnbqkbnr/pp2pppp/2p5/3p2P1/8/8/PPPPPPBP/RNBQK1NR b KQkq - +Grob: spike attack +rnbqkbnr/pp2pppp/2p5/3p4/2P1P3/8/PP1P1PPP/RNBQKBNR w KQkq - +Caro-Kann: anti-anti-Caro-Kann defense +rnbqkbnr/pp2pppp/2p5/3p4/2P5/1P3N2/P2PPPPP/RNBQKB1R b KQkq - +English: Caro-Kann defensive system +rnbqkbnr/pp2pppp/2p5/3p4/2PP4/5N2/PP2PPPP/RNBQKB1R b KQkq - +QGD Slav: 3.Nf3 +rnbqkbnr/pp2pppp/2p5/3p4/2PP4/8/PP2PPPP/RNBQKBNR w KQkq - +QGD Slav defense +rnbqkbnr/pp2pppp/2p5/3p4/3PP3/2N5/PPP2PPP/R1BQKBNR b KQkq - +Caro-Kann defense +rnbqkbnr/pp2pppp/2p5/3p4/3PP3/5P2/PPP3PP/RNBQKBNR b KQkq - +Caro-Kann: Tartakower (fantasy) variation +rnbqkbnr/pp2pppp/2p5/3p4/3PP3/8/PPP2PPP/RNBQKBNR w KQkq - +Caro-Kann defense +rnbqkbnr/pp2pppp/2p5/3p4/3PP3/8/PPPN1PPP/R1BQKBNR b KQkq - +Caro-Kann: 3.Nd2 +rnbqkbnr/pp2pppp/2p5/3p4/4P3/2N2N2/PPPP1PPP/R1BQKB1R b KQkq - +Caro-Kann: two knights variation +rnbqkbnr/pp2pppp/2p5/3p4/4P3/2N2Q2/PPPP1PPP/R1B1KBNR b KQkq - +Caro-Kann: Goldman (Spielmann) variation +rnbqkbnr/pp2pppp/2p5/3pP3/3P4/8/PPP2PPP/RNBQKBNR b KQkq - +Caro-Kann: advance variation +rnbqkbnr/pp2pppp/2p5/8/2pPP3/2N5/PP3PPP/R1BQKBNR b KQkq - +QGD Slav defense, Alekhine variation +rnbqkbnr/pp2pppp/2p5/8/3PN3/8/PPP2PPP/R1BQKBNR b KQkq - +Caro-Kann defense +rnbqkbnr/pp2pppp/2p5/8/3Pp3/2N2P2/PPP3PP/R1BQKBNR b KQkq - +Caro-Kann: Rasa-Studier gambit +rnbqkbnr/pp2pppp/3p4/1Bp5/4P3/5N2/PPPP1PPP/RNBQK2R b KQkq - +Sicilian: Canal-Sokolsky (Nimzovich-Rossolimo, Moscow) attack +rnbqkbnr/pp2pppp/3p4/2p5/1P2P3/5N2/P1PP1PPP/RNBQKB1R b KQkq - +Sicilian: wing gambit deferred +rnbqkbnr/pp2pppp/3p4/2p5/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - +Sicilian +rnbqkbnr/pp2pppp/3p4/2pP4/8/8/PPP1PPPP/RNBQKBNR w KQkq - +Old Benoni defense +rnbqkbnr/pp2pppp/3p4/8/3NP3/8/PPP2PPP/RNBQKB1R b KQkq - +Sicilian +rnbqkbnr/pp2pppp/3p4/8/3QP3/5N2/PPP2PPP/RNB1KB1R b KQkq - +Sicilian, Chekhover variation +rnbqkbnr/pp2pppp/3p4/8/3pP3/2P2N2/PP3PPP/RNBQKB1R b KQkq - +Sicilian: Tartakower variation +rnbqkbnr/pp2pppp/3p4/8/3pP3/5N2/PPP2PPP/RNBQKB1R w KQkq - +Sicilian +rnbqkbnr/pp2pppp/8/1Bpp4/8/4P3/PPPP1PPP/RNBQK1NR b KQkq - +Queen's pawn: Franco-Indian (Keres) defense * +rnbqkbnr/pp2pppp/8/2Pp4/8/8/PPP1PPPP/RNBQKBNR b KQkq - +Queen's gambit accepted * +rnbqkbnr/pp2pppp/8/2p1N3/2Pp4/8/PP1PPPPP/RNBQKB1R b KQkq - +Vulture defense * +rnbqkbnr/pp2pppp/8/2p1N3/4p3/8/PPPP1PPP/RNBQKB1R b KQkq - +Budapest: Fajarowicz variation * +rnbqkbnr/pp2pppp/8/2p3N1/4p3/8/PPPP1PPP/RNBQKB1R b KQkq - +Budapest defense * +rnbqkbnr/pp2pppp/8/2p5/1P1p4/5NP1/P1PPPP1P/RNBQKB1R b KQkq - +King's Indian: Danube gambit * +rnbqkbnr/pp2pppp/8/2p5/1PPp4/5N2/P2PPPPP/RNBQKB1R b KQkq - +Benk\"o gambit * +rnbqkbnr/pp2pppp/8/2p5/2Pp4/3P1N2/PP2PPPP/RNBQKB1R b KQkq - +Benoni defense, Hromodka system * +rnbqkbnr/pp2pppp/8/2p5/2Pp4/4PN2/PP1P1PPP/RNBQKB1R b KQkq - +Benoni defense * +rnbqkbnr/pp2pppp/8/2p5/2PpP3/5N2/PP1P1PPP/RNBQKB1R b KQkq e3 +Czech Benoni defense * +rnbqkbnr/pp2pppp/8/2p5/3p4/5NP1/PPPPPP1P/RNBQKB1R w KQkq - +King's Indian: Anti-Gr\"unfeld * +rnbqkbnr/pp2pppp/8/2pp4/2P5/5N2/PP1PPPPP/RNBQKB1R b KQkq - +Benoni defense * +rnbqkbnr/pp2pppp/8/2pp4/2PP4/8/PP2PPPP/RNBQKBNR b KQkq - +QGD: symmetrical (Austrian) defense * +rnbqkbnr/pp2pppp/8/2pp4/2PP4/8/PP2PPPP/RNBQKBNR w KQkq - +QGD: symmetrical (Austrian) defense +rnbqkbnr/pp2pppp/8/2pp4/3P1B2/8/PPP1PPPP/RN1QKBNR b KQkq - +QGD: Grau (Sahovic) defense * +rnbqkbnr/pp2pppp/8/2pp4/3P1B2/8/PPP1PPPP/RN1QKBNR w KQkq - +Queen's pawn, Mason variation, Steinitz counter-gambit +rnbqkbnr/pp2pppp/8/2pp4/3P4/2N5/PPP1PPPP/R1BQKBNR b KQkq - +QGD: Chigorin defense * +rnbqkbnr/pp2pppp/8/2pp4/3P4/2P5/PP2PPPP/RNBQKBNR b KQkq - +QGD Slav defense * +rnbqkbnr/pp2pppp/8/2pp4/3P4/4P3/PPP2PPP/RNBQKBNR b KQkq - +Queen's gambit declined * +rnbqkbnr/pp2pppp/8/2pp4/3P4/5N2/PPP1PPPP/RNBQKB1R b KQkq - +QGD: Marshall defense * +rnbqkbnr/pp2pppp/8/2pp4/3P4/5N2/PPP1PPPP/RNBQKB1R w KQkq - +Queen's pawn game, Krause variation +rnbqkbnr/pp2pppp/8/2pp4/3P4/8/PPP1PPPP/RNBQKBNR w KQkq - +Queen's gambit declined * +rnbqkbnr/pp2pppp/8/2pp4/3PP3/8/PPP2PPP/RNBQKBNR b KQkq - +QGD: Albin counter-gambit * +rnbqkbnr/pp2pppp/8/2pp4/4P3/5N2/PPPP1PPP/RNBQKB1R b KQkq - +Budapest defense declined * +rnbqkbnr/pp2pppp/8/2pp4/5P2/4P3/PPPP2PP/RNBQKBNR b KQkq - +Dutch defense * +rnbqkbnr/pp2pppp/8/2pp4/5P2/5N2/PPPPP1PP/RNBQKB1R b KQkq - +Dutch defense * +rnbqkbnr/pp2pppp/8/2pp4/5P2/8/PPPPP1PP/RNBQKBNR w KQkq - +Dutch defense * +rnbqkbnr/pp2pppp/8/2pp4/8/1P2P3/P1PP1PPP/RNBQKBNR b KQkq - +Queen's pawn: Keres defense * +rnbqkbnr/pp2pppp/8/2pp4/8/1P3N2/P1PPPPPP/RNBQKB1R b KQkq - +Queen's Indian accelerated * +rnbqkbnr/pp2pppp/8/2pp4/8/2N2N2/PPPPPPPP/R1BQKB1R b KQkq - +Kevitz-Trajkovich defense * +rnbqkbnr/pp2pppp/8/2pp4/8/3P1N2/PPP1PPPP/RNBQKB1R b KQkq - +Old Indian defense * +rnbqkbnr/pp2pppp/8/2pp4/8/3P4/PPP1PPPP/RNBQKBNR w KQkq - +Old Indian defense * +rnbqkbnr/pp2pppp/8/2pp4/8/4PN2/PPPP1PPP/RNBQKB1R b KQkq - +Queen's pawn game * +rnbqkbnr/pp2pppp/8/2pp4/8/5N2/PPPPPPPP/RNBQKB1R w KQkq - +Queen's pawn game * +rnbqkbnr/pp2pppp/8/2pp4/8/5NP1/PPPPPP1P/RNBQKB1R b KQkq - +King's Indian defense * +rnbqkbnr/pp2pppp/8/2pp4/8/5NP1/PPPPPP1P/RNBQKB1R w KQkq - +R\'eti: King's Indian attack (with ...c5) +rnbqkbnr/pp2pppp/8/2pp4/8/5NP1/PPPPPPBP/RNBQK2R b KQkq - +R\'eti: King's Indian attack +rnbqkbnr/pp2pppp/8/3p4/2PP4/8/PP3PPP/RNBQKBNR b KQkq - +Caro-Kann: Panov-Botvinnik attack +rnbqkbnr/pp2pppp/8/3p4/3p4/2P5/PP2PPPP/RNBQKBNR w KQkq - +QGD Slav defense: exchange variation * +rnbqkbnr/pp2pppp/8/8/1pPp4/P4N2/3PPPPP/RNBQKB1R b KQkq - +Benk\"o gambit half accepted * +rnbqkbnr/pp2pppp/8/8/2Pp4/p4N2/3PPPPP/RNBQKB1R w KQkq - +Benk\"o gambit accepted * +rnbqkbnr/pp3ppp/2p1p3/3p4/2P5/5NP1/PP1PPP1P/RNBQKB1R w KQkq - +English: Kurajica defense +rnbqkbnr/pp3ppp/2p1p3/3p4/2PP4/2N5/PP2PPPP/R1BQKBNR w KQkq - +QGD: semi-Slav +rnbqkbnr/pp3ppp/2p1p3/3p4/2PPP3/2N5/PP3PPP/R1BQKBNR b KQkq - +QGD: semi-Slav, Marshall gambit +rnbqkbnr/pp3ppp/2p1p3/8/2pP4/2N2N2/PP2PPPP/R1BQKB1R w KQkq - +QGD: semi-Slav, Noteboom variation +rnbqkbnr/pp3ppp/2p5/3B4/4Pp2/8/PPPP2PP/RNBQK1NR w KQkq - +KGA: bishop's gambit, Anderssen variation +rnbqkbnr/pp3ppp/2p5/3Pp3/3P4/8/PPP2PPP/RNBQKBNR b KQkq - +Danish gambit: S\o rensen defense * +rnbqkbnr/pp3ppp/2p5/3Pp3/5P2/8/PPPP2PP/RNBQKBNR w KQkq - +KGD: Nimzovich counter-gambit +rnbqkbnr/pp3ppp/2p5/3Pp3/8/8/PP1PPPPP/RNBQKBNR w KQkq - +Sicilian: Smith-Morra gambit * +rnbqkbnr/pp3ppp/2p5/3Pp3/8/8/PPPP1PPP/RNBQKBNR w KQkq - +Danish gambit * +rnbqkbnr/pp3ppp/2p5/3p4/2PPp3/2N1P3/PP3PPP/R1BQKBNR b KQkq - +French: advance variation * +rnbqkbnr/pp3ppp/2p5/3p4/2PPp3/4P3/PP3PPP/RNBQKBNR w KQkq - +French: advance variation * +rnbqkbnr/pp3ppp/2p5/3pp3/2PP4/2N5/PP2PPPP/R1BQKBNR w KQkq - +QGD Slav: Winawer counter-gambit +rnbqkbnr/pp3ppp/2pp4/4p3/2P5/2N3P1/PP1PPP1P/R1BQKBNR w KQkq - +English, Keres variation +rnbqkbnr/pp3ppp/3p4/2pPp3/4P3/8/PPP2PPP/RNBQKBNR w KQkq - +Semi-Benoni (`blockade variation') +rnbqkbnr/pp3ppp/4p3/2PpP3/8/8/PPP2PPP/RNBQKBNR b KQkq - +French: advance, Steinitz variation +rnbqkbnr/pp3ppp/4p3/2pp4/2PP4/2N5/PP2PPPP/R1BQKBNR w KQkq - +QGD: Tarrasch defense +rnbqkbnr/pp3ppp/4p3/2pp4/3PP3/2N5/PPP2PPP/R1BQKBNR w KQkq - +French: Marshall variation +rnbqkbnr/pp3ppp/4p3/2pp4/3PP3/5N2/PPP2PPP/RNBQKB1R w KQkq - +Sicilian: Marshall variation +rnbqkbnr/pp3ppp/4p3/2pp4/3PP3/8/PPPN1PPP/R1BQKBNR w KQkq - +French: Tarrasch, open variation +rnbqkbnr/pp3ppp/4p3/2pp4/4P3/2N3P1/PPPP1P1P/R1BQKBNR w KQkq - +Sicilian: closed, Korchnoi variation +rnbqkbnr/pp3ppp/4p3/2ppP3/1P6/5N2/P1PP1PPP/RNBQKB1R b KQkq - +French: Wing gambit +rnbqkbnr/pp3ppp/4p3/2ppP3/3P2Q1/8/PPP2PPP/RNB1KBNR b KQkq - +French: advance, Nimzovich variation +rnbqkbnr/pp3ppp/4p3/2ppP3/3P4/2P5/PP3PPP/RNBQKBNR b KQkq - +French: advance variation +rnbqkbnr/pp3ppp/4p3/2ppP3/3P4/5N2/PPP2PPP/RNBQKB1R b KQkq - +French: advance, Nimzovich system +rnbqkbnr/pp3ppp/4p3/3P4/3p4/2N5/PP2PPPP/R1BQKBNR w KQkq - +QGD: Tarrasch, von Hennig-Schara gambit +rnbqkbnr/pp3ppp/4p3/8/2Bp4/5N2/PPPN1PPP/R1BQK2R w KQkq - +French: Tarrasch, Eliskases variation +rnbqkbnr/pp3ppp/8/1Npp4/8/8/PPP1PPPP/RNBQKB1R b KQkq - +Scandinavian: Kiel variation * +rnbqkbnr/pp3ppp/8/2Ppp3/5P2/8/PPP1P1PP/RNBQKBNR b KQkq - +QGA: Schwartz defense * +rnbqkbnr/pp3ppp/8/2Ppp3/8/8/PPP1PPPP/RNBQKBNR w KQkq - +QGA: 3.e4 * +rnbqkbnr/pp3ppp/8/2p1p1N1/4p3/3P4/PPP2PPP/RNBQKB1R b KQkq - +Budapest: Alekhine variation, Balogh gambit * +rnbqkbnr/pp3ppp/8/2p1p1N1/4p3/8/PPPP1PPP/RNBQKB1R w KQkq - +Budapest: Alekhine variation * +rnbqkbnr/pp3ppp/8/2pp4/3Np3/3P4/PPP1PPPP/RNBQKB1R w KQkq - +Alekhine's defense * +rnbqkbnr/pp3ppp/8/2pp4/3P4/2N2N2/PP2PPPP/R1BQKB1R b KQkq - +QGD: Tarrasch defense +rnbqkbnr/pp3ppp/8/2pp4/3P4/2N5/PP2PPPP/R1BQKBNR w KQkq - +QGD: Tarrasch defense, 4.cd ed +rnbqkbnr/pp3ppp/8/2pp4/3P4/8/PP2PPPP/RNBQKBNR w KQkq - +Caro-Kann: Panov-Botvinnik attack * +rnbqkbnr/pp3ppp/8/2pp4/3P4/8/PPPN1PPP/R1BQKBNR w KQkq - +French: Tarrasch, open, 4.ed ed +rnbqkbnr/pp3ppp/8/2pp4/3PP3/2N5/PP3PPP/R1BQKBNR b KQkq - +QGD: Tarrasch defense, Marshall gambit +rnbqkbnr/pp3ppp/8/2pp4/8/1N1p4/PPP1PPPP/RNBQKB1R w KQkq - +Alekhine's defense: exchange variation * +rnbqkbnr/pp3ppp/8/2ppp3/5P2/4P3/PPPP2PP/RNBQKBNR w KQkq - +Dutch: Staunton gambit deferred * +rnbqkbnr/pp3ppp/8/2ppp3/8/5PPN/PPPPP2P/RNBQKB1R b KQkq - +Hippopotamus defense * +rnbqkbnr/pp3ppp/8/3p4/2pP4/5N2/PP2PPPP/RNBQKB1R w KQkq - +Caro-Kann: Panov-Botvinnik, Gunderam attack * +rnbqkbnr/pp4pp/8/2p1pp2/8/2N5/PPPP1PPP/RNBQKB1R b KQkq - +Budapest: Alekhine, Abonyi variation * +rnbqkbnr/pp4pp/8/2pp1p2/4p1P1/1N1P4/PPP1PP1P/RNBQKB1R b KQkq - +Alekhine's defense: four pawns attack, Planinc variation * +rnbqkbnr/pp4pp/8/2pp1p2/4p3/1N1P2P1/PPP1PP1P/RNBQKB1R b KQkq - +Alekhine's defense: four pawns attack, fianchetto variation * +rnbqkbnr/pp4pp/8/2pp1p2/4p3/1N1P4/PPP1PPPP/RNBQKB1R w KQkq - +Alekhine's defense: four pawns attack * +rnbqkbnr/pp4pp/8/2pp1p2/4pB2/1N1P4/PPP1PPPP/RN1QKB1R b KQkq - +Alekhine's defense: four pawns attack, Trifunovi\'c variation * +rnbqkbnr/pp4pp/8/2pp4/4p3/1NN5/PPP1PPPP/R1BQKB1R b KQkq - +Alekhine's defense: four pawns attack, 6...Nc6 * +rnbqkbnr/ppp1p1pp/3p4/5p2/3PP3/8/PPP2PPP/RNBQKBNR w KQkq - +(Dutch:) Balogh defense +rnbqkbnr/ppp1p1pp/5p2/3p4/8/5N2/PPPPPPPP/RNBQKB1R w KQkq - +Paleface attack * +rnbqkbnr/ppp1p1pp/8/3p1p2/8/5N2/PPPPPPPP/RNBQKB1R w KQkq - +Canard opening * +rnbqkbnr/ppp1p1pp/8/5p2/2pPP3/8/PP3PPP/RNBQKBNR w KQkq - +QGA: Schwartz defense +rnbqkbnr/ppp1p2p/5p2/3p2p1/3P4/5N2/PPP1PPPP/RNBQKB1R w KQkq - +Gedult attack * +rnbqkbnr/ppp1pp1p/6p1/3p4/5P2/8/PPPPP1PP/RNBQKBNR w KQkq - +Dutch defense * +rnbqkbnr/ppp1pp1p/6p1/3p4/8/5NP1/PPPPPP1P/RNBQKB1R w KQkq - +R\'eti: King's Indian attack +rnbqkbnr/ppp1pp1p/8/3p2p1/5P2/8/PPPPP1PP/RNBQKBNR w KQkq - +Dutch, Krejcik gambit * +rnbqkbnr/ppp1pp1p/8/3p2p1/8/5N2/PPPPPPPP/RNBQKB1R w KQkq - +Queen's pawn: Bronstein gambit * +rnbqkbnr/ppp1ppp1/7p/3p4/5P2/8/PPPPP1PP/RNBQKBNR w KQkq - +Dutch, Korchnoi attack * +rnbqkbnr/ppp1pppp/3p4/8/2PP4/8/PP2PPPP/RNBQKBNR b KQkq - +Old Indian defense +rnbqkbnr/ppp1pppp/3p4/8/3P4/8/PPP1PPPP/RNBQKBNR w KQkq - +Queen's Pawn +rnbqkbnr/ppp1pppp/3p4/8/4P3/8/PPPP1PPP/RNBQKBNR b KQkq - +Mieses opening * +rnbqkbnr/ppp1pppp/3p4/8/8/5N2/PPPPPPPP/RNBQKB1R w KQkq - +R\'eti opening +rnbqkbnr/ppp1pppp/3p4/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - +Mieses opening * +rnbqkbnr/ppp1pppp/8/3p2B1/3P4/8/PPP1PPPP/RN1QKBNR b KQkq - +Levitsky attack (Queen's bishop attack) +rnbqkbnr/ppp1pppp/8/3p4/1P6/5N2/P1PPPPPP/RNBQKB1R b KQkq - +Santasiere's folly +rnbqkbnr/ppp1pppp/8/3p4/1P6/8/P1PPPPPP/RNBQKBNR b KQkq - +Polish defense * +rnbqkbnr/ppp1pppp/8/3p4/2P2P2/8/PP1PP1PP/RNBQKBNR b KQkq - +Mujannah opening +rnbqkbnr/ppp1pppp/8/3p4/2P5/5N2/PP1PPPPP/RNBQKB1R b KQkq - +R\'eti opening +rnbqkbnr/ppp1pppp/8/3p4/2P5/8/PP1PPPPP/RNBQKBNR b KQkq - +Old Benoni defense * +rnbqkbnr/ppp1pppp/8/3p4/2PP4/8/PP2PPPP/RNBQKBNR b KQkq - +Queen's gambit declined +rnbqkbnr/ppp1pppp/8/3p4/3P1B2/8/PPP1PPPP/RN1QKBNR b KQkq - +Queen's pawn, Mason variation +rnbqkbnr/ppp1pppp/8/3p4/3P4/2N5/PPP1PPPP/R1BQKBNR b KQkq - +Queen's pawn: Chigorin variation +rnbqkbnr/ppp1pppp/8/3p4/3P4/5N2/PPP1PPPP/RNBQKB1R b KQkq - +Queen's pawn game +rnbqkbnr/ppp1pppp/8/3p4/3P4/8/PPP1PPPP/RNBQKBNR b KQkq - +Queen's pawn game * +rnbqkbnr/ppp1pppp/8/3p4/3P4/8/PPP1PPPP/RNBQKBNR w KQkq - +Queen's pawn game +rnbqkbnr/ppp1pppp/8/3p4/3PP3/8/PPP2PPP/RNBQKBNR b KQkq - +Blackmar gambit +rnbqkbnr/ppp1pppp/8/3p4/4P3/5N2/PPPP1PPP/RNBQKB1R b KQkq - +Tennison (Lemberg, Zukertort) gambit +rnbqkbnr/ppp1pppp/8/3p4/4P3/8/PPPP1PPP/RNBQKBNR b KQkq - +Queen's pawn: Charlick (Englund) gambit * +rnbqkbnr/ppp1pppp/8/3p4/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +Scandinavian (center counter) defense +rnbqkbnr/ppp1pppp/8/3p4/4PP2/8/PPPP2PP/RNBQKBNR b KQkq - +Bird's opening: Williams gambit +rnbqkbnr/ppp1pppp/8/3p4/5P2/8/PPPPP1PP/RNBQKBNR b KQkq - +Dutch * +rnbqkbnr/ppp1pppp/8/3p4/5P2/8/PPPPP1PP/RNBQKBNR w KQkq - +Bird's opening +rnbqkbnr/ppp1pppp/8/3p4/8/1P3N2/P1PPPPPP/RNBQKB1R b KQkq - +R\'eti: Nimzovich-Larsen attack +rnbqkbnr/ppp1pppp/8/3p4/8/1P6/P1PPPPPP/RNBQKBNR b KQkq - +Queen's pawn: English defense * +rnbqkbnr/ppp1pppp/8/3p4/8/1P6/P1PPPPPP/RNBQKBNR w KQkq - +Nimzovich-Larsen attack: classical variation +rnbqkbnr/ppp1pppp/8/3p4/8/2N5/PPPPPPPP/R1BQKBNR b KQkq - +Queen's pawn: Lundin (Kevitz-Mikenas) defense * +rnbqkbnr/ppp1pppp/8/3p4/8/3P1N2/PPP1PPPP/RNBQKB1R b KQkq - +R\'eti: old Indian attack +rnbqkbnr/ppp1pppp/8/3p4/8/3P4/PPP1PPPP/RNBQKBNR b KQkq - +Queen's Pawn * +rnbqkbnr/ppp1pppp/8/3p4/8/4P3/PPPP1PPP/RNBQKBNR b KQkq - +Queen's pawn * +rnbqkbnr/ppp1pppp/8/3p4/8/5N2/PPPPPPPP/RNBQKB1R b KQkq - +Queen's pawn game * +rnbqkbnr/ppp1pppp/8/3p4/8/5N2/PPPPPPPP/RNBQKB1R w KQkq - +R\'eti opening +rnbqkbnr/ppp1pppp/8/3p4/8/5NP1/PPPPPP1P/RNBQKB1R b KQkq - +R\'eti: King's Indian attack (Barcza system) +rnbqkbnr/ppp1pppp/8/3p4/8/6P1/PPPPPP1P/RNBQKBNR b KQkq - +Modern defense * +rnbqkbnr/ppp1pppp/8/3p4/8/8/PPPPPPPP/RNBQKBNR w KQkq - +Queen's pawn * +rnbqkbnr/ppp1pppp/8/8/2Pp1P2/8/PP1PP1PP/RNBQKBNR b KQkq - +Old Benoni: Mujannah formation * +rnbqkbnr/ppp1pppp/8/8/2Pp4/3P4/PP2PPPP/RNBQKBNR b KQkq - +Old Benoni defense * +rnbqkbnr/ppp1pppp/8/8/2Pp4/5N2/PP1PPPPP/RNBQKB1R b KQkq - +Old Benoni defense * +rnbqkbnr/ppp1pppp/8/8/2Pp4/5N2/PP1PPPPP/RNBQKB1R w KQkq - +R\'eti: advance variation +rnbqkbnr/ppp1pppp/8/8/2PpP3/8/PP1P1PPP/RNBQKBNR b KQkq e3 +Old Benoni defense * +rnbqkbnr/ppp1pppp/8/8/2p5/5N2/PP1PPPPP/RNBQKB1R w KQkq - +R\'eti accepted +rnbqkbnr/ppp1pppp/8/8/2pP4/5N2/PP2PPPP/RNBQKB1R b KQkq - +QGA: 3.Nf3 +rnbqkbnr/ppp1pppp/8/8/2pP4/8/PP2PPPP/RNBQKBNR w KQkq - +Queen's gambit accepted +rnbqkbnr/ppp1pppp/8/8/2pPP3/8/PP3PPP/RNBQKBNR b KQkq - +QGA: 3.e4 +rnbqkbnr/ppp2p1p/3p2p1/8/3NP3/8/PPP2PPP/RNBQKB1R w KQkq - +Philidor: Larsen variation +rnbqkbnr/ppp2p1p/3p4/4N3/4PppP/8/PPPP2P1/RNBQKB1R w KQkq - +KGA: Kieseritsky, Kolisch defense +rnbqkbnr/ppp2p1p/8/3p2p1/4p3/6P1/PPPPPPNP/RNBQKB1R b KQkq - +Norwegian defense * +rnbqkbnr/ppp2p1p/8/3p4/2B1Ppp1/5N2/PPPP2PP/RNBQ1RK1 w kq - +KGA: Muzio gambit, Brentano defense +rnbqkbnr/ppp2p1p/8/3pN3/4PppP/8/PPPP2P1/RNBQKB1R w KQkq - +KGA: Kieseritsky, Brentano (Campbell) defense +rnbqkbnr/ppp2ppp/3p4/4p3/2P5/2N2N2/PP1PPPPP/R1BQKB1R b KQkq - +English opening +rnbqkbnr/ppp2ppp/3p4/4p3/3PP3/5N2/PPP2PPP/RNBQKB1R b KQkq - +Philidor's defense +rnbqkbnr/ppp2ppp/3p4/4p3/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - +Philidor's defense +rnbqkbnr/ppp2ppp/3p4/4p3/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +KP: Indian opening * +rnbqkbnr/ppp2ppp/3p4/4p3/8/2P5/PP1PPPPP/RNBQKBNR w KQkq - +Caro-Kann: closed (Breyer) variation * +rnbqkbnr/ppp2ppp/3p4/4p3/8/4P3/PPPP1PPP/RNBQKBNR w KQkq - +French: King's Indian attack * +rnbqkbnr/ppp2ppp/3p4/4p3/8/5N2/PPPPPPPP/RNBQKB1R w KQkq - +Alekhine's defense: Mar\'oczy variation * +rnbqkbnr/ppp2ppp/3p4/8/3NP3/8/PPP2PPP/RNBQKB1R b KQkq - +Philidor: exchange variation +rnbqkbnr/ppp2ppp/3p4/8/3pP3/5N2/PPP2PPP/RNBQKB1R w KQkq - +Philidor: exchange variation +rnbqkbnr/ppp2ppp/3p4/8/4Pp2/5N2/PPPP2PP/RNBQKB1R w KQkq - +KGA: Fischer defense +rnbqkbnr/ppp2ppp/3pp3/8/3PP3/8/PPP2PPP/RNBQKBNR w KQkq - +Lengfellner system +rnbqkbnr/ppp2ppp/4p3/3P4/3P4/8/PPP2PPP/RNBQKBNR b KQkq - +French: exchange variation +rnbqkbnr/ppp2ppp/4p3/3p4/2P5/5N2/PP1PPPPP/RNBQKB1R w KQkq - +English opening: Agincourt variation +rnbqkbnr/ppp2ppp/4p3/3p4/2P5/5NP1/PP1PPP1P/RNBQKB1R b KQkq - +English opening: Agincourt variation +rnbqkbnr/ppp2ppp/4p3/3p4/2PP4/2N5/PP2PPPP/R1BQKBNR b KQkq - +QGD: 3.Nc3 +rnbqkbnr/ppp2ppp/4p3/3p4/2PP4/8/PP2PPPP/RNBQKBNR w KQkq - +Queen's gambit declined +rnbqkbnr/ppp2ppp/4p3/3p4/3PP3/2N5/PPP2PPP/R1BQKBNR b KQkq - +French: Paulsen variation +rnbqkbnr/ppp2ppp/4p3/3p4/3PP3/3B4/PPP2PPP/RNBQK1NR b KQkq - +French: Schlechter variation +rnbqkbnr/ppp2ppp/4p3/3p4/3PP3/4B3/PPP2PPP/RN1QKBNR b KQkq - +French: Alapin variation +rnbqkbnr/ppp2ppp/4p3/3p4/3PP3/8/PPP2PPP/RNBQKBNR w KQkq - +French defense +rnbqkbnr/ppp2ppp/4p3/3p4/3PP3/8/PPPN1PPP/R1BQKBNR b KQkq - +French: Tarrasch +rnbqkbnr/ppp2ppp/4p3/3p4/4P3/2N2N2/PPPP1PPP/R1BQKB1R b KQkq - +French: Two knights variation +rnbqkbnr/ppp2ppp/4p3/3p4/4PP2/2N5/PPPP2PP/R1BQKBNR b KQkq - +French: Pelikan variation +rnbqkbnr/ppp2ppp/4p3/3pP3/3P4/8/PPP2PPP/RNBQKBNR b KQkq - +French: advance variation +rnbqkbnr/ppp2ppp/4p3/8/3Pp3/2N5/PPP2PPP/R1BQKBNR w KQkq - +French: Rubinstein variation +rnbqkbnr/ppp2ppp/8/1B1P4/4pP2/8/PPPP2PP/RNBQK1NR b KQkq - +KGD: Falkbeer, Nimzovich variation +rnbqkbnr/ppp2ppp/8/3P4/3N4/8/PPP2PPP/RNBQKB1R b KQkq - +Philidor: Paulsen attack +rnbqkbnr/ppp2ppp/8/3P4/4pP2/3P4/PPP3PP/RNBQKBNR b KQkq - +KGD: Falkbeer, 4.d3 +rnbqkbnr/ppp2ppp/8/3P4/4pP2/8/PPPP2PP/RNBQKBNR w KQkq - +KGD: Falkbeer, 3...e4 +rnbqkbnr/ppp2ppp/8/3Pp3/5P2/8/PPPP2PP/RNBQKBNR b KQkq - +KGD: Falkbeer counter-gambit +rnbqkbnr/ppp2ppp/8/3Pp3/8/8/PPPP1PPP/RNBQKBNR b KQkq - +Center game * +rnbqkbnr/ppp2ppp/8/3p4/1P1Np3/8/P1PPPPPP/RNBQKB1R b KQkq - +Alekhine's defense: O'Sullivan gambit * +rnbqkbnr/ppp2ppp/8/3p4/2B1P3/8/PB3PPP/RN1QK1NR w KQkq - +Danish gambit: Schlechter defense +rnbqkbnr/ppp2ppp/8/3p4/2B1Pp2/8/PPPP2PP/RNBQK1NR w KQkq - +KGA: bishop's gambit, Bledow variation +rnbqkbnr/ppp2ppp/8/3p4/3N4/8/PPP1PPPP/RNBQKB1R b KQkq - +Scandinavian: Marshall variation * +rnbqkbnr/ppp2ppp/8/3p4/3Np3/3P4/PPP1PPPP/RNBQKB1R b KQkq - +Alekhine's defense * +rnbqkbnr/ppp2ppp/8/3p4/3Np3/8/PPPPPPPP/RNBQKB1R w KQkq - +Alekhine's defense * +rnbqkbnr/ppp2ppp/8/3p4/3Pp3/2P5/PP2PPPP/RNBQKBNR w KQkq - +Caro-Kann: advance variation * +rnbqkbnr/ppp2ppp/8/3p4/3Pp3/4P3/PPP2PPP/RNBQKBNR w KQkq - +French: advance variation * +rnbqkbnr/ppp2ppp/8/3p4/3p4/2P5/PP2PPPP/RNBQKBNR w KQkq - +Caro-Kann: exchange variation * +rnbqkbnr/ppp2ppp/8/3p4/3p4/4P3/PPP2PPP/RNBQKBNR w KQkq - +French: exchange variation * +rnbqkbnr/ppp2ppp/8/3p4/3p4/5N2/PPP1PPPP/RNBQKB1R w KQkq - +Scandinavian defense * +rnbqkbnr/ppp2ppp/8/3p4/3p4/5NP1/PPP1PP1P/RNBQKB1R b KQkq - +Scandinavian: Richter variation * +rnbqkbnr/ppp2ppp/8/3p4/3pP3/2P5/PP3PPP/RNBQKBNR w KQkq - +Danish gambit: S\o rensen defense +rnbqkbnr/ppp2ppp/8/3p4/4Pp2/5N2/PPPP2PP/RNBQKB1R w KQkq - +KGA: Abbazia defense (classical defense, modern defense[!]) +rnbqkbnr/ppp2ppp/8/3pP3/8/8/PPPPP1PP/RNBQKBNR b KQkq - +Dutch: Staunton gambit * +rnbqkbnr/ppp2ppp/8/3pp3/2P5/8/PP1PPPPP/RNBQKBNR w KQkq - +Sicilian: Smith-Morra gambit * +rnbqkbnr/ppp2ppp/8/3pp3/2PP4/8/PP2PPPP/RNBQKBNR w KQkq - +QGD: Albin counter-gambit +rnbqkbnr/ppp2ppp/8/3pp3/3P4/2P5/PP2PPPP/RNBQKBNR b KQkq - +Caro-Kann defense * +rnbqkbnr/ppp2ppp/8/3pp3/3P4/4P3/PPP2PPP/RNBQKBNR b KQkq - +French defense * +rnbqkbnr/ppp2ppp/8/3pp3/3P4/8/PPP1PPPP/RNBQKBNR w KQkq - +Blackmar gambit * +rnbqkbnr/ppp2ppp/8/3pp3/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - +QP counter-gambit (elephant gambit) +rnbqkbnr/ppp2ppp/8/3pp3/4PP2/2N5/PPPP2PP/R1BQKBNR b KQkq - +KGD: Falkbeer, Milner-Barry variation +rnbqkbnr/ppp2ppp/8/3pp3/4PP2/5N2/PPPP2PP/RNBQKB1R b KQkq - +KGD: Falkbeer, Tartakower variation +rnbqkbnr/ppp2ppp/8/3pp3/4PP2/8/PPPP2PP/RNBQKBNR w KQkq - +KGD: Falkbeer counter-gambit +rnbqkbnr/ppp2ppp/8/3pp3/5P2/3P4/PPP1P1PP/RNBQKBNR b KQkq - +(Dutch:) Balogh defense * +rnbqkbnr/ppp2ppp/8/3pp3/5P2/8/PPPPP1PP/RNBQKBNR w KQkq - +Dutch: Staunton gambit * +rnbqkbnr/ppp2ppp/8/3pp3/8/2N2P2/PPPPP1PP/R1BQKBNR b KQkq - +KP: Neo-Mongoloid defense * +rnbqkbnr/ppp2ppp/8/3pp3/8/2N5/PPPPPPPP/R1BQKBNR w KQkq - +KP: Nimzovich defense * +rnbqkbnr/ppp2ppp/8/3pp3/8/2P2N2/PP1PPPPP/RNBQKB1R b KQkq - +Caro-Masi defense * +rnbqkbnr/ppp2ppp/8/3pp3/8/2P5/PP1PPPPP/RNBQKBNR w KQkq - +Caro-Kann defense * +rnbqkbnr/ppp2ppp/8/3pp3/8/3P1N2/PPP1PPPP/RNBQKB1R b KQkq - +Pirc defense * +rnbqkbnr/ppp2ppp/8/3pp3/8/3PP3/PPP2PPP/RNBQKBNR b KQkq - +Lengfellner system * +rnbqkbnr/ppp2ppp/8/3pp3/8/4P3/PPPP1PPP/RNBQKBNR w KQkq - +French defense * +rnbqkbnr/ppp2ppp/8/3pp3/8/5P2/PPPPPKPP/RNBQ1BNR b kq - +Fried fox defense * +rnbqkbnr/ppp2ppp/8/3pp3/8/6P1/PPPPPPBP/RNBQK1NR b KQkq - +Robatsch (modern) defense * +rnbqkbnr/ppp2ppp/8/3pp3/8/BP6/P1PPPPPP/RN1QKBNR b KQkq - +Guatemala defense * +rnbqkbnr/ppp2ppp/8/3pp3/8/P3P3/1PPP1PPP/RNBQKBNR b KQkq - +St. George defense * +rnbqkbnr/ppp2ppp/8/4P3/2Pp4/5N2/PP2PPPP/RNBQKB1R b KQkq - +QGD: Albin counter-gambit +rnbqkbnr/ppp2ppp/8/4p3/2Pp4/4P3/PP1P1PPP/RNBQKBNR w KQkq - +Old Benoni: Franco-Benoni defense * +rnbqkbnr/ppp2ppp/8/4p3/2PpP3/3P4/PP3PPP/RNBQKBNR b KQkq - +Semi-Benoni (`blockade variation') * +rnbqkbnr/ppp2ppp/8/8/2pPp3/4P3/PP3PPP/RNBQKBNR w KQkq - +French: advance, Steinitz variation * +rnbqkbnr/ppp3pp/3p4/4Pp2/3p4/8/PPP2PPP/RNBQKBNR w KQkq - +KGD: Falkbeer, 4.d3 * +rnbqkbnr/ppp3pp/3p4/4pp2/2B1P3/5N2/PPPP1PPP/RNBQK2R w KQkq - +Philidor: L\'opez counter-gambit +rnbqkbnr/ppp3pp/3p4/4pp2/3PP3/2N2N2/PPP2PPP/R1BQKB1R b KQkq - +Philidor: Philidor counter-gambit, Zukertort variation +rnbqkbnr/ppp3pp/3p4/4pp2/3PP3/5N2/PPP2PPP/RNBQKB1R w KQkq - +Philidor: Philidor counter-gambit +rnbqkbnr/ppp3pp/4P3/3p2N1/4p3/8/PPP2PPP/RNBQKB1R b KQkq - +Philidor: Philidor counter-gambit, del Rio attack +rnbqkbnr/ppp3pp/4p3/3p1p2/3PP3/8/PPPN1PPP/R1BQKBNR w KQkq - +French: Tarrasch, Haberditz variation +rnbqkbnr/ppp3pp/5p2/3pp3/3P4/2P5/PP2PPPP/RNBQKBNR w KQkq - +Caro-Kann: Tartakower (fantasy) variation * +rnbqkbnr/ppp3pp/5p2/3pp3/3P4/5N2/PPP1PPPP/RNBQKB1R w KQkq - +Blackmar-Diemer gambit * +rnbqkbnr/ppp3pp/8/3Ppp2/8/8/PPPP1PPP/RNBQKBNR w KQkq - +Halasz gambit * +rnbqkbnr/ppp3pp/8/3pN3/2B1p3/8/PPPP1PPP/RNBQK2R w KQkq - +Latvian: Polerio variation +rnbqkbnr/ppp3pp/8/3ppP2/8/8/PPPP1PPP/RNBQKBNR w KQkq - +KGA: Villemson (Steinitz) gambit * +rnbqkbnr/ppp3pp/8/3ppp2/8/6P1/PPPPPPBP/RNBQK1NR w KQkq - +Robatsch defense: three pawns attack * +rnbqkbnr/ppp3pp/8/4pp2/3p4/5N2/PPP2PPP/RNBQKB1R w KQkq - +KGD: Falkbeer, 5.de * +rnbqkbnr/pppp1B1p/8/8/4Ppp1/5N2/PPPP2PP/RNBQK2R b KQkq - +KGA: Lolli gambit (wild Muzio gambit) +rnbqkbnr/pppp1p1p/6p1/4p3/2P1P3/8/PP1P1PPP/RNBQKBNR w KQkq - +English: Adorjan defense +rnbqkbnr/pppp1p1p/6p1/4p3/2P5/8/PP1PPPPP/RNBQKBNR w KQkq - +Sicilian: Steinitz variation * +rnbqkbnr/pppp1p1p/8/4N3/2B1Ppp1/8/PPPP2PP/RNBQK2R b KQkq - +KGA: Salvio gambit +rnbqkbnr/pppp1p1p/8/4N3/3PPpp1/8/PPP3PP/RNBQKB1R b KQkq - +KGA: S\o rensen gambit +rnbqkbnr/pppp1p1p/8/6N1/4PppP/8/PPPP2P1/RNBQKB1R b KQkq - +KGA: Allgaier gambit +rnbqkbnr/pppp1p1p/8/6p1/2B1Pp2/5N2/PPPP2PP/RNBQK2R b KQkq - +KGA: King's knight's gambit +rnbqkbnr/pppp1p1p/8/6p1/3PPp2/5N2/PPP3PP/RNBQKB1R b KQkq - +KGA: Rosentreter gambit +rnbqkbnr/pppp1p1p/8/6p1/4Pp1P/5N2/PPPP2P1/RNBQKB1R b KQkq - +King's knight's gambit +rnbqkbnr/pppp1p1p/8/6p1/4Pp2/2N2N2/PPPP2PP/R1BQKB1R b KQkq - +KGA: Quaade gambit +rnbqkbnr/pppp1p1p/8/8/2B1Ppp1/2N2N2/PPPP2PP/R1BQK2R b KQkq - +KGA: MacDonnell gambit +rnbqkbnr/pppp1p1p/8/8/2B1Ppp1/5N2/PPPP2PP/RNBQ1RK1 b kq - +KGA: Muzio gambit +rnbqkbnr/pppp1p1p/8/8/2BPPpp1/5N2/PPP3PP/RNBQK2R b KQkq - +KGA: Ghulam Kassim gambit +rnbqkbnr/pppp1p2/8/4N2p/4PppP/8/PPPP2P1/RNBQKB1R w KQkq - +KGA: Kieseritsky, long whip (Stockwhip, classical) defense +rnbqkbnr/pppp1pp1/7p/8/4Pp2/5N2/PPPP2PP/RNBQKB1R w KQkq - +KGA: Becker defense +rnbqkbnr/pppp1ppp/4p3/4P3/8/8/PPPP1PPP/RNBQKBNR b KQkq - +French: Steinitz attack +rnbqkbnr/pppp1ppp/4p3/8/2P1P3/8/PP1P1PPP/RNBQKBNR b KQkq - +French defense, Steiner variation +rnbqkbnr/pppp1ppp/4p3/8/2P5/8/PP1PPPPP/RNBQKBNR w KQkq - +English opening +rnbqkbnr/pppp1ppp/4p3/8/3P4/8/PPP1PPPP/RNBQKBNR w KQkq - +Queen's pawn +rnbqkbnr/pppp1ppp/4p3/8/3PP3/8/PPP2PPP/RNBQKBNR b KQkq - +French defense +rnbqkbnr/pppp1ppp/4p3/8/4P3/1P6/P1PP1PPP/RNBQKBNR b KQkq - +French: R\'eti (Spielmann) variation +rnbqkbnr/pppp1ppp/4p3/8/4P3/2N5/PPPP1PPP/R1BQKBNR b KQkq - +French defense +rnbqkbnr/pppp1ppp/4p3/8/4P3/3P4/PPP2PPP/RNBQKBNR b KQkq - +French: King's Indian attack +rnbqkbnr/pppp1ppp/4p3/8/4P3/5N2/PPPP1PPP/RNBQKB1R b KQkq - +French defense +rnbqkbnr/pppp1ppp/4p3/8/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +French defense +rnbqkbnr/pppp1ppp/4p3/8/4P3/8/PPPPQPPP/RNB1KBNR b KQkq - +French: Chigorin variation +rnbqkbnr/pppp1ppp/4p3/8/4PP2/8/PPPP2PP/RNBQKBNR b KQkq - +French: Labourdonnais variation +rnbqkbnr/pppp1ppp/4p3/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - +Van't Kruijs opening * +rnbqkbnr/pppp1ppp/8/4N3/4p3/8/PPPPPPPP/RNBQKB1R b KQkq - +Alekhine's defense: Mokele Mbembe (B\"ucker) variation * +rnbqkbnr/pppp1ppp/8/4p2Q/4P3/8/PPPP1PPP/RNB1KBNR b KQkq - +KP: Patzer opening +rnbqkbnr/pppp1ppp/8/4p3/2B1P3/8/PPPP1PPP/RNBQK1NR b KQkq - +Bishop's opening +rnbqkbnr/pppp1ppp/8/4p3/2P5/2N5/PP1PPPPP/R1BQKBNR b KQkq - +English opening +rnbqkbnr/pppp1ppp/8/4p3/2P5/5N2/PP1PPPPP/RNBQKB1R b KQkq - +English, Nimzovich variation +rnbqkbnr/pppp1ppp/8/4p3/2P5/8/PP1PPPPP/RNBQKBNR b KQkq - +Sicilian defense * +rnbqkbnr/pppp1ppp/8/4p3/2P5/8/PP1PPPPP/RNBQKBNR w KQkq - +English opening +rnbqkbnr/pppp1ppp/8/4p3/3P4/8/PPP1PPPP/RNBQKBNR b KQkq - +Scandinavian (center counter) defense * +rnbqkbnr/pppp1ppp/8/4p3/3P4/8/PPP1PPPP/RNBQKBNR w KQkq - +Queen's pawn: Charlick (Englund) gambit +rnbqkbnr/pppp1ppp/8/4p3/4P3/2N5/PPPP1PPP/R1BQKBNR b KQkq - +Vienna game +rnbqkbnr/pppp1ppp/8/4p3/4P3/2P5/PP1P1PPP/RNBQKBNR b KQkq - +KP: Lopez opening +rnbqkbnr/pppp1ppp/8/4p3/4P3/3P4/PPP2PPP/RNBQKBNR b KQkq - +KP: Indian opening +rnbqkbnr/pppp1ppp/8/4p3/4P3/5N2/PPPP1PPP/RNBQKB1R b KQkq - +King's knight opening +rnbqkbnr/pppp1ppp/8/4p3/4P3/5P2/PPPP2PP/RNBQKBNR b KQkq - +KP: King's head opening +rnbqkbnr/pppp1ppp/8/4p3/4P3/5Q2/PPPP1PPP/RNB1KBNR b KQkq - +KP: Napoleon's opening +rnbqkbnr/pppp1ppp/8/4p3/4P3/8/PPPP1PPP/RNBQKBNR b KQkq - +King's pawn game * +rnbqkbnr/pppp1ppp/8/4p3/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +King's pawn game +rnbqkbnr/pppp1ppp/8/4p3/4P3/8/PPPPNPPP/RNBQKB1R b KQkq - +Alapin's opening +rnbqkbnr/pppp1ppp/8/4p3/4P3/P7/1PPP1PPP/RNBQKBNR b KQkq - +KP: Mengarini's opening +rnbqkbnr/pppp1ppp/8/4p3/4PP2/8/PPPP2PP/RNBQKBNR b KQkq - +King's gambit +rnbqkbnr/pppp1ppp/8/4p3/5P2/8/PPPPP1PP/RNBQKBNR b KQkq - +Fred * +rnbqkbnr/pppp1ppp/8/4p3/5P2/8/PPPPP1PP/RNBQKBNR w KQkq - +Bird: From gambit +rnbqkbnr/pppp1ppp/8/4p3/6P1/8/PPPPPP1P/RNBQKBNR b KQkq - +Reversed Grob (Borg/Basman defense/macho Grob) * +rnbqkbnr/pppp1ppp/8/4p3/8/1P6/P1PPPPPP/RNBQKBNR b KQkq - +Owen defense * +rnbqkbnr/pppp1ppp/8/4p3/8/1P6/P1PPPPPP/RNBQKBNR w KQkq - +Nimzovich-Larsen attack: modern variation +rnbqkbnr/pppp1ppp/8/4p3/8/2N5/PPPPPPPP/R1BQKBNR b KQkq - +KP: Nimzovich defense * +rnbqkbnr/pppp1ppp/8/4p3/8/2N5/PPPPPPPP/R1BQKBNR w KQkq - +Dunst (Sleipner,Heinrichsen) opening +rnbqkbnr/pppp1ppp/8/4p3/8/2P5/PP1PPPPP/RNBQKBNR b KQkq - +Caro-Kann defense * +rnbqkbnr/pppp1ppp/8/4p3/8/3P4/PPP1PPPP/RNBQKBNR w KQkq - +Mieses opening +rnbqkbnr/pppp1ppp/8/4p3/8/3P4/PPPNPPPP/R1BQKBNR b KQkq - +Valencia opening +rnbqkbnr/pppp1ppp/8/4p3/8/4P3/PPPP1PPP/RNBQKBNR b KQkq - +French defense * +rnbqkbnr/pppp1ppp/8/4p3/8/5N2/PPPPPPPP/RNBQKB1R b KQkq - +Alekhine's defense * +rnbqkbnr/pppp1ppp/8/4p3/8/5NP1/PPPPPP1P/RNBQKB1R b KQkq - +Benko's opening: reversed Alekhine +rnbqkbnr/pppp1ppp/8/4p3/8/5P2/PPPPP1PP/RNBQKBNR b KQkq - +Barnes defense * +rnbqkbnr/pppp1ppp/8/4p3/8/5P2/PPPPPKPP/RNBQ1BNR b kq - +Hammerschlag (Fried fox/Pork chop opening) +rnbqkbnr/pppp1ppp/8/4p3/8/6P1/PPPPPP1P/RNBQKBNR b KQkq - +Robatsch (modern) defense * +rnbqkbnr/pppp1ppp/8/4p3/8/7P/PPPPPPP1/RNBQKBNR b KQkq - +Carr's defense * +rnbqkbnr/pppp1ppp/8/4p3/8/8/PPPPPPPP/RNBQKBNR w KQkq - +King's pawn opening * +rnbqkbnr/pppp1ppp/8/4p3/8/N7/PPPPPPPP/R1BQKBNR b KQkq - +Lemming defense * +rnbqkbnr/pppp1ppp/8/4p3/8/P1N5/1PPPPPPP/R1BQKBNR b KQkq - +Battambang opening +rnbqkbnr/pppp1ppp/8/4p3/8/P6P/1PPPPPP1/RNBQKBNR b KQkq - +Global opening +rnbqkbnr/pppp1ppp/8/4p3/8/P7/1PPPPPPP/RNBQKBNR b KQkq - +St. George (Baker) defense * +rnbqkbnr/pppp1ppp/8/4p3/P6P/8/1PPPPPP1/RNBQKBNR b KQkq - +Crab opening +rnbqkbnr/pppp1ppp/8/4p3/P7/8/1PPPPPPP/RNBQKBNR b KQkq - +Corn stalk defense * +rnbqkbnr/pppp1ppp/8/8/2B1Pp2/8/PPPP2PP/RNBQK1NR b KQkq - +KGA: bishop's gambit +rnbqkbnr/pppp1ppp/8/8/2P1p3/5N2/PP1PPPPP/RNBQKB1R w KQkq - +English, Nimzovich, Flohr variation +rnbqkbnr/pppp1ppp/8/8/3Np3/8/PPPPPPPP/RNBQKB1R b KQkq - +Alekhine's defense * +rnbqkbnr/pppp1ppp/8/8/3PPp2/8/PPP3PP/RNBQKBNR b KQkq - +KGA: Villemson (Steinitz) gambit +rnbqkbnr/pppp1ppp/8/8/3QP3/8/PPP2PPP/RNB1KBNR b KQkq - +Center game +rnbqkbnr/pppp1ppp/8/8/3p4/5N2/PPP1PPPP/RNBQKB1R b KQkq - +Scandinavian defense * +rnbqkbnr/pppp1ppp/8/8/3pP3/2P5/PP3PPP/RNBQKBNR b KQkq - +Danish gambit +rnbqkbnr/pppp1ppp/8/8/3pP3/8/PPP2PPP/RNBQKBNR w KQkq - +Center game +rnbqkbnr/pppp1ppp/8/8/3pPP2/8/PPP3PP/RNBQKBNR b KQkq - +Halasz gambit +rnbqkbnr/pppp1ppp/8/8/4Pp1P/8/PPPP2P1/RNBQKBNR b KQkq - +KGA: Pawn's gambit (Stamma gambit) +rnbqkbnr/pppp1ppp/8/8/4Pp2/1P6/P1PP2PP/RNBQKBNR b KQkq - +KGA: Orsini gambit +rnbqkbnr/pppp1ppp/8/8/4Pp2/2N5/PPPP2PP/R1BQKBNR b KQkq - +KGA: Keres (Mason-Steinitz) gambit +rnbqkbnr/pppp1ppp/8/8/4Pp2/3B4/PPPP2PP/RNBQK1NR b KQkq - +KGA: Schurig gambit +rnbqkbnr/pppp1ppp/8/8/4Pp2/5N2/PPPP2PP/RNBQKB1R b KQkq - +King's knight's gambit +rnbqkbnr/pppp1ppp/8/8/4Pp2/5Q2/PPPP2PP/RNB1KBNR b KQkq - +KGA: Breyer gambit +rnbqkbnr/pppp1ppp/8/8/4Pp2/8/PPPP1KPP/RNBQ1BNR b kq - +KGA: Tumbleweed gambit +rnbqkbnr/pppp1ppp/8/8/4Pp2/8/PPPP2PP/RNBQKBNR w KQkq - +King's gambit accepted +rnbqkbnr/pppp1ppp/8/8/4Pp2/8/PPPPB1PP/RNBQK1NR b KQkq - +KGA: Lesser bishop's (Petroff-Jaenisch-Tartakower) gambit +rnbqkbnr/pppp1ppp/8/8/4Pp2/8/PPPPQ1PP/RNB1KBNR b KQkq - +KGA: Carrera (Basman) gambit +rnbqkbnr/pppp1ppp/8/8/4p3/4P3/PPPP1PPP/RNBQKBNR w KQkq - +French: Steinitz attack * +rnbqkbnr/pppp1ppp/8/8/4p3/8/PPPPPPPP/RNBQKBNR b KQkq - +Alekhine's defense: Brooklyn defense * +rnbqkbnr/pppp2p1/8/4pP1p/8/8/PPPP1PPP/RNBQKBNR w KQkq - +KGA: Pawn's gambit (Stamma gambit) * +rnbqkbnr/pppp2pp/4p3/5p2/2PP4/2N5/PP2PPPP/R1BQKBNR b KQkq - +Dutch defense, Rubinstein variation +rnbqkbnr/pppp2pp/4p3/5p2/2PP4/8/PP2PPPP/RNBQKBNR w KQkq - +Dutch defense +rnbqkbnr/pppp2pp/4p3/5p2/2PPP3/8/PP3PPP/RNBQKBNR b KQkq - +Dutch: Staunton gambit deferred +rnbqkbnr/pppp2pp/4p3/5p2/3P2P1/3Q4/PPP1PP1P/RNB1KBNR b KQkq - +Dutch, Von Pretzel gambit +rnbqkbnr/pppp2pp/5p2/4p3/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - +Damiano's defense +rnbqkbnr/pppp2pp/5p2/4p3/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +KP: King's head opening * +rnbqkbnr/pppp2pp/8/4Pp2/3p4/8/PPP2PPP/RNBQKBNR b KQkq - +KGD: Falkbeer, 3...e4 * +rnbqkbnr/pppp2pp/8/4pP2/8/8/PPPP1PPP/RNBQKBNR b KQkq - +King's gambit accepted * +rnbqkbnr/pppp2pp/8/4pp2/2B1P3/3P4/PPP2PPP/RNBQK1NR b KQkq - +Bishop's opening: Calabrese counter-gambit, Jaenisch variation +rnbqkbnr/pppp2pp/8/4pp2/2B1P3/5N2/PPPP1PPP/RNBQK2R b KQkq - +Latvian gambit, 3.Bc4 +rnbqkbnr/pppp2pp/8/4pp2/2B1P3/8/PPPP1PPP/RNBQK1NR b KQkq - +KGD: classical variation * +rnbqkbnr/pppp2pp/8/4pp2/2B1P3/8/PPPP1PPP/RNBQK1NR w KQkq - +Bishop's opening: Calabrese counter-gambit +rnbqkbnr/pppp2pp/8/4pp2/2P1P3/8/PP1P1PPP/RNBQKBNR b KQkq - +KGD: Mafia defense * +rnbqkbnr/pppp2pp/8/4pp2/2P5/8/PP1PPPPP/RNBQKBNR w KQkq - +Sicilian: Grand Prix attack * +rnbqkbnr/pppp2pp/8/4pp2/3P4/8/PPP1PPPP/RNBQKBNR w KQkq - +Bird's opening: Williams gambit * +rnbqkbnr/pppp2pp/8/4pp2/3PP3/8/PPP2PPP/RNBQKBNR b KQkq - +KGD: Falkbeer counter-gambit * +rnbqkbnr/pppp2pp/8/4pp2/4P3/5N2/PPPP1PPP/RNBQKB1R b KQkq - +KGD: 2...Nf6 * +rnbqkbnr/pppp2pp/8/4pp2/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - +Latvian counter-gambit +rnbqkbnr/pppp2pp/8/4pp2/4P3/5Q2/PPPP1PPP/RNB1KBNR b KQkq - +KGD: Norwalde variation * +rnbqkbnr/pppp2pp/8/4pp2/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +King's gambit * +rnbqkbnr/pppp2pp/8/4pp2/8/4P3/PPPP1PPP/RNBQKBNR w KQkq - +French: Labourdonnais variation * +rnbqkbnr/pppp2pp/8/5p2/2B1Pp2/8/PPPP2PP/RNBQK1NR w KQkq - +KGA: bishop's gambit, L\'opez-Gianutio counter-gambit +rnbqkbnr/pppp2pp/8/5p2/3pP3/2P5/PP3PPP/RNBQKBNR b KQkq - +KGD: Nimzovich counter-gambit * +rnbqkbnr/pppp2pp/8/5p2/3pP3/8/PPP2PPP/RNBQKBNR w KQkq - +KGD: Falkbeer counter-gambit * +rnbqkbnr/pppp2pp/8/5p2/4Pp2/5N2/PPPP2PP/RNBQKB1R w KQkq - +KGA: Gianutio counter-gambit +rnbqkbnr/pppp3p/6p1/4pp2/4P3/8/PPPPQPPP/RNB1KBNR b KQkq - +KGD: Keene's defense * +rnbqkbnr/ppppp1pp/5p2/8/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +Barnes defense +rnbqkbnr/ppppp1pp/5p2/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - +Gedult's opening * +rnbqkbnr/ppppp1pp/8/5p2/2P5/8/PP1PPPPP/RNBQKBNR w KQkq - +English: Anglo-Dutch defense +rnbqkbnr/ppppp1pp/8/5p2/2PP4/8/PP2PPPP/RNBQKBNR b KQkq - +Dutch defense +rnbqkbnr/ppppp1pp/8/5p2/3P2P1/8/PPP1PP1P/RNBQKBNR b KQkq - +Dutch, Krejcik gambit +rnbqkbnr/ppppp1pp/8/5p2/3P4/3Q4/PPP1PPPP/RNB1KBNR b KQkq - +Dutch, Manhattan (Alapin, Ulvestad) variation +rnbqkbnr/ppppp1pp/8/5p2/3P4/6P1/PPP1PP1P/RNBQKBNR b KQkq - +Dutch defense +rnbqkbnr/ppppp1pp/8/5p2/3P4/7P/PPP1PPP1/RNBQKBNR b KQkq - +Dutch, Korchnoi attack +rnbqkbnr/ppppp1pp/8/5p2/3P4/8/PPP1PPPP/RNBQKBNR b KQkq - +Bird's opening * +rnbqkbnr/ppppp1pp/8/5p2/3P4/8/PPP1PPPP/RNBQKBNR w KQkq - +Dutch +rnbqkbnr/ppppp1pp/8/5p2/3PP3/8/PPP2PPP/RNBQKBNR b KQkq - +Dutch: Staunton gambit +rnbqkbnr/ppppp1pp/8/5p2/4P3/5N2/PPPP1PPP/RNBQKB1R b KQkq - +R\'eti: Pirc-Lisitsin gambit +rnbqkbnr/ppppp1pp/8/5p2/4P3/8/PPPP1PPP/RNBQKBNR b KQkq - +Bird: From gambit * +rnbqkbnr/ppppp1pp/8/5p2/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +Fred +rnbqkbnr/ppppp1pp/8/5p2/6P1/8/PPPPPP1P/RNBQKBNR b KQkq - +Bird: Hobbs gambit * +rnbqkbnr/ppppp1pp/8/5p2/8/1P6/P1PPPPPP/RNBQKBNR w KQkq - +Nimzovich-Larsen attack: Dutch variation +rnbqkbnr/ppppp1pp/8/5p2/8/5N2/PPPPPPPP/RNBQKB1R w KQkq - +R\'eti v Dutch +rnbqkbnr/ppppp1pp/8/5p2/8/8/PPPPPPPP/RNBQKBNR w KQkq - +Bird's opening * +rnbqkbnr/ppppp1pp/8/5pB1/3P4/8/PPP1PPPP/RN1QKBNR b KQkq - +Dutch, 2.Bg5 variation +rnbqkbnr/ppppp1pp/8/8/3Pp3/8/PPP2PPP/RNBQKBNR w KQkq - +Dutch: Staunton gambit +rnbqkbnr/pppppp1p/6p1/8/2P5/8/PP1PPPPP/RNBQKBNR w KQkq - +English opening +rnbqkbnr/pppppp1p/6p1/8/3P4/8/PPP1PPPP/RNBQKBNR w KQkq - +Modern defense +rnbqkbnr/pppppp1p/6p1/8/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +Robatsch (modern) defense +rnbqkbnr/pppppp1p/6p1/8/7P/8/PPPPPPP1/RNBQKBNR b KQkq - +Lasker simul special * +rnbqkbnr/pppppp1p/6p1/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - +Benko's opening * +rnbqkbnr/pppppp1p/8/6p1/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +Reversed Grob (Borg/Basman defense/macho Grob) +rnbqkbnr/pppppp1p/8/6p1/5P2/8/PPPPP1PP/RNBQKBNR w KQkq - +Bird: Hobbs gambit +rnbqkbnr/pppppp1p/8/6p1/8/5N2/PPPPPPPP/RNBQKB1R w KQkq - +R\'eti: Herrstr\"om gambit +rnbqkbnr/pppppp1p/8/6p1/8/8/PPPPPPPP/RNBQKBNR w KQkq - +Grob's attack * +rnbqkbnr/ppppppp1/7p/8/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +Carr's defense +rnbqkbnr/ppppppp1/7p/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - +Clemenz (Mead's, Basman's or de Klerk's) opening * +rnbqkbnr/ppppppp1/8/7p/8/6P1/PPPPPP1P/RNBQKBNR w KQkq - +Lasker simul special +rnbqkbnr/ppppppp1/8/7p/8/8/PPPPPPPP/RNBQKBNR w KQkq - +Anti-Borg (Desprez) opening * +rnbqkbnr/pppppppp/8/4P3/8/8/PPPP1PPP/RNBQKBNR w KQkq - +Alekhine's defense: Brooklyn defense +rnbqkbnr/pppppppp/8/8/1P6/8/P1PPPPPP/RNBQKBNR b KQkq - +Polish (Sokolsky) opening +rnbqkbnr/pppppppp/8/8/2P5/8/PP1PPPPP/RNBQKBNR b KQkq - +English opening +rnbqkbnr/pppppppp/8/8/3P4/8/PPP1PPPP/RNBQKBNR b KQkq - +Queen's pawn +rnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBNR b KQkq - +King's pawn opening +rnbqkbnr/pppppppp/8/8/5P2/8/PPPPP1PP/RNBQKBNR b KQkq - +Bird's opening +rnbqkbnr/pppppppp/8/8/6P1/8/PPPPPP1P/RNBQKBNR b KQkq - +Grob's attack +rnbqkbnr/pppppppp/8/8/7P/8/PPPPPPP1/RNBQKBNR b KQkq - +Anti-Borg (Desprez) opening +rnbqkbnr/pppppppp/8/8/8/1P6/P1PPPPPP/RNBQKBNR b KQkq - +Nimzovich-Larsen attack +rnbqkbnr/pppppppp/8/8/8/2N5/PPPPPPPP/R1BQKBNR b KQkq - +Dunst (Sleipner, Heinrichsen) opening +rnbqkbnr/pppppppp/8/8/8/2P5/PP1PPPPP/RNBQKBNR b KQkq - +Saragossa opening +rnbqkbnr/pppppppp/8/8/8/3P4/PPP1PPPP/RNBQKBNR b KQkq - +Mieses opening +rnbqkbnr/pppppppp/8/8/8/4P3/PPPP1PPP/RNBQKBNR b KQkq - +Van't Kruijs opening +rnbqkbnr/pppppppp/8/8/8/5N2/PPPPPPPP/RNBQKB1R b KQkq - +R\'eti opening +rnbqkbnr/pppppppp/8/8/8/5P2/PPPPP1PP/RNBQKBNR b KQkq - +Gedult's opening +rnbqkbnr/pppppppp/8/8/8/6P1/PPPPPP1P/RNBQKBNR b KQkq - +Benko's opening +rnbqkbnr/pppppppp/8/8/8/7N/PPPPPPPP/RNBQKB1R b KQkq - +Amar (Paris) opening +rnbqkbnr/pppppppp/8/8/8/7P/PPPPPPP1/RNBQKBNR b KQkq - +Clemenz (Mead's, Basman's or de Klerk's) opening +rnbqkbnr/pppppppp/8/8/8/N7/PPPPPPPP/R1BQKBNR b KQkq - +Durkin's attack +rnbqkbnr/pppppppp/8/8/8/P7/1PPPPPPP/RNBQKBNR b KQkq - +Anderssen's opening +rnbqkbnr/pppppppp/8/8/P7/8/1PPPPPPP/RNBQKBNR b KQkq - +Ware (Meadow Hay) opening +rnbqkr2/pppp1pQp/8/2b1P3/3P4/5N2/PPP3PP/RNB1KB1n b KQq - +Latvian: Behting variation * +rnbqkr2/ppppbp1p/5N2/4Q3/8/8/PPPP1nPP/R1B1KBNR b KQq - +Blackburne shilling gambit * +rnbqr1k1/1p1p1ppp/pbp2n2/4p3/1P2P3/P1NP1N2/2P1BPPP/R1BQ1RK1 w - - +Ruy Lopez: closed, Suetin variation * +rnbqr1k1/1p3pp1/2p2n1p/p1bpp3/4P3/PBNP1N2/1PP1QPPP/R1B1K2R w KQ - +Giuoco Piano: Tarrasch variation * +rnbqr1k1/1pb2ppp/2p2n2/p2pp3/NPP1P3/P2P1N2/2Q1BPPP/R1B1K2R w KQ - +Ruy Lopez: closed, Balla variation * +rnbqr1k1/1ppp1ppp/1b3n2/p3p3/1P2P3/P1N2N2/2PPBPPP/R1BQ1RK1 w - - +Ruy Lopez: closed, anti-Marshall 8.a4 * +rnbqr1k1/p1pp1ppp/5n2/1p2p3/1bP1P3/2N3P1/PP1P1PBP/R1BQK1NR w KQ - +Sicilian: Nimzovich-Rossolimo attack, Gurgenidze variation * +rnbqr1k1/pp1p1pp1/1bp2n1p/4p3/1P2P3/P1NP1N1P/2P1BPP1/R1BQ1RK1 b - - +Ruy Lopez: closed, Smyslov defense * +rnbqr1k1/pp1p1pp1/1bp2n1p/4p3/1P2P3/P1NP1N2/1BP1BPPP/R2Q1RK1 b - - +Ruy Lopez: closed, Flohr-Zaitsev system (Lenzerheide variation) * +rnbqr1k1/pp1p1pp1/1bp2n1p/4p3/1P2P3/P1NP1N2/2P1BPPP/R1BQ1RK1 w - - +Ruy Lopez: closed, 9.h3 * +rnbqr1k1/pp1p1pp1/1bp2n1p/4p3/1P2P3/P1NP4/2PNBPPP/R1BQ1RK1 b - - +Ruy Lopez: closed, Ragozin-Petrosian (`Keres') variation * +rnbqr1k1/pp1p1pp1/1bp2n1p/4p3/1P2P3/P1NPBN2/2P1BPPP/R2Q1RK1 b - - +Ruy Lopez: closed, Kholmov variation * +rnbqr1k1/pp1p1pp1/1bp2n1p/4p3/1P2P3/P2P1N2/2P1BPPP/RNBQ1RK1 b - - +Ruy Lopez: closed, Breyer defense * +rnbqr1k1/pp1p1pp1/1bp2n1p/4p3/PP2P3/2NP1N2/2P1BPPP/R1BQ1RK1 b - - +Ruy Lopez: closed, Keres (9...a5) variation * +rnbqr1k1/pp1p1ppp/1bp2n2/4P3/1P1p4/P1N2N2/2P1BPPP/R1BQ1RK1 b - - +Ruy Lopez: Marshall, Herman Steiner variation * +rnbqr1k1/pp1p1ppp/1bp2n2/4p3/1P1PP3/P1N2N2/2P1BPPP/R1BQ1RK1 b - - +Ruy Lopez: Marshall counter-attack * +rnbqr1k1/pp1p1ppp/1bp2n2/4p3/1P2P3/P1N2N2/2PPBPPP/R1BQ1RK1 w - - +Ruy Lopez: closed, 8.c3 * +rnbqr1k1/pp1p1ppp/1bp2n2/4p3/1P2P3/P1NP1N2/2P1BPPP/R1BQ1RK1 b - - +Ruy Lopez: closed (with ...d6) * +rnbqr1k1/pp3p1p/1bp3pQ/3p4/1P1N4/P1PB4/5PPP/R1B2RK1 b - - +Ruy Lopez: Marshall, main line, 14...Qh3 * +rnbqr1k1/pp3pbp/3p1np1/2pP4/4P3/2N2N2/PP2BPPP/R1BQ1RK1 w - - +Benoni: classical, 9...Re8 +rnbqr1k1/pp3pbp/3p1np1/2pP4/4P3/2N5/PP1NBPPP/R1BQ1RK1 b - - +Benoni: classical, 9...Re8, 10.Nd2 +rnbqr1k1/pp3pbp/3p1np1/2pP4/4PP2/2N2N2/PP2B1PP/R1BQK2R w KQ - +Benoni: four pawns attack, main line +rnbqr1k1/pp3pp1/1bp2n1p/3pp3/1P2P3/P2P1N2/2P1BPPP/RNBQ1RK1 w - - +Ruy Lopez: closed, Breyer, 10.d4 * +rnbqr1k1/pp3pp1/1bp2n1p/3pp3/1P2P3/P2P1N2/2PNBPPP/R1BQ1RK1 b - - +Ruy Lopez: closed, Breyer, Borisenko variation * +rnbqr1k1/pp3pp1/1bp4p/3pp2n/1P2P3/P2P1N2/2PNBPPP/R1BQ1RK1 w - - +Ruy Lopez: closed, Breyer, Simagin variation * +rnbqr1k1/pp3ppB/3b1n2/3pN1B1/3p1P2/8/PPP3PP/RN1Q1RK1 b - - +Petrov: classical attack, Marshall trap * +rnbqr1k1/pp3ppp/1bp2n2/3pp1B1/1P2P3/P1NP1N2/2P1BPPP/R2Q1RK1 b - - +Ruy Lopez: closed, Bogolyubov variation * +rnbqr1k1/pp3ppp/1bp2n2/3pp3/1P2P3/P1NP1N2/2P1BPPP/R1BQ1RK1 w - - +Ruy Lopez: closed, 9.d4 * +rnbqr1k1/pp3ppp/1bp2n2/4N3/1P1Pp3/P1N1B3/2P1BPPP/R2QK2R w KQ - +Ruy Lopez: open, 9...Be7, 10.Re1 * +rnbqr1k1/pp3ppp/1bp5/3nN3/1P1PN3/P3B3/2P1BPPP/R2Q1RK1 b - - +Ruy Lopez: open, Breslau variation * +rnbqr1k1/pp3ppp/1bpp1n2/4p3/1P2P3/P1NP1N2/2P1BPPP/R1BQ1RK1 w - - +Ruy Lopez: closed, Pilnik variation * +rnbqr1k1/pp3ppp/3b1n2/2ppN1B1/3P1P2/2N5/PPP1B1PP/R2QK2R w KQ - +Petrov: classical attack, Krause variation * +rnbqr1k1/pp3ppp/3b1n2/2ppN1BB/3P1P2/2N5/PPP3PP/R2QK2R b KQ - +Petrov: classical attack, Mar\'oczy variation * +rnbqr1k1/ppb2pp1/2p2n1p/3pp3/1PP1P3/P1NP1N2/4BPPP/R1BQ1RK1 b - - +Ruy Lopez: closed, Borisenko defense * +rnbqr1k1/ppb2pp1/2p2n1p/3pp3/NP2P3/P1PP1N2/2Q1BPPP/R1B2RK1 b - - +Ruy Lopez: closed, Rossolimo defense * +rnbqr1k1/ppb2pp1/2p2n1p/3pp3/NPP1P3/P2P1N2/2Q1BPPP/R1B2RK1 b - - +Ruy Lopez: closed, Chigorin defense * +rnbqr1k1/ppb2pp1/2p2n1p/3pp3/NPP1P3/P2P4/3NBPPP/R1BQ1RK1 b - - +Ruy Lopez: closed, Keres (...Nd7) defense * +rnbqr1k1/ppbp1pp1/2p2n1p/4p3/NP2P3/P2P1N2/2P1BPPP/R1BQ1RK1 w - - +Ruy Lopez: closed (9...Na5) * +rnbqr1k1/ppbp1pp1/2p2n1p/4p3/NPP1P3/P2P1N2/4BPPP/R1BQ1RK1 b - - +Ruy Lopez: closed (10...c5) * +rnbqr1k1/ppbp1ppp/2p2n2/4p3/1P2P3/P1NP1N2/2P1BPPP/R1BQ1RK1 w - - +Ruy Lopez: closed, Lutikov variation * +rnbqr1k1/ppp2ppp/1b3n2/3pp3/1P2P3/P1NP1N2/2P1BPPP/R1BQK2R w KQ - +Ruy Lopez: closed, 7...d6, 8.d4 * +rnbqr1k1/ppp2ppp/3b1n2/3pN3/3P4/2N5/PPP1BPPP/R1BQK2R w KQ - +Petrov: classical attack, Chigorin variation * +rnbqr1k1/ppp2ppp/5n2/2PP4/2B5/2N1B3/PPP2PpP/R2QK2R w KQ - +two knights: Max Lange attack, Schlechter variation * +rnbqr1k1/ppp2ppp/8/2PP4/2B3n1/2N1BpP1/PPP2P1P/R2QK2R b KQ - +two knights: Max Lange attack, Loman defense * +rnbqr1k1/pppp1ppp/1b3n2/4p3/1P2P3/P1N2N2/1BPPBPPP/R2QK2R b KQ - +Ruy Lopez: Trajkovi\'c counter-attack * +rnbqr1k1/pppp1ppp/1b3n2/4p3/1P2P3/P1N2N2/2PPBPPP/R1BQ1RK1 b - - +Ruy Lopez: closed, 7...O-O * +rnbqr1k1/pppp1ppp/1b3n2/4p3/1P2P3/P1N2N2/2PPBPPP/R1BQK2R w KQ - +Ruy Lopez: closed * +rnbqr1k1/pppp1ppp/5n2/b3p3/4P3/P1NP1N2/1PP1BPPP/R1BQK2R b KQ - +Ruy Lopez: closed, Averbach variation * +rnbr2k1/1pq1ppbp/5np1/p1pp4/3P4/1PP1PN2/P2NBPPP/R1BQ1RK1 w - - +Catalan: closed, Zagoryansky variation * +rnbr2k1/pp2qppp/5n2/2b1N3/3Pp3/P1N1B3/2PQBPPP/R4RK1 b - - +Ruy Lopez: open, Howell attack, Ekstr\"om variation * +rnq1kb1r/pp3ppp/4pn2/3p1b2/3P4/NQ2PN2/PP1B1PPP/R3KB1R b KQkq - +QGD Slav: Landau variation diff --git a/lasker-2.2.3/data/book/long999.idx b/lasker-2.2.3/data/book/long999.idx new file mode 100755 index 0000000..a370e2e --- /dev/null +++ b/lasker-2.2.3/data/book/long999.idx @@ -0,0 +1,8076 @@ +1q3rk1/pp3ppp/2r1pn2/2bp4/4P3/2P5/PP1NQPPP/R1B2RK1 w - - +QGD: Orthodox defense, classical, 13.d1b1 (Mar\'oczy) * +1r2kb1r/p1pq2pp/Q1n5/3npp2/6b1/P2PPN2/1P3PPP/RNB1KB1R b KQk - +Sicilian: Najdorf, Poisoned pawn variation * +1rb2rk1/pp3ppp/5q2/3P4/1n6/2P1Q3/PP3PPP/RN2KB1R w KQ - +Scotch: Gottschall variation +1rbq1rk1/1pp1ppbp/p1np1np1/8/2PPP3/2N1BP2/PP1QN1PP/R3KB1R w KQ - +King's Indian: S\"amisch, Panno main line +1rbq1rk1/ppp1ppbp/2np1np1/8/2PPP3/2N1BP2/PP2N1PP/R2QKB1R w KQ - +King's Indian: S\"amisch, Ruban variation +1rbqk1nr/pp1pppbp/2n3p1/2p5/4P3/2N3P1/PPPP1PBP/R1BQK1NR w KQk - +English: closed, 5.Rb1 * +1rbqk1nr/pp1pppbp/2n3p1/2p5/4P3/2N3PN/PPPP1PBP/R1BQK2R b KQk - +English: closed, 5.Rb1 Taimanov variation * +1rbqkb1r/p4ppp/2p2n2/nB2p1N1/8/5Q2/PPPP1PPP/RNB1K2R w KQk - +two knights defense: Colman variation +2bqkbnr/r4ppp/p1npp3/1p6/4P3/1BN2N2/PP2QPPP/R1B2RK1 w k - +Sicilian: Smith-Morra gambit, Chicago defense +2kr1b1r/ppp3pp/2n2q2/3npp2/6b1/P2PPN2/1PQNBPPP/R1B1K2R b KQ - +Sicilian: Najdorf, 7...Be7 main line * +2kr1b1r/ppp3pp/2n5/3qpp2/6b1/3PPN2/PP2BPPP/R1BQ1RK1 w - - +Sicilian: Richter-Rauzer, Rauzer attack, 7...Be7 defense, 9...Nxd4 * +2kr1b1r/pppq1ppp/2n5/3np3/6b1/P1NPPN2/1P1B1PPP/R2QKB1R b KQ - +Sicilian: Richter-Rauzer, Rauzer attack, 7...a6 defense, 8...Bd7 * +2kr1b1r/pppq2pp/2n1bp2/3np3/8/2NP1NP1/PP2PPBP/R1BQ1RK1 w - - +Sicilian: dragon, Yugoslav attack, Rauser variation * +2kr1b1r/pppq2pp/2n2n2/2Pp1p2/3Pp3/2N1P3/PP1NQPPP/R1B2RK1 b - - +French: classical, St\a hlberg variation * +2kr1b1r/pppq2pp/2n2n2/4pp2/1P6/P1NPPb2/3BBPPP/R2QK2R w KQ - +Sicilian: Richter-Rauzer, Rauzer attack, 7...a6 defense, 11.Bxf6 * +2kr1b1r/pppq2pp/2n5/3Npp2/6b1/3PPN2/PP2BPPP/R1BQ1RK1 b - - +Sicilian: Richter-Rauzer, Rauzer attack, 7...Be7 defense, 9...Nxd4 * +2kr1b1r/pppq2pp/2n5/3npp2/4P1b1/2NP1N2/PP2BPPP/R1BQ1RK1 b - - +Sicilian: Richter-Rauzer, Rauzer attack, Geller variation * +2kr1b1r/pppq2pp/2n5/3npp2/6b1/2NPPN2/PP2BPPP/R1BQ1RK1 w - - +Sicilian: Richter-Rauzer, Rauzer attack, 7...Be7 defense, 9.f4 * +2kr1b1r/pppq2pp/2n5/3npp2/6b1/P1NPPN2/1P1BBPPP/R2QK2R b KQ - +Sicilian: Richter-Rauzer, Rauzer attack, 7...a6 defense, 9...Be7 * +2kr3r/pp2bppp/2nqbn2/3pp1B1/8/1NN3P1/PPP1PPBP/R2Q1RK1 w - - +Gr\"unfeld: Russian, Keres variation * +2kr3r/ppp2ppp/1bn1bPq1/6N1/2ppNPP1/8/PPP4P/R1BQR1K1 w - - +two knights: Max Lange attack, Berger variation +2kr3r/pppb1ppp/2n1q2n/1Bb1p3/8/2NP1N2/PPP2PPP/R1BQR1K1 w - - +Center game: Kupreichik variation * +2kr3r/pppq2p1/1bn1bp2/3np2p/Q7/2NP1NP1/PP1BPPBP/R1R3K1 w - - +Sicilian: dragon, Yugoslav attack, 12.h4 * +2kr3r/pppq2pp/2n1bp2/2bnp3/8/2NP1NP1/PP1BPPBP/R2Q1RK1 w - - +Sicilian: dragon, Yugoslav attack, 10.O-O-O * +2kr3r/pppqbppp/1nn1p3/4Pb2/2PP4/2N1BN2/PP2B1PP/R2Q1RK1 w - - +Alekhine's defense: four pawns attack, Tartakower variation +2kr3r/pppqbppp/2n1b3/3np3/8/2NP1NP1/PP2PPBP/R1BQ1RK1 w - - +Sicilian: dragon, classical, Grigoriev variation * +2kr3r/ppq1nppp/2nbp3/3p4/3P2b1/5N2/PPP1BPPP/R1BQRNK1 w - - +QGD: exchange, chameleon variation * +2krr3/pppq1ppp/1bn5/3n4/QPN1p1b1/P2PPN2/1B3PPP/R3KB1R w KQ - +Sicilian: Najdorf, Ivkov variation * +2r1kb1r/1pq2ppp/p1n1pn2/2pp4/3P2b1/P1P1PN2/1P1NBPPP/R1BQ1RK1 w k - +QGD: Orthodox defense, Rubinstein attack, Gr\"unfeld variation * +2r1kb1r/ppq2ppp/2n1pn2/2pp4/3P2b1/2P1PN2/PP1NBPPP/R1BQ1RK1 w k - +QGD: Orthodox defense, Rubinstein attack (with Rc1) * +2r1kb1r/ppq2ppp/2n1pn2/2pp4/3P2b1/P1P1PN2/1P1NBPPP/R1BQ1RK1 b k - +QGD: Orthodox defense, Rubinstein attack, Karlsbad variation * +2r1kb1r/ppq2ppp/2n1pn2/2ppN3/3P2b1/2P1P3/PP1NBPPP/R1BQ1RK1 b k - +QGD: Orthodox defense, Rubinstein attack, Wolf variation * +2r1kb1r/ppq2ppp/2n1pn2/3p4/3p2b1/P1P1PN2/1P1NBPPP/R1BQ1RK1 w k - +QGD: Orthodox defense, Rubinstein attack, main line * +2rq1rk1/pp2ppbp/2n2np1/2Pp4/3P2b1/2N1BN2/PP2BPPP/R2Q1RK1 b - - +QGD: Tarrasch, Bogolyubov variation * +2rq1rk1/pp2ppbp/2n2np1/3p4/2PP2b1/1PN1BN2/P3BPPP/R2Q1RK1 b - - +QGD: Tarrasch, Stoltz variation * +2rq1rk1/pp3ppp/2n1pn2/2bp4/3N4/2P1P3/PP1NQPPP/R1B2RK1 w - - +QGD: Orthodox defense, Bd3 line, 11.O-O * +2rq1rk1/pp3ppp/2n1pn2/2bp4/8/2P1PB1P/PP1N1PP1/R1BQ1RK1 w - - +QGD: Petrosian variation * +2rqk2r/pp3pp1/2n1pn2/2bp3p/3N2b1/2P1P3/PP1NBPPP/R1BQ1RK1 w k - +QGD: Orthodox defense, Bd3 line, Janowski variation * +2rqk2r/pp3ppp/2n1pn2/2bp4/1P4b1/2P1PN2/P2NBPPP/R1BQ1RK1 b k - +QGD: Orthodox defense, Bd3 line, fianchetto variation * +2rqk2r/pp3ppp/2n1pn2/2bp4/3N2b1/2P1P3/PP1NBPPP/R1BQ1RK1 b k - +QGD: Orthodox defense, Bd3 line, Capablanca freeing maneuver * +2rqk2r/pp3ppp/2n1pn2/2bp4/3N4/2P1P3/PP1NQPPP/R1B2RK1 b k - +QGD: Orthodox defense, Bd3 line * +2rqk2r/pp3ppp/2n1pn2/3p4/1b1P2b1/1P3N2/P1PNBPPP/R1BQ1RK1 w k - +QGD: Orthodox defense, Capablanca variation * +2rqk2r/pp3ppp/2nbpn2/2pp4/3P2b1/2P1PN2/PP1NBPPP/R1BQ1RK1 w k - +QGD: Orthodox defense, Bd3 line * +2rqk2r/pp3ppp/2nbpn2/3p4/3P2b1/1P3N2/P1PNBPPP/R1BQ1RK1 w k - +QGD: Orthodox defense, Pillsbury attack * +2rqk2r/pp3ppp/4pn2/2bpn3/3N4/2P1P3/PP1NQPPP/R1B2RK1 w k - +QGD: Orthodox defense, Bd3 line, Alekhine variation * +2rqkb1r/pp1bpppp/2n2n2/2pp4/Q2P4/2P1PN2/PP1N1PPP/R1B1KB1R w KQk - +QGD: Rochlin variation * +2rqkb1r/pp3ppp/2n1pn2/2pp4/3P2b1/2P1PN2/PP1NBPPP/R1BQ1RK1 b k - +QGD: Orthodox defense * +2rqkb1r/pp3ppp/2n1pn2/2pp4/3P2b1/4PN2/PPPNBPPP/R1BQ1RK1 w k - +QGD: Orthodox defense, 7.Rc1 * +2rqkb1r/pp3ppp/2n1pn2/2pp4/3P2b1/P3PN2/1PPNBPPP/R1BQ1RK1 b k - +QGD: Orthodox defense, Swiss (Henneberger) variation * +2rqkb1r/pp3ppp/2n1pn2/3p4/3p2b1/P3PN2/1PPNBPPP/R1BQ1RK1 w k - +QGD: Orthodox defense, Swiss, Karlsbad variation * +2rqkb1r/pp3ppp/4pn2/3p4/3P4/1P2B2P/P1P1QPP1/RN3RK1 b k - +QGD: Tartakower variation * +2rqkbnr/pp3ppp/2n1p3/2p2b2/2pP4/4BNP1/PP2PPBP/RN1Q1RK1 b k - +Gr\"unfeld: Gr\"unfeld gambit, Botvinnik variation * +2rqkbnr/pp3ppp/2n1p3/2pp1b2/3P4/5NP1/PPP1PPBP/RNBQ1RK1 w k - +Gr\"unfeld: Gr\"unfeld gambit, Capablanca variation * +2rqkbnr/pp3ppp/2n1p3/2pp4/3P2b1/4PN2/PPP1BPPP/RNBQ1RK1 w k - +QGD: Anti-neo-orthodox variation * +3q1rk1/pp3ppp/2r1p3/2b5/4Q3/2P5/PP3PPP/R1B2RK1 b - - +QGD: Orthodox defense, classical, 13.de * +3q1rk1/pp3ppp/2r1pn2/2bp4/4P3/2P5/PP1NQPPP/R1B2RK1 b - - +QGD: Orthodox defense, classical variation * +4rrk1/pppb2pp/2np1q2/2b2P2/4Q3/2N4B/PPPPNP1P/R1B1K2R w KQ - +KGA: Muzio gambit, Paulsen variation * +5rk1/5ppp/p1pbr3/1p1n3q/P2P2b1/1BPQB1P1/1P1N1P1P/R3R1K1 w - - +Ruy Lopez: Marshall, main line, Spassky variation +5rk1/ppq2ppp/2r1pn2/2bp4/4P3/2P5/PP1NQPPP/R1B2RK1 w - - +QGD: Orthodox defense, classical, 13.d1c2 (Vidmar) * +N1bk1b1r/p2pq2p/1pnn2p1/3Qpp2/8/1B6/PPPP1PPP/R1B1K1NR w KQ - +Vienna: `Frankenstein-Dracula' variation +N1bk3r/pp1p1ppp/2n2n2/8/1b6/P4B1q/1PPN1P1P/R1BQK2R b KQ - +Scotch: Berger variation +r1b1k1nr/ppp2ppp/1bn5/3p4/4P2q/2NN4/PPPP1PPP/R1BQKB1R w KQkq - +Vienna: Adams' gambit * +r1b1k1nr/ppp2ppp/2n5/q3P3/1b6/2N2N2/PPPB1PPP/R2QKB1R b KQkq - +Scandinavian: Anderssen counter-attack orthodox attack +r1b1k1nr/pppp1ppp/1b6/8/3qPP2/1PNN2P1/P2PQ2P/n1BK1B1R b kq - +Vienna: `Frankenstein-Dracula' variation * +r1b1k1nr/pppp1ppp/1b6/nP2N1q1/2B1P3/8/P1PP1PPP/RNBQK2R w KQkq - +Evans gambit declined, Hirschbach variation +r1b1k1nr/pppp1ppp/1bn5/8/4P2q/3N4/PPPPBPPP/RNBQK2R b KQkq - +Vienna game * +r1b1k1nr/pppp1ppp/2n2q2/1Nb5/4P3/4B3/PPP2PPP/RN1QKB1R b KQkq - +Scotch: Blumenfeld attack +r1b1k1nr/pppp1ppp/2n5/1N6/1b2P2q/8/PPPB1PPP/RN1QKB1R b KQkq - +Scotch game +r1b1k1nr/ppppqppp/1bn5/4p1B1/2BPP3/2P2N2/PP3PPP/RN1QK2R b KQkq - +Giuoco Piano: Mestel variation +r1b1k1nr/ppppqppp/1bn5/4p3/2BPP3/2P2N2/PP3PPP/RNBQK2R w KQkq - +Giuoco Piano: center-holding variation +r1b1k1nr/ppppqppp/2n5/1Bb1p3/4P3/2P2N2/PP1P1PPP/RNBQK2R w KQkq - +Ruy Lopez: classical defense, Boden variation +r1b1k1nr/ppppqppp/2n5/2b1p3/2B1P3/2P2N2/PP1P1PPP/RNBQK2R w KQkq - +Giuoco Piano: close variation +r1b1k1nr/pppq1ppp/1b6/n3N3/2B1P3/BQP5/P4PPP/RN3RK1 b kq - +Evans gambit: Levenfish variation +r1b1k2r/1pp1qppp/pbnp1n2/4p3/P1BPP3/2P2N1P/1P3PP1/RNBQR1K1 b kq - +Giuoco Piano: Tarrasch variation +r1b1k2r/1pp2ppp/p1n5/2bpq3/3NP3/2P1K3/PPN3PP/R1BQ1B1R b kq - +two knights defense: Fegatello attack, Leonhardt variation * +r1b1k2r/1pq1bppp/p1nppn2/8/P2NPP2/2N5/1PP1B1PP/R1BQ1R1K b kq - +Sicilian: Scheveningen, classical, Mar\'oczy system +r1b1k2r/1pqnbppp/p2ppn2/6B1/3NPP2/2N2Q2/PPP3PP/2KR1B1R w kq - +Sicilian: Najdorf, 7...Be7 main line +r1b1k2r/2q1bppp/p2p1n2/npp1p3/P2PP3/2P2N2/1PB2PPP/RNBQR1K1 b kq - +Ruy Lopez: closed, Balla variation +r1b1k2r/p1q2pp1/2pb1n1p/n3N3/3Pp3/8/PPPBBPPP/RN1QK2R b KQkq - +two knights defense: Knorre variation +r1b1k2r/pp1n1ppp/2p1pn2/q2p2B1/1bPP4/2N1P3/PPQN1PPP/R3KB1R b KQkq - +QGD: Cambridge Springs defense, Bogolyubov variation +r1b1k2r/pp3ppp/1qn1p3/2bp4/6n1/5NP1/PPPNPPBP/R1BQ1RK1 w kq - +Gr\"unfeld: Pachman variation * +r1b1k2r/pp3ppp/3b1q2/3P4/1P2n3/4PN2/5PPP/R1BQKB1R w KQkq - +QGD semi-Slav: Meran, Stahlberg variation * +r1b1k2r/ppp1qppp/5n2/4p1B1/2BnP3/2N5/PPP3PP/R2Q1RK1 b kq - +Giuoco piano: Holzhausen attack +r1b1k2r/ppp2ppp/2N5/1B1pP3/4n2q/8/PPP2bPP/RNBQ1K1R w kq - +Two knights defense, Keidanz variation +r1b1k2r/ppp3p1/2np1q1p/2b1pP2/2B5/2NP1N2/PPP2PPP/R2QK2R b KQkq - +KGD: classical, Svenonius variation * +r1b1k2r/pppp1ppp/1bn5/8/4n2q/2NN4/PPPPBPPP/R1BQK2R w KQkq - +Vienna: Alekhine variation * +r1b1k2r/pppp1ppp/2n2q2/2b5/3NP3/4K3/PPP1N1PP/R1BQ1B1R b kq - +two knights defense: Fegatello attack, Polerio defense * +r1b1k2r/ppppnp1p/2n4b/4q3/2B2p2/2NP1Q2/PPPB2PP/4RRK1 b kq - +KGA: Muzio gambit, Paulsen variation +r1b1k2r/ppppnppp/2n2q2/1Bb5/3NP3/2P1B3/PP3PPP/RN1QK2R b KQkq - +Scotch: Paulsen attack +r1b1k2r/ppppnppp/2n2q2/2b5/3NP3/2P1B3/PP1Q1PPP/RN2KB1R b KQkq - +Scotch: Blackburne attack +r1b1k2r/ppppnppp/2n2q2/2b5/4P3/2P1B3/PPN2PPP/RN1QKB1R b KQkq - +Scotch: Meitner variation +r1b1k2r/ppppnppp/2n3q1/b3P3/2B5/1QN2N2/P4PPP/R1BR2K1 b kq - +Evans gambit: compromised defense, Potter variation +r1b1k2r/ppppnppp/2n3q1/b3P3/2B5/BQN2N2/P4PPP/R4RK1 b kq - +Evans gambit: compromised defense, Paulsen variation +r1b1kb1r/1pp3pp/p1n2n2/5pq1/2BPp3/2N1PP2/PP1N2PP/R1BQ1RK1 b kq - +French: Steinitz, Brodsky-Jones variation * +r1b1kb1r/1pq2ppp/p1nppn2/8/3NPP2/2N1B3/PPP1B1PP/R2Q1RK1 b kq - +Sicilian: Scheveningen, classical +r1b1kb1r/1pq2ppp/p1nppn2/8/3NPP2/2N5/PPP1B1PP/R1BQ1RK1 w kq - +Sicilian: Scheveningen, classical variation with ...Qc7 and ...Nc6 +r1b1kb1r/2p1nppp/p1p5/3P4/3Pp3/4P3/PPQ1NP1q/RNB1K1R1 w Qkq - +French: Winawer, advance, poisoned pawn, Konstantinopolsky variation * +r1b1kb1r/p1q2pp1/2p2n1p/n3N3/4p3/8/PPPPBPPP/RNBQK2R w KQkq - +two knights defense: G\"oring variation +r1b1kb1r/p1q2ppp/2p2n2/n3p1N1/8/3B1Q2/PPPP1PPP/RNB1K2R b KQkq - +two knights defense: Paoli variation +r1b1kb1r/pp1n1ppp/2p1p3/q2n2B1/3P4/2N1PN2/PP3PPP/R2QKB1R w KQkq - +QGD: Cambridge Springs defense, Yugoslav variation +r1b1kb1r/pp1n1ppp/2p1pB2/q2p4/2PP4/2N1PN2/PP3PPP/R2QKB1R b KQkq - +QGD: Cambridge Springs defense, Capablanca variation +r1b1kb1r/pp1n1ppp/2p1pn2/q2P2B1/3P4/2N1PN2/PP3PPP/R2QKB1R b KQkq - +QGD: Cambridge Springs defense, 7.cd +r1b1kb1r/pp1n1ppp/2p1pn2/q2p2B1/2PP4/2N1PN2/PP3PPP/R2QKB1R w KQkq - +QGD: Cambridge Springs defense +r1b1kb1r/pp1n1ppp/2p1pn2/q2p4/2PP4/2N2N2/PP1BPPPP/2RQKB1R b Kkq - +QGD: Rochlin variation +r1b1kb1r/pp1n1ppp/2p1pn2/q5B1/2pP4/2N1P3/PP1N1PPP/R2QKB1R w KQkq - +QGD: Cambridge Springs defense, Rubinstein variation +r1b1kb1r/pp1p1ppp/1qn1pn2/8/2PN4/2N3P1/PP2PP1P/R1BQKB1R w KQkq - +English: symmetrical, Geller variation +r1b1kb1r/pp1p1ppp/4pn2/1Bp5/3nPq2/2N2N2/PPPP1PPP/R1BQR1K1 w kq - +English: four knights, Stean variation * +r1b1kb1r/pp2pppp/1qn2n2/2pp4/3P4/5NP1/PPP1PPBP/RNBQK2R w KQkq - +Gr\"unfeld: Russian variation * +r1b1kb1r/pp2pppp/1qn2n2/3p2B1/2PP4/2N5/PP3PPP/R2QKBNR w KQkq - +Caro-Kann: Panov-Botvinnik, Reifir (Spielmann) variation +r1b1kb1r/pp2pppp/1qnp1n2/8/2BNP3/2N5/PPP2PPP/R1BQK2R w KQkq - +Sicilian: Sozin, Benk\"o variation +r1b1kb1r/pp2pppp/2n2n2/q1pp4/3P4/5NP1/PPP1PPBP/RNBQK2R w KQkq - +Gr\"unfeld: Flohr variation * +r1b1kb1r/pp2pppp/2n2n2/q2p2B1/2PP4/2N5/PP3PPP/R2QKBNR w KQkq - +Caro-Kann: Panov-Botvinnik, Czerniak variation +r1b1kb1r/pp3ppp/1qn1pn2/2pp4/3P4/4PNP1/PPP2PBP/RNBQ1RK1 b kq - +Gr\"unfeld: Botvinnik variation * +r1b1kb1r/pp3ppp/1qn1pn2/2pp4/3P4/5NP1/PPP1PPBP/RNBQ1RK1 w kq - +Gr\"unfeld with e3 & Qb3 * +r1b1kb1r/pp3ppp/2n2n2/2qpp1B1/8/5NP1/PPP1PPBP/RN1Q1RK1 b kq - +Gr\"unfeld: Russian, Smyslov variation * +r1b1kb1r/pp3ppp/2n2n2/2qpp3/8/1P3NP1/P1P1PPBP/RNBQ1RK1 b kq - +Gr\"unfeld: Russian, Levenfish variation * +r1b1kb1r/pp3ppp/2n2n2/2qpp3/8/2N2NP1/PPP1PPBP/R1BQ1RK1 b kq - +Gr\"unfeld: Russian, Byrne (Simagin) variation * +r1b1kb1r/pp3ppp/2n2n2/2qpp3/8/2P2NP1/PP2PPBP/RNBQ1RK1 b kq - +Gr\"unfeld: Russian, Szabo (Boleslavsky) variation * +r1b1kb1r/pp3ppp/2n2n2/2qpp3/8/5NP1/PPP1PPBP/RNBQ1RK1 w kq - +Gr\"unfeld: Russian variation with e4 * +r1b1kb1r/pp3ppp/2n2n2/2qpp3/8/N4NP1/PPP1PPBP/R1BQ1RK1 b kq - +Gr\"unfeld: Russian, Prins variation * +r1b1kb1r/pp3ppp/2n2n2/2qpp3/8/P4NP1/1PP1PPBP/RNBQ1RK1 b kq - +Gr\"unfeld: Russian, Alekhine (Hungarian) variation * +r1b1kb1r/pp3ppp/2n5/2pqp3/8/3P1NP1/PP2PP1P/R1BQKB1R b KQkq - +Sicilian: accelerated fianchetto, Gurgenidze variation * +r1b1kb1r/ppppq1pp/2n2n2/3Q4/8/5N2/PPP1PPPP/RNB1KB1R w KQkq - +Queen's pawn: Englund gambit +r1b1kb1r/ppppq1pp/2n2n2/4N1B1/3Pp3/8/PPP2PPP/RN1QKB1R w KQkq - +Vienna gambit: Kaufmann variation * +r1b1kb1r/ppppqppp/5n2/1B2N3/3nPP2/2N5/PPPP2PP/R1BQK2R b KQkq - +Four knights: Rubinstein counter-gambit, Bogolyubov variation +r1b1kb1r/ppq1pppp/2n2n2/1Bpp4/8/2NPPN2/PPP2PPP/R1BQK2R b KQkq - +Nimzo-Indian: classical, Milner-Barry (Zurich) variation * +r1b1kb1r/ppq2ppp/2n1pn2/2pp4/3P4/2P1PN2/PP1N1PPP/R1BQKB1R w KQkq - +QGD semi-Slav: Stoltz variation * +r1b1kb1r/ppqp1ppp/2B1pn2/2p5/4P3/2N2N2/PPPP1PPP/R1BQK2R b KQkq - +English: four knights, Romanishin variation * +r1b1kbnr/1p2pppp/p1q5/2pp4/1P6/4PN2/P1PP1PPP/RNBQ1RK1 b kq - +Nimzo-Indian: classical, Adorjan gambit * +r1b1kbnr/1p2pppp/p1q5/2pp4/3P4/2N1PN2/PPP2PPP/R1BQK2R b KQkq - +Nimzo-Indian: classical, Botvinnik variation * +r1b1kbnr/1p2pppp/p1q5/2ppN3/3P4/4P3/PPP2PPP/RNBQK2R b KQkq - +Nimzo-Indian: classical, Noa variation, main line * +r1b1kbnr/1pp2ppp/p1pq4/4p3/4P3/5N2/PPPP1PPP/RNBQ1RK1 w kq - +Ruy Lopez: exchange, Bronstein variation +r1b1kbnr/1pq1pppp/p1n5/1Bpp4/3P4/4PN2/PPP2PPP/RNBQK2R w KQkq - +Nimzo-Indian: classical, Noa variation, 5.a3 * +r1b1kbnr/1pq1pppp/p7/2ppN3/3P4/4P3/PPP2PPP/RNBQK2R w KQkq - +Nimzo-Indian: classical, Noa variation, main line, 7.Qc2 * +r1b1kbnr/1pq2ppp/p3p3/2ppN3/3PP3/2N5/PPP2PPP/R1BQK2R b KQkq - +Nimzo-Indian: classical, San Remo variation * +r1b1kbnr/1pqp1ppp/p1n1p3/8/3NP3/2N1B3/PPP1BPPP/R2QK2R b KQkq - +Sicilian: Taimanov variation +r1b1kbnr/2p2ppp/p1p5/3p2q1/2PPp3/4P3/PP2NPPP/RNBQK2R w KQkq - +French: Winawer, advance, poisoned pawn variation * +r1b1kbnr/p1p2ppp/2p5/3pN1q1/3Pp3/4P2P/PPP2PP1/RNBQ1K1R w kq - +French: MacCutcheon, Duras variation * +r1b1kbnr/p1pp1ppp/1pn5/8/3PPp1q/2N5/PPP1K1PP/R1BQ1BNR w kq - +Vienna: Steinitz gambit, Fraser-Minckwitz variation +r1b1kbnr/pp1qpppp/2np4/1B6/3QP3/5N2/PPP2PPP/RNB1K2R w KQkq - +Sicilian: Chekhover, Zaitsev variation +r1b1kbnr/pp2pppp/1qn5/1Bp5/2p5/2N1PN2/PP1P1PPP/R1BQK2R b KQkq - +Nimzo-Indian: Spielmann, 4...c5, 5.dc Nc6 * +r1b1kbnr/pp2pppp/1qn5/1Bpp4/8/4PN2/PPPP1PPP/RNBQK2R w KQkq - +Nimzo-Indian: Spielmann variation * +r1b1kbnr/pp2pppp/1qn5/2pp4/3P4/5NP1/PPP1PP1P/RNBQKB1R w KQkq - +Gr\"unfeld: Russian variation * +r1b1kbnr/pp2pppp/2nq4/1Bpp4/8/4PN2/PPPP1PPP/RNBQK2R w KQkq - +Nimzo-Indian: Mikenas attack * +r1b1kbnr/pp3ppp/1qn1p3/2ppP3/3P4/2PB1N2/PP3PPP/RNBQK2R b KQkq - +French: advance, Milner-Barry gambit +r1b1kbnr/ppp1pppp/2n5/3q4/3P4/2N5/PPP2PPP/R1BQKBNR b KQkq - +KP: Nimzovich defense, Marshall gambit +r1b1kbnr/ppp1pppp/2n5/7q/8/2N5/PP1PPPPP/R1BQKBNR w KQkq - +Novosibirsk opening * +r1b1kbnr/ppp1qppp/2n5/4P3/2Pp4/5N2/PP1NPPPP/R1BQKB1R w KQkq - +QGD: Albin counter-gambit, Balogh variation +r1b1kbnr/ppp2ppp/2n5/1B1p2q1/2PPp3/4P3/PP3PPP/RNBQK1NR w KQkq - +French: Winawer, advance, Russian variation * +r1b1kbnr/ppp2ppp/2n5/3p2q1/3Pp3/4P3/PPPN1PPP/RNBQKB1R w KQkq - +French: Steinitz, Gledhill attack * +r1b1kbnr/ppp2ppp/2n5/3p4/3PPp1q/2N5/PPP1K1PP/R1BQ1BNR w kq - +Vienna: Steinitz gambit, Zukertort defense +r1b1kbnr/ppp3pp/2n2q2/3pN3/3PpP2/8/PPP3PP/RNBQKB1R w KQkq - +Vienna gambit: Heyde variation * +r1b1kbnr/ppp3pp/2n5/5pq1/2BPp3/4P3/PP1N1PPP/RNBQK2R w KQkq - +French: Steinitz, Bradford attack * +r1b1kbnr/pppnq2p/8/4Npp1/3Q1P2/8/PPP3PP/RNB1KB1R w KQkq - +KGD: Falkbeer, Charousek variation * +r1b1kbnr/pppp1Npp/8/8/4q3/5n2/PPPPBP1P/RNBQKR2 w Qkq - +Blackburne shilling gambit +r1b1kbnr/pppp1p1p/2n5/4N3/2B1Pppq/8/PPPP2PP/RNBQ1K1R w kq - +KGA: Herzfeld gambit +r1b1kbnr/pppp1p1p/5q2/4n3/2B1PQ2/2N5/PPPP2PP/R1B2RK1 w kq - +Vienna: Hamppe-Muzio, Dubois variation +r1b1kbnr/pppp1ppp/2n2q2/4p3/3P4/2P5/PP2PPPP/RNBQKBNR w KQkq - +Caro-Kann: Goldman (Spielmann) variation * +r1b1kbnr/pppp1ppp/2n5/1B2p1q1/4P3/5N2/PPPP1PPP/RNBQK2R b KQkq - +Vienna: Zhuravlev countergambit * +r1b1kbnr/pppp1ppp/2n5/1N6/4P2q/8/PPP2PPP/RNBQKB1R b KQkq - +Scotch: Horwitz attack +r1b1kbnr/pppp1ppp/2n5/8/2B1Pp1q/8/PPPP2PP/RNBQ1KNR w kq - +KGA: bishop's gambit, Boden defense +r1b1kbnr/pppp1ppp/2n5/8/3NP2q/2N5/PPP2PPP/R1BQKB1R b KQkq - +Scotch: Steinitz variation +r1b1kbnr/pppp1ppp/2n5/8/3NP2q/8/PPP2PPP/RNBQKB1R w KQkq - +Scotch: Pulling counter-attack +r1b1kbnr/pppp1ppp/2n5/8/4P2q/5N2/PPP2PPP/RNBQKB1R b KQkq - +Scotch: Fraser attack +r1b1kbnr/pppp2pp/2n2q2/4N3/3Pp3/8/PPP2PPP/RNBQKB1R w KQkq - +Vienna gambit: Paulsen attack * +r1b1kbnr/pppp2pp/2n2q2/4N3/3PpP2/8/PPP3PP/RNBQKB1R b KQkq f3 +Vienna gambit: Bardeleben variation * +r1b1kbnr/ppppq1pp/2n5/4Pp2/3p4/5N2/PPP2PPP/RNBQKB1R w KQkq - +KGD: Falkbeer, Rubinstein variation * +r1b1kbnr/ppppqppp/2n5/1B2p3/4P3/5N2/PPPP1PPP/RNBQK2R w KQkq - +Ruy Lopez: Vinogradov variation +r1b1kbnr/ppq1pppp/2n5/1B1p4/3P4/5N2/PPP2PPP/RNBQK2R b KQkq - +Nimzo-Indian: classical, Noa variation, 5.cd ed * +r1b1kbnr/ppq1pppp/2n5/1Bp5/2p5/4PN2/PP1P1PPP/RNBQ1RK1 b kq - +Nimzo-Indian: classical, Pir\'c variation * +r1b1kbnr/ppq1pppp/2n5/1Bpp4/2P5/4PN2/PP1P1PPP/RNBQK2R b KQkq - +Nimzo-Indian: classical, 4...c5 * +r1b1kbnr/ppq1pppp/2n5/1Bpp4/3P4/4PN2/PPP2PPP/RNBQK2R b KQkq - +Nimzo-Indian: classical, Noa variation * +r1b1kbnr/ppq1pppp/2n5/1Bpp4/8/2N1PN2/PPPP1PPP/R1BQK2R b KQkq - +Nimzo-Indian: classical, 4...Nc6 * +r1b1kbnr/ppq1pppp/2n5/1Bpp4/8/4PN2/PPPP1PPP/RNBQK2R w KQkq - +Nimzo-Indian: classical variation * +r1b1kbnr/ppqp1ppp/2n1p3/8/3NP3/2N1B3/PPP2PPP/R2QKB1R b KQkq - +Sicilian: Taimanov variation +r1b1kbnr/ppqp1ppp/2n1p3/8/3NP3/2N5/PPP2PPP/R1BQKB1R w KQkq - +Sicilian: Taimanov (Bastrikov) variation +r1b1kbnr/ppqppppp/2n5/8/3NP3/8/PPP2PPP/RNBQKB1R w KQkq - +Sicilian: Flohr variation +r1b2knr/pppp3p/2n2qP1/2b1p2Q/6P1/8/PPPP1PBP/RNB1K1NR w KQ - +KGA: bishop's gambit, Fraser variation * +r1b2rk1/1p2qp1p/2n1pn2/pBbpN1p1/5B2/2P1P3/PP3PPP/RN1Q1RK1 w - - +QGD Slav: Dutch, S\"amisch variation * +r1b2rk1/1p2qppp/2n1pn2/pBbp4/5B2/2P1PN2/PP3PPP/RN1Q1RK1 w - - +QGD Slav: Dutch variation, main line * +r1b2rk1/1pp1qppp/2n2n2/p1bPp3/8/2PP1N2/PP1NBPPP/R1BQ1RK1 b - - +Philidor: Nimzovich, Sozin variation * +r1b2rk1/1pq1bppp/p1nppn2/8/3NPP2/2N1B3/PPP1B1PP/R3QRK1 w - - +Sicilian: Scheveningen, classical main line +r1b2rk1/2q1bppp/p1np1n2/1pP1p3/4P3/2P2N1P/PPBN1PP1/R1BQR1K1 b - - +Ruy Lopez: closed, Chigorin, Rauzer attack +r1b2rk1/2q1bppp/p1np1n2/1pp1p3/3PP3/2P2N1P/PPBN1PP1/R1BQR1K1 w - - +Ruy Lopez: closed, Chigorin, 12...Nc6 +r1b2rk1/2q1bppp/p1pp1n2/np2p3/3PP3/2P2N1P/PPB2PP1/RNBQR1K1 w - - +Ruy Lopez: closed, Rossolimo defense +r1b2rk1/2q1bppp/p2p1n2/np2p3/3PP3/5N1P/PPBN1PP1/R1BQR1K1 b - - +Ruy Lopez: closed, Chigorin, 12...c5d4 +r1b2rk1/2q1bppp/p2p1n2/npp1p3/3PP3/2P2N1P/PPB2PP1/RNBQR1K1 w - - +Ruy Lopez: closed, Chigorin defense +r1b2rk1/5ppp/p1pb4/1p1n4/3P4/1BP3Pq/PP3P1P/RNBQR1K1 w - - +Ruy Lopez: Marshall, main line, 14...Qh3 +r1b2rk1/p1q2ppp/2n2n2/3pp3/N7/1B1P4/PPPB1bPP/R2Q1KNR w - - +Evans gambit: Fraser-Mortimer attack * +r1b2rk1/p4ppp/1qB2n2/2bp4/3P4/2N5/PPP2PPP/R1BQK2R b KQ - +Giuoco Piano: Bernstein variation * +r1b2rk1/p4ppp/2n2n2/q1bpp1B1/8/1BNP4/PPP2PPP/R2QK1NR w KQ - +Evans gambit: Fraser attack * +r1b2rk1/pp1n1ppp/2p1pn2/q2p4/1bPP3B/2N1P3/PPQN1PPP/R3KB1R b KQ - +QGD: Cambridge Springs defense, Argentine variation +r1b2rk1/pp1nqppp/1bp2n2/4N3/1P1Pp3/P1N1B3/2P1BPPP/R2Q1RK1 w - - +Ruy Lopez: open, Malkin variation * +r1b2rk1/pp1nqppp/2n1p3/3pP3/2pP1P2/2N2N2/PPPQ2PP/2KR1B1R w - - +French: classical, St\a hlberg variation +r1b2rk1/pp1nqppp/2p1p3/3n4/2BP4/2N1PN2/PP3PPP/2RQ1RK1 b - - +QGD: Orthodox defense, Bd3 line, 11.O-O +r1b2rk1/pp1nqppp/2p1p3/3n4/2BP4/2N1PN2/PP3PPP/2RQK2R w K - +QGD: Orthodox defense, Bd3 line +r1b2rk1/pp1nqppp/2p1p3/3n4/2BPN3/4PN2/PP3PPP/2RQK2R b K - +QGD: Orthodox defense, Bd3 line, Alekhine variation +r1b2rk1/pp1nqppp/2p5/4p3/2BP4/2R1PN2/PP3PPP/1Q3RK1 b - - +QGD: Orthodox defense, classical, 13.d1b1 (Mar\'oczy) +r1b2rk1/pp1nqppp/2p5/4p3/2BP4/2R1PN2/PP3PPP/3Q1RK1 w - - +QGD: Orthodox defense, classical variation +r1b2rk1/pp1nqppp/2p5/4p3/2BP4/2R1PN2/PPQ2PPP/5RK1 b - - +QGD: Orthodox defense, classical, 13.d1c2 (Vidmar) +r1b2rk1/pp2nppp/2pq1n2/3pp1B1/1b2P2N/1BNP4/PPP2PPP/R2Q1RK1 w - - +Four knights: symmetrical, Blake variation +r1b2rk1/pp2ppbp/1qnp1np1/4P3/3N1P2/2N1B3/PPP1B1PP/R2Q1RK1 b - - +Sicilian: dragon, classical, Zollner gambit +r1b2rk1/pp2ppbp/2nq1np1/2pp4/3P4/2P1PN2/PP1NBPPP/R1BQ1RK1 w - - +Catalan: closed, Botvinnik variation * +r1b2rk1/pp2ppbp/2q2np1/2pp4/8/1P2P3/PBPPBPPP/RN1Q1RK1 w - - +Queen's Indian: old main line, 9.Qxc3 * +r1b2rk1/pp2qppp/1bn2n2/4p3/1P6/P1NPP3/R4PPP/2BQKBNR b K - +Sicilian: Smith-Morra gambit, Chicago defense * +r1b2rk1/pp2qppp/2n1pn2/2bp4/2P1P3/2NB1N2/PP2QPPP/R1B2RK1 b - - +QGD: Semi-Tarrasch, Levenfish variation +r1b2rk1/pp2qppp/2nb1n2/2p1p3/2BP4/2N1PN2/PP2QPPP/R1B2RK1 w - - +QGD: Semi-Tarrasch, Levenfish variation * +r1b2rk1/pp3ppp/2p5/4q3/2B5/2R1P3/PP3PPP/3Q1RK1 w - - +QGD: Orthodox defense, classical, 13.de +r1b2rk1/ppp1qppp/2n2n2/1B1pp3/1b2P3/3P1N2/PPP1NPPP/R1BQ1RK1 w - - +Four knights: Alatortsev variation +r1b2rk1/ppp1qppp/2np1n2/1B2p1B1/4P3/2PP1N2/P1P2PPP/R2Q1RK1 w - - +Four knights: symmetrical, Metger unpin +r1b2rk1/pppp2pp/2n5/2b1pq2/4N3/5Q2/PPPP1P1P/R1B1KBNR b KQ - +Vienna: Hamppe-Muzio, Dubois variation * +r1b2rk1/ppq1ppbp/2n2np1/2pp4/5P2/3PPN2/PPP1B1PP/RNB1QRK1 w - - +Dutch: Ilyin-Genevsky variation with Qc2 * +r1b2rk1/ppqnppbp/5np1/2pp4/3P4/2P1PN2/PP1NBPPP/R1BQ1RK1 w - - +Catalan: closed, main line * +r1b3nr/ppppkBpp/1b6/nP2N1qQ/4P3/8/P1PP1PPP/RNB1K2R b KQ - +Evans gambit declined, V\'asquez variation +r1b3r1/ppp2k1p/1b6/nP2B1q1/3PP3/8/P1PN1PPP/R2QK2R b KQ - +Evans gambit declined, Pavlov variation +r1bB1rk1/pp3ppp/8/4p3/3nn3/3P4/PPP1KbPP/R2Q1BNR w - - +Scotch: Sea-cadet mate * +r1bk1bnr/2p2ppp/p1p5/3P4/3Pp3/4P3/PPQ1NP1q/RNB1K1R1 w Q - +French: Winawer, advance, poisoned pawn, Euwe-Gligori\'c variation * +r1bk2nr/pppp1Qpp/1b6/nP2q3/2B1P3/8/PBPP1PPP/RN2K2R b KQ - +Evans gambit declined, Hicken variation +r1bk2nr/pppp1ppp/2n3q1/1N6/8/8/PPPNBPPP/R2Q1RK1 w - - +Scotch: Rosenthal variation +r1bk2nr/ppppq1pp/2n5/2b1PP1Q/8/8/PPPP2PP/RNBK1BNR b - - +KGA: L\'opez-Gianutio counter-gambit, Hein variation * +r1bnk2r/ppppnppp/5q2/1Bb5/3NP3/2P1B3/PP3PPP/RN1QK2R w KQkq - +Scotch: Paulsen, Gunsberg defense +r1bq1b1r/ppn3pp/2p1k3/3np3/2BPQ3/P1N5/1PP2PPP/R1B1K2R w KQ - +two knights defense: Fegatello attack, Leonhardt variation +r1bq1b1r/ppp1n1pp/4k3/3np3/2B5/2N2Q2/PPPP1PPP/R1B1K2R w KQ - +two knights defense: Fegatello attack, Polerio defense +r1bq1b1r/ppp2kp1/2n5/1B1p1PPp/3Qn3/5N2/PPP2P1P/RNB1K2R w KQ - +KGA: Kieseritsky, Brentano defense, Kaplanek variation * +r1bq1bnr/ppp1k1pp/2n5/3ppP1Q/3P4/2N5/PPP2PPP/R1B1KBNR b KQ - +Vienna: Steinitz gambit, Zukertort defense * +r1bq1bnr/ppp1k1pp/2n5/3ppP1Q/8/1PN5/P1PP1PPP/R1B1KBNR b KQ - +Vienna: Steinitz gambit, Fraser-Minckwitz variation * +r1bq1k1r/2p2ppp/p4n2/1pbPR1N1/3n4/1B6/PPPP1PPP/RNBQ2K1 w - - +Ruy Lopez: Rabinovich variation +r1bq1k1r/pp2nppp/2n5/4p3/2Pp4/3P1NP1/4PP1P/RN1QKB1R w KQ - +Benk\"o gambit: Ne2 variation * +r1bq1knr/pp3p1p/2n3p1/4p3/2Pp4/3P1NP1/4PP1P/RN1QKB1R w KQ - +Benk\"o gambit * +r1bq1knr/ppp3pp/2n5/2bp1P1Q/4p1P1/3P4/PPP2PBP/RNB1K1NR w KQ - +KGA: bishop's gambit, Grimm attack * +r1bq1knr/ppp3pp/2n5/2bppP1Q/6P1/8/PPPPNPBP/RNB1K2R b KQ - +KGA: bishop's gambit, classical defense * +r1bq1knr/ppp4p/2n3p1/2bppP1Q/6P1/8/PPPPNPBP/RNB1K2R w KQ - +KGA: bishop's gambit, McDonnell attack * +r1bq1knr/pppp3p/2n3p1/2b1pP1Q/6P1/8/PPPP1PBP/RNB1K1NR w KQ - +KGA: bishop's gambit, McDonnell attack * +r1bq1r1k/1pp1b1pp/2n5/p2npp2/8/P1NPPN2/1PQ1BPPP/R1B1K2R w KQ - +Sicilian: Scheveningen, classical, Mar\'oczy system * +r1bq1rk1/1p1n1pbp/2pp1np1/p3p3/2PPP3/2N2N2/PP3PPP/R1BQRBK1 w - - +King's Indian: orthodox, 7...Nbd7, main line +r1bq1rk1/1p1nbppp/p1p1pn2/3P2B1/3P4/2N1PN2/PPQ2PPP/2R1KB1R b K - +QGD: Orthodox defense, Rubinstein attack, main line +r1bq1rk1/1p1nbppp/p1p1pn2/3p2B1/2PP4/2N1PN2/PPQ2PPP/2R1KB1R w K - +QGD: Orthodox defense, Rubinstein attack, Karlsbad variation +r1bq1rk1/1p1nbppp/p1p1pn2/3p2B1/2PP4/P1N1PN2/1PQ2PPP/2R1KB1R b K - +QGD: Orthodox defense, Rubinstein attack, Gr\"unfeld variation +r1bq1rk1/1p1nppbp/2n3p1/p7/2Pp4/P2P1NP1/1P1N1PBP/R1BQR1K1 b - - +Benoni: fianchetto, 11...Re8 * +r1bq1rk1/1p2bppp/2n2n2/p3p1B1/2Pp4/P2P1NP1/1P3PBP/RN1Q1RK1 b - - +Benoni: classical with ...a6 and 10...Bg4 * +r1bq1rk1/1p2bppp/2n2n2/p3p3/2Pp4/P2P1NP1/1P3PBP/RNBQ1RK1 w - - +Benoni: classical, 9...a6, 10.a4 * +r1bq1rk1/1p2ppbp/2np1np1/p7/2BNP3/2N1BP2/PPPQ2PP/R3K2R w KQ - +Sicilian: dragon, Yugoslav attack, Byrne variation +r1bq1rk1/1p2ppbp/2np1np1/p7/4P3/1NN1B3/PPP1BPPP/R2Q1RK1 w - - +Sicilian: dragon, classical, Alekhine variation +r1bq1rk1/1p3ppp/2n1pn2/pBbp4/5B2/2P1PN2/PP3PPP/RN1QK2R w KQ - +QGD Slav: Dutch variation * +r1bq1rk1/1p3ppp/p1n1pn2/1BbP4/8/2N1PN2/PP3PPP/R1BQ1RK1 b - - +Nimzo-Indian: 4.e3, main line with 8...dc and 9...cd * +r1bq1rk1/1pp1ppbp/p1np1np1/8/2PP4/2N2NP1/PP2PPBP/R1BQ1RK1 w - - +King's Indian: fianchetto, Panno variation +r1bq1rk1/1pp1ppbp/p1np1np1/8/2PPP3/2N1BP2/PP2N1PP/R2QKB1R w KQ - +King's Indian: S\"amisch, Panno formation +r1bq1rk1/1pp2ppp/1bn5/p2PN3/1P1P4/P7/2P2PPP/R1BQKB1R w KQ - +Ruy Lopez: open, Berger variation * +r1bq1rk1/1ppnbppp/p3pn2/3P2B1/3P4/2N1PN2/PP3PPP/2RQKB1R b K - +QGD: Orthodox defense, Swiss, Karlsbad variation +r1bq1rk1/1ppnbppp/p3pn2/3p2B1/2PP4/2N1PN2/PP3PPP/2RQKB1R w K - +QGD: Orthodox defense, Swiss (Henneberger) variation +r1bq1rk1/2p1bpp1/p1np1n1p/1p2p3/4P3/1BP2N1P/PP1P1PP1/RNBQR1K1 w - - +Ruy Lopez: closed, Smyslov defense +r1bq1rk1/2p1bppp/2np1n2/pp2p3/4P3/1BP2N1P/PP1P1PP1/RNBQR1K1 w - - +Ruy Lopez: closed, Keres (9...a5) variation +r1bq1rk1/2p1bppp/p1n2n2/1p1P4/4p3/1BP2N2/PP1P1PPP/RNBQR1K1 w - - +Ruy Lopez: Marshall, Herman Steiner variation +r1bq1rk1/2p1bppp/p1n2n2/1p1pp3/4P3/1BP2N2/PP1P1PPP/RNBQR1K1 w - - +Ruy Lopez: Marshall counter-attack +r1bq1rk1/2p1bppp/p1np1n2/1p2p3/3PP3/1BP2N2/PP3PPP/RNBQR1K1 b - - +Ruy Lopez: closed, 9.d4 +r1bq1rk1/2p1bppp/p1np1n2/1p2p3/4P3/1BP2N1P/PP1P1PP1/RNBQR1K1 b - - +Ruy Lopez: closed, 9.h3 +r1bq1rk1/2p1bppp/p1np1n2/1p2p3/4P3/1BP2N2/PP1P1PPP/RNBQR1K1 w - - +Ruy Lopez: closed (with ...d6) +r1bq1rk1/2p1bppp/p1np1n2/1p2p3/4P3/1BPP1N2/PP3PPP/RNBQR1K1 b - - +Ruy Lopez: closed, Pilnik variation +r1bq1rk1/2p1bppp/p1np1n2/1p2p3/4P3/2P2N2/PPBP1PPP/RNBQR1K1 b - - +Ruy Lopez: closed, Lutikov variation +r1bq1rk1/2p1bppp/p1np1n2/1p2p3/4P3/PBP2N2/1P1P1PPP/RNBQR1K1 b - - +Ruy Lopez: closed, Suetin variation +r1bq1rk1/2p1bppp/p2p1n2/np2p3/4P3/2P2N1P/PPBP1PP1/RNBQR1K1 b - - +Ruy Lopez: closed (9...Na5) +r1bq1rk1/2pnbppp/p1np4/1p2p3/4P3/1BP2N1P/PP1P1PP1/RNBQR1K1 w - - +Ruy Lopez: closed, Ragozin-Petrosian (`Keres') variation +r1bq1rk1/2pnbppp/p2p1n2/1p2p3/3PP2N/1BP4P/PP3PP1/RNBQR1K1 b - - +Ruy Lopez: closed, Breyer, Simagin variation +r1bq1rk1/2pnbppp/p2p1n2/1p2p3/3PP3/1BP2N1P/PP3PP1/RNBQR1K1 w - - +Ruy Lopez: closed, Breyer, Borisenko variation +r1bq1rk1/2ppbppp/p1n2n2/1p2p3/4P3/1B3N2/PPPP1PPP/RNBQR1K1 w - - +Ruy Lopez: closed, 7...O-O +r1bq1rk1/2ppbppp/p1n2n2/1p2p3/4P3/1B3N2/PPPPQPPP/RNB2RK1 w - - +Ruy Lopez: Worrall attack, sharp line +r1bq1rk1/2ppbppp/p1n2n2/1p2p3/4P3/1BP2N2/PP1P1PPP/RNBQR1K1 b - - +Ruy Lopez: closed, 8.c3 +r1bq1rk1/2ppbppp/p1n2n2/1p2p3/P3P3/1B3N2/1PPP1PPP/RNBQR1K1 b - - +Ruy Lopez: closed, anti-Marshall 8.a4 +r1bq1rk1/3nbppp/p2p4/npp1p3/3PP3/2P2N1P/PPB2PP1/RNBQR1K1 w - - +Ruy Lopez: closed, Keres (...Nd7) defense +r1bq1rk1/4bppp/p1np1n2/1pp1p3/3PP3/2P2N1P/PPB2PP1/RNBQR1K1 w - - +Ruy Lopez: closed, Borisenko defense +r1bq1rk1/4bppp/p1p5/1p1nR3/3P4/1BP5/PP3PPP/RNBQ2K1 b - - +Ruy Lopez: Marshall, main line, 12.d2d4 +r1bq1rk1/4bppp/p1p5/1p1nR3/8/1BP5/PP1P1PPP/RNBQ2K1 w - - +Ruy Lopez: Marshall counter-attack, 11...c6 +r1bq1rk1/4bppp/p2p1n2/npp1p3/4P3/2P2N1P/PPBP1PP1/RNBQR1K1 w - - +Ruy Lopez: closed (10...c5) +r1bq1rk1/4bppp/ppnppn2/8/2P1P3/N1N5/PP2BPPP/R1BQ1RK1 w - - +Sicilian, Sz\'en, hedgehog variation +r1bq1rk1/5ppp/p1p1pn2/2bp4/2P5/2N1PN2/PP3PPP/R1BQ1RK1 w - - +Nimzo-Indian: 4.e3, main line * +r1bq1rk1/5ppp/p1pbpn2/2pp4/2PP4/2N1PN2/PP3PPP/R1BQ1RK1 w - - +Nimzo-Indian: 4.e3, main line with 8...Bxc3 * +r1bq1rk1/5ppp/p2b4/1p1p4/3P4/2P1R3/PP3PPP/RNBQ2K1 b - - +Ruy Lopez: Marshall, Kevitz variation +r1bq1rk1/p1p2ppp/2pp1n2/4p3/1b1PP3/2N2N2/PPP2PPP/R1BQ1RK1 b - - +Four knights: Svenonius variation * +r1bq1rk1/p1pnbppp/1p3n2/1B1p2B1/3P4/2N1PN2/PP3PPP/2RQK2R b K - +QGD: Orthodox defense, Capablanca variation +r1bq1rk1/p1pnbppp/1p3n2/3p2B1/3P4/2NBPN2/PP3PPP/2RQK2R b K - +QGD: Orthodox defense, Pillsbury attack +r1bq1rk1/p1ppbppp/8/2p1P3/3B4/2N5/PPP1QPPP/R3R1K1 w - - +Ruy Lopez: Berlin defense, Rio de Janeiro variation +r1bq1rk1/p2nbppp/1pp1pn2/3p4/P1PP4/5NP1/1PQ1PPBP/RNBR2K1 b - - +Catalan: closed, Zagoryansky variation +r1bq1rk1/p2nbppp/2p1pn2/1p4B1/2BP4/2N1PN2/PP3PPP/2RQK2R w K - +QGD: Orthodox defense, Bd3 line, fianchetto variation +r1bq1rk1/p2pppbp/1pn2np1/2p5/2P5/2N2NP1/PP1PPPBP/R1BQ1RK1 w - - +English: symmetrical, main line with b3 * +r1bq1rk1/p3bppp/2n2n2/1pp1p3/3pP3/3P1NP1/PPP1NPBP/R1BQ1RK1 w - - +King's Indian: orthodox, Aronin-Taimanov, bayonet attack * +r1bq1rk1/p3nppp/2p5/2bpp3/8/1P4P1/P1PQPPBP/RNB2RK1 b - - +Gr\"unfeld: exchange, Larsen variation * +r1bq1rk1/p3ppbp/1pn2np1/2pp4/5P2/3PPN2/PPP1B1PP/RNB1QRK1 w - - +Dutch: Ilyin-Genevsky variation with b3 * +r1bq1rk1/p4ppp/2n2n2/2bpp1B1/8/1BNP4/PPP2PPP/R2QK1NR b KQ - +Evans gambit * +r1bq1rk1/p4ppp/2n2n2/2bpp3/8/1BNP4/PPP2PPP/R1BQK1NR w KQ - +Evans gambit: Morphy attack * +r1bq1rk1/pp1n1pbp/2pp1np1/4p3/2PPP3/2N2NPP/PP3PB1/R1BQ1RK1 b - - +King's Indian: fianchetto, classical main line +r1bq1rk1/pp1n1pbp/3p1np1/2pP4/8/2N2NP1/PP2PPBP/R1BQ1RK1 w - - +Benoni: fianchetto, 9...Nbd7 +r1bq1rk1/pp1n1pp1/2p1pb1p/8/2BP4/2N1PN2/PP3PPP/2RQ1RK1 b - - +QGD: Petrosian variation +r1bq1rk1/pp1n1ppp/1bp2n2/4N3/1PBPp3/P1N1B3/2P2PPP/R2QK2R w KQ - +Ruy Lopez: open, St. Petersburg variation * +r1bq1rk1/pp1n1ppp/1bp5/3P4/1PN1p1n1/P1N1B3/2P2PPP/R2QKB1R w KQ - +Ruy Lopez: open, Bernstein variation, Karpov gambit * +r1bq1rk1/pp1n1ppp/4pn2/2p5/1bBP4/2N1PN2/PP3PPP/R1BQ1RK1 w - - +Nimzo-Indian: 4.e3, Gligori\'c system, Bronstein variation +r1bq1rk1/pp1n1ppp/4pn2/2pp4/1bPP4/2NBPN2/PP3PPP/R1BQ1RK1 w - - +Nimzo-Indian: 4.e3, Gligori\'c system with 7...Nbd7 +r1bq1rk1/pp1n2pp/2n1pp2/2bpP3/5PQ1/P1N2N2/1PP3PP/R1B1KB1R w KQ - +French: Steinitz, Brodsky-Jones variation +r1bq1rk1/pp1nb1pp/2n2p2/4p3/2Pp4/N2P1NP1/PP3PBP/R1BQR1K1 w - - +Benoni: classical, 11.f3 * +r1bq1rk1/pp1nbppp/2n5/4p3/2Pp4/3P1NP1/PP3PBP/RNBQR1K1 w - - +Benoni: classical, 9...Re8, 10.Nd2 * +r1bq1rk1/pp1nbppp/2n5/4p3/2Pp4/N2P1NP1/PP3PBP/R1BQR1K1 b - - +Benoni: classical with ...Re8 and ...Na6 * +r1bq1rk1/pp1nbppp/2p1p3/3n2B1/2BP3P/2N1PN2/PP3PP1/2RQK2R b K - +QGD: Orthodox defense, Bd3 line, Janowski variation +r1bq1rk1/pp1nbppp/2p1p3/3n2B1/2BP4/2N1PN2/PP3PPP/2RQK2R w K - +QGD: Orthodox defense, Bd3 line, Capablanca freeing maneuver +r1bq1rk1/pp1nbppp/2p1p3/3p2B1/2PPn3/2N1PN2/PPQ2PPP/2R1KB1R w K - +QGD: Orthodox defense, Rubinstein attack, Wolf variation +r1bq1rk1/pp1nbppp/2p1pn2/3p2B1/2PP4/2N1PN2/PP3PPP/2RQKB1R w K - +QGD: Orthodox defense +r1bq1rk1/pp1nbppp/2p1pn2/3p2B1/2PP4/2N1PN2/PPQ2PPP/2R1KB1R b K - +QGD: Orthodox defense, Rubinstein attack (with Rc1) +r1bq1rk1/pp1nbppp/2p1pn2/3p2B1/2PP4/2NBPN2/PP3PPP/2RQK2R b K - +QGD: Orthodox defense, Bd3 line +r1bq1rk1/pp1nbppp/2p1pn2/3p4/2PP4/1P3NP1/P1Q1PPBP/RNB2RK1 b - - +Catalan: closed, Qc2 & b3 +r1bq1rk1/pp1nbppp/2p1pn2/3p4/2PP4/2NQ1NP1/PP2PPBP/R1B2RK1 b - - +Catalan: closed, Botvinnik variation +r1bq1rk1/pp1nbppp/2p1pn2/3p4/2PP4/5NP1/PPQNPPBP/R1B2RK1 b - - +Catalan: closed, main line +r1bq1rk1/pp1nbppp/2p4n/3pp1N1/2BPPP2/2P5/PP4PP/RNBQ1RK1 w - - +Philidor: Hanham, Berger variation +r1bq1rk1/pp1nbppp/2pp1n2/8/P1BpP3/2N2N2/1PP1QPPP/R1B2RK1 w - - +Philidor: Nimzovich, Sozin variation +r1bq1rk1/pp1nbppp/4pn2/2pP2B1/3P4/2N1PN2/PPQ2PPP/R3KB1R b KQ - +QGD: Orthodox defense, 7.Qc2 c5, 8.cd (Rubinstein) +r1bq1rk1/pp1p1ppp/2n1pn2/2p5/2PP4/P1PBP3/5PPP/R1BQK1NR w KQ - +Nimzo-Indian: S\"amisch, main line +r1bq1rk1/pp1pppbp/2n2np1/2p5/2P5/1P2PN2/PB1PBPPP/RN1QK2R b KQ - +English: symmetrical, hedgehog system * +r1bq1rk1/pp1pppbp/2n2np1/2p5/2P5/1PN2NP1/P2PPPBP/R1BQ1RK1 b - - +English: symmetrical, main line with b3 +r1bq1rk1/pp1pppbp/2n2np1/2p5/2P5/2NP1NP1/PP2PPBP/R1BQ1RK1 b - - +English: symmetrical, main line with d3 +r1bq1rk1/pp1pppbp/2n2np1/2p5/2PP4/2N2NP1/PP2PPBP/R1BQ1RK1 b - - +English: symmetrical, main line with d4 +r1bq1rk1/pp1pppbp/2n2np1/8/2PN4/2N1P3/PP2BPPP/R1BQK2R b KQ - +English: Symmetrical, Keres defense * +r1bq1rk1/pp2b1pp/2n2n2/2pp4/4pB2/1N2PP2/PPP1B1PP/RN1Q1RK1 b - - +Alekhine's defense: four pawns attack, Korchnoi variation * +r1bq1rk1/pp2bppp/2n1pn2/2pp4/4P3/3P1NP1/PPPN1PBP/R1BQR1K1 b - - +R\'eti: King's Indian attack, French variation +r1bq1rk1/pp2bppp/2n2n2/2pp2B1/3P4/2N2NP1/PP2PPBP/R2Q1RK1 b - - +QGD: Tarrasch, Prague variation, 9.Bg5 +r1bq1rk1/pp2bppp/2n2n2/2pp4/3P4/2N2NP1/PP2PPBP/R1BQ1RK1 w - - +QGD: Tarrasch, Prague variation, Normal position +r1bq1rk1/pp2bppp/2n2n2/2ppp3/4P3/2NP1NP1/PPP2PBP/R1BQ1RK1 b - - +King's Indian: orthodox, Aronin-Taimanov variation (Yugoslav attack / Mar del Plata variation) * +r1bq1rk1/pp2bppp/2n2n2/2ppp3/4P3/2PP1NP1/PP3PBP/RNBQ1RK1 b - - +King's Indian: orthodox, Donner variation * +r1bq1rk1/pp2bppp/2n2n2/2ppp3/4P3/3P1NP1/PPP2PBP/RNBQ1RK1 w - - +King's Indian: orthodox variation * +r1bq1rk1/pp2bppp/2n2n2/2ppp3/4P3/3P1NP1/PPPN1PBP/R1BQ1RK1 b - - +King's Indian: orthodox, 7...Nbd7 * +r1bq1rk1/pp2bppp/2n2n2/4p3/2Pp4/3P1NP1/PP3PBP/RNBQ1RK1 w - - +Benoni: classical, 9.O-O * +r1bq1rk1/pp2bppp/2n2n2/4p3/2Pp4/3P1NP1/PP3PBP/RNBQR1K1 b - - +Benoni: classical, 9...Re8 * +r1bq1rk1/pp2bppp/2np1n2/4p1B1/3NPP2/2N5/PPPQ2PP/2KR1B1R w - - +Sicilian: Richter-Rauzer, Rauzer attack, Geller variation +r1bq1rk1/pp2bppp/2nppn2/6B1/3NPP2/2N5/PPPQ2PP/2KR1B1R b - - +Sicilian: Richter-Rauzer, Rauzer attack, 7...Be7 defense, 9.f4 +r1bq1rk1/pp2bppp/2nppn2/8/3NPP2/1BN1B3/PPP3PP/R2QK2R b KQ - +Sicilian: Sozin, Fischer variation +r1bq1rk1/pp2bppp/2nppn2/8/3NPP2/2N1B3/PPP1B1PP/R2Q1RK1 b - - +Sicilian: modern Scheveningen, main line +r1bq1rk1/pp2bppp/3ppn2/6B1/3QPP2/2N5/PPP3PP/2KR1B1R b - - +Sicilian: Richter-Rauzer, Rauzer attack, 7...Be7 defense, 9...Nxd4 +r1bq1rk1/pp2bppp/3ppn2/6B1/3nPP2/2N5/PPPQ2PP/2KR1B1R w - - +Sicilian: Richter-Rauzer, Rauzer attack, 7...Be7 defense, 9...Nxd4 +r1bq1rk1/pp2bppp/n1n5/2p1p3/8/PPNPPN2/4BPPP/R1BQ1RK1 b - - +Sicilian, Sz\'en, hedgehog variation * +r1bq1rk1/pp2ppbp/2n2np1/2p5/2Pp4/2NP1NP1/PP2PPBP/R1BQ1RK1 w - - +King's Indian: fianchetto, Yugoslav Panno * +r1bq1rk1/pp2ppbp/2n2np1/2pp2B1/8/2NP1NP1/PPP1PPBP/R2Q1RK1 b - - +King's Indian: fianchetto, Simagin variation * +r1bq1rk1/pp2ppbp/2n2np1/2pp4/2P5/2N2NP1/PP1PPPBP/R1BQ1RK1 w - - +English: symmetrical, main line with d4 * +r1bq1rk1/pp2ppbp/2n2np1/2pp4/2P5/3P1NP1/PP2PPBP/RNBQ1RK1 w - - +King's Indian: fianchetto, Yugoslav, 7.O-O * +r1bq1rk1/pp2ppbp/2n2np1/2pp4/3P1P2/2P1PN2/PP2B1PP/RNBQ1RK1 b - - +Dutch: stonewall with Nc3 * +r1bq1rk1/pp2ppbp/2n2np1/2pp4/3P1P2/4PN2/PPP1B1PP/RNBQ1RK1 w - - +Dutch: stonewall with Nc3 * +r1bq1rk1/pp2ppbp/2n2np1/2pp4/4P3/2NP1NP1/PPP2PBP/R1BQ1RK1 b - - +King's Indian: fianchetto, Uhlmann (Szabo) variation * +r1bq1rk1/pp2ppbp/2n2np1/2pp4/4P3/3P1NP1/PPPN1PBP/R1BQ1RK1 b - - +King's Indian: fianchetto, classical variation * +r1bq1rk1/pp2ppbp/2n2np1/2pp4/5B2/2NP1NP1/PPP1PPBP/R2Q1RK1 b - - +King's Indian: fianchetto, lesser Simagin (Spassky) variation * +r1bq1rk1/pp2ppbp/2n2np1/2pp4/5B2/2PP1NP1/PP2PPBP/RN1Q1RK1 b - - +King's Indian: fianchetto, Larsen system * +r1bq1rk1/pp2ppbp/2n2np1/2pp4/5P2/2NP1NP1/PPP1P1BP/R1BQ1RK1 b - - +Dutch: Leningrad, main variation with Nc6 * +r1bq1rk1/pp2ppbp/2n2np1/2pp4/5P2/2PP1NP1/PP2P1BP/RNBQ1RK1 b - - +Dutch: Leningrad, main variation with c6 * +r1bq1rk1/pp2ppbp/2n2np1/2pp4/5P2/3PPN2/PPP1B1PP/RNB1QRK1 b - - +Dutch: Ilyin-Genevsky variation * +r1bq1rk1/pp2ppbp/2n2np1/2pp4/8/1P2PN2/PBPPBPPP/RN1Q1RK1 w - - +Queen's Indian: old main line, 7.Nc3 * +r1bq1rk1/pp2ppbp/2n2np1/2pp4/8/P1NP1NP1/1PP1PPBP/R1BQ1RK1 b - - +King's Indian: fianchetto, Panno variation * +r1bq1rk1/pp2ppbp/2n2np1/2pp4/Q7/2PP1NP1/PP2PPBP/RNB2RK1 b - - +King's Indian: fianchetto, Kavalek (Bronstein) variation * +r1bq1rk1/pp2ppbp/2n2np1/3p4/2PN4/6P1/PP2PPBP/RNBQ1RK1 w - - +Neo-Gr\"unfeld, 6.cd Nxd5, 7.O-O c5, 8.Nc3 * +r1bq1rk1/pp2ppbp/2n2np1/3p4/2PP4/2N2N2/PP2BPPP/R1BQ1RK1 b - - +QGD: Tarrasch, Prague variation, Normal position * +r1bq1rk1/pp2ppbp/2n2np1/8/2Pp4/3P1NP1/PP1N1PBP/R1BQ1RK1 b - - +Benoni: fianchetto, 9...Nbd7 * +r1bq1rk1/pp2ppbp/2n3p1/8/2BPP3/4B3/P3NPPP/R2Q1RK1 b - - +Gr\"unfeld: Spassky variation, main line, 10...cd, 11.cd +r1bq1rk1/pp2ppbp/2np1np1/2p5/2P5/2N2NP1/PP1PPPBP/R1BQ1RK1 w - - +English: symmetrical, main line with d3 * +r1bq1rk1/pp2ppbp/2np1np1/2pP4/2P5/2N2NP1/PP2PPBP/R1BQ1RK1 b - - +King's Indian: fianchetto, Yugoslav Panno +r1bq1rk1/pp2ppbp/2np1np1/8/2BNP3/2N1BP2/PPPQ2PP/R3K2R b KQ - +Sicilian: dragon, Yugoslav attack, 9.Bc4 +r1bq1rk1/pp2ppbp/2np1np1/8/2PNPP2/2N1B3/PP2B1PP/R2QK2R b KQ - +King's Indian: Four pawns attack, main line +r1bq1rk1/pp2ppbp/2np1np1/8/3NP3/2N1B3/PPPQBPPP/2KR3R b - - +Sicilian: dragon, classical, Grigoriev variation +r1bq1rk1/pp2ppbp/2np1np1/8/3NP3/2N1B3/PPPQBPPP/R4RK1 b - - +Sicilian: dragon, classical, Richter variation +r1bq1rk1/pp2ppbp/2np1np1/8/3NP3/2N1BP2/PPPQ2PP/2KR1B1R b - - +Sicilian: dragon, Yugoslav attack, Rauser variation +r1bq1rk1/pp2ppbp/2np1np1/8/4P3/1NN1B3/PPP1BPPP/R2Q1RK1 b - - +Sicilian: dragon, classical, 9.Nb3 +r1bq1rk1/pp2ppbp/5np1/n7/2BP4/2N2N2/PP3PPP/R1BQ1RK1 w - - +QGD: Tarrasch, R\'eti variation * +r1bq1rk1/pp3pb1/2n2npp/2ppp3/4P3/2PP1NP1/PP1N1PBP/R1BQ1RK1 w - - +King's Indian: fianchetto, classical main line * +r1bq1rk1/pp3pbp/2n2np1/2ppp3/4P3/3P1NP1/PPPN1PBP/R1BQ1RK1 w - - +King's Indian: fianchetto, classical variation, 8.e4 * +r1bq1rk1/pp3ppp/2B2n2/2b1N3/3p4/2N5/PPPP1PPP/R1BQK2R w KQ - +Giuoco Piano: M\"oller (Therkatz) attack * +r1bq1rk1/pp3ppp/2B2n2/2bpN3/8/2N5/PPPP1PPP/R1BQK2R b KQ - +Giuoco Piano * +r1bq1rk1/pp3ppp/2N2n2/1Bbp4/8/2N5/PPPP1PPP/R1BQK2R b KQ - +Giuoco Piano: Greco variation * +r1bq1rk1/pp3ppp/2n1pn2/1Bbp4/2P5/4PN2/PP1N1PPP/R1BQ1RK1 b - - +Nimzo-Indian: 4.e3, Gligori\'c system, Bronstein variation * +r1bq1rk1/pp3ppp/2n1pn2/1Bbp4/2P5/4PN2/PP2QPPP/RNB2RK1 b - - +Nimzo-Indian: 4.e3, Gligori\'c system, Smyslov variation * +r1bq1rk1/pp3ppp/2n1pn2/1Bbp4/2P5/4PN2/PP3PPP/RNBQ1RK1 w - - +Nimzo-Indian: 4.e3, Gligori\'c system with 7...dc * +r1bq1rk1/pp3ppp/2n1pn2/2p5/2BP4/P1P1PN2/5PPP/R1BQ1RK1 b - - +Nimzo-Indian: 4.e3, main line +r1bq1rk1/pp3ppp/2n1pn2/2pp4/1bPP4/2NBPN2/PP3PPP/R1BQ1RK1 w - - +Nimzo-Indian: 4.e3, main line with 7...Nc6 +r1bq1rk1/pp3ppp/2n1pn2/2pp4/2PP4/P1PBPN2/5PPP/R1BQ1RK1 b - - +Nimzo-Indian: 4.e3, main line with 8...Bxc3 +r1bq1rk1/pp3ppp/2n1pn2/8/1bBp4/P1N1PN2/1P3PPP/R1BQ1RK1 w - - +Nimzo-Indian: 4.e3, main line with 8...dc and 9...cd +r1bq1rk1/pp3ppp/2n2n2/2bp4/N7/5NP1/PP2PPBP/R1BQ1RK1 b - - +QGD: Tarrasch, R\'eti variation +r1bq1rk1/pp3ppp/2nbpn2/1BPp4/8/2N1PN2/PPP2PPP/R1BQ1RK1 b - - +Nimzo-Indian: 4.e3, Ragozin variation * +r1bq1rk1/pp3ppp/2nbpn2/1Bpp4/2PP4/1P2PN2/P4PPP/RNBQ1RK1 b - - +Nimzo-Indian: 4.e3, Keres variation * +r1bq1rk1/pp3ppp/2nbpn2/1Bpp4/2PP4/2N1PN2/PP3PPP/R1BQ1RK1 b - - +Nimzo-Indian: 4.e3, main line with 7...Nc6 * +r1bq1rk1/pp3ppp/2nbpn2/1Bpp4/2PP4/4PN2/PP1N1PPP/R1BQ1RK1 b - - +Nimzo-Indian: 4.e3, Gligori\'c system with 7...Nbd7 * +r1bq1rk1/pp3ppp/2nbpn2/2pp2B1/3P4/2P2NP1/PP2PPBP/RN1Q1RK1 b - - +Gr\"unfeld: Smyslov defense * +r1bq1rk1/pp3ppp/2nbpn2/2pp4/2PP4/2NBPN2/PP3PPP/R1BQ1RK1 b - - +QGD: Semi-Tarrasch, symmetrical variation * +r1bq1rk1/pp3ppp/2nbpn2/2pp4/2PP4/2NBPN2/PP3PPP/R1BQ1RK1 w - - +QGD: Semi-Tarrasch, symmetrical variation +r1bq1rk1/pp3ppp/2nbpn2/2pp4/3P1B2/2P2NP1/PP2PPBP/RN1Q1RK1 b - - +Gr\"unfeld: Flohr defense * +r1bq1rk1/pp3ppp/3b4/3P4/1P2n3/4PN2/5PPP/R1BQKB1R w KQ - +QGD semi-Slav: Meran, Sozin variation * +r1bq1rk1/pp4bp/2nppnp1/2p5/2P1PPPP/2N5/PP2B3/R1BQK1NR b KQ - +King's Indian: Six pawns attack +r1bq1rk1/ppbn1Npp/2p2n2/8/1PBPp3/P1N1B3/2P2PPP/R2Q1RK1 b - - +Ruy Lopez: open, Dilworth variation * +r1bq1rk1/ppp1b1pp/2n5/3npp2/8/P1NPPN2/1PQ2PPP/R1B1KB1R b KQ - +Sicilian: Scheveningen, classical variation with ...Qc7 and ...Nc6 * +r1bq1rk1/ppp1bppp/2n1pn2/8/3PN3/P5N1/1PP1BPPP/R1BQK2R w KQ - +French: Winawer, Alekhine gambit, Alatortsev variation +r1bq1rk1/ppp1bppp/2n5/3np3/8/P2PPN2/1P1N1PPP/R1BQKB1R b KQ - +Sicilian: Scheveningen, classical, Nd7 system * +r1bq1rk1/ppp1bppp/2n5/3np3/8/P2PPN2/1PQ2PPP/RNB1KB1R b KQ - +Sicilian: Scheveningen (Paulsen), classical variation * +r1bq1rk1/ppp1npbp/3p1np1/3Pp3/1PP1P3/2N2N2/P3BPPP/R1BQ1RK1 b - - +King's Indian: orthodox, Aronin-Taimanov, bayonet attack +r1bq1rk1/ppp1npbp/3p1np1/3Pp3/2P1P3/2N5/PP2BPPP/R1BQNRK1 b - - +King's Indian: orthodox, Aronin-Taimanov, 9.Ne1 +r1bq1rk1/ppp1nppN/3p4/3P4/2B1R3/8/PP3PPP/R2Q2K1 b - - +Giuoco Piano: Therkatz-Herzog variation +r1bq1rk1/ppp1nppp/3p1n2/1B2p1B1/1b2P3/2NP1N2/PPP2PPP/R2Q1RK1 w - - +Four knights: symmetrical, Pillsbury variation +r1bq1rk1/ppp1nppp/3p1n2/1B2p3/1b1PP3/2N2N2/PPP1QPPP/R1B2RK1 b - - +Four knights: Alatortsev variation * +r1bq1rk1/ppp1nppp/3p1n2/1B2p3/1b2P3/2NP1N2/PPP2PPP/R1BQ1RK1 w - - +Four knights: symmetrical, Mar\'oczy system * +r1bq1rk1/ppp1p1bp/2np1np1/5p2/2PP4/2N2NP1/PP2PPBP/R1BQ1RK1 w - - +Dutch: Leningrad, main variation with Nc6 +r1bq1rk1/ppp1ppbp/2n2np1/8/2QPP3/2N2N2/PP3PPP/R1B1KB1R w KQ - +Gr\"unfeld: Russian, Byrne (Simagin) variation +r1bq1rk1/ppp1ppbp/2n3p1/8/2BPP3/2P5/P3NPPP/R1BQK2R w KQ - +Gr\"unfeld: exchange, Simagin's improved variation +r1bq1rk1/ppp1ppbp/2np1np1/8/2PP4/2N2NP1/PP2PPBP/R1BQK2R w KQ - +King's Indian: fianchetto with ...Nc6 +r1bq1rk1/ppp1ppbp/2np1np1/8/2PPP3/2N1BP2/PP4PP/R2QKBNR w KQ - +King's Indian: S\"amisch, 6...Nc6 +r1bq1rk1/ppp1ppbp/n2p1np1/8/2PPP3/2N2N2/PP2BPPP/R1BQK2R w KQ - +King's Indian: Kazakh variation +r1bq1rk1/ppp1ppbp/n4np1/8/2QPP3/2N2N2/PP3PPP/R1B1KB1R w KQ - +Gr\"unfeld: Russian, Prins variation +r1bq1rk1/ppp2pbp/2np1np1/4p3/2PP4/2N2NP1/PP2PPBP/R1BQ1RK1 w - - +King's Indian: fianchetto, Uhlmann (Szabo) variation +r1bq1rk1/ppp2pbp/2np1np1/4p3/2PPP3/2N2N2/PP2BPPP/R1BQ1RK1 w - - +King's Indian: orthodox, Aronin-Taimanov variation (Yugoslav attack / Mar del Plata variation) +r1bq1rk1/ppp2ppp/1b1p1n2/4p3/N3P3/3P1B2/PPP2PPP/R1BQ1RK1 w - - +Four knights: Rubinstein counter-gambit Mar\'oczy variation +r1bq1rk1/ppp2ppp/2Bp1n2/4p3/1b2P3/2N2N2/PPPP1PPP/R1BQ1RK1 b - - +Four knights * +r1bq1rk1/ppp2ppp/2n1pn2/8/1bpP4/2NBPN2/PP3PPP/R1BQ1RK1 w - - +Nimzo-Indian: 4.e3, Ragozin variation +r1bq1rk1/ppp2ppp/2n2n2/1B1pp3/4P3/2PP1N2/P1P2PPP/R1BQ1RK1 w - - +Four knights: Svenonius variation +r1bq1rk1/ppp2ppp/2n2n2/3Pp3/1b6/2NP1N2/PPPB1PPP/R2QKB1R b KQ - +Ruy Lopez: closed Berlin defense, Wolf variation * +r1bq1rk1/ppp2ppp/2n2n2/3pp3/1b2P3/2NP1N2/PPPBBPPP/R2QK2R b KQ - +Ruy Lopez: Berlin defense, hedgehog variation * +r1bq1rk1/ppp2ppp/2n2n2/3pp3/4P3/2bP1N2/PPPBBPPP/R2QK2R w KQ - +Ruy Lopez: closed Berlin defense, Showalter variation * +r1bq1rk1/ppp2ppp/2np1n2/1B2p3/1b2P3/2N2N2/PPPP1PPP/R1BQ1RK1 w - - +Four knights: double Ruy Lopez * +r1bq1rk1/ppp2ppp/2np1n2/1B2p3/1b2P3/2NP1N2/PPP2PPP/R1BQ1RK1 b - - +Four knights: symmetrical variation * +r1bq1rk1/ppp2ppp/2np1n2/1B2p3/1b2P3/2NP1N2/PPP2PPP/R1BQ1RK1 w - - +Four knights: symmetrical variation +r1bq1rk1/ppp2ppp/2np1n2/1B2p3/1b2P3/3P1N2/PPP1NPPP/R1BQ1RK1 b - - +Four knights: symmetrical, Mar\'oczy system +r1bq1rk1/ppp2ppp/2np1n2/1B2p3/4P3/2PP1N2/P1P2PPP/R1BQR1K1 b - - +Four knights: Janowski variation +r1bq1rk1/ppp2ppp/3p1b2/n3p3/4P3/1B1P1N2/PPP2PPP/R1BQ1RK1 b - - +Four knights: Rubinstein counter-gambit Mar\'oczy variation * +r1bq1rk1/ppp3pp/2n2P2/2bp1PB1/8/2p5/PPP2P1P/R2QKBNR w KQ - +Vienna: Pierce gambit, Rushmere attack * +r1bq1rk1/ppp3pp/2n5/1B1p1p2/1b2p3/2N2N2/PPPP1PPP/R1BQ1RK1 b - - +Four knights: Bardeleben variation * +r1bq1rk1/pppn1pb1/3p3p/3Pp1pn/2P1P2P/2N2NB1/PP2BPP1/R2QK2R b KQ - +King's Indian: Petrosian system, Keres variation +r1bq1rk1/pppn1pbp/3p1np1/3Pp3/2P1P3/2N2N2/PP2BPPP/R1BQK2R w KQ - +King's Indian: Petrosian system, main line +r1bq1rk1/pppn1pbp/3p1np1/4p3/2PP4/2N2NP1/PP2PPBP/R1BQ1RK1 w - - +King's Indian: fianchetto, classical variation +r1bq1rk1/pppn1pbp/3p1np1/4p3/2PPP3/2N2N2/PP2BPPP/R1BQ1RK1 w - - +King's Indian: orthodox, 7...Nbd7 +r1bq1rk1/pppn1pbp/3p1np1/4p3/2PPP3/2N2N2/PP2BPPP/R1BQR1K1 b - - +King's Indian: orthodox, 7...Nbd7, 8.Re1 +r1bq1rk1/pppn1pbp/3p1np1/4p3/2PPP3/2N2NP1/PP3PBP/R1BQ1RK1 b - - +King's Indian: fianchetto, classical variation, 8.e4 +r1bq1rk1/pppn1ppp/1b3n2/4N3/1P1Pp3/P1N1B3/2P2PPP/R2QKB1R w KQ - +Ruy Lopez: open, Bernstein variation * +r1bq1rk1/pppnbBpp/3p1n2/4p1N1/3PP3/2N5/PPP2PPP/R1BQK2R b KQ - +Philidor: Nimzovich, L\"arobok variation +r1bq1rk1/pppnbppp/4pn2/3p2B1/2PP4/1QN1PN2/PP3PPP/R3KB1R b KQ - +QGD: Orthodox defense, Rauzer variation +r1bq1rk1/pppnbppp/4pn2/3p2B1/2PP4/2N1PN2/PP3PPP/2RQKB1R b K - +QGD: Orthodox defense, 7.Rc1 +r1bq1rk1/pppnbppp/4pn2/3p2B1/2PP4/2N1PN2/PP3PPP/R2QKB1R w KQ - +QGD: Orthodox defense +r1bq1rk1/pppnbppp/4pn2/3p2B1/2PP4/2N1PN2/PPQ2PPP/R3KB1R b KQ - +QGD: Orthodox defense, Rubinstein variation +r1bq1rk1/pppnbppp/4pn2/3p2B1/2PP4/2NBPN2/PP3PPP/R2QK2R b KQ - +QGD: Orthodox defense, Botvinnik variation +r1bq1rk1/pppnbppp/4pn2/3p4/2PP4/5NP1/PP2PPBP/RNBQ1RK1 w - - +Catalan: closed, 6...Nbd7 +r1bq1rk1/pppnbppp/4pn2/3p4/2PP4/5NP1/PPQ1PPBP/RNB2RK1 b - - +Catalan: closed, 7.Qc2 +r1bq1rk1/pppnn1bp/3p2p1/3Ppp2/2P1P1P1/2N2P2/PP2B2P/R1BQNRK1 b - - +King's Indian: orthodox, Aronin-Taimanov, Benk\"o attack +r1bq1rk1/pppnn1bp/3p2p1/3Ppp2/2P1P3/2N2P2/PP2B1PP/R1BQNRK1 w - - +King's Indian: orthodox, Aronin-Taimanov, main line +r1bq1rk1/pppnppbp/3p1np1/8/2PP4/2N2NP1/PP2PPBP/R1BQK2R w KQ - +King's Indian: fianchetto with ...Nd7 +r1bq1rk1/pppnppbp/5np1/6N1/2BP4/1QN1P3/PP3PPP/R1B1K2R b KQ - +Gr\"unfeld: Pachman variation +r1bq1rk1/pppp1ppp/1bn2n2/1B2p3/3PP3/2P2N2/PP3PPP/RNBQ1RK1 w - - +Ruy Lopez: classical defense, Benelux variation +r1bq1rk1/pppp1ppp/2B2n2/4p3/1b2P3/2N2N2/PPPP1PPP/R1BQ1RK1 b - - +Four knights: Nimzovich (Paulsen) variation +r1bq1rk1/pppp1ppp/2n2n2/1B2P3/1b1P1P2/2N5/PPP3PP/R1BQ1RK1 w - - +Four knights: Bardeleben variation +r1bq1rk1/pppp1ppp/2n2n2/1B2p3/1b2P3/2NP1N2/PPP2PPP/R1BQ1RK1 b - - +Four knights: double Ruy Lopez +r1bq1rk1/pppp1ppp/2n2n2/1B2p3/4P3/2b2N2/PPPP1PPP/R1BQ1RK1 w - - +Four knights: Nimzovich (Paulsen) variation * +r1bq1rk1/pppp1ppp/2n2n2/1B2p3/4P3/2bP1N2/PPP2PPP/R1BQ1RK1 w - - +Four knights +r1bq1rk1/pppp1ppp/2n2n2/3Np3/1b2P3/5N2/PPPP1PPP/R1BQKB1R w KQ - +Four knights: Rubinstein counter-gambit, Henneberger variation * +r1bq1rk1/pppp1ppp/2n2n2/b3N3/2BPP3/2P5/P4PPP/RNBQ1RK1 b - - +Evans gambit: Richardson attack +r1bq1rk1/pppp1ppp/2n2n2/b3N3/4P3/P1N5/1PPP1PPP/R1BQKB1R w KQ - +Ruy Lopez: open, Knorre variation * +r1bq1rk1/pppp1ppp/2n5/1B1P4/1b2p3/5N2/PPPP1PPP/R1BQ1RK1 w - - +Four knights: Gunsberg counter-attack +r1bq1rk1/pppp1ppp/2n5/3Np3/1bB1n3/5N2/PPPP1PPP/R1BQ1RK1 b - - +Four knights: Marshall variation * +r1bq1rk1/pppp1ppp/5n2/1B2P3/1b1p4/2N5/PPPP1PPP/R1BQ1RK1 b - - +Four knights: Gunsberg counter-attack * +r1bq1rk1/pppp1ppp/5n2/1Bb1N3/3nP3/2N5/PPPP1PPP/R1BQ1RK1 w - - +Four knights: Marshall variation +r1bq1rk1/pppp1ppp/5n2/4n1N1/1bB5/8/PB3PPP/RN1Q1RK1 w - - +Scotch gambit: Hanneken variation +r1bq1rk1/pppp2pp/2n2n2/2b1pPP1/8/2N5/PPPP1P1P/R1BQKBNR w KQ - +Vienna: Hamppe-Muzio gambit * +r1bq2k1/pp3p1p/5n2/2b1r1p1/3p4/3P1B2/PPP1NPPP/R1BQK2R w KQ - +Giuoco Piano: M\"oller, bayonet attack * +r1bq3r/pp3pkp/2n2np1/4p3/2Pp4/3P1NP1/4PPBP/RN1Q1RK1 w - - +Benk\"o gambit: main line * +r1bq3r/ppp2k1p/2n3p1/2Qp4/3pP3/8/PPP2PPP/RNB1K2R w KQ - +Scotch gambit: Cochrane-Shumov defense +r1bq3r/ppp3pp/5k2/3pN3/1n1Pn3/1Q3P2/PP4PP/RN2K2R b KQ - +Giuoco Piano: Krause variation +r1bqk1nr/1ppp1ppp/p1n5/2b1p3/B3P3/5N2/PPPP1PPP/RNBQK2R w KQkq - +Ruy Lopez: Classical defense deferred +r1bqk1nr/1ppp1ppp/p1n5/4p3/Bb2P3/5N2/PPPP1PPP/RNBQK2R w KQkq - +Ruy Lopez: Alapin's defense deferred +r1bqk1nr/1ppp1ppp/pbn5/4p3/PPB1P3/2N2N2/2PP1PPP/R1BQK2R b KQkq - +Evans gambit declined, Showalter variation +r1bqk1nr/2pp1ppp/p1n5/1pb1p3/4P3/1B3N2/PPPP1PPP/RNBQK2R w KQkq - +Ruy Lopez: Graz variation +r1bqk1nr/5ppp/p1pbp3/2pp4/2P5/2N1PN2/PP1P1PPP/R1BQ1RK1 b kq - +Nimzo-Indian: S\"amisch, main line * +r1bqk1nr/5ppp/p1pbp3/2pp4/3P4/4PN2/PPP2PPP/RNBQ1RK1 w kq - +Nimzo-Indian: 4.e3, Botvinnik system * +r1bqk1nr/p1pp1ppp/2n5/bp2p3/2BPP3/2P2N2/P4PPP/RNBQK2R w KQkq - +Evans gambit: Leonhardt variation +r1bqk1nr/p4ppp/2p5/2bpp3/8/6P1/PPP1PPBP/RNBQK2R w KQkq - +Gr\"unfeld: exchange, classical variation * +r1bqk1nr/pp1n1ppp/2pb4/3p4/2PPp3/1P2P3/P2N1PPP/RNBQKB1R b KQkq - +French: Tarrasch, Botvinnik variation * +r1bqk1nr/pp1n1ppp/2pb4/3p4/2PPp3/2N1P3/PP1N1PPP/R1BQKB1R b KQkq - +French: Tarrasch, closed variation * +r1bqk1nr/pp1nbppp/2pp4/4P3/2B1P3/5N2/PPP2PPP/RNBQ1RK1 b kq - +Philidor: Hanham, Steiner variation +r1bqk1nr/pp1p1pbp/2n1p1p1/2p2P2/2B1P3/2N2N2/PPPP2PP/R1BQK2R b KQkq - +Sicilian: Grand Prix attack, Schofman variation +r1bqk1nr/pp1p1pbp/2n1p1p1/2p5/2P1P3/2N3P1/PP1P1PBP/R1BQK1NR b KQkq - +English: symmetrical, Botvinnik system reversed * +r1bqk1nr/pp1p1pbp/2n3p1/1Bp1p3/1P2P3/5N2/P1PP1PPP/RNBQR1K1 b kq - +Sicilian: Nimzovich-Rossolimo attack, Gurgenidze variation +r1bqk1nr/pp1p1pbp/2n3p1/2p1p3/2P5/2N1P1P1/PP1P1PBP/R1BQK1NR w KQkq - +English: symmetrical, Botvinnik system reversed +r1bqk1nr/pp1p1pbp/2n3p1/2p1p3/2P5/2N2NP1/PP1PPPBP/R1BQK2R w KQkq - +English: symmetrical, Botvinnik system reversed +r1bqk1nr/pp1p1pbp/2n3p1/2p1p3/2P5/2N3P1/PP1PPPBP/R1BQK1NR w KQkq - +English: symmetrical, Botvinnik system * +r1bqk1nr/pp1p1pbp/4p1p1/2p5/3nP3/3PB1P1/PPP1NPBP/R2QK1NR b KQkq - +Sicilian: closed, Smyslov variation +r1bqk1nr/pp1p1ppp/2n5/2b5/2pNp3/3PP3/PPP2PPP/RNBQKB1R b KQkq - +Alekhine's defense: two pawns' attack, Mikenas variation * +r1bqk1nr/pp1pppbp/2N3p1/8/8/6P1/PPP1PP1P/RNBQKB1R b KQkq - +English: Anglo-Gr\"unfeld, Smyslov defense * +r1bqk1nr/pp1pppbp/2n3p1/2p5/2P1P3/2N3P1/PP1P1PBP/R1BQK1NR b KQkq - +English: symmetrical, Botvinnik system +r1bqk1nr/pp1pppbp/2n3p1/2p5/2P5/2N2NP1/PP1PPPBP/R1BQK2R b KQkq - +English: symmetrical variation +r1bqk1nr/pp1pppbp/2n3p1/2p5/2P5/2N3P1/PP1PPPBP/R1BQK1NR b KQkq - +English: ultra-symmetrical variation * +r1bqk1nr/pp1pppbp/2n3p1/2p5/2P5/2N3P1/PP1PPPBP/R1BQK1NR w KQkq - +English: ultra-symmetrical variation +r1bqk1nr/pp1pppbp/2n3p1/2p5/4P3/2N3P1/PPPP1PBP/R1BQK1NR b KQkq - +English: closed system * +r1bqk1nr/pp1pppbp/2n3p1/2p5/4P3/2NPB3/PPP2PPP/R2QKBNR b KQkq - +English, Tr\"oger defense * +r1bqk1nr/pp1pppbp/2n3p1/8/2P5/8/PPN1PPPP/RNBQKB1R b KQkq - +English: symmetrical, Rubinstein system * +r1bqk1nr/pp1pppbp/2n3p1/8/2PNP3/4B3/PP3PPP/RN1QKB1R b KQkq - +Sicilian: accelerated fianchetto, Mar\'oczy bind, 6.Be3 +r1bqk1nr/pp1pppbp/2n3p1/8/2PNP3/8/PP3PPP/RNBQKB1R w KQkq - +Sicilian: accelerated fianchetto, Mar\'oczy bind, 5...Bg7 +r1bqk1nr/pp1pppbp/2n3p1/8/8/1N4P1/PPP1PP1P/RNBQKB1R b KQkq - +English: Anglo-Gr\"unfeld, Czech defense * +r1bqk1nr/pp2b1pp/2n5/2pppp2/8/3P1NP1/PPP1PPBP/RNBQ1RK1 w kq - +King's Indian: Four pawns attack, 6.Be2 * +r1bqk1nr/pp2b3/2n5/2p1pppp/2P5/2NPPNP1/PP4BP/R1BQ1RK1 w kq - +King's Indian: Six pawns attack * +r1bqk1nr/pp2bppp/2n5/2ppp3/8/3P1NP1/PPP1PPBP/RNBQK2R w KQkq - +King's Indian: 5.Be2 * +r1bqk1nr/pp2ppbp/2n3p1/2pp4/5P2/2PP1N2/PPQ1P1PP/RNB1KB1R b KQkq - +Dutch: Hort-Antoshin system * +r1bqk1nr/pp2ppbp/2np2p1/2p5/4P3/2N3P1/PPPP1PBP/R1BQK1NR w KQkq - +English: closed system (without ...d6) * +r1bqk1nr/pp2ppbp/2np2p1/2p5/4P3/2NP2P1/PPP2PBP/R1BQK1NR b KQkq - +English: closed system * +r1bqk1nr/pp2ppbp/2np2p1/2p5/4P3/2NP2P1/PPP2PBP/R1BQK1NR w KQkq - +Sicilian: closed +r1bqk1nr/pp2ppbp/2np2p1/2p5/4P3/2NPB1P1/PPP2PBP/R2QK1NR b KQkq - +Sicilian: closed, 6.Be3 +r1bqk1nr/pp2ppbp/2np2p1/2p5/4PP2/2NP2P1/PPP3BP/R1BQK1NR b KQkq - +Sicilian: closed, 6.f4 +r1bqk1nr/pp3pbp/2np2p1/2p1p3/4P3/2NP2P1/PPP1NPBP/R1BQK2R w KQkq - +Sicilian: closed, 6.Ne2 e5 (Botvinnik) +r1bqk1nr/pp3pbp/2np2p1/2p1p3/4P3/2NP2P1/PPP2PBP/R1BQK1NR w KQkq - +English: Botvinnik system * +r1bqk1nr/pp3pbp/2np2p1/2p1p3/4PP2/2NP2P1/PPP3BP/R1BQK1NR w KQkq - +Sicilian: closed, 6.f4 e5 (Botvinnik) +r1bqk1nr/pp3ppp/2nbp3/1Bpp4/3P4/4PN2/PPP2PPP/RNBQ1RK1 b kq - +Nimzo-Indian: 4.e3 O-O, 5.Bd3 d5 * +r1bqk1nr/pp3ppp/2nbp3/1Bpp4/8/4PN2/PPPP1PPP/RNBQ1RK1 w kq - +Nimzo-Indian: 4.e3 O-O, 5.Bd3 * +r1bqk1nr/pp3ppp/2nbp3/2pp4/4P3/3P1N2/PPPN1PPP/R1BQKB1R w KQkq - +Old Indian: Dus-Khotimirsky variation * +r1bqk1nr/pp3ppp/8/1Pb1p3/1nPp4/3P1N2/4PPPP/RNBQKB1R w KQkq - +Benk\"o gambit: Nescaf\'e Frapp\'e attack * +r1bqk1nr/pp4pp/2n5/4pp2/1bPp4/3P1NP1/PP3PBP/RNBQK2R w KQkq - +Benoni: Taimanov variation * +r1bqk1nr/ppp1bp1p/2n5/3pp1p1/8/3P1NP1/PPP1PPBP/RNBQK2R w KQkq - +Pirc: Chinese variation * +r1bqk1nr/ppp1bpp1/2n5/3pp2p/8/3P1NP1/PPP1PPBP/RNBQK2R w KQkq - +Pirc: bayonet (Mariotti) attack * +r1bqk1nr/ppp1bppp/2n5/3pp3/8/3P1NP1/PPP1PP1P/RNBQKB1R w KQkq - +Pirc defense * +r1bqk1nr/ppp1ppbp/2np2p1/8/2PPP3/2N5/PP3PPP/R1BQKBNR w KQkq - +Modern defense: Averbakh system, Kotov variation +r1bqk1nr/ppp2pbp/2np2p1/4p3/2P1P3/2NP2P1/PP3PBP/R1BQK1NR b KQkq - +English: Botvinnik system +r1bqk1nr/ppp2pbp/2np2p1/4p3/2P5/2NP2P1/PP2PPBP/R1BQK1NR b KQkq - +Sicilian: closed * +r1bqk1nr/ppp2pbp/2np2p1/4p3/2P5/2NP2P1/PP2PPBP/R1BQK1NR w KQkq - +English: closed system +r1bqk1nr/ppp2ppp/1b1p4/n2P4/2B1P3/5N2/PB3PPP/RN1Q1RK1 b kq - +Evans gambit: Ulvestad variation +r1bqk1nr/ppp2ppp/1b1p4/n5B1/2BPP3/2N2N2/P4PPP/R2Q1RK1 b kq - +Evans gambit: G\"oring attack +r1bqk1nr/ppp2ppp/1bnp4/4p3/2BPP3/2P2N2/P4PPP/RNBQ1RK1 w kq - +Evans gambit: Lasker defense +r1bqk1nr/ppp2ppp/1bnp4/8/2BPP3/2N2N2/P4PPP/R1BQ1RK1 b kq - +Evans gambit: Morphy attack +r1bqk1nr/ppp2ppp/1bnp4/8/2BPP3/5N2/P4PPP/RNBQ1RK1 w kq - +Evans gambit: normal variation +r1bqk1nr/ppp2ppp/1bnp4/8/2BPP3/5N2/PP3PPP/RNBQK2R w KQkq - +Giuoco Piano: LaBourdonnais variation +r1bqk1nr/ppp2ppp/2n1p3/8/3Pp3/P1N5/1PP2PPP/R1BQKB1R w KQkq - +French: Winawer, Alekhine gambit, Kan variation +r1bqk1nr/ppp2ppp/2n5/2bpp3/1PB1P3/5N2/P1PP1PPP/RNBQK2R w KQkq - +Evans counter-gambit +r1bqk1nr/ppp2ppp/2n5/2bpp3/8/3P1NP1/PPP1PP1P/RNBQKB1R w KQkq - +Pirc: Holmov system * +r1bqk1nr/ppp2ppp/2nb4/3pp3/3P4/4PN2/PPP2PPP/RNBQKB1R w KQkq - +French: Swiss variation * +r1bqk1nr/ppp2ppp/2np4/b3p1B1/2BPP3/2P2N2/P4PPP/RN1QK2R b KQkq - +Evans gambit: Sokolsky variation +r1bqk1nr/ppp2ppp/2np4/b3p3/2B1P3/2P2N2/P2P1PPP/RNBQ1RK1 w kq - +Evans gambit +r1bqk1nr/ppp2ppp/2np4/b3p3/2BPP3/1QP2N2/P4PPP/RNB1K2R b KQkq - +Evans gambit: Tartakower attack +r1bqk1nr/ppp2ppp/2np4/b3p3/2BPP3/2P2N2/P4PPP/RNBQK2R w KQkq - +Evans gambit +r1bqk1nr/ppp2ppp/2np4/b7/2BpP3/1QP2N2/P4PPP/RNB2RK1 b kq - +Evans gambit: Waller attack +r1bqk1nr/ppp2ppp/3b4/3pn3/8/2P2N2/PP2PPPP/RNBQKB1R w KQkq - +Caro-Kann: Alekhine gambit * +r1bqk1nr/ppp2ppp/8/2bp4/8/2P2P2/PP3PPP/RNBQKB1R w KQkq - +Caro-Kann: Forg\'acs variation * +r1bqk1nr/ppp3bp/2np2p1/4pp2/2P1P3/2NP2P1/PP3PBP/R1BQK1NR b KQkq - +Sicilian: closed, 6.f4 e5 (Botvinnik) * +r1bqk1nr/ppp3bp/2np2p1/4pp2/2P5/2NP2P1/PP2PPBP/R1BQK1NR w KQkq - +Sicilian: closed, 6.f4 * +r1bqk1nr/ppp3pp/1b1p1p2/n7/2BPP3/2N1BN2/P4PPP/R2Q1RK1 b kq - +Evans gambit: Steinitz variation +r1bqk1nr/ppp3pp/2n5/2bppp2/8/3P1NP1/PPP1PPBP/RNBQK2R w KQkq - +Pirc: Austrian attack, Ljubojevi\'c variation * +r1bqk1nr/pppn1ppp/3p4/2b1p3/4PP2/2N2N2/PPPP2PP/R1BQKB1R w KQkq - +KGD: classical, Hanham variation +r1bqk1nr/pppp1Bpp/2n5/2b1p3/4P3/5N2/PPPP1PPP/RNBQK2R b KQkq - +Giuoco Piano: Jerome gambit +r1bqk1nr/pppp1pbp/2n3p1/4p3/2P5/2N3P1/PP1PPPBP/1RBQK1NR b Kkq - +English: closed, 5.Rb1 +r1bqk1nr/pppp1pbp/2n3p1/4p3/2P5/2N3P1/PP1PPPBP/R1BQK1NR w KQkq - +English: closed system +r1bqk1nr/pppp1pbp/2n3p1/4p3/2P5/2NP2P1/PP2PPBP/R1BQK1NR b KQkq - +English: closed system (without ...d6) +r1bqk1nr/pppp1ppp/1bn5/1B2p3/4P3/2P2N2/PP1P1PPP/RNBQK2R w KQkq - +Ruy Lopez: classical defense, Charousek variation +r1bqk1nr/pppp1ppp/1bn5/4p3/1PB1P3/5N2/PBPP1PPP/RN1QK2R b KQkq - +Evans gambit declined, Cordel variation +r1bqk1nr/pppp1ppp/1bn5/4p3/PPB1P3/5N2/2PP1PPP/RNBQK2R b KQkq - +Evans gambit declined, 5.a4 +r1bqk1nr/pppp1ppp/2n5/1B2p3/1b2P3/5N2/PPPP1PPP/RNBQK2R w KQkq - +Ruy Lopez: Alapin's defense +r1bqk1nr/pppp1ppp/2n5/1Bb1p3/4P3/2P2N2/PP1P1PPP/RNBQK2R b KQkq - +Ruy Lopez: classical defense, 4.c3 +r1bqk1nr/pppp1ppp/2n5/1Bb1p3/4P3/5N2/PPPP1PPP/RNBQK2R w KQkq - +Ruy Lopez: classical (Cordel) defense +r1bqk1nr/pppp1ppp/2n5/2b1N3/4P3/8/PPPP1PPP/RNBQKB1R b KQkq - +Vienna game * +r1bqk1nr/pppp1ppp/2n5/2b1p3/1PB1P3/5N2/P1PP1PPP/RNBQK2R b KQkq - +Evans gambit declined +r1bqk1nr/pppp1ppp/2n5/2b1p3/2B1P3/2P2N2/PP1P1PPP/RNBQK2R b KQkq - +Giuoco Piano +r1bqk1nr/pppp1ppp/2n5/2b1p3/2B1P3/3P1N2/PPP2PPP/RNBQK2R b KQkq - +Giuoco Pianissimo +r1bqk1nr/pppp1ppp/2n5/2b1p3/2B1P3/5N2/PPPP1PPP/RNBQK2R w KQkq - +Giuoco Piano +r1bqk1nr/pppp1ppp/2n5/2b1p3/4P3/2N2N2/PPPP1PPP/R1BQKB1R b KQkq - +Vienna game * +r1bqk1nr/pppp1ppp/2n5/2b1p3/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - +Vienna game * +r1bqk1nr/pppp1ppp/2n5/2b3N1/2BpP3/8/PPP2PPP/RNBQK2R b KQkq - +Scotch gambit +r1bqk1nr/pppp1ppp/2n5/2b5/3NP3/8/PPP2PPP/RNBQKB1R w KQkq - +Scotch game +r1bqk1nr/pppp1ppp/2n5/2b5/4P3/1N6/PPP2PPP/RNBQKB1R b KQkq - +Scotch: Potter variation +r1bqk1nr/pppp1ppp/2n5/4p3/1bB1P3/5N2/P1PP1PPP/RNBQK2R w KQkq - +Evans gambit +r1bqk1nr/pppp1ppp/2n5/8/1b2P3/1N6/PPP2PPP/RNBQKB1R w KQkq - +Scotch: Romanishin variation +r1bqk1nr/pppp1ppp/2n5/8/1b2P3/2N2N2/PP3PPP/R1BQKB1R w KQkq - +Scotch: G\"oring gambit +r1bqk1nr/pppp1ppp/2n5/8/1bB1P3/2P2N2/P4PPP/RNBQK2R b KQkq - +Scotch gambit +r1bqk1nr/pppp1ppp/2n5/8/1bBpP3/5N2/PPP2PPP/RNBQK2R w KQkq - +Scotch gambit +r1bqk1nr/pppp1ppp/2n5/b3P3/2B5/2P2N2/P4PPP/RNBQK2R b KQkq - +Scotch gambit: Cochrane variation +r1bqk1nr/pppp1ppp/2n5/b3p3/2B1P3/2P2N2/P2P1PPP/RNBQ1RK1 b kq - +Evans gambit +r1bqk1nr/pppp1ppp/2n5/b3p3/2B1P3/2P2N2/P2P1PPP/RNBQK2R w KQkq - +Evans gambit +r1bqk1nr/pppp1ppp/2n5/b7/2B1P3/2p2N2/P4PPP/RNBQ1RK1 w kq - +Evans gambit: compromised defense +r1bqk1nr/pppp1ppp/2nb4/4p3/2B1P3/2P2N2/P2P1PPP/RNBQK2R w KQkq - +Evans gambit: Stone-Ware variation +r1bqk1nr/pppp1ppp/8/1Bb1p3/1P1nP3/5N2/P1PP1PPP/RNBQ1RK1 b kq - +Ruy Lopez: classical defense, Zaitsev variation +r1bqk1nr/pppp2pp/2n5/1Bb1pp2/4P3/2P2N2/PP1P1PPP/RNBQK2R w KQkq - +Ruy Lopez: Cordel gambit +r1bqk1nr/pppp2pp/2n5/1Bb2P2/4p3/5N2/PPPP1PPP/RNBQK2R w KQkq - +KGA: bishop's gambit, Paulsen attack * +r1bqk1nr/pppp2pp/2n5/2b1p1N1/2B1Pp2/3P4/PPP2PPP/RNBQK2R w KQkq - +Giuoco Pianissimo: Dubois variation +r1bqk1nr/pppp2pp/2n5/2b1pP2/8/2P2N2/PP1P1PPP/RNBQKB1R b KQkq - +KGA: bishop's gambit, Jaenisch variation * +r1bqk1nr/pppp2pp/2n5/2b1pP2/8/5N2/PPPP1PPP/RNBQKB1R w KQkq - +KGA: bishop's gambit, Bogolyubov variation * +r1bqk1nr/ppppbppp/2n5/1B2p3/4P3/5N2/PPPP1PPP/RNBQK2R w KQkq - +Ruy Lopez: Lucena defense +r1bqk1nr/ppppbppp/2n5/4p3/2B1P3/2P2N2/P2P1PPP/RNBQK2R w KQkq - +Evans gambit: 5...Be7 +r1bqk1nr/ppppbppp/2n5/4p3/2B1P3/5N2/PPPP1PPP/RNBQK2R w KQkq - +Hungarian defense +r1bqk1nr/ppppbppp/2n5/4p3/4P3/2P2N2/PP1P1PPP/RNBQKB1R w KQkq - +Ponziani: Romanishin variation +r1bqk1nr/ppppbppp/2n5/8/2BpP3/5N2/PPP2PPP/RNBQK2R w KQkq - +Scotch gambit: Benima defense +r1bqk1nr/ppppbppp/2n5/8/4P3/2P1Q3/PP3PPP/RNB1KBNR w KQkq - +Center game: Charousek variation +r1bqk1nr/ppppbppp/8/n3p3/2BPP3/2P2N2/P4PPP/RNBQK2R w KQkq - +Evans gambit: Cordel variation +r1bqk2r/1p1p1ppp/p1n1pn2/8/1bPNP3/2N5/PPB2PPP/R1BQK2R b KQkq - +Sicilian: Kan, Mar\'oczy bind - Bronstein variation +r1bqk2r/1pp1bppp/p1np1n2/4p3/B3P3/5N2/PPPP1PPP/RNBQR1K1 w kq - +Ruy Lopez: closed, Averbach variation +r1bqk2r/1pp1bppp/p5n1/3pn3/8/2N1PN2/PPP1BPPP/R1BQ1RK1 b kq - +French: Winawer, Alekhine gambit, Alatortsev variation * +r1bqk2r/1ppn1p1p/p4b1Q/1B6/8/2N2N2/PP1P1PPP/n1BK3R w kq - +Scotch: Berger variation * +r1bqk2r/1ppp1ppp/p1n2n2/2b1p3/B3P3/5N2/PPPP1PPP/RNBQ1RK1 w kq - +Ruy Lopez: M\"oller defense +r1bqk2r/1pppbppp/p1B2n2/4p3/4P3/5N2/PPPP1PPP/RNBQ1RK1 b kq - +Ruy Lopez: Exchange variation doubly deferred (DERLD) +r1bqk2r/1pppbppp/p1n2n2/4p3/B2PP3/5N2/PPP2PPP/RNBQ1RK1 b kq - +Ruy Lopez: closed, center attack +r1bqk2r/1pppbppp/p1n2n2/4p3/B3P3/5N2/PPPP1PPP/RNBQ1RK1 w kq - +Ruy Lopez: closed defense +r1bqk2r/1pppbppp/p1n2n2/4p3/B3P3/5N2/PPPPQPPP/RNB2RK1 b kq - +Ruy Lopez: Worrall attack +r1bqk2r/1pppbppp/p1n5/4P3/B2pn3/2P2N2/PP3PPP/RNBQ1RK1 b kq - +Ruy Lopez: closed, Basque gambit (North Spanish variation) +r1bqk2r/2p1bppp/p1np1n2/1p2p3/3PP3/1B3N2/PPP2PPP/RNBQR1K1 b kq - +Ruy Lopez: closed, 7...d6, 8.d4 +r1bqk2r/2p1bppp/p1np1n2/1p2p3/4P3/1B3N2/PPPPQPPP/RNB2RK1 w kq - +Ruy Lopez: Worrall attack, solid line +r1bqk2r/2pp1ppp/2n2n2/ppb1p3/4P3/PBN5/1PPP1PPP/R1BQK1NR w KQkq - +Evans gambit declined, Showalter variation * +r1bqk2r/2ppbppp/p1n2n2/1p2p3/4P3/1B3N2/PPPP1PPP/RNBQR1K1 b kq - +Ruy Lopez: closed +r1bqk2r/2ppbppp/p1n2n2/1p2p3/P3P3/1B3N2/1PPP1PPP/RNBQ1RK1 b kq - +Ruy Lopez: Wing attack +r1bqk2r/4bppp/p2p1n2/1pp5/3QP3/1B6/PPP2PPP/RNB1R1K1 w kq - +Ruy Lopez: Noah's ark trap +r1bqk2r/4nppp/p1pb4/2ppp3/2P5/1PN1P3/P2P1PPP/R1BQNRK1 b kq - +Nimzo-Indian: S\"amisch, Capablanca variation * +r1bqk2r/5ppp/p1n1pn2/1pb1P3/2B5/5N2/PP2QPPP/RNB2RK1 b kq - +QGA: classical, Furman variation +r1bqk2r/p1ppbppp/2p5/4Pn2/8/5N2/PPP1QPPP/RNB2RK1 w kq - +Ruy Lopez: Berlin defense, Cordel variation +r1bqk2r/p3nppp/2p5/2bpp3/2P5/6P1/PP2PPBP/RNBQ1RK1 b kq - +Gr\"unfeld: exchange, Spassky variation * +r1bqk2r/p3nppp/2p5/2bpp3/8/1P4P1/P1P1PPBP/RNBQ1RK1 b kq - +Gr\"unfeld: exchange, Simagin's lesser variation * +r1bqk2r/p3nppp/2p5/2bpp3/8/2N3P1/PPP1PPBP/R1BQ1RK1 b kq - +Gr\"unfeld: exchange, Simagin's improved variation * +r1bqk2r/p4ppp/2pbpn2/2pp4/2P5/2NPPN2/PP3PPP/R1BQK2R b KQkq - +Nimzo-Indian: e3, H\"ubner variation * +r1bqk2r/pnppbppp/2p5/4P3/2P5/5N2/PP2QPPP/RNB2RK1 b kq - +Ruy Lopez: Berlin defense, Zukertort variation +r1bqk2r/pnppbppp/2p5/4P3/3N4/8/PPP1QPPP/RNB2RK1 b kq - +Ruy Lopez: Berlin defense, Winawer attack +r1bqk2r/pnppbppp/2p5/4P3/8/1P3N2/P1P1QPPP/RNB2RK1 b kq - +Ruy Lopez: Berlin defense, Pillsbury variation +r1bqk2r/pp1n1ppp/2p1pn2/3p4/1bPP4/2NBPN2/PP3PPP/R1BQK2R w KQkq - +QGD semi-Slav: Romih variation +r1bqk2r/pp1n1ppp/2pbpn2/3p4/2PP4/2NBPN2/PP3PPP/R1BQK2R w KQkq - +QGD semi-Slav: Chigorin defense +r1bqk2r/pp1n1ppp/3bpn2/2pp4/2PP4/4PN2/PP1N1PPP/R1BQKB1R b KQkq - +QGD Slav: Semmering variation * +r1bqk2r/pp1n1ppp/3bpn2/2ppN3/3P1P2/2P1P3/PP4PP/RNBQKB1R b KQkq - +QGD: Stonewall variation * +r1bqk2r/pp1nbppp/2p1pn2/3p4/2PP4/2NBPN2/PP3PPP/R1BQK2R w KQkq - +QGD semi-Slav: Bogolyubov variation +r1bqk2r/pp1nnppp/3b4/3p4/3Pp3/1NN1P3/PP3PPP/R1BQKB1R b KQkq - +French: Tarrasch, Leningrad variation * +r1bqk2r/pp1nnppp/3b4/3p4/3Pp3/2N1P3/PP1N1PPP/R1BQKB1R w KQkq - +French: Tarrasch, closed variation, main line * +r1bqk2r/pp1p1ppp/2n1p3/2P5/1bP5/1QN2N2/PP1nPPPP/R3KB1R w KQkq - +Nimzo-Indian: Spielmann, Karlsbad variation +r1bqk2r/pp1p1ppp/2n1p3/2n5/1bP5/1QN2N2/PP1BPPPP/R3KB1R w KQkq - +Nimzo-Indian: Spielmann, San Remo variation +r1bqk2r/pp1p1ppp/2n1pn2/2P5/1bP5/1QN5/PP2PPPP/R1B1KBNR w KQkq - +Nimzo-Indian: Spielmann, 4...c5, 5.dc Nc6 +r1bqk2r/pp1p1ppp/2nNpn2/8/1b2P3/2N5/PPP2PPP/R1BQKB1R b KQkq - +Sicilian: Taimanov, American attack +r1bqk2r/pp1p1ppp/2nb1n2/2p1p3/8/1P2PN2/PBPP1PPP/RN1QKB1R w KQkq - +English: Queens Indian, Romanishin variation * +r1bqk2r/pp1p2pp/2n1p3/2n2p2/1bP5/2N2NP1/PPQBPP1P/R3KB1R b KQkq - +Nimzo-Indian: Spielmann, St\aa hlberg variation +r1bqk2r/pp1pnpbp/2n1p1p1/2p5/4P3/2NP2PN/PPP2PBP/R1BQK2R b KQkq - +English: closed, Taimanov variation * +r1bqk2r/pp1pnpbp/2n1p1p1/2p5/4P3/2NPB1P1/PPP2PBP/R2QK1NR b KQkq - +English: closed, Hort variation * +r1bqk2r/pp1pppbp/2n2np1/2p5/2P1P3/2N3P1/PP1P1PBP/R1BQK1NR b KQkq - +English: symmetrical, Botvinnik system reversed * +r1bqk2r/pp1pppbp/2n2np1/2p5/2P5/2N2NP1/PP1PPPBP/R1BQK2R b KQkq - +English: symmetrical variation * +r1bqk2r/pp1pppbp/2n2np1/2p5/2P5/2N2NP1/PP1PPPBP/R1BQK2R w KQkq - +English: symmetrical variation +r1bqk2r/pp1pppbp/2n2np1/2p5/2P5/2N3P1/PP1PPPBP/R1BQK1NR w KQkq - +English: symmetrical variation * +r1bqk2r/pp1pppbp/2n2np1/8/2BNP3/2N1B3/PPP2PPP/R2QK2R b KQkq - +Sicilian: accelerated fianchetto, modern variation with Bc4 +r1bqk2r/pp1pppbp/2n2np1/8/3NP3/6P1/PPP2PBP/RNBQK2R b KQkq - +English: Anglo-Gr\"unfeld defense, Korchnoi variation * +r1bqk2r/pp1pppbp/2n3p1/8/2PNP1n1/2N1B3/PP3PPP/R2QKB1R w KQkq - +Sicilian: accelerated fianchetto, Breyer variation +r1bqk2r/pp2b1pp/2n2n2/2p1pp2/2Pp4/3PPNP1/PP3PBP/RNBQ1RK1 w kq - +King's Indian: Four pawns attack * +r1bqk2r/pp2b1pp/2n2n2/2p2p2/2PPp3/3P1NP1/PP3PBP/RNBQ1RK1 w kq - +King's Indian: Four pawns attack, Florentine gambit * +r1bqk2r/pp2b1pp/2n2n2/2pppp2/2P5/3P1NP1/PP2PPBP/RNBQ1RK1 w kq - +King's Indian: Four pawns attack, with Be2 and Nf3 * +r1bqk2r/pp2b1pp/2n2n2/4pp2/2Pp4/3P1NP1/PP3PBP/RNBQR1K1 b kq - +Benoni: four pawns attack, main line * +r1bqk2r/pp2bppp/2n1p3/2pn4/8/2N2NP1/PP1PPPBP/R1BQ1RK1 w kq - +English: Symmetrical, Keres defense +r1bqk2r/pp2bppp/2n2n2/2p1p3/3pP3/3P1NP1/PPP2PBP/RNBQ1RK1 w kq - +King's Indian: Petrosian system * +r1bqk2r/pp2bppp/2n2n2/2p1p3/3pP3/3P1NP1/PPPN1PBP/R1BQ1RK1 b kq - +King's Indian: Petrosian system, main line * +r1bqk2r/pp2bppp/2n2n2/2p1p3/4p3/3P1NP1/PPP2PBP/RNBQ1RK1 w kq - +King's Indian: Andersson variation * +r1bqk2r/pp2bppp/2n2n2/2p1p3/P2pP3/3P1NP1/1PP2PBP/RNBQ1RK1 b kq - +King's Indian: Petrosian system, Stein variation * +r1bqk2r/pp2bppp/2n2n2/2pp4/3P4/2N2NP1/PP2PPBP/R1BQK2R w KQkq - +QGD: Tarrasch, Prague variation, 7...Be7 +r1bqk2r/pp2bppp/2n2n2/2ppp3/4P3/3P1NP1/PPP2PBP/RNBQ1RK1 b kq - +King's Indian: classical variation * +r1bqk2r/pp2bppp/2n2n2/2ppp3/8/3P1NP1/PPP1PPBP/RNBQ1RK1 w kq - +King's Indian: 6.Be2 * +r1bqk2r/pp2bppp/2n2n2/2ppp3/8/N2P1NP1/PPP1PPBP/R1BQ1RK1 b kq - +King's Indian: Kazakh variation * +r1bqk2r/pp2bppp/2n2n2/4p3/2Pp4/3P1NP1/PP3PBP/RNBQ1RK1 b kq - +Benoni: classical without 9.O-O * +r1bqk2r/pp2bppp/2n2n2/4p3/2Pp4/3P1NP1/PP3PBP/RNBQK2R w KQkq - +Benoni: classical without 9.O-O * +r1bqk2r/pp2bppp/2nppn2/6B1/3NP3/2N5/PPPQ1PPP/R3KB1R w KQkq - +Sicilian: Richter-Rauzer, Rauzer attack, 7...Be7 +r1bqk2r/pp2bppp/2nppn2/8/2BNP3/2N1B3/PPP1QPPP/R3K2R b KQkq - +Sicilian: Velimirovi\'c attack +r1bqk2r/pp2bppp/2nppn2/8/3NPP2/2N1BQ2/PPP3PP/R3KB1R b KQkq - +Sicilian: Scheveningen, Tal variation +r1bqk2r/pp2npbp/2n3p1/2ppp3/4P3/3P1NP1/PPP2PBP/RNBQ1RK1 w kq - +King's Indian: Pomar system * +r1bqk2r/pp2ppbp/2n2np1/2pp4/2P5/3P1NP1/PP2PPBP/RNBQ1RK1 b kq - +King's Indian: fianchetto, Yugoslav system * +r1bqk2r/pp2ppbp/2n2np1/2pp4/8/1P2PN2/PBPPBPPP/RN1QK2R w KQkq - +Queen's Indian: anti-Queen's Indian system * +r1bqk2r/pp2ppbp/2n2np1/2pp4/8/2NP1NP1/PPP1PPBP/R1BQ1RK1 b kq - +King's Indian: fianchetto with ...Nc6 * +r1bqk2r/pp2ppbp/2n2np1/2pp4/8/3P1NP1/PPPNPPBP/R1BQ1RK1 b kq - +King's Indian: fianchetto with ...Nd7 * +r1bqk2r/pp2ppbp/2n2np1/3p2B1/2PP4/2N2N2/PP3PPP/R2QKB1R b KQkq - +QGD: Tarrasch, Wagner variation * +r1bqk2r/pp2ppbp/2n2np1/3p4/2PP4/2N2N2/PP2BPPP/R1BQK2R b KQkq - +QGD: Tarrasch, Prague variation, 7...Be7 * +r1bqk2r/pp2ppbp/2n2np1/8/2Pp4/3P1NP1/PP3PBP/RNBQ1RK1 b kq - +Benoni: fianchetto variation * +r1bqk2r/pp2ppbp/2np1np1/8/3NP3/2N1B3/PPP1BPPP/R2Q1RK1 b kq - +Sicilian: dragon, classical, 8.O-O +r1bqk2r/pp2ppbp/2np1np1/8/3NP3/2N1B3/PPPQBPPP/R3K2R b KQkq - +Sicilian: dragon, classical, Amsterdam variation +r1bqk2r/pp2ppbp/2np1np1/8/4P3/1NN1B3/PPP1BPPP/R2QK2R b KQkq - +Sicilian: dragon, classical, Nottingham variation +r1bqk2r/pp2ppbp/2np2pn/8/2P1P3/8/PPN1BPPP/RNBQK2R w KQkq - +Sicilian: accelerated fianchetto, Simagin variation +r1bqk2r/pp3ppp/2n1pn2/2bp4/1P6/2P1PN2/P2N1PPP/R1BQKB1R b KQkq - +QGD semi-Slav: Meran variation * +r1bqk2r/pp3ppp/2n1pn2/2bp4/8/2P1PN2/PP1N1PPP/R1BQKB1R w KQkq - +QGD semi-Slav: 7.Bc4 * +r1bqk2r/pp3ppp/2n2n2/1Bb1p3/8/2N2N2/PPPP1PPP/R1BQK2R b KQkq - +Scotch: G\"oring gambit, Bardeleben variation * +r1bqk2r/pp3ppp/2n2n2/1Bbpp3/8/2N2N2/PPPP1PPP/R1BQK2R w KQkq - +Giuoco Piano: Greco's attack * +r1bqk2r/pp3ppp/2nb1n2/1P1pp3/8/P1P1PN2/3N1PPP/R1BQKB1R b KQkq - +QGD semi-Slav: Meran, Pir\'c variation * +r1bqk2r/pp3ppp/2nb1n2/3p4/1PP1p3/P3PN2/3N1PPP/R1BQKB1R w KQkq - +QGD semi-Slav: Meran, old main line * +r1bqk2r/pp3ppp/2nb1n2/3pp3/1PP5/P3PN2/3N1PPP/R1BQKB1R b KQkq - +QGD semi-Slav: Meran * +r1bqk2r/pp3ppp/2nb1n2/4p3/1PPp4/P3PN2/3N1PPP/R1BQKB1R w KQkq - +QGD semi-Slav: Meran, Reynolds' variation * +r1bqk2r/pp3ppp/2nbpn2/1Bpp4/2PP4/4PN2/PP3PPP/RNBQ1RK1 b kq - +Nimzo-Indian: 4.e3, main line with ...c5 * +r1bqk2r/pp3ppp/2nbpn2/1Bpp4/3P4/1P2PN2/P1P2PPP/RNBQ1RK1 b kq - +Nimzo-Indian: 4.e3, main line with ...b6 * +r1bqk2r/pp3ppp/2nbpn2/1Bpp4/3P4/2P1PN2/PP1N1PPP/R1BQK2R b KQkq - +QGD semi-Slav: Romih variation * +r1bqk2r/pp3ppp/2nbpn2/1P1p4/8/2P1PN2/P2N1PPP/R1BQKB1R b KQkq - +QGD semi-Slav: neo-Meran (Lundin variation) * +r1bqk2r/pp3ppp/2nbpn2/2pp4/3P4/2P1PN2/PP1N1PPP/R1BQKB1R w KQkq - +QGD semi-Slav: 6.Bd3 * +r1bqk2r/pp3ppp/2nbpn2/2pp4/3P4/2P1PN2/PP1NBPPP/R1BQK2R b KQkq - +QGD semi-Slav: Bogolyubov variation * +r1bqk2r/pp3ppp/2nbpn2/2pp4/3P4/2PBPN2/PP1N1PPP/R1BQK2R b KQkq - +QGD semi-Slav: Chigorin defense * +r1bqk2r/pp3ppp/2nbpn2/2pp4/3P4/5NP1/PPP1PPBP/RNBQ1RK1 w kq - +Gr\"unfeld with e3 & Bd3 * +r1bqk2r/pp3ppp/2nbpn2/2ppN3/3P1P2/2P1P3/PP4PP/RNBQKB1R b KQkq - +QGD semi-Slav: stonewall defense * +r1bqk2r/pp3ppp/2nbpn2/3p4/1P6/2P1PN2/PB1N1PPP/R2QKB1R b KQkq - +QGD semi-Slav: Meran, Wade variation * +r1bqk2r/pp3ppp/2nbpn2/3p4/1P6/P1P1PN2/3N1PPP/R1BQKB1R b KQkq - +QGD semi-Slav: Meran, 8...a6 * +r1bqk2r/pp3ppp/2nbpn2/3p4/2PN4/2N1P3/PP3PPP/R1BQKB1R w KQkq - +QGD: Semi-Tarrasch, 7.Bd3 * +r1bqk2r/pp3ppp/2nppn2/2p5/2PP4/2PBPN2/P4PPP/R1BQK2R w KQkq - +Nimzo-Indian: e3, H\"ubner variation +r1bqk2r/pp3ppp/3b1n2/3P2N1/1n2p3/P3P3/3N1PPP/R1BQKB1R b KQkq - +QGD semi-Slav: Meran, Rabinovich variation * +r1bqk2r/pp3ppp/3b1n2/3P4/1n2N3/P3PN2/5PPP/R1BQKB1R b KQkq - +QGD semi-Slav: Meran, Sozin variation * +r1bqk2r/pp3ppp/3b1n2/3P4/1n2p3/P3PN2/3N1PPP/R1BQKB1R w KQkq - +QGD semi-Slav: Meran, Blumenfeld variation * +r1bqk2r/ppb2ppp/2n5/1Bpnp3/8/P1N1PN2/1P1P1PPP/R1BQK2R w KQkq - +Sicilian: Kan, Mar\'oczy bind - Bronstein variation * +r1bqk2r/ppp1bpp1/5n1p/3P4/2P1p3/5N2/PPP1QPPP/RNB1K2R w KQkq - +two knights defense: Mar\'oczy variation +r1bqk2r/ppp1bppp/1nn5/4p3/4P3/2NP1N2/PP3PPP/R1BQKB1R w KQkq - +Sicilian: Boleslavsky variation, 7.Nb3 * +r1bqk2r/ppp1bppp/2n2n2/3pp3/8/3P1NP1/PPP1PPBP/RNBQK2R w KQkq - +Pirc: classical system, 5.Be2 * +r1bqk2r/ppp1bppp/2n5/1B1pp3/3Pn3/5N2/PPP1QPPP/RNB2RK1 w kq - +Ruy Lopez: Berlin defense, Trifunovi\'c variation +r1bqk2r/ppp1bppp/2n5/3np3/4P3/2NP1N2/PP3PPP/R1BQKB1R b KQkq - +Sicilian: Boleslavsky variation * +r1bqk2r/ppp1bppp/2n5/3np3/8/2NP1N2/PP2PPPP/R1BQKB1R w KQkq - +Sicilian: classical * +r1bqk2r/ppp1bppp/2n5/3np3/8/2NPPN2/PP3PPP/R1BQKB1R b KQkq - +Sicilian: modern Scheveningen * +r1bqk2r/ppp1bppp/2n5/3np3/8/3PPN2/PP3PPP/RNBQKB1R w KQkq - +Sicilian: Scheveningen, 6.Be2 * +r1bqk2r/ppp1bppp/2n5/3np3/8/P2P1N2/1P2PPPP/RNBQKB1R w KQkq - +Sicilian: Najdorf, Opo\v censky variation * +r1bqk2r/ppp1bppp/2n5/3np3/8/P2PPN2/1P3PPP/RNBQKB1R b KQkq - +Sicilian: Scheveningen (Paulsen), classical variation * +r1bqk2r/ppp1bppp/2n5/3p4/2PPn3/3B1N2/PP3PPP/RNBQ1RK1 b kq - +Petrov: classical attack, Jaenisch variation +r1bqk2r/ppp1bppp/2n5/3p4/3Pn3/3B1N2/PPP2PPP/RNBQR1K1 b kq - +Petrov: classical attack, Chigorin variation +r1bqk2r/ppp1bppp/2n5/4p3/4P3/2nP1N2/PP3PPP/R1BQKB1R w KQkq - +Sicilian: Boleslavsky, Louma variation * +r1bqk2r/ppp1npbp/2np2p1/4p3/2P1P3/2NP2P1/PP3PBP/R1BQK1NR b KQkq - +Sicilian: closed, 6.Ne2 e5 (Botvinnik) * +r1bqk2r/ppp1nppp/1b1p4/n2P4/2B1P3/5N2/PB3PPP/RN1Q1RK1 w kq - +Evans gambit: Paulsen variation +r1bqk2r/ppp1nppp/3p1b2/3P4/2B1R1P1/5N2/PP3P1P/R1BQ2K1 b kq - +Giuoco Piano: M\"oller, bayonet attack +r1bqk2r/ppp2pbp/2np2pn/4p3/2P5/2N1P1P1/PP1PNPBP/R1BQK2R w KQkq - +English: closed, Taimanov variation +r1bqk2r/ppp2pp1/5n1p/2bP4/2P1p3/8/PPPNQPPP/RNB1K2R b KQkq - +two knights defense: Yankovich variation +r1bqk2r/ppp2ppp/1bn5/3np3/1P6/P2PPN2/5PPP/RNBQKB1R b KQkq - +Sicilian: Sozin with ...a6 and ...b5 * +r1bqk2r/ppp2ppp/2n1pn2/3p4/2PP4/P1Q5/1P2PPPP/R1B1KBNR w KQkq - +Nimzo-Indian: classical, Botvinnik variation +r1bqk2r/ppp2ppp/2n2n2/2bpP3/2Bp4/2P2N2/PP3PPP/RNBQK2R w KQkq d6 +Giuoco Piano +r1bqk2r/ppp2ppp/2n2n2/2bpp3/4P3/2PP4/PP1N1PPP/R1BQKBNR w KQkq - +Philidor: Hanham, Schlechter variation * +r1bqk2r/ppp2ppp/2n2n2/3pp3/4P3/2bP1N2/PPPB1PPP/R2QKB1R w KQkq - +Ruy Lopez: old Steinitz defense, Nimzovich attack * +r1bqk2r/ppp2ppp/2n5/1B1pP3/1b1Pn3/5N2/PP3PPP/RNBQK2R w KQkq - +Giuoco Piano: Anderssen variation +r1bqk2r/ppp2ppp/2n5/2b5/4p3/2PP1NP1/P3PP1P/R1BQKB1R w KQkq - +Sicilian: Magnus Smith trap * +r1bqk2r/ppp2ppp/2n5/2bnp3/8/1QNP1N2/PP2PPPP/R1B1KB1R b KQkq - +Sicilian: Sozin, Benk\"o variation * +r1bqk2r/ppp2ppp/2n5/2bnp3/8/2NP1N2/PP2PPPP/R1BQKB1R w KQkq - +Sicilian: Sozin, not Scheveningen * +r1bqk2r/ppp2ppp/2n5/2bnp3/8/2NPPN2/PP3PPP/R1BQKB1R b KQkq - +Sicilian: Sozin, Leonhardt variation * +r1bqk2r/ppp2ppp/2n5/2bnp3/8/3PPN2/PP3PPP/RNBQKB1R w KQkq - +Sicilian: Sozin attack * +r1bqk2r/ppp2ppp/2n5/2bnp3/8/P2P1N2/1P2PPPP/RNBQKB1R w KQkq - +Sicilian: Najdorf, Lipnitzky attack * +r1bqk2r/ppp2ppp/2n5/3np1N1/1bBP4/8/PPP2PPP/RNBQK2R w KQkq - +two knights defense: Pincus variation +r1bqk2r/ppp2ppp/2n5/3np3/1b2P3/3P1N2/PP3PPP/RNBQKB1R w KQkq - +Sicilian: Venice attack * +r1bqk2r/ppp2ppp/2n5/3np3/1b6/3PPN2/PP3PPP/RNBQKB1R w KQkq - +Sicilian: Scheveningen, Vitoli\'n\'s variation * +r1bqk2r/ppp2ppp/2n5/3p4/2BP4/1Qb2N2/P4PPP/R1B2RK1 w kq - +Giuoco Piano: Bernstein variation +r1bqk2r/ppp2ppp/2n5/3p4/2BPn3/B1P2N2/P4PPP/R2Q1RK1 b kq - +Giuoco Piano: Steinitz variation +r1bqk2r/ppp2ppp/2n5/3pp3/2PPn3/P3P3/1PQ2PPP/R1B1KBNR w KQkq - +Nimzo-Indian: classical, San Remo variation +r1bqk2r/ppp2ppp/2n5/3pp3/4P1n1/3P1N2/PPPNBbPP/R1BQ1RK1 w kq - +Philidor: Nimzovich, L\"arobok variation * +r1bqk2r/ppp2ppp/2nb4/1B1np3/4P3/5N2/PP1P1PPP/RNBQK2R b KQkq - +Sicilian: Pin, Jaffe variation * +r1bqk2r/ppp2ppp/2np1n2/2b1p1B1/2B1P3/2NP1N2/PPP2PPP/R2QK2R b KQkq - +Giuoco Pianissimo: Canal variation +r1bqk2r/ppp2ppp/2np1n2/2b1p3/2B1P3/2N2N2/PPPP1PPP/R1BQK2R w KQkq - +Giuoco Pianissimo: Italian four knights variation * +r1bqk2r/ppp2ppp/2np1n2/4p3/4P3/P1P2P2/1PP3PP/R1BQKBNR w KQkq - +Ruy Lopez: exchange, Romanovsky variation * +r1bqk2r/ppp2ppp/2nppn2/8/1bPP4/2N2N2/PPQ1PPPP/R1B1KB1R w KQkq - +Nimzo-Indian: classical, Milner-Barry (Zurich) variation +r1bqk2r/ppp2ppp/3p1n2/4p1B1/2BnP3/8/PPP2PPP/RN1Q1RK1 w kq - +Giuoco piano +r1bqk2r/ppp3p1/2n5/2bppPPp/4n2P/7B/PPPP1P1R/RNBQK1N1 w Qkq - +KGA: Kieseritsky, long whip defense, Jaenisch variation * +r1bqk2r/ppp3pp/2nb1n2/3ppp2/8/3P1NP1/PPP1PPBP/RNBQ1RK1 w kq - +Pirc: Austrian attack, 6.Bd3 * +r1bqk2r/pppn1ppp/4pn2/3p2B1/1bPP4/2N1P3/PP3PPP/R2QKBNR w KQkq - +QGD: Manhattan variation +r1bqk2r/pppn1ppp/5n2/2bP4/8/4P3/PP3PPP/RNBQKBNR b KQkq - +French: Tarrasch, Eliskases variation * +r1bqk2r/pppnbppp/3p1n2/4p3/3P4/2N1PN2/PPP2PPP/R1BQKB1R w KQkq - +French: Reversed Philidor formation * +r1bqk2r/pppnbppp/3p1n2/4p3/3PP3/2N2N2/PPP2PPP/R1BQKB1R w KQkq - +Inverted Hanham * +r1bqk2r/pppp1p2/5n1p/4p1p1/2BnPP1B/8/PPP3PP/RN1Q1RK1 b kq - +Giuoco piano: Rosentreter variation +r1bqk2r/pppp1pbp/2n3pn/4p3/2P5/2N3P1/PP1PPPBP/1RBQK1NR w Kkq - +English: closed, 5.Rb1 Taimanov variation +r1bqk2r/pppp1pp1/5n1p/4n3/2PN3B/2P5/P3PPPP/R2QKB1R w KQkq - +English: Nenarokov variation +r1bqk2r/pppp1ppp/1b5n/nP2N3/2B1P3/8/P1PP1PPP/RNBQK2R w KQkq - +Evans gambit declined, Lange variation +r1bqk2r/pppp1ppp/2n1pn2/8/1bPP4/2N1P3/PP3PPP/R1BQKBNR w KQkq - +Nimzo-Indian: 4.e3, Taimanov variation +r1bqk2r/pppp1ppp/2n1pn2/8/1bPP4/2N5/PPQ1PPPP/R1B1KBNR w KQkq - +Nimzo-Indian: classical, 4...Nc6 +r1bqk2r/pppp1ppp/2n2n2/1B2p3/1b2P3/2N2N2/PPPP1PPP/R1BQK2R b KQkq - +Four knights: double Ruy Lopez * +r1bqk2r/pppp1ppp/2n2n2/1B2p3/1b2P3/2N2N2/PPPP1PPP/R1BQK2R w KQkq - +Four knights: double Ruy Lopez +r1bqk2r/pppp1ppp/2n2n2/1Bb1p3/4P3/2N2N2/PPPP1PPP/R1BQK2R w KQkq - +Four knights: Spanish, classical defense +r1bqk2r/pppp1ppp/2n2n2/1Bb1p3/4P3/3PBN2/PPP2PPP/RN1QK2R b KQkq - +Ruy Lopez: Berlin defense, Kaufmann variation +r1bqk2r/pppp1ppp/2n2n2/1Bb1p3/4P3/5N2/PPPP1PPP/RNBQ1RK1 w kq - +Ruy Lopez: Berlin defense, Beverwijk variation +r1bqk2r/pppp1ppp/2n2n2/2b1N3/3PP3/8/PPP2PPP/RNBQKB1R b KQkq - +Boden-Kieseritsky gambit: Lichtenhein defense * +r1bqk2r/pppp1ppp/2n2n2/2b1N3/4P3/8/PPPP1PPP/RNBQKB1R w KQkq - +Boden-Kieseritsky gambit * +r1bqk2r/pppp1ppp/2n2n2/2b1P3/2Bp4/5N2/PPP2PPP/RNBQ1RK1 b kq - +two knights: Max Lange attack +r1bqk2r/pppp1ppp/2n2n2/2b1p1N1/2B1P3/8/PPPP1PPP/RNBQK2R w KQkq - +two knights defense: Wilkes Barre (Traxler) variation +r1bqk2r/pppp1ppp/2n2n2/2b1p3/1PB1P3/2P2N2/P2P1PPP/RNBQK2R b KQkq - +Giuoco Piano: Bird's attack +r1bqk2r/pppp1ppp/2n2n2/2b1p3/2B1P3/2N2N2/PPPP1PPP/R1BQK2R b KQkq - +Giuoco Piano: four knights variation * +r1bqk2r/pppp1ppp/2n2n2/2b1p3/2B1P3/2N2N2/PPPP1PPP/R1BQK2R w KQkq - +Giuoco Piano: four knights variation +r1bqk2r/pppp1ppp/2n2n2/2b1p3/2B1P3/2NP1N2/PPP2PPP/R1BQK2R b KQkq - +Giuoco Pianissimo: Italian four knights variation +r1bqk2r/pppp1ppp/2n2n2/2b1p3/2B1P3/2P2N2/PP1P1PPP/RNBQK2R w KQkq - +Giuoco Piano +r1bqk2r/pppp1ppp/2n2n2/2b1p3/2B1P3/3P1N2/PPP2PPP/RNBQK2R w KQkq - +Giuoco Pianissimo +r1bqk2r/pppp1ppp/2n2n2/2b1p3/2B1PP2/2P5/PP1PQ1PP/RNB1K1NR b KQkq - +Bishop's opening: Lopez gambit +r1bqk2r/pppp1ppp/2n2n2/2b1p3/2BPP3/2P2N2/PP3PPP/RNBQK2R b KQkq - +Giuoco Piano +r1bqk2r/pppp1ppp/2n2n2/2b1p3/4P3/2N2N2/PPPP1PPP/R1BQKB1R w KQkq - +Four knights: Italian variation * +r1bqk2r/pppp1ppp/2n2n2/2b5/2BPP3/5N2/PP3PPP/RNBQK2R b KQkq - +Giuoco Piano +r1bqk2r/pppp1ppp/2n2n2/3Np3/1b2P3/5N2/PPPP1PPP/R1BQKB1R b KQkq - +Four knights: Rubinstein counter-gambit * +r1bqk2r/pppp1ppp/2n2n2/3Np3/1b2P3/5N2/PPPP1PPP/R1BQKB1R w KQkq - +Three knights: Schlechter variation +r1bqk2r/pppp1ppp/2n2n2/4N3/1b1PP3/2N5/PPP2PPP/R1BQKB1R b KQkq - +Four knights: Scotch, Krause variation +r1bqk2r/pppp1ppp/2n2n2/4p3/1b2P3/2N2N2/PPPP1PPP/R1BQKB1R w KQkq - +Four knights: Spanish variation * +r1bqk2r/pppp1ppp/2n2n2/4p3/1b2P3/2N3P1/PPPPNP1P/R1BQKB1R b KQkq - +Ruy Lopez: Cozio defense, Paulsen variation * +r1bqk2r/pppp1ppp/2n2n2/4p3/1b2PP2/2N5/PPPP2PP/R1BQKBNR w KQkq - +Ruy Lopez: Schliemann defense, Berger variation * +r1bqk2r/pppp1ppp/2n2n2/4p3/1bB1P3/2N2N2/PPPP1PPP/R1BQK2R b KQkq - +Four knights: Spanish, classical defense * +r1bqk2r/pppp1ppp/2n2n2/4p3/2P5/2b1PN2/PPQP1PPP/R1B1KB1R w KQkq - +English: four knights, Romanishin variation +r1bqk2r/pppp1ppp/2n2n2/4p3/4P3/P1P5/1PP2PPP/R1BQKBNR w KQkq - +Ruy Lopez: exchange, Keres variation * +r1bqk2r/pppp1ppp/2n2n2/4p3/4P3/P1b2N2/1PPP1PPP/R1BQKB1R w KQkq - +Four knights: Ranken variation * +r1bqk2r/pppp1ppp/2n2n2/8/1bB1P3/2N2N2/PP3PPP/R1BQK2R w KQkq - +Scotch: G\"oring gambit, Bardeleben variation +r1bqk2r/pppp1ppp/2n2n2/8/1bBPP3/2N2N2/PP3PPP/R1BQK2R b KQkq - +Giuoco Piano: Greco's attack +r1bqk2r/pppp1ppp/2n2n2/8/1bBPP3/5N2/PP3PPP/RNBQ1K1R b kq - +Giuoco Piano: Cracow variation +r1bqk2r/pppp1ppp/2n2n2/b3p3/4P3/P1N2N2/1PPP1PPP/R1BQKB1R w KQkq - +Ruy Lopez: four knights (Tarrasch) variation * +r1bqk2r/pppp1ppp/2n2n2/b3p3/4P3/P1NP4/1PP2PPP/R1BQKBNR w KQkq - +Ruy Lopez: modern Steinitz defense, Three knights variation * +r1bqk2r/pppp1ppp/2n4n/2b3NQ/2BpP3/8/PPP2PPP/RNB1K2R b KQkq - +Scotch gambit: Vitzhum attack +r1bqk2r/pppp1ppp/2n5/2b1P3/2Bp2n1/2P2N2/PP3PPP/RNBQ1RK1 b kq - +two knights: Max Lange attack, Krause variation +r1bqk2r/pppp1ppp/2n5/2b1P3/2Bp2n1/5N2/PPP2PPP/RNBQ1RK1 w kq - +two knights: Max Lange attack, Steinitz variation +r1bqk2r/pppp1ppp/2n5/2bBP3/8/2p2NK1/PP4PP/RNBQ3R b kq - +Giuoco Piano: Ghulam Kassim variation +r1bqk2r/pppp1ppp/2n5/2bPp3/4n3/2P2N2/PP3PPP/RNBQKB1R w KQkq - +Ponziani: Fraser defense +r1bqk2r/pppp1ppp/2n5/3P4/2B1n3/2b2N2/PP3PPP/R1BQ1RK1 b kq - +Giuoco Piano: M\"oller (Therkatz) attack +r1bqk2r/pppp1ppp/2n5/3np3/1b2P3/5N2/PPPP1PPP/R1BQKB1R w KQkq - +Four knights: Rubinstein counter-gambit, exchange variation * +r1bqk2r/pppp1ppp/2n5/8/1bBP4/2n2N2/PP3PPP/R1BQ1RK1 w kq - +Giuoco Piano: Greco variation +r1bqk2r/pppp1ppp/2n5/8/2BP4/B1b2N2/P4PPP/R2Q1RK1 b kq - +Giuoco Piano: Aitken variation +r1bqk2r/pppp1ppp/2n5/8/2BPn3/2b2N2/PP3PPP/R1BQ1RK1 w kq - +Giuoco Piano +r1bqk2r/pppp2pp/2n2n2/1Bb1pQ2/4P3/8/PPPP1PPP/RNB1K1NR w KQkq - +KGD: Norwalde variation, B\"ucker gambit * +r1bqk2r/pppp2pp/2n2n2/2b1p3/2P2p2/2N1P1P1/PP1P1PBP/R1BQK1NR w KQkq - +Sicilian: Grand Prix attack, Schofman variation * +r1bqk2r/pppp2pp/2n2n2/2b1pPP1/8/8/PPPP1P1P/RNBQKBNR w KQkq - +KGA: MacDonnell gambit * +r1bqk2r/pppp2pp/2n5/3Npp2/1b2n3/5N2/PPPPQPPP/R1B1KB1R w KQkq - +Four knights: Rubinstein counter-gambit, Bogolyubov variation * +r1bqk2r/ppppbppp/2n2n2/3Np3/4P3/5N2/PPPP1PPP/R1BQKB1R w KQkq - +Four knights: Rubinstein counter-gambit, 5.Be2 * +r1bqk2r/ppppbppp/2n5/1B2P3/4n3/5N2/PPP2PPP/RNBQ1RK1 b kq - +Ruy Lopez: Berlin defense, Minckwitz variation +r1bqk2r/ppppbppp/2n5/1B2p3/3Pn3/5N2/PPP2PPP/RNBQ1RK1 w kq - +Ruy Lopez: open Berlin defense, 5...Be7 +r1bqk2r/ppppbppp/2n5/4P3/2Bpn3/2P2N2/PP3PPP/RNBQK2R w KQkq - +Hungarian defense: Tartakower variation +r1bqk2r/ppppbppp/2nn4/4N2Q/8/1BN5/PPPP1PPP/R1B1K2R b KQkq - +Vienna: Alekhine variation +r1bqk3/ppp3p1/2n5/2bppP2/4n1P1/2PP4/PP3P2/RNBQK1NB w KQq - +KGA: Greco gambit * +r1bqkb1r/1p1n1ppp/p2ppn2/8/3NP3/2N5/PPP1BPPP/R1BQ1RK1 w kq - +Sicilian: Scheveningen, classical, Nd7 system +r1bqkb1r/1p1ppppp/p1n2n2/2p5/4P3/2N2N2/PPPP1PPP/R1BQKB1R w KQkq - +English: four knights, Marini variation * +r1bqkb1r/1p2nppp/p1n1p3/2pp4/3P4/3BPN2/PPP2PPP/RNBQ1RK1 b kq - +Nimzo-Indian: Simagin variation * +r1bqkb1r/1p2pp1p/2n3p1/p1np4/4PB2/2P2N2/PPQN1PPP/R3KB1R b KQkq - +QGD Slav: Carlsbad variation * +r1bqkb1r/1p2pppp/2n2n2/p1Pp2B1/8/2P2N2/PP2PPPP/RN1QKB1R b KQkq - +QGD Slav: Steiner variation * +r1bqkb1r/1p2pppp/2n2n2/p1Pp4/5B2/2P2N2/PP2PPPP/RN1QKB1R b KQkq - +QGD Slav: Czech defense * +r1bqkb1r/1p2pppp/2n2n2/p1Pp4/8/2P1PN2/PP3PPP/RNBQKB1R b KQkq - +QGD Slav: Soultanb\'eieff variation * +r1bqkb1r/1p2pppp/2n2n2/p1Pp4/8/2P2N2/PP2PPPP/RNBQKB1R w KQkq - +QGD Slav accepted: Alapin variation * +r1bqkb1r/1p2pppp/2n5/p1Pp4/4nB2/2P1PN2/PP3PPP/RN1QKB1R b KQkq - +QGD Slav: Wiesbaden variation * +r1bqkb1r/1p2pppp/2n5/p1Pp4/4nB2/2P2N2/PP2PPPP/RN1QKB1R w KQkq - +QGD Slav: Krause attack * +r1bqkb1r/1p3ppp/2n1pn2/p1Pp4/5B2/2P2N2/PP2PPPP/RN1QKB1R w KQkq - +QGD Slav: Dutch variation * +r1bqkb1r/1p3ppp/2n1pn2/p1Pp4/5B2/N1P2N2/PP2PPPP/R2QKB1R b KQkq - +QGD Slav: Dutch, Lasker variation * +r1bqkb1r/1p3ppp/2n2n2/p1Ppp1B1/8/N1P2N2/PP2PPPP/R2QKB1R b KQkq - +QGD Slav: Smyslov variation * +r1bqkb1r/1p3ppp/p1n1pn2/3p4/2P1P3/N1N5/PP3PPP/R1BQKB1R w KQkq - +Sicilian, Sz\'en variation, Dely-Kasparov gambit +r1bqkb1r/1p3ppp/p1nppn2/6B1/3NP3/2N5/PPPQ1PPP/R3KB1R w KQkq - +Sicilian: Richter-Rauzer, Rauzer attack, 7...a6 +r1bqkb1r/1pp1nppp/p1B5/3pP3/8/4P3/PPP2PPP/RNBQK1NR b KQkq - +French: Winawer, Alekhine gambit * +r1bqkb1r/1pp2ppp/2P2n2/1p6/3Pp3/4P3/PP3PPP/RNBQK1NR w KQkq - +French: Winawer, advance, Rauzer variation * +r1bqkb1r/1pp2ppp/p1n5/3pP3/8/2N1P3/PPP2PPP/R1BQK1NR b KQkq - +French: Winawer, Alekhine gambit, Kan variation * +r1bqkb1r/1pp2ppp/p1np1n2/4p3/B1P1P3/3P1N2/PP3PPP/RNBQK2R b KQkq - +Ruy Lopez: Morphy defense, Duras variation +r1bqkb1r/1pp2ppp/p1np1n2/4p3/B3P3/5N2/PPPP1PPP/RNBQ1RK1 w kq - +Ruy Lopez: Steinitz defense deferred (Russian defense) +r1bqkb1r/1ppn1ppp/p3pn2/8/3P4/6P1/PPQ1PPBP/RNB1K1NR b KQkq - +Catalan: open, Alekhine variation +r1bqkb1r/1ppp1ppp/p1B2n2/4p3/4P3/2N2N2/PPPP1PPP/R1BQK2R b KQkq - +Four knights: Ranken variation +r1bqkb1r/1ppp1ppp/p1B2n2/4p3/4P3/5N2/PPPP1PPP/RNBQK2R b KQkq - +Ruy Lopez: Treybal (Bayreuth) variation (exchange var. deferred) +r1bqkb1r/1ppp1ppp/p1n2n2/4p3/4P3/2N2N2/PPPP1PPP/R1BQKB1R w KQkq - +Four knights: Gunsberg variation * +r1bqkb1r/1ppp1ppp/p1n2n2/4p3/B3P3/2N2N2/PPPP1PPP/R1BQK2R b KQkq - +Ruy Lopez: four knights (Tarrasch) variation +r1bqkb1r/1ppp1ppp/p1n2n2/4p3/B3P3/3P1N2/PPP2PPP/RNBQK2R b KQkq - +Ruy Lopez: Anderssen variation +r1bqkb1r/1ppp1ppp/p1n2n2/4p3/B3P3/5N2/PPPP1PPP/RNBQ1RK1 b kq - +Ruy Lopez: 5.O-O +r1bqkb1r/1ppp1ppp/p1n2n2/4p3/B3P3/5N2/PPPP1PPP/RNBQK2R w KQkq - +Ruy Lopez: Morphy defense +r1bqkb1r/1ppp1ppp/p1n2n2/4p3/B3P3/5N2/PPPPQPPP/RNB1K2R b KQkq - +Ruy Lopez: Wormald (Alapin) attack +r1bqkb1r/1ppp1ppp/p1n5/1B2p3/3Pn3/5N2/PPP2PPP/RNBQ1RK1 w kq - +Ruy Lopez: Berlin defense, Rosenthal variation +r1bqkb1r/1ppp1ppp/p1n5/4p3/B2Pn3/5N2/PPP2PPP/RNBQ1RK1 b kq - +Ruy Lopez: open, 6.d4 +r1bqkb1r/1ppp1ppp/p1n5/4p3/B3n3/2N2N2/PPPP1PPP/R1BQ1RK1 b kq - +Ruy Lopez: open, Knorre variation +r1bqkb1r/1ppp1ppp/p1n5/4p3/B3n3/5N2/PPPP1PPP/RNBQ1RK1 w kq - +Ruy Lopez: open (Tarrasch) defense +r1bqkb1r/1ppp1ppp/p1n5/4p3/B3n3/5N2/PPPPQPPP/RNB2RK1 b kq - +Ruy Lopez: open, Tartakower variation +r1bqkb1r/1ppp1ppp/p1n5/8/B2pn3/5N2/PPP2PPP/RNBQ1RK1 w kq - +Ruy Lopez: open, Riga variation +r1bqkb1r/1pppnppp/p1n5/4p3/B3P3/5N2/PPPP1PPP/RNBQK2R w KQkq - +Ruy Lopez: Cozio defense deferred +r1bqkb1r/2p1nppp/p7/1p1pP3/4n3/1B3N2/PPP2PPP/RNBQ1RK1 w kq - +Ruy Lopez: open, Zukertort variation +r1bqkb1r/2p2ppp/p1n5/1p1pP3/4n3/1B3N2/PPP2PPP/RNBQ1RK1 b kq - +Ruy Lopez: open, 8.de +r1bqkb1r/2p2ppp/p1n5/1p1pp3/2PPn3/1B3N2/PP3PPP/RNBQ1RK1 b kq - +Ruy Lopez: open, Harksen gambit +r1bqkb1r/2p2ppp/p1np1n2/1p2p3/4P3/1B3N2/PPPP1PPP/RNBQ1RK1 w kq - +Ruy Lopez: ...b5 & ...d6 +r1bqkb1r/2p2ppp/p1p2n2/3p4/2PPp3/4P3/PP2NPPP/RNBQK2R w KQkq - +French: Winawer, advance, positional main line * +r1bqkb1r/2p2ppp/p1pp4/4p3/3Pn3/5N2/PPP2PPP/RNBQ1RK1 w kq - +Ruy Lopez: Steinitz defense deferred, Rubinstein variation +r1bqkb1r/2p2ppp/p7/1p1p4/P2pn3/1BN5/1PP2PPP/R1BQ1RK1 b kq - +Ruy Lopez: open, Berger variation +r1bqkb1r/2p2ppp/p7/1p1pp3/P2nn3/1B3N2/1PP2PPP/RNBQ1RK1 w kq - +Ruy Lopez: open, Schlechter defense +r1bqkb1r/2p3pp/p1p5/3pPp2/4n3/2N2N2/PPP2PPP/R1BQR1K1 b kq - +Ruy Lopez: Steinitz defense deferred, Boleslavsky variation +r1bqkb1r/2pp1ppp/p1n5/1p1Pp3/B3n3/5N2/PPP2PPP/RNBQ1RK1 b kq - +Ruy Lopez: open, Richter variation +r1bqkb1r/2pp1ppp/p1n5/1p2N3/B2Pn3/8/PPP2PPP/RNBQ1RK1 b kq - +Ruy Lopez: open, Friess attack +r1bqkb1r/2pp1ppp/p1n5/1p2p3/3Pn3/1B3N2/PPP2PPP/RNBQ1RK1 b kq - +Ruy Lopez: open, 7.Bb3 +r1bqkb1r/2pp1ppp/p1n5/1p2p3/B2Pn3/5N2/PPP2PPP/RNBQ1RK1 w kq - +Ruy Lopez: open, 6.d4 b5 +r1bqkb1r/3n1ppp/p1p1pn2/1p6/3P4/2NBPN2/PP3PPP/R1BQK2R w KQkq - +QGD semi-Slav: Meran, 8...a6 +r1bqkb1r/3n1ppp/p1p1pn2/8/1p1PP3/2NB1N2/PP3PPP/R1BQK2R w KQkq - +QGD semi-Slav: Meran, Pir\'c variation +r1bqkb1r/3n1ppp/p3p3/1N2P3/3p2n1/3B1N2/PP3PPP/R1BQK2R w KQkq - +QGD semi-Slav: Meran, Rabinovich variation +r1bqkb1r/3n1ppp/p3pn2/1N2P3/3p4/3B1N2/PP3PPP/R1BQK2R b KQkq - +QGD semi-Slav: Meran, Blumenfeld variation +r1bqkb1r/3n1ppp/p3pn2/1pp1P3/3P4/2NB1N2/PP3PPP/R1BQK2R b KQkq - +QGD semi-Slav: Meran, old main line +r1bqkb1r/3n1ppp/p3pn2/1pp5/3PP3/2NB1N2/PP3PPP/R1BQK2R w KQkq - +QGD semi-Slav: Meran +r1bqkb1r/3n1ppp/p3pn2/1ppP4/4P3/2NB1N2/PP3PPP/R1BQK2R b KQkq - +QGD semi-Slav: Meran, Reynolds' variation +r1bqkb1r/5p1p/p1np4/1p1Npp2/4P3/N7/PPP2PPP/R2QKB1R w KQkq - +Sicilian: Sveshnikov variation +r1bqkb1r/5ppp/4pn2/1p2N3/3p4/3B1Q2/PP3PPP/R1B1K2R b KQkq - +QGD semi-Slav: Meran, Stahlberg variation +r1bqkb1r/5ppp/4pn2/1p2N3/3p4/3B4/PP3PPP/R1BQ1RK1 b kq - +QGD semi-Slav: Meran, Sozin variation +r1bqkb1r/5ppp/p1np1n2/1p2p1B1/4P3/N1N5/PPP2PPP/R2QKB1R w KQkq - +Sicilian: Pelikan, Chelyabinsk variation +r1bqkb1r/5ppp/p3pn2/1N2n3/3p4/3B1N2/PP3PPP/R1BQK2R w KQkq - +QGD semi-Slav: Meran, Sozin variation +r1bqkb1r/p1p2ppp/2n2n2/1p1Pp1N1/2B5/8/PPPP1PPP/RNBQK2R w KQkq - +two knights defense: Ulvestad variation +r1bqkb1r/p1p2ppp/8/1p1np3/3nN3/2P5/PP1P1PPP/RNBQKB1R b KQkq - +two knights defense: Fritz, Gruber variation +r1bqkb1r/p1pn1ppp/1p2pn2/3p4/2PP4/4PN2/PP3PPP/RNBQKB1R w KQkq - +Queen's pawn game, Zukertort variation * +r1bqkb1r/p1pp1ppp/2p2n2/4P3/8/8/PPP2PPP/RNBQKB1R b KQkq - +Scotch: Mieses variation +r1bqkb1r/p1pp1ppp/2p2n2/8/4P3/8/PPPN1PPP/R1BQKB1R b KQkq - +Scotch: Tartakower variation +r1bqkb1r/p2n1p2/2p1pn2/1p2P1B1/2pP4/2N2Q2/PP3PPP/R3KB1R b KQkq - +QGD semi-Slav: anti-Meran, Szab\'o variation +r1bqkb1r/p2n1p2/2p1pn2/1p2P1B1/2pP4/2N3P1/PP3P1P/R2QKB1R b KQkq - +QGD semi-Slav: anti-Meran, Lilienthal variation +r1bqkb1r/p2n1ppp/2p1pn2/1p6/2BP4/2N1PN2/PP3PPP/R1BQK2R w KQkq - +QGD semi-Slav: Meran variation +r1bqkb1r/p2n1ppp/2p1pn2/8/1p1P4/2NBPN2/PP3PPP/R1BQK2R w KQkq - +QGD semi-Slav: neo-Meran (Lundin variation) +r1bqkb1r/p3pp1p/2pp1np1/4P3/2B5/2N5/PPP2PPP/R1BQK2R b KQkq - +Sicilian: Magnus Smith trap +r1bqkb1r/p4pp1/2p2n1p/n3p1N1/8/8/PPPPBPPP/RNBQK2R w KQkq - +Two knights defense +r1bqkb1r/p4pp1/2p2n1p/n3p3/8/7N/PPPPBPPP/RNBQK2R b KQkq - +two knights defense: Steinitz variation +r1bqkb1r/p4ppp/2n1pn2/1ppp4/3P4/5NP1/PPP1PPBP/RNBQ1RK1 w kq - +Gr\"unfeld: Makogonov variation * +r1bqkb1r/p4ppp/2p2n2/3pp3/8/6P1/PPP1PPBP/RNBQK2R w KQkq - +Gr\"unfeld: modern exchange variation * +r1bqkb1r/p4ppp/2p2n2/n3p1N1/8/8/PPPPBPPP/RNBQK2R b KQkq - +Two knights defense +r1bqkb1r/p4ppp/2p2n2/nB2p1N1/8/5Q2/PPPP1PPP/RNB1K2R b KQkq - +two knights defense: Bogolyubov variation +r1bqkb1r/p4ppp/5n2/np2p1N1/8/5Q2/PPPP1PPP/RNB1K2R w KQkq - +two knights defense: Blackburne variation +r1bqkb1r/pp1n1ppp/2n1p3/2PpP3/5P2/2N5/PPP3PP/R1BQKBNR w KQkq - +French: Steinitz variation +r1bqkb1r/pp1n1ppp/2n1p3/2ppP3/3P1P2/2N1BN2/PPP3PP/R2QKB1R b KQkq - +French: Steinitz, Boleslavsky variation +r1bqkb1r/pp1n1ppp/2n1p3/2ppP3/3P4/2PB4/PP1N1PPP/R1BQK1NR w KQkq - +French: Tarrasch, closed variation +r1bqkb1r/pp1n1ppp/2n1p3/3pP3/3P4/3B4/PP1NNPPP/R1BQK2R b KQkq - +French: Tarrasch, closed variation, main line +r1bqkb1r/pp1n1ppp/2p1pn2/3p2B1/2PP4/2N1P3/PP3PPP/R2QKBNR w KQkq - +QGD: 5...c6 +r1bqkb1r/pp1n1ppp/2p1pn2/3p2B1/2PP4/2N1PN2/PP3PPP/R2QKB1R b KQkq - +QGD +r1bqkb1r/pp1n1ppp/2p1pn2/3p2B1/2PP4/4PN2/PP1N1PPP/R2QKB1R b KQkq - +QGD: Capablanca variation +r1bqkb1r/pp1n1ppp/2p1pn2/3p2B1/2PP4/P1N1P3/1P3PPP/R2QKBNR b KQkq - +QGD: Capablanca anti-Cambridge Springs variation +r1bqkb1r/pp1n1ppp/2p1pn2/3p2B1/2PPP3/2N2N2/PP3PPP/R2QKB1R b KQkq - +QGD: Alekhine variation +r1bqkb1r/pp1n1ppp/2p1pn2/3p4/2PP4/2N1PN2/PP3PPP/R1BQKB1R w KQkq - +QGD semi-Slav: 5...Nd7 +r1bqkb1r/pp1n1ppp/2p1pn2/3p4/2PP4/2N1PN2/PPQ2PPP/R1B1KB1R b KQkq - +QGD semi-Slav: Stoltz variation +r1bqkb1r/pp1n1ppp/2p1pn2/3p4/2PP4/2NBPN2/PP3PPP/R1BQK2R b KQkq - +QGD semi-Slav: 6.Bd3 +r1bqkb1r/pp1n1ppp/2p1pn2/3p4/2PP4/4PN2/PP1N1PPP/R1BQKB1R w KQkq - +QGD Slav +r1bqkb1r/pp1n1ppp/2p1pn2/3pN3/2PP4/2N1P3/PP3PPP/R1BQKB1R b KQkq - +QGD semi-Slav: Rubinstein (anti-Meran) system +r1bqkb1r/pp1n1ppp/2p1pn2/8/2BP4/2N1PN2/PP3PPP/R1BQK2R b KQkq - +QGD semi-Slav: 7.Bc4 +r1bqkb1r/pp1n1ppp/4pn2/2pp4/2PP4/3BPN2/PP1N1PPP/R1BQK2R w KQkq - +QGD Slav: Semmering variation +r1bqkb1r/pp1n1ppp/4pn2/2pp4/3P4/2P1PN2/PP1N1PPP/R1BQKB1R b KQkq - +QGD Slav * +r1bqkb1r/pp1n1ppp/4pn2/2pp4/3P4/2P1PN2/PP3PPP/RNBQKB1R w KQkq - +QGD Slav * +r1bqkb1r/pp1n1ppp/4pn2/2pp4/3P4/2P1PNP1/PP3P1P/RNBQKB1R b KQkq - +QGD: Spielmann variation * +r1bqkb1r/pp1npp1p/3p1np1/8/3NPP2/2N5/PPP3PP/R1BQKB1R w KQkq - +Sicilian: dragon, Levenfish; Flohr variation +r1bqkb1r/pp1npppp/2n5/8/2Pp4/3P1NP1/PP3P1P/RNBQKB1R w KQkq - +Benoni: Nimzovich (knight's tour) variation * +r1bqkb1r/pp1npppp/2n5/8/2Pp4/B2P1NP1/4PP1P/RN1QKB1R w KQkq - +Benk\"o gambit: Nd2 variation * +r1bqkb1r/pp1npppp/5n2/1Bpp4/8/4PN2/PPPP1PPP/RNBQK2R w KQkq - +Bogo-Indian defense, Gr\"unfeld variation * +r1bqkb1r/pp1npppp/5n2/2pP4/4p3/2N2P2/PPP3PP/R1BQKBNR b KQkq - +QGD: Albin counter-gambit, Janowski variation * +r1bqkb1r/pp1npppp/5n2/2pP4/4p3/2N5/PPP1QPPP/R1B1KBNR b KQkq - +QGD: Albin counter-gambit, Balogh variation * +r1bqkb1r/pp1npppp/5n2/2pP4/4p3/2N5/PPP2PPP/R1BQKBNR w KQkq - +QGD: Albin counter-gambit, Alapin variation * +r1bqkb1r/pp1npppp/5n2/2pp4/3P4/2P2N2/PP2PPPP/RNBQKB1R w KQkq - +QGD Slav: Breyer variation * +r1bqkb1r/pp1p1Npp/2p1nn2/8/2B1P3/8/PPP2PPP/RNBQ1RK1 b kq - +Scotch: Cochrane variation +r1bqkb1r/pp1p1ppp/2n1pn2/2p5/4P3/2N2N2/PPPP1PPP/R1BQKB1R w KQkq - +English: four knights, 4.e3 * +r1bqkb1r/pp1p1ppp/2n1pn2/8/2PN4/2N5/PP2PPPP/R1BQKB1R w KQkq - +English: symmetrical variation +r1bqkb1r/pp1p1ppp/2n2n2/2p1p3/4P3/2N2N2/PPPP1PPP/R1BQKB1R w KQkq - +English: four knights, Nimzovich variation * +r1bqkb1r/pp1p1ppp/2n2n2/4p3/3NP3/2N5/PPP2PPP/R1BQKB1R w KQkq - +Sicilian: Pelikan (Lasker/Sveshnikov) variation +r1bqkb1r/pp1p1ppp/2n5/2ppP3/3P4/5N2/PPP2PPP/R1BQKB1R w KQkq - +Sicilian: Nimzovich-Rubinstein; Rubinstein counter-gambit +r1bqkb1r/pp1p1ppp/n1p2n2/8/2PNp3/2N5/PP1PPPPP/R1BQKB1R w KQkq - +Sicilian: 2.c3, Heidenfeld variation * +r1bqkb1r/pp1pnppp/2p2n2/1B2N3/4P3/3P4/PPP2PPP/RNBQK2R w KQkq - +Ruy Lopez: Berlin defense, Mortimer trap +r1bqkb1r/pp1ppp1p/2n2np1/2p5/4P3/2N2N2/PPPP1PPP/R1BQKB1R w KQkq - +English: four knights, kingside fianchetto * +r1bqkb1r/pp1ppppp/2n2n2/1Bp5/8/4PN2/PPPP1PPP/RNBQK2R b KQkq - +English: Nimzo-English opening * +r1bqkb1r/pp1ppppp/2n2n2/2p3B1/4P3/3P4/PPP2PPP/RN1QKBNR b KQkq - +English, Smyslov defense * +r1bqkb1r/pp1ppppp/2n2n2/2p5/2P5/2N2N2/PP1PPPPP/R1BQKB1R b KQkq - +English: symmetrical, four knights system * +r1bqkb1r/pp1ppppp/2n2n2/2p5/2P5/2N2N2/PP1PPPPP/R1BQKB1R w KQkq - +English: symmetrical, four knights system +r1bqkb1r/pp1ppppp/2n2n2/2p5/4P3/2N2N2/PPPP1PPP/R1BQKB1R b KQkq - +English: four knights system * +r1bqkb1r/pp1ppppp/2n2n2/2p5/4P3/2N5/PPPP1PPP/R1BQKBNR w KQkq - +English: three knights system * +r1bqkb1r/pp1ppppp/2n2n2/2p5/4P3/3P4/PPP2PPP/RNBQKBNR w KQkq - +English opening * +r1bqkb1r/pp1ppppp/2n2n2/2p5/8/1P2PN2/P1PP1PPP/RNBQKB1R b KQkq - +English: Queens Indian formation * +r1bqkb1r/pp1ppppp/2n2n2/8/2PN4/8/PP2PPPP/RNBQKB1R b KQkq - +English: symmetrical, three knights system * +r1bqkb1r/pp1ppppp/2n2n2/8/3N4/8/PPP1PPPP/RNBQKB1R w KQkq - +English: Anglo-Gr\"unfeld defense * +r1bqkb1r/pp1ppppp/2n2n2/8/3NP3/8/PPP2PPP/RNBQKB1R w KQkq - +Sicilian defense +r1bqkb1r/pp1ppppp/2n5/2p1P3/1P4n1/5N2/P1PP1PPP/RNBQKB1R b KQkq - +English: Bellon gambit * +r1bqkb1r/pp1ppppp/2n5/2pnP3/8/N1P2N2/PP1P1PPP/R1BQKB1R b KQkq - +Sicilian: 2.c3, Heidenfeld variation +r1bqkb1r/pp2nppp/2n1p3/1Bpp4/2P5/4PN2/PP1P1PPP/RNBQK2R w KQkq - +Nimzo-Indian: 4.e3 c5, 5.Ne2 (Rubinstein, anti-H\"ubner system) * +r1bqkb1r/pp2nppp/2n1p3/1Bpp4/8/1P2PN2/P1PP1PPP/RNBQK2R w KQkq - +Nimzo-Indian: Fischer variation, 5.Ne2 * +r1bqkb1r/pp2nppp/2n1p3/1Bpp4/8/4PN2/PPPP1PPP/RNBQ1RK1 w kq - +Nimzo-Indian: Reshevsky variation * +r1bqkb1r/pp2nppp/2n1p3/1Bpp4/8/BP2PN2/P1PP1PPP/RN1QK2R b KQkq - +Nimzo-Indian: 4.e3, Bronstein (Byrne) variation * +r1bqkb1r/pp2nppp/2n5/2ppp3/8/3P1NP1/PPP1PPBP/RNBQK2R w KQkq - +King's Indian: Kramer system * +r1bqkb1r/pp2pp1p/2n2np1/2Pp4/3P4/2N5/PP3PPP/R1BQKBNR b KQkq - +QGD: Tarrasch, Folkestone (Swedish) variation * +r1bqkb1r/pp2pp1p/2n2np1/2pp4/8/3P1NP1/PPP1PPBP/RNBQK2R w KQkq - +King's Indian: fianchetto variation * +r1bqkb1r/pp2pp1p/2n2np1/3p4/2PP4/2N2N2/PP3PPP/R1BQKB1R b KQkq - +QGD: Tarrasch, Prague variation * +r1bqkb1r/pp2pp1p/2n2np1/3p4/2PP4/2N5/PP3PPP/R1BQKBNR w KQkq - +QGD: Tarrasch, Schlechter-Rubinstein system * +r1bqkb1r/pp2pp1p/2n2np1/8/2Pp4/3P1NP1/PP3P1P/RNBQKB1R w KQkq - +Benoni: fianchetto variation * +r1bqkb1r/pp2pp1p/2n2np1/8/2Pp4/B2P1NP1/4PP1P/RN1QKB1R w KQkq - +Benk\"o gambit: fianchetto variation * +r1bqkb1r/pp2pp1p/2n3p1/2pn4/8/1QN1PN2/PP1P1PPP/R1B1KB1R b KQkq - +English: symmetrical, Geller variation * +r1bqkb1r/pp2pp1p/2np1np1/6B1/3NP3/2N5/PPP2PPP/R2QKB1R w KQkq - +Sicilian: Richter-Rauzer, Bondarevsky variation +r1bqkb1r/pp2pp1p/3p1np1/8/2PQP3/2N5/PP3PPP/R1B1KB1R w KQkq - +Sicilian: accelerated fianchetto, Gurgenidze variation +r1bqkb1r/pp2pppp/2n2n2/1Bp1N3/2Pp4/4P3/PP1P1PPP/RNBQK2R b KQkq - +Nimzo-Indian: three knights, Euwe variation * +r1bqkb1r/pp2pppp/2n2n2/1Bp5/2Pp4/4PN2/PP1P1PPP/RNBQK2R w KQkq - +Nimzo-Indian: three knights, Korchnoi variation * +r1bqkb1r/pp2pppp/2n2n2/1Bpp4/3P4/4PN2/PPP2PPP/RNBQK2R b KQkq - +QGD: Ragozin variation * +r1bqkb1r/pp2pppp/2n2n2/1Bpp4/8/4PN2/PPPP1PPP/RNBQK2R w KQkq - +Nimzo-Indian: three knights variation * +r1bqkb1r/pp2pppp/2n2n2/2Pp4/8/2N5/PPP1PPPP/R1BQKBNR w KQkq - +QGD: Chigorin defense, Janowski variation * +r1bqkb1r/pp2pppp/2n2n2/2Pp4/8/2P1P3/PP3PPP/RNBQKBNR b KQkq - +QGD: semi-Slav, Noteboom variation * +r1bqkb1r/pp2pppp/2n2n2/2Pp4/8/2P2N2/PP2PPPP/RNBQKB1R b KQkq - +QGD Slav accepted * +r1bqkb1r/pp2pppp/2n2n2/2Pp4/8/5N2/PPP1PPPP/RNBQKB1R w KQkq - +QGA, 4.Nc3 * +r1bqkb1r/pp2pppp/2n2n2/2pp4/2PP4/4PN2/PP3PPP/RNBQKB1R b KQkq - +QGD: Semi-Tarrasch defense * +r1bqkb1r/pp2pppp/2n2n2/2pp4/3P4/1QP2N2/PP2PPPP/RNB1KB1R b KQkq - +QGD Slav: S\"uchting variation * +r1bqkb1r/pp2pppp/2n2n2/2pp4/3P4/2P1PN2/PP3PPP/RNBQKB1R b KQkq - +QGD semi-Slav * +r1bqkb1r/pp2pppp/2n2n2/2pp4/3P4/2P2N2/PP2PPPP/RNBQKB1R w KQkq - +QGD Slav: 4.Nc3 * +r1bqkb1r/pp2pppp/2n2n2/2pp4/3P4/2P2NP1/PP2PP1P/RNBQKB1R b KQkq - +QGD Slav\Gr\"unfeld: Schlechter variation * +r1bqkb1r/pp2pppp/2n2n2/2pp4/3P4/4PN2/PPP2PPP/RNBQKB1R w KQkq - +QGD: 4.Nf3 * +r1bqkb1r/pp2pppp/2n2n2/2pp4/3P4/5NP1/PPP1PP1P/RNBQKB1R w KQkq - +Gr\"unfeld: Three knights variation * +r1bqkb1r/pp2pppp/2n2n2/2pp4/3P4/5NP1/PPP1PPBP/RNBQK2R b KQkq - +Gr\"unfeld: Three knights variation * +r1bqkb1r/pp2pppp/2n2n2/2pp4/4P3/3P1N2/PPP2PPP/RNBQKB1R w KQkq - +Old Indian: Ukrainian variation, 4.Nf3 * +r1bqkb1r/pp2pppp/2n2n2/2pp4/8/1P2PN2/P1PP1PPP/RNBQKB1R w KQkq - +Queen's Indian: 4.Nc3 * +r1bqkb1r/pp2pppp/2n2n2/2ppP3/8/2N2N2/PPPP1PPP/R1BQKB1R b KQkq - +English: Bradley Beach variation * +r1bqkb1r/pp2pppp/2n2n2/3p4/2PP4/8/PP3PPP/RNBQKBNR w KQkq - +QGD: Tarrasch defense * +r1bqkb1r/pp2pppp/2n2n2/3p4/2Pp4/4PN2/PP3PPP/RNBQKB1R w KQkq - +QGD: Semi-Tarrasch, 5.cd * +r1bqkb1r/pp2pppp/2n2n2/3p4/3P1B2/2PB4/PP3PPP/RN1QK1NR b KQkq - +Caro-Kann: exchange, Rubinstein variation +r1bqkb1r/pp2pppp/2n2n2/8/2Pp4/3P1NP1/PP3P1P/RNBQKB1R b KQkq - +Benoni defense * +r1bqkb1r/pp2pppp/2n5/2pn4/8/2N1PN2/PP1P1PPP/R1BQKB1R b KQkq - +English: symmetrical variation * +r1bqkb1r/pp2pppp/2np1n2/2p5/4P3/2N2N2/PPPP1PPP/R1BQKB1R w KQkq - +English: four knights, Capablanca variation * +r1bqkb1r/pp2pppp/2np1n2/6B1/3NP3/2N5/PPP2PPP/R2QKB1R b KQkq - +Sicilian: Richter-Rauzer +r1bqkb1r/pp2pppp/2np1n2/8/2BNP3/2N5/PPP2PPP/R1BQK2R b KQkq - +Sicilian: Sozin, not Scheveningen +r1bqkb1r/pp2pppp/2np1n2/8/3NP3/2N5/PPP1BPPP/R1BQK2R b KQkq - +Sicilian: classical +r1bqkb1r/pp2pppp/2np1n2/8/3NP3/2N5/PPP2PPP/R1BQKB1R w KQkq - +Sicilian +r1bqkb1r/pp2pppp/5n2/n2P2B1/2p5/2N5/PP3PPP/R2QKBNR w KQkq - +Caro-Kann: Panov-Botvinnik, Herzog defense +r1bqkb1r/pp3p1p/2n2np1/2Ppp3/3P4/2N5/PP3PPP/R1BQKBNR w KQkq - +QGD: Tarrasch, Schlechter-Rubinstein system, Rey Ardid variation * +r1bqkb1r/pp3ppp/1nn1p3/3pP3/3P4/3B4/PP1NNPPP/R1BQK2R w KQkq - +French: Tarrasch, Leningrad variation +r1bqkb1r/pp3ppp/2Np1n2/4p3/4P3/2N5/PPP1BPPP/R1BQK2R b KQkq - +Sicilian: Boleslavsky, Louma variation +r1bqkb1r/pp3ppp/2Nppn2/6B1/4P3/2N5/PPP2PPP/R2QKB1R b KQkq - +Sicilian: Richter-Rauzer, Richter attack +r1bqkb1r/pp3ppp/2n1p3/2pn4/3P4/2NBPN2/PP3PPP/R1BQK2R b KQkq - +QGD: Semi-Tarrasch, 7.Bd3 +r1bqkb1r/pp3ppp/2n1p3/2pp4/3Pn3/2P1PN2/PP1N1PPP/R1BQKB1R w KQkq - +QGD semi-Slav: Rubinstein (anti-Meran) system * +r1bqkb1r/pp3ppp/2n1p3/3p4/3PnB2/4P3/PP1N1PPP/RN1QKB1R b KQkq - +QGD Slav: Amsterdam variation * +r1bqkb1r/pp3ppp/2n1pn2/1Bpp4/3P4/4PN2/PPP2PPP/RNBQ1RK1 b kq - +Nimzo-Indian: 4.e3 e8g8, 5.Nf3 d7d5 * +r1bqkb1r/pp3ppp/2n1pn2/1Bpp4/8/4PN2/PPPP1PPP/RNBQ1RK1 w kq - +Nimzo-Indian: 4.e3 e8g8, 5.Nf3, without ...d5 * +r1bqkb1r/pp3ppp/2n1pn2/2Pp4/8/2P2N2/PP2PPPP/RNBQKB1R w KQkq - +QGD Slav: 5.e3 (Alekhine variation) * +r1bqkb1r/pp3ppp/2n1pn2/2pp4/3P4/2P1PN2/PP1N1PPP/R1BQKB1R b KQkq - +QGD semi-Slav: 5...Nd7 * +r1bqkb1r/pp3ppp/2n1pn2/2pp4/3P4/2P1PN2/PP3PPP/RNBQKB1R w KQkq - +QGD semi-Slav: 5.e3 * +r1bqkb1r/pp3ppp/2n1pn2/2pp4/3P4/5NP1/PPP1PPBP/RNBQK2R w KQkq - +Gr\"unfeld: 5.e3 * +r1bqkb1r/pp3ppp/2n1pn2/2pp4/3P4/P1P1PN2/1P3PPP/RNBQKB1R b KQkq - +QGD semi-Slav: accelerated Meran (Alekhine variation) * +r1bqkb1r/pp3ppp/2n1pn2/3p2B1/2PP4/2N5/PP3PPP/R2QKBNR w KQkq - +Caro-Kann: Panov-Botvinnik, normal variation +r1bqkb1r/pp3ppp/2n1pn2/3p4/2PN4/4P3/PP3PPP/RNBQKB1R w KQkq - +QGD: Semi-Tarrasch with e3 * +r1bqkb1r/pp3ppp/2n1pn2/3p4/3P1B2/5N2/PP2PPPP/RN1QKB1R w KQkq - +QGD Slav: exchange variation * +r1bqkb1r/pp3ppp/2n2n2/1B2p3/8/2N5/PPPP1PPP/R1BQK1NR b KQkq - +Scotch: G\"oring gambit * +r1bqkb1r/pp3ppp/2n2n2/2Pp4/1P2p3/2P2N2/P3PPPP/RNBQKB1R w KQkq - +QGD Slav: Tolush-Geller gambit * +r1bqkb1r/pp3ppp/2n2n2/2Ppp3/8/2P2N2/PP2PPPP/RNBQKB1R w KQkq - +QGD Slav: Slav gambit * +r1bqkb1r/pp3ppp/2n2n2/2Ppp3/8/P4N2/1PP1PPPP/RNBQKB1R w KQkq - +QGA, Bogolyubov variation * +r1bqkb1r/pp3ppp/2n2n2/2pp4/3P4/2N2NP1/PP2PP1P/R1BQKB1R w KQkq - +QGD: Tarrasch, Prague variation +r1bqkb1r/pp3ppp/2n2n2/2ppp3/4P3/3P1N2/PPPN1PPP/R1BQKB1R w KQkq - +Old Indian: main line * +r1bqkb1r/pp3ppp/2n2n2/2ppp3/8/3P1NP1/PPP1PPBP/RNBQK2R w KQkq - +King's Indian: 5.Nf3 * +r1bqkb1r/pp3ppp/2n2n2/2ppp3/Q1P5/3P2P1/PP2PPBP/RNB1K1NR b KQkq - +Pterodactyl defense * +r1bqkb1r/pp3ppp/2n2n2/4p3/2Pp4/3P1NP1/PP3P1P/RNBQKB1R w KQkq - +Benoni: classical with e4 and Nf3 * +r1bqkb1r/pp3ppp/2np1n2/4p3/3NP3/2N5/PPP1BPPP/R1BQK2R w KQkq - +Sicilian: Boleslavsky variation +r1bqkb1r/pp3ppp/2np1n2/4p3/4P3/1NN5/PPP1BPPP/R1BQK2R b KQkq - +Sicilian: Boleslavsky variation, 7.Nb3 +r1bqkb1r/pp3ppp/2nppn2/1B4B1/3NP3/2N5/PPP2PPP/R2QK2R b KQkq - +Sicilian: Richter-Rauzer, Margate (Alekhine) variation +r1bqkb1r/pp3ppp/2nppn2/6B1/3NP3/2N5/PPP2PPP/R2QKB1R w KQkq - +Sicilian: Richter-Rauzer, 6...e6 +r1bqkb1r/pp3ppp/2nppn2/6B1/3NP3/2N5/PPPQ1PPP/R3KB1R b KQkq - +Sicilian: Richter-Rauzer, Rauzer attack +r1bqkb1r/pp3ppp/2nppn2/6B1/3NP3/2NQ4/PPP2PPP/R3KB1R b KQkq - +Sicilian: Richter-Rauzer, Keres variation +r1bqkb1r/pp3ppp/2nppn2/6B1/4P3/1NN5/PPP2PPP/R2QKB1R b KQkq - +Sicilian: Richter-Rauzer, Pod\v ebrady variation +r1bqkb1r/pp3ppp/2nppn2/8/2BNP3/2N1B3/PPP2PPP/R2QK2R b KQkq - +Sicilian: Sozin, 7.Be3 +r1bqkb1r/pp3ppp/2nppn2/8/2BNP3/2N5/PPP2PPP/R1BQK2R w KQkq - +Sicilian: Sozin, Leonhardt variation +r1bqkb1r/pp3ppp/2nppn2/8/3NP3/2N5/PPP1BPPP/R1BQK2R w KQkq - +Sicilian: modern Scheveningen +r1bqkb1r/pp3ppp/n1n5/2p1p3/3P4/P1N1PN2/1P3PPP/R1BQKB1R b KQkq - +Sicilian, Sz\'en variation, Dely-Kasparov gambit * +r1bqkb1r/pp4pp/2n2n2/2p1pp2/2Pp4/3P1NP1/PP2PPBP/RNBQ1RK1 w kq - +King's Indian: Four pawns attack, dynamic line * +r1bqkb1r/pp4pp/2n2n2/4pp2/2Pp4/3P1NP1/PP3PBP/RNBQ1RK1 b kq - +Benoni: four pawns attack * +r1bqkb1r/ppp1nppp/2n5/1B1pp3/3P4/4P3/PPP2PPP/RNBQK1NR w KQkq - +French: Winawer, Alekhine (Mar\'oczy) gambit * +r1bqkb1r/ppp1pppp/1nn5/4P3/2PP4/4B3/PP4PP/RN1QKBNR b KQkq - +Alekhine's defense: four pawns attack, 7.Be3 +r1bqkb1r/ppp1pppp/1nn5/4P3/2PP4/8/PP4PP/RNBQKBNR w KQkq - +Alekhine's defense: four pawns attack, 6...Nc6 +r1bqkb1r/ppp2Npp/2n5/3np3/2B5/8/PPPP1PPP/RNBQK2R b KQkq - +two knights defense: Fegatello attack +r1bqkb1r/ppp2p1p/2n3p1/3np3/8/3PPN2/PP3PPP/RNBQKB1R w KQkq - +Sicilian: Scheveningen, fianchetto variation * +r1bqkb1r/ppp2p1p/2n3p1/3np3/8/P2P1N2/1P2PPPP/RNBQKB1R w KQkq - +Sicilian: Najdorf, Zagreb (fianchetto) variation * +r1bqkb1r/ppp2p1p/2n5/3np1p1/8/3PPN2/PP3PPP/RNBQKB1R w KQkq - +Sicilian: Scheveningen, Keres attack * +r1bqkb1r/ppp2p1p/2n5/3p2p1/Q3nB2/2P2N2/PP2PPPP/RN2KB1R w KQkq - +Scandinavian defense, Gr\"unfeld variation * +r1bqkb1r/ppp2pp1/2n2n1p/3p2B1/Q7/5N2/PPP1PPPP/RN2KB1R w KQkq - +Scandinavian defense, Lasker variation * +r1bqkb1r/ppp2pp1/2n2n1p/3pp3/8/3P1NP1/PPP1PPBP/RNBQK2R w KQkq - +Pirc: classical, h3 system * +r1bqkb1r/ppp2pp1/2n4p/3np3/8/P2P1N2/1P2PPPP/RNBQKB1R w KQkq - +Sicilian: Najdorf, Adams attack * +r1bqkb1r/ppp2pp1/5nn1/3p3p/8/2P3BP/PP1NPPP1/R2QKBNR b KQkq - +Caro-Kann: classical, 7...Nd7 * +r1bqkb1r/ppp2pp1/5nn1/3p4/7p/2P3BP/PP1NPPP1/R2QKBNR w KQkq - +Caro-Kann: classical, Spassky variation * +r1bqkb1r/ppp2ppp/2Bp1n2/4p3/4P3/3P1N2/PPP2PPP/RNBQK2R b KQkq - +Ruy Lopez: Berlin defense, Anderssen variation +r1bqkb1r/ppp2ppp/2n1pn2/3p4/3PP3/5N2/PPPN1PPP/R1BQKB1R w KQkq - +French: Tarrasch, Guimard main line +r1bqkb1r/ppp2ppp/2n1pn2/3p4/4P3/3P1N2/PPPNBPPP/R1BQK2R b KQkq - +French: Reversed Philidor formation +r1bqkb1r/ppp2ppp/2n2n2/3Pp3/8/2N2N2/PPPP1PPP/R1BQKB1R b KQkq - +Four knights: Scotch, 4...exd4 * +r1bqkb1r/ppp2ppp/2n2n2/3p2B1/3P4/2N5/PPP2PPP/R2QKBNR w KQkq - +French: exchange, Bogolyubov variation +r1bqkb1r/ppp2ppp/2n2n2/3p2B1/Q3P3/8/PPP2PPP/RN2KBNR b KQkq - +Scandinavian: Anderssen counter-attack, Collijn variation * +r1bqkb1r/ppp2ppp/2n2n2/3p4/Q3P3/8/PPP2PPP/RNB1KBNR w KQkq - +Scandinavian: Anderssen counter-attack, Goteborg system * +r1bqkb1r/ppp2ppp/2n2n2/3p4/Q4B2/5N2/PPP1PPPP/RN2KB1R b KQkq - +Scandinavian defense * +r1bqkb1r/ppp2ppp/2n2n2/3pp3/4P3/2N2N2/PPPP1PPP/R1BQKB1R w KQkq - +Four knights: Scotch variation * +r1bqkb1r/ppp2ppp/2n2n2/3pp3/4P3/3P1N2/PPPN1PPP/R1BQKB1R b KQkq - +Philidor: Improved Hanham variation * +r1bqkb1r/ppp2ppp/2n2n2/3pp3/4P3/3P1N2/PPPNBPPP/R1BQK2R b KQkq - +Inverted Hanham +r1bqkb1r/ppp2ppp/2n2n2/3pp3/4PP2/3P4/PPP3PP/RNBQKBNR w KQkq - +Philidor: Philidor counter-gambit, Zukertort variation * +r1bqkb1r/ppp2ppp/2n2n2/3pp3/8/2PP2P1/PP2PPBP/RNBQK1NR b KQkq - +Robatsch defense: two knights, Suttles variation * +r1bqkb1r/ppp2ppp/2n2n2/3pp3/8/3P1NP1/PPP1PP1P/RNBQKB1R w KQkq - +Pirc: classical (two knights) system * +r1bqkb1r/ppp2ppp/2n2n2/3pp3/8/3P1NP1/PPP1PPBP/RNBQK2R b KQkq - +Pirc: classical (two knights) system * +r1bqkb1r/ppp2ppp/2n2n2/3pp3/8/3P2P1/PPP1PPBP/RNBQK1NR w KQkq - +Robatsch defense: two knights variation * +r1bqkb1r/ppp2ppp/2n2n2/3pp3/Q3P3/2P2N2/PP1P1PPP/RNB1KB1R w KQkq - +Ponziani: Leonhardt variation +r1bqkb1r/ppp2ppp/2n5/1B1n4/4p3/4PN2/PP1P1PPP/RNBQK2R w KQkq - +Sicilian: Pin, Koch variation * +r1bqkb1r/ppp2ppp/2n5/1B1np3/8/4PN2/PP1P1PPP/RNBQK2R b KQkq - +Sicilian: Pin variation (Sicilian counter-attack) * +r1bqkb1r/ppp2ppp/2n5/1B1pp3/4n3/2N2N2/PPPP1PPP/R1BQK2R w KQkq - +Four knights: Scotch, Krause variation * +r1bqkb1r/ppp2ppp/2n5/1B2p3/8/2NnPN2/PP1P1PPP/R1BQK2R w KQkq - +Sicilian: Taimanov, American attack * +r1bqkb1r/ppp2ppp/2n5/3np1N1/2BP4/8/PPP2PPP/RNBQK2R b KQkq - +two knights defense: Lolli attack +r1bqkb1r/ppp2ppp/2n5/3np2Q/8/2N5/PPPP1PPP/R1B1KBNR w KQkq - +Scotch: Steinitz variation * +r1bqkb1r/ppp2ppp/2n5/3np3/4P3/2N2N2/PP1P1PPP/R1BQKB1R b KQkq - +Sicilian: Pelikan (Lasker/Sveshnikov) variation * +r1bqkb1r/ppp2ppp/2n5/3np3/8/2N1P3/PP1P1PPP/R1BQKBNR w KQkq - +Sicilian: Taimanov variation * +r1bqkb1r/ppp2ppp/2n5/3np3/8/2N1P3/PPQP1PPP/R1B1KBNR b KQkq - +Sicilian: Taimanov (Bastrikov) variation * +r1bqkb1r/ppp2ppp/2n5/3np3/8/2N3P1/PP1PPP1P/R1BQKBNR w KQkq - +Sicilian: accelerated fianchetto, modern variation * +r1bqkb1r/ppp2ppp/2n5/3np3/8/2NP1N2/PP2PPPP/R1BQKB1R b KQkq - +Sicilian * +r1bqkb1r/ppp2ppp/2n5/3np3/8/3P1N2/PP2PPPP/RNBQKB1R w KQkq - +Sicilian * +r1bqkb1r/ppp2ppp/2n5/3np3/8/3P1NP1/PP2PP1P/RNBQKB1R b KQkq - +Sicilian: dragon variation * +r1bqkb1r/ppp2ppp/2n5/3np3/8/3PPN2/PP3PPP/RNBQKB1R b KQkq - +Sicilian: Scheveningen variation * +r1bqkb1r/ppp2ppp/2n5/3np3/8/P1N1P3/1P1P1PPP/R1BQKBNR b KQkq - +Sicilian: Taimanov variation * +r1bqkb1r/ppp2ppp/2n5/3np3/8/P2P1N2/1P2PPPP/RNBQKB1R b KQkq - +Sicilian: Najdorf * +r1bqkb1r/ppp2ppp/2n5/3np3/8/P3P3/1P1P1PPP/RNBQKBNR w KQkq - +Sicilian: Kan, 5.Nc3 * +r1bqkb1r/ppp2ppp/2n5/3p4/2Bpn3/2N2N2/PPP2PPP/R1BQR1K1 b kq - +two knights defense: Canal variation +r1bqkb1r/ppp2ppp/2n5/4P3/2BP2n1/4p3/PPP3PP/RNBQK1NR w KQkq - +Philidor: Philidor counter-gambit, Berger variation * +r1bqkb1r/ppp2ppp/2np1n2/1B2p3/2P1P3/3P1N2/PP3PPP/RNBQK2R b KQkq - +Ruy Lopez: Berlin defense, Duras variation +r1bqkb1r/ppp2ppp/2np1n2/1B2p3/4P3/5N2/PPPP1PPP/RNBQ1RK1 w kq - +Ruy Lopez: Berlin defense, 4.O-O, d6 +r1bqkb1r/ppp2ppp/2np1n2/4p3/2P5/1PN1P3/P2P1PPP/R1BQKBNR w KQkq - +Amsterdam attack +r1bqkb1r/ppp2ppp/4pn2/4N3/3P4/8/PPP2PPP/R1BQKB1R b KQkq - +French: Rubinstein, Capablanca line +r1bqkb1r/ppp2ppp/5n2/3Pp1N1/2Bn4/8/PPPP1PPP/RNBQK2R w KQkq - +two knights defense: Fritz variation +r1bqkb1r/ppp2ppp/5n2/3Pp3/3n4/2N2N2/PPPP1PPP/R1BQKB1R w KQkq - +Four knights: Belgrade gambit * +r1bqkb1r/ppp2ppp/5n2/3Pp3/3n4/2N3P1/PPPP1P1P/R1BQKBNR w KQkq - +Three knights: Steinitz, Rosenthal variation * +r1bqkb1r/ppp2ppp/5n2/3p4/2PPp3/2N5/PP1P1PPP/R1BQKB1R b KQkq - +Sicilian: Nimzovich-Rubinstein; Rubinstein counter-gambit * +r1bqkb1r/ppp2ppp/5n2/3pn3/8/2B1P3/PPP2PPP/RN1QKBNR b KQkq - +French: Fort Knox variation * +r1bqkb1r/ppp2ppp/5n2/n2Pp1N1/2B5/3P4/PPP2PPP/RNBQK2R b KQkq - +two knights defense: Kieseritsky variation +r1bqkb1r/ppp2ppp/5n2/n2Pp1N1/2B5/8/PPPP1PPP/RNBQK2R w KQkq - +two knights defense +r1bqkb1r/ppp2ppp/5n2/nB1Pp1N1/8/8/PPPP1PPP/RNBQK2R b KQkq - +Two knights defense +r1bqkb1r/ppp2ppp/6nn/3p4/8/2P3B1/PP2PPPP/RN1QKBNR w KQkq - +Caro-Kann: classical, Flohr variation * +r1bqkb1r/ppp2ppp/8/3p4/4n3/4PN2/PPP2PPP/R1BQKB1R w KQkq - +French: Rubinstein, Capablanca line * +r1bqkb1r/ppp3pp/2n2n2/3p1p2/2PPp3/4P3/PP1N1PPP/RNBQKB1R w KQkq - +French: Steinitz variation * +r1bqkb1r/ppp3pp/2n2n2/3p1p2/4p3/3P1NP1/PPP1PPBP/RNBQ1RK1 w kq - +Pirc: Austrian attack, 6.e5 * +r1bqkb1r/ppp3pp/2n2n2/3p4/8/4PN2/PPP2PPP/RNBQKB1R b KQkq - +Blackmar-Diemer: Euwe defense * +r1bqkb1r/ppp3pp/2n2n2/3ppP2/6P1/2N5/PPPP1P1P/R1BQKBNR w KQkq - +Vienna: Pierce gambit * +r1bqkb1r/ppp3pp/2n2n2/3ppp2/2P5/3P1NP1/PP2PPBP/RNBQK2R b KQkq - +Pirc: Austrian attack, dragon formation * +r1bqkb1r/ppp3pp/2n2n2/3ppp2/8/3P1NP1/PPP1PPBP/RNBQ1RK1 b kq - +Pirc: Austrian attack * +r1bqkb1r/ppp3pp/2n5/3npp2/8/3P1NP1/PP1NPP1P/R1BQKB1R b KQkq - +Sicilian: dragon, Levenfish; Flohr variation * +r1bqkb1r/ppp3pp/2n5/3npp2/8/3P1NP1/PP2PP1P/RNBQKB1R w KQkq - +Sicilian: dragon, Levenfish variation * +r1bqkb1r/ppp3pp/2n5/3npp2/8/3PPN2/PP3PPP/RNBQKB1R w KQkq - +Sicilian: Scheveningen, 6.f4 * +r1bqkb1r/ppp3pp/2n5/3npp2/8/P2P1N2/1P2PPPP/RNBQKB1R w KQkq - +Sicilian: Najdorf, 6.f4 * +r1bqkb1r/ppp4p/3p1nN1/8/3np2Q/8/PPP2PPP/RNB1KB1R w KQkq - +Vienna gambit, Wurzburger trap * +r1bqkb1r/pppn1ppp/2np4/1B2p3/3PP3/5N2/PPP2PPP/RNBQ1RK1 w kq - +Ruy Lopez: closed Berlin defense, Chigorin variation +r1bqkb1r/pppn1ppp/3p1n2/4p3/2PP4/2NBP3/PP3PPP/R1BQK1NR b KQkq - +Old Indian: Dus-Khotimirsky variation +r1bqkb1r/pppn1ppp/3p1n2/4p3/2PPP3/2N2N2/PP3PPP/R1BQKB1R b KQkq - +Old Indian: main line +r1bqkb1r/pppn1ppp/3p1n2/4p3/3PP3/2N2N2/PPP2PPP/R1BQKB1R w KQkq - +Philidor: Improved Hanham variation +r1bqkb1r/pppn1ppp/4pn2/3p2B1/2PP4/2N1P3/PP3PPP/R2QKBNR b KQkq - +QGD +r1bqkb1r/pppn1ppp/4pn2/3p2B1/2PP4/2N5/PP2PPPP/R2QKBNR w KQkq - +QGD: 4.Bg5 Nbd7 +r1bqkb1r/pppn1ppp/4pn2/8/2QP4/6P1/PP2PPBP/RNB1K1NR b KQkq - +Catalan: open, 5.Qa4 Nbd7, 6.Qxc4 +r1bqkb1r/pppn1ppp/5n2/3p4/2PP4/2N5/PP3PPP/R1BQKBNR b KQkq - +French: Tarrasch, open variation, main line * +r1bqkb1r/pppn1ppp/5n2/3p4/3P1B2/2N2N2/PP2PPPP/R2QKB1R b KQkq - +QGD: exchange, S\"amisch variation +r1bqkb1r/pppn1ppp/5n2/3pp3/3P4/2N1PN2/PPP2PPP/R1BQKB1R b KQkq - +French: Tarrasch, Guimard main line * +r1bqkb1r/pppn1ppp/5n2/4N3/4p3/3P4/PPP2PPP/RNBQKB1R w KQkq - +Philidor: Nimzovich, Sokolsky variation * +r1bqkb1r/pppn1ppp/8/4p3/8/2P2N2/P1PP1PPP/R1BQKB1R w KQkq - +Scotch: Tartakower variation * +r1bqkb1r/pppp1ppp/2n1pn2/8/2P1P3/2N5/PP1P1PPP/R1BQKBNR w KQkq - +English: Mikenas-Carls, Kevitz variation +r1bqkb1r/pppp1ppp/2n2n2/1B2p3/4P3/2N2N2/PPPP1PPP/R1BQK2R b KQkq - +Four knights: Spanish variation +r1bqkb1r/pppp1ppp/2n2n2/1B2p3/4P3/5N2/PPPP1PPP/RNBQ1RK1 b kq - +Ruy Lopez: Berlin defense, 4.O-O +r1bqkb1r/pppp1ppp/2n2n2/1B2p3/4P3/5N2/PPPP1PPP/RNBQK2R w KQkq - +Ruy Lopez: Berlin defense +r1bqkb1r/pppp1ppp/2n2n2/1B6/3pP3/5N2/PPP2PPP/RNBQ1RK1 b kq - +Ruy Lopez: Berlin defense, Nyholm attack +r1bqkb1r/pppp1ppp/2n2n2/3N4/3pP3/5N2/PPP2PPP/R1BQKB1R b KQkq - +Four knights: Belgrade gambit +r1bqkb1r/pppp1ppp/2n2n2/4N3/4P3/2N5/PPPP1PPP/R1BQKB1R b KQkq - +Four knights: Schultze-M\"uller gambit +r1bqkb1r/pppp1ppp/2n2n2/4N3/8/3P4/PPP2PPP/RNBQKB1R w KQkq - +Petrov: Nimzovich attack * +r1bqkb1r/pppp1ppp/2n2n2/4p1B1/3P4/2P5/PP2PPPP/RN1QKBNR b KQkq - +Caro-Kann: two knights, 3...Bg4 * +r1bqkb1r/pppp1ppp/2n2n2/4p1N1/2B1P3/8/PPPP1PPP/RNBQK2R b KQkq - +Two knights defense +r1bqkb1r/pppp1ppp/2n2n2/4p3/2B1P3/2N2N2/PPPP1PPP/R1BQK2R b KQkq - +Four knights: Italian variation +r1bqkb1r/pppp1ppp/2n2n2/4p3/2B1P3/2N5/PPPP1PPP/R1BQK1NR w KQkq - +Vienna game +r1bqkb1r/pppp1ppp/2n2n2/4p3/2B1P3/3P1N2/PPP2PPP/RNBQK2R b KQkq - +Two knights defense (Modern bishop's opening) +r1bqkb1r/pppp1ppp/2n2n2/4p3/2B1P3/5N2/PPPP1PPP/RNBQK2R w KQkq - +Two knights defense +r1bqkb1r/pppp1ppp/2n2n2/4p3/2BPP3/5N2/PPP2PPP/RNBQK2R b KQkq - +Two knights defense +r1bqkb1r/pppp1ppp/2n2n2/4p3/2P1P3/2N2N2/PP1P1PPP/R1BQKB1R b KQkq - +English: four knights, Nimzovich variation +r1bqkb1r/pppp1ppp/2n2n2/4p3/2P5/2N1PN2/PP1P1PPP/R1BQKB1R b KQkq - +English: four knights, 4.e3 +r1bqkb1r/pppp1ppp/2n2n2/4p3/2P5/2N2N2/PP1PPPPP/R1BQKB1R w KQkq - +English: four knights system +r1bqkb1r/pppp1ppp/2n2n2/4p3/2P5/2N2NP1/PP1PPP1P/R1BQKB1R b KQkq - +English: four knights, kingside fianchetto +r1bqkb1r/pppp1ppp/2n2n2/4p3/2P5/2NP1N2/PP2PPPP/R1BQKB1R b KQkq - +English: four knights, Capablanca variation +r1bqkb1r/pppp1ppp/2n2n2/4p3/2P5/P1N2N2/1P1PPPPP/R1BQKB1R b KQkq - +English: four knights, Marini variation +r1bqkb1r/pppp1ppp/2n2n2/4p3/3P4/2P5/PP2PPPP/RNBQKBNR w KQkq - +Caro-Kann: two knights variation * +r1bqkb1r/pppp1ppp/2n2n2/4p3/3P4/4P3/PPP2PPP/RNBQKBNR w KQkq - +French: Two knights variation * +r1bqkb1r/pppp1ppp/2n2n2/4p3/3PP3/2N2N2/PPP2PPP/R1BQKB1R b KQkq - +Four knights: Scotch variation +r1bqkb1r/pppp1ppp/2n2n2/4p3/3PP3/5N2/PPP1BPPP/RNBQK2R b KQkq - +Tayler opening +r1bqkb1r/pppp1ppp/2n2n2/4p3/4P3/2N2N2/PPPP1PPP/R1BQKB1R b KQkq - +Four knights game * +r1bqkb1r/pppp1ppp/2n2n2/4p3/4P3/2N2N2/PPPP1PPP/R1BQKB1R w KQkq - +Four knights game +r1bqkb1r/pppp1ppp/2n2n2/4p3/4P3/2N3P1/PPPP1P1P/R1BQKBNR b KQkq - +Three knights: Steinitz variation * +r1bqkb1r/pppp1ppp/2n2n2/4p3/4P3/2N5/PPPP1PPP/R1BQKBNR w KQkq - +Three knights game * +r1bqkb1r/pppp1ppp/2n2n2/4p3/4P3/2P2N2/PP1P1PPP/RNBQKB1R w KQkq - +Ponziani: Jaenisch counter-attack +r1bqkb1r/pppp1ppp/2n2n2/4p3/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - +Petrov three knights game * +r1bqkb1r/pppp1ppp/2n2n2/4p3/4P3/P1N2N2/1PPP1PPP/R1BQKB1R b KQkq - +Four knights: Gunsberg variation +r1bqkb1r/pppp1ppp/2n2n2/4p3/4PP2/2N5/PPPP2PP/R1BQKBNR b KQkq - +Three knights: Winawer defense (Gothic defense) * +r1bqkb1r/pppp1ppp/2n2n2/6N1/2BpP3/8/PPP2PPP/RNBQK2R b KQkq - +Two knights defense, Perreux variation +r1bqkb1r/pppp1ppp/2n2n2/8/2BpP3/5N2/PPP2PPP/RNBQ1RK1 b kq - +Two knights defense +r1bqkb1r/pppp1ppp/2n2n2/8/2BpP3/5N2/PPP2PPP/RNBQK2R w KQkq - +Scotch gambit: Dubois-R\'eti defense +r1bqkb1r/pppp1ppp/2n2n2/8/2PPp3/2N2N2/PP2PPPP/R1BQKB1R w KQkq - +English: Bradley Beach variation +r1bqkb1r/pppp1ppp/2n2n2/8/3NP3/8/PPP2PPP/RNBQKB1R w KQkq - +Scotch: Schmidt variation +r1bqkb1r/pppp1ppp/2n2n2/8/3pP3/2N2N2/PPP2PPP/R1BQKB1R w KQkq - +Four knights: Scotch, 4...exd4 +r1bqkb1r/pppp1ppp/2n2n2/8/4P3/4Q3/PPP2PPP/RNB1KBNR w KQkq - +Center game: Berger variation +r1bqkb1r/pppp1ppp/2n5/1B2p3/4n3/5N2/PPPP1PPP/RNBQ1RK1 w kq - +Ruy Lopez: Berlin defense, open variation +r1bqkb1r/pppp1ppp/2n5/2n1P3/3N4/8/PPP1QPPP/RNB1KB1R w KQkq - +Petrov: modern attack, Bardeleben variation +r1bqkb1r/pppp1ppp/2n5/4p3/4n3/2N2N2/PPPP1PPP/R1BQKB1R w KQkq - +Four knights: Schultze-M\"uller gambit * +r1bqkb1r/pppp1ppp/2n5/8/2Bpn3/5N2/PPP2PPP/RNBQ1RK1 w kq - +Two knights defense +r1bqkb1r/pppp1ppp/2nn4/1B2P3/8/5N2/PPP2PPP/RNBQ1RK1 b kq - +Ruy Lopez: open Berlin defense, l'Hermet variation +r1bqkb1r/pppp1ppp/2nn4/4p2Q/3P4/1BN5/PPP2PPP/R1B1K1NR b KQkq - +Vienna: Adams' gambit +r1bqkb1r/pppp1ppp/2nn4/4p3/B2P4/5N2/PPP2PPP/RNBQ1RK1 b kq - +Ruy Lopez: open Berlin defense, Showalter variation +r1bqkb1r/pppp1ppp/5n2/1B2p3/3NP3/2N5/PPPP1PPP/R1BQK2R b KQkq - +Four knights: Rubinstein counter-gambit, exchange variation +r1bqkb1r/pppp1ppp/5n2/1B2p3/3nP3/2N2N2/PPPP1PPP/R1BQ1RK1 b kq - +Four knights: Rubinstein counter-gambit, Henneberger variation +r1bqkb1r/pppp1ppp/5n2/1B2p3/3nP3/2N2N2/PPPP1PPP/R1BQK2R b KQkq - +Three knights: Schlechter variation * +r1bqkb1r/pppp1ppp/5n2/1B2p3/3nP3/2N2N2/PPPP1PPP/R1BQK2R w KQkq - +Four knights: Rubinstein counter-gambit +r1bqkb1r/pppp1ppp/5n2/4p3/3nP3/2N2N2/PPPPBPPP/R1BQK2R b KQkq - +Four knights: Rubinstein counter-gambit, 5.Be2 +r1bqkb1r/pppp2p1/2n5/4pPPp/6n1/2N5/PPPP1P1P/R1BQKBNR w KQkq - +Vienna: Hamppe-Allgaier gambit * +r1bqkb1r/pppp2p1/2n5/4pPPp/6n1/2NP4/PPP2P1P/R1BQKBNR b KQkq - +Vienna: Hamppe-Allgaier gambit, Alapin variation * +r1bqkb1r/pppp2p1/2n5/4pPPp/8/7P/PPPP1K2/RNBQ1BNR w kq - +KGA: Allgaier, Blackburne gambit * +r1bqkb1r/pppp2pp/2n2n2/4N3/3Pp3/8/PPP1BPPP/RNBQK2R b KQkq - +Vienna gambit: Breyer variation * +r1bqkb1r/pppp2pp/2n2n2/4pP2/6P1/8/PPPP1P1P/RNBQKBNR w KQkq - +KGA: Quaade gambit * +r1bqkb1r/pppp2pp/2n2n2/4pP2/8/2N5/PPPP1PPP/R1BQKBNR w KQkq - +Vienna gambit * +r1bqkb1r/pppp2pp/2n2n2/4pp2/2B1P3/3P4/PPPN1PPP/R1BQK1NR b KQkq - +KGD: classical, Hanham variation * +r1bqkb1r/ppppnp1p/2n3p1/1B2p3/4P3/2N2N2/PPPP1PPP/R1BQK2R w KQkq - +Ruy Lopez: Cozio defense, Paulsen variation +r1bqkb1r/ppppnppp/2n5/1B2p3/4P3/5N2/PPPP1PPP/RNBQK2R w KQkq - +Ruy Lopez: Cozio defense +r1bqkb1r/ppppnppp/2n5/4p3/2P5/2N5/PP1PPPPP/R1BQKBNR w KQkq - +Sicilian: chameleon variation * +r1bqkb1r/ppppnppp/2n5/4p3/4P3/2P2N2/PP1P1PPP/RNBQKB1R w KQkq - +Ponziani: R\'eti variation +r1bqkb1r/ppppnppp/5n2/1B2p3/4P3/3P1N2/PPP2PPP/RNBQK2R w KQkq - +Ruy Lopez: Berlin defense, Mortimer variation +r1bqkb1r/ppppnppp/8/1B6/3pP3/8/PPPP1PPP/RNBQ1RK1 w kq - +Ruy Lopez: Bird's defense, Paulsen variation +r1bqkb1r/pppppppp/2n2n2/8/2PP4/8/PP2PPPP/RNBQKBNR w KQkq - +Kevitz-Trajkovich defense +r1bqkbnr/1p1p1ppp/p1n1p3/8/3NP3/2N5/PPP2PPP/R1BQKB1R w KQkq - +Sicilian: Taimanov variation +r1bqkbnr/1pp2ppp/p1n5/1B1p4/2PPp3/4P3/PP3PPP/RNBQK1NR w KQkq - +French: Winawer, advance, 5.a3 * +r1bqkbnr/1pp2ppp/p1np4/4p3/B1P1P3/5N2/PP1P1PPP/RNBQK2R b KQkq - +Ruy Lopez: modern Steinitz defense, Duras (Keres) variation +r1bqkbnr/1pp2ppp/p1np4/4p3/B3P3/2N2N2/PPPP1PPP/R1BQK2R b KQkq - +Ruy Lopez: modern Steinitz defense, Three knights variation +r1bqkbnr/1pp2ppp/p1np4/4p3/B3P3/2P2N2/PP1P1PPP/RNBQK2R b KQkq - +Ruy Lopez: modern Steinitz defense +r1bqkbnr/1pp2ppp/p1np4/4p3/B3P3/5N2/PPPP1PPP/RNBQ1RK1 b kq - +Ruy Lopez: modern Steinitz defense, 5.O-O +r1bqkbnr/1pp2ppp/p1np4/4p3/B3P3/5N2/PPPP1PPP/RNBQK2R w KQkq - +Ruy Lopez: modern Steinitz defense +r1bqkbnr/1pp2ppp/p1p5/4p3/4P3/2N2N2/PPPP1PPP/R1BQK2R b KQkq - +Ruy Lopez: exchange, Keres variation +r1bqkbnr/1pp2ppp/p1p5/4p3/4P3/5N2/PPPP1PPP/RNBQ1RK1 b kq - +Ruy Lopez: exchange variation, 5.O-O +r1bqkbnr/1pp3pp/p1np4/4pp2/B3P3/2P2N2/PP1P1PPP/RNBQK2R w KQkq - +Ruy Lopez: modern Steinitz defense, siesta variation +r1bqkbnr/1pp3pp/p1p2p2/4p3/4P3/2NP1N2/PPP2PPP/R1BQK2R b KQkq - +Ruy Lopez: exchange, Romanovsky variation +r1bqkbnr/1pp3pp/p1p2p2/4p3/4P3/5N2/PPPP1PPP/RNBQ1RK1 w kq - +Ruy Lopez: exchange, Gligori\'c variation +r1bqkbnr/1ppp1p1p/p1n3p1/4p3/B3P3/5N2/PPPP1PPP/RNBQK2R w KQkq - +Ruy Lopez: fianchetto defense deferred +r1bqkbnr/1ppp1ppp/p1B5/4p3/4P3/5N2/PPPP1PPP/RNBQK2R b KQkq - +Ruy Lopez: exchange variation +r1bqkbnr/1ppp1ppp/p1n5/4p3/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - +Vienna: Mengarini variation * +r1bqkbnr/1ppp1ppp/p1n5/4p3/B3P3/5N2/PPPP1PPP/RNBQK2R b KQkq - +Ruy Lopez +r1bqkbnr/1ppp1ppp/p7/4p3/B2nP3/5N2/PPPP1PPP/RNBQK2R w KQkq - +Ruy Lopez: Bird's defense deferred +r1bqkbnr/1ppp2pp/p1n5/4pp2/B3P3/5N2/PPPP1PPP/RNBQK2R w KQkq - +Ruy Lopez: Schliemann defense deferred +r1bqkbnr/1ppppppp/p1n5/8/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +Battambang opening * +r1bqkbnr/2p2ppp/2p5/p2p4/2PPp3/4P3/PP2NPPP/RNBQK2R w KQkq - +French: Winawer, advance, Smyslov variation * +r1bqkbnr/2p2ppp/p1p5/3p4/2PPp3/4P3/PP2NPPP/RNBQK2R b KQkq - +French: Winawer, advance, 6...Ne7 * +r1bqkbnr/2p2ppp/p1p5/3p4/2PPp3/4P3/PP3PPP/RNBQK1NR w KQkq - +French: Winawer, advance variation * +r1bqkbnr/2p2ppp/p1p5/3p4/2PPp3/4P3/PPQ2PPP/RNB1K1NR b KQkq - +French: Winawer, classical variation * +r1bqkbnr/2p2ppp/p1pp4/4p3/3PP3/5N2/PPP2PPP/RNBQK2R b KQkq - +Ruy Lopez: modern Steinitz defense, Richter variation +r1bqkbnr/2p2ppp/p1pp4/4p3/4P3/5N2/PPPP1PPP/RNBQK2R w KQkq - +Ruy Lopez: modern Steinitz defense, exchange variation +r1bqkbnr/2p3pp/p1pp1p2/4p3/3PP3/5N2/PPP2PPP/RNBQK2R w KQkq - +Ruy Lopez: modern Steinitz defense, Alapin variation +r1bqkbnr/2pp1ppp/p1n5/1p2p3/B3P3/5N2/PPPP1PPP/RNBQK2R w KQkq - +Ruy Lopez: Caro variation +r1bqkbnr/2pp1ppp/p7/np2p3/4P3/1B3N2/PPPP1PPP/RNBQK2R w KQkq - +Ruy Lopez: Taimanov (chase/wing/accelerated counterthrust) variation +r1bqkbnr/4p1pp/p1p2p2/3p4/2Pp4/4PN2/PP3PPP/RNBQK2R w KQkq - +Nimzo-Indian: S\"amisch variation * +r1bqkbnr/4p1pp/p1p2p2/8/2pN1P2/4P3/PP4PP/RNBQK2R b KQkq - +Nimzo-Indian: S\"amisch, Romanovsky variation * +r1bqkbnr/4p1pp/p1p2p2/8/2pN4/4P3/PP3PPP/RNBQK2R w KQkq - +Nimzo-Indian: S\"amisch, Keres variation * +r1bqkbnr/4pppp/p1p5/2pp4/8/4PN2/PPPP1PPP/RNBQ1RK1 b kq - +Nimzo-Indian: S\"amisch variation * +r1bqkbnr/4pppp/p1p5/2pp4/8/4PN2/PPPP1PPP/RNBQK2R w KQkq - +Nimzo-Indian: S\"amisch variation * +r1bqkbnr/5ppp/p1p1p3/2pp4/2P5/1P2PN2/P2P1PPP/RNBQK2R b KQkq - +Nimzo-Indian: S\"amisch, O'Kelly variation * +r1bqkbnr/5ppp/p1p1p3/2pp4/2P5/4PN2/PP1P1PPP/RNBQK2R w KQkq - +Nimzo-Indian: S\"amisch variation * +r1bqkbnr/5ppp/p1p1p3/2pp4/8/4PN2/PPPP1PPP/RNBQ1RK1 w kq - +Nimzo-Indian: S\"amisch variation * +r1bqkbnr/5ppp/p2p4/1pp5/3QP3/1B6/PPP2PPP/RNB1K2R w KQkq - +Ruy Lopez: Noah's ark trap +r1bqkbnr/6pp/p1p1pp2/3p4/2PN4/4P3/PP3PPP/RNBQ1RK1 b kq - +Nimzo-Indian: S\"amisch, Botvinnik variation * +r1bqkbnr/p1pp1ppp/2n5/1p6/Q7/8/PPP1PPPP/RNB1KBNR w KQkq - +Scandinavian, Mieses-Kotr\v c gambit * +r1bqkbnr/p2p1ppp/1pn1p3/2p5/4P3/2NP1N2/PPP2PPP/R1BQKB1R b KQkq - +Amsterdam attack * +r1bqkbnr/p3pppp/2p5/2p5/2Pp1P2/6P1/PP1PP2P/RNBQK1NR b KQkq - +Beefeater defense * +r1bqkbnr/pp1n1ppp/2pp4/4p1N1/2BPP3/8/PPP2PPP/RNBQK2R b KQkq - +Philidor: Hanham, Kmoch variation +r1bqkbnr/pp1n1ppp/2pp4/4p3/2BPP3/2N2N2/PPP2PPP/R1BQK2R b KQkq - +Philidor: Hanham, Schlechter variation +r1bqkbnr/pp1n1ppp/2pp4/4p3/2BPP3/2P2N2/PP3PPP/RNBQK2R b KQkq - +Philidor: Hanham, Delmar variation +r1bqkbnr/pp1n1ppp/2pp4/4p3/2BPP3/5N2/PPP2PPP/RNBQ1RK1 b kq - +Philidor: Hanham, Krause variation +r1bqkbnr/pp1npppp/2p5/8/3PN3/8/PPP2PPP/R1BQKBNR w KQkq - +Caro-Kann: Steinitz variation +r1bqkbnr/pp1p1p1p/2n3p1/2p1p3/2P4P/2NP4/PP2PPP1/R1BQKBNR b KQkq - +Sicilian: Gloria variation * +r1bqkbnr/pp1p1ppp/2n1p3/1N6/4P3/8/PPP2PPP/RNBQKB1R b KQkq - +Sicilian, Sz\'en (`anti-Taimanov') variation +r1bqkbnr/pp1p1ppp/2n1p3/8/3NP3/2N5/PPP2PPP/R1BQKB1R b KQkq - +Sicilian: Taimanov variation +r1bqkbnr/pp1p1ppp/2n1p3/8/3NP3/8/PPP2PPP/RNBQKB1R w KQkq - +Sicilian defense +r1bqkbnr/pp1p1ppp/2n5/2p1p3/2P5/4PN2/PP1P1PPP/RNBQKB1R b KQkq - +English: Mikenas-Carls, Sicilian variation * +r1bqkbnr/pp1p1ppp/2n5/2p1p3/8/2N1PN2/PPPP1PPP/R1BQKB1R b KQkq - +English: Mikenas-Carls, Kevitz variation * +r1bqkbnr/pp1p1ppp/2n5/2p1p3/8/4PN2/PPPP1PPP/RNBQKB1R w KQkq - +English: Mikenas-Carls variation * +r1bqkbnr/pp1p1ppp/2n5/2p5/3Pp3/4PN2/PPP2PPP/RNBQKB1R w KQkq - +English: Mikenas-Carls, Flohr variation * +r1bqkbnr/pp1p1ppp/2n5/4p3/3NP3/8/PPP2PPP/RNBQKB1R w KQkq - +Sicilian: Labourdonnais-L\"owenthal variation +r1bqkbnr/pp1ppp1p/2N3p1/8/4P3/8/PPP2PPP/RNBQKB1R b KQkq - +Sicilian: accelerated fianchetto, exchange variation +r1bqkbnr/pp1ppp1p/2n3p1/1Bp5/4P3/5N2/PPPP1PPP/RNBQK2R b KQkq - +English: Bremen, Smyslov system * +r1bqkbnr/pp1ppp1p/2n3p1/1Bp5/4P3/5N2/PPPP1PPP/RNBQK2R w KQkq - +Sicilian: Nimzovich-Rossolimo attack (with ...g6, without ...d6) +r1bqkbnr/pp1ppp1p/2n3p1/2p5/2P5/2N5/PP1PPPPP/R1BQKBNR w KQkq - +English: symmetrical variation * +r1bqkbnr/pp1ppp1p/2n3p1/2p5/2P5/5N2/PP1PPPPP/RNBQKB1R w KQkq - +English: symmetrical variation * +r1bqkbnr/pp1ppp1p/2n3p1/2p5/3PP3/5N2/PPP2PPP/RNBQKB1R b KQkq - +English: Bremen, reverse dragon * +r1bqkbnr/pp1ppp1p/2n3p1/2p5/4P3/2P2N2/PP1P1PPP/RNBQKB1R b KQkq - +English: Bremen system, Keres variation * +r1bqkbnr/pp1ppp1p/2n3p1/2p5/4P3/2PP4/PP3PPP/RNBQKBNR b KQkq - +English, Keres variation * +r1bqkbnr/pp1ppp1p/2n3p1/2p5/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - +English: Carls' Bremen system * +r1bqkbnr/pp1ppp1p/2n3p1/2p5/4P3/5NP1/PPPP1P1P/RNBQKB1R b KQkq - +English: Bremen system with ...g6 * +r1bqkbnr/pp1ppp1p/2n3p1/8/2PNP3/8/PP3PPP/RNBQKB1R b KQkq - +Sicilian: accelerated fianchetto, Mar\'oczy bind +r1bqkbnr/pp1ppp1p/2n3p1/8/3NP3/2N5/PPP2PPP/R1BQKB1R b KQkq - +Sicilian: accelerated fianchetto, modern variation +r1bqkbnr/pp1ppppp/2n5/1Bp5/4P3/5N2/PPPP1PPP/RNBQK2R b KQkq - +Sicilian: Nimzovich-Rossolimo attack (without ...d6) +r1bqkbnr/pp1ppppp/2n5/1Bp5/4P3/8/PPPP1PPP/RNBQK1NR b KQkq - +English, Kramnik-Shirov counterattack * +r1bqkbnr/pp1ppppp/2n5/2p5/2P5/2N3P1/PP1PPP1P/R1BQKBNR b KQkq - +English: symmetrical variation +r1bqkbnr/pp1ppppp/2n5/2p5/2P5/2N5/PP1PPPPP/R1BQKBNR b KQkq - +English: symmetrical variation * +r1bqkbnr/pp1ppppp/2n5/2p5/2P5/2N5/PP1PPPPP/R1BQKBNR w KQkq - +English: symmetrical variation +r1bqkbnr/pp1ppppp/2n5/2p5/2P5/8/PP1PPPPP/RNBQKBNR w KQkq - +English: symmetrical variation * +r1bqkbnr/pp1ppppp/2n5/2p5/3P4/5N2/PPP1PPPP/RNBQKB1R b KQkq - +English: Anglo-Gr\"unfeld defense * +r1bqkbnr/pp1ppppp/2n5/2p5/3PP3/5N2/PPP2PPP/RNBQKB1R b KQkq - +Sicilian defense +r1bqkbnr/pp1ppppp/2n5/2p5/4P3/2N3P1/PPPP1P1P/R1BQKBNR b KQkq - +Sicilian: closed +r1bqkbnr/pp1ppppp/2n5/2p5/4P3/2N5/PPPP1PPP/R1BQKBNR b KQkq - +English: Sicilian reversed * +r1bqkbnr/pp1ppppp/2n5/2p5/4P3/2N5/PPPP1PPP/R1BQKBNR w KQkq - +Sicilian: closed, 2...Nc6 +r1bqkbnr/pp1ppppp/2n5/2p5/4P3/2N5/PPPPNPPP/R1BQKB1R b KQkq - +Sicilian: chameleon variation +r1bqkbnr/pp1ppppp/2n5/2p5/4P3/5N2/PPPP1PPP/RNBQKB1R b KQkq - +English opening * +r1bqkbnr/pp1ppppp/2n5/2p5/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - +Sicilian defense +r1bqkbnr/pp1ppppp/2n5/2p5/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +English opening * +r1bqkbnr/pp1ppppp/2n5/2p5/4PP2/2N5/PPPP2PP/R1BQKBNR b KQkq - +Sicilian: Grand Prix attack +r1bqkbnr/pp1ppppp/2n5/2p5/8/2NP2P1/PPP1PP1P/R1BQKBNR b KQkq - +Venezolana opening +r1bqkbnr/pp1ppppp/2n5/2p5/8/4PN2/PPPP1PPP/RNBQKB1R b KQkq - +English opening * +r1bqkbnr/pp1ppppp/2n5/2p5/8/5N2/PPPPPPPP/RNBQKB1R w KQkq - +English opening * +r1bqkbnr/pp1ppppp/2n5/8/7Q/2N5/PPP1PPPP/R1B1KBNR b KQkq - +Novosibirsk opening +r1bqkbnr/pp2p1pp/2n2p2/1Bpp4/8/4PN2/PPPP1PPP/RNBQK2R w KQkq - +Nimzo-Indian: Kmoch variation * +r1bqkbnr/pp2pp1p/2n3p1/1Bpp4/8/4PN2/PPPP1PPP/RNBQK2R w KQkq - +Nimzo-Indian: Romanishin-Kasparov (Steiner) system * +r1bqkbnr/pp2pp1p/2n5/2pp2p1/3P4/5NP1/PPP1PP1P/RNBQKB1R w KQkq - +Gr\"unfeld: Spike gambit * +r1bqkbnr/pp2ppp1/2np4/2p4p/2P1P3/2N3P1/PP1P1P1P/R1BQKBNR w KQkq - +Sicilian: Gloria variation +r1bqkbnr/pp2pppp/2n5/1Bpp4/8/4PN2/PPPP1PPP/RNBQK2R b KQkq - +Nimzo-Indian defense * +r1bqkbnr/pp2pppp/2n5/2pp4/2PP4/4P3/PP3PPP/RNBQKBNR b KQkq - +QGD: Tarrasch defense * +r1bqkbnr/pp2pppp/2n5/2pp4/3P4/1P2P3/P1P2PPP/RNBQKBNR b KQkq - +QGD: Alapin variation * +r1bqkbnr/pp2pppp/2n5/2pp4/3P4/2P1P3/PP3PPP/RNBQKBNR b KQkq - +QGD: semi-Slav * +r1bqkbnr/pp2pppp/2n5/2pp4/3P4/4P3/PPP1BPPP/RNBQK1NR b KQkq - +QGD: Charousek (Petrosian) variation * +r1bqkbnr/pp2pppp/2n5/2pp4/3P4/4P3/PPP2PPP/RNBQKBNR w KQkq - +QGD: 3.Nc3 * +r1bqkbnr/pp2pppp/2n5/2pp4/3P4/4PN2/PPP2PPP/RNBQKB1R b KQkq - +QGD: 3...Nf6 * +r1bqkbnr/pp2pppp/2n5/2pp4/3P4/5NP1/PPP1PP1P/RNBQKB1R b KQkq - +Gr\"unfeld defense * +r1bqkbnr/pp2pppp/2n5/2pp4/3P4/P3P3/1PP2PPP/RNBQKBNR b KQkq - +QGD: Janowski variation * +r1bqkbnr/pp2pppp/2n5/2pp4/3PP3/2P5/PP3PPP/RNBQKBNR b KQkq - +QGD Slav: Winawer counter-gambit * +r1bqkbnr/pp2pppp/2n5/2pp4/4P3/3P1N2/PPP2PPP/RNBQKB1R b KQkq - +Old Indian: Ukrainian variation * +r1bqkbnr/pp2pppp/2n5/2pp4/5B2/3P1N2/PPP1PPPP/RN1QKB1R b KQkq - +Old Indian: Janowski variation * +r1bqkbnr/pp2pppp/2n5/2pp4/5P2/4P3/PPPP2PP/RNBQKBNR w KQkq - +Dutch defense, Rubinstein variation * +r1bqkbnr/pp2pppp/2n5/2pp4/5P2/5N2/PPPPP1PP/RNBQKB1R w KQkq - +Dutch with c4 & Nc3 * +r1bqkbnr/pp2pppp/2n5/2pp4/5P2/6PN/PPPPP2P/RNBQKB1R b KQkq - +Dutch defense: Bladel variation * +r1bqkbnr/pp2pppp/2n5/2pp4/8/3P2P1/PPP1PPBP/RNBQK1NR b KQkq - +Modern defense * +r1bqkbnr/pp2pppp/2n5/2pp4/8/5NP1/PPPPPP1P/RNBQKB1R w KQkq - +King's Indian defense, 3.Nc3 * +r1bqkbnr/pp2pppp/2n5/3P4/3p4/4P3/PP3PPP/RNBQKBNR b KQkq - +QGD: Tarrasch, von Hennig-Schara gambit * +r1bqkbnr/pp2pppp/2n5/3p4/2PP4/8/PP3PPP/RNBQKBNR b KQkq - +QGD: Tarrasch defense, 4.cd ed * +r1bqkbnr/pp2pppp/2n5/3p4/3N4/6P1/PPP1PP1P/RNBQKB1R b KQkq - +Gr\"unfeld: exchange variation * +r1bqkbnr/pp2pppp/2n5/3p4/3NP3/8/PPP2PPP/RNBQKB1R w KQkq - +Sicilian: Nimzovich variation +r1bqkbnr/pp2pppp/2n5/3p4/3p4/4PN2/PPP2PPP/RNBQKB1R w KQkq - +QGD: exchange variation * +r1bqkbnr/pp2pppp/2n5/8/1pPp4/P4N2/3PPPPP/RNBQKB1R w KQkq - +Benk\"o gambit: Zaitsev system * +r1bqkbnr/pp2pppp/8/n2P4/1Pp5/8/P4PPP/RNBQKBNR b KQkq b3 +QGD: Tarrasch defense, Tarrasch gambit * +r1bqkbnr/pp3p1p/2n3p1/2ppp3/8/3P1NP1/PPP1PPBP/RNBQK2R w KQkq - +King's Indian with e4 & g3 * +r1bqkbnr/pp3pp1/2n4p/2ppp3/8/3P1NP1/PPP1PPBP/RNBQK2R w KQkq - +King's Indian: Makagonov system (5.h3) * +r1bqkbnr/pp3ppp/2n1p3/1Bpp4/2P5/4PN2/PP1P1PPP/RNBQK2R b KQkq - +Nimzo-Indian: 4.e3 c5 * +r1bqkbnr/pp3ppp/2n1p3/1Bpp4/8/1P2PN2/P1PP1PPP/RNBQK2R b KQkq - +Nimzo-Indian: Fischer variation * +r1bqkbnr/pp3ppp/2n1p3/1Bpp4/8/2N1PN2/PPPP1PPP/R1BQK2R b KQkq - +Nimzo-Indian: 4.e3, Taimanov variation * +r1bqkbnr/pp3ppp/2n1p3/1Bpp4/8/4PN2/PPPP1PPP/RNBQ1RK1 b kq - +Nimzo-Indian: 4.e3 O-O * +r1bqkbnr/pp3ppp/2n1p3/1Bpp4/8/4PN2/PPPP1PPP/RNBQK2R w KQkq - +Nimzo-Indian: 4.e3 * +r1bqkbnr/pp3ppp/2n1p3/2ppP3/3P4/2P2N2/PP3PPP/RNBQKB1R b KQkq - +French: advance, Paulsen attack +r1bqkbnr/pp3ppp/2n1p3/2ppP3/3P4/2P5/PP3PPP/RNBQKBNR w KQkq - +French: advance variation +r1bqkbnr/pp3ppp/2n5/2P1p3/1PPp4/5N2/P3PPPP/RNBQKB1R b KQkq - +QGA: Linares variation * +r1bqkbnr/pp3ppp/2n5/2Ppp3/8/2P5/PP2PPPP/RNBQKBNR w KQkq - +QGD Slav defense, Alekhine variation * +r1bqkbnr/pp3ppp/2n5/2p1p3/2PpP3/3P1NP1/PP3P1P/RNBQKB1R b KQkq - +Czech Benoni: King's Indian system * +r1bqkbnr/pp3ppp/2n5/2pp4/3P4/2N2NP1/PP2PP1P/R1BQKB1R b KQkq - +QGD: Tarrasch, Schlechter-Rubinstein system +r1bqkbnr/pp3ppp/2n5/2pp4/3P4/4PN2/PP3PPP/RNBQKB1R b KQkq - +Caro-Kann: Panov-Botvinnik attack, 5...e6 * +r1bqkbnr/pp3ppp/2n5/2pp4/3P4/5N2/PP2PPPP/RNBQKB1R w KQkq - +Caro-Kann: Panov-Botvinnik attack * +r1bqkbnr/pp3ppp/2n5/2pp4/3P4/5N2/PPPN1PPP/R1BQKB1R w KQkq - +French: Tarrasch, open variation, main line +r1bqkbnr/pp3ppp/2n5/2pp4/3P4/5NP1/PP2PP1P/RNBQKB1R b KQkq - +Caro-Kann: Panov-Botvinnik attack, 5...g6 * +r1bqkbnr/pp3ppp/2n5/2ppp3/3P4/2P1P3/PP3PPP/RNBQKBNR w KQkq - +QGD: semi-Slav, Marshall gambit * +r1bqkbnr/pp3ppp/2n5/2ppp3/5P2/3P2P1/PPP1P1BP/RNBQK1NR b KQkq - +Modern defense: Averbakh system, Randspringer variation * +r1bqkbnr/pp3ppp/2n5/2ppp3/8/2NP2P1/PPP1PPBP/R1BQK1NR b KQkq - +Modern defense: Averbakh system, Kotov variation * +r1bqkbnr/pp3ppp/2n5/2ppp3/8/3P2P1/PPP1PPBP/RNBQK1NR w KQkq - +Modern defense: Averbakh system * +r1bqkbnr/pp3ppp/2n5/2ppp3/8/5NP1/PPPPPPBP/RNBQK2R w KQkq - +King's Indian: 4.e4 * +r1bqkbnr/pp3ppp/2n5/3p4/2pP4/2N2NP1/PP2PP1P/R1BQKB1R w KQkq - +QGD: Tarrasch, Folkestone (Swedish) variation +r1bqkbnr/pp3ppp/2n5/3p4/2pPP3/2N2NP1/PP3P1P/R1BQKB1R b KQkq - +QGD: Tarrasch, Schlechter-Rubinstein system, Rey Ardid variation +r1bqkbnr/pp3ppp/2n5/3pp3/2PP4/8/PP3PPP/RNBQKBNR w KQkq - +QGD: Tarrasch defense, Marshall gambit * +r1bqkbnr/pp3ppp/2n5/4p3/2Pp4/3P1N2/PP3PPP/RNBQKB1R w KQkq - +Benoni: 6.e4 * +r1bqkbnr/pp3ppp/2n5/4p3/2Pp4/B2P1N2/4PPPP/RN1QKB1R w KQkq - +Benk\"o gambit: 7.e4 * +r1bqkbnr/pp3ppp/2np4/1N2p3/4P3/8/PPP2PPP/RNBQKB1R w KQkq - +Sicilian: Labourdonnais-L\"owenthal (Kalashnikov) variation +r1bqkbnr/pp4pp/2n2p2/2ppp3/8/3P1NP1/PPP1PPBP/RNBQ1RK1 b kq - +King's Indian: S\"amisch, 5...O-O * +r1bqkbnr/pp4pp/2n2p2/2ppp3/8/3P1NP1/PPP1PPBP/RNBQK2R w KQkq - +King's Indian: S\"amisch variation * +r1bqkbnr/pp4pp/2n5/2pppp2/8/3P1NP1/PPP1PPBP/RNBQK2R w KQkq - +King's Indian: Four pawns attack * +r1bqkbnr/pp4pp/2n5/4pp2/2Pp4/3P1NP1/PP3P1P/RNBQKB1R w KQkq - +Benoni: pawn storm variation * +r1bqkbnr/pp4pp/2n5/5p2/2Ppp3/3P1NP1/PP3PBP/RNBQK2R w KQkq - +Benoni: Mikenas variation * +r1bqkbnr/ppnppppp/2p5/8/3PP3/2N5/PPP2PPP/R1BQKBNR w KQkq - +de Bruycker defense +r1bqkbnr/ppp1pp1p/2n5/3p2p1/5P2/5N2/PPPPP1PP/RNBQKB1R w KQkq - +Dutch, Spielmann gambit * +r1bqkbnr/ppp1pp1p/2np2p1/8/2P5/2N5/PP1PPPPP/R1BQKBNR w KQkq - +Venezolana opening * +r1bqkbnr/ppp1pppp/2n5/3p2B1/3P4/8/PPP1PPPP/RN1QKBNR b KQkq - +Queen's pawn: Anti-Veresov * +r1bqkbnr/ppp1pppp/2n5/3p4/2PP4/8/PP2PPPP/RNBQKBNR w KQkq - +QGD: Chigorin defense +r1bqkbnr/ppp1pppp/2n5/3p4/3P4/5N2/PPP1PPPP/RNBQKB1R w KQkq - +Queen's pawn game, Chigorin variation +r1bqkbnr/ppp1pppp/2n5/3p4/3P4/8/PPP1PPPP/RNBQKBNR w KQkq - +Queen's pawn: Chigorin variation * +r1bqkbnr/ppp1pppp/2n5/3p4/3PP3/2N5/PPP2PPP/R1BQKBNR b KQkq - +KP: Nimzovich defense, Bogolyubov variation +r1bqkbnr/ppp1pppp/2n5/8/2Pp4/3P2P1/PP2PP1P/RNBQKBNR b KQkq - +Old Benoni: Schmid's system * +r1bqkbnr/ppp1pppp/2n5/8/2pP4/2N2N2/PP2PPPP/R1BQKB1R b KQkq - +QGD: Chigorin defense, Janowski variation +r1bqkbnr/ppp1pppp/2n5/8/Q1Pp4/5N2/PP1PPPPP/RNB1KB1R b KQkq - +Woozle defense * +r1bqkbnr/ppp2p1p/2n3p1/3pp3/8/3P1NP1/PPP1PP1P/RNBQKB1R w KQkq - +Pirc: Sveshnikov system * +r1bqkbnr/ppp2p1p/2n5/3pP1p1/8/5N2/PPPPP1PP/RNBQKB1R w KQkq - +Dutch: Staunton gambit, Tartakower variation * +r1bqkbnr/ppp2p1p/2np4/6N1/4PppP/2N5/PPPP2P1/R1BQKB1R w KQkq - +Vienna: Hamppe-Allgaier gambit, Alapin variation +r1bqkbnr/ppp2pp1/6n1/3p3p/8/2P3B1/PP2PPPP/RN1QKBNR w KQkq - +Caro-Kann: classical, 6.h4 * +r1bqkbnr/ppp2ppp/2n1p3/3p4/3PP3/8/PPPN1PPP/R1BQKBNR w KQkq - +French: Tarrasch, Guimard variation +r1bqkbnr/ppp2ppp/2n5/1B1p4/2PPp3/4P3/PP3PPP/RNBQK1NR b KQkq - +French: Winawer, advance variation * +r1bqkbnr/ppp2ppp/2n5/1B1p4/3Pp3/4P3/PPP2PPP/RNBQK1NR w KQkq - +French: Winawer, advance variation * +r1bqkbnr/ppp2ppp/2n5/1B1p4/3Pp3/4P3/PPPQ1PPP/RNB1K1NR b KQkq - +French: Winawer, Petrosian variation * +r1bqkbnr/ppp2ppp/2n5/1B1p4/3Pp3/4PN1P/PPP2PP1/RNBQK2R w KQkq - +French: MacCutcheon, Dr. Olland (Dutch) variation * +r1bqkbnr/ppp2ppp/2n5/1B1pp3/3P4/4P3/PPP2PPP/RNBQK1NR b KQkq - +French: Winawer (Nimzovich) variation * +r1bqkbnr/ppp2ppp/2n5/3p4/3Pp3/4PN2/PPP2PPP/RNBQKB1R w KQkq - +French: Steinitz variation * +r1bqkbnr/ppp2ppp/2n5/3p4/3Q4/2N5/PPP1PPPP/R1B1KBNR w KQkq - +KP: Nimzovich defense, Marshall gambit * +r1bqkbnr/ppp2ppp/2n5/3p4/Q3P3/8/PPP2PPP/RNB1KBNR b KQkq - +Scandinavian: Anderssen counter-attack * +r1bqkbnr/ppp2ppp/2n5/3pP3/8/4P3/PPP2PPP/RNBQKBNR b KQkq - +French: Rubinstein variation * +r1bqkbnr/ppp2ppp/2n5/3pp3/1P1P4/2P5/P3PPPP/RNBQKBNR b KQkq - +Caro-Kann: Gurgenidze counter-attack * +r1bqkbnr/ppp2ppp/2n5/3pp3/2PP4/4P3/PP3PPP/RNBQKBNR b KQkq - +French: Marshall variation * +r1bqkbnr/ppp2ppp/2n5/3pp3/3P4/2N5/PPP1PPPP/R1BQKBNR w KQkq - +KP: Nimzovich defense, Bogolyubov variation * +r1bqkbnr/ppp2ppp/2n5/3pp3/3P4/2P3P1/PP2PP1P/RNBQKBNR b KQkq - +Caro-Kann: Gurgenidze system * +r1bqkbnr/ppp2ppp/2n5/3pp3/3P4/2P5/PP2PPPP/RNBQKBNR w KQkq - +Caro-Kann defense * +r1bqkbnr/ppp2ppp/2n5/3pp3/3P4/4P3/PPP2PPP/RNBQKBNR w KQkq - +French: Paulsen variation * +r1bqkbnr/ppp2ppp/2n5/3pp3/3P4/4PN2/PPP2PPP/RNBQKB1R b KQkq - +French defense * +r1bqkbnr/ppp2ppp/2n5/3pp3/3P4/5N2/PPP1PPPP/RNBQKB1R w KQkq - +Blackmar-Diemer gambit * +r1bqkbnr/ppp2ppp/2n5/3pp3/3PP3/5N2/PPP2PPP/RNBQKB1R b KQkq - +Blackmar-Diemer: Lemberg counter-gambit * +r1bqkbnr/ppp2ppp/2n5/3pp3/4P3/2N5/PPPP1PPP/R1BQKBNR w KQkq - +Vienna: Fyfe gambit * +r1bqkbnr/ppp2ppp/2n5/3pp3/8/2P5/PPNPPPPP/R1BQKBNR b KQkq - +de Bruycker defense * +r1bqkbnr/ppp2ppp/2n5/3pp3/8/2PP1N2/PP2PPPP/RNBQKB1R b KQkq - +Pirc: Ufimtsev-Pytel variation * +r1bqkbnr/ppp2ppp/2n5/3pp3/8/3P1NP1/PPP1PP1P/RNBQKB1R b KQkq - +Pirc defense * +r1bqkbnr/ppp2ppp/2n5/3pp3/8/3P2P1/PPP1PPBP/RNBQK1NR b KQkq - +Robatsch (modern) defense * +r1bqkbnr/ppp2ppp/2n5/3pp3/8/6P1/PPPPPPBP/RNBQK1NR w KQkq - +Robatsch defense * +r1bqkbnr/ppp2ppp/2n5/4P3/2Pp4/5N2/PP1NPPPP/R1BQKB1R b KQkq - +QGD: Albin counter-gambit, Alapin variation +r1bqkbnr/ppp2ppp/2n5/4P3/2Pp4/5NP1/PP2PP1P/RNBQKB1R b KQkq - +QGD: Albin counter-gambit, 5.g3 +r1bqkbnr/ppp2ppp/2np4/1B2p3/4P3/5N2/PPPP1PPP/RNBQK2R w KQkq - +Ruy Lopez: old Steinitz defense +r1bqkbnr/ppp2ppp/3p4/8/3QP3/3B4/PPP2PPP/RNB1K2R b KQkq - +Scotch: Ghulam Kassim variation +r1bqkbnr/ppp2ppp/8/3p4/8/2P2P2/PP2PP1P/RNBQKB1R b KQkq - +Caro-Kann: Bronstein-Larsen variation * +r1bqkbnr/ppp2ppp/8/3p4/8/2P2P2/PP3PPP/RNBQKB1R b KQkq - +Caro-Kann: Tartakower (Nimzovich) variation * +r1bqkbnr/ppp2ppp/8/3pn3/3Q4/4P3/PPP2PPP/RNB1KBNR b KQkq - +French: Frere (Becker) variation * +r1bqkbnr/ppp2ppp/8/3pn3/5B2/2P5/PP2PPPP/RN1QKBNR b KQkq - +Caro-Kann: classical variation * +r1bqkbnr/ppp2ppp/8/3pn3/8/2P5/PP1NPPPP/R1BQKBNR b KQkq - +Caro-Kann: Steinitz variation * +r1bqkbnr/ppp2ppp/8/3pn3/8/2P5/PP2PPPP/RNBQKBNR w KQkq - +Caro-Kann defense * +r1bqkbnr/ppp2ppp/8/3pn3/8/4P3/PPPN1PPP/R1BQKBNR b KQkq - +French: Rubinstein variation * +r1bqkbnr/ppp3pp/2n2p2/3pP3/8/2P5/PP2PPPP/RNBQKBNR w KQkq - +Caro-Kann: Rasa-Studier gambit * +r1bqkbnr/ppp3pp/2n2p2/3pp3/Q3P3/2P2N2/PP1P1PPP/RNB1KB1R w KQkq - +Ponziani: Steinitz variation +r1bqkbnr/ppp3pp/2n2p2/4P3/2Pp4/5N2/PP1NPPPP/R1BQKB1R w KQkq - +QGD: Albin counter-gambit, Janowski variation +r1bqkbnr/ppp3pp/2n5/3p1p2/3Pp2P/2P3P1/PP2PPB1/RNBQK1NR b KQkq - +Robatsch defense: Gurgenidze variation * +r1bqkbnr/ppp3pp/2n5/3ppP2/8/2N5/PPPP1PPP/R1BQKBNR w KQkq - +Vienna: Steinitz gambit * +r1bqkbnr/ppp3pp/2n5/3ppp2/8/3P1NP1/PPP1PP1P/RNBQKB1R w KQkq - +Pirc: Austrian attack * +r1bqkbnr/ppp3pp/2n5/3ppp2/8/3P2P1/PPP1PPBP/RNBQK1NR w KQkq - +Robatsch defense: Pseudo-Austrian attack * +r1bqkbnr/ppp3pp/2n5/5p2/2pPp3/2N1P3/PP1N1PPP/R1BQKB1R b KQkq - +French: Steinitz variation * +r1bqkbnr/ppp3pp/2np4/3Ppp2/4P3/2P2N2/PP3PPP/RNBQKB1R b KQkq - +Ponziani counter-gambit, Schmidt attack +r1bqkbnr/ppp3pp/2np4/4N3/3Pp3/8/PPP2PPP/RNBQKB1R w KQkq - +Vienna gambit * +r1bqkbnr/ppp3pp/2np4/4pp2/3PP3/5N2/PPP2PPP/RNBQKB1R w KQkq - +Vienna gambit, Steinitz variation * +r1bqkbnr/ppp3pp/6n1/3p1p2/8/2P3B1/PP2PPPP/RN1QKBNR w KQkq - +Caro-Kann: classical, Mar\'oczy attack * +r1bqkbnr/pppn1ppp/3p4/4p3/3PP3/5N2/PPP2PPP/RNBQKB1R w KQkq - +Philidor: Hanham variation +r1bqkbnr/pppn1ppp/4p3/8/3PN3/8/PPP2PPP/R1BQKBNR w KQkq - +French: Rubinstein variation +r1bqkbnr/pppn1ppp/8/3p4/2PP4/8/PP3PPP/RNBQKBNR b KQkq - +French: Tarrasch, open, 4.ed ed * +r1bqkbnr/pppn1ppp/8/3pp3/2PP4/4P3/PP3PPP/RNBQKBNR b KQkq - +French: Tarrasch, open variation * +r1bqkbnr/pppn1ppp/8/3pp3/3P1P2/4P3/PPP3PP/RNBQKBNR b KQkq - +French: Tarrasch, Haberditz variation * +r1bqkbnr/pppn1ppp/8/3pp3/3P4/1QP5/PP2PPPP/RNB1KBNR b KQkq - +Caro-Kann: Edinburgh variation * +r1bqkbnr/pppn1ppp/8/3pp3/3P4/2N1P3/PPP2PPP/R1BQKBNR b KQkq - +French: Tarrasch, Guimard variation * +r1bqkbnr/pppn1ppp/8/3pp3/3P4/2P5/PP2PPPP/RNBQKBNR w KQkq - +Caro-Kann: 3.Nd2 * +r1bqkbnr/pppn1ppp/8/3pp3/3P4/4P3/PPP2PPP/RNBQKBNR w KQkq - +French: Tarrasch * +r1bqkbnr/pppn1ppp/8/3pp3/3P4/4PN2/PPP2PPP/RNBQKB1R b KQkq - +French: Tarrasch, closed variation * +r1bqkbnr/pppn2pp/3p4/4Pp2/3p4/5N2/PPP2PPP/RNBQKB1R w KQkq - +KGD: Falkbeer, Keres variation * +r1bqkbnr/pppnpppp/3p4/8/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +Valencia opening * +r1bqkbnr/pppp1p1p/2n3p1/1B2p3/4P3/5N2/PPPP1PPP/RNBQK2R w KQkq - +Ruy Lopez: fianchetto (Smyslov/Barnes) defense +r1bqkbnr/pppp1p1p/2n3p1/3N4/3pP3/5N2/PPP2PPP/R1BQKB1R b KQkq - +Three knights: Steinitz, Rosenthal variation +r1bqkbnr/pppp1p1p/2n3p1/4p3/2P5/2N5/PP1PPPPP/R1BQKBNR w KQkq - +Sicilian: closed * +r1bqkbnr/pppp1p1p/2n3p1/4p3/2PP4/4P3/PP3PPP/RNBQKBNR b KQkq - +Sicilian: closed, Korchnoi variation * +r1bqkbnr/pppp1p1p/2n3p1/4p3/4P3/2N2N2/PPPP1PPP/R1BQKB1R w KQkq - +Three knights: Steinitz variation +r1bqkbnr/pppp1p1p/2n3p1/4p3/4P3/2N5/PPPP1PPP/R1BQKBNR w KQkq - +Vienna: Paulsen variation * +r1bqkbnr/pppp1p1p/2n3p1/4p3/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - +Vienna: Paulsen-Mieses variation * +r1bqkbnr/pppp1p1p/2n5/1B2p1p1/4P3/5N2/PPPP1PPP/RNBQK2R w KQkq - +Ruy Lopez: Brentano defense +r1bqkbnr/pppp1p1p/2n5/4N3/4PppP/8/PPPP2P1/RNBQKB1R w KQkq - +KGA: Kieseritsky, Neumann defense +r1bqkbnr/pppp1p1p/2n5/6N1/4PppP/2N5/PPPP2P1/R1BQKB1R b KQkq - +Vienna: Hamppe-Allgaier gambit +r1bqkbnr/pppp1p1p/2n5/6p1/2B1Pp2/5N2/PPPP2PP/RNBQK2R w KQkq - +KGA: Blachly gambit +r1bqkbnr/pppp1p1p/2n5/6p1/3PPp2/2N2N2/PPP3PP/R1BQKB1R b KQkq - +Vienna: Pierce gambit +r1bqkbnr/pppp1p1p/2n5/8/2B1Pp2/5Q2/PPPP2PP/RNB2RK1 w kq - +KGA: Muzio gambit, Holloway defense +r1bqkbnr/pppp1p1p/2n5/8/2B1Ppp1/2N2N2/PPPP2PP/R1BQ1RK1 b kq - +Vienna: Hamppe-Muzio gambit +r1bqkbnr/pppp1ppp/2n5/1B2p3/4P3/5N2/PPPP1PPP/RNBQK2R b KQkq - +Ruy Lopez (Spanish opening) +r1bqkbnr/pppp1ppp/2n5/1B6/3pP3/5N2/PPP2PPP/RNBQK2R b KQkq - +Scotch: Relfsson gambit (`MacLopez') +r1bqkbnr/pppp1ppp/2n5/4p3/2B1P3/2P2N2/P2P1PPP/RNBQK2R w KQkq - +Evans gambit: Mayet defense +r1bqkbnr/pppp1ppp/2n5/4p3/2B1P3/5N2/PPPP1PPP/RNBQK2R b KQkq - +King's pawn game +r1bqkbnr/pppp1ppp/2n5/4p3/2P1P3/5N2/PP1P1PPP/RNBQKB1R b KQkq - +Dresden opening +r1bqkbnr/pppp1ppp/2n5/4p3/2P5/2N2N2/PP1PPPPP/R1BQKB1R b KQkq - +English: three knights system +r1bqkbnr/pppp1ppp/2n5/4p3/2P5/2N5/PP1PPPPP/R1BQKBNR b KQkq - +Sicilian: closed, 2...Nc6 * +r1bqkbnr/pppp1ppp/2n5/4p3/2P5/2N5/PP1PPPPP/R1BQKBNR w KQkq - +English: Sicilian reversed +r1bqkbnr/pppp1ppp/2n5/4p3/2P5/8/PP1PPPPP/RNBQKBNR w KQkq - +Sicilian: closed * +r1bqkbnr/pppp1ppp/2n5/4p3/3P4/5N2/PPP1PPPP/RNBQKB1R b KQkq - +Alekhine's defense: Scandinavian variation * +r1bqkbnr/pppp1ppp/2n5/4p3/3PP3/2N5/PPP2PPP/R1BQKBNR b KQkq - +Vienna: Fyfe gambit +r1bqkbnr/pppp1ppp/2n5/4p3/3PP3/5N2/PPP2PPP/RNBQKB1R b KQkq - +Scotch opening +r1bqkbnr/pppp1ppp/2n5/4p3/4P3/2N2N2/PPPP1PPP/R1BQKB1R b KQkq - +Three knights game +r1bqkbnr/pppp1ppp/2n5/4p3/4P3/2N3P1/PPPP1P1P/R1BQKBNR b KQkq - +Vienna: Paulsen variation +r1bqkbnr/pppp1ppp/2n5/4p3/4P3/2N5/PPPP1PPP/R1BQKBNR b KQkq - +Vienna game, Max Lange defense * +r1bqkbnr/pppp1ppp/2n5/4p3/4P3/2N5/PPPP1PPP/R1BQKBNR w KQkq - +Vienna game, Max Lange defense +r1bqkbnr/pppp1ppp/2n5/4p3/4P3/2P2N2/PP1P1PPP/RNBQKB1R b KQkq - +Ponziani opening +r1bqkbnr/pppp1ppp/2n5/4p3/4P3/5N2/PPPP1PPP/RNBQKB1R b KQkq - +Vienna: Falkbeer variation * +r1bqkbnr/pppp1ppp/2n5/4p3/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - +King's pawn game +r1bqkbnr/pppp1ppp/2n5/4p3/4P3/5N2/PPPPBPPP/RNBQK2R b KQkq - +Inverted Hungarian +r1bqkbnr/pppp1ppp/2n5/4p3/4P3/5NP1/PPPP1P1P/RNBQKB1R b KQkq - +Konstantinopolsky opening +r1bqkbnr/pppp1ppp/2n5/4p3/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +Vienna game * +r1bqkbnr/pppp1ppp/2n5/4p3/4PP2/2N5/PPPP2PP/R1BQKBNR b KQkq - +Vienna gambit +r1bqkbnr/pppp1ppp/2n5/4p3/8/2P5/PP1PPPPP/RNBQKBNR w KQkq - +Caro-Kann defense * +r1bqkbnr/pppp1ppp/2n5/4p3/8/4P3/PPPP1PPP/RNBQKBNR w KQkq - +French defense * +r1bqkbnr/pppp1ppp/2n5/8/2B1Pp2/8/PPPP2PP/RNBQK1NR w KQkq - +KGA: bishop's gambit, Maurian defense +r1bqkbnr/pppp1ppp/2n5/8/2BpP3/5N2/PPP2PPP/RNBQK2R b KQkq - +Scotch gambit +r1bqkbnr/pppp1ppp/2n5/8/2Q1P3/8/PPP2PPP/RNB1KBNR b KQkq - +Center game: Hall variation +r1bqkbnr/pppp1ppp/2n5/8/3NP3/8/PPP2PPP/RNBQKB1R b KQkq - +Scotch game +r1bqkbnr/pppp1ppp/2n5/8/3Np3/8/PPPPPPPP/RNBQKB1R w KQkq - +Alekhine's defense: S\"amisch attack * +r1bqkbnr/pppp1ppp/2n5/8/3P4/4p3/PPPNPPPP/RNBQKB1R w KQkq - +Alekhine's defense: Spielmann variation * +r1bqkbnr/pppp1ppp/2n5/8/3PPp2/2N5/PPP3PP/R1BQKBNR b KQkq - +Vienna: Steinitz gambit +r1bqkbnr/pppp1ppp/2n5/8/3QP3/8/PPP2PPP/RNB1KBNR w KQkq - +Center game +r1bqkbnr/pppp1ppp/2n5/8/3pP3/2P2N2/PP3PPP/RNBQKB1R b KQkq - +Scotch: G\"oring gambit +r1bqkbnr/pppp1ppp/2n5/8/4P3/4Q3/PPP2PPP/RNB1KBNR b KQkq - +Center game: Paulsen attack +r1bqkbnr/pppp1ppp/2n5/8/4Pp2/2N2N2/PPPP2PP/R1BQKB1R b KQkq - +Vienna gambit +r1bqkbnr/pppp1ppp/2n5/8/8/3Q4/PPP1PPPP/RNB1KBNR b KQkq - +Scandinavian: Pytel-Wade variation * +r1bqkbnr/pppp1ppp/8/1B2p3/3nP3/5N2/PPPP1PPP/RNBQK2R w KQkq - +Ruy Lopez: Bird's defense +r1bqkbnr/pppp1ppp/8/4n3/3PP3/8/PPP2PPP/RNBQKB1R b KQkq - +Irish (Chicago) gambit +r1bqkbnr/pppp1ppp/8/4p3/3nP3/5N2/PPP2PPP/RNBQKB1R w KQkq - +Scotch: Lolli variation +r1bqkbnr/pppp1ppp/8/nB2p3/4P3/5N2/PPPP1PPP/RNBQK2R w KQkq - +Ruy Lopez: Pollock defense +r1bqkbnr/pppp2pp/2n2p2/1B2p3/4P3/5N2/PPPP1PPP/RNBQK2R w KQkq - +Ruy Lopez: Nuremberg variation +r1bqkbnr/pppp2pp/2n5/1B2pp2/4P3/2N2N2/PPPP1PPP/R1BQK2R b KQkq - +Ruy Lopez: Schliemann defense, Berger variation +r1bqkbnr/pppp2pp/2n5/1B2pp2/4P3/5N2/PPPP1PPP/RNBQK2R w KQkq - +Ruy Lopez: Schliemann defense +r1bqkbnr/pppp2pp/2n5/4Np2/4P3/8/PPPP1PPP/RNBQKB1R w KQkq - +Latvian: Fraser defense +r1bqkbnr/pppp2pp/2n5/4pP2/8/8/PPPP1PPP/RNBQKBNR w KQkq - +KGA: Keres (Mason-Steinitz) gambit * +r1bqkbnr/pppp2pp/2n5/4pp2/2B1P3/5N2/PPPP1PPP/RNBQK2R w KQkq - +Rousseau gambit +r1bqkbnr/pppp2pp/2n5/4pp2/2P5/2N5/PP1PPPPP/R1BQKBNR w KQkq - +Sicilian: Grand Prix attack * +r1bqkbnr/pppp2pp/2n5/4pp2/3P4/4P3/PPP2PPP/RNBQKBNR w KQkq - +French: Pelikan variation * +r1bqkbnr/pppp2pp/2n5/4pp2/3PP3/5N2/PPP2PPP/RNBQKB1R b KQkq - +Vienna gambit * +r1bqkbnr/pppp2pp/2n5/4pp2/3PP3/8/PPP2PPP/RNBQKBNR w KQkq - +KGD: Falkbeer, Milner-Barry variation * +r1bqkbnr/pppp2pp/2n5/4pp2/4P3/2N2N2/PPPP1PPP/R1BQKB1R w KQkq - +Three knights: Winawer defense (Gothic defense) +r1bqkbnr/pppp2pp/2n5/4pp2/4P3/2N5/PPPP1PPP/R1BQKBNR w KQkq - +Vienna gambit * +r1bqkbnr/pppp2pp/2n5/4pp2/4P3/2P2N2/PP1P1PPP/RNBQKB1R w KQkq - +Ponziani counter-gambit +r1bqkbnr/pppp2pp/2n5/4pp2/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - +Vienna gambit * +r1bqkbnr/pppp2pp/2n5/5p2/4P3/4Q3/PPP2PPP/RNB1KBNR w KQkq - +Center game: l'Hermet variation +r1bqkbnr/pppp3p/2n5/4Ppp1/8/5N2/PPPPP1PP/RNBQKB1R w KQkq - +Bird's opening, Swiss gambit * +r1bqkbnr/ppppp1pp/2n2p2/8/3PP3/8/PPP2PPP/RNBQKBNR w KQkq - +KP: Neo-Mongoloid defense +r1bqkbnr/ppppp1pp/2n5/5p2/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - +KP: Colorado counter +r1bqkbnr/pppppppp/2n5/8/3P4/8/PPP1PPPP/RNBQKBNR w KQkq - +Queen's pawn: Lundin (Kevitz-Mikenas) defense +r1bqkbnr/pppppppp/2n5/8/3PP3/2P5/P4PPP/RNBQKBNR b KQkq - +KP: Nimzovich defense, Wheeler gambit +r1bqkbnr/pppppppp/2n5/8/3PP3/8/PPP2PPP/RNBQKBNR b KQkq - +KP: Nimzovich defense +r1bqkbnr/pppppppp/2n5/8/4P3/5N2/PPPP1PPP/RNBQKB1R b KQkq - +KP: Nimzovich defense +r1bqkbnr/pppppppp/2n5/8/4P3/8/PPPP1PPP/RNBQKBNR b KQkq - +Dunst (Sleipner,Heinrichsen) opening * +r1bqkbnr/pppppppp/2n5/8/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +KP: Nimzovich defense +r1bqkbnr/pppppppp/2n5/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - +Dunst (Sleipner, Heinrichsen) opening * +r1bqkbnr/pppppppp/n7/8/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +Lemming defense +r1bqkbnr/pppppppp/n7/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - +Durkin's attack * +r1bqnrk1/p2p1ppp/1pn1p3/2p5/2PPP3/P1PB4/4NPPP/R1BQK2R w KQ - +Nimzo-Indian: S\"amisch, Capablanca variation +r1bqnrk1/pp2b1pp/2n2p2/2p1p3/3pPP2/3P2P1/PPPNN1BP/R1BQ1RK1 b - - +King's Indian: orthodox, Aronin-Taimanov, main line * +r1bqnrk1/pp2b2p/2n2p2/2p1p1p1/3pPP2/3P2P1/PPPNN1BP/R1BQ1RK1 w - - +King's Indian: orthodox, Aronin-Taimanov, Benk\"o attack * +r1bqnrk1/pp2bppp/2n5/2p1p3/3pP3/3P1NP1/PPP1NPBP/R1BQ1RK1 w - - +King's Indian: orthodox, Aronin-Taimanov, 9.Ne1 * +r1bqr1k1/1p1n1pbp/p2p1np1/2pP4/P7/2N3P1/1P1NPPBP/R1BQ1RK1 w - - +Benoni: fianchetto, 11...Re8 +r1bqr1k1/p1p2ppp/2pp1n2/4p3/1b2P3/2NP1N2/PPP2PPP/R1BQ1RK1 w - - +Four knights: Janowski variation * +r1bqr1k1/pp1n1ppp/2p2n2/b2pp3/4P3/P1NP1N2/1PP1BPPP/R2QBRK1 b - - +Ruy Lopez: Kecskem\'et variation * +r1bqr1k1/pp1n1ppp/2pb1n2/3pN1B1/3P1P2/2N5/PPP1B1PP/R2QK2R w KQ - +Petrov: classical attack, Berger variation * +r1bqr1k1/pp2bppp/2n2n2/2ppp3/4P3/3P1NP1/PPPN1PBP/R1BQ1RK1 w - - +King's Indian: orthodox, 7...Nbd7, 8.Re1 * +r1bqr1k1/pp2ppbp/2n2np1/2pp4/5P2/3PPN2/PPP1B1PP/RNB1QRK1 w - - +Dutch: Ilyin-Genevsky, Winter variation * +r1bqr1k1/pp3pbp/n2p1np1/2pP4/4P3/2N2P2/PP1NB1PP/R1BQ1RK1 b - - +Benoni: classical, 11.f3 +r1bqr1k1/pp3pbp/n2p1np1/2pP4/4P3/2N5/PP1NBPPP/R1BQ1RK1 w - - +Benoni: classical with ...Re8 and ...Na6 +r1bqr1k1/ppb2pp1/2p1nn1p/3pp3/NPP1P3/P2P1NP1/2QBBP1P/R3R1K1 b - - +Ruy Lopez: closed, Chigorin, Yugoslav system * +r1bqr1k1/ppbn1pp1/2p2n1p/3pp3/1PP1P3/P1NP1N2/2Q1BPPP/R1B2RK1 b - - +Ruy Lopez: closed, Chigorin, 12...Nc6 * +r1bqr1k1/ppbn1pp1/2p2n1p/3pp3/1PP1P3/P2P1N2/1B1NBPPP/R2Q1RK1 b - - +Ruy Lopez: closed, Breyer, Gligori\'c variation * +r1bqr1k1/ppbn1pp1/2p2n1p/4p3/1PPpP1P1/P2P1N2/2Q1BP1P/RNB1K2R b KQ - +Ruy Lopez: closed, Leonhardt variation * +r1bqr1k1/ppbn1pp1/2p2n1p/4p3/1Pp1P3/P1NP1N2/2Q1BPPP/R1B2RK1 w - - +Ruy Lopez: closed, Chigorin, Rauzer attack * +r1bqr1k1/ppbn1pp1/5n1p/3pp3/NP2P3/P2P1N2/2Q1BPPP/R1B2RK1 w - - +Ruy Lopez: closed, Chigorin, 12...c5d4 * +r1bqr1k1/ppp2ppp/2n2n2/2bPN3/3P4/2N5/PPP2PPP/R1BQKB1R w KQ - +two knights defense: Canal variation * +r1bqr1k1/ppp2ppp/2n2n2/3pp3/1b2P3/2NP1N2/PPPBBPPP/R2Q1RK1 b - - +Ruy Lopez: Berlin defense, Tarrasch trap * +r1bqr1k1/ppp2ppp/2n2n2/4N3/3PpP2/P1P5/2P3PP/R1BQKB1R w KQ - +Ruy Lopez: Steinitz defense deferred, Boleslavsky variation * +r1bqr1k1/ppp2ppp/2np1n2/8/1bB1P3/2N1Q2N/PPPB1PPP/2KR3R b - - +Center game: Kupreichik variation +r1bqr1k1/ppp2ppp/8/2PPn3/2B2Qn1/2N1Bp2/PPP2PPP/R3K2R w KQ - +two knights: Max Lange attack, Marshall variation * +r1bqr1k1/ppp2ppp/8/2PPn3/5Qn1/2N1Bp2/PPP2PPP/R3KB1R b KQ - +two knights: Max Lange attack, Rubinstein variation * +r1bqr1k1/ppp2ppp/8/3pn3/3Q4/P1P1B3/1PP2PPP/R3KB1R b KQ - +Four knights: Spielmann variation * +r1bqr1k1/ppp4p/8/2PPnpp1/6n1/1BN1BpQ1/PPP2PPP/2KR3R b - - +two knights: Max Lange attack, Berger variation * +r1bqr1k1/pppn1pbp/3p1np1/4p3/2PP4/2N1PN2/PP2BPPP/R1BQ1RK1 w - - +R\'eti: King's Indian attack, French variation * +r1bqr1k1/pppp1ppp/2n2n2/3NpQ2/1bP5/4PN2/PP1P1PPP/R1B1KB1R b KQ - +English: four knights, Stean variation +r1bqrbk1/pp3ppp/2n2n2/2ppp3/P3P3/2PP1NP1/1P1N1PBP/R1BQ1RK1 b - - +King's Indian: orthodox, 7...Nbd7, main line * +r1bqrnk1/ppp1bppp/5n2/3p2B1/3P4/2NBP3/PPQ1NPPP/2KR3R b - - +QGD: exchange, chameleon variation +r1br2k1/p1q1ppbp/1pn2np1/2pp4/1P1P4/2P1PN2/PB1NBPPP/R2Q1RK1 b - - +Catalan: closed, Spassky gambit * +r1br2k1/p3ppbp/1pn2np1/2pq4/8/PP1PPN2/1B1NBPPP/R2QK2R b KQ - +English: symmetrical, hedgehog, flexible formation * +r1br2k1/p4ppp/1qn2n2/2b5/B3p3/2N3Q1/PPPPNPPP/R1B1K2R w KQ - +Evans gambit: compromised defense, Potter variation * +r1br2k1/pp2qppp/1bn1pn2/3p4/1PP5/P2BPN2/1B1N1PPP/R2QK2R b KQ - +QGA: classical, Smyslov variation * +r1br2k1/ppq2ppp/2n1pn2/2P5/1P1p4/P3PN2/1BQ2PPP/R3KB1R b KQ - +QGA: classical, Flohr variation * +r1q2rk1/pp2ppbp/2npbnp1/8/4PP2/1NN1B3/PPP1B1PP/R2Q1RK1 w - - +Sicilian: dragon, classical, R\'eti-Tartakower variation +r1r3k1/pp1bppbp/2np1np1/q7/3NP2P/1BN1BP2/PPPQ2P1/2KR3R b - - +Sicilian: dragon, Yugoslav attack, 12.h4 +r2n1rk1/ppp1qppp/3p1n2/1B2p1B1/3PP1b1/2P2N2/P1P2PPP/R2QR1K1 w - - +Four knights: symmetrical, Capablanca variation +r2q1bnr/ppp1kBpp/3p4/3NN3/4P3/8/PP3PPP/R1Bb1RK1 b - - +Scotch: Sea-cadet mate +r2q1knr/pppb1Bpp/1b1p4/n7/3PP3/2N2N2/P1Q2PPP/R1B2RK1 b - - +Evans gambit: Fraser-Mortimer attack +r2q1rk1/1b1nbppp/p2p1n2/1pp1p3/3PP3/2P2N1P/PPBN1PP1/R1BQR1K1 w - - +Ruy Lopez: closed, Breyer, Gligori\'c variation +r2q1rk1/1bp1bppp/p1np1n2/1p2p3/4P3/1BP2N1P/PP1P1PP1/RNBQR1K1 w - - +Ruy Lopez: closed, Flohr-Zaitsev system (Lenzerheide variation) +r2q1rk1/2p1bppp/p1n1b3/1p1pP3/4n3/1BP2N2/PP1NQPPP/R1B2RK1 b - - +Ruy Lopez: open, Malkin variation +r2q1rk1/2p1bppp/p1np1n2/1p2p3/3PP1b1/1BP2N2/PP3PPP/RNBQR1K1 w - - +Ruy Lopez: closed, Bogolyubov variation +r2q1rk1/2p1bppp/p1npbn2/1p2p3/4P3/1BP2N1P/PP1P1PP1/RNBQR1K1 w - - +Ruy Lopez: closed, Kholmov variation +r2q1rk1/2p1bppp/p3b3/1p1pn3/3Nn3/1BP5/PP3PPP/RNBQR1K1 w - - +Ruy Lopez: open, Breslau variation +r2q1rk1/2p2ppp/p1n1b3/1pbpP3/8/2P2N2/PPBN1nPP/R1BQ1RK1 w - - +Ruy Lopez: open, Dilworth variation +r2q1rk1/3nbppp/bpp1pn2/p2p4/2PP4/1P3NP1/PBQNPPBP/R4RK1 w - - +Catalan: closed, Sokolsky variation +r2q1rk1/p1p2ppp/2pp1n2/4p3/1b2P1b1/2NP1N2/PPP1QPPP/R1B2RK1 b - - +Four knights: symmetrical, Metger unpin * +r2q1rk1/p3bppp/1pn1bn2/2pp2B1/3P4/2N2NP1/PP2PPBP/2RQ1RK1 w - - +QGD: Tarrasch, Stoltz variation +r2q1rk1/p3n1pp/2p1bp2/3pp1B1/N1P5/6P1/PP2PbBP/R2Q1RK1 w - - +Gr\"unfeld: exchange, Seville variation * +r2q1rk1/p3n1pp/3bbp2/3pp3/N7/4B1P1/PP2PPBP/R2Q1RK1 b - - +Gr\"unfeld: Spassky variation, main line, 13.Bd3 * +r2q1rk1/p3n1pp/3bbp2/4p3/N2p4/4B1P1/PP2PPBP/R2Q1RK1 w - - +Gr\"unfeld: exchange, Sokolsky variation * +r2q1rk1/p3nppp/4b3/2bpp3/8/2N3P1/PP2PPBP/R1BQ1RK1 w - - +Gr\"unfeld: Spassky variation, main line, 10...cd, 11.cd * +r2q1rk1/p4ppp/2n1bn2/2bpp3/N7/1B1P1P2/PPP3PP/R1BQK1NR w KQ - +Evans gambit: Steinitz variation * +r2q1rk1/p4ppp/2n2n2/2bpp3/N5b1/1B1P4/PPP2PPP/R1BQK1NR w KQ - +Evans gambit: G\"oring attack * +r2q1rk1/p4ppp/b1B2n2/2bp4/8/2N5/PPPP1PPP/R1BQK2R w KQ - +Giuoco Piano: Aitken variation * +r2q1rk1/p4ppp/b1p2n2/2bpN3/3P4/2N5/PPP2PPP/R1BQK2R w KQ - +Giuoco Piano: Steinitz variation * +r2q1rk1/pb1nbppp/2p1pn2/1p1p4/2PP4/1PN2NP1/P1Q1PPBP/R1BR2K1 w - - +Catalan: closed, Spassky gambit +r2q1rk1/pp1bbppp/2nppn2/8/4PP2/1NN1B3/PPP1B1PP/R2Q1RK1 b - - +Sicilian: modern Scheveningen, main line with Nb3 +r2q1rk1/pp1bppbp/2np1np1/8/2BNP3/2N1BP2/PPPQ2PP/2KR3R b - - +Sicilian: dragon, Yugoslav attack, 10.O-O-O +r2q1rk1/pp1bppbp/2np1np1/8/2BNP3/2N1BP2/PPPQ2PP/R3K2R w KQ - +Sicilian: dragon, Yugoslav attack, 9...Bd7 +r2q1rk1/pp2b1pp/2n1bn2/2pp4/4pB2/1NN1P3/PPPQBPPP/2KR3R b - - +Alekhine's defense: four pawns attack, Tartakower variation * +r2q1rk1/pp2bpp1/2n2n1p/2pp1b2/5B2/1NNP2P1/PP2PPBP/R2Q1RK1 w - - +Alekhine's defense: exchange, Karpov variation * +r2q1rk1/pp2bppp/2n1bn2/3p2B1/2pP4/2N2NP1/PP2PPBP/2RQ1RK1 w - - +QGD: Tarrasch, Bogolyubov variation +r2q1rk1/pp2bppp/2npbn2/2p3B1/4P3/2N2N2/PPP1BPPP/R2QR1K1 b - - +Philidor: Berger variation +r2q1rk1/pp2pBbp/6p1/n1p5/3PP1b1/2P1BP2/P3N1PP/R2Q1RK1 b - - +Gr\"unfeld: exchange, Seville variation +r2q1rk1/pp2ppbp/1nnp2p1/5b2/2PP1B2/2N2N1P/PP2BPP1/R2Q1RK1 b - - +Alekhine's defense: exchange, Karpov variation +r2q1rk1/pp2ppbp/2n2np1/3p4/2PP2b1/2N2N2/PP2BPPP/R1BQ1RK1 w - - +QGD: Tarrasch, Prague variation, 9.Bg5 * +r2q1rk1/pp2ppbp/3p1np1/n4P2/2b1P3/1NNBB3/PPP3PP/R2Q1RK1 b - - +Sicilian: dragon, classical, Spielmann variation +r2q1rk1/pp2ppbp/4b1p1/n2P4/4P3/3BBP2/P3N1PP/R2Q1RK1 b - - +Gr\"unfeld: exchange, Sokolsky variation +r2q1rk1/pp2ppbp/4b1p1/n7/3PP3/3BBP2/P3N1PP/R2Q1RK1 w - - +Gr\"unfeld: Spassky variation, main line, 13.Bd3 +r2q1rk1/pp2ppbp/5np1/n2p1P2/4P3/1NNPB3/PP4PP/R2Q1RK1 w - - +Sicilian: dragon, classical, Bernard defense +r2q1rk1/pp4pp/1nnpb3/4p3/N2P1p2/5NP1/PP2PPBP/R2Q1RK1 b - - +Sicilian: dragon, classical, Bernard defense * +r2q1rk1/ppp1b1pp/1nn1b3/4pp2/8/2NPBNP1/PP2PPBP/R1Q2RK1 b - - +Sicilian: dragon, classical, R\'eti-Tartakower variation * +r2q1rk1/ppp1b1pp/1nn1b3/4pp2/8/2NPPN2/PP1BBPPP/R2Q1RK1 w - - +Sicilian: modern Scheveningen, main line with Nb3 * +r2q1rk1/ppp1b1pp/2n1b3/3n1p2/4p3/1QNP1NP1/PP2PPBP/R1B2RK1 w - - +Sicilian: dragon, classical, Zollner gambit * +r2q1rk1/ppp1b1pp/2n1b3/3npp2/8/2NPPN2/PP2BPPP/R1BQ1RK1 w - - +Sicilian: modern Scheveningen, main line * +r2q1rk1/ppp1b1pp/2n1b3/3npp2/8/P1NPPN2/1PQ2PPP/R1B1KB1R w KQ - +Sicilian: Scheveningen, classical * +r2q1rk1/ppp1bppp/1nn1b3/4p3/8/2NP1NP1/PP2PPBP/R1BQ1RK1 w - - +Sicilian: dragon, classical, 9.Nb3 * +r2q1rk1/ppp1bppp/1nn1b3/4p3/P7/2NP1NP1/1P2PPBP/R1BQ1RK1 b - - +Sicilian: dragon, classical, Alekhine variation * +r2q1rk1/ppp1bppp/2n1b3/3np3/8/2NP1NP1/PP2PPBP/R1BQK2R w KQ - +Sicilian: dragon, classical, 8.O-O * +r2q1rk1/ppp1ppbp/1nn3p1/8/3PP1b1/2NQBN2/PP2BPPP/2KR3R b - - +Gr\"unfeld: Russian, Keres variation +r2q1rk1/ppp1ppbp/2np1np1/5b2/2PP4/2N2NP1/PP2PPBP/R1BQ1RK1 w - - +King's Indian: fianchetto, lesser Simagin (Spassky) variation +r2q1rk1/ppp1ppbp/2np1np1/8/2PP2b1/2N2NP1/PP2PPBP/R1BQ1RK1 w - - +King's Indian: fianchetto, Simagin variation +r2q1rk1/ppp2ppp/1bnp4/1B2p2n/3PP1b1/2PQ1N2/PP2NPPP/R1B2RK1 b - - +Four knights: symmetrical, Blake variation * +r2q1rk1/ppp2ppp/2n2n2/3pp3/1b2P1b1/2NP1N2/PPPBBPPP/R2QK2R w KQ - +Ruy Lopez: closed Berlin defense, Bernstein variation * +r2q1rk1/ppp2ppp/2np1n2/1B2p3/1b2P1b1/2NPBN2/PPP2PPP/R2Q1RK1 b - - +Four knights: symmetrical, Tarrasch variation * +r2q1rk1/ppp2ppp/2np1n2/1B2p3/1b2P1b1/3P1N2/PPP1NPPP/R1BQ1RK1 b - - +Four knights: symmetrical, Pillsbury variation * +r2q1rk1/ppp2ppp/2npbn2/1B2p1B1/1b2P3/2NP1N2/PPP2PPP/R2Q1RK1 w - - +Four knights: symmetrical, Tarrasch variation +r2q1rk1/ppp3pp/1nnbb3/2B1p3/N4p2/3P1NP1/PP2PPBP/R2Q1RK1 w - - +Sicilian: dragon, classical, Spielmann variation * +r2q1rk1/ppp3pp/2n5/2bNp3/4P1b1/5N2/PPP1QPPP/R1B1K2R w KQ - +Giuoco piano: Holzhausen attack * +r2q1rk1/pppbbppp/2np1n2/1B2p3/3PP3/2N2N2/PPP2PPP/R1BQR1K1 w - - +Ruy Lopez: Berlin defense, Tarrasch trap +r2q1rk1/pppnbppp/8/8/1n6/2N3Q1/PPPP1PPP/R1BK2NR b - - +Scotch: Rosenthal variation * +r2q2k1/pp3ppp/8/2b1r3/3p4/3P4/PPP1NPPn/R1BQ1RK1 w - - +Giuoco Piano: Therkatz-Herzog variation * +r2qbrk1/1pp1bppp/p1np1n2/4p3/B2PP3/2P2N2/PP1N1PPP/R1BQR1K1 w - - +Ruy Lopez: Kecskem\'et variation +r2qk1nr/pp2bppp/2n1b3/2ppp3/8/3P1NP1/PPP1PPBP/RNBQ1RK1 w kq - +King's Indian: Semi-Averbakh system * +r2qk1nr/pp2bppp/2n5/2p1p3/2Pp2b1/3PPNP1/PP3PBP/RNBQ1RK1 b kq - +King's Indian: Averbakh, main line * +r2qk1nr/pp2bppp/2n5/2ppp3/2P3b1/3P1NP1/PP2PPBP/RNBQ1RK1 b kq - +King's Indian: Averbakh, 6...c5 * +r2qk1nr/pp2bppp/2n5/2ppp3/6b1/3P1NP1/PPP1PPBP/RNBQ1RK1 w kq - +King's Indian: Averbakh system * +r2qk1nr/pp4pp/2nbbp2/2ppp3/8/P1PP1NP1/1P2PPBP/RNBQ1RK1 b kq - +King's Indian: S\"amisch, Byrne variation * +r2qk1nr/ppp1npbp/3pb1p1/3Np3/2P5/4P1P1/PP1P1PBP/R1BQK1NR w KQkq - +Sicilian: closed, Smyslov variation * +r2qk1nr/ppp2pbp/2npb1p1/4p3/2P5/2N1P1P1/PP1PNPBP/R1BQK2R w KQkq - +English: closed, Hort variation +r2qk1nr/ppp2pbp/2npb1p1/4p3/2P5/2NP2P1/PP2PPBP/R1BQK1NR w KQkq - +Sicilian: closed, 6.Be3 * +r2qk1nr/ppp2ppp/1bnp4/8/2BPP1b1/2N2N2/P4PPP/R1BQ1RK1 w kq - +Evans gambit +r2qk1nr/ppp2ppp/1bnp4/8/Q1BPP1b1/2N2N2/P4PPP/R1B2RK1 b kq - +Evans gambit: Fraser attack +r2qk1nr/ppp2ppp/2nb4/3p4/3Pp3/4P3/PPPNQPPP/RNB1K2R w KQkq - +French: classical, Tarrasch variation * +r2qk1nr/ppp2ppp/2np4/2b5/2BpP1b1/2P2N2/PP3PPP/RNBQ1RK1 w kq - +Scotch gambit: Anderssen (Paulsen, Suhle) counter-attack +r2qk1nr/ppp2ppp/2np4/b3p3/2BPP1b1/2P2N2/P4PPP/RNBQ1RK1 w kq - +Evans gambit: Alapin-Steinitz variation +r2qk1nr/pppb1ppp/2nb4/1B1p4/2PQ4/4P3/PP3PPP/RNB1K1NR w KQkq - +French: Winawer, Kondratiyev variation * +r2qk1nr/pppb1ppp/2np4/b3p3/2BPP3/2P2N2/P4PPP/RNBQ1RK1 w kq - +Evans gambit: Sanders-Alapin variation +r2qk2r/1b1n1ppp/p2bpn2/1pp5/3P4/1BN1PN2/PP2QPPP/R1BR2K1 w kq - +QGA: classical, Smyslov variation +r2qk2r/1b1nbppp/pp1ppn2/8/2PQ4/1PN2NP1/P3PPBP/R1BR2K1 w kq - +English: symmetrical, hedgehog, flexible formation +r2qk2r/1bppbppp/p1n2n2/1p2p3/4P3/1B3N2/PPPP1PPP/RNBQR1K1 w kq - +Ruy Lopez: Trajkovi\'c counter-attack +r2qk2r/1p1bbppp/p1nppn2/6B1/3NPP2/2N5/PPPQ2PP/2KR1B1R w kq - +Sicilian: Richter-Rauzer, Rauzer attack, 7...a6 defense, 9...Be7 +r2qk2r/2p1bppp/p1n1b3/1p1pP3/2P1n3/1B3N2/PP2QPPP/RNB2RK1 b kq - +Ruy Lopez: open, Howell attack, Adam variation +r2qk2r/2p1bppp/p1n1b3/1p1pP3/4n3/1BP2N2/PP3PPP/RNBQ1RK1 w kq - +Ruy Lopez: open, classical defense +r2qk2r/2p1bppp/p1n1b3/1p1pP3/4n3/1BP2N2/PP3PPP/RNBQR1K1 b kq - +Ruy Lopez: open, 9...Be7, 10.Re1 +r2qk2r/2p1bppp/p1np1n2/1p2p3/3PP1b1/1BP2N2/PP2QPPP/RNB1K2R w KQkq - +Ruy Lopez: Wormald attack, Gr\"unfeld variation +r2qk2r/2p1nppp/p3b3/1pbpP3/4n3/1BPQ1N2/PP3PPP/RNB2RK1 w kq - +Ruy Lopez: open, Motzko attack, Nenarokov variation +r2qk2r/2p2ppp/p1n1b3/1pbpP3/4n3/1BP2N2/PP1N1PPP/R1BQ1RK1 b kq - +Ruy Lopez: open, St. Petersburg variation +r2qk2r/2p2ppp/p1n1b3/1pbpP3/4n3/1BP2N2/PP3PPP/RNBQ1RK1 w kq - +Ruy Lopez: open, Italian variation +r2qk2r/2p2ppp/p1n1b3/1pbpP3/4n3/1BPQ1N2/PP3PPP/RNB2RK1 b kq - +Ruy Lopez: open, Motzko attack +r2qk2r/3bbppp/p1nppB2/1p6/4PP2/2N2N2/PPPQ2PP/2KR1B1R b kq - +Sicilian: Richter-Rauzer, Rauzer attack, 7...a6 defense, 11.Bxf6 +r2qk2r/p1pn1ppp/8/3pp3/Np2b1Q1/1B6/PPP2K1P/R1B3R1 w kq - +Evans gambit declined, Pavlov variation * +r2qk2r/pp1bppbp/2n2np1/2ppN3/8/1P2P3/PBPPBPPP/RN1QK2R w KQkq - +Queen's Indian: Opo\v censky variation * +r2qk2r/pp2b1pp/2n1b3/2pnpp2/8/2NP1NP1/PP2PPBP/R1BQ1RK1 w kq - +King's Indian: Four pawns attack, main line * +r2qk2r/pp2bpp1/2n2nb1/2p1p2p/3pP1PN/3P3P/PPPN1PB1/R1BQ1RK1 w kq - +King's Indian: Petrosian system, Keres variation * +r2qk2r/pp2bppp/2n1bn2/2ppp3/4P3/3P1NP1/PPP2PBP/RNBQ1RK1 w kq - +King's Indian: Gligori\'c-Taimanov system * +r2qk2r/pp3ppp/2n1pn2/3p1b2/1b1P1B2/1QN1PN2/PP3PPP/R3KB1R w KQkq - +QGD Slav: exchange, Trifunovi\'c variation +r2qk2r/pp3ppp/2nbp3/3p4/3Pn1b1/1P3N2/PBP1BPPP/RN1Q1RK1 w kq - +QGD: Pillsbury attack * +r2qk2r/pp3ppp/2nbpn2/2pp4/3P2b1/4PN2/PPPNBPPP/R1BQ1RK1 w kq - +QGD: Orthodox defense, Botvinnik variation * +r2qk2r/ppp1b1pp/2n5/3p1p2/2PPn1b1/3B1N2/PP3PPP/RNBQR1K1 b kq - +Petrov: classical attack, Krause variation +r2qk2r/ppp1b1pp/2n5/3p1p2/3Pn1b1/2PB1N2/PP1N1PPP/R1BQR1K1 b kq - +Petrov: classical attack, Berger variation +r2qk2r/ppp1bppp/1nn1b3/4p3/8/2NP1NP1/PP2PPBP/R1BQK2R w KQkq - +Sicilian: dragon, classical, Nottingham variation * +r2qk2r/ppp1bppp/2n1b3/3np3/8/3P1NP1/PP2PPBP/RNBQK2R w KQkq - +Sicilian: dragon, classical attack * +r2qk2r/ppp1bppp/2n1b3/3np3/8/P1N1P3/1PQP1PPP/R1B1KBNR w KQkq - +Sicilian: Taimanov variation * +r2qk2r/ppp2p1p/2n1bPp1/2b3N1/2pp4/8/PPP2PPP/RNBQR1K1 w kq - +two knights: Max Lange attack, Loman defense +r2qk2r/ppp2pPp/2n1b3/2b5/2pp4/5N2/PPP2PPP/RNBQR1K1 b kq - +two knights: Max Lange attack, Schlechter variation +r2qk2r/ppp2ppp/2n1b3/2bnp3/8/2N2NP1/PP1PPPBP/R1BQK2R w KQkq - +Sicilian: accelerated fianchetto, modern variation with Bc4 * +r2qk2r/ppp2ppp/2n1b3/2bnp3/8/2NPPN2/PP3PPP/R1BQKB1R w KQkq - +Sicilian: Sozin, 7.Be3 * +r2qk2r/ppp2ppp/2n5/3np3/1b4b1/2NPPN2/PP3PPP/R1BQKB1R w KQkq - +Sicilian: Richter-Rauzer, Margate (Alekhine) variation * +r2qk2r/ppp2ppp/2np1n2/2b1p3/2B1P1b1/2NP1N2/PPP2PPP/R1BQK2R w KQkq - +Giuoco Pianissimo: Canal variation * +r2qk2r/ppp2ppp/2np1n2/2b5/2B1Pp2/2NP1Q1P/PPP3P1/R1B1K2R w KQkq - +KGD: classical, Svenonius variation +r2qk2r/ppp3pp/1bn1b3/3npp2/8/2NPPN2/PP2BPPP/R1BQ1RK1 w kq - +Sicilian: Sozin, Fischer variation * +r2qk2r/ppp3pp/2n5/3p1p2/2PPn1bb/3B1N2/PP3PPP/RNBQR1K1 w kq - +Petrov: classical attack, Mar\'oczy variation +r2qk2r/pppbbppp/2Bp1n2/4p3/3PP3/2N2N2/PPP2PPP/R1BQ1RK1 b kq - +Ruy Lopez: closed Berlin defense, Showalter variation +r2qk2r/pppbbppp/2np1n2/1B2p1B1/3PP3/2N2N2/PPP2PPP/R2Q1RK1 b kq - +Ruy Lopez: closed Berlin defense, Bernstein variation +r2qk2r/pppbbppp/2np1n2/1B2p3/3PP3/2N2N2/PPP2PPP/R1BQ1RK1 w kq - +Ruy Lopez: Berlin defense, hedgehog variation +r2qkb1r/1bpp1ppp/p1n2n2/1p2p3/4P3/1B3N2/PPPP1PPP/RNBQ1RK1 w kq - +Ruy Lopez: Archangelsk (counterthrust) variation +r2qkb1r/1p1b1ppp/2n1pn2/pBPp4/1P6/1QP1P3/P4PPP/RNB1K1NR b KQkq - +QGD: semi-Slav, Junge variation * +r2qkb1r/1p1b1ppp/2n1pn2/pBPp4/1P6/2P1P3/P3QPPP/RNB1K1NR b KQkq - +QGD: semi-Slav, Koomen variation * +r2qkb1r/1p1b1ppp/2n1pn2/pBPp4/PP6/2P1P3/5PPP/RNBQK1NR b KQkq - +QGD: semi-Slav, Abrahams variation * +r2qkb1r/1p1b1ppp/p1nppn2/6B1/3NP3/2N5/PPPQ1PPP/2KR1B1R w kq - +Sicilian: Richter-Rauzer, Rauzer attack, 7...a6 defense, 8...Bd7 +r2qkb1r/1p3ppp/p1npbn2/4p1B1/4P3/N1N5/PPP2PPP/R2QKB1R w KQkq - +Sicilian: Pelikan, Bird variation +r2qkb1r/1ppbnppp/p1np4/4p3/B2PP3/2P2N2/PP3PPP/RNBQK2R w KQkq - +Ruy Lopez: modern Steinitz defense, Rubinstein variation +r2qkb1r/2p2ppp/p1n1b3/1p1pP3/4n3/1B3N2/PPP1QPPP/RNB2RK1 b kq - +Ruy Lopez: open, Howell attack +r2qkb1r/2p2ppp/p1n1b3/1p1pP3/4n3/1B3N2/PPP2PPP/RNBQ1RK1 w kq - +Ruy Lopez: open, 8...Be6 +r2qkb1r/2p2ppp/p1n1b3/1p1pP3/4n3/1B3N2/PPPN1PPP/R1BQ1RK1 b kq - +Ruy Lopez: open, Bernstein variation +r2qkb1r/2p2ppp/p1n1b3/1p1pP3/4n3/1BP2N2/PP3PPP/RNBQ1RK1 b kq - +Ruy Lopez: open, 9.c3 +r2qkb1r/2p2ppp/p1n1b3/1pn1P1N1/3p4/1BP5/PP1N1PPP/R1BQ1RK1 b kq - +Ruy Lopez: open, Bernstein variation, Karpov gambit +r2qkb1r/2p2ppp/p1n1b3/1pnpP3/8/1BP2N2/PP3PPP/RNBQ1RK1 w kq - +Ruy Lopez: open, Berlin variation +r2qkb1r/2p2ppp/p1pp1n2/4p3/3PP1b1/5N2/PPP2PPP/RNBQ1RK1 w kq - +Ruy Lopez: Steinitz defense deferred, Lipnitsky variation +r2qkb1r/p2b1ppp/5n2/1B1pp3/Q7/4P3/PP3PPP/RNB1K2R b KQkq - +QGD: Semi-Tarrasch, San Sebastian variation * +r2qkb1r/p3pppp/2p5/2pn3b/4N3/5N1P/PPPP1PP1/R1BQK2R b KQkq - +English: Nenarokov variation * +r2qkb1r/p4ppp/2p1pn2/3p4/3p4/4P2P/PPP1QPP1/RNB2RK1 w kq - +QGD: Lasker defense, main line * +r2qkb1r/pb1n1ppp/2p1pn2/1p6/3P4/2NBPN2/PP3PPP/R1BQK2R w KQkq - +QGD semi-Slav: Meran, Wade variation +r2qkb1r/pp1b1ppp/2n1pn2/2pp4/3P4/5NP1/PPP1PPBP/RNBQ1RK1 w kq - +Gr\"unfeld: Opo\v censky variation * +r2qkb1r/pp1bppp1/5n1p/1BpP4/4p3/2N5/PPP1QPPP/R3K1NR b KQkq - +QGD: Albin counter-gambit, Kr\'enosz variation * +r2qkb1r/pp1bpppp/2np1n2/6B1/3NP3/2N5/PPP2PPP/R2QKB1R w KQkq - +Sicilian: Richter-Rauzer, Larsen variation +r2qkb1r/pp1bpppp/2np1n2/6B1/3NP3/2N5/PPPQ1PPP/R3KB1R b KQkq - +Sicilian: Richter-Rauzer, Larsen variation, 7.Qd2 +r2qkb1r/pp1n1ppp/2n1p3/2Pp4/Q5b1/2P1PN2/PP1N1PPP/R1B1KB1R b KQkq - +QGD: Cambridge Springs defense, Rubinstein variation * +r2qkb1r/pp1n1ppp/4pn2/2pp4/3P2b1/2P1PN2/PP1N1PPP/R1BQKB1R w KQkq - +QGD: Capablanca variation * +r2qkb1r/pp2n1pp/2n1bp2/2p1p3/3PP3/3P1NP1/PP3PBP/RNBQ1RK1 b kq - +King's Indian: S\"amisch, orthodox main line * +r2qkb1r/pp2n1pp/2n1bp2/2ppp3/4P3/2PP1NP1/PP3PBP/RNBQ1RK1 b kq - +King's Indian: S\"amisch, orthodox, 7.Nge2 c6 * +r2qkb1r/pp2n1pp/2n1bp2/2ppp3/8/2NP1NP1/PPP1PPBP/1RBQ1RK1 b kq - +King's Indian: S\"amisch, Ruban variation * +r2qkb1r/pp2n1pp/2n1bp2/2ppp3/8/P1NP1NP1/1PP1PPBP/R1BQ1RK1 b kq - +King's Indian: S\"amisch, Panno formation * +r2qkb1r/pp2pppp/2n2n2/1BPp4/6b1/4PN2/PPP2PPP/RNBQK2R b KQkq - +QGD: Ragozin, Vienna variation * +r2qkb1r/pp2pppp/2n2n2/1Bpp3b/8/1P2PN1P/PBPP1PP1/RN1QK2R b KQkq - +Queen's Indian: 4.Nc3, main line * +r2qkb1r/pp2pppp/2n2n2/2Pp4/6b1/2P1PN2/PP3PPP/RNBQKB1R b KQkq - +QGD semi-Slav: 5.Bg5 dc * +r2qkb1r/pp2pppp/2n2n2/2pp1b2/3P4/4PN2/PPP1BPPP/RNBQK2R w KQkq - +QGD: classical variation (5.Bf4) * +r2qkb1r/pp2pppp/2n2n2/2pp1b2/3P4/5NP1/PPP1PPBP/RNBQK2R w KQkq - +Gr\"unfeld: 5.Bf4 * +r2qkb1r/pp2pppp/2n2n2/2pp4/2PP2b1/4PN2/PP3PPP/RNBQKB1R w KQkq - +QGD: Semi-Tarrasch defense, Pillsbury variation * +r2qkb1r/pp2pppp/2n2n2/2pp4/3P2b1/5NP1/PPP1PPBP/RNBQK2R w KQkq - +Gr\"unfeld: 5.Bg5 * +r2qkb1r/pp2pppp/2n2n2/2pp4/6b1/3P1NP1/PPP1PPBP/RNBQK2R w KQkq - +King's Indian: Smyslov system * +r2qkb1r/pp2pppp/2n2n2/3p1b2/3P1B2/2N2N2/PP2PPPP/R2QKB1R b KQkq - +QGD Slav: exchange variation, 6.Bf4 Bf5 * +r2qkb1r/pp2pppp/2n2n2/3p1b2/3P1B2/2N2N2/PP2PPPP/R2QKB1R w KQkq - +QGD Slav: exchange variation, 6.Bf4 Bf5 +r2qkb1r/pp2pppp/2n2n2/3p1b2/3P4/5N2/PPPN1PPP/R1BQKB1R w KQkq - +QGD: exchange, S\"amisch variation * +r2qkb1r/pp2pppp/2n2n2/8/2Pp2b1/3P1NP1/PP3P1P/RNBQKB1R w KQkq - +Benoni: Uhlmann variation * +r2qkb1r/pp2pppp/2n2nb1/2pp4/6PN/1P2P2P/PBPP1P2/RN1QKB1R b KQkq - +Queen's Indian: 4.Nc3, Botvinnik variation * +r2qkb1r/pp2pppp/n1p2n2/5b2/P1pP4/2N1PN2/1P3PPP/R1BQKB1R w KQkq - +QGD Slav: Dutch, Lasker variation +r2qkb1r/pp2pppp/n1p2n2/8/P1pPP1b1/2N2N2/1P3PPP/R1BQKB1R w KQkq - +QGD Slav: Smyslov variation +r2qkb1r/pp3p1p/2n3p1/2Pp4/1P2p1b1/2P1PN2/P2N1P2/R1BQKB1R w KQkq - +QGD semi-Slav: anti-Meran, Lilienthal variation * +r2qkb1r/pp3ppp/2n1b3/2pnp1N1/8/2N3P1/PP1PPPBP/R1BQK2R b KQkq - +Sicilian: accelerated fianchetto, Breyer variation * +r2qkb1r/pp3ppp/2n1bn2/2ppp3/8/3P1NP1/PPP1PPBP/RNBQ1RK1 w kq - +King's Indian: Larsen variation * +r2qkb1r/pp3ppp/2n1pn2/2pp1b2/3P4/5NP1/PPP1PPBP/RNBQ1RK1 w kq - +Gr\"unfeld with Bf4 & e3 * +r2qkb1r/pp3ppp/2n1pn2/2pp3b/3P4/1P2PN1P/P1P1BPP1/RNBQ1RK1 b kq - +QGD: Tartakower (Makagonov-Bondarevsky) system * +r2qkb1r/pp3ppp/2n1pn2/2pp3b/3P4/4PN1P/PPP1BPP1/RNBQ1RK1 w kq - +QGD: Neo-orthodox variation, 7.Bh4 * +r2qkb1r/pp3ppp/2n1pn2/2pp4/3P2b1/2P1PN2/PP1N1PPP/R1BQKB1R w KQkq - +QGD * +r2qkb1r/pp3ppp/2n1pn2/2pp4/3P2b1/4PN1P/PPP1BPP1/RNBQ1RK1 b kq - +QGD: Neo-orthodox variation * +r2qkb1r/pp3ppp/2n1pn2/2pp4/3P2b1/4PN2/PPP1BPPP/RNBQ1RK1 w kq - +QGD: 6.Nf3 * +r2qkb1r/pp3ppp/2n1pn2/2pp4/3P2b1/4PN2/PPPNBPPP/R1BQ1RK1 b kq - +QGD: Orthodox defense * +r2qkb1r/pp3ppp/2n1pn2/2pp4/3P4/4Pb1P/PPP1BPP1/RNBQ1RK1 w kq - +QGD: Neo-orthodox variation, 7.Bxf6 * +r2qkb1r/pp3ppp/2n1pn2/2pp4/Q2P2b1/2P1PN2/PP1N1PPP/R1B1KB1R b KQkq - +QGD: Cambridge Springs defense * +r2qkb1r/pp3ppp/2n1pn2/2pp4/Q2P4/2P1Pb2/PP1N1PPP/R1B1KB1R w KQkq - +QGD: Cambridge Springs defense, Capablanca variation * +r2qkb1r/pp3ppp/2n1pn2/2ppN2b/3P4/4P2P/PPP1BPP1/RNBQ1RK1 b kq - +QGD: Lasker defense * +r2qkb1r/pp3ppp/2n1pn2/3p3b/3N4/1P2P2P/P1P1BPP1/RNBQ1RK1 b kq - +QGD: Tartakower (Makagonov-Bondarevsky) system, 8.cd Nxd5 * +r2qkb1r/pp3ppp/2n1pn2/3p4/Q2N2b1/2P1P3/PP1N1PPP/R1B1KB1R b KQkq - +QGD: Cambridge Springs defense, Yugoslav variation * +r2qkb1r/pp3ppp/2n1pn2/3p4/Q2p2b1/2P1PN2/PP1N1PPP/R1B1KB1R w KQkq - +QGD: Cambridge Springs defense, 7.cd * +r2qkb1r/pp3ppp/2n2n2/2Ppp3/6b1/2P1PN2/PP3PPP/RNBQKB1R w KQkq - +QGD semi-Slav: Botvinnik system (anti-Meran) * +r2qkb1r/pp3ppp/2n2n2/2pp4/3P2b1/2N2NP1/PP2PPBP/R1BQK2R w KQkq - +QGD: Tarrasch, Wagner variation +r2qkb1r/pp3ppp/2n2n2/2ppp3/3P2b1/2P1PN2/PP1N1PPP/R1BQKB1R w KQkq - +QGD: Alekhine variation * +r2qkb1r/pp3ppp/2n2n2/2ppp3/6b1/3P1NP1/PPP1PPBP/RNBQ1RK1 w kq - +King's Indian: Zinnowitz variation * +r2qkb1r/pp3ppp/2n2n2/4p3/2Pp2b1/3P1NP1/PP3PBP/RNBQK2R w KQkq - +Benoni: classical, 8.Bg5 * +r2qkb1r/pp3ppp/2n5/2Pp3P/1P2n3/2P1Pp1P/P4P2/RNBQKB1R w KQkq - +QGD semi-Slav: Ekstrom variation * +r2qkb1r/pp3ppp/2n5/2Pp3b/1P1Np1n1/2P1P2P/P4P2/RNBQKB1R b KQkq - +QGD semi-Slav: anti-Meran, Alatortsev system * +r2qkb1r/pp3ppp/2n5/2Pp3b/1P2p1n1/2P1PN1P/P4P2/RNBQKB1R w KQkq - +QGD semi-Slav: anti-Meran gambit * +r2qkb1r/ppp1p1pp/1nn1p3/2P5/3P2b1/5N2/PP4PP/RNBQKB1R b KQkq - +Alekhine's defense: four pawns attack, Ilyin-Genevsky variation +r2qkb1r/ppp2ppp/1nn5/4p3/6b1/2NPPN2/PP3PPP/R1BQKB1R w KQkq - +Sicilian: Richter-Rauzer, Pod\v ebrady variation * +r2qkb1r/ppp2ppp/2n1b3/3np3/8/2N1P3/PPQP1PPP/R1B1KBNR w KQkq - +Sicilian: Taimanov variation * +r2qkb1r/ppp2ppp/2n1b3/3np3/8/3P1NP1/PP2PP1P/RNBQKB1R w KQkq - +Sicilian: dragon, 6.Be3 * +r2qkb1r/ppp2ppp/2n1b3/3np3/8/P2P1N2/1P2PPPP/RNBQKB1R w KQkq - +Sicilian: Najdorf, Byrne (English) attack * +r2qkb1r/ppp2ppp/2n5/3np3/6b1/2NP1N2/PP1BPPPP/R2QKB1R b KQkq - +Sicilian: Richter-Rauzer, Larsen variation * +r2qkb1r/ppp2ppp/2n5/3np3/6b1/2NP1N2/PP2PPPP/R1BQKB1R w KQkq - +Sicilian: Richter-Rauzer * +r2qkb1r/ppp2ppp/2n5/3np3/6b1/2NP1NP1/PP2PP1P/R1BQKB1R b KQkq - +Sicilian: Richter-Rauzer, Bondarevsky variation * +r2qkb1r/ppp2ppp/2n5/3np3/6b1/2NPPN2/PP3PPP/R1BQKB1R b KQkq - +Sicilian: Richter-Rauzer, 6...e6 * +r2qkb1r/ppp2ppp/2n5/3np3/6b1/P2P1N2/1P2PPPP/RNBQKB1R w KQkq - +Sicilian: Najdorf, 6.Bg5 * +r2qkb1r/ppp2ppp/2n5/3np3/6b1/P2PPN2/1P3PPP/RNBQKB1R b KQkq - +Sicilian: Najdorf, 6...e6 * +r2qkb1r/ppp2ppp/2n5/4p3/6b1/2nPPN2/PP3PPP/R1BQKB1R w KQkq - +Sicilian: Richter-Rauzer, Richter attack * +r2qkb1r/ppp2ppp/n1n5/4p3/1P2P1b1/P1NP1N2/5PPP/R1BQKB1R b KQkq - +Sicilian: Pelikan, Chelyabinsk variation * +r2qkb1r/ppp2ppp/n1n5/4p3/4P1b1/P1NPBN2/1P3PPP/R2QKB1R b KQkq - +Sicilian: Pelikan, Bird variation * +r2qkb1r/ppp2ppp/n7/4p3/1P1nPP2/P1NP4/5P1P/R1BQKB1R b KQkq - +Sicilian: Sveshnikov variation * +r2qkb1r/ppp3pp/2n1bn2/3p1p2/2PPp3/2N1P3/PP1N1PPP/R1BQKB1R w KQkq - +French: Steinitz, Boleslavsky variation * +r2qkb1r/ppp3pp/2n1bn2/3ppp2/8/3P1NP1/PPP1PPBP/RNBQ1RK1 w kq - +Pirc: Austrian attack, 6.Be3 * +r2qkb1r/ppp3pp/2n1bp2/3np3/8/3P1NP1/PP2PPBP/RNBQ1RK1 b kq - +Sicilian: dragon, Yugoslav attack, 7...O-O * +r2qkb1r/ppp3pp/2n1bp2/3np3/8/3P1NP1/PP2PPBP/RNBQK2R w KQkq - +Sicilian: dragon, Yugoslav attack * +r2qkb1r/ppp3pp/2n5/3npp2/1P4b1/P2PPN2/5PPP/RNBQKB1R b KQkq - +Sicilian: Najdorf, Polugayevsky variation * +r2qkb1r/ppp3pp/2n5/3npp2/6b1/P2PPN2/1P2BPPP/RNBQK2R b KQkq - +Sicilian: Najdorf, 7...Be7 * +r2qkb1r/ppp3pp/2n5/3npp2/6b1/P2PPN2/1P3PPP/RNBQKB1R w KQkq - +Sicilian: Najdorf, 7.f4 * +r2qkb1r/ppp3pp/2n5/3npp2/6b1/PQ1PPN2/1P3PPP/RNB1KB1R b KQkq - +Sicilian: Najdorf, 7...Qb6 * +r2qkb1r/pppb1ppp/2Bp1n2/4p3/3PP3/2N2N2/PPP2PPP/R1BQK2R b KQkq - +Ruy Lopez: old Steinitz defense, Nimzovich attack +r2qkb1r/pppb1ppp/2n2n2/1B6/Q3p3/2N5/PPP2PPP/R1B1K1NR w KQkq - +Scandinavian: Anderssen counter-attack orthodox attack * +r2qkb1r/pppb1ppp/2np1n2/1B6/3pP3/2N2N2/PPP2PPP/R1BQ1RK1 w kq - +Ruy Lopez: closed Berlin defense, Wolf variation +r2qkb1r/pppn2p1/8/3pNbPp/3Pn3/8/PPP2P1P/RNBQKB1R w KQkq - +KGA: Kieseritsky, Brentano defense, Caro variation * +r2qkbnr/1p3ppp/p1n1p3/2pp4/3P2b1/2P1PN2/PP1N1PPP/R1BQKB1R w KQkq - +QGD: Capablanca anti-Cambridge Springs variation * +r2qkbnr/1pp2pp1/p1p5/4p2p/4P1b1/5N1P/PPPP1PP1/RNBQ1RK1 w kq - +Ruy Lopez: exchange variation, Alapin gambit +r2qkbnr/1pp3pp/p1np4/4pb2/B7/2P2N2/PP1P1PPP/RNBQ1RK1 b kq - +Ruy Lopez: Siesta, Kopayev variation +r2qkbnr/1ppb1p1p/p1np2p1/4p3/B2PP3/2P2N2/PP3PPP/RNBQK2R w KQkq - +Ruy Lopez: modern Steinitz defense, fianchetto (Bronstein) variation +r2qkbnr/1ppb1ppp/p1np4/4p3/B3P3/2P2N2/PP1P1PPP/RNBQK2R w KQkq - +Ruy Lopez: modern Steinitz defense +r2qkbnr/pp1b1ppp/2n1p3/2ppP3/3P4/2P2N2/PP3PPP/RNBQKB1R w KQkq - +French: advance, Euwe variation +r2qkbnr/pp1nppp1/2p3bp/7P/3P4/5NN1/PPP2PP1/R1BQKB1R b KQkq - +Caro-Kann: classical, Spassky variation +r2qkbnr/pp1nppp1/2p3bp/8/3P3P/5NN1/PPP2PP1/R1BQKB1R w KQkq - +Caro-Kann: classical, 7...Nd7 +r2qkbnr/pp2pppp/2n5/1Bp4b/1PPp4/4PN1P/P2P1PP1/RNBQK2R b KQkq - +Nimzo-Indian: Leningrad, ...b5 gambit * +r2qkbnr/pp2pppp/2n5/1Bp4b/2Pp4/3PPN1P/PP3PP1/RNBQK2R b KQkq - +Nimzo-Indian: Leningrad, main line * +r2qkbnr/pp2pppp/2n5/1Bpp4/6b1/4PN2/PPPP1PPP/RNBQK2R w KQkq - +Nimzo-Indian: Leningrad variation * +r2qkbnr/pp2pppp/2n5/2pp1b2/3P4/4PN2/PPP2PPP/RNBQKB1R w KQkq - +QGD: Harrwitz attack * +r2qkbnr/pp2pppp/2n5/2pp1b2/3P4/5NP1/PPP1PP1P/RNBQKB1R w KQkq - +Gr\"unfeld: 4.Bf4 * +r2qkbnr/pp2pppp/2n5/2pp4/2PP2b1/4PN2/PP3PPP/RNBQKB1R b KQkq - +QGD: Been-Koomen variation * +r2qkbnr/pp2pppp/2n5/2pp4/3P2b1/4PN2/PPP1BPPP/RNBQK2R b KQkq - +QGD: 4.Bg5 Be7 * +r2qkbnr/pp2pppp/2n5/2pp4/3P2b1/4PN2/PPP2PPP/RNBQKB1R w KQkq - +QGD: 4.Bg5 * +r2qkbnr/pp2pppp/2n5/2pp4/3P2b1/4PN2/PPPN1PPP/R1BQKB1R b KQkq - +QGD: 4.Bg5 Nbd7 * +r2qkbnr/pp2pppp/2n5/2pp4/3P2b1/5NP1/PPP1PP1P/RNBQKB1R w KQkq - +Gr\"unfeld: Stockholm variation * +r2qkbnr/pp2pppp/2n5/3p4/2Pp2b1/1Q2PN2/PP3PPP/RNB1KB1R b KQkq - +QGD: Canal (Venice) variation * +r2qkbnr/pp2pppp/2n5/3p4/2Pp2b1/4PN2/PP3PPP/RNBQKB1R w KQkq - +QGD: Semi-Tarrasch * +r2qkbnr/pp2pppp/2n5/3p4/3P2b1/2P2N2/PP3PPP/RNBQKB1R b KQkq - +QGD: exchange, positional line, 5...c6 * +r2qkbnr/pp2pppp/2n5/3p4/3P2b1/5N2/PPP2PPP/RNBQKB1R w KQkq - +QGD: exchange, positional line * +r2qkbnr/pp3ppp/2n1p3/1Bpp4/3P2b1/4PN2/PPPN1PPP/R1BQK2R b KQkq - +QGD: Manhattan variation * +r2qkbnr/pp3ppp/2n1p3/2pp1b2/3P4/5NP1/PPP1PPBP/RNBQ1RK1 b kq - +Gr\"unfeld: Gr\"unfeld gambit * +r2qkbnr/pp3ppp/2n1p3/2pp4/3P2b1/2P1PN2/PP1N1PPP/R1BQKB1R b KQkq - +QGD: 5...c6 * +r2qkbnr/pp3ppp/2n1p3/2pp4/3P2b1/4PN2/PPP1BPPP/RNBQ1RK1 b kq - +QGD: 4.Bg5 Be7, 5.e3 O-O * +r2qkbnr/pp3ppp/2n1p3/2pp4/3P2b1/4PN2/PPPN1PPP/R1BQKB1R w KQkq - +QGD * +r2qkbnr/pp3ppp/2n1p3/2ppN3/3P2b1/4P3/PPP1BPPP/RNBQK2R b KQkq - +QGD: Lasker variation * +r2qkbnr/pp3ppp/2n5/2P5/N2p2b1/5N2/PP2PPPP/R1BQKB1R b KQkq - +Caro-Kann: Panov-Botvinnik, Herzog defense * +r2qkbnr/pp3ppp/2n5/2pp4/3P2b1/1QN2N2/PP2PPPP/R1B1KB1R b KQkq - +Caro-Kann: Panov-Botvinnik, Reifir (Spielmann) variation * +r2qkbnr/pp3ppp/2n5/2pp4/3P2b1/2N1PN2/PP3PPP/R1BQKB1R b KQkq - +Caro-Kann: Panov-Botvinnik, normal variation * +r2qkbnr/pp3ppp/2n5/2pp4/Q2P2b1/2N2N2/PP2PPPP/R1B1KB1R b KQkq - +Caro-Kann: Panov-Botvinnik, Czerniak variation * +r2qkbnr/pp3ppp/2n5/2ppp3/6b1/3P1NP1/PPP1PPBP/RNBQK2R w KQkq - +King's Indian: accelerated Averbakh system * +r2qkbnr/pp3ppp/4p3/3p4/3Q4/6P1/PPb1PPBP/RNB2RK1 w kq - +Gr\"unfeld: Gr\"unfeld gambit accepted * +r2qkbnr/pp3ppp/8/3pn3/8/8/PPP1NPPP/RNBQK2R b KQkq - +Bishop's opening: Lisitsyn variation +r2qkbnr/pp4pp/2n1bp2/2p1p3/3pP3/2PP1NP1/PP3PBP/RNBQ1RK1 b kq - +King's Indian: S\"amisch, orthodox, 7.d5 c6 * +r2qkbnr/pp4pp/2n1bp2/2p1p3/3pP3/3P1NP1/PPP2PBP/RNBQ1RK1 w kq - +King's Indian: S\"amisch, orthodox, 7.d5 * +r2qkbnr/pp4pp/2n1bp2/2ppp3/4P3/3P1NP1/PPP2PBP/RNBQ1RK1 b kq - +King's Indian: S\"amisch, orthodox variation * +r2qkbnr/pp4pp/2n1bp2/2ppp3/8/1P1P1NP1/P1P1PPBP/RNBQ1RK1 b kq - +King's Indian: S\"amisch, double fianchetto variation * +r2qkbnr/pp4pp/2n1bp2/2ppp3/8/2NP1NP1/PPP1PPBP/R1BQ1RK1 b kq - +King's Indian: S\"amisch, 6...Nc6 * +r2qkbnr/ppp1p1pp/2n2p2/3p4/3P1Bb1/5N2/PPP1PPPP/RN1QKB1R w KQkq - +Richter-Veresov attack, Richter variation * +r2qkbnr/ppp1pppp/2n5/3p4/3P1B2/5b2/PPP1PPPP/RN1QKB1R w KQkq - +Richter-Veresov attack, Veresov variation * +r2qkbnr/ppp1pppp/2n5/3p4/3P2b1/5N2/PPP1PPPP/RNBQKB1R w KQkq - +Richter-Veresov attack * +r2qkbnr/ppp2p1p/2P5/8/2BP1pb1/2N2p2/PPP3PP/R1BQ1RK1 b kq - +Vienna: Pierce gambit, Rushmere attack +r2qkbnr/ppp2pp1/2n5/3p3p/2PPp1b1/4P3/PP1NBPPP/RNBQK2R b KQkq - +French: Albin-Alekhine-Ch\^atard attack, Breyer variation * +r2qkbnr/ppp2pp1/2n5/3p3p/3Pp1b1/4P3/PPPNBPPP/RNBQ1RK1 b kq - +French: Albin-Alekhine-Ch\^atard attack, Spielmann variation * +r2qkbnr/ppp2pp1/2n5/3p3p/3Pp1b1/4P3/PPPNBPPP/RNBQK2R w KQkq - +French: Albin-Alekhine-Ch\^atard attack * +r2qkbnr/ppp2pp1/2n5/3p3p/3Pp1b1/4PP2/PPPNB1PP/RNBQK2R b KQkq - +French: Albin-Alekhine-Ch\^atard attack, Teichmann variation * +r2qkbnr/ppp2pp1/2n5/3p3p/3Pp1b1/P3P3/1PPNBPPP/RNBQK2R b KQkq - +French: Albin-Alekhine-Ch\^atard attack, Mar\'oczy variation * +r2qkbnr/ppp2pp1/2n5/3pP2p/6b1/5NP1/PPPPP2P/RNBQKB1R w KQkq - +Dutch: Staunton gambit, Alekhine variation * +r2qkbnr/ppp2ppp/2n1b3/1B1p4/3Pp3/4PN1P/PPP2PP1/RNBQK2R w KQkq - +French: MacCutcheon, Janowski variation * +r2qkbnr/ppp2ppp/2n1b3/3p4/3Pp3/1P2P3/P1P1BPPP/RNBQK1NR b KQkq - +French: classical, Frankfurt variation * +r2qkbnr/ppp2ppp/2n1b3/3pp3/3P4/4PN2/PPP2PPP/RNBQKB1R w KQkq - +French: Henneberger variation * +r2qkbnr/ppp2ppp/2n5/1B1p3b/3Pp3/4PN1P/PPP2PP1/RNBQK2R w KQkq - +French: MacCutcheon, Bernstein variation * +r2qkbnr/ppp2ppp/2n5/1B1p4/3P2b1/4Pp1P/PPP2PP1/RNBQK2R w KQkq - +French: MacCutcheon, Chigorin variation * +r2qkbnr/ppp2ppp/2n5/1B1p4/3Pp1b1/4PN2/PPP2PPP/RNBQK2R w KQkq - +French: MacCutcheon, advance variation * +r2qkbnr/ppp2ppp/2n5/1B1pp3/3P2b1/4PN2/PPP2PPP/RNBQK2R b KQkq - +French: MacCutcheon variation * +r2qkbnr/ppp2ppp/2n5/3p4/3P2b1/2N2N2/PPP2PPP/R1BQKB1R b KQkq - +French: exchange, Bogolyubov variation * +r2qkbnr/ppp2ppp/2n5/3p4/3P2b1/5N2/PPP2PPP/RNBQKB1R w KQkq - +French: exchange, Svenonius variation * +r2qkbnr/ppp2ppp/2n5/3p4/3Pp1b1/4P3/PPP1BPPP/RNBQK1NR b KQkq - +French: classical, Vistaneckis (Nimzovich) variation * +r2qkbnr/ppp2ppp/2n5/3p4/3Pp3/4P3/PPPNQPPP/RNB1K2R b KQkq - +French: classical variation * +r2qkbnr/ppp2ppp/2n5/3pN3/3Pp1b1/4P3/PPP1BPPP/RNBQK2R b KQkq - +French: classical, Tartakower variation * +r2qkbnr/ppp2ppp/2n5/3pP3/6b1/1P3N2/P1PPP1PP/RNBQKB1R b KQkq - +Dutch: Staunton gambit, Nimzovich variation * +r2qkbnr/ppp2ppp/2n5/3pP3/6b1/2P2N2/PP1PP1PP/RNBQKB1R b KQkq - +Dutch: Staunton gambit, Chigorin variation * +r2qkbnr/ppp2ppp/2n5/3pP3/6b1/4PN2/PPP2PPP/RNBQKB1R b KQkq - +French: Burn variation * +r2qkbnr/ppp2ppp/2n5/3pP3/6b1/5N2/PPPPP1PP/RNBQKB1R w KQkq - +Dutch: Staunton gambit, Staunton's line * +r2qkbnr/ppp2ppp/2n5/3pp3/3P2b1/4PN2/PPP1BPPP/RNBQK2R b KQkq - +French: classical * +r2qkbnr/ppp2ppp/2n5/3pp3/3P4/4Pb2/PPP1BPPP/RNBQK2R w KQkq - +French: classical, Anderssen variation * +r2qkbnr/ppp2ppp/2n5/3pp3/6b1/3P1NP1/PPP1PP1P/RNBQKB1R w KQkq - +Pirc: Byrne variation * +r2qkbnr/ppp2ppp/2npb3/4p3/2P5/2N3P1/PP1PPPBP/R1BQK1NR w KQkq - +English, Tr\"oger defense +r2qkbnr/ppp2ppp/8/3p4/1n1Pp3/4P3/PPPNQPPP/RNB1K2R w KQkq - +French: classical, Alapin variation * +r2qkbnr/ppp3pp/2n2p2/3pP3/6b1/5NP1/PPPPP2P/RNBQKB1R w KQkq - +Dutch: Staunton gambit, Lasker variation * +r2qkbnr/ppp3pp/2n5/3p1p2/3Pp3/4P3/PPPNQPPP/RNB1K2R w KQkq - +French: classical, Steinitz variation * +r2qkbnr/pppb1ppp/2B5/3p4/3Pp3/4PN1P/PPP2PP1/RNBQK2R b KQkq - +French: MacCutcheon, Lasker variation * +r2qkbnr/pppb1ppp/2n5/1B1p4/2PPp3/4P3/PP3PPP/RNBQK1NR w KQkq - +French: Winawer, advance, Bogolyubov variation * +r2qkbnr/pppb1ppp/2n5/1B1p4/3Pp3/4P2P/PPPN1PP1/RNBQK2R b KQkq - +French: MacCutcheon, Tartakower variation * +r2qkbnr/pppb1ppp/2n5/1B1pp3/3P4/4P3/PPP2PPP/RNBQK1NR w KQkq - +French: Winawer, fingerslip variation * +r2qkbnr/pppb1ppp/2n5/3pp3/Q3P3/2P2N2/PP1P1PPP/RNB1KB1R w KQkq - +Ponziani: Caro variation +r2qkbnr/pppb1ppp/2np4/1B2p3/2PPP3/5N2/PP3PPP/RNBQK2R b KQkq - +Ruy Lopez: old Steinitz defense, semi-Duras variation +r2qkbnr/pppb2pp/2npP3/1B3p2/3p4/5N2/PPP2PPP/RNBQK2R b KQkq - +KGD: Falkbeer, Morphy gambit * +r2qkbnr/pppnpppp/8/3p4/6b1/5NP1/PPPPPPBP/RNBQK2R w KQkq - +R\'eti: King's Indian attack, Keres variation +r2qr1k1/p1p2ppp/2p2n2/3pp1B1/1b2P1b1/3P1N2/PPP1QPPP/R2N1RK1 b - - +Four knights: symmetrical, Capablanca variation * +r2qr1k1/p1p2ppp/5n2/1p1P3b/Q5P1/2N1Bn1P/PPP1KP2/R4B1R w - - +two knights defense: Yurdansky attack * +r2qr1k1/ppp1bppp/2n2n2/4p3/2P3b1/2NPBN2/PP2BPPP/R2Q1RK1 w - - +Philidor: Berger variation * +r2r2k1/ppq2ppp/2n1pn2/2bp4/2P5/2N1PN1P/PP1BQPP1/R4RK1 b - - +QGD: Lasker defense, Russian variation * +r3k1nr/ppp1qppp/2n5/4P3/1bPp4/5N1P/PP1BPPP1/R2QKB1R w KQkq - +QGD: Albin counter-gambit, Kr\'enosz variation +r3k2r/p2q1ppp/5n2/3pp3/1b6/4P3/PP3PPP/RNBQ1RK1 w kq - +QGD: Semi-Tarrasch, Kmoch variation * +r3k2r/ppp1qppp/2n1b3/2bnp3/8/2NPPN2/PP2BPPP/R1BQK2R w KQkq - +Sicilian: Velimirovi\'c attack * +r3k2r/ppp2ppp/2n1bP2/2b2qN1/2ppN3/8/PPP2PPP/R1BQR1K1 b kq - +two knights: Max Lange attack, Marshall variation +r3k2r/pppq2pp/2n1bp2/2bnp3/8/2NP1NP1/PP1BPPBP/R2Q1RK1 b kq - +Sicilian: dragon, Yugoslav attack, 9...Bd7 * +r3k2r/pppq2pp/2n1bp2/2bnp3/8/2NP1NP1/PP2PPBP/R1BQ1RK1 w kq - +Sicilian: dragon, Yugoslav attack, 9.Bc4 * +r3k2r/pppq2pp/2n1bp2/2bnp3/P7/2NP1NP1/1P2PPBP/R1BQ1RK1 b kq - +Sicilian: dragon, Yugoslav attack, Byrne variation * +r3k2r/pppqbppp/2n1b3/3np3/8/2NP1NP1/PP2PPBP/R1BQK2R w KQkq - +Sicilian: dragon, classical, Amsterdam variation * +r3k2r/ppq1ppbp/2N3p1/2pp4/6n1/1P2P3/PBPP1PPP/RN1Q1RK1 w kq - +Bogo-Indian defense, Monticelli trap * +r3kb1r/1b3ppp/p2ppn2/qpn1P1B1/3N4/1BN5/PPPQ1PPP/2KRR3 b kq - +Sicilian: Najdorf, Ivkov variation +r3kb1r/1bq2ppp/p3pn2/1p1P4/2p5/2N1PN2/PPQ2PPP/R1BR2K1 w kq - +QGA: classical, Flohr variation +r3kb1r/1pp2ppp/p1p1b3/3q4/3PN3/8/PPP2PPP/R1BQR1K1 w kq - +Four knights: Spielmann variation +r3kb1r/5ppp/b3pn2/1p1qN1B1/3p4/3B4/PP2QPPP/R4RK1 b kq - +QGD semi-Slav: Meran, Rellstab attack +r3kb1r/p4ppp/1qp1pn2/3p4/3P4/3Q3P/PPP2PP1/RNB2RK1 b kq - +QGD: Lasker defense, Bernstein variation * +r3kb1r/pp1Npppp/1qn2n2/1Bp5/2p5/2N1P3/PP1P1PPP/R1BQK2R b KQkq - +Nimzo-Indian: Spielmann, Karlsbad variation * +r3kb1r/pp1b1ppp/nq2pn2/3p4/3P1B2/4PN2/PP3PPP/RNQ1KB1R w KQkq - +QGD Slav: Landau variation * +r3kb1r/pp1bpppp/1qn2n2/1Bp5/2N5/2N1P3/PP1P1PPP/R1BQK2R b KQkq - +Nimzo-Indian: Spielmann, San Remo variation * +r3kb1r/pp1qn1pp/2n1bp2/2ppp3/8/P1NP1NP1/1PP1PPBP/1RBQ1RK1 b kq - +King's Indian: S\"amisch, Panno main line * +r3kb1r/pp1qpppp/2np1n2/2p5/3PP3/2P2N2/PP3PPP/RNBQ1RK1 b kq - +Sicilian: Canal-Sokolsky attack, Bronstein gambit +r3kb1r/pp2pppp/1qn2n2/2pp4/3P4/2P1PQ1P/PP3PP1/RNB1KB1R w KQkq - +QGD/QGD semi-Slav: Hastings variation * +r3kb1r/pp2pppp/2n2n2/2pq4/3P2b1/4PN2/PP3PPP/RNBQKB1R w KQkq - +QGD: Semi-Tarrasch, Primitive Pillsbury variation * +r3kb1r/pp2pppp/2n5/q1p5/1n1PP1b1/P4N2/1P3PPP/RNBQKB1R w KQkq - +QGD: Semi-Tarrasch, Krause variation * +r3kb1r/pp3ppp/1qn1bn2/3pp1B1/2P5/6P1/PP1NPPBP/RN1Q1RK1 b kq - +Gr\"unfeld defense: Smyslov, Yugoslav variation * +r3kb1r/pp3ppp/1qn1bn2/3pp1B1/8/6P1/PPPNPPBP/RN1Q1RK1 w kq - +Gr\"unfeld defense: Smyslov, main line * +r3kb1r/pp3ppp/1qn1pn2/1B1p1b2/3P1B2/2N1PN2/PP3PPP/R2QK2R b KQkq - +QGD Slav: exchange, Trifunovi\'c variation * +r3kb1r/pp3ppp/1qn1pn2/2pp4/3P2b1/4PN2/PPPNBPPP/R1BQ1RK1 w kq - +QGD: Orthodox defense, Rauzer variation * +r3kb1r/pp3ppp/2n2q2/2Pp4/1P2p1b1/2P1PN2/P2N1P2/R1BQKB1R w KQkq - +QGD semi-Slav: anti-Meran, Szab\'o variation * +r3kb1r/ppp1q1pp/2n5/3n4/1P2p1b1/P3PN2/2Q2PPP/RNB1KB1R w KQkq - +Sicilian: Najdorf, Polugayevsky, Simagin variation * +r3kb1r/ppp2ppp/2n1bP2/5qN1/2ppN3/8/PPP2PPP/R1BQR1K1 w kq - +two knights: Max Lange attack, Rubinstein variation +r3kb1r/ppp2ppp/2nq4/3np3/6b1/2NPPN2/PP3PPP/R1BQKB1R w KQkq - +Sicilian: Richter-Rauzer, Keres variation * +r3kb1r/ppp3pp/2n1bq2/3npp2/8/2NPPN2/PP2BPPP/R1BQK2R w KQkq - +Sicilian: Scheveningen, Tal variation * +r3kb1r/ppp3pp/2n2q2/3npp1b/6P1/P2PPN1P/1P2BP2/RNBQK2R b KQkq - +Sicilian: Najdorf, G\"oteborg (Argentine) variation * +r3kb1r/ppp3pp/2n2q2/3npp1b/8/P2PPN1P/1PQ1BPP1/RNB1K2R b KQkq - +Sicilian: Najdorf, Browne variation * +r3kb1r/ppp3pp/2n2q2/3npp2/6b1/P2PPN2/1PQ1BPPP/RNB1K2R b KQkq - +Sicilian: Najdorf variation * +r3kb1r/pppq1ppp/2n1b3/3np3/8/P2PPN2/1P3PPP/RNBQKB1R w KQkq - +Sicilian: Scheveningen, English variation * +r3kb1r/pppq1ppp/2n5/3np3/6b1/2NP1N2/PP1BPPPP/R2QKB1R w KQkq - +Sicilian: Richter-Rauzer, Larsen variation, 7.Qd2 * +r3kb1r/pppq1ppp/2n5/3np3/6b1/2NPPN2/PP2BPPP/R1BQK2R b KQkq - +Sicilian: Richter-Rauzer, Rauzer attack, 7...Be7 * +r3kb1r/pppq1ppp/2n5/3np3/6b1/2NPPN2/PP3PPP/R1BQKB1R w KQkq - +Sicilian: Richter-Rauzer, Rauzer attack * +r3kb1r/pppq1ppp/2n5/3np3/6b1/P1NPPN2/1P3PPP/R1BQKB1R b KQkq - +Sicilian: Richter-Rauzer, Rauzer attack, 7...a6 * +r3kb1r/ppq2ppp/2n1pn2/2pp4/3P2b1/4PN2/PPPNBPPP/R1BQ1RK1 w kq - +QGD: Orthodox defense, Rubinstein variation * +r3kb1r/ppq2ppp/2n1pn2/2ppN3/3P4/4P2P/PPP1QPP1/RNB2RK1 w kq - +QGD: Lasker defense, Teichmann variation * +r3kb1r/ppq2ppp/2n1pn2/3p4/2Pp2b1/4PN2/PP1NBPPP/R1BQ1RK1 w kq - +QGD: Orthodox defense, 7.Qc2 c5, 8.cd (Rubinstein) * +r3kb1r/ppqbpp1p/2n2np1/1Bp5/2N2P2/2N1P3/PP1P2PP/R1BQK2R w KQkq - +Nimzo-Indian: Spielmann, St\aa hlberg variation * +r3kb1r/ppqn1ppp/2n1p3/1Bpp3b/Q2P4/2P1PN2/PP1N1PPP/R1B2RK1 w kq - +QGD: Cambridge Springs defense, Argentine variation * +r3kb1r/ppqn1ppp/2n1p3/1Bpp4/Q2P2b1/2P1PN2/PP1N1PPP/R1B1K2R w KQkq - +QGD: Cambridge Springs defense, Bogolyubov variation * +r3kb1r/ppqn1ppp/2p2n2/4pb2/P1NP4/2N3P1/1P2PP1P/R1BQKB1R w KQkq - +QGD Slav: Carlsbad variation +r3kbnr/1ppb1ppp/p1p5/8/3NP3/8/PPP2PPP/RNB1K2R w KQkq - +Ruy Lopez: exchange, Alekhine variation +r3kbnr/p1pb1ppp/2p5/3pN1q1/3Pp3/4P1PP/PPP2P2/RNBQK2R b KQkq - +French: MacCutcheon, Lasker variation, 8...g6 * +r3kbnr/pp1qpppp/8/2ppP3/2P3b1/6P1/PP2PP1P/RNBQKB1R b KQkq - +Gr\"unfeld: Lundin variation * +r3kbnr/ppp2pp1/2n5/1B1p2qP/3P4/4P3/PPP2Pp1/RNBQK1R1 w Qkq - +French: MacCutcheon, Grigoriev variation * +r3kbnr/ppp2ppp/2n5/3p2q1/3Pp3/4P3/PPP1BPPP/RNBQK2R w KQkq - +French: classical, Anderssen-Richter variation * +r3kbnr/ppp2ppp/2n5/3p2q1/3Pp3/4P3/PPPNQPPP/RNB1K2R w KQkq - +French: classical, Pollock variation * +r3kbnr/pppq1ppp/2n1b3/3pp3/8/2PP1NP1/PP2PP1P/RNBQKB1R w KQkq - +Pirc: 150 attack * +r3kbnr/pppq1ppp/2n5/1B1p4/Q7/4PP2/PPP2P1P/RNB1K2R b KQkq - +French: MacCutcheon, Bogolyubov variation * +r3kbnr/pppq1ppp/2n5/3p4/3Pp3/4P3/PPPNQPPP/RNB1K2R w KQkq - +French: classical, Rubinstein variation * +r3kbnr/ppq1pppp/2n5/3p4/3P2b1/2P2N2/PP3PPP/RNBQKB1R w KQkq - +QGD: exchange, positional line, 6.Qc2 * +r3qrk1/ppp1b1pp/2n1b3/3npp2/8/P1NPPN2/1PQ1BPPP/R1B2RK1 b - - +Sicilian: Scheveningen, classical main line * +r3r1k1/1p1n1p1p/1bpqb1p1/p2p2B1/1P1N3Q/P1PBR3/5PPP/5RK1 b - - +Ruy Lopez: Marshall, main line, Spassky variation * +r3r1k1/2qbbp1p/p2p1np1/npp1p3/3PP3/2P1NN1P/PPB2PP1/R1BQR1K1 w - - +Ruy Lopez: closed, Chigorin, Yugoslav system +r3r1k1/ppp1qppp/2n5/3b4/2P1p3/8/P1PPBPPP/R1BQ1RK1 b - - +Ruy Lopez: Berlin defense, Rio de Janeiro variation * +r4b1r/ppp1kp2/2n1bN1p/q5p1/1P1p3B/5N2/P1P2PPP/R2QR1K1 b - - +two knights defense: Yurdansky attack +r4rk1/2pqb1pp/p1n1p3/1p1pP3/4R3/1BP5/PP3PPP/RNBQ2K1 b - - +Ruy Lopez: open, Tarrasch trap +r4rk1/2pqbppp/p1n1b3/3pP3/2B1n3/5N2/PP2QPPP/RNBR2K1 w - - +Ruy Lopez: open, Howell attack, Ekstr\"om variation +r4rk1/p4ppp/bqn2n2/2b5/B3p3/2N3Q1/PPPPNPPP/R1B1K2R w KQ - +Evans gambit: compromised defense, Paulsen variation * +r4rk1/pbqnppbp/1p3np1/2pp4/P2P4/BPP1PN2/3NBPPP/R2Q1RK1 b - - +Catalan: closed, Sokolsky variation * +r4rk1/pp1bqpp1/2n1pn1p/2p5/2BP4/2N1PN2/PPQ2PPP/R2R2K1 w - - +QGD: Lasker defense, Russian variation +r4rk1/pp2ppbp/3p1np1/q4P2/4P1P1/2N1B3/PPP1Q2P/R4RK1 b - - +Sicilian: dragon, classical, Stockholm attack +r4rk1/pp2qppp/3b4/3P4/1P1Qn1b1/B3PN2/5PPP/R3KB1R w KQ - +QGD semi-Slav: Meran, Rellstab attack * +r4rk1/ppp1q2p/2n1b3/4p1p1/Q4p2/3P1NP1/PP2PPBP/R4RK1 w - - +Sicilian: dragon, classical, Stockholm attack * +r4rk1/ppp3pp/2n1bq2/4pP2/8/5Q2/PPPP1K1P/RNB2BNR w - - +KGA: Lolli gambit, Young variation * +r4rk1/pppqbppp/2n1b3/3np3/8/2NP1NP1/PP2PPBP/R1BQ1RK1 w - - +Sicilian: dragon, classical, Richter variation * +r4rk1/ppq1ppbp/2n2np1/2pp4/3P1Pb1/2P1PN2/PP2B1PP/RNB1QRK1 w - - +Dutch: stonewall: Chekhover variation * +r5nr/pp2k2p/2n2p2/2N1p2q/3pP3/3P2P1/PPP2PBP/RNB2RK1 b - - +King's Indian: S\"amisch, orthodox, Bronstein variation * +rn1q1rk1/1p3pbp/p2p1np1/2pP4/P3P1b1/2N2N2/1P2BPPP/R1BQ1RK1 w - - +Benoni: classical with ...a6 and 10...Bg4 +rn1q1rk1/4ppbp/3p1np1/2pP4/4P3/2N2NP1/PP3PKP/R1BQ3R b - - +Benk\"o gambit: main line +rn1q1rk1/p3ppbp/bp3np1/2pp4/3P1P2/2P1PN2/PP2B1PP/RNBQ1RK1 w - - +Dutch: stonewall with Ba3 * +rn1q1rk1/pb1pbppp/1p2pn2/8/2PN4/1P1BP3/PB3PPP/RN1Q1RK1 b - - +Queen's Indian: Averbakh variation +rn1q1rk1/pb3ppp/1p1bp3/2pn4/8/1P2PN2/PB1PBPPP/RN1Q1RK1 w - - +Queen's Indian: Averbakh variation * +rn1q1rk1/pb3ppp/5n2/2b1p3/N2p4/1B1P4/PPP1NPPP/R1BQK2R b KQ - +Evans gambit: Paulsen variation * +rn1q1rk1/pb3ppp/5n2/2b1p3/N2p4/1B1P4/PPP2PPP/R1BQK1NR w KQ - +Evans gambit: Ulvestad variation * +rn1q1rk1/pb3ppp/8/1Bb5/4N1n1/5N2/PPPP1PPP/R1BQ1RK1 b - - +Scotch gambit: Hanneken variation * +rn1q1rk1/pbp1bppp/1p3n2/3pN1B1/3P4/2NBP3/PP3PPP/R2QK2R b KQ - +QGD: Pillsbury attack +rn1q1rk1/pbpp1ppp/1p2p3/6N1/2PP4/2n3P1/PPQ1PPBP/R3K2R b KQ - +Bogo-Indian defense, Monticelli trap +rn1q1rk1/pbppbppp/1p2p3/8/2PP4/2Q2NP1/PP2PPBP/R1B2RK1 b - - +Queen's Indian: old main line, 9.Qxc3 +rn1q1rk1/pbppbppp/1p2pn2/8/2PP4/1P3NP1/P3PPBP/RNBQ1RK1 b - - +Queen's Indian: Euwe variation +rn1q1rk1/pbppbppp/1p2pn2/8/2PP4/2N2NP1/PP2PPBP/R1BQ1RK1 b - - +Queen's Indian: old main line, 7.Nc3 +rn1q1rk1/pp1nppbp/6p1/2p5/3PP1b1/1QN1BN2/PP3PPP/R3KB1R w KQ - +Gr\"unfeld defense: Smyslov, Yugoslav variation +rn1q1rk1/pp2ppbp/2p2np1/3p1b2/2PP4/2NBPN2/PP3PPP/R1BQ1RK1 w - - +Gr\"unfeld: Flohr defense +rn1q1rk1/pp2ppbp/2p2np1/3p4/2PP2b1/2NBPN2/PP3PPP/R1BQ1RK1 w - - +Gr\"unfeld: Smyslov defense +rn1q1rk1/pp2ppbp/2pp1np1/5b2/2PP4/2N2NP1/PP2PPBP/R1BQ1RK1 w - - +King's Indian: fianchetto, Larsen system +rn1q1rk1/pp2ppbp/4bnp1/2Pp4/2P2B2/2N1P3/PP3PPP/2RQKBNR w K - +Gr\"unfeld: Gr\"unfeld gambit, Botvinnik variation +rn1q1rk1/pp3ppp/2p1p3/5b2/PbBPn1P1/2N1PN2/1P2QP1P/R1B2RK1 b - - +QGD Slav: Dutch, S\"amisch variation +rn1q1rk1/pp3ppp/2p1pn2/5b2/PbBP4/2N1PN2/1P2QPPP/R1B2RK1 b - - +QGD Slav: Dutch variation, main line +rn1q1rk1/ppp1b1pp/1n2pp2/4Pb2/2PP4/2N2N2/PP2B1PP/R1BQ1RK1 w - - +Alekhine's defense: four pawns attack, Korchnoi variation +rn1q1rk1/ppp1ppbp/5np1/8/2QPP1b1/2N2N2/PP3PPP/R1B1KB1R w KQ - +Gr\"unfeld: Russian, Smyslov variation +rn1q1rk1/ppp2ppp/3b4/3p4/2PPn1b1/3B1N2/PP3PPP/RNBQ1RK1 w - - +Petrov: classical attack, Tarrasch variation +rn1q1rk1/ppp2ppp/8/2bNp3/4P1b1/3P1N2/PPP2PPP/R1BQK2R b KQ - +Giuoco piano * +rn1q1rk1/ppp2ppp/8/2bP1b2/4nPP1/5N2/PPP1Q2P/RNB1KB1R w KQ - +KGD: Falkbeer, Tarrasch variation +rn1q1rk1/ppp3pp/8/2bNpp1b/4P1P1/5N1P/PPPP1P2/R1BQK2R w KQ - +Giuoco piano: Rosentreter variation * +rn1q1rk1/ppp3pp/8/3P1p2/3Pn1b1/3B1N2/PP3PPb/RNBQR1K1 w - - +Petrov: classical attack, Marshall trap +rn1q1rk1/pppnppbp/6p1/8/3PP1b1/1QN1BN2/PP3PPP/R3KB1R b KQ - +Gr\"unfeld defense: Smyslov, main line +rn1qk1nr/pb3ppp/8/2b1p3/3P4/8/PPP2PPP/RNBQKBNR b KQkq - +Danish gambit: Schlechter defense * +rn1qk1nr/pb3ppp/8/2b1p3/8/8/PPPPQPPP/RNB1KBNR b KQkq - +Danish gambit: Collijn defense * +rn1qk1nr/pp1bppbp/6p1/2pp4/5P2/4PN2/PPPPB1PP/RNBQK2R b KQkq - +Dutch-Indian, Alekhine variation * +rn1qk1nr/pp3ppp/2pb4/3p1b2/3P4/2N2N2/PP2PPPP/R1BQKB1R w KQkq - +Caro-Kann: exchange, Rubinstein variation * +rn1qk1nr/ppp1ppbp/3p2p1/8/2PPP1b1/5N2/PP3PPP/RNBQKB1R w KQkq - +Robatsch defense: Rossolimo variation +rn1qk1nr/ppp2ppp/8/2b1p3/Q3P1b1/2P2N2/PP1P2PP/RNB1KB1R b KQkq - +KGD: classical, Marshall attack +rn1qk2r/1bpp1ppp/1p2pn2/p7/1bPP4/5NP1/PP1BPPBP/RN1QK2R w KQkq - +Queen's Indian: Yates variation +rn1qk2r/p1pp1ppp/bp2pn2/8/1bPP4/2N1P3/PP2NPPP/R1BQKB1R w KQkq - +Nimzo-Indian: 4.e3, Bronstein (Byrne) variation +rn1qk2r/p4ppp/2p2n2/2bpp3/B3P1b1/2NP4/PPP2PPP/R1BQK1NR w KQkq - +Evans gambit: Sokolsky variation * +rn1qk2r/pb1pbppp/1p2pn2/2p5/2P5/2N2NP1/PP1PPPBP/R1BQ1RK1 w kq - +English: symmetrical, hedgehog system +rn1qk2r/pbpp1pp1/1p2pn1p/8/1bPP3B/2N2N2/PP2PPPP/R2QKB1R w KQkq - +Queen's Indian: 4.Nc3, main line +rn1qk2r/pbpp1ppp/1p2pn2/8/1bPP4/5NP1/PP2PPBP/RNBQK2R w KQkq - +Queen's Indian: Capablanca variation +rn1qk2r/pbpp1ppp/5n2/1pb1p3/4P3/1BN5/PPPP1PPP/R1BQK1NR w KQkq - +Evans gambit declined, Cordel variation * +rn1qk2r/pbppbppp/1p2p3/8/2PPn3/2N2NP1/PP1BPPBP/R2QK2R b KQkq - +Queen's Indian: Opo\v censky variation +rn1qk2r/pbppbppp/1p2pn2/8/2PP4/2N2NP1/PP2PPBP/R1BQK2R b KQkq - +Queen's Indian: anti-Queen's Indian system +rn1qk2r/pbppbppp/1p2pn2/8/2PP4/5NP1/PP1BPPBP/RN1QK2R w KQkq - +Queen's Indian: Riumin variation +rn1qk2r/pbppbppp/1p2pn2/8/2PP4/5NP1/PP2PPBP/RNBQ1RK1 b kq - +Queen's Indian: old main line, 6.O-O +rn1qk2r/pbppbppp/1p2pn2/8/2PP4/5NP1/PP2PPBP/RNBQK2R w KQkq - +Queen's Indian: 5.Bg2 Be7 +rn1qk2r/pp1bppbp/5np1/1Bpp4/P7/1P2PN2/1BPP1PPP/RN1QK2R b KQkq - +Queen's Indian: Yates variation * +rn1qk2r/pp1bppbp/5np1/2pp4/8/1P2PN2/PBPPBPPP/RN1QK2R b KQkq - +Queen's Indian: Riumin variation * +rn1qk2r/pp3ppp/2p1b3/3np3/1bB5/2N2Q2/PPPPNPPP/R1B1K2R w KQkq - +Scotch: Paulsen attack * +rn1qk2r/pp3ppp/2p1b3/3np3/1bB5/5Q2/PPPPNPPP/R1BNK2R b KQkq - +Scotch: Paulsen, Gunsberg defense * +rn1qk2r/pp3ppp/2p1pn2/5b2/PbBP4/2N1PN2/1P3PPP/R1BQ1RK1 b kq - +QGD Slav: Dutch variation +rn1qk2r/pp3ppp/2p2n2/2bpp3/4P1b1/1BN5/PPPPQPPP/R1B1K1NR w KQkq - +Giuoco Piano: Mestel variation * +rn1qk2r/ppp2ppp/3pbn2/4p3/1bB1P3/2N2N2/PPPP1PPP/R1BQK2R w KQkq - +Ruy Lopez: Berlin defense, Kaufmann variation * +rn1qk2r/ppp2ppp/8/2bP1b2/4nP2/5N2/PPP1Q1PP/RNB1KB1R w KQkq - +KGD: Falkbeer, main line, 7...Bf5 +rn1qk2r/ppp3p1/8/2bpP1Pp/4b3/7P/PPP3K1/RNBQ1BNR w kq - +KGA: Allgaier, Cook variation * +rn1qk2r/pppbbppp/8/3pP3/N3n3/2PB1N1P/P1Q2PP1/R1B1K2R w KQkq - +two knights defense: Knorre variation * +rn1qkb1r/1b3ppp/p3pn2/1pp5/3P4/1B2PN2/PP2QPPP/RNB2RK1 w kq - +QGA: classical, 8...Bb7 +rn1qkb1r/4pp1p/3p1np1/2pP4/4P3/2N3P1/PP3P1P/R1BQ1KNR b kq - +Benk\"o gambit +rn1qkb1r/4pp1p/3p1np1/2pP4/4P3/2N5/PP2NPPP/R1BQ1K1R b kq - +Benk\"o gambit: Ne2 variation +rn1qkb1r/4pp1p/b2p1np1/2pP4/8/2N2NP1/PP2PP1P/R1BQKB1R b KQkq - +Benk\"o gambit: fianchetto variation +rn1qkb1r/4pp1p/b2p1np1/2pP4/8/2N5/PP1NPPPP/R1BQKB1R b KQkq - +Benk\"o gambit: Nd2 variation +rn1qkb1r/4pppp/b2p1n2/2pP4/4P3/2N5/PP3PPP/R1BQKBNR b KQkq - +Benk\"o gambit: 7.e4 +rn1qkb1r/p1pp1ppp/bp2pn2/8/2PP4/5NP1/PP2PP1P/RNBQKB1R w KQkq - +Queen's Indian: Nimzovich variation (exaggerated fianchetto) +rn1qkb1r/pb1p1ppp/1p2pn2/2p5/2PP4/4PN2/PP3PPP/RNBQKB1R w KQkq - +English: Wimpey system * +rn1qkb1r/pb1p1ppp/1p3n2/2pp2N1/2P5/6P1/PP2PPBP/RNBQK2R b KQkq - +Queen's Indian: B\"urger variation +rn1qkb1r/pb1p1ppp/1p3n2/2pp4/2P4N/6P1/PP2PPBP/RNBQK2R b KQkq - +Queen's Indian: Rubinstein variation +rn1qkb1r/pb1ppppp/1p3n2/2p3B1/3P4/2P2N2/PP2PPPP/RN1QKB1R b KQkq - +English: Capablanca's variation * +rn1qkb1r/pb1ppppp/1p3n2/2p5/3P1B2/2P2N2/PP2PPPP/RN1QKB1R b KQkq - +English: New York (London) defensive system * +rn1qkb1r/pb1ppppp/1p3n2/2p5/3P4/2P2N2/PP2PPPP/RNBQKB1R w KQkq - +English: Caro-Kann defensive system * +rn1qkb1r/pb1ppppp/1p3n2/2p5/3P4/2P2NP1/PP2PP1P/RNBQKB1R b KQkq - +English: Bled variation * +rn1qkb1r/pb1ppppp/1p3n2/2p5/3P4/5NP1/PPP1PPBP/RNBQK2R w KQkq - +Queen's Indian: Marienbad system +rn1qkb1r/pb1ppppp/1p3n2/8/2PQ4/5NP1/PP2PPBP/RNB1K2R b KQkq - +Queen's Indian: Marienbad system, Berg variation +rn1qkb1r/pbpp1p2/1p2p2p/6pn/2PP4/2N2NB1/PP2PPPP/R2QKB1R w KQkq - +Queen's Indian: 4.Nc3, Botvinnik variation +rn1qkb1r/pbpp1ppp/1p2pn2/8/2P1P3/2NB1N2/PP1P1PPP/R1BQK2R b KQkq - +English: Queens Indian, Romanishin variation +rn1qkb1r/pbpp1ppp/1p2pn2/8/2PP4/5NP1/PP2PP1P/RNBQKB1R w KQkq - +Queen's Indian: 4.g3 Bb7 +rn1qkb1r/pp1bpppp/5n2/1Bpp4/8/4PN2/PPPPQPPP/RNB1K2R b KQkq - +Bogo-Indian defense, Nimzovich variation * +rn1qkb1r/pp1n1ppp/4p3/3pNb2/3P4/2N1P3/PP3PPP/R1BQKB1R w KQkq - +QGD Slav: Amsterdam variation +rn1qkb1r/pp2pppp/2p2n2/3p1b2/2P5/1P3N2/PB1PPPPP/RN1QKB1R w KQkq - +English: New York (London) defensive system +rn1qkb1r/pp2pppp/2p2n2/3p1b2/2P5/1P3NP1/P2PPP1P/RNBQKB1R w KQkq - +English: London defensive system +rn1qkb1r/pp2pppp/2p2n2/3p1b2/2PP4/4PN2/PP3PPP/RNBQKB1R w KQkq - +QGD Slav: 4.e3 Bf5 +rn1qkb1r/pp2pppp/2p2n2/3p4/2P3b1/1P3N2/PB1PPPPP/RN1QKB1R w KQkq - +English: Capablanca's variation +rn1qkb1r/pp2pppp/2p2n2/3p4/2P3b1/1P3NP1/P2PPP1P/RNBQKB1R w KQkq - +English: Torre defensive system +rn1qkb1r/pp2pppp/2p2n2/3p4/6b1/5NP1/PPPPPPBP/RNBQ1RK1 w kq - +R\'eti: King's Indian attack, Yugoslav variation +rn1qkb1r/pp2pppp/2p2n2/4Nb2/P1pP4/2N5/1P2PPPP/R1BQKB1R b KQkq - +QGD Slav: Krause attack +rn1qkb1r/pp2pppp/2p2n2/5b2/P1pP4/2N1PN2/1P3PPP/R1BQKB1R b KQkq - +QGD Slav: Dutch variation +rn1qkb1r/pp2pppp/2p2n2/5b2/P1pP4/2N2N2/1P2PPPP/R1BQKB1R w KQkq - +QGD Slav: Czech defense +rn1qkb1r/pp2pppp/2p2n2/8/P1pP2b1/2N2N2/1P2PPPP/R1BQKB1R w KQkq - +QGD Slav: Steiner variation +rn1qkb1r/pp2pppp/2pp4/3nP3/3P2b1/5N2/PPP1BPPP/RNBQK2R w KQkq - +Alekhine's defense: modern, Flohr variation +rn1qkb1r/pp2pppp/5n2/1Bpp4/3P2b1/4PN2/PPP2PPP/RNBQK2R b KQkq - +QGD: Vienna variation * +rn1qkb1r/pp2pppp/5n2/2p5/1PPp2b1/4PN2/P2P1PPP/RNBQKB1R w KQkq - +Blumenfeld counter-gambit, Dus-Chotimursky variation * +rn1qkb1r/pp2pppp/5n2/2pp1b2/8/1P2PN2/P1PP1PPP/RNBQKB1R w KQkq - +Queen's Indian: Miles variation * +rn1qkb1r/pp2pppp/5n2/2pp4/3P2b1/4PN1P/PPP2PP1/RNBQKB1R b KQkq - +QGD: Capablanca-Duras variation * +rn1qkb1r/pp2pppp/5n2/2pp4/3P2b1/4PN2/PPP2PPP/RNBQKB1R w KQkq - +QGD * +rn1qkb1r/pp2pppp/5n2/3p1b2/3P4/2N1PN2/PP3PPP/R1BQKB1R b KQkq - +QGD Slav: exchange variation +rn1qkb1r/pp2pppp/5n2/8/1PPp2b1/5N1P/P2P1PP1/RNBQKB1R b KQkq - +Blumenfeld counter-gambit, Spielmann variation * +rn1qkb1r/pp3ppp/2p1pn2/4Nb2/P1pP4/2N5/1P2PPPP/R1BQKB1R w KQkq - +QGD Slav: Wiesbaden variation +rn1qkb1r/pp3ppp/4b3/2pnp3/8/2N3P1/PP1PPPBP/R1BQK1NR w KQkq - +Sicilian: accelerated fianchetto, Mar\'oczy bind, 6.Be3 * +rn1qkb1r/ppn2ppp/2p1b3/4p3/2B5/2N2Q2/PPPPNPPP/R1B1K2R w KQkq - +Scotch: Meitner variation * +rn1qkb1r/ppp1pppp/1n1p4/3PP3/2P3b1/5N2/PP3PPP/RNBQKB1R b KQkq - +Alekhine's defense: modern, Vitolins attack +rn1qkb1r/ppp1pppp/1n1p4/4Pb2/2PP1P2/8/PP4PP/RNBQKBNR w KQkq - +Alekhine's defense: four pawns attack, Trifunovi\'c variation +rn1qkb1r/ppp1pppp/3p1n2/5b2/2PP4/2N5/PP2PPPP/R1BQKBNR w KQkq - +Old Indian: Janowski variation +rn1qkb1r/ppp1pppp/3p4/3nP3/2PP2b1/5N2/PP3PPP/RNBQKB1R b KQkq - +Alekhine's defense: modern, Alekhine variation +rn1qkb1r/ppp1pppp/3p4/3nP3/3P2b1/5N1P/PPP2PP1/RNBQKB1R b KQkq - +Alekhine's defense: modern, Panov variation +rn1qkb1r/ppp1pppp/3p4/3nP3/3P2b1/5N2/PPP2PPP/RNBQKB1R w KQkq - +Alekhine's defense: modern variation, 4...Bg4 +rn1qkb1r/ppp1pppp/4bn2/8/2pP4/4PN2/PP3PPP/RNBQKB1R w KQkq - +QGA, Flohr variation +rn1qkb1r/ppp1pppp/5B2/3p1b2/3P4/2N5/PPP1PPPP/R2QKBNR b KQkq - +Richter-Veresov attack, Veresov variation +rn1qkb1r/ppp1pppp/5n2/3p1b2/3P4/5N2/PPP1PPPP/RNBQKB1R w KQkq - +Queen's bishop game * +rn1qkb1r/ppp1pppp/5n2/3p1b2/8/5NP1/PPPPPP1P/RNBQKB1R w KQkq - +King's Indian: London system * +rn1qkb1r/ppp1pppp/5n2/3p1bB1/3P4/2N2P2/PPP1P1PP/R2QKBNR b KQkq - +Richter-Veresov attack, Richter variation +rn1qkb1r/ppp1pppp/5n2/3p4/3P2b1/5N2/PPP1PPPP/RNBQKB1R w KQkq - +Torre attack (Tartakower variation) * +rn1qkb1r/ppp1pppp/5n2/3p4/6b1/4PN2/PPPP1PPP/RNBQKB1R w KQkq - +Queen's pawn: Torre attack * +rn1qkb1r/ppp1pppp/5n2/3p4/6b1/5NP1/PPPPPP1P/RNBQKB1R w KQkq - +King's Indian: Torre attack * +rn1qkb1r/ppp1pppp/5n2/8/2pP2b1/4PN2/PP3PPP/RNBQKB1R w KQkq - +QGA, Janowsky-Larsen variation +rn1qkb1r/ppp2ppp/4b3/4p3/1nB5/2N2Q2/PPPP1PPP/R1B1K1NR w KQkq - +Scotch: Blumenfeld attack * +rn1qkb1r/ppp2ppp/5n2/3pp3/2P3b1/4PN2/PP1P1PPP/RNBQKB1R w KQkq - +Queen's pawn: Torre attack, Wagner gambit * +rn1qkb1r/ppp2ppp/8/3pP3/4n1b1/2N2N2/PPPPQ1PP/R1B1KB1R b KQkq - +Vienna gambit: Kaufmann variation +rn1qkb1r/ppp3p1/8/3ppbPp/3Pn3/5N2/PPP2P1P/RNBQKB1R w KQkq - +KGA: Kieseritsky, Brentano defense * +rn1qkb1r/pppb1ppp/8/1B2p2Q/1n6/2N5/PPPP1PPP/R1B1K1NR w KQkq - +Scotch game * +rn1qkbnr/1bpp1ppp/p7/1P6/3Q4/8/PP2PPPP/RNB1KBNR w KQkq - +Sicilian: wing gambit, Marienbad variation * +rn1qkbnr/1pp2ppp/p3p3/3P4/2B3b1/4PN2/PP3PPP/RNBQK2R b KQkq - +QGA: Alekhine defense, Alatortsev variation +rn1qkbnr/p1pppppp/bp6/8/3PP3/8/PPP2PPP/RNBQKBNR w KQkq - +Guatemala defense +rn1qkbnr/pp1b1ppp/4P3/1Bp5/4p3/8/PPP2PPP/RNBQK1NR b KQkq - +QGD: Albin counter-gambit, Lasker trap * +rn1qkbnr/pp1bpppp/3p4/1Bp5/4P3/5N2/PPPP1PPP/RNBQK2R w KQkq - +Sicilian: Canal-Sokolsky attack, 3...Bd7 +rn1qkbnr/pp2pppp/2p3b1/8/3P1P2/6N1/PPP3PP/R1BQKBNR b KQkq - +Caro-Kann: classical, Mar\'oczy attack +rn1qkbnr/pp2pppp/2p3b1/8/3P3P/6N1/PPP2PP1/R1BQKBNR b KQkq - +Caro-Kann: classical, 6.h4 +rn1qkbnr/pp2pppp/2p3b1/8/3P4/6NN/PPP2PPP/R1BQKB1R b KQkq - +Caro-Kann: classical, Flohr variation +rn1qkbnr/pp2pppp/2p5/3p4/2P3b1/1P3N2/P2PPPPP/RNBQKB1R w KQkq - +English: Caro-Kann defensive system, Bogolyubov variation +rn1qkbnr/pp2pppp/2p5/3p4/4P1b1/2N2N2/PPPP1PPP/R1BQKB1R w KQkq - +Caro-Kann: two knights, 3...Bg4 +rn1qkbnr/pp2pppp/2p5/5b2/3PN3/8/PPP2PPP/R1BQKBNR w KQkq - +Caro-Kann: classical variation +rn1qkbnr/pp2pppp/8/2p2bN1/4p3/8/PPPP1PPP/RNBQKB1R w KQkq - +Budapest: Rubinstein variation * +rn1qkbnr/pp2pppp/8/2pp4/6b1/4PN2/PPPP1PPP/RNBQKB1R w KQkq - +Neo-Indian (Seirawan) attack * +rn1qkbnr/pp3ppp/2p1p3/3pPb2/3P4/2P5/PP2BPPP/RNBQK1NR b KQkq - +Caro-Kann: advance, Short variation +rn1qkbnr/pp4pp/4b3/2pp4/4p3/1NN5/PPP1PPPP/R1BQKB1R w KQkq - +Alekhine's defense: four pawns attack, 7.Be3 * +rn1qkbnr/ppp1pppp/3p4/8/3P2b1/5N2/PPP1PPPP/RNBQKB1R w KQkq - +Old Indian: Tartakower (Wade) variation +rn1qkbnr/ppp1pppp/3p4/8/4P1b1/5N2/PPPP1PPP/RNBQKB1R w KQkq - +R\'eti: Wade defense +rn1qkbnr/ppp1pppp/4b3/8/2p5/4PN2/PP1P1PPP/RNBQKB1R w KQkq - +R\'eti accepted: Keres variation +rn1qkbnr/ppp1pppp/8/3p1b2/2PP4/8/PP2PPPP/RNBQKBNR b KQkq - +Queen's pawn, Mason variation, Steinitz counter-gambit * +rn1qkbnr/ppp1pppp/8/3p1b2/2PP4/8/PP2PPPP/RNBQKBNR w KQkq - +QGD: Grau (Sahovic) defense +rn1qkbnr/ppp1pppp/8/3p1b2/3P4/8/PPP1PPPP/RNBQKBNR w KQkq - +Queen's pawn, Mason variation * +rn1qkbnr/ppp1pppp/8/3p1b2/8/5N2/PPPPPPPP/RNBQKB1R w KQkq - +Queen's pawn: London system * +rn1qkbnr/ppp1pppp/8/3p4/2P3b1/8/PP1PPPBP/RNBQK1NR b KQkq - +Grob: Fritz gambit +rn1qkbnr/ppp1pppp/8/3p4/3P2b1/2N5/PPP1PPPP/R1BQKBNR w KQkq - +Queen's pawn: Anti-Veresov +rn1qkbnr/ppp1pppp/8/3p4/3P2b1/8/PPP1PPPP/RNBQKBNR w KQkq - +Levitsky attack (Queen's bishop attack) * +rn1qkbnr/ppp1pppp/8/3p4/5Pb1/8/PPPPP1PP/RNBQKBNR w KQkq - +Dutch, 2.Bg5 variation * +rn1qkbnr/ppp1pppp/8/3p4/6b1/5N2/PPPPPPPP/RNBQKB1R w KQkq - +Trompovsky attack (Ruth, Opo\v censk\'y opening) * +rn1qkbnr/ppp1pppp/8/8/2Pp2b1/8/PP1PPPBP/RNBQK1NR w KQkq - +Grob: Romford counter-gambit +rn1qkbnr/ppp2ppp/2b1p3/8/3PN3/5N2/PPP2PPP/R1BQKB1R w KQkq - +French: Fort Knox variation +rn1qkbnr/ppp2ppp/3p4/4p3/2P3b1/2N2N2/PP1PPPPP/R1BQKB1R w KQkq - +English, Smyslov defense +rn1qkbnr/ppp2ppp/4b3/3pp3/3P4/4P3/PPP2PPP/RNBQKBNR w KQkq - +French: Alapin variation * +rn1qkbnr/ppp2ppp/8/3p4/5p2/6PB/PPPPP2P/RNBQK2R w KQkq - +Amar gambit +rn1qkbnr/pppb1ppp/3p4/8/3QP3/5N2/PPP2PPP/RNB1KB1R w KQkq - +Philidor: Boden variation +rn2k2r/pbpp1ppp/8/2b1p3/Np2Q3/1B6/PPPP1qPP/R1BK2NR w kq - +Evans gambit declined, Hicken variation * +rn2k2r/pp4pp/1q3p2/1N1pN3/3Pn3/5K2/PPP3PP/R1BQ3R w kq - +Giuoco Piano: Krause variation * +rn2kb1r/pp1q1ppp/2p1b3/3np3/2B5/2N2Q2/PPPPNPPP/R1B1K2R w KQkq - +Scotch: Blackburne attack * +rn2kb1r/pp2pppp/2p2n2/q3Nb2/3P2P1/2N5/PPP2P1P/R1BQKB1R b KQkq - +Scandinavian defense, Gr\"unfeld variation +rn2kb1r/pp3ppp/2p1q3/1N6/3p4/5Q2/PP3PPP/1RB2RK1 b kq - +Scotch: Gottschall variation * +rn2kb1r/ppp1pppp/5n2/q4b2/3P4/2N2N2/PPP2PPP/R1BQKB1R w KQkq - +Scandinavian defense +rn2kb1r/ppp1pppp/5n2/q7/3P2b1/2N2N1P/PPP2PP1/R1BQKB1R b KQkq - +Scandinavian defense, Lasker variation +rn2kbnr/pp1b1ppp/1q2p3/2ppP3/3P4/2P2N2/PP3PPP/RNBQKB1R w KQkq - +French: advance, Wade variation +rn2kbnr/pp1qpppp/3p4/2p5/2P1P3/5N2/PP1P1PPP/RNBQK2R b KQkq - +Sicilian: Canal-Sokolsky attack, Sokolsky variation +rn2kbnr/ppp2ppp/8/q3p3/3P2b1/2N2N2/PPP2PPP/R1BQKB1R w KQkq - +Scandinavian: Anderssen counter-attack, Collijn variation +rn3rk1/p1p1qpp1/1p2b2p/3p4/3P4/4PN2/PP3PPP/2RQKB1R w K - +QGD: Tartakower variation +rn3rk1/p4ppp/bqp5/2b1p3/N3n3/1B6/PPPQ1PPP/R1B1K1NR w KQ - +Evans gambit: Levenfish variation * +rnb1k1nr/p3qppp/2p1p3/1p6/PbpP4/2N1PN2/1P1B1PPP/R2QKB1R w KQkq - +QGD: semi-Slav, Koomen variation +rnb1k1nr/p4ppp/1qp1p3/1p6/PbpP4/2N1PN2/1P1B1PPP/R2QKB1R w KQkq - +QGD: semi-Slav, Junge variation +rnb1k1nr/pp1pq1pp/2p5/2b1pp2/2B1P3/2N2N2/PPPP1PPP/R1BQK2R w KQkq - +Bishop's opening: Lopez gambit * +rnb1k1nr/pp2ppbp/3p2p1/q1p5/2PPP3/2N2N2/PP3PPP/R1BQKB1R w KQkq - +Pterodactyl defense +rnb1k1nr/pp2ppbp/6p1/2qp4/8/4PN2/PPPN1PPP/R1BQKB1R w KQkq - +Catalan: open, 5.Qa4 Nbd7, 6.Qxc4 * +rnb1k1nr/pp2ppbp/6p1/q1Pp4/8/4PN2/PPP2PPP/RNBQKB1R w KQkq - +Catalan: open, 5.Qa4 * +rnb1k1nr/pp3ppp/2p5/2PP4/2B4q/5p2/PPP2PPP/RNBQ1RK1 b kq - +Bishop's opening: Pratt variation * +rnb1k1nr/pp3ppp/4p3/2pq4/1b1P4/2NB4/PPPB1PPP/R2QK1NR b KQkq - +French: Winawer, Kondratiyev variation +rnb1k1nr/ppp2pbp/3p4/4P1p1/2BP1p1q/2N5/PPP3PP/R1BQ1KNR b kq - +KGA: bishop's gambit, Grimm attack +rnb1k1nr/ppp2ppp/3b4/3B4/4Pp1q/8/PPPP2PP/RNBQ1KNR w kq - +KGA: bishop's gambit, Bor\'en-Svenonius variation +rnb1k1nr/pppp1pbp/8/6p1/2B1P2q/2N2Qp1/PPPP3P/R1B2KNR b kq - +KGA: bishop's gambit, Fraser variation +rnb1k1nr/pppp1pbp/8/6p1/2B1Pp1q/2N3P1/PPPP3P/R1BQ1KNR b kq - +KGA: bishop's gambit, McDonnell attack +rnb1k1nr/pppp1ppp/8/2b1p1q1/2B1P3/2P5/PP1P1PPP/RNBQK1NR w KQkq - +Bishop's opening: del Rio variation +rnb1k1nr/pppp1ppp/8/2b5/2B1Pp1q/8/PPPP2PP/RNBQ1KNR w kq - +KGA: bishop's gambit, Greco variation +rnb1k1nr/pppp1ppp/8/4p3/1bB1Pq2/2N2N2/PPPP2PP/R1BQK2R b KQkq - +KGD: Norwalde variation, B\"ucker gambit +rnb1k1nr/ppppqppp/1b1P4/4p3/2B1P3/2P2N2/PP3PPP/RNBQK2R b KQkq - +Giuoco Piano: Eisinger variation +rnb1k1nr/pppq1ppp/4p3/3pP3/1b1P4/2N5/PPP2PPP/R1BQKBNR w KQkq - +French: Winawer, Petrosian variation +rnb1k1nr/ppq1ppbp/6p1/3p4/8/P3PN2/1PPN1PPP/R1BQKB1R w KQkq - +Catalan: open, Alekhine variation * +rnb1k1nr/ppq2ppp/4p3/2ppP3/3P4/P1P5/2P2PPP/R1BQKBNR w KQkq - +French: Winawer, classical variation +rnb1k1r1/ppq1np1Q/4p3/3pP3/3p4/P1P5/2P1NPPP/R1B1KB1R b KQq - +French: Winawer, advance, poisoned pawn, Konstantinopolsky variation +rnb1k1r1/ppq1np1Q/4p3/3pP3/3p4/P1P5/2P2PPP/R1BK1BNR b q - +French: Winawer, advance, poisoned pawn, Euwe-Gligori\'c variation +rnb1k2r/1pq1bpp1/p2ppn1p/8/3NPP1B/2N2Q2/PPP3PP/R3KB1R w KQkq - +Sicilian: Najdorf, Browne variation +rnb1k2r/1pq1bppp/p2ppn2/6B1/3NPP2/2N2Q2/PPP3PP/R3KB1R w KQkq - +Sicilian: Najdorf variation +rnb1k2r/2q1bp1p/p2p1n2/1ppPp1p1/4P3/2P2N1P/PPBN1PP1/R1BQR1K1 w kq - +Ruy Lopez: closed, Leonhardt variation +rnb1k2r/p1pp1ppp/8/4p3/Np2n1Qq/1B6/PPPPKbPP/R1B3NR w kq - +Evans gambit declined, V\'asquez variation * +rnb1k2r/p4ppp/1qp2n2/2bpp3/B3P3/2NP4/PPP2PPP/R1BQK1NR w KQkq - +Evans gambit: Tartakower attack * +rnb1k2r/pp2ppbp/5np1/2pq4/8/1P3N2/PB1PPPPP/RN1QKB1R w KQkq - +Queen's Indian: Marienbad system, Berg variation * +rnb1k2r/pp2qppp/1bp2n2/3pp1B1/1P2P3/P1NP1N2/2P1BPPP/R2QK2R b KQkq - +Ruy Lopez: Wormald attack, Gr\"unfeld variation * +rnb1k2r/pp3ppp/4p3/q7/1b1PP3/5N2/P2B1PPP/R2QKB1R w KQkq - +QGD: Semi-Tarrasch, San Sebastian variation +rnb1k2r/ppp1qppp/5n2/2p1P3/3p4/5N1P/PPP1BPP1/R1BQK2R b KQkq - +two knights defense: Mar\'oczy variation * +rnb1k2r/ppp1qppp/5n2/3P4/1bBp4/2P2N2/PP3PPP/RNBQK2R w KQkq - +Bishop's opening: Urusov gambit, Panov variation +rnb1k2r/ppp2p1p/4pp2/q7/1b1P4/2N5/PPPQ1PPP/R3KBNR w KQkq - +French: MacCutcheon, Bogolyubov variation +rnb1k2r/ppp2p1p/5n2/3qN3/1b1P1ppP/2N5/PPP2KP1/R1BQ1B1R b kq - +KGA: Kieseritsky, Brentano defense, Kaplanek variation +rnb1k2r/ppp2ppp/1b6/3qp3/1PP5/P2P4/5PPP/R1BQKBNR b KQkq - +Ruy Lopez: Noah's ark trap * +rnb1k2r/ppp2ppp/3b4/3qp3/8/3P4/PPP2PPP/R1BQKBNR w KQkq - +Scotch: Ghulam Kassim variation * +rnb1k2r/ppp2ppp/5n2/3qp3/1b6/2NP4/PP1QPPPP/R1B1KBNR b KQkq - +Sicilian: Chekhover, Zaitsev variation * +rnb1k2r/ppp2ppp/8/2bPp3/2B3nq/2N4N/PPPP1PPP/R1BQK2R w KQkq - +Scotch gambit: Vitzhum attack * +rnb1k2r/ppp2ppp/8/3Pp3/2qP4/2N3P1/PPP2K1P/R1BQ3R b kq - +Scotch gambit: Cochrane-Shumov defense * +rnb1k2r/ppp2ppp/8/3np3/8/P1P5/1PPB1PPP/R3KBNR b KQkq - +Ruy Lopez: exchange, Alekhine variation * +rnb1k2r/ppp2ppp/8/3q4/4nP2/8/PPPNQbPP/RNBK1B1R b kq - +KGD: Falkbeer, Alapin variation +rnb1k2r/ppp3p1/3q1n2/2bppP1p/6P1/3P3P/PPP2PB1/RNBQK1NR w KQkq - +KGA: Philidor gambit, Schultz variation * +rnb1k2r/pppnqppp/4p3/1N1pP3/3P4/8/PPP2PPP/R2QKBNR b KQkq - +French: classical, Alapin variation +rnb1k2r/pppnqppp/4p3/3pP3/3P1P2/2N5/PPP3PP/R2QKBNR b KQkq - +French: classical, Steinitz variation +rnb1k2r/pppnqppp/4p3/3pP3/3P2Q1/2N5/PPP2PPP/R3KBNR b KQkq - +French: classical, Pollock variation +rnb1k2r/pppnqppp/4p3/3pP3/3P4/2N5/PPP2PPP/R2QKBNR w KQkq - +French: classical variation +rnb1k2r/pppnqppp/4p3/3pP3/3P4/2N5/PPPQ1PPP/R3KBNR b KQkq - +French: classical, Rubinstein variation +rnb1k2r/pppnqppp/4p3/3pP3/3P4/2NB4/PPP2PPP/R2QK1NR b KQkq - +French: classical, Tarrasch variation +rnb1k2r/pppnqppp/8/2p1P3/2Bp4/5N1P/PPP2PP1/R1BQK2R w KQkq - +two knights defense: Yankovich variation * +rnb1k2r/pppp1ppp/3b1q2/8/N3P1n1/2P2N2/P1Q2PPP/R1B1KB1R w KQkq - +two knights defense: Paoli variation * +rnb1k2r/pppp1ppp/5q2/8/NP2P1n1/5N2/P4PPP/R1BQKB1R b KQkq - +two knights defense: Blackburne variation * +rnb1k2r/pppp1ppp/5q2/8/Nb2P1n1/2P2N2/P4PPP/1RBQKB1R b Kkq - +two knights defense: Colman variation * +rnb1k2r/pppp1ppp/5q2/8/Nb2P1n1/2P2N2/P4PPP/R1BQKB1R w KQkq - +two knights defense: Bogolyubov variation * +rnb1k2r/ppppnpbp/8/6p1/2BPPp1q/2N3P1/PPP4P/R1BQ1KNR b kq - +KGA: bishop's gambit, McDonnell attack +rnb1k2r/ppppnpbp/8/6p1/2BPPp1q/2N5/PPP3PP/R1BQ1KNR w kq - +KGA: bishop's gambit, classical defense +rnb1k2r/ppppqppp/4pn2/8/1bPP4/5N2/PP1BPPPP/RN1QKB1R w KQkq - +Bogo-Indian defense, Nimzovich variation +rnb1k2r/ppppqppp/5n2/b3p3/4P3/P1N2N2/1PPP1PPP/R1BQKB1R w KQkq - +Ruy Lopez: Wormald (Alapin) attack * +rnb1kb1N/ppp3pp/5n2/3p4/2B1p3/8/PPPP1PqP/RNBQKR2 w Qkq - +Latvian: Behting variation +rnb1kb1r/1p3ppp/p2ppn2/6B1/3NPP2/q1N5/P1PQ2PP/1R2KB1R w Kkq - +Sicilian: Najdorf, Poisoned pawn variation +rnb1kb1r/1p3ppp/pq1ppn2/6B1/3NPP2/2N5/PPP3PP/R2QKB1R w KQkq - +Sicilian: Najdorf, 7...Qb6 +rnb1kb1r/1pq2ppp/p2ppn2/8/3NP3/2N5/PPP1BPPP/R1BQ1RK1 w kq - +Sicilian: Scheveningen (Paulsen), classical variation +rnb1kb1r/2q2ppp/p3pn2/1p2P1B1/3N4/2N5/PPP1Q1PP/R3KB1R b KQkq - +Sicilian: Najdorf, Polugayevsky, Simagin variation +rnb1kb1r/pp1p1ppp/2p2n2/q3p3/3PP3/2N2N2/PPP2PPP/R1BQKB1R b KQkq - +Ponziani: Leonhardt variation * +rnb1kb1r/pp1p1ppp/2p2n2/q3p3/3PP3/2N2P2/PPP3PP/R1BQKBNR b KQkq - +Ponziani: Steinitz variation * +rnb1kb1r/pp1p1ppp/2p2n2/q3p3/3PP3/2N5/PPPB1PPP/R2QKBNR b KQkq - +Ponziani: Caro variation * +rnb1kb1r/pp1p2pp/2p2n2/q3p1B1/2B1P3/8/PPP2PPP/RN1QK1NR w KQkq - +KGD: classical, Marshall attack * +rnb1kb1r/pp1ppppp/5n2/q1pP4/8/2N5/PPP1PPPP/R1BQKBNR w KQkq - +Woozle defense +rnb1kb1r/pp2pppp/1qp2n2/3p4/2PP4/2N2N2/PP2PPPP/R1BQKB1R w KQkq - +QGD Slav: S\"uchting variation +rnb1kb1r/pp2pppp/5n2/q1Pp4/8/5N2/PPP1PPPP/RNBQKB1R w KQkq - +QGA: Mannheim variation * +rnb1kb1r/pp3pp1/2p1pq1p/3p4/2PP4/1QN2N2/PP2PPPP/R3KB1R b KQkq - +QGD/QGD semi-Slav: Hastings variation +rnb1kb1r/pp3ppp/1q2pn2/2pP2B1/3P4/2N5/PP2PPPP/R2QKBNR w KQkq - +QGD: Canal (Venice) variation +rnb1kb1r/ppp1pppp/5n2/8/3q4/2N2N2/PPPPQ1PP/R1B1KB1R b KQkq - +Queen's pawn: Englund gambit * +rnb1kb1r/ppp1q1pp/5n2/4Np2/2Bp1B2/8/PPP2PPP/RN1QK2R b KQkq - +KGD: Falkbeer, main line, 7...Bf5 * +rnb1kb1r/ppp1q2p/5n2/4Npp1/2Bp1B2/8/PPP2PPP/RN1Q1RK1 b kq - +KGD: Falkbeer, Tarrasch variation * +rnb1kb1r/ppp1qppp/5n2/3PN3/4p3/8/PPPP1PPP/RNBQKB1R w KQkq - +Petrov: modern attack, Steinitz variation * +rnb1kb1r/ppp1qppp/8/3n4/2N1p3/2N5/PPPP1PPP/R1BQKB1R b KQkq - +Petrov: modern attack, Bardeleben variation * +rnb1kb1r/ppp2p1p/3p3n/4N3/2BPPppq/8/PPP3PP/RNBQ1K1R w kq - +KGA: Salvio gambit, Anderssen counter-attack +rnb1kb1r/ppp2ppp/5n2/3qN3/4p3/8/PPPP1PPP/RNBQKB1R w KQkq - +Petrov: modern attack, main line * +rnb1kb1r/ppp2ppp/5n2/3qp3/8/3P4/PP2PPPP/RNBQKBNR w KQkq - +Sicilian, Chekhover variation * +rnb1kb1r/ppp2ppp/5n2/3qp3/8/3P4/PPPB1PPP/RN1QKBNR b KQkq - +Philidor: Boden variation * +rnb1kb1r/ppp2ppp/5n2/4N3/3qp3/3P4/PPP2PPP/RNBQKB1R w KQkq - +Philidor: Nimzovich, Rellstab variation * +rnb1kb1r/ppp2ppp/8/3NP2q/8/3P1Nn1/PPP4P/R1BQKB1R b KQkq - +Vienna gambit, Wurzburger trap +rnb1kb1r/ppp3pp/8/3q1p2/4nPP1/8/PPPNQ2P/R1B1KBNR b KQkq - +KGD: Falkbeer, Charousek variation +rnb1kb1r/pppp1p1p/7n/4N3/2BPP1pq/5p2/PPP3PP/RNBQ1K1R w kq - +KGA: Silberschmidt gambit +rnb1kb1r/pppp2p1/8/4pq1p/8/3B1N1P/PPPP1K2/RNBQ3R b kq - +KGA: Allgaier, Horny defense * +rnb1kb1r/ppppqppp/5n2/4N3/8/3P4/PPP2PPP/RNBQKB1R w KQkq - +Petrov: Cozio (Lasker) attack * +rnb1kb1r/ppq1p1pp/2pp1n2/5p2/2PP4/2N3P1/PP2PPBP/R1BQK1NR w KQkq - +Dutch: Hort-Antoshin system +rnb1kbnr/p1pp1ppp/8/1p6/2B1Pp1q/8/PPPP2PP/RNBQ1KNR w kq - +KGA: bishop's gambit, Bryan counter-gambit +rnb1kbnr/pp1ppppp/8/q1p5/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - +Sicilian: Stiletto (Althouse) variation +rnb1kbnr/pp2pppp/1qp5/3p4/3PP3/8/PPPN1PPP/R1BQKBNR w KQkq - +Caro-Kann: Edinburgh variation +rnb1kbnr/pp2pppp/8/3q4/1p6/P7/1BPP1PPP/RN1QKBNR b KQkq - +Sicilian: wing gambit, Marienbad variation +rnb1kbnr/pp3ppp/2p1q3/4p3/8/2N5/PPPPBPPP/R1BQK1NR b KQkq - +Center game: Charousek variation * +rnb1kbnr/ppp1pp1p/3q4/3p2p1/5P2/4P3/PPPP2PP/RNBQKBNR w KQkq - +Dutch, Von Pretzel gambit * +rnb1kbnr/ppp1pppp/3q4/3p4/5P2/8/PPPPP1PP/RNBQKBNR w KQkq - +Dutch, Manhattan (Alapin, Ulvestad) variation * +rnb1kbnr/ppp1pppp/3q4/8/8/2N5/PPPP1PPP/R1BQKBNR w KQkq - +Scandinavian: Pytel-Wade variation +rnb1kbnr/ppp1pppp/8/q7/1P6/2N5/P1PP1PPP/R1BQKBNR b KQkq - +Scandinavian, Mieses-Kotr\v c gambit +rnb1kbnr/ppp1q1pp/3p4/4Pp2/3p4/5N2/PPP2PPP/RNBQKB1R w KQkq - +KGD: Falkbeer, R\'eti variation * +rnb1kbnr/ppp1q1pp/8/4Np2/3p4/8/PPP2PPP/RNBQKB1R w KQkq - +KGD: Falkbeer, Charousek gambit * +rnb1kbnr/ppp2p1p/8/3B2p1/4Pp1q/6P1/PPPP3P/RNBQ1KNR b kq - +KGA: bishop's gambit, Chigorin's attack (Gifford variation) +rnb1kbnr/ppp2ppp/4p3/3q4/3PN3/8/PPP2PPP/R1BQKBNR w KQkq - +French: Frere (Becker) variation +rnb1kbnr/ppp2ppp/4q3/4p3/5P2/2N5/PPPP2PP/R1BQKBNR b KQkq - +Center game: l'Hermet variation * +rnb1kbnr/ppp2ppp/4q3/4p3/8/2N2N2/PPPP1PPP/R1BQKB1R b KQkq - +Center game: Berger variation * +rnb1kbnr/ppp2ppp/4q3/4p3/8/2N5/PPPP1PPP/R1BQKBNR w KQkq - +Center game: Paulsen attack * +rnb1kbnr/ppp2ppp/8/2q1p3/8/2N5/PPPP1PPP/R1BQKBNR w KQkq - +Center game: Hall variation * +rnb1kbnr/ppp2ppp/8/3p2q1/2PPp3/4P3/PP3PPP/RNBQKBNR w KQkq - +French: advance, Nimzovich variation * +rnb1kbnr/ppp2ppp/8/3qp3/8/2N5/PPPP1PPP/R1BQKBNR b KQkq - +Center game * +rnb1kbnr/ppp2ppp/8/3qp3/8/8/PPPP1PPP/RNBQKBNR w KQkq - +Center game * +rnb1kbnr/ppp2ppp/8/q3p3/3P4/2N2N2/PPP2PPP/R1BQKB1R b KQkq - +Scandinavian: Anderssen counter-attack, Goteborg system +rnb1kbnr/ppp2ppp/8/q3p3/3P4/2N5/PPP2PPP/R1BQKBNR w KQkq - +Scandinavian: Anderssen counter-attack +rnb1kbnr/ppp3pp/3p1q2/8/3Pp3/4N3/PPP2PPP/RNBQKB1R b KQkq - +Latvian: Nimzovich variation +rnb1kbnr/pppp1B1p/8/4q3/5p2/5Q2/PPPP2PP/RNB2RK1 b kq - +KGA: double Muzio gambit +rnb1kbnr/pppp1p1p/8/4N3/2B1P1pq/5p2/PPPP2PP/RNBQ1K1R w kq - +KGA: Cochrane gambit +rnb1kbnr/pppp1p1p/8/6p1/2B1Pp1q/5Q2/PPPP2PP/RNB2KNR b kq - +KGA: bishop's gambit, classical defense, Cozio attack +rnb1kbnr/pppp1p1p/8/6p1/2B1Pp1q/8/PPPP2PP/RNBQ1KNR w kq - +KGA: bishop's gambit, classical defense +rnb1kbnr/pppp1ppp/5q2/4p3/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - +Greco defense +rnb1kbnr/pppp1ppp/5q2/4p3/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +KP: Napoleon's opening * +rnb1kbnr/pppp1ppp/5q2/4p3/4PP2/8/PPPP2PP/RNBQKBNR w KQkq - +KGD: Norwalde variation +rnb1kbnr/pppp1ppp/8/4p3/4P2q/8/PPPP1PPP/RNBQKBNR w KQkq - +KP: Patzer opening * +rnb1kbnr/pppp2pp/5q2/4pP2/8/8/PPPP1PPP/RNBQKBNR w KQkq - +KGA: Breyer gambit * +rnb1kbnr/ppppq1pp/8/4pP2/8/8/PPPP1PPP/RNBQKBNR w KQkq - +KGA: Carrera (Basman) gambit * +rnb1kbnr/ppppq2p/8/4Np2/2BPPppP/8/PPP3P1/RNBQK2R b KQkq - +KGA: Kieseritsky, Salvio defense, Cozio variation +rnb1kbnr/ppppqp1p/8/4N3/4PppP/8/PPPP2P1/RNBQKB1R w KQkq - +KGA: Kieseritsky, Salvio (Rosenthal) defense +rnb1kbnr/ppppqp1p/8/8/2B1Pp2/5Q2/PPPP2PP/RNB2RK1 w kq - +KGA: Muzio gambit, From defense +rnb1kbnr/ppppqp1p/8/8/2B1Ppp1/5N2/PPPP2PP/RNBQ1RK1 w kq - +KGA: Muzio gambit, Kling and Horwitz counter-attack +rnb1kbnr/ppppqppp/8/4p3/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - +Gunderam defense +rnb1kbnr/ppppqppp/8/4p3/4PP2/6P1/PPPP3P/RNBQKBNR w KQkq - +KGD: Keene's defense +rnb1kbnr/ppppqppp/8/4p3/8/4P3/PPPP1PPP/RNBQKBNR w KQkq - +French: Chigorin variation * +rnb1kbnr/ppppqppp/8/8/2B1P3/8/PB3PPP/RN1QK1NR w KQkq - +Danish gambit: Collijn defense +rnb1kbnr/ppq1pppp/8/2p1N3/4p3/8/PPPP1PPP/RNBQKB1R w KQkq - +Budapest: Fajarowicz, Steiner variation * +rnb1kbnr/ppq1pppp/8/2pp4/8/5NP1/PPPPPP1P/RNBQKB1R w KQkq - +Queen's pawn: Mengarini attack * +rnb1kbnr/ppqppppp/8/2p5/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - +Sicilian: Quinteros variation +rnb1qrk1/pp2b1pp/2p1pn2/3p1pB1/2PP4/2N2NP1/PPQ1PPBP/R4RK1 b - - +Dutch: stonewall: Chekhover variation +rnb1qrk1/ppp1b1pp/3ppn2/5p2/2PP4/1PN2NP1/P3PPBP/R1BQ1RK1 b - - +Dutch: Ilyin-Genevsky variation with b3 +rnb1qrk1/ppp1b1pp/3ppn2/5p2/2PP4/2N2NP1/PP2PPBP/R1BQ1RK1 w - - +Dutch: Ilyin-Genevsky variation +rnb1qrk1/ppp1b1pp/3ppn2/5p2/2PP4/2N2NP1/PP2PPBP/R1BQR1K1 b - - +Dutch: Ilyin-Genevsky, Winter variation +rnb1qrk1/ppp1b1pp/3ppn2/5p2/2PP4/2N2NP1/PPQ1PPBP/R1B2RK1 b - - +Dutch: Ilyin-Genevsky variation with Qc2 +rnb1r1k1/ppp2ppp/1b6/3qp3/1PP5/P2P1N2/4BPPP/R1BQK2R b KQ - +Ruy Lopez: Noah's ark trap * +rnb2bnr/pppp1k1p/5q2/8/4Pp2/2N1BQ2/PPP3PP/R4RK1 b - - +KGA: Lolli gambit, Young variation +rnb2knr/pppp2pp/5q2/2b1pP1Q/6P1/8/PPPP1P1P/RNB1KBNR w KQ - +KGA: bishop's gambit, classical defense, Cozio attack * +rnb2rk1/p1p1qppp/1p3n2/8/4p3/2P5/PNPPBPPP/R1BQK2R w KQ - +Ruy Lopez: Berlin defense, Pillsbury variation * +rnb2rk1/p1pqppbp/1p4p1/8/2BPP3/2P5/P3NPPP/R1BQ1RK1 w - - +Gr\"unfeld: exchange, Larsen variation +rnb2rk1/p1q1ppbp/1p3np1/2pp4/3P4/2P1PN2/PP1NBPPP/R1BQ1RK1 w - - +Catalan: closed, Qc2 & b3 * +rnb2rk1/p4ppp/1qp2n2/2bPp3/B7/2NP4/PPP2PPP/R1BQK1NR w KQ - +Evans gambit: Waller attack * +rnb2rk1/pp2ppbp/2pp1np1/q7/2PP4/2N2NP1/PP2PPBP/R1BQ1RK1 w - - +King's Indian: fianchetto, Kavalek (Bronstein) variation +rnb2rk1/pp2qppp/1b2pn2/3p4/1PP5/P3PN2/1B3PPP/RN1QKB1R b KQ - +QGA: classical, 8...Bb7 * +rnb2rk1/pp2qppp/1b3n2/2p1N3/1P1Pp3/P1N1B3/2P1BPPP/R2QK2R w KQ - +Ruy Lopez: open, Howell attack, Adam variation * +rnb2rk1/pp2qppp/4pn2/2bp4/1PP5/P3PN2/5PPP/RNBQKB1R b KQ - +QGA: classical, 7...b5 * +rnb2rk1/pp2qppp/4pn2/2bp4/2P5/P3PN2/1P3PPP/RNBQKB1R w KQ - +QGA: classical, 7.Qe2 * +rnb2rk1/pp2qppp/4pn2/2p5/1bBP4/2N1PN2/PP3PPP/R1BQ1RK1 w - - +Nimzo-Indian: 4.e3, Gligori\'c system, Smyslov variation +rnb2rk1/pp2qppp/5n2/2b5/1PB1p3/P1N1PN2/5PPP/R1BQK2R w KQ - +QGA: classical, Furman variation * +rnb2rk1/pp2qppp/5n2/2p5/4p3/2P5/PNPPBPPP/R1BQK2R w KQ - +Ruy Lopez: Berlin defense, Zukertort variation * +rnb2rk1/pp3ppp/1bpq1n2/4N3/1PBPp3/P1N1B3/2P2PPP/R2QK2R w KQ - +Ruy Lopez: open, Motzko attack * +rnb2rk1/pp3ppp/1bpq1n2/4N3/1PBPp3/P3B3/2P1NPPP/R2QK2R b KQ - +Ruy Lopez: open, Motzko attack, Nenarokov variation * +rnb2rk1/ppB1ppbp/6p1/3q4/3P4/4P3/PP3PPP/R2QKBNR b KQ - +Gr\"unfeld: Gr\"unfeld gambit accepted +rnb2rk1/ppp1qpp1/4p2p/3P4/3P4/2P1PN2/P4PPP/R2QKB1R b KQ - +QGD: Lasker defense, main line +rnb2rk1/ppp1qpp1/4p2p/3p4/2PPn3/2N1PN2/PPQ2PPP/R3KB1R b KQ - +QGD: Lasker defense, Teichmann variation +rnb2rk1/ppp1qppp/1b3n2/4N3/1P1Pp3/P1N1B3/2P2PPP/R2QKB1R w KQ - +Ruy Lopez: open, Howell attack * +rnb2rk1/ppp1qppp/5n2/3pN3/1b1PP3/2N5/PPP1BPPP/R1BQK2R b KQ - +Ruy Lopez: Berlin defense, Trifunovi\'c variation * +rnb2rk1/ppp1qppp/5n2/8/4pN2/2P5/P1PPBPPP/R1BQK2R b KQ - +Ruy Lopez: Berlin defense, Cordel variation * +rnb2rk1/ppp1qppp/8/3n4/4p3/2P5/PNPPBPPP/R1BQK2R w KQ - +Ruy Lopez: Berlin defense, Winawer attack * +rnb2rk1/ppp2pbp/3p2p1/3Pp3/2n1P2Q/2N2P2/PP2K2P/R5NR w - - +King's Indian: S\"amisch, orthodox, Bronstein variation +rnb2rk1/ppp2pp1/3q3p/3p4/3P4/1QP1PN2/P4PPP/R3KB1R w KQ - +QGD: Lasker defense, Bernstein variation +rnb2rk1/pppp2pp/5q2/2b1pP2/8/2N5/PPPP1P1P/R1BQKBNR b KQ - +KGA: Muzio gambit, Holloway defense * +rnb2rk1/pppp2pp/5q2/2b1pP2/8/8/PPPPQP1P/RNB1KBNR b KQ - +KGA: Muzio gambit, From defense * +rnb2rk1/pppp2pp/5q2/5P2/4Q3/8/PPPP1b1P/RNB1KBNR w KQ - +KGA: double Muzio gambit * +rnb2rk1/ppppqppp/1b3n2/4p3/1P2P3/P1N2N2/2PPBPPP/R1BQ1RK1 b - - +Ruy Lopez: Worrall attack, sharp line * +rnb2rk1/ppppqppp/1b3n2/4p3/1P2P3/P1NP1N2/2P1BPPP/R1BQK2R b KQ - +Ruy Lopez: Worrall attack, solid line * +rnb2rk1/ppppqppp/5n2/b3N3/4P3/P1N5/1PPP1PPP/R1BQKB1R w KQ - +Ruy Lopez: open, Tartakower variation * +rnb2rk1/ppppqppp/5n2/b3p3/4P3/P1N2N2/1PPPBPPP/R1BQK2R w KQ - +Ruy Lopez: Worrall attack * +rnb2rk1/ppq1ppbp/5np1/2pp4/3P4/4PN2/PPPNBPPP/R1BQ1RK1 w - - +Catalan: closed, 7.Qc2 * +rnbk1b1r/pppnqBpp/8/4Np2/3Q4/8/PPP2PPP/RNB1K2R w KQ - +KGD: Falkbeer, Alapin variation * +rnbk1bnr/pppp2pp/8/8/2B1pp1q/2N5/PPPPQ1PP/R1BK2NR w - - +KGA: L\'opez-Gianutio counter-gambit, Hein variation +rnbq1bnr/ppp3k1/7p/3B4/3PPppP/8/PPP3P1/RNBQK2R b KQ - +KGA: Allgaier, Urusov attack +rnbq1bnr/ppp3k1/7p/4B3/2BPp1pP/8/PPP3P1/RN1QK2R b KQ - +KGA: Allgaier, Cook variation +rnbq1bnr/pppp1k2/7p/8/2B1PppP/8/PPPP2P1/RNBQK2R b KQ - +KGA: Allgaier, Walker attack +rnbq1bnr/pppp1k2/7p/8/3PPppP/8/PPP3P1/RNBQKB1R b KQ - +KGA: Allgaier, Thorold variation +rnbq1bnr/pppp1k2/7p/8/4PppP/2N5/PPPP2P1/R1BQKB1R b KQ - +KGA: Allgaier, Blackburne gambit +rnbq1bnr/pppp1kpp/8/4pP2/8/8/PPPP1PPP/RNBQKBNR w KQ - +KGA: Tumbleweed gambit * +rnbq1bnr/pppppkpp/5p2/8/3PP3/8/PPP2PPP/RNBQKBNR w KQ - +Fried fox defense +rnbq1bnr/pppppkpp/5p2/8/4P3/8/PPPP1PPP/RNBQKBNR w KQ - +Hammerschlag (Fried fox/Pork chop opening) * +rnbq1k1r/pp3ppp/5n2/1Bbpp3/8/2N2N2/PPPP1PPP/R1BQK2R w KQ - +Giuoco Piano: Cracow variation * +rnbq1k1r/ppp2Bpp/8/4N2Q/1b1Pp3/2n5/PPP2PPP/R1B1K2R b KQ - +Two knights defense, Keidanz variation * +rnbq1k1r/ppp2pp1/4p2p/3pP3/3Pn1Q1/2P5/P1P2PPP/R1B1KBNR b KQ - +French: MacCutcheon, Duras variation +rnbq1k1r/ppp3pp/5P2/2bpp1PQ/4n3/7N/PPPP1P1P/RNB1KB1R b KQ - +KGA: Silberschmidt gambit * +rnbq1k1r/ppp3pp/8/2bppPPQ/4n3/3P3N/PPP2P1P/RNB1KB1R b KQ - +KGA: Salvio gambit, Anderssen counter-attack * +rnbq1k1r/pppp2pp/5P2/2b1p1PQ/4n3/8/PPPP1P1P/RNB1KBNR b KQ - +KGA: Cochrane gambit * +rnbq1k1r/pppp2pp/8/2b1pPPQ/4n3/2N5/PPPP1P1P/R1B1KBNR b KQ - +KGA: Herzfeld gambit * +rnbq1knr/pppp2pp/8/2b1pP1Q/1P6/8/P1PP1PPP/RNB1KBNR b KQ - +KGA: bishop's gambit, Bryan counter-gambit * +rnbq1knr/pppp2pp/8/2b1pP1Q/2B5/8/PPPP1PPP/RNB1K1NR b KQ - +KGA: bishop's gambit, Greco variation * +rnbq1knr/pppp2pp/8/2b1pP1Q/6P1/8/PPPP1P1P/RNB1KBNR b KQ - +KGA: bishop's gambit, classical defense * +rnbq1knr/pppp2pp/8/2b1pP1Q/8/2N5/PPPP1PPP/R1B1KBNR b KQ - +KGA: bishop's gambit, Boden defense * +rnbq1knr/pppp2pp/8/4pP1Q/3b4/3B4/PPP2PPP/RNB1K1NR b KQ - +KGA: bishop's gambit, Bor\'en-Svenonius variation * +rnbq1knr/pppp3p/6p1/4pP1Q/3b2P1/8/PPP2P1P/RNB1KBNR w KQ - +KGA: bishop's gambit, Chigorin's attack (Gifford variation) * +rnbq1r1k/p1p4P/5n2/2bpp2B/8/8/PPPP1PPP/RNBQK1NR w KQ - +Bishop's opening: Four pawns' gambit * +rnbq1r1k/pppp3P/5n2/2b1p2B/8/8/PPPP1PPP/RNBQK1NR w KQ - +KGA: Cunningham, three pawns gambit * +rnbq1rk1/1p2ppbp/p1pp1np1/8/2PPP3/2NBBP2/PP4PP/R2QK1NR w KQ - +King's Indian: S\"amisch, Byrne variation +rnbq1rk1/1p3pbp/p2p1np1/2pP4/P3P3/2N2N2/1P2BPPP/R1BQ1RK1 b - - +Benoni: classical, 9...a6, 10.a4 +rnbq1rk1/1p3ppp/4pn2/p1bp4/2P5/P3PN2/1P3PPP/RNBQKB1R w KQ - +QGA: classical, Rubinstein variation * +rnbq1rk1/1pp1ppbp/p4np1/8/2QPP3/2N2N2/PP3PPP/R1B1KB1R w KQ - +Gr\"unfeld: Russian, Alekhine (Hungarian) variation +rnbq1rk1/1pp2pbp/3p1np1/p2Pp3/2P1P3/2N2N2/PP2BPPP/R1BQK2R w KQ - +King's Indian: Petrosian system, Stein variation +rnbq1rk1/1pp2ppp/1b3n2/p2NN3/1P1PP3/P7/2P2PPP/R1BQKB1R b KQ - +Ruy Lopez: open, Schlechter defense * +rnbq1rk1/1ppp1ppp/1b3n2/p3p3/1P2P3/P1N2N2/2PPBPPP/R1BQK2R w KQ - +Ruy Lopez: Wing attack * +rnbq1rk1/2p1bppp/p2p1n2/1p2p3/3PP3/1BP2N1P/PP3PP1/RNBQR1K1 b - - +Ruy Lopez: closed, Breyer, 10.d4 +rnbq1rk1/2p1bppp/p2p1n2/1p2p3/4P3/1BP2N1P/PP1P1PP1/RNBQR1K1 w - - +Ruy Lopez: closed, Breyer defense +rnbq1rk1/p1p1bpp1/1p2p2p/3n4/3P3B/2N1PN2/PP3PPP/R2QKB1R w KQ - +QGD: Tartakower (Makagonov-Bondarevsky) system, 8.cd Nxd5 +rnbq1rk1/p1p1bpp1/1p2pn1p/3p4/2PP3B/2N1PN2/PP3PPP/R2QKB1R w KQ - +QGD: Tartakower (Makagonov-Bondarevsky) system +rnbq1rk1/p1p1ppbp/1p1p1np1/8/2PPP3/2N1BP2/PP4PP/R2QKBNR w KQ - +King's Indian: S\"amisch, double fianchetto variation +rnbq1rk1/p1p1ppbp/1p3np1/8/2QPP3/2N2N2/PP3PPP/R1B1KB1R w KQ - +Gr\"unfeld: Russian, Levenfish variation +rnbq1rk1/p1p1ppbp/1p4p1/8/2BPP3/2P5/P3NPPP/R1BQK2R w KQ - +Gr\"unfeld: exchange, Simagin's lesser variation +rnbq1rk1/p1p2ppp/1p2pn2/3p4/1bPP4/2NBPN2/PP3PPP/R1BQK2R w KQ - +Nimzo-Indian: 4.e3, main line with ...b6 +rnbq1rk1/p1pp1ppp/4pn2/1p6/2PP4/P1Q5/1P2PPPP/R1B1KBNR w KQ - +Nimzo-Indian: classical, Adorjan gambit +rnbq1rk1/p1pp1ppp/5n2/1p1Np3/1bB1P3/8/PPPP1PPP/R1BQK1NR w KQ - +Ruy Lopez: classical defense, Zaitsev variation * +rnbq1rk1/p2p1ppp/2p2n2/2b1p3/B3P3/2N5/PPPP1PPP/R1BQK1NR w KQ - +Evans gambit * +rnbq1rk1/p2p1ppp/2p2n2/2b1p3/B3P3/2NP4/PPP2PPP/R1BQK1NR b KQ - +Evans gambit * +rnbq1rk1/p3ppbp/1p3np1/2pp4/3P1P2/4PN2/PPP1B1PP/RNBQ1RK1 w - - +Dutch: stonewall, Botwinnik variation * +rnbq1rk1/p3ppbp/1p3np1/2pp4/8/1P2PN2/PBPPBPPP/RN1Q1RK1 w - - +Queen's Indian: Euwe variation * +rnbq1rk1/p4ppp/1p2pn2/2pp4/1bPP4/2NBPN2/PP3PPP/R1BQ1RK1 w - - +Nimzo-Indian: 4.e3, Keres variation +rnbq1rk1/p4ppp/2P2n2/2b1p3/B7/2N5/PPPP1PPP/R1BQK1NR b KQ - +Evans gambit: compromised defense * +rnbq1rk1/p4ppp/2p2n2/2bpp1B1/B3P3/2NP4/PPP2PPP/R2QK1NR b KQ - +Evans gambit: Alapin-Steinitz variation * +rnbq1rk1/p4ppp/2p2n2/2bpp3/4P3/1BNP4/PPP2PPP/R1BQK1NR b KQ - +Evans gambit: Lasker defense * +rnbq1rk1/p4ppp/2p2n2/2bpp3/B3P3/2NP4/PPPB1PPP/R2QK1NR b KQ - +Evans gambit: Sanders-Alapin variation * +rnbq1rk1/p4ppp/2p5/2bpp3/B3n3/2N2N2/PPPP1PPP/R1BQ1RK1 w - - +Evans gambit: Richardson attack * +rnbq1rk1/p4ppp/5n2/2bpp3/8/1BNP4/PPP2PPP/R1BQK1NR b KQ - +Evans gambit: normal variation * +rnbq1rk1/pp1p1ppp/2p2n2/b7/4PB2/P1NP4/1PP3PP/R2QKBNR w KQ - +Ruy Lopez: Siesta, Kopayev variation * +rnbq1rk1/pp1p1ppp/4pn2/2P5/1bP5/2N5/PPQ1PPPP/R1B1KBNR w KQ - +Nimzo-Indian: classical, Pir\'c variation +rnbq1rk1/pp1pppbp/5np1/2p5/3P4/4PN2/PPP1BPPP/RNBQK2R w KQ - +English: Neo-Catalan declined * +rnbq1rk1/pp2b1pp/2p1pn2/3p1p2/2PP4/2N2NP1/PP2PPBP/R1BQ1RK1 w - - +Dutch: stonewall with Nc3 +rnbq1rk1/pp2b1pp/2p1pn2/3p1p2/2PP4/BP3NP1/P3PPBP/RN1Q1RK1 b - - +Dutch: stonewall with Ba3 +rnbq1rk1/pp2p1bp/2pp1np1/5p2/2PP4/2N2NP1/PP2PPBP/R1BQ1RK1 w - - +Dutch: Leningrad, main variation with c6 +rnbq1rk1/pp2ppbp/2p2np1/3p4/2PP4/5NP1/PP2PPBP/RNBQ1RK1 w - - +Neo-Gr\"unfeld, 6.O-O c6 +rnbq1rk1/pp2ppbp/2p2np1/8/2QPP3/2N2N2/PP3PPP/R1B1KB1R w KQ - +Gr\"unfeld: Russian, Szabo (Boleslavsky) variation +rnbq1rk1/pp2ppbp/3p1np1/2p3B1/2PPP3/2N5/PP2BPPP/R2QK1NR w KQ - +King's Indian: Averbakh, 6...c5 +rnbq1rk1/pp2ppbp/3p1np1/2p5/2PP4/2N2NP1/PP2PPBP/R1BQ1RK1 b - - +King's Indian: fianchetto, Yugoslav, 7.O-O +rnbq1rk1/pp2ppbp/3p1np1/2p5/2PP4/2N2NP1/PP2PPBP/R1BQK2R w KQ - +King's Indian: fianchetto, Yugoslav system +rnbq1rk1/pp2ppbp/3p1np1/2p5/2PPPP2/2N2N2/PP2B1PP/R1BQK2R b KQ - +King's Indian: Four pawns attack, with Be2 and Nf3 +rnbq1rk1/pp2ppbp/3p1np1/2pP4/2P1PP2/2N2N2/PP4PP/R1BQKB1R b KQ - +King's Indian: Four pawns attack, dynamic line +rnbq1rk1/pp2ppbp/3p1np1/8/3NP3/2N1BP2/PPP3PP/R2QKB1R w KQ - +Sicilian: dragon, Yugoslav attack, 7...O-O +rnbq1rk1/pp2ppbp/5np1/2pp4/3P1P2/4PN2/PPP1B1PP/RNBQ1RK1 b - - +Dutch: stonewall variation * +rnbq1rk1/pp2ppbp/5np1/2pp4/3P4/2P2NP1/PP2PPBP/RNBQ1RK1 b - - +Neo-Gr\"unfeld, 6.O-O c6 * +rnbq1rk1/pp2ppbp/5np1/2pp4/3P4/4PN2/PPPNBPPP/R1BQ1RK1 b - - +Catalan: closed, 6...Nbd7 * +rnbq1rk1/pp2ppbp/5np1/2pp4/3P4/5NP1/PPP1PPBP/RNBQ1RK1 w - - +Neo-Gr\"unfeld, 6.O-O * +rnbq1rk1/pp2ppbp/5np1/2pp4/5P2/3PPN2/PPP1B1PP/RNBQ1RK1 b - - +Dutch: classical variation * +rnbq1rk1/pp2ppbp/5np1/2pp4/8/1P2PN2/PBPPBPPP/RN1QK2R w KQ - +Queen's Indian: old main line, 6.O-O * +rnbq1rk1/pp2ppbp/5np1/2ppN3/5P2/4P3/PPPPB1PP/RNBQ1RK1 b - - +Dutch defense, Alekhine variation * +rnbq1rk1/pp2ppbp/5np1/3p4/3N4/6P1/PPP1PPBP/RNBQ1RK1 w - - +Neo-Gr\"unfeld, 6.cd Nxd5, 7.O-O * +rnbq1rk1/pp2ppbp/5np1/3p4/3P4/5NP1/PP2PPBP/RNBQ1RK1 b - - +Neo-Gr\"unfeld, 6.O-O, main line * +rnbq1rk1/pp2ppbp/5np1/3p4/3P4/5NP1/PP2PPBP/RNBQ1RK1 w - - +Neo-Gr\"unfeld, 6.O-O, main line +rnbq1rk1/pp2ppbp/5np1/3p4/8/1N4P1/PPP1PPBP/RNBQ1RK1 b - - +Neo-Gr\"unfeld, 6.cd Nxd5, 7.O-O Nb6 * +rnbq1rk1/pp2ppbp/5np1/8/2pN4/6P1/PP2PPBP/RNBQ1RK1 w - - +Neo-Gr\"unfeld, 6.cd Nxd5, 7.O-O c5, 8.dc * +rnbq1rk1/pp2ppbp/6p1/2Pn4/8/5NP1/PP2PPBP/RNBQ1RK1 b - - +Neo-Gr\"unfeld, 6.cd Nxd5, 7.O-O c5, 8.dc +rnbq1rk1/pp2ppbp/6p1/2p5/2BPP3/2P5/P3NPPP/R1BQK2R w KQ - +Gr\"unfeld: exchange, Spassky variation +rnbq1rk1/pp2ppbp/6p1/2pn4/3P4/2N2NP1/PP2PPBP/R1BQ1RK1 b - - +Neo-Gr\"unfeld, 6.cd Nxd5, 7.O-O c5, 8.Nc3 +rnbq1rk1/pp3pbp/2pp1np1/3Pp3/2P1P3/2N1BP2/PP4PP/R2QKBNR w KQ - +King's Indian: S\"amisch, orthodox, 7.d5 c6 +rnbq1rk1/pp3pbp/2pp1np1/4p3/2PPP3/2N1BP2/PP2N1PP/R2QKB1R w KQ - +King's Indian: S\"amisch, orthodox, 7.Nge2 c6 +rnbq1rk1/pp3pbp/2pp1np1/4p3/2PPP3/2N2N2/PP2BPPP/R1BQ1RK1 w - - +King's Indian: orthodox, Donner variation +rnbq1rk1/pp3pbp/3p1np1/2pP4/4P3/2N2N2/PP2BPPP/R1BQ1RK1 b - - +Benoni: classical, 9.O-O +rnbq1rk1/pp3pbp/3p1np1/2pP4/4P3/2N2N2/PP2BPPP/R1BQK2R w KQ - +Benoni: classical without 9.O-O +rnbq1rk1/pp3pbp/3p1np1/2pP4/4PP2/2N2N2/PP4PP/R1BQKB1R w KQ - +Benoni: four pawns attack +rnbq1rk1/pp3pbp/3p1np1/2pP4/8/2N2NP1/PP2PPBP/R1BQK2R w KQ - +Benoni: fianchetto variation +rnbq1rk1/pp3pbp/3p1np1/2ppP3/2P2P2/2N2N2/PP2B1PP/R1BQK2R b KQ - +King's Indian: Four pawns attack, Florentine gambit +rnbq1rk1/pp3pbp/3p1np1/3pp3/2P1P3/2N1BP2/PP2N1PP/R2QKB1R w KQ - +King's Indian: S\"amisch, orthodox main line +rnbq1rk1/pp3pbp/3ppnp1/2pP2B1/2P1P3/2N5/PP2BPPP/R2QK1NR w KQ - +King's Indian: Averbakh, main line +rnbq1rk1/pp3pbp/3ppnp1/2pP4/2P1PP2/2N2N2/PP2B1PP/R1BQK2R b KQ - +King's Indian: Four pawns attack +rnbq1rk1/pp3ppp/1b3n2/2ppN3/1P1PP3/P1N5/2P2PPP/R1BQKB1R w KQ - +Ruy Lopez: open, Harksen gambit * +rnbq1rk1/pp3ppp/1bp2n2/4N3/1P1Pp3/P1N1B3/2P1BPPP/R2QK2R b KQ - +Ruy Lopez: open, classical defense * +rnbq1rk1/pp3ppp/1bp2n2/4N3/1P1Pp3/P1N1B3/2P2PPP/R2QKB1R w KQ - +Ruy Lopez: open, 9.c3 * +rnbq1rk1/pp3ppp/1bp2n2/4N3/1PBPp3/P1N1B3/2P2PPP/R2QK2R b KQ - +Ruy Lopez: open, Italian variation * +rnbq1rk1/pp3ppp/1bp2n2/8/1PNPp3/P1N1B3/2P2PPP/R2QKB1R b KQ - +Ruy Lopez: open, Berlin variation * +rnbq1rk1/pp3ppp/2p2n2/2bP2N1/2B1p3/2N5/PPPP1PPP/R1BQK2R w KQ - +two knights: Max Lange attack, Krause variation * +rnbq1rk1/pp3ppp/2p2n2/2bPp1B1/2B5/2NP4/PPP2PPP/R2QK1NR b KQ - +Scotch gambit: Anderssen (Paulsen, Suhle) counter-attack * +rnbq1rk1/pp3ppp/2p2n2/3pp3/1b2P3/1BN2N2/PPPP1PPP/R1BQ1RK1 b - - +Ruy Lopez: classical defense, Benelux variation * +rnbq1rk1/pp3ppp/2p2n2/3pp3/2P5/2NP1N2/PP1QPPPP/R3KB1R w KQ - +Sicilian: Canal-Sokolsky attack, Bronstein gambit * +rnbq1rk1/pp3ppp/2p2n2/b2PN3/4p3/P1N5/1PPPBPPP/R1BQK2R w KQ - +Ruy Lopez: closed, Basque gambit (North Spanish variation) * +rnbq1rk1/pp3ppp/3b1n2/2ppN1B1/3P4/3B4/PPP2PPP/RN1Q1RK1 b - - +Petrov: classical attack, Tarrasch variation * +rnbq1rk1/pp3ppp/3b1n2/2ppN3/3P4/2N5/PPP1BPPP/R1BQK2R w KQ - +Petrov: classical attack, Jaenisch variation * +rnbq1rk1/pp3ppp/3b4/2pnp3/8/P2PPNP1/1P3P1P/RNBQKB1R b KQ - +Sicilian: Kan, Gipslis variation * +rnbq1rk1/pp3ppp/3b4/2ppN3/3PB3/8/PPP2PPP/RNBQ1RK1 b - - +Petrov: modern attack, Trifunovi\'c variation * +rnbq1rk1/pp3ppp/4p3/1B6/3PP3/5N2/P2Q1PPP/R3K2R b KQ - +QGD: Semi-Tarrasch, Kmoch variation +rnbq1rk1/pp3ppp/4p3/2pn4/3P4/P1P1PP2/6PP/R1BQKBNR w KQ - +Nimzo-Indian: S\"amisch, Botvinnik variation +rnbq1rk1/pp3ppp/4pn2/2bP4/8/4PN2/PP3PPP/RNBQKB1R b KQ - +QGA: classical, Steinitz variation * +rnbq1rk1/pp3ppp/4pn2/2bp4/2P5/4PN2/PP3PPP/RNBQKB1R w KQ - +QGA: classical variation, 6.O-O * +rnbq1rk1/pp3ppp/4pn2/2bp4/2P5/P3PN2/1P3PPP/RNBQKB1R b KQ - +QGA: classical, 6...a6 * +rnbq1rk1/pp3ppp/4pn2/2p5/1bBP4/2N1PN2/PP3PPP/R1BQ1RK1 b - - +Nimzo-Indian: 4.e3, Gligori\'c system with 7...dc +rnbq1rk1/pp3ppp/4pn2/2pp4/1bPP4/2NBPN2/PP3PPP/R1BQK2R w KQ - +Nimzo-Indian: 4.e3, main line with ...c5 +rnbq1rk1/pp3ppp/5n2/2bpp3/2P5/P3PN2/1P3PPP/RNBQKB1R w KQ - +QGA: classical, Geller variation * +rnbq1rk1/pp4pp/2p5/2bppp2/3PP1n1/2P4N/PP1NBPPP/R1BQ1RK1 b - - +Philidor: Hanham, Berger variation * +rnbq1rk1/ppp1b1pp/3ppn2/5p2/2PP4/5NP1/PP2PPBP/RNBQ1RK1 w - - +Dutch: classical variation +rnbq1rk1/ppp1b1pp/4pn2/3p1p2/2PP4/1P3NP1/P3PPBP/RNBQ1RK1 b - - +Dutch: stonewall, Botwinnik variation +rnbq1rk1/ppp1b1pp/4pn2/3p1p2/2PP4/2N2NP1/PP2PPBP/R1BQ1RK1 b - - +Dutch: stonewall with Nc3 +rnbq1rk1/ppp1b1pp/4pn2/3p1p2/2PP4/5NP1/PP2PPBP/RNBQ1RK1 w - - +Dutch: stonewall variation +rnbq1rk1/ppp1bpp1/4p2p/3p4/2PPn2B/2N1PN2/PP3PPP/R2QKB1R w KQ - +QGD: Lasker defense +rnbq1rk1/ppp1bpp1/4pB1p/3p4/2PP4/2N1PN2/PP3PPP/R2QKB1R b KQ - +QGD: Neo-orthodox variation, 7.Bxf6 +rnbq1rk1/ppp1bpp1/4pn1p/3p2B1/2PP4/2N1PN2/PP3PPP/R2QKB1R w KQ - +QGD: Neo-orthodox variation +rnbq1rk1/ppp1bpp1/4pn1p/3p4/2PP3B/2N1PN2/PP3PPP/R2QKB1R b KQ - +QGD: Neo-orthodox variation, 7.Bh4 +rnbq1rk1/ppp1bppp/4pn2/3p2B1/2PP4/2N1P3/PP3PPP/2RQKBNR b K - +QGD: Anti-neo-orthodox variation +rnbq1rk1/ppp1bppp/4pn2/3p2B1/2PP4/2N1P3/PP3PPP/R2QKBNR w KQ - +QGD: 4.Bg5 Be7, 5.e3 O-O +rnbq1rk1/ppp1bppp/4pn2/3p2B1/2PP4/2N1PN2/PP3PPP/R2QKB1R b KQ - +QGD: 6.Nf3 +rnbq1rk1/ppp1bppp/8/3p4/3Pn3/3B1N2/PPP2PPP/RNBQ1RK1 w - - +Petrov: classical attack, Mason variation +rnbq1rk1/ppp1ppbp/1n4p1/8/3P4/5NP1/PP2PPBP/RNBQ1RK1 w - - +Neo-Gr\"unfeld, 6.cd Nxd5, 7.O-O Nb6 +rnbq1rk1/ppp1ppbp/3p1np1/4P3/3P1P2/2N2N2/PPP3PP/R1BQKB1R b KQ - +Pirc: Austrian attack, 6.e5 +rnbq1rk1/ppp1ppbp/3p1np1/6B1/2PPP3/2N2N2/PP3PPP/R2QKB1R b KQ - +King's Indian: Zinnowitz variation +rnbq1rk1/ppp1ppbp/3p1np1/6B1/2PPP3/2N5/PP2BPPP/R2QK1NR b KQ - +King's Indian: Averbakh system +rnbq1rk1/ppp1ppbp/3p1np1/8/2PPP3/2N1B3/PP2BPPP/R2QK1NR b KQ - +King's Indian: Semi-Averbakh system +rnbq1rk1/ppp1ppbp/3p1np1/8/2PPP3/2N1BN2/PP3PPP/R2QKB1R b KQ - +King's Indian: Larsen variation +rnbq1rk1/ppp1ppbp/3p1np1/8/2PPP3/2N2N2/PP2BPPP/R1BQK2R b KQ - +King's Indian: 6.Be2 +rnbq1rk1/ppp1ppbp/3p1np1/8/2PPP3/2N2P2/PP4PP/R1BQKBNR w KQ - +King's Indian: S\"amisch, 5...O-O +rnbq1rk1/ppp1ppbp/3p1np1/8/2PPPP2/2N5/PP2B1PP/R1BQK1NR b KQ - +King's Indian: Four pawns attack, 6.Be2 +rnbq1rk1/ppp1ppbp/3p1np1/8/3PP3/6P1/PPP1NPBP/RNBQK2R b KQ - +R\'eti: King's Indian attack, Pachman system * +rnbq1rk1/ppp1ppbp/3p1np1/8/3PPP2/2N1BN2/PPP3PP/R2QKB1R b KQ - +Pirc: Austrian attack, 6.Be3 +rnbq1rk1/ppp1ppbp/3p1np1/8/3PPP2/2N2N2/PPP3PP/R1BQKB1R w KQ - +Pirc: Austrian attack +rnbq1rk1/ppp1ppbp/3p1np1/8/3PPP2/2NB1N2/PPP3PP/R1BQK2R b KQ - +Pirc: Austrian attack, 6.Bd3 +rnbq1rk1/ppp1ppbp/5np1/3p4/1PPP4/2N1PN2/P4PPP/R1BQKB1R b KQ - +Gr\"unfeld: Makogonov variation +rnbq1rk1/ppp1ppbp/5np1/3p4/2PP1B2/2N1P3/PP3PPP/2RQKBNR b K - +Gr\"unfeld: Gr\"unfeld gambit, Capablanca variation +rnbq1rk1/ppp1ppbp/5np1/3p4/2PP1B2/2N1P3/PP3PPP/R2QKBNR w KQ - +Gr\"unfeld: Gr\"unfeld gambit +rnbq1rk1/ppp1ppbp/5np1/3p4/2PP1B2/2N1PN2/PP3PPP/R2QKB1R b KQ - +Gr\"unfeld with Bf4 & e3 +rnbq1rk1/ppp1ppbp/5np1/3p4/2PP4/1QN1PN2/PP3PPP/R1B1KB1R b KQ - +Gr\"unfeld with e3 & Qb3 +rnbq1rk1/ppp1ppbp/5np1/3p4/2PP4/2N1PN2/PP1B1PPP/R2QKB1R b KQ - +Gr\"unfeld: Opo\v censky variation +rnbq1rk1/ppp1ppbp/5np1/3p4/2PP4/2NBPN2/PP3PPP/R1BQK2R b KQ - +Gr\"unfeld with e3 & Bd3 +rnbq1rk1/ppp1ppbp/5np1/3p4/2PP4/5NP1/PP2PPBP/RNBQ1RK1 b - - +Neo-Gr\"unfeld, 6.O-O +rnbq1rk1/ppp1ppbp/5np1/3p4/5P2/2P3PN/PP1PP1BP/RNBQK2R b KQ - +Dutch: Leningrad, Basman system * +rnbq1rk1/ppp1ppbp/5np1/8/2QPP3/2N2N2/PP3PPP/R1B1KB1R b KQ - +Gr\"unfeld: Russian variation with e4 +rnbq1rk1/ppp1ppbp/6p1/3n4/3P4/5NP1/PP2PPBP/RNBQ1RK1 b - - +Neo-Gr\"unfeld, 6.cd Nxd5, 7.O-O +rnbq1rk1/ppp2pbp/3p1np1/3Pp3/2P1P3/2N1BP2/PP4PP/R2QKBNR b KQ - +King's Indian: S\"amisch, orthodox, 7.d5 +rnbq1rk1/ppp2pbp/3p1np1/3Pp3/2P1P3/2N2N2/PP2BPPP/R1BQK2R b KQ - +King's Indian: Petrosian system +rnbq1rk1/ppp2pbp/3p1np1/4P3/2P1P3/2N2N2/PP2BPPP/R1BQK2R b KQ - +King's Indian: Andersson variation +rnbq1rk1/ppp2pbp/3p1np1/4p3/2PPP3/2N1BN2/PP2BPPP/R2QK2R b KQ - +King's Indian: Gligori\'c-Taimanov system +rnbq1rk1/ppp2pbp/3p1np1/4p3/2PPP3/2N1BP2/PP4PP/R2QKBNR w KQ - +King's Indian: S\"amisch, orthodox variation +rnbq1rk1/ppp2pbp/3p1np1/4p3/2PPP3/2N2N2/PP2BPPP/R1BQ1RK1 b - - +King's Indian: orthodox variation +rnbq1rk1/ppp2pbp/3p1np1/4p3/2PPP3/2N2N2/PP2BPPP/R1BQK2R w KQ - +King's Indian: classical variation +rnbq1rk1/ppp2pbp/3p1np1/4p3/2PPP3/2N3P1/PP2NPBP/R1BQK2R b KQ - +King's Indian: Pomar system +rnbq1rk1/ppp2pbp/4pnp1/3p4/2PP4/1QN1PN2/PP3PPP/R1B1KB1R w KQ - +Gr\"unfeld: Botvinnik variation +rnbq1rk1/ppp2ppp/1b3n2/3pN3/1P2P3/P1N5/2PP1PPP/R1BQKB1R w KQ - +Ruy Lopez: open, 7.Bb3 * +rnbq1rk1/ppp2ppp/1b3n2/4N3/1P1Pp3/P1N1B3/2P2PPP/R2QKB1R b KQ - +Ruy Lopez: open, 8...Be6 * +rnbq1rk1/ppp2ppp/1b3n2/4N3/1P1Pp3/P1N5/2P2PPP/R1BQKB1R w KQ - +Ruy Lopez: open, 8.de * +rnbq1rk1/ppp2ppp/1b3n2/4N3/1P1Pp3/P7/2P1NPPP/R1BQKB1R b KQ - +Ruy Lopez: open, Zukertort variation * +rnbq1rk1/ppp2ppp/3b1n2/3pN3/3P4/8/PPP1BPPP/RNBQ1RK1 b - - +Petrov: classical attack, Mason variation * +rnbq1rk1/ppp2ppp/3bpn2/3p4/2PP4/P1N1P3/1P2NPPP/R1BQKB1R w KQ - +Nimzo-Indian: Simagin variation +rnbq1rk1/ppp2ppp/4pn2/3p4/1bPP4/2N1PN2/PP3PPP/R1BQKB1R w KQ - +Nimzo-Indian: 4.e3 e8g8, 5.Nf3 d7d5 +rnbq1rk1/ppp2ppp/4pn2/3p4/1bPP4/2NBP3/PP3PPP/R1BQK1NR w KQ - +Nimzo-Indian: 4.e3 O-O, 5.Bd3 d5 +rnbq1rk1/ppp2ppp/4pn2/3p4/2PP4/P1PBP3/5PPP/R1BQK1NR b KQ - +Nimzo-Indian: 4.e3, Botvinnik system +rnbq1rk1/ppp2ppp/5P2/2b4Q/2pp4/2P5/PP3PPP/RNB1K1NR w KQ - +Bishop's opening: Pratt variation +rnbq1rk1/ppp2ppp/5n2/2b1p3/4p3/2PP4/PP1NBPPP/R1BQK1NR w KQ - +Philidor: Hanham, Steiner variation * +rnbq1rk1/ppp2ppp/5n2/2bP2N1/2B1p3/2N5/PPPP1PPP/R1BQK2R b KQ - +two knights: Max Lange attack, Steinitz variation * +rnbq1rk1/ppp2ppp/5n2/2bP4/2B1p3/2N2N2/PPPP1PPP/R1BQK2R w KQ - +two knights: Max Lange attack * +rnbq1rk1/ppp2ppp/5n2/2bPN3/8/2N5/PPPP1PPP/R1BQKB1R b KQ - +Two knights defense * +rnbq1rk1/ppp2ppp/5n2/2bPp3/8/2N2N2/PPPP1PPP/R1BQKB1R w KQ - +Two knights defense * +rnbq1rk1/ppp2ppp/5n2/2bpp3/4P3/2PP4/PP1N1PPP/R1BQKBNR w KQ - +Philidor: Hanham, Krause variation * +rnbq1rk1/ppp2ppp/5n2/3Pp3/1b6/2N2N2/PPPP1PPP/R1BQKB1R w KQ - +Ruy Lopez: Berlin defense, Nyholm attack * +rnbq1rk1/ppp2ppp/5n2/3pN3/1b2P3/2N5/PPPPBPPP/R1BQK2R b KQ - +Ruy Lopez: open Berlin defense, 5...Be7 * +rnbq1rk1/ppp2ppp/5n2/3pN3/1b2P3/P1N5/1PPP1PPP/R1BQKB1R b KQ - +Ruy Lopez: Berlin defense, Rosenthal variation * +rnbq1rk1/ppp2ppp/5n2/3pN3/4P3/P1PP4/2P2PPP/R1BQKB1R b KQ - +Ruy Lopez: Steinitz defense deferred, Rubinstein variation * +rnbq1rk1/ppp2ppp/5n2/3pp1B1/4P3/P1PP1N2/2P2PPP/R2QKB1R b KQ - +Ruy Lopez: Steinitz defense deferred, Lipnitsky variation * +rnbq1rk1/ppp2ppp/5n2/3pp3/1b2P3/2NP4/PPPN1PPP/R1BQKB1R b KQ - +Ruy Lopez: closed Berlin defense, Chigorin variation * +rnbq1rk1/ppp2ppp/5n2/4N3/1b2p3/2N5/PPPPBPPP/R1BQK2R w KQ - +Ruy Lopez: Berlin defense, Minckwitz variation * +rnbq1rk1/ppp2ppp/5n2/8/1b2p3/2NN4/PPPP1PPP/R1BQKB1R w KQ - +Ruy Lopez: open Berlin defense, l'Hermet variation * +rnbq1rk1/ppp2ppp/5n2/b2PN3/8/P1N5/1PPP1PPP/R1BQKB1R b KQ - +Ruy Lopez: open, Riga variation * +rnbq1rk1/ppp2ppp/5n2/b2p4/4P3/2NN4/PPPP1PPP/R1BQKB1R w KQ - +Ruy Lopez: open Berlin defense, Showalter variation * +rnbq1rk1/ppp2ppp/5n2/b2pN3/1P2P3/P1N5/2PP1PPP/R1BQKB1R b KQ - +Ruy Lopez: open, 6.d4 b5 * +rnbq1rk1/ppp2ppp/5n2/b2pN3/4P3/P1N5/1PPP1PPP/R1BQKB1R w KQ - +Ruy Lopez: open, 6.d4 * +rnbq1rk1/ppp2ppp/5n2/b2pp3/4P3/P1N2N2/1PPPBPPP/R1BQK2R w KQ - +Ruy Lopez: closed, center attack * +rnbq1rk1/ppp2ppp/5n2/b3N3/1P1pP3/P1N5/2PP1PPP/R1BQKB1R w KQ - +Ruy Lopez: open, Richter variation * +rnbq1rk1/ppp2ppp/8/2b1p3/8/2P1NN2/PP1P1nPP/R1BQKB1R w KQ - +Scotch: Cochrane variation * +rnbq1rk1/ppp2ppp/8/3pb3/2PPn3/3B4/PP3PPP/RNBQ1RK1 w - - +Petrov: modern attack, Trifunovi\'c variation +rnbq1rk1/ppp2ppp/8/b2pN3/1P2n3/P1N5/2PP1PPP/R1BQKB1R w KQ - +Ruy Lopez: open, Friess attack * +rnbq1rk1/pppnbppp/4p3/3pP1B1/3P3P/2N5/PPP2PP1/R2QKBNR w KQ - +French: Albin-Alekhine-Ch\^atard attack, Spielmann variation +rnbq1rk1/pppp1pp1/5n1p/4p1B1/4P2P/P1P5/1PP2PP1/R2QKBNR b KQ - +Ruy Lopez: exchange variation, Alapin gambit * +rnbq1rk1/pppp1ppp/1b3n2/4p3/1P2P3/P1N2N2/1BPP1PPP/R2QKB1R b KQ - +Ruy Lopez: Archangelsk (counterthrust) variation * +rnbq1rk1/pppp1ppp/1b3n2/4p3/1P2P3/P1NP1N2/2P2PPP/R1BQKB1R b KQ - +Ruy Lopez: ...b5 & ...d6 * +rnbq1rk1/pppp1ppp/4pn2/8/1bPP4/2N1P3/PP2NPPP/R1BQKB1R b KQ - +Nimzo-Indian: Reshevsky variation +rnbq1rk1/pppp1ppp/4pn2/8/1bPP4/2N1P3/PP3PPP/R1BQKBNR w KQ - +Nimzo-Indian: 4.e3 O-O +rnbq1rk1/pppp1ppp/4pn2/8/1bPP4/2N1PN2/PP3PPP/R1BQKB1R b KQ - +Nimzo-Indian: 4.e3 e8g8, 5.Nf3, without ...d5 +rnbq1rk1/pppp1ppp/4pn2/8/1bPP4/2NBP3/PP3PPP/R1BQK1NR b KQ - +Nimzo-Indian: 4.e3 O-O, 5.Bd3 +rnbq1rk1/pppp1ppp/4pn2/8/2PP4/P1P1P3/5PPP/R1BQKBNR b KQ - +Nimzo-Indian: S\"amisch variation +rnbq1rk1/pppp1ppp/4pn2/8/2PP4/P1P5/4PPPP/R1BQKBNR w KQ - +Nimzo-Indian: S\"amisch variation +rnbq1rk1/pppp1ppp/5n2/4N3/1b2P3/2N5/PPPP1PPP/R1BQKB1R b KQ - +Ruy Lopez: Berlin defense, open variation * +rnbq1rk1/pppp1ppp/5n2/4p3/1b2P3/2N2N2/PPPP1PPP/R1BQKB1R w KQ - +Ruy Lopez: Berlin defense, 4.O-O * +rnbq1rk1/pppp1ppp/5n2/4p3/1b2P3/2NP1N2/PPP2PPP/R1BQKB1R b KQ - +Ruy Lopez: Berlin defense, 4.O-O, d6 * +rnbq1rk1/pppp1ppp/5n2/4p3/1bB1P3/2N2N2/PPPP1PPP/R1BQK2R b KQ - +Ruy Lopez: Berlin defense, Beverwijk variation * +rnbq1rk1/pppp1ppp/5n2/4p3/4P3/P1P2P2/1PP3PP/R1BQKBNR b KQ - +Ruy Lopez: exchange, Gligori\'c variation * +rnbq1rk1/pppp1ppp/5n2/4p3/4P3/P1P5/1PP2PPP/R1BQKBNR w KQ - +Ruy Lopez: exchange variation, 5.O-O * +rnbq1rk1/pppp1ppp/5n2/4p3/4P3/P1PQ4/1PP2PPP/R1B1KBNR b KQ - +Ruy Lopez: exchange, Bronstein variation * +rnbq1rk1/pppp1ppp/5n2/4p3/4P3/P1b2N2/1PPPBPPP/R1BQK2R w KQ - +Ruy Lopez: Exchange variation doubly deferred (DERLD) * +rnbq1rk1/pppp1ppp/5n2/b3N3/4P3/P1N5/1PPP1PPP/R1BQKB1R b KQ - +Ruy Lopez: open (Tarrasch) defense * +rnbq1rk1/pppp1ppp/5n2/b3p3/2B1P3/P1N2N2/1PPP1PPP/R1BQK2R b KQ - +Ruy Lopez: M\"oller defense * +rnbq1rk1/pppp1ppp/5n2/b3p3/4P3/P1N2N2/1PPP1PPP/R1BQKB1R w KQ - +Ruy Lopez: 5.O-O * +rnbq1rk1/pppp1ppp/5n2/b3p3/4P3/P1N2N2/1PPPBPPP/R1BQK2R b KQ - +Ruy Lopez: closed defense * +rnbq1rk1/pppp1ppp/5n2/b3p3/4P3/P1NP1N2/1PP2PPP/R1BQKB1R b KQ - +Ruy Lopez: Steinitz defense deferred (Russian defense) * +rnbq1rk1/pppp1ppp/5n2/b3p3/4P3/P1NP4/1PP2PPP/R1BQKBNR w KQ - +Ruy Lopez: modern Steinitz defense, 5.O-O * +rnbq1rk1/pppp1ppp/8/3Pp3/1b6/8/PPPPNPPP/R1BQKB1R b KQ - +Ruy Lopez: Bird's defense, Paulsen variation * +rnbq1rk1/pppp2p1/8/2b2PPp/3pn3/3B1N2/PPP2P1P/RNBQK2R w KQ - +KGA: Kieseritsky, Rice gambit * +rnbq1rk1/pppp2pp/5n2/2b1pP2/6P1/8/PPPP1PBP/RNBQK1NR w KQ - +KGA: Hanstein gambit * +rnbq1rk1/pppp2pp/5n2/2b1pPP1/3P4/8/PPP2P1P/RNBQKBNR b KQ - +KGA: Muzio gambit, Brentano defense * +rnbq1rk1/pppp2pp/5n2/2b1pPP1/8/8/PPPP1P1P/RNBQKBNR w KQ - +KGA: Muzio gambit * +rnbq1rk1/pppp2pp/5n2/2b1pPP1/8/8/PPPPQP1P/RNB1KBNR b KQ - +KGA: Muzio gambit, Kling and Horwitz counter-attack * +rnbq1rk1/ppppb1pp/4p3/5p2/2PPn3/5NP1/PP2PPBP/RNBQ1RK1 w - - +Dutch defense, Alekhine variation +rnbq1rk1/ppppb1pp/4pn2/5p2/2PP4/5NP1/PP2PPBP/RNBQK2R w KQ - +Dutch defense +rnbq1rk1/ppppppbp/5np1/6B1/3P4/2P2N2/PP2PPPP/RN1QKB1R b KQ - +R\'eti: King's Indian attack, Yugoslav variation * +rnbq2k1/pp1p1ppp/1bp5/8/1P1Nr3/P1P5/4BPPP/R1BQ1RK1 b - - +Ruy Lopez: Marshall counter-attack, 11...c6 * +rnbq2k1/pp3ppp/1bp5/3p4/1P1Nr3/P1P5/4BPPP/R1BQ1RK1 w - - +Ruy Lopez: Marshall, main line, 12.d2d4 * +rnbq2k1/pp3ppp/1bp5/4r3/1P1Pp3/P1N1P3/2PQB1PP/R4RK1 w - - +Ruy Lopez: open, Tarrasch trap * +rnbq2k1/pp3ppp/2p1r3/3p4/1P1P4/P2B4/5PPP/R1BQ1RK1 w - - +Ruy Lopez: Marshall, Kevitz variation * +rnbq2k1/pppp1ppp/1b6/3N4/1PBpr1n1/P4N2/2P2PPP/R1BQ1K1R b - - +Ruy Lopez: Rabinovich variation * +rnbq3r/pp4pp/2P2nk1/8/2Bbp3/2N5/PPPP1PPP/R1BQK2R w KQ - +Giuoco Piano: Ghulam Kassim variation * +rnbq3r/pppp1k2/3b1n1p/8/4PQ1P/8/PPPP2P1/RNB1KB1R w KQ - +KGA: Allgaier, Horny defense +rnbqk1n1/pppp1p1r/7b/4N2p/2BPPppP/2N5/PPP3P1/R1BQK2R b KQq - +KGA: Kieseritsky, long whip defense, Jaenisch variation +rnbqk1nb/pp3p2/2pp4/4N1p1/2BPPp2/2N5/PPP3P1/R1BQK3 b Qkq - +KGA: Greco gambit +rnbqk1nr/1p1p1ppp/p3p3/2b5/3NP3/3B4/PPP2PPP/RNBQK2R w KQkq - +Sicilian: Kan, Polugaievsky variation +rnbqk1nr/5ppp/2p1p3/pp6/PbpP4/2N1PN2/1P1B1PPP/R2QKB1R w KQkq - +QGD: semi-Slav, Abrahams variation +rnbqk1nr/p1p1bppp/1p2p3/3pP3/3P4/2N1B3/PPP2PPP/R2QKBNR w KQkq - +French: classical, Frankfurt variation +rnbqk1nr/p1pp1ppp/8/1pb1p3/2B1P3/8/PPPP1PPP/RNBQK1NR w KQkq - +Bishop's opening: Wing gambit * +rnbqk1nr/p1pp2pp/8/1Bb1pp2/4P3/8/PPPP1PPP/RNBQK1NR w KQkq - +Bishop's opening: MacDonnell double gambit * +rnbqk1nr/pp1p1ppp/2p5/2b1p3/2B1P1Q1/8/PPPP1PPP/RNB1K1NR b KQkq - +Bishop's opening: del Rio variation * +rnbqk1nr/pp1p1ppp/2p5/2b1p3/2B1P3/8/PPPP1PPP/RNBQK1NR w KQkq - +Bishop's opening: Philidor variation * +rnbqk1nr/pp1p1ppp/2p5/2b1p3/2BPP3/8/PPP2PPP/RNBQK1NR b KQkq - +Bishop's opening: Lewis counter-gambit * +rnbqk1nr/pp1pp2p/6p1/2pP1p2/2P5/2P5/P3PPPP/R1BQKBNR w KQkq - +Beefeater defense +rnbqk1nr/pp1ppp1p/6pb/2p5/2P1P3/5N2/PP1P1PPP/RNBQKB1R w KQkq - +Sicilian: Acton extension +rnbqk1nr/pp1pppbp/8/2p3B1/3P4/8/PPP1PPPP/RN1QKBNR w KQkq - +Grob: Fritz gambit * +rnbqk1nr/pp1pppbp/8/2pP2B1/8/8/PPP1PPPP/RN1QKBNR b KQkq - +Grob: Romford counter-gambit * +rnbqk1nr/pp2bppp/2p5/3p4/3PpB2/2P1P3/PP3PPP/RN1QKBNR w KQkq - +Caro-Kann: advance, Short variation * +rnbqk1nr/pp2ppb1/2p3p1/3pP2p/3P1P2/2N5/PPP3PP/R1BQKBNR w KQkq - +Robatsch defense: Gurgenidze variation +rnbqk1nr/pp2ppbp/2pp2p1/8/3PP3/2N2N2/PPP2PPP/R1BQKB1R w KQkq - +Robatsch defense: two knights, Suttles variation +rnbqk1nr/pp2ppbp/6p1/1Bpp4/5P2/4PN2/PPPP2PP/RNBQK2R b KQkq - +Dutch defense: Dutch-Indian (Nimzo-Dutch) variation * +rnbqk1nr/pp2ppbp/6p1/2pp4/3P4/4PN2/PPP2PPP/RNBQKB1R w KQkq - +Catalan: closed * +rnbqk1nr/pp2ppbp/6p1/2pp4/3P4/5NP1/PPP1PPBP/RNBQK2R b KQkq - +King's Indian: 3.g3, counterthrust variation * +rnbqk1nr/pp2ppbp/6p1/2pp4/5P2/4PN2/PPPP2PP/RNBQKB1R w KQkq - +Dutch defense * +rnbqk1nr/pp2ppbp/6p1/2pp4/5P2/4PN2/PPPPB1PP/RNBQK2R b KQkq - +Dutch defense * +rnbqk1nr/pp2ppbp/6p1/3p4/3N4/6P1/PPP1PPBP/RNBQK2R b KQkq - +Neo-Gr\"unfeld, 5.cd * +rnbqk1nr/pp3ppp/4p3/2ppP3/1b1P2Q1/2N5/PPP2PPP/R1B1KBNR b KQkq - +French: Winawer, advance, Russian variation +rnbqk1nr/pp3ppp/4p3/2ppP3/1b1P4/2N5/PPP2PPP/R1BQKBNR w KQkq - +French: Winawer, advance variation +rnbqk1nr/pp3ppp/4p3/2ppP3/1b1P4/2N5/PPPB1PPP/R2QKBNR b KQkq - +French: Winawer, advance, Bogolyubov variation +rnbqk1nr/pp3ppp/4p3/2ppP3/1b1P4/P1N5/1PP2PPP/R1BQKBNR b KQkq - +French: Winawer, advance, 5.a3 +rnbqk1nr/pp3ppp/4p3/2ppP3/3P4/P1P5/2P2PPP/R1BQKBNR b KQkq - +French: Winawer, advance variation +rnbqk1nr/pp3ppp/4p3/3pP3/1P6/2p2N2/1PP2PPP/R1BQKB1R b KQkq - +French: Winawer, advance, Rauzer variation +rnbqk1nr/ppp1bppp/3p4/4p3/2B1P3/2P2N2/PP1P1PPP/RNBQK2R b KQkq - +Philidor: Steinitz variation +rnbqk1nr/ppp1bppp/4p3/3p4/2PP4/2N5/PP2PPPP/R1BQKBNR w KQkq - +QGD: Charousek (Petrosian) variation +rnbqk1nr/ppp1bppp/4p3/3pP1B1/3P4/2N5/PPP2PPP/R2QKBNR w KQkq - +French: classical, Vistaneckis (Nimzovich) variation +rnbqk1nr/ppp1p1bp/3p2p1/5p2/2PPP3/2N5/PP3PPP/R1BQKBNR w KQkq - +Modern defense: Averbakh system, Randspringer variation +rnbqk1nr/ppp1ppbp/3p2p1/8/2PP4/2N5/PP2PPPP/R1BQKBNR w KQkq - +Modern defense +rnbqk1nr/ppp1ppbp/3p2p1/8/2PPP3/2N5/PP3PPP/R1BQKBNR b KQkq - +Modern defense: Averbakh system +rnbqk1nr/ppp1ppbp/3p2p1/8/3PP3/2N2N2/PPP2PPP/R1BQKB1R b KQkq - +Robatsch defense: two knights variation +rnbqk1nr/ppp1ppbp/3p2p1/8/3PP3/2N5/PPP2PPP/R1BQKBNR w KQkq - +Robatsch (modern) defense +rnbqk1nr/ppp1ppbp/3p2p1/8/3PP3/2P2N2/PP3PPP/RNBQKB1R b KQkq - +Robatsch defense: Geller's system +rnbqk1nr/ppp1ppbp/3p2p1/8/3PPP2/2N5/PPP3PP/R1BQKBNR b KQkq - +Robatsch defense: Pseudo-Austrian attack +rnbqk1nr/ppp1ppbp/6p1/3p4/5P2/5NP1/PPPPP2P/RNBQKB1R b KQkq - +Dutch defense * +rnbqk1nr/ppp2p1p/3b4/6p1/8/5N2/PPPPP1PP/RNBQKB1R w KQkq - +Bird: From gambit, Lasker variation +rnbqk1nr/ppp2pb1/3p3p/6p1/2BPPp1P/3Q1N2/PPP3P1/RNB1K2R b KQkq - +KGA: Philidor gambit, Schultz variation +rnbqk1nr/ppp2ppp/1b1p4/8/2P1p3/1N6/PP1PPPPP/RNBQKB1R w KQkq - +Alekhine's defense: Kmoch variation * +rnbqk1nr/ppp2ppp/3b4/3Pp3/8/5N2/PPPP1PPP/RNBQKB1R w KQkq - +QP counter-gambit: Maroczy gambit +rnbqk1nr/ppp2ppp/3b4/3pp3/3P4/4P3/PPP2PPP/RNBQKBNR w KQkq - +French: Schlechter variation * +rnbqk1nr/ppp2ppp/3bp3/3p4/3P4/5N2/PPP1PPPP/RNBQKB1R w KQkq - +Queen's pawn: stonewall attack * +rnbqk1nr/ppp2ppp/3p4/2b1P3/4P3/5N2/PPPP2PP/RNBQKB1R b KQkq - +KGD: classical, Soldatenkov variation +rnbqk1nr/ppp2ppp/3p4/2b1p3/1P2PP2/5N2/P1PP2PP/RNBQKB1R b KQkq - +KGD: classical, Heath variation +rnbqk1nr/ppp2ppp/3p4/2b1p3/4PP2/2P2N2/PP1P2PP/RNBQKB1R b KQkq - +KGD: classical, 4.c3 +rnbqk1nr/ppp2ppp/3p4/2b1p3/4PP2/8/PPPP2PP/RNBQKBNR w KQkq - +Bishop's opening: Calabrese counter-gambit, Jaenisch variation * +rnbqk1nr/ppp2ppp/4p3/3p4/1b1PP3/2N5/PPP1NPPP/R1BQKB1R b KQkq - +French: Winawer, Alekhine (Mar\'oczy) gambit +rnbqk1nr/ppp2ppp/4p3/3p4/1b1PP3/2N5/PPP2PPP/R1BQKBNR w KQkq - +French: Winawer (Nimzovich) variation +rnbqk1nr/ppp2ppp/4p3/3p4/1b1PP3/2N5/PPPB1PPP/R2QKBNR b KQkq - +French: Winawer, fingerslip variation +rnbqk1nr/ppp2ppp/4p3/3pP3/1b1P4/2N5/PPP2PPP/R1BQKBNR b KQkq - +French: Winawer, advance variation +rnbqk1nr/ppp2ppp/4p3/8/3Pp3/P1b5/1PP1NPPP/R1BQKB1R w KQkq - +French: Winawer, Alekhine gambit +rnbqk1nr/ppp2ppp/8/2bp4/3Np3/3P4/PPP1PPPP/RNBQKB1R w KQkq - +Alekhine's defense: Balogh variation * +rnbqk1nr/ppp2ppp/8/2bpp3/2B1P3/2P5/PP1P1PPP/RNBQK1NR w KQkq - +Bishop's opening: Lewis counter-gambit +rnbqk1nr/ppp2ppp/8/2bpp3/2B1P3/8/PPPP1PPP/RNBQK1NR w KQkq - +Bishop's opening: Lewis gambit * +rnbqk1nr/ppp2ppp/8/2bpp3/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - +Bishop's opening: Ponziani gambit * +rnbqk1nr/ppp2ppp/8/4P3/1bP5/4p3/PP1B1PPP/RN1QKBNR w KQkq - +QGD: Albin counter-gambit, Lasker trap +rnbqk1nr/ppp3pp/3p4/2b1pp2/4PP2/2P2N2/PP1P2PP/RNBQKB1R w KQkq - +KGD: classical counter-gambit +rnbqk1nr/ppp3pp/4P3/2bp2N1/4p3/2N5/PPP2PPP/R1BQKB1R b KQkq - +Philidor: Philidor counter-gambit, Berger variation +rnbqk1nr/ppp3pp/8/2b2p2/2BpP3/2P2N2/PP4PP/RNBQK2R b KQkq - +KGD: classical, R\'eti variation +rnbqk1nr/pppp1pbp/8/4N3/4PppP/8/PPPP2P1/RNBQKB1R w KQkq - +KGA: Kieseritsky, Paulsen defense +rnbqk1nr/pppp1pbp/8/6p1/2B1Pp1P/5N2/PPPP2P1/RNBQK2R b KQkq - +KGA: Philidor gambit +rnbqk1nr/pppp1pbp/8/6p1/2B1Pp2/5N2/PPPP2PP/RNBQ1RK1 b kq - +KGA: Hanstein gambit +rnbqk1nr/pppp1pbp/8/6p1/2B1Pp2/5N2/PPPP2PP/RNBQK2R w KQkq - +King's knight's gambit +rnbqk1nr/pppp1ppp/4p3/8/1bPP4/8/PP2PPPP/RNBQKBNR w KQkq - +Queen's pawn: Franco-Indian (Keres) defense +rnbqk1nr/pppp1ppp/8/2b1p3/1PB1P3/8/P1PP1PPP/RNBQK1NR b KQkq - +Bishop's opening: Wing gambit +rnbqk1nr/pppp1ppp/8/2b1p3/2B1P3/2P5/PP1P1PPP/RNBQK1NR b KQkq - +Bishop's opening: Philidor variation +rnbqk1nr/pppp1ppp/8/2b1p3/2B1P3/8/PPPP1PPP/RNBQK1NR b KQkq - +Bishop's opening: Classical variation * +rnbqk1nr/pppp1ppp/8/2b1p3/2B1P3/8/PPPP1PPP/RNBQK1NR w KQkq - +Bishop's opening: Classical variation +rnbqk1nr/pppp1ppp/8/2b1p3/2BPP3/8/PPP2PPP/RNBQK1NR b KQkq - +Bishop's opening: Lewis gambit +rnbqk1nr/pppp1ppp/8/2b1p3/4P3/2P5/PP1P1PPP/RNBQKBNR b KQkq - +Bishop's opening: Philidor counter-attack * +rnbqk1nr/pppp1ppp/8/2b1p3/4P3/5N2/PPPP1PPP/RNBQKB1R b KQkq - +Bishop's opening: Berlin defense * +rnbqk1nr/pppp1ppp/8/2b1p3/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +Bishop's opening * +rnbqk1nr/pppp1ppp/8/2b1p3/4PP2/8/PPPP2PP/RNBQKBNR b KQkq - +Bishop's opening: Calabrese counter-gambit * +rnbqk1nr/pppp1ppp/8/2b1p3/4PP2/8/PPPP2PP/RNBQKBNR w KQkq - +KGD: classical variation +rnbqk1nr/pppp1ppp/8/2b1p3/8/2P5/PP1PPPPP/RNBQKBNR w KQkq - +Caro-Kann: Hillbilly attack * +rnbqk1nr/pppp1ppp/8/2b1p3/8/5N2/PPPPPPPP/RNBQKB1R w KQkq - +Alekhine's defense: Krejcik variation * +rnbqk1nr/pppp1ppp/8/4p3/1bB1PP2/8/P1PP2PP/RNBQK1NR b KQkq - +Bishop's opening: MacDonnell double gambit +rnbqk1nr/pppp1ppp/8/4p3/1bP5/2N5/PP1PPPPP/R1BQKBNR w KQkq - +English, Kramnik-Shirov counterattack +rnbqk1nr/pppp1ppp/8/8/2B1P2b/5N2/PPPP3p/RNBQ1R1K b kq - +KGA: Cunningham, three pawns gambit +rnbqk1nr/pppp1ppp/8/8/2B1Pp1b/5NP1/PPPP3P/RNBQK2R b KQkq - +KGA: Cunningham, Bertin gambit +rnbqk1nr/pppp1ppp/8/8/2BPP2b/5N2/P1P4p/RNBQ1R1K b kq - +Bishop's opening: Four pawns' gambit +rnbqk1nr/pppp2pp/3b4/4pP2/8/8/PPPP1PPP/RNBQKBNR w KQkq - +KGA: Schurig gambit * +rnbqk1nr/pppp2pp/8/2b1pP2/1P6/8/P1PP1PPP/RNBQKBNR b KQkq - +KGA: bishop's gambit, Bryan counter-gambit * +rnbqk1nr/pppp2pp/8/2b1pP2/3P4/8/PPP2PPP/RNBQKBNR b KQkq - +KGA: bishop's gambit, Bledow variation * +rnbqk1nr/pppp2pp/8/2b1pP2/5P2/8/PPPP2PP/RNBQKBNR b KQkq - +KGA: bishop's gambit, L\'opez-Gianutio counter-gambit * +rnbqk1nr/pppp2pp/8/2b1pP2/8/2N5/PPPP1PPP/R1BQKBNR b KQkq - +KGA: bishop's gambit, Maurian defense * +rnbqk1nr/pppp2pp/8/2b1pP2/8/2P5/PP1P1PPP/RNBQKBNR b KQkq - +KGA: bishop's gambit, Ruy L\'opez defense * +rnbqk1nr/pppp2pp/8/2b1pP2/8/5N2/PPPP1PPP/RNBQKB1R b KQkq - +KGA: bishop's gambit, Cozio (Morphy) defense * +rnbqk1nr/pppp2pp/8/2b1pP2/8/8/PPPP1PPP/RNBQKBNR w KQkq - +KGA: bishop's gambit * +rnbqk1nr/pppp2pp/8/2b1pP2/8/8/PPPPNPPP/RNBQKB1R b KQkq - +KGA: bishop's gambit, Steinitz defense * +rnbqk1nr/pppp2pp/8/2b1pp2/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - +Bishop's opening: Greco gambit * +rnbqk1nr/pppp2pp/8/4Pp2/1b1p4/8/PPP2PPP/RNBQKBNR w KQkq - +KGD: Falkbeer, Nimzovich variation * +rnbqk1nr/pppp2pp/8/4pP2/3b4/2P5/PP3PPP/RNBQKBNR b KQkq - +KGA: bishop's gambit, Anderssen variation * +rnbqk1nr/pppp2pp/8/4pP2/3b4/5N2/PPP2PPP/RNBQKB1R b KQkq - +KGA: bishop's gambit, Morphy variation * +rnbqk1nr/ppppb1pp/8/4pP2/8/8/PPPP1PPP/RNBQKBNR w KQkq - +KGA: Lesser bishop's (Petroff-Jaenisch-Tartakower) gambit * +rnbqk1nr/ppppbp1p/8/4N3/4PppP/8/PPPP2P1/RNBQKB1R w KQkq - +KGA: Kieseritsky, Polerio defense +rnbqk1nr/ppppbppp/8/8/4Pp2/5N2/PPPP2PP/RNBQKB1R w KQkq - +KGA: Cunningham defense +rnbqk1nr/ppppp1bp/6p1/5p2/3P4/6PN/PPP1PPBP/RNBQK2R b KQkq - +Dutch: Leningrad, Karlsbad variation +rnbqk1nr/ppppppbp/6p1/8/3PP3/2N5/PPP2PPP/R1BQKBNR b KQkq - +Robatsch defense +rnbqk1nr/ppppppbp/6p1/8/3PP3/8/PPP2PPP/RNBQKBNR w KQkq - +Robatsch (modern) defense +rnbqk1nr/ppppppbp/6p1/8/3PPP2/8/PPP3PP/RNBQKBNR b KQkq - +Robatsch defense: three pawns attack +rnbqk1nr/ppppppbp/8/8/3P2p1/2P5/PP2PPPP/RNBQKBNR w KQkq - +Grob: spike attack * +rnbqk1r1/ppp2pP1/4p3/3p4/1b1P2Qp/2N5/PPP2PP1/R3KBNR b KQq - +French: MacCutcheon, Grigoriev variation +rnbqk2r/1p2bp2/p2ppn1p/6p1/3NPP1B/2N2Q2/PPP3PP/R3KB1R w KQkq - +Sicilian: Najdorf, G\"oteborg (Argentine) variation +rnbqk2r/1p2bppp/p2ppn2/6B1/3NPP2/2N5/PPP3PP/R2QKB1R w KQkq - +Sicilian: Najdorf, 7...Be7 +rnbqk2r/1pp2ppp/1b3n2/p2p4/4p3/1N1P2P1/PPP1PPBP/RNBQK2R w KQkq - +Alekhine's defense: modern, Keres variation * +rnbqk2r/1ppnbppp/p3p3/3pP1B1/3P3P/2N5/PPP2PP1/R2QKBNR w KQkq - +French: Albin-Alekhine-Ch\^atard attack, Mar\'oczy variation +rnbqk2r/2pp1ppp/5n2/ppb1p3/4P3/1BN5/PPPP1PPP/R1BQK1NR w KQkq - +Evans gambit declined, 5.a4 * +rnbqk2r/p1p2ppp/1p1bpn2/3p4/2PP4/4PN2/PP3PPP/RNBQKB1R w KQkq - +Queen's pawn game, Rubinstein (Colle-Zukertort) variation * +rnbqk2r/p1pp1ppp/1p2pn2/8/1bPP4/2N1P3/PP2NPPP/R1BQKB1R b KQkq - +Nimzo-Indian: Fischer variation, 5.Ne2 +rnbqk2r/p1pp1ppp/1p2pn2/8/1bPP4/2N1P3/PP3PPP/R1BQKBNR w KQkq - +Nimzo-Indian: Fischer variation +rnbqk2r/p1pp1ppp/5n2/1Bb1p3/4P3/2N5/PPPP1PPP/R1BQK1NR b KQkq - +Evans gambit * +rnbqk2r/p1pp1ppp/5n2/1pb1p3/2B1P3/2N5/PPPP1PPP/R1BQK1NR w KQkq - +Evans gambit declined * +rnbqk2r/p1pp1ppp/5n2/1pb1p3/2BPP3/2N5/PPP2PPP/R1BQK1NR b KQkq - +Evans counter-gambit * +rnbqk2r/p1pp1ppp/8/2b1p3/Np2n1Q1/1B6/PPPP1PPP/R1B1K1NR b KQkq - +Evans gambit declined, Hirschbach variation * +rnbqk2r/p1pp1ppp/8/2b1p3/Np2n3/1B5N/PPPP1PPP/R1BQK2R b KQkq - +Evans gambit declined, Lange variation * +rnbqk2r/p2p1pp1/4pn1p/1ppP4/1bP4B/2N5/PP2PPPP/R2QKBNR w KQkq - +Nimzo-Indian: Leningrad, ...b5 gambit +rnbqk2r/p2p1ppp/1p2pn2/2p5/2PP4/P1P1P3/5PPP/R1BQKBNR w KQkq - +Nimzo-Indian: S\"amisch, O'Kelly variation +rnbqk2r/p2p1ppp/2p2n2/1pb1p3/2B1P3/2N2N2/PPPP1PPP/R1BQK2R w KQkq - +Giuoco Piano: Bird's attack * +rnbqk2r/p2p1ppp/2p2n2/2b1p3/4P3/2N5/PPPP1PPP/R1BQKBNR b KQkq - +Evans gambit: Mayet defense * +rnbqk2r/p2p1ppp/2p2n2/2b1p3/4P3/2N5/PPPPBPPP/R1BQK1NR b KQkq - +Evans gambit: 5...Be7 * +rnbqk2r/p2p1ppp/2p2n2/2b1p3/4P3/2NB4/PPPP1PPP/R1BQK1NR b KQkq - +Evans gambit: Stone-Ware variation * +rnbqk2r/p2p1ppp/2p2n2/2b1p3/B3P3/2N5/PPPP1PPP/R1BQK1NR b KQkq - +Evans gambit * +rnbqk2r/p4ppp/2p2n2/1Bb1p3/8/2N5/PPPP1PPP/R1BQK1NR w KQkq - +Scotch gambit * +rnbqk2r/p4ppp/2p2n2/2b5/B3p3/2N5/PPPP1PPP/R1BQK1NR w KQkq - +Scotch gambit: Cochrane variation * +rnbqk2r/p4ppp/2p2n2/2bpp3/B3P3/2NP4/PPP2PPP/R1BQK1NR b KQkq - +Evans gambit * +rnbqk2r/p4ppp/2p2n2/2bpp3/BP2P3/2N5/P1PP1PPP/R1BQK1NR b KQkq - +Evans gambit: Leonhardt variation * +rnbqk2r/p4ppp/2p2n2/2bpp3/N3P3/8/PPPPBPPP/R1BQK1NR b KQkq - +Evans gambit: Cordel variation * +rnbqk2r/pp1n1ppp/4p3/2bpP3/5PQ1/2N5/PPP3PP/R1B1KBNR b KQkq - +French: Steinitz, Bradford attack +rnbqk2r/pp1nbppp/4p3/2ppP1B1/3P3P/2N5/PPP2PP1/R2QKBNR w KQkq - +French: Albin-Alekhine-Ch\^atard attack, Breyer variation +rnbqk2r/pp1p1ppp/2p2n2/2b1p3/2B1P3/2N2N2/PPPP1PPP/R1BQK2R b KQkq - +Giuoco Piano * +rnbqk2r/pp1p1ppp/2p2n2/2b1p3/2B1P3/2N5/PPPP1PPP/R1BQK1NR w KQkq - +Giuoco Piano * +rnbqk2r/pp1p1ppp/2p2n2/2b1p3/2B1P3/2N5/PPPPQPPP/R1B1K1NR b KQkq - +Giuoco Piano: close variation * +rnbqk2r/pp1p1ppp/2p2n2/2b1p3/4P3/3P4/PPP1BPPP/RNBQK1NR w KQkq - +Philidor: Steinitz variation * +rnbqk2r/pp1p1ppp/2p2n2/4p3/1b2P3/1BN5/PPPP1PPP/R1BQK1NR b KQkq - +Ruy Lopez: classical defense, Charousek variation * +rnbqk2r/pp1p1ppp/2p2n2/4p3/1bB1P3/2N5/PPPP1PPP/R1BQK1NR w KQkq - +Ruy Lopez: classical defense, 4.c3 * +rnbqk2r/pp1p1ppp/2p2n2/4p3/1bB1P3/2N5/PPPPQPPP/R1B1K1NR b KQkq - +Ruy Lopez: classical defense, Boden variation * +rnbqk2r/pp1p1ppp/2p2n2/4p3/1bB1PP2/2N5/PPPP2PP/R1BQK1NR b KQkq - +Ruy Lopez: Cordel gambit * +rnbqk2r/pp1p1ppp/2p2n2/b3p3/4P3/P1NP4/1PP2PPP/R1BQKBNR w KQkq - +Ruy Lopez: modern Steinitz defense * +rnbqk2r/pp1p1ppp/2p2n2/b3p3/4P3/P1NP4/1PPB1PPP/R2QKBNR b KQkq - +Ruy Lopez: modern Steinitz defense * +rnbqk2r/pp1p1ppp/2p2n2/b3p3/4PP2/P1NP4/1PP3PP/R1BQKBNR b KQkq - +Ruy Lopez: modern Steinitz defense, siesta variation * +rnbqk2r/pp1p1ppp/4p3/2pP4/1bP1n3/2N2N2/PP2PPPP/R1BQKB1R w KQkq - +Nimzo-Indian: three knights, Euwe variation +rnbqk2r/pp1p1ppp/4pn2/2p5/1bPP4/2N1P3/PP2NPPP/R1BQKB1R b KQkq - +Nimzo-Indian: 4.e3 c5, 5.Ne2 (Rubinstein, anti-H\"ubner system) +rnbqk2r/pp1p1ppp/4pn2/2p5/1bPP4/2N1P3/PP3PPP/R1BQKBNR w KQkq - +Nimzo-Indian: 4.e3 c5 +rnbqk2r/pp1p1ppp/4pn2/2p5/1bPP4/2N5/PPQ1PPPP/R1B1KBNR w KQkq - +Nimzo-Indian: classical, 4...c5 +rnbqk2r/pp1p1ppp/4pn2/2p5/2PP4/P1P1P3/5PPP/R1BQKBNR b KQkq - +Nimzo-Indian: S\"amisch variation +rnbqk2r/pp1p1ppp/4pn2/2pP4/1bP5/2N2N2/PP2PPPP/R1BQKB1R b KQkq - +Nimzo-Indian: three knights, Korchnoi variation +rnbqk2r/pp1p1ppp/4pn2/4P3/1b1N4/2N5/PPP2PPP/R1BQKB1R b KQkq - +Sicilian: Pin, Koch variation +rnbqk2r/pp1p1ppp/4pn2/8/1b1NP3/2N5/PPP2PPP/R1BQKB1R w KQkq - +Sicilian: Pin variation (Sicilian counter-attack) +rnbqk2r/pp1p1ppp/5n2/2p1p3/2P5/3P4/PP1QPPPP/RN2KBNR w KQkq - +Sicilian: Canal-Sokolsky attack, Sokolsky variation * +rnbqk2r/pp1p1ppp/5n2/4p3/1b1NP3/2NB4/PPP2PPP/R1BQK2R w KQkq - +Sicilian: Pin, Jaffe variation +rnbqk2r/pp1p1ppp/5n2/b1p1p3/4P3/P1NP4/1PP2PPP/R1BQKBNR w KQkq - +Ruy Lopez: modern Steinitz defense, Duras (Keres) variation * +rnbqk2r/pp1pp1bp/2p3pn/5p2/3P4/5NP1/PPP1PPBP/RNBQ1RK1 w kq - +Dutch: Leningrad, Basman system +rnbqk2r/pp1pppbp/5np1/2P5/8/4PN2/PPP2PPP/RNBQKB1R b KQkq - +English: Neo-Catalan accepted * +rnbqk2r/pp1pppbp/5np1/2p5/1P6/P3PN2/2PP1PPP/RNBQKB1R b KQkq - +English: Romanishin gambit * +rnbqk2r/pp2npbp/6p1/3pp3/8/1N4P1/PPP1PPBP/RNBQK2R w KQkq - +Neo-Gr\"unfeld, 5.cd, main line * +rnbqk2r/pp2nppp/4p3/2ppP3/3P2Q1/P1P5/2P2PPP/R1B1KBNR b KQkq - +French: Winawer, advance, poisoned pawn variation +rnbqk2r/pp2nppp/4p3/2ppP3/3P4/P1P2N2/2P2PPP/R1BQKB1R b KQkq - +French: Winawer, advance, positional main line +rnbqk2r/pp2nppp/4p3/2ppP3/3P4/P1P5/2P2PPP/R1BQKBNR w KQkq - +French: Winawer, advance, 6...Ne7 +rnbqk2r/pp2nppp/4p3/2ppP3/P2P4/2P5/2P2PPP/R1BQKBNR b KQkq - +French: Winawer, advance, Smyslov variation +rnbqk2r/pp2ppbp/3p1np1/2p5/3PPP2/2N2N2/PPP3PP/R1BQKB1R w KQkq - +Pirc: Austrian attack, dragon formation +rnbqk2r/pp2ppbp/3p1np1/8/3NP3/2N1B3/PPP1BPPP/R2QK2R b KQkq - +Sicilian: dragon, classical attack +rnbqk2r/pp2ppbp/3p1np1/8/3NP3/2N1BP2/PPP3PP/R2QKB1R b KQkq - +Sicilian: dragon, Yugoslav attack +rnbqk2r/pp2ppbp/5np1/1Bpp4/8/1P2PN2/PBPP1PPP/RN1QK2R b KQkq - +Queen's Indian: Capablanca variation * +rnbqk2r/pp2ppbp/5np1/2Pp4/8/4PN2/PPP1BPPP/RNBQK2R b KQkq - +Catalan: open, classical line * +rnbqk2r/pp2ppbp/5np1/2Pp4/8/4PN2/PPP2PPP/RNBQKB1R w KQkq - +Catalan: open, 5.Nf3 * +rnbqk2r/pp2ppbp/5np1/2pp4/3P4/4PN2/PPP1BPPP/RNBQK2R w KQkq - +Catalan: closed, 5.Nf3 * +rnbqk2r/pp2ppbp/5np1/2pp4/3P4/5NP1/PPP1PPBP/RNBQK2R w KQkq - +Neo-Gr\"unfeld, 5.Nf3 * +rnbqk2r/pp2ppbp/5np1/2pp4/5P2/4PN2/PPPPB1PP/RNBQ1RK1 b kq - +Dutch defense * +rnbqk2r/pp2ppbp/5np1/2pp4/5P2/5NP1/PPPPP1BP/RNBQK2R w KQkq - +Dutch: Leningrad, main variation * +rnbqk2r/pp2ppbp/5np1/2pp4/8/1P2PN2/PBPPBPPP/RN1QK2R b KQkq - +Queen's Indian: 5.Bg2 Be7 * +rnbqk2r/pp2ppbp/6p1/2p4n/2PP4/1P3N2/PB1P1PPP/RN1QKB1R w KQkq - +Queen's Indian: Rubinstein variation * +rnbqk2r/pp2ppbp/6p1/2p5/2PP2n1/1P3N2/PB1P1PPP/RN1QKB1R w KQkq - +Queen's Indian: B\"urger variation * +rnbqk2r/pp3pbp/3p1np1/1BpP4/4PP2/2N5/PP4PP/R1BQK1NR b KQkq - +Benoni: Taimanov variation +rnbqk2r/pp3pbp/3p1np1/2pP2B1/4P3/2N2N2/PP3PPP/R2QKB1R b KQkq - +Benoni: classical, 8.Bg5 +rnbqk2r/pp3pbp/3p1np1/2pP4/4P3/2N2N2/PP2BPPP/R1BQK2R b KQkq - +Benoni: classical without 9.O-O +rnbqk2r/pp3pbp/3p1np1/2pPP3/5P2/2N5/PP4PP/R1BQKBNR b KQkq - +Benoni: Mikenas variation +rnbqk2r/pp3pp1/3ppn1p/2pP4/1bP4B/2N5/PP2PPPP/R2QKBNR w KQkq - +Nimzo-Indian: Leningrad, main line +rnbqk2r/pp3ppp/2p2n2/1BbP4/3p4/5N2/PPP1QPPP/RNB1K2R b KQkq - +Bishop's opening: Urusov gambit, Panov variation * +rnbqk2r/pp3ppp/2p2n2/2b1p3/4P3/1B1p4/PPPPQPPP/RNB1K1NR w KQkq - +Giuoco Piano: Eisinger variation * +rnbqk2r/pp3ppp/2p2n2/2bP4/2BPp3/2N2N2/PPP2PPP/R1BQK2R b KQkq d3 +Giuoco Piano * +rnbqk2r/pp3ppp/2p2n2/2bPN3/4p3/2N5/PPPPBPPP/R1BQK2R b KQkq - +Hungarian defense: Tartakower variation * +rnbqk2r/pp3ppp/2p2n2/2bpp3/2B1P3/2N2N2/PPPP1PPP/R1BQK2R w KQkq - +Giuoco Piano * +rnbqk2r/pp3ppp/2p2n2/2bpp3/4P3/1BN5/PPPPQPPP/R1B1K1NR b KQkq - +Giuoco Piano: center-holding variation * +rnbqk2r/pp3ppp/2p2n2/2bpp3/4P3/2PP4/PP1N1PPP/R1BQKBNR w KQkq - +Philidor: Hanham, Delmar variation * +rnbqk2r/pp3ppp/2p2n2/b2pp3/4P3/P1NP2P1/1PPB1P1P/R2QKBNR b KQkq - +Ruy Lopez: modern Steinitz defense, fianchetto (Bronstein) variation * +rnbqk2r/pp3ppp/2p2n2/b2pp3/4P3/P1NP4/1PPBNPPP/R2QKB1R b KQkq - +Ruy Lopez: modern Steinitz defense, Rubinstein variation * +rnbqk2r/pp3ppp/2pb1n2/3p4/2PPp3/1QN1P3/PP3PPP/R1B1KBNR w KQkq - +French: advance, Milner-Barry gambit * +rnbqk2r/pp3ppp/2pb4/4n3/3pP3/3P1N2/PPP1B1PP/RNBQK2R b KQkq - +Ponziani counter-gambit, Cordel variation * +rnbqk2r/pp3ppp/2pbpn2/3p4/2PP4/4PN2/PP3PPP/RNBQKB1R w KQkq - +Colle system * +rnbqk2r/pp3ppp/3p1n2/2p1p3/1b2P3/2NP1N2/PPP2PPP/R1BQKB1R w KQkq - +Ruy Lopez: Berlin defense, Duras variation * +rnbqk2r/pp3ppp/3p1n2/b1p1p3/4P3/P1NP1N2/1PP2PPP/R1BQKB1R w KQkq - +Ruy Lopez: Morphy defense, Duras variation * +rnbqk2r/pp3ppp/4p3/2Pn4/8/P1P2P2/4P1PP/R1BQKBNR b KQkq - +Nimzo-Indian: S\"amisch, Keres variation +rnbqk2r/pp3ppp/4pn2/2b3B1/3p4/P3P3/1PP2PPP/RN1QKBNR w KQkq - +QGA: Alekhine defense, Alatortsev variation * +rnbqk2r/pp3ppp/4pn2/2bp4/2P5/4PN2/PP3PPP/RNBQKB1R b KQkq - +QGA: classical variation * +rnbqk2r/pp3ppp/4pn2/2pP4/3P4/P1P2P2/4P1PP/R1BQKBNR b KQkq - +Nimzo-Indian: S\"amisch variation +rnbqk2r/pp3ppp/5n2/1B1pN3/1b1Pp3/2N5/PPP2PPP/R1BQK2R b KQkq - +Giuoco Piano: Anderssen variation * +rnbqk2r/pp3ppp/5n2/2bpp3/2B5/2N2N2/PPPP1PPP/R1BQK2R w KQkq - +Giuoco Piano * +rnbqk2r/pp3ppp/5n2/2bpp3/8/1BNP4/PPP2PPP/R1BQK1NR b KQkq - +Giuoco Piano: LaBourdonnais variation * +rnbqk2r/pp3ppp/5n2/2ppp3/1b2P3/2NP4/PPPB1PPP/R2QKBNR w KQkq - +Ruy Lopez: old Steinitz defense, semi-Duras variation * +rnbqk2r/pp4pp/2p2n2/2bPp3/2B2P2/8/PPP3PP/RNBQK1NR w KQkq - +KGD: classical, R\'eti variation * +rnbqk2r/pp4pp/4p3/2Pn1p2/8/P1P2P2/4P1PP/R1BQKBNR w KQkq - +Nimzo-Indian: S\"amisch, Romanovsky variation +rnbqk2r/ppn1bppp/8/2p1p3/8/2NP2PN/PP2PPBP/R1BQK2R b KQkq - +Sicilian: accelerated fianchetto, Simagin variation * +rnbqk2r/ppp1b1pp/3p1n2/3Pp3/4N3/2PB4/PP3PPP/RNBQK2R w KQkq - +Ponziani counter-gambit, Cordel variation +rnbqk2r/ppp1bppp/4p3/3p2B1/2PPn3/2N1P3/PP3PPP/R2QKBNR w KQkq - +QGD: Lasker variation +rnbqk2r/ppp1bppp/4p3/3pP1B1/3Pn3/2N5/PPP2PPP/R2QKBNR w KQkq - +French: classical, Tartakower variation +rnbqk2r/ppp1bppp/4p3/3pP3/3P2Q1/2N5/PPP2PPP/R3KBNR b KQkq - +French: classical, Anderssen-Richter variation +rnbqk2r/ppp1bppp/4pB2/3p4/3PP3/2N5/PPP2PPP/R2QKBNR b KQkq - +French: classical, Anderssen variation +rnbqk2r/ppp1bppp/4pn2/3p2B1/2PP4/2N5/PP2PPPP/R2QKBNR w KQkq - +QGD: 4.Bg5 Be7 +rnbqk2r/ppp1bppp/4pn2/3p2B1/3PP3/2N5/PPP2PPP/R2QKBNR w KQkq - +French: classical +rnbqk2r/ppp1bppp/4pn2/3p4/2P5/5NP1/PP1PPPBP/RNBQ1RK1 b kq - +English: Neo-Catalan declined +rnbqk2r/ppp1bppp/4pn2/3p4/2PP1B2/2N2N2/PP2PPPP/R2QKB1R b KQkq - +QGD: classical variation (5.Bf4) +rnbqk2r/ppp1bppp/4pn2/3p4/2PP4/5NP1/PP2PPBP/RNBQK2R b KQkq - +Catalan: closed, 5.Nf3 +rnbqk2r/ppp1bppp/4pn2/8/2pP4/5NP1/PP2PPBP/RNBQK2R w KQkq - +Catalan: open, classical line +rnbqk2r/ppp1bppp/5n2/3p2B1/3Np3/2PP4/PP2PPPP/RN1QKB1R b KQkq - +Alekhine's defense: modern, Flohr variation * +rnbqk2r/ppp1bppp/5n2/3pp3/4P3/2N2N2/PPPP1PPP/R1BQKB1R w KQkq - +Tayler opening * +rnbqk2r/ppp1bppp/8/3pP3/4n3/2N2N2/PPPP2PP/R1BQKB1R w KQkq - +Vienna gambit: Breyer variation +rnbqk2r/ppp1npbp/6p1/3pp3/8/3P1NP1/PPP1PPBP/RNBQ1RK1 w kq - +R\'eti: King's Indian attack, Pachman system +rnbqk2r/ppp1nppp/8/8/3PN3/8/PP3PPP/R2QKBNR w KQkq - +Bishop's opening: Lisitsyn variation * +rnbqk2r/ppp1ppbp/1n1p2p1/4P3/P2P4/1B3N2/1PP2PPP/RNBQK2R b KQkq - +Alekhine's defense: modern, Keres variation +rnbqk2r/ppp1ppbp/1n4p1/8/3PP3/6P1/PP2NPBP/RNBQK2R b KQkq - +Neo-Gr\"unfeld, 5.cd, main line +rnbqk2r/ppp1ppbp/3p1np1/6B1/2PP4/2N2N2/PP2PPPP/R2QKB1R b KQkq - +King's Indian: Smyslov system +rnbqk2r/ppp1ppbp/3p1np1/6B1/2PPP3/2N5/PP3PPP/R2QKBNR b KQkq - +King's Indian: accelerated Averbakh system +rnbqk2r/ppp1ppbp/3p1np1/8/2BPPP2/2N5/PPP3PP/R1BQK1NR b KQkq - +Pirc: Austrian attack, Ljubojevi\'c variation +rnbqk2r/ppp1ppbp/3p1np1/8/2PP4/2N2NP1/PP2PP1P/R1BQKB1R b KQkq - +King's Indian: fianchetto variation +rnbqk2r/ppp1ppbp/3p1np1/8/2PPP3/2N2N2/PP3PPP/R1BQKB1R b KQkq - +King's Indian: 5.Nf3 +rnbqk2r/ppp1ppbp/3p1np1/8/2PPP3/2N2P2/PP4PP/R1BQKBNR b KQkq - +King's Indian: S\"amisch variation +rnbqk2r/ppp1ppbp/3p1np1/8/2PPP3/2N3P1/PP3P1P/R1BQKBNR b KQkq - +King's Indian with e4 & g3 +rnbqk2r/ppp1ppbp/3p1np1/8/2PPP3/2N4P/PP3PP1/R1BQKBNR b KQkq - +King's Indian: Makagonov system (5.h3) +rnbqk2r/ppp1ppbp/3p1np1/8/2PPP3/2N5/PP2BPPP/R1BQK1NR b KQkq - +King's Indian: 5.Be2 +rnbqk2r/ppp1ppbp/3p1np1/8/2PPP3/2N5/PP2NPPP/R1BQKB1R b KQkq - +King's Indian: Kramer system +rnbqk2r/ppp1ppbp/3p1np1/8/2PPPP2/2N5/PP4PP/R1BQKBNR b KQkq - +King's Indian: Four pawns attack +rnbqk2r/ppp1ppbp/3p1np1/8/3PP1P1/2N5/PPP1BP1P/R1BQK1NR b KQkq - +Pirc: Chinese variation +rnbqk2r/ppp1ppbp/3p1np1/8/3PP2P/2N5/PPP1BPP1/R1BQK1NR b KQkq - +Pirc: bayonet (Mariotti) attack +rnbqk2r/ppp1ppbp/3p1np1/8/3PP3/2N2N1P/PPP2PP1/R1BQKB1R b KQkq - +Pirc: classical, h3 system +rnbqk2r/ppp1ppbp/3p1np1/8/3PP3/2N2N2/PPP1BPPP/R1BQK2R b KQkq - +Pirc: classical system, 5.Be2 +rnbqk2r/ppp1ppbp/3p1np1/8/3PP3/2N2N2/PPP2PPP/R1BQKB1R w KQkq - +Pirc: classical (two knights) system +rnbqk2r/ppp1ppbp/5np1/3p2B1/2PP4/2N2N2/PP2PPPP/R2QKB1R b KQkq - +Gr\"unfeld: 5.Bg5 +rnbqk2r/ppp1ppbp/5np1/3p4/2P5/1P3N2/PB1PPPPP/RN1QKB1R b KQkq - +Queen's Indian: Marienbad system * +rnbqk2r/ppp1ppbp/5np1/3p4/2PP1B2/2N2N2/PP2PPPP/R2QKB1R b KQkq - +Gr\"unfeld: 5.Bf4 +rnbqk2r/ppp1ppbp/5np1/3p4/2PP4/1QN2N2/PP2PPPP/R1B1KB1R b KQkq - +Gr\"unfeld: Russian variation +rnbqk2r/ppp1ppbp/5np1/3p4/2PP4/2N1PN2/PP3PPP/R1BQKB1R b KQkq - +Gr\"unfeld: 5.e3 +rnbqk2r/ppp1ppbp/5np1/3p4/2PP4/2N2N2/PP2PPPP/R1BQKB1R w KQkq - +Gr\"unfeld: Three knights variation +rnbqk2r/ppp1ppbp/5np1/3p4/2PP4/5NP1/PP2PPBP/RNBQK2R b KQkq - +Neo-Gr\"unfeld, 5.Nf3 +rnbqk2r/ppp1ppbp/5np1/3p4/2PP4/6P1/PP2PPBP/RNBQK1NR w KQkq - +King's Indian: 3.g3, counterthrust variation +rnbqk2r/ppp1ppbp/5np1/3p4/Q1PP4/2N2N2/PP2PPPP/R1B1KB1R b KQkq - +Gr\"unfeld: Flohr variation +rnbqk2r/ppp1ppbp/6p1/3n4/3P4/6P1/PP2PPBP/RNBQK1NR w KQkq - +Neo-Gr\"unfeld, 5.cd +rnbqk2r/ppp1ppbp/6p1/8/2BPP3/2P5/P4PPP/R1BQK1NR b KQkq - +Gr\"unfeld: exchange, classical variation +rnbqk2r/ppp1ppbp/6p1/8/3PP3/2P2N2/P4PPP/R1BQKB1R b KQkq - +Gr\"unfeld: modern exchange variation +rnbqk2r/ppp1ppbp/6pn/3p4/5P2/4PN2/PPPP2PP/RNBQKB1R w KQkq - +Dutch defense, Blackburne variation * +rnbqk2r/ppp1ppbp/6pn/3p4/5P2/6P1/PPPPP1BP/RNBQK1NR w KQkq - +Dutch: Leningrad, Karlsbad variation * +rnbqk2r/ppp2p1p/3b1n2/3PN3/2B2ppP/8/PPPP2P1/RNBQ1RK1 b kq - +KGA: Kieseritsky, Rice gambit +rnbqk2r/ppp2p2/4p1pp/3pP3/3Pn1Q1/2P5/P1PB1PPP/R3KBNR w KQkq - +French: MacCutcheon, Lasker variation, 8...g6 +rnbqk2r/ppp2pbp/6p1/3np3/8/2N2NP1/PP1PPPBP/R1BQK2R w KQkq - +English: Anglo-Gr\"unfeld defense, Korchnoi variation +rnbqk2r/ppp2pp1/4pP1p/3p2B1/1b1P4/2N5/PPP2PPP/R2QKBNR b KQkq - +French: MacCutcheon, Chigorin variation +rnbqk2r/ppp2pp1/4pn1p/3pP3/1b1P3B/2N5/PPP2PPP/R2QKBNR b KQkq - +French: MacCutcheon, Bernstein variation +rnbqk2r/ppp2pp1/4pn1p/3pP3/1b1P4/2N1B3/PPP2PPP/R2QKBNR b KQkq - +French: MacCutcheon, Janowski variation +rnbqk2r/ppp2pp1/4pn1p/3pP3/1b1P4/2N5/PPP2PPP/R1BQKBNR b KQkq - +French: MacCutcheon, Dr. Olland (Dutch) variation +rnbqk2r/ppp2pp1/4pn1p/3pP3/3P4/2b5/PPPB1PPP/R2QKBNR w KQkq - +French: MacCutcheon, Lasker variation +rnbqk2r/ppp2ppp/3b1n2/3pN3/3P4/3B4/PPP2PPP/RNBQK2R b KQkq - +Petrov: classical attack, Marshall variation * +rnbqk2r/ppp2ppp/3b3n/8/3P4/5N2/PPP1P1PP/RNBQKB1R b KQkq - +Bird: From gambit, Lipke variation +rnbqk2r/ppp2ppp/3b4/3np3/2B5/P3P3/1P1P1PPP/RNBQK1NR b KQkq - +Sicilian: Kan, Polugaievsky variation * +rnbqk2r/ppp2ppp/3b4/3np3/8/P3P1P1/1P1P1P1P/RNBQKBNR b KQkq - +Sicilian: Kan, Swiss cheese variation * +rnbqk2r/ppp2ppp/3b4/3np3/8/P3P3/1P1P1PPP/RNBQKBNR w KQkq - +Sicilian: Kan, 5.Bd3 * +rnbqk2r/ppp2ppp/3b4/3p4/3Pn3/3B1N2/PPP2PPP/RNBQK2R w KQkq - +Petrov: classical attack, Marshall variation +rnbqk2r/ppp2ppp/3bpn2/3p4/3P4/4PN2/PPP2PPP/RNBQKB1R w KQkq - +Queen's pawn game * +rnbqk2r/ppp2ppp/3p1n2/2b1p3/2B1P3/2N2N2/PPPP1PPP/R1BQK2R b KQkq - +Giuoco Pianissimo * +rnbqk2r/ppp2ppp/3p1n2/2b1p3/2B1P3/2N5/PPPP1PPP/R1BQK1NR w KQkq - +Giuoco Pianissimo * +rnbqk2r/ppp2ppp/3p1n2/2b1p3/4P3/2N2N2/PPPP1PPP/R1BQKB1R w KQkq - +Two knights defense (Modern bishop's opening) * +rnbqk2r/ppp2ppp/3p1n2/4p3/1b2P3/5N2/PPPPNPPP/R1BQKB1R b KQkq - +Ruy Lopez: Berlin defense, Mortimer variation * +rnbqk2r/ppp2ppp/3p1n2/4p3/4P3/2bP1N2/PPP2PPP/R1BQKB1R w KQkq - +Ruy Lopez: Berlin defense, Anderssen variation * +rnbqk2r/ppp2ppp/3p1n2/b3p3/4P3/P1N2N2/1PPP1PPP/R1BQKB1R w KQkq - +Ruy Lopez: Anderssen variation * +rnbqk2r/ppp2ppp/3p4/2b1pP2/2B1P1n1/2N5/PPPP2PP/R1BQK1NR b KQkq - +Giuoco Pianissimo: Dubois variation * +rnbqk2r/ppp2ppp/3p4/2b5/N2pP1n1/5N2/PPP2PPP/R1BQKB1R w KQkq - +two knights defense: Kieseritsky variation * +rnbqk2r/ppp2ppp/3p4/4p3/1b2n3/2P2N2/PP1PNPPP/R1BQKB1R b KQkq - +Ruy Lopez: Berlin defense, Mortimer trap * +rnbqk2r/ppp2ppp/4p3/3p4/2PPn3/P1Q5/1P2PPPP/R1B1KBNR w KQkq - +Nimzo-Indian: classical, Noa variation, main line +rnbqk2r/ppp2ppp/4p3/3p4/2PPn3/P7/1PQ1PPPP/R1B1KBNR b KQkq - +Nimzo-Indian: classical, Noa variation, main line, 7.Qc2 +rnbqk2r/ppp2ppp/4pn2/3p2B1/1b1PP3/2N5/PPP2PPP/R2QKBNR w KQkq - +French: MacCutcheon variation +rnbqk2r/ppp2ppp/4pn2/3p2B1/1bPP4/5N2/PP2PPPP/RN1QKB1R w KQkq - +QGD: Vienna variation +rnbqk2r/ppp2ppp/4pn2/3p4/1bPP4/2N2N2/PP2PPPP/R1BQKB1R w KQkq - +QGD: Ragozin variation +rnbqk2r/ppp2ppp/4pn2/3p4/1bPP4/2N5/PPQ1PPPP/R1B1KBNR w KQkq - +Nimzo-Indian: classical, Noa variation +rnbqk2r/ppp2ppp/4pn2/3p4/1bPP4/P1N5/1PQ1PPPP/R1B1KBNR b KQkq - +Nimzo-Indian: classical, Noa variation, 5.a3 +rnbqk2r/ppp2ppp/4pn2/3pP1B1/1b1P4/2N5/PPP2PPP/R2QKBNR b KQkq - +French: MacCutcheon, advance variation +rnbqk2r/ppp2ppp/4pn2/6B1/1bpP4/2N2N2/PP2PPPP/R2QKB1R w KQkq - +QGD: Ragozin, Vienna variation +rnbqk2r/ppp2ppp/5n2/1BbPp3/8/2N5/PPPP1PPP/R1BQK1NR b KQkq - +Scotch gambit * +rnbqk2r/ppp2ppp/5n2/2bPp3/1PP5/8/P2P1PPP/RNBQKBNR b KQkq - +Center game, Kieseritsky variation * +rnbqk2r/ppp2ppp/5n2/2bPp3/8/2N2N2/PPPP1PPP/R1BQKB1R b KQkq - +Scotch gambit: Dubois-R\'eti defense * +rnbqk2r/ppp2ppp/5n2/2bPp3/8/2N5/PPPP1PPP/R1BQKBNR w KQkq - +Scotch gambit * +rnbqk2r/ppp2ppp/5n2/2bPp3/8/2N5/PPPPBPPP/R1BQK1NR b KQkq - +Scotch gambit: Benima defense * +rnbqk2r/ppp2ppp/5n2/2bPp3/8/5N2/PPPP1PPP/RNBQKB1R w KQkq - +Bishop's opening/Petrov: Urusov gambit * +rnbqk2r/ppp2ppp/5n2/2bpp3/4P3/2N2N2/PPPP1PPP/R1BQKB1R w KQkq - +Two knights defense * +rnbqk2r/ppp2ppp/5n2/2bpp3/4P3/3P1N2/PPP2PPP/RNBQKB1R w KQkq - +Philidor: Nimzovich, Klein variation * +rnbqk2r/ppp2ppp/5n2/3P4/1b3P2/2NPp3/PPPB2PP/R2QKBNR w KQkq - +KGD: Falkbeer, Morphy gambit +rnbqk2r/ppp2ppp/5n2/3Pp3/1b6/2N5/PPPP1PPP/R1BQKBNR w KQkq - +Scotch: Relfsson gambit (`MacLopez') * +rnbqk2r/ppp2ppp/5n2/3p4/1b1P4/2N5/PPQ1PPPP/R1B1KBNR w KQkq - +Nimzo-Indian: classical, Noa variation, 5.cd ed +rnbqk2r/ppp2ppp/5n2/3pp3/4P3/P1PP1P2/2P3PP/R1BQKBNR b KQkq - +Ruy Lopez: modern Steinitz defense, Alapin variation * +rnbqk2r/ppp2ppp/5n2/3pp3/4P3/P1PP4/2P2PPP/R1BQKBNR w KQkq - +Ruy Lopez: modern Steinitz defense, Richter variation * +rnbqk2r/ppp2ppp/8/1Bbp4/3NP1n1/2N5/PPP2PPP/R1BQK2R b KQkq - +two knights defense: Pincus variation * +rnbqk2r/ppp2ppp/8/2bPp3/2B3n1/2N5/PPPP1PPP/R1BQK1NR w KQkq - +Scotch gambit * +rnbqk2r/ppp2ppp/8/2bPp3/5P2/3P3N/PPP3Pn/RNBQKB1R w KQkq - +Philidor: L\'opez counter-gambit, Jaenisch variation * +rnbqk2r/ppp2ppp/8/2bPp3/6n1/2N2N2/PPPP1PPP/R1BQKB1R w KQkq - +Two knights defense, Perreux variation * +rnbqk2r/ppp2ppp/8/2bp4/3NP1n1/2N5/PPP2PPP/R1BQKB1R w KQkq - +two knights defense: Lolli attack * +rnbqk2r/ppp2ppp/8/2bpp3/4P1n1/2PP4/PP1N1PPP/R1BQKBNR w KQkq - +Philidor: Hanham, Kmoch variation * +rnbqk2r/ppp3p1/8/2bppPPp/4nP2/8/PPPPQ2P/RNB1KBNR w KQkq - +KGA: Kieseritsky, Salvio defense, Cozio variation * +rnbqk2r/ppp3p1/8/3ppPPp/3b4/7P/PPP3K1/RNBQ1BNR w kq - +KGA: Allgaier, Urusov attack * +rnbqk2r/ppp3pp/5n2/2bppPP1/8/8/PPPP1P1P/RNBQKBNR w KQkq - +KGA: Ghulam Kassim gambit * +rnbqk2r/ppp3pp/5p2/3np3/1b2P3/3P1N2/PP3PPP/RNBQKB1R w KQkq - +Sicilian: Prins variation, Venice attack * +rnbqk2r/pppn1pp1/4p2p/3pP3/1b1P4/2N5/PPPB1PPP/R2QKBNR w KQkq - +French: MacCutcheon, Tartakower variation +rnbqk2r/pppnb1pp/4pp2/3pP1B1/3P3P/2N5/PPP2PP1/R2QKBNR w KQkq - +French: Albin-Alekhine-Ch\^atard attack, Teichmann variation +rnbqk2r/pppnbppp/4p3/3pP1B1/3P3P/2N5/PPP2PP1/R2QKBNR b KQkq - +French: Albin-Alekhine-Ch\^atard attack +rnbqk2r/pppp1ppp/1b3n2/4p3/1PB1P3/P1N5/2PP1PPP/R1BQK1NR b KQkq - +Ruy Lopez: Graz variation * +rnbqk2r/pppp1ppp/1b3n2/4p3/NP2P3/P7/2PP1PPP/R1BQKBNR b KQkq - +Ruy Lopez: Taimanov (chase/wing/accelerated counterthrust) variation * +rnbqk2r/pppp1ppp/4pn2/6B1/1bPP4/2N5/PP2PPPP/R2QKBNR b KQkq - +Nimzo-Indian: Leningrad variation +rnbqk2r/pppp1ppp/4pn2/8/1bP5/2N2N2/PP1PPPPP/R1BQKB1R w KQkq - +English: Nimzo-English opening +rnbqk2r/pppp1ppp/4pn2/8/1bPP4/1QN5/PP2PPPP/R1B1KBNR b KQkq - +Nimzo-Indian: Spielmann variation +rnbqk2r/pppp1ppp/4pn2/8/1bPP4/2N1P3/PP3PPP/R1BQKBNR b KQkq - +Nimzo-Indian: 4.e3 +rnbqk2r/pppp1ppp/4pn2/8/1bPP4/2N2N2/PP2PPPP/R1BQKB1R b KQkq - +Nimzo-Indian: three knights variation +rnbqk2r/pppp1ppp/4pn2/8/1bPP4/2N2P2/PP2P1PP/R1BQKBNR b KQkq - +Nimzo-Indian: Kmoch variation +rnbqk2r/pppp1ppp/4pn2/8/1bPP4/2N3P1/PP2PP1P/R1BQKBNR b KQkq - +Nimzo-Indian: Romanishin-Kasparov (Steiner) system +rnbqk2r/pppp1ppp/4pn2/8/1bPP4/2N5/PP2PPPP/R1BQKBNR w KQkq - +Nimzo-Indian defense +rnbqk2r/pppp1ppp/4pn2/8/1bPP4/2N5/PPQ1PPPP/R1B1KBNR b KQkq - +Nimzo-Indian: classical variation +rnbqk2r/pppp1ppp/4pn2/8/1bPP4/2NQ4/PP2PPPP/R1B1KBNR b KQkq - +Nimzo-Indian: Mikenas attack +rnbqk2r/pppp1ppp/4pn2/8/1bPP4/5N2/PP1NPPPP/R1BQKB1R b KQkq - +Bogo-Indian defense, Gr\"unfeld variation +rnbqk2r/pppp1ppp/4pn2/8/1bPP4/5N2/PP2PPPP/RNBQKB1R w KQkq - +Bogo-Indian defense +rnbqk2r/pppp1ppp/4pn2/8/2PP4/P1P5/4PPPP/R1BQKBNR b KQkq - +Nimzo-Indian: S\"amisch variation +rnbqk2r/pppp1ppp/5n2/1B2p3/1b2P3/2N5/PPPP1PPP/R1BQK1NR b KQkq - +Ruy Lopez: Alapin's defense * +rnbqk2r/pppp1ppp/5n2/2b1p3/2B1P3/2N5/PPPP1PPP/R1BQK1NR b KQkq - +Giuoco Piano * +rnbqk2r/pppp1ppp/5n2/2b1p3/4P3/2N2N2/PPPP1PPP/R1BQKB1R b KQkq - +Two knights defense * +rnbqk2r/pppp1ppp/5n2/2b1p3/4P3/2N5/PPPP1PPP/R1BQKBNR w KQkq - +King's pawn game * +rnbqk2r/pppp1ppp/5n2/2b1p3/4P3/2N5/PPPPBPPP/R1BQK1NR b KQkq - +Hungarian defense * +rnbqk2r/pppp1ppp/5n2/2b1p3/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - +Petrov: Italian variation * +rnbqk2r/pppp1ppp/5n2/2b1p3/4PP2/2N5/PPPP2PP/R1BQKBNR b KQkq - +Rousseau gambit * +rnbqk2r/pppp1ppp/5n2/2b1p3/4PP2/3P4/PPP3PP/RNBQKBNR b KQkq - +Philidor: L\'opez counter-gambit * +rnbqk2r/pppp1ppp/5n2/2b1p3/4PP2/8/PPPP2PP/RNBQKBNR w KQkq - +Latvian gambit, 3.Bc4 * +rnbqk2r/pppp1ppp/5n2/3Np3/1b2P3/8/PPPP1PPP/R1BQKBNR b KQkq - +Ruy Lopez: Bird's defense * +rnbqk2r/pppp1ppp/5n2/4P3/1bB2p2/2N5/PPPP2PP/R1BQK1NR b KQkq - +KGA: bishop's gambit, Paulsen attack +rnbqk2r/pppp1ppp/5n2/4p3/1b2P1P1/2N5/PPPP1P1P/R1BQKBNR b KQkq - +Ruy Lopez: Brentano defense * +rnbqk2r/pppp1ppp/5n2/4p3/1b2P1Q1/2N5/PPPP1PPP/R1B1KBNR w KQkq - +Vienna: Zhuravlev countergambit +rnbqk2r/pppp1ppp/5n2/4p3/1b2P3/2N2N2/PPPP1PPP/R1BQKB1R b KQkq - +Ruy Lopez: Berlin defense * +rnbqk2r/pppp1ppp/5n2/4p3/1b2P3/2N2P2/PPPP2PP/R1BQKBNR b KQkq - +Ruy Lopez: Nuremberg variation * +rnbqk2r/pppp1ppp/5n2/4p3/1b2P3/2N3P1/PPPP1P1P/R1BQKBNR b KQkq - +Ruy Lopez: fianchetto (Smyslov/Barnes) defense * +rnbqk2r/pppp1ppp/5n2/4p3/1b2P3/2N5/PPPP1PPP/R1BQKBNR w KQkq - +Ruy Lopez (Spanish opening) * +rnbqk2r/pppp1ppp/5n2/4p3/1b2P3/2N5/PPPPBPPP/R1BQK1NR b KQkq - +Ruy Lopez: Lucena defense * +rnbqk2r/pppp1ppp/5n2/4p3/1b2P3/2N5/PPPPNPPP/R1BQKB1R b KQkq - +Ruy Lopez: Cozio defense * +rnbqk2r/pppp1ppp/5n2/4p3/1b2P3/2N5/PPPPQPPP/R1B1KBNR b KQkq - +Ruy Lopez: Vinogradov variation * +rnbqk2r/pppp1ppp/5n2/4p3/1b2P3/2NP4/PPP2PPP/R1BQKBNR b KQkq - +Ruy Lopez: old Steinitz defense * +rnbqk2r/pppp1ppp/5n2/4p3/1b2PP2/2N5/PPPP2PP/R1BQKBNR b KQkq - +Ruy Lopez: Schliemann defense * +rnbqk2r/pppp1ppp/5n2/4p3/1bB1P3/2N5/PPPP1PPP/R1BQK1NR b KQkq - +Ruy Lopez: classical (Cordel) defense * +rnbqk2r/pppp1ppp/5n2/4p3/1bP5/2N3P1/PP1PPP1P/R1BQKBNR b KQkq - +Sicilian: Nimzovich-Rossolimo attack (with ...g6, without ...d6) * +rnbqk2r/pppp1ppp/5n2/4p3/1bP5/2N3P1/PP1PPP1P/R1BQKBNR w KQkq - +English: Bremen, Smyslov system +rnbqk2r/pppp1ppp/5n2/4p3/1bP5/2N5/PP1PPPPP/R1BQKBNR w KQkq - +Sicilian: Nimzovich-Rossolimo attack (without ...d6) * +rnbqk2r/pppp1ppp/5n2/4p3/1bP5/3P4/PP1BPPPP/RN1QKBNR b KQkq - +Sicilian: Canal-Sokolsky attack, 3...Bd7 * +rnbqk2r/pppp1ppp/5n2/4p3/1bP5/3P4/PP2PPPP/RNBQKBNR w KQkq - +Sicilian: Canal-Sokolsky (Nimzovich-Rossolimo, Moscow) attack * +rnbqk2r/pppp1ppp/5n2/4p3/2B1P3/2N5/PPPP1bPP/R1BQK1NR w KQkq - +Giuoco Piano: Jerome gambit * +rnbqk2r/pppp1ppp/5n2/4p3/4P3/P1PP4/2P2PPP/R1BQKBNR b KQkq - +Ruy Lopez: modern Steinitz defense, exchange variation * +rnbqk2r/pppp1ppp/5n2/4p3/4P3/P1b2N2/1PPP1PPP/R1BQKB1R w KQkq - +Ruy Lopez: Treybal (Bayreuth) variation (exchange var. deferred) * +rnbqk2r/pppp1ppp/5n2/4p3/4P3/P1b5/1PPP1PPP/R1BQKBNR w KQkq - +Ruy Lopez: exchange variation * +rnbqk2r/pppp1ppp/5n2/4p3/Nb2P3/8/PPPP1PPP/R1BQKBNR b KQkq - +Ruy Lopez: Pollock defense * +rnbqk2r/pppp1ppp/5n2/b2Np3/4P3/P7/1PPP1PPP/R1BQKBNR b KQkq - +Ruy Lopez: Bird's defense deferred * +rnbqk2r/pppp1ppp/5n2/b3p3/1P2P3/P1N5/2PP1PPP/R1BQKBNR b KQkq - +Ruy Lopez: Caro variation * +rnbqk2r/pppp1ppp/5n2/b3p3/2B1P3/P1N5/1PPP1PPP/R1BQK1NR b KQkq - +Ruy Lopez: Classical defense deferred * +rnbqk2r/pppp1ppp/5n2/b3p3/4P3/P1N2N2/1PPP1PPP/R1BQKB1R b KQkq - +Ruy Lopez: Morphy defense * +rnbqk2r/pppp1ppp/5n2/b3p3/4P3/P1N3P1/1PPP1P1P/R1BQKBNR b KQkq - +Ruy Lopez: fianchetto defense deferred * +rnbqk2r/pppp1ppp/5n2/b3p3/4P3/P1N5/1PPP1PPP/R1BQKBNR w KQkq - +Ruy Lopez * +rnbqk2r/pppp1ppp/5n2/b3p3/4P3/P1N5/1PPPNPPP/R1BQKB1R b KQkq - +Ruy Lopez: Cozio defense deferred * +rnbqk2r/pppp1ppp/5n2/b3p3/4P3/P1NP4/1PP2PPP/R1BQKBNR b KQkq - +Ruy Lopez: modern Steinitz defense * +rnbqk2r/pppp1ppp/5n2/b3p3/4PP2/P1N5/1PPP2PP/R1BQKBNR b KQkq - +Ruy Lopez: Schliemann defense deferred * +rnbqk2r/pppp1ppp/5n2/bB2p3/4P3/P1N5/1PPP1PPP/R1BQK1NR b KQkq - +Ruy Lopez: Alapin's defense deferred * +rnbqk2r/pppp1ppp/8/2b1P3/3Pn3/8/PPP3PP/RNBQKBNR b KQkq - +Latvian: Polerio variation * +rnbqk2r/pppp1ppp/8/2b1P3/4n3/5N2/PPPP2PP/RNBQKB1R b KQkq - +Latvian: corkscrew counter-gambit * +rnbqk2r/pppp1ppp/8/2b1p3/2B1P1n1/2N2N2/PPPP1PPP/R1BQK2R b KQkq - +two knights defense: Wilkes Barre (Traxler) variation * +rnbqk2r/pppp1ppp/8/2b1p3/4P1n1/2N2N2/PPPP1PPP/R1BQKB1R w KQkq - +Two knights defense * +rnbqk2r/pppp1ppp/8/2b5/1P1pP1n1/2N2N2/P1P2PPP/R1BQKB1R b KQkq - +two knights defense: Ulvestad variation * +rnbqk2r/pppp1ppp/8/2b5/3NP3/2N5/PPP2nPP/R1BQKB1R w KQkq - +two knights defense: Fegatello attack * +rnbqk2r/pppp1ppp/8/2b5/N2pP1n1/5N2/PPP2PPP/R1BQKB1R b KQkq - +two knights defense * +rnbqk2r/pppp1ppp/8/2bN4/3pP1n1/5N2/PPP2PPP/R1BQKB1R b KQkq - +two knights defense: Fritz variation * +rnbqk2r/pppp1ppp/8/8/Nb1pP1n1/5N2/PPP2PPP/R1BQKB1R w KQkq - +Two knights defense * +rnbqk2r/pppp2p1/5n2/2b1pP1p/6P1/8/PPPP1PBP/RNBQK1NR w KQkq - +KGA: Philidor gambit * +rnbqk2r/pppp2p1/8/2b1pPPp/4n3/5N2/PPPP1P1P/RNBQKB1R w KQkq - +KGA: Kieseritsky, Berlin defense, 6.Bc4 * +rnbqk2r/pppp2p1/8/2b1pPPp/8/7P/PPPP1K2/RNBQ1BNR w kq - +KGA: Allgaier, Walker attack * +rnbqk2r/pppp2pp/4pn2/5p2/1bPP4/6P1/PP2PPBP/RNBQK1NR w KQkq - +Dutch defense: Dutch-Indian (Nimzo-Dutch) variation +rnbqk2r/pppp2pp/5n2/2b1pP2/6P1/2N5/PPPP1P1P/R1BQKBNR b KQkq - +KGA: Blachly gambit * +rnbqk2r/pppp2pp/5n2/2b1pP2/6P1/8/PPPP1P1P/RNBQKBNR w KQkq - +KGA: King's knight's gambit * +rnbqk2r/pppp2pp/5n2/2b1pP2/6P1/8/PPPP1PBP/RNBQK1NR b KQkq - +King's knight's gambit * +rnbqk2r/pppp2pp/5n2/2b1pP2/8/5N2/PPPPBPPP/RNBQK2R b KQkq - +KGA: Cunningham, Euwe defense * +rnbqk2r/pppp2pp/5n2/2b2P2/3N4/2P5/P4PPP/RNBQKB1R b KQkq - +KGA: Abbazia defense, Botvinnik variation * +rnbqk2r/pppp2pp/5n2/4pPP1/8/8/PPPP1b1P/RNBQKBNR w KQkq - +KGA: Lolli gambit (wild Muzio gambit) * +rnbqk2r/pppp2pp/8/2b1pPP1/4n3/8/PPPP1P1P/RNBQKBNR w KQkq - +KGA: Salvio gambit * +rnbqk2r/pppp3p/5np1/2b1pP1B/8/8/PPPP1PPP/RNBQK1NR w KQkq - +KGA: Cunningham, Bertin gambit * +rnbqk2r/ppppb1pp/4pn2/5p2/2PP4/6P1/PP1BPPBP/RN1QK1NR w KQkq - +Dutch-Indian, Alekhine variation +rnbqk2r/ppppb1pp/4pn2/5p2/2PP4/6P1/PP2PPBP/RNBQK1NR w KQkq - +Dutch defense +rnbqk2r/ppppbppp/3n4/4p2Q/8/1BN5/PPPP1PPP/R1B1K1NR w KQkq - +Vienna game +rnbqk2r/ppppbppp/5n2/4p3/4P3/2N5/PPPP1PPP/R1BQKBNR w KQkq - +Inverted Hungarian * +rnbqk2r/ppppbppp/5n2/8/2B1Pp2/5N2/PPPP2PP/RNBQK2R w KQkq - +KGA: Cunningham, Euwe defense +rnbqk2r/ppppbppp/7n/8/N3P3/2P2N1P/P4PP1/R1BQKB1R w KQkq - +two knights defense: Steinitz variation * +rnbqk2r/ppppbppp/8/4P3/N3n3/2P2N1P/P1Q2PP1/R1B1KB1R b KQkq - +two knights defense: G\"oring variation * +rnbqk2r/ppppbppp/8/8/N3P1n1/2P2N1P/P4PP1/R1BQKB1R b KQkq - +Two knights defense * +rnbqk2r/ppppbppp/8/8/N3P1n1/2P2N2/P4PPP/R1BQKB1R w KQkq - +Two knights defense * +rnbqk2r/ppppp1bp/5np1/5p2/2PP4/5NP1/PP2PPBP/RNBQK2R b KQkq - +Dutch: Leningrad, main variation +rnbqk2r/ppppp2p/6pb/5P2/3P4/8/PPP2PPP/RN1QKBNR b KQkq - +Amar gambit * +rnbqk2r/ppppppbp/5np1/6B1/3P4/8/PPPNPPPP/R2QKBNR b KQkq - +R\'eti: King's Indian attack, Keres variation * +rnbqk2r/ppppppbp/5np1/8/2PP4/8/PP2PPPP/RNBQKBNR w KQkq - +R\'eti: King's Indian attack * +rnbqk2r/ppppppbp/5np1/8/2PPP3/2N5/PP3PPP/R1BQKBNR b KQkq - +King's Indian: 4.e4 +rnbqkb1r/1p2pppp/p2p1n2/6B1/3NP3/2N5/PPP2PPP/R2QKB1R b KQkq - +Sicilian: Najdorf, 6.Bg5 +rnbqkb1r/1p2pppp/p2p1n2/8/2BNP3/2N5/PPP2PPP/R1BQK2R b KQkq - +Sicilian: Najdorf, Lipnitzky attack +rnbqkb1r/1p2pppp/p2p1n2/8/3NP3/2N1B3/PPP2PPP/R2QKB1R b KQkq - +Sicilian: Najdorf, Byrne (English) attack +rnbqkb1r/1p2pppp/p2p1n2/8/3NP3/2N3P1/PPP2P1P/R1BQKB1R b KQkq - +Sicilian: Najdorf, Zagreb (fianchetto) variation +rnbqkb1r/1p2pppp/p2p1n2/8/3NP3/2N4P/PPP2PP1/R1BQKB1R b KQkq - +Sicilian: Najdorf, Adams attack +rnbqkb1r/1p2pppp/p2p1n2/8/3NP3/2N5/PPP1BPPP/R1BQK2R b KQkq - +Sicilian: Najdorf, Opo\v censky variation +rnbqkb1r/1p2pppp/p2p1n2/8/3NP3/2N5/PPP2PPP/R1BQKB1R w KQkq - +Sicilian: Najdorf +rnbqkb1r/1p2pppp/p2p1n2/8/3NPP2/2N5/PPP3PP/R1BQKB1R b KQkq - +Sicilian: Najdorf, 6.f4 +rnbqkb1r/1p2pppp/p4n2/2pp4/8/1P2PN2/P1PP1PPP/RNBQKB1R w KQkq - +Queen's Indian: Petrosian system * +rnbqkb1r/1p3p1p/p2ppnp1/8/2PNP3/3B4/PP3PPP/RNBQ1RK1 w kq - +Sicilian: Kan, Gipslis variation +rnbqkb1r/1p3ppp/p1p1pn2/3p4/2PP4/2N1PN2/PP3PPP/R1BQKB1R w KQkq - +QGD semi-Slav: accelerated Meran (Alekhine variation) +rnbqkb1r/1p3ppp/p2ppn2/6B1/3NP3/2N5/PPP2PPP/R2QKB1R w KQkq - +Sicilian: Najdorf, 6...e6 +rnbqkb1r/1p3ppp/p2ppn2/6B1/3NPP2/2N5/PPP3PP/R2QKB1R b KQkq - +Sicilian: Najdorf, 7.f4 +rnbqkb1r/1p3ppp/p2ppn2/8/3NP3/2N1B3/PPPQ1PPP/R3KB1R b KQkq - +Sicilian: Scheveningen, English variation +rnbqkb1r/1p3ppp/p2ppn2/8/3NP3/2N5/PPP1BPPP/R1BQK2R w KQkq - +Sicilian: Scheveningen (Paulsen), classical variation +rnbqkb1r/1p3ppp/p3pn2/2p5/2BP4/4PN2/PP2QPPP/RNB2RK1 b kq - +QGA: classical, 7.Qe2 +rnbqkb1r/1p3ppp/p3pn2/2p5/2BP4/4PN2/PP3PPP/RNBQ1RK1 w kq - +QGA: classical, 6...a6 +rnbqkb1r/1p3ppp/p3pn2/2p5/2BPP3/5N2/PP3PPP/RNBQ1RK1 b kq - +QGA: classical, Geller variation +rnbqkb1r/1p3ppp/p3pn2/2p5/P1BP4/4PN2/1P3PPP/RNBQ1RK1 b kq - +QGA: classical, Rubinstein variation +rnbqkb1r/1p3ppp/p4n2/1N1pp1B1/Q1P5/2N5/PP2PPPP/R3KB1R b KQkq - +QGD: Semi-Tarrasch, Krause variation +rnbqkb1r/1pp1pppp/p4n2/8/2pPP3/2N2N2/PP3PPP/R1BQKB1R b KQkq - +QGA, Bogolyubov variation +rnbqkb1r/1ppp1ppp/p3pn2/8/2PP4/5N2/PP2PPPP/RNBQKB1R w KQkq - +Dzindzikhashvili defense +rnbqkb1r/2pp1ppp/p3pn2/1p6/2P5/5NP1/PP1PPPBP/RNBQK2R w KQkq - +English: Romanishin gambit +rnbqkb1r/3ppppp/P4n2/2pP4/8/8/PP2PPPP/RNBQKBNR b KQkq - +Benk\"o gambit accepted +rnbqkb1r/3ppppp/p4n2/1PpP4/8/2N5/PP2PPPP/R1BQKBNR b KQkq - +Benk\"o gambit: Zaitsev system +rnbqkb1r/3ppppp/p4n2/1PpP4/8/8/PP2PPPP/RNBQKBNR w KQkq - +Benk\"o gambit half accepted +rnbqkb1r/4pppp/3p1n2/1NpP4/1pB1P3/8/PP3PPP/R1BQK1NR b KQkq - +Benk\"o gambit: Nescaf\'e Frapp\'e attack +rnbqkb1r/5ppp/p2ppn2/1p4B1/3NPP2/2N5/PPP3PP/R2QKB1R w KQkq - +Sicilian: Najdorf, Polugayevsky variation +rnbqkb1r/5ppp/p2ppn2/1p6/3NP3/1BN5/PPP2PPP/R1BQK2R w KQkq - +Sicilian: Sozin with ...a6 and ...b5 +rnbqkb1r/5ppp/p3pn2/1pp5/2BP4/4PN2/PP2QPPP/RNB2RK1 w kq - +QGA: classical, 7...b5 +rnbqkb1r/p1pp1ppp/1p2pn2/8/2P5/2N2N2/PP1PPPPP/R1BQKB1R w KQkq - +English: Queens Indian formation +rnbqkb1r/p1pp1ppp/1p2pn2/8/2PP1B2/5N2/PP2PPPP/RN1QKB1R b KQkq - +Queen's Indian: Miles variation +rnbqkb1r/p1pp1ppp/1p2pn2/8/2PP4/2N2N2/PP2PPPP/R1BQKB1R b KQkq - +Queen's Indian: 4.Nc3 +rnbqkb1r/p1pp1ppp/1p2pn2/8/2PP4/4PN2/PP3PPP/RNBQKB1R b KQkq - +Queen's Indian: 4.e3 +rnbqkb1r/p1pp1ppp/1p2pn2/8/2PP4/5N2/PP2PPPP/RNBQKB1R w KQkq - +Queen's Indian defense +rnbqkb1r/p1pp1ppp/1p2pn2/8/2PP4/5NP1/PP2PP1P/RNBQKB1R b KQkq - +Queen's Indian: 4.g3 +rnbqkb1r/p1pp1ppp/1p2pn2/8/2PP4/P4N2/1P2PPPP/RNBQKB1R b KQkq - +Queen's Indian: Petrosian system +rnbqkb1r/p1pp1ppp/5n2/1p2p3/2P5/3P4/PP2PPPP/RNBQKBNR w KQkq - +Sicilian: wing gambit deferred * +rnbqkb1r/p1pp1ppp/5n2/1p4N1/2P1p3/2N5/PP1PPPPP/R1BQKB1R w KQkq - +English: Bellon gambit +rnbqkb1r/p1pp1ppp/5n2/1p6/2PPp3/4P3/PP3PPP/RNBQKBNR w KQkq - +French: Wing gambit * +rnbqkb1r/p1pp2pp/5n2/1p2pp2/2B1P3/3P4/PPP2PPP/RNBQK1NR w KQkq - +KGD: classical, Heath variation * +rnbqkb1r/p1ppp1pp/1p3n2/6B1/3Pp3/2N5/PPP2PPP/R2QKBNR w KQkq - +Dutch: Staunton gambit, Nimzovich variation +rnbqkb1r/p1pppp1p/5np1/1p1P4/2P5/8/PP2PPPP/RNBQKBNR w KQkq - +King's Indian: Danube gambit +rnbqkb1r/p1pppp1p/5np1/1p6/8/5NP1/PPPPPP1P/RNBQKB1R w KQkq - +R\'eti: King's Indian attack, R\'eti-Smyslov variation * +rnbqkb1r/p1pppppp/1p3n2/8/2PP4/8/PP2PPPP/RNBQKBNR w KQkq - +Queen's Indian accelerated +rnbqkb1r/p1pppppp/1p3n2/8/3P4/5N2/PPP1PPPP/RNBQKB1R w KQkq - +Queen's Indian defense +rnbqkb1r/p1pppppp/1p3n2/8/3P4/8/PPP1PPPP/RNBQKBNR w KQkq - +R\'eti: Nimzovich-Larsen attack * +rnbqkb1r/p1pppppp/5n2/1p6/3P4/8/PPP1PPPP/RNBQKBNR w KQkq - +Santasiere's folly * +rnbqkb1r/p1pppppp/5n2/1p6/8/5NP1/PPPPPP1P/RNBQKB1R w KQkq - +R\'eti: King's Indian attack, Spassky's variation +rnbqkb1r/p1pppppp/8/1p1nP3/3P4/8/PPP2PPP/RNBQKBNR w KQkq - +Alekhine's defense: O'Sullivan gambit +rnbqkb1r/p2n1ppp/1p2p3/2ppP3/3P4/2PB4/PP1N1PPP/R1BQK1NR w KQkq - +French: Tarrasch, Botvinnik variation +rnbqkb1r/p2p1pp1/5n1p/1ppP2B1/8/5N2/PP2PPPP/RN1QKB1R w KQkq - +Blumenfeld counter-gambit, Spielmann variation +rnbqkb1r/p2p1ppp/4pn2/1ppP2B1/2P5/5N2/PP2PPPP/RN1QKB1R b KQkq - +Blumenfeld counter-gambit, Dus-Chotimursky variation +rnbqkb1r/p2p1ppp/4pn2/1ppP4/2P5/5N2/PP2PPPP/RNBQKB1R w KQkq - +Blumenfeld counter-gambit +rnbqkb1r/p2ppp1p/1p3np1/2p3B1/3P4/2P2N2/PP2PPPP/RN1QKB1R b KQkq - +English: Torre defensive system * +rnbqkb1r/p2ppp1p/1p3np1/2p5/3P1B2/2P2N2/PP2PPPP/RN1QKB1R b KQkq - +English: London defensive system * +rnbqkb1r/p2ppppp/1p3n2/2p3B1/3P4/2P5/PP2PPPP/RN1QKBNR b KQkq - +English: Caro-Kann defensive system, Bogolyubov variation * +rnbqkb1r/p2ppppp/1p3n2/2p5/3P4/2P5/PP2PPPP/RNBQKBNR w KQkq - +English: Caro-Kann defensive system * +rnbqkb1r/p2ppppp/5n2/1ppP4/2P5/8/PP2PPPP/RNBQKBNR w KQkq - +Benk\"o gambit +rnbqkb1r/p3pppp/2p2n2/1p2P3/2pP4/2N2N2/PP3PPP/R1BQKB1R b KQkq - +QGD Slav: Tolush-Geller gambit +rnbqkb1r/p3pppp/5n2/1ppP4/2p1P3/2N5/PP3PPP/R1BQKBNR w KQkq - +QGA: Linares variation +rnbqkb1r/p4p2/2p1p2p/1p1nP1N1/2pP3B/2N5/PP3PPP/R2QKB1R w KQkq - +QGD semi-Slav: anti-Meran, Alatortsev system +rnbqkb1r/p4p2/2p1pP1p/1p2N3/2pP3p/2N5/PP3PPP/R2QKB1R b KQkq - +QGD semi-Slav: Ekstrom variation +rnbqkb1r/p4p2/2p1pn1p/1p2P1N1/2pP3B/2N5/PP3PPP/R2QKB1R b KQkq - +QGD semi-Slav: anti-Meran gambit +rnbqkb1r/p4ppp/2p5/3n4/2B2p2/5N2/PPPP2PP/RNBQK2R w KQkq - +KGA: Abbazia defense, Botvinnik variation +rnbqkb1r/p5pp/4pn2/1Ppp4/8/5N2/PP2PPPP/RNBQKB1R w KQkq - +Blumenfeld counter-gambit accepted +rnbqkb1r/pp1n1ppp/4p3/2ppP3/3P1P2/2N2N2/PPP3PP/R1BQKB1R b KQkq - +French: Steinitz variation +rnbqkb1r/pp1p1ppp/2p2n2/4p3/2P5/2N3P1/PP1PPP1P/R1BQKBNR w KQkq - +English: Bremen system, Keres variation +rnbqkb1r/pp1p1ppp/2p2n2/4p3/4P3/2N2N2/PPPP1PPP/R1BQKB1R b KQkq - +Ponziani: Jaenisch counter-attack * +rnbqkb1r/pp1p1ppp/2p2n2/4p3/4P3/2N5/PPPP1PPP/R1BQKBNR w KQkq - +Ponziani opening * +rnbqkb1r/pp1p1ppp/2p2n2/4p3/4P3/2N5/PPPPBPPP/R1BQK1NR b KQkq - +Ponziani: Romanishin variation * +rnbqkb1r/pp1p1ppp/2p2n2/4p3/4P3/2N5/PPPPNPPP/R1BQKB1R b KQkq - +Ponziani: R\'eti variation * +rnbqkb1r/pp1p1ppp/2p2n2/4p3/4PP2/2N5/PPPP2PP/R1BQKBNR b KQkq - +Ponziani counter-gambit * +rnbqkb1r/pp1p1ppp/2p2n2/8/2B1Pp2/2N5/PPPP2PP/R1BQK1NR w KQkq - +KGA: bishop's gambit, Jaenisch variation +rnbqkb1r/pp1p1ppp/2p5/3Nn3/1P1NP3/8/P1P2PPP/R1BQKB1R w KQkq - +two knights defense: Fritz, Gruber variation * +rnbqkb1r/pp1p1ppp/4pn2/2P5/8/4B3/PPP1PPPP/RN1QKBNR b KQkq - +R\'eti accepted: Keres variation * +rnbqkb1r/pp1p1ppp/4pn2/2p3B1/3PP3/5N2/PPP2PPP/RN1QKB1R b KQkq - +Queen's pawn: Torre attack, Wagner gambit +rnbqkb1r/pp1p1ppp/4pn2/2p5/2P1P3/2N5/PP1P1PPP/R1BQKBNR w KQkq - +English: Mikenas-Carls, Sicilian variation +rnbqkb1r/pp1p1ppp/4pn2/2pP4/2P5/8/PP2PPPP/RNBQKBNR w KQkq - +Benoni defense +rnbqkb1r/pp1p1ppp/4pn2/8/2PN4/8/PP2PPPP/RNBQKB1R w KQkq - +English: symmetrical variation +rnbqkb1r/pp1p1ppp/4pn2/8/3NP3/8/PPP2PPP/RNBQKB1R w KQkq - +Sicilian: Anderssen variation +rnbqkb1r/pp1p1ppp/5n2/2p1N3/8/3P4/PPP2PPP/RNBQKB1R w KQkq - +Petrov: Kaufmann attack * +rnbqkb1r/pp1p1ppp/5n2/2p1p3/2P5/6PB/PP1PPP1P/RNBQK1NR b KQkq - +Sicilian: Acton extension * +rnbqkb1r/pp1p1ppp/5n2/2p1p3/4P3/2N5/PPPP1PPP/R1BQKBNR w KQkq - +Dresden opening * +rnbqkb1r/pp1p1ppp/5n2/2pPp3/2P5/8/PP2PPPP/RNBQKBNR w KQkq e6 +Czech Benoni defense +rnbqkb1r/pp1p2pp/2p2n2/4pp2/2B1P3/3P4/PPP2PPP/RNBQK1NR w KQkq - +KGD: classical, 4.c3 * +rnbqkb1r/pp1p2pp/2p2n2/4pp2/2B1PP2/3P4/PPP3PP/RNBQK1NR b KQkq - +KGD: classical counter-gambit * +rnbqkb1r/pp1pp1pp/2p2n2/6B1/3Pp3/2N5/PPP2PPP/R2QKBNR w KQkq - +Dutch: Staunton gambit, Chigorin variation +rnbqkb1r/pp1ppp1p/5np1/2p5/3P4/2P1P3/PP3PPP/RNBQKBNR b KQkq - +English: Kurajica defense * +rnbqkb1r/pp1ppp1p/5np1/2p5/3P4/4P3/PPP2PPP/RNBQKBNR w KQkq - +English opening: Agincourt variation * +rnbqkb1r/pp1ppp1p/5np1/2p5/3P4/4PN2/PPP2PPP/RNBQKB1R b KQkq - +English: Neo-Catalan * +rnbqkb1r/pp1ppppp/1n6/2p1P3/8/1B1P4/PPP2PPP/RNBQK1NR b KQkq - +Alekhine's defense: Kmoch variation +rnbqkb1r/pp1ppppp/2p2n2/8/3PP3/8/PPP2PPP/RNBQKBNR w KQkq - +Caro-Masi defense +rnbqkb1r/pp1ppppp/5n2/2P5/8/8/PPP1PPPP/RNBQKBNR b KQkq - +R\'eti accepted * +rnbqkb1r/pp1ppppp/5n2/2p1P3/8/8/PPPP1PPP/RNBQKBNR b KQkq - +English, Nimzovich, Flohr variation * +rnbqkb1r/pp1ppppp/5n2/2p5/2P5/2N3P1/PP1PPP1P/R1BQKBNR b KQkq - +English: symmetrical variation +rnbqkb1r/pp1ppppp/5n2/2p5/2PP4/5N2/PP2PPPP/RNBQKB1R b KQkq - +English: symmetrical, Benoni formation +rnbqkb1r/pp1ppppp/5n2/2p5/2PP4/8/PP2PPPP/RNBQKBNR w KQkq - +Benoni defense +rnbqkb1r/pp1ppppp/5n2/2p5/3P4/4P3/PPP2PPP/RNBQKBNR b KQkq - +English opening: Agincourt variation * +rnbqkb1r/pp1ppppp/5n2/2p5/3P4/8/PPP1PPPP/RNBQKBNR w KQkq - +R\'eti opening * +rnbqkb1r/pp1ppppp/5n2/2p5/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - +Sicilian: Nimzovich-Rubinstein variation +rnbqkb1r/pp1ppppp/5n2/2p5/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +English, Nimzovich variation * +rnbqkb1r/pp1ppppp/5n2/2p5/8/5N2/PPPPPPPP/RNBQKB1R w KQkq - +English opening * +rnbqkb1r/pp1ppppp/5n2/2pP4/8/5N2/PPP1PPPP/RNBQKB1R b KQkq - +Old Benoni defense +rnbqkb1r/pp1ppppp/5n2/2pP4/8/8/PPP1PPPP/RNBQKBNR b KQkq - +R\'eti: advance variation * +rnbqkb1r/pp1ppppp/5n2/2pP4/8/8/PPP1PPPP/RNBQKBNR w KQkq - +Old Benoni defense +rnbqkb1r/pp1ppppp/5n2/3P4/2p5/5N2/PPP1PPPP/RNBQKB1R w KQkq - +Hawk (Habichd) defense +rnbqkb1r/pp1ppppp/8/2pP4/2P1n3/8/PP2PPPP/RNBQKBNR w KQkq - +Vulture defense +rnbqkb1r/pp2pp1p/2p2np1/3p4/2P5/1P3N2/PB1PPPPP/RN1QKB1R w KQkq - +English: Bled variation +rnbqkb1r/pp2pp1p/2p2np1/3p4/2PP4/2N2N2/PP2PPPP/R1BQKB1R w KQkq - +QGD Slav\Gr\"unfeld: Schlechter variation +rnbqkb1r/pp2pp1p/2p2p2/8/3P4/8/PPP2PPP/R1BQKBNR w KQkq - +Caro-Kann: Bronstein-Larsen variation +rnbqkb1r/pp2pp1p/2pp1np1/8/3PP3/2N1B3/PPPQ1PPP/R3KBNR b KQkq - +Pirc: 150 attack +rnbqkb1r/pp2pp1p/3p1np1/8/3NP3/2N1B3/PPP2PPP/R2QKB1R b KQkq - +Sicilian: dragon, 6.Be3 +rnbqkb1r/pp2pp1p/3p1np1/8/3NP3/2N5/PPP2PPP/R1BQKB1R w KQkq - +Sicilian: dragon variation +rnbqkb1r/pp2pp1p/3p1np1/8/3NPP2/2N5/PPP3PP/R1BQKB1R b KQkq - +Sicilian: dragon, Levenfish variation +rnbqkb1r/pp2pp1p/5np1/2pP4/4p3/2N5/PPP2PPP/R1BQKBNR w KQkq - +QGD: Albin counter-gambit, 5.g3 * +rnbqkb1r/pp2pp1p/5np1/2pp4/8/1P2PN2/P1PP1PPP/RNBQKB1R w KQkq - +Queen's Indian: 4.g3 * +rnbqkb1r/pp2pp1p/5np1/2pp4/8/1P2PN2/PBPP1PPP/RN1QKB1R b KQkq - +Queen's Indian: 4.g3 Bb7 * +rnbqkb1r/pp2pp1p/5np1/2pp4/8/BP2PN2/P1PP1PPP/RN1QKB1R b KQkq - +Queen's Indian: Nimzovich variation (exaggerated fianchetto) * +rnbqkb1r/pp2pp1p/5np1/3p4/2PP4/2N5/PP3PPP/R1BQKBNR w KQkq - +Caro-Kann: Panov-Botvinnik attack, 5...g6 +rnbqkb1r/pp2pp1p/6p1/2p3B1/2PPp3/8/PP1QPPPP/R3KBNR w KQkq - +Gr\"unfeld: Lundin variation +rnbqkb1r/pp2pppp/2p2n2/3P4/2P5/8/PP1P1PPP/RNBQKBNR w KQkq - +Scandinavian gambit +rnbqkb1r/pp2pppp/2p2n2/3p4/2P5/1P3N2/PB1PPPPP/RN1QKB1R b KQkq - +English: Caro-Kann defensive system +rnbqkb1r/pp2pppp/2p2n2/3p4/2PP4/2N2N2/PP2PPPP/R1BQKB1R b KQkq - +QGD Slav: 4.Nc3 +rnbqkb1r/pp2pppp/2p2n2/3p4/2PP4/4PN2/PP3PPP/RNBQKB1R b KQkq - +QGD Slav: 4.e3 +rnbqkb1r/pp2pppp/2p2n2/3p4/2PP4/5N2/PP1NPPPP/R1BQKB1R b KQkq - +QGD Slav: Breyer variation +rnbqkb1r/pp2pppp/2p2n2/8/2pP4/2N1PN2/PP3PPP/R1BQKB1R b KQkq - +QGD Slav: 5.e3 (Alekhine variation) +rnbqkb1r/pp2pppp/2p2n2/8/2pP4/2N2N2/PP2PPPP/R1BQKB1R w KQkq - +QGD Slav accepted +rnbqkb1r/pp2pppp/2p2n2/8/2pPP3/2N2N2/PP3PPP/R1BQKB1R b KQkq - +QGD Slav: Slav gambit +rnbqkb1r/pp2pppp/2p2n2/8/3PN3/3B4/PPP2PPP/R1BQK1NR b KQkq - +Caro-Kann: Alekhine gambit +rnbqkb1r/pp2pppp/2p2n2/8/P1pP4/2N2N2/1P2PPPP/R1BQKB1R b KQkq - +QGD Slav accepted: Alapin variation +rnbqkb1r/pp2pppp/2pp1n2/8/3PP3/2N5/PPP2PPP/R1BQKBNR w KQkq - +Pirc: Ufimtsev-Pytel variation +rnbqkb1r/pp2pppp/3p1n2/2p5/3PP3/5N2/PPP2PPP/RNBQKB1R w KQkq - +Sicilian: Cortlever (Alatortsev) variation +rnbqkb1r/pp2pppp/3p1n2/2pP4/2P5/8/PP2PPPP/RNBQKBNR w KQkq - +Benoni defense, Hromodka system +rnbqkb1r/pp2pppp/3p1n2/8/3NP3/2N5/PPP2PPP/R1BQKB1R b KQkq - +Sicilian +rnbqkb1r/pp2pppp/3p1n2/8/3NP3/5P2/PPP3PP/RNBQKB1R b KQkq - +Sicilian: Prins (Moscow) variation +rnbqkb1r/pp2pppp/5n2/1Bpp4/8/4PN2/PPPP1PPP/RNBQK2R b KQkq - +Bogo-Indian defense * +rnbqkb1r/pp2pppp/5n2/2Pp4/1P6/8/P1P1PPPP/RNBQKBNR b KQkq - +QGA: Ericson variation * +rnbqkb1r/pp2pppp/5n2/2Pp4/3P4/8/PP3PPP/RNBQKBNR b KQkq - +Caro-Kann: Panov-Botvinnik, Gunderam attack +rnbqkb1r/pp2pppp/5n2/2Pp4/8/5N2/PPP1PPPP/RNBQKB1R b KQkq - +Queen's gambit accepted * +rnbqkb1r/pp2pppp/5n2/2Pp4/8/8/PPP1PPPP/RNBQKBNR w KQkq - +QGA: 3.Nf3 * +rnbqkb1r/pp2pppp/5n2/2Pp4/8/P7/1PP1PPPP/RNBQKBNR b KQkq - +QGA: Alekhine defense * +rnbqkb1r/pp2pppp/5n2/2p3N1/4p3/8/PPPP1PPP/RNBQKB1R w KQkq - +Budapest: Adler variation * +rnbqkb1r/pp2pppp/5n2/2p5/1PPp4/4PN2/P2P1PPP/RNBQKB1R b KQkq - +Blumenfeld counter-gambit * +rnbqkb1r/pp2pppp/5n2/2pP4/4p3/8/PPP2PPP/RNBQKBNR w KQkq - +QGD: Albin counter-gambit * +rnbqkb1r/pp2pppp/5n2/2pp4/2P5/5N2/PP1PPPPP/RNBQKB1R w KQkq - +English: symmetrical, Benoni formation * +rnbqkb1r/pp2pppp/5n2/2pp4/3P4/2P5/PP2PPPP/RNBQKBNR w KQkq - +QGD Slav: 3.Nf3 * +rnbqkb1r/pp2pppp/5n2/2pp4/3P4/5NP1/PPP1PP1P/RNBQKB1R b KQkq - +Neo-Gr\"unfeld defense * +rnbqkb1r/pp2pppp/5n2/2pp4/5P2/4PN2/PPPP2PP/RNBQKB1R w KQkq - +Bird's opening: Lasker variation +rnbqkb1r/pp2pppp/5n2/2pp4/8/1P2PN2/P1PP1PPP/RNBQKB1R b KQkq - +Queen's Indian defense * +rnbqkb1r/pp2pppp/5n2/2pp4/8/4PN2/PPPP1PPP/RNBQKB1R w KQkq - +Queen's pawn game * +rnbqkb1r/pp2pppp/5n2/2pp4/8/5NP1/PPPPPP1P/RNBQKB1R w KQkq - +King's Indian, 3.Nf3 * +rnbqkb1r/pp2pppp/5n2/2pp4/8/P3PN2/1PPP1PPP/RNBQKB1R b KQkq - +Dzindzikhashvili defense * +rnbqkb1r/pp2pppp/5n2/2ppN3/8/4P3/PPPP1PPP/RNBQKB1R b KQkq - +D\"ory defense * +rnbqkb1r/pp2pppp/5n2/3p4/2PP4/2N5/PP3PPP/R1BQKBNR b KQkq - +Caro-Kann: Panov-Botvinnik attack +rnbqkb1r/pp2pppp/5n2/3p4/3P4/5N2/PP2PPPP/RNBQKB1R b KQkq - +QGD Slav: exchange variation * +rnbqkb1r/pp2pppp/5n2/3p4/3P4/5N2/PP2PPPP/RNBQKB1R w KQkq - +QGD Slav: exchange variation +rnbqkb1r/pp2pppp/5n2/8/1pPP4/4PN2/P5PP/RNBQKB1R b KQkq - +Blumenfeld counter-gambit accepted * +rnbqkb1r/pp2pppp/8/2pn4/8/2N2N2/PP1PPPPP/R1BQKB1R w KQkq - +English: symmetrical, three knights system +rnbqkb1r/pp2pppp/8/2pn4/8/4PN2/PP1P1PPP/RNBQKB1R b KQkq - +English: symmetrical variation * +rnbqkb1r/pp3p1p/2p1pnp1/3p4/2PP4/4PN2/PP1N1PPP/R1BQKB1R w KQkq - +QGD: Spielmann variation +rnbqkb1r/pp3p1p/3p1np1/2pP2B1/8/2N2N2/PP2PPPP/R2QKB1R b KQkq - +Benoni: Uhlmann variation +rnbqkb1r/pp3p1p/3p1np1/2pP4/4P3/2N2N2/PP3PPP/R1BQKB1R b KQkq - +Benoni: classical with e4 and Nf3 +rnbqkb1r/pp3p1p/3p1np1/2pP4/4PP2/2N5/PP4PP/R1BQKBNR b KQkq - +Benoni: pawn storm variation +rnbqkb1r/pp3p1p/3p1np1/2pP4/8/2N2N2/PP2PPPP/R1BQKB1R w KQkq - +Benoni defense +rnbqkb1r/pp3p1p/3p1np1/2pP4/8/2N2NP1/PP2PP1P/R1BQKB1R b KQkq - +Benoni: fianchetto variation +rnbqkb1r/pp3p1p/3p1np1/2pP4/8/2N5/PP1NPPPP/R1BQKB1R b KQkq - +Benoni: Nimzovich (knight's tour) variation +rnbqkb1r/pp3p1p/3p1np1/2pPp3/2P1P3/2N5/PP3PPP/R1BQKBNR w KQkq - +Czech Benoni: King's Indian system +rnbqkb1r/pp3ppp/2p1pn2/3p4/2PP4/2N1PN2/PP3PPP/R1BQKB1R b KQkq - +QGD semi-Slav: 5.e3 +rnbqkb1r/pp3ppp/2p1pn2/3p4/2PP4/2N2N2/PP2PPPP/R1BQKB1R w KQkq - +QGD semi-Slav +rnbqkb1r/pp3ppp/2p1pn2/3p4/2PP4/4PN2/PP1N1PPP/R1BQKB1R b KQkq - +QGD Slav +rnbqkb1r/pp3ppp/2p1pn2/6B1/2pP4/2N2N2/PP2PPPP/R2QKB1R w KQkq - +QGD semi-Slav: 5.Bg5 dc +rnbqkb1r/pp3ppp/2p1pn2/6B1/2pPP3/2N2N2/PP3PPP/R2QKB1R b KQkq - +QGD semi-Slav: Botvinnik system (anti-Meran) +rnbqkb1r/pp3ppp/2p1pn2/8/P1pP4/2N2N2/1P2PPPP/R1BQKB1R w KQkq - +QGD Slav: Soultanb\'eieff variation +rnbqkb1r/pp3ppp/2p2n2/3Pp3/4P3/8/PP1P1PPP/RNBQKBNR w KQkq - +Sicilian: Andreaschek gambit * +rnbqkb1r/pp3ppp/2p2n2/3Pp3/8/2N5/PPPP1PPP/R1BQKBNR w KQkq - +Scotch: G\"oring gambit * +rnbqkb1r/pp3ppp/2p2n2/3Pp3/8/3P4/PP2PPPP/RNBQKBNR w KQkq - +Sicilian: Tartakower variation * +rnbqkb1r/pp3ppp/2p2n2/3p2B1/3P4/2N5/PP2PPPP/R2QKBNR w KQkq - +QGD: exchange, positional line, 5...c6 +rnbqkb1r/pp3ppp/2p2n2/3p2B1/3P4/2N5/PPQ1PPPP/R3KBNR b KQkq - +QGD: exchange, positional line, 6.Qc2 +rnbqkb1r/pp3ppp/2p2n2/3p4/2PPp3/1Q2P3/PP1B1PPP/RN2KBNR b KQkq - +French: advance, Wade variation * +rnbqkb1r/pp3ppp/2p2n2/3p4/2PPp3/2N1P3/PP1B1PPP/R2QKBNR b KQkq - +French: advance, Euwe variation * +rnbqkb1r/pp3ppp/2p2n2/3p4/2PPp3/2N1P3/PP3PPP/R1BQKBNR w KQkq - +French: advance, Paulsen attack * +rnbqkb1r/pp3ppp/2p2n2/3pp3/8/3P2P1/PPP1PPBP/RNBQK1NR w KQkq - +Robatsch defense: Geller's system * +rnbqkb1r/pp3ppp/2p2n2/4N3/2BpP3/2N5/PPPP1PPP/R1BQK2R b KQkq - +Ponziani: Fraser defense * +rnbqkb1r/pp3ppp/2p2n2/4p3/3pPP2/2NP4/PPP3PP/R1BQKBNR w KQkq - +Ponziani counter-gambit, Schmidt attack * +rnbqkb1r/pp3ppp/2p2p2/8/2BP4/8/PPP2PPP/R1BQK1NR b KQkq - +Caro-Kann: Forg\'acs variation +rnbqkb1r/pp3ppp/2p2p2/8/3P4/8/PPP2PPP/R1BQKBNR w KQkq - +Caro-Kann: Tartakower (Nimzovich) variation +rnbqkb1r/pp3ppp/3p1n2/1B2p3/3NP3/2N5/PPP2PPP/R1BQK2R b KQkq - +Sicilian: Venice attack +rnbqkb1r/pp3ppp/3p1n2/1B2p3/3NP3/5P2/PPP3PP/RNBQK2R b KQkq - +Sicilian: Prins variation, Venice attack +rnbqkb1r/pp3ppp/3p1n2/2pP4/4P3/2N5/PP3PPP/R1BQKBNR b KQkq - +Benoni: 6.e4 +rnbqkb1r/pp3ppp/3ppn2/1B6/3NP3/2N5/PPP2PPP/R1BQK2R b KQkq - +Sicilian: Scheveningen, Vitoli\'n\'s variation +rnbqkb1r/pp3ppp/3ppn2/8/2BNP3/2N5/PPP2PPP/R1BQK2R b KQkq - +Sicilian: Sozin attack +rnbqkb1r/pp3ppp/3ppn2/8/3NP1P1/2N5/PPP2P1P/R1BQKB1R b KQkq - +Sicilian: Scheveningen, Keres attack +rnbqkb1r/pp3ppp/3ppn2/8/3NP3/2N3P1/PPP2P1P/R1BQKB1R b KQkq - +Sicilian: Scheveningen, fianchetto variation +rnbqkb1r/pp3ppp/3ppn2/8/3NP3/2N5/PPP1BPPP/R1BQK2R b KQkq - +Sicilian: Scheveningen, 6.Be2 +rnbqkb1r/pp3ppp/3ppn2/8/3NP3/2N5/PPP2PPP/R1BQKB1R w KQkq - +Sicilian: Scheveningen variation +rnbqkb1r/pp3ppp/3ppn2/8/3NPP2/2N5/PPP3PP/R1BQKB1R b KQkq - +Sicilian: Scheveningen, 6.f4 +rnbqkb1r/pp3ppp/4p3/2pn4/3P4/2N1PN2/PP3PPP/R1BQKB1R b KQkq - +QGD: Semi-Tarrasch with e3 +rnbqkb1r/pp3ppp/4pn2/2Pp2B1/8/5N2/PPP1PPPP/RN1QKB1R b KQkq - +QGA, Janowsky-Larsen variation * +rnbqkb1r/pp3ppp/4pn2/2Pp4/1P6/P7/2P1PPPP/RNBQKBNR b KQkq - +QGA: Haberditz variation * +rnbqkb1r/pp3ppp/4pn2/2Pp4/8/4BN2/PPP1PPPP/RN1QKB1R b KQkq - +QGA, Flohr variation * +rnbqkb1r/pp3ppp/4pn2/2Pp4/8/4PN2/PPP2PPP/RNBQKB1R b KQkq - +QGA: 4...e6 * +rnbqkb1r/pp3ppp/4pn2/2Pp4/8/5N2/PPP1PPPP/RNBQKB1R w KQkq - +QGA, 4.e3 * +rnbqkb1r/pp3ppp/4pn2/2Pp4/8/5NP1/PPP1PP1P/RNBQKB1R b KQkq - +QGA, Smyslov variation * +rnbqkb1r/pp3ppp/4pn2/2p5/2BP4/4PN2/PP3PPP/RNBQ1RK1 b kq - +QGA: classical variation, 6.O-O +rnbqkb1r/pp3ppp/4pn2/2p5/2BP4/4PN2/PP3PPP/RNBQK2R w KQkq - +QGA: classical variation +rnbqkb1r/pp3ppp/4pn2/2pP2B1/3P4/2N5/PP2PPPP/R2QKBNR b KQkq - +QGD: Semi-Tarrasch +rnbqkb1r/pp3ppp/4pn2/2pP4/3P4/2N2N2/PP2PPPP/R1BQKB1R b KQkq - +QGD: Semi-Tarrasch, 5.cd +rnbqkb1r/pp3ppp/4pn2/2pp2B1/2PP4/2N2N2/PP2PPPP/R2QKB1R b KQkq - +QGD: Semi-Tarrasch defense, Pillsbury variation +rnbqkb1r/pp3ppp/4pn2/2pp2B1/2PP4/2N5/PP2PPPP/R2QKBNR w KQkq - +QGD: Been-Koomen variation +rnbqkb1r/pp3ppp/4pn2/2pp4/2P5/1P2PN2/PB1P1PPP/RN1QKB1R b KQkq - +English: Wimpey system +rnbqkb1r/pp3ppp/4pn2/2pp4/2PP4/2N2N2/PP2PPPP/R1BQKB1R w KQkq - +QGD: Semi-Tarrasch defense +rnbqkb1r/pp3ppp/4pn2/2pp4/3P1B2/2P2N2/PP2PPPP/RN1QKB1R b KQkq - +QGD Slav: 4.e3 Bf5 * +rnbqkb1r/pp3ppp/4pn2/2pp4/3P4/1P1BPN2/P1P2PPP/RNBQK2R b KQkq - +Queen's pawn game, Rubinstein (Colle-Zukertort) variation +rnbqkb1r/pp3ppp/4pn2/2pp4/3P4/1P2PN2/P1PN1PPP/R1BQKB1R b KQkq - +Queen's pawn game, Zukertort variation +rnbqkb1r/pp3ppp/4pn2/2pp4/3P4/2P2N2/PP2PPPP/RNBQKB1R w KQkq - +QGD Slav: 4.e3 * +rnbqkb1r/pp3ppp/4pn2/2pp4/3P4/2PBPN2/PP3PPP/RNBQK2R b KQkq - +Colle system +rnbqkb1r/pp3ppp/4pn2/2pp4/8/1P2PN2/P1PP1PPP/RNBQKB1R w KQkq - +Queen's Indian: 4.e3 * +rnbqkb1r/pp3ppp/4pn2/3p2B1/2PQ4/2N2N2/PP2PPPP/R3KB1R b KQkq - +QGD: Semi-Tarrasch, Primitive Pillsbury variation +rnbqkb1r/pp3ppp/4pn2/3p4/2PP4/2N5/PP3PPP/R1BQKBNR w KQkq - +Caro-Kann: Panov-Botvinnik attack, 5...e6 +rnbqkb1r/pp3ppp/4pn2/8/2Bp4/4PN2/PP3PPP/RNBQ1RK1 w kq - +QGA: classical, Steinitz variation +rnbqkb1r/pp3ppp/5n2/2Ppp3/8/P7/1PP1PPPP/RNBQKBNR w KQkq - +QGA: Alekhine defense, Borisenko-Furman variation * +rnbqkb1r/pp3ppp/5n2/2p3B1/3pp3/1N1P4/PPP1PPPP/RN1QKB1R w KQkq - +Alekhine's defense: modern, Vitolins attack * +rnbqkb1r/pp3ppp/5n2/2pp2B1/3Np3/3P4/PPP1PPPP/RN1QKB1R w KQkq - +Alekhine's defense: modern, Alekhine variation * +rnbqkb1r/pp3ppp/5n2/2ppp1B1/8/3P2P1/PPP1PPBP/RN1QK1NR b KQkq - +Robatsch defense: Rossolimo variation * +rnbqkb1r/pp3ppp/8/2pnp3/8/2N3P1/PP1PPP1P/R1BQKBNR w KQkq - +Sicilian: accelerated fianchetto, Mar\'oczy bind * +rnbqkb1r/pp3ppp/8/2pnp3/8/2N3P1/PP1PPPBP/R1BQK1NR b KQkq - +Sicilian: accelerated fianchetto, Mar\'oczy bind, 5...Bg7 * +rnbqkb1r/pp3ppp/8/2pnp3/8/P3P3/1P1P1PPP/RNBQKBNR w KQkq - +Sicilian: Kan, Mar\'oczy bind (R\'eti variation) * +rnbqkb1r/pp4pp/2p1p3/3p1p2/2PPn3/2NBPN2/PP3PPP/R1BQK2R w KQkq - +QGD semi-Slav: stonewall defense +rnbqkb1r/pp4pp/2p1p3/3p1p2/2PPn3/3BPN2/PP1N1PPP/R1BQK2R w KQkq - +QGD: Stonewall variation +rnbqkb1r/pp4pp/5n2/3p2B1/2p5/1NN1P3/PPP1P1PP/R2QKB1R w KQkq - +Alekhine's defense: four pawns attack, Ilyin-Genevsky variation * +rnbqkb1r/ppn1pppp/8/2p5/8/2N3P1/PP1PPPBP/R1BQK1NR w KQkq - +English: symmetrical, Rubinstein system +rnbqkb1r/ppp1p1pp/5n2/3p4/8/3B3N/PPP2PPP/RNBQK2R w KQkq - +Bird: From gambit, Lipke variation * +rnbqkb1r/ppp1pp1p/1n1p2p1/4P3/2PP1P2/8/PP4PP/RNBQKBNR w KQkq - +Alekhine's defense: four pawns attack, fianchetto variation +rnbqkb1r/ppp1pp1p/1n1p4/4P1p1/2PP1P2/8/PP4PP/RNBQKBNR w KQkq - +Alekhine's defense: four pawns attack, Planinc variation +rnbqkb1r/ppp1pp1p/1n4p1/8/8/2N3P1/PP1PPPBP/R1BQK1NR w KQkq - +English: Anglo-Gr\"unfeld, Czech defense +rnbqkb1r/ppp1pp1p/3p1np1/6B1/3PP3/2N5/PPP2PPP/R2QKBNR b KQkq - +Pirc: Byrne variation +rnbqkb1r/ppp1pp1p/3p1np1/8/2BPP3/2N5/PPP2PPP/R1BQK1NR b KQkq - +Pirc: Holmov system +rnbqkb1r/ppp1pp1p/3p1np1/8/3PP3/2N2N2/PPP2PPP/R1BQKB1R b KQkq - +Pirc: classical (two knights) system +rnbqkb1r/ppp1pp1p/3p1np1/8/3PP3/2N3P1/PPP2P1P/R1BQKBNR b KQkq - +Pirc: Sveshnikov system +rnbqkb1r/ppp1pp1p/3p1np1/8/3PP3/2N5/PPP1BPPP/R1BQK1NR b KQkq - +Pirc defense +rnbqkb1r/ppp1pp1p/3p1np1/8/3PP3/2N5/PPP2PPP/R1BQKBNR w KQkq - +Pirc defense +rnbqkb1r/ppp1pp1p/3p1np1/8/3PPP2/2N5/PPP3PP/R1BQKBNR b KQkq - +Pirc: Austrian attack +rnbqkb1r/ppp1pp1p/3p2p1/3nP3/3P4/5N2/PPP2PPP/RNBQKB1R w KQkq - +Alekhine's defense: modern, fianchetto variation +rnbqkb1r/ppp1pp1p/5np1/3P4/3P4/8/PPP2PPP/RNBQKBNR w KQkq - +Scandinavian: Richter variation +rnbqkb1r/ppp1pp1p/5np1/3p2B1/2PP4/2N5/PP2PPPP/R2QKBNR b KQkq - +Gr\"unfeld: Stockholm variation +rnbqkb1r/ppp1pp1p/5np1/3p4/2PP1B2/2N5/PP2PPPP/R2QKBNR b KQkq - +Gr\"unfeld: 4.Bf4 +rnbqkb1r/ppp1pp1p/5np1/3p4/2PP2P1/2N5/PP2PP1P/R1BQKBNR b KQkq - +Gr\"unfeld: Spike gambit +rnbqkb1r/ppp1pp1p/5np1/3p4/2PP4/1QN5/PP2PPPP/R1B1KBNR b KQkq - +Gr\"unfeld: Russian variation +rnbqkb1r/ppp1pp1p/5np1/3p4/2PP4/2N2N2/PP2PPPP/R1BQKB1R b KQkq - +Gr\"unfeld: Three knights variation +rnbqkb1r/ppp1pp1p/5np1/3p4/2PP4/2N5/PP2PPPP/R1BQKBNR w KQkq - +Gr\"unfeld defense +rnbqkb1r/ppp1pp1p/5np1/3p4/2PP4/5N2/PP2PPPP/RNBQKB1R w KQkq - +Neo-Gr\"unfeld defense +rnbqkb1r/ppp1pp1p/5np1/3p4/2PP4/5P2/PP2P1PP/RNBQKBNR w KQkq - +Neo-Gr\"unfeld defense +rnbqkb1r/ppp1pp1p/5np1/3p4/2PP4/6P1/PP2PP1P/RNBQKBNR w KQkq - +Neo-Gr\"unfeld (Kemeri) defense +rnbqkb1r/ppp1pp1p/5np1/3p4/8/5NP1/PPPPPP1P/RNBQKB1R w KQkq - +King's Indian: fianchetto without c4 * +rnbqkb1r/ppp1pp1p/5np1/8/2pP4/4PN2/PP3PPP/RNBQKB1R w KQkq - +QGA, Smyslov variation +rnbqkb1r/ppp1pp1p/6p1/3n4/3P4/2N5/PP2PPPP/R1BQKBNR w KQkq - +Gr\"unfeld: exchange variation +rnbqkb1r/ppp1pp1p/6p1/8/8/2n3P1/PP1PPPBP/R1BQK1NR w KQkq - +English: Anglo-Gr\"unfeld, Smyslov defense +rnbqkb1r/ppp1pppp/1n1P4/8/2PP4/8/PP3PPP/RNBQKBNR b KQkq - +Alekhine's defense: exchange variation +rnbqkb1r/ppp1pppp/1n1p4/4P3/2PP1P2/8/PP4PP/RNBQKBNR b KQkq - +Alekhine's defense: four pawns attack +rnbqkb1r/ppp1pppp/1n1p4/4P3/3P4/5N2/PPP2PPP/RNBQKB1R w KQkq - +Alekhine's defense: modern, Schmid variation +rnbqkb1r/ppp1pppp/3p1n2/8/2PP4/8/PP2PPPP/RNBQKBNR w KQkq - +Old Indian defense +rnbqkb1r/ppp1pppp/3p1n2/8/3P4/8/PPP1PPPP/RNBQKBNR w KQkq - +R\'eti: old Indian attack * +rnbqkb1r/ppp1pppp/3p1n2/8/3PP3/8/PPP2PPP/RNBQKBNR w KQkq - +Pirc defense +rnbqkb1r/ppp1pppp/3p4/3nP3/2BP4/8/PPP2PPP/RNBQK1NR b KQkq - +Alekhine's defense: Balogh variation +rnbqkb1r/ppp1pppp/3p4/3nP3/2PP4/8/PP3PPP/RNBQKBNR b KQkq - +Alekhine's defense +rnbqkb1r/ppp1pppp/3p4/3nP3/3P4/5N2/PPP2PPP/RNBQKB1R b KQkq - +Alekhine's defense: modern variation +rnbqkb1r/ppp1pppp/3p4/3nP3/3P4/8/PPP2PPP/RNBQKBNR w KQkq - +Alekhine's defense +rnbqkb1r/ppp1pppp/5n2/2P5/3p4/5N2/PP1PPPPP/RNBQKB1R b KQkq - +Hawk (Habichd) defense * +rnbqkb1r/ppp1pppp/5n2/3P4/3P4/8/PPP2PPP/RNBQKBNR b KQkq - +Scandinavian defense +rnbqkb1r/ppp1pppp/5n2/3P4/8/8/PPPP1PPP/RNBQKBNR w KQkq - +Scandinavian defense +rnbqkb1r/ppp1pppp/5n2/3p2B1/3P4/2N5/PPP1PPPP/R2QKBNR b KQkq - +Richter-Veresov attack +rnbqkb1r/ppp1pppp/5n2/3p2B1/3P4/5N2/PPP1PPPP/RN1QKB1R b KQkq - +Torre attack (Tartakower variation) +rnbqkb1r/ppp1pppp/5n2/3p2B1/8/3P4/PPP1PPPP/RN1QKBNR b KQkq - +Old Indian: Tartakower (Wade) variation * +rnbqkb1r/ppp1pppp/5n2/3p4/2P5/2N5/PP1PPPPP/R1BQKBNR w KQkq - +English: Anglo-Gr\"unfeld defense +rnbqkb1r/ppp1pppp/5n2/3p4/2PP4/8/PP2PPPP/RNBQKBNR b KQkq - +Queen's pawn game, Krause variation * +rnbqkb1r/ppp1pppp/5n2/3p4/2PP4/8/PP2PPPP/RNBQKBNR w KQkq - +QGD: Marshall defense +rnbqkb1r/ppp1pppp/5n2/3p4/3P1B2/5N2/PPP1PPPP/RN1QKB1R b KQkq - +Queen's bishop game +rnbqkb1r/ppp1pppp/5n2/3p4/3P2P1/5P2/PPP1P2P/RNBQKBNR b KQkq - +Gedult attack +rnbqkb1r/ppp1pppp/5n2/3p4/3P4/2N5/PPP1PPPP/R1BQKBNR b KQkq - +Queen's pawn game, Chigorin variation * +rnbqkb1r/ppp1pppp/5n2/3p4/3P4/3BP3/PPP2PPP/RNBQK1NR b KQkq - +Queen's pawn: stonewall attack +rnbqkb1r/ppp1pppp/5n2/3p4/3P4/4PN2/PPP2PPP/RNBQKB1R b KQkq - +Queen's pawn game +rnbqkb1r/ppp1pppp/5n2/3p4/3P4/5N2/PPP1PPPP/RNBQKB1R b KQkq - +Queen's pawn game * +rnbqkb1r/ppp1pppp/5n2/3p4/3P4/5N2/PPP1PPPP/RNBQKB1R w KQkq - +Queen's pawn game +rnbqkb1r/ppp1pppp/5n2/3p4/3P4/8/PPP1PPPP/RNBQKBNR w KQkq - +Queen's pawn game * +rnbqkb1r/ppp1pppp/5n2/3p4/3PP3/2N5/PPP2PPP/R1BQKBNR b KQkq - +Blackmar-Diemer gambit +rnbqkb1r/ppp1pppp/5n2/3p4/3PP3/5P2/PPP3PP/RNBQKBNR b KQkq - +Blackmar-Diemer gambit +rnbqkb1r/ppp1pppp/5n2/3p4/4P3/2N5/PPPP1PPP/R1BQKBNR w KQkq - +Alekhine's defense: Scandinavian variation +rnbqkb1r/ppp1pppp/5n2/3p4/8/1P3N2/P1PPPPPP/RNBQKB1R b KQkq - +Queen's Indian defense * +rnbqkb1r/ppp1pppp/5n2/3p4/8/5N2/PPPPPPPP/RNBQKB1R w KQkq - +Queen's pawn game * +rnbqkb1r/ppp1pppp/5n2/3p4/8/5NP1/PPPPPP1P/RNBQKB1R b KQkq - +King's Indian: East Indian defense * +rnbqkb1r/ppp1pppp/5n2/3pN3/8/8/PPPPPPPP/RNBQKB1R b KQkq - +D\"ory defense * +rnbqkb1r/ppp1pppp/5n2/8/2Pp4/5N2/PP1PPPPP/RNBQKB1R w KQkq - +Old Benoni defense * +rnbqkb1r/ppp1pppp/5n2/8/2pP4/2N2N2/PP2PPPP/R1BQKB1R b KQkq - +QGA, 4.Nc3 +rnbqkb1r/ppp1pppp/5n2/8/2pP4/4PN2/PP3PPP/RNBQKB1R b KQkq - +QGA, 4.e3 +rnbqkb1r/ppp1pppp/5n2/8/2pP4/5N2/PP2PPPP/RNBQKB1R w KQkq - +Queen's gambit accepted +rnbqkb1r/ppp1pppp/5n2/8/Q1pP4/5N2/PP2PPPP/RNB1KB1R b KQkq - +QGA: Mannheim variation +rnbqkb1r/ppp1pppp/8/3n4/3P4/8/PPP2PPP/RNBQKBNR w KQkq - +Scandinavian: Marshall variation +rnbqkb1r/ppp1pppp/8/3n4/8/2N2N2/PP1PPPPP/R1BQKB1R b KQkq - +English: Anglo-Gr\"unfeld defense +rnbqkb1r/ppp1pppp/8/3np3/3P4/5N2/PPP2PPP/RNBQKB1R w KQkq - +Alekhine's defense: modern, Larsen variation +rnbqkb1r/ppp1pppp/8/8/1nPP4/8/PP3PPP/RNBQKBNR w KQkq - +Scandinavian: Kiel variation +rnbqkb1r/ppp2Npp/3p1n2/8/4P3/8/PPPP1PPP/RNBQKB1R b KQkq - +Petrov: Cochrane gambit +rnbqkb1r/ppp2p1p/5n2/3p4/4PpNP/8/PPPP2P1/RNBQKB1R w KQkq - +KGA: Kieseritsky, Berlin defense, Rivi\`ere variation +rnbqkb1r/ppp2p1p/5n2/3pN3/3PPBpP/8/PPP3P1/RN1QKB1R b KQkq - +KGA: Kieseritsky, Brentano defense +rnbqkb1r/ppp2p1p/8/3pN3/3PnBpP/8/PPPN2P1/R2QKB1R b KQkq - +KGA: Kieseritsky, Brentano defense, Caro variation +rnbqkb1r/ppp2pp1/4pn1p/3p2B1/2PP4/5N2/PP2PPPP/RN1QKB1R w KQkq - +QGD: Capablanca-Duras variation +rnbqkb1r/ppp2pp1/5n1p/3p2B1/3Np3/3P4/PPP1PPPP/RN1QKB1R w KQkq - +Alekhine's defense: modern, Panov variation * +rnbqkb1r/ppp2ppp/1n6/1B2p3/8/2N5/PPPP1PPP/R1BQK1NR b KQkq - +Scotch: Romanishin variation * +rnbqkb1r/ppp2ppp/1n6/4p3/2B5/2N5/PPPP1PPP/R1BQK1NR w KQkq - +Scotch: Potter variation * +rnbqkb1r/ppp2ppp/3p1n2/4N3/8/3P4/PPP2PPP/RNBQKB1R w KQkq - +Petrov: French attack * +rnbqkb1r/ppp2ppp/3p1n2/4P3/4P3/5N2/PPP2PPP/RNBQKB1R b KQkq - +Philidor: Nimzovich variation +rnbqkb1r/ppp2ppp/3p1n2/4p1N1/3PP3/8/PPP2PPP/RNBQKB1R b KQkq - +Philidor: Nimzovich, Locock variation +rnbqkb1r/ppp2ppp/3p1n2/4p3/2BPP3/5N2/PPP2PPP/RNBQK2R b KQkq - +Philidor: Nimzovich, Klein variation +rnbqkb1r/ppp2ppp/3p1n2/4p3/2PP4/2N2N2/PP2PPPP/R1BQKB1R b KQkq - +Old Indian: Ukrainian variation, 4.Nf3 +rnbqkb1r/ppp2ppp/3p1n2/4p3/2PP4/2N5/PP2PPPP/R1BQKBNR w KQkq - +Old Indian: Ukrainian variation +rnbqkb1r/ppp2ppp/3p1n2/4p3/3PP3/5N2/PPP2PPP/RNBQKB1R w KQkq - +Philidor: Nimzovich (Jaenisch) variation +rnbqkb1r/ppp2ppp/3p1n2/4p3/5P2/5N2/PPPPP1PP/RNBQKB1R w KQkq - +R\'eti: Lisitsin gambit deferred * +rnbqkb1r/ppp2ppp/3p1n2/8/2N1P3/8/PPPP1PPP/RNBQKB1R b KQkq - +Petrov: Paulsen attack +rnbqkb1r/ppp2ppp/3p1n2/8/3NP3/8/PPP2PPP/RNBQKB1R w KQkq - +Philidor: exchange variation +rnbqkb1r/ppp2ppp/3p1n2/8/3P4/5N2/PPP2PPP/RNBQKB1R w KQkq - +Petrov: classical attack, close variation +rnbqkb1r/ppp2ppp/3p4/3QP3/4n3/5N2/PPP2PPP/RNB1KB1R b KQkq - +Philidor: Nimzovich, Rellstab variation +rnbqkb1r/ppp2ppp/3p4/4P3/2P1P1n1/8/PP3PPP/RNBQKBNR w KQkq - +Budapest: Alekhine variation, Balogh gambit +rnbqkb1r/ppp2ppp/3p4/4P3/4n3/5N2/PPPN1PPP/R1BQKB1R b KQkq - +Philidor: Nimzovich, Sokolsky variation +rnbqkb1r/ppp2ppp/3p4/8/2P1n3/5N2/PP1P1PPP/RNBQKB1R b KQkq - +Petrov: Kaufmann attack +rnbqkb1r/ppp2ppp/3p4/8/3Pn3/5N2/PPP2PPP/RNBQKB1R b KQkq - +Petrov: classical attack +rnbqkb1r/ppp2ppp/3p4/8/4n3/2N2N2/PPPP1PPP/R1BQKB1R b KQkq - +Petrov: Nimzovich attack +rnbqkb1r/ppp2ppp/3p4/8/4n3/3P1N2/PPP2PPP/RNBQKB1R b KQkq - +Petrov: French attack +rnbqkb1r/ppp2ppp/3p4/8/4n3/5N2/PPPPQPPP/RNB1KB1R b KQkq - +Petrov: Cozio (Lasker) attack +rnbqkb1r/ppp2ppp/3pp3/2PnP3/2B5/2N5/PP1P1PPP/R1BQK1NR w KQkq - +Alekhine's defense: two pawns' attack, Mikenas variation +rnbqkb1r/ppp2ppp/4n3/3pP3/8/3P1Q2/PPP3PP/RNB1KBNR w KQkq - +Latvian: Nimzovich variation * +rnbqkb1r/ppp2ppp/4pn2/3P4/2P5/8/PP1P1PPP/RNBQKBNR w KQkq - +Scandinavian: Icelandic gambit +rnbqkb1r/ppp2ppp/4pn2/3P4/3P4/2N5/PP2PPPP/R1BQKBNR b KQkq - +QGD: exchange variation +rnbqkb1r/ppp2ppp/4pn2/3p2B1/2PP4/2N5/PP2PPPP/R2QKBNR b KQkq - +QGD: 4.Bg5 +rnbqkb1r/ppp2ppp/4pn2/3p2B1/2PP4/5N2/PP2PPPP/RN1QKB1R b KQkq - +QGD +rnbqkb1r/ppp2ppp/4pn2/3p4/2P5/5NP1/PP1PPP1P/RNBQKB1R w KQkq - +English: Neo-Catalan +rnbqkb1r/ppp2ppp/4pn2/3p4/2PP1B2/2N5/PP2PPPP/R2QKBNR b KQkq - +QGD: Harrwitz attack +rnbqkb1r/ppp2ppp/4pn2/3p4/2PP4/2N2N2/PP2PPPP/R1BQKB1R b KQkq - +QGD: 4.Nf3 +rnbqkb1r/ppp2ppp/4pn2/3p4/2PP4/2N5/PP2PPPP/R1BQKBNR w KQkq - +QGD: 3...Nf6 +rnbqkb1r/ppp2ppp/4pn2/3p4/2PP4/6P1/PP2PPBP/RNBQK1NR b KQkq - +Catalan: closed +rnbqkb1r/ppp2ppp/4pn2/3p4/3P4/3BPN2/PPP2PPP/RNBQK2R b KQkq - +Queen's pawn game +rnbqkb1r/ppp2ppp/4pn2/3p4/3P4/4PN2/PPP2PPP/RNBQKB1R b KQkq - +Queen's pawn game * +rnbqkb1r/ppp2ppp/4pn2/3p4/3P4/4PN2/PPP2PPP/RNBQKB1R w KQkq - +Queen's pawn game +rnbqkb1r/ppp2ppp/4pn2/3p4/3P4/5N2/PPP1PPPP/RNBQKB1R w KQkq - +Queen's pawn game * +rnbqkb1r/ppp2ppp/4pn2/3p4/3PP3/2N1B3/PPP2PPP/R2QKBNR b KQkq - +French: Henneberger variation +rnbqkb1r/ppp2ppp/4pn2/3p4/3PP3/2N5/PPP2PPP/R1BQKBNR w KQkq - +French defense +rnbqkb1r/ppp2ppp/4pn2/3p4/3PP3/2NB4/PPP2PPP/R1BQK1NR b KQkq - +French: Swiss variation +rnbqkb1r/ppp2ppp/4pn2/3p4/3PP3/8/PPPN1PPP/R1BQKBNR w KQkq - +French: Tarrasch, closed variation +rnbqkb1r/ppp2ppp/4pn2/3p4/8/4PN2/PPPP1PPP/RNBQKB1R w KQkq - +Queen's pawn: Yusupov-Rubinstein system * +rnbqkb1r/ppp2ppp/4pn2/3pP3/2P5/2N5/PP1P1PPP/R1BQKBNR b KQkq - +English: Mikenas-Carls, Flohr variation +rnbqkb1r/ppp2ppp/4pn2/3pP3/3P4/2N5/PPP2PPP/R1BQKBNR b KQkq - +French: Steinitz variation +rnbqkb1r/ppp2ppp/4pn2/6B1/3Pp3/2N5/PPP2PPP/R2QKBNR w KQkq - +French: Burn variation +rnbqkb1r/ppp2ppp/4pn2/8/2p5/5NP1/PP1PPPBP/RNBQK2R w KQkq - +English: Neo-Catalan accepted +rnbqkb1r/ppp2ppp/4pn2/8/2pP4/4PN2/PP3PPP/RNBQKB1R w KQkq - +QGA: 4...e6 +rnbqkb1r/ppp2ppp/4pn2/8/2pP4/5NP1/PP2PPBP/RNBQK2R b KQkq - +Catalan: open, 5.Nf3 +rnbqkb1r/ppp2ppp/4pn2/8/3P4/2N2N2/PPP3PP/R1BQKB1R w KQkq - +Blackmar-Diemer: Euwe defense +rnbqkb1r/ppp2ppp/4pn2/8/Q1pP4/6P1/PP2PPBP/RNB1K1NR b KQkq - +Catalan: open, 5.Qa4 +rnbqkb1r/ppp2ppp/5n2/3B4/4Pp2/8/PPPP2PP/RNBQK1NR w KQkq - +KGA: bishop's gambit, Morphy variation +rnbqkb1r/ppp2ppp/5n2/3Np3/4P3/8/PPPP1PPP/R1BQKBNR b KQkq - +Scotch: Lolli variation * +rnbqkb1r/ppp2ppp/5n2/3P4/4PP2/8/PPP3PP/RNBQKBNR b KQkq - +KGD: Falkbeer, 5.de +rnbqkb1r/ppp2ppp/5n2/3P4/4pP2/2N5/PPPPQ1PP/R1B1KBNR b KQkq - +KGD: Falkbeer, Rubinstein variation +rnbqkb1r/ppp2ppp/5n2/3P4/4pP2/3P4/PPP1Q1PP/RNB1KBNR b KQkq - +KGD: Falkbeer, R\'eti variation +rnbqkb1r/ppp2ppp/5n2/3P4/4pP2/3P4/PPPN2PP/R1BQKBNR b KQkq - +KGD: Falkbeer, Keres variation +rnbqkb1r/ppp2ppp/5n2/3P4/5p2/5N2/PPPP2PP/RNBQKB1R w KQkq - +KGA: Abbazia defense, modern variation +rnbqkb1r/ppp2ppp/5n2/3Pp3/8/3P4/PP2PPPP/RNBQKBNR b KQkq - +Sicilian * +rnbqkb1r/ppp2ppp/5n2/3Pp3/8/3P4/PPP2PPP/RNBQKBNR b KQkq - +Philidor: exchange variation * +rnbqkb1r/ppp2ppp/5n2/3Pp3/8/4P3/PP1P1PPP/RNBQKBNR b KQkq - +Sicilian defense * +rnbqkb1r/ppp2ppp/5n2/3p2B1/3Np3/3P4/PPP1PPPP/RN1QKB1R b KQkq - +Alekhine's defense: modern variation, 4...Bg4 * +rnbqkb1r/ppp2ppp/5n2/3p2B1/3P4/2N5/PP2PPPP/R2QKBNR b KQkq - +QGD: exchange, positional line +rnbqkb1r/ppp2ppp/5n2/3p2B1/3P4/2N5/PPP2PPP/R2QKBNR b KQkq - +French: exchange, Svenonius variation +rnbqkb1r/ppp2ppp/5n2/3p4/2PPp3/4P3/PP3PPP/RNBQKBNR w KQkq - +French: advance, Nimzovich system * +rnbqkb1r/ppp2ppp/5n2/3p4/3NP3/8/PPP1PPPP/RNBQKB1R b KQkq - +Alekhine's defense: modern, Larsen variation * +rnbqkb1r/ppp2ppp/5n2/3p4/3Np3/3P2P1/PPP1PP1P/RNBQKB1R b KQkq - +Alekhine's defense: modern, fianchetto variation * +rnbqkb1r/ppp2ppp/5n2/3p4/3Np3/3P4/PPP1PPPP/RNBQKB1R w KQkq - +Alekhine's defense: modern variation * +rnbqkb1r/ppp2ppp/5n2/3p4/4p3/1N1P4/PPP1PPPP/RNBQKB1R b KQkq - +Alekhine's defense: modern, Schmid variation * +rnbqkb1r/ppp2ppp/5n2/3p4/8/3P1N2/PPP2PPP/RNBQKB1R b KQkq - +Petrov: classical attack, close variation * +rnbqkb1r/ppp2ppp/5n2/3pN3/4P3/8/PPPP1PPP/RNBQKB1R b KQkq - +Petrov: modern attack, Symmetrical variation * +rnbqkb1r/ppp2ppp/5n2/3pN3/8/3P4/PPP2PPP/RNBQKB1R w KQkq - +Petrov: classical attack * +rnbqkb1r/ppp2ppp/5n2/3pp3/2P5/2N3P1/PP1PPP1P/R1BQKBNR w KQkq - +English: Bremen, reverse dragon +rnbqkb1r/ppp2ppp/5n2/3pp3/2P5/2N5/PP1PPPPP/R1BQKBNR w KQkq - +Sicilian defense * +rnbqkb1r/ppp2ppp/5n2/3pp3/2P5/3P1N2/PP2PPPP/RNBQKB1R b KQkq - +Sicilian: Cortlever (Alatortsev) variation * +rnbqkb1r/ppp2ppp/5n2/3pp3/2PP4/4P3/PP3PPP/RNBQKBNR b KQkq - +Sicilian: Marshall variation * +rnbqkb1r/ppp2ppp/5n2/3pp3/3PP3/2N5/PPP2PPP/R1BQKBNR w KQkq - +Blackmar-Diemer: Lemberg counter-gambit +rnbqkb1r/ppp2ppp/5n2/3pp3/4P3/2N5/PPPP1PPP/R1BQKBNR w KQkq - +Scotch opening * +rnbqkb1r/ppp2ppp/5n2/3pp3/4P3/3P1N2/PPP2PPP/RNBQKB1R b KQkq - +Philidor: Nimzovich (Jaenisch) variation * +rnbqkb1r/ppp2ppp/5n2/3pp3/4P3/3P4/PPP2PPP/RNBQKBNR w KQkq - +Philidor's defense * +rnbqkb1r/ppp2ppp/5n2/3pp3/4P3/3P4/PPPN1PPP/R1BQKBNR b KQkq - +Philidor: Hanham variation * +rnbqkb1r/ppp2ppp/5n2/3pp3/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - +Petrov: modern (Steinitz) attack * +rnbqkb1r/ppp2ppp/5n2/3pp3/4PP2/2N5/PPPP2PP/R1BQKBNR w KQkq - +Vienna gambit +rnbqkb1r/ppp2ppp/5n2/3pp3/4PP2/2NP4/PPP3PP/R1BQKBNR b KQkq - +Vienna gambit, Steinitz variation +rnbqkb1r/ppp2ppp/5n2/3pp3/4PP2/3P4/PPP3PP/RNBQKBNR b KQkq - +Philidor: Philidor counter-gambit * +rnbqkb1r/ppp2ppp/5n2/4p2Q/8/2N5/PPPP1PPP/R1B1KBNR w KQkq - +Scotch: Fraser attack * +rnbqkb1r/ppp2ppp/5n2/4p3/4p3/3P1N2/PPP2PPP/RNBQKB1R w KQkq - +Philidor: Nimzovich variation * +rnbqkb1r/ppp2ppp/8/3P4/4nP2/8/PPP1Q1PP/RNB1KBNR b KQkq - +KGD: Falkbeer, Charousek gambit +rnbqkb1r/ppp2ppp/8/3n4/3p4/8/PPP2PPP/RNBQKBNR w KQkq - +Philidor: Paulsen attack * +rnbqkb1r/ppp2ppp/8/3np2Q/8/2N5/PPPP1PPP/R1B1KBNR b KQkq - +Scotch: Pulling counter-attack * +rnbqkb1r/ppp2ppp/8/3np3/2B5/2N5/PPPP1PPP/R1BQK1NR b KQkq - +Scotch game * +rnbqkb1r/ppp2ppp/8/3np3/3P4/2N5/PP2PPPP/R1BQKBNR b KQkq - +Sicilian: Nimzovich variation * +rnbqkb1r/ppp2ppp/8/3np3/4P3/2N5/PP1P1PPP/R1BQKBNR b KQkq - +Sicilian: Labourdonnais-L\"owenthal variation * +rnbqkb1r/ppp2ppp/8/3np3/8/2N1P3/PP1P1PPP/R1BQKBNR b KQkq - +Sicilian defense * +rnbqkb1r/ppp2ppp/8/3np3/8/2N2N2/PP1PPPPP/R1BQKB1R b KQkq - +Sicilian defense * +rnbqkb1r/ppp2ppp/8/3np3/8/2N2N2/PPPP1PPP/R1BQKB1R b KQkq - +Scotch: Schmidt variation * +rnbqkb1r/ppp2ppp/8/3np3/8/2N5/PPPP1PPP/R1BQKBNR w KQkq - +Scotch game * +rnbqkb1r/ppp2ppp/8/3np3/8/2N5/PPQPPPPP/R1B1KBNR b KQkq - +Sicilian: Flohr variation * +rnbqkb1r/ppp2ppp/8/3np3/8/3P1N2/PPP2PPP/RNBQKB1R b KQkq - +Philidor: exchange variation * +rnbqkb1r/ppp2ppp/8/3np3/8/3P2P1/PPP2P1P/RNBQKBNR b KQkq - +Philidor: Larsen variation * +rnbqkb1r/ppp2ppp/8/3np3/8/3P4/PP2PPPP/RNBQKBNR w KQkq - +Sicilian * +rnbqkb1r/ppp2ppp/8/3np3/8/3P4/PPP2PPP/RNBQKBNR w KQkq - +Philidor: exchange variation * +rnbqkb1r/ppp2ppp/8/3np3/8/4PN2/PP1P1PPP/RNBQKB1R b KQkq - +Sicilian: Anderssen variation * +rnbqkb1r/ppp2ppp/8/3np3/8/P3P3/1P1P1PPP/RNBQKBNR b KQkq - +Sicilian: Kan variation * +rnbqkb1r/ppp2ppp/8/3pP3/4n3/2N2Q2/PPPP2PP/R1B1KBNR b KQkq - +Vienna gambit: Paulsen attack +rnbqkb1r/ppp2ppp/8/3pP3/4n3/2NP4/PPP3PP/R1BQKBNR b KQkq - +Vienna gambit +rnbqkb1r/ppp2ppp/8/3pp3/2B1n3/2N2N2/PPPP1PPP/R1BQK2R w KQkq - +Boden-Kieseritsky gambit: Lichtenhein defense +rnbqkb1r/ppp2ppp/8/3pp3/4N3/8/PPPP1PPP/R1BQKBNR w KQkq - +Irish (Chicago) gambit * +rnbqkb1r/ppp2ppp/8/3pp3/4P1n1/3P1N2/PPP2PPP/RNBQKB1R w KQkq - +Philidor: Nimzovich, Locock variation * +rnbqkb1r/ppp2ppp/8/4P3/3P2n1/4p3/PPP3PP/RNBQKBNR w KQkq - +Philidor: Philidor counter-gambit, del Rio attack * +rnbqkb1r/ppp2ppp/8/4p2Q/1n6/2N5/PPPP1PPP/R1B1KBNR w KQkq - +Scotch: Horwitz attack * +rnbqkb1r/ppp2ppp/8/4p3/1n2P3/2NP4/PP3PPP/R1BQKBNR b KQkq - +Sicilian: Labourdonnais-L\"owenthal (Kalashnikov) variation * +rnbqkb1r/ppp2ppp/8/4p3/1n6/2N1P3/PP1P1PPP/R1BQKBNR w KQkq - +Sicilian, Sz\'en (`anti-Taimanov') variation * +rnbqkb1r/ppp2ppp/8/4p3/8/2n3P1/PP1PPP1P/R1BQKBNR w KQkq - +Sicilian: accelerated fianchetto, exchange variation * +rnbqkb1r/ppp2ppp/8/8/4p3/2P2N2/P1PP1PPP/R1BQKB1R w KQkq - +Scotch: Mieses variation * +rnbqkb1r/ppp3p1/8/3ppPPp/8/7P/PPPP1K2/RNBQ1BNR w kq - +KGA: Allgaier, Thorold variation * +rnbqkb1r/ppp3pN/3p3n/5p2/2BpP3/8/PPP2PPP/RNBQK2R b KQkq - +Philidor: L\'opez counter-gambit, Jaenisch variation +rnbqkb1r/ppp3pp/5n2/3ppP2/6P1/8/PPPP1P1P/RNBQKBNR w KQkq - +KGA: Rosentreter gambit * +rnbqkb1r/ppp3pp/5p2/3np3/8/3P1N2/PP2PPPP/RNBQKB1R w KQkq - +Sicilian: Prins (Moscow) variation * +rnbqkb1r/ppp3pp/8/3pPp2/3Pn3/2N2Q2/PPP3PP/R1B1KBNR b KQkq - +Vienna gambit: Heyde variation +rnbqkb1r/ppp3pp/8/3pPp2/4n3/2N2Q2/PPPP2PP/R1B1KBNR w KQkq f6 +Vienna gambit: Bardeleben variation +rnbqkb1r/ppp3pp/8/3ppPP1/4n3/8/PPPP1P1P/RNBQKBNR w KQkq - +KGA: S\o rensen gambit * +rnbqkb1r/pppn1ppp/4p3/3pP3/3P2Q1/2N5/PPP2PPP/R1B1KBNR b KQkq - +French: Steinitz, Gledhill attack +rnbqkb1r/pppnpppp/4P3/3p4/8/2N5/PPPP1PPP/R1BQKBNR b KQkq - +Alekhine's defense: Spielmann variation +rnbqkb1r/pppp1p1p/5n2/4N3/2B1PppP/8/PPPP2P1/RNBQK2R b KQkq - +KGA: Kieseritsky, Berlin defense, 6.Bc4 +rnbqkb1r/pppp1p1p/5n2/4N3/4PppP/8/PPPP2P1/RNBQKB1R w KQkq - +KGA: Kieseritsky, Berlin defense +rnbqkb1r/pppp1p1p/5n2/6N1/4PppP/8/PPPP2P1/RNBQKB1R w KQkq - +KGA: Allgaier, Schlechter defense +rnbqkb1r/pppp1p1p/5np1/4p3/2P5/2N3P1/PP1PPP1P/R1BQKBNR w KQkq - +English: Bremen system with ...g6 +rnbqkb1r/pppp1p1p/5np1/4p3/4P3/2N5/PPPP1PPP/R1BQKBNR w KQkq - +Konstantinopolsky opening * +rnbqkb1r/pppp1ppp/2n5/8/2P1PP2/8/PP4PP/RNBQKBNR w KQkq - +Budapest: Alekhine, Abonyi variation +rnbqkb1r/pppp1ppp/4p3/8/2PPn3/5N2/PP2PPPP/RNBQKB1R w KQkq - +D\"ory defense +rnbqkb1r/pppp1ppp/4pn2/6B1/2PP4/8/PP2PPPP/RN1QKBNR b KQkq - +Neo-Indian (Seirawan) attack +rnbqkb1r/pppp1ppp/4pn2/6B1/3P4/5N2/PPP1PPPP/RN1QKB1R b KQkq - +Queen's pawn: Torre attack +rnbqkb1r/pppp1ppp/4pn2/8/2P1P3/2N5/PP1P1PPP/R1BQKBNR b KQkq - +English: Mikenas-Carls variation +rnbqkb1r/pppp1ppp/4pn2/8/2P5/2N5/PP1PPPPP/R1BQKBNR w KQkq - +English opening +rnbqkb1r/pppp1ppp/4pn2/8/2PP4/5N2/PP2PPPP/RNBQKB1R b KQkq - +Queen's pawn game +rnbqkb1r/pppp1ppp/4pn2/8/2PP4/6P1/PP2PP1P/RNBQKBNR b KQkq - +Catalan opening +rnbqkb1r/pppp1ppp/4pn2/8/2PP4/8/PP2PPPP/RNBQKBNR w KQkq - +Queen's pawn game +rnbqkb1r/pppp1ppp/4pn2/8/3P4/4PN2/PPP2PPP/RNBQKB1R b KQkq - +Queen's pawn: Yusupov-Rubinstein system +rnbqkb1r/pppp1ppp/5n2/4p1B1/8/3P4/PPP1PPPP/RN1QKBNR b KQkq - +R\'eti: Wade defense * +rnbqkb1r/pppp1ppp/5n2/4p3/2B1P3/2N5/PPPP1PPP/R1BQK1NR b KQkq - +Vienna game +rnbqkb1r/pppp1ppp/5n2/4p3/2B1P3/5N2/PPPP1PPP/RNBQK2R b KQkq - +Petrov: Italian variation +rnbqkb1r/pppp1ppp/5n2/4p3/2B1P3/8/PPPP1PPP/RNBQK1NR w KQkq - +Bishop's opening: Berlin defense +rnbqkb1r/pppp1ppp/5n2/4p3/2B1PP2/8/PPPP2PP/RNBQK1NR b KQkq - +Bishop's opening: Greco gambit +rnbqkb1r/pppp1ppp/5n2/4p3/2BPP3/8/PPP2PPP/RNBQK1NR b KQkq - +Bishop's opening: Ponziani gambit +rnbqkb1r/pppp1ppp/5n2/4p3/2P5/1P6/P2PPPPP/RNBQKBNR b KQkq - +Sicilian: Katalimov variation * +rnbqkb1r/pppp1ppp/5n2/4p3/2P5/2N3P1/PP1PPP1P/R1BQKBNR b KQkq - +English: Carls' Bremen system +rnbqkb1r/pppp1ppp/5n2/4p3/2P5/2N5/PP1PPPPP/R1BQKBNR b KQkq - +Sicilian defense * +rnbqkb1r/pppp1ppp/5n2/4p3/2P5/2N5/PP1PPPPP/R1BQKBNR w KQkq - +English opening +rnbqkb1r/pppp1ppp/5n2/4p3/2P5/3P4/PP2PPPP/RNBQKBNR b KQkq - +Sicilian * +rnbqkb1r/pppp1ppp/5n2/4p3/2P5/4P3/PP1P1PPP/RNBQKBNR b KQkq - +Sicilian defense * +rnbqkb1r/pppp1ppp/5n2/4p3/2P5/5N2/PP1PPPPP/RNBQKB1R b KQkq - +Sicilian: Nimzovich-Rubinstein variation * +rnbqkb1r/pppp1ppp/5n2/4p3/2P5/6P1/PP1PPP1P/RNBQKBNR b KQkq - +Sicilian: Hungarian variation * +rnbqkb1r/pppp1ppp/5n2/4p3/2P5/8/PP1PPPPP/RNBQKBNR w KQkq - +Sicilian defense * +rnbqkb1r/pppp1ppp/5n2/4p3/2P5/8/PPQPPPPP/RNB1KBNR b KQkq - +Sicilian: Quinteros variation * +rnbqkb1r/pppp1ppp/5n2/4p3/2P5/P7/1P1PPPPP/RNBQKBNR b KQkq - +Sicilian: O'Kelly variation * +rnbqkb1r/pppp1ppp/5n2/4p3/2PP4/8/PP2PPPP/RNBQKBNR w KQkq - +Budapest defense declined +rnbqkb1r/pppp1ppp/5n2/4p3/3P4/8/PPP1PPPP/RNBQKBNR w KQkq - +Tennison (Lemberg, Zukertort) gambit * +rnbqkb1r/pppp1ppp/5n2/4p3/3PP3/5N2/PPP2PPP/RNBQKB1R b KQkq - +Petrov: modern (Steinitz) attack +rnbqkb1r/pppp1ppp/5n2/4p3/3PP3/8/PPP2PPP/RNBQKBNR b KQkq - +QP counter-gambit (elephant gambit) * +rnbqkb1r/pppp1ppp/5n2/4p3/4P3/2N2N2/PPPP1PPP/R1BQKB1R b KQkq - +Petrov three knights game +rnbqkb1r/pppp1ppp/5n2/4p3/4P3/2N3P1/PPPP1P1P/R1BQKBNR b KQkq - +Vienna: Paulsen-Mieses variation +rnbqkb1r/pppp1ppp/5n2/4p3/4P3/2N5/PPPP1PPP/R1BQKBNR b KQkq - +King's pawn game * +rnbqkb1r/pppp1ppp/5n2/4p3/4P3/2N5/PPPP1PPP/R1BQKBNR w KQkq - +Vienna: Falkbeer variation +rnbqkb1r/pppp1ppp/5n2/4p3/4P3/3P4/PPP2PPP/RNBQKBNR b KQkq - +Philidor's defense * +rnbqkb1r/pppp1ppp/5n2/4p3/4P3/5N2/PPPP1PPP/RNBQKB1R b KQkq - +Petrov's defense * +rnbqkb1r/pppp1ppp/5n2/4p3/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - +Petrov's defense +rnbqkb1r/pppp1ppp/5n2/4p3/4P3/5P2/PPPP2PP/RNBQKBNR b KQkq - +Damiano's defense * +rnbqkb1r/pppp1ppp/5n2/4p3/4P3/5Q2/PPPP1PPP/RNB1KBNR b KQkq - +Greco defense * +rnbqkb1r/pppp1ppp/5n2/4p3/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +King's knight opening * +rnbqkb1r/pppp1ppp/5n2/4p3/4P3/8/PPPPQPPP/RNB1KBNR b KQkq - +Gunderam defense * +rnbqkb1r/pppp1ppp/5n2/4p3/4P3/P1N5/1PPP1PPP/R1BQKBNR b KQkq - +Vienna: Mengarini variation +rnbqkb1r/pppp1ppp/5n2/4p3/4PP2/2N5/PPPP2PP/R1BQKBNR b KQkq - +Vienna gambit +rnbqkb1r/pppp1ppp/5n2/4p3/4PP2/8/PPPP2PP/RNBQKBNR b KQkq - +Latvian counter-gambit * +rnbqkb1r/pppp1ppp/5n2/4p3/4PP2/8/PPPP2PP/RNBQKBNR w KQkq - +KGD: 2...Nf6 +rnbqkb1r/pppp1ppp/5n2/4p3/5P2/2N5/PPPPP1PP/R1BQKBNR b KQkq - +KP: Colorado counter * +rnbqkb1r/pppp1ppp/5n2/4p3/5P2/8/PPPPP1PP/RNBQKBNR w KQkq - +R\'eti: Pirc-Lisitsin gambit * +rnbqkb1r/pppp1ppp/5n2/4p3/8/2N5/PPPPPPPP/R1BQKBNR w KQkq - +KP: Nimzovich defense * +rnbqkb1r/pppp1ppp/5n2/4p3/8/4P3/PPPP1PPP/RNBQKBNR w KQkq - +French defense * +rnbqkb1r/pppp1ppp/5n2/4p3/Q1P5/8/PP1PPPPP/RNB1KBNR b KQkq - +Sicilian: Stiletto (Althouse) variation * +rnbqkb1r/pppp1ppp/5n2/8/2B1Pp2/2N5/PPPP2PP/R1BQK1NR b KQkq - +KGA: bishop's gambit, Bogolyubov variation +rnbqkb1r/pppp1ppp/5n2/8/2B1Pp2/8/PPPP2PP/RNBQK1NR w KQkq - +KGA: bishop's gambit, Cozio (Morphy) defense +rnbqkb1r/pppp1ppp/5n2/8/2BpP3/5N2/PPP2PPP/RNBQK2R b KQkq - +Bishop's opening/Petrov: Urusov gambit +rnbqkb1r/pppp1ppp/5n2/8/3pP3/3B4/PPP2PPP/RNBQK1NR b KQkq - +QP counter-gambit: Maroczy gambit * +rnbqkb1r/pppp1ppp/5n2/8/4Pp2/5N2/PPPP2PP/RNBQKB1R w KQkq - +KGA: Schallop defense +rnbqkb1r/pppp1ppp/8/2n1p3/8/3P1N2/PPP2PPP/RNBQKB1R w KQkq - +Petrov: Paulsen attack * +rnbqkb1r/pppp1ppp/8/4N3/4n3/8/PPPP1PPP/RNBQKB1R b KQkq - +Petrov: Damiano variation * +rnbqkb1r/pppp1ppp/8/4N3/4n3/8/PPPP1PPP/RNBQKB1R w KQkq - +Petrov: Damiano variation +rnbqkb1r/pppp1ppp/8/4P3/2P1P1n1/8/PP3PPP/RNBQKBNR b KQkq - +Budapest: Alekhine variation +rnbqkb1r/pppp1ppp/8/4P3/2P1n3/8/PP2PPPP/RNBQKBNR w KQkq - +Budapest: Fajarowicz variation +rnbqkb1r/pppp1ppp/8/4P3/2P1n3/8/PPQ1PPPP/RNB1KBNR b KQkq - +Budapest: Fajarowicz, Steiner variation +rnbqkb1r/pppp1ppp/8/4P3/2P2Bn1/8/PP2PPPP/RN1QKBNR b KQkq - +Budapest: Rubinstein variation +rnbqkb1r/pppp1ppp/8/4P3/2P3n1/5N2/PP2PPPP/RNBQKB1R b KQkq - +Budapest: Adler variation +rnbqkb1r/pppp1ppp/8/4P3/2P3n1/8/PP2PPPP/RNBQKBNR w KQkq - +Budapest defense +rnbqkb1r/pppp1ppp/8/4P3/3Qn3/5N2/PPP2PPP/RNB1KB1R b KQkq - +Petrov: modern attack, main line +rnbqkb1r/pppp1ppp/8/4P3/3pn3/5N2/PPP1QPPP/RNB1KB1R b KQkq - +Petrov: modern attack, Steinitz variation +rnbqkb1r/pppp1ppp/8/4p3/2B1n3/2N2N2/PPPP1PPP/R1BQK2R b KQkq - +Boden-Kieseritsky gambit +rnbqkb1r/pppp1ppp/8/4p3/2B1n3/2N5/PPPP1PPP/R1BQK1NR w KQkq - +Vienna game +rnbqkb1r/pppp1ppp/8/4p3/3Pn3/5N2/PPP2PPP/RNBQKB1R w KQkq - +Petrov: modern attack, Symmetrical variation +rnbqkb1r/pppp1ppp/8/4p3/4nP2/2N5/PPPP2PP/R1BQKBNR b KQkq - +Latvian: Fraser defense * +rnbqkb1r/pppp1ppp/8/4p3/8/3P1N2/PPP2nPP/RNBQKB1R w KQkq - +Petrov: Cochrane gambit * +rnbqkb1r/pppp2p1/5n2/4pP1p/6P1/8/PPPP1P1P/RNBQKBNR w KQkq - +King's knight's gambit * +rnbqkb1r/pppp2p1/8/4pPPp/3Pn3/8/PPP2P1P/RNBQKBNR b KQkq - +KGA: Kieseritsky, Brentano (Campbell) defense * +rnbqkb1r/pppp2p1/8/4pPPp/4n2P/8/PPPP1P2/RNBQKBNR b KQkq - +KGA: Kieseritsky, long whip (Stockwhip, classical) defense * +rnbqkb1r/pppp2p1/8/4pPPp/4n3/2N5/PPPP1P1P/R1BQKBNR b KQkq - +KGA: Kieseritsky, Neumann defense * +rnbqkb1r/pppp2p1/8/4pPPp/4n3/3P4/PPP2P1P/RNBQKBNR b KQkq - +KGA: Kieseritsky, Kolisch defense * +rnbqkb1r/pppp2p1/8/4pPPp/4n3/5N2/PPPP1P1P/RNBQKB1R b KQkq - +KGA: Kieseritsky, Berlin defense * +rnbqkb1r/pppp2p1/8/4pPPp/4n3/8/PPPP1PBP/RNBQK1NR b KQkq - +KGA: Kieseritsky, Paulsen defense * +rnbqkb1r/pppp2p1/8/4pPPp/4n3/8/PPPPBP1P/RNBQK1NR b KQkq - +KGA: Kieseritsky, Polerio defense * +rnbqkb1r/pppp2p1/8/4pPPp/4n3/8/PPPPQP1P/RNB1KBNR b KQkq - +KGA: Kieseritsky, Salvio (Rosenthal) defense * +rnbqkb1r/pppp2p1/8/4pPPp/6n1/5N2/PPPP1P1P/RNBQKB1R b KQkq - +KGA: Allgaier, Schlechter defense * +rnbqkb1r/pppp2p1/8/4pPPp/6n1/8/PPPP1P1P/RNBQKBNR w KQkq - +KGA: Allgaier gambit * +rnbqkb1r/pppp2p1/8/4pPnp/3P4/5N2/PPP2P1P/RNBQKB1R b KQkq - +KGA: Kieseritsky, Berlin defense, Rivi\`ere variation * +rnbqkb1r/pppp2pp/4pn2/5p2/2PP4/5N2/PP2PPPP/RNBQKB1R b KQkq - +Bird's opening: Lasker variation * +rnbqkb1r/pppp2pp/4pn2/5p2/2PP4/6P1/PP2PPBP/RNBQK1NR b KQkq - +Dutch defense +rnbqkb1r/pppp2pp/4pn2/5p2/3P4/6PN/PPP1PPBP/RNBQK2R b KQkq - +Dutch defense, Blackburne variation +rnbqkb1r/pppp2pp/5n2/4N3/2B1p3/8/PPPP1PPP/RNBQK2R w KQkq - +Latvian: corkscrew counter-gambit +rnbqkb1r/pppp2pp/5n2/4p3/2B1p3/3P4/PPP2PPP/RNBQK1NR w KQkq - +KGD: classical, Soldatenkov variation * +rnbqkb1r/pppp2pp/5n2/4pP2/3P4/8/PPP2PPP/RNBQKBNR b KQkq - +KGA: Abbazia defense (classical defense, modern defense[!]) * +rnbqkb1r/pppp2pp/5n2/4pP2/5P2/8/PPPP2PP/RNBQKBNR b KQkq - +KGA: Gianutio counter-gambit * +rnbqkb1r/pppp2pp/5n2/4pP2/8/3P4/PPP2PPP/RNBQKBNR b KQkq - +KGA: Fischer defense * +rnbqkb1r/pppp2pp/5n2/4pP2/8/5N2/PPPP1PPP/RNBQKB1R b KQkq - +KGA: Schallop defense * +rnbqkb1r/pppp2pp/5n2/4pP2/8/7P/PPPP1PP1/RNBQKBNR b KQkq - +KGA: Becker defense * +rnbqkb1r/pppp2pp/5n2/4pP2/8/8/PPPP1PPP/RNBQKBNR w KQkq - +King's knight's gambit * +rnbqkb1r/pppp2pp/5n2/4pP2/8/8/PPPPBPPP/RNBQK1NR b KQkq - +KGA: Cunningham defense * +rnbqkb1r/pppp2pp/5n2/4pP2/8/8/PPPPNPPP/RNBQKB1R b KQkq - +KGA: Bonsch-Osmolovsky variation * +rnbqkb1r/pppp2pp/5n2/4pp2/3PP3/8/PPP2PPP/RNBQKBNR w KQkq - +KGD: Falkbeer, Tartakower variation * +rnbqkb1r/pppp2pp/5n2/5P2/3p4/5N2/PPP2PPP/RNBQKB1R b KQkq - +KGA: Abbazia defense, modern variation * +rnbqkb1r/ppppnppp/8/4p3/2P5/8/PP1PPPPP/RNBQKBNR w KQkq - +Sicilian: Keres variation (2.Ne2) * +rnbqkb1r/ppppnppp/8/4p3/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +Alapin's opening * +rnbqkb1r/ppppnppp/8/8/2B1Pp2/8/PPPP2PP/RNBQK1NR w KQkq - +KGA: bishop's gambit, Steinitz defense +rnbqkb1r/ppppnppp/8/8/4Pp2/5N2/PPPP2PP/RNBQKB1R w KQkq - +KGA: Bonsch-Osmolovsky variation +rnbqkb1r/ppppp1pp/5n2/5p2/2PP4/2N5/PP2PPPP/R1BQKBNR b KQkq - +Dutch with c4 & Nc3 +rnbqkb1r/ppppp1pp/5n2/5p2/2PP4/6P1/PP2PP1P/RNBQKBNR b KQkq - +Dutch with c4 & g3 +rnbqkb1r/ppppp1pp/5n2/5p2/2PP4/8/PP2PPPP/RNBQKBNR w KQkq - +Dutch defense +rnbqkb1r/ppppp1pp/5n2/5p2/3P2P1/2N5/PPP1PP1P/R1BQKBNR b KQkq - +Dutch, Spielmann gambit +rnbqkb1r/ppppp1pp/5n2/5p2/4P3/3P1N2/PPP2PPP/RNBQKB1R b KQkq - +R\'eti: Lisitsin gambit deferred +rnbqkb1r/ppppp1pp/5n2/6B1/3Pp3/2N5/PPP2PPP/R2QKBNR b KQkq - +Dutch: Staunton gambit, Staunton's line +rnbqkb1r/ppppp1pp/5n2/8/3Pp1P1/2N5/PPP2P1P/R1BQKBNR b KQkq - +Dutch: Staunton gambit, Tartakower variation +rnbqkb1r/ppppp1pp/5n2/8/4pPP1/2N5/PPPP3P/R1BQKBNR b KQkq - +Bird's opening, Swiss gambit +rnbqkb1r/ppppp1pp/5n2/8/6P1/3B4/PPP2P1P/RNBQK1NR b KQkq - +Bird: From gambit, Lasker variation * +rnbqkb1r/ppppp2p/5np1/5p2/2PP4/6P1/PP2PP1P/RNBQKBNR w KQkq - +Dutch: Leningrad variation +rnbqkb1r/ppppp2p/5np1/5p2/3P4/6P1/PPP1PPBP/RNBQK1NR w KQkq - +Dutch defense +rnbqkb1r/ppppp2p/5np1/6B1/3Pp2P/2N5/PPP2PP1/R2QKBNR b KQkq - +Dutch: Staunton gambit, Alekhine variation +rnbqkb1r/ppppp2p/5np1/6B1/3Pp3/2N2P2/PPP3PP/R2QKBNR b KQkq - +Dutch: Staunton gambit, Lasker variation +rnbqkb1r/ppppp2p/5ppn/8/2PPP3/8/PP3PPP/RNBQKBNR w KQkq - +Hippopotamus defense +rnbqkb1r/ppppp2p/6pn/5p2/2PP4/2N5/PP2PPPP/R1BQKBNR w KQkq - +Dutch defense: Bladel variation +rnbqkb1r/pppppp1p/5np1/3P4/2P5/8/PP2PPPP/RNBQKBNR b KQkq - +King's Indian: Anti-Gr\"unfeld +rnbqkb1r/pppppp1p/5np1/6B1/3P4/5N2/PPP1PPPP/RN1QKB1R b KQkq - +King's Indian: Torre attack +rnbqkb1r/pppppp1p/5np1/8/1P6/5N2/P1PPPPPP/RNBQKB1R b KQkq - +R\'eti: King's Indian attack, Spassky's variation * +rnbqkb1r/pppppp1p/5np1/8/1P6/5NP1/P1PPPP1P/RNBQKB1R b KQkq - +R\'eti: King's Indian attack, R\'eti-Smyslov variation +rnbqkb1r/pppppp1p/5np1/8/2PP4/2N5/PP2PPPP/R1BQKBNR b KQkq - +King's Indian defense, 3.Nc3 +rnbqkb1r/pppppp1p/5np1/8/2PP4/5N2/PP2PPPP/RNBQKB1R b KQkq - +King's Indian, 3.Nf3 +rnbqkb1r/pppppp1p/5np1/8/2PP4/6P1/PP2PP1P/RNBQKBNR b KQkq - +King's Indian: 3.g3 +rnbqkb1r/pppppp1p/5np1/8/2PP4/8/PP2PPPP/RNBQKBNR b KQkq - +R\'eti: King's Indian attack (with ...c5) * +rnbqkb1r/pppppp1p/5np1/8/2PP4/8/PP2PPPP/RNBQKBNR w KQkq - +King's Indian defense +rnbqkb1r/pppppp1p/5np1/8/2PP4/8/PPQ1PPPP/RNB1KBNR b KQkq - +Queen's pawn: Mengarini attack +rnbqkb1r/pppppp1p/5np1/8/3P1B2/5N2/PPP1PPPP/RN1QKB1R b KQkq - +King's Indian: London system +rnbqkb1r/pppppp1p/5np1/8/3P4/5N2/PPP1PPPP/RNBQKB1R w KQkq - +King's Indian: East Indian defense +rnbqkb1r/pppppp1p/5np1/8/3P4/5NP1/PPP1PP1P/RNBQKB1R b KQkq - +King's Indian: fianchetto without c4 +rnbqkb1r/pppppp1p/5np1/8/3P4/6P1/PPP1PP1P/RNBQKBNR b KQkq - +R\'eti: King's Indian attack * +rnbqkb1r/pppppp1p/5np1/8/3P4/8/PPP1PPPP/RNBQKBNR w KQkq - +R\'eti: King's Indian attack (Barcza system) * +rnbqkb1r/pppppp1p/5np1/8/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +Benko's opening: reversed Alekhine * +rnbqkb1r/pppppp1p/5np1/8/8/5NP1/PPPPPP1P/RNBQKB1R b KQkq - +R\'eti: King's Indian attack * +rnbqkb1r/pppppp1p/5np1/8/8/5NP1/PPPPPP1P/RNBQKB1R w KQkq - +R\'eti: King's Indian attack +rnbqkb1r/ppppppnp/6p1/4P3/3P2P1/8/PPP2P1P/RNBQKBNR w KQkq - +Norwegian defense +rnbqkb1r/pppppppp/1n6/2P1P3/8/8/PP1P1PPP/RNBQKBNR b KQkq - +Alekhine's defense: two pawns' (Lasker's) attack +rnbqkb1r/pppppppp/1n6/4P3/2P5/1P6/P2P1PPP/RNBQKBNR b KQkq - +Alekhine's defense: Steiner variation +rnbqkb1r/pppppppp/5n2/6B1/3P4/8/PPP1PPPP/RN1QKBNR b KQkq - +Trompovsky attack (Ruth, Opo\v censk\'y opening) +rnbqkb1r/pppppppp/5n2/8/1PP5/8/P2PPPPP/RNBQKBNR b KQkq - +English orang-utan +rnbqkb1r/pppppppp/5n2/8/2B1P3/8/PPPP1PPP/RNBQK1NR b KQkq - +Alekhine's defense: Krejcik variation +rnbqkb1r/pppppppp/5n2/8/2P5/2N5/PP1PPPPP/R1BQKBNR b KQkq - +English opening +rnbqkb1r/pppppppp/5n2/8/2P5/5N2/PP1PPPPP/RNBQKB1R b KQkq - +English opening +rnbqkb1r/pppppppp/5n2/8/2P5/8/PP1PPPPP/RNBQKBNR w KQkq - +English, 1...Nf6 (Anglo-Indian defense) +rnbqkb1r/pppppppp/5n2/8/2PP4/8/PP2PPPP/RNBQKBNR b KQkq - +Queen's pawn game +rnbqkb1r/pppppppp/5n2/8/3P1B2/8/PPP1PPPP/RN1QKBNR b KQkq - +Queen's pawn: London system +rnbqkb1r/pppppppp/5n2/8/3P1P2/8/PPP1P1PP/RNBQKBNR b KQkq - +Canard opening +rnbqkb1r/pppppppp/5n2/8/3P2P1/8/PPP1PP1P/RNBQKBNR b KQkq - +Queen's pawn: Bronstein gambit +rnbqkb1r/pppppppp/5n2/8/3P4/5N2/PPP1PPPP/RNBQKB1R b KQkq - +Queen's pawn game +rnbqkb1r/pppppppp/5n2/8/3P4/5P2/PPP1P1PP/RNBQKBNR b KQkq - +Paleface attack +rnbqkb1r/pppppppp/5n2/8/3P4/8/PPP1PPPP/RNBQKBNR b KQkq - +R\'eti opening * +rnbqkb1r/pppppppp/5n2/8/3P4/8/PPP1PPPP/RNBQKBNR w KQkq - +Queen's pawn game +rnbqkb1r/pppppppp/5n2/8/4P3/3P4/PPP2PPP/RNBQKBNR b KQkq - +Alekhine's defense: Mar\'oczy variation +rnbqkb1r/pppppppp/5n2/8/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +Alekhine's defense +rnbqkb1r/pppppppp/5n2/8/5P2/8/PPPPP1PP/RNBQKBNR b KQkq - +R\'eti v Dutch * +rnbqkb1r/pppppppp/5n2/8/6P1/8/PPPPPP1P/RNBQKBNR b KQkq - +R\'eti: Herrstr\"om gambit * +rnbqkb1r/pppppppp/5n2/8/8/1P6/P1PPPPPP/RNBQKBNR w KQkq - +Nimzovich-Larsen attack: Indian variation +rnbqkb1r/pppppppp/5n2/8/8/3P4/PPP1PPPP/RNBQKBNR b KQkq - +R\'eti opening * +rnbqkb1r/pppppppp/5n2/8/8/5N2/PPPPPPPP/RNBQKB1R b KQkq - +R\'eti opening * +rnbqkb1r/pppppppp/5n2/8/8/5N2/PPPPPPPP/RNBQKB1R w KQkq - +R\'eti opening +rnbqkb1r/pppppppp/5n2/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - +R\'eti opening * +rnbqkb1r/pppppppp/7n/8/1P6/8/P1PPPPPP/RNBQKBNR w KQkq - +Polish: T\"ubingen variation +rnbqkb1r/pppppppp/7n/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - +Amar (Paris) opening * +rnbqkb1r/pppppppp/8/3nP3/2P5/8/PP1P1PPP/RNBQKBNR b KQkq - +Alekhine's defense +rnbqkb1r/pppppppp/8/3nP3/3P4/8/PPP2PPP/RNBQKBNR b KQkq - +Alekhine's defense +rnbqkb1r/pppppppp/8/3nP3/8/1P6/P1PP1PPP/RNBQKBNR b KQkq - +Alekhine's defense: Welling variation +rnbqkb1r/pppppppp/8/3nP3/8/2N5/PPPP1PPP/R1BQKBNR b KQkq - +Alekhine's defense: S\"amisch attack +rnbqkb1r/pppppppp/8/3nP3/8/8/PPPP1PPP/RNBQKBNR w KQkq - +Alekhine's defense +rnbqkb1r/pppppppp/8/4P3/4n3/8/PPPP1PPP/RNBQKBNR w KQkq - +Alekhine's defense: Mokele Mbembe (B\"ucker) variation +rnbqkb1r/pppppppp/8/8/3Pn3/5N2/PPP1PPPP/RNBQKB1R w KQkq - +D\"ory defense +rnbqkbnr/1p1p1p1p/p3p1p1/8/3NP3/3B4/PPP2PPP/RNBQK2R w KQkq - +Sicilian: Kan, Swiss cheese variation +rnbqkbnr/1p1p1ppp/p3p3/8/2PNP3/8/PP3PPP/RNBQKB1R b KQkq - +Sicilian: Kan, Mar\'oczy bind (R\'eti variation) +rnbqkbnr/1p1p1ppp/p3p3/8/3NP3/2N5/PPP2PPP/R1BQKB1R b KQkq - +Sicilian: Kan, 5.Nc3 +rnbqkbnr/1p1p1ppp/p3p3/8/3NP3/3B4/PPP2PPP/RNBQK2R b KQkq - +Sicilian: Kan, 5.Bd3 +rnbqkbnr/1p1p1ppp/p3p3/8/3NP3/8/PPP2PPP/RNBQKB1R w KQkq - +Sicilian: Kan variation +rnbqkbnr/1p1ppppp/p7/2p5/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - +Sicilian: O'Kelly variation +rnbqkbnr/1pp1pppp/p7/8/2pP4/5N2/PP2PPPP/RNBQKB1R w KQkq - +QGA: Alekhine defense +rnbqkbnr/1pp1pppp/p7/8/2pPP3/5N2/PP3PPP/RNBQKB1R b KQkq - +QGA: Alekhine defense, Borisenko-Furman variation +rnbqkbnr/1pp2ppp/p3p3/3p4/2PP4/2N5/PP2PPPP/R1BQKBNR w KQkq - +QGD: Janowski variation +rnbqkbnr/1ppp1ppp/p3p3/8/3PP3/8/PPP2PPP/RNBQKBNR w KQkq - +St. George defense +rnbqkbnr/1ppp1ppp/p7/4p3/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +KP: Mengarini's opening * +rnbqkbnr/1pppppp1/8/p6p/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +Crab opening * +rnbqkbnr/1pppppp1/p6p/8/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +Global opening * +rnbqkbnr/1ppppppp/8/p7/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +Corn stalk defense +rnbqkbnr/1ppppppp/8/p7/8/8/PPPPPPPP/RNBQKBNR w KQkq - +Ware (Meadow Hay) opening * +rnbqkbnr/1ppppppp/p7/8/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +St. George (Baker) defense +rnbqkbnr/1ppppppp/p7/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - +Anderssen's opening * +rnbqkbnr/2p1pppp/p7/1p6/2pP4/4PN2/PP3PPP/RNBQKB1R w KQkq - +QGA: Haberditz variation +rnbqkbnr/2pp1ppp/P7/4p3/8/8/PP1PPPPP/RNBQKBNR b KQkq - +Sicilian: wing gambit, Carlsbad variation * +rnbqkbnr/2pp1ppp/p7/1P2p3/8/8/PP1PPPPP/RNBQKBNR w KQkq - +Sicilian: wing gambit, Marshall variation * +rnbqkbnr/p1p1pppp/8/1p6/2pP4/5N2/PP2PPPP/RNBQKB1R w KQkq - +QGA: Ericson variation +rnbqkbnr/p1p2ppp/1p2p3/3p4/2PP4/2N5/PP2PPPP/R1BQKBNR w KQkq - +QGD: Alapin variation +rnbqkbnr/p1pp1ppp/1p2p3/8/2PP4/8/PP2PPPP/RNBQKBNR w KQkq - +Queen's pawn: Keres defense +rnbqkbnr/p1pp1ppp/1p6/4p3/8/4P3/PPPP1PPP/RNBQKBNR w KQkq - +French: R\'eti (Spielmann) variation * +rnbqkbnr/p1pp1ppp/1p6/8/3Np3/8/PPPPPPPP/RNBQKB1R w KQkq - +Alekhine's defense: Welling variation * +rnbqkbnr/p1pp1ppp/8/1p2p3/2P5/8/PP1PPPPP/RNBQKBNR w KQkq - +Sicilian: wing gambit * +rnbqkbnr/p1pp1ppp/8/1p6/2B1Pp2/8/PPPP2PP/RNBQK1NR w KQkq - +KGA: bishop's gambit, Bryan counter-gambit +rnbqkbnr/p1pp2pp/1p6/4pP2/8/8/PPPP1PPP/RNBQKBNR w KQkq - +KGA: Orsini gambit * +rnbqkbnr/p1pppppp/1p6/8/1P6/8/P1PPPPPP/RNBQKBNR b KQkq - +Nimzovich-Larsen attack: Polish variation * +rnbqkbnr/p1pppppp/1p6/8/2P5/8/PP1PPPPP/RNBQKBNR b KQkq - +Nimzovich-Larsen attack: English variation * +rnbqkbnr/p1pppppp/1p6/8/3P4/8/PPP1PPPP/RNBQKBNR b KQkq - +Nimzovich-Larsen attack: classical variation * +rnbqkbnr/p1pppppp/1p6/8/3P4/8/PPP1PPPP/RNBQKBNR w KQkq - +Queen's pawn: English defense +rnbqkbnr/p1pppppp/1p6/8/4P3/8/PPPP1PPP/RNBQKBNR b KQkq - +Nimzovich-Larsen attack: modern variation * +rnbqkbnr/p1pppppp/1p6/8/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +Owen defense +rnbqkbnr/p1pppppp/1p6/8/5P2/8/PPPPP1PP/RNBQKBNR b KQkq - +Nimzovich-Larsen attack: Dutch variation * +rnbqkbnr/p1pppppp/1p6/8/8/1P6/P1PPPPPP/RNBQKBNR b KQkq - +Nimzovich-Larsen attack: symmetrical variation * +rnbqkbnr/p1pppppp/1p6/8/8/1P6/P1PPPPPP/RNBQKBNR w KQkq - +Nimzovich-Larsen attack: symmetrical variation +rnbqkbnr/p1pppppp/1p6/8/8/5N2/PPPPPPPP/RNBQKB1R b KQkq - +Nimzovich-Larsen attack: Indian variation * +rnbqkbnr/p1pppppp/1p6/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - +Nimzovich-Larsen attack * +rnbqkbnr/p1pppppp/8/1p6/2P5/8/PP1PPPPP/RNBQKBNR w KQkq - +English: Jaenisch gambit +rnbqkbnr/p1pppppp/8/1p6/3P4/8/PPP1PPPP/RNBQKBNR w KQkq - +Polish defense +rnbqkbnr/p1pppppp/8/1p6/8/1P6/P1PPPPPP/RNBQKBNR w KQkq - +Nimzovich-Larsen attack: Polish variation +rnbqkbnr/p1pppppp/8/1p6/8/2P5/PP1PPPPP/RNBQKBNR b KQkq - +Polish: Outflank variation * +rnbqkbnr/p1pppppp/8/1p6/8/7N/PPPPPPPP/RNBQKB1R b KQkq - +Polish: T\"ubingen variation * +rnbqkbnr/p1pppppp/8/1p6/8/8/PPPPPPPP/RNBQKBNR w KQkq - +Polish (Sokolsky) opening * +rnbqkbnr/p2p1ppp/1p6/2p5/4p3/1N6/PPPPPPPP/RNBQKB1R w KQkq - +Alekhine's defense: Steiner variation * +rnbqkbnr/p2p1ppp/8/1Pp1p3/8/8/PP1PPPPP/RNBQKBNR w KQkq c6 +Sicilian: wing gambit, Santasiere variation * +rnbqkbnr/p2p1ppp/8/1pp5/2BpP3/5N2/PPP2PPP/RNBQK2R w KQkq - +Center game, Kieseritsky variation +rnbqkbnr/p2ppppp/1p6/2p5/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - +Sicilian: Katalimov variation +rnbqkbnr/p2ppppp/8/1pp5/8/5N2/PPPPPPPP/RNBQKB1R w KQkq - +English orang-utan * +rnbqkbnr/p3pppp/2p5/1p1p4/3PP3/2N5/PPP2PPP/R1BQKBNR w KQkq - +Caro-Kann: Gurgenidze counter-attack +rnbqkbnr/p4ppp/2p5/3pp3/8/2N5/PPPPPPPP/R1BQKBNR w KQkq - +KP: Nimzovich defense, Wheeler gambit * +rnbqkbnr/p4ppp/8/1pP5/N2p4/8/PP2PPPP/R1BQKBNR w KQkq b6 +QGD: Tarrasch defense, Tarrasch gambit +rnbqkbnr/pp1p1ppp/2p5/4p3/2B1P3/8/PPPP1PPP/RNBQK1NR w KQkq - +Bishop's opening: Philidor counter-attack +rnbqkbnr/pp1p1ppp/2p5/4p3/2P5/8/PP1PPPPP/RNBQKBNR w KQkq - +Sicilian: Alapin's variation (2.c3) * +rnbqkbnr/pp1p1ppp/2p5/4p3/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +KP: Lopez opening * +rnbqkbnr/pp1p1ppp/2p5/8/2B1Pp2/8/PPPP2PP/RNBQK1NR w KQkq - +KGA: bishop's gambit, Ruy L\'opez defense +rnbqkbnr/pp1p1ppp/4p3/2p5/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - +Sicilian defense +rnbqkbnr/pp1p1ppp/4p3/2pP4/4P3/8/PPP2PPP/RNBQKBNR b KQkq - +Old Benoni: Franco-Benoni defense +rnbqkbnr/pp1p1ppp/4p3/8/3pP3/5N2/PPP2PPP/RNBQKB1R w KQkq - +Sicilian defense +rnbqkbnr/pp1p1ppp/8/2p1p3/3P4/2P5/PP2PPPP/RNBQKBNR b KQkq - +Caro-Kann: anti-anti-Caro-Kann defense * +rnbqkbnr/pp1p1ppp/8/2p1p3/4P3/6P1/PPPP1P1P/RNBQKBNR b KQkq - +English: Adorjan defense * +rnbqkbnr/pp1p1ppp/8/2p1p3/4PP2/8/PPPP2PP/RNBQKBNR w KQkq - +KGD: Mafia defense +rnbqkbnr/pp1p1ppp/8/2p1p3/8/2P5/PP1PPPPP/RNBQKBNR w KQkq - +Caro-Kann: anti-Caro-Kann defense * +rnbqkbnr/pp1p1ppp/8/2p1p3/8/4P3/PPPP1PPP/RNBQKBNR w KQkq - +French defense, Steiner variation * +rnbqkbnr/pp1p1ppp/8/2p5/3Np3/8/PPPPPPPP/RNBQKB1R w KQkq - +Alekhine's defense * +rnbqkbnr/pp1p1ppp/8/2p5/3p4/2P2N2/PP2PPPP/RNBQKB1R b KQkq - +Scandinavian gambit * +rnbqkbnr/pp1p1ppp/8/2p5/3p4/4PN2/PPP2PPP/RNBQKB1R b KQkq - +Scandinavian: Icelandic gambit * +rnbqkbnr/pp1p1ppp/8/2pPp3/8/8/PPP1PPPP/RNBQKBNR w KQkq e6 +Old Benoni defense +rnbqkbnr/pp1p1ppp/8/4p3/3pP3/2P2N2/PP3PPP/RNBQKB1R b KQkq - +Sicilian: Andreaschek gambit +rnbqkbnr/pp1p1ppp/8/8/2p1p3/1N6/PPPPPPPP/RNBQKB1R w KQkq - +Alekhine's defense: two pawns' (Lasker's) attack * +rnbqkbnr/pp1pp1pp/8/2p2p2/3P4/8/PPP1PPPP/RNBQKBNR w KQkq - +Mujannah opening * +rnbqkbnr/pp1pp1pp/8/2pP1p2/8/8/PPP1PPPP/RNBQKBNR w KQkq - +Old Benoni: Mujannah formation +rnbqkbnr/pp1ppp1p/6p1/2p5/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - +Sicilian: Hungarian variation +rnbqkbnr/pp1ppppp/2p5/8/1P6/8/P1PPPPPP/RNBQKBNR w KQkq - +Polish: Outflank variation +rnbqkbnr/pp1ppppp/2p5/8/2B1P3/8/PPPP1PPP/RNBQK1NR b KQkq - +Caro-Kann: Hillbilly attack +rnbqkbnr/pp1ppppp/2p5/8/2P1P3/8/PP1P1PPP/RNBQKBNR b KQkq - +Caro-Kann: anti-Caro-Kann defense +rnbqkbnr/pp1ppppp/2p5/8/2P5/8/PP1PPPPP/RNBQKBNR w KQkq - +English: Caro-Kann defensive system +rnbqkbnr/pp1ppppp/2p5/8/3PP3/8/PPP2PPP/RNBQKBNR b KQkq - +Caro-Kann defense +rnbqkbnr/pp1ppppp/2p5/8/4P3/2N5/PPPP1PPP/R1BQKBNR b KQkq - +Caro-Kann defense +rnbqkbnr/pp1ppppp/2p5/8/4P3/3P4/PPP2PPP/RNBQKBNR b KQkq - +Caro-Kann: closed (Breyer) variation +rnbqkbnr/pp1ppppp/2p5/8/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +Caro-Kann defense +rnbqkbnr/pp1ppppp/2p5/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - +Saragossa opening * +rnbqkbnr/pp1ppppp/8/2p5/1P2P3/8/P1PP1PPP/RNBQKBNR b KQkq - +Sicilian: wing gambit +rnbqkbnr/pp1ppppp/8/2p5/1P6/8/P1PPPPPP/RNBQKBNR b KQkq - +English: Jaenisch gambit * +rnbqkbnr/pp1ppppp/8/2p5/2P5/2N5/PP1PPPPP/R1BQKBNR b KQkq - +English: symmetrical variation +rnbqkbnr/pp1ppppp/8/2p5/2P5/8/PP1PPPPP/RNBQKBNR b KQkq - +English: symmetrical variation * +rnbqkbnr/pp1ppppp/8/2p5/2P5/8/PP1PPPPP/RNBQKBNR w KQkq - +English: symmetrical variation +rnbqkbnr/pp1ppppp/8/2p5/3P4/8/PPP1PPPP/RNBQKBNR w KQkq - +Old Benoni defense +rnbqkbnr/pp1ppppp/8/2p5/3PP3/8/PPP2PPP/RNBQKBNR b KQkq - +Sicilian: Smith-Morra gambit +rnbqkbnr/pp1ppppp/8/2p5/4P3/2N5/PPPP1PPP/R1BQKBNR b KQkq - +Sicilian: closed +rnbqkbnr/pp1ppppp/8/2p5/4P3/2P5/PP1P1PPP/RNBQKBNR b KQkq - +Sicilian: Alapin's variation (2.c3) +rnbqkbnr/pp1ppppp/8/2p5/4P3/5N2/PPPP1PPP/RNBQKB1R b KQkq - +Sicilian defense +rnbqkbnr/pp1ppppp/8/2p5/4P3/6P1/PPPP1P1P/RNBQKBNR b KQkq - +Sicilian: Steinitz variation +rnbqkbnr/pp1ppppp/8/2p5/4P3/8/PPPP1PPP/RNBQKBNR b KQkq - +English opening * +rnbqkbnr/pp1ppppp/8/2p5/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +Sicilian defense +rnbqkbnr/pp1ppppp/8/2p5/4P3/8/PPPPNPPP/RNBQKB1R b KQkq - +Sicilian: Keres variation (2.Ne2) +rnbqkbnr/pp1ppppp/8/2p5/4PP2/8/PPPP2PP/RNBQKBNR b KQkq - +Sicilian: Grand Prix attack +rnbqkbnr/pp1ppppp/8/2p5/5P2/8/PPPPP1PP/RNBQKBNR b KQkq - +English: Anglo-Dutch defense * +rnbqkbnr/pp1ppppp/8/2p5/8/1P6/P1PPPPPP/RNBQKBNR w KQkq - +Nimzovich-Larsen attack: English variation +rnbqkbnr/pp1ppppp/8/2p5/8/2P5/PP1PPPPP/RNBQKBNR b KQkq - +English: Caro-Kann defensive system * +rnbqkbnr/pp1ppppp/8/2p5/8/4P3/PPPP1PPP/RNBQKBNR b KQkq - +English opening * +rnbqkbnr/pp1ppppp/8/2p5/8/5N2/PPPPPPPP/RNBQKB1R b KQkq - +English, 1...Nf6 (Anglo-Indian defense) * +rnbqkbnr/pp1ppppp/8/2p5/8/6P1/PPPPPP1P/RNBQKBNR b KQkq - +English opening * +rnbqkbnr/pp1ppppp/8/2p5/8/8/PPPPPPPP/RNBQKBNR w KQkq - +English opening * +rnbqkbnr/pp1ppppp/8/8/1p2P3/P7/2PP1PPP/RNBQKBNR b KQkq - +Sicilian: wing gambit, Marshall variation +rnbqkbnr/pp1ppppp/8/8/1pP1P3/8/P2P1PPP/RNBQKBNR b KQkq c3 +Sicilian: wing gambit, Santasiere variation +rnbqkbnr/pp1ppppp/8/8/3pP3/2P5/PP3PPP/RNBQKBNR b KQkq - +Sicilian: Smith-Morra gambit +rnbqkbnr/pp1ppppp/8/8/4P3/p7/2PP1PPP/RNBQKBNR w KQkq - +Sicilian: wing gambit, Carlsbad variation +rnbqkbnr/pp2p1pp/5p2/2pp4/3P4/5NP1/PPP1PP1P/RNBQKB1R b KQkq - +Neo-Gr\"unfeld defense * +rnbqkbnr/pp2pp1p/2p3p1/3p4/3PP3/2N5/PPP2PPP/R1BQKBNR w KQkq - +Caro-Kann: Gurgenidze system +rnbqkbnr/pp2pp1p/3p2p1/2pP4/8/2N5/PPP1PPPP/R1BQKBNR w KQkq - +Old Benoni: Schmid's system +rnbqkbnr/pp2pp1p/6p1/2pp4/3P4/5NP1/PPP1PP1P/RNBQKB1R b KQkq - +Neo-Gr\"unfeld (Kemeri) defense * +rnbqkbnr/pp2pp1p/6p1/2pp4/5P2/5N2/PPPPP1PP/RNBQKB1R w KQkq - +Dutch with c4 & g3 * +rnbqkbnr/pp2pp1p/6p1/2pp4/5P2/5NP1/PPPPP2P/RNBQKB1R b KQkq - +Dutch: Leningrad variation * +rnbqkbnr/pp2pp1p/6p1/2pp4/8/4PN2/PPPP1PPP/RNBQKB1R w KQkq - +Catalan opening * +rnbqkbnr/pp2pp1p/6p1/2pp4/8/5NP1/PPPPPP1P/RNBQKB1R w KQkq - +King's Indian: 3.g3 * +rnbqkbnr/pp2pppp/2p5/3P4/3P4/8/PP2PPPP/RNBQKBNR b KQkq - +QGD Slav defense: exchange variation +rnbqkbnr/pp2pppp/2p5/3P4/3P4/8/PPP2PPP/RNBQKBNR b KQkq - +Caro-Kann: exchange variation +rnbqkbnr/pp2pppp/2p5/3p2P1/8/8/PPPPPPBP/RNBQK1NR b KQkq - +Grob: spike attack +rnbqkbnr/pp2pppp/2p5/3p4/2P1P3/8/PP1P1PPP/RNBQKBNR w KQkq - +Caro-Kann: anti-anti-Caro-Kann defense +rnbqkbnr/pp2pppp/2p5/3p4/2P5/1P3N2/P2PPPPP/RNBQKB1R b KQkq - +English: Caro-Kann defensive system +rnbqkbnr/pp2pppp/2p5/3p4/2PP4/5N2/PP2PPPP/RNBQKB1R b KQkq - +QGD Slav: 3.Nf3 +rnbqkbnr/pp2pppp/2p5/3p4/2PP4/8/PP2PPPP/RNBQKBNR w KQkq - +QGD Slav defense +rnbqkbnr/pp2pppp/2p5/3p4/3PP3/2N5/PPP2PPP/R1BQKBNR b KQkq - +Caro-Kann defense +rnbqkbnr/pp2pppp/2p5/3p4/3PP3/5P2/PPP3PP/RNBQKBNR b KQkq - +Caro-Kann: Tartakower (fantasy) variation +rnbqkbnr/pp2pppp/2p5/3p4/3PP3/8/PPP2PPP/RNBQKBNR w KQkq - +Caro-Kann defense +rnbqkbnr/pp2pppp/2p5/3p4/3PP3/8/PPPN1PPP/R1BQKBNR b KQkq - +Caro-Kann: 3.Nd2 +rnbqkbnr/pp2pppp/2p5/3p4/4P3/2N2N2/PPPP1PPP/R1BQKB1R b KQkq - +Caro-Kann: two knights variation +rnbqkbnr/pp2pppp/2p5/3p4/4P3/2N2Q2/PPPP1PPP/R1B1KBNR b KQkq - +Caro-Kann: Goldman (Spielmann) variation +rnbqkbnr/pp2pppp/2p5/3pP3/3P4/8/PPP2PPP/RNBQKBNR b KQkq - +Caro-Kann: advance variation +rnbqkbnr/pp2pppp/2p5/8/2pPP3/2N5/PP3PPP/R1BQKBNR b KQkq - +QGD Slav defense, Alekhine variation +rnbqkbnr/pp2pppp/2p5/8/3PN3/8/PPP2PPP/R1BQKBNR b KQkq - +Caro-Kann defense +rnbqkbnr/pp2pppp/2p5/8/3Pp3/2N2P2/PPP3PP/R1BQKBNR b KQkq - +Caro-Kann: Rasa-Studier gambit +rnbqkbnr/pp2pppp/3p4/1Bp5/4P3/5N2/PPPP1PPP/RNBQK2R b KQkq - +Sicilian: Canal-Sokolsky (Nimzovich-Rossolimo, Moscow) attack +rnbqkbnr/pp2pppp/3p4/2p5/1P2P3/5N2/P1PP1PPP/RNBQKB1R b KQkq - +Sicilian: wing gambit deferred +rnbqkbnr/pp2pppp/3p4/2p5/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - +Sicilian +rnbqkbnr/pp2pppp/3p4/2pP4/8/8/PPP1PPPP/RNBQKBNR w KQkq - +Old Benoni defense +rnbqkbnr/pp2pppp/3p4/8/3NP3/8/PPP2PPP/RNBQKB1R b KQkq - +Sicilian +rnbqkbnr/pp2pppp/3p4/8/3QP3/5N2/PPP2PPP/RNB1KB1R b KQkq - +Sicilian, Chekhover variation +rnbqkbnr/pp2pppp/3p4/8/3pP3/2P2N2/PP3PPP/RNBQKB1R b KQkq - +Sicilian: Tartakower variation +rnbqkbnr/pp2pppp/3p4/8/3pP3/5N2/PPP2PPP/RNBQKB1R w KQkq - +Sicilian +rnbqkbnr/pp2pppp/8/1Bpp4/8/4P3/PPPP1PPP/RNBQK1NR b KQkq - +Queen's pawn: Franco-Indian (Keres) defense * +rnbqkbnr/pp2pppp/8/2Pp4/8/8/PPP1PPPP/RNBQKBNR b KQkq - +Queen's gambit accepted * +rnbqkbnr/pp2pppp/8/2p1N3/2Pp4/8/PP1PPPPP/RNBQKB1R b KQkq - +Vulture defense * +rnbqkbnr/pp2pppp/8/2p1N3/4p3/8/PPPP1PPP/RNBQKB1R b KQkq - +Budapest: Fajarowicz variation * +rnbqkbnr/pp2pppp/8/2p3N1/4p3/8/PPPP1PPP/RNBQKB1R b KQkq - +Budapest defense * +rnbqkbnr/pp2pppp/8/2p5/1P1p4/5NP1/P1PPPP1P/RNBQKB1R b KQkq - +King's Indian: Danube gambit * +rnbqkbnr/pp2pppp/8/2p5/1PPp4/5N2/P2PPPPP/RNBQKB1R b KQkq - +Benk\"o gambit * +rnbqkbnr/pp2pppp/8/2p5/2Pp4/3P1N2/PP2PPPP/RNBQKB1R b KQkq - +Benoni defense, Hromodka system * +rnbqkbnr/pp2pppp/8/2p5/2Pp4/4PN2/PP1P1PPP/RNBQKB1R b KQkq - +Benoni defense * +rnbqkbnr/pp2pppp/8/2p5/2PpP3/5N2/PP1P1PPP/RNBQKB1R b KQkq e3 +Czech Benoni defense * +rnbqkbnr/pp2pppp/8/2p5/3p4/5NP1/PPPPPP1P/RNBQKB1R w KQkq - +King's Indian: Anti-Gr\"unfeld * +rnbqkbnr/pp2pppp/8/2pp4/2P5/5N2/PP1PPPPP/RNBQKB1R b KQkq - +Benoni defense * +rnbqkbnr/pp2pppp/8/2pp4/2PP4/8/PP2PPPP/RNBQKBNR b KQkq - +QGD: symmetrical (Austrian) defense * +rnbqkbnr/pp2pppp/8/2pp4/2PP4/8/PP2PPPP/RNBQKBNR w KQkq - +QGD: symmetrical (Austrian) defense +rnbqkbnr/pp2pppp/8/2pp4/3P1B2/8/PPP1PPPP/RN1QKBNR b KQkq - +QGD: Grau (Sahovic) defense * +rnbqkbnr/pp2pppp/8/2pp4/3P1B2/8/PPP1PPPP/RN1QKBNR w KQkq - +Queen's pawn, Mason variation, Steinitz counter-gambit +rnbqkbnr/pp2pppp/8/2pp4/3P4/2N5/PPP1PPPP/R1BQKBNR b KQkq - +QGD: Chigorin defense * +rnbqkbnr/pp2pppp/8/2pp4/3P4/2P5/PP2PPPP/RNBQKBNR b KQkq - +QGD Slav defense * +rnbqkbnr/pp2pppp/8/2pp4/3P4/4P3/PPP2PPP/RNBQKBNR b KQkq - +Queen's gambit declined * +rnbqkbnr/pp2pppp/8/2pp4/3P4/5N2/PPP1PPPP/RNBQKB1R b KQkq - +QGD: Marshall defense * +rnbqkbnr/pp2pppp/8/2pp4/3P4/5N2/PPP1PPPP/RNBQKB1R w KQkq - +Queen's pawn game, Krause variation +rnbqkbnr/pp2pppp/8/2pp4/3P4/8/PPP1PPPP/RNBQKBNR w KQkq - +Queen's gambit declined * +rnbqkbnr/pp2pppp/8/2pp4/3PP3/8/PPP2PPP/RNBQKBNR b KQkq - +QGD: Albin counter-gambit * +rnbqkbnr/pp2pppp/8/2pp4/4P3/5N2/PPPP1PPP/RNBQKB1R b KQkq - +Budapest defense declined * +rnbqkbnr/pp2pppp/8/2pp4/5P2/4P3/PPPP2PP/RNBQKBNR b KQkq - +Dutch defense * +rnbqkbnr/pp2pppp/8/2pp4/5P2/5N2/PPPPP1PP/RNBQKB1R b KQkq - +Dutch defense * +rnbqkbnr/pp2pppp/8/2pp4/5P2/8/PPPPP1PP/RNBQKBNR w KQkq - +Dutch defense * +rnbqkbnr/pp2pppp/8/2pp4/8/1P2P3/P1PP1PPP/RNBQKBNR b KQkq - +Queen's pawn: Keres defense * +rnbqkbnr/pp2pppp/8/2pp4/8/1P3N2/P1PPPPPP/RNBQKB1R b KQkq - +Queen's Indian accelerated * +rnbqkbnr/pp2pppp/8/2pp4/8/2N2N2/PPPPPPPP/R1BQKB1R b KQkq - +Kevitz-Trajkovich defense * +rnbqkbnr/pp2pppp/8/2pp4/8/3P1N2/PPP1PPPP/RNBQKB1R b KQkq - +Old Indian defense * +rnbqkbnr/pp2pppp/8/2pp4/8/3P4/PPP1PPPP/RNBQKBNR w KQkq - +Old Indian defense * +rnbqkbnr/pp2pppp/8/2pp4/8/4PN2/PPPP1PPP/RNBQKB1R b KQkq - +Queen's pawn game * +rnbqkbnr/pp2pppp/8/2pp4/8/5N2/PPPPPPPP/RNBQKB1R w KQkq - +Queen's pawn game * +rnbqkbnr/pp2pppp/8/2pp4/8/5NP1/PPPPPP1P/RNBQKB1R b KQkq - +King's Indian defense * +rnbqkbnr/pp2pppp/8/2pp4/8/5NP1/PPPPPP1P/RNBQKB1R w KQkq - +R\'eti: King's Indian attack (with ...c5) +rnbqkbnr/pp2pppp/8/2pp4/8/5NP1/PPPPPPBP/RNBQK2R b KQkq - +R\'eti: King's Indian attack +rnbqkbnr/pp2pppp/8/3p4/2PP4/8/PP3PPP/RNBQKBNR b KQkq - +Caro-Kann: Panov-Botvinnik attack +rnbqkbnr/pp2pppp/8/3p4/3p4/2P5/PP2PPPP/RNBQKBNR w KQkq - +QGD Slav defense: exchange variation * +rnbqkbnr/pp2pppp/8/8/1pPp4/P4N2/3PPPPP/RNBQKB1R b KQkq - +Benk\"o gambit half accepted * +rnbqkbnr/pp2pppp/8/8/2Pp4/p4N2/3PPPPP/RNBQKB1R w KQkq - +Benk\"o gambit accepted * +rnbqkbnr/pp3ppp/2p1p3/3p4/2P5/5NP1/PP1PPP1P/RNBQKB1R w KQkq - +English: Kurajica defense +rnbqkbnr/pp3ppp/2p1p3/3p4/2PP4/2N5/PP2PPPP/R1BQKBNR w KQkq - +QGD: semi-Slav +rnbqkbnr/pp3ppp/2p1p3/3p4/2PPP3/2N5/PP3PPP/R1BQKBNR b KQkq - +QGD: semi-Slav, Marshall gambit +rnbqkbnr/pp3ppp/2p1p3/8/2pP4/2N2N2/PP2PPPP/R1BQKB1R w KQkq - +QGD: semi-Slav, Noteboom variation +rnbqkbnr/pp3ppp/2p5/3B4/4Pp2/8/PPPP2PP/RNBQK1NR w KQkq - +KGA: bishop's gambit, Anderssen variation +rnbqkbnr/pp3ppp/2p5/3Pp3/3P4/8/PPP2PPP/RNBQKBNR b KQkq - +Danish gambit: S\o rensen defense * +rnbqkbnr/pp3ppp/2p5/3Pp3/5P2/8/PPPP2PP/RNBQKBNR w KQkq - +KGD: Nimzovich counter-gambit +rnbqkbnr/pp3ppp/2p5/3Pp3/8/8/PP1PPPPP/RNBQKBNR w KQkq - +Sicilian: Smith-Morra gambit * +rnbqkbnr/pp3ppp/2p5/3Pp3/8/8/PPPP1PPP/RNBQKBNR w KQkq - +Danish gambit * +rnbqkbnr/pp3ppp/2p5/3p4/2PPp3/2N1P3/PP3PPP/R1BQKBNR b KQkq - +French: advance variation * +rnbqkbnr/pp3ppp/2p5/3p4/2PPp3/4P3/PP3PPP/RNBQKBNR w KQkq - +French: advance variation * +rnbqkbnr/pp3ppp/2p5/3pp3/2PP4/2N5/PP2PPPP/R1BQKBNR w KQkq - +QGD Slav: Winawer counter-gambit +rnbqkbnr/pp3ppp/2pp4/4p3/2P5/2N3P1/PP1PPP1P/R1BQKBNR w KQkq - +English, Keres variation +rnbqkbnr/pp3ppp/3p4/2pPp3/4P3/8/PPP2PPP/RNBQKBNR w KQkq - +Semi-Benoni (`blockade variation') +rnbqkbnr/pp3ppp/4p3/2PpP3/8/8/PPP2PPP/RNBQKBNR b KQkq - +French: advance, Steinitz variation +rnbqkbnr/pp3ppp/4p3/2pp4/2PP4/2N5/PP2PPPP/R1BQKBNR w KQkq - +QGD: Tarrasch defense +rnbqkbnr/pp3ppp/4p3/2pp4/3PP3/2N5/PPP2PPP/R1BQKBNR w KQkq - +French: Marshall variation +rnbqkbnr/pp3ppp/4p3/2pp4/3PP3/5N2/PPP2PPP/RNBQKB1R w KQkq - +Sicilian: Marshall variation +rnbqkbnr/pp3ppp/4p3/2pp4/3PP3/8/PPPN1PPP/R1BQKBNR w KQkq - +French: Tarrasch, open variation +rnbqkbnr/pp3ppp/4p3/2pp4/4P3/2N3P1/PPPP1P1P/R1BQKBNR w KQkq - +Sicilian: closed, Korchnoi variation +rnbqkbnr/pp3ppp/4p3/2ppP3/1P6/5N2/P1PP1PPP/RNBQKB1R b KQkq - +French: Wing gambit +rnbqkbnr/pp3ppp/4p3/2ppP3/3P2Q1/8/PPP2PPP/RNB1KBNR b KQkq - +French: advance, Nimzovich variation +rnbqkbnr/pp3ppp/4p3/2ppP3/3P4/2P5/PP3PPP/RNBQKBNR b KQkq - +French: advance variation +rnbqkbnr/pp3ppp/4p3/2ppP3/3P4/5N2/PPP2PPP/RNBQKB1R b KQkq - +French: advance, Nimzovich system +rnbqkbnr/pp3ppp/4p3/3P4/3p4/2N5/PP2PPPP/R1BQKBNR w KQkq - +QGD: Tarrasch, von Hennig-Schara gambit +rnbqkbnr/pp3ppp/4p3/8/2Bp4/5N2/PPPN1PPP/R1BQK2R w KQkq - +French: Tarrasch, Eliskases variation +rnbqkbnr/pp3ppp/8/1Npp4/8/8/PPP1PPPP/RNBQKB1R b KQkq - +Scandinavian: Kiel variation * +rnbqkbnr/pp3ppp/8/2Ppp3/5P2/8/PPP1P1PP/RNBQKBNR b KQkq - +QGA: Schwartz defense * +rnbqkbnr/pp3ppp/8/2Ppp3/8/8/PPP1PPPP/RNBQKBNR w KQkq - +QGA: 3.e4 * +rnbqkbnr/pp3ppp/8/2p1p1N1/4p3/3P4/PPP2PPP/RNBQKB1R b KQkq - +Budapest: Alekhine variation, Balogh gambit * +rnbqkbnr/pp3ppp/8/2p1p1N1/4p3/8/PPPP1PPP/RNBQKB1R w KQkq - +Budapest: Alekhine variation * +rnbqkbnr/pp3ppp/8/2pp4/3Np3/3P4/PPP1PPPP/RNBQKB1R w KQkq - +Alekhine's defense * +rnbqkbnr/pp3ppp/8/2pp4/3P4/2N2N2/PP2PPPP/R1BQKB1R b KQkq - +QGD: Tarrasch defense +rnbqkbnr/pp3ppp/8/2pp4/3P4/2N5/PP2PPPP/R1BQKBNR w KQkq - +QGD: Tarrasch defense, 4.cd ed +rnbqkbnr/pp3ppp/8/2pp4/3P4/8/PP2PPPP/RNBQKBNR w KQkq - +Caro-Kann: Panov-Botvinnik attack * +rnbqkbnr/pp3ppp/8/2pp4/3P4/8/PPPN1PPP/R1BQKBNR w KQkq - +French: Tarrasch, open, 4.ed ed +rnbqkbnr/pp3ppp/8/2pp4/3PP3/2N5/PP3PPP/R1BQKBNR b KQkq - +QGD: Tarrasch defense, Marshall gambit +rnbqkbnr/pp3ppp/8/2pp4/8/1N1p4/PPP1PPPP/RNBQKB1R w KQkq - +Alekhine's defense: exchange variation * +rnbqkbnr/pp3ppp/8/2ppp3/5P2/4P3/PPPP2PP/RNBQKBNR w KQkq - +Dutch: Staunton gambit deferred * +rnbqkbnr/pp3ppp/8/2ppp3/8/5PPN/PPPPP2P/RNBQKB1R b KQkq - +Hippopotamus defense * +rnbqkbnr/pp3ppp/8/3p4/2pP4/5N2/PP2PPPP/RNBQKB1R w KQkq - +Caro-Kann: Panov-Botvinnik, Gunderam attack * +rnbqkbnr/pp4pp/8/2p1pp2/8/2N5/PPPP1PPP/RNBQKB1R b KQkq - +Budapest: Alekhine, Abonyi variation * +rnbqkbnr/pp4pp/8/2pp1p2/4p1P1/1N1P4/PPP1PP1P/RNBQKB1R b KQkq - +Alekhine's defense: four pawns attack, Planinc variation * +rnbqkbnr/pp4pp/8/2pp1p2/4p3/1N1P2P1/PPP1PP1P/RNBQKB1R b KQkq - +Alekhine's defense: four pawns attack, fianchetto variation * +rnbqkbnr/pp4pp/8/2pp1p2/4p3/1N1P4/PPP1PPPP/RNBQKB1R w KQkq - +Alekhine's defense: four pawns attack * +rnbqkbnr/pp4pp/8/2pp1p2/4pB2/1N1P4/PPP1PPPP/RN1QKB1R b KQkq - +Alekhine's defense: four pawns attack, Trifunovi\'c variation * +rnbqkbnr/pp4pp/8/2pp4/4p3/1NN5/PPP1PPPP/R1BQKB1R b KQkq - +Alekhine's defense: four pawns attack, 6...Nc6 * +rnbqkbnr/ppp1p1pp/3p4/5p2/3PP3/8/PPP2PPP/RNBQKBNR w KQkq - +(Dutch:) Balogh defense +rnbqkbnr/ppp1p1pp/5p2/3p4/8/5N2/PPPPPPPP/RNBQKB1R w KQkq - +Paleface attack * +rnbqkbnr/ppp1p1pp/8/3p1p2/8/5N2/PPPPPPPP/RNBQKB1R w KQkq - +Canard opening * +rnbqkbnr/ppp1p1pp/8/5p2/2pPP3/8/PP3PPP/RNBQKBNR w KQkq - +QGA: Schwartz defense +rnbqkbnr/ppp1p2p/5p2/3p2p1/3P4/5N2/PPP1PPPP/RNBQKB1R w KQkq - +Gedult attack * +rnbqkbnr/ppp1pp1p/6p1/3p4/5P2/8/PPPPP1PP/RNBQKBNR w KQkq - +Dutch defense * +rnbqkbnr/ppp1pp1p/6p1/3p4/8/5NP1/PPPPPP1P/RNBQKB1R w KQkq - +R\'eti: King's Indian attack +rnbqkbnr/ppp1pp1p/8/3p2p1/5P2/8/PPPPP1PP/RNBQKBNR w KQkq - +Dutch, Krejcik gambit * +rnbqkbnr/ppp1pp1p/8/3p2p1/8/5N2/PPPPPPPP/RNBQKB1R w KQkq - +Queen's pawn: Bronstein gambit * +rnbqkbnr/ppp1ppp1/7p/3p4/5P2/8/PPPPP1PP/RNBQKBNR w KQkq - +Dutch, Korchnoi attack * +rnbqkbnr/ppp1pppp/3p4/8/2PP4/8/PP2PPPP/RNBQKBNR b KQkq - +Old Indian defense +rnbqkbnr/ppp1pppp/3p4/8/3P4/8/PPP1PPPP/RNBQKBNR w KQkq - +Queen's Pawn +rnbqkbnr/ppp1pppp/3p4/8/4P3/8/PPPP1PPP/RNBQKBNR b KQkq - +Mieses opening * +rnbqkbnr/ppp1pppp/3p4/8/8/5N2/PPPPPPPP/RNBQKB1R w KQkq - +R\'eti opening +rnbqkbnr/ppp1pppp/3p4/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - +Mieses opening * +rnbqkbnr/ppp1pppp/8/3p2B1/3P4/8/PPP1PPPP/RN1QKBNR b KQkq - +Levitsky attack (Queen's bishop attack) +rnbqkbnr/ppp1pppp/8/3p4/1P6/5N2/P1PPPPPP/RNBQKB1R b KQkq - +Santasiere's folly +rnbqkbnr/ppp1pppp/8/3p4/1P6/8/P1PPPPPP/RNBQKBNR b KQkq - +Polish defense * +rnbqkbnr/ppp1pppp/8/3p4/2P2P2/8/PP1PP1PP/RNBQKBNR b KQkq - +Mujannah opening +rnbqkbnr/ppp1pppp/8/3p4/2P5/5N2/PP1PPPPP/RNBQKB1R b KQkq - +R\'eti opening +rnbqkbnr/ppp1pppp/8/3p4/2P5/8/PP1PPPPP/RNBQKBNR b KQkq - +Old Benoni defense * +rnbqkbnr/ppp1pppp/8/3p4/2PP4/8/PP2PPPP/RNBQKBNR b KQkq - +Queen's gambit declined +rnbqkbnr/ppp1pppp/8/3p4/3P1B2/8/PPP1PPPP/RN1QKBNR b KQkq - +Queen's pawn, Mason variation +rnbqkbnr/ppp1pppp/8/3p4/3P4/2N5/PPP1PPPP/R1BQKBNR b KQkq - +Queen's pawn: Chigorin variation +rnbqkbnr/ppp1pppp/8/3p4/3P4/5N2/PPP1PPPP/RNBQKB1R b KQkq - +Queen's pawn game +rnbqkbnr/ppp1pppp/8/3p4/3P4/8/PPP1PPPP/RNBQKBNR b KQkq - +Queen's pawn game * +rnbqkbnr/ppp1pppp/8/3p4/3P4/8/PPP1PPPP/RNBQKBNR w KQkq - +Queen's pawn game +rnbqkbnr/ppp1pppp/8/3p4/3PP3/8/PPP2PPP/RNBQKBNR b KQkq - +Blackmar gambit +rnbqkbnr/ppp1pppp/8/3p4/4P3/5N2/PPPP1PPP/RNBQKB1R b KQkq - +Tennison (Lemberg, Zukertort) gambit +rnbqkbnr/ppp1pppp/8/3p4/4P3/8/PPPP1PPP/RNBQKBNR b KQkq - +Queen's pawn: Charlick (Englund) gambit * +rnbqkbnr/ppp1pppp/8/3p4/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +Scandinavian (center counter) defense +rnbqkbnr/ppp1pppp/8/3p4/4PP2/8/PPPP2PP/RNBQKBNR b KQkq - +Bird's opening: Williams gambit +rnbqkbnr/ppp1pppp/8/3p4/5P2/8/PPPPP1PP/RNBQKBNR b KQkq - +Dutch * +rnbqkbnr/ppp1pppp/8/3p4/5P2/8/PPPPP1PP/RNBQKBNR w KQkq - +Bird's opening +rnbqkbnr/ppp1pppp/8/3p4/8/1P3N2/P1PPPPPP/RNBQKB1R b KQkq - +R\'eti: Nimzovich-Larsen attack +rnbqkbnr/ppp1pppp/8/3p4/8/1P6/P1PPPPPP/RNBQKBNR b KQkq - +Queen's pawn: English defense * +rnbqkbnr/ppp1pppp/8/3p4/8/1P6/P1PPPPPP/RNBQKBNR w KQkq - +Nimzovich-Larsen attack: classical variation +rnbqkbnr/ppp1pppp/8/3p4/8/2N5/PPPPPPPP/R1BQKBNR b KQkq - +Queen's pawn: Lundin (Kevitz-Mikenas) defense * +rnbqkbnr/ppp1pppp/8/3p4/8/3P1N2/PPP1PPPP/RNBQKB1R b KQkq - +R\'eti: old Indian attack +rnbqkbnr/ppp1pppp/8/3p4/8/3P4/PPP1PPPP/RNBQKBNR b KQkq - +Queen's Pawn * +rnbqkbnr/ppp1pppp/8/3p4/8/4P3/PPPP1PPP/RNBQKBNR b KQkq - +Queen's pawn * +rnbqkbnr/ppp1pppp/8/3p4/8/5N2/PPPPPPPP/RNBQKB1R b KQkq - +Queen's pawn game * +rnbqkbnr/ppp1pppp/8/3p4/8/5N2/PPPPPPPP/RNBQKB1R w KQkq - +R\'eti opening +rnbqkbnr/ppp1pppp/8/3p4/8/5NP1/PPPPPP1P/RNBQKB1R b KQkq - +R\'eti: King's Indian attack (Barcza system) +rnbqkbnr/ppp1pppp/8/3p4/8/6P1/PPPPPP1P/RNBQKBNR b KQkq - +Modern defense * +rnbqkbnr/ppp1pppp/8/3p4/8/8/PPPPPPPP/RNBQKBNR w KQkq - +Queen's pawn * +rnbqkbnr/ppp1pppp/8/8/2Pp1P2/8/PP1PP1PP/RNBQKBNR b KQkq - +Old Benoni: Mujannah formation * +rnbqkbnr/ppp1pppp/8/8/2Pp4/3P4/PP2PPPP/RNBQKBNR b KQkq - +Old Benoni defense * +rnbqkbnr/ppp1pppp/8/8/2Pp4/5N2/PP1PPPPP/RNBQKB1R b KQkq - +Old Benoni defense * +rnbqkbnr/ppp1pppp/8/8/2Pp4/5N2/PP1PPPPP/RNBQKB1R w KQkq - +R\'eti: advance variation +rnbqkbnr/ppp1pppp/8/8/2PpP3/8/PP1P1PPP/RNBQKBNR b KQkq e3 +Old Benoni defense * +rnbqkbnr/ppp1pppp/8/8/2p5/5N2/PP1PPPPP/RNBQKB1R w KQkq - +R\'eti accepted +rnbqkbnr/ppp1pppp/8/8/2pP4/5N2/PP2PPPP/RNBQKB1R b KQkq - +QGA: 3.Nf3 +rnbqkbnr/ppp1pppp/8/8/2pP4/8/PP2PPPP/RNBQKBNR w KQkq - +Queen's gambit accepted +rnbqkbnr/ppp1pppp/8/8/2pPP3/8/PP3PPP/RNBQKBNR b KQkq - +QGA: 3.e4 +rnbqkbnr/ppp2p1p/3p2p1/8/3NP3/8/PPP2PPP/RNBQKB1R w KQkq - +Philidor: Larsen variation +rnbqkbnr/ppp2p1p/3p4/4N3/4PppP/8/PPPP2P1/RNBQKB1R w KQkq - +KGA: Kieseritsky, Kolisch defense +rnbqkbnr/ppp2p1p/8/3p2p1/4p3/6P1/PPPPPPNP/RNBQKB1R b KQkq - +Norwegian defense * +rnbqkbnr/ppp2p1p/8/3p4/2B1Ppp1/5N2/PPPP2PP/RNBQ1RK1 w kq - +KGA: Muzio gambit, Brentano defense +rnbqkbnr/ppp2p1p/8/3pN3/4PppP/8/PPPP2P1/RNBQKB1R w KQkq - +KGA: Kieseritsky, Brentano (Campbell) defense +rnbqkbnr/ppp2ppp/3p4/4p3/2P5/2N2N2/PP1PPPPP/R1BQKB1R b KQkq - +English opening +rnbqkbnr/ppp2ppp/3p4/4p3/3PP3/5N2/PPP2PPP/RNBQKB1R b KQkq - +Philidor's defense +rnbqkbnr/ppp2ppp/3p4/4p3/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - +Philidor's defense +rnbqkbnr/ppp2ppp/3p4/4p3/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +KP: Indian opening * +rnbqkbnr/ppp2ppp/3p4/4p3/8/2P5/PP1PPPPP/RNBQKBNR w KQkq - +Caro-Kann: closed (Breyer) variation * +rnbqkbnr/ppp2ppp/3p4/4p3/8/4P3/PPPP1PPP/RNBQKBNR w KQkq - +French: King's Indian attack * +rnbqkbnr/ppp2ppp/3p4/4p3/8/5N2/PPPPPPPP/RNBQKB1R w KQkq - +Alekhine's defense: Mar\'oczy variation * +rnbqkbnr/ppp2ppp/3p4/8/3NP3/8/PPP2PPP/RNBQKB1R b KQkq - +Philidor: exchange variation +rnbqkbnr/ppp2ppp/3p4/8/3pP3/5N2/PPP2PPP/RNBQKB1R w KQkq - +Philidor: exchange variation +rnbqkbnr/ppp2ppp/3p4/8/4Pp2/5N2/PPPP2PP/RNBQKB1R w KQkq - +KGA: Fischer defense +rnbqkbnr/ppp2ppp/3pp3/8/3PP3/8/PPP2PPP/RNBQKBNR w KQkq - +Lengfellner system +rnbqkbnr/ppp2ppp/4p3/3P4/3P4/8/PPP2PPP/RNBQKBNR b KQkq - +French: exchange variation +rnbqkbnr/ppp2ppp/4p3/3p4/2P5/5N2/PP1PPPPP/RNBQKB1R w KQkq - +English opening: Agincourt variation +rnbqkbnr/ppp2ppp/4p3/3p4/2P5/5NP1/PP1PPP1P/RNBQKB1R b KQkq - +English opening: Agincourt variation +rnbqkbnr/ppp2ppp/4p3/3p4/2PP4/2N5/PP2PPPP/R1BQKBNR b KQkq - +QGD: 3.Nc3 +rnbqkbnr/ppp2ppp/4p3/3p4/2PP4/8/PP2PPPP/RNBQKBNR w KQkq - +Queen's gambit declined +rnbqkbnr/ppp2ppp/4p3/3p4/3PP3/2N5/PPP2PPP/R1BQKBNR b KQkq - +French: Paulsen variation +rnbqkbnr/ppp2ppp/4p3/3p4/3PP3/3B4/PPP2PPP/RNBQK1NR b KQkq - +French: Schlechter variation +rnbqkbnr/ppp2ppp/4p3/3p4/3PP3/4B3/PPP2PPP/RN1QKBNR b KQkq - +French: Alapin variation +rnbqkbnr/ppp2ppp/4p3/3p4/3PP3/8/PPP2PPP/RNBQKBNR w KQkq - +French defense +rnbqkbnr/ppp2ppp/4p3/3p4/3PP3/8/PPPN1PPP/R1BQKBNR b KQkq - +French: Tarrasch +rnbqkbnr/ppp2ppp/4p3/3p4/4P3/2N2N2/PPPP1PPP/R1BQKB1R b KQkq - +French: Two knights variation +rnbqkbnr/ppp2ppp/4p3/3p4/4PP2/2N5/PPPP2PP/R1BQKBNR b KQkq - +French: Pelikan variation +rnbqkbnr/ppp2ppp/4p3/3pP3/3P4/8/PPP2PPP/RNBQKBNR b KQkq - +French: advance variation +rnbqkbnr/ppp2ppp/4p3/8/3Pp3/2N5/PPP2PPP/R1BQKBNR w KQkq - +French: Rubinstein variation +rnbqkbnr/ppp2ppp/8/1B1P4/4pP2/8/PPPP2PP/RNBQK1NR b KQkq - +KGD: Falkbeer, Nimzovich variation +rnbqkbnr/ppp2ppp/8/3P4/3N4/8/PPP2PPP/RNBQKB1R b KQkq - +Philidor: Paulsen attack +rnbqkbnr/ppp2ppp/8/3P4/4pP2/3P4/PPP3PP/RNBQKBNR b KQkq - +KGD: Falkbeer, 4.d3 +rnbqkbnr/ppp2ppp/8/3P4/4pP2/8/PPPP2PP/RNBQKBNR w KQkq - +KGD: Falkbeer, 3...e4 +rnbqkbnr/ppp2ppp/8/3Pp3/5P2/8/PPPP2PP/RNBQKBNR b KQkq - +KGD: Falkbeer counter-gambit +rnbqkbnr/ppp2ppp/8/3Pp3/8/8/PPPP1PPP/RNBQKBNR b KQkq - +Center game * +rnbqkbnr/ppp2ppp/8/3p4/1P1Np3/8/P1PPPPPP/RNBQKB1R b KQkq - +Alekhine's defense: O'Sullivan gambit * +rnbqkbnr/ppp2ppp/8/3p4/2B1P3/8/PB3PPP/RN1QK1NR w KQkq - +Danish gambit: Schlechter defense +rnbqkbnr/ppp2ppp/8/3p4/2B1Pp2/8/PPPP2PP/RNBQK1NR w KQkq - +KGA: bishop's gambit, Bledow variation +rnbqkbnr/ppp2ppp/8/3p4/3N4/8/PPP1PPPP/RNBQKB1R b KQkq - +Scandinavian: Marshall variation * +rnbqkbnr/ppp2ppp/8/3p4/3Np3/3P4/PPP1PPPP/RNBQKB1R b KQkq - +Alekhine's defense * +rnbqkbnr/ppp2ppp/8/3p4/3Np3/8/PPPPPPPP/RNBQKB1R w KQkq - +Alekhine's defense * +rnbqkbnr/ppp2ppp/8/3p4/3Pp3/2P5/PP2PPPP/RNBQKBNR w KQkq - +Caro-Kann: advance variation * +rnbqkbnr/ppp2ppp/8/3p4/3Pp3/4P3/PPP2PPP/RNBQKBNR w KQkq - +French: advance variation * +rnbqkbnr/ppp2ppp/8/3p4/3p4/2P5/PP2PPPP/RNBQKBNR w KQkq - +Caro-Kann: exchange variation * +rnbqkbnr/ppp2ppp/8/3p4/3p4/4P3/PPP2PPP/RNBQKBNR w KQkq - +French: exchange variation * +rnbqkbnr/ppp2ppp/8/3p4/3p4/5N2/PPP1PPPP/RNBQKB1R w KQkq - +Scandinavian defense * +rnbqkbnr/ppp2ppp/8/3p4/3p4/5NP1/PPP1PP1P/RNBQKB1R b KQkq - +Scandinavian: Richter variation * +rnbqkbnr/ppp2ppp/8/3p4/3pP3/2P5/PP3PPP/RNBQKBNR w KQkq - +Danish gambit: S\o rensen defense +rnbqkbnr/ppp2ppp/8/3p4/4Pp2/5N2/PPPP2PP/RNBQKB1R w KQkq - +KGA: Abbazia defense (classical defense, modern defense[!]) +rnbqkbnr/ppp2ppp/8/3pP3/8/8/PPPPP1PP/RNBQKBNR b KQkq - +Dutch: Staunton gambit * +rnbqkbnr/ppp2ppp/8/3pp3/2P5/8/PP1PPPPP/RNBQKBNR w KQkq - +Sicilian: Smith-Morra gambit * +rnbqkbnr/ppp2ppp/8/3pp3/2PP4/8/PP2PPPP/RNBQKBNR w KQkq - +QGD: Albin counter-gambit +rnbqkbnr/ppp2ppp/8/3pp3/3P4/2P5/PP2PPPP/RNBQKBNR b KQkq - +Caro-Kann defense * +rnbqkbnr/ppp2ppp/8/3pp3/3P4/4P3/PPP2PPP/RNBQKBNR b KQkq - +French defense * +rnbqkbnr/ppp2ppp/8/3pp3/3P4/8/PPP1PPPP/RNBQKBNR w KQkq - +Blackmar gambit * +rnbqkbnr/ppp2ppp/8/3pp3/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - +QP counter-gambit (elephant gambit) +rnbqkbnr/ppp2ppp/8/3pp3/4PP2/2N5/PPPP2PP/R1BQKBNR b KQkq - +KGD: Falkbeer, Milner-Barry variation +rnbqkbnr/ppp2ppp/8/3pp3/4PP2/5N2/PPPP2PP/RNBQKB1R b KQkq - +KGD: Falkbeer, Tartakower variation +rnbqkbnr/ppp2ppp/8/3pp3/4PP2/8/PPPP2PP/RNBQKBNR w KQkq - +KGD: Falkbeer counter-gambit +rnbqkbnr/ppp2ppp/8/3pp3/5P2/3P4/PPP1P1PP/RNBQKBNR b KQkq - +(Dutch:) Balogh defense * +rnbqkbnr/ppp2ppp/8/3pp3/5P2/8/PPPPP1PP/RNBQKBNR w KQkq - +Dutch: Staunton gambit * +rnbqkbnr/ppp2ppp/8/3pp3/8/2N2P2/PPPPP1PP/R1BQKBNR b KQkq - +KP: Neo-Mongoloid defense * +rnbqkbnr/ppp2ppp/8/3pp3/8/2N5/PPPPPPPP/R1BQKBNR w KQkq - +KP: Nimzovich defense * +rnbqkbnr/ppp2ppp/8/3pp3/8/2P2N2/PP1PPPPP/RNBQKB1R b KQkq - +Caro-Masi defense * +rnbqkbnr/ppp2ppp/8/3pp3/8/2P5/PP1PPPPP/RNBQKBNR w KQkq - +Caro-Kann defense * +rnbqkbnr/ppp2ppp/8/3pp3/8/3P1N2/PPP1PPPP/RNBQKB1R b KQkq - +Pirc defense * +rnbqkbnr/ppp2ppp/8/3pp3/8/3PP3/PPP2PPP/RNBQKBNR b KQkq - +Lengfellner system * +rnbqkbnr/ppp2ppp/8/3pp3/8/4P3/PPPP1PPP/RNBQKBNR w KQkq - +French defense * +rnbqkbnr/ppp2ppp/8/3pp3/8/5P2/PPPPPKPP/RNBQ1BNR b kq - +Fried fox defense * +rnbqkbnr/ppp2ppp/8/3pp3/8/6P1/PPPPPPBP/RNBQK1NR b KQkq - +Robatsch (modern) defense * +rnbqkbnr/ppp2ppp/8/3pp3/8/BP6/P1PPPPPP/RN1QKBNR b KQkq - +Guatemala defense * +rnbqkbnr/ppp2ppp/8/3pp3/8/P3P3/1PPP1PPP/RNBQKBNR b KQkq - +St. George defense * +rnbqkbnr/ppp2ppp/8/4P3/2Pp4/5N2/PP2PPPP/RNBQKB1R b KQkq - +QGD: Albin counter-gambit +rnbqkbnr/ppp2ppp/8/4p3/2Pp4/4P3/PP1P1PPP/RNBQKBNR w KQkq - +Old Benoni: Franco-Benoni defense * +rnbqkbnr/ppp2ppp/8/4p3/2PpP3/3P4/PP3PPP/RNBQKBNR b KQkq - +Semi-Benoni (`blockade variation') * +rnbqkbnr/ppp2ppp/8/8/2pPp3/4P3/PP3PPP/RNBQKBNR w KQkq - +French: advance, Steinitz variation * +rnbqkbnr/ppp3pp/3p4/4Pp2/3p4/8/PPP2PPP/RNBQKBNR w KQkq - +KGD: Falkbeer, 4.d3 * +rnbqkbnr/ppp3pp/3p4/4pp2/2B1P3/5N2/PPPP1PPP/RNBQK2R w KQkq - +Philidor: L\'opez counter-gambit +rnbqkbnr/ppp3pp/3p4/4pp2/3PP3/2N2N2/PPP2PPP/R1BQKB1R b KQkq - +Philidor: Philidor counter-gambit, Zukertort variation +rnbqkbnr/ppp3pp/3p4/4pp2/3PP3/5N2/PPP2PPP/RNBQKB1R w KQkq - +Philidor: Philidor counter-gambit +rnbqkbnr/ppp3pp/4P3/3p2N1/4p3/8/PPP2PPP/RNBQKB1R b KQkq - +Philidor: Philidor counter-gambit, del Rio attack +rnbqkbnr/ppp3pp/4p3/3p1p2/3PP3/8/PPPN1PPP/R1BQKBNR w KQkq - +French: Tarrasch, Haberditz variation +rnbqkbnr/ppp3pp/5p2/3pp3/3P4/2P5/PP2PPPP/RNBQKBNR w KQkq - +Caro-Kann: Tartakower (fantasy) variation * +rnbqkbnr/ppp3pp/5p2/3pp3/3P4/5N2/PPP1PPPP/RNBQKB1R w KQkq - +Blackmar-Diemer gambit * +rnbqkbnr/ppp3pp/8/3Ppp2/8/8/PPPP1PPP/RNBQKBNR w KQkq - +Halasz gambit * +rnbqkbnr/ppp3pp/8/3pN3/2B1p3/8/PPPP1PPP/RNBQK2R w KQkq - +Latvian: Polerio variation +rnbqkbnr/ppp3pp/8/3ppP2/8/8/PPPP1PPP/RNBQKBNR w KQkq - +KGA: Villemson (Steinitz) gambit * +rnbqkbnr/ppp3pp/8/3ppp2/8/6P1/PPPPPPBP/RNBQK1NR w KQkq - +Robatsch defense: three pawns attack * +rnbqkbnr/ppp3pp/8/4pp2/3p4/5N2/PPP2PPP/RNBQKB1R w KQkq - +KGD: Falkbeer, 5.de * +rnbqkbnr/pppp1B1p/8/8/4Ppp1/5N2/PPPP2PP/RNBQK2R b KQkq - +KGA: Lolli gambit (wild Muzio gambit) +rnbqkbnr/pppp1p1p/6p1/4p3/2P1P3/8/PP1P1PPP/RNBQKBNR w KQkq - +English: Adorjan defense +rnbqkbnr/pppp1p1p/6p1/4p3/2P5/8/PP1PPPPP/RNBQKBNR w KQkq - +Sicilian: Steinitz variation * +rnbqkbnr/pppp1p1p/8/4N3/2B1Ppp1/8/PPPP2PP/RNBQK2R b KQkq - +KGA: Salvio gambit +rnbqkbnr/pppp1p1p/8/4N3/3PPpp1/8/PPP3PP/RNBQKB1R b KQkq - +KGA: S\o rensen gambit +rnbqkbnr/pppp1p1p/8/6N1/4PppP/8/PPPP2P1/RNBQKB1R b KQkq - +KGA: Allgaier gambit +rnbqkbnr/pppp1p1p/8/6p1/2B1Pp2/5N2/PPPP2PP/RNBQK2R b KQkq - +KGA: King's knight's gambit +rnbqkbnr/pppp1p1p/8/6p1/3PPp2/5N2/PPP3PP/RNBQKB1R b KQkq - +KGA: Rosentreter gambit +rnbqkbnr/pppp1p1p/8/6p1/4Pp1P/5N2/PPPP2P1/RNBQKB1R b KQkq - +King's knight's gambit +rnbqkbnr/pppp1p1p/8/6p1/4Pp2/2N2N2/PPPP2PP/R1BQKB1R b KQkq - +KGA: Quaade gambit +rnbqkbnr/pppp1p1p/8/8/2B1Ppp1/2N2N2/PPPP2PP/R1BQK2R b KQkq - +KGA: MacDonnell gambit +rnbqkbnr/pppp1p1p/8/8/2B1Ppp1/5N2/PPPP2PP/RNBQ1RK1 b kq - +KGA: Muzio gambit +rnbqkbnr/pppp1p1p/8/8/2BPPpp1/5N2/PPP3PP/RNBQK2R b KQkq - +KGA: Ghulam Kassim gambit +rnbqkbnr/pppp1p2/8/4N2p/4PppP/8/PPPP2P1/RNBQKB1R w KQkq - +KGA: Kieseritsky, long whip (Stockwhip, classical) defense +rnbqkbnr/pppp1pp1/7p/8/4Pp2/5N2/PPPP2PP/RNBQKB1R w KQkq - +KGA: Becker defense +rnbqkbnr/pppp1ppp/4p3/4P3/8/8/PPPP1PPP/RNBQKBNR b KQkq - +French: Steinitz attack +rnbqkbnr/pppp1ppp/4p3/8/2P1P3/8/PP1P1PPP/RNBQKBNR b KQkq - +French defense, Steiner variation +rnbqkbnr/pppp1ppp/4p3/8/2P5/8/PP1PPPPP/RNBQKBNR w KQkq - +English opening +rnbqkbnr/pppp1ppp/4p3/8/3P4/8/PPP1PPPP/RNBQKBNR w KQkq - +Queen's pawn +rnbqkbnr/pppp1ppp/4p3/8/3PP3/8/PPP2PPP/RNBQKBNR b KQkq - +French defense +rnbqkbnr/pppp1ppp/4p3/8/4P3/1P6/P1PP1PPP/RNBQKBNR b KQkq - +French: R\'eti (Spielmann) variation +rnbqkbnr/pppp1ppp/4p3/8/4P3/2N5/PPPP1PPP/R1BQKBNR b KQkq - +French defense +rnbqkbnr/pppp1ppp/4p3/8/4P3/3P4/PPP2PPP/RNBQKBNR b KQkq - +French: King's Indian attack +rnbqkbnr/pppp1ppp/4p3/8/4P3/5N2/PPPP1PPP/RNBQKB1R b KQkq - +French defense +rnbqkbnr/pppp1ppp/4p3/8/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +French defense +rnbqkbnr/pppp1ppp/4p3/8/4P3/8/PPPPQPPP/RNB1KBNR b KQkq - +French: Chigorin variation +rnbqkbnr/pppp1ppp/4p3/8/4PP2/8/PPPP2PP/RNBQKBNR b KQkq - +French: Labourdonnais variation +rnbqkbnr/pppp1ppp/4p3/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - +Van't Kruijs opening * +rnbqkbnr/pppp1ppp/8/4N3/4p3/8/PPPPPPPP/RNBQKB1R b KQkq - +Alekhine's defense: Mokele Mbembe (B\"ucker) variation * +rnbqkbnr/pppp1ppp/8/4p2Q/4P3/8/PPPP1PPP/RNB1KBNR b KQkq - +KP: Patzer opening +rnbqkbnr/pppp1ppp/8/4p3/2B1P3/8/PPPP1PPP/RNBQK1NR b KQkq - +Bishop's opening +rnbqkbnr/pppp1ppp/8/4p3/2P5/2N5/PP1PPPPP/R1BQKBNR b KQkq - +English opening +rnbqkbnr/pppp1ppp/8/4p3/2P5/5N2/PP1PPPPP/RNBQKB1R b KQkq - +English, Nimzovich variation +rnbqkbnr/pppp1ppp/8/4p3/2P5/8/PP1PPPPP/RNBQKBNR b KQkq - +Sicilian defense * +rnbqkbnr/pppp1ppp/8/4p3/2P5/8/PP1PPPPP/RNBQKBNR w KQkq - +English opening +rnbqkbnr/pppp1ppp/8/4p3/3P4/8/PPP1PPPP/RNBQKBNR b KQkq - +Scandinavian (center counter) defense * +rnbqkbnr/pppp1ppp/8/4p3/3P4/8/PPP1PPPP/RNBQKBNR w KQkq - +Queen's pawn: Charlick (Englund) gambit +rnbqkbnr/pppp1ppp/8/4p3/4P3/2N5/PPPP1PPP/R1BQKBNR b KQkq - +Vienna game +rnbqkbnr/pppp1ppp/8/4p3/4P3/2P5/PP1P1PPP/RNBQKBNR b KQkq - +KP: Lopez opening +rnbqkbnr/pppp1ppp/8/4p3/4P3/3P4/PPP2PPP/RNBQKBNR b KQkq - +KP: Indian opening +rnbqkbnr/pppp1ppp/8/4p3/4P3/5N2/PPPP1PPP/RNBQKB1R b KQkq - +King's knight opening +rnbqkbnr/pppp1ppp/8/4p3/4P3/5P2/PPPP2PP/RNBQKBNR b KQkq - +KP: King's head opening +rnbqkbnr/pppp1ppp/8/4p3/4P3/5Q2/PPPP1PPP/RNB1KBNR b KQkq - +KP: Napoleon's opening +rnbqkbnr/pppp1ppp/8/4p3/4P3/8/PPPP1PPP/RNBQKBNR b KQkq - +King's pawn game * +rnbqkbnr/pppp1ppp/8/4p3/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +King's pawn game +rnbqkbnr/pppp1ppp/8/4p3/4P3/8/PPPPNPPP/RNBQKB1R b KQkq - +Alapin's opening +rnbqkbnr/pppp1ppp/8/4p3/4P3/P7/1PPP1PPP/RNBQKBNR b KQkq - +KP: Mengarini's opening +rnbqkbnr/pppp1ppp/8/4p3/4PP2/8/PPPP2PP/RNBQKBNR b KQkq - +King's gambit +rnbqkbnr/pppp1ppp/8/4p3/5P2/8/PPPPP1PP/RNBQKBNR b KQkq - +Fred * +rnbqkbnr/pppp1ppp/8/4p3/5P2/8/PPPPP1PP/RNBQKBNR w KQkq - +Bird: From gambit +rnbqkbnr/pppp1ppp/8/4p3/6P1/8/PPPPPP1P/RNBQKBNR b KQkq - +Reversed Grob (Borg/Basman defense/macho Grob) * +rnbqkbnr/pppp1ppp/8/4p3/8/1P6/P1PPPPPP/RNBQKBNR b KQkq - +Owen defense * +rnbqkbnr/pppp1ppp/8/4p3/8/1P6/P1PPPPPP/RNBQKBNR w KQkq - +Nimzovich-Larsen attack: modern variation +rnbqkbnr/pppp1ppp/8/4p3/8/2N5/PPPPPPPP/R1BQKBNR b KQkq - +KP: Nimzovich defense * +rnbqkbnr/pppp1ppp/8/4p3/8/2N5/PPPPPPPP/R1BQKBNR w KQkq - +Dunst (Sleipner,Heinrichsen) opening +rnbqkbnr/pppp1ppp/8/4p3/8/2P5/PP1PPPPP/RNBQKBNR b KQkq - +Caro-Kann defense * +rnbqkbnr/pppp1ppp/8/4p3/8/3P4/PPP1PPPP/RNBQKBNR w KQkq - +Mieses opening +rnbqkbnr/pppp1ppp/8/4p3/8/3P4/PPPNPPPP/R1BQKBNR b KQkq - +Valencia opening +rnbqkbnr/pppp1ppp/8/4p3/8/4P3/PPPP1PPP/RNBQKBNR b KQkq - +French defense * +rnbqkbnr/pppp1ppp/8/4p3/8/5N2/PPPPPPPP/RNBQKB1R b KQkq - +Alekhine's defense * +rnbqkbnr/pppp1ppp/8/4p3/8/5NP1/PPPPPP1P/RNBQKB1R b KQkq - +Benko's opening: reversed Alekhine +rnbqkbnr/pppp1ppp/8/4p3/8/5P2/PPPPP1PP/RNBQKBNR b KQkq - +Barnes defense * +rnbqkbnr/pppp1ppp/8/4p3/8/5P2/PPPPPKPP/RNBQ1BNR b kq - +Hammerschlag (Fried fox/Pork chop opening) +rnbqkbnr/pppp1ppp/8/4p3/8/6P1/PPPPPP1P/RNBQKBNR b KQkq - +Robatsch (modern) defense * +rnbqkbnr/pppp1ppp/8/4p3/8/7P/PPPPPPP1/RNBQKBNR b KQkq - +Carr's defense * +rnbqkbnr/pppp1ppp/8/4p3/8/8/PPPPPPPP/RNBQKBNR w KQkq - +King's pawn opening * +rnbqkbnr/pppp1ppp/8/4p3/8/N7/PPPPPPPP/R1BQKBNR b KQkq - +Lemming defense * +rnbqkbnr/pppp1ppp/8/4p3/8/P1N5/1PPPPPPP/R1BQKBNR b KQkq - +Battambang opening +rnbqkbnr/pppp1ppp/8/4p3/8/P6P/1PPPPPP1/RNBQKBNR b KQkq - +Global opening +rnbqkbnr/pppp1ppp/8/4p3/8/P7/1PPPPPPP/RNBQKBNR b KQkq - +St. George (Baker) defense * +rnbqkbnr/pppp1ppp/8/4p3/P6P/8/1PPPPPP1/RNBQKBNR b KQkq - +Crab opening +rnbqkbnr/pppp1ppp/8/4p3/P7/8/1PPPPPPP/RNBQKBNR b KQkq - +Corn stalk defense * +rnbqkbnr/pppp1ppp/8/8/2B1Pp2/8/PPPP2PP/RNBQK1NR b KQkq - +KGA: bishop's gambit +rnbqkbnr/pppp1ppp/8/8/2P1p3/5N2/PP1PPPPP/RNBQKB1R w KQkq - +English, Nimzovich, Flohr variation +rnbqkbnr/pppp1ppp/8/8/3Np3/8/PPPPPPPP/RNBQKB1R b KQkq - +Alekhine's defense * +rnbqkbnr/pppp1ppp/8/8/3PPp2/8/PPP3PP/RNBQKBNR b KQkq - +KGA: Villemson (Steinitz) gambit +rnbqkbnr/pppp1ppp/8/8/3QP3/8/PPP2PPP/RNB1KBNR b KQkq - +Center game +rnbqkbnr/pppp1ppp/8/8/3p4/5N2/PPP1PPPP/RNBQKB1R b KQkq - +Scandinavian defense * +rnbqkbnr/pppp1ppp/8/8/3pP3/2P5/PP3PPP/RNBQKBNR b KQkq - +Danish gambit +rnbqkbnr/pppp1ppp/8/8/3pP3/8/PPP2PPP/RNBQKBNR w KQkq - +Center game +rnbqkbnr/pppp1ppp/8/8/3pPP2/8/PPP3PP/RNBQKBNR b KQkq - +Halasz gambit +rnbqkbnr/pppp1ppp/8/8/4Pp1P/8/PPPP2P1/RNBQKBNR b KQkq - +KGA: Pawn's gambit (Stamma gambit) +rnbqkbnr/pppp1ppp/8/8/4Pp2/1P6/P1PP2PP/RNBQKBNR b KQkq - +KGA: Orsini gambit +rnbqkbnr/pppp1ppp/8/8/4Pp2/2N5/PPPP2PP/R1BQKBNR b KQkq - +KGA: Keres (Mason-Steinitz) gambit +rnbqkbnr/pppp1ppp/8/8/4Pp2/3B4/PPPP2PP/RNBQK1NR b KQkq - +KGA: Schurig gambit +rnbqkbnr/pppp1ppp/8/8/4Pp2/5N2/PPPP2PP/RNBQKB1R b KQkq - +King's knight's gambit +rnbqkbnr/pppp1ppp/8/8/4Pp2/5Q2/PPPP2PP/RNB1KBNR b KQkq - +KGA: Breyer gambit +rnbqkbnr/pppp1ppp/8/8/4Pp2/8/PPPP1KPP/RNBQ1BNR b kq - +KGA: Tumbleweed gambit +rnbqkbnr/pppp1ppp/8/8/4Pp2/8/PPPP2PP/RNBQKBNR w KQkq - +King's gambit accepted +rnbqkbnr/pppp1ppp/8/8/4Pp2/8/PPPPB1PP/RNBQK1NR b KQkq - +KGA: Lesser bishop's (Petroff-Jaenisch-Tartakower) gambit +rnbqkbnr/pppp1ppp/8/8/4Pp2/8/PPPPQ1PP/RNB1KBNR b KQkq - +KGA: Carrera (Basman) gambit +rnbqkbnr/pppp1ppp/8/8/4p3/4P3/PPPP1PPP/RNBQKBNR w KQkq - +French: Steinitz attack * +rnbqkbnr/pppp1ppp/8/8/4p3/8/PPPPPPPP/RNBQKBNR b KQkq - +Alekhine's defense: Brooklyn defense * +rnbqkbnr/pppp2p1/8/4pP1p/8/8/PPPP1PPP/RNBQKBNR w KQkq - +KGA: Pawn's gambit (Stamma gambit) * +rnbqkbnr/pppp2pp/4p3/5p2/2PP4/2N5/PP2PPPP/R1BQKBNR b KQkq - +Dutch defense, Rubinstein variation +rnbqkbnr/pppp2pp/4p3/5p2/2PP4/8/PP2PPPP/RNBQKBNR w KQkq - +Dutch defense +rnbqkbnr/pppp2pp/4p3/5p2/2PPP3/8/PP3PPP/RNBQKBNR b KQkq - +Dutch: Staunton gambit deferred +rnbqkbnr/pppp2pp/4p3/5p2/3P2P1/3Q4/PPP1PP1P/RNB1KBNR b KQkq - +Dutch, Von Pretzel gambit +rnbqkbnr/pppp2pp/5p2/4p3/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - +Damiano's defense +rnbqkbnr/pppp2pp/5p2/4p3/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +KP: King's head opening * +rnbqkbnr/pppp2pp/8/4Pp2/3p4/8/PPP2PPP/RNBQKBNR b KQkq - +KGD: Falkbeer, 3...e4 * +rnbqkbnr/pppp2pp/8/4pP2/8/8/PPPP1PPP/RNBQKBNR b KQkq - +King's gambit accepted * +rnbqkbnr/pppp2pp/8/4pp2/2B1P3/3P4/PPP2PPP/RNBQK1NR b KQkq - +Bishop's opening: Calabrese counter-gambit, Jaenisch variation +rnbqkbnr/pppp2pp/8/4pp2/2B1P3/5N2/PPPP1PPP/RNBQK2R b KQkq - +Latvian gambit, 3.Bc4 +rnbqkbnr/pppp2pp/8/4pp2/2B1P3/8/PPPP1PPP/RNBQK1NR b KQkq - +KGD: classical variation * +rnbqkbnr/pppp2pp/8/4pp2/2B1P3/8/PPPP1PPP/RNBQK1NR w KQkq - +Bishop's opening: Calabrese counter-gambit +rnbqkbnr/pppp2pp/8/4pp2/2P1P3/8/PP1P1PPP/RNBQKBNR b KQkq - +KGD: Mafia defense * +rnbqkbnr/pppp2pp/8/4pp2/2P5/8/PP1PPPPP/RNBQKBNR w KQkq - +Sicilian: Grand Prix attack * +rnbqkbnr/pppp2pp/8/4pp2/3P4/8/PPP1PPPP/RNBQKBNR w KQkq - +Bird's opening: Williams gambit * +rnbqkbnr/pppp2pp/8/4pp2/3PP3/8/PPP2PPP/RNBQKBNR b KQkq - +KGD: Falkbeer counter-gambit * +rnbqkbnr/pppp2pp/8/4pp2/4P3/5N2/PPPP1PPP/RNBQKB1R b KQkq - +KGD: 2...Nf6 * +rnbqkbnr/pppp2pp/8/4pp2/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - +Latvian counter-gambit +rnbqkbnr/pppp2pp/8/4pp2/4P3/5Q2/PPPP1PPP/RNB1KBNR b KQkq - +KGD: Norwalde variation * +rnbqkbnr/pppp2pp/8/4pp2/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +King's gambit * +rnbqkbnr/pppp2pp/8/4pp2/8/4P3/PPPP1PPP/RNBQKBNR w KQkq - +French: Labourdonnais variation * +rnbqkbnr/pppp2pp/8/5p2/2B1Pp2/8/PPPP2PP/RNBQK1NR w KQkq - +KGA: bishop's gambit, L\'opez-Gianutio counter-gambit +rnbqkbnr/pppp2pp/8/5p2/3pP3/2P5/PP3PPP/RNBQKBNR b KQkq - +KGD: Nimzovich counter-gambit * +rnbqkbnr/pppp2pp/8/5p2/3pP3/8/PPP2PPP/RNBQKBNR w KQkq - +KGD: Falkbeer counter-gambit * +rnbqkbnr/pppp2pp/8/5p2/4Pp2/5N2/PPPP2PP/RNBQKB1R w KQkq - +KGA: Gianutio counter-gambit +rnbqkbnr/pppp3p/6p1/4pp2/4P3/8/PPPPQPPP/RNB1KBNR b KQkq - +KGD: Keene's defense * +rnbqkbnr/ppppp1pp/5p2/8/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +Barnes defense +rnbqkbnr/ppppp1pp/5p2/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - +Gedult's opening * +rnbqkbnr/ppppp1pp/8/5p2/2P5/8/PP1PPPPP/RNBQKBNR w KQkq - +English: Anglo-Dutch defense +rnbqkbnr/ppppp1pp/8/5p2/2PP4/8/PP2PPPP/RNBQKBNR b KQkq - +Dutch defense +rnbqkbnr/ppppp1pp/8/5p2/3P2P1/8/PPP1PP1P/RNBQKBNR b KQkq - +Dutch, Krejcik gambit +rnbqkbnr/ppppp1pp/8/5p2/3P4/3Q4/PPP1PPPP/RNB1KBNR b KQkq - +Dutch, Manhattan (Alapin, Ulvestad) variation +rnbqkbnr/ppppp1pp/8/5p2/3P4/6P1/PPP1PP1P/RNBQKBNR b KQkq - +Dutch defense +rnbqkbnr/ppppp1pp/8/5p2/3P4/7P/PPP1PPP1/RNBQKBNR b KQkq - +Dutch, Korchnoi attack +rnbqkbnr/ppppp1pp/8/5p2/3P4/8/PPP1PPPP/RNBQKBNR b KQkq - +Bird's opening * +rnbqkbnr/ppppp1pp/8/5p2/3P4/8/PPP1PPPP/RNBQKBNR w KQkq - +Dutch +rnbqkbnr/ppppp1pp/8/5p2/3PP3/8/PPP2PPP/RNBQKBNR b KQkq - +Dutch: Staunton gambit +rnbqkbnr/ppppp1pp/8/5p2/4P3/5N2/PPPP1PPP/RNBQKB1R b KQkq - +R\'eti: Pirc-Lisitsin gambit +rnbqkbnr/ppppp1pp/8/5p2/4P3/8/PPPP1PPP/RNBQKBNR b KQkq - +Bird: From gambit * +rnbqkbnr/ppppp1pp/8/5p2/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +Fred +rnbqkbnr/ppppp1pp/8/5p2/6P1/8/PPPPPP1P/RNBQKBNR b KQkq - +Bird: Hobbs gambit * +rnbqkbnr/ppppp1pp/8/5p2/8/1P6/P1PPPPPP/RNBQKBNR w KQkq - +Nimzovich-Larsen attack: Dutch variation +rnbqkbnr/ppppp1pp/8/5p2/8/5N2/PPPPPPPP/RNBQKB1R w KQkq - +R\'eti v Dutch +rnbqkbnr/ppppp1pp/8/5p2/8/8/PPPPPPPP/RNBQKBNR w KQkq - +Bird's opening * +rnbqkbnr/ppppp1pp/8/5pB1/3P4/8/PPP1PPPP/RN1QKBNR b KQkq - +Dutch, 2.Bg5 variation +rnbqkbnr/ppppp1pp/8/8/3Pp3/8/PPP2PPP/RNBQKBNR w KQkq - +Dutch: Staunton gambit +rnbqkbnr/pppppp1p/6p1/8/2P5/8/PP1PPPPP/RNBQKBNR w KQkq - +English opening +rnbqkbnr/pppppp1p/6p1/8/3P4/8/PPP1PPPP/RNBQKBNR w KQkq - +Modern defense +rnbqkbnr/pppppp1p/6p1/8/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +Robatsch (modern) defense +rnbqkbnr/pppppp1p/6p1/8/7P/8/PPPPPPP1/RNBQKBNR b KQkq - +Lasker simul special * +rnbqkbnr/pppppp1p/6p1/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - +Benko's opening * +rnbqkbnr/pppppp1p/8/6p1/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +Reversed Grob (Borg/Basman defense/macho Grob) +rnbqkbnr/pppppp1p/8/6p1/5P2/8/PPPPP1PP/RNBQKBNR w KQkq - +Bird: Hobbs gambit +rnbqkbnr/pppppp1p/8/6p1/8/5N2/PPPPPPPP/RNBQKB1R w KQkq - +R\'eti: Herrstr\"om gambit +rnbqkbnr/pppppp1p/8/6p1/8/8/PPPPPPPP/RNBQKBNR w KQkq - +Grob's attack * +rnbqkbnr/ppppppp1/7p/8/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +Carr's defense +rnbqkbnr/ppppppp1/7p/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - +Clemenz (Mead's, Basman's or de Klerk's) opening * +rnbqkbnr/ppppppp1/8/7p/8/6P1/PPPPPP1P/RNBQKBNR w KQkq - +Lasker simul special +rnbqkbnr/ppppppp1/8/7p/8/8/PPPPPPPP/RNBQKBNR w KQkq - +Anti-Borg (Desprez) opening * +rnbqkbnr/pppppppp/8/4P3/8/8/PPPP1PPP/RNBQKBNR w KQkq - +Alekhine's defense: Brooklyn defense +rnbqkbnr/pppppppp/8/8/1P6/8/P1PPPPPP/RNBQKBNR b KQkq - +Polish (Sokolsky) opening +rnbqkbnr/pppppppp/8/8/2P5/8/PP1PPPPP/RNBQKBNR b KQkq - +English opening +rnbqkbnr/pppppppp/8/8/3P4/8/PPP1PPPP/RNBQKBNR b KQkq - +Queen's pawn +rnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBNR b KQkq - +King's pawn opening +rnbqkbnr/pppppppp/8/8/5P2/8/PPPPP1PP/RNBQKBNR b KQkq - +Bird's opening +rnbqkbnr/pppppppp/8/8/6P1/8/PPPPPP1P/RNBQKBNR b KQkq - +Grob's attack +rnbqkbnr/pppppppp/8/8/7P/8/PPPPPPP1/RNBQKBNR b KQkq - +Anti-Borg (Desprez) opening +rnbqkbnr/pppppppp/8/8/8/1P6/P1PPPPPP/RNBQKBNR b KQkq - +Nimzovich-Larsen attack +rnbqkbnr/pppppppp/8/8/8/2N5/PPPPPPPP/R1BQKBNR b KQkq - +Dunst (Sleipner, Heinrichsen) opening +rnbqkbnr/pppppppp/8/8/8/2P5/PP1PPPPP/RNBQKBNR b KQkq - +Saragossa opening +rnbqkbnr/pppppppp/8/8/8/3P4/PPP1PPPP/RNBQKBNR b KQkq - +Mieses opening +rnbqkbnr/pppppppp/8/8/8/4P3/PPPP1PPP/RNBQKBNR b KQkq - +Van't Kruijs opening +rnbqkbnr/pppppppp/8/8/8/5N2/PPPPPPPP/RNBQKB1R b KQkq - +R\'eti opening +rnbqkbnr/pppppppp/8/8/8/5P2/PPPPP1PP/RNBQKBNR b KQkq - +Gedult's opening +rnbqkbnr/pppppppp/8/8/8/6P1/PPPPPP1P/RNBQKBNR b KQkq - +Benko's opening +rnbqkbnr/pppppppp/8/8/8/7N/PPPPPPPP/RNBQKB1R b KQkq - +Amar (Paris) opening +rnbqkbnr/pppppppp/8/8/8/7P/PPPPPPP1/RNBQKBNR b KQkq - +Clemenz (Mead's, Basman's or de Klerk's) opening +rnbqkbnr/pppppppp/8/8/8/N7/PPPPPPPP/R1BQKBNR b KQkq - +Durkin's attack +rnbqkbnr/pppppppp/8/8/8/P7/1PPPPPPP/RNBQKBNR b KQkq - +Anderssen's opening +rnbqkbnr/pppppppp/8/8/P7/8/1PPPPPPP/RNBQKBNR b KQkq - +Ware (Meadow Hay) opening +rnbqkr2/pppp1pQp/8/2b1P3/3P4/5N2/PPP3PP/RNB1KB1n b KQq - +Latvian: Behting variation * +rnbqkr2/ppppbp1p/5N2/4Q3/8/8/PPPP1nPP/R1B1KBNR b KQq - +Blackburne shilling gambit * +rnbqr1k1/1p1p1ppp/pbp2n2/4p3/1P2P3/P1NP1N2/2P1BPPP/R1BQ1RK1 w - - +Ruy Lopez: closed, Suetin variation * +rnbqr1k1/1p3pp1/2p2n1p/p1bpp3/4P3/PBNP1N2/1PP1QPPP/R1B1K2R w KQ - +Giuoco Piano: Tarrasch variation * +rnbqr1k1/1pb2ppp/2p2n2/p2pp3/NPP1P3/P2P1N2/2Q1BPPP/R1B1K2R w KQ - +Ruy Lopez: closed, Balla variation * +rnbqr1k1/1ppp1ppp/1b3n2/p3p3/1P2P3/P1N2N2/2PPBPPP/R1BQ1RK1 w - - +Ruy Lopez: closed, anti-Marshall 8.a4 * +rnbqr1k1/p1pp1ppp/5n2/1p2p3/1bP1P3/2N3P1/PP1P1PBP/R1BQK1NR w KQ - +Sicilian: Nimzovich-Rossolimo attack, Gurgenidze variation * +rnbqr1k1/pp1p1pp1/1bp2n1p/4p3/1P2P3/P1NP1N1P/2P1BPP1/R1BQ1RK1 b - - +Ruy Lopez: closed, Smyslov defense * +rnbqr1k1/pp1p1pp1/1bp2n1p/4p3/1P2P3/P1NP1N2/1BP1BPPP/R2Q1RK1 b - - +Ruy Lopez: closed, Flohr-Zaitsev system (Lenzerheide variation) * +rnbqr1k1/pp1p1pp1/1bp2n1p/4p3/1P2P3/P1NP1N2/2P1BPPP/R1BQ1RK1 w - - +Ruy Lopez: closed, 9.h3 * +rnbqr1k1/pp1p1pp1/1bp2n1p/4p3/1P2P3/P1NP4/2PNBPPP/R1BQ1RK1 b - - +Ruy Lopez: closed, Ragozin-Petrosian (`Keres') variation * +rnbqr1k1/pp1p1pp1/1bp2n1p/4p3/1P2P3/P1NPBN2/2P1BPPP/R2Q1RK1 b - - +Ruy Lopez: closed, Kholmov variation * +rnbqr1k1/pp1p1pp1/1bp2n1p/4p3/1P2P3/P2P1N2/2P1BPPP/RNBQ1RK1 b - - +Ruy Lopez: closed, Breyer defense * +rnbqr1k1/pp1p1pp1/1bp2n1p/4p3/PP2P3/2NP1N2/2P1BPPP/R1BQ1RK1 b - - +Ruy Lopez: closed, Keres (9...a5) variation * +rnbqr1k1/pp1p1ppp/1bp2n2/4P3/1P1p4/P1N2N2/2P1BPPP/R1BQ1RK1 b - - +Ruy Lopez: Marshall, Herman Steiner variation * +rnbqr1k1/pp1p1ppp/1bp2n2/4p3/1P1PP3/P1N2N2/2P1BPPP/R1BQ1RK1 b - - +Ruy Lopez: Marshall counter-attack * +rnbqr1k1/pp1p1ppp/1bp2n2/4p3/1P2P3/P1N2N2/2PPBPPP/R1BQ1RK1 w - - +Ruy Lopez: closed, 8.c3 * +rnbqr1k1/pp1p1ppp/1bp2n2/4p3/1P2P3/P1NP1N2/2P1BPPP/R1BQ1RK1 b - - +Ruy Lopez: closed (with ...d6) * +rnbqr1k1/pp3p1p/1bp3pQ/3p4/1P1N4/P1PB4/5PPP/R1B2RK1 b - - +Ruy Lopez: Marshall, main line, 14...Qh3 * +rnbqr1k1/pp3pbp/3p1np1/2pP4/4P3/2N2N2/PP2BPPP/R1BQ1RK1 w - - +Benoni: classical, 9...Re8 +rnbqr1k1/pp3pbp/3p1np1/2pP4/4P3/2N5/PP1NBPPP/R1BQ1RK1 b - - +Benoni: classical, 9...Re8, 10.Nd2 +rnbqr1k1/pp3pbp/3p1np1/2pP4/4PP2/2N2N2/PP2B1PP/R1BQK2R w KQ - +Benoni: four pawns attack, main line +rnbqr1k1/pp3pp1/1bp2n1p/3pp3/1P2P3/P2P1N2/2P1BPPP/RNBQ1RK1 w - - +Ruy Lopez: closed, Breyer, 10.d4 * +rnbqr1k1/pp3pp1/1bp2n1p/3pp3/1P2P3/P2P1N2/2PNBPPP/R1BQ1RK1 b - - +Ruy Lopez: closed, Breyer, Borisenko variation * +rnbqr1k1/pp3pp1/1bp4p/3pp2n/1P2P3/P2P1N2/2PNBPPP/R1BQ1RK1 w - - +Ruy Lopez: closed, Breyer, Simagin variation * +rnbqr1k1/pp3ppB/3b1n2/3pN1B1/3p1P2/8/PPP3PP/RN1Q1RK1 b - - +Petrov: classical attack, Marshall trap * +rnbqr1k1/pp3ppp/1bp2n2/3pp1B1/1P2P3/P1NP1N2/2P1BPPP/R2Q1RK1 b - - +Ruy Lopez: closed, Bogolyubov variation * +rnbqr1k1/pp3ppp/1bp2n2/3pp3/1P2P3/P1NP1N2/2P1BPPP/R1BQ1RK1 w - - +Ruy Lopez: closed, 9.d4 * +rnbqr1k1/pp3ppp/1bp2n2/4N3/1P1Pp3/P1N1B3/2P1BPPP/R2QK2R w KQ - +Ruy Lopez: open, 9...Be7, 10.Re1 * +rnbqr1k1/pp3ppp/1bp5/3nN3/1P1PN3/P3B3/2P1BPPP/R2Q1RK1 b - - +Ruy Lopez: open, Breslau variation * +rnbqr1k1/pp3ppp/1bpp1n2/4p3/1P2P3/P1NP1N2/2P1BPPP/R1BQ1RK1 w - - +Ruy Lopez: closed, Pilnik variation * +rnbqr1k1/pp3ppp/3b1n2/2ppN1B1/3P1P2/2N5/PPP1B1PP/R2QK2R w KQ - +Petrov: classical attack, Krause variation * +rnbqr1k1/pp3ppp/3b1n2/2ppN1BB/3P1P2/2N5/PPP3PP/R2QK2R b KQ - +Petrov: classical attack, Mar\'oczy variation * +rnbqr1k1/ppb2pp1/2p2n1p/3pp3/1PP1P3/P1NP1N2/4BPPP/R1BQ1RK1 b - - +Ruy Lopez: closed, Borisenko defense * +rnbqr1k1/ppb2pp1/2p2n1p/3pp3/NP2P3/P1PP1N2/2Q1BPPP/R1B2RK1 b - - +Ruy Lopez: closed, Rossolimo defense * +rnbqr1k1/ppb2pp1/2p2n1p/3pp3/NPP1P3/P2P1N2/2Q1BPPP/R1B2RK1 b - - +Ruy Lopez: closed, Chigorin defense * +rnbqr1k1/ppb2pp1/2p2n1p/3pp3/NPP1P3/P2P4/3NBPPP/R1BQ1RK1 b - - +Ruy Lopez: closed, Keres (...Nd7) defense * +rnbqr1k1/ppbp1pp1/2p2n1p/4p3/NP2P3/P2P1N2/2P1BPPP/R1BQ1RK1 w - - +Ruy Lopez: closed (9...Na5) * +rnbqr1k1/ppbp1pp1/2p2n1p/4p3/NPP1P3/P2P1N2/4BPPP/R1BQ1RK1 b - - +Ruy Lopez: closed (10...c5) * +rnbqr1k1/ppbp1ppp/2p2n2/4p3/1P2P3/P1NP1N2/2P1BPPP/R1BQ1RK1 w - - +Ruy Lopez: closed, Lutikov variation * +rnbqr1k1/ppp2ppp/1b3n2/3pp3/1P2P3/P1NP1N2/2P1BPPP/R1BQK2R w KQ - +Ruy Lopez: closed, 7...d6, 8.d4 * +rnbqr1k1/ppp2ppp/3b1n2/3pN3/3P4/2N5/PPP1BPPP/R1BQK2R w KQ - +Petrov: classical attack, Chigorin variation * +rnbqr1k1/ppp2ppp/5n2/2PP4/2B5/2N1B3/PPP2PpP/R2QK2R w KQ - +two knights: Max Lange attack, Schlechter variation * +rnbqr1k1/ppp2ppp/8/2PP4/2B3n1/2N1BpP1/PPP2P1P/R2QK2R b KQ - +two knights: Max Lange attack, Loman defense * +rnbqr1k1/pppp1ppp/1b3n2/4p3/1P2P3/P1N2N2/1BPPBPPP/R2QK2R b KQ - +Ruy Lopez: Trajkovi\'c counter-attack * +rnbqr1k1/pppp1ppp/1b3n2/4p3/1P2P3/P1N2N2/2PPBPPP/R1BQ1RK1 b - - +Ruy Lopez: closed, 7...O-O * +rnbqr1k1/pppp1ppp/1b3n2/4p3/1P2P3/P1N2N2/2PPBPPP/R1BQK2R w KQ - +Ruy Lopez: closed * +rnbqr1k1/pppp1ppp/5n2/b3p3/4P3/P1NP1N2/1PP1BPPP/R1BQK2R b KQ - +Ruy Lopez: closed, Averbach variation * +rnbr2k1/1pq1ppbp/5np1/p1pp4/3P4/1PP1PN2/P2NBPPP/R1BQ1RK1 w - - +Catalan: closed, Zagoryansky variation * +rnbr2k1/pp2qppp/5n2/2b1N3/3Pp3/P1N1B3/2PQBPPP/R4RK1 b - - +Ruy Lopez: open, Howell attack, Ekstr\"om variation * +rnq1kb1r/pp3ppp/4pn2/3p1b2/3P4/NQ2PN2/PP1B1PPP/R3KB1R b KQkq - +QGD Slav: Landau variation diff --git a/lasker-2.2.3/data/book/nic000.idx b/lasker-2.2.3/data/book/nic000.idx new file mode 100644 index 0000000..b0cee3c --- /dev/null +++ b/lasker-2.2.3/data/book/nic000.idx @@ -0,0 +1,2172 @@ +1r1qr1k1/p1n2pbp/bp1p1np1/2pP2B1/P1N1P3/2N2P2/1P2B1PP/R2Q1R1K b - - +BI.06 +1rbq1rk1/1pp1ppbp/p1np1np1/8/2PP4/2N2NPP/PP2PPB1/R1BQ1RK1 w - - +KI.70 +1rbq1rk1/1pp1ppbp/p1np1np1/8/2PPP2P/2N1BP2/PPQ1N1P1/R3KB1R b KQ - +KI.33 +1rbq1rk1/1pp1ppbp/p1np1np1/8/2PPP3/2N1BP2/PP1Q2PP/R1N1KB1R b KQ - +KI.34 +1rbq1rk1/1pp1ppbp/p1np1np1/8/2PPP3/2N1BP2/PP1QN1PP/R3KB1R w KQ - +KI.35 +1rbq1rk1/4ppbp/p2p1np1/nppP4/2P5/1PN3P1/PBQNPPBP/R4RK1 b - - +KI.66 +1rbq1rk1/pp2ppbp/2np1np1/2p5/4P3/2NP1NP1/PPP2PBP/R1BQ1RK1 w - - +EO.13* +1rbqk1nr/pp1pppbp/2n3p1/2p5/4P3/2N3P1/PPPP1PBP/R1BQK1NR w KQk - +EO.15* +1rbqk1nr/pp2ppbp/2np2p1/2p5/4P3/2NP2P1/PPP2PBP/R1BQK1NR w KQk - +EO.16* +1rbqr1k1/1p1n1pbp/p2p1np1/2pP4/P1N5/2N3PP/1P2PPB1/R1BQ1RK1 b - - +BI.21 +2bq1rk1/1p1nbppp/r1n5/p3p3/2Pp4/P2P1NP1/1P1N1PBP/R1BQR1K1 w - - +BI.01* +2kr1b1r/pppq1ppp/2n5/3np3/6b1/2NPPN2/PP2BPPP/R1BQ1RK1 b - - +SI.28* +2kr1b1r/pppq1ppp/2n5/3np3/6b1/P1NPPN2/1P1B1PPP/R2QKB1R b KQ - +SI.30* +2kr1b1r/pppq1ppp/2n5/3np3/6b1/P1NPPN2/1P3PPP/R1BQKB1R w KQ - +SI.29* +2rqkb1r/pp2pppp/2n2n2/2Pp3b/8/4PN1P/PPP1BPP1/RNBQ1RK1 b k - +QO.07* +2rqkb1r/pp2pppp/5n2/3p4/3P4/1P5P/P1P1QPP1/RNB2RK1 b k - +QO.06* +2rqkb1r/pp3ppp/2n1pn2/2pp3b/3P4/1P2PN1P/PBP1BPP1/RN1Q1RK1 b k - +QO.09* +2rqkb1r/pp3ppp/2n1pn2/2pp4/3P2b1/4PN2/PPPNBPPP/R1BQ1RK1 w k - +QO.11* +3rkb1r/1pq2ppp/p1n1pn2/2p2b2/Q2P4/2N1PN2/PP2BPPP/R1B2RK1 b k - +QO.02* +r1b1k2r/ppp2pp1/3q1nn1/3p4/7p/2P4P/PP1NPPP1/R2QKBNR w KQkq - +CK.12* +r1b1kb1r/1pq2ppp/p1nppn2/8/3NPP2/2N5/PPP1B1PP/R1BQ1RK1 w kq - +SI.24 +r1b1kb1r/pp1n1ppp/2p1pn2/q2p2B1/2PP4/2N1PN2/PP3PPP/R2QKB1R w KQkq - +QO.15 +r1b1kb1r/pp2pppp/1qn2n2/2pp4/3P4/5NP1/PPP1PPBP/RNBQK2R w KQkq - +GI.10* +r1b1kb1r/ppqppppp/2n2n2/1Bp5/8/4PN2/PPPP1PPP/RNBQK2R w KQkq - +EO.58* +r1b1kbnr/1p2pppp/p1q5/2pp4/8/4PN2/PPPP1PPP/RNBQ1RK1 w kq - +NI.20* +r1b1kbnr/pp3ppp/2n5/2p1q3/4p3/2N1P3/PP1P1PPP/R1BQKBNR w KQkq - +EO.55* +r1b1kbnr/ppq1pppp/2n5/1Bp5/2p5/4PN2/PP1P1PPP/RNBQ1RK1 b kq - +NI.21* +r1b1kbnr/ppq1pppp/2n5/1Bpp4/2P5/4PN2/PP1P1PPP/RNBQK2R b KQkq - +NI.22* +r1b1kbnr/ppq1pppp/2n5/1Bpp4/3P4/4PN2/PPP2PPP/RNBQK2R b KQkq - +NI.23* +r1b1kbnr/ppq1pppp/2n5/1Bpp4/8/4PN2/PPPP1PPP/RNBQK2R w KQkq - +NI.24* +r1b1kbnr/ppqp1ppp/2n1p3/8/3NP3/2N5/PPP2PPP/R1BQKB1R w KQkq - +SI.40 +r1b2rk1/1p1nqppp/2n5/p3p3/2Pp4/P2P1NP1/1P3PBP/RN1Q1RK1 w - - +BI.14* +r1b2rk1/2q1bppp/p2p1n2/npp1p3/3PP3/2P2N1P/PPBN1PP1/R1BQR1K1 b - - +RL.24 +r1b2rk1/pp2bppp/2n1pn2/q2p4/2P2B2/P1N1PN2/1PQ2PPP/3RKB1R w K - +QO.02 +r1b2rk1/pp2ppbp/2n2np1/2pq4/8/1P2PN2/PB1PBPPP/RN1QK2R w KQ - +EO.39* +r1b2rk1/pp2ppbp/2q2np1/2pp4/2P5/1P2P3/PB1PBPPP/RN1Q1RK1 b - - +QI.13* +r1b2rk1/pp2ppbp/2q2np1/2pp4/5P2/1P2P3/PBPPB1PP/RN1Q1RK1 b - - +QI.12* +r1b2rk1/ppq1ppbp/2n2np1/2ppN3/8/1P2P3/PBPPBPPP/RN1Q1RK1 w - - +QI.11* +r1b2rk1/ppq2ppp/2n1pn2/2p5/2BP4/P1P1PN2/5PPP/R1BQ1RK1 w - - +NI.01 +r1bq1rk1/1p1n1pbp/2pp1np1/p3p3/2PPP3/2N2N2/PP3PPP/R1BQRBK1 w - - +KI.09 +r1bq1rk1/1p1n1pbp/p2p1np1/2pP4/P3P3/2N2N2/1P2BPPP/R1BQ1RK1 w - - +BI.15 +r1bq1rk1/1p1nb1pp/2n2p2/p3p3/2Pp4/1P1P1NP1/P1N2PBP/R1BQR1K1 b - - +BI.07* +r1bq1rk1/1p1nb1pp/2n2p2/p3p3/2Pp4/3P2P1/PPNN1PBP/R1BQR1K1 b - - +BI.08* +r1bq1rk1/1p1nb1pp/2n5/p3pp2/2Pp4/P2P1NP1/1P1N1PBP/R1BQR1K1 w - - +BI.02* +r1bq1rk1/1p1nbppp/2n5/p3p3/2Pp4/P2P1NP1/1P1N1PBP/R1BQR1K1 b - - +BI.03* +r1bq1rk1/1p1nbppp/2n5/p3p3/2PpN3/3P1NP1/PP3PBP/R1BQR1K1 b - - +BI.04* +r1bq1rk1/1p1nppbp/2n3p1/p7/2Pp4/P2P1NP1/1P1N1PBP/R1BQR1K1 b - - +BI.22* +r1bq1rk1/1p2bppp/2n2n2/p3p3/2Pp4/P2P1NP1/1P1N1PBP/R1BQ1RK1 b - - +BI.15* +r1bq1rk1/1p2ppb1/2n3pp/p1n5/2Pp4/P2P1NP1/1P1N1PBP/1RBQR1K1 w - - +BI.21* +r1bq1rk1/1p3pp1/2n2b1p/p3p3/2Pp4/P2P1NP1/1P1N1PBP/R2Q1RK1 b - - +BI.10* +r1bq1rk1/1p3ppp/2n1pn2/pBbp4/5B2/2P1PN2/PP3PPP/RN1QK2R w KQ - +SL.05* +r1bq1rk1/1p3ppp/p1nbpn2/1Bpp4/2PP4/2N1PN2/PP3PPP/R1BQ1RK1 w - - +NI.02* +r1bq1rk1/1pp1ppbp/p1np1np1/8/2PP4/2N2NP1/PP2PPBP/R1BQ1RK1 w - - +KI.71 +r1bq1rk1/2p1bpp1/p1np1n1p/1p2p3/4P3/1BP2N1P/PP1P1PP1/RNBQR1K1 w - - +RL.22 +r1bq1rk1/2p1bppp/p1np1n2/1p2p3/3PP3/1BP2N2/PP3PPP/RNBQR1K1 b - - +RL.20 +r1bq1rk1/2p1bppp/p1np1n2/1p2p3/4P3/1BP2N1P/PP1P1PP1/RNBQR1K1 b - - +RL.21 +r1bq1rk1/2p1bppp/p2p1n2/np2p3/4P3/2P2N1P/PPBP1PP1/RNBQR1K1 b - - +RL.23 +r1bq1rk1/2ppbppp/p1n2n2/1p2p3/P3P3/1B3N2/1PPP1PPP/RNBQR1K1 b - - +RL.18 +r1bq1rk1/3nppbp/p1pp1np1/1p6/2PPP3/2NBBP2/PP2N1PP/R2Q1RK1 w - - +KI.46 +r1bq1rk1/5ppp/p1p1pn2/2bp4/2P5/2N1PN2/PPQ2PPP/R1B2RK1 b - - +NI.01* +r1bq1rk1/p1p2ppp/5n2/3p2B1/1b6/2NB4/PPP2PPP/R2Q1RK1 b - - +SO.03 +r1bq1rk1/p3bp1p/2n2np1/1pp1p3/3pPP1N/3P2P1/PPP1N1BP/R1BQ1RK1 b - - +KI.04* +r1bq1rk1/p3bppp/2n2n2/1pp1p3/3pP3/3P1NP1/PPP1NPBP/R1BQ1RK1 w - - +KI.05* +r1bq1rk1/pp1n1pbp/2pp1np1/4p3/2PPP3/2N1BP2/PP1QN1PP/R3KB1R w KQ - +KI.42 +r1bq1rk1/pp1n1pbp/2pp1np1/4p3/2PPP3/2N2N2/PP3PPP/R1BQRBK1 b - - +KI.10 +r1bq1rk1/pp1n1pbp/2pp1np1/4p3/2PPP3/2N2NP1/PP3PBP/R1BQ1RK1 w - - +KI.63 +r1bq1rk1/pp1n1pbp/2pp1np1/4p3/2PPP3/2N2NPP/PP3PB1/R1BQ1RK1 b - - +KI.62 +r1bq1rk1/pp1n1ppp/4pn2/2p5/1bBP4/2N1PN2/PP3PPP/R1BQ1RK1 w - - +NI.03 +r1bq1rk1/pp1nbppp/2n5/2p1p3/3pP3/3P1NP1/PPP1NPBP/R1BQ1RK1 w - - +KI.07* +r1bq1rk1/pp1nbppp/2n5/4p3/2Pp4/3P1NP1/PP1N1PBP/R1BQR1K1 b - - +BI.05* +r1bq1rk1/pp1nbppp/2n5/4p3/2Pp4/N2P1NP1/PP3PBP/R1BQR1K1 b - - +BI.09* +r1bq1rk1/pp1pppbp/2n2np1/1Bp5/4P3/2N2N2/PPPP1PPP/R1BQ1RK1 w - - +EO.01* +r1bq1rk1/pp1pppbp/2n2np1/2p5/2P5/1P2PN2/PB1PBPPP/RN1QK2R b KQ - +EO.40* +r1bq1rk1/pp1pppbp/2n2np1/2p5/2P5/1P3NP1/PB1PPPBP/RN1QK2R b KQ - +EO.48* +r1bq1rk1/pp1pppbp/2n2np1/2p5/2P5/2N2NP1/PP1PPPBP/R1BQ1RK1 b - - +EO.27* +r1bq1rk1/pp1pppbp/2n2np1/2p5/2P5/2N2NP1/PP1PPPBP/R1BQ1RK1 w - - +EO.27 +r1bq1rk1/pp1pppbp/2n2np1/8/2PN4/2N1P3/PP2BPPP/R1BQK2R b KQ - +EO.41* +r1bq1rk1/pp1pppbp/2n2np1/8/2PN4/2N3P1/PP2PPBP/R1BQ1RK1 b - - +EO.26 +r1bq1rk1/pp2bppp/2n1p3/2pn4/3PP3/2N2NP1/PP3PBP/R1BQ1RK1 b - - +TD.02 +r1bq1rk1/pp2bppp/2n2n2/2p1p3/3pP3/3P1NP1/PPPN1PBP/R1BQ1RK1 w - - +KI.12* +r1bq1rk1/pp2bppp/2n2n2/2pp2B1/3P4/2N2NP1/PP2PPBP/R2Q1RK1 b - - +TD.03 +r1bq1rk1/pp2bppp/2n2n2/2pp4/3P4/2N2NP1/PP2PPBP/R1BQ1RK1 w - - +TD.04 +r1bq1rk1/pp2bppp/2n2n2/2ppp3/4P3/3P1NP1/PPP2PBP/RNBQ1RK1 w - - +KI.15* +r1bq1rk1/pp2bppp/2n2n2/2ppp3/4P3/3P1NP1/PPPN1PBP/R1BQ1RK1 b - - +KI.14* +r1bq1rk1/pp2bppp/2n2n2/4p1B1/2Pp4/3P1NP1/PP3PBP/RN1Q1RK1 b - - +BI.16* +r1bq1rk1/pp2bppp/2n5/2pp4/3P4/5NP1/PP2PPBP/R1BQ1RK1 w - - +TD.01 +r1bq1rk1/pp2bppp/2nn4/2p1p3/3pPP2/3P2P1/PPPNN1BP/R1BQ1RK1 b - - +KI.01* +r1bq1rk1/pp2bppp/2nppn2/6B1/3NP3/2N5/PPPQ1PPP/2KR1B1R w - - +SI.28 +r1bq1rk1/pp2nppp/2nb4/4p3/2Pp4/3P1NP1/PP3PBP/RNBQ1RK1 w - - +BI.36* +r1bq1rk1/pp2ppb1/2n2npp/2pp4/8/P1NP1NP1/1PP1PPBP/1RBQ1RK1 b - - +KI.70* +r1bq1rk1/pp2ppbp/2n2np1/2p5/2P5/2N2NP1/PP2PPBP/R1BQ1RK1 b - - +KI.68* +r1bq1rk1/pp2ppbp/2n2np1/2p5/2P5/2N2NP1/PP2PPBP/R1BQ1RK1 w - - +KI.68 +r1bq1rk1/pp2ppbp/2n2np1/2p5/N1Pp4/3P1NP1/PP2PPBP/R1BQ1RK1 b - - +KI.67* +r1bq1rk1/pp2ppbp/2n2np1/2pp4/2P5/3P1NP1/PP2PPBP/RNBQ1RK1 w - - +KI.69* +r1bq1rk1/pp2ppbp/2n2np1/2pp4/4P3/3P1NP1/PPPN1PBP/R1BQ1RK1 b - - +KI.65* +r1bq1rk1/pp2ppbp/2n2np1/2pp4/8/1P2PN2/PBPPBPPP/RN1Q1RK1 w - - +QI.09* +r1bq1rk1/pp2ppbp/2n2np1/2pp4/8/2NP1NP1/PPP1PPBP/R1BQ1RK1 w - - +KI.72* +r1bq1rk1/pp2ppbp/2n2np1/2pp4/8/2PP1NP1/PP2PPBP/RNBQ1RK1 w - - +KI.75* +r1bq1rk1/pp2ppbp/2n2np1/2pp4/8/P1NP1NP1/1PP1PPBP/R1BQ1RK1 b - - +KI.71* +r1bq1rk1/pp2ppbp/2n2np1/2pp4/Q7/2PP1NP1/PP2PPBP/RNB2RK1 b - - +KI.74* +r1bq1rk1/pp2ppbp/2n2np1/2ppN3/8/1P2P3/PBPPBPPP/RN1Q1RK1 b - - +QI.10* +r1bq1rk1/pp2ppbp/2n2np1/3p4/2PP4/2N2N2/PP2BPPP/R1BQ1RK1 b - - +TD.04* +r1bq1rk1/pp2ppbp/2n2np1/8/2Pp4/3P1NP1/PP3PBP/RNBQ1RK1 w - - +BI.24* +r1bq1rk1/pp2ppbp/2n2np1/8/2Pp4/3P1NP1/PP3PBP/RNBQR1K1 b - - +BI.23* +r1bq1rk1/pp2ppbp/2n3p1/2pn4/8/2N2NP1/PP1PPPBP/R1BQ1RK1 w - - +EO.26* +r1bq1rk1/pp2ppbp/2n3p1/8/2BPP3/4B3/P3NPPP/R2Q1RK1 b - - +GI.06 +r1bq1rk1/pp2ppbp/2np1np1/8/2BNP3/2N1BP2/PPPQ2PP/R3K2R b KQ - +SI.18 +r1bq1rk1/pp2ppbp/3p1np1/n1pP4/2P5/2N2NP1/PP2PPBP/R1BQ1RK1 w - - +KI.67 +r1bq1rk1/pp2ppbp/5np1/3p4/2PP4/2N5/PP2BPPP/R1BQ1RK1 b - - +TD.01* +r1bq1rk1/pp3pb1/2n2npp/2ppp3/4P3/2PP1NP1/PP1N1PBP/R1BQ1RK1 w - - +KI.62* +r1bq1rk1/pp3pb1/2n2npp/2ppp3/4P3/2PP1NP1/PP1N1PBP/R1BQR1K1 b - - +KI.61* +r1bq1rk1/pp3pbp/2n2np1/2ppp3/4P3/2PP1NP1/PP1N1PBP/R1BQ1RK1 b - - +KI.63* +r1bq1rk1/pp3pbp/2n2np1/2ppp3/4P3/3P1NP1/PPPN1PBP/R1BQ1RK1 w - - +KI.64* +r1bq1rk1/pp3pbp/2n2np1/3pp3/2PN4/2N1P3/PP2BPPP/R1BQ1RK1 w - - +TD.02* +r1bq1rk1/pp3ppp/2n1pn2/1Bbp4/2P5/4PN2/PP1N1PPP/R1BQ1RK1 b - - +NI.03* +r1bq1rk1/pp3ppp/2n1pn2/2pp4/1bPP4/P1NBPN2/1P3PPP/R1BQ1RK1 b - - +NI.02 +r1bq1rk1/pp3ppp/2n2n2/1Bbp4/8/1P2PN2/P4PPP/RNBQ1RK1 b - - +NI.04* +r1bq1rk1/pp3ppp/2nbpn2/1Bpp4/2PP4/4PN2/PP3PPP/RNBQ1RK1 w - - +NI.05* +r1bq1rk1/ppp1b1pp/2n5/3npp2/8/P1NPPN2/1PQ2PPP/R1B1KB1R b KQ - +SI.24* +r1bq1rk1/ppp1bppp/2n2n2/3pp1B1/8/3P1NP1/PPP1PPBP/RN1Q1RK1 b - - +PU.01* +r1bq1rk1/ppp1n1bp/3p2p1/3Ppp1n/1PP1P3/2N2NP1/P3BP1P/R1BQ1RK1 w - - +KI.04 +r1bq1rk1/ppp1npbp/3p1np1/3Pp3/1PP1P3/2N2N2/P3BPPP/R1BQ1RK1 b - - +KI.05 +r1bq1rk1/ppp1npbp/3p1np1/3Pp3/2P1P3/2N2N2/PP1BBPPP/R2Q1RK1 b - - +KI.06 +r1bq1rk1/ppp1npbp/3p1np1/3Pp3/2P1P3/2N5/PP1NBPPP/R1BQ1RK1 b - - +KI.07 +r1bq1rk1/ppp1npbp/3p1np1/3Pp3/2P1P3/2N5/PP2BPPP/R1BQNRK1 b - - +KI.03 +r1bq1rk1/ppp1ppbp/2np1np1/8/2PP4/2N2NP1/PP2PPBP/R1BQ1RK1 b - - +KI.72 +r1bq1rk1/ppp1ppbp/2np1np1/8/2PP4/2N2NP1/PP2PPBP/R1BQK2R w KQ - +KI.73 +r1bq1rk1/ppp1ppbp/2np1np1/8/2PPP3/2N1BP2/PP4PP/R2QKBNR w KQ - +KI.36 +r1bq1rk1/ppp2pbp/2np1np1/4p3/2P5/2NP1NP1/PP2PPBP/1RBQ1RK1 b - - +EO.13 +r1bq1rk1/ppp2pbp/2np1np1/4p3/2PPP3/2N1BN2/PP2BPPP/R2Q1RK1 b - - +KI.08 +r1bq1rk1/ppp2ppp/1n3n2/8/1b1P4/2NB4/PP2NPPP/R1BQK2R b KQ - +FR.23* +r1bq1rk1/pppn1pbp/3p1np1/3Pp3/2P1P3/2N2N2/PP2BPPP/R1BQ1RK1 b - - +KI.12 +r1bq1rk1/pppn1pbp/3p1np1/3Pp3/2P1P3/2N2N2/PP2BPPP/R1BQK2R w KQ - +KI.16 +r1bq1rk1/pppn1pbp/3p1np1/4p3/2PP4/2N2NP1/PP2PPBP/R1BQ1RK1 w - - +KI.65 +r1bq1rk1/pppn1pbp/3p1np1/4p3/2PPP3/2N1BN2/PP2BPPP/R2Q1RK1 b - - +KI.13 +r1bq1rk1/pppn1pbp/3p1np1/4p3/2PPP3/2N2N2/PP2BPPP/R1BQ1RK1 w - - +KI.14 +r1bq1rk1/pppn1pbp/3p1np1/4p3/2PPP3/2N2N2/PP2BPPP/R1BQR1K1 b - - +KI.11 +r1bq1rk1/pppn1pbp/3p1np1/4p3/2PPP3/2N2NP1/PP3PBP/R1BQ1RK1 b - - +KI.64 +r1bq1rk1/pppnbppp/4pn2/3p2B1/2PP4/2N1PN2/PP3PPP/2RQKB1R b K - +QO.11 +r1bq1rk1/pppnbppp/4pn2/3p2B1/2PP4/2N1PN2/PP3PPP/R2QKB1R w KQ - +QO.12 +r1bq1rk1/pppnn1bp/3p2p1/3Ppp2/2P1P3/2N2P2/PP2B1PP/R1BQNRK1 w - - +KI.02 +r1bq1rk1/pppnn1bp/3p2p1/3Ppp2/2P1P3/2NN4/PP2BPPP/R1BQ1RK1 w - - +KI.01 +r1bq1rk1/pppnppbp/3p1np1/8/2PPP3/2N1BP2/PP4PP/R2QKBNR w KQ - +KI.48 +r1bq1rk1/pppp1ppp/2n2n2/4p3/1bP5/2N2NP1/PP1PPPBP/R1BQ1RK1 b - - +EO.01 +r1bqk1nr/1p3ppp/p1nbp3/1Bpp4/3P4/4PN2/PPP2PPP/RNBQ1RK1 w kq - +NI.08* +r1bqk1nr/p4ppp/2p5/2bpp3/8/6P1/PPP1PPBP/RNBQK2R w KQkq - +GI.05* +r1bqk1nr/pp1n1ppp/2pb4/3p4/2PPp3/4P3/PP1N1PPP/RNBQKB1R w KQkq - +FR.17* +r1bqk1nr/pp1p1pbp/2n1p1p1/2p5/2P5/2N3P1/PP1PPPBP/R1BQK1NR w KQkq - +EO.29* +r1bqk1nr/pp1p1pbp/2n3p1/2p1p3/2P5/2N3P1/PP1PPPBP/R1BQK1NR w KQkq - +EO.30* +r1bqk1nr/pp1p1pbp/2n3p1/2p1p3/4P3/2NP2P1/PPP2PBP/R1BQK1NR b KQkq - +EO.18* +r1bqk1nr/pp1pppbp/2n3p1/1Bp5/4P3/5N2/PPPP1PPP/RNBQ1RK1 b kq - +EO.11* +r1bqk1nr/pp1pppbp/2n3p1/2p5/2P1P3/2N3P1/PP1P1PBP/R1BQK1NR b KQkq - +EO.30 +r1bqk1nr/pp1pppbp/2n3p1/2p5/2P5/2N1P1P1/PP1P1PBP/R1BQK1NR b KQkq - +EO.29 +r1bqk1nr/pp1pppbp/2n3p1/2p5/2P5/2N2NP1/PP1PPPBP/R1BQK2R b KQkq - +EO.28 +r1bqk1nr/pp1pppbp/2n3p1/2p5/2P5/2N3P1/PP1PPPBP/R1BQK1NR b KQkq - +EO.31* +r1bqk1nr/pp1pppbp/2n3p1/2p5/2P5/2N3P1/PP1PPPBP/R1BQK1NR w KQkq - +EO.31 +r1bqk1nr/pp1pppbp/2n3p1/2p5/4P3/5NP1/PPPP1PBP/RNBQK2R b KQkq - +EO.14* +r1bqk1nr/pp1pppbp/2n3p1/8/2P5/8/PPN1PPPP/RNBQKB1R b KQkq - +EO.37* +r1bqk1nr/pp1pppbp/2n3p1/8/2PN4/2N5/PP2PPPP/R1BQKB1R w KQkq - +EO.35 +r1bqk1nr/pp1pppbp/2n3p1/8/2PN4/8/PP2PPPP/RNBQKB1R w KQkq - +EO.38* +r1bqk1nr/pp1pppbp/2n3p1/8/3N4/6P1/PPP1PP1P/RNBQKB1R w KQkq - +EO.53* +r1bqk1nr/pp2bppp/2n5/2ppp3/8/3P1NP1/PPP1PPBP/RNBQK2R w KQkq - +KI.27* +r1bqk1nr/pp2ppbp/2np2p1/2p5/4P3/2NP2P1/PPP2PBP/R1BQK1NR w KQkq - +SI.45 +r1bqk1nr/pp3pbp/2n1p1p1/2pp4/8/3P1NP1/PPP1PPBP/RNBQ1RK1 w kq - +KI.78* +r1bqk1nr/pp3pbp/2n3p1/2ppp3/8/3P1NP1/PPP1PPBP/RNBQ1RK1 w kq - +KI.29* +r1bqk1nr/pp4pp/2n5/4pp2/1bPp4/3P2P1/PP1N1PBP/RNBQK2R b KQkq - +BI.33* +r1bqk1nr/pp4pp/2nb4/2p1pp2/2Pp4/3P1NP1/PP2PPBP/RNBQ1RK1 w kq - +KI.60* +r1bqk1nr/ppp1ppbp/2np2p1/8/2PPP3/2N5/PP3PPP/R1BQKBNR w KQkq - +KF.03 +r1bqk1nr/ppp2pbp/2np2p1/4p3/2P1P3/2N3P1/PP1P1PBP/R1BQK1NR w KQkq - +EO.18 +r1bqk1nr/ppp2pbp/2np2p1/4p3/2P5/2N1P1P1/PP1PNPBP/R1BQK2R b KQkq - +EO.17 +r1bqk1nr/ppp2pbp/2np2p1/4p3/2P5/2NP2P1/PP2PPBP/1RBQK1NR b Kkq - +EO.16 +r1bqk1nr/ppp2pbp/2np2p1/4p3/2P5/2NP2P1/PP2PPBP/R1BQK1NR b KQkq - +SI.45* +r1bqk1nr/ppp2ppp/8/2bpn3/8/2P5/PP1NPPPP/R1BQKBNR w KQkq - +CK.09* +r1bqk1nr/pppn1pbp/3p2p1/4p3/2PPP3/2N2N2/PP2BPPP/R1BQK2R b KQkq - +KF.01 +r1bqk1nr/pppnppbp/3p2p1/8/2PPP3/2N5/PP3PPP/R1BQKBNR w KQkq - +KF.02 +r1bqk1nr/pppp1pbp/2n3p1/4p3/2P5/2N2NP1/PP1PPPBP/R1BQK2R b KQkq - +EO.19 +r1bqk1nr/pppp1pbp/2n3p1/4p3/2P5/2N3P1/PP1PPPBP/1RBQK1NR b Kkq - +EO.15 +r1bqk1nr/pppp1ppp/2n5/2b1p3/1PB1P3/5N2/P1PP1PPP/RNBQK2R b KQkq - +IG.05 +r1bqk1nr/pppp1ppp/2n5/2b1p3/2B1P3/5N2/PPPP1PPP/RNBQK2R w KQkq - +IG.02 +r1bqk1nr/pppp1ppp/2n5/2b1p3/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - +VG.02* +r1bqk1nr/pppp1ppp/2n5/2b5/3NP3/8/PPP2PPP/RNBQKB1R w KQkq - +SO.05 +r1bqk2r/1p4pp/2nb1n2/p3pp2/2Pp4/P2P2P1/1P1N1PBP/RNBQ1RK1 w kq - +BI.32* +r1bqk2r/1pp1bppp/p1np1n2/4p3/B3P3/5N2/PPPP1PPP/RNBQR1K1 w kq - +RL.16 +r1bqk2r/1pppbppp/p1B2n2/4p3/4P3/5N2/PPPP1PPP/RNBQ1RK1 b kq - +RL.14 +r1bqk2r/1pppbppp/p1n2n2/4p3/B2PP3/5N2/PPP2PPP/RNBQ1RK1 b kq - +RL.15 +r1bqk2r/1pppbppp/p1n2n2/4p3/B3P3/5N2/PPPP1PPP/RNBQ1RK1 w kq - +RL.13 +r1bqk2r/2p1bppp/p1np1n2/1p2p3/4P3/1B3N2/PPPP1PPP/RNBQR1K1 w kq - +RL.19 +r1bqk2r/2ppbppp/p1n2n2/1p2p3/4P3/1B3N2/PPPP1PPP/RNBQR1K1 b kq - +RL.17 +r1bqk2r/p4ppp/2pbpn2/2pp4/2P5/2NPPN2/PP3PPP/R1BQK2R b KQkq - +NI.14* +r1bqk2r/pp1pnpbp/2n1p1p1/2p5/4P3/2NP2P1/PPP2PBP/R1BQK1NR w KQkq - +EO.17* +r1bqk2r/pp1pppbp/2n2np1/2p5/2P5/2N3P1/PP1PPPBP/R1BQK1NR w KQkq - +EO.28* +r1bqk2r/pp1pppbp/2n2np1/2p5/4P3/2N3P1/PPPP1PBP/R1BQK1NR w KQkq - +EO.19* +r1bqk2r/pp1pppbp/2n2np1/8/2P5/2N5/PPN1PPPP/R1BQKB1R b KQkq - +EO.36* +r1bqk2r/pp1pppbp/2n2np1/8/3N4/6P1/PPP1PPBP/RNBQK2R w KQkq - +EO.51* +r1bqk2r/pp1pppbp/2n2np1/8/3NP3/2N5/PPP2PPP/R1BQKB1R w KQkq - +EO.03* +r1bqk2r/pp2b1pp/2n2n2/2p1pp2/2Pp4/3PPNP1/PP3PBP/RNBQ1RK1 w kq - +KI.57* +r1bqk2r/pp2b1pp/2n2n2/2p2p2/2PPp3/3P1NP1/PP3PBP/RNBQ1RK1 w kq - +KI.56* +r1bqk2r/pp2b1pp/2n2n2/4pp2/2Pp4/3P1NP1/PP3PBP/RNBQR1K1 b kq - +BI.29* +r1bqk2r/pp2b1pp/2n2n2/4ppB1/2Pp4/3P1NP1/PP3PBP/RN1Q1RK1 b kq - +BI.30* +r1bqk2r/pp2b1pp/2n5/2pnpp2/8/3P1NP1/PP2PPBP/RNBQ1RK1 w kq - +KI.59* +r1bqk2r/pp2bppp/2n1p3/2pn4/8/2N2NP1/PP1PPPBP/R1BQ1RK1 w kq - +EO.41 +r1bqk2r/pp2bppp/2n2n2/2p1p3/3pP3/3P1NP1/PPP2PBP/RNBQ1RK1 w kq - +KI.17* +r1bqk2r/pp2bppp/2n2n2/2p1p3/3pP3/3P1NP1/PPPN1PBP/R1BQ1RK1 b kq - +KI.16* +r1bqk2r/pp2bppp/2n2n2/2ppp3/4P3/3P1N2/PPPNBPPP/R1BQK2R w KQkq - +OI.01* +r1bqk2r/pp2bppp/2n2n2/2ppp3/4P3/3P1NP1/PPP2PBP/RNBQ1RK1 b kq - +KI.18* +r1bqk2r/pp2bppp/2n2n2/2ppp3/4P3/3P2P1/PPPN1PBP/R1BQK1NR w KQkq - +KF.01* +r1bqk2r/pp2bppp/2n2n2/2ppp3/8/3P1NP1/PPP1PPBP/RNBQ1RK1 w kq - +KI.19* +r1bqk2r/pp2bppp/2n2n2/4p3/2Pp4/3P1NP1/PP3PBP/RNBQ1RK1 b kq - +BI.17* +r1bqk2r/pp2npbp/2n3p1/2ppp3/4P3/3P1NP1/PPP2PBP/RNBQ1RK1 w kq - +KI.28* +r1bqk2r/pp2nppp/2n1p3/2ppP3/3P4/P1P2N2/2P2PPP/R1BQKB1R w KQkq - +FR.13 +r1bqk2r/pp2nppp/2nb4/1B1p4/8/1N3N2/PPP2PPP/R1BQ1RK1 w kq - +FR.23 +r1bqk2r/pp2nppp/2nbp3/1Bpp4/2PP4/4PN2/PP3PPP/RNBQ1RK1 b kq - +NI.09* +r1bqk2r/pp2ppbp/2n2np1/2pp4/8/2NP1NP1/PPP1PPBP/R1BQ1RK1 b kq - +KI.73* +r1bqk2r/pp3ppp/2n1pn2/2bp4/1P6/2P1PN2/P2N1PPP/R1BQKB1R b KQkq - +SL.09* +r1bqk2r/pp3ppp/2nbpn2/1Bpp4/2P5/4PN2/PP1P1PPP/RNBQ1RK1 w kq - +NI.07* +r1bqk2r/pp3ppp/2nbpn2/1Bpp4/3P4/4PN2/PPP2PPP/RNBQ1RK1 w kq - +NI.06* +r1bqk2r/pp3ppp/2nbpn2/3p4/2PN4/2N1P3/PP3PPP/R1BQKB1R w KQkq - +TD.07* +r1bqk2r/pp3ppp/2nppn2/2p5/2PP4/2PBPN2/P4PPP/R1BQK2R w KQkq - +NI.14 +r1bqk2r/ppp1bppp/1nn5/4p3/4P3/P2P1N2/1P2BPPP/RNBQK2R b KQkq - +SI.11* +r1bqk2r/ppp1bppp/2n2n2/3pp3/8/3P1NP1/PPP1PPBP/RNBQK2R w KQkq - +PU.03* +r1bqk2r/ppp1bppp/2n5/3np3/8/2NPPN2/PP3PPP/R1BQKB1R b KQkq - +SI.22* +r1bqk2r/ppp1bppp/2n5/3np3/8/P2P1N2/1P2PPPP/RNBQKB1R w KQkq - +SI.10* +r1bqk2r/ppp1bppp/2n5/3np3/8/P2PPN2/1P3PPP/RNBQKB1R b KQkq - +SI.23* +r1bqk2r/ppp1bppp/2n5/3p4/3Pn3/3B1N2/PPP2PPP/RNBQ1RK1 w kq - +RG.06 +r1bqk2r/ppp2ppp/2n5/2bnp3/8/2NPPN2/PP3PPP/R1BQKB1R b KQkq - +SI.26* +r1bqk2r/ppp2ppp/2n5/2bnp3/8/P2P1N2/1P2PPPP/RNBQKB1R w KQkq - +SI.13* +r1bqk2r/ppp3pp/2nb1n2/3ppp2/8/3P1NP1/PPP1PPBP/RNBQ1RK1 w kq - +PU.02* +r1bqk2r/pppnbppp/3p1n2/4p3/2PPP3/2N2N2/PP2BPPP/R1BQK2R b KQkq - +OI.01 +r1bqk2r/pppp1ppp/2n2n2/3Np3/1bP5/5NP1/PP1PPP1P/R1BQKB1R b KQkq - +EO.02 +r1bqk2r/pppp1ppp/2n2n2/4p3/1b1PP3/2N2N2/PPP2PPP/R1BQKB1R w KQkq - +SO.01 +r1bqk2r/pppp1ppp/2n2n2/4p3/1b2P3/2N2N2/PPPP1PPP/R1BQKB1R w KQkq - +KP.03* +r1bqk2r/pppp1ppp/2n2n2/4p3/1bP5/2N1PN2/PP1P1PPP/R1BQKB1R w KQkq - +EO.05 +r1bqkb1r/1p1n1ppp/p2ppn2/6B1/3NPP2/2N5/PPP3PP/R2QKB1R w KQkq - +SI.06 +r1bqkb1r/1p2pppp/2n2n2/p1Pp4/5B2/2P2N2/PP2PPPP/RN1QKB1R b KQkq - +SL.04* +r1bqkb1r/1p3ppp/p1np1n2/1N2p1B1/4P3/2N5/PPP2PPP/R2QKB1R w KQkq - +SI.36 +r1bqkb1r/1p3ppp/p1nppn2/6B1/3NP3/2N5/PPPQ1PPP/2KR1B1R b kq - +SI.29 +r1bqkb1r/1ppp1ppp/p1n2n2/4p3/B3P3/5N2/PPPP1PPP/RNBQK2R w KQkq - +RL.12 +r1bqkb1r/1ppp1ppp/p1n5/4p3/B3n3/5N2/PPPP1PPP/RNBQ1RK1 w kq - +RL.27 +r1bqkb1r/2p2ppp/p1p2n2/3p4/2PPp3/2N1P3/PP2NPPP/R1BQK2R b KQkq - +FR.13* +r1bqkb1r/2p2ppp/p1p2n2/3p4/2PPp3/4P3/PP2NPPP/RNBQK2R w KQkq - +FR.12* +r1bqkb1r/5p1p/p1np4/1p1Npp2/4P3/N7/PPP2PPP/R2QKB1R w KQkq - +SI.38 +r1bqkb1r/5ppp/p1np1n2/1p2p1B1/4P3/N1N5/PPP2PPP/R2QKB1R w KQkq - +SI.37 +r1bqkb1r/p2n1ppp/2p1pn2/1p6/2BP4/2N1PN2/PP3PPP/R1BQK2R w KQkq - +SL.09 +r1bqkb1r/p4ppp/5n2/3pp3/8/4P3/PP3PPP/RNBQKB1R w KQkq - +TD.08* +r1bqkb1r/pp1npppp/2n5/8/2Pp4/3P1NP1/PP3P1P/RNBQKB1R w KQkq - +BI.27* +r1bqkb1r/pp1npppp/2n5/8/2Pp4/B2P1NP1/4PP1P/RN1QKB1R w KQkq - +BI.40* +r1bqkb1r/pp1p1ppp/2n1pn2/1Bp5/4P3/2N2N2/PPPP1PPP/R1BQK2R b KQkq - +EO.05* +r1bqkb1r/pp1p1ppp/2n1pn2/1N6/2P5/2N5/PP2PPPP/R1BQKB1R b KQkq - +EO.33 +r1bqkb1r/pp1p1ppp/2n1pn2/2p5/2P5/2N3P1/PP1PPP1P/R1BQKBNR w KQkq - +EO.34* +r1bqkb1r/pp1p1ppp/2n1pn2/2p5/4P3/2N2N2/PPPP1PPP/R1BQKB1R w KQkq - +EO.06* +r1bqkb1r/pp1p1ppp/2n1pn2/8/2PN4/2N3P1/PP2PP1P/R1BQKB1R b KQkq - +EO.32 +r1bqkb1r/pp1p1ppp/2n2n2/2p1p3/2P5/1P3N2/P2PPPPP/RNBQKB1R w KQkq - +EO.43* +r1bqkb1r/pp1p1ppp/2n2n2/2p1p3/8/1P2PN2/PBPP1PPP/RN1QKB1R b KQkq - +EO.60* +r1bqkb1r/pp1p1ppp/2n2n2/4p3/3NP3/2N5/PPP2PPP/R1BQKB1R w KQkq - +SI.35 +r1bqkb1r/pp1ppp1p/2n2np1/2p5/4P3/2N2N2/PPPP1PPP/R1BQKB1R w KQkq - +EO.04* +r1bqkb1r/pp1ppp1p/5np1/1Bp5/3nP3/2N2N2/PPPP1PPP/R1BQK2R w KQkq - +EO.02* +r1bqkb1r/pp1ppppp/2n2n2/1Bp5/8/4PN2/PPPP1PPP/RNBQK2R b KQkq - +EO.59* +r1bqkb1r/pp1ppppp/2n2n2/2p5/4P3/2N5/PPPP1PPP/R1BQKBNR w KQkq - +EO.21* +r1bqkb1r/pp1ppppp/2n2n2/2p5/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - +EO.09* +r1bqkb1r/pp1ppppp/2n2n2/8/2PN4/8/PP2PPPP/RNBQKB1R b KQkq - +EO.42* +r1bqkb1r/pp1ppppp/2n2n2/8/3N4/6P1/PPP1PP1P/RNBQKB1R b KQkq - +EO.52* +r1bqkb1r/pp1ppppp/2n2n2/8/3NP3/2N5/PPP2PPP/R1BQKB1R b KQkq - +SI.34 +r1bqkb1r/pp1ppppp/n4n2/2P5/8/8/PPP1PPPP/RNBQKBNR w KQkq - +RE.18* +r1bqkb1r/pp2n1pp/2n2p2/2ppp3/8/3P1NP1/PPP1PPBP/RNBQ1RK1 w kq - +KI.52* +r1bqkb1r/pp2nppp/2n1p3/1Bpp4/2P5/4PN2/PP1P1PPP/RNBQK2R w KQkq - +NI.16* +r1bqkb1r/pp2nppp/2n1p3/1Bpp4/8/1P2PN2/P1PP1PPP/RNBQK2R w KQkq - +NI.13* +r1bqkb1r/pp2nppp/2n1p3/1Bpp4/8/4PN2/PPPP1PPP/RNBQ1RK1 w kq - +NI.10* +r1bqkb1r/pp2pp1p/2n2np1/2pp4/4P3/3P1N2/PPPN1PPP/R1BQKB1R w KQkq - +OI.02* +r1bqkb1r/pp2pp1p/2n2np1/3p4/2PP4/2N5/PP3PPP/R1BQKBNR w KQkq - +TD.09* +r1bqkb1r/pp2pp1p/2n2np1/8/2Pp4/B2P1NP1/4PP1P/RN1QKB1R w KQkq - +BI.39* +r1bqkb1r/pp2pp1p/2n3p1/2pn4/8/2N1PN2/PP1P1PPP/R1BQKB1R w KQkq - +EO.32* +r1bqkb1r/pp2pppp/2n2n2/1Bpp4/3P4/4PN2/PPP2PPP/RNBQK2R b KQkq - +NI.27* +r1bqkb1r/pp2pppp/2n2n2/1Bpp4/8/1P2PN2/P1PP1PPP/RNBQK2R b KQkq - +NI.26* +r1bqkb1r/pp2pppp/2n2n2/1Bpp4/8/4PN2/PPPP1PPP/RNBQK2R w KQkq - +NI.28* +r1bqkb1r/pp2pppp/2n2n2/2pp4/2PP4/4PN2/PP3PPP/RNBQKB1R b KQkq - +TD.05* +r1bqkb1r/pp2pppp/2n2n2/2pp4/3P4/2P2N2/PP2PPPP/RNBQKB1R w KQkq - +SL.03* +r1bqkb1r/pp2pppp/2n2n2/2pp4/3P4/5NP1/PPP1PPBP/RNBQK2R b KQkq - +GI.07* +r1bqkb1r/pp2pppp/2n2n2/2pp4/4P3/2N2N2/PPPP1PPP/R1BQKB1R w KQkq - +EO.08* +r1bqkb1r/pp2pppp/2n2n2/2pp4/8/3P1NP1/PPP1PPBP/RNBQK2R b KQkq - +KI.76* +r1bqkb1r/pp2pppp/2n2n2/3p4/2PP4/8/PP3PPP/RNBQKBNR w KQkq - +TD.11* +r1bqkb1r/pp2pppp/2n2n2/3p4/2Pp4/4PN2/PP3PPP/RNBQKB1R w KQkq - +TD.12* +r1bqkb1r/pp2pppp/2n5/1Bpn4/8/4PN2/PP1P1PPP/RNBQK2R b KQkq - +EO.44* +r1bqkb1r/pp2pppp/2n5/2n5/2Pp4/3P1NP1/PP3PBP/RNBQ1RK1 b kq - +BI.26* +r1bqkb1r/pp2pppp/2n5/2p5/1n6/2N1PN2/PP1P1PPP/R1BQKB1R w KQkq - +EO.33* +r1bqkb1r/pp2pppp/2n5/2pn4/8/2N3P1/PP1PPPBP/R1BQK1NR b KQkq - +EO.35* +r1bqkb1r/pp2pppp/2n5/2pn4/8/5NP1/PP1PPPBP/RNBQK2R w KQkq - +EO.49 +r1bqkb1r/pp2pppp/2np1n2/2p5/4P3/2N2N2/PPPP1PPP/R1BQKB1R w KQkq - +EO.07* +r1bqkb1r/pp2pppp/2np1n2/6B1/3NP3/2N5/PPP2PPP/R2QKB1R b KQkq - +SI.27 +r1bqkb1r/pp2pppp/2np1n2/8/3NP3/2N5/PPP2PPP/R1BQKB1R w KQkq - +SI.25 +r1bqkb1r/pp3pp1/2n2n1p/2ppp3/8/3P1NP1/PPP1PPBP/RNBQ1RK1 w kq - +KI.20* +r1bqkb1r/pp3ppp/2n1p3/2pn4/3P4/2NBPN2/PP3PPP/R1BQK2R b KQkq - +TD.07 +r1bqkb1r/pp3ppp/2n1pn2/2pp4/2P5/5NP1/PP1PPPBP/RNBQ1RK1 b kq - +KI.77* +r1bqkb1r/pp3ppp/2n1pn2/2pp4/3P4/2P1PN2/PP3PPP/RNBQKB1R w KQkq - +SL.08* +r1bqkb1r/pp3ppp/2n1pn2/2pp4/3P4/5NP1/PPP1PPBP/RNBQ1RK1 b kq - +GI.09* +r1bqkb1r/pp3ppp/2n1pn2/3p4/2PP4/2N2N2/PP3PPP/R1BQKB1R b KQkq - +TD.06* +r1bqkb1r/pp3ppp/2n2n2/2pp4/3P4/2N1PN2/PP3PPP/R1BQKB1R w KQkq - +TD.06 +r1bqkb1r/pp3ppp/2n2n2/2ppp3/8/3P1NP1/PPP1PPBP/RNBQ1RK1 b kq - +KI.21* +r1bqkb1r/pp3ppp/2n2n2/2ppp3/8/3P1NP1/PPP1PPBP/RNBQK2R w KQkq - +KI.22* +r1bqkb1r/pp3ppp/2n2n2/4p3/2Pp4/3P1NP1/PP3PBP/RNBQK2R b KQkq - +BI.20* +r1bqkb1r/pp3ppp/2n5/2pn4/4N3/4P3/PP1P1PPP/R1BQKBNR b KQkq - +EO.54* +r1bqkb1r/pp3ppp/2nppn2/8/2BNP3/2N5/PPP2PPP/R1BQK2R w KQkq - +SI.26 +r1bqkb1r/pp3ppp/2nppn2/8/3NP3/2N5/PPP1BPPP/R1BQK2R w KQkq - +SI.22 +r1bqkb1r/pp4pp/2n2n2/2p1pp2/1PPp4/3P1NP1/P3PPBP/RNBQ1RK1 b kq - +KI.55* +r1bqkb1r/pp4pp/2n2n2/2p1pp2/2P5/3PBNP1/PP3PBP/RN1Q1RK1 b kq - +KI.58* +r1bqkb1r/pp4pp/2n2n2/4pp2/2Pp4/3P1NP1/PP3PBP/RNBQ1RK1 b kq - +BI.31* +r1bqkb1r/ppn1pppp/2n5/2p5/8/2N2NP1/PP1PPPBP/R1BQK2R w KQkq - +EO.36 +r1bqkb1r/ppp2p1p/2n5/3np1p1/8/3PPN2/PP3PPP/RNBQKB1R w KQkq - +SI.20* +r1bqkb1r/ppp2ppp/2n2n2/1B1pp3/4P3/2N2N2/PPPP1PPP/R1BQK2R b KQkq - +SO.01* +r1bqkb1r/ppp2ppp/2n2n2/3pp3/8/3P1NP1/PPP1PPBP/RNBQK2R b KQkq - +PU.10* +r1bqkb1r/ppp2ppp/2n5/3np3/4P3/2N2N2/PP1P1PPP/R1BQKB1R b KQkq - +SI.35* +r1bqkb1r/ppp2ppp/2n5/3np3/4P3/3P1N2/PP3PPP/RNBQKB1R b KQkq - +SI.03* +r1bqkb1r/ppp2ppp/2n5/3np3/8/2N1P3/PPQP1PPP/R1B1KBNR b KQkq - +SI.40* +r1bqkb1r/ppp2ppp/2n5/3np3/8/2N2N2/PP1PPPPP/R1BQKB1R w KQkq - +SI.34* +r1bqkb1r/ppp2ppp/2n5/3np3/8/2N2NP1/PP1PPPBP/R1BQK2R b KQkq - +EO.03 +r1bqkb1r/ppp2ppp/2n5/3np3/8/2NP1N2/PP2PPPP/R1BQKB1R b KQkq - +SI.25* +r1bqkb1r/ppp2ppp/2n5/3np3/8/3P1NP1/PP2PP1P/RNBQKB1R b KQkq - +SI.15* +r1bqkb1r/ppp2ppp/2n5/3np3/8/3PPN2/PP3PPP/RNBQKB1R b KQkq - +SI.19* +r1bqkb1r/ppp2ppp/2n5/3np3/8/P2P1N2/1P2PPPP/RNBQKB1R b KQkq - +SI.14* +r1bqkb1r/ppp2ppp/5n2/3Pp3/3n4/2N2N2/PPPP1PPP/R1BQKB1R w KQkq - +SO.02* +r1bqkb1r/ppp2ppp/5n2/3pn3/8/2P5/PP1NPPPP/R1BQKBNR w KQkq - +CK.08* +r1bqkb1r/ppp3pp/2n2n2/3ppp2/8/3P1NP1/PPP1PPBP/RNBQ1RK1 b kq - +PU.06* +r1bqkb1r/ppp3pp/2n5/3npp2/8/3PPN2/PP3PPP/RNBQKB1R w KQkq - +SI.21* +r1bqkb1r/ppp3pp/2n5/3npp2/8/P2P1N2/1P2PPPP/RNBQKB1R w KQkq - +SI.12* +r1bqkb1r/pppn1ppp/3p1n2/4p1B1/2PP4/2N2N2/PP2PPPP/R2QKB1R b KQkq - +OI.03 +r1bqkb1r/pppn1ppp/3p1n2/4p3/2PP4/2N2NP1/PP2PP1P/R1BQKB1R b KQkq - +OI.02 +r1bqkb1r/pppn1ppp/5n2/3p4/2PP4/2N5/PP3PPP/R1BQKBNR b KQkq - +FR.22* +r1bqkb1r/pppn1ppp/5n2/3p4/2PP4/8/PP3PPP/RNBQKBNR w KQkq - +FR.21* +r1bqkb1r/pppp1ppp/2n2n2/1B2p3/4P3/2N2N2/PPPP1PPP/R1BQK2R b KQkq - +KP.03 +r1bqkb1r/pppp1ppp/2n2n2/1B2p3/4P3/5N2/PPPP1PPP/RNBQK2R w KQkq - +RL.07 +r1bqkb1r/pppp1ppp/2n2n2/3N4/3pP3/5N2/PPP2PPP/R1BQKB1R b KQkq - +SO.02 +r1bqkb1r/pppp1ppp/2n2n2/4p1N1/2B1P3/8/PPPP1PPP/RNBQK2R b KQkq - +KP.01 +r1bqkb1r/pppp1ppp/2n2n2/4p3/2B1P3/5N2/PPPP1PPP/RNBQK2R w KQkq - +IG.01 +r1bqkb1r/pppp1ppp/2n2n2/4p3/2P5/2N1PN2/PP1P1PPP/R1BQKB1R b KQkq - +EO.06 +r1bqkb1r/pppp1ppp/2n2n2/4p3/2P5/2N2NP1/PP1PPP1P/R1BQKB1R b KQkq - +EO.04 +r1bqkb1r/pppp1ppp/2n2n2/4p3/2P5/2NP1N2/PP2PPPP/R1BQKB1R b KQkq - +EO.07 +r1bqkb1r/pppp1ppp/2n2n2/4p3/2PP4/2N2N2/PP2PPPP/R1BQKB1R b KQkq - +EO.08 +r1bqkb1r/pppp1ppp/2n2n2/4p3/4P3/2N5/PPPP1PPP/R1BQKBNR w KQkq - +KP.06* +r1bqkb1r/pppp1ppp/2n2n2/8/2BpP3/5N2/PPP2PPP/RNBQK2R w KQkq - +KP.02 +r1bqkb1r/ppppnppp/2n5/1B2p3/4P3/5N2/PPPP1PPP/RNBQK2R w KQkq - +RL.04 +r1bqkbnr/1pp2ppp/p1np4/4p3/B3P3/2P2N2/PP1P1PPP/RNBQK2R b KQkq - +RL.11 +r1bqkbnr/1pp2ppp/p1np4/4p3/B3P3/5N2/PPPP1PPP/RNBQK2R w KQkq - +RL.10 +r1bqkbnr/1ppp1ppp/p1B5/4p3/4P3/5N2/PPPP1PPP/RNBQK2R b KQkq - +RL.08 +r1bqkbnr/1ppp1ppp/p1n5/4p3/B3P3/5N2/PPPP1PPP/RNBQK2R b KQkq - +RL.09 +r1bqkbnr/2p2ppp/p1p5/3p4/2PPp3/4P3/PP3PPP/RNBQK1NR w KQkq - +FR.11* +r1bqkbnr/4pppp/p1p5/2pp4/2P5/4PN2/PP1P1PPP/RNBQK2R b KQkq - +NI.19* +r1bqkbnr/4pppp/p1p5/2pp4/8/4PN2/PPPP1PPP/RNBQK2R w KQkq - +NI.18* +r1bqkbnr/p4ppp/2p5/2pp4/8/4PQ2/PPP2PPP/RNB1KB1R w KQkq - +EO.56* +r1bqkbnr/p4ppp/2p5/3pp3/8/6P1/PPP1PP1P/RNBQKB1R w KQkq - +GI.04* +r1bqkbnr/pp1npppp/2p5/8/2BPN3/8/PPP2PPP/R1BQK1NR b KQkq - +CK.09 +r1bqkbnr/pp1npppp/2p5/8/3PN3/5N2/PPP2PPP/R1BQKB1R b KQkq - +CK.08 +r1bqkbnr/pp1p1ppp/2n1p3/4P3/2P1Q3/2N5/PP3PPP/R1B1KBNR b KQkq - +EO.55 +r1bqkbnr/pp1p1ppp/2n1p3/8/2PN4/8/PP2PPPP/RNBQKB1R w KQkq - +EO.50 +r1bqkbnr/pp1p1ppp/2n1p3/8/3NP3/8/PPP2PPP/RNBQKB1R w KQkq - +SI.39 +r1bqkbnr/pp1p1ppp/2n5/2p1p3/3P4/4PN2/PPP2PPP/RNBQKB1R b KQkq - +EO.57* +r1bqkbnr/pp1p1ppp/2n5/2p1p3/8/2P2N2/PP1PPPPP/RNBQKB1R w KQkq - +EO.61* +r1bqkbnr/pp1p1ppp/4p3/4n3/2PN4/2N5/PP3PPP/R1BQKB1R w KQkq - +EO.54 +r1bqkbnr/pp1ppp1p/2n3p1/2p5/2P5/2N1PN2/PP1P1PPP/R1BQKB1R b KQkq - +EO.34 +r1bqkbnr/pp1ppp1p/2n3p1/2p5/4P3/2N5/PPPP1PPP/R1BQKBNR w KQkq - +EO.20* +r1bqkbnr/pp1ppp1p/2n3p1/2p5/4P3/2P2N2/PP1P1PPP/RNBQKB1R b KQkq - +EO.12* +r1bqkbnr/pp1ppp1p/2n3p1/8/3NP3/8/PPP2PPP/RNBQKB1R w KQkq - +SI.33 +r1bqkbnr/pp1ppppp/2n5/2p5/4P3/3P4/PPP2PPP/RNBQKBNR b KQkq - +EO.22* +r1bqkbnr/pp1ppppp/2n5/2p5/4P3/5N2/PPPP1PPP/RNBQKB1R b KQkq - +EO.10* +r1bqkbnr/pp1ppppp/2n5/2p5/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - +SI.31 +r1bqkbnr/pp1ppppp/2n5/2p5/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +EO.23* +r1bqkbnr/pp1ppppp/2n5/8/3NP3/8/PPP2PPP/RNBQKB1R b KQkq - +SI.32 +r1bqkbnr/pp2pp1p/2n3p1/1Bpp4/8/4PN2/PPPP1PPP/RNBQK2R w KQkq - +NI.29* +r1bqkbnr/pp2pppp/2n5/1Bpp4/8/4PN2/PPPP1PPP/RNBQK2R b KQkq - +NI.30* +r1bqkbnr/pp2pppp/2n5/2pp4/2PP4/4P3/PP3PPP/RNBQKBNR b KQkq - +TD.10* +r1bqkbnr/pp2pppp/2n5/2pp4/3P4/2P1P3/PP3PPP/RNBQKBNR b KQkq - +SL.06* +r1bqkbnr/pp2pppp/2n5/2pp4/3P4/4PN2/PPP2PPP/RNBQKB1R b KQkq - +QO.16* +r1bqkbnr/pp2pppp/2n5/2pp4/3P4/5NP1/PPP1PP1P/RNBQKB1R b KQkq - +GI.03* +r1bqkbnr/pp2pppp/2n5/2pp4/5P2/5N2/PPPPP1PP/RNBQKB1R w KQkq - +HD.05* +r1bqkbnr/pp2pppp/2n5/2pp4/8/3P1N2/PPP1PPPP/RNBQKB1R w KQkq - +OI.04* +r1bqkbnr/pp2pppp/2n5/8/1pPp4/P4N2/3PPPPP/RNBQKB1R w KQkq - +BI.44* +r1bqkbnr/pp2pppp/2n5/8/2Pp4/B4NP1/3PPP1P/RN1QKB1R b KQkq - +BI.41* +r1bqkbnr/pp3pp1/2n4p/2ppp3/8/3P1NP1/PPP1PPBP/RNBQ1RK1 b kq - +KI.30* +r1bqkbnr/pp3ppp/2n1p3/1Bpp4/2P5/4PN2/PP1P1PPP/RNBQK2R b KQkq - +NI.15* +r1bqkbnr/pp3ppp/2n1p3/1Bpp4/8/1P2PN2/P1PP1PPP/RNBQK2R b KQkq - +NI.12* +r1bqkbnr/pp3ppp/2n1p3/1Bpp4/8/4PN2/PPPP1PPP/RNBQ1RK1 b kq - +NI.11* +r1bqkbnr/pp3ppp/2n1p3/1Bpp4/8/4PN2/PPPP1PPP/RNBQK2R w KQkq - +NI.17* +r1bqkbnr/pp3ppp/2n5/2p1p3/2Pp4/3P1NP1/PP2PPBP/RNBQ1RK1 b kq - +RE.13 +r1bqkbnr/pp3ppp/2n5/2p1p3/2PpP3/3P1N2/PP3PPP/RNBQKB1R w KQkq - +OI.05* +r1bqkbnr/pp3ppp/2n5/2pp4/3P4/2N2NP1/PP2PP1P/R1BQKB1R b KQkq - +TD.09 +r1bqkbnr/pp3ppp/2n5/2pp4/3P4/5N2/PP2PPPP/RNBQKB1R w KQkq - +CK.03* +r1bqkbnr/pp3ppp/2n5/2pp4/3P4/5N2/PPPN1PPP/R1BQKB1R w KQkq - +FR.22 +r1bqkbnr/pp3ppp/2n5/2ppp3/8/2NP2P1/PPP1PPBP/R1BQK1NR b KQkq - +KF.03* +r1bqkbnr/pp3ppp/2n5/2ppp3/8/3P1NP1/PPP1PPBP/RNBQK2R b KQkq - +KI.31* +r1bqkbnr/pp3ppp/2n5/2ppp3/8/3P2P1/PPP1PPBP/RNBQK1NR w KQkq - +KF.04* +r1bqkbnr/pp3ppp/2n5/2ppp3/8/3P2P1/PPPNPPBP/R1BQK1NR b KQkq - +KF.02* +r1bqkbnr/pp3ppp/2n5/2ppp3/8/5NP1/PPPPPPBP/RNBQ1RK1 b kq - +KI.32* +r1bqkbnr/pp4pp/2n2p2/2ppp3/8/3P1NP1/PPP1PPBP/RNBQK2R w KQkq - +KI.54* +r1bqkbnr/pp4pp/2n2p2/2ppp3/8/P2P1NP1/1PP1PPBP/RNBQK2R b KQkq - +KI.53* +r1bqkbnr/pp4pp/2n5/5p2/2Ppp3/3P1NP1/PP3PBP/RNBQK2R w KQkq - +BI.34* +r1bqkbnr/ppp1pppp/2n5/3p4/3PP3/8/PPP2PPP/RNBQKBNR w KQkq - +VO.06 +r1bqkbnr/ppp1pppp/2n5/8/2Pp4/5N2/PP1PPPPP/RNBQKB1R w KQkq - +OI.08* +r1bqkbnr/ppp2pp1/6n1/3p3p/8/2P3B1/PP2PPPP/RN1QKBNR w KQkq - +CK.11* +r1bqkbnr/ppp2ppp/2n1p3/3p4/3PP3/8/PPPN1PPP/R1BQKBNR w KQkq - +FR.15 +r1bqkbnr/ppp2ppp/2n5/1B1p4/2PPp3/4P3/PP3PPP/RNBQK1NR b KQkq - +FR.10* +r1bqkbnr/ppp2ppp/2n5/1B1p4/3Pp3/4P3/PPP2PPP/RNBQK1NR w KQkq - +FR.09* +r1bqkbnr/ppp2ppp/2n5/1B1pp3/3P4/4P3/PPP2PPP/RNBQK1NR b KQkq - +FR.08* +r1bqkbnr/ppp2ppp/2n5/3pp3/3P4/2P5/PP2PPPP/RNBQKBNR w KQkq - +CK.05* +r1bqkbnr/ppp2ppp/2n5/3pp3/3P4/4P3/PPP2PPP/RNBQKBNR w KQkq - +FR.04* +r1bqkbnr/ppp2ppp/2n5/3pp3/8/3P1NP1/PPP1PP1P/RNBQKB1R b KQkq - +PU.07* +r1bqkbnr/ppp2ppp/2np4/1B2p3/4P3/5N2/PPPP1PPP/RNBQK2R w KQkq - +RL.02 +r1bqkbnr/ppp2ppp/8/3p4/8/2P2P2/PP2PP1P/RNBQKB1R b KQkq - +CK.07* +r1bqkbnr/ppp2ppp/8/3p4/8/2P2P2/PP3PPP/RNBQKB1R b KQkq - +CK.06* +r1bqkbnr/ppp2ppp/8/3pn3/5B2/2P5/PP2PPPP/RN1QKBNR b KQkq - +CK.10* +r1bqkbnr/ppp2ppp/8/3pn3/8/4P3/PPP2PPP/RNBQKBNR w KQkq - +FR.07* +r1bqkbnr/ppp3pp/2n2p2/3pp3/8/3P1NP1/PPP1PP1P/RNBQKB1R w KQkq - +PU.04* +r1bqkbnr/ppp3pp/2n5/3ppp2/8/3P1NP1/PPP1PPBP/RNBQK2R b KQkq - +PU.05* +r1bqkbnr/pppn1ppp/8/3p4/2PP4/8/PP3PPP/RNBQKBNR b KQkq - +FR.20* +r1bqkbnr/pppn1ppp/8/3p4/2PQ4/4P3/PP3PPP/RNB1KBNR b KQkq - +FR.19* +r1bqkbnr/pppn1ppp/8/3p4/3Pp3/4PN2/PPP2PPP/RNBQKB1R w KQkq - +FR.16* +r1bqkbnr/pppn1ppp/8/3pp3/2PP4/4P3/PP3PPP/RNBQKBNR b KQkq - +FR.18* +r1bqkbnr/pppn1ppp/8/3pp3/3P4/2N1P3/PPP2PPP/R1BQKBNR b KQkq - +FR.15* +r1bqkbnr/pppn1ppp/8/3pp3/3P4/4P3/PPP2PPP/RNBQKBNR w KQkq - +FR.14* +r1bqkbnr/pppp1p1p/2n3p1/1B2p3/4P3/5N2/PPPP1PPP/RNBQK2R w KQkq - +RL.03 +r1bqkbnr/pppp1p1p/2n3p1/4p3/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - +VG.01* +r1bqkbnr/pppp1ppp/2n5/1B2p3/4P3/5N2/PPPP1PPP/RNBQK2R b KQkq - +RL.01 +r1bqkbnr/pppp1ppp/2n5/4p3/2B1P3/5N2/PPPP1PPP/RNBQK2R b KQkq - +IG.03 +r1bqkbnr/pppp1ppp/2n5/4p3/2P5/2N2N2/PP1PPPPP/R1BQKB1R b KQkq - +EO.21 +r1bqkbnr/pppp1ppp/2n5/4p3/2P5/2N3P1/PP1PPP1P/R1BQKBNR b KQkq - +EO.20 +r1bqkbnr/pppp1ppp/2n5/4p3/2P5/8/PP1PPPPP/RNBQKBNR w KQkq - +SI.44* +r1bqkbnr/pppp1ppp/2n5/4p3/4P3/2N2N2/PPPP1PPP/R1BQKB1R b KQkq - +KP.06 +r1bqkbnr/pppp1ppp/2n5/4p3/4P3/2P2N2/PP1P1PPP/RNBQKB1R b KQkq - +KP.05 +r1bqkbnr/pppp1ppp/2n5/4p3/4P3/3P1N2/PPP2PPP/RNBQKB1R b KQkq - +KP.07 +r1bqkbnr/pppp1ppp/2n5/4p3/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +VG.04* +r1bqkbnr/pppp1ppp/2n5/8/3NP3/8/PPP2PPP/RNBQKB1R b KQkq - +SO.04 +r1bqkbnr/pppp1ppp/2n5/8/3Q4/8/PPP1PPPP/RNB1KBNR w KQkq - +SD.02* +r1bqkbnr/pppp1ppp/2n5/8/3pP3/5N2/PPP2PPP/RNBQKB1R w KQkq - +SO.06 +r1bqkbnr/pppp1ppp/2n5/8/Q7/8/PPP1PPPP/RNB1KBNR b KQkq - +SD.01* +r1bqkbnr/pppp1ppp/8/1B2p3/3nP3/5N2/PPPP1PPP/RNBQK2R w KQkq - +RL.05 +r1bqkbnr/pppp2pp/2n5/1B2pp2/4P3/5N2/PPPP1PPP/RNBQK2R w KQkq - +RL.06 +r1bqkbnr/pppp2pp/2n5/4pp2/3PP3/5N2/PPP2PPP/RNBQKB1R b KQkq - +VG.03* +r1bqkbnr/pppppppp/2n5/8/4P3/5N2/PPPP1PPP/RNBQKB1R b KQkq - +VO.05 +r1bqkbnr/pppppppp/2n5/8/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +VO.04 +r1bqkbnr/pppppppp/2n5/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - +VO.15* +r1bqnrk1/pp2b1pp/2n2p2/2p1p3/3pPP2/3P2P1/PPPNN1BP/R1BQ1RK1 b - - +KI.02* +r1bqnrk1/pp2bppp/2n5/2p1p3/3pP3/3P1NP1/PPP1NPBP/R1BQ1RK1 w - - +KI.03* +r1bqr1k1/1p1n1pbp/p2p1np1/2pP4/P3P3/2N5/1P1NBPPP/R1BQ1RK1 w - - +BI.03 +r1bqr1k1/1p1n1pbp/p2p1np1/2pP4/P3P3/R1N5/1P1NBPPP/2BQ1RK1 b - - +BI.01 +r1bqr1k1/1p1n1pbp/p2p1np1/2pP4/P3PP2/2N5/1P1NB1PP/R1BQ1RK1 b - - +BI.02 +r1bqr1k1/1p1n1pbp/p2p1np1/2pP4/P7/2N3P1/1P1NPPBP/R1BQ1RK1 w - - +BI.22 +r1bqr1k1/p1n2pbp/1p1p1np1/2pP4/P3P3/2N2P2/1P1NB1PP/R1BQ1RK1 w - - +BI.07 +r1bqr1k1/pp1n1pbp/2pp1np1/4p3/2PPP3/2N2NPP/PP3PB1/R1BQ1RK1 w - - +KI.61 +r1bqr1k1/pp1n1pbp/3p1np1/2pP4/4P3/2N5/PP1NBPPP/R1BQ1RK1 w - - +BI.05 +r1bqr1k1/pp2bppp/2n2n2/2ppp3/4P3/3P1NP1/PPPN1PBP/R1BQ1RK1 w - - +KI.11* +r1bqr1k1/pp3pbp/3p1np1/2pPn3/P3P3/2N5/1P1NBPPP/R1BQ1RK1 w - - +BI.04 +r1bqr1k1/pp3pbp/n2p1np1/2pP4/4P3/2N5/PP1NBPPP/R1BQ1RK1 w - - +BI.09 +r1bqr1k1/ppbn1pp1/2p2n1p/3pp3/NPP1P3/P2P1N2/2Q1BPPP/R1B2RK1 w - - +RL.24* +r1bqr1k1/ppnn1pbp/3p2p1/2pP4/P3P3/2N2P2/1P1NB1PP/R1BQ1RK1 w - - +BI.08 +r1bqrbk1/pp3ppp/2n2n2/2ppp3/4P3/2PP1NP1/PP1N1PBP/R1BQ1RK1 w - - +KI.10* +r1bqrbk1/pp3ppp/2n2n2/2ppp3/P3P3/2PP1NP1/1P1N1PBP/R1BQ1RK1 b - - +KI.09* +r1n1kb1r/pp1q2pp/2n1bp2/2ppp3/8/P1NP1NP1/1PP1PPBP/1RBQ1RK1 w kq - +KI.34* +r2q1r1k/1p2b1pp/2n2p2/p1n1p3/2Pp2b1/BP1P1NP1/P1N2PBP/1R1QR1K1 w - - +BI.06* +r2q1rk1/1bp1bppp/p1np1n2/1p2p3/4P3/1BP2N1P/PP1P1PP1/RNBQR1K1 w - - +RL.26 +r2q1rk1/1p1n1pbp/p2p1np1/2pP4/P3P3/2N2B1P/1P3PP1/R1BQ1RK1 w - - +BI.10 +r2q1rk1/1p2bppp/2n2n2/p3p1B1/2Pp2b1/P2P1NP1/1P3PBP/RN1Q1RK1 w - - +BI.13* +r2q1rk1/1p2bppp/2n2n2/p3pbB1/2Pp4/P2P1NP1/1P3PBP/RN1Q1RK1 w - - +BI.12* +r2q1rk1/1p2bppp/2n2n2/p3pbB1/2Pp4/P2P1NP1/1P3PBP/RN1QR1K1 b - - +BI.11* +r2q1rk1/p3nppp/4b3/2bpp3/8/2N3P1/PP2PPBP/R1BQ1RK1 w - - +GI.06* +r2q1rk1/pp1bbppp/2n2n2/2p1p3/3pP3/3P1NP1/PPP1NPBP/R1BQ1RK1 w - - +KI.06* +r2q1rk1/pp2bppp/2n1bn2/2ppp3/4P3/2NP1NP1/PPP2PBP/R1BQ1RK1 w - - +KI.08* +r2q1rk1/pp2bppp/2n1bn2/2ppp3/4P3/3P1NP1/PPPN1PBP/R1BQ1RK1 w - - +KI.13* +r2q1rk1/pp2n1pp/2nbbp2/2ppp3/1P6/P1PP1NP1/3NPPBP/R1BQ1RK1 b - - +KI.46* +r2q1rk1/pp2ppbp/2n2np1/3p4/2PP2b1/2N2N2/PP2BPPP/R1BQ1RK1 w - - +TD.03* +r2q1rk1/ppp2ppp/2nb4/1B6/3P2b1/5N2/P1P2PPP/R1BQ1RK1 w - - +SO.03* +r2qk1nr/pp2bppp/2n5/2p1p3/2Pp2b1/3P1NPP/PP2PPB1/RNBQ1RK1 b kq - +KI.23* +r2qk1nr/pp2bppp/2n5/2p1p3/2Pp2b1/3PPNP1/PP3PBP/RNBQ1RK1 b kq - +KI.24* +r2qk1nr/pp2bppp/2n5/2ppp3/2P3b1/3P1NP1/PP2PPBP/RNBQ1RK1 b kq - +KI.25* +r2qk1nr/pp2bppp/2n5/2ppp3/6b1/3P1NP1/PPP1PPBP/RNBQ1RK1 w kq - +KI.26* +r2qk1nr/pp4pp/2nbbp2/2p1p3/1P1pP3/2PP1NP1/P4PBP/RNBQ1RK1 b kq - +KI.38* +r2qk1nr/pp4pp/2nbbp2/4p3/3pP3/3P1NP1/PP3PBP/RNBQ1RK1 w kq - +KI.37* +r2qk2r/2p2ppp/p1n1b3/1pbpP3/4n3/1BP2N2/PP3PPP/RNBQ1RK1 w kq - +RL.30 +r2qk2r/pp2b1pp/2n2n2/6N1/2Ppp1b1/1Q4P1/PP3PBP/RNB1R1K1 b kq - +BI.28* +r2qk2r/pp2n1pp/2nbbp2/2pp4/2P1p3/PP1P1NP1/4PPBP/RNBQ1RK1 w kq - +KI.44* +r2qkb1r/1p1b1ppp/p1nppn2/6B1/3NP3/2N5/PPPQ1PPP/2KR1B1R w kq - +SI.30 +r2qkb1r/2p2ppp/p1n1b3/1p1pP3/4n3/1B3N2/PPP1QPPP/RNB2RK1 b kq - +RL.28 +r2qkb1r/2p2ppp/p1n1b3/1p1pP3/4n3/1BP2N2/PP3PPP/RNBQ1RK1 b kq - +RL.29 +r2qkb1r/pp1n1ppp/2n5/4p2b/2Pp4/P2P1NPP/1P3PB1/RNBQK2R w KQkq - +BI.18* +r2qkb1r/pp1n1ppp/2p1pn2/3p1b2/2P5/1P3NP1/PB1PPPBP/RN1Q1RK1 b kq - +RE.02 +r2qkb1r/pp1n1ppp/2p1pn2/3p4/2P3b1/1P3NP1/PB1PPPBP/RN1Q1RK1 b kq - +RE.01 +r2qkb1r/pp2n1pp/2n1bp2/2ppp3/4P3/3P1NP1/PPP2PBP/RNBQ1RK1 w kq - +KI.43* +r2qkb1r/pp2pppp/2n2n2/2pp4/3P2b1/5NP1/PPP1PPBP/RNBQK2R w KQkq - +GI.08* +r2qkb1r/pp2pppp/2n2n2/2pp4/4P1b1/3P1N2/PPPN1PPP/R1BQKB1R w KQkq - +OI.03* +r2qkb1r/pp2pppp/2n2n2/8/2Pp2b1/3P1NP1/PP3P1P/RNBQKB1R w KQkq - +BI.25* +r2qkb1r/pp3ppp/2n1pn2/2pp1b2/2PP4/4PN2/PP2BPPP/RNBQ1RK1 b kq - +QO.03* +r2qkb1r/pp3ppp/2n1pn2/2pp1b2/3P4/4PN2/PPP1BPPP/RNBQ1RK1 w kq - +QO.04* +r2qkb1r/pp3ppp/2n1pn2/2pp3b/3P4/1P2PN1P/P1P1BPP1/RNBQ1RK1 b kq - +QO.10* +r2qkb1r/pp3ppp/2n1pn2/2pp4/3P2b1/4PN2/PPPNBPPP/R1BQ1RK1 b kq - +QO.12* +r2qkb1r/pp3ppp/2n1pn2/2pp4/3P4/4PB1P/PPP2PP1/RNBQ1RK1 b kq - +QO.14* +r2qkb1r/pp3ppp/2n1pn2/2pp4/Q2P2b1/2P1PN2/PP1N1PPP/R1B1KB1R b KQkq - +QO.15* +r2qkb1r/pp3ppp/2n1pn2/3p4/3P4/1P3B1P/P1P2PP1/RNBQ1RK1 b kq - +QO.08* +r2qkb1r/pp3ppp/2n1pn2/5b2/2Bp4/4PN2/PP3PPP/RNBQ1RK1 w kq - +QO.01* +r2qkb1r/pp3ppp/2n2n2/2Ppp3/1P4b1/2P1PN2/P4PPP/RNBQKB1R b KQkq - +SL.07* +r2qkb1r/pp3ppp/2n2n2/4p3/2Pp2b1/3P1NP1/PP3PBP/RNBQK2R w KQkq - +BI.19* +r2qkb1r/pp4pp/2n1bn2/2pp4/4pB2/1NN1P3/PPP2PPP/R2QKB1R w KQkq - +AL.06* +r2qkb1r/ppp2ppp/1nn1p3/4Pb2/2PP4/2N1BN2/PP4PP/R2QKB1R b KQkq - +AL.06 +r2qkb1r/ppp2ppp/2n1b3/3np3/8/3P1NP1/PP2PPBP/RNBQK2R b KQkq - +SI.16* +r2qkb1r/ppp2ppp/2n5/3np3/6b1/2NP1N2/PP2PPPP/R1BQKB1R w KQkq - +SI.27* +r2qkb1r/ppp2ppp/2n5/3np3/6b1/P2P1N2/1P2PPPP/RNBQKB1R w KQkq - +SI.04* +r2qkb1r/ppp2ppp/2n5/4p3/1n2P1b1/P1NP1N2/1P3PPP/R1BQKB1R b KQkq - +SI.36* +r2qkb1r/ppp2ppp/n1n5/4p3/1P2P1b1/P1NP1N2/5PPP/R1BQKB1R b KQkq - +SI.37* +r2qkb1r/ppp2ppp/n7/4p3/1P1nPP2/P1NP4/5P1P/R1BQKB1R b KQkq - +SI.38* +r2qkb1r/ppp3pp/2n1bp2/3np3/8/3P1NP1/PP2PPBP/RNBQK2R w KQkq - +SI.17* +r2qkb1r/ppp3pp/2n5/3npp2/1P4b1/P2PPN2/5PPP/RNBQKB1R b KQkq - +SI.07* +r2qkb1r/ppp3pp/2n5/3npp2/6b1/P2PPN2/1P1N1PPP/R1BQKB1R b KQkq - +SI.06* +r2qkb1r/ppp3pp/2n5/3npp2/6b1/P2PPN2/1P2BPPP/RNBQK2R b KQkq - +SI.09* +r2qkb1r/ppp3pp/2n5/3npp2/6b1/P2PPN2/1PQ2PPP/RNB1KB1R b KQkq - +SI.05* +r2qkb1r/ppp3pp/2n5/3npp2/6b1/PQ1PPN2/1P3PPP/RNB1KB1R b KQkq - +SI.08* +r2qkbnr/pp1nppp1/2p4p/7P/3P4/3Q1NN1/PPP2PP1/R1B1K2R b KQkq - +CK.12 +r2qkbnr/pp2pppp/2n5/1Bpp4/6b1/4PN2/PPPP1PPP/RNBQK2R w KQkq - +NI.25* +r2qkbnr/pp2pppp/2n5/2pp4/3P2b1/4PN2/PPP1BPPP/RNBQK2R b KQkq - +QO.13* +r2qkbnr/pp2pppp/2n5/3p1b2/3P4/2P5/PP2BPPP/RNBQK1NR b KQkq - +QO.05* +r2qkbnr/pp3ppp/2n5/4pb2/2Pp4/3P1NP1/PP3P1P/RNBQKB1R w KQkq - +BI.35* +r2qkbnr/pp4pp/2n1bp2/2p1p3/3pP3/3P1NP1/PPP2PBP/RNBQ1RK1 w kq - +KI.41* +r2qkbnr/pp4pp/2n1bp2/2ppp3/8/1P1P1NP1/P1P1PPBP/RNBQ1RK1 b kq - +KI.45* +r2qkbnr/pp4pp/2n1bp2/2ppp3/8/2NP1NP1/PPP1PPBP/R1BQ1RK1 b kq - +KI.36* +r2qkbnr/pp4pp/2n1bp2/2ppp3/8/3P1NP1/PPPNPPBP/R1BQ1RK1 b kq - +KI.48* +r2qkbnr/pp4pp/2n2p2/2p1p3/2Pp2b1/3P1NP1/PP2PPBP/RNBQ1RK1 w kq - +KI.50* +r2qkbnr/pp4pp/2n2p2/2ppp3/6b1/3P1NP1/PPP1PPBP/RNBQ1RK1 w kq - +KI.51* +r2qkbnr/pp4pp/2n2p2/4p3/2Pp2b1/3P1NP1/PP3PBP/RNBQK2R w KQkq - +BI.37* +r2qkbnr/ppp2ppp/2n5/3pp3/3P2b1/4PN2/PPP1BPPP/RNBQK2R b KQkq - +FR.06* +r2qkbnr/ppp2ppp/2n5/3pp3/3P2b1/4PN2/PPP2PPP/RNBQKB1R w KQkq - +FR.05* +r2qkbnr/ppp2ppp/2n5/3pp3/6b1/3P1NP1/PPP1PP1P/RNBQKB1R w KQkq - +PU.09* +r3k2r/pppq2pp/2n1bp2/2bnp3/8/2NP1NP1/PP2PPBP/R1BQ1RK1 w kq - +SI.18* +r3kb1r/pp1qn1pp/2n1bp2/2ppp3/4P3/2PP1NP1/PP1N1PBP/R1BQ1RK1 b kq - +KI.42* +r3kb1r/pp1qn1pp/2n1bp2/2ppp3/8/P1NP1NP1/1PP1PPBP/1RBQ1RK1 b kq - +KI.35* +r3kb1r/pp3ppp/1qn1bn2/3pp1B1/8/6P1/PPPNPPBP/RN1Q1RK1 w kq - +GI.11* +r3kb1r/ppq1n1p1/2n1bp2/2ppp2p/8/P1NP1NP1/1PP1PPBP/1RBQ1RK1 w kq - +KI.33* +r3kbnr/pp1q2pp/2n1bp2/2p1p3/3pP2N/3P2P1/PPP2PBP/RNBQ1RK1 w kq - +KI.40* +r3kbnr/pp1q2pp/2n1bp2/2ppp3/8/P2P1NP1/1PP1PPBP/RNBQ1RK1 w kq - +KI.47* +r3kbnr/pp1q2pp/2n1bp2/4p3/3pP3/3P1NP1/PP3PBP/RNBQ1RK1 w kq - +KI.39* +r3kbnr/pp1q2pp/2n2p2/2p1p3/2Pp2b1/3PPNP1/PP3PBP/RNBQ1RK1 w kq - +KI.49* +r4rk1/pbqnppbp/1pn3p1/2p5/NPPp4/P2P1NP1/4PPBP/1RBQ1RK1 w - - +KI.66* +rn1q1rk1/1p3pbp/p2p1np1/2pP2B1/P3P1b1/2N2N2/1P2BPPP/R2Q1RK1 b - - +BI.13 +rn1q1rk1/1p3pbp/p2p1np1/2pP4/P3P3/2N5/1P1NQPPP/R1B2RK1 b - - +BI.14 +rn1q1rk1/1p3pbp/p2p1np1/2pP4/P3PBb1/2N2N2/1P2BPPP/R2Q1RK1 b - - +BI.12 +rn1q1rk1/pb1p1pbp/1p2pnp1/2p5/3P4/1P2PN2/PBP1BPPP/RN1Q1RK1 w - - +RE.08* +rn1q1rk1/pb1pbppp/1p2p3/2p5/2PP4/2Q2NP1/PP2PPBP/R1B2RK1 w - - +QI.13 +rn1q1rk1/pb1pppbp/1p3np1/2p3B1/3P4/2P1PN2/PP1N1PPP/R2QKB1R w KQ - +RE.01* +rn1q1rk1/pb1pppbp/1p3np1/2p5/2P5/1P3NP1/PB1PPPBP/RN1Q1RK1 b - - +EO.47* +rn1q1rk1/pb1pppbp/1p3np1/2p5/2P5/1P3NP1/PB1PPPBP/RN1Q1RK1 w - - +EO.47 +rn1q1rk1/pb1pppbp/1p3np1/2p5/3P1B2/2P1PN2/PP1N1PPP/R2QKB1R w KQ - +RE.02* +rn1q1rk1/pbp1bpp1/1p2pn1p/3p4/2PP3B/2N1PN2/PP3PPP/2RQKB1R w K - +QO.09 +rn1q1rk1/pbp1bppp/1p2pn2/3p4/2P5/1P2PNP1/PB1P1PBP/RN1Q1RK1 b - - +RE.08 +rn1q1rk1/pbppb1pp/1p2p3/5p2/2PP4/2Q2NP1/PP2PPBP/R1B2RK1 w - - +QI.12 +rn1q1rk1/pbppbppp/1p2p3/8/2PPn3/2N2NP1/PP2PPBP/R1BQ1RK1 w - - +QI.10 +rn1q1rk1/pbppbppp/1p2p3/8/2PPn3/2N2NP1/PPQ1PPBP/R1B2RK1 b - - +QI.11 +rn1q1rk1/pbppbppp/1p2pn2/8/2PP4/2N2NP1/PP2PPBP/R1BQ1RK1 b - - +QI.09 +rn1q1rk1/pbppbppp/1p3n2/3p4/2P5/5NP1/PP2PPBP/RNBQ1RK1 w - - +QI.08 +rn1q1rk1/pp3pbp/3p1np1/2pP4/4P1b1/2N2N2/PP2BPPP/R1BQ1RK1 w - - +BI.16 +rn1q1rk1/pp3pbp/3p1np1/2pP4/4PPb1/2N2N2/PP2B1PP/R1BQK2R w KQ - +BI.30 +rn1q1rk1/pp3pbp/3pbnp1/2p5/2P1PP2/2N2N2/PP4PP/R1BQKB1R w KQ - +KI.58 +rn1q1rk1/ppp1ppbp/3p1np1/8/3PP1b1/2N2N2/PPP1BPPP/R1BQ1RK1 w - - +PU.01 +rn1q1rk1/pppnppbp/6p1/8/3PP1b1/1QN1BN2/PP3PPP/R3KB1R b KQ - +GI.11 +rn1qk2r/pb1pbppp/1p2pn2/2p5/2P5/2N2NP1/PP1PPPBP/R1BQ1RK1 w kq - +EO.40 +rn1qk2r/pb1pbppp/1p2pn2/8/2PQ4/2N2NP1/PP2PPBP/R1B2RK1 b kq - +EO.39 +rn1qk2r/pb1pppbp/1p3np1/2p5/2P5/2N2NP1/PP1PPPBP/R1BQ1RK1 w kq - +EO.48 +rn1qk2r/pb1pppbp/1p3np1/2p5/3P4/2P2NP1/PP2PPBP/RNBQK2R w KQkq - +RE.03* +rn1qk2r/pbppbppp/1p2pn2/8/2PP4/5NP1/PP2PPBP/RNBQK2R w KQkq - +QI.07 +rn1qk2r/pp3ppp/2p1pn2/5b2/PbBP4/2N1PN2/1P3PPP/R1BQ1RK1 b kq - +SL.05 +rn1qk2r/ppp1bppp/1n1pp3/4P2b/2PP4/5N1P/PP2BPP1/RNBQ1RK1 w kq - +AL.01 +rn1qkb1r/3ppp1p/b4np1/2pP4/8/2N5/PP2PPPP/R1BQKBNR w KQkq - +BI.41 +rn1qkb1r/4pp1p/b2p1np1/2pP4/8/2N2NP1/PP2PP1P/R1BQKB1R b KQkq - +BI.39 +rn1qkb1r/4pp1p/b2p1np1/2pP4/8/2N5/PP1NPPPP/R1BQKB1R b KQkq - +BI.40 +rn1qkb1r/4pp1p/b2p1np1/2pP4/8/6P1/PP2PPBP/RNBQK1NR w KQkq - +BI.42 +rn1qkb1r/p1pp1ppp/bp2pn2/8/2PP4/5NP1/PP2PP1P/RNBQKB1R w KQkq - +QI.05 +rn1qkb1r/pbpp1ppp/1p2pn2/8/2P1P3/2N2N2/PP1P1PPP/R1BQKB1R w KQkq - +EO.60 +rn1qkb1r/pbpp1ppp/1p2pn2/8/2PP4/5NP1/PP2PPBP/RNBQK2R b KQkq - +QI.06 +rn1qkb1r/pp2pppp/2p2n2/3p1b2/2P5/5NP1/PP1PPPBP/RNBQK2R w KQkq - +RE.06 +rn1qkb1r/pp2pppp/2p2n2/3p4/2P3b1/5NP1/PP1PPPBP/RNBQK2R w KQkq - +RE.05 +rn1qkb1r/pp2pppp/2p2n2/5b2/P1pP4/2N2N2/1P2PPPP/R1BQKB1R w KQkq - +SL.04 +rn1qkb1r/ppp1pppp/3p4/3nP3/3P2b1/5N2/PPP2PPP/RNBQKB1R w KQkq - +AL.03 +rn1qkb1r/ppp1pppp/5n2/3p1b2/8/4PN2/PPPP1PPP/RNBQKB1R w KQkq - +QP.05* +rn1qkb1r/ppp1pppp/5n2/3p1b2/8/5NP1/PPPPPPBP/RNBQK2R b KQkq - +QP.03* +rn1qkb1r/ppp1pppp/5n2/3p4/6b1/4PN2/PPPP1PPP/RNBQKB1R w KQkq - +QP.04* +rn1qkb1r/ppp1pppp/5n2/3p4/6b1/5NP1/PPPPPP1P/RNBQKB1R w KQkq - +QP.02* +rn1qkb1r/ppp1pppp/5n2/3p4/6b1/5NP1/PPPPPPBP/RNBQK2R b KQkq - +QP.01* +rn1qkb1r/ppp2ppp/3pp3/3nP3/3P2b1/5N2/PPP1BPPP/RNBQK2R w KQkq - +AL.02 +rn1qkb1r/ppp2ppp/4pn2/8/2BP2b1/4PN2/PP3PPP/RNBQK2R w KQkq - +QG.06 +rn1qkbnr/pbpp1ppp/1p2p3/8/3PP3/3B4/PPP2PPP/RNBQK1NR w KQkq - +VO.03 +rn1qkbnr/pbpppppp/1p6/8/3PP3/3B4/PPP2PPP/RNBQK1NR b KQkq - +VO.02 +rn1qkbnr/pp2pppp/2p3b1/8/3P3P/6N1/PPP2PP1/R1BQKBNR b KQkq - +CK.11 +rn1qkbnr/pp2pppp/2p5/3pPb2/3P4/8/PPP2PPP/RNBQKBNR w KQkq - +CK.04 +rn1qkbnr/pp2pppp/2p5/5b2/3PN3/8/PPP2PPP/R1BQKBNR w KQkq - +CK.10 +rn1qr1k1/1p3pbp/p2p1np1/2pP4/P3PBb1/2N2N2/1P2BPPP/R2Q1RK1 w - - +BI.11 +rnb1k1nr/pp2ppbp/6p1/q1Pp4/8/4PN2/PPP2PPP/RNBQKB1R w KQkq - +CA.02* +rnb1kb1r/1p3ppp/pq1ppn2/6B1/3NPP2/2N5/PPP3PP/R2QKB1R w KQkq - +SI.08 +rnb1kb1r/1pq2ppp/p2ppn2/6B1/3NPP2/2N5/PPP3PP/R2QKB1R w KQkq - +SI.05 +rnb1kb1r/ppp2ppp/4pq2/8/2PP4/2P5/P4PPP/R1BQKBNR b KQkq - +EO.56 +rnb1kb1r/ppp2ppp/5n2/3qp3/8/3P4/PP2PPPP/RNBQKBNR w KQkq - +SI.02* +rnb1kbnr/pp3ppp/4p3/2pq4/3P4/8/PPPN1PPP/R1BQKBNR w KQkq - +FR.19 +rnb1kbnr/ppp1pppp/8/3q4/8/2N5/PPPP1PPP/R1BQKBNR b KQkq - +SD.02 +rnb1kbnr/ppp1pppp/8/q7/8/2N5/PPPP1PPP/R1BQKBNR w KQkq - +SD.01 +rnb1r1k1/pp3pbp/1q4p1/2pPP1B1/6n1/2N2N2/PP2B1PP/R2QK2R w KQ - +BI.28 +rnb2rk1/p1p1qpp1/1p5p/3p4/3P4/5N2/PP2PPPP/2RQKB1R w K - +QO.06 +rnb2rk1/pp2ppbp/2pp1np1/q7/2PP4/2N2NP1/PP2PPBP/R1BQ1RK1 w - - +KI.74 +rnb2rk1/ppp1qppp/1b3n2/4N3/1P1Pp3/P1N1B3/2P2PPP/R2QKB1R w KQ - +RL.28* +rnbq1rk1/1p1n1pbp/p2p2p1/2pP4/P3PP2/2NB1N2/1P4PP/R1BQK2R b KQ - +BI.32 +rnbq1rk1/1pp1ppbp/p2p1np1/8/2PPP3/2N1BP2/PP1Q2PP/R3KBNR b KQ - +KI.47 +rnbq1rk1/2p1bppp/p2p1n2/1p2p3/4P3/1BP2N1P/PP1P1PP1/RNBQR1K1 w - - +RL.25 +rnbq1rk1/4ppbp/pp1p1np1/2p1P3/2PP4/2NBBP2/PP2N1PP/R2QK2R b KQ - +KI.44 +rnbq1rk1/p1p1bpp1/1p2pn1p/3p4/2PP3B/2N1PN2/PP3PPP/R2QKB1R w KQ - +QO.10 +rnbq1rk1/p1p1ppbp/1p1p1np1/8/2PPP3/2N1BP2/PP4PP/R2QKBNR w KQ - +KI.45 +rnbq1rk1/p1p2pp1/1p3b1p/3p4/3P4/2N1PN2/PP3PPP/R2QKB1R w KQ - +QO.08 +rnbq1rk1/p2pppbp/1p3np1/2p5/3P4/4PN2/PPP1BPPP/RNBQ1RK1 w - - +RE.09* +rnbq1rk1/p3ppbp/3p1np1/1ppP4/2P1PP2/2N2N2/PP4PP/R1BQKB1R w KQ - +KI.55 +rnbq1rk1/p4pbp/2pp1np1/1p1Pp3/2P1P3/2NBBP2/PP4PP/R2QK1NR w KQ - +KI.38 +rnbq1rk1/p4ppp/1p2pn2/8/1bBP4/2N2N2/PP3PPP/R1BQ1RK1 w - - +NI.04 +rnbq1rk1/pp1p1ppp/4pn2/2P5/1bP5/2N5/PPQ1PPPP/R1B1KBNR w KQ - +NI.21 +rnbq1rk1/pp1p1ppp/4pn2/2p5/1bPP4/2NBPN2/PP3PPP/R1BQK2R b KQ - +NI.07 +rnbq1rk1/pp1pppbp/5np1/2p5/2PP4/2N1PN2/PP3PPP/R1BQKB1R w KQ - +KI.77 +rnbq1rk1/pp2bpp1/5n1p/2pp4/4p2B/1N1PP3/PPP1BPPP/RN1QK2R b KQ - +AL.01* +rnbq1rk1/pp2bppp/4pn2/2pp4/2PP1B2/2N1PN2/PP3PPP/R2QKB1R w KQ - +QO.03 +rnbq1rk1/pp2ppb1/3p1npp/2pP2B1/2P1P3/2N5/PP2BPPP/R2QK1NR w KQ - +KI.23 +rnbq1rk1/pp2ppbp/2pp1np1/8/2PP4/2N2NP1/PP2PPBP/R1BQ1RK1 b - - +KI.75 +rnbq1rk1/pp2ppbp/3p1np1/2p3B1/2PPP3/2N5/PP2BPPP/R2QK1NR w KQ - +KI.25 +rnbq1rk1/pp2ppbp/3p1np1/2p5/2PP4/2N2NP1/PP2PPBP/R1BQ1RK1 b - - +KI.69 +rnbq1rk1/pp2ppbp/3p1np1/2pP2B1/2P1P3/2N2P2/PP4PP/R2QKBNR b KQ - +KI.50 +rnbq1rk1/pp2ppbp/3p1np1/2pP4/2P1P3/2N5/PP3PPP/R1BQKBNR w KQ - +RE.13* +rnbq1rk1/pp2ppbp/3p1np1/2pP4/2P1PP2/2NB4/PP4PP/R1BQK1NR b KQ - +KI.60 +rnbq1rk1/pp2ppbp/3p1np1/8/2PNPP2/2N5/PP2B1PP/R1BQK2R b KQ - +KI.59 +rnbq1rk1/pp2ppbp/5np1/2Pp4/8/4PN2/PPP1BPPP/RNBQ1RK1 b - - +CA.05* +rnbq1rk1/pp2ppbp/5np1/2p5/3P4/1P3N2/PBPPBPPP/RN1Q1RK1 b - - +QI.08* +rnbq1rk1/pp2ppbp/5np1/2pp4/3P4/5NP1/PPP1PPBP/RNBQ1RK1 w - - +GI.02* +rnbq1rk1/pp2ppbp/5np1/2pp4/5P2/3P1NP1/PPP1P1BP/RNBQ1RK1 b - - +HD.06* +rnbq1rk1/pp2ppbp/5np1/2pp4/5P2/3PPN2/PPP1B1PP/RNBQ1RK1 b - - +HD.01* +rnbq1rk1/pp2ppbp/5np1/2pp4/5P2/4PN2/PPPPB1PP/RNBQ1RK1 w - - +HD.02* +rnbq1rk1/pp2ppbp/5np1/2pp4/8/3P1NP1/PPP1PPBP/RNBQ1RK1 w - - +KI.79* +rnbq1rk1/pp3pbp/3p1np1/2pP4/2N5/2N5/PP2PPPP/R1BQKB1R w KQ - +BI.26 +rnbq1rk1/pp3pbp/3p1np1/2pP4/4P3/2N2N2/PP2BPPP/R1BQK2R w KQ - +BI.17 +rnbq1rk1/pp3pbp/3p1np1/2pP4/4P3/2NB4/PP2NPPP/R1BQ1RK1 b - - +BI.36 +rnbq1rk1/pp3pbp/3p1np1/2pP4/4PP2/2N2N2/PP4PP/R1BQKB1R w KQ - +BI.31 +rnbq1rk1/pp3pbp/3p1np1/2pP4/8/2N2NP1/PP2PPBP/R1BQ1RK1 b - - +BI.24 +rnbq1rk1/pp3pbp/3p1np1/2ppP3/2P2P2/2N2N2/PP2B1PP/R1BQK2R b KQ - +KI.56 +rnbq1rk1/pp3pbp/3p1np1/3Pp3/4P3/2N1BP2/PP1Q2PP/R3KBNR b KQ - +KI.39 +rnbq1rk1/pp3pbp/3p1np1/3Pp3/4P3/2NBBP2/PP4PP/R2QK1NR b KQ - +KI.37 +rnbq1rk1/pp3pbp/3ppnp1/2pP2B1/2P1P3/2N2P2/PP1Q2PP/R3KBNR b KQ - +KI.49 +rnbq1rk1/pp3pbp/3ppnp1/2pP2B1/2P1P3/2N5/PP2BPPP/R2QK1NR w KQ - +KI.24 +rnbq1rk1/pp3pbp/3ppnp1/2pP4/2P1PP2/2N2N2/PP2B1PP/R1BQK2R b KQ - +KI.57 +rnbq1rk1/pp3ppp/1bp2n2/4N3/1P1Pp3/P1N1B3/2P2PPP/R2QKB1R w KQ - +RL.29* +rnbq1rk1/pp3ppp/1bp2n2/4N3/1PBPp3/P1N1B3/2P2PPP/R2QK2R b KQ - +RL.30* +rnbq1rk1/pp3ppp/4pn2/2bP4/5B2/2N1PN2/PP3PPP/R2QKB1R b KQ - +QO.01 +rnbq1rk1/pp3ppp/4pn2/2bp4/2P5/P3PN2/1P3PPP/RNBQKB1R b KQ - +QG.07* +rnbq1rk1/pp3ppp/4pn2/2pp4/1bPP4/2NBP3/PP2NPPP/R1BQK2R w KQ - +NI.09 +rnbq1rk1/pp3ppp/4pn2/2pp4/1bPP4/2NBPN2/PP3PPP/R1BQ1RK1 b - - +NI.05 +rnbq1rk1/ppp1b1pp/3ppn2/5p2/2PP4/5NP1/PP2PPBP/RNBQ1RK1 w - - +HD.01 +rnbq1rk1/ppp1bpp1/4pn1p/8/2pP3B/2N2N2/PP2PPPP/2RQKB1R w K - +QO.07 +rnbq1rk1/ppp1bppp/4pn2/3p4/2P5/1P3NP1/P2PPPBP/RNBQ1RK1 b - - +RE.09 +rnbq1rk1/ppp1bppp/4pn2/3p4/2PP1B2/2N1PN2/PP3PPP/R2QKB1R b KQ - +QO.04 +rnbq1rk1/ppp1bppp/4pn2/8/2pP4/5NP1/PP2PPBP/RNBQ1RK1 w - - +CA.05 +rnbq1rk1/ppp1p1bp/3p1np1/5p2/2PP4/5NP1/PP2PPBP/RNBQ1RK1 w - - +HD.06 +rnbq1rk1/ppp1ppbp/3p1np1/6B1/2PPP3/2N2P2/PP4PP/R2QKBNR b KQ - +KI.51 +rnbq1rk1/ppp1ppbp/3p1np1/6B1/2PPP3/2N5/PP2BPPP/R2QK1NR b KQ - +KI.26 +rnbq1rk1/ppp1ppbp/3p1np1/8/2PP4/2N1P1P1/PP3PBP/R1BQK1NR b KQ - +KI.78 +rnbq1rk1/ppp1ppbp/3p1np1/8/2PP4/5NP1/PP2PPBP/RNBQ1RK1 b - - +KI.79 +rnbq1rk1/ppp1ppbp/3p1np1/8/2PPP3/2N2N1P/PP3PP1/R1BQKB1R b KQ - +KI.20 +rnbq1rk1/ppp1ppbp/3p1np1/8/2PPP3/2N2N2/PP2BPPP/R1BQK2R b KQ - +KI.19 +rnbq1rk1/ppp1ppbp/3p1np1/8/2PPP3/2N2N2/PP3PPP/R1BQKB1R w KQ - +KI.21 +rnbq1rk1/ppp1ppbp/3p1np1/8/2PPP3/2N2P2/PP2N1PP/R1BQKB1R b KQ - +KI.52 +rnbq1rk1/ppp1ppbp/3p1np1/8/2PPP3/2N3P1/PP3PBP/R1BQK1NR b KQ - +KI.29 +rnbq1rk1/ppp1ppbp/3p1np1/8/2PPP3/2N4P/PP3PP1/R1BQKBNR w KQ - +KI.30 +rnbq1rk1/ppp1ppbp/3p1np1/8/3PPP2/2N2N2/PPP3PP/R1BQKB1R w KQ - +PU.06 +rnbq1rk1/ppp1ppbp/3p1np1/8/3PPP2/2NB1N2/PPP3PP/R1BQK2R b KQ - +PU.02 +rnbq1rk1/ppp1ppbp/5np1/3p4/2PP4/2N1PN2/PP3PPP/R1BQKB1R w KQ - +GI.09 +rnbq1rk1/ppp1ppbp/5np1/3p4/2PP4/5NP1/PP2PPBP/RNBQ1RK1 b - - +GI.02 +rnbq1rk1/ppp2pbp/3p1np1/3Pp3/2P1P3/2N1BP2/PP4PP/R2QKBNR b KQ - +KI.41 +rnbq1rk1/ppp2pbp/3p1np1/3Pp3/2P1P3/2N2N2/PP2BPPP/R1BQK2R b KQ - +KI.17 +rnbq1rk1/ppp2pbp/3p1np1/4p3/2PPP3/2N1BP2/PP2N1PP/R2QKB1R b KQ - +KI.43 +rnbq1rk1/ppp2pbp/3p1np1/4p3/2PPP3/2N2N2/PP2BPPP/R1BQ1RK1 b - - +KI.15 +rnbq1rk1/ppp2pbp/3p1np1/4p3/2PPP3/2N2N2/PP2BPPP/R1BQK2R w KQ - +KI.18 +rnbq1rk1/ppp2pbp/3p1np1/4p3/2PPP3/2N3P1/PP2NPBP/R1BQK2R b KQ - +KI.28 +rnbq1rk1/ppp2pbp/3p2p1/3Pp2n/2P1P3/2N1BP2/PP1Q2PP/R3KBNR b KQ - +KI.40 +rnbq1rk1/ppp2pp1/4pb1p/3p4/2PP4/2N1PN2/PP3PPP/R2QKB1R w KQ - +QO.14 +rnbq1rk1/ppp2ppp/3b1n2/3pN3/3P4/2N5/PPP1BPPP/R1BQK2R b KQ - +RG.06* +rnbq1rk1/ppp2ppp/4pn2/3p4/1bPP4/2NBPN2/PP3PPP/R1BQK2R b KQ - +NI.06 +rnbq1rk1/ppp2ppp/4pn2/3p4/1bPP4/P1NBP3/1P3PPP/R1BQK1NR b KQ - +NI.08 +rnbq1rk1/ppp2ppp/5n2/b2pp3/4P3/P1N2N2/1PPPBPPP/R1BQK2R w KQ - +RL.15* +rnbq1rk1/pppp1ppp/4pn2/8/1bPP4/2N1P3/PP2NPPP/R1BQKB1R b KQ - +NI.10 +rnbq1rk1/pppp1ppp/4pn2/8/1bPP4/2N1P3/PP3PPP/R1BQKBNR w KQ - +NI.11 +rnbq1rk1/pppp1ppp/4pn2/8/2PP4/P1Q5/1P2PPPP/R1B1KBNR b KQ - +NI.20 +rnbq1rk1/pppp1ppp/5n2/4p3/1bP5/2N3P1/PP1PPPBP/R1BQK1NR w KQ - +EO.11 +rnbq1rk1/pppp1ppp/5n2/4p3/4P3/P1b2N2/1PPPBPPP/R1BQK2R w KQ - +RL.14* +rnbq1rk1/pppp1ppp/5n2/b3N3/4P3/P1N5/1PPP1PPP/R1BQKB1R b KQ - +RL.27* +rnbq1rk1/pppp1ppp/5n2/b3p3/4P3/P1N2N2/1PPPBPPP/R1BQK2R b KQ - +RL.13* +rnbq1rk1/ppppb1pp/4pn2/5p2/2PP4/5NP1/PP2PPBP/RNBQ1RK1 b - - +HD.02 +rnbq1rk1/ppppppbp/5np1/8/2PPP3/2N5/PP3PPP/R1BQKBNR w KQ - +KI.32 +rnbqk1nr/pp2bppp/2p5/3p4/3P1B2/2N5/PP2PPPP/R2QKBNR w KQkq - +QO.05 +rnbqk1nr/pp2ppbp/6p1/2pp4/5P2/2PP1N2/PP2P1PP/RNBQKB1R b KQkq - +HD.04* +rnbqk1nr/pp2ppbp/6p1/2pp4/5P2/4PN2/PPPP2PP/RNBQKB1R w KQkq - +HD.03* +rnbqk1nr/pp2ppbp/6p1/2pp4/5P2/5NP1/PPPPP1BP/RNBQK2R b KQkq - +HD.07* +rnbqk1nr/pp2ppbp/6p1/8/2Pp4/B2P1NP1/4PP1P/RN1QKB1R b KQkq - +BI.42* +rnbqk1nr/pp3ppp/4p3/2ppP3/1b1P4/2N5/PPP2PPP/R1BQKBNR w KQkq - +FR.10 +rnbqk1nr/pp3ppp/4p3/2ppP3/3P4/P1P5/2P2PPP/R1BQKBNR b KQkq - +FR.11 +rnbqk1nr/ppp1ppbp/3p2p1/8/2PPP3/2N5/PP3PPP/R1BQKBNR b KQkq - +KF.04 +rnbqk1nr/ppp1ppbp/6p1/3p4/5P2/6P1/PPPPP2P/RNBQKBNR w KQkq - +HD.09* +rnbqk1nr/ppp2ppp/3b4/3pp3/8/1P2P3/PBPP1PPP/RN1QKBNR b KQkq - +VO.03* +rnbqk1nr/ppp2ppp/3b4/3pp3/8/1P6/PBPPPPPP/RN1QKBNR w KQkq - +VO.02* +rnbqk1nr/ppp2ppp/4p3/3p4/1b1PP3/2N5/PPP2PPP/R1BQKBNR w KQkq - +FR.08 +rnbqk1nr/ppp2ppp/4p3/3pP3/1b1P4/2N5/PPP2PPP/R1BQKBNR b KQkq - +FR.09 +rnbqk1nr/pppp1ppp/8/2b1p3/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +IG.04* +rnbqk1nr/ppppppbp/6p1/8/3PP3/8/PPP2PPP/RNBQKBNR w KQkq - +KF.05 +rnbqk2r/1p2bppp/p2p1n2/4p3/4P3/1NN5/PPP1BPPP/R1BQK2R w KQkq - +SI.11 +rnbqk2r/1p2bppp/p2ppn2/6B1/3NPP2/2N5/PPP3PP/R2QKB1R w KQkq - +SI.09 +rnbqk2r/1p3pb1/p2p1npp/2pP4/4P2B/2N5/PP1N1PPP/R2QKB1R b KQkq - +BI.18 +rnbqk2r/1pp1ppbp/p2p1np1/8/2PPP3/2N2P2/PP4PP/R1BQKBNR w KQkq - +KI.53 +rnbqk2r/p1pp1ppp/1p2pn2/8/1bPP4/2N1P3/PP2NPPP/R1BQKB1R b KQkq - +NI.13 +rnbqk2r/p1pp1ppp/1p2pn2/8/1bPP4/2N1P3/PP3PPP/R1BQKBNR w KQkq - +NI.12 +rnbqk2r/p1pp1ppp/1p2pn2/8/1bPP4/2N2N2/PP2PPPP/R1BQKB1R w KQkq - +NI.26 +rnbqk2r/p1pp1ppp/5n2/1pb1p3/2B1P3/2N5/PPPP1PPP/R1BQK1NR w KQkq - +IG.05* +rnbqk2r/pp1n1pbp/3p2p1/1BpP4/4PP2/2N5/PP4PP/R1BQK1NR w KQkq - +BI.33 +rnbqk2r/pp1p1ppp/2p2n2/b3p3/4P3/P1NP4/1PP2PPP/R1BQKBNR w KQkq - +RL.11* +rnbqk2r/pp1p1ppp/4pn2/2p5/1bPP4/2N1P3/PP2NPPP/R1BQKB1R b KQkq - +NI.16 +rnbqk2r/pp1p1ppp/4pn2/2p5/1bPP4/2N1P3/PP3PPP/R1BQKBNR w KQkq - +NI.15 +rnbqk2r/pp1p1ppp/4pn2/2p5/1bPP4/2N5/PPQ1PPPP/R1B1KBNR w KQkq - +NI.22 +rnbqk2r/pp1p1ppp/4pn2/2p5/2PP4/P1P5/4PPPP/R1BQKBNR w KQkq - +NI.19 +rnbqk2r/pp1p1ppp/4pn2/8/1bPN4/2N5/PP2PPPP/R1BQKB1R w KQkq - +EO.44 +rnbqk2r/pp1pppbp/5np1/2P5/8/4PN2/PPP2PPP/RNBQKB1R b KQkq - +RE.10* +rnbqk2r/pp1pppbp/5np1/2p3B1/3P4/2P2N2/PP2PPPP/RN1QKB1R b KQkq - +RE.05* +rnbqk2r/pp1pppbp/5np1/2p5/3P1B2/2P2N2/PP2PPPP/RN1QKB1R b KQkq - +RE.06* +rnbqk2r/pp1pppbp/5np1/2p5/3P4/4PN2/PPP2PPP/RNBQKB1R w KQkq - +RE.11* +rnbqk2r/pp1pppbp/5np1/8/2PN4/2N5/PP2PPPP/R1BQKB1R b KQkq - +EO.49* +rnbqk2r/pp2nppp/4p3/2ppP3/3P4/P1P2N2/2P2PPP/R1BQKB1R b KQkq - +FR.12 +rnbqk2r/pp2ppbp/2p2np1/3p4/2P5/1P3NP1/PB1PPPBP/RN1QK2R b KQkq - +RE.03 +rnbqk2r/pp2ppbp/3p1np1/8/3NP3/2N1B3/PPP2PPP/R2QKB1R w KQkq - +SI.16 +rnbqk2r/pp2ppbp/3p1np1/8/3NP3/2N1BP2/PPP3PP/R2QKB1R b KQkq - +SI.17 +rnbqk2r/pp2ppbp/5np1/2Pp4/8/4PN2/PPP2PPP/RNBQKB1R w KQkq - +CA.03* +rnbqk2r/pp2ppbp/5np1/2pp4/3P4/4PN2/PPP1BPPP/RNBQK2R w KQkq - +CA.04* +rnbqk2r/pp2ppbp/5np1/2pp4/8/1P2PN2/PBPP1PPP/RN1QKB1R w KQkq - +QI.06* +rnbqk2r/pp2ppbp/5np1/2pp4/8/1P2PN2/PBPPBPPP/RN1QK2R b KQkq - +QI.07* +rnbqk2r/pp3pbp/3p1np1/2pP2B1/4P3/2N2N2/PP3PPP/R2QKB1R b KQkq - +BI.19 +rnbqk2r/pp3pbp/3p1np1/2pP2B1/4P3/2N2P2/PP4PP/R2QKBNR b KQkq - +BI.37 +rnbqk2r/pp3pbp/3p1np1/2pP4/4P3/2N2N2/PP3PPP/R1BQKB1R w KQkq - +BI.20 +rnbqk2r/pp3pbp/3p1np1/2pPP3/5P2/2N5/PP4PP/R1BQKBNR b KQkq - +BI.34 +rnbqk2r/pp3ppp/4pn2/2bp2B1/8/4PN2/PPP2PPP/RN1QKB1R b KQkq - +QG.06* +rnbqk2r/ppp1bppp/4pn2/3p2B1/2PP4/2N5/PP2PPPP/R2QKBNR w KQkq - +QO.13 +rnbqk2r/ppp1bppp/4pn2/3p2B1/3PP3/2N5/PPP2PPP/R2QKBNR w KQkq - +FR.06 +rnbqk2r/ppp1bppp/4pn2/3p4/2PP4/5NP1/PP2PPBP/RNBQK2R b KQkq - +CA.04 +rnbqk2r/ppp1bppp/5n2/3p2B1/3Np3/3PP3/PPP2PPP/RN1QKB1R b KQkq - +AL.02* +rnbqk2r/ppp1bppp/8/3p4/3Pn3/3B1N2/PPP2PPP/RNBQK2R w KQkq - +RG.05 +rnbqk2r/ppp1ppbp/3p1np1/8/2PP4/2N2N2/PP2PPPP/R1BQKB1R w KQkq - +KI.76 +rnbqk2r/ppp1ppbp/3p1np1/8/2PPP3/2N2N2/PP3PPP/R1BQKB1R b KQkq - +KI.22 +rnbqk2r/ppp1ppbp/3p1np1/8/2PPP3/2N2P2/PP4PP/R1BQKBNR b KQkq - +KI.54 +rnbqk2r/ppp1ppbp/3p1np1/8/2PPP3/2N5/PP2BPPP/R1BQK1NR b KQkq - +KI.27 +rnbqk2r/ppp1ppbp/3p1np1/8/2PPP3/2N5/PP3PPP/R1BQKBNR w KQkq - +KI.31 +rnbqk2r/ppp1ppbp/3p1np1/8/3PP3/2N2N2/PPP1BPPP/R1BQK2R b KQkq - +PU.03 +rnbqk2r/ppp1ppbp/3p1np1/8/3PP3/2N2N2/PPP2PPP/R1BQKB1R w KQkq - +PU.10 +rnbqk2r/ppp1ppbp/3p1np1/8/3PPP2/2N5/PPP3PP/R1BQKBNR w KQkq - +PU.05 +rnbqk2r/ppp1ppbp/5np1/3p2B1/2PP4/2N2N2/PP2PPPP/R2QKB1R b KQkq - +GI.08 +rnbqk2r/ppp1ppbp/5np1/3p4/2PP4/1QN2N2/PP2PPPP/R1B1KB1R b KQkq - +GI.10 +rnbqk2r/ppp1ppbp/5np1/3p4/2PP4/2N2N2/PP2PPPP/R1BQKB1R w KQkq - +GI.07 +rnbqk2r/ppp1ppbp/6p1/3n4/8/2N2NP1/PP1PPPBP/R1BQK2R b KQkq - +EO.51 +rnbqk2r/ppp1ppbp/6p1/8/2BPP3/2P5/P4PPP/R1BQK1NR b KQkq - +GI.05 +rnbqk2r/ppp2ppp/3b1n2/3pN3/3P4/8/PPP1BPPP/RNBQK2R b KQkq - +RG.05* +rnbqk2r/ppp2ppp/3b4/3np3/8/P3P3/1P1P1PPP/RNBQKBNR w KQkq - +SI.42* +rnbqk2r/ppp2ppp/4pn2/3p4/1bPP4/2N2N2/PP2PPPP/R1BQKB1R w KQkq - +NI.27 +rnbqk2r/ppp2ppp/4pn2/3p4/1bPP4/2N5/PPQ1PPPP/R1B1KBNR w KQkq - +NI.23 +rnbqk2r/ppp2ppp/5n2/2bPp3/8/2N2N2/PPPP1PPP/R1BQKB1R b KQkq - +KP.02* +rnbqk2r/pppp1pbp/5np1/4p3/2P5/2N3P1/PP1PPPBP/R1BQK1NR w KQkq - +EO.14 +rnbqk2r/pppp1ppp/4pn2/6B1/1bPP4/2N5/PP2PPPP/R2QKBNR b KQkq - +NI.25 +rnbqk2r/pppp1ppp/4pn2/8/1bP5/2N2N2/PP1PPPPP/R1BQKB1R w KQkq - +EO.59 +rnbqk2r/pppp1ppp/4pn2/8/1bP5/2N2N2/PPQPPPPP/R1B1KB1R b KQkq - +EO.58 +rnbqk2r/pppp1ppp/4pn2/8/1bPP4/2N1P3/PP3PPP/R1BQKBNR b KQkq - +NI.17 +rnbqk2r/pppp1ppp/4pn2/8/1bPP4/2N2N2/PP2PPPP/R1BQKB1R b KQkq - +NI.28 +rnbqk2r/pppp1ppp/4pn2/8/1bPP4/2N3P1/PP2PP1P/R1BQKBNR b KQkq - +NI.29 +rnbqk2r/pppp1ppp/4pn2/8/1bPP4/2N5/PP2PPPP/R1BQKBNR w KQkq - +NI.30 +rnbqk2r/pppp1ppp/4pn2/8/1bPP4/2N5/PPQ1PPPP/R1B1KBNR b KQkq - +NI.24 +rnbqk2r/pppp1ppp/4pn2/8/2PP4/P1P5/4PPPP/R1BQKBNR b KQkq - +NI.18 +rnbqk2r/pppp1ppp/5n2/2b1p3/2B1P3/2N5/PPPP1PPP/R1BQK1NR b KQkq - +IG.02* +rnbqk2r/pppp1ppp/5n2/2b1p3/4P3/2N2N2/PPPP1PPP/R1BQKB1R b KQkq - +IG.01* +rnbqk2r/pppp1ppp/5n2/2b1p3/4P3/2N5/PPPP1PPP/R1BQKBNR w KQkq - +IG.03* +rnbqk2r/pppp1ppp/5n2/3Np3/1b2P3/8/PPPP1PPP/R1BQKBNR b KQkq - +RL.05* +rnbqk2r/pppp1ppp/5n2/4p3/1b2P3/2N2N2/PPPP1PPP/R1BQKB1R b KQkq - +RL.07* +rnbqk2r/pppp1ppp/5n2/4p3/1b2P3/2N3P1/PPPP1P1P/R1BQKBNR b KQkq - +RL.03* +rnbqk2r/pppp1ppp/5n2/4p3/1b2P3/2N5/PPPP1PPP/R1BQKBNR w KQkq - +RL.01* +rnbqk2r/pppp1ppp/5n2/4p3/1b2P3/2N5/PPPPNPPP/R1BQKB1R b KQkq - +RL.04* +rnbqk2r/pppp1ppp/5n2/4p3/1b2P3/2NP4/PPP2PPP/R1BQKBNR b KQkq - +RL.02* +rnbqk2r/pppp1ppp/5n2/4p3/1b2PP2/2N5/PPPP2PP/R1BQKBNR b KQkq - +RL.06* +rnbqk2r/pppp1ppp/5n2/4p3/4P3/P1b5/1PPP1PPP/R1BQKBNR w KQkq - +RL.08* +rnbqk2r/pppp1ppp/5n2/b3p3/4P3/P1N2N2/1PPP1PPP/R1BQKB1R b KQkq - +RL.12* +rnbqk2r/pppp1ppp/5n2/b3p3/4P3/P1N5/1PPP1PPP/R1BQKBNR w KQkq - +RL.09* +rnbqk2r/pppp1ppp/5n2/b3p3/4P3/P1NP4/1PP2PPP/R1BQKBNR b KQkq - +RL.10* +rnbqk2r/pppp1ppp/8/2b1p3/4P1n1/2N2N2/PPPP1PPP/R1BQKB1R w KQkq - +KP.01* +rnbqk2r/ppppp1bp/5np1/5p2/2PP4/6P1/PP2PPBP/RNBQK1NR w KQkq - +HD.07 +rnbqk2r/ppppppbp/5np1/6B1/3P4/5N2/PPP1PPPP/RN1QKB1R w KQkq - +QP.01 +rnbqk2r/ppppppbp/5np1/8/3P1B2/5N2/PPP1PPPP/RN1QKB1R w KQkq - +QP.03 +rnbqkb1r/1p2pppp/p2p1n2/6B1/3NP3/2N5/PPP2PPP/R2QKB1R b KQkq - +SI.04 +rnbqkb1r/1p2pppp/p2p1n2/8/2BNP3/2N5/PPP2PPP/R1BQK2R b KQkq - +SI.13 +rnbqkb1r/1p2pppp/p2p1n2/8/3NP3/2N5/PPP1BPPP/R1BQK2R b KQkq - +SI.10 +rnbqkb1r/1p2pppp/p2p1n2/8/3NP3/2N5/PPP2PPP/R1BQKB1R w KQkq - +SI.14 +rnbqkb1r/1p2pppp/p2p1n2/8/3NPP2/2N5/PPP3PP/R1BQKB1R b KQkq - +SI.12 +rnbqkb1r/1p2pppp/p4n2/2pp4/8/1P2PN2/P1PP1PPP/RNBQKB1R w KQkq - +QI.04* +rnbqkb1r/1p3ppp/p2ppn2/8/3NP3/2N5/PPP1BPPP/R1BQK2R w KQkq - +SI.23 +rnbqkb1r/1p3ppp/p3pn2/2p5/2BP4/4PN2/PP3PPP/RNBQ1RK1 w kq - +QG.07 +rnbqkb1r/3ppppp/p4n2/1PpP4/8/2N5/PP2PPPP/R1BQKBNR b KQkq - +BI.44 +rnbqkb1r/3ppppp/p4n2/1PpP4/8/4P3/PP3PPP/RNBQKBNR b KQkq - +BI.43 +rnbqkb1r/3ppppp/p4n2/1PpP4/8/8/PP2PPPP/RNBQKBNR w KQkq - +BI.45 +rnbqkb1r/5ppp/p2ppn2/1p4B1/3NPP2/2N5/PPP3PP/R2QKB1R w KQkq - +SI.07 +rnbqkb1r/p1pp1ppp/1p2pn2/8/2PP4/4PN2/PP3PPP/RNBQKB1R b KQkq - +QI.03 +rnbqkb1r/p1pp1ppp/1p2pn2/8/2PP4/5N2/PP2PPPP/RNBQKB1R w KQkq - +QI.02 +rnbqkb1r/p1pp1ppp/1p2pn2/8/2PP4/P4N2/1P2PPPP/RNBQKB1R b KQkq - +QI.04 +rnbqkb1r/p2ppp1p/1p3np1/2p5/3P4/2P2N2/PP2PPPP/RNBQKB1R w KQkq - +RE.04* +rnbqkb1r/p2ppppp/1p3n2/2p5/2P1P3/2N2N2/PP1P1PPP/R1BQKB1R b KQkq - +EO.43 +rnbqkb1r/p2ppppp/5n2/1ppP4/2P5/8/PP2PPPP/RNBQKBNR w KQkq - +BI.46 +rnbqkb1r/p2ppppp/5n2/1ppP4/8/8/PPP1PPPP/RNBQKBNR w KQkq - +RE.17* +rnbqkb1r/p4ppp/2p1pn2/1p4B1/2pPP3/2N2N2/PP3PPP/R2QKB1R w KQkq - +SL.07 +rnbqkb1r/pp1n1ppp/4p3/2ppP3/3P4/2PB4/PP1N1PPP/R1BQK1NR b KQkq - +FR.17 +rnbqkb1r/pp1p1ppp/2p2n2/4p3/2P5/2N3P1/PP1PPP1P/R1BQKBNR w KQkq - +EO.12 +rnbqkb1r/pp1p1ppp/2p2n2/4p3/4P3/2N5/PPPP1PPP/R1BQKBNR w KQkq - +KP.05* +rnbqkb1r/pp1p1ppp/4pn2/2pP4/8/8/PPP1PPPP/RNBQKBNR w KQkq - +RE.16* +rnbqkb1r/pp1p1ppp/4pn2/8/2PN4/6P1/PP2PP1P/RNBQKB1R b KQkq - +EO.45 +rnbqkb1r/pp1ppp1p/5np1/2p5/3P4/2P5/PP2PPPP/RNBQKBNR w KQkq - +RE.07* +rnbqkb1r/pp1ppp1p/5np1/2p5/3P4/4P3/PPP2PPP/RNBQKBNR w KQkq - +RE.12* +rnbqkb1r/pp1ppp1p/5np1/2pP4/2P5/8/PP2PPPP/RNBQKBNR b KQkq - +RE.14* +rnbqkb1r/pp1ppp1p/5np1/2pP4/8/8/PPP1PPPP/RNBQKBNR w KQkq - +RE.15* +rnbqkb1r/pp1ppppp/2p2n2/8/2P1P3/2N5/PP1P1PPP/R1BQKBNR b KQkq - +EO.61 +rnbqkb1r/pp1ppppp/5n2/2P5/8/8/PPP1PPPP/RNBQKBNR b KQkq - +RE.19* +rnbqkb1r/pp1ppppp/5n2/2p5/2PP4/8/PP2PPPP/RNBQKBNR w KQkq - +OI.06 +rnbqkb1r/pp1ppppp/5n2/2pP4/2P5/8/PP2PPPP/RNBQKBNR b KQkq - +BI.38 +rnbqkb1r/pp1ppppp/5n2/2pP4/8/2N5/PPP1PPPP/R1BQKBNR b KQkq - +OI.08 +rnbqkb1r/pp1ppppp/5n2/8/2PN4/8/PP2PPPP/RNBQKB1R b KQkq - +EO.46 +rnbqkb1r/pp1ppppp/8/3nP3/3p4/2P5/PP3PPP/RNBQKBNR w KQkq - +SI.47 +rnbqkb1r/pp2p1pp/2pp1n2/5p2/2PP4/6P1/PP2PPBP/RNBQK1NR w KQkq - +HD.04 +rnbqkb1r/pp2pp1p/2p2p2/8/3P4/8/PPP2PPP/R1BQKBNR w KQkq - +CK.07 +rnbqkb1r/pp2pp1p/3p1np1/8/3NP3/2N5/PPP2PPP/R1BQKB1R w KQkq - +SI.15 +rnbqkb1r/pp2pp1p/5np1/2pp4/8/BP2PN2/P1PP1PPP/RN1QKB1R b KQkq - +QI.05* +rnbqkb1r/pp2pp1p/6p1/2pn4/8/4PN2/PP1P1PPP/RNBQKB1R w KQkq - +EO.45* +rnbqkb1r/pp2pppp/2p2n2/3p4/2P5/1P3NP1/P2PPP1P/RNBQKB1R b KQkq - +RE.04 +rnbqkb1r/pp2pppp/2p2n2/3p4/2PP4/2N2N2/PP2PPPP/R1BQKB1R b KQkq - +SL.03 +rnbqkb1r/pp2pppp/5n2/2Pp4/8/8/PPP1PPPP/RNBQKBNR w KQkq - +QG.05* +rnbqkb1r/pp2pppp/5n2/2pp4/8/1P2PN2/P1PP1PPP/RNBQKB1R b KQkq - +QI.02* +rnbqkb1r/pp2pppp/5n2/2pp4/8/4PN2/PPPP1PPP/RNBQKB1R w KQkq - +QI.01* +rnbqkb1r/pp2pppp/5n2/3p4/2PP4/2N5/PP3PPP/R1BQKBNR b KQkq - +CK.03 +rnbqkb1r/pp2pppp/5n2/3p4/3P4/5N2/PP2PPPP/RNBQKB1R b KQkq - +SL.02* +rnbqkb1r/pp2pppp/5n2/3p4/3P4/5N2/PP2PPPP/RNBQKB1R w KQkq - +SL.02 +rnbqkb1r/pp2pppp/8/2pn4/8/2N1P3/PP1P1PPP/R1BQKBNR b KQkq - +EO.50* +rnbqkb1r/pp2pppp/8/2pn4/8/2N2N2/PP1PPPPP/R1BQKB1R w KQkq - +EO.42 +rnbqkb1r/pp2pppp/8/2pn4/8/2N3P1/PP1PPPBP/R1BQK1NR b KQkq - +EO.38 +rnbqkb1r/pp2pppp/8/2pn4/8/5N2/PP1PPPPP/RNBQKB1R w KQkq - +EO.46* +rnbqkb1r/pp3p1p/3p1np1/2pP2B1/8/2N2N2/PP2PPPP/R2QKB1R b KQkq - +BI.25 +rnbqkb1r/pp3p1p/3p1np1/2pP4/4PB2/2N5/PP3PPP/R2QKBNR b KQkq - +BI.35 +rnbqkb1r/pp3p1p/3p1np1/2pP4/8/2N5/PP1NPPPP/R1BQKB1R b KQkq - +BI.27 +rnbqkb1r/pp3ppp/2p1pn2/3p4/2PP4/2N1PN2/PP3PPP/R1BQKB1R b KQkq - +SL.08 +rnbqkb1r/pp3ppp/2p2p2/8/3P4/8/PPP2PPP/R1BQKBNR w KQkq - +CK.06 +rnbqkb1r/pp3ppp/3p1n2/2pPp3/2P1P3/2N5/PP3PPP/R1BQKBNR b KQkq - +OI.05 +rnbqkb1r/pp3ppp/3p1n2/4p3/3NP3/2N5/PPP2PPP/R1BQKB1R w KQkq - +SI.03 +rnbqkb1r/pp3ppp/3ppn2/8/3NP1P1/2N5/PPP2P1P/R1BQKB1R b KQkq - +SI.20 +rnbqkb1r/pp3ppp/3ppn2/8/3NP3/2N5/PPP2PPP/R1BQKB1R w KQkq - +SI.19 +rnbqkb1r/pp3ppp/3ppn2/8/3NPP2/2N5/PPP3PP/R1BQKB1R b KQkq - +SI.21 +rnbqkb1r/pp3ppp/4p3/8/3PP3/5N2/P4PPP/R1BQKB1R b KQkq - +TD.08 +rnbqkb1r/pp3ppp/4pn2/2Pp4/8/5N2/PPP1PPPP/RNBQKB1R w KQkq - +QG.08* +rnbqkb1r/pp3ppp/4pn2/2pP4/3P4/2N2N2/PP2PPPP/R1BQKB1R b KQkq - +TD.12 +rnbqkb1r/pp3ppp/4pn2/2pp4/2PP4/2N2N2/PP2PPPP/R1BQKB1R w KQkq - +TD.05 +rnbqkb1r/pp3ppp/4pn2/2pp4/8/1P2PN2/P1PP1PPP/RNBQKB1R w KQkq - +QI.03* +rnbqkb1r/ppn1pppp/8/2p5/8/2N3P1/PP1PPPBP/R1BQK1NR w KQkq - +EO.37 +rnbqkb1r/ppp1pp1p/3p1np1/6B1/3PP3/2N5/PPP2PPP/R2QKBNR b KQkq - +PU.09 +rnbqkb1r/ppp1pp1p/3p1np1/8/3PP3/2N2P2/PPP3PP/R1BQKBNR b KQkq - +PU.04 +rnbqkb1r/ppp1pp1p/3p1np1/8/3PP3/2N5/PPP2PPP/R1BQKBNR w KQkq - +PU.07 +rnbqkb1r/ppp1pp1p/3p2p1/3nP3/3P4/5N2/PPP2PPP/RNBQKB1R w KQkq - +AL.04 +rnbqkb1r/ppp1pp1p/5np1/3p4/2PP4/2N5/PP2PPPP/R1BQKBNR w KQkq - +GI.03 +rnbqkb1r/ppp1pp1p/6p1/3n4/8/2N2N2/PP1PPPPP/R1BQKB1R w KQkq - +EO.52 +rnbqkb1r/ppp1pp1p/6p1/3n4/8/2N3P1/PP1PPPBP/R1BQK1NR b KQkq - +EO.53 +rnbqkb1r/ppp1pp1p/6p1/8/3PP3/2P5/P4PPP/R1BQKBNR b KQkq - +GI.04 +rnbqkb1r/ppp1pppp/1n1P4/8/2PP4/8/PP3PPP/RNBQKBNR b KQkq - +AL.08 +rnbqkb1r/ppp1pppp/1n1p4/4P3/2PP1P2/8/PP4PP/RNBQKBNR b KQkq - +AL.07 +rnbqkb1r/ppp1pppp/3p1n2/8/2PP4/2N5/PP2PPPP/R1BQKBNR b KQkq - +OI.04 +rnbqkb1r/ppp1pppp/3p1n2/8/3PP3/8/PPP2PPP/RNBQKBNR w KQkq - +PU.08 +rnbqkb1r/ppp1pppp/3p4/3nP3/3P4/5N2/PPP2PPP/RNBQKB1R b KQkq - +AL.05 +rnbqkb1r/ppp1pppp/5n2/3P4/8/8/PPPP1PPP/RNBQKBNR w KQkq - +SD.03 +rnbqkb1r/ppp1pppp/5n2/3p4/8/5N2/PPPPPPPP/RNBQKB1R w KQkq - +QP.06* +rnbqkb1r/ppp1pppp/5n2/8/2pP4/4PN2/PP3PPP/RNBQKB1R b KQkq - +QG.08 +rnbqkb1r/ppp2ppp/3p1n2/4p3/4P3/2N5/PPPP1PPP/R1BQKBNR w KQkq - +KP.07* +rnbqkb1r/ppp2ppp/3p4/8/3Pn3/5N2/PPP2PPP/RNBQKB1R b KQkq - +RG.04 +rnbqkb1r/ppp2ppp/4pn2/3p2B1/3PP3/2N5/PPP2PPP/R2QKBNR b KQkq - +FR.05 +rnbqkb1r/ppp2ppp/4pn2/3p4/2P1P3/2N5/PP1P1PPP/R1BQKBNR w KQkq - +EO.57 +rnbqkb1r/ppp2ppp/4pn2/3p4/2P5/5NP1/PP1PPPBP/RNBQK2R b KQkq - +RE.11 +rnbqkb1r/ppp2ppp/4pn2/3p4/2PP4/2N5/PP2PPPP/R1BQKBNR w KQkq - +QO.16 +rnbqkb1r/ppp2ppp/4pn2/3pP3/3P4/8/PPPN1PPP/R1BQKBNR b KQkq - +FR.16 +rnbqkb1r/ppp2ppp/4pn2/8/2p5/5NP1/PP1PPPBP/RNBQK2R w KQkq - +RE.10 +rnbqkb1r/ppp2ppp/4pn2/8/2pP4/5NP1/PP2PPBP/RNBQK2R b KQkq - +CA.03 +rnbqkb1r/ppp2ppp/4pn2/8/Q1pP4/6P1/PP2PPBP/RNB1K1NR b KQkq - +CA.02 +rnbqkb1r/ppp2ppp/5n2/3Pp3/8/2N5/PPPP1PPP/R1BQKBNR b KQkq - +SO.06* +rnbqkb1r/ppp2ppp/5n2/3p2B1/3Np3/3P4/PPP1PPPP/RN1QKB1R b KQkq - +AL.03* +rnbqkb1r/ppp2ppp/5n2/3p4/3Np3/3P2P1/PPP1PP1P/RNBQKB1R b KQkq - +AL.04* +rnbqkb1r/ppp2ppp/5n2/3p4/3Np3/3P4/PPP1PPPP/RNBQKB1R w KQkq - +AL.05* +rnbqkb1r/ppp2ppp/5n2/3pN3/4P3/8/PPPP1PPP/RNBQKB1R b KQkq - +RG.02* +rnbqkb1r/ppp2ppp/5n2/3pN3/8/3P4/PPP2PPP/RNBQKB1R w KQkq - +RG.04* +rnbqkb1r/ppp2ppp/5n2/3pp3/4P3/3P4/PPP2PPP/RNBQKBNR w KQkq - +KP.08* +rnbqkb1r/ppp2ppp/5n2/3pp3/4PP2/2N5/PPPP2PP/R1BQKBNR w KQkq - +VG.03 +rnbqkb1r/ppp2ppp/8/3np3/2B5/2N5/PPPP1PPP/R1BQK1NR b KQkq - +SO.05* +rnbqkb1r/ppp2ppp/8/3np3/8/2N1P3/PP1P1PPP/R1BQKBNR b KQkq - +SI.39* +rnbqkb1r/ppp2ppp/8/3np3/8/2N3P1/PP1PPP1P/R1BQKBNR b KQkq - +SI.33* +rnbqkb1r/ppp2ppp/8/3np3/8/2N5/PP1PPPPP/R1BQKBNR w KQkq - +SI.32* +rnbqkb1r/ppp2ppp/8/3np3/8/2N5/PPPP1PPP/R1BQKBNR w KQkq - +SO.04* +rnbqkb1r/ppp2ppp/8/3np3/8/4P3/PP1P1PPP/RNBQKBNR w KQkq - +SI.41* +rnbqkb1r/pppp1ppp/4pn2/6B1/3P4/5N2/PPP1PPPP/RN1QKB1R b KQkq - +QP.04 +rnbqkb1r/pppp1ppp/4pn2/8/2PP4/5N2/PP2PPPP/RNBQKB1R b KQkq - +QI.01 +rnbqkb1r/pppp1ppp/4pn2/8/2PP4/6P1/PP2PP1P/RNBQKBNR b KQkq - +CA.01 +rnbqkb1r/pppp1ppp/4pn2/8/3P1B2/5N2/PPP1PPPP/RN1QKB1R b KQkq - +QP.05 +rnbqkb1r/pppp1ppp/5n2/4N3/4P3/8/PPPP1PPP/RNBQKB1R b KQkq - +RG.03 +rnbqkb1r/pppp1ppp/5n2/4p3/2B1P3/2N5/PPPP1PPP/R1BQK1NR b KQkq - +VG.02 +rnbqkb1r/pppp1ppp/5n2/4p3/2P5/2N2N2/PP1PPPPP/R1BQKB1R b KQkq - +EO.09 +rnbqkb1r/pppp1ppp/5n2/4p3/2P5/2N5/PP1PPPPP/R1BQKBNR b KQkq - +SI.31* +rnbqkb1r/pppp1ppp/5n2/4p3/2P5/2N5/PP1PPPPP/R1BQKBNR w KQkq - +EO.10 +rnbqkb1r/pppp1ppp/5n2/4p3/2P5/3P4/PP2PPPP/RNBQKBNR b KQkq - +SI.01* +rnbqkb1r/pppp1ppp/5n2/4p3/2P5/8/PP1PPPPP/RNBQKBNR w KQkq - +SI.43* +rnbqkb1r/pppp1ppp/5n2/4p3/2PP4/8/PP2PPPP/RNBQKBNR w KQkq - +QG.01 +rnbqkb1r/pppp1ppp/5n2/4p3/4P3/2N3P1/PPPP1P1P/R1BQKBNR b KQkq - +VG.01 +rnbqkb1r/pppp1ppp/5n2/4p3/4P3/5N2/PPPP1PPP/RNBQKB1R b KQkq - +RG.01* +rnbqkb1r/pppp1ppp/5n2/4p3/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - +RG.01 +rnbqkb1r/pppp1ppp/5n2/4p3/4PP2/8/PPPP2PP/RNBQKBNR b KQkq - +KP.09* +rnbqkb1r/pppp1ppp/5n2/4p3/8/2N5/PPPPPPPP/R1BQKBNR w KQkq - +VO.05* +rnbqkb1r/pppp1ppp/8/4P3/6n1/8/PPPPP1PP/RNBQKBNR w KQkq - +HD.13* +rnbqkb1r/pppp1ppp/8/4p3/3Pn3/5N2/PPP2PPP/RNBQKB1R w KQkq - +RG.02 +rnbqkb1r/pppp1ppp/8/4p3/4n3/5N2/PPPP1PPP/RNBQKB1R w KQkq - +RG.03* +rnbqkb1r/pppp2pp/4pn2/5p2/2PP4/6P1/PP2PPBP/RNBQK1NR b KQkq - +HD.03 +rnbqkb1r/pppp2pp/5n2/4pP2/6P1/8/PPPP1P1P/RNBQKBNR b KQkq - +KG.01* +rnbqkb1r/pppp2pp/5n2/4pP2/8/8/PPPP1PPP/RNBQKBNR w KQkq - +KG.02* +rnbqkb1r/ppppp1pp/5n2/5p2/2PP4/2N5/PP2PPPP/R1BQKBNR b KQkq - +HD.05 +rnbqkb1r/ppppp2p/5np1/5p2/2PP4/6P1/PP2PP1P/RNBQKBNR w KQkq - +HD.08 +rnbqkb1r/pppppp1p/5np1/6B1/3P4/5N2/PPP1PPPP/RN1QKB1R b KQkq - +QP.02 +rnbqkb1r/pppppp1p/5np1/8/2PP4/8/PP2PPPP/RNBQKBNR w KQkq - +GI.01 +rnbqkb1r/pppppp1p/5np1/8/2PP4/8/PP2PPPP/RNBQKBNR w KQkq - +KI.80 +rnbqkb1r/pppppppp/5n2/8/2P5/8/PP1PPPPP/RNBQKBNR b KQkq - +QP.10* +rnbqkb1r/pppppppp/5n2/8/3P4/5N2/PPP1PPPP/RNBQKB1R b KQkq - +QP.06 +rnbqkb1r/pppppppp/5n2/8/3P4/8/PPP1PPPP/RNBQKBNR b KQkq - +QP.09* +rnbqkb1r/pppppppp/5n2/8/3P4/8/PPP1PPPP/RNBQKBNR w KQkq - +QP.07 +rnbqkb1r/pppppppp/5n2/8/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +AL.10 +rnbqkb1r/pppppppp/5n2/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - +QP.11* +rnbqkb1r/pppppppp/7n/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - +VO.16* +rnbqkb1r/pppppppp/8/3nP3/3P4/8/PPP2PPP/RNBQKBNR b KQkq - +AL.09 +rnbqkbnr/1p1p1ppp/p3p3/8/3NP3/3B4/PPP2PPP/RNBQK2R b KQkq - +SI.42 +rnbqkbnr/1ppppppp/p7/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - +VO.14* +rnbqkbnr/p1pppppp/1p6/8/2P5/8/PP1PPPPP/RNBQKBNR w KQkq - +EO.63 +rnbqkbnr/p1pppppp/1p6/8/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +VO.01 +rnbqkbnr/p1pppppp/1p6/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - +VO.08* +rnbqkbnr/p1pppppp/8/1p6/8/8/PPPPPPPP/RNBQKBNR w KQkq - +VO.10* +rnbqkbnr/pp1p1ppp/2p5/4p3/2P5/8/PP1PPPPP/RNBQKBNR w KQkq - +SI.46* +rnbqkbnr/pp1p1ppp/4p3/8/3NP3/8/PPP2PPP/RNBQKB1R b KQkq - +SI.41 +rnbqkbnr/pp1p1ppp/8/2p1p3/4P3/6P1/PPPP1P1P/RNBQKBNR b KQkq - +EO.62* +rnbqkbnr/pp1ppp1p/6p1/2p5/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +EO.24* +rnbqkbnr/pp1ppppp/2p5/8/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +CK.01 +rnbqkbnr/pp1ppppp/2p5/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - +VO.12* +rnbqkbnr/pp1ppppp/8/2p5/3P4/8/PPP1PPPP/RNBQKBNR w KQkq - +OI.09 +rnbqkbnr/pp1ppppp/8/2p5/4P3/2N5/PPPP1PPP/R1BQKBNR b KQkq - +SI.44 +rnbqkbnr/pp1ppppp/8/2p5/4P3/2P5/PP1P1PPP/RNBQKBNR b KQkq - +SI.46 +rnbqkbnr/pp1ppppp/8/2p5/4P3/5N2/PPPP1PPP/RNBQKB1R b KQkq - +SI.43 +rnbqkbnr/pp1ppppp/8/2p5/4P3/8/PPPP1PPP/RNBQKBNR b KQkq - +EO.25* +rnbqkbnr/pp1ppppp/8/2p5/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +SI.48 +rnbqkbnr/pp1ppppp/8/2p5/5P2/8/PPPPP1PP/RNBQKBNR b KQkq - +HD.14* +rnbqkbnr/pp1ppppp/8/2p5/8/1P6/P1PPPPPP/RNBQKBNR b KQkq - +EO.63* +rnbqkbnr/pp1ppppp/8/2p5/8/5N2/PPPPPPPP/RNBQKB1R w KQkq - +QP.10 +rnbqkbnr/pp1ppppp/8/2p5/8/8/PPPPPPPP/RNBQKBNR w KQkq - +EO.64* +rnbqkbnr/pp2pp1p/6p1/2pp4/5P2/5NP1/PPPPP2P/RNBQKB1R b KQkq - +HD.08* +rnbqkbnr/pp2pp1p/6p1/2pp4/8/4PN2/PPPP1PPP/RNBQKB1R w KQkq - +CA.01* +rnbqkbnr/pp2pppp/2p5/3p4/2P5/5NP1/PP1PPP1P/RNBQKB1R b KQkq - +RE.07 +rnbqkbnr/pp2pppp/2p5/3p4/2PP4/8/PP2PPPP/RNBQKBNR w KQkq - +SL.01 +rnbqkbnr/pp2pppp/2p5/3p4/3PP3/2N5/PPP2PPP/R1BQKBNR b KQkq - +CK.05 +rnbqkbnr/pp2pppp/2p5/3p4/3PP3/8/PPP2PPP/RNBQKBNR w KQkq - +CK.02 +rnbqkbnr/pp2pppp/3p4/2p5/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - +SI.01 +rnbqkbnr/pp2pppp/3p4/8/3QP3/5N2/PPP2PPP/RNB1KB1R b KQkq - +SI.02 +rnbqkbnr/pp2pppp/8/2Pp4/8/8/PPP1PPPP/RNBQKBNR b KQkq - +QG.03* +rnbqkbnr/pp2pppp/8/2p5/1PPp4/5N2/P2PPPPP/RNBQKB1R b KQkq - +BI.46* +rnbqkbnr/pp2pppp/8/2p5/2Pp4/5N2/PP1PPPPP/RNBQKB1R w KQkq - +BI.38* +rnbqkbnr/pp2pppp/8/2p5/2Pp4/5NP1/PP1PPP1P/RNBQKB1R w KQkq - +RE.14 +rnbqkbnr/pp2pppp/8/2pp4/2P5/5N2/PP1PPPPP/RNBQKB1R b KQkq - +OI.06* +rnbqkbnr/pp2pppp/8/2pp4/3P4/2P5/PP2PPPP/RNBQKBNR b KQkq - +SL.01* +rnbqkbnr/pp2pppp/8/2pp4/3PP3/8/PPP2PPP/RNBQKBNR b KQkq - +QG.02* +rnbqkbnr/pp2pppp/8/2pp4/4P3/5N2/PPPP1PPP/RNBQKB1R b KQkq - +QG.01* +rnbqkbnr/pp2pppp/8/2pp4/5P2/8/PPPPP1PP/RNBQKBNR w KQkq - +HD.10* +rnbqkbnr/pp2pppp/8/2pp4/8/3P4/PPP1PPPP/RNBQKBNR w KQkq - +OI.07* +rnbqkbnr/pp2pppp/8/2pp4/8/5NP1/PPPPPP1P/RNBQKB1R b KQkq - +GI.01* +rnbqkbnr/pp2pppp/8/2pp4/8/5NP1/PPPPPP1P/RNBQKB1R b KQkq - +KI.80* +rnbqkbnr/pp2pppp/8/8/1pPp4/P4N2/3PPPPP/RNBQKB1R b KQkq - +BI.45* +rnbqkbnr/pp3ppp/2p1p3/3p4/2PP4/2N5/PP2PPPP/R1BQKBNR w KQkq - +SL.06 +rnbqkbnr/pp3ppp/2p5/3P4/3Np3/8/PP1PPPPP/RNBQKB1R b KQkq - +SI.47* +rnbqkbnr/pp3ppp/4p3/2pp4/2PP4/2N5/PP2PPPP/R1BQKBNR w KQkq - +TD.10 +rnbqkbnr/pp3ppp/4p3/2pp4/3PP3/8/PPPN1PPP/R1BQKBNR w KQkq - +FR.18 +rnbqkbnr/pp3ppp/4p3/8/1pPp4/P4N2/3PPPPP/RNBQKB1R w KQkq - +BI.43* +rnbqkbnr/pp3ppp/8/2Ppp3/8/8/PPP1PPPP/RNBQKBNR w KQkq - +QG.04* +rnbqkbnr/pp3ppp/8/2pp4/3P4/2N2N2/PP2PPPP/R1BQKB1R b KQkq - +TD.11 +rnbqkbnr/pp3ppp/8/2pp4/3P4/5N2/PPPN1PPP/R1BQKB1R b KQkq - +FR.21 +rnbqkbnr/pp3ppp/8/2pp4/3P4/8/PPPN1PPP/R1BQKBNR w KQkq - +FR.20 +rnbqkbnr/pp3ppp/8/2pp4/8/1N1p4/PPP1PPPP/RNBQKB1R w KQkq - +AL.08* +rnbqkbnr/pp4pp/8/2pp1p2/4p3/1N1P4/PPP1PPPP/RNBQKB1R w KQkq - +AL.07* +rnbqkbnr/ppp1pppp/3p4/8/2PP4/8/PP2PPPP/RNBQKBNR b KQkq - +OI.07 +rnbqkbnr/ppp1pppp/3p4/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - +VO.13* +rnbqkbnr/ppp1pppp/8/3p4/2P5/8/PP1PPPPP/RNBQKBNR b KQkq - +OI.09* +rnbqkbnr/ppp1pppp/8/3p4/3P4/8/PPP1PPPP/RNBQKBNR b KQkq - +QP.08* +rnbqkbnr/ppp1pppp/8/3p4/3P4/8/PPP1PPPP/RNBQKBNR w KQkq - +QP.08 +rnbqkbnr/ppp1pppp/8/3p4/5P2/8/PPPPP1PP/RNBQKBNR b KQkq - +HD.12* +rnbqkbnr/ppp1pppp/8/3p4/8/5N2/PPPPPPPP/RNBQKB1R b KQkq - +QP.07* +rnbqkbnr/ppp1pppp/8/3p4/8/5N2/PPPPPPPP/RNBQKB1R w KQkq - +QP.09 +rnbqkbnr/ppp1pppp/8/3p4/8/8/PPPPPPPP/RNBQKBNR w KQkq - +QO.17* +rnbqkbnr/ppp1pppp/8/8/1PPp4/5N2/P2PPPPP/RNBQKB1R b KQkq - +RE.17 +rnbqkbnr/ppp1pppp/8/8/2Pp4/4PN2/PP1P1PPP/RNBQKB1R b KQkq - +RE.16 +rnbqkbnr/ppp1pppp/8/8/2Pp4/5NP1/PP1PPP1P/RNBQKB1R b KQkq - +RE.15 +rnbqkbnr/ppp1pppp/8/8/2p5/5N2/PP1PPPPP/RNBQKB1R w KQkq - +RE.19 +rnbqkbnr/ppp1pppp/8/8/2p5/N4N2/PP1PPPPP/R1BQKB1R b KQkq - +RE.18 +rnbqkbnr/ppp1pppp/8/8/2pP4/5N2/PP2PPPP/RNBQKB1R b KQkq - +QG.05 +rnbqkbnr/ppp1pppp/8/8/2pP4/8/PP2PPPP/RNBQKBNR w KQkq - +QG.03 +rnbqkbnr/ppp1pppp/8/8/2pPP3/8/PP3PPP/RNBQKBNR b KQkq - +QG.04 +rnbqkbnr/ppp2ppp/3p4/4p3/2P5/2N5/PP1PPPPP/R1BQKBNR w KQkq - +EO.22 +rnbqkbnr/ppp2ppp/3p4/4p3/3PP3/5N2/PPP2PPP/RNBQKB1R b KQkq - +KP.08 +rnbqkbnr/ppp2ppp/3p4/4p3/8/4P3/PPPP1PPP/RNBQKBNR w KQkq - +FR.02* +rnbqkbnr/ppp2ppp/4p3/3p4/2P5/5NP1/PP1PPP1P/RNBQKB1R b KQkq - +RE.12 +rnbqkbnr/ppp2ppp/4p3/3p4/3PP3/2N5/PPP2PPP/R1BQKBNR b KQkq - +FR.04 +rnbqkbnr/ppp2ppp/4p3/3p4/3PP3/8/PPPN1PPP/R1BQKBNR b KQkq - +FR.14 +rnbqkbnr/ppp2ppp/4p3/3pP3/3P4/8/PPP2PPP/RNBQKBNR b KQkq - +FR.03 +rnbqkbnr/ppp2ppp/4p3/8/3PN3/8/PPP2PPP/R1BQKBNR b KQkq - +FR.07 +rnbqkbnr/ppp2ppp/8/3Pp3/8/8/PPPP1PPP/RNBQKBNR b KQkq - +KP.04* +rnbqkbnr/ppp2ppp/8/3p4/3Np3/8/PPPPPPPP/RNBQKB1R w KQkq - +AL.09* +rnbqkbnr/ppp2ppp/8/3p4/3Pp3/4P3/PPP2PPP/RNBQKBNR w KQkq - +FR.03* +rnbqkbnr/ppp2ppp/8/3p4/3PpB2/2P5/PP2PPPP/RN1QKBNR b KQkq - +CK.04* +rnbqkbnr/ppp2ppp/8/3pp3/2PP4/8/PP2PPPP/RNBQKBNR w KQkq - +QG.02 +rnbqkbnr/ppp2ppp/8/3pp3/3P4/2N5/PPP1PPPP/R1BQKBNR b KQkq - +VO.06* +rnbqkbnr/ppp2ppp/8/3pp3/3P4/2P5/PP2PPPP/RNBQKBNR b KQkq - +CK.02* +rnbqkbnr/ppp2ppp/8/3pp3/4PP2/8/PPPP2PP/RNBQKBNR w KQkq - +KG.04 +rnbqkbnr/ppp2ppp/8/3pp3/5P2/8/PPPPP1PP/RNBQKBNR w KQkq - +HD.11* +rnbqkbnr/ppp2ppp/8/3pp3/8/3P1N2/PPP1PPPP/RNBQKB1R b KQkq - +PU.08* +rnbqkbnr/ppp2ppp/8/3pp3/8/6P1/PPPPPPBP/RNBQK1NR b KQkq - +KF.05* +rnbqkbnr/pppp1p1p/6p1/4p3/2P1P3/8/PP1P1PPP/RNBQKBNR w KQkq - +EO.62 +rnbqkbnr/pppp1p1p/8/6p1/4Pp2/5N2/PPPP2PP/RNBQKB1R w KQkq - +KG.01 +rnbqkbnr/pppp1ppp/4p3/8/4P3/3P4/PPP2PPP/RNBQKBNR b KQkq - +FR.02 +rnbqkbnr/pppp1ppp/4p3/8/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +FR.01 +rnbqkbnr/pppp1ppp/8/4p3/2B1P3/8/PPPP1PPP/RNBQK1NR b KQkq - +IG.04 +rnbqkbnr/pppp1ppp/8/4p3/2P5/2N5/PP1PPPPP/R1BQKBNR b KQkq - +EO.23 +rnbqkbnr/pppp1ppp/8/4p3/2P5/6P1/PP1PPP1P/RNBQKBNR b KQkq - +EO.24 +rnbqkbnr/pppp1ppp/8/4p3/2P5/8/PP1PPPPP/RNBQKBNR b KQkq - +SI.48* +rnbqkbnr/pppp1ppp/8/4p3/2P5/8/PP1PPPPP/RNBQKBNR w KQkq - +EO.25 +rnbqkbnr/pppp1ppp/8/4p3/4P3/2N5/PPPP1PPP/R1BQKBNR b KQkq - +VG.04 +rnbqkbnr/pppp1ppp/8/4p3/4P3/8/PPPP1PPP/RNBQKBNR b KQkq - +KP.10* +rnbqkbnr/pppp1ppp/8/4p3/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +KP.10 +rnbqkbnr/pppp1ppp/8/4p3/4PP2/8/PPPP2PP/RNBQKBNR b KQkq - +KG.05 +rnbqkbnr/pppp1ppp/8/4p3/8/1P6/P1PPPPPP/RNBQKBNR b KQkq - +VO.01* +rnbqkbnr/pppp1ppp/8/4p3/8/2N5/PPPPPPPP/R1BQKBNR b KQkq - +VO.04* +rnbqkbnr/pppp1ppp/8/4p3/8/2P5/PP1PPPPP/RNBQKBNR b KQkq - +CK.01* +rnbqkbnr/pppp1ppp/8/4p3/8/4P3/PPPP1PPP/RNBQKBNR b KQkq - +FR.01* +rnbqkbnr/pppp1ppp/8/4p3/8/5N2/PPPPPPPP/RNBQKB1R b KQkq - +AL.10* +rnbqkbnr/pppp1ppp/8/4p3/8/6P1/PPPPPP1P/RNBQKBNR b KQkq - +KF.06* +rnbqkbnr/pppp1ppp/8/4p3/8/8/PPPPPPPP/RNBQKBNR w KQkq - +VO.17* +rnbqkbnr/pppp1ppp/8/8/3p4/5N2/PPP1PPPP/RNBQKB1R b KQkq - +SD.03* +rnbqkbnr/pppp1ppp/8/8/3pP3/8/PPP2PPP/RNBQKBNR w KQkq - +KP.04 +rnbqkbnr/pppp1ppp/8/8/4Pp2/5N2/PPPP2PP/RNBQKB1R b KQkq - +KG.02 +rnbqkbnr/pppp1ppp/8/8/4Pp2/8/PPPP2PP/RNBQKBNR w KQkq - +KG.03 +rnbqkbnr/pppp2pp/8/4pP2/8/8/PPPP1PPP/RNBQKBNR b KQkq - +KG.03* +rnbqkbnr/pppp2pp/8/4pp2/3PP3/8/PPP2PPP/RNBQKBNR b KQkq - +KG.04* +rnbqkbnr/pppp2pp/8/4pp2/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - +KP.09 +rnbqkbnr/pppp2pp/8/4pp2/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +KG.05* +rnbqkbnr/ppppp1pp/8/5p2/2P5/8/PP1PPPPP/RNBQKBNR w KQkq - +HD.14 +rnbqkbnr/ppppp1pp/8/5p2/2PP4/8/PP2PPPP/RNBQKBNR b KQkq - +HD.10 +rnbqkbnr/ppppp1pp/8/5p2/3P4/8/PPP1PPPP/RNBQKBNR w KQkq - +HD.12 +rnbqkbnr/ppppp1pp/8/5p2/3PP3/8/PPP2PPP/RNBQKBNR b KQkq - +HD.11 +rnbqkbnr/ppppp1pp/8/5p2/8/8/PPPPPPPP/RNBQKBNR w KQkq - +VO.07* +rnbqkbnr/ppppp1pp/8/6N1/4p3/8/PPPP1PPP/RNBQKB1R b KQkq - +HD.13 +rnbqkbnr/ppppp2p/6p1/5p2/3P4/6P1/PPP1PPBP/RNBQK1NR b KQkq - +HD.09 +rnbqkbnr/pppppp1p/6p1/8/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +KF.06 +rnbqkbnr/pppppp1p/6p1/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - +VO.09* +rnbqkbnr/pppppp1p/8/6p1/8/8/PPPPPPPP/RNBQKBNR w KQkq - +VO.11* +rnbqkbnr/pppppppp/8/8/1P6/8/P1PPPPPP/RNBQKBNR b KQkq - +VO.10 +rnbqkbnr/pppppppp/8/8/2P5/8/PP1PPPPP/RNBQKBNR b KQkq - +EO.64 +rnbqkbnr/pppppppp/8/8/3P4/8/PPP1PPPP/RNBQKBNR b KQkq - +QO.17 +rnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBNR b KQkq - +VO.17 +rnbqkbnr/pppppppp/8/8/5P2/8/PPPPP1PP/RNBQKBNR b KQkq - +VO.07 +rnbqkbnr/pppppppp/8/8/6P1/8/PPPPPP1P/RNBQKBNR b KQkq - +VO.11 +rnbqkbnr/pppppppp/8/8/8/1P6/P1PPPPPP/RNBQKBNR b KQkq - +VO.08 +rnbqkbnr/pppppppp/8/8/8/2N5/PPPPPPPP/R1BQKBNR b KQkq - +VO.15 +rnbqkbnr/pppppppp/8/8/8/2P5/PP1PPPPP/RNBQKBNR b KQkq - +VO.12 +rnbqkbnr/pppppppp/8/8/8/3P4/PPP1PPPP/RNBQKBNR b KQkq - +VO.13 +rnbqkbnr/pppppppp/8/8/8/5N2/PPPPPPPP/RNBQKB1R b KQkq - +QP.11 +rnbqkbnr/pppppppp/8/8/8/6P1/PPPPPP1P/RNBQKBNR b KQkq - +VO.09 +rnbqkbnr/pppppppp/8/8/8/7N/PPPPPPPP/RNBQKB1R b KQkq - +VO.16 +rnbqkbnr/pppppppp/8/8/8/P7/1PPPPPPP/RNBQKBNR b KQkq - +VO.14 +rnbqr1k1/1ppp1ppp/1b3n2/p3p3/1P2P3/P1N2N2/2PPBPPP/R1BQ1RK1 w - - +RL.18* +rnbqr1k1/pp1p1pp1/1bp2n1p/4p3/1P2P3/P1NP1N1P/2P1BPP1/R1BQ1RK1 b - - +RL.22* +rnbqr1k1/pp1p1pp1/1bp2n1p/4p3/1P2P3/P1NP1N2/1BP1BPPP/R2Q1RK1 b - - +RL.26* +rnbqr1k1/pp1p1pp1/1bp2n1p/4p3/1P2P3/P1NP1N2/2P1BPPP/R1BQ1RK1 w - - +RL.21* +rnbqr1k1/pp1p1pp1/1bp2n1p/4p3/1P2P3/P2P1N2/2P1BPPP/RNBQ1RK1 b - - +RL.25* +rnbqr1k1/pp3pbp/3p1np1/2pP4/4PP2/2N2N2/PP2B1PP/R1BQK2R w KQ - +BI.29 +rnbqr1k1/pp3pbp/3p1np1/2pP4/8/2N2NP1/PP2PPBP/R1BQ1RK1 w - - +BI.23 +rnbqr1k1/pp3ppp/1bp2n2/3pp3/1P2P3/P1NP1N2/2P1BPPP/R1BQ1RK1 w - - +RL.20* +rnbqr1k1/ppbp1pp1/2p2n1p/4p3/NP2P3/P2P1N2/2P1BPPP/R1BQ1RK1 w - - +RL.23* +rnbqr1k1/pppp1ppp/1b3n2/4p3/1P2P3/P1N2N2/2PPBPPP/R1BQK2R w KQ - +RL.17* +rnbqr1k1/pppp1ppp/1b3n2/4p3/1P2P3/P1NP1N2/2P1BPPP/R1BQK2R b KQ - +RL.19* +rnbqr1k1/pppp1ppp/5n2/b3p3/4P3/P1NP1N2/1PP1BPPP/R1BQK2R b KQ - +RL.16* diff --git a/lasker-2.2.3/data/book/nic999.idx b/lasker-2.2.3/data/book/nic999.idx new file mode 100755 index 0000000..b0cee3c --- /dev/null +++ b/lasker-2.2.3/data/book/nic999.idx @@ -0,0 +1,2172 @@ +1r1qr1k1/p1n2pbp/bp1p1np1/2pP2B1/P1N1P3/2N2P2/1P2B1PP/R2Q1R1K b - - +BI.06 +1rbq1rk1/1pp1ppbp/p1np1np1/8/2PP4/2N2NPP/PP2PPB1/R1BQ1RK1 w - - +KI.70 +1rbq1rk1/1pp1ppbp/p1np1np1/8/2PPP2P/2N1BP2/PPQ1N1P1/R3KB1R b KQ - +KI.33 +1rbq1rk1/1pp1ppbp/p1np1np1/8/2PPP3/2N1BP2/PP1Q2PP/R1N1KB1R b KQ - +KI.34 +1rbq1rk1/1pp1ppbp/p1np1np1/8/2PPP3/2N1BP2/PP1QN1PP/R3KB1R w KQ - +KI.35 +1rbq1rk1/4ppbp/p2p1np1/nppP4/2P5/1PN3P1/PBQNPPBP/R4RK1 b - - +KI.66 +1rbq1rk1/pp2ppbp/2np1np1/2p5/4P3/2NP1NP1/PPP2PBP/R1BQ1RK1 w - - +EO.13* +1rbqk1nr/pp1pppbp/2n3p1/2p5/4P3/2N3P1/PPPP1PBP/R1BQK1NR w KQk - +EO.15* +1rbqk1nr/pp2ppbp/2np2p1/2p5/4P3/2NP2P1/PPP2PBP/R1BQK1NR w KQk - +EO.16* +1rbqr1k1/1p1n1pbp/p2p1np1/2pP4/P1N5/2N3PP/1P2PPB1/R1BQ1RK1 b - - +BI.21 +2bq1rk1/1p1nbppp/r1n5/p3p3/2Pp4/P2P1NP1/1P1N1PBP/R1BQR1K1 w - - +BI.01* +2kr1b1r/pppq1ppp/2n5/3np3/6b1/2NPPN2/PP2BPPP/R1BQ1RK1 b - - +SI.28* +2kr1b1r/pppq1ppp/2n5/3np3/6b1/P1NPPN2/1P1B1PPP/R2QKB1R b KQ - +SI.30* +2kr1b1r/pppq1ppp/2n5/3np3/6b1/P1NPPN2/1P3PPP/R1BQKB1R w KQ - +SI.29* +2rqkb1r/pp2pppp/2n2n2/2Pp3b/8/4PN1P/PPP1BPP1/RNBQ1RK1 b k - +QO.07* +2rqkb1r/pp2pppp/5n2/3p4/3P4/1P5P/P1P1QPP1/RNB2RK1 b k - +QO.06* +2rqkb1r/pp3ppp/2n1pn2/2pp3b/3P4/1P2PN1P/PBP1BPP1/RN1Q1RK1 b k - +QO.09* +2rqkb1r/pp3ppp/2n1pn2/2pp4/3P2b1/4PN2/PPPNBPPP/R1BQ1RK1 w k - +QO.11* +3rkb1r/1pq2ppp/p1n1pn2/2p2b2/Q2P4/2N1PN2/PP2BPPP/R1B2RK1 b k - +QO.02* +r1b1k2r/ppp2pp1/3q1nn1/3p4/7p/2P4P/PP1NPPP1/R2QKBNR w KQkq - +CK.12* +r1b1kb1r/1pq2ppp/p1nppn2/8/3NPP2/2N5/PPP1B1PP/R1BQ1RK1 w kq - +SI.24 +r1b1kb1r/pp1n1ppp/2p1pn2/q2p2B1/2PP4/2N1PN2/PP3PPP/R2QKB1R w KQkq - +QO.15 +r1b1kb1r/pp2pppp/1qn2n2/2pp4/3P4/5NP1/PPP1PPBP/RNBQK2R w KQkq - +GI.10* +r1b1kb1r/ppqppppp/2n2n2/1Bp5/8/4PN2/PPPP1PPP/RNBQK2R w KQkq - +EO.58* +r1b1kbnr/1p2pppp/p1q5/2pp4/8/4PN2/PPPP1PPP/RNBQ1RK1 w kq - +NI.20* +r1b1kbnr/pp3ppp/2n5/2p1q3/4p3/2N1P3/PP1P1PPP/R1BQKBNR w KQkq - +EO.55* +r1b1kbnr/ppq1pppp/2n5/1Bp5/2p5/4PN2/PP1P1PPP/RNBQ1RK1 b kq - +NI.21* +r1b1kbnr/ppq1pppp/2n5/1Bpp4/2P5/4PN2/PP1P1PPP/RNBQK2R b KQkq - +NI.22* +r1b1kbnr/ppq1pppp/2n5/1Bpp4/3P4/4PN2/PPP2PPP/RNBQK2R b KQkq - +NI.23* +r1b1kbnr/ppq1pppp/2n5/1Bpp4/8/4PN2/PPPP1PPP/RNBQK2R w KQkq - +NI.24* +r1b1kbnr/ppqp1ppp/2n1p3/8/3NP3/2N5/PPP2PPP/R1BQKB1R w KQkq - +SI.40 +r1b2rk1/1p1nqppp/2n5/p3p3/2Pp4/P2P1NP1/1P3PBP/RN1Q1RK1 w - - +BI.14* +r1b2rk1/2q1bppp/p2p1n2/npp1p3/3PP3/2P2N1P/PPBN1PP1/R1BQR1K1 b - - +RL.24 +r1b2rk1/pp2bppp/2n1pn2/q2p4/2P2B2/P1N1PN2/1PQ2PPP/3RKB1R w K - +QO.02 +r1b2rk1/pp2ppbp/2n2np1/2pq4/8/1P2PN2/PB1PBPPP/RN1QK2R w KQ - +EO.39* +r1b2rk1/pp2ppbp/2q2np1/2pp4/2P5/1P2P3/PB1PBPPP/RN1Q1RK1 b - - +QI.13* +r1b2rk1/pp2ppbp/2q2np1/2pp4/5P2/1P2P3/PBPPB1PP/RN1Q1RK1 b - - +QI.12* +r1b2rk1/ppq1ppbp/2n2np1/2ppN3/8/1P2P3/PBPPBPPP/RN1Q1RK1 w - - +QI.11* +r1b2rk1/ppq2ppp/2n1pn2/2p5/2BP4/P1P1PN2/5PPP/R1BQ1RK1 w - - +NI.01 +r1bq1rk1/1p1n1pbp/2pp1np1/p3p3/2PPP3/2N2N2/PP3PPP/R1BQRBK1 w - - +KI.09 +r1bq1rk1/1p1n1pbp/p2p1np1/2pP4/P3P3/2N2N2/1P2BPPP/R1BQ1RK1 w - - +BI.15 +r1bq1rk1/1p1nb1pp/2n2p2/p3p3/2Pp4/1P1P1NP1/P1N2PBP/R1BQR1K1 b - - +BI.07* +r1bq1rk1/1p1nb1pp/2n2p2/p3p3/2Pp4/3P2P1/PPNN1PBP/R1BQR1K1 b - - +BI.08* +r1bq1rk1/1p1nb1pp/2n5/p3pp2/2Pp4/P2P1NP1/1P1N1PBP/R1BQR1K1 w - - +BI.02* +r1bq1rk1/1p1nbppp/2n5/p3p3/2Pp4/P2P1NP1/1P1N1PBP/R1BQR1K1 b - - +BI.03* +r1bq1rk1/1p1nbppp/2n5/p3p3/2PpN3/3P1NP1/PP3PBP/R1BQR1K1 b - - +BI.04* +r1bq1rk1/1p1nppbp/2n3p1/p7/2Pp4/P2P1NP1/1P1N1PBP/R1BQR1K1 b - - +BI.22* +r1bq1rk1/1p2bppp/2n2n2/p3p3/2Pp4/P2P1NP1/1P1N1PBP/R1BQ1RK1 b - - +BI.15* +r1bq1rk1/1p2ppb1/2n3pp/p1n5/2Pp4/P2P1NP1/1P1N1PBP/1RBQR1K1 w - - +BI.21* +r1bq1rk1/1p3pp1/2n2b1p/p3p3/2Pp4/P2P1NP1/1P1N1PBP/R2Q1RK1 b - - +BI.10* +r1bq1rk1/1p3ppp/2n1pn2/pBbp4/5B2/2P1PN2/PP3PPP/RN1QK2R w KQ - +SL.05* +r1bq1rk1/1p3ppp/p1nbpn2/1Bpp4/2PP4/2N1PN2/PP3PPP/R1BQ1RK1 w - - +NI.02* +r1bq1rk1/1pp1ppbp/p1np1np1/8/2PP4/2N2NP1/PP2PPBP/R1BQ1RK1 w - - +KI.71 +r1bq1rk1/2p1bpp1/p1np1n1p/1p2p3/4P3/1BP2N1P/PP1P1PP1/RNBQR1K1 w - - +RL.22 +r1bq1rk1/2p1bppp/p1np1n2/1p2p3/3PP3/1BP2N2/PP3PPP/RNBQR1K1 b - - +RL.20 +r1bq1rk1/2p1bppp/p1np1n2/1p2p3/4P3/1BP2N1P/PP1P1PP1/RNBQR1K1 b - - +RL.21 +r1bq1rk1/2p1bppp/p2p1n2/np2p3/4P3/2P2N1P/PPBP1PP1/RNBQR1K1 b - - +RL.23 +r1bq1rk1/2ppbppp/p1n2n2/1p2p3/P3P3/1B3N2/1PPP1PPP/RNBQR1K1 b - - +RL.18 +r1bq1rk1/3nppbp/p1pp1np1/1p6/2PPP3/2NBBP2/PP2N1PP/R2Q1RK1 w - - +KI.46 +r1bq1rk1/5ppp/p1p1pn2/2bp4/2P5/2N1PN2/PPQ2PPP/R1B2RK1 b - - +NI.01* +r1bq1rk1/p1p2ppp/5n2/3p2B1/1b6/2NB4/PPP2PPP/R2Q1RK1 b - - +SO.03 +r1bq1rk1/p3bp1p/2n2np1/1pp1p3/3pPP1N/3P2P1/PPP1N1BP/R1BQ1RK1 b - - +KI.04* +r1bq1rk1/p3bppp/2n2n2/1pp1p3/3pP3/3P1NP1/PPP1NPBP/R1BQ1RK1 w - - +KI.05* +r1bq1rk1/pp1n1pbp/2pp1np1/4p3/2PPP3/2N1BP2/PP1QN1PP/R3KB1R w KQ - +KI.42 +r1bq1rk1/pp1n1pbp/2pp1np1/4p3/2PPP3/2N2N2/PP3PPP/R1BQRBK1 b - - +KI.10 +r1bq1rk1/pp1n1pbp/2pp1np1/4p3/2PPP3/2N2NP1/PP3PBP/R1BQ1RK1 w - - +KI.63 +r1bq1rk1/pp1n1pbp/2pp1np1/4p3/2PPP3/2N2NPP/PP3PB1/R1BQ1RK1 b - - +KI.62 +r1bq1rk1/pp1n1ppp/4pn2/2p5/1bBP4/2N1PN2/PP3PPP/R1BQ1RK1 w - - +NI.03 +r1bq1rk1/pp1nbppp/2n5/2p1p3/3pP3/3P1NP1/PPP1NPBP/R1BQ1RK1 w - - +KI.07* +r1bq1rk1/pp1nbppp/2n5/4p3/2Pp4/3P1NP1/PP1N1PBP/R1BQR1K1 b - - +BI.05* +r1bq1rk1/pp1nbppp/2n5/4p3/2Pp4/N2P1NP1/PP3PBP/R1BQR1K1 b - - +BI.09* +r1bq1rk1/pp1pppbp/2n2np1/1Bp5/4P3/2N2N2/PPPP1PPP/R1BQ1RK1 w - - +EO.01* +r1bq1rk1/pp1pppbp/2n2np1/2p5/2P5/1P2PN2/PB1PBPPP/RN1QK2R b KQ - +EO.40* +r1bq1rk1/pp1pppbp/2n2np1/2p5/2P5/1P3NP1/PB1PPPBP/RN1QK2R b KQ - +EO.48* +r1bq1rk1/pp1pppbp/2n2np1/2p5/2P5/2N2NP1/PP1PPPBP/R1BQ1RK1 b - - +EO.27* +r1bq1rk1/pp1pppbp/2n2np1/2p5/2P5/2N2NP1/PP1PPPBP/R1BQ1RK1 w - - +EO.27 +r1bq1rk1/pp1pppbp/2n2np1/8/2PN4/2N1P3/PP2BPPP/R1BQK2R b KQ - +EO.41* +r1bq1rk1/pp1pppbp/2n2np1/8/2PN4/2N3P1/PP2PPBP/R1BQ1RK1 b - - +EO.26 +r1bq1rk1/pp2bppp/2n1p3/2pn4/3PP3/2N2NP1/PP3PBP/R1BQ1RK1 b - - +TD.02 +r1bq1rk1/pp2bppp/2n2n2/2p1p3/3pP3/3P1NP1/PPPN1PBP/R1BQ1RK1 w - - +KI.12* +r1bq1rk1/pp2bppp/2n2n2/2pp2B1/3P4/2N2NP1/PP2PPBP/R2Q1RK1 b - - +TD.03 +r1bq1rk1/pp2bppp/2n2n2/2pp4/3P4/2N2NP1/PP2PPBP/R1BQ1RK1 w - - +TD.04 +r1bq1rk1/pp2bppp/2n2n2/2ppp3/4P3/3P1NP1/PPP2PBP/RNBQ1RK1 w - - +KI.15* +r1bq1rk1/pp2bppp/2n2n2/2ppp3/4P3/3P1NP1/PPPN1PBP/R1BQ1RK1 b - - +KI.14* +r1bq1rk1/pp2bppp/2n2n2/4p1B1/2Pp4/3P1NP1/PP3PBP/RN1Q1RK1 b - - +BI.16* +r1bq1rk1/pp2bppp/2n5/2pp4/3P4/5NP1/PP2PPBP/R1BQ1RK1 w - - +TD.01 +r1bq1rk1/pp2bppp/2nn4/2p1p3/3pPP2/3P2P1/PPPNN1BP/R1BQ1RK1 b - - +KI.01* +r1bq1rk1/pp2bppp/2nppn2/6B1/3NP3/2N5/PPPQ1PPP/2KR1B1R w - - +SI.28 +r1bq1rk1/pp2nppp/2nb4/4p3/2Pp4/3P1NP1/PP3PBP/RNBQ1RK1 w - - +BI.36* +r1bq1rk1/pp2ppb1/2n2npp/2pp4/8/P1NP1NP1/1PP1PPBP/1RBQ1RK1 b - - +KI.70* +r1bq1rk1/pp2ppbp/2n2np1/2p5/2P5/2N2NP1/PP2PPBP/R1BQ1RK1 b - - +KI.68* +r1bq1rk1/pp2ppbp/2n2np1/2p5/2P5/2N2NP1/PP2PPBP/R1BQ1RK1 w - - +KI.68 +r1bq1rk1/pp2ppbp/2n2np1/2p5/N1Pp4/3P1NP1/PP2PPBP/R1BQ1RK1 b - - +KI.67* +r1bq1rk1/pp2ppbp/2n2np1/2pp4/2P5/3P1NP1/PP2PPBP/RNBQ1RK1 w - - +KI.69* +r1bq1rk1/pp2ppbp/2n2np1/2pp4/4P3/3P1NP1/PPPN1PBP/R1BQ1RK1 b - - +KI.65* +r1bq1rk1/pp2ppbp/2n2np1/2pp4/8/1P2PN2/PBPPBPPP/RN1Q1RK1 w - - +QI.09* +r1bq1rk1/pp2ppbp/2n2np1/2pp4/8/2NP1NP1/PPP1PPBP/R1BQ1RK1 w - - +KI.72* +r1bq1rk1/pp2ppbp/2n2np1/2pp4/8/2PP1NP1/PP2PPBP/RNBQ1RK1 w - - +KI.75* +r1bq1rk1/pp2ppbp/2n2np1/2pp4/8/P1NP1NP1/1PP1PPBP/R1BQ1RK1 b - - +KI.71* +r1bq1rk1/pp2ppbp/2n2np1/2pp4/Q7/2PP1NP1/PP2PPBP/RNB2RK1 b - - +KI.74* +r1bq1rk1/pp2ppbp/2n2np1/2ppN3/8/1P2P3/PBPPBPPP/RN1Q1RK1 b - - +QI.10* +r1bq1rk1/pp2ppbp/2n2np1/3p4/2PP4/2N2N2/PP2BPPP/R1BQ1RK1 b - - +TD.04* +r1bq1rk1/pp2ppbp/2n2np1/8/2Pp4/3P1NP1/PP3PBP/RNBQ1RK1 w - - +BI.24* +r1bq1rk1/pp2ppbp/2n2np1/8/2Pp4/3P1NP1/PP3PBP/RNBQR1K1 b - - +BI.23* +r1bq1rk1/pp2ppbp/2n3p1/2pn4/8/2N2NP1/PP1PPPBP/R1BQ1RK1 w - - +EO.26* +r1bq1rk1/pp2ppbp/2n3p1/8/2BPP3/4B3/P3NPPP/R2Q1RK1 b - - +GI.06 +r1bq1rk1/pp2ppbp/2np1np1/8/2BNP3/2N1BP2/PPPQ2PP/R3K2R b KQ - +SI.18 +r1bq1rk1/pp2ppbp/3p1np1/n1pP4/2P5/2N2NP1/PP2PPBP/R1BQ1RK1 w - - +KI.67 +r1bq1rk1/pp2ppbp/5np1/3p4/2PP4/2N5/PP2BPPP/R1BQ1RK1 b - - +TD.01* +r1bq1rk1/pp3pb1/2n2npp/2ppp3/4P3/2PP1NP1/PP1N1PBP/R1BQ1RK1 w - - +KI.62* +r1bq1rk1/pp3pb1/2n2npp/2ppp3/4P3/2PP1NP1/PP1N1PBP/R1BQR1K1 b - - +KI.61* +r1bq1rk1/pp3pbp/2n2np1/2ppp3/4P3/2PP1NP1/PP1N1PBP/R1BQ1RK1 b - - +KI.63* +r1bq1rk1/pp3pbp/2n2np1/2ppp3/4P3/3P1NP1/PPPN1PBP/R1BQ1RK1 w - - +KI.64* +r1bq1rk1/pp3pbp/2n2np1/3pp3/2PN4/2N1P3/PP2BPPP/R1BQ1RK1 w - - +TD.02* +r1bq1rk1/pp3ppp/2n1pn2/1Bbp4/2P5/4PN2/PP1N1PPP/R1BQ1RK1 b - - +NI.03* +r1bq1rk1/pp3ppp/2n1pn2/2pp4/1bPP4/P1NBPN2/1P3PPP/R1BQ1RK1 b - - +NI.02 +r1bq1rk1/pp3ppp/2n2n2/1Bbp4/8/1P2PN2/P4PPP/RNBQ1RK1 b - - +NI.04* +r1bq1rk1/pp3ppp/2nbpn2/1Bpp4/2PP4/4PN2/PP3PPP/RNBQ1RK1 w - - +NI.05* +r1bq1rk1/ppp1b1pp/2n5/3npp2/8/P1NPPN2/1PQ2PPP/R1B1KB1R b KQ - +SI.24* +r1bq1rk1/ppp1bppp/2n2n2/3pp1B1/8/3P1NP1/PPP1PPBP/RN1Q1RK1 b - - +PU.01* +r1bq1rk1/ppp1n1bp/3p2p1/3Ppp1n/1PP1P3/2N2NP1/P3BP1P/R1BQ1RK1 w - - +KI.04 +r1bq1rk1/ppp1npbp/3p1np1/3Pp3/1PP1P3/2N2N2/P3BPPP/R1BQ1RK1 b - - +KI.05 +r1bq1rk1/ppp1npbp/3p1np1/3Pp3/2P1P3/2N2N2/PP1BBPPP/R2Q1RK1 b - - +KI.06 +r1bq1rk1/ppp1npbp/3p1np1/3Pp3/2P1P3/2N5/PP1NBPPP/R1BQ1RK1 b - - +KI.07 +r1bq1rk1/ppp1npbp/3p1np1/3Pp3/2P1P3/2N5/PP2BPPP/R1BQNRK1 b - - +KI.03 +r1bq1rk1/ppp1ppbp/2np1np1/8/2PP4/2N2NP1/PP2PPBP/R1BQ1RK1 b - - +KI.72 +r1bq1rk1/ppp1ppbp/2np1np1/8/2PP4/2N2NP1/PP2PPBP/R1BQK2R w KQ - +KI.73 +r1bq1rk1/ppp1ppbp/2np1np1/8/2PPP3/2N1BP2/PP4PP/R2QKBNR w KQ - +KI.36 +r1bq1rk1/ppp2pbp/2np1np1/4p3/2P5/2NP1NP1/PP2PPBP/1RBQ1RK1 b - - +EO.13 +r1bq1rk1/ppp2pbp/2np1np1/4p3/2PPP3/2N1BN2/PP2BPPP/R2Q1RK1 b - - +KI.08 +r1bq1rk1/ppp2ppp/1n3n2/8/1b1P4/2NB4/PP2NPPP/R1BQK2R b KQ - +FR.23* +r1bq1rk1/pppn1pbp/3p1np1/3Pp3/2P1P3/2N2N2/PP2BPPP/R1BQ1RK1 b - - +KI.12 +r1bq1rk1/pppn1pbp/3p1np1/3Pp3/2P1P3/2N2N2/PP2BPPP/R1BQK2R w KQ - +KI.16 +r1bq1rk1/pppn1pbp/3p1np1/4p3/2PP4/2N2NP1/PP2PPBP/R1BQ1RK1 w - - +KI.65 +r1bq1rk1/pppn1pbp/3p1np1/4p3/2PPP3/2N1BN2/PP2BPPP/R2Q1RK1 b - - +KI.13 +r1bq1rk1/pppn1pbp/3p1np1/4p3/2PPP3/2N2N2/PP2BPPP/R1BQ1RK1 w - - +KI.14 +r1bq1rk1/pppn1pbp/3p1np1/4p3/2PPP3/2N2N2/PP2BPPP/R1BQR1K1 b - - +KI.11 +r1bq1rk1/pppn1pbp/3p1np1/4p3/2PPP3/2N2NP1/PP3PBP/R1BQ1RK1 b - - +KI.64 +r1bq1rk1/pppnbppp/4pn2/3p2B1/2PP4/2N1PN2/PP3PPP/2RQKB1R b K - +QO.11 +r1bq1rk1/pppnbppp/4pn2/3p2B1/2PP4/2N1PN2/PP3PPP/R2QKB1R w KQ - +QO.12 +r1bq1rk1/pppnn1bp/3p2p1/3Ppp2/2P1P3/2N2P2/PP2B1PP/R1BQNRK1 w - - +KI.02 +r1bq1rk1/pppnn1bp/3p2p1/3Ppp2/2P1P3/2NN4/PP2BPPP/R1BQ1RK1 w - - +KI.01 +r1bq1rk1/pppnppbp/3p1np1/8/2PPP3/2N1BP2/PP4PP/R2QKBNR w KQ - +KI.48 +r1bq1rk1/pppp1ppp/2n2n2/4p3/1bP5/2N2NP1/PP1PPPBP/R1BQ1RK1 b - - +EO.01 +r1bqk1nr/1p3ppp/p1nbp3/1Bpp4/3P4/4PN2/PPP2PPP/RNBQ1RK1 w kq - +NI.08* +r1bqk1nr/p4ppp/2p5/2bpp3/8/6P1/PPP1PPBP/RNBQK2R w KQkq - +GI.05* +r1bqk1nr/pp1n1ppp/2pb4/3p4/2PPp3/4P3/PP1N1PPP/RNBQKB1R w KQkq - +FR.17* +r1bqk1nr/pp1p1pbp/2n1p1p1/2p5/2P5/2N3P1/PP1PPPBP/R1BQK1NR w KQkq - +EO.29* +r1bqk1nr/pp1p1pbp/2n3p1/2p1p3/2P5/2N3P1/PP1PPPBP/R1BQK1NR w KQkq - +EO.30* +r1bqk1nr/pp1p1pbp/2n3p1/2p1p3/4P3/2NP2P1/PPP2PBP/R1BQK1NR b KQkq - +EO.18* +r1bqk1nr/pp1pppbp/2n3p1/1Bp5/4P3/5N2/PPPP1PPP/RNBQ1RK1 b kq - +EO.11* +r1bqk1nr/pp1pppbp/2n3p1/2p5/2P1P3/2N3P1/PP1P1PBP/R1BQK1NR b KQkq - +EO.30 +r1bqk1nr/pp1pppbp/2n3p1/2p5/2P5/2N1P1P1/PP1P1PBP/R1BQK1NR b KQkq - +EO.29 +r1bqk1nr/pp1pppbp/2n3p1/2p5/2P5/2N2NP1/PP1PPPBP/R1BQK2R b KQkq - +EO.28 +r1bqk1nr/pp1pppbp/2n3p1/2p5/2P5/2N3P1/PP1PPPBP/R1BQK1NR b KQkq - +EO.31* +r1bqk1nr/pp1pppbp/2n3p1/2p5/2P5/2N3P1/PP1PPPBP/R1BQK1NR w KQkq - +EO.31 +r1bqk1nr/pp1pppbp/2n3p1/2p5/4P3/5NP1/PPPP1PBP/RNBQK2R b KQkq - +EO.14* +r1bqk1nr/pp1pppbp/2n3p1/8/2P5/8/PPN1PPPP/RNBQKB1R b KQkq - +EO.37* +r1bqk1nr/pp1pppbp/2n3p1/8/2PN4/2N5/PP2PPPP/R1BQKB1R w KQkq - +EO.35 +r1bqk1nr/pp1pppbp/2n3p1/8/2PN4/8/PP2PPPP/RNBQKB1R w KQkq - +EO.38* +r1bqk1nr/pp1pppbp/2n3p1/8/3N4/6P1/PPP1PP1P/RNBQKB1R w KQkq - +EO.53* +r1bqk1nr/pp2bppp/2n5/2ppp3/8/3P1NP1/PPP1PPBP/RNBQK2R w KQkq - +KI.27* +r1bqk1nr/pp2ppbp/2np2p1/2p5/4P3/2NP2P1/PPP2PBP/R1BQK1NR w KQkq - +SI.45 +r1bqk1nr/pp3pbp/2n1p1p1/2pp4/8/3P1NP1/PPP1PPBP/RNBQ1RK1 w kq - +KI.78* +r1bqk1nr/pp3pbp/2n3p1/2ppp3/8/3P1NP1/PPP1PPBP/RNBQ1RK1 w kq - +KI.29* +r1bqk1nr/pp4pp/2n5/4pp2/1bPp4/3P2P1/PP1N1PBP/RNBQK2R b KQkq - +BI.33* +r1bqk1nr/pp4pp/2nb4/2p1pp2/2Pp4/3P1NP1/PP2PPBP/RNBQ1RK1 w kq - +KI.60* +r1bqk1nr/ppp1ppbp/2np2p1/8/2PPP3/2N5/PP3PPP/R1BQKBNR w KQkq - +KF.03 +r1bqk1nr/ppp2pbp/2np2p1/4p3/2P1P3/2N3P1/PP1P1PBP/R1BQK1NR w KQkq - +EO.18 +r1bqk1nr/ppp2pbp/2np2p1/4p3/2P5/2N1P1P1/PP1PNPBP/R1BQK2R b KQkq - +EO.17 +r1bqk1nr/ppp2pbp/2np2p1/4p3/2P5/2NP2P1/PP2PPBP/1RBQK1NR b Kkq - +EO.16 +r1bqk1nr/ppp2pbp/2np2p1/4p3/2P5/2NP2P1/PP2PPBP/R1BQK1NR b KQkq - +SI.45* +r1bqk1nr/ppp2ppp/8/2bpn3/8/2P5/PP1NPPPP/R1BQKBNR w KQkq - +CK.09* +r1bqk1nr/pppn1pbp/3p2p1/4p3/2PPP3/2N2N2/PP2BPPP/R1BQK2R b KQkq - +KF.01 +r1bqk1nr/pppnppbp/3p2p1/8/2PPP3/2N5/PP3PPP/R1BQKBNR w KQkq - +KF.02 +r1bqk1nr/pppp1pbp/2n3p1/4p3/2P5/2N2NP1/PP1PPPBP/R1BQK2R b KQkq - +EO.19 +r1bqk1nr/pppp1pbp/2n3p1/4p3/2P5/2N3P1/PP1PPPBP/1RBQK1NR b Kkq - +EO.15 +r1bqk1nr/pppp1ppp/2n5/2b1p3/1PB1P3/5N2/P1PP1PPP/RNBQK2R b KQkq - +IG.05 +r1bqk1nr/pppp1ppp/2n5/2b1p3/2B1P3/5N2/PPPP1PPP/RNBQK2R w KQkq - +IG.02 +r1bqk1nr/pppp1ppp/2n5/2b1p3/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - +VG.02* +r1bqk1nr/pppp1ppp/2n5/2b5/3NP3/8/PPP2PPP/RNBQKB1R w KQkq - +SO.05 +r1bqk2r/1p4pp/2nb1n2/p3pp2/2Pp4/P2P2P1/1P1N1PBP/RNBQ1RK1 w kq - +BI.32* +r1bqk2r/1pp1bppp/p1np1n2/4p3/B3P3/5N2/PPPP1PPP/RNBQR1K1 w kq - +RL.16 +r1bqk2r/1pppbppp/p1B2n2/4p3/4P3/5N2/PPPP1PPP/RNBQ1RK1 b kq - +RL.14 +r1bqk2r/1pppbppp/p1n2n2/4p3/B2PP3/5N2/PPP2PPP/RNBQ1RK1 b kq - +RL.15 +r1bqk2r/1pppbppp/p1n2n2/4p3/B3P3/5N2/PPPP1PPP/RNBQ1RK1 w kq - +RL.13 +r1bqk2r/2p1bppp/p1np1n2/1p2p3/4P3/1B3N2/PPPP1PPP/RNBQR1K1 w kq - +RL.19 +r1bqk2r/2ppbppp/p1n2n2/1p2p3/4P3/1B3N2/PPPP1PPP/RNBQR1K1 b kq - +RL.17 +r1bqk2r/p4ppp/2pbpn2/2pp4/2P5/2NPPN2/PP3PPP/R1BQK2R b KQkq - +NI.14* +r1bqk2r/pp1pnpbp/2n1p1p1/2p5/4P3/2NP2P1/PPP2PBP/R1BQK1NR w KQkq - +EO.17* +r1bqk2r/pp1pppbp/2n2np1/2p5/2P5/2N3P1/PP1PPPBP/R1BQK1NR w KQkq - +EO.28* +r1bqk2r/pp1pppbp/2n2np1/2p5/4P3/2N3P1/PPPP1PBP/R1BQK1NR w KQkq - +EO.19* +r1bqk2r/pp1pppbp/2n2np1/8/2P5/2N5/PPN1PPPP/R1BQKB1R b KQkq - +EO.36* +r1bqk2r/pp1pppbp/2n2np1/8/3N4/6P1/PPP1PPBP/RNBQK2R w KQkq - +EO.51* +r1bqk2r/pp1pppbp/2n2np1/8/3NP3/2N5/PPP2PPP/R1BQKB1R w KQkq - +EO.03* +r1bqk2r/pp2b1pp/2n2n2/2p1pp2/2Pp4/3PPNP1/PP3PBP/RNBQ1RK1 w kq - +KI.57* +r1bqk2r/pp2b1pp/2n2n2/2p2p2/2PPp3/3P1NP1/PP3PBP/RNBQ1RK1 w kq - +KI.56* +r1bqk2r/pp2b1pp/2n2n2/4pp2/2Pp4/3P1NP1/PP3PBP/RNBQR1K1 b kq - +BI.29* +r1bqk2r/pp2b1pp/2n2n2/4ppB1/2Pp4/3P1NP1/PP3PBP/RN1Q1RK1 b kq - +BI.30* +r1bqk2r/pp2b1pp/2n5/2pnpp2/8/3P1NP1/PP2PPBP/RNBQ1RK1 w kq - +KI.59* +r1bqk2r/pp2bppp/2n1p3/2pn4/8/2N2NP1/PP1PPPBP/R1BQ1RK1 w kq - +EO.41 +r1bqk2r/pp2bppp/2n2n2/2p1p3/3pP3/3P1NP1/PPP2PBP/RNBQ1RK1 w kq - +KI.17* +r1bqk2r/pp2bppp/2n2n2/2p1p3/3pP3/3P1NP1/PPPN1PBP/R1BQ1RK1 b kq - +KI.16* +r1bqk2r/pp2bppp/2n2n2/2ppp3/4P3/3P1N2/PPPNBPPP/R1BQK2R w KQkq - +OI.01* +r1bqk2r/pp2bppp/2n2n2/2ppp3/4P3/3P1NP1/PPP2PBP/RNBQ1RK1 b kq - +KI.18* +r1bqk2r/pp2bppp/2n2n2/2ppp3/4P3/3P2P1/PPPN1PBP/R1BQK1NR w KQkq - +KF.01* +r1bqk2r/pp2bppp/2n2n2/2ppp3/8/3P1NP1/PPP1PPBP/RNBQ1RK1 w kq - +KI.19* +r1bqk2r/pp2bppp/2n2n2/4p3/2Pp4/3P1NP1/PP3PBP/RNBQ1RK1 b kq - +BI.17* +r1bqk2r/pp2npbp/2n3p1/2ppp3/4P3/3P1NP1/PPP2PBP/RNBQ1RK1 w kq - +KI.28* +r1bqk2r/pp2nppp/2n1p3/2ppP3/3P4/P1P2N2/2P2PPP/R1BQKB1R w KQkq - +FR.13 +r1bqk2r/pp2nppp/2nb4/1B1p4/8/1N3N2/PPP2PPP/R1BQ1RK1 w kq - +FR.23 +r1bqk2r/pp2nppp/2nbp3/1Bpp4/2PP4/4PN2/PP3PPP/RNBQ1RK1 b kq - +NI.09* +r1bqk2r/pp2ppbp/2n2np1/2pp4/8/2NP1NP1/PPP1PPBP/R1BQ1RK1 b kq - +KI.73* +r1bqk2r/pp3ppp/2n1pn2/2bp4/1P6/2P1PN2/P2N1PPP/R1BQKB1R b KQkq - +SL.09* +r1bqk2r/pp3ppp/2nbpn2/1Bpp4/2P5/4PN2/PP1P1PPP/RNBQ1RK1 w kq - +NI.07* +r1bqk2r/pp3ppp/2nbpn2/1Bpp4/3P4/4PN2/PPP2PPP/RNBQ1RK1 w kq - +NI.06* +r1bqk2r/pp3ppp/2nbpn2/3p4/2PN4/2N1P3/PP3PPP/R1BQKB1R w KQkq - +TD.07* +r1bqk2r/pp3ppp/2nppn2/2p5/2PP4/2PBPN2/P4PPP/R1BQK2R w KQkq - +NI.14 +r1bqk2r/ppp1bppp/1nn5/4p3/4P3/P2P1N2/1P2BPPP/RNBQK2R b KQkq - +SI.11* +r1bqk2r/ppp1bppp/2n2n2/3pp3/8/3P1NP1/PPP1PPBP/RNBQK2R w KQkq - +PU.03* +r1bqk2r/ppp1bppp/2n5/3np3/8/2NPPN2/PP3PPP/R1BQKB1R b KQkq - +SI.22* +r1bqk2r/ppp1bppp/2n5/3np3/8/P2P1N2/1P2PPPP/RNBQKB1R w KQkq - +SI.10* +r1bqk2r/ppp1bppp/2n5/3np3/8/P2PPN2/1P3PPP/RNBQKB1R b KQkq - +SI.23* +r1bqk2r/ppp1bppp/2n5/3p4/3Pn3/3B1N2/PPP2PPP/RNBQ1RK1 w kq - +RG.06 +r1bqk2r/ppp2ppp/2n5/2bnp3/8/2NPPN2/PP3PPP/R1BQKB1R b KQkq - +SI.26* +r1bqk2r/ppp2ppp/2n5/2bnp3/8/P2P1N2/1P2PPPP/RNBQKB1R w KQkq - +SI.13* +r1bqk2r/ppp3pp/2nb1n2/3ppp2/8/3P1NP1/PPP1PPBP/RNBQ1RK1 w kq - +PU.02* +r1bqk2r/pppnbppp/3p1n2/4p3/2PPP3/2N2N2/PP2BPPP/R1BQK2R b KQkq - +OI.01 +r1bqk2r/pppp1ppp/2n2n2/3Np3/1bP5/5NP1/PP1PPP1P/R1BQKB1R b KQkq - +EO.02 +r1bqk2r/pppp1ppp/2n2n2/4p3/1b1PP3/2N2N2/PPP2PPP/R1BQKB1R w KQkq - +SO.01 +r1bqk2r/pppp1ppp/2n2n2/4p3/1b2P3/2N2N2/PPPP1PPP/R1BQKB1R w KQkq - +KP.03* +r1bqk2r/pppp1ppp/2n2n2/4p3/1bP5/2N1PN2/PP1P1PPP/R1BQKB1R w KQkq - +EO.05 +r1bqkb1r/1p1n1ppp/p2ppn2/6B1/3NPP2/2N5/PPP3PP/R2QKB1R w KQkq - +SI.06 +r1bqkb1r/1p2pppp/2n2n2/p1Pp4/5B2/2P2N2/PP2PPPP/RN1QKB1R b KQkq - +SL.04* +r1bqkb1r/1p3ppp/p1np1n2/1N2p1B1/4P3/2N5/PPP2PPP/R2QKB1R w KQkq - +SI.36 +r1bqkb1r/1p3ppp/p1nppn2/6B1/3NP3/2N5/PPPQ1PPP/2KR1B1R b kq - +SI.29 +r1bqkb1r/1ppp1ppp/p1n2n2/4p3/B3P3/5N2/PPPP1PPP/RNBQK2R w KQkq - +RL.12 +r1bqkb1r/1ppp1ppp/p1n5/4p3/B3n3/5N2/PPPP1PPP/RNBQ1RK1 w kq - +RL.27 +r1bqkb1r/2p2ppp/p1p2n2/3p4/2PPp3/2N1P3/PP2NPPP/R1BQK2R b KQkq - +FR.13* +r1bqkb1r/2p2ppp/p1p2n2/3p4/2PPp3/4P3/PP2NPPP/RNBQK2R w KQkq - +FR.12* +r1bqkb1r/5p1p/p1np4/1p1Npp2/4P3/N7/PPP2PPP/R2QKB1R w KQkq - +SI.38 +r1bqkb1r/5ppp/p1np1n2/1p2p1B1/4P3/N1N5/PPP2PPP/R2QKB1R w KQkq - +SI.37 +r1bqkb1r/p2n1ppp/2p1pn2/1p6/2BP4/2N1PN2/PP3PPP/R1BQK2R w KQkq - +SL.09 +r1bqkb1r/p4ppp/5n2/3pp3/8/4P3/PP3PPP/RNBQKB1R w KQkq - +TD.08* +r1bqkb1r/pp1npppp/2n5/8/2Pp4/3P1NP1/PP3P1P/RNBQKB1R w KQkq - +BI.27* +r1bqkb1r/pp1npppp/2n5/8/2Pp4/B2P1NP1/4PP1P/RN1QKB1R w KQkq - +BI.40* +r1bqkb1r/pp1p1ppp/2n1pn2/1Bp5/4P3/2N2N2/PPPP1PPP/R1BQK2R b KQkq - +EO.05* +r1bqkb1r/pp1p1ppp/2n1pn2/1N6/2P5/2N5/PP2PPPP/R1BQKB1R b KQkq - +EO.33 +r1bqkb1r/pp1p1ppp/2n1pn2/2p5/2P5/2N3P1/PP1PPP1P/R1BQKBNR w KQkq - +EO.34* +r1bqkb1r/pp1p1ppp/2n1pn2/2p5/4P3/2N2N2/PPPP1PPP/R1BQKB1R w KQkq - +EO.06* +r1bqkb1r/pp1p1ppp/2n1pn2/8/2PN4/2N3P1/PP2PP1P/R1BQKB1R b KQkq - +EO.32 +r1bqkb1r/pp1p1ppp/2n2n2/2p1p3/2P5/1P3N2/P2PPPPP/RNBQKB1R w KQkq - +EO.43* +r1bqkb1r/pp1p1ppp/2n2n2/2p1p3/8/1P2PN2/PBPP1PPP/RN1QKB1R b KQkq - +EO.60* +r1bqkb1r/pp1p1ppp/2n2n2/4p3/3NP3/2N5/PPP2PPP/R1BQKB1R w KQkq - +SI.35 +r1bqkb1r/pp1ppp1p/2n2np1/2p5/4P3/2N2N2/PPPP1PPP/R1BQKB1R w KQkq - +EO.04* +r1bqkb1r/pp1ppp1p/5np1/1Bp5/3nP3/2N2N2/PPPP1PPP/R1BQK2R w KQkq - +EO.02* +r1bqkb1r/pp1ppppp/2n2n2/1Bp5/8/4PN2/PPPP1PPP/RNBQK2R b KQkq - +EO.59* +r1bqkb1r/pp1ppppp/2n2n2/2p5/4P3/2N5/PPPP1PPP/R1BQKBNR w KQkq - +EO.21* +r1bqkb1r/pp1ppppp/2n2n2/2p5/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - +EO.09* +r1bqkb1r/pp1ppppp/2n2n2/8/2PN4/8/PP2PPPP/RNBQKB1R b KQkq - +EO.42* +r1bqkb1r/pp1ppppp/2n2n2/8/3N4/6P1/PPP1PP1P/RNBQKB1R b KQkq - +EO.52* +r1bqkb1r/pp1ppppp/2n2n2/8/3NP3/2N5/PPP2PPP/R1BQKB1R b KQkq - +SI.34 +r1bqkb1r/pp1ppppp/n4n2/2P5/8/8/PPP1PPPP/RNBQKBNR w KQkq - +RE.18* +r1bqkb1r/pp2n1pp/2n2p2/2ppp3/8/3P1NP1/PPP1PPBP/RNBQ1RK1 w kq - +KI.52* +r1bqkb1r/pp2nppp/2n1p3/1Bpp4/2P5/4PN2/PP1P1PPP/RNBQK2R w KQkq - +NI.16* +r1bqkb1r/pp2nppp/2n1p3/1Bpp4/8/1P2PN2/P1PP1PPP/RNBQK2R w KQkq - +NI.13* +r1bqkb1r/pp2nppp/2n1p3/1Bpp4/8/4PN2/PPPP1PPP/RNBQ1RK1 w kq - +NI.10* +r1bqkb1r/pp2pp1p/2n2np1/2pp4/4P3/3P1N2/PPPN1PPP/R1BQKB1R w KQkq - +OI.02* +r1bqkb1r/pp2pp1p/2n2np1/3p4/2PP4/2N5/PP3PPP/R1BQKBNR w KQkq - +TD.09* +r1bqkb1r/pp2pp1p/2n2np1/8/2Pp4/B2P1NP1/4PP1P/RN1QKB1R w KQkq - +BI.39* +r1bqkb1r/pp2pp1p/2n3p1/2pn4/8/2N1PN2/PP1P1PPP/R1BQKB1R w KQkq - +EO.32* +r1bqkb1r/pp2pppp/2n2n2/1Bpp4/3P4/4PN2/PPP2PPP/RNBQK2R b KQkq - +NI.27* +r1bqkb1r/pp2pppp/2n2n2/1Bpp4/8/1P2PN2/P1PP1PPP/RNBQK2R b KQkq - +NI.26* +r1bqkb1r/pp2pppp/2n2n2/1Bpp4/8/4PN2/PPPP1PPP/RNBQK2R w KQkq - +NI.28* +r1bqkb1r/pp2pppp/2n2n2/2pp4/2PP4/4PN2/PP3PPP/RNBQKB1R b KQkq - +TD.05* +r1bqkb1r/pp2pppp/2n2n2/2pp4/3P4/2P2N2/PP2PPPP/RNBQKB1R w KQkq - +SL.03* +r1bqkb1r/pp2pppp/2n2n2/2pp4/3P4/5NP1/PPP1PPBP/RNBQK2R b KQkq - +GI.07* +r1bqkb1r/pp2pppp/2n2n2/2pp4/4P3/2N2N2/PPPP1PPP/R1BQKB1R w KQkq - +EO.08* +r1bqkb1r/pp2pppp/2n2n2/2pp4/8/3P1NP1/PPP1PPBP/RNBQK2R b KQkq - +KI.76* +r1bqkb1r/pp2pppp/2n2n2/3p4/2PP4/8/PP3PPP/RNBQKBNR w KQkq - +TD.11* +r1bqkb1r/pp2pppp/2n2n2/3p4/2Pp4/4PN2/PP3PPP/RNBQKB1R w KQkq - +TD.12* +r1bqkb1r/pp2pppp/2n5/1Bpn4/8/4PN2/PP1P1PPP/RNBQK2R b KQkq - +EO.44* +r1bqkb1r/pp2pppp/2n5/2n5/2Pp4/3P1NP1/PP3PBP/RNBQ1RK1 b kq - +BI.26* +r1bqkb1r/pp2pppp/2n5/2p5/1n6/2N1PN2/PP1P1PPP/R1BQKB1R w KQkq - +EO.33* +r1bqkb1r/pp2pppp/2n5/2pn4/8/2N3P1/PP1PPPBP/R1BQK1NR b KQkq - +EO.35* +r1bqkb1r/pp2pppp/2n5/2pn4/8/5NP1/PP1PPPBP/RNBQK2R w KQkq - +EO.49 +r1bqkb1r/pp2pppp/2np1n2/2p5/4P3/2N2N2/PPPP1PPP/R1BQKB1R w KQkq - +EO.07* +r1bqkb1r/pp2pppp/2np1n2/6B1/3NP3/2N5/PPP2PPP/R2QKB1R b KQkq - +SI.27 +r1bqkb1r/pp2pppp/2np1n2/8/3NP3/2N5/PPP2PPP/R1BQKB1R w KQkq - +SI.25 +r1bqkb1r/pp3pp1/2n2n1p/2ppp3/8/3P1NP1/PPP1PPBP/RNBQ1RK1 w kq - +KI.20* +r1bqkb1r/pp3ppp/2n1p3/2pn4/3P4/2NBPN2/PP3PPP/R1BQK2R b KQkq - +TD.07 +r1bqkb1r/pp3ppp/2n1pn2/2pp4/2P5/5NP1/PP1PPPBP/RNBQ1RK1 b kq - +KI.77* +r1bqkb1r/pp3ppp/2n1pn2/2pp4/3P4/2P1PN2/PP3PPP/RNBQKB1R w KQkq - +SL.08* +r1bqkb1r/pp3ppp/2n1pn2/2pp4/3P4/5NP1/PPP1PPBP/RNBQ1RK1 b kq - +GI.09* +r1bqkb1r/pp3ppp/2n1pn2/3p4/2PP4/2N2N2/PP3PPP/R1BQKB1R b KQkq - +TD.06* +r1bqkb1r/pp3ppp/2n2n2/2pp4/3P4/2N1PN2/PP3PPP/R1BQKB1R w KQkq - +TD.06 +r1bqkb1r/pp3ppp/2n2n2/2ppp3/8/3P1NP1/PPP1PPBP/RNBQ1RK1 b kq - +KI.21* +r1bqkb1r/pp3ppp/2n2n2/2ppp3/8/3P1NP1/PPP1PPBP/RNBQK2R w KQkq - +KI.22* +r1bqkb1r/pp3ppp/2n2n2/4p3/2Pp4/3P1NP1/PP3PBP/RNBQK2R b KQkq - +BI.20* +r1bqkb1r/pp3ppp/2n5/2pn4/4N3/4P3/PP1P1PPP/R1BQKBNR b KQkq - +EO.54* +r1bqkb1r/pp3ppp/2nppn2/8/2BNP3/2N5/PPP2PPP/R1BQK2R w KQkq - +SI.26 +r1bqkb1r/pp3ppp/2nppn2/8/3NP3/2N5/PPP1BPPP/R1BQK2R w KQkq - +SI.22 +r1bqkb1r/pp4pp/2n2n2/2p1pp2/1PPp4/3P1NP1/P3PPBP/RNBQ1RK1 b kq - +KI.55* +r1bqkb1r/pp4pp/2n2n2/2p1pp2/2P5/3PBNP1/PP3PBP/RN1Q1RK1 b kq - +KI.58* +r1bqkb1r/pp4pp/2n2n2/4pp2/2Pp4/3P1NP1/PP3PBP/RNBQ1RK1 b kq - +BI.31* +r1bqkb1r/ppn1pppp/2n5/2p5/8/2N2NP1/PP1PPPBP/R1BQK2R w KQkq - +EO.36 +r1bqkb1r/ppp2p1p/2n5/3np1p1/8/3PPN2/PP3PPP/RNBQKB1R w KQkq - +SI.20* +r1bqkb1r/ppp2ppp/2n2n2/1B1pp3/4P3/2N2N2/PPPP1PPP/R1BQK2R b KQkq - +SO.01* +r1bqkb1r/ppp2ppp/2n2n2/3pp3/8/3P1NP1/PPP1PPBP/RNBQK2R b KQkq - +PU.10* +r1bqkb1r/ppp2ppp/2n5/3np3/4P3/2N2N2/PP1P1PPP/R1BQKB1R b KQkq - +SI.35* +r1bqkb1r/ppp2ppp/2n5/3np3/4P3/3P1N2/PP3PPP/RNBQKB1R b KQkq - +SI.03* +r1bqkb1r/ppp2ppp/2n5/3np3/8/2N1P3/PPQP1PPP/R1B1KBNR b KQkq - +SI.40* +r1bqkb1r/ppp2ppp/2n5/3np3/8/2N2N2/PP1PPPPP/R1BQKB1R w KQkq - +SI.34* +r1bqkb1r/ppp2ppp/2n5/3np3/8/2N2NP1/PP1PPPBP/R1BQK2R b KQkq - +EO.03 +r1bqkb1r/ppp2ppp/2n5/3np3/8/2NP1N2/PP2PPPP/R1BQKB1R b KQkq - +SI.25* +r1bqkb1r/ppp2ppp/2n5/3np3/8/3P1NP1/PP2PP1P/RNBQKB1R b KQkq - +SI.15* +r1bqkb1r/ppp2ppp/2n5/3np3/8/3PPN2/PP3PPP/RNBQKB1R b KQkq - +SI.19* +r1bqkb1r/ppp2ppp/2n5/3np3/8/P2P1N2/1P2PPPP/RNBQKB1R b KQkq - +SI.14* +r1bqkb1r/ppp2ppp/5n2/3Pp3/3n4/2N2N2/PPPP1PPP/R1BQKB1R w KQkq - +SO.02* +r1bqkb1r/ppp2ppp/5n2/3pn3/8/2P5/PP1NPPPP/R1BQKBNR w KQkq - +CK.08* +r1bqkb1r/ppp3pp/2n2n2/3ppp2/8/3P1NP1/PPP1PPBP/RNBQ1RK1 b kq - +PU.06* +r1bqkb1r/ppp3pp/2n5/3npp2/8/3PPN2/PP3PPP/RNBQKB1R w KQkq - +SI.21* +r1bqkb1r/ppp3pp/2n5/3npp2/8/P2P1N2/1P2PPPP/RNBQKB1R w KQkq - +SI.12* +r1bqkb1r/pppn1ppp/3p1n2/4p1B1/2PP4/2N2N2/PP2PPPP/R2QKB1R b KQkq - +OI.03 +r1bqkb1r/pppn1ppp/3p1n2/4p3/2PP4/2N2NP1/PP2PP1P/R1BQKB1R b KQkq - +OI.02 +r1bqkb1r/pppn1ppp/5n2/3p4/2PP4/2N5/PP3PPP/R1BQKBNR b KQkq - +FR.22* +r1bqkb1r/pppn1ppp/5n2/3p4/2PP4/8/PP3PPP/RNBQKBNR w KQkq - +FR.21* +r1bqkb1r/pppp1ppp/2n2n2/1B2p3/4P3/2N2N2/PPPP1PPP/R1BQK2R b KQkq - +KP.03 +r1bqkb1r/pppp1ppp/2n2n2/1B2p3/4P3/5N2/PPPP1PPP/RNBQK2R w KQkq - +RL.07 +r1bqkb1r/pppp1ppp/2n2n2/3N4/3pP3/5N2/PPP2PPP/R1BQKB1R b KQkq - +SO.02 +r1bqkb1r/pppp1ppp/2n2n2/4p1N1/2B1P3/8/PPPP1PPP/RNBQK2R b KQkq - +KP.01 +r1bqkb1r/pppp1ppp/2n2n2/4p3/2B1P3/5N2/PPPP1PPP/RNBQK2R w KQkq - +IG.01 +r1bqkb1r/pppp1ppp/2n2n2/4p3/2P5/2N1PN2/PP1P1PPP/R1BQKB1R b KQkq - +EO.06 +r1bqkb1r/pppp1ppp/2n2n2/4p3/2P5/2N2NP1/PP1PPP1P/R1BQKB1R b KQkq - +EO.04 +r1bqkb1r/pppp1ppp/2n2n2/4p3/2P5/2NP1N2/PP2PPPP/R1BQKB1R b KQkq - +EO.07 +r1bqkb1r/pppp1ppp/2n2n2/4p3/2PP4/2N2N2/PP2PPPP/R1BQKB1R b KQkq - +EO.08 +r1bqkb1r/pppp1ppp/2n2n2/4p3/4P3/2N5/PPPP1PPP/R1BQKBNR w KQkq - +KP.06* +r1bqkb1r/pppp1ppp/2n2n2/8/2BpP3/5N2/PPP2PPP/RNBQK2R w KQkq - +KP.02 +r1bqkb1r/ppppnppp/2n5/1B2p3/4P3/5N2/PPPP1PPP/RNBQK2R w KQkq - +RL.04 +r1bqkbnr/1pp2ppp/p1np4/4p3/B3P3/2P2N2/PP1P1PPP/RNBQK2R b KQkq - +RL.11 +r1bqkbnr/1pp2ppp/p1np4/4p3/B3P3/5N2/PPPP1PPP/RNBQK2R w KQkq - +RL.10 +r1bqkbnr/1ppp1ppp/p1B5/4p3/4P3/5N2/PPPP1PPP/RNBQK2R b KQkq - +RL.08 +r1bqkbnr/1ppp1ppp/p1n5/4p3/B3P3/5N2/PPPP1PPP/RNBQK2R b KQkq - +RL.09 +r1bqkbnr/2p2ppp/p1p5/3p4/2PPp3/4P3/PP3PPP/RNBQK1NR w KQkq - +FR.11* +r1bqkbnr/4pppp/p1p5/2pp4/2P5/4PN2/PP1P1PPP/RNBQK2R b KQkq - +NI.19* +r1bqkbnr/4pppp/p1p5/2pp4/8/4PN2/PPPP1PPP/RNBQK2R w KQkq - +NI.18* +r1bqkbnr/p4ppp/2p5/2pp4/8/4PQ2/PPP2PPP/RNB1KB1R w KQkq - +EO.56* +r1bqkbnr/p4ppp/2p5/3pp3/8/6P1/PPP1PP1P/RNBQKB1R w KQkq - +GI.04* +r1bqkbnr/pp1npppp/2p5/8/2BPN3/8/PPP2PPP/R1BQK1NR b KQkq - +CK.09 +r1bqkbnr/pp1npppp/2p5/8/3PN3/5N2/PPP2PPP/R1BQKB1R b KQkq - +CK.08 +r1bqkbnr/pp1p1ppp/2n1p3/4P3/2P1Q3/2N5/PP3PPP/R1B1KBNR b KQkq - +EO.55 +r1bqkbnr/pp1p1ppp/2n1p3/8/2PN4/8/PP2PPPP/RNBQKB1R w KQkq - +EO.50 +r1bqkbnr/pp1p1ppp/2n1p3/8/3NP3/8/PPP2PPP/RNBQKB1R w KQkq - +SI.39 +r1bqkbnr/pp1p1ppp/2n5/2p1p3/3P4/4PN2/PPP2PPP/RNBQKB1R b KQkq - +EO.57* +r1bqkbnr/pp1p1ppp/2n5/2p1p3/8/2P2N2/PP1PPPPP/RNBQKB1R w KQkq - +EO.61* +r1bqkbnr/pp1p1ppp/4p3/4n3/2PN4/2N5/PP3PPP/R1BQKB1R w KQkq - +EO.54 +r1bqkbnr/pp1ppp1p/2n3p1/2p5/2P5/2N1PN2/PP1P1PPP/R1BQKB1R b KQkq - +EO.34 +r1bqkbnr/pp1ppp1p/2n3p1/2p5/4P3/2N5/PPPP1PPP/R1BQKBNR w KQkq - +EO.20* +r1bqkbnr/pp1ppp1p/2n3p1/2p5/4P3/2P2N2/PP1P1PPP/RNBQKB1R b KQkq - +EO.12* +r1bqkbnr/pp1ppp1p/2n3p1/8/3NP3/8/PPP2PPP/RNBQKB1R w KQkq - +SI.33 +r1bqkbnr/pp1ppppp/2n5/2p5/4P3/3P4/PPP2PPP/RNBQKBNR b KQkq - +EO.22* +r1bqkbnr/pp1ppppp/2n5/2p5/4P3/5N2/PPPP1PPP/RNBQKB1R b KQkq - +EO.10* +r1bqkbnr/pp1ppppp/2n5/2p5/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - +SI.31 +r1bqkbnr/pp1ppppp/2n5/2p5/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +EO.23* +r1bqkbnr/pp1ppppp/2n5/8/3NP3/8/PPP2PPP/RNBQKB1R b KQkq - +SI.32 +r1bqkbnr/pp2pp1p/2n3p1/1Bpp4/8/4PN2/PPPP1PPP/RNBQK2R w KQkq - +NI.29* +r1bqkbnr/pp2pppp/2n5/1Bpp4/8/4PN2/PPPP1PPP/RNBQK2R b KQkq - +NI.30* +r1bqkbnr/pp2pppp/2n5/2pp4/2PP4/4P3/PP3PPP/RNBQKBNR b KQkq - +TD.10* +r1bqkbnr/pp2pppp/2n5/2pp4/3P4/2P1P3/PP3PPP/RNBQKBNR b KQkq - +SL.06* +r1bqkbnr/pp2pppp/2n5/2pp4/3P4/4PN2/PPP2PPP/RNBQKB1R b KQkq - +QO.16* +r1bqkbnr/pp2pppp/2n5/2pp4/3P4/5NP1/PPP1PP1P/RNBQKB1R b KQkq - +GI.03* +r1bqkbnr/pp2pppp/2n5/2pp4/5P2/5N2/PPPPP1PP/RNBQKB1R w KQkq - +HD.05* +r1bqkbnr/pp2pppp/2n5/2pp4/8/3P1N2/PPP1PPPP/RNBQKB1R w KQkq - +OI.04* +r1bqkbnr/pp2pppp/2n5/8/1pPp4/P4N2/3PPPPP/RNBQKB1R w KQkq - +BI.44* +r1bqkbnr/pp2pppp/2n5/8/2Pp4/B4NP1/3PPP1P/RN1QKB1R b KQkq - +BI.41* +r1bqkbnr/pp3pp1/2n4p/2ppp3/8/3P1NP1/PPP1PPBP/RNBQ1RK1 b kq - +KI.30* +r1bqkbnr/pp3ppp/2n1p3/1Bpp4/2P5/4PN2/PP1P1PPP/RNBQK2R b KQkq - +NI.15* +r1bqkbnr/pp3ppp/2n1p3/1Bpp4/8/1P2PN2/P1PP1PPP/RNBQK2R b KQkq - +NI.12* +r1bqkbnr/pp3ppp/2n1p3/1Bpp4/8/4PN2/PPPP1PPP/RNBQ1RK1 b kq - +NI.11* +r1bqkbnr/pp3ppp/2n1p3/1Bpp4/8/4PN2/PPPP1PPP/RNBQK2R w KQkq - +NI.17* +r1bqkbnr/pp3ppp/2n5/2p1p3/2Pp4/3P1NP1/PP2PPBP/RNBQ1RK1 b kq - +RE.13 +r1bqkbnr/pp3ppp/2n5/2p1p3/2PpP3/3P1N2/PP3PPP/RNBQKB1R w KQkq - +OI.05* +r1bqkbnr/pp3ppp/2n5/2pp4/3P4/2N2NP1/PP2PP1P/R1BQKB1R b KQkq - +TD.09 +r1bqkbnr/pp3ppp/2n5/2pp4/3P4/5N2/PP2PPPP/RNBQKB1R w KQkq - +CK.03* +r1bqkbnr/pp3ppp/2n5/2pp4/3P4/5N2/PPPN1PPP/R1BQKB1R w KQkq - +FR.22 +r1bqkbnr/pp3ppp/2n5/2ppp3/8/2NP2P1/PPP1PPBP/R1BQK1NR b KQkq - +KF.03* +r1bqkbnr/pp3ppp/2n5/2ppp3/8/3P1NP1/PPP1PPBP/RNBQK2R b KQkq - +KI.31* +r1bqkbnr/pp3ppp/2n5/2ppp3/8/3P2P1/PPP1PPBP/RNBQK1NR w KQkq - +KF.04* +r1bqkbnr/pp3ppp/2n5/2ppp3/8/3P2P1/PPPNPPBP/R1BQK1NR b KQkq - +KF.02* +r1bqkbnr/pp3ppp/2n5/2ppp3/8/5NP1/PPPPPPBP/RNBQ1RK1 b kq - +KI.32* +r1bqkbnr/pp4pp/2n2p2/2ppp3/8/3P1NP1/PPP1PPBP/RNBQK2R w KQkq - +KI.54* +r1bqkbnr/pp4pp/2n2p2/2ppp3/8/P2P1NP1/1PP1PPBP/RNBQK2R b KQkq - +KI.53* +r1bqkbnr/pp4pp/2n5/5p2/2Ppp3/3P1NP1/PP3PBP/RNBQK2R w KQkq - +BI.34* +r1bqkbnr/ppp1pppp/2n5/3p4/3PP3/8/PPP2PPP/RNBQKBNR w KQkq - +VO.06 +r1bqkbnr/ppp1pppp/2n5/8/2Pp4/5N2/PP1PPPPP/RNBQKB1R w KQkq - +OI.08* +r1bqkbnr/ppp2pp1/6n1/3p3p/8/2P3B1/PP2PPPP/RN1QKBNR w KQkq - +CK.11* +r1bqkbnr/ppp2ppp/2n1p3/3p4/3PP3/8/PPPN1PPP/R1BQKBNR w KQkq - +FR.15 +r1bqkbnr/ppp2ppp/2n5/1B1p4/2PPp3/4P3/PP3PPP/RNBQK1NR b KQkq - +FR.10* +r1bqkbnr/ppp2ppp/2n5/1B1p4/3Pp3/4P3/PPP2PPP/RNBQK1NR w KQkq - +FR.09* +r1bqkbnr/ppp2ppp/2n5/1B1pp3/3P4/4P3/PPP2PPP/RNBQK1NR b KQkq - +FR.08* +r1bqkbnr/ppp2ppp/2n5/3pp3/3P4/2P5/PP2PPPP/RNBQKBNR w KQkq - +CK.05* +r1bqkbnr/ppp2ppp/2n5/3pp3/3P4/4P3/PPP2PPP/RNBQKBNR w KQkq - +FR.04* +r1bqkbnr/ppp2ppp/2n5/3pp3/8/3P1NP1/PPP1PP1P/RNBQKB1R b KQkq - +PU.07* +r1bqkbnr/ppp2ppp/2np4/1B2p3/4P3/5N2/PPPP1PPP/RNBQK2R w KQkq - +RL.02 +r1bqkbnr/ppp2ppp/8/3p4/8/2P2P2/PP2PP1P/RNBQKB1R b KQkq - +CK.07* +r1bqkbnr/ppp2ppp/8/3p4/8/2P2P2/PP3PPP/RNBQKB1R b KQkq - +CK.06* +r1bqkbnr/ppp2ppp/8/3pn3/5B2/2P5/PP2PPPP/RN1QKBNR b KQkq - +CK.10* +r1bqkbnr/ppp2ppp/8/3pn3/8/4P3/PPP2PPP/RNBQKBNR w KQkq - +FR.07* +r1bqkbnr/ppp3pp/2n2p2/3pp3/8/3P1NP1/PPP1PP1P/RNBQKB1R w KQkq - +PU.04* +r1bqkbnr/ppp3pp/2n5/3ppp2/8/3P1NP1/PPP1PPBP/RNBQK2R b KQkq - +PU.05* +r1bqkbnr/pppn1ppp/8/3p4/2PP4/8/PP3PPP/RNBQKBNR b KQkq - +FR.20* +r1bqkbnr/pppn1ppp/8/3p4/2PQ4/4P3/PP3PPP/RNB1KBNR b KQkq - +FR.19* +r1bqkbnr/pppn1ppp/8/3p4/3Pp3/4PN2/PPP2PPP/RNBQKB1R w KQkq - +FR.16* +r1bqkbnr/pppn1ppp/8/3pp3/2PP4/4P3/PP3PPP/RNBQKBNR b KQkq - +FR.18* +r1bqkbnr/pppn1ppp/8/3pp3/3P4/2N1P3/PPP2PPP/R1BQKBNR b KQkq - +FR.15* +r1bqkbnr/pppn1ppp/8/3pp3/3P4/4P3/PPP2PPP/RNBQKBNR w KQkq - +FR.14* +r1bqkbnr/pppp1p1p/2n3p1/1B2p3/4P3/5N2/PPPP1PPP/RNBQK2R w KQkq - +RL.03 +r1bqkbnr/pppp1p1p/2n3p1/4p3/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - +VG.01* +r1bqkbnr/pppp1ppp/2n5/1B2p3/4P3/5N2/PPPP1PPP/RNBQK2R b KQkq - +RL.01 +r1bqkbnr/pppp1ppp/2n5/4p3/2B1P3/5N2/PPPP1PPP/RNBQK2R b KQkq - +IG.03 +r1bqkbnr/pppp1ppp/2n5/4p3/2P5/2N2N2/PP1PPPPP/R1BQKB1R b KQkq - +EO.21 +r1bqkbnr/pppp1ppp/2n5/4p3/2P5/2N3P1/PP1PPP1P/R1BQKBNR b KQkq - +EO.20 +r1bqkbnr/pppp1ppp/2n5/4p3/2P5/8/PP1PPPPP/RNBQKBNR w KQkq - +SI.44* +r1bqkbnr/pppp1ppp/2n5/4p3/4P3/2N2N2/PPPP1PPP/R1BQKB1R b KQkq - +KP.06 +r1bqkbnr/pppp1ppp/2n5/4p3/4P3/2P2N2/PP1P1PPP/RNBQKB1R b KQkq - +KP.05 +r1bqkbnr/pppp1ppp/2n5/4p3/4P3/3P1N2/PPP2PPP/RNBQKB1R b KQkq - +KP.07 +r1bqkbnr/pppp1ppp/2n5/4p3/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +VG.04* +r1bqkbnr/pppp1ppp/2n5/8/3NP3/8/PPP2PPP/RNBQKB1R b KQkq - +SO.04 +r1bqkbnr/pppp1ppp/2n5/8/3Q4/8/PPP1PPPP/RNB1KBNR w KQkq - +SD.02* +r1bqkbnr/pppp1ppp/2n5/8/3pP3/5N2/PPP2PPP/RNBQKB1R w KQkq - +SO.06 +r1bqkbnr/pppp1ppp/2n5/8/Q7/8/PPP1PPPP/RNB1KBNR b KQkq - +SD.01* +r1bqkbnr/pppp1ppp/8/1B2p3/3nP3/5N2/PPPP1PPP/RNBQK2R w KQkq - +RL.05 +r1bqkbnr/pppp2pp/2n5/1B2pp2/4P3/5N2/PPPP1PPP/RNBQK2R w KQkq - +RL.06 +r1bqkbnr/pppp2pp/2n5/4pp2/3PP3/5N2/PPP2PPP/RNBQKB1R b KQkq - +VG.03* +r1bqkbnr/pppppppp/2n5/8/4P3/5N2/PPPP1PPP/RNBQKB1R b KQkq - +VO.05 +r1bqkbnr/pppppppp/2n5/8/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +VO.04 +r1bqkbnr/pppppppp/2n5/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - +VO.15* +r1bqnrk1/pp2b1pp/2n2p2/2p1p3/3pPP2/3P2P1/PPPNN1BP/R1BQ1RK1 b - - +KI.02* +r1bqnrk1/pp2bppp/2n5/2p1p3/3pP3/3P1NP1/PPP1NPBP/R1BQ1RK1 w - - +KI.03* +r1bqr1k1/1p1n1pbp/p2p1np1/2pP4/P3P3/2N5/1P1NBPPP/R1BQ1RK1 w - - +BI.03 +r1bqr1k1/1p1n1pbp/p2p1np1/2pP4/P3P3/R1N5/1P1NBPPP/2BQ1RK1 b - - +BI.01 +r1bqr1k1/1p1n1pbp/p2p1np1/2pP4/P3PP2/2N5/1P1NB1PP/R1BQ1RK1 b - - +BI.02 +r1bqr1k1/1p1n1pbp/p2p1np1/2pP4/P7/2N3P1/1P1NPPBP/R1BQ1RK1 w - - +BI.22 +r1bqr1k1/p1n2pbp/1p1p1np1/2pP4/P3P3/2N2P2/1P1NB1PP/R1BQ1RK1 w - - +BI.07 +r1bqr1k1/pp1n1pbp/2pp1np1/4p3/2PPP3/2N2NPP/PP3PB1/R1BQ1RK1 w - - +KI.61 +r1bqr1k1/pp1n1pbp/3p1np1/2pP4/4P3/2N5/PP1NBPPP/R1BQ1RK1 w - - +BI.05 +r1bqr1k1/pp2bppp/2n2n2/2ppp3/4P3/3P1NP1/PPPN1PBP/R1BQ1RK1 w - - +KI.11* +r1bqr1k1/pp3pbp/3p1np1/2pPn3/P3P3/2N5/1P1NBPPP/R1BQ1RK1 w - - +BI.04 +r1bqr1k1/pp3pbp/n2p1np1/2pP4/4P3/2N5/PP1NBPPP/R1BQ1RK1 w - - +BI.09 +r1bqr1k1/ppbn1pp1/2p2n1p/3pp3/NPP1P3/P2P1N2/2Q1BPPP/R1B2RK1 w - - +RL.24* +r1bqr1k1/ppnn1pbp/3p2p1/2pP4/P3P3/2N2P2/1P1NB1PP/R1BQ1RK1 w - - +BI.08 +r1bqrbk1/pp3ppp/2n2n2/2ppp3/4P3/2PP1NP1/PP1N1PBP/R1BQ1RK1 w - - +KI.10* +r1bqrbk1/pp3ppp/2n2n2/2ppp3/P3P3/2PP1NP1/1P1N1PBP/R1BQ1RK1 b - - +KI.09* +r1n1kb1r/pp1q2pp/2n1bp2/2ppp3/8/P1NP1NP1/1PP1PPBP/1RBQ1RK1 w kq - +KI.34* +r2q1r1k/1p2b1pp/2n2p2/p1n1p3/2Pp2b1/BP1P1NP1/P1N2PBP/1R1QR1K1 w - - +BI.06* +r2q1rk1/1bp1bppp/p1np1n2/1p2p3/4P3/1BP2N1P/PP1P1PP1/RNBQR1K1 w - - +RL.26 +r2q1rk1/1p1n1pbp/p2p1np1/2pP4/P3P3/2N2B1P/1P3PP1/R1BQ1RK1 w - - +BI.10 +r2q1rk1/1p2bppp/2n2n2/p3p1B1/2Pp2b1/P2P1NP1/1P3PBP/RN1Q1RK1 w - - +BI.13* +r2q1rk1/1p2bppp/2n2n2/p3pbB1/2Pp4/P2P1NP1/1P3PBP/RN1Q1RK1 w - - +BI.12* +r2q1rk1/1p2bppp/2n2n2/p3pbB1/2Pp4/P2P1NP1/1P3PBP/RN1QR1K1 b - - +BI.11* +r2q1rk1/p3nppp/4b3/2bpp3/8/2N3P1/PP2PPBP/R1BQ1RK1 w - - +GI.06* +r2q1rk1/pp1bbppp/2n2n2/2p1p3/3pP3/3P1NP1/PPP1NPBP/R1BQ1RK1 w - - +KI.06* +r2q1rk1/pp2bppp/2n1bn2/2ppp3/4P3/2NP1NP1/PPP2PBP/R1BQ1RK1 w - - +KI.08* +r2q1rk1/pp2bppp/2n1bn2/2ppp3/4P3/3P1NP1/PPPN1PBP/R1BQ1RK1 w - - +KI.13* +r2q1rk1/pp2n1pp/2nbbp2/2ppp3/1P6/P1PP1NP1/3NPPBP/R1BQ1RK1 b - - +KI.46* +r2q1rk1/pp2ppbp/2n2np1/3p4/2PP2b1/2N2N2/PP2BPPP/R1BQ1RK1 w - - +TD.03* +r2q1rk1/ppp2ppp/2nb4/1B6/3P2b1/5N2/P1P2PPP/R1BQ1RK1 w - - +SO.03* +r2qk1nr/pp2bppp/2n5/2p1p3/2Pp2b1/3P1NPP/PP2PPB1/RNBQ1RK1 b kq - +KI.23* +r2qk1nr/pp2bppp/2n5/2p1p3/2Pp2b1/3PPNP1/PP3PBP/RNBQ1RK1 b kq - +KI.24* +r2qk1nr/pp2bppp/2n5/2ppp3/2P3b1/3P1NP1/PP2PPBP/RNBQ1RK1 b kq - +KI.25* +r2qk1nr/pp2bppp/2n5/2ppp3/6b1/3P1NP1/PPP1PPBP/RNBQ1RK1 w kq - +KI.26* +r2qk1nr/pp4pp/2nbbp2/2p1p3/1P1pP3/2PP1NP1/P4PBP/RNBQ1RK1 b kq - +KI.38* +r2qk1nr/pp4pp/2nbbp2/4p3/3pP3/3P1NP1/PP3PBP/RNBQ1RK1 w kq - +KI.37* +r2qk2r/2p2ppp/p1n1b3/1pbpP3/4n3/1BP2N2/PP3PPP/RNBQ1RK1 w kq - +RL.30 +r2qk2r/pp2b1pp/2n2n2/6N1/2Ppp1b1/1Q4P1/PP3PBP/RNB1R1K1 b kq - +BI.28* +r2qk2r/pp2n1pp/2nbbp2/2pp4/2P1p3/PP1P1NP1/4PPBP/RNBQ1RK1 w kq - +KI.44* +r2qkb1r/1p1b1ppp/p1nppn2/6B1/3NP3/2N5/PPPQ1PPP/2KR1B1R w kq - +SI.30 +r2qkb1r/2p2ppp/p1n1b3/1p1pP3/4n3/1B3N2/PPP1QPPP/RNB2RK1 b kq - +RL.28 +r2qkb1r/2p2ppp/p1n1b3/1p1pP3/4n3/1BP2N2/PP3PPP/RNBQ1RK1 b kq - +RL.29 +r2qkb1r/pp1n1ppp/2n5/4p2b/2Pp4/P2P1NPP/1P3PB1/RNBQK2R w KQkq - +BI.18* +r2qkb1r/pp1n1ppp/2p1pn2/3p1b2/2P5/1P3NP1/PB1PPPBP/RN1Q1RK1 b kq - +RE.02 +r2qkb1r/pp1n1ppp/2p1pn2/3p4/2P3b1/1P3NP1/PB1PPPBP/RN1Q1RK1 b kq - +RE.01 +r2qkb1r/pp2n1pp/2n1bp2/2ppp3/4P3/3P1NP1/PPP2PBP/RNBQ1RK1 w kq - +KI.43* +r2qkb1r/pp2pppp/2n2n2/2pp4/3P2b1/5NP1/PPP1PPBP/RNBQK2R w KQkq - +GI.08* +r2qkb1r/pp2pppp/2n2n2/2pp4/4P1b1/3P1N2/PPPN1PPP/R1BQKB1R w KQkq - +OI.03* +r2qkb1r/pp2pppp/2n2n2/8/2Pp2b1/3P1NP1/PP3P1P/RNBQKB1R w KQkq - +BI.25* +r2qkb1r/pp3ppp/2n1pn2/2pp1b2/2PP4/4PN2/PP2BPPP/RNBQ1RK1 b kq - +QO.03* +r2qkb1r/pp3ppp/2n1pn2/2pp1b2/3P4/4PN2/PPP1BPPP/RNBQ1RK1 w kq - +QO.04* +r2qkb1r/pp3ppp/2n1pn2/2pp3b/3P4/1P2PN1P/P1P1BPP1/RNBQ1RK1 b kq - +QO.10* +r2qkb1r/pp3ppp/2n1pn2/2pp4/3P2b1/4PN2/PPPNBPPP/R1BQ1RK1 b kq - +QO.12* +r2qkb1r/pp3ppp/2n1pn2/2pp4/3P4/4PB1P/PPP2PP1/RNBQ1RK1 b kq - +QO.14* +r2qkb1r/pp3ppp/2n1pn2/2pp4/Q2P2b1/2P1PN2/PP1N1PPP/R1B1KB1R b KQkq - +QO.15* +r2qkb1r/pp3ppp/2n1pn2/3p4/3P4/1P3B1P/P1P2PP1/RNBQ1RK1 b kq - +QO.08* +r2qkb1r/pp3ppp/2n1pn2/5b2/2Bp4/4PN2/PP3PPP/RNBQ1RK1 w kq - +QO.01* +r2qkb1r/pp3ppp/2n2n2/2Ppp3/1P4b1/2P1PN2/P4PPP/RNBQKB1R b KQkq - +SL.07* +r2qkb1r/pp3ppp/2n2n2/4p3/2Pp2b1/3P1NP1/PP3PBP/RNBQK2R w KQkq - +BI.19* +r2qkb1r/pp4pp/2n1bn2/2pp4/4pB2/1NN1P3/PPP2PPP/R2QKB1R w KQkq - +AL.06* +r2qkb1r/ppp2ppp/1nn1p3/4Pb2/2PP4/2N1BN2/PP4PP/R2QKB1R b KQkq - +AL.06 +r2qkb1r/ppp2ppp/2n1b3/3np3/8/3P1NP1/PP2PPBP/RNBQK2R b KQkq - +SI.16* +r2qkb1r/ppp2ppp/2n5/3np3/6b1/2NP1N2/PP2PPPP/R1BQKB1R w KQkq - +SI.27* +r2qkb1r/ppp2ppp/2n5/3np3/6b1/P2P1N2/1P2PPPP/RNBQKB1R w KQkq - +SI.04* +r2qkb1r/ppp2ppp/2n5/4p3/1n2P1b1/P1NP1N2/1P3PPP/R1BQKB1R b KQkq - +SI.36* +r2qkb1r/ppp2ppp/n1n5/4p3/1P2P1b1/P1NP1N2/5PPP/R1BQKB1R b KQkq - +SI.37* +r2qkb1r/ppp2ppp/n7/4p3/1P1nPP2/P1NP4/5P1P/R1BQKB1R b KQkq - +SI.38* +r2qkb1r/ppp3pp/2n1bp2/3np3/8/3P1NP1/PP2PPBP/RNBQK2R w KQkq - +SI.17* +r2qkb1r/ppp3pp/2n5/3npp2/1P4b1/P2PPN2/5PPP/RNBQKB1R b KQkq - +SI.07* +r2qkb1r/ppp3pp/2n5/3npp2/6b1/P2PPN2/1P1N1PPP/R1BQKB1R b KQkq - +SI.06* +r2qkb1r/ppp3pp/2n5/3npp2/6b1/P2PPN2/1P2BPPP/RNBQK2R b KQkq - +SI.09* +r2qkb1r/ppp3pp/2n5/3npp2/6b1/P2PPN2/1PQ2PPP/RNB1KB1R b KQkq - +SI.05* +r2qkb1r/ppp3pp/2n5/3npp2/6b1/PQ1PPN2/1P3PPP/RNB1KB1R b KQkq - +SI.08* +r2qkbnr/pp1nppp1/2p4p/7P/3P4/3Q1NN1/PPP2PP1/R1B1K2R b KQkq - +CK.12 +r2qkbnr/pp2pppp/2n5/1Bpp4/6b1/4PN2/PPPP1PPP/RNBQK2R w KQkq - +NI.25* +r2qkbnr/pp2pppp/2n5/2pp4/3P2b1/4PN2/PPP1BPPP/RNBQK2R b KQkq - +QO.13* +r2qkbnr/pp2pppp/2n5/3p1b2/3P4/2P5/PP2BPPP/RNBQK1NR b KQkq - +QO.05* +r2qkbnr/pp3ppp/2n5/4pb2/2Pp4/3P1NP1/PP3P1P/RNBQKB1R w KQkq - +BI.35* +r2qkbnr/pp4pp/2n1bp2/2p1p3/3pP3/3P1NP1/PPP2PBP/RNBQ1RK1 w kq - +KI.41* +r2qkbnr/pp4pp/2n1bp2/2ppp3/8/1P1P1NP1/P1P1PPBP/RNBQ1RK1 b kq - +KI.45* +r2qkbnr/pp4pp/2n1bp2/2ppp3/8/2NP1NP1/PPP1PPBP/R1BQ1RK1 b kq - +KI.36* +r2qkbnr/pp4pp/2n1bp2/2ppp3/8/3P1NP1/PPPNPPBP/R1BQ1RK1 b kq - +KI.48* +r2qkbnr/pp4pp/2n2p2/2p1p3/2Pp2b1/3P1NP1/PP2PPBP/RNBQ1RK1 w kq - +KI.50* +r2qkbnr/pp4pp/2n2p2/2ppp3/6b1/3P1NP1/PPP1PPBP/RNBQ1RK1 w kq - +KI.51* +r2qkbnr/pp4pp/2n2p2/4p3/2Pp2b1/3P1NP1/PP3PBP/RNBQK2R w KQkq - +BI.37* +r2qkbnr/ppp2ppp/2n5/3pp3/3P2b1/4PN2/PPP1BPPP/RNBQK2R b KQkq - +FR.06* +r2qkbnr/ppp2ppp/2n5/3pp3/3P2b1/4PN2/PPP2PPP/RNBQKB1R w KQkq - +FR.05* +r2qkbnr/ppp2ppp/2n5/3pp3/6b1/3P1NP1/PPP1PP1P/RNBQKB1R w KQkq - +PU.09* +r3k2r/pppq2pp/2n1bp2/2bnp3/8/2NP1NP1/PP2PPBP/R1BQ1RK1 w kq - +SI.18* +r3kb1r/pp1qn1pp/2n1bp2/2ppp3/4P3/2PP1NP1/PP1N1PBP/R1BQ1RK1 b kq - +KI.42* +r3kb1r/pp1qn1pp/2n1bp2/2ppp3/8/P1NP1NP1/1PP1PPBP/1RBQ1RK1 b kq - +KI.35* +r3kb1r/pp3ppp/1qn1bn2/3pp1B1/8/6P1/PPPNPPBP/RN1Q1RK1 w kq - +GI.11* +r3kb1r/ppq1n1p1/2n1bp2/2ppp2p/8/P1NP1NP1/1PP1PPBP/1RBQ1RK1 w kq - +KI.33* +r3kbnr/pp1q2pp/2n1bp2/2p1p3/3pP2N/3P2P1/PPP2PBP/RNBQ1RK1 w kq - +KI.40* +r3kbnr/pp1q2pp/2n1bp2/2ppp3/8/P2P1NP1/1PP1PPBP/RNBQ1RK1 w kq - +KI.47* +r3kbnr/pp1q2pp/2n1bp2/4p3/3pP3/3P1NP1/PP3PBP/RNBQ1RK1 w kq - +KI.39* +r3kbnr/pp1q2pp/2n2p2/2p1p3/2Pp2b1/3PPNP1/PP3PBP/RNBQ1RK1 w kq - +KI.49* +r4rk1/pbqnppbp/1pn3p1/2p5/NPPp4/P2P1NP1/4PPBP/1RBQ1RK1 w - - +KI.66* +rn1q1rk1/1p3pbp/p2p1np1/2pP2B1/P3P1b1/2N2N2/1P2BPPP/R2Q1RK1 b - - +BI.13 +rn1q1rk1/1p3pbp/p2p1np1/2pP4/P3P3/2N5/1P1NQPPP/R1B2RK1 b - - +BI.14 +rn1q1rk1/1p3pbp/p2p1np1/2pP4/P3PBb1/2N2N2/1P2BPPP/R2Q1RK1 b - - +BI.12 +rn1q1rk1/pb1p1pbp/1p2pnp1/2p5/3P4/1P2PN2/PBP1BPPP/RN1Q1RK1 w - - +RE.08* +rn1q1rk1/pb1pbppp/1p2p3/2p5/2PP4/2Q2NP1/PP2PPBP/R1B2RK1 w - - +QI.13 +rn1q1rk1/pb1pppbp/1p3np1/2p3B1/3P4/2P1PN2/PP1N1PPP/R2QKB1R w KQ - +RE.01* +rn1q1rk1/pb1pppbp/1p3np1/2p5/2P5/1P3NP1/PB1PPPBP/RN1Q1RK1 b - - +EO.47* +rn1q1rk1/pb1pppbp/1p3np1/2p5/2P5/1P3NP1/PB1PPPBP/RN1Q1RK1 w - - +EO.47 +rn1q1rk1/pb1pppbp/1p3np1/2p5/3P1B2/2P1PN2/PP1N1PPP/R2QKB1R w KQ - +RE.02* +rn1q1rk1/pbp1bpp1/1p2pn1p/3p4/2PP3B/2N1PN2/PP3PPP/2RQKB1R w K - +QO.09 +rn1q1rk1/pbp1bppp/1p2pn2/3p4/2P5/1P2PNP1/PB1P1PBP/RN1Q1RK1 b - - +RE.08 +rn1q1rk1/pbppb1pp/1p2p3/5p2/2PP4/2Q2NP1/PP2PPBP/R1B2RK1 w - - +QI.12 +rn1q1rk1/pbppbppp/1p2p3/8/2PPn3/2N2NP1/PP2PPBP/R1BQ1RK1 w - - +QI.10 +rn1q1rk1/pbppbppp/1p2p3/8/2PPn3/2N2NP1/PPQ1PPBP/R1B2RK1 b - - +QI.11 +rn1q1rk1/pbppbppp/1p2pn2/8/2PP4/2N2NP1/PP2PPBP/R1BQ1RK1 b - - +QI.09 +rn1q1rk1/pbppbppp/1p3n2/3p4/2P5/5NP1/PP2PPBP/RNBQ1RK1 w - - +QI.08 +rn1q1rk1/pp3pbp/3p1np1/2pP4/4P1b1/2N2N2/PP2BPPP/R1BQ1RK1 w - - +BI.16 +rn1q1rk1/pp3pbp/3p1np1/2pP4/4PPb1/2N2N2/PP2B1PP/R1BQK2R w KQ - +BI.30 +rn1q1rk1/pp3pbp/3pbnp1/2p5/2P1PP2/2N2N2/PP4PP/R1BQKB1R w KQ - +KI.58 +rn1q1rk1/ppp1ppbp/3p1np1/8/3PP1b1/2N2N2/PPP1BPPP/R1BQ1RK1 w - - +PU.01 +rn1q1rk1/pppnppbp/6p1/8/3PP1b1/1QN1BN2/PP3PPP/R3KB1R b KQ - +GI.11 +rn1qk2r/pb1pbppp/1p2pn2/2p5/2P5/2N2NP1/PP1PPPBP/R1BQ1RK1 w kq - +EO.40 +rn1qk2r/pb1pbppp/1p2pn2/8/2PQ4/2N2NP1/PP2PPBP/R1B2RK1 b kq - +EO.39 +rn1qk2r/pb1pppbp/1p3np1/2p5/2P5/2N2NP1/PP1PPPBP/R1BQ1RK1 w kq - +EO.48 +rn1qk2r/pb1pppbp/1p3np1/2p5/3P4/2P2NP1/PP2PPBP/RNBQK2R w KQkq - +RE.03* +rn1qk2r/pbppbppp/1p2pn2/8/2PP4/5NP1/PP2PPBP/RNBQK2R w KQkq - +QI.07 +rn1qk2r/pp3ppp/2p1pn2/5b2/PbBP4/2N1PN2/1P3PPP/R1BQ1RK1 b kq - +SL.05 +rn1qk2r/ppp1bppp/1n1pp3/4P2b/2PP4/5N1P/PP2BPP1/RNBQ1RK1 w kq - +AL.01 +rn1qkb1r/3ppp1p/b4np1/2pP4/8/2N5/PP2PPPP/R1BQKBNR w KQkq - +BI.41 +rn1qkb1r/4pp1p/b2p1np1/2pP4/8/2N2NP1/PP2PP1P/R1BQKB1R b KQkq - +BI.39 +rn1qkb1r/4pp1p/b2p1np1/2pP4/8/2N5/PP1NPPPP/R1BQKB1R b KQkq - +BI.40 +rn1qkb1r/4pp1p/b2p1np1/2pP4/8/6P1/PP2PPBP/RNBQK1NR w KQkq - +BI.42 +rn1qkb1r/p1pp1ppp/bp2pn2/8/2PP4/5NP1/PP2PP1P/RNBQKB1R w KQkq - +QI.05 +rn1qkb1r/pbpp1ppp/1p2pn2/8/2P1P3/2N2N2/PP1P1PPP/R1BQKB1R w KQkq - +EO.60 +rn1qkb1r/pbpp1ppp/1p2pn2/8/2PP4/5NP1/PP2PPBP/RNBQK2R b KQkq - +QI.06 +rn1qkb1r/pp2pppp/2p2n2/3p1b2/2P5/5NP1/PP1PPPBP/RNBQK2R w KQkq - +RE.06 +rn1qkb1r/pp2pppp/2p2n2/3p4/2P3b1/5NP1/PP1PPPBP/RNBQK2R w KQkq - +RE.05 +rn1qkb1r/pp2pppp/2p2n2/5b2/P1pP4/2N2N2/1P2PPPP/R1BQKB1R w KQkq - +SL.04 +rn1qkb1r/ppp1pppp/3p4/3nP3/3P2b1/5N2/PPP2PPP/RNBQKB1R w KQkq - +AL.03 +rn1qkb1r/ppp1pppp/5n2/3p1b2/8/4PN2/PPPP1PPP/RNBQKB1R w KQkq - +QP.05* +rn1qkb1r/ppp1pppp/5n2/3p1b2/8/5NP1/PPPPPPBP/RNBQK2R b KQkq - +QP.03* +rn1qkb1r/ppp1pppp/5n2/3p4/6b1/4PN2/PPPP1PPP/RNBQKB1R w KQkq - +QP.04* +rn1qkb1r/ppp1pppp/5n2/3p4/6b1/5NP1/PPPPPP1P/RNBQKB1R w KQkq - +QP.02* +rn1qkb1r/ppp1pppp/5n2/3p4/6b1/5NP1/PPPPPPBP/RNBQK2R b KQkq - +QP.01* +rn1qkb1r/ppp2ppp/3pp3/3nP3/3P2b1/5N2/PPP1BPPP/RNBQK2R w KQkq - +AL.02 +rn1qkb1r/ppp2ppp/4pn2/8/2BP2b1/4PN2/PP3PPP/RNBQK2R w KQkq - +QG.06 +rn1qkbnr/pbpp1ppp/1p2p3/8/3PP3/3B4/PPP2PPP/RNBQK1NR w KQkq - +VO.03 +rn1qkbnr/pbpppppp/1p6/8/3PP3/3B4/PPP2PPP/RNBQK1NR b KQkq - +VO.02 +rn1qkbnr/pp2pppp/2p3b1/8/3P3P/6N1/PPP2PP1/R1BQKBNR b KQkq - +CK.11 +rn1qkbnr/pp2pppp/2p5/3pPb2/3P4/8/PPP2PPP/RNBQKBNR w KQkq - +CK.04 +rn1qkbnr/pp2pppp/2p5/5b2/3PN3/8/PPP2PPP/R1BQKBNR w KQkq - +CK.10 +rn1qr1k1/1p3pbp/p2p1np1/2pP4/P3PBb1/2N2N2/1P2BPPP/R2Q1RK1 w - - +BI.11 +rnb1k1nr/pp2ppbp/6p1/q1Pp4/8/4PN2/PPP2PPP/RNBQKB1R w KQkq - +CA.02* +rnb1kb1r/1p3ppp/pq1ppn2/6B1/3NPP2/2N5/PPP3PP/R2QKB1R w KQkq - +SI.08 +rnb1kb1r/1pq2ppp/p2ppn2/6B1/3NPP2/2N5/PPP3PP/R2QKB1R w KQkq - +SI.05 +rnb1kb1r/ppp2ppp/4pq2/8/2PP4/2P5/P4PPP/R1BQKBNR b KQkq - +EO.56 +rnb1kb1r/ppp2ppp/5n2/3qp3/8/3P4/PP2PPPP/RNBQKBNR w KQkq - +SI.02* +rnb1kbnr/pp3ppp/4p3/2pq4/3P4/8/PPPN1PPP/R1BQKBNR w KQkq - +FR.19 +rnb1kbnr/ppp1pppp/8/3q4/8/2N5/PPPP1PPP/R1BQKBNR b KQkq - +SD.02 +rnb1kbnr/ppp1pppp/8/q7/8/2N5/PPPP1PPP/R1BQKBNR w KQkq - +SD.01 +rnb1r1k1/pp3pbp/1q4p1/2pPP1B1/6n1/2N2N2/PP2B1PP/R2QK2R w KQ - +BI.28 +rnb2rk1/p1p1qpp1/1p5p/3p4/3P4/5N2/PP2PPPP/2RQKB1R w K - +QO.06 +rnb2rk1/pp2ppbp/2pp1np1/q7/2PP4/2N2NP1/PP2PPBP/R1BQ1RK1 w - - +KI.74 +rnb2rk1/ppp1qppp/1b3n2/4N3/1P1Pp3/P1N1B3/2P2PPP/R2QKB1R w KQ - +RL.28* +rnbq1rk1/1p1n1pbp/p2p2p1/2pP4/P3PP2/2NB1N2/1P4PP/R1BQK2R b KQ - +BI.32 +rnbq1rk1/1pp1ppbp/p2p1np1/8/2PPP3/2N1BP2/PP1Q2PP/R3KBNR b KQ - +KI.47 +rnbq1rk1/2p1bppp/p2p1n2/1p2p3/4P3/1BP2N1P/PP1P1PP1/RNBQR1K1 w - - +RL.25 +rnbq1rk1/4ppbp/pp1p1np1/2p1P3/2PP4/2NBBP2/PP2N1PP/R2QK2R b KQ - +KI.44 +rnbq1rk1/p1p1bpp1/1p2pn1p/3p4/2PP3B/2N1PN2/PP3PPP/R2QKB1R w KQ - +QO.10 +rnbq1rk1/p1p1ppbp/1p1p1np1/8/2PPP3/2N1BP2/PP4PP/R2QKBNR w KQ - +KI.45 +rnbq1rk1/p1p2pp1/1p3b1p/3p4/3P4/2N1PN2/PP3PPP/R2QKB1R w KQ - +QO.08 +rnbq1rk1/p2pppbp/1p3np1/2p5/3P4/4PN2/PPP1BPPP/RNBQ1RK1 w - - +RE.09* +rnbq1rk1/p3ppbp/3p1np1/1ppP4/2P1PP2/2N2N2/PP4PP/R1BQKB1R w KQ - +KI.55 +rnbq1rk1/p4pbp/2pp1np1/1p1Pp3/2P1P3/2NBBP2/PP4PP/R2QK1NR w KQ - +KI.38 +rnbq1rk1/p4ppp/1p2pn2/8/1bBP4/2N2N2/PP3PPP/R1BQ1RK1 w - - +NI.04 +rnbq1rk1/pp1p1ppp/4pn2/2P5/1bP5/2N5/PPQ1PPPP/R1B1KBNR w KQ - +NI.21 +rnbq1rk1/pp1p1ppp/4pn2/2p5/1bPP4/2NBPN2/PP3PPP/R1BQK2R b KQ - +NI.07 +rnbq1rk1/pp1pppbp/5np1/2p5/2PP4/2N1PN2/PP3PPP/R1BQKB1R w KQ - +KI.77 +rnbq1rk1/pp2bpp1/5n1p/2pp4/4p2B/1N1PP3/PPP1BPPP/RN1QK2R b KQ - +AL.01* +rnbq1rk1/pp2bppp/4pn2/2pp4/2PP1B2/2N1PN2/PP3PPP/R2QKB1R w KQ - +QO.03 +rnbq1rk1/pp2ppb1/3p1npp/2pP2B1/2P1P3/2N5/PP2BPPP/R2QK1NR w KQ - +KI.23 +rnbq1rk1/pp2ppbp/2pp1np1/8/2PP4/2N2NP1/PP2PPBP/R1BQ1RK1 b - - +KI.75 +rnbq1rk1/pp2ppbp/3p1np1/2p3B1/2PPP3/2N5/PP2BPPP/R2QK1NR w KQ - +KI.25 +rnbq1rk1/pp2ppbp/3p1np1/2p5/2PP4/2N2NP1/PP2PPBP/R1BQ1RK1 b - - +KI.69 +rnbq1rk1/pp2ppbp/3p1np1/2pP2B1/2P1P3/2N2P2/PP4PP/R2QKBNR b KQ - +KI.50 +rnbq1rk1/pp2ppbp/3p1np1/2pP4/2P1P3/2N5/PP3PPP/R1BQKBNR w KQ - +RE.13* +rnbq1rk1/pp2ppbp/3p1np1/2pP4/2P1PP2/2NB4/PP4PP/R1BQK1NR b KQ - +KI.60 +rnbq1rk1/pp2ppbp/3p1np1/8/2PNPP2/2N5/PP2B1PP/R1BQK2R b KQ - +KI.59 +rnbq1rk1/pp2ppbp/5np1/2Pp4/8/4PN2/PPP1BPPP/RNBQ1RK1 b - - +CA.05* +rnbq1rk1/pp2ppbp/5np1/2p5/3P4/1P3N2/PBPPBPPP/RN1Q1RK1 b - - +QI.08* +rnbq1rk1/pp2ppbp/5np1/2pp4/3P4/5NP1/PPP1PPBP/RNBQ1RK1 w - - +GI.02* +rnbq1rk1/pp2ppbp/5np1/2pp4/5P2/3P1NP1/PPP1P1BP/RNBQ1RK1 b - - +HD.06* +rnbq1rk1/pp2ppbp/5np1/2pp4/5P2/3PPN2/PPP1B1PP/RNBQ1RK1 b - - +HD.01* +rnbq1rk1/pp2ppbp/5np1/2pp4/5P2/4PN2/PPPPB1PP/RNBQ1RK1 w - - +HD.02* +rnbq1rk1/pp2ppbp/5np1/2pp4/8/3P1NP1/PPP1PPBP/RNBQ1RK1 w - - +KI.79* +rnbq1rk1/pp3pbp/3p1np1/2pP4/2N5/2N5/PP2PPPP/R1BQKB1R w KQ - +BI.26 +rnbq1rk1/pp3pbp/3p1np1/2pP4/4P3/2N2N2/PP2BPPP/R1BQK2R w KQ - +BI.17 +rnbq1rk1/pp3pbp/3p1np1/2pP4/4P3/2NB4/PP2NPPP/R1BQ1RK1 b - - +BI.36 +rnbq1rk1/pp3pbp/3p1np1/2pP4/4PP2/2N2N2/PP4PP/R1BQKB1R w KQ - +BI.31 +rnbq1rk1/pp3pbp/3p1np1/2pP4/8/2N2NP1/PP2PPBP/R1BQ1RK1 b - - +BI.24 +rnbq1rk1/pp3pbp/3p1np1/2ppP3/2P2P2/2N2N2/PP2B1PP/R1BQK2R b KQ - +KI.56 +rnbq1rk1/pp3pbp/3p1np1/3Pp3/4P3/2N1BP2/PP1Q2PP/R3KBNR b KQ - +KI.39 +rnbq1rk1/pp3pbp/3p1np1/3Pp3/4P3/2NBBP2/PP4PP/R2QK1NR b KQ - +KI.37 +rnbq1rk1/pp3pbp/3ppnp1/2pP2B1/2P1P3/2N2P2/PP1Q2PP/R3KBNR b KQ - +KI.49 +rnbq1rk1/pp3pbp/3ppnp1/2pP2B1/2P1P3/2N5/PP2BPPP/R2QK1NR w KQ - +KI.24 +rnbq1rk1/pp3pbp/3ppnp1/2pP4/2P1PP2/2N2N2/PP2B1PP/R1BQK2R b KQ - +KI.57 +rnbq1rk1/pp3ppp/1bp2n2/4N3/1P1Pp3/P1N1B3/2P2PPP/R2QKB1R w KQ - +RL.29* +rnbq1rk1/pp3ppp/1bp2n2/4N3/1PBPp3/P1N1B3/2P2PPP/R2QK2R b KQ - +RL.30* +rnbq1rk1/pp3ppp/4pn2/2bP4/5B2/2N1PN2/PP3PPP/R2QKB1R b KQ - +QO.01 +rnbq1rk1/pp3ppp/4pn2/2bp4/2P5/P3PN2/1P3PPP/RNBQKB1R b KQ - +QG.07* +rnbq1rk1/pp3ppp/4pn2/2pp4/1bPP4/2NBP3/PP2NPPP/R1BQK2R w KQ - +NI.09 +rnbq1rk1/pp3ppp/4pn2/2pp4/1bPP4/2NBPN2/PP3PPP/R1BQ1RK1 b - - +NI.05 +rnbq1rk1/ppp1b1pp/3ppn2/5p2/2PP4/5NP1/PP2PPBP/RNBQ1RK1 w - - +HD.01 +rnbq1rk1/ppp1bpp1/4pn1p/8/2pP3B/2N2N2/PP2PPPP/2RQKB1R w K - +QO.07 +rnbq1rk1/ppp1bppp/4pn2/3p4/2P5/1P3NP1/P2PPPBP/RNBQ1RK1 b - - +RE.09 +rnbq1rk1/ppp1bppp/4pn2/3p4/2PP1B2/2N1PN2/PP3PPP/R2QKB1R b KQ - +QO.04 +rnbq1rk1/ppp1bppp/4pn2/8/2pP4/5NP1/PP2PPBP/RNBQ1RK1 w - - +CA.05 +rnbq1rk1/ppp1p1bp/3p1np1/5p2/2PP4/5NP1/PP2PPBP/RNBQ1RK1 w - - +HD.06 +rnbq1rk1/ppp1ppbp/3p1np1/6B1/2PPP3/2N2P2/PP4PP/R2QKBNR b KQ - +KI.51 +rnbq1rk1/ppp1ppbp/3p1np1/6B1/2PPP3/2N5/PP2BPPP/R2QK1NR b KQ - +KI.26 +rnbq1rk1/ppp1ppbp/3p1np1/8/2PP4/2N1P1P1/PP3PBP/R1BQK1NR b KQ - +KI.78 +rnbq1rk1/ppp1ppbp/3p1np1/8/2PP4/5NP1/PP2PPBP/RNBQ1RK1 b - - +KI.79 +rnbq1rk1/ppp1ppbp/3p1np1/8/2PPP3/2N2N1P/PP3PP1/R1BQKB1R b KQ - +KI.20 +rnbq1rk1/ppp1ppbp/3p1np1/8/2PPP3/2N2N2/PP2BPPP/R1BQK2R b KQ - +KI.19 +rnbq1rk1/ppp1ppbp/3p1np1/8/2PPP3/2N2N2/PP3PPP/R1BQKB1R w KQ - +KI.21 +rnbq1rk1/ppp1ppbp/3p1np1/8/2PPP3/2N2P2/PP2N1PP/R1BQKB1R b KQ - +KI.52 +rnbq1rk1/ppp1ppbp/3p1np1/8/2PPP3/2N3P1/PP3PBP/R1BQK1NR b KQ - +KI.29 +rnbq1rk1/ppp1ppbp/3p1np1/8/2PPP3/2N4P/PP3PP1/R1BQKBNR w KQ - +KI.30 +rnbq1rk1/ppp1ppbp/3p1np1/8/3PPP2/2N2N2/PPP3PP/R1BQKB1R w KQ - +PU.06 +rnbq1rk1/ppp1ppbp/3p1np1/8/3PPP2/2NB1N2/PPP3PP/R1BQK2R b KQ - +PU.02 +rnbq1rk1/ppp1ppbp/5np1/3p4/2PP4/2N1PN2/PP3PPP/R1BQKB1R w KQ - +GI.09 +rnbq1rk1/ppp1ppbp/5np1/3p4/2PP4/5NP1/PP2PPBP/RNBQ1RK1 b - - +GI.02 +rnbq1rk1/ppp2pbp/3p1np1/3Pp3/2P1P3/2N1BP2/PP4PP/R2QKBNR b KQ - +KI.41 +rnbq1rk1/ppp2pbp/3p1np1/3Pp3/2P1P3/2N2N2/PP2BPPP/R1BQK2R b KQ - +KI.17 +rnbq1rk1/ppp2pbp/3p1np1/4p3/2PPP3/2N1BP2/PP2N1PP/R2QKB1R b KQ - +KI.43 +rnbq1rk1/ppp2pbp/3p1np1/4p3/2PPP3/2N2N2/PP2BPPP/R1BQ1RK1 b - - +KI.15 +rnbq1rk1/ppp2pbp/3p1np1/4p3/2PPP3/2N2N2/PP2BPPP/R1BQK2R w KQ - +KI.18 +rnbq1rk1/ppp2pbp/3p1np1/4p3/2PPP3/2N3P1/PP2NPBP/R1BQK2R b KQ - +KI.28 +rnbq1rk1/ppp2pbp/3p2p1/3Pp2n/2P1P3/2N1BP2/PP1Q2PP/R3KBNR b KQ - +KI.40 +rnbq1rk1/ppp2pp1/4pb1p/3p4/2PP4/2N1PN2/PP3PPP/R2QKB1R w KQ - +QO.14 +rnbq1rk1/ppp2ppp/3b1n2/3pN3/3P4/2N5/PPP1BPPP/R1BQK2R b KQ - +RG.06* +rnbq1rk1/ppp2ppp/4pn2/3p4/1bPP4/2NBPN2/PP3PPP/R1BQK2R b KQ - +NI.06 +rnbq1rk1/ppp2ppp/4pn2/3p4/1bPP4/P1NBP3/1P3PPP/R1BQK1NR b KQ - +NI.08 +rnbq1rk1/ppp2ppp/5n2/b2pp3/4P3/P1N2N2/1PPPBPPP/R1BQK2R w KQ - +RL.15* +rnbq1rk1/pppp1ppp/4pn2/8/1bPP4/2N1P3/PP2NPPP/R1BQKB1R b KQ - +NI.10 +rnbq1rk1/pppp1ppp/4pn2/8/1bPP4/2N1P3/PP3PPP/R1BQKBNR w KQ - +NI.11 +rnbq1rk1/pppp1ppp/4pn2/8/2PP4/P1Q5/1P2PPPP/R1B1KBNR b KQ - +NI.20 +rnbq1rk1/pppp1ppp/5n2/4p3/1bP5/2N3P1/PP1PPPBP/R1BQK1NR w KQ - +EO.11 +rnbq1rk1/pppp1ppp/5n2/4p3/4P3/P1b2N2/1PPPBPPP/R1BQK2R w KQ - +RL.14* +rnbq1rk1/pppp1ppp/5n2/b3N3/4P3/P1N5/1PPP1PPP/R1BQKB1R b KQ - +RL.27* +rnbq1rk1/pppp1ppp/5n2/b3p3/4P3/P1N2N2/1PPPBPPP/R1BQK2R b KQ - +RL.13* +rnbq1rk1/ppppb1pp/4pn2/5p2/2PP4/5NP1/PP2PPBP/RNBQ1RK1 b - - +HD.02 +rnbq1rk1/ppppppbp/5np1/8/2PPP3/2N5/PP3PPP/R1BQKBNR w KQ - +KI.32 +rnbqk1nr/pp2bppp/2p5/3p4/3P1B2/2N5/PP2PPPP/R2QKBNR w KQkq - +QO.05 +rnbqk1nr/pp2ppbp/6p1/2pp4/5P2/2PP1N2/PP2P1PP/RNBQKB1R b KQkq - +HD.04* +rnbqk1nr/pp2ppbp/6p1/2pp4/5P2/4PN2/PPPP2PP/RNBQKB1R w KQkq - +HD.03* +rnbqk1nr/pp2ppbp/6p1/2pp4/5P2/5NP1/PPPPP1BP/RNBQK2R b KQkq - +HD.07* +rnbqk1nr/pp2ppbp/6p1/8/2Pp4/B2P1NP1/4PP1P/RN1QKB1R b KQkq - +BI.42* +rnbqk1nr/pp3ppp/4p3/2ppP3/1b1P4/2N5/PPP2PPP/R1BQKBNR w KQkq - +FR.10 +rnbqk1nr/pp3ppp/4p3/2ppP3/3P4/P1P5/2P2PPP/R1BQKBNR b KQkq - +FR.11 +rnbqk1nr/ppp1ppbp/3p2p1/8/2PPP3/2N5/PP3PPP/R1BQKBNR b KQkq - +KF.04 +rnbqk1nr/ppp1ppbp/6p1/3p4/5P2/6P1/PPPPP2P/RNBQKBNR w KQkq - +HD.09* +rnbqk1nr/ppp2ppp/3b4/3pp3/8/1P2P3/PBPP1PPP/RN1QKBNR b KQkq - +VO.03* +rnbqk1nr/ppp2ppp/3b4/3pp3/8/1P6/PBPPPPPP/RN1QKBNR w KQkq - +VO.02* +rnbqk1nr/ppp2ppp/4p3/3p4/1b1PP3/2N5/PPP2PPP/R1BQKBNR w KQkq - +FR.08 +rnbqk1nr/ppp2ppp/4p3/3pP3/1b1P4/2N5/PPP2PPP/R1BQKBNR b KQkq - +FR.09 +rnbqk1nr/pppp1ppp/8/2b1p3/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +IG.04* +rnbqk1nr/ppppppbp/6p1/8/3PP3/8/PPP2PPP/RNBQKBNR w KQkq - +KF.05 +rnbqk2r/1p2bppp/p2p1n2/4p3/4P3/1NN5/PPP1BPPP/R1BQK2R w KQkq - +SI.11 +rnbqk2r/1p2bppp/p2ppn2/6B1/3NPP2/2N5/PPP3PP/R2QKB1R w KQkq - +SI.09 +rnbqk2r/1p3pb1/p2p1npp/2pP4/4P2B/2N5/PP1N1PPP/R2QKB1R b KQkq - +BI.18 +rnbqk2r/1pp1ppbp/p2p1np1/8/2PPP3/2N2P2/PP4PP/R1BQKBNR w KQkq - +KI.53 +rnbqk2r/p1pp1ppp/1p2pn2/8/1bPP4/2N1P3/PP2NPPP/R1BQKB1R b KQkq - +NI.13 +rnbqk2r/p1pp1ppp/1p2pn2/8/1bPP4/2N1P3/PP3PPP/R1BQKBNR w KQkq - +NI.12 +rnbqk2r/p1pp1ppp/1p2pn2/8/1bPP4/2N2N2/PP2PPPP/R1BQKB1R w KQkq - +NI.26 +rnbqk2r/p1pp1ppp/5n2/1pb1p3/2B1P3/2N5/PPPP1PPP/R1BQK1NR w KQkq - +IG.05* +rnbqk2r/pp1n1pbp/3p2p1/1BpP4/4PP2/2N5/PP4PP/R1BQK1NR w KQkq - +BI.33 +rnbqk2r/pp1p1ppp/2p2n2/b3p3/4P3/P1NP4/1PP2PPP/R1BQKBNR w KQkq - +RL.11* +rnbqk2r/pp1p1ppp/4pn2/2p5/1bPP4/2N1P3/PP2NPPP/R1BQKB1R b KQkq - +NI.16 +rnbqk2r/pp1p1ppp/4pn2/2p5/1bPP4/2N1P3/PP3PPP/R1BQKBNR w KQkq - +NI.15 +rnbqk2r/pp1p1ppp/4pn2/2p5/1bPP4/2N5/PPQ1PPPP/R1B1KBNR w KQkq - +NI.22 +rnbqk2r/pp1p1ppp/4pn2/2p5/2PP4/P1P5/4PPPP/R1BQKBNR w KQkq - +NI.19 +rnbqk2r/pp1p1ppp/4pn2/8/1bPN4/2N5/PP2PPPP/R1BQKB1R w KQkq - +EO.44 +rnbqk2r/pp1pppbp/5np1/2P5/8/4PN2/PPP2PPP/RNBQKB1R b KQkq - +RE.10* +rnbqk2r/pp1pppbp/5np1/2p3B1/3P4/2P2N2/PP2PPPP/RN1QKB1R b KQkq - +RE.05* +rnbqk2r/pp1pppbp/5np1/2p5/3P1B2/2P2N2/PP2PPPP/RN1QKB1R b KQkq - +RE.06* +rnbqk2r/pp1pppbp/5np1/2p5/3P4/4PN2/PPP2PPP/RNBQKB1R w KQkq - +RE.11* +rnbqk2r/pp1pppbp/5np1/8/2PN4/2N5/PP2PPPP/R1BQKB1R b KQkq - +EO.49* +rnbqk2r/pp2nppp/4p3/2ppP3/3P4/P1P2N2/2P2PPP/R1BQKB1R b KQkq - +FR.12 +rnbqk2r/pp2ppbp/2p2np1/3p4/2P5/1P3NP1/PB1PPPBP/RN1QK2R b KQkq - +RE.03 +rnbqk2r/pp2ppbp/3p1np1/8/3NP3/2N1B3/PPP2PPP/R2QKB1R w KQkq - +SI.16 +rnbqk2r/pp2ppbp/3p1np1/8/3NP3/2N1BP2/PPP3PP/R2QKB1R b KQkq - +SI.17 +rnbqk2r/pp2ppbp/5np1/2Pp4/8/4PN2/PPP2PPP/RNBQKB1R w KQkq - +CA.03* +rnbqk2r/pp2ppbp/5np1/2pp4/3P4/4PN2/PPP1BPPP/RNBQK2R w KQkq - +CA.04* +rnbqk2r/pp2ppbp/5np1/2pp4/8/1P2PN2/PBPP1PPP/RN1QKB1R w KQkq - +QI.06* +rnbqk2r/pp2ppbp/5np1/2pp4/8/1P2PN2/PBPPBPPP/RN1QK2R b KQkq - +QI.07* +rnbqk2r/pp3pbp/3p1np1/2pP2B1/4P3/2N2N2/PP3PPP/R2QKB1R b KQkq - +BI.19 +rnbqk2r/pp3pbp/3p1np1/2pP2B1/4P3/2N2P2/PP4PP/R2QKBNR b KQkq - +BI.37 +rnbqk2r/pp3pbp/3p1np1/2pP4/4P3/2N2N2/PP3PPP/R1BQKB1R w KQkq - +BI.20 +rnbqk2r/pp3pbp/3p1np1/2pPP3/5P2/2N5/PP4PP/R1BQKBNR b KQkq - +BI.34 +rnbqk2r/pp3ppp/4pn2/2bp2B1/8/4PN2/PPP2PPP/RN1QKB1R b KQkq - +QG.06* +rnbqk2r/ppp1bppp/4pn2/3p2B1/2PP4/2N5/PP2PPPP/R2QKBNR w KQkq - +QO.13 +rnbqk2r/ppp1bppp/4pn2/3p2B1/3PP3/2N5/PPP2PPP/R2QKBNR w KQkq - +FR.06 +rnbqk2r/ppp1bppp/4pn2/3p4/2PP4/5NP1/PP2PPBP/RNBQK2R b KQkq - +CA.04 +rnbqk2r/ppp1bppp/5n2/3p2B1/3Np3/3PP3/PPP2PPP/RN1QKB1R b KQkq - +AL.02* +rnbqk2r/ppp1bppp/8/3p4/3Pn3/3B1N2/PPP2PPP/RNBQK2R w KQkq - +RG.05 +rnbqk2r/ppp1ppbp/3p1np1/8/2PP4/2N2N2/PP2PPPP/R1BQKB1R w KQkq - +KI.76 +rnbqk2r/ppp1ppbp/3p1np1/8/2PPP3/2N2N2/PP3PPP/R1BQKB1R b KQkq - +KI.22 +rnbqk2r/ppp1ppbp/3p1np1/8/2PPP3/2N2P2/PP4PP/R1BQKBNR b KQkq - +KI.54 +rnbqk2r/ppp1ppbp/3p1np1/8/2PPP3/2N5/PP2BPPP/R1BQK1NR b KQkq - +KI.27 +rnbqk2r/ppp1ppbp/3p1np1/8/2PPP3/2N5/PP3PPP/R1BQKBNR w KQkq - +KI.31 +rnbqk2r/ppp1ppbp/3p1np1/8/3PP3/2N2N2/PPP1BPPP/R1BQK2R b KQkq - +PU.03 +rnbqk2r/ppp1ppbp/3p1np1/8/3PP3/2N2N2/PPP2PPP/R1BQKB1R w KQkq - +PU.10 +rnbqk2r/ppp1ppbp/3p1np1/8/3PPP2/2N5/PPP3PP/R1BQKBNR w KQkq - +PU.05 +rnbqk2r/ppp1ppbp/5np1/3p2B1/2PP4/2N2N2/PP2PPPP/R2QKB1R b KQkq - +GI.08 +rnbqk2r/ppp1ppbp/5np1/3p4/2PP4/1QN2N2/PP2PPPP/R1B1KB1R b KQkq - +GI.10 +rnbqk2r/ppp1ppbp/5np1/3p4/2PP4/2N2N2/PP2PPPP/R1BQKB1R w KQkq - +GI.07 +rnbqk2r/ppp1ppbp/6p1/3n4/8/2N2NP1/PP1PPPBP/R1BQK2R b KQkq - +EO.51 +rnbqk2r/ppp1ppbp/6p1/8/2BPP3/2P5/P4PPP/R1BQK1NR b KQkq - +GI.05 +rnbqk2r/ppp2ppp/3b1n2/3pN3/3P4/8/PPP1BPPP/RNBQK2R b KQkq - +RG.05* +rnbqk2r/ppp2ppp/3b4/3np3/8/P3P3/1P1P1PPP/RNBQKBNR w KQkq - +SI.42* +rnbqk2r/ppp2ppp/4pn2/3p4/1bPP4/2N2N2/PP2PPPP/R1BQKB1R w KQkq - +NI.27 +rnbqk2r/ppp2ppp/4pn2/3p4/1bPP4/2N5/PPQ1PPPP/R1B1KBNR w KQkq - +NI.23 +rnbqk2r/ppp2ppp/5n2/2bPp3/8/2N2N2/PPPP1PPP/R1BQKB1R b KQkq - +KP.02* +rnbqk2r/pppp1pbp/5np1/4p3/2P5/2N3P1/PP1PPPBP/R1BQK1NR w KQkq - +EO.14 +rnbqk2r/pppp1ppp/4pn2/6B1/1bPP4/2N5/PP2PPPP/R2QKBNR b KQkq - +NI.25 +rnbqk2r/pppp1ppp/4pn2/8/1bP5/2N2N2/PP1PPPPP/R1BQKB1R w KQkq - +EO.59 +rnbqk2r/pppp1ppp/4pn2/8/1bP5/2N2N2/PPQPPPPP/R1B1KB1R b KQkq - +EO.58 +rnbqk2r/pppp1ppp/4pn2/8/1bPP4/2N1P3/PP3PPP/R1BQKBNR b KQkq - +NI.17 +rnbqk2r/pppp1ppp/4pn2/8/1bPP4/2N2N2/PP2PPPP/R1BQKB1R b KQkq - +NI.28 +rnbqk2r/pppp1ppp/4pn2/8/1bPP4/2N3P1/PP2PP1P/R1BQKBNR b KQkq - +NI.29 +rnbqk2r/pppp1ppp/4pn2/8/1bPP4/2N5/PP2PPPP/R1BQKBNR w KQkq - +NI.30 +rnbqk2r/pppp1ppp/4pn2/8/1bPP4/2N5/PPQ1PPPP/R1B1KBNR b KQkq - +NI.24 +rnbqk2r/pppp1ppp/4pn2/8/2PP4/P1P5/4PPPP/R1BQKBNR b KQkq - +NI.18 +rnbqk2r/pppp1ppp/5n2/2b1p3/2B1P3/2N5/PPPP1PPP/R1BQK1NR b KQkq - +IG.02* +rnbqk2r/pppp1ppp/5n2/2b1p3/4P3/2N2N2/PPPP1PPP/R1BQKB1R b KQkq - +IG.01* +rnbqk2r/pppp1ppp/5n2/2b1p3/4P3/2N5/PPPP1PPP/R1BQKBNR w KQkq - +IG.03* +rnbqk2r/pppp1ppp/5n2/3Np3/1b2P3/8/PPPP1PPP/R1BQKBNR b KQkq - +RL.05* +rnbqk2r/pppp1ppp/5n2/4p3/1b2P3/2N2N2/PPPP1PPP/R1BQKB1R b KQkq - +RL.07* +rnbqk2r/pppp1ppp/5n2/4p3/1b2P3/2N3P1/PPPP1P1P/R1BQKBNR b KQkq - +RL.03* +rnbqk2r/pppp1ppp/5n2/4p3/1b2P3/2N5/PPPP1PPP/R1BQKBNR w KQkq - +RL.01* +rnbqk2r/pppp1ppp/5n2/4p3/1b2P3/2N5/PPPPNPPP/R1BQKB1R b KQkq - +RL.04* +rnbqk2r/pppp1ppp/5n2/4p3/1b2P3/2NP4/PPP2PPP/R1BQKBNR b KQkq - +RL.02* +rnbqk2r/pppp1ppp/5n2/4p3/1b2PP2/2N5/PPPP2PP/R1BQKBNR b KQkq - +RL.06* +rnbqk2r/pppp1ppp/5n2/4p3/4P3/P1b5/1PPP1PPP/R1BQKBNR w KQkq - +RL.08* +rnbqk2r/pppp1ppp/5n2/b3p3/4P3/P1N2N2/1PPP1PPP/R1BQKB1R b KQkq - +RL.12* +rnbqk2r/pppp1ppp/5n2/b3p3/4P3/P1N5/1PPP1PPP/R1BQKBNR w KQkq - +RL.09* +rnbqk2r/pppp1ppp/5n2/b3p3/4P3/P1NP4/1PP2PPP/R1BQKBNR b KQkq - +RL.10* +rnbqk2r/pppp1ppp/8/2b1p3/4P1n1/2N2N2/PPPP1PPP/R1BQKB1R w KQkq - +KP.01* +rnbqk2r/ppppp1bp/5np1/5p2/2PP4/6P1/PP2PPBP/RNBQK1NR w KQkq - +HD.07 +rnbqk2r/ppppppbp/5np1/6B1/3P4/5N2/PPP1PPPP/RN1QKB1R w KQkq - +QP.01 +rnbqk2r/ppppppbp/5np1/8/3P1B2/5N2/PPP1PPPP/RN1QKB1R w KQkq - +QP.03 +rnbqkb1r/1p2pppp/p2p1n2/6B1/3NP3/2N5/PPP2PPP/R2QKB1R b KQkq - +SI.04 +rnbqkb1r/1p2pppp/p2p1n2/8/2BNP3/2N5/PPP2PPP/R1BQK2R b KQkq - +SI.13 +rnbqkb1r/1p2pppp/p2p1n2/8/3NP3/2N5/PPP1BPPP/R1BQK2R b KQkq - +SI.10 +rnbqkb1r/1p2pppp/p2p1n2/8/3NP3/2N5/PPP2PPP/R1BQKB1R w KQkq - +SI.14 +rnbqkb1r/1p2pppp/p2p1n2/8/3NPP2/2N5/PPP3PP/R1BQKB1R b KQkq - +SI.12 +rnbqkb1r/1p2pppp/p4n2/2pp4/8/1P2PN2/P1PP1PPP/RNBQKB1R w KQkq - +QI.04* +rnbqkb1r/1p3ppp/p2ppn2/8/3NP3/2N5/PPP1BPPP/R1BQK2R w KQkq - +SI.23 +rnbqkb1r/1p3ppp/p3pn2/2p5/2BP4/4PN2/PP3PPP/RNBQ1RK1 w kq - +QG.07 +rnbqkb1r/3ppppp/p4n2/1PpP4/8/2N5/PP2PPPP/R1BQKBNR b KQkq - +BI.44 +rnbqkb1r/3ppppp/p4n2/1PpP4/8/4P3/PP3PPP/RNBQKBNR b KQkq - +BI.43 +rnbqkb1r/3ppppp/p4n2/1PpP4/8/8/PP2PPPP/RNBQKBNR w KQkq - +BI.45 +rnbqkb1r/5ppp/p2ppn2/1p4B1/3NPP2/2N5/PPP3PP/R2QKB1R w KQkq - +SI.07 +rnbqkb1r/p1pp1ppp/1p2pn2/8/2PP4/4PN2/PP3PPP/RNBQKB1R b KQkq - +QI.03 +rnbqkb1r/p1pp1ppp/1p2pn2/8/2PP4/5N2/PP2PPPP/RNBQKB1R w KQkq - +QI.02 +rnbqkb1r/p1pp1ppp/1p2pn2/8/2PP4/P4N2/1P2PPPP/RNBQKB1R b KQkq - +QI.04 +rnbqkb1r/p2ppp1p/1p3np1/2p5/3P4/2P2N2/PP2PPPP/RNBQKB1R w KQkq - +RE.04* +rnbqkb1r/p2ppppp/1p3n2/2p5/2P1P3/2N2N2/PP1P1PPP/R1BQKB1R b KQkq - +EO.43 +rnbqkb1r/p2ppppp/5n2/1ppP4/2P5/8/PP2PPPP/RNBQKBNR w KQkq - +BI.46 +rnbqkb1r/p2ppppp/5n2/1ppP4/8/8/PPP1PPPP/RNBQKBNR w KQkq - +RE.17* +rnbqkb1r/p4ppp/2p1pn2/1p4B1/2pPP3/2N2N2/PP3PPP/R2QKB1R w KQkq - +SL.07 +rnbqkb1r/pp1n1ppp/4p3/2ppP3/3P4/2PB4/PP1N1PPP/R1BQK1NR b KQkq - +FR.17 +rnbqkb1r/pp1p1ppp/2p2n2/4p3/2P5/2N3P1/PP1PPP1P/R1BQKBNR w KQkq - +EO.12 +rnbqkb1r/pp1p1ppp/2p2n2/4p3/4P3/2N5/PPPP1PPP/R1BQKBNR w KQkq - +KP.05* +rnbqkb1r/pp1p1ppp/4pn2/2pP4/8/8/PPP1PPPP/RNBQKBNR w KQkq - +RE.16* +rnbqkb1r/pp1p1ppp/4pn2/8/2PN4/6P1/PP2PP1P/RNBQKB1R b KQkq - +EO.45 +rnbqkb1r/pp1ppp1p/5np1/2p5/3P4/2P5/PP2PPPP/RNBQKBNR w KQkq - +RE.07* +rnbqkb1r/pp1ppp1p/5np1/2p5/3P4/4P3/PPP2PPP/RNBQKBNR w KQkq - +RE.12* +rnbqkb1r/pp1ppp1p/5np1/2pP4/2P5/8/PP2PPPP/RNBQKBNR b KQkq - +RE.14* +rnbqkb1r/pp1ppp1p/5np1/2pP4/8/8/PPP1PPPP/RNBQKBNR w KQkq - +RE.15* +rnbqkb1r/pp1ppppp/2p2n2/8/2P1P3/2N5/PP1P1PPP/R1BQKBNR b KQkq - +EO.61 +rnbqkb1r/pp1ppppp/5n2/2P5/8/8/PPP1PPPP/RNBQKBNR b KQkq - +RE.19* +rnbqkb1r/pp1ppppp/5n2/2p5/2PP4/8/PP2PPPP/RNBQKBNR w KQkq - +OI.06 +rnbqkb1r/pp1ppppp/5n2/2pP4/2P5/8/PP2PPPP/RNBQKBNR b KQkq - +BI.38 +rnbqkb1r/pp1ppppp/5n2/2pP4/8/2N5/PPP1PPPP/R1BQKBNR b KQkq - +OI.08 +rnbqkb1r/pp1ppppp/5n2/8/2PN4/8/PP2PPPP/RNBQKB1R b KQkq - +EO.46 +rnbqkb1r/pp1ppppp/8/3nP3/3p4/2P5/PP3PPP/RNBQKBNR w KQkq - +SI.47 +rnbqkb1r/pp2p1pp/2pp1n2/5p2/2PP4/6P1/PP2PPBP/RNBQK1NR w KQkq - +HD.04 +rnbqkb1r/pp2pp1p/2p2p2/8/3P4/8/PPP2PPP/R1BQKBNR w KQkq - +CK.07 +rnbqkb1r/pp2pp1p/3p1np1/8/3NP3/2N5/PPP2PPP/R1BQKB1R w KQkq - +SI.15 +rnbqkb1r/pp2pp1p/5np1/2pp4/8/BP2PN2/P1PP1PPP/RN1QKB1R b KQkq - +QI.05* +rnbqkb1r/pp2pp1p/6p1/2pn4/8/4PN2/PP1P1PPP/RNBQKB1R w KQkq - +EO.45* +rnbqkb1r/pp2pppp/2p2n2/3p4/2P5/1P3NP1/P2PPP1P/RNBQKB1R b KQkq - +RE.04 +rnbqkb1r/pp2pppp/2p2n2/3p4/2PP4/2N2N2/PP2PPPP/R1BQKB1R b KQkq - +SL.03 +rnbqkb1r/pp2pppp/5n2/2Pp4/8/8/PPP1PPPP/RNBQKBNR w KQkq - +QG.05* +rnbqkb1r/pp2pppp/5n2/2pp4/8/1P2PN2/P1PP1PPP/RNBQKB1R b KQkq - +QI.02* +rnbqkb1r/pp2pppp/5n2/2pp4/8/4PN2/PPPP1PPP/RNBQKB1R w KQkq - +QI.01* +rnbqkb1r/pp2pppp/5n2/3p4/2PP4/2N5/PP3PPP/R1BQKBNR b KQkq - +CK.03 +rnbqkb1r/pp2pppp/5n2/3p4/3P4/5N2/PP2PPPP/RNBQKB1R b KQkq - +SL.02* +rnbqkb1r/pp2pppp/5n2/3p4/3P4/5N2/PP2PPPP/RNBQKB1R w KQkq - +SL.02 +rnbqkb1r/pp2pppp/8/2pn4/8/2N1P3/PP1P1PPP/R1BQKBNR b KQkq - +EO.50* +rnbqkb1r/pp2pppp/8/2pn4/8/2N2N2/PP1PPPPP/R1BQKB1R w KQkq - +EO.42 +rnbqkb1r/pp2pppp/8/2pn4/8/2N3P1/PP1PPPBP/R1BQK1NR b KQkq - +EO.38 +rnbqkb1r/pp2pppp/8/2pn4/8/5N2/PP1PPPPP/RNBQKB1R w KQkq - +EO.46* +rnbqkb1r/pp3p1p/3p1np1/2pP2B1/8/2N2N2/PP2PPPP/R2QKB1R b KQkq - +BI.25 +rnbqkb1r/pp3p1p/3p1np1/2pP4/4PB2/2N5/PP3PPP/R2QKBNR b KQkq - +BI.35 +rnbqkb1r/pp3p1p/3p1np1/2pP4/8/2N5/PP1NPPPP/R1BQKB1R b KQkq - +BI.27 +rnbqkb1r/pp3ppp/2p1pn2/3p4/2PP4/2N1PN2/PP3PPP/R1BQKB1R b KQkq - +SL.08 +rnbqkb1r/pp3ppp/2p2p2/8/3P4/8/PPP2PPP/R1BQKBNR w KQkq - +CK.06 +rnbqkb1r/pp3ppp/3p1n2/2pPp3/2P1P3/2N5/PP3PPP/R1BQKBNR b KQkq - +OI.05 +rnbqkb1r/pp3ppp/3p1n2/4p3/3NP3/2N5/PPP2PPP/R1BQKB1R w KQkq - +SI.03 +rnbqkb1r/pp3ppp/3ppn2/8/3NP1P1/2N5/PPP2P1P/R1BQKB1R b KQkq - +SI.20 +rnbqkb1r/pp3ppp/3ppn2/8/3NP3/2N5/PPP2PPP/R1BQKB1R w KQkq - +SI.19 +rnbqkb1r/pp3ppp/3ppn2/8/3NPP2/2N5/PPP3PP/R1BQKB1R b KQkq - +SI.21 +rnbqkb1r/pp3ppp/4p3/8/3PP3/5N2/P4PPP/R1BQKB1R b KQkq - +TD.08 +rnbqkb1r/pp3ppp/4pn2/2Pp4/8/5N2/PPP1PPPP/RNBQKB1R w KQkq - +QG.08* +rnbqkb1r/pp3ppp/4pn2/2pP4/3P4/2N2N2/PP2PPPP/R1BQKB1R b KQkq - +TD.12 +rnbqkb1r/pp3ppp/4pn2/2pp4/2PP4/2N2N2/PP2PPPP/R1BQKB1R w KQkq - +TD.05 +rnbqkb1r/pp3ppp/4pn2/2pp4/8/1P2PN2/P1PP1PPP/RNBQKB1R w KQkq - +QI.03* +rnbqkb1r/ppn1pppp/8/2p5/8/2N3P1/PP1PPPBP/R1BQK1NR w KQkq - +EO.37 +rnbqkb1r/ppp1pp1p/3p1np1/6B1/3PP3/2N5/PPP2PPP/R2QKBNR b KQkq - +PU.09 +rnbqkb1r/ppp1pp1p/3p1np1/8/3PP3/2N2P2/PPP3PP/R1BQKBNR b KQkq - +PU.04 +rnbqkb1r/ppp1pp1p/3p1np1/8/3PP3/2N5/PPP2PPP/R1BQKBNR w KQkq - +PU.07 +rnbqkb1r/ppp1pp1p/3p2p1/3nP3/3P4/5N2/PPP2PPP/RNBQKB1R w KQkq - +AL.04 +rnbqkb1r/ppp1pp1p/5np1/3p4/2PP4/2N5/PP2PPPP/R1BQKBNR w KQkq - +GI.03 +rnbqkb1r/ppp1pp1p/6p1/3n4/8/2N2N2/PP1PPPPP/R1BQKB1R w KQkq - +EO.52 +rnbqkb1r/ppp1pp1p/6p1/3n4/8/2N3P1/PP1PPPBP/R1BQK1NR b KQkq - +EO.53 +rnbqkb1r/ppp1pp1p/6p1/8/3PP3/2P5/P4PPP/R1BQKBNR b KQkq - +GI.04 +rnbqkb1r/ppp1pppp/1n1P4/8/2PP4/8/PP3PPP/RNBQKBNR b KQkq - +AL.08 +rnbqkb1r/ppp1pppp/1n1p4/4P3/2PP1P2/8/PP4PP/RNBQKBNR b KQkq - +AL.07 +rnbqkb1r/ppp1pppp/3p1n2/8/2PP4/2N5/PP2PPPP/R1BQKBNR b KQkq - +OI.04 +rnbqkb1r/ppp1pppp/3p1n2/8/3PP3/8/PPP2PPP/RNBQKBNR w KQkq - +PU.08 +rnbqkb1r/ppp1pppp/3p4/3nP3/3P4/5N2/PPP2PPP/RNBQKB1R b KQkq - +AL.05 +rnbqkb1r/ppp1pppp/5n2/3P4/8/8/PPPP1PPP/RNBQKBNR w KQkq - +SD.03 +rnbqkb1r/ppp1pppp/5n2/3p4/8/5N2/PPPPPPPP/RNBQKB1R w KQkq - +QP.06* +rnbqkb1r/ppp1pppp/5n2/8/2pP4/4PN2/PP3PPP/RNBQKB1R b KQkq - +QG.08 +rnbqkb1r/ppp2ppp/3p1n2/4p3/4P3/2N5/PPPP1PPP/R1BQKBNR w KQkq - +KP.07* +rnbqkb1r/ppp2ppp/3p4/8/3Pn3/5N2/PPP2PPP/RNBQKB1R b KQkq - +RG.04 +rnbqkb1r/ppp2ppp/4pn2/3p2B1/3PP3/2N5/PPP2PPP/R2QKBNR b KQkq - +FR.05 +rnbqkb1r/ppp2ppp/4pn2/3p4/2P1P3/2N5/PP1P1PPP/R1BQKBNR w KQkq - +EO.57 +rnbqkb1r/ppp2ppp/4pn2/3p4/2P5/5NP1/PP1PPPBP/RNBQK2R b KQkq - +RE.11 +rnbqkb1r/ppp2ppp/4pn2/3p4/2PP4/2N5/PP2PPPP/R1BQKBNR w KQkq - +QO.16 +rnbqkb1r/ppp2ppp/4pn2/3pP3/3P4/8/PPPN1PPP/R1BQKBNR b KQkq - +FR.16 +rnbqkb1r/ppp2ppp/4pn2/8/2p5/5NP1/PP1PPPBP/RNBQK2R w KQkq - +RE.10 +rnbqkb1r/ppp2ppp/4pn2/8/2pP4/5NP1/PP2PPBP/RNBQK2R b KQkq - +CA.03 +rnbqkb1r/ppp2ppp/4pn2/8/Q1pP4/6P1/PP2PPBP/RNB1K1NR b KQkq - +CA.02 +rnbqkb1r/ppp2ppp/5n2/3Pp3/8/2N5/PPPP1PPP/R1BQKBNR b KQkq - +SO.06* +rnbqkb1r/ppp2ppp/5n2/3p2B1/3Np3/3P4/PPP1PPPP/RN1QKB1R b KQkq - +AL.03* +rnbqkb1r/ppp2ppp/5n2/3p4/3Np3/3P2P1/PPP1PP1P/RNBQKB1R b KQkq - +AL.04* +rnbqkb1r/ppp2ppp/5n2/3p4/3Np3/3P4/PPP1PPPP/RNBQKB1R w KQkq - +AL.05* +rnbqkb1r/ppp2ppp/5n2/3pN3/4P3/8/PPPP1PPP/RNBQKB1R b KQkq - +RG.02* +rnbqkb1r/ppp2ppp/5n2/3pN3/8/3P4/PPP2PPP/RNBQKB1R w KQkq - +RG.04* +rnbqkb1r/ppp2ppp/5n2/3pp3/4P3/3P4/PPP2PPP/RNBQKBNR w KQkq - +KP.08* +rnbqkb1r/ppp2ppp/5n2/3pp3/4PP2/2N5/PPPP2PP/R1BQKBNR w KQkq - +VG.03 +rnbqkb1r/ppp2ppp/8/3np3/2B5/2N5/PPPP1PPP/R1BQK1NR b KQkq - +SO.05* +rnbqkb1r/ppp2ppp/8/3np3/8/2N1P3/PP1P1PPP/R1BQKBNR b KQkq - +SI.39* +rnbqkb1r/ppp2ppp/8/3np3/8/2N3P1/PP1PPP1P/R1BQKBNR b KQkq - +SI.33* +rnbqkb1r/ppp2ppp/8/3np3/8/2N5/PP1PPPPP/R1BQKBNR w KQkq - +SI.32* +rnbqkb1r/ppp2ppp/8/3np3/8/2N5/PPPP1PPP/R1BQKBNR w KQkq - +SO.04* +rnbqkb1r/ppp2ppp/8/3np3/8/4P3/PP1P1PPP/RNBQKBNR w KQkq - +SI.41* +rnbqkb1r/pppp1ppp/4pn2/6B1/3P4/5N2/PPP1PPPP/RN1QKB1R b KQkq - +QP.04 +rnbqkb1r/pppp1ppp/4pn2/8/2PP4/5N2/PP2PPPP/RNBQKB1R b KQkq - +QI.01 +rnbqkb1r/pppp1ppp/4pn2/8/2PP4/6P1/PP2PP1P/RNBQKBNR b KQkq - +CA.01 +rnbqkb1r/pppp1ppp/4pn2/8/3P1B2/5N2/PPP1PPPP/RN1QKB1R b KQkq - +QP.05 +rnbqkb1r/pppp1ppp/5n2/4N3/4P3/8/PPPP1PPP/RNBQKB1R b KQkq - +RG.03 +rnbqkb1r/pppp1ppp/5n2/4p3/2B1P3/2N5/PPPP1PPP/R1BQK1NR b KQkq - +VG.02 +rnbqkb1r/pppp1ppp/5n2/4p3/2P5/2N2N2/PP1PPPPP/R1BQKB1R b KQkq - +EO.09 +rnbqkb1r/pppp1ppp/5n2/4p3/2P5/2N5/PP1PPPPP/R1BQKBNR b KQkq - +SI.31* +rnbqkb1r/pppp1ppp/5n2/4p3/2P5/2N5/PP1PPPPP/R1BQKBNR w KQkq - +EO.10 +rnbqkb1r/pppp1ppp/5n2/4p3/2P5/3P4/PP2PPPP/RNBQKBNR b KQkq - +SI.01* +rnbqkb1r/pppp1ppp/5n2/4p3/2P5/8/PP1PPPPP/RNBQKBNR w KQkq - +SI.43* +rnbqkb1r/pppp1ppp/5n2/4p3/2PP4/8/PP2PPPP/RNBQKBNR w KQkq - +QG.01 +rnbqkb1r/pppp1ppp/5n2/4p3/4P3/2N3P1/PPPP1P1P/R1BQKBNR b KQkq - +VG.01 +rnbqkb1r/pppp1ppp/5n2/4p3/4P3/5N2/PPPP1PPP/RNBQKB1R b KQkq - +RG.01* +rnbqkb1r/pppp1ppp/5n2/4p3/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - +RG.01 +rnbqkb1r/pppp1ppp/5n2/4p3/4PP2/8/PPPP2PP/RNBQKBNR b KQkq - +KP.09* +rnbqkb1r/pppp1ppp/5n2/4p3/8/2N5/PPPPPPPP/R1BQKBNR w KQkq - +VO.05* +rnbqkb1r/pppp1ppp/8/4P3/6n1/8/PPPPP1PP/RNBQKBNR w KQkq - +HD.13* +rnbqkb1r/pppp1ppp/8/4p3/3Pn3/5N2/PPP2PPP/RNBQKB1R w KQkq - +RG.02 +rnbqkb1r/pppp1ppp/8/4p3/4n3/5N2/PPPP1PPP/RNBQKB1R w KQkq - +RG.03* +rnbqkb1r/pppp2pp/4pn2/5p2/2PP4/6P1/PP2PPBP/RNBQK1NR b KQkq - +HD.03 +rnbqkb1r/pppp2pp/5n2/4pP2/6P1/8/PPPP1P1P/RNBQKBNR b KQkq - +KG.01* +rnbqkb1r/pppp2pp/5n2/4pP2/8/8/PPPP1PPP/RNBQKBNR w KQkq - +KG.02* +rnbqkb1r/ppppp1pp/5n2/5p2/2PP4/2N5/PP2PPPP/R1BQKBNR b KQkq - +HD.05 +rnbqkb1r/ppppp2p/5np1/5p2/2PP4/6P1/PP2PP1P/RNBQKBNR w KQkq - +HD.08 +rnbqkb1r/pppppp1p/5np1/6B1/3P4/5N2/PPP1PPPP/RN1QKB1R b KQkq - +QP.02 +rnbqkb1r/pppppp1p/5np1/8/2PP4/8/PP2PPPP/RNBQKBNR w KQkq - +GI.01 +rnbqkb1r/pppppp1p/5np1/8/2PP4/8/PP2PPPP/RNBQKBNR w KQkq - +KI.80 +rnbqkb1r/pppppppp/5n2/8/2P5/8/PP1PPPPP/RNBQKBNR b KQkq - +QP.10* +rnbqkb1r/pppppppp/5n2/8/3P4/5N2/PPP1PPPP/RNBQKB1R b KQkq - +QP.06 +rnbqkb1r/pppppppp/5n2/8/3P4/8/PPP1PPPP/RNBQKBNR b KQkq - +QP.09* +rnbqkb1r/pppppppp/5n2/8/3P4/8/PPP1PPPP/RNBQKBNR w KQkq - +QP.07 +rnbqkb1r/pppppppp/5n2/8/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +AL.10 +rnbqkb1r/pppppppp/5n2/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - +QP.11* +rnbqkb1r/pppppppp/7n/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - +VO.16* +rnbqkb1r/pppppppp/8/3nP3/3P4/8/PPP2PPP/RNBQKBNR b KQkq - +AL.09 +rnbqkbnr/1p1p1ppp/p3p3/8/3NP3/3B4/PPP2PPP/RNBQK2R b KQkq - +SI.42 +rnbqkbnr/1ppppppp/p7/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - +VO.14* +rnbqkbnr/p1pppppp/1p6/8/2P5/8/PP1PPPPP/RNBQKBNR w KQkq - +EO.63 +rnbqkbnr/p1pppppp/1p6/8/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +VO.01 +rnbqkbnr/p1pppppp/1p6/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - +VO.08* +rnbqkbnr/p1pppppp/8/1p6/8/8/PPPPPPPP/RNBQKBNR w KQkq - +VO.10* +rnbqkbnr/pp1p1ppp/2p5/4p3/2P5/8/PP1PPPPP/RNBQKBNR w KQkq - +SI.46* +rnbqkbnr/pp1p1ppp/4p3/8/3NP3/8/PPP2PPP/RNBQKB1R b KQkq - +SI.41 +rnbqkbnr/pp1p1ppp/8/2p1p3/4P3/6P1/PPPP1P1P/RNBQKBNR b KQkq - +EO.62* +rnbqkbnr/pp1ppp1p/6p1/2p5/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +EO.24* +rnbqkbnr/pp1ppppp/2p5/8/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +CK.01 +rnbqkbnr/pp1ppppp/2p5/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - +VO.12* +rnbqkbnr/pp1ppppp/8/2p5/3P4/8/PPP1PPPP/RNBQKBNR w KQkq - +OI.09 +rnbqkbnr/pp1ppppp/8/2p5/4P3/2N5/PPPP1PPP/R1BQKBNR b KQkq - +SI.44 +rnbqkbnr/pp1ppppp/8/2p5/4P3/2P5/PP1P1PPP/RNBQKBNR b KQkq - +SI.46 +rnbqkbnr/pp1ppppp/8/2p5/4P3/5N2/PPPP1PPP/RNBQKB1R b KQkq - +SI.43 +rnbqkbnr/pp1ppppp/8/2p5/4P3/8/PPPP1PPP/RNBQKBNR b KQkq - +EO.25* +rnbqkbnr/pp1ppppp/8/2p5/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +SI.48 +rnbqkbnr/pp1ppppp/8/2p5/5P2/8/PPPPP1PP/RNBQKBNR b KQkq - +HD.14* +rnbqkbnr/pp1ppppp/8/2p5/8/1P6/P1PPPPPP/RNBQKBNR b KQkq - +EO.63* +rnbqkbnr/pp1ppppp/8/2p5/8/5N2/PPPPPPPP/RNBQKB1R w KQkq - +QP.10 +rnbqkbnr/pp1ppppp/8/2p5/8/8/PPPPPPPP/RNBQKBNR w KQkq - +EO.64* +rnbqkbnr/pp2pp1p/6p1/2pp4/5P2/5NP1/PPPPP2P/RNBQKB1R b KQkq - +HD.08* +rnbqkbnr/pp2pp1p/6p1/2pp4/8/4PN2/PPPP1PPP/RNBQKB1R w KQkq - +CA.01* +rnbqkbnr/pp2pppp/2p5/3p4/2P5/5NP1/PP1PPP1P/RNBQKB1R b KQkq - +RE.07 +rnbqkbnr/pp2pppp/2p5/3p4/2PP4/8/PP2PPPP/RNBQKBNR w KQkq - +SL.01 +rnbqkbnr/pp2pppp/2p5/3p4/3PP3/2N5/PPP2PPP/R1BQKBNR b KQkq - +CK.05 +rnbqkbnr/pp2pppp/2p5/3p4/3PP3/8/PPP2PPP/RNBQKBNR w KQkq - +CK.02 +rnbqkbnr/pp2pppp/3p4/2p5/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - +SI.01 +rnbqkbnr/pp2pppp/3p4/8/3QP3/5N2/PPP2PPP/RNB1KB1R b KQkq - +SI.02 +rnbqkbnr/pp2pppp/8/2Pp4/8/8/PPP1PPPP/RNBQKBNR b KQkq - +QG.03* +rnbqkbnr/pp2pppp/8/2p5/1PPp4/5N2/P2PPPPP/RNBQKB1R b KQkq - +BI.46* +rnbqkbnr/pp2pppp/8/2p5/2Pp4/5N2/PP1PPPPP/RNBQKB1R w KQkq - +BI.38* +rnbqkbnr/pp2pppp/8/2p5/2Pp4/5NP1/PP1PPP1P/RNBQKB1R w KQkq - +RE.14 +rnbqkbnr/pp2pppp/8/2pp4/2P5/5N2/PP1PPPPP/RNBQKB1R b KQkq - +OI.06* +rnbqkbnr/pp2pppp/8/2pp4/3P4/2P5/PP2PPPP/RNBQKBNR b KQkq - +SL.01* +rnbqkbnr/pp2pppp/8/2pp4/3PP3/8/PPP2PPP/RNBQKBNR b KQkq - +QG.02* +rnbqkbnr/pp2pppp/8/2pp4/4P3/5N2/PPPP1PPP/RNBQKB1R b KQkq - +QG.01* +rnbqkbnr/pp2pppp/8/2pp4/5P2/8/PPPPP1PP/RNBQKBNR w KQkq - +HD.10* +rnbqkbnr/pp2pppp/8/2pp4/8/3P4/PPP1PPPP/RNBQKBNR w KQkq - +OI.07* +rnbqkbnr/pp2pppp/8/2pp4/8/5NP1/PPPPPP1P/RNBQKB1R b KQkq - +GI.01* +rnbqkbnr/pp2pppp/8/2pp4/8/5NP1/PPPPPP1P/RNBQKB1R b KQkq - +KI.80* +rnbqkbnr/pp2pppp/8/8/1pPp4/P4N2/3PPPPP/RNBQKB1R b KQkq - +BI.45* +rnbqkbnr/pp3ppp/2p1p3/3p4/2PP4/2N5/PP2PPPP/R1BQKBNR w KQkq - +SL.06 +rnbqkbnr/pp3ppp/2p5/3P4/3Np3/8/PP1PPPPP/RNBQKB1R b KQkq - +SI.47* +rnbqkbnr/pp3ppp/4p3/2pp4/2PP4/2N5/PP2PPPP/R1BQKBNR w KQkq - +TD.10 +rnbqkbnr/pp3ppp/4p3/2pp4/3PP3/8/PPPN1PPP/R1BQKBNR w KQkq - +FR.18 +rnbqkbnr/pp3ppp/4p3/8/1pPp4/P4N2/3PPPPP/RNBQKB1R w KQkq - +BI.43* +rnbqkbnr/pp3ppp/8/2Ppp3/8/8/PPP1PPPP/RNBQKBNR w KQkq - +QG.04* +rnbqkbnr/pp3ppp/8/2pp4/3P4/2N2N2/PP2PPPP/R1BQKB1R b KQkq - +TD.11 +rnbqkbnr/pp3ppp/8/2pp4/3P4/5N2/PPPN1PPP/R1BQKB1R b KQkq - +FR.21 +rnbqkbnr/pp3ppp/8/2pp4/3P4/8/PPPN1PPP/R1BQKBNR w KQkq - +FR.20 +rnbqkbnr/pp3ppp/8/2pp4/8/1N1p4/PPP1PPPP/RNBQKB1R w KQkq - +AL.08* +rnbqkbnr/pp4pp/8/2pp1p2/4p3/1N1P4/PPP1PPPP/RNBQKB1R w KQkq - +AL.07* +rnbqkbnr/ppp1pppp/3p4/8/2PP4/8/PP2PPPP/RNBQKBNR b KQkq - +OI.07 +rnbqkbnr/ppp1pppp/3p4/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - +VO.13* +rnbqkbnr/ppp1pppp/8/3p4/2P5/8/PP1PPPPP/RNBQKBNR b KQkq - +OI.09* +rnbqkbnr/ppp1pppp/8/3p4/3P4/8/PPP1PPPP/RNBQKBNR b KQkq - +QP.08* +rnbqkbnr/ppp1pppp/8/3p4/3P4/8/PPP1PPPP/RNBQKBNR w KQkq - +QP.08 +rnbqkbnr/ppp1pppp/8/3p4/5P2/8/PPPPP1PP/RNBQKBNR b KQkq - +HD.12* +rnbqkbnr/ppp1pppp/8/3p4/8/5N2/PPPPPPPP/RNBQKB1R b KQkq - +QP.07* +rnbqkbnr/ppp1pppp/8/3p4/8/5N2/PPPPPPPP/RNBQKB1R w KQkq - +QP.09 +rnbqkbnr/ppp1pppp/8/3p4/8/8/PPPPPPPP/RNBQKBNR w KQkq - +QO.17* +rnbqkbnr/ppp1pppp/8/8/1PPp4/5N2/P2PPPPP/RNBQKB1R b KQkq - +RE.17 +rnbqkbnr/ppp1pppp/8/8/2Pp4/4PN2/PP1P1PPP/RNBQKB1R b KQkq - +RE.16 +rnbqkbnr/ppp1pppp/8/8/2Pp4/5NP1/PP1PPP1P/RNBQKB1R b KQkq - +RE.15 +rnbqkbnr/ppp1pppp/8/8/2p5/5N2/PP1PPPPP/RNBQKB1R w KQkq - +RE.19 +rnbqkbnr/ppp1pppp/8/8/2p5/N4N2/PP1PPPPP/R1BQKB1R b KQkq - +RE.18 +rnbqkbnr/ppp1pppp/8/8/2pP4/5N2/PP2PPPP/RNBQKB1R b KQkq - +QG.05 +rnbqkbnr/ppp1pppp/8/8/2pP4/8/PP2PPPP/RNBQKBNR w KQkq - +QG.03 +rnbqkbnr/ppp1pppp/8/8/2pPP3/8/PP3PPP/RNBQKBNR b KQkq - +QG.04 +rnbqkbnr/ppp2ppp/3p4/4p3/2P5/2N5/PP1PPPPP/R1BQKBNR w KQkq - +EO.22 +rnbqkbnr/ppp2ppp/3p4/4p3/3PP3/5N2/PPP2PPP/RNBQKB1R b KQkq - +KP.08 +rnbqkbnr/ppp2ppp/3p4/4p3/8/4P3/PPPP1PPP/RNBQKBNR w KQkq - +FR.02* +rnbqkbnr/ppp2ppp/4p3/3p4/2P5/5NP1/PP1PPP1P/RNBQKB1R b KQkq - +RE.12 +rnbqkbnr/ppp2ppp/4p3/3p4/3PP3/2N5/PPP2PPP/R1BQKBNR b KQkq - +FR.04 +rnbqkbnr/ppp2ppp/4p3/3p4/3PP3/8/PPPN1PPP/R1BQKBNR b KQkq - +FR.14 +rnbqkbnr/ppp2ppp/4p3/3pP3/3P4/8/PPP2PPP/RNBQKBNR b KQkq - +FR.03 +rnbqkbnr/ppp2ppp/4p3/8/3PN3/8/PPP2PPP/R1BQKBNR b KQkq - +FR.07 +rnbqkbnr/ppp2ppp/8/3Pp3/8/8/PPPP1PPP/RNBQKBNR b KQkq - +KP.04* +rnbqkbnr/ppp2ppp/8/3p4/3Np3/8/PPPPPPPP/RNBQKB1R w KQkq - +AL.09* +rnbqkbnr/ppp2ppp/8/3p4/3Pp3/4P3/PPP2PPP/RNBQKBNR w KQkq - +FR.03* +rnbqkbnr/ppp2ppp/8/3p4/3PpB2/2P5/PP2PPPP/RN1QKBNR b KQkq - +CK.04* +rnbqkbnr/ppp2ppp/8/3pp3/2PP4/8/PP2PPPP/RNBQKBNR w KQkq - +QG.02 +rnbqkbnr/ppp2ppp/8/3pp3/3P4/2N5/PPP1PPPP/R1BQKBNR b KQkq - +VO.06* +rnbqkbnr/ppp2ppp/8/3pp3/3P4/2P5/PP2PPPP/RNBQKBNR b KQkq - +CK.02* +rnbqkbnr/ppp2ppp/8/3pp3/4PP2/8/PPPP2PP/RNBQKBNR w KQkq - +KG.04 +rnbqkbnr/ppp2ppp/8/3pp3/5P2/8/PPPPP1PP/RNBQKBNR w KQkq - +HD.11* +rnbqkbnr/ppp2ppp/8/3pp3/8/3P1N2/PPP1PPPP/RNBQKB1R b KQkq - +PU.08* +rnbqkbnr/ppp2ppp/8/3pp3/8/6P1/PPPPPPBP/RNBQK1NR b KQkq - +KF.05* +rnbqkbnr/pppp1p1p/6p1/4p3/2P1P3/8/PP1P1PPP/RNBQKBNR w KQkq - +EO.62 +rnbqkbnr/pppp1p1p/8/6p1/4Pp2/5N2/PPPP2PP/RNBQKB1R w KQkq - +KG.01 +rnbqkbnr/pppp1ppp/4p3/8/4P3/3P4/PPP2PPP/RNBQKBNR b KQkq - +FR.02 +rnbqkbnr/pppp1ppp/4p3/8/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +FR.01 +rnbqkbnr/pppp1ppp/8/4p3/2B1P3/8/PPPP1PPP/RNBQK1NR b KQkq - +IG.04 +rnbqkbnr/pppp1ppp/8/4p3/2P5/2N5/PP1PPPPP/R1BQKBNR b KQkq - +EO.23 +rnbqkbnr/pppp1ppp/8/4p3/2P5/6P1/PP1PPP1P/RNBQKBNR b KQkq - +EO.24 +rnbqkbnr/pppp1ppp/8/4p3/2P5/8/PP1PPPPP/RNBQKBNR b KQkq - +SI.48* +rnbqkbnr/pppp1ppp/8/4p3/2P5/8/PP1PPPPP/RNBQKBNR w KQkq - +EO.25 +rnbqkbnr/pppp1ppp/8/4p3/4P3/2N5/PPPP1PPP/R1BQKBNR b KQkq - +VG.04 +rnbqkbnr/pppp1ppp/8/4p3/4P3/8/PPPP1PPP/RNBQKBNR b KQkq - +KP.10* +rnbqkbnr/pppp1ppp/8/4p3/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +KP.10 +rnbqkbnr/pppp1ppp/8/4p3/4PP2/8/PPPP2PP/RNBQKBNR b KQkq - +KG.05 +rnbqkbnr/pppp1ppp/8/4p3/8/1P6/P1PPPPPP/RNBQKBNR b KQkq - +VO.01* +rnbqkbnr/pppp1ppp/8/4p3/8/2N5/PPPPPPPP/R1BQKBNR b KQkq - +VO.04* +rnbqkbnr/pppp1ppp/8/4p3/8/2P5/PP1PPPPP/RNBQKBNR b KQkq - +CK.01* +rnbqkbnr/pppp1ppp/8/4p3/8/4P3/PPPP1PPP/RNBQKBNR b KQkq - +FR.01* +rnbqkbnr/pppp1ppp/8/4p3/8/5N2/PPPPPPPP/RNBQKB1R b KQkq - +AL.10* +rnbqkbnr/pppp1ppp/8/4p3/8/6P1/PPPPPP1P/RNBQKBNR b KQkq - +KF.06* +rnbqkbnr/pppp1ppp/8/4p3/8/8/PPPPPPPP/RNBQKBNR w KQkq - +VO.17* +rnbqkbnr/pppp1ppp/8/8/3p4/5N2/PPP1PPPP/RNBQKB1R b KQkq - +SD.03* +rnbqkbnr/pppp1ppp/8/8/3pP3/8/PPP2PPP/RNBQKBNR w KQkq - +KP.04 +rnbqkbnr/pppp1ppp/8/8/4Pp2/5N2/PPPP2PP/RNBQKB1R b KQkq - +KG.02 +rnbqkbnr/pppp1ppp/8/8/4Pp2/8/PPPP2PP/RNBQKBNR w KQkq - +KG.03 +rnbqkbnr/pppp2pp/8/4pP2/8/8/PPPP1PPP/RNBQKBNR b KQkq - +KG.03* +rnbqkbnr/pppp2pp/8/4pp2/3PP3/8/PPP2PPP/RNBQKBNR b KQkq - +KG.04* +rnbqkbnr/pppp2pp/8/4pp2/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - +KP.09 +rnbqkbnr/pppp2pp/8/4pp2/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +KG.05* +rnbqkbnr/ppppp1pp/8/5p2/2P5/8/PP1PPPPP/RNBQKBNR w KQkq - +HD.14 +rnbqkbnr/ppppp1pp/8/5p2/2PP4/8/PP2PPPP/RNBQKBNR b KQkq - +HD.10 +rnbqkbnr/ppppp1pp/8/5p2/3P4/8/PPP1PPPP/RNBQKBNR w KQkq - +HD.12 +rnbqkbnr/ppppp1pp/8/5p2/3PP3/8/PPP2PPP/RNBQKBNR b KQkq - +HD.11 +rnbqkbnr/ppppp1pp/8/5p2/8/8/PPPPPPPP/RNBQKBNR w KQkq - +VO.07* +rnbqkbnr/ppppp1pp/8/6N1/4p3/8/PPPP1PPP/RNBQKB1R b KQkq - +HD.13 +rnbqkbnr/ppppp2p/6p1/5p2/3P4/6P1/PPP1PPBP/RNBQK1NR b KQkq - +HD.09 +rnbqkbnr/pppppp1p/6p1/8/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - +KF.06 +rnbqkbnr/pppppp1p/6p1/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - +VO.09* +rnbqkbnr/pppppp1p/8/6p1/8/8/PPPPPPPP/RNBQKBNR w KQkq - +VO.11* +rnbqkbnr/pppppppp/8/8/1P6/8/P1PPPPPP/RNBQKBNR b KQkq - +VO.10 +rnbqkbnr/pppppppp/8/8/2P5/8/PP1PPPPP/RNBQKBNR b KQkq - +EO.64 +rnbqkbnr/pppppppp/8/8/3P4/8/PPP1PPPP/RNBQKBNR b KQkq - +QO.17 +rnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBNR b KQkq - +VO.17 +rnbqkbnr/pppppppp/8/8/5P2/8/PPPPP1PP/RNBQKBNR b KQkq - +VO.07 +rnbqkbnr/pppppppp/8/8/6P1/8/PPPPPP1P/RNBQKBNR b KQkq - +VO.11 +rnbqkbnr/pppppppp/8/8/8/1P6/P1PPPPPP/RNBQKBNR b KQkq - +VO.08 +rnbqkbnr/pppppppp/8/8/8/2N5/PPPPPPPP/R1BQKBNR b KQkq - +VO.15 +rnbqkbnr/pppppppp/8/8/8/2P5/PP1PPPPP/RNBQKBNR b KQkq - +VO.12 +rnbqkbnr/pppppppp/8/8/8/3P4/PPP1PPPP/RNBQKBNR b KQkq - +VO.13 +rnbqkbnr/pppppppp/8/8/8/5N2/PPPPPPPP/RNBQKB1R b KQkq - +QP.11 +rnbqkbnr/pppppppp/8/8/8/6P1/PPPPPP1P/RNBQKBNR b KQkq - +VO.09 +rnbqkbnr/pppppppp/8/8/8/7N/PPPPPPPP/RNBQKB1R b KQkq - +VO.16 +rnbqkbnr/pppppppp/8/8/8/P7/1PPPPPPP/RNBQKBNR b KQkq - +VO.14 +rnbqr1k1/1ppp1ppp/1b3n2/p3p3/1P2P3/P1N2N2/2PPBPPP/R1BQ1RK1 w - - +RL.18* +rnbqr1k1/pp1p1pp1/1bp2n1p/4p3/1P2P3/P1NP1N1P/2P1BPP1/R1BQ1RK1 b - - +RL.22* +rnbqr1k1/pp1p1pp1/1bp2n1p/4p3/1P2P3/P1NP1N2/1BP1BPPP/R2Q1RK1 b - - +RL.26* +rnbqr1k1/pp1p1pp1/1bp2n1p/4p3/1P2P3/P1NP1N2/2P1BPPP/R1BQ1RK1 w - - +RL.21* +rnbqr1k1/pp1p1pp1/1bp2n1p/4p3/1P2P3/P2P1N2/2P1BPPP/RNBQ1RK1 b - - +RL.25* +rnbqr1k1/pp3pbp/3p1np1/2pP4/4PP2/2N2N2/PP2B1PP/R1BQK2R w KQ - +BI.29 +rnbqr1k1/pp3pbp/3p1np1/2pP4/8/2N2NP1/PP2PPBP/R1BQ1RK1 w - - +BI.23 +rnbqr1k1/pp3ppp/1bp2n2/3pp3/1P2P3/P1NP1N2/2P1BPPP/R1BQ1RK1 w - - +RL.20* +rnbqr1k1/ppbp1pp1/2p2n1p/4p3/NP2P3/P2P1N2/2P1BPPP/R1BQ1RK1 w - - +RL.23* +rnbqr1k1/pppp1ppp/1b3n2/4p3/1P2P3/P1N2N2/2PPBPPP/R1BQK2R w KQ - +RL.17* +rnbqr1k1/pppp1ppp/1b3n2/4p3/1P2P3/P1NP1N2/2P1BPPP/R1BQK2R b KQ - +RL.19* +rnbqr1k1/pppp1ppp/5n2/b3p3/4P3/P1NP1N2/1PP1BPPP/R1BQK2R b KQ - +RL.16* diff --git a/lasker-2.2.3/data/book/opening.doc b/lasker-2.2.3/data/book/opening.doc new file mode 100644 index 0000000..c49e43e --- /dev/null +++ b/lasker-2.2.3/data/book/opening.doc @@ -0,0 +1,27 @@ + +You'll find the following files: + +fen.doc +long001.idx +eco000.idx +nic000.idx +changes.txt + +long.idx is standard English long name +eco.idx is the ECO classification scheme +nic.idx is the NIC classification scheme + +Current features: + +Include color reversed positions (tagged with a *). + +Please do not modify any of these files and then distribute, since I do +not want multiple versions of these floating around and confusing people. +If there is something you'd like to see added or changed, please contact +me so we can do it together and keep everything coherent. The next +versions planned will hopefully feature *much* greater compression of data, +and the abilility to recognize a transposition out of one main line and +into another (there is a difference between very early positions and deep +main lines). + +Chris Long {clong@cnj.digex.net, clong@eden.rutgers.edu} diff --git a/lasker-2.2.3/data/com_help/CVS/Entries b/lasker-2.2.3/data/com_help/CVS/Entries new file mode 100644 index 0000000..1784810 --- /dev/null +++ b/lasker-2.2.3/data/com_help/CVS/Entries @@ -0,0 +1 @@ +D diff --git a/lasker-2.2.3/data/com_help/CVS/Repository b/lasker-2.2.3/data/com_help/CVS/Repository new file mode 100644 index 0000000..cbd3dfb --- /dev/null +++ b/lasker-2.2.3/data/com_help/CVS/Repository @@ -0,0 +1 @@ +lasker/data/com_help diff --git a/lasker-2.2.3/data/com_help/CVS/Root b/lasker-2.2.3/data/com_help/CVS/Root new file mode 100644 index 0000000..c42ba94 --- /dev/null +++ b/lasker-2.2.3/data/com_help/CVS/Root @@ -0,0 +1 @@ +/home/cvs diff --git a/lasker-2.2.3/data/help/CVS/Entries b/lasker-2.2.3/data/help/CVS/Entries new file mode 100644 index 0000000..11ae2d2 --- /dev/null +++ b/lasker-2.2.3/data/help/CVS/Entries @@ -0,0 +1,211 @@ +/_help/1.1/Thu Jun 6 08:56:54 2002// +/abuser/1.1/Thu Jun 6 08:56:54 2002// +/addresses/1.1/Thu Jun 6 08:56:54 2002// +/adjournments/1.1/Thu Jun 6 08:56:55 2002// +/adjud_info/1.1/Thu Jun 6 08:56:55 2002// +/adm-info/1.1/Thu Jun 6 08:56:55 2002// +/adm-new/1.1/Thu Jun 6 08:56:55 2002// +/adm_info/1.1/Thu Jun 6 08:56:55 2002// +/adm_new/1.1/Thu Jun 6 08:56:55 2002// +/admins/1.1/Thu Jun 6 08:56:55 2002// +/allobservers/1.1/Thu Jun 6 08:56:55 2002// +/analysis/1.1/Thu Jun 6 08:56:55 2002// +/backward/1.1/Thu Jun 6 08:56:55 2002// +/chan_1/1.1/Thu Jun 6 08:56:55 2002// +/channel/1.1/Thu Jun 6 08:56:55 2002// +/clearmessages/1.1/Thu Jun 6 08:56:55 2002// +/cls/1.1/Thu Jun 6 08:56:55 2002// +/cls_info/1.1/Thu Jun 6 08:56:55 2002// +/courtesyabort/1.1/Thu Jun 6 08:56:55 2002// +/credit/1.1/Thu Jun 6 08:56:55 2002// +/date/1.1/Thu Jun 6 08:56:55 2002// +/decline/1.1/Thu Jun 6 08:56:55 2002// +/draw/1.1/Thu Jun 6 08:56:55 2002// +/eco/1.1/Thu Jun 6 08:56:55 2002// +/eggo/1.1/Thu Jun 6 08:56:55 2002// +/fics-lingo/1.1/Thu Jun 6 08:56:55 2002// +/fics_lingo/1.1/Thu Jun 6 08:56:55 2002// +/ficsfaq/1.1/Thu Jun 6 08:56:55 2002// +/fixes/1.1/Thu Jun 6 08:56:55 2002// +/ftp-hints/1.1/Thu Jun 6 08:56:55 2002// +/ftp_hints/1.1/Thu Jun 6 08:56:55 2002// +/glicko/1.1/Thu Jun 6 08:56:55 2002// +/gm_game/1.1/Thu Jun 6 08:56:55 2002// +/goboard/1.1/Thu Jun 6 08:56:55 2002// +/gonum/1.1/Thu Jun 6 08:56:55 2002// +/handle/1.1/Thu Jun 6 08:56:55 2002// +/hrank/1.1/Thu Jun 6 08:56:55 2002// +/inchannel/1.1/Thu Jun 6 08:56:55 2002// +/index/1.1/Thu Jun 6 08:56:55 2002// +/inetchesslib/1.1/Thu Jun 6 08:56:55 2002// +/intro0/1.1/Thu Jun 6 08:56:55 2002// +/intro1/1.1/Thu Jun 6 08:56:55 2002// +/intro2/1.1/Thu Jun 6 08:56:55 2002// +/intro3/1.1/Thu Jun 6 08:56:55 2002// +/intro4/1.1/Thu Jun 6 08:56:55 2002// +/intro5/1.1/Thu Jun 6 08:56:55 2002// +/intro6/1.1/Thu Jun 6 08:56:55 2002// +/intro7/1.1/Thu Jun 6 08:56:55 2002// +/intro_information/1.1/Thu Jun 6 08:56:55 2002// +/intro_moving/1.1/Thu Jun 6 08:56:55 2002// +/intro_playing/1.1/Thu Jun 6 08:56:55 2002// +/intro_settings/1.1/Thu Jun 6 08:56:55 2002// +/intro_special/1.1/Thu Jun 6 08:56:55 2002// +/lag/1.1/Thu Jun 6 08:56:55 2002// +/lecture1/1.1/Thu Jun 6 08:56:55 2002// +/limits/1.1/Thu Jun 6 08:56:55 2002// +/lists/1.1/Thu Jun 6 08:56:55 2002// +/mailmess/1.1/Thu Jun 6 08:56:55 2002// +/mailmoves/1.1/Thu Jun 6 08:56:55 2002// +/mailoldmoves/1.1/Thu Jun 6 08:56:55 2002// +/mailstored/1.1/Thu Jun 6 08:56:55 2002// +/moretime/1.1/Thu Jun 6 08:56:55 2002// +/motd.std/1.1/Thu Jun 6 08:56:55 2002// +/motd_help/1.1/Thu Jun 6 08:56:55 2002// +/moves/1.1/Thu Jun 6 08:56:55 2002// +/newrating/1.1/Thu Jun 6 08:56:55 2002// +/news/1.1/Thu Jun 6 08:56:55 2002// +/next/1.1/Thu Jun 6 08:56:55 2002// +/oldmoves/1.1/Thu Jun 6 08:56:55 2002// +/pause/1.1/Thu Jun 6 08:56:56 2002// +/pending/1.1/Thu Jun 6 08:56:56 2002// +/rank/1.1/Thu Jun 6 08:56:56 2002// +/register/1.1/Thu Jun 6 08:56:56 2002// +/register.dist/1.1/Thu Jun 6 08:56:56 2002// +/register.email/1.1/Thu Jun 6 08:56:56 2002// +/servers/1.1/Thu Jun 6 08:56:56 2002// +/shout_abuse/1.1/Thu Jun 6 08:56:56 2002// +/shout_quota/1.1/Thu Jun 6 08:56:56 2002// +/showlist/1.1/Thu Jun 6 08:56:56 2002// +/simabort/1.1/Thu Jun 6 08:56:56 2002// +/simadjourn/1.1/Thu Jun 6 08:56:56 2002// +/simallabort/1.1/Thu Jun 6 08:56:56 2002// +/simalladjourn/1.1/Thu Jun 6 08:56:56 2002// +/simgames/1.1/Thu Jun 6 08:56:56 2002// +/simmatch/1.1/Thu Jun 6 08:56:56 2002// +/simnext/1.1/Thu Jun 6 08:56:56 2002// +/simopen/1.1/Thu Jun 6 08:56:56 2002// +/simpass/1.1/Thu Jun 6 08:56:56 2002// +/simprev/1.1/Thu Jun 6 08:56:56 2002// +/simuls/1.1/Thu Jun 6 08:56:56 2002// +/soapbox/1.1/Thu Jun 6 08:56:56 2002// +/sourcecode/1.1/Thu Jun 6 08:56:56 2002// +/sublist/1.1/Thu Jun 6 08:56:56 2002// +/switch/1.1/Thu Jun 6 08:56:56 2002// +/takeback/1.1/Thu Jun 6 08:56:56 2002// +/teamgames/1.1/Thu Jun 6 08:56:56 2002// +/todo/1.1/Thu Jun 6 08:56:56 2002// +/totals/1.1/Thu Jun 6 08:56:56 2002// +/unalias/1.1/Thu Jun 6 08:56:56 2002// +/uncensor/1.1/Thu Jun 6 08:56:56 2002// +/unexamine/1.1/Thu Jun 6 08:56:56 2002// +/unnotify/1.1/Thu Jun 6 08:56:56 2002// +/unobserve/1.1/Thu Jun 6 08:56:56 2002// +/unpause/1.1/Thu Jun 6 08:56:56 2002// +/uptime/1.1/Thu Jun 6 08:56:56 2002// +/uscf_faq/1.1/Thu Jun 6 08:56:56 2002// +/wild/1.1/Thu Jun 6 08:56:56 2002// +/withdraw/1.1/Thu Jun 6 08:56:56 2002// +/znotify/1.1/Thu Jun 6 08:56:56 2002// +/abort/1.2/Fri Jun 21 14:46:28 2002// +/accept/1.2/Fri Jun 21 14:46:28 2002// +/addlist/1.2/Fri Jun 21 14:46:28 2002// +/adjourn/1.2/Fri Jun 21 14:46:28 2002// +/adjudication/1.2/Fri Jun 21 14:46:28 2002// +/alias/1.2/Fri Jun 21 14:46:28 2002// +/assess/1.2/Fri Jun 21 14:46:28 2002// +/bell/1.2/Fri Jun 21 14:46:28 2002// +/best/1.2/Fri Jun 21 14:46:28 2002// +/blitz/1.2/Fri Jun 21 14:46:28 2002// +/boards/1.2/Fri Jun 21 14:46:28 2002// +/busy/1.2/Fri Jun 21 14:46:28 2002// +/censor/1.2/Fri Jun 21 14:46:28 2002// +/computers/1.2/Fri Jun 21 14:46:28 2002// +/cshout/1.2/Fri Jun 21 14:46:28 2002// +/etiquette/1.2/Fri Jun 21 14:46:28 2002// +/examine/1.2/Fri Jun 21 14:46:28 2002// +/finger/1.2/Fri Jun 21 14:46:28 2002// +/flag/1.2/Fri Jun 21 14:46:28 2002// +/flip/1.2/Fri Jun 21 14:46:28 2002// +/formula/1.2/Fri Jun 21 14:46:28 2002// +/forward/1.2/Fri Jun 21 14:46:28 2002// +/games/1.2/Fri Jun 21 14:46:28 2002// +/gnotify/1.1/Fri Jun 21 07:02:42 2002// +/handles/1.2/Fri Jun 21 14:46:28 2002// +/hbest/1.2/Fri Jun 21 14:46:28 2002// +/highlight/1.2/Fri Jun 21 14:46:28 2002// +/history/1.2/Fri Jun 21 14:46:28 2002// +/interfaces/1.2/Fri Jun 21 14:46:28 2002// +/intro_basics/1.1/Fri Jun 21 07:02:42 2002// +/intro_general/1.2/Fri Jun 21 14:46:28 2002// +/intro_talking/1.2/Fri Jun 21 14:46:28 2002// +/intro_welcome/1.2/Fri Jun 21 14:46:28 2002// +/it/1.2/Fri Jun 21 14:46:28 2002// +/journal/1.1/Fri Jun 21 07:02:42 2002// +/jsave/1.1/Fri Jun 21 07:02:42 2002// +/kibitz/1.2/Fri Jun 21 14:46:28 2002// +/kiblevel/1.1/Fri Jun 21 07:02:42 2002// +/lightning/1.1/Fri Jun 21 07:02:42 2002// +/llogons/1.2/Fri Jun 21 14:46:28 2002// +/logons/1.2/Fri Jun 21 14:46:28 2002// +/match/1.2/Fri Jun 21 14:46:28 2002// +/messages/1.2/Fri Jun 21 14:46:28 2002// +/mexamine/1.2/Fri Jun 21 14:46:28 2002// +/noplay/1.1/Fri Jun 21 07:02:42 2002// +/notes/1.1/Fri Jun 21 07:02:42 2002// +/notify/1.2/Fri Jun 21 14:46:28 2002// +/observe/1.2/Fri Jun 21 14:46:28 2002// +/open/1.2/Fri Jun 21 14:46:28 2002// +/password/1.2/Fri Jun 21 14:46:28 2002// +/private/1.2/Fri Jun 21 14:46:28 2002// +/promote/1.2/Fri Jun 21 14:46:28 2002// +/quit/1.2/Fri Jun 21 14:46:28 2002// +/ratings/1.2/Fri Jun 21 14:46:28 2002// +/refresh/1.2/Fri Jun 21 14:46:28 2002// +/resign/1.2/Fri Jun 21 14:46:28 2002// +/revert/1.2/Fri Jun 21 14:46:28 2002// +/say/1.2/Fri Jun 21 14:46:28 2002// +/set/1.2/Fri Jun 21 14:46:28 2002// +/shout/1.2/Fri Jun 21 14:46:28 2002// +/smoves/1.2/Fri Jun 21 14:46:28 2002// +/sposition/1.2/Fri Jun 21 14:46:28 2002// +/standard/1.1/Fri Jun 21 07:02:42 2002// +/statistics/1.2/Fri Jun 21 14:46:28 2002// +/stored/1.2/Fri Jun 21 14:46:28 2002// +/style/1.2/Fri Jun 21 14:46:28 2002// +/tell/1.2/Fri Jun 21 14:46:28 2002// +/time/1.2/Fri Jun 21 14:46:28 2002// +/timeseal/1.2/Fri Jun 21 14:46:28 2002// +/untimed/1.1/Fri Jun 21 07:02:42 2002// +/variables/1.2/Fri Jun 21 14:46:28 2002// +/whisper/1.2/Fri Jun 21 14:46:28 2002// +/who/1.2/Fri Jun 21 14:46:28 2002// +/xtell/1.2/Fri Jun 21 14:46:28 2002// +/bname/1.1/Sun Jun 23 07:20:52 2002// +/bsetup/1.1/Sun Jun 23 07:20:52 2002// +/clrsquare/1.1/Sun Jun 23 07:20:52 2002// +/fmessage/1.1/Sun Jun 23 07:20:52 2002// +/getgi/1.1/Sun Jun 23 07:20:52 2002// +/getpi/1.1/Sun Jun 23 07:20:52 2002// +/iset/1.1/Sun Jun 23 07:20:52 2002// +/jkill/1.1/Sun Jun 23 07:20:52 2002// +/ltell/1.1/Sun Jun 23 06:44:01 2002// +/partner/1.1/Sun Jun 23 07:20:52 2002// +/play/1.1/Sun Jun 23 07:20:52 2002// +/prefresh/1.1/Sun Jun 23 07:20:52 2002// +/pstat/1.1/Sun Jun 23 07:20:52 2002// +/ptell/1.1/Sun Jun 23 07:20:52 2002// +/ptime/1.1/Sun Jun 23 07:20:52 2002// +/qtell/1.1/Sun Jun 23 07:20:52 2002// +/seek/1.1/Sun Jun 23 07:20:52 2002// +/sought/1.1/Sun Jun 23 07:20:52 2002// +/toggle/1.1/Sun Jun 23 07:20:52 2002// +/tomove/1.1/Sun Jun 23 07:20:52 2002// +/tournset/1.1/Sun Jun 23 07:20:52 2002// +/unseek/1.1/Sun Jun 23 07:20:52 2002// +/whenshut/1.1/Sun Jun 23 07:20:52 2002// +/wname/1.1/Sun Jun 23 07:20:52 2002// +/help/1.3/Thu Jul 22 07:04:37 2004// +/remote/1.1/Tue Jul 20 04:47:27 2004// +/rmatch/1.1/Mon Jul 1 04:11:55 2002// +D diff --git a/lasker-2.2.3/data/help/CVS/Repository b/lasker-2.2.3/data/help/CVS/Repository new file mode 100644 index 0000000..f0aeb53 --- /dev/null +++ b/lasker-2.2.3/data/help/CVS/Repository @@ -0,0 +1 @@ +lasker/data/help diff --git a/lasker-2.2.3/data/help/CVS/Root b/lasker-2.2.3/data/help/CVS/Root new file mode 100644 index 0000000..c42ba94 --- /dev/null +++ b/lasker-2.2.3/data/help/CVS/Root @@ -0,0 +1 @@ +/home/cvs diff --git a/lasker-2.2.3/data/help/_help b/lasker-2.2.3/data/help/_help new file mode 100755 index 0000000..0a0637f --- /dev/null +++ b/lasker-2.2.3/data/help/_help @@ -0,0 +1,18 @@ + +_help + +Type ... In Order To ... +------------------ -------------------------------------------------- +help chan_1 learn how to ask someone for help +help commands list all commands +help help learn how to read help files +help intro_general get basic information about the chess server +help intro_welcome get basic information about the introductory files +help register learn how to register on this server +index print a list of categories of help files +index all list all help files, by categories +info to list all informational (non-command) help files +quit exit the chess server and end your session +set shout off reduce the amount of information on your screen while + you read the various help files + diff --git a/lasker-2.2.3/data/help/abort b/lasker-2.2.3/data/help/abort new file mode 100755 index 0000000..679c70b --- /dev/null +++ b/lasker-2.2.3/data/help/abort @@ -0,0 +1,27 @@ + +abort + +Usage: abort + + The "abort" request is used in two situations during a chess game. + + (1) You wish to abort the game for some reason. "Abort" sends a request to +your opponent that your game be aborted. Your opponent can accept or decline +your offer. If a proposal to abort has been sent to you, then typing "abort" +(or "accept") will accept the offer. + + (2) Your opponent has run out of time and you believe that a problem has +occured with the connection to the chess server. Rather than "flag" your +opponent and claim a win on time, you can "abort" the game. (This function is +the old "courtesyabort" command just made easier to use.) If you are both out +of time, however, (a) the abort command will be sent as a request, but (b) you +can "flag" and the result will be a draw. + + An aborted game is canceled; no changes in ratings occur, the game is not +stored, and it is not listed in history or counted as a completed game in your +statistics. + +See Also: accept decline flag lag pending + +[Last modified: October 8, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/abuser b/lasker-2.2.3/data/help/abuser new file mode 100755 index 0000000..0c6edba --- /dev/null +++ b/lasker-2.2.3/data/help/abuser @@ -0,0 +1,22 @@ + +abuser + + The admins maintain a private list of individuals who have abused the chess +server by intentionally disconnecting in lost positions. If you suspect that +someone disconnected intentionally, please contact an admin. The admin will +review the situation. If you are unable to connect with your opponent in +order to resume your game, you may also want to seek an adjudication. + + If a user has too many stored games, the user may also be placed on the +abuser list until more of the adjourned games are completed or adjudicated. + + Being on the abuser list has these affects: (a) abusers may have match +requests automatically declined if the opponent has "!abuser" in the formula, +and (b) abusers who disconnect while playing a game forfeit the game +automatically. + +See Also: adjudication etiquette formula shout_abuse showlist stored +variables + +[Last modified: September 12, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/accept b/lasker-2.2.3/data/help/accept new file mode 100755 index 0000000..ca0eaff --- /dev/null +++ b/lasker-2.2.3/data/help/accept @@ -0,0 +1,17 @@ + +accept + +Usage: accept [1-n, all, abort, adjourn, draw, match, pause, player, simul, +switch, takeback] + + Accepts an offer that has been made to you. If no parameter is given and +there is only one offer, you accept it. If there is more than one offer +pending (for example, multiple match offers) you will shown a list of pening +offers and asked which one to accept. Then you must specify which offer to +accept. You can either choose the offer by number, or by type (such as draw, +adjourn, abort, or takeback). "All" accepts all pending offers. + +See Also: decline pending match draw adjourn abort takeback + +[Last modified: October 9, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/addlist b/lasker-2.2.3/data/help/addlist new file mode 100755 index 0000000..bbc4be8 --- /dev/null +++ b/lasker-2.2.3/data/help/addlist @@ -0,0 +1,16 @@ + +addlist + +Usage: addlist list information + + Adds information to the list in question. There are several kinds of lists +on the server. Some can only be modified by admins; others can be modified by +all users. "Sublist" command removes information from a list. + + The standard alias for "addlist" is "+". For example, "addlist notify +Stravinsky" could be typed as "+notify Stravinsky" instead. + +See Also: admins alias showlists sublist + +[Last modified: November 26, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/addresses b/lasker-2.2.3/data/help/addresses new file mode 100755 index 0000000..6ebd6fb --- /dev/null +++ b/lasker-2.2.3/data/help/addresses @@ -0,0 +1,39 @@ + +address + +The Internet Chess Servers are services that you can telnet to and use to play +chess with many other players around the world, both human and machine. + +The following is a list of the main servers using a version of FICS: + + A-FICS: ics.onenet.net 5000 (164.58.253.10 5000) Main US server + E-FICS: krypton.daimi.aau.dk 5000 (130.225.18.157 5000) Main EURO server + D-FICS: dds.hacktic.nl 5000 (193.78.33.69 5000) Dutch server + B-FICS: holly.csv.warwick.ac.uk 5000 (137.205.192.12 5000) British server + ?-FICS: chess.unix-ag.uni-kl.de 5000 (131.246.89.3 5000) German server + M-FICS: wisdom.weizmann.ac.il 5000 (132.76.80.77 5000) Mid-east server + +Alternative sites: + + chess.pitt.edu 5000 (136.142.81.40 5000) USA, Pittsburg PA + rogue.coe.ohio-state.edu 5000 (128.146.144.12 5000) USA, Columbus, OH + getnet.com 4000 (204.157.9.29 4000) USA, Phoenix, AZ + +Internet Chess Club (commercial chess server): + + chess.lm.com 5000 (192.231.221.16 5000) USA, Pittsburgh, PA + +WWW-servers: + + URL: http://chess.onenet.net/chess/ + +FTP-servers: + + chess.onenet.net (164.58.253.10) + ftp.math.uni-hamburg.de (134.100.220.2) + ftp.daimi.aau.dk [for timeseal files for use on Euro FICS] + +To connect to a chess server use: "telnet
5000" +To connect to an ftp server use: "ftp " (Login: ftp, Passwd: +\ ) + diff --git a/lasker-2.2.3/data/help/adjourn b/lasker-2.2.3/data/help/adjourn new file mode 100755 index 0000000..415d3af --- /dev/null +++ b/lasker-2.2.3/data/help/adjourn @@ -0,0 +1,23 @@ + +adjourn + +Usage: adjourn + + Sends a request to your opponent that a game be discontinued and saved for +later play. If a proposal to adjourn is pending for you, then typing adjourn +(or accept) will accept the offer. If your opponent is out of time, the +adjourn request is accepted automatically (a courtesy adjournment). + + Games that are adjourned can be resumed later by using the match command +when your opponent is logged on. They can be resigned even when your opponent +is not logged on. They can also be adjudicated by an admin (see +"adjudication" help file). For more information on these options, see the +"adjournments" help file. Use "stored" to view the list of your adjourned +games. If you log on and a user with whom you have an adjourned game is also +on, you will be notified automatically that he/she is logged on. + +See Also: accept adjudication adjournments decline match pending resign +stored + +[Last modified: December 17, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/adjournments b/lasker-2.2.3/data/help/adjournments new file mode 100755 index 0000000..bf6ea96 --- /dev/null +++ b/lasker-2.2.3/data/help/adjournments @@ -0,0 +1,45 @@ + +adjournments + + Adjourned games are stored by the server until one of three things occurs: +(a) the game is later resumed and completed, (b) one player resigns, or (c) +the game is adjudicated. Adjourned games can also be examined for purposes of +analysis. Typed "stored" to view the list of your adjourned games. Games are +adjourned either by agreement of both players or if a player disconnects +suddenly; games are not adjourned if the server crashes, however. + + +RESUMING AN ADJOURNED GAME + + Your game can be resumed when your opponent is logged on to the server. +Type "match opponent_name" to request that you and your opponent continue your +game. Your opponent can either accept or decline this request. + + +RESIGNING AN ADJOURNED GAME + + Your game can be resigned even when your opponent is not logged on. Type +"resign opponent_name" to do this. Your opponent will be notified of your +decision. + + +ADJUDICATION OF AN ADJOURNED GAME + + If you have difficulty resuming your game with your opponent after repeated +attempts, you can have your game adjudicated by an admin. The "adjudication" +help file outlines the procedure to follow for requesting an adjudication. + + +EXAMINING AN ADJOURNED GAME + + You can examine an adjourned game using the "examine" command. You will be +able to analyze possible continuations of the game. For the most part, this +analysis has the same restrictions as adjournments for over-the-board chess +games: consultation is permitted. However, when your game resumes, you must +play without consultation or notes of any kind. + + +See Also: adjourn adjudication examine match resign stored + +[Last modified: July 20, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/adjud_info b/lasker-2.2.3/data/help/adjud_info new file mode 100755 index 0000000..6470009 --- /dev/null +++ b/lasker-2.2.3/data/help/adjud_info @@ -0,0 +1,28 @@ + +adjud_info + +RESTRICTED TO ADMINISTRATORS. + + Games should be adjudicated as a win for a player only if the game is an +obvious (theoretical) win. For example, (a) K+R vs. K, or (b) up a queen in +the middlegame. You may also grant a win due to time IF (1) the player +requests a win on this basis and (2) the conditions (namely clocking settings) +warrant it. + + If the player seeks a draw, then the game should be dead equal in the +endgame. + + Abort adjudications are appropriate if the game has lasted only a few moves +and neither player can speak of an advantage: i.e., 1. d4 d5, 2. c4 c6, 3. Nf3 +could be aborted. Games should *not* be aborted if one side has an advantage. +For example, 1. d4 d5, 2. c4 e6, 3. c5 should *not* be adjudicated as an +abort, especially if white wants the abort. + + To list games for which adjudications have been requested, type "ahelp +adjrequests". + +See ahelp: adjudicate +See help: adjudication + +[Last modified: July 1, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/adjudication b/lasker-2.2.3/data/help/adjudication new file mode 100755 index 0000000..5fcc33f --- /dev/null +++ b/lasker-2.2.3/data/help/adjudication @@ -0,0 +1,46 @@ + +adjudication + + Whenever possible, please finish games that have been adjourned. You should +attempt to complete the game by messaging your opponents, trying to find times +to complete the games, and giving them ample opportunity to do so. Users are +on different time schedules, so patience should be practiced. + + If -- after repeated attempts -- an opponent will not resume his/her game +with you, you may request an adjudication. You can ask for a game to be +adjudicated as a win, a draw or to be aborted (you do not need an adjudication +in order to resign a game; see the "resign" help file). Adjudications are +made by admins who are skilled at chess. The admin will look at the position +and decide on a result. Please note that the admin's decision is final. If a +genuine mistake has been made, the adjudicator would probably like feedback, +although at that stage nothing may change the result and the changes in +ratings that may have occurred. Adjudications take time and effort, +especially on a server with many users, so only ask for an adjudication when +you absolutely need one. + + To request an adjucation, "message adjudicate ", that is, send a +message to the special Adjudicate account ("Adjudicate" is not the handle of a +user). In your message for adjudication you should gove the name of your +opponent and what you think the result should be -- win, draw or abort. For +example: + + message adjudicate l want my game with DAV to be a draw; neither of us + can make progress or gain an advantage. + +If you have a certain line of play you will follow in order to preserve the +win or draw, please mention it. + + An admin will check the account regularly and decide the game. You and your +opponent will be messaged concerning the result. + + +REMINDERS: + +(a) The command "stored" gives a list of your stored (adjourned) games. + +(b) "Match [opponent]" is used to continue resumed games. + +See also: abuser adjournments match stored + +[Last modified: October 17, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/adm-info b/lasker-2.2.3/data/help/adm-info new file mode 100755 index 0000000..7e40dbc --- /dev/null +++ b/lasker-2.2.3/data/help/adm-info @@ -0,0 +1,21 @@ + +Information about FICS administrators + + FICS is coordinated by several administrators ("admins") who ensure that +FICS is working properly and deal with problem situations and cases of abuse +(see etiquette). Certain commands that regulate FICS can only be used by +admins. + + The group of admins is small in order to keep things fair and uniform. For +the moment, FICS has a sufficient number of admins for its needs, so new +admins are not being added. + + If you have a question, problem situation or concern as a FICS user, feel +free to contact an admin. They are designated by (*) on "who" lists. To see +a list of current admins, type "=admin". + + Admins tend to listen to FICS channel 1. To contact several admins at once, +you can "tell" to channel 1. + +See Also: admins etiquette intro0 channel tell who + diff --git a/lasker-2.2.3/data/help/adm-new b/lasker-2.2.3/data/help/adm-new new file mode 100755 index 0000000..c6e726d --- /dev/null +++ b/lasker-2.2.3/data/help/adm-new @@ -0,0 +1,24 @@ + +adm-new + +About becoming an FICS administrator + + Thank you for asking about how someone becomes an FICS administrator +("admin"). As the "adm-info" help file notes, the number of FICS admins is +kept small for several reasons. At the moment, we are not accepting +applications from anyone to be an admin. If additional admins are needed, we +will contact you. + + In the meantime, the best way for you to help with FICS needs is to monitor +messages on the various FICS channels and help users who have questions, let +us know about bugs you find (message to "bug"), and make suggestions about +improvements you would like to see implemented (message to "suggestion" or to +"helpfiles"). If you have code you'd like to contribute, contact one of the +programming admins (see "admins" help file for a listing). Typing "=admin" +lists the current admins. Typing "in 0" will give a list of admins currently +logged on. + +See Also: admins adm-info + +[Last modified: June 11, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/adm_info b/lasker-2.2.3/data/help/adm_info new file mode 100755 index 0000000..954d604 --- /dev/null +++ b/lasker-2.2.3/data/help/adm_info @@ -0,0 +1,31 @@ + +adm_info + +Information about server administrators (admins) + + This chess server is coordinated by several administrators ("admins") who +ensure that the server is working properly and deal with problem situations +and cases of abuse (see etiquette and abuser). Certain commands that regulate +the server can only be used by admins. + + The group of admins is small in order to keep things fair and uniform. +For the moment, the server has a sufficient number of admins for its needs, so +new admins are not being added (see adm_new). + + If you have a question, problem situation or concern as a user of this +server, feel free to contact an admin. For the most part, they are designated +by (*) on "who" lists. They are also on channel 0 (the admin channel). Type +"in 0" to see which admins are logged on. To see a current list of all +admins, type "=admin". The "admins" help file indicates the role each admin +plays on the server. + + Admins tend to listen to channel 1. To contact several admins at once, you +can "tell" to channel 1. You can also "message" an admin, especially if you +need to relay detailed information. Special accounts have been set aside for +feedback from users; these are listed in the "admins" help file. + +See Also: abuser adm_new admins channel etiquette inchannel +intro_welcome message tell who + +[Last modified: September 9, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/adm_new b/lasker-2.2.3/data/help/adm_new new file mode 100755 index 0000000..03bf04a --- /dev/null +++ b/lasker-2.2.3/data/help/adm_new @@ -0,0 +1,24 @@ + +adm_new + +About becoming an FICS administrator + + Thank you for asking about how someone becomes an FICS administrator +("admin"). As the "adm_info" help file notes, the number of FICS admins is +kept small for several reasons. At the moment, we are not accepting +applications from anyone to be an admin. If additional admins are needed, we +will contact you. + + In the meantime, the best way for you to help with FICS needs is to monitor +messages on the various FICS channels and help users who have questions, let +us know about bugs you find (message to "bug"), and make suggestions about +improvements you would like to see implemented (message to "suggestion" or to +"helpfiles"). If you have code you'd like to contribute, contact one of the +programming admins (see "admins" help file for a listing). Typing "=admin" +lists the current admins. Typing "in 0" will give a list of admins currently +logged on. + +See Also: admins adm_info + +[Last modified: September 9, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/admins b/lasker-2.2.3/data/help/admins new file mode 100755 index 0000000..1ac50a9 --- /dev/null +++ b/lasker-2.2.3/data/help/admins @@ -0,0 +1,35 @@ + +admins + + Admins on this server have various functions. Many are here solely for +programming reasons; when they are logged on, they are often busy and working +with the server code. Other admins are here for general assistance to users. +There are also special accounts that make it easy for users to give the admins +feedback, suggestions and special requests. Here is a breakdown.... + +Programming admins: cranium Cthulhu DAV foxbat Grimm Hawk hersco + loon Mann Shane Sparky + +General admins: Clovis equiLibre Friar Len McKeork schert + Solid sveshi Sparky Thanatos TheDane + +Special admin accounts: adjudicate Bug filter helpfiles Suggestion + + +Note: Admins have been chosen based on some simple but important criteria. + Programmer admins obviously are chosen for ability and willingness + to volunteer much time and energy toward the GNU-ICS project. In + general, however, a good working knowledge of the game itself along + with some practicle tournamant experience is quite valuable. Even + more valuable is Tournamant directorship experience either on the club + or national level. Also of great value is a knowledge of different + computers and operating systems and the ability to help new players + with setting up interfaces and getting started toward their first + game. :-) + + Sparky + +[Minor edits: September 19, 1995 -- Friar] + +See Also: adjudication adm_info adm_new + diff --git a/lasker-2.2.3/data/help/alias b/lasker-2.2.3/data/help/alias new file mode 100755 index 0000000..b10fc0c --- /dev/null +++ b/lasker-2.2.3/data/help/alias @@ -0,0 +1,107 @@ + +alias + +Usage: alias [word [string]] + + Sets up a command alias so that "word" is equivalent to typing "string". If +"string" is omitted then the current value of "word" is displayed. If both +parameters are omitted, then all of your aliases are displayed. + + "alias" -- lists all of your aliases + "alias word" -- gives your alias for "word" + "alias word string" -- creates/updates an alias for you so that typing + "word" is equivalent to typing "string" + + Use the "unalias" command to remove an alias. + + +EXAMPLES + + Here are some sample aliases that may be useful to you. They are listed +here in order to give you some idea of what is possible. Get ideas from other +users as well. + + fun say Fun game! + gg say Good game! + gm say Good move! + idle set busy is busy. Please 'message' to contact him. + mb match @ 5 12 + mood1 set formula f2 & f4 + ms match @ 10 10 + ps who as + pw who aw + ty say Thank you for the game. + w4 match @ 10 10 0 0 wild 4 + wave it waves to @ + + +SYSTEM ALIASES + + There are many system aliases that everyone has by default; you do not need +to set them up, they are already there. Here is the list: + + a accept . tell . + bye quit , tell , + cls help cls ! shout + exit quit : it + f finger ? help + go goboard * kibitz + goto goboard + addlist + hi history - sublist + logout quit # whisper + m match + more next + p who a + players who a + re refresh + saa simallabort + sab simabort + sadj simadjourn + saadj simalladjourn + sh shout + sn simnext + sp simprev + t tell + v variables + vars variables + w who + znotl znotify + + Other system aliases are added from time to time. The help files for the +different commands will have the most updated information. + +WARNING: + + Becareful to avoid using an alias that can also stand for another command on +the server. For example, "fg" could be a chess move (for f-pawn X g-pawn), so +don't have "fg" be an alias. For similar reasons, don't use "t" as an alias +since it is already assigned as an alias for "tell". For example, avoid using +"hi" to mean not "history" but something else, like "tell @ Hello there. How +are you?" If you later "unalias" your "hi" alias, the "hi" system alias for +"history" may not come back automatically. + +SPECIAL NOTES: + + (1) Aliases can use the "@" wildcard symbol and thus save you a lot of +typing for routine statements or requests. For example, using the "mb" alias, +you would type "mb Shane" and have the same request sent as if you had typed +"match Shane 5 12". + + (2) Aliases are not transitive. This sequence of commands ... + + alias foo bar + alias bar baz + +... will NOT result in "foo" being equivalent to "baz". + + (3) Because of #3, use the full spelling of a command, not an abbreviation, +when creating an alias. This procedure also ensures that the alias will work +properly. + + (4) You may not create an alias for the quit command. + + +See Also: unalias [and the various commands themselves, of course] + +[Last modified: December 17, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/allobservers b/lasker-2.2.3/data/help/allobservers new file mode 100755 index 0000000..469ac3e --- /dev/null +++ b/lasker-2.2.3/data/help/allobservers @@ -0,0 +1,24 @@ + +allobservers + +Usage: allobservers [game,user] + + If a game is specified then all users observing or examining that game are +displayed. However, if there are no observers for that game, nothing will be +displayed. + + If no game is specified, then all users observing or examining games in +progress are displayed. However, if there are no observers or examining for +ANY game, nothing will be displayed. + + The display will have this format: Game #, Players, Observers. For example: + + Observing 18 [DAV vs. friar]: Thumper, Charity, Shane + Examining 29 (scratch): #Friar, loon + +For examined games, there are examiners (people changing the position, noted +by #) and observers. + +See Also: examine observe + +[Last modified: June 29, 1995 -- Friar] diff --git a/lasker-2.2.3/data/help/analysis b/lasker-2.2.3/data/help/analysis new file mode 100755 index 0000000..df8ea55 --- /dev/null +++ b/lasker-2.2.3/data/help/analysis @@ -0,0 +1,6 @@ + +ChessT is a well-experienced annotator using top chess programs and self- +written software (stressing on the human-side). He is willing to perform +thorough analysis on openings, middle-games, endgames & combinations. User's +games & details can be sent to: danymozs@NetVision.net.il Or send as a +MESSAGE to ChessT. Analysis given on the spot when ChessT is here. diff --git a/lasker-2.2.3/data/help/assess b/lasker-2.2.3/data/help/assess new file mode 100755 index 0000000..924d981 --- /dev/null +++ b/lasker-2.2.3/data/help/assess @@ -0,0 +1,16 @@ + +assess + +Usage: assess [user1 [user2]] + + Displays how ratings will be affected by the possible outcomes of a chess +match between two users. If both parameters are omitted ("assess") and you +are playing a game, then the command will display the possible ratings changes +from your game with your current opponent (if you are not playing a game, you +will be told that). If only user1 is given ("assess user1"), then the command +will display the possible ratings changes from a game you would have with +user1. If both parameters are given ("assess user1 user2"), then the command +will display possible ratings results of a game between user1 and user2. + +[Last modified: October 8, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/backward b/lasker-2.2.3/data/help/backward new file mode 100755 index 0000000..bcccd55 --- /dev/null +++ b/lasker-2.2.3/data/help/backward @@ -0,0 +1,18 @@ + +backward + +Usage: backward [#] + + This command is used by a person examining a game in order to move backward +in the sequence of the game's moves. If # is not specified, 1 will be used. + + In the case of a stored game, you may move forward again using the "forward" +command, but in the case of a new game you will need to move the pieces again. + +SPECIAL NOTE: The "revert" command is a way to move backward to the branch +from the main variation being examined. + +See Also: examine forward revert + +[Last modified: June 29, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/bell b/lasker-2.2.3/data/help/bell new file mode 100755 index 0000000..bb09fa7 --- /dev/null +++ b/lasker-2.2.3/data/help/bell @@ -0,0 +1,12 @@ + +bell + +Usage: bell + + Toggles your 'bell' variable. Equivalent to "set bell". Having bell on +affects beeps you may receive from the server or your interface. + +See Also: variables + +[Last modified: October 8, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/best b/lasker-2.2.3/data/help/best new file mode 100755 index 0000000..707caea --- /dev/null +++ b/lasker-2.2.3/data/help/best @@ -0,0 +1,20 @@ + +best + +Usage: best [b|s|w] + + Displays the 20 highest-rated players in the three different ratings +categories: Blitz, Standard and Wild. Computers are in the listing. Use +"hbest" to see the top 20 humans. + + Using "best" alone will give all three lists. Using one or more of the +arguments b, s or w is a request to give only the blitz, standard and/or wild +best lists, respectively. For example, "best bw" will show the top 20 players +in blitz and wild chess; the top standard players will not be listed. + + Use "rank" and "hrank" in order to see where a given player is ranked. + +See Also: hbest hrank rank + +[Last modified: October 8, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/blitz b/lasker-2.2.3/data/help/blitz new file mode 100755 index 0000000..6fb9efc --- /dev/null +++ b/lasker-2.2.3/data/help/blitz @@ -0,0 +1,57 @@ + +blitz + + There are four types of regular (not wild or bughouse) chess played on this +chess server: Untimed, Lightning, Blitz and Standard. + + A game is "Blitz" if the expected duration of the game is between 3 and 15 +minutes per player. "Expected duration" is determined by a formula that takes +into account both the Start time and the Increment (Inc) value. Here is the +formula: + + Expected duration = (Start + Inc*2/3) + +Thus, a Blitz game is one that is expected to last between 3 and 15 minutes +for each player (or from 10 to 30 minutes combined). Lightning games are +those with expected durations less than 3 minutes per player, while Standard +games are those with expected durations more than 15 minutes per player. + + The following table shows the dividing lines between Blitz and Lightning on +the one hand and Blitz and Standard on the other hand. those two types of +matches. [Thanks to schwartzeer for the original calculations between Blitz +and Standard. :) ] + + Slowest Lightning Fastest Blitz Slowest Blitz Fastest Standard + ------------------------------------ ------------------------------------ + Mins Incr Mins Incr Mins Incr Mins Incr + ------------------------------------ ------------------------------------ + 0 4 0 5 0 22 0 23 + 1 2 1 3 1 20 1 21 + 2 1 2 2 2 19 2 20 + -------- 3 0 3 17 3 18 + 4 16 4 17 + 5 14 5 15 + 6 13 6 14 + 7 11 7 12 + 8 10 8 11 + 9 8 9 9 + 10 7 10 8 + 11 5 11 6 + 12 4 12 5 + 13 2 13 3 + 14 1 14 2 + -------- 15 0 + + For example, a game with a Start of 2 minutes will be Blitz if the Increment +is from 2 to 19; but it will be Lightning with an Inc of 0 or 1 and Standard +if the Inc is 20 or higher. + + You can list logged on users according to their Blitz ratings by typing "who +b" (by default, ratings in 'who' listings will be blitz unless you specifiy +otherwise). "Blitz" is also a variable that can be used in formulas in order +to screen match requests. + +See Also: formula lightning match standard untimed who + +[Last modified: December 25, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/bname b/lasker-2.2.3/data/help/bname new file mode 100644 index 0000000..6e023b4 --- /dev/null +++ b/lasker-2.2.3/data/help/bname @@ -0,0 +1,8 @@ + +bname + +Usage: bname + +This command sets the black players name shown in the current game you +are playing or examining. + diff --git a/lasker-2.2.3/data/help/boards b/lasker-2.2.3/data/help/boards new file mode 100755 index 0000000..a44a2c2 --- /dev/null +++ b/lasker-2.2.3/data/help/boards @@ -0,0 +1,40 @@ + +boards + +Usage: boards [category] + + If category is given then this lists all available boards for that +category. If the parameter is omitted, then this lists all available +categories. The current board categories are: + + standard + openings + wild + chessercizes + test + material-odds + misc + + In order to find out what is loaded for one of these categories, type +"boards ". For example, "boards openings" will list the various +openings you can start a game from. + + In order to start a game from one of these positions, you need to use all of +the arguments in the match command and also include the board category and the +specific board you want. For example: + + match red 2 12 0 0 openings ruy-lopez + +would request a blitz match with user "red" starting with the "ruy-lopez" +opening position. + + +SPECIAL NOTE + + At the moment, you cannot access these boards through the examine feature, +only match. + +See Also: match wild + +[Last modified: September 22, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/bsetup b/lasker-2.2.3/data/help/bsetup new file mode 100644 index 0000000..5f75020 --- /dev/null +++ b/lasker-2.2.3/data/help/bsetup @@ -0,0 +1,174 @@ + +bsetup + +Usage: bsetup [argument] + +Summary: Bsetup mode is a special form of the "examine" mode that allows you +to set up any position you want and then use examine mode to analyze it. The +standard alias for "bsetup" is "setup". + +ENTERING BSETUP MODE +------------------- + + There are two ways to enter bsetup mode: from scratch and from "examine" +mode. The difference in the two procedures concerns the start position of the +board in bsetup mode: empty board versus a board position. + + (a) FROM SCRATCH -- When nothing else is active (that is, you are not +playing or examining another game), type either "bsetup" or "examine setup". +The board will be totally empty when you enter bsetup mode; you will have to +place all of the pieces where you want to have them. + + (b) FROM WITHIN EXAMINE MODE -- Typing "bsetup" during examine mode (namely +while you are examining a game) places you in "examine bsetup" mode. The move +list is cleared and a new move list will be established. However, the current +board position will be used as the starting board position; you can then +modify that position and arrange the pieces to be where you want them to be. + +USING BSETUP MODE +---------------- + + There are several commands you can use in order to create a board position +and designate which side is going to move next. + + BSETUP CLEAR -- Typing the command "bsetup clear" will give you a new, +blank, empty board. + + BSETUP START -- Typing the command "bsetup start" will give you the regular +starting position for a game of chess. + + BSETUP board_category board -- You can load a non-standard board position if +you want. The chess server has several non-standard boards. They can be +listed by using the "board" command. For example, "boards openings" will list +the various openings you can start a game from and "boards wild" will list +"wild" opening positions. Note: you must first be in bsetup mode in order to +create a given board position. + To create a suicide game, type "bsetup suicide". + + BESETUP FEN position -- You can also set up complete board positions by +supplying a FEN position. For example: + + bsetup fen rnbqkbnr/pppppppp/8/8/8/3P4/PPP1PPPP/RNBQKBNR + +You have to indicate the pieces and blank squares on each rank of the chess +board, starting with rank 8 (Black's back rank) and going from the a-file to +the h-file. The '/' mark divides one rank of pieces from another. Letters in +CAPS mean a White piece (such as 'K' for White King); small letters mean a +Black piece (such as 'k' for Black King). The numbers (such as 1, 3, 4 and 8) +refer to the number of *consecutive* blank squares. For example, the fen +position given above is the one that occurs when White opens the game with +Pd3. NOTE: You just give the board position, not which side is to move; +use "tomove" to modify whose move it is. + + Placing pieces -- There are two formats for placing pieces: case sensitive +and designate color. Either one works. Here is a table of the formats. For +the "square" portion, enter a square in algebraic notation, such as e4 or h5. +You can use either "@" or "*" as the special symbol. + + CASE SENSITIVE DESIGNATE COLOR + + Piece White Black White Black + ----- -------- -------- --------- --------- + king K@square k@square wk@square bk@square + queen Q@square q@square wq@square bq@square + rook R@square r@square wr@square br@square + bishop B@square b@square wb@square bb@square + knight N@square n@square wn@square bn@square + pawn P@square p@square wp@square bp@square + + Clearing a square -- There are two ways you can clear a square and make it +empty: either place an 'x' (meaning empty piece) or "clear" the square. + + x@square + clrsquare square + bsetup clearsquare square + +For example, "x@e4", "clrsquare e4" and "bsetup clearsquare e4" would all have +the same effect: making e4 an open square. NOTE: you do not have to clear a +square before placing a piece. For example, if there is a Black Queen on e5, +placing a Black Pawn on e5 will automatically remove the Black Queen. + + BSETUP TOMOVE white|black -- Typing "bsetup tomove white" will have White be +the player to move next. Typing "bsetup tomove black" will have Black be the +player to move next. NOTE: You do not need to include the "bsetup" part of +the command; the "tomove" command works alone once you are in bsetup mode. + + BSETUP wcastle |bcastle -- You may also set the castling +rights for the game. Use "bsetup wcastle " and "bsetup bcastle +" to set the castling rights for White and Black respectively. The +possible 'rights' are: + + none (no castling) + kside (kingside only) + qside (queenside only) + both (both sides) + +When you load a board using bsetup the rights are set up automatically. On a +cleared board both player's rights are set to 'none'. Therefore if you use a +ready made board and move the rooks and kings around, you will need to set the +appropriate castling rights. Castling rights are validated when you exit +bsetup; if the rights are invalid, you will receive an error message. + + BSETUP EPPOS -- You can indicate whether an "en passant" capture is +possible, as if a pawn had just been advanced two squares. In this case, you +need to specify the file of the pawn (a - h). For example, "bsetup eppos c" +would mean that a pawn on the c-file has just been moved from c7-c5 or from +c2-c4, depending on the "tomove" setting. NOTE: You need to have a pawn on +the right square and have the correct player "tomove" in order for the eppos +command to work; otherwise, you will get an error message. + + RULES -- Lastly! You can also change the rules for the chess game. There +are different rules for suicide chess, of course ("help suicide_chess"); but +there are also different castling rules for Fischer Random chess ("help fr") +and for certain kinds of wild chess ("help wild"). In order to use the +correct rules, you need to use bsetup to change them. + + bsetup fischer [for Fischer Random chess] + bsetup standard [for normal chess -- this is the default] + bsetup suicide [for suicide chess] + bsetup wild [for wild chess] + + +EXITING BSETUP MODE +------------------ + + BSETUP DONE -- Typing "bsetup done" will exit bsetup mode and start examine +mode. However, the position will be validated first. For example, the player +who is not about to move cannot be in check, pawns cannot be on the 1st or 8th +ranks, each side must have a king, neither side can have more than one king. + + If the position is valid, you will enter examine mode next. If the position +is invalid, a message will be sent to you and you will remain in bsetup mode. + + UNEXAMINE -- Typing "unexamine" at any point will immediate cancel both +bsetup and examine modes. + + +SPECIAL NOTES: + +(a) Games in bsetup mode will be listed in the "games" display. + +(b) Users in bsetup mode will have comments to that effect in their finger +displays and will have the symbol "#" next to their handles in "who" displays. +"Tells" to users in bsetup mode will give the feedback that the user is in +bsetup mode. + +(c) You cannot create a position and then play a match with an opponent. +However, you can examine a game with another user, use "mexamine" to allow the +other user to move the pieces, and you can alternate moves back and forth as +if you were playing a game. You will be in examine mode the whole time, of +course, and the game will not appear in "history" displays. + +(d) At present, you cannot use "jsave" in order to save an examined or bsetup +game to your "journal". This capability is being developed. + +(e) A standard alias for "bsetup" is "setup". + +(f) You can change the names of the players of the game by using the "wname" +and "bname" commands. + +See also: alias bname board clrsquare examine finger fr games handle +history journal jsave mexamine suicide_chess tell unexamine who wild +wname + +[Last modified -- October 30, 1997 -- Friar] diff --git a/lasker-2.2.3/data/help/busy b/lasker-2.2.3/data/help/busy new file mode 100755 index 0000000..7f5ecd5 --- /dev/null +++ b/lasker-2.2.3/data/help/busy @@ -0,0 +1,27 @@ + +busy + +Usage: set busy string + + Sets your "busy" string. When your busy string is set and people "tell" +something to you, they will get your busy string as a response. Your busy +string (if on) will also be displayed right below your name when someone +"fingers" you. NOTE: Your busy string can be no longer that 45 characters. + +Examples of busy strings you might use are: + set busy is really busy right now. + set busy will be back in 5 minutes. + set busy will be idle for a while... + + Typing any command cancels your "busy" status; you don't have to clear it +yourself. + + It is useful to use an alias for your busy string, if you intend to use it +frequently. For example: + alias idle set busy is away from the keyboard right now +would set your busy string to "is away from the keyboard right now". + +See also: alias finger set tell + +[Last modified: October 22, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/censor b/lasker-2.2.3/data/help/censor new file mode 100755 index 0000000..af758b0 --- /dev/null +++ b/lasker-2.2.3/data/help/censor @@ -0,0 +1,21 @@ + +censor + +Usage: +|-|= censor [user] + + When a player is on your censor list, you will not hear anything from +him/her when he/she tells, shouts, matches, kibitzes, whispers and says. When +users on your censor list send you a direct message using "tell", they will be +notified of their being on your censor list. Here are the variations of the +command possible: + + +censor user Add "user" to censor list + -censor user Remove "user" from censor list + =censor Display your censor list + + Note that "noplay" only filters match requests, not other communications. + +See Also: addlist kibitz noplay say shout tell whisper + +[Last modified: December 17, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/chan_1 b/lasker-2.2.3/data/help/chan_1 new file mode 100755 index 0000000..8f23905 --- /dev/null +++ b/lasker-2.2.3/data/help/chan_1 @@ -0,0 +1,35 @@ + +chan_1 + + Channel 1 is the server help channel. Admins and other helpful, +knowledgeable users monitor channel 1 and are ready to assist you. It is also +a general server discussion channel about server issues. + + If you need assistance about something but don't know whom to contact, ask +your question on channel 1. Here's the procedure: + +(1) Type the following lines: + + channel 1 [this will turn channel 1 on for you] + tell 1 Can someone help me? [this sends the message to channel 1] + +(2) Watch your screen for someone asking you what help you need. You may be +contacted directly (in a personal tell) or through channel 1 itself (so +everyone can listen to to the discussion and help out). + +(3) If you want to continue talking on channel 1, type: + + tell 1 [everyone on channel 1 will hear you] + +(4) When you are done, you can either stay on channel 1, in order to help +others and/or learn from their questions, or turn off channel 1 by typing: + + channel 1 [this will set channel 1 to off for you] + +To see who is listening to channel 1 at any given moment, type "inch 1". A +list will appear. + +See Also: adm-info channel inchannel intro_talking tell + +[Last modified: July 18, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/channel b/lasker-2.2.3/data/help/channel new file mode 100755 index 0000000..df0f205 --- /dev/null +++ b/lasker-2.2.3/data/help/channel @@ -0,0 +1,52 @@ + +channel + +Usage: channel [0-99] + + Turns the specified channel on and off. If the channel is on, messages sent +to that channel will appear on your screen. If the channel number is omitted, +all channels to which you are tuned will be turned off. + + Channel 1 is the general help channel, and of special importance to users. +The "chan_1" has more details about its use, and gives the general procedure +for using a channel. + +See Also: chan_1 inchannel say tell + +------------------------------------------------------------------------- +List of currently defined channels: + + 0 Admins Only 2 Chess server discussion + 1 General Help 3 FICS Programmers' Channel + + 8 Youth Channel 18 The Gambit Channel + 20 Forming Team games 21,22 Playing team games + 23 Forming SIMULS 46 Forming tournaments (Tomato) + 47 Tomato managers + + 32 Movies 35 Music + 33 Quacking & Other Duck Topics 36 Mathematics & Physics + 34 Sports 37 Philosophy + + 50 General Unlimited Gab 51 The Hormone Channel + + 60 Chess Theory 64 Computer Chess + 65 World Chess Championship + + 69 Latin 75 Russian + 70 Danish 76 Dutch + 71 Scandinavian 77 French + 72 German 78 Greek + 73 Spanish 79 Icelandic + 74 Italian 80 Chinese + + 84 Macintosh Channel + + 90 The STC BUNCH (Players who like 30- to 120-minute Time Controls.) + 97 Politics Channel + 98 Zippy the Pinhead's Own Channel + 99 `The Street Corner Where Nothing Happens' +------------------------------------------------------------------------- + +[Last modified: September 12, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/clearmessages b/lasker-2.2.3/data/help/clearmessages new file mode 100755 index 0000000..7752756 --- /dev/null +++ b/lasker-2.2.3/data/help/clearmessages @@ -0,0 +1,13 @@ + +clearmessages + +Usage: clearmessages [user] + + Clears any message(s) previously messaged to you. If 'user' is omitted, all +messages will be cleared. If 'user' is included, only the messages from that +user to you will be cleared. + +See Also: messages + +[Last modified: June 16, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/clrsquare b/lasker-2.2.3/data/help/clrsquare new file mode 100644 index 0000000..6e66842 --- /dev/null +++ b/lasker-2.2.3/data/help/clrsquare @@ -0,0 +1,13 @@ + +clrsquare + +Usage: clrsquare square + + This command is used in "bsetup" mode in order to make a square empty +(blank). For example, "clrsquare e4" would make square e4 empty. Another way +to clear a square is by typing "x@square", for example "x@e4". + +See Also: bsetup + +[Last modified: February 3, 1996 -- Friar] + diff --git a/lasker-2.2.3/data/help/cls b/lasker-2.2.3/data/help/cls new file mode 100755 index 0000000..2ff59e6 --- /dev/null +++ b/lasker-2.2.3/data/help/cls @@ -0,0 +1 @@ + diff --git a/lasker-2.2.3/data/help/cls_info b/lasker-2.2.3/data/help/cls_info new file mode 100755 index 0000000..10ae4a5 --- /dev/null +++ b/lasker-2.2.3/data/help/cls_info @@ -0,0 +1,11 @@ + +cls_info + + Typing "help cls" will clear your screen and set the cursor at the top. +This command may be useful if you need to clear your screen suddenly for some +reason (like the boss). Server messages will soon appear again, however. + +See Also: + +[Last modified: July 11, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/computers b/lasker-2.2.3/data/help/computers new file mode 100755 index 0000000..39c5802 --- /dev/null +++ b/lasker-2.2.3/data/help/computers @@ -0,0 +1,15 @@ + +computers + + Computers may register and play chess matches. However, computers are +required to be registered so that users can know whether they are playing +against humans or computers. (Using an unregistered computer is considered to +be abusive behavior; see etiquette). In order to register a computer, +contact an admin or use the correct format in the email registration +procedure. To see a list of computers registered on the server, type +"=computer". Computers are designated on "who" lists by (C). + +See Also: admin etiquette register who + +[Last modified: November 26, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/courtesyabort b/lasker-2.2.3/data/help/courtesyabort new file mode 100755 index 0000000..42b4071 --- /dev/null +++ b/lasker-2.2.3/data/help/courtesyabort @@ -0,0 +1,10 @@ +Usage: courtesyabort + + If your opponent's flag has hit zero, this is a one-sided abort +command. It is intended to abort the game if your opponent has gone +net-dead or has terrible lag. It is considered good sportsmanship +to do this rather than claim a win on time when your opponent doesn't +have a fighting chance. + +See Also: flag + \ No newline at end of file diff --git a/lasker-2.2.3/data/help/credit b/lasker-2.2.3/data/help/credit new file mode 100755 index 0000000..4ffcf6e --- /dev/null +++ b/lasker-2.2.3/data/help/credit @@ -0,0 +1,10 @@ +Credit: + + Michael Moore - Progenitor of the chess server idea and author of + the original server. Without him, the chess server + might not exist. + + Richard Nash - Original author of FICS. + + Daniel Sleator - Author of AICS and responsible for many of the ideas + that makes the chess server as popular as it is. diff --git a/lasker-2.2.3/data/help/cshout b/lasker-2.2.3/data/help/cshout new file mode 100755 index 0000000..276db82 --- /dev/null +++ b/lasker-2.2.3/data/help/cshout @@ -0,0 +1,17 @@ + +cshout + +Usage: cshout message +LIMITED TO REGISTERED USERS + + This command send a message to all users who are open to hear cshouts. You, +as the sender, will see displayed the number of users who heard your message. + + NOTE: "Cshout" should be used ONLY for chess-related messages, such as +questions about chess or announcing being open for certain kinds of chess +matches. Use "shout" for non-chess messages. + +See Also: censor it shout tell variables + +[Last modified: October 8, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/date b/lasker-2.2.3/data/help/date new file mode 100755 index 0000000..826ff5b --- /dev/null +++ b/lasker-2.2.3/data/help/date @@ -0,0 +1,13 @@ + +date + +Usage: date + + Shows the date and time at the server location as well as Greenwich, England +(GMT stands for Greenwich Mean Time, a benchmark for converting times from one +time zone to another). + +See Also: + +[Last modified: September 9, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/decline b/lasker-2.2.3/data/help/decline new file mode 100755 index 0000000..82bbd45 --- /dev/null +++ b/lasker-2.2.3/data/help/decline @@ -0,0 +1,19 @@ + +decline + +Usage: decline [1-n, all, abort, adjourn, draw, match, pause, player, simul, +switch, takeback] + + Decline an offer that has been made to you. If no parameter is given and +there is only one offer, you decline it. If there is more than one offer (for +example multiple match offers), then you must specify which offer you want to +decline. You can decline offers in several ways: by number, by type, all +offers, or by the player's name making the offer. For example, the command +"decline match" will decline all pending match offers you have been given. +The command "decline Shane" will decline the offer made by Shane. + +See Also: abort accept adjourn draw match pause pending simul switch +takeback + +[Last modified: June 20, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/draw b/lasker-2.2.3/data/help/draw new file mode 100755 index 0000000..0974e0b --- /dev/null +++ b/lasker-2.2.3/data/help/draw @@ -0,0 +1,22 @@ + +draw + +Usage: draw + + Requests a draw from your opponent. A draw means that you neither win nor +lose your chess match -- the game will be a tie. Ratings are affected, +however, unless it was an unrated match. + + If your opponent had offered you a draw, then the command draw (or accept) +would accept the draw offer. To decline a draw offer, either use the decline +command or make a move instead. + + This command also claims a draw in the case of the 50 move rule or +3 times repetition. In the case of a draw being requested, the chess server +will check for these conditions. If one of them is present, the game will be +drawn even without the opponent accepting the draw. + +See also: accept decline + +[Last modified: June 11, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/eco b/lasker-2.2.3/data/help/eco new file mode 100755 index 0000000..56e6345 --- /dev/null +++ b/lasker-2.2.3/data/help/eco @@ -0,0 +1,28 @@ + +eco + +Usage: eco [game] + + This command displays the category of the opening being played in the game +requested, whether a game being played or examined. + + eco gives information about the game you are playing + eco 2 gives information about game 2 + eco hawk gives information about the game hawk is playing + + The display includes several kinds of information about the opening being +played in the game: + + ECO[ ##] Encyclopedia of Chess Openings classification + NIC[ ##] New In Chess classification + LONG[ ##] Name of opening + +The number in the [] is the ## halfmoves used for classifying this game's +opening according to the data base being used. + + ECO information is also given in a user's "history" display. + +See Also: history + +[Last modified: August 15, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/eggo b/lasker-2.2.3/data/help/eggo new file mode 100755 index 0000000..24f0b08 --- /dev/null +++ b/lasker-2.2.3/data/help/eggo @@ -0,0 +1,137 @@ + +EGGO + + EGGO stands for "Examine Great Games Online". EGGO is an online database +program that facilitates examining and analyzing great games from players such +as Fischer, Kasparov, and Karpov. Basically, EGGO allows you to examine a +game except that the moves come from EGGO's database, not the chess server. +Currently, EGGO's database contains about 15000 to 20000 games. Type "finger +EGGO" for more information. + + In order to use EGGO, send EGGO a command; EGGO then processes the command +and returns the output to you. See below for a list of commands and their +descriptions. + + EGGO can have only one primary user at a time, meaning only one person at a +time can select the games to be examined. However, once a game has been +loaded for examination, other users can paticipate in examining and analyzing +the game using the "mexamine" and "observe" features of the chess server. + + +STARTING EGGO + + First step, type "observe EGGO". Second step, type "xtell EGGO begin". If +no other game is being examined, EGGO will make you the examiner -- you will +then be able to examine a game from EGGO's library. Otherwise, someone else +is listed as EGGO's main examiner and you will only be able to examine that +game for the moment. If you want someone else to help examine a game with +you, use the "mexamine" command. When you are finished examining one game and +want to examine another, simply use the examine command. Lastly, use the +unexamine command in order to leave EGGO. + + +EGGO'S COMMANDS (list): + + about examine help revert status + begin forward more search who + + +EGGO'S COMMANDS (descriptions): + + ABOUT + + Usage: xtell eggo about + + If someone is already examining an EGGO's game, this command will display + information about the game being examined. This command is also useful + for knowing EGGO's status. Anyone can use this command. + + BEGIN + + Usage: xtell eggo begin + + If EGGO is not busy, this command starts an EGGO session. If EGGO was + already in use, this command will have no effect. + + EXAMINE + + Usage: xtell eggo examine # + + You may use this command after a successful "xtell eggo search" command. + For example, "xtell eggo examine 1" will begin examination of game #1 from + the search output. You can repeat this command for other games from the + search output when you are finished examining your current game. That is, + you can type "xtell eggo examine #" for the next game; you do not need to + "unexamine" the other game first. (Please do not confuse this use of + examine with the normal "examine" command.) + + FORWARD + + Usage: xtell eggo forward [n] + + When you are already examining an EGGO's game, you can go forward 1 or + more moves using "xtell EGGO forward [n]". The default value for 'n' + is 1. Currently, you cannot go forward more than 20 moves at one time. + + MORE + + Usage: xtell eggo more + + This command allows you view the results of your search command. It will + list the next 20 games in the list (if there are any). You must be EGGO's + current user to use this command. + + REVERT + + Usage: xtell eggo revert + + After making your own moves when examining an EGGO's game, you can go back + to your game's mainline by "xtell eggo revert". (Please do not confuse + this command with the normal "revert" command.) + + SEARCH + + Usage: xtell eggo search [player1 {player2} {draw|nodraw}] + + You may use this command after a successful "xtell EGGO begin". The + purpose of this command is to search the EGGO game database for games by + particular players. "Player1" must be one of the names EGGO recognizes; + use the "xtell EGGO who" command to see which names EGGO knows. You can + use "draw" and "nodraw" to select a game with a particular result; they + are optional. + + "Search" alone without arguments will list the results of your previous + search. Here are other examples: + xtell eggo search Capablanca + xtell eggo search Fischer nodraw + xtell eggo search Fischer Spassky + xtell eggo search Kasparov Karpov nodraw + You can view the results of the search with "xtell EGGO more". + + STATUS + + Usage: xtell eggo status + + This command will display information about EGGO's current status, such as + whether EGGO is open or closed, and which game (if any) is being examined. + + WHO + + Usage: xtell eggo who + + This command will list all of the "primary" players known to EGGO. These + primary players are used in EGGO's search command. Anyone can use this + command whether they are EGGO's current user or not. + + +SPECIAL NOTES: + +(a) Since many of the EGGO commands are long, you might want to consider +creating aliases for the commands you will use a lot (such as "xtell EGGO +forward"). Suitable aliases will save you a lot of time as you play through +these games from famous players. + +See Also: alias examine mexamine + +[Written by Warrior August 18, 1995; last modified: August 21, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/etiquette b/lasker-2.2.3/data/help/etiquette new file mode 100755 index 0000000..c0619cc --- /dev/null +++ b/lasker-2.2.3/data/help/etiquette @@ -0,0 +1,71 @@ + +etiquette + + The goal of FICS is to provide a friendly means for chess enthusiasts to +play chess games and discuss topics of interest. In order to promote a +friendly atmosphere, FICS follows simple guidelines and rules of etiquette. +FICS admins have the authority to warn and (if necessary) sanction users who +do not follow these guidelines. + + +COMMUNICATIONS + + Please use the various ways of communicating on this server for their +intended purpose: to foster chess fellowship and companionship. + + Users should refrain from making any statements or engaging in any conduct +that could be considered abusive, harrassing, offensive or obscene, especially +with regard to nationality, race, religion or sexual orientation. + + Please avoid having differences of opinion escalate into personal +confrontations and attacks. Refrain from namecalling and disparaging a user's +character. + + It is good etiquette to have lengthy discussions about a topic or issue +using channels rather than shouts. Special topics channels have been created +for this purpose (the "channel_list" help file lists them). There may be +times when you are asked to move your discussion to a channel. + + Further examples of abusive communication are given in the "shout_abuse" +help file. + + +CHESS COMPETITION + + Users should refrain from conduct that ruins the spirit of competition on +the server. Such misconduct includes: + + (a) intentionally disconnecting in order to avoid losing a chess match + -or- to analyze the game and resume playing it later; + (b) intentionally losing a chess match in order to inflate another user's + rating; + (c) using a chess computer to play a match without having the account + registered as a computer; + (d) registering as a "blindfold" account but using a board while playing + (blindfold accounts must use style 9, by the way); + (e) letting other people play rated matches using your registered account; + (f) giving assistance to a player while he/she is playing a match; + (g) receiving assistance from a person, book or computer while you are + playing a match; + (h) engaging in conduct that interferes with a chess match or a player's + being able to concentrate on his/her chess match; + (i) intentionally letting your clock run out of time during a chess match + rather than resigning or moving in a lost position. + + +PROBLEM SITUATIONS + + Many users have finger notes that explain how they will handle certain +situations, such as lag and takeback. The issue of transmission lag often +comes up for discussion. As noted in the "lag" help file, it is not unethical +to flag your opponent when he/she runs out of time. + + If you suspect that a user is abusing his/her communication privileges +and/or not following the spirit of competition, feel free to contact an admin +with details concerning the situation. + +See Also: abuser admins blindfold channel channel_list computers handle +intro_playing intro_talking lag shout_abuse + +[Last modified: December 25, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/examine b/lasker-2.2.3/data/help/examine new file mode 100755 index 0000000..0b6a289 --- /dev/null +++ b/lasker-2.2.3/data/help/examine @@ -0,0 +1,94 @@ + +examine + +Usage: examine [player1 [player2, game_number] + + This command starts a game in the examine mode where you, as the examiner, +can move the pieces for both white and black, take moves back and analyze side +variations. You can examine a new game from scratch, a stored (adjourned) +game, a finished game from "history" or a game in someone's "journal". + + +STARTING EXAMINE MODE + + There are four ways to begin an examine session: + + 1) New Game from Scratch -- "Examine" used alone without any player names + begins examine mode for a new game and, in essence, you will be playing + yourself. Typing "match your_handle" is also a way to enter examine mode + for a new game. + + 2) Stored Games (adjourned) -- "Examine player1" will examine your stored + game against player1 (if one exists). "Examine white_player + black_player" will examine the stored game (adjourned) between the two + players. Example: "examine dav thedane". + + 3) Completed Game from History -- "Examine player1 game_number" will examine + that game from player1's "history". Example: "examine theviking 45". + + 4) Game from a Journal -- "Examine player1 game_slot" will examine that game + from player1's "journal" (unless the journal is private, namely + "jprivate" variable has been set to non-zero). Example: "examine sms B". + + +EXAMINE MODE + + No matter how you start the examine functions, the game will be played from +the starting position, not the last, stored position. + + While in examine mode, you can move the pieces in order to set up a position +and/or analyze side variations. There are three special commands you can use +when examining a stored game: + + forward [#] goes forward # moves (default n=1) + + backward [#] goes backward # moves (default n=1) + + revert goes back to the main variation (the last branch) + +For new games, only "backward" works; the other commands have no affect since +there is no main line stored. Therefore, once you go backward, you will need +to move the pieces again in order to move forward. + + Lastly, the command "unexamine" leaves the examine mode and ends your +analysis of the game. + + +GROUP EXAMINE + + Other users can also examine the game you are reviewing. But must you +decide who these other examiners are. Here are the steps involved: + + (1) The other examiner must first "observe" your game. + + (2) You, as the main examiner, must type "mexamine " in order to give + "user" access to the examine mode. + + As long as there is at least one designated examiner of a game, the analysis +can continue even when the first examiner who started the examine session +leaves. + + In order to communicate with another examiner of the game, it is best to use +the "kibitz" command. If you use "whisper", the game's observers but not +examiners will hear your message. + + +SPECIAL NOTES + +(1) Players examining games have a # next to their handles in the (short) +"who" display, and examined games are listed in both the "games" and +"allobservers" displays. + +(2) "Unexamine" stops your participation in the analysis, and also stops your +observer status. Other examiners of the game may continue, however, even if +you started the examine session initially. + +(3) Clock times displayed are unimportant, of course, since time is not a +factor when analyzing games. + + +See Also: allobservers backward forward games history kibitz journal +match mexamine observe stored unexamine variables whisper who + +[Last modified: December 17, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/fics-lingo b/lasker-2.2.3/data/help/fics-lingo new file mode 100755 index 0000000..933089e --- /dev/null +++ b/lasker-2.2.3/data/help/fics-lingo @@ -0,0 +1,70 @@ + + Some people get confused with the words that some people use, so here's an +explanation of the more common terms and abbreviations. + + +Abbreviation: BRB +Means: I'll be right back. Person is about to go idle or log off for a few + minutes or so.. + +Abbreviation: BIAS +Means: Back in a second. (As above) + +Abbreviation: ATM +Means: At the moment. + +Abbreviation: IAM +Means: In a minute. + +Abbreviation: IMO +Means: In my opinion. + +Abbreviation: ROTFL +Means: Rolls on the floor laughing. + +Word: wrok +Means: work - work is a forbidden word :) + +Word: Wuah +Means: greetings - the word muah can also be used with it eg wuah muah! + +Word: Thumpa +Means: greetings + +Word: Isbjoern +Means: Polar bear. A weird concept invented by that master of creativity, + TheDane. If someone says this, everyone is meant to repeat it. (It + is used to mean greetings). However don't take this literaly, else + the server would really slow down. :) + +Words: Your plan +Means: The notes you get when you type finger. + +Words: Your finger (notes) +Means: (As above) + +Words: Your notes +Means: (As above) + +Word: Admin +Means: Administrator or sys-op. + +Word: Unreg +Means: Unregistered - doesn't have an account here. + +Word: Muzzle +Means: Loss of shouting priveledges. You also can't kibitz. + +Words: Match someone +Means: Start a game with someone. + +Word: Censor +Means: Whoever is censored by you can't talk to or match you. You won't see + their shouts either. + +Word: Filter +Means: Sites that are filtered cannot have unreg logins from them. + +Words: :) :) :) :) :) :)'s at the wonderful wonderful world :) +Means: Dates back to the 'Court of Queen Eyre' on the old ICS. I think it + meant hi everyone. diff --git a/lasker-2.2.3/data/help/fics_lingo b/lasker-2.2.3/data/help/fics_lingo new file mode 100755 index 0000000..5cca039 --- /dev/null +++ b/lasker-2.2.3/data/help/fics_lingo @@ -0,0 +1,66 @@ + +fics_lingo + + Many users on this server use special words and phrases (slang, jargon, +lingo). Here is an explanation of the more common terms and abbreviations. + + +Admin -- Server administrator or sys-op (systems operator). + +ATM -- At the moment. + +BIAS -- Back in a second. (similar to brb) + +BRB -- I'll be right back. Person is about to go idle or log off for a few + minutes or so. + +Censor -- Whoever is censored by you can't talk to or match you. You won't + see their shouts either. + +Filter -- Sites that are filtered cannot have unreg logins from them. + +Finger (someone) -- A command used to learn about another user. Also refers + to one's notes or "plan". Thus, "finger me" is not meant + to be rude. :) + +Handle -- Your server name (nickname). + +IAM -- In a minute. + +IMHO -- In my humble opinion. + +IMO -- In my opinion. + +Isbjoern -- Polar bear. A weird concept invented by that master of + creativity, TheDane. If someone says this, everyone is meant to + repeat it. (It is used to mean greetings.) However don't take + this literaly, else the server would really slow down. :) + +Lag -- Transmission delay, when either the server or the internet slows down. + +Match (someone) -- Start a game with someone. + +Muzzle -- Loss of shouting privileges. You also can't kibitz. + +Notes -- Same as "plan" or "finger" notes. + +Plan -- The notes you get when you type "finger". + +ROTFL -- Rolls on the floor laughing. + +Thumpa -- Greetings! + +wrok -- Work [work is a forbidden word :) ] + +Wuah -- Greetings! The word muah can also be used with it, e.g., wuah muah! + +Unreg -- Unregistered user (doesn't have an account here ... yet). + +:) :) :) :) :) :)'s at the wonderful wonderful world :) -- This shout dates +back to the 'Court of Queen Eyre' on the old ICS. We think it meant "hi +everyone". + +See Also: [the individual commands and help files] + +[Last modified: September 9, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/ficsfaq b/lasker-2.2.3/data/help/ficsfaq new file mode 100755 index 0000000..1a40b9a --- /dev/null +++ b/lasker-2.2.3/data/help/ficsfaq @@ -0,0 +1,160 @@ +FICSFAQ (Frequently Asked Questions) + + The admins at this site can be very busy so, if you find a bug or have +questions, read this file first: + +1> How do I register? + Read the "register" help file -- "help register". + +2> What is network vs local: + It has to do with distributed ratings -- contact an admin if you get this + one. + +3> Can I have more than one account? + Only if for blind/computer/admin/team reasons. + +4> Can I register more than one computer? + Yes. + +5> Can I have more than one person using my email? + Yes. + +6> Can more than one person share an account for team games? + Yes, WEENIES is an example. + +7> Can I be an admin? + Read the "admin-new" help file -- "help admin-new". + +8> Can I help with programming. + Ask hawk. + +9> Who's programming? + Dan/DAV/foxbat/grimm/hawk/Len/Mann/Shane,etc + Thanks to Friar for some help files. + And Cthulu(clong) for ECO database - coming soon. + Thanks to Richard Nash (red) and Michael Moore for the old fics code. + +10> Where else can I play FREE chess? + ics.onenet.net 5000 helium.daimi.aau.dk 5000 + pitt.chess.edu 5000 anemone.daimi.aau.dk 5000 + arapaho.cse.ucsc.edu 5000 + If you know of more FREE sites tell us. + +11> Where do I get an interface from? + pub/chess on ftp ics.onenet.net (use anonynous ftp) + +12> Where can I get the latest code from. + pub/chess/Unix on ftp ics.onenet.net (use anonynous ftp) + help files are in the oldest version FICS.tar.gz + +13> I don't like admin x. Admin y is treating me badly. + See Sparky (onenet) and hawk (helium) + +14> Darooha, arcsin and POTZY have come for a peek. What gives? + Sometimes people pretend to be them. + Do not abuse them if they log on. + Our code is GNU - they can use our ideas and code on ICC if they + want. Remember who wrote it first. + +15> What is ICC? + Don't ask -- no free advertising -- you pay $49 for chess there. :) + +16> Can I shout about ICC? + Yes, sure. Given a choice to pay $49 or $0. I'd take the $0. + +17> Should I advertise FICS? + Yes do so. Watch you don't get nuked on ICC, though. Do help ads there. + Remember, Burger King burgers are free. :) + +18> I can't shout! + Are you unreg or have you been muzzled? + +19> I can't play rated. + Have both of you set rated 1? + Have you got the network vs local bug. + +20> How do I use the -->name thing I see displayed? + Use "it" "i" or ":" followed by a message + +21> The Hormone channel(51) has been reinstated I notice. + Yes, but cleanish language only. This is a family server. + Don't say something you wouldn't say in front of someone's kids. + But maybe you would :) + +22> The board is the wrong way up: + Problem flip in style 12 -- old ZIICS and SLICS are affected. + +23> Can't promote (xboard). + Try e7e8 for a queen. + +24> How do I continue a game that was adjourned? + "match" the player again, and it will resume the game if the player + accepts + +25> I can't castle after king takeback. + We know. + +26> I can castle through check. + This has been observed once. + +27> Takeback gives wrong lastmove info. + A bug. + +28> Simuls don't work. + They were broken once; they should be okay now. + +29> My rating is over/under inflated + There may be a bug somewhere. + +30> +alias/+censor etc don't work. + Try alias/unalias and censor/uncensor for now. + +31> I've got an old account here, I can't remember my password. + Ask an admin for help -- be ready to verify your email address. + +34> Stats gives silly info. + We know. + +35> Is there any wild? + Yes .. and rated, too. + +36> Zippy won't shut up, too many shouts. + Use censor [name], cshout (sshout on ICC) is coming. + +37> How many channels can I be in? + As many as you like, don't be in too many though as this takes + up file space; do "help channel" for predefined ones. + +39> The "who" listing appears staggered. + Fixed soon. + +40> How do I withdraw a match request? + Type "withdraw". + +41> I'm getting lag -- what can I do? + Either Ctrl C to escape or use adjourn. + Otherwise get your opponent to do "moretime #" where # <= 600 seconds. + +42> I suddenly got a Connection closed message. + 1> There has been a shutdown + 2> There has been a crash -- please bear with us. + 3> The server dumped you for some reason. + 4> You got nuked. + +43> How long do shutdowns last and why? + About 10 seconds. + Sometimes we need to add new code or fix bugs -- please bear with us. + +44> I get unprintable characters / delete don't work. + Being fixed. + +45> How do I get further help? + Follow these steps: + (a) "channel 1" + (b) "tell 1 help me!" + (c) When you are done, you can type "channel 1" exit this channel. + +46> How do I pause a long file from scrolling? + Use ctrl q and ctrl s -- or use your scroll bar. + Also, "set height ##" fixes how many lines will be displayed at a time. + diff --git a/lasker-2.2.3/data/help/finger b/lasker-2.2.3/data/help/finger new file mode 100755 index 0000000..0e06ec7 --- /dev/null +++ b/lasker-2.2.3/data/help/finger @@ -0,0 +1,54 @@ + +finger + +Usage: finger [user] + + Displays information about the given user. If no user is given, then +your information is displayed. Here is a sample display: + +|----------------------------------------------------------------------| + Statistics for Aquinas On for: 55 Idle: 0 + (examining game 9: Plato vs. Aristotle) + + rating RD win loss draw total best + Blitz 1910 75.3 28 10 2 40 1936 (01-Jun-95) + Standard 1838 92.3 13 6 1 20 1838 (03-Jun-95) + Lightning ---- 350.0 0 0 0 0 + Wild 1876 94.3 15 10 0 25 1903 (05-Jun-95) + + Timeseal: ON + + 1: + 2: +|----------------------------------------------------------------------| + + The user's ratings for each type of chess are displayed, along with the +Glicko RD (or index of ratings variability), the total results from games +played, and the best or highest rating for each type. You can also tell (1) +whether the user is (1) currently logged on and, if so, for how long and +whether his/she is idle, (2) playing, observing or examining a game and, if +so, which game it is, and (3) currently running a version of timeseal or not. +Beneath the ratings are note lines (a user's "plan" or "notes") the user can +add using the set command. + + +SPECIAL NOTES: + +(a) Your e-mail address is automatically displayed to you beneath your ratings +table; it is NOT displayed to other users -- unless of course you include your +address as part of your finger notes. + +(b) Best ratings and dates are only given *after* you have played 20 games of +a given type. + +(c) If a user has not played rated games of a given type, the rating will be +indicated as ---- and the RD will be 350.0. + +(d) If a user is not logged on, the display will indicate when he/she last +disconnected and the timeseal section will not appear. + +See Also: busy examine glicko notes observe ratings set timeseal +variables + +[Last modified: December 17, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/fixes b/lasker-2.2.3/data/help/fixes new file mode 100755 index 0000000..3da06ee --- /dev/null +++ b/lasker-2.2.3/data/help/fixes @@ -0,0 +1,18 @@ +Things I've worked on: (foxbat) + +ratings.c 3.10.95 - if 2 0 rated players play a rated game, Rb_S can go + negative, which is bad for the sqrt function. added + a filter to stop this. Also the pow(x,y) funtion + expects floating point args, so changed 10 to 10.0 + +ratings.c 3.11.95 - added code to increment the number of games played and + Rb_total/Rs_total's in the rating_update function. + +comproc.c 3.11.95 - in com_match, added filters so the 'rated' variables + must match before a match request is issued. + +gamedb.c 3.12.95 - if a rated game was drawn, the 'Winner' column in hist + and was showing whoever was white, so I changed these 2 +gameproc.c files to show that it was 'Drawn'. also limited the + character length of names in history to 9. + diff --git a/lasker-2.2.3/data/help/flag b/lasker-2.2.3/data/help/flag new file mode 100755 index 0000000..b74fd0e --- /dev/null +++ b/lasker-2.2.3/data/help/flag @@ -0,0 +1,40 @@ + +flag + +Usage: flag + + This command asks the chess server to check the clock time for you and your +opponent. The effect of the command depends upon whether one or both of you +are out of time (chess clock reads zero or negative). + + (i) If your opponent has run out of time but you have time, then "flag" +will claim the win for you. + + (ii) If both you and your opponent are out of time, then "flag" will claim a +draw. + + (iii) If your opponent has time left, you will be given an error message by +the server when you use "flag". + + If your opponent appears to have lost his/her connection or hasn't responded +in a reasonable amount of time, he/she probably has a systems lag. Use the +command "abort" to end the game like a good sport and not have your opponent +lose the game through no fault of his/her own. + +SPECIAL NOTES: + +(a) Some users have interface programs that automatically flag you when you +have run out of time. This practice is legal. If you find yourself losing +many games from being flagged when you have system lags or take longer to +think about moves, then consider using longer time controls. + +(b) If your opponent's clock reads zero (0:00) on your screen, it does not +*always* mean that your opponent has no time left for the game. The server +keeps the official times for both players. These times are re-sent after each +move. Transmission lag or using timeseal may cause the official time to be +different than the times shown on your screen. + +See Also: abort draw lag timeseal + +[Last modified: November 26, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/flip b/lasker-2.2.3/data/help/flip new file mode 100755 index 0000000..eced6c9 --- /dev/null +++ b/lasker-2.2.3/data/help/flip @@ -0,0 +1,16 @@ + +flip + +Usage: flip + + "Flip" toggles the 'flip' variable on and off. When 'flip' is on it causes +the board display to be reversed -- either from White at bottom to Black at +bottom, or vice versa. Changing your flip setting may be especially useful +when observing games or playing team games. Using this command is equivalent +to "set flip on"/"set flip off". Because the 'flip' variable is affected, +changes in 'flip' are permanent until you re-set it. + +See Also: variables + +[Last modified: October 8, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/fmessage b/lasker-2.2.3/data/help/fmessage new file mode 100755 index 0000000..9eff128 --- /dev/null +++ b/lasker-2.2.3/data/help/fmessage @@ -0,0 +1,18 @@ + +fmessage + +Usage: fmessage user message_number + + You can forward a "message" you have received to another user by using the +"fmessage" command. In this way, you can share news with other users without +having to retype the information each time. Suppose, for example, the third +message in your message list is something you want Hawk to read. You type +"fmessage Hawk 3". When you do this, you will receive the feedback that your +message has been forwarded to that user. When you receive a forwarded +message, it will be clearly designated as a FORWARDED message from a given +user. + +See Also: message + +[Last modified: April 28, 1996 -- Friar] + diff --git a/lasker-2.2.3/data/help/formula b/lasker-2.2.3/data/help/formula new file mode 100755 index 0000000..815cac4 --- /dev/null +++ b/lasker-2.2.3/data/help/formula @@ -0,0 +1,179 @@ + +formula + +Usage: set formula + + +SUMMARY + + The formula variable filters out match requests. If you have a formula set, +then any match request not satisfying your formula is automatically declined; +you will be notified that the offer was made and rejected by your formula. If +you make an offer that fails a player's formula, you will be given this +feedback. A user's formula and f-variable settings are displayed using the +"variables" command. You disable (turn off) your formula by typing "set +formula". This will, in essence, erase your current formula setting. + + Here are some simple examples, with descriptions in [] brackets: + + blitz [match must be blitz] + !wild [match must be non-wild] + inc >= 10 [match must have an increment of 10 or higher] + + Create or modify a formula by using the "set" command. For example, "set +formula blitz". Special variables (f1-f9) can also be established using the +"set" command; these variables make it easier to modify your formula depending +upon your mood. + + +CREATING A FORMULA + + (1) Decide whether you will be changing your formula often. If so, think +about using f-variables to make these changes easier. + + (2) Decide exactly what kinds of filters you want to have, such as type of +game, time controls, and kinds of opponents. + + (3) Review the available formula operators and pre-defined variables (listed +below) to see which ones fit your needs. + + (4) Write out your formula and f-variables on paper to make sure that their +"logic" works. + + (5) Enter the logical expressions for the f-variables and formula using the +"set" command. + + Changing your f-variables and formula follows the same procedures. + + +FORMULA VARIABLES + + Several variables are allowed in formula settings. Some of these variables +hold numerical information while others are Boolean (true/false, 1/0). Here +is a list of allowed variables, where Boolean variables are denoted by "(B)": + + The following variables are allowed in formulas: + + Variable Description + ------------ --------------------------------------------------- + abuser 1 if opponent is on the abuser list; 0 otherwise (B) + assessdraw How many rating points you will gain/lose by drawing a + chess match + assessloss How many rating points you will lose by losing a chess + match + assesswin How many rating points you will gain by winning a chess + match + blitz 1 if match is blitz in type; 0 otherwise (B) + computer 1 if opponent is a computer; 0 otherwise (B) + inc Increment time for each player + lightning 1 if match is lightning in type; 0 otherwise (B) + maxtime(n) The maximum time n moves will take for BOTH players + (in seconds) [you must supply the 'n' value] + mymaxtime(n) The maximum time n moves will take YOU (in seconds) + [you must supply the 'n' value] + myrating Your rating + nonstandard 1 if the game will have different time controls for the + two players; 0 otherwise (B) + private 1 if game will be private; 0 otherwise (B) + rated 1 if game will be rated; 0 otherwise (B) + rating Opponent's rating + ratingdiff The difference between opponent's rating and your + rating [rating - myrating] + registered 1 if opponent is a registered user; 0 otherwise (B) + standard 1 if game will be standard in type; 0 otherwise (B) + timeseal 1 if opponent has timeseal; 0 otherwise (B) + time Start time for each player + untimed 1 if game will not involve the clock; 0 otherwise (B) + wild 1 if game will be wild in type; 0 otherwise (B) + + Also, the word "minutes" is allowed after a number that is not enclosed in +parentheses (but right now, you must use "1 minutes"; the singular is not +recognized). The word has the effect of multiplying the previous number by +60, thus turning minute-values into seconds-values -- important for the +maxtime and mymaxtime variables. For example, "2 minutes" would yield the +value of "120". + + +FORMULA OPERATORS + + The following formula operators are allowed; their order of precedence in +the calculations and evaluations is listed. Sometimes more than one set of +symbols leads to the same result. When functions in the formula have equal +precedence, the precedence is from left to right. + + Symbol Function Precedence + ------ ------------------------------- ---------- + ! not; negation 1 + - minus [as in -20 or -variable] 1 + * multiplication 2 + / division 2 + + addition 3 + - subtraction 3 + < less than 4 + <= less than or equal to [ =< also works] 4 + > greater than 4 + >= greater than or equal to [ => also works] 4 + = equals [ == also works] 5 + != not equals [ <> also works] 6 + & and [ && also works as does 'and'] 7 + | or [ || also works as does 'or'] 8 + + Parentheses () are allowed in formulas and function as they do in numerical +equations: expressions within parentheses are evaluated first. You can use +the pound sign '#' after your settings to provide comments and reminders to +yourself. NOTE: The program divides by a fudge factor of .001 instead of +dividing by 0. + + +USER-DEFINED FORMULA VARIABLES (f-variables) + + F1 through f9 are user-defined formula variables changed by using the "set" +command. These variables can return either numerical or Boolean results. +They make it easy to change one part of your formula without retying the whole +thing, or to adjust your formula depending on your mood. For example, if your +various f-variables were ... + + f1 rated & time=5 & inc=0 # rated 5 minute games + f2 ratingdiff + f3 maxtime(40) >= 2*8minutes # at least 8 mins each for 40 moves + f4 f2>400 # I want a REAL fight + f5 !abuser + f6 standard | (ratingdiff<200 & blitz) + +... then, depending on your mood, you could type one of the following: + + set formula f1 & f5 # rated 5 min. games only + set formula f2 > -100 # long games, decent competition + set formula f1 & !f4 +-or- set formula f2 >= 0 | blitz + + You define an f-variable using the "set" command. With respect to the above +examples, you would type such lines as ... + + set f2 ratingdiff + set f4 f2>400 # I want a REAL fight + set f5 !abuser + +*** Special Note *** +Be careful how you write the f-variables. Make sure they have the proper +sequence. For example, f5 can refer to f2 but f5 cannot refer to f8. + + +MAXTIME EXAMPLE + + Using maxtime sets the expected total time for the game. If your formula +(or f-variable) included the following expression ... + + maxtime(30) <= 10 minutes + +... this would allow no more than 10 minutes total time for the first 30 moves +of the game (5 minutes for each player, or any other combination). + + +CREDITS: Formula program for FICS written by Dave Herscovici (hersco) + + +See Also: assess blitz lightning match timeseal variables + +[Last modified: December 17, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/forward b/lasker-2.2.3/data/help/forward new file mode 100755 index 0000000..a363cab --- /dev/null +++ b/lasker-2.2.3/data/help/forward @@ -0,0 +1,23 @@ + +forward + +Usage: forward [#] + + This command is used by a person examining a game in order to move forward +in the sequence of the game's moves. The # is half_moves. Example: "forward +40" -- game will go forward 40 half-moves (20 for White and 20 for Black). +If # is not specified, 1 will be used. If you type "forward 999" the game's +final position will be displayed. + +SPECIAL NOTES + +(1) This command does not work for new games, only stored games. + +(2) This command works only on the mainline of stored games, not variations +branching off from the main line or moves continuing a game from a stored +position. + +See Also: backward examine + +[Last modified: November 26, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/ftp-hints b/lasker-2.2.3/data/help/ftp-hints new file mode 100755 index 0000000..67b6c89 --- /dev/null +++ b/lasker-2.2.3/data/help/ftp-hints @@ -0,0 +1,66 @@ +The Internet Chess Library (chess.onenet.net) is an anonymous FTP archive +containing a large amount of chess information and programs (~200MB). + +All of the FICS Graphical interfaces are available there, and much more, +and access is free. It is available via your favorite Web browser, like +Netscape or Mosaic (URL: http://chess.onenet.net/chess) or simply ftp +(file transfer protocol), a very common program available on most Unix +systems and many others. Web access would be best and most intuitive, +but instruction for using ftp follow: + +----------------------------------------------------------------------------- + +The most standard command to initiate an ftp connection to the ICL would +be (from your host's prompt, not FICS's): + + ftp chess.onenet.net + or ftp 164.58.253.10 + +If this seems to be garbage to your system, you'll need to find out more +from a local systems administrator. + +If you connect to the server, you will be asked for a Username (type +"anonymous") and a Password (as it will tell you, give your email address). +Note: chess.onenet.net and caissa.onenet.net are the same machine currently. + + ftp chess.onenet.net + + Connected to chess.onenet.net. + 220 caissa.onenet.net FTP server (Version wu-2.4(1) Tue Oct 11 11:29:11 1994) + ready + Name (your-host.your-domain:your-username): anonymous + 331 Guest login ok, send your complete e-mail address as password. + Password: your@email.address + +In this example, we will go to the DOS directory. All files and directories +in the current directory can be seen with "dir". "cd" changes directories. +a "/" separates directory names when specifying directories within +directories. "help" will give you a list of available commands in ftp. + + cd /pub/chess/DOS + +or cd DOS + +( users of DELPHI may need to type: cd "DOS" ) + +"dir" will show you all the files and directories here. There are quite +a few. We will now transfer the software for ZIICS, a graphical interface +which runs under DOS on PC's. The "binary" command sets the transfer +mode to binary type (8 bit, for true binary/executable data). The "get" +command transfers a file. + + binary + get ziics121.exe + +If you are done, "quit" will exit you from ftp. + + quit + +Now all you need to do is transfer the file to your local PC or workstation, +assuming you do not have a direct Internet connection or PPP/SLIP. This is +done most commonly with "kermit" or "zmodem". Check around locally for +what is available. + +Channel 1 is a great place to get help help from people on-line at FICS. + +See also: interfaces, addresses diff --git a/lasker-2.2.3/data/help/ftp_hints b/lasker-2.2.3/data/help/ftp_hints new file mode 100755 index 0000000..d011c15 --- /dev/null +++ b/lasker-2.2.3/data/help/ftp_hints @@ -0,0 +1,124 @@ + +ftp_hints + +There are many kinds of files for the chess server you may wish to access and +download to your system. The Internet Chess Library (chess.onenet.net) is an +anonymous FTP archive containing a large amount of chess information and +programs (~200MB). (See the "inetchesslib" help file.) Many users of the +chess server download a graphical interface and timeseal (read the +"interfaces" and "timeseal" help files). + +There are several ways to access and download these files. But first, you +need to connect to where the files are located. There are two main ways to +connect: World Wide Web (www) and file transfer protocol (ftp). + +WWW access would be best and most intuitive. You can get there using your +favorite Web browser, like Netscape or Mosaic. The URL address is: + + http://chess.onenet.net/chess + +But ftp access is also easy. This file is about ftp procedures for the chess +server files. + + +FTP FILE TRANSFER + +The most standard command to initiate an ftp connection to the files would be +to initiate a session from your system (not from within the chess server +itself) and at your host's prompt type: + + ftp chess.onenet.net + or ftp 164.58.253.10 + +[Note: chess.onenet.net and caissa.onenet.net are the same machine currently +so either address will work for now.] + +If the ftp command seems to be garbage to your system, you will need to +contact your local systems administrator. + +If you connect to the file server, you will see this message on your screen: + + Connected to chess.onenet.net. + 220 caissa.onenet.net FTP server (Version wu-2.4(1) Tue Oct 11 11:29:11 + 1994) + ready + Name (your-host.your-domain:your-username): + +Type: + + anonymous + +You will then see this message: + + 331 Guest login ok, send your complete e-mail address as password. + Password: + +Type your email address. + +Now you are in and should see the ftp prompt: + + ftp> + + +LOCATING THE FILES YOU NEED + +Typing "help" will give you a list of available commands in ftp, but here are +some basics. All files and directories in the current directory can be seen +with "dir". Typing "cd" changes directories. A "/" separates directory names +when specifying directories within directories. + +In this example, we will go to the DOS directory. Type: + + cd /pub/chess/DOS + +or cd DOS + + (NOTE: users of DELPHI may need to type: cd "DOS") + +If you type "dir" you will see all the files and directories in that location. +There are quite a few. + + +TRANSFERRING A FILE + +In order to transfer a file properly from the ftp site to your computer host, +you need to set the correct transfer mode and use the right commands. The +files you need for an interface and timeseal need to be transferred using the +"binary" mode. The "binary" command sets the transfer mode to binary type (8 +bit, for true binary/executable data). Then you need to have the file sent to +you. The "get" command transfers a file from the ftp site to you. + +In this example we will now transfer the software for ZIICS, a graphical +interface that runs under DOS on PC's. The file name for ZIICS is +"ziics121.exe". Here is what you would need to type: + + binary + get ziics121.exe + +If you are done and do not wish to transfer any other files, type "quit" and +you will exit from ftp. + + quit + +If you have a direct internet connection using PPP/SLIP, the file should now +be in your computer directory and you are ready to work on it. + +If yuo do not have a direct connection, what you need to do is transfer the +file from your computer host to your local PC or workstation. This is done +most commonly with "kermit" or "zmodem". Check around locally for what is +available and works best on your system. After using kermit or zmodem, the +file should then be in your directory for you to work on. + + +FOR FURTHER ASSISTANCE + +Channel 1 is a great place to get help from people on-line at this chess +server. They can help you work through each of these steps. You should also +read the special help files for interfaces and timeseal; they have further +details specific to those kinds of files. And you can also contact the server +admins for help. + +See also: admins addresses chan_1 inetchesslib interfaces timeseal + +[Last modified: September 9, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/games b/lasker-2.2.3/data/help/games new file mode 100755 index 0000000..484679f --- /dev/null +++ b/lasker-2.2.3/data/help/games @@ -0,0 +1,58 @@ + +games + +Usage: games [#, word] + + If no parameters are given, "games" lists all the games currently being +played on the server. The games are listed in order of the ratings of the +players involved. If a number is supplied as a parameter, only the game +matching that number is displayed. If a word (or even a single letter) is +supplied, only games involving players whose handles begin with that word are +displayed. For example, "games gr" will show all games involving players +whose handles begin with "gr". + + Here is a sample games display and what the symbols mean: +------------------------------------------------------------------------------ +25 (Exam. 0 Friar 0 Friar ) [ uu 0 0] W: 1 +28 ++++ TryMe 1737 Jack [ su 30 20] 22:27 - 23:17 (29-30) W: 16 + 2 2274 OldManII ++++ Peshkin [ bu 2 12] 2:34 - 1:47 (39-39) B: 3 +29 1622 Vman 1609 PopKid [ sr 10 10] 1:14 - 5:10 (21-22) B: 18 +32 1880 Raskapov 1859 RoboDweeb [ br 2 12] 1:04 - 1:26 ( 9-10) B: 34 + 1 1878 Roberto 1881 baraka [psr 45 30] 30:35 - 34:24 (22-22) W: 21 + + 6 games displayed (of 23 in progress) +------------------------------------------------------------------------------ + + Reading from left to right: (i) game number; (ii) rating of user playing +White; (iii) handle of White, (iv) rating of user playing Black; (v) handle of +Black; (vi) type of match and time controls, (vii) current clock times for +both players; (viii) current material strength for both players, (ix) who is +on move and what move number it will be, and, lastly (x) the number of games +listed in the display and how many in progress. Ratings are ++++ for +unregistered players and ---- for registered players who do not have a rating +in this category. Lastly, any games being examined are displayed. + + +TYPE OF MATCH -- The format will be [Private] | [Category] | [Rated]. + + Private -- If a "p" is given, the game is private and not open for +observation. If not private, the space will be blank. (See the "variables" +help file.) + + Category -- The possibilities are: + b blitz + d bughouse + l lightning + n nonstandard game, such as different time controls for the players + s standard + u untimed (including simul-matches, simuls) + w wild + + Rated -- The possibilities are "r" for rated and "u" for unrated. + + +See Also: blitz examine lightning match simuls standard variables +untimed + +[Last modified: December 19, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/getgi b/lasker-2.2.3/data/help/getgi new file mode 100755 index 0000000..9b28488 --- /dev/null +++ b/lasker-2.2.3/data/help/getgi @@ -0,0 +1,6 @@ + +getgi + +Usage: RESTRICTED FOR USE BY TD PROGRAMS + +[Last modified: August 1, 1997 -- Friar] diff --git a/lasker-2.2.3/data/help/getpi b/lasker-2.2.3/data/help/getpi new file mode 100755 index 0000000..9499522 --- /dev/null +++ b/lasker-2.2.3/data/help/getpi @@ -0,0 +1,6 @@ + +getpi + +Usage: RESTRICTED FOR USE BY TD PROGRAMS + +[Last modified: August 1, 1997 -- Friar] diff --git a/lasker-2.2.3/data/help/glicko b/lasker-2.2.3/data/help/glicko new file mode 100755 index 0000000..d4614b2 --- /dev/null +++ b/lasker-2.2.3/data/help/glicko @@ -0,0 +1,219 @@ + + +-------------------------------------------------+ + | Vek-splanation of the Glicko Ratings System | + +-------------------------------------------------+ + +As you may have noticed, each FICS player now has a rating and an RD. + +RD stands for "ratings deviation". + +Why a new system +---------------- + +The new system with the RD improves upon the binary categorization that was +used before on fics and elsewhere, where players with fewer than 20 games were +labeled"provisional" and others were labeled "established". Instead of two +separate ratings formulas for the two categories, there is now a single +formula incorporating the two ratings and the two RD's to find the ratings +changes for you and your opponent after a game. + +What RD represents +------------------ + +The Ratings Deviation is used to measure how much a player's current rating +should be trusted. A high RD indicates that the player may not be competing +frequently or that the player has not played very many games yet at the +current rating level. A low RD indicates that the player's rating is fairly +well established. This is described in more detail below under "RD +Interpretation". + +How RD Affects Ratings Changes +------------------------------ + +In general, if your RD is high, then your rating will change a lot each time +you play. As it gets smaller, the ratings change per game will go down. +However, your opponent's RD will have the opposite effect, to a smaller +extent: if his RD is high, then your ratings change will be somewhat smaller +than it would be otherwise. + +A further use of RD's: +---------------------- + +Vek asked Mark Glickman the following: + +> Given player one with rating r1, error s1, +> and player two with r2 and s2, do you have a formula for the probability +> that player 1's "true" rating is greater than player 2's ? + +Mark said: + + Yes - it's: + + 1/(1 + 10^(-(r1-r2)f(sqrt(s1^2 + s2^2))/400) ) + + where f(s) is [the function applied to RD in Step 2 below]. + +How RD is Updated +----------------- + +In this system, the RD will decrease somewhat each time you play a game, +because when you play more games there is a stronger basis for concluding what +your rating should be. However, if you go for a long time without playing any +games, your RD will increase to reflect the increased uncertainty in your +rating due to the passage of time. Also, your RD will decrease more if your +opponent's rating is similar to yours, and decrease less your opponent's +rating is much different. + +Why Ratings Changes Aren't Balanced +----------------------------------- + +In the other system, except for provisional games, the ratings changes for the +two players in a game would balance each other out - if A wins 16 points, B +loses 16 points. That is not the case with this system. Here is the +explanation I received from Mark Glickman: + + The system does not conserve rating points - and with good + reason! Suppose two players both have ratings of 1700, + except one has not played in awhile and the other playing + constantly. In the former case, the player's rating is not + a reliable measure while in the latter case the rating is a fairly + reliable measure. Let's say the player with the uncertain rating + defeats the player with the precisely measured rating. + Then I would claim that the player with the imprecisely + measured rating should have his rating increase a fair + amount (because we have learned something informative from + defeating a player with a precisely measured ability) and + the player with the precise rating should have his rating + decrease by a very small amount (because losing to a player + with an imprecise rating contains little information). + That's the intuitive gist of my extension to the Elo system. + + On average, the system will stay roughly constant (by the + law of large numbers). In other words, the above scenario + in the long run should occur just as often with the + imprecisely rated player losing. + +Mathematical Interpretation of RD +--------------------------------- + +Direct from Mark Glickman: + +Each player can be characterized as having a true (but unknown) rating that +may be thought of as the player's average ability. We never get to know that +value, partly because we only observe a finite number of games, but also +because that true rating changes over time as a player's ability changes. But +we can *estimate* the unknown rating. Rather than restrict oneself to a +single estimate of the true rating, we can describe our estimate as an +*interval* of plausible values. The interval is wider if we are less sure +about the player's unknown true rating, and the interval is narrower if we are +more sure about the unknown rating. The RD quantifies the uncertainty in +terms of probability: + +The interval formed by Current rating +/- RD contains your true rating with +probability of about 0.67. + +The interval formed by Current rating +/- 2 * RD contains your true rating +with probability of about 0.95. + +The interval formed by Current rating +/- 3 * RD contains your true rating +with probability of about 0.997. + +For those of you who know something about statistics, these are not confidence +intervals, but are called "central posterior intervals" because the derivation +came from a "Bayesian" analysis of the problem. + +These numbers are found from the cumulative distribution function of the +normal distribution with mean = current rating, and standard deviation = RD. +For example, CDF[ N[1600,50], 1550 ] = .159 approximately (that's shorthand +Mathematica notation.) + +The Formulas +------------ + +Algorithm to calculate ratings change for a game against a given opponent: + +Step 1. Before a game, calculate initial rating and RD for each player. + + a) If no games yet, initial rating assumed to be 1720. + Otherwise, use existing rating. + (The 1720 is not printed out, however.) + + b) If no RD yet, initial RD assumed to be 350 if you have no games, + or 70 if your rating is carried over from ICC. + Otherwise, calculate new RD, based on the RD that was obtained + after the most recent game played, and on the amount of time (t) that + has passed since that game, as follows: + + RD' = Sqrt(RD^2 + c log(1+t)) + + where c is a numerical constant chosen so that predictions made + according to the ratings from this system will be approximately + optimal. + +Step 2. Calculate the "attenuating factor" due to your OPPONENT's RD, + for use in later steps. + + f = 1/Sqrt(1 + p RD^2) + + Here p is the mathematical constant 3 (ln 10)^2 + ------------- + Pi^2 400^2 . + + Note that this is between 0 and 1 - if RD is very big, + then f will be closer to 0. + +Step 3. r1 <- your rating, + r2 <- opponent's rating, + + 1 + E <- ---------------------- + -(r1-r2)*f/400 <- it has f(RD) in it! + 1 + 10 + + This quantity E seems to be treated kind of like a probability. + +Step 4. K = q*f + -------------------------------------- + 1/(RD)^2 + q^2 * f^2 * E * (1-E) + + where q is a mathematical constant: q = (ln 10)/400. + +Step 5. This is the K factor for the game, so + + Your new rating = (pregame rating) + K * (w - E) + + where w is 1 for a win, .5 for a draw, and 0 for a loss. + +Step 6. Your new RD is calculated as + + RD' = 1 + ------------------------------------------------- + Sqrt( 1/(RD)^2 + q^2 * f^2 * E * (1-E) ) . + +The same steps are done for your opponent. + +Further information +------------------- + +A PostScript file containing Mark Glickman's paper discussing this ratings +system may be obtained via ftp. The ftp site is hustat.harvard.edu, the +directory is /pub/glickman, and the file is called "glicko.ps". It is +available at http://hustat.harvard.edu/pub/glickman/glicko.ps. + +Credits +------- + +The Glicko Ratings System was invented by Mark Glickman, Ph.D. who is +currently at the Harvard Statistics Department, and who is bound for Boston +University. + +Vek and Hawk programmed and debugged the new ratings calculations (we may +still be debugging it). Helpful assistance was given by Surf, and Shane fixed +a heinous bug that Vek invented. + +Vek wrote this helpfile and Mark Glickman made some essential +corrections and additions. + + Last major update: April 19, 1995. + Minor revisions: August 28, 1995 by Friar. + diff --git a/lasker-2.2.3/data/help/gm_game b/lasker-2.2.3/data/help/gm_game new file mode 100755 index 0000000..5165593 --- /dev/null +++ b/lasker-2.2.3/data/help/gm_game @@ -0,0 +1,18 @@ + +[Event "ICS game"] +[Site "krypton"] +[Date "1995.07.06"] +[Round "-"] +[White "GMSeirawan"] +[Black "GMLarsen"] +[Result "1/2-1/2"] +[TimeControl "7200"] + +1. d4 Nf6 2. c4 e6 3. Nf3 b6 4. Nc3 Bb7 5. Bg5 Be7 6. e3 c5 7. dxc5 bxc5 8. +Be2 O-O 9. Qc2 Nc6 10. Rd1 a6 11. O-O Qc7 12. Rd2 Rfd8 13. Rfd1 d6 14. h3 +Rd7 15. Qb1 Rad8 16. Bf4 h6 17. Bg3 Qb6 18. e4 e5 19. Nd5 Nxd5 20. cxd5 Nd4 +21. Nxd4 cxd4 22. Rc2 Rc7 23. Rxc7 Qxc7 24. Rc1 Qb6 25. Bd3 h5 26. f3 Bg5 +27. Rc4 Rc8 28. b3 Be3 29. Kf1 Rxc4 30. bxc4 Qxb1 31. Bxb1 Kf8 32. Bc2 Bc1 +33. Ke2 Ba3 34. f4 f6 35. Ba4 Bc8 36. f5 Kf7 37. Be1 g6 38. fxg6 Kxg6 39. +Be8 Kg5 40. Bd2 Kh4 41. Be1 1/2-1/2 + diff --git a/lasker-2.2.3/data/help/gnotify b/lasker-2.2.3/data/help/gnotify new file mode 100644 index 0000000..58faad3 --- /dev/null +++ b/lasker-2.2.3/data/help/gnotify @@ -0,0 +1,18 @@ + +gnotify + +Usage: +|-|= gnotify [user] + + When a player is on your gnotify list, you will be notified when that player +begins a game on the server. Here are the possible variations of the command: + + +gnotify user Add "user" to gnotify list + -gnotify user Remove "user" from gnotify list + =gnotify Display your gnotify list + + Use "gin" variable to be notified regarding all games and when they begin. + +See Also: addlist gin variables + +[Last modified: October 18, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/goboard b/lasker-2.2.3/data/help/goboard new file mode 100755 index 0000000..eef5292 --- /dev/null +++ b/lasker-2.2.3/data/help/goboard @@ -0,0 +1,13 @@ + +goboard + +Usage: goboard player + + This command is used by a person holding a simul match. Play moves to the +board for the specified player in a simul match. Standard aliases are "go +player" and "goto player". + +See Also: gonum simnext simprev simuls + +[Last modified: July 7, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/gonum b/lasker-2.2.3/data/help/gonum new file mode 100755 index 0000000..69fcd4b --- /dev/null +++ b/lasker-2.2.3/data/help/gonum @@ -0,0 +1,12 @@ + +gonum + +Usage: gonum # + + This command is used by a person holding a simul match. Play will move to +board number # in the simul match. + +See Also: goboard simnext simprev simuls + +[Last modified: July 7, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/handle b/lasker-2.2.3/data/help/handle new file mode 100755 index 0000000..209fcef --- /dev/null +++ b/lasker-2.2.3/data/help/handle @@ -0,0 +1,26 @@ + +handle + + Your server account name is known as your "handle." It is your identity on +the server. Some users prefer to have handles similar to their real names; +others do not. The choice is up to you. But whatever you decide to have as +your handle, please be aware that handles for registered users are permanent. +Admins do not change handles for registered users except in extreme cases +(very rare). So please select a handle that you will feel comfortable with +for a long time. + + No two users can have the same handle, of course. To see which handles have +already been taken, use the "handles" command. + + Lastly, admins reserve the right to deny your using a particular handle. If +the handle you want is offensive or might lead to too much confusion among +users (such as various reserved words or commands), you may be asked to change +it. Profane and crude handles are not permitted. Unregistered users who +logon with profane and/or crude handles may be disconnected from the server, +even without warning. Unregistered users who persist in adopting +inappropriate handles may be prevented from accessing the server. + +See Also: handles register + +[Last modified: July 19, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/handles b/lasker-2.2.3/data/help/handles new file mode 100755 index 0000000..f680235 --- /dev/null +++ b/lasker-2.2.3/data/help/handles @@ -0,0 +1,15 @@ + +handles + +Usage: handles [string] + + Displays a list of registered players who have handles matching "string". +For example, the command "handles e" would display all handles beginning with +"e". "Handles" can also be used to determine if the player [string] has an +account on the server. The "handle" help file explains aspects of a server +handle. + +See Also: handle who + +[Last modified: October 9, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/hbest b/lasker-2.2.3/data/help/hbest new file mode 100755 index 0000000..20b5e85 --- /dev/null +++ b/lasker-2.2.3/data/help/hbest @@ -0,0 +1,20 @@ + +hbest + +Usage: hbest [b|s|w] + + Displays the 20 highest-rated human players in the three different ratings +categories: Blitz, Standard and Wild. Computers are excluded from the +listing. Use "best" to see the top 20 users, both humans and computers. + + Using "hbest" alone will give all three lists. Using one or more of the +arguments b, s or w is a request to give only the blitz, standard and/or wild +best lists, respectively. For example, "best bw" will show the top 20 humans +in the blitz and wild chess; the top standard players will not be listed. + + Use "hrank" and "rank" to see where a given player is ranked. + +See Also: best hrank rank + +[Last modified: October 8, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/help b/lasker-2.2.3/data/help/help new file mode 100755 index 0000000..cd8b056 --- /dev/null +++ b/lasker-2.2.3/data/help/help @@ -0,0 +1,24 @@ + +help + +Usage: help [topic] + + Prints information on the given topic. If topic is omitted, then "help" +will provide instructions for displaying several, useful help files. Also, +typing "help commands" will list all commands. + + When you request information about a command, the help file will describe +the format for the command ("Usage"). Words in square brackets [] designate +optional variables; including them affects the way your command will be +processed. + + Some help files are longer than one screen. To continue reading the file, +type "next" (or its alias "more"). + + If you need help while on the server, use channel 1 to contact people who +can help you (see chan_1 help file). + +See Also: chan_1 index intro_information intro_welcome next + +[Last modified: October 8, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/highlight b/lasker-2.2.3/data/help/highlight new file mode 100755 index 0000000..7f3e8ec --- /dev/null +++ b/lasker-2.2.3/data/help/highlight @@ -0,0 +1,20 @@ + +highlight + +Usage: set highlight [0-15] + + Highlight is one of the variables you can change with the "set" command. +When highlight is non-zero and you receive a personal tell, the sender's +handle will be displayed in a different style thus making the tell more +obvious on your screen. Other information, such as your location in a ranking +list or who list, will also be displayed to you in a different style thus +making it easier to read. + + There are 15 possible styles. However, the way they appear on your screen +will depend on many factors. Try they out to see which style works best for +you. "Set highlight 0" turns the highlight to neutral (off). + +See Also: rank set tell variables who + +[Last modified: October 8, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/history b/lasker-2.2.3/data/help/history new file mode 100755 index 0000000..bb8a32c --- /dev/null +++ b/lasker-2.2.3/data/help/history @@ -0,0 +1,58 @@ + +history + +Usage: history [user] + + Shows the results of the last 10 or so games that 'user' played. If no +user handle is specified, your history will be displayed to you. There are +columns in the history display for the players and their ratings (as +adjusted by the result of the match), the winner, the type of match +(blitz/standard, rated/unrated), the type of opening and the date. + + +EXAMPLE + + Here is the history header, a sample line from User 1's history file, and an +explanation of this line: + + Opponent Type ECO End Date +23: + 1681 W 1521 User 2 [ br 2 12] A84 Res Fri Apr 21 06:29:12 1995 + + Explanation + -------------------------------------------------------------------------- + 23 -- Game number in User 1's history + + -- User 1's result; '+' means Won; '-' means Lost; '=' means Draw. + 1681 -- User 1's revised rating given the result + W -- User 1's color in the match + 1521 -- User 2's revised rating given the result + br -- Category of game -- 'b' Blitz; 'd' bughouse; 'l' Lightning; + 'n' Nonstandard times; 's' Standard; 'u' Untimed; 'w' Wild + Rated/unrated --'r' Rated; 'u' Unrated + a 'p' in fron of these codes would mean a Private match + 2 12 -- The time controls for the match + ECO -- The ECO (Encyclopedia of Chess Openings) classification of the + opening moves of the match + Res -- How the match ended; 'Res' for Resignation; 'Mat' for Mate; 'Fla' + for Flag, or time forfeit; 'Agr' for Agreed to a draw; 'Rep' for + three-time Repetiion of position (same player to move); 'NM' for + Neither player has Material for delivering mate; 'Adj' for result + was adjudicated. + The date and time of the match are also given. + + Here is how to read this example: User1 (playing White; blitz rating now +1681) Won (+) against User2 (blitz rating now 1521) in a rated (r) blitz (b) +match using the time controls of 2 minutes to start and 12 second increments +on Friday April 21, 1995, at 06:29 hours when User 2 resigned (Res); the type +of opening (ECO) was A84. + +SPECIAL NOTES: + +(a) ECO will not be given for games that are "private" (see the variables help + file). + +(b) Games in history can now be examined. + +See Also: adjudication eco examine games match variables + +[Last modified: December 19, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/hrank b/lasker-2.2.3/data/help/hrank new file mode 100755 index 0000000..9d021f8 --- /dev/null +++ b/lasker-2.2.3/data/help/hrank @@ -0,0 +1,33 @@ + +hrank + +Usage: hrank [user [b][s][w]] + hrank m-n [b][s][w] + + The first usage shows the ranking of the given user and all human users with +nearby rankings -- computers will be excluded from the rankings. A second +argument with one or more of the letters b, s, and/or w asks to show only +blitz, standard, and/or wild ratings respectively. If no second argument is +given, rankings for all three types are shown. For example, "rank foo bw" +shows the blitz and wild ranking of the player whose handle is "foo". If +'user' is omitted, your rankings will be displayed. + + The second usage shows all human users ranked between the rankings of M and +N. The optional third argument again limits which ratings are shown. For +example, "rank 1-30 sw" lists the human users with the highest 30 standard and +wild ratings. "hbest" lists the top 20 human users in a category. + + The columns are always sorted by blitz, then standard, then wild. + + Currently, all players with at least 20 games of a particular rating type +are ranked. If you ask for a player's rank and they do not yet have the 20 +games needed to be an active player, the player's current rating will be +displayed in the table but a line (----) will precede the handle to indicate a +provisional ranking. + + To include computers in the list, use "rank". + +See Also: best hbest rank + +[Last modified: June 13, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/inchannel b/lasker-2.2.3/data/help/inchannel new file mode 100755 index 0000000..aa1d957 --- /dev/null +++ b/lasker-2.2.3/data/help/inchannel @@ -0,0 +1,14 @@ + +inchannel + +Usage: inchannel [0-99] + + Lists all users currently listening to the given channel. If the +channel number is omitted, then all users listening to all channels +are displayed. With this listing, you can tell which users will hear +something you tell a given channel. + +See Also: channel tell + +[Last modified: June 11, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/index b/lasker-2.2.3/data/help/index new file mode 100755 index 0000000..037647d --- /dev/null +++ b/lasker-2.2.3/data/help/index @@ -0,0 +1,20 @@ + +index + +Usage: index [topic] + + Prints information on the given topic. If topic is omitted, then "index" +will list the various topics in the index. + + When you request information about a topic, you will be given a list of +various commands that relate to that topic as well as information files of +interest. You can access files on the various commands and information files +using the "help" command. + + If you need help while on the server, use channel 1 to contact people who +can help you (see chan_1 help file). + +See Also: chan_1 help intro_information intro_welcome + +[Last modified: July 20, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/inetchesslib b/lasker-2.2.3/data/help/inetchesslib new file mode 100755 index 0000000..c44c8ca --- /dev/null +++ b/lasker-2.2.3/data/help/inetchesslib @@ -0,0 +1,184 @@ +The Internet Chess Library -- An anonymous ftp archive at chess.onenet.net +(this file may be somewhat out of date! :-) ) + +The chess archive consists of the content of the directory tree contained +in /pub/chess. At the top level of this tree are a few informational files +which are briefly described below (the contents of these files will be +updated from time to time): + + ICS.getting-started + This is an old introduction to the ICS (internet chess server). + The information will apply somewhat to the current server, but it + has changed a great deal since this was written. + README + This is a file containing a welcome message and a statement of the + general purpose and intent of the archive. + README.archive-structure + This file. + README-pictures-of-netchessplayers + This tells how you might donate a digitized picture of yourself or + a chessplayer you know into the archive. + README-where_is_ICS.info + This is a 'link' to the file containing the current Internet + locations of the main ICS's (currently, one in USA and one in + Europe.) + README.too + This is an informational note related to finding recently uploaded + data. + chess-FAQ + This is the Chess FAQ (Frequently Asked Questions, and answers). + gnu-chess-FAQ + This is a FAQ for GnuChess, a public domain chess playing program + from the GNU (Gnu's Not Unix) project -- part of the Free Software + Foundation. + ls-lR + This is a complete listing of the current contents of the archive, + without descriptions. Filenames only. A Index with descriptions + is probably not a possibility at this time because of the limited + resources of the current maintainer. (Any help on this would be + greatly appreciated) + where_is_ICS.info + This is the info file for the locations of the ICS's. + README-where_is_ICS.info is linked to this file. + + + +The rest of the archive is divided into a number of subdirectories which +attempt to classify the data somewhat. Below is a listing of directories +in this archive and what one might expect to find there. + + +/pub/chess/ + Amiga/ Software and data for/related to Amiga computers. + Atari/ Software and data for/related to Atari computers. + CBUFF/ Files and data for the CBUFF (ChessBase Utilities + File Format) project. + Atari/ + DOS/ + Macintosh/ + Unix/ + data/ + doc/ + src/ + DOS/ Software and data for/related to IBM PC compatible + computers running DOS/Windows. + Bookup/ Bookup data files. This is a link to the + directory: + Game-Databases/Bookup/ + ChessAssistent/ ChessAssistent data files. This is a link to the + directory: + Game-Databases/ChessAssistent/ + ChessBase/ ChessBase data files. This is a link to the + directory: + Game-Databases/ChessBase/ + NicBase/ NicBase data files. this is a link to the + directory: + Game-Databases/NicBase/ + Tools/ Utility programs for DOS. Archiving and + compression utilities needed to unpack most of + the data in this archive may be found here for + DOS. + Game-Databases/ This is a directory tree dedicated to Chess game + databases in varying formats. Utilities to + convert from one format to another may be found + in the Tools directory. + Bookup/ Bookup database files. + ChessAssistent/ ChessAssistent database files. + Tools/ Utilities for manipulating/converting ChessAssistent + data files. This is a link to the directory: + Game-Databases/Tools/ChessAssistent/ + ChessBase/ ChessBase database files. + Tools/ Utilities for manipulating/converting ChessBase + data files. This is a link to the directory: + Game-Databases/Tools/ChessBase/ + ChessBase_CBUFF/ ChessBase database files from the CBUFF project. + This is a link to the directory: CBUFF/data/ + NicBase/ NicBase database files. + Tools/ Utility programs for manipulating/converting + NicBase files. This is a link to the directory: + Game-Databases/Tools/NicBase/ + PGN/ This is the PGN (Portable Game Notation) project + directory tree. It contains utilities for the + PGN format (including tools for converting + between other formats) and game databases in + the format. A DOS program for viewing these + databases is available. + Events/ PGN format data files of events in specific years. + 1990/ + 1993/ + 1994/ + MGR/ The MASTER GAME REPOSITORY directory. contains + (or soon will) thousands of games in PGN format. + Players/ PGN data file of games for specific players: + Kasparov, Tal, Fischer, Karpov, Polgar, and + others! + Tools/ Utilities for PGN data files. Conversion tools + and a reader. + Tools/ Utility programs for all Databasse formats in the + Game-Databases area. + ChessAssistent/ + ChessBase/ + NicBase/ + PGN/ This is a link to the directory: + Game-Databases/PGN/Tools/ + HTML/ Hypertext files. For use with Mosaic (WWW) + clients. If you don't know what this is, don't + worry. It's specific to distributed + information over the Internet. + ICS_help/ All the help files for the ICS. + Macintosh/ Software and data for/related to Macintosh's. + NeXT/ Software and data for/related to NeXT computers. + PGN/ This is the PGN (Portable Game Notation) project + directory tree. It contains utilities for the + PGN format (including tools for converting + between other formats) and game databases in + the format. A DOS program for viewing these + databases is available. This is a link to the + directory: Game-Databases/PGN/ + SAN_testsuites/ This is a collection of test positions for testing + the problem solving capabilities of chess + software. These files are related to the SAN + (Standard Algebraic Notation) project, the + distribution of which may be obtained in the + Unix/ directory. SAN utilities and datafiles + use PGN. + Unix/ Software and data for/related to Unix OS. + X/ Software and data for/related to X-Windows. + chessbits/ Archives of the Chessbits Electronic magazine + which will probably not come back to life, + although an occasional ICS-Newsletter seems to + have picked up the slack. These are found in + texts/ + dropoff/ A place to drop things off where no-one but the + archive maintainer can get to them. Please + accompany anything with a brief note. + ics-tourn/ Data and games related to tournaments held on the + ICS's. + masters/ Collections of games for masters and tournaments + in ascii format primarily (some are PGN + compatible) + matches/ + WCC_1993/ Games of the World Chess Championships in 1993. + Fide men's and women's and the PCA match as well. + pictures/ digitized pictures of chess related art and/or + chess players both famous and not so famous. + projects/ A directory tree for software projects donated to + the archive. Not necessarily chess related. + metagame/ + morph/ + texts/ General texts of materials, analysis and some game + scores. A grab-bag of chess related materials. + PCA_Qualifiers_1993/ + uploads/ A directory containing lots of subdirectories for + donating materials to the archive. Pick an + appropriate directory here for your upload. + windows/ Here is where new applications for MSwindows or + other brands of windows for the IBM PC reside. + This area is new, so many windows applications + still are in th DOS directory. + xchange/ A place for data/software you want to make + available to everyone but which you might not + want to place in a 'permanent' area do to it's + developmental/experimental nature. + + diff --git a/lasker-2.2.3/data/help/interfaces b/lasker-2.2.3/data/help/interfaces new file mode 100755 index 0000000..3175913 --- /dev/null +++ b/lasker-2.2.3/data/help/interfaces @@ -0,0 +1,216 @@ + +interfaces + + It is possible to play chess matches on the server by typing your moves and +having board positions displayed in a simple style. However, it is also +possible to use a graphics interface for making moves and displaying board +positions. A graphics interface is a software program designed to decode the +information sent to you by FICS and display board information using stylized +graphics. It also allows you to make moves by moving pieces on its board +using a mouse. + + Which graphics interface will work best for you will depend upon the kind +of computer you are using, and the way you are being connected to the server. +Many graphics interfaces are available at the main chess ftp site +(ics.onenet.net). Feel free to ask FICS users about what is working best for +them, and feel free to examine the files at ics.onenet.net. + + If you use a graphics interface, you will need to select the board style +that is most appropriate for your software. + +See Also: set style variables + + +List of interfaces +------------------ + + Listed in this helpfile are details of graphical interfaces. Often it is +difficult to play chess using the 'ASCII' boards the server generates. They +aren't easy to see, and are affected by other information such as shouts. The +graphical ones give you a proper chess board on which to view your pieces, +making your chess easier to play. + +Here's a summary: + +============================================================================= +Graphical Required Computer Operating Interface Location +Interface System and Software Program at ICL +Program Author +============================================================================== +ZIICS # DOS, modem Zek pub/chess/DOS +GIICS DOS, modem LLama pub/chess/DOS +Monarc DOS, modem *Kevster pub/chess/DOS +JIICS DOS, VGA, modem, mouse Peluri pub/chess/DOS +NGIICS DOS, TCP/IP LLama pub/chess/DOS +Raja # MS Win3, modem and SLIP/PPP Christian pub/chess/Win3 +Gilchess MS Win3, modem Bloodrake pub/chess/Win3 +bludrake MS Win3, modem Bloodrake pub/chess/Win3 +SLICS # MS Win3, TCP/IP dfong pub/chess/Win3 +Toolkit ## MS Win3, TCP/IP and/or modem MaDHaTteR pub/chess/Win3 +WinBoard WinNT or W95, TCP/IP and/or modem mann pub/chess/Win3 +PMICS OS/2, TCP/IP and/or modem woof pub/chess/DOS +XBoard # Unix, X11R4, TCP/IP and/or modem mann pub/chess/X +xics Unix, X11R3 , TCP/IP *observer pub/chess/X +cics TCP/IP and C, ASCII terminal *observer pub/chess/Unix +NeXTICS NeXT, TCP/IP and/or modem red pub/chess/NeXT +MacICS Mac *douglas pub/chess/Macintosh +E-ICS Mac, Modem *douglas pub/chess/Macintosh +MacICS-TCP Mac, TCP/IP eew pub/chess/Macintosh +Aics Amiga, TCP/IP and/or modem Christian pub/chess/Amiga +AmyBoard Amiga, TCP/IP and/or modem JochenW pub/chess/Amiga +============================================================================== + +# Recommended and popular. +## Not yet working well on FICS. +* No account on FICS yet. + +Note: The handles of the authors may refer to the handles of people at the + old Aics. Certain ones may be different people here or non-existent. + Most interfaces should work; both the authors and the FICS programmers + would like feedback if you have problems with one here. + + + The listing will explain which interfaces will run on your particular +set-up and in which directory to find it. It may have comments from the +users/authors of the interfaces to help you choose. + + If you have any further questions or trouble please contact an admin. + +Instructions for getting an interface +------------------------------------- + + The above graphical interfaces can be found at the anonymous ftp site +chess.onenet.net (URL: ftp://ftp.onenet.net/) Most come with some +instructions. :-) + + Pick one, use ftp (read the "ftp_hints" help file for assistance), Netscape +or some similar software to access it over the Internet, transfer it to your +local PC system or workstation via your preferred method (zmodem, kermit for +most non tcp/ip dialup connections), unpack it (most use standard archival +software or are self-extracting), and set it up. :-) + +Comments on interfaces +---------------------- + + This listing will explain the interfaces in a little more detail. Many have +comments from the users/authors of the interfaces. Also indicated are the +directories at onenet.net that hold the interfaces. + + If you have any further questions or trouble please contact an admin. + + +PC and compatibles (Using DOS and modem): pub/chess/DOS +----------------------------------------- + + ZIICS by Zek: + A very popular interface for the PC. ZIICS requires a regular modem + connection and a graphics adapter (VGA, EGA, CGA or Hercules). In VGA + there are several styles of sets from 32 pixels per square to 56 pixels + per square (almost fills the screen vertically). You can configure the + colors and the functions of the buttons by editing a text file. + [comment by Zek] + + GIICS by LLama: + + JIICS by Peluri: + You will need VGA and a mouse to use this. + + Monarc by Kevster: + + +PC and compatibles (Using DOS and TCP/IP): pub/chess/DOS +------------------------------------------ + + NGIICS by LLama: + + +PC and compatibles (Using Windows and modem): pub/chess/Win3 +--------------------------------------------- + + Raja (elephant) by Christian: + Works well with Win95. Noticable speed increase (and its not even 32 bit + yet!). Tested with 486-DX4-100. [note from Christian] + + Gilchess by Azorduldu: + + bludrake by Bloodrake: + + +PC and compatibles (Using Windows and TCP/IP): pub/chess/Win3 +---------------------------------------------- + + SLICS by dfong: + + Toolkit by MaDHaTteR: + Should work here soon. + + +PC and compatibles (Using Windows NT(or 95) and TCP/IP): pub/chess/Win3 +-------------------------------------------------------- + + WinBoard by mann: + finger mann for the latest details. + + +PC and compatibles (OS/2 PM ): pub/chess/DOS +------------------------------ + + PMICS by woof: + + +Unix (Xwindows): pub/chess/X +---------------- + + XBoard by mann: + Certainly the best of the Unix interfaces and still is being supported to + work better at FICS. Owners of Unix machines are well advised to get this + interface. It is also suitable for use with GNUchess. [comment by DAV] + Finger mann for the latest details. + + xics by observer: + + +Unix (vt100 terminal): pub/chess/Unix +---------------------- + + cics by observer: + + +NeXT: pub/chess/NeXT +----- + + NeXTICS by red: + + +MAC: pub/chess/Macintosh +---- + + MacICS by douglas: + + +MAC (Modem): pub/chess/Macintosh +------------ + + E-ICS by douglas: + + +MAC (TCP\IP): pub/chess/Macintosh +------------- + + MacTCP by eew: + + +Amiga: pub/chess/Amiga: +------ + + Aics by Christian: + Will work with 2.04 Kickstart and should be compatible with newer + versions. + + AmyBoard by JochenW: + + +See also: ftp_hints + +[Last modified: December 25, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/intro0 b/lasker-2.2.3/data/help/intro0 new file mode 100755 index 0000000..da2264a --- /dev/null +++ b/lasker-2.2.3/data/help/intro0 @@ -0,0 +1,44 @@ + +intro0 + + W E L C O M E + + to the + + F R E E I N T E R N E T C H E S S S E R V E R (FICS) + + + We have created several information files for users of this chess server. +The files describe different features of the server and give you some +suggestions on how these features can help you enjoy internet chess. Here is +a directory of the information files and what topics each file covers: + + File Topics + ------ -------------------------------------------------- + intro1 General information + intro2 Communicating + intro3 Displaying information + intro4 Setting your preferences + intro5 Special functions + intro6 Chess matches + intro7 Making moves in a chess match + + To read information from one of these files, simply type "help intro#" using +the appropriate number. If you have questions after reading the files, there +are several things you can do. (1) Read the help file for a command you have +a question about; your answer might be there. (2) Contact users, especially +administrators of the server (known as "admins"); they are very helpful. + + To read a help file, type "help [topic]", without the square brackets, +however. If the topic is a command, the help file will give you information +about the format for the command. You can tell that it is a command because +the first line will describe its format ("Usage"). Words in square brackets +[] designate optional variables; including them affects the way your command +will be processed. In many cases, a help file will suggest other help files +you may want to read. + + Your suggestions about the information files (and help files, too) are +welcome. Feel free to "message helpfiles" with your comments. + +[Last modified: June 16, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/intro1 b/lasker-2.2.3/data/help/intro1 new file mode 100755 index 0000000..82bf7b4 --- /dev/null +++ b/lasker-2.2.3/data/help/intro1 @@ -0,0 +1,35 @@ + +intro1 + +GENERAL INFORMATION + + The internet has great capabilities for connecting people from all over +the world. This chess server is one way for networking individuals who enjoy +chess. Among other things, the chess server allows users to play chess +matches against each other, as well as communicate with each other. The chess +server (computer) is programmed to send players' chess moves and messages to +the right users. It also keeps track of various information. + + In order to use the features, you need to type various commands. To list +the various commands, type "help". To get a description of a particular +command, type "help [command]" -- without the square brackets, of course. +NOTE: you do not have to type the entire command in order to use it or read +its help file; typing the first few letters will work in most cases. + + In general, commands do one of four things: (a) send a message to one or +more users (see intro2), (b) display information to you (see intro3), (c) +modify one of your settings/features/functions (see intro 4), or (d) have the +server perform a special function. Certain commands are restricted to server +administrators ("admins") and cannot be used by regular users. + + New users might want to start off with simple features and gradually learn +about the other features as you go along. The server allows you to determine +how various information is sent to you. For example, you can decide how a +position in a chess game is displayed (see style). You can also set your +preferences about the types of chess matches you would like to have or types +of messages you receive from others (see variables). + +See Also intro2 intro3 intro4 intro5 + +[Last modified: June 16, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/intro2 b/lasker-2.2.3/data/help/intro2 new file mode 100755 index 0000000..d0c060f --- /dev/null +++ b/lasker-2.2.3/data/help/intro2 @@ -0,0 +1,63 @@ + +intro2 + +COMMUNICATING + + Communications among users are of two types: (a) messages, and (b) requests. +Messages basically involve conversations among users; the server merely +transmits the messages. Requests are different because they involve the +server doing something about or during a chess match. + + +MESSAGES + + Suppose you want to say something to one or more users. There are several +commands you could use: + + command function + ------- -------------------------------------------- + message Send a user a message to be stored, even if the user is + not logged on at that time + tell Talk to one user, or users on one channel + xtell Talk to one user, but allow for a continuing conversation + with another user + channel Listen to tells sent to a given channel + say Talk to the user you are playing chess with (or just + played a game with) + shout Talk to all users who are open to shouts + cshout Talk to all users who are open to shouts; message must be + about chess + it Special kind of shout + kibitz Talk to all players and observers of a specific chess game + whisper Talk to all observers of a specific chess game + censor Prevents a given user's messages from reaching you + + Read more about these commands in their own help files. But, in general, +"message" works like an answering machine, "tell" and "say" are like normal +one-to-one conversations, "shout", "cshout" and "it" are for group talks, +and "kibitz" and "whisper" are for commenting on a chess match you are +observing. Please observe chess server etiquette guidelines when using these +commands. + + +REQUESTS + + Users need to make agreements about the kinds of chess matches they will be +playing. They also need to make agreements about various situations during +the play of a chess match. Requests serve as ways to reach agreements as well +as take the agreed upon action. For example, users need to request the start +of a chess match. When a match has been agreed upon, the server will start a +match between those two users. During a match, one player may need to +adjourn; if an adjournment is agreed upon, the server will stop the match and +save the game so that it can be resumed later. Read intro6 for more +information about chess matches and these special requests. + + USEFUL HINT: At times, a lot of messages from various users will come across +your screen. To help you notice when a user has sent a message or request to +you personally (rather than to users on FICS), you can set the +highlight variable to to make them readily apparent (see highlight). + +See Also: etiquette intro6 [and the individual commands] + +[Last modified: June 16, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/intro3 b/lasker-2.2.3/data/help/intro3 new file mode 100755 index 0000000..3e75540 --- /dev/null +++ b/lasker-2.2.3/data/help/intro3 @@ -0,0 +1,46 @@ + +intro3 + +DISPLAYING INFORMATION + + There are several commands you can use for displaying general information: + + command information + ------- -------------------------------------------- + help describes a command, displays useful information, or + lists all commands and their help file topics alphabetically + info lists all help files for non-commands + who lists current users + games lists current games + allobservers lists all users observing a chess game (or games) + handle lists registered users with names beginning with a given + letter or letters + inchannel lists all users who are listening to a given communication + channel + uptime how long the server has been running since its last startup + date current date + time current time + statistics displays information about server usage + llogons lists the last 30 or so logons/logoffs + best displays highest ratings achieved for different types of + chess matches + fixes displays information about recent improvements + +Other commands display information about you or another user: + + command information + ------- -------------------------------------------- + finger displays general information about a user + history displays information about a user's recent matches + stored lists a user's stored games + pending lists requests that have been made to and by you but have + not yet been declined + variables displays a user's current preferences and settings + assess displays how you and another user's ratings would change + if you were to play a rated chess match + logons lists the last 10 or so logons for a user + +See Also: [the individual commands] + +[Last modified: June 16, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/intro4 b/lasker-2.2.3/data/help/intro4 new file mode 100755 index 0000000..7156093 --- /dev/null +++ b/lasker-2.2.3/data/help/intro4 @@ -0,0 +1,36 @@ + +intro4 + +SETTING YOUR PREFERENCES + + Everyone starts out with certain default values and settings, but you may +change them if you wish. You change settings using the set command; you can +view your current settings (or those of another user) using the variables +command. + + Some settings concern what information the server will transmit to you, such +as communications from other players and notifications about games starting or +users logging on/off. Other settings concern chess matches, such as your +default time controls, whether you will hear a bell when a new board +position is sent to you, whether you will be sent a list of the moves for your +game automatically when the game is completed (or adjourned), even the format +used to send you the board position. + + By changing these settings, you can create the kind of atmosphere you would +like to have. You can change these settings at any time, even during a given +session. For the most part, changes you make to your settings will be saved +after you log off and you will not need to change the settings each time you +log on. + + Your password is also a special setting, although it is never displayed at +any point. When you register, you are given a logon password. You may change +your password at any point using the password command. + + Lastly, it is possible for you to create special aliases to save you from +typing phrases you use often. Instead of typing the whole phrase, all you +do is type your alias. + +See Also: aliases password set variables + +[Last modified: June 16, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/intro5 b/lasker-2.2.3/data/help/intro5 new file mode 100755 index 0000000..b94fe56 --- /dev/null +++ b/lasker-2.2.3/data/help/intro5 @@ -0,0 +1,24 @@ + +intro5 + +SPECIAL FUNCTIONS + + There are several commands that perform special functions beyond sending +messages to other users, displaying information or modifying your settings. +Here are some useful ones: + + command function + ------- -------------------------------------------- + alias to make typing frequently-used phrases easier + mailmoves mails to you the moves of a user's game + mailoldmoves mails to you the moves of a user's last game + oldmoves allows you to view a user's last game + smoves displays moves of a stored game + sposition displays the last position of a stored game + +More functions will be added as time goes on. + +See Also: [the individual commands] + +[Last modified: June 16, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/intro6 b/lasker-2.2.3/data/help/intro6 new file mode 100755 index 0000000..cb70528 --- /dev/null +++ b/lasker-2.2.3/data/help/intro6 @@ -0,0 +1,50 @@ + +intro6 + +CHESS MATCHES + + This chess server's main purpose is to link users who want to play chess. +Among other things, the server allows you to contact other users about playing +chess matches, checks to make sure that your moves are legal, keeps track of +the board position while you play, and updates ratings of players after the +match. + + The basic way of contacting a user about playing a chess match is by using +the match command. There is a separate help file for the match command, so we +will not go into details here. But here is a list of the various commands +that you may want to learn about (remember that requests are sent to your +opponent, not to the server, and must be accepted by your opponent in order to +occur): + + command function + ------- -------------------------------------------- + match request a match with another user + abort request that a game be canceled + accept accept a request from a user + adjourn request that the match be stopped, saved and continued at + another time + decline decline a request from a user + draw request that the chess match be declared a draw + flag end the match because your opponent is out of time + moves have FICS send you the moves to the match you are playing + pause request that the match be suspended temporarily, but not + adjourned + promote set the kind of piece a pawn will be promoted to when it + reaches the back rank + refresh display the current board position + resign give your opponent the win, and end the match + say communicate with your current (last) opponent + switch request that you and your opponent change sides (colors) + takeback request that one or move moves be taken back (canceled) + unpause request that a paused match be resumed + withdraw cancel a request you have made + + It is possible to play matches with more than one user simultaneously, much +like a simultaneous exhibition at many major chess tournaments. If you are +interested in playing more than one chess game at once, or interested in +playing against someone with simultaneous matches, read the "simuls" file. + +See Also: match simuls [and the individual commands] + +[Last modified: June 16, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/intro7 b/lasker-2.2.3/data/help/intro7 new file mode 100755 index 0000000..d2d2296 --- /dev/null +++ b/lasker-2.2.3/data/help/intro7 @@ -0,0 +1,83 @@ + +intro7 + +MAKING MOVES IN A CHESS MATCH + + There are two ways to make chess moves during a match. Many user's have a +graphics interface. In this case, the user moves the piece on the graphics +board using the computer mouse, and the interface software translates this +move into chess notation and sends the move to the server for processing. +Read the interfaces information file for a few details about graphics +interfaces. + + If you don't have a graphics interface, you will need to enter your moves +using a keyboard. In order to do this, you have to know what kind of chess +notation the server uses. Chess players use one of two different notational +systems: descriptive and algebraic. The server understands algebraic. (The +server also understands a computer version of chess notation; see below.) + + In algebraic notation, each square has a unique label. Each rank is +labeled 1 to 8, with the rank on White's side being 1. Each file is +labeled a to h, with the file on White's left side being a. So each +square has a file label and a rank label, with the file listed first. In +algebraic notation, each chess piece has its own symbol: k = king; +q = queen; b = bishop; n = knight; r = rook; p = pawn (though the "p" is +not really used). + + Here is a sample of a match position as displayed in the default style 1. +For this example, White is at the bottom of the board and Black is at the top. +Symbols are in capital letters; the * means the piece is Black's. + + --------------------------------- + 8 | | *R| | | *R| | *K| | + |---+---+---+---+---+---+---+---| + 7 | *P| | | *B| *P| *P| *B| *P| + |---+---+---+---+---+---+---+---| + 6 | | | | | | *N| *P| | + |---+---+---+---+---+---+---+---| + 5 | *Q| | | *P| | | B | | + |---+---+---+---+---+---+---+---| + 4 | | | | | | P | | | + |---+---+---+---+---+---+---+---| + 3 | | | N | B | P | | | | + |---+---+---+---+---+---+---+---| + 2 | P | P | | | Q | | P | P | + |---+---+---+---+---+---+---+---| + 1 | | | R | | | R | K | | + --------------------------------- + a b c d e f g h + + Black's king (*K) is on the g8 square; White's king (K) is on the g1 +square, and so on. It is Black's move. Suppose Black wants to place the +knight (*N) on the e4 square. The move to enter in algebraic would be Ne4. +Moving pawns is simpler; you don't use the "p" for the piece and just give +the square the pawn is moving to. Suppose Black decides to move the pawn +(*P) on the h7 square to the h6 square. The move to enter would be h6. In +many board positions, more than one rook, knight or pawn could move to the +same square. In this case, you have to indicate which of the two pieces you +want to move. For example, suppose Black has knights on c2 and e2; they could +both move to d4. To move the knight on c2 to d4 you could type Ncd4, where +the "c" serves to tell the server which knight to move. + + In algebraic notation, captures are usually denoted by "x". Suppose +Black wants to capture White's b2 pawn (P) with the rook (R) on b8. Black +would enter the move Rxb2. However, the server would also understand the +simple Rb2 and know that a capture is implied. So, for this server, you can +enter the square the piece will capture on. To make a castle move, use O-O to +castle on the king's side and O-O-O to castle on the queen's side. + + Many computers want very explicit instructions on how to move pieces. +This "computer" notation has the following format: square_from-square_to + + For example, in the above board position, moving the Black rook from b8 to +b2 would be entered b8-b2. Piece symbols are never used; only the squares. +The server understands computer notation as well. + + In short, to move a piece during a chess match, enter the move. Each +time you and your opponent make a move, the server updates the board position +and sends the new position to both you and your opponent. It's that simple! + +See Also: interfaces style + +[Last modified June 16, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/intro_basics b/lasker-2.2.3/data/help/intro_basics new file mode 100644 index 0000000..ee698ca --- /dev/null +++ b/lasker-2.2.3/data/help/intro_basics @@ -0,0 +1,21 @@ + +intro_basics + + Here is a summary chart for new users of the server with basic commands you +may want to use as you start to play chess live on the internet. + +In order to ... Type ... +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Get assistance or an answer to a question [Step 1] +chan 1 + [Step 2] tell 1 +Turn shouts off set shout 0 +Read a help file help file_name +Select an appropriate graphics interface help interfaces +Download a graphics interface help ftp_hints +Talk to just one individual tell user_name +Challenge a user to a chess match match user_name + +See Also (these other help files): help index intro_welcome intro_talking + +[Last modified: December 19, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/intro_general b/lasker-2.2.3/data/help/intro_general new file mode 100755 index 0000000..ef73393 --- /dev/null +++ b/lasker-2.2.3/data/help/intro_general @@ -0,0 +1,41 @@ + +intro_general + +GENERAL INFORMATION + + The internet has great capabilities for connecting people from all over the +world. This chess server is one way for networking individuals who enjoy +chess. Other chess servers (at least those we know about) are listed in the +"addresses" file. Among other things, a chess server allows users to play +chess matches against each other, as well as communicate with each other. The +chess server (computer) is programmed to send players' chess moves and +messages to the right users. It also keeps track of various information. + + In order to use the features, you need to type various commands. In +general, commands do one of four things: (a) help you play a chess match (see +intro_playing), (b) send a message to one or more users (see intro_talking), +(c) display information to you (see intro_information), (d) modify one of your +settings, variables or notes (see intro_settings), or (e) have the server +perform a special function (see intro_special). + + Certain commands are restricted to server administrators ("admins") and +cannot be used by regular users. Some features are only available for +registered users. Only registered users can have rated chess games, have +games stored after adjournment, have "finger" notes, and communicate using +"shout", "kibitz" and "message" (see "intro_talking" help file). If you +intend to visit the server often, you will enjoy your visit more as a +registered user. Registration on this server is by email; type "help +register" to learn the procedure. + + New users might want to start off with simple features and gradually learn +about the other functions as they go along. To get a description of a +particular command, type "help [command]" -- without the square brackets, of +course. For example, "help match" will give you information about the "match" +command. NOTE: you do not have to type the entire command in order to use it +or read its help file; typing the first few letters will work in most cases. + +See Also: addresses adm_info finger intro_basics intro_information +intro_settings intro_special intro_talking notes register + +[Last modified: September 28, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/intro_information b/lasker-2.2.3/data/help/intro_information new file mode 100755 index 0000000..c65e5da --- /dev/null +++ b/lasker-2.2.3/data/help/intro_information @@ -0,0 +1,67 @@ + +intro_information + +DISPLAYING INFORMATION + + There are several types of information that are available about users, games +and the server. You can have this information displayed to you by using +various commands. + + +USER INFORMATION + + command information + ------- -------------------------------------------- + best Displays highest ratings achieved for different types of + chess matches (includes computers) + finger Displays general information about a user + handle Lists registered users with names beginning with a given + letter or letters + hbest Displays highest ratings achieved for different types of + chess matches (excludes computers) + history Displays information about a user's recent matches + hrank Lists users and ratings within the range of ranks specified + (rankings exclude computers) + inchannel Lists all users who are listening to a given communication + channel + rank Lists users and ratings within the range of ranks specified + (rankings include computers) + stored Lists a user's stored games + variables Displays a user's current preferences and settings + who Lists current users + + +GAME INFORMATION + + command information + ------- -------------------------------------------- + allobservers Lists all users observing a chess game (or games) + assess Displays how you and another user's ratings would change + if you were to play a rated chess match + eco Displays information about the opening used in the game + games Lists current games + + +SERVER INFORMATION + + command information + ------- -------------------------------------------- + date Current date + help Describes a command, displays useful information, or + lists all commands and their help file topics alphabetically + info Lists all "information" help files for non-commands + llogons Lists the last 30 or so logons/logoffs + logons Lists the last 10 or so logons for a user + news Lists recent news items about the server + statistics Displays information about server usage + time Displays current time at the server site + uptime Displays how long the server has been running since its last + startup, and various server statistics and parameters + + Also, the "totals" help file gives updated information about registered and +active users on the server. + +See Also: [the individual commands] + +[Last modified: July 7, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/intro_moving b/lasker-2.2.3/data/help/intro_moving new file mode 100755 index 0000000..b156bc8 --- /dev/null +++ b/lasker-2.2.3/data/help/intro_moving @@ -0,0 +1,83 @@ + +intro_moving + +MAKING MOVES IN A CHESS MATCH + + Once you have arranged for a match, you begin playing and moving the pieces +around. There are two ways to make chess moves during a match. Many user's +have a graphics interface. In this case, the user moves the piece on the +graphics board using the computer mouse, and the interface software translates +this move into chess notation and sends the move to the server for processing. +Read the interfaces information file for a few details about graphics +interfaces. + + If you don't have a graphics interface, you will need to enter your moves +using a keyboard. In order to do this, you have to know what kind of chess +notation the server uses. Chess players use one of two different notational +systems: descriptive and algebraic. The server understands algebraic. (The +server also understands a computer version of chess notation; see below.) + + In algebraic notation, each square has a unique label. Each rank is labeled +1 to 8, with the rank on White's side being 1. Each file is labeled a to h, +with the file on White's left side being a. So each square has a file label +and a rank label, with the file listed first. In algebraic notation, each +chess piece has its own symbol: k = king; q = queen; b = bishop; n = knight; r += rook; p = pawn (though the "p" is not really used). + + Here is a sample of a match position as displayed in the default style 1. +For this example, White is at the bottom of the board and Black is at the top. +Symbols are in capital letters; the * means the piece is Black's. + + --------------------------------- + 8 | | *R| | | *R| | *K| | + |---+---+---+---+---+---+---+---| + 7 | *P| | | *B| *P| *P| *B| *P| + |---+---+---+---+---+---+---+---| + 6 | | | | | | *N| *P| | + |---+---+---+---+---+---+---+---| + 5 | *Q| | | *P| | | B | | + |---+---+---+---+---+---+---+---| + 4 | | | | | | P | | | + |---+---+---+---+---+---+---+---| + 3 | | | N | B | P | | | | + |---+---+---+---+---+---+---+---| + 2 | P | P | | | Q | | P | P | + |---+---+---+---+---+---+---+---| + 1 | | | R | | | R | K | | + --------------------------------- + a b c d e f g h + + Black's king (*K) is on the g8 square; White's king (K) is on the g1 +square, and so on. It is Black's move. Suppose Black wants to place the +knight (*N) on the e4 square. The move to enter in algebraic would be Ne4. +Moving pawns is simpler; you don't use the "p" for the piece and just give +the square the pawn is moving to. Suppose Black decides to move the pawn +(*P) on the h7 square to the h6 square. The move to enter would be h6. In +many board positions, more than one rook, knight or pawn could move to the +same square. In this case, you have to indicate which of the two pieces you +want to move. For example, suppose Black has knights on c2 and e2; they could +both move to d4. To move the knight on c2 to d4 you could type Ncd4, where +the "c" serves to tell the server which knight to move. + + In algebraic notation, captures are usually denoted by "x". Suppose Black +wants to capture White's b2 pawn (P) with the rook (R) on b8. Black would +enter the move Rxb2. However, the server would also understand the simple Rb2 +and know that a capture is implied. So, for this server, you can enter the +square the piece will capture on. To make a castle move, use O-O to castle on +the king's side and O-O-O to castle on the queen's side. + + Many computers want very explicit instructions on how to move pieces. +This "computer" notation has the following format: square_from-square_to + + For example, in the above board position, moving the Black rook from b8 to +b2 would be entered b8-b2. Piece symbols are never used; only the squares. +The server understands computer notation as well. + + In short, to move a piece during a chess match, enter the move. Each time +you and your opponent make a move, the server updates the board position and +sends the new position to both you and your opponent. It's that simple! + +See Also: interfaces style + +[Last modified: June 16, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/intro_playing b/lasker-2.2.3/data/help/intro_playing new file mode 100755 index 0000000..19af703 --- /dev/null +++ b/lasker-2.2.3/data/help/intro_playing @@ -0,0 +1,66 @@ + +intro_playing + +PLAYING IN CHESS MATCHES + + This chess server's main purpose is to link users who want to play chess. +Among other things, the server allows you to contact other users about playing +chess matches, checks to make sure that your moves are legal, keeps track of +the board position while you play, and updates ratings of players after the +match. + + +STARTING A MATCH + + The basic way of contacting a user about playing a chess match is by using +the match command. There is a separate help file for the match command, so we +will not go into details here. But here is the simplest way to ask another +user for a match: + + match user_name + +The other user will be asked to accept or decline your match request. If the +user accepts, the server will determine who plays White and Black and will +notify you that a match has begun with that user. The starting position will +be sent to you, and play will begin. + + +PLAYING A GAME + + During a chess match, you and your opponent will moves the pieces on the +board and also issue various commands or requests. The help file +"intro_moving" explains how to move the pieces on the board. Here is a list +of other commands and requests you may need to use during a match (remember +that requests are sent to your opponent, not to the server, and must be +accepted by your opponent in order to occur): + + command function + ------- -------------------------------------------- + abort request that a game be canceled + adjourn request that the match be stopped, saved and continued at + another time + draw request that the chess match be declared a draw + flag end the match because your opponent is out of time + moves have FICS send you the moves to the match you are playing + pause request that the match be suspended temporarily, but not + adjourned + promote set the kind of piece a pawn will be promoted to when it + reaches the back rank + refresh display the current board position + resign give your opponent the win, and end the match + say communicate with your current (last) opponent + switch request that you and your opponent change sides (colors) + takeback request that one or move moves be taken back (canceled) + unpause request that a paused match be resumed + withdraw cancel a request you have made + + It is possible to play matches with more than one user simultaneously, much +like a simultaneous exhibition at many major chess tournaments. If you are +interested in playing more than one chess game at once, or interested in +playing against someone with simultaneous matches, read the "simuls" file. + +See Also: accept adjournments decline intro_moving match pending simuls +[and the individual commands] + +[Last modified: July 20, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/intro_settings b/lasker-2.2.3/data/help/intro_settings new file mode 100755 index 0000000..f8695ef --- /dev/null +++ b/lasker-2.2.3/data/help/intro_settings @@ -0,0 +1,36 @@ + +intro_settings + +SETTING YOUR PREFERENCES + + Everyone starts out with certain default values and settings, but you may +change them if you wish. You change settings using the set command; you can +view your current settings (or those of another user) using the variables +command. + + Some settings concern what information the server will transmit to you, such +as communications from other players and notifications about games starting or +users logging on/off. Other settings concern chess matches, such as your +default time controls, whether you will hear a bell when a new board +position is sent to you, whether you will be sent a list of the moves for your +game automatically when the game is completed (or adjourned), even the format +used to send you the board position. + + By changing these settings, you can create the kind of atmosphere you would +like to have. You can change these settings at any time, even during a given +session. For the most part, changes you make to your settings will be saved +after you log off and you will not need to change the settings each time you +log on. + + Your password is also a special setting, although it is never displayed at +any point. When you register, you are given a logon password. You may change +your password at any point using the password command. + + Lastly, it is possible for you to create special aliases to save you from +typing phrases you use often. Instead of typing the whole phrase, all you +do is type your alias. + +See Also: alias password set variables + +[Last modified: July 7, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/intro_special b/lasker-2.2.3/data/help/intro_special new file mode 100755 index 0000000..cf76043 --- /dev/null +++ b/lasker-2.2.3/data/help/intro_special @@ -0,0 +1,25 @@ + +intro_special + +SPECIAL FUNCTIONS + + There are several commands that perform special functions beyond sending +messages to other users, displaying information, modifying your settings or +playing in a chess match. Here are some useful ones: + + command function + ------- -------------------------------------------- + alias to make typing frequently-used phrases easier + examine to analyze a game + mailmoves mails to you the moves of a user's game + mailoldmoves mails to you the moves of a user's last game + oldmoves allows you to view a user's last game + smoves displays moves of a stored game + sposition displays the last position of a stored game + +More functions will be added as time goes on. + +See Also: [the individual commands] + +[Last modified: July 7, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/intro_talking b/lasker-2.2.3/data/help/intro_talking new file mode 100755 index 0000000..32e003b --- /dev/null +++ b/lasker-2.2.3/data/help/intro_talking @@ -0,0 +1,67 @@ + +intro_talking + +COMMUNICATING TO OTHER USERS + + There are several commands you could use for communicating with other users. +Here is a list, followed by some comparisons. + + command function + -------- -------------------------------------------- + +channel Listen to tells sent to a given channel (-channel to leave a + chanel) + cshout Talk to all users who are open to shouts; message must be + about chess + it Special kind of shout + kibitz Talk to all players and observers of a specific chess game + message Send a user a message to be stored, even if the user is not + logged on at that time + ptell Talk to your bughouse partner + say Talk to the user you are playing chess with (or have just + played a game with) + shout Talk to all users who are open to shouts + tell Talk to one user, or users on one channel + whisper Talk to all observers of a specific chess game + xtell Talk to one user, but allow for a continuing conversation + with another user + + In general, "message" works like an answering machine, " ptell", "tell" and +"say" are like normal one-to-one conversations, "shout", "cshout", "it" and +"tell " are for group talks, and "kibitz" and "whisper" are for +commenting on a chess match you are observing. Channel 1 is the server help +channel (see the chan_1 help file). + + +RECEIVING MESSAGES + + In general, you will receive every message sent to all users, to users on +channels you are listening to, and to you personally. However, you can decide +not to be open to certain kinds of communications. The "shout" and "tell" +variables can be set to limit what you will hear (read the intro_settings help +file). You can also decide not to hear anything from a given user (the +"censor" command). + + The "message" command is used to send a message to a user and have it +stored. This command can also be used to read (and re-read) old messages that +have been sent to you as well as old messages you have sent to other users. +The "clear" command is used to erase old messages you have received. + + +SPECIAL NOTES + +(a) At times, a lot of messages from various users will come across your +screen. To help you notice when a user has sent a message or request to you +personally (rather than to all users on the server), you can set the highlight +variable to to make them readily apparent (see highlight). + +(b) Unregistered users (guests) are limited to the "tell" and "xtell" +commands. + +(c) Please observe chess server etiquette guidelines when using these +commands. + +See Also: chan_1 etiquette highlight intro_playing intro_settings +shout_abuse [and the individual commands of course] + +[Last modified: December 19, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/intro_welcome b/lasker-2.2.3/data/help/intro_welcome new file mode 100755 index 0000000..37ecfba --- /dev/null +++ b/lasker-2.2.3/data/help/intro_welcome @@ -0,0 +1,49 @@ + +intro_welcome + + W E L C O M E + + to the + + F R E E I N T E R N E T C H E S S S E R V E R (FICS) + + *** If you are new here and would like to register, *** + *** type "help register" to learn about the process. *** + + + We have created several introductory files for users of this chess server. +The files describe different features of the server and give you some +suggestions on how these features can help you enjoy internet chess. Here is +a directory of the introductory files and what topics each file covers: + + Introductory File Topics Covered + ----------------- ------------------------------------- + intro_basics Basic commands; enough to get started + intro_general General information + intro_information Displaying information + intro_moving Making moves in a chess match + intro_playing Playing in chess matches + intro_settings Setting your preferences + intro_special Special functions + intro_talking Communicating to other users + register How to register on the server + + In order to read information from one of these files (or any other help +file), simply type "help file_name" using the appropriate file_name. + + If you have questions after reading a file, there are several things you can +do. (1) Read the help file for a command you have a question about; your +answer might be there. Also, help files usually suggest related files you may +want to read ("See Also"). (2) Contact users, especially administrators of +the server (known as "admins"); they are very helpful. Users on channel 1 are +also a great help (see the "chan_1" help file). in order to learn how to +communicate, type "help intro_talking". Registration on this server is by +email; type "help register" to learn the procedure. + + Your suggestions about the introductory files (and help files, too) are +welcome. Feel free to "message helpfiles" with your comments. + +See Also: adm_info chan_1 help intro_general intro_talking next +register + +[Last modified: September 22, 1995 -- Friar] diff --git a/lasker-2.2.3/data/help/iset b/lasker-2.2.3/data/help/iset new file mode 100644 index 0000000..ef2f82f --- /dev/null +++ b/lasker-2.2.3/data/help/iset @@ -0,0 +1,26 @@ + +iset + +Usage: iset ivariable_name [value] + + Ivariables are special variables that interface and bot authors can use to +modify the output of the FICS server. They shouldn't normally be touched by +a user and fiddling with them may cause the interface to malfunction (which +can be reset by logging out then in again). Ivariables are not saved between +sessions. + +Example: + iset defprompt 1 + + Each ivariable has a separate help file to explain how it is used. Type +"help iv_" to read a specific file. For example, to read about the +graph variable you would type "help iv_graph". + +When a ivariable has been modified, you will be informed of the new setting as +a way of verifying it. Normally an interface should parse out this message so +that users will not be confused. + +See Also: ivariables [and the many 'iv_' files, of course] + +[Last modified: August 1, 2000 -- DAV] + diff --git a/lasker-2.2.3/data/help/it b/lasker-2.2.3/data/help/it new file mode 100755 index 0000000..2f62d00 --- /dev/null +++ b/lasker-2.2.3/data/help/it @@ -0,0 +1,46 @@ + +it + +Usage: it message + + This command sends a message to all persons open to hear shouts. "It" is +similar to "shout" in that regard. However, with "it" your chess server name +(or "handle") is always the first word of the message. Also, the "it" message +may be preceded by various symbols depending on the chess server being used. +The symbol string --> is typical. This command has two aliases: "i" and ":". + + Here is an example: if your handle is HANDEL and you type "it thinks FICS +is great!", users will see the following message displayed -- + + --> HANDEL thinks this server is great! + +You, as the sender, will see the following -- + + (##) HANDEL thinks this server is great! + +where ## is the number of users who received the message. + +SPECIAL NOTES: + + (a) Use "cshout" rather than "it" for chess-related messages. + + (b) To contact just one user, use "tell". + + (c) If you want to contact a specific group of users, "tell" to a channel. + + (d) "It" and "shout" are similar. Be familiar with their differences. + + (e) Persons who "it" too much, or in less than appropriate ways, may be +placed on the shout_abuse list. Users on this list may only "shout" a certain +number of times per minute. To see whether you are on the shout_abuse list, +or when you are permitted to "it" again, type "it" alone without a message. +Excessive abuse can lead to heavier restrictions. + + (f) You can decide whether or not to hear an "it" from other users; setting +the "shout" variable to 0 (zero) filters these from being sent to you. + +See Also: alias channel channel_list cshout intro_talking shout +shout_abuse shout_quota tell variables + +[Last modified: December 19, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/jkill b/lasker-2.2.3/data/help/jkill new file mode 100755 index 0000000..b26a8b8 --- /dev/null +++ b/lasker-2.2.3/data/help/jkill @@ -0,0 +1,12 @@ + +jkill + +Usage: jkill slot + + This command will erase a game from your journal. For example: "jkill A" +will erase the game saves in your journal slot "A". + +See Also: jsave journal + +[Last modified: February 3, 1996 -- Friar] + diff --git a/lasker-2.2.3/data/help/journal b/lasker-2.2.3/data/help/journal new file mode 100644 index 0000000..faf6e9d --- /dev/null +++ b/lasker-2.2.3/data/help/journal @@ -0,0 +1,54 @@ + +journal + + The journal feature is a way to save games as long as you want to. History +games, remember, get overwritten as you play more games; only the most recent +games are saved. The journal feature allows you to save games for a longer +period of time. + + The journal file for most players has 26 available slots. These slots are +denoted by the single letters from A to Z. Games in your journal are referred +to by their letters. + + There are two things you need to know in order to make this feature work for +you: (i) how to save a game to your journal, and (ii) how to review a game +from your journal. + + +SAVING A GAME TO A JOURNAL +-------------------------- + + The "jsave" command is used to save games to your journal. Please refer to +that help file for details + + +SHOWING THE CONTENTS OF A JOURNAL +--------------------------------- + + To read the contents of a journal, type: + + journal [user_name] + +If the user_name is omitted, then the contents of your journal will be +displayed. + + There are several commands you can use in order to display information about +an individual game: (a) examine; (b) smoves; and (c) mailstored. See those +help files for further details. + + +PRIVATE JOURNALS +---------------- + + It is possible to hide your journal from other users (except admins) by +using the 'jprivate' variable: + + set jprivate 1 --- hides your journal + + set jprivate 0 --- allows others to access your journal + + +See also: examine history jsave mailstored smoves variables + +[Last modified: December 25, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/jsave b/lasker-2.2.3/data/help/jsave new file mode 100644 index 0000000..78623ff --- /dev/null +++ b/lasker-2.2.3/data/help/jsave @@ -0,0 +1,43 @@ + +jsave + +Usage: jsave [slot] [user_name] [gamenumber] + + This command is used to save games to your journal (see the "journal" help +file). You can save games from a "history" file or from another journal. + +To save from a "history" file +----------------------------- + + The general format is: jsave slot user_name game_number. For example: + + jsave A Friar 3 + + where 'A' is your journal slot; 'Friar' is the handle of the player whose + game you want to save -- whether it is your handle or the handle of another + player; and '3' is the number of the game from that player's 'history' file. + +To save from another journal +---------------------------- + + The general format is: jsave slot user_name slot. For example: + + jsave B Rattlesnake A + + where 'B' is your journal slot, 'Rattlesnake' is the handle of the player + whose journal game you want to transfer to your journal; 'A' is that + player's journal slot for that game. + +Using this journal-transfer feature, you can also relabel your own journal +entries. For example: + + jsave A your_handle D + +will take the journal game in slot 'D' and copy it to journal slot 'A'. At +the moment, it is not possible to delete a slot (except by overwritting); that +capability will be added in the future. + +See also: history journal + +[Last modified: December 25, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/kibitz b/lasker-2.2.3/data/help/kibitz new file mode 100755 index 0000000..3654d69 --- /dev/null +++ b/lasker-2.2.3/data/help/kibitz @@ -0,0 +1,36 @@ + +kibitz + +Usage: kibitz message +LIMITED TO REGISTERED USERS + + Sends your message to all observers AND PLAYERS of a game, with these +exceptions: (a) users with their kibitz variables set to 0 (off), and (b) +users who have set a kiblevel. You must be observing or playing a game in +order to use this command. The standard alias for kibitz is "*". + + In order to listen to kibitzes, you must have your kibitz variable on ("set +kibitz 1"). If you want to listen to kibitzes only from players of a given +chess ability or higher, use the kiblevel variable. + + When a kibitz is displayed, the kibitzer's rating will be shown (the higher +of blitz and standard will be used). However, (a) if the kibitzer has a chess +master title (GM, IM, FM, NM), this title will be displayed instead of the +rating; (b) if the kibitzer is an admin on duty, a '*' will be displayed. + + +SPECIAL NOTES: + +(a) It is considered bad manners to discuss the game with other observers by +using kibitz because doing so might assist the players. Instead, use +"whisper" in order to discuss a game you and others are observing without +interfering with the play of the game. + +(b) If you are observing more than one game at once, using kibitz can be +tricky. It is possible for the kibitzed message to be sent to another game, +if the game being observed changes suddenly. + +See Also: intro_talking kiblevel observe set variable whisper + +[Last modified: October 8, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/kiblevel b/lasker-2.2.3/data/help/kiblevel new file mode 100644 index 0000000..eb1ec49 --- /dev/null +++ b/lasker-2.2.3/data/help/kiblevel @@ -0,0 +1,46 @@ + +kiblevel + +Usage: set kiblevel rating + + When many users are observing and commenting on a game, the kibitzes and +whispers can be so numerous that following the commentary can be difficult. +This problem is especially true for special events, such as World Chess +Championship games. There was therefore a need to cut down on the amount of +kibitzes and whispers a person might want to receive. A kibitz filter, +"kiblevel", was created in answer to this problem. + + What the kiblevel variable does is limit the kibitzes and whispers you will +hear to only users with a certain ability (either a given chess server rating +or chess master title -- GM, IM, FM, NM). You establish the kiblevel filter +by using the kiblevel variable and the "set" command. Here are the +possibilities for kiblevel settings, and their results: + + SAMPLE COMMANDS RESULT + ------------------ ------------------------------------------------ + set kiblevel 9999 Hear kibitzes/whispers only from titled users + set kiblevel 2000 Hear kibitzes/whispers from titled users and users + with ratings of 2000 or higher + set kiblevel 0 Hear all kibitzes/whispers + +In terms of a user's rating, the highest rating of blitz/standard is chosen. + + If you want to filter ALL kibitzes, use the "kibitz" variable setting +instead and type "set kibitz 0". + + Because problems with kibitz/whisper volume only on certain occasions, your +kiblevel variable is reset back to 0 each time you log in. That way, regular +games will not be affected by your forgetting to set kiblevel back to a more +suitable level. + + +SPECIAL NOTES: + +(a) Kibitzes made by server admins who are "on duty" (and have their admin +flag shown, namely a '*' in 'who' listings) are not filtered by this command +in order to allow for necessary communication in special circumstances. + +See Also: kibitz set variable whisper + +[Last modified: October 8, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/lag b/lasker-2.2.3/data/help/lag new file mode 100755 index 0000000..cf67996 --- /dev/null +++ b/lasker-2.2.3/data/help/lag @@ -0,0 +1,37 @@ + +lag + + Games over the internet are affected by lag -- the time it takes for the +electronic transmission of moves and game positions. As a result, some of +your clock time in a chess match is used up by lag time rather than thinking +time. + + There are many ways for you to get around this problem with transmission +lag: + + (a) Play games with a higher increment per move and, in general, longer + time controls in general. + + (b) Play unrated games for a while until the lag problem seems to have + improved. + + (c) Tell your opponent about your lag. In response, your opponent might + do one of several things: + (i) Give you more time occasionally. + (ii) Turn autoflag off (if they have that feature), or at least + decide not to flag you as soon as your time hits 0:00. + (iii) Agree to abort your game, and cancel it. + (iv) Agree to adjourn your game, and continue it later. + (v) Ignore your information and play on as usual (your opponent is + under no obligation to give you a break because of lag). + + (d) Use the "timeseal" program if it works for your computer system and + configuration. Using timeseal, your clock is not deducted for lag + time, just thinking time. Read the "timeseal" help file for details. + +NOTE: It is not unethical for someone to flag you when you have lag. + +See Also: abort flag match moretime timeseal + +[Last modified: September 19, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/lecture1 b/lasker-2.2.3/data/help/lecture1 new file mode 100755 index 0000000..8d1da85 --- /dev/null +++ b/lasker-2.2.3/data/help/lecture1 @@ -0,0 +1,260 @@ + The Modern Defence + + by GM Nigel Davies + + + It was in the late 1970s that I first made the + aquaintance of this provocative counter-attacking defence. + Under the influence of Raymond Keene, a great many British + players were playing it around that time and I decided to + jump on the bandwagon. Later on it proved quite difficult to + jump off again and play more classical openings, but then + that's another story. + With his first two moves, 1...g6 and 2...Bg7 Black makes + no attempt whatsoever to follow the tried and trusted + classical precept of occupying the center. Instead he calmly + fianchettoes a bishop and argues the he can attend to things + like development later in the game. + Some practitioners of the Modern (Colin McNab and David + Norwood for example) like to try and close the position up + with ...c6 and possible ...d5. But I have my own + interpretation involving a fierce counterattack against the + d4 square. + Above all I want that bishop on g7 to breathe fire, to + strike terror along the h8-a1 diagonal. Sometimes I play + ...c7-c5, sometimes ...e7-e5, but always something against + the d4 square and with that long diagonal in mind. + There isn't enough time to show all the ins and outs of + this defence, but the following games show my interpretation + in action against a variety of White set-ups and how this + opening has served me faithfully in some critical games. + Amongst my victims with this opening are the likes of Bent + Larsen and Viswanathan Anand, but on this occasion I'll show + you the real crushes! + The first game was played in the last round of the + student team Championships in Graz 1981 in which the England + team was going for the silver medal.... + + Polajzer-Davies + Student Team Ch., Graz (Austria), 1981 + + 1.d4 g6 2.c4 Bg7 3.Nc3 d6 4.e4 + + According to the late Mikhail Botvinnik, setting up the + pawns on d4, c4 and e4 is the strongest answer to the Modern + Defence. I have usually preferred my `stock' recipe; a + counterattack against the d4 square. + + 4...Nc6! 5.Be3 e5! 6.d5 Nce7 + + Reaching a kind of King's Indian Defence in which the + fact that Black's knight has not been developed on f6 yet + means that he can sometimes play ...f7-f5 before bringing it + out. White takes immediate measures against this. + + 7.g4 c5 8.h4 Nf6 9.g5 Nh5 10.Be2 Nf4 11.Bf3 0-0 12.Nge2 f5 + 13.Qd2 Qa5 14.0-0-0 Rb8!! + + One of the best moves I have ever played. The idea, + should White play quietly now, is to prise open the + queenside with ....b5 followed by ....a6. And there are + other points should White capture on f4. + + 15.Nxf4 exf4 16.Bxf4 fxe4 17.Bxd6 + + The line which most beautifully illustrates the power of + 14...Rb8 is 17.Bxe4 Bxc3 18.bxc3 Rxf4 19.Qxf4 Qxc3+ 20.Kb1 + (or 20.Bc2 Bf5 21.Rd2 Qa1+) and now 20...b5, opening up the + b-file. White, by the way, loses a piece after 17.Nxe4 + Qxd2+. + + 17...Rxf3! 18.Bxb8 Rxc3+! 19.Kb1 + + Or 19.bxc3 Bxc3 20.Qc2 Qa3+ 21.Kb1 Bf5 followed by + 22...e3. + + 19...e3 20.fxe3 Bf5+ 21.Ka1 Rc2! 0-1 + + White lost on time by he could equally have resigned. + 22.Qxa5 is met by 22...Bxb2+ 23.Kb1 Rd2+ followed by mate. + I still count this as my most artistic miniature. + + This next game was one of the wins which earned my first + Grandmaster norm in Oslo 1988. After a few careless moves in + the opening Black develops a murderous attack. White, by the + way, is not a patzer. These days he has a rating of around + 2500 and is on the verge of becoming a GM. + + Gausel,E-Davies,N + Oslo, 1988 + + 1.d4 d6 2.e4 g6 3.Nc3 Bg7 4.Bc4 Nc6 5.Be3 Nf6 6.h3 + + Preventing 6...Ng4 but losing time for development. + + 6...e5 7.dxe5 Nxe5 8.Bb3 0-0 9.Qd2 b5! + + White's neglect of development allows Black to take the + initiative. + + 10.f3 b4 11.Nd5 Nxd5 12.Bxd5 c6 13.Bb3 a5 14.a4 d5 + + Blasting open the center before White has got his cing + safe. If he had now tried to remedy this with 15.0-0-0 + there would follow 15...Qf6 and after 16.Bd4 there is + 16...c5!, distracting the bishop from the defence of b2. + + 15.exd5 Nc4! 16.Bxc4 Bxb2! + + Suddenly White is in desperate trouble; the threats + include 17...Bxa1 and 17...Bc3, not to mention 17...Qh4+. + + 17.Ne2 Qh4+ + + Even stronger than capturing the rook on a1, as that will + remain a threat. + + 18.Bf2 Qxc4 19.Rb1 Bc3 20.Nxc3 bxc3 21.Qd3 Re8+ 22.Kd1 Qa2! + 23.Rc1 Ba6 24.Qxc3 Qxd5+ 25.Qd2 Rad8! 0-1 + + The final position shows the true extent of White's + misery. + + Engedal,N-Davies N + Gausdal Peer-Gynt , 1990 + + 1.e4 g6 2.d4 Bg7 3.Nc3 d6 4.f4 Nc6 + + I was later to abandon this move after Dragan Velimirovic + answered it with 5.Bb5 in a tournament in Vrnjacka Banja in + 1991. Since then I have answered the Austrian Attack (4.f4) + with 4...e6 followed by ...Ne7, ...Nd7, ...b6 and ...Bb7, + obtaining a similar set-up to the game. + + 5.Be3 Nf6 6.Nf3 e6 7.Be2 0-0 8.0-0 Ne7 9.Nd2 b6 10.a4 a6 + 11.Qe1 c5 + + Black's usual way of challenging White's set-up from this + structure. Here it proves especially effective because White + has plalyed the rather artificial 9.Nd2. + + 12.Qf2 Bb7 13.Bf3 Qc7 14.a5 cxd4 15.Bxd4 b5 16.Bb6 Qc8 + 17.Rac1 Nd7 18.Bd4 + + 18.Be3 was better, as now Black rips apart what is left + of White's center. + + 18...e5 19.Be3 f5! + + The opening of the position proves good for Black as his + pieces are better placed. Note that White's king also proves + weak, a consequence of 4.f4! + + 20.g3 exf4 21.gxf4 b4 22.Nd1 Nf6 23.Qg2 fxe4 24.Nxe4 Nxe4 + 25.Bxe4 Bxe4 26.Qxe4 Qg4+ 27.Kh1 + + 27.Qg2 Qf5 would also have been unpleasant for White. + + 27...Nf5 28.Qxb4 + + A suicidal pawn snatch but it is already rather difficult + to give White good advice. + + 28...Ng3+! 29.Kg1 + + Taking the knight allows 29...Qh3+ followed by 30...Qg3+ + and 31...Rf5. + + 29...Nxf1+ 30.Kxf1 Qf3+ 31.Kg1 Rae8 32.Qd2 Rxf4! 0-1 + + White has had enough. 33.Bxf4 is answered by 33...Re2 + threatening both mate and the queen. + + For a period of about 10 years I played nothing but the + Modern, but in the late 1980s I started to branch out into + other openings. Even eating caviar every day can become + boring. + Yet faced with the prospect of having to win my last + round game for a GM norm in a tournament in Budapest, I + could hardly answer 1.e4 with 1...e5, after which I would + get a boring Four Knights or Ruy Lopez. The only chance was + the Modern Defence, and this was it's finest hour. + + Godena,M-Davies,N + First Saturday Tournament, Budapest, May 1993 + + 1.e4 g6 2.d4 Bg7 3.Nc3 d6 4.Nge2 + + The safe way of introducing the fianchetto line for + White, as after the immediate 4.g3 there is 4...Nc6 and if + 5.Nge2 then 5...Bg4. After the text move I either play the + immediate 4...Nc6, or sometimes 4...a6 5.a4 Nc6. + + 4...Nc6 5.Be3 Nf6 6.h3 e5 7.dxe5 Nxe5 8.Ng3 0-0 + + The safe way to play it would have been 8...Be6 9.Qd2 + Nc4, but given that I had to win this game I was not afraid + of danger. + + 9.Qd2 Re8 10.0-0-0 b5!? + + A pawn for an open file - not a bad deal with opposite + wing castling. If White doesn't capture Black gets the c4 + square for his knight on e5. + + 11.Bxb5 Bd7 12.Be2 + + After 12.f4 my opponent didn't like the look of 12...Bxb5 + 13.fxe5 Rxe5 14.Bd4 Qe7, which he felt gave me good + compensation for the sacrificed exchange. In the post mortem + we looked at 12.Ba6!? but then 12...Be6 wasn't clear. + + 12.... Qb8 13.f4 Nc6 14.Bf3 Qb4 + + Preparing to move a rook to b8 and threaten mate on b2. + + 15.a3 Qb7 16.e5 Rab8 17.b3 + + An alternative way to defend b2 was with 17.Na4, but + then Black has 17...dxe5 18.fxe5 Qb5! 19.exf6 Bxf6 20.b3 + Rxe3 21.Qxd7 Bg5 and if 22.Kb1 then 22...Rxb3+. + + 17...dxe5 18.fxe5 Rxe5 19.Nge4 Qa6! + + It is less good to play this move after a preliminary + exchange of knights on e4. Thus 19...Nxe4 20.Nxe4 Qa6 can by + met by 21.a4 after which White's defences hold. + + 20.a4? + + The decisive mistake. White should take this opportunity + to exchange on f6, as for the time being Black is forced to + recapture with the bishop. After Black's next move it + becomes possible to take back on f6 with the queen. + + 20...Na5! 21.Nxf6+ Qxf6! + + The point, after which the latent threats along the long + h8-a1 diagonal prove decisive. Perhaps White thought that + his next move made the capture with the queen impossible, + but a serious disappointment is waiting. + + 22.Bd4 Qd6! + + Ouch! Only now did he see that the intended capture of my + rook on e5 is met by 23...Qa3+ followed by 24...Nxb3. + + 23.Nb1 Rxb3! + + KAPOW! White must kiss his castled position goodbye. + + 24.Bxe5 Qb6! 0-1 + + White has had enough. The threat is 25...Rb1+, the rook + is immune to capture because of the knight fork picking up + White's queen and after 25.Nc3 there is either 25...Nc4 or + 25...Ra3, depending on Black's mood. + + This event was brought to you by Warwick chess club (England) + + diff --git a/lasker-2.2.3/data/help/lightning b/lasker-2.2.3/data/help/lightning new file mode 100644 index 0000000..f11dde6 --- /dev/null +++ b/lasker-2.2.3/data/help/lightning @@ -0,0 +1,35 @@ + +lightning + + There are four types of regular (not wild or bughouse) chess played on this +chess server: Untimed, Lightning, Blitz and Standard. + + A game is "Lightning" if the expected duration of the game is 3 minutes or +less per player. "Expected duration" is determined by a formula that takes +into account both the Start time and the Increment (Inc) value. Here is the +formula: + + Expected duration = (Start + Inc*2/3) + + The following table shows the slowest Lightning and fastest Blitz time +controls, the dividing line if you will between those two types of matches. + + Slowest Lightning Fastest Blitz + ------------------------------------ + Mins Incr Mins Incr + ------------------------------------ + 0 4 0 5 + 1 2 1 3 + 2 1 2 2 + -------- 3 0 + + As you can see, Lightning chess is very quick! + + You can list logged on users according to their lightning ratings by typing +"who L". "Lightning" is also a variable that can be used in formulas in order +to screen match requests. + +See Also: blitz formula match standard untimed who + +[Last modified: December 25, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/limits b/lasker-2.2.3/data/help/limits new file mode 100755 index 0000000..2b3adf3 --- /dev/null +++ b/lasker-2.2.3/data/help/limits @@ -0,0 +1,16 @@ + +limits + +Usage: limits + + "Limits" displays the various server limits currently in effect. These +include maximum numbers of players, channels, channels you can be in, persons +on your notify list, your aliases, games you are observing, requests pending +for you, people on your censor list, persons in a simul game, and messages you +can receive. Also, the minimum number of games that can be active, and the +shout quota. + +See Also: [the various commands and features] + +[Last modified: July 7, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/lists b/lasker-2.2.3/data/help/lists new file mode 100755 index 0000000..77a411c --- /dev/null +++ b/lasker-2.2.3/data/help/lists @@ -0,0 +1,24 @@ + +lists + + The server maintains several lists in order to conduct its business. You +can use +/-/= to change and view the various lists. + +Examples (using the aliases): + + +listname member (Add member to listname -- addlist) + + -listname member (Remove member from listname -- sublist) + + =listname (View the members of listname -- showlist) + + = (View the names of all lists and their status + -- showlist) + +Certain lists can only be modified by an admin. Other lists are for admin +viewing only. See showlist help file for details. + +See Also: addlist admin showlist sublist + +[Last modified: September 2, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/llogons b/lasker-2.2.3/data/help/llogons new file mode 100755 index 0000000..5d5eeba --- /dev/null +++ b/lasker-2.2.3/data/help/llogons @@ -0,0 +1,11 @@ + +llogons + +Usage: llogons + + Shows the last 30 or so logons and logoffs for the server. + +See Also: logons + +[Last modified: October 9, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/logons b/lasker-2.2.3/data/help/logons new file mode 100755 index 0000000..e96d9a2 --- /dev/null +++ b/lasker-2.2.3/data/help/logons @@ -0,0 +1,13 @@ + +logons + +Usage: logons [user] + + Shows the last 10 or so logons for the given user. Displayed will be the +date, time and IP address for your connection. Example: "logons Mozart". If +"user" is omitted then your last logons are displayed. + +See Also: llogons + +[Last modified: November 26, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/ltell b/lasker-2.2.3/data/help/ltell new file mode 100644 index 0000000..78fca01 --- /dev/null +++ b/lasker-2.2.3/data/help/ltell @@ -0,0 +1,9 @@ + +lell + +Usage: ltell list message + +ltell is like xtell but it sends your message to every player on the +specified list. So for example you could say hello to every computer +player using: + ltell computer hello diff --git a/lasker-2.2.3/data/help/mailmess b/lasker-2.2.3/data/help/mailmess new file mode 100755 index 0000000..eb313d0 --- /dev/null +++ b/lasker-2.2.3/data/help/mailmess @@ -0,0 +1,27 @@ + +mailmess + + There are two ways to have your messages mailed to you: (a) all messages +currently being stored for you, and (b) automatically each time one arrives. +One method uses a command; the other uses a variable setting. REMINDER: only +registered users can have stored messages. + + +STORED MESSAGES + + Use the "mailmess" command to send to you at to your e-mail address the +messages currently being stored for you. In this way you can archive the +messages on your own computer and then clear the message buffer on the chess +server. A reduced message buffer makes new messages easier to identify and +read. + + +AUTOMATICALLY ONE-AT-A-TIME + + When the "mailmess" variable is set to 1, each message you receive from a +user will be automatically e-mailed to you at your address. + +See Also: clearmessages messages register set variables + +[Last modified: June 17, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/mailmoves b/lasker-2.2.3/data/help/mailmoves new file mode 100755 index 0000000..01ca54b --- /dev/null +++ b/lasker-2.2.3/data/help/mailmoves @@ -0,0 +1,15 @@ + +mailmoves + +Usage: mailmoves + + Mails to you at to your email address the moves to the game you are playing +or examining. + +NOTE: This command concerns games in progress, not games that have been +completed. For completed games, use "mailstored". + +See Also: mailstored smoves + +[Last modified: September 14, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/mailoldmoves b/lasker-2.2.3/data/help/mailoldmoves new file mode 100755 index 0000000..2ab3cac --- /dev/null +++ b/lasker-2.2.3/data/help/mailoldmoves @@ -0,0 +1,10 @@ + +mailoldmoves + +This command has been superceded by an enhanced "mailstored" command. Please +refer to that help file. + +See Also: mailstored smoves + +[Last modified: September 14, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/mailstored b/lasker-2.2.3/data/help/mailstored new file mode 100755 index 0000000..3b6ab44 --- /dev/null +++ b/lasker-2.2.3/data/help/mailstored @@ -0,0 +1,21 @@ + +mailstored + +Usage: mailstored player1 {#, player2} + + Mails to you at your email address the moves of player1's game, either game +# from player1's "history" table or the "stored" (adjourned) game between +player1 and player2. + + Examples: + + mailstored Hawk 65 + mailstored Hawk DAV + + Other useful commands: "examine" helps you review the game; "smoves" +displays the moves; "sposition" displays current game position. + +See Also: examine history smoves sposition stored + +[Last modified: September 14, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/match b/lasker-2.2.3/data/help/match new file mode 100755 index 0000000..575fed8 --- /dev/null +++ b/lasker-2.2.3/data/help/match @@ -0,0 +1,123 @@ + +match + +Usage: match user [rated|unrated] [Start] [Inc] [Black_Start Black_Inc] +[White|Black] [board_category board] + + +SUMMARY +~~~~~~~ + This command allows you to challenge a given user to a game of chess. To +challenge USER to a match, type "match USER". The type of match being offered +depends on (a) your variable settings (preferences) and (b) information you +give in the match request. USER will need to accept or decline the challenge. +You can cancel a challenge you have made using the "withdraw" command. + + +MATCH VARIABLES +~~~~~~~~~~~~~~~ + You can specify the parameters for the match. If no parameters are +specified, (a) the challenger's variable settings for "rated|unrated", "Start" +and "Inc" will be used (see "variables"), (b) the clock times will be the same +for both players, (c) the colors will be chosen by the server, and (d) the +board_category will be standard. Here are details about each variable of the +match command. + + +RATED|UNRATED -- Sets whether the match will be rated or unrated. If +undesignated, the challenger's variable setting for "Rated" will be used. If +designated, it will override the challenger's "Rated" setting. Example: +"match user rated". + +START and INC -- Determine the clock variables for the match, where Start is +in minutes and Inc is in seconds. If only 'Start' is given then 'Inc' is +assumed to be zero (example, "match user 5"). If values are given for Black +then the challenger will play the White side (example, "match user 5 0 5 0"); +otherwise the side will be chosen "fairly". + +WHITE|BLACK -- If a color is given, White or Black (w/b), that will be the +color of the challenger (example, "match user w"). + +BOARD_CATEGORY BOARD -- These two parameters must be used together. They +specify a particular starting position for the game. These parameters can +only be included when all of the other parameters have also been given. If a +particular starting position is not supplied, then "standard" and "standard" +are used (that is, the "regular" starting position for pieces will be used +with no particular opening). (See the "boards" help file for the categories.) + + +EXAMPLES OF MATCH REQUESTS (challenges): +~~~~~~~~~~~~~~~~~~~~~~~~~~ +match red + Challenges user "red" to a match using your default values for Rated, Start + and Inc. + +match red 5 + Challenges user "red" to a match with Start = 5 and Inc = 0 using your + default value for Rated. + +match red 30 30 u + Challenges user "red" to an unrated match using a 30 minute Start time and + 30 second Increments per move ("match red 30 30 0 0" would give the same + result.) + +match red 30 0 15 0 w + Challenges user "red" to a non-standard, time-odds match with the challenger + playing White and "red" playing Black. White will Start with 30 minutes on + the clock, and Black will Start with 15 minutes (note that all four values + for the time controls must be given for a match with time odds). + +match red 2 12 0 0 openings ruy-lopez + Challenges user "red" to a match using the ruy-lopez opening position. + (Note that to start from a given board, you must give all four time control + values; in this example, you may NOT omit the two zeros.) + +match red 2 12 0 0 wild 3 + Challenges user "red" to a match using the wild 3 starting position. + (Again, all four time control values must be given.) + +match red 5 12 bughouse + Challenges user "red" to a bughouse match, once the bughouse teams have been + arranged. The word "wild" does not need to be used. + + +SPECIAL NOTES +~~~~~~~~~~~~~ + +(a) COUNTER OFFERS: If you receive a match request from a user and you +request a match with different time controls, then in essence you (a) decline +the first request but (b) make a request of your own. If your counter request +has the same time controls, a game will begin. + +(b) RESUMING ADJOURNED GAMES: Use the "match" command to resume an adjourned +game. Resuming an adjourned game takes precedence over starting a new game. +The match request, of course, can be declined by your opponent. Adjudications +of adjourned games are possible. + +(c) USING FORMULAS TO FILTER OUT MATCH REQUESTS: Match requests from other +users can be filtered by using a formula. If a request fails to meet your +formula, it is declined automatically for you. Also, you will not receive +challenges from users on your "censor" list. + +(d) ALIASES: Using aliases can make it easier to challenge other players to +matches. + +(e) EXAMINE MODE: Matching yourself ("match your_handle") is a way to enter +examine mode. + +(f) MATCH TYPE: It is not possible to request a type of match directly, such +as "match user blitz". How a match is classified depends upon both the Start +time and the Inc time. An equation is used to determine whether a match will +be blitz or standard (see the "blitz" help file). You can, however, request a +bughouse match directly. + +(g) NOPLAY LIST: If you do not want to receive match requests from a +particular user, place that person on your "noplay" list. + + +See Also: accept adjourn adjudicate alias blitz boards bughouse censor +decline examine formula intro_playing noplay variables [rated, start, +inc, etc.] withdraw + +[Last modified: December 25, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/messages b/lasker-2.2.3/data/help/messages new file mode 100755 index 0000000..1c19f17 --- /dev/null +++ b/lasker-2.2.3/data/help/messages @@ -0,0 +1,30 @@ + +messages + +Usage: messages [user [text]] +LIMITED TO REGISTERED USERS + + This command can do one of four things: + + 1) "Messages" used alone will display all of the stored messages that have + been sent to you. + + 2) "Messages user" will display all stored messages from you to that user + and from that user to you. + + 3) "Messages #" will display the message numbered # in your list. + + 4) "Messages user text" will send "text" to the user. When you "message" + another user, the text of your "message" will be displayed to you for + confirmation. If that user is on, he/she will see the message + displayed. If the user is not on, he/she will need to use "message" in + order to read it. + + Messages will be stored until they are cleared by the recipient. In +contrast, "tell"s are not stored. When users log on, they are notified if +they have any stored messages and (if so) how many they have. + +See Also: clearmessages tell + +[Last modified: December 17, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/mexamine b/lasker-2.2.3/data/help/mexamine new file mode 100755 index 0000000..61d9266 --- /dev/null +++ b/lasker-2.2.3/data/help/mexamine @@ -0,0 +1,18 @@ + +mexamine + +Usage: mexamine user + + This command is used by a person examining a game in order to allow other +users to move the pieces and execute commands in examine mode. The user must +first be observing the game in order for "mexamine" to work. Here are the +steps: (1) enter examine mode, (2) have another user "observe" that game, (3) +"mexamine that_user". + +NOTE: As long as there is at least one examiner, the game continues even if +the first examiner leaves that game. + +See Also: examine observe + +[Last modified: September 22, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/moretime b/lasker-2.2.3/data/help/moretime new file mode 100755 index 0000000..96088b0 --- /dev/null +++ b/lasker-2.2.3/data/help/moretime @@ -0,0 +1,25 @@ + +moretime + +Usage: moretime seconds + + Adds extra time (in seconds) to your opponent's clock when you are playing a +game. Maximum time you can add -- 600 seconds (if you try to add more than +600 seconds, only 600 will be added). + + In essence, using the moretime command means that you don't want your +opponent to worry so much about the time remaining on his/her clock, about +being flagged, and so on. It is a useful command to use when your opponent +mentions a problem with transmission lags and you are using an interface +with the autoflag feature on. You are under no obligation to give your +opponent more time, of course. + + If you need more time, you can always ask your opponent to add time to your +clock -- depending on the circumstances and their mood, they might grant your +request. But if you find that you frequently need more time when you play, +consider playing with longer time controls. + +See Also: abort flag match + +[Last modified: June 11, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/motd.std b/lasker-2.2.3/data/help/motd.std new file mode 100755 index 0000000..3e3060f --- /dev/null +++ b/lasker-2.2.3/data/help/motd.std @@ -0,0 +1,10 @@ +Got a bug? Message Bug with it. (Not the player Bug on ICC) +Got a suggestion that could improve this place? Message Suggestion with it. + + The latest FICS distribution is now at the onenet ftp site caissa.onenet.net, + as FICS.1.2.18..tar.gz in /pub/chess/Unix. + +Like Slower Time Controls? Join THE STC BUNCH! Finger StarCapt for details. + +Do 'help register' for info on registration. + diff --git a/lasker-2.2.3/data/help/motd_help b/lasker-2.2.3/data/help/motd_help new file mode 100755 index 0000000..e59d6e2 --- /dev/null +++ b/lasker-2.2.3/data/help/motd_help @@ -0,0 +1,12 @@ + +motd_help + + The "motd" information help file -- Message Of The Day -- contains news +items and other announcements that are displayed when you logon. You can read +these by typing "help motd". Other news items are on the "news" bulletin +board. + +See Also: news + +[Last modified: June 12, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/moves b/lasker-2.2.3/data/help/moves new file mode 100755 index 0000000..7a7d287 --- /dev/null +++ b/lasker-2.2.3/data/help/moves @@ -0,0 +1,13 @@ + +moves + +Usage: moves [game,user] + + Displays the moves to the specified game. If a game is not specified, moves +to the game you are playing will be displayed. Command applies only to games +in progress, not to stored games. + +See Also: mailstored smoves + +[Last modified: September 14, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/newrating b/lasker-2.2.3/data/help/newrating new file mode 100755 index 0000000..993742a --- /dev/null +++ b/lasker-2.2.3/data/help/newrating @@ -0,0 +1,41 @@ + NEW! NEW! NEW! NEW! NEW! NEW! NEW! NEW! NEW! NEW! + + We are proud to introduce you to our completely new rating system! + + --> The Glicko system (developed by Mark E. Glickman) <-- + --> Assistance/corrections by Dmitry Dakhnovsky <-- + --> Implemented to FICS by Vek and Hawk <-- + + +As you all know, we had a seriously defective rating system, but that +is now changed after two weeks of hard work. + +The previous ratings were bogus and therefore we had to delete them, +and in order to treat all players equally - we have given them the +following two choices: + +(1) Transfer their ratings and/or stats from ICC. This can be done by + leaving me a message FROM ICC (NOTE: I'm called "HawkII" + there). This will disable any chance of cheating. Just mention your + FICS handle in your message to me. + +(2) Some may not want to have their rating transfered from ICC or + maybe they dont even have a rating there, then the option is simple: + the rating will be reset. + +This offer was first published around the 28th of March and will be +available until the 16th of April. (maybe longer) + + +Every request for ratings transfers must be emailed to me (Hawk) and +my address is "u940456@daimi.aau.dk". Please use subject line: +"Request for ratings transfer" and in the body of the message tell +me your handle on ICC and FICS. (also remember to message me from ICC +so that I can verify that you are the person you claim to be. NOTE: +My handle on ICC is "HawkII" ) + +-Hawk + +See Also: glicko, motd + + diff --git a/lasker-2.2.3/data/help/news b/lasker-2.2.3/data/help/news new file mode 100755 index 0000000..0021ad4 --- /dev/null +++ b/lasker-2.2.3/data/help/news @@ -0,0 +1,16 @@ + +news + +Usage: news [#,all] + + The command "news" alone will display the last 10 news items posted to the +chess server bulletin board, "news #" will display news item #, and "news all" +will display all news items in the news index. Also, news items and other +announcements that are part of the opening text when you logon are in the +"motd" help file (for an explanation of the "motd" information, read the +"motd_help" help file). + +See Also: motd_help + +[Last modified: August 20, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/next b/lasker-2.2.3/data/help/next new file mode 100755 index 0000000..ddfeb95 --- /dev/null +++ b/lasker-2.2.3/data/help/next @@ -0,0 +1,13 @@ + +next + +Usage: next + + This command is used to continue the display of a long text file. An alias +for "next" is "more". How many lines of text you receive at once is +determined by the "height" variable setting. + +See Also: help intro_welcome variables + +[Last modified: July 1, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/noplay b/lasker-2.2.3/data/help/noplay new file mode 100644 index 0000000..9ea0200 --- /dev/null +++ b/lasker-2.2.3/data/help/noplay @@ -0,0 +1,20 @@ + +noplay + +Usage: +|-|= noplay [user] + + When a player is on your noplay list, all match requests from that player +will be declined automatically. Here are the variations of the command +possible: + + +noplay user Add "user" to noplay list + -noplay user Remove "user" from noplay list + =noplay Display your noplay list + + "Censor" will also filter a user's match requests. Use a formula to filter +match requests of particular types. + +See Also: addlist censor formula + +[Last modified: December 17, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/notes b/lasker-2.2.3/data/help/notes new file mode 100644 index 0000000..808a499 --- /dev/null +++ b/lasker-2.2.3/data/help/notes @@ -0,0 +1,17 @@ + +notes + + A registered user has up to 10 lines in their 'finger' display for posting +information. These lines are known as "finger notes", one's "plan" or just +"notes". Your 'notes' can be read by all users of the server, so be sure that +it is information you want to make public. The notes are numbered from 1 to +10. + + The lines are created, changed and deleted by using the 'set' command. For +example, "set 1 I love Wild 5!!!" will set your #1 finger note to: "I love +Wild 5!!!". + +See Also: finger set + +[Last modified: December 17, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/notify b/lasker-2.2.3/data/help/notify new file mode 100755 index 0000000..2e68c74 --- /dev/null +++ b/lasker-2.2.3/data/help/notify @@ -0,0 +1,43 @@ + +notify + +Usage: +|-|= notify [user] +LIMITED TO REGISTERED USERS + + When a user is on your notification list, you will be notified each time +that user logs onto or leaves the server. Here are the variations of the +command possible: + + +notify user Add "user" to notify list + -notify user Remove "user" from notify list + =notify Display your notify list + + Also, when you are on another user's notification list, you will be sent a +message that your entering the server was noted by that user. If you want to +be notified each time *any* user logs on or off, use the "pin" variable. Use +the "znotify" command to see which users currently logged on are on your +notify list and which have you on their notify lists. + + The size of your notify list is limited (type "limits" to see current size). +Fortunately, there is a way you can maximize the use of your notify list. The +solution involves the "notifiedby" variable. If you are on another user's +notify list and have your "notifiedby" variable set to 1, you will be notified +by the server when that user logs on/off. It will work the same way as if you +had that user on your list: you will be *notified by* the other user's list! +Here's an example: + + Hawk's notify list includes DAV *and* DAV has "notifiedby" set to 1 + +will have the same effect as ... + + Hawk's notify list includes DAV *and* DAV's list includes Hawk + +... except that one notify list entry (namely, DAV on Hawk's list) is doing +the work of two entries. That is how you can save on the length of your +'notify' list. + + +See Also: addlist limits variables znotify + +[Last modified: November 26, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/observe b/lasker-2.2.3/data/help/observe new file mode 100755 index 0000000..1b952fd --- /dev/null +++ b/lasker-2.2.3/data/help/observe @@ -0,0 +1,38 @@ + +observe + +Usage: observe [game,user] + + Puts a game on your observation list. You can give either the game number +or the user whose game you want to observe. For example, if game #34 is +KARPOV versus RETI, then "observe 34", "observe RETI" or "observe KARPOV" will +add this game to your observation list. You can observe more than one game at +once. + + When you are observing a game, you will receive an updated board position +and game information each time a move is made. When a game you are observing +ends, you will be given the result of the game. + + Use the "unobserve" command to remove a game (or even all games) from your +observation list. + + Use "allobservers" to see who is observing a game (or all games) in +progress). + + +SPECIAL NOTES + +(a) At one point "observe" used alone would remove all games from your +observation list. This function is now being phased out in favor of the +"unobserve" command. But be careful while both commands are still valid. + +(b) It is possible to observe all simul games being played by the simul +player by the command "observe simul_player". All of the simul games in +progress will be added to your observation list. When the last simul game is +finished, you will be given the result of the simul exhibition. + + +See Also: allobservers games simuls unobserve + +[Last modified: October 8, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/oldmoves b/lasker-2.2.3/data/help/oldmoves new file mode 100755 index 0000000..b98b8d5 --- /dev/null +++ b/lasker-2.2.3/data/help/oldmoves @@ -0,0 +1,10 @@ + +oldmoves + +This command has been superceded by an enhanced "smoves" command. Please +refer to that help file. + +See Also: mailstored smoves + +[Last modified: September 14, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/open b/lasker-2.2.3/data/help/open new file mode 100755 index 0000000..d6460d8 --- /dev/null +++ b/lasker-2.2.3/data/help/open @@ -0,0 +1,14 @@ + +open + +Usage: open + + Toggles your 'open' variable open/not open [1/0]. When open is set to 1, +you are open to receive match requests from other users. When it is set to 0, +you will not receive match requests from others, but you will be notified that +such requests have been made to you and ignored automatically. + +See Also: match variables + +[Last modified: October 8, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/partner b/lasker-2.2.3/data/help/partner new file mode 100755 index 0000000..d4eb2a2 --- /dev/null +++ b/lasker-2.2.3/data/help/partner @@ -0,0 +1,23 @@ + +partner + +Usage: partner user_name + + This command is used in order to ask another user to become your partner for +a bughouse match. The other user will need to accept or decline the offer. +If the other user accepts the partner offer, the two of you will then be able +to hold bughouse matches against other partnerships and the two of you can be +identified using the "bugwho p" command as being available for bughouse +matches. + + You can only 'partner' users who are open for bughouse partnerships. i.e., +have their bugopen variable set to 1. To see which users are available for a +bughouse partnership, type "bugwho u". If you 'partner' a user, your bugopen +variable is automatically set to 1. + + If you type "partner" alone, it will cancel any partnership you have, though +it will not affect your bugopen variable setting. + +See Also: accept bughouse bugwho decline pending v_bugopen who + +[Last modified: August 5, 1997 -- Friar] diff --git a/lasker-2.2.3/data/help/password b/lasker-2.2.3/data/help/password new file mode 100755 index 0000000..4832baf --- /dev/null +++ b/lasker-2.2.3/data/help/password @@ -0,0 +1,12 @@ + +password + +Usage: password oldpassword newpassword +LIMITED TO REGISTERED USERS + + Changes your current password on the chess server ("oldpassword") to a new +password "newpassword". If "oldpassword" is incorrect, then no changes are +made. + +[Last modified: October 8, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/pause b/lasker-2.2.3/data/help/pause new file mode 100755 index 0000000..6d13579 --- /dev/null +++ b/lasker-2.2.3/data/help/pause @@ -0,0 +1,16 @@ + +pause + +Usage: pause + + A "pause" requests asks your opponent that the game you are playing be +paused -- though not adjourned. An accepted pause request has the effect of +rolling back the clocks to the time of the last move. If your opponent has +given you a pause request, using the pause command (or accept) will accept the +request. You may decline a pause request by using the decline command. To +unpause a game use "unpause". + +See Also: accept decline pending unpause + +[Last modified: June 20, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/pending b/lasker-2.2.3/data/help/pending new file mode 100755 index 0000000..59714d6 --- /dev/null +++ b/lasker-2.2.3/data/help/pending @@ -0,0 +1,12 @@ + +pending + +Usage: pending + + Displays all non-declined, pending offers from other players to you and +from you to other players. + +See also: abort accept adjourn decline draw match takeback + +[Last modified: June 11, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/play b/lasker-2.2.3/data/help/play new file mode 100755 index 0000000..28559f6 --- /dev/null +++ b/lasker-2.2.3/data/help/play @@ -0,0 +1,36 @@ + +play + +Usage: play [#num | handle] + + The "play" command is how you respond to a user's ad for a chess match. You +can select an ad either by its ad number ("index number") or by the handle of +the user who placed the ad. For example, if the ad were displayed as: + 4 1563 TheDane 2 8 unrated blitz 0-9999 +you could respond to the ad by typing either (a) "play 4" or (b) "play +TheDane". + + When you respond to an ad, a check is made that your rating is in the range +specified by the ad. If the ad asks for a formula check, the user's formula +is also examined. If you meet these criteria, your response is forwarded to +the user who placed the ad. + + If the ad calls for auto start, the game begins at once. If the ad calls +for a manual start, the other user will be notified that you are challenging +him/her to a match; he/she then can accept or decline your offer to play that +match. + +Special Notes: + +(a) If you respond to an an ad and you receive the message "Bad index given; +no such ad." it probably means that the ad has been removed, either by +'unseek' or by starting a match. + +(b) If you are on the other user's 'noplay' list, your 'play' request will be +rejected automatically. + +(c) (C)omputer accounts cannot accept seeks. + +See also: match noplay seek sought unseek + +[Last modified: March 2, 1998 -- Friar] diff --git a/lasker-2.2.3/data/help/prefresh b/lasker-2.2.3/data/help/prefresh new file mode 100755 index 0000000..07867ca --- /dev/null +++ b/lasker-2.2.3/data/help/prefresh @@ -0,0 +1,12 @@ + +prefresh + +Usage: prefresh + + This command will display your partner's game during a bughouse match. In +essence, it is "refresh" for your bughouse partner's game. + +See Also: bughouse refresh + +[Last modified: December 17, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/private b/lasker-2.2.3/data/help/private new file mode 100755 index 0000000..23cb32e --- /dev/null +++ b/lasker-2.2.3/data/help/private @@ -0,0 +1,16 @@ + +private + +Usage: set private [n] + + "Private" is one of the variables you can set. When private is non-zero, +games you play cannot be observed by other users. If private is 0, other +users will be able to observe your game -- unless your opponent has private +non-zero. A private game is designated in "games" and "history" displays by +the letter "p". Also, if a game is private, the eco category is not displayed +in the history table. + +See Also: eco games history observe variables + +[Last modified: October 8, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/promote b/lasker-2.2.3/data/help/promote new file mode 100755 index 0000000..84f5f00 --- /dev/null +++ b/lasker-2.2.3/data/help/promote @@ -0,0 +1,15 @@ + +promote + +Usage: promote {q,r,b,[kn]} + + Designates the piece that a pawn will be promoted to when it reaches +the back rank. This is set automatically at the beginning of each game +to 'q'. The setting can be changed during the game at any point. + +SPECIAL NOTE: You must designate how a pawn will be promoted BEFORE it +reaches the back rank, not afterwards. The current setting will be used when +the pawn reaches the 8th rank. + +[Last modified: October 8, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/pstat b/lasker-2.2.3/data/help/pstat new file mode 100755 index 0000000..076b1f3 --- /dev/null +++ b/lasker-2.2.3/data/help/pstat @@ -0,0 +1,201 @@ + +pstat + +The command pstat ("player statistics") displays the record one user has in +chess games against another user. Statistics 'pstat' will not include +results prior to FICS version 1.22.0 pstat will only include statistics +from your last 2500 games on the server. In general, this command can be +used wit the following formats: + + (a) pstat /o User1 -- gives your record against User1 + + (b) pstat User1 /o User2 -- gives the record for User1 against User2 + + For example, the command 'pstat knighttour /o afw' might display the + following statistics: + + knighttour's game statistics: + + Results vs. afw: + Rated(W-L-D): 10-10-5 Unrated(W-L-D): 8-8-2 + + The counts are always with respect to the FIRST player -- it is the first +player's record against the second player, in this case knighttour's record +against afw. The counts are summed across ALL types of chess matches. + + (c) For the time being Old statistics can be accessed using the command: + oldpstat (which is what pstat used to be). The oldpstat command can + be used in the same format as in examples (a), (b) and (c); without + the flag /o. + + For example, the command 'oldpstat toddmf Obliviax" might display the + following statistics: + + Record for toddmf vs. Obliviax: + + wins losses draws + rated 407 345 68 + unrated 14 6 4 + + +Other Notes: +Pstat shows result summaries starting from your latest games and looks +backwards. + +It is now possible to use the 'next' command in conunction with a helpfile and +at the same time use the command 'next stats'. + +------------------------------------------------------------------------------- + +The parameters for pstat in the following usage format: + + pstat [user] [type of results to show] [how to sort] + + [user] is the name of the player whose statistics to be viewed + if a name is missing in this command, it will show your data. + + [type of results to show] and [how to sort] is based on four sort parameters: + (opponent, eco code, etime and category/board) + +To specify results to show (ie. only those results/summaries will be shown) +use /o /e /t /b (opponent, eco, (e)time and board/category respectively) +followed by the parameter.(a) eco code is the Encylopedia of chess openings +code which describes which opening took place. It is a letter A-E followed by +a two digit number. + + +1. Sort by ECO: /e + +To see what eco code corresponds to a named opening position - see help eco. + + (a) pstat /o User1 /e + + For Example: + + pstat /o DChessmaster /e B09 + + Your game statistics: + + Results vs. DChessmaster ECO B09: + Rated(W-L-D): 2-30-1 Unrated(W-L-D): 0-0-0 + + + (b) pstat User 1 /o User2 /e + + For Example: + + pstat Bremen /o DChessmaster /e B09 + + Bremen's game statistics: + + Results vs. DChessmaster(C) ECO B09: + Rated(W-L-D): 5-5-1 Unrated(W-L-D): 0-0-0 + +2. Sort by time: /t + +etime is the maximum time 40 moves will take per player. +The formula is: etime = time + 2/3 increment + + For example: a 5 0 game is etime 5 + a 2 12 game is etime 10 + a 5 8 game is etime 6.7 + +Please see help clocks for more details. +This sort command is somewhat difficult, please read carefully. + +Results are grouped together in ranges of time and it's not possible to +specify a decimal number etime. So to request results for 5 8 (etime 6.7) +6.7 should be rounded down to 6. + +In the example above where etime is 6.7; you would have to use etime of 6 + + (a) pstat /t + + For Example: + + pstat /t 5 + + Your game statistics: + + Results vs. DHessmaster(C) ECO B09: + Rated(W-L-D): 5-5-1 Unrated(W-L-D): 0-0-0 + + Show me the summary of my games that have etime 5 (covers 5 + + For Example: + + pstat volcano /t 6 + + volcano's game statistics: + + Results etime 6<=etime<7: + Rated(W-L-D): 14-2-8 Unrated(W-L-D): 0-0-0 + + + + +3. Sort by category and board: /b + +Category and board are just like the match command (eg. bughouse, suicide, +wild 5), though the short cut for wild (w/#) does not work and chess is not +recognized. To get normal chess only use blitz, standard, lightning and +untimed as the category. Specify blitz and specifying etime as a non blitz +time control will give undefined results. + + +To group results together /s followed by one or more o,e,t,b is used. +It doesn't make sense to specific a type to show and also have it grouped +together under that type so pstat /o Fred /so is illegal. + + Examples: + + pstat /o Fred /se + + Show my results against Fred by eco code + + pstat /e C21 /sob + + Show my results in C21 by opponent and board/category + + + The following group ranges for etime are used: + + 0 + 0 < etime < 1 + 1 <= etime < 2 + 2 <= etime < 3 + 3 <= etime < 4 + 4 <= etime < 5 + 5 <= etime < 6 + 6 <= etime < 7 + 7 <= etime < 8 + 8 <= etime < 9 + 9 <= etime < 10 + 10 <= etime < 11 + 11 <= etime < 12 + 12 <= etime < 13 + 13 <= etime < 14 + 14 <= etime < 15 + 15 <= etime < 20 + 20 <= etime < 25 + 25 <= etime < 30 + 30 <= etime < 35 + 35 <= etime < 40 + 40 <= etime < 45 + 45 <= etime < 50 + 50 <= etime < 55 + 55 <= etime < 60 + 60 <= etime < 75 + 75 <= etime < 90 + 90 <= etime < 105 + 105 <= etime < 120 + 120 <= etime < 150 + 150 <= etime < 180 + 180 <= etime + + +See also: assess eco finger match + +[Last modified: Dec. 11, 2001 -- MAd] \ No newline at end of file diff --git a/lasker-2.2.3/data/help/ptell b/lasker-2.2.3/data/help/ptell new file mode 100755 index 0000000..7e43eb6 --- /dev/null +++ b/lasker-2.2.3/data/help/ptell @@ -0,0 +1,12 @@ + +ptell + +Usage: ptell string + + This form of communication is used during a bughouse match. "Ptell" will +send a message to your partner; no one else will receive it. + +See Also: bughouse tell + +[Last modified: November 26, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/ptime b/lasker-2.2.3/data/help/ptime new file mode 100755 index 0000000..b5bf8d7 --- /dev/null +++ b/lasker-2.2.3/data/help/ptime @@ -0,0 +1,17 @@ + +ptime + +Usage: ptime + + This command is used during a bughouse match in order to display the current +clock times in your partner's game. + +SPECIAL NOTES: + +(a) The ptime command is _not_ related to the ptime variable. The ptime +variable concerns having the current time displayed along with the server +prompt. See 'help v_ptime' for details. + +See Also: bughouse time v_ptime + +[Last modified: March 26, 1997 -- Friar] diff --git a/lasker-2.2.3/data/help/qtell b/lasker-2.2.3/data/help/qtell new file mode 100755 index 0000000..e240b68 --- /dev/null +++ b/lasker-2.2.3/data/help/qtell @@ -0,0 +1,12 @@ + +qtell + +USAGE: By TD programs, only + + The qtell command is a special channel tell command designed for the TD +programs that run tournaments on the chess server. This command is not +available to users or admins. + +See Also: tell + +[Last modified: October 30, 1997 -- Friar] diff --git a/lasker-2.2.3/data/help/quit b/lasker-2.2.3/data/help/quit new file mode 100755 index 0000000..e45dd87 --- /dev/null +++ b/lasker-2.2.3/data/help/quit @@ -0,0 +1,16 @@ + +quit + +Usage: quit + + This command exits you from the server. "Bye" and "exit" are default +aliases for "quit". + +SPECIAL NOTE: This command cannot be used if you are in the middle of a chess +match. If you need to leave during a match, first ask your opponent for an +adjournment and explain why. + +See Also: adjourn alias + +[Last modified: October 8, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/rank b/lasker-2.2.3/data/help/rank new file mode 100755 index 0000000..cd66335 --- /dev/null +++ b/lasker-2.2.3/data/help/rank @@ -0,0 +1,32 @@ + +rank + +Usage: rank [user [b][s][w]] + rank m-n [b][s][w] + + The first usage shows the ranking of the given user and all users with +nearby rankings. A second argument with one or more of the letters b, s, +and/or w asks to show only blitz, standard, and/or wild ratings respectively. +If no second argument is given, rankings for all three types are shown. For +example, "rank foo bw" shows the blitz and wild ranking of the player whose +handle is "foo". If 'user' is omitted, your rankings will be displayed. + + The second usage shows all players ranked between the rankings of M and N. +The optional third argument again limits which ratings are shown. For +example, "rank 1-30 sw" lists the players with the highest 30 standard and +wild ratings. "Best" lists the top 20 players in a category. + + The columns are always sorted by blitz, then standard, then wild. + + Currently, all players with at least 20 games of a particular rating type +are ranked. If you ask for a player's rank and they do not yet have the 20 +games needed to be an active player, the player's current rating will be +displayed in the table but a line (----) will precede the handle to indicate a +provisional ranking. + + To omit computers from the list, use "hrank". + +See Also: best hbest hrank + +[Last modified: June 13, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/ratings b/lasker-2.2.3/data/help/ratings new file mode 100755 index 0000000..934759f --- /dev/null +++ b/lasker-2.2.3/data/help/ratings @@ -0,0 +1,54 @@ + +ratings + + Chess ratings serve two purposes: (a) they tell you your relative ability, +and (b) are useful means for identifying and playing opponents of roughly your +same ability. + + This server utilizes the Glicko rating system developed by Mark E. Glickman +(with assistance and corrections by Dmitry Dakhnovsky and server +implementation by Vek and Hawk). The full explanation of this system is given +in the "glicko" help file. + + In general, your rating will be adjusted by several factors: (a) the result +of your game (win, loss, draw), (b) your opponent's rating, (c) the stability +of your rating, and (d) the stability of your opponent's rating. If you want +to determine how your rating might change after a match with a given player, +use the "assess" command. + + At present, there are separate ratings for three kinds of chess: Standard, +Blitz and Wild. Your current rating is available on your "finger" file. Once +you have an established rating (20 or more games) in a given type, your +highest established rating to date will also be displayed. Players with +established ratings will also have their ratings listed on several ranking +lists (see the "best", "hbest", "rank" and "hrank" help files). + + By default, the "who" command lists logged on users in order of their +ratings. This way, you can identify and match players of certain ratings. +You can also use ratings in your "formula" for filtering out match requests +from other players. Ratings can also be used to filter out kibitzes and +whispers by the "kiblevel" variable. + + +TRANSFERRING RATINGS FROM ANOTHER CHESS SERVER + + It is possible to transfer your rating from another chess server to this +server. Contact an admin concerning which admin should process your request +since different admins are on different chess servers. In general, you will +need to email your request to that admin. Please use the subject line +"Request for ratings transfer" and in the body of the email tell the admin +your handle(s) on both chess servers. Also be sure to "message" the admin on +the other server so the admin can verify that you are the person you claim to +be. + +SPECIAL NOTES: + +(a) In the case of adjourned games that are resumed, ratings are adjusted by +the users' ratings at the time the match is resumed rather than the ratings +they had when the match was started. + +See Also: assess best finger formula glicko hbest hrank kiblevel +message rank who + +[Last modified: October 8, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/refresh b/lasker-2.2.3/data/help/refresh new file mode 100755 index 0000000..e68adeb --- /dev/null +++ b/lasker-2.2.3/data/help/refresh @@ -0,0 +1,16 @@ + +refresh + +Usage: refresh [game] + + Redisplays the given game position and clock times. If 'game' is omitted, +then the current game you are playing or observing will be redisplayed. This +command is especially useful if you are using an ascii board style and it +scrolls off the screen, or if you want to confirm the current board position +and/or clock times. (Time can also be confirmed by the "time" command.) The +alias for "refresh" is "re". + +See Also: games style time + +[Last modified: November 26, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/register b/lasker-2.2.3/data/help/register new file mode 100755 index 0000000..e8d5965 --- /dev/null +++ b/lasker-2.2.3/data/help/register @@ -0,0 +1,56 @@ + +register + + *** *** + *** Registration is now automated using email! *** + *** *** + + + To get a registered account on this server, send a message to the following +address ... + + chess@caissa.onenet.net + +... and use as the Subject: "Fics Registration". The text of your message +should read (please make the appropriate substitutions as indicated by the +<>'s markers): + + fics_addplayer "" + +**** Be sure to read "help handle" on the server's online help reguarding +**** handle name policy! + +Quotation marks MUST be used around the name field. Do NOT include the <>'s +markers in your text; they are used above only to indicate where you need to +place information. If this is a human account, 'human' need not be specified; +however, 'computer' MUST be used if you are registering a computer on FICS +(see "computers" help file). + + Here are two examples that would register Sparky with the correct name and +email information: + + fics_addplayer Sparky "Chris L. Petroff" chris@onenet.net -OR- + fics_addplayer Sparky "Chris L. Petroff" chris@onenet.net human + + +SPECIAL NOTES: + +(1) PLEASE SELECT YOUR HANDLE CAREFULLY! We do not change handles for +accounts once they have been created. So choose a handle that you are willing +to keep. If for some reason the handle you want is already taken, you will be +notified. To check in advance whether a handle is already being used, use the +"handles" command. Lastly, your handle must not be offensive! Offensive +handles will be removed. (See "handle" help file.) + +(2) ONLINE REGISTRATION WILL BE LIMITED. Email registration provides +security for users and reduces mistakes. Contact an admin about registration +if you have difficulties with email registration or if it is impossible. + +(3) Please tell us if you are an FM, IM or GM (master's titles for +international competition). We can include you on our master's lists. + + +See Also: computers handle handles showlists + +[Last modified: July 26, 1995 -- Sparky] + diff --git a/lasker-2.2.3/data/help/register.dist b/lasker-2.2.3/data/help/register.dist new file mode 100755 index 0000000..c819cf0 --- /dev/null +++ b/lasker-2.2.3/data/help/register.dist @@ -0,0 +1,16 @@ +To get a registered account, send a message to AdminGuy: + +mess AdminGuy fics_addplayer "" + + NOTE1: quotes have to be around the name field. + NOTE2: do not include the <>'s in your mail. They only indicate + where you need to place information. + + An example would be like the following, which would register + AdminGuy with the correct name and email information. + + Ex: fics_addplayer AdminGuy "I. M. Admin" chris@onenet.net + + Please tell us if you will be playing with a computer (meaning + that a COMPUTER is deciding what moves to make), or if you are an + FM, IM or GM (master's titles for international competition). diff --git a/lasker-2.2.3/data/help/register.email b/lasker-2.2.3/data/help/register.email new file mode 100755 index 0000000..e8e8c6a --- /dev/null +++ b/lasker-2.2.3/data/help/register.email @@ -0,0 +1,25 @@ +To get a registered account, send mail to: + + (New installations plaese put something here!) + + With the Subject: "Fics Registration" + + Include a line like the following in your mail. Please make the appropriate + substitutions inside of the <>'s: + + fics_addplayer "" + + NOTE1: quotes have to be around the name field. + NOTE2: If a human account, human need not be specified. + NOTE3: do not include the <>'s in your mail. They only indicate + where you need to place information. + + An example would be like the following, which would register + Sparky with the correct name and email information. + + Ex: fics_addplayer AdminGuy "I. M. Admin" chris@onenet.net + or: fics_addplayer AdminGuy "I. M. Admin" chris@onenet.net human + + Please tell us if you will be playing with a computer (meaning + that a COMPUTER is deciding what moves to make), or if you are an + FM, IM or GM (master's titles for international competition). diff --git a/lasker-2.2.3/data/help/remote b/lasker-2.2.3/data/help/remote new file mode 100644 index 0000000..4322e58 --- /dev/null +++ b/lasker-2.2.3/data/help/remote @@ -0,0 +1,22 @@ + +remote + +Usage: remote USER command + + This command allows you to remotely control another logged in user, + if you are in their "remote" list. The player you are controlling + will receive a message telling them who issued a command and what + command was issued. + + This command is intended to make controlling computer accounts easier. + + To add a player to your remote list use the command: + +remote USER + + To remove a player from your remote list use the command: + -remote USER + + To see who is in your remote list use the command: + =remote + +See Also: channel diff --git a/lasker-2.2.3/data/help/resign b/lasker-2.2.3/data/help/resign new file mode 100755 index 0000000..aafe819 --- /dev/null +++ b/lasker-2.2.3/data/help/resign @@ -0,0 +1,17 @@ + +resign + +Usage: resign [name] + + Resigns the game you are playing and gives your opponent the win. You will +then be available for another game. + + It is possible to resign an adjourned game by including your opponent's +name. For example, "resign Hawk" would resign your adjourned game with Hawk. +Before you do this, make sure that the game has been stored. When you resign +an adjourned game, a notification message will be sent to your opponent. + +See Also: adjourn intro_playing stored + +[Last modified: October 8, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/revert b/lasker-2.2.3/data/help/revert new file mode 100755 index 0000000..e7d16aa --- /dev/null +++ b/lasker-2.2.3/data/help/revert @@ -0,0 +1,13 @@ + +revert + +Usage: revert + + This command is used by a person examining a game in order to return to the +main line of the game being examining. The analysis (subvariation line) is +cancelled. + +See Also: examine + +[Last modified: October 8, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/rmatch b/lasker-2.2.3/data/help/rmatch new file mode 100644 index 0000000..75dc056 --- /dev/null +++ b/lasker-2.2.3/data/help/rmatch @@ -0,0 +1,11 @@ + +rmatch + +RESTRICTED TO TOURNAMENT DIRECTORS + +Usage: match user1 user2 + +SUMMARY + +This command is used to by tournament directors to start tournament +matches diff --git a/lasker-2.2.3/data/help/say b/lasker-2.2.3/data/help/say new file mode 100755 index 0000000..189532e --- /dev/null +++ b/lasker-2.2.3/data/help/say @@ -0,0 +1,18 @@ + +say + +Usage: say message + + Transmits your message to your current opponent if you are playing a +game. If you are not playing a game, the message is sent to the last +opponent you had in your current logon session. + + "Say" is an easy form of "tell" as you can see, because you do not need to +enter the user's name. "Say" differs from "kibitz": both commands send a +message to your opponent, but "kibitz" also sends the same message to any +observers of your game and kibitzes can be filtered in various ways. + +See Also: intro_talking kibitz kiblevel tell + +[Last modified: October 8, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/seek b/lasker-2.2.3/data/help/seek new file mode 100755 index 0000000..30c6f26 --- /dev/null +++ b/lasker-2.2.3/data/help/seek @@ -0,0 +1,102 @@ +seek + +Usage: seek [time inc] [rated|unrated] [white|black] [crazyhouse] [suicide] + [wild #] [auto|manual] [formula] [rating-range] + + The "seek" command allows you to post an advertisement for a chess +game of the specified type. The various parameters of the "seek" +command are as follows: + + PARAMETER COMMENTS + --------- -------- + time minutes to start with for each player [default: your Time + variable setting] + inc seconds added to each clock per move [default: your Inc + variable setting] + rated/unrated type of match; may be abbreviated by "r" and "u" + [default: your Rated variable setting] + white/black designated colour you will have; may be abbreviated by "w" + and "b" [default: no colour specified] + crazyhouse see "help crazyhouse" if you are not familiar with this + chess variant; may be abreviated by "zh" + suicide see "help suicide" if you are not familiar with this + chess variant + wild # wild chess variant, if any, such as wild 1, wild 2, wild + fr, etc.; a shortcut for wild # is w#, but wild fr has no + shortcut [default: regular chess] + auto/manual indicates whether a game will start automatically when + the ad is responded to, or if the person who placed the + ad has the option to decline responses; may be + abbreviated by "a" and "m" [default: auto start] + formula indicates whether your formula will used to screen + responses to your ad; may be abbreviated by "f" [default: + formula is not checked] + rating-range indicates rating qualifications for the opponents, such + as 1300-1800 [default: 0000-9999] + +Note: If settings for time, inc or rated/unrated are not given, your +"variables" settings will be used. Example A: if your variables settings have +Time = 5, Inc = 0, and rated = 0 then typing "seek" would be the same as +typing "seek 5 0 u". Example B: if your variables settings have Time = 5, Inc += 12, then typing "seek 2" would be the same as typing "seek 2 12". + +When you place an ad, it will be displayed to users in this general format: + + Hawk(2700) seeking 5 0 rated blitz [white] m ("play 2" to respond) + + +FREQUENTLY ASKED QUESTIONS: + +(1) Who will see my ad when it is posted? -- To have your ad displayed +to a user the moment you make it, the other user must have his/her +"seek" variable set to 1 and the ad must agree with his/her formula (see +"help formula"). Otherwise, users can type "sought" to display current +ads (see "help sought"). + +(2) How can I see ads displayed? -- There are two ways: (a) type "set +seek 1" and see ads displayed when they are created (type "set seek 0" +to cancel these postings; see "help v_seek"); (b) type "sought" to +display current ads for which are you eligible (see "help sought"). + +(3) How many ads can I place at once? -- This value is set in the server code +when it is compiled. To see the current limit for active seek ads, type +"limits". + +(4) How can I see my own ad? -- You need to type "sought all" (see "help +sought"). + +(5) How do I withdraw an ad I have placed? -- Use the "unseek" command +(see "help unseek"). + +(6) How do I respond to an ad? -- Use the "play" command (see "help +play"). + +(7) What happens to my "open" variable when I post an ad or respond to +an ad? -- Nothing. The value for your "open" variable does not change. +For example, you can have "open=0" but still place ads and repsond to +them. + +(8) What does the "manual" option do exactly? -- When you place a +"seek" ad using manual start and a user responds to your ad, you will be +sent a "match" request. You will then have the option of accepting or +declining that user's offer to play your advertised match + +SPECIAL NOTES: + +(a) Users on your 'noplay' list will not be able to respond to your seek ad; +the 'play' command will be rejected automatically. + +(b) (C)omputer accounts can issue seeks, but they cannot answer them. + +(i) The server software uses your history (and your opponent's) to determine +who will get White. Starting from the bottom, for each entry we compare the +colour you had and the one your opponent had. If they match, we look at the +next entry. If they don't match we swap them and that is your colour for this +game. If there are fewer than 10 entries for one player we assume the missing +colour is the opposite of the one we know about. If they both run out together, +or all 10 entries match, the colour is randomly chosen. + +See also: crazyhouse formula fr history limits match noplay play sought + suicide unseek variables v_inc v_open v_seek v_time wild + +[Last modified: February 17, 1999 -- pgv] diff --git a/lasker-2.2.3/data/help/servers b/lasker-2.2.3/data/help/servers new file mode 100755 index 0000000..ebd2ee0 --- /dev/null +++ b/lasker-2.2.3/data/help/servers @@ -0,0 +1,6 @@ +Usage: servers + + Lists all servers that are known to the main ratings server. Many of the +machines listed may be out of date or not currently operating, but this +will give you a place to start looking for a different server. + diff --git a/lasker-2.2.3/data/help/set b/lasker-2.2.3/data/help/set new file mode 100755 index 0000000..ba9dbc1 --- /dev/null +++ b/lasker-2.2.3/data/help/set @@ -0,0 +1,43 @@ + +set + +Usage: set variable_name [value] + + You have a number of predefined variables that control the behavior of your +account. This command allows you to control those variables and modify their +settings. Generally, if "value" is omitted, the variable is toggled ON/OFF +(0/1). + +Examples: + set shout 0 + set f4 !private & !computer !abuser + set time 10 + set inc 0 + set auto 1 + set style 12 + + To see the list of all of variables you can control, type "help variables". +There are also other special uses of the "set" command, as follows. + +BUSY MESSAGE + + If you will be idle for a while, you can have a brief message displayed to +users when they "tell" you something. Read the "busy" help file for details. + +FINGER NOTES + + You can have up to 10 information lines that can be displayed when someone +uses the "finger" command. These text lines are modified by typing "set n +" where 'n' can be any integer from 1-10. You can erase one of your +lines by typing "set n" without any text. (See "notes" help file.) + +FORMULA + + You can filter out match requests by setting a formula. Your formula may +include certain variables you can also set. Read the "formula" help file for +details. + +See Also: busy finger formula notes variables + +[Last modified: December 17, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/shout b/lasker-2.2.3/data/help/shout new file mode 100755 index 0000000..5d528c9 --- /dev/null +++ b/lasker-2.2.3/data/help/shout @@ -0,0 +1,47 @@ + +shout + +Usage: shout message +LIMITED TO REGISTERED USERS + + Displays your message to all users who are open to hear shouts. Returns +the number of users who heard your shout. "Shout" has an alias of "!". + + Here is an example: if your handle is HANDEL and you type "shout This server +is great!", users will see the following message displayed -- + + HANDEL shouts: This server is great! + +You, as the sender, will see the following -- + + (##) HANDEL shouts: This server is great! + +where ## is the number of users who received the message. + + All users have a set shout quota, a limit on how many shouts can be made +within a given period of time. Further details are given in the "shout_quota" +help file. + + +SPECIAL NOTES: + + (a) Use "cshout" rather than "shout" for chess-related messages. + + (b) To contact just one user, use "tell". + + (c) If you want to contact a specific group of users, "tell" to a channel. + + (d) "It" and "shout" are similar. Be familiar with their differences. + + (e) Persons who "shout" in less than appropriate ways, may be placed on the +shout_abuse list or given other sanctions (such as "muzzle"). + + (f) You can decide whether or not to hear a "shout" from other users; +setting the "shout" variable to 0 (zero) filters these from being sent to you +("set shout off" or "set shout 0"). + +See Also: channel cshout intro_talking it shout_abuse shout_quota tell +variables + +[Last modified: October 17, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/shout_abuse b/lasker-2.2.3/data/help/shout_abuse new file mode 100755 index 0000000..2afa0a0 --- /dev/null +++ b/lasker-2.2.3/data/help/shout_abuse @@ -0,0 +1,64 @@ + +shout_abuse + + This help file is to give some guidance on the accepted use of shouting. +Breaking these guidelines may result in sanctions, such as a quota on your +shouts or even worse muzzling (your shouting privileges revoked). REMEMBER: +some people use text boards but still have shout on, which means that +unnecessary shouts scroll their screen unnecessarily. + +THINGS THAT ANNOY OTHERS -- hence shout quotas or other sanctions: + + Saying the same or similar things several times in a row. For example: + + --> DAV is here. + --> DAV is here. + --> DAV greets all. + --> DAV is here. + + Annoying others by imitating system messages. For example: + + --> DAV has left a message for you. + --> DAV tells you: hi how are you? + + Talking about something that should be in a channel -- after warnings. + The channel help file ("help channel") gives a list of all pre-defined + channels. + + Also too much hugging and kissing -- except for login/out greetings; use + channel 51 for that please -- but keep the language clean! + + Cursing and cussing others on shouts (including don't play xxx for yyy + reason). + + Shouting far too often, lengthy shouts (e.g., ASCII pictures) beyond about + five or so lines). + + Holding two person conversations on shout. + + Anything else an admin sees fit. + + + +THINGS THAT ARE FORBIDDEN -- hence muzzle or (worse) a ban from FICS: + + Swearing, in general or at others. + + Discriminatory remarks -- see help etiquette. + + Constant shout abuse. + + Anything else an admin sees fit. + + + NOTE: any sanctions that are made against you are likely to be recorded, +so punishment may be incremental for a second offence. A bad comment +file is also likely to get you barred from privileges that may occur +time to time, including the possibility of adminship. + + DAV 05/12/95 + +See Also: abuser etiquette handle shout_quota + +[Slight edits by Friar; last modified July 19, 1995] + diff --git a/lasker-2.2.3/data/help/shout_quota b/lasker-2.2.3/data/help/shout_quota new file mode 100755 index 0000000..6424db5 --- /dev/null +++ b/lasker-2.2.3/data/help/shout_quota @@ -0,0 +1,18 @@ + +shout_quota + + In order to encourage users to hold conversations in channels rather than +with "shouts" the server has a shout quota. A shout quota limits the +frequency of a user's shouts (including "it"-type shouts). For normal +purposes, the standard shout quota is not a limitation. + + Imposing more strict shout quotas is a sanction for cases of shout abuse. + + If you type "shout" or "it" alone without any message, you will be informed +about your current shout status: either (a) you may shout now, or (b) the time +when you may next make a shout. + +See Also: channel etiquette intro_talking it shout shout_abuse + +[Last modified: August 28, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/showlist b/lasker-2.2.3/data/help/showlist new file mode 100755 index 0000000..45d1dbc --- /dev/null +++ b/lasker-2.2.3/data/help/showlist @@ -0,0 +1,18 @@ + +showlist + +Usage: showlist [list_name] + + This command lists the handles of users on a given list. The server +maintains various special lists, such as the handles of admins and +grandmasters on the server. To display the names of available lists, type +"showlist". Each list will either be READ ONLY, meaning you can display the +listing, or SECRET, meaning only admins can display the listing. The alias +for "showlist" is "=". For example, "=admin" will list the handles of the +server admins and "=computers" will list computers that have accounts on the +server. + +See Also: addlist admins lists sublist + +[Last modified: September 2, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/simabort b/lasker-2.2.3/data/help/simabort new file mode 100755 index 0000000..b59f18e --- /dev/null +++ b/lasker-2.2.3/data/help/simabort @@ -0,0 +1,15 @@ + +simabort + +Usage: simabort + + Used by a player engaged in simultaneous chess matches. Aborts the current +board. Use this command if the player you are playing is obnoxious or taking +too long to make the next move. Don't use it if you are losing, though. + + The standard alias for simabort is "sa". + +See Also: simadjourn simallabort simmatch simpass simuls + +[Last modified: June 16, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/simadjourn b/lasker-2.2.3/data/help/simadjourn new file mode 100755 index 0000000..9a86e57 --- /dev/null +++ b/lasker-2.2.3/data/help/simadjourn @@ -0,0 +1,18 @@ + +simadjourn + +Usage: simadjourn + + Used by a player engaged in simultaneous chess matches. Adjourns the +current board. Use this command in special circumstances, such as your +opponent not being able to finish due to time constraints. Please don't use +this command if you are losing, of course. + + To continue your game, use the simmatch command. + + The standard alias for simadjourn is "sadj". + +See Also: simabort simadjourn simalladjourn simmatch simpass simuls + +[Last modified: June 16, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/simallabort b/lasker-2.2.3/data/help/simallabort new file mode 100755 index 0000000..c80589a --- /dev/null +++ b/lasker-2.2.3/data/help/simallabort @@ -0,0 +1,14 @@ + +simallabort + +Usage: simallabort + + Used by a player engaged in simultaneous chess matches. Aborts all boards +still in progress. + + The standard alias for simallabort is "saa". + +See Also: simabort simadjourn simalladjourn simmatch simpass simuls + +[Last modified: June 16, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/simalladjourn b/lasker-2.2.3/data/help/simalladjourn new file mode 100755 index 0000000..27b6188 --- /dev/null +++ b/lasker-2.2.3/data/help/simalladjourn @@ -0,0 +1,18 @@ + +simalladjourn + +Usage: simalladjourn + + Used by a player engaged in simultaneous chess matches. Adjourns all boards +in progress. Use this command in special circumstances, such as your not +being able to finish due to time constraints. Please don't use this command +if you are losing, of course. + + To continue your game(s), use the simmatch command. + + The standard alias for simalladjourn is "saadj". + +See Also: simabort simadjourn simallabort simmatch simpass simuls + +[Last modified: June 16, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/simgames b/lasker-2.2.3/data/help/simgames new file mode 100755 index 0000000..d688553 --- /dev/null +++ b/lasker-2.2.3/data/help/simgames @@ -0,0 +1,13 @@ + +simgames + +Usage: simgames [player] + + Shows the number of active boards the player is playing in a simul. If no +parameter is specified, the number of boards you are playing will be +displayed. + +See Also: simmatch simuls + +[Last modified: July 7, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/simmatch b/lasker-2.2.3/data/help/simmatch new file mode 100755 index 0000000..0be861d --- /dev/null +++ b/lasker-2.2.3/data/help/simmatch @@ -0,0 +1,17 @@ + +simmatch + +Usage: simmatch player + + Requests a simul match with the given player. That player must have +his/her "simopen" flag on in order to accept simul requests. Once a match +has started, you will be informed where in line you are. You will play +BLACK. + + Simmatch can also be used to restart an adjourned simul match, or untimed +games in simul form. + +See Also: simadjourn simalladjourn simopen simuls + +[Last modified: June 16, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/simnext b/lasker-2.2.3/data/help/simnext new file mode 100755 index 0000000..c79043b --- /dev/null +++ b/lasker-2.2.3/data/help/simnext @@ -0,0 +1,15 @@ + +simnext + +Usage: simnext + + Used by a player engaged in simultaneous chess matches. Use simnext to +move to the next game in the rotation so that you can make your next move +in that game. An alias for "simnext" is "sn". + + To go to a specific board, use "goboard" or "gonum". + +See Also: goboard gonum simuls simmatch simprev + +[Last modified: June 16, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/simopen b/lasker-2.2.3/data/help/simopen new file mode 100755 index 0000000..74fe214 --- /dev/null +++ b/lasker-2.2.3/data/help/simopen @@ -0,0 +1,14 @@ + +simopen + +Usage: simopen + + Toggles your 'simopen' variable 0/1. Equivalent to "set simopen". If +simopen is 1, then you are open to play more than one chess game at a time: +have a simultaneous chess exhibition. More details are in the "simuls" help +file. + +See Also: simuls variables + +[Last modified: June 22, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/simpass b/lasker-2.2.3/data/help/simpass new file mode 100755 index 0000000..8505e61 --- /dev/null +++ b/lasker-2.2.3/data/help/simpass @@ -0,0 +1,14 @@ + +simpass + +Usage: simpass + + This command is upen by an opponent of a simul player. Use this command if +you are not ready to move when the simul giver gets to your board and you wish +more time for considering yuor move. You have 3 passes per match, then you +must move or risk having your game be aborted. + +See Also: simabort simuls + +[Last modified: July 7, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/simprev b/lasker-2.2.3/data/help/simprev new file mode 100755 index 0000000..c0d6c6f --- /dev/null +++ b/lasker-2.2.3/data/help/simprev @@ -0,0 +1,15 @@ + +simprev + +Usage: simprev + + Used by a player engaged in simultaneous chess matches. Use simprev to +move to the previous game in the rotation so that you can make your next move +in that game. An alias for "simnext" is "sp". + + To go to a specific board, use "goboard" or "gonum". + +See Also: goboard gonum simnext simuls + +[Last modified: June 16, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/simuls b/lasker-2.2.3/data/help/simuls new file mode 100755 index 0000000..1f03ed2 --- /dev/null +++ b/lasker-2.2.3/data/help/simuls @@ -0,0 +1,76 @@ + +simuls + + "Simuls" = simultaneous chess matches; playing more than one opponent at a +time. It is possible to play more than one opponent simultaneously on the +chess server. Below are sections for Starting a Simul and for Joining a +Simul. + + +STARTING A SIMUL + + In order to play more than one chess match simultaneously you need to do the +following: + +1. Turn on your simopen flag with "simopen". Announce your simul conditions + on shout and cshout enough to get the word out, but not so much as to annoy + users. + +2. Other users must then challenge you with "simmatch". + +3. Accept or reject the challenges as they come in. You play WHITE in all + games. + +4. When you are satisfied that you have started the number of games that you + can handle, turn off your simopen flag. You can see how many games you + are playing with "simgames". + +5. You can then start making moves on the board. The "simnext" command moves + you to the next board; "simprev" moves you to the previous board. You + will focus on one game at a time, going in a particular order. + +6. If you are bothered by how long a player is taking to make the next move, + you can abort that game with "simabort". You are in control of these + limits since the games are untimed. + +7. When all matches you are playing are complete, you will get your results. + +Various commands you can use while running a simul include: goboard, gonum, +simabort, simadjourn, simallabort, simalladjourn, simnext, simopen and +simprev. + + +JOINING A SIMUL + + In order to play against a user who is open for playing simultaneous +matches, here is what you do: + +1. Using the "simmatch" command, challenge the person you will be playing. + If the challenge is accepted, you will play BLACK. + +2. You will be informed when the simul player is coming to your board. You + should be prepared to move either before or shortly after that player + arrives at your board. If you do not move within a reasonable time + period, your game could be aborted. + +3. It is impolite to offer a draw unless that player is at your board. It + could very easily confuse the simul player if offers come in from + different users at once. + +4. If your game ends early, you may want to turn on your ginform flag so + that you can see the final result of the simul games. You can also + observe the games; when the last game is over, you get the results. + + +OBSERVING A SIMUL + + You can observe all games in a simul once they have started by typing +"observe simul_player". All of the simul_player's simul games will be added +to your observation list. As the simul_player moves from board to board, so +will you. When the last game has ended, you will see the final results from +the simul games. + +See Also: observe set simmatch simgames [and other commands given above] + +[Last modified: August 15, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/smoves b/lasker-2.2.3/data/help/smoves new file mode 100755 index 0000000..1dfbff3 --- /dev/null +++ b/lasker-2.2.3/data/help/smoves @@ -0,0 +1,23 @@ + +smoves + +Usage: smoves player1 {#, player2, journal_slot} + + Displays the moves of player1's game. You must designate either game # from +player1's "history" table, player2 from player1's "stored" (adjourned) games, +or a game from the user's journal. + + Examples: + + smoves Hawk 65 [for a history game] + smoves Hawk DAV [for a stored game] + smoves Hawk K [for a journal game] + + Other useful commands: (a) "examine" helps you review the game; (b) +"mailstored" mails moves to you; (c) "sposition" displays current game +position. + +See Also: examine history journal mailstored sposition stored + +[Last modified: December 17, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/soapbox b/lasker-2.2.3/data/help/soapbox new file mode 100755 index 0000000..21011d6 --- /dev/null +++ b/lasker-2.2.3/data/help/soapbox @@ -0,0 +1,39 @@ + +Soapbox + + It is my hope that the source code to quality chess server software +will be available to the internet community for free. It could be the +FICS, the ICS, or some other new software, it doesn't matter. + + When Michael Moore started the chess server years ago, it was his +intention to provide free access to it to everyone. He distributed the +server code freely in the hope that server sites might spring up and +flourish. Unfortunately, the situation exists today where one small +group of people have hoarded the source code and refuse to allow +any alternate servers start. I hope that my efforts in re-writing +a public domain server has the effect to improve the server, both in +substance and in administration. + + If the FICS catches on and replaces the ICS (unlikely), then we win. If +the ICS is released as source code to the public and the FICS dies, then +we win. If the FICS and ICS go on coexisting perhaps someday sharing the +same ratings server, we win. + + The only way we lose is if the status-quo is maintained and the only +source of internet chess is controlled by a few individuals. + +Richard Nash + +SoapboxII (The revenge of soapbox! :) ) + + Since then, ICS went free and we all lived (almost) happily, however +ICS became ICC and wanted to charge $49 to play chess. + Now, I understand that the ICC code had lots of work put into it and its +writer deserves something. However in the spirit of how ICS was set up, I +and others feel asking for donations would be better and no pay or else +attitute. + So, a band of programmers and ex-admins of ICC got together to rewrite +the out of date FICS code and this is what you are using now. + FICS is free. Enjoy it. + + Dan,DAV,foxbat,friar,grimm,hawk,loon,mann,Shane,Sparky et al. diff --git a/lasker-2.2.3/data/help/sought b/lasker-2.2.3/data/help/sought new file mode 100755 index 0000000..d98fcff --- /dev/null +++ b/lasker-2.2.3/data/help/sought @@ -0,0 +1,30 @@ + +sought + +Usage: sought [all] + + The "sought" command can be used in two ways: (a) typing "sought all" will +display all current ads including your own; (b) typing "sought" alone will +display only those current ads for which you are eligible based on any formula +you might have (default). An example output is as follows: + + 0 1900 Hawk blitz 5 0 rated 1800-2000 f + 1 1700 Friar wild7 2 12 unrated [white] 0-9999 + 4 1500 loon standard 5 0 unrated 0-9999 m + +The various columns have this information: + + Ad index number + Player's rating + Player's handle + Type of chess match + Time at start + Increment per move + Rated/unrated + Color (if specified) + Rating range + Auto start/manual start and whether formula will be checked + +See also: formula match play seek unseek + +[Last modified: February 5, 1998 -- Friar] diff --git a/lasker-2.2.3/data/help/sourcecode b/lasker-2.2.3/data/help/sourcecode new file mode 100755 index 0000000..d978430 --- /dev/null +++ b/lasker-2.2.3/data/help/sourcecode @@ -0,0 +1,14 @@ + +sourcecode + + You can get a version of the code via anonymous ftp to 'ics.onenet.net' in +the directory /pub/chess/Unix. + + If you make any changes to the code that you would like to see incorporated +into future releases, please mail them to u940456@daimi.aau.dk. I'm hoping +that the FICS community will help improve and debug this server. + +See Also: + +[Last modified: June 15, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/sposition b/lasker-2.2.3/data/help/sposition new file mode 100755 index 0000000..f6e0dd8 --- /dev/null +++ b/lasker-2.2.3/data/help/sposition @@ -0,0 +1,12 @@ + +sposition + +Usage: sposition player1 player2 + + Displays the position of the stored game between player1 and player2. This +command only displays the game position; use "examine" for analysis. + +See Also: examine smoves stored + +[Last modified: December 25, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/standard b/lasker-2.2.3/data/help/standard new file mode 100644 index 0000000..37be1f0 --- /dev/null +++ b/lasker-2.2.3/data/help/standard @@ -0,0 +1,48 @@ + +standard + + There are four types of regular (not wild or bughouse) chess played on this +chess server: Untimed, Lightning, Blitz and Standard. + + A game is "Standard" if the expected duration of the game is 15 minutes or +more. "Expected duration" is determined by a formula that takes into account +both the Start time and the Increment (Inc) value. Here is the formula: + + Expected duration = (Start + Inc*2/3) + + The following table shows the slowest Blitz and fastest Standard time +controls, the dividing line if you will between those two types of matches. +[Thanks to schwartzeer for the calculations. :) ] + + Slowest Blitz Fastest Standard + ------------------------------------ + Mins Incr Mins Incr + ------------------------------------ + 0 22 0 23 + 1 20 1 21 + 2 19 2 20 + 3 17 3 18 + 4 16 4 17 + 5 14 5 15 + 6 13 6 14 + 7 11 7 12 + 8 10 8 11 + 9 8 9 9 + 10 7 10 8 + 11 5 11 6 + 12 4 12 5 + 13 2 13 3 + 14 1 14 2 + -------- 15 0 + + As you can see, not every game with more minutes to start is Standard and +not every game with few minutes to start is Blitz. + + You can list logged on users according to their Standard ratings by typing +"who s". "Standard" is also a variable that can be used in formulas in order +to screen match requests. + +See Also: blitz formula lightning match who + +[Last modified: December 25, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/statistics b/lasker-2.2.3/data/help/statistics new file mode 100755 index 0000000..d91285e --- /dev/null +++ b/lasker-2.2.3/data/help/statistics @@ -0,0 +1,14 @@ + +statistics + +Usage: statistics + + Displays some statistics on all the players together. For each type of +rated chess, the table gives (a) the average rating, (b) the standard +deviation (or variability) of the ratings, and (c) the number of rated players +(including provisional ratings). + +See Also: totals uptime + +[Last modified: October 8, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/stored b/lasker-2.2.3/data/help/stored new file mode 100755 index 0000000..e56dfd0 --- /dev/null +++ b/lasker-2.2.3/data/help/stored @@ -0,0 +1,32 @@ + +stored + +Usage: stored [user] + + Displays all of the stored games of 'user' or of yourself if 'user' is +omitted. Adjourned games are stored (but not games lost due to a server +crash). To resume an adjourned game, have both players logged on the server +and use the "match" command. + + Several other commands involve stored games. "Examine" allows you to review +and analyze a game. "Mailstored" mails the moves to you. "Sposition" will +display the last position of the game. "Smoves" will display the moves of +the game. You can also have an adjourned game adjudicated by an admin (see +the "adjudication" help file). + + +SPECIAL NOTES: + +(a) Users who have too many stored games may be placed on the abuser list. +Having up to 10 stored games is fine, but many more games beyond that will +raise concerns. Please complete your adjourned games in a reasonable time or +ask for an adjudication. + +(b) It is possible to resign one of your stored games, even when your +opponent is not logged on. + +See Also: abuser adjourn adjudication examine mailstored match resign +smoves sposition + +[Last modified: October 8, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/style b/lasker-2.2.3/data/help/style new file mode 100755 index 0000000..2b9263a --- /dev/null +++ b/lasker-2.2.3/data/help/style @@ -0,0 +1,33 @@ + +style + +Usage: style n + + Sets your 'style' variable to n. Equivalent to "set style n". This command +allows you to choose among the various board display options. + + 1. Standard ICS board in ascii format (default) + 2. USA-Today Sports Center-style board + 3. Experimental vt-100 ANSI board for dark backgrounds + 4. Experimental vt-100 ANSI board for light backgrounds + 5. Style suggested by ajpierce@med.unc.edu + 6. Email Board suggested by Thomas Fought (tlf@rsch.oclc.org) + 7. Miniature board + 8. ICS interface maker board -- raw data dump + 9. last 2 moves only (previous non-verbose mode) +10. Alternate raw dump +11. Same as 8, but with verbose moves ("P/e3-e4", instead of "e4") +12. Similar to style 10. +13. Displays board in color for SGI machines -- white versus purple pieces + with purple and black squares (for b/w monitors it would display as bold + and regular). + + Some graphics interfaces work only with specific board styles. Determine +which one is best for your set up. + + Suggestions on different styles are always welcome. + +See Also: interfaces variables + +[Last modified: November 26, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/sublist b/lasker-2.2.3/data/help/sublist new file mode 100755 index 0000000..12b38d5 --- /dev/null +++ b/lasker-2.2.3/data/help/sublist @@ -0,0 +1,15 @@ + +sublist + +Usage: sublist + + Removes information from the list in question. There are several kinds of +lists on the server. Some can only be modified by admins; others can be +modified by all users. "Addlist" command adds information to a list. + + The standard alias for "sublist" is "-". + +See Also: addlist admins alias lists + +[Last modified: June 15, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/switch b/lasker-2.2.3/data/help/switch new file mode 100755 index 0000000..fafd0b2 --- /dev/null +++ b/lasker-2.2.3/data/help/switch @@ -0,0 +1,13 @@ + +switch + +Usage: switch + + Requests to switch sides with your opponent. Switching sides can only be +done before the first move of a rated game, or anytime during an unrated game. +Your opponent can "accept" or "decline". + +See Also: accept decline + +[Last modified: June 12, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/takeback b/lasker-2.2.3/data/help/takeback new file mode 100755 index 0000000..8efba19 --- /dev/null +++ b/lasker-2.2.3/data/help/takeback @@ -0,0 +1,24 @@ + +takeback + +Usage: takeback [n] + + Requests a takeback of 'n' half-moves in the current game. If 'n' is +omitted then 1 is assumed. A "half-move" is defined as a move by one +player. To request that the last move made be changed (whether you were +the one to move last or your opponent moved last), you would request +"takeback". If you wanted to change the last move made as well as the move +prior to that, request "takeback 2". + + Here's an example: suppose you are playing White and your opponent has +just placed a piece on a square where it can be easily captured, and you +capture it. Your opponent might realize the weak move he/she made and +request "takeback 2" so that he/she doesn't lose material so easily. If +you wish, you can accept the "takeback 2" request and continue the game +from the previous position in the game. Both moves would be reversed, and +it would be Black's move to make. + +See Also: accept + +[Last modified: June 14, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/teamgames b/lasker-2.2.3/data/help/teamgames new file mode 100755 index 0000000..30c1350 --- /dev/null +++ b/lasker-2.2.3/data/help/teamgames @@ -0,0 +1,57 @@ + +teamgames + + A team game is a game played between two teams, each consisting of more than +one player. It is also possible to have a team playing against one person or +a computer. The procedures are simple: (a) set up the teams, (b) appoint one +person from each team as captain, (c) have the two captains match each other +using very long time controls, usually unrated, (d) have two separate channels +for the teams to use for their consultations, (e) have team members observe +the game and consult about moves, (f) have the captain play the move for +his/her team ... and play continues along those lines. + + To start a team game, it is best to have the players use three channels. At +the moment Channels 20, 21 and 22 are primarily for this purpose. To start +with, all the participants turn on one channel (Channel 20) to enable +communication about team formation. The other two channels are for the two +teams. Players of one team turn on the their channel but not the other. Then +the players on each team select a captain. + + Actually, there are many ways to form teams. One way is to let the players +join a channel randomly, another is to agree to two captains first and let +them pick their teams in turn. There is no set rule that must be followed. + + A game is started by the two captains playing each other. Then every +participant observes that game. Players can suggest moves using the +appropriate channels. They can adopt a democracy and vote before making +moves, or they can opt for dictatorship where the captain can decide on the +move, taking advice from the think tank. Any form of decision making is +possible, provided the team has agreed to it beforehand. + + Typically, it takes much longer to play a team game than a game between +individuals, because a lot of discussion is going on. Hence a longer time +control and longer increment are recommended. Several minutes per move is not +uncommon -- and even that time can go quickly. + + +WHY TEAM GAMES? + + Playing team games is a good way to learn because you are involved in a +position and can hear different views on it. Some people play mainly +positionally and some prefer sharp combinations. It is enlightening to see +how widely different analyses can come out from the same position. Moreover, +you can learn more about openings with which you are unfamiliar. + + Team games are also fun. During the consultation, it is typical that +players talk and make jokes. It helps develop friendly relationships among +users. In fact, even the process of forming teams can be fun. + +REMEMBER: Chess on this server is for fun. So please don't flame. Sometimes +even a team can overlook something and play a bad move. In that case, just +take it easy. Try to work as a team and fight back from behind. Bitter words +do nobody any good. + +See also: channel observe tell + +[Last modified: June 20, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/tell b/lasker-2.2.3/data/help/tell new file mode 100755 index 0000000..8a229dd --- /dev/null +++ b/lasker-2.2.3/data/help/tell @@ -0,0 +1,48 @@ + +tell + +Usage: tell user message + + "Tell" transmits your message to the user specified. The server gives you +some feedback that the message has been sent. You will also be told whether +the user is playing a game currently, or is not even logged on at the moment. +"t" is an alias for "tell". + + As a shortcut, you can use "." as an alias for "tell user" when you want to +send another message to the last person you told. That way you can keep +conversations going easily. + + When you receive a "tell" it will appear like this: + tells you: + + The 'user' can also be a channel number in order to send a message to a grou +of users having that channel activated. In this case, you as sender will see +the following display after sending your message: (# -> (##)) where # is the +channel number and ## is the number of people on that channel that received +your message. + + As a shortcut, you can use "," as an alias for "tell #" and your message +will be sent to the last channel you gave in a "tell" command. (Compare to +"xtell" command.) + + +SPECIAL NOTES + + (a) The server remembers both the last user to whom and the last channel to +which you have told something. For this reason, "." and "," are separate +aliases and do not interfere with each other. + + (b) A special command, "say", can be used for communicating with an opponent +during or directly following a chess game. + + (c) Another special command, "message", sends a message to a user so that it +can be stored for future use. + + (d) You can decide whether or not to hear a "tell" from unregistered users; +setting the "tell" variable to 0 (zero) filters these from being sent to you. + + +See Also: alias channel intro_talking message say variables xtell + +[Last modified: October 8, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/time b/lasker-2.2.3/data/help/time new file mode 100755 index 0000000..dc6f5c9 --- /dev/null +++ b/lasker-2.2.3/data/help/time @@ -0,0 +1,15 @@ + +time + +Usage: time [game,user] + + Shows the updated time remaining in the specific game for the players +involved. If no game is specified, the clock readings for your current game +will be shown. Revised clock times are also given as part of the "refresh" +command; however, "time" will always show negative times whereas "refresh" +will only list negative times if the interface handles them that way. + +See Also: refresh + +[Last modified: October 8, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/timeseal b/lasker-2.2.3/data/help/timeseal new file mode 100755 index 0000000..6edbc86 --- /dev/null +++ b/lasker-2.2.3/data/help/timeseal @@ -0,0 +1,144 @@ + +timeseal + +WHAT IS TIMESEAL?! + + Timeseal is a program that has been developed to improve chess on internet. +Netlag often causes players to lose valuable seconds or even minutes on their +chess clocks. Transmission time is counted against you, unless the chess +server can tell exactly when information is transmitted. What timeseal does +is record your thinking time, so that transmission time is not counted against +you. Timeseal will not prevent netlag but it makes the games fairer when lag +occurs. + +HOW DO I USE TIMESEAL?! + + What you need to do is get a version of timeseal working on the computer +that connects you to the chess server. The timeseal program will work as a +relay station, and will keep track of transimission times. + + The following versions of timeseal are currently available (as of December +17, 1995): + + AIX-3.2-RISC-SOCKS + AIX-3.2-RISC + BSD386-1.0-i386 + BSDOS-2.0-i386 + HP-UX-A.09.05-9000.705 + HP-UX-B.09.03-9000.42E + IRIX-4.0.5H.IP12-mips + IRIX-5.3-IP22-mips + IRIX64.6.0.1.IP21.mips + Linux-1.2.9-SOCKS + Linux-1.2.9-i586 + OSF1-V3.0-alpha + SCO-3.2-i386 + SunOS-4.1.4-sun4c + SunOS-5.4-386 + SunOS-5.4-sun4d + TW-SunOS-TW2.0.1-twin2 + ULTRIX-4.3-RISC + Windows-Winsock (file is called tmsl11j.zip) + +To see if anyone of these may fit the hardware you are using, do "uname -a" in +your unix shell and see which unix system you have operating. Then, determine +whether you need one of the special Windows or SOCKS versions. + + +TO DOWNLOAD TIMESEAL + +Follow these directions: + +(1) Login to your unix/inet provider. (VAX/VMS not supported yet). Type + "uname -a" and remember the output. You will need this output to figure + out which version of timeseal will work on your system. + +(2) Type "ftp 164.58.253.10" which will get you to the onenet ftp site. When + you are asked for a login ID type: "ftp" or "anonymous". When you are + asked for a password, type your email address. + +(3) Type "cd pub/chess/timeseal" (in order to get to the correct + onenet directory) and type "dir" (in order to see which versions of + timeseal are currently available). Compare the available timeseal + versions to the type of unix operating system you have. + +(4) When you have found the timeseal version that will work on your system, + type "bin" (for "binary" transmission format) and then type "get + filename" (where "filename" is the name of the version from the + directory). + +(5) Wait for the ftp file transmission to complete, then type "quit". The + file should now be in your current directory -- probably the home dir. + +(6) Type "gunzip filename", "chmod 700 filename", and "mv filename timeseal". + These various commands make the timeseal program available on your + operating system. NOTE: There are times when using "chmod 700 filename" + does not work on your system. In this case, try "chmod 755 filename". + + Here is an example after you have ftp'd the version called + timeseal.ULTRIX-4.3-RISC.gz: + + gunzip timeseal.ULTRIX-4.3-RISC.gz + chmod 700 timeseal.ULTRIX-4.3-RISC + mv timeseal.ULTRIX-4.3-RISC timeseal + +Now you are ready ... to go to the next step. ;-) + + +TO RUN TIMESEAL WITH YOUR INTERFACE + + There are different procedures depending on which interface/system you are +using. If you use Xwindows +Xboard / xics, then go to A); if you have winsock, +then go to B); otherwise go to C). + +A) For Xwindows users, there are two methods (listed in order of preference). +Whichever approach you use, make sure that xboard and timeseal are in the same +directory. Use one or the other -- NOT BOTH! + + (1) Use this command (it is the more direct, simpler approach): + + ./xboard -ics -icshost 164.58.253.10 -telnet -telnetProgram timeseal + + (2) Executing "./timeseal 164.58.253.10 5000 -p xxxx &" causes timeseal + to bind itself to port xxxx and wait for a connection to the chess + server. Then you can start xboard / xics like this (remember to + exchange xxxx with a valid port number, like 5500, 5501, whatever you + like): + + ./xboard -ics -icshost localhost -icsport xxxx + ./xics localhost xxxx + + You MUST use the string "localhost". Do NOT write the chess server + host because then timeseal will not be on. "localhost" is a perfectly + valid address since it's aliased to 127.0.0.1 (loopback) which always + means the machine you are using. + +B) There are two steps: INSTALL and USE: + + INSTALL: Move the file tmseal.exe to the same directory as your client + program. Create a program manager icon for TMSEAL, using the normal + methods. (Select File|New from the program manager menu; click on New + Program Item, then in the dialog set the Directory field to the same + directory as above; set the command line to TMSEAL; you may check the Run + Minimized checkbox if you wish.) + + USE: Double-click on the TMSEAL icon before beginning your FICS session. + Then, in your client program, connect to "localhost" instead of the usual + "chess.onenet.net". Soon the usual logon messages will appear. Errors + if any will show up in the TMSEAL window. + +C) For other users (no xboard, no winsock) such as ziics, jiics, E-ICS, etc: + + Modify your interface configuration to replace the normal telnet command + with: "./timeseal 164.58.253.10 5000". + + +DONE! + +Questions? Ask channel 1 or an admin. + + +See Also: chan_1 ftp_hints interface lag + +[Written by Hawk, August 15, 1995; last modified: December 17, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/todo b/lasker-2.2.3/data/help/todo new file mode 100755 index 0000000..3b80429 --- /dev/null +++ b/lasker-2.2.3/data/help/todo @@ -0,0 +1,7 @@ + 1. When your opponent puts you in check, it isn't noted in the last move. + 2. When you takeback, your opponent should be told to type "takeback" to + accept. + 3. Implement examine mode for history games. + 4. typing "match foo" without parameters should make a counteroffer to + foo with your own default parameters instead of accepting foo's offer. + diff --git a/lasker-2.2.3/data/help/toggle b/lasker-2.2.3/data/help/toggle new file mode 100644 index 0000000..a0d7b72 --- /dev/null +++ b/lasker-2.2.3/data/help/toggle @@ -0,0 +1,8 @@ + +toggle + +Usage: toggle list information + +Toggles information in a list. If the 'information' is already in the +specified list then it is removed, otherwise it is added. + diff --git a/lasker-2.2.3/data/help/tomove b/lasker-2.2.3/data/help/tomove new file mode 100755 index 0000000..99a3430 --- /dev/null +++ b/lasker-2.2.3/data/help/tomove @@ -0,0 +1,13 @@ + +tomove + +Usage: tomove white|black + + This command is used while in "bsetup" mode in order to designate which side +will move next when you exit from bsetup mode. For example, "tomove white" +means that it will be White's move next. + +See Also: bsetup + +[Last modified: February 3, 1996 -- Friar] + diff --git a/lasker-2.2.3/data/help/totals b/lasker-2.2.3/data/help/totals new file mode 100755 index 0000000..852621c --- /dev/null +++ b/lasker-2.2.3/data/help/totals @@ -0,0 +1,5 @@ +*** Total players: 7606 +Active in last week: 3241 +Active in last day: 1748 + +Counted at Tue Sep 19 16:00:00 CDT 1995 [Updated hourly] diff --git a/lasker-2.2.3/data/help/tournset b/lasker-2.2.3/data/help/tournset new file mode 100755 index 0000000..4c8848d --- /dev/null +++ b/lasker-2.2.3/data/help/tournset @@ -0,0 +1,14 @@ + +tournset + +Usage: tournset user 0|1 +USE RESTRICTED TO TD PROGRAMS + + The tournset command is used by Tournament Director (TD) programs that are +running tournaments. It is used to set your tourney variable to ON (1) when +you have joined a tournament and to OFF (0) when the tournament is over. + +See also: v_tourney + +[Last modified: February 10, 1997 -- Friar] + diff --git a/lasker-2.2.3/data/help/unalias b/lasker-2.2.3/data/help/unalias new file mode 100755 index 0000000..8a83db0 --- /dev/null +++ b/lasker-2.2.3/data/help/unalias @@ -0,0 +1,12 @@ + +unalias + +Usage: unalias word + + Removes your personal alias for 'word'. This alias will no longer be in +use. This command will not, however, remove default aliases. + +See Also: alias + +[Last modified: June 20, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/uncensor b/lasker-2.2.3/data/help/uncensor new file mode 100755 index 0000000..34943f4 --- /dev/null +++ b/lasker-2.2.3/data/help/uncensor @@ -0,0 +1,12 @@ + +uncensor + +Usage: uncensor [user] + + Removes 'user' from your censor list. If 'user' is omitted then the +entire list is cleared. + +See Also: censor intro2 + +[Last modified: June 20, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/unexamine b/lasker-2.2.3/data/help/unexamine new file mode 100755 index 0000000..856e24b --- /dev/null +++ b/lasker-2.2.3/data/help/unexamine @@ -0,0 +1,14 @@ + +unexamine + +Usage: unexamine + + This command is used to stop examining a game. "Unexamine" stops your +participation in the analysis, and also stops your observer status. The other +examiners and observers may continue, however, even if you set up the examine +to begin with. + +See Also: allobservers examine observe + +[Last modified: June 29, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/unnotify b/lasker-2.2.3/data/help/unnotify new file mode 100755 index 0000000..2b70e33 --- /dev/null +++ b/lasker-2.2.3/data/help/unnotify @@ -0,0 +1,12 @@ + +unnotify + +Usage: notify [user] + + Removes user from your notification list. If no user is specified, the +command will remove *all* users from your notification list. + +See Also: notify znotify + +[Last modified: June 20, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/unobserve b/lasker-2.2.3/data/help/unobserve new file mode 100755 index 0000000..78d21dd --- /dev/null +++ b/lasker-2.2.3/data/help/unobserve @@ -0,0 +1,18 @@ + +unobserve + +Usage: unobserve [game,user] + + Removes a game from your observation list. You can give either the game +number or the user whose game you want to unobserve. + + For example, if you are observing game #34, KARPOV versus RETI, then +"unobserve 34", "unobserve RETI" or "unobserve KARPOV" will remove this game +from your observation list. + + "Unobserve" used alone removes ALL GAMES from your observation list. + +See Also: allobservers games observe + +[Last modified: June 11, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/unpause b/lasker-2.2.3/data/help/unpause new file mode 100755 index 0000000..0970f18 --- /dev/null +++ b/lasker-2.2.3/data/help/unpause @@ -0,0 +1,14 @@ + +unpause + +Usage: unpause + + Restarts the clocks on a paused game and resumes play. You do not need your +opponent's consent to restart the game clock. However, it would be good +etiquette to announce that the game is resuming, and ensure that your opponent +is ready. + +See Also: pause + +[Last modified: June 20, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/unseek b/lasker-2.2.3/data/help/unseek new file mode 100755 index 0000000..c94960b --- /dev/null +++ b/lasker-2.2.3/data/help/unseek @@ -0,0 +1,13 @@ + +unseek + +Usage: unseek [#] + + Typing "unseek" alone will cancel *all* of your current ads for chess +matches. Typing "unseek #" will cancel ad #, where the # is the ad index +number from the display "sought all". + +See also: seek sought + +[Last modified: August 18, 1996 -- Friar] + diff --git a/lasker-2.2.3/data/help/untimed b/lasker-2.2.3/data/help/untimed new file mode 100644 index 0000000..988e6b5 --- /dev/null +++ b/lasker-2.2.3/data/help/untimed @@ -0,0 +1,17 @@ + +untimed + + There are four types of regular (not wild or bughouse) chess played on this +chess server: Untimed, Lightning, Blitz and Standard. + + A game is "Untimed" if the clocks will not be used when playing the game. +In this case, both the Start and the Increment are 0. For example, "match +friar 0 0" would request an untimed game against Friar. The clocks in an +untimed game will not move (though interfaces may handle this in different +ways). Also, "flag" will not work since the times will never be below 0 +seconds. Lastly, Untimed games are always unrated. + +See Also: blitz lightning match standard + +[Last modified: December 17, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/uptime b/lasker-2.2.3/data/help/uptime new file mode 100755 index 0000000..5b772a2 --- /dev/null +++ b/lasker-2.2.3/data/help/uptime @@ -0,0 +1,14 @@ + +uptime + +Usage: uptime + + Displays some server statistics, such as how long the server has been in +continuous operation, the number of current players and games, the highest +number of players and games, and the maximum number of players who can be +logged on. + +See Also: games statistics totals who + +[Last modified: July 7, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/uscf_faq b/lasker-2.2.3/data/help/uscf_faq new file mode 100755 index 0000000..4ab61be --- /dev/null +++ b/lasker-2.2.3/data/help/uscf_faq @@ -0,0 +1,222 @@ + +USCF FAQ +"Frequently Asked Questions About the United States Chess Federation" + +NOTE: FICS is not affiliated with USCF in any way. This +help file is intended solely as a public service to FICS users and to +promote chess. The text was written by FICS users and sanctioned by USCF. +Neither USCF or FICS take any responsibility for the accuracy of the +information contained in this file. + +--> What is USCF? + + USCF stands for the United States Chess Federation. USCF is the +national chess organization for the United States. Its purpose is to +promote chess (see the USCF Mission Statement in another FICS help file, +"uscf_mis"). USCF sponsors various kinds of chess tournaments, promotes +chess in public schools and prisons, represents US interests in +international chess organizations, and offers discounts on chess books and +equipment. USCF is composed of over 82,000 individual members and 2100 +local and state organizations (known as "affiliates"). + +--> Are there other national chess organizations? + + Yes. USCF is the main organization for over-the-board (OTB) play. +They also sponsor correspondence ("postal") chess and Quick Chess (games +with faster time controls) but other organizations have national +importance in these two areas as well. Information about these other +organizations may be placed on FICS at a later date. + +--> What are the benefits for joining USCF? + + Well, every member has a different reason for joining. The benefits +of membership include: + + * Chance to play in numerous chess tournaments and have national + ratings in OTB and postal chess + * Cash prizes in tournaments + * A monthly magazine, "Chess Life" ("SchoolMates" for younger + members). + * Discounts for chess equipment and books. + +--> Tell me about the tournaments. + + There are two main groups: Over-the-board (OTB) and Postal. In OTB +tournaments you play against other opponents face-to-face. In Postal +tournaments you play by mail and exchange moves, usually on postcards. +Membership is necessary to play in a USCF tournament (there are some +exceptions, but these are rare) and entry fees are charged. A complete +listing of upcoming OTB tournaments all across the United States should be +available on FICS sometime in July. + +--> What are OTB tournaments like? + + Most tournaments take one or two days over the weekend for maybe half +a dozen games, though major national tournaments may last a week or two +and involve many games. A tournament may have anywhere from a dozen to +600 or even a thousand players. + Tournaments generally have different playing "sections" or groups of +players based on their national ratings. You only play opponents within +your own section. For example, a large tournament might have these five +sections: Open, U2000, U1600, U1200, and Scholastic. Any USCF member can +play in the Open section, only those with a USCF rating under 2000 can +play in U2000, only those below 1600 can play in the U1600 section, only +those below 1200 can play in U1200 and only high school or younger +students can play in the Scholastic. (A high school student with a USCF +rating of 1300, for example, could choose to play in the Open, U2000, +U1600 or Scholastic sections, but not in U1200.) The different sections +allow players of similar strength to compete for prizes. + Tournament games can last anywhere from one or two hours up to four or +five hours, depending on the time control of the tournament. There are +some Quick Chess tournaments with time controls of only 10 or 30 minutes +per player per game. Tournament time controls are very different than +those used on FICS, so learn the details before playing in a tournament. + Tournaments generally offer cash prizes (!!), with the exception being +the Scholastic tournaments which prefer to give out trophies instead. +Most tournaments offer prizes within each section (1st, 2nd and 3rd for +example) as well as other prizes by ratings categories (for example, the +U2000 section may have a prize for the best scoring U1800 player). + Chess tournaments, organized by the local USCF affiliates (especially +state organizations and clubs) are held weekly all across the United +States. Each tournament varies considerably in style, size, prize fund +and difficulty. Information about USCF sanctioned tournaments is printed +monthly in "Chess Life." We also hope to make such information available +on FICS. We suggest you visit a tournament in your local area and catch +the excitement! + +--> What if I want to play in an OTB tournament but never have before? + + If you're unsure how tournaments run, it may be helpful to visit one +or two before playing. Almost all tournaments allow and encourage +spectators. + You need to become aware of tournament rules and etiquette. If you +are in a tournament you will need to know when the rounds start, where the +pairings (lists of who plays who) are posted, how to find your opponent, +where to mark the result of your game, what the time controls are, how to +use a chess clock, how to take notation (it is usually required to record +the moves of your games), etc. + Most tournaments require that you bring your own equipment, but don't +worry if you don't have a regulation set and clock. Most of your +opponents will, and there should be unused sets you can borrow any given +round. If you decide to play in more tournaments, you really should +acquire regulation equipment. + All of this can seem very intimidating to a new player, but if you +show up early, you should have plenty of time to ask the tournament +director, or other players, to explain the whole process. It may be +helpful to obtain a copy of the US Chess Federation's Official Rules of +Chess (4th ed) (available from USCF). + For your first tournament, either mail your entry fee in advance or +pay it in person at the tournament site. In either case, get there early +to familiarize yourself with the rooms, the tournament organizers, and +have a chance to ask questions. + Lastly, remember to just have fun and play some good chess. Most +people do not score very well in their first tournament, but some do win +prizes (larger tournaments generally offer a few prizes for unrated +players). + +--> What's postal chess all about? + + Basically, you play by mail. Your opponent could be from anywhere in +the United States, or even overseas. Generally, you play against +opponents in a small section (4-7 players) with roughly your same level of +ability, though there are also Open tournaments. Each player is required +to make a certain number of moves in a 30-day period (not including the +time it takes for the mail to get through). In examining your next move, +you may consult with books and articles and take notes, but you may not +have computers or humans analyze your games while they are in progress. +Each game may take as long as a year, sometimes longer, but you play +several games simultaneously. You can even have rated matches against +opponents of your own choosing. Some tournaments offer cash prizes; +others offer certificates to the section winners. Information about +postal chess is given each month in "Chess Life." + Many people who are too busy to play OTB tournaments regularly, or +even at all, find that postal chess matches their schedules perfectly. +They can analyze moves during lunch, in the evenings, stalled on the +highway during rush hour, or whenever they have a few minutes free. The +time controls mean a move need not be sent off the day after it is +received, and the players can therefore analyze positions at their +leisure. + +--> Tell me more about "Chess Life"? + + "Chess Life" is USCF's official magazine. It has numerous articles +for players of all abilities, quizzes, ways to test your abilities, +annotated games from recent tournaments across the world, stories on chess +personalities and chess-related news. "Chess Life" prints advance +information on many upcoming chess tournaments in the US as well as postal +chess. It also has catalog supplements several times each year with +information on discounts on chess-related products, including books, +pieces, boards, computers and computer software. Companies selling chess +productes often advertise in "Chess Life" as well. + +--> Tell me more about the affiliates? + + An affiliate is simply a local chess club associated with USCF. +Almost every major city in the United States has an affiliate. Many +universities and other organizations sponsor one as well. Currently there +are just over 2000 affiliates scattered across the nation. + Each club is different, but most generally hold informal meetings a +few times per month, where the club members can get together and play +games, discuss openings, study grandmaster games, eat doughnuts, or +whatever. Clubs are a great way to become involved in chess, and you +normally do not need a USCF membership to join one. + Affiliates often sponsor USCF tournaments, some of which are open only +to the club's members. This depends on each individual affiliate, though. + You can write to USCF at the address below and request a list of +affiliates in your area. + +--> Where do I get more information on USCF? + + Well, "Dogma" on FICS would be more than willing to talk to you about +USCF and playing in a tournament. There are other USCFers on FICS, too, +and you can ask them for their opinions. You can also go directy to the +source and call USCF at ... 1-800-388-KING ... and ask them to send you +membership information, etc. + USCF provides free pamphlets on a variety of subjects, available on +request. These include, but are not limited to, pamphlets describing the +rules, how to take notation, what constitutes official equipment, etc. +Call or write USCF for more information. + +--> How do I become a USCF member? + + There are several ways. You can join at virtually any tournament, +call the above phone number and pay with a credit card, or send your +membership fee directly to USCF at: + 186 Route 9W + New Windsor, NY 12553 + It may be possible to obtain a slight discount by buying your USCF +membership through an affiliate, or as part of tournament registration +fees; however, this depends on each individual affiliate and tournament. + +--> What is the membership fee? + + The regular, one year membership fee is $40, of which $21 is the +subscription to "Chess Life". Youth memberships (age 19 and under) cost +$15 for one year. Senior memberships (65 and older) are $30 per year. + Scholastic memberships cost $10 per year (generally for elementary +students, but available for age 19 and under). A scholastic membership is not +necessary to play in scholastic tournaments; a youth membership would work +just as well. However, Scholastic membership receive "School Mates", a +bi-monthly magazine for the beginning player, rather than the monthly "Chess +Life". + All of the above membership types receive full membership benefits, +including "Chess Life". Again, the major difference between "Youth" members +and "Scholastic" members is that youth members receive "Chess Life" while +scholastic members receive "School Mates". + Discounts are available for junior, family, blind, and prison memberships. +Discounts are also given for longer memberships (for example a two-year +membership); life memberships are also available. + +--> Is USCF membership worth it? + + If you are an avid chess player who wants to play in tournaments and +have national ratings for OTB and/or postal chess, wants to keep up on the +chess scene, or just wants to help promote chess in the United States, the +answer is ... YES!!! Whether you have time for tournament chess, postal +or both, a membership in USCF helps make you a stronger chess player while +also bringing you into contact with other chess players world-wide. You +can play chess all your life, with family, friends, and fellow tournament +players. Chess is a sport that can give you lifelong satisfaction, and +USCF gives you a great opportunity to learn, play, and make new friends +along the way. :) + diff --git a/lasker-2.2.3/data/help/variables b/lasker-2.2.3/data/help/variables new file mode 100755 index 0000000..75514c8 --- /dev/null +++ b/lasker-2.2.3/data/help/variables @@ -0,0 +1,85 @@ + +variables + +Usage: variables [user] + + This command will display the variables of the given user. If no user is +given then your variable settings will be displayed. Here are the variables +that will be displayed. + +VARIABLE INFORMATION + + Name Function + ---- -------- + automail If non-zero, the moves of your games will be mailed to you + upon completion; your e-mail address will be used (make sure it + is correct; if not, contact an admin). + bell If non-zero, a ^G or bell will be sent when a board update + is done. In most cases, you will hear a beep. + cshout If non-zero, you will hear cshouts. If zero, you will not. + f1-f9 Special variables for the formula. + flip If is non-zero, rotates the board the opposite way (for + example, instead of White at the bottom, Black will be at the + bottom). + formula The formula used to filter match requests, that is, decline + them automatically. + gin If non-zero, you will be notified when games begin or end. + height Sets the number of lines of text you will receive before a + [next] break occurs; usually the screen height. + highlight If non-zero, player's names who tell you stuff will be + highlighted. + jprivate If non-zero, the user's journal cannot be read by others. If + zero, it is open to be read by other users. + kibitz If non-zero, you will hear kibitz's from observers of your + games. + kiblevel Limits kibitzes and whispers you will receive to users who have + the given rating or higher. Value is reset to 0 when you + logout. + language Selects a help file in this language, if available. The default + is English. Spanish is also available. + mailmess If non-zero, messages to you will be mailed to your e-mail + address automatically. + notifiedby If non-zero, you will be notified by the server when users + having you on their notify lists log on/off. If zero, you will + not receive such notifications. Use of notifiedby can cut down + on the size of notify lists (see "notify" help file for + details). + open If non-zero, you are willing to accept match requests. If + zero, you will not receive match requests. + pin If non-zero, you will be informed when any user connects to or + disconnects from the server. + pgn If non-zero, mails games to you in PGN format. If zero, + regular, column format will be used. + private If non-zero, then all games you play will be private regardless + of your opponent's 'private' variable; no observers will be + permitted. + prompt This string will be your prompt. Use 'set prompt' to restore + the system default. (Caution: some graphics interfaces may need + certain prompts in order to work correctly.) + rated If zero, your game will not be rated. + If non-zero, and all of these conditions hold, then your game + will be rated: + 1: Your opponent's rated variable is non-zero + 2: The time controls for the game qualify as a rated game + 3: There are no time-odds + 4: The game started position is standard. + ropen If zero, you will only be open to match requests from users who + have the same setting for "rated". If non-zero, you will + receive other requests as well. + shout If non-zero, you will hear shouts. If zero, you will not. + simopen If non-zero, you are willing to accept simul requests. This + variable is always set to 0 when you log in. + style The style of board to use. + tell If non-zero, you will hear tell's and say's from unregistered + users. If zero, you will not. + width Sets the width of your display (from 32 to 240). + 1-10 This sets your information that is displayed when someone + fingers you. You can set these 'notes' to an arbitrary string + of length 100. You can display information in ten slots, + numbered 1-10. + +See Also: bell cshout finger flip formula highlight journal kibitz +kiblevel notes private set shout simuls style tell + +[Last modified: December 25, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/whenshut b/lasker-2.2.3/data/help/whenshut new file mode 100755 index 0000000..9d61d42 --- /dev/null +++ b/lasker-2.2.3/data/help/whenshut @@ -0,0 +1,13 @@ + +whenshut + +Usage: whenshut + + Using this command will display the time when a shutdown will occur. If +there is no shutdown of the server scheduled, the message displayed will be +"No shutdown currently in progress". + +See Also: + +[Last modified: November 26, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/whisper b/lasker-2.2.3/data/help/whisper new file mode 100755 index 0000000..4b0f896 --- /dev/null +++ b/lasker-2.2.3/data/help/whisper @@ -0,0 +1,17 @@ + +whisper + +Usage: whisper message +LIMITED TO REGISTERED USERS + + Sends your message to all the observers of a game but NOT to the players. +For this reason, using whisper (rather than kibitz) is a more polite way of +discussing a game with other observers without having your message heard by +the two players. (Only users with a 'kiblevel' variable setting might not +receive your message.) You must be observing or playing a game in order to +use this command. The standard alias for "whisper" is '#'. + +See Also: alias censor kibitz kiblevel variable + +[Last modified: December 17, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/who b/lasker-2.2.3/data/help/who new file mode 100755 index 0000000..dfddcbe --- /dev/null +++ b/lasker-2.2.3/data/help/who @@ -0,0 +1,125 @@ + +who + +Usage: who [o][r][f][a][R][U][s][b][L][A][l][t][v][n][1-3][B] + + Displays a list of users who are connected to the server according to the +parameters you give. Typing "who" alone, without any arguments, will list all +users according to their blitz ratings. + +USERS TO DISPLAY + o: Only open players. + r: Only players for rated matches. + f: Only free players (not playing a game). + a: Only available players (open & free). + R: Only registered players. + U: Only unregistered players. + #: Only the top (1), middle (2) or lower (3) third of users. + B: Only users with bughouse partners set. + +ORDER OF DISPLAY + s: Standard rating. + b: Blitz rating. + L: Lightning rating. + A: Lists players alphabetically. + l: Same as above but without rating/game info. [lower case "L"] + +FORMAT OF DISPLAY + t: Terse. + v: Verbose. + n: Win-loss record. + + For example, "who aRsA" would display an alphabetical listing (A) of +registered players (R) who are available for matches (a) along with their +ratings from games using standard time controls (s). NOTE: both the capital +letters and the order of the options are important, but you *may* use spaces +between the various letters. + + +THE REGULAR (terse) DISPLAY + + The following table is an example of what the "who" request will display. +(Only a portion of a much larger listing is given here.) + +2255^OldManII(C) 1879 Chopin 1625:Flash 1251:Juan +2163 Heringer 1838^asu 1612 Lesiege ---- Jerard +2099^AmacaballoFat 1799^Kael 1587:Boutros ----:Tomato(TD) +2084^Torr 1783:GARP 1572^chessnut ++++:arc +2074:loon(*) 1774:grimm 1556#jethro ++++^ASESINO +2072 death(FM) 1760:Tsang 1555.billard ++++.beto + + The format is . + +Rating: Only one set of ratings are displayed -- the default is blitz unless + another rating is requested. The entry ---- means this user is registered + but does not have a rating for this type of chess. The entry ++++ means + that the user is unregistered and thus has no rating. + +Status codes: + ^ involved in a game + ~ running a simul match + : not open for a match + # examining a game + . inactive for 5 minutes or longer + not busy + +Special handle codes: + * admin + B blindfold account + C computer account + T team account + TD Tournament Director program + FM/IM/GM titles for international chess masters + + +THE VERBOSE DISPLAY + + The following table shows sample entries from a "who v" request -- where the +"v" means "verbose" style of the "who" command. A complete display, of +course, would be rather long ... one line for each user logged on who fits the +parameters of the who request.. + + +---------------------------------------------------------------+ + | User Standard Blitz On for Idle | + +---------------------------------------------------------------+ + | 22 OldManII 2172 2256 4:09 | + | 40 u Torr ---- 2084 14 | + | X loon 2015 2074 11 | + | 35 Chopin ---- 1879 4 | + | Xu Juan 1336 1251 20 19 | + | 4 U ASESINO ++++ ++++ 18 | + | | + | 95 Players Displayed | + +---------------------------------------------------------------+ + +Going from left to right in the display: + + ## -- the number of the game the user is playing + X -- not open for games + u -- open for unrated games only + U -- unregistered player + -- the player's "handle" + Standard rating -- the player's rating from standard games + Blitz rating -- the player's rating from blitz games + On for -- (in hours/minutes) how long the player has been on + Idle -- (in hours/minutes) how the player has been idle + Players Displayed -- the number of current users fitting the who request + + +THE WIN-LOSS RECORD DISPLAY + + The format for the win-loss record display is simple. Here is an example: + +Name Stand win loss draw Blitz win loss draw idle +---------------- ----- ------------- ----- ------------- ---- + ---- 0 0 0 2018 92 56 26 10 + + The order is again by blitz, unless specified otherwise. This information +is also available on an individual basis by using the "finger" command. + + +See Also: blindfold blitz bughouse computers examine finger +intro_information observe ratings team + +[Last modified: December 25, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/wild b/lasker-2.2.3/data/help/wild new file mode 100755 index 0000000..9ea28d2 --- /dev/null +++ b/lasker-2.2.3/data/help/wild @@ -0,0 +1,45 @@ + +wild + + Wild is a little different than the other categories of boards in that +the starting positions are non-standard. Because wild games are fundamentally +different than regular chess, they are rated separately from blitz and +standard chess games. The wild ratings, however, do not take into account the +time controls; all wild games are rated on the same basis. + + Here are the major variations of wild that are rated: + +Style 1: In this variant both sides have the same set of pieces as in normal +chess. The white king starts on d1 or e1 and the black king starts on d8 or +e8, and the rooks are in their usual positions. Bishops are always on +opposite colors. Subject to these constraints the position of the pieces on +their first ranks is random. Castling is done similarly to normal chess: o-o- +o indicates long castling and o-o short castling. + +Style 2: In this variant the usual set of pieces is arranged randomly on the +first and eighth ranks, with the constraint that Black's arrangement is always +a mirror image of White's. Castling is not allowed. + +Style 3: In this variant the set of pieces is randomly chosen (subject to the +constraint that there is one king of each color). It is quite possible to get +more than the normal number of a given piece, such as three rooks or two +queens. The pieces are placed on the first rank behind the pawns, the +position of Black's pieces mirrors White's placement, and castling is not +allowed. + +Style 4: In this variant a random set of pieces is generated. These pieces +are placed randomly for White and Black behind the rank of pawns, subject to +the constraint that the bishops must be balanced. + +Style 5: In this variant, each player has the usual set of pieces. However, +they are placed in a very unusal position. Pawns start on their 7th rank +rather than their 2nd rank! They are, therefore, one move away from becoming +queens. The pieces are placed on their 8th rank rather than the 1st rank. +When the game starts, it will look like the board is upside down, with White's +pieces starting on Black's side of the board, and vice versa. But don't let +this fool you. + +See Also: boards match + +[Last modified: September 11, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/withdraw b/lasker-2.2.3/data/help/withdraw new file mode 100755 index 0000000..3157d77 --- /dev/null +++ b/lasker-2.2.3/data/help/withdraw @@ -0,0 +1,26 @@ + +withdraw + +Usage: withdraw [1-n, all, abort, adjourn, draw, match, pause, player, simul, +switch, takeback] + + Withdraws an offer that you have made to another user. If no parameter is +given and there is only one offer, the withdraw command with rescind your +offer. If you have more than one offer pending (for example multiple match +offers) then you must specify which offer you want to withdraw. You can +choose the offer by number, by type, all offers, or by the player's name to +whom you have made the offer. For example, the command "withdraw match" will +decline all pending match offers you have made. The command "withdraw Shane" +will withdraw the offer you made to Shane. + +NOTE: Several types of requests are withdrawn automatically in certain +situations. For example, if you have made a match request to user2 but then +accept a match request from user1, FICS starts your match with user1 and +withdraws your offer to user2; user2 is notified that you have started another +match. + +See Also: abort accept adjourn draw match pause pending simul switch +takeback + +[Last modified: June 20, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/wname b/lasker-2.2.3/data/help/wname new file mode 100644 index 0000000..1c8b446 --- /dev/null +++ b/lasker-2.2.3/data/help/wname @@ -0,0 +1,8 @@ + +wname + +Usage: bname + +This command sets the white players name shown in the current game you +are playing or examining. + diff --git a/lasker-2.2.3/data/help/xtell b/lasker-2.2.3/data/help/xtell new file mode 100755 index 0000000..6cee73e --- /dev/null +++ b/lasker-2.2.3/data/help/xtell @@ -0,0 +1,21 @@ + +xtell + +Usage: xtell user message + + The "xtell" command sends a message to a user, just like "tell" does. +However, "xtell" will not alter the setting for who-you-told-last. A "tell" +sends a message *and* resets the who-you-told-last variable to a new user. +The "xtell" command will leave this setting intact, meaning that you can still +use the "." alias to "tell" to a person you are having a conversation with. +The "xtell" command allows for a brief comment to someone while you are having +a longer chat with someone else. + +SPECIAL NOTES: + +(a) Xtell works only with tells to players, not to channels. + +See Also: alias tell + +[Last modified: October 8, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/help/znotify b/lasker-2.2.3/data/help/znotify new file mode 100755 index 0000000..5aba4de --- /dev/null +++ b/lasker-2.2.3/data/help/znotify @@ -0,0 +1,14 @@ + +znotify + +Usage: znotify + + Lists all users currently logged on who: (a) are on your notify list, and +(b) have you on their notify lists. Two separate lists are displayed. See +the notify command and notifiedby variable for information about what being on +these lists means. An alias for "znotify" is "znotl". + +See Also: alias notify unnotify variables + +[Last modified July 1, 1995 -- Friar] + diff --git a/lasker-2.2.3/data/messages/CVS/Entries b/lasker-2.2.3/data/messages/CVS/Entries new file mode 100644 index 0000000..4095276 --- /dev/null +++ b/lasker-2.2.3/data/messages/CVS/Entries @@ -0,0 +1,8 @@ +/logout/1.1/Mon Jun 10 08:05:27 2002// +/logout.fancy/1.1/Mon Jun 10 08:05:27 2002// +/motd/1.1/Mon Jun 10 08:05:27 2002// +/unregistered/1.1/Mon Jun 10 08:05:27 2002// +/welcome/1.2/Wed Jun 12 01:04:05 2002// +/login/1.2/Sat Jun 29 00:06:13 2002// +/admotd/1.3/Mon Jul 1 01:36:40 2002// +D diff --git a/lasker-2.2.3/data/messages/CVS/Repository b/lasker-2.2.3/data/messages/CVS/Repository new file mode 100644 index 0000000..c8e5757 --- /dev/null +++ b/lasker-2.2.3/data/messages/CVS/Repository @@ -0,0 +1 @@ +lasker/data/messages diff --git a/lasker-2.2.3/data/messages/CVS/Root b/lasker-2.2.3/data/messages/CVS/Root new file mode 100644 index 0000000..c42ba94 --- /dev/null +++ b/lasker-2.2.3/data/messages/CVS/Root @@ -0,0 +1 @@ +/home/cvs diff --git a/lasker-2.2.3/data/messages/admotd b/lasker-2.2.3/data/messages/admotd new file mode 100755 index 0000000..ecf30e5 --- /dev/null +++ b/lasker-2.2.3/data/messages/admotd @@ -0,0 +1,6 @@ + +This is the admin message of the day + + Admin command helpfiles are shown by ahelp. Try 'ahelp commands' for + a list of administrative commands. +__________________________________________________________________________ diff --git a/lasker-2.2.3/data/messages/login b/lasker-2.2.3/data/messages/login new file mode 100755 index 0000000..e7213d3 --- /dev/null +++ b/lasker-2.2.3/data/messages/login @@ -0,0 +1,2 @@ + +If you are not a registered player enter the login name "guest" diff --git a/lasker-2.2.3/data/messages/logout b/lasker-2.2.3/data/messages/logout new file mode 100755 index 0000000..a6432d1 --- /dev/null +++ b/lasker-2.2.3/data/messages/logout @@ -0,0 +1,3 @@ + +Thank you for using a Free (GNU) Internet Chess server. + diff --git a/lasker-2.2.3/data/messages/logout.fancy b/lasker-2.2.3/data/messages/logout.fancy new file mode 100755 index 0000000..0e9ea7f --- /dev/null +++ b/lasker-2.2.3/data/messages/logout.fancy @@ -0,0 +1,19 @@ + + .::. + _()_ _::_ + _O _/____\_ _/____\_ _O + _ _ _ ^^__ / //\ \ / \ / / //\ ^^__ _ _ _ +| || || | / - \_ { } \____/ \____/ { } / - \_ | || || | +|_______|<| __< \___/ (____) (____) \___/ <| __< |_______| +\__ ___ /<| \ (___) | | | | (___) <| \ \__ ___ / + |___|_| <| _ \ |_| |__| |__| _|_| <|_ \ |___|_| + |_|(_)| <|__(_)_\ /(_)\ /(_) \ (_) \ (_) \ <(_)____\ (_)|___| + |_(___) _|(___)_ ((___)) ((___)_) (___)__) (___)__) (___)__|_(___)_|_| +(_ _|_|_)(_ _|_|_ )( _|_|_ )(__|_|_ _) _|_|____)_|_|____)_|_|_ ___)|_|_____) +/_(_____)/_(_____)\/(_____)\/(_____)_\(_____)__(_____)__(_____)__(_____)___\ + /_____\ /_____\ /_____\ /_____\ /_____\ /_____\ /_____\ /_____\ + + (Logout screen by Alefith) + +Thank you for using a Free (GNU) Internet Chess server. + diff --git a/lasker-2.2.3/data/messages/motd b/lasker-2.2.3/data/messages/motd new file mode 100755 index 0000000..0934bd9 --- /dev/null +++ b/lasker-2.2.3/data/messages/motd @@ -0,0 +1,6 @@ +__________________________________________________________________________ +Do 'help' for a list of the commands that are available. +Do 'help admins' for admin information, "=admin" for a list of all admins. +Do 'help ficsfaq' for answers to frequently asked questions. +__________________________________________________________________________ + diff --git a/lasker-2.2.3/data/messages/unregistered b/lasker-2.2.3/data/messages/unregistered new file mode 100755 index 0000000..9074ba3 --- /dev/null +++ b/lasker-2.2.3/data/messages/unregistered @@ -0,0 +1,5 @@ + +Newcomers: + type 'help intro0' for a gentle introduction. + type 'help register' to get a registered account. + Foul or abusive named guests may be 'nuked' without warning!! diff --git a/lasker-2.2.3/data/messages/welcome b/lasker-2.2.3/data/messages/welcome new file mode 100755 index 0000000..dbfb02e --- /dev/null +++ b/lasker-2.2.3/data/messages/welcome @@ -0,0 +1,17 @@ + + _ __ __ __ + | | / /__ / /________ ____ ___ ___ / /_____ + | | /| / / _ \/ / ___/ __ \/ __ `__ \/ _ \ / __/ __ \ + | |/ |/ / __/ / /__/ /_/ / / / / / / __/ / /_/ /_/ / + |__/|__/\___/_/\___/\____/_/ /_/ /_/\___/ \__/\____/ + ^^__ _ _ _ + / - \_ | || || | + <| __< YOUR CHESS SERVER NAME HERE |_______| + <| \ \__ ___ / + <| \ |___|_| + <|______\ |_|___| + _|____|_ |___|_| + (________) (_______) + /________\ /_______\ + + diff --git a/lasker-2.2.3/data/stats/CVS/Entries b/lasker-2.2.3/data/stats/CVS/Entries new file mode 100644 index 0000000..9b8ebee --- /dev/null +++ b/lasker-2.2.3/data/stats/CVS/Entries @@ -0,0 +1,2 @@ +/newratings_data/1.1/Thu Jun 6 08:56:56 2002// +D diff --git a/lasker-2.2.3/data/stats/CVS/Repository b/lasker-2.2.3/data/stats/CVS/Repository new file mode 100644 index 0000000..d146394 --- /dev/null +++ b/lasker-2.2.3/data/stats/CVS/Repository @@ -0,0 +1 @@ +lasker/data/stats diff --git a/lasker-2.2.3/data/stats/CVS/Root b/lasker-2.2.3/data/stats/CVS/Root new file mode 100644 index 0000000..c42ba94 --- /dev/null +++ b/lasker-2.2.3/data/stats/CVS/Root @@ -0,0 +1 @@ +/home/cvs diff --git a/lasker-2.2.3/data/stats/newratings_data b/lasker-2.2.3/data/stats/newratings_data new file mode 100755 index 0000000..e69de29 diff --git a/lasker-2.2.3/data/usage/CVS/Entries b/lasker-2.2.3/data/usage/CVS/Entries new file mode 100644 index 0000000..c8f12ae --- /dev/null +++ b/lasker-2.2.3/data/usage/CVS/Entries @@ -0,0 +1,193 @@ +/abort/1.1/Sun Jun 23 07:29:41 2002// +/accept/1.1/Sun Jun 23 07:29:41 2002// +/acheckhelp/1.1/Sun Jun 23 07:51:16 2002// +/aconfig/1.1/Sun Jun 23 07:51:16 2002// +/addcomment/1.1/Sun Jun 23 07:29:41 2002// +/addlist/1.1/Sun Jun 23 07:29:41 2002// +/addplayer/1.1/Sun Jun 23 07:29:41 2002// +/adjourn/1.1/Sun Jun 23 07:29:41 2002// +/adjudicate/1.1/Sun Jun 23 07:29:41 2002// +/admin/1.1/Sun Jun 23 07:29:41 2002// +/adump/1.1/Sun Jun 23 07:51:16 2002// +/ahelp/1.1/Sun Jun 23 07:29:41 2002// +/alias/1.1/Sun Jun 23 07:29:41 2002// +/allobservers/1.1/Sun Jun 23 07:29:41 2002// +/anews/1.1/Sun Jun 23 07:29:41 2002// +/announce/1.1/Sun Jun 23 07:29:41 2002// +/annunreg/1.1/Sun Jun 23 07:29:41 2002// +/areload/1.1/Sun Jun 23 07:51:16 2002// +/asetadmin/1.1/Sun Jun 23 07:29:41 2002// +/asetblitz/1.1/Sun Jun 23 07:29:41 2002// +/asetbughouse/1.1/Sun Jun 23 07:29:41 2002// +/asetclock/1.1/Sun Jun 23 07:29:41 2002// +/asetemail/1.1/Sun Jun 23 07:29:41 2002// +/asethandle/1.1/Sun Jun 23 07:29:41 2002// +/asetlight/1.1/Sun Jun 23 07:29:41 2002// +/asetmaxplayer/1.1/Sun Jun 23 07:29:41 2002// +/asetpasswd/1.1/Sun Jun 23 07:29:41 2002// +/asetrealname/1.1/Sun Jun 23 07:29:41 2002// +/asetstd/1.1/Sun Jun 23 07:29:41 2002// +/asetsuicide/1.1/Sun Jun 23 07:29:41 2002// +/asetv/1.1/Sun Jun 23 07:29:41 2002// +/asetwild/1.1/Sun Jun 23 07:29:41 2002// +/assess/1.1/Sun Jun 23 07:29:41 2002// +/backward/1.1/Sun Jun 23 07:29:41 2002// +/bell/1.1/Sun Jun 23 07:29:41 2002// +/best/1.1/Sun Jun 23 07:29:41 2002// +/bname/1.1/Sun Jun 23 07:29:41 2002// +/boards/1.1/Sun Jun 23 07:29:41 2002// +/bsetup/1.1/Sun Jun 23 07:29:41 2002// +/bugwho/1.1/Sun Jun 23 07:29:41 2002// +/canewsf/1.1/Sun Jun 23 07:29:41 2002// +/canewsi/1.1/Sun Jun 23 07:29:41 2002// +/cbest/1.1/Sun Jun 23 07:29:41 2002// +/chkgame/1.1/Sun Jun 23 07:29:41 2002// +/chkip/1.1/Sun Jun 23 07:29:41 2002// +/chkpl/1.1/Sun Jun 23 07:29:41 2002// +/chksc/1.1/Sun Jun 23 07:29:41 2002// +/chkts/1.1/Sun Jun 23 07:29:41 2002// +/clearmessages/1.1/Sun Jun 23 07:29:41 2002// +/clrsquare/1.1/Sun Jun 23 07:29:41 2002// +/cnewsf/1.1/Sun Jun 23 07:29:41 2002// +/cnewsi/1.1/Sun Jun 23 07:29:41 2002// +/copygame/1.1/Sun Jun 23 07:29:41 2002// +/crank/1.1/Sun Jun 23 07:29:41 2002// +/cshout/1.1/Sun Jun 23 07:29:41 2002// +/date/1.1/Sun Jun 23 07:29:41 2002// +/decline/1.1/Sun Jun 23 07:29:41 2002// +/draw/1.1/Sun Jun 23 07:29:41 2002// +/eco/1.1/Sun Jun 23 07:29:41 2002// +/examine/1.1/Sun Jun 23 07:29:41 2002// +/finger/1.1/Sun Jun 23 07:29:41 2002// +/flag/1.1/Sun Jun 23 07:29:41 2002// +/flip/1.1/Sun Jun 23 07:29:41 2002// +/fmessage/1.1/Sun Jun 23 07:29:41 2002// +/follow/1.1/Sun Jun 23 07:29:41 2002// +/forward/1.1/Sun Jun 23 07:29:41 2002// +/ftell/1.1/Sun Jun 23 07:29:41 2002// +/games/1.1/Sun Jun 23 07:29:41 2002// +/getgi/1.1/Sun Jun 23 07:51:16 2002// +/getpi/1.1/Sun Jun 23 07:51:16 2002// +/ginfo/1.1/Sun Jun 23 07:29:41 2002// +/goboard/1.1/Sun Jun 23 07:29:41 2002// +/handles/1.1/Sun Jun 23 07:29:41 2002// +/hbest/1.1/Sun Jun 23 07:29:41 2002// +/help/1.1/Sun Jun 23 07:29:42 2002// +/hideinfo/1.1/Sun Jun 23 07:29:42 2002// +/history/1.1/Sun Jun 23 07:29:42 2002// +/hrank/1.1/Sun Jun 23 07:29:42 2002// +/inchannel/1.1/Sun Jun 23 07:29:42 2002// +/info/1.1/Sun Jun 23 07:29:42 2002// +/iset/1.1/Sun Jun 23 07:51:16 2002// +/it/1.1/Sun Jun 23 07:29:42 2002// +/jkill/1.1/Sun Jun 23 07:29:42 2002// +/journal/1.1/Sun Jun 23 07:29:42 2002// +/jsave/1.1/Sun Jun 23 07:29:42 2002// +/kibitz/1.1/Sun Jun 23 07:29:42 2002// +/limits/1.1/Sun Jun 23 07:29:42 2002// +/llogons/1.1/Sun Jun 23 07:29:42 2002// +/logons/1.1/Sun Jun 23 07:29:42 2002// +/ltell/1.1/Sun Jun 23 07:51:16 2002// +/mailhelp/1.1/Sun Jun 23 07:29:42 2002// +/mailmess/1.1/Sun Jun 23 07:29:42 2002// +/mailmoves/1.1/Sun Jun 23 07:29:42 2002// +/mailoldmoves/1.1/Sun Jun 23 07:29:42 2002// +/mailstored/1.1/Sun Jun 23 07:29:42 2002// +/match/1.1/Sun Jun 23 07:29:42 2002// +/messages/1.1/Sun Jun 23 07:29:42 2002// +/mexamine/1.1/Sun Jun 23 07:29:42 2002// +/moretime/1.1/Sun Jun 23 07:29:42 2002// +/moves/1.1/Sun Jun 23 07:29:42 2002// +/news/1.1/Sun Jun 23 07:29:42 2002// +/next/1.1/Sun Jun 23 07:29:42 2002// +/nuke/1.1/Sun Jun 23 07:29:42 2002// +/observe/1.1/Sun Jun 23 07:29:42 2002// +/oldmoves/1.1/Sun Jun 23 07:29:42 2002// +/oldpstat/1.1/Sun Jun 23 07:29:42 2002// +/open/1.1/Sun Jun 23 07:29:42 2002// +/partner/1.1/Sun Jun 23 07:29:42 2002// +/password/1.1/Sun Jun 23 07:29:42 2002// +/pause/1.1/Sun Jun 23 07:29:42 2002// +/pending/1.1/Sun Jun 23 07:29:42 2002// +/pfollow/1.1/Sun Jun 23 07:29:42 2002// +/play/1.1/Sun Jun 23 07:29:42 2002// +/pobserve/1.1/Sun Jun 23 07:29:42 2002// +/pose/1.1/Sun Jun 23 07:29:42 2002// +/prefresh/1.1/Sun Jun 23 07:29:42 2002// +/primary/1.1/Sun Jun 23 07:29:42 2002// +/promote/1.1/Sun Jun 23 07:29:42 2002// +/pstat/1.1/Sun Jun 23 07:51:16 2002// +/ptell/1.1/Sun Jun 23 07:29:42 2002// +/ptime/1.1/Sun Jun 23 07:29:42 2002// +/qtell/1.1/Sun Jun 23 07:51:16 2002// +/quit/1.1/Sun Jun 23 07:29:42 2002// +/quota/1.1/Sun Jun 23 07:29:42 2002// +/raisedead/1.1/Sun Jun 23 07:29:42 2002// +/rank/1.1/Sun Jun 23 07:29:42 2002// +/refresh/1.1/Sun Jun 23 07:29:42 2002// +/rematch/1.1/Sun Jun 23 07:29:42 2002// +/remplayer/1.1/Sun Jun 23 07:29:42 2002// +/rerank/1.1/Sun Jun 23 07:29:42 2002// +/resign/1.1/Sun Jun 23 07:29:42 2002// +/resume/1.1/Sun Jun 23 07:29:42 2002// +/revert/1.1/Sun Jun 23 07:29:42 2002// +/say/1.1/Sun Jun 23 07:29:42 2002// +/seek/1.1/Sun Jun 23 07:29:42 2002// +/set/1.1/Sun Jun 23 07:29:42 2002// +/shout/1.1/Sun Jun 23 07:29:42 2002// +/showcomment/1.1/Sun Jun 23 07:29:42 2002// +/showlist/1.1/Sun Jun 23 07:29:42 2002// +/shutdown/1.1/Sun Jun 23 07:29:42 2002// +/simabort/1.1/Sun Jun 23 07:29:42 2002// +/simadjourn/1.1/Sun Jun 23 07:29:42 2002// +/simallabort/1.1/Sun Jun 23 07:29:42 2002// +/simalladjourn/1.1/Sun Jun 23 07:29:42 2002// +/simgames/1.1/Sun Jun 23 07:29:42 2002// +/simmatch/1.1/Sun Jun 23 07:29:42 2002// +/simnext/1.1/Sun Jun 23 07:29:42 2002// +/simopen/1.1/Sun Jun 23 07:29:42 2002// +/simpass/1.1/Sun Jun 23 07:29:42 2002// +/simprev/1.1/Sun Jun 23 07:29:42 2002// +/smoves/1.1/Sun Jun 23 07:29:42 2002// +/smposition/1.1/Sun Jun 23 07:29:42 2002// +/sought/1.1/Sun Jun 23 07:29:42 2002// +/sposition/1.1/Sun Jun 23 07:29:42 2002// +/statistics/1.1/Sun Jun 23 07:29:42 2002// +/stored/1.1/Sun Jun 23 07:29:42 2002// +/style/1.1/Sun Jun 23 07:29:42 2002// +/sublist/1.1/Sun Jun 23 07:29:42 2002// +/summon/1.1/Sun Jun 23 07:29:42 2002// +/switch/1.1/Sun Jun 23 07:29:42 2002// +/takeback/1.1/Sun Jun 23 07:29:42 2002// +/tell/1.1/Sun Jun 23 07:29:42 2002// +/time/1.1/Sun Jun 23 07:29:42 2002// +/toggle/1.1/Sun Jun 23 07:51:16 2002// +/tomove/1.1/Sun Jun 23 07:29:42 2002// +/tournset/1.1/Sun Jun 23 07:51:16 2002// +/unalias/1.1/Sun Jun 23 07:29:42 2002// +/unexamine/1.1/Sun Jun 23 07:29:42 2002// +/unobserve/1.1/Sun Jun 23 07:29:42 2002// +/unpause/1.1/Sun Jun 23 07:29:42 2002// +/unseek/1.1/Sun Jun 23 07:29:42 2002// +/uptime/1.1/Sun Jun 23 07:29:42 2002// +/ustat/1.1/Sun Jun 23 07:29:42 2002// +/variables/1.1/Sun Jun 23 07:29:42 2002// +/whenshut/1.1/Sun Jun 23 07:29:42 2002// +/whisper/1.1/Sun Jun 23 07:29:42 2002// +/who/1.1/Sun Jun 23 07:29:42 2002// +/withdraw/1.1/Sun Jun 23 07:29:42 2002// +/wname/1.1/Sun Jun 23 07:29:42 2002// +/xkibitz/1.1/Sun Jun 23 07:29:42 2002// +/xtell/1.1/Sun Jun 23 07:29:42 2002// +/xwhisper/1.1/Sun Jun 23 07:29:42 2002// +/znotify/1.1/Sun Jun 23 07:29:42 2002// +/canewsd/1.1/Mon Jun 24 11:13:01 2002// +/canewse/1.1/Mon Jun 24 11:13:01 2002// +/canewsp/1.1/Mon Jun 24 11:13:01 2002// +/canewst/1.1/Mon Jun 24 11:13:01 2002// +/cnewsd/1.1/Mon Jun 24 11:13:01 2002// +/cnewse/1.1/Mon Jun 24 11:13:01 2002// +/cnewsp/1.1/Mon Jun 24 11:13:01 2002// +/cnewst/1.1/Mon Jun 24 11:13:01 2002// +/rmatch/1.1/Mon Jul 1 04:11:59 2002// +D diff --git a/lasker-2.2.3/data/usage/CVS/Repository b/lasker-2.2.3/data/usage/CVS/Repository new file mode 100644 index 0000000..d07b226 --- /dev/null +++ b/lasker-2.2.3/data/usage/CVS/Repository @@ -0,0 +1 @@ +lasker/data/usage diff --git a/lasker-2.2.3/data/usage/CVS/Root b/lasker-2.2.3/data/usage/CVS/Root new file mode 100644 index 0000000..c42ba94 --- /dev/null +++ b/lasker-2.2.3/data/usage/CVS/Root @@ -0,0 +1 @@ +/home/cvs diff --git a/lasker-2.2.3/data/usage/abort b/lasker-2.2.3/data/usage/abort new file mode 100755 index 0000000..5b3def6 --- /dev/null +++ b/lasker-2.2.3/data/usage/abort @@ -0,0 +1,4 @@ +Command: abort +Purpose: to request that the game be cancelled +Usage: abort +Examples: abort diff --git a/lasker-2.2.3/data/usage/accept b/lasker-2.2.3/data/usage/accept new file mode 100755 index 0000000..d643b89 --- /dev/null +++ b/lasker-2.2.3/data/usage/accept @@ -0,0 +1,5 @@ +Command: accept +Purpose: agree to an offer made by a user or opponent +Usage: accept [1-n, all, abort, adjourn, draw, match, pause, player, + simul, switch, takeback] +Examples: accept; accept 2; accept draw; accept Shane diff --git a/lasker-2.2.3/data/usage/acheckhelp b/lasker-2.2.3/data/usage/acheckhelp new file mode 100644 index 0000000..4af2e49 --- /dev/null +++ b/lasker-2.2.3/data/usage/acheckhelp @@ -0,0 +1,3 @@ + Command: acheckhelp + Purpose: check for missing help and usage files + Usage: acheckhelp diff --git a/lasker-2.2.3/data/usage/aconfig b/lasker-2.2.3/data/usage/aconfig new file mode 100644 index 0000000..2216571 --- /dev/null +++ b/lasker-2.2.3/data/usage/aconfig @@ -0,0 +1,4 @@ + Command: aconfig + Purpose: display or change a server config option + Usage: aconfig; aconfig + Example: aconfig IDLE_TIMEOUT 7200 diff --git a/lasker-2.2.3/data/usage/addcomment b/lasker-2.2.3/data/usage/addcomment new file mode 100755 index 0000000..8a7353a --- /dev/null +++ b/lasker-2.2.3/data/usage/addcomment @@ -0,0 +1,4 @@ + Command: addcomment + Purpose: place comment in a user's player file + Usage: addcomment user comment + Examples: addcomment friar warned about misusing channel 1 ... again! diff --git a/lasker-2.2.3/data/usage/addlist b/lasker-2.2.3/data/usage/addlist new file mode 100755 index 0000000..e9331a7 --- /dev/null +++ b/lasker-2.2.3/data/usage/addlist @@ -0,0 +1,5 @@ +Command: addlist +Purpose: add information to a list +Usage: addlist list information +Alt: +list information +Examples: addlist noplay Friar; +noplay Friar diff --git a/lasker-2.2.3/data/usage/addplayer b/lasker-2.2.3/data/usage/addplayer new file mode 100755 index 0000000..bbb0306 --- /dev/null +++ b/lasker-2.2.3/data/usage/addplayer @@ -0,0 +1,4 @@ + Command: addplayer + Purpose: create an account for a user + Usage: addplayer playername emailaddress realname + Examples: addplayer ColinPapa sms@babyville.net First M. Last diff --git a/lasker-2.2.3/data/usage/adjourn b/lasker-2.2.3/data/usage/adjourn new file mode 100755 index 0000000..8d29fcc --- /dev/null +++ b/lasker-2.2.3/data/usage/adjourn @@ -0,0 +1,5 @@ +Command: adjourn +Purpose: to request an adjournment of a game; courtesy_adjourn when + opponent is out of time and may have lag problems +Usage: adjourn +Examples: adjourn diff --git a/lasker-2.2.3/data/usage/adjudicate b/lasker-2.2.3/data/usage/adjudicate new file mode 100755 index 0000000..15bc109 --- /dev/null +++ b/lasker-2.2.3/data/usage/adjudicate @@ -0,0 +1,5 @@ + Command: adjudicate + Purpose: make a decision about a game's result + Usage: adjudicate white_player black_player abort|draw|white|black + Examples: adjudicate Hawk Sparky draw; adjudicate Hawk Sparky white; + adjudicate Hawk Sparky black; adjudicate Hawk Sparky abort diff --git a/lasker-2.2.3/data/usage/admin b/lasker-2.2.3/data/usage/admin new file mode 100755 index 0000000..a00ae9c --- /dev/null +++ b/lasker-2.2.3/data/usage/admin @@ -0,0 +1,4 @@ + Command: admin + Purpose: toggles your admin symbol (*) on/off + Usage: admin + Examples: admin diff --git a/lasker-2.2.3/data/usage/adump b/lasker-2.2.3/data/usage/adump new file mode 100644 index 0000000..d45ea99 --- /dev/null +++ b/lasker-2.2.3/data/usage/adump @@ -0,0 +1,4 @@ + Command: adump + Purpose: dump internal state of server + Usage: adump + diff --git a/lasker-2.2.3/data/usage/ahelp b/lasker-2.2.3/data/usage/ahelp new file mode 100755 index 0000000..5d86c70 --- /dev/null +++ b/lasker-2.2.3/data/usage/ahelp @@ -0,0 +1,4 @@ + Command: ahelp + Purpose: prints special admin help files + Usage: ahelp [topic] + Examples: ahelp; ahelp ban diff --git a/lasker-2.2.3/data/usage/alias b/lasker-2.2.3/data/usage/alias new file mode 100755 index 0000000..78c5371 --- /dev/null +++ b/lasker-2.2.3/data/usage/alias @@ -0,0 +1,4 @@ +Command: alias +Purpose: set/edit personal command alias; review alias or all aliases +Usage: alias [word [string]] +Examples: alias; alias t1; alias t1 tell 1 @ diff --git a/lasker-2.2.3/data/usage/allobservers b/lasker-2.2.3/data/usage/allobservers new file mode 100755 index 0000000..76234b4 --- /dev/null +++ b/lasker-2.2.3/data/usage/allobservers @@ -0,0 +1,4 @@ +Command: allobservers +Purpose: list users currently observing games on the server +Usage: allobservers [game,user] +Examples: allobservers; allobservers 43; allobservers Hawk diff --git a/lasker-2.2.3/data/usage/anews b/lasker-2.2.3/data/usage/anews new file mode 100755 index 0000000..9527f04 --- /dev/null +++ b/lasker-2.2.3/data/usage/anews @@ -0,0 +1,4 @@ +Command: anews +Purpose: display anews entries _or_ details about an anews entry +Usage: anews [all|#[-#]] +Examples: anews; anews all; anews 27; anews 50-65 diff --git a/lasker-2.2.3/data/usage/announce b/lasker-2.2.3/data/usage/announce new file mode 100755 index 0000000..d5c235f --- /dev/null +++ b/lasker-2.2.3/data/usage/announce @@ -0,0 +1,4 @@ + Command: announce + Purpose: broadcast message to all users logged on + Usage: announce message + Examples: announce Type "observe 45" for the world championship game. diff --git a/lasker-2.2.3/data/usage/annunreg b/lasker-2.2.3/data/usage/annunreg new file mode 100755 index 0000000..121df4e --- /dev/null +++ b/lasker-2.2.3/data/usage/annunreg @@ -0,0 +1,4 @@ + Command: annunreg + Purpose: broadcast message to all unregistered users logged on + Usage: annunreg message + Examples: annunreg Type "help register" for information on how to register. diff --git a/lasker-2.2.3/data/usage/areload b/lasker-2.2.3/data/usage/areload new file mode 100644 index 0000000..ab0202d --- /dev/null +++ b/lasker-2.2.3/data/usage/areload @@ -0,0 +1,3 @@ + Command: areload + Purpose: reload server code while running + Usage: areload diff --git a/lasker-2.2.3/data/usage/asetadmin b/lasker-2.2.3/data/usage/asetadmin new file mode 100755 index 0000000..96dae86 --- /dev/null +++ b/lasker-2.2.3/data/usage/asetadmin @@ -0,0 +1,4 @@ + Command: asetadmin + Purpose: sets admin level of a user (certain restrictions apply) + Usage: asetadmin user adminlevel + Examples: asetadmin Sparky 10 diff --git a/lasker-2.2.3/data/usage/asetblitz b/lasker-2.2.3/data/usage/asetblitz new file mode 100755 index 0000000..7d2aa86 --- /dev/null +++ b/lasker-2.2.3/data/usage/asetblitz @@ -0,0 +1,4 @@ + Command: asetblitz + Purpose: modify the items for a user's blitz finger information + Usage: asetblitz user rating wins losses draws RD + Examples: asetblitz friar 1209 23 151 0 39.4 diff --git a/lasker-2.2.3/data/usage/asetbughouse b/lasker-2.2.3/data/usage/asetbughouse new file mode 100755 index 0000000..db2a985 --- /dev/null +++ b/lasker-2.2.3/data/usage/asetbughouse @@ -0,0 +1,4 @@ + Command: asetbughouse + Purpose: modify the items for a user's bughouse finger information + Usage: asetbughouse user rating wins losses draws RD + Examples: asetbughouse friar 1209 23 151 0 39.4 diff --git a/lasker-2.2.3/data/usage/asetclock b/lasker-2.2.3/data/usage/asetclock new file mode 100755 index 0000000..b016f21 --- /dev/null +++ b/lasker-2.2.3/data/usage/asetclock @@ -0,0 +1,4 @@ +Command: asetclock +Purpose: modify the clock time for a user playing a game +Usage: asetclock hours:minutes:seconds +Example: asetclock friar 1:05:15 diff --git a/lasker-2.2.3/data/usage/asetemail b/lasker-2.2.3/data/usage/asetemail new file mode 100755 index 0000000..ed98365 --- /dev/null +++ b/lasker-2.2.3/data/usage/asetemail @@ -0,0 +1,4 @@ + Command: asetemail + Purpose: change the email address of a user + Usage: asetemail user [address] + Examples: asetemail mlong; asetemail mlong nick@unix.univ.edu diff --git a/lasker-2.2.3/data/usage/asethandle b/lasker-2.2.3/data/usage/asethandle new file mode 100755 index 0000000..8a5a0b8 --- /dev/null +++ b/lasker-2.2.3/data/usage/asethandle @@ -0,0 +1,4 @@ + Command: asethandle + Purpose: change the handle of a user + Usage: asethandle oldname newname + Examples: asethandle StupidName BetterName diff --git a/lasker-2.2.3/data/usage/asetlight b/lasker-2.2.3/data/usage/asetlight new file mode 100755 index 0000000..0b5a9f3 --- /dev/null +++ b/lasker-2.2.3/data/usage/asetlight @@ -0,0 +1,4 @@ + Command: asetlight + Purpose: modify the items for a user's lightning finger information + Usage: asetlight user rating wins losses draws RD + Examples: asetlight friar 1209 23 151 0 39.4 diff --git a/lasker-2.2.3/data/usage/asetmaxplayer b/lasker-2.2.3/data/usage/asetmaxplayer new file mode 100755 index 0000000..5632084 --- /dev/null +++ b/lasker-2.2.3/data/usage/asetmaxplayer @@ -0,0 +1,4 @@ + Command: asetmaxplayer + Purpose: changes level at which logons will be restricted + Usage: asetmaxplayer level + Examples: asetmaxplayer 250 diff --git a/lasker-2.2.3/data/usage/asetpasswd b/lasker-2.2.3/data/usage/asetpasswd new file mode 100755 index 0000000..01fb6cc --- /dev/null +++ b/lasker-2.2.3/data/usage/asetpasswd @@ -0,0 +1,4 @@ + Command: asetpasswd + Purpose: change the password of a user + Usage: asetpasswd user {password,*} + Examples: asetpasswd Hawk uhwidhl; asetpasswd Friar * diff --git a/lasker-2.2.3/data/usage/asetrealname b/lasker-2.2.3/data/usage/asetrealname new file mode 100755 index 0000000..dfef01f --- /dev/null +++ b/lasker-2.2.3/data/usage/asetrealname @@ -0,0 +1,4 @@ + Command: asetrealname + Purpose: change the real name of a user + Usage: asetrealname user newname + Examples: asetrealname DAV A. W. Kin diff --git a/lasker-2.2.3/data/usage/asetstd b/lasker-2.2.3/data/usage/asetstd new file mode 100755 index 0000000..e43cae2 --- /dev/null +++ b/lasker-2.2.3/data/usage/asetstd @@ -0,0 +1,4 @@ + Command: asetstd + Purpose: modify the items for a user's standard finger information + Usage: asetstd user rating wins losses draws RD + Examples: asetstd friar 1209 23 151 0 39.4 diff --git a/lasker-2.2.3/data/usage/asetsuicide b/lasker-2.2.3/data/usage/asetsuicide new file mode 100755 index 0000000..e09ed6b --- /dev/null +++ b/lasker-2.2.3/data/usage/asetsuicide @@ -0,0 +1,4 @@ + Command: asetsuicide + Purpose: modify the items for a user's suicide chess finger information + Usage: asetsuicide user rating wins losses draws RD + Examples: asetsuicide friar 1209 23 151 0 39.4 diff --git a/lasker-2.2.3/data/usage/asetv b/lasker-2.2.3/data/usage/asetv new file mode 100755 index 0000000..fec79ac --- /dev/null +++ b/lasker-2.2.3/data/usage/asetv @@ -0,0 +1,4 @@ + Command: asetv + Purpose: change's a user's variable settings for them + Usage: asetv user instruction + Examples: asetv DAV shout 0; asetv Computer open 0 diff --git a/lasker-2.2.3/data/usage/asetwild b/lasker-2.2.3/data/usage/asetwild new file mode 100755 index 0000000..4a4d9a2 --- /dev/null +++ b/lasker-2.2.3/data/usage/asetwild @@ -0,0 +1,4 @@ + Command: asetwild + Purpose: modify the items for a user's wild finger information + Usage: asetwild user rating wins losses draws RD + Examples: asetwild friar 1209 23 151 0 39.4 diff --git a/lasker-2.2.3/data/usage/assess b/lasker-2.2.3/data/usage/assess new file mode 100755 index 0000000..822fdf0 --- /dev/null +++ b/lasker-2.2.3/data/usage/assess @@ -0,0 +1,6 @@ +Command: assess +Purpose: calculate expected changes to ratings from a chess match +Usage: assess [game# | user1 [user2 + [lightning|blitz|standard|suicide|wild]]] +Examples: assess; assess 23; assess Sparky; assess DAV Thanatos; + assess DAV Thanatos standard diff --git a/lasker-2.2.3/data/usage/backward b/lasker-2.2.3/data/usage/backward new file mode 100755 index 0000000..80cb3d0 --- /dev/null +++ b/lasker-2.2.3/data/usage/backward @@ -0,0 +1,4 @@ +Command: backward +Purpose: move backward in the game sequence as you examine a game +Usage: backward [#] [default: 1] +Examples: backward; backward 2 diff --git a/lasker-2.2.3/data/usage/bell b/lasker-2.2.3/data/usage/bell new file mode 100755 index 0000000..0f4fc6e --- /dev/null +++ b/lasker-2.2.3/data/usage/bell @@ -0,0 +1,4 @@ +Command: bell +Purpose: toggles your 'bell' variable on/off (1/0) +Usage: bell +Examples: bell diff --git a/lasker-2.2.3/data/usage/best b/lasker-2.2.3/data/usage/best new file mode 100755 index 0000000..bd4c7a2 --- /dev/null +++ b/lasker-2.2.3/data/usage/best @@ -0,0 +1,4 @@ +Command: best +Purpose: list the 20 highest rated players in the ratings categories +Usage: best [b|s|l|w|B|S] [default: bsl] +Examples: best; best s diff --git a/lasker-2.2.3/data/usage/bname b/lasker-2.2.3/data/usage/bname new file mode 100755 index 0000000..e5bc691 --- /dev/null +++ b/lasker-2.2.3/data/usage/bname @@ -0,0 +1,4 @@ +Command: bname +Purpose: change name of Black player in an examined or setup game +Usage: bname [string] +Examples: bname; bname Kotov diff --git a/lasker-2.2.3/data/usage/boards b/lasker-2.2.3/data/usage/boards new file mode 100755 index 0000000..fb28c81 --- /dev/null +++ b/lasker-2.2.3/data/usage/boards @@ -0,0 +1,4 @@ +Command: boards +Purpose: list available positions for starting a game +Usage: boards [category] +Examples: boards; boards openings diff --git a/lasker-2.2.3/data/usage/bsetup b/lasker-2.2.3/data/usage/bsetup new file mode 100755 index 0000000..1fc90df --- /dev/null +++ b/lasker-2.2.3/data/usage/bsetup @@ -0,0 +1,4 @@ +Command: bsetup +Purpose: begin bsetup mode and execute special bsetup commands +Usage: bsetup [command] +Examples: bsetup; bsetup wild 5; bsetup start; bsetup clear; bsetup done diff --git a/lasker-2.2.3/data/usage/bugwho b/lasker-2.2.3/data/usage/bugwho new file mode 100755 index 0000000..9335e8b --- /dev/null +++ b/lasker-2.2.3/data/usage/bugwho @@ -0,0 +1,4 @@ +Command: bugwho +Purpose: lists current bughouse games, partnerships and available partners +Usage: bugwho [g|p|u] +Examples: bugwho; bugwho g; bugwho pu diff --git a/lasker-2.2.3/data/usage/canewsd b/lasker-2.2.3/data/usage/canewsd new file mode 100644 index 0000000..f9625da --- /dev/null +++ b/lasker-2.2.3/data/usage/canewsd @@ -0,0 +1,4 @@ + Command: canewsd + Purpose: delete last line of an admin news item + Usage: canewsd # + Examples: canewsd 180 diff --git a/lasker-2.2.3/data/usage/canewse b/lasker-2.2.3/data/usage/canewse new file mode 100644 index 0000000..6d35ed3 --- /dev/null +++ b/lasker-2.2.3/data/usage/canewse @@ -0,0 +1,4 @@ + Command: canewse + Purpose: change expiry of an admin news item + Usage: canewse # expiry + Examples: canewse 180 2 diff --git a/lasker-2.2.3/data/usage/canewsf b/lasker-2.2.3/data/usage/canewsf new file mode 100755 index 0000000..699e115 --- /dev/null +++ b/lasker-2.2.3/data/usage/canewsf @@ -0,0 +1,4 @@ + Command: canewsf + Purpose: changes information for an anews item + Usage: canewsf # text + Examples: canewsf 25 Users should contact admins for help registering. diff --git a/lasker-2.2.3/data/usage/canewsi b/lasker-2.2.3/data/usage/canewsi new file mode 100755 index 0000000..08fa35b --- /dev/null +++ b/lasker-2.2.3/data/usage/canewsi @@ -0,0 +1,4 @@ + Command: canewsi + Purpose: creates an anews item + Usage: canewsi headline + Examples: canewsi New registration procedures! diff --git a/lasker-2.2.3/data/usage/canewsp b/lasker-2.2.3/data/usage/canewsp new file mode 100644 index 0000000..8fcde87 --- /dev/null +++ b/lasker-2.2.3/data/usage/canewsp @@ -0,0 +1,4 @@ + Command: canewsp + Purpose: change poster of an admin news item + Usage: canewsp # + Examples: canewsp 180 diff --git a/lasker-2.2.3/data/usage/canewst b/lasker-2.2.3/data/usage/canewst new file mode 100644 index 0000000..2da63ed --- /dev/null +++ b/lasker-2.2.3/data/usage/canewst @@ -0,0 +1,4 @@ + Command: canewst + Purpose: change title of an admin news item + Usage: canewst # title + Examples: canewst 180 Hello everyone! diff --git a/lasker-2.2.3/data/usage/cbest b/lasker-2.2.3/data/usage/cbest new file mode 100755 index 0000000..846779e --- /dev/null +++ b/lasker-2.2.3/data/usage/cbest @@ -0,0 +1,4 @@ +Command: cbest +Purpose: displays 20 highest-rated computer players by chess category +Usage: cbest [b|s|l|w|B|S] [default: bsl] +Examples: cbest; cbest s diff --git a/lasker-2.2.3/data/usage/chkgame b/lasker-2.2.3/data/usage/chkgame new file mode 100755 index 0000000..c457ebd --- /dev/null +++ b/lasker-2.2.3/data/usage/chkgame @@ -0,0 +1,4 @@ + Command: chkgame + Purpose: displays information about a current game + Usage: chkgame game#|handle + Examples: chkgame 56; chkgame TheDane diff --git a/lasker-2.2.3/data/usage/chkip b/lasker-2.2.3/data/usage/chkip new file mode 100755 index 0000000..9c72f09 --- /dev/null +++ b/lasker-2.2.3/data/usage/chkip @@ -0,0 +1,4 @@ + Command: chkip + Purpose: display logged users from a given IP address + Usage: chkip ip_address|handle + Examples: chkip 129.46.4.2; chkip 129*; chkip guest45 diff --git a/lasker-2.2.3/data/usage/chkpl b/lasker-2.2.3/data/usage/chkpl new file mode 100755 index 0000000..d065e52 --- /dev/null +++ b/lasker-2.2.3/data/usage/chkpl @@ -0,0 +1,6 @@ + +chkpl + Command: chkpl + Purpose: check server information about a user + Usage: chkpl handle|parray# + Examples: chkpl schert; chkpl 20 diff --git a/lasker-2.2.3/data/usage/chksc b/lasker-2.2.3/data/usage/chksc new file mode 100755 index 0000000..0c2b104 --- /dev/null +++ b/lasker-2.2.3/data/usage/chksc @@ -0,0 +1,4 @@ + Command: chksc + Purpose: display which user is in which socket + Usage: chksc n + Examples: chksc 3 diff --git a/lasker-2.2.3/data/usage/chkts b/lasker-2.2.3/data/usage/chkts new file mode 100755 index 0000000..24921ef --- /dev/null +++ b/lasker-2.2.3/data/usage/chkts @@ -0,0 +1,4 @@ + Command: chkts + Purpose: displays all current users who are using timeseal + Usage: chkts + Examples: chkts diff --git a/lasker-2.2.3/data/usage/clearmessages b/lasker-2.2.3/data/usage/clearmessages new file mode 100755 index 0000000..9c10256 --- /dev/null +++ b/lasker-2.2.3/data/usage/clearmessages @@ -0,0 +1,5 @@ +Command: clearmessages +Purpose: delete one or more stored messages from your message file +Usage: clearmessages user|#|m-n|* [* will clear all messages] +Examples: clearmessages Solid; clearmessages 8; clearmessages 3-7; + clearmessages * diff --git a/lasker-2.2.3/data/usage/clrsquare b/lasker-2.2.3/data/usage/clrsquare new file mode 100755 index 0000000..5660fff --- /dev/null +++ b/lasker-2.2.3/data/usage/clrsquare @@ -0,0 +1,4 @@ +Command: clrsquare +Purpose: used in setup mode in order to empty a square (make it blank) +Usage: clrsquare square +Examples: clrsquare e4; clrsquare h6 diff --git a/lasker-2.2.3/data/usage/cnewsd b/lasker-2.2.3/data/usage/cnewsd new file mode 100644 index 0000000..555cbf0 --- /dev/null +++ b/lasker-2.2.3/data/usage/cnewsd @@ -0,0 +1,4 @@ + Command: cnewsd + Purpose: delete last line of a regular news item + Usage: cnewsd # + Examples: cnewsd 180 diff --git a/lasker-2.2.3/data/usage/cnewse b/lasker-2.2.3/data/usage/cnewse new file mode 100644 index 0000000..f60e642 --- /dev/null +++ b/lasker-2.2.3/data/usage/cnewse @@ -0,0 +1,4 @@ + Command: cnewse + Purpose: change expiry of a regular news item + Usage: cnewse # expiry + Examples: cnewse 180 2 diff --git a/lasker-2.2.3/data/usage/cnewsf b/lasker-2.2.3/data/usage/cnewsf new file mode 100755 index 0000000..ba793e6 --- /dev/null +++ b/lasker-2.2.3/data/usage/cnewsf @@ -0,0 +1,4 @@ + Command: cnewsf + Purpose: change details of a regular news item + Usage: cnewsf # message + Examples: cnewsf 180 New interface available. Finger "author". diff --git a/lasker-2.2.3/data/usage/cnewsi b/lasker-2.2.3/data/usage/cnewsi new file mode 100755 index 0000000..50ab3eb --- /dev/null +++ b/lasker-2.2.3/data/usage/cnewsi @@ -0,0 +1,4 @@ + Command: cnewsi + Purpose: create a regular news item + Usage: cnewsi headline + Examples: cnewsi New timeseal versions done! diff --git a/lasker-2.2.3/data/usage/cnewsp b/lasker-2.2.3/data/usage/cnewsp new file mode 100644 index 0000000..0b376dd --- /dev/null +++ b/lasker-2.2.3/data/usage/cnewsp @@ -0,0 +1,4 @@ + Command: cnewsp + Purpose: change poster of a regular news item + Usage: cnewsp # + Examples: cnewsp 180 diff --git a/lasker-2.2.3/data/usage/cnewst b/lasker-2.2.3/data/usage/cnewst new file mode 100644 index 0000000..66db4f3 --- /dev/null +++ b/lasker-2.2.3/data/usage/cnewst @@ -0,0 +1,4 @@ + Command: cnewst + Purpose: change title of a regular news item + Usage: cnewst # title + Examples: cnewst 180 Hello everyone! diff --git a/lasker-2.2.3/data/usage/copygame b/lasker-2.2.3/data/usage/copygame new file mode 100755 index 0000000..79e55ec --- /dev/null +++ b/lasker-2.2.3/data/usage/copygame @@ -0,0 +1,4 @@ +Command: copygame +Purpose: copy a game so that it can be examined +Usage: copygame [user_name|number|o] +Examples: copygame Sparky; copygame 7; copygame o; copygame diff --git a/lasker-2.2.3/data/usage/crank b/lasker-2.2.3/data/usage/crank new file mode 100755 index 0000000..67a5147 --- /dev/null +++ b/lasker-2.2.3/data/usage/crank @@ -0,0 +1,6 @@ +Command: crank +Purpose: displays rank (excluding computer accounts) for a player or + range of players +Usage: crank [user [b][s][l][w][B][S]] -OR- crank m-n [b][s][l][w][B][S] + -OR- crank m [b][s][l][w][B][S]] [default: bsl] +Examples: crank; crank 50-100; crank 1800; crank s; crank cyee bs diff --git a/lasker-2.2.3/data/usage/cshout b/lasker-2.2.3/data/usage/cshout new file mode 100755 index 0000000..8292529 --- /dev/null +++ b/lasker-2.2.3/data/usage/cshout @@ -0,0 +1,4 @@ +Command: cshout +Purpose: send message to users who are open to receive cshouts +Usage: cshout message +Examples: cshout Anyone for 2 5 rated? diff --git a/lasker-2.2.3/data/usage/date b/lasker-2.2.3/data/usage/date new file mode 100755 index 0000000..d2c7295 --- /dev/null +++ b/lasker-2.2.3/data/usage/date @@ -0,0 +1,4 @@ +Command: date +Purpose: lists both local date/time at the server and GMT date/time +Usage: date +Examples: date diff --git a/lasker-2.2.3/data/usage/decline b/lasker-2.2.3/data/usage/decline new file mode 100755 index 0000000..f030222 --- /dev/null +++ b/lasker-2.2.3/data/usage/decline @@ -0,0 +1,5 @@ +Command: decline +Purpose: decline (turn down) an offer made to you by a user +Usage: decline [1-n, t all, abort, adjourn, draw, match, pause, player, + simul, switch, takeback] +Examples: decline; decline 2; decline draw; decline cyee diff --git a/lasker-2.2.3/data/usage/draw b/lasker-2.2.3/data/usage/draw new file mode 100755 index 0000000..768246b --- /dev/null +++ b/lasker-2.2.3/data/usage/draw @@ -0,0 +1,4 @@ +Command: draw +Purpose: requests (or accepts) a draw offer; it may include a move +Usage: draw [move] +Examples: draw; draw Kf7 diff --git a/lasker-2.2.3/data/usage/eco b/lasker-2.2.3/data/usage/eco new file mode 100755 index 0000000..d059d34 --- /dev/null +++ b/lasker-2.2.3/data/usage/eco @@ -0,0 +1,4 @@ +Command: eco +Purpose: display the type of opening used in the chess game +Usage: eco [game, name, e , n ] +Examples: eco; eco 23; eco Clovis; eco e A5; eco n FR.04 diff --git a/lasker-2.2.3/data/usage/examine b/lasker-2.2.3/data/usage/examine new file mode 100755 index 0000000..0a65008 --- /dev/null +++ b/lasker-2.2.3/data/usage/examine @@ -0,0 +1,6 @@ +Command: examine +Purpose: start or review a game under examination mode +Usage: examine [player1 [player2, game_number, journal_slot] _or_ + examine b board category +Examples: examine; examine river; examine TheDane sms; examine McKeork 7; + examine loon F; examine b wild 5 diff --git a/lasker-2.2.3/data/usage/finger b/lasker-2.2.3/data/usage/finger new file mode 100755 index 0000000..9c896bf --- /dev/null +++ b/lasker-2.2.3/data/usage/finger @@ -0,0 +1,5 @@ +Command: finger +Purpose: display ratings and/or notes about yourself or another user +Usage: finger [user] [/[b][s][l][w][B][S]] [r][n] +Examples: finger; finger TheViking; finger TheViking r; finger TheViking n; + finger TheViking /wS r diff --git a/lasker-2.2.3/data/usage/flag b/lasker-2.2.3/data/usage/flag new file mode 100755 index 0000000..5113cce --- /dev/null +++ b/lasker-2.2.3/data/usage/flag @@ -0,0 +1,4 @@ +Command: flag +Purpose: claim a win when your opponent has run out of time +Usage: flag +Examples: flag diff --git a/lasker-2.2.3/data/usage/flip b/lasker-2.2.3/data/usage/flip new file mode 100755 index 0000000..3b525d6 --- /dev/null +++ b/lasker-2.2.3/data/usage/flip @@ -0,0 +1,4 @@ +Command: flip +Purpose: toggles board display between White-at-bottom and White-at-top +Usage: flip +Examples: flip diff --git a/lasker-2.2.3/data/usage/fmessage b/lasker-2.2.3/data/usage/fmessage new file mode 100755 index 0000000..e427dae --- /dev/null +++ b/lasker-2.2.3/data/usage/fmessage @@ -0,0 +1,4 @@ +Command: fmessage +Purpose: forward a message to a user +Usage: fmessages user message_# [use # from your message list] +Examples: fmessage DAV 3 diff --git a/lasker-2.2.3/data/usage/follow b/lasker-2.2.3/data/usage/follow new file mode 100755 index 0000000..e223120 --- /dev/null +++ b/lasker-2.2.3/data/usage/follow @@ -0,0 +1,4 @@ +Command: follow +Purpose: Automatically observe all of a user's games, or cancel this function. +Usage: follow user; follow +Examples: follow Binford; follow diff --git a/lasker-2.2.3/data/usage/forward b/lasker-2.2.3/data/usage/forward new file mode 100755 index 0000000..d0e1960 --- /dev/null +++ b/lasker-2.2.3/data/usage/forward @@ -0,0 +1,4 @@ +Command: forward +Purpose: move forward in a sequence of moves in a game being examined +Usage: forward [#] [default: 1] +Examples: forward; forward 2 diff --git a/lasker-2.2.3/data/usage/ftell b/lasker-2.2.3/data/usage/ftell new file mode 100755 index 0000000..142a435 --- /dev/null +++ b/lasker-2.2.3/data/usage/ftell @@ -0,0 +1,4 @@ +Command: ftell +Purpose: forward tells to channel 0, or cancel this function +Usage: ftell user_name; ftell +Examples: ftell idiotUser; ftell diff --git a/lasker-2.2.3/data/usage/games b/lasker-2.2.3/data/usage/games new file mode 100755 index 0000000..9da5a58 --- /dev/null +++ b/lasker-2.2.3/data/usage/games @@ -0,0 +1,4 @@ +Command: games +Purpose: display information about games currently in progress +Usage: games [#, /[bBelsSuw], string] [default: all games] +Examples: games; games 23; games sv; games sveshi; games /B; games /lw diff --git a/lasker-2.2.3/data/usage/getgi b/lasker-2.2.3/data/usage/getgi new file mode 100644 index 0000000..69a5936 --- /dev/null +++ b/lasker-2.2.3/data/usage/getgi @@ -0,0 +1,2 @@ +Command: getgi +Purpose: used by TD programs only diff --git a/lasker-2.2.3/data/usage/getpi b/lasker-2.2.3/data/usage/getpi new file mode 100644 index 0000000..5b7d3c7 --- /dev/null +++ b/lasker-2.2.3/data/usage/getpi @@ -0,0 +1,2 @@ +Command: getpi +Purpose: used by TD programs only diff --git a/lasker-2.2.3/data/usage/ginfo b/lasker-2.2.3/data/usage/ginfo new file mode 100755 index 0000000..aa79faa --- /dev/null +++ b/lasker-2.2.3/data/usage/ginfo @@ -0,0 +1,4 @@ +Command: ginfo +Purpose: display information about a game being played or examined +Usage: ginfo name|number +Examples: ginfo 23; ginfo Clovis diff --git a/lasker-2.2.3/data/usage/goboard b/lasker-2.2.3/data/usage/goboard new file mode 100755 index 0000000..81cd707 --- /dev/null +++ b/lasker-2.2.3/data/usage/goboard @@ -0,0 +1,4 @@ +Command: goboard +Purpose: in a simul match, move to a given player's board +Usage: goboard player|# +Examples: goboard Shaughn; goboard 7 diff --git a/lasker-2.2.3/data/usage/handles b/lasker-2.2.3/data/usage/handles new file mode 100755 index 0000000..ab8730e --- /dev/null +++ b/lasker-2.2.3/data/usage/handles @@ -0,0 +1,4 @@ +Command: handles +Purpose: lists registered handles beginning with a certain string +Usage: handles [string] +Examples: handles; handles g diff --git a/lasker-2.2.3/data/usage/hbest b/lasker-2.2.3/data/usage/hbest new file mode 100755 index 0000000..53d476d --- /dev/null +++ b/lasker-2.2.3/data/usage/hbest @@ -0,0 +1,4 @@ +Command: hbest +Purpose: displays 20 highest-rated human players by chess category +Usage: hbest [b|s|l|w|B|S] [default: bsl] +Examples: hbest; hbest s diff --git a/lasker-2.2.3/data/usage/help b/lasker-2.2.3/data/usage/help new file mode 100755 index 0000000..fd34bb5 --- /dev/null +++ b/lasker-2.2.3/data/usage/help @@ -0,0 +1,4 @@ +Command: help +Purpose: read a help file +Usage: help [string] +Examples: help; help match diff --git a/lasker-2.2.3/data/usage/hideinfo b/lasker-2.2.3/data/usage/hideinfo new file mode 100755 index 0000000..fe75571 --- /dev/null +++ b/lasker-2.2.3/data/usage/hideinfo @@ -0,0 +1,4 @@ + Command: hideinfo + Purpose: change from admin to regular display of information + Usage: hideinfo + Examples: hideinfo diff --git a/lasker-2.2.3/data/usage/history b/lasker-2.2.3/data/usage/history new file mode 100755 index 0000000..bc77633 --- /dev/null +++ b/lasker-2.2.3/data/usage/history @@ -0,0 +1,4 @@ +Command: history +Purpose: displays results of your or another user's recent games +Usage: history [user] +Examples: history; history Rattlesnake diff --git a/lasker-2.2.3/data/usage/hrank b/lasker-2.2.3/data/usage/hrank new file mode 100755 index 0000000..c8aca13 --- /dev/null +++ b/lasker-2.2.3/data/usage/hrank @@ -0,0 +1,6 @@ +Command: hrank +Purpose: displays rank (excluding computer accounts) for a player or + range of players +Usage: hrank [user [b][s][l][w][B][S]] -OR- hrank m-n [b][s][l][w][B][S] + -OR- hrank m [b][s][l][w][B][S]] [default: bsl] +Examples: hrank; hrank 50-100; hrank 1800; hrank s; hrank cyee bs diff --git a/lasker-2.2.3/data/usage/inchannel b/lasker-2.2.3/data/usage/inchannel new file mode 100755 index 0000000..b776917 --- /dev/null +++ b/lasker-2.2.3/data/usage/inchannel @@ -0,0 +1,5 @@ +Command: inchannel +Purpose: lists the channels a user is in, or who is in a given channel, or + all users in a range of chanels, or all users in all channels +Usage: inchannel [user|m[-n]] +Examples: inchannel; inchannel Solid; inchannel 1; inchannel 90-95 diff --git a/lasker-2.2.3/data/usage/info b/lasker-2.2.3/data/usage/info new file mode 100755 index 0000000..121e197 --- /dev/null +++ b/lasker-2.2.3/data/usage/info @@ -0,0 +1,4 @@ +Command: info +Purpose: list the information (non-command) help files +Usage: info +Examples: info diff --git a/lasker-2.2.3/data/usage/iset b/lasker-2.2.3/data/usage/iset new file mode 100644 index 0000000..733fc8f --- /dev/null +++ b/lasker-2.2.3/data/usage/iset @@ -0,0 +1,3 @@ +Command: iset +Purpose: set a interface variable +Usage: iset variable_name [value] diff --git a/lasker-2.2.3/data/usage/it b/lasker-2.2.3/data/usage/it new file mode 100755 index 0000000..c03c4de --- /dev/null +++ b/lasker-2.2.3/data/usage/it @@ -0,0 +1,4 @@ +Command: it +Purpose: send message to users open to receive shouts +Usage: it message +Examples: it thinks internet chess is wonderful! diff --git a/lasker-2.2.3/data/usage/jkill b/lasker-2.2.3/data/usage/jkill new file mode 100755 index 0000000..272e690 --- /dev/null +++ b/lasker-2.2.3/data/usage/jkill @@ -0,0 +1,4 @@ +Command: jkill +Purpose: erase games from your journal +Usage: jkill slot +Examples: jkill A; jkill L diff --git a/lasker-2.2.3/data/usage/journal b/lasker-2.2.3/data/usage/journal new file mode 100755 index 0000000..c8f3364 --- /dev/null +++ b/lasker-2.2.3/data/usage/journal @@ -0,0 +1,4 @@ +Command: journal +Purpose: display contents of a journal +Usage: journal [handle] +Examples: journal; journal DAV diff --git a/lasker-2.2.3/data/usage/jsave b/lasker-2.2.3/data/usage/jsave new file mode 100755 index 0000000..a597efc --- /dev/null +++ b/lasker-2.2.3/data/usage/jsave @@ -0,0 +1,6 @@ +Command: jsave +Purpose: save games to your journal +Usage: jsave slot [game_number | user_name [game_number | journal_slot | + user_name]] +Examples: jsave A; jsave D 34; jsave F Friar 3; jsave C Sparky L; + jsave J jross bozky diff --git a/lasker-2.2.3/data/usage/kibitz b/lasker-2.2.3/data/usage/kibitz new file mode 100755 index 0000000..b1b1bc5 --- /dev/null +++ b/lasker-2.2.3/data/usage/kibitz @@ -0,0 +1,4 @@ +Command: kibitz +Purpose: send message to all players and observers of a chess match +Usage: kibitz message +Examples: kibitz What about Bxc6??? diff --git a/lasker-2.2.3/data/usage/limits b/lasker-2.2.3/data/usage/limits new file mode 100755 index 0000000..01836af --- /dev/null +++ b/lasker-2.2.3/data/usage/limits @@ -0,0 +1,4 @@ +Command: limits +Purpose: display current server limits and settings +Usage: limits +Examples: limits diff --git a/lasker-2.2.3/data/usage/llogons b/lasker-2.2.3/data/usage/llogons new file mode 100755 index 0000000..f181a13 --- /dev/null +++ b/lasker-2.2.3/data/usage/llogons @@ -0,0 +1,4 @@ +Command: llogons +Purpose: lists recent logons and logoffs for the server +Usage: llogons +Examples: llogons diff --git a/lasker-2.2.3/data/usage/logons b/lasker-2.2.3/data/usage/logons new file mode 100755 index 0000000..45b51c7 --- /dev/null +++ b/lasker-2.2.3/data/usage/logons @@ -0,0 +1,4 @@ +Command: logons +Purpose: lists recent logons/logoffs for the user +Usage: logons [user] +Examples: logons; logons Friar diff --git a/lasker-2.2.3/data/usage/ltell b/lasker-2.2.3/data/usage/ltell new file mode 100644 index 0000000..a9a46fe --- /dev/null +++ b/lasker-2.2.3/data/usage/ltell @@ -0,0 +1,4 @@ +Command: ltell +Purpose: send a message to a list of users +Usage: ltell list message +Examples: ltell computer hello to all our silicon buddies diff --git a/lasker-2.2.3/data/usage/mailhelp b/lasker-2.2.3/data/usage/mailhelp new file mode 100755 index 0000000..e40f2d3 --- /dev/null +++ b/lasker-2.2.3/data/usage/mailhelp @@ -0,0 +1,4 @@ +Command: mailhelp +Purpose: email a help file to you (or show files that can be emailed) +Usage: mailhelp [filename] +Examples: mailhelp; mailhelp intro_welcome diff --git a/lasker-2.2.3/data/usage/mailmess b/lasker-2.2.3/data/usage/mailmess new file mode 100755 index 0000000..b3ed209 --- /dev/null +++ b/lasker-2.2.3/data/usage/mailmess @@ -0,0 +1,4 @@ +Command: mailmess +Purpose: email 1 or more of your your stored messages to you +Usage: mailmess [user|#|#-#] +Examples: mailmess; mailmess fpawn; mailmess 4; mailmess 7-11 diff --git a/lasker-2.2.3/data/usage/mailmoves b/lasker-2.2.3/data/usage/mailmoves new file mode 100755 index 0000000..0160ebd --- /dev/null +++ b/lasker-2.2.3/data/usage/mailmoves @@ -0,0 +1,4 @@ +Command: mailmoves +Purpose: email to you the moves for current game you are involved with +Usage: mailmoves +Examples: mailmoves diff --git a/lasker-2.2.3/data/usage/mailoldmoves b/lasker-2.2.3/data/usage/mailoldmoves new file mode 100755 index 0000000..73d175f --- /dev/null +++ b/lasker-2.2.3/data/usage/mailoldmoves @@ -0,0 +1,5 @@ +Command: mailoldmoves +Purpose: email to you the moves from a completed game +Usage: mailoldmoves [user] +Examples: mailoldmoves; mailoldmoves loon +[NOTE: mailstored is a better command to use] diff --git a/lasker-2.2.3/data/usage/mailstored b/lasker-2.2.3/data/usage/mailstored new file mode 100755 index 0000000..b8c39b9 --- /dev/null +++ b/lasker-2.2.3/data/usage/mailstored @@ -0,0 +1,5 @@ +Command: mailstored +Purpose: email a stored, history or journal game to you +Usage: mailstored player1 [#, player2, journal_slot] +Examples: mailstored Len; mailstored Len 87; mailstored Len fpawn; + mailstored Len K diff --git a/lasker-2.2.3/data/usage/match b/lasker-2.2.3/data/usage/match new file mode 100755 index 0000000..f86cc5b --- /dev/null +++ b/lasker-2.2.3/data/usage/match @@ -0,0 +1,5 @@ +Command: match +Purpose: challenge a user to a chess match +Usage: match user [rated|unrated] [Time] [Inc] [Black_Start Black_Inc] + [White|Black] [board_category board] +Examples: match foxbat; match Marsalis 2 15 u diff --git a/lasker-2.2.3/data/usage/messages b/lasker-2.2.3/data/usage/messages new file mode 100755 index 0000000..a3fa172 --- /dev/null +++ b/lasker-2.2.3/data/usage/messages @@ -0,0 +1,5 @@ +Command: messages +Purpose: display 1 or more stored messages -OR- send a message to a user +Usage: messages [user [text]|#|m-n] +Examples: messages; messages Shane; messages Ramius Thanks for your help!; + messages 13; messages 2-9 diff --git a/lasker-2.2.3/data/usage/mexamine b/lasker-2.2.3/data/usage/mexamine new file mode 100755 index 0000000..2d344f9 --- /dev/null +++ b/lasker-2.2.3/data/usage/mexamine @@ -0,0 +1,4 @@ +Command: mexamine +Purpose: allow another user to examine a game with you +Usage: mexamine user +Examples: mexamine connex diff --git a/lasker-2.2.3/data/usage/moretime b/lasker-2.2.3/data/usage/moretime new file mode 100755 index 0000000..7bab4a4 --- /dev/null +++ b/lasker-2.2.3/data/usage/moretime @@ -0,0 +1,4 @@ +Command: moretime +Purpose: add more seconds to your opponent's clock +Usage: moretime seconds +Examples: moretime 90 diff --git a/lasker-2.2.3/data/usage/moves b/lasker-2.2.3/data/usage/moves new file mode 100755 index 0000000..2657105 --- /dev/null +++ b/lasker-2.2.3/data/usage/moves @@ -0,0 +1,4 @@ +Command: moves +Purpose: displays moves to a current game +Usage: moves [game,user] +Examples: moves; moves 56; moves Cthulhu diff --git a/lasker-2.2.3/data/usage/news b/lasker-2.2.3/data/usage/news new file mode 100755 index 0000000..7008013 --- /dev/null +++ b/lasker-2.2.3/data/usage/news @@ -0,0 +1,4 @@ +Command: news +Purpose: list recent news items -OR- display details of a news item +Usage: news [all|#[-#]] +Examples: news; news all; news 11; news 35-50 diff --git a/lasker-2.2.3/data/usage/next b/lasker-2.2.3/data/usage/next new file mode 100755 index 0000000..84cfbc1 --- /dev/null +++ b/lasker-2.2.3/data/usage/next @@ -0,0 +1,4 @@ +Command: next +Purpose: display further information from a long text file +Usage: next +Examples: next diff --git a/lasker-2.2.3/data/usage/nuke b/lasker-2.2.3/data/usage/nuke new file mode 100755 index 0000000..4c04057 --- /dev/null +++ b/lasker-2.2.3/data/usage/nuke @@ -0,0 +1,4 @@ + Command: nuke + Purpose: force a user to disconnect from the server + Usage: nuke user + Examples: nuke BadUser diff --git a/lasker-2.2.3/data/usage/observe b/lasker-2.2.3/data/usage/observe new file mode 100755 index 0000000..b9c88ba --- /dev/null +++ b/lasker-2.2.3/data/usage/observe @@ -0,0 +1,4 @@ +Command: observe +Purpose: add (or remove) a game from your observation list (toggles ON/OFF) +Usage: observe game|user +Examples: observe 34; observe GMAnand diff --git a/lasker-2.2.3/data/usage/oldmoves b/lasker-2.2.3/data/usage/oldmoves new file mode 100755 index 0000000..7f0f300 --- /dev/null +++ b/lasker-2.2.3/data/usage/oldmoves @@ -0,0 +1,5 @@ +Command: oldmoves +Purpose: display moves of the user's last played chess match +Usage: oldmoves [user] +Examples: oldmoves; oldmoves TheDane +[NOTE: smoves is a better command to use] diff --git a/lasker-2.2.3/data/usage/oldpstat b/lasker-2.2.3/data/usage/oldpstat new file mode 100755 index 0000000..69db0e3 --- /dev/null +++ b/lasker-2.2.3/data/usage/oldpstat @@ -0,0 +1,4 @@ +Command: pstat +Purpose: display previous results between two users +Usage: pstat [user1 [user2]] +Examples: pstat; pstat Sparky; pstat DAV Thanatos; diff --git a/lasker-2.2.3/data/usage/open b/lasker-2.2.3/data/usage/open new file mode 100755 index 0000000..485b507 --- /dev/null +++ b/lasker-2.2.3/data/usage/open @@ -0,0 +1,4 @@ +Command: open +Purpose: toggles your open variable on/off (1/0) +Usage: open +Examples: open diff --git a/lasker-2.2.3/data/usage/partner b/lasker-2.2.3/data/usage/partner new file mode 100755 index 0000000..f22f927 --- /dev/null +++ b/lasker-2.2.3/data/usage/partner @@ -0,0 +1,4 @@ +Command: partner +Purpose: ask a user to be your bughouse partner; remove partner setting +Usage: partner handle; partner +Examples: partner Rattlesnake; partner diff --git a/lasker-2.2.3/data/usage/password b/lasker-2.2.3/data/usage/password new file mode 100755 index 0000000..0491e76 --- /dev/null +++ b/lasker-2.2.3/data/usage/password @@ -0,0 +1,4 @@ +Command: password +Purpose: change your current server password to a new password +Usage: password oldpassword newpassword +Examples: password old new diff --git a/lasker-2.2.3/data/usage/pause b/lasker-2.2.3/data/usage/pause new file mode 100755 index 0000000..39ccd03 --- /dev/null +++ b/lasker-2.2.3/data/usage/pause @@ -0,0 +1,4 @@ +Command: pause +Purpose: requests (or accepts) a pause during a chess match +Usage: pause +Examples: pause diff --git a/lasker-2.2.3/data/usage/pending b/lasker-2.2.3/data/usage/pending new file mode 100755 index 0000000..d804d88 --- /dev/null +++ b/lasker-2.2.3/data/usage/pending @@ -0,0 +1,4 @@ +Command: pending +Purpose: lists all your non-declined offers from and made to users +Usage: pending +Examples: pending diff --git a/lasker-2.2.3/data/usage/pfollow b/lasker-2.2.3/data/usage/pfollow new file mode 100755 index 0000000..b22abac --- /dev/null +++ b/lasker-2.2.3/data/usage/pfollow @@ -0,0 +1,4 @@ +Command: pfollow +Purpose: Automatically observe all of a user's partner's bughouse games. +Usage: pfollow user; pfollow +Examples: pfollow Binford; pfollow diff --git a/lasker-2.2.3/data/usage/play b/lasker-2.2.3/data/usage/play new file mode 100755 index 0000000..64857ba --- /dev/null +++ b/lasker-2.2.3/data/usage/play @@ -0,0 +1,4 @@ +Command: play +Purpose: respond to an ad (from 'sought' display) +Usage: play index_#|handle +Examples: play 5; play Rattlesnake diff --git a/lasker-2.2.3/data/usage/pobserve b/lasker-2.2.3/data/usage/pobserve new file mode 100755 index 0000000..61d19f5 --- /dev/null +++ b/lasker-2.2.3/data/usage/pobserve @@ -0,0 +1,4 @@ +Command: pobserve +Purpose: observe bughouse games of a user's partner +Usage: pobserve user +Examples: pobserve GMAnand diff --git a/lasker-2.2.3/data/usage/pose b/lasker-2.2.3/data/usage/pose new file mode 100755 index 0000000..cbed1f8 --- /dev/null +++ b/lasker-2.2.3/data/usage/pose @@ -0,0 +1,4 @@ + Command: pose + Purpose: execute a command on behalf of a user + Usage: pose user command + Examples: pose Friar tell 0 Huzzah! diff --git a/lasker-2.2.3/data/usage/prefresh b/lasker-2.2.3/data/usage/prefresh new file mode 100755 index 0000000..d1c9c46 --- /dev/null +++ b/lasker-2.2.3/data/usage/prefresh @@ -0,0 +1,4 @@ +Command: prefresh +Purpose: refresh (display) your bughouse partner's game +Usage: prefresh +Examples: prefresh diff --git a/lasker-2.2.3/data/usage/primary b/lasker-2.2.3/data/usage/primary new file mode 100755 index 0000000..24c8dc9 --- /dev/null +++ b/lasker-2.2.3/data/usage/primary @@ -0,0 +1,4 @@ +Command: primary +Purpose: designate which game is 'primary' for purposes of observation +Usage: primary name|# +Examples: primary DAV; primary 21 diff --git a/lasker-2.2.3/data/usage/promote b/lasker-2.2.3/data/usage/promote new file mode 100755 index 0000000..4761a32 --- /dev/null +++ b/lasker-2.2.3/data/usage/promote @@ -0,0 +1,4 @@ +Command: promote +Purpose: set the piece a pawn will be promoted to at the back rank +Usage: promote {q,r,b,[kn], ki} +Examples: promote q; promote b diff --git a/lasker-2.2.3/data/usage/pstat b/lasker-2.2.3/data/usage/pstat new file mode 100644 index 0000000..81fdfa8 --- /dev/null +++ b/lasker-2.2.3/data/usage/pstat @@ -0,0 +1,4 @@ +Command: pstat +Purpose: show game stats between two players +Usage: pstat ; pstat +Examples: pstat knighttour; pstat freddy knighttour diff --git a/lasker-2.2.3/data/usage/ptell b/lasker-2.2.3/data/usage/ptell new file mode 100755 index 0000000..1d84847 --- /dev/null +++ b/lasker-2.2.3/data/usage/ptell @@ -0,0 +1,4 @@ +Command: ptell +Purpose: send a message to your bughouse partner +Usage: ptell string +Examples: ptell Can you get me a pawn? diff --git a/lasker-2.2.3/data/usage/ptime b/lasker-2.2.3/data/usage/ptime new file mode 100755 index 0000000..3832d6c --- /dev/null +++ b/lasker-2.2.3/data/usage/ptime @@ -0,0 +1,4 @@ +Command: ptime +Purpose: display the clock times in your bughouse partner's game +Usage: ptime +Examples: ptime diff --git a/lasker-2.2.3/data/usage/qtell b/lasker-2.2.3/data/usage/qtell new file mode 100644 index 0000000..40d1e42 --- /dev/null +++ b/lasker-2.2.3/data/usage/qtell @@ -0,0 +1,2 @@ +Command: qtell +Purpose: used by TD programs only diff --git a/lasker-2.2.3/data/usage/quit b/lasker-2.2.3/data/usage/quit new file mode 100755 index 0000000..6d83d32 --- /dev/null +++ b/lasker-2.2.3/data/usage/quit @@ -0,0 +1,4 @@ +Command: quit +Purpose: exit the server (when you are not playing a match) +Usage: quit +Examples: quit diff --git a/lasker-2.2.3/data/usage/quota b/lasker-2.2.3/data/usage/quota new file mode 100755 index 0000000..0e375c3 --- /dev/null +++ b/lasker-2.2.3/data/usage/quota @@ -0,0 +1,4 @@ + Command: quota + Purpose: sets number of seconds in the shout quota + Usage: quota n + Examples: quota 30 diff --git a/lasker-2.2.3/data/usage/raisedead b/lasker-2.2.3/data/usage/raisedead new file mode 100755 index 0000000..9c81c92 --- /dev/null +++ b/lasker-2.2.3/data/usage/raisedead @@ -0,0 +1,4 @@ + Command: raisedead + Purpose: restores an account that had been removed using "remplayer" + Usage: raisedead oldname [newname] + Examples: raisedead Anibus; raisedead Xman Xwoman diff --git a/lasker-2.2.3/data/usage/rank b/lasker-2.2.3/data/usage/rank new file mode 100755 index 0000000..6084fed --- /dev/null +++ b/lasker-2.2.3/data/usage/rank @@ -0,0 +1,5 @@ +Command: rank +Purpose: display rank for user, rating or range of users by rank +Usage: rank [user [b][s][l][w][B][S]] -OR- rank m-n [b][s][l][w][B][S] -OR- + rank m [b][s][l][w][B][S]] [default: bsl] +Examples: rank; rank zippy; rank 50-100; rank 1800; rank sB diff --git a/lasker-2.2.3/data/usage/refresh b/lasker-2.2.3/data/usage/refresh new file mode 100755 index 0000000..0f5b30f --- /dev/null +++ b/lasker-2.2.3/data/usage/refresh @@ -0,0 +1,4 @@ +Command: refresh +Purpose: display the position and time of a game you are involved with +Usage: refresh [game|name] +Examples: refresh; refresh 45; refresh IanO diff --git a/lasker-2.2.3/data/usage/rematch b/lasker-2.2.3/data/usage/rematch new file mode 100755 index 0000000..deab79a --- /dev/null +++ b/lasker-2.2.3/data/usage/rematch @@ -0,0 +1,4 @@ +Command: rematch +Purpose: challenge your last opponent to a game of the same type +Usage: rematch [string] +Examples: rematch; rematch w5; rematch misc little_game diff --git a/lasker-2.2.3/data/usage/remplayer b/lasker-2.2.3/data/usage/remplayer new file mode 100755 index 0000000..7dc0411 --- /dev/null +++ b/lasker-2.2.3/data/usage/remplayer @@ -0,0 +1,4 @@ + Command: remplayer + Purpose: remove an account completely + Usage: remplayer name + Examples: remplayer ByeByeUser diff --git a/lasker-2.2.3/data/usage/rerank b/lasker-2.2.3/data/usage/rerank new file mode 100755 index 0000000..6a25002 --- /dev/null +++ b/lasker-2.2.3/data/usage/rerank @@ -0,0 +1,4 @@ + Command: rerank + Purpose: reset a user's rank if there has been an error + Usage: rerank user + Examples: rerank DAV diff --git a/lasker-2.2.3/data/usage/resign b/lasker-2.2.3/data/usage/resign new file mode 100755 index 0000000..622c155 --- /dev/null +++ b/lasker-2.2.3/data/usage/resign @@ -0,0 +1,4 @@ +Command: resign +Purpose: give your opponent the win in your current (or stored) game +Usage: resign [name] +Examples: resign; resign Sparky diff --git a/lasker-2.2.3/data/usage/resume b/lasker-2.2.3/data/usage/resume new file mode 100755 index 0000000..7a68ad9 --- /dev/null +++ b/lasker-2.2.3/data/usage/resume @@ -0,0 +1,4 @@ +Command: resume +Purpose: challenge all online users of your adjourned games +Usage: resume +Examples: resume diff --git a/lasker-2.2.3/data/usage/revert b/lasker-2.2.3/data/usage/revert new file mode 100755 index 0000000..c0b41b5 --- /dev/null +++ b/lasker-2.2.3/data/usage/revert @@ -0,0 +1,4 @@ +Command: revert +Purpose: return to the mainline of a chess game being examined (analyzed) +Usage: revert +Examples: revert diff --git a/lasker-2.2.3/data/usage/rmatch b/lasker-2.2.3/data/usage/rmatch new file mode 100644 index 0000000..aa18b1b --- /dev/null +++ b/lasker-2.2.3/data/usage/rmatch @@ -0,0 +1,3 @@ +Command: rmatch +Purpose: allows tournament directors to start matches +Usage: rmatch user1 user2 diff --git a/lasker-2.2.3/data/usage/say b/lasker-2.2.3/data/usage/say new file mode 100755 index 0000000..9ca89d6 --- /dev/null +++ b/lasker-2.2.3/data/usage/say @@ -0,0 +1,4 @@ +Command: say +Purpose: sends a message to your current or most recent opponent +Usage: say message +Examples: say I have terrible lag right now . diff --git a/lasker-2.2.3/data/usage/seek b/lasker-2.2.3/data/usage/seek new file mode 100755 index 0000000..6faf078 --- /dev/null +++ b/lasker-2.2.3/data/usage/seek @@ -0,0 +1,6 @@ +Command: seek +Purpose: place an ad for a chess match +Usage: seek [time inc] [rated|unrated] [white|black] [w#] [auto|manual] + [formula] [rating-range] +Examples: seek; seek 5; seek 5 0; seek r; seek w5; seek 2 12 u m; seek f; + seek 1600-1800 m f; seek 10 25 r b w5 m f 2000-9999 diff --git a/lasker-2.2.3/data/usage/set b/lasker-2.2.3/data/usage/set new file mode 100755 index 0000000..d6ff838 --- /dev/null +++ b/lasker-2.2.3/data/usage/set @@ -0,0 +1,5 @@ +Command: set +Purpose: fix a value of a variable or line in your finger notes +Usage: set variable_name [value] +Examples: set shout 0; set time 5; set inc 0; set formula !wild && rated; + set 1 G'day! I'm Mark from Perth, Australia. diff --git a/lasker-2.2.3/data/usage/shout b/lasker-2.2.3/data/usage/shout new file mode 100755 index 0000000..e0d8407 --- /dev/null +++ b/lasker-2.2.3/data/usage/shout @@ -0,0 +1,4 @@ +Command: shout +Purpose: send message to all users open to receive shouts +Usage: shout message +Examples: shout Time to go! Bye-bye!!! diff --git a/lasker-2.2.3/data/usage/showcomment b/lasker-2.2.3/data/usage/showcomment new file mode 100755 index 0000000..2bcdca5 --- /dev/null +++ b/lasker-2.2.3/data/usage/showcomment @@ -0,0 +1,4 @@ + Command: showcomment + Purpose: display the comments in a user's file + Usage: showcomment user + Examples: showcomment Rattlesnake diff --git a/lasker-2.2.3/data/usage/showlist b/lasker-2.2.3/data/usage/showlist new file mode 100755 index 0000000..7c6ccf7 --- /dev/null +++ b/lasker-2.2.3/data/usage/showlist @@ -0,0 +1,5 @@ +Command: showlist +Purpose: display users who are on special lists +Usage: showlist [list_name] +Alt: =[list_name] +Examples: showlist; =; showlist computer; =computer diff --git a/lasker-2.2.3/data/usage/shutdown b/lasker-2.2.3/data/usage/shutdown new file mode 100755 index 0000000..08c9a5a --- /dev/null +++ b/lasker-2.2.3/data/usage/shutdown @@ -0,0 +1,5 @@ + Command: shutdown + Purpose: shutdown the server (disconnect it) + Usage: shutdown [now,cancel,time] [comment] + Examples: shutdown now; shutdown cancel; shutdown 60; shutdown 600 In + order to fix bugs that were causing crashes. diff --git a/lasker-2.2.3/data/usage/simabort b/lasker-2.2.3/data/usage/simabort new file mode 100755 index 0000000..dd507a2 --- /dev/null +++ b/lasker-2.2.3/data/usage/simabort @@ -0,0 +1,4 @@ +Command: simabort +Purpose: used in simuls to request (or accept) an abort of a game +Usage: simabort +Examples: simabort diff --git a/lasker-2.2.3/data/usage/simadjourn b/lasker-2.2.3/data/usage/simadjourn new file mode 100755 index 0000000..58d9c80 --- /dev/null +++ b/lasker-2.2.3/data/usage/simadjourn @@ -0,0 +1,4 @@ +Command: simadjourn +Purpose: used in simuls to request (or accept) an adjournment of a game +Usage: simadjourn +Examples: simadjourn diff --git a/lasker-2.2.3/data/usage/simallabort b/lasker-2.2.3/data/usage/simallabort new file mode 100755 index 0000000..5961722 --- /dev/null +++ b/lasker-2.2.3/data/usage/simallabort @@ -0,0 +1,4 @@ +Command: simallabort +Purpose: used in simuls to abort all games in progress +Usage: simallabort +Examples: simallabort diff --git a/lasker-2.2.3/data/usage/simalladjourn b/lasker-2.2.3/data/usage/simalladjourn new file mode 100755 index 0000000..ce9fccc --- /dev/null +++ b/lasker-2.2.3/data/usage/simalladjourn @@ -0,0 +1,4 @@ +Command: simalladjourn +Purpose: used in simuls to adjourn all games in progress +Usage: simalladjourn +Examples: simalladjourn diff --git a/lasker-2.2.3/data/usage/simgames b/lasker-2.2.3/data/usage/simgames new file mode 100755 index 0000000..526a716 --- /dev/null +++ b/lasker-2.2.3/data/usage/simgames @@ -0,0 +1,4 @@ +Command: simgames +Purpose: display the number of simul games you or another user are in +Usage: simgames [player] +Examples: simgames; simgames river diff --git a/lasker-2.2.3/data/usage/simmatch b/lasker-2.2.3/data/usage/simmatch new file mode 100755 index 0000000..28194b0 --- /dev/null +++ b/lasker-2.2.3/data/usage/simmatch @@ -0,0 +1,4 @@ +Command: simmatch +Purpose: used to request a game in a simul event +Usage: simmatch player +Examples: simmatch connex diff --git a/lasker-2.2.3/data/usage/simnext b/lasker-2.2.3/data/usage/simnext new file mode 100755 index 0000000..6c19c22 --- /dev/null +++ b/lasker-2.2.3/data/usage/simnext @@ -0,0 +1,4 @@ +Command: simnext +Purpose: used in simuls to move to the next board in the simul +Usage: simnext +Examples: simnext diff --git a/lasker-2.2.3/data/usage/simopen b/lasker-2.2.3/data/usage/simopen new file mode 100755 index 0000000..31f0e06 --- /dev/null +++ b/lasker-2.2.3/data/usage/simopen @@ -0,0 +1,4 @@ +Command: simopen +Purpose: sets yourself open to receive simul challenges +Usage: simopen +Examples: simopen diff --git a/lasker-2.2.3/data/usage/simpass b/lasker-2.2.3/data/usage/simpass new file mode 100755 index 0000000..7cdbbee --- /dev/null +++ b/lasker-2.2.3/data/usage/simpass @@ -0,0 +1,4 @@ +Command: simpass +Purpose: used in simuls to pass when the simul player reaches your board +Usage: simpass +Examples: simpass diff --git a/lasker-2.2.3/data/usage/simprev b/lasker-2.2.3/data/usage/simprev new file mode 100755 index 0000000..dbffadb --- /dev/null +++ b/lasker-2.2.3/data/usage/simprev @@ -0,0 +1,4 @@ +Command: simprev +Purpose: used in simuls to move to the previous board +Usage: simprev +Examples: simprev diff --git a/lasker-2.2.3/data/usage/smoves b/lasker-2.2.3/data/usage/smoves new file mode 100755 index 0000000..5853060 --- /dev/null +++ b/lasker-2.2.3/data/usage/smoves @@ -0,0 +1,5 @@ +Command: smoves +Purpose: display the moves of a stored, history or journal game +Usage: smoves UserA [#, UserB, journal_slot] +Examples: smoves TheDane; smoves TheDane 87; smoves TheDane bozky; + smoves TheDane J diff --git a/lasker-2.2.3/data/usage/smposition b/lasker-2.2.3/data/usage/smposition new file mode 100755 index 0000000..c24e311 --- /dev/null +++ b/lasker-2.2.3/data/usage/smposition @@ -0,0 +1,6 @@ +Command: smposition +Purpose: display both position and moves for a stored, history or journal + game +Usage: smposition user_a [user_b|history#|journal_slot] +Examples: smposition Len; smposition Len Loon; smposition Len 86; + smposition Len B diff --git a/lasker-2.2.3/data/usage/sought b/lasker-2.2.3/data/usage/sought new file mode 100755 index 0000000..e3af5a0 --- /dev/null +++ b/lasker-2.2.3/data/usage/sought @@ -0,0 +1,4 @@ +Command: sought +Purpose: display ads that users have made +Usage: sought [all] +Examples: sought; sought all diff --git a/lasker-2.2.3/data/usage/sposition b/lasker-2.2.3/data/usage/sposition new file mode 100755 index 0000000..dc70a35 --- /dev/null +++ b/lasker-2.2.3/data/usage/sposition @@ -0,0 +1,5 @@ +Command: sposition +Purpose: display position for a stored, history or journal game +Usage: sposition user_a [user_b|history#|journal_slot] +Examples: sposition Len; sposition Len Loon; sposition Len 86; + sposition Len B diff --git a/lasker-2.2.3/data/usage/statistics b/lasker-2.2.3/data/usage/statistics new file mode 100755 index 0000000..836f0b2 --- /dev/null +++ b/lasker-2.2.3/data/usage/statistics @@ -0,0 +1,4 @@ +Command: statistics +Purpose: display summary information about ratings of server players +Usage: statistics +Examples: statistics diff --git a/lasker-2.2.3/data/usage/stored b/lasker-2.2.3/data/usage/stored new file mode 100755 index 0000000..82a29a8 --- /dev/null +++ b/lasker-2.2.3/data/usage/stored @@ -0,0 +1,4 @@ +Command: stored +Purpose: list your or another user's stored (adjourned) games +Usage: stored [user] +Examples: stored; stored Marsalis diff --git a/lasker-2.2.3/data/usage/style b/lasker-2.2.3/data/usage/style new file mode 100755 index 0000000..3513631 --- /dev/null +++ b/lasker-2.2.3/data/usage/style @@ -0,0 +1,4 @@ +Command: style +Purpose: set the style variable for the board display +Usage: style n +Examples: style 12 diff --git a/lasker-2.2.3/data/usage/sublist b/lasker-2.2.3/data/usage/sublist new file mode 100755 index 0000000..5f4c467 --- /dev/null +++ b/lasker-2.2.3/data/usage/sublist @@ -0,0 +1,5 @@ +Command: sublist +Purpose: removes information from the given list +Usage: sublist list information +Alt: -list information +Examples: sublist notify Friar; -notify Friar diff --git a/lasker-2.2.3/data/usage/summon b/lasker-2.2.3/data/usage/summon new file mode 100755 index 0000000..723f580 --- /dev/null +++ b/lasker-2.2.3/data/usage/summon @@ -0,0 +1,4 @@ + Command: summon + Purpose: give special notice that you want a user to contact you NOW! + Usage: summon player + Examples: summon Ramius diff --git a/lasker-2.2.3/data/usage/switch b/lasker-2.2.3/data/usage/switch new file mode 100755 index 0000000..62e8253 --- /dev/null +++ b/lasker-2.2.3/data/usage/switch @@ -0,0 +1,4 @@ +Command: switch +Purpose: requests (or accepts) switching sides with your opponent +Usage: switch +Examples: switch diff --git a/lasker-2.2.3/data/usage/takeback b/lasker-2.2.3/data/usage/takeback new file mode 100755 index 0000000..fc59288 --- /dev/null +++ b/lasker-2.2.3/data/usage/takeback @@ -0,0 +1,4 @@ +Command: takeback +Purpose: requests (or accepts) taking back one or more moves in a game +Usage: takeback [n] [default: 1] +Examples: takeback; takeback 2 diff --git a/lasker-2.2.3/data/usage/tell b/lasker-2.2.3/data/usage/tell new file mode 100755 index 0000000..73bc68e --- /dev/null +++ b/lasker-2.2.3/data/usage/tell @@ -0,0 +1,4 @@ +Command: tell +Purpose: send a message to an individual user or to a channel +Usage: tell user|channel_number message +Examples: tell Loon Why is the sky blue? tell 24 Anyone for bughouse? diff --git a/lasker-2.2.3/data/usage/time b/lasker-2.2.3/data/usage/time new file mode 100755 index 0000000..a955816 --- /dev/null +++ b/lasker-2.2.3/data/usage/time @@ -0,0 +1,4 @@ +Command: time +Purpose: displays the current clock time for a game in progress +Usage: time [game, user] +Examples: time; time 45; time Hawk diff --git a/lasker-2.2.3/data/usage/toggle b/lasker-2.2.3/data/usage/toggle new file mode 100644 index 0000000..a384f83 --- /dev/null +++ b/lasker-2.2.3/data/usage/toggle @@ -0,0 +1,4 @@ +Command: toggle +Purpose: add/removes information on a list +Usage: toggle list information +Examples: toggle follow Tridge diff --git a/lasker-2.2.3/data/usage/tomove b/lasker-2.2.3/data/usage/tomove new file mode 100755 index 0000000..e1c60e3 --- /dev/null +++ b/lasker-2.2.3/data/usage/tomove @@ -0,0 +1,4 @@ +Command: tomove +Purpose: used in setup mode in order to designate which side will move next +Usage: tomove white|black +Examples: tomove white; tomove black diff --git a/lasker-2.2.3/data/usage/tournset b/lasker-2.2.3/data/usage/tournset new file mode 100644 index 0000000..30fd716 --- /dev/null +++ b/lasker-2.2.3/data/usage/tournset @@ -0,0 +1,2 @@ +Command: tournset +Purpose: used by TD programs only diff --git a/lasker-2.2.3/data/usage/unalias b/lasker-2.2.3/data/usage/unalias new file mode 100755 index 0000000..0d7753e --- /dev/null +++ b/lasker-2.2.3/data/usage/unalias @@ -0,0 +1,4 @@ +Command: unalias +Purpose: removes a personal alias you had created previously +Usage: unalias word +Examples: unalias chal; unalias t1 diff --git a/lasker-2.2.3/data/usage/unexamine b/lasker-2.2.3/data/usage/unexamine new file mode 100755 index 0000000..f7914fe --- /dev/null +++ b/lasker-2.2.3/data/usage/unexamine @@ -0,0 +1,4 @@ +Command: unexamine +Purpose: stop your examination of a game +Usage: unexamine +Examples: unexamine diff --git a/lasker-2.2.3/data/usage/unobserve b/lasker-2.2.3/data/usage/unobserve new file mode 100755 index 0000000..40b3cba --- /dev/null +++ b/lasker-2.2.3/data/usage/unobserve @@ -0,0 +1,4 @@ +Command: unobserve +Purpose: remove a game (or all games) from your observation list +Usage: unobserve [game,user] +Examples: unobserve 25; unobserve GMKasparov; unobserve (removes all games) diff --git a/lasker-2.2.3/data/usage/unpause b/lasker-2.2.3/data/usage/unpause new file mode 100755 index 0000000..86b2fc4 --- /dev/null +++ b/lasker-2.2.3/data/usage/unpause @@ -0,0 +1,4 @@ +Command: unpause +Purpose: requests that the clocks for a paused game be restarted +Usage: unpause +Examples: unpause diff --git a/lasker-2.2.3/data/usage/unseek b/lasker-2.2.3/data/usage/unseek new file mode 100755 index 0000000..664aee8 --- /dev/null +++ b/lasker-2.2.3/data/usage/unseek @@ -0,0 +1,4 @@ +Command: unseek +Purpose: cancel one or all ads you have placed for chess matches +Usage: unseek [index_#] +Examples: unseek; unseek 7 diff --git a/lasker-2.2.3/data/usage/uptime b/lasker-2.2.3/data/usage/uptime new file mode 100755 index 0000000..82d6ac8 --- /dev/null +++ b/lasker-2.2.3/data/usage/uptime @@ -0,0 +1,4 @@ +Command: uptime +Purpose: displays some server statistics, such as time in operation +Usage: uptime +Examples: uptime diff --git a/lasker-2.2.3/data/usage/ustat b/lasker-2.2.3/data/usage/ustat new file mode 100755 index 0000000..959fcff --- /dev/null +++ b/lasker-2.2.3/data/usage/ustat @@ -0,0 +1,4 @@ +Command: ustat +Purpose: display server statistics for last 24 hour period +Usage: ustat +Examples: ustat diff --git a/lasker-2.2.3/data/usage/variables b/lasker-2.2.3/data/usage/variables new file mode 100755 index 0000000..7e23e40 --- /dev/null +++ b/lasker-2.2.3/data/usage/variables @@ -0,0 +1,4 @@ +Command: variables +Purpose: display the variable settings for yourself or another user +Usage: variables [user] +Examples: variables; variables McKeork diff --git a/lasker-2.2.3/data/usage/whenshut b/lasker-2.2.3/data/usage/whenshut new file mode 100755 index 0000000..4962295 --- /dev/null +++ b/lasker-2.2.3/data/usage/whenshut @@ -0,0 +1,5 @@ +Command: whenshut +Purpose: display whether a shutdown is in progress and, if so, when it will + occur +Usage: whenshut +Examples: whenshut diff --git a/lasker-2.2.3/data/usage/whisper b/lasker-2.2.3/data/usage/whisper new file mode 100755 index 0000000..aa3eaa4 --- /dev/null +++ b/lasker-2.2.3/data/usage/whisper @@ -0,0 +1,4 @@ +Command: whisper +Purpose: send a message to observers of a game but NOT to the players +Usage: whisper message +Examples: whisper But why can't White just take the pawn?! diff --git a/lasker-2.2.3/data/usage/who b/lasker-2.2.3/data/usage/who new file mode 100755 index 0000000..56dc523 --- /dev/null +++ b/lasker-2.2.3/data/usage/who @@ -0,0 +1,4 @@ +Command: who +Purpose: lists all or a subset of current users on the server +Usage: who [o][r][f][a][R][U][s][b][w][L][S][A][l][t][v][n][#i#j][B] +Examples: who; who 19; who s; who a; who B; who as; who asA; who a15 diff --git a/lasker-2.2.3/data/usage/withdraw b/lasker-2.2.3/data/usage/withdraw new file mode 100755 index 0000000..ba85ed4 --- /dev/null +++ b/lasker-2.2.3/data/usage/withdraw @@ -0,0 +1,5 @@ +Command: withdraw +Purpose: remove an offer you had previously made to another user +Usage: withdraw [1-n, t all, abort, adjourn, draw, match, pause, player, + simul, switch, takeback] +Examples: withdraw 3; withdraw pause; withdraw Shaughn diff --git a/lasker-2.2.3/data/usage/wname b/lasker-2.2.3/data/usage/wname new file mode 100755 index 0000000..4eeec08 --- /dev/null +++ b/lasker-2.2.3/data/usage/wname @@ -0,0 +1,4 @@ +Command: wname +Purpose: change name of White player in an examined or setup game +Usage: wname [string] +Examples: wname; wname Kotov diff --git a/lasker-2.2.3/data/usage/xkibitz b/lasker-2.2.3/data/usage/xkibitz new file mode 100755 index 0000000..ff93331 --- /dev/null +++ b/lasker-2.2.3/data/usage/xkibitz @@ -0,0 +1,4 @@ +Command: xkibitz +Purpose: send a message to a game, regardless of 'primary' setting +Usage: xkibitz name|# message +Examples: xkibitz sms Nb4 works; xkibitz 34 Dead draw now. diff --git a/lasker-2.2.3/data/usage/xtell b/lasker-2.2.3/data/usage/xtell new file mode 100755 index 0000000..4ca4c6d --- /dev/null +++ b/lasker-2.2.3/data/usage/xtell @@ -0,0 +1,5 @@ +Command: xtell +Purpose: send a message to a user or to a channel, but not affect current + "tell" setting +Usage: xtell user|# message +Examples: xtell sms Thanks for your help!; xtell 24 Partner up! diff --git a/lasker-2.2.3/data/usage/xwhisper b/lasker-2.2.3/data/usage/xwhisper new file mode 100755 index 0000000..693039a --- /dev/null +++ b/lasker-2.2.3/data/usage/xwhisper @@ -0,0 +1,5 @@ +Command: xwhisper +Purpose: send a message to observers of a game, regardless of 'primary' + setting +Usage: xwhisper name|# message +Examples: xwhisper sms Nb4 works; xkibitz 34 Dead draw now. diff --git a/lasker-2.2.3/data/usage/znotify b/lasker-2.2.3/data/usage/znotify new file mode 100755 index 0000000..006baec --- /dev/null +++ b/lasker-2.2.3/data/usage/znotify @@ -0,0 +1,5 @@ +Command: znotify +Purpose: display current users on your notify list, and users for whom you + are on their notify lists, with idle times (unless supressed) +Usage: znotify [n] +Examples: znotify; znotify n diff --git a/lasker-2.2.3/doc/CREDITS b/lasker-2.2.3/doc/CREDITS new file mode 100644 index 0000000..66ce2d7 --- /dev/null +++ b/lasker-2.2.3/doc/CREDITS @@ -0,0 +1,79 @@ +This is the credits file from Dan's original lasker release. + +For more credits please see http://chess.samba.org/ and the CVS logs + + Andrew Tridgell + chess@tridgell.net + + +--------------------- +A brief credits file. The first part are people I'd like to thank, +and the second part are messages that have to be placed here +for legal reasons. + +I would like to thank Michael Moore for starting the +chess server many moons ago. I don't know where he +is today, but his legacy is all of these chess servers +(chessd, FICS, ICC, chess.net) + +Thanks to Richard Nash. Mr. Nash wrote +most of my original code, and without him who knows +where the state of Internet Chess would be. + +I'd also like to thank the people who contributed to the ICS +code that Nash authored. This includes all developers from the +years that Nash's code has been around. + +I'll specifically thank the FICS contributors. Without FICS, +this project wouldn't exist today. Much thanks to David Flynn (DAV). +He still doesn't support chessd, but perhaps one day he will. + +Poul-Henning Kamp and Mark Murray. Their code developed for FreeBSD +was used in the password handling routines in chessd. I owe you a beer, phk. + +And of the chessd project: + +Chaz Randles - Emotional support, countless design discussions, consulting. + +Hristo Doichev - Letting me know that I was doing the right thing with going + forward with chessd. Various programming work. + +Gian-Carlo Pascutto - Being with me the entire way, both mentally and + with help with testing and programming. + +Vance Ray - Letting me know how I could use a real database server for + managing the players, games, etc. This is unimplemented, + but I'm looking into writing it myself (or, preferred) having + someone implement this. + +Brent D. Rockwood - Contributing the chessd logo. He also may takeover as + the webmaster in the future :) (Wink, wink, nudge, nudge) + + +Thanks to everyone who help made chessd possible! +-Dan Papasian +bugg@bugg.strangled.net + + +And, for legal reasons: + +Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All +rights reserved. + +License to copy and use this software is granted provided that it +is identified as the "RSA Data Security, Inc. MD5 Message-Digest +Algorithm" in all material mentioning or referencing this software +or this function. + +License is also granted to make and use derivative works provided +that such works are identified as "derived from the RSA Data +Security, Inc. MD5 Message-Digest Algorithm" in all material +mentioning or referencing the derived work. + +RSA Data Security, Inc. makes no representations concerning either +the merchantability of this software or the suitability of this +software for any particular purpose. It is provided "as is" +without express or implied warranty of any kind. + +These notices must be retained in any copies of any part of this +documentation and/or software. diff --git a/lasker-2.2.3/doc/CVS/Entries b/lasker-2.2.3/doc/CVS/Entries new file mode 100644 index 0000000..1dd38e4 --- /dev/null +++ b/lasker-2.2.3/doc/CVS/Entries @@ -0,0 +1,5 @@ +/README_Nash/1.1/Thu Jun 6 08:56:53 2002// +/CREDITS/1.3/Fri Jun 21 14:46:28 2002// +/Changelog/1.2/Fri Jun 21 14:46:28 2002// +/README_LEGAL/1.2/Fri Jun 21 14:46:29 2002// +D diff --git a/lasker-2.2.3/doc/CVS/Repository b/lasker-2.2.3/doc/CVS/Repository new file mode 100644 index 0000000..8837ba0 --- /dev/null +++ b/lasker-2.2.3/doc/CVS/Repository @@ -0,0 +1 @@ +lasker/doc diff --git a/lasker-2.2.3/doc/CVS/Root b/lasker-2.2.3/doc/CVS/Root new file mode 100644 index 0000000..c42ba94 --- /dev/null +++ b/lasker-2.2.3/doc/CVS/Root @@ -0,0 +1 @@ +/home/cvs diff --git a/lasker-2.2.3/doc/Changelog b/lasker-2.2.3/doc/Changelog new file mode 100644 index 0000000..20f571e --- /dev/null +++ b/lasker-2.2.3/doc/Changelog @@ -0,0 +1,196 @@ +This file contains change various change log information from earlier +versions of this project. The current change information is held in +CVS and can be accessed at http://chess.samba.org/ + + + +------------ + + +New to 0.2: + +-Seek/sought/play support. Play around with these, +they aren't documented yet (nor is the interface fully defined) + +-Improved build process/install target + +-Various other fixes and improvements too minor + to be listed here. + + +------------ + +Versions up to 1.2.16 and between 1.2.23 and 1.3.2 are approximate. +Information on changes may not be exact or complete. + +1.6.4 Bughouse ratings, more feedback messages, new assess display, + fixed a problem with increasing game numbers. + +1.6.2 News bug fixed (Marsalis), caused crash and corrupted index file. + ECO brought back (Sparky), bug fixed for use with scratch games + (uninitialized moveList caused crash). Examine can now + be used to load board positions (Sparky). Works with + scratch games also. + +1.6.1 News rewritten (Marsalis), Much faster code. Some crash + protection code (writing player files after every 'set' + command for example) has been supressed for speed. + Bug in new playerfile code fixed (sanity checks added to + avoid crashes). + +1.6 Playerfile formats completely recoded (DAV) new and old + formats recognized. New format is written always. The + new format has expanded functionallity, more compact form, + and much faster processing. + +1.5.2 Ghosts hopefully killed; no more timeseal sitting; + Oldmoves implementation changes; game structure shrunk. + fics_hostname now takes it's contents from SERVER_NAME, + which should nwo be a DNS resolvable hostname. + fics_addplayer new account message modernized to include + brief instructions on how to connect to the server and + and warn about the use of anauthorzied duplicate accounts. + both adminproc.c and fics_addplayer modified. + +1.5.1 Fixes in journal commands, some bughouse bugs. + +1.5.0 Journals allowed. Some fixes for NULL v. NULL games. + +1.4.0 Initial bughouse version. + +1.3.3 clearing and showing individual messages. + +1.3.2 fixes to open file bugs; + clearing and showing messages from a particular player. + +1.3.1 kibitz level; tell/whisper bugs and similar fixed; + noplay and gnotify lists. + +1.3.0 new admin structure for coordination, responding to suggestions, etc; + got rid of annoyingly large version numbers :-). + +1.2.23-1.2.24 ??? + +1.2.22 Examining of history games supported. + +1.2.21 Language variable; can't refresh private games; + Got rid of "You are not observing" message when you are observing. + New news interface; cnewsi, cnewsf, and news show on startup. + Percent of life stats. + +1.2.20 New help interface; index command. + +1.2.19 Examine mode (without history game support) + ECO and NIC codes now supported for history games and for + interactive reporting on games in process. + PGN format now supported for email of game scores. + Direct sendmail support provided with the SENDMAILPROG + definition in config.h, which overrides any MAILPROGRAM + definition. Provides for more reliable and efficient operation + under heavy load. + +1.2.18 variable mailmess: mails messages to you. + messages give the user feedback on what was sent. + simul commands simallabort, simadjourn, simalladjourn + (aliases saa sadj saadj) + simabort given alias sa + cshout and it prompts fixed + it gives better feedback + can restart simuls (or untimed games in simul form) with simmatch + game format reduced in size +1.2.17 asetpasswd now sends mail to the player telling him the new + password. + extra info in up for admins + annunreg seen by all admins + hostinfo and lock removed as was fics_delplayer, fics_mailproc + and mail_proc. + see messages from one person, clear messages from a person + More simul bug fixes. + simprev (alias sp), goboard (alias go, goto), gonum commands. + allow admin to reset RD; ratings may be set with 0 games played. +1.2.16 Many simul bugs fixed, one fatal bug corrected which caused + a crash during a simul. + unobserve command. + MAILPROGRAM replaced by "sendmail -t" and appropriate "To:" + and subject headers. This should help with blank mail + message problem. mailhelp and mailsource still depend on MAILPROGRAM + stuff added for SUN5 compilation + best info shown in who +1.2.15 Simul bug fixed - losing connection led to a crash + adjudicate written (forcedraw, forcewin, forceres commands removed) + hostinfo removed from addplayer +1.2.14 Simul code made operational. + games list ordered. + tally code disabled +1.2.13 forcedraw, forcewin, forceres commands + asetv command replaces pose +1.2.12 bug fixes. + pose weakened. +1.2.11 First stable version of FICS. unnotify and unalias had big problems + that led to crashes and corrupt player files. + siteinfo removed - caused infinite lag + mailmess +1.2.10 bug fixes, max length enforced in alias to stop a crash. +1.2.9 autoboot out code added. +1.2.8 aliases fixed, @ added, can alias system commands + flagging without material claims a draw, not a win. +1.2.7 filter list operational. + multicol.c used to drop 2048 bytes +1.2.6 rank and best, makerank + time for next shout shown. + bug fix to timelog + login/logouts logged + addcomment and showcomment +1.2.5 Summon written. + ban list + (TD) in who + board styles fixed + shout quotas, it and shout modified + admin command to toggle (*) + fixes to up + admins can observe anything +1.2.4 td list + qtell, getpi, commands for TD + asetblitz, asetstd + news,anews + wild chess made rated, best shows wild, new file + asetwild + next + SGI compilation possible. +1.2.3 lists + (FM) (GM) (IM) (C) shown in who + raisedead given a second argument to rename a player + ahelp, info written + help files split into help and info + shutdown fixed +1.2.2 internal version +1.2.1 bug fixes. + admin gods can only use pose. + siteinfo shown +1.2 notifiedby flag + remplayer, asethandle, raisedead written + nuke improved + query disabled +1.1 who bug fixed - caused a crash if more than 10 players on. + ++++ shown in who for unreg players + early version of nuke. + (*) shown if level 10 admin + level 60 given title Assistant superuser. + who A, who l, who U, who R + Look of announce and other stuff improved. +1.0 Original Nash code. +----------------------------------------------------------------------------- +Here is a more stable, hopefully more portable release of the +FICS source code with many features added. + +People who have helped improve this from previous releases +(March 1st 1995 onward) include (FICS names): +DAV, foxbat, grimm, Hawk, hersco, loon, mann, Shane, Sparky, vek +SORRY if you feel you should have been on this list but were forgotten. + +And Most thanks to red (Richard Nash) for the original code! + And Micheal Moore for the original idea of an ICS. + +-- Uploaded by Shane Hudson (Shane on FICS). +Thanks to everyone for their support of FICS. + diff --git a/lasker-2.2.3/doc/README_LEGAL b/lasker-2.2.3/doc/README_LEGAL new file mode 100644 index 0000000..0bed510 --- /dev/null +++ b/lasker-2.2.3/doc/README_LEGAL @@ -0,0 +1,64 @@ +This file contains various license headers that have been used in +FICS. The code is now under the GNU General Public License (which is +what the original code was first released under) but at various times +parts of the code have been released under different licenses. I list +them here for completeness. + + +-------------------------------------------------------------------------- +fics - An internet chess server. + + Copyright (C) 1993 Richard V. Nash + + 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 + 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., 675 Mass Ave, Cambridge, MA 02139, USA. + + +You may also contact the author(s) at + Richard Nash: email - nash@visus.com + phone - (412)-488-3600 + +-------------------------------------------------------------------------- + + +/** + * Copyright (c) 1993 Richard V. Nash. + * Copyright (c) 2000 Dan Papasian. All rights reserved. + * + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +-------------------------------------------------------------------------- diff --git a/lasker-2.2.3/doc/README_Nash b/lasker-2.2.3/doc/README_Nash new file mode 100644 index 0000000..9f6fa1b --- /dev/null +++ b/lasker-2.2.3/doc/README_Nash @@ -0,0 +1,37 @@ +From nash@nomos.com Tue May 30 07:56:37 1995 +Content-Type: text/plain +Mime-Version: 1.0 (NeXT Mail 3.3 v118.2) +From: "Richard V. Nash" +Date: Tue, 30 May 95 08:52:10 -0400 +To: danke%daimi.aau.dk.kris%dgate.org.chess%onenet.net.romeo@dcs.warwick.ac.uk +Subject: Please remove nash@nomos.com and visus.com from help files +Content-Length: 1130 +Status: RO +X-Lines: 25 + +Hello Chess Server Administrators, + + I, nash@nomos.com, am getting dozens of emails everyday inquiring about +chess servers. I would like to stop this. Could you please remove any +reference to nash@nomos.com or nash@visus.com from the help files associated +with FICS. This is in both your running systems and versions of the code that +is being passed around or placed in ftp'able directories. + + There are also references to ftp.visus.com in help files. These should also +be removed. + + Could you also pass this message along to anybody that you know who may +have a copy of FICS but who I've missed on my search for FICS's. + + That said, thanks to all of you for taking the FICS code and making it a +success! I'm so happy that my work to keep chess servers available and free +did not fail. + +Rich +-----------------------+---------------------------+ +| Richard V. Nash | NOMOS Corporation | +| nash@nomos.com | Suite 400 | +| Tel. (412)-934-5477 | 2591 Wexford-Bayne Road | +| Fax. (412)-934-5488 | Sewickley, PA 15143 | ++----------------------+---------------------------+ + diff --git a/lasker-2.2.3/games/CVS/Entries b/lasker-2.2.3/games/CVS/Entries new file mode 100644 index 0000000..e2b69c0 --- /dev/null +++ b/lasker-2.2.3/games/CVS/Entries @@ -0,0 +1 @@ +D/history//// diff --git a/lasker-2.2.3/games/CVS/Repository b/lasker-2.2.3/games/CVS/Repository new file mode 100644 index 0000000..65edeb5 --- /dev/null +++ b/lasker-2.2.3/games/CVS/Repository @@ -0,0 +1 @@ +lasker/games diff --git a/lasker-2.2.3/games/CVS/Root b/lasker-2.2.3/games/CVS/Root new file mode 100644 index 0000000..c42ba94 --- /dev/null +++ b/lasker-2.2.3/games/CVS/Root @@ -0,0 +1 @@ +/home/cvs diff --git a/lasker-2.2.3/games/history/CVS/Entries b/lasker-2.2.3/games/history/CVS/Entries new file mode 100644 index 0000000..1784810 --- /dev/null +++ b/lasker-2.2.3/games/history/CVS/Entries @@ -0,0 +1 @@ +D diff --git a/lasker-2.2.3/games/history/CVS/Repository b/lasker-2.2.3/games/history/CVS/Repository new file mode 100644 index 0000000..2e8dac9 --- /dev/null +++ b/lasker-2.2.3/games/history/CVS/Repository @@ -0,0 +1 @@ +lasker/games/history diff --git a/lasker-2.2.3/games/history/CVS/Root b/lasker-2.2.3/games/history/CVS/Root new file mode 100644 index 0000000..c42ba94 --- /dev/null +++ b/lasker-2.2.3/games/history/CVS/Root @@ -0,0 +1 @@ +/home/cvs diff --git a/lasker-2.2.3/scripts/CVS/Entries b/lasker-2.2.3/scripts/CVS/Entries new file mode 100644 index 0000000..804a5fd --- /dev/null +++ b/lasker-2.2.3/scripts/CVS/Entries @@ -0,0 +1,3 @@ +/start_chessd/1.1/Wed Jun 12 02:45:24 2002// +/spool_sendmail/1.2/Thu Jul 22 07:04:40 2004// +D diff --git a/lasker-2.2.3/scripts/CVS/Repository b/lasker-2.2.3/scripts/CVS/Repository new file mode 100644 index 0000000..666bf8e --- /dev/null +++ b/lasker-2.2.3/scripts/CVS/Repository @@ -0,0 +1 @@ +lasker/scripts diff --git a/lasker-2.2.3/scripts/CVS/Root b/lasker-2.2.3/scripts/CVS/Root new file mode 100644 index 0000000..c42ba94 --- /dev/null +++ b/lasker-2.2.3/scripts/CVS/Root @@ -0,0 +1 @@ +/home/cvs diff --git a/lasker-2.2.3/scripts/spool_sendmail b/lasker-2.2.3/scripts/spool_sendmail new file mode 100755 index 0000000..80a3207 --- /dev/null +++ b/lasker-2.2.3/scripts/spool_sendmail @@ -0,0 +1,18 @@ +#!/bin/sh +# simple mail spool handler for chessd +# Andrew Tridgell + +shopt -s nullglob + +cd $HOME/chessd || exit 1 + +( +while :; do + for f in spool/mail.*; do + if /usr/lib/sendmail -t < $f; then + /bin/rm -f $f + fi + done + sleep 60 +done +) >> spool.log 2>&1 diff --git a/lasker-2.2.3/scripts/start_chessd b/lasker-2.2.3/scripts/start_chessd new file mode 100755 index 0000000..6911776 --- /dev/null +++ b/lasker-2.2.3/scripts/start_chessd @@ -0,0 +1,12 @@ +#!/bin/sh +# a simple shell script to keep chessd running +# Andrew Tridgell + +cd $HOME/chessd || exit 1 + +( + while :; do + $HOME/bin/chessd -p 5000 -T $HOME/bin/timeseal_decoder -R $HOME/chessd -f + sleep 10 + done +) >> chessd.log 2>&1 diff --git a/lasker-2.2.3/src/.cvsignore b/lasker-2.2.3/src/.cvsignore new file mode 100644 index 0000000..e7791bf --- /dev/null +++ b/lasker-2.2.3/src/.cvsignore @@ -0,0 +1,11 @@ +.autoheaders +Makefile +autoconfig.h +chessd +chessd_addplayer +config.cache +config.log +config.status +makerank +proto.h +vers.c diff --git a/lasker-2.2.3/src/CVS/Entries b/lasker-2.2.3/src/CVS/Entries new file mode 100644 index 0000000..d50e85c --- /dev/null +++ b/lasker-2.2.3/src/CVS/Entries @@ -0,0 +1,85 @@ +/comproc.h/1.4/Wed Jun 12 11:05:51 2002// +/crypt-md5.c/1.3/Wed Jun 12 10:11:35 2002// +/crypt-md5c.c/1.4/Wed Jun 12 11:05:51 2002// +/crypt-misc.c/1.3/Wed Jun 12 10:11:35 2002// +/crypt.c/1.3/Wed Jun 12 10:11:35 2002// +/journal.h/1.2/Wed Jun 12 10:11:35 2002// +/md5.h/1.3/Wed Jun 12 11:05:51 2002// +/mkproto.awk/1.1/Wed Jun 12 10:12:03 2002// +/vers.h/1.2/Tue Jun 11 09:18:18 2002// +D/tdb//// +/install-sh/1.1/Fri Jun 14 02:30:58 2002// +/.cvsignore/1.4/Fri Jun 21 14:46:29 2002// +/command.h/1.9/Fri Jun 21 14:46:29 2002// +/formula.h/1.5/Fri Jun 21 14:46:29 2002// +/gameproc.h/1.4/Fri Jun 21 14:46:29 2002// +/gics.h/1.6/Fri Jun 21 14:46:29 2002// +/iset.h/1.1/Fri Jun 21 07:57:19 2002// +/matchproc.h/1.4/Fri Jun 21 14:46:29 2002// +/movecheck.h/1.5/Fri Jun 21 14:46:29 2002// +/multicol.h/1.5/Fri Jun 21 14:46:29 2002// +/obsproc.h/1.4/Fri Jun 21 14:46:29 2002// +/ratings.h/1.5/Fri Jun 21 14:46:29 2002// +/utils.h/1.7/Fri Jun 21 14:46:29 2002// +/variable.h/1.5/Fri Jun 21 14:46:29 2002// +D/parsers//// +/ficsmain.h/1.8/Sat Jun 22 05:58:18 2002// +/formula.c/1.11/Sat Jun 22 05:58:18 2002// +/multicol.c/1.6/Sat Jun 22 05:58:18 2002// +/acconfig.h/1.4/Sun Jun 23 08:20:09 2002// +/autoconfig.h.in/1.3/Sun Jun 23 08:20:09 2002// +/board.h/1.9/Sun Jun 23 08:20:09 2002// +/common.h/1.17/Sun Jun 23 08:20:09 2002// +/configure/1.8/Sun Jun 23 08:20:09 2002// +/configure.in/1.10/Sun Jun 23 08:20:09 2002// +/gamedb.h/1.18/Sun Jun 23 08:20:09 2002// +/gamedb_old.c/1.2/Sun Jun 23 08:20:09 2002// +/pending.h/1.11/Sun Jun 23 08:20:09 2002// +/talkproc.h/1.6/Sun Jun 23 08:20:09 2002// +/eco.c/1.15/Sat Jun 29 00:06:15 2002// +/fics_addplayer.c/1.13/Sat Jun 29 00:06:15 2002// +/follow.c/1.2/Sat Jun 29 00:06:15 2002// +/gics.c/1.15/Sat Jun 29 00:06:15 2002// +/globals.h/1.11/Sat Jun 29 00:06:15 2002// +/includes.h/1.13/Sat Jun 29 00:06:15 2002// +/iset.c/1.4/Sat Jun 29 00:06:15 2002// +/makerank.c/1.10/Sat Jun 29 00:06:15 2002// +/malloc.h/1.4/Sat Jun 29 00:06:15 2002// +/network.h/1.16/Sat Jun 29 00:06:15 2002// +/news.h/1.1/Sun Jun 23 22:40:42 2002// +/newvers.sh/1.5/Sat Jun 29 00:06:15 2002// +/obsproc.c/1.19/Sat Jun 29 00:06:15 2002// +/pending.c/1.13/Sat Jun 29 00:06:15 2002// +/playerdb.c/1.32/Sat Jun 29 00:06:15 2002// +/playerdb_old.c/1.4/Sat Jun 29 00:06:15 2002// +/ratings.c/1.17/Sat Jun 29 00:06:15 2002// +/reload.c/1.8/Sat Jun 29 00:06:15 2002// +/seekproc.c/1.18/Sat Jun 29 00:06:15 2002// +/setup.c/1.8/Sat Jun 29 00:06:15 2002// +/shutdown.c/1.12/Sat Jun 29 00:06:15 2002// +/talkproc.c/1.15/Sat Jun 29 00:06:15 2002// +/board.c/1.15/Mon Jul 1 01:36:41 2002// +/config.h/1.14/Mon Jul 1 01:36:42 2002// +/ficsmain.c/1.17/Mon Jul 1 01:36:42 2002// +/help.c/1.8/Mon Jul 1 01:36:42 2002// +/timeseal.c/1.11/Mon Jul 1 01:36:42 2002// +/Makefile.in/1.29/Thu Jul 22 07:04:40 2004// +/adminproc.c/1.22/Thu Jul 22 07:04:40 2004// +/algcheck.c/1.13/Thu Jul 22 07:04:40 2004// +/command.c/1.52/Thu Jul 22 07:04:40 2004// +/command_list.h/1.36/Thu Jul 22 07:04:40 2004// +/comproc.c/1.35/Thu Jul 22 07:04:40 2004// +/config.c/1.13/Thu Jul 22 07:04:40 2004// +/findstatic.pl/1.2/Thu Jul 22 07:04:40 2004// +/gamedb.c/1.34/Thu Jul 22 07:04:40 2004// +/gameproc.c/1.24/Thu Jul 22 07:04:40 2004// +/lists.c/1.20/Thu Jul 22 07:04:40 2004// +/lists.h/1.10/Thu Jul 22 07:04:40 2004// +/malloc.c/1.13/Thu Jul 22 07:04:40 2004// +/matchproc.c/1.17/Thu Jul 22 07:04:40 2004// +/movecheck.c/1.14/Thu Jul 22 07:04:40 2004// +/network.c/1.20/Thu Jul 22 07:04:40 2004// +/news.c/1.9/Thu Jul 22 07:04:40 2004// +/playerdb.h/1.21/Thu Jul 22 07:04:40 2004// +/utils.c/1.36/Thu Jul 22 07:04:40 2004// +/variable.c/1.17/Thu Jul 22 07:04:40 2004// diff --git a/lasker-2.2.3/src/CVS/Repository b/lasker-2.2.3/src/CVS/Repository new file mode 100644 index 0000000..319c670 --- /dev/null +++ b/lasker-2.2.3/src/CVS/Repository @@ -0,0 +1 @@ +lasker/src diff --git a/lasker-2.2.3/src/CVS/Root b/lasker-2.2.3/src/CVS/Root new file mode 100644 index 0000000..c42ba94 --- /dev/null +++ b/lasker-2.2.3/src/CVS/Root @@ -0,0 +1 @@ +/home/cvs diff --git a/lasker-2.2.3/src/Makefile.in b/lasker-2.2.3/src/Makefile.in new file mode 100644 index 0000000..7e465f8 --- /dev/null +++ b/lasker-2.2.3/src/Makefile.in @@ -0,0 +1,149 @@ +## +## fics - An internet chess server. +## Copyright (C) 1993 Richard V. Nash +## Copyright (C) 2000 Dan Papasian. All rights reserved. +## +## This program is free software; you can redistribute it and/or modify +## it under any terms you see fit as long as this message, the +## copyright message, and the disclaimer below remain intact. +## +## +## 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. +## +## +## This is the Makefile template; see machine dependant config.h for +## more configuration options. + + +SHELL = /bin/sh +srcdir = @srcdir@ +VPATH = @srcdir@ + +CHESSD_CFLAGS = @CHESSD_CFLAGS@ +CC=@CC@ + +## +## Where to install FICS +## +PREFIX = @prefix@ +exec_prefix = @exec_prefix@ +bindir = ${exec_prefix}/bin + +PICFLAG = -fPIC +DYNEXP=-rdynamic + +## +## Binaries and Options to use +## +CFLAGS += $(PICFLAG) -Wall @CFLAGS@ -DTDB_STANDALONE ${CHESSD_CFLAGS} -I${srcdir} -I${srcdir}/tdb + +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +LIBS = @LIBS@ -lm +LNFLAGS = @LDFLAGS@ ${LIBS} +CHESSDDIR = ${PREFIX}/chessd + +TDB_SRC = tdb/tdb.c tdb/spinlock.c + +GEN_SRCS=adminproc.c algcheck.c board.c command.c talkproc.c comproc.c \ + formula.c gamedb.c gamedb_old.c gameproc.c config.c \ + lists.c malloc.c reload.c follow.c help.c news.c \ + movecheck.c multicol.c network.c playerdb.c playerdb_old.c ratings.c \ + utils.c variable.c vers.c eco.c matchproc.c \ + obsproc.c pending.c gics.c setup.c shutdown.c seekproc.c \ + parsers/parser.c parsers/genparser.c iset.c \ + crypt.c crypt-md5.c crypt-md5c.c crypt-misc.c timeseal.c $(TDB_SRC) + +SRCS=$(GEN_SRCS) fics_addplayer.c ficsmain.c makerank.c + +OBJS=$(GEN_SRCS:.c=.o) + +VERSION=./newvers.sh + +ALL= chessd chessd.so chessd_addplayer makerank + +all: ${ALL} + +.autoheaders: proto.h parsers/parse_info.h + touch .autoheaders + +chessd: .autoheaders ficsmain.o + $(CC) $(DYNEXP) $(CFLAGS) $(LNFLAGS) -o chessd ficsmain.o $(LIBS) + +chessd.so: .autoheaders $(OBJS) + $(CC) -shared -o chessd.so $(OBJS) + +chessd_addplayer: .autoheaders fics_addplayer.o $(OBJS) + $(CC) fics_addplayer.o $(CFLAGS) $(OBJS) $(LNFLAGS) -o chessd_addplayer $(LIBS) + +makerank: .autoheaders makerank.o + $(CC) makerank.o $(OBJS) -o makerank $(LIBS) + +vers.c: + ${VERSION} + +depend: + makedepend -- ${CFLAGS} ${MAKEDEPMORECFLAGS} -- ${SRCS} + +proto.h: $(GEN_SRCS) + awk -f mkproto.awk $(GEN_SRCS) > proto.h + +parsers/parse_info.h: $(shell /bin/ls *.h | sed s/proto.h//g) + parsers/genstruct.pl -o parsers/parse_info.h $(CC) -E $(CFLAGS) includes.h + +clean: + rm -f *.o $(OBJS) ${ALL} *~ vers.c proto.h parsers/parse_info.h .autoheaders + +distclean: clean + rm -rf Makefile autoconfig.h config.status config.cache config.log + +# useful dependency +command.o: command_list.h + +parsers/parser.o: parsers/parse_info.h + +# this is needed to handle compilers that insist on putting code in the current +# directory with -c +.c.o: + $(CC) -c $(CFLAGS) -o $*.o $*.c + +install: $(ALL) + install -d -m0755 ${CHESSDDIR} + install -d -m0755 ${CHESSDDIR}/bin + install -d -m0755 ${CHESSDDIR}/lib + install -m0755 chessd ${CHESSDDIR}/bin + install -m0755 chessd.so ${CHESSDDIR}/lib + install -m0755 makerank ${CHESSDDIR}/bin + install -m0755 chessd_addplayer ${CHESSDDIR}/bin + install -d -m0755 ${CHESSDDIR}/players + install -d -m0755 ${CHESSDDIR}/spool + install -d -m0755 ${CHESSDDIR}/data/admin + install -d -m0755 ${CHESSDDIR}/data/book + install -d -m0755 ${CHESSDDIR}/data/help + install -d -m0755 ${CHESSDDIR}/data/usage + install -d -m0755 ${CHESSDDIR}/data/messages + install -d -m0755 ${CHESSDDIR}/data/stats + install -d -m0755 ${CHESSDDIR}/data/boards/wild + install -d -m0755 ${CHESSDDIR}/games/history + install -d -m0755 ${CHESSDDIR}/games/journal + install -d -m0755 ${CHESSDDIR}/games/adjourned + install -d -m0755 ${CHESSDDIR}/data/stats/player_data + cp -u ${srcdir}/../data/admin/[a-z]* ${CHESSDDIR}/data/admin + cp -u ${srcdir}/../data/book/[a-z]* ${CHESSDDIR}/data/book + cp -u ${srcdir}/../data/help/[a-z]* ${CHESSDDIR}/data/help + cp -u ${srcdir}/../data/usage/[a-z]* ${CHESSDDIR}/data/usage + cp -u ${srcdir}/../data/messages/[a-z]* ${CHESSDDIR}/data/messages + perl -e 'mkdir("${CHESSDDIR}/players/$$_",0755) for ("a".."z")' + perl -e 'mkdir("${CHESSDDIR}/games/history/$$_",0755) for ("0".."99")' + perl -e 'mkdir("${CHESSDDIR}/games/journal/$$_",0755) for ("a".."z")' + perl -e 'mkdir("${CHESSDDIR}/data/stats/player_data/$$_",0755) for ("a".."z")' + perl -e 'mkdir("${CHESSDDIR}/games/adjourned/$$_",0755) for ("a".."z")' + +etags: + etags *.[ch] */*.[ch] + +findglobal: + nm $(OBJS) | grep ' C ' + nm $(OBJS) | grep ' D ' diff --git a/lasker-2.2.3/src/acconfig.h b/lasker-2.2.3/src/acconfig.h new file mode 100644 index 0000000..0783e1a --- /dev/null +++ b/lasker-2.2.3/src/acconfig.h @@ -0,0 +1,58 @@ +/* + Copyright (c) 1993 Richard V. Nash. + Copyright (c) 2000 Dan Papasian + Copyright (C) Andrew Tridgell 2002 + + 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., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +/* + * This file contains descriptive text for the C preprocessor macros + * that are missing in the original acconfig.h of the autoconf + * distribution, but used in the configure.in of the FICS distribution. + * + * It is used *only* by the autoheader program contained in the + * autoconf distribution. + * + * + * Leave the following blank line there!! Autoheader needs it. + */ + +/* Define this to be the return value of the time() function. */ +#undef time_t + +/* Undefine, if your compiler doesn't support prototypes */ +#undef HAVE_PROTOTYPES + +/* Define, if you have a statfs() function which fills a struct + statfs, declared in sys/vfs.h. (NeXTStep) */ +#undef HAVE_STATFS_FILLING_STRUCT_STATFS + +/* Define, if you have a statfs() function which fills a struct + fs_data, declared in sys/mount.h. (Ultrix) */ +#undef HAVE_STATFS_FILLING_STRUCT_FS_DATA + +/* Define, if you have crypt() and it is declared in either + crypt.h or unistd.h. */ +#undef HAVE_CRYPT_DECLARED + +/* Define this to be tv_usec, if your struct rusage has + a member ru_utime.tv_usec. + Define this to be tv_nsec, if your struct rusage has + a member ru_utime.tv_nsec. */ +#undef TV_USEC + +#undef HAVE_DLOPEN + diff --git a/lasker-2.2.3/src/adminproc.c b/lasker-2.2.3/src/adminproc.c new file mode 100644 index 0000000..71ef002 --- /dev/null +++ b/lasker-2.2.3/src/adminproc.c @@ -0,0 +1,1223 @@ +/* + Copyright (c) 1993 Richard V. Nash. + Copyright (c) 2000 Dan Papasian + Copyright (C) Andrew Tridgell 2002 + + 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., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +/** + * + * adminproc.c - All administrative commands and related functions + * + */ + +#include "includes.h" + +#define PASSLEN 4 + + +/* + check that a player has sufficient rights for an operation +*/ +int check_admin(int p, unsigned level) +{ + struct player *pp = &player_globals.parray[p]; + /* gods and head admins always get what they want */ + if (pp->adminLevel >= ADMIN_GOD || + player_ishead(p)) { + return 1; + } + return pp->adminLevel >= level; +} + +/* + check that player p1 can do an admin operation on player p2 +*/ +static int check_admin2(int p1, int p2) +{ + return check_admin(p1, player_globals.parray[p2].adminLevel+1); +} + +/* + * adjudicate + * + * Usage: adjudicate white_player black_player result + * + * Adjudicates a saved (stored) game between white_player and black_player. + * The result is one of: abort, draw, white, black. "Abort" cancels the game + * (no win, loss or draw), "white" gives white_player the win, "black" gives + * black_player the win, and "draw" gives a draw. + */ +int com_adjudicate(int p, param_list param) +{ + int wp, wconnected, bp, bconnected, g, inprogress, confused = 0; + + if (!FindPlayer(p, param[0].val.word, &wp, &wconnected)) + return COM_OK; + if (!FindPlayer(p, param[1].val.word, &bp, &bconnected)) { + if (!wconnected) + player_remove(wp); + return COM_OK; + } + + inprogress = ((player_globals.parray[wp].game >=0) &&(player_globals.parray[wp].opponent == bp)); + + if (inprogress) { + g = player_globals.parray[wp].game; + } else { + g = game_new(); + if (game_read(g, wp, bp) < 0) { + confused = 1; + pprintf(p, "There is no stored game %s vs. %s\n", player_globals.parray[wp].name, player_globals.parray[bp].name); + } else { + game_globals.garray[g].white = wp; + game_globals.garray[g].black = bp; + } + } + if (!confused) { + if (strstr("abort", param[2].val.word) != NULL) { + game_ended(g, WHITE, END_ADJABORT); + + pcommand(p, "message %s Your game \"%s vs. %s\" has been aborted.", + player_globals.parray[wp].name, player_globals.parray[wp].name, player_globals.parray[bp].name); + + pcommand(p, "message %s Your game \"%s vs. %s\" has been aborted.", + player_globals.parray[bp].name, player_globals.parray[wp].name, player_globals.parray[bp].name); + } else if (strstr("draw", param[2].val.word) != NULL) { + game_ended(g, WHITE, END_ADJDRAW); + + pcommand(p, "message %s Your game \"%s vs. %s\" has been adjudicated " + "as a draw", player_globals.parray[wp].name, player_globals.parray[wp].name, player_globals.parray[bp].name); + + pcommand(p, "message %s Your game \"%s vs. %s\" has been adjudicated " + "as a draw", player_globals.parray[bp].name, player_globals.parray[wp].name, player_globals.parray[bp].name); + } else if (strstr("white", param[2].val.word) != NULL) { + game_ended(g, WHITE, END_ADJWIN); + + pcommand(p, "message %s Your game \"%s vs. %s\" has been adjudicated " + "as a win", player_globals.parray[wp].name, player_globals.parray[wp].name, player_globals.parray[bp].name); + + pcommand(p, "message %s Your game \"%s vs. %s\" has been adjudicated " + "as a loss", player_globals.parray[bp].name, player_globals.parray[wp].name, player_globals.parray[bp].name); + } else if (strstr("black", param[2].val.word) != NULL) { + game_ended(g, BLACK, END_ADJWIN); + pcommand(p, "message %s Your game \"%s vs. %s\" has been adjudicated " + "as a loss", player_globals.parray[wp].name, player_globals.parray[wp].name, player_globals.parray[bp].name); + + pcommand(p, "message %s Your game \"%s vs. %s\" has been adjudicated " + "as a win", player_globals.parray[bp].name, player_globals.parray[wp].name, player_globals.parray[bp].name); + } else { + confused = 1; + pprintf(p, "Result must be one of: abort draw white black\n"); + } + } + if (!confused) { + pprintf(p, "Game adjudicated.\n"); + if (!inprogress) { + game_delete(wp, bp); + } else { + return (COM_OK); + } + } + game_remove(g); + if (!wconnected) + player_remove(wp); + if (!bconnected) + player_remove(bp); + return COM_OK; +} + + +/* + * remplayer + * + * Usage: remplayer name + * + * Removes an account. A copy of its files are saved under .rem.* which can + * be found in the appropriate directory (useful in case of an accident). + * + * The account's details, messages, games and logons are all saved as + * 'zombie' files. These zombie accounts are not listed in handles or + * totals. + */ +int com_remplayer(int p, param_list param) +{ + char *player = param[0].val.word; + char playerlower[MAX_LOGIN_NAME]; + int p1, lookup; + + strcpy(playerlower, player); + stolower(playerlower); + p1 = player_new(); + lookup = player_read(p1, playerlower); + if (!lookup) { + if (!check_admin2(p, p1)) { + pprintf(p, "You can't remove an admin with a level higher than or equal to yourself.\n"); + player_remove(p1); + return COM_OK; + } + } + player_remove(p1); + if (lookup) { + pprintf(p, "No player by the name %s is registered.\n", player); + return COM_OK; + } + if (player_find_bylogin(playerlower) >= 0) { + pprintf(p, "A player by that name is logged in.\n"); + return COM_OK; + } + if (!player_kill(playerlower)) { + pprintf(p, "Player %s removed.\n", player); + UpdateRank(TYPE_BLITZ, NULL, NULL, player); + UpdateRank(TYPE_STAND, NULL, NULL, player); + UpdateRank(TYPE_WILD, NULL, NULL, player); + } else { + pprintf(p, "Remplayer failed.\n"); + } + return COM_OK; +} + +/* + * raisedead + * + * Usage: raisedead oldname [newname] + * + * Restores an account that has been previously removed using "remplayer". + * The zombie files from which it came are removed. Under most + * circumstances, you restore the account to the same handle it had + * before (oldname). However, in some circumstances you may need to + * restore the account to a different handle, in which case you include + * "newname" as the new handle. After "raisedead", you may need to use the + * "asetpasswd" command to get the player started again as a registered + * user, especially if the account had been locked + * by setting the password to *. + */ +int com_raisedead(int p, param_list param) +{ + char *player = param[0].val.word; + char *newplayer = (param[1].type == TYPE_NULL ? player : param[1].val.word); + char playerlower[MAX_LOGIN_NAME], newplayerlower[MAX_LOGIN_NAME]; + char plrFile[MAX_FILENAME_SIZE]; + + int p2, lookup; + + strcpy(playerlower, player); + stolower(playerlower); + strcpy(newplayerlower, newplayer); + stolower(newplayerlower); + + /* First make sure we have a player to raise. */ + sprintf (plrFile, "%s/%c/.rem.%s", PLAYER_DIR, playerlower[0], playerlower); + if (!file_exists (plrFile)) { + pprintf(p, "No deleted player %s.\n", player); + return COM_OK; + } + + /* Now check for registered player. */ + sprintf (plrFile, "%s/%c/%s", PLAYER_DIR, newplayerlower[0], newplayerlower); + if (file_exists (plrFile)) { + pprintf(p, "A player named %s is already registered.\n", newplayerlower); + pprintf(p, "Obtain a new handle for the dead person.\n"); + pprintf(p, "Then use raisedead [oldname] [newname].\n"); + return COM_OK; + } + + /* Don't raise over a logged in user. */ + if (player_find_bylogin(newplayerlower) >= 0) { + pprintf(p, "A player named %s is logged in.\n", newplayerlower); + pprintf(p, "Can't raise until that person leaves.\n"); + return COM_OK; + } + + /* OK, ready to go. */ + if (!player_reincarn(playerlower, newplayerlower)) { + if (param[1].type == TYPE_WORD) + pprintf(p, "Player %s reincarnated to %s.\n", player, newplayer); + else + pprintf(p, "Player %s raised.\n", player); + p2 = player_new(); + if (!(lookup = player_read(p2, newplayerlower))) { + if (param[1].type == TYPE_WORD) { + free(player_globals.parray[p2].name); + player_globals.parray[p2].name = strdup(newplayer); + player_save(p2); + } + if (player_globals.parray[p2].s_stats.rating > 0) + UpdateRank(TYPE_STAND, newplayer, &player_globals.parray[p2].s_stats, newplayer); + if (player_globals.parray[p2].b_stats.rating > 0) + UpdateRank(TYPE_BLITZ, newplayer, &player_globals.parray[p2].b_stats, newplayer); + if (player_globals.parray[p2].w_stats.rating > 0) + UpdateRank(TYPE_WILD, newplayer, &player_globals.parray[p2].w_stats, newplayer); + } + player_remove(p2); + } else { + pprintf(p, "Raisedead failed.\n"); + } + return COM_OK; +#if 0 + if (param[1].type == TYPE_NULL) { + if (!player_raise(playerlower)) { + pprintf(p, "Player %s raised from dead.\n", player); + + p1 = player_new(); + if (!(lookup = player_read(p1, playerlower))) { + if (player_globals.parray[p1].s_stats.rating > 0) + UpdateRank(TYPE_STAND, player, &player_globals.parray[p1].s_stats, player); + if (player_globals.parray[p1].b_stats.rating > 0) + UpdateRank(TYPE_BLITZ, player, &player_globals.parray[p1].b_stats, player); + if (player_globals.parray[p1].w_stats.rating > 0) + UpdateRank(TYPE_WILD, player, &player_globals.parray[p1].w_stats, player); + } + player_remove(p1); + } else { + pprintf(p, "Raisedead failed.\n"); + } + return COM_OK; + } else { + if (player_find_bylogin(newplayerlower) >= 0) { + pprintf(p, "A player by the requested name is logged in.\n"); + pprintf(p, "Can't reincarnate until they leave.\n"); + return COM_OK; + } + p2 = player_new(); + lookup = player_read(p2, newplayerlower); + player_remove(p2); + if (!lookup) { + pprintf(p, "A player by the name %s is already registered.\n", player); + pprintf(p, "Obtain another new handle for the dead person.\n"); + return COM_OK; + } + if (!player_reincarn(playerlower, newplayerlower)) { + pprintf(p, "Player %s reincarnated to %s.\n", player, newplayer); + p2 = player_new(); + if (!(lookup = player_read(p2, newplayerlower))) { + free(player_globals.parray[p2].name); + player_globals.parray[p2].name = strdup(newplayer); + player_save(p2); + if (player_globals.parray[p2].s_stats.rating > 0) + UpdateRank(TYPE_STAND, newplayer, &player_globals.parray[p2].s_stats, newplayer); + if (player_globals.parray[p2].b_stats.rating > 0) + UpdateRank(TYPE_BLITZ, newplayer, &player_globals.parray[p2].b_stats, newplayer); + if (player_globals.parray[p2].w_stats.rating > 0) + UpdateRank(TYPE_WILD, newplayer, &player_globals.parray[p2].w_stats, newplayer); + } + player_remove(p2); + } else { + pprintf(p, "Raisedead failed.\n"); + } + } + return COM_OK; +#endif +} + +/* + * addplayer + * + * Usage: addplayer playername emailaddress realname + * + * Adds a local player to the server with the handle of "playername". For + * example: + * + * addplayer Hawk u940456@daimi.aau.dk Henrik Gram + */ +int com_addplayer(int p, param_list param) +{ + char text[2048]; + char *newplayer = param[0].val.word; + char *newname = param[2].val.string; + char *newemail = param[1].val.word; + char password[PASSLEN + 1]; + char newplayerlower[MAX_LOGIN_NAME]; + char salt[3]; + int p1, lookup; + int i; + + if (strlen(newplayer) >= MAX_LOGIN_NAME) { + pprintf(p, "Player name is too long\n"); + return COM_OK; + } + if (strlen(newplayer) < 3) { + pprintf(p, "Player name is too short\n"); + return COM_OK; + } + if (!alphastring(newplayer)) { + pprintf(p, "Illegal characters in player name. Only A-Za-z allowed.\n"); + return COM_OK; + } + strcpy(newplayerlower, newplayer); + stolower(newplayerlower); + p1 = player_new(); + lookup = player_read(p1, newplayerlower); + if (!lookup) { + pprintf(p, "A player by the name %s is already registered.\n", newplayerlower); + player_remove(p1); + return COM_OK; + } + player_globals.parray[p1].name = strdup(newplayer); + player_globals.parray[p1].login = strdup(newplayerlower); + player_globals.parray[p1].fullName = strdup(newname); + player_globals.parray[p1].emailAddress = strdup(newemail); + if (strcmp(newemail, "none")) { + for (i = 0; i < PASSLEN; i++) { + password[i] = 'a' + random() % 26; + } + password[i] = '\0'; + salt[0] = 'a' + random() % 26; + salt[1] = 'a' + random() % 26; + salt[2] = '\0'; + player_globals.parray[p1].passwd = strdup(chessd_crypt(password, salt)); + } else { + password[0] = '\0'; + player_globals.parray[p1].passwd = strdup(password); + } + PFlagON(p1, PFLAG_REG); +/* player_globals.parray[p1].network_player = 0; */ + PFlagON(p1, PFLAG_RATED); + player_add_comment(p, p1, "Player added by addplayer."); + player_save(p1); + player_remove(p1); + pprintf(p, "Added: >%s< >%s< >%s< >%s<\n", newplayer, newname, newemail, password); + if (strcmp(newemail, "none")) { +/* + sprintf(text, "\nYou have been added as a local player.\n\nLogin Name: " + "%s\nFull Name: %s\nEmail Address: %s\nInitial Password: " + "%s\n\nIf any of this information is incorrect, please " + "contact the administrator\nto get it corrected.\n\n" + "Please write down your password.\n\nRegards,\n\nThe FICS admins\n", + newplayer, newname, newemail, password); +*/ + + sprintf(text, "\nYour player account has been created.\n\n" + "Login Name: %s\nFull Name: %s\nEmail Address: %s\nInitial Password: %s\n\n" + "If any of this information is incorrect, please contact the administrator\n" + "to get it corrected.\n\n" + "You may change your password with the password command on the the server.\n" + "\nPlease be advised that if this is an unauthorized duplicate account for\n" + "you, by using it you take the risk of being banned from accessing this\n" + "chess server.\n\n" + "Regards,\n\nThe FICS admins\n", + newplayer, newname, newemail, password); + + mail_string_to_address(newemail, "FICS Account Created", text); + if ((p1 = player_find_part_login(newplayer)) >= 0) { + pprintf_prompt(p1, "\n\nYou are now registered! Confirmation together with\npassword is sent to your email address.\n\n"); + player_read(p1, newplayer); + return COM_OK; + } + return COM_OK; + } else { + if ((p1 = player_find_part_login(newplayer)) >= 0) { + pprintf_prompt(p1, "\n\nYou are now registered! Your have NO password!\n\n"); + player_read(p1, newplayer); + return COM_OK; + } + } + return COM_OK; +} + +int com_pose(int p, param_list param) +{ + int p1; + + if ((p1 = player_find_part_login(param[0].val.word)) < 0) { + pprintf(p, "%s is not logged in.\n", param[0].val.word); + return COM_OK; + } + if (!check_admin2(p, p1)) { + pprintf(p, "You can only pose as players below your adminlevel.\n"); + return COM_OK; + } + pprintf(p, "Command issued as %s\n", player_globals.parray[p1].name); + pcommand(p1, "%s\n", param[1].val.string); + return COM_OK; +} + +/* + * asetv + * + * Usage: asetv user instructions + * + * This command executes "set" instructions as if they had been made by the + * user indicated. For example, "asetv DAV shout 0" would set DAV's shout + * variable to 0. + */ +int com_asetv(int p, param_list param) +{ + int p1; + + if ((p1 = player_find_part_login(param[0].val.word)) < 0) { + pprintf(p, "%s is not logged in.\n", param[0].val.word); + return COM_OK; + } + if (!check_admin2(p, p1)) { + pprintf(p, "You can only aset players below your adminlevel.\n"); + return COM_OK; + } + pprintf(p, "Command issued as %s\n", player_globals.parray[p1].name); + pcommand(p1, "set %s\n", param[1].val.string); + return COM_OK; +} + +/* + * announce + * + * Usage: announce message + * + * Broadcasts your message to all logged on users. Announcements reach all + * users and cannot be censored in any way (such as by "set shout 0"). + */ +int com_announce(int p, param_list param) +{ + struct player *pp = &player_globals.parray[p]; + int p1; + int count = 0; + + if (!printablestring(param[0].val.string)) { + pprintf(p, "Your message contains some unprintable character(s).\n"); + return COM_OK; + } + for (p1 = 0; p1 < player_globals.p_num; p1++) { + if (p1 == p) + continue; + if (player_globals.parray[p1].status != PLAYER_PROMPT) + continue; + count++; + pprintf_prompt(p1, "\n\n **ANNOUNCEMENT** from %s: %s\n\n", pp->name, param[0].val.string); + } + pprintf(p, "\n(%d) **ANNOUNCEMENT** from %s: %s\n\n", count, pp->name, param[0].val.string); + return COM_OK; +} + +/* + * annunreg + * + * Usage: annunreg message + * + * Broadcasts your message to all logged on unregistered users, and admins, + * too. Announcements reach all unregistered users and admins and cannot be + * censored in any way (such as by "set shout 0"). + */ +int com_annunreg(int p, param_list param) +{ + struct player *pp = &player_globals.parray[p]; + int p1; + int count = 0; + + if (!printablestring(param[0].val.string)) { + pprintf(p, "Your message contains some unprintable character(s).\n"); + return COM_OK; + } + for (p1 = 0; p1 < player_globals.p_num; p1++) { + if (p1 == p) continue; + if (player_globals.parray[p1].status != PLAYER_PROMPT) continue; + if (CheckPFlag(p1, PFLAG_REG) + && !check_admin(p1, ADMIN_ADMIN)) + continue; + count++; + pprintf_prompt(p1, "\n\n **UNREG ANNOUNCEMENT** from %s: %s\n\n", + pp->name, param[0].val.string); + } + pprintf(p, "\n(%d) **UNREG ANNOUNCEMENT** from %s: %s\n\n", + count, pp->name, param[0].val.string); + return COM_OK; +} + +/* + * asetpasswd + * + * Usage: asetpasswd player {password,*} + * + * This command sets the password of the player to the password given. + * If '*' is specified then the player's account is locked, and no password + * will work until a new one is set by asetpasswd. + * + * If the player is connected, he is told of the new password and the name + * of the admin who changed it, or likewise of his account status. An + * email message is mailed to the player's email address as well. + */ +int com_asetpasswd(int p, param_list param) +{ + struct player *pp = &player_globals.parray[p]; + int p1, connected; + char subject[400], text[10100]; + char salt[3]; + + if (!FindPlayer(p, param[0].val.word, &p1, &connected)) + return COM_OK; + + if (!check_admin2(p, p1)) { + pprintf(p, "You can only set password for players below your adminlevel.\n"); + if (!connected) + player_remove(p1); + return COM_OK; + } + if (!CheckPFlag(p1, PFLAG_REG)) { + pprintf(p, "You cannot set the password of an unregistered player!\n"); + return COM_OK; + } + if (player_globals.parray[p1].passwd) + free(player_globals.parray[p1].passwd); + if (param[1].val.word[0] == '*') { + player_globals.parray[p1].passwd = strdup(param[1].val.word); + pprintf(p, "Account %s locked!\n", player_globals.parray[p1].name); + sprintf(text, "Password of %s is now useless. Your account at our" + " FICS has been locked.\n", player_globals.parray[p1].name); + pprintf(p, "Please leave a comment to explain why %s's account" + " was locked.\n", player_globals.parray[p1].name); + pcommand(p, "addcomment %s Account locked.\n", player_globals.parray[p1].name); + } else { + salt[0] = 'a' + random() % 26; + salt[1] = 'a' + random() % 26; + salt[2] = '\0'; + player_globals.parray[p1].passwd = strdup(chessd_crypt(param[1].val.word, salt)); + sprintf(text, "Password of %s changed to \"%s\".\n", player_globals.parray[p1].name, param[1].val.word); + pprintf(p, "%s", text); + } + if (param[1].val.word[0] == '*') { + sprintf(subject, "CHESSD: %s has locked your account.", pp->name); + if (connected) + pprintf_prompt(p1, "\n%s\n", subject); + } else { + sprintf(subject, "CHESSD: %s has changed your password.", pp->name); + if (connected) + pprintf_prompt(p1, "\n%s\n", subject); + } + mail_string_to_address(player_globals.parray[p1].emailAddress, subject, text); + player_save(p1); + if (!connected) + player_remove(p1); + return COM_OK; +} + +/* + * asetemail + * + * Usage: asetemail player [address] + * + * Sets the email address of the player to the address given. If the + * address is omited, then the player's email address is cleared. The + * person's email address is revealed to them when they use the "finger" + * command, but no other users -- except admins -- will have another + * player's email address displayed. + */ +int com_asetemail(int p, param_list param) +{ + struct player *pp = &player_globals.parray[p]; + int p1, connected; + char *oldemail; + + if (!FindPlayer(p, param[0].val.word, &p1, &connected)) + return COM_OK; + + if (!check_admin2(p, p1)) { + pprintf(p, "You can only set email addr for players below your adminlevel.\n"); + if (!connected) + player_remove(p1); + return COM_OK; + } + if (player_globals.parray[p1].emailAddress) { + oldemail = strdup(player_globals.parray[p1].emailAddress); + free(player_globals.parray[p1].emailAddress); + } else { + oldemail = strdup(""); + } + + if (param[1].type == TYPE_NULL) { + player_globals.parray[p1].emailAddress = NULL; + pprintf(p, "Email address for %s removed\n", player_globals.parray[p1].name); + pcommand(p, "addcomment %s Email address removed.\n", player_globals.parray[p1].name); + + } else { + player_globals.parray[p1].emailAddress = strdup(param[1].val.word); + pprintf(p, "Email address of %s changed to \"%s\".\n", player_globals.parray[p1].name, param[1].val.word); + pcommand(p, "addcomment %s Email address changed from %s to %s.\n", player_globals.parray[p1].name, oldemail, player_globals.parray[p1].emailAddress); + } + free(oldemail); + player_save(p1); + if (connected) { + if (param[1].type == TYPE_NULL) { + pprintf_prompt(p1, "\n\n%s has removed your email address.\n\n", pp->name); + } else { + pprintf_prompt(p1, "\n\n%s has changed your email address.\n\n", pp->name); + } + } else { + player_remove(p1); + } + return COM_OK; +} + +/* + * asetrealname + * + * Usage: asetrealname user newname + * + * This command sets the user's real name (as displayed to admins on finger + * notes) to "newname". + */ +int com_asetrealname(int p, param_list param) +{ + struct player *pp = &player_globals.parray[p]; + int p1, connected; + + if (!FindPlayer(p, param[0].val.word, &p1, &connected)) + return COM_OK; + + if (!check_admin2(p, p1)) { + pprintf(p, "You can only set real names for players below your adminlevel.\n"); + if (!connected) + player_remove(p1); + return COM_OK; + } + if (player_globals.parray[p1].fullName) + free(player_globals.parray[p1].fullName); + if (param[1].type == TYPE_NULL) { + player_globals.parray[p1].fullName = NULL; + pprintf(p, "Real name for %s removed\n", player_globals.parray[p1].name); + } else { + player_globals.parray[p1].fullName = strdup(param[1].val.word); + pprintf(p, "Real name of %s changed to \"%s\".\n", player_globals.parray[p1].name, param[1].val.word); + } + player_save(p1); + if (connected) { + if (param[1].type == TYPE_NULL) { + pprintf_prompt(p1, "\n\n%s has removed your real name.\n\n", pp->name); + } else { + pprintf_prompt(p1, "\n\n%s has changed your real name.\n\n", pp->name); + } + } else { + player_remove(p1); + } + return COM_OK; +} + +/* + * asethandle + * + * Usage: asethandle oldname newname + * + * This command changes the handle of the player from oldname to + * newname. The various player information, messages, logins, comments + * and games should be automatically transferred to the new account. + */ +int com_asethandle(int p, param_list param) +{ + char *player = param[0].val.word; + char *newplayer = param[1].val.word; + char playerlower[MAX_LOGIN_NAME], newplayerlower[MAX_LOGIN_NAME]; + int p1; + + strcpy(playerlower, player); + stolower(playerlower); + strcpy(newplayerlower, newplayer); + stolower(newplayerlower); + if (player_find_bylogin(playerlower) >= 0) { + pprintf(p, "A player by that name is logged in.\n"); + return COM_OK; + } + if (player_find_bylogin(newplayerlower) >= 0) { + pprintf(p, "A player by that new name is logged in.\n"); + return COM_OK; + } + p1 = player_new(); + if (player_read(p1, playerlower)) { + pprintf(p, "No player by the name %s is registered.\n", player); + player_remove(p1); + return COM_OK; + } else { + if (!check_admin2(p, p1)) { + pprintf(p, "You can't set handles for an admin with a level higher than or equal to yourself.\n"); + player_remove(p1); + return COM_OK; + } + } + player_remove(p1); + + p1 = player_new(); + if ((!player_read(p1, newplayerlower)) && (strcmp(playerlower, newplayerlower))) { + pprintf(p, "Sorry that handle is already taken.\n"); + player_remove(p1); + return COM_OK; + } + player_remove(p1); + + if ((!player_rename(playerlower, newplayerlower)) && (!player_read(p1, newplayerlower))) { + pprintf(p, "Player %s renamed to %s.\n", player, newplayer); + free(player_globals.parray[p1].name); + player_globals.parray[p1].name = strdup(newplayer); + player_save(p1); + if (player_globals.parray[p1].s_stats.rating > 0) + UpdateRank(TYPE_STAND, newplayer, &player_globals.parray[p1].s_stats, player); + if (player_globals.parray[p1].b_stats.rating > 0) + UpdateRank(TYPE_BLITZ, newplayer, &player_globals.parray[p1].b_stats, player); + if (player_globals.parray[p1].w_stats.rating > 0) + UpdateRank(TYPE_WILD, newplayer, &player_globals.parray[p1].w_stats, player); + } else { + pprintf(p, "Asethandle failed.\n"); + } + player_remove(p1); + return COM_OK; +} + +/* + * asetadmin + * + * Usage: asetadmin player AdminLevel + * + * Sets the admin level of the player with the following restrictions. + * 1. You can only set the admin level of players lower than yourself. + * 2. You can only set the admin level to a level that is lower than + * yourself. + */ +int com_asetadmin(int p, param_list param) +{ + struct player *pp = &player_globals.parray[p]; + int p1, connected, oldlevel; + + if (!FindPlayer(p, param[0].val.word,&p1, &connected)) + return COM_OK; + + if (!check_admin2(p, p1)) { + pprintf(p, "You can only set adminlevel for players below your adminlevel.\n"); + if (!connected) + player_remove(p1); + return COM_OK; + } + if (!strcmp(player_globals.parray[p1].login, pp->login)) { + pprintf(p, "You can't change your own adminlevel.\n"); + return COM_OK; + } + if (!check_admin(p, param[1].val.integer+1)) { + pprintf(p, "You can't promote someone to or above your adminlevel.\n"); + if (!connected) + player_remove(p1); + return COM_OK; + } + oldlevel = player_globals.parray[p1].adminLevel; + player_globals.parray[p1].adminLevel = param[1].val.integer; + pprintf(p, "Admin level of %s set to %d.\n", player_globals.parray[p1].name, player_globals.parray[p1].adminLevel); + player_save(p1); + if (connected) { + pprintf_prompt(p1, "\n\n%s has set your admin level to %d.\n\n", pp->name, player_globals.parray[p1].adminLevel); + } else { + player_remove(p1); + } + return COM_OK; +} + +static void SetRating(int p1, param_list param, struct statistics *s) +{ + s->rating = param[1].val.integer; + if (s->ltime == 0L) + s->sterr = 70.0; + + if (param[2].type == TYPE_INT) { + s->win = param[2].val.integer; + if (param[3].type == TYPE_INT) { + s->los = param[3].val.integer; + if (param[4].type == TYPE_INT) { + s->dra = param[4].val.integer; + if (param[5].type == TYPE_INT) { + s->sterr = (double) param[5].val.integer; + } + } + } + } + s->num = s->win + s->los + s->dra; + if (s->num == 0) { + s->ltime = 0L; +#if 0 + s->dra = 1; + s->num = 1; +#endif + } else { + s->ltime = time(0); + } +} + +/* + * asetblitz + * + * Usage: asetblitz handle rating won lost drew RD + * + * This command allows admins to set a user's statistics for Blitz games. + * The parameters are self-explanatory: rating, # of wins, # of losses, + * # of draws, and ratings deviation. + */ +int com_asetblitz(int p, param_list param) +{ + int p1, connected; + + if (!FindPlayer(p, param[0].val.word, &p1, &connected)) + return COM_OK; + + if (CheckPFlag(p1, PFLAG_REG)) { + SetRating(p1, param, &player_globals.parray[p1].b_stats); + player_save(p1); + UpdateRank(TYPE_BLITZ, player_globals.parray[p1].name, &player_globals.parray[p1].b_stats, + player_globals.parray[p1].name); + } else + pprintf(p, "%s is unregistered. Can't modify rating.\n", player_globals.parray[p1].name); + + if (!connected) + player_remove(p1); + return COM_OK; +} + +/* + * asetwild + * + * Usage: asetwild handle rating won lost drew RD + * + * This command allows admins to set a user's statistics for Wild games. + * The parameters are self-explanatory: rating, # of wins, # of losses, + * # of draws, and ratings deviation. + */ +int com_asetwild(int p, param_list param) +{ + int p1, connected; + + if (!FindPlayer(p, param[0].val.word, &p1, &connected)) + return COM_OK; + + if (CheckPFlag(p1, PFLAG_REG)) { + SetRating(p1, param, &player_globals.parray[p1].w_stats); + player_save(p1); + UpdateRank(TYPE_WILD, player_globals.parray[p1].name, &player_globals.parray[p1].w_stats, + player_globals.parray[p1].name); + pprintf(p, "Wild rating for %s modified.\n", player_globals.parray[p1].name); + } else + pprintf(p, "%s is unregistered. Can't modify rating.\n", player_globals.parray[p1].name); + + if (!connected) + player_remove(p1); + return COM_OK; +} + +/* + * asetstd + * + * Usage: asetstd handle rating won lost drew RD + * + * This command allows admins to set a user's statistics for Standard games. + * The parameters are self-explanatory: rating, # of wins, # of losses, # of + * draws, and ratings deviation. + */ +int com_asetstd(int p, param_list param) +{ + int p1, connected; + + if (!FindPlayer(p, param[0].val.word, &p1, &connected)) + return COM_OK; + + if (CheckPFlag(p1, PFLAG_REG)) { + SetRating(p1, param, &player_globals.parray[p1].s_stats); + player_save(p1); + UpdateRank(TYPE_STAND, player_globals.parray[p1].name, &player_globals.parray[p1].s_stats, + player_globals.parray[p1].name); + pprintf(p, "Standard rating for %s modified.\n", player_globals.parray[p1].name); + } else + pprintf(p, "%s is unregistered. Can't modify rating.\n", player_globals.parray[p1].name); + + if (!connected) + player_remove(p1); + return COM_OK; +} + +/* + * asetlight + * + * Usage: asetlight handle rating won lost drew RD + * + * This command allows admins to set a user's statistics for Lightning games. + * The parameters are self-explanatory: rating, # of wins, # of losses, # of + * draws, and ratings deviation. + */ +int com_asetlight(int p, param_list param) +{ + int p1, connected; + + if (!FindPlayer(p, param[0].val.word, &p1, &connected)) + return COM_OK; + + if (CheckPFlag(p1, PFLAG_REG)) { + SetRating(p1, param, &player_globals.parray[p1].l_stats); + player_save(p1); + pprintf(p, "Lightning rating for %s modified.\n", player_globals.parray[p1].name); + } else + pprintf(p, "%s is unregistered. Can't modify rating.\n", player_globals.parray[p1].name); + + if (!connected) + player_remove(p1); + return COM_OK; +} + +/* + * asetbug + * + * Usage: asetbug handle rating won lost drew RD + * + * This command allows admins to set a user's statistics for Bughouse + * games. The parameters are self-explanatory: rating, # of wins, + * # of losses, # of draws, and ratings deviation. + */ +int com_asetbug(int p, param_list param) +{ + int p1, connected; + + if (!FindPlayer(p, param[0].val.word, &p1, &connected)) + return COM_OK; + + if (CheckPFlag(p1, PFLAG_REG)) { + SetRating(p1, param, &player_globals.parray[p1].bug_stats); + player_save(p1); + pprintf(p, "Bughouse rating for %s modified.\n", player_globals.parray[p1].name); + } else + pprintf(p, "%s is unregistered. Can't modify rating.\n", player_globals.parray[p1].name); + + if (!connected) + player_remove(p1); + return COM_OK; +} + +/* ftell + * + * Usage: ftell user + * + * This command forwards all further conversation between an admin and a + * user to all those listening in channel 0. + * It is unset as soon as the user logs off or ftell is typed without a + * parameter. + */ + +int com_ftell(int p, param_list param) +{ + struct player *pp = &player_globals.parray[p]; + int p1; + char command[1024]; + + if (param[0].type == TYPE_WORD) { + + if ((p1 = player_find_part_login(param[0].val.word)) < 0) { + pprintf(p, "%s isn't logged in.\n", param[0].val.word); + return COM_OK; + } + + if (p1 == p) { + pprintf (p, "Nobody wants to listen to you talking to yourself! :-)\n"); + return COM_OK; + } + + if (pp->ftell != -1) { + sprintf (command, "tell 0 I will no longer be forwarding the conversation between *%s* and myself.", player_globals.parray[pp->ftell].name); + pcommand (p,command); + } + + sprintf (command, "tell 0 I will be forwarding the conversation between *%s* and myself to channel 0.", player_globals.parray[p1].name); + pcommand (p,command); + + pp->ftell = p1; + return COM_OK_NOPROMPT; + + } else { + + if (pp->ftell != -1) { + + pprintf (p,"Stopping the forwarding of the conservation with %s.\n", + player_globals.parray[pp->ftell].name); + pcommand (p,"tell 0 I will no longer be forwarding the conversation between *%s* and myself.", + player_globals.parray[pp->ftell].name); + + pp->ftell = -1; + return COM_OK_NOPROMPT; + } else + pprintf (p,"You were not forwarding a conversation.\n"); + } + + return COM_OK; +} + +/* + * nuke + * + * Usage: nuke user + * + * This command disconnects the user from the server. The user is informed + * that she/he has been nuked by the admin named and a comment is + * automatically placed in the user's files (if she/he is a registered + * user, of course). + */ +int com_nuke(int p, param_list param) +{ + struct player *pp = &player_globals.parray[p]; + int p1, fd; + + if ((p1 = player_find_part_login(param[0].val.word)) < 0) { + pprintf(p, "%s isn't logged in.\n", param[0].val.word); + return COM_OK; + } + + if (!check_admin2(p, p1)) { + pprintf(p, "You need a higher adminlevel to nuke %s!\n", param[0].val.word); + return COM_OK; + } + + pprintf(p, "Nuking: %s\n", param[0].val.word); + pprintf(p, "Please leave a comment explaining why %s was nuked.\n", player_globals.parray[p1].name); + pprintf(p1, "\n\n**** You have been kicked out by %s! ****\n\n", pp->name); + pcommand(p, "addcomment %s Nuked\n", player_globals.parray[p1].name); + fd = player_globals.parray[p1].socket; + process_disconnection(fd); + net_close_connection(fd); + return COM_OK; +} + +/* + * summon + * + * Usage: summon player + * + * This command gives a beep and a message to the player indicating that you + * want to talk with him/her. The command is useful for waking someone up, + * for example a sleepy admin or an ignorant player. + */ +int com_summon(int p, param_list param) +{ + struct player *pp = &player_globals.parray[p]; + int p1; + + if ((p1 = player_find_part_login(param[0].val.word)) < 0) { + pprintf(p, "%s isn't logged in.\n", param[0].val.word); + return COM_OK; + } + + pprintf(p1, "\a\n"); + pprintf_highlight(p1, "%s", pp->name); + pprintf_prompt(p1, " needs to talk with you. Use tell %s to reply.\a\n", pp->name); + pprintf(p, "Summoning sent to %s.\n", player_globals.parray[p1].name); + return COM_OK; +} + +/* + * addcomment + * + * Usage: addcomment user comment + * + * Places "comment" in the user's comments. If a user has comments, the + * number of comments is indicated to admins using the "finger" command. + * The comments themselves are displayed by the "showcomments" command. + */ +int com_addcomment(int p, param_list param) +{ + int p1, connected; + + if (!FindPlayer(p, param[0].val.word, &p1, &connected)) + return COM_OK; + + if (player_add_comment(p, p1, param[1].val.string)) { + pprintf(p, "Error adding comment!\n"); + } else { + pprintf(p, "Comment added for %s.\n", player_globals.parray[p1].name); + player_save(p1); + } + if (!connected) + player_remove(p1); + return COM_OK; +} + +/* + * showcomment + * + * Usage: showcomment user + * + * This command will display all of the comments added to the user's account. + */ +int com_showcomment(int p, param_list param) +{ + int p1, connected; + + if (!FindPlayer(p, param[0].val.word, &p1, &connected)) + return COM_OK; + player_show_comments(p, p1); + if (!connected) + player_remove(p1); + return COM_OK; +} + +/* + * admin + * + * Usage: admin + * + * This command toggles your admin symbol (*) on/off. This symbol appears + * in who listings. + */ +int com_admin(int p, param_list param) +{ + TogglePFlag(p, PFLAG_ADMINLIGHT); + if (CheckPFlag(p, PFLAG_ADMINLIGHT)) { + pprintf(p, "Admin mode (*) is now shown.\n"); + } else { + pprintf(p, "Admin mode (*) is now not shown.\n"); + } + return COM_OK; +} + +int com_hideinfo(int p, param_list param) +{ + TogglePFlag(p, PFLAG_HIDEINFO); + + if (CheckPFlag(p, PFLAG_HIDEINFO)) + pprintf(p, "Private user information now not shown.\n"); + else + pprintf(p, "Private user information now shown.\n"); + + return COM_OK; +} + +/* + * quota + * + * Usage: quota [n] + * + * The command sets the number of seconds (n) for the shout quota, which + * affects only those persons on the shout quota list. If no parameter + * (n) is given, the current setting is displayed. + */ +int com_quota(int p, param_list param) +{ + if (param[0].type == TYPE_NULL) { + pprintf(p, "The current shout quota is 2 shouts per %d seconds.\n", seek_globals.quota_time); + return COM_OK; + } + seek_globals.quota_time = param[0].val.integer; + pprintf(p, "The shout quota is now 2 shouts per %d seconds.\n", seek_globals.quota_time); + return COM_OK; +} + + +/* + force a server reload +*/ +int com_areload(int p, param_list param) +{ + extern unsigned chessd_reload_flag; + + chessd_reload_flag = 1; + + pprintf(p, "Server reload started\n"); + + return COM_OK; +} diff --git a/lasker-2.2.3/src/algcheck.c b/lasker-2.2.3/src/algcheck.c new file mode 100644 index 0000000..32bdba1 --- /dev/null +++ b/lasker-2.2.3/src/algcheck.c @@ -0,0 +1,513 @@ +/* + Copyright (c) 1993 Richard V. Nash. + Copyright (c) 2000 Dan Papasian + Copyright (C) Andrew Tridgell 2002 + + 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., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + + +#include "includes.h" + +/* Well, lets see if I can list the possibilities + * Piece moves + * Ne4 + * Nxe4 + * Nce4 + * Ncxe4 + * R2f3 + * R2xf3 + * Special pawn moves + * e4 + * ed + * exd + * exd5 + * ed5 + * Drop moves (bughouse, board edit) + * P@f7 P*f7 + * #f7 #Nf7 + * (o-o, o-o-o) Castling is handled earlier, so don't worry about that + * Of course any of these can have a + or ++ or = string on the end, just + * cut that off. + */ + +/* f - file + * r - rank + * p - piece + * x - x + * @ - drop character (bughouse) + */ +static char *alg_list[] = { + "fxfr", "pxfr", /* These two get confused in case of bishop */ + "ffr", "pfr", /* These two get confused in case of bishop */ + "pffr", + "pfxfr", + "prfr", + "prxfr", + "fr", + "ff", + "fxf", + "p@fr", + "#fr", + "#pfr", + NULL +}; + +#define ALG_UNKNOWN -1 + +static int get_move_info(const char *str, int *piece, int *ff, int *fr, int *tf, int *tr, int *bishconfusion) +{ + char tmp[1024]; + char *s; + int i, j, len; + char c; + int matchVal = -1; + int lpiece, lff, lfr, ltf, ltr; + + *bishconfusion = 0; + strlcpy(tmp, str, sizeof(tmp)); + if ((s = strchr(tmp, '+'))) { /* Cut off any check marks */ + *s = '\0'; + } + if ((s = strchr(tmp, '='))) { /* Cut off any promotion marks */ + *s = '\0'; + } + if ((s = strchr(tmp, '#'))) { /* Cut off any 'mates' marks */ + *s = '\0'; + } + *piece = *ff = *fr = *tf = *tr = ALG_UNKNOWN; + len = strlen(tmp); + for (i = 0; alg_list[i]; i++) { + lpiece = lff = lfr = ltf = ltr = ALG_UNKNOWN; + if (strlen(alg_list[i]) != len) + continue; + for (j = len - 1; j >= 0; j--) { + switch (alg_list[i][j]) { + case 'f': + if ((tmp[j] < 'a') || (tmp[j] > 'h')) + goto nomatch; + if (ltf == ALG_UNKNOWN) + ltf = tmp[j] - 'a'; + else + lff = tmp[j] - 'a'; + break; + case 'r': + if ((tmp[j] < '1') || (tmp[j] > '8')) + goto nomatch; + if (ltr == ALG_UNKNOWN) + ltr = tmp[j] - '1'; + else + lfr = tmp[j] - '1'; + break; + case 'p': + if (isupper(tmp[j])) + c = tolower(tmp[j]); + else + c = tmp[j]; + if (c == 'k') + lpiece = KING; + else if (c == 'q') + lpiece = QUEEN; + else if (c == 'r') + lpiece = ROOK; + else if (c == 'b') + lpiece = BISHOP; + else if (c == 'n') + lpiece = KNIGHT; + else if (c == 'p') + lpiece = PAWN; + else + goto nomatch; + break; + case 'x': + if ((tmp[j] != 'x') && (tmp[j] != 'X')) + goto nomatch; + break; + case '@': + if (tmp[j] != '@' && tmp[j] != '*') + goto nomatch; + lff = lfr = ALG_DROP; + break; + case '#': + if (tmp[j] != '#') + goto nomatch; + lff = lfr = ALG_DROP; + break; + default: + d_printf( "Unknown character in algebraic parsing\n"); + break; + } + } + if (lpiece == ALG_UNKNOWN) + lpiece = PAWN; + if (lpiece == PAWN && (lfr == ALG_UNKNOWN)) { /* ffr or ff */ + if (lff != ALG_UNKNOWN) { + if (lff == ltf) + goto nomatch; + if ((lff - ltf != 1) && (ltf - lff != 1)) + goto nomatch; + } + } + *piece = lpiece; /* We have a match */ + *tf = ltf; + *tr = ltr; + *ff = lff; + *fr = lfr; + if (matchVal != -1) { + /* We have two matches, it must be that Bxc4 vs. bxc4 problem */ + /* Or it could be the Bc4 vs bc4 problem */ + *bishconfusion = 1; + } + matchVal = i; +nomatch:; + } + if (matchVal != -1) + return MS_ALG; + else + return MS_NOTMOVE; +} + +int alg_is_move(const char *mstr) +{ + int piece=0, ff=0, fr=0, tf=0, tr=0, bc=0; + + return get_move_info(mstr, &piece, &ff, &fr, &tf, &tr, &bc); +} + +/* add any promotion qualifier from a move string */ +static void add_promotion(struct game_state_t *gs, const char *mstr, struct move_t * mt) +{ + char *s; + int piece; + s = strchr(mstr, '='); + if (s == NULL) { + return; + } + + if (piecetype(gs->board[mt->fromFile][mt->fromRank]) != PAWN) { + return; + } + if (mt->toRank != 7 && mt->toRank != 0) { + return; + } + + switch (tolower(s[1])) { + case 'q': + piece = QUEEN; + break; + case 'r': + piece = ROOK; + break; + case 'b': + piece = BISHOP; + break; + case 'n': + piece = KNIGHT; + break; + default: + return; + } + + mt->piecePromotionTo = piece | colorval(gs->board[mt->fromFile][mt->fromRank]); +} + +/* We already know it is algebraic, get the move squares */ +int alg_parse_move(char *mstr, struct game_state_t * gs, struct move_t * mt) +{ + int f=0, r=0, tmpr=0, posf=0, posr=0, posr2=0; + int piece=0, ff=0, fr=0, tf=0, tr=0, bc=0; + + if (get_move_info(mstr, &piece, &ff, &fr, &tf, &tr, &bc) != MS_ALG) { + d_printf( "CHESSD: Shouldn't try to algebraicly parse non-algabraic move string.\n"); + return MOVE_ILLEGAL; + } + /* Resolve ambiguities in to-ness */ + if (tf == ALG_UNKNOWN) { + d_printf("Ambiguous %s(%d)\n", __FUNCTION__, __LINE__); + return MOVE_AMBIGUOUS; /* Must always know to file */ + } + if (tr == ALG_UNKNOWN) { + posr = posr2 = ALG_UNKNOWN; + if (piece != PAWN) { + d_printf("Ambiguous %s(%d)\n", __FUNCTION__, __LINE__); + return MOVE_AMBIGUOUS; + } + if (ff == ALG_UNKNOWN) { + d_printf("Ambiguous %s(%d)\n", __FUNCTION__, __LINE__); + return MOVE_AMBIGUOUS; + } + /* Need to find pawn on ff that can take to tf and fill in ranks */ + for (InitPieceLoop(gs->board, &f, &r, gs->onMove); + NextPieceLoop(gs->board, &f, &r, gs->onMove);) { + if ((ff != ALG_UNKNOWN) && (ff != f)) + continue; + if (piecetype(gs->board[f][r]) != piece) + continue; + if (gs->onMove == WHITE) { + tmpr = r + 1; + } else { + tmpr = r - 1; + } +/* if ((gs->board[tf][tmpr] == NOPIECE) || + (iscolor(gs->board[tf][tmpr], gs->onMove))) continue;*/ +/* patch from Soso, added by Sparky 3/16/95 */ + if (gs->board[tf][tmpr] == NOPIECE) { + if ((gs->ep_possible[((gs->onMove == WHITE) ? 0 : 1)][ff]) != (tf - ff)) + continue; + } else { + if (iscolor(gs->board[tf][tmpr], gs->onMove)) + continue; + } + + if (legal_andcheck_move(gs, f, r, tf, tmpr)) { + if ((posr != ALG_UNKNOWN) && (posr2 != ALG_UNKNOWN)) { + d_printf("Ambiguous %s(%d)\n", __FUNCTION__, __LINE__); + return MOVE_AMBIGUOUS; + } + posr = tmpr; + posr2 = r; + } + } + tr = posr; + fr = posr2; + } else if (bc) { /* Could be bxc4 or Bxc4, tr is known */ + ff = ALG_UNKNOWN; + fr = ALG_UNKNOWN; + for (InitPieceLoop(gs->board, &f, &r, gs->onMove); + NextPieceLoop(gs->board, &f, &r, gs->onMove);) { + if ((piecetype(gs->board[f][r]) != PAWN) && (piecetype(gs->board[f][r]) != BISHOP)) { + continue; + } + if (legal_andcheck_move(gs, f, r, tf, tr)) { + if ((piecetype(gs->board[f][r]) == PAWN) && (f != 1)) { + continue; + } + + /* if its a lowercase 'b' then prefer the pawn move if there is one */ + if ((ff != ALG_UNKNOWN) && (fr != ALG_UNKNOWN) && + piecetype(gs->board[f][r]) == PAWN && mstr[0] == 'b') { + ff = f; + fr = r; + continue; + } + + if ((ff != ALG_UNKNOWN) && (fr != ALG_UNKNOWN) && + piecetype(gs->board[ff][fr]) == PAWN && mstr[0] == 'b') { + continue; + } + + if ((ff != ALG_UNKNOWN) && (fr != ALG_UNKNOWN)) { + d_printf("Ambiguous %s(%d) mstr=%s\n", __FUNCTION__, __LINE__, mstr); + return (MOVE_AMBIGUOUS); + } + ff = f; + fr = r; + } + } + } else { /* The from position is unknown */ + posf = ALG_UNKNOWN; + posr = ALG_UNKNOWN; + if ((ff == ALG_UNKNOWN) || (fr == ALG_UNKNOWN)) { + /* Need to find a piece that can go to tf, tr */ + for (InitPieceLoop(gs->board, &f, &r, gs->onMove); + NextPieceLoop(gs->board, &f, &r, gs->onMove);) { + if ((ff != ALG_UNKNOWN) && (ff != f)) + continue; + if ((fr != ALG_UNKNOWN) && (fr != r)) + continue; + if (piecetype(gs->board[f][r]) != piece) + continue; + if (legal_andcheck_move(gs, f, r, tf, tr)) { + if ((posf != ALG_UNKNOWN) && (posr != ALG_UNKNOWN)) { + d_printf("Ambiguous %s(%d)\n", __FUNCTION__, __LINE__); + return MOVE_AMBIGUOUS; + } + posf = f; + posr = r; + } + } + } else if (ff == ALG_DROP) { + if (legal_andcheck_move(gs, ALG_DROP, piece, tf, tr)) { + posf = ALG_DROP; + posr = piece; + } + } + ff = posf; + fr = posr; + } + if ((tf == ALG_UNKNOWN) || (tr == ALG_UNKNOWN) || + (ff == ALG_UNKNOWN) || (fr == ALG_UNKNOWN)) + return MOVE_ILLEGAL; + mt->fromFile = ff; + mt->fromRank = fr; + mt->toFile = tf; + mt->toRank = tr; + + add_promotion(gs, mstr, mt); + + return MOVE_OK; +} + +/* A assumes the move has yet to be made on the board */ + +/* Soso: rewrote alg_unparse function. + * Algebraic deparser - sets the mStr variable with move description + * in short notation. Used in last move report and in 'moves' command. + */ + +char *alg_unparse(struct game_state_t * gs, struct move_t * mt) +{ + static char mStr[20]; + char tmp[20]; + int piece, f, r; + int ambig, r_ambig, f_ambig; + struct game_state_t fakeMove; + + if (mt->fromFile == ALG_DROP) { + piece = mt->fromRank; + } else { + piece = piecetype(gs->board[mt->fromFile][mt->fromRank]); + } + + if ((piece == KING) && ((mt->fromFile == 4) && (mt->toFile == 6))) { + strcpy(mStr, "O-O"); + goto check; + } + if ((piece == KING) && ((mt->fromFile == 4) && (mt->toFile == 2))) { + strcpy(mStr, "O-O-O"); + goto check; + } + strcpy(mStr, ""); + switch (piece) { + case PAWN: + if (mt->fromFile == ALG_DROP) { + strcpy(mStr,"P"); + } else if (mt->fromFile != mt->toFile) { + sprintf(tmp, "%c", mt->fromFile + 'a'); + strcpy(mStr, tmp); + } + break; + case KNIGHT: + strcpy(mStr, "N"); + break; + case BISHOP: + strcpy(mStr, "B"); + break; + case ROOK: + strcpy(mStr, "R"); + break; + case QUEEN: + strcpy(mStr, "Q"); + break; + case KING: + strcpy(mStr, "K"); + break; + default: + strcpy(mStr, ""); + break; + } + + if (mt->fromFile == ALG_DROP) { + strcat(mStr, "@"); + } else { + /* Checks for ambiguity in short notation ( Ncb3, R8e8 or so) */ + if (piece != PAWN) { + ambig = r_ambig = f_ambig = 0; + for (r = 0; r < 8; r++) + for (f = 0; f < 8; f++) { + if ((gs->board[f][r] != NOPIECE) && iscolor(gs->board[f][r], gs->onMove) + && (piecetype(gs->board[f][r]) == piece) && + ((f != mt->fromFile) || (r != mt->fromRank))) { + if (legal_move(gs, f, r, mt->toFile, mt->toRank)) { + fakeMove = *gs; + fakeMove.board[f][r] = NOPIECE; + fakeMove.board[mt->toFile][mt->toRank] = piece | gs->onMove; + fakeMove.onMove = CToggle(fakeMove.onMove); + gs->onMove = CToggle(gs->onMove); + +#if 0 + d_printf("possible move %c%d%c%d against %c%d%c%d\n", + 'a' + f, r+1, + 'a' + mt->toFile, mt->toRank+1, + 'a' + mt->fromFile, mt->fromRank+1, + 'a' + mt->toFile, mt->toRank+1); +#endif + + if (!in_check(&fakeMove)) { + ambig++; + if (f == mt->fromFile) { + ambig++; + f_ambig++; + } + if (r == mt->fromRank) { + ambig++; + r_ambig++; + } + } + gs->onMove = CToggle(gs->onMove); + } + } + } + if (ambig > 0) { + /* Ambiguity in short notation, need to add file,rank or _both_ in + notation */ + if (f_ambig == 0) { + sprintf(tmp, "%c", mt->fromFile + 'a'); + strcat(mStr, tmp); + } else if (r_ambig == 0) { + sprintf(tmp, "%d", mt->fromRank + 1); + strcat(mStr, tmp); + } else { + sprintf(tmp, "%c%d", mt->fromFile + 'a', mt->fromRank + 1); + strcat(mStr, tmp); + } + } + } + if ((gs->board[mt->toFile][mt->toRank] != NOPIECE) || + ((piece == PAWN) && (mt->fromFile != mt->toFile))) { + strcat(mStr, "x"); + } + } + sprintf(tmp, "%c%d", mt->toFile + 'a', mt->toRank + 1); + strcat(mStr, tmp); + + if ((piece == PAWN) && (mt->piecePromotionTo != NOPIECE)) { + strcat(mStr, "="); /* = before promoting piece */ + switch (piecetype(mt->piecePromotionTo)) { + case KNIGHT: + strcat(mStr, "N"); + break; + case BISHOP: + strcat(mStr, "B"); + break; + case ROOK: + strcat(mStr, "R"); + break; + case QUEEN: + strcat(mStr, "Q"); + break; + default: + break; + } + } +check:; + fakeMove = *gs; + execute_move(&fakeMove, mt, 0); + fakeMove.onMove = CToggle(fakeMove.onMove); + if (in_check(&fakeMove)) { + strcat(mStr, "+"); + } + return mStr; +} diff --git a/lasker-2.2.3/src/autoconfig.h.in b/lasker-2.2.3/src/autoconfig.h.in new file mode 100644 index 0000000..cf56fad --- /dev/null +++ b/lasker-2.2.3/src/autoconfig.h.in @@ -0,0 +1,112 @@ +/* autoconfig.h.in. Generated automatically from configure.in by autoheader. */ + +/* Define to empty if the keyword does not work. */ +#undef const + +/* Define if you don't have vprintf but do have _doprnt. */ +#undef HAVE_DOPRNT + +/* Define if you have the strftime function. */ +#undef HAVE_STRFTIME + +/* Define if you have that is POSIX.1 compatible. */ +#undef HAVE_SYS_WAIT_H + +/* Define if you have the vprintf function. */ +#undef HAVE_VPRINTF + +/* Define if you have the wait3 system call. */ +#undef HAVE_WAIT3 + +/* Define as the return type of signal handlers (int or void). */ +#undef RETSIGTYPE + +/* Define to `unsigned' if doesn't define. */ +#undef size_t + +/* Define if you have the ANSI C header files. */ +#undef STDC_HEADERS + +/* Define if you can safely include both and . */ +#undef TIME_WITH_SYS_TIME + +/* Define if your declares struct tm. */ +#undef TM_IN_SYS_TIME + +#undef HAVE_DLOPEN + +/* Define if you have the dlopen function. */ +#undef HAVE_DLOPEN + +/* Define if you have the dprintf function. */ +#undef HAVE_DPRINTF + +/* Define if you have the gethostname function. */ +#undef HAVE_GETHOSTNAME + +/* Define if you have the gettimeofday function. */ +#undef HAVE_GETTIMEOFDAY + +/* Define if you have the select function. */ +#undef HAVE_SELECT + +/* Define if you have the socket function. */ +#undef HAVE_SOCKET + +/* Define if you have the strcspn function. */ +#undef HAVE_STRCSPN + +/* Define if you have the strdup function. */ +#undef HAVE_STRDUP + +/* Define if you have the strlcat function. */ +#undef HAVE_STRLCAT + +/* Define if you have the strlcpy function. */ +#undef HAVE_STRLCPY + +/* Define if you have the strnlen function. */ +#undef HAVE_STRNLEN + +/* Define if you have the strstr function. */ +#undef HAVE_STRSTR + +/* Define if you have the header file. */ +#undef HAVE_DIRENT_H + +/* Define if you have the header file. */ +#undef HAVE_FCNTL_H + +/* Define if you have the header file. */ +#undef HAVE_NDIR_H + +/* Define if you have the header file. */ +#undef HAVE_STRINGS_H + +/* Define if you have the header file. */ +#undef HAVE_SYS_DIR_H + +/* Define if you have the header file. */ +#undef HAVE_SYS_FILE_H + +/* Define if you have the header file. */ +#undef HAVE_SYS_IOCTL_H + +/* Define if you have the header file. */ +#undef HAVE_SYS_MD5_H + +/* Define if you have the header file. */ +#undef HAVE_SYS_NDIR_H + +/* Define if you have the header file. */ +#undef HAVE_SYS_TIME_H + +/* Define if you have the header file. */ +#undef HAVE_UNISTD_H + +/* Define if you have the m library (-lm). */ +#undef HAVE_LIBM + +/* */ +#undef HAVE_COMPAR_FN_T + diff --git a/lasker-2.2.3/src/board.c b/lasker-2.2.3/src/board.c new file mode 100644 index 0000000..8fdbb0e --- /dev/null +++ b/lasker-2.2.3/src/board.c @@ -0,0 +1,1056 @@ +/* + Copyright (c) 1993 Richard V. Nash. + Copyright (c) 2000 Dan Papasian + Copyright (C) Andrew Tridgell 2002 + + 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., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + + + +#include "includes.h" + + +const char *wpstring[] = {" ", "P", "N", "B", "R", "Q", "K"}; +static const char *bpstring[] = {" ", "p", "n", "b", "r", "q", "k"}; + +static int pieceValues[7] = {0, 1, 3, 3, 5, 9, 0}; + +static const int mach_type = (1<<7) | (1<<8) | (1<<9) | (1<<10) | (1<<11); +#define IsMachineStyle(n) (((1<<(n)) & mach_type) != 0) + +static char bstring[MAX_BOARD_STRING_LEGTH]; + +static int board_read_file(char *category, char *gname, struct game_state_t *gs); +static void wild_update(int style); + +static int style1(struct game_state_t *b, struct move_t *ml); +static int style2(struct game_state_t *b, struct move_t *ml); +static int style3(struct game_state_t *b, struct move_t *ml); +static int style4(struct game_state_t *b, struct move_t *ml); +static int style5(struct game_state_t *b, struct move_t *ml); +static int style6(struct game_state_t *b, struct move_t *ml); +static int style7(struct game_state_t *b, struct move_t *ml); +static int style8(struct game_state_t *b, struct move_t *ml); +static int style9(struct game_state_t *b, struct move_t *ml); +static int style10(struct game_state_t *b, struct move_t *ml); +static int style11(struct game_state_t *b, struct move_t *ml); +static int style12(struct game_state_t *b, struct move_t *ml); +static int style13(struct game_state_t *b, struct move_t *ml); + +static int (*styleFuncs[MAX_STYLES])() = { + style1, + style2, + style3, + style4, + style5, + style6, + style7, + style8, + style9, + style10, + style11, + style12, + style13 +}; + + +static void reset_board_vars(struct game_state_t *gs) +{ + int f,r; + + for (f = 0; f < 2; f++) { + for (r = 0; r < 8; r++) + gs->ep_possible[f][r] = 0; + for (r = PAWN; r <= QUEEN; r++) + gs->holding[f][r-PAWN] = 0; + } + gs->wkmoved = gs->wqrmoved = gs->wkrmoved = 0; + gs->bkmoved = gs->bqrmoved = gs->bkrmoved = 0; + gs->onMove = WHITE; + gs->moveNum = 1; + gs->lastIrreversable = -1; + gs->gameNum = -1; +} + +void board_clear(struct game_state_t *gs) +{ + int f,r; + + for (f = 0; f < 8; f++) + for (r = 0; r < 8; r++) + gs->board[f][r] = NOPIECE; + reset_board_vars(gs); +} + +void board_standard(struct game_state_t *gs) +{ + int f,r; + + for (f = 0; f < 8; f++) + for (r = 2; r < 6; r++) + gs->board[f][r] = NOPIECE; + for (f = 0; f < 8; f++) + gs->board[f][1] = W_PAWN; + for (f = 0; f < 8; f++) + gs->board[f][6] = B_PAWN; + gs->board[0][0] = W_ROOK; + gs->board[1][0] = W_KNIGHT; + gs->board[2][0] = W_BISHOP; + gs->board[3][0] = W_QUEEN; + gs->board[4][0] = W_KING; + gs->board[5][0] = W_BISHOP; + gs->board[6][0] = W_KNIGHT; + gs->board[7][0] = W_ROOK; + gs->board[0][7] = B_ROOK; + gs->board[1][7] = B_KNIGHT; + gs->board[2][7] = B_BISHOP; + gs->board[3][7] = B_QUEEN; + gs->board[4][7] = B_KING; + gs->board[5][7] = B_BISHOP; + gs->board[6][7] = B_KNIGHT; + gs->board[7][7] = B_ROOK; + reset_board_vars(gs); +} + +int board_init(int g,struct game_state_t *b, char *category, char *board) +{ + int retval = 0; + int wval; + + if (!category || !board || !category[0] || !board[0]) + /* accounts for bughouse too */ + board_standard(b); + else { + if (!strcmp(category, "wild")) { + if (sscanf(board, "%d", &wval) == 1 && wval >= 1 && wval <= 4) + wild_update(wval); + } + retval = board_read_file(category, board, b); + } + MakeFENpos(g, game_globals.garray[g].FENstartPos); + return retval; +} + +void board_calc_strength(struct game_state_t *b, int *ws, int *bs) +{ + int r, f; + int *p; + + *ws = *bs = 0; + for (f = 0; f < 8; f++) { + for (r = 0; r < 8; r++) { + if (colorval(b->board[r][f]) == WHITE) + p = ws; + else + p = bs; + *p += pieceValues[piecetype(b->board[r][f])]; + } + } + for (r = PAWN; r <= QUEEN; r++) { + *ws += b->holding[0][r-1] * pieceValues[r]; + *bs += b->holding[1][r-1] * pieceValues[r]; + } +} + +static char *holding_str(int *holding) +{ + static char tmp[30]; + int p,i,j; + + i = 0; + for (p = PAWN; p <= QUEEN; p++) { + for (j = 0; j < holding[p-1]; j++) { + tmp[i++] = wpstring[p][0]; + } + } + tmp[i] = '\0'; + return tmp; +} + +static char *append_holding_machine(char *buf, int g, int c, int p) +{ + struct game_state_t *gs = &game_globals.garray[g].game_state; + char tmp[50]; + + sprintf(tmp, " game %d white [%s] black [", g+1, holding_str(gs->holding[0])); + strcat(tmp, holding_str(gs->holding[1])); + strcat(buf, tmp); + if (p) { + sprintf(tmp, "] <- %c%s\n", "WB"[c], wpstring[p]); + strcat(buf, tmp); + } else + strcat(buf, "]\n"); + return buf; +} + +static char *append_holding_display(char *buf, struct game_state_t *gs, int white) +{ + if (white) + strcat(buf, "White holding: ["); + else + strcat(buf, "Black holding: ["); + strcat(buf, holding_str(gs->holding[white ? 0 : 1])); + strcat(buf, "]\n"); + return buf; +} + +void update_holding(int g, int pieceCaptured) +{ + int p = piecetype(pieceCaptured); + int c = colorval(pieceCaptured); + struct game_state_t *gs = &game_globals.garray[g].game_state; + int pp, pl; + char tmp1[80], tmp2[80]; + + if (c == WHITE) { + c = 0; + pp = game_globals.garray[g].white; + } else { + c = 1; + pp = game_globals.garray[g].black; + } + gs->holding[c][p-1]++; + tmp1[0] = '\0'; + append_holding_machine(tmp1, g, c, p); + sprintf(tmp2, "Game %d %s received: %s -> [%s]\n", g+1, + player_globals.parray[pp].name, wpstring[p], holding_str(gs->holding[c])); + for (pl = 0; pl < player_globals.p_num; pl++) { + if (player_globals.parray[pl].status == PLAYER_EMPTY) + continue; + if (player_is_observe(pl, g) || (player_globals.parray[pl].game == g)) { + pprintf_prompt(pl, IsMachineStyle(player_globals.parray[pl].style) ? tmp1 : tmp2); + } + } +} + + +/* Globals used for each board */ +static int wTime, bTime; +static int orient; +static int forPlayer; +static int myTurn; /* 1 = my turn, 0 = observe, -1 = other turn */ + /* 2 = examiner, -2 = observing examiner */ + /* -3 = just send position (spos/refresh) */ + +char *board_to_string(char *wn, char *bn, + int wt, int bt, + struct game_state_t *b, struct move_t *ml, int style, + int orientation, int relation, + int p) +{ + int bh = (b->gameNum >= 0 && game_globals.garray[b->gameNum].link >= 0); + orient = orientation; + myTurn = relation; + + wTime = 0; + bTime = 0; + + /* when examining we calculate times based on the time left when the + move happened, not current time */ + if (game_globals.garray[b->gameNum].status == GAME_EXAMINE) { + unsigned nhm = game_globals.garray[b->gameNum].numHalfMoves; + if (nhm > 0) { + wTime = ml[nhm - 1].wTime; + bTime = ml[nhm - 1].bTime; + } else { + wTime = game_globals.garray[b->gameNum].wInitTime; + bTime = game_globals.garray[b->gameNum].bInitTime; + } + } + + /* cope with old stored games */ + if (wTime == 0) wTime = wt; + if (bTime == 0) bTime = bt; + + forPlayer = p; + if ((style < 0) || (style >= MAX_STYLES)) + return NULL; + + if (style != 11) { /* game header */ + sprintf(bstring, "Game %d (%s vs. %s)\n\n", + b->gameNum + 1, + game_globals.garray[b->gameNum].white_name, + game_globals.garray[b->gameNum].black_name); + } else + bstring[0] = '\0'; + if (bh && !IsMachineStyle(style)) + append_holding_display(bstring, b, orientation==BLACK); + if (styleFuncs[style] (b, ml)) + return NULL; + if (bh) { + if (IsMachineStyle(style)) + append_holding_machine(bstring, b->gameNum, 0, 0); + else + append_holding_display(bstring, b, orientation==WHITE); + } + return bstring; +} + +char *move_and_time(struct move_t *m) +{ + static char tmp[20]; + sprintf(tmp, "%-7s (%s)", m->algString, tenth_str(m->tookTime, 0)); + return tmp; +} + +/* The following take the game state and whole move list */ + +static int genstyle(struct game_state_t *b, struct move_t *ml, const char *wp[], const char *bp[], + const char *wsqr, const char *bsqr, + const char *top, const char *mid, const char *start, const char *end, + const char *label,const char *blabel) +{ + int f, r, count; + char tmp[80]; + int first, last, inc; + int ws, bs; + + board_calc_strength(b, &ws, &bs); + if (orient == WHITE) { + first = 7; + last = 0; + inc = -1; + } else { + first = 0; + last = 7; + inc = 1; + } + strcat(bstring, top); + for (f = first, count = 7; f != last + inc; f += inc, count--) { + sprintf(tmp, " %d %s", f + 1, start); + strcat(bstring, tmp); + for (r = last; r != first - inc; r = r - inc) { + if (square_color(r, f) == WHITE) + strcat(bstring, wsqr); + else + strcat(bstring, bsqr); + if (piecetype(b->board[r][f]) == NOPIECE) { + if (square_color(r, f) == WHITE) + strcat(bstring, bp[0]); + else + strcat(bstring, wp[0]); + } else { + if (colorval(b->board[r][f]) == WHITE) + strcat(bstring, wp[piecetype(b->board[r][f])]); + else + strcat(bstring, bp[piecetype(b->board[r][f])]); + } + } + sprintf(tmp, "%s", end); + strcat(bstring, tmp); + switch (count) { + case 7: + sprintf(tmp, " Move # : %d (%s)", b->moveNum, CString(b->onMove)); + strcat(bstring, tmp); + break; + case 6: +/* if ((b->moveNum > 1) || (b->onMove == BLACK)) { */ +/* The change from the above line to the one below is a kludge by hersco. */ + if (game_globals.garray[b->gameNum].numHalfMoves > 0) { +/* loon: think this fixes the crashing ascii board on takeback bug */ + sprintf(tmp, " %s Moves : '%s'", CString(CToggle(b->onMove)), + move_and_time(&ml[game_globals.garray[b->gameNum].numHalfMoves - 1])); + strcat(bstring, tmp); + } + break; + case 5: + break; + case 4: + sprintf(tmp, " Black Clock : %s", tenth_str(((bTime > 0) ? bTime : 0), 1)); + strcat(bstring, tmp); + break; + case 3: + sprintf(tmp, " White Clock : %s", tenth_str(((wTime > 0) ? wTime : 0), 1)); + strcat(bstring, tmp); + break; + case 2: + sprintf(tmp, " Black Strength : %d", bs); + strcat(bstring, tmp); + break; + case 1: + sprintf(tmp, " White Strength : %d", ws); + strcat(bstring, tmp); + break; + case 0: + break; + } + strcat(bstring, "\n"); + if (count != 0) + strcat(bstring, mid); + else + strcat(bstring, top); + } + if (orient == WHITE) + strcat(bstring, label); + else + strcat(bstring, blabel); + return 0; +} + +/* Experimental ANSI board for colour representation */ +static int style13(struct game_state_t *b, struct move_t *ml) +{ + static const char *wp[] = {" ", "\033[37m\033[1m P ", "\033[37m\033[1m N ", "\033[37m\033[1m B ", "\033[37m\033[1m R ", "\033[37m\033[1m Q ", "\033[37m\033[1m K "}; + static const char *bp[] = {" ", "\033[21m\033[37m P ", "\033[21m\033[37m N ", "\033[21m\033[37m B ", "\033[21m\033[37m R ", "\033[21m\033[37m Q ", "\033[21m\033[37m K "}; + static const char *wsqr = "\033[40m"; + static const char *bsqr = "\033[45m"; + static const char *top = "\t+------------------------+\n"; + static const char *mid = ""; + static const char *start = "|"; + static const char *end = "\033[0m|"; + static const char *label = "\t a b c d e f g h\n"; + static const char *blabel = "\t h g f e d c b a\n"; + + return genstyle(b, ml, wp, bp, wsqr, bsqr, top, mid, start, end, label, blabel); +} + +/* Standard ICS */ +static int style1(struct game_state_t *b, struct move_t *ml) +{ + static const char *wp[] = {" |", " P |", " N |", " B |", " R |", " Q |", " K |"}; + static const char *bp[] = {" |", " *P|", " *N|", " *B|", " *R|", " *Q|", " *K|"}; + static char *wsqr = ""; + static char *bsqr = ""; + static char *top = "\t---------------------------------\n"; + static char *mid = "\t|---+---+---+---+---+---+---+---|\n"; + static char *start = "|"; + static char *end = ""; + static char *label = "\t a b c d e f g h\n"; + static char *blabel = "\t h g f e d c b a\n"; + + return genstyle(b, ml, wp, bp, wsqr, bsqr, top, mid, start, end, label, blabel); +} + +/* USA-Today Sports Center-style board */ +static int style2(struct game_state_t *b, struct move_t *ml) +{ + static const char *wp[] = {"+ ", "P ", "N ", "B ", "R ", "Q ", "K "}; + static const char *bp[] = {"- ", "p' ", "n' ", "b' ", "r' ", "q' ", "k' "}; + static char *wsqr = ""; + static char *bsqr = ""; + static char *top = ""; + static char *mid = ""; + static char *start = ""; + static char *end = ""; + static char *label = "\ta b c d e f g h\n"; + static char *blabel = "\th g f e d c b a\n"; + + return genstyle(b, ml, wp, bp, wsqr, bsqr, top, mid, start, end, label, blabel); +} + +/* Experimental vt-100 ANSI board for dark backgrounds */ +static int style3(struct game_state_t *b, struct move_t *ml) +{ + static const char *wp[] = {" ", " P ", " N ", " B ", " R ", " Q ", " K "}; + static const char *bp[] = {" ", " *P", " *N", " *B", " *R", " *Q", " *K"}; + static char *wsqr = "\033[0m"; + static char *bsqr = "\033[7m"; + static char *top = "\t+------------------------+\n"; + static char *mid = ""; + static char *start = "|"; + static char *end = "\033[0m|"; + static char *label = "\t a b c d e f g h\n"; + static char *blabel = "\t h g f e d c b a\n"; + + return genstyle(b, ml, wp, bp, wsqr, bsqr, top, mid, start, end, label, blabel); +} + +/* Experimental vt-100 ANSI board for light backgrounds */ +static int style4(struct game_state_t *b, struct move_t *ml) +{ + static const char *wp[] = {" ", " P ", " N ", " B ", " R ", " Q ", " K "}; + static const char *bp[] = {" ", " *P", " *N", " *B", " *R", " *Q", " *K"}; + static char *wsqr = "\033[7m"; + static char *bsqr = "\033[0m"; + static char *top = "\t+------------------------+\n"; + static char *mid = ""; + static char *start = "|"; + static char *end = "\033[0m|"; + static char *label = "\t a b c d e f g h\n"; + static char *blabel = "\t h g f e d c b a\n"; + + return genstyle(b, ml, wp, bp, wsqr, bsqr, top, mid, start, end, label, blabel); +} + +/* Style suggested by ajpierce@med.unc.edu */ +static int style5(struct game_state_t *b, struct move_t *ml) +{ + static const char *wp[] = {" ", " o ", " :N:", " ", " |R|", " {Q}", " =K="}; + static const char *bp[] = {" ", " p ", " :n:", " ", " |r|", " {q}", " =k="}; + static char *wsqr = ""; + static char *bsqr = ""; + static char *top = " . . . . . . . . .\n"; + static char *mid = " . . . . . . . . .\n"; + static char *start = ""; + static char *end = ""; + static char *label = "\t a b c d e f g h\n"; + static char *blabel = "\t h g f e d c b a\n"; + + return genstyle(b, ml, wp, bp, wsqr, bsqr, top, mid, start, end, label, blabel); +} + +/* Email Board suggested by Thomas Fought (tlf@rsch.oclc.org) */ +static int style6(struct game_state_t *b, struct move_t *ml) +{ + static const char *wp[] = {" |", " wp |", " WN |", " WB |", " WR |", " WQ |", " WK |"}; + static const char *bp[] = {" |", " bp |", " BN |", " BB |", " BR |", " BQ |", " BK |"}; + static char *wsqr = ""; + static char *bsqr = ""; + static char *top = "\t-----------------------------------------\n"; + static char *mid = "\t-----------------------------------------\n"; + static char *start = "|"; + static char *end = ""; + static char *label = "\t A B C D E F G H\n"; + static char *blabel = "\t H G F E D C B A\n"; + + return genstyle(b, ml, wp, bp, wsqr, bsqr, top, mid, start, end, label, blabel); +} + +/* Miniature board */ +static int style7(struct game_state_t *b, struct move_t *ml) +{ + static const char *wp[] = {" ", " P", " N", " B", " R", " Q", " K"}; + static const char *bp[] = {" -", " p", " n", " b", " r", " q", " k"}; + static char *wsqr = ""; + static char *bsqr = ""; + static char *top = "\t:::::::::::::::::::::\n"; + static char *mid = ""; + static char *start = ".."; + static char *end = " .."; + static char *label = "\t a b c d e f g h\n"; + static char *blabel = "\t h g f e d c b a\n"; + + return genstyle(b, ml, wp, bp, wsqr, bsqr, top, mid, start, end, label, blabel); +} + +/* ICS interface maker board-- raw data dump */ +static int style8(struct game_state_t *b, struct move_t *ml) +{ + char tmp[80]; + int f, r; + int ws, bs; + + board_calc_strength(b, &ws, &bs); + sprintf(tmp, "#@#%03d%-16s%s%-16s%s", b->gameNum + 1, + game_globals.garray[b->gameNum].white_name, + (orient == WHITE) ? "*" : ":", + game_globals.garray[b->gameNum].black_name, + (orient == WHITE) ? ":" : "*"); + strcat(bstring, tmp); + for (r = 0; r < 8; r++) { + for (f = 0; f < 8; f++) { + if (b->board[f][r] == NOPIECE) { + strcat(bstring, " "); + } else { + if (colorval(b->board[f][r]) == WHITE) + strcat(bstring, wpstring[piecetype(b->board[f][r])]); + else + strcat(bstring, bpstring[piecetype(b->board[f][r])]); + } + } + } + sprintf(tmp, "%03d%s%02d%02d%05d%05d%-7s(%s)@#@\n", + game_globals.garray[b->gameNum].numHalfMoves / 2 + 1, + (b->onMove == WHITE) ? "W" : "B", + ws, + bs, + (wTime + 5) / 10, + (bTime + 5) / 10, + game_globals.garray[b->gameNum].numHalfMoves ? + ml[game_globals.garray[b->gameNum].numHalfMoves - 1].algString : + "none", + game_globals.garray[b->gameNum].numHalfMoves ? + tenth_str(ml[game_globals.garray[b->gameNum].numHalfMoves - 1].tookTime, 0) : + "0:00"); + strcat(bstring, tmp); + return 0; +} + +/* last 2 moves only (previous non-verbose mode) */ +static int style9(struct game_state_t *b, struct move_t *ml) +{ + int i, count; + char tmp[80]; + int startmove; + + sprintf(tmp, "\nMove %-23s%s\n", + game_globals.garray[b->gameNum].white_name, + game_globals.garray[b->gameNum].black_name); + strcat(bstring, tmp); + sprintf(tmp, "---- -------------- --------------\n"); + strcat(bstring, tmp); + startmove = ((game_globals.garray[b->gameNum].numHalfMoves - 3) / 2) * 2; + if (startmove < 0) + startmove = 0; + for (i = startmove, count = 0; + i < game_globals.garray[b->gameNum].numHalfMoves && count < 4; + i++, count++) { + if (!(i & 0x01)) { + sprintf(tmp, " %2d ", i / 2 + 1); + strcat(bstring, tmp); + } + sprintf(tmp, "%-23s", move_and_time(&ml[i])); + strcat(bstring, tmp); + if (i & 0x01) + strcat(bstring, "\n"); + } + if (i & 0x01) + strcat(bstring, "\n"); + return 0; +} + +/* Sleator's 'new and improved' raw dump format... */ +static int style10(struct game_state_t *b, struct move_t *ml) +{ + int f, r; + char tmp[80]; + int ws, bs; + + board_calc_strength(b, &ws, &bs); + sprintf(tmp, "<10>\n"); + strcat(bstring, tmp); + for (r = 7; r >= 0; r--) { + strcat(bstring, "|"); + for (f = 0; f < 8; f++) { + if (b->board[f][r] == NOPIECE) { + strcat(bstring, " "); + } else { + if (colorval(b->board[f][r]) == WHITE) + strcat(bstring, wpstring[piecetype(b->board[f][r])]); + else + strcat(bstring, bpstring[piecetype(b->board[f][r])]); + } + } + strcat(bstring, "|\n"); + } + strcat(bstring, (b->onMove == WHITE) ? "W " : "B "); + if (game_globals.garray[b->gameNum].numHalfMoves) { + sprintf(tmp, "%d ", + ml[game_globals.garray[b->gameNum].numHalfMoves - 1].doublePawn); + } else { + sprintf(tmp, "-1 "); + } + strcat(bstring, tmp); + sprintf(tmp, "%d %d %d %d %d\n", + !(b->wkmoved || b->wkrmoved), + !(b->wkmoved || b->wqrmoved), + !(b->bkmoved || b->bkrmoved), + !(b->bkmoved || b->bqrmoved), + (game_globals.garray[b->gameNum].numHalfMoves - ((b->lastIrreversable == -1) ? 0 : + b->lastIrreversable))); + strcat(bstring, tmp); + sprintf(tmp, "%d %s %s %d %d %d %d %d %d %d %d %s (%s) %s %d\n", + b->gameNum, + game_globals.garray[b->gameNum].white_name, + game_globals.garray[b->gameNum].black_name, + myTurn, + game_globals.garray[b->gameNum].wInitTime / 600, + game_globals.garray[b->gameNum].wIncrement / 10, + ws, + bs, + (wTime + 5) / 10, + (bTime + 5) / 10, + game_globals.garray[b->gameNum].numHalfMoves / 2 + 1, + game_globals.garray[b->gameNum].numHalfMoves ? + ml[game_globals.garray[b->gameNum].numHalfMoves - 1].moveString : + "none", + game_globals.garray[b->gameNum].numHalfMoves ? + tenth_str(ml[game_globals.garray[b->gameNum].numHalfMoves - 1].tookTime, 0) : + "0:00", + game_globals.garray[b->gameNum].numHalfMoves ? + ml[game_globals.garray[b->gameNum].numHalfMoves - 1].algString : + "none", + (orient == WHITE) ? 0 : 1); + strcat(bstring, tmp); + sprintf(tmp, ">10<\n"); + strcat(bstring, tmp); + return 0; +} + +/* Same as 8, but with verbose moves ("P/e3-e4", instead of "e4") */ +static int style11(struct game_state_t *b, struct move_t *ml) +{ + char tmp[80]; + int f, r; + int ws, bs; + + board_calc_strength(b, &ws, &bs); + sprintf(tmp, "#@#%03d%-16s%s%-16s%s", b->gameNum, + game_globals.garray[b->gameNum].white_name, + (orient == WHITE) ? "*" : ":", + game_globals.garray[b->gameNum].black_name, + (orient == WHITE) ? ":" : "*"); + strcat(bstring, tmp); + for (r = 0; r < 8; r++) { + for (f = 0; f < 8; f++) { + if (b->board[f][r] == NOPIECE) { + strcat(bstring, " "); + } else { + if (colorval(b->board[f][r]) == WHITE) + strcat(bstring, wpstring[piecetype(b->board[f][r])]); + else + strcat(bstring, bpstring[piecetype(b->board[f][r])]); + } + } + } + sprintf(tmp, "%03d%s%02d%02d%05d%05d%-7s(%s)@#@\n", + game_globals.garray[b->gameNum].numHalfMoves / 2 + 1, + (b->onMove == WHITE) ? "W" : "B", + ws, + bs, + (wTime + 5) / 10, + (bTime + 5) / 10, + game_globals.garray[b->gameNum].numHalfMoves ? + ml[game_globals.garray[b->gameNum].numHalfMoves - 1].moveString : + "none", + game_globals.garray[b->gameNum].numHalfMoves ? + tenth_str(ml[game_globals.garray[b->gameNum].numHalfMoves - 1].tookTime, 0) : + "0:00"); + strcat(bstring, tmp); + return 0; +} + +/* Similar to style 10. See the "style12" help file for information */ +static int style12(struct game_state_t *b, struct move_t *ml) +{ + int f, r; + char tmp[80]; + int ws, bs; + + board_calc_strength(b, &ws, &bs); + sprintf(bstring, "<12> "); + for (r = 7; r >= 0; r--) { + for (f = 0; f < 8; f++) { + if (b->board[f][r] == NOPIECE) { + strcat(bstring, "-"); + } else { + if (colorval(b->board[f][r]) == WHITE) + strcat(bstring, wpstring[piecetype(b->board[f][r])]); + else + strcat(bstring, bpstring[piecetype(b->board[f][r])]); + } + } + strcat(bstring, " "); + } + strcat(bstring, (b->onMove == WHITE) ? "W " : "B "); + if (game_globals.garray[b->gameNum].numHalfMoves) { + sprintf(tmp, "%d ", + ml[game_globals.garray[b->gameNum].numHalfMoves - 1].doublePawn); + } else { + sprintf(tmp, "-1 "); + } + strcat(bstring, tmp); + sprintf(tmp, "%d %d %d %d %d ", + !(b->wkmoved || b->wkrmoved), + !(b->wkmoved || b->wqrmoved), + !(b->bkmoved || b->bkrmoved), + !(b->bkmoved || b->bqrmoved), + (game_globals.garray[b->gameNum].numHalfMoves - ((b->lastIrreversable == -1) ? 0 : b->lastIrreversable))); + strcat(bstring, tmp); + sprintf(tmp, "%d %s %s %d %d %d %d %d %d %d %d %s (%s) %s %d %d\n", + b->gameNum + 1, + game_globals.garray[b->gameNum].white_name, + game_globals.garray[b->gameNum].black_name, + myTurn, + game_globals.garray[b->gameNum].wInitTime / 600, + game_globals.garray[b->gameNum].wIncrement / 10, + ws, + bs, + (wTime / 10), + (bTime / 10), + game_globals.garray[b->gameNum].numHalfMoves / 2 + 1, + game_globals.garray[b->gameNum].numHalfMoves ? + ml[game_globals.garray[b->gameNum].numHalfMoves - 1].moveString : + "none", + game_globals.garray[b->gameNum].numHalfMoves ? + tenth_str(ml[game_globals.garray[b->gameNum].numHalfMoves - 1].tookTime, 0) : + "0:00", + game_globals.garray[b->gameNum].numHalfMoves ? + ml[game_globals.garray[b->gameNum].numHalfMoves - 1].algString : + "none", (orient == WHITE) ? 0 : 1, + b->moveNum > 1 ? 1 : 0); /* ticking */ + + strcat(bstring, tmp); + return 0; +} + +static int board_read_file(char *category, char *gname, struct game_state_t *gs) +{ + FILE *fp; + int c; + int onNewLine = 1; + int onColor = -1; + int onPiece = -1; + int onFile = -1; + int onRank = -1; + + fp = fopen_p("%s/%s/%s", "r", BOARD_DIR, category, gname); + if (!fp) + return 1; + + board_clear(gs); + while (!feof(fp)) { + c = fgetc(fp); + if (onNewLine) { + if (c == 'W') { + onColor = WHITE; + if (gs->onMove < 0) + gs->onMove = WHITE; + } else if (c == 'B') { + onColor = BLACK; + if (gs->onMove < 0) + gs->onMove = BLACK; + } else if (c == '#') { + while (!feof(fp) && c != '\n') + c = fgetc(fp); /* Comment line */ + continue; + } else { /* Skip any line we don't understand */ + while (!feof(fp) && c != '\n') + c = fgetc(fp); + continue; + } + onNewLine = 0; + } else { + switch (c) { + case 'P': + onPiece = PAWN; + break; + case 'R': + onPiece = ROOK; + break; + case 'N': + onPiece = KNIGHT; + break; + case 'B': + onPiece = BISHOP; + break; + case 'Q': + onPiece = QUEEN; + break; + case 'K': + onPiece = KING; + break; + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + onFile = c - 'a'; + onRank = -1; + break; + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + onRank = c - '1'; + if (onFile >= 0 && onColor >= 0 && onPiece >= 0) + gs->board[onFile][onRank] = onPiece | onColor; + break; + case '#': + while (!feof(fp) && c != '\n') + c = fgetc(fp); /* Comment line */ + case '\n': + onNewLine = 1; + onColor = -1; + onPiece = -1; + onFile = -1; + onRank = -1; + break; + default: + break; + } + } + } + fclose(fp); + return 0; +} + +#define WHITE_SQUARE 1 +#define BLACK_SQUARE 0 +#define ANY_SQUARE -1 +#define SquareColor(f, r) ((f ^ r) & 1) + +static void place_piece(board_t b, int piece, int squareColor) +{ + int r, f; + int placed = 0; + + if (iscolor(piece, BLACK)) + r = 7; + else + r = 0; + + while (!placed) { + if (squareColor == ANY_SQUARE) { + f = random() % 8; + } else { + f = (random() % 4) * 2; + if (SquareColor(f, r) != squareColor) + f++; + } + if ((b)[f][r] == NOPIECE) { + (b)[f][r] = piece; + placed = 1; + } + } +} + +static void wild_update(int style) +{ + int f, r, i; + board_t b; + + for (f = 0; f < 8; f++) + for (r = 0; r < 8; r++) + b[f][r] = NOPIECE; + for (f = 0; f < 8; f++) { + b[f][1] = W_PAWN; + b[f][6] = B_PAWN; + } + switch (style) { + case 1: + if (random() & 0x01) { + b[4][0] = W_KING; + b[3][0] = W_QUEEN; + } else { + b[3][0] = W_KING; + b[4][0] = W_QUEEN; + } + if (random() & 0x01) { + b[4][7] = B_KING; + b[3][7] = B_QUEEN; + } else { + b[3][7] = B_KING; + b[4][7] = B_QUEEN; + } + b[0][0] = b[7][0] = W_ROOK; + b[0][7] = b[7][7] = B_ROOK; + /* Must do bishops before knights to be sure opposite colored squares are + available. */ + place_piece(b, W_BISHOP, WHITE_SQUARE); + place_piece(b, W_BISHOP, BLACK_SQUARE); + place_piece(b, W_KNIGHT, ANY_SQUARE); + place_piece(b, W_KNIGHT, ANY_SQUARE); + place_piece(b, B_BISHOP, WHITE_SQUARE); + place_piece(b, B_BISHOP, BLACK_SQUARE); + place_piece(b, B_KNIGHT, ANY_SQUARE); + place_piece(b, B_KNIGHT, ANY_SQUARE); + break; + case 2: + place_piece(b, W_KING, ANY_SQUARE); + place_piece(b, W_QUEEN, ANY_SQUARE); + place_piece(b, W_ROOK, ANY_SQUARE); + place_piece(b, W_ROOK, ANY_SQUARE); + place_piece(b, W_BISHOP, ANY_SQUARE); + place_piece(b, W_BISHOP, ANY_SQUARE); + place_piece(b, W_KNIGHT, ANY_SQUARE); + place_piece(b, W_KNIGHT, ANY_SQUARE); + /* Black mirrors White */ + for (i = 0; i < 8; i++) { + b[i][7] = b[i][0] | BLACK; + } + break; + case 3: + /* Generate White king on random square plus random set of pieces */ + place_piece(b, W_KING, ANY_SQUARE); + for (i = 0; i < 8; i++) { + if (b[i][0] != W_KING) { + b[i][0] = (random() % 4) + 2; + } + } + /* Black mirrors White */ + for (i = 0; i < 8; i++) { + b[i][7] = b[i][0] | BLACK; + } + break; + case 4: + /* Generate White king on random square plus random set of pieces */ + place_piece(b, W_KING, ANY_SQUARE); + for (i = 0; i < 8; i++) { + if (b[i][0] != W_KING) { + b[i][0] = (random() % 4) + 2; + } + } + /* Black has same set of pieces, but randomly permuted, except that Black + must have the same number of bishops on white squares as White has on + black squares, and vice versa. So we must place Black's bishops first + to be sure there are enough squares left of the correct color. */ + for (i = 0; i < 8; i++) { + if (b[i][0] == W_BISHOP) { + place_piece(b, B_BISHOP, !SquareColor(i, 0)); + } + } + for (i = 0; i < 8; i++) { + if (b[i][0] != W_BISHOP) { + place_piece(b, b[i][0] | BLACK, ANY_SQUARE); + } + } + break; + default: + return; + break; + } + { + FILE *fp; + int onPiece; + + fp = fopen_p("%s/wild/%d", "w", BOARD_DIR, style); + if (!fp) { + d_printf( "CHESSD: Can't write wild style %d\n", style); + return; + } + fprintf(fp, "W:"); + onPiece = -1; + for (r = 1; r >= 0; r--) { + for (f = 0; f < 8; f++) { + if (onPiece < 0 || b[f][r] != onPiece) { + onPiece = b[f][r]; + fprintf(fp, " %s", wpstring[piecetype(b[f][r])]); + } + fprintf(fp, " %c%c", f + 'a', r + '1'); + } + } + fprintf(fp, "\nB:"); + onPiece = -1; + for (r = 6; r < 8; r++) { + for (f = 0; f < 8; f++) { + if (onPiece < 0 || b[f][r] != onPiece) { + onPiece = b[f][r]; + fprintf(fp, " %s", wpstring[piecetype(b[f][r])]); + } + fprintf(fp, " %c%c", f + 'a', r + '1'); + } + } + fprintf(fp, "\n"); + fclose(fp); + } +} + +void wild_init(void) +{ + wild_update(1); + wild_update(2); + wild_update(3); + wild_update(4); +} + diff --git a/lasker-2.2.3/src/board.h b/lasker-2.2.3/src/board.h new file mode 100644 index 0000000..051866b --- /dev/null +++ b/lasker-2.2.3/src/board.h @@ -0,0 +1,116 @@ +/* + Copyright (c) 1993 Richard V. Nash. + Copyright (C) Andrew Tridgell 2002 + + 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., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + + +#ifndef _BOARD_H +#define _BOARD_H + +#define WHITE 0x00 +#define BLACK 0x80 +#define CString( c ) ( ((c) == WHITE) ? "White" : "Black" ) +#define CToggle( c ) ( ((c) == BLACK) ? WHITE : BLACK ) + +/* These will go into an array */ + +#define NOPIECE 0x00 +#define PAWN 0x01 +#define KNIGHT 0x02 +#define BISHOP 0x03 +#define ROOK 0x04 +#define QUEEN 0x05 +#define KING 0x06 + +#define MAX_BOARD_STRING_LEGTH 1280 /* Abitrarily 80 * 16 */ +#define MAX_STYLES 13 + +#define W_PAWN (PAWN | WHITE) +#define W_KNIGHT (KNIGHT | WHITE) +#define W_BISHOP (BISHOP | WHITE) +#define W_ROOK (ROOK | WHITE) +#define W_QUEEN (QUEEN | WHITE) +#define W_KING (KING | WHITE) + +#define B_PAWN (PAWN | BLACK) +#define B_KNIGHT (KNIGHT | BLACK) +#define B_BISHOP (BISHOP | BLACK) +#define B_ROOK (ROOK | BLACK) +#define B_QUEEN (QUEEN | BLACK) +#define B_KING (KING | BLACK) + +#define isblack(p) ((p) & BLACK) +#define iswhite(p) (!isblack(p)) +#define iscolor(p,color) (((p) & BLACK) == (color)) +#define piecetype(p) ((p) & 0x7f) +#define colorval(p) ((p) & 0x80) +#define square_color(r,f) ((((r)+(f)) & 0x01) ? BLACK : WHITE) + +extern int pieceValues[7]; + +/* Treated as [file][rank] */ +typedef int board_t[8][8]; + +GENSTRUCT struct game_state_t { + int board[8][8]; + /* for bughouse */ + int holding[2][5]; + /* For castling */ + unsigned char wkmoved, wqrmoved, wkrmoved; + unsigned char bkmoved, bqrmoved, bkrmoved; + /* for ep */ + int ep_possible[2][8]; + /* For draws */ + int lastIrreversable; + int onMove; + int moveNum; + /* Game num not saved, must be restored when read */ + int gameNum; +}; + +#define ALG_DROP -2 + +/* bughouse: if a drop move, then fromFile is ALG_DROP and fromRank is piece */ + +GENSTRUCT struct move_t { + int color; + int fromFile, fromRank; + int toFile, toRank; + int pieceCaptured; + int piecePromotionTo; + int enPassant; /* 0 = no, 1=higher -1= lower */ + int doublePawn; /* Only used for board display */ + char moveString[8]; _NULLTERM + char algString[8]; _NULLTERM + unsigned char FENpos[74]; _NULLTERM + unsigned atTime; + unsigned tookTime; + + /* these are used when examining a game */ + int wTime; + int bTime; +}; + +#define MoveToHalfMove( gs ) ((((gs)->moveNum - 1) * 2) + (((gs)->onMove == WHITE) ? 0 : 1)) + +extern const char *wpstring[]; +extern const char *bpstring[]; + +/* the FEN for the default initial position */ +#define INITIAL_FEN "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w" + +#endif diff --git a/lasker-2.2.3/src/command.c b/lasker-2.2.3/src/command.c new file mode 100644 index 0000000..f779206 --- /dev/null +++ b/lasker-2.2.3/src/command.c @@ -0,0 +1,1141 @@ +/* + Copyright (c) 1993 Richard V. Nash. + Copyright (c) 2000 Dan Papasian + Copyright (C) Andrew Tridgell 2002 + + 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., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#include "includes.h" +#include "command_list.h" + +static const char *usage_dir[NUM_LANGS] = {USAGE_DIR, USAGE_SPANISH, + USAGE_FRENCH, USAGE_DANISH}; + +static int lastCommandFound = -1; + +static char *guest_name(void); +static int check_user(char *user); + +/* Copies command into comm, and returns pointer to parameters in + * parameters + */ +static int parse_command(char *com_string, + char **comm, + char **parameters) +{ + *comm = com_string; + *parameters = eatword(com_string); + if (**parameters != '\0') { + **parameters = '\0'; + (*parameters)++; + *parameters = eatwhite(*parameters); + } + if (strlen(*comm) >= MAX_COM_LENGTH) { + return COM_BADCOMMAND; + } + return COM_OK; +} + +/* numalias is the maximum number to search through */ +int alias_lookup(char *tmp, struct alias_type *alias_list, int numalias) +{ + int i; + + for (i = 0; i < numalias && alias_list[i].comm_name; i++) { + if (!strcasecmp(tmp, alias_list[i].comm_name)) + return i; + } + return -1; /* not found */ +} + +/* Puts alias substitution into alias_string */ +static void alias_substitute(struct alias_type *alias_list, int num_alias, + char *com_str, char outalias[]) +{ + char *name, *atpos; + int i; + int at_offset=0; + + /* handle punctuation commands like '+' */ + if (ispunct(*com_str)) { + int n; + for (n=0;ispunct(com_str[n]);n++) ; + name = strndup(com_str, n); + } else { + name = strndup(com_str, strcspn(com_str, " \t")); + } + com_str += strlen(name); + + while (isspace(*com_str)) com_str++; + + i = alias_lookup(name, alias_list, num_alias); + + if (i >= 0) { + free(name); + name = strdup(alias_list[i].alias); + } + + /* now substitute '@' values in name */ + while ((atpos = strchr(name+at_offset, '@'))) { + char *name2 = NULL; + asprintf(&name2, "%*.*s%s%s", + atpos-name, atpos-name, name, + com_str, + atpos+1); + if (!name2) break; + + /* try to prevent loops */ + at_offset = (atpos - name) + strlen(com_str); + + free(name); + name = name2; + } + + /* there is an implicit @ after each alias */ + if (at_offset == 0 && *com_str) { + sprintf(outalias, "%s %s", name, com_str); + } else { + strcpy(outalias, name); + } + + free(name); +} + +/* Returns pointer to command that matches */ +static int match_command(char *comm, int p) +{ + int i = 0; + int gotIt = -1; + int len = strlen(comm); + + while (command_list[i].comm_name) { + if (strncmp(command_list[i].comm_name, comm, len) == 0 && + check_admin(p, command_list[i].adminLevel)) { + if (gotIt >= 0) + return -COM_AMBIGUOUS; + gotIt = i; + } + i++; + } + + if (gotIt == -1) { + return -COM_FAILED; + } + + if (in_list(p, L_REMOVEDCOM, command_list[gotIt].comm_name)) { + pprintf(p, "Due to a bug - this command has been temporarily removed.\n"); + return -COM_FAILED; + } + lastCommandFound = gotIt; + return gotIt; +} + +/* Gets the parameters for this command */ +static int get_parameters(int command, char *parameters, param_list params) +{ + int i, parlen; + int paramLower; + char c; + static char punc[2]; + + punc[1] = '\0'; /* Holds punc parameters */ + for (i = 0; i < MAXNUMPARAMS; i++) + (params)[i].type = TYPE_NULL; /* Set all parameters to NULL */ + parlen = strlen(command_list[command].param_string); + for (i = 0; i < parlen; i++) { + c = command_list[command].param_string[i]; + if (isupper(c)) { + paramLower = 0; + c = tolower(c); + } else { + paramLower = 1; + } + switch (c) { + case 'w': + case 'o': /* word or optional word */ + parameters = eatwhite(parameters); + if (!*parameters) + return (c == 'o' ? COM_OK : COM_BADPARAMETERS); + (params)[i].val.word = parameters; + (params)[i].type = TYPE_WORD; + if (ispunct(*parameters)) { + punc[0] = *parameters; + (params)[i].val.word = punc; + parameters++; + if (*parameters && isspace(*parameters)) + parameters++; + } else { + parameters = eatword(parameters); + if (*parameters != '\0') { + *parameters = '\0'; + parameters++; + } + } + if (paramLower) + stolower((params)[i].val.word); + break; + + case 'd': + case 'p': /* optional or required integer */ + parameters = eatwhite(parameters); + if (!*parameters) + return (c == 'p' ? COM_OK : COM_BADPARAMETERS); + if (sscanf(parameters, "%d", &(params)[i].val.integer) != 1) + return COM_BADPARAMETERS; + (params)[i].type = TYPE_INT; + parameters = eatword(parameters); + if (*parameters != '\0') { + *parameters = '\0'; + parameters++; + } + break; + + case 'i': + case 'n': /* optional or required word or integer */ + parameters = eatwhite(parameters); + if (!*parameters) + return (c == 'n' ? COM_OK : COM_BADPARAMETERS); + if (sscanf(parameters, "%d", &(params)[i].val.integer) != 1) { + (params)[i].val.word = parameters; + (params)[i].type = TYPE_WORD; + } else { + (params)[i].type = TYPE_INT; + } + if (ispunct(*parameters)) { + punc[0] = *parameters; + (params)[i].val.word = punc; + (params)[i].type = TYPE_WORD; + parameters++; + if (*parameters && isspace(*parameters)) + parameters++; + } else { + parameters = eatword(parameters); + if (*parameters != '\0') { + *parameters = '\0'; + parameters++; + } + } + if ((params)[i].type == TYPE_WORD) + if (paramLower) + stolower((params)[i].val.word); + break; + + case 's': + case 't': /* optional or required string to end */ + if (!*parameters) + return (c == 't' ? COM_OK : COM_BADPARAMETERS); + (params)[i].val.string = parameters; + (params)[i].type = TYPE_STRING; + while (*parameters) + parameters = nextword(parameters); + if (paramLower) + stolower((params)[i].val.string); + break; + } + } + if (*parameters) + return COM_BADPARAMETERS; + else + return COM_OK; +} + +static void printusage(int p, char *command_str) +{ + struct player *pp = &player_globals.parray[p]; + int i, parlen, UseLang = pp->language; + int command; + char c; + + char *filenames[1000]; /* enough for all usage names */ + + if ((command = match_command(command_str, p)) < 0) { + pprintf(p, " UNKNOWN COMMAND\n"); + return; + } + +/*Usage added by DAV 11/19/95 */ + /* First lets check if we have a text usage file for it */ + + i = search_directory(usage_dir[UseLang], command_str, filenames, 1000); + if (i == 0) { /* nope none in current Lang */ + if (UseLang != LANG_DEFAULT) { + i += search_directory(usage_dir[LANG_DEFAULT], command_str, filenames, 1000); + if (i > 0) { + pprintf(p, "No usage available in %s; using %s instead.\n", + Language(UseLang), Language(LANG_DEFAULT)); + UseLang = LANG_DEFAULT; + } + } + } + + if (i != 0) { + if ((i == 1) || (!strcmp(*filenames, command_str))) { /* found it? then send */ + if (psend_file(p, usage_dir[UseLang], *filenames)) { + /* we should never reach this unless the file was just deleted */ + pprintf(p, "Usage file %s could not be found! ", *filenames); + pprintf(p, "Please inform an admin of this. Thank you.\n"); + /* no need to print 'system' usage - should never happen */ + } + pprintf(p, "\nSee '%s %s' for a complete description.\n", + ((command_list[lastCommandFound].adminLevel > ADMIN_USER) ? "ahelp" : +"help"), + command_list[lastCommandFound].comm_name); + return; + } + } + + /* print the default 'system' usage files (which aren't much help!) */ + + pprintf(p, "Usage: %s", command_list[lastCommandFound].comm_name); + + parlen = strlen(command_list[command].param_string); + for (i = 0; i < parlen; i++) { + c = command_list[command].param_string[i]; + if (isupper(c)) + c = tolower(c); + switch (c) { + case 'w': /* word */ + pprintf(p, " word"); + break; + case 'o': /* optional word */ + pprintf(p, " [word]"); + break; + case 'd': /* integer */ + pprintf(p, " integer"); + break; + case 'p': /* optional integer */ + pprintf(p, " [integer]"); + break; + case 'i': /* word or integer */ + pprintf(p, " {word, integer}"); + break; + case 'n': /* optional word or integer */ + pprintf(p, " [{word, integer}]"); + break; + case 's': /* string to end */ + pprintf(p, " string"); + break; + case 't': /* optional string to end */ + pprintf(p, " [string]"); + break; + } + } + pprintf(p, "\nSee '%s %s' for a complete description.\n", + ((command_list[lastCommandFound].adminLevel > ADMIN_USER) ? "ahelp" : +"help"), + command_list[lastCommandFound].comm_name); +} + +static int one_command(int p, char *command, char **cmd) +{ + struct player *pp = &player_globals.parray[p]; + int which_command, retval; + char *comm=NULL, *parameters=NULL; + param_list params; + + if ((retval = parse_command(command, &comm, ¶meters))) + return retval; + if (pp->game >= 0) { + if ((game_globals.garray[pp->game].status == GAME_SETUP) && (is_drop(comm))) + return COM_ISMOVE; + } + if (is_move(comm)) { + if (pp->game == -1) { + pprintf(p, "You are not playing or examining a game.\n"); + return COM_OK; + } + + if (game_globals.garray[pp->game].status == GAME_SETUP) + return COM_ISMOVE_INSETUP; + else + return COM_ISMOVE; + } + stolower(comm); /* All commands are case-insensitive */ + *cmd = comm; + if ((which_command = match_command(comm, p)) < 0) + return -which_command; + if (!check_admin(p, command_list[which_command].adminLevel)) { + return COM_RIGHTS; + } + if ((retval = get_parameters(which_command, parameters, params))) + return retval; + + if (command_list[which_command].adminLevel >= ADMIN_ADMIN) { + admin_log(pp, command, params); + } + + return command_list[which_command].comm_func(p, params); +} + +static int process_command(int p, char *com_string, char **cmd) +{ + struct player *pp = &player_globals.parray[p]; + char *tok; + char *ptr = NULL; + char astring1[MAX_STRING_LENGTH * 4]; + char astring2[MAX_STRING_LENGTH * 4]; + +#ifdef DEBUG + if (strcasecmp(pp->name, pp->login)) { + d_printf( "CHESSD: PROBLEM Name=%s, Login=%s\n", + pp->name, pp->login); + } +#endif + if (!com_string) + return COM_FAILED; +#ifdef DEBUG + d_printf( "%s, %s, %d: >%s<\n", + pp->name, pp->login, pp->socket, com_string); +#endif + + /* don't expand the alias command */ + if (strncmp(com_string, "alias ", 6) == 0) { + return one_command(p, com_string, cmd); + } + + /* don't expand the alias command */ + if (com_string[0] == '$') { + return one_command(p, eatwhite(com_string+1), cmd); + } + + alias_substitute(pp->alias_list, pp->numAlias, + com_string, astring1); + alias_substitute(g_alias_list, 999, + astring1, astring2); + +#ifdef DEBUG + if (strcmp(com_string, astring2) != 0) { + d_printf( "%s -alias-: >%s< >%s<\n", + pp->name, com_string, astring2); + } +#endif + + for (tok=strtok_r(astring2, ";", &ptr); tok; tok=strtok_r(NULL, ";", &ptr)) { + char alias_string1[MAX_STRING_LENGTH * 4]; + char alias_string2[MAX_STRING_LENGTH * 4]; + int retval; + while (isspace(*tok)) tok++; + + alias_substitute(pp->alias_list, pp->numAlias, + tok, alias_string1); + alias_substitute(g_alias_list, 999, + alias_string1, alias_string2); + +#ifdef DEBUG + if (strcmp(tok, alias_string2) != 0) { + d_printf( "%s -alias2-: >%s<\n", + pp->name, alias_string2); + } +#endif + + retval = one_command(p, alias_string2, cmd); + + /* stop on first error */ + if (retval != COM_OK) return retval; + } + + return COM_OK; +} + +static int process_login(int p, char *loginname) +{ + struct player *pp = &player_globals.parray[p]; + char loginnameii[80]; + int is_guest = 0; + + loginname = eatwhite(loginname); + + if (!*loginname) { + goto new_login; + } + + /* if 'guest' was specified then pick a random guest name */ + if (strcasecmp(loginname, config_get_tmp("GUEST_LOGIN")) == 0) { + loginname = guest_name(); + is_guest = 1; + pprintf(p,"\nCreated temporary login '%s'\n", loginname); + } + + strlcpy(loginnameii, loginname, sizeof(loginnameii)); + + if (!alphastring(loginnameii)) { + pprintf(p, "\nSorry, names can only consist of lower and upper case letters. Try again.\n"); + goto new_login; + } + if (strlen(loginnameii) < 3) { + pprintf(p, "\nA name should be at least three characters long! Try again.\n"); + goto new_login; + } + + if (strlen(loginnameii) > (MAX_LOGIN_NAME - 1)) { + pprintf(p, "\nSorry, names may be at most %d characters long. Try again.\n", + MAX_LOGIN_NAME - 1); + goto new_login; + } + + if (in_list(p, L_BAN, loginnameii)) { + pprintf(p, "\nPlayer \"%s\" is banned.\n", loginnameii); + return COM_LOGOUT; + } + + if (!in_list(p, L_ADMIN, loginnameii) && + player_count(0) >= config_get_int("MAX_PLAYER", DEFAULT_MAX_PLAYER)) { + psend_raw_file(p, MESS_DIR, MESS_FULL); + return COM_LOGOUT; + } + + if (player_read(p, loginnameii) != 0) { + if (!is_guest && + config_get_int("GUEST_PREFIX_ONLY", DEFAULT_GUEST_PREFIX_ONLY)) { + goto new_login; + } + /* they are not registered */ + strcpy(pp->name, loginnameii); + if (in_list(p, L_FILTER, dotQuad(pp->thisHost))) { + pprintf(p, "\nDue to abusive behavior, nobody from your site may login.\n"); + pprintf(p, "If you wish to use this server please email %s\n", + config_get_tmp("REGISTRATION_ADDRESS")); + pprintf(p, "Include details of a nick-name to be called here, e-mail address and your real name.\n"); + pprintf(p, "We will send a password to you. Thanks.\n"); + return COM_LOGOUT; + } + + if (player_count(0) >= config_get_int("MAX_PLAYER", DEFAULT_MAX_PLAYER) - 100) { + psend_raw_file(p, MESS_DIR, MESS_FULL_UNREG); + return COM_LOGOUT; + } + + pprintf_noformat(p, "\n\"%s\" is not a registered name. You may play unrated games as a guest.\n(After logging in, do \"help register\" for more info on how to register.)\n\nPress return to enter the FICS as \"%s\":", + loginnameii, loginnameii); + pp->status = PLAYER_PASSWORD; + turn_echo_off(pp->socket); + return COM_OK; + } + + pprintf_noformat(p, "\n\"%s\" is a registered name. If it is yours, type the password.\nIf not, just hit return to try another name.\n\npassword: ", + pp->name); + pp->status = PLAYER_PASSWORD; + turn_echo_off(pp->socket); + if (strcasecmp(loginnameii, pp->name)) { + pprintf(p, "\nYou've got a bad name field in your playerfile -- please report this to an admin!\n"); + return COM_LOGOUT; + } + + if (CheckPFlag(p, PFLAG_REG) + && (pp->fullName == NULL)) { + pprintf(p, "\nYou've got a bad playerfile -- please report this to an admin!\n"); + pprintf(p, "Your FullName is missing!"); + pprintf(p, "Please log on as an unreg until an admin can correct this.\n"); + return COM_LOGOUT; + } + if (CheckPFlag(p, PFLAG_REG) + && (pp->emailAddress == NULL)) { + pprintf(p, "\nYou've got a bad playerfile -- please report this to an admin!\n"); + pprintf(p, "Your Email address is missing\n"); + pprintf(p, "Please log on as an unreg until an admin can correct this.\n"); + return COM_LOGOUT; + } + + + return COM_OK; + +new_login: + /* give them a new prompt */ + psend_raw_file(p, MESS_DIR, MESS_LOGIN); + pprintf(p, "login: "); + return COM_OK; +} + +static void boot_out(int p, int p1) +{ + struct player *pp = &player_globals.parray[p]; + int fd; + pprintf(p, "\n **** %s is already logged in - kicking them out. ****\n", pp->name); + pprintf(p1, "**** %s has arrived - you can't both be logged in. ****\n", pp->name); + fd = player_globals.parray[p1].socket; + process_disconnection(fd); + net_close_connection(fd); +} + +static int process_password(int p, char *password) +{ + struct player *pp = &player_globals.parray[p]; + static int Current_ad; + int p1; + char salt[3]; + int fd; + struct in_addr fromHost; + int messnum; + char fname[10]; + int dummy; /* (to hold a return value) */ + + turn_echo_on(pp->socket); + + if (pp->passwd && CheckPFlag(p, PFLAG_REG)) { + salt[0] = pp->passwd[3]; + salt[1] = pp->passwd[4]; + salt[2] = '\0'; + if (strcmp(chessd_crypt(password,salt), pp->passwd)) { + fd = pp->socket; + fromHost = pp->thisHost; + if (*password) { + pprintf(p, "\n\n**** Invalid password! ****\n\n"); + d_printf("FICS (process_password): Bad password for %s [%s] [%s] [%s]\n", + pp->login, + password, + salt, + pp->passwd); + } + player_clear(p); + pp->logon_time = pp->last_command_time = time(0); + pp->status = PLAYER_LOGIN; + pp->socket = fd; + if (fd >= net_globals.no_file) + d_printf("FICS (process_password): Out of range fd!\n"); + + pp->thisHost = fromHost; + + psend_raw_file(p, MESS_DIR, MESS_LOGIN); + pprintf(p, "login: "); + return COM_OK; + } + } + for (p1 = 0; p1 < player_globals.p_num; p1++) { + if (player_globals.parray[p1].name != NULL) { + if ((!strcasecmp(pp->name, player_globals.parray[p1].name)) && (p != p1)) { + if (!CheckPFlag(p, PFLAG_REG)) { + pprintf(p, "\n*** Sorry %s is already logged in ***\n", pp->name); + return COM_LOGOUT; + } + boot_out(p, p1); + } + } + } + + if (player_ishead(p)) { + pprintf(p,"\n ** LOGGED IN AS HEAD ADMIN **\n"); + pp->adminLevel = ADMIN_GOD; + } + + news_login(p); + + if (pp->adminLevel > 0) { + psend_raw_file(p, MESS_DIR, MESS_ADMOTD); + } else { + psend_raw_file(p, MESS_DIR, MESS_MOTD); + } + if (MAX_ADVERTS >=0) { + pprintf (p, "\n"); + sprintf (fname,"%d",Current_ad); + Current_ad = (Current_ad + 1) % MAX_ADVERTS; + psend_raw_file(p, ADVERT_DIR, fname); + } + if (!pp->passwd && CheckPFlag(p, PFLAG_REG)) + pprintf(p, "\n*** You have no password. Please set one with the password command."); + if (!CheckPFlag(p, PFLAG_REG)) + psend_raw_file(p, MESS_DIR, MESS_UNREGISTERED); + pp->status = PLAYER_PROMPT; + player_write_login(p); + for (p1 = 0; p1 < player_globals.p_num; p1++) { + if (p1 == p) + continue; + if (player_globals.parray[p1].status != PLAYER_PROMPT) + continue; + if (!CheckPFlag(p1, PFLAG_PIN)) + continue; + if (player_globals.parray[p1].adminLevel > 0) { + pprintf_prompt(p1, "\n[%s (%s: %s) has connected.]\n", pp->name, + (CheckPFlag(p, PFLAG_REG) ? "R" : "U"), + dotQuad(pp->thisHost)); + } else { + pprintf_prompt(p1, "\n[%s has connected.]\n", pp->name); + } + } + pp->num_comments = player_num_comments(p); + messnum = player_num_messages(p); + + if (messnum) { + if (messnum == 1) + pprintf(p, "\nYou have 1 message.\nUse \"messages\" to display it, or \"clearmessages\" to remove it.\n"); + else + pprintf(p, "\nYou have %d messages.\nUse \"messages\" to display them, or \"clearmessages\" to remove them.\n", messnum); + } + + player_notify_present(p); + player_notify(p, "arrived", "arrival"); + showstored(p); + + if (CheckPFlag(p, PFLAG_REG) && (pp->lastHost.s_addr != 0) && + (pp->lastHost.s_addr != pp->thisHost.s_addr)) { + pprintf(p, "\nPlayer %s: Last login: %s ", pp->name, + dotQuad(pp->lastHost)); + pprintf(p, "This login: %s", dotQuad(pp->thisHost)); + } + pp->lastHost = pp->thisHost; + if (CheckPFlag(p, PFLAG_REG) && !pp->timeOfReg) + pp->timeOfReg = time(0); + pp->logon_time = pp->last_command_time = time(0); + dummy = check_and_print_shutdown(p); + pprintf_prompt(p, "\n"); + if (CheckPFlag(p, PFLAG_REG)) + announce_avail(p); + return 0; +} + +static int process_prompt(int p, char *command) +{ + struct player *pp = &player_globals.parray[p]; + int retval; + char *cmd = ""; + + command = eattailwhite(eatwhite(command)); + if (!*command) { + send_prompt(p); + return COM_OK; + } + retval = process_command(p, command, &cmd); + switch (retval) { + case COM_OK: + retval = COM_OK; + send_prompt(p); + break; + case COM_OK_NOPROMPT: + retval = COM_OK; + break; + case COM_ISMOVE: + retval = COM_OK; + + if (pp->game >= 0 && game_globals.garray[pp->game].status == GAME_ACTIVE + && pp->side == game_globals.garray[pp->game].game_state.onMove + && game_globals.garray[pp->game].flag_pending != FLAG_NONE) { + ExecuteFlagCmd(p, net_globals.con[pp->socket]); + } + + process_move(p, command); + send_prompt(p); + + break; + case COM_ISMOVE_INSETUP: + pprintf(p, "You are still setting up the position.\n"); + pprintf_prompt(p, "Type: 'setup done' when you are finished editing.\n"); + retval = COM_OK; + break; + case COM_RIGHTS: + pprintf_prompt(p, "%s: Insufficient rights.\n", cmd); + retval = COM_OK; + break; + case COM_AMBIGUOUS: +/* pprintf(p, "%s: Ambiguous command.\n", cmd); */ + { + int len = strlen(cmd); + int i = 0; + pprintf(p, "Ambiguous command. Matches:"); + while (command_list[i].comm_name) { + if (strncmp(command_list[i].comm_name, cmd, len) == 0 && + check_admin(p, command_list[i].adminLevel)) { + pprintf(p, " %s", command_list[i].comm_name); + } + i++; + } + } + pprintf_prompt(p, "\n"); + retval = COM_OK; + break; + case COM_BADPARAMETERS: + printusage(p, command_list[lastCommandFound].comm_name); + send_prompt(p); + retval = COM_OK; + break; + case COM_FAILED: + case COM_BADCOMMAND: + pprintf_prompt(p, "%s: Command not found.\n", cmd); + d_printf("Command not found [%s]\n", cmd); + retval = COM_OK; + break; + case COM_LOGOUT: + retval = COM_LOGOUT; + break; + } + return retval; +} + +/* Return 1 to disconnect */ +int process_input(int fd, char *com_string) +{ + int p = player_find(fd); + int retval = 0; + struct player *pp; + + if (p < 0) { + d_printf( "CHESSD: Input from a player not in array!\n"); + return -1; + } + + pp = &player_globals.parray[p]; + + command_globals.commanding_player = p; + pp->last_command_time = time(0); + + switch (pp->status) { + case PLAYER_EMPTY: + d_printf( "CHESSD: Command from an empty player!\n"); + break; + case PLAYER_NEW: + d_printf( "CHESSD: Command from a new player!\n"); + break; + case PLAYER_INQUEUE: + /* Ignore input from player in queue */ + break; + case PLAYER_LOGIN: + retval = process_login(p, com_string); + if (retval == COM_LOGOUT && com_string != NULL) + d_printf("%s tried to log in and failed.\n", com_string); + break; + case PLAYER_PASSWORD: + retval = process_password(p, com_string); + break; + case PLAYER_PROMPT: + FREE(pp->busy); + retval = process_prompt(p, com_string); + break; + } + + command_globals.commanding_player = -1; + return retval; +} + +int process_new_connection(int fd, struct in_addr fromHost) +{ + struct player *pp; + int p = player_new(); + + pp = &player_globals.parray[p]; + + pp->status = PLAYER_LOGIN; + if (fd >= net_globals.no_file) + d_printf("FICS (process_new_connection): Out of range fd!\n"); + + pp->socket = fd; + pp->thisHost = fromHost; + pp->logon_time = time(0); + psend_raw_file(p, MESS_DIR, MESS_WELCOME); + pprintf(p, "Head admin : %s", config_get_tmp("HEAD_ADMIN")); + pprintf(p, " Complaints to : %s\n", config_get_tmp("HEAD_ADMIN_EMAIL")); + pprintf(p, "Server location: %s", config_get_tmp("SERVER_LOCATION")); + pprintf(p, " Server version : %s\n", VERS_NUM); + pprintf(p, "Server name : %s\n", config_get_tmp("SERVER_HOSTNAME")); + psend_raw_file(p, MESS_DIR, MESS_LOGIN); + pprintf(p, "login: "); + + return 0; +} + +int process_disconnection(int fd) +{ + int p = player_find(fd); + int p1; + char command[1024]; + struct player *pp; + + if (p < 0) { + d_printf( "CHESSD: Disconnect from a player not in array!\n"); + return -1; + } + + pp = &player_globals.parray[p]; + + if (CheckPFlag(p, PFLAG_REG) && CheckPFlag(p, PFLAG_OPEN) && + pp->game < 0) + announce_notavail(p); + if ((pp->game >=0) && ((game_globals.garray[pp->game].status == GAME_EXAMINE) || (game_globals.garray[pp->game].status == GAME_SETUP))) { + pcommand(p, "unexamine"); + } + if ((pp->game >=0) && (in_list(p, L_ABUSER, pp->name) + || (game_globals.garray[pp->game].link >= 0))) + + pcommand(p, "resign"); + + if (pp->ftell != -1) + pcommand (p,"tell 0 I am logging out now - conversation forwarding stopped."); + + withdraw_seeks(p); + + if (pp->status == PLAYER_PROMPT) { + for (p1 = 0; p1 < player_globals.p_num; p1++) { + if (p1 == p) + continue; + if (player_globals.parray[p1].status != PLAYER_PROMPT) + continue; + + if (player_globals.parray[p1].ftell == p) { + player_globals.parray[p1].ftell = -1; + sprintf (command,"tell 0 *%s* has logged out - conversation forwarding stopped.",pp->name); + pcommand (p1,command); + pprintf_prompt (p1,"%s, whose tells you were forwarding has logged out.\n", + pp->name); + } + + if (!CheckPFlag(p1, PFLAG_PIN)) + continue; + pprintf_prompt(p1, "\n[%s has disconnected.]\n", pp->name); + } + player_notify(p, "departed", "departure"); + player_notify_departure(p); + player_write_logout(p); + if (CheckPFlag(p, PFLAG_REG)) { + pp->totalTime += time(0) - pp->logon_time; + player_save(p); + } else { /* delete unreg history file */ + char fname[MAX_FILENAME_SIZE]; + sprintf(fname, "%s/player_data/%c/%s.games", STATS_DIR, pp->login[0], pp->login); + unlink(fname); + } + } + player_remove(p); + return 0; +} + +/* Called every few seconds */ +int process_heartbeat(int *fd) +{ + struct tm *nowtm; + int p; + time_t now = time(0); + unsigned idle_timeout = config_get_int("IDLE_TIMEOUT", DEFAULT_IDLE_TIMEOUT); + unsigned login_timeout = config_get_int("LOGIN_TIMEOUT", DEFAULT_LOGIN_TIMEOUT); + + /* Check for timed out connections */ + for (p = 0; p < player_globals.p_num; p++) { + struct player *pp = &player_globals.parray[p]; + + if ((pp->status == PLAYER_LOGIN || + pp->status == PLAYER_PASSWORD) && + player_idle(p) > login_timeout) { + pprintf(p, "\n**** LOGIN TIMEOUT ****\n"); + *fd = pp->socket; + return COM_LOGOUT; + } + if (pp->status == PLAYER_PROMPT && + player_idle(p) > idle_timeout && + !check_admin(p, ADMIN_ADMIN) && + !in_list(p, L_TD, pp->name)) { + pprintf(p, "\n**** Auto-logout - you were idle more than %u minutes. ****\n", + idle_timeout/60); + *fd = pp->socket; + return COM_LOGOUT; + } + } + nowtm=localtime((time_t *)&now); + if (nowtm->tm_min==0) { + gics_globals.userstat.users[nowtm->tm_hour*2]=player_count(1); + save_userstat(); + } + if (nowtm->tm_min==30) { + gics_globals.userstat.users[nowtm->tm_hour*2+1]=player_count(1); + save_userstat(); + } + if (command_globals.player_high > gics_globals.userstat.usermax) { + gics_globals.userstat.usermax=command_globals.player_high; + gics_globals.userstat.usermaxtime=now; + save_userstat(); + } + if (command_globals.game_high > gics_globals.userstat.gamemax) { + gics_globals.userstat.gamemax=command_globals.game_high; + gics_globals.userstat.gamemaxtime=now; + save_userstat(); + } + + ShutHeartBeat(); + return COM_OK; +} + +/* helper function for sorting command list */ +static int command_compare(struct command_type *c1, struct command_type *c2) +{ + return strcasecmp(c1->comm_name, c2->comm_name); +} + +void commands_init(void) +{ + FILE *fp, *afp; + int i = 0; + int count=0, acount=0; + + /* sort the command list */ + qsort(command_list, + (sizeof(command_list)/sizeof(command_list[0])) - 1, + sizeof(command_list[0]), + (COMPAR_FN_T)command_compare); + + command_globals.commanding_player = -1; + + fp = fopen_s(HELP_DIR "/commands", "w"); + if (!fp) { + d_printf( "CHESSD: Could not write commands help file.\n"); + return; + } + afp = fopen_s(ADHELP_DIR "/commands", "w"); + if (!afp) { + d_printf( "CHESSD: Could not write admin commands help file.\n"); + fclose(fp); + return; + } + + while (command_list[i].comm_name) { + if (command_list[i].adminLevel >= ADMIN_ADMIN) { + fprintf(afp, "%-19s", command_list[i].comm_name); + acount++; + if (acount % 4 == 0) { + fprintf(afp,"\n"); + } + } else { + fprintf(fp, "%-19s", command_list[i].comm_name); + count++; + if (count % 4 == 0) { + fprintf(fp,"\n"); + } + } + i++; + } + + fprintf(afp,"\n"); + fprintf(fp,"\n"); + + fclose(fp); + fclose(afp); + + d_printf("CHESSD: Loaded %d commands (admin=%d normal=%d)\n", i, acount, count); +} + +/* Need to save rated games */ +void TerminateCleanup(void) +{ + int p1; + int g; + + save_userstat(); + + for (g = 0; g < game_globals.g_num; g++) { + if (game_globals.garray[g].status != GAME_ACTIVE) + continue; + if (game_globals.garray[g].rated) { + game_ended(g, WHITE, END_ADJOURN); + } + } + for (p1 = 0; p1 < player_globals.p_num; p1++) { + if (player_globals.parray[p1].status == PLAYER_EMPTY) + continue; + pprintf(p1, "\n **** Server shutting down immediately. ****\n\n"); + if (player_globals.parray[p1].status != PLAYER_PROMPT) { + close(player_globals.parray[p1].socket); + } else { + pprintf(p1, "Logging you out.\n"); + psend_raw_file(p1, MESS_DIR, MESS_LOGOUT); + player_write_logout(p1); + if (CheckPFlag(p1, PFLAG_REG)) + player_globals.parray[p1].totalTime += time(0) - player_globals.parray[p1].logon_time; + player_save(p1); + } + } + destruct_pending(); +} + +static char *guest_name(void) +{ + static char name[20]; + int found; + +#define RANDLET ((char)('A' + (random() % 26))) + srandom(time(0)); + + found = 0; + while(!found) { + snprintf(name,sizeof(name), "Guest%c%c%c%c", RANDLET, RANDLET, RANDLET, RANDLET); + found = check_user(name); + } +#undef RANDLET + return name; +} + +static int check_user(char *user) +{ + int i; + + for (i = 0; i < player_globals.p_num; i++) { + if (player_globals.parray[i].name != NULL) { + if (!strcasecmp(user, player_globals.parray[i].name)) + return 0; + } + } + return 1; +} + + +/* return the global alias list */ +const struct alias_type *alias_list_global(void) +{ + return g_alias_list; +} + +/* return a personal alias list */ +const struct alias_type *alias_list_personal(int p, int *n) +{ + struct player *pp = &player_globals.parray[p]; + + *n = pp->numAlias; + return pp->alias_list; +} + +/* + report on any missing help pages +*/ +int com_acheckhelp(int p, param_list param) +{ + int i; + int count; + + for (count=i=0; command_list[i].comm_name; i++) { + char *fname; + asprintf(&fname, "%s/%s", + command_list[i].adminLevel?ADHELP_DIR:HELP_DIR, + command_list[i].comm_name); + if (!file_exists(fname)) { + pprintf(p, "Help for command '%s' is missing%s\n", + command_list[i].comm_name, + command_list[i].adminLevel?" (admin)":""); + count++; + } + free(fname); + } + + pprintf(p, "%d commands are missing help files\n", count); + + for (count=i=0; command_list[i].comm_name; i++) { + char *fname; + asprintf(&fname, "%s/%s", USAGE_DIR, command_list[i].comm_name); + if (!file_exists(fname)) { + pprintf(p, "Usage for command '%s' is missing%s\n", + command_list[i].comm_name, + command_list[i].adminLevel?" (admin)":""); + count++; + } + free(fname); + } + + pprintf(p, "%d commands are missing usage files\n", count); + + return COM_OK; +} diff --git a/lasker-2.2.3/src/command.h b/lasker-2.2.3/src/command.h new file mode 100644 index 0000000..d736954 --- /dev/null +++ b/lasker-2.2.3/src/command.h @@ -0,0 +1,84 @@ +/* + Copyright (c) 1993 Richard V. Nash. + Copyright (c) 2000 Dan Papasian + Copyright (C) Andrew Tridgell 2002 + + 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., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#ifndef _COMMAND_H +#define _COMMAND_H + +extern const char *help_dir[NUM_LANGS]; +extern const char *usage_dir[NUM_LANGS]; + +/* Maximum length of a login name +1 */ +#define MAX_LOGIN_NAME 18 + +/* Maximum number of parameters per command */ +#define MAXNUMPARAMS 10 + +/* Maximum string length of a single command word */ +#define MAX_COM_LENGTH 50 + +/* Maximum string length of the whole command line */ +#define MAX_STRING_LENGTH 1024 + +#define COM_OK 0 +#define COM_FAILED 1 +#define COM_ISMOVE 2 +#define COM_AMBIGUOUS 3 +#define COM_BADPARAMETERS 4 +#define COM_BADCOMMAND 5 +#define COM_LOGOUT 6 +#define COM_FLUSHINPUT 7 +#define COM_RIGHTS 8 +#define COM_OK_NOPROMPT 9 +#define COM_ISMOVE_INSETUP 10 + +#define ADMIN_USER 0 +#define ADMIN_ADMIN 10 +#define ADMIN_MASTER 20 +#define ADMIN_DEMIGOD 60 +#define ADMIN_GOD 100 + +#define TYPE_NULL 0 +#define TYPE_WORD 1 +#define TYPE_STRING 2 +#define TYPE_INT 3 +typedef struct u_parameter { + int type; + union { + char *word; + char *string; + int integer; + } val; +} parameter; + +typedef parameter param_list[MAXNUMPARAMS]; + +typedef struct command_type { + char *comm_name; + char *param_string; + int (*comm_func)(); + int adminLevel; +} command_type; + +GENSTRUCT struct alias_type { + char *comm_name; + char *alias; +}; + +#endif /* _COMMAND_H */ diff --git a/lasker-2.2.3/src/command_list.h b/lasker-2.2.3/src/command_list.h new file mode 100644 index 0000000..96b819b --- /dev/null +++ b/lasker-2.2.3/src/command_list.h @@ -0,0 +1,286 @@ +/* + Copyright (c) 1993 Richard V. Nash. + Copyright (c) 2000 Dan Papasian + Copyright (C) Andrew Tridgell 2002 + + 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., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + + +#ifndef _COMMAND_LIST_H +#define _COMMAND_LIST_H + +/* + Parameter string format + w - a word + o - an optional word + d - integer + p - optional integer + i - word or integer + n - optional word or integer + s - string to end + t - optional string to end + + If the parameter option is given in lower case then the parameter is + converted to lower case before being passsed to the function. If it is + in upper case, then the parameter is passed as typed. + */ + +/* Try to keep this list in alpha order */ + + /* Name Options Functions Security */ +static struct command_type command_list[] = { + + {"abort", "", com_abort, ADMIN_USER }, + {"accept", "n", com_accept, ADMIN_USER }, + {"addlist", "ww", com_addlist, ADMIN_USER }, + {"adjourn", "", com_adjourn, ADMIN_USER }, + {"alias", "oT", com_alias, ADMIN_USER }, + {"allobservers", "n", com_allobservers, ADMIN_USER }, + {"assess", "noo", com_assess, ADMIN_USER }, + {"backward", "p", com_backward, ADMIN_USER }, + {"bell", "", com_bell, ADMIN_USER }, + {"best", "o", com_best, ADMIN_USER }, + {"bname", "O", com_bname, ADMIN_USER }, + {"boards", "o", com_boards, ADMIN_USER }, + {"bsetup", "oT", com_setup, ADMIN_USER}, +/* {"channel", "p", com_channel, ADMIN_USER }, */ + {"clearmessages", "n", com_clearmessages, ADMIN_USER }, + {"clrsquare", "w", com_clrsquare, ADMIN_USER }, + {"cshout", "S", com_cshout, ADMIN_USER }, + {"date", "", com_date, ADMIN_USER }, + {"decline", "n", com_decline, ADMIN_USER }, + {"draw", "", com_draw, ADMIN_USER }, + {"eco", "n", com_eco, ADMIN_USER }, + {"examine", "on", com_examine, ADMIN_USER }, + {"finger", "oo", com_stats, ADMIN_USER }, + {"flag", "", com_flag, ADMIN_USER }, + {"flip", "", com_flip, ADMIN_USER }, + {"fmessage", "wd", com_forwardmess, ADMIN_USER }, + {"forward", "p", com_forward, ADMIN_USER }, + {"games", "o", com_games, ADMIN_USER }, + {"getgi", "w", com_getgi, ADMIN_USER }, + {"getpi", "w", com_getpi, ADMIN_USER }, + {"goboard", "i", com_goboard, ADMIN_USER }, + {"handles", "w", com_handles, ADMIN_USER }, + {"hbest", "o", com_hbest, ADMIN_USER }, + {"help", "t", com_help, ADMIN_USER }, + {"history", "o", com_history, ADMIN_USER }, + {"hrank", "oo", com_hrank, ADMIN_USER }, + {"inchannel", "n", com_inchannel, ADMIN_USER }, + {"iset", "wS", com_iset, ADMIN_USER }, + {"it", "T", com_it, ADMIN_USER }, + {"jkill", "w", com_jkill, ADMIN_USER }, + {"journal", "o", com_journal, ADMIN_USER }, + {"jsave", "wwi", com_jsave, ADMIN_USER }, + {"kibitz", "S", com_kibitz, ADMIN_USER }, + {"limits", "", com_limits, ADMIN_USER }, + {"llogons", "", com_llogons, ADMIN_USER }, + {"logons", "o", com_logons, ADMIN_USER }, + {"mailmoves", "n", com_mailmoves, ADMIN_USER }, + {"mailoldmoves", "o", com_mailoldmoves, ADMIN_USER }, + {"mailstored", "wi", com_mailstored, ADMIN_USER }, + {"match", "wt", com_match, ADMIN_USER }, + {"rmatch", "wwt", com_rmatch, ADMIN_USER }, + {"messages", "nT", com_messages, ADMIN_USER }, + {"mexamine", "w", com_mexamine, ADMIN_USER }, + {"moretime", "d", com_moretime, ADMIN_USER }, + {"moves", "n", com_moves, ADMIN_USER }, + {"news", "o", com_news, ADMIN_USER }, + {"next", "", com_more, ADMIN_USER }, + {"observe", "n", com_observe, ADMIN_USER }, + {"oldmoves", "o", com_oldmoves, ADMIN_USER }, + {"open", "", com_open, ADMIN_USER }, + {"partner", "o", com_partner, ADMIN_USER }, + {"password", "WW", com_password, ADMIN_USER }, + {"pause", "", com_pause, ADMIN_USER }, + {"play", "d", com_play, ADMIN_USER }, + {"pending", "", com_pending, ADMIN_USER }, + {"prefresh", "", com_prefresh, ADMIN_USER }, + {"promote", "w", com_promote, ADMIN_USER }, + {"ptell", "S", com_ptell, ADMIN_USER }, + {"ptime", "", com_ptime, ADMIN_USER }, + {"qtell", "iS", com_qtell, ADMIN_USER }, + {"quit", "", com_quit, ADMIN_USER }, + {"rank", "oo", com_rank, ADMIN_USER }, + {"refresh", "n", com_refresh, ADMIN_USER }, + {"revert", "", com_revert, ADMIN_USER }, + {"resign", "o", com_resign, ADMIN_USER }, + {"say", "S", com_say, ADMIN_USER }, + {"seek", "pppp", com_seek, ADMIN_USER }, + {"unseek", "", com_unseek, ADMIN_USER }, + {"set", "wT", com_set, ADMIN_USER }, + {"shout", "T", com_shout, ADMIN_USER }, + {"showlist", "o", com_showlist, ADMIN_USER }, + {"simabort", "", com_simabort, ADMIN_USER }, + {"simallabort", "", com_simallabort,ADMIN_USER }, + {"simadjourn", "", com_simadjourn, ADMIN_USER }, + {"simalladjourn", "", com_simalladjourn,ADMIN_USER }, + {"simgames", "o", com_simgames, ADMIN_USER }, + {"simmatch", "woo", com_simmatch, ADMIN_USER }, + {"simnext", "", com_simnext, ADMIN_USER }, + {"simopen", "", com_simopen, ADMIN_USER }, + {"simpass", "", com_simpass, ADMIN_USER }, + {"simprev", "", com_simprev, ADMIN_USER }, + {"sought", "p", com_sought, ADMIN_USER }, + {"smoves", "wi", com_smoves, ADMIN_USER }, + {"sposition", "ww", com_sposition, ADMIN_USER }, + {"statistics", "", com_statistics, ADMIN_USER }, + {"stored", "o", com_stored, ADMIN_USER }, + {"style", "d", com_style, ADMIN_USER }, + {"sublist", "ww", com_sublist, ADMIN_USER }, + {"switch", "", com_switch, ADMIN_USER }, + {"takeback", "p", com_takeback, ADMIN_USER }, + {"tell", "nS", com_tell, ADMIN_USER }, + {"ltell", "wS", com_ltell, ADMIN_USER }, + {"time", "n", com_time, ADMIN_USER }, + {"tomove", "w", com_tomove, ADMIN_USER }, + {"toggle", "ww", com_togglelist, ADMIN_USER }, + {"tournset", "wd", com_tournset, ADMIN_USER }, + {"unalias", "w", com_unalias, ADMIN_USER }, + {"unexamine", "", com_unexamine, ADMIN_USER }, + {"unobserve", "n", com_unobserve, ADMIN_USER }, + {"unpause", "", com_unpause, ADMIN_USER }, + {"uptime", "", com_uptime, ADMIN_USER }, + {"variables", "o", com_variables, ADMIN_USER }, + {"whenshut", "", com_whenshut, ADMIN_USER }, + {"whisper", "S", com_whisper, ADMIN_USER }, + {"who", "T", com_who, ADMIN_USER }, + {"withdraw", "n", com_withdraw, ADMIN_USER }, + {"wname", "O", com_wname, ADMIN_USER }, + {"xtell", "wS", com_xtell, ADMIN_USER }, + {"znotify", "", com_znotify, ADMIN_USER }, + +#if 0 + {"ustat", "", com_ustat, ADMIN_USER }, +#endif + +#if 0 + {"reply", "S", com_reply, ADMIN_USER }, +#endif + {"pstat", "oo", com_pstat, ADMIN_USER }, + {"remote", "wS", com_remote, ADMIN_USER }, + + {"aconfig", "OS", com_aconfig, ADMIN_GOD }, + {"addcomment", "WS", com_addcomment, ADMIN_ADMIN }, + {"addplayer", "WWS", com_addplayer, ADMIN_ADMIN }, + {"adjudicate", "www", com_adjudicate, ADMIN_ADMIN }, + {"adump", "", com_adump, ADMIN_GOD }, + {"admin", "", com_admin, ADMIN_ADMIN }, + {"ahelp", "t", com_ahelp, ADMIN_ADMIN }, + {"acheckhelp", "", com_acheckhelp, ADMIN_ADMIN }, + {"announce", "S", com_announce, ADMIN_ADMIN }, + {"annunreg", "S", com_annunreg, ADMIN_ADMIN }, + {"anews", "o", com_anews, ADMIN_ADMIN }, + {"areload", "", com_areload, ADMIN_GOD }, + {"asetv", "wS", com_asetv, ADMIN_ADMIN }, + {"asetadmin", "wd", com_asetadmin, ADMIN_ADMIN }, + {"asetblitz", "wdpppp",com_asetblitz, ADMIN_ADMIN }, + {"asetbughouse", "wdpppp",com_asetbug, ADMIN_ADMIN }, + {"asetemail", "wO", com_asetemail, ADMIN_ADMIN }, + {"asethandle", "WW", com_asethandle, ADMIN_ADMIN }, + {"asetlight", "wdpppp",com_asetlight, ADMIN_ADMIN }, + {"asetpasswd", "wW", com_asetpasswd, ADMIN_ADMIN }, + {"asetrealname", "wT", com_asetrealname, ADMIN_ADMIN }, + {"asetstd", "wdpppp",com_asetstd, ADMIN_ADMIN }, + {"asetwild", "wdpppp",com_asetwild, ADMIN_ADMIN }, + {"cnewsi", "S", com_cnewsi, ADMIN_ADMIN }, + {"cnewsf", "dT", com_cnewsf, ADMIN_ADMIN }, + {"cnewst", "dS", com_cnewst, ADMIN_ADMIN }, + {"cnewsp", "d", com_cnewsp, ADMIN_ADMIN }, + {"cnewse", "dp", com_cnewse, ADMIN_ADMIN }, + {"cnewsd", "d", com_cnewsd, ADMIN_ADMIN }, + {"canewsi", "S", com_canewsi, ADMIN_ADMIN }, + {"canewsf", "dT", com_canewsf, ADMIN_ADMIN }, + {"canewst", "dS", com_canewst, ADMIN_ADMIN }, + {"canewsp", "d", com_canewsp, ADMIN_ADMIN }, + {"canewse", "dp", com_canewse, ADMIN_ADMIN }, + {"canewsd", "d", com_canewsd, ADMIN_ADMIN }, + {"ftell", "o", com_ftell, ADMIN_ADMIN }, + {"hideinfo", "", com_hideinfo, ADMIN_ADMIN }, + {"nuke", "w", com_nuke, ADMIN_ADMIN }, + {"pose", "wS", com_pose, ADMIN_GOD }, + {"quota", "p", com_quota, ADMIN_ADMIN }, + {"raisedead", "WO", com_raisedead, ADMIN_ADMIN }, + {"remplayer", "w", com_remplayer, ADMIN_ADMIN }, + {"rerank", "w", com_fixrank, ADMIN_ADMIN }, + {"showcomment", "w", com_showcomment, ADMIN_ADMIN }, + {"shutdown", "oT", com_shutdown, ADMIN_ADMIN }, + {"summon", "w", com_summon, ADMIN_ADMIN }, + + {NULL, NULL, NULL, ADMIN_USER} +}; + +static struct alias_type g_alias_list[] = { + {"comment", "addcomment"}, + {"setup", "bsetup"}, + {"sc", "showcomment"}, + {"b", "backward"}, + {"w", "who"}, + {"t", "tell"}, + {"m", "match"}, + {"go", "goboard"}, + {"goto", "goboard"}, + {"gonum", "goboard"}, /* dumping an obsolete command */ + {"f", "finger"}, + {"hi", "history"}, + {"a", "accept"}, + {"saa", "simallabort"}, + {"saab", "simallaabort"}, + {"sab", "simabort"}, + {"sadj", "simadjourn"}, + {"saadj", "simalladjourn"}, + {"sh", "shout"}, + {"sn", "simnext"}, + {"sp", "simprev"}, + {"vars", "variables"}, + {"g", "games"}, + {"players", "who a"}, + {"player", "who a"}, + {"p", "who a"}, + {"pl", "who a"}, + {"o", "observe"}, + {"r", "refresh"}, + {"re", "refresh"}, /* So r/re doesn't resign! */ + {"ch", "channel"}, + {"in", "inchannel"}, + {".", "tell ."}, + {",", "tell ,"}, + {"`", "tell ."}, + {"!", "shout"}, + {"I", "it"}, + {"i", "it"}, + {":", "it"}, + {"exit", "quit"}, + {"logout", "quit"}, + {"bye", "quit"}, + {"*", "kibitz"}, + {"#", "whisper"}, + {"ma", "match"}, + {"more", "next"}, + {"n", "next"}, + {"znotl", "znotify"}, + {"+", "addlist"}, + {"-", "sublist"}, + {"=", "showlist"}, + {"mam", "xtell mamer"}, + {"tom", "tell tomato"}, + {"egg", "tell eggoi"}, + {"follow", "toggle follow"}, + {"channel", "toggle channel"}, + {NULL, NULL} +}; + +#endif /* _COMMAND_LIST_H */ diff --git a/lasker-2.2.3/src/common.h b/lasker-2.2.3/src/common.h new file mode 100644 index 0000000..2c3fbd4 --- /dev/null +++ b/lasker-2.2.3/src/common.h @@ -0,0 +1,94 @@ +/* + Copyright (c) 1993 Richard V. Nash. + Copyright (c) 2000 Dan Papasian + Copyright (C) Andrew Tridgell 2002 + + 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., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + + +#ifndef _COMMON_H +#define _COMMON_H + +#ifndef MAX +#define MAX(x,y) (((x)>(y))? (x):(y)) +#endif +#ifndef MIN +#define MIN(x,y) (((x)>(y))? (y):(x)) +#endif + +#ifndef NULL +#define NULL ((void *)0) +#endif + +#define SWAP(a,b,type) {\ + type tmp; \ + tmp = (a);\ + (a) = (b);\ + (b) = tmp;\ +} + +#define ZERO_STRUCT(s) memset(&(s), 0, sizeof(s)) +#define ZERO_STRUCTP(s) memset(s, 0, sizeof(*(s))) + + +#ifdef __GNUC__ +/** Use gcc attribute to check printf fns. a1 is the 1-based index of + * the parameter containing the format, and a2 the index of the first + * argument. **/ +#define PRINTF_ATTRIBUTE(a1, a2) __attribute__ ((format (__printf__, a1, a2))) +#else +#define PRINTF_ATTRIBUTE(a1, a2) +#endif + + +/* declare some printf style functions so the compiler checks the args */ +FILE *fopen_p(const char *fmt, const char *mode, ...) PRINTF_ATTRIBUTE(1,3); +int asprintf(char **strp, const char *fmt, ...) PRINTF_ATTRIBUTE(2,3); +void d_printf(const char *fmt, ...) PRINTF_ATTRIBUTE(1,2); +int pprintf(int p, char *format,...) PRINTF_ATTRIBUTE(2,3); +int pprintf_highlight(int p, char *format,...) PRINTF_ATTRIBUTE(2,3); +int psprintf_highlight(int p, char *s, char *format,...) PRINTF_ATTRIBUTE(3,4); +int pprintf_prompt(int p, char *format,...) PRINTF_ATTRIBUTE(2,3); +int pprintf_noformat(int p, char *format,...) PRINTF_ATTRIBUTE(2,3); +int pcommand(int p, char *comstr,...) PRINTF_ATTRIBUTE(2,3); + + + +/* prototypes for replacement functions */ +#ifndef HAVE_DPRINTF +int dprintf(int fd, const char *format, ...); +#endif +#ifndef HAVE_STRNLEN +size_t strnlen(const char *s, size_t n); +#endif + +#ifndef HAVE_STRLCPY +size_t strlcpy(char *d, const char *s, size_t bufsize); +#endif +#ifndef HAVE_STRLCAT +size_t strlcat(char *d, const char *s, size_t bufsize); +#endif + +#if HAVE_COMPAR_FN_T +#define COMPAR_FN_T __compar_fn_t +#else +typedef int (*COMPAR_FN_T)(const void *, const void *); +#endif + +/* tell tdb that it can use mmap */ +#define HAVE_MMAP 1 + +#endif /* _COMMON_H */ diff --git a/lasker-2.2.3/src/comproc.c b/lasker-2.2.3/src/comproc.c new file mode 100644 index 0000000..97522e0 --- /dev/null +++ b/lasker-2.2.3/src/comproc.c @@ -0,0 +1,1347 @@ +/* + Copyright (c) 1993 Richard V. Nash. + Copyright (c) 2000 Dan Papasian + Copyright (C) Andrew Tridgell 2002 + + 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., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + + +#include "includes.h" + +const int none = 0; +const int blitz_rat = 1; +const int std_rat = 2; +const int wild_rat = 3; +const int light_rat = 4; +const int bug_rat = 5; + +int com_more(int p, param_list param) +{ + pmore_text(p); + return COM_OK; +} + +int com_quit(int p, param_list param) +{ + struct player *pp = &player_globals.parray[p]; + + /* Examined games are killed on logout */ + if ((pp->game >= 0) && + ((game_globals.garray[pp->game].status != GAME_EXAMINE) && + (game_globals.garray[pp->game].status != GAME_SETUP))) { + pprintf(p, "You can't quit while you are playing a game.\nType 'resign' to resign the game, or you can request an abort with 'abort'.\n"); + return COM_OK; + } + + psend_logoutfile(p, MESS_DIR, MESS_LOGOUT); + return COM_LOGOUT; +} + +int com_set(int p, param_list param) +{ + int result; + int which; + char *val; + + if (param[1].type == TYPE_NULL) + val = NULL; + else + val = param[1].val.string; + result = var_set(p, param[0].val.word, val, &which); + switch (result) { + case VAR_OK: + break; + case VAR_BADVAL: + pprintf(p, "Bad value given for variable %s.\n", param[0].val.word); + break; + case VAR_NOSUCH: + pprintf(p, "No such variable name %s.\n", param[0].val.word); + break; + case VAR_AMBIGUOUS: + pprintf(p, "Ambiguous variable name %s.\n", param[0].val.word); + break; + } + /* player_save(p); */ + return COM_OK; +} + +int FindPlayer(int p, char* name, int *p1, int *connected) +{ + *p1 = player_search(p, name); + if (*p1 == 0) + return 0; + if (*p1 < 0) { /* player had to be connected and will be + removed later */ + *connected = 0; + *p1 = (-*p1) - 1; + } else { + *connected = 1; + *p1 = *p1 - 1; + } + return 1; +} + +static void com_stats_andify(int *numbers, int howmany, char *dest) +{ + char tmp[10]; + + *dest = '\0'; + while (howmany--) { + sprintf(tmp, "%d", numbers[howmany]); + strcat(dest, tmp); + if (howmany > 1) + sprintf(tmp, ", "); + else if (howmany == 1) + sprintf(tmp, " and "); + else + sprintf(tmp, ".\n"); + strcat(dest, tmp); + } + return; +} + +static void com_stats_rating(char *hdr, struct statistics * stats, char *dest, long now) +{ + char tmp[100]; + + *dest = 0; + + if (stats->num == 0) return; + + sprintf(dest, "%-10s%4s %5.1f %4d %4d %4d %4d", hdr, + ratstr(stats->rating), current_sterr(stats->sterr, now-stats->ltime), + stats->win, stats->los, stats->dra, stats->num); + if (stats->whenbest) { + sprintf(tmp, " %d", stats->best); + strcat(dest, tmp); + strftime(tmp, sizeof(tmp), " (%d-%b-%Y)", localtime((time_t *) & stats->whenbest)); + strcat(dest, tmp); + } + strcat(dest, "\n"); + return; +} + +int com_stats(int p, param_list param) +{ + int g, i; + time_t t; + int p1, connected; + char line[255], tmp[255], tmp2[255]; + int numbers[MAX_OBSERVE > MAX_SIMUL ? MAX_OBSERVE : MAX_SIMUL]; + int onTime; + int showRatingsFlag, showNotesFlag; + int showCommentsFlag = 0; + long now; + + showRatingsFlag = showNotesFlag = 1; /* everything on by default */ + + if (param[0].type == TYPE_WORD) { + if (!FindPlayer(p, param[0].val.word, &p1, &connected)) + return COM_OK; + if (param[1].type == TYPE_WORD) { /* optional second parameter */ + char *c = param[1].val.word; + showRatingsFlag = showNotesFlag = 0; + while (*c != '\0') { + if (*c == 'r') { showRatingsFlag = 1; c++; } + else if (*c == 'n') { showNotesFlag = 1; c++; } + else if ((*c == 'c') && check_admin(p, ADMIN_ADMIN)) { + showCommentsFlag = 1; c++; } + else { + if (!connected) + player_remove(p1); + return COM_BADPARAMETERS; + } + } + } + } else { + p1 = p; + connected = 1; + } + + strcpy(tmp2, player_globals.parray[p1].name); + AddPlayerLists(p1, tmp2); + tmp2[17] = '\0'; + sprintf(line, "\nStatistics for %-17s", tmp2); + if ((connected) && (player_globals.parray[p1].status == PLAYER_PROMPT)) { + sprintf(tmp, "On for: %s", hms_desc(player_ontime(p1))); + strcat(line, tmp); + sprintf(tmp, " Idle: %s\n", hms_desc(player_idle(p1))); + } else { + if ((t = player_lastdisconnect(p1))) + sprintf(tmp, "(Last disconnected %s):\n", strltime(&t)); + else + sprintf(tmp, "(Never connected.)\n"); + } + strcat(line, tmp); + pprintf(p, "%s", line); + if (((player_globals.parray[p1].simul_info) != NULL) && (player_globals.parray[p1].simul_info->numBoards)) { + for (i = 0, t = 0; i < player_globals.parray[p1].simul_info->numBoards; i++) { + if ((numbers[t] = player_globals.parray[p1].simul_info->boards[i] + 1) != 0) + t++; + } + pprintf(p, "%s is giving a simul: game%s ", player_globals.parray[p1].name, ((t > 1) ? "s" : "")); + com_stats_andify(numbers, t, tmp); + pprintf(p, tmp); + } else if (player_globals.parray[p1].game >= 0) { + g = player_globals.parray[p1].game; + if (game_globals.garray[g].status == GAME_EXAMINE) { + pprintf(p, "(Examining game %d: %s vs. %s)\n", g + 1, + game_globals.garray[g].white_name, game_globals.garray[g].black_name); + } else if (game_globals.garray[g].status == GAME_SETUP) { + pprintf(p, "(Setting up game %d: %s vs. %s)\n", g + 1, + game_globals.garray[g].white_name, game_globals.garray[g].black_name); + } else { + pprintf(p, "(playing game %d: %s vs. %s)\n", g + 1, + player_globals.parray[game_globals.garray[g].white].name, player_globals.parray[game_globals.garray[g].black].name); + if (game_globals.garray[g].link >= 0) { + pprintf(p, "(partner is playing game %d: %s vs. %s)\n", game_globals.garray[g].link + 1, + player_globals.parray[game_globals.garray[game_globals.garray[g].link].white].name, + player_globals.parray[game_globals.garray[game_globals.garray[g].link].black].name); + } + } + } + if (player_globals.parray[p1].num_observe) { + for (i = 0, t = 0; i < player_globals.parray[p1].num_observe; i++) { + g = player_globals.parray[p1].observe_list[i]; + if ((g != -1) && (check_admin(p, ADMIN_ADMIN) || (game_globals.garray[g].private == 0))) + numbers[t++] = g + 1; + } + if (t) { + pprintf(p, "%s is observing game%s ", player_globals.parray[p1].name, ((t > 1) ? "s" : "")); + com_stats_andify(numbers, t, tmp); + pprintf(p, tmp); + } + } + if (player_globals.parray[p1].busy != NULL) { + pprintf(p, "(%s %s)\n", player_globals.parray[p1].name, player_globals.parray[p1].busy); + } + if (!CheckPFlag(p1, PFLAG_REG)) { + pprintf(p, "%s is NOT a registered player.\n\n", player_globals.parray[p1].name); + } else { + if (showRatingsFlag > 0) { + now = time(NULL); + pprintf(p, "\n rating RD win loss draw total best\n"); + com_stats_rating("Blitz", &player_globals.parray[p1].b_stats, tmp, now); + if (*tmp) pprintf(p, tmp); + com_stats_rating("Standard", &player_globals.parray[p1].s_stats, tmp, now); + if (*tmp) pprintf(p, tmp); + com_stats_rating("Lightning", &player_globals.parray[p1].l_stats, tmp, now); + if (*tmp) pprintf(p, tmp); + com_stats_rating("Wild", &player_globals.parray[p1].w_stats, tmp, now); + if (*tmp) pprintf(p, tmp); + com_stats_rating("Bughouse", &player_globals.parray[p1].bug_stats, tmp, now); + if (*tmp) pprintf(p, tmp); + } + } + pprintf(p, "\n"); + if (player_globals.parray[p1].adminLevel > 0) { + pprintf(p, "Admin Level: "); + switch (5*(player_globals.parray[p1].adminLevel/5)) { + case 5: + pprintf(p, "Authorized Helper Person\n"); + break; + case 10: + pprintf(p, "Administrator\n"); + break; + case 15: + pprintf(p, "Help File Librarian/Administrator\n"); + break; + case 20: + pprintf(p, "Master Administrator\n"); + break; + case 50: + pprintf(p, "Master Help File Librarian/Administrator\n"); + break; + case 60: + pprintf(p, "Assistant Super User\n"); + break; + case 100: + pprintf(p, "Super User\n"); + break; + default: + pprintf(p, "%d\n", player_globals.parray[p1].adminLevel); + break; + } + } + + if (check_admin(p, 1) && !CheckPFlag(p, PFLAG_HIDEINFO)) { + pprintf(p, "Full Name : %s\n", (player_globals.parray[p1].fullName ? player_globals.parray[p1].fullName : "(none)")); + pprintf(p, "Address : %s\n", (player_globals.parray[p1].emailAddress ? player_globals.parray[p1].emailAddress : "(none)")); + pprintf(p, "Host : %s\n", + dotQuad(connected ? player_globals.parray[p1].thisHost : player_globals.parray[p1].lastHost)); + if (CheckPFlag(p1, PFLAG_REG)) + if (player_globals.parray[p1].num_comments) + pprintf(p, "Comments : %d\n", player_globals.parray[p1].num_comments); + } else if ((p1 == p) && CheckPFlag(p1, PFLAG_REG)) + pprintf(p, "Address : %s\n", (player_globals.parray[p1].emailAddress ? player_globals.parray[p1].emailAddress : "(none)")); + + if (player_globals.parray[p1].socket != -1) { + pprintf(p, "\nTimeseal: %s\n", net_globals.con[player_globals.parray[p1].socket]->timeseal ? "yes" : "no"); + } + + if (connected && CheckPFlag(p1, PFLAG_REG) + && (p==p1 || (check_admin(p, 1) && !CheckPFlag(p, PFLAG_HIDEINFO)))) { + char *timeToStr = ctime((time_t *) &player_globals.parray[p1].timeOfReg); + + timeToStr[strlen(timeToStr)-1]='\0'; + pprintf(p, "\n"); + onTime = (time(0) - player_globals.parray[p1].logon_time) + player_globals.parray[p1].totalTime; + + pprintf(p, "Total time on-line: %s\n", hms_desc(onTime) ); + pprintf(p, "%% of life on-line: %3.1f (since %s)\n", + (double)((onTime*100)/(double)(time(0)-player_globals.parray[p1].timeOfReg)), + timeToStr); + } + + if (player_globals.parray[p1].num_plan && (showNotesFlag > 0)) { + pprintf(p, "\n"); + for (i = 0; i < player_globals.parray[p1].num_plan; i++) + pprintf(p, "%2d: %s\n", i + 1, (player_globals.parray[p1].planLines[i] != NULL) ? player_globals.parray[p1].planLines[i] : ""); + } + if (showCommentsFlag) { + pprintf(p, "\n"); + pprintf(p, "Comments for %s:\n",player_globals.parray[p1].name); + player_show_comments(p, p1); + } + if (!connected) + player_remove(p1); + return COM_OK; +} + +int com_password(int p, param_list param) +{ + struct player *pp = &player_globals.parray[p]; + char *oldpassword = param[0].val.word; + char *newpassword = param[1].val.word; + char salt[3]; + + if (!CheckPFlag(p, PFLAG_REG)) { + pprintf(p, "Setting a password is only for registered players.\n"); + return COM_OK; + } + if (pp->passwd) { + salt[0] = pp->passwd[3]; + salt[1] = pp->passwd[4]; + salt[2] = '\0'; + if (strcmp(chessd_crypt(oldpassword,salt), pp->passwd)) { + pprintf(p, "Incorrect password, password not changed!\n"); + return COM_OK; + } + free(pp->passwd); + pp->passwd = NULL; + } + salt[0] = 'a' + random() % 26; + salt[1] = 'a' + random() % 26; + salt[2] = '\0'; + pp->passwd = strdup(chessd_crypt(newpassword,salt)); + pprintf(p, "Password changed to \"%s\".\n", newpassword); + return COM_OK; +} + +int com_uptime(int p, param_list param) +{ + time_t uptime = time(0) - command_globals.startuptime; + int days = (uptime / (60*60*24)); + int hours = ((uptime % (60*60*24)) / (60*60)); + int mins = (((uptime % (60*60*24)) % (60*60)) / 60); + int secs = (((uptime % (60*60*24)) % (60*60)) % 60); + + pprintf(p, "Server location: %s Server version : %s\n", + config_get_tmp("SERVER_HOSTNAME"), VERS_NUM); + pprintf(p, "The server has been up since %s.\n", strltime(&command_globals.startuptime)); + + pprintf(p,"Up for"); + + if(days) + pprintf(p," %d day%s", days, (days == 1) ? "" : "s"); + + if(hours) + pprintf(p," %d hour%s", hours, (hours == 1) ? "" : "s"); + + if(mins) + pprintf(p," %d minute%s", mins, (mins == 1) ? "" : "s"); + + if(secs) + pprintf(p," %d second%s", secs, (secs == 1) ? "" : "s"); + + pprintf(p,".\n"); + + pprintf(p, "\nPlayer limit: %d\n", config_get_int("MAX_PLAYER", DEFAULT_MAX_PLAYER)); + pprintf(p, "\nThere are currently %d players, with a high of %d since last restart.\n", player_count(1), command_globals.player_high); + pprintf(p, "There are currently %d games, with a high of %d since last restart.\n", game_count(), command_globals.game_high); + pprintf(p, "\nCompiled on %s\n", COMP_DATE); + return COM_OK; +} + +int com_date(int p, param_list param) +{ + time_t t = time(0); + pprintf(p, "Local time - %s\n", strltime(&t)); + pprintf(p, "Greenwich time - %s\n", strgtime(&t)); + return COM_OK; +} + +static const char *inout_string[] = { + "login", "logout" +}; + +static int plogins(int p, char *fname) +{ + FILE *fp; + int inout, registered; + time_t thetime; + char loginName[MAX_LOGIN_NAME + 1]; + char ipstr[20]; + + fp = fopen_p("%s", "r", fname); + if (!fp) { + pprintf(p, "Sorry, no login information available.\n"); + return COM_OK; + } + while (!feof(fp)) { + unsigned t; + if (fscanf(fp, "%d %s %u %d %s\n", &inout, loginName, &t, + ®istered, ipstr) != 5) { + d_printf( "CHESSD: Error in login info format. %s\n", + fname); + fclose(fp); + return COM_OK; + } + thetime = (time_t)t; + pprintf(p, "%s: %-17s %-6s", strltime(&thetime), loginName, + inout_string[inout]); + if (check_admin(p, 1) && !CheckPFlag(p, PFLAG_HIDEINFO)) { + pprintf(p, " from %s\n", ipstr); + } else + pprintf(p, "\n"); + } + fclose(fp); + return COM_OK; +} + +int com_llogons(int p, param_list param) +{ + int result; + if (!CheckPFlag(p, PFLAG_REG)) { + pprintf(p,"Sorry, guest users may not use this command\n"); + return COM_OK; + } + result = plogins(p, STATS_DIR "/" STATS_LOGONS); + return result; +} + +int com_logons(int p, param_list param) +{ + struct player *pp = &player_globals.parray[p]; + char fname[MAX_FILENAME_SIZE]; + + if (param[0].type == TYPE_WORD) { + int p1, connected; + if (!FindPlayer(p, param[0].val.word, &p1, &connected)) + return COM_OK; + sprintf(fname, "%s/player_data/%c/%s.%s", + STATS_DIR, + player_globals.parray[p1].login[0], + player_globals.parray[p1].login, STATS_LOGONS); + if (!connected) + player_remove(p1); + } else { + sprintf(fname, "%s/player_data/%c/%s.%s", + STATS_DIR, + pp->login[0], + pp->login, + STATS_LOGONS); + } + return plogins(p, fname); +} + +#define WHO_OPEN 0x01 +#define WHO_CLOSED 0x02 +#define WHO_RATED 0x04 +#define WHO_UNRATED 0x08 +#define WHO_FREE 0x10 +#define WHO_PLAYING 0x20 +#define WHO_REGISTERED 0x40 +#define WHO_UNREGISTERED 0x80 +#define WHO_BUGTEAM 0x100 + +#define WHO_ALL 0xff + +void AddPlayerLists (int p1, char *ptmp) +{ + if (check_admin(p1, ADMIN_ADMIN) && CheckPFlag(p1, PFLAG_ADMINLIGHT)) + strcat(ptmp, "(*)"); + if (in_list(p1, L_COMPUTER, player_globals.parray[p1].name)) + strcat(ptmp, "(C)"); + if (in_list(p1, L_FM, player_globals.parray[p1].name)) + strcat(ptmp, "(FM)"); + if (in_list(p1, L_IM, player_globals.parray[p1].name)) + strcat(ptmp, "(IM)"); + if (in_list(p1, L_GM, player_globals.parray[p1].name)) + strcat(ptmp, "(GM)"); + if (in_list(p1, L_WGM, player_globals.parray[p1].name)) + strcat(ptmp, "(WGM)"); + if (in_list(p1, L_TD, player_globals.parray[p1].name)) + strcat(ptmp, "(TD)"); + if (in_list(p1, L_TEAMS, player_globals.parray[p1].name)) + strcat(ptmp, "(T)"); + if (in_list(p1, L_BLIND, player_globals.parray[p1].name)) + strcat(ptmp, "(B)"); +} + +static void who_terse(int p, int num, int *plist, int type) +{ + struct player *pp = &player_globals.parray[p]; + char ptmp[80 + 20]; /* for highlight */ + multicol *m = multicol_start(player_globals.parray_size); + int i; + int p1; + int rat = 0; + + /* altered DAV 3/15/95 */ + + for (i = 0; i < num; i++) { + p1 = plist[i]; + + if (type == blitz_rat) + rat = player_globals.parray[p1].b_stats.rating; + else if (type == wild_rat) + rat = player_globals.parray[p1].w_stats.rating; + else if (type == std_rat) + rat = player_globals.parray[p1].s_stats.rating; + else if (type == light_rat) + rat = player_globals.parray[p1].l_stats.rating; + else if (type == bug_rat) + rat = player_globals.parray[p1].bug_stats.rating; + + if (type == none) { + sprintf(ptmp, " "); + } else { + sprintf(ptmp, "%-4s", ratstrii(rat, p1)); + if ((player_globals.parray[p1].simul_info != NULL) && (player_globals.parray[p1].simul_info->numBoards)) + strcat(ptmp, "~"); + else if ((player_globals.parray[p1].game >= 0) && ((game_globals.garray[player_globals.parray[p1].game].status == GAME_EXAMINE) || (game_globals.garray[player_globals.parray[p1].game].status == GAME_SETUP))) + strcat(ptmp, "#"); + else if (player_globals.parray[p1].game >= 0) + strcat(ptmp, "^"); + else if (!CheckPFlag(p1, PFLAG_OPEN)) + strcat(ptmp, ":"); + else if (player_idle(p1) > 300) + strcat(ptmp, "."); + else + strcat(ptmp, " "); + } + + if (p == p1) { + psprintf_highlight(p, ptmp + strlen(ptmp), "%s", player_globals.parray[p1].name); + } else { + strcat(ptmp, player_globals.parray[p1].name); + } + + AddPlayerLists(p1, ptmp); + multicol_store(m, ptmp); + } + multicol_pprint(m, p, pp->d_width, 2); + multicol_end(m); + pprintf(p, "\n %d players displayed (of %d). (*) indicates system administrator.\n", num, player_count(1)); +} + +static void who_verbose(p, num, plist) +int p; +int num; +int plist[]; +{ + int i, p1; + char playerLine[255], tmp[255]; /* +8 for highlight */ + char p1WithAttrs[255]; + + pprintf(p, + " +---------------------------------------------------------------+\n" + ); + pprintf(p, + " | User Standard Blitz On for Idle |\n" + ); + pprintf(p, + " +---------------------------------------------------------------+\n" + ); + + for (i = 0; i < num; i++) { + p1 = plist[i]; + + strcpy(playerLine, " |"); + + if (player_globals.parray[p1].game >= 0) + sprintf(tmp, "%3d", player_globals.parray[p1].game + 1); + else + sprintf(tmp, " "); + strcat(playerLine, tmp); + + if (!CheckPFlag(p1, PFLAG_OPEN)) + sprintf(tmp, "X"); + else + sprintf(tmp, " "); + strcat(playerLine, tmp); + + if (CheckPFlag(p1, PFLAG_REG)) + if (CheckPFlag(p1, PFLAG_RATED)) { + sprintf(tmp, " "); + } else { + sprintf(tmp, "u"); + } + else + sprintf(tmp, "U"); + strcat(playerLine, tmp); + + /* Modified by hersco to include lists in 'who v.' */ + strcpy (p1WithAttrs, player_globals.parray[p1].name); + AddPlayerLists(p1, p1WithAttrs); + p1WithAttrs[17] = '\0'; + + /* Modified by DAV 3/15/95 */ + if (p == p1) { + strcpy(tmp, " "); + psprintf_highlight(p, tmp + strlen(tmp), "%-17s", p1WithAttrs); + } else { + sprintf(tmp, " %-17s", p1WithAttrs); + } + strcat(playerLine, tmp); + + sprintf(tmp, " %4s %-4s %5s ", + ratstrii(player_globals.parray[p1].s_stats.rating, p1), + ratstrii(player_globals.parray[p1].b_stats.rating, p1), + hms(player_ontime(p1), 0, 0, 0)); + strcat(playerLine, tmp); + + if (player_idle(p1) >= 60) { + sprintf(tmp, "%5s |\n", hms(player_idle(p1), 0, 0, 0)); + } else { + sprintf(tmp, " |\n"); + } + strcat(playerLine, tmp); + pprintf(p, "%s", playerLine); + } + + pprintf(p, + " | |\n" + ); + pprintf(p, + " | %3d Players Displayed |\n", + num + ); + pprintf(p, + " +---------------------------------------------------------------+\n" + ); +} + +static void who_winloss(p, num, plist) +int p; +int num; +int plist[]; +{ + int i, p1; + char playerLine[255], tmp[255]; /* for highlight */ + char p1WithAttrs[255]; + + pprintf(p, + "Name Stand win loss draw Blitz win loss draw idle\n" + ); + pprintf(p, + "---------------- ----- ------------- ----- ------------- ----\n" + ); + + for (i = 0; i < num; i++) { + playerLine[0] = '\0'; + p1 = plist[i]; + + /* Modified by hersco to include lists in 'who n.' */ + strcpy (p1WithAttrs, player_globals.parray[p1].name); + AddPlayerLists(p1, p1WithAttrs); + p1WithAttrs[17] = '\0'; + + if (p1 == p) { + psprintf_highlight(p, playerLine, "%-17s", p1WithAttrs); + } else { + sprintf(playerLine, "%-17s", p1WithAttrs); + } + sprintf(tmp, " %4s %4d %4d %4d ", + ratstrii(player_globals.parray[p1].s_stats.rating, p1), + (int) player_globals.parray[p1].s_stats.win, + (int) player_globals.parray[p1].s_stats.los, + (int) player_globals.parray[p1].s_stats.dra); + strcat(playerLine, tmp); + + sprintf(tmp, "%4s %4d %4d %4d ", + ratstrii(player_globals.parray[p1].b_stats.rating, p1), + (int) player_globals.parray[p1].b_stats.win, + (int) player_globals.parray[p1].b_stats.los, + (int) player_globals.parray[p1].b_stats.dra); + strcat(playerLine, tmp); + + if (player_idle(p1) >= 60) { + sprintf(tmp, "%5s\n", hms(player_idle(p1), 0, 0, 0)); + } else { + sprintf(tmp, " \n"); + } + strcat(playerLine, tmp); + + pprintf(p, "%s", playerLine); + } + pprintf(p, " %3d Players Displayed.\n", num); +} + +static int who_ok(int p, unsigned int sel_bits) +{ + struct player *pp = &player_globals.parray[p]; + int p2; + if (pp->status != PLAYER_PROMPT) + return 0; + if (sel_bits == WHO_ALL) + return 1; + if (sel_bits & WHO_OPEN) + if (!CheckPFlag(p, PFLAG_OPEN) || CheckPFlag(p, PFLAG_TOURNEY)) + return 0; + if (sel_bits & WHO_CLOSED) + if (CheckPFlag(p, PFLAG_OPEN)) + return 0; + if (sel_bits & WHO_RATED) + if (!CheckPFlag(p, PFLAG_RATED)) + return 0; + if (sel_bits & WHO_UNRATED) + if (CheckPFlag(p, PFLAG_RATED)) + return 0; + if (sel_bits & WHO_FREE) + if (pp->game >= 0) + return 0; + if (sel_bits & WHO_PLAYING) + if (pp->game < 0) + return 0; + if (sel_bits & WHO_REGISTERED) + if (!CheckPFlag(p, PFLAG_REG)) + return 0; + if (sel_bits & WHO_UNREGISTERED) + if (CheckPFlag(p, PFLAG_REG)) + return 0; + if (sel_bits & WHO_BUGTEAM) { + p2 = pp->partner; + if (p2 < 0 || player_globals.parray[p2].partner != p) + return 0; + } + return 1; +} + + +static int blitz_cmp(const void *pp1, const void *pp2) +{ + register int p1 = *(int *) pp1; + register int p2 = *(int *) pp2; + if (player_globals.parray[p1].status != PLAYER_PROMPT) { + if (player_globals.parray[p2].status != PLAYER_PROMPT) + return 0; + else + return -1; + } + if (player_globals.parray[p2].status != PLAYER_PROMPT) + return 1; + if (player_globals.parray[p1].b_stats.rating > player_globals.parray[p2].b_stats.rating) + return -1; + if (player_globals.parray[p1].b_stats.rating < player_globals.parray[p2].b_stats.rating) + return 1; + if (CheckPFlag(p1, PFLAG_REG) && !CheckPFlag(p2, PFLAG_REG)) + return -1; + if (!CheckPFlag(p1, PFLAG_REG) && CheckPFlag(p2, PFLAG_REG)) + return 1; + return strcmp(player_globals.parray[p1].login, player_globals.parray[p2].login); +} + +static int light_cmp(const void *pp1, const void *pp2) +{ + register int p1 = *(int *) pp1; + register int p2 = *(int *) pp2; + if (player_globals.parray[p1].status != PLAYER_PROMPT) { + if (player_globals.parray[p2].status != PLAYER_PROMPT) + return 0; + else + return -1; + } + if (player_globals.parray[p2].status != PLAYER_PROMPT) + return 1; + if (player_globals.parray[p1].l_stats.rating > player_globals.parray[p2].l_stats.rating) + return -1; + if (player_globals.parray[p1].l_stats.rating < player_globals.parray[p2].l_stats.rating) + return 1; + if (CheckPFlag(p1, PFLAG_REG) && !CheckPFlag(p2, PFLAG_REG)) + return -1; + if (!CheckPFlag(p1, PFLAG_REG) && CheckPFlag(p2, PFLAG_REG)) + return 1; + return strcmp(player_globals.parray[p1].login, player_globals.parray[p2].login); +} + +static int bug_cmp(const void *pp1, const void *pp2) +{ + register int p1 = *(int *) pp1; + register int p2 = *(int *) pp2; + if (player_globals.parray[p1].status != PLAYER_PROMPT) { + if (player_globals.parray[p2].status != PLAYER_PROMPT) + return 0; + else + return -1; + } + if (player_globals.parray[p2].status != PLAYER_PROMPT) + return 1; + if (player_globals.parray[p1].bug_stats.rating > player_globals.parray[p2].bug_stats.rating) + return -1; + if (player_globals.parray[p1].bug_stats.rating < player_globals.parray[p2].bug_stats.rating) + return 1; + if (CheckPFlag(p1, PFLAG_REG) && !CheckPFlag(p2, PFLAG_REG)) + return -1; + if (!CheckPFlag(p1, PFLAG_REG) && CheckPFlag(p2, PFLAG_REG)) + return 1; + return strcmp(player_globals.parray[p1].login, player_globals.parray[p2].login); +} + +static int stand_cmp(const void *pp1, const void *pp2) +{ + register int p1 = *(int *) pp1; + register int p2 = *(int *) pp2; + if (player_globals.parray[p1].status != PLAYER_PROMPT) { + if (player_globals.parray[p2].status != PLAYER_PROMPT) + return 0; + else + return -1; + } + if (player_globals.parray[p2].status != PLAYER_PROMPT) + return 1; + if (player_globals.parray[p1].s_stats.rating > player_globals.parray[p2].s_stats.rating) + return -1; + if (player_globals.parray[p1].s_stats.rating < player_globals.parray[p2].s_stats.rating) + return 1; + if (CheckPFlag(p1, PFLAG_REG) && !CheckPFlag(p2, PFLAG_REG)) + return -1; + if (!CheckPFlag(p1, PFLAG_REG) && CheckPFlag(p2, PFLAG_REG)) + return 1; + return strcmp(player_globals.parray[p1].login, player_globals.parray[p2].login); +} + +static int wild_cmp(const void *pp1, const void *pp2) +{ + register int p1 = *(int *) pp1; + register int p2 = *(int *) pp2; + if (player_globals.parray[p1].status != PLAYER_PROMPT) { + if (player_globals.parray[p2].status != PLAYER_PROMPT) + return 0; + else + return -1; + } + if (player_globals.parray[p2].status != PLAYER_PROMPT) + return 1; + if (player_globals.parray[p1].w_stats.rating > player_globals.parray[p2].w_stats.rating) + return -1; + if (player_globals.parray[p1].w_stats.rating < player_globals.parray[p2].w_stats.rating) + return 1; + if (CheckPFlag(p1, PFLAG_REG) && !CheckPFlag(p2, PFLAG_REG)) + return -1; + if (!CheckPFlag(p1, PFLAG_REG) && CheckPFlag(p2, PFLAG_REG)) + return 1; + return strcmp(player_globals.parray[p1].login, player_globals.parray[p2].login); +} + +static int alpha_cmp(const void *pp1, const void *pp2) +{ + register int p1 = *(int *) pp1; + register int p2 = *(int *) pp2; + if (player_globals.parray[p1].status != PLAYER_PROMPT) { + if (player_globals.parray[p2].status != PLAYER_PROMPT) + return 0; + else + return -1; + } + if (player_globals.parray[p2].status != PLAYER_PROMPT) + return 1; + return strcmp(player_globals.parray[p1].login, player_globals.parray[p2].login); +} + +static void sort_players(int *players, + int ((*cmp_func) (const void *, const void *))) +{ + int i; + + for (i = 0; i < player_globals.p_num; i++) { + players[i] = i; + } + qsort(players, player_globals.p_num, sizeof(int), cmp_func); +} + +/* This is the of the most compliclicated commands in terms of parameters */ +int com_who(int p, param_list param) +{ + struct player *pp = &player_globals.parray[p]; + int style = 0; + float stop_perc = 1.0; + float start_perc = 0; + unsigned int sel_bits = WHO_ALL; + int *sortlist, *plist; + int ((*cmp_func) (const void *, const void *)); + int startpoint; + int stoppoint; + int i, len; + int tmpI, tmpJ; + char c; + int p1, count, num_who; + int sort_type; + int total; + + sortlist = malloc(sizeof(int) * player_globals.p_num); + plist = malloc(sizeof(int) * player_globals.p_num); + + total = pp->d_time * 60 + pp->d_inc * 40; + if (total < 180) { + sort_type = light_rat; + cmp_func = light_cmp; + } else if (total >= 900) { + sort_type = std_rat; + cmp_func = stand_cmp; + } else { + sort_type = blitz_rat; + cmp_func = blitz_cmp; + } + + if (param[0].type != TYPE_NULL) { + len = strlen(param[0].val.string); + for (i = 0; i < len; i++) { + c = param[0].val.string[i]; + if (isdigit(c)) { + if (i == 0 || !isdigit(param[0].val.string[i - 1])) { + tmpI = c - '0'; + if (tmpI == 1) { + start_perc = 0.0; + stop_perc = 0.333333; + } else if (tmpI == 2) { + start_perc = 0.333333; + stop_perc = 0.6666667; + } else if (tmpI == 3) { + start_perc = 0.6666667; + stop_perc = 1.0; + } else if ((i == len - 1) || (!isdigit(param[0].val.string[i + 1]))) + goto bad_parameters; + } else { + tmpI = c - '0'; + tmpJ = param[0].val.string[i - 1] - '0'; + if (tmpI == 0) + goto bad_parameters; + if (tmpJ > tmpI) + goto bad_parameters; + start_perc = ((float) tmpJ - 1.0) / (float) tmpI; + stop_perc = ((float) tmpJ) / (float) tmpI; + } + } else { + switch (c) { + case ' ': + case '\n': + case '\t': + break; + case 'o': + if (sel_bits == WHO_ALL) + sel_bits = WHO_OPEN; + else + sel_bits |= WHO_OPEN; + break; + case 'r': + if (sel_bits == WHO_ALL) + sel_bits = WHO_RATED; + else + sel_bits |= WHO_RATED; + break; + case 'f': + if (sel_bits == WHO_ALL) + sel_bits = WHO_FREE; + else + sel_bits |= WHO_FREE; + break; + case 'a': + if (sel_bits == WHO_ALL) + sel_bits = WHO_FREE | WHO_OPEN; + else + sel_bits |= (WHO_FREE | WHO_OPEN); + break; + case 'R': + if (sel_bits == WHO_ALL) + sel_bits = WHO_REGISTERED; + else + sel_bits |= WHO_REGISTERED; + break; + case 'l': /* Sort order */ + cmp_func = alpha_cmp; + sort_type = none; + break; + case 'A': /* Sort order */ + cmp_func = alpha_cmp; + break; + case 'w': /* Sort order */ + cmp_func = wild_cmp; + sort_type = wild_rat; + break; + case 's': /* Sort order */ + cmp_func = stand_cmp; + sort_type = std_rat; + break; + case 'b': /* Sort order */ + cmp_func = blitz_cmp; + sort_type = blitz_rat; + break; + case 'L': /* Sort order */ + cmp_func = light_cmp; + sort_type = light_rat; + break; + case 't': /* format */ + style = 0; + break; + case 'v': /* format */ + style = 1; + break; + case 'n': /* format */ + style = 2; + break; + case 'U': + if (sel_bits == WHO_ALL) + sel_bits = WHO_UNREGISTERED; + else + sel_bits |= WHO_UNREGISTERED; + break; + case 'B': + if (sel_bits == WHO_ALL) + sel_bits = WHO_BUGTEAM; + else + sel_bits |= WHO_BUGTEAM; + cmp_func = bug_cmp; + sort_type = bug_rat; + break; + default: + goto bad_parameters; + } + } + } + } + sort_players(sortlist, cmp_func); + count = 0; + for (p1 = 0; p1 < player_globals.p_num; p1++) { + if (!who_ok(sortlist[p1], sel_bits)) + continue; + count++; + } + startpoint = floor((float) count * start_perc); + stoppoint = ceil((float) count * stop_perc) - 1; + num_who = 0; + count = 0; + for (p1 = 0; p1 < player_globals.p_num; p1++) { + if (!who_ok(sortlist[p1], sel_bits)) + continue; + if ((count >= startpoint) && (count <= stoppoint)) { + plist[num_who++] = sortlist[p1]; + } + count++; + } + + if (num_who == 0) { + pprintf(p, "No logged in players match the flags in your who request.\n"); + return COM_OK; + } + + switch (style) { + case 0: /* terse */ + who_terse(p, num_who, plist, sort_type); + break; + case 1: /* verbose */ + who_verbose(p, num_who, plist); + break; + case 2: /* win-loss */ + who_winloss(p, num_who, plist); + break; + default: + goto bad_parameters; + } + + return COM_OK; + +bad_parameters: + return COM_BADPARAMETERS; +} + +int com_open(int p, param_list param) +{ + int retval; + if ((retval = pcommand(p, "set open")) != COM_OK) + return retval; + else + return COM_OK_NOPROMPT; +} + +int com_simopen(int p, param_list param) +{ + int retval; + if ((retval = pcommand(p, "set simopen")) != COM_OK) + return retval; + else + return COM_OK_NOPROMPT; +} + +int com_bell(int p, param_list param) +{ + int retval; + if ((retval = pcommand(p, "set bell")) != COM_OK) + return retval; + else + return COM_OK_NOPROMPT; +} + +int com_flip(int p, param_list param) +{ + int retval; + if ((retval = pcommand(p, "set flip")) != COM_OK) + return retval; + else + return COM_OK_NOPROMPT; +} + +int com_style(int p, param_list param) +{ + int retval; + if ((retval = pcommand(p, "set style %d", param[0].val.integer)) != COM_OK) + return retval; + else + return COM_OK_NOPROMPT; +} + +int com_promote(int p, param_list param) +{ + int retval; + if ((retval = pcommand(p, "set promote %s", param[0].val.word)) != COM_OK) + return retval; + else + return COM_OK_NOPROMPT; +} + +void alias_add(int p, const char *name, const char *value) +{ + struct player *pp = &player_globals.parray[p]; + + pp->alias_list = (struct alias_type *)realloc(pp->alias_list, + sizeof(struct alias_type) * (pp->numAlias+1)); + pp->alias_list[pp->numAlias].comm_name = strdup(name); + pp->alias_list[pp->numAlias].alias = strdup(value); + pp->numAlias++; +} + + +int com_alias(int p, param_list param) +{ + struct player *pp = &player_globals.parray[p]; + int al, i; + const char *noalias[] = {"quit", "unalias", NULL}; + + if (param[0].type == TYPE_NULL) { + for (al = 0; al < pp->numAlias; al++) { + pprintf(p, "%s -> %s\n", + pp->alias_list[al].comm_name, + pp->alias_list[al].alias); + } + return COM_OK; + } + + al = alias_lookup(param[0].val.word, pp->alias_list, pp->numAlias); + if (param[1].type == TYPE_NULL) { + if (al < 0) { + pprintf(p, "You have no alias named '%s'.\n", param[0].val.word); + } else { + pprintf(p, "%s -> %s\n", + pp->alias_list[al].comm_name, + pp->alias_list[al].alias); + } + return COM_OK; + } + + if (al >= 0) { + FREE(pp->alias_list[al].alias); + pp->alias_list[al].alias = strdup(param[1].val.string); + pprintf(p, "Alias %s replaced.\n", param[0].val.string); + return COM_OK; + } + + if (pp->numAlias >= config_get_int("MAX_ALIASES", DEFAULT_MAX_ALIASES)) { + pprintf(p, "You have your maximum number of aliases.\n"); + return COM_OK; + } + + for (i=0;noalias[i];i++) { + if (strcasecmp(param[0].val.string, noalias[i]) == 0) { + pprintf(p, "Sorry, you can't alias this command.\n"); + return COM_OK; + } + } + + alias_add(p, param[0].val.word, param[1].val.string); + + pprintf(p, "Alias set.\n"); + + return COM_OK; +} + +int com_unalias(int p, param_list param) +{ + struct player *pp = &player_globals.parray[p]; + int al; + int i; + + al = alias_lookup(param[0].val.word, pp->alias_list, pp->numAlias); + if (al < 0) { + pprintf(p, "You have no alias named '%s'.\n", param[0].val.word); + return COM_OK; + } + + FREE(pp->alias_list[al].comm_name); + FREE(pp->alias_list[al].alias); + for (i = al; i < pp->numAlias-1; i++) { + pp->alias_list[i].comm_name = pp->alias_list[i+1].comm_name; + pp->alias_list[i].alias = pp->alias_list[i+1].alias; + } + pp->numAlias--; + pp->alias_list = (struct alias_type *)realloc(pp->alias_list, + sizeof(struct alias_type) * pp->numAlias); + pprintf(p,"Alias removed.\n"); + + return COM_OK; +} + + +int com_handles(int p, param_list param) +{ + char *buffer[1000]; + char pdir[MAX_FILENAME_SIZE]; + int count; + + sprintf(pdir, "%s/%c", PLAYER_DIR, param[0].val.word[0]); + count = search_directory(pdir, param[0].val.word, buffer, 1000); + pprintf(p, "Found %d names.\n", count); + if (count > 0) + display_directory(p, buffer, count); + return COM_OK; +} + +int com_getgi(int p, param_list param) +{ + int p1, g; + struct player *pp = &player_globals.parray[p]; + + if (!in_list(p, L_TD, pp->name)) { + pprintf(p, "Only TD programs are allowed to use this command.\n"); + return COM_OK; + } + if (((p1 = player_find_bylogin(param[0].val.word)) < 0) + || (!CheckPFlag(p1, PFLAG_REG))) { + /* Darkside suggested not to return anything */ + return COM_OK; + } + if (!CheckPFlag(p1, PFLAG_REG)) { + pprintf(p, "*getgi %s none none -1 -1 -1 -1 -1*\n", player_globals.parray[p1].name); + } else if (player_globals.parray[p1].game >= 0) { + g = player_globals.parray[p1].game; + if (game_globals.garray[g].status == GAME_ACTIVE) { + pprintf(p, "*getgi %s %s %s %d %d %d %d %d*\n", + player_globals.parray[p1].name, + game_globals.garray[g].white_name, + game_globals.garray[g].black_name, + g + 1, + game_globals.garray[g].wInitTime, + game_globals.garray[g].wIncrement, + game_globals.garray[g].rated, + game_globals.garray[g].private); + } else { + pprintf(p, "%s is not playing a game.\n", player_globals.parray[p1].name); + } + } else { + pprintf(p, "%s is not playing a game.\n", player_globals.parray[p1].name); + } + return COM_OK; +} + +int com_getpi(int p, param_list param) +{ + struct player *pp = &player_globals.parray[p]; + int p1; + + if (!in_list(p, L_TD, pp->name)) { + pprintf(p, "Only TD programs are allowed to use this command.\n"); + return COM_OK; + } + if (((p1 = player_find_bylogin(param[0].val.word)) < 0) + || (!CheckPFlag(p1, PFLAG_REG))) { + /* Darkside suggested not to return anything */ + return COM_OK; + } + if (!CheckPFlag(p1, PFLAG_REG)) { + pprintf(p, "*getpi %s -1 -1 -1*\n", player_globals.parray[p1].name); + } else { + pprintf(p, "*getpi %s %d %d %d %d*\n", player_globals.parray[p1].name, + player_globals.parray[p1].w_stats.rating, + player_globals.parray[p1].b_stats.rating, + player_globals.parray[p1].s_stats.rating, + player_globals.parray[p1].l_stats.rating); + } + return COM_OK; +} + +int com_limits(int p, param_list param) +{ + struct player *pp = &player_globals.parray[p]; + + pprintf(p, "\nCurrent hardcoded limits:\n"); + pprintf(p, " Max number of channels and max capacity: %d\n", MAX_CHANNELS); + pprintf(p, " Max number of channels one can be in: %d\n", MAX_INCHANNELS); + pprintf(p, " Max number of people on the notify list: %d\n", MAX_NOTIFY); + pprintf(p, " Max number of people on the censor list: %d\n", MAX_CENSOR); + pprintf(p, " Max number of people in a simul game: %d\n", MAX_SIMUL); + pprintf(p, " Max number of messages one can receive: %d\n", MAX_MESSAGES); + pprintf(p, " Min number of games to be active: %d\n", PROVISIONAL); + if (!check_admin(p, ADMIN_ADMIN) && + !titled_player(p,pp->login)) { + pprintf(p, " Size of journal (entries): %d\n", MAX_JOURNAL); + } else { + pprintf(p, " Size of journal (entries): 26\n"); + } + pprintf(p, "\nAdmin settable limits:\n"); + pprintf(p, " Shout quota gives two shouts per %d seconds.\n", seek_globals.quota_time); + return COM_OK; +} + + +int com_remote(int p, param_list param) +{ + int p1; + + if ((p1 = player_find_part_login(param[0].val.word)) < 0) { + pprintf(p, "%s is not logged in.\n", param[0].val.word); + return COM_OK; + } + if (!in_list(p1, L_REMOTE, player_globals.parray[p].login)) { + pprintf(p, "You are not in the remote list for %s\n", + player_globals.parray[p1].login); + return COM_OK; + } + pprintf(p, "Command issued as %s\n", player_globals.parray[p1].name); + pprintf(p1, "Remote command [%s] issued by %s\n", + param[1].val.string, player_globals.parray[p].name); + pcommand(p1, "%s\n", param[1].val.string); + return COM_OK; +} diff --git a/lasker-2.2.3/src/comproc.h b/lasker-2.2.3/src/comproc.h new file mode 100644 index 0000000..e69de29 diff --git a/lasker-2.2.3/src/config.c b/lasker-2.2.3/src/config.c new file mode 100644 index 0000000..3bcc99f --- /dev/null +++ b/lasker-2.2.3/src/config.c @@ -0,0 +1,218 @@ +/* + global configuration option handler for lasker chess server + + Copyright (C) Andrew Tridgell 2002 + + 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., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#include "includes.h" + +/* database for holding config info */ +static TDB_CONTEXT *config_db; + +static int config_set(const char *name, char *value); + +/* + tdb logging function, just in case something goes wrong we log database errors to stderr + */ +static void tdb_log_fn(TDB_CONTEXT *t, int level, const char *format, ...) +{ + va_list ap; + + va_start(ap, format); + vfprintf(stderr, format, ap); + va_end(ap); +} + + +/* + initialise the config database with some default values. This is only called once + on initial installation + returns 0 on success + */ +static int config_init(void) +{ + config_db = tdb_open_ex(CONFIG_DB, 0, 0, O_RDWR|O_CREAT, 0600, tdb_log_fn); + if (!config_db) { + d_printf("Failed to create the config database!\n"); + return -1; + } + + /* a few important defaults */ + config_set("DEFAULT_PROMPT", "fics% "); + config_set("GUEST_LOGIN", "guest"); + + /* this allows an initial admin connection */ + return config_set("HEAD_ADMIN", "admin"); +} + +/* close the config database */ +void config_close(void) +{ + if (!config_db) return; + tdb_close(config_db); + config_db = NULL; +} + +/* + open the config database + returns 0 on success + */ +int config_open(void) +{ + config_db = tdb_open_ex(CONFIG_DB, 0, 0, O_RDWR, 0600, tdb_log_fn); + if (!config_db && errno == ENOENT) { + return config_init(); + } + if (!config_db) { + return -1; + } + return 0; +} + +/* + fetch a value from the config database - caller must free +*/ +const char *config_get(const char *name) +{ + TDB_DATA data; + TDB_DATA key; + + key.dptr = name; + key.dsize = strlen(name)+1; + + data = tdb_fetch(config_db, key); + + /* this trick allows config variables to show up in 'aconfig' as + soon as they are used */ + if (!data.dptr && config_set(name, "NOT_CONFIGURED") == 0) { + data = tdb_fetch(config_db, key); + } + + return data.dptr; +} + + +/* + fetch an integer value from the config database, with a default value +*/ +int config_get_int(const char *name, int default_v) +{ + TDB_DATA data; + TDB_DATA key; + int v; + + key.dptr = name; + key.dsize = strlen(name)+1; + + data = tdb_fetch(config_db, key); + + /* this trick allows config variables to show up in 'aconfig' as + soon as they are used */ + if (!data.dptr) { + char *s = NULL; + data.dsize = asprintf(&s, "%d", default_v) + 1; + data.dptr = s; + tdb_store(config_db, key, data, TDB_REPLACE); + } + + v = atoi(data.dptr); + free(data.dptr); + + return v; +} + + +/* + set a configration variable. + Returns 0 on success +*/ +static int config_set(const char *name, char *value) +{ + TDB_DATA data; + TDB_DATA key; + int ret; + + key.dptr = name; + key.dsize = strlen(name)+1; + + if (strcmp(value, "-") == 0) { + return tdb_delete(config_db, key); + } + + data.dptr = value; + data.dsize = strlen(value)+1; + + ret = tdb_store(config_db, key, data, TDB_REPLACE); + return ret; +} + +/* + fetch a value from the config database - will be auto-freed on a future call + to config_get_tmp() +*/ +const char *config_get_tmp(const char *name) +{ + static const char *ret[10]; + static unsigned idx; + const char **p = &ret[idx]; + idx = (idx+1) % 10; + if (*p) { + free(*p); + } + *p = config_get(name); + return *p; +} + + +/* + dump the current config + */ +static void config_dump(int p) +{ + TDB_DATA data1, data2; + + /* looping using firstkey/nextkey is a pain ... */ + for (data1 = tdb_firstkey(config_db); + data1.dptr; + data2 = data1, + data1 = tdb_nextkey(config_db, data2), + free(data2.dptr)) { + pprintf(p, "%s = %s\n", data1.dptr, config_get_tmp(data1.dptr)); + } +} + +/* + * aconfig + * + * Usage: aconfig variable value + * + * sets the config variable 'variable' to 'value' + */ +int com_aconfig(int p, param_list param) +{ + if (param[0].type == TYPE_NULL) { + /* if no parameters are given then dump the current config */ + config_dump(p); + return COM_OK; + } + + if (config_set(param[0].val.word, param[1].val.string) != 0) { + return COM_FAILED; + } + + return COM_OK; +} diff --git a/lasker-2.2.3/src/config.h b/lasker-2.2.3/src/config.h new file mode 100644 index 0000000..f18571c --- /dev/null +++ b/lasker-2.2.3/src/config.h @@ -0,0 +1,97 @@ +/* + Copyright (c) 1993 Richard V. Nash. + Copyright (c) 2000 Dan Papasian + Copyright (C) Andrew Tridgell 2002 + + 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., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +/* Configure file locations in this include file. */ + + +#ifndef _CONFIG_H +#define _CONFIG_H + +/* CONFIGURE THIS: The port on which the server binds */ + +#define DEFAULT_PORT 5000 + +/* Which is the default language for help files, see variable.h for the + current available settings */ + +#define LANG_DEFAULT LANG_ENGLISH + + +/* CONFIGURE THESE: Locations of the data, players, and games directories */ +/* These must be absolute paths because some mail daemons may be called */ +/* from outside the pwd */ + +#define MAX_ADVERTS 24 +/* These small files are printed when users log in + They can be used for advertisements or to promote server features + MAX_ADVERTS = the number of adverts you have + They should be put in the DEFAULT_ADVERTS directory + and be labelled with the numbers 0 - MAX_ADVERTS-1 inclusive + Eg if MAX_ADVERTS is 3 then the files are 0,1,2 + + If you do not want to use the adverts feature set it to -1 +*/ + +/* define the directory that will be the root directory of FICS */ +#define FICSROOT "./" + +#define CONFIG_DB FICSROOT "config.tdb" +#define NEWS_DB FICSROOT "news.tdb" +#define LIB_DIR FICSROOT "lib" +#define ADVERT_DIR FICSROOT "data/adverts" +#define MESS_DIR FICSROOT "data/messages" +#define INDEX_DIR FICSROOT "data/index" +#define HELP_DIR FICSROOT "data/help" +#define HELP_SPANISH FICSROOT "data/Spanish" +#define HELP_FRENCH FICSROOT "data/French" +#define HELP_DANISH FICSROOT "data/Danish" +#define INFO_DIR FICSROOT "data/info" +#define ADHELP_DIR FICSROOT "data/admin" +#define USCF_DIR FICSROOT "data/uscf" +#define STATS_DIR FICSROOT "data/stats" +#define SPOOL_DIR FICSROOT "spool/mail.XXXXXX" +#define PLAYER_DIR FICSROOT "players" +#define ADJOURNED_DIR FICSROOT "games/adjourned" +#define HISTORY_DIR FICSROOT "games/history" +#define JOURNAL_DIR FICSROOT "games/journal" +#define BOARD_DIR FICSROOT "data/boards" +#define LISTS_DIR FICSROOT "data/lists" +#define BOOK_DIR FICSROOT "data/book" +#define MESS_FULL FICSROOT "data/messages/full" +#define MESS_FULL_UNREG FICSROOT "data/messages/full_unreg" +#define USAGE_DIR FICSROOT "data/usage" +#define USAGE_SPANISH FICSROOT "data/usage_spanish" +#define USAGE_FRENCH FICSROOT "data/usage_french" +#define USAGE_DANISH FICSROOT "data/usage_danish" + +/* all of these can be overridden using the 'aconfig' command */ +#define DEFAULT_MAX_PLAYER 5000 +#define DEFAULT_MAX_USER_LIST_SIZE 100 +#define DEFAULT_MAX_ALIASES 20 +#define DEFAULT_RATING 0 +#define DEFAULT_RD 350 +#define DEFAULT_TIME 2 +#define DEFAULT_INCREMENT 12 +#define DEFAULT_MAX_SOUGHT 1000 +#define DEFAULT_IDLE_TIMEOUT 3600 +#define DEFAULT_LOGIN_TIMEOUT 300 +#define DEFAULT_GUEST_PREFIX_ONLY 0 + +#endif /* _CONFIG_H */ diff --git a/lasker-2.2.3/src/configure b/lasker-2.2.3/src/configure new file mode 100755 index 0000000..074f16e --- /dev/null +++ b/lasker-2.2.3/src/configure @@ -0,0 +1,2432 @@ +#! /bin/sh + +# Guess values for system-dependent variables and create Makefiles. +# Generated automatically using autoconf version 2.13 +# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc. +# +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. + +# Defaults: +ac_help= +ac_default_prefix=/usr/local +# Any additions from configure.in: + +# Initialize some variables set by options. +# The variables have the same names as the options, with +# dashes changed to underlines. +build=NONE +cache_file=./config.cache +exec_prefix=NONE +host=NONE +no_create= +nonopt=NONE +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +target=NONE +verbose= +x_includes=NONE +x_libraries=NONE +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datadir='${prefix}/share' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +libdir='${exec_prefix}/lib' +includedir='${prefix}/include' +oldincludedir='/usr/include' +infodir='${prefix}/info' +mandir='${prefix}/man' + +# Initialize some other variables. +subdirs= +MFLAGS= MAKEFLAGS= +SHELL=${CONFIG_SHELL-/bin/sh} +# Maximum number of lines to put in a shell here document. +ac_max_here_lines=12 + +ac_prev= +for ac_option +do + + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval "$ac_prev=\$ac_option" + ac_prev= + continue + fi + + case "$ac_option" in + -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;; + *) ac_optarg= ;; + esac + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case "$ac_option" in + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir="$ac_optarg" ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build="$ac_optarg" ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file="$ac_optarg" ;; + + -datadir | --datadir | --datadi | --datad | --data | --dat | --da) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ + | --da=*) + datadir="$ac_optarg" ;; + + -disable-* | --disable-*) + ac_feature=`echo $ac_option|sed -e 's/-*disable-//'` + # Reject names that are not valid shell variable names. + if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then + { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } + fi + ac_feature=`echo $ac_feature| sed 's/-/_/g'` + eval "enable_${ac_feature}=no" ;; + + -enable-* | --enable-*) + ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'` + # Reject names that are not valid shell variable names. + if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then + { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } + fi + ac_feature=`echo $ac_feature| sed 's/-/_/g'` + case "$ac_option" in + *=*) ;; + *) ac_optarg=yes ;; + esac + eval "enable_${ac_feature}='$ac_optarg'" ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix="$ac_optarg" ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he) + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat << EOF +Usage: configure [options] [host] +Options: [defaults in brackets after descriptions] +Configuration: + --cache-file=FILE cache test results in FILE + --help print this message + --no-create do not create output files + --quiet, --silent do not print \`checking...' messages + --version print the version of autoconf that created configure +Directory and file names: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [same as prefix] + --bindir=DIR user executables in DIR [EPREFIX/bin] + --sbindir=DIR system admin executables in DIR [EPREFIX/sbin] + --libexecdir=DIR program executables in DIR [EPREFIX/libexec] + --datadir=DIR read-only architecture-independent data in DIR + [PREFIX/share] + --sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data in DIR + [PREFIX/com] + --localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var] + --libdir=DIR object code libraries in DIR [EPREFIX/lib] + --includedir=DIR C header files in DIR [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc in DIR [/usr/include] + --infodir=DIR info documentation in DIR [PREFIX/info] + --mandir=DIR man documentation in DIR [PREFIX/man] + --srcdir=DIR find the sources in DIR [configure dir or ..] + --program-prefix=PREFIX prepend PREFIX to installed program names + --program-suffix=SUFFIX append SUFFIX to installed program names + --program-transform-name=PROGRAM + run sed PROGRAM on installed program names +EOF + cat << EOF +Host type: + --build=BUILD configure for building on BUILD [BUILD=HOST] + --host=HOST configure for HOST [guessed] + --target=TARGET configure for TARGET [TARGET=HOST] +Features and packages: + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --x-includes=DIR X include files are in DIR + --x-libraries=DIR X library files are in DIR +EOF + if test -n "$ac_help"; then + echo "--enable and --with options recognized:$ac_help" + fi + exit 0 ;; + + -host | --host | --hos | --ho) + ac_prev=host ;; + -host=* | --host=* | --hos=* | --ho=*) + host="$ac_optarg" ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir="$ac_optarg" ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir="$ac_optarg" ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir="$ac_optarg" ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir="$ac_optarg" ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst \ + | --locals | --local | --loca | --loc | --lo) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* \ + | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) + localstatedir="$ac_optarg" ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir="$ac_optarg" ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir="$ac_optarg" ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix="$ac_optarg" ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix="$ac_optarg" ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix="$ac_optarg" ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name="$ac_optarg" ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir="$ac_optarg" ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir="$ac_optarg" ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site="$ac_optarg" ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir="$ac_optarg" ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir="$ac_optarg" ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target="$ac_optarg" ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers) + echo "configure generated by autoconf version 2.13" + exit 0 ;; + + -with-* | --with-*) + ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'` + # Reject names that are not valid shell variable names. + if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then + { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } + fi + ac_package=`echo $ac_package| sed 's/-/_/g'` + case "$ac_option" in + *=*) ;; + *) ac_optarg=yes ;; + esac + eval "with_${ac_package}='$ac_optarg'" ;; + + -without-* | --without-*) + ac_package=`echo $ac_option|sed -e 's/-*without-//'` + # Reject names that are not valid shell variable names. + if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then + { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } + fi + ac_package=`echo $ac_package| sed 's/-/_/g'` + eval "with_${ac_package}=no" ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes="$ac_optarg" ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries="$ac_optarg" ;; + + -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; } + ;; + + *) + if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then + echo "configure: warning: $ac_option: invalid host type" 1>&2 + fi + if test "x$nonopt" != xNONE; then + { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; } + fi + nonopt="$ac_option" + ;; + + esac +done + +if test -n "$ac_prev"; then + { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; } +fi + +trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 + +# File descriptor usage: +# 0 standard input +# 1 file creation +# 2 errors and warnings +# 3 some systems may open it to /dev/tty +# 4 used on the Kubota Titan +# 6 checking for... messages and results +# 5 compiler messages saved in config.log +if test "$silent" = yes; then + exec 6>/dev/null +else + exec 6>&1 +fi +exec 5>./config.log + +echo "\ +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. +" 1>&5 + +# Strip out --no-create and --no-recursion so they do not pile up. +# Also quote any args containing shell metacharacters. +ac_configure_args= +for ac_arg +do + case "$ac_arg" in + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c) ;; + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;; + *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*) + ac_configure_args="$ac_configure_args '$ac_arg'" ;; + *) ac_configure_args="$ac_configure_args $ac_arg" ;; + esac +done + +# NLS nuisances. +# Only set these to C if already set. These must not be set unconditionally +# because not all systems understand e.g. LANG=C (notably SCO). +# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'! +# Non-C LC_CTYPE values break the ctype check. +if test "${LANG+set}" = set; then LANG=C; export LANG; fi +if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi +if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi +if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -rf conftest* confdefs.h +# AIX cpp loses on an empty file, so make sure it contains at least a newline. +echo > confdefs.h + +# A filename unique to this package, relative to the directory that +# configure is in, which we can look for to find out if srcdir is correct. +ac_unique_file=acconfig.h + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then its parent. + ac_prog=$0 + ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'` + test "x$ac_confdir" = "x$ac_prog" && ac_confdir=. + srcdir=$ac_confdir + if test ! -r $srcdir/$ac_unique_file; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r $srcdir/$ac_unique_file; then + if test "$ac_srcdir_defaulted" = yes; then + { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; } + else + { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; } + fi +fi +srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'` + +# Prefer explicitly selected file to automatically selected ones. +if test -z "$CONFIG_SITE"; then + if test "x$prefix" != xNONE; then + CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" + else + CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" + fi +fi +for ac_site_file in $CONFIG_SITE; do + if test -r "$ac_site_file"; then + echo "loading site script $ac_site_file" + . "$ac_site_file" + fi +done + +if test -r "$cache_file"; then + echo "loading cache $cache_file" + . $cache_file +else + echo "creating cache $cache_file" + > $cache_file +fi + +ac_ext=c +# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. +ac_cpp='$CPP $CPPFLAGS' +ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' +ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' +cross_compiling=$ac_cv_prog_cc_cross + +ac_exeext= +ac_objext=o +if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then + # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu. + if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then + ac_n= ac_c=' +' ac_t=' ' + else + ac_n=-n ac_c= ac_t= + fi +else + ac_n= ac_c='\c' ac_t= +fi + + + + + +CHESSD_CFLAGS="" + +# Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:533: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + ac_cv_prog_CC="gcc" + break + fi + done + IFS="$ac_save_ifs" +fi +fi +CC="$ac_cv_prog_CC" +if test -n "$CC"; then + echo "$ac_t""$CC" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:563: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_prog_rejected=no + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + break + fi + done + IFS="$ac_save_ifs" +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# -gt 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + set dummy "$ac_dir/$ac_word" "$@" + shift + ac_cv_prog_CC="$@" + fi +fi +fi +fi +CC="$ac_cv_prog_CC" +if test -n "$CC"; then + echo "$ac_t""$CC" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + + if test -z "$CC"; then + case "`uname -s`" in + *win32* | *WIN32*) + # Extract the first word of "cl", so it can be a program name with args. +set dummy cl; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:614: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + ac_cv_prog_CC="cl" + break + fi + done + IFS="$ac_save_ifs" +fi +fi +CC="$ac_cv_prog_CC" +if test -n "$CC"; then + echo "$ac_t""$CC" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + ;; + esac + fi + test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; } +fi + +echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6 +echo "configure:646: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 + +ac_ext=c +# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. +ac_cpp='$CPP $CPPFLAGS' +ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' +ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' +cross_compiling=$ac_cv_prog_cc_cross + +cat > conftest.$ac_ext << EOF + +#line 657 "configure" +#include "confdefs.h" + +main(){return(0);} +EOF +if { (eval echo configure:662: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + ac_cv_prog_cc_works=yes + # If we can't run a trivial program, we are probably using a cross compiler. + if (./conftest; exit) 2>/dev/null; then + ac_cv_prog_cc_cross=no + else + ac_cv_prog_cc_cross=yes + fi +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + ac_cv_prog_cc_works=no +fi +rm -fr conftest* +ac_ext=c +# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. +ac_cpp='$CPP $CPPFLAGS' +ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' +ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' +cross_compiling=$ac_cv_prog_cc_cross + +echo "$ac_t""$ac_cv_prog_cc_works" 1>&6 +if test $ac_cv_prog_cc_works = no; then + { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; } +fi +echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 +echo "configure:688: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 +echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6 +cross_compiling=$ac_cv_prog_cc_cross + +echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 +echo "configure:693: checking whether we are using GNU C" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.c <&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then + ac_cv_prog_gcc=yes +else + ac_cv_prog_gcc=no +fi +fi + +echo "$ac_t""$ac_cv_prog_gcc" 1>&6 + +if test $ac_cv_prog_gcc = yes; then + GCC=yes +else + GCC= +fi + +ac_test_CFLAGS="${CFLAGS+set}" +ac_save_CFLAGS="$CFLAGS" +CFLAGS= +echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 +echo "configure:721: checking whether ${CC-cc} accepts -g" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + echo 'void f(){}' > conftest.c +if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then + ac_cv_prog_cc_g=yes +else + ac_cv_prog_cc_g=no +fi +rm -f conftest* + +fi + +echo "$ac_t""$ac_cv_prog_cc_g" 1>&6 +if test "$ac_test_CFLAGS" = set; then + CFLAGS="$ac_save_CFLAGS" +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi + +echo $ac_n "checking whether ln -s works""... $ac_c" 1>&6 +echo "configure:753: checking whether ln -s works" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_LN_S'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + rm -f conftestdata +if ln -s X conftestdata 2>/dev/null +then + rm -f conftestdata + ac_cv_prog_LN_S="ln -s" +else + ac_cv_prog_LN_S=ln +fi +fi +LN_S="$ac_cv_prog_LN_S" +if test "$ac_cv_prog_LN_S" = "ln -s"; then + echo "$ac_t""yes" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + +ac_aux_dir= +for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do + if test -f $ac_dir/install-sh; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" + break + elif test -f $ac_dir/install.sh; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break + fi +done +if test -z "$ac_aux_dir"; then + { echo "configure: error: can not find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." 1>&2; exit 1; } +fi +ac_config_guess=$ac_aux_dir/config.guess +ac_config_sub=$ac_aux_dir/config.sub +ac_configure=$ac_aux_dir/configure # This should be Cygnus configure. + +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# ./install, which can be erroneously created by make from ./install.sh. +echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6 +echo "configure:804: checking for a BSD compatible install" >&5 +if test -z "$INSTALL"; then +if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + IFS="${IFS= }"; ac_save_IFS="$IFS"; IFS=":" + for ac_dir in $PATH; do + # Account for people who put trailing slashes in PATH elements. + case "$ac_dir/" in + /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + if test -f $ac_dir/$ac_prog; then + if test $ac_prog = install && + grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + else + ac_cv_path_install="$ac_dir/$ac_prog -c" + break 2 + fi + fi + done + ;; + esac + done + IFS="$ac_save_IFS" + +fi + if test "${ac_cv_path_install+set}" = set; then + INSTALL="$ac_cv_path_install" + else + # As a last resort, use the slow shell script. We don't cache a + # path for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the path is relative. + INSTALL="$ac_install_sh" + fi +fi +echo "$ac_t""$INSTALL" 1>&6 + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + + +echo $ac_n "checking for main in -lm""... $ac_c" 1>&6 +echo "configure:858: checking for main in -lm" >&5 +ac_lib_var=`echo m'_'main | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-lm $LIBS" +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + ac_tr_lib=HAVE_LIB`echo m | sed -e 's/[^a-zA-Z0-9_]/_/g' \ + -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'` + cat >> confdefs.h <&6 +fi + + +ac_header_dirent=no +for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h +do +ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` +echo $ac_n "checking for $ac_hdr that defines DIR""... $ac_c" 1>&6 +echo "configure:906: checking for $ac_hdr that defines DIR" >&5 +if eval "test \"`echo '$''{'ac_cv_header_dirent_$ac_safe'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +#include <$ac_hdr> +int main() { +DIR *dirp = 0; +; return 0; } +EOF +if { (eval echo configure:919: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + eval "ac_cv_header_dirent_$ac_safe=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_header_dirent_$ac_safe=no" +fi +rm -f conftest* +fi +if eval "test \"`echo '$ac_cv_header_dirent_'$ac_safe`\" = yes"; then + echo "$ac_t""yes" 1>&6 + ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` + cat >> confdefs.h <&6 +fi +done +# Two versions of opendir et al. are in -ldir and -lx on SCO Xenix. +if test $ac_header_dirent = dirent.h; then +echo $ac_n "checking for opendir in -ldir""... $ac_c" 1>&6 +echo "configure:944: checking for opendir in -ldir" >&5 +ac_lib_var=`echo dir'_'opendir | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-ldir $LIBS" +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + LIBS="$LIBS -ldir" +else + echo "$ac_t""no" 1>&6 +fi + +else +echo $ac_n "checking for opendir in -lx""... $ac_c" 1>&6 +echo "configure:985: checking for opendir in -lx" >&5 +ac_lib_var=`echo x'_'opendir | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-lx $LIBS" +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + LIBS="$LIBS -lx" +else + echo "$ac_t""no" 1>&6 +fi + +fi + +echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6 +echo "configure:1027: checking how to run the C preprocessor" >&5 +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then +if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + # This must be in double quotes, not single quotes, because CPP may get + # substituted into the Makefile and "${CC-cc}" will confuse make. + CPP="${CC-cc} -E" + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. + cat > conftest.$ac_ext < +Syntax Error +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:1048: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + : +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + CPP="${CC-cc} -E -traditional-cpp" + cat > conftest.$ac_ext < +Syntax Error +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:1065: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + : +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + CPP="${CC-cc} -nologo -E" + cat > conftest.$ac_ext < +Syntax Error +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:1082: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + : +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + CPP=/lib/cpp +fi +rm -f conftest* +fi +rm -f conftest* +fi +rm -f conftest* + ac_cv_prog_CPP="$CPP" +fi + CPP="$ac_cv_prog_CPP" +else + ac_cv_prog_CPP="$CPP" +fi +echo "$ac_t""$CPP" 1>&6 + +echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6 +echo "configure:1107: checking for ANSI C header files" >&5 +if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +#include +#include +#include +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:1120: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + rm -rf conftest* + ac_cv_header_stdc=yes +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + ac_cv_header_stdc=no +fi +rm -f conftest* + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. +cat > conftest.$ac_ext < +EOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + egrep "memchr" >/dev/null 2>&1; then + : +else + rm -rf conftest* + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. +cat > conftest.$ac_ext < +EOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + egrep "free" >/dev/null 2>&1; then + : +else + rm -rf conftest* + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. +if test "$cross_compiling" = yes; then + : +else + cat > conftest.$ac_ext < +#define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +#define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int main () { int i; for (i = 0; i < 256; i++) +if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2); +exit (0); } + +EOF +if { (eval echo configure:1187: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +then + : +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -fr conftest* + ac_cv_header_stdc=no +fi +rm -fr conftest* +fi + +fi +fi + +echo "$ac_t""$ac_cv_header_stdc" 1>&6 +if test $ac_cv_header_stdc = yes; then + cat >> confdefs.h <<\EOF +#define STDC_HEADERS 1 +EOF + +fi + +echo $ac_n "checking for sys/wait.h that is POSIX.1 compatible""... $ac_c" 1>&6 +echo "configure:1211: checking for sys/wait.h that is POSIX.1 compatible" >&5 +if eval "test \"`echo '$''{'ac_cv_header_sys_wait_h'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +#include +#ifndef WEXITSTATUS +#define WEXITSTATUS(stat_val) ((unsigned)(stat_val) >> 8) +#endif +#ifndef WIFEXITED +#define WIFEXITED(stat_val) (((stat_val) & 255) == 0) +#endif +int main() { +int s; +wait (&s); +s = WIFEXITED (s) ? WEXITSTATUS (s) : 1; +; return 0; } +EOF +if { (eval echo configure:1232: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + ac_cv_header_sys_wait_h=yes +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + ac_cv_header_sys_wait_h=no +fi +rm -f conftest* +fi + +echo "$ac_t""$ac_cv_header_sys_wait_h" 1>&6 +if test $ac_cv_header_sys_wait_h = yes; then + cat >> confdefs.h <<\EOF +#define HAVE_SYS_WAIT_H 1 +EOF + +fi + +for ac_hdr in fcntl.h strings.h sys/file.h sys/ioctl.h sys/md5.h sys/time.h unistd.h +do +ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` +echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 +echo "configure:1256: checking for $ac_hdr" >&5 +if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:1266: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + rm -rf conftest* + eval "ac_cv_header_$ac_safe=yes" +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_header_$ac_safe=no" +fi +rm -f conftest* +fi +if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then + echo "$ac_t""yes" 1>&6 + ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` + cat >> confdefs.h <&6 +fi +done + + +echo $ac_n "checking for working const""... $ac_c" 1>&6 +echo "configure:1294: checking for working const" >&5 +if eval "test \"`echo '$''{'ac_cv_c_const'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext <j = 5; +} +{ /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ + const int foo = 10; +} + +; return 0; } +EOF +if { (eval echo configure:1348: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + ac_cv_c_const=yes +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + ac_cv_c_const=no +fi +rm -f conftest* +fi + +echo "$ac_t""$ac_cv_c_const" 1>&6 +if test $ac_cv_c_const = no; then + cat >> confdefs.h <<\EOF +#define const +EOF + +fi + +echo $ac_n "checking for size_t""... $ac_c" 1>&6 +echo "configure:1369: checking for size_t" >&5 +if eval "test \"`echo '$''{'ac_cv_type_size_t'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +#if STDC_HEADERS +#include +#include +#endif +EOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + egrep "(^|[^a-zA-Z_0-9])size_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then + rm -rf conftest* + ac_cv_type_size_t=yes +else + rm -rf conftest* + ac_cv_type_size_t=no +fi +rm -f conftest* + +fi +echo "$ac_t""$ac_cv_type_size_t" 1>&6 +if test $ac_cv_type_size_t = no; then + cat >> confdefs.h <<\EOF +#define size_t unsigned +EOF + +fi + +echo $ac_n "checking whether time.h and sys/time.h may both be included""... $ac_c" 1>&6 +echo "configure:1402: checking whether time.h and sys/time.h may both be included" >&5 +if eval "test \"`echo '$''{'ac_cv_header_time'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +#include +#include +int main() { +struct tm *tp; +; return 0; } +EOF +if { (eval echo configure:1416: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + ac_cv_header_time=yes +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + ac_cv_header_time=no +fi +rm -f conftest* +fi + +echo "$ac_t""$ac_cv_header_time" 1>&6 +if test $ac_cv_header_time = yes; then + cat >> confdefs.h <<\EOF +#define TIME_WITH_SYS_TIME 1 +EOF + +fi + +echo $ac_n "checking whether struct tm is in sys/time.h or time.h""... $ac_c" 1>&6 +echo "configure:1437: checking whether struct tm is in sys/time.h or time.h" >&5 +if eval "test \"`echo '$''{'ac_cv_struct_tm'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +#include +int main() { +struct tm *tp; tp->tm_sec; +; return 0; } +EOF +if { (eval echo configure:1450: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + ac_cv_struct_tm=time.h +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + ac_cv_struct_tm=sys/time.h +fi +rm -f conftest* +fi + +echo "$ac_t""$ac_cv_struct_tm" 1>&6 +if test $ac_cv_struct_tm = sys/time.h; then + cat >> confdefs.h <<\EOF +#define TM_IN_SYS_TIME 1 +EOF + +fi + + +for ac_func in dlopen +do +echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 +echo "configure:1474: checking for $ac_func" >&5 +if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +/* Override any gcc2 internal prototype to avoid an error. */ +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func(); + +int main() { + +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +choke me +#else +$ac_func(); +#endif + +; return 0; } +EOF +if { (eval echo configure:1502: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_func_$ac_func=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_func_$ac_func=no" +fi +rm -f conftest* +fi + +if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then + echo "$ac_t""yes" 1>&6 + ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` + cat >> confdefs.h <&6 +fi +done + +if test x"$ac_cv_func_dlopen" = x"no"; then + echo $ac_n "checking for dlopen in -ldl""... $ac_c" 1>&6 +echo "configure:1528: checking for dlopen in -ldl" >&5 +ac_lib_var=`echo dl'_'dlopen | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-ldl $LIBS" +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + LIBS="$LIBS -ldl"; + cat >> confdefs.h <<\EOF +#define HAVE_DLOPEN 1 +EOF + +else + echo "$ac_t""no" 1>&6 +fi + +fi + +echo $ac_n "checking for compar_fn_t in stdlib.h""... $ac_c" 1>&6 +echo "configure:1574: checking for compar_fn_t in stdlib.h" >&5 +if eval "test \"`echo '$''{'ccache_cv_COMPAR_FN_T'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + + cat > conftest.$ac_ext < +int main() { + +void test_fn(void) { qsort(NULL, 0, 0, (__compar_fn_t)NULL); } + +; return 0; } +EOF +if { (eval echo configure:1589: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + ccache_cv_COMPAR_FN_T=yes +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + ccache_cv_COMPAR_FN_T=no +fi +rm -f conftest* +fi + +echo "$ac_t""$ccache_cv_COMPAR_FN_T" 1>&6 +if test x"$ccache_cv_COMPAR_FN_T" = x"yes"; then + cat >> confdefs.h <<\EOF +#define HAVE_COMPAR_FN_T 1 +EOF + +fi + +if test $ac_cv_prog_gcc = yes; then + echo $ac_n "checking whether ${CC-cc} needs -traditional""... $ac_c" 1>&6 +echo "configure:1611: checking whether ${CC-cc} needs -traditional" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_gcc_traditional'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_pattern="Autoconf.*'x'" + cat > conftest.$ac_ext < +Autoconf TIOCGETP +EOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + egrep "$ac_pattern" >/dev/null 2>&1; then + rm -rf conftest* + ac_cv_prog_gcc_traditional=yes +else + rm -rf conftest* + ac_cv_prog_gcc_traditional=no +fi +rm -f conftest* + + + if test $ac_cv_prog_gcc_traditional = no; then + cat > conftest.$ac_ext < +Autoconf TCGETA +EOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + egrep "$ac_pattern" >/dev/null 2>&1; then + rm -rf conftest* + ac_cv_prog_gcc_traditional=yes +fi +rm -f conftest* + + fi +fi + +echo "$ac_t""$ac_cv_prog_gcc_traditional" 1>&6 + if test $ac_cv_prog_gcc_traditional = yes; then + CC="$CC -traditional" + fi +fi + +echo $ac_n "checking return type of signal handlers""... $ac_c" 1>&6 +echo "configure:1657: checking return type of signal handlers" >&5 +if eval "test \"`echo '$''{'ac_cv_type_signal'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +#include +#ifdef signal +#undef signal +#endif +#ifdef __cplusplus +extern "C" void (*signal (int, void (*)(int)))(int); +#else +void (*signal ()) (); +#endif + +int main() { +int i; +; return 0; } +EOF +if { (eval echo configure:1679: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + ac_cv_type_signal=void +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + ac_cv_type_signal=int +fi +rm -f conftest* +fi + +echo "$ac_t""$ac_cv_type_signal" 1>&6 +cat >> confdefs.h <&6 +echo "configure:1698: checking for strftime" >&5 +if eval "test \"`echo '$''{'ac_cv_func_strftime'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +/* Override any gcc2 internal prototype to avoid an error. */ +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char strftime(); + +int main() { + +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_strftime) || defined (__stub___strftime) +choke me +#else +strftime(); +#endif + +; return 0; } +EOF +if { (eval echo configure:1726: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_func_strftime=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_func_strftime=no" +fi +rm -f conftest* +fi + +if eval "test \"`echo '$ac_cv_func_'strftime`\" = yes"; then + echo "$ac_t""yes" 1>&6 + cat >> confdefs.h <<\EOF +#define HAVE_STRFTIME 1 +EOF + +else + echo "$ac_t""no" 1>&6 +# strftime is in -lintl on SCO UNIX. +echo $ac_n "checking for strftime in -lintl""... $ac_c" 1>&6 +echo "configure:1748: checking for strftime in -lintl" >&5 +ac_lib_var=`echo intl'_'strftime | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-lintl $LIBS" +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + cat >> confdefs.h <<\EOF +#define HAVE_STRFTIME 1 +EOF + +LIBS="-lintl $LIBS" +else + echo "$ac_t""no" 1>&6 +fi + +fi + +echo $ac_n "checking for vprintf""... $ac_c" 1>&6 +echo "configure:1794: checking for vprintf" >&5 +if eval "test \"`echo '$''{'ac_cv_func_vprintf'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +/* Override any gcc2 internal prototype to avoid an error. */ +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char vprintf(); + +int main() { + +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_vprintf) || defined (__stub___vprintf) +choke me +#else +vprintf(); +#endif + +; return 0; } +EOF +if { (eval echo configure:1822: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_func_vprintf=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_func_vprintf=no" +fi +rm -f conftest* +fi + +if eval "test \"`echo '$ac_cv_func_'vprintf`\" = yes"; then + echo "$ac_t""yes" 1>&6 + cat >> confdefs.h <<\EOF +#define HAVE_VPRINTF 1 +EOF + +else + echo "$ac_t""no" 1>&6 +fi + +if test "$ac_cv_func_vprintf" != yes; then +echo $ac_n "checking for _doprnt""... $ac_c" 1>&6 +echo "configure:1846: checking for _doprnt" >&5 +if eval "test \"`echo '$''{'ac_cv_func__doprnt'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +/* Override any gcc2 internal prototype to avoid an error. */ +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char _doprnt(); + +int main() { + +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub__doprnt) || defined (__stub____doprnt) +choke me +#else +_doprnt(); +#endif + +; return 0; } +EOF +if { (eval echo configure:1874: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_func__doprnt=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_func__doprnt=no" +fi +rm -f conftest* +fi + +if eval "test \"`echo '$ac_cv_func_'_doprnt`\" = yes"; then + echo "$ac_t""yes" 1>&6 + cat >> confdefs.h <<\EOF +#define HAVE_DOPRNT 1 +EOF + +else + echo "$ac_t""no" 1>&6 +fi + +fi + +echo $ac_n "checking for wait3 that fills in rusage""... $ac_c" 1>&6 +echo "configure:1899: checking for wait3 that fills in rusage" >&5 +if eval "test \"`echo '$''{'ac_cv_func_wait3_rusage'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test "$cross_compiling" = yes; then + ac_cv_func_wait3_rusage=no +else + cat > conftest.$ac_ext < +#include +#include +#include +/* HP-UX has wait3 but does not fill in rusage at all. */ +main() { + struct rusage r; + int i; + /* Use a field that we can force nonzero -- + voluntary context switches. + For systems like NeXT and OSF/1 that don't set it, + also use the system CPU time. And page faults (I/O) for Linux. */ + r.ru_nvcsw = 0; + r.ru_stime.tv_sec = 0; + r.ru_stime.tv_usec = 0; + r.ru_majflt = r.ru_minflt = 0; + switch (fork()) { + case 0: /* Child. */ + /* Unless we actually _do_ something, the kernel sometimes doesn't chalk up any system time to this process. */ + if(fork()) { i = 123; wait(NULL); } else { i = 234; exit(0); } + sleep(1); /* Give up the CPU. */ + _exit(0); + case -1: _exit(0); /* What can we do? */ + default: /* Parent. */ + wait3(&i, 0, &r); + sleep(2); /* Avoid "text file busy" from rm on fast HP-UX machines. */ + exit(r.ru_nvcsw == 0 && r.ru_majflt == 0 && r.ru_minflt == 0 + && r.ru_stime.tv_sec == 0 && r.ru_stime.tv_usec == 0); + } +} +EOF +if { (eval echo configure:1940: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +then + ac_cv_func_wait3_rusage=yes +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -fr conftest* + ac_cv_func_wait3_rusage=no +fi +rm -fr conftest* +fi + +fi + +echo "$ac_t""$ac_cv_func_wait3_rusage" 1>&6 +if test $ac_cv_func_wait3_rusage = yes; then + cat >> confdefs.h <<\EOF +#define HAVE_WAIT3 1 +EOF + +fi + +for ac_func in gethostname gettimeofday select socket strcspn strdup strstr dprintf +do +echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 +echo "configure:1965: checking for $ac_func" >&5 +if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +/* Override any gcc2 internal prototype to avoid an error. */ +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func(); + +int main() { + +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +choke me +#else +$ac_func(); +#endif + +; return 0; } +EOF +if { (eval echo configure:1993: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_func_$ac_func=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_func_$ac_func=no" +fi +rm -f conftest* +fi + +if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then + echo "$ac_t""yes" 1>&6 + ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` + cat >> confdefs.h <&6 +fi +done + +for ac_func in strnlen strlcpy strlcat +do +echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 +echo "configure:2020: checking for $ac_func" >&5 +if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +/* Override any gcc2 internal prototype to avoid an error. */ +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func(); + +int main() { + +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +choke me +#else +$ac_func(); +#endif + +; return 0; } +EOF +if { (eval echo configure:2048: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_func_$ac_func=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_func_$ac_func=no" +fi +rm -f conftest* +fi + +if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then + echo "$ac_t""yes" 1>&6 + ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` + cat >> confdefs.h <&6 +fi +done + + + + +trap '' 1 2 15 +cat > confcache <<\EOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs. It is not useful on other systems. +# If it contains results you don't want to keep, you may remove or edit it. +# +# By default, configure uses ./config.cache as the cache file, +# creating it if it does not exist already. You can give configure +# the --cache-file=FILE option to use a different cache file; that is +# what configure does when it calls configure scripts in +# subdirectories, so they share the cache. +# Giving --cache-file=/dev/null disables caching, for debugging configure. +# config.status only pays attention to the cache file if you give it the +# --recheck option to rerun configure. +# +EOF +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, don't put newlines in cache variables' values. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +(set) 2>&1 | + case `(ac_space=' '; set | grep ac_space) 2>&1` in + *ac_space=\ *) + # `set' does not quote correctly, so add quotes (double-quote substitution + # turns \\\\ into \\, and sed turns \\ into \). + sed -n \ + -e "s/'/'\\\\''/g" \ + -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p" + ;; + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p' + ;; + esac >> confcache +if cmp -s $cache_file confcache; then + : +else + if test -w $cache_file; then + echo "updating cache $cache_file" + cat confcache > $cache_file + else + echo "not updating unwritable cache $cache_file" + fi +fi +rm -f confcache + +trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +# Any assignment to VPATH causes Sun make to only execute +# the first set of double-colon rules, so remove it if not needed. +# If there is a colon in the path, we need to keep it. +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d' +fi + +trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15 + +DEFS=-DHAVE_CONFIG_H + +# Without the "./", some shells look in PATH for config.status. +: ${CONFIG_STATUS=./config.status} + +echo creating $CONFIG_STATUS +rm -f $CONFIG_STATUS +cat > $CONFIG_STATUS </dev/null | sed 1q`: +# +# $0 $ac_configure_args +# +# Compiler output produced by configure, useful for debugging +# configure, is in ./config.log if it exists. + +ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]" +for ac_option +do + case "\$ac_option" in + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion" + exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;; + -version | --version | --versio | --versi | --vers | --ver | --ve | --v) + echo "$CONFIG_STATUS generated by autoconf version 2.13" + exit 0 ;; + -help | --help | --hel | --he | --h) + echo "\$ac_cs_usage"; exit 0 ;; + *) echo "\$ac_cs_usage"; exit 1 ;; + esac +done + +ac_given_srcdir=$srcdir +ac_given_INSTALL="$INSTALL" + +trap 'rm -fr `echo "Makefile autoconfig.h" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15 +EOF +cat >> $CONFIG_STATUS < conftest.subs <<\\CEOF +$ac_vpsub +$extrasub +s%@SHELL@%$SHELL%g +s%@CFLAGS@%$CFLAGS%g +s%@CPPFLAGS@%$CPPFLAGS%g +s%@CXXFLAGS@%$CXXFLAGS%g +s%@FFLAGS@%$FFLAGS%g +s%@DEFS@%$DEFS%g +s%@LDFLAGS@%$LDFLAGS%g +s%@LIBS@%$LIBS%g +s%@exec_prefix@%$exec_prefix%g +s%@prefix@%$prefix%g +s%@program_transform_name@%$program_transform_name%g +s%@bindir@%$bindir%g +s%@sbindir@%$sbindir%g +s%@libexecdir@%$libexecdir%g +s%@datadir@%$datadir%g +s%@sysconfdir@%$sysconfdir%g +s%@sharedstatedir@%$sharedstatedir%g +s%@localstatedir@%$localstatedir%g +s%@libdir@%$libdir%g +s%@includedir@%$includedir%g +s%@oldincludedir@%$oldincludedir%g +s%@infodir@%$infodir%g +s%@mandir@%$mandir%g +s%@CC@%$CC%g +s%@LN_S@%$LN_S%g +s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g +s%@INSTALL_SCRIPT@%$INSTALL_SCRIPT%g +s%@INSTALL_DATA@%$INSTALL_DATA%g +s%@CPP@%$CPP%g +s%@CHESSD_CFLAGS@%$CHESSD_CFLAGS%g + +CEOF +EOF + +cat >> $CONFIG_STATUS <<\EOF + +# Split the substitutions into bite-sized pieces for seds with +# small command number limits, like on Digital OSF/1 and HP-UX. +ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script. +ac_file=1 # Number of current file. +ac_beg=1 # First line for current file. +ac_end=$ac_max_sed_cmds # Line after last line for current file. +ac_more_lines=: +ac_sed_cmds="" +while $ac_more_lines; do + if test $ac_beg -gt 1; then + sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file + else + sed "${ac_end}q" conftest.subs > conftest.s$ac_file + fi + if test ! -s conftest.s$ac_file; then + ac_more_lines=false + rm -f conftest.s$ac_file + else + if test -z "$ac_sed_cmds"; then + ac_sed_cmds="sed -f conftest.s$ac_file" + else + ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file" + fi + ac_file=`expr $ac_file + 1` + ac_beg=$ac_end + ac_end=`expr $ac_end + $ac_max_sed_cmds` + fi +done +if test -z "$ac_sed_cmds"; then + ac_sed_cmds=cat +fi +EOF + +cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF +for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + case "$ac_file" in + *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'` + ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; + *) ac_file_in="${ac_file}.in" ;; + esac + + # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories. + + # Remove last slash and all that follows it. Not all systems have dirname. + ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` + if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then + # The file is in a subdirectory. + test ! -d "$ac_dir" && mkdir "$ac_dir" + ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`" + # A "../" for each directory in $ac_dir_suffix. + ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'` + else + ac_dir_suffix= ac_dots= + fi + + case "$ac_given_srcdir" in + .) srcdir=. + if test -z "$ac_dots"; then top_srcdir=. + else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;; + /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;; + *) # Relative path. + srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix" + top_srcdir="$ac_dots$ac_given_srcdir" ;; + esac + + case "$ac_given_INSTALL" in + [/$]*) INSTALL="$ac_given_INSTALL" ;; + *) INSTALL="$ac_dots$ac_given_INSTALL" ;; + esac + + echo creating "$ac_file" + rm -f "$ac_file" + configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure." + case "$ac_file" in + *Makefile*) ac_comsub="1i\\ +# $configure_input" ;; + *) ac_comsub= ;; + esac + + ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"` + sed -e "$ac_comsub +s%@configure_input@%$configure_input%g +s%@srcdir@%$srcdir%g +s%@top_srcdir@%$top_srcdir%g +s%@INSTALL@%$INSTALL%g +" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file +fi; done +rm -f conftest.s* + +# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where +# NAME is the cpp macro being defined and VALUE is the value it is being given. +# +# ac_d sets the value in "#define NAME VALUE" lines. +ac_dA='s%^\([ ]*\)#\([ ]*define[ ][ ]*\)' +ac_dB='\([ ][ ]*\)[^ ]*%\1#\2' +ac_dC='\3' +ac_dD='%g' +# ac_u turns "#undef NAME" with trailing blanks into "#define NAME VALUE". +ac_uA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' +ac_uB='\([ ]\)%\1#\2define\3' +ac_uC=' ' +ac_uD='\4%g' +# ac_e turns "#undef NAME" without trailing blanks into "#define NAME VALUE". +ac_eA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' +ac_eB='$%\1#\2define\3' +ac_eC=' ' +ac_eD='%g' + +if test "${CONFIG_HEADERS+set}" != set; then +EOF +cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF +fi +for ac_file in .. $CONFIG_HEADERS; do if test "x$ac_file" != x..; then + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + case "$ac_file" in + *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'` + ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; + *) ac_file_in="${ac_file}.in" ;; + esac + + echo creating $ac_file + + rm -f conftest.frag conftest.in conftest.out + ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"` + cat $ac_file_inputs > conftest.in + +EOF + +# Transform confdefs.h into a sed script conftest.vals that substitutes +# the proper values into config.h.in to produce config.h. And first: +# Protect against being on the right side of a sed subst in config.status. +# Protect against being in an unquoted here document in config.status. +rm -f conftest.vals +cat > conftest.hdr <<\EOF +s/[\\&%]/\\&/g +s%[\\$`]%\\&%g +s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD}%gp +s%ac_d%ac_u%gp +s%ac_u%ac_e%gp +EOF +sed -n -f conftest.hdr confdefs.h > conftest.vals +rm -f conftest.hdr + +# This sed command replaces #undef with comments. This is necessary, for +# example, in the case of _POSIX_SOURCE, which is predefined and required +# on some systems where configure will not decide to define it. +cat >> conftest.vals <<\EOF +s%^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*%/* & */% +EOF + +# Break up conftest.vals because some shells have a limit on +# the size of here documents, and old seds have small limits too. + +rm -f conftest.tail +while : +do + ac_lines=`grep -c . conftest.vals` + # grep -c gives empty output for an empty file on some AIX systems. + if test -z "$ac_lines" || test "$ac_lines" -eq 0; then break; fi + # Write a limited-size here document to conftest.frag. + echo ' cat > conftest.frag <> $CONFIG_STATUS + sed ${ac_max_here_lines}q conftest.vals >> $CONFIG_STATUS + echo 'CEOF + sed -f conftest.frag conftest.in > conftest.out + rm -f conftest.in + mv conftest.out conftest.in +' >> $CONFIG_STATUS + sed 1,${ac_max_here_lines}d conftest.vals > conftest.tail + rm -f conftest.vals + mv conftest.tail conftest.vals +done +rm -f conftest.vals + +cat >> $CONFIG_STATUS <<\EOF + rm -f conftest.frag conftest.h + echo "/* $ac_file. Generated automatically by configure. */" > conftest.h + cat conftest.in >> conftest.h + rm -f conftest.in + if cmp -s $ac_file conftest.h 2>/dev/null; then + echo "$ac_file is unchanged" + rm -f conftest.h + else + # Remove last slash and all that follows it. Not all systems have dirname. + ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` + if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then + # The file is in a subdirectory. + test ! -d "$ac_dir" && mkdir "$ac_dir" + fi + rm -f $ac_file + mv conftest.h $ac_file + fi +fi; done + +EOF +cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF + +exit 0 +EOF +chmod +x $CONFIG_STATUS +rm -fr confdefs* $ac_clean_files +test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1 + diff --git a/lasker-2.2.3/src/configure.in b/lasker-2.2.3/src/configure.in new file mode 100644 index 0000000..c52a3b0 --- /dev/null +++ b/lasker-2.2.3/src/configure.in @@ -0,0 +1,58 @@ +dnl Process this file with autoconf to produce a configure script. +AC_INIT(acconfig.h) + +AC_CONFIG_HEADER(autoconfig.h) + +CHESSD_CFLAGS="" + +dnl Checks for programs. +AC_PROG_CC +AC_PROG_LN_S +AC_PROG_INSTALL + +dnl Checks for libraries. +dnl Replace `main' with a function in -lm: +AC_CHECK_LIB(m, main) + +dnl Checks for header files. +AC_HEADER_DIRENT +AC_HEADER_STDC +AC_HEADER_SYS_WAIT +AC_CHECK_HEADERS(fcntl.h strings.h sys/file.h sys/ioctl.h sys/md5.h sys/time.h unistd.h) + +dnl Checks for typedefs, structures, and compiler characteristics. +AC_C_CONST +AC_TYPE_SIZE_T +AC_HEADER_TIME +AC_STRUCT_TM + +dnl we need dlopen() for 'areload' +AC_CHECK_FUNCS(dlopen) +if test x"$ac_cv_func_dlopen" = x"no"; then + AC_CHECK_LIB(dl, dlopen, [LIBS="$LIBS -ldl"; + AC_DEFINE(HAVE_DLOPEN)]) +fi + +AC_CACHE_CHECK([for compar_fn_t in stdlib.h],ccache_cv_COMPAR_FN_T, [ + AC_TRY_COMPILE( +[#include ], +[ +void test_fn(void) { qsort(NULL, 0, 0, (__compar_fn_t)NULL); } +], + ccache_cv_COMPAR_FN_T=yes,ccache_cv_COMPAR_FN_T=no)]) +if test x"$ccache_cv_COMPAR_FN_T" = x"yes"; then + AC_DEFINE(HAVE_COMPAR_FN_T, 1, [ ]) +fi + +dnl Checks for library functions. +AC_PROG_GCC_TRADITIONAL +AC_TYPE_SIGNAL +AC_FUNC_STRFTIME +AC_FUNC_VPRINTF +AC_FUNC_WAIT3 +AC_CHECK_FUNCS(gethostname gettimeofday select socket strcspn strdup strstr dprintf) +AC_CHECK_FUNCS(strnlen strlcpy strlcat) + +AC_SUBST(CHESSD_CFLAGS) + +AC_OUTPUT(Makefile) diff --git a/lasker-2.2.3/src/crypt-md5.c b/lasker-2.2.3/src/crypt-md5.c new file mode 100644 index 0000000..c760429 --- /dev/null +++ b/lasker-2.2.3/src/crypt-md5.c @@ -0,0 +1,134 @@ +/* + * ---------------------------------------------------------------------------- + * "THE BEER-WARE LICENSE" (Revision 42): + * wrote this file. As long as you retain this notice you + * can do whatever you want with this stuff. If we meet some day, and you think + * this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp + * ---------------------------------------------------------------------------- + * + * + * $FreeBSD: src/lib/libcrypt/crypt-md5.c,v 1.5 1999/12/17 20:21:45 peter Exp $ + * + */ + +#include "includes.h" + +#define MD5_SIZE 16 + +/* + * UNIX password + */ + +char *crypt_md5(const char *pw, const char *salt) +{ + static char *magic = "$1$"; /* + * This string is magic for + * this algorithm. Having + * it this way, we can get + * get better later on + */ + static char passwd[120], *p; + static const char *sp,*ep; + unsigned char final[MD5_SIZE]; + int sl,pl,i; + MD5_CTX ctx,ctx1; + unsigned long l; + + /* Refine the Salt first */ + sp = salt; + + /* If it starts with the magic string, then skip that */ + if(!strncmp(sp,magic,strlen(magic))) + sp += strlen(magic); + + /* It stops at the first '$', max 8 chars */ + for(ep=sp;*ep && *ep != '$' && ep < (sp+8);ep++) + continue; + + /* get the length of the true salt */ + sl = ep - sp; + + MD5Init(&ctx); + + /* The password first, since that is what is most unknown */ + MD5Update(&ctx,pw,strlen(pw)); + + /* Then our magic string */ + MD5Update(&ctx,magic,strlen(magic)); + + /* Then the raw salt */ + MD5Update(&ctx,sp,sl); + + /* Then just as many characters of the MD5(pw,salt,pw) */ + MD5Init(&ctx1); + MD5Update(&ctx1,pw,strlen(pw)); + MD5Update(&ctx1,sp,sl); + MD5Update(&ctx1,pw,strlen(pw)); + MD5Final(final,&ctx1); + for(pl = strlen(pw); pl > 0; pl -= MD5_SIZE) + MD5Update(&ctx,final,pl>MD5_SIZE ? MD5_SIZE : pl); + + /* Don't leave anything around in vm they could use. */ + memset(final,0,sizeof final); + + /* Then something really weird... */ + for (i = strlen(pw); i ; i >>= 1) + if(i&1) + MD5Update(&ctx, final, 1); + else + MD5Update(&ctx, pw, 1); + + /* Now make the output string */ + strcpy(passwd,magic); + strncat(passwd,sp,sl); + strcat(passwd,"$"); + + MD5Final(final,&ctx); + + /* + * and now, just to make sure things don't run too fast + * On a 60 Mhz Pentium this takes 34 msec, so you would + * need 30 seconds to build a 1000 entry dictionary... + */ + for(i=0;i<1000;i++) { + MD5Init(&ctx1); + if(i & 1) + MD5Update(&ctx1,pw,strlen(pw)); + else + MD5Update(&ctx1,final,MD5_SIZE); + + if(i % 3) + MD5Update(&ctx1,sp,sl); + + if(i % 7) + MD5Update(&ctx1,pw,strlen(pw)); + + if(i & 1) + MD5Update(&ctx1,final,MD5_SIZE); + else + MD5Update(&ctx1,pw,strlen(pw)); + MD5Final(final,&ctx1); + } + + p = passwd + strlen(passwd); + + l = (final[ 0]<<16) | (final[ 6]<<8) | final[12]; + _crypt_to64(p,l,4); p += 4; + l = (final[ 1]<<16) | (final[ 7]<<8) | final[13]; + _crypt_to64(p,l,4); p += 4; + l = (final[ 2]<<16) | (final[ 8]<<8) | final[14]; + _crypt_to64(p,l,4); p += 4; + l = (final[ 3]<<16) | (final[ 9]<<8) | final[15]; + _crypt_to64(p,l,4); p += 4; + l = (final[ 4]<<16) | (final[10]<<8) | final[ 5]; + _crypt_to64(p,l,4); p += 4; + l = final[11] ; + _crypt_to64(p,l,2); p += 2; + *p = '\0'; + + /* Don't leave anything around in vm they could use. */ + memset(final,0,sizeof final); + + return passwd; +} + diff --git a/lasker-2.2.3/src/crypt-md5c.c b/lasker-2.2.3/src/crypt-md5c.c new file mode 100644 index 0000000..ebc40ed --- /dev/null +++ b/lasker-2.2.3/src/crypt-md5c.c @@ -0,0 +1,322 @@ +/* + * MD5C.C - RSA Data Security, Inc., MD5 message-digest algorithm + * + * Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All + * rights reserved. + * + * License to copy and use this software is granted provided that it + * is identified as the "RSA Data Security, Inc. MD5 Message-Digest + * Algorithm" in all material mentioning or referencing this software + * or this function. + * + * License is also granted to make and use derivative works provided + * that such works are identified as "derived from the RSA Data + * Security, Inc. MD5 Message-Digest Algorithm" in all material + * mentioning or referencing the derived work. + * + * RSA Data Security, Inc. makes no representations concerning either + * the merchantability of this software or the suitability of this + * software for any particular purpose. It is provided "as is" + * without express or implied warranty of any kind. + * + * These notices must be retained in any copies of any part of this + * documentation and/or software. + * + * $FreeBSD: src/lib/libmd/md5c.c,v 1.11 1999/12/29 05:04:20 peter Exp $ + * + * + * This code is the same as the code published by RSA Inc. It has been + * edited for clarity and style only. + */ + +#include "includes.h" + +static void MD5Transform __P((u_int32_t [4], const unsigned char [64])); + +#ifdef i386 +#define Encode memcpy +#define Decode memcpy +#else /* i386 */ + +/* + * Encodes input (u_int32_t) into output (unsigned char). Assumes len is + * a multiple of 4. + */ + +static void +Encode (output, input, len) + unsigned char *output; + u_int32_t *input; + unsigned int len; +{ + unsigned int i, j; + + for (i = 0, j = 0; j < len; i++, j += 4) { + output[j] = (unsigned char)(input[i] & 0xff); + output[j+1] = (unsigned char)((input[i] >> 8) & 0xff); + output[j+2] = (unsigned char)((input[i] >> 16) & 0xff); + output[j+3] = (unsigned char)((input[i] >> 24) & 0xff); + } +} + +/* + * Decodes input (unsigned char) into output (u_int32_t). Assumes len is + * a multiple of 4. + */ + +static void +Decode (output, input, len) + u_int32_t *output; + const unsigned char *input; + unsigned int len; +{ + unsigned int i, j; + + for (i = 0, j = 0; j < len; i++, j += 4) + output[i] = ((u_int32_t)input[j]) | (((u_int32_t)input[j+1]) << 8) | + (((u_int32_t)input[j+2]) << 16) | (((u_int32_t)input[j+3]) << 24); +} +#endif /* i386 */ + +static unsigned char PADDING[64] = { + 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +/* F, G, H and I are basic MD5 functions. */ +#define F(x, y, z) (((x) & (y)) | ((~x) & (z))) +#define G(x, y, z) (((x) & (z)) | ((y) & (~z))) +#define H(x, y, z) ((x) ^ (y) ^ (z)) +#define I(x, y, z) ((y) ^ ((x) | (~z))) + +/* ROTATE_LEFT rotates x left n bits. */ +#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n)))) + +/* + * FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4. + * Rotation is separate from addition to prevent recomputation. + */ +#define FF(a, b, c, d, x, s, ac) { \ + (a) += F ((b), (c), (d)) + (x) + (u_int32_t)(ac); \ + (a) = ROTATE_LEFT ((a), (s)); \ + (a) += (b); \ + } +#define GG(a, b, c, d, x, s, ac) { \ + (a) += G ((b), (c), (d)) + (x) + (u_int32_t)(ac); \ + (a) = ROTATE_LEFT ((a), (s)); \ + (a) += (b); \ + } +#define HH(a, b, c, d, x, s, ac) { \ + (a) += H ((b), (c), (d)) + (x) + (u_int32_t)(ac); \ + (a) = ROTATE_LEFT ((a), (s)); \ + (a) += (b); \ + } +#define II(a, b, c, d, x, s, ac) { \ + (a) += I ((b), (c), (d)) + (x) + (u_int32_t)(ac); \ + (a) = ROTATE_LEFT ((a), (s)); \ + (a) += (b); \ + } + +/* MD5 initialization. Begins an MD5 operation, writing a new context. */ + +void MD5Init(MD5_CTX *context) +{ + + context->count[0] = context->count[1] = 0; + + /* Load magic initialization constants. */ + context->state[0] = 0x67452301; + context->state[1] = 0xefcdab89; + context->state[2] = 0x98badcfe; + context->state[3] = 0x10325476; +} + +/* + * MD5 block update operation. Continues an MD5 message-digest + * operation, processing another message block, and updating the + * context. + */ + +void MD5Update(MD5_CTX *context, + const unsigned char *input, + unsigned int inputLen) +{ + unsigned int i, index, partLen; + + /* Compute number of bytes mod 64 */ + index = (unsigned int)((context->count[0] >> 3) & 0x3F); + + /* Update number of bits */ + if ((context->count[0] += ((u_int32_t)inputLen << 3)) + < ((u_int32_t)inputLen << 3)) + context->count[1]++; + context->count[1] += ((u_int32_t)inputLen >> 29); + + partLen = 64 - index; + + /* Transform as many times as possible. */ + if (inputLen >= partLen) { + memcpy((void *)&context->buffer[index], (const void *)input, + partLen); + MD5Transform (context->state, context->buffer); + + for (i = partLen; i + 63 < inputLen; i += 64) + MD5Transform (context->state, &input[i]); + + index = 0; + } + else + i = 0; + + /* Buffer remaining input */ + memcpy ((void *)&context->buffer[index], (const void *)&input[i], + inputLen-i); +} + +/* + * MD5 padding. Adds padding followed by original length. + */ + +static void MD5Pad (MD5_CTX *context) +{ + unsigned char bits[8]; + unsigned int index, padLen; + + /* Save number of bits */ + Encode (bits, context->count, 8); + + /* Pad out to 56 mod 64. */ + index = (unsigned int)((context->count[0] >> 3) & 0x3f); + padLen = (index < 56) ? (56 - index) : (120 - index); + MD5Update (context, PADDING, padLen); + + /* Append length (before padding) */ + MD5Update (context, bits, 8); +} + +/* + * MD5 finalization. Ends an MD5 message-digest operation, writing the + * the message digest and zeroizing the context. + */ + +void MD5Final(unsigned char digest[16], + MD5_CTX *context) +{ + /* Do padding. */ + MD5Pad (context); + + /* Store state in digest */ + Encode (digest, context->state, 16); + + /* Zeroize sensitive information. */ + memset ((void *)context, 0, sizeof (*context)); +} + +/* MD5 basic transformation. Transforms state based on block. */ + +static void +MD5Transform (state, block) + u_int32_t state[4]; + const unsigned char block[64]; +{ + u_int32_t a = state[0], b = state[1], c = state[2], d = state[3], x[16]; + + Decode (x, block, 64); + + /* Round 1 */ +#define S11 7 +#define S12 12 +#define S13 17 +#define S14 22 + FF (a, b, c, d, x[ 0], S11, 0xd76aa478); /* 1 */ + FF (d, a, b, c, x[ 1], S12, 0xe8c7b756); /* 2 */ + FF (c, d, a, b, x[ 2], S13, 0x242070db); /* 3 */ + FF (b, c, d, a, x[ 3], S14, 0xc1bdceee); /* 4 */ + FF (a, b, c, d, x[ 4], S11, 0xf57c0faf); /* 5 */ + FF (d, a, b, c, x[ 5], S12, 0x4787c62a); /* 6 */ + FF (c, d, a, b, x[ 6], S13, 0xa8304613); /* 7 */ + FF (b, c, d, a, x[ 7], S14, 0xfd469501); /* 8 */ + FF (a, b, c, d, x[ 8], S11, 0x698098d8); /* 9 */ + FF (d, a, b, c, x[ 9], S12, 0x8b44f7af); /* 10 */ + FF (c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */ + FF (b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */ + FF (a, b, c, d, x[12], S11, 0x6b901122); /* 13 */ + FF (d, a, b, c, x[13], S12, 0xfd987193); /* 14 */ + FF (c, d, a, b, x[14], S13, 0xa679438e); /* 15 */ + FF (b, c, d, a, x[15], S14, 0x49b40821); /* 16 */ + + /* Round 2 */ +#define S21 5 +#define S22 9 +#define S23 14 +#define S24 20 + GG (a, b, c, d, x[ 1], S21, 0xf61e2562); /* 17 */ + GG (d, a, b, c, x[ 6], S22, 0xc040b340); /* 18 */ + GG (c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */ + GG (b, c, d, a, x[ 0], S24, 0xe9b6c7aa); /* 20 */ + GG (a, b, c, d, x[ 5], S21, 0xd62f105d); /* 21 */ + GG (d, a, b, c, x[10], S22, 0x2441453); /* 22 */ + GG (c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */ + GG (b, c, d, a, x[ 4], S24, 0xe7d3fbc8); /* 24 */ + GG (a, b, c, d, x[ 9], S21, 0x21e1cde6); /* 25 */ + GG (d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */ + GG (c, d, a, b, x[ 3], S23, 0xf4d50d87); /* 27 */ + GG (b, c, d, a, x[ 8], S24, 0x455a14ed); /* 28 */ + GG (a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */ + GG (d, a, b, c, x[ 2], S22, 0xfcefa3f8); /* 30 */ + GG (c, d, a, b, x[ 7], S23, 0x676f02d9); /* 31 */ + GG (b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */ + + /* Round 3 */ +#define S31 4 +#define S32 11 +#define S33 16 +#define S34 23 + HH (a, b, c, d, x[ 5], S31, 0xfffa3942); /* 33 */ + HH (d, a, b, c, x[ 8], S32, 0x8771f681); /* 34 */ + HH (c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */ + HH (b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */ + HH (a, b, c, d, x[ 1], S31, 0xa4beea44); /* 37 */ + HH (d, a, b, c, x[ 4], S32, 0x4bdecfa9); /* 38 */ + HH (c, d, a, b, x[ 7], S33, 0xf6bb4b60); /* 39 */ + HH (b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */ + HH (a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */ + HH (d, a, b, c, x[ 0], S32, 0xeaa127fa); /* 42 */ + HH (c, d, a, b, x[ 3], S33, 0xd4ef3085); /* 43 */ + HH (b, c, d, a, x[ 6], S34, 0x4881d05); /* 44 */ + HH (a, b, c, d, x[ 9], S31, 0xd9d4d039); /* 45 */ + HH (d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */ + HH (c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */ + HH (b, c, d, a, x[ 2], S34, 0xc4ac5665); /* 48 */ + + /* Round 4 */ +#define S41 6 +#define S42 10 +#define S43 15 +#define S44 21 + II (a, b, c, d, x[ 0], S41, 0xf4292244); /* 49 */ + II (d, a, b, c, x[ 7], S42, 0x432aff97); /* 50 */ + II (c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */ + II (b, c, d, a, x[ 5], S44, 0xfc93a039); /* 52 */ + II (a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */ + II (d, a, b, c, x[ 3], S42, 0x8f0ccc92); /* 54 */ + II (c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */ + II (b, c, d, a, x[ 1], S44, 0x85845dd1); /* 56 */ + II (a, b, c, d, x[ 8], S41, 0x6fa87e4f); /* 57 */ + II (d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */ + II (c, d, a, b, x[ 6], S43, 0xa3014314); /* 59 */ + II (b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */ + II (a, b, c, d, x[ 4], S41, 0xf7537e82); /* 61 */ + II (d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */ + II (c, d, a, b, x[ 2], S43, 0x2ad7d2bb); /* 63 */ + II (b, c, d, a, x[ 9], S44, 0xeb86d391); /* 64 */ + + state[0] += a; + state[1] += b; + state[2] += c; + state[3] += d; + + /* Zeroize sensitive information. */ + memset ((void *)x, 0, sizeof (x)); +} diff --git a/lasker-2.2.3/src/crypt-misc.c b/lasker-2.2.3/src/crypt-misc.c new file mode 100644 index 0000000..b5f5f40 --- /dev/null +++ b/lasker-2.2.3/src/crypt-misc.c @@ -0,0 +1,44 @@ +/* + * Copyright (c) 1999 + * University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the author nor the names of any co-contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY CONTRIBUTORS ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * $FreeBSD: src/lib/libcrypt/misc.c,v 1.1 1999/09/20 12:45:49 markm Exp $ + * + */ + +static unsigned char itoa64[] = /* 0 ... 63 => ascii - 64 */ + "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; + +#include "includes.h" + +void _crypt_to64(unsigned char *s, unsigned long v, int n) +{ + while (--n >= 0) { + *s++ = itoa64[v&0x3f]; + v >>= 6; + } +} diff --git a/lasker-2.2.3/src/crypt.c b/lasker-2.2.3/src/crypt.c new file mode 100644 index 0000000..51f51b2 --- /dev/null +++ b/lasker-2.2.3/src/crypt.c @@ -0,0 +1,40 @@ +/* + * Copyright (c) 1999 + * Mark Murray. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY MARK MURRAY AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL MARK MURRAY OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD: src/lib/libcrypt/crypt.c,v 1.14 2000/01/07 06:33:54 kris Exp $ + * + */ + +#include "includes.h" + +char *chessd_crypt(const char *passwd, const char *salt) +{ + if (!strncmp(salt, "$1$", 3)) { + salt += 3; + salt = salt + strlen(salt) - strcspn(salt, "$"); + return crypt_md5(passwd, salt); + } + return crypt_md5(passwd, salt); +} diff --git a/lasker-2.2.3/src/eco.c b/lasker-2.2.3/src/eco.c new file mode 100644 index 0000000..bc3a115 --- /dev/null +++ b/lasker-2.2.3/src/eco.c @@ -0,0 +1,397 @@ +/* + Copyright (c) 1993 Richard V. Nash. + Copyright (c) 2000 Dan Papasian + Copyright (C) Andrew Tridgell 2002 + + 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., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + + +#include "includes.h" + +typedef struct { + char ECO[4]; + char FENpos[74]; +} ECO_entry; + +typedef struct { + char NIC[6]; + char FENpos[74]; +} NIC_entry; + +typedef struct { + char LONG[80]; + char FENpos[74]; +} LONG_entry; + +static ECO_entry *ECO_book[1096]; +static NIC_entry *NIC_book[1096]; +static LONG_entry *LONG_book[4096]; + +static int ECO_entries, NIC_entries, LONG_entries; + +/* This coverts a FEN position to a FICS board + it assumes FENpos contains a valid position + the color tag has been separated and put in color*/ + +void FEN_to_board(char* FENpos, struct game_state_t* gs) +{ + int f,r; + char next; + + + for (r=7; r >=0; r--) { + f=0; + while (f<8) { + next = *(FENpos++); + if (isalpha(next)) + gs->board[f++][r] = CharToPiece(next); + else if (next != '/') { + int t = (next - '0'); + do + gs->board[f++][r] = NOPIECE; + while (--t); + } + } + } + if (*(FENpos + 1) == 'w') /* the char after the space */ + gs->onMove = WHITE; + else + gs->onMove = BLACK; +} + +/* converts a board to a FEN pos */ + +static void board_to_FEN(char* FENpos, struct game_state_t* gs) +{ + int f,r,count; + char piece; + + for (r=7; r>=0; r--) { + count = 0; + for (f=0; f<8; f++) { + if ((piece = PieceToChar(gs->board[f][r])) != ' ') { + if (count) { + *(FENpos++) = count + '0'; + count = 0; + } + *(FENpos++) = piece; + } else { + if (f == 7) + *(FENpos++) = count + '0' + 1; + else + count++; + } + } + *(FENpos++) = '/'; + } + + *(--FENpos) = ' '; + + if (gs->onMove == WHITE) + *(++FENpos) = 'w'; + else + *(++FENpos) = 'b'; + *(++FENpos) = '\0'; +} + +char *boardToFEN(int g) +{ + static char FENstring[74]; + + board_to_FEN (FENstring,&game_globals.garray[g].game_state); + return FENstring; +} + +static void ECO_init() +{ + FILE *fp; + char tmp[1024]; + char *ptmp= tmp; + char FENpos[73], ECO[4], onMove[2]; + int i=0; + + fp= fopen_s(BOOK_DIR "/eco999.idx", "r"); + if (!fp) { + d_printf( "Could not open ECO file\n"); + exit(1); + } + while (!feof(fp)) { + strcpy(ptmp, ""); + fgets(ptmp, 1024, fp); + if (feof(fp)) continue; + sscanf(ptmp, "%[\x21-z] %s", FENpos, onMove); + sprintf(FENpos, "%s %s", FENpos, onMove); + strcpy(ptmp, ""); + fgets(ptmp, 1024, fp); + if (feof(fp)) continue; + sscanf(ptmp, "%[0-z]", ECO); + ECO_book[i]= (ECO_entry *) malloc(sizeof(ECO_entry)); + if (ECO_book[i]==NULL) { + d_printf( "Cound not alloc mem for ECO entry %d.\n", i); + exit(1); + } + strcpy(ECO_book[i]->ECO, ECO); + strcpy(ECO_book[i]->FENpos, FENpos); + ++i; + } + fclose(fp); + ECO_book[i]=NULL; + ECO_entries = i; + + while (--i >= 0) + if (ECO_book[i] == NULL) + d_printf( "ERROR! ECO book position number %d is NULL.", i); +} + +static void NIC_init() +{ + FILE *fp; + char tmp[1024]; + char *ptmp= tmp; + char FENpos[73], NIC[6], onMove[2]; + int i=0; + + fp= fopen_p("%s/nic999.idx", "r", BOOK_DIR); + if (!fp) { + d_printf( "Could not open NIC file\n"); + exit(1); + } + while (!feof(fp)) { + strcpy(ptmp, ""); + fgets(ptmp, 1024, fp); + if (feof(fp)) continue; + sscanf(ptmp, "%[\x21-z] %s", FENpos, onMove); + sprintf(FENpos, "%s %s", FENpos, onMove); + strcpy(ptmp, ""); + fgets(ptmp, 1024, fp); + if (feof(fp)) continue; + sscanf(ptmp, "%[.-z]", NIC); + NIC_book[i]= (NIC_entry *) malloc(sizeof(NIC_entry)); + if (NIC_book[i]==NULL) { + d_printf( "Cound not alloc mem for NIC entry %d.\n", i); + exit(1); + } + strcpy(NIC_book[i]->NIC, NIC); + strcpy(NIC_book[i]->FENpos, FENpos); + ++i; + } + fclose(fp); + NIC_book[i]=NULL; + NIC_entries = i; +} + +static void LONG_init() +{ + FILE *fp; + char tmp[1024]; + char *ptmp= tmp; + char FENpos[74], LONG[256], onMove[2]; + int i=0; + + fp= fopen_p("%s/long999.idx", "r", BOOK_DIR); + if (!fp) { + d_printf( "Could not open LONG file\n"); + exit(1); + } + while (!feof(fp)) { + strcpy(ptmp, ""); + fgets(ptmp, 1024, fp); + if (feof(fp)) continue; + sscanf(ptmp, "%[\x21-z] %s", FENpos, onMove); + sprintf(FENpos, "%s %s", FENpos, onMove); + strcpy(ptmp, ""); + fgets(ptmp, 1024, fp); + if (feof(fp)) continue; + sscanf(ptmp, "%[^*\n]", LONG); + LONG_book[i]= (LONG_entry *) malloc(sizeof(LONG_entry)); + if (LONG_book[i]==NULL) { + d_printf( "Cound not alloc mem for LONG entry %d.\n", i); + exit(1); + } + strcpy(LONG_book[i]->LONG, LONG); + strcpy(LONG_book[i]->FENpos, FENpos); + ++i; + } + fclose(fp); + LONG_book[i]=NULL; + LONG_entries = i; +} + +/* free up any memory used by books */ +void book_close(void) +{ + int i; + + for (i=0;ECO_book[i];i++) { + free(ECO_book[i]); + ECO_book[i] = NULL; + } + for (i=0;NIC_book[i];i++) { + free(NIC_book[i]); + NIC_book[i] = NULL; + } + for (i=0;LONG_book[i];i++) { + free(LONG_book[i]); + LONG_book[i] = NULL; + } +} + +void book_open(void) +{ + ECO_init(); + NIC_init(); + LONG_init(); + d_printf("CHESSD: Loaded books\n"); +} + +char *getECO(int g) +{ + static char ECO[4]; + + int i, flag, l = 0, r = ECO_entries - 1, x; + + + if (game_globals.garray[g].type == TYPE_WILD) { + strcpy(ECO, "---"); + return ECO; + } else if (game_globals.garray[g].moveList == NULL) { + strcpy(ECO, "***"); + return ECO; + } else { + strcpy(ECO, "A00"); + } + + for (flag=0,i=game_globals.garray[g].numHalfMoves; (i>0 && !flag); i--) { + l = 0; + r = ECO_entries - 1; + while ((r >= l) && !flag) { + x = (l+r)/2; + if ((strcmp(game_globals.garray[g].moveList[i].FENpos, ECO_book[x]->FENpos)) < 0) + r = x - 1; + else + l = x + 1; + if (!strcmp(game_globals.garray[g].moveList[i].FENpos, ECO_book[x]->FENpos)) { + strcpy(ECO, ECO_book[x]->ECO); + flag=1; + } + } + } + + return ECO; +} + +int com_eco(int p, param_list param) +{ + struct player *pp = &player_globals.parray[p]; + int i, flag = 0, x, l, r; + int g1, p1; + + + if (param[0].type == TYPE_NULL) { /* own game */ + if (pp->game < 0) { + pprintf(p, "You are not playing or examining a game.\n"); + return COM_OK; + } + g1=pp->game; + if (((game_globals.garray[g1].status != GAME_EXAMINE) && + (game_globals.garray[g1].status != GAME_SETUP)) && !pIsPlaying(p)) + return COM_OK; + } else { + g1 = GameNumFromParam (p, &p1, ¶m[0]); + if (g1 < 0) return COM_OK; + if ((g1 >= game_globals.g_num) || ((game_globals.garray[g1].status != GAME_ACTIVE) && + (game_globals.garray[g1].status != GAME_EXAMINE) && + (game_globals.garray[g1].status != GAME_SETUP))) { + pprintf(p, "There is no such game.\n"); + return COM_OK; + } + } + + if (game_globals.garray[g1].status == GAME_SETUP) { + pprintf (p,"The postion is still being set up.\n"); + return COM_OK; + } + + if (game_globals.garray[g1].private && + (p != game_globals.garray[g1].white) && (p != game_globals.garray[g1].black) && + !check_admin(p, 1)) { + pprintf(p, "Sorry - that game is private.\n"); + return COM_OK; + } else { + if (game_globals.garray[g1].type == TYPE_WILD) { + pprintf(p, "That game is a wild game.\n"); + return COM_OK; + } + } + + pprintf(p, "Info about game %d: \"%s vs. %s\"\n\n", g1+1, + game_globals.garray[g1].white_name, + game_globals.garray[g1].black_name); + + if (game_globals.garray[g1].moveList==NULL) { + return COM_OK; + } + + for (flag=0,i=game_globals.garray[g1].numHalfMoves; (i>0 && !flag); i--) { + l = 0; + r = ECO_entries - 1; + while ((r >= l) && !flag) { + x = (l+r)/2; + if ((strcmp(game_globals.garray[g1].moveList[i].FENpos, ECO_book[x]->FENpos)) < 0) + r = x - 1; + else + l = x + 1; + if (!strcmp(game_globals.garray[g1].moveList[i].FENpos, ECO_book[x]->FENpos)) { + pprintf(p, " ECO[%3d]: %s\n", i, ECO_book[x]->ECO); + flag=1; + } + } + } + + for (flag=0, i=game_globals.garray[g1].numHalfMoves; ((i>0) && (!flag)); i--) { + l = 0; + r = NIC_entries - 1; + while ((r >=l) && !flag) { + x = (l+r)/2; + if ((strcmp(game_globals.garray[g1].moveList[i].FENpos, NIC_book[x]->FENpos)) < 0) + r = x - 1; + else + l = x + 1; + if (!strcmp(game_globals.garray[g1].moveList[i].FENpos, NIC_book[x]->FENpos)) { + pprintf(p, " NIC[%3d]: %s\n", i, NIC_book[x]->NIC); + flag=1; + } + } + } + + for (flag=0, i=game_globals.garray[g1].numHalfMoves; ((i>0) && (!flag)); i--) { + l = 0; + r = LONG_entries - 1; + while ((r >=l) && !flag) { + x = (l+r)/2; + if ((strcmp(game_globals.garray[g1].moveList[i].FENpos, LONG_book[x]->FENpos)) < 0) + r = x - 1; + else + l = x + 1; + if (!strcmp(game_globals.garray[g1].moveList[i].FENpos, LONG_book[x]->FENpos)) { + pprintf(p, " LONG[%3d]: %s\n", i, LONG_book[x]->LONG); + flag=1; + } + } + } + + return COM_OK; +} diff --git a/lasker-2.2.3/src/fics_addplayer.c b/lasker-2.2.3/src/fics_addplayer.c new file mode 100644 index 0000000..de4c3a6 --- /dev/null +++ b/lasker-2.2.3/src/fics_addplayer.c @@ -0,0 +1,135 @@ +/* + Copyright (c) 1993 Richard V. Nash. + Copyright (c) 2000 Dan Papasian + Copyright (C) Andrew Tridgell 2002 + + 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., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#include "includes.h" + +static void usage(char *progname) +{ + d_printf( "Usage: %s [-l] [-n] UserName FullName EmailAddress\n", progname); + exit(1); +} + +/* Parameters */ +static int local = 1; +static char *funame = NULL, *fname = NULL, *email = NULL; + +unsigned chessd_reload_flag; + +#define PASSLEN 4 +int main(int argc, char *argv[]) +{ + int admin, i, ch; + int p; + char password[PASSLEN + 1]; + char salt[3]; + char *text; + struct player *pp; + + admin = 0; + + while((ch = getopt(argc, argv, "lna:")) != -1) { + switch(ch) { + case 'l': + local = 1; + break; + case 'n': + local = 0; + break; + case 'a': + admin = atoi(optarg); + } + } + + funame = strdup(argv[argc-3]); + fname = strdup(argv[argc-2]); + email = strdup(argv[argc-1]); + if (!funame || !fname || !email) + usage(argv[0]); + + /* Add the player here */ + if (strlen(funame) >= MAX_LOGIN_NAME) { + d_printf( "Player name is too long\n"); + exit(0); + } + if (strlen(funame) < 3) { + d_printf( "Player name is too short\n"); + exit(0); + } + if (!alphastring(funame)) { + d_printf( "Illegal characters in player name. Only A-Za-z allowed.\n"); + exit(0); + } + + srandom(time(0)); + p = player_new(); + if (!player_read(p, funame)) { + d_printf( "%s already exists.\n", funame); + exit(0); + } + + pp = &player_globals.parray[p]; + + pp->name = strdup(funame); + pp->login = strdup(funame); + pp->adminLevel = admin; + + stolower(pp->login); + pp->fullName = strdup(fname); + pp->emailAddress = strdup(email); + for (i = 0; i < PASSLEN; i++) { + password[i] = 'a' + random() % 26; + } + password[i] = '\0'; + salt[0] = 'a' + random() % 26; + salt[1] = 'a' + random() % 26; + salt[2] = '\0'; + pp->passwd = strdup(chessd_crypt(password,salt)); + PFlagON(p, PFLAG_REG); +/* pp->network_player = !local; */ + PFlagON(p, PFLAG_RATED); + player_save(p); +/* changed by Sparky 12/15/95 Dropped reference to 'Network' players + and spiffed it up */ +/* + printf("Added %s player >%s< >%s< >%s< >%s<\n", local ? "local" : "network", + funame, fname, email, password); + rasprintf(&text, "\nYou have been added as a %s player.\nIf this is a network account it may take a while to show up on all of the\nclients.\n\nLogin Name: %s\nFull Name: %s\nEmail Address: %s\nInitial Password: %s\n\nIf any of this information is incorrect, please contact the administrator\nto get it corrected.\nPlease write down your password, as it will be your initial passoword\non all of the servers.\n", local ? "local" : "network", funame, fname, email, password); +*/ + + printf("Added %s account: >%s< >%s< >%s< >%s<\n", + admin?"ADMIN":"player", + funame, fname, email, password); + + asprintf(&text, "\nYour player account has been created.\n\n" + "Login Name: %s\nFull Name: %s\nEmail Address: %s\nInitial Password: %s\n\n" + "If any of this information is incorrect, please contact the administrator\n" + "to get it corrected.\n\n" + "You may change your password with the password command on the the server.\n" + "\nPlease be advised that if this is an unauthorized duplicate account for\n" + "you, by using it you take the risk of being banned from accessing this\n" + "chess server.\n\n" + "Regards,\n\nThe FICS admins\n", + funame, fname, email, password); + + free(text); + + mail_string_to_address(email, "FICS Account Created", text); + return 0; +} diff --git a/lasker-2.2.3/src/ficsmain.c b/lasker-2.2.3/src/ficsmain.c new file mode 100644 index 0000000..6673416 --- /dev/null +++ b/lasker-2.2.3/src/ficsmain.c @@ -0,0 +1,236 @@ +/* + Copyright (c) 1993 Richard V. Nash. + Copyright (c) 2000 Dan Papasian + Copyright (C) Andrew Tridgell 2002 + + 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., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +/* + ficsmain.c is a minimal wrapper around chessd.so. By keeping this module to a + minimum size we can reload nearly all the chess server functionality on a 'areload' + command. +*/ + + +#include "includes.h" + +/* handle used to talk to chessd.so */ +static void *chessd_so_handle; + +static void usage(); +static void main_event_loop(void); + +unsigned chessd_reload_flag; + +/* + load a function from chessd.so + this is the core of the runtime reload functionality +*/ +static void *chessd_function(const char *name) +{ + void *sym; + + if (!chessd_so_handle) { + chessd_so_handle = dlopen(LIB_DIR "/chessd.so", RTLD_LAZY); + if (!chessd_so_handle) { + fprintf(stderr, "CHESSD: Failed to load chessd.so !! (%s)\n", + dlerror()); + exit(1); + } + } + + sym = dlsym(chessd_so_handle, name); + if (!sym) { + fprintf(stderr, "CHESSD: Failed to find symbol %s in chessd.so !!\n", + name); + exit(1); + } + + return sym; +} + + +static void usage() +{ + fprintf(stderr, "Usage: chessd -p port [-f] [-T timeseal_decoder] [-R rootdir]\n"); + fprintf(stderr, "PORT_NUMBER is 5000 by default\n"); + exit(1); +} + +static int daemonize(void) +{ + pid_t pid; + if ((pid = fork()) == -1) + return -1; + else if (pid != 0) + exit(0); + if (setsid() == -1) + return -1; + return 0; +} + +static void main_event_loop(void) +{ + void (*select_loop)(void ) = chessd_function("select_loop"); + + while (1) { + select_loop(); + + /* check the reload flag */ + if (chessd_reload_flag) { + void (*reload_close)(void ) = chessd_function("reload_close"); + void (*reload_open)(void ); + + chessd_reload_flag = 0; + + fprintf(stderr, "CHESSD: Reloading server code!\n"); + + /* free up local vars */ + reload_close(); + + /* close the handle to the shared lib */ + dlclose(chessd_so_handle); + chessd_so_handle = NULL; + + /* re-initialise local variables */ + reload_open = chessd_function("reload_open"); + reload_open(); + select_loop = chessd_function("select_loop"); + } + } +} + +static void TerminateServer(int sig) +{ + void (*output_shut_mess)(void ) = chessd_function("output_shut_mess"); + void (*TerminateCleanup)(void ) = chessd_function("TerminateCleanup"); + void (*net_close)(void ) = chessd_function("net_close"); + + fprintf(stderr, "CHESSD: Received signal %d\n", sig); + output_shut_mess(); + TerminateCleanup(); + net_close(); + exit(1); +} + +static void BrokenPipe(int sig) +{ + signal(SIGPIPE, BrokenPipe); + fprintf(stderr, "CHESSD: Pipe signal\n"); +} + + +/* this assumes we are setuid root to start */ +static void do_chroot(const char *dir) +{ + int i; + uid_t uid = getuid(); + uid_t euid = geteuid(); + struct rlimit rlp; + + if (euid != 0 || setuid(0) != 0) { + fprintf(stderr, "Must be setuid root to use -R\n"); + exit(1); + } + if (chroot(dir) != 0 || chdir("/") != 0) { + perror("chroot"); + exit(1); + } + if (setuid(uid) != 0) { + perror("setuid"); + exit(1); + } + + /* close all extraneous file descriptors */ + for (i=0;i<3;i++) close(i); + open("stdin.log", O_RDWR|O_CREAT|O_TRUNC, 0644); + open("stdout.log", O_WRONLY|O_CREAT|O_TRUNC, 0644); + open("stderr.log", O_WRONLY|O_CREAT|O_TRUNC, 0644); + + /* reestabish core limits */ + getrlimit(RLIMIT_CORE, &rlp ); + rlp.rlim_cur = MAX(64*1024*1024, rlp.rlim_max); + setrlimit( RLIMIT_CORE, &rlp ); +} + +/* + give a decent backtrace on segv +*/ +static void segv_handler(int sig) +{ + char cmd[100]; + snprintf(cmd, sizeof(cmd), "/home/fics/bin/backtrace %d > /home/fics/chessd/segv_%d 2>&1", + (int)getpid(), (int)getpid()); + system(cmd); + _exit(1); +} + +int main(int argc, char *argv[]) +{ + int i, foreground, port; + void (*timeseal_init)(const char * ) = chessd_function("timeseal_init"); + int (*net_init)(int ) = chessd_function("net_init"); + void (*initial_load)(void ) = chessd_function("initial_load"); + + port = DEFAULT_PORT; + foreground = 0; + + /* enable malloc checking in libc */ + setenv("MALLOC_CHECK_", "2", 1); + + while((i = getopt(argc, argv, "p:fR:T:")) != -1) { + switch(i) { + case 'p': + port = atoi(optarg); + break; + case 'f': + foreground = 1; + break; + case 'T': + timeseal_init(optarg); + break; + case 'R': + do_chroot(optarg); + break; + default: + usage(); + } + } + + if (!foreground && daemonize()){ + printf("Problem with Daemonization - Aborting\n"); + exit(1); + } + + signal(SIGTERM, TerminateServer); + signal(SIGSEGV, segv_handler); + signal(SIGBUS, segv_handler); + signal(SIGINT, TerminateServer); + signal(SIGPIPE, BrokenPipe); + + if (net_init(port)) { + fprintf(stderr, "CHESSD: Network initialize failed on port %d.\n", port); + exit(1); + } + fprintf(stderr, "CHESSD: Initialized on port %d\n", port); + + initial_load(); + + main_event_loop(); + /* will never get here - uses TerminateServer */ + + return 0; +} diff --git a/lasker-2.2.3/src/ficsmain.h b/lasker-2.2.3/src/ficsmain.h new file mode 100644 index 0000000..aaf7aee --- /dev/null +++ b/lasker-2.2.3/src/ficsmain.h @@ -0,0 +1,36 @@ +/* + Copyright (c) 1993 Richard V. Nash. + Copyright (c) 2000 Dan Papasian + Copyright (C) Andrew Tridgell 2002 + + 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., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#ifndef FICSMAIN_H +#define FICSMAIN_H + +#define MESS_WELCOME "welcome" +#define MESS_LOGIN "login" +#define MESS_LOGOUT "logout" +#define MESS_MOTD "motd" +#define MESS_ADMOTD "admotd" +#define MESS_UNREGISTERED "unregistered" + +#define STATS_MESSAGES "messages" +#define STATS_LOGONS "logons" +#define STATS_GAMES "games" +#define STATS_JOURNAL "journal" + +#endif /* FICSMAIN_H */ diff --git a/lasker-2.2.3/src/findstatic.pl b/lasker-2.2.3/src/findstatic.pl new file mode 100755 index 0000000..43a4916 --- /dev/null +++ b/lasker-2.2.3/src/findstatic.pl @@ -0,0 +1,70 @@ +#!/usr/bin/perl -w +# find a list of fns and variables in the code that could be static +# usually called with something like this: +# findstatic.pl `find . -name "*.o"` +# Andrew Tridgell + +use strict; + +# use nm to find the symbols +my($saved_delim) = $/; +undef $/; +my($syms) = `nm -o @ARGV`; +$/ = $saved_delim; + +my(@lines) = split(/\n/s, $syms); + +my(%def); +my(%undef); +my(%stype); + +my(%typemap) = ( + "T" => "function", + "C" => "uninitialised variable", + "D" => "initialised variable" + ); + + +# parse the symbols into defined and undefined +for (my($i)=0; $i <= $#{@lines}; $i++) { + my($line) = $lines[$i]; + if ($line =~ /(.*):[a-f0-9]* ([TCD]) (.*)/) { + my($fname) = $1; + my($symbol) = $3; + push(@{$def{$fname}}, $symbol); + $stype{$symbol} = $2; + } + if ($line =~ /(.*):\s* U (.*)/) { + my($fname) = $1; + my($symbol) = $2; + push(@{$undef{$fname}}, $symbol); + } +} + +# look for defined symbols that are never referenced outside the place they +# are defined +foreach my $f (keys %def) { + print "Checking $f\n"; + my($found_one) = 0; + foreach my $s (@{$def{$f}}) { + my($found) = 0; + foreach my $f2 (keys %undef) { + if ($f2 ne $f) { + foreach my $s2 (@{$undef{$f2}}) { + if ($s2 eq $s) { + $found = 1; + $found_one = 1; + } + } + } + } + if ($found == 0) { + my($t) = $typemap{$stype{$s}}; + print " '$s' is unique to $f ($t)\n"; + } + } + if ($found_one == 0) { + print " all symbols in '$f' are unused (main program?)\n"; + } +} + diff --git a/lasker-2.2.3/src/follow.c b/lasker-2.2.3/src/follow.c new file mode 100644 index 0000000..d1185fa --- /dev/null +++ b/lasker-2.2.3/src/follow.c @@ -0,0 +1,62 @@ +/* + Copyright (C) Andrew Tridgell 2002 + + 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., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +/* + handle 'follow' lists. These are a little different to FICS in that they are persistent + (ie. they are more similar to the personal gnotify list) +*/ + +#include "includes.h" + +/* + a game has started between p1 and p2 + anyone who has either player in their personal follow list will now send an + effective 'observe' command if they are idle +*/ +void follow_start(int p1,int p2) +{ + int p; + for (p = 0; p < player_globals.p_num; p++) { + struct player *pp = &player_globals.parray[p]; + int in1=0, in2=0; + + /* don't follow ourselves */ + if ((p == p1) || (p == p2)) { + continue; + } + + /* don't follow while playing, examining etc */ + if (pp->status != PLAYER_PROMPT) { + continue; + } + + /* see if either player is in our follow list */ + in1 = in_list(p, L_FOLLOW, player_globals.parray[p1].login); + if (in1 == 0) { + in2 = in_list(p, L_FOLLOW, player_globals.parray[p2].login); + } + + if (in1 == 0 && in2 == 0) { + continue; + } + + /* fake up an observe command */ + pcommand(p, "observe %s\n", player_globals.parray[in1?p1:p2].login); + send_prompt (p); + } +} diff --git a/lasker-2.2.3/src/formula.c b/lasker-2.2.3/src/formula.c new file mode 100644 index 0000000..0285ff1 --- /dev/null +++ b/lasker-2.2.3/src/formula.c @@ -0,0 +1,569 @@ +/* + 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., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +/* Formula program for FICS. Written by Dave Herscovici + (dhersco@math.nps.navy.mil) + Edited by DAV to include wild,non-std and untimed + lightning flags + +*/ + +/* Operators allowed, in order of precedence: + ! (not), - (unary), + *, /, + +, -, + <, <=, =<, >, >=, =>, (<= and =< are equivalent, as are >= and =>) + =, ==, !=, <>, (two ways of saying both equals and not equals) + &, &&, (both "and") + |, ||, (both "or"). + + Parentheses () are also allowed, as is a pound sign '#' for comments. + The program will divide by a fudge factor of .001 instead of 0. + + Variables allowed: + time, inc, rating, myrating, rated, blitz, standard, lightning, registered, + assesswin, assessdraw, assessloss, timeseal, + ratingdiff = rating - myrating, private, wild, untimed, nonstandard, + maxtime(n) = maximum time n moves will take (in seconds), + mymaxtime(n) = same, but just count my time. + f1, f2, f3, f4, f5, f6, f7, f8, f9. + + The code for translating blitz and standard variables may have to be + redone. F1 through f9 are user-defined formula variables. They can + be used to avoid having to retype your entire formula when you want + to change one part of it, or to compensate for the lack of a 'mood' + variable. + + For example: + set f1 rated & time=5 & inc=0 # rated 5 minute games + set f2 rating - myrating + set f3 # this line is a random comment. + set f4 f2>400 # I want a REAL fight + + Then you can type: + set formula f1 # rated 5 min. games only + set formula etime >= 10 & f2 > -100 # long games, decent competition + set formula f1 & !f4 + or set formula f2 >= 0 | blitz + depending on your mood. + + Further modifications could account for starting positions, time + odds games, provisional or established opponents, etc. Maybe f0 + should be reserved for your formula upon logging in; i.e. if f0 + is set, your formula is automatically set to f0 when you log in. +*/ + +#include "includes.h" + +static int CheckFormula(struct game *g, int clause, int *i, int op_type, + int *result, int eval); + + +static char *GetPlayersFormula (struct player *pWho, int clause) +{ + if (clause==MAX_FORMULA) return (pWho->formula); + else return (pWho->formulaLines[clause]); +} + +/* In MoveIndexPastString, *i is treated as the index into string[]; + this function returns 1 if the character string beginning with + string[*i] match *text, and 0 otherwise. In the former case, *i + is incremented to move the index past *text. +*/ +static int MoveIndexPastString (char *string, int *i, char *text) +{ + int n = strlen(text); + if (strncasecmp(text, string + *i, n)) return (0); + *i += n; + return (n); +} /* end of function MoveIndexPastString. */ + +static int GetNumberInsideParens (struct game *g, int clause, int *i, int *token, + int eval) +{ + char *string = GetPlayersFormula(&player_globals.parray[g->black], clause); + int ret; + + while (string[*i] != '\0' && isspace(string[*i])) (*i)++; + if (!MoveIndexPastString(string, i, "(")) return (ERR_BADCHAR); + + ret = CheckFormula(g, clause, i, OPTYPE_PAREN, token, eval); + if (ret != ERR_NONE) + return (ret); + if (MoveIndexPastString(string, i, ")")) return (ERR_NONE); + else return (ERR_PAREN); +} + +static int Maxtime (struct game *g, int numMoves, int numPlayers) +{ + int max; + + if ((g->bInitTime == g->wInitTime) && (g->bIncrement == g->wIncrement)) { + max = numPlayers * (60 * g->wInitTime + numMoves * g->wIncrement); + if ((g->type != TYPE_UNTIMED) && (g->wInitTime == 0)) + max +=10 * numPlayers; /* 0 x start with ten secs */ + + } else if (numPlayers == 2) { + max = 60 * (g->wInitTime + g->bInitTime) + + numMoves * (g->wIncrement + g->bIncrement); + if ((g->type != TYPE_UNTIMED) && (g->wInitTime == 0)) + max +=10; /* 0 x start with ten secs */ + if ((g->type != TYPE_UNTIMED) && (g->bInitTime == 0)) + max +=10; /* 0 x start with ten secs */ + + } else { + max = 60 * g->bInitTime + numMoves * g->bIncrement; + if ((g->type != TYPE_UNTIMED) && (g->bInitTime == 0)) + max +=10; /* 0 x start with ten secs */ + } + + return max; +} + + +/* The black player in game *g has been challenged. S/he has a list + of formulas, and we're checking the one given by the index clause + (MAX_FORMULA denotes the actual formula; if clause is smaller, + we're looking at one of the user-defined formulas). We're at + position *i in the formula. If we find a legitimate variable there + and eval is 1, VarToToken puts its value in *tok; if eval is 0, + just move past the variable. Returns 1 or 0, depending on whether + a legitimate variable was found. +*/ +static int VarToToken (struct game *g, int clause, char *string, int *i, int *tok, int eval) +{ + struct player *me = &player_globals.parray[g->black]; + struct player *you = &player_globals.parray[g->white]; + int index=0, c; + double dummy_sterr; + + /* We list possible variables with the longest names first. */ + if (MoveIndexPastString(string, i, "registered")) + *tok=BoolCheckPFlag(g->white, PFLAG_REG); + else if (MoveIndexPastString(string, i, "ratingdiff")) + *tok = GetRating(you, g->type) - GetRating(me, g->type); + else if (MoveIndexPastString(string, i, "assessloss")) + { + if (g->rated) + rating_sterr_delta(g->black, g->white, g->type, + time(0), RESULT_LOSS, tok, &dummy_sterr); + else *tok = 0; + } + else if (MoveIndexPastString(string, i, "assessdraw")) + { + if (g->rated) + rating_sterr_delta(g->black, g->white, g->type, + time(0), RESULT_DRAW, tok, &dummy_sterr); + else *tok = 0; + } + else if (MoveIndexPastString(string, i, "assesswin")) + { + if (g->rated) + rating_sterr_delta(g->black, g->white, g->type, + time(0), RESULT_WIN, tok, &dummy_sterr); + else *tok = 0; + } + else if (MoveIndexPastString(string, i, "mymaxtime")) + { + if (GetNumberInsideParens(g, clause, i, tok, eval) != ERR_NONE) + return (0); + *tok = Maxtime (g, *tok, 1); + } + else if (MoveIndexPastString(string, i, "timeseal")) + *tok = net_globals.con[you->socket]->timeseal; + else if (MoveIndexPastString(string, i, "myrating")) + *tok = GetRating(me, g->type); + else if (MoveIndexPastString(string, i, "computer")) + *tok = in_list(-1, L_COMPUTER, you->name); + else if (MoveIndexPastString(string, i, "standard")) + *tok = (g->type == TYPE_STAND); + else if (MoveIndexPastString(string, i, "private")) + *tok = BoolCheckPFlag(g->white, PFLAG_PRIVATE); + else if (MoveIndexPastString(string, i, "maxtime")) + { + if (GetNumberInsideParens(g, clause, i, tok, eval) != ERR_NONE) + return (0); + *tok = Maxtime (g, *tok, 2); + } + else if (MoveIndexPastString(string, i, "abuser")) + *tok = in_list(-1, L_ABUSER, you->name); + else if (MoveIndexPastString(string, i, "rating")) + *tok = GetRating(you, g->type); + else if (MoveIndexPastString(string, i, "rated")) *tok=g->rated; + else if (MoveIndexPastString(string, i, "nonstandard")) + *tok = (g->type == TYPE_NONSTANDARD); + else if (MoveIndexPastString(string, i, "lightning")) + *tok = (g->type == TYPE_LIGHT); + else if (MoveIndexPastString(string, i, "bughouse")) + *tok = (g->type == TYPE_BUGHOUSE); + else if (MoveIndexPastString(string, i, "untimed")) + *tok = (g->type == TYPE_UNTIMED); + else if (MoveIndexPastString(string, i, "blitz")) + *tok = (g->type == TYPE_BLITZ); + else if (MoveIndexPastString(string, i, "wild")) + *tok = (g->type == TYPE_WILD); + else if (MoveIndexPastString(string, i, "time")) *tok=g->wInitTime; + else if (MoveIndexPastString(string, i, "inc")) *tok=g->wIncrement; + else if (tolower(string[*i])=='f' && isdigit(string[*i+1]) && + (c = (string[*i+1]-'1')) >= 0 && clause > c) + { + *i += 2; + return (!CheckFormula (g, c, &index, OPTYPE_NONE, tok, eval)); + } + else return (0); + return (1); +} /* end of function VarToToken. */ + +/* ScanForOp checks for an operator at position *i in string[]. */ +static int ScanForOp (char *string, int *i) +{ + while (string[*i] != '\0' && isspace(string[*i])) (*i)++; + + if (string[*i] == '\0') return (OP_NONE); + if (string[*i] == '#') return (OP_NONE); + if (string[*i] == ')') return (OP_RTPAREN); + + /* Two char operators and longer first. */ + if (MoveIndexPastString(string, i, "and")) return (OP_AND); + if (MoveIndexPastString(string, i, "or")) return (OP_OR); + if (MoveIndexPastString(string, i, "||")) return (OP_OR); + if (MoveIndexPastString(string, i, "&&")) return (OP_AND); + if (MoveIndexPastString(string, i, "==")) return (OP_EQ); + if (MoveIndexPastString(string, i, "!=")) return (OP_NEQ); + if (MoveIndexPastString(string, i, "<>")) return (OP_NEQ); + if (MoveIndexPastString(string, i, ">=")) return (OP_GE); + if (MoveIndexPastString(string, i, "=>")) return (OP_GE); + if (MoveIndexPastString(string, i, "<=")) return (OP_LE); + if (MoveIndexPastString(string, i, "=<")) return (OP_LE); + + /* One char operators now. */ + if (MoveIndexPastString(string, i, "|")) return (OP_OR); + if (MoveIndexPastString(string, i, "&")) return (OP_AND); + if (MoveIndexPastString(string, i, ">")) return (OP_GT); + if (MoveIndexPastString(string, i, "<")) return (OP_LT); + if (MoveIndexPastString(string, i, "=")) return (OP_EQ); + if (MoveIndexPastString(string, i, "+")) return (OP_PLUS); + if (MoveIndexPastString(string, i, "-")) return (OP_MINUS); + if (MoveIndexPastString(string, i, "*")) return (OP_MULT); + if (MoveIndexPastString(string, i, "/")) return (OP_DIV); + return (OP_BAD); +} /* end of function ScanForOp. */ + +/* OpType returns the precedence of the operator op. */ +static int OpType (int op) +{ + switch (op) + { + case OP_BAD: return (OPTYPE_BAD); + case OP_NONE: return (OPTYPE_NONE); + case OP_RTPAREN: return (OPTYPE_RPAREN); + case OP_OR: return (OPTYPE_OR); + case OP_AND: return (OPTYPE_AND); + case OP_EQ: case OP_NEQ: return (OPTYPE_COMPEQ); + case OP_GT: case OP_GE: case OP_LT: case OP_LE: return (OPTYPE_COMPGL); + case OP_PLUS: case OP_MINUS: return (OPTYPE_ADD); + case OP_MULT: case OP_DIV: return (OPTYPE_MULT); + case OP_NEGATE: case OP_NOT: return (OPTYPE_UNARY); + default: return (OPTYPE_BAD); + } +} /* end of function OpType. */ + +/* In EvalBinaryOp, *left is the left operand; and op is the + current operator. *g and clause specify which formula string to + look at (we're checking player_globals.parray[g->black].formulaLines[clause]), + and *i tells us where we are in the string. We look for a right + operand from position *i in the string, and place the expression + (*left op right) in *left. For example, if *left=6, op = + OP_MULT, and we pull off right = 4, we replace *left with + 6*4=24. Returns 0 if no error; otherwise indicates the error. +*/ +static int EvalBinaryOp (int *left, int op, struct game *g, int clause, int *i) +{ + int right, ret; + if ((op==OP_OR) && (*left != 0)) /* Nothing to decide. */ + { + *left = 1; + return (CheckFormula (g, clause, i, OpType(op), &right, 0)); + } + else if ((op==OP_AND) && (*left == 0)) /* Nothing to decide. */ + return (CheckFormula (g, clause, i, OpType(op), &right, 0)); + + else { + ret = CheckFormula (g, clause, i, OpType(op), &right, 1); + if (ret != ERR_NONE) return (ret); + } + switch (op) + { + default: case OP_BAD: return (ERR_BADOP); + case OP_NONE: case OP_RTPAREN: return (ERR_NONE); + case OP_OR: *left = (*left || right); return (ERR_NONE); + case OP_AND: *left = (*left && right); return (ERR_NONE); + case OP_EQ: *left = (*left == right); return (ERR_NONE); + case OP_NEQ: *left = (*left != right); return (ERR_NONE); + case OP_GT: *left = (*left > right); return (ERR_NONE); + case OP_GE: *left = (*left >= right); return (ERR_NONE); + case OP_LT: *left = (*left < right); return (ERR_NONE); + case OP_LE: *left = (*left <= right); return (ERR_NONE); + case OP_PLUS: *left += right; return (ERR_NONE); + case OP_MINUS: *left -= right; return (ERR_NONE); + case OP_MULT: *left *= right; return (ERR_NONE); + case OP_DIV: + if (right != 0) + { + *left /= right; + return (ERR_NONE); + } + else + { + pprintf(g->black, "Dividing by %f instead or zero in formula.\n", FUDGE_FACTOR); + *left /= FUDGE_FACTOR; + return (ERR_NONE); + } + } +} /* end of function EvalBinaryOp. */ + +/* If eval is 1, ScanForNumber evaluates the number at position *i + in the formula given by *g and clause, and place this value in + *token. op_type is the precedence of the operator preceding the + *i'th position. If we come to an operator of higher precedence, + we must keep going before we can leave this function. If eval + is 0, just move past the number we would evaluate. Returns 0 if + no error; otherwise return code indicates the error. +*/ +static int ScanForNumber (struct game *g, int clause, int *i, int op_type, + int *token, int eval) +{ + char *string = GetPlayersFormula (&player_globals.parray[g->black], clause); + char c; + int ret; + + while ((string[*i] != '\0') && (isspace(string[*i]))) (*i)++; + switch (c = string[*i]) + { + case '\0': case '#': + if (op_type != OPTYPE_NONE) return (ERR_EOF); + else *token=1; + return (ERR_NONE); + + case ')': + if (op_type != OPTYPE_PAREN) return (ERR_PAREN); + else *token=1; + return(ERR_NONE); + + case '(': return GetNumberInsideParens(g,clause,i,token,eval); + + case '-': case '!': + ++(*i); + if (c==string[*i]) return(ERR_UNARY); + ret = ScanForNumber(g,clause,i,OPTYPE_UNARY,token,eval); + if (ret != ERR_NONE) + return (ret); + if (c == '-') *token = -(*token); + else if (c == '!') *token = !(*token); + return (ERR_NONE); + + default: + if (isdigit(string[*i])) + { + *token = 0; + + do *token = 10 * (*token) + string[(*i)++] - '0'; + while (isdigit(string[*i])); + + while (string[*i] != '\0' && isspace(string[*i])) (*i)++; + if (MoveIndexPastString (string, i, "minutes")) + *token *= 60; + return (ERR_NONE); + } + else if (isalpha(string[*i])) + { + if (!VarToToken (g, clause, string, i, token, eval)) + return (ERR_BADVAR); + return(ERR_NONE); + } + else return (ERR_NONESENSE); + } +} /* end of function ScanForNumber. */ + +/* If eval is 1, CheckFormula looks for the next token in the + formula given by *g, clause, and *i; usually this is the right + side of an expression whose operator has precedence OpType; if + eval is 0, just go to the end of an expression. Return 0 if no + error; otherwise, return error type. +*/ +static int CheckFormula(struct game *g, int clause, int *i, int op_type, + int *result, int eval) +{ + int token, ret, nextOp, lastPos; + char *string = GetPlayersFormula (&player_globals.parray[g->black], clause); + + if (string == NULL) + { + *result = 1; + return (ERR_NONE); + } + ret = ScanForNumber (g, clause, i, op_type, &token, eval); + if (ret != ERR_NONE) + return (ret); + lastPos = *i; + nextOp = ScanForOp (string, i); + while (OpType(nextOp) > op_type) /* higher precedence. */ + { + if (nextOp==OP_RTPAREN) return (ERR_PAREN); + if (!eval) + ret = CheckFormula(g, clause, i, OpType(nextOp), &token, 0); + else ret = EvalBinaryOp (&token, nextOp, g, clause, i); + if (ret != ERR_NONE) return (ret); + lastPos = *i; + nextOp = ScanForOp (string, i); + } + if (nextOp == OP_BAD) return(ERR_BADOP); + *result = token; + + /* move back unless we're at the end or at a right paren, in which + case we never went forward. */ + if (nextOp != OP_NONE && nextOp != OP_RTPAREN) *i=lastPos; + return (ERR_NONE); +} /* end of function CheckFormula. */ + +/* which clauses are relevant for a player's formula. */ +static int ChooseClauses(struct player *who, char *formula) +{ + int i, which, ret=0; + + if (formula == NULL) + return ret; + for (i=0; formula[i] != '\0' && formula[i] != '#'; i++) { + if (formula[i] != 'f' || (i > 0 && isalnum(formula[i-1])) + || !isdigit(formula[i+1])) + continue; + sscanf(&formula[i], "f%d", &which); + ret |= (1 << (which - 1)); + } + /* now scan clauses found as part of the formula. */ + for (i = MAX_FORMULA - 1; i >= 0; i--) { + if (ret & (1 << i)) { + ret |= ChooseClauses(who, who->formulaLines[i]); + } + } + return ret; +} /* end of function ChooseClauses. */ + +static void ExplainFormula (struct game *g, struct textlist **clauses) +{ + int i, which, dummy_index, value; + char txt[20]; + struct player *challenged = &player_globals.parray[g->black]; + struct textlist **Cur = clauses; + + which = ChooseClauses(challenged, challenged->formula); + + for (i = 0; i < MAX_FORMULA; i++) { + if ((which & (1 << i)) == 0) + continue; + dummy_index = 0; + CheckFormula (g, i, &dummy_index, OPTYPE_NONE, &value, 1); + sprintf(txt, "%d", value); + SaveTextListEntry (Cur, txt, i); + Cur = &(*Cur)->next; + } +} + + +/* GameMatchesFormula converts parameters to a game structure + and passes a pointer to this game to CheckFormula for + evaluation. It returns the evaluated formula. +*/ +int GameMatchesFormula (int w, int b, int wTime, int wInc, int bTime, + int bInc, int rated, int gametype, struct textlist **clauseList) +{ + struct game g; + int index=0, ret; + + g.white = w; g.black = b; + g.wInitTime = wTime; g.bInitTime = bTime; + g.wIncrement = wInc; g.bIncrement = bInc; + g.rated = rated; + g.type = gametype; + + if (CheckFormula(&g, MAX_FORMULA, &index, OPTYPE_NONE, &ret, 1) != ERR_NONE) + return (0); + if (ret == 0) ExplainFormula (&g, clauseList); + return (ret); +} /* end of function GameMatchesFormula. */ + +/* SetValidFormula sets a clause of player p and creates a game structure + to check whether that new formula is legitimate. If so, return 1; + otherwise, reset the formula and return 0. +*/ +int SetValidFormula (int p, int clause, char *string) +{ + struct game g; + int index=0, ret, err=ERR_NONE; + char *Old=NULL, **Cur; + struct player *me = &player_globals.parray[p]; + + if (clause==MAX_FORMULA) + Cur = &me->formula; + else + Cur = &me->formulaLines[clause]; + + Old = *Cur; + + if (string != NULL) { + string = eatwhite(string); + *Cur = (*string != '\0' ? strdup (string) : NULL); + } + else *Cur = NULL; + + if (*Cur==NULL) { + if (Old != NULL) free(Old); + return 1; + } + + g.white = g.black = p; + g.wInitTime = g.bInitTime = me->d_time; + g.wIncrement = g.bIncrement = me->d_inc; + g.rated = BoolCheckFlag(me->Flags, PFLAG_RATED); + g.type = TYPE_BLITZ; + err = CheckFormula (&g, clause, &index, OPTYPE_NONE, &ret, 0); + + if (err != ERR_NONE) { + /* Bad formula; reset it. */ + free(*Cur); + *Cur = Old; + } else { + if (Old != NULL) free(Old); + } + return (err == ERR_NONE); +} + +void ShowClauses (int p, int p1, textlist *clauses) +{ + textlist *Cur; + + if (clauses != NULL) + pprintf(p, "\n"); + for (Cur = clauses; Cur != NULL; Cur = Cur->next) { +/* changed this next line to pass "" not NULL to pprintf. 2.24.96 fb + pprintf(p, "f%d=%s: %s\n", Cur->index + 1, Cur->text, + player_globals.parray[p1].formulaLines[Cur->index]); +*/ + pprintf(p, "f%d=%s: %s\n", Cur->index + 1, Cur->text, + (player_globals.parray[p1].formulaLines[Cur->index] == NULL) ? "" : + player_globals.parray[p1].formulaLines[Cur->index]); + } +} diff --git a/lasker-2.2.3/src/formula.h b/lasker-2.2.3/src/formula.h new file mode 100644 index 0000000..dfe1a27 --- /dev/null +++ b/lasker-2.2.3/src/formula.h @@ -0,0 +1,65 @@ +/* + 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., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + + +#ifndef FORMULA_H +#define FORMULA_H + +#define OP_BAD -1 + +#define OP_NONE 0 +#define OP_RTPAREN 1 +#define OP_OR 2 +#define OP_AND 3 +#define OP_EQ 4 +#define OP_NEQ 5 +#define OP_GT 6 +#define OP_GE 7 +#define OP_LT 8 +#define OP_LE 9 +#define OP_PLUS 10 +#define OP_MINUS 11 +#define OP_MULT 12 +#define OP_DIV 13 +#define OP_NEGATE 14 +#define OP_NOT 15 + +#define OPTYPE_BAD 0 +#define OPTYPE_NONE 1 +#define OPTYPE_RPAREN 2 +#define OPTYPE_PAREN 3 +#define OPTYPE_OR 4 +#define OPTYPE_AND 5 +#define OPTYPE_COMPEQ 6 +#define OPTYPE_COMPGL 7 +#define OPTYPE_ADD 8 +#define OPTYPE_MULT 9 +#define OPTYPE_UNARY 10 + +#define ERR_NONE 0 +#define ERR_EOF 1 +#define ERR_UNARY 2 +#define ERR_BADCHAR 3 +#define ERR_BADVAR 4 +#define ERR_BADOP 5 +#define ERR_NONESENSE 6 +#define ERR_DIVBYZERO 7 +#define ERR_PAREN 8 + +#define FUDGE_FACTOR 1e-3 + +#endif + diff --git a/lasker-2.2.3/src/gamedb.c b/lasker-2.2.3/src/gamedb.c new file mode 100644 index 0000000..76aed03 --- /dev/null +++ b/lasker-2.2.3/src/gamedb.c @@ -0,0 +1,1471 @@ +/* + Copyright (c) 1993 Richard V. Nash. + Copyright (c) 2000 Dan Papasian + Copyright (C) Andrew Tridgell 2002 + + 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., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#include "includes.h" + +static int check_kings(struct game_state_t *gs); +static int get_empty_slot(void); +static int ReadGameAttrs_common(FILE *fp, int g, int version); +static long OldestHistGame(char *login); +static void RemoveHistGame(char *file, int maxlines); +static void write_g_out(int g, char *file, int maxlines, int isDraw, char *EndSymbol, char *name, time_t *now); +static int game_zero(int g); + +const char *TypeStrings[NUM_GAMETYPES] = {"untimed", "blitz", "standard", + "nonstandard", "wild", "lightning", + "bughouse"}; + +/* this method is awful! how about allocation as we need it and freeing + afterwards! */ +static int get_empty_slot(void) +{ + int i; + + for (i = 0; i < game_globals.g_num; i++) { + if (game_globals.garray[i].status == GAME_EMPTY) + return i; + } + game_globals.g_num++; + game_globals.garray = (struct game *)realloc(game_globals.garray, sizeof(struct game) * game_globals.g_num); + /* yeah great, bet this causes lag! - DAV*/ + /* I have serious doubt of the truth to the above client- bugg */ + game_globals.garray[game_globals.g_num - 1].status = GAME_EMPTY; + return game_globals.g_num - 1; +} + +int game_new(void) +{ + int new = get_empty_slot(); + game_zero(new); + return new; +} + +static int game_zero(int g) +{ + ZERO_STRUCT(game_globals.garray[g]); + + game_globals.garray[g].white = -1; + game_globals.garray[g].black = -1; + + game_globals.garray[g].status = GAME_NEW; + game_globals.garray[g].link = -1; + game_globals.garray[g].result = END_NOTENDED; + game_globals.garray[g].type = TYPE_UNTIMED; + game_globals.garray[g].game_state.gameNum = g; + game_globals.garray[g].wInitTime = 300; /* 5 minutes */ + game_globals.garray[g].wIncrement = 0; + game_globals.garray[g].bInitTime = 300; /* 5 minutes */ + game_globals.garray[g].bIncrement = 0; + game_globals.garray[g].flag_pending = FLAG_NONE; + strcpy(game_globals.garray[g].FENstartPos,INITIAL_FEN); + return 0; +} + +int game_free(int g) +{ + FREE(game_globals.garray[g].moveList); + FREE(game_globals.garray[g].examMoveList); + game_globals.garray[g].moveList = NULL; + game_globals.garray[g].examMoveList = NULL; + game_globals.garray[g].moveListSize = 0; + game_globals.garray[g].examMoveListSize = 0; + return 0; +} + +int game_remove(int g) +{ + /* Should remove game from players observation list */ + game_free(g); + game_zero(g); + game_globals.garray[g].status = GAME_EMPTY; + return 0; +} + +/* old moves not stored now - uses smoves */ +int game_finish(int g) +{ + player_game_ended(g); /* Alert playerdb that game ended */ + game_remove(g); + return 0; +} + +void MakeFENpos (int g, char *FEN) +{ + strcpy(FEN, boardToFEN(g)); +} + +static char *game_time_str(int wt, int winc, int bt, int binc) +{ + static char tstr[50]; + + if ((!wt) && (!winc)) { /* Untimed */ + strcpy(tstr, ""); + return tstr; + } + if ((wt == bt) && (winc == binc)) { + sprintf(tstr, " %d %d", wt, winc); + } else { + sprintf(tstr, " %d %d : %d %d", wt, winc, bt, binc); + } + return tstr; +} + +const char *bstr[] = {"untimed", "blitz", "standard", "non-standard", "wild", "lightning", "Bughouse"}; + +const char *rstr[] = {"unrated", "rated"}; + +char *game_str(int rated, int wt, int winc, int bt, int binc, + char *cat, char *board) +{ + static char tstr[200]; + + if (cat && cat[0] && board && board[0] && + (strcmp(cat, "standard") || strcmp(board, "standard"))) { + sprintf(tstr, "%s %s%s Loaded from %s/%s", + rstr[rated], + bstr[game_isblitz(wt / 60, winc, bt / 60, binc, cat, board)], + game_time_str(wt / 60, winc, bt / 60, binc), + cat, board); + } else { + sprintf(tstr, "%s %s%s", + rstr[rated], + bstr[game_isblitz(wt / 60, winc, bt / 60, binc, cat, board)], + game_time_str(wt / 60, winc, bt / 60, binc)); + } + return tstr; +} + +int game_isblitz(int wt, int winc, int bt, int binc, + char *cat, char *board) +{ + int total; + + if(cat && cat[0]) { + if (!strcmp(cat, "bughouse")) + return TYPE_BUGHOUSE; + if (board && board[0]) { + if (!strcmp(cat, "wild")) + return TYPE_WILD; + if (strcmp(cat, "standard") || strcmp(board, "standard")) + return TYPE_NONSTANDARD; + } + } + + if ((wt == 0) || (bt == 0)) + /* nonsense if one is timed and one is not */ + return TYPE_UNTIMED; + + if ((wt != bt) || (winc != binc)) + return TYPE_NONSTANDARD; + total = wt * 60 + winc * 40; + if (total < 180) /* 3 minute */ + return TYPE_LIGHT; + if (total >= 900) /* 15 minutes */ + return TYPE_STAND; + else + return TYPE_BLITZ; +} + +void send_board_to(int g, int p) +{ + struct player *pp = &player_globals.parray[p]; + char *b; + int side; + int relation; + +/* since we know g and p, figure out our relationship to this game */ + + side = WHITE; + if ((game_globals.garray[g].status == GAME_EXAMINE) || (game_globals.garray[g].status == GAME_SETUP)) { + if (pp->game == g) { + relation = 2; + } else { + relation = -2; + } + } else { + if (pp->game == g) { + side = pp->side; + relation = ((side == game_globals.garray[g].game_state.onMove) ? 1 : -1); + } else { + relation = 0; + } + } + + if (CheckPFlag(p, PFLAG_FLIP)) { /* flip board? */ + if (side == WHITE) + side = BLACK; + else + side = WHITE; + } + game_update_time(g); + b = board_to_string(game_globals.garray[g].white_name, + game_globals.garray[g].black_name, + game_globals.garray[g].wTime, + game_globals.garray[g].bTime, + &game_globals.garray[g].game_state, + (game_globals.garray[g].status == GAME_EXAMINE || game_globals.garray[g].status == GAME_SETUP) ? + game_globals.garray[g].examMoveList : game_globals.garray[g].moveList, + pp->style, + side, relation, p); + Bell(p); + + if (pp->game == g && net_globals.con[pp->socket]->timeseal) { + pprintf_noformat(p, "\n%s\n[G]\n", b); + } else { + pprintf_noformat(p, "\n%s", b); + } + + if (p != command_globals.commanding_player) { + send_prompt(p); + } +} + +void send_boards(int g) +{ + int p,p1; + struct simul_info_t *simInfo = player_globals.parray[game_globals.garray[g].white].simul_info; + int which_board = -1; + + /* Begin code added 3/28/96 - Figbert */ + + if ((game_globals.garray[g].status != GAME_SETUP) && + (check_kings(&game_globals.garray[g].game_state))) { + d_printf( "Game has invalid amount of kings. Aborting...\n"); + game_finish(g); + + for (p = 0; p < player_globals.p_num; p++) { + struct player *pp = &player_globals.parray[p]; + if (pp->status == PLAYER_EMPTY) + continue; + if (pp->game == g) { + + p1 = pp->opponent; + + if (p1 >= 0 && player_globals.parray[p1].game == g) { + pprintf (p1, "Disconnecting you from game number %d.\n", g+1); + player_globals.parray[p1].game = -1; + } + + pprintf (p, "Disconnecting you from game number %d.\n", g+1); + pp->game = -1; + } + } + return; + } + + /* End code added 3/28/96 - Figbert */ + + if (simInfo != NULL) + which_board = simInfo->boards[simInfo->onBoard]; + + if ((simInfo == NULL) || (which_board == g)) { + for (p = 0; p < player_globals.p_num; p++) { + struct player *pp = &player_globals.parray[p]; + if (pp->status == PLAYER_EMPTY) + continue; + if (player_is_observe(p, g) || (pp->game == g)) + send_board_to(g, p); + } + } +} + +void game_update_time(int g) +{ + struct game *gg; + unsigned now, timesince; + + if (g == -1) { + return; + } + + gg = &game_globals.garray[g]; + + /* no update on first move */ + if (gg->game_state.moveNum == 1) + return; + if (gg->clockStopped) + return; + if (gg->type == TYPE_UNTIMED) + return; + now = tenth_secs(); + timesince = now - gg->lastDecTime; + if (gg->game_state.onMove == WHITE) { + gg->wTime -= timesince; + } else { + gg->bTime -= timesince; + } + gg->lastDecTime = now; +} + +#if 0 +static void game_update_times(void) +{ + int g; + + for (g = 0; g < game_globals.g_num; g++) { + if (game_globals.garray[g].status != GAME_ACTIVE) + continue; + if (game_globals.garray[g].clockStopped) + continue; + game_update_time(g); + } +} +#endif + +char *EndString(int g, int personal) +{ + static char endstr[200]; + char *blackguy, *whiteguy; + static char blackstr[] = "Black"; + static char whitestr[] = "White"; + + blackguy = (personal ? game_globals.garray[g].black_name : blackstr); + whiteguy = (personal ? game_globals.garray[g].white_name : whitestr); + + switch (game_globals.garray[g].result) { + case END_CHECKMATE: + sprintf(endstr, "%s checkmated", + game_globals.garray[g].winner == WHITE ? blackguy : whiteguy); + break; + case END_RESIGN: + sprintf(endstr, "%s resigned", + game_globals.garray[g].winner == WHITE ? blackguy : whiteguy); + break; + case END_FLAG: + sprintf(endstr, "%s ran out of time", + game_globals.garray[g].winner == WHITE ? blackguy : whiteguy); + break; + case END_AGREEDDRAW: + sprintf(endstr, "Game drawn by mutual agreement"); + break; + case END_BOTHFLAG: + sprintf(endstr, "Game drawn because both players ran out of time"); + break; + case END_REPETITION: + sprintf(endstr, "Game drawn by repetition"); + break; + case END_50MOVERULE: + sprintf(endstr, "Draw by the 50 move rule"); + break; + case END_ADJOURN: + sprintf(endstr, "Game adjourned by mutual agreement"); + break; + case END_LOSTCONNECTION: + sprintf(endstr, "%s lost connection, game adjourned", + game_globals.garray[g].winner == WHITE ? whiteguy : blackguy); + break; + case END_ABORT: + sprintf(endstr, "Game aborted by mutual agreement"); + break; + case END_STALEMATE: + sprintf(endstr, "Stalemate."); + break; + case END_NOTENDED: + sprintf(endstr, "Still in progress"); + break; + case END_COURTESY: + sprintf(endstr, "Game courtesyaborted by %s", + game_globals.garray[g].winner == WHITE ? whiteguy : blackguy); + break; + case END_COURTESYADJOURN: + sprintf(endstr, "Game courtesyadjourned by %s", + game_globals.garray[g].winner == WHITE ? whiteguy : blackguy); + break; + case END_NOMATERIAL: + sprintf(endstr, "Game drawn because neither player has mating material"); + break; + case END_FLAGNOMATERIAL: + sprintf(endstr, "%s ran out of time and %s has no material to mate", + game_globals.garray[g].winner == WHITE ? blackguy : whiteguy, + game_globals.garray[g].winner == WHITE ? whiteguy : blackguy); + break; + case END_ADJDRAW: + sprintf(endstr, "Game drawn by adjudication"); + break; + case END_ADJWIN: + sprintf(endstr, "%s wins by adjudication", + game_globals.garray[g].winner == WHITE ? whiteguy : blackguy); + break; + case END_ADJABORT: + sprintf(endstr, "Game aborted by adjudication"); + break; + default: + sprintf(endstr, "???????"); + break; + } + + return (endstr); +} + +const char *EndSym(int g) +{ + static const char *symbols[] = {"1-0", "0-1", "1/2-1/2", "*"}; + + switch (game_globals.garray[g].result) { + case END_CHECKMATE: + case END_RESIGN: + case END_FLAG: + case END_ADJWIN: + return ((game_globals.garray[g].winner == WHITE) ? symbols[0] : symbols[1]); + break; + case END_AGREEDDRAW: + case END_BOTHFLAG: + case END_REPETITION: + case END_50MOVERULE: + case END_STALEMATE: + case END_NOMATERIAL: + case END_FLAGNOMATERIAL: + case END_ADJDRAW: + return (symbols[2]); + break; + default: + break; + } + + return (symbols[3]); +} + +/* This should be enough to hold any game up to at least 8000 moves + * If we overwrite this, the server will crash :-). + */ +/* 8000? who you trying to kid? this is awful - enough for 600 halfs :) -DAV*/ +#define GAME_STRING_LEN 19000 +static char gameString[GAME_STRING_LEN]; +char *movesToString(int g, int pgn) +{ + char tmp[160]; + int wr, br; + int i, col; + time_t curTime; + struct move_t *moves; + + if (game_globals.garray[g].status == GAME_EXAMINE || game_globals.garray[g].status == GAME_SETUP) + moves = game_globals.garray[g].examMoveList; + else moves = game_globals.garray[g].moveList; + + wr = game_globals.garray[g].white_rating; + br = game_globals.garray[g].black_rating; + + + curTime = untenths(game_globals.garray[g].timeOfStart); + + if (pgn) { + sprintf(gameString, + "\n[Event \"%s %s %s game\"]\n" + "[Site \"%s, %s\"]\n", + config_get_tmp("SERVER_NAME"), + rstr[game_globals.garray[g].rated], bstr[game_globals.garray[g].type], + config_get_tmp("SERVER_NAME"), + config_get_tmp("SERVER_LOCATION")); + strftime(tmp, sizeof(tmp), + "[Date \"%Y.%m.%d\"]\n" + "[Time \"%H:%M:%S\"]\n", + localtime((time_t *) &curTime)); + strcat(gameString, tmp); + sprintf(tmp, + "[Round \"-\"]\n" + "[White \"%s\"]\n" + "[Black \"%s\"]\n" + "[WhiteElo \"%d\"]\n" + "[BlackElo \"%d\"]\n", + game_globals.garray[g].white_name, game_globals.garray[g].black_name, wr, br); + strcat(gameString, tmp); + sprintf(tmp, + "[TimeControl \"%d+%d\"]\n" + "[Mode \"ICS\"]\n" + "[Result \"%s\"]\n\n", + game_globals.garray[g].wInitTime / 10, game_globals.garray[g].wIncrement / 10, EndSym(g)); + strcat(gameString, tmp); + + col = 0; + for (i = 0; i < game_globals.garray[g].numHalfMoves; i++) { + if (moves[i].color == WHITE) { + if ((col += sprintf(tmp, "%d. ", (i+1) / 2 + 1)) > 70) { + strcat(gameString, "\n"); + col = 0; + } + strcat(gameString, tmp); + } else if (i==0) { + strcat (tmp, "1. ... "); + col += 7; + } + if ((col += sprintf(tmp, "%s ", moves[i].algString)) > 70) { + strcat(gameString, "\n"); + col = 0; + } + strcat(gameString, tmp); + } + strcat(gameString, "\n"); + + } else { + + sprintf(gameString, "\n%s ", game_globals.garray[g].white_name); + if (wr > 0) { + sprintf(tmp, "(%d) ", wr); + } else { + sprintf(tmp, "(UNR) "); + } + strcat(gameString, tmp); + sprintf(tmp, "vs. %s ", game_globals.garray[g].black_name); + strcat(gameString, tmp); + if (br > 0) { + sprintf(tmp, "(%d) ", br); + } else { + sprintf(tmp, "(UNR) "); + } + strcat(gameString, tmp); + strcat(gameString, "--- "); + strcat(gameString, strltime(&curTime)); + if (game_globals.garray[g].rated) { + strcat(gameString, "\nRated "); + } else { + strcat(gameString, "\nUnrated "); + } + strcat (gameString, TypeStrings[game_globals.garray[g].type]); + strcat(gameString, " match, initial time: "); + if ((game_globals.garray[g].bInitTime != game_globals.garray[g].wInitTime) || (game_globals.garray[g].wIncrement != game_globals.garray[g].bIncrement)) { /* different starting times */ + sprintf(tmp, "%d minutes, increment: %d seconds AND %d minutes, increment: %d seconds.\n\n", game_globals.garray[g].wInitTime / 600, game_globals.garray[g].wIncrement / 10, game_globals.garray[g].bInitTime / 600, game_globals.garray[g].bIncrement / 10); + } else { + sprintf(tmp, "%d minutes, increment: %d seconds.\n\n", game_globals.garray[g].wInitTime / 600, game_globals.garray[g].wIncrement / 10); + } + strcat(gameString, tmp); + sprintf(tmp, "Move %-19s%-19s\n", game_globals.garray[g].white_name, game_globals.garray[g].black_name); + strcat(gameString, tmp); + strcat(gameString, "---- ---------------- ----------------\n"); + + for (i = 0; i < game_globals.garray[g].numHalfMoves; i += 2) { + if (i==0 && (moves[i].color == BLACK)) { + sprintf(tmp, "%3d. %-16s %-16s\n", (i+1)/2 + 1, "...", + move_and_time(&moves[i])); + i--; + } else if (i + 1 < game_globals.garray[g].numHalfMoves) { + sprintf(tmp, "%3d. %-16s ", (i+1)/2 + 1, move_and_time(&moves[i])); + strcat(gameString, tmp); + sprintf(tmp, "%-16s\n", move_and_time(&moves[i+1])); + } else { + sprintf(tmp, "%3d. %-16s\n", (i+1)/2 + 1, move_and_time(&moves[i])); + } + strcat(gameString, tmp); + if (strlen(gameString) > GAME_STRING_LEN - 100) { /* Bug out if getting + close to filling this + string */ + return gameString; + } + } + + strcat(gameString, " "); + } + + sprintf(tmp, "{%s} %s\n", EndString(g, 0), EndSym(g)); + strcat(gameString, tmp); + + return gameString; +} + +void game_disconnect(int g, int p) +{ + game_ended(g, (game_globals.garray[g].white == p) ? WHITE : BLACK, END_LOSTCONNECTION); +} + +int CharToPiece(char c) +{ + switch (c) { + case 'P': + return W_PAWN; + case 'p': + return B_PAWN; + case 'N': + return W_KNIGHT; + case 'n': + return B_KNIGHT; + case 'B': + return W_BISHOP; + case 'b': + return B_BISHOP; + case 'R': + return W_ROOK; + case 'r': + return B_ROOK; + case 'Q': + return W_QUEEN; + case 'q': + return B_QUEEN; + case 'K': + return W_KING; + case 'k': + return B_KING; + default: + return NOPIECE; + } +} + +char PieceToChar(int piece) +{ + switch (piece) { + case W_PAWN:return 'P'; + case B_PAWN: + return 'p'; + case W_KNIGHT: + return 'N'; + case B_KNIGHT: + return 'n'; + case W_BISHOP: + return 'B'; + case B_BISHOP: + return 'b'; + case W_ROOK: + return 'R'; + case B_ROOK: + return 'r'; + case W_QUEEN: + return 'Q'; + case B_QUEEN: + return 'q'; + case W_KING: + return 'K'; + case B_KING: + return 'k'; + default: + return ' '; + } +} + +/* + write a new style generic game file +*/ +static void WriteGameFile_v100(FILE * fp, int g) +{ + struct game gg = game_globals.garray[g]; + const char *s; + + /* zero any elements we don't want to save */ + memset(&gg, 0, offsetof(struct game, not_saved_marker)); + gg.game_state.gameNum = 0; + + /* marshall it into a string */ + s = marshall_game(&gg); + if (!s) { + d_printf("Unable to marshall game structure!\n"); + return; + } + + /* and save it */ + fprintf(fp, "v 100\n%s\n", s); + free(s); +} + + +/* + read a game file using the new generic and extensible format +*/ +static int ReadGameAttrs_v100(FILE *fp, int g) +{ + char *s, *s2; + struct game *gg = &game_globals.garray[g]; + struct game g1; + + s = fd_load(fileno(fp), NULL); + if (!s) { + d_printf("Error reading game file!\n"); + return -1; + } + + /* skip first line */ + s2 = strchr(s, '\n'); + + /* remember the game state for later */ + g1 = *gg; + + /* the marshaller doesn't save zero elements, but some elements don't + default to zero. Make sure they get the right value */ + memset(&gg->not_saved_marker, 0, + sizeof(struct game) - offsetof(struct game, not_saved_marker)); + gg->game_state.gameNum = g; + + if (!s2 || unmarshall_game(gg, s2) != 0) { + d_printf("Error unmarshalling game data!\n"); + free(s); + return -1; + } + free(s); + + /* when examining we are not supposed to restore the game + state, so put it back here */ + if (g1.status == GAME_EXAMINE || g1.status == GAME_SETUP) { + gg->game_state = g1.game_state; + } + gg->status = g1.status; + + /* cope with continuing a game with timeseal that was started without it */ + gg->wRealTime = gg->wTime * 100; + gg->bRealTime = gg->bTime * 100; + + return 0; +} + + +static int ReadGameAttrs_common(FILE * fp, int g,int version) +{ + if (version == 9 || version == 100) { + return ReadGameAttrs_v100(fp, g); + } + + return ReadGameAttrs_old(fp, g, version); +} + +int ReadGameAttrs_exam(FILE * fp, int g) +{ + int version = 0; + char line[MAX_GLINE_SIZE]; + + fgets(line, MAX_GLINE_SIZE - 1, fp); + + if (line[0] == 'v') { + sscanf(line, "%*c %d", &version); + + if (version < 5) + return -1; + else + return ReadGameAttrs_common(fp,g,version); + } + + else return -1; +} + +int ReadGameAttrs(FILE * fp, int g) +{ + int version = 0; + char line[MAX_GLINE_SIZE]; + + fgets(line, MAX_GLINE_SIZE - 1, fp); + + if (line[0] == 'v') { + sscanf(line, "%*c %d", &version); + } + return ReadGameAttrs_common(fp,g,version); +} + +int game_read(int g, int wp, int bp) +{ + FILE *fp; + int piece; + + game_globals.garray[g].white = wp; + game_globals.garray[g].black = bp; +/* game_globals.garray[g].old_white = -1; + game_globals.garray[g].old_black = -1; +*/ + game_globals.garray[g].moveListSize = 0; + game_globals.garray[g].game_state.gameNum = g; + strcpy(game_globals.garray[g].white_name, player_globals.parray[wp].name); + strcpy(game_globals.garray[g].black_name, player_globals.parray[bp].name); + if (game_globals.garray[g].type == TYPE_BLITZ) { + game_globals.garray[g].white_rating = player_globals.parray[wp].b_stats.rating; + game_globals.garray[g].black_rating = player_globals.parray[bp].b_stats.rating; + } else if (game_globals.garray[g].type == TYPE_WILD) { + game_globals.garray[g].white_rating = player_globals.parray[wp].w_stats.rating; + game_globals.garray[g].black_rating = player_globals.parray[bp].w_stats.rating; + } else if (game_globals.garray[g].type == TYPE_LIGHT) { + game_globals.garray[g].white_rating = player_globals.parray[wp].l_stats.rating; + game_globals.garray[g].black_rating = player_globals.parray[bp].l_stats.rating; + } else if (game_globals.garray[g].type == TYPE_BUGHOUSE) { + game_globals.garray[g].white_rating = player_globals.parray[wp].bug_stats.rating; + game_globals.garray[g].black_rating = player_globals.parray[bp].bug_stats.rating; + } else { + game_globals.garray[g].white_rating = player_globals.parray[wp].s_stats.rating; + game_globals.garray[g].black_rating = player_globals.parray[bp].s_stats.rating; + } + fp = fopen_p("%s/%c/%s-%s", "r", ADJOURNED_DIR, player_globals.parray[wp].login[0], + player_globals.parray[wp].login, player_globals.parray[bp].login); + if (!fp) { + return -1; + } + for (piece=PAWN; piece <= QUEEN; piece++) { + game_globals.garray[g].game_state.holding[0][piece-PAWN] + = game_globals.garray[g].game_state.holding[1][piece-PAWN] = 0; + } + if (ReadGameAttrs(fp, g) < 0) { + fclose(fp); + return -1; + } + fclose(fp); + + if (game_globals.garray[g].result == END_ADJOURN + || game_globals.garray[g].result == END_COURTESYADJOURN) + game_globals.garray[g].result = END_NOTENDED; + game_globals.garray[g].status = GAME_ACTIVE; + game_globals.garray[g].startTime = tenth_secs(); + game_globals.garray[g].lastMoveTime = game_globals.garray[g].startTime; + game_globals.garray[g].lastDecTime = game_globals.garray[g].startTime; + + /* cope with continuing a game with timeseal that was started without it */ + game_globals.garray[g].wRealTime = game_globals.garray[g].wTime * 100; + game_globals.garray[g].bRealTime = game_globals.garray[g].bTime * 100; + + /* Need to do notification and pending cleanup */ + return 0; +} + +int game_delete(int wp, int bp) +{ + char fname[MAX_FILENAME_SIZE]; + char lname[MAX_FILENAME_SIZE]; + + sprintf(fname, "%s/%c/%s-%s", ADJOURNED_DIR, player_globals.parray[wp].login[0], + player_globals.parray[wp].login, player_globals.parray[bp].login); + sprintf(lname, "%s/%c/%s-%s", ADJOURNED_DIR, player_globals.parray[bp].login[0], + player_globals.parray[wp].login, player_globals.parray[bp].login); + unlink(fname); + unlink(lname); + return 0; +} + +int game_save(int g) +{ + FILE *fp; + struct player *wp, *bp; + struct game *gg = &game_globals.garray[g]; + char *fname; + + wp = &player_globals.parray[gg->white]; + bp = &player_globals.parray[gg->black]; + asprintf(&fname, "%s/%c/%s-%s", ADJOURNED_DIR, wp->login[0], + wp->login, bp->login); + fp = fopen_p("%s", "w", fname); + if (!fp) { + d_printf("CHESSD: Problem opening adjourn file %s-%s for write\n", + wp->login, bp->login); + free(fname); + return -1; + } + WriteGameFile_v100(fp, g); + fclose(fp); + /* Create link for easier stored game finding */ + if (bp->login[0] != wp->login[0]) { + char *lname; + asprintf(&lname, "%s/%c/%s-%s", ADJOURNED_DIR, bp->login[0], + wp->login, bp->login); + link(fname, lname); + free(lname); + } + free(fname); + return 0; +} + +static long OldestHistGame(char *login) +{ + FILE *fp; + long when; + + fp = fopen_p("%s/player_data/%c/%s.%s", "r", STATS_DIR, + login[0], login, STATS_GAMES); + if (fp == NULL) { + fp = fopen_p("%s/player_data/%c/.rem.%s.%s", "r", STATS_DIR, + login[0], login, STATS_GAMES); + } + if (!fp) return 0; + + fscanf(fp, "%*d %*c %*d %*c %*d %*s %*s %*d %*d %*d %*d %*s %*s %ld", + &when); + fclose(fp); + return when; +} + +static void RemoveHistGame(char *file, int maxlines) +{ + FILE *fp; + char GameFile[MAX_FILENAME_SIZE]; + char Opponent[MAX_LOGIN_NAME]; + char line[MAX_LINE_SIZE]; + long When, oppWhen; + int count = 0; + + fp = fopen_p("%s", "r", file); + if (fp == NULL) + return; + + fgets(line, MAX_LINE_SIZE - 1, fp); + sscanf(line, "%*d %*c %*d %*c %*d %s %*s %*d %*d %*d %*d %*s %*s %ld", + Opponent, &When); + count++; + + while (!feof(fp)) { + fgets(line, MAX_LINE_SIZE - 1, fp); + if (!feof(fp)) + count++; + } + fclose(fp); + + stolower(Opponent); + if (count > maxlines) { + truncate_file(file, maxlines); + + oppWhen = OldestHistGame(Opponent); + if (oppWhen > When || oppWhen <= 0L) { + sprintf(GameFile, "%s/%ld/%ld", HISTORY_DIR, When % 100, When); + unlink(GameFile); + } + } +} + +void RemHist(char *who) +{ + FILE *fp; + char Opp[MAX_LOGIN_NAME]; + long When, oppWhen; + + fp = fopen_p("%s/player_data/%c/%s.%s", "r", + STATS_DIR, + who[0], who, STATS_GAMES); + if (!fp) { + return; + } + while (!feof(fp)) { + fscanf(fp, "%*d %*c %*d %*c %*d %s %*s %*d %*d %*d %*d %*s %*s %ld", + Opp, &When); + stolower(Opp); + oppWhen = OldestHistGame(Opp); + if (oppWhen > When || oppWhen <= 0L) { + char *fName; + asprintf(&fName, "%s/%ld/%ld", HISTORY_DIR, When % 100, When); + unlink(fName); + free(fName); + } + } + fclose(fp); +} + +static void write_g_out(int g, char *file, int maxlines, int isDraw, + char *EndSymbol, char *name, time_t *now) +{ + FILE *fp; + int wp, bp; + int wr, br; + char type[4]; + char tmp[2048]; + char *ptmp = tmp; + char cResult; + int count = -1; + char *goteco; + + wp = game_globals.garray[g].white; + bp = game_globals.garray[g].black; + + if (game_globals.garray[g].private) { + type[0] = 'p'; + } else { + type[0] = ' '; + } + if (game_globals.garray[g].type == TYPE_BLITZ) { + wr = player_globals.parray[wp].b_stats.rating; + br = player_globals.parray[bp].b_stats.rating; + type[1] = 'b'; + } else if (game_globals.garray[g].type == TYPE_WILD) { + wr = player_globals.parray[wp].w_stats.rating; + br = player_globals.parray[bp].w_stats.rating; + type[1] = 'w'; + } else if (game_globals.garray[g].type == TYPE_STAND) { + wr = player_globals.parray[wp].s_stats.rating; + br = player_globals.parray[bp].s_stats.rating; + type[1] = 's'; + } else if (game_globals.garray[g].type == TYPE_LIGHT) { + wr = player_globals.parray[wp].l_stats.rating; + br = player_globals.parray[bp].l_stats.rating; + type[1] = 'l'; + } else if (game_globals.garray[g].type == TYPE_BUGHOUSE) { + wr = player_globals.parray[wp].bug_stats.rating; + br = player_globals.parray[bp].bug_stats.rating; + type[1] = 'B'; + } else { + wr = 0; + br = 0; + if (game_globals.garray[g].type == TYPE_NONSTANDARD) + type[1] = 'n'; + else + type[1] = 'u'; + } + if (game_globals.garray[g].rated) { + type[2] = 'r'; + } else { + type[2] = 'u'; + } + type[3] = '\0'; + + fp = fopen_s(file, "r"); + if (fp) { + while (!feof(fp)) + fgets(tmp, 1024, fp); + sscanf(ptmp, "%d", &count); + fclose(fp); + } + count = (count + 1) % 100; + + fp = fopen_s(file, "a"); + if (!fp) + return; + + goteco = getECO(g); + +/* Counter Result MyRating MyColor OppRating OppName [pbr 2 12 2 12] ECO End Date */ + if (name == player_globals.parray[wp].name) { + if (isDraw) + cResult = '='; + else if (game_globals.garray[g].winner == WHITE) + cResult = '+'; + else + cResult = '-'; + + fprintf(fp, "%d %c %d W %d %s %s %d %d %d %d %s %s %ld\n", + count, cResult, wr, br, player_globals.parray[bp].name, type, + game_globals.garray[g].wInitTime, game_globals.garray[g].wIncrement, + game_globals.garray[g].bInitTime, game_globals.garray[g].bIncrement, + goteco, + EndSymbol, + (long) *now); + } else { + if (isDraw) + cResult = '='; + else if (game_globals.garray[g].winner == BLACK) + cResult = '+'; + else + cResult = '-'; + + fprintf(fp, "%d %c %d B %d %s %s %d %d %d %d %s %s %ld\n", + count, cResult, br, wr, player_globals.parray[wp].name, type, + game_globals.garray[g].wInitTime, game_globals.garray[g].wIncrement, + game_globals.garray[g].bInitTime, game_globals.garray[g].bIncrement, + goteco, + EndSymbol, + (long) *now); + } + fclose(fp); + + RemoveHistGame(file, maxlines); +} + +/* Test if entry is present - 1 yes 0 no */ +/* returns -1 if an error */ + +char get_journalgame_type(int p,char* fname,char slot) + +{ + struct player *pp = &player_globals.parray[p]; + char cur_slot; + char type[4]; + + FILE* fp = fopen_s(fname,"r"); + if (!fp) { + d_printf("Corrupt journal file! %s\n",fname); + pprintf (p, "The journal file is corrupt! See an admin.\n"); + return 0; + } + + while (!feof(fp)) { + if (fscanf(fp, "%c %*s %*d %*s %*d %s %*d %*d %*s %*s %*s\n", + &cur_slot,type) != 2) { + d_printf( "CHESSD: Error in journal info format for player %s.\n", + pp->name); + pprintf(p, "The journal file is corrupt! Error in internal format.\n"); + return '\0'; + } + if (cur_slot == slot) { + fclose (fp); + if (type[0] == 'p') + return type[1]; + else + return type[0]; + } + } + fclose (fp); + return '0'; +} + + +/* Returns 1 if successful */ + +int removejournalitem(int p, char slot,FILE* fp,char* fname, int* empty) + +{ + FILE* fp_new; + int found = 0; + struct journal* j; + + *empty = 1; + fp_new = fopen_s(fname, "w"); + if (!fp_new) { + d_printf("Can't write to journal %s!\n",fname); + pprintf (p, "Was unable to write to the file! See an admin.\n"); + return 0; + } + j = (struct journal*) malloc(sizeof(struct journal)); + while (!feof(fp)) { + if (fscanf(fp, "%c %s %d %s %d %s %d %d %s %s %s\n", + &j->slot, + j->WhiteName, + &j->WhiteRating, + j->BlackName, + &j->BlackRating, + j->type, + &j->t, &j->i, + j->eco, + j->ending, + j->result) != 11) { + d_printf( "CHESSD: Error in journal info format. %s\n", fname); + pprintf(p, "The journal file is corrupt! Error in internal format.\n"); + fclose(fp_new); + free (j); + return 0; + } + if (slot != j->slot) { + *empty = 0; + fprintf(fp_new, "%c %s %d %s %d %s %d %d %s %s %s\n", + j->slot, + j->WhiteName, + j->WhiteRating, + j->BlackName, + j->BlackRating, + j->type, + j->t, j->i, + j->eco, + j->ending, + j->result); + } else + found = 1; + } + fclose(fp_new); + free (j); + return found; +} + +/* Find from_spot in journal list - return 0 if corrupted */ +int journal_get_info(int p, char from_spot,struct journal* j, char *fname) +{ + FILE *fp; + + fp = fopen_s(fname, "r"); + if (!fp) { + d_printf("Corrupt journal file! %s\n",fname); + pprintf (p, "The journal file is corrupt! See an admin.\n"); + return 0; + } + while (!feof(fp)) { + if (fscanf(fp, "%c %s %d %s %d %s %d %d %s %s %s\n", + &j->slot, + j->WhiteName, + &j->WhiteRating, + j->BlackName, + &j->BlackRating, + j->type, + &j->t, &j->i, + j->eco, + j->ending, + j->result) != 11) { + d_printf( "CHESSD: Error in journal info format. %s\n", fname); + pprintf(p, "The journal file is corrupt! Error in internal format.\n"); + fclose(fp); + return 0; + } + if (tolower(j->slot) == from_spot) { + fclose(fp); + return 1; + } + } + fclose(fp); + return 0; +} + +void addjournalitem(int p,struct journal* j_add, char* fname) +{ + struct journal* j_cur; + int have_output=0; + char fname2[MAX_FILENAME_SIZE]; + FILE *fp; + FILE *fp2; + + strcpy (fname2,fname); + strcat (fname2,".w"); + fp2 = fopen_s(fname2, "w"); + if (!fp2) { + d_printf( "CHESSD: Problem opening file %s for write\n", fname); + pprintf (p, "Couldn't update journal! Report this to an admin.\n"); + return; + } + fp = fopen_s(fname, "r"); + if (!fp) { /* Empty? */ + fprintf(fp2, "%c %s %d %s %d %s %d %d %s %s %s\n", + j_add->slot, j_add->WhiteName, j_add->WhiteRating, + j_add->BlackName, j_add->BlackRating, + j_add->type, j_add->t, j_add->i, j_add->eco, j_add->ending, + j_add->result); + fclose (fp2); + rename (fname2, fname); + return; + } else { + j_cur = (struct journal*) malloc(sizeof(struct journal)); + while (!feof(fp)) { + if (fscanf(fp, "%c %s %d %s %d %s %d %d %s %s %s\n", + &j_cur->slot, + j_cur->WhiteName, + &j_cur->WhiteRating, + j_cur->BlackName, + &j_cur->BlackRating, + j_cur->type, + &j_cur->t, &j_cur->i, + j_cur->eco, + j_cur->ending, + j_cur->result) != 11) { + d_printf( "CHESSD: Error in journal info format - aborting. %s\n", fname); + free (j_cur); + fclose(fp); + fclose(fp2); + return; + } + if ((j_cur->slot >= j_add->slot) && (!have_output)) { + + fprintf(fp2, "%c %s %d %s %d %s %d %d %s %s %s\n", + j_add->slot, + j_add->WhiteName, + j_add->WhiteRating, + j_add->BlackName, + j_add->BlackRating, + j_add->type, + j_add->t, j_add->i, + j_add->eco, + j_add->ending, + j_add->result); + have_output = 1; + + } + if (j_cur->slot != j_add->slot) { + + fprintf(fp2, "%c %s %d %s %d %s %d %d %s %s %s\n", + j_cur->slot, + j_cur->WhiteName, + j_cur->WhiteRating, + j_cur->BlackName, + j_cur->BlackRating, + j_cur->type, + j_cur->t, j_cur->i, + j_cur->eco, + j_cur->ending, + j_cur->result); + } + } + + if (!have_output) { /* Haven't written yet */ + fprintf(fp2, "%c %s %d %s %d %s %d %d %s %s %s\n", + j_add->slot, + j_add->WhiteName, + j_add->WhiteRating, + j_add->BlackName, + j_add->BlackRating, + j_add->type, + j_add->t, j_add->i, + j_add->eco, + j_add->ending, + j_add->result); + } + free (j_cur); + fclose(fp); + fclose(fp2); + rename(fname2, fname); + return; + } +} + +int pjournal(int p, int p1, char *fname) +{ + FILE *fp; + struct journal* j; + + fp = fopen_s(fname, "r"); + if (!fp) { + pprintf(p, "Sorry, no journal information available.\n"); + return COM_OK; + } + + j = (struct journal*) malloc(sizeof(struct journal)); + pprintf(p, "Journal for %s:\n", player_globals.parray[p1].name); + pprintf(p, " White Rating Black Rating Type ECO End Result\n"); + while (!feof(fp)) { + if (fscanf(fp, "%c %s %d %s %d %s %d %d %s %s %s\n", + &j->slot, + j->WhiteName, + &j->WhiteRating, + j->BlackName, + &j->BlackRating, + j->type, + &j->t, &j->i, + j->eco, + j->ending, + j->result) != 11) { + d_printf( "CHESSD: Error in journal info format. %s\n", fname); + fclose(fp); + free(j); + return COM_OK; + } + j->WhiteName[13] = '\0'; /* only first 13 chars in name */ + j->BlackName[13] = '\0'; + pprintf(p, "%c: %-13s %4d %-13s %4d [%3s%3d%4d] %s %3s %-7s\n", + j->slot, j->WhiteName, j->WhiteRating, + j->BlackName, j->BlackRating, + j->type, j->t / 600, j->i / 10, j->eco, j->ending, + j->result); + } + free (j); + fclose(fp); + return COM_OK; +} + +int pgames(int p, int p1, char *fname) +{ + FILE *fp; + time_t t; + int MyRating, OppRating; + int wt, wi, bt, bi; + char OppName[MAX_LOGIN_NAME + 1]; + char type[100]; + char eco[100]; + char ending[100]; + char MyColor[2]; + int count; + char result[2]; + + fp = fopen_s(fname, "r"); + if (!fp) { + pprintf(p, "Sorry, no game information available.\n"); + return COM_OK; + } + pprintf(p, "History for %s:\n", player_globals.parray[p1].name); + pprintf(p, " Opponent Type ECO End Date\n"); + while (!feof(fp)) { + if (fscanf(fp, "%d %s %d %s %d %s %s %d %d %d %d %s %s %ld\n", + &count, + result, + &MyRating, + MyColor, + &OppRating, + OppName, + type, + &wt, &wi, + &bt, &bi, + eco, + ending, + (long *) &t) != 14) { + d_printf( "CHESSD: Error in games info format. %s\n", fname); + fclose(fp); + return COM_OK; + } + OppName[13] = '\0'; /* only first 13 chars in name */ + pprintf(p, "%2d: %s %4d %s %4d %-13s [%3s%3d%4d] %s %3s %s", + count, result, MyRating, MyColor, + OppRating, OppName, + type, wt / 600, wi / 10, eco, ending, + ctime(&t)); + } + fclose(fp); + return COM_OK; +} + +void game_write_complete(int g, int isDraw, char *EndSymbol) +{ + char fname[MAX_FILENAME_SIZE]; + int wp = game_globals.garray[g].white, bp = game_globals.garray[g].black; + time_t now = time(NULL); + int Result; + FILE *fp = NULL; + + do { + if (fp) { + fclose(fp); + now++; + } + sprintf(fname, "%s/%ld/%ld", HISTORY_DIR, (long) now % 100, (long) now); + fp = fopen_s(fname, "r"); + } while (fp); /* terminates when the file doesn't exist */ + + fp = fopen_s(fname, "w"); + + if (fp) { + WriteGameFile_v100(fp, g); + fclose(fp); + } else { + d_printf( "Trouble writing history file %s", fname); + } + + sprintf(fname, "%s/player_data/%c/%s.%s", STATS_DIR, + player_globals.parray[wp].login[0], player_globals.parray[wp].login, STATS_GAMES); + write_g_out(g, fname, 10, isDraw, EndSymbol, player_globals.parray[wp].name, &now); + sprintf(fname, "%s/player_data/%c/%s.%s", STATS_DIR, + player_globals.parray[bp].login[0], player_globals.parray[bp].login, STATS_GAMES); + write_g_out(g, fname, 10, isDraw, EndSymbol, player_globals.parray[bp].name, &now); + + if (isDraw) + Result = -1; + else if (game_globals.garray[g].winner == WHITE) + Result = 1; + else + Result = 0; + sprintf(fname,"%s/player_data/%c/%s.gstats", STATS_DIR, player_globals.parray[game_globals.garray[g].white].login[0], player_globals.parray[game_globals.garray[g].white].login); + if ((CheckPFlag(bp, PFLAG_REG)) && (CheckPFlag(wp, PFLAG_REG)) && (game_globals.garray[g].type != TYPE_WILD)) + game_save_playerratio(fname,player_globals.parray[game_globals.garray[g].black].name,Result,game_globals.garray[g].rated); + if (isDraw) + Result = -1; + else if (game_globals.garray[g].winner == BLACK) + Result = 1; + else + Result = 0; + sprintf(fname,"%s/player_data/%c/%s.gstats", STATS_DIR, player_globals.parray[game_globals.garray[g].black].login[0], player_globals.parray[game_globals.garray[g].black].login); + if ((CheckPFlag(bp, PFLAG_REG)) && (CheckPFlag(wp, PFLAG_REG)) && (game_globals.garray[g].type != TYPE_WILD)) + game_save_playerratio(fname,player_globals.parray[game_globals.garray[g].white].name,Result,game_globals.garray[g].rated); +} + +int game_count(void) +{ + int g, count = 0; + + for (g = 0; g < game_globals.g_num; g++) { + if ((game_globals.garray[g].status == GAME_ACTIVE) || (game_globals.garray[g].status == GAME_EXAMINE) + || (game_globals.garray[g].status == GAME_SETUP)) + count++; + } + if (count > command_globals.game_high) + command_globals.game_high = count; + return count; +} + +static int check_kings(struct game_state_t *gs) +{ + /* Function written 3/28/96 by Figbert to check for 1 king each side only! */ + int blackking = 0, whiteking = 0; + int f, r; + + + for (f = 0; f < 8; f++) { + for (r = 0; r < 8; r++) { + if (gs->board[f][r] == B_KING) blackking++; + if (gs->board[f][r] == W_KING) whiteking++; + } + } + + if (blackking == 1 && whiteking == 1) return 0; /* Perfect! */ + + return -1; +} diff --git a/lasker-2.2.3/src/gamedb.h b/lasker-2.2.3/src/gamedb.h new file mode 100644 index 0000000..711700c --- /dev/null +++ b/lasker-2.2.3/src/gamedb.h @@ -0,0 +1,147 @@ +/* + Copyright (c) 1993 Richard V. Nash. + Copyright (c) 2000 Dan Papasian + Copyright (C) Andrew Tridgell 2002 + + 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., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#ifndef _GAMEDB_H +#define _GAMEDB_H + +extern const char *bstr[]; +extern const char *rstr[]; + +#define GAMEFILE_VERSION 5 +#define MAX_GLINE_SIZE 1024 + +#define REL_GAME 0 +#define REL_SPOS 1 +#define REL_REFRESH 2 +#define REL_EXAMINE 3 + +GENSTRUCT enum gamestatus {GAME_EMPTY, GAME_NEW, GAME_ACTIVE, GAME_EXAMINE, GAME_SETUP}; + +/* Do not change the order of these - DAV */ +GENSTRUCT enum gametype {TYPE_UNTIMED, TYPE_BLITZ, TYPE_STAND, TYPE_NONSTANDARD, + TYPE_WILD, TYPE_LIGHT, TYPE_BUGHOUSE}; + +#define NUM_GAMETYPES 7 + +/* OK, DAV, I'll try it another way. -- hersco */ +enum ratetype {RATE_STAND, RATE_BLITZ, RATE_WILD, RATE_LIGHT, RATE_BUGHOUSE}; +#define NUM_RATEDTYPE 5 + +#define FLAG_CHECKING -1 +#define FLAG_NONE 0 +#define FLAG_CALLED 1 +#define FLAG_ABORT 2 + +GENSTRUCT enum gameend { + END_CHECKMATE = 0, + END_RESIGN, + END_FLAG, + END_AGREEDDRAW, + END_REPETITION, + END_50MOVERULE, + END_ADJOURN, + END_LOSTCONNECTION, + END_ABORT, + END_STALEMATE, + END_NOTENDED, + END_COURTESY, + END_BOTHFLAG, + END_NOMATERIAL, + END_FLAGNOMATERIAL, + END_ADJDRAW, + END_ADJWIN, + END_ADJABORT, + END_COURTESYADJOURN +}; + +struct journal { + char slot; + char WhiteName[MAX_LOGIN_NAME]; + int WhiteRating; + char BlackName[MAX_LOGIN_NAME]; + int BlackRating; + char type[4]; + int t; + int i; + char eco[4]; + char ending[4]; + char result[8]; +}; + + +GENSTRUCT struct game { + /* Not saved in game file */ + int revertHalfMove; + int totalHalfMoves; + int white; + int black; + int link; + enum gamestatus status; + int examHalfMoves; + int examMoveListSize; + struct move_t *examMoveList; _LEN(examMoveListSize) /* extra movelist for examine */ + + unsigned startTime; /* The relative time the game started */ + unsigned lastMoveTime; /* Last time a move was made */ + unsigned lastDecTime; /* Last time a players clock was decremented */ + int flag_pending; + int wTimeWhenReceivedMove; + int wTimeWhenMoved; + int bTimeWhenReceivedMove; + int bTimeWhenMoved; + int wLastRealTime; + int wRealTime; + int bLastRealTime; + int bRealTime; + + /* this is a dummy variable used to tell which bits are saved in the structure */ + unsigned not_saved_marker; + + /* Saved in the game file */ + enum gameend result; + int winner; + int wInitTime, wIncrement; + int bInitTime, bIncrement; + time_t timeOfStart; + unsigned flag_check_time; + int wTime; + int bTime; + int clockStopped; + int rated; + int private; + enum gametype type; + int passes; /* For simul's */ + int numHalfMoves; + int moveListSize; /* Total allocated in *moveList */ + struct move_t *moveList; _LEN(moveListSize) /* primary movelist */ + char FENstartPos[74]; _NULLTERM /* Save the starting position. */ + struct game_state_t game_state; + + char white_name[MAX_LOGIN_NAME]; _NULLTERM /* to hold the playername even after he disconnects */ + char black_name[MAX_LOGIN_NAME]; _NULLTERM + int white_rating; + int black_rating; +}; + +extern const char *TypeStrings[NUM_GAMETYPES]; +extern const char *TypeChars[NUM_GAMETYPES]; + +#endif + diff --git a/lasker-2.2.3/src/gamedb_old.c b/lasker-2.2.3/src/gamedb_old.c new file mode 100644 index 0000000..e9d9306 --- /dev/null +++ b/lasker-2.2.3/src/gamedb_old.c @@ -0,0 +1,454 @@ +/* + Copyright (c) 1993 Richard V. Nash. + Copyright (c) 2000 Dan Papasian + Copyright (C) Andrew Tridgell 2002 + + 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., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#include "includes.h" + +#if 0 +/* One line has everything on it */ +static int WriteMoves(FILE * fp, struct move_t *m) +{ + unsigned long MoveInfo = (m->color == BLACK); + int piece, castle; + int useFile = 0, useRank = 0, check = 0; + int i; + + castle = (m->moveString[0] == 'o'); + if (castle) + piece = KING; + else + piece = piecetype(CharToPiece(m->moveString[0])); + + MoveInfo = (MoveInfo <<= 3) | piece; + MoveInfo = (MoveInfo <<= 3) | m->fromFile; + MoveInfo = (MoveInfo <<= 3) | m->fromRank; + MoveInfo = (MoveInfo <<= 3) | m->toFile; + MoveInfo = (MoveInfo <<= 3) | m->toRank; + MoveInfo = (MoveInfo <<= 3) | (m->pieceCaptured & 7); + MoveInfo = (MoveInfo <<= 3) | (m->piecePromotionTo & 7); + MoveInfo = (MoveInfo <<= 1) | (m->enPassant != 0); + + /* Are we using from-file or from-rank in algString? */ + i = strlen(m->algString) - 1; + if (m->algString[i] == '+') { + check = 1; + i--; + } + if (piece != PAWN && !castle) { + i -= 2; + if (i < 0) + return -1; + if (m->algString[i] == 'x') + i--; + if (i < 0) + return -1; + if (isdigit(m->algString[i])) { + useRank = 2; + i--; + } + if (i < 0) + return -1; + useFile = (islower(m->algString[i]) ? 4 : 0); + } + MoveInfo = (MoveInfo << 3) | useFile | useRank | check; + fprintf(fp, "%lx %x %x\n", MoveInfo, m->tookTime, m->atTime); + + return 0; +} +#endif + +static int ReadMove(FILE * fp, struct move_t *m) +{ + char line[MAX_GLINE_SIZE]; + fgets(line, MAX_GLINE_SIZE - 1, fp); + if (sscanf(line, "%d %d %d %d %d %d %d %d %d \"%[^\"]\" \"%[^\"]\" %u %u\n", + &m->color, &m->fromFile, &m->fromRank, &m->toFile, &m->toRank, + &m->pieceCaptured, &m->piecePromotionTo, &m->enPassant, &m->doublePawn, + m->moveString, m->algString, &m->atTime, &m->tookTime) != 13) + return -1; + return 0; +} + +#if 0 +static void WriteGameState(FILE * fp, struct game_state_t *gs) +{ + int i, j; + + for (i = 0; i < 8; i++) + for (j = 0; j < 8; j++) { + fprintf(fp, "%c", PieceToChar(gs->board[i][j])); + } + fprintf(fp, "%d %d %d %d %d %d", + gs->wkmoved, gs->wqrmoved, gs->wkrmoved, + gs->bkmoved, gs->bqrmoved, gs->bkrmoved); + for (i = 0; i < 8; i++) + fprintf(fp, " %d %d", gs->ep_possible[0][i], gs->ep_possible[1][i]); + fprintf(fp, " %d %d %d\n", gs->lastIrreversable, gs->onMove, gs->moveNum); +} +#endif + +#if 0 +static void WriteGameFile(FILE * fp, int g) +{ + int i; + struct game *gg = &game_globals.garray[g]; + struct player *wp = &player_globals.parray[gg->white], *bp = &player_globals.parray[gg->black]; + + fprintf(fp, "v %d\n", GAMEFILE_VERSION); + fprintf(fp, "%s %s\n", wp->name, bp->name); + fprintf(fp, "%d %d\n", gg->white_rating, gg->black_rating); + fprintf(fp, "%d %d %d %d\n", gg->wInitTime, gg->wIncrement, + gg->bInitTime, gg->bIncrement); + fprintf(fp, "%lx\n", gg->timeOfStart); + fprintf(fp, "%d %d\n", + (net_globals.con[wp->socket]->timeseal ? gg->wRealTime/100 : gg->wTime), + (net_globals.con[bp->socket]->timeseal ? gg->bRealTime/100 : gg->bTime)); + fprintf(fp, "%d %d\n", gg->result, gg->winner); + fprintf(fp, "%d %d %d %d\n", gg->private, gg->type, + gg->rated, gg->clockStopped); + fprintf(fp, "%d\n", gg->numHalfMoves); + for (i = 0; i < game_globals.garray[g].numHalfMoves; i++) { + WriteMoves(fp, &game_globals.garray[g].moveList[i]); + } +/* took out the next 3 lines to see if it helps with the crash bug we are + having on examine... fb 2.25.96 */ +/* The next three lines stop wild games crashing the system - they are vital. + I fixed the problem with examine - don't remove these again - DAV */ + if (strcmp(gg->FENstartPos, INITIAL_FEN) != 0) + fprintf (fp, "%s\n",gg->FENstartPos); + else + fprintf (fp, "d w\n"); + WriteGameState(fp, &game_globals.garray[g].game_state); +} +#endif + + + +static int ReadGameState(FILE * fp, struct game_state_t *gs, int version) +{ + int i, j; + char pieceChar; + int wkmoved, wqrmoved, wkrmoved, bkmoved, bqrmoved, bkrmoved; + + if (version == 0) { + for (i = 0; i < 8; i++) + for (j = 0; j < 8; j++) + if (fscanf(fp, "%d ", &gs->board[i][j]) != 1) + return -1; + } else { + for (i = 0; i < 8; i++) + for (j = 0; j < 8; j++) { + pieceChar = getc(fp); + gs->board[i][j] = CharToPiece(pieceChar); + } + } + if (fscanf(fp, "%d %d %d %d %d %d", + &wkmoved, &wqrmoved, &wkrmoved, + &bkmoved, &bqrmoved, &bkrmoved) != 6) + return -1; + gs->wkmoved = wkmoved; + gs->wqrmoved = wqrmoved; + gs->wkrmoved = wkrmoved; + gs->bkmoved = bkmoved; + gs->bqrmoved = bqrmoved; + gs->bkrmoved = bkrmoved; + for (i = 0; i < 8; i++) + if (fscanf(fp, " %d %d", &gs->ep_possible[0][i], &gs->ep_possible[1][i]) != 2) + return -1; + if (fscanf(fp, " %d %d %d\n", &gs->lastIrreversable, &gs->onMove, &gs->moveNum) != 3) + return -1; + return 0; +} + + +static int got_attr_value(int g, char *attr, char *value, FILE * fp) +{ + int i; + + if (!strcmp(attr, "w_init:")) { + game_globals.garray[g].wInitTime = atoi(value); + } else if (!strcmp(attr, "w_inc:")) { + game_globals.garray[g].wIncrement = atoi(value); + } else if (!strcmp(attr, "b_init:")) { + game_globals.garray[g].bInitTime = atoi(value); + } else if (!strcmp(attr, "b_inc:")) { + game_globals.garray[g].bIncrement = atoi(value); + } else if (!strcmp(attr, "white_name:")) { + strcpy(game_globals.garray[g].white_name, value); + } else if (!strcmp(attr, "black_name:")) { + strcpy(game_globals.garray[g].black_name, value); + } else if (!strcmp(attr, "white_rating:")) { + game_globals.garray[g].white_rating = atoi(value); + } else if (!strcmp(attr, "black_rating:")) { + game_globals.garray[g].black_rating = atoi(value); + } else if (!strcmp(attr, "result:")) { + game_globals.garray[g].result = atoi(value); + } else if (!strcmp(attr, "timestart:")) { + game_globals.garray[g].timeOfStart = atoi(value); + } else if (!strcmp(attr, "w_time:")) { + game_globals.garray[g].wTime = atoi(value); + } else if (!strcmp(attr, "b_time:")) { + game_globals.garray[g].bTime = atoi(value); + } else if (!strcmp(attr, "clockstopped:")) { + game_globals.garray[g].clockStopped = atoi(value); + } else if (!strcmp(attr, "rated:")) { + game_globals.garray[g].rated = atoi(value); + } else if (!strcmp(attr, "private:")) { + game_globals.garray[g].private = atoi(value); + } else if (!strcmp(attr, "type:")) { + game_globals.garray[g].type = atoi(value); + } else if (!strcmp(attr, "halfmoves:")) { + game_globals.garray[g].numHalfMoves = atoi(value); + if (game_globals.garray[g].numHalfMoves == 0) + return 0; + game_globals.garray[g].moveListSize = game_globals.garray[g].numHalfMoves; + game_globals.garray[g].moveList = (struct move_t *) malloc(sizeof(struct move_t) * game_globals.garray[g].moveListSize); + for (i = 0; i < game_globals.garray[g].numHalfMoves; i++) { + if (ReadMove(fp, &game_globals.garray[g].moveList[i])) { + d_printf( "CHESSD: Trouble reading moves\n"); + return -1; + } + } + } else if (!strcmp(attr, "gamestate:")) { /* Value meaningless */ + if (game_globals.garray[g].status != GAME_EXAMINE && game_globals.garray[g].status != GAME_SETUP && + ReadGameState(fp, &game_globals.garray[g].game_state, 0)) { + d_printf( "CHESSD: Trouble reading game state\n"); + return -1; + } + } else { + d_printf( "CHESSD: Error bad attribute >%s<\n", attr); + } + return 0; +} + +static void ReadOneV1Move(FILE * fp, struct move_t *m) +{ + int i; + char PieceChar; + int useFile, useRank, check, piece; + unsigned long MoveInfo; + + fscanf(fp, "%lx %x %x", &MoveInfo, &m->tookTime, &m->atTime); + check = MoveInfo & 1; + useRank = MoveInfo & 2; + useFile = MoveInfo & 4; + MoveInfo >>= 3; + m->enPassant = MoveInfo & 1; /* may have to negate later. */ + MoveInfo >>= 1; + m->piecePromotionTo = MoveInfo & 7; /* may have to change color. */ + MoveInfo >>= 3; + m->pieceCaptured = MoveInfo & 7; /* may have to change color. */ + MoveInfo >>= 3; + m->toRank = MoveInfo & 7; + MoveInfo >>= 3; + m->toFile = MoveInfo & 7; + MoveInfo >>= 3; + m->fromRank = MoveInfo & 7; + MoveInfo >>= 3; + m->fromFile = MoveInfo & 7; + MoveInfo >>= 3; + piece = MoveInfo & 7; + + m->color = (MoveInfo & 8) ? BLACK : WHITE; + if (m->pieceCaptured != NOPIECE) { + if (m->color == BLACK) + m->pieceCaptured |= WHITE; + else + m->pieceCaptured |= BLACK; + } + if (piece == PAWN) { + PieceChar = 'P'; + if ((m->toRank == 3 && m->fromRank == 1) + || (m->toRank == 4 && m->fromRank == 6)) + m->doublePawn = m->toFile; + else + m->doublePawn = -1; + if (m->pieceCaptured) + sprintf(m->algString, "%cx%c%d", 'a' + m->fromFile, + 'a' + m->toFile, m->toRank + 1); + else + sprintf(m->algString, "%c%d", 'a' + m->toFile, m->toRank + 1); + if (m->piecePromotionTo != 0) { + if (m->piecePromotionTo == KNIGHT) + strcat(m->algString, "=N"); + else if (m->piecePromotionTo == BISHOP) + strcat(m->algString, "=B"); + else if (m->piecePromotionTo == ROOK) + strcat(m->algString, "=R"); + else if (m->piecePromotionTo == QUEEN) + strcat(m->algString, "=Q"); + m->piecePromotionTo |= m->color; + } + if (m->enPassant) + m->enPassant = m->toFile - m->fromFile; + } else { + m->doublePawn = -1; + PieceChar = PieceToChar(piecetype(piece) | WHITE); + if (PieceChar == 'K' && m->fromFile == 4 && m->toFile == 6) { + strcpy(m->algString, "O-O"); + strcpy(m->moveString, "o-o"); + } else if (PieceChar == 'K' && m->fromFile == 4 && m->toFile == 2) { + strcpy(m->algString, "O-O-O"); + strcpy(m->moveString, "o-o-o"); + } else { + i = 0; + m->algString[i++] = PieceChar; + if (useFile) + m->algString[i++] = 'a' + m->fromFile; + if (useRank) + m->algString[i++] = '1' + m->fromRank; + if (m->pieceCaptured != 0) + m->algString[i++] = 'x'; + m->algString[i++] = 'a' + m->toFile; + m->algString[i++] = '1' + m->toRank; + m->algString[i] = '\0'; + } + } + if (m->algString[0] != 'O') + sprintf(m->moveString, "%c/%c%d-%c%d", PieceChar, 'a' + m->fromFile, + m->fromRank + 1, 'a' + m->toFile, m->toRank + 1); + if (check) + strcat(m->algString, "+"); +} + +static int ReadV1Moves(struct game *g, FILE * fp) +{ + int i; + + g->moveListSize = g->numHalfMoves; + g->moveList = (struct move_t *) malloc(sizeof(struct move_t) * g->moveListSize); + for (i = 0; i < g->numHalfMoves; i++) { + ReadOneV1Move(fp, &g->moveList[i]); + } + return 0; +} + +static int ReadV1GameFmt(struct game *g, FILE * fp, int version) +{ + char* FEN; + char tmp[MAX_STRING_LENGTH]; + unsigned result; + + fscanf(fp, "%s %s", g->white_name, g->black_name); + fscanf(fp, "%d %d", &g->white_rating, &g->black_rating); + fscanf(fp, "%d %d %d %d", &g->wInitTime, &g->wIncrement, + &g->bInitTime, &g->bIncrement); + if ((version < 3) && (!(g->bInitTime))) + g->bInitTime = g->wInitTime; + /*PRE-V3 assumed bInitTime was 0 if balanced clocks*/ + fscanf(fp, "%lx", &g->timeOfStart); + fscanf(fp, "%d %d", &g->wTime, &g->bTime); + +/* fixing an (apparently) old bug: winner not saved */ + if (version > 1) + fscanf(fp, "%d %d", &result, &g->winner); + else + fscanf(fp, "%d", &result); + + g->result = (enum gameend)result; + + fscanf(fp, "%d %d %d %d", &g->private, (int *) &g->type, + &g->rated, &g->clockStopped); + fscanf(fp, "%d", &g->numHalfMoves); + ReadV1Moves(g, fp); + + if (version >= 4) { + getc(fp); /* Skip past a newline. */ + + fgets(tmp, MAX_LINE_SIZE, fp); + tmp [strlen(tmp)-1] = '\0'; /* kill the newline char */ + + if ((tmp[0] == '\0') || (!strcmp(tmp,"d w"))) { + /* default position */ + strcpy (g->FENstartPos,INITIAL_FEN); + } else { + if (!strcmp(tmp,"rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR")) + /* missing colour for default pos 1.7.1 bug */ + strcpy(g->FENstartPos,INITIAL_FEN); + else { + strcpy (g->FENstartPos,tmp); + FEN = g->FENstartPos; + while (*(FEN) != '/') { /* check for missing fen pos (1.7.1 bug) */ + if (*(FEN++) == '\0') { + d_printf("Corrupt game %s vs %s!\n",g->white_name,g->black_name); + return -1; + } + } + } + } + } else + getc(fp); /* Skip past a newline. */ + + if (g->status != GAME_EXAMINE && g->status != GAME_SETUP) { + if (ReadGameState(fp, &g->game_state, version)) { + d_printf( "CHESSD: Trouble reading game state\n"); + return -1; + } + } else if (g->status == GAME_EXAMINE) + FEN_to_board(g->FENstartPos, &g->game_state); + return 0; +} + + +int ReadGameAttrs_old(FILE * fp, int g,int version) +{ + int len; + char *attr, *value; + char line[MAX_GLINE_SIZE]; + + if (version > 0) { + if ((ReadV1GameFmt(&game_globals.garray[g], fp, version)) < 0) + return -1; + } + /* Read the game file here */ + else + do { + if ((len = strlen(line)) <= 1) { + fgets(line, MAX_GLINE_SIZE - 1, fp); + continue; + } + line[len - 1] = '\0'; + attr = eatwhite(line); + if (attr[0] == '#') + continue; /* Comment */ + value = eatword(attr); + if (!*value) { + d_printf( "CHESSD: Error reading file\n"); + fgets(line, MAX_GLINE_SIZE - 1, fp); + continue; + } + *value = '\0'; + value++; + value = eatwhite(value); + if (!*value) { + d_printf( "CHESSD: Error reading file\n"); + fgets(line, MAX_GLINE_SIZE - 1, fp); + continue; + } + stolower(attr); + if (got_attr_value(g, attr, value, fp)) { + return -1; + } + fgets(line, MAX_GLINE_SIZE - 1, fp); + } while (!feof(fp)); + if (!(game_globals.garray[g].bInitTime)) + game_globals.garray[g].bInitTime = game_globals.garray[g].wInitTime; + + return 0; +} diff --git a/lasker-2.2.3/src/gameproc.c b/lasker-2.2.3/src/gameproc.c new file mode 100644 index 0000000..7e2cd5d --- /dev/null +++ b/lasker-2.2.3/src/gameproc.c @@ -0,0 +1,1944 @@ +/* + Copyright (c) 1993 Richard V. Nash. + Copyright (c) 2000 Dan Papasian + Copyright (C) Andrew Tridgell 2002 + + 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., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#include "includes.h" + +/*Let users know that someone is available (format the message)*/ +static void getavailmess(int p, char* message) +{ + struct player *pp = &player_globals.parray[p]; + char titles[100]; + + titles [0]='\0'; + AddPlayerLists(p,titles); + sprintf (message,"%s%s Blitz (%s), Std (%s), Wild (%s), Light(%s), Bug(%s)\n" + " is now available for matches.", + pp->name, titles, + ratstrii(pp->b_stats.rating, p), + ratstrii(pp->s_stats.rating, p), + ratstrii(pp->w_stats.rating, p), + ratstrii(pp->l_stats.rating, p), + ratstrii(pp->bug_stats.rating, p)); +} + +void getnotavailmess(int p, char* message) +{ + struct player *pp = &player_globals.parray[p]; + char titles[100]; + + titles[0]='\0'; + AddPlayerLists(p,titles); + sprintf (message,"%s%s is no longer available for matches.", + pp->name, titles); +} + +void announce_avail(int p) +{ + struct player *pp = &player_globals.parray[p]; + char avail[200]; + int p1; + if ((pp->game < 0) && (CheckPFlag(p, PFLAG_OPEN))) { + getavailmess (p,avail); + + for (p1 = 0; p1 < player_globals.p_num; p1++) { + if (p == p1) + continue; + if (player_globals.parray[p1].status != PLAYER_PROMPT) + continue; + if (CheckPFlag(p1, PFLAG_AVAIL) && CheckPFlag(p1, PFLAG_OPEN) + && (player_globals.parray[p1].game < 0)) + if (((pp->b_stats.rating <= player_globals.parray[p1].availmax) && (pp->b_stats.rating >= player_globals.parray[p1].availmin)) || (!player_globals.parray[p1].availmax)) + pprintf_prompt (p1,"\n%s\n",avail); + } + } +} + +void announce_notavail(int p) +{ + struct player *pp = &player_globals.parray[p]; + char avail[200]; + int p1; + + getnotavailmess (p,avail); + + for (p1 = 0; p1 < player_globals.p_num; p1++) { + if (p == p1) + continue; + if (player_globals.parray[p1].status != PLAYER_PROMPT) + continue; + if (CheckPFlag(p1, PFLAG_AVAIL) && CheckPFlag(p1, PFLAG_OPEN) + && (player_globals.parray[p1].game < 0)) + if (((pp->b_stats.rating <= player_globals.parray[p1].availmax) && (pp->b_stats.rating >= player_globals.parray[p1].availmin)) || (!player_globals.parray[p1].availmax)) + pprintf_prompt (p1,"\n%s\n",avail); + } +} + +void game_ended(int g, int winner, int why) +{ + struct game *gg = &game_globals.garray[g]; + char outstr[200]; + char avail_black[200]; /* for announcing white/black avail */ + char avail_white[200]; + char avail_bugwhite[200]; + char avail_bugblack[200]; + char tmp[200]; + int p; + int gl = gg->link; + int rate_change = 0; + int isDraw = 0; + int whiteResult; + char winSymbol[10]; + char EndSymbol[10]; + char *NameOfWinner, *NameOfLoser; + int beingplayed = 0; /* i.e. it wasn't loaded for adjudication */ + int print_avail = 0; + + avail_white[0] = '\0'; + avail_black[0] = '\0'; + avail_bugwhite[0] = '\0'; + avail_bugblack[0] = '\0'; + + beingplayed = (player_globals.parray[gg->black].game == g); + + sprintf(outstr, "\n{Game %d (%s vs. %s) ", g + 1, + player_globals.parray[gg->white].name, + player_globals.parray[gg->black].name); + gg->result = why; + gg->winner = winner; + if (winner == WHITE) { + whiteResult = RESULT_WIN; + strcpy(winSymbol, "1-0"); + NameOfWinner = player_globals.parray[gg->white].name; + NameOfLoser = player_globals.parray[gg->black].name; + } else { + whiteResult = RESULT_LOSS; + strcpy(winSymbol, "0-1"); + NameOfWinner = player_globals.parray[gg->black].name; + NameOfLoser = player_globals.parray[gg->white].name; + } + switch (why) { + case END_CHECKMATE: + sprintf(tmp, "%s checkmated} %s", NameOfLoser, winSymbol); + strcpy(EndSymbol, "Mat"); + rate_change = 1; + break; + case END_RESIGN: + sprintf(tmp, "%s resigns} %s", NameOfLoser, winSymbol); + strcpy(EndSymbol, "Res"); + rate_change = 1; + break; + case END_FLAG: + sprintf(tmp, "%s forfeits on time} %s", NameOfLoser, winSymbol); + strcpy(EndSymbol, "Fla"); + rate_change = 1; + break; + case END_STALEMATE: + sprintf(tmp, "Game drawn by stalemate} 1/2-1/2"); + isDraw = 1; + strcpy(EndSymbol, "Sta"); + rate_change = 1; + whiteResult = RESULT_DRAW; + break; + case END_AGREEDDRAW: + sprintf(tmp, "Game drawn by mutual agreement} 1/2-1/2"); + isDraw = 1; + strcpy(EndSymbol, "Agr"); + rate_change = 1; + whiteResult = RESULT_DRAW; + break; + case END_BOTHFLAG: + sprintf(tmp, "Game drawn because both players ran out of time} 1/2-1/2"); + isDraw = 1; + strcpy(EndSymbol, "Fla"); + rate_change = 1; + whiteResult = RESULT_DRAW; + break; + case END_REPETITION: + sprintf(tmp, "Game drawn by repetition} 1/2-1/2"); + isDraw = 1; + strcpy(EndSymbol, "Rep"); + rate_change = 1; + whiteResult = RESULT_DRAW; + break; + case END_50MOVERULE: + sprintf(tmp, "Game drawn by the 50 move rule} 1/2-1/2"); + isDraw = 1; + strcpy(EndSymbol, "50"); + rate_change = 1; + whiteResult = RESULT_DRAW; + break; + case END_ADJOURN: + if (gl >= 0) { + sprintf(tmp, "Bughouse game aborted.} *"); + whiteResult = RESULT_ABORT; + } else { + sprintf(tmp, "Game adjourned by mutual agreement} *"); + game_save(g); + } + break; + case END_LOSTCONNECTION: + sprintf(tmp, "%s lost connection; game ", NameOfWinner); + if (CheckPFlag(gg->white, PFLAG_REG) + && CheckPFlag(gg->black, PFLAG_REG) + && gl < 0) { + sprintf(tmp, "adjourned} *"); + game_save(g); + } else + sprintf(tmp, "aborted} *"); + whiteResult = RESULT_ABORT; + break; + case END_ABORT: + sprintf(tmp, "Game aborted by mutual agreement} *"); + whiteResult = RESULT_ABORT; + break; + case END_COURTESY: + sprintf(tmp, "Game courtesyaborted by %s} *", NameOfWinner); + whiteResult = RESULT_ABORT; + break; + case END_COURTESYADJOURN: + if (gl >= 0) { + sprintf(tmp, "Bughouse game courtesyaborted by %s.} *", NameOfWinner); + whiteResult = RESULT_ABORT; + } else { + sprintf(tmp, "Game courtesyadjourned by %s} *", NameOfWinner); + game_save(g); + } + break; + case END_NOMATERIAL: + /* Draw by insufficient material (e.g., lone K vs. lone K) */ + sprintf(tmp, "Neither player has mating material} 1/2-1/2"); + isDraw = 1; + strcpy(EndSymbol, "NM "); + rate_change = 1; + whiteResult = RESULT_DRAW; + break; + case END_FLAGNOMATERIAL: + sprintf(tmp, "%s ran out of time and %s has no material to mate} 1/2-1/2", + NameOfLoser, NameOfWinner); + isDraw = 1; + strcpy(EndSymbol, "TM "); + rate_change = 1; + whiteResult = RESULT_DRAW; + break; + case END_ADJWIN: + sprintf(tmp, "%s wins by adjudication} %s", NameOfWinner, winSymbol); + strcpy(EndSymbol, "Adj"); + rate_change = 1; + break; + case END_ADJDRAW: + sprintf(tmp, "Game drawn by adjudication} 1/2-1/2"); + isDraw = 1; + strcpy(EndSymbol, "Adj"); + rate_change = 1; + whiteResult = RESULT_DRAW; + break; + case END_ADJABORT: + sprintf(tmp, "Game aborted by adjudication} *"); + whiteResult = RESULT_ABORT; + break; + default: + sprintf(tmp, "Hmm, the game ended and I don't know why} *"); + break; + } + strcat(outstr, tmp); + + if (CheckPFlag(gg->white, PFLAG_TOURNEY) && + CheckPFlag(gg->black, PFLAG_TOURNEY)) { + /* mamer wants more info */ + sprintf(tmp," [%d %d %d %d %d]", + gg->wInitTime/(60*10), gg->wIncrement/10, gg->rated, gg->private, (int)gg->type); + strcat(outstr, tmp); + } + + strcat(outstr, "\n"); + + if (gg->rated && rate_change && gg->type != TYPE_BUGHOUSE) + /* Adjust ratings; bughouse gets done later. */ + rating_update(g, -1); + + if (beingplayed) { + int printed = 0; + int avail_printed = 0; + + pprintf_noformat(gg->white, outstr); + pprintf_noformat(gg->black, outstr); + Bell (gg->white); + Bell (gg->black); + + gg->link = -1; /*IanO: avoids recursion */ + if (gl >= 0 && game_globals.garray[gl].link >= 0) { + pprintf_noformat(game_globals.garray[gl].white, outstr); + pprintf_noformat(game_globals.garray[gl].black, outstr); + if (CheckPFlag(game_globals.garray[gl].white, PFLAG_OPEN)) { + getavailmess (game_globals.garray[gl].white, avail_bugwhite); + print_avail = 1; + } + if (CheckPFlag(game_globals.garray[gl].black, PFLAG_OPEN)) { + getavailmess (game_globals.garray[gl].black, avail_bugblack); + print_avail = 1; + } + if ((gg->rated) && (rate_change)) { + /* Adjust ratings */ + rating_update(g, gl); + } + game_ended(gl, CToggle(winner), why); + } + + if ((player_num_active_boards(gg->white) <= 1) /* not a simul or */ + && CheckPFlag(gg->white, PFLAG_OPEN)) { /* simul is over? */ + getavailmess (gg->white,avail_white); + print_avail = 1; + } else { /* Part of an ongoing simul! Let's shrink the array. */ + + } + + if (CheckPFlag(gg->black, PFLAG_OPEN)) { + getavailmess (gg->black,avail_black); + print_avail = 1; + } + + for (p = 0; p < player_globals.p_num; p++) { + struct player *pp = &player_globals.parray[p]; + if ((p == gg->white) || (p == gg->black)) + continue; + if (pp->status != PLAYER_PROMPT) + continue; + + if (CheckPFlag(p, PFLAG_GIN) || player_is_observe(p, g)) { + pprintf_noformat(p, outstr); + printed = 1; + } + + if (CheckPFlag(p, PFLAG_AVAIL) && (CheckPFlag(p, PFLAG_OPEN)) && (pp->game < 0) && (print_avail)) { + if (((player_globals.parray[gg->white].b_stats.rating <= pp->availmax) && (player_globals.parray[gg->white].b_stats.rating >= pp->availmin)) || (!pp->availmax)) { + pprintf (p,"\n%s",avail_white); + avail_printed = 1; + } + if (((player_globals.parray[gg->black].b_stats.rating <= pp->availmax) && (player_globals.parray[gg->black].b_stats.rating >= pp->availmin)) || (!pp->availmax)) { + pprintf (p,"\n%s",avail_black); + avail_printed = 1; + } + if (gl != -1) /* bughouse ? */ { + if (((player_globals.parray[game_globals.garray[gl].white].b_stats.rating <= pp->availmax) && (player_globals.parray[game_globals.garray[gl].white].b_stats.rating >= pp->availmin)) || (!pp->availmax)) { + pprintf (p,"\n%s",avail_bugwhite); + avail_printed = 1; + } + if (((player_globals.parray[game_globals.garray[gl].black].b_stats.rating <= pp->availmax) && (player_globals.parray[game_globals.garray[gl].black].b_stats.rating >= pp->availmin)) || (!pp->availmax)) { + pprintf (p,"\n%s",avail_bugblack); + avail_printed = 1; + } + } + if (avail_printed) { + avail_printed = 0; + printed = 1; + pprintf (p,"\n"); + } + } + + if (printed) { + send_prompt(p); + printed = 0; + } + } + + if (!(gg->rated && rate_change)) { + pprintf(gg->white, "No ratings adjustment done.\n"); + pprintf(gg->black, "No ratings adjustment done.\n"); + } + } + + if (rate_change && gl < 0) + game_write_complete(g, isDraw, EndSymbol); + /* Mail off the moves */ + if (CheckPFlag(gg->white, PFLAG_AUTOMAIL)) { + pcommand(gg->white, "mailmoves"); + } + if (CheckPFlag(gg->black, PFLAG_AUTOMAIL)) { + pcommand(gg->black, "mailmoves"); + } + if (!((player_globals.parray[gg->white].simul_info != NULL) && + (player_globals.parray[gg->white].simul_info->numBoards))) { + player_globals.parray[gg->white].num_white++; + PFlagOFF(gg->white, PFLAG_LASTBLACK); + player_globals.parray[gg->black].num_black++; + PFlagON(gg->black, PFLAG_LASTBLACK); + } + player_globals.parray[gg->white].last_opponent = + strdup(gg->black_name); + player_globals.parray[gg->black].last_opponent = + strdup(gg->white_name); + if (beingplayed) { + player_globals.parray[gg->white].game = -1; + player_globals.parray[gg->black].game = -1; + player_globals.parray[gg->white].opponent = -1; + player_globals.parray[gg->black].opponent = -1; + if (gg->white != command_globals.commanding_player) + send_prompt(gg->white); + if (gg->black != command_globals.commanding_player) + send_prompt(gg->black); + if ((player_globals.parray[gg->white].simul_info != NULL) && + (player_globals.parray[gg->white].simul_info->numBoards)) + player_simul_over(gg->white, g, whiteResult); + } + game_finish(g); +} + +static int was_promoted(struct game *g, int f, int r) +{ +#define BUGHOUSE_PAWN_REVERT 1 +#ifdef BUGHOUSE_PAWN_REVERT + int i; + + for (i = g->numHalfMoves-2; i > 0; i -= 2) { + if (g->moveList[i].toFile == f && g->moveList[i].toRank == r) { + if (g->moveList[i].piecePromotionTo) + return 1; + if (g->moveList[i].fromFile == ALG_DROP) + return 0; + f = g->moveList[i].fromFile; + r = g->moveList[i].fromRank; + } + } +#endif + return 0; +} + +int pIsPlaying (int p) +{ + struct player *pp = &player_globals.parray[p]; + int g = pp->game; + int p1 = pp->opponent; + + if (g < 0 || game_globals.garray[g].status != GAME_ACTIVE) { + pprintf (p, "You are not playing a game.\n"); + return 0; + } + + if (game_globals.garray[g].white != p && game_globals.garray[g].black != p) { + /* oh oh; big bad game bug. */ + d_printf("BUG: Player %s playing game %d according to player_globals.parray," + "\n but not according to game_globals.garray.\n", pp->name, g+1); + pprintf (p, "Disconnecting you from game number %d.\n", g+1); + pp->game = -1; + if (p1 >= 0 && player_globals.parray[p1].game == g + && game_globals.garray[g].white != p1 && game_globals.garray[g].black != p1) { + pprintf (p1, "Disconnecting you from game number %d.\n", g+1); + player_globals.parray[p1].game = -1; + } + return 0; + } + return 1; +} + +/* add clock increments */ +static void game_add_increment(struct player *pp, struct game *gg) +{ + /* no update on first move */ + if (gg->game_state.moveNum == 1) return; + + if (net_globals.con[pp->socket]->timeseal) { /* does he use timeseal? */ + if (pp->side == WHITE) { + gg->wRealTime += gg->wIncrement * 100; + gg->wTime = gg->wRealTime / 100; /* remember to conv to + tenth secs */ + } else if (pp->side == BLACK) { + gg->bRealTime += gg->bIncrement * 100; /* conv to ms */ + gg->bTime = gg->bRealTime / 100; /* remember to conv to + tenth secs */ + } + } else { + if (gg->game_state.onMove == BLACK) { + gg->bTime += gg->bIncrement; + } + if (gg->game_state.onMove == WHITE) { + gg->wTime += gg->wIncrement; + } + } +} + +/* updates clocks for a game with timeseal */ +void timeseal_update_clocks(struct player *pp, struct game *gg) +{ + /* no update on first move */ + if (gg->game_state.moveNum == 1) return; + + if (pp->side == WHITE) { + gg->wLastRealTime = gg->wRealTime; + gg->wTimeWhenMoved = net_globals.con[pp->socket]->time; + if (((gg->wTimeWhenMoved - gg->wTimeWhenReceivedMove) < 0) || + (gg->wTimeWhenReceivedMove == 0)) { + /* might seem weird - but could be caused by a person moving BEFORE + he receives the board pos (this is possible due to lag) but it's + safe to say he moved in 0 secs :-) */ + gg->wTimeWhenReceivedMove = gg->wTimeWhenMoved; + } else { + gg->wRealTime -= gg->wTimeWhenMoved - gg->wTimeWhenReceivedMove; + } + } else if (pp->side == BLACK) { + gg->bLastRealTime = gg->bRealTime; + gg->bTimeWhenMoved = net_globals.con[pp->socket]->time; + if (((gg->bTimeWhenMoved - gg->bTimeWhenReceivedMove) < 0) || + (gg->bTimeWhenReceivedMove == 0)) { + /* might seem weird - but could be caused by a person moving BEFORE + he receives the board pos (this is possible due to lag) but it's + safe to say he moved in 0 secs :-) */ + gg->bTimeWhenReceivedMove = gg->bTimeWhenMoved; + } else { + gg->bRealTime -= gg->bTimeWhenMoved - gg->bTimeWhenReceivedMove; + } + } +} + + +void process_move(int p, char *command) +{ + struct player *pp = &player_globals.parray[p]; + struct game *gg; + int g, result, len, i; + struct move_t move; + unsigned now = 0; + + if (pp->game < 0) { + pprintf(p, "You are not playing or examining a game.\n"); + return; + } + decline_withdraw_offers(p, -1, -PEND_SIMUL,DO_DECLINE); + + g = pp->game; + gg = &game_globals.garray[g]; + + if (gg->status == GAME_SETUP) { + if (!attempt_drop(p,g,command)) { + pprintf(p, "You are still setting up the position.\n"); + pprintf(p, "Type: 'setup done' when you are finished editing.\n"); + } else + send_board_to(g, p); + return; + } + + if (gg->status != GAME_EXAMINE) { + if (!pIsPlaying(p)) return; + + if (pp->side != gg->game_state.onMove) { + pprintf(p, "It is not your move.\n"); + return; + } + if (gg->clockStopped) { + pprintf(p, "Game clock is paused, use \"unpause\" to resume.\n"); + return; + } + } + if ((len = strlen(command)) > 1) { + if (command[len - 2] == '=') { + switch (tolower(command[strlen(command) - 1])) { + case 'n': + pp->promote = KNIGHT; + break; + case 'b': + pp->promote = BISHOP; + break; + case 'r': + pp->promote = ROOK; + break; + case 'q': + pp->promote = QUEEN; + break; + default: + pprintf(p, "Don't understand that move.\n"); + return; + break; + } + } + } + switch (parse_move(command, &gg->game_state, &move, pp->promote)) { + case MOVE_ILLEGAL: + pprintf(p, "Illegal move.\n"); + return; + break; + case MOVE_AMBIGUOUS: + pprintf(p, "Ambiguous move.\n"); + return; + break; + default: + break; + } + + if (gg->status == GAME_EXAMINE) { + gg->numHalfMoves++; + if (gg->numHalfMoves > gg->examMoveListSize) { + gg->examMoveListSize += 20; /* Allocate 20 moves at a time */ + gg->examMoveList = (struct move_t *) realloc(gg->examMoveList, sizeof(struct move_t) * gg->examMoveListSize); + } + result = execute_move(&gg->game_state, &move, 1); + move.atTime = now; + move.tookTime = 0; + MakeFENpos(g, move.FENpos); + gg->examMoveList[gg->numHalfMoves - 1] = move; + /* roll back time */ + if (gg->game_state.onMove == WHITE) { + gg->wTime += (gg->lastDecTime - gg->lastMoveTime); + } else { + gg->bTime += (gg->lastDecTime - gg->lastMoveTime); + } + now = tenth_secs(); + if (gg->numHalfMoves == 0) + gg->timeOfStart = now; + gg->lastMoveTime = now; + gg->lastDecTime = now; + + } else { /* real game */ + i = pp->opponent; + if ((player_globals.parray[i].simul_info != NULL) && (player_globals.parray[i].simul_info->numBoards && + (player_globals.parray[i].simul_info->boards[player_globals.parray[i].simul_info->onBoard] != g))) { + pprintf(p, "It isn't your turn: wait until the simul giver is at your board.\n"); + return; + } + if (net_globals.con[pp->socket]->timeseal) { /* does he use timeseal? */ + timeseal_update_clocks(pp, &game_globals.garray[g]); + } + /* we need to reset the opp's time for receiving the board since the + timeseal decoder only alters the time if it's 0 Otherwise the time + would be changed if the player did a refresh which would screw up + the timings */ + if (pp->side == WHITE) { + gg->bTimeWhenReceivedMove = 0; + } else { + gg->wTimeWhenReceivedMove = 0; + } + + game_update_time(g); + game_add_increment(pp, gg); + + /* Do the move */ + gg->numHalfMoves++; + if (gg->numHalfMoves > gg->moveListSize) { + gg->moveListSize += 20; /* Allocate 20 moves at a time */ + gg->moveList = (struct move_t *) realloc(gg->moveList, sizeof(struct move_t) * gg->moveListSize); + } + result = execute_move(&gg->game_state, &move, 1); + if (result == MOVE_OK && gg->link >= 0 && move.pieceCaptured != NOPIECE) { + /* transfer captured piece to partner */ + /* check if piece reverts to a pawn */ + if (was_promoted(&game_globals.garray[g], move.toFile, move.toRank)) + update_holding(gg->link, colorval(move.pieceCaptured) | PAWN); + else + update_holding(gg->link, move.pieceCaptured); + } + now = tenth_secs(); + move.atTime = now; + if (gg->numHalfMoves > 1) { + move.tookTime = move.atTime - gg->lastMoveTime; + } else { + move.tookTime = move.atTime - gg->startTime; + } + gg->lastMoveTime = now; + gg->lastDecTime = now; + move.wTime = gg->wTime; + move.bTime = gg->bTime; + + if (net_globals.con[pp->socket]->timeseal) { /* does he use timeseal? */ + if (pp->side == WHITE) { + move.tookTime = (game_globals.garray[pp->game].wTimeWhenMoved - + game_globals.garray[pp->game].wTimeWhenReceivedMove) / 100; + } else { + move.tookTime = (game_globals.garray[pp->game].bTimeWhenMoved - + game_globals.garray[pp->game].bTimeWhenReceivedMove) / 100; + } + } + + if (gg->numHalfMoves <= 2) { + move.tookTime = 0; + } + + MakeFENpos(g, move.FENpos); + gg->moveList[gg->numHalfMoves - 1] = move; + } + + send_boards(g); + + if (result == MOVE_ILLEGAL) { + pprintf(p, "Internal error, illegal move accepted!\n"); + } + if ((result == MOVE_OK) && (gg->status == GAME_EXAMINE)) { + int p1; + + for (p1 = 0; p1 < player_globals.p_num; p1++) { + if (player_globals.parray[p1].status != PLAYER_PROMPT) + continue; + if (player_is_observe(p1, g) || player_globals.parray[p1].game == g) { + pprintf(p1, "%s moves: %s\n", pp->name, move.algString); + } + } + } + if (result == MOVE_CHECKMATE) { + if (gg->status == GAME_EXAMINE) { + int p1; + + for (p1 = 0; p1 < player_globals.p_num; p1++) { + if (player_globals.parray[p1].status != PLAYER_PROMPT) + continue; + if (player_is_observe(p1, g) || player_globals.parray[p1].game == g) { + pprintf(p1, "%s has been checkmated.\n", + (CToggle(gg->game_state.onMove) == BLACK) ? "White" : "Black"); + } + } + } else { + game_ended(g, CToggle(gg->game_state.onMove), END_CHECKMATE); + } + } + if (result == MOVE_STALEMATE) { + if (gg->status == GAME_EXAMINE) { + int p1; + + for (p1 = 0; p1 < player_globals.p_num; p1++) { + if (player_globals.parray[p1].status != PLAYER_PROMPT) + continue; + if (player_is_observe(p1, g) || player_globals.parray[p1].game == g) { + pprintf(p1, "Stalemate.\n"); + } + } + } else { + game_ended(g, CToggle(gg->game_state.onMove), END_STALEMATE); + } + } + if (result == MOVE_NOMATERIAL) { + if (gg->status == GAME_EXAMINE) { + int p1; + + for (p1 = 0; p1 < player_globals.p_num; p1++) { + if (player_globals.parray[p1].status != PLAYER_PROMPT) + continue; + if (player_is_observe(p1, g) || player_globals.parray[p1].game == g) { + pprintf(p1, "No mating material.\n"); + } + } + } else { + game_ended(g, CToggle(gg->game_state.onMove), END_NOMATERIAL); + } + } +} + +int com_resign(int p, param_list param) +{ + struct player *pp = &player_globals.parray[p]; + int g, o, oconnected; + + if (param[0].type == TYPE_NULL) { + g = pp->game; + if (!pIsPlaying(p)) + return COM_OK; + else { + decline_withdraw_offers(p, -1, -1, DO_DECLINE); + game_ended(g, (game_globals.garray[g].white == p) ? BLACK : WHITE, END_RESIGN); + } + } else if (FindPlayer(p, param[0].val.word, &o, &oconnected)) { + g = game_new(); + if (game_read(g, p, o) < 0) { + if (game_read(g, o, p) < 0) { + pprintf(p, "You have no stored game with %s\n", player_globals.parray[o].name); + if (!oconnected) + player_remove(o); + return COM_OK; + } else { + game_globals.garray[g].white = o; + game_globals.garray[g].black = p; + } + } else { + game_globals.garray[g].white = p; + game_globals.garray[g].black = o; + } + pprintf(p, "You resign your stored game with %s\n", player_globals.parray[o].name); + pcommand(p, "message %s I have resigned our stored game \"%s vs. %s.\"", + player_globals.parray[o].name, + player_globals.parray[game_globals.garray[g].white].name, + player_globals.parray[game_globals.garray[g].black].name); + game_delete(game_globals.garray[g].white, game_globals.garray[g].black); + game_ended(g, (game_globals.garray[g].white == p) ? BLACK : WHITE, END_RESIGN); + if (!oconnected) + player_remove(o); + } + return COM_OK; +} + +static int Check50MoveRule (int p, int g) +{ + int num_reversible = game_globals.garray[g].numHalfMoves; + + if (game_globals.garray[g].game_state.lastIrreversable >= 0) { + num_reversible -= game_globals.garray[g].game_state.lastIrreversable; + } + if (num_reversible > 99) { + game_ended(g, (game_globals.garray[g].white == p) ? BLACK : WHITE, END_50MOVERULE); + return 1; + } + return 0; +} + +static char *GetFENpos (int g, int half_move) +{ + if (half_move < 0) + return game_globals.garray[g].FENstartPos; + else return game_globals.garray[g].moveList[half_move].FENpos; +} + +static int CheckRepetition (int p, int g) +{ + struct player *pp = &player_globals.parray[p]; + struct pending* pend; + int move_num; + int flag1 = 1, flag2 = 1; + char *pos1 = GetFENpos (g, game_globals.garray[g].numHalfMoves - 1); + char *pos2 = GetFENpos (g, game_globals.garray[g].numHalfMoves); + char *pos; + + if (game_globals.garray[g].numHalfMoves < 8) /* can't have three repeats any quicker. */ + return 0; + + for (move_num = game_globals.garray[g].game_state.lastIrreversable; + move_num < game_globals.garray[g].numHalfMoves - 1; move_num++) { + pos = GetFENpos (g, move_num); + if (strlen(pos1) == strlen(pos) && !strcmp(pos1, pos)) + flag1++; + if (strlen(pos2) == strlen(pos) && !strcmp(pos2, pos)) + flag2++; + } + if (flag1 >= 3 || flag2 >= 3) { + if ((pend = find_pend(pp->opponent, p, PEND_DRAW)) != NULL) { + delete_pending(pend); + decline_withdraw_offers(p, -1, -1,DO_DECLINE); + } + game_ended(g, (game_globals.garray[g].white == p) ? BLACK : WHITE, END_REPETITION); + return 1; + } + else return 0; +} + +int com_draw(int p, param_list param) +{ + struct player *pp = &player_globals.parray[p]; + struct pending* pend; + int p1, g = pp->game; + + if (!pIsPlaying(p)) { + return COM_OK; + } + if (Check50MoveRule (p, g) || CheckRepetition(p, g)) { + return COM_OK; + } + p1 = pp->opponent; + + if ((player_globals.parray[p1].simul_info != NULL) && (player_globals.parray[p1].simul_info->numBoards && + player_globals.parray[p1].simul_info->boards[player_globals.parray[p1].simul_info->onBoard] != g)) { + pprintf(p, "You can only make requests when the simul player is at your board.\n"); + return COM_OK; + } + + if ((pend = (find_pend(pp->opponent, p, PEND_DRAW))) != NULL) { + delete_pending(pend); + decline_withdraw_offers(p, -1, -1,DO_DECLINE); + game_ended(g, (game_globals.garray[g].white == p) ? BLACK : WHITE, END_AGREEDDRAW); + } else { + pprintf(pp->opponent, "\n"); + pprintf_highlight(pp->opponent, "%s", pp->name); + pprintf_prompt(pp->opponent, " offers you a draw.\n"); + pprintf(p, "Draw request sent.\n"); + add_request(p, pp->opponent, PEND_DRAW); + } + return COM_OK; +} + +int com_pause(int p, param_list param) +{ + struct player *pp = &player_globals.parray[p]; + int g, now; + struct pending* pend; + + if (!pIsPlaying(p)) { + return COM_OK; + } + g = pp->game; + if (game_globals.garray[g].wTime == 0) { + pprintf(p, "You can't pause untimed games.\n"); + return COM_OK; + } + if (game_globals.garray[g].clockStopped) { + pprintf(p, "Game is already paused, use \"unpause\" to resume.\n"); + return COM_OK; + } + if ((pend = find_pend(pp->opponent, p, PEND_PAUSE)) != NULL) { + delete_pending(pend); + game_globals.garray[g].clockStopped = 1; + /* Roll back the time */ + if (game_globals.garray[g].game_state.onMove == WHITE) { + game_globals.garray[g].wTime += (game_globals.garray[g].lastDecTime - game_globals.garray[g].lastMoveTime); + } else { + game_globals.garray[g].bTime += (game_globals.garray[g].lastDecTime - game_globals.garray[g].lastMoveTime); + } + now = tenth_secs(); + if (game_globals.garray[g].numHalfMoves == 0) + game_globals.garray[g].timeOfStart = now; + game_globals.garray[g].lastMoveTime = now; + game_globals.garray[g].lastDecTime = now; + send_boards(g); + pprintf_prompt(pp->opponent, "\n%s accepted pause. Game clock paused.\n", + pp->name); + pprintf(p, "Game clock paused.\n"); + } else { + pprintf(pp->opponent, "\n"); + pprintf_highlight(pp->opponent, "%s", pp->name); + pprintf_prompt(pp->opponent, " requests to pause the game.\n"); + pprintf(p, "Pause request sent.\n"); + add_request(p, pp->opponent, PEND_PAUSE); + } + return COM_OK; +} + +int com_unpause(int p, param_list param) +{ + struct player *pp = &player_globals.parray[p]; + int g; + int now; + struct pending* pend; + + if (!pIsPlaying(p)) { + return COM_OK; + } + + g = pp->game; + + if (!game_globals.garray[g].clockStopped) { + pprintf(p, "Game is not paused.\n"); + return COM_OK; + } + if ((pend = find_pend(pp->opponent, p, PEND_UNPAUSE)) != NULL) { + delete_pending(pend); + game_globals.garray[g].clockStopped = 0; + now = tenth_secs(); + if (game_globals.garray[g].numHalfMoves == 0) + game_globals.garray[g].timeOfStart = now; + game_globals.garray[g].lastMoveTime = now; + game_globals.garray[g].lastDecTime = now; + send_boards(g); + pprintf(p, "Game clock resumed.\n"); + pprintf_prompt(pp->opponent, "\nGame clock resumed.\n"); + } else { + pprintf(pp->opponent, "\n"); + pprintf_highlight(pp->opponent, "%s", pp->name); + pprintf_prompt(pp->opponent, " requests to unpause the game.\n"); + pprintf(p, "Unpause request sent.\n"); + add_request(p, pp->opponent, PEND_UNPAUSE); + } + return COM_OK; +} + +int com_abort(int p, param_list param) +{ + struct player *pp = &player_globals.parray[p]; + struct pending* pend; + int p1, g, myColor, yourColor, myGTime, yourGTime; + int courtesyOK = 1; + + g = pp->game; + if (!pIsPlaying(p)) + return COM_OK; + + p1 = pp->opponent; + if (p == game_globals.garray[g].white) { + myColor = WHITE; + yourColor = BLACK; + myGTime = game_globals.garray[g].wTime; + yourGTime = game_globals.garray[g].bTime; + } else { + myColor = BLACK; + yourColor = WHITE; + myGTime = game_globals.garray[g].bTime; + yourGTime = game_globals.garray[g].wTime; + } + if ((player_globals.parray[p1].simul_info != NULL) && + (player_globals.parray[p1].simul_info->numBoards && + player_globals.parray[p1].simul_info->boards[player_globals.parray[p1].simul_info->onBoard] != g)) { + pprintf(p, "You can only make requests when the simul player is at your board.\n"); + return COM_OK; + } + if ((pend = find_pend(p1, p, PEND_ABORT)) != NULL) { + delete_pending(pend); + decline_withdraw_offers(p, -1, -1,DO_DECLINE); + game_ended(g, yourColor, END_ABORT); + } else { + game_update_time(g); + + if (net_globals.con[pp->socket]->timeseal + && game_globals.garray[g].game_state.onMove == myColor + && game_globals.garray[g].flag_pending == FLAG_ABORT) { + /* It's my move, opponent has asked for abort; I lagged out, + my timeseal prevented courtesyabort, and I am sending an abort + request before acknowledging (and processing) my opponent's + courtesyabort. OK, let's abort already :-). */ + decline_withdraw_offers(p, -1, -1,DO_DECLINE); + game_ended(g, yourColor, END_ABORT); + } + + if (net_globals.con[player_globals.parray[p1].socket]->timeseal) { /* opp uses timeseal? */ + + int yourRealTime = (myColor == WHITE ? game_globals.garray[g].bRealTime + : game_globals.garray[g].wRealTime); + if (myGTime > 0 && yourGTime <= 0 && yourRealTime > 0) { + /* Override courtesyabort; opponent still has time. Check for lag. */ + courtesyOK = 0; + + if (game_globals.garray[g].game_state.onMove != myColor + && game_globals.garray[g].flag_pending != FLAG_CHECKING) { + /* Opponent may be lagging; let's ask. */ + game_globals.garray[g].flag_pending = FLAG_ABORT; + game_globals.garray[g].flag_check_time = time(0); + pprintf(p, "Opponent has timeseal; trying to courtesyabort.\n"); + pprintf(p1, "\n[G]\n"); + return COM_OK; + } + } + } + + if (myGTime > 0 && yourGTime <= 0 && courtesyOK) { + /* player wants to abort + opponent is out of time = courtesyabort */ + pprintf(p, "Since you have time, and your opponent has none, the game has been aborted."); + pprintf(p1, "Your opponent has aborted the game rather than calling your flag."); + decline_withdraw_offers(p, -1, -1, DO_DECLINE); + game_ended(g, myColor, END_COURTESY); + } else { + pprintf(p1, "\n"); + pprintf_highlight(p1, "%s", pp->name); + pprintf(p1, " would like to abort the game; "); + pprintf_prompt(p1, "type \"abort\" to accept.\n"); + pprintf(p, "Abort request sent.\n"); + add_request(p, p1, PEND_ABORT); + } + } + return COM_OK; +} + +static int player_has_mating_material(struct game_state_t *gs, int color) +{ + int i, j; + int piece; + int minor_pieces = 0; + + for (i = 0; i < 8; i++) + for (j = 0; j < 8; j++) { + piece = gs->board[i][j]; + switch (piecetype(piece)) { + case BISHOP: + case KNIGHT: + if (iscolor(piece, color)) + minor_pieces++; + break; + case KING: + case NOPIECE: + break; + default: + if (iscolor(piece, color)) + return 1; + } + } + return ((minor_pieces > 1) ? 1 : 0); +} + +int com_flag(int p, param_list param) +{ + struct player *pp = &player_globals.parray[p]; + struct game *gg; + int g; + int myColor; + + if (!pIsPlaying(p)) { + return COM_OK; + } + g = pp->game; + + gg = &game_globals.garray[g]; + + myColor = (p == gg->white ? WHITE : BLACK); + if (gg->type == TYPE_UNTIMED) { + pprintf(p, "You can't flag an untimed game.\n"); + return COM_OK; + } + if (gg->numHalfMoves < 2) { + pprintf(p, "You cannot flag before both players have moved.\nUse abort instead.\n"); + return COM_OK; + } + game_update_time(g); + + { + int myTime, yourTime, opp = pp->opponent, serverTime; + + if (net_globals.con[pp->socket]->timeseal) { /* does caller use timeseal? */ + myTime = (myColor==WHITE?gg->wRealTime:gg->bRealTime); + } else { + myTime = (myColor == WHITE?gg->wTime:gg->bTime); + } + serverTime = (myColor == WHITE?gg->bTime:gg->wTime); + + if (net_globals.con[player_globals.parray[opp].socket]->timeseal) { /* opp uses timeseal? */ + yourTime = (myColor == WHITE?gg->bRealTime:gg->wRealTime); + } else { + yourTime = serverTime; + } + + /* the clocks to compare are now in myTime and yourTime */ + if ((myTime <= 0) && (yourTime <= 0)) { + decline_withdraw_offers(p, -1, -1,DO_DECLINE); + game_ended(g, myColor, END_BOTHFLAG); + return COM_OK; + } + + if (yourTime > 0) { + /* Opponent still has time, but if that's only because s/he + * may be lagging, we should ask for an acknowledgement and then + * try to call the flag. */ + + if (serverTime <= 0 && gg->game_state.onMove != myColor + && gg->flag_pending != FLAG_CHECKING) { + /* server time thinks opponent is down, but RealTIme disagrees. + * ask client to acknowledge it's alive. */ + gg->flag_pending = FLAG_CALLED; + gg->flag_check_time = time(0); + pprintf(p, "Opponent has timeseal; checking if (s)he's lagging.\n"); + pprintf (opp, "\n[G]\n"); + return COM_OK; + } + + /* if we're here, it means one of: + * 1. the server agrees opponent has time, whether lagging or not. + * 2. opp. has timeseal (if yourTime != serverTime), had time left + * after the last move (yourTime > 0), and it's still your move. + * 3. we're currently checking a flag call after having receiving + * acknowledgement from the other timeseal (and would have reset + * yourTime if the flag were down). */ + + pprintf(p, "Your opponent is not out of time!\n"); + return COM_OK; + } + } + + decline_withdraw_offers(p, -1, -1,DO_DECLINE); + if (player_has_mating_material(&gg->game_state, myColor)) + game_ended(g, myColor, END_FLAG); + else + game_ended(g, myColor, END_FLAGNOMATERIAL); + return COM_OK; +} + +int com_adjourn(int p, param_list param) +{ + struct player *pp = &player_globals.parray[p]; + struct pending* pend; + int p1, g, myColor, yourColor; + + if (!pIsPlaying(p)) + return COM_OK; + + p1 = pp->opponent; + g = pp->game; + if (!CheckPFlag(p, PFLAG_REG) || !CheckPFlag(p, PFLAG_REG)) { + pprintf(p, "Both players must be registered to adjourn a game. Use \"abort\".\n"); + return COM_OK; + } + if (game_globals.garray[g].link >= 0) { + pprintf(p, "Bughouse games cannot be adjourned.\n"); + return COM_OK; + } + myColor = (p == game_globals.garray[g].white ? WHITE : BLACK); + yourColor = (myColor == WHITE ? BLACK : WHITE); + + if ((pend = find_pend(p1, p, PEND_ADJOURN)) != NULL) { + delete_pending(pend); + decline_withdraw_offers(p, -1, -1,DO_DECLINE); + game_ended(pp->game, yourColor, END_ADJOURN); + } else { + game_update_time(g); + if (((myColor == WHITE) && (game_globals.garray[g].wTime > 0) && (game_globals.garray[g].bTime <= 0)) + || ((myColor == BLACK) && (game_globals.garray[g].bTime > 0) && (game_globals.garray[g].wTime <= 0))) { +/* player wants to adjourn + opponent is out of time = courtesyadjourn */ + pprintf(p, "Since you have time, and your opponent has none, the game has been adjourned."); + pprintf(p1, "Your opponent has adjourned the game rather than calling your flag."); + decline_withdraw_offers(p, -1, -1,DO_DECLINE); + game_ended(g, myColor, END_COURTESYADJOURN); + } else { + pprintf(p1, "\n"); + pprintf_highlight(p1, "%s", pp->name); + pprintf(p1, " would like to adjourn the game; "); + pprintf_prompt(p1, "type \"adjourn\" to accept.\n"); + pprintf(p, "Adjourn request sent.\n"); + add_request(p, p1, PEND_ADJOURN); + } + } + return COM_OK; +} + +int com_takeback(int p, param_list param) +{ + struct player *pp = &player_globals.parray[p]; + int nHalfMoves = 1, g, i, p1, pend_half_moves; + struct pending* from; + + if (!pIsPlaying(p)) + return COM_OK; + + p1 = pp->opponent; + if ((player_globals.parray[p1].simul_info != NULL) && + (player_globals.parray[p1].simul_info->numBoards && + player_globals.parray[p1].simul_info->boards[player_globals.parray[p1].simul_info->onBoard] != + pp->game)) { + pprintf(p, "You can only make requests when the simul player is at your board.\n"); + return COM_OK; + } + + g = pp->game; + if (game_globals.garray[g].link >= 0) { + pprintf(p, "Takeback not implemented for bughouse games yet.\n"); + return COM_OK; + } + if (param[0].type == TYPE_INT) { + nHalfMoves = param[0].val.integer; + if (nHalfMoves <= 0) { + pprintf (p,"You can't takeback less than 1 move.\n"); + return COM_OK; + } + } + if ((from = find_pend(pp->opponent, p, PEND_TAKEBACK)) != NULL) { + pend_half_moves = from->wtime; + delete_pending(from); + if (pend_half_moves == nHalfMoves) { + /* Doing the takeback */ + decline_withdraw_offers(p, -1, -PEND_SIMUL,DO_DECLINE); + for (i = 0; i < nHalfMoves; i++) { + if (backup_move(g, REL_GAME) != MOVE_OK) { + pprintf(game_globals.garray[g].white, "Can only backup %d moves\n", i); + pprintf(game_globals.garray[g].black, "Can only backup %d moves\n", i); + break; + } + } + + game_globals.garray[g].wTimeWhenReceivedMove = 0; + game_globals.garray[g].bTimeWhenReceivedMove = 0; + + send_boards(g); + } else { + + if (!game_globals.garray[g].numHalfMoves) { + pprintf(p, "There are no moves in your game.\n"); + pprintf_prompt(pp->opponent, "\n%s has declined the takeback request.\n", + pp->name); + return COM_OK; + } + + if (game_globals.garray[g].numHalfMoves < nHalfMoves) { + pprintf(p, "There are only %d half moves in your game.\n", game_globals.garray[g].numHalfMoves); + pprintf_prompt(pp->opponent, "\n%s has declined the takeback request.\n", + pp->name); + return COM_OK; + } + pprintf(p, "You disagree on the number of half-moves to takeback.\n"); + pprintf(p, "Alternate takeback request sent.\n"); + pprintf_prompt(pp->opponent, "\n%s proposes a different number (%d) of half-move(s).\n", pp->name, nHalfMoves); + from = add_request(p, pp->opponent, PEND_TAKEBACK); + from->wtime = nHalfMoves; + } + } else { + + if (!game_globals.garray[g].numHalfMoves) { + pprintf(p, "There are no moves in your game.\n"); + return COM_OK; + } + if (game_globals.garray[g].numHalfMoves < nHalfMoves) { + pprintf(p, "There are only %d half moves in your game.\n", game_globals.garray[g].numHalfMoves); + return COM_OK; + } + pprintf(pp->opponent, "\n"); + pprintf_highlight(pp->opponent, "%s", pp->name); + pprintf_prompt(pp->opponent, " would like to take back %d half move(s).\n", + nHalfMoves); + pprintf(p, "Takeback request sent.\n"); + from = add_request(p, pp->opponent, PEND_TAKEBACK); + from->wtime = nHalfMoves; + } + return COM_OK; +} + + +int com_switch(int p, param_list param) +{ + struct player *pp = &player_globals.parray[p]; + int g = pp->game, tmp, now, p1; + char *strTmp; + struct pending* pend; + + if (!pIsPlaying(p)) + return COM_OK; + + p1 = pp->opponent; + if ((player_globals.parray[p1].simul_info != NULL) && (player_globals.parray[p1].simul_info->numBoards && + player_globals.parray[p1].simul_info->boards[player_globals.parray[p1].simul_info->onBoard] != g)) { + pprintf(p, "You can only make requests when the simul player is at your board.\n"); + return COM_OK; + } + + if (game_globals.garray[g].link >= 0) { + pprintf(p, "Switch not implemented for bughouse games.\n"); + return COM_OK; + } + if ((pend = find_pend(pp->opponent, p, PEND_SWITCH)) != NULL) { + delete_pending(pend); + /* Doing the switch */ + decline_withdraw_offers(p, -1, -PEND_SIMUL,DO_DECLINE); + + tmp = game_globals.garray[g].white; + game_globals.garray[g].white = game_globals.garray[g].black; + game_globals.garray[g].black = tmp; + pp->side = (pp->side == WHITE) ? BLACK : WHITE; + strTmp = strdup(game_globals.garray[g].white_name); + strcpy(game_globals.garray[g].white_name, game_globals.garray[g].black_name); + strcpy(game_globals.garray[g].black_name, strTmp); + free(strTmp); + + player_globals.parray[pp->opponent].side = + (player_globals.parray[pp->opponent].side == WHITE) ? BLACK : WHITE; + /* Roll back the time */ + if (game_globals.garray[g].game_state.onMove == WHITE) { + game_globals.garray[g].wTime += (game_globals.garray[g].lastDecTime - game_globals.garray[g].lastMoveTime); + } else { + game_globals.garray[g].bTime += (game_globals.garray[g].lastDecTime - game_globals.garray[g].lastMoveTime); + } + now = tenth_secs(); + if (game_globals.garray[g].numHalfMoves == 0) + game_globals.garray[g].timeOfStart = now; + game_globals.garray[g].lastMoveTime = now; + game_globals.garray[g].lastDecTime = now; + send_boards(g); + return COM_OK; + } + if (game_globals.garray[g].rated && game_globals.garray[g].numHalfMoves > 0) { + pprintf(p, "You cannot switch sides once a rated game is underway.\n"); + return COM_OK; + } + pprintf(pp->opponent, "\n"); + pprintf_highlight(pp->opponent, "%s", pp->name); + pprintf_prompt(pp->opponent, " would like to switch sides.\nType \"accept\" to switch sides, or \"decline\" to refuse.\n"); + pprintf(p, "Switch request sent.\n"); + add_request(p, pp->opponent, PEND_SWITCH); + return COM_OK; +} + +int com_time(int p, param_list param) +{ + struct player *pp = &player_globals.parray[p]; + int p1, g; + + if (param[0].type == TYPE_NULL) { + g = pp->game; + if (!pIsPlaying(p)) + return COM_OK; + } else { + g = GameNumFromParam(p, &p1, ¶m[0]); + if (g < 0) + return COM_OK; + } + if ((g < 0) || (g >= game_globals.g_num) || (game_globals.garray[g].status != GAME_ACTIVE)) { + pprintf(p, "There is no such game.\n"); + return COM_OK; + } + game_update_time(g); + pprintf(p, "White (%s) : %d mins, %d secs\n", + player_globals.parray[game_globals.garray[g].white].name, + game_globals.garray[g].wTime / 600, + (game_globals.garray[g].wTime - ((game_globals.garray[g].wTime / 600) * 600)) / 10); + pprintf(p, "Black (%s) : %d mins, %d secs\n", + player_globals.parray[game_globals.garray[g].black].name, + game_globals.garray[g].bTime / 600, + (game_globals.garray[g].bTime - ((game_globals.garray[g].bTime / 600) * 600)) / 10); + return COM_OK; +} + +int com_ptime(int p, param_list param) +{ + struct player *pp = &player_globals.parray[p]; + int retval, part = pp->partner; + + if (part < 0) { + pprintf(p, "You do not have a partner.\n"); + return COM_OK; + } + retval = pcommand (p, "time %s", player_globals.parray[part].name); + if (retval == COM_OK) + return COM_OK_NOPROMPT; + else + return retval; +} + +int com_boards(int p, param_list param) +{ + char *category = NULL; + char dname[MAX_FILENAME_SIZE]; + DIR *dirp; + struct dirent *dp; + + if (param[0].type == TYPE_WORD) + category = param[0].val.word; + if (category) { + pprintf(p, "Boards Available For Category %s:\n", category); + sprintf(dname, "%s/%s", BOARD_DIR, category); + } else { + pprintf(p, "Categories Available:\n"); + sprintf(dname, "%s", BOARD_DIR); + } + dirp = opendir(dname); + if (!dirp) { + pprintf(p, "No such category %s, try \"boards\".\n", category); + return COM_OK; + } + +/* YUK! what a mess, how about printing an ordered directory? - DAV*/ + + for (dp = readdir(dirp); dp != NULL; dp = readdir(dirp)) { + if (!strcmp(dp->d_name, ".")) + continue; + if (!strcmp(dp->d_name, "..")) + continue; + pprintf(p, "%s\n", dp->d_name); + } + closedir(dirp); + return COM_OK; +} + +int com_simmatch(int p, param_list param) +{ + struct player *pp = &player_globals.parray[p]; + int p1, g, adjourned; + int num; + char tmp[100]; + struct pending* pend; + char* board = NULL; + char* category = NULL; + char fname[MAX_FILENAME_SIZE]; + + if (pp->game >=0) { + if (game_globals.garray[pp->game].status == GAME_EXAMINE) { + pprintf(p, "You are still examining a game.\n"); + return COM_OK; + } + if (game_globals.garray[pp->game].status == GAME_SETUP) { + pprintf(p, "You are still setting up a position.\n"); + return COM_OK; + } + } + p1 = player_find_part_login(param[0].val.word); + if (p1 < 0) { + pprintf(p, "No user named \"%s\" is logged in.\n", param[0].val.word); + return COM_OK; + } + if (p == p1) { + pprintf(p, "You can't simmatch yourself!\n"); + return COM_OK; + } + if ((pend = find_pend(p1, p, PEND_SIMUL)) != NULL) { + + /* Accepting Simul ! */ + + if ((pp->simul_info != NULL) && + (pp->simul_info->numBoards >= MAX_SIMUL)) { + pprintf(p, "You are already playing the maximum of %d boards.\n", MAX_SIMUL); + pprintf(p1, "Simul request removed, boards filled.\n"); + delete_pending(pend); + return COM_OK; + } + unobserveAll(p); /* stop observing when match starts */ + unobserveAll(p1); + + g = game_new(); + adjourned = 0; + if (game_read(g, p, p1) >= 0) { + adjourned = 1; + delete_pending(pend); + } + + if (!adjourned) { /* no adjourned game, so begin a new game */ + + if ((pend->category != NULL) && (pend->board_type != NULL)) { + board = strdup(pend->category); + category = strdup(pend->board_type); + } + + delete_pending(pend); + + if (create_new_match(g,p, p1, 0, 0, 0, 0, 0, ((board == NULL) ? "\0" : board), ((category == NULL) ? "\0" : category), 1,1) == COM_FAILED) { + pprintf(p, "There was a problem creating the new match.\n"); + pprintf_prompt(p1, "There was a problem creating the new match.\n"); + game_remove(g); + + if (board != NULL) { + free (board); + free (category); + } + return COM_OK; + } + + if (board != NULL) { + free (board); + free (category); + } + + } else { /* resume adjourned game */ + game_delete(p, p1); + + sprintf(tmp, "{Game %d (%s vs. %s) Continuing %s %s simul.}\n", g + 1, pp->name, player_globals.parray[p1].name, rstr[game_globals.garray[g].rated], bstr[game_globals.garray[g].type]); + pprintf(p, tmp); + pprintf(p1, tmp); + + game_globals.garray[g].white = p; + game_globals.garray[g].black = p1; + game_globals.garray[g].status = GAME_ACTIVE; + game_globals.garray[g].startTime = tenth_secs(); + game_globals.garray[g].lastMoveTime = game_globals.garray[g].startTime; + game_globals.garray[g].lastDecTime = game_globals.garray[g].startTime; + pp->game = g; + pp->opponent = p1; + pp->side = WHITE; + player_globals.parray[p1].game = g; + player_globals.parray[p1].opponent = p; + player_globals.parray[p1].side = BLACK; + send_boards(g); + } + + if (pp->simul_info == NULL) { + pp->simul_info = (struct simul_info_t *) malloc(sizeof(struct simul_info_t)); + pp->simul_info->numBoards = 0; + pp->simul_info->onBoard = 0; + pp->simul_info->num_wins = pp->simul_info->num_draws + = pp->simul_info->num_losses = 0; + } + num = pp->simul_info->numBoards; + /* pp->simul_info->results[num] = -1; */ + pp->simul_info->boards[num] = pp->game; + pp->simul_info->numBoards++; + if (pp->simul_info->numBoards > 1 && + pp->simul_info->onBoard >= 0) + player_goto_board(p, pp->simul_info->onBoard); + else + pp->simul_info->onBoard = 0; + return COM_OK; + } + if (find_pend(-1, p, PEND_SIMUL) != NULL) { + pprintf(p, "You cannot be the simul giver and request to join another simul.\nThat would just be too confusing for me and you.\n"); + return COM_OK; + } + if (pp->simul_info != NULL) { + if (pp->simul_info->numBoards) { + pprintf(p, "You cannot be the simul giver and request to join another simul.\nThat would just be too confusing for me and you.\n"); + return COM_OK; + } + } + if (pp->game >=0) { + pprintf(p, "You are already playing a game.\n"); + return COM_OK; + } + if (!CheckPFlag(p1, PFLAG_SIMOPEN)) { + pprintf_highlight(p, "%s", player_globals.parray[p1].name); + pprintf(p, " is not open to receiving simul requests.\n"); + return COM_OK; + } + if ((player_globals.parray[p1].simul_info != NULL) && (player_globals.parray[p1].simul_info->numBoards >= MAX_SIMUL)) { + pprintf_highlight(p, "%s", player_globals.parray[p1].name); + pprintf(p, " is already playing the maximum of %d boards.\n", MAX_SIMUL); + return COM_OK; + } + +/* loon: checking for some crazy situations we can't allow :) */ + + if ((player_globals.parray[p1].simul_info != NULL) && (player_globals.parray[p1].game >=0) && (player_globals.parray[p1].simul_info->numBoards == 0)) { + pprintf_highlight(p, "%s", player_globals.parray[p1].name); + if (player_globals.parray[game_globals.garray[player_globals.parray[p1].game].white].simul_info->numBoards) { + pprintf(p, " is playing in "); + pprintf_highlight(p, "%s", player_globals.parray[player_globals.parray[p1].opponent].name); + pprintf(p, "'s simul, and can't accept.\n"); + } else { + pprintf(p, " can't begin a simul while playing a non-simul game.\n"); + } + return COM_OK; + } + + g = game_new(); /* Check if an adjourned untimed game */ + adjourned = ((game_read(g, p, p1) < 0) && (game_read(g, p1, p) < 0)) ? 0 : 1; + if (adjourned) { + if (!(game_globals.garray[g].type == TYPE_UNTIMED)) + adjourned = 0; + } + game_remove(g); + + pend = add_request(p, p1, PEND_SIMUL); + + if ((param[1].type == TYPE_WORD) && (param[2].type == TYPE_WORD)) { + + sprintf(fname, "%s/%s/%s", BOARD_DIR, param[1].val.word , param[2].val.word); + if (!file_exists(fname)) { + pprintf(p, "No such category/board: %s/%s\n", param[1].val.word , param[2].val.word); + return COM_OK; + } + pend->category = strdup(param[1].val.word); + pend->board_type = strdup(param[2].val.word); + } else { + pend->category = NULL; + pend->board_type = NULL; + } + + pprintf(p1, "\n"); + pprintf_highlight(p1, "%s", pp->name); + if (adjourned) { + pprintf_prompt(p1, " requests to continue an adjourned simul game.\n"); + pprintf(p, "Request to resume simul sent. Adjourned game found.\n"); + } else { + if (pend->category == NULL) + pprintf_prompt(p1, " requests to join a simul match with you.\n"); + else + pprintf_prompt(p1, " requests to join a %s %s simul match with you.\n", + pend->category,pend->board_type); + pprintf(p, "Simul match request sent.\n"); + } + return COM_OK; +} + +int com_goboard(int p, param_list param) +{ + struct player *pp = &player_globals.parray[p]; + int on, g, p1, gamenum; + + if (pp->simul_info == NULL) { + pprintf(p, "You are not giving a simul.\n"); + return COM_OK; + } + + if (!pp->simul_info->numBoards) { + pprintf(p, "You are not giving a simul.\n"); + return COM_OK; + } + + if (param[0].type == TYPE_WORD) { + + p1 = player_find_part_login(param[0].val.word); + if (p1 < 0) { + pprintf(p, "No user named \"%s\" is logged in.\n", param[0].val.word); + return COM_OK; + } + if (p == p1) { + pprintf(p, "You can't goboard yourself!\n"); + return COM_OK; + } + + gamenum = player_globals.parray[p1].game; + if (gamenum < 0) { + pprintf (p,"%s is not playing a game.\n", player_globals.parray[p1].login); + return COM_OK; + } + + } else { + gamenum = param[0].val.integer - 1; + if (gamenum < 0) + gamenum = 0; + } + + on = pp->simul_info->onBoard; + g = pp->simul_info->boards[on]; + if (gamenum == g) { + pprintf(p, "You are already at that board!\n"); + return COM_OK; + } + if (pp->simul_info->numBoards > 1) { + decline_withdraw_offers(p, -1, -PEND_SIMUL,DO_DECLINE); + if (player_goto_simulgame_bynum(p, gamenum) !=-1) { + if (g >= 0) { + pprintf(game_globals.garray[g].black, "\n"); + pprintf_highlight(game_globals.garray[g].black, "%s", pp->name); + pprintf_prompt(game_globals.garray[g].black, " has moved away from your board.\n"); + } + } else + pprintf(p, "You are not playing that game/person.\n"); + } else + pprintf(p, "You are only playing one board!\n"); + return COM_OK; +} + +int com_simnext(int p, param_list param) +{ + struct player *pp = &player_globals.parray[p]; + int on, g; + + if (pp->simul_info == NULL) { + pprintf(p, "You are not giving a simul.\n"); + return COM_OK; + } + + if (!pp->simul_info->numBoards) { + pprintf(p, "You are not giving a simul.\n"); + return COM_OK; + } + + if (pp->simul_info->numBoards > 1) { + decline_withdraw_offers(p, -1, -PEND_SIMUL,DO_DECLINE); + on = pp->simul_info->onBoard; + g = pp->simul_info->boards[on]; + if (g >= 0) { + pprintf(game_globals.garray[g].black, "\n"); + pprintf_highlight(game_globals.garray[g].black, "%s", pp->name); + pprintf_prompt(game_globals.garray[g].black, " is moving away from your board.\n"); + player_goto_next_board(p); + } + } else + pprintf(p, "You are only playing one board!\n"); + return COM_OK; +} + +int com_simprev(int p, param_list param) +{ + struct player *pp = &player_globals.parray[p]; + int on, g; + + if (pp->simul_info == NULL) { + pprintf(p, "You are not giving a simul.\n"); + return COM_OK; + } + + if (!pp->simul_info->numBoards) { + pprintf(p, "You are not giving a simul.\n"); + return COM_OK; + } + if (pp->simul_info->numBoards > 1) { + decline_withdraw_offers(p, -1, -PEND_SIMUL,DO_DECLINE); + on = pp->simul_info->onBoard; + g = pp->simul_info->boards[on]; + if (g >= 0) { + pprintf(game_globals.garray[g].black, "\n"); + pprintf_highlight(game_globals.garray[g].black, "%s", pp->name); + pprintf_prompt(game_globals.garray[g].black, " is moving back to the previous board.\n"); + } + player_goto_prev_board(p); + } else + pprintf(p, "You are only playing one board!\n"); + return COM_OK; +} + +int com_simgames(int p, param_list param) +{ + int p1 = p; + + if (param[0].type == TYPE_WORD) { + if ((p1 = player_find_part_login(param[0].val.word)) < 0) { + pprintf(p, "No player named %s is logged in.\n", param[0].val.word); + return COM_OK; + } + } + if (p1 == p) + pprintf(p, "You are playing %d simultaneous games.\n", + player_num_active_boards(p1)); + else + pprintf(p, "%s is playing %d simultaneous games.\n", player_globals.parray[p1].name, + player_num_active_boards(p1)); + return COM_OK; +} + +int com_simpass(int p, param_list param) +{ + struct player *pp = &player_globals.parray[p]; + int g, p1, on; + + if (!pIsPlaying(p)) + return COM_OK; + + g = pp->game; + p1 = game_globals.garray[g].white; + + if (player_globals.parray[p1].simul_info == NULL) { + pprintf(p, "You are not participating in a simul.\n"); + return COM_OK; + } + + if (!player_globals.parray[p1].simul_info->numBoards) { + pprintf(p, "You are not participating in a simul.\n"); + return COM_OK; + } + if (p == p1) { + pprintf(p, "You are the simul holder and cannot pass!\n"); + return COM_OK; + } + if (player_num_active_boards(p1) == 1) { + pprintf(p, "This is the only game, so passing is futile.\n"); + return COM_OK; + } + on = player_globals.parray[p1].simul_info->onBoard; + if (player_globals.parray[p1].simul_info->boards[on] != g) { + pprintf(p, "You cannot pass until the simul holder arrives!\n"); + return COM_OK; + } + if (game_globals.garray[g].passes >= MAX_SIMPASS) { + Bell (p); + pprintf(p, "You have reached your maximum of %d pass(es).\n", MAX_SIMPASS); + pprintf(p, "Please move IMMEDIATELY!\n"); + pprintf_highlight(p1, "%s", pp->name); + pprintf_prompt(p1, " tried to pass, but is out of passes.\n"); + return COM_OK; + } + decline_withdraw_offers(p, -1, -PEND_SIMUL,DO_DECLINE); + + game_globals.garray[g].passes++; + pprintf(p, "You have passed and have %d pass(es) left.\n", + (MAX_SIMPASS - game_globals.garray[g].passes)); + pprintf_highlight(p1, "%s", pp->name); + pprintf_prompt(p1, " has decided to pass and has %d pass(es) left.\n", + (MAX_SIMPASS - game_globals.garray[g].passes)); + player_goto_next_board(p1); + return COM_OK; +} + +int com_simabort(int p, param_list param) +{ + struct player *pp = &player_globals.parray[p]; + + if (pp->simul_info == NULL) { + pprintf(p, "You are not giving a simul.\n"); + return COM_OK; + } + + if (!pp->simul_info->numBoards) { + pprintf(p, "You are not giving a simul.\n"); + return COM_OK; + } + decline_withdraw_offers(p, -1, -PEND_SIMUL,DO_DECLINE); + game_ended(pp->simul_info->boards[pp->simul_info->onBoard], + WHITE, END_ABORT); + return COM_OK; +} + +int com_simallabort(int p, param_list param) +{ + struct player *pp = &player_globals.parray[p]; + int i; + + if (pp->simul_info == NULL) { + pprintf(p, "You are not giving a simul.\n"); + return COM_OK; + } + + if (!pp->simul_info->numBoards) { + pprintf(p, "You are not giving a simul.\n"); + return COM_OK; + } + + decline_withdraw_offers(p, -1, -PEND_SIMUL,DO_DECLINE); + for (i = 0; i < pp->simul_info->numBoards; i++) + if (pp->simul_info->boards[i] >= 0) + game_ended(pp->simul_info->boards[i], + WHITE, END_ABORT); + + return COM_OK; +} + +int com_simadjourn(int p, param_list param) +{ + struct player *pp = &player_globals.parray[p]; + + if (pp->simul_info == NULL) { + pprintf(p, "You are not giving a simul.\n"); + return COM_OK; + } + + if (!pp->simul_info->numBoards) { + pprintf(p, "You are not giving a simul.\n"); + return COM_OK; + } + decline_withdraw_offers(p, -1, -PEND_SIMUL,DO_DECLINE); + game_ended(pp->simul_info->boards[pp->simul_info->onBoard], + WHITE, END_ADJOURN); + return COM_OK; +} + +int com_simalladjourn(int p, param_list param) +{ + struct player *pp = &player_globals.parray[p]; + int i; + + if (pp->simul_info == NULL) { + pprintf(p, "You are not giving a simul.\n"); + return COM_OK; + } + + if (!pp->simul_info->numBoards) { + pprintf(p, "You are not giving a simul.\n"); + return COM_OK; + } + decline_withdraw_offers(p, -1, -PEND_SIMUL,DO_DECLINE); + for (i = 0; i < pp->simul_info->numBoards; i++) + if (pp->simul_info->boards[i] >= 0) + game_ended(pp->simul_info->boards[i], + WHITE, END_ADJOURN); + + return COM_OK; +} + +int com_moretime(int p, param_list param) +{ + struct player *pp = &player_globals.parray[p]; + int g, increment; + + if ((pp->game >=0) &&((game_globals.garray[pp->game].status == GAME_EXAMINE) || + (game_globals.garray[pp->game].status == GAME_SETUP))) { + pprintf(p, "You cannot use moretime in an examined game.\n"); + return COM_OK; + } + increment = param[0].val.integer; + if (increment <= 0) { + pprintf(p, "Moretime requires an integer value greater than zero.\n"); + return COM_OK; + } + if (!pIsPlaying(p)) + return COM_OK; + + if (increment > 600) { + pprintf(p, "Moretime has a maximum limit of 600 seconds.\n"); + increment = 600; + } + g = pp->game; + if (game_globals.garray[g].white == p) { + game_globals.garray[g].bTime += increment * 10; + game_globals.garray[g].bRealTime += increment * 10 * 100; + pprintf(p, "%d seconds were added to your opponents clock\n", + increment); + pprintf_prompt(pp->opponent, + "\nYour opponent has added %d seconds to your clock.\n", + increment); + } + if (game_globals.garray[g].black == p) { + game_globals.garray[g].wTime += increment * 10;; + game_globals.garray[g].wRealTime += increment * 10 * 100; + pprintf(p, "%d seconds were added to your opponents clock\n", + increment); + pprintf_prompt(pp->opponent, + "\nYour opponent has added %d seconds to your clock.\n", + increment); + } + return COM_OK; +} + diff --git a/lasker-2.2.3/src/gameproc.h b/lasker-2.2.3/src/gameproc.h new file mode 100644 index 0000000..806e660 --- /dev/null +++ b/lasker-2.2.3/src/gameproc.h @@ -0,0 +1,27 @@ +/* + Copyright (c) 1993 Richard V. Nash. + Copyright (c) 2000 Dan Papasian + Copyright (C) Andrew Tridgell 2002 + + 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., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + + +#ifndef _GAMEPROC_H +#define _GAMEPROC_H + +#define MAX_SIMPASS 3 + +#endif /* _GAMEPROC_H */ diff --git a/lasker-2.2.3/src/gics.c b/lasker-2.2.3/src/gics.c new file mode 100644 index 0000000..d8ac55d --- /dev/null +++ b/lasker-2.2.3/src/gics.c @@ -0,0 +1,240 @@ +/* + 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., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +/* + * FICS-Extensions used at GICS chess.unix-ag.uni-kl.de 5000 + * (c) 1995/1996 by Ulrich Schlechte + * Klaus Knopper + * + * +*/ + +#include "includes.h" + + +void init_userstat(void) +{ + FILE *fp; + int i; + + if ((fp = fopen_s(STATS_DIR "/user.stats", "r")) == NULL) { + bzero((char *) &gics_globals.userstat, sizeof(gics_globals.userstat)); + return; + } + + for (i = 0; i < 48; i++) { + fscanf(fp, "%d\n", &gics_globals.userstat.users[i]); + } + fscanf(fp, "%d\n", &gics_globals.userstat.usermax); + fscanf(fp, "%d\n", (int *) &gics_globals.userstat.usermaxtime); + fscanf(fp, "%d\n", &gics_globals.userstat.logins); + fscanf(fp, "%d\n", &gics_globals.userstat.games); + fscanf(fp, "%d\n", &gics_globals.userstat.gamemax); + fscanf(fp, "%d\n", (int *) &gics_globals.userstat.gamemaxtime); + fclose(fp); +} + +void save_userstat(void) +{ + FILE *fp; + int i; + + if ((fp = fopen_s(STATS_DIR "/user.stats", "w")) == NULL) + return; + for (i = 0; i < 48; i++) + fprintf(fp, "%d\n", gics_globals.userstat.users[i]); + fprintf(fp, "%d\n%d\n%d\n", + gics_globals.userstat.usermax, gics_globals.userstat.usermaxtime, gics_globals.userstat.logins); + fprintf(fp, "%d\n%d\n%d\n", + gics_globals.userstat.games, gics_globals.userstat.gamemax, gics_globals.userstat.gamemaxtime); + fclose(fp); +} + +#if 0 +int com_ping(int p, param_list param) +{ + int p1; + struct timeval timeState; + struct timezone tz; + + if ((p1 = player_find_bylogin(param[0].val.word)) < 0) { + pprintf(p, "Player \"%s\" not logged on!\n", param[0].val.word); + return COM_OK; + } + if ((!con[player_globals.parray[p1].socket].timeseal) || (con[player_globals.parray[p1].socket].method)) { + pprintf(p, "%s is not using timeseal or uses an old client.\n", player_globals.parray[p1].name); + return COM_OK; + } + pprintf(p1, "\n[P]\n"); + gettimeofday(&timeState, &tz); + con[player_globals.parray[p1].socket].pingtime = (((int) timeState.tv_sec % 10000) * 1000) + ((int) timeState.tv_usec / 1000); + con[player_globals.parray[p1].socket].pingplayer = p; + return COM_OK; +} +#endif + +void game_save_playerratio(char *file, char *Opponent, int Result, int rated) +{ + FILE *fp, *fp1; + char Name[32], file1[256]; + int win, loss, draw, flag = 0, inc = 1; + + if (!rated) + inc = 100000; + + sprintf(file1, "%s.new", file); + if ((fp = fopen_s(file, "r")) != NULL) { + fp1 = fopen_s(file1, "w"); + while (!feof(fp)) { + if (fscanf(fp, "%s %d %d %d\n", Name, &win, &draw, &loss) != 4) { + break; + } + if (strcasecmp(Name, Opponent) == 0) { + if (Result == 1) + win += inc; + if (Result == 0) + loss += inc; + if (Result == -1) + draw += inc; + flag++; + } + fprintf(fp1, "%s %d %d %d\n", Name, win, draw, loss); + } + fclose(fp); + if (!flag) { + win = loss = draw = 0; + if (Result == 1) + win += inc; + if (Result == 0) + loss += inc; + if (Result == -1) + draw += inc; + fprintf(fp1, "%s %d %d %d\n", Opponent, win, draw, loss); + } + fclose(fp1); + unlink(file); + if (rename(file1, file) != 0) { + d_printf("CHESSD: Problems rename %s to %s : %d\n", file1, file, errno); + return; + } + return; + } else { + fp = fopen_s(file, "w"); + if(fp == NULL) { + perror("fopen"); + d_printf("Unable to open %s - very bad, info not saved\n",file); + return; + } + win = loss = draw = 0; + if (Result == 1) + win += inc; + if (Result == 0) + loss += inc; + if (Result == -1) + draw += inc; + fprintf(fp, "%s %d %d %d\n", Opponent, win, draw, loss); + fclose(fp); + } +} + +int com_pstat(int p, param_list param) +{ + struct player *pp = &player_globals.parray[p]; + int p1 = p, p2, ptemp, pflag=0; + int p1_connected = 1, p2_connected = 1; + int win = 0, draw = 0, loss = 0, flag = 0; + FILE *fp; + char Name[32], fname[256]; + + if (param[0].type == TYPE_NULL) { + if (pp->game < 0) { + pprintf(p, "You are not playing a game.\n"); + return COM_OK; + } + if (game_globals.garray[pp->game].status == GAME_EXAMINE) { + pprintf(p, "You are examining a game please specify variables.\n"); + return COM_OK; + } + p2 = pp->opponent; + } else { + if (!FindPlayer(p, param[0].val.word, &p2, &p2_connected)) { + pprintf(p, "No user named \"%s\" is logged in.\n", param[0].val.word); + return COM_OK; + } + if (param[1].type != TYPE_NULL) { + if (!FindPlayer(p, param[1].val.word, &p1, &p1_connected)) { + pprintf(p, "No user named \"%s\" is logged in.\n", param[1].val.word); + if (!p2_connected) + player_remove(p2); + return COM_OK; + } + ptemp = p2; + p2 = p1; + p1 = ptemp; + pflag = 1; + } + } + if (p1 == p2) { + pprintf(p, "You have not played against yourself ;-)\n"); + if (!p1_connected) + player_remove(p1); + if (!p2_connected) + player_remove(p2); + return COM_OK; + } + sprintf(fname, "%s/player_data/%c/%s.gstats", STATS_DIR, player_globals.parray[p1].login[0], player_globals.parray[p1].login); + if ((fp = fopen_s(fname, "r")) != NULL) { + while (!feof(fp)) { + if (fscanf(fp, "%s %d %d %d\n", Name, &win, &draw, &loss) != 4) { + win = loss = draw = 0; + break; + } + if (strcasecmp(Name, player_globals.parray[p2].name) == 0) { + flag++; + break; + } + } + fclose(fp); + } + if (!flag) + win = loss = draw = 0; + pprintf(p, "Record for %s vs. %s:\n", player_globals.parray[p1].name, player_globals.parray[p2].name); + pprintf(p, " wins losses draws\n"); + pprintf(p, " rated %4d %4d %4d\n", win % 100000, loss % 100000, draw % 100000); + pprintf(p, " unrated %4d %4d %4d\n", win / 100000, loss / 100000, draw / 100000); + /* pprintf(p, "Ratio of %s vs. %s (r/u): %d/%d wins %d/%d draws %d/%d losses\n", player_globals.parray[p1].name, player_globals.parray[p2].name, + * win % 100000, win / 100000, draw % 100000, draw / 100000, loss % 100000, loss / 100000); + */ + if (pflag) { + ptemp = p1; + p1 = p2; + p2 = ptemp; + } + if (!p1_connected) + player_remove(p1); + if (!p2_connected) + player_remove(p2); + return COM_OK; +} + + + + + + + + + diff --git a/lasker-2.2.3/src/gics.h b/lasker-2.2.3/src/gics.h new file mode 100644 index 0000000..1a3229c --- /dev/null +++ b/lasker-2.2.3/src/gics.h @@ -0,0 +1,43 @@ +/* + 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., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +/* + * FICS-Extensions used at GICS chess.unix-ag.uni-kl.de 5000 + * (c) 1995/1996 by Ulrich Schlechte + * Klaus Knopper + * + * +*/ + + +#ifndef GICS_H +#define GICS_H + +/* Needed for ustat-funktion */ +GENSTRUCT struct userstat_type { + int users[48]; + int usermax; + int usermaxtime; + int logins; + int games; + int gamemax; + int gamemaxtime; +}; + +#endif /* GICS_H */ + + + diff --git a/lasker-2.2.3/src/globals.h b/lasker-2.2.3/src/globals.h new file mode 100644 index 0000000..80bf263 --- /dev/null +++ b/lasker-2.2.3/src/globals.h @@ -0,0 +1,98 @@ +/* + Copyright 2002 Andrew Tridgell + + 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., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +/* + all global variiables in chessd have been moved here so that they can + be maintained over a code reload. As long as the code reload does not change the + shape or meaning of any of the following globals then the reload should work +*/ + + +/* the EXTERN macro is used to allow ficsmain.c to declare real variables while + other modules declare them as extern */ +#ifndef EXTERN +#define EXTERN extern +#endif + +/* from network.c */ +GENSTRUCT struct net_globals { + int sockfd; /* main listening socket */ + int numConnections; /* number of active connections */ + int no_file; /* number of connections allocated */ + struct connection_t **con; _LEN(no_file) +}; +EXTERN struct net_globals net_globals; + +/* from gamedb.c */ + +GENSTRUCT struct game_globals { + int g_num; + struct game *garray; _LEN(g_num) +}; +EXTERN struct game_globals game_globals; + +/* from playerdb.c */ +GENSTRUCT struct player_globals { + int p_num; + unsigned parray_size; + struct player *parray; _LEN(parray_size) +}; +EXTERN struct player_globals player_globals; + +/* from command.c */ +GENSTRUCT struct command_globals { + time_t startuptime; + int player_high; + int game_high; + int commanding_player; +}; +EXTERN struct command_globals command_globals; + +/* from gics.c */ +GENSTRUCT struct gics_globals { + struct userstat_type userstat; +}; +EXTERN struct gics_globals gics_globals; + +/* from seekproc.c */ +GENSTRUCT struct seek_globals { + int quota_time; + struct pending *pendlist; + unsigned max_ads; + struct pending *ads; _LEN(max_ads) +}; +EXTERN struct seek_globals seek_globals; + +/* from timeseal.c */ +GENSTRUCT struct timeseal_globals { + int decoder_conn; +}; +EXTERN struct timeseal_globals timeseal_globals; + +/* a structure containing all globals, to make it easy to save + globals for a reload +*/ +GENSTRUCT struct all_globals { + struct net_globals *net_globals; + struct game_globals *game_globals; + struct player_globals *player_globals; + struct command_globals *command_globals; + struct gics_globals *gics_globals; + struct seek_globals *seek_globals; + struct timeseal_globals *timeseal_globals; +}; diff --git a/lasker-2.2.3/src/help.c b/lasker-2.2.3/src/help.c new file mode 100644 index 0000000..0a8988a --- /dev/null +++ b/lasker-2.2.3/src/help.c @@ -0,0 +1,120 @@ +/* + Copyright (C) Andrew Tridgell 2002 + + 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., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ +/* + support for the 'help' and 'ahelp' commands + */ + +#include "includes.h" + +static const char *help_dir[NUM_LANGS] = {HELP_DIR, HELP_SPANISH, + HELP_FRENCH, HELP_DANISH}; + + + +/* + help from a directory +*/ +static int help_page(int p, const char *dir, const char *cmd) +{ + int count; + char *filenames[1000]; + + /* try for help dir exact match */ + if (psend_file(p, dir, cmd) == 0) { + return COM_OK; + } + + /* search help dir for a partial match */ + count = search_directory(dir, cmd, filenames, 1000); + if (count == 1) { + psend_file(p, dir, filenames[0]); + FREE(filenames[0]); + return COM_OK; + } + + if (count > 0) { + pprintf(p,"-- Matches: %u help topics --", count); + display_directory(p, filenames, count); + return COM_OK; + } + + /* allow admins to use 'help' for admin pages */ + if (dir != ADHELP_DIR && check_admin(p, ADMIN_ADMIN)) { + return help_page(p, ADHELP_DIR, cmd); + } + + pprintf(p,"No help found for topic '%s'\n", cmd); + + return COM_OK; +} + +/* + public help + */ +int com_help(int p, param_list param) +{ + struct player *pp = &player_globals.parray[p]; + char *cmd; + int i, n; + const struct alias_type *list; + + if (param[0].type == TYPE_STRING) { + cmd = param[0].val.string; + } else { + cmd = "help"; + } + + /* see if its a global alias */ + list = alias_list_global(); + for (i=0;list && list[i].comm_name;i++) { + if (strcasecmp(cmd, list[i].comm_name) == 0) { + pprintf(p,"'%s' is a global alias for '%s'\n", + cmd, list[i].alias); + return COM_OK; + } + } + + /* or a personal alias */ + list = alias_list_personal(p, &n); + for (i=0;ilanguage], cmd); +} + +/* + admin only help + */ +int com_ahelp(int p, param_list param) +{ + char *cmd; + + if (param[0].type == TYPE_STRING) { + cmd = param[0].val.string; + } else { + cmd = "commands"; + } + + return help_page(p, ADHELP_DIR, cmd); +} + diff --git a/lasker-2.2.3/src/includes.h b/lasker-2.2.3/src/includes.h new file mode 100644 index 0000000..d6348e3 --- /dev/null +++ b/lasker-2.2.3/src/includes.h @@ -0,0 +1,82 @@ +/* + Copyright (C) Andrew Tridgell 2002 + + 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., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + + +#define _GNU_SOURCE +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "autoconfig.h" +#include "malloc.h" +#include "parsers/genparser.h" +#include "common.h" +#include "vers.h" +#include "variable.h" +#include "command.h" +#include "gics.h" +#include "tdb/tdb.h" +#include "ficsmain.h" +#include "config.h" +#include "network.h" +#include "board.h" +#include "gamedb.h" +#include "lists.h" +#include "iset.h" +#include "playerdb.h" +#include "ratings.h" +#include "utils.h" +#include "talkproc.h" +#include "comproc.h" +#include "pending.h" +#include "multicol.h" +#include "movecheck.h" +#include "obsproc.h" +#include "formula.h" +#include "gameproc.h" +#include "matchproc.h" +#include "md5.h" +#include "news.h" +#include "globals.h" + +#include "proto.h" diff --git a/lasker-2.2.3/src/install-sh b/lasker-2.2.3/src/install-sh new file mode 100755 index 0000000..5871924 --- /dev/null +++ b/lasker-2.2.3/src/install-sh @@ -0,0 +1,238 @@ +#! /bin/sh +# +# install - install a program, script, or datafile +# This comes from X11R5. +# +# Calling this script install-sh is preferred over install.sh, to prevent +# `make' implicit rules from creating a file called install from it +# when there is no Makefile. +# +# This script is compatible with the BSD install script, but was written +# from scratch. +# + + +# set DOITPROG to echo to test this script + +# Don't use :- since 4.3BSD and earlier shells don't like it. +doit="${DOITPROG-}" + + +# put in absolute paths if you don't have them in your path; or use env. vars. + +mvprog="${MVPROG-mv}" +cpprog="${CPPROG-cp}" +chmodprog="${CHMODPROG-chmod}" +chownprog="${CHOWNPROG-chown}" +chgrpprog="${CHGRPPROG-chgrp}" +stripprog="${STRIPPROG-strip}" +rmprog="${RMPROG-rm}" +mkdirprog="${MKDIRPROG-mkdir}" + +transformbasename="" +transform_arg="" +instcmd="$mvprog" +chmodcmd="$chmodprog 0755" +chowncmd="" +chgrpcmd="" +stripcmd="" +rmcmd="$rmprog -f" +mvcmd="$mvprog" +src="" +dst="" +dir_arg="" + +while [ x"$1" != x ]; do + case $1 in + -c) instcmd="$cpprog" + shift + continue;; + + -d) dir_arg=true + shift + continue;; + + -m) chmodcmd="$chmodprog $2" + shift + shift + continue;; + + -o) chowncmd="$chownprog $2" + shift + shift + continue;; + + -g) chgrpcmd="$chgrpprog $2" + shift + shift + continue;; + + -s) stripcmd="$stripprog" + shift + continue;; + + -t=*) transformarg=`echo $1 | sed 's/-t=//'` + shift + continue;; + + -b=*) transformbasename=`echo $1 | sed 's/-b=//'` + shift + continue;; + + *) if [ x"$src" = x ] + then + src=$1 + else + # this colon is to work around a 386BSD /bin/sh bug + : + dst=$1 + fi + shift + continue;; + esac +done + +if [ x"$src" = x ] +then + echo "install: no input file specified" + exit 1 +else + true +fi + +if [ x"$dir_arg" != x ]; then + dst=$src + src="" + + if [ -d $dst ]; then + instcmd=: + else + instcmd=mkdir + fi +else + +# Waiting for this to be detected by the "$instcmd $src $dsttmp" command +# might cause directories to be created, which would be especially bad +# if $src (and thus $dsttmp) contains '*'. + + if [ -f $src -o -d $src ] + then + true + else + echo "install: $src does not exist" + exit 1 + fi + + if [ x"$dst" = x ] + then + echo "install: no destination specified" + exit 1 + else + true + fi + +# If destination is a directory, append the input filename; if your system +# does not like double slashes in filenames, you may need to add some logic + + if [ -d $dst ] + then + dst="$dst"/`basename $src` + else + true + fi +fi + +## this sed command emulates the dirname command +dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` + +# Make sure that the destination directory exists. +# this part is taken from Noah Friedman's mkinstalldirs script + +# Skip lots of stat calls in the usual case. +if [ ! -d "$dstdir" ]; then +defaultIFS=' +' +IFS="${IFS-${defaultIFS}}" + +oIFS="${IFS}" +# Some sh's can't handle IFS=/ for some reason. +IFS='%' +set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` +IFS="${oIFS}" + +pathcomp='' + +while [ $# -ne 0 ] ; do + pathcomp="${pathcomp}${1}" + shift + + if [ ! -d "${pathcomp}" ] ; + then + $mkdirprog "${pathcomp}" + else + true + fi + + pathcomp="${pathcomp}/" +done +fi + +if [ x"$dir_arg" != x ] +then + $doit $instcmd $dst && + + if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi && + if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi && + if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi && + if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi +else + +# If we're going to rename the final executable, determine the name now. + + if [ x"$transformarg" = x ] + then + dstfile=`basename $dst` + else + dstfile=`basename $dst $transformbasename | + sed $transformarg`$transformbasename + fi + +# don't allow the sed command to completely eliminate the filename + + if [ x"$dstfile" = x ] + then + dstfile=`basename $dst` + else + true + fi + +# Make a temp file name in the proper directory. + + dsttmp=$dstdir/#inst.$$# + +# Move or copy the file name to the temp name + + $doit $instcmd $src $dsttmp && + + trap "rm -f ${dsttmp}" 0 && + +# and set any options; do chmod last to preserve setuid bits + +# If any of these fail, we abort the whole thing. If we want to +# ignore errors from any of these, just make sure not to ignore +# errors from the above "$doit $instcmd $src $dsttmp" command. + + if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi && + if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi && + if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi && + if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi && + +# Now rename the file to the real destination. + + $doit $rmcmd -f $dstdir/$dstfile && + $doit $mvcmd $dsttmp $dstdir/$dstfile + +fi && + + +exit 0 diff --git a/lasker-2.2.3/src/iset.c b/lasker-2.2.3/src/iset.c new file mode 100644 index 0000000..5796ba5 --- /dev/null +++ b/lasker-2.2.3/src/iset.c @@ -0,0 +1,67 @@ +/* + Copyright (C) Andrew Tridgell 2002 + + 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., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + + +#include "includes.h" + +/* + set a boolean ivar +*/ +static int iset_bool(int p, unsigned *v, const char *var, const char *value) +{ + if (strcmp(value, "1") == 0) { + *v = 1; + pprintf(p, "%s set\n", var); + } else if (strcmp(value, "0") == 0) { + *v = 0; + pprintf(p, "%s unset\n", var); + } else { + pprintf(p, "Bad value '%s' given for ivariable '%s'.\n", value, var); + } + return COM_OK; +} + +/* + support the iset command +*/ +int com_iset(int p, param_list param) +{ + struct player *pp = &player_globals.parray[p]; + char *var = param[0].val.word; + char *value = param[1].val.string; + struct ivariables *iv; + + iv = &pp->ivariables; + + if (iv->lock) { + pprintf(p,"Cannot alter: Interface setting locked.\n"); + return COM_OK; + } + + if (strcasecmp(var,"ms") == 0) { + return iset_bool(p, &iv->ms, var, value); + } else if (strcasecmp(var,"lock") == 0) { + return iset_bool(p, &iv->lock, var, value); + } else if (strcasecmp(var,"startpos") == 0) { + return iset_bool(p, &iv->startpos, var, value); + } else { + pprintf(p,"No such ivariable \"%s\".\n", var); + } + + return COM_OK; +} diff --git a/lasker-2.2.3/src/iset.h b/lasker-2.2.3/src/iset.h new file mode 100644 index 0000000..b2f3b9a --- /dev/null +++ b/lasker-2.2.3/src/iset.h @@ -0,0 +1,28 @@ +/* + Copyright (C) Andrew Tridgell 2002 + + 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., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +/* + structures for the iset command +*/ + +GENSTRUCT struct ivariables { + unsigned startpos; + unsigned ms; + unsigned lock; +}; + diff --git a/lasker-2.2.3/src/journal.h b/lasker-2.2.3/src/journal.h new file mode 100644 index 0000000..eda9b40 --- /dev/null +++ b/lasker-2.2.3/src/journal.h @@ -0,0 +1,11 @@ +typedef struct journal { + char *WhiteName2; + int WhiteRating2; + char *BlackName2; + int BlackRating2; + char *type2; + char *eco2; + char *ending2; + char *result2; + char *fname; +} journal; diff --git a/lasker-2.2.3/src/lists.c b/lasker-2.2.3/src/lists.c new file mode 100644 index 0000000..956175f --- /dev/null +++ b/lasker-2.2.3/src/lists.c @@ -0,0 +1,551 @@ +/* + 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., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +/* lists.c + * New global lists code + * + * + * Added by Shaney, 29 May 1995 :) + * +*/ + +#include "includes.h" + +static struct List *firstGlobalList = NULL; + +static ListTable ListArray[] = +{{P_HEAD, "admin"}, + {P_GOD, "removedcom"}, + {P_ADMIN, "filter"}, + {P_ADMIN, "ban"}, + {P_ADMIN, "abuser"}, + {P_ADMIN, "muzzle"}, + {P_ADMIN, "cmuzzle"}, + {P_ADMIN, "c1muzzle"}, /* possible FICS trouble spots */ + {P_ADMIN, "c24muzzle"}, /* would prefer two param addlist - DAV */ + {P_ADMIN, "c46muzzle"}, /* is a temp solution */ + {P_ADMIN, "c49muzzle"}, + {P_ADMIN, "c50muzzle"}, + {P_ADMIN, "c51muzzle"}, + {P_PUBLIC, "fm"}, + {P_PUBLIC, "im"}, + {P_PUBLIC, "gm"}, + {P_PUBLIC, "wgm"}, + {P_PUBLIC, "blind"}, + {P_PUBLIC, "teams"}, + {P_PUBLIC, "computer"}, + {P_PUBLIC, "td"}, + {P_PERSONAL, "censor"}, + {P_PERSONAL, "gnotify"}, + {P_PERSONAL, "noplay"}, + {P_PERSONAL, "notify"}, + {P_PERSONAL, "channel"}, + {P_PERSONAL, "follow"}, + {P_PERSONAL, "remote"}, + {0, NULL}}; + +/* free up memory used by lists */ +void lists_close(void) +{ + struct List *l; + + for (l=firstGlobalList; l; ) { + struct List *next = l->next; + int i; + for (i=0;inumMembers;i++) { + FREE(l->m_member[i]); + } + FREE(l->m_member); + l->numMembers = 0; + free(l); + l = next; + } + + firstGlobalList = NULL; +} + + +/* find a list. does not load from disk */ +static struct List *list_find1(int p, enum ListWhich l) +{ + struct player *pp = &player_globals.parray[p]; + struct List *prev, *tempList, **starter; + int personal; + + personal = ListArray[l].rights == P_PERSONAL; + starter = personal ? &(pp->lists) : &firstGlobalList; + + for (prev = NULL, tempList = *starter; tempList != NULL; tempList = tempList->next) { + if (l == tempList->which) { + if (prev != NULL) { + prev->next = tempList->next; + tempList->next = *starter; + *starter = tempList; + } + return tempList; + } + if (tempList->which >= L_LASTLIST) { + /* THIS SHOULD NEVER HAPPEN! But has been in personal list: bugs! */ + d_printf( "fics: ERROR!! in lists code\n"); + abort(); + } + prev = tempList; + } + + return NULL; +} + +/* find a list. loads from disk if not in memory. */ +static struct List *list_find(int p, enum ListWhich l) +{ + struct List *lst; + FILE *fp; + char listmember[100]; + int count=0; + + lst = list_find1(p, l); + if (lst) { + return lst; + } + + /* create the base list */ + list_add(p, l, NULL); + + if (ListArray[l].rights == P_PERSONAL) { + list_find1(p, l); + } + + fp = fopen_p("%s/%s", "r", LISTS_DIR, ListArray[l].name); + if (!fp) { + return NULL; + } + while (!feof(fp)) { + if (fgets(listmember, sizeof(listmember), fp) != NULL) { + if (list_add(p, l, listmember) == 0) { + count++; + } + } + } + fclose(fp); + + /* we've added some, retry */ + if (count) { + return list_find1(p, l); + } + + return NULL; +} + + +/* add item to list */ +int list_add(int p, enum ListWhich l, const char *s) +{ + struct player *pp = &player_globals.parray[p]; + struct List *gl = list_find1(p, l); + + if (!gl) { + gl = calloc(1, sizeof(*gl)); + gl->which = l; + if (ListArray[l].rights == P_PERSONAL) { + gl->next = pp->lists; + pp->lists = gl; + } else { + gl->next = firstGlobalList; + firstGlobalList = gl; + } + } + + if (!s) return 0; + + if (ListArray[l].rights == P_PERSONAL && + gl->numMembers >= config_get_int("MAX_USER_LIST_SIZE", DEFAULT_MAX_USER_LIST_SIZE)) { + return 1; + } + + while (isspace(*s)) s++; + + gl->m_member = (char **)realloc(gl->m_member, sizeof(char *) * (gl->numMembers+1)); + gl->m_member[gl->numMembers] = strndup(s, strcspn(s, " \t\r\n")); + gl->numMembers++; + + return 0; +} + +/* remove item from list */ +static int list_sub(int p, enum ListWhich l, char *s) +{ + struct List *gl = list_find(p, l); + int i; + + if (!gl) { + return 1; + } + for (i = 0; i < gl->numMembers; i++) { + if (!strcasecmp(s, gl->m_member[i])) { + break; + } + } + if (i == gl->numMembers) { + return 1; + } + + FREE(gl->m_member[i]); + + for (; i < (gl->numMembers - 1); i++) { + gl->m_member[i] = gl->m_member[i+1]; + } + + gl->numMembers--; + gl->m_member = (char **)realloc(gl->m_member, sizeof(char *) * gl->numMembers); + return 0; +} + +/* find list by name, doesn't have to be the whole name */ +struct List *list_findpartial(int p, char *which, int gonnado) +{ + struct player *pp = &player_globals.parray[p]; + struct List *gl; + int i, foundit, slen; + + slen = strlen(which); + for (i = 0, foundit = -1; ListArray[i].name != NULL; i++) { + if (!strncasecmp(ListArray[i].name, which, slen)) { + if (foundit == -1) + foundit = i; + else + return NULL; /* ambiguous */ + } + } + + if (foundit != -1) { + int rights = ListArray[foundit].rights; + int youlose = 0; + + switch (rights) { /* check rights */ + case P_HEAD: + if (gonnado && !player_ishead(p)) + youlose = 1; + break; + case P_GOD: + if ((gonnado && (pp->adminLevel < ADMIN_GOD)) || + (!gonnado && (pp->adminLevel < ADMIN_ADMIN))) + youlose = 1; + break; + case P_ADMIN: + if (pp->adminLevel < ADMIN_ADMIN) + youlose = 1; + break; + case P_PUBLIC: + if (gonnado && (pp->adminLevel < ADMIN_ADMIN)) + youlose = 1; + break; + } + if (youlose) { + pprintf(p, "\"%s\" is not an appropriate list name or you have insufficient rights.\n", which); + return NULL; + } + gl = list_find(p, foundit); + } else { + pprintf(p, "\"%s\" does not match any list name.\n", which); + return NULL; + } + return gl; +} + +/* see if something is in a list */ +int in_list(int p, enum ListWhich which, char *member) +{ + struct List *gl; + int i; + int filterList = (which == L_FILTER); + + gl = list_find(p, which); + if ((gl == NULL) || (member == NULL)) + return 0; + for (i = 0; i < gl->numMembers; i++) { + if (filterList) { + if (!strncasecmp(member, gl->m_member[i], strlen(gl->m_member[i]))) + return 1; + } else { + if (!strcasecmp(member, gl->m_member[i])) + return 1; + } + } + return 0; +} + +/* add or subtract something to/from a list */ +int list_addsub(int p, char* list, char* who, int addsub) +{ + struct player *pp = &player_globals.parray[p]; + int p1, connected, loadme, personal, ch; + char *listname, *member, junkChar; + struct List *gl; + char *yourthe, *addrem; + + gl = list_findpartial(p, list, addsub); + if (!gl) + return COM_OK; + + personal = ListArray[gl->which].rights == P_PERSONAL; + loadme = (gl->which != L_FILTER) && (gl->which != L_REMOVEDCOM) && (gl->which != L_CHANNEL); + listname = ListArray[gl->which].name; + yourthe = personal ? "your" : "the"; + addrem = (addsub == 1) ? "added to" : "removed from"; + + if (loadme) { + if (!FindPlayer(p, who, &p1, &connected)) { + if (addsub == 1) + return COM_OK; + member = who; /* allow sub removed/renamed player */ + loadme = 0; + } else + member = player_globals.parray[p1].name; + } else { + member = who; + } + + if (addsub == 1) { /* add to list */ + + if (gl->which == L_CHANNEL) { + + if (sscanf (who,"%d%c",&ch, &junkChar) == 1 && ch >= 0 && ch < 255) { + if ((ch == 0) && (!in_list(p,L_ADMIN,pp->name))) { + pprintf(p, "Only admins may join channel 0.\n"); + return COM_OK; + } + } else { + pprintf (p,"The channel to add must be a number between 0 and %d.\n",MAX_CHANNELS - 1); + return COM_OK; + } + } + if (in_list(p, gl->which, member)) { + pprintf(p, "[%s] is already on %s %s list.\n", member, yourthe, listname); + if (loadme && !connected) + player_remove(p1); + return COM_OK; + } + if (list_add(p, gl->which, member)) { + pprintf(p, "Sorry, %s %s list is full.\n", yourthe, listname); + if (loadme && !connected) + player_remove(p1); + return COM_OK; + } + } else if (addsub == 2) { /* subtract from list */ + if (!in_list(p, gl->which, member)) { + pprintf(p, "[%s] is not in %s %s list.\n", member, yourthe, listname); + if (loadme && !connected) + player_remove(p1); + return COM_OK; + } + list_sub(p, gl->which, member); + } + pprintf(p, "[%s] %s %s %s list.\n", member, addrem, yourthe, listname); + + if (!personal) { + FILE *fp; + char filename[MAX_FILENAME_SIZE]; + + switch (gl->which) { + case L_MUZZLE: + case L_CMUZZLE: + case L_C1MUZZLE: + case L_C24MUZZLE: + case L_C46MUZZLE: + case L_C49MUZZLE: + case L_C50MUZZLE: + case L_C51MUZZLE: + case L_ABUSER: + case L_BAN: + pprintf(p, "Please leave a comment to explain why %s was %s the %s list.\n", member, addrem, listname); + pcommand(p, "addcomment %s %s %s list.\n", member, addrem, listname); + break; + case L_COMPUTER: + if (player_globals.parray[p1].b_stats.rating > 0) + UpdateRank(TYPE_BLITZ, member, &player_globals.parray[p1].b_stats, member); + if (player_globals.parray[p1].s_stats.rating > 0) + UpdateRank(TYPE_STAND, member, &player_globals.parray[p1].s_stats, member); + if (player_globals.parray[p1].w_stats.rating > 0) + UpdateRank(TYPE_WILD, member, &player_globals.parray[p1].w_stats, member); + break; + case L_ADMIN: + if (addsub == 1) { /* adding to list */ + player_globals.parray[p1].adminLevel = 10; + pprintf(p, "%s has been given an admin level of 10 - change with asetadmin.\n", member); + } else { + player_globals.parray[p1].adminLevel = 0; + } + break; + case L_FILTER: + case L_REMOVEDCOM: + default: + break; + } + + if (loadme && connected) + pprintf_prompt(p1, "You have been %s the %s list by %s.\n", + addrem, listname, pp->name); + + sprintf(filename, "%s/%s", LISTS_DIR, listname); + fp = fopen_s(filename, "w"); + if (fp == NULL) { + d_printf( "Couldn't save %s list.\n", listname); + } else { + int i; + for (i = 0; i < gl->numMembers; i++) + fprintf(fp, "%s\n", gl->m_member[i]); + fclose(fp); + } + } + if (loadme || (gl->which == L_ADMIN)) { + player_save(p1); + } + if (loadme && !connected) { + player_remove(p1); + } + return COM_OK; +} + +int com_addlist(int p, param_list param) +{ + return list_addsub(p, param[0].val.word, param[1].val.word, 1); +} + +int com_sublist(int p,param_list param) +{ + return list_addsub(p, param[0].val.word, param[1].val.word, 2); +} + +/* toggle being in a list */ +int com_togglelist(int p,param_list param) +{ + char *list = param[0].val.word; + char *val = param[1].val.word; + struct List *gl = list_findpartial(p, list, 0); + if (!gl) { + pprintf(p, "'%s' does not match any list name.\n", list); + return COM_FAILED; + } + if (in_list(p, gl->which, val)) { + return com_sublist(p, param); + } + return com_addlist(p, param); +} + +int com_showlist(int p, param_list param) +{ + struct player *pp = &player_globals.parray[p]; + struct List *gl; + int i, rights; + + char *rightnames[] = {"EDIT HEAD, READ ADMINS", "EDIT GODS, READ ADMINS", "READ/WRITE ADMINS", "PUBLIC", "PERSONAL"}; + + if (param[0].type == 0) { /* Show all lists */ + pprintf(p, "Lists:\n\n"); + for (i = 0; ListArray[i].name != NULL; i++) { + rights = ListArray[i].rights; + if ((rights > P_ADMIN) || (pp->adminLevel >= ADMIN_ADMIN)) + pprintf(p, "%-20s is %s\n", ListArray[i].name, rightnames[rights]); + } + } else { /* find match in index */ + gl = list_findpartial(p, param[0].val.word, 0); + if (!gl) { + return COM_OK; + } + rights = ListArray[gl->which].rights; + /* display the list */ + { + multicol *m = multicol_start(gl->numMembers); + + pprintf(p, "-- %s list: %d %s --", ListArray[gl->which].name, + gl->numMembers, + ((!(strcmp(ListArray[gl->which].name,"filter"))) ? "ips" : (!(strcmp(ListArray[gl->which].name,"removedcom"))) ? "commands" : (!(strcmp(ListArray[gl->which].name,"channel"))) ? "channels" : "names")); + for (i = 0; i < gl->numMembers; i++) + multicol_store_sorted(m, gl->m_member[i]); + multicol_pprint(m, p, pp->d_width, 2); + multicol_end(m); + } + } + return COM_OK; +} + +int list_channels(int p,int p1) +{ + struct player *pp = &player_globals.parray[p]; + struct List *gl; + int i, rights; + + gl = list_findpartial(p1, "channel", 0); + if (!gl) { + return 1; + } + rights = ListArray[gl->which].rights; + /* display the list */ + if (gl->numMembers == 0) + return 1; + { + multicol *m = multicol_start(gl->numMembers); + + for (i = 0; i < gl->numMembers; i++) + multicol_store_sorted(m, gl->m_member[i]); + multicol_pprint(m, p, pp->d_width, 1); + multicol_end(m); + } + return 0; +} + +/* free the memory used by a list */ +void list_free(struct List * gl) +{ + int i; + struct List *temp; + + while (gl) { + for (i = 0; i < gl->numMembers; i++) { + FREE(gl->m_member[i]); + } + FREE(gl->m_member); + temp = gl->next; + free(gl); + gl = temp; + } +} + +/* check lists for validity - pure paranoia */ +void lists_validate(int p) +{ + struct player *pp = &player_globals.parray[p]; + struct List *gl; + + for (gl=pp->lists; gl; gl=gl->next) { + if (gl->numMembers && !gl->m_member) { + gl->numMembers = 0; + } + } +} + + +int titled_player(int p,char* name) +{ + if ((in_list(p, L_FM, name)) || + (in_list(p, L_IM, name)) || + (in_list(p, L_GM, name)) || + (in_list(p, L_WGM, name))) { + return 1; + } + return 0; +} + diff --git a/lasker-2.2.3/src/lists.h b/lasker-2.2.3/src/lists.h new file mode 100644 index 0000000..e5491a6 --- /dev/null +++ b/lasker-2.2.3/src/lists.h @@ -0,0 +1,29 @@ + +#ifndef _LISTS_H +#define _LISTS_H + +/* yes, it's all cheesy.. there is no significance to the order, but make + sure it matches the order in lists.c */ + +GENSTRUCT enum ListWhich {L_ADMIN = 0, L_REMOVEDCOM, L_FILTER, L_BAN, L_ABUSER, + L_MUZZLE, L_CMUZZLE, L_C1MUZZLE, L_C24MUZZLE, L_C46MUZZLE, L_C49MUZZLE, + L_C50MUZZLE, L_C51MUZZLE, L_FM, L_IM, L_GM, L_WGM, L_BLIND, L_TEAMS, + L_COMPUTER, L_TD, + L_CENSOR, L_GNOTIFY, L_NOPLAY, L_NOTIFY, L_CHANNEL, L_FOLLOW, + L_REMOTE, + L_LASTLIST /* this MUST be the last list, add all lists before it */ +}; + +GENSTRUCT enum ListPerm {P_HEAD = 0, P_GOD, P_ADMIN, P_PUBLIC, P_PERSONAL}; + +typedef struct {enum ListPerm rights; char *name;} ListTable; + +GENSTRUCT struct List { + enum ListWhich which; + int numMembers; + char **m_member; _LEN(numMembers) + struct List *next; +}; + + +#endif /* _LISTS_H */ diff --git a/lasker-2.2.3/src/makerank.c b/lasker-2.2.3/src/makerank.c new file mode 100644 index 0000000..8a389d6 --- /dev/null +++ b/lasker-2.2.3/src/makerank.c @@ -0,0 +1,235 @@ +/* + 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., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + + +#include "includes.h" + +#define COMPUTER_FILE LISTS_DIR "/computer" + +static char *rnames[] = {"std", "blitz", "wild", "lightning"}; + +typedef struct _ratings { + int rating; + int num; + double rd; + long ltime; +} ratings; + +typedef struct _Entry { + char name[MAX_LOGIN_NAME+2]; + ratings r[4]; + int computer; +} ENTRY; + +static ENTRY **list; +static ENTRY **sortme; + +unsigned chessd_reload_flag; + +static void copy_stats(ratings *r, struct statistics *s) +{ + r->num = s->num; + r->rating = s->rating; + r->rd = s->sterr; + r->ltime = s->ltime; +} + +/* + read a player file using the new generic and extensible format +*/ +static int GetPlayerInfo(char *fileName, ENTRY *e) +{ + char *s, *s2; + struct player player; + unsigned version; + + s = file_load(fileName, NULL); + if (!s) { + d_printf("Error reading player file '%s'\n", fileName); + return 0; + } + + if (sscanf(s, "v %u", &version) != 1 || + (version != 100 && version != 9)) { + free(s); + return 0; + } + + /* skip first line */ + s2 = strchr(s, '\n'); + + ZERO_STRUCT(player); + + if (!s2 || unmarshall_player(&player, s2) != 0) { + d_printf("Error unmarshalling player data in '%s'!\n", fileName); + free(s); + return 0; + } + free(s); + + strcpy(e->name, player.name); + copy_stats(&e->r[0], &player.s_stats); + copy_stats(&e->r[1], &player.b_stats); + copy_stats(&e->r[2], &player.w_stats); + copy_stats(&e->r[3], &player.l_stats); + + player_free(&player); + + return 1; +} + +static int LoadEntries(void) +{ + int listsize; + FILE *fpPlayerList; + char letter1; + char *command; + char pathInput[80]; + ENTRY e; + int len, n = 0; + + listsize = 100; + list = malloc(sizeof(ENTRY *)*listsize); + + for (letter1 = 'a'; letter1 <= 'z'; letter1++) { + printf("Loading %c's.\n", letter1); + sprintf(pathInput, "%s/%c", PLAYER_DIR, letter1); + asprintf(&command, "ls -1 %s", pathInput); + fpPlayerList = popen(command, "r"); + free(command); + + if (fpPlayerList == NULL) + continue; + while (1) { + fgets(e.name, MAX_LOGIN_NAME, fpPlayerList); + if (feof(fpPlayerList)) + break; + len = strlen(e.name); + e.name[len - 1] = '\0'; + if (e.name[0] != letter1) + printf("File %c/%s: wrong directory.\n", letter1, e.name); + else { + sprintf(pathInput, "%s/%c/%s", PLAYER_DIR, letter1, e.name); + if (GetPlayerInfo(pathInput, &e)) { + if ((list[n] = malloc(sizeof(ENTRY))) == NULL) { + d_printf( "malloc() failed!\n"); + } else { + memcpy(list[n], &e, sizeof(ENTRY)); + n++; + if (n == listsize) { + listsize += 100; + list = realloc(list, listsize*sizeof(ENTRY *)); + } + } + } + } + } + pclose(fpPlayerList); + } + return (n); +} + +static int SetComputers(int n) +{ + FILE *fpComp; + int i = 0; + char *line, comp[30]; + + asprintf(&line, "sort -f %s", COMPUTER_FILE); + fpComp = popen(line, "r"); + free(line); + + if (fpComp == NULL) + return 0; + while (i < n) { + fgets(comp, 29, fpComp); + if (feof(fpComp)) + break; + comp[strlen(comp) - 1] = '\0'; + + while (i < n && strcasecmp(list[i]->name, comp) < 0) + i++; + + if (i < n && strcasecmp(list[i]->name, comp) == 0) { + list[i++]->computer = 1; + } + } + pclose(fpComp); + return(1); +} + +static int rtype; + +static int sortfunc(const void *i, const void *j) +{ + int n = (*(ENTRY **)j)->r[rtype].rating - (*(ENTRY **)i)->r[rtype].rating; + return n ? n : strcasecmp((*(ENTRY **)i)->name, (*(ENTRY **)j)->name); +} + +static void makerank(void) +{ + int sortnum, sortmesize, i, n; + FILE *fp; + char *fName; + long now = time(NULL); + + printf("Loading players\n"); + n = LoadEntries(); + printf("Found %d players.\n", n); + printf("Setting computers.\n"); + SetComputers(n); + + for (rtype = 0; rtype < 4; rtype++) { + sortnum = 0; sortmesize = 100; + sortme = malloc(sizeof(ENTRY *)*sortmesize); + + for (i = 0; i < n; i++) { + if (list[i]->r[rtype].rating) { + sortme[sortnum++] = list[i]; + if (sortnum == sortmesize) { + sortmesize += 100; + sortme = realloc(sortme, sortmesize*sizeof(ENTRY *)); + } + } + } + printf("Sorting %d %s.\n", sortnum, rnames[rtype]); + qsort(sortme, sortnum, sizeof(ENTRY *), sortfunc); + printf("Saving to file.\n"); + asprintf(&fName, "%s/rank.%s", STATS_DIR, rnames[rtype]); + fp = fopen_s(fName, "w"); + free(fName); + + for (i = 0; i < sortnum; i++) + fprintf(fp, "%s %d %d %d %f\n", sortme[i]->name, + sortme[i]->r[rtype].rating, sortme[i]->r[rtype].num, + sortme[i]->computer, current_sterr(sortme[i]->r[rtype].rd, + now - sortme[i]->r[rtype].ltime)); + fclose(fp); + free(sortme); + } +} + +int main(int argc, char **argv) +{ + if (argc > 1) { + printf("usage: %s.\n", argv[0]); + exit(0); + } else { + makerank(); + } + return (0); +} + diff --git a/lasker-2.2.3/src/malloc.c b/lasker-2.2.3/src/malloc.c new file mode 100644 index 0000000..e64f4a0 --- /dev/null +++ b/lasker-2.2.3/src/malloc.c @@ -0,0 +1,303 @@ +/* + Copyright (C) Andrew Tridgell 2002 + + 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., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +/* + a malloc wrapper library for the dynamically loaded part of + chessd. This is used both as a malloc checker library and to prevent + some bad interactions between the dl library and malloc +*/ + + +#include "includes.h" +#undef free +#undef malloc + +#define MAGIC1 0x28021967 +#define MAGIC2 0x26011966 + +struct malloc_list { + void *ptr; + struct malloc_list *next; + struct malloc_list *prev; +}; + +static struct malloc_list *mlist; +static int m_total; + +struct malloc_header { + struct malloc_list *m; + unsigned size; + unsigned magic; +}; + +/* + a magic-value protected malloc wrapper, + which can be globally freed using a single call +*/ +void *m_malloc(size_t size) +{ + void *ptr; + struct malloc_list *m; + struct malloc_header *h; + + if (size == 0) return NULL; + + ptr = malloc(size+sizeof(struct malloc_header)); + + if (!ptr) return NULL; + + m = malloc(sizeof(*m)); + +#if MALLOC_DEBUG + fprintf(stderr,"malloc %p %u\n", ptr, size); + fprintf(stderr,"malloc %p\n", m); +#endif + + if (!m) { + free(ptr); + return NULL; + } + + m->ptr = ptr; + m->next = mlist; + m->prev = NULL; + if (mlist) { + mlist->prev = m; + } + mlist = m; + + m_total++; + + memset(ptr, 0, size+sizeof(struct malloc_header)); + + h = ptr; + h->size = size; + h->magic = MAGIC1; + h->m = m; + + return (void *)(h+1); +} + +/* + determine the size of a malloced region +*/ +static size_t m_malloc_size(void *ptr) +{ + struct malloc_header *h; + if (!ptr) return 0; + + h = (struct malloc_header *)ptr; + h--; + + return h->size; +} + +/* + check that a pointer is OK +*/ +void m_malloc_check(void *ptr) +{ + struct malloc_header *h; + + if (!ptr) return; + + h = (struct malloc_header *)ptr; + h--; + + if (h->magic != MAGIC1) { + d_printf("malloc corruption ptr=%p v1=%x size=%d\n", + ptr, h->magic, h->size); + } +} + +/* + a paranoid free() function that checks for simple corruption +*/ +int m_free(void *ptr) +{ + struct malloc_header *h; + struct malloc_list *m; + + if (!ptr) return 0; + + h = (struct malloc_header *)ptr; + h--; + + if (h->magic != MAGIC1) { + d_printf("malloc corruption ptr=%p v1=%x size=%d\n", + ptr, h->magic, h->size); + return -1; + } + + m = h->m; + if (!m || m->ptr != h) { + d_printf("malloc list corruption!\n"); + } + if (m->next) { + m->next->prev = m->prev; + } + if (m->prev) { + m->prev->next = m->next; + } + if (m == mlist) { + mlist = m->next; + } + + m_total--; + +#if MALLOC_DEBUG + fprintf(stderr,"free %p %u\n", h, h->size); + fprintf(stderr,"free %p\n", m); +#endif + + memset(ptr, 'Z', h->size); /* paranoia */ + memset(m, 0, sizeof(*m)); + free(m); + memset(h, 0, sizeof(*h)); + free(h); + return 0; +} + +/* + check all allocated memory +*/ +void m_check_all(void) +{ + struct malloc_list *m; + for (m=mlist; m; m=m->next) { + m_malloc_check(m->ptr + sizeof(struct malloc_header)); + } +} + + +/* + free all allocated memory +*/ +void m_free_all(void) +{ + struct malloc_list *m, *next; + d_printf("Freeing %d chunks\n", m_total); + for (m=mlist; m; m=next) { + next = m->next; + m_total--; + +#if MALLOC_DEBUG + fprintf(stderr,"free %p\n", m->ptr); + fprintf(stderr,"free %p\n", m); +#endif + free(m->ptr); + free(m); + } + mlist = NULL; +} + +/* a calloc wrapper */ +void *m_calloc(size_t n, size_t size) +{ + void *ptr; + ptr = m_malloc(n*size); + if (ptr) memset(ptr, 0, n*size); + return ptr; +} + +/* strdup wrapper */ +char *m_strdup(const char *s) +{ + int len = strlen(s); + char *ret; + ret = m_malloc(len+1); + memcpy(ret, s, len+1); + return ret; +} + +/* strndup wrapper */ +char *m_strndup(const char *s, size_t n) +{ + int len = strnlen(s, n); + char *ret; + ret = m_malloc(len+1); + memcpy(ret, s, len); + ret[len] = 0; + return ret; +} + +/* a free() call that zeros the pointer to prevent re-use */ +void m_safe_free(void **ptr, const char *file, unsigned line) +{ + if (!*ptr) { + d_printf("NULL free at %s(%u)!\n", file, line); + return; + } + if (m_free(*ptr) != 0) { + d_printf("bad free at %s(%u)!\n", file, line); + } + (*ptr) = NULL; +} + + +/* a vasprintf wrapper */ +int m_vasprintf(char **strp, const char *fmt, va_list ap) +{ + int n; + + (*strp) = NULL; + + n = vsnprintf(NULL, 0, fmt, ap); + if (n == 0) return 0; + + (*strp) = m_malloc(n+1); + n = vsnprintf(*strp, n+1, fmt, ap); + + return n; +} + +/* a asprintf wrapper */ +int m_asprintf(char **strp, const char *fmt, ...) +{ + int n; + va_list ap; + + va_start(ap, fmt); + n = m_vasprintf(strp, fmt, ap); + va_end(ap); + + return n; +} + +/* a realloc wrapper */ +void *m_realloc(void *ptr, size_t size) +{ + void *ret; + size_t msize; + + if (!ptr) { + return m_malloc(size); + } + + if (size == 0) { + m_safe_free(&ptr, __FILE__, __LINE__); + return NULL; + } + + ret = m_malloc(size); + + msize = m_malloc_size(ptr); + memcpy(ret, ptr, size + (player_globals.parray[*bp].num_white - player_globals.parray[*bp].num_black)) + reverse = 1; /* whose played the most extra whites gets black */ + + } else if (!CheckPFlag(*wp, PFLAG_LASTBLACK)) + reverse = 1; + + } else + reverse = 1; + } + if (reverse) { + int tmp = *wp; + *wp = *bp; + *bp = tmp; + } +} + +static void output_match_messages(int wp,int bp,int g, char* mess) +{ + + int printed; + int avail_printed = 0; + char notavail_white[200]; + char notavail_black[200]; + int p; + char *outStr; + + notavail_white[0] = '\0'; + notavail_black[0] = '\0'; + + asprintf(&outStr,"\nCreating: %s (%d) %s (%d) %s %s %d %d\n", + player_globals.parray[wp].name, + game_globals.garray[g].white_rating, + player_globals.parray[bp].name, + game_globals.garray[g].black_rating, + rstr[game_globals.garray[g].rated], + bstr[game_globals.garray[g].type], + game_globals.garray[g].wInitTime, + game_globals.garray[g].wIncrement); + pprintf(wp, "%s", outStr); + pprintf(bp, "%s", outStr); + free(outStr); + + asprintf(&outStr, "\n{Game %d (%s vs. %s) %s %s %s match.}\n", + g + 1, player_globals.parray[wp].name, + player_globals.parray[bp].name, + mess, + rstr[game_globals.garray[g].rated], + bstr[game_globals.garray[g].type]); + pprintf(wp, "%s", outStr); + pprintf(bp, "%s", outStr); + + if (!(player_num_active_boards(wp)) && CheckPFlag(wp, PFLAG_OPEN)) +/* open may be 0 if a simul */ + getnotavailmess(wp,notavail_white); + if (CheckPFlag(bp, PFLAG_OPEN)) + getnotavailmess(bp,notavail_black); + for (p = 0; p < player_globals.p_num; p++) { + struct player *pp = &player_globals.parray[p]; + int gnw, gnb; + printed = 0; + + if ((p == wp) || (p == bp)) + continue; + if (pp->status != PLAYER_PROMPT) + continue; + if (CheckPFlag(p, PFLAG_GIN)) { + pprintf(p, "%s", outStr); + printed = 1; + } + gnw = in_list(p, L_GNOTIFY, player_globals.parray[wp].login); + gnb = in_list(p, L_GNOTIFY, player_globals.parray[bp].login); + if (gnw || gnb) { + pprintf(p, "\nGame notification: "); + + if (gnw) + pprintf_highlight(p, player_globals.parray[wp].name); + else + pprintf(p, player_globals.parray[wp].name); + + pprintf(p, " (%s) vs. ", + ratstr(GetRating(&player_globals.parray[wp], game_globals.garray[g].type))); + + if (gnb) + pprintf_highlight(p, player_globals.parray[bp].name); + else + pprintf(p, player_globals.parray[bp].name); + pprintf(p, " (%s) %s %s %d %d: Game %d\n", + ratstr(GetRating(&player_globals.parray[bp], game_globals.garray[g].type)), + rstr[game_globals.garray[g].rated], bstr[game_globals.garray[g].type], + game_globals.garray[g].wInitTime/600, game_globals.garray[g].wIncrement/10, g+1); + + printed = 1; + } + + if (CheckPFlag(p, PFLAG_AVAIL) && CheckPFlag(p, PFLAG_OPEN) && (pp->game < 0) && + (CheckPFlag(wp, PFLAG_OPEN) || CheckPFlag(bp, PFLAG_OPEN))) { + + if (((player_globals.parray[wp].b_stats.rating <= pp->availmax) && + (player_globals.parray[wp].b_stats.rating >= pp->availmin)) || + (!pp->availmax)) { + pprintf (p,"\n%s",notavail_white); + avail_printed = 1; + } + + if (((player_globals.parray[bp].b_stats.rating <= pp->availmax) && + (player_globals.parray[bp].b_stats.rating >= pp->availmin)) || + (!pp->availmax)) { + pprintf (p,"\n%s",notavail_black); + avail_printed = 1; + } + + if (avail_printed) { + printed = 1; + avail_printed = 0; + pprintf (p,"\n"); + } /* was black or white open originally (for simuls) */ + } + + if (printed) + send_prompt (p); + } + + free(outStr); +} + +int create_new_match(int g, int white_player, int black_player, + int wt, int winc, int bt, int binc, + int rated, char *category, char *board, + int white, int simul) +{ + + remove_request(white_player, black_player, -PEND_PARTNER); + + pick_colors(&white_player,&black_player,white,wt,bt,winc,binc); + + decline_withdraw_offers(white_player,-1, PEND_MATCH,DO_WITHDRAW | DO_DECLINE); + decline_withdraw_offers(black_player,-1, PEND_MATCH,DO_WITHDRAW | DO_DECLINE); + decline_withdraw_offers(black_player,-1, PEND_SIMUL,DO_WITHDRAW | DO_DECLINE); + if (simul) { + decline_withdraw_offers(white_player, -1, PEND_SIMUL, DO_WITHDRAW); + } else { + decline_withdraw_offers(white_player, -1, PEND_SIMUL, + DO_WITHDRAW | DO_DECLINE); + } + if (board_init(g,&game_globals.garray[g].game_state, category, board)) { + pprintf(white_player, "PROBLEM LOADING BOARD. Game Aborted.\n"); + pprintf(black_player, "PROBLEM LOADING BOARD. Game Aborted.\n"); + d_printf( "CHESSD: PROBLEM LOADING BOARD %s %s. Game Aborted.\n", + category, board); + game_remove(g); + return COM_FAILED; + } + + if (simul) + game_globals.garray[g].type = TYPE_UNTIMED; + else + game_globals.garray[g].type = game_isblitz(wt, winc, bt, binc, category, board); + + prepare_match(g,wt,bt,winc,binc,white_player,black_player,rated); + + output_match_messages(white_player,black_player,g, "Creating"); + + player_globals.parray[white_player].game = g; + player_globals.parray[white_player].opponent = black_player; + player_globals.parray[white_player].side = WHITE; + player_globals.parray[white_player].promote = QUEEN; + player_globals.parray[black_player].game = g; + player_globals.parray[black_player].opponent = white_player; + player_globals.parray[black_player].side = BLACK; + player_globals.parray[black_player].promote = QUEEN; + send_boards(g); + gics_globals.userstat.games++; + + /* obey any 'follow' lists */ + follow_start(white_player,black_player); + + return COM_OK; +} + +int accept_match(struct pending *pend, int p, int p1) +{ + struct player *pp = &player_globals.parray[p]; + int wt, winc, bt, binc, rated, white; + char category[50], board[50]; + char tmp[100]; + int bh = 0, partner = 0, pp1 = 0, g1, g2; + + unobserveAll(p); /* stop observing when match starts */ + unobserveAll(p1); + + wt = pend->wtime; + winc = pend->winc; + bt = pend->btime; + binc = pend->binc; + rated = pend->rated; + strcpy (category, pend->category); + strcpy (board, pend->board_type); + white = (pend->seek_color == -1) ? -1 : 1 - pend->seek_color; + + pprintf(p, "You accept the challenge of %s.\n", player_globals.parray[p1].name); + pprintf_prompt(p1, "\n%s accepts your challenge.\n", pp->name); + + if(!pend->status) + delete_pending(pend); + + withdraw_seeks(p); + withdraw_seeks(p1); + + pend_join_match (p,p1); + + if (game_isblitz(wt, winc, bt, binc, category, board) == TYPE_BUGHOUSE) { + bh = 1; + + if ((partner = pp->partner) >= 0 && + (pp1 = player_globals.parray[p1].partner) >= 0) { + unobserveAll(partner); /* stop observing when match starts */ + unobserveAll(pp1); + + pprintf(partner, "\nYour partner accepts the challenge of %s.\n", player_globals.parray[p1].name); + pprintf(pp1, "\n%s accepts your partner's challenge.\n", pp->name); + + pend_join_match (partner,pp1); + } else { + return COM_OK; + } + } + + g1 = game_new(); /* create a game structure */ + if (g1 < 0) { + sprintf(tmp, "There was a problem creating the new match.\n"); + pprintf(p, tmp); + pprintf_prompt(p1, tmp); + } + + if (game_read(g1, p1, p) >= 0) { + int swap; + swap = p; + p = p1; + p1 = swap; + pp = &player_globals.parray[p]; + } else if (game_read(g1, p, p1) < 0) { /* so no adjourned game */ + if (create_new_match(g1,p, p1, wt, winc, bt, binc, rated, category, board, white,0) == COM_FAILED) + return COM_OK; + + /* create first game */ + + if (bh) { /* do bughouse creation */ + + white = (pp->side == WHITE ? 0 : 1); + g2 = game_new(); + if ((g2 < 0) || (create_new_match(g2,partner, pp1, wt, winc, bt, binc, rated, category, board,white,0) == COM_FAILED)) { + sprintf(tmp, "There was a problem creating the new match.\n"); + pprintf_prompt(partner, tmp); + pprintf_prompt(pp1, tmp); + sprintf(tmp, "There was a problem creating your partner's match.\n"); + game_remove(g1); /* abort first game */ + return COM_OK; + } + + game_globals.garray[g1].link = g2; /* link the games */ + game_globals.garray[g2].link = g1; + + sprintf(tmp, "\nYour partner is playing game %d (%s vs. %s).\n", + g2 + 1, game_globals.garray[g2].white_name, game_globals.garray[g2].black_name); + pprintf(p, tmp); + pprintf_prompt(p1, tmp); + + sprintf(tmp, "\nYour partner is playing game %d (%s vs. %s).\n", + g1 + 1, game_globals.garray[g1].white_name, game_globals.garray[g1].black_name); + pprintf_prompt(partner, tmp); + pprintf_prompt(pp1, tmp); + } + return COM_OK; + } + + /* resume adjourned game */ + + game_delete(p, p1); /* remove the game from disk */ + + sprintf(tmp, "{Game %d (%s vs. %s) Continuing %s %s match.}\n", + g1+1, pp->name, player_globals.parray[p1].name, + rstr[game_globals.garray[g1].rated], bstr[game_globals.garray[g1].type]); + pprintf(p, tmp); + pprintf(p1, tmp); + output_match_messages(p, p1, g1, "Continuing"); + + game_globals.garray[g1].white = p; + game_globals.garray[g1].black = p1; + game_globals.garray[g1].status = GAME_ACTIVE; + game_globals.garray[g1].result = END_NOTENDED; + game_globals.garray[g1].startTime = tenth_secs(); + game_globals.garray[g1].lastMoveTime = game_globals.garray[g1].startTime; + game_globals.garray[g1].lastDecTime = game_globals.garray[g1].startTime; + pp->game = g1; + pp->opponent = p1; + pp->side = WHITE; + player_globals.parray[p1].game = g1; + player_globals.parray[p1].opponent = p; + player_globals.parray[p1].side = BLACK; + + send_boards(g1); + + /* obey any 'follow' lists */ + follow_start(p,p1); + + return COM_OK; +} + +/* board and category are initially empty strings */ +static int parse_match_string(int p, int* wt,int* bt,int* winc,int* binc, + int* white,int* rated,char* category, + char* board, char* mstring) +{ + int numba; + int confused = 0; + char parsebuf[100]; + int bughouse = 0; + + while (!confused && (sscanf(mstring, " %99s", parsebuf) == 1)) { + mstring = eatword(eatwhite(mstring)); + + if ((category[0] != '\0') && (board[0] == '\0') && !bughouse) + strcpy(board, parsebuf); + else if (isdigit(*parsebuf)) { + if ((numba = atoi(parsebuf)) < 0) { + pprintf(p, "You can't specify negative time controls.\n"); + return 0; + } else if (numba > 999) { + pprintf(p, "You can't specify time or inc above 999.\n"); + return 0; + } else if (*wt == -1) { + *wt = numba; + } else if (*winc == -1) { + *winc = numba; + } else if (*bt == -1) { + *bt = numba; + } else if (*binc == -1) { + *binc = numba; + } else + confused = 1; + + } else if ((!strcmp("rated", parsebuf)) || (!strcmp("r",parsebuf))) { + if (*rated == -1) + *rated = 1; + else + confused = 1; + } else if ((!strcmp("unrated", parsebuf)) || (!strcmp("u",parsebuf))) { + if (*rated == -1) + *rated = 0; + else + confused = 1; + } else if (!strcmp("white", parsebuf) || !strcmp ("w", parsebuf)) { + if (*white == -1) + *white = 1; + else + confused = 1; + } else if (!strcmp("black", parsebuf) || !strcmp ("b", parsebuf)) { + if (*white == -1) + *white = 0; + else + confused = 1; + + } else if (category[0] == '\0') { + if ((parsebuf[0] == 'w') && (isdigit(*(parsebuf + 1)))) { + strcpy (category, "wild"); + strcpy (board, parsebuf+1); + } else { + strcpy(category,parsebuf); + if (!strncmp("bughouse",category, strlen(category)) + && strlen(category) >= 3) { + strcpy(category, "bughouse"); + bughouse = 1; + } + } + } else + confused = 1; + } + + if (confused) { + pprintf(p, "Can't interpret %s in match command.\n", parsebuf); + return 0; + } + return 1; +} + +static void print_match_rating_info(int p,int p1,int type,int rated) +{ + if (rated) { + int win, draw, loss; + double newsterr; + + rating_sterr_delta(p1, p, type, time(0), RESULT_WIN, &win, &newsterr); + rating_sterr_delta(p1, p, type, time(0), RESULT_DRAW, &draw, &newsterr); + rating_sterr_delta(p1, p, type, time(0), RESULT_LOSS, &loss, &newsterr); + pprintf(p1, "Your %s rating will change: Win: %s%d, Draw: %s%d, Loss: %s%d\n", + bstr[type], + (win >= 0) ? "+" : "", win, + (draw >= 0) ? "+" : "", draw, + (loss >= 0) ? "+" : "", loss); + pprintf(p1, "Your new RD will be %5.1f\n", newsterr); + + rating_sterr_delta(p, p1, type, time(0), RESULT_WIN, &win, &newsterr); + rating_sterr_delta(p, p1, type, time(0), RESULT_DRAW, &draw, &newsterr); + rating_sterr_delta(p, p1, type, time(0), RESULT_LOSS, &loss, &newsterr); + pprintf(p, "Your %s rating will change: Win: %s%d, Draw: %s%d, Loss: %s%d\n", + bstr[type], + (win >= 0) ? "+" : "", win, + (draw >= 0) ? "+" : "", draw, + (loss >= 0) ? "+" : "", loss); + pprintf(p, "Your new RD will be %5.1f\n", newsterr); + } +} + +static void check_lists_match(int p,int p1) +{ + struct player *pp = &player_globals.parray[p]; + if (in_list(p, L_COMPUTER, pp->name)) { + pprintf(p1, "--** %s is a ", pp->name); + pprintf_highlight(p1, "computer"); + pprintf(p1, " **--\n"); + } + if (in_list(p, L_COMPUTER, player_globals.parray[p1].name)) { + pprintf(p, "--** %s is a ", player_globals.parray[p1].name); + pprintf_highlight(p, "computer"); + pprintf(p, " **--\n"); + } + if (in_list(p, L_ABUSER, pp->name)) { + pprintf(p1, "--** %s is in the ", pp->name); + pprintf_highlight(p1, "abuser"); + pprintf(p1, " list **--\n"); + } + if (in_list(p, L_ABUSER, player_globals.parray[p1].name)) { + pprintf(p, "--** %s is in the ", player_globals.parray[p1].name); + pprintf_highlight(p, "abuser"); + pprintf(p, " list **--\n"); + } +} + +int com_match(int p, param_list param) +{ + struct player *pp = &player_globals.parray[p]; + int adjourned; /* adjourned game? */ + int g; /* more adjourned game junk */ + int p1; + int bh = 0, partner = 0, pp1 = 0; + struct pending* pendfrom; + struct pending* pendto; + struct pending* pend; + int wt = -1; /* white start time */ + int winc = -1; /* white increment */ + int bt = -1; /* black start time */ + int binc = -1; /* black increment */ + int rated = -1; /* 1 = rated, 0 = unrated */ + int white = -1; /* 1 = want white, 0 = want black */ + char category[100], board[100]; + textlist *clauses = NULL; + int type = 0; + + category[0] ='\0'; + board[0] ='\0'; + + if ((pp->game >= 0) && ((game_globals.garray[pp->game].status == GAME_EXAMINE) +|| (game_globals.garray[pp->game].status == GAME_SETUP))) { + + pprintf(p, "You can't challenge while you are examining a game.\n"); + return COM_OK; + } + + if (pp->game >= 0) { + pprintf(p, "You can't challenge while you are playing a game.\n"); + return COM_OK; + } + + stolower(param[0].val.word); + p1 = player_find_part_login(param[0].val.word); + if (p1 < 0) { + pprintf(p, "No user named \"%s\" is logged in.\n", param[0].val.word); + return COM_OK; + } + + if (p1 == p) { /* Allowing to match yourself to enter + analysis mode */ + ExamineScratch (p, param, 0); + return COM_OK; + } + + if (!CheckPFlag(p1, PFLAG_OPEN)) { + pprintf(p, "Player \"%s\" is not open to match requests.\n", player_globals.parray[p1].name); + return COM_OK; + } + + if (player_globals.parray[p1].game >= 0) { + pprintf(p, "Player \"%s\" is involved in another game.\n", player_globals.parray[p1].name); return COM_OK; + } + + if (CheckPFlag(p, PFLAG_TOURNEY) && !CheckPFlag(p1, PFLAG_TOURNEY)) { + pprintf(p, "You may only match players with their tournament variable set.\n"); + return COM_OK; + } + + if (!CheckPFlag(p, PFLAG_TOURNEY) && CheckPFlag(p1, PFLAG_TOURNEY)) { + pprintf(p, "%s is in a tournament, and cannot accept other challenges.\n", player_globals.parray[p1].name); + return COM_OK; + } + + if (!CheckPFlag(p, PFLAG_OPEN)) { + PFlagON(p, PFLAG_OPEN); + pprintf(p, "Setting you open for matches.\n"); + } + + +/* look for an adjourned game between p and p1 */ + g = game_new(); + adjourned = (game_read(g, p, p1) >= 0) || (game_read(g, p1, p) >= 0); + if (adjourned) { + type = game_globals.garray[g].type; + wt = game_globals.garray[g].wInitTime / 600; + bt = game_globals.garray[g].bInitTime / 600; + winc = game_globals.garray[g].wIncrement / 10; + binc = game_globals.garray[g].bIncrement / 10; + rated = game_globals.garray[g].rated; + } + game_remove(g); + + pendto = find_pend(p, p1, PEND_MATCH); + + pendfrom = find_pend(p1, p, PEND_MATCH); + + if (!adjourned) { + if (in_list(p1, L_NOPLAY, pp->login)) { + pprintf(p, "You are on %s's noplay list.\n", player_globals.parray[p1].name); + return COM_OK; + } + if (player_censored(p1, p)) { + pprintf(p, "Player \"%s\" is censoring you.\n", player_globals.parray[p1].name); + return COM_OK; + } + if (player_censored(p, p1)) { + pprintf(p, "You are censoring \"%s\".\n", player_globals.parray[p1].name); + return COM_OK; + } + + if (param[1].type != TYPE_NULL) { + if (!parse_match_string(p, &wt,&bt,&winc,&binc,&white,&rated,category, + board,param[1].val.string)) + return COM_OK; /* couldn't parse */ + } + + if (rated == -1) + rated = BoolCheckPFlag(p, PFLAG_RATED); + if (!CheckPFlag(p, PFLAG_REG) || !CheckPFlag(p1, PFLAG_REG)) + rated = 0; + + if (winc == -1) + winc = (wt == -1) ? pp->d_inc : 0; /* match 5 == match 5 0 */ + + if (wt == -1) + wt = pp->d_time; + + if (bt == -1) + bt = wt; + + if (binc == -1) + binc = winc; + + if (category[0]) { + if (!board[0] && strcmp(category,"bughouse")) { + pprintf(p, "You must specify a board and a category.\n"); + return COM_OK; + + } else if (board[0]) { /* not bughouse */ + char fname[MAX_FILENAME_SIZE]; + + sprintf(fname, "%s/%s/%s", BOARD_DIR, category, board); + if (!file_exists(fname)) { + pprintf(p, "No such category/board: %s/%s\n", category, board); + return COM_OK; + } + } + } + type = game_isblitz(wt, winc, bt, binc, category, board); + + if (!strcmp(category, "bughouse")) { + type = TYPE_BUGHOUSE; + if (rated && pp->partner >= 0 && player_globals.parray[p1].partner >= 0) { + if (!CheckPFlag(pp->partner, PFLAG_REG) + || !CheckPFlag(player_globals.parray[p1].partner, PFLAG_REG)) + rated = 0; + } + } + if (rated && (type == TYPE_NONSTANDARD)) { + pprintf(p, "Game is non-standard - reverting to unrated\n"); + rated = 0; + } + if (rated && (type == TYPE_UNTIMED)) { + pprintf(p, "Game is untimed - reverting to unrated\n"); + rated = 0; + } + if ((pendfrom == NULL) && !CheckPFlag(p1, PFLAG_ROPEN) + && (rated != BoolCheckPFlag(p1, PFLAG_RATED))) { + pprintf(p, "%s only wants to play %s games.\n", player_globals.parray[p1].name, + rstr[!rated]); + pprintf_highlight(p1, "Ignoring"); + pprintf(p1, " %srated match request from %s.\n", + (rated ? "" : "un"), pp->name); + return COM_OK; + } + + /* Now check formula. */ + if (!adjourned + && !GameMatchesFormula(p,p1, wt,winc,bt,binc, rated, type, &clauses)) { + pprintf(p, "Match request does not fit formula for %s:\n", + player_globals.parray[p1].name); + pprintf(p, "%s's formula: %s\n", player_globals.parray[p1].name, player_globals.parray[p1].formula); + ShowClauses (p, p1, clauses); + ClearTextList(clauses); + pprintf_highlight(p1, "Ignoring"); + pprintf_prompt(p1, " (formula): %s (%d) %s (%d) %s.\n", + pp->name, + GetRating(&player_globals.parray[p], type), + player_globals.parray[p1].name, + GetRating(&player_globals.parray[p1], type), + game_str(rated, wt * 60, winc, bt * 60, binc, category, board)); + return COM_OK; + } + + if (type == TYPE_BUGHOUSE) { + bh = 1; + partner = pp->partner; + pp1 = player_globals.parray[p1].partner; + + if (pp < 0) { + pprintf(p, "You have no partner for bughouse.\n"); + return COM_OK; + } + if (pp1 < 0) { + pprintf(p, "Your opponent has no partner for bughouse.\n"); + return COM_OK; + } + if (partner == pp1) { /* should be an impossible case - DAV */ + pprintf(p, "You and your opponent both chose the same partner!\n"); + return COM_OK; + } + if (partner == p1 || pp1 == p) { + pprintf(p, "You and your opponent can't choose each other as partners!\n"); + return COM_OK; + } + if (player_globals.parray[partner].partner != p) { /* another impossible case - DAV */ + pprintf(p, "Your partner hasn't chosen you as his partner!\n"); + return COM_OK; + } + if (player_globals.parray[pp1].partner != p1) { /* another impossible case - DAV */ + pprintf(p, "Your opponent's partner hasn't chosen your opponent as his partner!\n"); + return COM_OK; + } + if (!CheckPFlag(partner, PFLAG_OPEN) || player_globals.parray[partner].game >= 0) { + pprintf(p, "Your partner isn't open to play right now.\n"); + return COM_OK; + } + if (!CheckPFlag(pp1, PFLAG_OPEN) || player_globals.parray[pp1].game >= 0) { + pprintf(p, "Your opponent's partner isn't open to play right now.\n"); + return COM_OK; + } + + /* Bypass NOPLAY lists, censored lists, ratedness, privacy, and formula for now */ + /* Active challenger/ee will determine these. */ + } + /* Ok match offer will be made */ + + } /* adjourned games shouldn't have to worry + about that junk? */ + /* keep incase of adjourned bughouse in future*/ + + if (pendto != NULL) { + pprintf(p, "Updating offer already made to \"%s\".\n", player_globals.parray[p1].name); + } + + if (pendfrom != NULL) { + if (pendto != NULL) { + pprintf(p, "Pending list error!.\n"); + d_printf( "CHESSD: This shouldn't happen. You can't have a match pending from and to the same person.\n"); + return COM_OK; + } + + if (adjourned || ((wt == pendfrom->btime) && + (winc == pendfrom->binc) && + (bt == pendfrom->wtime) && + (binc == pendfrom->winc) && + (rated == pendfrom->rated) && + ((white == -1) || (white + pendfrom->seek_color == 1)) && + (!strcmp(category, pendfrom->category)) && + (!strcmp(board, pendfrom->board_type)))) { + /* Identical match, should accept! */ + accept_match(pendfrom,p, p1); + return COM_OK; + + } else { + delete_pending(pendfrom); + } + } + + if (pendto == NULL) + pend = add_pending(p,p1,PEND_MATCH); + else + pend = pendto; + + pend->wtime = wt; + pend->winc = winc; + pend->btime = bt; + pend->binc = binc; + pend->rated = rated; + pend->seek_color = white; + pend->game_type = type; + pend->category = strdup(category); + pend->board_type = strdup (board); + + if (pendfrom != NULL) { + pprintf(p, "Declining offer from %s and offering new match parameters.\n", player_globals.parray[p1].name); + pprintf(p1, "\n%s declines your match offer a match with these parameters:", pp->name); + } + + if (pendto != NULL) { + pprintf(p, "Updating match request to: "); + pprintf(p1, "\n%s updates the match request.\n", pp->name); + } else { + pprintf(p, "Issuing: "); + pprintf(p1, "\n"); + } + + pprintf(p, "%s (%s) %s", pp->name, + ratstrii(GetRating(&player_globals.parray[p], type), p), + colorstr[white + 1]); + pprintf_highlight(p, "%s", player_globals.parray[p1].name); + pprintf(p, " (%s) %s%s.\n", + ratstrii(GetRating(&player_globals.parray[p1], type), p1), + game_str(rated, wt * 60, winc, bt * 60, binc, category, board), + adjustr[adjourned]); + pprintf(p1, "Challenge: "); + pprintf_highlight(p1, "%s", pp->name); + pprintf(p1, " (%s) %s", + ratstrii(GetRating(&player_globals.parray[p], type), p), + colorstr[white + 1]); + pprintf(p1, "%s (%s) %s%s.\n", player_globals.parray[p1].name, + ratstrii(GetRating(&player_globals.parray[p1], type), p1), + game_str(rated, wt * 60, winc, bt * 60, binc, category, board), + adjustr[adjourned]); + Bell (p1); + + if (bh) { + + pprintf(partner, "\nYour bughouse partner issuing %s (%s) %s", + pp->name, ratstrii(GetRating(&player_globals.parray[p], type), p), + colorstr[white + 1]); + pprintf_highlight(partner, "%s", player_globals.parray[p1].name); + pprintf(partner, " (%s) %s.\n", + ratstrii(GetRating(&player_globals.parray[p1], type), p1), + game_str(rated, wt * 60, winc, bt * 60, binc, category, board)); + pprintf(partner, "Your game would be "); + pprintf_highlight(partner, "%s", player_globals.parray[pp1].name); + pprintf_prompt(partner, " (%s) %s%s (%s) %s.\n", + ratstrii(GetRating(&player_globals.parray[pp1], type), pp1), + colorstr[white + 1], player_globals.parray[partner].name, + ratstrii(GetRating(&player_globals.parray[partner], type), partner), + game_str(rated, wt * 60, winc, bt * 60, binc, category, board)); + Bell (partner); + + pprintf(pp1, "\nYour bughouse partner was challenged "); + pprintf_highlight(pp1, "%s", pp->name); + pprintf(pp1, " (%s) %s", ratstrii(GetRating(&player_globals.parray[p], type), p), + colorstr[white + 1]); + pprintf(pp1, "%s (%s) %s.\n", player_globals.parray[p1].name, + ratstrii(GetRating(&player_globals.parray[p1], type), p1), + game_str(rated, wt * 60, winc, bt * 60, binc, category, board)); + pprintf(pp1, "Your game would be %s (%s) %s", player_globals.parray[pp1].name, + ratstrii(GetRating(&player_globals.parray[pp1], type), pp1), + colorstr[white + 1]); + pprintf_highlight(pp1, "%s", player_globals.parray[partner].name); + pprintf_prompt(pp1, " (%s) %s.\n", + ratstrii(GetRating(&player_globals.parray[partner], type), partner), + game_str(rated, wt * 60, winc, bt * 60, binc, category, board)); + Bell(pp1); + } + + check_lists_match (p,p1); + + print_match_rating_info (p,p1,type,rated); + + pprintf_prompt(p1, "You can \"accept\" or \"decline\", or propose different parameters.\n"); + + return COM_OK; +} + + +/* + rmatch is used by mamer to start matches in tournaments +*/ +int com_rmatch(int p, param_list param) +{ + struct player *pp = &player_globals.parray[p]; + int p1, p2; + + if (!in_list(p, L_TD, pp->name)) { + pprintf(p, "Only TD programs are allowed to use this command.\n"); + return COM_OK; + } + + if ((p1 = player_find_bylogin(param[0].val.word)) < 0 || + !CheckPFlag(p1, PFLAG_REG)) { + /* can't rmatch this user ... */ + return COM_OK; + } + + if ((p2 = player_find_bylogin(param[1].val.word)) < 0 || + !CheckPFlag(p2, PFLAG_REG)) { + /* can't rmatch this user ... */ + return COM_OK; + } + + return pcommand(p1, "match %s %s", param[1].val.word, param[2].val.string); +} diff --git a/lasker-2.2.3/src/matchproc.h b/lasker-2.2.3/src/matchproc.h new file mode 100644 index 0000000..d22ed6d --- /dev/null +++ b/lasker-2.2.3/src/matchproc.h @@ -0,0 +1,27 @@ +/* + Copyright (c) 1993 Richard V. Nash. + Copyright (c) 2000 Dan Papasian + Copyright (C) Andrew Tridgell 2002 + + 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., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#ifndef _MATCHPROC_H +#define _MATCHPROC_H + +extern const char *colorstr[]; +extern const char *adjustr[]; + +#endif /* _MATCHPROC_H */ diff --git a/lasker-2.2.3/src/md5.h b/lasker-2.2.3/src/md5.h new file mode 100644 index 0000000..46d81a0 --- /dev/null +++ b/lasker-2.2.3/src/md5.h @@ -0,0 +1,36 @@ +/* MD5.H - header file for MD5C.C + * $FreeBSD: src/sys/sys/md5.h,v 1.13 1999/12/29 04:24:44 peter Exp $ + */ + +/* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All +rights reserved. + +License to copy and use this software is granted provided that it +is identified as the "RSA Data Security, Inc. MD5 Message-Digest +Algorithm" in all material mentioning or referencing this software +or this function. + +License is also granted to make and use derivative works provided +that such works are identified as "derived from the RSA Data +Security, Inc. MD5 Message-Digest Algorithm" in all material +mentioning or referencing the derived work. + +RSA Data Security, Inc. makes no representations concerning either +the merchantability of this software or the suitability of this +software for any particular purpose. It is provided "as is" +without express or implied warranty of any kind. + +These notices must be retained in any copies of any part of this +documentation and/or software. + */ + +#ifndef _SYS_MD5_H_ +#define _SYS_MD5_H_ +/* MD5 context. */ +typedef struct MD5Context { + u_int32_t state[4]; /* state (ABCD) */ + u_int32_t count[2]; /* number of bits, modulo 2^64 (lsb first) */ + unsigned char buffer[64]; /* input buffer */ +} MD5_CTX; + +#endif /* _SYS_MD5_H_ */ diff --git a/lasker-2.2.3/src/mkproto.awk b/lasker-2.2.3/src/mkproto.awk new file mode 100644 index 0000000..e5efc6a --- /dev/null +++ b/lasker-2.2.3/src/mkproto.awk @@ -0,0 +1,88 @@ +BEGIN { + inheader=0; + current_file=""; + if (headername=="") { + headername="_PROTO_H_"; + } + + print "#ifndef",headername + print "#define",headername + print "" + print "/* This file is automatically generated with \"make proto\". DO NOT EDIT */" + print "" +} + +END { + print "" + print "#endif /* ",headername," */" +} + +{ + if (FILENAME!=current_file) { + print "" + print "/* The following definitions come from",FILENAME," */" + print "" + current_file=FILENAME + } + if (inheader) { + if (match($0,"[)][ \t]*$")) { + inheader = 0; + printf "%s;\n",$0; + } else { + printf "%s\n",$0; + } + next; + } +} + +/^static|^extern/ || !/^[a-zA-Z]/ || /[;]/ { + next; +} + +# +# We have to split up the start +# matching as we now have so many start +# types that it can cause some versions +# of nawk/awk to choke and fail on +# the full match. JRA. +# + +{ + gotstart = 0; + if( $0 ~ /^const|^connection_struct|^pipes_struct|^smb_np_struct|^file_fd_struct|^files_struct|^connection_struct|^uid_t|^gid_t|^unsigned|^mode_t|^DIR|^user|^int|^pid_t|^ino_t|^off_t|^double/ ) { + gotstart = 1; + } + + if( $0 ~ /^vuser_key|^UNISTR2|^LOCAL_GRP|^DOMAIN_GRP|^SMB_STRUCT_DIRENT|^SEC_ACL|^SEC_DESC|^SEC_DESC_BUF|^DOM_SID|^RPC_HND_NODE|^BYTE/ ) { + gotstart = 1; + } + + if( $0 ~ /^ADS_STRUCT|^ADS_STATUS|^DATA_BLOB|^ASN1_DATA|^TDB_CONTEXT|^TDB_DATA|^smb_ucs2_t|^TALLOC_CTX|^hash_element|^NT_DEVICEMODE|^enum.*\(|^NT_USER_TOKEN|^SAM_ACCOUNT/ ) { + gotstart = 1; + } + + if( $0 ~ /^smb_iconv_t|^long|^char|^uint|^NTSTATUS|^WERROR|^CLI_POLICY_HND|^struct|^BOOL|^void|^time|^smb_shm_offset_t|^shm_offset_t|^FILE|^XFILE|^SMB_OFF_T|^size_t|^ssize_t|^SMB_BIG_UINT/ ) { + gotstart = 1; + } + + if( $0 ~ /^SAM_ACCT_INFO_NODE|^SMB_ACL_T|^ADS_MODLIST|^PyObject/ ) { + gotstart = 1; + } + + if(!gotstart) { + next; + } +} + + +/[(].*[)][ \t]*$/ { + printf "%s;\n",$0; + next; +} + +/[(]/ { + inheader=1; + printf "%s\n",$0; + next; +} + diff --git a/lasker-2.2.3/src/movecheck.c b/lasker-2.2.3/src/movecheck.c new file mode 100644 index 0000000..81f2d37 --- /dev/null +++ b/lasker-2.2.3/src/movecheck.c @@ -0,0 +1,1274 @@ +/* + Copyright (c) 1993 Richard V. Nash. + Copyright (c) 2000 Dan Papasian + Copyright (C) Andrew Tridgell 2002 + + 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., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#include "includes.h" + +/* Simply tests if the input string is a move or not. */ +/* If it matches patterns below */ +/* Add to this list as you improve the move parser */ +/* MS_COMP e2e4 */ +/* MS_COMPDASH e2-e4 */ +/* MS_CASTLE o-o, o-o-o */ +/* Not done yet */ +/* MS_ALG e4, Nd5 Ncd5 */ +int is_move(const char *mstr) +{ + int len = strlen(mstr); + if ((len > 3) && (mstr[len - 2] == '=')) + len -= 2; + + /* remove the 'mates' marker */ + if (mstr[len - 1] == '#') + len--; + + if (len == 4) { /* Test for e2e4 */ + if (isfile(mstr[0]) && isrank(mstr[1]) && + isfile(mstr[2]) && isrank(mstr[3])) { + return MS_COMP; + } + } + if (len == 5) { /* Test for e2-e4 */ + if (isfile(mstr[0]) && isrank(mstr[1]) && + (mstr[2] == '-') && + isfile(mstr[3]) && isrank(mstr[4])) { + return MS_COMPDASH; + } + } + if (len == 3) { /* Test for o-o */ + if ((mstr[0] == 'o') && (mstr[1] == '-') && (mstr[2] == 'o')) { + return MS_KCASTLE; + } + if ((mstr[0] == 'O') && (mstr[1] == '-') && (mstr[2] == 'O')) { + return MS_KCASTLE; + } + if ((mstr[0] == '0') && (mstr[1] == '-') && (mstr[2] == '0')) { + return MS_KCASTLE; + } + } + if (len == 2) { /* Test for oo */ + if ((mstr[0] == 'o') && (mstr[1] == 'o')) { + return MS_KCASTLE; + } + if ((mstr[0] == 'O') && (mstr[1] == 'O')) { + return MS_KCASTLE; + } + if ((mstr[0] == '0') && (mstr[1] == '0')) { + return MS_KCASTLE; + } + } + if (len == 5) { /* Test for o-o-o */ + if ((mstr[0] == 'o') && (mstr[1] == '-') && (mstr[2] == 'o') && (mstr[3] == '-') && (mstr[4] == 'o')) { + return MS_QCASTLE; + } + if ((mstr[0] == 'O') && (mstr[1] == '-') && (mstr[2] == 'O') && (mstr[3] == '-') && (mstr[4] == 'O')) { + return MS_QCASTLE; + } + if ((mstr[0] == '0') && (mstr[1] == '-') && (mstr[2] == '0') && (mstr[3] == '-') && (mstr[4] == '0')) { + return MS_QCASTLE; + } + } + if (len == 3) { /* Test for ooo */ + if ((mstr[0] == 'o') && (mstr[1] == 'o') && (mstr[2] == 'o')) { + return MS_QCASTLE; + } + if ((mstr[0] == 'O') && (mstr[1] == 'O') && (mstr[2] == 'O')) { + return MS_QCASTLE; + } + if ((mstr[0] == '0') && (mstr[1] == '0') && (mstr[2] == '0')) { + return MS_QCASTLE; + } + } + return alg_is_move(mstr); +} + + +int NextPieceLoop(board_t b, int *f, int *r, int color) +{ + for (;;) { + (*r) = (*r) + 1; + if (*r > 7) { + *r = 0; + *f = *f + 1; + if (*f > 7) + break; + } + if ((b[*f][*r] != NOPIECE) && iscolor(b[*f][*r], color)) + return 1; + } + return 0; +} + +int InitPieceLoop(board_t b, int *f, int *r, int color) +{ + *f = 0; + *r = -1; + return 1; +} + +/* All of the routines assume that the obvious problems have been checked */ +/* See legal_move() */ +static int legal_pawn_move( struct game_state_t *gs, int ff, int fr, int tf, int tr ) +{ + if (ff == tf) { + if (gs->board[tf][tr] != NOPIECE) return 0; + if (gs->onMove == WHITE) { + if (tr - fr == 1) return 1; + if ((fr == 1) && (tr - fr == 2) && gs->board[ff][2]==NOPIECE) return 1; + } else { + if (fr - tr == 1) return 1; + if ((fr == 6) && (fr - tr == 2) && gs->board[ff][5]==NOPIECE) return 1; + } + return 0; + } + if (ff != tf) { /* Capture ? */ + if ((ff - tf != 1) && (tf - ff != 1)) return 0; + if ((fr - tr != 1) && (tr - fr != 1)) return 0; + if (gs->onMove == WHITE) { + if (fr > tr) return 0; + if ((gs->board[tf][tr] != NOPIECE) && iscolor(gs->board[tf][tr],BLACK)) + return 1; + if (gs->ep_possible[0][ff] == 1) { + if ((tf==ff+1) && (gs->board[ff+1][fr] == B_PAWN)) return 1; + } else if (gs->ep_possible[0][ff] == -1) { + if ((tf==ff-1) && (gs->board[ff-1][fr] == B_PAWN)) return 1; + } + } else { + if (tr > fr) return 0; + if ((gs->board[tf][tr] != NOPIECE) && iscolor(gs->board[tf][tr],WHITE)) + return 1; + if (gs->ep_possible[1][ff] == 1) { + if ((tf==ff+1) && (gs->board[ff+1][fr] == W_PAWN)) return 1; + } else if (gs->ep_possible[1][ff] == -1) { + if ((tf==ff-1) && (gs->board[ff-1][fr] == W_PAWN)) return 1; + } + } + } + return 0; +} + +static int legal_knight_move(struct game_state_t * gs, int ff, int fr, int tf, int tr) +{ + int dx, dy; + + dx = ff - tf; + dy = fr - tr; + if (abs(dx) == 2) { + if (abs(dy) == 1) + return 1; + } + if (abs(dy) == 2) { + if (abs(dx) == 1) + return 1; + } + return 0; +} + +static int legal_bishop_move(struct game_state_t * gs, int ff, int fr, int tf, int tr) +{ + int dx, dy, x, y; + int startx, starty; + int count; + int incx, incy; + + if (ff > tf) { + dx = ff - tf; + incx = -1; + } else { + dx = tf - ff; + incx = 1; + } + startx = ff + incx; + if (fr > tr) { + dy = fr - tr; + incy = -1; + } else { + dy = tr - fr; + incy = 1; + } + starty = fr + incy; + if (dx != dy) + return 0; /* Not diagonal */ + if (dx == 1) + return 1; /* One square, ok */ + count = dx - 1; + for (x = startx, y = starty; count; x += incx, y += incy, count--) { + if (gs->board[x][y] != NOPIECE) + return 0; + } + return 1; +} + +static int legal_rook_move(struct game_state_t * gs, int ff, int fr, int tf, int tr) +{ + int i; + int start, stop; + + if (ff == tf) { + if (abs(fr - tr) == 1) + return 1; + if (fr < tr) { + start = fr + 1; + stop = tr - 1; + } else { + start = tr + 1; + stop = fr - 1; + } + for (i = start; i <= stop; i++) { + if (gs->board[ff][i] != NOPIECE) + return 0; + } + return 1; + } else if (fr == tr) { + if (abs(ff - tf) == 1) + return 1; + if (ff < tf) { + start = ff + 1; + stop = tf - 1; + } else { + start = tf + 1; + stop = ff - 1; + } + for (i = start; i <= stop; i++) { + if (gs->board[i][fr] != NOPIECE) + return 0; + } + return 1; + } else { + return 0; + } +} + +static int legal_queen_move(struct game_state_t * gs, int ff, int fr, int tf, int tr) +{ + return legal_rook_move(gs, ff, fr, tf, tr) || legal_bishop_move(gs, ff, fr, tf, tr); +} + +/* Ckeck, if square (kf,kr) is attacked by enemy piece. + * Used in castling from/through check testing. + */ + +/* new one from soso: */ +static int is_square_attacked (struct game_state_t *gs, int kf, int kr) +{ + struct game_state_t fakeMove; + + fakeMove = *gs; + fakeMove.board[4][kr] = NOPIECE; + fakeMove.board[kf][kr] = KING | fakeMove.onMove; + fakeMove.onMove = CToggle (fakeMove.onMove); + if (in_check(&fakeMove)) return 1; + else return 0; +} + +/* old one: +static int is_square_attacked(struct game_state_t * gs, int kf, int kr) +{ + int f, r; + gs->onMove = CToggle(gs->onMove); + + for (InitPieceLoop(gs->board, &f, &r, gs->onMove); + NextPieceLoop(gs->board, &f, &r, gs->onMove);) { + if (legal_move(gs, f, r, kf, kr)) { + gs->onMove = CToggle(gs->onMove); + return 1; + } + } + gs->onMove = CToggle(gs->onMove); + return 0; +} +*/ + +static int legal_king_move(struct game_state_t * gs, int ff, int fr, int tf, int tr) +{ + if (gs->onMove == WHITE) { + /* King side castling */ + if ((fr == 0) && (tr == 0) && (ff == 4) && (tf == 6) && !gs->wkmoved + && (!gs->wkrmoved) && (gs->board[5][0] == NOPIECE) && + (gs->board[6][0] == NOPIECE) && (gs->board[7][0] == W_ROOK) && + (!is_square_attacked(gs, 4, 0)) && (!is_square_attacked(gs, 5, 0))) { + return 1; + } + /* Queen side castling */ + if ((fr == 0) && (tr == 0) && (ff == 4) && (tf == 2) && !gs->wkmoved + && (!gs->wqrmoved) && (gs->board[3][0] == NOPIECE) && + (gs->board[2][0] == NOPIECE) && (gs->board[1][0] == NOPIECE) && + (gs->board[0][0] == W_ROOK) && + (!is_square_attacked(gs, 4, 0)) && (!is_square_attacked(gs, 3, 0))) { + return 1; + } + } else { /* Black */ + /* King side castling */ + if ((fr == 7) && (tr == 7) && (ff == 4) && (tf == 6) && !gs->bkmoved + && (!gs->bkrmoved) && (gs->board[5][7] == NOPIECE) && + (gs->board[6][7] == NOPIECE) && (gs->board[7][7] == B_ROOK) && + (!is_square_attacked(gs, 4, 7)) && (!is_square_attacked(gs, 5, 7))) { + return 1; + } + /* Queen side castling */ + if ((fr == 7) && (tr == 7) && (ff == 4) && (tf == 2) && (!gs->bkmoved) + && (!gs->bqrmoved) && (gs->board[3][7] == NOPIECE) && + (gs->board[2][7] == NOPIECE) && (gs->board[1][7] == NOPIECE) && + (gs->board[0][7] == B_ROOK) && + (!is_square_attacked(gs, 4, 7)) && (!is_square_attacked(gs, 3, 7))) { + return 1; + } + } + if (abs(ff - tf) > 1) + return 0; + if (abs(fr - tr) > 1) + return 0; + return 1; +} + +static void add_pos(int tof, int tor, int *posf, int *posr, int *numpos) +{ + posf[*numpos] = tof; + posr[*numpos] = tor; + (*numpos)++; +} + +static void possible_pawn_moves(struct game_state_t * gs, + int onf, int onr, + int *posf, int *posr, int *numpos) +{ + if (gs->onMove == WHITE) { + if (gs->board[onf][onr + 1] == NOPIECE) { + add_pos(onf, onr + 1, posf, posr, numpos); + if ((onr == 1) && (gs->board[onf][onr + 2] == NOPIECE)) + add_pos(onf, onr + 2, posf, posr, numpos); + } + if ((onf > 0) && (gs->board[onf - 1][onr + 1] != NOPIECE) && + (iscolor(gs->board[onf - 1][onr + 1], BLACK))) + add_pos(onf - 1, onr + 1, posf, posr, numpos); + if ((onf < 7) && (gs->board[onf + 1][onr + 1] != NOPIECE) && + (iscolor(gs->board[onf + 1][onr + 1], BLACK))) + add_pos(onf + 1, onr + 1, posf, posr, numpos); + if (gs->ep_possible[0][onf] == -1) + add_pos(onf - 1, onr + 1, posf, posr, numpos); + if (gs->ep_possible[0][onf] == 1) + add_pos(onf + 1, onr + 1, posf, posr, numpos); + } else { + if (gs->board[onf][onr - 1] == NOPIECE) { + add_pos(onf, onr - 1, posf, posr, numpos); + if ((onr == 6) && (gs->board[onf][onr - 2] == NOPIECE)) + add_pos(onf, onr - 2, posf, posr, numpos); + } + if ((onf > 0) && (gs->board[onf - 1][onr - 1] != NOPIECE) && + (iscolor(gs->board[onf - 1][onr - 1], WHITE))) + add_pos(onf - 1, onr - 1, posf, posr, numpos); +/* loon: changed what looks like a typo, here's the original line: + add_pos(onf - 1, onr + 1, posf, posr, numpos); +*/ + if ((onf < 7) && (gs->board[onf + 1][onr - 1] != NOPIECE) && + (iscolor(gs->board[onf + 1][onr - 1], WHITE))) + add_pos(onf + 1, onr - 1, posf, posr, numpos); + if (gs->ep_possible[1][onf] == -1) + add_pos(onf - 1, onr - 1, posf, posr, numpos); + if (gs->ep_possible[1][onf] == 1) + add_pos(onf + 1, onr - 1, posf, posr, numpos); + } +} + +static void possible_knight_moves(struct game_state_t * gs, + int onf, int onr, + int *posf, int *posr, int *numpos) +{ + static int knightJumps[8][2] = {{-1, 2}, {1, 2}, {2, -1}, {2, 1}, + {-1, -2}, {1, -2}, {-2, 1}, {-2, -1}}; + int f, r; + int j; + + for (j = 0; j < 8; j++) { + f = knightJumps[j][0] + onf; + r = knightJumps[j][1] + onr; + if ((f < 0) || (f > 7)) + continue; + if ((r < 0) || (r > 7)) + continue; + if ((gs->board[f][r] == NOPIECE) || + (iscolor(gs->board[f][r], CToggle(gs->onMove)))) + add_pos(f, r, posf, posr, numpos); + } +} + +static void possible_bishop_moves(struct game_state_t * gs, + int onf, int onr, + int *posf, int *posr, int *numpos) +{ + int f, r; + + /* Up Left */ + f = onf; + r = onr; + for (;;) { + f--; + r++; + if ((f < 0) || (f > 7)) + break; + if ((r < 0) || (r > 7)) + break; + if ((gs->board[f][r] != NOPIECE) && (iscolor(gs->board[f][r], gs->onMove))) + break; + add_pos(f, r, posf, posr, numpos); + if (gs->board[f][r] != NOPIECE) + break; + } + /* Up Right */ + f = onf; + r = onr; + for (;;) { + f++; + r++; + if ((f < 0) || (f > 7)) + break; + if ((r < 0) || (r > 7)) + break; + if ((gs->board[f][r] != NOPIECE) && (iscolor(gs->board[f][r], gs->onMove))) + break; + add_pos(f, r, posf, posr, numpos); + if (gs->board[f][r] != NOPIECE) + break; + } + /* Down Left */ + f = onf; + r = onr; + for (;;) { + f--; + r--; + if ((f < 0) || (f > 7)) + break; + if ((r < 0) || (r > 7)) + break; + if ((gs->board[f][r] != NOPIECE) && (iscolor(gs->board[f][r], gs->onMove))) + break; + add_pos(f, r, posf, posr, numpos); + if (gs->board[f][r] != NOPIECE) + break; + } + /* Down Right */ + f = onf; + r = onr; + for (;;) { + f++; + r--; + if ((f < 0) || (f > 7)) + break; + if ((r < 0) || (r > 7)) + break; + if ((gs->board[f][r] != NOPIECE) && (iscolor(gs->board[f][r], gs->onMove))) + break; + add_pos(f, r, posf, posr, numpos); + if (gs->board[f][r] != NOPIECE) + break; + } +} + +static void possible_rook_moves(struct game_state_t * gs, + int onf, int onr, + int *posf, int *posr, int *numpos) +{ + int f, r; + + /* Left */ + f = onf; + r = onr; + for (;;) { + f--; + if ((f < 0) || (f > 7)) + break; + if ((r < 0) || (r > 7)) + break; + if ((gs->board[f][r] != NOPIECE) && (iscolor(gs->board[f][r], gs->onMove))) + break; + add_pos(f, r, posf, posr, numpos); + if (gs->board[f][r] != NOPIECE) + break; + } + /* Right */ + f = onf; + r = onr; + for (;;) { + f++; + if ((f < 0) || (f > 7)) + break; + if ((r < 0) || (r > 7)) + break; + if ((gs->board[f][r] != NOPIECE) && (iscolor(gs->board[f][r], gs->onMove))) + break; + add_pos(f, r, posf, posr, numpos); + if (gs->board[f][r] != NOPIECE) + break; + } + /* Up */ + f = onf; + r = onr; + for (;;) { + r++; + if ((f < 0) || (f > 7)) + break; + if ((r < 0) || (r > 7)) + break; + if ((gs->board[f][r] != NOPIECE) && (iscolor(gs->board[f][r], gs->onMove))) + break; + add_pos(f, r, posf, posr, numpos); + if (gs->board[f][r] != NOPIECE) + break; + } + /* Down */ + f = onf; + r = onr; + for (;;) { + r--; + if ((f < 0) || (f > 7)) + break; + if ((r < 0) || (r > 7)) + break; + if ((gs->board[f][r] != NOPIECE) && (iscolor(gs->board[f][r], gs->onMove))) + break; + add_pos(f, r, posf, posr, numpos); + if (gs->board[f][r] != NOPIECE) + break; + } +} + +static void possible_queen_moves(struct game_state_t * gs, + int onf, int onr, + int *posf, int *posr, int *numpos) +{ + possible_rook_moves(gs, onf, onr, posf, posr, numpos); + possible_bishop_moves(gs, onf, onr, posf, posr, numpos); +} + +static void possible_king_moves(struct game_state_t * gs, + int onf, int onr, + int *posf, int *posr, int *numpos) +{ + static int kingJumps[8][2] = {{-1, -1}, {0, -1}, {1, -1}, {-1, 1}, + {0, 1}, {1, 1}, {-1, 0}, {1, 0}}; + int f, r; + int j; + + for (j = 0; j < 8; j++) { + f = kingJumps[j][0] + onf; + r = kingJumps[j][1] + onr; + if ((f < 0) || (f > 7)) + continue; + if ((r < 0) || (r > 7)) + continue; + if ((gs->board[f][r] == NOPIECE) || + (iscolor(gs->board[f][r], CToggle(gs->onMove)))) + add_pos(f, r, posf, posr, numpos); + } +} + +/* Doesn't check for check */ +int legal_move(struct game_state_t * gs, + int fFile, int fRank, + int tFile, int tRank) +{ + int move_piece; + int legal; + + if (fFile == ALG_DROP) { + move_piece = fRank; + if (move_piece == KING) + return 0; + if (gs->holding[gs->onMove==WHITE ? 0 : 1][move_piece-1] == 0) + return 0; + if (gs->board[tFile][tRank] != NOPIECE) + return 0; + if (move_piece == PAWN && (tRank == 0 || tRank == 7)) + return 0; + return 1; + } else { + move_piece = piecetype(gs->board[fFile][fRank]); + } + if (gs->board[fFile][fRank] == NOPIECE) + return 0; + if (!iscolor(gs->board[fFile][fRank], gs->onMove)) /* Wrong color */ + return 0; + if ((gs->board[tFile][tRank] != NOPIECE) && + iscolor(gs->board[tFile][tRank], gs->onMove)) /* Can't capture own */ + return 0; + if ((fFile == tFile) && (fRank == tRank)) /* Same square */ + return 0; + switch (move_piece) { + case PAWN: + legal = legal_pawn_move(gs, fFile, fRank, tFile, tRank); + break; + case KNIGHT: + legal = legal_knight_move(gs, fFile, fRank, tFile, tRank); + break; + case BISHOP: + legal = legal_bishop_move(gs, fFile, fRank, tFile, tRank); + break; + case ROOK: + legal = legal_rook_move(gs, fFile, fRank, tFile, tRank); + break; + case QUEEN: + legal = legal_queen_move(gs, fFile, fRank, tFile, tRank); + break; + case KING: + legal = legal_king_move(gs, fFile, fRank, tFile, tRank); + break; + default: + return 0; + break; + } + return legal; +} + +#define DROP_CHAR '@' + +/* This fills in the rest of the mt structure once it is determined that + * the move is legal. Returns MOVE_ILLEGAL if move leaves you in check */ +static int move_calculate(struct game_state_t * gs, struct move_t * mt, int promote) +{ + struct game_state_t fakeMove; + + mt->pieceCaptured = gs->board[mt->toFile][mt->toRank]; + mt->enPassant = 0; /* Don't know yet, let execute move take care + of it */ + if (mt->fromFile == ALG_DROP) { + mt->piecePromotionTo = NOPIECE; + sprintf(mt->moveString, "%s/%c%c-%c%d", + wpstring[mt->fromRank], + DROP_CHAR, DROP_CHAR, + mt->toFile + 'a', mt->toRank + 1); + } else { + if ((piecetype(gs->board[mt->fromFile][mt->fromRank]) == PAWN) && + ((mt->toRank == 0) || (mt->toRank == 7))) { + mt->piecePromotionTo = promote | + (colorval(gs->board[mt->fromFile][mt->fromRank])); + } else { + mt->piecePromotionTo = NOPIECE; + } + if ((piecetype(gs->board[mt->fromFile][mt->fromRank]) == PAWN) && + ((mt->fromRank - mt->toRank == 2) || (mt->toRank - mt->fromRank == 2))) { + mt->doublePawn = mt->fromFile; + } else { + mt->doublePawn = -1; + } + if ((piecetype(gs->board[mt->fromFile][mt->fromRank]) == KING) && + (mt->fromFile == 4) && (mt->toFile == 2)) { + sprintf(mt->moveString, "o-o-o"); + } else if ((piecetype(gs->board[mt->fromFile][mt->fromRank]) == KING) && + (mt->fromFile == 4) && (mt->toFile == 6)) { + sprintf(mt->moveString, "o-o"); + } else { + sprintf(mt->moveString, "%s/%c%d-%c%d", + wpstring[piecetype(gs->board[mt->fromFile][mt->fromRank])], + mt->fromFile + 'a', mt->fromRank + 1, + mt->toFile + 'a', mt->toRank + 1); + } + } + /* Replace this with an algabraic de-parser */ + + sprintf(mt->algString, alg_unparse(gs, mt)); + fakeMove = *gs; + /* Calculates enPassant also */ + execute_move(&fakeMove, mt, 0); + + /* Does making this move leave ME in check? */ + if (in_check(&fakeMove)) + return MOVE_ILLEGAL; + /* IanO: bughouse variants: drop cannot be check/checkmate */ + + return MOVE_OK; +} + +int legal_andcheck_move(struct game_state_t * gs, + int fFile, int fRank, + int tFile, int tRank) +{ + struct move_t mt; + if (!legal_move(gs, fFile, fRank, tFile, tRank)) + return 0; + mt.color = gs->onMove; + mt.fromFile = fFile; + mt.fromRank = fRank; + mt.toFile = tFile; + mt.toRank = tRank; + /* This should take into account a pawn promoting to another piece */ + if (move_calculate(gs, &mt, QUEEN) == MOVE_OK) + return 1; + else + return 0; +} + +/* in_check: checks if the side that is NOT about to move is in check + */ +int in_check(struct game_state_t * gs) +{ + int f, r; + int kf = -1, kr = -1; + + /* Find the king */ + if (gs->onMove == WHITE) { + for (f = 0; f < 8 && kf < 0; f++) + for (r = 0; r < 8 && kf < 0; r++) + if (gs->board[f][r] == B_KING) { + kf = f; + kr = r; + } + } else { + for (f = 0; f < 8 && kf < 0; f++) + for (r = 0; r < 8 && kf < 0; r++) + if (gs->board[f][r] == W_KING) { + kf = f; + kr = r; + } + } + if (kf < 0) { + d_printf( "CHESSD: Error game with no king!\n"); + return 0; + } + for (InitPieceLoop(gs->board, &f, &r, gs->onMove); + NextPieceLoop(gs->board, &f, &r, gs->onMove);) { + if (legal_move(gs, f, r, kf, kr)) { /* In Check? */ + return 1; + } + } + return 0; +} + +int has_legal_move(struct game_state_t * gs) +{ + int i; + int f, r; + int kf = 0, kr = 0; + int possiblef[500], possibler[500]; + int numpossible = 0; + + for (InitPieceLoop(gs->board, &f, &r, gs->onMove); + NextPieceLoop(gs->board, &f, &r, gs->onMove);) { + switch (piecetype(gs->board[f][r])) { + case PAWN: + possible_pawn_moves(gs, f, r, possiblef, possibler, &numpossible); + break; + case KNIGHT: + possible_knight_moves(gs, f, r, possiblef, possibler, &numpossible); + break; + case BISHOP: + possible_bishop_moves(gs, f, r, possiblef, possibler, &numpossible); + break; + case ROOK: + possible_rook_moves(gs, f, r, possiblef, possibler, &numpossible); + break; + case QUEEN: + possible_queen_moves(gs, f, r, possiblef, possibler, &numpossible); + break; + case KING: + kf = f; + kr = r; + possible_king_moves(gs, f, r, possiblef, possibler, &numpossible); + break; + } + if (numpossible >= 500) { + d_printf( "CHESSD: Possible move overrun\n"); + } + for (i = 0; i < numpossible; i++) + if (legal_andcheck_move(gs, f, r, possiblef[i], possibler[i])) { + return 1; + } + } + + /* IanO: if we got here, then kf and kr must be set */ + if (gs->gameNum >=0 && game_globals.garray[gs->gameNum].link >= 0) { + /* bughouse: potential drops as check interpositions */ + gs->holding[gs->onMove==WHITE ? 0 : 1][QUEEN - 1]++; + for (f=kf-1; f<=kf+1; f++) for (r=kr-1; r<=kr+1; r++) { + if (f>=0 && f<8 && r>=0 && r<8 && gs->board[f][r] == NOPIECE) { + /* try a drop next to the king */ + if (legal_andcheck_move(gs, ALG_DROP, QUEEN, f, r)) { + gs->holding[gs->onMove==WHITE ? 0 : 1][QUEEN - 1]--; + return 1; + } + } + } + gs->holding[gs->onMove==WHITE ? 0 : 1][QUEEN - 1]--; + } + + return 0; +} + +/* This will end up being a very complicated function */ +int parse_move(char *mstr, struct game_state_t * gs, struct move_t * mt, int promote) +{ + int type = is_move(mstr); + int result; + + mt->piecePromotionTo = NOPIECE; + mt->color = gs->onMove; + switch (type) { + case MS_NOTMOVE: + return MOVE_ILLEGAL; + break; + case MS_COMP: + mt->fromFile = mstr[0] - 'a'; + mt->fromRank = mstr[1] - '1'; + mt->toFile = mstr[2] - 'a'; + mt->toRank = mstr[3] - '1'; + break; + case MS_COMPDASH: + mt->fromFile = mstr[0] - 'a'; + mt->fromRank = mstr[1] - '1'; + mt->toFile = mstr[3] - 'a'; + mt->toRank = mstr[4] - '1'; + break; + case MS_KCASTLE: + mt->fromFile = 4; + mt->toFile = 6; + if (gs->onMove == WHITE) { + mt->fromRank = 0; + mt->toRank = 0; + } else { + mt->fromRank = 7; + mt->toRank = 7; + } + break; + case MS_QCASTLE: + mt->fromFile = 4; + mt->toFile = 2; + if (gs->onMove == WHITE) { + mt->fromRank = 0; + mt->toRank = 0; + } else { + mt->fromRank = 7; + mt->toRank = 7; + } + break; + case MS_ALG: + /* Fills in the mt structure */ + if ((result = alg_parse_move(mstr, gs, mt)) != MOVE_OK) + return result; + break; + default: + return MOVE_ILLEGAL; + break; + } + if (!legal_move(gs, mt->fromFile, mt->fromRank, mt->toFile, mt->toRank)) { + return MOVE_ILLEGAL; + } + + if (mt->piecePromotionTo != NOPIECE) { + promote = piecetype(mt->piecePromotionTo); + } + + return move_calculate(gs, mt, promote); +} + +/* Returns MOVE_OK, MOVE_NOMATERIAL, MOVE_CHECKMATE, or MOVE_STALEMATE */ +/* check_game_status prevents recursion */ +int execute_move(struct game_state_t * gs, struct move_t * mt, int check_game_status) +{ + int movedPiece; + int tookPiece; + int i, j, foobar; + + if (mt->fromFile == ALG_DROP) { + movedPiece = mt->fromRank; + tookPiece = NOPIECE; + gs->holding[gs->onMove==WHITE ? 0 : 1][movedPiece-1]--; + gs->board[mt->toFile][mt->toRank] = movedPiece | gs->onMove; + if (gs->gameNum >= 0) + gs->lastIrreversable = game_globals.garray[gs->gameNum].numHalfMoves; + } else { + movedPiece = gs->board[mt->fromFile][mt->fromRank]; + tookPiece = gs->board[mt->toFile][mt->toRank]; + if (mt->piecePromotionTo == NOPIECE) { + gs->board[mt->toFile][mt->toRank] = gs->board[mt->fromFile][mt->fromRank]; + } else { + gs->board[mt->toFile][mt->toRank] = mt->piecePromotionTo | gs->onMove; + } + gs->board[mt->fromFile][mt->fromRank] = NOPIECE; + /* Check if irreversable */ + if ((piecetype(movedPiece) == PAWN) || (tookPiece != NOPIECE)) { + if (gs->gameNum >= 0) + gs->lastIrreversable = game_globals.garray[gs->gameNum].numHalfMoves; + } + /* Check if this move is en-passant */ + if ((piecetype(movedPiece) == PAWN) && (mt->fromFile != mt->toFile) && + (tookPiece == NOPIECE)) { + if (gs->onMove == WHITE) { + mt->pieceCaptured = B_PAWN; + } else { + mt->pieceCaptured = W_PAWN; + } + if (mt->fromFile > mt->toFile) { + mt->enPassant = -1; + } else { + mt->enPassant = 1; + } + gs->board[mt->toFile][mt->fromRank] = NOPIECE; + } + /* Check en-passant flags for next moves */ + for (i = 0; i < 8; i++) { + gs->ep_possible[0][i] = 0; + gs->ep_possible[1][i] = 0; + } +/* Added by Sparky 3/16/95 + + From soso@Viktoria.drp.fmph.uniba.sk Thu Mar 16 13:08:51 1995 + Subject: Re: To DAV: enpassant prob. again + To: chess@caissa.onenet.net (ICS) + Date: Thu, 16 Mar 1995 20:06:20 +0100 (MET) + + Yeah ! + There was bug in other part of code: + + movecheck.c , line about 800: + + if (gs->onMove == WHITE) { + if ((mt->toFile+1 < 7 ) .... should be : (mt->toFile < 7 ) } +*/ + + if ((piecetype(movedPiece) == PAWN) && + ((mt->fromRank == mt->toRank + 2) || (mt->fromRank + 2 == mt->toRank))) { + /* Should turn on enpassent flag if possible */ + if (gs->onMove == WHITE) { + if ((mt->toFile < 7) && gs->board[mt->toFile + 1][3] == B_PAWN) { + gs->ep_possible[1][mt->toFile + 1] = -1; + } + if ((mt->toFile - 1 >= 0) && gs->board[mt->toFile - 1][3] == B_PAWN) { + gs->ep_possible[1][mt->toFile - 1] = 1; + } + } else { + if ((mt->toFile < 7) && gs->board[mt->toFile + 1][4] == W_PAWN) { + gs->ep_possible[0][mt->toFile + 1] = -1; + } + if ((mt->toFile - 1 >= 0) && gs->board[mt->toFile - 1][4] == W_PAWN) { + gs->ep_possible[0][mt->toFile - 1] = 1; + } + } + } + if ((piecetype(movedPiece) == ROOK) && (mt->fromFile == 0)) { + if ((mt->fromRank == 0) && (gs->onMove == WHITE)) + gs->wqrmoved = 1; + if ((mt->fromRank == 7) && (gs->onMove == BLACK)) + gs->bqrmoved = 1; + } + if ((piecetype(movedPiece) == ROOK) && (mt->fromFile == 7)) { + if ((mt->fromRank == 0) && (gs->onMove == WHITE)) + gs->wkrmoved = 1; + if ((mt->fromRank == 7) && (gs->onMove == BLACK)) + gs->bkrmoved = 1; + } + if (piecetype(movedPiece) == KING) { + if (gs->onMove == WHITE) + gs->wkmoved = 1; + else + gs->bkmoved = 1; + } + if ((piecetype(movedPiece) == KING) && + ((mt->fromFile == 4) && ((mt->toFile == 6)))) { /* Check for KS castling */ + gs->board[5][mt->toRank] = gs->board[7][mt->toRank]; + gs->board[7][mt->toRank] = NOPIECE; + } + if ((piecetype(movedPiece) == KING) && + ((mt->fromFile == 4) && ((mt->toFile == 2)))) { /* Check for QS castling */ + gs->board[3][mt->toRank] = gs->board[0][mt->toRank]; + gs->board[0][mt->toRank] = NOPIECE; + } + } + if (gs->onMove == BLACK) + gs->moveNum++; + + if (check_game_status) { + /* Does this move result in check? */ + if (in_check(gs)) { + /* Check for checkmate */ + gs->onMove = CToggle(gs->onMove); + if (!has_legal_move(gs)) + return MOVE_CHECKMATE; + } else { + /* Check for stalemate */ + gs->onMove = CToggle(gs->onMove); + if (!has_legal_move(gs)) + return MOVE_STALEMATE; +/* loon: check for insufficient mating material, first try */ + foobar = 0; + for (i=0; i<8; i++) { + for (j=0; j<8; j++) { + switch(piecetype(gs->board[i][j])) { + case KNIGHT: + case BISHOP: + foobar++; + break; + case KING: + case NOPIECE: + break; + default: + foobar = 2; + break; + } + } + } + if (foobar < 2) + return MOVE_NOMATERIAL; + } + } else { + gs->onMove = CToggle(gs->onMove); + } + return MOVE_OK; +} + +int backup_move(int g, int mode) +{ + struct game_state_t *gs; + struct move_t *m, *m1; + int now, i; + + if (game_globals.garray[g].link >= 0) /*IanO: not implemented for bughouse yet */ + return MOVE_ILLEGAL; + if (game_globals.garray[g].numHalfMoves < 1) + return MOVE_ILLEGAL; + gs = &game_globals.garray[g].game_state; + m = (mode==REL_GAME) ? &game_globals.garray[g].moveList[game_globals.garray[g].numHalfMoves - 1] : + &game_globals.garray[g].examMoveList[game_globals.garray[g].numHalfMoves - 1]; + if (m->toFile < 0) { + return MOVE_ILLEGAL; + } + gs->board[m->fromFile][m->fromRank] = gs->board[m->toFile][m->toRank]; + if (m->piecePromotionTo != NOPIECE) { + gs->board[m->fromFile][m->fromRank] = PAWN | + colorval(gs->board[m->fromFile][m->fromRank]); + } + /****************** + When takeback a _first_ move of rook, the ??rmoved variable + must be cleared . To check, if the move is first, we should + scan moveList. + *******************/ + if (piecetype(gs->board[m->fromFile][m->fromRank]) == ROOK) { + if (m->color == WHITE) { + if ((m->fromFile == 0) && (m->fromRank == 0)) { + for (i = 2; i < game_globals.garray[g].numHalfMoves - 1; i += 2) { + m1 = (mode==REL_GAME) ? &game_globals.garray[g].moveList[i] : &game_globals.garray[g].examMoveList[i]; + if ((m1->fromFile == 0) && (m1->fromRank == 0)) + break; + } + if (i == game_globals.garray[g].numHalfMoves - 1) + gs->wqrmoved = 0; + } + if ((m->fromFile == 7) && (m->fromRank == 0)) { + for (i = 2; i < game_globals.garray[g].numHalfMoves - 1; i += 2) { + m1 = (mode==REL_GAME) ? &game_globals.garray[g].moveList[i] : &game_globals.garray[g].examMoveList[i]; + if ((m1->fromFile == 7) && (m1->fromRank == 0)) + break; + } + if (i == game_globals.garray[g].numHalfMoves - 1) + gs->wkrmoved = 0; + } + } else { + if ((m->fromFile == 0) && (m->fromRank == 7)) { + for (i = 3; i < game_globals.garray[g].numHalfMoves - 1; i += 2) { + m1 = (mode==REL_GAME) ? &game_globals.garray[g].moveList[i] : &game_globals.garray[g].examMoveList[i]; + if ((m1->fromFile == 0) && (m1->fromRank == 0)) + break; + } + if (i == game_globals.garray[g].numHalfMoves - 1) + gs->bqrmoved = 0; + } + if ((m->fromFile == 7) && (m->fromRank == 7)) { + for (i = 3; i < game_globals.garray[g].numHalfMoves - 1; i += 2) { + m1 = (mode==REL_GAME) ? &game_globals.garray[g].moveList[i] : &game_globals.garray[g].examMoveList[i]; + if ((m1->fromFile == 7) && (m1->fromRank == 0)) + break; + } + if (i == game_globals.garray[g].numHalfMoves - 1) + gs->bkrmoved = 0; + } + } + } + if (piecetype(gs->board[m->fromFile][m->fromRank]) == KING) { + gs->board[m->toFile][m->toRank] = m->pieceCaptured; + + if (m->toFile - m->fromFile == 2) { + gs->board[7][m->fromRank] = ROOK | + colorval(gs->board[m->fromFile][m->fromRank]); + gs->board[5][m->fromRank] = NOPIECE; + + /******** + If takeback a castling, the appropriates ??moved variables + must be cleared + ********/ + if (m->color == WHITE) { + gs->wkmoved = 0; + gs->wkrmoved = 0; + } else { + gs->bkmoved = 0; + gs->bkrmoved = 0; + } + goto cleanupMove; + } + if (m->fromFile - m->toFile == 2) { + gs->board[0][m->fromRank] = ROOK | + colorval(gs->board[m->fromFile][m->fromRank]); + gs->board[3][m->fromRank] = NOPIECE; + + /********** + If takeback a castling, the appropriate ??moved variables + must be cleared + ***********/ + if (m->color == WHITE) { + gs->wkmoved = 0; + gs->wqrmoved = 0; + } else { + gs->bkmoved = 0; + gs->bqrmoved = 0; + } + goto cleanupMove; + } + /****************** + When takeback a _first_ move of king (not the castling), + the ?kmoved variable must be cleared . To check, if the move is first, + we should scan moveList. + *******************/ + + if (m->color == WHITE) { + + if ((m->fromFile == 4) && (m->fromRank == 0)) { + for (i = 2; i < game_globals.garray[g].numHalfMoves - 1; i += 2) { + m1 = (mode==REL_GAME) ? &game_globals.garray[g].moveList[i] : &game_globals.garray[g].examMoveList[i]; + if ((m1->fromFile == 4) && (m1->fromRank == 0)) + break; + } + if (i == game_globals.garray[g].numHalfMoves - 1) + gs->wkmoved = 0; + } + } else { + if ((m->fromFile == 4) && (m->fromRank == 7)) { + for (i = 3; i < game_globals.garray[g].numHalfMoves - 1; i += 2) { + m1 = (mode==REL_GAME) ? &game_globals.garray[g].moveList[i] : &game_globals.garray[g].examMoveList[i]; + if ((m1->fromFile == 4) && (m1->fromRank == 7)) + break; + } + if (i == game_globals.garray[g].numHalfMoves - 1) + gs->bkmoved = 0; + } + } + } + if (m->enPassant) { /* Do enPassant */ + gs->board[m->toFile][m->fromRank] = PAWN | + (colorval(gs->board[m->fromFile][m->fromRank]) == WHITE ? BLACK : WHITE); + gs->board[m->toFile][m->toRank] = NOPIECE; + /* Should set the enpassant array, but I don't care right now */ + goto cleanupMove; + } + gs->board[m->toFile][m->toRank] = m->pieceCaptured; +cleanupMove: + if (game_globals.garray[g].status != GAME_EXAMINE) { + game_update_time(g); + } + game_globals.garray[g].numHalfMoves--; + if (game_globals.garray[g].status != GAME_EXAMINE) { + if (game_globals.garray[g].wInitTime) { /* Don't update times in untimed games */ + now = tenth_secs(); + + if (m->color == WHITE) { + if (net_globals.con[player_globals.parray[game_globals.garray[g].white].socket]->timeseal) { /* white uses timeseal? */ + game_globals.garray[g].wRealTime += (m->tookTime * 100); + game_globals.garray[g].wRealTime -= (game_globals.garray[g].wIncrement * 100); + game_globals.garray[g].wTime = game_globals.garray[g].wRealTime / 100; + if (net_globals.con[player_globals.parray[game_globals.garray[g].black].socket]->timeseal) { /* opp uses timeseal? */ + game_globals.garray[g].bTime = game_globals.garray[g].bRealTime / 100; + } else { /* opp has no timeseal */ + game_globals.garray[g].bTime += (game_globals.garray[g].lastDecTime - game_globals.garray[g].lastMoveTime); + } + } else { /* white has no timeseal */ + game_globals.garray[g].wTime += m->tookTime; + game_globals.garray[g].wTime -= game_globals.garray[g].wIncrement; + if (net_globals.con[player_globals.parray[game_globals.garray[g].black].socket]->timeseal) { /* opp uses timeseal? */ + game_globals.garray[g].bTime = game_globals.garray[g].bRealTime / 100; + } else { /* opp has no timeseal */ + game_globals.garray[g].bTime += (game_globals.garray[g].lastDecTime - game_globals.garray[g].lastMoveTime); + } + } + } else { + if (net_globals.con[player_globals.parray[game_globals.garray[g].black].socket]->timeseal) { /* black uses timeseal? */ + game_globals.garray[g].bRealTime += (m->tookTime * 100); + game_globals.garray[g].bRealTime -= (game_globals.garray[g].wIncrement * 100); + game_globals.garray[g].bTime = game_globals.garray[g].bRealTime / 100; + if (net_globals.con[player_globals.parray[game_globals.garray[g].white].socket]->timeseal) { /* opp uses timeseal? */ + game_globals.garray[g].wTime = game_globals.garray[g].wRealTime / 100; + } else { /* opp has no timeseal */ + game_globals.garray[g].wTime += (game_globals.garray[g].lastDecTime - game_globals.garray[g].lastMoveTime); + } + } else { /* black has no timeseal */ + game_globals.garray[g].bTime += m->tookTime; + if (!game_globals.garray[g].bIncrement) + game_globals.garray[g].bTime -= game_globals.garray[g].wIncrement; + else + game_globals.garray[g].bTime -= game_globals.garray[g].bIncrement; + if (net_globals.con[player_globals.parray[game_globals.garray[g].white].socket]->timeseal) { /* opp uses timeseal? */ + game_globals.garray[g].wTime = game_globals.garray[g].wRealTime / 100; + } else { /* opp has no timeseal */ + game_globals.garray[g].wTime += (game_globals.garray[g].lastDecTime - game_globals.garray[g].lastMoveTime); + } + } + } + + if (game_globals.garray[g].numHalfMoves == 0) + game_globals.garray[g].timeOfStart = now; + game_globals.garray[g].lastMoveTime = now; + game_globals.garray[g].lastDecTime = now; + } + } + if (gs->onMove == BLACK) + gs->onMove = WHITE; + else { + gs->onMove = BLACK; + gs->moveNum--; + } + + /******* Here begins the patch : ******************************** + Takeback of last move is done already, it's time to update enpassant + array. (patch from Soso, added by Sparky 3/17/95) + ********/ + + if (game_globals.garray[g].numHalfMoves > 0) { + m1 = (mode==REL_GAME) ? &game_globals.garray[g].moveList[game_globals.garray[g].numHalfMoves - 1] : + &game_globals.garray[g].examMoveList[game_globals.garray[g].numHalfMoves - 1]; + if (piecetype(gs->board[m1->toFile][m1->toRank]) == PAWN) { + if ((m1->toRank - m1->fromRank) == 2) { + if ((m1->toFile < 7) && gs->board[m1->toFile + 1][3] == B_PAWN) { + gs->ep_possible[1][m1->toFile + 1] = -1; + } + if ((m1->toFile - 1 >= 0) && gs->board[m1->toFile - 1][3] == B_PAWN) { + gs->ep_possible[1][m1->toFile - 1] = 1; + } + } + if ((m1->toRank - m1->fromRank) == -2) { + if ((m1->toFile < 7) && gs->board[m1->toFile + 1][4] == W_PAWN) { + gs->ep_possible[0][m1->toFile + 1] = -1; + } + if ((m1->toFile - 1 >= 0) && gs->board[m1->toFile - 1][4] == W_PAWN) { + gs->ep_possible[0][m1->toFile - 1] = 1; + } + } + } + } + /************** and here's the end **************/ + return MOVE_OK; +} + + + + diff --git a/lasker-2.2.3/src/movecheck.h b/lasker-2.2.3/src/movecheck.h new file mode 100644 index 0000000..8033261 --- /dev/null +++ b/lasker-2.2.3/src/movecheck.h @@ -0,0 +1,41 @@ +/* + Copyright (c) 1993 Richard V. Nash. + Copyright (c) 2000 Dan Papasian + Copyright (C) Andrew Tridgell 2002 + + 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., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#ifndef _MOVECHECK_H +#define _MOVECHECK_H + +#define MOVE_OK 0 +#define MOVE_ILLEGAL 1 +#define MOVE_STALEMATE 2 +#define MOVE_CHECKMATE 3 +#define MOVE_AMBIGUOUS 4 +#define MOVE_NOMATERIAL 5 + +#define MS_NOTMOVE 0 +#define MS_COMP 1 +#define MS_COMPDASH 2 +#define MS_ALG 3 +#define MS_KCASTLE 4 +#define MS_QCASTLE 5 + +#define isrank(c) (((c) <= '8') && ((c) >= '1')) +#define isfile(c) (((c) >= 'a') && ((c) <= 'h')) + +#endif /* _MOVECHECK_H */ diff --git a/lasker-2.2.3/src/multicol.c b/lasker-2.2.3/src/multicol.c new file mode 100644 index 0000000..26a748a --- /dev/null +++ b/lasker-2.2.3/src/multicol.c @@ -0,0 +1,140 @@ +/* + Copyright (c) 1993 Richard V. Nash. + Copyright (c) 2000 Dan Papasian + Copyright (C) Andrew Tridgell 2002 + + 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., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + + +#include "includes.h" + +struct multicol *multicol_start(int maxArray) +{ + int i; + multicol *m; + + m = (multicol *) malloc(sizeof(multicol)); + m->arraySize = maxArray; + m->num = 0; + m->strArray = (char **) malloc(sizeof(char *) * m->arraySize); + for (i = 0; i < m->arraySize; i++) + m->strArray[i] = NULL; + return m; +} + +int multicol_store(multicol * m, char *str) +{ + if (m->num >= m->arraySize) + return -1; + if (!str) + return -1; + m->strArray[m->num] = strdup(str); + m->num++; + return 0; +} + +int multicol_store_sorted(multicol * m, char *str) +/* use this instead of multicol_store to print a list sorted */ +{ + int i; + int found = 0; + if (m->num >= m->arraySize) + return -1; + if (!str) + return -1; + for (i = m->num; (i > 0) && (!found); i--) { + if (strcasecmp(str, m->strArray[i - 1]) >= 0) { + found = 1; + m->strArray[i] = strdup(str); + } else { + m->strArray[i] = m->strArray[i - 1]; + } + } + if (!found) + m->strArray[0] = strdup(str); + m->num++; + return 0; +} + +int multicol_pprint(multicol * m, int player, int cols, int space) +{ + int i; + int maxWidth = 0; + int numPerLine; + int numLines; + int on, theone, len; + int done; + int temp; + char *tempptr; + + pprintf(player, "\n"); + for (i = 0; i < m->num; i++) { + tempptr = m->strArray[i]; + temp = strlen(tempptr); /* loon: yes, this is pathetic */ + for (; *tempptr; tempptr++) { + if (*tempptr == '\033') + temp -= 4; + } + if (temp > maxWidth) + maxWidth = temp; + } + maxWidth += space; + numPerLine = cols / maxWidth; + if (!numPerLine) + numPerLine = 1; /* stop a division by 0 on large members */ + numLines = m->num / numPerLine; + if (numLines * numPerLine < m->num) + numLines++; + on = 0; + done = 0; + while (!done) { + for (i = 0; i < numPerLine; i++) { + theone = on + numLines * i; + if (theone >= m->num) { + break; + } + tempptr = m->strArray[theone]; + temp = strlen(tempptr); /* loon: yes, still pathetic */ + for (; *tempptr; tempptr++) { + if (*tempptr == '\033') + temp -= 4; + } + len = maxWidth - temp; + if (i == numPerLine - 1) + len -= space; + pprintf(player, "%s", m->strArray[theone]); + while (len) { + pprintf(player, " "); + len--; + } + } + pprintf(player, "\n"); + on += 1; + if (on >= numLines) + break; + } + return 0; +} + +int multicol_end(multicol * m) +{ + int i; + for (i = 0; i < m->num; i++) + FREE(m->strArray[i]); + FREE(m->strArray); + FREE(m); + return 0; +} diff --git a/lasker-2.2.3/src/multicol.h b/lasker-2.2.3/src/multicol.h new file mode 100644 index 0000000..f3ed904 --- /dev/null +++ b/lasker-2.2.3/src/multicol.h @@ -0,0 +1,31 @@ +/* + Copyright (c) 1993 Richard V. Nash. + Copyright (c) 2000 Dan Papasian + Copyright (C) Andrew Tridgell 2002 + + 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., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#ifndef _MULTICOL_H +#define _MULTICOL_H + +typedef struct multicol +{ + int arraySize; + int num; + char **strArray; +} multicol; + +#endif /* _MULTICOL_H */ diff --git a/lasker-2.2.3/src/network.c b/lasker-2.2.3/src/network.c new file mode 100644 index 0000000..3a95367 --- /dev/null +++ b/lasker-2.2.3/src/network.c @@ -0,0 +1,621 @@ +/* + Copyright (c) 1993 Richard V. Nash. + Copyright (c) 2000 Dan Papasian + Copyright (C) Andrew Tridgell 2002 + + 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., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#include "includes.h" + +extern int errno; + +/* Index == fd, for sparse array, quick lookups! wasted memory :( */ +static int findConnection(int fd) +{ + if (fd == -1 || net_globals.con[fd]->status == NETSTAT_EMPTY) + return -1; + else + return fd; +} + + +static void set_sndbuf(int fd, int len) +{ + net_globals.con[fd]->sndbufpos = len; + if (len < net_globals.con[fd]->sndbufsize) { + net_globals.con[fd]->sndbuf[len] = 0; + } +} + +static int net_addConnection(int fd, struct in_addr fromHost) +{ + int noblock = 1; + + /* possibly expand the connections array */ + if (fd >= net_globals.no_file) { + int i; + net_globals.con = (struct connection_t **)realloc(net_globals.con, + (fd+1) * sizeof(struct connection_t *)); + for (i=net_globals.no_file;istatus = NETSTAT_EMPTY; + } + net_globals.no_file = fd+1; + } + + if (findConnection(fd) >= 0) { + d_printf( "CHESSD: FD already in connection table!\n"); + return -1; + } + if (ioctl(fd, FIONBIO, &noblock) == -1) { + d_printf( "Error setting nonblocking mode errno=%d\n", errno); + } + net_globals.con[fd]->fd = fd; + if (fd != 0) + net_globals.con[fd]->outFd = fd; + else + net_globals.con[fd]->outFd = 1; + net_globals.con[fd]->fromHost = fromHost; + net_globals.con[fd]->status = NETSTAT_CONNECTED; + net_globals.con[fd]->timeseal = 0; + net_globals.con[fd]->timeseal_init = 1; + net_globals.con[fd]->time = 0; + net_globals.con[fd]->numPending = 0; + net_globals.con[fd]->inBuf[0] = 0; + net_globals.con[fd]->processed = 0; + net_globals.con[fd]->outPos = 0; + if (net_globals.con[fd]->sndbuf == NULL) { +#ifdef DEBUG + d_printf( "CHESSD: nac(%d) allocating sndbuf.\n", fd); +#endif + net_globals.con[fd]->sndbufpos = 0; + net_globals.con[fd]->sndbufsize = MAX_STRING_LENGTH; + net_globals.con[fd]->sndbuf = malloc(MAX_STRING_LENGTH); + } else { +#ifdef DEBUG + d_printf( "CHESSD: nac(%d) reusing old sndbuf size %d pos %d.\n", fd, net_globals.con[fd].sndbufsize, net_globals.con[fd].sndbufpos); +#endif + } + net_globals.con[fd]->state = 0; + net_globals.numConnections++; + +#ifdef DEBUG + d_printf( "CHESSD: fd: %d connections: %d descriptors: %d \n", fd, numConnections, getdtablesize()); /* sparky 3/13/95 */ +#endif + + return 0; +} + +static int remConnection(int fd) +{ + int which, i; + if ((which = findConnection(fd)) < 0) { + d_printf( "remConnection: Couldn't find fd to close.\n"); + return -1; + } + net_globals.numConnections--; + net_globals.con[fd]->status = NETSTAT_EMPTY; + if (net_globals.con[fd]->sndbuf == NULL) { + d_printf( "CHESSD: remcon(%d) SNAFU, this shouldn't happen.\n", fd); + } else { + if (net_globals.con[fd]->sndbufsize > MAX_STRING_LENGTH) { + net_globals.con[fd]->sndbufsize = MAX_STRING_LENGTH; + net_globals.con[fd]->sndbuf = realloc(net_globals.con[fd]->sndbuf, MAX_STRING_LENGTH); + } + if (net_globals.con[fd]->sndbufpos) { /* didn't send everything, bummer */ + set_sndbuf(fd, 0); + } + } + + /* see if we can shrink the con array */ + for (i=fd;istatus != NETSTAT_EMPTY) { + return 0; + } + } + + /* yep! shrink it */ + for (i=fd;isndbuf); + FREE(net_globals.con[i]); + } + net_globals.no_file = fd; + net_globals.con = (struct connection_t **)realloc(net_globals.con, + net_globals.no_file * sizeof(struct connection_t *)); + + return 0; +} + +static void net_flushme(int which) +{ + int sent; + + sent = send(net_globals.con[which]->outFd, net_globals.con[which]->sndbuf, net_globals.con[which]->sndbufpos, 0); + if (sent == -1) { + if (errno != EPIPE) /* EPIPE = they've disconnected */ + d_printf( "CHESSD: net_flushme(%d) couldn't send, errno=%d.\n", which, errno); + set_sndbuf(which, 0); + } else { + net_globals.con[which]->sndbufpos -= sent; + if (net_globals.con[which]->sndbufpos) + memmove(net_globals.con[which]->sndbuf, net_globals.con[which]->sndbuf + sent, net_globals.con[which]->sndbufpos); + } + if (net_globals.con[which]->sndbufsize > MAX_STRING_LENGTH && net_globals.con[which]->sndbufpos < MAX_STRING_LENGTH) { + /* time to shrink the buffer */ + net_globals.con[which]->sndbuf = realloc(net_globals.con[which]->sndbuf, MAX_STRING_LENGTH); + net_globals.con[which]->sndbufsize = MAX_STRING_LENGTH; + } + set_sndbuf(which, net_globals.con[which]->sndbufpos); +} + +static void net_flush_all_connections(void) +{ + int which; + fd_set writefds; + struct timeval to; + + FD_ZERO(&writefds); + for (which = 0; which < net_globals.no_file; which++) { + if (net_globals.con[which]->status == NETSTAT_CONNECTED && + net_globals.con[which]->sndbufpos){ + FD_SET(net_globals.con[which]->outFd, &writefds); + } + } + + to.tv_usec = 0; + to.tv_sec = 0; + select(net_globals.no_file, NULL, &writefds, NULL, &to); + for (which = 0; which < net_globals.no_file; which++) { + if (FD_ISSET(net_globals.con[which]->outFd, &writefds)) { + net_flushme(which); + } + } +} + +static void net_flush_connection(int fd) +{ + int which; + fd_set writefds; + struct timeval to; + + if (((which = findConnection(fd)) >= 0) && (net_globals.con[which]->sndbufpos)) { + FD_ZERO(&writefds); + FD_SET(net_globals.con[which]->outFd, &writefds); + to.tv_usec = 0; + to.tv_sec = 0; + select(net_globals.no_file, NULL, &writefds, NULL, &to); + if (FD_ISSET(net_globals.con[which]->outFd, &writefds)) { + net_flushme(which); + } + } +} + +static int sendme(int which, char *str, int len) +{ + int i, count; + fd_set writefds; + struct timeval to; + count = len; + + while ((i = ((net_globals.con[which]->sndbufsize - net_globals.con[which]->sndbufpos) < len) ? (net_globals.con[which]->sndbufsize - net_globals.con[which]->sndbufpos) : len) > 0) { + memmove(net_globals.con[which]->sndbuf + net_globals.con[which]->sndbufpos, str, i); + net_globals.con[which]->sndbufpos += i; + if (net_globals.con[which]->sndbufpos == net_globals.con[which]->sndbufsize) { + + FD_ZERO(&writefds); + FD_SET(net_globals.con[which]->outFd, &writefds); + to.tv_usec = 0; + to.tv_sec = 0; + select(net_globals.no_file, NULL, &writefds, NULL, &to); + if (FD_ISSET(net_globals.con[which]->outFd, &writefds)) { + net_flushme(which); + } else { + /* time to grow the buffer */ + net_globals.con[which]->sndbufsize += MAX_STRING_LENGTH; + net_globals.con[which]->sndbuf = realloc(net_globals.con[which]->sndbuf, net_globals.con[which]->sndbufsize); + } + } + str += i; + len -= i; + } + set_sndbuf(which, net_globals.con[which]->sndbufpos); + return count; +} + +/* + * -1 for an error other than EWOULDBLOCK. + * Put after every and put \ at the end of overlength lines. + * Doesn't send anything unless the buffer fills, output waits until + * flushed +*/ +/* width here is terminal width = width var + 1 at presnt) */ +int net_send_string(int fd, char *str, int format, int width) +{ + int which, i, j; + + if ((which = findConnection(fd)) < 0) { + return -1; + } + while (*str) { + for (i = 0; str[i] >= ' '; i++); + if (i) { + if (format && (i >= (j = width - net_globals.con[which]->outPos))) { /* word wrap */ + i = j-1; + while (i > 0 && str[i - 1] != ' ') + i--; +/* + while (i > 0 && str[i - 1] == ' ') + i--; +*/ + if (i == 0) + i = j - 1; + sendme(which, str, i); + sendme(which, "\n\r\\ ", 6); + net_globals.con[which]->outPos = 4; + while (str[i] == ' ') /* eat the leading spaces after we wrap */ + i++; + } else { + sendme(which, str, i); + net_globals.con[which]->outPos += i; + } + str += i; + } else { /* non-printable stuff handled here */ + switch (*str) { + case '\t': + sendme(which, " ", 8 - (net_globals.con[which]->outPos & 7)); + net_globals.con[which]->outPos &= ~7; + if (net_globals.con[which]->outPos += 8 >= width) + net_globals.con[which]->outPos = 0; + break; + case '\n': + sendme(which, "\n\r", 2); + net_globals.con[which]->outPos = 0; + break; + case '\033': + net_globals.con[which]->outPos -= 3; + default: + sendme(which, str, 1); + } + str++; + } + } + return 0; +} + +/* if we get a complete line (something terminated by \n), copy it to com + and return 1. + if we don't get a complete line, but there is no error, return 0. + if some error, return -1. + */ +static int readline2(char *com, int who) +{ + unsigned char *start, *s, *d; + int howmany, state, fd, pending; + + const unsigned char will_tm[] = {IAC, WILL, TELOPT_TM, '\0'}; + const unsigned char will_sga[] = {IAC, WILL, TELOPT_SGA, '\0'}; + const unsigned char ayt[] = "[Responding to AYT: Yes, I'm here.]\n"; + + state = net_globals.con[who]->state; + if ((state == 2) || (state > 4)) { + d_printf( "CHESSD: state screwed for net_globals.con[%d], this is a bug.\n", who); + state = 0; + } + s = start = net_globals.con[who]->inBuf; + pending = net_globals.con[who]->numPending; + fd = net_globals.con[who]->fd; + + howmany = recv(fd, start + pending, MAX_STRING_LENGTH - 1 - pending, 0); + if (howmany == 0) /* error: they've disconnected */ + return (-1); + else if (howmany == -1) { + if (errno != EWOULDBLOCK) { /* some other error */ + return (-1); + } else if (net_globals.con[who]->processed) { /* nothing new and nothing old */ + return (0); + } else { /* nothing new, but some unprocessed old */ + howmany = 0; + } + } + if (net_globals.con[who]->processed) + s += pending; + else + howmany += pending; + d = s; + + for (; howmany-- > 0; s++) { + switch (state) { + case 0: /* Haven't skipped over any control chars or + telnet commands */ + if (*s == IAC) { + d = s; + state = 1; + } else if (*s == '\n') { + *s = '\0'; + strcpy(com, start); + if (howmany) + bcopy(s + 1, start, howmany); + net_globals.con[who]->state = 0; + net_globals.con[who]->numPending = howmany; + net_globals.con[who]->inBuf[howmany] = 0; + net_globals.con[who]->processed = 0; + net_globals.con[who]->outPos = 0; + return (1); +/* + Cannot strip ^? yet otherwise timeseal probs occur +*/ + } else if (*s == '\010') { /* ^H lets delete */ + if (s > start) + d = s-1; + else + d = s; + state = 2; + } else if ((*s > (0xff - 0x20)) || (*s < 0x20)) { + d = s; + state = 2; + } + break; + case 1: /* got telnet IAC */ + if (*s == IP) + return (-1); /* ^C = logout */ + else if (*s == DO) + state = 4; + else if ((*s == WILL) || (*s == DONT) || (*s == WONT)) + state = 3; /* this is cheesy, but we aren't using em */ + else if (*s == AYT) { + send(fd, (char *) ayt, strlen((char *) ayt), 0); + state = 2; + } else if (*s == EL) { /* erase line */ + d = start; + state = 2; + } else /* dunno what it is, so ignore it */ + state = 2; + break; + case 2: /* we've skipped over something, need to + shuffle processed chars down */ + if (*s == IAC) + state = 1; + else if (*s == '\n') { + *d = '\0'; + strcpy(com, start); + if (howmany) + memmove(start, s + 1, howmany); + net_globals.con[who]->state = 0; + net_globals.con[who]->numPending = howmany; + net_globals.con[who]->inBuf[howmany] = 0; + net_globals.con[who]->processed = 0; + net_globals.con[who]->outPos = 0; + return (1); +/* + Cannot strip ^? yet otherwise timeseal probs occur +*/ + } else if (*s == '\010') { /* ^H lets delete */ + if (d > start) + d = d-1; + } else if (*s >= 0x20) + *(d++) = *s; + break; + case 3: /* some telnet junk we're ignoring */ + state = 2; + break; + case 4: /* got IAC DO */ + if (*s == TELOPT_TM) + send(fd, (char *) will_tm, strlen((char *) will_tm), 0); + else if (*s == TELOPT_SGA) + send(fd, (char *) will_sga, strlen((char *) will_sga), 0); + state = 2; + break; + } + } + if (state == 0) + d = s; + else if (state == 2) + state = 0; + net_globals.con[who]->state = state; + net_globals.con[who]->numPending = d - start; + net_globals.con[who]->inBuf[d-start] = 0; + net_globals.con[who]->processed = 1; + if (net_globals.con[who]->numPending == MAX_STRING_LENGTH - 1) { /* buffer full */ + *d = '\0'; + strcpy(com, start); + net_globals.con[who]->state = 0; + net_globals.con[who]->numPending = 0; + net_globals.con[who]->inBuf[0] = 0; + net_globals.con[who]->processed = 0; + return (1); + } + return (0); +} + +int net_init(int port) +{ + int opt; + struct sockaddr_in serv_addr; + struct linger lingeropt; + + net_globals.no_file = 0; + net_globals.con = NULL; + + /* Open a TCP socket (an Internet stream socket). */ + if ((net_globals.sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { + d_printf( "CHESSD: can't open stream socket\n"); + return -1; + } + /* Bind our local address so that the client can send to us */ + memset((char *) &serv_addr, 0, sizeof(serv_addr)); + serv_addr.sin_family = AF_INET; + serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); + serv_addr.sin_port = htons(port); + + /** added in an attempt to allow rebinding to the port **/ + + opt = 1; + setsockopt(net_globals.sockfd, SOL_SOCKET, SO_REUSEADDR, (char *) &opt, sizeof(opt)); + opt = 1; + setsockopt(net_globals.sockfd, SOL_SOCKET, SO_KEEPALIVE, (char *) &opt, sizeof(opt)); + lingeropt.l_onoff = 0; + lingeropt.l_linger = 0; + setsockopt(net_globals.sockfd, SOL_SOCKET, SO_LINGER, (char *) &lingeropt, sizeof(lingeropt)); + +/* +#ifdef DEBUG + opt = 1; + setsockopt(sockfd, SOL_SOCKET, SO_DEBUG, (char *)&opt, sizeof(opt)); +#endif +*/ + + if (bind(net_globals.sockfd, (struct sockaddr *) & serv_addr, sizeof(serv_addr)) < 0) { + d_printf( "CHESSD: can't bind local address. errno=%d\n", errno); + return -1; + } + opt = 1; + ioctl(net_globals.sockfd, FIONBIO, &opt); + fcntl(net_globals.sockfd, F_SETFD, 1); + listen(net_globals.sockfd, 5); + return 0; +} + +void net_close(void) +{ + int i; + for (i = 0; i < net_globals.no_file; i++) { + if (net_globals.con[i]->status != NETSTAT_EMPTY) + net_close_connection(net_globals.con[i]->fd); + } +} + +void net_close_connection(int fd) +{ + if (net_globals.con[fd]->status == NETSTAT_CONNECTED) + net_flush_connection(fd); + else + d_printf( "Trying to close an unconnected socket?!?!\n"); + + if (!remConnection(fd)) { + if (fd > 2) + if (close(fd) < 0) { + d_printf( "Couldn't close socket %d - errno %d\n", fd, errno); + } + } else { + d_printf( "Failed to remove connection (Socket %d)\n", fd); + } +} + +void turn_echo_on(int fd) +{ + const unsigned char wont_echo[] = {IAC, WONT, TELOPT_ECHO, '\0'}; + + send(fd, (char *) wont_echo, strlen((char *) wont_echo), 0); +} + +void turn_echo_off(int fd) +{ + static unsigned char will_echo[] = {IAC, WILL, TELOPT_ECHO, '\0'}; + + send(fd, (char *) will_echo, strlen((char *) will_echo), 0); +} + +static struct in_addr net_connected_host(int fd) +{ + int which; + + if ((which = findConnection(fd)) < 0) { + static struct in_addr ip_zero; + d_printf( "CHESSD: FD not in connection table!\n"); + return ip_zero; + } + return net_globals.con[which]->fromHost; +} + +void select_loop(void ) +{ + char com[MAX_STRING_LENGTH]; + struct sockaddr_in cli_addr; + int cli_len = (int) sizeof(struct sockaddr_in); + int fd, loop, nfound, lineComplete; + fd_set readfds; + struct timeval to; + int current_socket; + int timeout = 2; + +#if 0 + m_check_all(); +#endif + + /* we only want to get signals here. This tries to + ensure a clean shutdown on 'kill' */ + unblock_signal(SIGTERM); + block_signal(SIGTERM); + + while ((fd = accept(net_globals.sockfd, (struct sockaddr *) & cli_addr, &cli_len)) != -1) { + if (net_addConnection(fd, cli_addr.sin_addr)) { + d_printf( "FICS is full. fd = %d.\n", fd); + psend_raw_file(fd, MESS_DIR, MESS_FULL); + close(fd); + } else { + if (fd >= net_globals.no_file) + d_printf("FICS (ngc2): Out of range fd!\n"); + else { + fcntl(fd, F_SETFD, 1); + process_new_connection(fd, net_connected_host(fd)); + } + } + } + + if (errno != EWOULDBLOCK) + d_printf( "CHESSD: Problem with accept(). errno=%d\n", errno); + + net_flush_all_connections(); + + if (net_globals.numConnections == 0) { + sleep(1); /* prevent the server spinning */ + } + + FD_ZERO(&readfds); + for (loop = 0; loop < net_globals.no_file; loop++) + if (net_globals.con[loop]->status != NETSTAT_EMPTY) + FD_SET(net_globals.con[loop]->fd, &readfds); + + to.tv_usec = 0; + to.tv_sec = timeout; + nfound = select(net_globals.no_file, &readfds, NULL, NULL, &to); + for (loop = 0; loop < net_globals.no_file; loop++) { + if (net_globals.con[loop]->status != NETSTAT_EMPTY) { + fd = net_globals.con[loop]->fd; + more_commands: + lineComplete = readline2(com, fd); + if (lineComplete == 0) /* partial line: do nothing with it */ + continue; + if (lineComplete > 0) { /* complete line: process it */ + if (!timeseal_parse(com, net_globals.con[loop])) continue; + if (process_input(fd, com) != COM_LOGOUT) { + net_flush_connection(fd); + goto more_commands; + } + } + /* Disconnect anyone who gets here */ + process_disconnection(fd); + net_close_connection(fd); + } + } + + if (process_heartbeat(¤t_socket) == COM_LOGOUT) { + process_disconnection(current_socket); + net_close_connection(current_socket); + } +} + diff --git a/lasker-2.2.3/src/network.h b/lasker-2.2.3/src/network.h new file mode 100644 index 0000000..00d2251 --- /dev/null +++ b/lasker-2.2.3/src/network.h @@ -0,0 +1,60 @@ +/* + Copyright (c) 1993 Richard V. Nash. + Copyright (c) 2000 Dan Papasian + Copyright (C) Andrew Tridgell 2002 + + 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., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#ifndef NETWORK_H +#define NETWORK_H + +#define NET_NETERROR 0 +#define NET_NEW 1 +#define NET_DISCONNECT 2 +#define NET_READLINE 3 +#define NET_TIMEOUT 4 +#define NET_NOTCOMPLETE 5 + +#define LINE_WIDTH 80 + +#ifndef O_NONBLOCK +#define O_NONBLOCK 00004 +#endif + +GENSTRUCT enum netstatus {NETSTAT_EMPTY, NETSTAT_CONNECTED, NETSTAT_IDENT}; + +GENSTRUCT struct connection_t { + int fd; + int outFd; + struct in_addr fromHost; + enum netstatus status; + /* Input buffering */ + int numPending; + int processed; + unsigned char inBuf[MAX_STRING_LENGTH+1]; _NULLTERM + /* Output buffering */ + int sndbufsize; /* size of send buffer (this changes) */ + int sndbufpos; /* position in send buffer */ + unsigned char *sndbuf; _LEN(sndbufsize)_NULLTERM /* our send buffer, or NULL if none yet */ + int outPos; /* column count */ + int state; /* 'telnet state' */ + int mypal; + int timeseal; /* are they using timeseal */ + int timeseal_init; /* are they in timeseal initialisation? */ + unsigned time; /* last time received from the client */ +}; + +#endif /* NETWORK_H */ diff --git a/lasker-2.2.3/src/news.c b/lasker-2.2.3/src/news.c new file mode 100644 index 0000000..1d0f294 --- /dev/null +++ b/lasker-2.2.3/src/news.c @@ -0,0 +1,539 @@ +/* + Copyright (C) Andrew Tridgell 2002 + + 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., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +/* + support for the 'news' command + */ + +#include "includes.h" + +static TDB_CONTEXT *news_db; + +/* close the news database */ +void news_close(void) +{ + if (!news_db) return; + tdb_close(news_db); + news_db = NULL; +} + +/* + open the news database + returns 0 on success + */ +int news_open(void) +{ + news_db = tdb_open(NEWS_DB, 0, 0, O_RDWR|O_CREAT, 0600); + if (!news_db) { + d_printf("Unable to open news database!\n"); + return -1; + } + return 0; +} + +/* + free up a news item +*/ +static void news_free(struct news *news) +{ + FREE(news->poster); + FREE(news->title); + FREE(news->message); +} + +/* + return the maximum news item number +*/ +static int news_max(int admin) +{ + return tdb_get_int(news_db, admin?"ADMIN_MAXNUM":"MAXNUM", 0); +} + +/* + save a news item +*/ +static int news_save(int num, struct news *news, int admin) +{ + const char *s; + char *name; + + /* marshall it into a string */ + s = marshall_news(news); + if (!s) { + return -1; + } + + asprintf(&name, "%s%u", admin?"ADMIN/":"", num); + if (tdb_set_string(news_db, name, s) != 0) { + free(name); + free(s); + return -1; + } + + free(name); + free(s); + + if (news_max(admin) < num) { + tdb_set_int(news_db, admin?"ADMIN_MAXNUM":"MAXNUM", num); + } + + return 0; +} + + +/* + load a news item +*/ +static int news_load(int num, struct news *news, int admin) +{ + const char *s; + char *name; + int ret; + + asprintf(&name, "%s%u", admin?"ADMIN/":"", num); + s = tdb_get_string(news_db, name); + if (!s) { + free(name); + return -1; + } + free(name); + + ret = unmarshall_news(news, s); + free(s); + return ret; +} + +/* + delete a news item +*/ +static int news_delete(int p, int num, int admin) +{ + char *name; + + asprintf(&name, "%s%u", admin?"ADMIN/":"", num); + if (tdb_delete_string(news_db, name) == 0) { + pprintf(p,"Deleted news item %u\n", num); + } else { + pprintf(p,"Unable to delete news item %u !\n", num); + } + free(name); + return 0; +} + + +/* + summarise the news + */ +static int news_summary(int p, int first, int how_many, int admin) +{ + int i; + if (first < 1) { + first = 1; + } + for (i=first; i< first+how_many; i++) { + struct news news; + if (news_load(i, &news, admin) == 0) { + pprintf(p, "%4u (%s) %s\n", + i, + strday(&news.post_date), + news.title); + news_free(&news); + } + } + + return COM_OK; +} + + +/* + lookup a news item + */ +static int do_news(int p, param_list param, int admin) +{ + int num; + struct news news; + + if (param[0].type == TYPE_NULL) { + return news_summary(p, news_max(admin)-9, 10, admin); + } + if (strcasecmp(param[0].val.word, "all") == 0) { + return news_summary(p, 1, news_max(admin), admin); + } + + num = atoi(param[0].val.word); + if (num <= 0) { + pprintf(p, "Bad news item number '%s'\n", param[0].val.word); + return COM_OK; + } + + if (news_load(num, &news, admin) != 0) { + pprintf(p, "News item %u not found\n", num); + return COM_OK; + } + + pprintf_more(p,"%4u (%s) %s\n\n%s\n\nPosted by %s.\n", + num, + strday(&news.post_date), + news.title, + news.message, + news.poster); + + news_free(&news); + + return COM_OK; +} + +/* + lookup a news item + */ +int com_news(int p, param_list param) +{ + return do_news(p, param, 0); +} + + +/* + lookup a admin news item + */ +int com_anews(int p, param_list param) +{ + return do_news(p, param, 1); +} + + +/* + create a new news item +*/ +static int cnewsi(int p, const char *title, int admin) +{ + struct player *pp = &player_globals.parray[p]; + struct news news; + int ret, num; + + ZERO_STRUCT(news); + news.poster = strdup(pp->name); + news.post_date = time(NULL); + news.message = strdup(""); + news.title = strndup(title, 45); + + num = news_max(admin) + 1; + ret = news_save(num, &news, admin); + + if (ret == 0) { + pprintf(p,"Created news item %u\n", num); + } else { + pprintf(p,"Failed to create news item %u !\n", num); + } + + news_free(&news); + return ret; +} + +/* + add to a news item +*/ +static int cnewsf(int p, int num, const char *message, int admin) +{ + struct news news; + char *msg; + + if (news_load(num, &news, admin) != 0) { + pprintf(p, "News item %u not found\n", num); + return -1; + } + + asprintf(&msg, "%s%s\n", news.message, message); + FREE(news.message); + news.message = msg; + + if (news_save(num, &news, admin) != 0) { + pprintf(p, "News item %u could not be updated !\n", num); + news_free(&news); + return -1; + } + + pprintf(p, "News item %u updated\n", num); + + news_free(&news); + return 0; +} + +/* + set title on a news item +*/ +static int cnewst(int p, int num, const char *title, int admin) +{ + struct news news; + + if (news_load(num, &news, admin) != 0) { + pprintf(p, "News item %u not found\n", num); + return -1; + } + + FREE(news.title); + news.title = strndup(title, 45); + + if (news_save(num, &news, admin) != 0) { + pprintf(p, "News item %u could not be updated !\n", num); + news_free(&news); + return -1; + } + + pprintf(p, "News item %u updated\n", num); + + news_free(&news); + return 0; +} + +/* + set poster on a news item +*/ +static int cnewsp(int p, int num, int admin) +{ + struct player *pp = &player_globals.parray[p]; + struct news news; + + if (news_load(num, &news, admin) != 0) { + pprintf(p, "News item %u not found\n", num); + return -1; + } + + FREE(news.poster); + news.poster = strdup(pp->name); + + if (news_save(num, &news, admin) != 0) { + pprintf(p, "News item %u could not be updated !\n", num); + news_free(&news); + return -1; + } + + pprintf(p, "News item %u updated\n", num); + + news_free(&news); + return 0; +} + +/* + delete last line of an item +*/ +static int cnewsd(int p, int num, int admin) +{ + struct news news; + char *s; + + if (news_load(num, &news, admin) != 0) { + pprintf(p, "News item %u not found\n", num); + return -1; + } + + news.message[strlen(news.message)-1] = 0; + s = strrchr(news.message, '\n'); + if (s) { + s[1] = 0; + } else { + news.message[0] = 0; + } + + if (news_save(num, &news, admin) != 0) { + pprintf(p, "News item %u could not be updated !\n", num); + news_free(&news); + return -1; + } + + pprintf(p, "News item %u updated\n", num); + + news_free(&news); + return 0; +} + + +/* + set expiry on a news item +*/ +static int cnewse(int p, int num, int expiry, int admin) +{ + struct news news; + + if (news_load(num, &news, admin) != 0) { + pprintf(p, "News item %u not found\n", num); + return -1; + } + + if (expiry == -1) { + news_free(&news); + return news_delete(p, num, admin); + } else if (expiry == 0) { + news.expires = 0; + } else { + news.expires = time(NULL) + (expiry * 24*60*60); + } + + if (news_save(num, &news, admin) != 0) { + pprintf(p, "News item %u could not be updated !\n", num); + news_free(&news); + return -1; + } + + pprintf(p, "News item %u updated\n", num); + + news_free(&news); + return 0; +} + +/* + create a normal news item +*/ +int com_cnewsi(int p, param_list param) +{ + cnewsi(p, param[0].val.string, 0); + return COM_OK; +} + +/* + add to a normal news item +*/ +int com_cnewsf(int p, param_list param) +{ + cnewsf(p, param[0].val.integer, + param[1].type != TYPE_NULL?param[1].val.string:"", + 0); + return COM_OK; +} + +/* + set title on a normal news item +*/ +int com_cnewst(int p, param_list param) +{ + cnewst(p, param[0].val.integer, param[1].val.string, 0); + return COM_OK; +} + +/* + set poster on a normal news item +*/ +int com_cnewsp(int p, param_list param) +{ + cnewsp(p, param[0].val.integer, 0); + return COM_OK; +} + +/* + set expiry on a normal news item +*/ +int com_cnewse(int p, param_list param) +{ + cnewse(p, + param[0].val.integer, + param[1].type != TYPE_NULL?param[1].val.integer:-1, + 0); + return COM_OK; +} + +/* + delete last line on a normal news item +*/ +int com_cnewsd(int p, param_list param) +{ + cnewsd(p, param[0].val.integer, 0); + return COM_OK; +} + +/* + create a admin news item +*/ +int com_canewsi(int p, param_list param) +{ + cnewsi(p, param[0].val.string, 1); + return COM_OK; +} + +/* + add to a admin news item +*/ +int com_canewsf(int p, param_list param) +{ + cnewsf(p, param[0].val.integer, + param[1].type != TYPE_NULL?param[1].val.string:"", + 1); + return COM_OK; +} + +/* + set title on a admin news item +*/ +int com_canewst(int p, param_list param) +{ + cnewst(p, param[0].val.integer, param[1].val.string, 1); + return COM_OK; +} + +/* + set poster on a admin news item +*/ +int com_canewsp(int p, param_list param) +{ + cnewsp(p, param[0].val.integer, 1); + return COM_OK; +} + +/* + set expiry on a admin news item +*/ +int com_canewse(int p, param_list param) +{ + cnewse(p, param[0].val.integer, + param[1].type != TYPE_NULL?param[1].val.integer:-1, + 1); + return COM_OK; +} + +/* + delete last line on a admin news item +*/ +int com_canewsd(int p, param_list param) +{ + cnewsd(p, param[0].val.integer, 1); + return COM_OK; +} + + +/* + tell user about new news +*/ +void news_login(int p) +{ + struct player *pp = &player_globals.parray[p]; + int max; + + max = news_max(0); + if (max > pp->latest_news) { + pprintf(p,"\nThere are %u new news items since your last login\n", + max - pp->latest_news); + pp->latest_news = max; + } + + if (!check_admin(p, ADMIN_ADMIN)) return; + + max = news_max(1); + if (max > pp->admin_latest_news) { + pprintf(p,"\nThere are %u new admin news items since your last login\n", + max - pp->admin_latest_news); + pp->admin_latest_news = max; + } +} diff --git a/lasker-2.2.3/src/news.h b/lasker-2.2.3/src/news.h new file mode 100644 index 0000000..f93e2a4 --- /dev/null +++ b/lasker-2.2.3/src/news.h @@ -0,0 +1,29 @@ +/* + Copyright (C) Andrew Tridgell 2002 + + 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., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +/* + support structures for the 'news' command + */ + +GENSTRUCT struct news { + char *poster; + time_t post_date; + time_t expires; + char *title; + char *message; +}; diff --git a/lasker-2.2.3/src/newvers.sh b/lasker-2.2.3/src/newvers.sh new file mode 100755 index 0000000..a84a363 --- /dev/null +++ b/lasker-2.2.3/src/newvers.sh @@ -0,0 +1,74 @@ +#!/bin/sh - +# +# Copyright (c) 1984, 1986, 1990, 1993 +# The Regents of the University of California. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# 3. Neither the name of the University nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. +# +# @(#)newvers.sh 8.1 (Berkeley) 4/20/94 +# $FreeBSD: src/sys/conf/newvers.sh,v 1.45 2000/03/13 09:13:01 jkh Exp $ +# + +TYPE="chessd" +REVISION="2.2.x" +BRANCH="DEVEL" +RELEASE="${REVISION}-${BRANCH}" +SNAPDATE="" +if [ "X${SNAPDATE}" != "X" ]; then + RELEASE="${RELEASE}-${SNAPDATE}" +fi +VERSION="${TYPE} ${RELEASE}" +RELDATE="\"`date`\"" +YEAR=`date "+%Y"` + +COPYRIGHT="/* + * Copyright (c) $YEAR Dan Papasian. All rights reserved. + * + * This file is automatically generated by newvers.sh. DO NOT EDIT! + * + * Redistribution of any kind is permitted. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR \`\`AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ +" + +LC_TIME=C; export LC_TIME + +cat << EOF > vers.c +$COPYRIGHT +char VERS_NUM[] = "${RELEASE}"; +char COMP_DATE[] = ${RELDATE}; +EOF + diff --git a/lasker-2.2.3/src/obsproc.c b/lasker-2.2.3/src/obsproc.c new file mode 100644 index 0000000..952a6de --- /dev/null +++ b/lasker-2.2.3/src/obsproc.c @@ -0,0 +1,1792 @@ +/* + Copyright (c) 1993 Richard V. Nash. + Copyright (c) 2000 Dan Papasian + Copyright (C) Andrew Tridgell 2002 + + 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., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#include "includes.h" + +int GameNumFromParam(int p, int *p1, parameter *param) +{ + if (param->type == TYPE_WORD) { + *p1 = player_find_part_login(param->val.word); + if (*p1 < 0) { + pprintf(p, "No user named \"%s\" is logged in.\n", param->val.word); + return -1; + } + if (player_globals.parray[*p1].game < 0) + pprintf(p, "%s is not playing a game.\n", player_globals.parray[*p1].name); + return player_globals.parray[*p1].game; + } else { /* Must be an integer */ + *p1 = -1; + if (param->val.integer <= 0) + pprintf(p, "%d is not a valid game number.\n", param->val.integer); + return param->val.integer - 1; + } +} + +static int gamesortfunc(const void *i, const void *j) +{ +/* examine mode games moved to top of "games" output */ + return (GetRating(&player_globals.parray[game_globals.garray[*(int *) i].white], game_globals.garray[*(int *) i].type) + + GetRating(&player_globals.parray[game_globals.garray[*(int *) i].black], game_globals.garray[*(int *) i].type) - + (((game_globals.garray[*(int *) i].status == GAME_EXAMINE) || (game_globals.garray[*(int *) i].status == GAME_SETUP)) ? 10000 : 0) - + GetRating(&player_globals.parray[game_globals.garray[*(int *) j].white], game_globals.garray[*(int *) j].type) - + GetRating(&player_globals.parray[game_globals.garray[*(int *) j].black], game_globals.garray[*(int *) j].type) + + (((game_globals.garray[*(int *) j].status == GAME_EXAMINE) || (game_globals.garray[*(int *) j].status == GAME_SETUP)) ? 10000 : 0)); +} + + +int com_games(int p, param_list param) +{ + int i, j; + int wp, bp; + int ws, bs; + int selected = 0; + int count = 0; + int totalcount; + char *s = NULL; + int slen = 0; + int *sortedgames; /* for qsort */ + + totalcount = game_count(); + if (totalcount == 0) { + pprintf(p, "There are no games in progress.\n"); + } else { + sortedgames = malloc(totalcount * sizeof(int)); /* for qsort */ + + if (param[0].type == TYPE_WORD) { + s = param[0].val.word; + slen = strlen(s); + selected = atoi(s); + if (selected < 0) + selected = 0; + } + for (i = 0; i < game_globals.g_num; i++) { + if ((game_globals.garray[i].status != GAME_ACTIVE) && (game_globals.garray[i].status != GAME_EXAMINE) && (game_globals.garray[i].status != GAME_SETUP)) + continue; + if ((selected) && (selected != i + 1)) + continue; /* not selected game number */ + wp = game_globals.garray[i].white; + bp = game_globals.garray[i].black; + if ((!selected) && s && strncasecmp(s, game_globals.garray[i].white_name, slen) && + strncasecmp(s, game_globals.garray[i].black_name, slen)) + continue; /* player names did not match */ + sortedgames[count++] = i; + } + if (!count) + pprintf(p, "No matching games were found (of %d in progress).\n", totalcount); + else { + qsort(sortedgames, count, sizeof(int), gamesortfunc); + pprintf(p, "\n"); + for (j = 0; j < count; j++) { + i = sortedgames[j]; + wp = game_globals.garray[i].white; + bp = game_globals.garray[i].black; + board_calc_strength(&game_globals.garray[i].game_state, &ws, &bs); + if ((game_globals.garray[i].status != GAME_EXAMINE) && (game_globals.garray[i].status != GAME_SETUP)) { + pprintf_noformat(p, "%3d %4s %-11.11s %4s %-10.10s [%c%c%c%3d %3d] ", + i + 1, + ratstrii(GetRating(&player_globals.parray[wp],game_globals.garray[i].type), wp), + player_globals.parray[wp].name, + ratstrii(GetRating(&player_globals.parray[bp],game_globals.garray[i].type), bp), + player_globals.parray[bp].name, + (game_globals.garray[i].private) ? 'p' : ' ', + *bstr[game_globals.garray[i].type], + *rstr[game_globals.garray[i].rated], + game_globals.garray[i].wInitTime / 600, + game_globals.garray[i].wIncrement / 10); + game_update_time(i); + pprintf_noformat(p, "%6s -", + tenth_str((game_globals.garray[i].wTime > 0 ? game_globals.garray[i].wTime : 0), 0)); + pprintf_noformat(p, "%6s (%2d-%2d) %c: %2d\n", + tenth_str((game_globals.garray[i].bTime > 0 ? game_globals.garray[i].bTime : 0), 0), + ws, bs, + (game_globals.garray[i].game_state.onMove == WHITE) ? 'W' : 'B', + game_globals.garray[i].game_state.moveNum); + } else { + pprintf_noformat(p, "%3d (%s %4d %-11.11s %4d %-10.10s) [%c%c%c%3d %3d] ", + i + 1, + (game_globals.garray[i].status == GAME_EXAMINE) ? "Exam." : "Setup", + game_globals.garray[i].white_rating, + game_globals.garray[i].white_name, + game_globals.garray[i].black_rating, + game_globals.garray[i].black_name, + (game_globals.garray[i].private) ? 'p' : ' ', + *bstr[game_globals.garray[i].type], + *rstr[game_globals.garray[i].rated], + game_globals.garray[i].wInitTime / 600, + game_globals.garray[i].wIncrement / 10); + pprintf_noformat(p, "%c: %2d\n", + (game_globals.garray[i].game_state.onMove == WHITE) ? 'W' : 'B', + game_globals.garray[i].game_state.moveNum); + } + } + if (count < totalcount) + pprintf(p, "\n %d game%s displayed (of %d in progress).\n", count, + (count == 1) ? "" : "s", totalcount); + else + pprintf(p, "\n %d game%s displayed.\n", totalcount, (totalcount == 1) ? "" : "s"); + } + free(sortedgames); + } + return COM_OK; +} + +static int do_observe(int p, int obgame) +{ + struct player *pp = &player_globals.parray[p]; + if ((game_globals.garray[obgame].private) && (pp->adminLevel < ADMIN_ADMIN)) { + pprintf(p, "Sorry, game %d is a private game.\n", obgame + 1); + return COM_OK; + } + if ((game_globals.garray[obgame].white == p) || (game_globals.garray[obgame].black == p)) { + if ((game_globals.garray[obgame].status != GAME_EXAMINE) || (game_globals.garray[obgame].status != GAME_SETUP)) { + pprintf(p, "You cannot observe a game that you are playing.\n"); + return COM_OK; + } + } + if (player_is_observe(p, obgame)) { + pprintf(p, "Removing game %d from observation list.\n", obgame + 1); + player_remove_observe(p, obgame); + } else { + if (!player_add_observe(p, obgame)) { + pprintf(p, "You are now observing game %d.\n", obgame + 1); + send_board_to(obgame, p); + } else { + pprintf(p, "You are already observing the maximum number of games.\n"); + } + } + return COM_OK; +} + +void unobserveAll(int p) +{ + struct player *pp = &player_globals.parray[p]; + int i; + + for (i = 0; i < pp->num_observe; i++) { + pprintf(p, "Removing game %d from observation list.\n", + pp->observe_list[i] + 1); + } + pp->num_observe = 0; + return; +} + +int com_unobserve(int p, param_list param) +{ + int gNum, p1; + + if (param[0].type == TYPE_NULL) { + unobserveAll(p); + return COM_OK; + } + gNum = GameNumFromParam(p, &p1, ¶m[0]); + if (gNum < 0) + return COM_OK; + if (!player_is_observe(p, gNum)) { + pprintf(p, "You are not observing game %d.\n", gNum); + } else { + player_remove_observe(p, gNum); + pprintf(p, "Removing game %d from observation list.\n", gNum + 1); + } + return COM_OK; +} + +int com_observe(int p, param_list param) +{ + struct player *pp = &player_globals.parray[p]; + int i; + int p1, obgame; + + if (param[0].type == TYPE_NULL) + return COM_BADPARAMETERS; + if ((pp->game >=0) &&(game_globals.garray[pp->game].status == GAME_EXAMINE)) { + pprintf(p, "You are still examining a game.\n"); + return COM_OK; + } + if ((pp->game >=0) &&(game_globals.garray[pp->game].status == GAME_SETUP)) { + pprintf(p, "You are still setting up a position.\n"); + return COM_OK; + } + if (param[0].type == TYPE_NULL) { + unobserveAll(p); + return COM_OK; + } + obgame = GameNumFromParam(p, &p1, ¶m[0]); + if (obgame < 0) + return COM_OK; + + if ((obgame >= game_globals.g_num) || ((game_globals.garray[obgame].status != GAME_ACTIVE) && + (game_globals.garray[obgame].status != GAME_EXAMINE) && + (game_globals.garray[obgame].status != GAME_SETUP))) { + pprintf(p, "There is no such game.\n"); + return COM_OK; + } + if ((p1 >= 0) && (player_globals.parray[p1].simul_info != NULL) && (player_globals.parray[p1].simul_info->numBoards)) { + for (i = 0; i < player_globals.parray[p1].simul_info->numBoards; i++) + if (player_globals.parray[p1].simul_info->boards[i] >= 0) + do_observe(p, player_globals.parray[p1].simul_info->boards[i]); + } else + do_observe(p, obgame); + return COM_OK; +} + +int com_allobservers(int p, param_list param) +{ + struct player *pp = &player_globals.parray[p]; + int obgame; + int p1; + int start, end; + int g; + int first; + + if (param[0].type == TYPE_NULL) { + obgame = -1; + } else { + obgame = GameNumFromParam(p, &p1, ¶m[0]); + if (obgame < 0) + return COM_OK; + } + if (obgame == -1) { + start = 0; + end = game_globals.g_num; + } else if ((obgame >= game_globals.g_num) || ((obgame < game_globals.g_num) + && ((game_globals.garray[obgame].status != GAME_ACTIVE) + && (game_globals.garray[obgame].status != GAME_EXAMINE) + && (game_globals.garray[obgame].status != GAME_SETUP)))) { + pprintf(p, "There is no such game.\n"); + return COM_OK; + } else { + start = obgame; + end = obgame + 1; + } + + /* list games being played */ + + for (g = start; g < end; g++) { + if ((game_globals.garray[g].status == GAME_ACTIVE) && + ((pp->adminLevel > 0) || (game_globals.garray[g].private == 0))) { + for (first = 1, p1 = 0; p1 < player_globals.p_num; p1++) { + if ((player_globals.parray[p1].status != PLAYER_EMPTY) && (player_is_observe(p1, g))) { + if (first) { + pprintf(p, "Observing %2d [%s vs. %s]:", + g + 1, + player_globals.parray[game_globals.garray[g].white].name, + player_globals.parray[game_globals.garray[g].black].name); + first = 0; + } + pprintf(p, " %s%s", (player_globals.parray[p1].game >=0) ? "#" : "", player_globals.parray[p1].name); + } + } + if (!first) + pprintf(p, "\n"); + } + } + + /* list games being examined last */ + + for (g = start; g < end; g++) { + if (((game_globals.garray[g].status == GAME_EXAMINE) || (game_globals.garray[g].status == GAME_SETUP)) && + ((pp->adminLevel > 0) || (game_globals.garray[g].private == 0))) { + for (first = 1, p1 = 0; p1 < player_globals.p_num; p1++) { + if ((player_globals.parray[p1].status != PLAYER_EMPTY) && (player_is_observe(p1, g) || + (player_globals.parray[p1].game == g))) { + if (first) { + if (strcmp(game_globals.garray[g].white_name, game_globals.garray[g].black_name)) { + pprintf(p, "Examining %2d [%s vs %s]:", g + 1, + game_globals.garray[g].white_name, game_globals.garray[g].black_name); + } else { + pprintf(p, "Examining %2d (scratch):", g + 1); + } + first = 0; + } + pprintf(p, " %s%s", (player_globals.parray[p1].game == g) ? "#" : "", player_globals.parray[p1].name); + } + } + if (!first) + pprintf(p, "\n"); + } + } + return COM_OK; +} + +int com_unexamine(int p, param_list param) +{ + struct player *pp = &player_globals.parray[p]; + int g, p1, flag = 0; + + if ((pp->game <0) || ((game_globals.garray[pp->game].status != GAME_EXAMINE) && (game_globals.garray[pp->game].status != GAME_SETUP))) { + pprintf(p, "You are not examining any games.\n"); + return COM_OK; + } + g = pp->game; + pp->game = -1; + for (p1 = 0; p1 < player_globals.p_num; p1++) { + if (player_globals.parray[p1].status != PLAYER_PROMPT) + continue; + if ((player_globals.parray[p1].game == g) &&(p != p1)) { + /* ok - there are other examiners to take over the game */ + flag = 1; + } + if ((player_is_observe(p1, g)) || (player_globals.parray[p1].game == g)) { + pprintf(p1, "%s stopped examining game %d.\n", pp->name, g + 1); + } + } + if (!flag) { + for (p1 = 0; p1 < player_globals.p_num; p1++) { + if (player_globals.parray[p1].status != PLAYER_PROMPT) + continue; + if (player_is_observe(p1, g)) { + pprintf(p1, "There are no examiners.\n"); + pcommand(p1, "unobserve %d", g + 1); + } + } + game_remove(g); + } + pprintf(p, "You are no longer examining game %d.\n", g + 1); + announce_avail(p); + return COM_OK; +} + +int com_mexamine(int p, param_list param) +{ + struct player *pp = &player_globals.parray[p]; + int g, p1, p2; + + if ((pp->game <0) || + ((game_globals.garray[pp->game].status != GAME_EXAMINE) && + (game_globals.garray[pp->game].status != GAME_SETUP))) { + pprintf(p, "You are not examining any games.\n"); + return COM_OK; + } + p1 = player_find_part_login(param[0].val.word); + if (p1 < 0) { + pprintf(p, "No user named \"%s\" is logged in.\n", param[0].val.word); + return COM_OK; + } + g = pp->game; + if (!player_is_observe(p1, g)) { + pprintf(p, "%s must observe the game you are analysing.\n", player_globals.parray[p1].name); + return COM_OK; + } else { + if (player_globals.parray[p1].game >=0) { + pprintf(p, "%s is already analysing the game.\n", player_globals.parray[p1].name); + return COM_OK; + } + /* if we get here - let's make him examiner of the game */ + unobserveAll(p1); /* fix for Xboard */ + decline_withdraw_offers(p1, -1, PEND_MATCH,DO_DECLINE | DO_WITHDRAW); + decline_withdraw_offers(p1, -1, PEND_SIMUL,DO_WITHDRAW); + + player_globals.parray[p1].game = g; /* yep - it really is that easy :-) */ + pprintf(p1, "You are now examiner of game %d.\n", g + 1); + send_board_to(g, p1); /* pos not changed - but fixes Xboard */ + for (p2 = 0; p2 < player_globals.p_num; p2++) { + if (player_globals.parray[p2].status != PLAYER_PROMPT) + continue; + if (p2 == p1) + continue; + if ((player_is_observe(p2, g)) || (player_globals.parray[p2].game == g)) { + pprintf_prompt(p2, "%s is now examiner of game %d.\n", player_globals.parray[p1].name, g + 1); + } + } + } + if (CheckPFlag(p2, PFLAG_OPEN)) /* was open */ + announce_notavail(p2); + return COM_OK; +} + +int com_moves(int p, param_list param) +{ + struct player *pp = &player_globals.parray[p]; + int g; + int p1; + + if (param[0].type == TYPE_NULL) { + if (pp->game >=0) { + g = pp->game; + } else if (pp->num_observe) { + for (g = 0; g < pp->num_observe; g++) { + pprintf(p, "%s\n", movesToString(pp->observe_list[g], 0)); + } + return COM_OK; + } else { + pprintf(p, "You are neither playing, observing nor examining a game.\n"); + return COM_OK; + } + } else { + g = GameNumFromParam(p, &p1, ¶m[0]); + if (g < 0) + return COM_OK; + } + if ((g < 0) || (g >= game_globals.g_num) || ((game_globals.garray[g].status != GAME_ACTIVE) && + (game_globals.garray[g].status != GAME_EXAMINE) && + (game_globals.garray[g].status != GAME_SETUP))) { + pprintf(p, "There is no such game.\n"); + return COM_OK; + } + if ((game_globals.garray[g].white != p) && (game_globals.garray[g].black != p) && (game_globals.garray[g].private) && (pp->adminLevel < ADMIN_ADMIN)) { + pprintf(p, "Sorry, that is a private game.\n"); + return COM_OK; + } + pprintf(p, "%s\n", movesToString(g, 0)); /* pgn may break interfaces? */ + return COM_OK; +} + +int com_mailmoves(int p, param_list param) +{ + struct player *pp = &player_globals.parray[p]; + int g; + int p1; + char subj[81]; + + if (!CheckPFlag(p, PFLAG_REG)) { + pprintf (p,"Unregistered players cannot use mailmoves.\n"); + return COM_OK; + } + + if (param[0].type == TYPE_NULL) { + if (pp->game >=0) { + g = pp->game; + } else { + pprintf(p, "You are neither playing, observing nor examining a game.\n"); + return COM_OK; + } + } else { + g = GameNumFromParam(p, &p1, ¶m[0]); + if (g < 0) + return COM_OK; + } + if ((g < 0) || (g >= game_globals.g_num) || ((game_globals.garray[g].status != GAME_ACTIVE) && (game_globals.garray[g].status != GAME_EXAMINE))) { + pprintf(p, "There is no such game.\n"); + return COM_OK; + } + if ((game_globals.garray[g].white != p) && (game_globals.garray[g].black != p) && (game_globals.garray[g].private) && (pp->adminLevel < ADMIN_ADMIN)) { + pprintf(p, "Sorry, that is a private game.\n"); + return COM_OK; + } + sprintf(subj, "FICS game report %s vs %s", game_globals.garray[g].white_name, game_globals.garray[g].black_name); + if (mail_string_to_user(p, subj, + movesToString(g, CheckPFlag(p, PFLAG_PGN)))) { + pprintf(p, "Moves NOT mailed, perhaps your address is incorrect.\n"); + } else { + pprintf(p, "Moves mailed.\n"); + } + return COM_OK; +} + +static int old_mail_moves(int p,int mail, param_list param) +{ + int p1, connected; + int count; + FILE *fp; + char fname[MAX_FILENAME_SIZE]; + char tmp[2048]; + char *ptmp = tmp; + + if (mail && !CheckPFlag(p, PFLAG_REG)) { + pprintf (p,"Unregistered players cannot use mailoldmoves.\n"); + return COM_OK; + } + + if (param[0].type == TYPE_WORD) { + if (!FindPlayer(p, param[0].val.word, &p1, &connected)) + return COM_OK; + } else { + p1 = p; + connected = 1; + } + + sprintf(fname, "%s/player_data/%c/%s.%s", STATS_DIR, + player_globals.parray[p1].login[0], player_globals.parray[p1].login, STATS_GAMES); + fp = fopen_s(fname, "r"); /* old moves now looks in history to save mem - DAV */ + + if (!fp) { + pprintf (p,"There is no old game for %s.\n", player_globals.parray[p1].name); + if (!connected) + player_remove(p1); + return COM_OK; + } + + while (!feof(fp)) + fgets(tmp, 1024, fp); + sscanf(ptmp, "%d", &count); + fclose(fp); /* find the last game played in history */ + + pprintf (p,"Last game for %s was history game %d.\n",player_globals.parray[p1].name,count); + + if (mail) + pcommand (p,"mailstored %s %d",player_globals.parray[p1].name,count); + else + pcommand (p,"smoves %s %d",player_globals.parray[p1].name,count); + + if (!connected) + player_remove(p1); + + return COM_OK; +} + +int com_oldmoves(int p, param_list param) +{ + return old_mail_moves(p , 0, param); +} + +int com_mailoldmoves(int p, param_list param) +{ + return old_mail_moves(p , 1, param); +} + +void ExamineScratch(int p, param_list param,int setup) +{ + struct player *pp = &player_globals.parray[p]; + char category[100], board[100], parsebuf[100]; + char *val; + int confused = 0; + int g; + + category[0] = '\0'; + board[0] = '\0'; + + if ((param[0].val.string != pp->name) && + (param[1].type == TYPE_WORD)) { + strcpy(category, param[0].val.string); + strcpy(board, param[1].val.string); + } else if (param[1].type != TYPE_NULL) { + + val = param[1].val.string; + + while (!confused && (sscanf(val, " %99s", parsebuf) == 1)) { + val = eatword(eatwhite(val)); + if ((category[0] != '\0') && (board[0] == '\0')) + strcpy(board, parsebuf); + else if (isdigit(*parsebuf)) { + pprintf(p, "You can't specify time controls.\n"); + return; + } else if (category[0] == '\0') + strcpy(category, parsebuf); + else + confused = 1; + } + if (confused) { + pprintf(p, "Can't interpret %s in match command.\n", parsebuf); + return; + } + } + + + if (category[0] && !board[0]) { + pprintf(p, "You must specify a board and a category.\n"); + return; + } + + g = game_new(); + + unobserveAll(p); + + decline_withdraw_offers(p, -1, PEND_MATCH,DO_DECLINE | DO_WITHDRAW); + decline_withdraw_offers(p, -1, PEND_SIMUL,DO_WITHDRAW); + + game_globals.garray[g].wInitTime = game_globals.garray[g].wIncrement = 0; + game_globals.garray[g].bInitTime = game_globals.garray[g].bIncrement = 0; + game_globals.garray[g].timeOfStart = tenth_secs(); + game_globals.garray[g].wTime = game_globals.garray[g].bTime = 0; + game_globals.garray[g].rated = 0; + game_globals.garray[g].clockStopped = 0; + game_globals.garray[g].type = TYPE_UNTIMED; + game_globals.garray[g].white = game_globals.garray[g].black = p; + game_globals.garray[g].startTime = tenth_secs(); + game_globals.garray[g].lastMoveTime = game_globals.garray[g].startTime; + game_globals.garray[g].lastDecTime = game_globals.garray[g].startTime; + game_globals.garray[g].totalHalfMoves = 0; + + pp->side = WHITE; /* oh well... */ + pp->game = g; + + + if (!setup) + pprintf(p, "Starting a game in examine (scratch) mode.\n"); + else + pprintf(p, "Starting a game in examine (setup) mode.\n"); + + if (category[0]) { + pprintf(p, "Loading from catagory: %s, board: %s.\n", category, board); + } + + if (setup) { + board_clear(&game_globals.garray[g].game_state); + game_globals.garray[g].status = GAME_SETUP; + } else { + game_globals.garray[g].status = GAME_EXAMINE; + if (board_init(g,&game_globals.garray[g].game_state, category, board)) { + pprintf(p, "PROBLEM LOADING BOARD. Examine Aborted.\n"); + d_printf( "CHESSD: PROBLEM LOADING BOARD. Examine Aborted.\n"); + pp->game = -1; + game_remove(g); + return; + } + } + + game_globals.garray[g].game_state.gameNum = g; + strcpy(game_globals.garray[g].white_name, pp->name); + strcpy(game_globals.garray[g].black_name, pp->name); + game_globals.garray[g].white_rating = game_globals.garray[g].black_rating = pp->s_stats.rating; + + send_boards(g); + if (CheckPFlag(p, PFLAG_OPEN)) /*was open */ + announce_notavail(p); +} + +static int ExamineStored(FILE * fp, int p, char type) +{ + struct player *pp = &player_globals.parray[p]; + int g; + char category[100], board[100]; + struct game *gg; + + unobserveAll(p); + + decline_withdraw_offers(p, -1, PEND_MATCH,DO_DECLINE | DO_WITHDRAW); + decline_withdraw_offers(p, -1, PEND_SIMUL,DO_WITHDRAW); + + g = game_new(); + gg = &game_globals.garray[g]; + category[0] = '\0'; + board[0] = '\0'; + if (board_init(g,&gg->game_state, category, board)) { + pprintf(p, "PROBLEM LOADING BOARD. Examine Aborted.\n"); + d_printf( "CHESSD: PROBLEM LOADING BOARD %s %s. Examine Aborted.\n", + category, board); + game_remove(g); + return -1; + } + + gg->status = GAME_EXAMINE; + + if (type == 'w' || type == 'n') { + if (ReadGameAttrs_exam(fp, g) < 0) { + pprintf(p, "Either this is an old wild/nonstandard game or the gamefile is corrupt.\n"); + game_remove(g); + return -1; + } + } else if (ReadGameAttrs(fp, g) < 0) { + pprintf(p, "Gamefile is corrupt; please notify an admin.\n"); + game_remove(g); + return -1; + } + + gg->totalHalfMoves = gg->numHalfMoves; + gg->numHalfMoves = 0; + gg->revertHalfMove = 0; + gg->white = p; + gg->black = p; + gg->game_state.gameNum = g; + + gg->startTime = tenth_secs(); + gg->lastMoveTime = gg->startTime; + gg->lastDecTime = gg->startTime; + + pp->side = WHITE; /* oh well... */ + pp->game = g; + + send_boards(g); + if (CheckPFlag(p, PFLAG_OPEN)) /* was open */ + announce_notavail(p); + + return g; +} + +static void ExamineAdjourned(int p, int p1, int p2) +{ + FILE *fp; + char *p1Login, *p2Login; + int g; + + p1Login = player_globals.parray[p1].login; + p2Login = player_globals.parray[p2].login; + + fp = fopen_p("%s/%c/%s-%s", "r", ADJOURNED_DIR, *p1Login, p1Login, p2Login); + if (!fp) fp = fopen_p("%s/%c/%s-%s", "r", ADJOURNED_DIR, *p2Login, p1Login, p2Login); + if (!fp) fp = fopen_p("%s/%c/%s-%s", "r", ADJOURNED_DIR, *p2Login, p2Login, p1Login); + if (!fp) fp = fopen_p("%s/%c/%s-%s", "r", ADJOURNED_DIR, *p1Login, p2Login, p1Login); + if (!fp) { + pprintf(p, "No stored game between \"%s\" and \"%s\".\n", + player_globals.parray[p1].name, player_globals.parray[p2].name); + return; + } + /* Assume old wild games are of type blitz - adjudicators should be + careful */ + g = ExamineStored(fp, p,'b'); + fclose(fp); + + if (g >= 0) { + if (game_globals.garray[g].white_name[0] == '\0') + strcpy(game_globals.garray[g].white_name, p1Login); + if (game_globals.garray[g].black_name[0] == '\0') + strcpy(game_globals.garray[g].black_name, p2Login); + } +} + +/* type is now returned because prior to V1.7.1 loading a wild game for + examining was impossible since the initial position was not saved. + Only types blitz,standard,lightning and untimed may be loaded for + examining if the gamefile version is less than 4 */ + +static char *FindHistory(int p, int p1, int game,char* type) +{ + FILE *fpHist; + static char fileName[MAX_FILENAME_SIZE]; + int index; + long when; + char typestr[4]; + + sprintf(fileName, "%s/player_data/%c/%s.%s", STATS_DIR, + player_globals.parray[p1].login[0], player_globals.parray[p1].login, STATS_GAMES); + fpHist = fopen_s(fileName, "r"); + if (fpHist == NULL) { + pprintf(p, "No games in history for %s.\n", player_globals.parray[p1].name); + return(NULL); + } + do { + fscanf(fpHist, "%d %*c %*d %*c %*d %*s %s %*d %*d %*d %*d %*s %*s %ld", + &index, typestr, &when); + } while (!feof(fpHist) && index != game); + + if (feof(fpHist)) { + pprintf(p, "There is no history game %d for %s.\n", game, player_globals.parray[p1].name); + fclose(fpHist); + return(NULL); + } + fclose(fpHist); + + if (typestr[0] != 'p') + *type = typestr[0]; + else + *type = typestr[1]; + + sprintf(fileName, "%s/%ld/%ld", HISTORY_DIR, when % 100, when); + return(fileName); +} + +/* I want to know how game ended/ECO code */ + +static char *FindHistory2(int p, int p1,int game, char* Eco,char* End) +{ + FILE *fpHist; + static char fileName[MAX_FILENAME_SIZE]; + int index; + long when; + + sprintf(fileName, "%s/player_data/%c/%s.%s", STATS_DIR, + player_globals.parray[p1].login[0], player_globals.parray[p1].login, STATS_GAMES); + fpHist = fopen_s(fileName, "r"); + if (fpHist == NULL) { + pprintf(p, "No games in history for %s.\n", player_globals.parray[p1].name); + return(NULL); + } + do { + fscanf(fpHist, "%d %*c %*d %*c %*d %*s %*s %*d %*d %*d %*d %s %s %ld", + &index, Eco, End, &when); + } while (!feof(fpHist) && index != game); + + if (feof(fpHist)) { + pprintf(p, "There is no history game %d for %s.\n", game, player_globals.parray[p1].name); + fclose(fpHist); + return(NULL); + } + fclose(fpHist); + + sprintf(fileName, "%s/%ld/%ld", HISTORY_DIR, when % 100, when); + return(fileName); +} + +int com_wname(int p, param_list param) +{ + struct player *pp = &player_globals.parray[p]; + + int g = pp->game; + + if ((g < 0) || + ((g >= 0) && + !((game_globals.garray[g].status != GAME_EXAMINE) || (game_globals.garray[g].status != GAME_SETUP)))) { + pprintf (p, "You are not examining or setting up a game.\n"); + return COM_OK; + } + + if (param[0].type == TYPE_NULL) + strcpy (game_globals.garray[g].white_name,pp->name); + else { + + if (strlen (param[0].val.word) > MAX_LOGIN_NAME - 1) { + pprintf (p,"The maximum length of a name is %d characters.\n",MAX_LOGIN_NAME - 1); + return COM_OK; + } else + strcpy (game_globals.garray[g].white_name,param[0].val.word); + } + + send_boards(g); + return COM_OK; +} + +int com_bname(int p, param_list param) +{ + struct player *pp = &player_globals.parray[p]; + + int g = pp->game; + + if ((g < 0) || + ((g >= 0) && + !((game_globals.garray[g].status != GAME_EXAMINE) || (game_globals.garray[g].status != GAME_SETUP)))) { + pprintf (p, "You are not examining or setting up a game.\n"); + return COM_OK; + } + + if (param[0].type == TYPE_NULL) + strcpy (game_globals.garray[g].black_name,pp->name); + else { + + if (strlen (param[0].val.word) > MAX_LOGIN_NAME - 1) { + pprintf (p,"The maximum length of a name is %d characters.\n",MAX_LOGIN_NAME - 1); + return COM_OK; + } else + strcpy (game_globals.garray[g].black_name,param[0].val.word); + } + + send_boards(g); + return COM_OK; +} + +static void ExamineHistory(int p, int p1, int game) +{ + char *fileName; + char type; + + fileName = FindHistory(p, p1, game,&type); + if (fileName) { + FILE *fpGame = fopen_p("%s", "r", fileName); + if (fpGame == NULL) { + pprintf(p, "History game %d not available for %s.\n", + game, player_globals.parray[p1].name); + } else { + ExamineStored(fpGame, p,type); + fclose(fpGame); + } + } +} + +static void ExamineJournal(int p,int p1,char slot) +{ + struct player *pp = &player_globals.parray[p]; + char* name_from = player_globals.parray[p1].login; + char type; + FILE *fpGame; + + if (CheckPFlag(p1, PFLAG_JPRIVATE) && (p != p1) + && (pp->adminLevel < ADMIN_ADMIN)) { + pprintf (p,"Sorry, this journal is private.\n"); + return; + } + + if ((slot - 'a' + 1) > MAX_JOURNAL && + !check_admin(p1, ADMIN_ADMIN) && + !titled_player(p,player_globals.parray[p1].login)) { + pprintf(p,"%s's maximum journal entry is %c\n", + player_globals.parray[p1].name, + toupper((char)(MAX_JOURNAL + 'A' - 1))); + return; + } + + fpGame = fopen_p("%s/%c/%s.%c", "r", JOURNAL_DIR, name_from[0],name_from,slot); + if (fpGame == NULL) { + pprintf(p, "Journal entry %c is not available for %s.\n", toupper (slot), + player_globals.parray[p1].name); + } else { + char *fname; + asprintf(&fname, "%s/player_data/%c/%s.journal", + STATS_DIR, name_from[0],name_from); + slot = toupper(slot); + + if ((type = get_journalgame_type (p,fname,slot)) == '\0') { + pprintf(p, "Journal entry %c is not available for %s or is corrupt.\n", + slot, player_globals.parray[p1].name); + } else { + ExamineStored(fpGame, p,type); + } + + free(fname); + fclose (fpGame); + } +} + +int com_examine(int p, param_list param) +{ + struct player *pp = &player_globals.parray[p]; + int p1, p2 = p, p1conn, p2conn = 1; + char* wincstring; + char fname[MAX_FILENAME_SIZE]; + + if (pp->game >=0) { + if ((game_globals.garray[pp->game].status == GAME_EXAMINE) || + (game_globals.garray[pp->game].status == GAME_SETUP)) + pprintf(p, "You are already examining a game.\n"); + else + pprintf(p, "You are playing a game.\n"); + } else if (param[0].type == TYPE_NULL) { + ExamineScratch(p, param, 0); + } else if (param[0].type != TYPE_NULL) { + if ((param[1].type == TYPE_NULL) && (!strcmp(param[0].val.word,"setup"))) { + ExamineScratch(p, param, 1); + return COM_OK; + } else if (param[1].type == TYPE_WORD) { + sprintf(fname, "%s/%s/%s", BOARD_DIR, param[0].val.word, param[1].val.word); + if (file_exists(fname)) { + ExamineScratch(p, param, 0); + return COM_OK; + } + } + if (!FindPlayer(p, param[0].val.word, &p1, &p1conn)) + return COM_OK; + + if (param[1].type == TYPE_INT) + ExamineHistory(p, p1, param[1].val.integer); + else { + if (param[1].type == TYPE_WORD) { + + /* Lets check the journal */ + wincstring = param[1].val.word; + if ((strlen(wincstring) == 1) && (isalpha(wincstring[0]))) { + ExamineJournal(p,p1,wincstring[0]); + if (!p1conn) + player_remove(p1); + return COM_OK; + } else { + if (!FindPlayer(p, param[1].val.word, &p2, &p2conn)) { + if (!p1conn) + player_remove(p1); + return COM_OK; + } + } + } + ExamineAdjourned(p, p1, p2); + if (!p2conn) + player_remove(p2); + } + if (!p1conn) + player_remove(p1); + } + return COM_OK; +} + +int com_stored(int p, param_list param) +{ + int count = 0; + DIR *dirp; + struct dirent *dp; + + int p1, connected; + char dname[MAX_FILENAME_SIZE]; + + if (param[0].type == TYPE_WORD) { + if (!FindPlayer(p, param[0].val.word, &p1, &connected)) + return COM_OK; + } else { + p1 = p; + connected = 1; + } + + sprintf(dname, "%s/%c", ADJOURNED_DIR, player_globals.parray[p1].login[0]); + dirp = opendir(dname); + if (!dirp) { + pprintf(p, "Player %s has no games stored.\n", player_globals.parray[p1].name); + if (!connected) + player_remove(p1); + return COM_OK; + } + pprintf(p, "Stored games for %s:\n", player_globals.parray[p1].name); + for (dp = readdir(dirp); dp != NULL; dp = readdir(dirp)) { + if (file_has_pname(dp->d_name, player_globals.parray[p1].login)) { + pprintf(p, " %s vs. %s\n", file_wplayer(dp->d_name), file_bplayer(dp->d_name)); + count++; + } + } + + closedir(dirp); + pprintf (p,"%d stored game%sfound.\n",count,(count == 1 ? " " : "s ")); + if (!connected) + player_remove(p1); + return COM_OK; +} + +static void stored_mail_moves(int p, int mail, param_list param) +{ + struct player *pp = &player_globals.parray[p]; + int wp, wconnected, bp, bconnected, gotit = 0; + int g = -1; + char type; /* dummy */ + char* wincstring = NULL; + char* name_from = NULL; + char* fileName = NULL; + char fileName2[MAX_FILENAME_SIZE]; + FILE* fpGame; + + if (mail && !CheckPFlag(p, PFLAG_REG)) { + pprintf (p,"Unregistered players cannot use mailstored.\n"); + return; + } + + if (!FindPlayer(p, param[0].val.word, &wp, &wconnected)) + return; + + if (param[1].type == TYPE_INT) { /* look for a game from history */ + fileName = FindHistory(p, wp, param[1].val.integer,&type); + if (fileName != NULL) { + fpGame = fopen_s(fileName, "r"); + if (fpGame == NULL) { + pprintf(p, "History game %d not available for %s.\n", param[1].val.integer, player_globals.parray[wp].name); + } else { + g = game_new(); + if (ReadGameAttrs(fpGame, g) < 0) + pprintf(p, "Gamefile is corrupt; please notify an admin.\n"); + else + gotit = 1; + fclose(fpGame); + } + } + } else { /* Let's test for journal */ + name_from = param[0].val.word; + wincstring = param[1].val.word; + if ((strlen(wincstring) == 1) && (isalpha(wincstring[0]))) { + if (CheckPFlag(wp, PFLAG_JPRIVATE) + && (pp->adminLevel < ADMIN_ADMIN) && (p != wp)) { + pprintf (p,"Sorry, the journal from which you are trying to fetch is private.\n"); + } else { + if (((wincstring[0] - 'a' + 1) > MAX_JOURNAL) && (player_globals.parray[wp].adminLevel < ADMIN_ADMIN) && (!titled_player(p,player_globals.parray[wp].login))) { + pprintf (p,"%s's maximum journal entry is %c\n",player_globals.parray[wp].name,toupper((char)(MAX_JOURNAL + 'A' - 1))); + } else { + sprintf(fileName2, "%s/%c/%s.%c", JOURNAL_DIR, name_from[0],name_from,wincstring[0]); + fpGame = fopen_s(fileName2, "r"); + if (fpGame == NULL) { + pprintf(p, "Journal entry %c is not available for %s.\n", toupper(wincstring[0]), + player_globals.parray[wp].name); + } else { + g = game_new(); + if (ReadGameAttrs(fpGame, g) < 0) + pprintf(p, "Journal entry is corrupt; please notify an admin.\n"); + else + gotit = 1; + fclose(fpGame); + } + } + } + } else { + + /* look for a stored game between the players */ + + if (FindPlayer(p, param[1].val.word, &bp, &bconnected)) { + g = game_new(); + if (game_read(g, wp, bp) >= 0) { /* look for a game white-black, */ + gotit = 1; + } else if (game_read(g, bp, wp) >= 0) { /* or black-white */ + gotit = 1; + } else { + pprintf(p, "There is no stored game %s vs. %s\n", player_globals.parray[wp].name, player_globals.parray[bp].name); + } + if (!bconnected) + player_remove(bp); + } + } + } + if (gotit) { + if (strcasecmp(pp->name, game_globals.garray[g].white_name) && strcasecmp(player_globals.parray[p] +.name, game_globals.garray[g].black_name) && game_globals.garray[g].private && (pp->adminLevel < ADMIN_ADMIN)) { + pprintf(p, "Sorry, that is a private game.\n"); + } else { + if (mail == 1) { /*Do mailstored */ + char subj[81]; + if (param[1].type == TYPE_INT) + sprintf(subj, "FICS history game: %s %d", player_globals.parray[wp].name, param[1].val.integer); + else + if ((strlen(wincstring) == 1) && (isalpha(wincstring[0]))) { + sprintf(subj, "FICS journal game %s vs %s", game_globals.garray[g].white_name, game_globals.garray[g].black_name); + } else { + sprintf(subj, "FICS adjourned game %s vs %s", game_globals.garray[g].white_name, game_globals.garray[g].black_name); + } + if (mail_string_to_user(p, subj, + movesToString(g, CheckPFlag(p, PFLAG_PGN)))) + pprintf(p, "Moves NOT mailed, perhaps your address is incorrect.\n"); + else + pprintf(p, "Moves mailed.\n"); + } else { + pprintf(p, "%s\n", movesToString(g, 0)); + } /* Do smoves */ + } + } + if (!wconnected) + player_remove(wp); + if (g != -1) + game_remove(g); +} + +/* Tidied up a bit but still messy */ + +int com_mailstored(int p, param_list param) +{ + stored_mail_moves(p, 1, param); + return COM_OK; +} + +int com_smoves(int p, param_list param) +{ + stored_mail_moves(p, 0, param); + return COM_OK; +} + +int com_sposition(int p, param_list param) +{ + struct player *pp = &player_globals.parray[p]; + int wp, wconnected, bp, bconnected, confused = 0; + int g; + + if (!FindPlayer(p, param[0].val.word, &wp, &wconnected)) + return (COM_OK); + if (!FindPlayer(p, param[1].val.word, &bp, &bconnected)) { + if (!wconnected) + player_remove(wp); + return (COM_OK); + } + + g = game_new(); + if (game_read(g, wp, bp) < 0) { /* if no game white-black, */ + if (game_read(g, bp, wp) < 0) { /* look for black-white */ + confused = 1; + pprintf(p, "There is no stored game %s vs. %s\n", player_globals.parray[wp].name, player_globals.parray[bp].name); + } else { + int tmp; + tmp = wp; + wp = bp; + bp = tmp; + tmp = wconnected; + wconnected = bconnected; + bconnected = tmp; + } + } + if (!confused) { + if ((wp != p) && (bp != p) && (game_globals.garray[g].private) && (pp->adminLevel < ADMIN_ADMIN)) { + pprintf(p, "Sorry, that is a private game.\n"); + } else { + game_globals.garray[g].white = wp; + game_globals.garray[g].black = bp; + game_globals.garray[g].startTime = tenth_secs(); + game_globals.garray[g].lastMoveTime = game_globals.garray[g].startTime; + game_globals.garray[g].lastDecTime = game_globals.garray[g].startTime; + pprintf(p, "Position of stored game %s vs. %s\n", player_globals.parray[wp].name, player_globals.parray[bp].name); + send_board_to(g, p); + } + } + game_remove(g); + if (!wconnected) + player_remove(wp); + if (!bconnected) + player_remove(bp); + return COM_OK; +} + +int com_forward(int p, param_list param) +{ + struct player *pp = &player_globals.parray[p]; + int nHalfMoves = 1; + int g, i; + int p1; + unsigned now; + + if (!((pp->game >=0) && ((game_globals.garray[pp->game].status == GAME_EXAMINE) || (game_globals.garray[pp->game].status == GAME_SETUP)))) { + pprintf(p, "You are not examining any games.\n"); + return COM_OK; + } + if (game_globals.garray[pp->game].status == GAME_SETUP) { + pprintf (p,"You can't move forward yet, the position is still being set up.\n"); + return COM_OK; + } + g = pp->game; + if (!strcmp(game_globals.garray[g].white_name, game_globals.garray[g].black_name)) { + pprintf(p, "You cannot go forward; no moves are stored.\n"); + return COM_OK; + } + if (param[0].type == TYPE_INT) { + nHalfMoves = param[0].val.integer; + } + if (game_globals.garray[g].numHalfMoves > game_globals.garray[g].revertHalfMove) { + pprintf(p, "Game %u: No more moves.\n", g); + return COM_OK; + } + if (game_globals.garray[g].numHalfMoves < game_globals.garray[g].totalHalfMoves) { + for (p1 = 0; p1 < player_globals.p_num; p1++) { + if (player_globals.parray[p1].status != PLAYER_PROMPT) + continue; + if (player_is_observe(p1, g) || player_globals.parray[p1].game == g) { + pprintf(p1, "Game %u: %s goes forward %d move%s.\n", + g, + pp->name, nHalfMoves, (nHalfMoves == 1) ? "" : "s"); + } + } + } + for (i = 0; i < nHalfMoves; i++) { + if (game_globals.garray[g].numHalfMoves < game_globals.garray[g].totalHalfMoves) { + execute_move(&game_globals.garray[g].game_state, &game_globals.garray[g].moveList[game_globals.garray[g].numHalfMoves], 1); + if (game_globals.garray[g].numHalfMoves + 1 > game_globals.garray[g].examMoveListSize) { + game_globals.garray[g].examMoveListSize += 20; /* Allocate 20 moves at a + time */ + game_globals.garray[g].examMoveList = (struct move_t *) realloc(game_globals.garray[g].examMoveList, sizeof(struct move_t) * game_globals.garray[g].examMoveListSize); + } + game_globals.garray[g].examMoveList[game_globals.garray[g].numHalfMoves] = game_globals.garray[g].moveList[game_globals.garray[g].numHalfMoves]; + game_globals.garray[g].revertHalfMove++; + game_globals.garray[g].numHalfMoves++; + } else { + for (p1 = 0; p1 < player_globals.p_num; p1++) { + if (player_globals.parray[p1].status != PLAYER_PROMPT) + continue; + if (player_is_observe(p1, g) || player_globals.parray[p1].game == g) { + pprintf(p1, "Game %u: End of game.\n", g); + } + } + break; + } + } + /* roll back time */ + if (game_globals.garray[g].game_state.onMove == WHITE) { + game_globals.garray[g].wTime += (game_globals.garray[g].lastDecTime - game_globals.garray[g].lastMoveTime); + } else { + game_globals.garray[g].bTime += (game_globals.garray[g].lastDecTime - game_globals.garray[g].lastMoveTime); + } + now = tenth_secs(); + if (game_globals.garray[g].numHalfMoves == 0) + game_globals.garray[g].timeOfStart = now; + game_globals.garray[g].lastMoveTime = now; + game_globals.garray[g].lastDecTime = now; + send_boards(g); + + if (game_globals.garray[g].revertHalfMove == game_globals.garray[g].totalHalfMoves) { + for (p1 = 0; p1 < player_globals.p_num; p1++) { + if (player_globals.parray[p1].status != PLAYER_PROMPT) continue; + if (player_is_observe(p1, g) || player_globals.parray[p1].game == g) { + pprintf(p1, "Game %u: %s %s\n", g, EndString(g,0), EndSym(g)); + } + } + } + + return COM_OK; +} + +int com_backward(int p, param_list param) +{ + struct player *pp = &player_globals.parray[p]; + int nHalfMoves = 1; + int g, i; + int p1; + unsigned now; + + if (!((pp->game >=0) && ((game_globals.garray[pp->game].status == GAME_EXAMINE) || (game_globals.garray[pp->game].status == GAME_SETUP)))) { + pprintf(p, "You are not examining any games.\n"); + return COM_OK; + } + if (game_globals.garray[pp->game].status == GAME_SETUP) { + pprintf (p,"You can't move backward yet, the postion is still being set up.\n"); + return COM_OK; + } + + g = pp->game; + if (param[0].type == TYPE_INT) { + nHalfMoves = param[0].val.integer; + } + if (game_globals.garray[g].numHalfMoves != 0) { + for (p1 = 0; p1 < player_globals.p_num; p1++) { + if (player_globals.parray[p1].status != PLAYER_PROMPT) + continue; + if (player_is_observe(p1, g) || player_globals.parray[p1].game == g) { + pprintf(p1, "Game %u: %s backs up %d move%s.\n", + g, + pp->name, nHalfMoves, (nHalfMoves == 1) ? "" : "s"); + } + } + } + for (i = 0; i < nHalfMoves; i++) { + if (backup_move(g, REL_EXAMINE) != MOVE_OK) { + for (p1 = 0; p1 < player_globals.p_num; p1++) { + if (player_globals.parray[p1].status != PLAYER_PROMPT) + continue; + if (player_is_observe(p1, g) || player_globals.parray[p1].game == g) { + pprintf(p1, "Game %u: Beginning of game.\n", g); + } + } + + break; + } + } + if (game_globals.garray[g].numHalfMoves < game_globals.garray[g].revertHalfMove) { + game_globals.garray[g].revertHalfMove = game_globals.garray[g].numHalfMoves; + } + /* roll back time */ + if (game_globals.garray[g].game_state.onMove == WHITE) { + game_globals.garray[g].wTime += (game_globals.garray[g].lastDecTime - game_globals.garray[g].lastMoveTime); + } else { + game_globals.garray[g].bTime += (game_globals.garray[g].lastDecTime - game_globals.garray[g].lastMoveTime); + } + now = tenth_secs(); + if (game_globals.garray[g].numHalfMoves == 0) + game_globals.garray[g].timeOfStart = now; + game_globals.garray[g].lastMoveTime = now; + game_globals.garray[g].lastDecTime = now; + send_boards(g); + return COM_OK; +} + +int com_revert(int p, param_list param) +{ + struct player *pp = &player_globals.parray[p]; + int nHalfMoves = 1; + int g, i; + int p1; + unsigned now; + + if (!((pp->game >=0) && ((game_globals.garray[pp->game].status == GAME_EXAMINE)|| (game_globals.garray[pp->game].status == GAME_SETUP)))) { + pprintf(p, "You are not examining any games.\n"); + return COM_OK; + } + if (game_globals.garray[pp->game].status == GAME_SETUP) { + pprintf (p,"You can't move revert yet, the position is still being set up.\n"); + return COM_OK; + } + g = pp->game; + nHalfMoves = game_globals.garray[g].numHalfMoves - game_globals.garray[g].revertHalfMove; + if (nHalfMoves == 0) { + pprintf(p, "Game %u: Already at mainline.\n", g); + return COM_OK; + } + if (nHalfMoves < 0) { /* eek - should NEVER happen! */ + d_printf( "OUCH! in com_revert: nHalfMoves < 0\n"); + return COM_OK; + } + for (p1 = 0; p1 < player_globals.p_num; p1++) { + if (player_globals.parray[p1].status != PLAYER_PROMPT) + continue; + if (player_is_observe(p1, g) || player_globals.parray[p1].game == g) { + pprintf(p1, "Game %u: %s reverts to mainline.\n", + g, pp->name); + } + } + for (i = 0; i < nHalfMoves; i++) { + backup_move(g, REL_EXAMINE);/* should never return error */ + } + /* roll back time */ + if (game_globals.garray[g].game_state.onMove == WHITE) { + game_globals.garray[g].wTime += (game_globals.garray[g].lastDecTime - game_globals.garray[g].lastMoveTime); + } else { + game_globals.garray[g].bTime += (game_globals.garray[g].lastDecTime - game_globals.garray[g].lastMoveTime); + } + now = tenth_secs(); + if (game_globals.garray[g].numHalfMoves == 0) + game_globals.garray[g].timeOfStart = now; + game_globals.garray[g].lastMoveTime = now; + game_globals.garray[g].lastDecTime = now; + send_boards(g); + return COM_OK; +} + +int com_history(int p, param_list param) +{ + int p1, connected; + char fname[MAX_FILENAME_SIZE]; + + if (param[0].type == TYPE_WORD) { + if (!FindPlayer(p, param[0].val.word, &p1, &connected)) + return COM_OK; + } else { + p1 = p; + connected = 1; + } + + sprintf(fname, "%s/player_data/%c/%s.%s", STATS_DIR, player_globals.parray[p1].login[0], + player_globals.parray[p1].login, STATS_GAMES); + pgames(p, p1, fname); + if (!connected) + player_remove(p1); + return COM_OK; +} + +int com_journal(int p, param_list param) +{ + struct player *pp = &player_globals.parray[p]; + int p1, connected; + char fname[MAX_FILENAME_SIZE]; + + if (param[0].type == TYPE_WORD) { + if (!FindPlayer(p, param[0].val.word, &p1, &connected)) + return COM_OK; + } else { + p1 = p; + connected = 1; + } + + if (!CheckPFlag(p1, PFLAG_REG)) { + pprintf (p,"Only registered players may keep a journal.\n"); + if (!connected) + player_remove(p1); + return COM_OK; + } + if (CheckPFlag(p1, PFLAG_JPRIVATE) && (p != p1) + && (pp->adminLevel < ADMIN_ADMIN)) { + pprintf (p,"Sorry, this journal is private.\n"); + if (!connected) + player_remove(p1); + return COM_OK; + } + sprintf(fname, "%s/player_data/%c/%s.%s", STATS_DIR, player_globals.parray[p1].login[0], + player_globals.parray[p1].login, STATS_JOURNAL); + pjournal(p, p1, fname); + if (!connected) + player_remove(p1); + return COM_OK; +} + +/* Remove a journal item */ + +int com_jkill(int p, param_list param) +{ + struct player *pp = &player_globals.parray[p]; + FILE* Journal; + char* kill = param[0].val.word; + char fname[MAX_FILENAME_SIZE]; + char fname_new[MAX_FILENAME_SIZE]; + int empty; + + if (!CheckPFlag(p, PFLAG_REG)) { + pprintf (p,"Only registered players may keep a journal.\n"); + return COM_OK; + } + + if ((strlen(kill) != 1) || (!(isalpha(kill[0])))) { + pprintf (p,"Journal entries are referenced by single letters.\n"); + return COM_OK; + } + + if (((kill[0] - 'a' + 1) > MAX_JOURNAL) && (pp->adminLevel < ADMIN_ADMIN) + && (!titled_player(p,pp->login))) { + pprintf (p,"Your maximum journal entry is %c\n",toupper ((char)(MAX_JOURNAL ++ 'A' - 1))); + return COM_OK; + } + + sprintf(fname, "%s/player_data/%c/%s.journal", + STATS_DIR, pp->login[0],pp->login); + sprintf (fname_new,"%s.w",fname); + + Journal = fopen_s(fname, "r"); + if (Journal == NULL) { + pprintf(p, "You don't have a journal.\n"); + return COM_OK; + } + + kill[0] = toupper(kill[0]); + + if (removejournalitem(p, kill[0], Journal,fname_new,&empty)) { + fclose (Journal); + rename (fname_new,fname); + if (empty) + unlink (fname); + sprintf(fname, "%s/%c/%s.%c", + JOURNAL_DIR, pp->login[0],pp->login,tolower(kill[0])); + unlink(fname); + pprintf (p,"Journal entry %c deleted.\n",kill[0]); + } else { + pprintf (p,"You have no journal entry %c.\n",kill[0]); + fclose (Journal); + unlink (fname_new); + } + return COM_OK; +} + +static void jsave_journalentry(int p,char save_spot,int p1,char from_spot,char* to_file) +{ + struct player *pp = &player_globals.parray[p]; + FILE *Game; + char fname[MAX_FILENAME_SIZE], fname2[MAX_FILENAME_SIZE]; + char* name_from = player_globals.parray[p1].login; + char* name_to = pp->login; + struct journal* j; + + sprintf(fname, "%s/%c/%s.%c", JOURNAL_DIR, name_from[0],name_from,from_spot); + Game = fopen_s(fname, "r"); + if (Game == NULL) { + pprintf(p, "Journal entry %c not available for %s.\n", toupper(from_spot), player_globals.parray[p1].name); + return; + } + fclose (Game); + + sprintf(fname2, "%s/%c/%s.%c", JOURNAL_DIR, name_to[0],name_to,save_spot); + + if (file_copy(fname, fname2) != 0) { + pprintf (p,"Copy in jsave_journalentry failed!\n"); + pprintf (p,"Please report this to an admin.\n"); + d_printf("CHESSD: Copy failed in jsave_journalentry\n"); + return; + } + + sprintf(fname, "%s/player_data/%c/%s.%s", STATS_DIR, name_from[0], + name_from, STATS_JOURNAL); + + j = (struct journal*) malloc (sizeof(struct journal)); + if (!journal_get_info(p,tolower(from_spot),j,fname)) { + free (j); + return; + } + + j->slot = toupper(save_spot); + addjournalitem(p, j, to_file); + + pprintf(p,"Journal entry %s %c saved in slot %c in journal.\n",player_globals.parray[p1].name, toupper(from_spot), toupper(save_spot)); + free (j); +} + +static void jsave_history(int p,char save_spot,int p1,int from,char* to_file) +{ + struct player *pp = &player_globals.parray[p]; + char Eco[100]; + char End[100]; + char jfname[MAX_FILENAME_SIZE]; + char* HistoryFname = FindHistory2(p, p1, from, Eco, End); + /* End symbol Mat Res, etc is the only thing we can't find out */ + char command[MAX_FILENAME_SIZE*2+3]; + char* name_to = pp->login; + FILE *Game; + int g; + struct journal* j; + + if (HistoryFname == NULL) { + return; + } + Game = fopen_s(HistoryFname, "r"); + if (Game == NULL) { + pprintf(p, "History game %d not available for %s.\n", + from, player_globals.parray[p1].name); + return; + } + + sprintf(jfname, "%s/%c/%s.%c", JOURNAL_DIR, name_to[0],name_to,save_spot); + unlink(jfname); /* necessary if cp is hard aliased to cp -i */ + sprintf(command, "cp %s %s",HistoryFname,jfname); + if (file_copy(HistoryFname, jfname) != 0) { + pprintf (p,"Copy in jsave_history failed!\n"); + pprintf (p,"Please report this to an admin.\n"); + d_printf("CHESSD: Copy failed in jsave_journalentry\n"); + return; + } + g = game_new(); /* Open a dummy game */ + + if (ReadGameAttrs(Game, g) < 0) { + pprintf (p,"Gamefile is corrupt. Please tell an admin.\n"); + game_remove(g); + fclose (Game); + return; + } + fclose (Game); + + j = (struct journal*) malloc (sizeof(struct journal)); + + if (game_globals.garray[g].private) { + j->type[0] = 'p'; + } else { + j->type[0] = ' '; + } + if (game_globals.garray[g].type == TYPE_BLITZ) { + j->type[1] = 'b'; + } else if (game_globals.garray[g].type == TYPE_WILD) { + j->type[1] = 'w'; + } else if (game_globals.garray[g].type == TYPE_STAND) { + j->type[1] = 's'; + } else if (game_globals.garray[g].type == TYPE_LIGHT) { + j->type[1] = 'l'; + } else if (game_globals.garray[g].type == TYPE_BUGHOUSE) { + j->type[1] = 'B'; + } else { + if (game_globals.garray[g].type == TYPE_NONSTANDARD) + j->type[1] = 'n'; + else + j->type[1] = 'u'; + } + if (game_globals.garray[g].rated) { + j->type[2] = 'r'; + } else { + j->type[2] = 'u'; + } + j->type[3] = '\0'; + + j->slot = toupper(save_spot); + strcpy (j->WhiteName, game_globals.garray[g].white_name); + j->WhiteRating = game_globals.garray[g].white_rating; + strcpy (j->BlackName, game_globals.garray[g].black_name); + j->BlackRating = game_globals.garray[g].black_rating; + j->t = game_globals.garray[g].wInitTime; + j->i = game_globals.garray[g].wIncrement; + strcpy (j->eco, Eco); + strcpy (j->ending, End); + strcpy (j->result, EndSym(g)); + + addjournalitem(p, j, to_file); + game_remove(g); + pprintf(p,"Game %s %d saved in slot %c in journal.\n", + player_globals.parray[p1].name, from, toupper(save_spot)); + free(j); +} + +int com_jsave(int p, param_list param) +{ + struct player *pp = &player_globals.parray[p]; + int p1, p1conn; + char* to = param[0].val.word; + char* from; + char fname[MAX_FILENAME_SIZE]; + + if (!CheckPFlag(p, PFLAG_REG)) { + pprintf (p,"Only registered players may keep a journal.\n"); + return COM_OK; + } + + if ((strlen(to) != 1) || (!(isalpha(to[0])))) { + pprintf (p,"Journal entries are referenced by single letters.\n"); + return COM_OK; + } + + if (((to[0] - 'a' + 1) > MAX_JOURNAL) && (pp->adminLevel < ADMIN_ADMIN) && (!titled_player(p,pp->login))) { + pprintf (p,"Your maximum journal entry is %c\n",toupper ((char)(MAX_JOURNAL + 'A' - 1))); + return COM_OK; + } + + if (!FindPlayer(p, param[1].val.word, &p1, &p1conn)) + return COM_OK; + + if (param[2].type == TYPE_INT) { + + /* grab from a history */ + sprintf (fname,"%s/player_data/%c/%s.%s",STATS_DIR,pp->login[0],pp->login, STATS_JOURNAL); + jsave_history(p, to[0], p1, param[2].val.integer,fname); + + } else { + + from = param[2].val.word; + + if ((strlen(from) != 1) || (!(isalpha(from[0])))) { + pprintf (p,"Journal entries are referenced by single letters.\n"); + if (!p1conn) + player_remove(p1); + return COM_OK; + } + + if (CheckPFlag(p1, PFLAG_JPRIVATE) + && (pp->adminLevel < ADMIN_ADMIN) && (p != p1)) { + pprintf (p,"Sorry, the journal from which you are trying to fetch is private.\n"); + + if (!p1conn) + player_remove(p1); + return COM_OK; + } + + if (((to[0] - 'a' + 1) > MAX_JOURNAL) && (player_globals.parray[p1].adminLevel < ADMIN_ADMIN) && (!titled_player(p,player_globals.parray[p1].login))) { + pprintf (p,"%s's maximum journal entry is %c\n",player_globals.parray[p1].name,toupper((char)(MAX_JOURNAL + 'A' - 1))); + if (!p1conn) + player_remove(p1); + return COM_OK; + } + if (( p == p1) && (to[0] == from [0])) { + pprintf (p,"Source and destination entries are the same.\n"); + return COM_OK; + } + + /* grab from a journal */ + + sprintf(fname, "%s/player_data/%c/%s.%s", STATS_DIR, pp->login[0], + pp->login, STATS_JOURNAL); + jsave_journalentry(p,to[0],p1, from[0], fname); + + } + if (!p1conn) + player_remove(p1); + return COM_OK; +} + +int com_refresh(int p, param_list param) +{ + struct player *pp = &player_globals.parray[p]; + int g, p1; + + if (param[0].type == TYPE_NULL) { + if (pp->game >= 0) { + send_board_to(pp->game, p); + } else { /* Do observing in here */ + if (pp->num_observe) { + for (g = 0; g < pp->num_observe; g++) { + send_board_to(pp->observe_list[g], p); + } + } else { + pprintf(p, "You are neither playing, observing nor examining a game.\n"); + return COM_OK; + } + } + } else { + g = GameNumFromParam (p, &p1, ¶m[0]); + if (g < 0) + return COM_OK; + if ((g >= game_globals.g_num) || ((game_globals.garray[g].status != GAME_ACTIVE) + && ((game_globals.garray[g].status != GAME_EXAMINE) + || (game_globals.garray[g].status != GAME_SETUP)))) { + pprintf(p, "No such game.\n"); + } else { + + int link = game_globals.garray[g].link; + + if ((game_globals.garray[g].private && pp->adminLevel==ADMIN_USER) && + (game_globals.garray[g].white != p) && (game_globals.garray[g].white != p1)) { + if (link != -1) { + if ((game_globals.garray[link].white != p) && (game_globals.garray[link].black != p)) { + pprintf (p, "Sorry, game %d is a private game.\n", g+1); + return COM_OK; + } + } + } + + if (game_globals.garray[g].private) + pprintf(p, "Refreshing static game %d\n", g+1); + send_board_to(g, p); + } + } + return COM_OK; +} + +int com_prefresh(int p, param_list param) +{ + struct player *pp = &player_globals.parray[p]; + int retval, part = pp->partner; + + if (part < 0) { + pprintf(p, "You do not have a partner.\n"); + return COM_OK; + } + retval = pcommand (p, "refresh %s", player_globals.parray[part].name); + if (retval == COM_OK) + return COM_OK_NOPROMPT; + else + return retval; +} diff --git a/lasker-2.2.3/src/obsproc.h b/lasker-2.2.3/src/obsproc.h new file mode 100644 index 0000000..47697d9 --- /dev/null +++ b/lasker-2.2.3/src/obsproc.h @@ -0,0 +1,11 @@ +/* Revision history: + name email yy/mm/dd Change + Dave Herscovici 95/11/26 Created +*/ + +#ifndef _OBSPROC_H +#define _OBSPROC_H + +#define MAX_JOURNAL 12 + +#endif /* _OBSPROC_H */ diff --git a/lasker-2.2.3/src/parsers/.cvsignore b/lasker-2.2.3/src/parsers/.cvsignore new file mode 100644 index 0000000..9b739a4 --- /dev/null +++ b/lasker-2.2.3/src/parsers/.cvsignore @@ -0,0 +1 @@ +parse_info.h diff --git a/lasker-2.2.3/src/parsers/CVS/Entries b/lasker-2.2.3/src/parsers/CVS/Entries new file mode 100644 index 0000000..fa1668e --- /dev/null +++ b/lasker-2.2.3/src/parsers/CVS/Entries @@ -0,0 +1,7 @@ +/.cvsignore/1.1/Tue Jun 18 14:03:29 2002// +/README/1.1/Mon Jun 24 04:45:36 2002// +/genparser.c/1.16/Sat Jun 29 00:06:16 2002// +/genparser.h/1.7/Sat Jun 29 00:06:16 2002// +/parser.c/1.13/Sat Jun 29 00:06:16 2002// +/genstruct.pl/1.14/Thu Jul 22 07:04:41 2004// +D diff --git a/lasker-2.2.3/src/parsers/CVS/Repository b/lasker-2.2.3/src/parsers/CVS/Repository new file mode 100644 index 0000000..5ba59f6 --- /dev/null +++ b/lasker-2.2.3/src/parsers/CVS/Repository @@ -0,0 +1 @@ +lasker/src/parsers diff --git a/lasker-2.2.3/src/parsers/CVS/Root b/lasker-2.2.3/src/parsers/CVS/Root new file mode 100644 index 0000000..c42ba94 --- /dev/null +++ b/lasker-2.2.3/src/parsers/CVS/Root @@ -0,0 +1 @@ +/home/cvs diff --git a/lasker-2.2.3/src/parsers/README b/lasker-2.2.3/src/parsers/README new file mode 100644 index 0000000..fa2dd2d --- /dev/null +++ b/lasker-2.2.3/src/parsers/README @@ -0,0 +1,45 @@ +genstruct is a system for marshalling/unmarshalling C structures. It +has a number of unusual features: + +- can handle a very wide range of C constructs +- produces a human-readable marshalled format +- can handle significant changes in the structures between marshalling + and unmarshalling +- works directly from C header files + +To see how to use it please take a look at test.c and test.h. I'm +afraid that the only documentation at the moment is these examples. + +Limitations +----------- + +genstruct cannot handle some types of C structures. In particular it +cannot handle structures where a single pointer is used more than once +(for example in doubly linked lists). Once I add reference counting +this should be fixed. + +A second problem is that genstruct works on the C headers before they +have been through the C pre-processor. This means that #ifdefs within +structures will screw things up badly. + +Finally, genstruct only handles structure definitions if they are +formatted in a certain way. For example this will work: + +GENSTRUCT struct foo { + char *s; + int x; +}; + +but this won't: + +GENSTRUCT typedef struct { + char *s; + int x; +} foo; + +This may be fixed in a future release. + + + -- + Andrew Tridgell + genstruct@tridgell.net diff --git a/lasker-2.2.3/src/parsers/genparser.c b/lasker-2.2.3/src/parsers/genparser.c new file mode 100644 index 0000000..7d4c8a9 --- /dev/null +++ b/lasker-2.2.3/src/parsers/genparser.c @@ -0,0 +1,788 @@ +/* + Copyright (C) Andrew Tridgell 2002 + + 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., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +/* + automatic marshalling/unmarshalling system for C structures +*/ + +#if STANDALONE +#define _GNU_SOURCE +#include +#include +#include +#include +#include +#include +#include +#include +#include "genparser.h" +#else +#include "includes.h" +#endif + +/* see if a range of memory is all zero. Used to prevent dumping of zero elements */ +static int all_zero(const char *ptr, unsigned size) +{ + int i; + if (!ptr) return 1; + for (i=0;i>4]; + p[2] = hexdig[c&0xF]; + p += 3; + } + } + + *p = 0; + + return ret; +} + +/* decode an escaped string from encode_bytes() into a buffer */ +static char *decode_bytes(const char *s, unsigned *len) +{ + char *ret, *p; + unsigned i; + ret = calloc(1, strlen(s)+1); /* worst case length */ + + if (*s == '{') s++; + + for (p=ret,i=0;s[i];i++) { + if (s[i] == '}') { + break; + } else if (s[i] == '\\') { + unsigned v; + if (sscanf(&s[i+1], "%02x", &v) != 1 || v > 255) { + free(ret); + return NULL; + } + *(unsigned char *)p = v; + p++; + i += 2; + } else { + *p++ = s[i]; + } + } + *p = 0; + + (*len) = (unsigned)(p - ret); + + return ret; +} + +/* the add*() functions deal with adding things to a struct + parse_string */ + +/* allocate more space if needed */ +static int addgen_alloc(struct parse_string *p, int n) +{ + if (p->length + n <= p->allocated) return 0; + p->allocated = p->length + n + 200; + p->s = realloc(p->s, p->allocated); + if (!p->s) { + errno = ENOMEM; + return -1; + } + return 0; +} + +/* add a character to the buffer */ +static int addchar(struct parse_string *p, char c) +{ + if (addgen_alloc(p, 2) != 0) { + return -1; + } + p->s[p->length++] = c; + p->s[p->length] = 0; + return 0; +} + +/* add a string to the buffer */ +static int addstr(struct parse_string *p, const char *s) +{ + int len = strlen(s); + if (addgen_alloc(p, len+1) != 0) { + return -1; + } + memcpy(p->s + p->length, s, len+1); + p->length += len; + return 0; +} + +/* add a string to the buffer with a tab prefix */ +static int addtabbed(struct parse_string *p, const char *s, unsigned indent) +{ + int len = strlen(s); + if (addgen_alloc(p, indent+len+1) != 0) { + return -1; + } + while (indent--) { + p->s[p->length++] = '\t'; + } + memcpy(p->s + p->length, s, len+1); + p->length += len; + return 0; +} + +/* note! this can only be used for results up to 60 chars wide! */ +static int addshort(struct parse_string *p, const char *fmt, ...) +{ + char buf[60]; + int n; + va_list ap; + va_start(ap, fmt); + n = vsnprintf(buf, sizeof(buf), fmt, ap); + va_end(ap); + if (addgen_alloc(p, n + 1) != 0) { + return -1; + } + if (n != 0) { + memcpy(p->s + p->length, buf, n); + } + p->length += n; + p->s[p->length] = 0; + return 0; +} + +/* + this is here to make it easier for people to write dump functions + for their own types + */ +int gen_addgen(struct parse_string *p, const char *fmt, ...) +{ + char *buf = NULL; + int n; + va_list ap; + va_start(ap, fmt); + n = vasprintf(&buf, fmt, ap); + va_end(ap); + if (addgen_alloc(p, n + 1) != 0) { + if (buf) free(buf); + return -1; + } + if (n != 0) { + memcpy(p->s + p->length, buf, n); + } + p->length += n; + p->s[p->length] = 0; + if (buf) free(buf); + return 0; +} + +/* dump a enumerated type */ +int gen_dump_enum(const struct enum_struct *einfo, + struct parse_string *p, + const char *ptr, + unsigned indent) +{ + unsigned v = *(unsigned *)ptr; + int i; + for (i=0;einfo[i].name;i++) { + if (v == einfo[i].value) { + addstr(p, einfo[i].name); + return 0; + } + } + /* hmm, maybe we should just fail? */ + return gen_dump_unsigned(p, ptr, indent); +} + +/* dump a single non-array element, hanlding struct and enum */ +static int gen_dump_one(struct parse_string *p, + const struct parse_struct *pinfo, + const char *ptr, + unsigned indent) +{ + if (pinfo->dump_fn == gen_dump_char && pinfo->ptr_count == 1) { + char *s = encode_bytes(ptr, strlen(ptr)); + if (addchar(p,'{') || + addstr(p, s) || + addstr(p, "}")) { + free(s); + return -1; + } + return 0; + } + + return pinfo->dump_fn(p, ptr, indent); +} + +/* handle dumping of an array of arbitrary type */ +static int gen_dump_array(struct parse_string *p, + const struct parse_struct *pinfo, + const char *ptr, + int array_len, + int indent) +{ + int i, count=0; + + /* special handling of fixed length strings */ + if (array_len != 0 && + pinfo->ptr_count == 0 && + pinfo->dump_fn == gen_dump_char) { + char *s = encode_bytes(ptr, array_len); + if (!s) return -1; + if (addtabbed(p, pinfo->name, indent) || + addstr(p, " = {") || + addstr(p, s) || + addstr(p, "}\n")) { + free(s); + return -1; + } + free(s); + return 0; + } + + for (i=0;isize; + + /* generic pointer dereference */ + if (pinfo->ptr_count) { + p2 = *(const char **)ptr; + size = sizeof(void *); + } + + if ((count || pinfo->ptr_count) && + !(pinfo->flags & FLAG_ALWAYS) && + all_zero(ptr, size)) { + ptr += size; + continue; + } + if (count == 0) { + if (addtabbed(p, pinfo->name, indent) || + addshort(p, " = %u:", i)) { + return -1; + } + } else { + if (addshort(p, ", %u:", i) != 0) { + return -1; + } + } + if (gen_dump_one(p, pinfo, p2, indent) != 0) { + return -1; + } + ptr += size; + count++; + } + if (count) { + return addstr(p, "\n"); + } + return 0; +} + +/* find a variable by name in a loaded structure and return its value + as an integer. Used to support dynamic arrays */ +static int find_var(const struct parse_struct *pinfo, + const char *data, + const char *var) +{ + int i; + const char *ptr; + + /* this allows for constant lengths */ + if (isdigit(*var)) { + return atoi(var); + } + + for (i=0;pinfo[i].name;i++) { + if (strcmp(pinfo[i].name, var) == 0) break; + } + if (!pinfo[i].name) return -1; + + ptr = data + pinfo[i].offset; + + switch (pinfo[i].size) { + case sizeof(int): + return *(int *)ptr; + case sizeof(char): + return *(char *)ptr; + } + + return -1; +} + + +int gen_dump_struct(const struct parse_struct *pinfo, + struct parse_string *p, + const char *ptr, + unsigned indent) +{ + char *s = gen_dump(pinfo, ptr, indent+1); + if (!s) return -1; + if (addstr(p, "{\n") || + addstr(p,s) || + addtabbed(p,"}", indent)) { + free(s); + return -1; + } + free(s); + return 0; +} + +static int gen_dump_string(struct parse_string *p, + const struct parse_struct *pinfo, + const char *data, + unsigned indent) +{ + const char *ptr = *(char **)data; + char *s = encode_bytes(ptr, strlen(ptr)); + if (addtabbed(p, pinfo->name, indent) || + addstr(p, " = ") || + addchar(p,'{') || + addstr(p, s) || + addstr(p, "}\n")) { + free(s); + return -1; + } + return 0; +} + +/* + find the length of a nullterm array +*/ +static int len_nullterm(const char *ptr, int size, int array_len) +{ + int len; + + if (size == 1) { + len = strnlen(ptr, array_len); + } else { + for (len=0;len 0) { + if (pinfo[i].flags & FLAG_NULLTERM) { + len = len_nullterm(*(char **)ptr, + pinfo[i].size, len); + } + p2.ptr_count--; + p2.dynamic_len = NULL; + if (gen_dump_array(&p, &p2, *(char **)ptr, + len, indent) != 0) { + goto failed; + } + } + continue; + } + + /* don't dump zero elements */ + if (!(pinfo[i].flags & FLAG_ALWAYS) && all_zero(ptr, size)) continue; + + /* assume char* is a null terminated string */ + if (pinfo[i].size == 1 && pinfo[i].ptr_count == 1 && + pinfo[i].dump_fn == gen_dump_char) { + if (gen_dump_string(&p, &pinfo[i], ptr, indent) != 0) { + goto failed; + } + continue; + } + + /* generic pointer dereference */ + if (pinfo[i].ptr_count) { + ptr = *(const char **)ptr; + } + + if (addtabbed(&p, pinfo[i].name, indent) || + addstr(&p, " = ") || + gen_dump_one(&p, &pinfo[i], ptr, indent) || + addstr(&p, "\n")) { + goto failed; + } + } + return p.s; + +failed: + free(p.s); + return NULL; +} + +/* search for a character in a string, skipping over sections within + matching braces */ +static char *match_braces(char *s, char c) +{ + int depth = 0; + while (*s) { + switch (*s) { + case '}': + depth--; + break; + case '{': + depth++; + break; + } + if (depth == 0 && *s == c) { + return s; + } + s++; + } + return s; +} + +/* parse routine for enumerated types */ +int gen_parse_enum(const struct enum_struct *einfo, + char *ptr, + const char *str) +{ + unsigned v; + int i; + + if (isdigit(*str)) { + if (sscanf(str, "%u", &v) != 1) { + errno = EINVAL; + return -1; + } + *(unsigned *)ptr = v; + return 0; + } + + for (i=0;einfo[i].name;i++) { + if (strcmp(einfo[i].name, str) == 0) { + *(unsigned *)ptr = einfo[i].value; + return 0; + } + } + + /* unknown enum value?? */ + return -1; +} + + +/* parse all base types */ +static int gen_parse_base(const struct parse_struct *pinfo, + char *ptr, + const char *str) +{ + if (pinfo->parse_fn == gen_parse_char && pinfo->ptr_count==1) { + unsigned len; + char *s = decode_bytes(str, &len); + if (!s) return -1; + *(char **)ptr = s; + return 0; + } + + if (pinfo->ptr_count) { + struct parse_struct p2 = *pinfo; + *(void **)ptr = calloc(1, pinfo->ptr_count>1?sizeof(void *):pinfo->size); + if (! *(void **)ptr) { + return -1; + } + ptr = *(char **)ptr; + p2.ptr_count--; + return gen_parse_base(&p2, ptr, str); + } + + return pinfo->parse_fn(ptr, str); +} + +/* parse a generic array */ +static int gen_parse_array(const struct parse_struct *pinfo, + char *ptr, + const char *str, + int array_len) +{ + char *p, *p2; + unsigned size = pinfo->size; + + /* special handling of fixed length strings */ + if (array_len != 0 && + pinfo->ptr_count == 0 && + pinfo->dump_fn == gen_dump_char) { + unsigned len = 0; + char *s = decode_bytes(str, &len); + if (!s) return -1; + memset(ptr, 0, array_len); + memcpy(ptr, s, len); + free(s); + return 0; + } + + if (pinfo->ptr_count) { + size = sizeof(void *); + } + + while (*str) { + unsigned idx; + int done; + + idx = atoi(str); + p = strchr(str,':'); + if (!p) break; + p++; + p2 = match_braces(p, ','); + done = (*p2 != ','); + *p2 = 0; + + if (*p == '{') { + p++; + p[strlen(p)-1] = 0; + } + + if (gen_parse_base(pinfo, ptr + idx*size, p) != 0) { + return -1; + } + + if (done) break; + str = p2+1; + } + + return 0; +} + +/* parse one element, hanlding dynamic and static arrays */ +static int gen_parse_one(const struct parse_struct *pinfo, + const char *name, + char *data, + const char *str) +{ + int i; + for (i=0;pinfo[i].name;i++) { + if (strcmp(pinfo[i].name, name) == 0) { + break; + } + } + if (pinfo[i].name == NULL) { + return 0; + } + + if (pinfo[i].array_len) { + return gen_parse_array(&pinfo[i], data+pinfo[i].offset, + str, pinfo[i].array_len); + } + + if (pinfo[i].dynamic_len) { + int len = find_var(pinfo, data, pinfo[i].dynamic_len); + if (len < 0) { + errno = EINVAL; + return -1; + } + if (len > 0) { + unsigned size; + struct parse_struct p2 = pinfo[i]; + char *ptr; + size = pinfo[i].ptr_count>1?sizeof(void*):pinfo[i].size; + ptr = calloc(len, size); + if (!ptr) { + errno = ENOMEM; + return -1; + } + *((char **)(data + pinfo[i].offset)) = ptr; + p2.ptr_count--; + p2.dynamic_len = NULL; + return gen_parse_array(&p2, ptr, str, len); + } + return 0; + } + + return gen_parse_base(&pinfo[i], data + pinfo[i].offset, str); +} + +int gen_parse_struct(const struct parse_struct *pinfo, char *ptr, const char *str) +{ + return gen_parse(pinfo, ptr, str); +} + +/* the main parse routine */ +int gen_parse(const struct parse_struct *pinfo, char *data, const char *s) +{ + char *str, *s0; + + s0 = strdup(s); + str = s0; + + while (*str) { + char *p; + char *name; + char *value; + + /* skip leading whitespace */ + while (isspace(*str)) str++; + + p = strchr(str, '='); + if (!p) break; + value = p+1; + while (p > str && isspace(*(p-1))) { + p--; + } + + *p = 0; + name = str; + + while (isspace(*value)) value++; + + if (*value == '{') { + str = match_braces(value, '}'); + value++; + } else { + str = match_braces(value, '\n'); + } + + *str++ = 0; + + if (gen_parse_one(pinfo, name, data, value) != 0) { + free(s0); + return -1; + } + } + + free(s0); + return 0; +} + + + +/* for convenience supply some standard dumpers and parsers here */ + +int gen_parse_char(char *ptr, const char *str) +{ + *(unsigned char *)ptr = atoi(str); + return 0; +} + +int gen_parse_int(char *ptr, const char *str) +{ + *(int *)ptr = atoi(str); + return 0; +} + +int gen_parse_unsigned(char *ptr, const char *str) +{ + *(unsigned *)ptr = strtoul(str, NULL, 10); + return 0; +} + +int gen_parse_time_t(char *ptr, const char *str) +{ + *(time_t *)ptr = strtoul(str, NULL, 10); + return 0; +} + +int gen_parse_double(char *ptr, const char *str) +{ + *(double *)ptr = atof(str); + return 0; +} + +int gen_parse_float(char *ptr, const char *str) +{ + *(float *)ptr = atof(str); + return 0; +} + +int gen_dump_char(struct parse_string *p, const char *ptr, unsigned indent) +{ + return addshort(p, "%u", *(unsigned char *)(ptr)); +} + +int gen_dump_int(struct parse_string *p, const char *ptr, unsigned indent) +{ + return addshort(p, "%d", *(int *)(ptr)); +} + +int gen_dump_unsigned(struct parse_string *p, const char *ptr, unsigned indent) +{ + return addshort(p, "%u", *(unsigned *)(ptr)); +} + +int gen_dump_time_t(struct parse_string *p, const char *ptr, unsigned indent) +{ + return addshort(p, "%u", *(time_t *)(ptr)); +} + +int gen_dump_double(struct parse_string *p, const char *ptr, unsigned indent) +{ + return addshort(p, "%lg", *(double *)(ptr)); +} + +int gen_dump_float(struct parse_string *p, const char *ptr, unsigned indent) +{ + return addshort(p, "%g", *(float *)(ptr)); +} diff --git a/lasker-2.2.3/src/parsers/genparser.h b/lasker-2.2.3/src/parsers/genparser.h new file mode 100644 index 0000000..8dab58b --- /dev/null +++ b/lasker-2.2.3/src/parsers/genparser.h @@ -0,0 +1,100 @@ +/* + Copyright (C) Andrew Tridgell 2002 + + 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., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +/* these macros are needed for genstruct auto-parsers */ +#ifndef GENSTRUCT +#define GENSTRUCT +#define _LEN(x) +#define _NULLTERM +#endif + +/* + automatic marshalling/unmarshalling system for C structures +*/ + +enum parse_type {T_INT, T_UNSIGNED, T_CHAR, + T_FLOAT, T_DOUBLE, T_ENUM, T_STRUCT, + T_TIME_T, T_LONG, T_ULONG}; + +/* flag to mark a fixed size array as actually being null terminated */ +#define FLAG_NULLTERM 1 +#define FLAG_ALWAYS 2 + +struct enum_struct { + const char *name; + unsigned value; +}; + +/* intermediate dumps are stored in one of these */ +struct parse_string { + unsigned allocated; + unsigned length; + char *s; +}; + +typedef int (*gen_dump_fn)(struct parse_string *, const char *ptr, unsigned indent); +typedef int (*gen_parse_fn)(char *ptr, const char *str); + +/* genstruct.pl generates arrays of these */ +struct parse_struct { + const char *name; + unsigned ptr_count; + unsigned size; + unsigned offset; + unsigned array_len; + const char *dynamic_len; + unsigned flags; + gen_dump_fn dump_fn; + gen_parse_fn parse_fn; +}; + +char *gen_dump(const struct parse_struct *pinfo, + const char *data, + unsigned indent); +int gen_parse(const struct parse_struct *pinfo, char *data, const char *str0); + +int gen_addgen(struct parse_string *p, const char *fmt, ...); + +int gen_dump_enum(const struct enum_struct *einfo, + struct parse_string *p, + const char *ptr, + unsigned indent); +int gen_parse_enum(const struct enum_struct *einfo, + char *ptr, + const char *str); + +int gen_dump_struct(const struct parse_struct *pinfo, + struct parse_string *p, + const char *ptr, + unsigned indent); +int gen_parse_struct(const struct parse_struct *pinfo, + char *ptr, + const char *str); + +#define DUMP_PARSE_DECL(type) \ + int gen_dump_ ## type(struct parse_string *, const char *, unsigned); \ + int gen_parse_ ## type(char *, const char *); + +DUMP_PARSE_DECL(char) +DUMP_PARSE_DECL(int) +DUMP_PARSE_DECL(unsigned) +DUMP_PARSE_DECL(double) +DUMP_PARSE_DECL(float) + +#define gen_dump_unsigned_char gen_dump_char +#define gen_parse_unsigned_char gen_parse_char diff --git a/lasker-2.2.3/src/parsers/genstruct.pl b/lasker-2.2.3/src/parsers/genstruct.pl new file mode 100755 index 0000000..160ea1f --- /dev/null +++ b/lasker-2.2.3/src/parsers/genstruct.pl @@ -0,0 +1,299 @@ +#!/usr/bin/perl -w +# a simple system for generating C parse info +# this can be used to write generic C structer load/save routines +# Copyright 2002 Andrew Tridgell +# released under the GNU General Public License v2 or later + +use strict; + +my(%enum_done) = (); +my(%struct_done) = (); + +################################################### +# general handler +sub handle_general($$$$$$$$) +{ + my($name) = shift; + my($ptr_count) = shift; + my($size) = shift; + my($element) = shift; + my($flags) = shift; + my($dump_fn) = shift; + my($parse_fn) = shift; + my($tflags) = shift; + my($array_len) = 0; + my($dynamic_len) = "NULL"; + + # handle arrays, currently treat multidimensional arrays as 1 dimensional + while ($element =~ /(.*)\[(.*?)\]$/) { + $element = $1; + if ($array_len == 0) { + $array_len = $2; + } else { + $array_len = "$2 * $array_len"; + } + } + + if ($flags =~ /_LEN\((\w*?)\)/) { + $dynamic_len = "\"$1\""; + } + + if ($flags =~ /_NULLTERM/) { + $tflags = "FLAG_NULLTERM"; + } + + print OFILE "{\"$element\", $ptr_count, $size, offsetof(struct $name, $element), $array_len, $dynamic_len, $tflags, $dump_fn, $parse_fn},\n"; +} + + +#################################################### +# parse one element +sub parse_one($$$$) +{ + my($name) = shift; + my($type) = shift; + my($element) = shift; + my($flags) = shift; + my($ptr_count) = 0; + my($size) = "sizeof($type)"; + my($tflags) = "0"; + + # enums get the FLAG_ALWAYS flag + if ($type =~ /^enum /) { + $tflags = "FLAG_ALWAYS"; + } + + + # make the pointer part of the base type + while ($element =~ /^\*(.*)/) { + $ptr_count++; + $element = $1; + } + + # convert spaces to _ + $type =~ s/ /_/g; + + my($dump_fn) = "gen_dump_$type"; + my($parse_fn) = "gen_parse_$type"; + + handle_general($name, $ptr_count, $size, $element, $flags, $dump_fn, $parse_fn, $tflags); +} + +#################################################### +# parse one element +sub parse_element($$$) +{ + my($name) = shift; + my($element) = shift; + my($flags) = shift; + my($type); + my($data); + + # pull the base type + if ($element =~ /^struct (\S*) (.*)/) { + $type = "struct $1"; + $data = $2; + } elsif ($element =~ /^enum (\S*) (.*)/) { + $type = "enum $1"; + $data = $2; + } elsif ($element =~ /^unsigned (\S*) (.*)/) { + $type = "unsigned $1"; + $data = $2; + } elsif ($element =~ /^const (\S*) (.*)/) { + $type = $1; + $data = $2; + } elsif ($element =~ /^(\S*) (.*)/) { + $type = $1; + $data = $2; + } else { + die "Can't parse element '$element'"; + } + + # handle comma separated lists + while ($data =~ /(\S*),[\s]?(.*)/) { + parse_one($name, $type, $1, $flags); + $data = $2; + } + parse_one($name, $type, $data, $flags); +} + + +my($first_struct) = 1; + +#################################################### +# parse the elements of one structure +sub parse_elements($$) +{ + my($name) = shift; + my($elements) = shift; + + if ($first_struct) { + $first_struct = 0; + print "Parsing structs: $name"; + } else { + print ", $name"; + } + + print OFILE "int gen_dump_struct_$name(struct parse_string *, const char *, unsigned);\n"; + print OFILE "int gen_parse_struct_$name(char *, const char *);\n"; + + print OFILE "static const struct parse_struct pinfo_" . $name . "[] = {\n"; + + while ($elements =~ /^.*?([a-z].*?);\s*?(\S*?)\s*?$(.*)/msi) { + my($element) = $1; + my($flags) = $2; + $elements = $3; + parse_element($name, $element, $flags); + } + + print OFILE "{NULL, 0, 0, 0, 0, NULL, 0, NULL, NULL}};\n"; + + print OFILE " +int gen_dump_struct_$name(struct parse_string *p, const char *ptr, unsigned indent) { + return gen_dump_struct(pinfo_$name, p, ptr, indent); +} +int gen_parse_struct_$name(char *ptr, const char *str) { + return gen_parse_struct(pinfo_$name, ptr, str); +} + +"; +} + +my($first_enum) = 1; + +#################################################### +# parse out the enum declarations +sub parse_enum_elements($$) +{ + my($name) = shift; + my($elements) = shift; + + if ($first_enum) { + $first_enum = 0; + print "Parsing enums: $name"; + } else { + print ", $name"; + } + + print OFILE "static const struct enum_struct einfo_" . $name . "[] = {\n"; + + my(@enums) = split(/,/s, $elements); + for (my($i)=0; $i <= $#{@enums}; $i++) { + my($enum) = $enums[$i]; + if ($enum =~ /\s*(\w*)/) { + my($e) = $1; + print OFILE "{\"$e\", $e},\n"; + } + } + + print OFILE "{NULL, 0}};\n"; + + print OFILE " +int gen_dump_enum_$name(struct parse_string *p, const char *ptr, unsigned indent) { + return gen_dump_enum(einfo_$name, p, ptr, indent); +} + +int gen_parse_enum_$name(char *ptr, const char *str) { + return gen_parse_enum(einfo_$name, ptr, str); +} + +"; +} + +#################################################### +# parse out the enum declarations +sub parse_enums($) +{ + my($data) = shift; + + while ($data =~ /^GENSTRUCT\s+enum\s+(\w*?)\s*{(.*?)}\s*;(.*)/ms) { + my($name) = $1; + my($elements) = $2; + $data = $3; + + if (!defined($enum_done{$name})) { + $enum_done{$name} = 1; + parse_enum_elements($name, $elements); + } + } + + if (! $first_enum) { + print "\n"; + } +} + +#################################################### +# parse all the structures +sub parse_structs($) +{ + my($data) = shift; + + # parse into structures + while ($data =~ /^GENSTRUCT\s+struct\s+(\w+?)\s*{\s*(.*?)\s*}\s*;(.*)/ms) { + my($name) = $1; + my($elements) = $2; + $data = $3; + if (!defined($struct_done{$name})) { + $struct_done{$name} = 1; + parse_elements($name, $elements); + } + } + + if (! $first_struct) { + print "\n"; + } else { + print "No GENSTRUCT structures found?\n"; + } +} + + +#################################################### +# parse a header file, generating a dumper structure +sub parse_data($) +{ + my($data) = shift; + + # collapse spaces + $data =~ s/[\t ]+/ /sg; + $data =~ s/\s*\n\s+/\n/sg; + # strip debug lines + $data =~ s/^\#.*?\n//smg; + + parse_enums($data); + parse_structs($data); +} + + +######################################### +# display help text +sub ShowHelp() +{ + print " +generator for C structure dumpers +Copyright Andrew Tridgell + +Sample usage: + genstruct -o output.h gcc -E -O2 -g test.h + +Options: + --help this help page + -o OUTPUT place output in OUTPUT +"; + exit(0); +} + +######################################## +# main program +if ($ARGV[0] ne "-o" || $#ARGV < 2) { + ShowHelp(); +} + +shift; +my($opt_ofile)=shift; + +open(OFILE, ">$opt_ofile") || die "can't open $opt_ofile"; + +print OFILE "/* This is an automatically generated file - DO NOT EDIT! */\n\n"; + +parse_data(`@ARGV -DGENSTRUCT=GENSTRUCT`); +exit(0); diff --git a/lasker-2.2.3/src/parsers/parser.c b/lasker-2.2.3/src/parsers/parser.c new file mode 100644 index 0000000..915b4f8 --- /dev/null +++ b/lasker-2.2.3/src/parsers/parser.c @@ -0,0 +1,165 @@ +/* + Copyright (C) Andrew Tridgell 2002 + + 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., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +/* + automatic marshalling/unmarshalling system for C structures +*/ + +#define EXTERN +#include "includes.h" +#include "parsers/parse_info.h" + +/* load all the globals */ +void load_all_globals(const char *fname) +{ + struct all_globals a; + char *s; + + s = file_load(fname, NULL); + if (!s) { + d_printf("Unable to load globals!\n"); + return; + } + memset(&a, 0, sizeof(a)); + gen_parse(pinfo_all_globals, (char *)&a, s); + free(s); + + net_globals = *a.net_globals; + game_globals = *a.game_globals; + player_globals = *a.player_globals; + command_globals = *a.command_globals; + gics_globals = *a.gics_globals; + timeseal_globals = *a.timeseal_globals; + + FREE(a.net_globals); + FREE(a.game_globals); + FREE(a.player_globals); + FREE(a.command_globals); + FREE(a.gics_globals); + FREE(a.timeseal_globals); +} + +/* save all the globals */ +void save_all_globals(const char *fname) +{ + struct all_globals a, a2; + char *s, *s2; + + memset(&a, 0, sizeof(a)); + a.net_globals = &net_globals; + a.game_globals = &game_globals; + a.player_globals = &player_globals; + a.command_globals = &command_globals; + a.gics_globals = &gics_globals; + a.timeseal_globals = ×eal_globals; + + s = gen_dump(pinfo_all_globals, (char *)&a, 0); + if (!s) { + d_printf("Unable to dump globals!\n"); + return; + } + file_save(fname, s, strlen(s)); + memset(&a2, 0, sizeof(a2)); + gen_parse(pinfo_all_globals, (char *)&a2, s); + s2 = gen_dump(pinfo_all_globals, (char *)&a2, 0); + if (strcmp(s, s2)) { + d_printf("ERROR: globals parse mismatch!\n"); + file_save("cmp.dat", s2, strlen(s2)); + } + free(s); + free(s2); +} + +/* + * adump - dump complete server state to globals.dat + */ +int com_adump(int p, param_list param) +{ + save_all_globals("globals.dat"); + return COM_OK; +} + + +/* + marshall a player structure +*/ +const char *marshall_player(const struct player *pp) +{ + return gen_dump(pinfo_player, (const char *)pp, 0); +} + +/* + unmarshall a player structure +*/ +int unmarshall_player(struct player *pp, const char *s) +{ + return gen_parse(pinfo_player, (char *)pp, s); +} + + +/* + marshall a game structure +*/ +const char *marshall_game(const struct game *gg) +{ + return gen_dump(pinfo_game, (const char *)gg, 0); +} + +/* + unmarshall a game structure +*/ +int unmarshall_game(struct game *gg, const char *s) +{ + return gen_parse(pinfo_game, (char *)gg, s); +} + +/* + marshall a news structure +*/ +const char *marshall_news(const struct news *nn) +{ + return gen_dump(pinfo_news, (const char *)nn, 0); +} + +/* + unmarshall a news structure +*/ +int unmarshall_news(struct news *nn, const char *s) +{ + return gen_parse(pinfo_news, (char *)nn, s); +} + + + +/* + custom dump/load functions +*/ +int gen_dump_struct_in_addr(struct parse_string *p, const char *ptr, unsigned indent) +{ + return gen_addgen(p, "%s", inet_ntoa(*(struct in_addr *)ptr)); +} + +int gen_parse_struct_in_addr(char *ptr, const char *str) +{ + struct in_addr *a = (struct in_addr *)ptr; + if (inet_aton(str, a) == 0) { + /* probably an old style */ + a->s_addr = atoi(str); + } + return 0; +} diff --git a/lasker-2.2.3/src/pending.c b/lasker-2.2.3/src/pending.c new file mode 100644 index 0000000..9929197 --- /dev/null +++ b/lasker-2.2.3/src/pending.c @@ -0,0 +1,744 @@ +/* + 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., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +/* + pending.c + + Sat Feb 10 - created - DAV + +*/ +#include "includes.h" + +extern const char *colorstr[]; + +/* iterator for player p */ +static struct pending* next_pending(struct pending* current) +{ + + if (current == NULL) { + d_printf("NULL pointer passed to next_pending\n"); + return NULL; + } else return current->next; +} + +/* deletor for pending - returns next item*/ +struct pending *delete_pending(struct pending *current) +{ + struct pending *p; + + if (current == NULL) { + d_printf("NULL pointer passed to delete_pending\n"); + return NULL; + } + + player_globals.parray[current->whofrom].number_pend_from--; + player_globals.parray[current->whoto].number_pend_to--; + + if (current->category != NULL) { + free(current->category); + } + if (current->board_type != NULL) { + free(current->board_type); + } + + if (current == seek_globals.pendlist) { + seek_globals.pendlist = current->next; + free(current); + return seek_globals.pendlist; + } + + for (p=seek_globals.pendlist; p && p->next != current; p=p->next) ; + + if (!p) { + d_printf("current not on pending list??"); + return NULL; + } + + p->next = current->next; + free(current); + return p->next; +} + +/* kills the whole pending list on shutdown */ +void destruct_pending(void) +{ + struct pending* current = seek_globals.pendlist; + + while (current != NULL) + current = delete_pending(current); +} + +struct pending *add_pending(int from,int to,int type) +{ + struct pending* new = (struct pending*) malloc(sizeof(struct pending)); + + new->whofrom = from; + new->whoto = to; + new->type = type; + new->next = seek_globals.pendlist; + new->category = NULL; + new->board_type = NULL; + + player_globals.parray[from].number_pend_from++; + player_globals.parray[to].number_pend_to++; + + seek_globals.pendlist = new; + + return new; +} + +static int check_current_pend(struct pending* current, int p, int p1, int type) +{ + if ((p != -1) && ((current->whofrom) != p)) + return 0; + if (current->whoto != p1 && p1 != -1) + return 0; + if ((type == PEND_ALL) || (current->type == type)) + return 1; + if ((type < 0) && (current->type != -type)) + return 1; +/* The above "if" allows a type of -PEND_SIMUL to match every request + EXCEPT simuls, for example. I'm doing this because Heringer does + not want to decline simul requests when he makes a move in a sumul. + -- hersco. */ + + return 0; +} + +/* from p to p1 */ +struct pending *find_pend(int p, int p1, int type) +{ + struct player *pp = &player_globals.parray[p]; + /* -ve type can be used to decline all but that type */ + struct pending* current = seek_globals.pendlist; + + if (((p != -1) && (!pp->number_pend_from)) || + ((p1 != -1) && (!player_globals.parray[p1].number_pend_to))) + return NULL; + + while (current != NULL) { + if (check_current_pend(current,p,p1, type)) + return current; + current = next_pending(current); + } + return NULL; +} + +/* from p to p1 */ +struct pending *add_request(int p, int p1, int type) +{ + struct player *pp = &player_globals.parray[p]; + struct pending* new = NULL; + + if ((pp->number_pend_from) && + (player_globals.parray[p1].number_pend_to)) { + if ((new = find_pend(p, p1, type)) != NULL) + return new; /* Already exists */ + } + + if ((new = add_pending(p,p1,type)) == NULL) + return NULL; + return new; +} + +/* removes all requests from p to p1 */ +void remove_request(int p, int p1, int type) +{ + struct pending* next; + struct pending* current = seek_globals.pendlist; + + while (current != NULL) { + next = next_pending(current); + if (check_current_pend(current,p,p1,type)) + delete_pending(current); + current = next; + } +} + +/* made into 1 functions for speed */ + +/* decline offers to p and withdraw offers from p */ +static void do_decline_withdraw_offers(int p,int p1, int offers, int partners, int wd) +{ + struct player *pp = &player_globals.parray[p]; + struct pending* offer = seek_globals.pendlist; + int type, p2; + char *pName = pp->name, *p2Name; + int decline; + + if ((wd & DO_DECLINE) && (wd & DO_WITHDRAW)) { /* cut search times */ + if (((p != -1) && (!pp->number_pend_to) + && (!pp->number_pend_from)) + || ((p1 != -1) && (!player_globals.parray[p1].number_pend_to) + && (!player_globals.parray[p1].number_pend_from))) + return; + } + + if ((wd & DO_DECLINE) && (!(wd & DO_WITHDRAW))) { /* cut search times */ + if (((p != -1) && (!pp->number_pend_to)) || + ((p1 != -1) && (!player_globals.parray[p1].number_pend_from))) + return; + } + + if ((!(wd & DO_DECLINE)) && (wd & DO_WITHDRAW)) { /* cut search times */ + if (((p != -1) && (!pp->number_pend_from)) || + ((p1 != -1) && (!player_globals.parray[p1].number_pend_to))) + return; + } + + while (offer != NULL) { + + decline = 0; + if ((wd & DO_DECLINE) && (check_current_pend(offer, p1, p, offers))) { + p2 = offer->whofrom; + decline = 1; + } else if ((wd & DO_WITHDRAW) && (check_current_pend(offer,p, p1, offers))) { + p2 = offer->whoto; + } else { + offer = offer->next; + continue; + } + + type = offer->type; + p2Name = player_globals.parray[p2].name; + + switch (type) { + case PEND_MATCH: + if (partners) { + if (offer->game_type != TYPE_BUGHOUSE) { + offer = offer->next; + continue; + } else if (decline) { + if (offer->whoto == p) { + pprintf(p, + "Either your opponent's partner or your partner has joined another match.\n"); + pprintf_prompt(p, + "Removing the bughouse offer from %s.\n", + p2Name); + + pprintf(p2, + "Either your opponent's partner or your partner has joined another match.\n"); + pprintf_prompt(p2, + "Removing the bughouse offer to %s.\n", + pName); + + } else { + pprintf_prompt(p, + "Your partner declines the bughouse offer from %s.\n", + p2Name); + pprintf_prompt(p2, + "%s declines the bughouse offer from your partner.\n", + pName); + } + + } else { + if (offer->whofrom == p) { + pprintf(p, + "Either your opponent's partner or your partner has joined another match.\n"); + pprintf_prompt(p, + "Removing the bughouse offer to %s.\n", + p2Name); + + pprintf(p2, + "Either your opponent's partner or your partner has joined another match.\n"); + pprintf_prompt(p2, + "Removing the bughouse offer from %s.\n", + pName); + + } else { + pprintf_prompt(p, + "Your partner withdraws the bughouse offer to %s.\n", + p2Name); + pprintf_prompt(p2, + "%s withdraws the bughouse offer to your partner.\n", + pName); + } + } + } else { + + if (decline) { + pprintf_prompt(p2, "\n%s declines the match offer.\n", pName); + pprintf(p, "You decline the match offer from %s.\n", p2Name); + } else { + pprintf_prompt(p2, "\n%s withdraws the match offer.\n", pName); + pprintf(p, "You withdraw the match offer to %s.\n", p2Name); + } + } + break; + case PEND_DRAW: + if (decline) { + pprintf_prompt(p2, "\n%s declines draw request.\n", pName); + pprintf(p, "You decline the draw request from %s.\n", p2Name); + } else { + pprintf_prompt(p2, "\n%s withdraws draw request.\n", pName); + pprintf(p, "You withdraw the draw request to %s.\n", p2Name); + } + break; + + case PEND_PAUSE: + if (decline) { + pprintf_prompt(p2, "\n%s declines pause request.\n", pName); + pprintf(p, "You decline the pause request from %s.\n", p2Name); + } else { + pprintf_prompt(p2, "\n%s withdraws pause request.\n", pName); + pprintf(p, "You withdraw the pause request to %s.\n", p2Name); + } + break; + + case PEND_UNPAUSE: + if (decline) { + pprintf_prompt(p2, "\n%s declines unpause request.\n", pName); + pprintf(p, "You decline the unpause request from %s.\n", p2Name); + } else { + pprintf_prompt(p2, "\n%s withdraws unpause request.\n", pName); + pprintf(p, "You withdraw the unpause request to %s.\n", p2Name); + } + break; + + case PEND_ABORT: + if (decline) { + pprintf_prompt(p2, "\n%s declines abort request.\n", pName); + pprintf(p, "You decline the abort request from %s.\n", p2Name); + } else { + pprintf_prompt(p2, "\n%s withdraws abort request.\n", pName); + pprintf(p, "You withdraw the abort request to %s.\n", p2Name); + } + break; + + case PEND_TAKEBACK: + if (decline) { + pprintf_prompt(p2, "\n%s declines the takeback request.\n", pName); + pprintf(p, "You decline the takeback request from %s.\n", p2Name); + } else { + pprintf_prompt(p2, "\n%s withdraws the takeback request.\n", pName); + pprintf(p, "You withdraw the takeback request to %s.\n", p2Name); + } + break; + + case PEND_ADJOURN: + if (decline) { + pprintf_prompt(p2, "\n%s declines the adjourn request.\n", pName); + pprintf(p, "You decline the adjourn request from %s.\n", p2Name); + } else { + pprintf_prompt(p2, "\n%s withdraws the adjourn request.\n", pName); + pprintf(p, "You withdraw the adjourn request to %s.\n", p2Name); + } + break; + + case PEND_SWITCH: + if (decline) { + pprintf_prompt(p2, "\n%s declines the switch sides request.\n", pName); + pprintf(p, "You decline the switch sides request from %s.\n", p2Name); + } else { + pprintf_prompt(p2, "\n%s withdraws the switch sides request.\n", pName); + pprintf(p, "You withdraw the switch sides request to %s.\n", p2Name); + } + break; + + case PEND_SIMUL: + if (decline) { + pprintf_prompt(p2, "\n%s declines the simul offer.\n", pName); + pprintf(p, "You decline the simul offer from %s.\n", p2Name); + } else { + pprintf_prompt(p2, "\n%s withdraws the simul offer.\n", pName); + pprintf(p, "You withdraw the simul offer to %s.\n", p2Name); + } + break; + + case PEND_PARTNER: + if (decline) { + pprintf_prompt(p2, "\n%s declines your partnership request.\n", pName); + pprintf(p, "You decline the partnership request from %s.\n", p2Name); + } else { + pprintf_prompt(p2, "\n%s withdraws partnership request.\n", pName); + pprintf(p, "You withdraw the partnership request to %s.\n", p2Name); + } + break; + } + offer = delete_pending(offer); + } +} + +/* wd is DO_DECLINE to decline DO_WITHDRAW to withdraw and both for mutual */ +void decline_withdraw_offers(int p, int p1, int offerType,int wd) +{ + struct player *pp = &player_globals.parray[p]; + /* First get rid of bughouse offers from partner. */ + /* last param in if is a safety check - shouldn't happen */ + + int partner; + + if (p1 == -1) + partner = -1; + else + partner = player_globals.parray[p1].partner; + + if ((offerType == PEND_MATCH || offerType == PEND_ALL) + && pp->partner >= 0 && player_globals.parray[pp->partner].partner == p) + do_decline_withdraw_offers(pp->partner, partner , PEND_MATCH,1,wd); + + + do_decline_withdraw_offers(p, p1, offerType,0,wd); +} + +/* find nth offer from p */ +static struct pending* find_nth_pendfrom(int p,int num) +{ + struct pending* current = seek_globals.pendlist; + + while (num) { + if (check_current_pend(current,p,-1,PEND_ALL)) + num--; + if (num > 0) + current = next_pending(current); + } + return current; +} + +/* find nth offer to p */ +static struct pending* find_nth_pendto(int p,int num) +{ + struct pending* current = seek_globals.pendlist; + + while (num) { + if (check_current_pend(current,-1,p,PEND_ALL)) + num--; + if (num > 0) + current = next_pending(current); + } + return current; +} + +static int WordToOffer (int p, char *Word, int *type, int *p1) +{ + /* Convert draw adjourn match takeback abort pause + simmatch switch partner or to offer type. */ + *p1 = -1; + if (!strcmp(Word, "match")) { + *type = PEND_MATCH; + } else if (!strcmp(Word, "draw")) { + *type = PEND_DRAW; + } else if (!strcmp(Word, "pause")) { + *type = PEND_PAUSE; + } else if (!strcmp(Word, "unpause")) { + *type = PEND_UNPAUSE; + } else if (!strcmp(Word, "abort")) { + *type = PEND_ABORT; + } else if (!strcmp(Word, "takeback")) { + *type = PEND_TAKEBACK; + } else if (!strcmp(Word, "adjourn")) { + *type = PEND_ADJOURN; + } else if (!strcmp(Word, "switch")) { + *type = PEND_SWITCH; + } else if (!strcmp(Word, "simul")) { + *type = PEND_SIMUL; + } else if (!strcmp(Word, "partner")) { + *type = PEND_PARTNER; + } else if (!strcmp(Word, "all")) { + } else { + *p1 = player_find_part_login(Word); + if (*p1 < 0) { + pprintf(p, "No user named \"%s\" is logged in.\n", Word); + return 0; + } + } + return 1; +} + +int com_accept(int p, param_list param) +{ + struct player *pp = &player_globals.parray[p]; + int type = -1; + int p1; + int number; + struct pending* current = NULL; + + if (!(number = pp->number_pend_to)) { + pprintf(p, "You have no offers to accept.\n"); + return COM_OK; + } + + if (param[0].type == TYPE_NULL) { + if (number != 1) { + pprintf(p, "You have more than one offer to accept.\nUse \"pending\" to see them and \"accept n\" to choose which one.\n"); + return COM_OK; + } + current = find_pend(-1,p,PEND_ALL); + + } else if (param[0].type == TYPE_INT) { + if ((param[0].val.integer < 1) || (param[0].val.integer > number)) { + pprintf(p, "Out of range. Use \"pending\" to see the list of offers.\n"); + return COM_OK; + } + + current = find_nth_pendto(p,param[0].val.integer); + + } else if (param[0].type == TYPE_WORD) { + if (!WordToOffer (p,param[0].val.word,&type,&p1)) + return COM_OK; + if ((p1 < 0) && ((current = find_pend(-1, p, type)) == NULL)) { + pprintf(p, "There are no pending %s offers.\n", param[0].val.word); + return COM_OK; + } else if ((p1 >= 0) && (current = find_pend(p1, p, PEND_ALL)) == NULL) { + pprintf(p, "There are no pending offers from %s.\n", player_globals.parray[p1].name); + return COM_OK; + } + } + + switch (current->type) { + case PEND_MATCH: + accept_match(current, p, current->whofrom); + return (COM_OK); + break; + case PEND_DRAW: + pcommand(p, "draw"); + break; + case PEND_PAUSE: + pcommand(p, "pause"); + break; + case PEND_UNPAUSE: + pcommand(p, "unpause"); + break; + case PEND_ABORT: + pcommand(p, "abort"); + break; + case PEND_TAKEBACK: + pcommand(p, "takeback %d", current->wtime); + break; + case PEND_SIMUL: + pcommand(p, "simmatch %s", player_globals.parray[current->whofrom].name); + break; + case PEND_SWITCH: + pcommand(p, "switch"); + break; + case PEND_ADJOURN: + pcommand(p, "adjourn"); + break; + case PEND_PARTNER: + pcommand(p, "partner %s", player_globals.parray[current->whofrom].name); + break; + } + return COM_OK_NOPROMPT; +} + +static int com_decline_withdraw(int p, param_list param,int wd) +{ + struct player *pp = &player_globals.parray[p]; + int type = -1; + int p1; + int number; + struct pending* current = seek_globals.pendlist; + + if (wd & DO_DECLINE) { + if (!(number = pp->number_pend_to)) { + pprintf(p, "You have no pending offers from other players.\n"); + return COM_OK; + } + } else { + if (!(number = pp->number_pend_from)) { + pprintf(p, "You have no pending offers to other players.\n"); + return COM_OK; + } + } + + + if (param[0].type == TYPE_NULL) { + if (number == 1) { + if (wd & DO_DECLINE) { + current = find_pend(-1,p,PEND_ALL); + p1 = current->whofrom; + } else { + current = find_pend(p,-1,PEND_ALL); + p1 = current->whoto; + } + type = current->type; + } else { + if (wd & DO_DECLINE) + pprintf(p, "You have more than one pending offer.\nUse \"pending\" to see them and \"decline n\" to choose which one.\n"); + else + pprintf(p, "You have more than one pending offer.\nUse \"pending\" to see them and \"withdraw n\" to choose which one.\n"); + return COM_OK; + } + + } else if (param[0].type == TYPE_INT) { + if ((param[0].val.integer < 1) || (param[0].val.integer > number)) { + pprintf(p, "Out of range. Use \"pending\" to see the list of offers.\n"); + return COM_OK; + } + if (wd & DO_DECLINE) { + current = find_nth_pendto(p,param[0].val.integer); + p1 = current->whofrom; + } else { + current = find_nth_pendfrom(p,param[0].val.integer); + p1 = current->whoto; + } + type = current->type; + + } else if (!WordToOffer (p, param[0].val.word, &type, &p1)) + return COM_OK; + + decline_withdraw_offers(p, p1, type,wd); + return COM_OK; +} + +int com_decline(int p, param_list param) +{ + return com_decline_withdraw(p,param,DO_DECLINE); +} + +int com_withdraw(int p, param_list param) +{ + return com_decline_withdraw(p,param,DO_WITHDRAW); +} + +static void pend_print(int p, struct pending *pend) +{ + + if (p == pend->whofrom) { + pprintf(p, "You are offering %s ", player_globals.parray[pend->whoto].name); + } else { + pprintf(p, "%s is offering ", player_globals.parray[pend->whofrom].name); + } + + switch (pend->type) { + case PEND_MATCH: + pprintf(p, "a challenge: %s (%s) %s%s (%s) %s.\n", + player_globals.parray[pend->whofrom].name, + ratstrii(GetRating(&player_globals.parray[pend->whofrom], pend->game_type), + pend->whofrom), + colorstr[pend->seek_color + 1], + player_globals.parray[pend->whoto].name, + ratstrii(GetRating(&player_globals.parray[pend->whoto], pend->game_type), + pend->whoto), + game_str(pend->rated, pend->wtime * 60, pend->winc, + pend->btime * 60, pend->binc, pend->category, pend->board_type)); + break; + case PEND_DRAW: + pprintf(p, "a draw.\n"); + break; + case PEND_PAUSE: + pprintf(p, "to pause the clock.\n"); + break; + case PEND_UNPAUSE: + pprintf(p, "to unpause the clock.\n"); + break; + case PEND_ABORT: + pprintf(p, "to abort the game.\n"); + break; + case PEND_TAKEBACK: + pprintf(p, "to takeback the last %d half moves.\n", pend->wtime); + break; + case PEND_SIMUL: + pprintf(p, "to play a simul match.\n"); + break; + case PEND_SWITCH: + pprintf(p, "to switch sides.\n"); + break; + case PEND_ADJOURN: + pprintf(p, "an adjournment.\n"); + break; + case PEND_PARTNER: + pprintf(p, "to be bughouse partners.\n"); + break; + } +} + +int com_pending(int p, param_list param) +{ + struct player *pp = &player_globals.parray[p]; + struct pending* current = seek_globals.pendlist; + int num = 0; + int num2 = 0; + int total = 0; + + if ((total = pp->number_pend_from)) { + while ((current != NULL) && (num != total)) { + if (check_current_pend(current,p,-1,PEND_ALL)) { + if (!num) + pprintf(p, "Offers TO other players:\n"); + num++; + pprintf(p, " %d: ",num); + pend_print(p, current); + } + current = next_pending(current); + } + pprintf(p, "\nIf you wish to withdraw any of these offers type 'withdraw n'\nor just 'withdraw' if there is only one offer.\n\n"); + } else + pprintf(p, "There are no offers pending TO other players.\n\n"); + + current = seek_globals.pendlist; + + if ((total = pp->number_pend_to)) { + while ((current != NULL) && (num2 != total)) { + if (check_current_pend(current,-1,p,PEND_ALL)) { + if (!num2) + pprintf(p, "Offers FROM other players:\n"); + num2++; + pprintf(p, " %d: ",num2); + pend_print(p, current); + } + current = next_pending(current); + } + pprintf(p, "\nIf you wish to accept any of these offers type 'accept n'\nor just 'accept' if there is only one offer.\n"); + } else + pprintf(p, "There are no offers pending FROM other players.\n"); + + return COM_OK; +} + +void pend_join_match (int p, int p1) +{ + struct player *pp = &player_globals.parray[p]; + struct pending* current; + struct pending* next = seek_globals.pendlist; + + if ((pp->number_pend_from == 0) && (pp->number_pend_to == 0) + && (player_globals.parray[p1].number_pend_from == 0) && (player_globals.parray[p1].number_pend_to == 0)) + return; + + while (next != NULL) { + current = next; + next = next_pending(current); + if (check_current_pend(current,p,-1,-PEND_PARTNER)) { + pprintf_prompt(current->whoto, "\n%s, who was challenging you, has joined a match with %s.\n", pp->name, player_globals.parray[p1].name); + pprintf(p, "Challenge to %s withdrawn.\n", player_globals.parray[current->whoto].name); + delete_pending(current); + continue; + } + + if (check_current_pend(current,p1,-1,-PEND_PARTNER)) { + pprintf_prompt(current->whoto, "\n%s, who was challenging you, has joined a match with %s.\n", player_globals.parray[p1].name, pp->name); + pprintf(p1, "Challenge to %s withdrawn.\n", player_globals.parray[current->whoto].name); + delete_pending(current); + continue; + } + + if (check_current_pend(current,-1,p,-PEND_PARTNER)) { + pprintf_prompt(current->whofrom, "\n%s, whom you were challenging, has joined a match with %s.\n", pp->name, player_globals.parray[p1].name); + pprintf(p, "Challenge from %s removed.\n", player_globals.parray[current->whofrom].name); + delete_pending(current); + continue; + } + + if (check_current_pend(current,-1,p1,-PEND_PARTNER)) { + pprintf_prompt(current->whofrom, "\n%s, whom you were challenging, has joined a match with %s.\n", player_globals.parray[p1].name, pp->name); + pprintf(p1, "Challenge from %s removed.\n", + player_globals.parray[current->whofrom].name); + delete_pending(current); + continue; + } + } +} diff --git a/lasker-2.2.3/src/pending.h b/lasker-2.2.3/src/pending.h new file mode 100644 index 0000000..cf6651f --- /dev/null +++ b/lasker-2.2.3/src/pending.h @@ -0,0 +1,44 @@ +/* + pending.h + +*/ + +#ifndef _PENDING_H +#define _PENDING_H + +#define PEND_MATCH 0 +#define PEND_DRAW 1 +#define PEND_ABORT 2 +#define PEND_TAKEBACK 3 +#define PEND_ADJOURN 4 +#define PEND_SWITCH 5 +#define PEND_SIMUL 6 +#define PEND_PAUSE 7 +#define PEND_PARTNER 8 +#define PEND_BUGHOUSE 9 +#define PEND_UNPAUSE 10 +#define PEND_ALL -1 + +#define DO_DECLINE 0x01 +#define DO_WITHDRAW 0x02 + +GENSTRUCT enum rated {UNRATED=0, RATED=1}; + +GENSTRUCT struct pending {/*Params 1=wt 2=winc 3=bt 4=binc 5=rated 6=white*/ + int type; /* 7=type */ + int whoto; /* who is offered */ + int whofrom; /* who offered it */ + int wtime; + int winc; + int btime; + int binc; + enum rated rated; + int seek_color; /* for matches */ + enum gametype game_type; + int status; /* for seek/sought */ + char *category; + char *board_type; + struct pending *next; +}; + +#endif diff --git a/lasker-2.2.3/src/playerdb.c b/lasker-2.2.3/src/playerdb.c new file mode 100644 index 0000000..1d31435 --- /dev/null +++ b/lasker-2.2.3/src/playerdb.c @@ -0,0 +1,1499 @@ +/* + Copyright (c) 1993 Richard V. Nash. + Copyright (c) 2000 Dan Papasian + Copyright (C) Andrew Tridgell 2002 + + 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., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#include "includes.h" + +static int player_zero(int p); + +static int get_empty_slot(void) +{ + int i; + + for (i = 0; i < player_globals.p_num; i++) { + if (player_globals.parray[i].status == PLAYER_EMPTY) + return i; + } + + if (i < player_globals.parray_size) { + player_globals.p_num++; + ZERO_STRUCT(player_globals.parray[i]); + player_globals.parray[i].status = PLAYER_EMPTY; + return i; + } + + if (player_globals.parray_size >= config_get_int("MAX_PLAYERS", DEFAULT_MAX_PLAYER)) { + d_printf("Too many players connected!\n"); + return -1; + } + + player_globals.parray_size += 100; + player_globals.parray = (struct player *)realloc(player_globals.parray, + player_globals.parray_size * sizeof(struct player)); + + player_globals.p_num++; + ZERO_STRUCT(player_globals.parray[i]); + player_globals.parray[i].status = PLAYER_EMPTY; + return i; +} + +int player_new(void) +{ + int new = get_empty_slot(); + + player_zero(new); + return new; +} + +static void ResetStats(struct statistics *ss) +{ + ss->num = 0; + ss->win = 0; + ss->los = 0; + ss->dra = 0; + ss->rating = config_get_int("DEFAULT_RATING", DEFAULT_RATING); + ss->sterr = config_get_int("DEFAULT_RD", DEFAULT_RD); + ss->ltime = 0; + ss->best = 0; + ss->whenbest = 0; +} + +static int player_zero(int p) +{ + struct player *pp = &player_globals.parray[p]; + + ZERO_STRUCTP(pp); + + pp->prompt = config_get("DEFAULT_PROMPT"); + pp->partner = -1; + pp->socket = -1; + pp->status = PLAYER_NEW; + + ResetStats(&pp->s_stats); + ResetStats(&pp->b_stats); + ResetStats(&pp->l_stats); + ResetStats(&pp->w_stats); + ResetStats(&pp->bug_stats); + + pp->d_time = config_get_int("DEFAULT_TIME", DEFAULT_TIME); + pp->d_inc = config_get_int("DEFAULT_INCREMENT", DEFAULT_INCREMENT); + pp->d_height = 24; + pp->d_width = 79; + pp->language = LANG_DEFAULT; + pp->promote = QUEEN; + pp->game = -1; + pp->last_channel = -1; + pp->ftell = -1; + pp->Flags = PFLAG_DEFAULT; + pp->opponent = -1; + return 0; +} + +void player_free(struct player *pp) +{ + int i; + + FREE(pp->login); + FREE(pp->more_text); + FREE(pp->name); + FREE(pp->passwd); + FREE(pp->fullName); + FREE(pp->emailAddress); + FREE(pp->prompt); + FREE(pp->formula); + FREE(pp->busy); + FREE(pp->last_tell); + FREE(pp->last_opponent); + FREE(pp->simul_info); + for (i = 0; i < pp->num_plan; i++) + FREE(pp->planLines[i]); + for (i = 0; i < pp->num_formula; i++) + FREE(pp->formulaLines[i]); + list_free(pp->lists); + for (i = 0; i < pp->numAlias; i++) { + FREE(pp->alias_list[i].comm_name); + FREE(pp->alias_list[i].alias); + } +} + +int player_clear(int p) +{ + player_free(&player_globals.parray[p]); + player_zero(p); + return 0; +} + +int player_remove(int p) +{ + struct player *pp = &player_globals.parray[p]; + int i; + + decline_withdraw_offers(p, -1, -1, DO_DECLINE | DO_WITHDRAW); + if (pp->simul_info != NULL) + /* Player disconnected in middle of simul */ + for (i = 0; pp->simul_info != NULL + && i < pp->simul_info->numBoards; i++) + if (pp->simul_info->boards[i] >= 0) + game_disconnect(pp->simul_info->boards[i], p); + + if ((pp->game >=0) && (pIsPlaying(p))) { + /* Player disconnected in the middle of a game! */ + pprintf(pp->opponent, "Your opponent has lost contact or quit."); + game_disconnect(pp->game, p); + } + for (i = 0; i < player_globals.p_num; i++) { + if (player_globals.parray[i].status == PLAYER_EMPTY) + continue; + if (player_globals.parray[i].partner == p) { + pprintf_prompt (i, "Your partner has disconnected.\n"); + decline_withdraw_offers(i, -1, PEND_BUGHOUSE, DO_DECLINE | DO_WITHDRAW); + player_globals.parray[i].partner = -1; + } + } + player_clear(p); + pp->status = PLAYER_EMPTY; + + return 0; +} + +/* + write a player file using the new generic marshalling format +*/ +static int WritePlayerFile_v100(int p) +{ + struct player pp = player_globals.parray[p]; + const char *s; + FILE *fp; + + /* zero any elements we don't want to save */ + memset(&pp, 0, offsetof(struct player, not_saved_marker)); + + /* marshall it into a string */ + s = marshall_player(&pp); + if (!s) { + d_printf("Unable to marshall player structure for %s\n", + pp.name); + return -1; + } + + fp = fopen_p("%s/%c/%s", "w", + PLAYER_DIR, + player_globals.parray[p].login[0], + player_globals.parray[p].login); + if (!fp) { + d_printf("CHESSD: Problem opening player file '%s' for write\n", + player_globals.parray[p].login); + free(s); + return -1; + } + + /* and save it */ + fprintf(fp, "v 100\n%s\n", s); + free(s); + fclose(fp); + return 0; +} + +/* + read a player file using the new generic and extensible format +*/ +static int ReadPlayerFile_v100(FILE *fp, int p) +{ + char *s, *s2; + struct player *pp = &player_globals.parray[p]; + + s = fd_load(fileno(fp), NULL); + if (!s) { + d_printf("Error reading player file for '%s'\n", pp->login); + return -1; + } + + /* skip first line */ + s2 = strchr(s, '\n'); + + /* the marshaller doesn't save zero elements, but some elements don't + default to zero. Make sure they get the right value */ + memset(&pp->not_saved_marker, 0, + sizeof(struct player) - offsetof(struct player, not_saved_marker)); + + if (!s2 || unmarshall_player(pp, s2) != 0) { + d_printf("Error unmarshalling player data for '%s'!\n", pp->login); + free(s); + return -1; + } + free(s); + + lists_validate(p); + + return 0; +} + +int player_read(int p, char *name) +{ + struct player *pp = &player_globals.parray[p]; + char fname[MAX_FILENAME_SIZE]; + char line[MAX_LINE_SIZE]; + FILE *fp; + int version = 0; + int ret; + + pp->login = stolower(strdup(name)); + + sprintf(fname, "%s/%c/%s", PLAYER_DIR, pp->login[0], pp->login); + fp = fopen_s(fname, "r"); + + if (pp->name) + free(pp->name); + + if (!fp) { /* unregistered player */ + pp->name = stolower(strdup(name)); + PFlagOFF(p, PFLAG_REG); + return -1; + } + + PFlagON(p, PFLAG_REG); /* lets load the file */ + fgets(line, MAX_LINE_SIZE, fp); /* ok so which version file? */ + + if (line[0] == 'v') { + sscanf(line, "%*c %d", &version); + } + + if (version == 9 || version == 100) { + /* its the new style */ + ret = ReadPlayerFile_v100(fp, p); + } else { + /* fall back to the old style */ + ret = player_read_old(p, fp, name, fname, version); + player_save(p); /* update to the new generic format */ + } + + fclose(fp); + + return ret; +} + +int player_save(int p) +{ + struct player *pp = &player_globals.parray[p]; + + if (!CheckPFlag(p, PFLAG_REG)) { /* Player not registered */ + return -1; + } + if (pp->name == NULL) { /* fixes a bug if name is null */ + pprintf(p, "WARNING: Your player file could not be updated, due to corrupt data.\n"); + return -1; + } + if (strcasecmp(pp->login, pp->name)) { + pprintf(p, "WARNING: Your player file could not be updated, due to corrupt data.\n"); + return -1; + } + + return WritePlayerFile_v100(p); +} + +int player_find(int fd) +{ + int i; + + for (i = 0; i < player_globals.p_num; i++) { + if (player_globals.parray[i].status == PLAYER_EMPTY) + continue; + if (player_globals.parray[i].socket == fd) + return i; + } + return -1; +} + +/* incorrectly named */ +int player_find_bylogin(const char *name) +{ + int i; + + for (i = 0; i < player_globals.p_num; i++) { + if ((player_globals.parray[i].status == PLAYER_EMPTY) || + (player_globals.parray[i].status == PLAYER_LOGIN) || + (player_globals.parray[i].status == PLAYER_PASSWORD)) + continue; + if (!player_globals.parray[i].login) + continue; + if (!strcasecmp(player_globals.parray[i].name, name)) + return i; + } + return -1; +} + +/* Now incorrectly named */ +int player_find_part_login(const char *name) +{ + int i; + int found = -1; + + i = player_find_bylogin(name); + if (i >= 0) + return i; + for (i = 0; i < player_globals.p_num; i++) { + if ((player_globals.parray[i].status == PLAYER_EMPTY) || + (player_globals.parray[i].status == PLAYER_LOGIN) || + (player_globals.parray[i].status == PLAYER_PASSWORD)) + continue; + if (!player_globals.parray[i].name) + continue; + if (!strncasecmp(player_globals.parray[i].name, name, strlen(name))) { + found = i; + break; + } + } + + if(found < 0) + return -1; + else + return found; +} + +int player_censored(int p, int p1) +{ + if (in_list(p, L_CENSOR, player_globals.parray[p1].login)) + return 1; + else + return 0; +} + +/* is p1 on p's notify list? */ +int player_notified(int p, int p1) +{ + struct player *pp = &player_globals.parray[p]; + if (!CheckPFlag(p1, PFLAG_REG)) + return 0; + + /* possible bug: p has just arrived! */ + if (!pp->name) + return 0; + + return (in_list(p, L_NOTIFY, player_globals.parray[p1].login)); +} + +void player_notify_departure(int p) +/* Notify those with notifiedby set on a departure */ +{ + struct player *pp = &player_globals.parray[p]; + int p1; + + if (!CheckPFlag(p, PFLAG_REG)) + return; + for (p1 = 0; p1 < player_globals.p_num; p1++) { + if (CheckPFlag(p1, PFLAG_NOTIFYBY) && !player_notified(p1, p) + && player_notified(p, p1) && (player_globals.parray[p1].status == PLAYER_PROMPT)) { + Bell (p1); + pprintf(p1, "\nNotification: "); + pprintf_highlight(p1, "%s", pp->name); + pprintf_prompt(p1, " has departed and isn't on your notify list.\n"); + } + } +} + +int player_notify_present(int p) +/* output Your arrival was notified by..... */ +/* also notify those with notifiedby set if necessary */ +{ + struct player *pp = &player_globals.parray[p]; + int p1; + int count = 0; + + if (!CheckPFlag(p, PFLAG_REG)) + return count; + for (p1 = 0; p1 < player_globals.p_num; p1++) { + if ((player_notified(p, p1)) && (player_globals.parray[p1].status == PLAYER_PROMPT)) { + if (!count) { + pprintf(p, "Present company includes:"); + } + count++; + pprintf(p, " %s", player_globals.parray[p1].name); + if (CheckPFlag(p1, PFLAG_NOTIFYBY) && (!player_notified(p1, p)) + && (player_globals.parray[p1].status == PLAYER_PROMPT)) { + Bell (p1); + pprintf(p1, "\nNotification: "); + pprintf_highlight(p1, "%s", pp->name); + pprintf_prompt(p1, " has arrived and isn't on your notify list.\n"); + } + } + } + if (count) + pprintf(p, ".\n"); + return count; +} + +int player_notify(int p, char *note1, char *note2) +/* notify those interested that p has arrived/departed */ +{ + struct player *pp = &player_globals.parray[p]; + int p1, count = 0; + + if (!CheckPFlag(p, PFLAG_REG)) + return count; + for (p1 = 0; p1 < player_globals.p_num; p1++) { + if ((player_notified(p1, p)) && (player_globals.parray[p1].status == PLAYER_PROMPT)) { + Bell (p1); + pprintf(p1, "\nNotification: "); + pprintf_highlight(p1, "%s", pp->name); + pprintf_prompt(p1, " has %s.\n", note1); + if (!count) { + pprintf(p, "Your %s was noted by:", note2); + } + count++; + pprintf(p, " %s", player_globals.parray[p1].name); + } + } + if (count) + pprintf(p, ".\n"); + return count; +} + +int showstored(int p) +{ + struct player *pp = &player_globals.parray[p]; + DIR *dirp; + struct dirent *dp; + + int c=0,p1; + char dname[MAX_FILENAME_SIZE]; + multicol *m = multicol_start(50); /* Limit to 50, should be enough*/ + + sprintf(dname, "%s/%c", ADJOURNED_DIR, pp->login[0]); + dirp = opendir(dname); + if (!dirp) { + multicol_end(m); + return COM_OK; + } + for (dp = readdir(dirp); dp != NULL; dp = readdir(dirp)) { + if (file_has_pname(dp->d_name, pp->login)) { + if (strcmp(file_wplayer(dp->d_name),pp->login) != 0) { + p1=player_find_bylogin(file_wplayer(dp->d_name)); + } else { + p1=player_find_bylogin(file_bplayer(dp->d_name)); + } + if (p1>=0) { + if (c<50) + multicol_store(m,player_globals.parray[p1].name); + pprintf(p1,"\nNotification: "); + pprintf_highlight(p1,"%s",pp->name); + pprintf_prompt(p1,", who has an adjourned game with you, has arrived.\n"); + c++; + } + } + } + closedir(dirp); + if (c == 1) { + pprintf(p, "1 player, who has an adjourned game with you, is online:\007"); + } else if (c > 1) { + pprintf(p, "\n%d players, who have an adjourned game with you, are online:\007",c); + } + if (c != 0) + multicol_pprint(m,p,pp->d_width,2); + multicol_end(m); + + return COM_OK; +} + +int player_count(int CountAdmins) +{ + int count; + int i; + + for (count = 0, i = 0; i < player_globals.p_num; i++) { + if ((player_globals.parray[i].status == PLAYER_PROMPT) && + (CountAdmins || !in_list(i, L_ADMIN, player_globals.parray[i].name))) + count++; + } + if (count > command_globals.player_high) + command_globals.player_high = count; + + return count; +} + +int player_idle(int p) +{ + struct player *pp = &player_globals.parray[p]; + if (pp->status != PLAYER_PROMPT) + return time(0) - pp->logon_time; + else + return time(0) - pp->last_command_time; +} + +int player_ontime(int p) +{ + struct player *pp = &player_globals.parray[p]; + return time(0) - pp->logon_time; +} + +static void write_p_inout(int inout, int p, char *file, int maxlines) +{ + struct player *pp = &player_globals.parray[p]; + FILE *fp; + + fp = fopen_s(file, "a"); + if (!fp) + return; + fprintf(fp, "%d %s %d %d %s\n", inout, pp->name, (int) time(0), + BoolCheckPFlag(p, PFLAG_REG), + dotQuad(pp->thisHost)); + fclose(fp); + if (maxlines) + truncate_file(file, maxlines); +} + +void player_write_login(int p) +{ + struct player *pp = &player_globals.parray[p]; + char fname[MAX_FILENAME_SIZE]; + + if (CheckPFlag(p, PFLAG_REG)) { + sprintf(fname, "%s/player_data/%c/%s.%s", STATS_DIR, pp->login[0], pp->login, STATS_LOGONS); + write_p_inout(P_LOGIN, p, fname, 8); + } + sprintf(fname, "%s/%s", STATS_DIR, STATS_LOGONS); + write_p_inout(P_LOGIN, p, fname, 30); + /* added complete login/logout log to "logons.log" file */ + sprintf(fname, "%s/%s", STATS_DIR, "logons.log"); + write_p_inout(P_LOGIN, p, fname, 0); +} + +void player_write_logout(int p) +{ + struct player *pp = &player_globals.parray[p]; + char fname[MAX_FILENAME_SIZE]; + + if (CheckPFlag(p, PFLAG_REG)) { + sprintf(fname, "%s/player_data/%c/%s.%s", STATS_DIR, pp->login[0], pp->login, STATS_LOGONS); + write_p_inout(P_LOGOUT, p, fname, 8); + } + sprintf(fname, "%s/%s", STATS_DIR, STATS_LOGONS); + write_p_inout(P_LOGOUT, p, fname, 30); + /* added complete login/logout log to "logons.log" file */ + sprintf(fname, "%s/%s", STATS_DIR, "logons.log"); + write_p_inout(P_LOGOUT, p, fname, 0); +} + +int player_lastdisconnect(int p) +{ + struct player *pp = &player_globals.parray[p]; + char fname[MAX_FILENAME_SIZE]; + FILE *fp; + int inout, thetime, registered; + int last = 0; + char ipstr[20]; + char loginName[MAX_LOGIN_NAME]; + + sprintf(fname, "%s/player_data/%c/%s.%s", STATS_DIR, pp->login[0], pp->login, STATS_LOGONS); + fp = fopen_s(fname, "r"); + if (!fp) + return 0; + while (!feof(fp)) { + if (fscanf(fp, "%d %s %d %d %s\n", &inout, loginName, &thetime, ®istered, ipstr) != 5) { + d_printf( "CHESSD: Error in login info format. %s\n", fname); + fclose(fp); + return 0; + } + if (inout == P_LOGOUT) + last = thetime; + } + fclose(fp); + return last; +} + +int player_is_observe(int p, int g) +{ + struct player *pp = &player_globals.parray[p]; + int i; + + for (i = 0; i < pp->num_observe; i++) { + if (pp->observe_list[i] == g) + break; + } + if (i == pp->num_observe) + return 0; + else + return 1; +} + +int player_add_observe(int p, int g) +{ + struct player *pp = &player_globals.parray[p]; + if (pp->num_observe == MAX_OBSERVE) + return -1; + pp->observe_list[pp->num_observe] = g; + pp->num_observe++; + return 0; +} + +int player_remove_observe(int p, int g) +{ + struct player *pp = &player_globals.parray[p]; + int i; + + for (i = 0; i < pp->num_observe; i++) { + if (pp->observe_list[i] == g) + break; + } + if (i == pp->num_observe) + return -1; /* Not found! */ + for (; i < pp->num_observe - 1; i++) { + pp->observe_list[i] = pp->observe_list[i + 1]; + } + pp->num_observe--; + return 0; +} + +int player_game_ended(int g) +{ + int p; + + for (p = 0; p < player_globals.p_num; p++) { + struct player *pp = &player_globals.parray[p]; + if (pp->status == PLAYER_EMPTY) + continue; + player_remove_observe(p, g); + } + remove_request(game_globals.garray[g].white, game_globals.garray[g].black, -1); + remove_request(game_globals.garray[g].black, game_globals.garray[g].white, -1); + player_save(game_globals.garray[g].white); /* Hawk: Added to save finger-info after each + game */ + player_save(game_globals.garray[g].black); + return 0; +} + +int player_goto_board(int p, int board_num) +{ + struct player *pp = &player_globals.parray[p]; + int start, count = 0, on, g; + + if (pp->simul_info == NULL) + return -1; + + if (board_num < 0 || board_num >= pp->simul_info->numBoards) + return -1; + if (pp->simul_info->boards[board_num] < 0) + return -1; + pp->simul_info->onBoard = board_num; + pp->game = pp->simul_info->boards[board_num]; + pp->opponent = game_globals.garray[pp->game].black; + if (pp->simul_info->numBoards == 1) + return 0; + send_board_to(pp->game, p); + start = pp->game; + on = pp->simul_info->onBoard; + do { + g = pp->simul_info->boards[on]; + if (g >= 0) { + if (count == 0) { + Bell (game_globals.garray[g].black); + pprintf(game_globals.garray[g].black, "\n"); + pprintf_highlight(game_globals.garray[g].black, "%s", pp->name); + pprintf_prompt(game_globals.garray[g].black, " is at your board!\n"); + } else if (count == 1) { + Bell (game_globals.garray[g].black); + pprintf(game_globals.garray[g].black, "\n"); + pprintf_highlight(game_globals.garray[g].black, "%s", pp->name); + pprintf_prompt(game_globals.garray[g].black, " will be at your board NEXT!\n"); + } else { + pprintf(game_globals.garray[g].black, "\n"); + pprintf_highlight(game_globals.garray[g].black, "%s", pp->name); + pprintf_prompt(game_globals.garray[g].black, " is %d boards away.\n", count); + } + count++; + } + on++; + if (on >= pp->simul_info->numBoards) + on = 0; + } while (start != pp->simul_info->boards[on]); + return 0; +} + +int player_goto_next_board(int p) +{ + struct player *pp = &player_globals.parray[p]; + int on; + int start; + int g; + + if (pp->simul_info == NULL) + return -1; + + on = pp->simul_info->onBoard; + start = on; + g = -1; + do { + on++; + if (on >= pp->simul_info->numBoards) + on = 0; + g = pp->simul_info->boards[on]; + if (g >= 0) + break; + } while (start != on); + if (g == -1) { + pprintf(p, "\nMajor Problem! Can't find your next board.\n"); + return -1; + } + return player_goto_board(p, on); +} + +int player_goto_prev_board(int p) +{ + struct player *pp = &player_globals.parray[p]; + int on; + int start; + int g; + + if (pp->simul_info == NULL) + return -1; + + on = pp->simul_info->onBoard; + start = on; + g = -1; + do { + --on; + if (on < 0) + on = (pp->simul_info->numBoards) - 1; + g = pp->simul_info->boards[on]; + if (g >= 0) + break; + } while (start != on); + if (g == -1) { + pprintf(p, "\nMajor Problem! Can't find your previous board.\n"); + return -1; + } + return player_goto_board(p, on); +} + +int player_goto_simulgame_bynum(int p, int num) +{ + struct player *pp = &player_globals.parray[p]; + int on; + int start; + int g; + + if (pp->simul_info == NULL) + return -1; + + on = pp->simul_info->onBoard; + start = on; + do { + on++; + if (on >= pp->simul_info->numBoards) + on = 0; + g = pp->simul_info->boards[on]; + if (g == num) + break; + } while (start != on); + if (g != num) { + pprintf(p, "\nYou aren't playing that game!!\n"); + return -1; + } + return player_goto_board(p, on); +} + +int player_num_active_boards(int p) +{ + struct player *pp = &player_globals.parray[p]; + int count = 0, i; + + if (pp->simul_info == NULL) + return 0; + + if (!pp->simul_info->numBoards) + return 0; + for (i = 0; i < pp->simul_info->numBoards; i++) + if (pp->simul_info->boards[i] >= 0) + count++; + return count; +} + +static int player_num_results(int p, int result) +{ + struct player *pp = &player_globals.parray[p]; + switch (result) { + case RESULT_WIN: + return pp->simul_info->num_wins; + case RESULT_DRAW: + return pp->simul_info->num_draws; + case RESULT_LOSS: + return pp->simul_info->num_losses; + default: + return -1; + } +} + +static void new_simul_result(struct simul_info_t *sim, int result) +{ + switch (result) { + case RESULT_WIN: + sim->num_wins++; + return; + case RESULT_DRAW: + sim->num_draws++; + return; + case RESULT_LOSS: + sim->num_losses++; + return; + } +} + +int player_simul_over(int p, int g, int result) +{ + struct player *pp = &player_globals.parray[p]; + int on, ong, p1, which; + char tmp[1024]; + + if (pp->simul_info == NULL) + return -1; + + for (which = 0; which < pp->simul_info->numBoards; which++) { + if (pp->simul_info->boards[which] == g) { + break; + } + } + if (which == pp->simul_info->numBoards) { + pprintf(p, "I can't find that game!\n"); + return -1; + } + pprintf(p, "\nBoard %d has completed.\n", which + 1); + on = pp->simul_info->onBoard; + ong = pp->simul_info->boards[on]; + pp->simul_info->boards[which] = -1; + new_simul_result(pp->simul_info, result); + if (player_num_active_boards(p) == 0) { + sprintf(tmp, "\n{Simul (%s vs. %d) is over.}\nResults: %d Wins, %d Losses, %d Draws, %d Aborts\n", + pp->name, + pp->simul_info->numBoards, + player_num_results(p, RESULT_WIN), + player_num_results(p, RESULT_LOSS), + player_num_results(p, RESULT_DRAW), + player_num_results(p, RESULT_ABORT)); + for (p1 = 0; p1 < player_globals.p_num; p1++) { + if (pp->status != PLAYER_PROMPT) + continue; + if (!CheckPFlag(p1, PFLAG_GIN) && !player_is_observe(p1, g) && (p1 != p)) + continue; + pprintf_prompt(p1, "%s", tmp); + } + pp->simul_info->numBoards = 0; + pprintf_prompt(p, "\nThat was the last board, thanks for playing.\n"); + free(pp->simul_info); + pp->simul_info = NULL; + return 0; + } + if (ong == g) { /* This game is over */ + player_goto_next_board(p); + } else { + player_goto_board(p, pp->simul_info->onBoard); + } + pprintf_prompt(p, "\nThere are %d boards left.\n", + player_num_active_boards(p)); + return 0; +} + +static void GetMsgFile (int p, char *fName) +{ + struct player *pp = &player_globals.parray[p]; + sprintf(fName, "%s/player_data/%c/%s.%s", STATS_DIR, pp->login[0], + pp->login, STATS_MESSAGES); +} + +int player_num_messages(int p) +{ + char fname[MAX_FILENAME_SIZE]; + + if (!CheckPFlag(p, PFLAG_REG)) + return 0; + GetMsgFile (p, fname); + return lines_file(fname); +} + +int player_add_message(int top, int fromp, char *message) +{ + char fname[MAX_FILENAME_SIZE]; + FILE *fp; + char subj[256]; + char messbody[1024]; + time_t t = time(0); + + if (!CheckPFlag(top, PFLAG_REG)) + return -1; + if (!CheckPFlag(fromp, PFLAG_REG)) + return -1; + GetMsgFile (top, fname); + if ((lines_file(fname) >= MAX_MESSAGES) && (player_globals.parray[top].adminLevel == 0)) + return -1; + fp = fopen_s(fname, "a"); + if (!fp) + return -1; + fprintf(fp, "%s at %s: %s\n", player_globals.parray[fromp].name, strltime(&t), message); + fclose(fp); + pprintf(fromp, "\nThe following message was sent "); + if (CheckPFlag(top, PFLAG_MAILMESS)) { + sprintf(subj, "FICS message from %s at FICS %s (Do not reply by mail)", + player_globals.parray[fromp].name, + config_get_tmp("SERVER_HOSTNAME")); + sprintf(messbody, "%s at %s: %s\n", player_globals.parray[fromp].name, strltime(&t), message); + mail_string_to_user(top, subj, messbody); + pprintf(fromp, "(and emailed) "); + } + pprintf(fromp, "to %s: \n %s\n", player_globals.parray[top].name, message); + return 0; +} + +static int player_forward_message(int top, int fromp, char *message) +{ + char fname[MAX_FILENAME_SIZE]; + FILE *fp; + char subj[256]; + char messbody[1024]; + + if (!CheckPFlag(top, PFLAG_REG)) + return -1; + if (!CheckPFlag(fromp, PFLAG_REG)) + return -1; + GetMsgFile (top, fname); + if ((lines_file(fname) >= MAX_MESSAGES) && (player_globals.parray[top].adminLevel == 0)) + return -1; + fp = fopen_s(fname, "a"); + if (!fp) + return -1; + fprintf(fp, "FORWARDED MSG FROM %s : %s", player_globals.parray[fromp].name, message); + fclose(fp); + pprintf(fromp, "\nThe following message was forwarded "); + if (CheckPFlag(top, PFLAG_MAILMESS)) { + sprintf(subj, "FICS message from %s at FICS %s (Do not reply by mail)", + player_globals.parray[fromp].name, + config_get_tmp("SERVER_HOSTNAME")); + sprintf(messbody, "FORWARDED MSG FROM %s: %s\n", player_globals.parray[fromp].name, message); + mail_string_to_user(top, subj, messbody); + pprintf(fromp, "(and emailed) "); + } + pprintf(fromp, "to %s: \n %s\n", player_globals.parray[top].name, message); + return 0; +} +void SaveTextListEntry(textlist **Entry, char *string, int n) +{ + *Entry = (textlist *) malloc(sizeof(textlist)); + (*Entry)->text = strdup(string); + (*Entry)->index = n; + (*Entry)->next = NULL; +} + +static textlist *ClearTextListEntry(textlist *entry) +{ + textlist *ret = entry->next; + free(entry->text); + free(entry); + return ret; +} + +void ClearTextList(textlist *head) +{ + textlist *cur; + + for (cur = head; cur != NULL; cur = ClearTextListEntry(cur)); +} + +static int SaveThisMsg (int which, char *line) +{ + char Sender[MAX_LOGIN_NAME]; + int p1; + + if (which == 0) return 1; + + sscanf (line, "%s", Sender); + if (which < 0) { + p1 = -which - 1; + return strcmp(Sender, player_globals.parray[p1].name); + } + else { + p1 = which - 1; + return !strcmp(Sender, player_globals.parray[p1].name); + } +} + +static int LoadMsgs(int p, int which, textlist **Head) +{ + FILE *fp; + textlist **Cur = Head; + char fName[MAX_FILENAME_SIZE]; + char line[MAX_LINE_SIZE]; + int n=0, nSave=0; + + *Head = NULL; + GetMsgFile (p, fName); + fp = fopen_s(fName, "r"); + if (fp == NULL) { + return -1; + } + while (!feof(fp)) { + fgets(line, MAX_LINE_SIZE, fp); + if (feof(fp)) + break; + if (SaveThisMsg(which, line)) { + SaveTextListEntry(Cur, line, ++n); + Cur = &(*Cur)->next; + nSave++; + } + else n++; + } + fclose (fp); + return nSave; +} + +/* start > 0 and end > start (or end = 0) to save messages in range; + start < 0 and end < start (or end = 0) to clear messages in range; + if end = 0, range goes to end of file (not tested yet). */ +static int LoadMsgRange(int p, int start, int end, textlist **Head) +{ + FILE *fp; + char fName[MAX_FILENAME_SIZE]; + char line[MAX_LINE_SIZE]; + textlist **Cur = Head; + int n=1, nSave=0, nKill=0; + + *Head = NULL; + GetMsgFile (p, fName); + fp = fopen (fName, "r"); + if (fp == NULL) { + pprintf (p, "You have no messages.\n"); + return -1; + } + for (n=1; n <= end || end <= 0; n++) { + fgets (line, MAX_LINE_SIZE, fp); + if (feof(fp)) + break; + if ((start < 0 && (n < -start || n > -end)) || (start >= 0 && n >= start)) { + SaveTextListEntry (Cur, line, n); + Cur = &(*Cur)->next; + nSave++; + } + else nKill++; + } + fclose (fp); + if (start < 0) { + if (n <= -start) + pprintf (p, "You do not have a message %d.\n", -start); + return nKill; + } else { + if (n <= start) + pprintf (p, "You do not have a message %d.\n", start); + return nSave; + } +} + +int ForwardMsgRange(char *p1, int p, int start, int end) +{ + /* p1 is player to and p is player from */ + FILE *fp; + char fName[MAX_FILENAME_SIZE]; + char line[MAX_LINE_SIZE]; + int n=1, top, connected; + + if (!FindPlayer(p, p1, &top, &connected)) + return -1; + GetMsgFile (p, fName); + fp = fopen (fName, "r"); + if (fp == NULL) { + pprintf (p, "You have no messages.\n"); + return -1; + } + for (n=1; n <= end || end <= 0; n++) { + fgets (line, MAX_LINE_SIZE, fp); + if (feof(fp)) + break; + if ((start < 0 && (n < -start || n > -end)) || (start >= 0 && n >= start)) { + player_forward_message(top, p, line); + } + } + fclose (fp); + if (start < 0) { + if (n <= -start) + pprintf (p, "You do not have a message %d.\n", -start); + return 0; + } else { + if (n <= start) + pprintf (p, "You do not have a message %d.\n", start); + return 0; + } +} + +static int WriteMsgFile (int p, textlist *Head) +{ + char fName[MAX_FILENAME_SIZE]; + FILE *fp; + textlist *Cur; + + GetMsgFile (p, fName); + fp = fopen_s(fName, "w"); + if (fp == NULL) + return 0; + for (Cur = Head; Cur != NULL; Cur = Cur->next) + fprintf(fp, "%s", Cur->text); + fclose(fp); + return 1; +} + +int ClearMsgsBySender(int p, param_list param) +{ + struct player *pp = &player_globals.parray[p]; + textlist *Head; + int p1, connected; + int nFound; + + if (!FindPlayer(p, param[0].val.word, &p1, &connected)) + return -1; + + nFound = LoadMsgs(p, -(p1+1), &Head); + if (nFound < 0) { + pprintf(p, "You have no messages.\n"); + } else if (nFound == 0) { + pprintf(p, "You have no messages from %s.\n", player_globals.parray[p1].name); + } else { + if (WriteMsgFile (p, Head)) + pprintf(p, "Messages from %s cleared.\n", player_globals.parray[p1].name); + else { + pprintf(p, "Problem writing message file; please contact an admin.\n"); + d_printf( "Problem writing message file for %s.\n", pp->name); + } + ClearTextList(Head); + } + if (!connected) + player_remove(p1); + return nFound; +} + +static void ShowTextList (int p, textlist *Head, int ShowIndex) +{ + textlist *CurMsg; + + if (ShowIndex) { + for (CurMsg = Head; CurMsg != NULL; CurMsg = CurMsg->next) + pprintf(p, "%2d. %s", CurMsg->index, CurMsg->text); + } + else { + for (CurMsg = Head; CurMsg != NULL; CurMsg = CurMsg->next) + pprintf(p, "%s", CurMsg->text); + } +} + +int player_show_messages(int p) +{ + textlist *Head; + int n; + + n = LoadMsgs (p, 0, &Head); + if (n <= 0) { + pprintf (p, "You have no messages.\n"); + return -1; + } else { + pprintf (p, "Messages:\n"); + ShowTextList (p, Head, 1); + ClearTextList (Head); + return 0; + } +} + +int ShowMsgsBySender(int p, param_list param) +{ + textlist *Head; + int p1, connected; + int nFrom; + int nTo = 0; + + if (!FindPlayer(p, param[0].val.word, &p1, &connected)) + return -1; + + if (!CheckPFlag(p1, PFLAG_REG)) { + pprintf(p, "Player \"%s\" is unregistered and cannot send or receive messages.\n", + player_globals.parray[p1].name); + return -1; /* no need to disconnect */ + } + + if (p != p1) { + nTo = LoadMsgs(p1, p+1, &Head); + if (nTo <= 0) { + pprintf(p, "%s has no messages from you.\n", player_globals.parray[p1].name); + } else { + pprintf(p, "Messages to %s:\n", player_globals.parray[p1].name); + ShowTextList (p, Head, 0); + ClearTextList(Head); + } + } + nFrom = LoadMsgs(p, p1+1, &Head); + if (nFrom <= 0) { + pprintf(p, "\nYou have no messages from %s.\n", player_globals.parray[p1].name); + } else { + pprintf(p, "Messages from %s:\n", player_globals.parray[p1].name); + ShowTextList (p, Head, 1); + ClearTextList(Head); + } + if (!connected) + player_remove(p1); + return (nFrom > 0 || nTo > 0); +} + +int ShowMsgRange (int p, int start, int end) +{ + textlist *Head; + int n; + + n = LoadMsgRange (p, start, end, &Head); + if (n > 0) { + ShowTextList (p, Head, 1); + ClearTextList (Head); + } + return n; +} + +int ClrMsgRange (int p, int start, int end) +{ + textlist *Head; + int n; + + n = LoadMsgRange (p, -start, -end, &Head); + if (n > 0) + if (WriteMsgFile (p, Head)) + pprintf (p, "Message %d cleared.\n", start); + if (n >= 0) + ClearTextList (Head); + + return n; +} + +int player_clear_messages(int p) +{ + char fname[MAX_FILENAME_SIZE]; + + if (!CheckPFlag(p, PFLAG_REG)) + return -1; + GetMsgFile (p, fname); + unlink(fname); + return 0; +} + +int player_search(int p, char *name) +/* + * Find player matching the given string. First looks for exact match + * with a logged in player, then an exact match with a registered player, + * then a partial unique match with a logged in player, then a partial + * match with a registered player. + * Returns player number if the player is connected, negative (player number) + * if the player had to be connected, and 0 if no player was found + */ +{ + int p1, count; + char *buffer[1000]; + char pdir[MAX_FILENAME_SIZE]; + + /* exact match with connected player? */ + if ((p1 = player_find_bylogin(name)) >= 0) { + return p1 + 1; + } + /* exact match with registered player? */ + sprintf(pdir, "%s/%c", PLAYER_DIR, name[0]); + count = search_directory(pdir, name, buffer, 1000); + if (count > 0 && !strcmp(name, *buffer)) { + goto ReadPlayerFromFile; /* found an unconnected registered player */ + } + /* partial match with connected player? */ + if ((p1 = player_find_part_login(name)) >= 0) { + return p1 + 1; + } else if (p1 == -2) { + /* ambiguous; matches too many connected players. */ + pprintf (p, "Ambiguous name '%s'; matches more than one player.\n", name); + return 0; + } + /* partial match with registered player? */ + if (count < 1) { + pprintf(p, "There is no player matching that name.\n"); + return 0; + } + if (count > 1) { + pprintf(p, "-- Matches: %d names --", count); + display_directory(p, buffer, count); + return(0); + } +ReadPlayerFromFile: + p1 = player_new(); + if (player_read(p1, *buffer)) { + player_remove(p1); + pprintf(p, "ERROR: a player named %s was expected but not found!\n", + *buffer); + pprintf(p, "Please tell an admin about this incident. Thank you.\n"); + return 0; + } + return (-p1) - 1; /* negative to indicate player was not + connected */ +} + + +int player_kill(char *name) +{ + char fname[MAX_FILENAME_SIZE], fname2[MAX_FILENAME_SIZE]; + + sprintf(fname, "%s/%c/%s", PLAYER_DIR, name[0], name); + sprintf(fname2, "%s/%c/.rem.%s", PLAYER_DIR, name[0], name); + rename(fname, fname2); + RemHist (name); + sprintf(fname, "%s/player_data/%c/%s.games", STATS_DIR, name[0], name); + sprintf(fname2, "%s/player_data/%c/.rem.%s.games", STATS_DIR, name[0], name); + rename(fname, fname2); + sprintf(fname, "%s/player_data/%c/%s.comments", STATS_DIR, name[0], name); + sprintf(fname2, "%s/player_data/%c/.rem.%s.comments", STATS_DIR, name[0], name); + rename(fname, fname2); + + sprintf(fname, "%s/player_data/%c/%s.logons", STATS_DIR, name[0], name); + sprintf(fname2, "%s/player_data/%c/.rem.%s.logons", STATS_DIR, name[0], name); + rename(fname, fname2); + sprintf(fname, "%s/player_data/%c/%s.messages", STATS_DIR, name[0], name); + sprintf(fname2, "%s/player_data/%c/.rem.%s.messages", STATS_DIR, name[0], name); + rename(fname, fname2); + return 0; +} + +int player_rename(char *name, char *newname) +{ + char fname[MAX_FILENAME_SIZE], fname2[MAX_FILENAME_SIZE]; + + sprintf(fname, "%s/%c/%s", PLAYER_DIR, name[0], name); + sprintf(fname2, "%s/%c/%s", PLAYER_DIR, newname[0], newname); + rename(fname, fname2); + sprintf(fname, "%s/player_data/%c/%s.games", STATS_DIR, name[0], name); + sprintf(fname2, "%s/player_data/%c/%s.games", STATS_DIR, newname[0], newname); + rename(fname, fname2); + sprintf(fname, "%s/player_data/%c/%s.comments", STATS_DIR, name[0], name); + sprintf(fname2, "%s/player_data/%c/%s.comments", STATS_DIR, newname[0], newname); + rename(fname, fname2); + sprintf(fname, "%s/player_data/%c/%s.logons", STATS_DIR, name[0], name); + sprintf(fname2, "%s/player_data/%c/%s.logons", STATS_DIR, newname[0], newname); + rename(fname, fname2); + sprintf(fname, "%s/player_data/%c/%s.messages", STATS_DIR, name[0], name); + sprintf(fname2, "%s/player_data/%c/%s.messages", STATS_DIR, newname[0], newname); + rename(fname, fname2); + return 0; +} + +int player_reincarn(char *name, char *newname) +{ + char fname[MAX_FILENAME_SIZE], fname2[MAX_FILENAME_SIZE]; + + sprintf(fname, "%s/%c/%s", PLAYER_DIR, newname[0], newname); + sprintf(fname2, "%s/%c/.rem.%s", PLAYER_DIR, name[0], name); + rename(fname2, fname); + sprintf(fname, "%s/player_data/%c/%s.games", STATS_DIR, newname[0], newname); + sprintf(fname2, "%s/player_data/%c/.rem.%s.games", STATS_DIR, name[0], name); + rename(fname2, fname); + sprintf(fname, "%s/player_data/%c/%s.comments", STATS_DIR, newname[0], newname); + sprintf(fname2, "%s/player_data/%c/.rem.%s.comments", STATS_DIR, name[0], name); + rename(fname2, fname); + sprintf(fname, "%s/player_data/%c/%s.logons", STATS_DIR, newname[0], newname); + sprintf(fname2, "%s/player_data/%c/.rem.%s.logons", STATS_DIR, name[0], name); + rename(fname2, fname); + sprintf(fname, "%s/player_data/%c/%s.messages", STATS_DIR, newname[0], newname); + sprintf(fname2, "%s/player_data/%c/.rem.%s.messages", STATS_DIR, name[0], name); + rename(fname2, fname); + return 0; +} + +int player_num_comments(int p) +{ + struct player *pp = &player_globals.parray[p]; + char fname[MAX_FILENAME_SIZE]; + + if (!CheckPFlag(p, PFLAG_REG)) + return 0; + sprintf(fname, "%s/player_data/%c/%s.%s", STATS_DIR, pp->login[0], + pp->login, "comments"); + return lines_file(fname); +} + +int player_add_comment(int p_by, int p_to, char *comment) +{ + char fname[MAX_FILENAME_SIZE]; + FILE *fp; + time_t t = time(0); + + if (!CheckPFlag(p_to, PFLAG_REG)) + return -1; + sprintf(fname, "%s/player_data/%c/%s.%s", STATS_DIR, player_globals.parray[p_to].login[0], + player_globals.parray[p_to].login, "comments"); + fp = fopen_s(fname, "a"); + if (!fp) + return -1; + fprintf(fp, "%s at %s: %s\n", player_globals.parray[p_by].name, strltime(&t), comment); + fclose(fp); + player_globals.parray[p_to].num_comments = player_num_comments(p_to); + return 0; +} + +int player_show_comments(int p, int p1) +{ + char fname[MAX_FILENAME_SIZE]; + + if (CheckPFlag(p1, PFLAG_REG)) { + sprintf(fname, "%s/player_data/%c/%s.%s", STATS_DIR, player_globals.parray[p1].login[0], + player_globals.parray[p1].login, "comments"); + if (psend_file(p, NULL, fname)) + pprintf(p, "There are no comments to show for %s.\n", player_globals.parray[p1].name); + if (player_globals.parray[p1].passwd[0] == '*') + pprintf(p, "%s's account is LOCKED.\n", player_globals.parray[p1].name); + if (in_list(p1, L_BAN, player_globals.parray[p1].name)) + pprintf(p, "%s has been BANNED.\n", player_globals.parray[p1].name); + } else + pprintf(p, "Player \"%s\" is unregistered and cannot have comments.\n", + player_globals.parray[p1].name); + return 0; +} + +/* returns 1 if player is head admin, 0 otherwise */ +int player_ishead(int p) +{ + struct player *pp = &player_globals.parray[p]; + return (strcasecmp(pp->name, config_get_tmp("HEAD_ADMIN")) == 0); +} + +/* GetRating chooses between blitz, standard and other ratings. */ +int GetRating(struct player *p, int gametype) +{ + if (gametype == TYPE_BLITZ) return (p->b_stats.rating); + else if (gametype == TYPE_STAND) return (p->s_stats.rating); + else if (gametype == TYPE_WILD) return (p->w_stats.rating); + else if (gametype == TYPE_LIGHT) return (p->l_stats.rating); + else if (gametype == TYPE_BUGHOUSE) return (p->bug_stats.rating); + else return 0; +} /* end of function GetRating. */ + +/* GetRD chooses between blitz, standard and other RD's. */ +double GetRD(struct player *p, int gametype) +{ + struct statistics *s; + + switch(gametype) { + case TYPE_BLITZ: s = &p->b_stats; break; + case TYPE_STAND: s = &p->s_stats; break; + case TYPE_WILD: s = &p->w_stats; break; + case TYPE_LIGHT: s = &p->l_stats; break; + case TYPE_BUGHOUSE: s = &p->bug_stats; break; + default: return 0.0; + } + return (current_sterr(s->sterr, time(NULL)-(s->ltime))); +} /* end of function GetRD. */ + diff --git a/lasker-2.2.3/src/playerdb.h b/lasker-2.2.3/src/playerdb.h new file mode 100644 index 0000000..3d98ae6 --- /dev/null +++ b/lasker-2.2.3/src/playerdb.h @@ -0,0 +1,179 @@ +/* + Copyright (c) 1993 Richard V. Nash. + Copyright (c) 2000 Dan Papasian + Copyright (C) Andrew Tridgell 2002 + + 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., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#ifndef _PLAYERDB_H +#define _PLAYERDB_H + +#define MAX_OBSERVE 30 /* max # of games one person can observe */ +#define MAX_PLAN 10 +#define MAX_FORMULA 9 +#define MAX_CENSOR 50 +#define MAX_NOTIFY 80 +#define MAX_SIMUL 100 +#define MAX_MESSAGES 40 +#define MAX_INCHANNELS 16 + +#define PLAYER_EMPTY 0 +#define PLAYER_NEW 1 +#define PLAYER_INQUEUE 2 +#define PLAYER_LOGIN 3 +#define PLAYER_PASSWORD 4 +#define PLAYER_PROMPT 5 + +#define P_LOGIN 0 +#define P_LOGOUT 1 + +#define SORT_BLITZ 0 +#define SORT_STAND 1 +#define SORT_ALPHA 2 +#define SORT_WILD 3 + +GENSTRUCT struct statistics { + int num, win, los, dra, rating, ltime, best, whenbest; + double sterr; +}; + +GENSTRUCT struct simul_info_t { + int numBoards; + int onBoard; + int num_wins, num_draws, num_losses; + int boards[MAX_SIMUL]; +}; + +#define PFLAG_REG 0x1 +#define PFLAG_OPEN 0x2 +#define PFLAG_ROPEN 0x4 +#define PFLAG_SIMOPEN 0x8 +#define PFLAG_FLIP 0x10 +#define PFLAG_ADMINLIGHT 0x20 +#define PFLAG_RATED 0x40 +#define PFLAG_BLACKSIDE 0x80 /* not done; replacing side. */ +#define PFLAG_LASTBLACK 0x100 +#define PFLAG_PIN 0x200 +#define PFLAG_GIN 0x400 +#define PFLAG_AVAIL 0x800 /* to be informed about who is available for games*/ +#define PFLAG_PRIVATE 0x1000 +#define PFLAG_JPRIVATE 0x2000 +#define PFLAG_AUTOMAIL 0x4000 +#define PFLAG_MAILMESS 0x8000 +#define PFLAG_SHOUT 0x10000 +#define PFLAG_CSHOUT 0x20000 +#define PFLAG_TELL 0x40000 +#define PFLAG_KIBITZ 0x80000 +#define PFLAG_NOTIFYBY 0x100000 +#define PFLAG_PGN 0x200000 +#define PFLAG_BELL 0x400000 +#define PFLAG_HIDEINFO 0x800000 +#define PFLAG_TOURNEY 0x1000000 /* Not coded yet. */ +#define PFLAG_ADS 0x2000000 +/* Note: we're starting the last byte, assuming a long int has 4 bytes; + If we run out, we probably should make a Flag1 and a Flag2. */ + +#define PFLAG_DEFAULT (PFLAG_OPEN | PFLAG_ROPEN | PFLAG_SHOUT \ + | PFLAG_CSHOUT | PFLAG_KIBITZ \ + | PFLAG_ADMINLIGHT) + +/* PFLAG_SAVED will make a good mask. */ +#define PFLAG_SAVED (PFLAG_OPEN | PFLAG_ROPEN | PFLAG_RATED | PFLAG_BELL \ + | PFLAG_PIN | PFLAG_GIN | PFLAG_AVAIL | PFLAG_PRIVATE \ + | PFLAG_JPRIVATE | PFLAG_AUTOMAIL | PFLAG_MAILMESS \ + | PFLAG_MAILMESS | PFLAG_SHOUT | PFLAG_CSHOUT \ + | PFLAG_TELL | PFLAG_KIBITZ | PFLAG_NOTIFYBY | PFLAG_PGN) + +GENSTRUCT struct player { + /* This first block is not saved between logins */ + char *login; + int socket; + int status; + int game; + int opponent; /* Only valid if game is >= 0 */ + int side; /* Only valid if game is >= 0 */ + int timeOfReg; + int totalTime; + int ftell; /* Are you forwarding tells? -1 if not else who from */ + int logon_time; + int last_command_time; + int num_observe; + int observe_list[MAX_OBSERVE]; + struct in_addr thisHost; + int lastshout_a; + int lastshout_b; + struct simul_info_t *simul_info; + int num_comments; /* number of lines in comments file */ + int partner; + char *more_text; + int kiblevel; + int number_pend_from; /* not really necessary but are used to cut down */ + int number_pend_to; /* search - DAV */ + struct ivariables ivariables; + char *interface; + + /* this is a dummy variable used to tell which bits are saved in the structure */ + unsigned not_saved_marker; + + unsigned Flags; + char *name; + char *passwd; + char *fullName; + char *emailAddress; + const char *prompt; + char *busy; + char *last_tell; + int last_channel; + char *last_opponent; + struct statistics s_stats; + struct statistics b_stats; + struct statistics w_stats; + struct statistics l_stats; + struct statistics bug_stats; + int d_time; + int d_inc; + int d_height; + int d_width; + int language; + int style; + int promote; + int adminLevel; + int availmin; + int availmax; + int num_plan; + char *planLines[MAX_PLAN]; + int num_formula; + char *formulaLines[MAX_FORMULA]; + char *formula; + int num_white; + int num_black; + struct in_addr lastHost; + int numAlias; + struct alias_type *alias_list; _LEN(numAlias) + int highlight; + struct List *lists; + int latest_news; + int admin_latest_news; +}; + +typedef struct textlist { + char *text; + int index; + struct textlist *next; +} textlist; + +#endif /* _PLAYERDB_H */ + diff --git a/lasker-2.2.3/src/playerdb_old.c b/lasker-2.2.3/src/playerdb_old.c new file mode 100644 index 0000000..0fcbef2 --- /dev/null +++ b/lasker-2.2.3/src/playerdb_old.c @@ -0,0 +1,694 @@ +/* + Copyright (c) 1993 Richard V. Nash. + Copyright (c) 2000 Dan Papasian + Copyright (C) Andrew Tridgell 2002 + + 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., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#include "includes.h" + +/* + support for reading the old player formats + thank goodness I don't need to update this any more! It sure was a complex format. +*/ + + +/* return 0 if corrupt */ + +static int ReadV1PlayerFmt(int p,struct player *pp, FILE * fp, const char *file, int version) +{ + + int i,size_cens, size_noplay, size_not, size_gnot, size_chan, len; + int bs,ss,ws,ls,bugs; + int bell, pgn, notifiedby, pin, gin, avail, private, jprivate; + int open, ropen, rated, tell, kib, shout, cshout, automail, mailmess; + int numAlias = 0; + + char* tmp; + char tmp2[MAX_STRING_LENGTH]; + + fgets(tmp2, MAX_STRING_LENGTH, fp); + if (strcmp(tmp2,"NONE\n")) { + tmp2[strlen(tmp2)-1] = '\0'; + pp->name = strdup (tmp2); + } else + pp->name = NULL; + fgets(tmp2, MAX_STRING_LENGTH, fp); + if (strcmp(tmp2,"NONE\n")) { + tmp2[strlen(tmp2)-1] = '\0'; + pp->fullName = strdup (tmp2); + } else + pp->fullName = NULL; + fgets(tmp2, MAX_STRING_LENGTH, fp); + if (strcmp(tmp2,"NONE\n")) { + tmp2[strlen(tmp2)-1] = '\0'; + pp->passwd = strdup (tmp2); + } else + pp->passwd = NULL; + fgets(tmp2, MAX_STRING_LENGTH, fp); + if (strcmp(tmp2,"NONE\n")) { + tmp2[strlen(tmp2)-1] = '\0'; + pp->emailAddress = strdup (tmp2); + } else + pp->emailAddress = NULL; + if (fscanf(fp, "%u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %d\n", + + &pp->s_stats.num, &pp->s_stats.win, &pp->s_stats.los, + &pp->s_stats.dra, &pp->s_stats.rating, &ss, + &pp->s_stats.ltime, &pp->s_stats.best, &pp->s_stats.whenbest, + + &pp->b_stats.num, &pp->b_stats.win, &pp->b_stats.los, + &pp->b_stats.dra, &pp->b_stats.rating, &bs, + &pp->b_stats.ltime, &pp->b_stats.best, &pp->b_stats.whenbest, + + &pp->w_stats.num, &pp->w_stats.win, &pp->w_stats.los, + &pp->w_stats.dra, &pp->w_stats.rating, &ws, + &pp->w_stats.ltime, &pp->w_stats.best, &pp->w_stats.whenbest, + + &pp->l_stats.num, &pp->l_stats.win, &pp->l_stats.los, + &pp->l_stats.dra, &pp->l_stats.rating, &ls, + &pp->l_stats.ltime, &pp->l_stats.best, &pp->l_stats.whenbest, + + &pp->bug_stats.num, &pp->bug_stats.win, &pp->bug_stats.los, + &pp->bug_stats.dra, &pp->bug_stats.rating, &bugs, + &pp->bug_stats.ltime, &pp->bug_stats.best, &pp->bug_stats.whenbest, + &pp->lastHost.s_addr) != 46) { + d_printf("Player %s is corrupt\n",player_globals.parray[p].name); + free(pp->fullName); + free(pp->passwd); + free(pp->emailAddress); + pp->fullName = NULL; + pp->passwd = NULL; + pp->emailAddress = NULL; + return 0; + } + + pp->b_stats.sterr = bs / 10.0; + pp->s_stats.sterr = ss / 10.0; + pp->w_stats.sterr = ws / 10.0; + pp->l_stats.sterr = ls / 10.0; + pp->bug_stats.sterr = bugs / 10.0; + + fgets (tmp2, MAX_STRING_LENGTH, fp); + tmp2[strlen(tmp2)-1] = '\0'; + pp->prompt = strdup(tmp2); + if (version == 1) { + if (fscanf (fp, "%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d\n", + &open, &rated, &ropen, &pp->timeOfReg, + &pp->totalTime, &bell, &pgn, ¬ifiedby, + &pin, &gin, &shout, &cshout, + &tell, &kib, &private, &jprivate, + &automail, &mailmess, &pp->style, &pp->d_time, + &pp->d_inc, &pp->d_height, &pp->d_width, &pp->language, + &pp->adminLevel, &pp->num_white, &pp->num_black, &pp->highlight, + &pp->num_comments, + &pp->num_plan, &pp->num_formula,&size_cens, + &size_not, &size_noplay, + &size_gnot, &numAlias, &size_chan) != 37) { + d_printf("Player %s is corrupt.\n",player_globals.parray[p].name); + free(pp->prompt); + pp->prompt = config_get("DEFAULT_PROMPT"); + free(pp->fullName); + free(pp->passwd); + free(pp->emailAddress); + pp->fullName = NULL; + pp->passwd = NULL; + pp->emailAddress = NULL; + pp->num_plan = 0; + pp->num_formula = 0; + pp->adminLevel = 0; + return 0; + } + } else if (version == 2) { + if (fscanf (fp, "%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d\n", + &open, &rated, &ropen, &pp->timeOfReg, + &pp->totalTime, &bell, &pgn, ¬ifiedby, + &pin, &gin, &avail, &shout, &cshout, + &tell, &kib, &private, &jprivate, + &automail, &mailmess, &pp->style, &pp->d_time, + &pp->d_inc, &pp->d_height, &pp->d_width, &pp->language, + &pp->adminLevel, &pp->num_white, &pp->num_black, &pp->highlight, + &pp->num_comments, + &pp->num_plan, &pp->num_formula,&size_cens, + &size_not, &size_noplay, + &size_gnot, &numAlias, &size_chan) != 38) { + d_printf("Player %s is corrupt.\n",player_globals.parray[p].name); + free(pp->prompt); + pp->prompt = config_get("DEFAULT_PROMPT"); + free(pp->fullName); + free(pp->passwd); + free(pp->emailAddress); + pp->fullName = NULL; + pp->passwd = NULL; + pp->emailAddress = NULL; + pp->num_plan = 0; + pp->num_formula = 0; + pp->adminLevel = 0; + return 0; + } + } else if (version > 2) { + if (fscanf (fp, "%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d\n", + &open, &rated, &ropen, &pp->timeOfReg, + &pp->totalTime, &bell, &pgn, ¬ifiedby, + &pin, &gin, &avail, &shout, &cshout, + &tell, &kib, &private, &jprivate, + &automail, &mailmess, &pp->style, &pp->d_time, + &pp->d_inc, &pp->d_height, &pp->d_width, &pp->language, + &pp->adminLevel, &pp->num_white, &pp->num_black, &pp->highlight, + &pp->num_comments, + &pp->num_plan, &pp->num_formula,&size_cens, + &size_not, &size_noplay, + &size_gnot, &numAlias, &size_chan, &pp->availmin, &pp->availmax) != 40) { + d_printf("Player %s is corrupt.\n",player_globals.parray[p].name); + free(pp->prompt); + pp->prompt = config_get("DEFAULT_PROMPT"); + free(pp->fullName); + free(pp->passwd); + free(pp->emailAddress); + pp->fullName = NULL; + pp->passwd = NULL; + pp->emailAddress = NULL; + pp->num_plan = 0; + pp->num_formula = 0; + pp->adminLevel = 0; + return 0; + } + } + SetFlag(pp->Flags, PFLAG_OPEN, open); + SetFlag(pp->Flags, PFLAG_ROPEN, ropen); + SetFlag(pp->Flags, PFLAG_RATED, rated); + SetFlag(pp->Flags, PFLAG_BELL, bell); + SetFlag(pp->Flags, PFLAG_PGN, pgn); + SetFlag(pp->Flags, PFLAG_NOTIFYBY, notifiedby); + SetFlag(pp->Flags, PFLAG_PIN, pin); + SetFlag(pp->Flags, PFLAG_GIN, gin); + SetFlag(pp->Flags, PFLAG_AVAIL, avail); + SetFlag(pp->Flags, PFLAG_PRIVATE, private); + SetFlag(pp->Flags, PFLAG_JPRIVATE, jprivate); + SetFlag(pp->Flags, PFLAG_SHOUT, shout); + SetFlag(pp->Flags, PFLAG_CSHOUT, cshout); + SetFlag(pp->Flags, PFLAG_TELL, tell); + SetFlag(pp->Flags, PFLAG_KIBITZ, kib); + SetFlag(pp->Flags, PFLAG_AUTOMAIL, automail); + SetFlag(pp->Flags, PFLAG_MAILMESS, mailmess); + + if (version > 3) + getc (fp); /* skip a dot */ + + if (pp->num_plan > 0) { + for (i = 0; i < pp->num_plan; i++) { + fgets(tmp2, MAX_LINE_SIZE, fp); + if (!(len = strlen(tmp2))) { + d_printf( "CHESSD: Error bad plan in file %s\n", file); + i--; + pp->num_plan--; + } else { + tmp2[len - 1] = '\0'; /* Get rid of '\n' */ + pp->planLines[i] = (len > 1) ? strdup(tmp2) : NULL; + } + } + } + if (pp->num_formula > 0) { + for (i = 0; i < pp->num_formula; i++) { + fgets(tmp2, MAX_LINE_SIZE, fp); + if (!(len = strlen(tmp2))) { + d_printf( "CHESSD: Error bad formula in file %s\n", file); + i--; + pp->num_formula--; + } else { + tmp2[len - 1] = '\0'; /* Get rid of '\n' */ + pp->formulaLines[i] = (len > 1) ? strdup(tmp2) : NULL; + } + } + } + fgets(tmp2, MAX_LINE_SIZE, fp); + tmp2[strlen(tmp2) - 1] = '\0'; + if (!strcmp (tmp2,"NONE")) + pp->formula = NULL; + else + pp->formula = strdup(tmp2); + + if (numAlias > 0) { + for (i = 0; i < numAlias; i++) { + fgets(tmp2, MAX_LINE_SIZE, fp); + if (!(len = strlen(tmp2))) { + d_printf( "CHESSD: Error bad alias in file %s\n", file); + i--; + } else { + tmp2[len - 1] = '\0'; /* Get rid of '\n' */ + tmp = tmp2; + tmp = eatword(tmp2); + *tmp = '\0'; + tmp++; + tmp = eatwhite(tmp); + alias_add(p, tmp2, tmp); + } + } + } + + while (size_cens--) { + fscanf(fp,"%s",tmp2); + list_add(p, L_CENSOR, tmp2); + } + + while(size_not--) { + fscanf(fp,"%s",tmp2); + list_add(p, L_NOTIFY, tmp2); + } + + while(size_noplay--) { + fscanf(fp,"%s",tmp2); + list_add(p, L_NOPLAY, tmp2); + } + + while(size_gnot--) { + fscanf(fp,"%s",tmp2); + list_add(p, L_GNOTIFY, tmp2); + } + + while(size_chan--) { + fscanf(fp,"%s",tmp2); + list_add(p, L_CHANNEL, tmp2); + } + return 1; +} + +static int got_attr_value_player(int p, char *attr, char *value, FILE * fp, const char *file) +{ + int i, len; + char tmp[MAX_LINE_SIZE], *tmp1; + int numAlias = 0; + + if (!strcmp(attr, "name:")) { + player_globals.parray[p].name = strdup(value); + } else if (!strcmp(attr, "password:")) { + player_globals.parray[p].passwd = strdup(value); + } else if (!strcmp(attr, "fullname:")) { + player_globals.parray[p].fullName = strdup(value); + } else if (!strcmp(attr, "email:")) { + player_globals.parray[p].emailAddress = strdup(value); + } else if (!strcmp(attr, "prompt:")) { + player_globals.parray[p].prompt = strdup(value); + } else if (!strcmp(attr, "s_num:")) { + player_globals.parray[p].s_stats.num = atoi(value); + } else if (!strcmp(attr, "s_win:")) { + player_globals.parray[p].s_stats.win = atoi(value); + } else if (!strcmp(attr, "s_loss:")) { + player_globals.parray[p].s_stats.los = atoi(value); + } else if (!strcmp(attr, "s_draw:")) { + player_globals.parray[p].s_stats.dra = atoi(value); + } else if (!strcmp(attr, "s_rating:")) { + player_globals.parray[p].s_stats.rating = atoi(value); + } else if (!strcmp(attr, "s_sterr:")) { + player_globals.parray[p].s_stats.sterr = (atoi(value) / 10.0); + } else if (!strcmp(attr, "s_ltime:")) { + player_globals.parray[p].s_stats.ltime = atoi(value); + } else if (!strcmp(attr, "s_best:")) { + player_globals.parray[p].s_stats.best = atoi(value); + } else if (!strcmp(attr, "s_wbest:")) { + player_globals.parray[p].s_stats.whenbest = atoi(value); + } else if (!strcmp(attr, "b_num:")) { + player_globals.parray[p].b_stats.num = atoi(value); + } else if (!strcmp(attr, "b_win:")) { + player_globals.parray[p].b_stats.win = atoi(value); + } else if (!strcmp(attr, "b_loss:")) { + player_globals.parray[p].b_stats.los = atoi(value); + } else if (!strcmp(attr, "b_draw:")) { + player_globals.parray[p].b_stats.dra = atoi(value); + } else if (!strcmp(attr, "b_rating:")) { + player_globals.parray[p].b_stats.rating = atoi(value); + } else if (!strcmp(attr, "b_sterr:")) { + player_globals.parray[p].b_stats.sterr = (atoi(value) / 10.0); + } else if (!strcmp(attr, "b_ltime:")) { + player_globals.parray[p].b_stats.ltime = atoi(value); + } else if (!strcmp(attr, "b_best:")) { + player_globals.parray[p].b_stats.best = atoi(value); + } else if (!strcmp(attr, "b_wbest:")) { + player_globals.parray[p].b_stats.whenbest = atoi(value); + } else if (!strcmp(attr, "w_num:")) { + player_globals.parray[p].w_stats.num = atoi(value); + } else if (!strcmp(attr, "w_win:")) { + player_globals.parray[p].w_stats.win = atoi(value); + } else if (!strcmp(attr, "w_loss:")) { + player_globals.parray[p].w_stats.los = atoi(value); + } else if (!strcmp(attr, "w_draw:")) { + player_globals.parray[p].w_stats.dra = atoi(value); + } else if (!strcmp(attr, "w_rating:")) { + player_globals.parray[p].w_stats.rating = atoi(value); + } else if (!strcmp(attr, "w_sterr:")) { + player_globals.parray[p].w_stats.sterr = (atoi(value) / 10.0); + } else if (!strcmp(attr, "w_ltime:")) { + player_globals.parray[p].w_stats.ltime = atoi(value); + } else if (!strcmp(attr, "w_best:")) { + player_globals.parray[p].w_stats.best = atoi(value); + } else if (!strcmp(attr, "w_wbest:")) { + player_globals.parray[p].w_stats.whenbest = atoi(value); + } else if (!strcmp(attr, "open:")) { + SetPFlag(p, PFLAG_OPEN, atoi(value)); + } else if (!strcmp(attr, "rated:")) { + SetPFlag(p, PFLAG_RATED, atoi(value)); + } else if (!strcmp(attr, "ropen:")) { + SetPFlag(p, PFLAG_ROPEN, atoi(value)); + } else if (!strcmp(attr, "bell:")) { + SetPFlag(p, PFLAG_BELL, atoi(value)); + } else if (!strcmp(attr, "pgn:")) { + SetPFlag(p, PFLAG_PGN, atoi(value)); + } else if (!strcmp(attr, "timeofreg:")) { + player_globals.parray[p].timeOfReg = atoi(value); + } else if (!strcmp(attr, "totaltime:")) { + player_globals.parray[p].totalTime = atoi(value); + } else if (!strcmp(attr, "notifiedby:")) { + SetPFlag(p, PFLAG_NOTIFYBY, atoi(value)); + } else if (!strcmp(attr, "i_login:")) { + SetPFlag(p, PFLAG_PIN, atoi(value)); + } else if (!strcmp(attr, "i_game:")) { + SetPFlag(p, PFLAG_GIN, atoi(value)); + } else if (!strcmp(attr, "i_shout:")) { + SetPFlag(p, PFLAG_SHOUT, atoi(value)); + } else if (!strcmp(attr, "i_cshout:")) { + SetPFlag(p, PFLAG_CSHOUT, atoi(value)); + } else if (!strcmp(attr, "i_tell:")) { + SetPFlag(p, PFLAG_TELL, atoi(value)); + } else if (!strcmp(attr, "i_kibitz:")) { + SetPFlag(p, PFLAG_KIBITZ, atoi(value)); + } else if (!strcmp(attr, "kiblevel:")) { + player_globals.parray[p].kiblevel = atoi(value); + } else if (!strcmp(attr, "private:")) { + SetPFlag(p, PFLAG_PRIVATE, atoi(value)); + } else if (!strcmp(attr, "jprivate:")) { + SetPFlag(p, PFLAG_JPRIVATE, atoi(value)); + } else if (!strcmp(attr, "automail:")) { + SetPFlag(p, PFLAG_AUTOMAIL, atoi(value)); + } else if (!strcmp(attr, "i_mailmess:")) { + SetPFlag(p, PFLAG_MAILMESS, atoi(value)); + } else if (!strcmp(attr, "style:")) { + player_globals.parray[p].style = atoi(value); + } else if (!strcmp(attr, "d_time:")) { + player_globals.parray[p].d_time = atoi(value); + } else if (!strcmp(attr, "d_inc:")) { + player_globals.parray[p].d_inc = atoi(value); + } else if (!strcmp(attr, "d_height:")) { + player_globals.parray[p].d_height = atoi(value); + } else if (!strcmp(attr, "d_width:")) { + player_globals.parray[p].d_width = atoi(value); + } else if (!strcmp(attr, "language:")) { + player_globals.parray[p].language = atoi(value); + } else if (!strcmp(attr, "admin_level:")) { + player_globals.parray[p].adminLevel = atoi(value); + if (player_globals.parray[p].adminLevel >= ADMIN_ADMIN) + PFlagON(p, PFLAG_ADMINLIGHT); + } else if (!strcmp(attr, "i_admin:")) { +/* player_globals.parray[p].i_admin = atoi(value); */ + } else if (!strcmp(attr, "computer:")) { +/* player_globals.parray[p].computer = atoi(value); */ + } else if (!strcmp(attr, "black_games:")) { + player_globals.parray[p].num_black = atoi(value); + } else if (!strcmp(attr, "white_games:")) { + player_globals.parray[p].num_white = atoi(value); + } else if (!strcmp(attr, "uscf:")) { +/* player_globals.parray[p].uscfRating = atoi(value); */ + } else if (!strcmp(attr, "muzzled:")) { /* ignore these: obsolete */ + } else if (!strcmp(attr, "cmuzzled:")) { /* ignore these: obsolete */ + } else if (!strcmp(attr, "highlight:")) { + player_globals.parray[p].highlight = atoi(value); + } else if (!strcmp(attr, "network:")) { +/* player_globals.parray[p].network_player = atoi(value); */ + } else if (!strcmp(attr, "lasthost:")) { + player_globals.parray[p].lastHost.s_addr = atoi(value); + } else if (!strcmp(attr, "channel:")) { + list_addsub(p,"channel",value, 1); + } else if (!strcmp(attr, "num_comments:")) { + player_globals.parray[p].num_comments = atoi(value); + } else if (!strcmp(attr, "num_plan:")) { + player_globals.parray[p].num_plan = atoi(value); + if (player_globals.parray[p].num_plan > 0) { + for (i = 0; i < player_globals.parray[p].num_plan; i++) { + fgets(tmp, MAX_LINE_SIZE, fp); + if (!(len = strlen(tmp))) { + d_printf( "CHESSD: Error bad plan in file %s\n", file); + i--; + player_globals.parray[p].num_plan--; + } else { + tmp[len - 1] = '\0'; /* Get rid of '\n' */ + player_globals.parray[p].planLines[i] = (len > 1) ? strdup(tmp) : NULL; + } + } + } + } else if (!strcmp(attr, "num_formula:")) { + player_globals.parray[p].num_formula = atoi(value); + if (player_globals.parray[p].num_formula > 0) { + for (i = 0; i < player_globals.parray[p].num_formula; i++) { + fgets(tmp, MAX_LINE_SIZE, fp); + if (!(len = strlen(tmp))) { + d_printf( "CHESSD: Error bad formula in file %s\n", file); + i--; + player_globals.parray[p].num_formula--; + } else { + tmp[len - 1] = '\0'; /* Get rid of '\n' */ + player_globals.parray[p].formulaLines[i] = (len > 1) ? strdup(tmp) : NULL; + } + } + } + } else if (!strcmp(attr, "formula:")) { + player_globals.parray[p].formula = strdup(value); + } else if (!strcmp(attr, "num_alias:")) { + numAlias = atoi(value); + if (numAlias > 0) { + for (i = 0; i < numAlias; i++) { + fgets(tmp, MAX_LINE_SIZE, fp); + if (!(len = strlen(tmp))) { + d_printf( "CHESSD: Error bad alias in file %s\n", file); + i--; + } else { + tmp[len - 1] = '\0'; /* Get rid of '\n' */ + tmp1 = tmp; + tmp1 = eatword(tmp1); + *tmp1 = '\0'; + tmp1++; + tmp1 = eatwhite(tmp1); + alias_add(p, tmp, tmp1); + } + } + player_globals.parray[p].alias_list[i].comm_name = NULL; + } + } else if (!strcmp(attr, "num_censor:")) { + i = atoi(value); + while (i--) { + fgets(tmp, MAX_LINE_SIZE, fp); + if ((!(len = strlen(tmp))) || (len == 1)) { /* blank lines do occur!! */ + d_printf( "CHESSD: Error bad censor in file %s\n", file); + } else { + tmp[len - 1] = '\0'; /* Get rid of '\n' */ + list_add(p, L_CENSOR, tmp); + } + } + } else if (!strcmp(attr, "num_notify:")) { + i = atoi(value); + while(i--) { + fgets(tmp, MAX_LINE_SIZE, fp); + if ((!(len = strlen(tmp))) || (len == 1)) { /* blank lines do occur!! */ + d_printf( "CHESSD: Error bad notify in file %s\n", file); + } else { + tmp[len - 1] = '\0'; /* Get rid of '\n' */ + list_add(p, L_NOTIFY, tmp); + } + } + } else if (!strcmp(attr, "num_noplay:")) { + i = atoi(value); + while(i--) { + fgets(tmp, MAX_LINE_SIZE, fp); + if ((!(len = strlen(tmp))) || (len == 1)) { /* blank lines do occur!! */ + d_printf( "CHESSD: Error bad noplay in file %s\n", file); + } else { + tmp[len - 1] = '\0'; /* Get rid of '\n' */ + list_add(p, L_NOPLAY, tmp); + } + } + } else if (!strcmp(attr, "num_gnotify:")) { + i = atoi(value); + while(i--) { + fgets(tmp, MAX_LINE_SIZE, fp); + if ((!(len = strlen(tmp))) || (len == 1)) { /* blank lines do occur!! */ + d_printf( "CHESSD: Error bad gnotify in file %s\n", file); + } else { + tmp[len - 1] = '\0'; /* Get rid of '\n' */ + list_add(p, L_GNOTIFY, tmp); + } + } + } else if (!strcmp(attr, "num_follow:")) { + i = atoi(value); + while(i--) { + fgets(tmp, MAX_LINE_SIZE, fp); + if ((!(len = strlen(tmp))) || (len == 1)) { /* blank lines do occur!! */ + d_printf( "CHESSD: Error bad follow in file %s\n", file); + } else { + tmp[len - 1] = '\0'; /* Get rid of '\n' */ + list_add(p, L_FOLLOW, tmp); + } + } + } else { + d_printf( "CHESSD: Error bad attribute >%s< from file %s\n", attr, file); + } + return 0; +} + + + + +int player_read_old(int p, FILE *fp, const char *pname, const char *fname, int version) +{ + char line[MAX_LINE_SIZE]; + char *attr, *value; + int len; + + if (version > 4) { /* eg if two version of code running at diff sites */ + pprintf(p, "Your account's version number is newer than that of the version running.\n"); + pprintf(p, "Please see an admin.\n"); + d_printf("Player %s's version number is incorrect for this version.\n",player_globals.parray[p].name); + PFlagOFF(p, PFLAG_REG); + player_globals.parray[p].name = strdup(pname); + return -1; + } + if (version > 0) { + if (!ReadV1PlayerFmt(p,&player_globals.parray[p], fp, fname, version)) {/* Quick method */ + /* error in reading; make unreg */ + PFlagOFF(p, PFLAG_REG); + PFlagOFF(p, PFLAG_RATED); + pprintf(p, "\n*** WARNING: Your Data file is corrupt. Please tell an admin ***\n"); + return -1; /* other data has already been freed */ + } + } else { + /* do it the old SLOW way */ + do { + if (feof(fp)) + break; + if ((len = strlen(line)) <= 1) + continue; + line[len - 1] = '\0'; + attr = eatwhite(line); + if (attr[0] == '#') + continue; /* Comment */ + value = eatword(attr); + if (!*value) { + d_printf( "CHESSD: Error reading file %s\n", fname); + continue; + } + *value = '\0'; + value++; + value = eatwhite(value); + stolower(attr); + got_attr_value_player(p, attr, value, fp, fname); + fgets(line, MAX_LINE_SIZE, fp); + } while (!feof(fp)); + } + + if (!player_globals.parray[p].name) { + player_globals.parray[p].name = strdup(pname); + pprintf(p, "\n*** WARNING: Your Data file is corrupt. Please tell an admin ***\n"); + } + + return 0; +} + + +#if 0 +/* the old and tedious way of writing the player data */ +static void WritePlayerFile_old(FILE* fp, int p) +{ + int i; + struct player *pp = &player_globals.parray[p]; + + fprintf (fp, "v %d\n", 4); + if (pp->name == NULL) /* This should never happen! */ + fprintf (fp,"NONE\n"); + else + fprintf(fp, "%s\n", pp->name); + if (pp->fullName == NULL) + fprintf (fp,"NONE\n"); + else + fprintf(fp, "%s\n", pp->fullName); + if (pp->passwd == NULL) + fprintf (fp,"NONE\n"); + else + fprintf(fp, "%s\n", pp->passwd); + if (pp->emailAddress == NULL) + fprintf (fp,"NONE\n"); + else + fprintf(fp, "%s\n", pp->emailAddress); + fprintf(fp, "%u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %d\n", + + pp->s_stats.num, pp->s_stats.win, pp->s_stats.los, + pp->s_stats.dra, pp->s_stats.rating, (int) (pp->s_stats.sterr * 10.0), + pp->s_stats.ltime, pp->s_stats.best, pp->s_stats.whenbest, + + pp->b_stats.num, pp->b_stats.win, pp->b_stats.los, + pp->b_stats.dra, pp->b_stats.rating, (int) (pp->b_stats.sterr * 10.0), + pp->b_stats.ltime, pp->b_stats.best, pp->b_stats.whenbest, + + pp->w_stats.num, pp->w_stats.win, pp->w_stats.los, + pp->w_stats.dra, pp->w_stats.rating, (int) (pp->w_stats.sterr * 10.0), + pp->w_stats.ltime, pp->w_stats.best, pp->w_stats.whenbest, + + pp->l_stats.num, pp->l_stats.win, pp->l_stats.los, + pp->l_stats.dra, pp->l_stats.rating, (int) (pp->l_stats.sterr * 10.0), + pp->l_stats.ltime, pp->l_stats.best, pp->l_stats.whenbest, + + pp->bug_stats.num, pp->bug_stats.win, pp->bug_stats.los, + pp->bug_stats.dra, pp->bug_stats.rating, (int) (pp->bug_stats.sterr * 10.0), + pp->bug_stats.ltime, pp->bug_stats.best, pp->bug_stats.whenbest, + pp->lastHost); + + fprintf (fp, "%s\n", pp->prompt); + fprintf (fp, "%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d\n", + BoolCheckPFlag(p, PFLAG_OPEN), BoolCheckPFlag(p, PFLAG_RATED), + BoolCheckPFlag(p, PFLAG_ROPEN), pp->timeOfReg, + pp->totalTime, BoolCheckPFlag(p, PFLAG_BELL), + BoolCheckPFlag(p, PFLAG_PGN), BoolCheckPFlag(p, PFLAG_NOTIFYBY), + BoolCheckPFlag(p, PFLAG_PIN), BoolCheckPFlag(p, PFLAG_GIN), + BoolCheckPFlag(p, PFLAG_AVAIL), BoolCheckPFlag(p, PFLAG_SHOUT), + BoolCheckPFlag(p, PFLAG_CSHOUT), BoolCheckPFlag(p, PFLAG_TELL), + BoolCheckPFlag(p, PFLAG_KIBITZ), BoolCheckPFlag(p, PFLAG_PRIVATE), + BoolCheckPFlag(p, PFLAG_JPRIVATE), BoolCheckPFlag(p, PFLAG_AUTOMAIL), + BoolCheckPFlag(p, PFLAG_MAILMESS), pp->style, + pp->d_time, pp->d_inc, pp->d_height, pp->d_width, pp->language, + pp->adminLevel, pp->num_white, pp->num_black, pp->highlight, + pp->num_comments, + pp->num_plan, pp->num_formula,list_size(p, L_CENSOR), + list_size(p, L_NOTIFY), list_size(p, L_NOPLAY), + list_size(p, L_GNOTIFY), pp->numAlias, list_size(p, L_CHANNEL ), pp->availmin, pp->availmax); + + fprintf (fp,"."); /* Dot before plan - stop ill affects of scanf */ + + for (i = 0; i < pp->num_plan; i++) + fprintf(fp, "%s\n", (pp->planLines[i] ? pp->planLines[i] : "")); + for (i = 0; i < pp->num_formula; i++) + fprintf(fp, "%s\n", (pp->formulaLines[i] ? pp->formulaLines[i] : "")); + if (player_globals.parray[p].formula != NULL) + fprintf(fp, "%s\n", pp->formula); + else + fprintf(fp, "NONE\n"); + for (i = 0; i < pp->numAlias; i++) + fprintf(fp, "%s %s\n", pp->alias_list[i].comm_name, + pp->alias_list[i].alias); + + list_print(fp, p, L_CENSOR); + list_print(fp, p, L_NOTIFY); + list_print(fp, p, L_NOPLAY); + list_print(fp, p, L_GNOTIFY); + list_print(fp, p, L_CHANNEL); +} +#endif + diff --git a/lasker-2.2.3/src/ratings.c b/lasker-2.2.3/src/ratings.c new file mode 100644 index 0000000..55eaa74 --- /dev/null +++ b/lasker-2.2.3/src/ratings.c @@ -0,0 +1,1438 @@ +/* + Copyright (c) 1993 Richard V. Nash. + Copyright (c) 2000 Dan Papasian + Copyright (C) Andrew Tridgell 2002 + + 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., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#include "includes.h" + +static double Ratings_B_Average; +static double Ratings_B_StdDev; + +static double Ratings_S_Average; +static double Ratings_S_StdDev; + +static double Ratings_L_Average; +static double Ratings_L_StdDev; + +static double Ratings_Bug_Average; +static double Ratings_Bug_StdDev; + +static double Ratings_W_Average; +static double Ratings_W_StdDev; + + +static double Rb_M = 0.0, Rb_S = 0.0, Rb_total = 0.0; +static int Rb_count = 0; + +static double Rs_M = 0.0, Rs_S = 0.0, Rs_total = 0.0; +static int Rs_count = 0; + +static double Rl_M = 0.0, Rl_S = 0.0, Rl_total = 0.0; +static int Rl_count = 0; + +static double Rbug_M = 0.0, Rbug_S = 0.0, Rbug_total = 0.0; +static int Rbug_count = 0; + +static double Rw_M = 0.0, Rw_S = 0.0, Rw_total = 0.0; +static int Rw_count = 0; + +/* +rateStruct bestS[MAX_BEST]; +int numS = 0; +rateStruct bestB[MAX_BEST]; +int numB = 0; +rateStruct bestW[MAX_BEST]; +int numW = 0; +*/ + +#define MAXHIST 30 +#define LOWESTHIST 800 +static int sHist[MAXHIST]; +static int bHist[MAXHIST]; +static int wHist[MAXHIST]; +static int lHist[MAXHIST]; +static int bugHist[MAXHIST]; + +static int DisplayRank(int p, param_list param, int showComputers); +static int DisplayTargetRank(int p, char *target, int show, int showComp); +static int ShowFromString(char *s); +static int DisplayRankedPlayers(int p, int start, int end, + int show, int showComp); +static int Best(int p, param_list param, int ShowComp); + +static int is_active(int Games) +{ + return (Games >= PROVISIONAL); +} + + +static void rating_add(int rating, int type) +{ + int which; + + which = (rating - LOWESTHIST) / 100; + if (which < 0) + which = 0; + if (which >= MAXHIST) + which = MAXHIST - 1; + if (type == TYPE_BLITZ) { + bHist[which] += 1; + Rb_count++; + Rb_total += rating; + if (Rb_count == 1) { + Rb_M = rating; + } else { + Rb_S = Rb_S + (rating - Rb_M) * (rating - Rb_M); + Rb_M = Rb_M + (rating - Rb_M) / (Rb_count); + } + Ratings_B_StdDev = sqrt(Rb_S / Rb_count); + Ratings_B_Average = Rb_total / (double) Rb_count; + } else if (type == TYPE_WILD) { /* TYPE_WILD */ + wHist[which] += 1; + Rw_count++; + Rw_total += rating; + if (Rw_count == 1) { + Rw_M = rating; + } else { + Rw_S = Rw_S + (rating - Rw_M) * (rating - Rw_M); + Rw_M = Rw_M + (rating - Rw_M) / (Rw_count); + } + Ratings_W_StdDev = sqrt(Rw_S / Rw_count); + Ratings_W_Average = Rw_total / (double) Rw_count; + } else if (type == TYPE_LIGHT) { /* TYPE_LIGHT */ + lHist[which] += 1; + Rl_count++; + Rl_total += rating; + if (Rl_count == 1) { + Rl_M = rating; + } else { + Rl_S = Rl_S + (rating - Rl_M) * (rating - Rl_M); + Rl_M = Rl_M + (rating - Rl_M) / (Rl_count); + } + Ratings_L_StdDev = sqrt(Rl_S / Rl_count); + Ratings_L_Average = Rl_total / (double) Rl_count; + } else if (type == TYPE_BUGHOUSE) { /* TYPE_BUGHOUSE */ + bugHist[which] += 1; + Rbug_count++; + Rbug_total += rating; + if (Rbug_count == 1) { + Rbug_M = rating; + } else { + Rbug_S = Rbug_S + (rating - Rbug_M) * (rating - Rbug_M); + Rbug_M = Rbug_M + (rating - Rbug_M) / (Rbug_count); + } + Ratings_Bug_StdDev = sqrt(Rbug_S / Rbug_count); + Ratings_Bug_Average = Rbug_total / (double) Rbug_count; + } else { /* TYPE_STAND */ + sHist[which] += 1; + Rs_count++; + Rs_total += rating; + if (Rs_count == 1) { + Rs_M = rating; + } else { + Rs_S = Rs_S + (rating - Rs_M) * (rating - Rs_M); + Rs_M = Rs_M + (rating - Rs_M) / (Rs_count); + } + Ratings_S_StdDev = sqrt(Rs_S / Rs_count); + Ratings_S_Average = Rs_total / (double) Rs_count; + } +} + +static void rating_remove(int rating, int type) +{ + int which; + + which = (rating - LOWESTHIST) / 100; + if (which < 0) + which = 0; + if (which >= MAXHIST) + which = MAXHIST - 1; + if (type == TYPE_BLITZ) { + bHist[which] = bHist[which] - 1; + if (bHist[which] < 0) + bHist[which] = 0; + if (Rb_count == 0) + return; + Rb_count--; + Rb_total -= rating; + if (Rb_count == 0) { + Rb_M = 0; + Rb_S = 0; + } else { + Rb_M = Rb_M - (rating - Rb_M) / (Rb_count); + Rb_S = Rb_S - (rating - Rb_M) * (rating - Rb_M); + /* added this 3.11.95 foxbat */ if (Rb_S < 0) + Rb_S = 0; + } + if (Rb_count) { + Ratings_B_StdDev = sqrt(Rb_S / Rb_count); + Ratings_B_Average = Rb_total / (double) Rb_count; + } else { + Ratings_B_StdDev = 0; + Ratings_B_Average = 0; + } + } else if (type == TYPE_WILD) { /* TYPE_WILD */ + wHist[which] = wHist[which] - 1; + if (wHist[which] < 0) + wHist[which] = 0; + if (Rw_count == 0) + return; + Rw_count--; + Rw_total -= rating; + if (Rw_count == 0) { + Rw_M = 0; + Rw_S = 0; + } else { + Rw_M = Rw_M - (rating - Rw_M) / (Rw_count); + Rw_S = Rw_S - (rating - Rw_M) * (rating - Rw_M); + /* added this 3.10.95 foxbat */ if (Rw_S < 0) + Rw_S = 0; + } + if (Rw_count) { + Ratings_W_StdDev = sqrt(Rw_S / Rw_count); + Ratings_W_Average = Rw_total / (double) Rw_count; + } else { + Ratings_W_StdDev = 0; + Ratings_W_Average = 0; + } + } else if (type == TYPE_LIGHT) { /* TYPE_LIGHT */ + lHist[which] = lHist[which] - 1; + if (lHist[which] < 0) + lHist[which] = 0; + if (Rl_count == 0) + return; + Rl_count--; + Rl_total -= rating; + if (Rl_count == 0) { + Rl_M = 0; + Rl_S = 0; + } else { + Rl_M = Rl_M - (rating - Rl_M) / (Rl_count); + Rl_S = Rl_S - (rating - Rl_M) * (rating - Rl_M); + if (Rl_S < 0) + Rl_S = 0; + } + if (Rl_count) { + Ratings_L_StdDev = sqrt(Rl_S / Rl_count); + Ratings_L_Average = Rl_total / (double) Rl_count; + } else { + Ratings_L_StdDev = 0; + Ratings_L_Average = 0; + } + } else if (type == TYPE_BUGHOUSE) { /* TYPE_BUGHOUSE */ + bugHist[which] = bugHist[which] - 1; + if (bugHist[which] < 0) + bugHist[which] = 0; + if (Rbug_count == 0) + return; + Rbug_count--; + Rbug_total -= rating; + if (Rbug_count == 0) { + Rbug_M = 0; + Rbug_S = 0; + } else { + Rbug_M = Rbug_M - (rating - Rbug_M) / (Rbug_count); + Rbug_S = Rbug_S - (rating - Rbug_M) * (rating - Rbug_M); + if (Rbug_S < 0) + Rbug_S = 0; + } + if (Rbug_count) { + Ratings_Bug_StdDev = sqrt(Rbug_S / Rbug_count); + Ratings_Bug_Average = Rbug_total / (double) Rbug_count; + } else { + Ratings_Bug_StdDev = 0; + Ratings_Bug_Average = 0; + } + } else { /* TYPE_STAND */ + sHist[which] = sHist[which] - 1; + if (sHist[which] < 0) + sHist[which] = 0; + if (Rs_count == 0) + return; + Rs_count--; + Rs_total -= rating; + if (Rs_count == 0) { + Rs_M = 0; + Rs_S = 0; + } else { + Rs_M = Rs_M - (rating - Rs_M) / (Rs_count); + Rs_S = Rs_S - (rating - Rs_M) * (rating - Rs_M); + /* added this 3.10.95 foxbat */ if (Rs_S < 0) + Rs_S = 0; + } + if (Rs_count) { + Ratings_S_StdDev = sqrt(Rs_S / Rs_count); + Ratings_S_Average = Rs_total / (double) Rs_count; + } else { + Ratings_S_StdDev = 0; + Ratings_S_Average = 0; + } + } +} + +static void load_ratings(void) +{ + FILE *fp; + int i; + + fp = fopen_p("%s/newratingsV%d_data", "r", STATS_DIR, STATS_VERSION); + if (!fp) { + d_printf( "CHESSD: Can't read ratings data!\n"); + return; + } + + fscanf(fp, "%lf %lf %lf %d", &Rb_M, &Rb_S, &Rb_total, &Rb_count); + fscanf(fp, "%lf %lf %lf %d", &Rs_M, &Rs_S, &Rs_total, &Rs_count); + fscanf(fp, "%lf %lf %lf %d", &Rw_M, &Rw_S, &Rw_total, &Rw_count); + fscanf(fp, "%lf %lf %lf %d", &Rl_M, &Rl_S, &Rl_total, &Rl_count); + + for (i = 0; i < MAXHIST; i++) { + fscanf(fp, "%d %d %d %d", &sHist[i], &bHist[i], &wHist[i], &lHist[i]); + } + fclose(fp); + if (Rs_count) { + Ratings_S_StdDev = sqrt(Rs_S / Rs_count); + Ratings_S_Average = Rs_total / (double) Rs_count; + } else { + Ratings_S_StdDev = 0; + Ratings_S_Average = 0; + } + if (Rb_count) { + Ratings_B_StdDev = sqrt(Rb_S / Rb_count); + Ratings_B_Average = Rb_total / (double) Rb_count; + } else { + Ratings_B_StdDev = 0; + Ratings_B_Average = 0; + } + if (Rw_count) { + Ratings_W_StdDev = sqrt(Rw_S / Rw_count); + Ratings_W_Average = Rw_total / (double) Rw_count; + } else { + Ratings_W_StdDev = 0; + Ratings_W_Average = 0; + } + if (Rl_count) { + Ratings_L_StdDev = sqrt(Rl_S / Rl_count); + Ratings_L_Average = Rl_total / (double) Rl_count; + } else { + Ratings_L_StdDev = 0; + Ratings_L_Average = 0; + } +} + +static void save_ratings(void) +{ + FILE *fp; + int i; + + fp = fopen_p("%s/newratingsV%d_data", "w", STATS_DIR,STATS_VERSION); + if (!fp) { + d_printf( "CHESSD: Can't write ratings data!\n"); + return; + } + + fprintf(fp, "%10f %10f %10f %d\n", Rb_M, Rb_S, Rb_total, Rb_count); + fprintf(fp, "%10f %10f %10f %d\n", Rs_M, Rs_S, Rs_total, Rs_count); + fprintf(fp, "%10f %10f %10f %d\n", Rw_M, Rw_S, Rw_total, Rw_count); + fprintf(fp, "%10f %10f %10f %d\n", Rl_M, Rl_S, Rl_total, Rl_count); + + for (i = 0; i < MAXHIST; i++) { + fprintf(fp, "%d %d %d %d\n", sHist[i], bHist[i], wHist[i], lHist[i]); + } + fclose(fp); +} + +static void zero_stats(void) +{ + int i; + for (i = 0; i < MAXHIST; i++) { + sHist[i] = 0; + bHist[i] = 0; + wHist[i] = 0; + lHist[i] = 0; + } + Rb_M = 0.0, Rb_S = 0.0, Rb_total = 0.0; + Rb_count = 0; + + Rs_M = 0.0, Rs_S = 0.0, Rs_total = 0.0; + Rs_count = 0; + + Rw_M = 0.0, Rw_S = 0.0, Rw_total = 0.0; + Rw_count = 0; + + Rl_M = 0.0, Rl_S = 0.0, Rl_total = 0.0; + Rl_count = 0; +} + +void ratings_init(void) +{ + zero_stats(); + load_ratings(); +} + +static int Round (double x) +{ + return (x < 0 ? (int) (x - 0.5) : (int) (x + 0.5)); +} + +/* Constants for Glicko system */ +#define Gd 1.483 +#define Gv 0.0005828166666667 /* (0.187)^2 / 60 */ +#define Gr0 1720 +#define Gs0 350 +#define Gq 0.00575646273249 /* ln(10.0)/400.0 */ +#define Gp 0.000010072398601964 /* (3 * Gq / PI)^2 */ +#define GBq 0.00287823136624 /* ln(10.0)/800.0 */ +#define GBp (9 * GBq * GBq / (3.141592653589 * 3.141592653589)) +/* End of Glicko system variables */ + +static double Gf(double ss) +{ + return (1.0 / sqrt(1.0 + Gp * ss * ss)); +} + +/* Confusing but economical: calculate error and attenuation function together */ +static double GE(int r, int rr, double ss, double *fss) +{ + *fss = Gf(ss); + return (1.0 / (1.0 + pow(10.0, (rr - r) * (*fss) / 400.0))); +} + +static double GBf(double sp, double ss, double ssp) +{ + return (1.0 / sqrt(1.0 + GBp * (ss*ss + sp*sp + ssp*ssp))); +} + +/* Confusing but economical: calculate error and attenuation function together */ +static double GBE(int r, int rp, int rr, int rrp, + double sp, double ss, double ssp, double *fss) +{ + *fss = GBf(sp, ss, ssp); + return (1.0 / (1.0 + pow(10.0, (rr + rrp - r - rp) * (*fss) / 800.0))); +} + +double current_sterr(double s, long t) +{ + double new; + + if (t < 0) + t = 0; /* this shouldn't happen */ + new = sqrt(s * s + Gd * Gd * log(1.0 + t / 60.0)); /* log formula */ + /* new = sqrt(s * s + Gv * t); */ /* linear formula */ + if (new > Gs0) + new = Gs0; + return (new); +} + +static void UpdateStats(struct statistics *p_stats, int *r, double *s, int now) +{ + /* Calculate effective pre-game sterrs. ltime==0 implies never had sterr. */ + + *s = current_sterr(p_stats->sterr, now - p_stats->ltime); + + /* pre-game ratings */ + *r = (p_stats->rating == 0 && p_stats->num == 0) ? Gr0 + : p_stats->rating; + return; +} + +static void GetCurrentStats (int p, int *r, double *s, int *new, + int *rPart, double *sPart, int type, int now) +{ + struct player *pp = &player_globals.parray[p]; + struct statistics *p_stats = NULL; + struct statistics *part_stats; /* for bughouse. */ + + switch (type) { + case TYPE_BLITZ: + p_stats = &pp->b_stats; + break; + case TYPE_STAND: + p_stats = &pp->s_stats; + break; + case TYPE_WILD: + p_stats = &pp->w_stats; + break; + case TYPE_LIGHT: + p_stats = &pp->l_stats; + break; + case TYPE_BUGHOUSE: + p_stats = &pp->bug_stats; + part_stats = &player_globals.parray[pp->partner].bug_stats; + UpdateStats(part_stats, rPart, sPart, now); + break; + } + /* Calculate effective pre-game sterrs. ltime==0 implies never had sterr. */ + UpdateStats(p_stats, r, s, now); + if (p_stats->rating == 0 && p_stats->num == 0) + *new = 1; + else *new = 0; +} + +/* Calculates new rating and standard error. By vek. The person */ +/* who invented the ratings system is Mark E. Glickman, Ph.D. */ +/* His e-mail address is glickman@hustat.harvard.edu as of April '95. */ +/* Postscript copy of the note I coded this from should be available */ +/* for ftp from ics.onenet.net, if not elsewhere. */ + +void rating_sterr_delta(int p1, int p2, int type, int gtime, int result, + int *deltarating, double *newsterr) +{ + + double s1, s2, s1part, s2part; + int r1, r2, r1part, r2part, new; /* Initial sterrs and ratings */ + double q, E, fs2, denominator, GK, w; /* Parts of fancy formulas */ + double delta; /* Result to return */ + + GetCurrentStats (p2, &r2, &s2, &new, &r2part, &s2part, type, gtime); + GetCurrentStats (p1, &r1, &s1, &new, &r1part, &s1part, type, gtime); + + /* now crunch */ + if (result == RESULT_WIN) { + w = 1.0; + } else if (result == RESULT_DRAW) { + w = 0.5; + } else { + w = 0.0; + } + if (type != TYPE_BUGHOUSE) { + q = Gq; + E = GE(r1, r2, s2, &fs2); /* side effect: calculate fs2 */ + } else { + q = GBq; + E = GBE(r1, r1part, r2, r2part, s1part, s2, s2part, &fs2); + } + denominator = 1.0 / (s1 * s1) + q * q * fs2 * fs2 * E * (1.0 - E); + GK = q * fs2 / denominator; + + delta = GK * (w - E); + if (new) + *deltarating = Round(Gr0 + delta); + else + *deltarating = Round(delta); /* Returned values: deltarating, + newsterr */ + *newsterr = 1.0 / sqrt(denominator); +} + +int rating_update(int g, int link_game) +{ + int wDelta, bDelta; + double wSigma, bSigma; /* vek */ + + int wRes, bRes; + struct statistics *w_stats; + struct statistics *b_stats; + + int gtime; + + int inprogress = (g == player_globals.parray[game_globals.garray[g].black].game); + /* if this is adjudication of stored game, be quiet about ratings change */ + + if (game_globals.garray[g].type == TYPE_BLITZ) { + w_stats = &player_globals.parray[game_globals.garray[g].white].b_stats; + b_stats = &player_globals.parray[game_globals.garray[g].black].b_stats; + } else if (game_globals.garray[g].type == TYPE_STAND) { + w_stats = &player_globals.parray[game_globals.garray[g].white].s_stats; + b_stats = &player_globals.parray[game_globals.garray[g].black].s_stats; + } else if (game_globals.garray[g].type == TYPE_WILD) { + w_stats = &player_globals.parray[game_globals.garray[g].white].w_stats; + b_stats = &player_globals.parray[game_globals.garray[g].black].w_stats; + } else if (game_globals.garray[g].type == TYPE_LIGHT) { + w_stats = &player_globals.parray[game_globals.garray[g].white].l_stats; + b_stats = &player_globals.parray[game_globals.garray[g].black].l_stats; + } else if (game_globals.garray[g].type == TYPE_BUGHOUSE) { + w_stats = &player_globals.parray[game_globals.garray[g].white].bug_stats; + b_stats = &player_globals.parray[game_globals.garray[g].black].bug_stats; + } else { + d_printf( "CHESSD: Can't update untimed ratings!\n"); + return -1; + } + + switch (game_globals.garray[g].result) { + case END_CHECKMATE: + case END_RESIGN: + case END_FLAG: + case END_ADJWIN: + if (game_globals.garray[g].winner == WHITE) { + wRes = RESULT_WIN; + bRes = RESULT_LOSS; + } else { + bRes = RESULT_WIN; + wRes = RESULT_LOSS; + } + break; + case END_AGREEDDRAW: + case END_REPETITION: + case END_50MOVERULE: + case END_STALEMATE: + case END_NOMATERIAL: + case END_BOTHFLAG: + case END_ADJDRAW: + case END_FLAGNOMATERIAL: + wRes = bRes = RESULT_DRAW; + break; + default: + d_printf( "CHESSD: Update undecided game %d?\n", game_globals.garray[g].result); + return -1; + } + /* Use end time, not start time; important for adjourned games. */ + /* gtime = untenths(game_globals.garray[g].timeOfStart); */ + gtime = time(0); + rating_sterr_delta(game_globals.garray[g].white, game_globals.garray[g].black, + game_globals.garray[g].type, gtime, wRes, + &wDelta, &wSigma); + + rating_sterr_delta(game_globals.garray[g].black, game_globals.garray[g].white, + game_globals.garray[g].type, gtime, bRes, + &bDelta, &bSigma); + + /* hersco, 1/23/96: We now know rating changes for these players; + update partners' game. */ + if (link_game >= 0) { + game_globals.garray[link_game].winner = CToggle(game_globals.garray[g].winner); + game_globals.garray[link_game].result = game_globals.garray[g].result; + rating_update (link_game, -1); /* but don't recurse any deeper. */ + } + /* vek: Update time of last rated game played, for future ratings calcs. */ + /* Kept independently for blitz and standard. */ + w_stats->ltime = gtime; + b_stats->ltime = gtime; + /* end vek add 4/5/95 */ + + if (wRes == RESULT_WIN) { + w_stats->win++; + } else if (wRes == RESULT_LOSS) { + w_stats->los++; + } else { + w_stats->dra++; + } + w_stats->num++; + if (bRes == RESULT_WIN) { + b_stats->win++; + } else if (bRes == RESULT_LOSS) { + b_stats->los++; + } else { + b_stats->dra++; + } + b_stats->num++; + rating_remove(w_stats->rating, game_globals.garray[g].type); + rating_remove(b_stats->rating, game_globals.garray[g].type); + + if (inprogress) { + pprintf(game_globals.garray[g].white, "%s rating adjustment: %d ", + TypeStrings[game_globals.garray[g].type], w_stats->rating); + pprintf(game_globals.garray[g].black, "%s rating adjustment: %d ", + TypeStrings[game_globals.garray[g].type], b_stats->rating); + } + if (wDelta < -1000) { + pprintf(game_globals.garray[g].white, "not changed due to bug (way too small)! sorry!\n"); + d_printf( "CHESSD: Got too small ratings bug for %s (w) vs. %s\n", + player_globals.parray[game_globals.garray[g].white].login, player_globals.parray[game_globals.garray[g].black].login); + } else if (wDelta > 3000) { + pprintf(game_globals.garray[g].white, "not changed due to bug (way too big)! sorry!\n"); + d_printf( "CHESSD: Got too big ratings bug for %s (w) vs. %s\n", + player_globals.parray[game_globals.garray[g].white].login, player_globals.parray[game_globals.garray[g].black].login); + } else { + w_stats->rating += wDelta; + w_stats->sterr = wSigma; + } + + if (bDelta < -1000) { + pprintf(game_globals.garray[g].black, "not changed due to bug (way too small)! sorry! "); + d_printf( "CHESSD: Got too small ratings bug for %s (b) vs. %s\n", + player_globals.parray[game_globals.garray[g].black].login, player_globals.parray[game_globals.garray[g].white].login); + } else if (bDelta > 3000) { + pprintf(game_globals.garray[g].black, "not changed due to bug (way too big)! sorry! "); + d_printf( "CHESSD: Got too big ratings bug for %s (b) vs. %s\n", + player_globals.parray[game_globals.garray[g].black].login, player_globals.parray[game_globals.garray[g].white].login); + } else { + b_stats->rating += bDelta; + b_stats->sterr = bSigma; + } /* error messages down to vek */ + + rating_add(w_stats->rating, game_globals.garray[g].type); + rating_add(b_stats->rating, game_globals.garray[g].type); + + if ((w_stats->rating > w_stats->best) && (is_active(w_stats->num))) { + w_stats->best = w_stats->rating; + w_stats->whenbest = time(NULL); + } + if ((b_stats->rating > b_stats->best) && (is_active(b_stats->num))) { + b_stats->best = b_stats->rating; + b_stats->whenbest = time(NULL); + } + +/* ratings are saved later - DAV */ + +/* foxbat 3.11.95 */ + if (game_globals.garray[g].type == TYPE_BLITZ) { + Rb_count++; + Rb_total += (w_stats->rating + b_stats->rating) / 2.0; + } else if (game_globals.garray[g].type == TYPE_STAND) { + Rs_count++; + Rs_total += (w_stats->rating + b_stats->rating) / 2.0; + } else if (game_globals.garray[g].type == TYPE_LIGHT) { + Rl_count++; + Rl_total += (w_stats->rating + b_stats->rating) / 2.0; + } else if (game_globals.garray[g].type == TYPE_BUGHOUSE) { + Rbug_count++; + Rbug_total += (w_stats->rating + b_stats->rating) / 2.0; + } else if (game_globals.garray[g].type == TYPE_WILD) { + Rw_count++; + Rw_total += (w_stats->rating + b_stats->rating) / 2.0; + } +/* end add */ + if (inprogress) { + pprintf(game_globals.garray[g].white, "--> %d\n", w_stats->rating); + pprintf(game_globals.garray[g].black, "--> %d\n", b_stats->rating); + } + save_ratings(); + UpdateRank(game_globals.garray[g].type, player_globals.parray[game_globals.garray[g].white].name, + w_stats, player_globals.parray[game_globals.garray[g].white].name); + UpdateRank(game_globals.garray[g].type, player_globals.parray[game_globals.garray[g].black].name, + b_stats, player_globals.parray[game_globals.garray[g].black].name); + return 0; +} + +static void ShowAssess (int p, int p1, int p2, int type1, int type2) +{ + int p3, p4; + int win1, win2, win3, win4; + int draw1, draw2, draw3, draw4; + int loss1, loss2, loss3, loss4; + double newsterr1, newsterr2, newsterr3, newsterr4; + int nowtime = time(0); + char line[100]; /* should never need any more than 80. */ + + if (type1 == TYPE_BUGHOUSE) { + p3 = player_globals.parray[p1].partner; + p4 = player_globals.parray[p2].partner; + type2 = type1; + if (!CheckPFlag(p3, PFLAG_REG) || !CheckPFlag(p4, PFLAG_REG)) { + pprintf (p, "Bughouse with unregistered partners cannot be rated.\n"); + return; + } + } else { + p3 = p1; + p4 = p2; + } + rating_sterr_delta(p1, p2, type1, nowtime, RESULT_WIN, &win1, &newsterr1); + rating_sterr_delta(p1, p2, type1, nowtime, RESULT_DRAW, &draw1, &newsterr1); + rating_sterr_delta(p1, p2, type1, nowtime, RESULT_LOSS, &loss1, &newsterr1); + rating_sterr_delta(p2, p1, type1, nowtime, RESULT_WIN, &win2, &newsterr2); + rating_sterr_delta(p2, p1, type1, nowtime, RESULT_DRAW, &draw2, &newsterr2); + rating_sterr_delta(p2, p1, type1, nowtime, RESULT_LOSS, &loss2, &newsterr2); + + if (type2 >= 0) { + rating_sterr_delta(p3,p4, type2, nowtime,RESULT_WIN, &win3, &newsterr3); + rating_sterr_delta(p3,p4, type2, nowtime,RESULT_DRAW, &draw3, &newsterr3); + rating_sterr_delta(p3,p4, type2, nowtime,RESULT_LOSS, &loss3, &newsterr3); + rating_sterr_delta(p4,p3, type2, nowtime,RESULT_WIN, &win4, &newsterr4); + rating_sterr_delta(p4,p3, type2, nowtime,RESULT_DRAW, &draw4, &newsterr4); + rating_sterr_delta(p4,p3, type2, nowtime,RESULT_LOSS, &loss4, &newsterr4); + } + sprintf (line, "%7s", ""); + if (type1 != TYPE_BUGHOUSE) { + CenterText (&line[7], TypeStrings[type1], 35, 1); + if (type2 >= 0) { + strcat (line, " "); + CenterText (&line[44], TypeStrings[type2], 35, 0); + } + } + else { + CenterText (&line[7], "Bughouse", 72, 0); + } + pprintf (p, "\n%s\n", line); + + sprintf (line, "%7s", ""); + CenterText (&line[7], player_globals.parray[p1].name, 17, 1); + strcat (line, " "); + CenterText (&line[25], player_globals.parray[p2].name, 17, 1); + if (type2 >= 0) { + strcat (line, " "); + CenterText (&line[44], player_globals.parray[p3].name, 17, 1); + strcat (line, " "); + CenterText (&line[62], player_globals.parray[p4].name, 17, 0); + } + pprintf (p, "%s\n", line); + pprintf (p, "%7s (%4s RD %5.1f) ", + "", ratstrii(GetRating(&player_globals.parray[p1], type1), p1), + GetRD(&player_globals.parray[p1], type1)); + pprintf (p, " (%4s RD %5.1f)", + ratstrii(GetRating(&player_globals.parray[p2], type1), p2), + GetRD(&player_globals.parray[p2], type1)); + if (type2 >= 0) { + pprintf (p, " (%4s RD %5.1f)", + ratstrii(GetRating(&player_globals.parray[p3], type2), p3), + GetRD(&player_globals.parray[p3], type2)); + pprintf (p, " (%4s RD %5.1f)", + ratstrii(GetRating(&player_globals.parray[p4], type2), p4), + GetRD(&player_globals.parray[p4], type2)); + } + pprintf (p, "\n%7s%9d %17d", "Win:", win1, loss2); + if (type2 >= 0) + pprintf (p, " %17d %17d", win3, loss4); + pprintf (p, "\n%7s%9d %17d", "Draw:", draw1, draw2); + if (type2 >= 0) + pprintf (p, " %17d %17d", draw3, draw4); + pprintf (p, "\n%7s%9d %17d", "Loss:", loss1, win2); + if (type2 >= 0) + pprintf (p, " %17d %17d", loss3, win4); + pprintf (p, "\n%7s%10.1f %17.1f", "New RD:", newsterr1, newsterr2); + if (type2 >= 0) + pprintf (p, " %17.1f %17.1f", newsterr3, newsterr4); + pprintf(p, "\n"); +} + +int com_assess(int p, param_list param) +{ + struct player *pp = &player_globals.parray[p]; + int p1 = p, p2, g, gametype = -1; + int p1_connected = 1, p2_connected = 1; + +/* Hawk: Now assess can be used with players not */ +/* logged on -- I wonder if anyone doesn't */ +/* get just a bit confused here :) */ + + if (param[0].type == TYPE_NULL) { + g = pp->game; + if (g < 0) { + pprintf(p, "You are not playing or examining a game.\n"); + return COM_OK; + } else if ((game_globals.garray[g].status == GAME_EXAMINE) || (game_globals.garray[g].status == GAME_SETUP)) { + gametype = game_globals.garray[g].type; + if (!strcmp(game_globals.garray[g].black_name, pp->name)) { + if (game_globals.garray[g].rated) { + pcommand(p, "assess %s %s %s\n", game_globals.garray[g].black_name, + game_globals.garray[g].white_name, TypeStrings[gametype]); + return COM_OK_NOPROMPT; + } else { + pprintf(p, "You are not involved in a rated game.\n"); + } + } else { + if (game_globals.garray[g].rated) { + pcommand(p, "assess %s %s %s\n", game_globals.garray[g].white_name, + game_globals.garray[g].black_name, TypeStrings[gametype]); + return COM_OK_NOPROMPT; + } else { + pprintf(p, "You are not involved in a rated game.\n"); + } + } + return COM_OK; + } else { + p2 = pp->opponent; + gametype = game_globals.garray[g].type; + } + } else if (param[0].type == TYPE_INT) { + if (param[1].type != TYPE_NULL) { + pprintf(p, "Assess cannot use other parameters.\n"); + return COM_OK; + } + g = param[0].val.integer - 1; + if (g < 0 || g >= game_globals.g_num) { + pprintf (p, "There is no game %d.\n", g+1); + return COM_OK; + } + gametype = game_globals.garray[g].type; + pcommand(p, "assess %s %s %s\n", game_globals.garray[g].white_name, + game_globals.garray[g].black_name, TypeStrings[gametype]); + return COM_OK_NOPROMPT; + } else { + if (!FindPlayer(p, param[0].val.word, &p2, &p2_connected)) { + pprintf(p, "No user named \"%s\" was found.\n", param[0].val.word); + return COM_OK; + } + if (param[1].type != TYPE_NULL) { + p1 = p2; + p1_connected = p2_connected; + if (!FindPlayer(p, param[1].val.word, &p2, &p2_connected)) { + pprintf(p, "No user named \"%s\" was found.\n", param[1].val.word); + if (!p1_connected) + player_remove(p1); + return COM_OK; + } + if (param[2].type == TYPE_WORD) { + param[2].val.word[0] = toupper(param[2].val.word[0]); + for (gametype = 0; gametype < NUM_GAMETYPES; gametype++) + if (!strcmp(TypeStrings[gametype], param[2].val.word)) + break; + } + } + } + if (gametype >= NUM_GAMETYPES) { + pprintf(p, "There is no game type %s.\n", param[2].val.word); + } else if (p1 == p2) { + pprintf(p, "You can't assess the same players.\n"); + } else if (!CheckPFlag(p1, PFLAG_REG) || !CheckPFlag(p2, PFLAG_REG)) { + pprintf(p, "You can only assess games between registered players.\n"); + } else if (gametype >= 0) { + if (gametype == TYPE_BUGHOUSE + && (player_globals.parray[p1].partner < 0 || player_globals.parray[p2].partner < 0)) { + pprintf(p, "You can only assess bughouse games if both players have partners.\n"); + } else if (gametype == TYPE_UNTIMED || gametype == TYPE_NONSTANDARD) { + pprintf (p, "%s games are never rated.\n", TypeStrings[gametype]); + } else { + ShowAssess (p, p1, p2, gametype, -1); + } + } else { + ShowAssess (p, p1, p2, TYPE_BLITZ, TYPE_STAND); + ShowAssess (p, p1, p2, TYPE_LIGHT, TYPE_WILD); + if (player_globals.parray[p1].partner >= 0 && player_globals.parray[p2].partner >= 0 + && player_globals.parray[p1].partner != p2) + ShowAssess (p, p1, p2, TYPE_BUGHOUSE, TYPE_BUGHOUSE); + } + if (!p1_connected) + player_remove(p1); + if (!p2_connected) + player_remove(p2); + return COM_OK; +} + + +int com_best(int p, param_list param) +{ + return Best(p, param, 1); +} + +int com_hbest(int p, param_list param) +{ + return Best(p, param, 0); +} + +#if 0 +int com_best(int p, param_list param) +{ + int i; + + pprintf(p, "Standard Blitz Wild\n"); + for (i = 0; i < MAX_BEST; i++) { + if ((i >= numS) && (i >= numB)) + break; + if (i < numS) { + pprintf(p, "%4d %-17s ", bestS[i].rating, bestS[i].name); + } else { + pprintf(p, " "); + } + if (i < numB) { + pprintf(p, "%4d %-17s ", bestB[i].rating, bestB[i].name); + } else { + pprintf(p, " "); + } + if (i < numW) { + pprintf(p, "%4d %-17s\n", bestW[i].rating, bestW[i].name); + } else { + pprintf(p, "\n"); + } + } + return COM_OK; +} +#endif + +int com_statistics(int p, param_list param) +{ + pprintf(p, " Standard Blitz Lightning Wild\n"); + pprintf(p, "average: %7.2f %7.2f %7.2f %7.2f\n", Ratings_S_Average, Ratings_B_Average, Ratings_L_Average, Ratings_W_Average); + pprintf(p, "std dev: %7.2f %7.2f %7.2f %7.2f\n", Ratings_S_StdDev, Ratings_B_StdDev, Ratings_L_StdDev, Ratings_W_StdDev); + pprintf(p, "number : %7d %7d %7d %7d\n", Rs_count, Rb_count, Rl_count, Rw_count); + return COM_OK; +} + +int com_fixrank(int p, param_list param) +{ + int p1, connected; + + if (!FindPlayer(p, param[0].val.word, &p1, &connected)) + return COM_OK; + UpdateRank(TYPE_BLITZ, player_globals.parray[p1].name, &player_globals.parray[p1].b_stats, + player_globals.parray[p1].name); + UpdateRank(TYPE_STAND, player_globals.parray[p1].name, &player_globals.parray[p1].s_stats, + player_globals.parray[p1].name); + UpdateRank(TYPE_WILD, player_globals.parray[p1].name, &player_globals.parray[p1].w_stats, + player_globals.parray[p1].name); + if (!connected) + player_remove(p1); + return COM_OK; +} + +int com_rank(int p, param_list param) +{ + return DisplayRank(p, param, 1); +} + +int com_hrank(int p, param_list param) +{ + return DisplayRank(p, param, 0); +} + +static int DisplayRank(int p, param_list param, int showComputers) +{ + struct player *pp = &player_globals.parray[p]; + int start, end, target, connected; + int show = SHOW_BLITZ | SHOW_STANDARD | SHOW_WILD; + + if (param[0].type == TYPE_NULL) { + DisplayTargetRank(p, pp->name, show, showComputers); + return COM_OK; + } else if (isdigit(param[0].val.word[0])) { + end = -1; + sscanf(param[0].val.word, "%d-%d", &start, &end); + if (end > 0 && (param[1].type != TYPE_NULL)) + show = ShowFromString(param[1].val.word); + DisplayRankedPlayers(p, start, end, show, showComputers); + return COM_OK; + } else { + target = player_search(p, param[0].val.word); + if (target == 0) { + pprintf(p, "Target %s not found.\n", param[0].val.word); + return COM_OK; + } + connected = (target > 0); + if (!connected) + target = -target - 1; + else + target--; + + if (param[1].type != TYPE_NULL) + show = ShowFromString(param[1].val.word); + DisplayTargetRank(p, player_globals.parray[target].name, show, showComputers); + if (!connected) + player_remove(target); + return COM_OK; + } +} + +/* CompareStats returns 1 if s1 comes first, -1 if s2 comes first, and 0 + if neither takes precedence. */ +#if 0 +static int CompareStats(char *name1, statistics *s1, + char *name2, statistics *s2) +{ + int i, l1; + + if (s1 == NULL) + if (s2 == NULL) + return 0; + else + return -1; + else if (s2 == NULL) + return 1; + + if (s1->rating > s2->rating) + return 1; + if (s1->rating < s2->rating) + return -1; + l1 = strlen(name1); + for (i = 0; i < l1; i++) { + if (name2[i] == '\0') + return -1; + if (tolower(name1[i]) < tolower(name2[i])) + return 1; + if (tolower(name1[i]) > tolower(name2[i])) + return -1; + } + if (name2[i] != '\0') + return 1; +/* if (s1->sterr < s2->sterr) return 1; + if (s1->sterr > s2->sterr) return -1; + if (s1->num > s2->num) return 1; + if (s1->num < s2->num) return -1; +*/ + d_printf( "Duplicate entries found: %s.\n", name1); + return 0; +} +#endif +static int GetRankFileName(char *out, int type) +{ + switch (type) { + case TYPE_BLITZ: + sprintf(out, "%s/rank.blitz", STATS_DIR); + return type; + case TYPE_STAND: + sprintf(out, "%s/rank.std", STATS_DIR); + return type; + case TYPE_WILD: + sprintf(out, "%s/rank.wild", STATS_DIR); + return type; + default: + return -1; + } +} + +/* loon: Turning this off 28 Oct 1995 (temporary:)) since we're lagged + into outer space */ +void UpdateRank(int type, char *addName, + struct statistics *sNew, char *delName) +{} + +#if 0 +void UpdateRank(int type, char *addName, + struct statistics *sNew, char *delName) +{ + char RankFile[MAX_FILENAME_SIZE]; + char TmpRankFile[MAX_FILENAME_SIZE]; + char line[MAX_RANK_LINE]; + char login[MAX_LOGIN_NAME]; + + int comp; + statistics sCur; + FILE *fp; + FILE *fptemp; + + if (GetRankFileName(RankFile, type) < 0) + return; + fp = fopen_s(RankFile, "r"); + if (fp == NULL) { + d_printf( "Can't open rank file to update.\n"); + return; + } + sprintf(TmpRankFile, "%s/tmpRank", sdir); + fptemp = fopen_s(TmpRankFile, "w"); + if (fptemp == NULL) { + d_printf("Unable to open rank file for updating.\n"); + fclose (fp); + return; + } + while (fgets(line, MAX_RANK_LINE - 1, fp)) { + sscanf(line, "%s %d %d %d", login, &sCur.rating, + &sCur.num, &comp); + if (delName != NULL && !strcasecmp(delName, login)) { /* Kill name. */ + delName = NULL; + continue; + } + if (addName != NULL && CompareStats(addName, sNew, login, &sCur) > 0) { + int computer = in_list(-1, L_COMPUTER, addName); + fprintf(fptemp, "%s %d %d %d\n", addName, sNew->rating, + sNew->num, computer); + addName = NULL; + } + fprintf(fptemp, "%s %d %d %d\n", login, sCur.rating, sCur.num, comp); + } + fclose(fptemp); + fclose(fp); + + rename(TmpRankFile, RankFile); +} +#endif + +static void DisplayRankHead(int p, int show) +{ + char Line[MAX_STRING_LENGTH]; + + Line[0] = '\0'; + if (CheckFlag(show, SHOW_BLITZ)) + strcat(Line, " Blitz "); + if (CheckFlag(show, SHOW_STANDARD)) + strcat(Line, " Standard "); + if (CheckFlag(show, SHOW_WILD)) + strcat(Line, " Wild"); + pprintf(p, "%s\n\n", Line); +} + +static int CountRankLine(int countComp, char *loginName, + int num, int is_computer) +{ + if (loginName == NULL || loginName[0] == '\0') + return 0; + return (countComp || !is_computer) && (is_active(num)); +} + +static int GetRank(FILE * fp, char *target, int countComp) +{ + int count = 0; + int nGames, is_computer; + int playerFound = 0; + char line[MAX_RANK_LINE]; + char login[MAX_LOGIN_NAME]; + + while (fgets(line, MAX_RANK_LINE - 1, fp) && !playerFound) { + sscanf(line, "%s %*d %d %d", login, &nGames, &is_computer); + if ((playerFound = !strcasecmp(login, target)) + || CountRankLine(countComp, login, nGames, is_computer)) + count++; + } + return (playerFound ? count : -1); +} + +static void PositionFilePtr(FILE * fp, int count, int *last, + int *nTied, int showComp) +{ + int i, rating, nGames, is_computer; + char login[MAX_LOGIN_NAME]; + char line[MAX_RANK_LINE]; + + if (fp == NULL) + return; + rewind(fp); + for (i = 1; i < count; i++) { + do { + fgets(line, MAX_RANK_LINE - 1, fp); + if (feof(fp)) + break; + sscanf(line, "%s %d %d %d", login, &rating, &nGames, &is_computer); + } while (!CountRankLine(showComp, login, nGames, is_computer)); + if (rating != *last) { + *nTied = 1; + *last = rating; + } else + (*nTied)++; + } +} + +static int ShowRankEntry(int p, FILE * fp, int count, int comp, + char *target, int *lastRating, int *nTied) +{ + char newLine[MAX_RANK_LINE]; + char login[MAX_LOGIN_NAME]; + int rating, findable, nGames, is_comp; + + findable = (count > 0) && !feof(fp); + if (findable) { + do { + fgets(newLine, MAX_RANK_LINE - 1, fp); + if (feof(fp)) + findable = 0; + else if (newLine[0] != '\0') + sscanf(newLine, "%s %d %d %d", + login, &rating, &nGames, &is_comp); + else + login[0] = '\0'; + } while (!CountRankLine(comp, login, nGames, is_comp) && findable + && strcasecmp(login, target)); + } + if (findable) { + if (!strcasecmp(login, target) + && !CountRankLine(comp, login, nGames, is_comp)) { + pprintf_highlight(p, "---- %-12.12s %4s", login, ratstr(rating)); + pprintf(p, " "); + return 0; + } else if (*lastRating == rating && *nTied < 1) { + pprintf(p, " "); + if (!strcasecmp(login, target)) + pprintf_highlight(p, "%-12.12s %4s", login, ratstr(rating)); + else + pprintf(p, "%-12.12s %4s", login, ratstr(rating)); + pprintf(p, " "); + return 1; + } else { + if (*nTied >= 1) { + if (*lastRating == rating) + count -= *nTied; + *nTied = -1; + } + if (!strcasecmp(login, target)) + pprintf_highlight(p, "%4d. %-12.12s %4s", + count, login, ratstr(rating)); + else + pprintf(p, "%4d. %-12.12s %4s", + count, login, ratstr(rating)); + pprintf(p, " "); + *lastRating = rating; + return 1; + } + } else { + pprintf(p, "%25s", ""); + return 1; + } +} + +static int CountAbove(int num, int blitz, int std, int wild, int which) +{ + int max = blitz; + + if (max < std) + max = std; + if (max < wild) + max = wild; + return (max <= (num + 1) / 2 ? max - 1 : (num + 1) / 2); +} + +static int ShowRankLines(int p, FILE * fb, FILE * fs, FILE * fw, int bCount, + int sCount, int wCount, int n, int showComp, int show, char *target) +{ + int lastBlitz = 9999, nTiedBlitz = 0; + int lastStd = 9999, nTiedStd = 0; + int lastWild = 9999, nTiedWild = 0; + int i; + + if (n <= 0) + return 0; + if (CheckFlag(show, SHOW_BLITZ)) { + PositionFilePtr(fb, bCount, &lastBlitz, &nTiedBlitz, showComp); + if (feof(fb)) + FlagOFF(show, SHOW_BLITZ); + } + if (CheckFlag(show, SHOW_STANDARD)) { + PositionFilePtr(fs, sCount, &lastStd, &nTiedStd, showComp); + if (feof(fs)) + FlagOFF(show, SHOW_STANDARD); + } + if (CheckFlag(show, SHOW_WILD)) { + PositionFilePtr(fw, wCount, &lastWild, &nTiedWild, showComp); + if (feof(fw)) + FlagOFF(show, SHOW_WILD); + } + if (!CheckFlag(show, SHOW_BLITZ | SHOW_STANDARD | SHOW_WILD)) + return 0; + DisplayRankHead(p, show); + + for (i = 0; i < n && show; i++) { + if (CheckFlag(show, SHOW_BLITZ)) + bCount += ShowRankEntry(p, fb, bCount, showComp, target, + &lastBlitz, &nTiedBlitz); + if (CheckFlag(show, SHOW_STANDARD)) + sCount += ShowRankEntry(p, fs, sCount, showComp, target, + &lastStd, &nTiedStd); + if (CheckFlag(show, SHOW_WILD)) + wCount += ShowRankEntry(p, fw, wCount, showComp, target, + &lastWild, &nTiedWild); + pprintf(p, "\n"); + } + return 1; +} + +static int DisplayTargetRank(int p, char *target, int show, int showComp) +{ + int numToShow = 20; + int blitzRank = -1, blitzCount; + int stdRank = -1, stdCount; + int wildRank = -1, wildCount; + int numAbove; + char Path[MAX_FILENAME_SIZE]; + FILE *fb = NULL, *fs = NULL, *fw = NULL; + + if (CheckFlag(show, SHOW_BLITZ)) { + GetRankFileName(Path, TYPE_BLITZ); + fb = (FILE *) fopen_s(Path, "r"); + if (fb != NULL) + blitzRank = GetRank(fb, target, showComp); + if (blitzRank < 0) + FlagOFF(show, SHOW_BLITZ); + } + if (CheckFlag(show, SHOW_STANDARD)) { + GetRankFileName(Path, TYPE_STAND); + fs = (FILE *) fopen_s(Path, "r"); + if (fs != NULL) + stdRank = GetRank(fs, target, showComp); + if (stdRank < 0) + FlagOFF(show, SHOW_STANDARD); + } + if (CheckFlag(show, SHOW_WILD)) { + GetRankFileName(Path, TYPE_WILD); + if (CheckFlag(show, SHOW_WILD)) + fw = (FILE *) fopen_s(Path, "r"); + if (fw != NULL) + wildRank = GetRank(fw, target, showComp); + if (wildRank < 0) + FlagOFF(show, SHOW_WILD); + } + if (!CheckFlag(show, SHOW_BLITZ | SHOW_STANDARD | SHOW_WILD)) { + pprintf(p, "No ratings to show.\n"); + if (fb != NULL) fclose(fb); + if (fs != NULL) fclose(fs); + if (fw != NULL) fclose(fw); + return (0); + } + numAbove = CountAbove(numToShow, blitzRank, stdRank, wildRank, show); + blitzCount = blitzRank - numAbove; + stdCount = stdRank - numAbove; + wildCount = wildRank - numAbove; + + ShowRankLines(p, fb, fs, fw, blitzCount, stdCount, wildCount, + numToShow, showComp, show, target); + if (fb != NULL) fclose(fb); + if (fs != NULL) fclose(fs); + if (fw != NULL) fclose(fw); + return (1); +} + +static int DisplayRankedPlayers(int p, int start, int end, + int show, int showComp) +{ + int num = end - start + 1; + FILE *fb = NULL, *fs = NULL, *fw = NULL; + char Path[MAX_FILENAME_SIZE]; + + if (start <= 0) + start = 1; + if (num <= 0) + return 0; + if (num > 100) + num = 100; + if (CheckFlag(show, SHOW_BLITZ)) { + GetRankFileName(Path, TYPE_BLITZ); + fb = (FILE *) fopen_s(Path, "r"); + if (fb == NULL) + FlagOFF(show, SHOW_BLITZ); + } + if (CheckFlag(show, SHOW_STANDARD)) { + GetRankFileName(Path, TYPE_STAND); + fs = (FILE *) fopen_s(Path, "r"); + if (fs == NULL) + FlagOFF(show, SHOW_STANDARD); + } + if (CheckFlag(show, SHOW_WILD)) { + GetRankFileName(Path, TYPE_WILD); + fw = (FILE *) fopen_s(Path, "r"); + if (fw == NULL) + FlagOFF(show, SHOW_WILD); + } + ShowRankLines(p, fb, fs, fw, start, start, start, + num, showComp, show, ""); + if (fb) + fclose(fb); + if (fs) + fclose(fs); + if (fw) + fclose(fw); + return 1; +} + +static int ShowFromString(char *s) +{ + int i, len = strlen(s); + int show = 0; + + if (s == NULL || s[0] == '\0') + return SHOW_BLITZ | SHOW_STANDARD | SHOW_WILD; + for (i = 0; i < len; i++) { + switch (s[i]) { + case 'b': + FlagON(show, SHOW_BLITZ); + break; + case 's': + FlagON(show, SHOW_STANDARD); + break; + case 'w': + FlagON(show, SHOW_WILD); + break; + } + } + return (show); +} + +static int Best(int p, param_list param, int ShowComp) +{ + int show = SHOW_BLITZ | SHOW_STANDARD | SHOW_WILD; + + if (param[0].type != TYPE_NULL) + show = ShowFromString(param[0].val.word); + + DisplayRankedPlayers(p, 1, 20, show, ShowComp); + return COM_OK; +} + diff --git a/lasker-2.2.3/src/ratings.h b/lasker-2.2.3/src/ratings.h new file mode 100644 index 0000000..c597af1 --- /dev/null +++ b/lasker-2.2.3/src/ratings.h @@ -0,0 +1,46 @@ +/* + Copyright (c) 1993 Richard V. Nash. + Copyright (c) 2000 Dan Papasian + Copyright (C) Andrew Tridgell 2002 + + 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., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#ifndef _RATINGS_H +#define _RATINGS_H + +#define STATS_VERSION 2 + +#define RESULT_WIN 0 +#define RESULT_DRAW 1 +#define RESULT_LOSS 2 +#define RESULT_ABORT 3 + +#define PROVISIONAL 20 + +#define MAX_RANK_LINE 50 +#define MAX_BEST 20 + +#define SHOW_BLITZ 0x1 +#define SHOW_STANDARD 0x2 +#define SHOW_WILD 0x4 + +typedef struct rateStruct { + char name[MAX_LOGIN_NAME]; + int rating; +} rateStruct; + +#endif /* _RATINGS_H */ + diff --git a/lasker-2.2.3/src/reload.c b/lasker-2.2.3/src/reload.c new file mode 100644 index 0000000..38bd1e9 --- /dev/null +++ b/lasker-2.2.3/src/reload.c @@ -0,0 +1,68 @@ +/* + load/unload local variables + + Copyright (C) Andrew Tridgell 2002 + + 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., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#include "includes.h" + +static void variable_reload(void) +{ + if (config_open() != 0) { + d_printf("CHESSD: config database open failed\n"); + exit(1); + } + + news_open(); + commands_init(); + ratings_init(); + wild_init(); + book_open(); + + init_userstat(); +} + +/* initialise variables that can be re-initialised on code reload */ +void initial_load(void) +{ + command_globals.startuptime = time(0); + + seek_globals.quota_time = 60; + command_globals.player_high = 0; + command_globals.game_high = 0; + srandom(command_globals.startuptime); + variable_reload(); +} + +/* initialise variables that can be re-initialised on code reload */ +void reload_open(void) +{ + load_all_globals("globals.dat"); + variable_reload(); +} + + +/* initialise variables that can be re-initialised on code reload */ +void reload_close(void) +{ + news_close(); + config_close(); + book_close(); + lists_close(); + save_all_globals("globals.dat"); + m_free_all(); +} diff --git a/lasker-2.2.3/src/seekproc.c b/lasker-2.2.3/src/seekproc.c new file mode 100755 index 0000000..e065cef --- /dev/null +++ b/lasker-2.2.3/src/seekproc.c @@ -0,0 +1,255 @@ +/* + Copyright (c) 2000 Dan Papasian + Copyright (C) Andrew Tridgell 2002 + + 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., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#include "includes.h" + +enum { SEEKOPEN = 0, SEEKCLOSED }; + +/* The values of the follwing enums cannot be changed as they will end up */ +/* Being seen by the client- we can add values later but the ones */ +/* Here, after being documented, have to be here forever */ +enum { LIGHTNING = 0, STANDARD, BLITZ, UNTIMED }; + +#undef BLACK +#undef WHITE +enum { BLACK = 0, WHITE}; + + +static int get_empty_seekslot(void); +static char *form_ad(struct pending * ad, int i); + +int com_seek(int p, param_list param) +{ + struct player *pp = &player_globals.parray[p]; + int p1, count = 0; + int num; /* sought ID */ + char *msgtxt; + char board[1], category[1]; + + + srandom(time(0)); +#if 0 + if (!CheckPFlag(p, PFLAG_REG)) { + pprintf(p, "Only registered players can use the seek command.\n"); + return COM_OK; + } +#endif + + if ((pp->game >= 0) && ((game_globals.garray[pp->game].status == GAME_EXAMINE) || (game_globals.garray[pp->game].status == GAME_SETUP))) { + pprintf(p, "ERROR: You can't seek a game while you are examining one.\n"); + return COM_OK; + } + if (pp->game >= 0) { + pprintf(p, "ERROR: You can't seek a game while you are playing one.\n"); + return COM_OK; + } + num = get_empty_seekslot(); + if (num == -1) { + pprintf(p, "ERROR: Sorry, all available slots for seek are closed.\n"); + return COM_OK; + } + seek_globals.ads[num].status = SEEKCLOSED; + seek_globals.ads[num].whofrom = p; + + if (param[0].type == TYPE_INT) + seek_globals.ads[num].wtime = param[0].val.integer; /* White time */ + else + seek_globals.ads[num].wtime = pp->d_time; + + if (param[1].type == TYPE_INT) + seek_globals.ads[num].winc = param[1].val.integer; /* White increment */ + else + seek_globals.ads[num].winc = pp->d_inc; + + seek_globals.ads[num].btime = seek_globals.ads[num].wtime; /* Black time */ + seek_globals.ads[num].binc = seek_globals.ads[num].winc; /* Black increment */ + + if (param[2].type == TYPE_INT) { + if (param[2].val.integer == UNRATED || !CheckPFlag(p, PFLAG_REG) || seek_globals.ads[num].wtime == 0) + seek_globals.ads[num].rated = UNRATED; /* unrated */ + else if (param[2].val.integer == RATED) + seek_globals.ads[num].rated = RATED; /* rated */ + } else + seek_globals.ads[num].rated = BoolCheckPFlag(p, PFLAG_RATED); + + + if (param[3].type == TYPE_INT) { + if (param[3].val.integer == WHITE) + seek_globals.ads[num].seek_color = WHITE; + else if (param[3].val.word[0] == BLACK) + seek_globals.ads[num].seek_color = BLACK; + } else + seek_globals.ads[num].seek_color = random() % 2; + + category[0]='\0'; + board[0]='\0'; + /* FIXME- use proper values */ + seek_globals.ads[num].category = strdup(category); + seek_globals.ads[num].board_type = strdup(board); + + seek_globals.ads[num].next = NULL; + + msgtxt = form_ad(&seek_globals.ads[num], num); + + for (p1 = 0; p1 < player_globals.p_num; p1++) { + if ((p1 == p) || !CheckPFlag(p1, PFLAG_ADS) + || (player_globals.parray[p1].status != PLAYER_PROMPT) + || (player_censored(p1, p))) + continue; + count++; + pprintf(p1, "%s", msgtxt); + } + pprintf(p, "%s", msgtxt); + free(msgtxt); + + return COM_OK; +} + +int com_play(int p, param_list param) +{ + int game; + + game = param[0].val.integer; + + if (seek_globals.ads[game].status != SEEKCLOSED) { + pprintf(p, "ERROR: Either that game has already started or " + "it is no longer available.\n"); + return COM_OK; + } + if (!CheckPFlag(p, PFLAG_REG) && seek_globals.ads[game].rated == 1) { + pprintf(p, "ERROR: Unregistred users cannot play rated games.\n"); + return COM_OK; + } + if (seek_globals.ads[game].whofrom == p) { + pprintf(p, "ERROR: You cannot respond to your own seek ads\n"); + return COM_OK; + } + seek_globals.ads[game].whoto = p; + + decline_withdraw_offers(p, -1, PEND_ALL, DO_DECLINE | DO_WITHDRAW); + decline_withdraw_offers(seek_globals.ads[game].whofrom, -1, PEND_ALL, DO_DECLINE | DO_WITHDRAW); + + accept_match(&seek_globals.ads[game], p, seek_globals.ads[game].whofrom); +#if 0 + free(seek_globals.ads[game].category); + free(seek_globals.ads[game].board_type); +#endif +return 0; +} + +int com_sought(int p, param_list param) +{ + int i; + + for (i = 0; i < seek_globals.max_ads; i++) { + if (seek_globals.ads[i].status == SEEKCLOSED) { + char *msgtxt = form_ad(&seek_globals.ads[i], i); + pprintf(p, "%s", msgtxt); + free(msgtxt); + } + } + return COM_OK; +} + + +int com_unseek(int p, param_list param) +{ + /* TODO: need to add parameters */ + withdraw_seeks(p); + return COM_OK; +} + +void withdraw_seeks(int p) +{ + int i, p1; + + for (i = 0; i < seek_globals.max_ads; i++) { + if (seek_globals.ads[i].whofrom == p && + seek_globals.ads[i].status == SEEKCLOSED) { + seek_globals.ads[i].status = SEEKOPEN; + + for (p1 = 0; p1 < player_globals.p_num; p1++) { + if ((p1 == p) || (player_globals.parray[p1].status != PLAYER_PROMPT) || + (player_censored(p1, p)) || !CheckPFlag(p1,PFLAG_ADS)) + continue; + pprintf_prompt(p1, "AD_DESTROY: %d\n", i); + } + pprintf(p, "AD_DESTROY: %d\n", i); + FREE(seek_globals.ads[i].category); + FREE(seek_globals.ads[i].board_type); + } + } +} + +static int get_empty_seekslot(void) +{ + int i; + + for (i = 0; i < seek_globals.max_ads; i++) { + if (seek_globals.ads[i].status != SEEKCLOSED) + return i; + } + + if (seek_globals.max_ads >= config_get_int("MAX_SOUGHT", DEFAULT_MAX_SOUGHT)) { + d_printf("Too many seeks! please raise MAX_SOUGHT\n"); + return -1; + } + + seek_globals.max_ads += 100; + seek_globals.ads = (struct pending *)realloc(seek_globals.ads, + seek_globals.max_ads * sizeof(struct pending)); + + ZERO_STRUCT(seek_globals.ads[i]); + return i; + +} + +static char *form_ad(struct pending * ad, int i) +{ + + char *final; + int rating, total, type; + + total = ad->wtime * 60 + ad->winc * 40; + + if(total == 0) { + type = UNTIMED; + rating = player_globals.parray[ad->whofrom].l_stats.rating; + } else if (total < 180) { + type = LIGHTNING; + rating = player_globals.parray[ad->whofrom].l_stats.rating; + } else if (total >= 900) { + type = STANDARD; + rating = player_globals.parray[ad->whofrom].s_stats.rating; + } else { + type = BLITZ; + rating = player_globals.parray[ad->whofrom].b_stats.rating; + } + + asprintf(&final, "%3u %4u %-17s %3u %3u %-7s %-10s\n", + i, + rating, + player_globals.parray[ad->whofrom].name, + ad->wtime, + ad->winc, + ad->rated?"rated":"unrated", + TypeStrings[ad->seek_color]); + + return final; +} diff --git a/lasker-2.2.3/src/setup.c b/lasker-2.2.3/src/setup.c new file mode 100644 index 0000000..4138c63 --- /dev/null +++ b/lasker-2.2.3/src/setup.c @@ -0,0 +1,330 @@ +/* + 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., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +/* setup.c + + Contains stuff for setting up boards in examine mode + +*/ + +#include "includes.h" + +static int check_valid_square(char* square) +{ + if (strlen (square) == 2) { + if ( (square[0] <= 'a') && (square[0] >= 'h') + && (square[1] <= '1') && (square [1] >= '8') ) + return 0; + return 1; + } else + return 0; +} + +/* Check the position is valid + ie two kings - one white one black + ie no pawns on 1st or 8th ranks + only the king that is to move may be in check, + checkmate and stalemate */ + +static int validate_position (int p,struct game_state_t *b) +{ + int r,f,check; + int white_k = 0; + int black_k = 0; + + for (f = 0; (f < 8); f++) { + for (r = 0; (r < 8); r++) { + if (b->board[f][r] == W_KING) { + white_k += 1; + if (white_k == 2) { + pprintf (p,"You can only have one white king.\n"); + return 0; + } + } + if (b->board[f][r] == B_KING) { + black_k += 1; + if (black_k == 2) { + pprintf (p,"You can only have one black king.\n"); + return 0; + } + } + if (((b->board[f][r] == W_PAWN) || (b->board[f][r] == B_PAWN)) && + ((r == 0) || (r == 7))) { + pprintf (p,"Pawns cannot be placed on the first or eighth rank.\n"); + return 0; + } + } + } + if (!white_k) { + pprintf (p,"There is no white king.\n"); + return 0; + } + if (!black_k) { + pprintf (p,"There is no black king.\n"); + return 0; + } + if (b->onMove == WHITE) { pprintf(p, "WHITE to move\n"); } + else if (b->onMove == BLACK) { pprintf(p, "BLACK to move\n"); } + else pprintf(p, "ERROR!!\n"); + check = in_check(b); + if (check) { + pprintf (p,"Only the player to move may be in check.\n"); + return 0; + } + if (!has_legal_move(b)) { + b->onMove = CToggle(b->onMove); + if (in_check(b)) { + pprintf (p, "%s is checkmated.\n", + b->onMove == WHITE ? "BLACK" : "WHITE"); + } else { + pprintf (p, "%s is stalemated.\n", + b->onMove == WHITE ? "BLACK" : "WHITE"); + } + b->onMove = CToggle(b->onMove); + } + return 1; /* valid position */ +} + +int com_setup (int p,param_list param) +{ + struct player *pp = &player_globals.parray[p]; + int gamenum; + + if ((pp->game <0) || (game_globals.garray[pp->game].status != GAME_SETUP)) { + if (param[0].type == TYPE_NULL) { + if (pp->game >= 0) + if (game_globals.garray[pp->game].status == GAME_EXAMINE) { + game_free (pp->game); + game_globals.garray[pp->game].status = GAME_SETUP; + game_globals.garray[pp->game].numHalfMoves = 0; + game_globals.garray[pp->game].totalHalfMoves = 0; + game_globals.garray[pp->game].revertHalfMove = 0; + pprintf (p,"Entering examine(setup) mode.\n"); + return COM_OK; + } + pcommand (p,"examine setup"); + return COM_OK_NOPROMPT; + } else { + pprintf(p, "You are not setting up a position.\n"); + return COM_OK; + } + } + gamenum = game_globals.garray[pp->game].game_state.gameNum; + if (param[0].type != TYPE_NULL) { + if (!strcmp("clear",param[0].val.word)) { + board_clear(&(game_globals.garray[pp->game].game_state)); + game_globals.garray[pp->game].game_state.gameNum = gamenum; + send_board_to(pp->game, p); + pprintf (p,"Board cleared.\n"); + return COM_OK; + } else if (!strcmp("start",param[0].val.word)) { + board_standard(&(game_globals.garray[pp->game].game_state)); + game_globals.garray[pp->game].game_state.gameNum = gamenum; + send_board_to(pp->game, p); + pprintf (p,"Board set up as starting position.\n"); + return COM_OK; + } else if (!strcmp("fen",param[0].val.word) && param[1].type != TYPE_NULL) { + FEN_to_board(param[1].val.string, &(game_globals.garray[pp->game].game_state)); + game_globals.garray[pp->game].game_state.gameNum = gamenum; + send_board_to(pp->game, p); + pprintf (p,"Board set up by FEN.\n"); + return COM_OK; + } else if (!strcmp("done",param[0].val.word)) { + if (validate_position (p,&(game_globals.garray[pp->game].game_state))) { + game_globals.garray[pp->game].status = GAME_EXAMINE; + pprintf(p,"Game is validated - entering examine mode.\n"); + MakeFENpos(pp->game, game_globals.garray[pp->game].FENstartPos); + } else + pprintf(p,"The position is not valid - staying in setup mode.\n"); + return COM_OK; + } else { /* try to load a category of board */ + if (param[1].type != TYPE_NULL) { + if (!board_init (pp->game,&(game_globals.garray[pp->game].game_state),param[0].val.word,param[1].val.word)) { + game_globals.garray[pp->game].game_state.gameNum = gamenum; + send_board_to(pp->game, p); + pprintf (p,"Board set up as %s %s.\n",param[0].val.word,param[1].val.word); + } else { + pprintf (p,"Board %s %s is unavailable.\n",param[0].val.word,param[1].val.word); + game_globals.garray[pp->game].game_state.gameNum = gamenum; + } + return COM_OK; + } + } + } + pprintf (p, "You have supplied an incorrect parameter to setup.\n"); + return COM_OK; +} + +int com_tomove (int p,param_list param) +{ + struct player *pp = &player_globals.parray[p]; + if ((pp->game <0) || (game_globals.garray[pp->game].status != GAME_SETUP)) { + if (pp->game >= 0) + if (game_globals.garray[pp->game].status == GAME_EXAMINE) { + pprintf (p,"This game is active - type 'setup' to allow editing.\n"); + return COM_OK; + } + pprintf(p, "You are not setting up a position.\n"); + return COM_OK; + } + if (!strcmp("white",param[0].val.word)) + game_globals.garray[pp->game].game_state.onMove = WHITE; + else if (!strcmp("black",param[0].val.word)) + game_globals.garray[pp->game].game_state.onMove = BLACK; + else { + pprintf (p,"Please type: tomove white or tomove black\n"); + return COM_OK; + } + pcommand (p,"refresh"); + return COM_OK_NOPROMPT; +} + +int com_clrsquare (int p,param_list param) +{ + struct player *pp = &player_globals.parray[p]; + if ((pp->game <0) || (game_globals.garray[pp->game].status != GAME_SETUP)) { + if (pp->game >= 0) + if (game_globals.garray[pp->game].status == GAME_EXAMINE) { + pprintf (p,"This game is active - type 'setup' to allow editing.\n"); + return COM_OK; + } + pprintf(p, "You are not setting up a position.\n"); + return COM_OK; + } + + if (!check_valid_square(param[0].val.word)) { + pprintf (p,"You must specify a square."); + return COM_OK; + } + + pcommand (p,"x@%s",param[0].val.word); + return COM_OK_NOPROMPT; +} + +/* allows the following + + x@rf or X@rf - clear a square + P@rf - drop a white pawn + p@rf - drop a black pawn + wp@rf - drop a white pawn + bp@rf - drop a black pawn + can replace the @ with a * - some people do not have a @ key +*/ + +/* having to check before then after is lame - will change this later */ +int is_drop(char* dropstr) +{ + + int len = strlen (dropstr); + + if ((len < 4) || (len > 5)) + return 0; + +/*check x@e3 */ + + if ((dropstr[0] == 'x') || (dropstr[0] == 'X')) { + if (!((dropstr[1] == '@') || (dropstr[1] == '*'))) + return 0; + if (!check_valid_square(dropstr+2)) + return 0; + +/*check wp@e3 */ + + } else if (dropstr[0] == 'w') { + if (!((dropstr[1] == 'p') || (dropstr[1] == 'r') || (dropstr[1] == 'n') || (dropstr[1] == 'b') || (dropstr[1] == 'q') || (dropstr[1] == 'k'))) + return 0; + if (!((dropstr[2] == '@') || (dropstr[2] == '*'))) + return 0; + if (!check_valid_square(dropstr+3)) + return 0; + +/* check bp@e3 */ + + } else if (len == 5) { /* so b@e2 and bb@e2 aren't confused */ + if (dropstr[0] == 'b') { + if (!((dropstr[1] == 'p') || (dropstr[1] == 'r') || (dropstr[1] == 'n') || (dropstr[1] == 'b') || (dropstr[1] == 'q') || (dropstr[1] == 'k'))) + return 0; + if (!((dropstr[2] == '@') || (dropstr[2] == '*'))) + return 0; + if (!check_valid_square(dropstr+3)) + return 0; + } else return 0; /* Exhausted 5 char possibilities */ + +/* check p@e3 and P@e3 */ + + } else if ((dropstr[0] == 'p') || (dropstr[0] == 'r') || (dropstr[0] == 'n') || (dropstr[0] == 'b') || (dropstr[0] == 'q') || (dropstr[0] == 'k') || + (dropstr[0] == 'P') || (dropstr[0] == 'R') || (dropstr[0] == 'N') || (dropstr[0] == 'B') || (dropstr[0] == 'Q') || (dropstr[0] == 'K')) { + + if (!((dropstr[1] == '@') || (dropstr[1] == '*'))) + return 0; + if (!check_valid_square(dropstr+2)) + return 0; + } else return 0; + return 1; /* valid drop */ +} + +static void getsquare(char* square,int *f, int *r) +{ + *f = square[0] - 'a'; + *r = square[1] - '1'; +} + +int attempt_drop(int p,int g,char* dropstr) +{ + int len = strlen (dropstr); + int color; + int piece = 0; + int f; + int r; + + if ((len < 4) || (len > 5)) + return 0; + +/*check x@e3 */ + + if ((dropstr[0] == 'x') || (dropstr[0] == 'X')) { /* as x must be clear */ + getsquare(dropstr+2,&f,&r); + piece = NOPIECE; + +/*check wp@e3 */ + + } else if (dropstr[0] == 'w') { + piece = CharToPiece(dropstr[1]) & 0x07; + color = WHITE; + getsquare(dropstr+3,&f,&r); + +/* check bp@e3 */ + + } else if (len == 5) { /* check length to avoid b@e2 and bb@e2 being confused */ + if (dropstr[0] == 'b') { + piece = CharToPiece(dropstr[1]) | BLACK; + getsquare(dropstr+3,&f,&r); + } + +/* check p@e3 and P@e3 */ + + } else { + if (!((dropstr[1] == '@') || (dropstr[1] == '*'))) + return 0; + else { + piece = CharToPiece(dropstr[0]); + getsquare(dropstr+2,&f,&r); + } + } + + game_globals.garray[g].game_state.board[f][r] = piece; + return 1; /* valid drop */ +} diff --git a/lasker-2.2.3/src/shutdown.c b/lasker-2.2.3/src/shutdown.c new file mode 100644 index 0000000..e9b0179 --- /dev/null +++ b/lasker-2.2.3/src/shutdown.c @@ -0,0 +1,241 @@ +/* + 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., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +/* shutdown.c + Contains stuff related to shutdowns + +*/ + +#include "includes.h" + +static int shutdownTime = 0; +static int lastTimeLeft; +static int shutdownStartTime; +static char downer[1024]; +static char reason[1024]; + +void output_shut_mess(void) +{ + time_t shuttime = time(0); + d_printf( "CHESSD: Shutting down at %s\n", strltime(&shuttime)); +} + +static void ShutDown(void) +{ + int p1; + time_t shuttime = time(0); + + for (p1 = 0; p1 < player_globals.p_num; p1++) { + if (player_globals.parray[p1].status != PLAYER_PROMPT) + continue; + pprintf(p1, "\n\n **** Server shutdown ordered by %s. ****\n", + downer); + if (reason[0] != '\0') + pprintf(p1, "\n **** We are going down because: %s. ****\n", + reason); + } + TerminateCleanup(); + d_printf( "CHESSD: Shut down ordered at %s by %s.\n", + strltime(&shuttime), downer); + + output_shut_mess(); + net_close(); + exit(0); +} + +void ShutHeartBeat(void) +{ + int t = time(0); + int p1; + int timeLeft; + int crossing = 0; + + if (!shutdownTime) + return; + if (!lastTimeLeft) + lastTimeLeft = shutdownTime; + timeLeft = shutdownTime - (t - shutdownStartTime); + if ((lastTimeLeft > 3600) && (timeLeft <= 3600)) + crossing = 1; + if ((lastTimeLeft > 2400) && (timeLeft <= 2400)) + crossing = 1; + if ((lastTimeLeft > 1200) && (timeLeft <= 1200)) + crossing = 1; + if ((lastTimeLeft > 600) && (timeLeft <= 600)) + crossing = 1; + if ((lastTimeLeft > 300) && (timeLeft <= 300)) + crossing = 1; + if ((lastTimeLeft > 120) && (timeLeft <= 120)) + crossing = 1; + if ((lastTimeLeft > 60) && (timeLeft <= 60)) + crossing = 1; + if ((lastTimeLeft > 10) && (timeLeft <= 10)) + crossing = 1; + if (crossing) { + d_printf( + "CHESSD: **** Server going down in %d minutes and %d seconds. ****\n\n", + timeLeft / 60, + timeLeft - ((timeLeft / 60) * 60)); + if (reason[0] != '\0') + d_printf("CHESSD: We are going down because: %s.\n",reason); + for (p1 = 0; p1 < player_globals.p_num; p1++) { + if (player_globals.parray[p1].status != PLAYER_PROMPT) + continue; + pprintf(p1, + "\n\n **** Server going down in %d minutes and %d seconds. ****\n", + timeLeft / 60, + timeLeft - ((timeLeft / 60) * 60)); + if (reason[0] != '\0') + pprintf_prompt(p1,"\n **** We are going down because: %s. ****\n",reason); + else + pprintf_prompt(p1,"\n"); + } + } + lastTimeLeft = timeLeft; + if (timeLeft <= 0) { + ShutDown(); + } +} + +int check_and_print_shutdown(int p) + + /* Tells a user if they is to be a shutdown */ + /* returns 0 if there is not to be one, 1 if there is to be one */ + /* for whenshut command */ + +{ + + + int timeLeft; + int t = time(0); + + if (!shutdownTime) + return 0; /* no shut down */ + + timeLeft = shutdownTime - (t - shutdownStartTime); + + pprintf(p, + "\n **** Server going down in %d minutes and %d seconds. ****\n", + timeLeft / 60, + timeLeft - ((timeLeft / 60) * 60)); + if (reason[0] != '\0') + pprintf(p, "\n **** We are going down because: %s. ****\n", reason); + return 1; +} + + +/* + * shutdown + * + * Usage: shutdown [now,cancel,time] + * + * This command shutsdown the server. If the parameter is omitted or + * is 'now' then the server is immediately halted cleanly. If a time is + * given then a countdown commences and the server is halted when time is + * up. If 'cancel' is given then the countdown is stopped. + */ +int com_shutdown(int p, param_list param) +{ + struct player *pp = &player_globals.parray[p]; + char *ptr; + int p1, secs; + + strcpy(downer, pp->name); + shutdownStartTime = time(0); + if (shutdownTime) { /* Cancel any pending shutdowns */ + for (p1 = 0; p1 < player_globals.p_num; p1++) { + if (player_globals.parray[p1].status != PLAYER_PROMPT) + continue; + pprintf(p1, "\n\n **** Server shutdown canceled by %s. ****\n", downer); + } + shutdownTime = 0; + if (param[0].type == TYPE_NULL) + return COM_OK; + } + /* Work out how soon to shut down */ + if (param[0].type == TYPE_NULL) + shutdownTime = 300; + else { + if (!strcmp(param[0].val.word, "now")) + shutdownTime = 0; + else if (!strcmp(param[0].val.word, "cancel")) + return COM_OK; + else { + ptr = param[0].val.word; + shutdownTime = secs = 0; + p1 = 2; + while (*ptr) { + switch (*ptr) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + secs = secs * 10 + *ptr - '0'; + break; + case ':': + if (p1--) { + shutdownTime = shutdownTime * 60 + secs; + secs = 0; + break; + } + default: + shutdownTime = 0; + pprintf(p, "I don't know what you mean by %s\n", param[0].val.word); + return COM_OK; + } + ptr++; + } + shutdownTime = shutdownTime * 60 + secs; + } + } + if (shutdownTime <= 0) + ShutDown(); + if (param[1].type == TYPE_STRING) + strcpy (reason,param[1].val.string); + else + reason[0] = '\0'; /* No reason - perhaps admin is in a bad mood? :) */ + for (p1 = 0; p1 < player_globals.p_num; p1++) { + if (player_globals.parray[p1].status != PLAYER_PROMPT) + continue; + pprintf(p1, "\n\n **** Server shutdown ordered by %s. ****\n", downer); + if (reason[0] != '\0') + pprintf(p1, " **** We are going down because: %s. ****\n",reason); + pprintf(p1, + " **** Server going down in %d minutes and %d seconds. ****\n", + shutdownTime / 60, shutdownTime % 60); + if (p != p1) /* fix double prompt - DAV */ + pprintf_prompt (p1,"\n"); + else + pprintf (p1,"\n"); + } + lastTimeLeft = 0; + return COM_OK; +} + +int com_whenshut(int p, param_list param) + +{ + if (check_and_print_shutdown(p) == 0) { + pprintf (p,"No shutdown currently in progress\n"); + } + return COM_OK; +} diff --git a/lasker-2.2.3/src/talkproc.c b/lasker-2.2.3/src/talkproc.c new file mode 100644 index 0000000..1016fc5 --- /dev/null +++ b/lasker-2.2.3/src/talkproc.c @@ -0,0 +1,907 @@ +/* + Copyright (c) 1993 Richard V. Nash. + Copyright (c) 2000 Dan Papasian + Copyright (C) Andrew Tridgell 2002 + + 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., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#include "includes.h" + +static int on_channel(int ch, int p); + +static int CheckShoutQuota(int p) +{ + struct player *pp = &player_globals.parray[p]; + int timeleft = time(0) - pp->lastshout_a; + + if ((timeleft < seek_globals.quota_time) && (pp->adminLevel == 0)) + return (seek_globals.quota_time - timeleft); + + return 0; +} + +int com_shout(int p, param_list param) +{ + int p1, count = 0, timeleft = CheckShoutQuota(p); + struct player *pp = &player_globals.parray[p]; + + if (!CheckPFlag(p, PFLAG_REG)) { + pprintf(p, "Only registered players can use the shout command.\n"); + return COM_OK; + } + if (in_list(p, L_MUZZLE, pp->login)) { + pprintf(p, "You are muzzled.\n"); + return COM_OK; + } + if (param[0].type == TYPE_NULL) { + if (timeleft) + pprintf(p, "Next shout available in %d seconds.\n", timeleft); + else + pprintf(p, "Your next shout is ready for use.\n"); + return COM_OK; + } + if (timeleft) { + pprintf(p, "Shout not sent. Next shout in %d seconds.\n", timeleft); + return COM_OK; + } + + pp->lastshout_a = pp->lastshout_b; + pp->lastshout_b = time(0); + if (!printablestring(param[0].val.string)) { + pprintf(p, "Your message contains some unprintable character(s).\n"); + return COM_OK; + } + + for (p1 = 0; p1 < player_globals.p_num; p1++) { + if ((p1 == p) || (player_globals.parray[p1].status != PLAYER_PROMPT) || + (!CheckPFlag(p1, PFLAG_SHOUT)) || (player_censored(p1, p))) + continue; + count++; + pprintf_prompt(p1, "\n%s shouts: %s\n",pp->name,param[0].val.string); + } + + pprintf(p, "(%d) %s shouts: %s\n", count, pp->name, + param[0].val.string); + + if (!CheckPFlag(p, PFLAG_SHOUT)) + pprintf (p, "You are not listening to shouts.\n"); + if ((timeleft = CheckShoutQuota(p))) + pprintf(p, "Next shout in %d second(s).\n", timeleft); + + return COM_OK; +} + +int com_cshout(int p, param_list param) +{ + struct player *pp = &player_globals.parray[p]; + int p1, count = 0; + + if (!CheckPFlag(p, PFLAG_REG)) { + pprintf(p, "Only registered players can use the cshout command.\n"); + return COM_OK; + } + if (in_list(p, L_CMUZZLE, pp->login)) { + pprintf(p, "You are c-muzzled.\n"); + return COM_OK; + } + if (!printablestring(param[0].val.string)) { + pprintf(p, "Your message contains some unprintable character(s).\n"); + return COM_OK; + } + + for (p1 = 0; p1 < player_globals.p_num; p1++) { + if ((p1 == p) || (player_globals.parray[p1].status != PLAYER_PROMPT) || + (!CheckPFlag(p1, PFLAG_CSHOUT)) || (player_censored(p1, p))) + continue; + count++; + pprintf_prompt(p1, "\n%s c-shouts: %s\n", pp->name, + param[0].val.string); + } + pprintf(p, "(%d) %s c-shouts: %s\n", count, pp->name, + param[0].val.string); + if (!CheckPFlag(p, PFLAG_CSHOUT)) + pprintf (p, "You are not listening to c-shouts.\n"); + + return COM_OK; +} + +int com_it(int p, param_list param) +{ + struct player *pp = &player_globals.parray[p]; + int p1, count = 0, timeleft = CheckShoutQuota(p); + + if (!CheckPFlag(p, PFLAG_REG)) { + pprintf(p, "Only registered players can use the it command.\n"); + return COM_OK; + } + if (in_list(p, L_MUZZLE, pp->login)) { + pprintf(p, "You are muzzled.\n"); + return COM_OK; + } + if (param[0].type == TYPE_NULL) { + if (timeleft) + pprintf(p, "Next shout available in %d seconds.\n", timeleft); + else + pprintf(p, "Your next shout is ready for use.\n"); + + return COM_OK; + } + if (timeleft) { + pprintf(p, "Shout not sent. Next shout in %d seconds.\n", timeleft); + return COM_OK; + } + pp->lastshout_a = pp->lastshout_b; + pp->lastshout_b = time(0); + + if (!printablestring(param[0].val.string)) { + pprintf(p, "Your message contains some unprintable character(s).\n"); + return COM_OK; + } + + for (p1 = 0; p1 < player_globals.p_num; p1++) { + if ((p1 == p) || (player_globals.parray[p1].status != PLAYER_PROMPT) || + (!CheckPFlag(p1, PFLAG_SHOUT)) || (player_censored(p1, p))) + continue; + count++; + if ((!strncmp(param[0].val.string, "\'", 1)) || + (!strncmp(param[0].val.string, ",", 1)) || + (!strncmp(param[0].val.string, ".", 1))) + pprintf_prompt(p1, "\n--> %s%s\n", pp->name, + param[0].val.string); + else + pprintf_prompt(p1, "\n--> %s %s\n", pp->name, + param[0].val.string); + } + if ((!strncmp(param[0].val.string, "\'", 1)) || + (!strncmp(param[0].val.string, ",", 1)) || + (!strncmp(param[0].val.string, ".", 1))) + pprintf(p, "--> %s%s\n", pp->name, param[0].val.string); + else + pprintf(p, "--> %s %s\n", pp->name, param[0].val.string); + + if ((timeleft = CheckShoutQuota(p))) + pprintf(p, "Next shout in %d second(s).\n", timeleft); + + return COM_OK; +} + +static int tell(int p, int p1, const char *msg, int why, int ch) +{ + struct player *pp = &player_globals.parray[p]; + char tmp[MAX_LINE_SIZE]; + int rating, rating1, p2; + + if (!printablestring(msg)) { + pprintf(p, "Your message contains some unprintable character(s).\n"); + return COM_OK; + } + + if (!CheckPFlag(p1, PFLAG_TELL) && !CheckPFlag(p, PFLAG_REG)) { + pprintf(p, "Player \"%s\" isn't listening to unregistered tells.\n", + player_globals.parray[p1].name); + return COM_OK; + } + if (player_censored(p1, p)) { + if (pp->adminLevel == 0) { + if (why != TELL_KIBITZ && why != TELL_WHISPER && why != TELL_CHANNEL) + pprintf(p, "Player \"%s\" is censoring you.\n", player_globals.parray[p1].name); + return COM_OK; + } else + pprintf(p, "Told \"%s\", who is censoring you.\n", player_globals.parray[p1].name); + } + + switch (why) { + case TELL_SAY: + pprintf_highlight(p1, "\n%s", pp->name); + pprintf_prompt(p1, " says: %s\n", msg); + break; + case TELL_WHISPER: + case TELL_KIBITZ: + rating = GetRating(&player_globals.parray[p], TYPE_BLITZ); + if (rating < (rating1 = (GetRating(&player_globals.parray[p], TYPE_STAND)))) + rating = rating1; + if (in_list(p, L_FM, pp->name)) + pprintf(p1, "\n%s(FM)", pp->name); + else if (in_list(p, L_IM, pp->name)) + pprintf(p1, "\n%s(IM)", pp->name); + else if (in_list(p, L_GM, pp->name)) + pprintf(p1, "\n%s(GM)", pp->name); + else if (in_list(p, L_WGM, pp->name)) + pprintf(p1, "\n%s(WGM)", pp->name); + else if ((pp->adminLevel >= 10) + && CheckPFlag(p, PFLAG_ADMINLIGHT)) + pprintf(p1, "\n%s(*)", pp->name); + else if ((rating >= player_globals.parray[p1].kiblevel) || + ((pp->adminLevel >= 10) + && CheckPFlag(p, PFLAG_ADMINLIGHT))) + if (!CheckPFlag(p, PFLAG_REG)) + pprintf(p1, "\n%s(++++)", pp->name); + else if (rating != 0) + if (in_list(p, L_COMPUTER, pp->name)) + pprintf(p1, "\n%s(%d)(C)", pp->name, rating); + else + pprintf(p1, "\n%s(%d)", pp->name, rating); + else + pprintf(p1, "\n%s(----)", pp->name); + else break; + + if (why == TELL_WHISPER) + pprintf_prompt(p1, " whispers: %s\n", msg); + else + pprintf_prompt(p1, " kibitzes: %s\n", msg); + + break; + case TELL_CHANNEL: + pprintf(p1, "\n%s", pp->name); + if ((pp->adminLevel >= 10) + && CheckPFlag(p, PFLAG_ADMINLIGHT) && (ch == 1)) + pprintf(p1, "(*)"); + pprintf_prompt(p1, "(%d): %s\n", ch, msg); + break; + case TELL_LTELL: + pprintf_prompt(p1, "\n%s tells you: %s\n", pp->name, msg); + break; + + case TELL_TELL: + default: + if (player_globals.parray[p1].highlight) + pprintf_highlight(p1, "\n%s", pp->name); + else + pprintf(p1, "\n%s", pp->name); + + if ((pp->adminLevel >= 10) && CheckPFlag(p, PFLAG_ADMINLIGHT)) + pprintf(p1,"(*)"); + + pprintf_prompt(p1, " tells you: %s\n", msg); + +/* let's test for forwarding of tells */ + + if ((pp->ftell == p1) || (player_globals.parray[p1].ftell == p)) { + for (p2 = 0; p2 < player_globals.p_num; p2++) { + if ((p2 == p) || (p2 == p1) || (player_globals.parray[p2].status != PLAYER_PROMPT)) + continue; + if (on_channel(0, p2)) + pprintf (p2,"\nFwd tell: %s told %s: %s\n", pp->name, + player_globals.parray[p1].name, msg); + } + } + + break; + } + + tmp[0] = '\0'; + + if (!(player_globals.parray[p1].busy == NULL)) + sprintf(tmp, ", who %s (idle: %s)", player_globals.parray[p1].busy, + hms_desc(player_idle(p1))); + else + if (((player_idle(p1) % 3600) / 60) > 2) + sprintf(tmp, ", who has been idle %s", hms_desc(player_idle(p1))); + + if ((why == TELL_SAY) || (why == TELL_TELL) || (why == TELL_LTELL)) { + pprintf(p, "(told %s%s)\n", player_globals.parray[p1].name, + (((player_globals.parray[p1].game>=0) && (game_globals.garray[player_globals.parray[p1].game].status == GAME_EXAMINE)) + ? ", who is examining a game" : + ((player_globals.parray[p1].game>=0) && (game_globals.garray[player_globals.parray[p1].game].status == GAME_SETUP)) + ? ", who is setting up a position" : + (player_globals.parray[p1].game >= 0 && (player_globals.parray[p1].game != pp->game)) + ? ", who is playing" : tmp)); + } + + if (why == TELL_TELL || why == TELL_SAY) { + FREE(pp->last_tell); + pp->last_tell = strdup(player_globals.parray[p1].login); + } + + return COM_OK; +} + +int com_ptell(int p, param_list param) +{ + struct player *pp = &player_globals.parray[p]; + char tmp[MAX_LINE_SIZE]; + int p1; + + if (pp->partner < 0) { + pprintf (p, "You do not have a partner at present.\n"); + return COM_OK; + } + + p1 = pp->partner; + if ((p1 < 0) || (player_globals.parray[p1].status == PLAYER_PASSWORD) + || (player_globals.parray[p1].status == PLAYER_LOGIN)) { + pprintf(p, "Your partner is not logged in.\n"); + return COM_OK; + } + + if (player_globals.parray[p1].highlight) + pprintf_highlight(p1, "\n%s", pp->name); + else + pprintf(p1, "\n%s", pp->name); + + pprintf_prompt(p1, " (your partner) tells you: %s\n", param[0].val.string); + tmp[0] = '\0'; + if (!(player_globals.parray[p1].busy == NULL)) + sprintf(tmp, ", who %s (idle: %s)", player_globals.parray[p1].busy, + hms_desc(player_idle(p1))); + else + if (((player_idle(p1) % 3600) / 60) > 2) + sprintf(tmp, ", who has been idle %s", hms_desc(player_idle(p1))); + + pprintf(p, "(told %s%s)\n", player_globals.parray[p1].name, + (((player_globals.parray[p1].game>=0) && (game_globals.garray[player_globals.parray[p1].game].status == GAME_EXAMINE)) + ? ", who is examining a game" : + ((player_globals.parray[p1].game>=0) && (game_globals.garray[player_globals.parray[p1].game].status == GAME_SETUP)) + ? ", who is setting up a position" : + (player_globals.parray[p1].game >= 0 && (player_globals.parray[p1].game != pp->game)) + ? ", who is playing" : tmp)); + + return COM_OK; +} + +static int chtell(int p, int ch, char *msg) +{ + struct player *pp = &player_globals.parray[p]; + int p1, count = 0; + + if ((ch == 0) && (pp->adminLevel < ADMIN_ADMIN)) { + pprintf(p, "Only admins may send tells to channel 0.\n"); + return COM_OK; + } + + if (ch < 0) { + pprintf(p, "The lowest channel number is 0.\n"); + return COM_OK; + } + + if (ch >= MAX_CHANNELS) { + pprintf(p, "The maximum channel number is %d.\n", MAX_CHANNELS - 1); + return COM_OK; + } + + if ((ch == 1) && (in_list(p, L_C1MUZZLE, pp->login))) { + pprintf (p, "You have been prevented from sending tells to channel 1.\n"); + return COM_OK; + } + + if ((ch == 24) && (in_list(p, L_C24MUZZLE, pp->login))) { + pprintf (p, "You have been prevented from sending tells to channel 24.\n"); + return COM_OK; + } + + if ((ch == 46) && (in_list(p, L_C46MUZZLE, pp->login))) { + pprintf (p, "You have been prevented from sending tells to channel 46.\n"); + return COM_OK; + } + + if ((ch == 49) && (in_list(p, L_C49MUZZLE, pp->login))) { + pprintf (p, "You have been prevented from sending tells to channel 49.\n"); + return COM_OK; + } + + if ((ch == 50) && (in_list(p, L_C50MUZZLE, pp->login))) { + pprintf (p, "You have been prevented from sending tells to channel 50.\n"); + return COM_OK; + } + + if ((ch == 51) && (in_list(p, L_C51MUZZLE, pp->login))) { + pprintf (p, "You have been prevented from sending tells to channel 51.\n"); + return COM_OK; + } + + for (p1 = 0; p1 < player_globals.p_num; p1++) { + if ((p1 == p) || (player_globals.parray[p1].status != PLAYER_PROMPT)) + continue; + if ((on_channel(ch, p1)) && (!player_censored(p1, p)) + && (CheckPFlag(p, PFLAG_REG) || CheckPFlag(p1, PFLAG_TELL))) { + tell(p, p1, msg, TELL_CHANNEL, ch); + if (!player_censored(p1, p)) + count++; + } + } + + if (count) + pp->last_channel = ch; + + pprintf(p, "%s(%d): %s\n", pp->name, ch, msg); + if (!on_channel(ch, p)) + pprintf(p, " (You're not listening to channel %d.)\n", ch); + + return COM_OK; +} + +int com_whisper(int p, param_list param) +{ + struct player *pp = &player_globals.parray[p]; + int g, p1, count = 0; + + if (!pp->num_observe && pp->game < 0) { + pprintf(p, "You are not playing or observing a game.\n"); + return COM_OK; + } + if (!CheckPFlag(p, PFLAG_REG) && (pp->game == -1)) { + pprintf(p, "You must be registered to whisper other people's games.\n"); + return COM_OK; + } + if (pp->game >= 0) + g = pp->game; + else + g = pp->observe_list[0]; + for (p1 = 0; p1 < player_globals.p_num; p1++) { + if ((p1 == p) || (player_globals.parray[p1].status != PLAYER_PROMPT)) + continue; + if (player_is_observe(p1, g) || + (game_globals.garray[g].link >= 0 && player_is_observe(p1, game_globals.garray[g].link) + && player_globals.parray[p1].game != game_globals.garray[g].link)) { + tell(p, p1, param[0].val.string, TELL_WHISPER, 0); + if ((pp->adminLevel >= ADMIN_ADMIN) || !game_globals.garray[g].private || !player_censored(p1, p)) + count++; + } + } + pprintf(p, "whispered to %d.\n", count); + return COM_OK; +} + +int com_kibitz(int p, param_list param) +{ + struct player *pp = &player_globals.parray[p]; + int g, p1, count = 0; + + if (!pp->num_observe && pp->game < 0) { + pprintf(p, "You are not playing or observing a game.\n"); + return COM_OK; + } + if (!CheckPFlag(p, PFLAG_REG) && (pp->game == -1)) { + pprintf(p, "You must be registered to kibitz other people's games.\n"); + return COM_OK; + } + if (pp->game >= 0) + g = pp->game; + else + g = pp->observe_list[0]; + for (p1 = 0; p1 < player_globals.p_num; p1++) { + if ((p1 == p) || (player_globals.parray[p1].status != PLAYER_PROMPT)) + continue; + if ((player_is_observe(p1, g) || player_globals.parray[p1].game == g + || (game_globals.garray[g].link >= 0 + && (player_is_observe(p1, game_globals.garray[g].link) + || player_globals.parray[p1].game == game_globals.garray[g].link))) + && CheckPFlag(p1, PFLAG_KIBITZ)) { + tell(p, p1, param[0].val.string, TELL_KIBITZ, 0); + if ((pp->adminLevel >= ADMIN_ADMIN) || + !game_globals.garray[g].private || (player_globals.parray[p1].game == g) || !player_censored(p1, p)) + count++; + } + } + pprintf(p, "kibitzed to %d.\n", count); + return COM_OK; +} + +/* + like tell() but takes a player name +*/ +static int tell_s(int p, const char *who, const char *msg, int why, int ch) +{ + int p1; + + p1 = player_find_part_login(who); + if ((p1 < 0) || (player_globals.parray[p1].status == PLAYER_PASSWORD) + || (player_globals.parray[p1].status == PLAYER_LOGIN)) { + if (why != TELL_LTELL) { + pprintf(p, "No user named '%s' is logged in.\n", who); + } + return COM_OK; + } + + return tell(p, p1, msg, why, ch); +} + +int com_tell(int p, param_list param) +{ + struct player *pp = &player_globals.parray[p]; + char *who; + + if (param[0].type == TYPE_NULL) + return COM_BADPARAMETERS; + if (param[0].type != TYPE_WORD) { + return chtell(p, param[0].val.integer, param[1].val.string); + } + + who = param[0].val.word; + stolower(who); + + if (strcmp(who, ".") == 0) { + if (!pp->last_tell) { + pprintf(p, "No previous tell.\n"); + return COM_OK; + } + who = pp->last_tell; + } + + if (strcmp(who, ",") == 0) { + if (pp->last_channel == -1) { + pprintf(p, "No previous channel.\n"); + return COM_OK; + } + return chtell(p, pp->last_channel, param[1].val.string); + } + + return tell_s(p, who, param[1].val.string, TELL_TELL, 0); +} + + +/* tell all players in a named list */ +int com_ltell(int p, param_list param) +{ + struct List *gl; + int i; + + gl = list_findpartial(p, param[0].val.word, 0); + if (!gl) { + pprintf(p,"Can't find that list\n"); + return COM_OK; + } + + for (i=0;inumMembers;i++) { + tell_s(p, gl->m_member[i], param[1].val.string, TELL_LTELL, 0); + } + + return COM_OK; +} + + +int com_xtell(int p, param_list param) +{ + struct player *pp = &player_globals.parray[p]; + int p1; + char *msg, tmp[2048]; + + msg = param[1].val.string; + p1 = player_find_part_login(param[0].val.word); + if ((p1 < 0) || (player_globals.parray[p1].status == PLAYER_PASSWORD) + || (player_globals.parray[p1].status == PLAYER_LOGIN)) { + pprintf(p, "No user named \"%s\" is logged in.\n", param[0].val.word); + return COM_OK; + } + if (!printablestring(msg)) { + pprintf(p, "Your message contains some unprintable character(s).\n"); + return COM_OK; + } + if (!CheckPFlag(p1, PFLAG_TELL) && !CheckPFlag(p, PFLAG_REG)) { + pprintf(p, "Player \"%s\" isn't listening to unregistered tells.\n", + player_globals.parray[p1].name); + return COM_OK; + } + if ((player_censored(p1, p)) && (pp->adminLevel == 0)) { + pprintf(p, "Player \"%s\" is censoring you.\n", player_globals.parray[p1].name); + return COM_OK; + } + if (player_globals.parray[p1].highlight) + pprintf_highlight(p1, "\n%s", pp->name); + else + pprintf(p1, "\n%s", pp->name); + + pprintf_prompt(p1, " tells you: %s\n", msg); + + tmp[0] = '\0'; + if (!(player_globals.parray[p1].busy == NULL)) + sprintf(tmp, ", who %s (idle: %s)", player_globals.parray[p1].busy, + hms_desc(player_idle(p1))); + else + if (((player_idle(p1) % 3600) / 60) > 2) + sprintf(tmp, ", who has been idle %s", hms_desc(player_idle(p1))); + + pprintf(p, "(told %s%s)\n", player_globals.parray[p1].name, + (((player_globals.parray[p1].game>=0) && (game_globals.garray[player_globals.parray[p1].game].status == GAME_EXAMINE)) + ? ", who is examining a game" : + ((player_globals.parray[p1].game>=0) && (game_globals.garray[player_globals.parray[p1].game].status == GAME_SETUP)) + ? ", who is setting up a position" : + (player_globals.parray[p1].game >= 0 && (player_globals.parray[p1].game != pp->game)) + ? ", who is playing" : tmp)); + return COM_OK; +} + +int com_say(int p, param_list param) +{ + struct player *pp = &player_globals.parray[p]; + if (pp->opponent < 0) { + if (!pp->last_opponent) { + pprintf(p, "No one to say anything to, try tell.\n"); + return COM_OK; + } + return tell_s(p, pp->last_opponent, param[0].val.string, TELL_SAY, 0); + } + return tell(p, pp->opponent, param[0].val.string, TELL_SAY, 0); +} + +int com_inchannel(int p, param_list param) +{ + int p1,count = 0; + char tmp[18]; + + if (param[0].type == TYPE_NULL) { + pprintf (p,"inchannel [no params] has been removed\n"); + pprintf (p,"Please use inchannel [name] or inchannel [number]\n"); + return COM_OK; + } + + if (param[0].type == TYPE_WORD) { + p1 = player_find_part_login(param[0].val.word); + if ((p1 < 0) || (player_globals.parray[p1].status != PLAYER_PROMPT)) { + pprintf(p, "No user named \"%s\" is logged in.\n", param[0].val.word); + return COM_OK; + } + pprintf (p,"%s is in the following channels:",player_globals.parray[p1].name); + if (list_channels (p,p1)) + pprintf (p," No channels found for %s.\n",player_globals.parray[p1].name); + return COM_OK; + } else if (param[0].val.integer >= MAX_CHANNELS) { + pprintf (p, "No such channel; the largest channel number is %d.\n", + MAX_CHANNELS - 1); + return COM_OK; + } else { + sprintf (tmp,"%d",param[0].val.integer); + for (p1 = 0; p1 < player_globals.p_num; p1++) { + if (player_globals.parray[p1].status != PLAYER_PROMPT) + continue; + if (in_list(p1,L_CHANNEL,tmp)) { + if (!count) + pprintf(p,"Channel %d:",param[0].val.integer); + pprintf (p," %s", player_globals.parray[p1].name); + if ((player_globals.parray[p1].adminLevel >= 10) + && CheckPFlag(p1, PFLAG_ADMINLIGHT) + && (param[0].val.integer < 2)) + pprintf(p, "(*)"); + count++; + } + } + if (!count) + pprintf(p,"Channel %d is empty.\n",param[0].val.integer); + else + pprintf (p,"\n%d %s in channel %d.\n",count,(count == 1 ? "person is" : "people are"),param[0].val.integer); + return COM_OK; + } +} + +static int com_sendmessage(int p, param_list param) +{ + struct player *pp = &player_globals.parray[p]; + int p1, connected = 1; + + if (!CheckPFlag(p, PFLAG_REG)) { + pprintf(p, "You are not registered and cannot send messages.\n"); + return COM_OK; + } + + if (!FindPlayer(p, param[0].val.word, &p1, &connected)) + return COM_OK; + + if (!CheckPFlag(p1, PFLAG_REG)) { + pprintf(p, "Player \"%s\" is unregistered and cannot receive messages.\n", + player_globals.parray[p1].name); + return COM_OK; + } + + if ((player_censored(p1, p)) && (pp->adminLevel == 0)) { + pprintf(p, "Player \"%s\" is censoring you.\n", player_globals.parray[p1].name); + if (!connected) + player_remove(p1); + return COM_OK; + } + if (player_add_message(p1, p, param[1].val.string)) { + pprintf(p, "Couldn't send message to %s. Message buffer full.\n", + player_globals.parray[p1].name); + } else { + if (connected) { + pprintf(p1, "\n%s just sent you a message:\n", pp->name); + pprintf_prompt(p1, " %s\n", param[1].val.string); + } + } + if (!connected) + player_remove(p1); + return COM_OK; +} + +int com_messages(int p, param_list param) +{ + int start; + + if (!CheckPFlag(p, PFLAG_REG)) { + pprintf (p, "Unregistered players may not send or receive messages.\n"); + return COM_OK; + } + if (param[0].type == TYPE_NULL) { + player_show_messages (p); + } else if (param[0].type == TYPE_WORD) { + if (param[1].type != TYPE_NULL) + return com_sendmessage(p, param); + else ShowMsgsBySender(p, param); + } else { + start = param[0].val.integer; + ShowMsgRange (p, start, start); + } + return COM_OK; +} + +int com_forwardmess(int p, param_list param) +{ + if (!CheckPFlag(p, PFLAG_REG)) { + pprintf (p, "Unregistered players may not send or receive messages.\n"); + return COM_OK; + } + + ForwardMsgRange(param[0].val.word, p, param[1].val.integer, param[1].val.integer); + + return COM_OK; +} + +int com_clearmessages(int p, param_list param) +{ + if (player_num_messages(p) <= 0) { + pprintf(p, "You have no messages.\n"); + return COM_OK; + } + if (param[0].type == TYPE_NULL) { + pprintf(p, "Messages cleared.\n"); + player_clear_messages(p); + } else if (param[0].type == TYPE_WORD) + ClearMsgsBySender(p, param); + else if (param[0].type == TYPE_INT) + ClrMsgRange (p, param[0].val.integer, param[0].val.integer); + + return COM_OK; +} + +int com_znotify(int p, param_list param) +{ + int p1, count = 0; + + for (p1 = 0; p1 < player_globals.p_num; p1++) { + if (player_notified(p, p1) && player_globals.parray[p1].status == PLAYER_PROMPT) { + if (!count) + pprintf(p, "Present company on your notify list:\n "); + pprintf(p, " %s", player_globals.parray[p1].name); + count++; + } + } + if (!count) + pprintf(p, "No one from your notify list is logged on."); + pprintf(p, "\n"); + + count = 0; + for (p1 = 0; p1 < player_globals.p_num; p1++) { + if (player_notified(p1, p) && player_globals.parray[p1].status == PLAYER_PROMPT) { + if (!count) + pprintf(p, + "The following players have you on their notify list:\n "); + pprintf(p, " %s", player_globals.parray[p1].name); + count++; + } + } + if (!count) + pprintf(p, "No one logged in has you on their notify list."); + pprintf(p, "\n"); + + return COM_OK; +} + +int com_qtell(int p, param_list param) +{ + struct player *pp = &player_globals.parray[p]; + int p1; + char tmp[MAX_STRING_LENGTH]; + char dummy[2]; + char buffer1[MAX_STRING_LENGTH]; /* no highlight and no bell */ + char buffer2[MAX_STRING_LENGTH]; /* no highlight and bell */ + char buffer3[MAX_STRING_LENGTH]; /* highlight and no bell */ + char buffer4[MAX_STRING_LENGTH]; /* highlight and and bell */ + int i,count; + + if (!in_list(p, L_TD, pp->name)) { + pprintf(p, "Only TD programs are allowed to use this command.\n"); + return COM_OK; + } + strcpy(buffer1, ":\0"); + strcpy(buffer2, ":\0"); + strcpy(buffer3, ":\0"); + strcpy(buffer4, ":\0"); + + sprintf(tmp, "%s", param[1].val.string); + for (i = 0, count = 0; ((tmp[i] != '\0') && (count < 1029));) { + if ((tmp[i] == '\\') && (tmp[i + 1] == 'n')) { + strcat(buffer1, "\n:"); + strcat(buffer2, "\n:"); + strcat(buffer3, "\n:"); + strcat(buffer4, "\n:"); + count += 2; + i += 2; + } else if ((tmp[i] == '\\') && (tmp[i + 1] == 'b')) { + strcat(buffer2, "\007"); + strcat(buffer4, "\007"); + count++; + i += 2; + } else if ((tmp[i] == '\\') && (tmp[i + 1] == 'H')) { + strcat(buffer3, "\033[7m"); + strcat(buffer4, "\033[7m"); + count += 4; + i += 2; + } else if ((tmp[i] == '\\') && (tmp[i + 1] == 'h')) { + strcat(buffer3, "\033[0m"); + strcat(buffer4, "\033[0m"); + count += 4; + i += 2; + } else { + dummy[0] = tmp[i]; + dummy[1] = '\0'; + strcat(buffer1, dummy); + strcat(buffer2, dummy); + strcat(buffer3, dummy); + strcat(buffer4, dummy); + count++; + i++; + } + } + + if (param[0].type == TYPE_WORD) { + if ((p1 = player_find_bylogin(param[0].val.word)) < 0) { + pprintf(p, "*qtell %s 1*\n", param[0].val.word); + return COM_OK; + } + pprintf_prompt(p1, "\n%s\n", (player_globals.parray[p1].highlight && CheckPFlag(p1, PFLAG_BELL)) ? buffer4 : + (player_globals.parray[p1].highlight && !CheckPFlag(p1, PFLAG_BELL)) ? buffer3 : + (!player_globals.parray[p1].highlight && CheckPFlag(p1, PFLAG_BELL)) ? buffer2 : + buffer1); + pprintf(p, "*qtell %s 0*\n", player_globals.parray[p1].name); + + } else { + int p1; + int ch = param[0].val.integer; + + if (ch == 0) { + pprintf(p, "*qtell %d 1*\n", param[0].val.integer); + return COM_OK; + } + if (ch < 0) { + pprintf(p, "*qtell %d 1*\n", param[0].val.integer); + return COM_OK; + } + if (ch >= MAX_CHANNELS) { + pprintf(p, "*qtell %d 1*\n", param[0].val.integer); + return COM_OK; + } + sprintf (tmp,"%d",param[0].val.integer); + for (p1 = 0; p1 < player_globals.p_num ; p1++) { + if ((p1 == p) || (player_censored(p1, p)) || (player_globals.parray[p1].status != PLAYER_PROMPT)) + continue; + if (in_list(p1,L_CHANNEL,tmp)) + pprintf_prompt(p1, "\n%s\n", (player_globals.parray[p1].highlight && CheckPFlag(p1, PFLAG_BELL)) ? buffer4 : + (player_globals.parray[p1].highlight && !CheckPFlag(p1, PFLAG_BELL)) ? buffer3 : + (!player_globals.parray[p1].highlight && CheckPFlag(p1, PFLAG_BELL)) ? buffer2 : + buffer1); + } + pprintf(p, "*qtell %d 0*\n", param[0].val.integer); + } + return COM_OK; +} + +static int on_channel(int ch, int p) +{ + char tmp[10]; /* 9 digits ought to be enough :) */ + + sprintf (tmp,"%d",ch); + return in_list(p, L_CHANNEL,tmp); /* since needs ch converted to a string + kept hidden from view */ +} diff --git a/lasker-2.2.3/src/talkproc.h b/lasker-2.2.3/src/talkproc.h new file mode 100644 index 0000000..9234d6c --- /dev/null +++ b/lasker-2.2.3/src/talkproc.h @@ -0,0 +1,37 @@ +/* + Copyright (c) 1993 Richard V. Nash. + Copyright (c) 2000 Dan Papasian + Copyright (C) Andrew Tridgell 2002 + + 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., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +/* Revision history: + name yy/mm/dd Change + hersco and Marsalis 95/07/24 Created +*/ + +#ifndef _TALKPROC_H +#define _TALKPROC_H + +#define MAX_CHANNELS 256 +#define TELL_TELL 0 +#define TELL_SAY 1 +#define TELL_WHISPER 2 +#define TELL_KIBITZ 3 +#define TELL_CHANNEL 4 +#define TELL_LTELL 5 + +#endif /* _TALKPROC_H */ diff --git a/lasker-2.2.3/src/tdb/CVS/Entries b/lasker-2.2.3/src/tdb/CVS/Entries new file mode 100644 index 0000000..780c749 --- /dev/null +++ b/lasker-2.2.3/src/tdb/CVS/Entries @@ -0,0 +1,5 @@ +/spinlock.h/1.1/Tue Jun 11 09:03:58 2002// +/spinlock.c/1.2/Fri Jun 21 14:46:30 2002// +/tdb.c/1.3/Thu Jul 22 07:04:41 2004// +/tdb.h/1.2/Thu Jul 22 07:04:41 2004// +D diff --git a/lasker-2.2.3/src/tdb/CVS/Repository b/lasker-2.2.3/src/tdb/CVS/Repository new file mode 100644 index 0000000..f17a14c --- /dev/null +++ b/lasker-2.2.3/src/tdb/CVS/Repository @@ -0,0 +1 @@ +lasker/src/tdb diff --git a/lasker-2.2.3/src/tdb/CVS/Root b/lasker-2.2.3/src/tdb/CVS/Root new file mode 100644 index 0000000..c42ba94 --- /dev/null +++ b/lasker-2.2.3/src/tdb/CVS/Root @@ -0,0 +1 @@ +/home/cvs diff --git a/lasker-2.2.3/src/tdb/spinlock.c b/lasker-2.2.3/src/tdb/spinlock.c new file mode 100644 index 0000000..7447285 --- /dev/null +++ b/lasker-2.2.3/src/tdb/spinlock.c @@ -0,0 +1,429 @@ +/* + Unix SMB/CIFS implementation. + Samba database functions + Copyright (C) Anton Blanchard 2001 + + 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., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ +#if HAVE_CONFIG_H +#include +#endif + +#if STANDALONE +#include +#include +#include +#include +#include +#include +#include +#include +#include "tdb.h" +#include "spinlock.h" + +#define DEBUG +#else +#include "includes.h" +#endif + +#ifdef USE_SPINLOCKS + +/* + * ARCH SPECIFIC + */ + +#if defined(SPARC_SPINLOCKS) + +static inline int __spin_trylock(spinlock_t *lock) +{ + unsigned int result; + + asm volatile("ldstub [%1], %0" + : "=r" (result) + : "r" (lock) + : "memory"); + + return (result == 0) ? 0 : EBUSY; +} + +static inline void __spin_unlock(spinlock_t *lock) +{ + asm volatile("":::"memory"); + *lock = 0; +} + +static inline void __spin_lock_init(spinlock_t *lock) +{ + *lock = 0; +} + +static inline int __spin_is_locked(spinlock_t *lock) +{ + return (*lock != 0); +} + +#elif defined(POWERPC_SPINLOCKS) + +static inline int __spin_trylock(spinlock_t *lock) +{ + unsigned int result; + + __asm__ __volatile__( +"1: lwarx %0,0,%1\n\ + cmpwi 0,%0,0\n\ + li %0,0\n\ + bne- 2f\n\ + li %0,1\n\ + stwcx. %0,0,%1\n\ + bne- 1b\n\ + isync\n\ +2:" : "=&r"(result) + : "r"(lock) + : "cr0", "memory"); + + return (result == 1) ? 0 : EBUSY; +} + +static inline void __spin_unlock(spinlock_t *lock) +{ + asm volatile("eieio":::"memory"); + *lock = 0; +} + +static inline void __spin_lock_init(spinlock_t *lock) +{ + *lock = 0; +} + +static inline int __spin_is_locked(spinlock_t *lock) +{ + return (*lock != 0); +} + +#elif defined(INTEL_SPINLOCKS) + +static inline int __spin_trylock(spinlock_t *lock) +{ + int oldval; + + asm volatile("xchgl %0,%1" + : "=r" (oldval), "=m" (*lock) + : "0" (0) + : "memory"); + + return oldval > 0 ? 0 : EBUSY; +} + +static inline void __spin_unlock(spinlock_t *lock) +{ + asm volatile("":::"memory"); + *lock = 1; +} + +static inline void __spin_lock_init(spinlock_t *lock) +{ + *lock = 1; +} + +static inline int __spin_is_locked(spinlock_t *lock) +{ + return (*lock != 1); +} + +#elif defined(MIPS_SPINLOCKS) + +static inline unsigned int load_linked(unsigned long addr) +{ + unsigned int res; + + __asm__ __volatile__("ll\t%0,(%1)" + : "=r" (res) + : "r" (addr)); + + return res; +} + +static inline unsigned int store_conditional(unsigned long addr, unsigned int value) +{ + unsigned int res; + + __asm__ __volatile__("sc\t%0,(%2)" + : "=r" (res) + : "0" (value), "r" (addr)); + return res; +} + +static inline int __spin_trylock(spinlock_t *lock) +{ + unsigned int mw; + + do { + mw = load_linked(lock); + if (mw) + return EBUSY; + } while (!store_conditional(lock, 1)); + + asm volatile("":::"memory"); + + return 0; +} + +static inline void __spin_unlock(spinlock_t *lock) +{ + asm volatile("":::"memory"); + *lock = 0; +} + +static inline void __spin_lock_init(spinlock_t *lock) +{ + *lock = 0; +} + +static inline int __spin_is_locked(spinlock_t *lock) +{ + return (*lock != 0); +} + +#else +#error Need to implement spinlock code in spinlock.c +#endif + +/* + * OS SPECIFIC + */ + +static void yield_cpu(void) +{ + struct timespec tm; + +#ifdef USE_SCHED_YIELD + sched_yield(); +#else + /* Linux will busy loop for delays < 2ms on real time tasks */ + tm.tv_sec = 0; + tm.tv_nsec = 2000000L + 1; + nanosleep(&tm, NULL); +#endif +} + +static int this_is_smp(void) +{ + return 0; +} + +/* + * GENERIC + */ + +static int smp_machine = 0; + +static inline void __spin_lock(spinlock_t *lock) +{ + int ntries = 0; + + while(__spin_trylock(lock)) { + while(__spin_is_locked(lock)) { + if (smp_machine && ntries++ < MAX_BUSY_LOOPS) + continue; + yield_cpu(); + } + } +} + +static void __read_lock(tdb_rwlock_t *rwlock) +{ + int ntries = 0; + + while(1) { + __spin_lock(&rwlock->lock); + + if (!(rwlock->count & RWLOCK_BIAS)) { + rwlock->count++; + __spin_unlock(&rwlock->lock); + return; + } + + __spin_unlock(&rwlock->lock); + + while(rwlock->count & RWLOCK_BIAS) { + if (smp_machine && ntries++ < MAX_BUSY_LOOPS) + continue; + yield_cpu(); + } + } +} + +static void __write_lock(tdb_rwlock_t *rwlock) +{ + int ntries = 0; + + while(1) { + __spin_lock(&rwlock->lock); + + if (rwlock->count == 0) { + rwlock->count |= RWLOCK_BIAS; + __spin_unlock(&rwlock->lock); + return; + } + + __spin_unlock(&rwlock->lock); + + while(rwlock->count != 0) { + if (smp_machine && ntries++ < MAX_BUSY_LOOPS) + continue; + yield_cpu(); + } + } +} + +static void __write_unlock(tdb_rwlock_t *rwlock) +{ + __spin_lock(&rwlock->lock); + +#ifdef DEBUG + if (!(rwlock->count & RWLOCK_BIAS)) + fprintf(stderr, "bug: write_unlock\n"); +#endif + + rwlock->count &= ~RWLOCK_BIAS; + __spin_unlock(&rwlock->lock); +} + +static void __read_unlock(tdb_rwlock_t *rwlock) +{ + __spin_lock(&rwlock->lock); + +#ifdef DEBUG + if (!rwlock->count) + fprintf(stderr, "bug: read_unlock\n"); + + if (rwlock->count & RWLOCK_BIAS) + fprintf(stderr, "bug: read_unlock\n"); +#endif + + rwlock->count--; + __spin_unlock(&rwlock->lock); +} + +/* TDB SPECIFIC */ + +/* lock a list in the database. list -1 is the alloc list */ +int tdb_spinlock(TDB_CONTEXT *tdb, int list, int rw_type) +{ + tdb_rwlock_t *rwlocks; + + if (!tdb->map_ptr) return -1; + rwlocks = (tdb_rwlock_t *)((char *)tdb->map_ptr + tdb->header.rwlocks); + + switch(rw_type) { + case F_RDLCK: + __read_lock(&rwlocks[list+1]); + break; + + case F_WRLCK: + __write_lock(&rwlocks[list+1]); + break; + + default: + return TDB_ERRCODE(TDB_ERR_LOCK, -1); + } + return 0; +} + +/* unlock the database. */ +int tdb_spinunlock(TDB_CONTEXT *tdb, int list, int rw_type) +{ + tdb_rwlock_t *rwlocks; + + if (!tdb->map_ptr) return -1; + rwlocks = (tdb_rwlock_t *)((char *)tdb->map_ptr + tdb->header.rwlocks); + + switch(rw_type) { + case F_RDLCK: + __read_unlock(&rwlocks[list+1]); + break; + + case F_WRLCK: + __write_unlock(&rwlocks[list+1]); + break; + + default: + return TDB_ERRCODE(TDB_ERR_LOCK, -1); + } + + return 0; +} + +int tdb_create_rwlocks(int fd, unsigned int hash_size) +{ + unsigned size, i; + tdb_rwlock_t *rwlocks; + + size = (hash_size + 1) * sizeof(tdb_rwlock_t); + rwlocks = malloc(size); + if (!rwlocks) + return -1; + + for(i = 0; i < hash_size+1; i++) { + __spin_lock_init(&rwlocks[i].lock); + rwlocks[i].count = 0; + } + + /* Write it out (appending to end) */ + if (write(fd, rwlocks, size) != size) { + free(rwlocks); + return -1; + } + smp_machine = this_is_smp(); + free(rwlocks); + return 0; +} + +int tdb_clear_spinlocks(TDB_CONTEXT *tdb) +{ + tdb_rwlock_t *rwlocks; + unsigned i; + + if (tdb->header.rwlocks == 0) return 0; + if (!tdb->map_ptr) return -1; + + /* We're mmapped here */ + rwlocks = (tdb_rwlock_t *)((char *)tdb->map_ptr + tdb->header.rwlocks); + for(i = 0; i < tdb->header.hash_size+1; i++) { + __spin_lock_init(&rwlocks[i].lock); + rwlocks[i].count = 0; + } + return 0; +} +#else +int tdb_create_rwlocks(int fd, unsigned int hash_size) { return 0; } +int tdb_spinlock(TDB_CONTEXT *tdb, int list, int rw_type) { return -1; } +int tdb_spinunlock(TDB_CONTEXT *tdb, int list, int rw_type) { return -1; } + +/* Non-spinlock version: remove spinlock pointer */ +int tdb_clear_spinlocks(TDB_CONTEXT *tdb) +{ + tdb_off off = (tdb_off)((char *)&tdb->header.rwlocks + - (char *)&tdb->header); + + tdb->header.rwlocks = 0; + if (lseek(tdb->fd, off, SEEK_SET) != off + || write(tdb->fd, (void *)&tdb->header.rwlocks, + sizeof(tdb->header.rwlocks)) + != sizeof(tdb->header.rwlocks)) + return -1; + return 0; +} +#endif diff --git a/lasker-2.2.3/src/tdb/spinlock.h b/lasker-2.2.3/src/tdb/spinlock.h new file mode 100644 index 0000000..d6a2ac6 --- /dev/null +++ b/lasker-2.2.3/src/tdb/spinlock.h @@ -0,0 +1,55 @@ +#ifndef __SPINLOCK_H__ +#define __SPINLOCK_H__ + +#if HAVE_CONFIG_H +#include +#endif + +#include "tdb.h" + +#ifdef USE_SPINLOCKS + +#define RWLOCK_BIAS 0x1000UL + +/* OS SPECIFIC */ +#define MAX_BUSY_LOOPS 1000 +#undef USE_SCHED_YIELD + +/* ARCH SPECIFIC */ +/* We should make sure these are padded to a cache line */ +#if defined(SPARC_SPINLOCKS) +typedef volatile char spinlock_t; +#elif defined(POWERPC_SPINLOCKS) +typedef volatile unsigned long spinlock_t; +#elif defined(INTEL_SPINLOCKS) +typedef volatile int spinlock_t; +#elif defined(MIPS_SPINLOCKS) +typedef volatile unsigned long spinlock_t; +#else +#error Need to implement spinlock code in spinlock.h +#endif + +typedef struct { + spinlock_t lock; + volatile int count; +} tdb_rwlock_t; + +int tdb_spinlock(TDB_CONTEXT *tdb, int list, int rw_type); +int tdb_spinunlock(TDB_CONTEXT *tdb, int list, int rw_type); +int tdb_create_rwlocks(int fd, unsigned int hash_size); +int tdb_clear_spinlocks(TDB_CONTEXT *tdb); + +#else /* !USE_SPINLOCKS */ +#if 0 +#define tdb_create_rwlocks(fd, hash_size) 0 +#define tdb_spinlock(tdb, list, rw_type) (-1) +#define tdb_spinunlock(tdb, list, rw_type) (-1) +#else +int tdb_spinlock(TDB_CONTEXT *tdb, int list, int rw_type); +int tdb_spinunlock(TDB_CONTEXT *tdb, int list, int rw_type); +int tdb_create_rwlocks(int fd, unsigned int hash_size); +#endif +int tdb_clear_spinlocks(TDB_CONTEXT *tdb); +#endif + +#endif diff --git a/lasker-2.2.3/src/tdb/tdb.c b/lasker-2.2.3/src/tdb/tdb.c new file mode 100644 index 0000000..8e6e88c --- /dev/null +++ b/lasker-2.2.3/src/tdb/tdb.c @@ -0,0 +1,1828 @@ + /* + Unix SMB/CIFS implementation. + Samba database functions + Copyright (C) Andrew Tridgell 1999-2000 + Copyright (C) Luke Kenneth Casson Leighton 2000 + Copyright (C) Paul `Rusty' Russell 2000 + Copyright (C) Jeremy Allison 2000 + + 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., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ +#ifdef STANDALONE +#if HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "tdb.h" +#include "spinlock.h" +#else +#include "includes.h" +#endif + +#define TDB_MAGIC_FOOD "TDB file\n" +#define TDB_VERSION (0x26011967 + 6) +#define TDB_MAGIC (0x26011999U) +#define TDB_FREE_MAGIC (~TDB_MAGIC) +#define TDB_DEAD_MAGIC (0xFEE1DEAD) +#define TDB_ALIGNMENT 4 +#define MIN_REC_SIZE (2*sizeof(struct list_struct) + TDB_ALIGNMENT) +#define DEFAULT_HASH_SIZE 131 +#define TDB_PAGE_SIZE 0x2000 +#define FREELIST_TOP (sizeof(struct tdb_header)) +#define TDB_ALIGN(x,a) (((x) + (a)-1) & ~((a)-1)) +#define TDB_BYTEREV(x) (((((x)&0xff)<<24)|((x)&0xFF00)<<8)|(((x)>>8)&0xFF00)|((x)>>24)) +#define TDB_DEAD(r) ((r)->magic == TDB_DEAD_MAGIC) +#define TDB_BAD_MAGIC(r) ((r)->magic != TDB_MAGIC && !TDB_DEAD(r)) +#define TDB_HASH_TOP(hash) (FREELIST_TOP + (BUCKET(hash)+1)*sizeof(tdb_off)) + +/* NB assumes there is a local variable called "tdb" that is the + * current context, also takes doubly-parenthesized print-style + * argument. */ +#define TDB_LOG(x) (tdb->log_fn?((tdb->log_fn x),0) : 0) + +/* lock offsets */ +#define GLOBAL_LOCK 0 +#define ACTIVE_LOCK 4 + +#ifndef MAP_FILE +#define MAP_FILE 0 +#endif + +#ifndef MAP_FAILED +#define MAP_FAILED ((void *)-1) +#endif + +/* free memory if the pointer is valid and zero the pointer */ +#ifndef SAFE_FREE +#define SAFE_FREE(x) do { if ((x) != NULL) {free((x)); (x)=NULL;} } while(0) +#endif + +#define BUCKET(hash) ((hash) % tdb->header.hash_size) +TDB_DATA tdb_null; + +/* all contexts, to ensure no double-opens (fcntl locks don't nest!) */ +static TDB_CONTEXT *tdbs = NULL; + +static int tdb_munmap(TDB_CONTEXT *tdb) +{ + if (tdb->flags & TDB_INTERNAL) + return 0; + +#ifdef HAVE_MMAP + if (tdb->map_ptr) { + int ret = munmap(tdb->map_ptr, tdb->map_size); + if (ret != 0) + return ret; + } +#endif + tdb->map_ptr = NULL; + return 0; +} + +static void tdb_mmap(TDB_CONTEXT *tdb) +{ + if (tdb->flags & TDB_INTERNAL) + return; + +#ifdef HAVE_MMAP + if (!(tdb->flags & TDB_NOMMAP)) { + tdb->map_ptr = mmap(NULL, tdb->map_size, + PROT_READ|(tdb->read_only? 0:PROT_WRITE), + MAP_SHARED|MAP_FILE, tdb->fd, 0); + + /* + * NB. When mmap fails it returns MAP_FAILED *NOT* NULL !!!! + */ + + if (tdb->map_ptr == MAP_FAILED) { + tdb->map_ptr = NULL; + TDB_LOG((tdb, 2, "tdb_mmap failed for size %d (%s)\n", + tdb->map_size, strerror(errno))); + } + } else { + tdb->map_ptr = NULL; + } +#else + tdb->map_ptr = NULL; +#endif +} + +/* Endian conversion: we only ever deal with 4 byte quantities */ +static void *convert(void *buf, u32 size) +{ + u32 i, *p = buf; + for (i = 0; i < size / 4; i++) + p[i] = TDB_BYTEREV(p[i]); + return buf; +} +#define DOCONV() (tdb->flags & TDB_CONVERT) +#define CONVERT(x) (DOCONV() ? convert(&x, sizeof(x)) : &x) + +/* the body of the database is made of one list_struct for the free space + plus a separate data list for each hash value */ +struct list_struct { + tdb_off next; /* offset of the next record in the list */ + tdb_len rec_len; /* total byte length of record */ + tdb_len key_len; /* byte length of key */ + tdb_len data_len; /* byte length of data */ + u32 full_hash; /* the full 32 bit hash of the key */ + u32 magic; /* try to catch errors */ + /* the following union is implied: + union { + char record[rec_len]; + struct { + char key[key_len]; + char data[data_len]; + } + u32 totalsize; (tailer) + } + */ +}; + +/* a byte range locking function - return 0 on success + this functions locks/unlocks 1 byte at the specified offset. + + On error, errno is also set so that errors are passed back properly + through tdb_open(). */ +static int tdb_brlock(TDB_CONTEXT *tdb, tdb_off offset, + int rw_type, int lck_type, int probe) +{ + struct flock fl; + int ret; + + if (tdb->flags & TDB_NOLOCK) + return 0; + if (tdb->read_only) { + errno = EACCES; + return -1; + } + + fl.l_type = rw_type; + fl.l_whence = SEEK_SET; + fl.l_start = offset; + fl.l_len = 1; + fl.l_pid = 0; + + do { + ret = fcntl(tdb->fd,lck_type,&fl); + } while (ret == -1 && errno == EINTR); + + if (ret == -1) { + if (!probe) { + TDB_LOG((tdb, 5,"tdb_brlock failed (fd=%d) at offset %d rw_type=%d lck_type=%d\n", + tdb->fd, offset, rw_type, lck_type)); + } + /* errno set by fcntl */ + return TDB_ERRCODE(TDB_ERR_LOCK, -1); + } + return 0; +} + +/* lock a list in the database. list -1 is the alloc list */ +static int tdb_lock(TDB_CONTEXT *tdb, int list, int ltype) +{ + if (list < -1 || list >= (int)tdb->header.hash_size) { + TDB_LOG((tdb, 0,"tdb_lock: invalid list %d for ltype=%d\n", + list, ltype)); + return -1; + } + if (tdb->flags & TDB_NOLOCK) + return 0; + + /* Since fcntl locks don't nest, we do a lock for the first one, + and simply bump the count for future ones */ + if (tdb->locked[list+1].count == 0) { + if (!tdb->read_only && tdb->header.rwlocks) { + if (tdb_spinlock(tdb, list, ltype)) { + TDB_LOG((tdb, 0, "tdb_lock spinlock failed on list ltype=%d\n", + list, ltype)); + return -1; + } + } else if (tdb_brlock(tdb,FREELIST_TOP+4*list,ltype,F_SETLKW, 0)) { + TDB_LOG((tdb, 0,"tdb_lock failed on list %d ltype=%d (%s)\n", + list, ltype, strerror(errno))); + return -1; + } + tdb->locked[list+1].ltype = ltype; + } + tdb->locked[list+1].count++; + return 0; +} + +/* unlock the database: returns void because it's too late for errors. */ + /* changed to return int it may be interesting to know there + has been an error --simo */ +static int tdb_unlock(TDB_CONTEXT *tdb, int list, int ltype) +{ + int ret = -1; + + if (tdb->flags & TDB_NOLOCK) + return 0; + + /* Sanity checks */ + if (list < -1 || list >= (int)tdb->header.hash_size) { + TDB_LOG((tdb, 0, "tdb_unlock: list %d invalid (%d)\n", list, tdb->header.hash_size)); + return ret; + } + + if (tdb->locked[list+1].count==0) { + TDB_LOG((tdb, 0, "tdb_unlock: count is 0\n")); + return ret; + } + + if (tdb->locked[list+1].count == 1) { + /* Down to last nested lock: unlock underneath */ + if (!tdb->read_only && tdb->header.rwlocks) { + ret = tdb_spinunlock(tdb, list, ltype); + } else { + ret = tdb_brlock(tdb, FREELIST_TOP+4*list, F_UNLCK, F_SETLKW, 0); + } + } else { + ret = 0; + } + tdb->locked[list+1].count--; + + if (ret) + TDB_LOG((tdb, 0,"tdb_unlock: An error occurred unlocking!\n")); + return ret; +} + +/* This is based on the hash algorithm from gdbm */ +static u32 tdb_hash(TDB_DATA *key) +{ + u32 value; /* Used to compute the hash value. */ + u32 i; /* Used to cycle through random values. */ + + /* Set the initial value from the key size. */ + for (value = 0x238F13AF * key->dsize, i=0; i < key->dsize; i++) + value = (value + (key->dptr[i] << (i*5 % 24))); + + return (1103515243 * value + 12345); +} + +/* check for an out of bounds access - if it is out of bounds then + see if the database has been expanded by someone else and expand + if necessary + note that "len" is the minimum length needed for the db +*/ +static int tdb_oob(TDB_CONTEXT *tdb, tdb_off len, int probe) +{ + struct stat st; + if (len <= tdb->map_size) + return 0; + if (tdb->flags & TDB_INTERNAL) { + if (!probe) { + TDB_LOG((tdb, 0,"tdb_oob len %d beyond internal malloc size %d\n", + (int)len, (int)tdb->map_size)); + } + return TDB_ERRCODE(TDB_ERR_IO, -1); + } + + if (fstat(tdb->fd, &st) == -1) + return TDB_ERRCODE(TDB_ERR_IO, -1); + + if (st.st_size < (size_t)len) { + if (!probe) { + TDB_LOG((tdb, 0,"tdb_oob len %d beyond eof at %d\n", + (int)len, (int)st.st_size)); + } + return TDB_ERRCODE(TDB_ERR_IO, -1); + } + + /* Unmap, update size, remap */ + if (tdb_munmap(tdb) == -1) + return TDB_ERRCODE(TDB_ERR_IO, -1); + tdb->map_size = st.st_size; + tdb_mmap(tdb); + return 0; +} + +/* write a lump of data at a specified offset */ +static int tdb_write(TDB_CONTEXT *tdb, tdb_off off, const void *buf, tdb_len len) +{ + if (tdb_oob(tdb, off + len, 0) != 0) + return -1; + + if (tdb->map_ptr) + memcpy(off + (char *)tdb->map_ptr, buf, len); +#ifdef HAVE_PWRITE + else if (pwrite(tdb->fd, buf, len, off) != (ssize_t)len) { +#else + else if (lseek(tdb->fd, off, SEEK_SET) != off + || write(tdb->fd, buf, len) != (ssize_t)len) { +#endif + TDB_LOG((tdb, 0,"tdb_write failed at %d len=%d (%s)\n", + off, len, strerror(errno))); + return TDB_ERRCODE(TDB_ERR_IO, -1); + } + return 0; +} + +/* read a lump of data at a specified offset, maybe convert */ +static int tdb_read(TDB_CONTEXT *tdb,tdb_off off,void *buf,tdb_len len,int cv) +{ + if (tdb_oob(tdb, off + len, 0) != 0) + return -1; + + if (tdb->map_ptr) + memcpy(buf, off + (char *)tdb->map_ptr, len); +#ifdef HAVE_PREAD + else if (pread(tdb->fd, buf, len, off) != (ssize_t)len) { +#else + else if (lseek(tdb->fd, off, SEEK_SET) != off + || read(tdb->fd, buf, len) != (ssize_t)len) { +#endif + TDB_LOG((tdb, 0,"tdb_read failed at %d len=%d (%s)\n", + off, len, strerror(errno))); + return TDB_ERRCODE(TDB_ERR_IO, -1); + } + if (cv) + convert(buf, len); + return 0; +} + +/* read a lump of data, allocating the space for it */ +static char *tdb_alloc_read(TDB_CONTEXT *tdb, tdb_off offset, tdb_len len) +{ + char *buf; + + if (!(buf = malloc(len))) { + TDB_LOG((tdb, 0,"tdb_alloc_read malloc failed len=%d (%s)\n", + len, strerror(errno))); + return TDB_ERRCODE(TDB_ERR_OOM, buf); + } + if (tdb_read(tdb, offset, buf, len, 0) == -1) { + SAFE_FREE(buf); + return NULL; + } + return buf; +} + +/* read/write a tdb_off */ +static int ofs_read(TDB_CONTEXT *tdb, tdb_off offset, tdb_off *d) +{ + return tdb_read(tdb, offset, (char*)d, sizeof(*d), DOCONV()); +} +static int ofs_write(TDB_CONTEXT *tdb, tdb_off offset, tdb_off *d) +{ + tdb_off off = *d; + return tdb_write(tdb, offset, CONVERT(off), sizeof(*d)); +} + +/* read/write a record */ +static int rec_read(TDB_CONTEXT *tdb, tdb_off offset, struct list_struct *rec) +{ + if (tdb_read(tdb, offset, rec, sizeof(*rec),DOCONV()) == -1) + return -1; + if (TDB_BAD_MAGIC(rec)) { + TDB_LOG((tdb, 0,"rec_read bad magic 0x%x at offset=%d\n", rec->magic, offset)); + return TDB_ERRCODE(TDB_ERR_CORRUPT, -1); + } + return tdb_oob(tdb, rec->next+sizeof(*rec), 0); +} +static int rec_write(TDB_CONTEXT *tdb, tdb_off offset, struct list_struct *rec) +{ + struct list_struct r = *rec; + return tdb_write(tdb, offset, CONVERT(r), sizeof(r)); +} + +/* read a freelist record and check for simple errors */ +static int rec_free_read(TDB_CONTEXT *tdb, tdb_off off, struct list_struct *rec) +{ + if (tdb_read(tdb, off, rec, sizeof(*rec),DOCONV()) == -1) + return -1; + + if (rec->magic == TDB_MAGIC) { + /* this happens when a app is showdown while deleting a record - we should + not completely fail when this happens */ + TDB_LOG((tdb, 0,"rec_free_read non-free magic at offset=%d - fixing\n", + rec->magic, off)); + rec->magic = TDB_FREE_MAGIC; + tdb_write(tdb, off, rec, sizeof(*rec)); + } + + if (rec->magic != TDB_FREE_MAGIC) { + TDB_LOG((tdb, 0,"rec_free_read bad magic 0x%x at offset=%d\n", + rec->magic, off)); + return TDB_ERRCODE(TDB_ERR_CORRUPT, -1); + } + if (tdb_oob(tdb, rec->next+sizeof(*rec), 0) != 0) + return -1; + return 0; +} + +/* update a record tailer (must hold allocation lock) */ +static int update_tailer(TDB_CONTEXT *tdb, tdb_off offset, + const struct list_struct *rec) +{ + tdb_off totalsize; + + /* Offset of tailer from record header */ + totalsize = sizeof(*rec) + rec->rec_len; + return ofs_write(tdb, offset + totalsize - sizeof(tdb_off), + &totalsize); +} + +static tdb_off tdb_dump_record(TDB_CONTEXT *tdb, tdb_off offset) +{ + struct list_struct rec; + tdb_off tailer_ofs, tailer; + + if (tdb_read(tdb, offset, (char *)&rec, sizeof(rec), DOCONV()) == -1) { + printf("ERROR: failed to read record at %u\n", offset); + return 0; + } + + printf(" rec: offset=%u next=%d rec_len=%d key_len=%d data_len=%d full_hash=0x%x magic=0x%x\n", + offset, rec.next, rec.rec_len, rec.key_len, rec.data_len, rec.full_hash, rec.magic); + + tailer_ofs = offset + sizeof(rec) + rec.rec_len - sizeof(tdb_off); + if (ofs_read(tdb, tailer_ofs, &tailer) == -1) { + printf("ERROR: failed to read tailer at %u\n", tailer_ofs); + return rec.next; + } + + if (tailer != rec.rec_len + sizeof(rec)) { + printf("ERROR: tailer does not match record! tailer=%u totalsize=%u\n", + (unsigned)tailer, (unsigned)(rec.rec_len + sizeof(rec))); + } + return rec.next; +} + +static int tdb_dump_chain(TDB_CONTEXT *tdb, int i) +{ + tdb_off rec_ptr, top; + + top = TDB_HASH_TOP(i); + + if (tdb_lock(tdb, i, F_WRLCK) != 0) + return -1; + + if (ofs_read(tdb, top, &rec_ptr) == -1) + return tdb_unlock(tdb, i, F_WRLCK); + + if (rec_ptr) + printf("hash=%d\n", i); + + while (rec_ptr) { + rec_ptr = tdb_dump_record(tdb, rec_ptr); + } + + return tdb_unlock(tdb, i, F_WRLCK); +} + +void tdb_dump_all(TDB_CONTEXT *tdb) +{ + int i; + for (i=0;iheader.hash_size;i++) { + tdb_dump_chain(tdb, i); + } + printf("freelist:\n"); + tdb_dump_chain(tdb, -1); +} + +int tdb_printfreelist(TDB_CONTEXT *tdb) +{ + int ret; + long total_free = 0; + tdb_off offset, rec_ptr; + struct list_struct rec; + + if ((ret = tdb_lock(tdb, -1, F_WRLCK)) != 0) + return ret; + + offset = FREELIST_TOP; + + /* read in the freelist top */ + if (ofs_read(tdb, offset, &rec_ptr) == -1) { + return 0; + } + + printf("freelist top=[0x%08x]\n", rec_ptr ); + while (rec_ptr) { + if (tdb_read(tdb, rec_ptr, (char *)&rec, sizeof(rec), DOCONV()) == -1) { + return -1; + } + + if (rec.magic != TDB_FREE_MAGIC) { + printf("bad magic 0x%08x in free list\n", rec.magic); + return -1; + } + + printf("entry offset=[0x%08x], rec.rec_len = [0x%08x (%d)]\n", rec.next, rec.rec_len, rec.rec_len ); + total_free += rec.rec_len; + + /* move to the next record */ + rec_ptr = rec.next; + } + printf("total rec_len = [0x%08x (%d)]\n", (int)total_free, + (int)total_free); + + return tdb_unlock(tdb, -1, F_WRLCK); +} + +/* Remove an element from the freelist. Must have alloc lock. */ +static int remove_from_freelist(TDB_CONTEXT *tdb, tdb_off off, tdb_off next) +{ + tdb_off last_ptr, i; + + /* read in the freelist top */ + last_ptr = FREELIST_TOP; + while (ofs_read(tdb, last_ptr, &i) != -1 && i != 0) { + if (i == off) { + /* We've found it! */ + return ofs_write(tdb, last_ptr, &next); + } + /* Follow chain (next offset is at start of record) */ + last_ptr = i; + } + TDB_LOG((tdb, 0,"remove_from_freelist: not on list at off=%d\n", off)); + return TDB_ERRCODE(TDB_ERR_CORRUPT, -1); +} + +/* Add an element into the freelist. Merge adjacent records if + neccessary. */ +static int tdb_free(TDB_CONTEXT *tdb, tdb_off offset, struct list_struct *rec) +{ + tdb_off right, left; + + /* Allocation and tailer lock */ + if (tdb_lock(tdb, -1, F_WRLCK) != 0) + return -1; + + /* set an initial tailer, so if we fail we don't leave a bogus record */ + if (update_tailer(tdb, offset, rec) != 0) { + TDB_LOG((tdb, 0, "tdb_free: upfate_tailer failed!\n")); + goto fail; + } + + /* Look right first (I'm an Australian, dammit) */ + right = offset + sizeof(*rec) + rec->rec_len; + if (right + sizeof(*rec) <= tdb->map_size) { + struct list_struct r; + + if (tdb_read(tdb, right, &r, sizeof(r), DOCONV()) == -1) { + TDB_LOG((tdb, 0, "tdb_free: right read failed at %u\n", right)); + goto left; + } + + /* If it's free, expand to include it. */ + if (r.magic == TDB_FREE_MAGIC) { + if (remove_from_freelist(tdb, right, r.next) == -1) { + TDB_LOG((tdb, 0, "tdb_free: right free failed at %u\n", right)); + goto left; + } + rec->rec_len += sizeof(r) + r.rec_len; + } + } + +left: + /* Look left */ + left = offset - sizeof(tdb_off); + if (left > TDB_HASH_TOP(tdb->header.hash_size-1)) { + struct list_struct l; + tdb_off leftsize; + + /* Read in tailer and jump back to header */ + if (ofs_read(tdb, left, &leftsize) == -1) { + TDB_LOG((tdb, 0, "tdb_free: left offset read failed at %u\n", left)); + goto update; + } + left = offset - leftsize; + + /* Now read in record */ + if (tdb_read(tdb, left, &l, sizeof(l), DOCONV()) == -1) { + TDB_LOG((tdb, 0, "tdb_free: left read failed at %u (%u)\n", left, leftsize)); + goto update; + } + + /* If it's free, expand to include it. */ + if (l.magic == TDB_FREE_MAGIC) { + if (remove_from_freelist(tdb, left, l.next) == -1) { + TDB_LOG((tdb, 0, "tdb_free: left free failed at %u\n", left)); + goto update; + } else { + offset = left; + rec->rec_len += leftsize; + } + } + } + +update: + if (update_tailer(tdb, offset, rec) == -1) { + TDB_LOG((tdb, 0, "tdb_free: update_tailer failed at %u\n", offset)); + goto fail; + } + + /* Now, prepend to free list */ + rec->magic = TDB_FREE_MAGIC; + + if (ofs_read(tdb, FREELIST_TOP, &rec->next) == -1 || + rec_write(tdb, offset, rec) == -1 || + ofs_write(tdb, FREELIST_TOP, &offset) == -1) { + TDB_LOG((tdb, 0, "tdb_free record write failed at offset=%d\n", offset)); + goto fail; + } + + /* And we're done. */ + tdb_unlock(tdb, -1, F_WRLCK); + return 0; + + fail: + tdb_unlock(tdb, -1, F_WRLCK); + return -1; +} + + +/* expand a file. we prefer to use ftruncate, as that is what posix + says to use for mmap expansion */ +static int expand_file(TDB_CONTEXT *tdb, tdb_off size, tdb_off addition) +{ + char buf[1024]; +#if HAVE_FTRUNCATE_EXTEND + if (ftruncate(tdb->fd, size+addition) != 0) { + TDB_LOG((tdb, 0, "expand_file ftruncate to %d failed (%s)\n", + size+addition, strerror(errno))); + return -1; + } +#else + char b = 0; + +#ifdef HAVE_PWRITE + if (pwrite(tdb->fd, &b, 1, (size+addition) - 1) != 1) { +#else + if (lseek(tdb->fd, (size+addition) - 1, SEEK_SET) != (size+addition) - 1 || + write(tdb->fd, &b, 1) != 1) { +#endif + TDB_LOG((tdb, 0, "expand_file to %d failed (%s)\n", + size+addition, strerror(errno))); + return -1; + } +#endif + + /* now fill the file with something. This ensures that the file isn't sparse, which would be + very bad if we ran out of disk. This must be done with write, not via mmap */ + memset(buf, 0x42, sizeof(buf)); + while (addition) { + int n = addition>sizeof(buf)?sizeof(buf):addition; +#ifdef HAVE_PWRITE + int ret = pwrite(tdb->fd, buf, n, size); +#else + int ret; + if (lseek(tdb->fd, size, SEEK_SET) != size) + return -1; + ret = write(tdb->fd, buf, n); +#endif + if (ret != n) { + TDB_LOG((tdb, 0, "expand_file write of %d failed (%s)\n", + n, strerror(errno))); + return -1; + } + addition -= n; + size += n; + } + return 0; +} + + +/* expand the database at least size bytes by expanding the underlying + file and doing the mmap again if necessary */ +static int tdb_expand(TDB_CONTEXT *tdb, tdb_off size) +{ + struct list_struct rec; + tdb_off offset; + + if (tdb_lock(tdb, -1, F_WRLCK) == -1) { + TDB_LOG((tdb, 0, "lock failed in tdb_expand\n")); + return -1; + } + + /* must know about any previous expansions by another process */ + tdb_oob(tdb, tdb->map_size + 1, 1); + + /* always make room for at least 10 more records, and round + the database up to a multiple of TDB_PAGE_SIZE */ + size = TDB_ALIGN(tdb->map_size + size*10, TDB_PAGE_SIZE) - tdb->map_size; + + if (!(tdb->flags & TDB_INTERNAL)) + tdb_munmap(tdb); + + /* + * We must ensure the file is unmapped before doing this + * to ensure consistency with systems like OpenBSD where + * writes and mmaps are not consistent. + */ + + /* expand the file itself */ + if (!(tdb->flags & TDB_INTERNAL)) { + if (expand_file(tdb, tdb->map_size, size) != 0) + goto fail; + } + + tdb->map_size += size; + + if (tdb->flags & TDB_INTERNAL) + tdb->map_ptr = realloc(tdb->map_ptr, tdb->map_size); + else { + /* + * We must ensure the file is remapped before adding the space + * to ensure consistency with systems like OpenBSD where + * writes and mmaps are not consistent. + */ + + /* We're ok if the mmap fails as we'll fallback to read/write */ + tdb_mmap(tdb); + } + + /* form a new freelist record */ + memset(&rec,'\0',sizeof(rec)); + rec.rec_len = size - sizeof(rec); + + /* link it into the free list */ + offset = tdb->map_size - size; + if (tdb_free(tdb, offset, &rec) == -1) + goto fail; + + tdb_unlock(tdb, -1, F_WRLCK); + return 0; + fail: + tdb_unlock(tdb, -1, F_WRLCK); + return -1; +} + +/* allocate some space from the free list. The offset returned points + to a unconnected list_struct within the database with room for at + least length bytes of total data + + 0 is returned if the space could not be allocated + */ +static tdb_off tdb_allocate(TDB_CONTEXT *tdb, tdb_len length, + struct list_struct *rec) +{ + tdb_off rec_ptr, last_ptr, newrec_ptr; + struct list_struct newrec; + + if (tdb_lock(tdb, -1, F_WRLCK) == -1) + return 0; + + /* Extra bytes required for tailer */ + length += sizeof(tdb_off); + + again: + last_ptr = FREELIST_TOP; + + /* read in the freelist top */ + if (ofs_read(tdb, FREELIST_TOP, &rec_ptr) == -1) + goto fail; + + /* keep looking until we find a freelist record big enough */ + while (rec_ptr) { + if (rec_free_read(tdb, rec_ptr, rec) == -1) + goto fail; + + if (rec->rec_len >= length) { + /* found it - now possibly split it up */ + if (rec->rec_len > length + MIN_REC_SIZE) { + /* Length of left piece */ + length = TDB_ALIGN(length, TDB_ALIGNMENT); + + /* Right piece to go on free list */ + newrec.rec_len = rec->rec_len + - (sizeof(*rec) + length); + newrec_ptr = rec_ptr + sizeof(*rec) + length; + + /* And left record is shortened */ + rec->rec_len = length; + } else + newrec_ptr = 0; + + /* Remove allocated record from the free list */ + if (ofs_write(tdb, last_ptr, &rec->next) == -1) + goto fail; + + /* Update header: do this before we drop alloc + lock, otherwise tdb_free() might try to + merge with us, thinking we're free. + (Thanks Jeremy Allison). */ + rec->magic = TDB_MAGIC; + if (rec_write(tdb, rec_ptr, rec) == -1) + goto fail; + + /* Did we create new block? */ + if (newrec_ptr) { + /* Update allocated record tailer (we + shortened it). */ + if (update_tailer(tdb, rec_ptr, rec) == -1) + goto fail; + + /* Free new record */ + if (tdb_free(tdb, newrec_ptr, &newrec) == -1) + goto fail; + } + + /* all done - return the new record offset */ + tdb_unlock(tdb, -1, F_WRLCK); + return rec_ptr; + } + /* move to the next record */ + last_ptr = rec_ptr; + rec_ptr = rec->next; + } + /* we didn't find enough space. See if we can expand the + database and if we can then try again */ + if (tdb_expand(tdb, length + sizeof(*rec)) == 0) + goto again; + fail: + tdb_unlock(tdb, -1, F_WRLCK); + return 0; +} + +/* initialise a new database with a specified hash size */ +static int tdb_new_database(TDB_CONTEXT *tdb, int hash_size) +{ + struct tdb_header *newdb; + int size, ret = -1; + + /* We make it up in memory, then write it out if not internal */ + size = sizeof(struct tdb_header) + (hash_size+1)*sizeof(tdb_off); + if (!(newdb = calloc(size, 1))) + return TDB_ERRCODE(TDB_ERR_OOM, -1); + + /* Fill in the header */ + newdb->version = TDB_VERSION; + newdb->hash_size = hash_size; +#ifdef USE_SPINLOCKS + newdb->rwlocks = size; +#endif + if (tdb->flags & TDB_INTERNAL) { + tdb->map_size = size; + tdb->map_ptr = (char *)newdb; + memcpy(&tdb->header, newdb, sizeof(tdb->header)); + /* Convert the `ondisk' version if asked. */ + CONVERT(*newdb); + return 0; + } + if (lseek(tdb->fd, 0, SEEK_SET) == -1) + goto fail; + + if (ftruncate(tdb->fd, 0) == -1) + goto fail; + + /* This creates an endian-converted header, as if read from disk */ + CONVERT(*newdb); + memcpy(&tdb->header, newdb, sizeof(tdb->header)); + /* Don't endian-convert the magic food! */ + memcpy(newdb->magic_food, TDB_MAGIC_FOOD, strlen(TDB_MAGIC_FOOD)+1); + if (write(tdb->fd, newdb, size) != size) + ret = -1; + else + ret = tdb_create_rwlocks(tdb->fd, hash_size); + + fail: + SAFE_FREE(newdb); + return ret; +} + +/* Returns 0 on fail. On success, return offset of record, and fills + in rec */ +static tdb_off tdb_find(TDB_CONTEXT *tdb, TDB_DATA key, u32 hash, + struct list_struct *r) +{ + tdb_off rec_ptr; + + /* read in the hash top */ + if (ofs_read(tdb, TDB_HASH_TOP(hash), &rec_ptr) == -1) + return 0; + + /* keep looking until we find the right record */ + while (rec_ptr) { + if (rec_read(tdb, rec_ptr, r) == -1) + return 0; + + if (!TDB_DEAD(r) && hash==r->full_hash && key.dsize==r->key_len) { + char *k; + /* a very likely hit - read the key */ + k = tdb_alloc_read(tdb, rec_ptr + sizeof(*r), + r->key_len); + if (!k) + return 0; + + if (memcmp(key.dptr, k, key.dsize) == 0) { + SAFE_FREE(k); + return rec_ptr; + } + SAFE_FREE(k); + } + rec_ptr = r->next; + } + return TDB_ERRCODE(TDB_ERR_NOEXIST, 0); +} + +/* If they do lockkeys, check that this hash is one they locked */ +static int tdb_keylocked(TDB_CONTEXT *tdb, u32 hash) +{ + u32 i; + if (!tdb->lockedkeys) + return 1; + for (i = 0; i < tdb->lockedkeys[0]; i++) + if (tdb->lockedkeys[i+1] == hash) + return 1; + return TDB_ERRCODE(TDB_ERR_NOLOCK, 0); +} + +/* As tdb_find, but if you succeed, keep the lock */ +static tdb_off tdb_find_lock(TDB_CONTEXT *tdb, TDB_DATA key, int locktype, + struct list_struct *rec) +{ + u32 hash, rec_ptr; + + hash = tdb_hash(&key); + if (!tdb_keylocked(tdb, hash)) + return 0; + if (tdb_lock(tdb, BUCKET(hash), locktype) == -1) + return 0; + if (!(rec_ptr = tdb_find(tdb, key, hash, rec))) + tdb_unlock(tdb, BUCKET(hash), locktype); + return rec_ptr; +} + +enum TDB_ERROR tdb_error(TDB_CONTEXT *tdb) +{ + return tdb->ecode; +} + +static struct tdb_errname { + enum TDB_ERROR ecode; const char *estring; +} emap[] = { {TDB_SUCCESS, "Success"}, + {TDB_ERR_CORRUPT, "Corrupt database"}, + {TDB_ERR_IO, "IO Error"}, + {TDB_ERR_LOCK, "Locking error"}, + {TDB_ERR_OOM, "Out of memory"}, + {TDB_ERR_EXISTS, "Record exists"}, + {TDB_ERR_NOLOCK, "Lock exists on other keys"}, + {TDB_ERR_NOEXIST, "Record does not exist"} }; + +/* Error string for the last tdb error */ +const char *tdb_errorstr(TDB_CONTEXT *tdb) +{ + u32 i; + for (i = 0; i < sizeof(emap) / sizeof(struct tdb_errname); i++) + if (tdb->ecode == emap[i].ecode) + return emap[i].estring; + return "Invalid error code"; +} + +/* update an entry in place - this only works if the new data size + is <= the old data size and the key exists. + on failure return -1 +*/ +static int tdb_update(TDB_CONTEXT *tdb, TDB_DATA key, TDB_DATA dbuf) +{ + struct list_struct rec; + tdb_off rec_ptr; + int ret = -1; + + /* find entry */ + if (!(rec_ptr = tdb_find_lock(tdb, key, F_WRLCK, &rec))) + return -1; + + /* must be long enough key, data and tailer */ + if (rec.rec_len < key.dsize + dbuf.dsize + sizeof(tdb_off)) { + tdb->ecode = TDB_SUCCESS; /* Not really an error */ + goto out; + } + + if (tdb_write(tdb, rec_ptr + sizeof(rec) + rec.key_len, + dbuf.dptr, dbuf.dsize) == -1) + goto out; + + if (dbuf.dsize != rec.data_len) { + /* update size */ + rec.data_len = dbuf.dsize; + ret = rec_write(tdb, rec_ptr, &rec); + } else + ret = 0; + out: + tdb_unlock(tdb, BUCKET(rec.full_hash), F_WRLCK); + return ret; +} + +/* find an entry in the database given a key */ +TDB_DATA tdb_fetch(TDB_CONTEXT *tdb, TDB_DATA key) +{ + tdb_off rec_ptr; + struct list_struct rec; + TDB_DATA ret; + + /* find which hash bucket it is in */ + if (!(rec_ptr = tdb_find_lock(tdb,key,F_RDLCK,&rec))) + return tdb_null; + + ret.dptr = tdb_alloc_read(tdb, rec_ptr + sizeof(rec) + rec.key_len, + rec.data_len); + ret.dsize = rec.data_len; + tdb_unlock(tdb, BUCKET(rec.full_hash), F_RDLCK); + return ret; +} + +/* check if an entry in the database exists + + note that 1 is returned if the key is found and 0 is returned if not found + this doesn't match the conventions in the rest of this module, but is + compatible with gdbm +*/ +int tdb_exists(TDB_CONTEXT *tdb, TDB_DATA key) +{ + struct list_struct rec; + + if (tdb_find_lock(tdb, key, F_RDLCK, &rec) == 0) + return 0; + tdb_unlock(tdb, BUCKET(rec.full_hash), F_RDLCK); + return 1; +} + +/* record lock stops delete underneath */ +static int lock_record(TDB_CONTEXT *tdb, tdb_off off) +{ + return off ? tdb_brlock(tdb, off, F_RDLCK, F_SETLKW, 0) : 0; +} +/* + Write locks override our own fcntl readlocks, so check it here. + Note this is meant to be F_SETLK, *not* F_SETLKW, as it's not + an error to fail to get the lock here. +*/ + +static int write_lock_record(TDB_CONTEXT *tdb, tdb_off off) +{ + struct tdb_traverse_lock *i; + for (i = &tdb->travlocks; i; i = i->next) + if (i->off == off) + return -1; + return tdb_brlock(tdb, off, F_WRLCK, F_SETLK, 1); +} + +/* + Note this is meant to be F_SETLK, *not* F_SETLKW, as it's not + an error to fail to get the lock here. +*/ + +static int write_unlock_record(TDB_CONTEXT *tdb, tdb_off off) +{ + return tdb_brlock(tdb, off, F_UNLCK, F_SETLK, 0); +} +/* fcntl locks don't stack: avoid unlocking someone else's */ +static int unlock_record(TDB_CONTEXT *tdb, tdb_off off) +{ + struct tdb_traverse_lock *i; + u32 count = 0; + + if (off == 0) + return 0; + for (i = &tdb->travlocks; i; i = i->next) + if (i->off == off) + count++; + return (count == 1 ? tdb_brlock(tdb, off, F_UNLCK, F_SETLKW, 0) : 0); +} + +/* actually delete an entry in the database given the offset */ +static int do_delete(TDB_CONTEXT *tdb, tdb_off rec_ptr, struct list_struct*rec) +{ + tdb_off last_ptr, i; + struct list_struct lastrec; + + if (tdb->read_only) return -1; + + if (write_lock_record(tdb, rec_ptr) == -1) { + /* Someone traversing here: mark it as dead */ + rec->magic = TDB_DEAD_MAGIC; + return rec_write(tdb, rec_ptr, rec); + } + if (write_unlock_record(tdb, rec_ptr) != 0) + return -1; + + /* find previous record in hash chain */ + if (ofs_read(tdb, TDB_HASH_TOP(rec->full_hash), &i) == -1) + return -1; + for (last_ptr = 0; i != rec_ptr; last_ptr = i, i = lastrec.next) + if (rec_read(tdb, i, &lastrec) == -1) + return -1; + + /* unlink it: next ptr is at start of record. */ + if (last_ptr == 0) + last_ptr = TDB_HASH_TOP(rec->full_hash); + if (ofs_write(tdb, last_ptr, &rec->next) == -1) + return -1; + + /* recover the space */ + if (tdb_free(tdb, rec_ptr, rec) == -1) + return -1; + return 0; +} + +/* Uses traverse lock: 0 = finish, -1 = error, other = record offset */ +static int tdb_next_lock(TDB_CONTEXT *tdb, struct tdb_traverse_lock *tlock, + struct list_struct *rec) +{ + int want_next = (tlock->off != 0); + + /* No traversal allows if you've called tdb_lockkeys() */ + if (tdb->lockedkeys) + return TDB_ERRCODE(TDB_ERR_NOLOCK, -1); + + /* Lock each chain from the start one. */ + for (; tlock->hash < tdb->header.hash_size; tlock->hash++) { + if (tdb_lock(tdb, tlock->hash, F_WRLCK) == -1) + return -1; + + /* No previous record? Start at top of chain. */ + if (!tlock->off) { + if (ofs_read(tdb, TDB_HASH_TOP(tlock->hash), + &tlock->off) == -1) + goto fail; + } else { + /* Otherwise unlock the previous record. */ + if (unlock_record(tdb, tlock->off) != 0) + goto fail; + } + + if (want_next) { + /* We have offset of old record: grab next */ + if (rec_read(tdb, tlock->off, rec) == -1) + goto fail; + tlock->off = rec->next; + } + + /* Iterate through chain */ + while( tlock->off) { + tdb_off current; + if (rec_read(tdb, tlock->off, rec) == -1) + goto fail; + if (!TDB_DEAD(rec)) { + /* Woohoo: we found one! */ + if (lock_record(tdb, tlock->off) != 0) + goto fail; + return tlock->off; + } + /* Try to clean dead ones from old traverses */ + current = tlock->off; + tlock->off = rec->next; + if (do_delete(tdb, current, rec) != 0) + goto fail; + } + tdb_unlock(tdb, tlock->hash, F_WRLCK); + want_next = 0; + } + /* We finished iteration without finding anything */ + return TDB_ERRCODE(TDB_SUCCESS, 0); + + fail: + tlock->off = 0; + if (tdb_unlock(tdb, tlock->hash, F_WRLCK) != 0) + TDB_LOG((tdb, 0, "tdb_next_lock: On error unlock failed!\n")); + return -1; +} + +/* traverse the entire database - calling fn(tdb, key, data) on each element. + return -1 on error or the record count traversed + if fn is NULL then it is not called + a non-zero return value from fn() indicates that the traversal should stop + */ +int tdb_traverse(TDB_CONTEXT *tdb, tdb_traverse_func fn, void *state) +{ + TDB_DATA key, dbuf; + struct list_struct rec; + struct tdb_traverse_lock tl = { NULL, 0, 0 }; + int ret, count = 0; + + /* This was in the initializaton, above, but the IRIX compiler + * did not like it. crh + */ + tl.next = tdb->travlocks.next; + + /* fcntl locks don't stack: beware traverse inside traverse */ + tdb->travlocks.next = &tl; + + /* tdb_next_lock places locks on the record returned, and its chain */ + while ((ret = tdb_next_lock(tdb, &tl, &rec)) > 0) { + count++; + /* now read the full record */ + key.dptr = tdb_alloc_read(tdb, tl.off + sizeof(rec), + rec.key_len + rec.data_len); + if (!key.dptr) { + ret = -1; + if (tdb_unlock(tdb, tl.hash, F_WRLCK) != 0) + goto out; + if (unlock_record(tdb, tl.off) != 0) + TDB_LOG((tdb, 0, "tdb_traverse: key.dptr == NULL and unlock_record failed!\n")); + goto out; + } + key.dsize = rec.key_len; + dbuf.dptr = key.dptr + rec.key_len; + dbuf.dsize = rec.data_len; + + /* Drop chain lock, call out */ + if (tdb_unlock(tdb, tl.hash, F_WRLCK) != 0) { + ret = -1; + goto out; + } + if (fn && fn(tdb, key, dbuf, state)) { + /* They want us to terminate traversal */ + ret = count; + if (unlock_record(tdb, tl.off) != 0) { + TDB_LOG((tdb, 0, "tdb_traverse: unlock_record failed!\n"));; + ret = -1; + } + tdb->travlocks.next = tl.next; + SAFE_FREE(key.dptr); + return count; + } + SAFE_FREE(key.dptr); + } +out: + tdb->travlocks.next = tl.next; + if (ret < 0) + return -1; + else + return count; +} + +/* find the first entry in the database and return its key */ +TDB_DATA tdb_firstkey(TDB_CONTEXT *tdb) +{ + TDB_DATA key; + struct list_struct rec; + + /* release any old lock */ + if (unlock_record(tdb, tdb->travlocks.off) != 0) + return tdb_null; + tdb->travlocks.off = tdb->travlocks.hash = 0; + + if (tdb_next_lock(tdb, &tdb->travlocks, &rec) <= 0) + return tdb_null; + /* now read the key */ + key.dsize = rec.key_len; + key.dptr =tdb_alloc_read(tdb,tdb->travlocks.off+sizeof(rec),key.dsize); + if (tdb_unlock(tdb, BUCKET(tdb->travlocks.hash), F_WRLCK) != 0) + TDB_LOG((tdb, 0, "tdb_firstkey: error occurred while tdb_unlocking!\n")); + return key; +} + +/* find the next entry in the database, returning its key */ +TDB_DATA tdb_nextkey(TDB_CONTEXT *tdb, TDB_DATA oldkey) +{ + u32 oldhash; + TDB_DATA key = tdb_null; + struct list_struct rec; + char *k = NULL; + + /* Is locked key the old key? If so, traverse will be reliable. */ + if (tdb->travlocks.off) { + if (tdb_lock(tdb,tdb->travlocks.hash,F_WRLCK)) + return tdb_null; + if (rec_read(tdb, tdb->travlocks.off, &rec) == -1 + || !(k = tdb_alloc_read(tdb,tdb->travlocks.off+sizeof(rec), + rec.key_len)) + || memcmp(k, oldkey.dptr, oldkey.dsize) != 0) { + /* No, it wasn't: unlock it and start from scratch */ + if (unlock_record(tdb, tdb->travlocks.off) != 0) + return tdb_null; + if (tdb_unlock(tdb, tdb->travlocks.hash, F_WRLCK) != 0) + return tdb_null; + tdb->travlocks.off = 0; + } + + SAFE_FREE(k); + } + + if (!tdb->travlocks.off) { + /* No previous element: do normal find, and lock record */ + tdb->travlocks.off = tdb_find_lock(tdb, oldkey, F_WRLCK, &rec); + if (!tdb->travlocks.off) + return tdb_null; + tdb->travlocks.hash = BUCKET(rec.full_hash); + if (lock_record(tdb, tdb->travlocks.off) != 0) { + TDB_LOG((tdb, 0, "tdb_nextkey: lock_record failed (%s)!\n", strerror(errno))); + return tdb_null; + } + } + oldhash = tdb->travlocks.hash; + + /* Grab next record: locks chain and returned record, + unlocks old record */ + if (tdb_next_lock(tdb, &tdb->travlocks, &rec) > 0) { + key.dsize = rec.key_len; + key.dptr = tdb_alloc_read(tdb, tdb->travlocks.off+sizeof(rec), + key.dsize); + /* Unlock the chain of this new record */ + if (tdb_unlock(tdb, tdb->travlocks.hash, F_WRLCK) != 0) + TDB_LOG((tdb, 0, "tdb_nextkey: WARNING tdb_unlock failed!\n")); + } + /* Unlock the chain of old record */ + if (tdb_unlock(tdb, BUCKET(oldhash), F_WRLCK) != 0) + TDB_LOG((tdb, 0, "tdb_nextkey: WARNING tdb_unlock failed!\n")); + return key; +} + +/* delete an entry in the database given a key */ +int tdb_delete(TDB_CONTEXT *tdb, TDB_DATA key) +{ + tdb_off rec_ptr; + struct list_struct rec; + int ret; + + if (!(rec_ptr = tdb_find_lock(tdb, key, F_WRLCK, &rec))) + return -1; + ret = do_delete(tdb, rec_ptr, &rec); + if (tdb_unlock(tdb, BUCKET(rec.full_hash), F_WRLCK) != 0) + TDB_LOG((tdb, 0, "tdb_delete: WARNING tdb_unlock failed!\n")); + return ret; +} + +/* store an element in the database, replacing any existing element + with the same key + + return 0 on success, -1 on failure +*/ +int tdb_store(TDB_CONTEXT *tdb, TDB_DATA key, TDB_DATA dbuf, int flag) +{ + struct list_struct rec; + u32 hash; + tdb_off rec_ptr; + char *p = NULL; + int ret = 0; + + /* find which hash bucket it is in */ + hash = tdb_hash(&key); + if (!tdb_keylocked(tdb, hash)) + return -1; + if (tdb_lock(tdb, BUCKET(hash), F_WRLCK) == -1) + return -1; + + /* check for it existing, on insert. */ + if (flag == TDB_INSERT) { + if (tdb_exists(tdb, key)) { + tdb->ecode = TDB_ERR_EXISTS; + goto fail; + } + } else { + /* first try in-place update, on modify or replace. */ + if (tdb_update(tdb, key, dbuf) == 0) + goto out; + if (flag == TDB_MODIFY && tdb->ecode == TDB_ERR_NOEXIST) + goto fail; + } + /* reset the error code potentially set by the tdb_update() */ + tdb->ecode = TDB_SUCCESS; + + /* delete any existing record - if it doesn't exist we don't + care. Doing this first reduces fragmentation, and avoids + coalescing with `allocated' block before it's updated. */ + if (flag != TDB_INSERT) + tdb_delete(tdb, key); + + /* Copy key+value *before* allocating free space in case malloc + fails and we are left with a dead spot in the tdb. */ + + if (!(p = (char *)malloc(key.dsize + dbuf.dsize))) { + tdb->ecode = TDB_ERR_OOM; + goto fail; + } + + memcpy(p, key.dptr, key.dsize); + memcpy(p+key.dsize, dbuf.dptr, dbuf.dsize); + + /* now we're into insert / modify / replace of a record which + * we know could not be optimised by an in-place store (for + * various reasons). */ + if (!(rec_ptr = tdb_allocate(tdb, key.dsize + dbuf.dsize, &rec))) + goto fail; + + /* Read hash top into next ptr */ + if (ofs_read(tdb, TDB_HASH_TOP(hash), &rec.next) == -1) + goto fail; + + rec.key_len = key.dsize; + rec.data_len = dbuf.dsize; + rec.full_hash = hash; + rec.magic = TDB_MAGIC; + + /* write out and point the top of the hash chain at it */ + if (rec_write(tdb, rec_ptr, &rec) == -1 + || tdb_write(tdb, rec_ptr+sizeof(rec), p, key.dsize+dbuf.dsize)==-1 + || ofs_write(tdb, TDB_HASH_TOP(hash), &rec_ptr) == -1) { + /* Need to tdb_unallocate() here */ + goto fail; + } + out: + SAFE_FREE(p); + tdb_unlock(tdb, BUCKET(hash), F_WRLCK); + return ret; +fail: + ret = -1; + goto out; +} + +static int tdb_already_open(dev_t device, + ino_t ino) +{ + TDB_CONTEXT *i; + + for (i = tdbs; i; i = i->next) { + if (i->device == device && i->inode == ino) { + return 1; + } + } + + return 0; +} + +/* open the database, creating it if necessary + + The open_flags and mode are passed straight to the open call on the + database file. A flags value of O_WRONLY is invalid. The hash size + is advisory, use zero for a default value. + + Return is NULL on error, in which case errno is also set. Don't + try to call tdb_error or tdb_errname, just do strerror(errno). + + @param name may be NULL for internal databases. */ +TDB_CONTEXT *tdb_open(const char *name, int hash_size, int tdb_flags, + int open_flags, mode_t mode) +{ + return tdb_open_ex(name, hash_size, tdb_flags, open_flags, mode, NULL); +} + + +TDB_CONTEXT *tdb_open_ex(const char *name, int hash_size, int tdb_flags, + int open_flags, mode_t mode, + tdb_log_func log_fn) +{ + TDB_CONTEXT *tdb; + struct stat st; + int rev = 0, locked; + unsigned char *vp; + u32 vertest; + + if (!(tdb = calloc(1, sizeof *tdb))) { + /* Can't log this */ + errno = ENOMEM; + goto fail; + } + tdb->fd = -1; + tdb->name = NULL; + tdb->map_ptr = NULL; + tdb->lockedkeys = NULL; + tdb->flags = tdb_flags; + tdb->open_flags = open_flags; + tdb->log_fn = log_fn; + + if ((open_flags & O_ACCMODE) == O_WRONLY) { + TDB_LOG((tdb, 0, "tdb_open_ex: can't open tdb %s write-only\n", + name)); + errno = EINVAL; + goto fail; + } + + if (hash_size == 0) + hash_size = DEFAULT_HASH_SIZE; + if ((open_flags & O_ACCMODE) == O_RDONLY) { + tdb->read_only = 1; + /* read only databases don't do locking or clear if first */ + tdb->flags |= TDB_NOLOCK; + tdb->flags &= ~TDB_CLEAR_IF_FIRST; + } + + /* internal databases don't mmap or lock, and start off cleared */ + if (tdb->flags & TDB_INTERNAL) { + tdb->flags |= (TDB_NOLOCK | TDB_NOMMAP); + tdb->flags &= ~TDB_CLEAR_IF_FIRST; + if (tdb_new_database(tdb, hash_size) != 0) { + TDB_LOG((tdb, 0, "tdb_open_ex: tdb_new_database failed!")); + goto fail; + } + goto internal; + } + + if ((tdb->fd = open(name, open_flags, mode)) == -1) { + TDB_LOG((tdb, 5, "tdb_open_ex: could not open file %s: %s\n", + name, strerror(errno))); + goto fail; /* errno set by open(2) */ + } + + /* ensure there is only one process initialising at once */ + if (tdb_brlock(tdb, GLOBAL_LOCK, F_WRLCK, F_SETLKW, 0) == -1) { + TDB_LOG((tdb, 0, "tdb_open_ex: failed to get global lock on %s: %s\n", + name, strerror(errno))); + goto fail; /* errno set by tdb_brlock */ + } + + /* we need to zero database if we are the only one with it open */ + if ((locked = (tdb_brlock(tdb, ACTIVE_LOCK, F_WRLCK, F_SETLK, 0) == 0)) + && (tdb_flags & TDB_CLEAR_IF_FIRST)) { + open_flags |= O_CREAT; + if (ftruncate(tdb->fd, 0) == -1) { + TDB_LOG((tdb, 0, "tdb_open_ex: " + "failed to truncate %s: %s\n", + name, strerror(errno))); + goto fail; /* errno set by ftruncate */ + } + } + + if (read(tdb->fd, &tdb->header, sizeof(tdb->header)) != sizeof(tdb->header) + || strcmp(tdb->header.magic_food, TDB_MAGIC_FOOD) != 0 + || (tdb->header.version != TDB_VERSION + && !(rev = (tdb->header.version==TDB_BYTEREV(TDB_VERSION))))) { + /* its not a valid database - possibly initialise it */ + if (!(open_flags & O_CREAT) || tdb_new_database(tdb, hash_size) == -1) { + errno = EIO; /* ie bad format or something */ + goto fail; + } + rev = (tdb->flags & TDB_CONVERT); + } + vp = (unsigned char *)&tdb->header.version; + vertest = (((u32)vp[0]) << 24) | (((u32)vp[1]) << 16) | + (((u32)vp[2]) << 8) | (u32)vp[3]; + tdb->flags |= (vertest==TDB_VERSION) ? TDB_BIGENDIAN : 0; + if (!rev) + tdb->flags &= ~TDB_CONVERT; + else { + tdb->flags |= TDB_CONVERT; + convert(&tdb->header, sizeof(tdb->header)); + } + if (fstat(tdb->fd, &st) == -1) + goto fail; + + /* Is it already in the open list? If so, fail. */ + if (tdb_already_open(st.st_dev, st.st_ino)) { + TDB_LOG((tdb, 2, "tdb_open_ex: " + "%s (%d,%d) is already open in this process\n", + name, st.st_dev, st.st_ino)); + errno = EBUSY; + goto fail; + } + + if (!(tdb->name = (char *)strdup(name))) { + errno = ENOMEM; + goto fail; + } + + tdb->map_size = st.st_size; + tdb->device = st.st_dev; + tdb->inode = st.st_ino; + tdb->locked = calloc(tdb->header.hash_size+1, sizeof(tdb->locked[0])); + if (!tdb->locked) { + TDB_LOG((tdb, 2, "tdb_open_ex: " + "failed to allocate lock structure for %s\n", + name)); + errno = ENOMEM; + goto fail; + } + tdb_mmap(tdb); + if (locked) { + if (!tdb->read_only) + if (tdb_clear_spinlocks(tdb) != 0) { + TDB_LOG((tdb, 0, "tdb_open_ex: " + "failed to clear spinlock\n")); + goto fail; + } + if (tdb_brlock(tdb, ACTIVE_LOCK, F_UNLCK, F_SETLK, 0) == -1) { + TDB_LOG((tdb, 0, "tdb_open_ex: " + "failed to take ACTIVE_LOCK on %s: %s\n", + name, strerror(errno))); + goto fail; + } + } + /* leave this lock in place to indicate it's in use */ + if (tdb_brlock(tdb, ACTIVE_LOCK, F_RDLCK, F_SETLKW, 0) == -1) + goto fail; + + internal: + /* Internal (memory-only) databases skip all the code above to + * do with disk files, and resume here by releasing their + * global lock and hooking into the active list. */ + if (tdb_brlock(tdb, GLOBAL_LOCK, F_UNLCK, F_SETLKW, 0) == -1) + goto fail; + tdb->next = tdbs; + tdbs = tdb; + return tdb; + + fail: + { int save_errno = errno; + + if (!tdb) + return NULL; + + if (tdb->map_ptr) { + if (tdb->flags & TDB_INTERNAL) + SAFE_FREE(tdb->map_ptr); + else + tdb_munmap(tdb); + } + SAFE_FREE(tdb->name); + if (tdb->fd != -1) + if (close(tdb->fd) != 0) + TDB_LOG((tdb, 5, "tdb_open_ex: failed to close tdb->fd on error!\n")); + SAFE_FREE(tdb->locked); + SAFE_FREE(tdb); + errno = save_errno; + return NULL; + } +} + +/* close a database */ +int tdb_close(TDB_CONTEXT *tdb) +{ + TDB_CONTEXT **i; + int ret = 0; + + if (tdb->map_ptr) { + if (tdb->flags & TDB_INTERNAL) + SAFE_FREE(tdb->map_ptr); + else + tdb_munmap(tdb); + } + SAFE_FREE(tdb->name); + if (tdb->fd != -1) + ret = close(tdb->fd); + SAFE_FREE(tdb->locked); + SAFE_FREE(tdb->lockedkeys); + + /* Remove from contexts list */ + for (i = &tdbs; *i; i = &(*i)->next) { + if (*i == tdb) { + *i = tdb->next; + break; + } + } + + memset(tdb, 0, sizeof(*tdb)); + SAFE_FREE(tdb); + + return ret; +} + +/* lock/unlock entire database */ +int tdb_lockall(TDB_CONTEXT *tdb) +{ + u32 i; + + /* There are no locks on read-only dbs */ + if (tdb->read_only) + return TDB_ERRCODE(TDB_ERR_LOCK, -1); + if (tdb->lockedkeys) + return TDB_ERRCODE(TDB_ERR_NOLOCK, -1); + for (i = 0; i < tdb->header.hash_size; i++) + if (tdb_lock(tdb, i, F_WRLCK)) + break; + + /* If error, release locks we have... */ + if (i < tdb->header.hash_size) { + u32 j; + + for ( j = 0; j < i; j++) + tdb_unlock(tdb, j, F_WRLCK); + return TDB_ERRCODE(TDB_ERR_NOLOCK, -1); + } + + return 0; +} +void tdb_unlockall(TDB_CONTEXT *tdb) +{ + u32 i; + for (i=0; i < tdb->header.hash_size; i++) + tdb_unlock(tdb, i, F_WRLCK); +} + +int tdb_lockkeys(TDB_CONTEXT *tdb, u32 number, TDB_DATA keys[]) +{ + u32 i, j, hash; + + /* Can't lock more keys if already locked */ + if (tdb->lockedkeys) + return TDB_ERRCODE(TDB_ERR_NOLOCK, -1); + if (!(tdb->lockedkeys = malloc(sizeof(u32) * (number+1)))) + return TDB_ERRCODE(TDB_ERR_OOM, -1); + /* First number in array is # keys */ + tdb->lockedkeys[0] = number; + + /* Insertion sort by bucket */ + for (i = 0; i < number; i++) { + hash = tdb_hash(&keys[i]); + for (j = 0; j < i && BUCKET(tdb->lockedkeys[j+1]) < BUCKET(hash); j++); + memmove(&tdb->lockedkeys[j+2], &tdb->lockedkeys[j+1], sizeof(u32) * (i-j)); + tdb->lockedkeys[j+1] = hash; + } + /* Finally, lock in order */ + for (i = 0; i < number; i++) + if (tdb_lock(tdb, i, F_WRLCK)) + break; + + /* If error, release locks we have... */ + if (i < number) { + for ( j = 0; j < i; j++) + tdb_unlock(tdb, j, F_WRLCK); + SAFE_FREE(tdb->lockedkeys); + return TDB_ERRCODE(TDB_ERR_NOLOCK, -1); + } + return 0; +} + +/* Unlock the keys previously locked by tdb_lockkeys() */ +void tdb_unlockkeys(TDB_CONTEXT *tdb) +{ + u32 i; + for (i = 0; i < tdb->lockedkeys[0]; i++) + tdb_unlock(tdb, tdb->lockedkeys[i+1], F_WRLCK); + SAFE_FREE(tdb->lockedkeys); +} + +/* lock/unlock one hash chain. This is meant to be used to reduce + contention - it cannot guarantee how many records will be locked */ +int tdb_chainlock(TDB_CONTEXT *tdb, TDB_DATA key) +{ + return tdb_lock(tdb, BUCKET(tdb_hash(&key)), F_WRLCK); +} + +int tdb_chainunlock(TDB_CONTEXT *tdb, TDB_DATA key) +{ + return tdb_unlock(tdb, BUCKET(tdb_hash(&key)), F_WRLCK); +} + + +/* register a loging function */ +void tdb_logging_function(TDB_CONTEXT *tdb, void (*fn)(TDB_CONTEXT *, int , const char *, ...)) +{ + tdb->log_fn = fn; +} + + +/* reopen a tdb - this is used after a fork to ensure that we have an independent + seek pointer from our parent and to re-establish locks */ +int tdb_reopen(TDB_CONTEXT *tdb) +{ + struct stat st; + + if (tdb_munmap(tdb) != 0) { + TDB_LOG((tdb, 0, "tdb_reopen: munmap failed (%s)\n", strerror(errno))); + goto fail; + } + if (close(tdb->fd) != 0) + TDB_LOG((tdb, 0, "tdb_reopen: WARNING closing tdb->fd failed!\n")); + tdb->fd = open(tdb->name, tdb->open_flags & ~(O_CREAT|O_TRUNC), 0); + if (tdb->fd == -1) { + TDB_LOG((tdb, 0, "tdb_reopen: open failed (%s)\n", strerror(errno))); + goto fail; + } + if (fstat(tdb->fd, &st) != 0) { + TDB_LOG((tdb, 0, "tdb_reopen: fstat failed (%s)\n", strerror(errno))); + goto fail; + } + if (st.st_ino != tdb->inode || st.st_dev != tdb->device) { + TDB_LOG((tdb, 0, "tdb_reopen: file dev/inode has changed!\n")); + goto fail; + } + tdb_mmap(tdb); + if (tdb_brlock(tdb, ACTIVE_LOCK, F_RDLCK, F_SETLKW, 0) == -1) { + TDB_LOG((tdb, 0, "tdb_reopen: failed to obtain active lock\n")); + goto fail; + } + + return 0; + +fail: + tdb_close(tdb); + return -1; +} + +/* reopen all tdb's */ +int tdb_reopen_all(void) +{ + TDB_CONTEXT *tdb; + + for (tdb=tdbs; tdb; tdb = tdb->next) { + if (tdb_reopen(tdb) != 0) return -1; + } + + return 0; +} diff --git a/lasker-2.2.3/src/tdb/tdb.h b/lasker-2.2.3/src/tdb/tdb.h new file mode 100644 index 0000000..1d72a87 --- /dev/null +++ b/lasker-2.2.3/src/tdb/tdb.h @@ -0,0 +1,142 @@ +#ifndef __TDB_H__ +#define __TDB_H__ + +/* + Unix SMB/CIFS implementation. + Samba database functions + Copyright (C) Andrew Tridgell 1999 + + 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., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#ifdef __cplusplus +extern "C" { +#endif + + +/* flags to tdb_store() */ +#define TDB_REPLACE 1 +#define TDB_INSERT 2 +#define TDB_MODIFY 3 + +/* flags for tdb_open() */ +#define TDB_DEFAULT 0 /* just a readability place holder */ +#define TDB_CLEAR_IF_FIRST 1 +#define TDB_INTERNAL 2 /* don't store on disk */ +#define TDB_NOLOCK 4 /* don't do any locking */ +#define TDB_NOMMAP 8 /* don't use mmap */ +#define TDB_CONVERT 16 /* convert endian (internal use) */ +#define TDB_BIGENDIAN 32 /* header is big-endian (internal use) */ + +#define TDB_ERRCODE(code, ret) ((tdb->ecode = (code)), ret) + +/* error codes */ +enum TDB_ERROR {TDB_SUCCESS=0, TDB_ERR_CORRUPT, TDB_ERR_IO, TDB_ERR_LOCK, + TDB_ERR_OOM, TDB_ERR_EXISTS, TDB_ERR_NOEXIST, TDB_ERR_NOLOCK }; + +#ifndef u32 +#define u32 unsigned +#endif + +typedef struct { + const char *dptr; + size_t dsize; +} TDB_DATA; + +typedef u32 tdb_len; +typedef u32 tdb_off; + +/* this is stored at the front of every database */ +struct tdb_header { + char magic_food[32]; /* for /etc/magic */ + u32 version; /* version of the code */ + u32 hash_size; /* number of hash entries */ + tdb_off rwlocks; + tdb_off reserved[31]; +}; + +struct tdb_lock_type { + u32 count; + u32 ltype; +}; + +struct tdb_traverse_lock { + struct tdb_traverse_lock *next; + u32 off; + u32 hash; +}; + +/* this is the context structure that is returned from a db open */ +typedef struct tdb_context { + char *name; /* the name of the database */ + void *map_ptr; /* where it is currently mapped */ + int fd; /* open file descriptor for the database */ + tdb_len map_size; /* how much space has been mapped */ + int read_only; /* opened read-only */ + struct tdb_lock_type *locked; /* array of chain locks */ + enum TDB_ERROR ecode; /* error code for last tdb error */ + struct tdb_header header; /* a cached copy of the header */ + u32 flags; /* the flags passed to tdb_open */ + u32 *lockedkeys; /* array of locked keys: first is #keys */ + struct tdb_traverse_lock travlocks; /* current traversal locks */ + struct tdb_context *next; /* all tdbs to avoid multiple opens */ + dev_t device; /* uniquely identifies this tdb */ + ino_t inode; /* uniquely identifies this tdb */ + void (*log_fn)(struct tdb_context *tdb, int level, const char *, ...); /* logging function */ + int open_flags; /* flags used in the open - needed by reopen */ +} TDB_CONTEXT; + +typedef int (*tdb_traverse_func)(TDB_CONTEXT *, TDB_DATA, TDB_DATA, void *); +typedef void (*tdb_log_func)(TDB_CONTEXT *, int , const char *, ...); + +TDB_CONTEXT *tdb_open(const char *name, int hash_size, int tdb_flags, + int open_flags, mode_t mode); +TDB_CONTEXT *tdb_open_ex(const char *name, int hash_size, int tdb_flags, + int open_flags, mode_t mode, + tdb_log_func log_fn); + +int tdb_reopen(TDB_CONTEXT *tdb); +int tdb_reopen_all(void); +void tdb_logging_function(TDB_CONTEXT *tdb, tdb_log_func); +enum TDB_ERROR tdb_error(TDB_CONTEXT *tdb); +const char *tdb_errorstr(TDB_CONTEXT *tdb); +TDB_DATA tdb_fetch(TDB_CONTEXT *tdb, TDB_DATA key); +int tdb_delete(TDB_CONTEXT *tdb, TDB_DATA key); +int tdb_store(TDB_CONTEXT *tdb, TDB_DATA key, TDB_DATA dbuf, int flag); +int tdb_close(TDB_CONTEXT *tdb); +TDB_DATA tdb_firstkey(TDB_CONTEXT *tdb); +TDB_DATA tdb_nextkey(TDB_CONTEXT *tdb, TDB_DATA key); +int tdb_traverse(TDB_CONTEXT *tdb, tdb_traverse_func fn, void *state); +int tdb_exists(TDB_CONTEXT *tdb, TDB_DATA key); +int tdb_lockkeys(TDB_CONTEXT *tdb, u32 number, TDB_DATA keys[]); +void tdb_unlockkeys(TDB_CONTEXT *tdb); +int tdb_lockall(TDB_CONTEXT *tdb); +void tdb_unlockall(TDB_CONTEXT *tdb); + +/* Low level locking functions: use with care */ +int tdb_chainlock(TDB_CONTEXT *tdb, TDB_DATA key); +int tdb_chainunlock(TDB_CONTEXT *tdb, TDB_DATA key); + +/* Debug functions. Not used in production. */ +void tdb_dump_all(TDB_CONTEXT *tdb); +int tdb_printfreelist(TDB_CONTEXT *tdb); + +extern TDB_DATA tdb_null; + +#ifdef __cplusplus +} +#endif + +#endif /* tdb.h */ diff --git a/lasker-2.2.3/src/timeseal.c b/lasker-2.2.3/src/timeseal.c new file mode 100644 index 0000000..4f9b942 --- /dev/null +++ b/lasker-2.2.3/src/timeseal.c @@ -0,0 +1,188 @@ +/* + Copyright 2002 Andrew Tridgell + + 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., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +/* glue code that connects the chess server to the external timeseal + * decoder */ + +#include "includes.h" + +/* + send a string to the decoder sub-process and return the modified (decoded) string + the return value is the decoded timestamp. It will be zero if the decoder didn't + recognise the input as valid timeseal data + */ +static unsigned decode(unsigned char *s) +{ + char line[1024]; + char *p; + unsigned t = 0; + + /* send the encoded data to the decoder process */ + dprintf(timeseal_globals.decoder_conn, "%s\n", s); + + if (!fd_gets(line, sizeof(line), timeseal_globals.decoder_conn)) { + d_printf("Bad result from timeseal decoder? (t=%u)\n", t); + close(timeseal_globals.decoder_conn); + timeseal_globals.decoder_conn = -1; + return 0; + } + line[strlen(line)-1] = 0; + + p = strchr(line, ':'); + if (!p) { + d_printf("Badly formed timeseal decoder line: [%s]\n", line); + close(timeseal_globals.decoder_conn); + timeseal_globals.decoder_conn = -1; + return 0; + } + + t = atoi(line); + strcpy(s, p+2); + + return t; +} + +/* + initialise the timeseal decoder sub-process +*/ +void timeseal_init(const char *path) +{ + int fd[2]; + pid_t pid; + + /* use a socketpair to get a bi-directional pipe with large buffers */ + if (socketpair(AF_UNIX, SOCK_STREAM, 0, fd) != 0) { + d_printf("Failed to create socket pair!\n"); + exit(1); + } + + pid = fork(); + + if (pid == 0) { + close(fd[1]); + close(0); + close(1); + close(2); + dup2(fd[0], 0); + dup2(fd[0], 1); + open("/dev/null", O_WRONLY); /* stderr */ + execl(path, "[timeseal]", NULL); + exit(1); + } + + timeseal_globals.decoder_conn = fd[1]; + close(fd[0]); +} + + +/* + parse a command line from a user on *con that may be timeseal encoded. + return 1 if the command should be processed further, 0 if the command + should be discarded + */ +int timeseal_parse(char *command, struct connection_t *con) +{ + unsigned t; + + /* do we have a decoder sub-process? */ + if (timeseal_globals.decoder_conn <= 0) return 1; + + /* are they using timeseal on this connection? */ + if (!con->timeseal_init && !con->timeseal) return 1; + + t = decode(command); + + if (t == 0) { + /* this wasn't encoded using timeseal */ + d_printf("Non-timeseal data [%s]\n", command); + con->timeseal_init = 0; + return 1; + } + + if (con->timeseal_init) { + con->timeseal_init = 0; + con->timeseal = 1; + d_printf("Connected with timeseal %s\n", command); + if (strncmp(command, "TIMESTAMP|", 10) == 0) { + return 0; + } + } + + con->time = t; + + /* now check for the special move time tag */ + if (strcmp(command, "9") == 0) { + int p = player_find(con->fd); + struct player *pp = &player_globals.parray[p]; + if (p >= 0 && pp->game >= 0) { + int g = pp->game; + if (game_globals.garray[g].game_state.onMove != + pp->side) { + return 0; + } + if (pp->side == WHITE) { + if (game_globals.garray[g].wTimeWhenReceivedMove == 0) { + game_globals.garray[g].wTimeWhenReceivedMove = t; + } + } else { + if (game_globals.garray[g].bTimeWhenReceivedMove == 0) { + game_globals.garray[g].bTimeWhenReceivedMove = t; + } + } + if (game_globals.garray[g].flag_pending != FLAG_NONE) { + ExecuteFlagCmd(p, net_globals.con[pp->socket]); + } + } + /* we have processed this special tag - don't process it further */ + return 0; + } + + return 1; +} + +/* + used to call flag on players with timeseal + */ +void ExecuteFlagCmd(int p, struct connection_t *con) +{ + struct player *pp = &player_globals.parray[p]; + struct game *gg; + + if (pp->game == -1) { + return; + } + + gg = &game_globals.garray[pp->game]; + + if (pp->side == WHITE) { + gg->wRealTime -= con->time - gg->wTimeWhenReceivedMove; + gg->wTimeWhenReceivedMove = con->time; + if (gg->wRealTime < 0) { + pcommand(pp->opponent, "flag"); + } + } else if (pp->side == BLACK) { + gg->bRealTime -= con->time - gg->wTimeWhenReceivedMove; + gg->bTimeWhenReceivedMove = con->time; + if (gg->bRealTime < 0) { + pcommand(pp->opponent, "flag"); + } + } + + game_update_time(pp->game); + gg->flag_pending = FLAG_NONE; +} diff --git a/lasker-2.2.3/src/utils.c b/lasker-2.2.3/src/utils.c new file mode 100644 index 0000000..d6245ca --- /dev/null +++ b/lasker-2.2.3/src/utils.c @@ -0,0 +1,1210 @@ +/* + Copyright (c) 1993 Richard V. Nash. + Copyright (c) 2000 Dan Papasian + Copyright (C) Andrew Tridgell 2002 + + 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., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + + +#include "includes.h" + +static int safestring(char *str); + +char *eatword(char *str) +{ + while (*str && !isspace(*str)) + str++; + return str; +} + +char *eatwhite(char *str) +{ + while (*str && isspace(*str)) + str++; + return str; +} + +char *eattailwhite(char *str) +{ + int len; + if (str == NULL) + return NULL; + + len = strlen(str); + while (len > 0 && isspace(str[len - 1])) + len--; + str[len] = '\0'; + return (str); +} + +char *nextword(char *str) +{ + return eatwhite(eatword(str)); +} + +int mail_string_to_address(char *addr, char *subj, char *str) +{ + int fd; + char template[] = SPOOL_DIR; + + fd = mkstemp(template); + if (fd == -1) { + d_printf("Failed to create spool file\n"); + return -1; + } + + dprintf(fd, "To: %s\nSubject: %s\n\n%s\n", addr, subj, str); + close(fd); + + return 0; +} + +int mail_string_to_user(int p, char *subj, char *str) +{ + struct player *pp = &player_globals.parray[p]; + if (pp->emailAddress && + pp->emailAddress[0] && + safestring(pp->emailAddress)) { + return mail_string_to_address(pp->emailAddress, subj, str); + } + return -1; +} + + +/* Process a command for a user */ +int pcommand(int p, char *comstr,...) +{ + struct player *pp = &player_globals.parray[p]; + char *tmp; + int retval; + int current_socket = pp->socket; + va_list ap; + + va_start(ap, comstr); + vasprintf(&tmp, comstr, ap); + va_end(ap); + retval = process_input(current_socket, tmp); + free(tmp); + if (retval == COM_LOGOUT) { + process_disconnection(current_socket); + net_close_connection(current_socket); + } + return retval; +} + +static int vpprintf(int p, int do_formatting, char *format,va_list ap) +{ + struct player *pp = &player_globals.parray[p]; + char *tmp = NULL; + int retval; + + retval = vasprintf(&tmp, format, ap); + if (retval != 0) { + net_send_string(pp->socket, + tmp, + do_formatting, + pp->d_width + 1); + } + if (tmp) { + free(tmp); + } + + return retval; +} + +int pprintf(int p, char *format,...) +{ + int retval; + va_list ap; + va_start(ap, format); + retval = vpprintf(p, 1, format, ap); + va_end(ap); + return retval; +} + +static void pprintf_dohightlight(int p) +{ + struct player *pp = &player_globals.parray[p]; + if (pp->highlight & 0x01) + pprintf(p, "\033[7m"); + if (pp->highlight & 0x02) + pprintf(p, "\033[1m"); + if (pp->highlight & 0x04) + pprintf(p, "\033[4m"); + if (pp->highlight & 0x08) + pprintf(p, "\033[2m"); +} + +int pprintf_highlight(int p, char *format,...) +{ + struct player *pp = &player_globals.parray[p]; + int retval; + va_list ap; + + pprintf_dohightlight(p); + va_start(ap, format); + retval = vpprintf(p, 1, format, ap); + va_end(ap); + if (pp->highlight) + pprintf(p, "\033[0m"); + return retval; +} + +static void sprintf_dohightlight(int p, char *s) +{ + struct player *pp = &player_globals.parray[p]; + if (pp->highlight & 0x01) + strcat(s, "\033[7m"); + if (pp->highlight & 0x02) + strcat(s, "\033[1m"); + if (pp->highlight & 0x04) + strcat(s, "\033[4m"); + if (pp->highlight & 0x08) + strcat(s, "\033[2m"); +} + +/* + like pprintf() but with paging for long messages +*/ +int pprintf_more(int p, char *format,...) +{ + struct player *pp = &player_globals.parray[p]; + char *s = NULL; + va_list ap; + va_start(ap, format); + vasprintf(&s, format, ap); + va_end(ap); + + FREE(pp->more_text); + pp->more_text = s; + + return pmore_text(p); +} + +int psprintf_highlight(int p, char *s, char *format,...) +{ + struct player *pp = &player_globals.parray[p]; + int retval; + va_list ap; + + va_start(ap, format); + if (pp->highlight) { + sprintf_dohightlight(p, s); + retval = vsprintf(s + strlen(s), format, ap); + strcat(s, "\033[0m"); + } else { + retval = vsprintf(s, format, ap); + } + va_end(ap); + return retval; +} + +int pprintf_prompt(int p, char *format,...) +{ + int retval; + va_list ap; + va_start(ap, format); + retval = vpprintf(p, 1, format, ap); + va_end(ap); + send_prompt(p); + return retval; +} + +/* send a prompt to p */ +void send_prompt(int p) +{ + struct player *pp = &player_globals.parray[p]; + const char *prompt = pp->prompt; + pprintf(p, "%s%s", + prompt, + isspace(prompt[strlen(prompt)-1])?"":" "); +} + +int pprintf_noformat(int p, char *format,...) +{ + int retval; + va_list ap; + va_start(ap, format); + retval = vpprintf(p, 0, format, ap); + va_end(ap); + return retval; +} + +void Bell (int p) +{ + if (CheckPFlag(p, PFLAG_BELL)) + pprintf (p, "\a"); + return; +} + +int psend_raw_file(int p, char *dir, char *file) +{ + struct player *pp = &player_globals.parray[p]; + FILE *fp; + char tmp[MAX_LINE_SIZE]; + int num; + + fp = fopen_p("%s/%s", "r", dir, file); + + if (!fp) + return -1; + while ((num = fread(tmp, sizeof(char), MAX_LINE_SIZE - 1, fp)) > 0) { + tmp[num] = '\0'; + net_send_string(pp->socket, tmp, 1, pp->d_width + 1); + } + fclose(fp); + return 0; +} + +/* + send a file a page at a time +*/ +int psend_file(int p, const char *dir, const char *file) +{ + struct player *pp = &player_globals.parray[p]; + char *fname; + + if (strstr(file, "..")) { + pprintf(p,"Trying to be tricky, are we?\n"); + return 0; + } + + if (dir) { + asprintf(&fname,"%s/%s",dir,file); + } else { + fname = strdup(file); + } + + FREE(pp->more_text); + pp->more_text = file_load(fname, NULL); + if (!pp->more_text) { + return -1; + } + + free(fname); + + return pmore_text(p); +} + +/* + * Marsalis added on 8/27/95 so that [next] does not + * appear in the logout process for those that have + * a short screen height. (Fixed due to complaint + * in Bug's messages). + */ +int psend_logoutfile(int p, char *dir, char *file) +{ + return psend_file(p, dir, file); +} + +/* + continue with text from a previous command +*/ +int pmore_text(int p) +{ + struct player *pp = &player_globals.parray[p]; + int lcount = pp->d_height - 1; + + if (!pp->more_text) { + pprintf(p, "There is no more.\n"); + return -1; + } + + while (pp->more_text && lcount--) { + char *s = strndup(pp->more_text, strcspn(pp->more_text, "\n")+1); + int len = strlen(s); + net_send_string(pp->socket, s, 1, pp->d_width + 1); + s = strdup(pp->more_text+len); + FREE(pp->more_text); + if (s[0]) { + pp->more_text = s; + } else { + free(s); + } + } + + if (pp->more_text) { + pprintf(p, "Type [next] to see next page.\n"); + } + + return 0; +} + +char *stolower(char *str) +{ + int i; + + if (!str) + return NULL; + for (i = 0; str[i]; i++) { + if (isupper(str[i])) { + str[i] = tolower(str[i]); + } + } + return str; +} + +static int safechar(int c) +{ + return (isprint(c) && !strchr(">!&*?/<|`$;", c)); +} + +static int safestring(char *str) +{ + int i; + + if (!str) + return 1; + for (i = 0; str[i]; i++) { + if (!safechar(str[i])) + return 0; + } + return 1; +} + +int alphastring(char *str) +{ + int i; + + if (!str) + return 1; + for (i = 0; str[i]; i++) { + if (!isalpha(str[i])) { + return 0; + } + } + return 1; +} + +int printablestring(const char *str) +{ + int i; + + if (!str) + return 1; + for (i = 0; str[i]; i++) { + if ((!isprint(str[i])) && (str[i] != '\t') && (str[i] != '\n')) + return 0; + } + return 1; +} + +char *hms_desc(int t) +{ +static char tstr[80]; +int days, hours, mins, secs; + + days = (t / (60*60*24)); + hours = ((t % (60*60*24)) / (60*60)); + mins = (((t % (60*60*24)) % (60*60)) / 60); + secs = (((t % (60*60*24)) % (60*60)) % 60); + if ((days==0) && (hours==0) && (mins==0)) { + sprintf(tstr, "%d sec%s", + secs, (secs==1) ? "" : "s"); + } else if ((days==0) && (hours==0)) { +/* sprintf(tstr, "%d min%s, %d sec%s", + mins, (mins==1) ? "" : "s", + secs, (secs==1) ? "" : "s"); */ + sprintf(tstr, "%d min%s", + mins, (mins==1) ? "" : "s"); + } else if (days==0) { + sprintf(tstr, "%d hr%s, %d min%s, %d " + "sec%s", + hours, (hours==1) ? "" : "s", + mins, (mins==1) ? "" : "s", + secs, (secs==1) ? "" : "s"); + } else { + sprintf(tstr, "%d day%s, %d hour%s, %d minute%s " + "and %d second%s", + days, (days==1) ? "" : "s", + hours, (hours==1) ? "" : "s", + mins, (mins==1) ? "" : "s", + secs, (secs==1) ? "" : "s"); + } + return tstr; +} + +char *hms(int t, int showhour, int showseconds, int spaces) +{ + static char tstr[20]; + char tmp[10]; + int h, m, s; + + h = t / 3600; + t = t % 3600; + m = t / 60; + s = t % 60; + if (h || showhour) { + if (spaces) + sprintf(tstr, "%d : %02d", h, m); + else + sprintf(tstr, "%d:%02d", h, m); + } else { + sprintf(tstr, "%d", m); + } + if (showseconds) { + if (spaces) + sprintf(tmp, " : %02d", s); + else + sprintf(tmp, ":%02d", s); + strcat(tstr, tmp); + } + return tstr; +} + +/* This is used only for relative timeing since it reports seconds since + * about 5:00pm on Feb 16, 1994 + */ +unsigned tenth_secs(void) +{ + struct timeval tp; + struct timezone tzp; + + gettimeofday(&tp, &tzp); +/* .1 seconds since 1970 almost fills a 32 bit int! So lets subtract off + * the time right now */ + return ((tp.tv_sec - 331939277) * 10L) + (tp.tv_usec / 100000); +} + +/* This is to translate tenths-secs time back into 1/1/70 time in full + * seconds, because vek didn't read utils.c when he programmed new ratings. + 1 sec since 1970 fits into a 32 bit int OK. +*/ +int untenths(unsigned tenths) +{ + return (tenths / 10 + 331939277 + 0xffffffff / 10 + 1); +} + +char *tenth_str(unsigned t, int spaces) +{ + return hms((t + 5) / 10, 0, 1, spaces); /* Round it */ +} + +#define MAX_TRUNC_SIZE 100 + +/* Warning, if lines in the file are greater than 1024 bytes in length, this + won't work! */ +/* nasty bug fixed by mann, 3-12-95 */ +int truncate_file(char *file, int lines) +{ + FILE *fp; + int bptr = 0, trunc = 0, i; + char tBuf[MAX_TRUNC_SIZE][MAX_LINE_SIZE]; + + if (lines > MAX_TRUNC_SIZE) + lines = MAX_TRUNC_SIZE; + fp = fopen_s(file, "r"); + if (!fp) + return 1; + while (!feof(fp)) { + fgets(tBuf[bptr], MAX_LINE_SIZE, fp); + if (feof(fp)) + break; + if (tBuf[bptr][strlen(tBuf[bptr]) - 1] != '\n') { /* Line too long */ + fclose(fp); + return -1; + } + bptr++; + if (bptr == lines) { + trunc = 1; + bptr = 0; + } + } + fclose(fp); + if (trunc) { + fp = fopen_s(file, "w"); + for (i = 0; i < lines; i++) { + fputs(tBuf[bptr], fp); + bptr++; + if (bptr == lines) { + bptr = 0; + } + } + fclose(fp); + } + return 0; +} + +/* Warning, if lines in the file are greater than 1024 bytes in length, this + won't work! */ +int lines_file(char *file) +{ + FILE *fp; + int lcount = 0; + char tmp[MAX_LINE_SIZE]; + + fp = fopen_s(file, "r"); + if (!fp) + return 0; + while (!feof(fp)) { + if (fgets(tmp, MAX_LINE_SIZE, fp)) + lcount++; + } + fclose(fp); + return lcount; +} + +int file_has_pname(char *fname, char *plogin) +{ + if (!strcmp(file_wplayer(fname), plogin)) + return 1; + if (!strcmp(file_bplayer(fname), plogin)) + return 1; + return 0; +} + +char *file_wplayer(char *fname) +{ + static char tmp[MAX_FILENAME_SIZE]; + char *ptr; + strcpy(tmp, fname); + ptr = rindex(tmp, '-'); + if (!ptr) + return ""; + *ptr = '\0'; + return tmp; +} + +char *file_bplayer(char *fname) +{ + char *ptr; + + ptr = rindex(fname, '-'); + if (!ptr) + return ""; + return ptr + 1; +} + +/* + make a human readable IP +*/ +char *dotQuad(struct in_addr a) +{ + return inet_ntoa(a); +} + +int file_exists(char *fname) +{ + FILE *fp; + + fp = fopen_s(fname, "r"); + if (!fp) + return 0; + fclose(fp); + return 1; +} + +char *ratstr(int rat) +{ + static int on = 0; + static char tmp[20][10]; + + if (on == 20) + on = 0; + if (rat) { + sprintf(tmp[on], "%4d", rat); + } else { + sprintf(tmp[on], "----"); + + } + on++; + return tmp[on - 1]; +} + +char *ratstrii(int rat, int p) +{ + static int on = 0; + static char tmp[20][10]; + + if (on == 20) + on = 0; + if (rat) { + sprintf(tmp[on], "%4d", rat); + } else if (CheckPFlag(p, PFLAG_REG)) { + sprintf(tmp[on], "----"); + } else { + sprintf(tmp[on], "++++"); + } + on++; + return tmp[on - 1]; +} + +struct t_tree { + struct t_tree *left, *right; + char name; /* Not just 1 char - space for whole name */ +}; /* is allocated. Maybe a little cheesy? */ + +struct t_dirs { + struct t_dirs *left, *right; + time_t mtime; /* dir's modification time */ + struct t_tree *files; + char name; /* ditto */ +}; + +static char **t_buffer = NULL; /* pointer to next space in return buffer */ +static int t_buffersize = 0; /* size of return buffer */ + +/* fill t_buffer with anything matching "want*" in file tree t_tree */ +static void t_sft(const char *want, struct t_tree *t) +{ + if (t) { + int cmp = strncmp(want, &t->name, strlen(want)); + if (cmp <= 0) /* if want <= this one, look left */ + t_sft(want, t->left); + if (t_buffersize && (cmp == 0)) { /* if a match, add it to buffer */ + t_buffersize--; + *t_buffer++ = &(t->name); + } + if (cmp >= 0) /* if want >= this one, look right */ + t_sft(want, t->right); + } +} + +/* delete file tree t_tree */ +static void t_cft(struct t_tree **t) +{ + if (*t) { + t_cft(&(*t)->left); + t_cft(&(*t)->right); + free(*t); + *t = NULL; + } +} + +/* make file tree for dir d */ +static void t_mft(struct t_dirs *d) +{ + DIR *dirp; + struct dirent *dp; + struct t_tree **t; + + if ((dirp = opendir(&(d->name))) == NULL) { + d_printf( "CHESSD:mft() couldn't opendir.\n"); + } else { + while ((dp = readdir(dirp))) { + t = &d->files; + if (dp->d_name[0] != '.') { /* skip anything starting with . */ + while (*t) { + if (strcmp(dp->d_name, &(*t)->name) < 0) { + t = &(*t)->left; + } else { + t = &(*t)->right; + } + } + *t = malloc(sizeof(struct t_tree) + strlen(dp->d_name)); + (*t)->right = (*t)->left = NULL; + strcpy(&(*t)->name, dp->d_name); + } + } + closedir(dirp); + } +} + +int search_directory(const char *dir, const char *filter, char **buffer, int buffersize) +{ +/* dir = directory to search + filter = what to search for + buffer = where to store pointers to matches + buffersize = how many pointers will fit inside buffer */ + + static struct t_dirs *ramdirs = NULL; + struct t_dirs **i; + int cmp; + static char nullify = '\0'; + struct stat statbuf; + + t_buffer = buffer; + t_buffersize = buffersize; + + if (!stat(dir, &statbuf)) { + if (filter == NULL) /* NULL becomes pointer to null string */ + filter = &nullify; + i = &ramdirs; + while (*i) { /* find dir in dir tree */ + cmp = strcmp(dir, &(*i)->name); + if (cmp == 0) + break; + else if (cmp < 0) + i = &(*i)->left; + else + i = &(*i)->right; + } + if (!*i) { /* if dir isn't in dir tree, add him */ + *i = malloc(sizeof(struct t_dirs) + strlen(dir)); + (*i)->left = (*i)->right = NULL; + (*i)->files = NULL; + strcpy(&(*i)->name, dir); + } + if ((*i)->files) { /* delete any obsolete file tree */ + if ((*i)->mtime != statbuf.st_mtime) { + t_cft(&(*i)->files); + } + } + if ((*i)->files == NULL) { /* if no file tree for him, make one */ + (*i)->mtime = statbuf.st_mtime; + t_mft(*i); + } + t_sft(filter, (*i)->files); /* finally, search for matches */ + } + return (buffersize - t_buffersize); +} + +int display_directory(int p, char **buffer, int count) +/* buffer contains 'count' string pointers */ +{ + struct player *pp = &player_globals.parray[p]; + int i; + multicol *m = multicol_start(count); + + for (i = 0; (i < count); i++) + multicol_store(m, *buffer++); + multicol_pprint(m, p, pp->d_width, 1); + multicol_end(m); + return (i); +} + +void CenterText (char *target, const char *text, int width, int pad) +{ + int left, len; + char *format; + + len = strlen(text); + left = (width + 1 - len) / 2; /* leading blank space. */ + + if (pad) + asprintf (&format, "%%%ds%%-%ds", left, width-left); /* e.g. "%5s%-10s" */ + else + asprintf (&format, "%%%ds%%s", left); /* e.g. "%5s%s" */ + sprintf (target, format, "", text); + + free(format); + + return; +} + +/* block a signal */ +void block_signal(int signum) +{ + sigset_t set; + sigemptyset(&set); + sigaddset(&set,signum); + sigprocmask(SIG_BLOCK,&set,NULL); +} + +/* unblock a signal */ +void unblock_signal(int signum) +{ + sigset_t set; + sigemptyset(&set); + sigaddset(&set,signum); + sigprocmask(SIG_UNBLOCK,&set,NULL); +} + + +int file_copy(const char *src, const char *dest) +{ + int fd1, fd2, n; + char buf[1024]; + + fd1 = open(src, O_RDONLY); + if (fd1 == -1) return -1; + + unlink(dest); + fd2 = open(dest, O_WRONLY|O_CREAT|O_EXCL, 0644); + if (fd2 == -1) { + close(fd1); + return -1; + } + + while ((n = read(fd1, buf, sizeof(buf))) > 0) { + if (write(fd2, buf, n) != n) { + close(fd2); + close(fd1); + unlink(dest); + return -1; + } + } + + close(fd1); + close(fd2); + return 0; +} + + +#ifndef HAVE_DPRINTF + int dprintf(int fd, const char *format, ...) +{ + va_list ap; + char *ptr = NULL; + int ret = 0; + + va_start(ap, format); + vasprintf(&ptr, format, ap); + va_end(ap); + + if (ptr) { + ret = write(fd, ptr, strlen(ptr)); + free(ptr); + } + + return ret; +} +#endif + + +#ifndef HAVE_STRNLEN_X +/* + some platforms don't have strnlen +*/ +size_t strnlen(const char *s, size_t n) +{ + int i; + for (i=0; s[i] && ilogin, command); + + if (!s) return; + for (i=0; params[i].type != TYPE_NULL; i++) { + switch (params[i].type) { + case TYPE_INT: + asprintf(&s2, "%s %d", s, params[i].val.integer); + break; + case TYPE_STRING: + asprintf(&s2, "%s %s", s, params[i].val.string); + break; + case TYPE_WORD: + asprintf(&s2, "%s %s", s, params[i].val.word); + break; + } + + free(s); + s = s2; + if (!s) return; + } + + admin_printf("%s\n", s); + free(s); +} + +/* + save a lump of data into a file. + return 0 on success +*/ +int file_save(const char *fname, void *data, size_t length) +{ + int fd; + unlink(fname); + fd = open(fname, O_WRONLY|O_CREAT|O_EXCL, 0644); + if (fd == -1) { + return -1; + } + if (write(fd, data, length) != length) { + close(fd); + unlink(fname); + return -1; + } + close(fd); + return 0; +} + +/* + load a file into memory from a fd. +*/ +char *fd_load(int fd, size_t *size) +{ + struct stat sbuf; + char *p; + + if (fstat(fd, &sbuf) != 0) return NULL; + + p = (char *)malloc(sbuf.st_size+1); + if (!p) return NULL; + + if (pread(fd, p, sbuf.st_size, 0) != sbuf.st_size) { + free(p); + return NULL; + } + p[sbuf.st_size] = 0; + + if (size) *size = sbuf.st_size; + + return p; +} + +/* + load a file into memory +*/ +char *file_load(const char *fname, size_t *size) +{ + int fd; + char *p; + + if (!fname || !*fname) return NULL; + + fd = open(fname,O_RDONLY); + if (fd == -1) return NULL; + + p = fd_load(fd, size); + close(fd); + + return p; +} + +/* + this is like fgets() but operates on a file descriptor +*/ +char *fd_gets(char *line, size_t maxsize, int fd) +{ + char c; + int n = 0; + while (n < (maxsize-1) && read(fd, &c, 1) == 1) { + line[n++] = c; + if (c == '\n') break; + } + line[n] = 0; + return n?line:NULL; +} + + +/* + like fopen() but uses printf style arguments for the file name +*/ +FILE *fopen_p(const char *fmt, const char *mode, ...) +{ + char *s = NULL; + FILE *f; + va_list ap; + va_start(ap, mode); + vasprintf(&s, fmt, ap); + va_end(ap); + if (!s) return NULL; + if (strstr(s, "..")) { + d_printf("Invalid filename [%s]\n", s); + free(s); + return NULL; + } + f = fopen(s, mode); + free(s); + return f; +} + +/* + like fopen() but doesn't allow opening of filenames containing '..' +*/ +FILE *fopen_s(const char *fname, const char *mode) +{ + return fopen_p("%s", mode, fname); +} + + +#ifndef HAVE_STRLCPY +/** + * Like strncpy but does not 0 fill the buffer and always null + * terminates. + * + * @param bufsize is the size of the destination buffer. + * + * @return index of the terminating byte. + **/ + size_t strlcpy(char *d, const char *s, size_t bufsize) +{ + size_t len = strlen(s); + size_t ret = len; + if (bufsize <= 0) return 0; + if (len >= bufsize) len = bufsize-1; + memcpy(d, s, len); + d[len] = 0; + return ret; +} +#endif + + +/* + set an integer value in a TDB +*/ +int tdb_set_int(TDB_CONTEXT *tdb, const char *name, int value) +{ + TDB_DATA key, data; + int ret; + + key.dptr = strdup(name); + key.dsize = strlen(name)+1; + + data.dptr = (char *)&value; + data.dsize = sizeof(value); + + ret = tdb_store(tdb, key, data, TDB_REPLACE); + free(key.dptr); + return ret; +} + +/* + get an integer value from a TDB. Return def_value if its not there +*/ +int tdb_get_int(TDB_CONTEXT *tdb, const char *name, int def_value) +{ + TDB_DATA key, data; + int ret; + + key.dptr = strdup(name); + key.dsize = strlen(name)+1; + + data = tdb_fetch(tdb, key); + free(key.dptr); + + if (!data.dptr) { + return def_value; + } + + ret = *(int *)data.dptr; + free(data.dptr); + + return ret; +} + + +/* + set a string value in a TDB +*/ +int tdb_set_string(TDB_CONTEXT *tdb, const char *name, const char *value) +{ + TDB_DATA key, data; + int ret; + + key.dptr = strdup(name); + key.dsize = strlen(name)+1; + + data.dptr = strdup(value); + data.dsize = strlen(value)+1; + + ret = tdb_store(tdb, key, data, TDB_REPLACE); + free(key.dptr); + free(data.dptr); + return ret; +} + +/* + get a string value from a TDB. Caller frees. +*/ +const char *tdb_get_string(TDB_CONTEXT *tdb, const char *name) +{ + TDB_DATA key, data; + + key.dptr = strdup(name); + key.dsize = strlen(name)+1; + + data = tdb_fetch(tdb, key); + free(key.dptr); + if (!data.dptr) { + return NULL; + } + return data.dptr; +} + +/* + delete a value from a TDB by string +*/ +int tdb_delete_string(TDB_CONTEXT *tdb, const char *name) +{ + TDB_DATA key; + int ret; + + key.dptr = strdup(name); + key.dsize = strlen(name)+1; + + ret = tdb_delete(tdb, key); + free(key.dptr); + return ret; +} diff --git a/lasker-2.2.3/src/utils.h b/lasker-2.2.3/src/utils.h new file mode 100644 index 0000000..da69b80 --- /dev/null +++ b/lasker-2.2.3/src/utils.h @@ -0,0 +1,51 @@ +/* + Copyright (c) 1993 Richard V. Nash. + Copyright (c) 2000 Dan Papasian + Copyright (C) Andrew Tridgell 2002 + + 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., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#ifndef _UTILS_H +#define _UTILS_H + +#define MAX_WORD_SIZE 1024 + +/* Maximum length of an output line */ +#define MAX_LINE_SIZE 1024 + +/* Maximum size of a filename */ +#ifdef FILENAME_MAX +# define MAX_FILENAME_SIZE FILENAME_MAX +#else +# define MAX_FILENAME_SIZE 1024 +#endif + +#define FlagON(VAR, FLAG) (VAR |= (FLAG)) +#define FlagOFF(VAR, FLAG) (VAR &= ~(FLAG)) +#define CheckFlag(VAR, FLAG) ((VAR) & (FLAG)) +#define BoolCheckFlag(VAR, FLAG) (CheckFlag(VAR, FLAG) ? 1 : 0) +#define ToggleFlag(VAR, FLAG) (VAR ^= (FLAG)) +#define SetFlag(VAR, FLAG, VALUE) ((VALUE) ? FlagON(VAR, FLAG) : FlagOFF(VAR, FLAG)) + +#define PFlagON(WHO, FLAG) FlagON(player_globals.parray[WHO].Flags, FLAG) +#define PFlagOFF(WHO, FLAG) FlagOFF(player_globals.parray[WHO].Flags, FLAG) +#define CheckPFlag(WHO, FLAG) CheckFlag(player_globals.parray[WHO].Flags, FLAG) +#define BoolCheckPFlag(WHO, FLAG) BoolCheckFlag(player_globals.parray[WHO].Flags, FLAG) +#define TogglePFlag(WHO, FLAG) ToggleFlag(player_globals.parray[WHO].Flags, FLAG) +#define SetPFlag(WHO, FLAG, VALUE) ((VALUE) ? PFlagON(WHO, FLAG) : PFlagOFF(WHO, FLAG)) + + +#endif /* _UTILS_H */ diff --git a/lasker-2.2.3/src/variable.c b/lasker-2.2.3/src/variable.c new file mode 100644 index 0000000..487b420 --- /dev/null +++ b/lasker-2.2.3/src/variable.c @@ -0,0 +1,997 @@ +/* + Copyright (c) 1993 Richard V. Nash. + Copyright (c) 2000 Dan Papasian + Copyright (C) Andrew Tridgell 2002 + + 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., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#include "includes.h" + +static int set_boolean_flag(int p, char *val, unsigned long flag) +{ + int v = -1; + + if (val == NULL) { + TogglePFlag(p, flag); + v = BoolCheckPFlag(p, flag); + return (v); + } + if (sscanf(val, "%d", &v) != 1) { + stolower(val); + if (!strcmp(val, "off") || !strcmp(val, "false")) + v = 0; + else if (!strcmp(val, "on") || !strcmp(val, "true")) + v = 1; + } + SetPFlag(p, flag, v); + return v; +} + +static int set_availinfo(int p, char *var, char *val) +{ + int v = set_boolean_flag(p, val, PFLAG_AVAIL); + + if (v < 0) + return VAR_BADVAL; + pprintf(p, "availinfo set to %d.\n", BoolCheckPFlag(p, PFLAG_AVAIL)); + + if (v > 0) + pprintf(p, "You will receive info on who is available to play.\n"); + else + pprintf(p, "You are no longer receiving info on who is available to play.\n"); + return VAR_OK; +} + +static int set_availmax(int p, char *var, char *val) +{ + struct player *pp = &player_globals.parray[p]; + int v = -1; + + if (!val) + return VAR_BADVAL; + if (sscanf(val, "%d", &v) != 1) + return VAR_BADVAL; + if ((v < 0) || (v > 9999)) + return VAR_BADVAL; + + if (v < pp->availmin) { + pprintf(p, "You can't set availmax to less than availmin.\n"); + return VAR_OK; + } + + if ((pp->availmax = v)) { + pprintf(p, "You will be notified of availability with blitz ratings %d - %d.\n",pp->availmin,v); + } else + pprintf(p, "You will be notified of all available players.\n"); + return VAR_OK; +} + +static int set_availmin(int p, char *var, char *val) +{ + struct player *pp = &player_globals.parray[p]; + int v = -1; + + if (!val) + return VAR_BADVAL; + if (sscanf(val, "%d", &v) != 1) + return VAR_BADVAL; + if ((v < 0) || (v > 9999)) + return VAR_BADVAL; + + if (v > pp->availmax) { + pprintf(p, "You can't set availmin to more than availmax.\n"); + return VAR_OK; + } + + pp->availmin = v; + pprintf(p, "You will be notified of availability with blitz ratings %d - %d.\n",v,pp->availmax); + return VAR_OK; +} + +static int set_open(int p, char *var, char *val) +{ + struct player *pp = &player_globals.parray[p]; + int v = set_boolean_flag(p, val, PFLAG_OPEN); + + if (v < 0) + return VAR_BADVAL; + if (v > 0) { + pprintf(p, "You are now open to receive match requests.\n"); + announce_avail (p); + } else { + decline_withdraw_offers(p, -1, PEND_MATCH,DO_DECLINE | DO_WITHDRAW); + pprintf(p, "You are no longer receiving match requests.\n"); + if (pp->game < 0) + announce_notavail (p); + } + return VAR_OK; +} + +static int set_tourney(int p, char *var, char *val) +{ + struct player *pp = &player_globals.parray[p]; + int v = set_boolean_flag(p, val, PFLAG_TOURNEY); + + if (v < 0) + return VAR_BADVAL; + if (v > 0) { + decline_withdraw_offers(p, -1, PEND_MATCH,DO_DECLINE | DO_WITHDRAW); + pprintf(p, "Your tournament variable is now set.\n"); + announce_notavail (p); + } else { + pprintf(p, "Your tournament variable is no longer set.\n"); + if (pp->game < 0) + announce_avail (p); + } + return VAR_OK; +} + +static int set_sopen(int p, char *var, char *val) +{ + int v = set_boolean_flag(p, val, PFLAG_SIMOPEN); + + if (v < 0) + return VAR_BADVAL; + pprintf(p, "sopen set to %d.\n", v); + + if (v > 0) + pprintf(p, "You are now open to receive simul requests.\n"); + else + pprintf(p, "You are no longer receiving simul requests.\n"); + decline_withdraw_offers(p, -1, PEND_SIMUL,DO_DECLINE); + return VAR_OK; +} + +static int set_ropen(int p, char *var, char *val) +{ + if (set_boolean_flag(p, val, PFLAG_ROPEN) < 0) + return VAR_BADVAL; + pprintf(p, "ropen set to %d.\n", BoolCheckPFlag(p, PFLAG_ROPEN)); + return VAR_OK; +} + +static int set_rated(int p, char *var, char *val) +{ + if (!CheckPFlag(p, PFLAG_REG)) { + pprintf(p, "You cannot change your rated status.\n"); + return VAR_OK; + } + if (set_boolean_flag(p, val, PFLAG_RATED) < 0) + return VAR_BADVAL; + pprintf(p, "rated set to %d.\n", BoolCheckPFlag(p, PFLAG_RATED)); + return VAR_OK; +} + +static int set_shout(int p, char *var, char *val) +{ + if (set_boolean_flag(p, val, PFLAG_SHOUT) < 0) + return VAR_BADVAL; + if (CheckPFlag(p, PFLAG_SHOUT)) + pprintf(p, "You will now hear shouts.\n"); + else + pprintf(p, "You will not hear shouts.\n"); + return VAR_OK; +} + +static int set_ads(int p, char *var, char *val) +{ + if (set_boolean_flag(p, val, PFLAG_ADS) < 0) + return VAR_BADVAL; + if (CheckPFlag(p, PFLAG_ADS)) + pprintf(p, "You will now hear ads.\n"); + else + pprintf(p, "You will not hear ads.\n"); + return VAR_OK; +} + +static int set_cshout(int p, char *var, char *val) +{ + if (set_boolean_flag(p, val, PFLAG_CSHOUT) < 0) + return VAR_BADVAL; + if (CheckPFlag(p, PFLAG_CSHOUT)) + pprintf(p, "You will now hear cshouts.\n"); + else + pprintf(p, "You will not hear cshouts.\n"); + return VAR_OK; +} + +static int set_kibitz(int p, char *var, char *val) +{ + if (set_boolean_flag(p, val, PFLAG_KIBITZ) < 0) + return VAR_BADVAL; + if (CheckPFlag(p, PFLAG_KIBITZ)) + pprintf(p, "You will now hear kibitzes.\n"); + else + pprintf(p, "You will not hear kibitzes.\n"); + return VAR_OK; +} +static int set_kiblevel(int p, char *var, char *val) +{ + struct player *pp = &player_globals.parray[p]; + int v = -1; + + if (!val) + return VAR_BADVAL; + if (sscanf(val, "%d", &v) != 1) + return VAR_BADVAL; + if ((v < 0) || (v > 9999)) + return VAR_BADVAL; + pp->kiblevel = v; + pprintf(p, "Kibitz level now set to: %d.\n", v); + return VAR_OK; +} + +static int set_tell(int p, char *var, char *val) +{ + if (set_boolean_flag(p, val, PFLAG_TELL) < 0) + return VAR_BADVAL; + if (CheckPFlag(p, PFLAG_TELL)) + pprintf(p, "You will now hear tells from unregistered users.\n"); + else + pprintf(p, "You will not hear tells from unregistered users.\n"); + return VAR_OK; +} + +static int set_notifiedby(int p, char *var, char *val) +{ + if (set_boolean_flag(p, val, PFLAG_NOTIFYBY) < 0) + return VAR_BADVAL; + if (CheckPFlag(p, PFLAG_NOTIFYBY)) + pprintf(p, "You will now hear if people notify you, but you don't notify them.\n"); + else + pprintf(p, "You will not hear if people notify you, but you don't notify them.\n"); + return VAR_OK; +} + +static int set_pinform(int p, char *var, char *val) +{ + if (set_boolean_flag(p, val, PFLAG_PIN) < 0) + return VAR_BADVAL; + if (CheckPFlag(p, PFLAG_PIN)) + pprintf(p, "You will now hear logins/logouts.\n"); + else + pprintf(p, "You will not hear logins/logouts.\n"); + return VAR_OK; +} + +static int set_ginform(int p, char *var, char *val) +{ + if (set_boolean_flag(p, val, PFLAG_GIN) < 0) + return VAR_BADVAL; + if (CheckPFlag(p, PFLAG_GIN)) + pprintf(p, "You will now hear game results.\n"); + else + pprintf(p, "You will not hear game results.\n"); + return VAR_OK; +} + +static int set_private(int p, char *var, char *val) +{ + if (set_boolean_flag(p, val, PFLAG_PRIVATE) < 0) + return VAR_BADVAL; + if (CheckPFlag(p, PFLAG_PRIVATE)) + pprintf(p, "Your games will be private.\n"); + else + pprintf(p, "Your games may not be private.\n"); + return VAR_OK; +} + +static int set_jprivate(int p, char *var, char *val) +{ + if (!CheckPFlag(p, PFLAG_REG)) { + pprintf(p, "Unregistered players may not keep a journal.\n"); + return VAR_OK; + } + + if (set_boolean_flag(p, val, PFLAG_JPRIVATE) < 0) + return VAR_BADVAL; + if (CheckPFlag(p, PFLAG_JPRIVATE)) + pprintf(p, "Your journal will be private.\n"); + else + pprintf(p, "Your journal will not be private.\n"); + return VAR_OK; +} + +static int set_automail(int p, char *var, char *val) +{ + if (set_boolean_flag(p, val, PFLAG_AUTOMAIL) < 0) + return VAR_BADVAL; + if (CheckPFlag(p, PFLAG_AUTOMAIL)) + pprintf(p, "Your games will be mailed to you.\n"); + else + pprintf(p, "Your games will not be mailed to you.\n"); + return VAR_OK; +} + +static int set_mailmess(int p, char *var, char *val) +{ + if (!CheckPFlag(p, PFLAG_REG)) { + pprintf(p, "Unregistered players may not receive messages.\n"); + return VAR_OK; + } + if (set_boolean_flag(p, val, PFLAG_MAILMESS) < 0) + return VAR_BADVAL; + if (CheckPFlag(p, PFLAG_MAILMESS)) + pprintf(p, "Your messages will be mailed to you.\n"); + else + pprintf(p, "Your messages will not be mailed to you.\n"); + return VAR_OK; +} + +static int set_pgn(int p, char *var, char *val) +{ + if (set_boolean_flag(p, val, PFLAG_PGN) < 0) + return VAR_BADVAL; + if (CheckPFlag(p, PFLAG_PGN)) + pprintf(p, "Games will now be mailed to you in PGN.\n"); + else + pprintf(p, "Games will now be mailed to you in FICS format.\n"); + return VAR_OK; +} + +static int set_bell(int p, char *var, char *val) +{ + if (set_boolean_flag(p, val, PFLAG_BELL) < 0) + return VAR_BADVAL; + if (CheckPFlag(p, PFLAG_BELL)) + pprintf(p, "Bell on.\n"); + else + pprintf(p, "Bell off.\n"); + return VAR_OK; +} + +static int set_highlight(int p, char *var, char *val) +{ + struct player *pp = &player_globals.parray[p]; + int v = -1; + + if (!val) + return VAR_BADVAL; + if (sscanf(val, "%d", &v) != 1) + return VAR_BADVAL; + if ((v < 0) || (v > 15)) + return VAR_BADVAL; + + if ((pp->highlight = v)) { + pprintf(p, "Highlight is now style "); + pprintf_highlight(p, "%d", v); + pprintf(p, ".\n"); + } else + pprintf(p, "Highlight is off.\n"); + return VAR_OK; +} + +static int set_style(int p, char *var, char *val) +{ + struct player *pp = &player_globals.parray[p]; + int v = -1; + + if (!val) + return VAR_BADVAL; + if (sscanf(val, "%d", &v) != 1) + return VAR_BADVAL; + if ((v < 1) || (v > MAX_STYLES)) + return VAR_BADVAL; + pp->style = v - 1; + pprintf(p, "Style %d set.\n", v); + return VAR_OK; +} + +static int set_flip(int p, char *var, char *val) +{ + if (set_boolean_flag(p, val, PFLAG_FLIP) < 0) + return VAR_BADVAL; + if (CheckPFlag(p, PFLAG_FLIP)) + pprintf(p, "Flip on.\n"); + else + pprintf(p, "Flip off.\n"); + return VAR_OK; +} +/* Was pointless as this is what notes are for +static int set_uscf(int p, char *var, char *val) +{ + int v = -1; + + if (!val) + return VAR_BADVAL; + if (sscanf(val, "%d", &v) != 1) + return VAR_BADVAL; + if ((v < 0) || (v > 3000)) + return VAR_BADVAL; + pp->uscfRating = v; + pprintf(p, "USCF Rating set to %d.\n", v); + return VAR_OK; +} +*/ +static int set_time(int p, char *var, char *val) +{ + struct player *pp = &player_globals.parray[p]; + int v = -1; + + if (!val) + return VAR_BADVAL; + if (sscanf(val, "%d", &v) != 1) + return VAR_BADVAL; + if ((v < 0) || (v > 240)) + return VAR_BADVAL; + pp->d_time = v; + pprintf(p, "Default time set to %d.\n", v); + return VAR_OK; +} + +static int set_inc(int p, char *var, char *val) +{ + struct player *pp = &player_globals.parray[p]; + int v = -1; + + if (!val) + return VAR_BADVAL; + if (sscanf(val, "%d", &v) != 1) + return VAR_BADVAL; + if ((v < 0) || (v > 300)) + return VAR_BADVAL; + pp->d_inc = v; + pprintf(p, "Default increment set to %d.\n", v); + return VAR_OK; +} + +static int set_height(int p, char *var, char *val) +{ + struct player *pp = &player_globals.parray[p]; + int v = -1; + + if (!val) + return VAR_BADVAL; + if (sscanf(val, "%d", &v) != 1) + return VAR_BADVAL; + if ((v < 5) || (v > 240)) + return VAR_BADVAL; + pp->d_height = v; + pprintf(p, "Height set to %d.\n", v); + return VAR_OK; +} + +static int set_width(int p, char *var, char *val) +{ + struct player *pp = &player_globals.parray[p]; + int v = -1; + + if (!val) + return VAR_BADVAL; + if (sscanf(val, "%d", &v) != 1) + return VAR_BADVAL; + if ((v < 32) || (v > 10000)) + return VAR_BADVAL; + pp->d_width = v; + pprintf(p, "Width set to %d.\n", v); + return VAR_OK; +} + +const char *Language(int i) +{ + static const char *Lang[NUM_LANGS] = {"English", "Spanish", "French", "Danish"}; + return Lang[i]; +} + +static int set_language (int p, char *var, char *val) +{ + struct player *pp = &player_globals.parray[p]; + int i, len, gotIt = -1; + + if (!val) + return VAR_BADVAL; + len = strlen(val); + for (i=0; i < NUM_LANGS; i++) { + if (strncasecmp(val, Language(i), len)) + continue; + if (gotIt >= 0) + return VAR_BADVAL; + else gotIt = i; + } + if (gotIt < 0) + return VAR_BADVAL; + pp->language = gotIt; + pprintf(p, "Language set to %s.\n", Language(gotIt)); + return VAR_OK; +} + +static int set_promote(int p, char *var, char *val) +{ + struct player *pp = &player_globals.parray[p]; + if (!val) + return VAR_BADVAL; + stolower(val); + switch (val[0]) { + case 'q': + pp->promote = QUEEN; + pprintf(p, "Promotion piece set to QUEEN.\n"); + break; + case 'r': + pp->promote = ROOK; + pprintf(p, "Promotion piece set to ROOK.\n"); + break; + case 'b': + pp->promote = BISHOP; + pprintf(p, "Promotion piece set to BISHOP.\n"); + break; + case 'n': + case 'k': + pp->promote = KNIGHT; + pprintf(p, "Promotion piece set to KNIGHT.\n"); + break; + default: + return VAR_BADVAL; + } + return VAR_OK; +} + + +static int set_interface(int p, char *var, char *val) +{ + struct player *pp = &player_globals.parray[p]; + if (!val) { + FREE(pp->interface); + return VAR_OK; + } + if (!printablestring(val)) + return VAR_BADVAL; + FREE(pp->interface); + asprintf(&pp->interface, "%s", val); + return VAR_OK; +} + +static int set_prompt(int p, char *var, char *val) +{ + struct player *pp = &player_globals.parray[p]; + char *prompt; + if (!val) { + free(pp->prompt); + pp->prompt = config_get("DEFAULT_PROMPT"); + return VAR_OK; + } + if (!printablestring(val)) + return VAR_BADVAL; + free(pp->prompt); + asprintf(&prompt, "%s", val); + pp->prompt = prompt; + return VAR_OK; +} + +static int RePartner (int p, int new) +{ + struct player *pp = &player_globals.parray[p]; + int pOld; + + if (p < 0) + return -1; + pOld = pp->partner; + if (pOld >= 0) { + if (player_globals.parray[pOld].partner == p) { + if (new >= 0) + pprintf_prompt (pOld, "Your partner has just chosen a new partner.\n"); + else { + pprintf (pOld, "Your partner has unset his/her partner variable.\n"); + pprintf_prompt (pOld, "You are no longer %s's partner.\n",pp->name); + } + decline_withdraw_offers (pOld, -1, PEND_BUGHOUSE,DO_DECLINE | DO_WITHDRAW); + player_globals.parray[pOld].partner = -1; + } + } + decline_withdraw_offers(p, -1, PEND_BUGHOUSE,DO_DECLINE | DO_WITHDRAW); + decline_withdraw_offers(p, -1, PEND_PARTNER,DO_DECLINE | DO_WITHDRAW); + pp->partner = new; + return new; +} + +int com_partner(int p, param_list param) +{ + struct player *pp = &player_globals.parray[p]; + int pNew; + struct pending* pend; + + if (param[0].type == TYPE_NULL) { + if (pp->partner >= 0) + pprintf (p, "You no longer have a bughouse partner.\n"); + else pprintf (p, "You do not have a bughouse partner.\n"); + RePartner(p, -1); + return COM_OK; + } + /* OK, we're trying to set a new partner. */ + pNew = player_find_part_login(param[0].val.word); + if (pNew < 0 || player_globals.parray[pNew].status == PLAYER_PASSWORD + || player_globals.parray[pNew].status == PLAYER_LOGIN) { + pprintf(p, "No user named \"%s\" is logged in.\n", param[0].val.word); + return COM_OK; + } + if (pNew == p) { + pprintf(p, "You can't be your own bughouse partner.\n"); + return COM_OK; + } + /* Now we know a legit partner has been chosen. Is an offer pending? */ + if ((pend = find_pend(pNew, p, PEND_PARTNER)) != NULL) { + pprintf (p, "You agree to be %s's partner.\n", player_globals.parray[pNew].name); + Bell (pNew); + pprintf_prompt (pNew, "%s agrees to be your partner.\n", pp->name); + + delete_pending (pend); + + /* Make the switch. */ + RePartner (p, pNew); + RePartner (pNew, p); + return COM_OK; + } + /* This is just an offer. Make sure a new partner is needed. */ + if (player_globals.parray[pNew].partner >= 0) { + pprintf(p, "%s already has a partner.\n", player_globals.parray[pNew].name); + return COM_OK; + } + pprintf(pNew, "\n"); + pprintf_highlight(pNew, "%s", pp->name); + Bell (pNew); + pprintf(pNew, " offers to be your bughouse partner; "); + pprintf_prompt(pNew, "type \"partner %s\" to accept.\n", pp->name); + pprintf(p, "Making a partnership offer to %s.\n", player_globals.parray[pNew].name); + add_request(p, pNew, PEND_PARTNER); + + return COM_OK; +} + +static int set_busy(int p, char *var, char *val) +{ + struct player *pp = &player_globals.parray[p]; + if (!val) { + if (pp->busy != NULL) { + free (pp->busy); + pp->busy = NULL; + } + pprintf(p, "Your \"busy\" string was cleared.\n"); + return VAR_OK; + } + if ((val) && (!printablestring(val))) + return VAR_BADVAL; + pp->busy = strdup(val); + pprintf(p, "Your \"busy\" string was set to \" %s\"\n", pp->busy); + return VAR_OK; +} + +/* this is really ugly */ +static int set_plan(int p, char *var, char *val) +{ + struct player *pp = &player_globals.parray[p]; + int which; + int i; + + if (val && !printablestring(val)) + return VAR_BADVAL; + which = atoi(var); /* Must be an integer, no test needed */ + + if (which > MAX_PLAN) + return VAR_BADVAL; + + if (which > pp->num_plan) + which = pp->num_plan + 1; + + if (which == 0) { /* shove from top */ + if (pp->num_plan >= MAX_PLAN) { /* free the bottom string */ + if (pp->planLines[pp->num_plan - 1] != NULL) + free(pp->planLines[pp->num_plan - 1]); + } + if (pp->num_plan) { + for (i = (pp->num_plan >= MAX_PLAN) ? MAX_PLAN - 1 : pp->num_plan; i > 0; i--) + pp->planLines[i] = pp->planLines[i - 1]; + } + if (pp->num_plan < MAX_PLAN) + pp->num_plan++; +/* kludged the next line: "" was NULL, but crashed on pprintf. fb 2.24.96 */ + pp->planLines[0] = ((val == NULL) ? "": strdup(val)); + pprintf(p, "\nPlan variable %d changed to '%s'.\n", which+1, pp->planLines[which]); + pprintf(p, "All other variables moved down.\n"); + return VAR_OK; + } + if (which > pp->num_plan) { /* new line at bottom */ + if (pp->num_plan >= MAX_PLAN) { /* shove the old lines up */ + if (pp->planLines[0] != NULL) + free(pp->planLines[0]); + for (i = 0; i < pp->num_plan; i++) + pp->planLines[i] = pp->planLines[i + 1]; + } else { + pp->num_plan++; + } +/* kludged the next line: "" was NULL, but crashed on pprintf. fb2.24.96 */ + pp->planLines[which - 1] = ((val == NULL) ? "": strdup(val)); + pprintf(p, "\nPlan variable %d changed to '%s'.\n", which, pp->planLines[which-1]); + return VAR_OK; + } + which--; + if (pp->planLines[which] != NULL) { + free(pp->planLines[which]); + } + if (val != NULL) { + pp->planLines[which] = strdup(val); + pprintf(p, "\nPlan variable %d changed to '%s'.\n", which+1, pp->planLines[which]); + } else { + pp->planLines[which] = NULL; + if (which == pp->num_plan - 1) { /* clear nulls from bottom */ + while ((pp->num_plan > 0) && (pp->planLines[pp->num_plan - 1] == NULL)) { + pp->num_plan--; + pprintf(p, "\nPlan variable %d cleared.\n", which+1); + } + } else if (which == 0) { /* clear nulls from top */ + while ((which < pp->num_plan) && (pp->planLines[which] == NULL)) { + which++; + } + if (which != pp->num_plan) { + for (i = which; i < pp->num_plan; i++) + pp->planLines[i - which] = pp->planLines[i]; + } + pp->num_plan -= which; + } + } + return VAR_OK; +} + +static int set_formula(int p, char *var, char *val) +{ + int which; + struct player *me = &player_globals.parray[p]; + +#ifdef NO_FORMULAS + pprintf(p, "Sorry -- not available because of a bug\n"); + return COM_OK; +#else + if (isdigit(var[1])) + which = var[1] - '1'; + else + which = MAX_FORMULA; + + if (val != NULL) { + val = eatwhite(val); + if (val[0] == '\0') + val = NULL; + } + if (!SetValidFormula(p, which, val)) + return VAR_BADVAL; + + if (which < MAX_FORMULA) { + if (val != NULL) { + while (me->num_formula < which) { + me->formulaLines[me->num_formula] = NULL; + (me->num_formula)++; + } + if (me->num_formula <= which) + me->num_formula = which + 1; + pprintf(p, "Formula variable f%d set to %s.\n", + which + 1, me->formulaLines[which]); + return VAR_OK; + } + pprintf(p, "Formula variable f%d unset.\n", which + 1); + if (which + 1 >= me->num_formula) { + while (which >= 0 && me->formulaLines[which] == NULL) + which--; + me->num_formula = which + 1; + } + } else { + if (me->formula != NULL) + pprintf(p, "Formula set to %s.\n", me->formula); + else + pprintf(p, "Formula unset.\n"); + } + return VAR_OK; +#endif +} + +static var_list variables[] = { + {"ads", set_ads}, + {"availinfo", set_availinfo}, + {"availmax", set_availmax}, + {"availmin", set_availmin}, + {"open", set_open}, + {"tourney", set_tourney}, + {"simopen", set_sopen}, + {"rated", set_rated}, + {"ropen", set_ropen}, + {"cshout", set_cshout}, + {"shout", set_shout}, + {"kibitz", set_kibitz}, + {"kiblevel", set_kiblevel}, + {"tell", set_tell}, + {"notifiedby", set_notifiedby}, + {"pinform", set_pinform}, + {"i_login", set_pinform}, + {"ginform", set_ginform}, + {"i_game", set_ginform}, + {"automail", set_automail}, + {"mailmess", set_mailmess}, + {"bell", set_bell}, + {"pgn", set_pgn}, + {"private", set_private}, + {"jprivate", set_jprivate}, + {"highlight", set_highlight}, + {"style", set_style}, + {"flip", set_flip}, + {"prompt", set_prompt}, + {"promote", set_promote}, + {"time", set_time}, + {"inc", set_inc}, + {"height", set_height}, + {"width", set_width}, + {"language", set_language}, + {"busy", set_busy}, + {"0", set_plan}, + {"1", set_plan}, + {"2", set_plan}, + {"3", set_plan}, + {"4", set_plan}, + {"5", set_plan}, + {"6", set_plan}, + {"7", set_plan}, + {"8", set_plan}, + {"9", set_plan}, + {"10", set_plan}, + {"f1", set_formula}, + {"f2", set_formula}, + {"f3", set_formula}, + {"f4", set_formula}, + {"f5", set_formula}, + {"f6", set_formula}, + {"f7", set_formula}, + {"f8", set_formula}, + {"f9", set_formula}, + {"formula", set_formula}, + {"interface", set_interface}, + {NULL, NULL} +}; + +static int set_find(char *var) +{ + int i = 0; + int gotIt = -1; + int len = strlen(var); + + while (variables[i].name) { + if (!strncmp(variables[i].name, var, len)) { + if (len == strlen(variables[i].name)) { + return i; + } else if (gotIt >= 0) { + return -VAR_AMBIGUOUS; + } + gotIt = i; + } + i++; + } + if (gotIt >= 0) { + return gotIt; + } + return -VAR_NOSUCH; +} + +int var_set(int p, char *var, char *val, int *wh) +{ + int which; + + if (!var) + return VAR_NOSUCH; + if ((which = set_find(var)) < 0) { + return -which; + } + *wh = which; + return variables[which].var_func(p, (isdigit(*variables[which].name) ? var : variables[which].name), val); +} + +int com_variables(int p, param_list param) +{ + int p1, connected; + int i; + + if (param[0].type == TYPE_WORD) { + if (!FindPlayer(p, param[0].val.word, &p1, &connected)) + return COM_OK; + } else { + p1 = p; + connected = 1; + } + + pprintf(p, "Variable settings of %s:\n\n", player_globals.parray[p1].name); + + pprintf(p, "time=%-3d private=%d shout=%d pin=%d style=%-3d\n", + player_globals.parray[p1].d_time, BoolCheckPFlag(p1, PFLAG_PRIVATE), + BoolCheckPFlag(p1, PFLAG_SHOUT), BoolCheckPFlag(p1, PFLAG_PIN), + player_globals.parray[p1].style + 1); + pprintf(p, "inc=%-3d jprivate=%d cshout=%d notifiedby=%d flip=%d\n", + player_globals.parray[p1].d_inc, BoolCheckPFlag(p1, PFLAG_JPRIVATE), + BoolCheckPFlag(p1, PFLAG_CSHOUT), BoolCheckPFlag(p1, PFLAG_NOTIFYBY), + BoolCheckPFlag(p1, PFLAG_FLIP)); + pprintf(p, " kibitz=%d availinfo=%d highlight=%d\n", + BoolCheckPFlag(p1, PFLAG_KIBITZ), BoolCheckPFlag(p1, PFLAG_AVAIL), + player_globals.parray[p1].highlight); + pprintf(p, "rated=%d automail=%d kiblevel=%-4d availmin=%-4d bell=%d\n", + BoolCheckPFlag(p1, PFLAG_RATED), BoolCheckPFlag(p1, PFLAG_AUTOMAIL), + player_globals.parray[p1].kiblevel, player_globals.parray[p1].availmin, + BoolCheckPFlag(p1, PFLAG_BELL)); + pprintf(p, "ropen=%d pgn=%d tell=%d availmax=%-4d width=%-3d\n", + BoolCheckPFlag(p1, PFLAG_ROPEN), BoolCheckPFlag(p1, PFLAG_PGN), + BoolCheckPFlag(p1, PFLAG_TELL), player_globals.parray[p1].availmax, + player_globals.parray[p1].d_width); + pprintf(p, "open=%d mailmess=%d gin=%d height=%-3d\n", + BoolCheckPFlag(p1, PFLAG_OPEN), BoolCheckPFlag(p1, PFLAG_MAILMESS), + BoolCheckPFlag(p1, PFLAG_GIN), player_globals.parray[p1].d_height); + pprintf(p, "simopen=%d tourney=%d Lang=%s", + BoolCheckPFlag(p1, PFLAG_SIMOPEN), BoolCheckPFlag(p1, PFLAG_TOURNEY), + Language(player_globals.parray[p1].language)); + + if (player_globals.parray[p1].prompt) + pprintf(p, " Prompt: %s\n", player_globals.parray[p1].prompt); + else + pprintf(p, "\n"); + + if (player_globals.parray[p1].partner >= 0) + pprintf(p, "\nBughouse partner: %s\n", player_globals.parray[player_globals.parray[p1].partner].name); + + if (player_globals.parray[p1].num_formula) { + pprintf(p, "\n"); + for (i = 0; i < player_globals.parray[p1].num_formula; i++) { + if (player_globals.parray[p1].formulaLines[i] != NULL) + pprintf(p, " f%d: %s\n", i + 1, player_globals.parray[p1].formulaLines[i]); + else + pprintf(p, " f%d:\n", i + 1); + } + } + if (player_globals.parray[p1].formula != NULL) + pprintf(p, "\nFormula: %s\n", player_globals.parray[p1].formula); + else + pprintf(p, "\n"); + + if (!connected) + player_remove(p1); + return COM_OK; +} + +/* tournset (cause settourney is BAD for set) + * used by Tournament Director programs to set/unset the + * tourney variable of another registered player. + * fics usage: tournset playername int (int can be 0 or 1) + */ +int com_tournset(int p, param_list param) +{ + struct player *pp = &player_globals.parray[p]; + int p1, v; + + if (!in_list(p, L_TD, pp->name)) { + pprintf(p, "Only TD programs are allowed to use this command.\n"); + return COM_OK; + } + if (((p1 = player_find_bylogin(param[0].val.word)) < 0) + || (!CheckPFlag(p1, PFLAG_REG))) { + return COM_OK; + } + v = BoolCheckPFlag(p1, PFLAG_TOURNEY); + if (param[1].val.integer == 0) { /* set it to 0 */ + if (v == 1) { + SetPFlag(p1, PFLAG_TOURNEY, 0); + pprintf_prompt(p1, "\n%s has set your tourney variable to OFF.\n", + pp->name); + } + } else { /* set it to 1 */ + if (v == 0) { + SetPFlag(p1, PFLAG_TOURNEY, 1); + pprintf_prompt(p1, "\n%s has set your tourney variable to ON.\n", + pp->name); + } + } + return COM_OK; +} + + diff --git a/lasker-2.2.3/src/variable.h b/lasker-2.2.3/src/variable.h new file mode 100644 index 0000000..e7ac700 --- /dev/null +++ b/lasker-2.2.3/src/variable.h @@ -0,0 +1,47 @@ +/* + Copyright (c) 1993 Richard V. Nash. + Copyright (c) 2000 Dan Papasian + Copyright (C) Andrew Tridgell 2002 + + 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., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +/* Revision history: + name email yy/mm/dd Change + Richard Nash 93/10/22 Created +*/ + +#ifndef VARIABLE_H +#define VARIABLE_H + +typedef struct var_list { + char *name; + int (*var_func)(); +} var_list; + +#define VAR_OK 0 +#define VAR_NOSUCH 1 +#define VAR_BADVAL 2 +#define VAR_AMBIGUOUS 3 + +#define LANG_ENGLISH 0 +#define LANG_SPANISH 1 +#define LANG_FRENCH 2 +#define LANG_DANISH 3 +#define NUM_LANGS 4 + +extern var_list variables[]; + +#endif /* VARIABLE_H */ diff --git a/lasker-2.2.3/src/vers.h b/lasker-2.2.3/src/vers.h new file mode 100644 index 0000000..7529cd7 --- /dev/null +++ b/lasker-2.2.3/src/vers.h @@ -0,0 +1,9 @@ + +#ifndef VERS_H +#define VERS_H + +extern char SGS_VERS[]; +extern char VERS_NUM[]; +extern char COMP_DATE[]; + +#endif /* VERS_H */ diff --git a/lasker-2.2.3/testplay/CVS/Entries b/lasker-2.2.3/testplay/CVS/Entries new file mode 100644 index 0000000..8694154 --- /dev/null +++ b/lasker-2.2.3/testplay/CVS/Entries @@ -0,0 +1,2 @@ +/play2.pl/1.3/Sun Jul 18 08:46:32 2004// +D diff --git a/lasker-2.2.3/testplay/CVS/Repository b/lasker-2.2.3/testplay/CVS/Repository new file mode 100644 index 0000000..0c1be77 --- /dev/null +++ b/lasker-2.2.3/testplay/CVS/Repository @@ -0,0 +1 @@ +lasker/testplay diff --git a/lasker-2.2.3/testplay/CVS/Root b/lasker-2.2.3/testplay/CVS/Root new file mode 100644 index 0000000..c42ba94 --- /dev/null +++ b/lasker-2.2.3/testplay/CVS/Root @@ -0,0 +1 @@ +/home/cvs diff --git a/lasker-2.2.3/testplay/play2.pl b/lasker-2.2.3/testplay/play2.pl new file mode 100755 index 0000000..7a355e5 --- /dev/null +++ b/lasker-2.2.3/testplay/play2.pl @@ -0,0 +1,326 @@ +#!/usr/bin/perl +# +# Quick and nasty script to load a game record and play it +# through via a FICS server. +# +# Anthony Wesley and Andrew Tridgell, July 2004 +# +# Usage: play2.pl server client1/passwd1 client2/passwd2 +# +# Reads game records on stdin. +# + +use IO::Socket; + +my $server = shift @ARGV; +my ($client1,$pass1) = split(/\//, shift @ARGV); +my ($client2,$pass2) = split(/\//, shift @ARGV); + +print "Connecting to $server , port 5000\n"; +print "[$client1 / $pass1 ] , [$client2 / $pass2 ]\n"; + +my $S1 = new IO::Socket::INET( + PeerAddr => $server, + PeerPort => 5000, + Proto => 'tcp', + ReuseAddr => 1 + ) or die "Could not connect"; + +my $S2 = new IO::Socket::INET( + PeerAddr => $server, + PeerPort => 5000, + Proto => 'tcp', + ReuseAddr => 1 + ) or die "Could not connect"; + +$S1->setsockopt(&Socket::IPPROTO_TCP, &Socket::TCP_NODELAY, 1) || die; +$S2->setsockopt(&Socket::IPPROTO_TCP, &Socket::TCP_NODELAY, 1) || die; + +print "Connection opened. Logging in...\n"; + +Login($S1,$client1,$pass1) or die "Could not login $client1"; +Login($S2,$client2,$pass2) or die "Could not login $client2"; + +sleep(3); + +print "Logged in\n"; + +# ensure we don't have any left over games +$S1->print("resign $client2\n"); + +print "Reading game record from stdin...\n"; +my $game = ""; +my $game_comment = ""; +my $game_num = 0; + +while(my $line = ) { + chomp $line; + if ($line =~ /^\[/ || $line eq "") { + if ($game eq "") { + $game_comment .= "$line\n"; + next; + } + $game = extract_moves($game); + $game_num++; + print "Starting game $game_num\n"; + PlayGame($S1,$S2,$game); + $game = ""; + $game_comment = ""; + next; + } + $game .= $line . " "; +} + +sub PlayGame($$$) +{ + my $s1 = shift; + my $s2 = shift; + my $game = shift; + + Challenge($s1,$client1,$s2,$client2) or die "Could not setup game"; + + my $res = Play($s1, $s2, $game); + if ($res ne "OK") { + $s1->print("resign\n"); + + print "Writing bad game - $res\n"; + + local(*FILE); + open(FILE, ">>badgames.txt") || die "can't open badgames.txt"; + print FILE "[$res]\n$game\n\n"; + close(FILE); + } + + WaitFor($s1, "$client1 vs. $client2"); + WaitFor($s2, "$client1 vs. $client2"); + + WaitFor($s1, "No ratings adjustment done"); + WaitFor($s2, "No ratings adjustment done"); +} + + +sub Login($$$) +{ + my $s = shift; + my $name = shift; + my $pass = shift; + + $s->print($name . "\n"); + $s->print($pass . "\n"); + $s->print("set style 12\n\n"); + + return 1; +} + +sub extract_moves($) +{ + my $txt = shift; + my $moves = ""; + + my @lines = split(/[\n\r]+/, $txt); + foreach my $l (@lines) { + # Strip + $l =~ s/^\s+//; $l =~ s/\s+$//; + + # Maybe metadata? + next if $l =~ /^\s+\[/; + + # Maybe contains moves? + $moves .= $l . " "; + } + + # Strip out the move numbers +# $moves =~ s/\d+\.\s+//g; + + return $moves; +} + +sub Challenge($$$$) +{ + my $s1 = shift; # socket for client1 + my $client1 = shift; # username for initiator + my $s2 = shift; # socket for receipient + my $client2 = shift; # name of receipient + + $s1->print("match $client2 1 1 w u\n"); + + WaitFor($s1, "Issuing: $client1"); + WaitFor($s2, "Challenge: $client1"); + WaitFor($s2, "You can \"accept\""); + $s2->print("accept\n"); + WaitFor($s2,"You accept the challenge of $client1"); + WaitFor($s1,"$client2 accepts your challenge"); + WaitFor($s1,"Creating: $client1"); + WaitFor($s1,".$client1 vs. $client2. Creating"); + WaitFor($s2,"Creating: $client1"); + WaitFor($s2,".$client1 vs. $client2. Creating"); + + return 1; +} + +sub Play($$$) +{ + my $s1 = shift; + my $s2 = shift; + my $game = shift; + + my $who_to_move = "w"; + my @moves = split(/\s+/, $game); + + my $movenum = 1; + my $res = "OK"; + + CheckMove($s1,"none") || return "Initialisation failed for white"; + CheckMove($s2,"none") || return "Initialisation failed for black"; + + foreach my $m (@moves) { + next if ($m =~ /^\d/); + last if ($m =~ /^\[/); + my $p1, $p2; + + if ($who_to_move eq "w") { + $p1 = $s1; + $p2 = $s2; +# print "White moves $movenum. $m\n"; + } else { + $p1 = $s2; + $p2 = $s1; +# print "Black moves $movenum ... $m\n"; + } + + SendMove($p1,$m); + + $res = CheckMove($p1,$m); + if ($res ne "OK") { + return "Failed on move $movenum - $res"; + } + + $res = CheckMove($p2,$m); + if ($res ne "OK") { + return "Failed on move $movenum - $res"; + } + + # Change sides + if ($who_to_move eq "b") { + $movenum++; + $who_to_move = "w"; + } else { + $who_to_move = "b"; + } + } + + # Resign + if ($who_to_move eq "w") { + Resign($s1); + } else { + Resign($s2); + } + + return "OK"; +} + +sub SendMove($$) +{ + my $s = shift; + my $m = shift; + + $s->print($m . "\n"); + + return 0; +} + +sub CheckMove($$) +{ + my $s = shift; + my $m = shift; + + # Readback to check + while ($l = $s->getline) { + chomp $l; +# print "line3=\n[[[$l\n]]]\n"; + if ($l =~ /^\s+fics%\s+$/) { + next; + } + if ($l =~ /^\s+$/) { + next; + } + if ($l =~ /Illegal Move/i) { + return "Server reports illegal move $m"; + } + if ($l =~ /Ambiguous Move/i) { + return "Server reports ambiguous move $m"; + } + my $rmove = ParseStyle12($l); + if ($rmove eq "") { + print "$l\n"; + next; + } + if (!MoveEqual($rmove,$m)) { + return "wrong RecvMove $rmove should be $m"; + } + return "OK"; + } + + return "eof from server"; +} + +sub ParseStyle12($) +{ + my $s = shift; + my $m = ""; + if ($s =~ /\<12\>.*\(\d+\:\d\d\)\s(\S+)/m) { + $m = $1; +# print "Move=$m\n"; + } + return $m; +} + +sub Resign($) +{ + my $s = shift; + + $s->print("resign\n"); +} + +sub MoveEqual($$) +{ + my $m1 = shift; + my $m2 = shift; + + # remove check and good move markers + if ($m1 =~ /^(.*)[+!]/) { + $m1 = $1; + } + + if ($m2 =~ /^(.*)[+!]/) { + $m2 = $1; + } + + if ($m1 eq $m2) { + return 1; + } + + return 0; +} + +sub WaitFor($$) +{ + my $s = shift; + my $str = shift; + + + while (my $l = $s->getline) { + chomp $l; + if ($l =~ /$str/) { +# print "GOT: $str\n"; + return; + } + if ($l =~ /^\s+fics%\s+$/) { + next; + } + if ($l =~ /^\s+$/) { + next; + } + print "$l\n"; + } +} diff --git a/lasker-2.2.3/tests/CVS/Entries b/lasker-2.2.3/tests/CVS/Entries new file mode 100644 index 0000000..cc76ab8 --- /dev/null +++ b/lasker-2.2.3/tests/CVS/Entries @@ -0,0 +1,3 @@ +/test1.exp/1.2/Sat Jun 29 00:18:43 2002// +/setup.exp/1.1/Mon Jul 1 04:10:04 2002// +D diff --git a/lasker-2.2.3/tests/CVS/Repository b/lasker-2.2.3/tests/CVS/Repository new file mode 100644 index 0000000..3ed14b9 --- /dev/null +++ b/lasker-2.2.3/tests/CVS/Repository @@ -0,0 +1 @@ +lasker/tests diff --git a/lasker-2.2.3/tests/CVS/Root b/lasker-2.2.3/tests/CVS/Root new file mode 100644 index 0000000..c42ba94 --- /dev/null +++ b/lasker-2.2.3/tests/CVS/Root @@ -0,0 +1 @@ +/home/cvs diff --git a/lasker-2.2.3/tests/setup.exp b/lasker-2.2.3/tests/setup.exp new file mode 100755 index 0000000..5867a8b --- /dev/null +++ b/lasker-2.2.3/tests/setup.exp @@ -0,0 +1,62 @@ +#!/usr/bin/expect -f +# simple test setup script for lasker +# Andrew Tridgell + +if {$argc < 3} { + send_user "Usage: setup.exp HOSTNAME USERNAME PASSWORD\n" + exit +} + +set host [lrange $argv 0 0] +set user [lrange $argv 1 1] +set pass [lrange $argv 2 2] + +set timeout -1 +match_max 100000 + +spawn telnet $host 5000 +expect "\rlogin: " +send "admin\r" +expect "Press return to enter the FICS" +send "\r" +expect "fics% " + +send "addplayer admin none The Admin\r" +expect "Added: " +expect "fics% " + +send "asetpass admin $pass\r" +expect "has changed your password" +expect "fics% " + +# login again +spawn telnet $host 5000 +expect "\rlogin: " +send "$user\r" +expect "password: " +send "$pass\r" +expect "fics% " + +send "who\r" +expect "$user" +expect "players displayed" +expect "indicates system administrator." +expect "fics% " + +send "aconfig\r" +expect "fics% " + +send "aconfig SERVER_LOCATION test location\r" +expect "fics% " + +send "aconfig SERVER_HOSTNAME test\r" +expect "fics% " + +send "aconfig HEAD_ADMIN_EMAIL nobody@samba.org\r" +expect "fics% " + +send "aconfig\r" +expect "fics% " + +send "quit\r" +expect "Thank you" diff --git a/lasker-2.2.3/tests/test1.exp b/lasker-2.2.3/tests/test1.exp new file mode 100755 index 0000000..ebe2e15 --- /dev/null +++ b/lasker-2.2.3/tests/test1.exp @@ -0,0 +1,90 @@ +#!/usr/bin/expect -f +# simple test script for lasker +# Andrew Tridgell + +if {$argc < 3} { + send_user "Usage: test.exp HOSTNAME USERNAME PASSWORD\n" + exit +} + +set host [lrange $argv 0 0] +set user [lrange $argv 1 1] +set pass [lrange $argv 2 2] + +set timeout -1 +match_max 100000 +spawn tseal $host 5000 +expect "\rlogin: " +send "$user\r" +expect "password: " +send "$pass\r" +expect "fics% " + +send "who\r" +expect "$user" +expect "players displayed" +expect "indicates system administrator." +expect "fics% " + +send "who a\r" +expect "$user" +expect "players displayed" +expect "indicates system administrator." +expect "fics% " + +send "who z\r" +expect "Command: who" +expect "See 'help who' for a complete description" +expect "fics% " + +send "zzdf\r" +expect "zzdf: Command not found." +expect "fics% " + +send "help f\r" +expect "'f' is a global alias for 'finger'" +expect "fics% " + +send "help c\r" +expect -- "-- Matches: " +expect "help topics --" +expect "clearmessages" +expect "fics% " + +send -- "-notify tridge\r" +send "+notify tridge\r" +expect "added to your notify list." +expect "fics% " + +send "+notify tridge\r" +expect "is already on your notify list." +expect "fics% " + +send "=notify\r" +expect -- "-- notify list: 1 names --" +expect "fics% " + +send "toggle notify tridge\r" +expect "removed from your notify list." +expect "fics% " + +send "set style 12\r" +send "match $user\r" +expect "<12> rnbqkbnr pppppppp -------- -------- -------- -------- PPPPPPPP RNBQKBNR" +expect "fics% " + +send "e4\r" +expect "<12> rnbqkbnr pppppppp -------- -------- ----P--- -------- PPPP-PPP RNBQKBNR" +expect "fics% " + +send "e5\r" +expect "<12> rnbqkbnr pppp-ppp -------- ----p--- ----P--- -------- PPPP-PPP RNBQKBNR" +expect "fics% " + +send "unexamine\r" +expect "You are no longer examining game" +expect "fics% " + + +send -- "quit\r" +expect "Thank you for using a" diff --git a/lasker-2.2.3/timeseal/CVS/Entries b/lasker-2.2.3/timeseal/CVS/Entries new file mode 100644 index 0000000..93e8a61 --- /dev/null +++ b/lasker-2.2.3/timeseal/CVS/Entries @@ -0,0 +1,3 @@ +/README/1.1/Wed Jun 12 02:44:07 2002// +/timeseal_decoder-Linux-ELF-2.4/1.1/Wed Jun 12 01:06:02 2002/-kb/ +D diff --git a/lasker-2.2.3/timeseal/CVS/Repository b/lasker-2.2.3/timeseal/CVS/Repository new file mode 100644 index 0000000..d41ff90 --- /dev/null +++ b/lasker-2.2.3/timeseal/CVS/Repository @@ -0,0 +1 @@ +lasker/timeseal diff --git a/lasker-2.2.3/timeseal/CVS/Root b/lasker-2.2.3/timeseal/CVS/Root new file mode 100644 index 0000000..c42ba94 --- /dev/null +++ b/lasker-2.2.3/timeseal/CVS/Root @@ -0,0 +1 @@ +/home/cvs diff --git a/lasker-2.2.3/timeseal/README b/lasker-2.2.3/timeseal/README new file mode 100644 index 0000000..53b9f4c --- /dev/null +++ b/lasker-2.2.3/timeseal/README @@ -0,0 +1,37 @@ +Introduction +------------ + +This chess server supports the 'timeseal' protocol for keeping more +accurate track of players time usage. + +Unlike previous chess servers that had to have the timeseal code built +in in this server uses a small external timeseal_decoder process whose +sole purpose is to decode the timeseal protocol. You can enable this +process (and thus enable timeseal support) using the -T option to +chessd. + +The reasons I designed it this way are: + + - it keeps the timeseal protocol secret, and the protocol relies + on its secrecy to prevent cheating + - it allows me to use GPLd code in the chess server while not + distributing the timeseal decoder source code + + +Using timeseal +-------------- + +To use timeseal in your chess server just pass the location of your +timeseal_decoder binary to the -T option. For example: + + bin/chessd -T bin/timeseal_decoder -p 5000 + +If you also use the -R option to setup a secure chroot jail for your +chess server then you must pass the -T option before the -R option. + + + +-------------------------------- +Andrew Tridgell +tridge@chess.samba.org June 2002 +-------------------------------- diff --git a/lasker-2.2.3/timeseal/timeseal_decoder-Linux-ELF-2.4 b/lasker-2.2.3/timeseal/timeseal_decoder-Linux-ELF-2.4 new file mode 100755 index 0000000000000000000000000000000000000000..0eff44a27221d9bdef951f9f0a742885b3d916a3 GIT binary patch literal 334028 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%0D9|tN5aO^!|-<;nveEfIx@ViEbwVe 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 F{{vWOj3592 literal 0 HcmV?d00001 diff --git a/lasker-2.2.3/web/CVS/Entries b/lasker-2.2.3/web/CVS/Entries new file mode 100644 index 0000000..1014a11 --- /dev/null +++ b/lasker-2.2.3/web/CVS/Entries @@ -0,0 +1,2 @@ +/index.html/1.14/Thu Jul 22 07:04:41 2004// +D diff --git a/lasker-2.2.3/web/CVS/Repository b/lasker-2.2.3/web/CVS/Repository new file mode 100644 index 0000000..8a4d132 --- /dev/null +++ b/lasker-2.2.3/web/CVS/Repository @@ -0,0 +1 @@ +lasker/web diff --git a/lasker-2.2.3/web/CVS/Root b/lasker-2.2.3/web/CVS/Root new file mode 100644 index 0000000..c42ba94 --- /dev/null +++ b/lasker-2.2.3/web/CVS/Root @@ -0,0 +1 @@ +/home/cvs diff --git a/lasker-2.2.3/web/index.html b/lasker-2.2.3/web/index.html new file mode 100644 index 0000000..26e28e1 --- /dev/null +++ b/lasker-2.2.3/web/index.html @@ -0,0 +1,96 @@ + + + +Lasker Chess Server + + +

Lasker Chess Server

+ +This is an enhanced chess server based on the 'lasker' chess server +from
http://chessd.sourceforge.net/ + +

+For more details please see the README + +

Features

+
    +
  • lots and lots of bugs fixed +
  • timeseal support added (see +timeseal/README for details) +
  • server configuration via 'aconfig' command instead of config.h +
  • added multi-part command parsing (commands separated by ';') +
  • enhanced aliases +
  • build/install process fixed +
  • fixed help system +
  • transparent server reload (upgrade without disturbing connections +or games) +
  • plus lots more … +
+ + +

Download

+ +Tar balls of released version are available here + +

cvs

+ +I recommend you download the source using anonymous cvs. The following +command should do it: + +
+   cvs -z5 -d :pserver:cvs@pserver.samba.org:/cvsroot co lasker
+
+ +Then to get updates do the following: + +
+  cd lasker
+  cvs -z5 update -dP
+
+ +

Mailing list

+ +If you wish to discuss the development of Lasker then please join the +chessd-general +mailing list at http://chessd.sourceforge.net/ + +

Latest release

+ +The latest release is 2.2.3. This release adds: + +
    +
  • new command "remote" +
  • fixed several bugs in algebraic move parsing for ambiguous moves +
  • fixed promotion using = notation +
  • fixed time handling on first move +
  • fixed handling of '$' commands +
  • changed mam alias to use xtell +
  • reduced CPU usage in server dramatically +
  • fixed several crash bugs +
  • added logging of admin commands +
+ +

News

+ +
    +
  • June 12th 2002. First announcement of CVS version of enhanced lasker +
  • June 13th 2002. Added ability to reload the server code (upgrade) +without disturbing games or connections. +
  • June 13th 2002. Released lasker-2.0.tar.gz +
  • June 18th 2002. Released lasker-2.0.1.tar.gz +
  • June 22nd 2002. Released lasker-2.1.0.tar.gz +
  • June 23rd 2002. Released lasker-2.2.0.tar.gz +
  • June 29th 2002. Released lasker-2.2.1.tar.gz +
  • July 1st 2002. Released lasker-2.2.2.tar.gz +
  • July 22nd 2004. Released lasker-2.2.3.tar.gz +
+ +
+ +Andrew Tridgell
+bugs@chess.samba.org +
+ + + -- 1.7.0.4