From 79b59f9b30fb6a1fdf8c3efb446271f7cb00d434 Mon Sep 17 00:00:00 2001 From: Markus Uhlin Date: Thu, 7 Dec 2023 21:31:49 +0100 Subject: FICS 1.6.2 --- FICS/.depend | 343 ++ FICS/GNU_LICENSE | 339 ++ FICS/Makedist | 6 + FICS/Makefile | 50 + FICS/Makefile.alpha | 33 + FICS/Makefile.bak | 645 +++ FICS/Makefile.bsd | 50 + FICS/Makefile.clean | 50 + FICS/Makefile.common | 67 + FICS/Makefile.common.bak | 61 + FICS/Makefile.in | 110 + FICS/Makefile.in.orig | 110 + FICS/Makefile.next | 28 + FICS/Makefile.sgi | 40 + FICS/Makefile.sun4 | 45 + FICS/Makefile.sun5 | 40 + FICS/Makefile.sunos-glibc | 51 + FICS/Makefile.ultrix | 31 + FICS/Makefile.usl | 29 + FICS/README | 103 + FICS/README-UPGRADE_FROM_1.2.3 | 13 + FICS/README.NEW | 172 + FICS/README.timeseal | 16 + FICS/README_LEGAL | 23 + FICS/README_Nash | 37 + FICS/acconfig.h | 49 + FICS/acconfig.h.orig | 49 + FICS/adminproc.c | 1596 ++++++ FICS/adminproc.h | 71 + FICS/algcheck.c | 465 ++ FICS/algcheck.h | 41 + FICS/autoconfig.h | 171 + FICS/board.c | 1001 ++++ FICS/board.h | 123 + FICS/channel.c | 101 + FICS/channel.h | 40 + FICS/command.c | 1080 ++++ FICS/command.h | 140 + FICS/command.h.orig | 135 + FICS/command_list.h | 272 + FICS/common.h | 56 + FICS/comproc.c | 1638 ++++++ FICS/comproc.c.orig | 1625 ++++++ FICS/comproc.h | 74 + FICS/comproc.old.c | 3394 +++++++++++ FICS/config.h | 107 + FICS/config.h.dist | 107 + FICS/dfree.c | 226 + FICS/eco.c | 428 ++ FICS/eco.h | 12 + FICS/fics_addplayer.c | 167 + FICS/ficsmain.c | 183 + FICS/ficsmain.c.orig | 171 + FICS/ficsmain.h | 61 + FICS/formula.c | 593 ++ FICS/formula.h | 55 + FICS/gamedb.c | 1795 ++++++ FICS/gamedb.h | 209 + FICS/gameproc.c | 1745 ++++++ FICS/gameproc.c.orig | 2826 ++++++++++ FICS/gameproc.h | 66 + FICS/get_tcp_conn.c | 153 + FICS/get_tcp_conn.h | 13 + FICS/get_tcp_conn.proto.h | 4 + FICS/gmon.out | Bin 0 -> 319604 bytes FICS/hashtbl.h | 97 + FICS/legal.c | 38 + FICS/legal.h | 31 + FICS/lists.c | 470 ++ FICS/lists.h | 44 + FICS/makerank.c | 217 + FICS/matchproc.c | 1081 ++++ FICS/matchproc.h | 35 + FICS/memmove.c | 120 + FICS/movecheck.c | 1297 +++++ FICS/movecheck.h | 61 + FICS/multicol.c | 153 + FICS/multicol.c.orig | 153 + FICS/multicol.h | 41 + FICS/network.c | 622 +++ FICS/network.c.orig | 657 +++ FICS/network.h | 89 + FICS/obsproc.c | 1528 +++++ FICS/obsproc.h | 57 + FICS/playerdb.c | 2542 +++++++++ FICS/playerdb.h | 289 + FICS/rating_conv.c | 73 + FICS/rating_conv.h | 11 + FICS/ratings.c | 1512 +++++ FICS/ratings.c.orig | 1432 +++++ FICS/ratings.h | 80 + FICS/rmalloc.c | 87 + FICS/rmalloc.h | 38 + FICS/shutdown.c | 262 + FICS/shutdown.h | 14 + FICS/stdinclude.h | 174 + FICS/stdinclude.h.orig | 164 + FICS/talkproc.c | 1247 +++++ FICS/talkproc.h | 56 + FICS/utils.c | 1049 ++++ FICS/utils.c.orig | 991 ++++ FICS/utils.h | 116 + FICS/utils.h.orig | 115 + FICS/variable.c | 899 +++ FICS/variable.h | 56 + FICS/vers.h | 31 + FICS/vers.h.orig | 31 + data/Spanish/etiquette | 37 + data/Spanish/ficsfaq | 195 + data/Spanish/interface | 201 + data/Spanish/intro0 | 55 + data/Spanish/intro1 | 42 + data/Spanish/intro2 | 71 + data/Spanish/intro3 | 65 + data/Spanish/intro4 | 40 + data/Spanish/intro5 | 28 + data/Spanish/intro6 | 54 + data/Spanish/intro7 | 99 + data/Spanish/nota_acerca | 40 + data/Spanish/register | 43 + data/admin/accounts | 19 + data/admin/addaccounts | 101 + data/admin/addcomment | 20 + data/admin/addplayer | 19 + data/admin/adjrequests | 1 + data/admin/adjud_info | 32 + data/admin/adjudicate | 26 + data/admin/admin | 14 + data/admin/admin_commands | 39 + data/admin/admin_hierarchy | 8 + data/admin/ahelp | 15 + data/admin/amotd | 1 + data/admin/anews | 16 + data/admin/announce | 14 + data/admin/annunreg | 15 + data/admin/asetadmin | 25 + data/admin/asetblitz | 15 + data/admin/asetemail | 16 + data/admin/asethandle | 15 + data/admin/asetmaxplayer | 21 + data/admin/asetpasswd | 19 + data/admin/asetrealname | 14 + data/admin/asetstd | 15 + data/admin/asetv | 15 + data/admin/asetwild | 15 + data/admin/ban | 26 + data/admin/bug | 1 + data/admin/buglist | 95 + data/admin/canewsf | 16 + data/admin/canewsi | 21 + data/admin/chkgame | 30 + data/admin/chkip | 19 + data/admin/chkpl | 33 + data/admin/chksc | 13 + data/admin/chkts | 13 + data/admin/cmuzzle | 23 + data/admin/cnewsf | 16 + data/admin/cnewsi | 18 + data/admin/computerlist | 1 + data/admin/createanews | 11 + data/admin/events | 1 + data/admin/filter | 22 + data/admin/filtered | 1 + data/admin/finger | 13 + data/admin/helpfiles | 1 + data/admin/lists | 30 + data/admin/multiaccounts | 1 + data/admin/muzzle | 23 + data/admin/nuke | 16 + data/admin/pose | 15 + data/admin/projects | 35 + data/admin/quota | 15 + data/admin/raisedead | 20 + data/admin/register | 43 + data/admin/remplayer | 23 + data/admin/rerank | 14 + data/admin/server_com | 41 + data/admin/showcomment | 13 + data/admin/shutdown | 29 + data/admin/suggestion | 1 + data/admin/summon | 15 + data/admin/vacation | 1 + data/boards/chessercizes/deflection-79 | 2 + data/boards/chessercizes/discovery-70 | 2 + data/boards/chessercizes/discovery-71 | 2 + data/boards/chessercizes/double-threat-49 | 2 + data/boards/chessercizes/fork-48 | 2 + data/boards/chessercizes/fork-50 | 2 + data/boards/chessercizes/mating-attack-15 | 2 + data/boards/chessercizes/mating-attack-16 | 2 + data/boards/chessercizes/mating-attack-17 | 2 + data/boards/chessercizes/mating-attack-18 | 2 + data/boards/chessercizes/mating-attack-19 | 2 + data/boards/chessercizes/mating-net-01 | 2 + data/boards/chessercizes/mating-net-02 | 2 + data/boards/chessercizes/mating-net-03 | 2 + data/boards/chessercizes/mating-net-04 | 2 + data/boards/chessercizes/mating-net-05 | 2 + data/boards/chessercizes/overload-75 | 2 + data/boards/chessercizes/pin-60 | 2 + data/boards/chessercizes/pin-62 | 2 + data/boards/chessercizes/pin-overload-61 | 2 + data/boards/chessercizes/promotion-96 | 2 + data/boards/chessercizes/remove-guard-76 | 2 + data/boards/chessercizes/shut-off-90 | 2 + data/boards/chessercizes/simplification-89 | 2 + data/boards/chessercizes/skewer-69 | 2 + data/boards/material-odds/knight | 2 + data/boards/material-odds/knight-and-move | 2 + data/boards/material-odds/pawn | 2 + data/boards/material-odds/pawn-and-move | 2 + data/boards/material-odds/queen | 2 + data/boards/material-odds/queen-and-move | 2 + data/boards/material-odds/rook | 2 + data/boards/material-odds/rook-and-move | 2 + data/boards/misc/little-game | 3 + data/boards/openings/double-d-pawn | 2 + data/boards/openings/double-e-pawn | 3 + data/boards/openings/giouco-piano | 2 + data/boards/openings/kings-gambita | 2 + data/boards/openings/kings-gambita-be7 | 2 + data/boards/openings/kings-gambita-fischer | 2 + data/boards/openings/kings-gambita-nc6 | 2 + data/boards/openings/kings-gambita-schallop | 2 + data/boards/openings/kings-gambitd-bc5 | 2 + data/boards/openings/kings-gambitd-d6 | 2 + data/boards/openings/kings-gambitd-falkbeer | 2 + data/boards/openings/kings-gambitd-nf6 | 2 + data/boards/openings/kings-gambitd-nimzo | 2 + data/boards/openings/ruy-lopez | 3 + data/boards/pawns/pawns-only | 5 + data/boards/standard/standard | 5 + data/boards/std.board | 2 + data/boards/test/bugpos | 2 + data/boards/wild/0 | 3 + data/boards/wild/1 | 2 + data/boards/wild/2 | 2 + data/boards/wild/3 | 2 + data/boards/wild/4 | 2 + data/boards/wild/5 | 3 + data/boards/wild/8 | 3 + data/boards/wild/bughouse | 1 + data/book/changes.txt | 25 + data/book/eco000.idx | 2008 +++++++ data/book/eco999.idx | 2008 +++++++ data/book/fen.doc | 130 + data/book/long001.idx | 8076 +++++++++++++++++++++++++++ data/book/long999.idx | 8076 +++++++++++++++++++++++++++ data/book/nic000.idx | 2172 +++++++ data/book/nic999.idx | 2172 +++++++ data/book/opening.doc | 27 + data/com_help/abort | 1 + data/com_help/accept | 1 + data/com_help/adjourn | 1 + data/com_help/alias | 1 + data/com_help/allobservers | 1 + data/com_help/assess | 1 + data/com_help/bell | 1 + data/com_help/best | 1 + data/com_help/boards | 1 + data/com_help/busy | 1 + data/com_help/censor | 1 + data/com_help/channel | 1 + data/com_help/clearmessages | 1 + data/com_help/commands | 1 + data/com_help/courtesyabort | 1 + data/com_help/cshout | 1 + data/com_help/date | 1 + data/com_help/decline | 1 + data/com_help/draw | 1 + data/com_help/finger | 1 + data/com_help/flag | 1 + data/com_help/games | 1 + data/com_help/hbest | 1 + data/com_help/help | 1 + data/com_help/highlight | 1 + data/com_help/history | 1 + data/com_help/hrank | 1 + data/com_help/inchannel | 1 + data/com_help/it | 1 + data/com_help/kibitz | 1 + data/com_help/llogons | 1 + data/com_help/load | 1 + data/com_help/logons | 1 + data/com_help/logout | 1 + data/com_help/mailhelp | 1 + data/com_help/mailmess | 1 + data/com_help/mailmoves | 1 + data/com_help/mailoldmoves | 1 + data/com_help/mailsource | 1 + data/com_help/makelinks.sh | 82 + data/com_help/match | 1 + data/com_help/messages | 1 + data/com_help/moretime | 1 + data/com_help/moves | 1 + data/com_help/notify | 1 + data/com_help/observe | 1 + data/com_help/oldmoves | 1 + data/com_help/open | 1 + data/com_help/password | 1 + data/com_help/pause | 1 + data/com_help/pending | 1 + data/com_help/promote | 1 + data/com_help/quit | 1 + data/com_help/rank | 1 + data/com_help/refresh | 1 + data/com_help/resign | 1 + data/com_help/say | 1 + data/com_help/servers | 1 + data/com_help/set | 1 + data/com_help/shout | 1 + data/com_help/simabort | 1 + data/com_help/simgames | 1 + data/com_help/simmatch | 1 + data/com_help/simnext | 1 + data/com_help/simopen | 1 + data/com_help/simpass | 1 + data/com_help/smoves | 1 + data/com_help/sposition | 1 + data/com_help/statistics | 1 + data/com_help/stored | 1 + data/com_help/style | 1 + data/com_help/switch | 1 + data/com_help/takeback | 1 + data/com_help/tell | 1 + data/com_help/time | 1 + data/com_help/unalias | 1 + data/com_help/uncensor | 1 + data/com_help/unpause | 1 + data/com_help/uptime | 1 + data/com_help/variables | 1 + data/com_help/whisper | 1 + data/com_help/who | 1 + data/com_help/withdraw | 1 + data/com_help/znotify | 1 + data/commands | 107 + data/help/_help | 18 + data/help/abort | 27 + data/help/abuser | 31 + data/help/accept | 17 + data/help/addlist | 16 + data/help/addresses | 70 + data/help/adjourn | 23 + data/help/adjournments | 45 + data/help/adjudication | 46 + data/help/adm_info | 31 + data/help/adm_new | 24 + data/help/admins | 39 + data/help/alias | 107 + data/help/allobservers | 24 + data/help/analysis | 6 + data/help/assess | 16 + data/help/backward | 18 + data/help/bell | 12 + data/help/best | 20 + data/help/blindfold | 23 + data/help/blitz | 57 + data/help/boards | 40 + data/help/bughouse | 126 + data/help/bughouse_not | 5 + data/help/bughouse_strat | 214 + data/help/busy | 27 + data/help/censor | 21 + data/help/chan_1 | 35 + data/help/channel | 26 + data/help/channel_list | 41 + data/help/clearmessages | 22 + data/help/cls | 1 + data/help/cls_info | 12 + data/help/commands | 20 + data/help/computers | 15 + data/help/convert_bcf | 22 + data/help/convert_elo | 22 + data/help/convert_uscf | 22 + data/help/courtesyabort | 10 + data/help/credit | 10 + data/help/cshout | 17 + data/help/date | 13 + data/help/decline | 19 + data/help/draw | 22 + data/help/eco | 33 + data/help/eggo | 139 + data/help/etiquette | 71 + data/help/examine | 94 + data/help/fics_lingo | 66 + data/help/ficsfaq | 170 + data/help/finger | 54 + data/help/fixes | 18 + data/help/flag | 40 + data/help/flip | 16 + data/help/formula | 179 + data/help/forward | 23 + data/help/ftp_hints | 121 + data/help/games | 58 + data/help/glicko | 219 + data/help/gm_game | 18 + data/help/gnotify | 18 + data/help/goboard | 13 + data/help/gonum | 12 + data/help/handle | 26 + data/help/handles | 15 + data/help/hbest | 20 + data/help/help | 26 + data/help/highlight | 20 + data/help/history | 58 + data/help/hrank | 33 + data/help/inchannel | 15 + data/help/index | 20 + data/help/inetchesslib | 184 + data/help/interfaces | 216 + data/help/intro_basics | 21 + data/help/intro_general | 41 + data/help/intro_information | 67 + data/help/intro_moving | 83 + data/help/intro_playing | 66 + data/help/intro_settings | 36 + data/help/intro_special | 25 + data/help/intro_talking | 67 + data/help/intro_welcome | 49 + data/help/it | 46 + data/help/journal | 54 + data/help/jsave | 43 + data/help/kibitz | 36 + data/help/kiblevel | 46 + data/help/lag | 37 + data/help/lecture1 | 260 + data/help/lightning | 35 + data/help/limits | 16 + data/help/lists | 24 + data/help/llogons | 11 + data/help/login | 1 + data/help/logons | 13 + data/help/logout | 1 + data/help/mailhelp | 13 + data/help/mailmess | 28 + data/help/mailmoves | 16 + data/help/mailoldmoves | 23 + data/help/mailsource | 15 + data/help/mailstored | 23 + data/help/match | 123 + data/help/messages | 30 + data/help/mexamine | 18 + data/help/moretime | 25 + data/help/motd | 1 + data/help/motd_help | 12 + data/help/moves | 13 + data/help/newrating | 41 + data/help/news | 16 + data/help/newstuff | 1 + data/help/next | 13 + data/help/noplay | 20 + data/help/notes | 17 + data/help/notify | 43 + data/help/observe | 38 + data/help/oldmoves | 19 + data/help/open | 14 + data/help/partner | 16 + data/help/password | 12 + data/help/pause | 19 + data/help/pending | 12 + data/help/policy | 8 + data/help/prefresh | 12 + data/help/private | 16 + data/help/promote | 15 + data/help/ptell | 12 + data/help/quit | 16 + data/help/rank | 32 + data/help/ratings | 54 + data/help/refresh | 16 + data/help/register | 16 + data/help/register.dist | 16 + data/help/resign | 17 + data/help/revert | 13 + data/help/say | 18 + data/help/servers | 15 + data/help/set | 43 + data/help/shout | 47 + data/help/shout_abuse | 64 + data/help/shout_quota | 16 + data/help/showlist | 18 + data/help/simabort | 15 + data/help/simadjourn | 18 + data/help/simallabort | 14 + data/help/simalladjourn | 18 + data/help/simgames | 13 + data/help/simmatch | 17 + data/help/simnext | 15 + data/help/simopen | 14 + data/help/simpass | 14 + data/help/simprev | 15 + data/help/simuls | 76 + data/help/smoves | 23 + data/help/soapbox | 39 + data/help/sourcecode | 16 + data/help/sposition | 12 + data/help/standard | 48 + data/help/statistics | 14 + data/help/stored | 32 + data/help/style | 33 + data/help/sublist | 16 + data/help/switch | 13 + data/help/takeback | 24 + data/help/team | 18 + data/help/teamgames | 61 + data/help/tell | 48 + data/help/time | 15 + data/help/timeseal | 144 + data/help/totals | 5 + data/help/unalias | 12 + data/help/unexamine | 14 + data/help/unobserve | 18 + data/help/unpause | 14 + data/help/untimed | 17 + data/help/uptime | 14 + data/help/uscf_faq | 223 + data/help/variables | 85 + data/help/wcmatch | 33 + data/help/whenshut | 13 + data/help/whisper | 17 + data/help/who | 125 + data/help/wild | 55 + data/help/withdraw | 26 + data/help/xtell | 21 + data/help/znotify | 14 + data/index/_index | 23 + data/index/all | 79 + data/index/analysis | 13 + data/index/commands | 46 + data/index/game_info | 14 + data/index/help | 20 + data/index/mail | 13 + data/index/play | 25 + data/index/preferences | 20 + data/index/server_info | 20 + data/index/simul | 20 + data/index/special | 16 + data/index/talk | 19 + data/index/user_info | 21 + data/info/abuser | 1 + data/info/addresses | 1 + data/info/adjournments | 1 + data/info/adjudication | 1 + data/info/adm-info | 1 + data/info/adm_info | 1 + data/info/adm_new | 1 + data/info/admins | 1 + data/info/analysis | 1 + data/info/blindfold | 1 + data/info/blitz | 1 + data/info/bughouse | 1 + data/info/busy | 1 + data/info/chan_1 | 1 + data/info/channel_list | 1 + data/info/commands | 1 + data/info/computers | 1 + data/info/credit | 1 + data/info/eggo | 1 + data/info/etiquette | 1 + data/info/fics-lingo | 1 + data/info/fics_lingo | 1 + data/info/ficsfaq | 1 + data/info/fixes | 1 + data/info/formula | 1 + data/info/ftp-hints | 1 + data/info/ftp_hints | 1 + data/info/glicko | 1 + data/info/gm_game | 1 + data/info/handle | 1 + data/info/highlight | 1 + data/info/inetchesslib | 1 + data/info/interfaces | 1 + data/info/intro0 | 1 + data/info/intro1 | 1 + data/info/intro2 | 1 + data/info/intro3 | 1 + data/info/intro4 | 1 + data/info/intro5 | 1 + data/info/intro6 | 1 + data/info/intro7 | 1 + data/info/intro_basics | 1 + data/info/intro_general | 1 + data/info/intro_information | 1 + data/info/intro_moving | 1 + data/info/intro_playing | 1 + data/info/intro_settings | 1 + data/info/intro_special | 1 + data/info/intro_talking | 1 + data/info/intro_welcome | 1 + data/info/kiblevel | 1 + data/info/lag | 1 + data/info/lecture1 | 1 + data/info/lightning | 1 + data/info/limits | 1 + data/info/lists | 1 + data/info/login | 1 + data/info/logout | 1 + data/info/motd | 1 + data/info/motd_help | 1 + data/info/newrating | 1 + data/info/newstuff | 1 + data/info/notes | 1 + data/info/private | 1 + data/info/ratings | 1 + data/info/register | 1 + data/info/shout_abuse | 1 + data/info/shout_quota | 1 + data/info/showlist | 1 + data/info/simuls | 1 + data/info/sourcecode | 1 + data/info/standard | 1 + data/info/team | 1 + data/info/teamgames | 1 + data/info/timeseal | 1 + data/info/todo | 1 + data/info/totals | 1 + data/info/untimed | 1 + data/info/uscf_faq | 1 + data/info/wild | 1 + data/lists/HelpToIndex | 6 + data/lists/README | 70 + data/lists/abuser | 0 data/lists/admin | 1 + data/lists/ban | 0 data/lists/blind | 0 data/lists/cmuzzle | 0 data/lists/computer | 0 data/lists/filter | 0 data/lists/fm | 0 data/lists/gm | 0 data/lists/im | 0 data/lists/index | 15 + data/lists/muzzle | 0 data/lists/removedcom | 0 data/lists/td | 0 data/lists/teams | 0 data/messages/admotd | 7 + data/messages/login | 2 + data/messages/logout | 3 + data/messages/logout.fancy | 19 + data/messages/motd | 6 + data/messages/unregistered | 5 + data/messages/welcome | 20 + data/messages/welcome.backup | 35 + data/messages/welcome.old | 5 + data/news/adminnews.1 | 1 + data/news/newadminnews.index | 1 + data/news/newnews.index | 1 + data/stats/logons | 2 + data/stats/logons.log | 2 + data/stats/newratings_data | 0 data/stats/rank.blitz | 0 data/stats/rank.std | 0 data/stats/rank.wild | 0 data/usage/abort | 4 + data/usage/accept | 5 + data/usage/addlist | 4 + data/usage/adjourn | 4 + data/usage/alias | 4 + data/usage/allobservers | 4 + data/usage/assess | 4 + data/usage/backward | 4 + data/usage/bell | 4 + data/usage/best | 4 + data/usage/boards | 4 + data/usage/censor | 4 + data/usage/channel | 4 + data/usage/clearmessages | 4 + data/usage/cshout | 4 + data/usage/date | 4 + data/usage/decline | 5 + data/usage/draw | 4 + data/usage/eco | 4 + data/usage/examine | 4 + data/usage/finger | 4 + data/usage/flag | 4 + data/usage/flip | 4 + data/usage/forward | 4 + data/usage/games | 4 + data/usage/goboard | 4 + data/usage/gonum | 4 + data/usage/handles | 4 + data/usage/hbest | 4 + data/usage/history | 4 + data/usage/hrank | 5 + data/usage/inchannel | 4 + data/usage/it | 4 + data/usage/kibitz | 4 + data/usage/limits | 4 + data/usage/llogons | 0 data/usage/logons | 4 + data/usage/mailhelp | 4 + data/usage/mailmess | 4 + data/usage/mailmoves | 4 + data/usage/mailoldmoves | 4 + data/usage/mailsource | 4 + data/usage/mailstored | 4 + data/usage/match | 5 + data/usage/messages | 4 + data/usage/mexamine | 4 + data/usage/moretime | 4 + data/usage/moves | 4 + data/usage/news | 4 + data/usage/next | 4 + data/usage/notify | 4 + data/usage/observe | 4 + data/usage/oldmoves | 4 + data/usage/open | 4 + data/usage/password | 4 + data/usage/pause | 4 + data/usage/pending | 4 + data/usage/promote | 4 + data/usage/quit | 4 + data/usage/rank | 4 + data/usage/refresh | 4 + data/usage/resign | 4 + data/usage/revert | 4 + data/usage/say | 4 + data/usage/set | 5 + data/usage/shout | 4 + data/usage/showlist | 4 + data/usage/simabort | 4 + data/usage/simadjourn | 4 + data/usage/simallabort | 4 + data/usage/simalladjourn | 4 + data/usage/simgames | 4 + data/usage/simmatch | 4 + data/usage/simnext | 4 + data/usage/simopen | 4 + data/usage/simpass | 4 + data/usage/simprev | 4 + data/usage/smoves | 4 + data/usage/sposition | 4 + data/usage/statistics | 4 + data/usage/stored | 4 + data/usage/style | 4 + data/usage/sublist | 4 + data/usage/switch | 4 + data/usage/takeback | 4 + data/usage/tell | 4 + data/usage/time | 4 + data/usage/unalias | 4 + data/usage/uncensor | 4 + data/usage/unexamine | 4 + data/usage/unnotify | 4 + data/usage/unobserve | 4 + data/usage/unpause | 4 + data/usage/uptime | 4 + data/usage/variables | 4 + data/usage/whisper | 4 + data/usage/who | 4 + data/usage/withdraw | 5 + data/usage/xtell | 4 + data/usage/znotify | 5 + data/uscf/ak | 4 + data/uscf/al | 9 + data/uscf/ar | 5 + data/uscf/az | 44 + data/uscf/beginner | 7 + data/uscf/ca_n | 39 + data/uscf/ca_s | 95 + data/uscf/co | 10 + data/uscf/ct | 72 + data/uscf/dc | 35 + data/uscf/de | 12 + data/uscf/fl | 24 + data/uscf/foreign | 7 + data/uscf/ga | 72 + data/uscf/gran_prix | 791 +++ data/uscf/help | 25 + data/uscf/hi | 10 + data/uscf/ia | 9 + data/uscf/id | 12 + data/uscf/il | 69 + data/uscf/in | 37 + data/uscf/ks | 23 + data/uscf/ky | 23 + data/uscf/la | 14 + data/uscf/ma | 74 + data/uscf/md | 57 + data/uscf/me | 10 + data/uscf/mi | 30 + data/uscf/mn | 11 + data/uscf/mo | 21 + data/uscf/ms | 16 + data/uscf/mt | 10 + data/uscf/national | 198 + data/uscf/nc | 23 + data/uscf/nd | 4 + data/uscf/ne | 20 + data/uscf/nh | 12 + data/uscf/nj | 247 + data/uscf/nm | 14 + data/uscf/nv | 13 + data/uscf/ny | 681 +++ data/uscf/oh | 97 + data/uscf/ok | 15 + data/uscf/or | 29 + data/uscf/pa | 89 + data/uscf/ri | 31 + data/uscf/sc | 19 + data/uscf/sd | 5 + data/uscf/tn | 5 + data/uscf/tx | 177 + data/uscf/ut | 12 + data/uscf/va | 18 + data/uscf/vt | 18 + data/uscf/wa | 13 + data/uscf/wi | 26 + data/uscf/wv | 10 + data/uscf/wy | 4 + games/adjourned/a | 1 + games/adjourned/b | 1 + games/adjourned/c | 1 + games/adjourned/d | 1 + games/adjourned/e | 1 + games/adjourned/f | 1 + games/adjourned/g | 1 + games/adjourned/h | 1 + games/adjourned/i | 1 + games/adjourned/j | 1 + games/adjourned/k | 1 + games/adjourned/l | 1 + games/adjourned/m | 1 + games/adjourned/n | 1 + games/adjourned/o | 1 + games/adjourned/p | 1 + games/adjourned/q | 1 + games/adjourned/r | 1 + games/adjourned/s | 1 + games/adjourned/t | 1 + games/adjourned/u | 1 + games/adjourned/v | 1 + games/adjourned/w | 1 + games/adjourned/x | 1 + games/adjourned/y | 1 + games/adjourned/z | 1 + players/a/adminguy | 65 + scripts/fics_autorun | 14 + 838 files changed, 80556 insertions(+) create mode 100644 FICS/.depend create mode 100644 FICS/GNU_LICENSE create mode 100644 FICS/Makedist create mode 100644 FICS/Makefile create mode 100644 FICS/Makefile.alpha create mode 100644 FICS/Makefile.bak create mode 100644 FICS/Makefile.bsd create mode 100644 FICS/Makefile.clean create mode 100644 FICS/Makefile.common create mode 100644 FICS/Makefile.common.bak create mode 100644 FICS/Makefile.in create mode 100644 FICS/Makefile.in.orig create mode 100644 FICS/Makefile.next create mode 100644 FICS/Makefile.sgi create mode 100644 FICS/Makefile.sun4 create mode 100644 FICS/Makefile.sun5 create mode 100644 FICS/Makefile.sunos-glibc create mode 100644 FICS/Makefile.ultrix create mode 100644 FICS/Makefile.usl create mode 100644 FICS/README create mode 100644 FICS/README-UPGRADE_FROM_1.2.3 create mode 100644 FICS/README.NEW create mode 100644 FICS/README.timeseal create mode 100644 FICS/README_LEGAL create mode 100644 FICS/README_Nash create mode 100644 FICS/acconfig.h create mode 100644 FICS/acconfig.h.orig create mode 100644 FICS/adminproc.c create mode 100644 FICS/adminproc.h create mode 100644 FICS/algcheck.c create mode 100644 FICS/algcheck.h create mode 100644 FICS/autoconfig.h create mode 100644 FICS/board.c create mode 100644 FICS/board.h create mode 100644 FICS/channel.c create mode 100644 FICS/channel.h create mode 100644 FICS/command.c create mode 100644 FICS/command.h create mode 100644 FICS/command.h.orig create mode 100644 FICS/command_list.h create mode 100644 FICS/common.h create mode 100644 FICS/comproc.c create mode 100644 FICS/comproc.c.orig create mode 100644 FICS/comproc.h create mode 100644 FICS/comproc.old.c create mode 100644 FICS/config.h create mode 100644 FICS/config.h.dist create mode 100644 FICS/dfree.c create mode 100644 FICS/eco.c create mode 100644 FICS/eco.h create mode 100644 FICS/fics_addplayer.c create mode 100644 FICS/ficsmain.c create mode 100644 FICS/ficsmain.c.orig create mode 100644 FICS/ficsmain.h create mode 100644 FICS/formula.c create mode 100644 FICS/formula.h create mode 100644 FICS/gamedb.c create mode 100644 FICS/gamedb.h create mode 100644 FICS/gameproc.c create mode 100644 FICS/gameproc.c.orig create mode 100644 FICS/gameproc.h create mode 100644 FICS/get_tcp_conn.c create mode 100644 FICS/get_tcp_conn.h create mode 100644 FICS/get_tcp_conn.proto.h create mode 100644 FICS/gmon.out create mode 100644 FICS/hashtbl.h create mode 100644 FICS/legal.c create mode 100644 FICS/legal.h create mode 100644 FICS/lists.c create mode 100644 FICS/lists.h create mode 100644 FICS/makerank.c create mode 100644 FICS/matchproc.c create mode 100644 FICS/matchproc.h create mode 100644 FICS/memmove.c create mode 100644 FICS/movecheck.c create mode 100644 FICS/movecheck.h create mode 100644 FICS/multicol.c create mode 100644 FICS/multicol.c.orig create mode 100644 FICS/multicol.h create mode 100644 FICS/network.c create mode 100644 FICS/network.c.orig create mode 100644 FICS/network.h create mode 100644 FICS/obsproc.c create mode 100644 FICS/obsproc.h create mode 100644 FICS/playerdb.c create mode 100644 FICS/playerdb.h create mode 100644 FICS/rating_conv.c create mode 100644 FICS/rating_conv.h create mode 100644 FICS/ratings.c create mode 100644 FICS/ratings.c.orig create mode 100644 FICS/ratings.h create mode 100644 FICS/rmalloc.c create mode 100644 FICS/rmalloc.h create mode 100644 FICS/shutdown.c create mode 100644 FICS/shutdown.h create mode 100644 FICS/stdinclude.h create mode 100644 FICS/stdinclude.h.orig create mode 100644 FICS/talkproc.c create mode 100644 FICS/talkproc.h create mode 100644 FICS/utils.c create mode 100644 FICS/utils.c.orig create mode 100644 FICS/utils.h create mode 100644 FICS/utils.h.orig create mode 100644 FICS/variable.c create mode 100644 FICS/variable.h create mode 100644 FICS/vers.h create mode 100644 FICS/vers.h.orig create mode 100644 data/Spanish/etiquette create mode 100644 data/Spanish/ficsfaq create mode 100644 data/Spanish/interface create mode 100644 data/Spanish/intro0 create mode 100644 data/Spanish/intro1 create mode 100644 data/Spanish/intro2 create mode 100644 data/Spanish/intro3 create mode 100644 data/Spanish/intro4 create mode 100644 data/Spanish/intro5 create mode 100644 data/Spanish/intro6 create mode 100644 data/Spanish/intro7 create mode 100644 data/Spanish/nota_acerca create mode 100644 data/Spanish/register create mode 100644 data/admin/accounts create mode 100644 data/admin/addaccounts create mode 100644 data/admin/addcomment create mode 100644 data/admin/addplayer create mode 120000 data/admin/adjrequests create mode 100644 data/admin/adjud_info create mode 100644 data/admin/adjudicate create mode 100644 data/admin/admin create mode 100644 data/admin/admin_commands create mode 100644 data/admin/admin_hierarchy create mode 100644 data/admin/ahelp create mode 120000 data/admin/amotd create mode 100644 data/admin/anews create mode 100644 data/admin/announce create mode 100644 data/admin/annunreg create mode 100644 data/admin/asetadmin create mode 100644 data/admin/asetblitz create mode 100644 data/admin/asetemail create mode 100644 data/admin/asethandle create mode 100644 data/admin/asetmaxplayer create mode 100644 data/admin/asetpasswd create mode 100644 data/admin/asetrealname create mode 100644 data/admin/asetstd create mode 100644 data/admin/asetv create mode 100644 data/admin/asetwild create mode 100644 data/admin/ban create mode 120000 data/admin/bug create mode 100644 data/admin/buglist create mode 100644 data/admin/canewsf create mode 100644 data/admin/canewsi create mode 100644 data/admin/chkgame create mode 100644 data/admin/chkip create mode 100644 data/admin/chkpl create mode 100644 data/admin/chksc create mode 100644 data/admin/chkts create mode 100644 data/admin/cmuzzle create mode 100644 data/admin/cnewsf create mode 100644 data/admin/cnewsi create mode 120000 data/admin/computerlist create mode 100644 data/admin/createanews create mode 120000 data/admin/events create mode 100644 data/admin/filter create mode 120000 data/admin/filtered create mode 100644 data/admin/finger create mode 120000 data/admin/helpfiles create mode 100644 data/admin/lists create mode 120000 data/admin/multiaccounts create mode 100644 data/admin/muzzle create mode 100644 data/admin/nuke create mode 100644 data/admin/pose create mode 100644 data/admin/projects create mode 100644 data/admin/quota create mode 100644 data/admin/raisedead create mode 100644 data/admin/register create mode 100644 data/admin/remplayer create mode 100644 data/admin/rerank create mode 100644 data/admin/server_com create mode 100644 data/admin/showcomment create mode 100644 data/admin/shutdown create mode 120000 data/admin/suggestion create mode 100644 data/admin/summon create mode 120000 data/admin/vacation create mode 100644 data/boards/chessercizes/deflection-79 create mode 100644 data/boards/chessercizes/discovery-70 create mode 100644 data/boards/chessercizes/discovery-71 create mode 100644 data/boards/chessercizes/double-threat-49 create mode 100644 data/boards/chessercizes/fork-48 create mode 100644 data/boards/chessercizes/fork-50 create mode 100644 data/boards/chessercizes/mating-attack-15 create mode 100644 data/boards/chessercizes/mating-attack-16 create mode 100644 data/boards/chessercizes/mating-attack-17 create mode 100644 data/boards/chessercizes/mating-attack-18 create mode 100644 data/boards/chessercizes/mating-attack-19 create mode 100644 data/boards/chessercizes/mating-net-01 create mode 100644 data/boards/chessercizes/mating-net-02 create mode 100644 data/boards/chessercizes/mating-net-03 create mode 100644 data/boards/chessercizes/mating-net-04 create mode 100644 data/boards/chessercizes/mating-net-05 create mode 100644 data/boards/chessercizes/overload-75 create mode 100644 data/boards/chessercizes/pin-60 create mode 100644 data/boards/chessercizes/pin-62 create mode 100644 data/boards/chessercizes/pin-overload-61 create mode 100644 data/boards/chessercizes/promotion-96 create mode 100644 data/boards/chessercizes/remove-guard-76 create mode 100644 data/boards/chessercizes/shut-off-90 create mode 100644 data/boards/chessercizes/simplification-89 create mode 100644 data/boards/chessercizes/skewer-69 create mode 100644 data/boards/material-odds/knight create mode 100644 data/boards/material-odds/knight-and-move create mode 100644 data/boards/material-odds/pawn create mode 100644 data/boards/material-odds/pawn-and-move create mode 100644 data/boards/material-odds/queen create mode 100644 data/boards/material-odds/queen-and-move create mode 100644 data/boards/material-odds/rook create mode 100644 data/boards/material-odds/rook-and-move create mode 100644 data/boards/misc/little-game create mode 100644 data/boards/openings/double-d-pawn create mode 100644 data/boards/openings/double-e-pawn create mode 100644 data/boards/openings/giouco-piano create mode 100644 data/boards/openings/kings-gambita create mode 100644 data/boards/openings/kings-gambita-be7 create mode 100644 data/boards/openings/kings-gambita-fischer create mode 100644 data/boards/openings/kings-gambita-nc6 create mode 100644 data/boards/openings/kings-gambita-schallop create mode 100644 data/boards/openings/kings-gambitd-bc5 create mode 100644 data/boards/openings/kings-gambitd-d6 create mode 100644 data/boards/openings/kings-gambitd-falkbeer create mode 100644 data/boards/openings/kings-gambitd-nf6 create mode 100644 data/boards/openings/kings-gambitd-nimzo create mode 100644 data/boards/openings/ruy-lopez create mode 100644 data/boards/pawns/pawns-only create mode 100644 data/boards/standard/standard create mode 100644 data/boards/std.board create mode 100644 data/boards/test/bugpos create mode 100644 data/boards/wild/0 create mode 100644 data/boards/wild/1 create mode 100644 data/boards/wild/2 create mode 100644 data/boards/wild/3 create mode 100644 data/boards/wild/4 create mode 100644 data/boards/wild/5 create mode 100644 data/boards/wild/8 create mode 120000 data/boards/wild/bughouse create mode 100644 data/book/changes.txt create mode 100644 data/book/eco000.idx create mode 100644 data/book/eco999.idx create mode 100644 data/book/fen.doc create mode 100644 data/book/long001.idx create mode 100644 data/book/long999.idx create mode 100644 data/book/nic000.idx create mode 100644 data/book/nic999.idx create mode 100644 data/book/opening.doc create mode 120000 data/com_help/abort create mode 120000 data/com_help/accept create mode 120000 data/com_help/adjourn create mode 120000 data/com_help/alias create mode 120000 data/com_help/allobservers create mode 120000 data/com_help/assess create mode 120000 data/com_help/bell create mode 120000 data/com_help/best create mode 120000 data/com_help/boards create mode 120000 data/com_help/busy create mode 120000 data/com_help/censor create mode 120000 data/com_help/channel create mode 120000 data/com_help/clearmessages create mode 120000 data/com_help/commands create mode 120000 data/com_help/courtesyabort create mode 120000 data/com_help/cshout create mode 120000 data/com_help/date create mode 120000 data/com_help/decline create mode 120000 data/com_help/draw create mode 120000 data/com_help/finger create mode 120000 data/com_help/flag create mode 120000 data/com_help/games create mode 120000 data/com_help/hbest create mode 120000 data/com_help/help create mode 120000 data/com_help/highlight create mode 120000 data/com_help/history create mode 120000 data/com_help/hrank create mode 120000 data/com_help/inchannel create mode 120000 data/com_help/it create mode 120000 data/com_help/kibitz create mode 120000 data/com_help/llogons create mode 120000 data/com_help/load create mode 120000 data/com_help/logons create mode 120000 data/com_help/logout create mode 120000 data/com_help/mailhelp create mode 120000 data/com_help/mailmess create mode 120000 data/com_help/mailmoves create mode 120000 data/com_help/mailoldmoves create mode 120000 data/com_help/mailsource create mode 100755 data/com_help/makelinks.sh create mode 120000 data/com_help/match create mode 120000 data/com_help/messages create mode 120000 data/com_help/moretime create mode 120000 data/com_help/moves create mode 120000 data/com_help/notify create mode 120000 data/com_help/observe create mode 120000 data/com_help/oldmoves create mode 120000 data/com_help/open create mode 120000 data/com_help/password create mode 120000 data/com_help/pause create mode 120000 data/com_help/pending create mode 120000 data/com_help/promote create mode 120000 data/com_help/quit create mode 120000 data/com_help/rank create mode 120000 data/com_help/refresh create mode 120000 data/com_help/resign create mode 120000 data/com_help/say create mode 120000 data/com_help/servers create mode 120000 data/com_help/set create mode 120000 data/com_help/shout create mode 120000 data/com_help/simabort create mode 120000 data/com_help/simgames create mode 120000 data/com_help/simmatch create mode 120000 data/com_help/simnext create mode 120000 data/com_help/simopen create mode 120000 data/com_help/simpass create mode 120000 data/com_help/smoves create mode 120000 data/com_help/sposition create mode 120000 data/com_help/statistics create mode 120000 data/com_help/stored create mode 120000 data/com_help/style create mode 120000 data/com_help/switch create mode 120000 data/com_help/takeback create mode 120000 data/com_help/tell create mode 120000 data/com_help/time create mode 120000 data/com_help/unalias create mode 120000 data/com_help/uncensor create mode 120000 data/com_help/unpause create mode 120000 data/com_help/uptime create mode 120000 data/com_help/variables create mode 120000 data/com_help/whisper create mode 120000 data/com_help/who create mode 120000 data/com_help/withdraw create mode 120000 data/com_help/znotify create mode 100644 data/commands create mode 100644 data/help/_help create mode 100644 data/help/abort create mode 100644 data/help/abuser create mode 100644 data/help/accept create mode 100644 data/help/addlist create mode 100644 data/help/addresses create mode 100644 data/help/adjourn create mode 100644 data/help/adjournments create mode 100644 data/help/adjudication create mode 100644 data/help/adm_info create mode 100644 data/help/adm_new create mode 100644 data/help/admins create mode 100644 data/help/alias create mode 100644 data/help/allobservers create mode 100644 data/help/analysis create mode 100644 data/help/assess create mode 100644 data/help/backward create mode 100644 data/help/bell create mode 100644 data/help/best create mode 100644 data/help/blindfold create mode 100644 data/help/blitz create mode 100644 data/help/boards create mode 100644 data/help/bughouse create mode 100644 data/help/bughouse_not create mode 100644 data/help/bughouse_strat create mode 100644 data/help/busy create mode 100644 data/help/censor create mode 100644 data/help/chan_1 create mode 100644 data/help/channel create mode 100644 data/help/channel_list create mode 100644 data/help/clearmessages create mode 100644 data/help/cls create mode 100644 data/help/cls_info create mode 100644 data/help/commands create mode 100644 data/help/computers create mode 100644 data/help/convert_bcf create mode 100644 data/help/convert_elo create mode 100644 data/help/convert_uscf create mode 100644 data/help/courtesyabort create mode 100644 data/help/credit create mode 100644 data/help/cshout create mode 100644 data/help/date create mode 100644 data/help/decline create mode 100644 data/help/draw create mode 100644 data/help/eco create mode 100644 data/help/eggo create mode 100644 data/help/etiquette create mode 100644 data/help/examine create mode 100644 data/help/fics_lingo create mode 100644 data/help/ficsfaq create mode 100644 data/help/finger create mode 100644 data/help/fixes create mode 100644 data/help/flag create mode 100644 data/help/flip create mode 100644 data/help/formula create mode 100644 data/help/forward create mode 100644 data/help/ftp_hints create mode 100644 data/help/games create mode 100644 data/help/glicko create mode 100644 data/help/gm_game create mode 100644 data/help/gnotify create mode 100644 data/help/goboard create mode 100644 data/help/gonum create mode 100644 data/help/handle create mode 100644 data/help/handles create mode 100644 data/help/hbest create mode 100644 data/help/help create mode 100644 data/help/highlight create mode 100644 data/help/history create mode 100644 data/help/hrank create mode 100644 data/help/inchannel create mode 100644 data/help/index create mode 100644 data/help/inetchesslib create mode 100644 data/help/interfaces create mode 100644 data/help/intro_basics create mode 100644 data/help/intro_general create mode 100644 data/help/intro_information create mode 100644 data/help/intro_moving create mode 100644 data/help/intro_playing create mode 100644 data/help/intro_settings create mode 100644 data/help/intro_special create mode 100644 data/help/intro_talking create mode 100644 data/help/intro_welcome create mode 100644 data/help/it create mode 100644 data/help/journal create mode 100644 data/help/jsave create mode 100644 data/help/kibitz create mode 100644 data/help/kiblevel create mode 100644 data/help/lag create mode 100644 data/help/lecture1 create mode 100644 data/help/lightning create mode 100644 data/help/limits create mode 100644 data/help/lists create mode 100644 data/help/llogons create mode 120000 data/help/login create mode 100644 data/help/logons create mode 120000 data/help/logout create mode 100644 data/help/mailhelp create mode 100644 data/help/mailmess create mode 100644 data/help/mailmoves create mode 100644 data/help/mailoldmoves create mode 100644 data/help/mailsource create mode 100644 data/help/mailstored create mode 100644 data/help/match create mode 100644 data/help/messages create mode 100644 data/help/mexamine create mode 100644 data/help/moretime create mode 120000 data/help/motd create mode 100644 data/help/motd_help create mode 100644 data/help/moves create mode 100644 data/help/newrating create mode 100644 data/help/news create mode 120000 data/help/newstuff create mode 100644 data/help/next create mode 100644 data/help/noplay create mode 100644 data/help/notes create mode 100644 data/help/notify create mode 100644 data/help/observe create mode 100644 data/help/oldmoves create mode 100644 data/help/open create mode 100644 data/help/partner create mode 100644 data/help/password create mode 100644 data/help/pause create mode 100644 data/help/pending create mode 100644 data/help/policy create mode 100644 data/help/prefresh create mode 100644 data/help/private create mode 100644 data/help/promote create mode 100644 data/help/ptell create mode 100644 data/help/quit create mode 100644 data/help/rank create mode 100644 data/help/ratings create mode 100644 data/help/refresh create mode 100644 data/help/register create mode 100755 data/help/register.dist create mode 100644 data/help/resign create mode 100644 data/help/revert create mode 100644 data/help/say create mode 100644 data/help/servers create mode 100644 data/help/set create mode 100644 data/help/shout create mode 100644 data/help/shout_abuse create mode 100644 data/help/shout_quota create mode 100644 data/help/showlist create mode 100644 data/help/simabort create mode 100644 data/help/simadjourn create mode 100644 data/help/simallabort create mode 100644 data/help/simalladjourn create mode 100644 data/help/simgames create mode 100644 data/help/simmatch create mode 100644 data/help/simnext create mode 100644 data/help/simopen create mode 100644 data/help/simpass create mode 100644 data/help/simprev create mode 100644 data/help/simuls create mode 100644 data/help/smoves create mode 100644 data/help/soapbox create mode 100644 data/help/sourcecode create mode 100644 data/help/sposition create mode 100644 data/help/standard create mode 100644 data/help/statistics create mode 100644 data/help/stored create mode 100644 data/help/style create mode 100644 data/help/sublist create mode 100644 data/help/switch create mode 100644 data/help/takeback create mode 100644 data/help/team create mode 100644 data/help/teamgames create mode 100644 data/help/tell create mode 100644 data/help/time create mode 100644 data/help/timeseal create mode 100644 data/help/totals create mode 100644 data/help/unalias create mode 100644 data/help/unexamine create mode 100644 data/help/unobserve create mode 100644 data/help/unpause create mode 100644 data/help/untimed create mode 100644 data/help/uptime create mode 100644 data/help/uscf_faq create mode 100644 data/help/variables create mode 100644 data/help/wcmatch create mode 100644 data/help/whenshut create mode 100644 data/help/whisper create mode 100644 data/help/who create mode 100644 data/help/wild create mode 100644 data/help/withdraw create mode 100644 data/help/xtell create mode 100644 data/help/znotify create mode 100644 data/index/_index create mode 100644 data/index/all create mode 100644 data/index/analysis create mode 100644 data/index/commands create mode 100644 data/index/game_info create mode 100644 data/index/help create mode 100644 data/index/mail create mode 100644 data/index/play create mode 100644 data/index/preferences create mode 100644 data/index/server_info create mode 100644 data/index/simul create mode 100644 data/index/special create mode 100644 data/index/talk create mode 100644 data/index/user_info create mode 120000 data/info/abuser create mode 120000 data/info/addresses create mode 120000 data/info/adjournments create mode 120000 data/info/adjudication create mode 120000 data/info/adm-info create mode 120000 data/info/adm_info create mode 120000 data/info/adm_new create mode 120000 data/info/admins create mode 120000 data/info/analysis create mode 120000 data/info/blindfold create mode 120000 data/info/blitz create mode 120000 data/info/bughouse create mode 120000 data/info/busy create mode 120000 data/info/chan_1 create mode 120000 data/info/channel_list create mode 120000 data/info/commands create mode 120000 data/info/computers create mode 120000 data/info/credit create mode 120000 data/info/eggo create mode 120000 data/info/etiquette create mode 120000 data/info/fics-lingo create mode 120000 data/info/fics_lingo create mode 120000 data/info/ficsfaq create mode 120000 data/info/fixes create mode 120000 data/info/formula create mode 120000 data/info/ftp-hints create mode 120000 data/info/ftp_hints create mode 120000 data/info/glicko create mode 120000 data/info/gm_game create mode 120000 data/info/handle create mode 120000 data/info/highlight create mode 120000 data/info/inetchesslib create mode 120000 data/info/interfaces create mode 120000 data/info/intro0 create mode 120000 data/info/intro1 create mode 120000 data/info/intro2 create mode 120000 data/info/intro3 create mode 120000 data/info/intro4 create mode 120000 data/info/intro5 create mode 120000 data/info/intro6 create mode 120000 data/info/intro7 create mode 120000 data/info/intro_basics create mode 120000 data/info/intro_general create mode 120000 data/info/intro_information create mode 120000 data/info/intro_moving create mode 120000 data/info/intro_playing create mode 120000 data/info/intro_settings create mode 120000 data/info/intro_special create mode 120000 data/info/intro_talking create mode 120000 data/info/intro_welcome create mode 120000 data/info/kiblevel create mode 120000 data/info/lag create mode 120000 data/info/lecture1 create mode 120000 data/info/lightning create mode 120000 data/info/limits create mode 120000 data/info/lists create mode 120000 data/info/login create mode 120000 data/info/logout create mode 120000 data/info/motd create mode 120000 data/info/motd_help create mode 120000 data/info/newrating create mode 120000 data/info/newstuff create mode 120000 data/info/notes create mode 120000 data/info/private create mode 120000 data/info/ratings create mode 120000 data/info/register create mode 120000 data/info/shout_abuse create mode 120000 data/info/shout_quota create mode 120000 data/info/showlist create mode 120000 data/info/simuls create mode 120000 data/info/sourcecode create mode 120000 data/info/standard create mode 120000 data/info/team create mode 120000 data/info/teamgames create mode 120000 data/info/timeseal create mode 120000 data/info/todo create mode 120000 data/info/totals create mode 120000 data/info/untimed create mode 120000 data/info/uscf_faq create mode 120000 data/info/wild create mode 100755 data/lists/HelpToIndex create mode 100755 data/lists/README create mode 100755 data/lists/abuser create mode 100755 data/lists/admin create mode 100755 data/lists/ban create mode 100755 data/lists/blind create mode 100755 data/lists/cmuzzle create mode 100755 data/lists/computer create mode 100755 data/lists/filter create mode 100755 data/lists/fm create mode 100755 data/lists/gm create mode 100755 data/lists/im create mode 100755 data/lists/index create mode 100755 data/lists/muzzle create mode 100755 data/lists/removedcom create mode 100755 data/lists/td create mode 100755 data/lists/teams create mode 100755 data/messages/admotd create mode 100755 data/messages/login create mode 100755 data/messages/logout create mode 100755 data/messages/logout.fancy create mode 100755 data/messages/motd create mode 100755 data/messages/unregistered create mode 100755 data/messages/welcome create mode 100755 data/messages/welcome.backup create mode 100755 data/messages/welcome.old create mode 100755 data/news/adminnews.1 create mode 100644 data/news/newadminnews.index create mode 100644 data/news/newnews.index create mode 100755 data/stats/logons create mode 100755 data/stats/logons.log create mode 100755 data/stats/newratings_data create mode 100755 data/stats/rank.blitz create mode 100755 data/stats/rank.std create mode 100755 data/stats/rank.wild create mode 100644 data/usage/abort create mode 100644 data/usage/accept create mode 100644 data/usage/addlist create mode 100644 data/usage/adjourn create mode 100644 data/usage/alias create mode 100644 data/usage/allobservers create mode 100644 data/usage/assess create mode 100644 data/usage/backward create mode 100644 data/usage/bell create mode 100644 data/usage/best create mode 100644 data/usage/boards create mode 100644 data/usage/censor create mode 100644 data/usage/channel create mode 100644 data/usage/clearmessages create mode 100644 data/usage/cshout create mode 100644 data/usage/date create mode 100644 data/usage/decline create mode 100644 data/usage/draw create mode 100644 data/usage/eco create mode 100644 data/usage/examine create mode 100644 data/usage/finger create mode 100644 data/usage/flag create mode 100644 data/usage/flip create mode 100644 data/usage/forward create mode 100644 data/usage/games create mode 100644 data/usage/goboard create mode 100644 data/usage/gonum create mode 100644 data/usage/handles create mode 100644 data/usage/hbest create mode 100644 data/usage/history create mode 100644 data/usage/hrank create mode 100644 data/usage/inchannel create mode 100644 data/usage/it create mode 100644 data/usage/kibitz create mode 100644 data/usage/limits create mode 100644 data/usage/llogons create mode 100644 data/usage/logons create mode 100644 data/usage/mailhelp create mode 100644 data/usage/mailmess create mode 100644 data/usage/mailmoves create mode 100644 data/usage/mailoldmoves create mode 100644 data/usage/mailsource create mode 100644 data/usage/mailstored create mode 100644 data/usage/match create mode 100644 data/usage/messages create mode 100644 data/usage/mexamine create mode 100644 data/usage/moretime create mode 100644 data/usage/moves create mode 100644 data/usage/news create mode 100644 data/usage/next create mode 100644 data/usage/notify create mode 100644 data/usage/observe create mode 100644 data/usage/oldmoves create mode 100644 data/usage/open create mode 100644 data/usage/password create mode 100644 data/usage/pause create mode 100644 data/usage/pending create mode 100644 data/usage/promote create mode 100644 data/usage/quit create mode 100644 data/usage/rank create mode 100644 data/usage/refresh create mode 100644 data/usage/resign create mode 100644 data/usage/revert create mode 100644 data/usage/say create mode 100644 data/usage/set create mode 100644 data/usage/shout create mode 100644 data/usage/showlist create mode 100644 data/usage/simabort create mode 100644 data/usage/simadjourn create mode 100644 data/usage/simallabort create mode 100644 data/usage/simalladjourn create mode 100644 data/usage/simgames create mode 100644 data/usage/simmatch create mode 100644 data/usage/simnext create mode 100644 data/usage/simopen create mode 100644 data/usage/simpass create mode 100644 data/usage/simprev create mode 100644 data/usage/smoves create mode 100644 data/usage/sposition create mode 100644 data/usage/statistics create mode 100644 data/usage/stored create mode 100644 data/usage/style create mode 100644 data/usage/sublist create mode 100644 data/usage/switch create mode 100644 data/usage/takeback create mode 100644 data/usage/tell create mode 100644 data/usage/time create mode 100644 data/usage/unalias create mode 100644 data/usage/uncensor create mode 100644 data/usage/unexamine create mode 100644 data/usage/unnotify create mode 100644 data/usage/unobserve create mode 100644 data/usage/unpause create mode 100644 data/usage/uptime create mode 100644 data/usage/variables create mode 100644 data/usage/whisper create mode 100644 data/usage/who create mode 100644 data/usage/withdraw create mode 100644 data/usage/xtell create mode 100644 data/usage/znotify create mode 100644 data/uscf/ak create mode 100644 data/uscf/al create mode 100644 data/uscf/ar create mode 100644 data/uscf/az create mode 100644 data/uscf/beginner create mode 100644 data/uscf/ca_n create mode 100644 data/uscf/ca_s create mode 100644 data/uscf/co create mode 100644 data/uscf/ct create mode 100644 data/uscf/dc create mode 100644 data/uscf/de create mode 100644 data/uscf/fl create mode 100644 data/uscf/foreign create mode 100644 data/uscf/ga create mode 100644 data/uscf/gran_prix create mode 100644 data/uscf/help create mode 100644 data/uscf/hi create mode 100644 data/uscf/ia create mode 100644 data/uscf/id create mode 100644 data/uscf/il create mode 100644 data/uscf/in create mode 100644 data/uscf/ks create mode 100644 data/uscf/ky create mode 100644 data/uscf/la create mode 100644 data/uscf/ma create mode 100644 data/uscf/md create mode 100644 data/uscf/me create mode 100644 data/uscf/mi create mode 100644 data/uscf/mn create mode 100644 data/uscf/mo create mode 100644 data/uscf/ms create mode 100644 data/uscf/mt create mode 100644 data/uscf/national create mode 100644 data/uscf/nc create mode 100644 data/uscf/nd create mode 100644 data/uscf/ne create mode 100644 data/uscf/nh create mode 100644 data/uscf/nj create mode 100644 data/uscf/nm create mode 100644 data/uscf/nv create mode 100644 data/uscf/ny create mode 100644 data/uscf/oh create mode 100644 data/uscf/ok create mode 100644 data/uscf/or create mode 100644 data/uscf/pa create mode 100644 data/uscf/ri create mode 100644 data/uscf/sc create mode 100644 data/uscf/sd create mode 100644 data/uscf/tn create mode 100644 data/uscf/tx create mode 100644 data/uscf/ut create mode 100644 data/uscf/va create mode 100644 data/uscf/vt create mode 100644 data/uscf/wa create mode 100644 data/uscf/wi create mode 100644 data/uscf/wv create mode 100644 data/uscf/wy create mode 120000 games/adjourned/a create mode 120000 games/adjourned/b create mode 120000 games/adjourned/c create mode 120000 games/adjourned/d create mode 120000 games/adjourned/e create mode 120000 games/adjourned/f create mode 120000 games/adjourned/g create mode 120000 games/adjourned/h create mode 120000 games/adjourned/i create mode 120000 games/adjourned/j create mode 120000 games/adjourned/k create mode 120000 games/adjourned/l create mode 120000 games/adjourned/m create mode 120000 games/adjourned/n create mode 120000 games/adjourned/o create mode 120000 games/adjourned/p create mode 120000 games/adjourned/q create mode 120000 games/adjourned/r create mode 120000 games/adjourned/s create mode 120000 games/adjourned/t create mode 120000 games/adjourned/u create mode 120000 games/adjourned/v create mode 120000 games/adjourned/w create mode 120000 games/adjourned/x create mode 120000 games/adjourned/y create mode 120000 games/adjourned/z create mode 100755 players/a/adminguy create mode 100755 scripts/fics_autorun diff --git a/FICS/.depend b/FICS/.depend new file mode 100644 index 0000000..98ae35d --- /dev/null +++ b/FICS/.depend @@ -0,0 +1,343 @@ +adminproc.o : adminproc.c stdinclude.h /usr/include/sys/types.h /usr/include/machine/endian.h \ + /usr/include/sys/cdefs.h /usr/include/machine/ansi.h /usr/include/machine/types.h \ + /usr/include/strings.h /usr/include/string.h /usr/include/sys/dir.h /usr/include/dirent.h \ + /usr/include/sys/dirent.h /usr/include/sys/stat.h /usr/include/sys/time.h /usr/include/time.h \ + /usr/include/stdio.h /usr/include/stdarg.h /usr/include/machine/stdarg.h /usr/include/stdlib.h \ + /usr/include/sys/socket.h /usr/include/netinet/in.h /usr/include/arpa/inet.h \ + /usr/include/netdb.h /usr/include/unistd.h /usr/include/sys/unistd.h /usr/include/ctype.h \ + /usr/include/sys/errno.h /usr/include/signal.h /usr/include/sys/signal.h /usr/include/machine/signal.h \ + /usr/include/math.h /usr/include/sys/file.h /usr/include/sys/fcntl.h /usr/include/sys/ioctl.h \ + /usr/include/sys/ttycom.h /usr/include/sys/ioccom.h /usr/include/sys/filio.h \ + /usr/include/sys/sockio.h /usr/include/sys/wait.h common.h vers.h legal.h network.h \ + command.h variable.h adminproc.h playerdb.h lists.h gamedb.h board.h gameproc.h \ + obsproc.h ratings.h utils.h multicol.h rmalloc.h talkproc.h comproc.h /usr/include/sys/param.h \ + /usr/include/sys/syslimits.h /usr/include/machine/param.h /usr/include/machine/limits.h +algcheck.o : algcheck.c stdinclude.h /usr/include/sys/types.h /usr/include/machine/endian.h \ + /usr/include/sys/cdefs.h /usr/include/machine/ansi.h /usr/include/machine/types.h \ + /usr/include/strings.h /usr/include/string.h /usr/include/sys/dir.h /usr/include/dirent.h \ + /usr/include/sys/dirent.h /usr/include/sys/stat.h /usr/include/sys/time.h /usr/include/time.h \ + /usr/include/stdio.h /usr/include/stdarg.h /usr/include/machine/stdarg.h /usr/include/stdlib.h \ + /usr/include/sys/socket.h /usr/include/netinet/in.h /usr/include/arpa/inet.h \ + /usr/include/netdb.h /usr/include/unistd.h /usr/include/sys/unistd.h /usr/include/ctype.h \ + /usr/include/sys/errno.h /usr/include/signal.h /usr/include/sys/signal.h /usr/include/machine/signal.h \ + /usr/include/math.h /usr/include/sys/file.h /usr/include/sys/fcntl.h /usr/include/sys/ioctl.h \ + /usr/include/sys/ttycom.h /usr/include/sys/ioccom.h /usr/include/sys/filio.h \ + /usr/include/sys/sockio.h /usr/include/sys/wait.h common.h vers.h legal.h algcheck.h \ + board.h movecheck.h utils.h multicol.h +board.o : board.c stdinclude.h /usr/include/sys/types.h /usr/include/machine/endian.h \ + /usr/include/sys/cdefs.h /usr/include/machine/ansi.h /usr/include/machine/types.h \ + /usr/include/strings.h /usr/include/string.h /usr/include/sys/dir.h /usr/include/dirent.h \ + /usr/include/sys/dirent.h /usr/include/sys/stat.h /usr/include/sys/time.h /usr/include/time.h \ + /usr/include/stdio.h /usr/include/stdarg.h /usr/include/machine/stdarg.h /usr/include/stdlib.h \ + /usr/include/sys/socket.h /usr/include/netinet/in.h /usr/include/arpa/inet.h \ + /usr/include/netdb.h /usr/include/unistd.h /usr/include/sys/unistd.h /usr/include/ctype.h \ + /usr/include/sys/errno.h /usr/include/signal.h /usr/include/sys/signal.h /usr/include/machine/signal.h \ + /usr/include/math.h /usr/include/sys/file.h /usr/include/sys/fcntl.h /usr/include/sys/ioctl.h \ + /usr/include/sys/ttycom.h /usr/include/sys/ioccom.h /usr/include/sys/filio.h \ + /usr/include/sys/sockio.h /usr/include/sys/wait.h common.h vers.h legal.h board.h \ + playerdb.h command.h variable.h lists.h gamedb.h utils.h multicol.h +channel.o : channel.c stdinclude.h /usr/include/sys/types.h /usr/include/machine/endian.h \ + /usr/include/sys/cdefs.h /usr/include/machine/ansi.h /usr/include/machine/types.h \ + /usr/include/strings.h /usr/include/string.h /usr/include/sys/dir.h /usr/include/dirent.h \ + /usr/include/sys/dirent.h /usr/include/sys/stat.h /usr/include/sys/time.h /usr/include/time.h \ + /usr/include/stdio.h /usr/include/stdarg.h /usr/include/machine/stdarg.h /usr/include/stdlib.h \ + /usr/include/sys/socket.h /usr/include/netinet/in.h /usr/include/arpa/inet.h \ + /usr/include/netdb.h /usr/include/unistd.h /usr/include/sys/unistd.h /usr/include/ctype.h \ + /usr/include/sys/errno.h /usr/include/signal.h /usr/include/sys/signal.h /usr/include/machine/signal.h \ + /usr/include/math.h /usr/include/sys/file.h /usr/include/sys/fcntl.h /usr/include/sys/ioctl.h \ + /usr/include/sys/ttycom.h /usr/include/sys/ioccom.h /usr/include/sys/filio.h \ + /usr/include/sys/sockio.h /usr/include/sys/wait.h common.h vers.h legal.h channel.h \ + network.h command.h variable.h rmalloc.h playerdb.h lists.h +command.o : command.c stdinclude.h /usr/include/sys/types.h /usr/include/machine/endian.h \ + /usr/include/sys/cdefs.h /usr/include/machine/ansi.h /usr/include/machine/types.h \ + /usr/include/strings.h /usr/include/string.h /usr/include/sys/dir.h /usr/include/dirent.h \ + /usr/include/sys/dirent.h /usr/include/sys/stat.h /usr/include/sys/time.h /usr/include/time.h \ + /usr/include/stdio.h /usr/include/stdarg.h /usr/include/machine/stdarg.h /usr/include/stdlib.h \ + /usr/include/sys/socket.h /usr/include/netinet/in.h /usr/include/arpa/inet.h \ + /usr/include/netdb.h /usr/include/unistd.h /usr/include/sys/unistd.h /usr/include/ctype.h \ + /usr/include/sys/errno.h /usr/include/signal.h /usr/include/sys/signal.h /usr/include/machine/signal.h \ + /usr/include/math.h /usr/include/sys/file.h /usr/include/sys/fcntl.h /usr/include/sys/ioctl.h \ + /usr/include/sys/ttycom.h /usr/include/sys/ioccom.h /usr/include/sys/filio.h \ + /usr/include/sys/sockio.h /usr/include/sys/wait.h common.h vers.h legal.h rmalloc.h \ + command.h variable.h command_list.h comproc.h matchproc.h talkproc.h lists.h \ + gameproc.h obsproc.h adminproc.h playerdb.h ratings.h eco.h rating_conv.h shutdown.h \ + movecheck.h board.h ficsmain.h config.h utils.h multicol.h gamedb.h network.h \ + /usr/include/sys/param.h /usr/include/sys/syslimits.h /usr/include/machine/param.h \ + /usr/include/machine/limits.h +talkproc.o : talkproc.c stdinclude.h /usr/include/sys/types.h /usr/include/machine/endian.h \ + /usr/include/sys/cdefs.h /usr/include/machine/ansi.h /usr/include/machine/types.h \ + /usr/include/strings.h /usr/include/string.h /usr/include/sys/dir.h /usr/include/dirent.h \ + /usr/include/sys/dirent.h /usr/include/sys/stat.h /usr/include/sys/time.h /usr/include/time.h \ + /usr/include/stdio.h /usr/include/stdarg.h /usr/include/machine/stdarg.h /usr/include/stdlib.h \ + /usr/include/sys/socket.h /usr/include/netinet/in.h /usr/include/arpa/inet.h \ + /usr/include/netdb.h /usr/include/unistd.h /usr/include/sys/unistd.h /usr/include/ctype.h \ + /usr/include/sys/errno.h /usr/include/signal.h /usr/include/sys/signal.h /usr/include/machine/signal.h \ + /usr/include/math.h /usr/include/sys/file.h /usr/include/sys/fcntl.h /usr/include/sys/ioctl.h \ + /usr/include/sys/ttycom.h /usr/include/sys/ioccom.h /usr/include/sys/filio.h \ + /usr/include/sys/sockio.h /usr/include/sys/wait.h common.h vers.h legal.h talkproc.h \ + comproc.h command.h variable.h utils.h multicol.h ficsmain.h config.h playerdb.h \ + lists.h network.h rmalloc.h gamedb.h board.h gameproc.h obsproc.h formula.h \ + /usr/include/sys/resource.h +comproc.o : comproc.c stdinclude.h /usr/include/sys/types.h /usr/include/machine/endian.h \ + /usr/include/sys/cdefs.h /usr/include/machine/ansi.h /usr/include/machine/types.h \ + /usr/include/strings.h /usr/include/string.h /usr/include/sys/dir.h /usr/include/dirent.h \ + /usr/include/sys/dirent.h /usr/include/sys/stat.h /usr/include/sys/time.h /usr/include/time.h \ + /usr/include/stdio.h /usr/include/stdarg.h /usr/include/machine/stdarg.h /usr/include/stdlib.h \ + /usr/include/sys/socket.h /usr/include/netinet/in.h /usr/include/arpa/inet.h \ + /usr/include/netdb.h /usr/include/unistd.h /usr/include/sys/unistd.h /usr/include/ctype.h \ + /usr/include/sys/errno.h /usr/include/signal.h /usr/include/sys/signal.h /usr/include/machine/signal.h \ + /usr/include/math.h /usr/include/sys/file.h /usr/include/sys/fcntl.h /usr/include/sys/ioctl.h \ + /usr/include/sys/ttycom.h /usr/include/sys/ioccom.h /usr/include/sys/filio.h \ + /usr/include/sys/sockio.h /usr/include/sys/wait.h common.h vers.h legal.h talkproc.h \ + comproc.h command.h variable.h utils.h multicol.h ficsmain.h config.h playerdb.h \ + lists.h network.h rmalloc.h gamedb.h board.h gameproc.h obsproc.h ratings.h \ + formula.h eco.h /usr/include/sys/resource.h +matchproc.o : matchproc.c stdinclude.h /usr/include/sys/types.h /usr/include/machine/endian.h \ + /usr/include/sys/cdefs.h /usr/include/machine/ansi.h /usr/include/machine/types.h \ + /usr/include/strings.h /usr/include/string.h /usr/include/sys/dir.h /usr/include/dirent.h \ + /usr/include/sys/dirent.h /usr/include/sys/stat.h /usr/include/sys/time.h /usr/include/time.h \ + /usr/include/stdio.h /usr/include/stdarg.h /usr/include/machine/stdarg.h /usr/include/stdlib.h \ + /usr/include/sys/socket.h /usr/include/netinet/in.h /usr/include/arpa/inet.h \ + /usr/include/netdb.h /usr/include/unistd.h /usr/include/sys/unistd.h /usr/include/ctype.h \ + /usr/include/sys/errno.h /usr/include/signal.h /usr/include/sys/signal.h /usr/include/machine/signal.h \ + /usr/include/math.h /usr/include/sys/file.h /usr/include/sys/fcntl.h /usr/include/sys/ioctl.h \ + /usr/include/sys/ttycom.h /usr/include/sys/ioccom.h /usr/include/sys/filio.h \ + /usr/include/sys/sockio.h /usr/include/sys/wait.h common.h vers.h legal.h talkproc.h \ + comproc.h command.h variable.h utils.h multicol.h ficsmain.h config.h playerdb.h \ + lists.h network.h rmalloc.h gamedb.h board.h gameproc.h obsproc.h ratings.h \ + formula.h eco.h /usr/include/sys/resource.h +fics_addplayer.o : fics_addplayer.c stdinclude.h /usr/include/sys/types.h /usr/include/machine/endian.h \ + /usr/include/sys/cdefs.h /usr/include/machine/ansi.h /usr/include/machine/types.h \ + /usr/include/strings.h /usr/include/string.h /usr/include/sys/dir.h /usr/include/dirent.h \ + /usr/include/sys/dirent.h /usr/include/sys/stat.h /usr/include/sys/time.h /usr/include/time.h \ + /usr/include/stdio.h /usr/include/stdarg.h /usr/include/machine/stdarg.h /usr/include/stdlib.h \ + /usr/include/sys/socket.h /usr/include/netinet/in.h /usr/include/arpa/inet.h \ + /usr/include/netdb.h /usr/include/unistd.h /usr/include/sys/unistd.h /usr/include/ctype.h \ + /usr/include/sys/errno.h /usr/include/signal.h /usr/include/sys/signal.h /usr/include/machine/signal.h \ + /usr/include/math.h /usr/include/sys/file.h /usr/include/sys/fcntl.h /usr/include/sys/ioctl.h \ + /usr/include/sys/ttycom.h /usr/include/sys/ioccom.h /usr/include/sys/filio.h \ + /usr/include/sys/sockio.h /usr/include/sys/wait.h common.h vers.h legal.h utils.h \ + multicol.h playerdb.h command.h variable.h lists.h +ficsmain.o : ficsmain.c stdinclude.h /usr/include/sys/types.h /usr/include/machine/endian.h \ + /usr/include/sys/cdefs.h /usr/include/machine/ansi.h /usr/include/machine/types.h \ + /usr/include/strings.h /usr/include/string.h /usr/include/sys/dir.h /usr/include/dirent.h \ + /usr/include/sys/dirent.h /usr/include/sys/stat.h /usr/include/sys/time.h /usr/include/time.h \ + /usr/include/stdio.h /usr/include/stdarg.h /usr/include/machine/stdarg.h /usr/include/stdlib.h \ + /usr/include/sys/socket.h /usr/include/netinet/in.h /usr/include/arpa/inet.h \ + /usr/include/netdb.h /usr/include/unistd.h /usr/include/sys/unistd.h /usr/include/ctype.h \ + /usr/include/sys/errno.h /usr/include/signal.h /usr/include/sys/signal.h /usr/include/machine/signal.h \ + /usr/include/math.h /usr/include/sys/file.h /usr/include/sys/fcntl.h /usr/include/sys/ioctl.h \ + /usr/include/sys/ttycom.h /usr/include/sys/ioccom.h /usr/include/sys/filio.h \ + /usr/include/sys/sockio.h /usr/include/sys/wait.h common.h vers.h legal.h ficsmain.h \ + config.h network.h command.h variable.h playerdb.h lists.h ratings.h utils.h \ + multicol.h board.h talkproc.h comproc.h shutdown.h eco.h /usr/include/sys/param.h \ + /usr/include/sys/syslimits.h /usr/include/machine/param.h /usr/include/machine/limits.h +formula.o : formula.c /usr/include/ctype.h /usr/include/sys/cdefs.h config.h \ + formula.h playerdb.h command.h variable.h stdinclude.h /usr/include/sys/types.h \ + /usr/include/machine/endian.h /usr/include/machine/ansi.h /usr/include/machine/types.h \ + /usr/include/strings.h /usr/include/string.h /usr/include/sys/dir.h /usr/include/dirent.h \ + /usr/include/sys/dirent.h /usr/include/sys/stat.h /usr/include/sys/time.h /usr/include/time.h \ + /usr/include/stdio.h /usr/include/stdarg.h /usr/include/machine/stdarg.h /usr/include/stdlib.h \ + /usr/include/sys/socket.h /usr/include/netinet/in.h /usr/include/arpa/inet.h \ + /usr/include/netdb.h /usr/include/unistd.h /usr/include/sys/unistd.h /usr/include/sys/errno.h \ + /usr/include/signal.h /usr/include/sys/signal.h /usr/include/machine/signal.h \ + /usr/include/math.h /usr/include/sys/file.h /usr/include/sys/fcntl.h /usr/include/sys/ioctl.h \ + /usr/include/sys/ttycom.h /usr/include/sys/ioccom.h /usr/include/sys/filio.h \ + /usr/include/sys/sockio.h /usr/include/sys/wait.h lists.h gamedb.h board.h common.h \ + vers.h legal.h utils.h multicol.h rmalloc.h network.h ratings.h +gamedb.o : gamedb.c stdinclude.h /usr/include/sys/types.h /usr/include/machine/endian.h \ + /usr/include/sys/cdefs.h /usr/include/machine/ansi.h /usr/include/machine/types.h \ + /usr/include/strings.h /usr/include/string.h /usr/include/sys/dir.h /usr/include/dirent.h \ + /usr/include/sys/dirent.h /usr/include/sys/stat.h /usr/include/sys/time.h /usr/include/time.h \ + /usr/include/stdio.h /usr/include/stdarg.h /usr/include/machine/stdarg.h /usr/include/stdlib.h \ + /usr/include/sys/socket.h /usr/include/netinet/in.h /usr/include/arpa/inet.h \ + /usr/include/netdb.h /usr/include/unistd.h /usr/include/sys/unistd.h /usr/include/ctype.h \ + /usr/include/sys/errno.h /usr/include/signal.h /usr/include/sys/signal.h /usr/include/machine/signal.h \ + /usr/include/math.h /usr/include/sys/file.h /usr/include/sys/fcntl.h /usr/include/sys/ioctl.h \ + /usr/include/sys/ttycom.h /usr/include/sys/ioccom.h /usr/include/sys/filio.h \ + /usr/include/sys/sockio.h /usr/include/sys/wait.h common.h vers.h legal.h ficsmain.h \ + config.h gamedb.h board.h playerdb.h command.h variable.h lists.h gameproc.h \ + utils.h multicol.h rmalloc.h eco.h network.h +gameproc.o : gameproc.c stdinclude.h /usr/include/sys/types.h /usr/include/machine/endian.h \ + /usr/include/sys/cdefs.h /usr/include/machine/ansi.h /usr/include/machine/types.h \ + /usr/include/strings.h /usr/include/string.h /usr/include/sys/dir.h /usr/include/dirent.h \ + /usr/include/sys/dirent.h /usr/include/sys/stat.h /usr/include/sys/time.h /usr/include/time.h \ + /usr/include/stdio.h /usr/include/stdarg.h /usr/include/machine/stdarg.h /usr/include/stdlib.h \ + /usr/include/sys/socket.h /usr/include/netinet/in.h /usr/include/arpa/inet.h \ + /usr/include/netdb.h /usr/include/unistd.h /usr/include/sys/unistd.h /usr/include/ctype.h \ + /usr/include/sys/errno.h /usr/include/signal.h /usr/include/sys/signal.h /usr/include/machine/signal.h \ + /usr/include/math.h /usr/include/sys/file.h /usr/include/sys/fcntl.h /usr/include/sys/ioctl.h \ + /usr/include/sys/ttycom.h /usr/include/sys/ioccom.h /usr/include/sys/filio.h \ + /usr/include/sys/sockio.h /usr/include/sys/wait.h common.h vers.h legal.h command.h \ + variable.h ficsmain.h config.h playerdb.h lists.h gamedb.h board.h gameproc.h \ + obsproc.h movecheck.h utils.h multicol.h ratings.h rmalloc.h comproc.h matchproc.h \ + eco.h network.h +obsproc.o : obsproc.c stdinclude.h /usr/include/sys/types.h /usr/include/machine/endian.h \ + /usr/include/sys/cdefs.h /usr/include/machine/ansi.h /usr/include/machine/types.h \ + /usr/include/strings.h /usr/include/string.h /usr/include/sys/dir.h /usr/include/dirent.h \ + /usr/include/sys/dirent.h /usr/include/sys/stat.h /usr/include/sys/time.h /usr/include/time.h \ + /usr/include/stdio.h /usr/include/stdarg.h /usr/include/machine/stdarg.h /usr/include/stdlib.h \ + /usr/include/sys/socket.h /usr/include/netinet/in.h /usr/include/arpa/inet.h \ + /usr/include/netdb.h /usr/include/unistd.h /usr/include/sys/unistd.h /usr/include/ctype.h \ + /usr/include/sys/errno.h /usr/include/signal.h /usr/include/sys/signal.h /usr/include/machine/signal.h \ + /usr/include/math.h /usr/include/sys/file.h /usr/include/sys/fcntl.h /usr/include/sys/ioctl.h \ + /usr/include/sys/ttycom.h /usr/include/sys/ioccom.h /usr/include/sys/filio.h \ + /usr/include/sys/sockio.h /usr/include/sys/wait.h common.h vers.h legal.h command.h \ + variable.h ficsmain.h config.h playerdb.h lists.h gamedb.h board.h gameproc.h \ + obsproc.h movecheck.h utils.h multicol.h ratings.h rmalloc.h comproc.h matchproc.h \ + formula.h eco.h network.h +legal.o : legal.c +lists.o : lists.c lists.h /usr/include/stdio.h /usr/include/sys/types.h /usr/include/machine/endian.h \ + /usr/include/sys/cdefs.h /usr/include/machine/ansi.h /usr/include/machine/types.h \ + common.h vers.h legal.h multicol.h command.h variable.h stdinclude.h /usr/include/strings.h \ + /usr/include/string.h /usr/include/sys/dir.h /usr/include/dirent.h /usr/include/sys/dirent.h \ + /usr/include/sys/stat.h /usr/include/sys/time.h /usr/include/time.h /usr/include/stdarg.h \ + /usr/include/machine/stdarg.h /usr/include/stdlib.h /usr/include/sys/socket.h \ + /usr/include/netinet/in.h /usr/include/arpa/inet.h /usr/include/netdb.h /usr/include/unistd.h \ + /usr/include/sys/unistd.h /usr/include/ctype.h /usr/include/sys/errno.h /usr/include/signal.h \ + /usr/include/sys/signal.h /usr/include/machine/signal.h /usr/include/math.h \ + /usr/include/sys/file.h /usr/include/sys/fcntl.h /usr/include/sys/ioctl.h /usr/include/sys/ttycom.h \ + /usr/include/sys/ioccom.h /usr/include/sys/filio.h /usr/include/sys/sockio.h \ + /usr/include/sys/wait.h utils.h playerdb.h ratings.h rmalloc.h talkproc.h gamedb.h \ + board.h comproc.h +makerank.o : makerank.c /usr/include/stdio.h /usr/include/sys/types.h /usr/include/machine/endian.h \ + /usr/include/sys/cdefs.h /usr/include/machine/ansi.h /usr/include/machine/types.h \ + /usr/include/stdlib.h /usr/include/string.h /usr/include/ctype.h config.h +movecheck.o : movecheck.c stdinclude.h /usr/include/sys/types.h /usr/include/machine/endian.h \ + /usr/include/sys/cdefs.h /usr/include/machine/ansi.h /usr/include/machine/types.h \ + /usr/include/strings.h /usr/include/string.h /usr/include/sys/dir.h /usr/include/dirent.h \ + /usr/include/sys/dirent.h /usr/include/sys/stat.h /usr/include/sys/time.h /usr/include/time.h \ + /usr/include/stdio.h /usr/include/stdarg.h /usr/include/machine/stdarg.h /usr/include/stdlib.h \ + /usr/include/sys/socket.h /usr/include/netinet/in.h /usr/include/arpa/inet.h \ + /usr/include/netdb.h /usr/include/unistd.h /usr/include/sys/unistd.h /usr/include/ctype.h \ + /usr/include/sys/errno.h /usr/include/signal.h /usr/include/sys/signal.h /usr/include/machine/signal.h \ + /usr/include/math.h /usr/include/sys/file.h /usr/include/sys/fcntl.h /usr/include/sys/ioctl.h \ + /usr/include/sys/ttycom.h /usr/include/sys/ioccom.h /usr/include/sys/filio.h \ + /usr/include/sys/sockio.h /usr/include/sys/wait.h common.h vers.h legal.h movecheck.h \ + board.h algcheck.h gamedb.h utils.h multicol.h network.h command.h variable.h \ + playerdb.h lists.h +multicol.o : multicol.c stdinclude.h /usr/include/sys/types.h /usr/include/machine/endian.h \ + /usr/include/sys/cdefs.h /usr/include/machine/ansi.h /usr/include/machine/types.h \ + /usr/include/strings.h /usr/include/string.h /usr/include/sys/dir.h /usr/include/dirent.h \ + /usr/include/sys/dirent.h /usr/include/sys/stat.h /usr/include/sys/time.h /usr/include/time.h \ + /usr/include/stdio.h /usr/include/stdarg.h /usr/include/machine/stdarg.h /usr/include/stdlib.h \ + /usr/include/sys/socket.h /usr/include/netinet/in.h /usr/include/arpa/inet.h \ + /usr/include/netdb.h /usr/include/unistd.h /usr/include/sys/unistd.h /usr/include/ctype.h \ + /usr/include/sys/errno.h /usr/include/signal.h /usr/include/sys/signal.h /usr/include/machine/signal.h \ + /usr/include/math.h /usr/include/sys/file.h /usr/include/sys/fcntl.h /usr/include/sys/ioctl.h \ + /usr/include/sys/ttycom.h /usr/include/sys/ioccom.h /usr/include/sys/filio.h \ + /usr/include/sys/sockio.h /usr/include/sys/wait.h common.h vers.h legal.h multicol.h \ + utils.h rmalloc.h +network.o : network.c stdinclude.h /usr/include/sys/types.h /usr/include/machine/endian.h \ + /usr/include/sys/cdefs.h /usr/include/machine/ansi.h /usr/include/machine/types.h \ + /usr/include/strings.h /usr/include/string.h /usr/include/sys/dir.h /usr/include/dirent.h \ + /usr/include/sys/dirent.h /usr/include/sys/stat.h /usr/include/sys/time.h /usr/include/time.h \ + /usr/include/stdio.h /usr/include/stdarg.h /usr/include/machine/stdarg.h /usr/include/stdlib.h \ + /usr/include/sys/socket.h /usr/include/netinet/in.h /usr/include/arpa/inet.h \ + /usr/include/netdb.h /usr/include/unistd.h /usr/include/sys/unistd.h /usr/include/ctype.h \ + /usr/include/sys/errno.h /usr/include/signal.h /usr/include/sys/signal.h /usr/include/machine/signal.h \ + /usr/include/math.h /usr/include/sys/file.h /usr/include/sys/fcntl.h /usr/include/sys/ioctl.h \ + /usr/include/sys/ttycom.h /usr/include/sys/ioccom.h /usr/include/sys/filio.h \ + /usr/include/sys/sockio.h /usr/include/sys/wait.h /usr/include/arpa/telnet.h \ + ficsmain.h common.h vers.h legal.h utils.h multicol.h playerdb.h command.h variable.h \ + lists.h network.h rmalloc.h config.h +playerdb.o : playerdb.c stdinclude.h /usr/include/sys/types.h /usr/include/machine/endian.h \ + /usr/include/sys/cdefs.h /usr/include/machine/ansi.h /usr/include/machine/types.h \ + /usr/include/strings.h /usr/include/string.h /usr/include/sys/dir.h /usr/include/dirent.h \ + /usr/include/sys/dirent.h /usr/include/sys/stat.h /usr/include/sys/time.h /usr/include/time.h \ + /usr/include/stdio.h /usr/include/stdarg.h /usr/include/machine/stdarg.h /usr/include/stdlib.h \ + /usr/include/sys/socket.h /usr/include/netinet/in.h /usr/include/arpa/inet.h \ + /usr/include/netdb.h /usr/include/unistd.h /usr/include/sys/unistd.h /usr/include/ctype.h \ + /usr/include/sys/errno.h /usr/include/signal.h /usr/include/sys/signal.h /usr/include/machine/signal.h \ + /usr/include/math.h /usr/include/sys/file.h /usr/include/sys/fcntl.h /usr/include/sys/ioctl.h \ + /usr/include/sys/ttycom.h /usr/include/sys/ioccom.h /usr/include/sys/filio.h \ + /usr/include/sys/sockio.h /usr/include/sys/wait.h common.h vers.h legal.h command.h \ + variable.h comproc.h playerdb.h lists.h rmalloc.h utils.h multicol.h network.h \ + ficsmain.h config.h talkproc.h gamedb.h board.h ratings.h +ratings.o : ratings.c stdinclude.h /usr/include/sys/types.h /usr/include/machine/endian.h \ + /usr/include/sys/cdefs.h /usr/include/machine/ansi.h /usr/include/machine/types.h \ + /usr/include/strings.h /usr/include/string.h /usr/include/sys/dir.h /usr/include/dirent.h \ + /usr/include/sys/dirent.h /usr/include/sys/stat.h /usr/include/sys/time.h /usr/include/time.h \ + /usr/include/stdio.h /usr/include/stdarg.h /usr/include/machine/stdarg.h /usr/include/stdlib.h \ + /usr/include/sys/socket.h /usr/include/netinet/in.h /usr/include/arpa/inet.h \ + /usr/include/netdb.h /usr/include/unistd.h /usr/include/sys/unistd.h /usr/include/ctype.h \ + /usr/include/sys/errno.h /usr/include/signal.h /usr/include/sys/signal.h /usr/include/machine/signal.h \ + /usr/include/math.h /usr/include/sys/file.h /usr/include/sys/fcntl.h /usr/include/sys/ioctl.h \ + /usr/include/sys/ttycom.h /usr/include/sys/ioccom.h /usr/include/sys/filio.h \ + /usr/include/sys/sockio.h /usr/include/sys/wait.h common.h vers.h legal.h playerdb.h \ + command.h variable.h lists.h ratings.h gamedb.h board.h comproc.h ficsmain.h \ + config.h utils.h multicol.h +rmalloc.o : rmalloc.c stdinclude.h /usr/include/sys/types.h /usr/include/machine/endian.h \ + /usr/include/sys/cdefs.h /usr/include/machine/ansi.h /usr/include/machine/types.h \ + /usr/include/strings.h /usr/include/string.h /usr/include/sys/dir.h /usr/include/dirent.h \ + /usr/include/sys/dirent.h /usr/include/sys/stat.h /usr/include/sys/time.h /usr/include/time.h \ + /usr/include/stdio.h /usr/include/stdarg.h /usr/include/machine/stdarg.h /usr/include/stdlib.h \ + /usr/include/sys/socket.h /usr/include/netinet/in.h /usr/include/arpa/inet.h \ + /usr/include/netdb.h /usr/include/unistd.h /usr/include/sys/unistd.h /usr/include/ctype.h \ + /usr/include/sys/errno.h /usr/include/signal.h /usr/include/sys/signal.h /usr/include/machine/signal.h \ + /usr/include/math.h /usr/include/sys/file.h /usr/include/sys/fcntl.h /usr/include/sys/ioctl.h \ + /usr/include/sys/ttycom.h /usr/include/sys/ioccom.h /usr/include/sys/filio.h \ + /usr/include/sys/sockio.h /usr/include/sys/wait.h common.h vers.h legal.h +utils.o : utils.c stdinclude.h /usr/include/sys/types.h /usr/include/machine/endian.h \ + /usr/include/sys/cdefs.h /usr/include/machine/ansi.h /usr/include/machine/types.h \ + /usr/include/strings.h /usr/include/string.h /usr/include/sys/dir.h /usr/include/dirent.h \ + /usr/include/sys/dirent.h /usr/include/sys/stat.h /usr/include/sys/time.h /usr/include/time.h \ + /usr/include/stdio.h /usr/include/stdarg.h /usr/include/machine/stdarg.h /usr/include/stdlib.h \ + /usr/include/sys/socket.h /usr/include/netinet/in.h /usr/include/arpa/inet.h \ + /usr/include/netdb.h /usr/include/unistd.h /usr/include/sys/unistd.h /usr/include/ctype.h \ + /usr/include/sys/errno.h /usr/include/signal.h /usr/include/sys/signal.h /usr/include/machine/signal.h \ + /usr/include/math.h /usr/include/sys/file.h /usr/include/sys/fcntl.h /usr/include/sys/ioctl.h \ + /usr/include/sys/ttycom.h /usr/include/sys/ioccom.h /usr/include/sys/filio.h \ + /usr/include/sys/sockio.h /usr/include/sys/wait.h common.h vers.h legal.h utils.h \ + multicol.h playerdb.h command.h variable.h lists.h network.h rmalloc.h config.h +variable.o : variable.c stdinclude.h /usr/include/sys/types.h /usr/include/machine/endian.h \ + /usr/include/sys/cdefs.h /usr/include/machine/ansi.h /usr/include/machine/types.h \ + /usr/include/strings.h /usr/include/string.h /usr/include/sys/dir.h /usr/include/dirent.h \ + /usr/include/sys/dirent.h /usr/include/sys/stat.h /usr/include/sys/time.h /usr/include/time.h \ + /usr/include/stdio.h /usr/include/stdarg.h /usr/include/machine/stdarg.h /usr/include/stdlib.h \ + /usr/include/sys/socket.h /usr/include/netinet/in.h /usr/include/arpa/inet.h \ + /usr/include/netdb.h /usr/include/unistd.h /usr/include/sys/unistd.h /usr/include/ctype.h \ + /usr/include/sys/errno.h /usr/include/signal.h /usr/include/sys/signal.h /usr/include/machine/signal.h \ + /usr/include/math.h /usr/include/sys/file.h /usr/include/sys/fcntl.h /usr/include/sys/ioctl.h \ + /usr/include/sys/ttycom.h /usr/include/sys/ioccom.h /usr/include/sys/filio.h \ + /usr/include/sys/sockio.h /usr/include/sys/wait.h common.h vers.h legal.h variable.h \ + playerdb.h command.h lists.h utils.h multicol.h ficsmain.h config.h rmalloc.h \ + board.h talkproc.h comproc.h +vers.o : vers.c +eco.o : eco.c stdinclude.h /usr/include/sys/types.h /usr/include/machine/endian.h \ + /usr/include/sys/cdefs.h /usr/include/machine/ansi.h /usr/include/machine/types.h \ + /usr/include/strings.h /usr/include/string.h /usr/include/sys/dir.h /usr/include/dirent.h \ + /usr/include/sys/dirent.h /usr/include/sys/stat.h /usr/include/sys/time.h /usr/include/time.h \ + /usr/include/stdio.h /usr/include/stdarg.h /usr/include/machine/stdarg.h /usr/include/stdlib.h \ + /usr/include/sys/socket.h /usr/include/netinet/in.h /usr/include/arpa/inet.h \ + /usr/include/netdb.h /usr/include/unistd.h /usr/include/sys/unistd.h /usr/include/ctype.h \ + /usr/include/sys/errno.h /usr/include/signal.h /usr/include/sys/signal.h /usr/include/machine/signal.h \ + /usr/include/math.h /usr/include/sys/file.h /usr/include/sys/fcntl.h /usr/include/sys/ioctl.h \ + /usr/include/sys/ttycom.h /usr/include/sys/ioccom.h /usr/include/sys/filio.h \ + /usr/include/sys/sockio.h /usr/include/sys/wait.h board.h gamedb.h command.h \ + variable.h playerdb.h lists.h gameproc.h obsproc.h utils.h multicol.h common.h \ + vers.h legal.h config.h +rating_conv.o : rating_conv.c rating_conv.h common.h vers.h legal.h stdinclude.h \ + /usr/include/sys/types.h /usr/include/machine/endian.h /usr/include/sys/cdefs.h \ + /usr/include/machine/ansi.h /usr/include/machine/types.h /usr/include/strings.h \ + /usr/include/string.h /usr/include/sys/dir.h /usr/include/dirent.h /usr/include/sys/dirent.h \ + /usr/include/sys/stat.h /usr/include/sys/time.h /usr/include/time.h /usr/include/stdio.h \ + /usr/include/stdarg.h /usr/include/machine/stdarg.h /usr/include/stdlib.h /usr/include/sys/socket.h \ + /usr/include/netinet/in.h /usr/include/arpa/inet.h /usr/include/netdb.h /usr/include/unistd.h \ + /usr/include/sys/unistd.h /usr/include/ctype.h /usr/include/sys/errno.h /usr/include/signal.h \ + /usr/include/sys/signal.h /usr/include/machine/signal.h /usr/include/math.h \ + /usr/include/sys/file.h /usr/include/sys/fcntl.h /usr/include/sys/ioctl.h /usr/include/sys/ttycom.h \ + /usr/include/sys/ioccom.h /usr/include/sys/filio.h /usr/include/sys/sockio.h \ + /usr/include/sys/wait.h command.h variable.h utils.h multicol.h +shutdown.o : shutdown.c stdinclude.h /usr/include/sys/types.h /usr/include/machine/endian.h \ + /usr/include/sys/cdefs.h /usr/include/machine/ansi.h /usr/include/machine/types.h \ + /usr/include/strings.h /usr/include/string.h /usr/include/sys/dir.h /usr/include/dirent.h \ + /usr/include/sys/dirent.h /usr/include/sys/stat.h /usr/include/sys/time.h /usr/include/time.h \ + /usr/include/stdio.h /usr/include/stdarg.h /usr/include/machine/stdarg.h /usr/include/stdlib.h \ + /usr/include/sys/socket.h /usr/include/netinet/in.h /usr/include/arpa/inet.h \ + /usr/include/netdb.h /usr/include/unistd.h /usr/include/sys/unistd.h /usr/include/ctype.h \ + /usr/include/sys/errno.h /usr/include/signal.h /usr/include/sys/signal.h /usr/include/machine/signal.h \ + /usr/include/math.h /usr/include/sys/file.h /usr/include/sys/fcntl.h /usr/include/sys/ioctl.h \ + /usr/include/sys/ttycom.h /usr/include/sys/ioccom.h /usr/include/sys/filio.h \ + /usr/include/sys/sockio.h /usr/include/sys/wait.h common.h vers.h legal.h shutdown.h \ + command.h variable.h ficsmain.h network.h playerdb.h lists.h utils.h multicol.h diff --git a/FICS/GNU_LICENSE b/FICS/GNU_LICENSE new file mode 100644 index 0000000..a43ea21 --- /dev/null +++ b/FICS/GNU_LICENSE @@ -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/FICS/Makedist b/FICS/Makedist new file mode 100644 index 0000000..f4ef7b4 --- /dev/null +++ b/FICS/Makedist @@ -0,0 +1,6 @@ +# Makefile for tar + +distrib: + tar cvf - GNU* Make* *.[c,h] READ* | compress > FICS.src_beta-1.2.17.tar.Z + + diff --git a/FICS/Makefile b/FICS/Makefile new file mode 100644 index 0000000..a23b3d9 --- /dev/null +++ b/FICS/Makefile @@ -0,0 +1,50 @@ +# Makefile for FICS +# This was originally written under NeXTSTEP +# + +# Turn on optimization +# With optimization on you may get errors during compiling. +OPTFLAGS= + +# Turn on debugging +#DEBUGFLAGS=-DDEBUG + +# Anything else you care to flag? +#OTHERFLAGS=-traditional-cpp -Wall -g +OTHERFLAGS=-Wall -g -pg + +# Which architectures are you compiling for? (NeXTSTEP) +# ARCHFLAGS=-arch m68k -arch i386 + +PROGRAM=fics + + +CC=gcc +#cc doesn't seem to be supported at present. + +CFLAGS=${SYSFLAG} ${OPTFLAGS} ${DEBUGFLAGS} ${OTHERFLAGS} ${ARCHFLAGS} +LNFLAGS=-lm -lcompat -lcrypt + +# dfree is temporary, for debugging only, and works only if you are using +# the GNU C library --mann +#MORESRCS=dfree.c +#MOREOBJS=dfree.o +#you may have to hash out the above two + +# This is just for versions distributed with timeseal. +#MORESRCS=timeseal.c +#MOREOBJS=timeseal.o + +# Define the system below that you are compiling on. +# Set the flags for your system + +SYSFLAG=-DNETBSD #-DTIMESEAL #-DIGNORE_ECO + +# The following is needed when using gcc and glibc, as on caissa. +#MAKEDEPMORECFLAGS= -I/usr/local/include -I/usr/local/lib/gcc-lib/sparc-sun-sunos4.1.3/2.6.3/include + +include ./Makefile.common +# include ./Makedist + +#run makedepend to fill out the info below +# DO NOT DELETE THIS LINE -- make depend depends on it. diff --git a/FICS/Makefile.alpha b/FICS/Makefile.alpha new file mode 100644 index 0000000..80c1584 --- /dev/null +++ b/FICS/Makefile.alpha @@ -0,0 +1,33 @@ +# Makefile for FICS +# This version is for the Alpha under Digital OSF/1 Unix +# +# Define the system below that you are compiling on. +#SYSFLAG= -DSYSV -DSYSTEM_AIX +SYSFLAG= + +# Set the flags for your system + +# Turn on optimization +# With optimization on you may get errors during compiling. +#OPTFLAGS=-O + +# Turn on debugging +DEBUGFLAGS= -DDEBUG -g + +# Anything else you care to flag? +#OTHERFLAGS= -qlanglvl=saa +OTHERFLAGS= -DHAVE_STDARG + +# Which architectures are you compiling for? (NeXTSTEP) +# ARCHFLAGS=-arch m68k -arch i386 + +PROGRAM=fics + + +#CC=gcc -ansi -pedantic -O3 -pipe -fomit-frame-pointer +#CC=xlc +CC=cc +CFLAGS=${SYSFLAG} ${OPTFLAGS} ${DEBUGFLAGS} ${OTHERFLAGS} ${ARCHFLAGS} +LNFLAGS=-lm + +include ./Makefile.common diff --git a/FICS/Makefile.bak b/FICS/Makefile.bak new file mode 100644 index 0000000..7380eaa --- /dev/null +++ b/FICS/Makefile.bak @@ -0,0 +1,645 @@ +# Makefile for FICS +# This was originally written under NeXTSTEP +# +# Define the system below that you are compiling on. + +SYSFLAG=-DSYSTEM_SUN4 + +# Set the flags for your system + +# Turn on optimization +# With optimization on you may get errors during compiling. +OPTFLAGS= + +# Turn on debugging +#DEBUGFLAGS=-DDEBUG + +# Anything else you care to flag? +#OTHERFLAGS=-traditional-cpp -Wall -g +OTHERFLAGS=-Wall -g + +# Which architectures are you compiling for? (NeXTSTEP) +# ARCHFLAGS=-arch m68k -arch i386 + +PROGRAM=fics + + +CC=gcc +#cc doesn't seem to be supported at present. + +CFLAGS=${SYSFLAG} ${OPTFLAGS} ${DEBUGFLAGS} ${OTHERFLAGS} ${ARCHFLAGS} +LNFLAGS=-lm + +# dfree is temporary, for debugging only, and works only if you are using +# the GNU C library --mann +#MORESRCS=dfree.c +#MOREOBJS=dfree.o +#you may have to hash out the above two + +# This is just for versions distributed with timeseal. +MORESRCS=timeseal.c +MOREOBJS=timeseal.o +SYSFLAG=-DSYSTEM_SUN4 -DTIMESEAL + +# The following is needed when using gcc and glibc, as on caissa. +MAKEDEPMORECFLAGS= -I/usr/local/include -I/usr/local/lib/gcc-lib/sparc-sun-sunos4.1.3/2.6.3/include + +include ./Makefile.common +# include ./Makedist + +#run makedepend to fill out the info below +# DO NOT DELETE THIS LINE -- make depend depends on it. + +adminproc.o: stdinclude.h /usr/local/include/sys/types.h +adminproc.o: /usr/local/include/features.h /usr/local/include/sys/cdefs.h +adminproc.o: /usr/local/include/stubs.h /usr/local/include/gnu/types.h +adminproc.o: /usr/local/include/sys/time.h /usr/local/include/stddef.h +adminproc.o: /usr/local/include/strings.h /usr/local/include/string.h +adminproc.o: /usr/local/include/sys/dir.h /usr/local/include/dirent.h +adminproc.o: /usr/local/include/dirstream.h /usr/local/include/sys/stat.h +adminproc.o: /usr/local/include/statbuf.h /usr/local/include/stdio.h stdarg.h +adminproc.o: /usr/local/include/stdlib.h /usr/local/include/errno.h +adminproc.o: /usr/local/include/errnos.h /usr/local/include/sys/socket.h +adminproc.o: /usr/local/include/netinet/in.h /usr/local/include/endian.h +adminproc.o: /usr/local/include/bytesex.h /usr/local/include/arpa/inet.h +adminproc.o: /usr/local/include/netdb.h /usr/local/include/unistd.h +adminproc.o: /usr/local/include/posix_opt.h /usr/local/include/confname.h +adminproc.o: /usr/local/include/ctype.h /usr/local/include/sys/errno.h +adminproc.o: /usr/local/include/signal.h /usr/local/include/sigset.h +adminproc.o: /usr/local/include/math.h /usr/local/include/huge_val.h +adminproc.o: /usr/local/include/__math.h /usr/local/include/sys/time.h +adminproc.o: /usr/local/include/sys/file.h /usr/local/include/sys/fcntl.h +adminproc.o: /usr/local/include/sys/ioctl.h /usr/local/include/ioctls.h +adminproc.o: /usr/local/include/sys/ttydefaults.h +adminproc.o: /usr/local/include/sys/wait.h /usr/local/include/waitflags.h +adminproc.o: /usr/local/include/waitstatus.h common.h vers.h legal.h +adminproc.o: network.h command.h variable.h adminproc.h playerdb.h gamedb.h +adminproc.o: board.h gameproc.h ratings.h utils.h multicol.h rmalloc.h +adminproc.o: talkproc.h comproc.h +algcheck.o: stdinclude.h /usr/local/include/sys/types.h +algcheck.o: /usr/local/include/features.h /usr/local/include/sys/cdefs.h +algcheck.o: /usr/local/include/stubs.h /usr/local/include/gnu/types.h +algcheck.o: /usr/local/include/sys/time.h /usr/local/include/stddef.h +algcheck.o: /usr/local/include/strings.h /usr/local/include/string.h +algcheck.o: /usr/local/include/sys/dir.h /usr/local/include/dirent.h +algcheck.o: /usr/local/include/dirstream.h /usr/local/include/sys/stat.h +algcheck.o: /usr/local/include/statbuf.h /usr/local/include/stdio.h stdarg.h +algcheck.o: /usr/local/include/stdlib.h /usr/local/include/errno.h +algcheck.o: /usr/local/include/errnos.h /usr/local/include/sys/socket.h +algcheck.o: /usr/local/include/netinet/in.h /usr/local/include/endian.h +algcheck.o: /usr/local/include/bytesex.h /usr/local/include/arpa/inet.h +algcheck.o: /usr/local/include/netdb.h /usr/local/include/unistd.h +algcheck.o: /usr/local/include/posix_opt.h /usr/local/include/confname.h +algcheck.o: /usr/local/include/ctype.h /usr/local/include/sys/errno.h +algcheck.o: /usr/local/include/signal.h /usr/local/include/sigset.h +algcheck.o: /usr/local/include/math.h /usr/local/include/huge_val.h +algcheck.o: /usr/local/include/__math.h /usr/local/include/sys/time.h +algcheck.o: /usr/local/include/sys/file.h /usr/local/include/sys/fcntl.h +algcheck.o: /usr/local/include/sys/ioctl.h /usr/local/include/ioctls.h +algcheck.o: /usr/local/include/sys/ttydefaults.h +algcheck.o: /usr/local/include/sys/wait.h /usr/local/include/waitflags.h +algcheck.o: /usr/local/include/waitstatus.h common.h vers.h legal.h +algcheck.o: algcheck.h board.h movecheck.h utils.h multicol.h +board.o: stdinclude.h /usr/local/include/sys/types.h +board.o: /usr/local/include/features.h /usr/local/include/sys/cdefs.h +board.o: /usr/local/include/stubs.h /usr/local/include/gnu/types.h +board.o: /usr/local/include/sys/time.h /usr/local/include/stddef.h +board.o: /usr/local/include/strings.h /usr/local/include/string.h +board.o: /usr/local/include/sys/dir.h /usr/local/include/dirent.h +board.o: /usr/local/include/dirstream.h /usr/local/include/sys/stat.h +board.o: /usr/local/include/statbuf.h /usr/local/include/stdio.h stdarg.h +board.o: /usr/local/include/stdlib.h /usr/local/include/errno.h +board.o: /usr/local/include/errnos.h /usr/local/include/sys/socket.h +board.o: /usr/local/include/netinet/in.h /usr/local/include/endian.h +board.o: /usr/local/include/bytesex.h /usr/local/include/arpa/inet.h +board.o: /usr/local/include/netdb.h /usr/local/include/unistd.h +board.o: /usr/local/include/posix_opt.h /usr/local/include/confname.h +board.o: /usr/local/include/ctype.h /usr/local/include/sys/errno.h +board.o: /usr/local/include/signal.h /usr/local/include/sigset.h +board.o: /usr/local/include/math.h /usr/local/include/huge_val.h +board.o: /usr/local/include/__math.h /usr/local/include/sys/time.h +board.o: /usr/local/include/sys/file.h /usr/local/include/sys/fcntl.h +board.o: /usr/local/include/sys/ioctl.h /usr/local/include/ioctls.h +board.o: /usr/local/include/sys/ttydefaults.h /usr/local/include/sys/wait.h +board.o: /usr/local/include/waitflags.h /usr/local/include/waitstatus.h +board.o: common.h vers.h legal.h board.h playerdb.h command.h variable.h +board.o: gamedb.h utils.h multicol.h +channel.o: stdinclude.h /usr/local/include/sys/types.h +channel.o: /usr/local/include/features.h /usr/local/include/sys/cdefs.h +channel.o: /usr/local/include/stubs.h /usr/local/include/gnu/types.h +channel.o: /usr/local/include/sys/time.h /usr/local/include/stddef.h +channel.o: /usr/local/include/strings.h /usr/local/include/string.h +channel.o: /usr/local/include/sys/dir.h /usr/local/include/dirent.h +channel.o: /usr/local/include/dirstream.h /usr/local/include/sys/stat.h +channel.o: /usr/local/include/statbuf.h /usr/local/include/stdio.h stdarg.h +channel.o: /usr/local/include/stdlib.h /usr/local/include/errno.h +channel.o: /usr/local/include/errnos.h /usr/local/include/sys/socket.h +channel.o: /usr/local/include/netinet/in.h /usr/local/include/endian.h +channel.o: /usr/local/include/bytesex.h /usr/local/include/arpa/inet.h +channel.o: /usr/local/include/netdb.h /usr/local/include/unistd.h +channel.o: /usr/local/include/posix_opt.h /usr/local/include/confname.h +channel.o: /usr/local/include/ctype.h /usr/local/include/sys/errno.h +channel.o: /usr/local/include/signal.h /usr/local/include/sigset.h +channel.o: /usr/local/include/math.h /usr/local/include/huge_val.h +channel.o: /usr/local/include/__math.h /usr/local/include/sys/time.h +channel.o: /usr/local/include/sys/file.h /usr/local/include/sys/fcntl.h +channel.o: /usr/local/include/sys/ioctl.h /usr/local/include/ioctls.h +channel.o: /usr/local/include/sys/ttydefaults.h /usr/local/include/sys/wait.h +channel.o: /usr/local/include/waitflags.h /usr/local/include/waitstatus.h +channel.o: common.h vers.h legal.h channel.h network.h command.h variable.h +channel.o: rmalloc.h playerdb.h +command.o: stdinclude.h /usr/local/include/sys/types.h +command.o: /usr/local/include/features.h /usr/local/include/sys/cdefs.h +command.o: /usr/local/include/stubs.h /usr/local/include/gnu/types.h +command.o: /usr/local/include/sys/time.h /usr/local/include/stddef.h +command.o: /usr/local/include/strings.h /usr/local/include/string.h +command.o: /usr/local/include/sys/dir.h /usr/local/include/dirent.h +command.o: /usr/local/include/dirstream.h /usr/local/include/sys/stat.h +command.o: /usr/local/include/statbuf.h /usr/local/include/stdio.h stdarg.h +command.o: /usr/local/include/stdlib.h /usr/local/include/errno.h +command.o: /usr/local/include/errnos.h /usr/local/include/sys/socket.h +command.o: /usr/local/include/netinet/in.h /usr/local/include/endian.h +command.o: /usr/local/include/bytesex.h /usr/local/include/arpa/inet.h +command.o: /usr/local/include/netdb.h /usr/local/include/unistd.h +command.o: /usr/local/include/posix_opt.h /usr/local/include/confname.h +command.o: /usr/local/include/ctype.h /usr/local/include/sys/errno.h +command.o: /usr/local/include/signal.h /usr/local/include/sigset.h +command.o: /usr/local/include/math.h /usr/local/include/huge_val.h +command.o: /usr/local/include/__math.h /usr/local/include/sys/time.h +command.o: /usr/local/include/sys/file.h /usr/local/include/sys/fcntl.h +command.o: /usr/local/include/sys/ioctl.h /usr/local/include/ioctls.h +command.o: /usr/local/include/sys/ttydefaults.h /usr/local/include/sys/wait.h +command.o: /usr/local/include/waitflags.h /usr/local/include/waitstatus.h +command.o: common.h vers.h legal.h rmalloc.h command.h variable.h +command.o: command_list.h comproc.h matchproc.h talkproc.h lists.h gameproc.h +command.o: adminproc.h playerdb.h ratings.h eco.h movecheck.h ficsmain.h +command.o: config.h utils.h multicol.h gamedb.h board.h network.h +talkproc.o: stdinclude.h /usr/local/include/sys/types.h +talkproc.o: /usr/local/include/features.h /usr/local/include/sys/cdefs.h +talkproc.o: /usr/local/include/stubs.h /usr/local/include/gnu/types.h +talkproc.o: /usr/local/include/sys/time.h /usr/local/include/stddef.h +talkproc.o: /usr/local/include/strings.h /usr/local/include/string.h +talkproc.o: /usr/local/include/sys/dir.h /usr/local/include/dirent.h +talkproc.o: /usr/local/include/dirstream.h /usr/local/include/sys/stat.h +talkproc.o: /usr/local/include/statbuf.h /usr/local/include/stdio.h stdarg.h +talkproc.o: /usr/local/include/stdlib.h /usr/local/include/errno.h +talkproc.o: /usr/local/include/errnos.h /usr/local/include/sys/socket.h +talkproc.o: /usr/local/include/netinet/in.h /usr/local/include/endian.h +talkproc.o: /usr/local/include/bytesex.h /usr/local/include/arpa/inet.h +talkproc.o: /usr/local/include/netdb.h /usr/local/include/unistd.h +talkproc.o: /usr/local/include/posix_opt.h /usr/local/include/confname.h +talkproc.o: /usr/local/include/ctype.h /usr/local/include/sys/errno.h +talkproc.o: /usr/local/include/signal.h /usr/local/include/sigset.h +talkproc.o: /usr/local/include/math.h /usr/local/include/huge_val.h +talkproc.o: /usr/local/include/__math.h /usr/local/include/sys/time.h +talkproc.o: /usr/local/include/sys/file.h /usr/local/include/sys/fcntl.h +talkproc.o: /usr/local/include/sys/ioctl.h /usr/local/include/ioctls.h +talkproc.o: /usr/local/include/sys/ttydefaults.h +talkproc.o: /usr/local/include/sys/wait.h /usr/local/include/waitflags.h +talkproc.o: /usr/local/include/waitstatus.h common.h vers.h legal.h +talkproc.o: talkproc.h comproc.h command.h variable.h utils.h multicol.h +talkproc.o: ficsmain.h config.h playerdb.h network.h rmalloc.h channel.h +talkproc.o: gamedb.h board.h gameproc.h lists.h +talkproc.o: /usr/local/include/sys/resource.h +talkproc.o: /usr/local/include/resourcebits.h +comproc.o: stdinclude.h /usr/local/include/sys/types.h +comproc.o: /usr/local/include/features.h /usr/local/include/sys/cdefs.h +comproc.o: /usr/local/include/stubs.h /usr/local/include/gnu/types.h +comproc.o: /usr/local/include/sys/time.h /usr/local/include/stddef.h +comproc.o: /usr/local/include/strings.h /usr/local/include/string.h +comproc.o: /usr/local/include/sys/dir.h /usr/local/include/dirent.h +comproc.o: /usr/local/include/dirstream.h /usr/local/include/sys/stat.h +comproc.o: /usr/local/include/statbuf.h /usr/local/include/stdio.h stdarg.h +comproc.o: /usr/local/include/stdlib.h /usr/local/include/errno.h +comproc.o: /usr/local/include/errnos.h /usr/local/include/sys/socket.h +comproc.o: /usr/local/include/netinet/in.h /usr/local/include/endian.h +comproc.o: /usr/local/include/bytesex.h /usr/local/include/arpa/inet.h +comproc.o: /usr/local/include/netdb.h /usr/local/include/unistd.h +comproc.o: /usr/local/include/posix_opt.h /usr/local/include/confname.h +comproc.o: /usr/local/include/ctype.h /usr/local/include/sys/errno.h +comproc.o: /usr/local/include/signal.h /usr/local/include/sigset.h +comproc.o: /usr/local/include/math.h /usr/local/include/huge_val.h +comproc.o: /usr/local/include/__math.h /usr/local/include/sys/time.h +comproc.o: /usr/local/include/sys/file.h /usr/local/include/sys/fcntl.h +comproc.o: /usr/local/include/sys/ioctl.h /usr/local/include/ioctls.h +comproc.o: /usr/local/include/sys/ttydefaults.h /usr/local/include/sys/wait.h +comproc.o: /usr/local/include/waitflags.h /usr/local/include/waitstatus.h +comproc.o: common.h vers.h legal.h talkproc.h comproc.h command.h variable.h +comproc.o: utils.h multicol.h ficsmain.h config.h playerdb.h network.h +comproc.o: rmalloc.h channel.h gamedb.h board.h gameproc.h ratings.h +comproc.o: formula.h lists.h eco.h /usr/local/include/sys/resource.h +comproc.o: /usr/local/include/resourcebits.h +matchproc.o: stdinclude.h /usr/local/include/sys/types.h +matchproc.o: /usr/local/include/features.h /usr/local/include/sys/cdefs.h +matchproc.o: /usr/local/include/stubs.h /usr/local/include/gnu/types.h +matchproc.o: /usr/local/include/sys/time.h /usr/local/include/stddef.h +matchproc.o: /usr/local/include/strings.h /usr/local/include/string.h +matchproc.o: /usr/local/include/sys/dir.h /usr/local/include/dirent.h +matchproc.o: /usr/local/include/dirstream.h /usr/local/include/sys/stat.h +matchproc.o: /usr/local/include/statbuf.h /usr/local/include/stdio.h stdarg.h +matchproc.o: /usr/local/include/stdlib.h /usr/local/include/errno.h +matchproc.o: /usr/local/include/errnos.h /usr/local/include/sys/socket.h +matchproc.o: /usr/local/include/netinet/in.h /usr/local/include/endian.h +matchproc.o: /usr/local/include/bytesex.h /usr/local/include/arpa/inet.h +matchproc.o: /usr/local/include/netdb.h /usr/local/include/unistd.h +matchproc.o: /usr/local/include/posix_opt.h /usr/local/include/confname.h +matchproc.o: /usr/local/include/ctype.h /usr/local/include/sys/errno.h +matchproc.o: /usr/local/include/signal.h /usr/local/include/sigset.h +matchproc.o: /usr/local/include/math.h /usr/local/include/huge_val.h +matchproc.o: /usr/local/include/__math.h /usr/local/include/sys/time.h +matchproc.o: /usr/local/include/sys/file.h /usr/local/include/sys/fcntl.h +matchproc.o: /usr/local/include/sys/ioctl.h /usr/local/include/ioctls.h +matchproc.o: /usr/local/include/sys/ttydefaults.h +matchproc.o: /usr/local/include/sys/wait.h /usr/local/include/waitflags.h +matchproc.o: /usr/local/include/waitstatus.h common.h vers.h legal.h +matchproc.o: talkproc.h comproc.h command.h variable.h utils.h multicol.h +matchproc.o: ficsmain.h config.h playerdb.h network.h rmalloc.h channel.h +matchproc.o: gamedb.h board.h gameproc.h ratings.h formula.h lists.h eco.h +matchproc.o: /usr/local/include/sys/resource.h +matchproc.o: /usr/local/include/resourcebits.h +fics_addplayer.o: stdinclude.h /usr/local/include/sys/types.h +fics_addplayer.o: /usr/local/include/features.h +fics_addplayer.o: /usr/local/include/sys/cdefs.h /usr/local/include/stubs.h +fics_addplayer.o: /usr/local/include/gnu/types.h +fics_addplayer.o: /usr/local/include/sys/time.h /usr/local/include/stddef.h +fics_addplayer.o: /usr/local/include/strings.h /usr/local/include/string.h +fics_addplayer.o: /usr/local/include/sys/dir.h /usr/local/include/dirent.h +fics_addplayer.o: /usr/local/include/dirstream.h +fics_addplayer.o: /usr/local/include/sys/stat.h /usr/local/include/statbuf.h +fics_addplayer.o: /usr/local/include/stdio.h stdarg.h +fics_addplayer.o: /usr/local/include/stdlib.h /usr/local/include/errno.h +fics_addplayer.o: /usr/local/include/errnos.h /usr/local/include/sys/socket.h +fics_addplayer.o: /usr/local/include/netinet/in.h /usr/local/include/endian.h +fics_addplayer.o: /usr/local/include/bytesex.h /usr/local/include/arpa/inet.h +fics_addplayer.o: /usr/local/include/netdb.h /usr/local/include/unistd.h +fics_addplayer.o: /usr/local/include/posix_opt.h +fics_addplayer.o: /usr/local/include/confname.h /usr/local/include/ctype.h +fics_addplayer.o: /usr/local/include/sys/errno.h /usr/local/include/signal.h +fics_addplayer.o: /usr/local/include/sigset.h /usr/local/include/math.h +fics_addplayer.o: /usr/local/include/huge_val.h /usr/local/include/__math.h +fics_addplayer.o: /usr/local/include/sys/time.h /usr/local/include/sys/file.h +fics_addplayer.o: /usr/local/include/sys/fcntl.h +fics_addplayer.o: /usr/local/include/sys/ioctl.h /usr/local/include/ioctls.h +fics_addplayer.o: /usr/local/include/sys/ttydefaults.h +fics_addplayer.o: /usr/local/include/sys/wait.h +fics_addplayer.o: /usr/local/include/waitflags.h +fics_addplayer.o: /usr/local/include/waitstatus.h common.h vers.h legal.h +fics_addplayer.o: utils.h multicol.h playerdb.h command.h variable.h +ficsmain.o: stdinclude.h /usr/local/include/sys/types.h +ficsmain.o: /usr/local/include/features.h /usr/local/include/sys/cdefs.h +ficsmain.o: /usr/local/include/stubs.h /usr/local/include/gnu/types.h +ficsmain.o: /usr/local/include/sys/time.h /usr/local/include/stddef.h +ficsmain.o: /usr/local/include/strings.h /usr/local/include/string.h +ficsmain.o: /usr/local/include/sys/dir.h /usr/local/include/dirent.h +ficsmain.o: /usr/local/include/dirstream.h /usr/local/include/sys/stat.h +ficsmain.o: /usr/local/include/statbuf.h /usr/local/include/stdio.h stdarg.h +ficsmain.o: /usr/local/include/stdlib.h /usr/local/include/errno.h +ficsmain.o: /usr/local/include/errnos.h /usr/local/include/sys/socket.h +ficsmain.o: /usr/local/include/netinet/in.h /usr/local/include/endian.h +ficsmain.o: /usr/local/include/bytesex.h /usr/local/include/arpa/inet.h +ficsmain.o: /usr/local/include/netdb.h /usr/local/include/unistd.h +ficsmain.o: /usr/local/include/posix_opt.h /usr/local/include/confname.h +ficsmain.o: /usr/local/include/ctype.h /usr/local/include/sys/errno.h +ficsmain.o: /usr/local/include/signal.h /usr/local/include/sigset.h +ficsmain.o: /usr/local/include/math.h /usr/local/include/huge_val.h +ficsmain.o: /usr/local/include/__math.h /usr/local/include/sys/time.h +ficsmain.o: /usr/local/include/sys/file.h /usr/local/include/sys/fcntl.h +ficsmain.o: /usr/local/include/sys/ioctl.h /usr/local/include/ioctls.h +ficsmain.o: /usr/local/include/sys/ttydefaults.h +ficsmain.o: /usr/local/include/sys/wait.h /usr/local/include/waitflags.h +ficsmain.o: /usr/local/include/waitstatus.h common.h vers.h legal.h +ficsmain.o: ficsmain.h config.h network.h command.h variable.h channel.h +ficsmain.o: playerdb.h ratings.h utils.h multicol.h board.h talkproc.h +ficsmain.o: comproc.h eco.h +formula.o: /usr/local/include/ctype.h /usr/local/include/features.h +formula.o: /usr/local/include/sys/cdefs.h /usr/local/include/stubs.h config.h +formula.o: formula.h playerdb.h command.h variable.h gamedb.h +formula.o: /usr/local/include/sys/time.h board.h common.h vers.h legal.h +formula.o: stdinclude.h /usr/local/include/sys/types.h +formula.o: /usr/local/include/gnu/types.h /usr/local/include/stddef.h +formula.o: /usr/local/include/strings.h /usr/local/include/string.h +formula.o: /usr/local/include/sys/dir.h /usr/local/include/dirent.h +formula.o: /usr/local/include/dirstream.h /usr/local/include/sys/stat.h +formula.o: /usr/local/include/statbuf.h /usr/local/include/stdio.h stdarg.h +formula.o: /usr/local/include/stdlib.h /usr/local/include/errno.h +formula.o: /usr/local/include/errnos.h /usr/local/include/sys/socket.h +formula.o: /usr/local/include/netinet/in.h /usr/local/include/endian.h +formula.o: /usr/local/include/bytesex.h /usr/local/include/arpa/inet.h +formula.o: /usr/local/include/netdb.h /usr/local/include/unistd.h +formula.o: /usr/local/include/posix_opt.h /usr/local/include/confname.h +formula.o: /usr/local/include/sys/errno.h /usr/local/include/signal.h +formula.o: /usr/local/include/sigset.h /usr/local/include/math.h +formula.o: /usr/local/include/huge_val.h /usr/local/include/__math.h +formula.o: /usr/local/include/sys/time.h /usr/local/include/sys/file.h +formula.o: /usr/local/include/sys/fcntl.h /usr/local/include/sys/ioctl.h +formula.o: /usr/local/include/ioctls.h /usr/local/include/sys/ttydefaults.h +formula.o: /usr/local/include/sys/wait.h /usr/local/include/waitflags.h +formula.o: /usr/local/include/waitstatus.h utils.h multicol.h rmalloc.h +formula.o: lists.h +gamedb.o: stdinclude.h /usr/local/include/sys/types.h +gamedb.o: /usr/local/include/features.h /usr/local/include/sys/cdefs.h +gamedb.o: /usr/local/include/stubs.h /usr/local/include/gnu/types.h +gamedb.o: /usr/local/include/sys/time.h /usr/local/include/stddef.h +gamedb.o: /usr/local/include/strings.h /usr/local/include/string.h +gamedb.o: /usr/local/include/sys/dir.h /usr/local/include/dirent.h +gamedb.o: /usr/local/include/dirstream.h /usr/local/include/sys/stat.h +gamedb.o: /usr/local/include/statbuf.h /usr/local/include/stdio.h stdarg.h +gamedb.o: /usr/local/include/stdlib.h /usr/local/include/errno.h +gamedb.o: /usr/local/include/errnos.h /usr/local/include/sys/socket.h +gamedb.o: /usr/local/include/netinet/in.h /usr/local/include/endian.h +gamedb.o: /usr/local/include/bytesex.h /usr/local/include/arpa/inet.h +gamedb.o: /usr/local/include/netdb.h /usr/local/include/unistd.h +gamedb.o: /usr/local/include/posix_opt.h /usr/local/include/confname.h +gamedb.o: /usr/local/include/ctype.h /usr/local/include/sys/errno.h +gamedb.o: /usr/local/include/signal.h /usr/local/include/sigset.h +gamedb.o: /usr/local/include/math.h /usr/local/include/huge_val.h +gamedb.o: /usr/local/include/__math.h /usr/local/include/sys/time.h +gamedb.o: /usr/local/include/sys/file.h /usr/local/include/sys/fcntl.h +gamedb.o: /usr/local/include/sys/ioctl.h /usr/local/include/ioctls.h +gamedb.o: /usr/local/include/sys/ttydefaults.h /usr/local/include/sys/wait.h +gamedb.o: /usr/local/include/waitflags.h /usr/local/include/waitstatus.h +gamedb.o: common.h vers.h legal.h ficsmain.h config.h gamedb.h board.h +gamedb.o: playerdb.h command.h variable.h gameproc.h utils.h multicol.h +gamedb.o: rmalloc.h eco.h network.h +gameproc.o: stdinclude.h /usr/local/include/sys/types.h +gameproc.o: /usr/local/include/features.h /usr/local/include/sys/cdefs.h +gameproc.o: /usr/local/include/stubs.h /usr/local/include/gnu/types.h +gameproc.o: /usr/local/include/sys/time.h /usr/local/include/stddef.h +gameproc.o: /usr/local/include/strings.h /usr/local/include/string.h +gameproc.o: /usr/local/include/sys/dir.h /usr/local/include/dirent.h +gameproc.o: /usr/local/include/dirstream.h /usr/local/include/sys/stat.h +gameproc.o: /usr/local/include/statbuf.h /usr/local/include/stdio.h stdarg.h +gameproc.o: /usr/local/include/stdlib.h /usr/local/include/errno.h +gameproc.o: /usr/local/include/errnos.h /usr/local/include/sys/socket.h +gameproc.o: /usr/local/include/netinet/in.h /usr/local/include/endian.h +gameproc.o: /usr/local/include/bytesex.h /usr/local/include/arpa/inet.h +gameproc.o: /usr/local/include/netdb.h /usr/local/include/unistd.h +gameproc.o: /usr/local/include/posix_opt.h /usr/local/include/confname.h +gameproc.o: /usr/local/include/ctype.h /usr/local/include/sys/errno.h +gameproc.o: /usr/local/include/signal.h /usr/local/include/sigset.h +gameproc.o: /usr/local/include/math.h /usr/local/include/huge_val.h +gameproc.o: /usr/local/include/__math.h /usr/local/include/sys/time.h +gameproc.o: /usr/local/include/sys/file.h /usr/local/include/sys/fcntl.h +gameproc.o: /usr/local/include/sys/ioctl.h /usr/local/include/ioctls.h +gameproc.o: /usr/local/include/sys/ttydefaults.h +gameproc.o: /usr/local/include/sys/wait.h /usr/local/include/waitflags.h +gameproc.o: /usr/local/include/waitstatus.h common.h vers.h legal.h command.h +gameproc.o: variable.h ficsmain.h config.h playerdb.h gamedb.h board.h +gameproc.o: gameproc.h movecheck.h utils.h multicol.h ratings.h rmalloc.h +gameproc.o: comproc.h matchproc.h formula.h eco.h network.h +lists.o: lists.h common.h vers.h legal.h multicol.h command.h variable.h +lists.o: utils.h /usr/local/include/stdio.h playerdb.h ratings.h rmalloc.h +lists.o: gamedb.h /usr/local/include/sys/time.h /usr/local/include/features.h +lists.o: /usr/local/include/sys/cdefs.h /usr/local/include/stubs.h board.h +lists.o: stdinclude.h /usr/local/include/sys/types.h +lists.o: /usr/local/include/gnu/types.h /usr/local/include/stddef.h +lists.o: /usr/local/include/strings.h /usr/local/include/string.h +lists.o: /usr/local/include/sys/dir.h /usr/local/include/dirent.h +lists.o: /usr/local/include/dirstream.h /usr/local/include/sys/stat.h +lists.o: /usr/local/include/statbuf.h stdarg.h /usr/local/include/stdlib.h +lists.o: /usr/local/include/errno.h /usr/local/include/errnos.h +lists.o: /usr/local/include/sys/socket.h /usr/local/include/netinet/in.h +lists.o: /usr/local/include/endian.h /usr/local/include/bytesex.h +lists.o: /usr/local/include/arpa/inet.h /usr/local/include/netdb.h +lists.o: /usr/local/include/unistd.h /usr/local/include/posix_opt.h +lists.o: /usr/local/include/confname.h /usr/local/include/ctype.h +lists.o: /usr/local/include/sys/errno.h /usr/local/include/signal.h +lists.o: /usr/local/include/sigset.h /usr/local/include/math.h +lists.o: /usr/local/include/huge_val.h /usr/local/include/__math.h +lists.o: /usr/local/include/sys/time.h /usr/local/include/sys/file.h +lists.o: /usr/local/include/sys/fcntl.h /usr/local/include/sys/ioctl.h +lists.o: /usr/local/include/ioctls.h /usr/local/include/sys/ttydefaults.h +lists.o: /usr/local/include/sys/wait.h /usr/local/include/waitflags.h +lists.o: /usr/local/include/waitstatus.h comproc.h +makerank.o: /usr/local/include/stdio.h /usr/local/include/string.h +makerank.o: /usr/local/include/features.h /usr/local/include/sys/cdefs.h +makerank.o: /usr/local/include/stubs.h /usr/local/include/stddef.h +makerank.o: /usr/local/include/ctype.h +movecheck.o: stdinclude.h /usr/local/include/sys/types.h +movecheck.o: /usr/local/include/features.h /usr/local/include/sys/cdefs.h +movecheck.o: /usr/local/include/stubs.h /usr/local/include/gnu/types.h +movecheck.o: /usr/local/include/sys/time.h /usr/local/include/stddef.h +movecheck.o: /usr/local/include/strings.h /usr/local/include/string.h +movecheck.o: /usr/local/include/sys/dir.h /usr/local/include/dirent.h +movecheck.o: /usr/local/include/dirstream.h /usr/local/include/sys/stat.h +movecheck.o: /usr/local/include/statbuf.h /usr/local/include/stdio.h stdarg.h +movecheck.o: /usr/local/include/stdlib.h /usr/local/include/errno.h +movecheck.o: /usr/local/include/errnos.h /usr/local/include/sys/socket.h +movecheck.o: /usr/local/include/netinet/in.h /usr/local/include/endian.h +movecheck.o: /usr/local/include/bytesex.h /usr/local/include/arpa/inet.h +movecheck.o: /usr/local/include/netdb.h /usr/local/include/unistd.h +movecheck.o: /usr/local/include/posix_opt.h /usr/local/include/confname.h +movecheck.o: /usr/local/include/ctype.h /usr/local/include/sys/errno.h +movecheck.o: /usr/local/include/signal.h /usr/local/include/sigset.h +movecheck.o: /usr/local/include/math.h /usr/local/include/huge_val.h +movecheck.o: /usr/local/include/__math.h /usr/local/include/sys/time.h +movecheck.o: /usr/local/include/sys/file.h /usr/local/include/sys/fcntl.h +movecheck.o: /usr/local/include/sys/ioctl.h /usr/local/include/ioctls.h +movecheck.o: /usr/local/include/sys/ttydefaults.h +movecheck.o: /usr/local/include/sys/wait.h /usr/local/include/waitflags.h +movecheck.o: /usr/local/include/waitstatus.h common.h vers.h legal.h +movecheck.o: movecheck.h algcheck.h board.h gamedb.h utils.h multicol.h +movecheck.o: network.h command.h variable.h playerdb.h +multicol.o: stdinclude.h /usr/local/include/sys/types.h +multicol.o: /usr/local/include/features.h /usr/local/include/sys/cdefs.h +multicol.o: /usr/local/include/stubs.h /usr/local/include/gnu/types.h +multicol.o: /usr/local/include/sys/time.h /usr/local/include/stddef.h +multicol.o: /usr/local/include/strings.h /usr/local/include/string.h +multicol.o: /usr/local/include/sys/dir.h /usr/local/include/dirent.h +multicol.o: /usr/local/include/dirstream.h /usr/local/include/sys/stat.h +multicol.o: /usr/local/include/statbuf.h /usr/local/include/stdio.h stdarg.h +multicol.o: /usr/local/include/stdlib.h /usr/local/include/errno.h +multicol.o: /usr/local/include/errnos.h /usr/local/include/sys/socket.h +multicol.o: /usr/local/include/netinet/in.h /usr/local/include/endian.h +multicol.o: /usr/local/include/bytesex.h /usr/local/include/arpa/inet.h +multicol.o: /usr/local/include/netdb.h /usr/local/include/unistd.h +multicol.o: /usr/local/include/posix_opt.h /usr/local/include/confname.h +multicol.o: /usr/local/include/ctype.h /usr/local/include/sys/errno.h +multicol.o: /usr/local/include/signal.h /usr/local/include/sigset.h +multicol.o: /usr/local/include/math.h /usr/local/include/huge_val.h +multicol.o: /usr/local/include/__math.h /usr/local/include/sys/time.h +multicol.o: /usr/local/include/sys/file.h /usr/local/include/sys/fcntl.h +multicol.o: /usr/local/include/sys/ioctl.h /usr/local/include/ioctls.h +multicol.o: /usr/local/include/sys/ttydefaults.h +multicol.o: /usr/local/include/sys/wait.h /usr/local/include/waitflags.h +multicol.o: /usr/local/include/waitstatus.h common.h vers.h legal.h +multicol.o: multicol.h utils.h rmalloc.h +network.o: stdinclude.h /usr/local/include/sys/types.h +network.o: /usr/local/include/features.h /usr/local/include/sys/cdefs.h +network.o: /usr/local/include/stubs.h /usr/local/include/gnu/types.h +network.o: /usr/local/include/sys/time.h /usr/local/include/stddef.h +network.o: /usr/local/include/strings.h /usr/local/include/string.h +network.o: /usr/local/include/sys/dir.h /usr/local/include/dirent.h +network.o: /usr/local/include/dirstream.h /usr/local/include/sys/stat.h +network.o: /usr/local/include/statbuf.h /usr/local/include/stdio.h stdarg.h +network.o: /usr/local/include/stdlib.h /usr/local/include/errno.h +network.o: /usr/local/include/errnos.h /usr/local/include/sys/socket.h +network.o: /usr/local/include/netinet/in.h /usr/local/include/endian.h +network.o: /usr/local/include/bytesex.h /usr/local/include/arpa/inet.h +network.o: /usr/local/include/netdb.h /usr/local/include/unistd.h +network.o: /usr/local/include/posix_opt.h /usr/local/include/confname.h +network.o: /usr/local/include/ctype.h /usr/local/include/sys/errno.h +network.o: /usr/local/include/signal.h /usr/local/include/sigset.h +network.o: /usr/local/include/math.h /usr/local/include/huge_val.h +network.o: /usr/local/include/__math.h /usr/local/include/sys/time.h +network.o: /usr/local/include/sys/file.h /usr/local/include/sys/fcntl.h +network.o: /usr/local/include/sys/ioctl.h /usr/local/include/ioctls.h +network.o: /usr/local/include/sys/ttydefaults.h /usr/local/include/sys/wait.h +network.o: /usr/local/include/waitflags.h /usr/local/include/waitstatus.h +network.o: /usr/local/include/arpa/telnet.h common.h vers.h legal.h utils.h +network.o: multicol.h playerdb.h command.h variable.h network.h rmalloc.h +network.o: timeseal.h +playerdb.o: stdinclude.h /usr/local/include/sys/types.h +playerdb.o: /usr/local/include/features.h /usr/local/include/sys/cdefs.h +playerdb.o: /usr/local/include/stubs.h /usr/local/include/gnu/types.h +playerdb.o: /usr/local/include/sys/time.h /usr/local/include/stddef.h +playerdb.o: /usr/local/include/strings.h /usr/local/include/string.h +playerdb.o: /usr/local/include/sys/dir.h /usr/local/include/dirent.h +playerdb.o: /usr/local/include/dirstream.h /usr/local/include/sys/stat.h +playerdb.o: /usr/local/include/statbuf.h /usr/local/include/stdio.h stdarg.h +playerdb.o: /usr/local/include/stdlib.h /usr/local/include/errno.h +playerdb.o: /usr/local/include/errnos.h /usr/local/include/sys/socket.h +playerdb.o: /usr/local/include/netinet/in.h /usr/local/include/endian.h +playerdb.o: /usr/local/include/bytesex.h /usr/local/include/arpa/inet.h +playerdb.o: /usr/local/include/netdb.h /usr/local/include/unistd.h +playerdb.o: /usr/local/include/posix_opt.h /usr/local/include/confname.h +playerdb.o: /usr/local/include/ctype.h /usr/local/include/sys/errno.h +playerdb.o: /usr/local/include/signal.h /usr/local/include/sigset.h +playerdb.o: /usr/local/include/math.h /usr/local/include/huge_val.h +playerdb.o: /usr/local/include/__math.h /usr/local/include/sys/time.h +playerdb.o: /usr/local/include/sys/file.h /usr/local/include/sys/fcntl.h +playerdb.o: /usr/local/include/sys/ioctl.h /usr/local/include/ioctls.h +playerdb.o: /usr/local/include/sys/ttydefaults.h +playerdb.o: /usr/local/include/sys/wait.h /usr/local/include/waitflags.h +playerdb.o: /usr/local/include/waitstatus.h common.h vers.h legal.h command.h +playerdb.o: variable.h comproc.h playerdb.h rmalloc.h utils.h multicol.h +playerdb.o: network.h ficsmain.h config.h channel.h gamedb.h board.h +playerdb.o: ratings.h +ratings.o: stdinclude.h /usr/local/include/sys/types.h +ratings.o: /usr/local/include/features.h /usr/local/include/sys/cdefs.h +ratings.o: /usr/local/include/stubs.h /usr/local/include/gnu/types.h +ratings.o: /usr/local/include/sys/time.h /usr/local/include/stddef.h +ratings.o: /usr/local/include/strings.h /usr/local/include/string.h +ratings.o: /usr/local/include/sys/dir.h /usr/local/include/dirent.h +ratings.o: /usr/local/include/dirstream.h /usr/local/include/sys/stat.h +ratings.o: /usr/local/include/statbuf.h /usr/local/include/stdio.h stdarg.h +ratings.o: /usr/local/include/stdlib.h /usr/local/include/errno.h +ratings.o: /usr/local/include/errnos.h /usr/local/include/sys/socket.h +ratings.o: /usr/local/include/netinet/in.h /usr/local/include/endian.h +ratings.o: /usr/local/include/bytesex.h /usr/local/include/arpa/inet.h +ratings.o: /usr/local/include/netdb.h /usr/local/include/unistd.h +ratings.o: /usr/local/include/posix_opt.h /usr/local/include/confname.h +ratings.o: /usr/local/include/ctype.h /usr/local/include/sys/errno.h +ratings.o: /usr/local/include/signal.h /usr/local/include/sigset.h +ratings.o: /usr/local/include/math.h /usr/local/include/huge_val.h +ratings.o: /usr/local/include/__math.h /usr/local/include/sys/time.h +ratings.o: /usr/local/include/sys/file.h /usr/local/include/sys/fcntl.h +ratings.o: /usr/local/include/sys/ioctl.h /usr/local/include/ioctls.h +ratings.o: /usr/local/include/sys/ttydefaults.h /usr/local/include/sys/wait.h +ratings.o: /usr/local/include/waitflags.h /usr/local/include/waitstatus.h +ratings.o: common.h vers.h legal.h playerdb.h command.h variable.h ratings.h +ratings.o: gamedb.h board.h comproc.h lists.h ficsmain.h config.h utils.h +ratings.o: multicol.h +rmalloc.o: stdinclude.h /usr/local/include/sys/types.h +rmalloc.o: /usr/local/include/features.h /usr/local/include/sys/cdefs.h +rmalloc.o: /usr/local/include/stubs.h /usr/local/include/gnu/types.h +rmalloc.o: /usr/local/include/sys/time.h /usr/local/include/stddef.h +rmalloc.o: /usr/local/include/strings.h /usr/local/include/string.h +rmalloc.o: /usr/local/include/sys/dir.h /usr/local/include/dirent.h +rmalloc.o: /usr/local/include/dirstream.h /usr/local/include/sys/stat.h +rmalloc.o: /usr/local/include/statbuf.h /usr/local/include/stdio.h stdarg.h +rmalloc.o: /usr/local/include/stdlib.h /usr/local/include/errno.h +rmalloc.o: /usr/local/include/errnos.h /usr/local/include/sys/socket.h +rmalloc.o: /usr/local/include/netinet/in.h /usr/local/include/endian.h +rmalloc.o: /usr/local/include/bytesex.h /usr/local/include/arpa/inet.h +rmalloc.o: /usr/local/include/netdb.h /usr/local/include/unistd.h +rmalloc.o: /usr/local/include/posix_opt.h /usr/local/include/confname.h +rmalloc.o: /usr/local/include/ctype.h /usr/local/include/sys/errno.h +rmalloc.o: /usr/local/include/signal.h /usr/local/include/sigset.h +rmalloc.o: /usr/local/include/math.h /usr/local/include/huge_val.h +rmalloc.o: /usr/local/include/__math.h /usr/local/include/sys/time.h +rmalloc.o: /usr/local/include/sys/file.h /usr/local/include/sys/fcntl.h +rmalloc.o: /usr/local/include/sys/ioctl.h /usr/local/include/ioctls.h +rmalloc.o: /usr/local/include/sys/ttydefaults.h /usr/local/include/sys/wait.h +rmalloc.o: /usr/local/include/waitflags.h /usr/local/include/waitstatus.h +rmalloc.o: common.h vers.h legal.h +utils.o: stdinclude.h /usr/local/include/sys/types.h +utils.o: /usr/local/include/features.h /usr/local/include/sys/cdefs.h +utils.o: /usr/local/include/stubs.h /usr/local/include/gnu/types.h +utils.o: /usr/local/include/sys/time.h /usr/local/include/stddef.h +utils.o: /usr/local/include/strings.h /usr/local/include/string.h +utils.o: /usr/local/include/sys/dir.h /usr/local/include/dirent.h +utils.o: /usr/local/include/dirstream.h /usr/local/include/sys/stat.h +utils.o: /usr/local/include/statbuf.h /usr/local/include/stdio.h stdarg.h +utils.o: /usr/local/include/stdlib.h /usr/local/include/errno.h +utils.o: /usr/local/include/errnos.h /usr/local/include/sys/socket.h +utils.o: /usr/local/include/netinet/in.h /usr/local/include/endian.h +utils.o: /usr/local/include/bytesex.h /usr/local/include/arpa/inet.h +utils.o: /usr/local/include/netdb.h /usr/local/include/unistd.h +utils.o: /usr/local/include/posix_opt.h /usr/local/include/confname.h +utils.o: /usr/local/include/ctype.h /usr/local/include/sys/errno.h +utils.o: /usr/local/include/signal.h /usr/local/include/sigset.h +utils.o: /usr/local/include/math.h /usr/local/include/huge_val.h +utils.o: /usr/local/include/__math.h /usr/local/include/sys/time.h +utils.o: /usr/local/include/sys/file.h /usr/local/include/sys/fcntl.h +utils.o: /usr/local/include/sys/ioctl.h /usr/local/include/ioctls.h +utils.o: /usr/local/include/sys/ttydefaults.h /usr/local/include/sys/wait.h +utils.o: /usr/local/include/waitflags.h /usr/local/include/waitstatus.h +utils.o: common.h vers.h legal.h utils.h multicol.h playerdb.h command.h +utils.o: variable.h network.h rmalloc.h config.h +variable.o: stdinclude.h /usr/local/include/sys/types.h +variable.o: /usr/local/include/features.h /usr/local/include/sys/cdefs.h +variable.o: /usr/local/include/stubs.h /usr/local/include/gnu/types.h +variable.o: /usr/local/include/sys/time.h /usr/local/include/stddef.h +variable.o: /usr/local/include/strings.h /usr/local/include/string.h +variable.o: /usr/local/include/sys/dir.h /usr/local/include/dirent.h +variable.o: /usr/local/include/dirstream.h /usr/local/include/sys/stat.h +variable.o: /usr/local/include/statbuf.h /usr/local/include/stdio.h stdarg.h +variable.o: /usr/local/include/stdlib.h /usr/local/include/errno.h +variable.o: /usr/local/include/errnos.h /usr/local/include/sys/socket.h +variable.o: /usr/local/include/netinet/in.h /usr/local/include/endian.h +variable.o: /usr/local/include/bytesex.h /usr/local/include/arpa/inet.h +variable.o: /usr/local/include/netdb.h /usr/local/include/unistd.h +variable.o: /usr/local/include/posix_opt.h /usr/local/include/confname.h +variable.o: /usr/local/include/ctype.h /usr/local/include/sys/errno.h +variable.o: /usr/local/include/signal.h /usr/local/include/sigset.h +variable.o: /usr/local/include/math.h /usr/local/include/huge_val.h +variable.o: /usr/local/include/__math.h /usr/local/include/sys/time.h +variable.o: /usr/local/include/sys/file.h /usr/local/include/sys/fcntl.h +variable.o: /usr/local/include/sys/ioctl.h /usr/local/include/ioctls.h +variable.o: /usr/local/include/sys/ttydefaults.h +variable.o: /usr/local/include/sys/wait.h /usr/local/include/waitflags.h +variable.o: /usr/local/include/waitstatus.h common.h vers.h legal.h +variable.o: variable.h playerdb.h command.h utils.h multicol.h ficsmain.h +variable.o: config.h rmalloc.h board.h +eco.o: stdinclude.h /usr/local/include/sys/types.h +eco.o: /usr/local/include/features.h /usr/local/include/sys/cdefs.h +eco.o: /usr/local/include/stubs.h /usr/local/include/gnu/types.h +eco.o: /usr/local/include/sys/time.h /usr/local/include/stddef.h +eco.o: /usr/local/include/strings.h /usr/local/include/string.h +eco.o: /usr/local/include/sys/dir.h /usr/local/include/dirent.h +eco.o: /usr/local/include/dirstream.h /usr/local/include/sys/stat.h +eco.o: /usr/local/include/statbuf.h /usr/local/include/stdio.h stdarg.h +eco.o: /usr/local/include/stdlib.h /usr/local/include/errno.h +eco.o: /usr/local/include/errnos.h /usr/local/include/sys/socket.h +eco.o: /usr/local/include/netinet/in.h /usr/local/include/endian.h +eco.o: /usr/local/include/bytesex.h /usr/local/include/arpa/inet.h +eco.o: /usr/local/include/netdb.h /usr/local/include/unistd.h +eco.o: /usr/local/include/posix_opt.h /usr/local/include/confname.h +eco.o: /usr/local/include/ctype.h /usr/local/include/sys/errno.h +eco.o: /usr/local/include/signal.h /usr/local/include/sigset.h +eco.o: /usr/local/include/math.h /usr/local/include/huge_val.h +eco.o: /usr/local/include/__math.h /usr/local/include/sys/time.h +eco.o: /usr/local/include/sys/file.h /usr/local/include/sys/fcntl.h +eco.o: /usr/local/include/sys/ioctl.h /usr/local/include/ioctls.h +eco.o: /usr/local/include/sys/ttydefaults.h /usr/local/include/sys/wait.h +eco.o: /usr/local/include/waitflags.h /usr/local/include/waitstatus.h board.h +eco.o: gamedb.h command.h variable.h playerdb.h gameproc.h utils.h multicol.h +eco.o: common.h vers.h legal.h config.h +timeseal.o: /usr/local/include/stdio.h /usr/local/include/stdlib.h +timeseal.o: /usr/local/include/features.h /usr/local/include/sys/cdefs.h +timeseal.o: /usr/local/include/stubs.h /usr/local/include/stddef.h +timeseal.o: /usr/local/include/errno.h /usr/local/include/errnos.h +timeseal.o: /usr/local/include/strings.h /usr/local/include/string.h +timeseal.o: playerdb.h command.h variable.h network.h board.h gamedb.h +timeseal.o: /usr/local/include/sys/time.h diff --git a/FICS/Makefile.bsd b/FICS/Makefile.bsd new file mode 100644 index 0000000..525f579 --- /dev/null +++ b/FICS/Makefile.bsd @@ -0,0 +1,50 @@ +# Makefile for FICS +# This was originally written under NeXTSTEP +# + +# Turn on optimization +# With optimization on you may get errors during compiling. +OPTFLAGS= + +# Turn on debugging +#DEBUGFLAGS=-DDEBUG + +# Anything else you care to flag? +#OTHERFLAGS=-traditional-cpp -Wall -g +OTHERFLAGS=-Wall -g + +# Which architectures are you compiling for? (NeXTSTEP) +# ARCHFLAGS=-arch m68k -arch i386 + +PROGRAM=fics + + +CC=gcc +#cc doesn't seem to be supported at present. + +CFLAGS=${SYSFLAG} ${OPTFLAGS} ${DEBUGFLAGS} ${OTHERFLAGS} ${ARCHFLAGS} +LNFLAGS=-lm -lcompat -lcrypt + +# dfree is temporary, for debugging only, and works only if you are using +# the GNU C library --mann +#MORESRCS=dfree.c +#MOREOBJS=dfree.o +#you may have to hash out the above two + +# This is just for versions distributed with timeseal. +MORESRCS=timeseal.c +MOREOBJS=timeseal.o + +# Define the system below that you are compiling on. +# Set the flags for your system + +SYSFLAG=-DNETBSD -DTIMESEAL + +# The following is needed when using gcc and glibc, as on caissa. +#MAKEDEPMORECFLAGS= -I/usr/local/include -I/usr/local/lib/gcc-lib/sparc-sun-sunos4.1.3/2.6.3/include + +include ./Makefile.common +# include ./Makedist + +#run makedepend to fill out the info below +# DO NOT DELETE THIS LINE -- make depend depends on it. diff --git a/FICS/Makefile.clean b/FICS/Makefile.clean new file mode 100644 index 0000000..525f579 --- /dev/null +++ b/FICS/Makefile.clean @@ -0,0 +1,50 @@ +# Makefile for FICS +# This was originally written under NeXTSTEP +# + +# Turn on optimization +# With optimization on you may get errors during compiling. +OPTFLAGS= + +# Turn on debugging +#DEBUGFLAGS=-DDEBUG + +# Anything else you care to flag? +#OTHERFLAGS=-traditional-cpp -Wall -g +OTHERFLAGS=-Wall -g + +# Which architectures are you compiling for? (NeXTSTEP) +# ARCHFLAGS=-arch m68k -arch i386 + +PROGRAM=fics + + +CC=gcc +#cc doesn't seem to be supported at present. + +CFLAGS=${SYSFLAG} ${OPTFLAGS} ${DEBUGFLAGS} ${OTHERFLAGS} ${ARCHFLAGS} +LNFLAGS=-lm -lcompat -lcrypt + +# dfree is temporary, for debugging only, and works only if you are using +# the GNU C library --mann +#MORESRCS=dfree.c +#MOREOBJS=dfree.o +#you may have to hash out the above two + +# This is just for versions distributed with timeseal. +MORESRCS=timeseal.c +MOREOBJS=timeseal.o + +# Define the system below that you are compiling on. +# Set the flags for your system + +SYSFLAG=-DNETBSD -DTIMESEAL + +# The following is needed when using gcc and glibc, as on caissa. +#MAKEDEPMORECFLAGS= -I/usr/local/include -I/usr/local/lib/gcc-lib/sparc-sun-sunos4.1.3/2.6.3/include + +include ./Makefile.common +# include ./Makedist + +#run makedepend to fill out the info below +# DO NOT DELETE THIS LINE -- make depend depends on it. diff --git a/FICS/Makefile.common b/FICS/Makefile.common new file mode 100644 index 0000000..36b2857 --- /dev/null +++ b/FICS/Makefile.common @@ -0,0 +1,67 @@ +#this is the common part of the Makefile regardless of which system +# you compile on. + +#need to sort out lame including of all objects in all programs - DAV + + +SRCS= adminproc.c algcheck.c board.c channel.c command.c talkproc.c \ + comproc.c matchproc.c fics_addplayer.c ficsmain.c formula.c \ + gamedb.c gameproc.c obsproc.c legal.c lists.c makerank.c \ + movecheck.c multicol.c network.c playerdb.c ratings.c \ + rmalloc.c utils.c variable.c vers.c eco.c rating_conv.c \ + shutdown.c ${MORESRCS} + +OBJS= network.o lists.o formula.o playerdb.o command.o talkproc.o \ + comproc.o matchproc.o movecheck.o ratings.o gamedb.o channel.o \ + utils.o rmalloc.o legal.o vers.o variable.o board.o gameproc.o \ + algcheck.o adminproc.o multicol.o eco.o rating_conv.o shutdown.o \ + obsproc.o + +VERSION=echo 'char SGS_VERS[]=""; char VERS_NUM[]="1.6.2"; char COMP_DATE[]="'`date`'";' + +PROGRAM=fics +ADDPLAYER=fics_addplayer +#DELPLAYER=fics_delplayer +#MAILSERVER=fics_mailproc +#MAILPROC=mailproc +MAKERANK=makerank +#MAKEDEPEND=makedepend +MAKEDEPEND=mkdep +#DEPFLAG=-- +DEPFLAG= + +#all: ${PROGRAM} ${MAILSERVER} ${ADDPLAYER} ${DELPLAYER} ${MAILPROC} +all: ${PROGRAM} ${MAKERANK} ${ADDPLAYER} + +${PROGRAM}: ficsmain.o $(OBJS) $(MOREOBJS) + $(CC) ficsmain.o $(CFLAGS) $(OBJS) $(MOREOBJS) $(LNFLAGS) -o ${PROGRAM} + +#${MAILSERVER}: fics_mailproc.o $(OBJS) +# $(CC) fics_mailproc.o $(CFLAGS) $(OBJS) $(LNFLAGS) -o ${MAILSERVER} + +${ADDPLAYER}: fics_addplayer.o $(OBJS) $(MOREOBJS) + $(CC) fics_addplayer.o $(CFLAGS) $(OBJS) $(MOREOBJS) $(LNFLAGS) -o ${ADDPLAYER} + +#${DELPLAYER}: fics_delplayer.o $(OBJS) +# $(CC) fics_delplayer.o $(CFLAGS) $(OBJS) $(LNFLAGS) -o ${DELPLAYER} + +#${MAILPROC}: mailproc.o lock.o network.o rmalloc.o +# $(CC) mailproc.o lock.o network.o rmalloc.o $(CFLAGS) -o ${MAILPROC} +# $(CC) mailproc.o lock.o network.o rmalloc.o memmove.o $(CFLAGS) -o ${MAILPROC} + +${MAKERANK}: makerank.o + $(CC) makerank.o $(CFLAGS) $(LNFLAGS) -o ${MAKERANK} + +vers.c: + ${VERSION} >vers.c + +depend: + $(MAKEDEPEND) ${DEPFLAG} ${CFLAGS} ${MAKEDEPMORECFLAGS} ${DEPFLAG} ${SRCS} + +clean: +# rm -f *.o ${PROGRAM} ${MAILSERVER} ${ADDPLAYER} ${MAILPROC} ${DELPLAYER} *~ vers.c + rm -f *.o ${PROGRAM} ${ADDPLAYER} ${MAKERANK} *~ vers.c + + @ echo "Project cleaned." + + diff --git a/FICS/Makefile.common.bak b/FICS/Makefile.common.bak new file mode 100644 index 0000000..a522690 --- /dev/null +++ b/FICS/Makefile.common.bak @@ -0,0 +1,61 @@ +#this is the common part of the Makefile regardless of which system +# you compile on. + +#need to sort out lame including of all objects in all programs - DAV + + +SRCS=adminproc.c algcheck.c board.c channel.c command.c talkproc.c \ + comproc.c matchproc.c fics_addplayer.c ficsmain.c formula.c \ + gamedb.c gameproc.c legal.c lists.c makerank.c \ + movecheck.c multicol.c network.c playerdb.c ratings.c \ + rmalloc.c utils.c variable.c vers.c eco.c rating_conv.c ${MORESRCS} + +OBJS=network.o lists.o formula.o playerdb.o command.o talkproc.o \ + comproc.o matchproc.o movecheck.o ratings.o gamedb.o channel.o \ + utils.o rmalloc.o legal.o vers.o variable.o board.o gameproc.o \ + algcheck.o adminproc.o multicol.o eco.o rating_conv.o + +VERSION=echo 'char SGS_VERS[]=""; char VERS_NUM[]="1.3.3"; char COMP_DATE[]="'`date`'";' + +PROGRAM=fics +ADDPLAYER=fics_addplayer +#DELPLAYER=fics_delplayer +#MAILSERVER=fics_mailproc +#MAILPROC=mailproc +MAKERANK=makerank + +#all: ${PROGRAM} ${MAILSERVER} ${ADDPLAYER} ${DELPLAYER} ${MAILPROC} +all: ${PROGRAM} ${MAKERANK} ${ADDPLAYER} + +${PROGRAM}: ficsmain.o $(OBJS) $(MOREOBJS) + $(CC) ficsmain.o $(CFLAGS) $(OBJS) $(MOREOBJS) $(LNFLAGS) -o ${PROGRAM} + +#${MAILSERVER}: fics_mailproc.o $(OBJS) +# $(CC) fics_mailproc.o $(CFLAGS) $(OBJS) $(LNFLAGS) -o ${MAILSERVER} + +${ADDPLAYER}: fics_addplayer.o $(OBJS) $(MOREOBJS) + $(CC) fics_addplayer.o $(CFLAGS) $(OBJS) $(MOREOBJS) $(LNFLAGS) -o ${ADDPLAYER} + +#${DELPLAYER}: fics_delplayer.o $(OBJS) +# $(CC) fics_delplayer.o $(CFLAGS) $(OBJS) $(LNFLAGS) -o ${DELPLAYER} + +#${MAILPROC}: mailproc.o lock.o network.o rmalloc.o +# $(CC) mailproc.o lock.o network.o rmalloc.o $(CFLAGS) -o ${MAILPROC} +# $(CC) mailproc.o lock.o network.o rmalloc.o memmove.o $(CFLAGS) -o ${MAILPROC} + +${MAKERANK}: makerank.o + $(CC) makerank.o $(CFLAGS) $(LNFLAGS) -o ${MAKERANK} + +vers.c: + ${VERSION} >vers.c + +depend: + makedepend -- ${CFLAGS} ${MAKEDEPMORECFLAGS} -- ${SRCS} + +clean: +# rm -f *.o ${PROGRAM} ${MAILSERVER} ${ADDPLAYER} ${MAILPROC} ${DELPLAYER} *~ vers.c + rm -f *.o ${PROGRAM} ${ADDPLAYER} ${MAKERANK} *~ vers.c + + @ echo "Project cleaned." + + diff --git a/FICS/Makefile.in b/FICS/Makefile.in new file mode 100644 index 0000000..7b3bff1 --- /dev/null +++ b/FICS/Makefile.in @@ -0,0 +1,110 @@ +## +## 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 +## (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. +## +## +## This is the Makefile template; see machine dependant config.h for +## more configuration options. + + +SHELL = /bin/sh +srcdir = @srcdir@ +VPATH = @srcdir@ + + +## +## Where to install FICS +## +prefix = @prefix@ +exec_prefix = @exec_prefix@ +bindir = ${exec_prefix}/bin + + +## +## Binaries and Options to use +## +CC = @CC@ +CFLAGS = @CFLAGS@ -DTIMESEAL -I${srcdir} +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +LIBS = @LIBS@ +LNFLAGS = @LDFLAGS@ ${LIBS} + + +## +## Version information +## +VERSION=echo 'char SGS_VERS[]=""; char VERS_NUM[]="1.2.3";' + + +SRCS=adminproc.c algcheck.c board.c channel.c command.c talkproc.c comproc.c \ + fics_addplayer.c ficsmain.c formula.c gamedb.c gameproc.c \ + get_tcp_conn.c legal.c lists.c makerank.c \ + movecheck.c multicol.c network.c playerdb.c ratings.c \ + rmalloc.c utils.c variable.c vers.c eco.c matchproc.c \ + timeseal.c ${MORESRCS} + +OBJS=network.o lists.o formula.o playerdb.o command.o talkproc.o comproc.o movecheck.o \ + ratings.o gamedb.o channel.o utils.o rmalloc.o legal.o vers.o variable.o \ + board.o gameproc.o algcheck.o adminproc.o \ + get_tcp_conn.o multicol.o eco.o matchproc.o timeseal.o ${MOREOBJS} + +VERSION=echo 'char SGS_VERS[]=""; char VERS_NUM[]="1.2.18"; char COMP_DATE[]="'`date`'";' + +PROGRAM=fics +ADDPLAYER=fics_addplayer +#DELPLAYER=fics_delplayer +#MAILSERVER=fics_mailproc +#MAILPROC=mailproc +MAKERANK=makerank + +ALL= ${PROGRAM} ${ADDPLAYER} ${MAKERANK} + +#all: ${PROGRAM} ${MAILSERVER} ${ADDPLAYER} ${DELPLAYER} ${MAILPROC} +all: ${ALL} + +${PROGRAM}: ficsmain.o $(OBJS) + $(CC) ficsmain.o $(CFLAGS) $(OBJS) $(LNFLAGS) -o ${PROGRAM} + +#${MAILSERVER}: fics_mailproc.o $(OBJS) +# $(CC) fics_mailproc.o $(CFLAGS) $(OBJS) $(LNFLAGS) -o ${MAILSERVER} + +${ADDPLAYER}: fics_addplayer.o $(OBJS) + $(CC) fics_addplayer.o $(CFLAGS) $(OBJS) $(LNFLAGS) -o ${ADDPLAYER} + +#${DELPLAYER}: fics_delplayer.o $(OBJS) +# $(CC) fics_delplayer.o $(CFLAGS) $(OBJS) $(LNFLAGS) -o ${DELPLAYER} + +#${MAILPROC}: mailproc.o lock.o network.o rmalloc.o +# $(CC) mailproc.o lock.o network.o rmalloc.o $(CFLAGS) -o ${MAILPROC} +# $(CC) mailproc.o lock.o network.o rmalloc.o memmove.o $(CFLAGS) -o ${MAILPROC} + +${MAKERANK}: makerank.o + $(CC) makerank.o $(CFLAGS) $(LNFLAGS) -o ${MAKERANK} + +vers.c: + ${VERSION} >vers.c + +depend: + makedepend -- ${CFLAGS} ${MAKEDEPMORECFLAGS} -- ${SRCS} + +clean: + rm -f *.o ${ALL} *~ vers.c + @ echo "Project cleaned." + +distclean: clean + rm -rf Makefile autoconfig.h config.h config.status config.cache \ + config.log + +install: + for f in ${ALL}; do ${INSTALL} $$f ${bindir}; done diff --git a/FICS/Makefile.in.orig b/FICS/Makefile.in.orig new file mode 100644 index 0000000..7b3bff1 --- /dev/null +++ b/FICS/Makefile.in.orig @@ -0,0 +1,110 @@ +## +## 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 +## (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. +## +## +## This is the Makefile template; see machine dependant config.h for +## more configuration options. + + +SHELL = /bin/sh +srcdir = @srcdir@ +VPATH = @srcdir@ + + +## +## Where to install FICS +## +prefix = @prefix@ +exec_prefix = @exec_prefix@ +bindir = ${exec_prefix}/bin + + +## +## Binaries and Options to use +## +CC = @CC@ +CFLAGS = @CFLAGS@ -DTIMESEAL -I${srcdir} +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +LIBS = @LIBS@ +LNFLAGS = @LDFLAGS@ ${LIBS} + + +## +## Version information +## +VERSION=echo 'char SGS_VERS[]=""; char VERS_NUM[]="1.2.3";' + + +SRCS=adminproc.c algcheck.c board.c channel.c command.c talkproc.c comproc.c \ + fics_addplayer.c ficsmain.c formula.c gamedb.c gameproc.c \ + get_tcp_conn.c legal.c lists.c makerank.c \ + movecheck.c multicol.c network.c playerdb.c ratings.c \ + rmalloc.c utils.c variable.c vers.c eco.c matchproc.c \ + timeseal.c ${MORESRCS} + +OBJS=network.o lists.o formula.o playerdb.o command.o talkproc.o comproc.o movecheck.o \ + ratings.o gamedb.o channel.o utils.o rmalloc.o legal.o vers.o variable.o \ + board.o gameproc.o algcheck.o adminproc.o \ + get_tcp_conn.o multicol.o eco.o matchproc.o timeseal.o ${MOREOBJS} + +VERSION=echo 'char SGS_VERS[]=""; char VERS_NUM[]="1.2.18"; char COMP_DATE[]="'`date`'";' + +PROGRAM=fics +ADDPLAYER=fics_addplayer +#DELPLAYER=fics_delplayer +#MAILSERVER=fics_mailproc +#MAILPROC=mailproc +MAKERANK=makerank + +ALL= ${PROGRAM} ${ADDPLAYER} ${MAKERANK} + +#all: ${PROGRAM} ${MAILSERVER} ${ADDPLAYER} ${DELPLAYER} ${MAILPROC} +all: ${ALL} + +${PROGRAM}: ficsmain.o $(OBJS) + $(CC) ficsmain.o $(CFLAGS) $(OBJS) $(LNFLAGS) -o ${PROGRAM} + +#${MAILSERVER}: fics_mailproc.o $(OBJS) +# $(CC) fics_mailproc.o $(CFLAGS) $(OBJS) $(LNFLAGS) -o ${MAILSERVER} + +${ADDPLAYER}: fics_addplayer.o $(OBJS) + $(CC) fics_addplayer.o $(CFLAGS) $(OBJS) $(LNFLAGS) -o ${ADDPLAYER} + +#${DELPLAYER}: fics_delplayer.o $(OBJS) +# $(CC) fics_delplayer.o $(CFLAGS) $(OBJS) $(LNFLAGS) -o ${DELPLAYER} + +#${MAILPROC}: mailproc.o lock.o network.o rmalloc.o +# $(CC) mailproc.o lock.o network.o rmalloc.o $(CFLAGS) -o ${MAILPROC} +# $(CC) mailproc.o lock.o network.o rmalloc.o memmove.o $(CFLAGS) -o ${MAILPROC} + +${MAKERANK}: makerank.o + $(CC) makerank.o $(CFLAGS) $(LNFLAGS) -o ${MAKERANK} + +vers.c: + ${VERSION} >vers.c + +depend: + makedepend -- ${CFLAGS} ${MAKEDEPMORECFLAGS} -- ${SRCS} + +clean: + rm -f *.o ${ALL} *~ vers.c + @ echo "Project cleaned." + +distclean: clean + rm -rf Makefile autoconfig.h config.h config.status config.cache \ + config.log + +install: + for f in ${ALL}; do ${INSTALL} $$f ${bindir}; done diff --git a/FICS/Makefile.next b/FICS/Makefile.next new file mode 100644 index 0000000..90de8f0 --- /dev/null +++ b/FICS/Makefile.next @@ -0,0 +1,28 @@ +# Makefile for FICS +# This was originally written under NeXTSTEP +# +# Define the system below that you are compiling on. +SYSFLAG=-DSYSTEM_NEXT + +# Set the flags for your system + +# Turn on optimization +# OPTFLAGS=-O + +# Turn on debugging +DEBUGFLAGS=-g -DDEBUG + +# Anything else you care to flag? +OTHERFLAGS=-Wall + +# Which architectures are you compiling for? (NeXTSTEP) +# ARCHFLAGS=-arch m68k -arch i386 + +PROGRAM=fics + + +CC=cc +CFLAGS=${SYSFLAG} ${OPTFLAGS} ${DEBUGFLAGS} ${OTHERFLAGS} ${ARCHFLAGS} +LNFLAGS=-lm + +include ./Makefile.common diff --git a/FICS/Makefile.sgi b/FICS/Makefile.sgi new file mode 100644 index 0000000..7b7b202 --- /dev/null +++ b/FICS/Makefile.sgi @@ -0,0 +1,40 @@ +# Makefile for FICS +# This was originally written under NeXTSTEP +# +# Define the system below that you are compiling on. +SYSFLAG=-DSGI +# Set the flags for your system + +# Turn on optimization +# With optimization on you may get errors during compiling. +OPTFLAGS= + +# Turn on debugging +#DEBUGFLAGS=-DDEBUG + +# Anything else you care to flag? +#OTHERFLAGS=-traditional-cpp -Wall -g +OTHERFLAGS=-Wall -g + +# Which architectures are you compiling for? (NeXTSTEP) +# ARCHFLAGS=-arch m68k -arch i386 + +PROGRAM=fics + + +CC=gcc +#cc doesn't seem to be supported at present. + +CFLAGS=${SYSFLAG} ${OPTFLAGS} ${DEBUGFLAGS} ${OTHERFLAGS} ${ARCHFLAGS} +LNFLAGS=-lm + + +# The following is needed when using gcc and glibc, as on caissa. + +MAKEDEPMORECFLAGS= -I/usr/local/include -I/usr/local/lib/gcc-lib/sparc-sun-sunos4.1.3/2.6.3/include + +include ./Makefile.common +# include ./Makedist + +#run makedepend to fill out the info below +# DO NOT DELETE THIS LINE -- make depend depends on it. diff --git a/FICS/Makefile.sun4 b/FICS/Makefile.sun4 new file mode 100644 index 0000000..a82e6b3 --- /dev/null +++ b/FICS/Makefile.sun4 @@ -0,0 +1,45 @@ +# Makefile for FICS +# This was originally written under NeXTSTEP +# +# Define the system below that you are compiling on. +SYSFLAG=-DSYSTEM_SUN4 +# Set the flags for your system + +# Turn on optimization +# With optimization on you may get errors during compiling. +OPTFLAGS= + +# Turn on debugging +#DEBUGFLAGS=-DDEBUG + +# Anything else you care to flag? +#OTHERFLAGS=-traditional-cpp -Wall -g +OTHERFLAGS=-Wall -g + +# Which architectures are you compiling for? (NeXTSTEP) +# ARCHFLAGS=-arch m68k -arch i386 + +PROGRAM=fics + + +CC=gcc +#cc doesn't seem to be supported at present. + +CFLAGS=${SYSFLAG} ${OPTFLAGS} ${DEBUGFLAGS} ${OTHERFLAGS} ${ARCHFLAGS} +LNFLAGS=-lm + +# dfree is temporary, for debugging only, and works only if you are using +# the GNU C library --mann +#MORESRCS=dfree.c +#MOREOBJS=dfree.o +#you may have to hash out the above two + +# The following is needed when using gcc and glibc, as on caissa. + +MAKEDEPMORECFLAGS= -I/usr/local/include -I/usr/local/lib/gcc-lib/sparc-sun-sunos4.1.3/2.6.3/include + +include ./Makefile.common +# include ./Makedist + +#run makedepend to fill out the info below +# DO NOT DELETE THIS LINE -- make depend depends on it. diff --git a/FICS/Makefile.sun5 b/FICS/Makefile.sun5 new file mode 100644 index 0000000..a87dd9b --- /dev/null +++ b/FICS/Makefile.sun5 @@ -0,0 +1,40 @@ +# Makefile for FICS +# This was originally written under NeXTSTEP +# +# Define the system below that you are compiling on. +SYSFLAG=-DSYSTEM_SUN5 +# Set the flags for your system + +# Turn on optimization +# With optimization on you may get errors during compiling. +OPTFLAGS= + +# Turn on debugging +#DEBUGFLAGS=-DDEBUG + +# Anything else you care to flag? +#OTHERFLAGS=-traditional-cpp -Wall -g +OTHERFLAGS=-Wall -g + +# Which architectures are you compiling for? (NeXTSTEP) +# ARCHFLAGS=-arch m68k -arch i386 + +PROGRAM=fics + + +CC=gcc +#cc doesn't seem to be supported at present. + +CFLAGS=${SYSFLAG} ${OPTFLAGS} ${DEBUGFLAGS} ${OTHERFLAGS} ${ARCHFLAGS} +LNFLAGS=-lm + + +# The following is needed when using gcc and glibc, as on caissa. + +MAKEDEPMORECFLAGS= -I/usr/local/include -I/usr/local/lib/gcc-lib/sparc-sun-sunos4.1.3/2.6.3/include + +include ./Makefile.common +# include ./Makedist + +#run makedepend to fill out the info below +# DO NOT DELETE THIS LINE -- make depend depends on it. diff --git a/FICS/Makefile.sunos-glibc b/FICS/Makefile.sunos-glibc new file mode 100644 index 0000000..48b70d5 --- /dev/null +++ b/FICS/Makefile.sunos-glibc @@ -0,0 +1,51 @@ +# Makefile for FICS +# This was originally written under NeXTSTEP +# +SYSFLAG=-DSYSTEM_SUN4 -DTIMESEAL + +# Turn on optimization +# With optimization on you may get errors during compiling. +OPTFLAGS= + +# Turn on debugging +DEBUGFLAGS=-DDEBUG + +# Anything else you care to flag? +#OTHERFLAGS=-traditional-cpp -Wall -g +OTHERFLAGS=-Wall -g + +# Which architectures are you compiling for? (NeXTSTEP) +# ARCHFLAGS=-arch m68k -arch i386 + +PROGRAM=fics + + +CC=gcc +#cc doesn't seem to be supported at present. + +CFLAGS=${SYSFLAG} ${OPTFLAGS} ${DEBUGFLAGS} ${OTHERFLAGS} ${ARCHFLAGS} -I/usr/local/glibc-include +LNFLAGS=-lm -L/usr/local/lib/glibc + +# dfree is temporary, for debugging only, and works only if you are using +# the GNU C library --mann +#MORESRCS=dfree.c +#MOREOBJS=dfree.o +#you may have to hash out the above two + +# This is just for versions distributed with timeseal. +MORESRCS=timeseal.c +MOREOBJS=timeseal.o + +# Define the system below that you are compiling on. +# Set the flags for your system + +SYSFLAG=-DSYSTEM_SUN4 -DTIMESEAL + +# The following is needed when using gcc and glibc, as on caissa. +MAKEDEPMORECFLAGS= -I/usr/local/include -I/usr/local/lib/gcc-lib/sparc-sun-sunos4.1.3/2.6.3/include + +include ./Makefile.common +# include ./Makedist + +#run makedepend to fill out the info below +# DO NOT DELETE THIS LINE -- make depend depends on it. diff --git a/FICS/Makefile.ultrix b/FICS/Makefile.ultrix new file mode 100644 index 0000000..2b5f688 --- /dev/null +++ b/FICS/Makefile.ultrix @@ -0,0 +1,31 @@ +# Makefile for FICS +# This was originally written under NeXTSTEP +# +# Define the system below that you are compiling on. +# SYSFLAG=-DSYSTEM_NEXT +SYSFLAG=-DSYSTEM_ULTRIX + +# Set the flags for your system + +# Turn on optimization +# There seems to be an optimization bug which screws up +# ratings calculation. +# OPTFLAGS=-O + +# Turn on debugging +DEBUGFLAGS=-DDEBUG + +# Anything else you care to flag? +# OTHERFLAGS=-Wall + +# Which architectures are you compiling for? (NeXTSTEP) +#ARCHFLAGS=-arch m68k -arch i386 + +PROGRAM=fics + + +CC=cc +CFLAGS=${SYSFLAG} ${OPTFLAGS} ${DEBUGFLAGS} ${OTHERFLAGS} ${ARCHFLAGS} +LNFLAGS=-lm + +include ./Makefile.common diff --git a/FICS/Makefile.usl b/FICS/Makefile.usl new file mode 100644 index 0000000..0af7418 --- /dev/null +++ b/FICS/Makefile.usl @@ -0,0 +1,29 @@ +# Makefile for FICS +# This was originally written under NeXTSTEP +# +# Define the system below that you are compiling on. +SYSFLAG=-DSYSTEM_USL + +# Set the flags for your system + +# Turn on optimization +# With optimization on you may get errors during compiling. +# OPTFLAGS=-O + +# Turn on debugging +#DEBUGFLAGS=-g -DDEBUG + +# Anything else you care to flag? +#OTHERFLAGS=-Wall + +# Which architectures are you compiling for? (NeXTSTEP) +# ARCHFLAGS=-arch m68k -arch i386 + +PROGRAM=fics + + +CC=cc +CFLAGS=${SYSFLAG} ${OPTFLAGS} ${DEBUGFLAGS} ${OTHERFLAGS} ${ARCHFLAGS} +LNFLAGS=-lm + +include ./Makefile.common diff --git a/FICS/README b/FICS/README new file mode 100644 index 0000000..5a76069 --- /dev/null +++ b/FICS/README @@ -0,0 +1,103 @@ +README file for FICS - Free Internet Chess Server + +Please report any changes back to chess@ics.onenet.net. The code is +very volatile right now, so keep gratuitous changes to a minimum. DO NOT +send mail about the code to Richard Nash. He is no longer working on the +FICS project. (We thank him for all his past work!) + +HOW TO START YOUR CHESS SERVER + +A. INTRODUCTION + First off, you should be familiar with programming in C and with the +nuances of the system on which you will be running the server. The +documentation is sparse, so often the code is the best place to go to find +the answers. + +B. Compiling the code + 1. cd FICS + 2. Edit the file config.h to set the directories where the program's + data can be found. + 3. Copy the Makefile for your system to Makefile. At the time of writing + this there are only a few machines represented, so you may have to edit. + If you create a new Makefile that works on your machine, please mail + it back to the above address so that we can include it in the distribution. + NB. You may have to # out dfree.c and dfree.o in the makefile - they are + for debug perposes only (sun4). + 4. type 'makedepend' type 'make' + 5. If it doesn't compile, well...do your best. If you modify the code to + get it to compile on your machine, use #ifdef's wisely and send the + changes back to us so that we can include them in the distribution. + Also check the code for already defined ifdefs. + 6. Once code is built, start the server with "fics", the default port + is 5000. To specify another, use "fics -p #". login as AdminGuy + with no password and set his password. :-) Good luck. + + +C. Registering with the ratings server. +*** THERE IS NO RATINGS SERVER IN OPERATION AT PRESENT *** +** The procedures below were for FICS 1.0 and are now obsolete ** +** Distributed ratings may come in a later version ** + + If you want to be hooked in with the distributed ratings server, and I +hope everyone does, send mail to XXXXXXXXXXX to get your password and to +confirm to and from email addresses. + +D. Configuring for the ratings server. + Once you have your email address, the servers email address and your secret +code, copy the file config/hostinfo.client.format to config/hostinfo.client. +Then edit that file and replace the appropriate entry with the correct +information. Here is what an example should look like. + +client fics_client@foobar.com +fics_server@XXXXXXX.XXX MyPassword 0 0 + + The next part is a little tricky, and you may need root privileges on your +machine to do it. The goal here is this... To get the contents of the mail +sent to fics_client piped into the fics_mailproc program. If there is no way +you are getting root privileges, go right to way #4. + +1. One way is to create a mail alias that does it. + + Here is the pertanent line from my aliases file. + +fics_client: "|/Users/nash/Source/FICS/FICS-distrib/fics_mailproc client" + +The '|' character causes mail to fics_client to get sent to the program that +follows. The 'client' parameter to the fics_mailproc program is important +because the fics_mailproc program is two-faced. It can run as a client or as +the server. + + Once you are set up, the ratings server should send you accounts for all +of the registered network players. + +2. Another way is to create a user called fics_client with the same UID as + the user you will be running FICS as. This is to allow fics and + fics_mailproc to have the same uid. Then, in /etc/crontab put an entry + that periodically calls the 'mailproc' program. Here is my entry: +0,15,30,45 * * * * nash /Users/nash/Source/FICS/FICS-distrib/mailproc /usr/spool/mail/fics_client "/Users/nash/Source/FICS/FICS-distrib/fics_mailproc client" + +3. Yet another way is to simply run mailproc by hand when you want mail to + be picked up. In a C-shell this works: +while (1) + /Users/nash/Source/FICS/FICS-distrib/mailproc /usr/spool/mail/fics_client "/Users/nash/Source/FICS/FICS-distrib/fics_mailproc client" + sleep 900 +end + +4. There is yet one more way to set up a connection to the rating's server + if there is no way to get the mail client set up. It may be lest reliable + than the mail way of doing things because it doesn't have store and + forward capability if network errors occur during transmission. But it + will probably work. The mailproc program can be a daemon wait for + connections on a port and then send what it gets to a program. For + example: +mailproc 5001 "/Users/nash/Source/FICS/FICS-distrib/fics_mailproc client" + Will wait for the server to connect and send the mail directly. Of course + you will need to set this up with the server administrator so that he + knows to send directly rather than through mail. + +E. Adding local players. + Of course this is your server and you have the write to include or exclude +players as you like. To add a player user the fics_addplayer function or +use addplayer when logged in as an ADMIN. To remove a player, just put * +in the password field of their file. They won't be able to log in. + diff --git a/FICS/README-UPGRADE_FROM_1.2.3 b/FICS/README-UPGRADE_FROM_1.2.3 new file mode 100644 index 0000000..8a5d044 --- /dev/null +++ b/FICS/README-UPGRADE_FROM_1.2.3 @@ -0,0 +1,13 @@ +If you are running 1.2.3, congratulations on 1) putting up with it until now +and 2) getting a very fine upgrade! :-) + +BEWARE: You must remove all login logs from the data/stats/player-data +directory. They have changed in format greatly. They will cause a crash. :-) + + cd FICSDIR/data/stats/player_data + rm */*.logons + cd .. + rm logons + +Should do it. + diff --git a/FICS/README.NEW b/FICS/README.NEW new file mode 100644 index 0000000..6b58291 --- /dev/null +++ b/FICS/README.NEW @@ -0,0 +1,172 @@ + +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.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/FICS/README.timeseal b/FICS/README.timeseal new file mode 100644 index 0000000..3696fdf --- /dev/null +++ b/FICS/README.timeseal @@ -0,0 +1,16 @@ +/* + + The timeseal package must NEVER be distributed without + permission from Henrik Gram + + It's security is based SOLELY on keeping the crypt alg. + secret. + + Both the timeseal server and client code was written + entirely by Henrik Gram. + + Only the FICS sites at chess.onenet.net and *.daimi.aau.dk + are allowed to have it and use it - and NEVER charge for + its use nor for the distribution of the timeseal client. + +*/ diff --git a/FICS/README_LEGAL b/FICS/README_LEGAL new file mode 100644 index 0000000..655d207 --- /dev/null +++ b/FICS/README_LEGAL @@ -0,0 +1,23 @@ +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 + diff --git a/FICS/README_Nash b/FICS/README_Nash new file mode 100644 index 0000000..9f6fa1b --- /dev/null +++ b/FICS/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/FICS/acconfig.h b/FICS/acconfig.h new file mode 100644 index 0000000..a7f3dd8 --- /dev/null +++ b/FICS/acconfig.h @@ -0,0 +1,49 @@ +/* + 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 + (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. + + + 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 diff --git a/FICS/acconfig.h.orig b/FICS/acconfig.h.orig new file mode 100644 index 0000000..a7f3dd8 --- /dev/null +++ b/FICS/acconfig.h.orig @@ -0,0 +1,49 @@ +/* + 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 + (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. + + + 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 diff --git a/FICS/adminproc.c b/FICS/adminproc.c new file mode 100644 index 0000000..ed96d4a --- /dev/null +++ b/FICS/adminproc.c @@ -0,0 +1,1596 @@ +/* + 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 + (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. + + Continued development of this software is done by the GNU ICS + development team. Contact with questions. + + + adminproc.c - All administrative commands and related functions */ + + +#include "stdinclude.h" +#include "common.h" +#include "network.h" +#include "adminproc.h" +#include "command.h" +#include "playerdb.h" +#include "gamedb.h" +#include "gameproc.h" +#include "obsproc.h" +#include "ratings.h" +#include "utils.h" +#include "rmalloc.h" +#include "talkproc.h" +#include "comproc.h" +#include "multicol.h" +#include + +#define PASSLEN 4 + +PUBLIC int num_anews = -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. + */ +PUBLIC int com_adjudicate(int p, param_list param) +{ + int wp, wconnected, bp, bconnected, g, inprogress, confused = 0; + + ASSERT(parray[p].adminLevel >= ADMIN_ADMIN); + 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 = ((parray[wp].game >=0) &&(parray[wp].opponent == bp)); + + if (inprogress) { + g = 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", parray[wp].name, parray[bp].name); + } else { + garray[g].white = wp; + 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.", + parray[wp].name, parray[wp].name, parray[bp].name); + + pcommand(p, "message %s Your game \"%s vs. %s\" has been aborted.", + parray[bp].name, parray[wp].name, 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", parray[wp].name, parray[wp].name, parray[bp].name); + + pcommand(p, "message %s Your game \"%s vs. %s\" has been adjudicated " + "as a draw", parray[bp].name, parray[wp].name, 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", parray[wp].name, parray[wp].name, parray[bp].name); + + pcommand(p, "message %s Your game \"%s vs. %s\" has been adjudicated " + "as a loss", parray[bp].name, parray[wp].name, 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", parray[wp].name, parray[wp].name, parray[bp].name); + + pcommand(p, "message %s Your game \"%s vs. %s\" has been adjudicated " + "as a win", parray[bp].name, parray[wp].name, 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; +} + +/* + * create_news_file: Creates either a general or and admin news + * file, depending upon the admin switch. + */ +PRIVATE int create_news_file(int p, param_list param, int admin) +{ + FILE *fp; + char filename[MAX_FILENAME_SIZE]; + + ASSERT(parray[p].adminLevel >= ADMIN_ADMIN); + + if (admin) { + if (param[0].val.integer > num_anews) + pprintf(p, "There must be an admin news index #%d before you can create the file.", param[0].val.integer); + else { + sprintf(filename, "%s/adminnews.%d", news_dir, param[0].val.integer); + fp = fopen(filename, "w"); + fprintf(fp, "%s\n", param[1].val.string); + fclose(fp); + } + } else { + if (param[0].val.integer > num_news) + pprintf(p, "There must be a news index #%d before you can create the file.", param[0].val.integer); + else { + sprintf(filename, "%s/news.%d", news_dir, param[0].val.integer); + fp = fopen(filename, "w"); + fprintf(fp, "%s\n", param[1].val.string); + fclose(fp); + } + } + + return COM_OK; +} + +PRIVATE int add_item(char *new_item, char *filename) +{ + FILE *new_fp, *old_fp; + char tmp_file[MAX_FILENAME_SIZE]; + char junk[MAX_LINE_SIZE]; + + sprintf(tmp_file, "%s/.tmp.idx", news_dir); + new_fp = fopen(tmp_file, "w"); + old_fp = fopen(filename, "r"); + + if (!new_fp || !old_fp) + return 0; + + fprintf(new_fp, "%s", new_item); + while (1) { + fgets(junk, MAX_LINE_SIZE, old_fp); + if (feof(old_fp)) + break; + fprintf(new_fp, "%s", junk); + } + fclose(new_fp); + fclose(old_fp); + remove(filename); + rename(tmp_file, filename); + + return 1; +} + +/* + * create_news_index: Adds a new item to either the general or admin news + * index file, depending upon the admin switch. + */ +PRIVATE int create_news_index(int p, param_list param, int admin) +{ + char filename[MAX_FILENAME_SIZE]; + char new_item[MAX_LINE_SIZE]; + + ASSERT(parray[p].adminLevel >= ADMIN_ADMIN); + + if (admin) { + if (strlen(param[0].val.string) > 50) + pprintf(p, "Sorry, you must limit an index to 50 charaters! Admin news index not created.\n"); + else { + num_anews++; + sprintf(new_item, "%d %d %s\n", (int) time(0), num_anews, param[0].val.string); + sprintf(filename, "%s/newadminnews.index", news_dir); + if (add_item(new_item, filename)) { + pprintf(p, "Index for admin news item #%d created.\n", num_anews); + pprintf(p, "Please use 'canewsf' to include more info.\n"); + } else + pprintf(p, "Something went wrong creating item.\nNotify Marsalis.\n"); + } + } else { + if (strlen(param[0].val.string) > 50) + pprintf(p, "Sorry, you must limit an index to 50 charaters! News index not created.\n"); + else { + num_news++; + sprintf(filename, "%s/newnews.index", news_dir); + sprintf(new_item, "%d %d %s\n", (int) time(0), num_news, param[0].val.string); + if (add_item(new_item, filename)) { + pprintf(p, "Index for news item #%d created.\n", num_news); + pprintf(p, "Please use 'cnewsf' to include more info.\n"); + } else + pprintf(p, "Something went wrong creating item.\nNotify Marsalis.\n"); + } + } + + return COM_OK; +} + +/* cnewsi + * + * Usage: cnewsi message + * + * + * 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. + */ +PUBLIC int com_cnewsi(int p, param_list param) +{ + return create_news_index(p, param, 0); +} + +/* cnewsf + * + * Usage: cnewsf # message + * + * 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. + */ +PUBLIC int com_cnewsf(int p, param_list param) +{ + return create_news_file(p, param, 0); +} + +PUBLIC int com_canewsi(int p, param_list param) +{ + return create_news_index(p, param, 1); +} + +PUBLIC int com_canewsf(int p, param_list param) +{ + return create_news_file(p, param, 1); +} + +/* + * anews + * + * + * Usage: anews [#, all] + * + * 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. + * + */ +PUBLIC int com_anews(int p, param_list param) +{ + FILE *fp; + char filename[MAX_FILENAME_SIZE]; + char junk[MAX_LINE_SIZE]; + char *junkp; + int crtime, found = 0; + char count[10]; + + sprintf(filename, "%s/newadminnews.index", news_dir); + fp = fopen(filename, "r"); + if (!fp) { + fprintf(stderr, "Cant find news index.\n"); + return COM_OK; + } + + if (param[0].type == 0) { + + /* no params - then just display index over news */ + sprintf(filename, "%s/newadminnews.index", news_dir); + pprintf(p, "Index of recent admin news items:\n"); + fgets(junk, MAX_LINE_SIZE, fp); + sscanf(junk, "%d %s", &crtime, count); + rscan_news2(fp, p, 9); + junkp = junk; + junkp = nextword(junkp); + junkp = nextword(junkp); + pprintf(p, "%3s (%s) %s", count, fix_time(strltime(&crtime)), junkp); + fclose(fp); + + } else if ((param[0].type == TYPE_WORD) && !strcmp(param[0].val.word, "all")) { + /* param all - displays all news items */ + pprintf(p, "Index of all admin news items:\n"); + fgets(junk, MAX_LINE_SIZE, fp); + sscanf(junkp, "%d %s", &crtime, count); + rscan_news(fp, p, 0); + junkp = junk; + junkp = nextword(junkp); + junkp = nextword(junkp); + pprintf(p, "%3s (%s) %s", count, fix_time(strltime(&crtime)), junkp); + fclose(fp); + + } else { + + while (!feof(fp) && !found) { + junkp = junk; + fgets(junk, MAX_LINE_SIZE, fp); + if (feof(fp)) + break; + if (strlen(junk) > 1) { + sscanf(junkp, "%d %s", &crtime, count); + if (!strcmp(count, param[0].val.word)) { + found = 1; + junkp = nextword(junkp); + junkp = nextword(junkp); + pprintf(p, "ANEWS %3s (%s) %s\n", count, fix_time(strltime(&crtime)), + junkp); + } + } + } + fclose(fp); + if (!found) { + pprintf(p, "Bad index number!\n"); + return COM_OK; + } + /* file exists - show it */ + sprintf(filename, "%s/adminnews.%s", news_dir, param[0].val.word); + fp = fopen(filename, "r"); + if (!fp) { + pprintf(p, "No more info.\n"); + return COM_OK; + } + fclose(fp); + sprintf(filename, "adminnews.%s", param[0].val.word); + if (psend_file(p, news_dir, filename) < 0) { + pprintf(p, "Internal error - couldn't send news file!\n"); + } + } + return COM_OK; +} + +PUBLIC int strcmpwild(char *mainstr, char *searchstr) +{ + int i; + + if (strlen(mainstr) < strlen(searchstr)) + return 1; + for (i = 0; i < strlen(mainstr); i++) { + if (searchstr[i] == '*') + return 0; + if (mainstr[i] != searchstr[i]) + return 1; + } + return 0; +} + +/* + * chkip + * + * Usage: chkip ip_address + * + * This command returns the names of all users currently logged on + * from a given IP address. + */ +PUBLIC int com_checkIP(int p, param_list param) +{ + char *ipstr = param[0].val.word; + int p1; + + ASSERT(parray[p].adminLevel >= ADMIN_ADMIN); + pprintf(p, "Matches the following player(s): \n\n"); + for (p1 = 0; p1 < p_num; p1++) + if (!strcmpwild(dotQuad(parray[p1].thisHost), ipstr) && (parray[p1].status != PLAYER_EMPTY)) + pprintf(p, "%16.16s %s\n", parray[p1].name, dotQuad(parray[p1].thisHost)); + return COM_OK; +} + +PUBLIC int com_checkSOCKET(int p, param_list param) +{ + int fd = param[0].val.integer; + int p1, flag; + + ASSERT(parray[p].adminLevel >= ADMIN_ADMIN); + flag = 0; + for (p1 = 0; p1 < p_num; p1++) { + if (parray[p1].socket == fd) { + flag = 1; + pprintf(p, "Socket %d is used by %s\n", fd, parray[p1].name); + } + } + if (!flag) + pprintf(p, "Socket %d is unused!\n", fd); + return COM_OK; +} + +/* + * chkpl + * + * Usage: chkpl handle + * + * 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 + * thisHost + * lastHost + * num_comments + */ +PUBLIC int com_checkPLAYER(int p, param_list param) +{ + char *player = param[0].val.word; + int p1; + + ASSERT(parray[p].adminLevel >= ADMIN_ADMIN); + p1 = player_search(p, param[0].val.word); + if (!p1) + return COM_OK; + if (p1 < 0) { + p1 = (-p1) - 1; + pprintf(p, "%s is not logged in.\n", player); + stolower(player); + pprintf(p, "name = %s\n", parray[p1].name); + pprintf(p, "login = %s\n", parray[p1].login); + pprintf(p, "fullName = %s\n", (parray[p1].fullName ? parray[p1].fullName : "(none)")); + pprintf(p, "emailAddress = %s\n", (parray[p1].emailAddress ? parray[p1].emailAddress : "(none)")); + pprintf(p, "adminLevel = %d\n", parray[p1].adminLevel); +/* pprintf(p, "network_player = %d\n", parray[p1].network_player); */ + pprintf(p, "lastHost = %s\n", dotQuad(parray[p1].lastHost)); + pprintf(p, "num_comments = %d\n", parray[p1].num_comments); + + player_remove(p1); + return COM_OK; + } else { + p1 = p1 - 1; + pprintf(p, "%s is number %d in parray of size %d\n", player, p1, p_num + 1); + pprintf(p, "name = %s\n", parray[p1].name); + pprintf(p, "login = %s\n", parray[p1].login); + pprintf(p, "fullName = %s\n", parray[p1].fullName ? parray[p1].fullName : "(none)"); + pprintf(p, "emailAddress = %s\n", parray[p1].emailAddress ? parray[p1].emailAddress : "(none)"); + pprintf(p, "socket = %d\n", parray[p1].socket); + pprintf(p, "registered = %d\n", parray[p1].registered); + pprintf(p, "last_tell = %d\n", parray[p1].last_tell); + pprintf(p, "last_channel = %d\n", parray[p1].last_channel); + pprintf(p, "logon_time = %s", ctime((time_t *) &parray[p1].logon_time)); + pprintf(p, "adminLevel = %d\n", parray[p1].adminLevel); +/* pprintf(p, "network_player = %d\n", parray[p1].network_player); */ + pprintf(p, "thisHost = %s\n", dotQuad(parray[p1].thisHost)); + pprintf(p, "lastHost = %s\n", dotQuad(parray[p1].lastHost)); + pprintf(p, "num_comments = %d\n", parray[p1].num_comments); + + } + return COM_OK; +} + +/* + * chkts + * + * Usage: chkts + * + * This command displays all current users who are using timeseal. + */ +PUBLIC int com_checkTIMESEAL(int p, param_list param) +{ + int p1, count = 0; + + ASSERT(parray[p].adminLevel >= ADMIN_ADMIN); + pprintf(p, "The following player(s) are using timeseal:\n\n"); + +#ifdef TIMESEAL + for (p1 = 0; p1 < p_num; p1++) { + if (parray[p1].status != PLAYER_EMPTY + && con[parray[p1].socket].timeseal) { + pprintf(p, "%s\n", parray[p1].name); + count++; + } + } + pprintf(p, "\nNumber of people using timeseal: %d\n", count); +#endif + + return COM_OK; +} + +PUBLIC int com_checkGAME (int p,param_list param) +{ + int p1,g,link; + char tmp[10 + 1 + 7]; /* enough to store number 'black: ' and \0 */ + int startTime; + multicol *m; + int found = 0; + + ASSERT(parray[p].adminLevel >= ADMIN_ADMIN); + + if (g_num == 0) { + pprintf (p,"No games are currently linked into the garray structure.\n"); + return COM_OK; + } + + if (param[0].type == TYPE_WORD) { /* a player name */ + if ((p1 = player_find_part_login(param[0].val.word)) < 0) { + pprintf(p, "%s doesn't appear to be logged in.\n", param[0].val.word); + pprintf(p,"Searching through garray to find matching game numbers.\n"); + pprintf(p,"Use chkgame to view the results.\n"); + m = multicol_start(g_num*2); /* Obviously no more than that */ + for (g = 0; g < g_num; g++) { + multicol_store(m,tmp); + if (!(strcasecmp (garray[g].white_name,param[0].val.word))) { + sprintf (tmp,"White: %d",g); + multicol_store(m,tmp); + found = 1; + } + if (!(strcasecmp (garray[g].black_name,param[0].val.word))) { + sprintf (tmp,"Black: %d",g); + multicol_store(m,tmp); + found = 1; + } + } + if (found) + multicol_pprint(m,p,parray[p].d_width,2); + else + pprintf(p,"No matching games were found.\n"); + multicol_end(m); + return COM_OK; + } + + if ((g = parray[p1].game) < 0) { + pprintf(p,"%s doesn't appear to be playing a game.\n",parray[p1].name); + pprintf(p,"Searching through garray to find matching game numbers.\n"); + pprintf(p,"Use chkgame to view the results.\n"); + m = multicol_start(g_num*2); /* Obviously no more than that */ + for (g = 0; g < g_num; g++) { + if ((garray[g].white) == p1) { + sprintf (tmp,"White: %d",g); + multicol_store(m,tmp); + found = 1; + } + if ((garray[g].black) == p1) { + sprintf (tmp,"Black: %d",g); + multicol_store(m,tmp); + found = 1; + } + } + if (found) + multicol_pprint(m,p,parray[p].d_width,2); + else + pprintf (p,"No matching games were found.\n"); + multicol_end(m); + return COM_OK; + } + } else { + if (((g = param[0].val.integer - 1) < 0) || (g >= g_num)) { + pprintf (p, "The current range of game numbers is 1 to %d.\n",g_num); + return COM_OK; + } + } + startTime = untenths(garray[g].timeOfStart); + pprintf (p,"Current stored info for game %d (garray[%d]):\n",g+1,g); + pprintf (p,"Initial white time: %d Initial white increment %d\n", + garray[g].wInitTime/600,garray[g].wIncrement/10); + pprintf (p,"Initial black time: %d Initial black increment %d\n", + garray[g].bInitTime/600,garray[g].bIncrement/10); + pprintf (p,"Time of starting: %s\n",strltime (&startTime)); + pprintf (p,"Game is: %s (%d) vs. %s (%d)\n",garray[g].white_name,garray[g].white_rating, + garray[g].black_name,garray[g].black_rating); + pprintf (p,"White parray entry: %d Black parray entry %d\n",garray[g].white,garray[g].black); + if ((link = garray[g].link) >= 0) { + pprintf (p,"Bughouse linked to game: %d\n",garray[g].link + 1); + pprintf (p,"Partner is playing game: %s (%d) vs. %s (%d)\n",garray[link].white_name,garray[link].white_rating, + garray[link].black_name,garray[link].black_rating); + } else + pprintf (p,"Game is not bughouse or link to partner's game not found.\n"); + pprintf (p,"Game is %s\n",(garray[g].rated) ? "rated" : "unrated"); + pprintf (p,"Game is %s\n",(garray[g].private) ? "private" : "not private"); + pprintf (p,"Games is of type %s\n", + garray[g].type == TYPE_UNTIMED ? "untimed" : + garray[g].type == TYPE_BLITZ ? "blitz" : + garray[g].type == TYPE_STAND ? "standard" : + garray[g].type == TYPE_NONSTANDARD ? "non-standard" : + garray[g].type == TYPE_WILD ? "wild" : + garray[g].type == TYPE_LIGHT ? "lightning" : + garray[g].type == TYPE_BUGHOUSE ? "bughouse" : + "Unknown - Error!"); + pprintf (p,"%d halfmove(s) have been made\n",garray[g].numHalfMoves); + if (garray[g].status == GAME_ACTIVE) + game_update_time(g); + pprintf (p,"White's time %s Black's time ", + tenth_str((garray[g].wTime > 0 ? garray[g].wTime : 0), 0)); + pprintf (p,"%s\n", + tenth_str((garray[g].bTime > 0 ? garray[g].bTime : 0), 0)); + pprintf (p,"The clock is%sticking\n", + (garray[g].clockStopped || (garray[g].status != GAME_ACTIVE)) ? " not " : " "); + pprintf (p,"Game status: %s\n", + garray[g].status == GAME_EMPTY ? "GAME_EMPTY" : + garray[g].status == GAME_NEW ? "GAME_NEW" : + garray[g].status == GAME_ACTIVE ? "GAME_ACTIVE" : + garray[g].status == GAME_EXAMINE ? "GAME_EXAMINE" : + "Unknown - Error!"); + 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. + */ +PUBLIC int com_remplayer(int p, param_list param) +{ + char *player = param[0].val.word; + char playerlower[MAX_LOGIN_NAME]; + int p1, lookup; + + ASSERT(parray[p].adminLevel >= ADMIN_ADMIN); + strcpy(playerlower, player); + stolower(playerlower); + p1 = player_new(); + lookup = player_read(p1, playerlower); + if (!lookup) { + if ((parray[p].adminLevel <= parray[p1].adminLevel) && !player_ishead(p)) { + 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 *. + */ +PUBLIC int com_raisedead(int p, param_list param) +{ + char *player = param[0].val.word; + char playerlower[MAX_LOGIN_NAME], newplayerlower[MAX_LOGIN_NAME]; + + int p1, p2, lookup; + + ASSERT(parray[p].adminLevel >= ADMIN_ADMIN); + strcpy(playerlower, player); + stolower(playerlower); + if (player_find_bylogin(playerlower) >= 0) { + pprintf(p, "A player by that name is logged in.\n"); + pprintf(p, "Can't raise until they leave.\n"); + return COM_OK; + } + p1 = player_new(); + lookup = player_read(p1, playerlower); + player_remove(p1); + if (!lookup) { + pprintf(p, "A player by the name %s is already registered.\n", player); + pprintf(p, "Obtain a new handle for the dead person.\n"); + pprintf(p, "Then use raisedead [oldname] [newname].\n"); + return COM_OK; + } + 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 (parray[p1].s_stats.rating > 0) + UpdateRank(TYPE_STAND, player, &parray[p1].s_stats, player); + if (parray[p1].b_stats.rating > 0) + UpdateRank(TYPE_BLITZ, player, &parray[p1].b_stats, player); + if (parray[p1].w_stats.rating > 0) + UpdateRank(TYPE_WILD, player, &parray[p1].w_stats, player); + } + player_remove(p1); + } else { + pprintf(p, "Raisedead failed.\n"); + } + return COM_OK; + } else { + char *newplayer = param[1].val.word; + strcpy(newplayerlower, newplayer); + stolower(newplayerlower); + 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))) { + strfree(parray[p2].name); + parray[p2].name = strdup(newplayer); + player_save(p2); + if (parray[p2].s_stats.rating > 0) + UpdateRank(TYPE_STAND, newplayer, &parray[p2].s_stats, newplayer); + if (parray[p2].b_stats.rating > 0) + UpdateRank(TYPE_BLITZ, newplayer, &parray[p2].b_stats, newplayer); + if (parray[p2].w_stats.rating > 0) + UpdateRank(TYPE_WILD, newplayer, &parray[p2].w_stats, newplayer); + } + player_remove(p2); + } else { + pprintf(p, "Raisedead failed.\n"); + } + } + return COM_OK; +} + +/* + * 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 + */ +PUBLIC 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; + + ASSERT(parray[p].adminLevel >= ADMIN_ADMIN); + 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; + } + parray[p1].name = strdup(newplayer); + parray[p1].login = strdup(newplayerlower); + parray[p1].fullName = strdup(newname); + parray[p1].emailAddress = strdup(newemail); + if (strcmp(newemail, "none")) { + for (i = 0; i < PASSLEN; i++) { + password[i] = 'a' + rand() % 26; + } + password[i] = '\0'; + salt[0] = 'a' + rand() % 26; + salt[1] = 'a' + rand() % 26; + salt[2] = '\0'; + parray[p1].passwd = strdup(crypt(password, salt)); + } else { + password[0] = '\0'; + parray[p1].passwd = strdup(password); + } + parray[p1].registered = 1; +/* parray[p1].network_player = 0; */ + parray[p1].rated = 1; + 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\nTo connect to the server and use this account:\n\n" + " telnet %s 5000\n\nand enter your handle name and password.\n\n" + "Regards,\n\nThe FICS admins\n", + newplayer, newname, newemail, password, fics_hostname); + + 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"); + 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"); + return COM_OK; + } + } + return COM_OK; +} + +PUBLIC int com_pose(int p, param_list param) +{ + int p1; + + ASSERT(parray[p].adminLevel >= ADMIN_ADMIN); + 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 ((parray[p].adminLevel <= parray[p1].adminLevel) && !player_ishead(p)) { + pprintf(p, "You can only pose as players below your adminlevel.\n"); + return COM_OK; + } + pprintf(p, "Command issued as %s\n", 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. + */ +PUBLIC int com_asetv(int p, param_list param) +{ + int p1; + + ASSERT(parray[p].adminLevel >= ADMIN_ADMIN); + 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 ((parray[p].adminLevel <= parray[p1].adminLevel) && !player_ishead(p)) { + pprintf(p, "You can only aset players below your adminlevel.\n"); + return COM_OK; + } + pprintf(p, "Command issued as %s\n", 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"). + */ +PUBLIC int com_announce(int p, param_list param) +{ + int p1; + int count = 0; + + ASSERT(parray[p].adminLevel >= ADMIN_ADMIN); + if (!printablestring(param[0].val.string)) { + pprintf(p, "Your message contains some unprintable character(s).\n"); + return COM_OK; + } + for (p1 = 0; p1 < p_num; p1++) { + if (p1 == p) + continue; + if (parray[p1].status != PLAYER_PROMPT) + continue; + count++; + pprintf_prompt(p1, "\n\n **ANNOUNCEMENT** from %s: %s\n\n", parray[p].name, param[0].val.string); + } + pprintf(p, "\n(%d) **ANNOUNCEMENT** from %s: %s\n\n", count, parray[p].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"). + */ +PUBLIC int com_annunreg(int p, param_list param) +{ + int p1; + int count = 0; + + ASSERT(parray[p].adminLevel >= ADMIN_ADMIN); + if (!printablestring(param[0].val.string)) { + pprintf(p, "Your message contains some unprintable character(s).\n"); + return COM_OK; + } + for (p1 = 0; p1 < p_num; p1++) { + if (p1 == p) + continue; + if (parray[p1].status != PLAYER_PROMPT) + continue; + if ((parray[p1].registered) && (parray[p1].adminLevel < ADMIN_ADMIN)) + continue; + count++; + pprintf_prompt(p1, "\n\n **UNREG ANNOUNCEMENT** from %s: %s\n\n", parray[p].name, param[0].val.string); + } + pprintf(p, "\n(%d) **UNREG ANNOUNCEMENT** from %s: %s\n\n", count, parray[p].name, param[0].val.string); + return COM_OK; +} + +PUBLIC int com_muzzle(int p, param_list param) +{ + pprintf(p, "Obsolete command: Please use +muzzle and -muzzle.\n"); + return COM_OK; +} + +PUBLIC int com_cmuzzle(int p, param_list param) +{ + pprintf(p, "Obsolete command: Please use +cmuzzle and -cmuzzle.\n"); + 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. + */ +PUBLIC int com_asetpasswd(int p, param_list param) +{ + int p1, connected; + char subject[400], text[10100]; + char salt[3]; + + ASSERT(parray[p].adminLevel >= ADMIN_ADMIN); + + if (!FindPlayer(p, param[0].val.word, &p1, &connected)) + return COM_OK; + + if ((parray[p].adminLevel <= parray[p1].adminLevel) && !player_ishead(p)) { + pprintf(p, "You can only set password for players below your adminlevel.\n"); + if (!connected) + player_remove(p1); + return COM_OK; + } + if (!parray[p1].registered) { + pprintf(p, "You cannot set the password of an unregistered player!\n"); + return COM_OK; + } + if (parray[p1].passwd) + rfree(parray[p1].passwd); + if (param[1].val.word[0] == '*') { + parray[p1].passwd = strdup(param[1].val.word); + pprintf(p, "Account %s locked!\n", parray[p1].name); + sprintf(text, "Password of %s is now useless. Your account at our FICS has been locked.\n", parray[p1].name); + } else { + salt[0] = 'a' + rand() % 26; + salt[1] = 'a' + rand() % 26; + salt[2] = '\0'; + parray[p1].passwd = strdup(crypt(param[1].val.word, salt)); + sprintf(text, "Password of %s changed to \"%s\".\n", parray[p1].name, param[1].val.word); + pprintf(p, "%s", text); + } + if (param[1].val.word[0] == '*') { + sprintf(subject, "FICS: %s has locked your account.", parray[p].name); + if (connected) + pprintf_prompt(p1, "\n%s\n", subject); + } else { + sprintf(subject, "FICS: %s has changed your password.", parray[p].name); + if (connected) + pprintf_prompt(p1, "\n%s\n", subject); + } + mail_string_to_address(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. + */ +PUBLIC int com_asetemail(int p, param_list param) +{ + int p1, connected; + + ASSERT(parray[p].adminLevel >= ADMIN_ADMIN); + + if (!FindPlayer(p, param[0].val.word, &p1, &connected)) + return COM_OK; + + if ((parray[p].adminLevel <= parray[p1].adminLevel) && !player_ishead(p)) { + pprintf(p, "You can only set email addr for players below your adminlevel.\n"); + if (!connected) + player_remove(p1); + return COM_OK; + } + if (parray[p1].emailAddress) + rfree(parray[p1].emailAddress); + if (param[1].type == TYPE_NULL) { + parray[p1].emailAddress = NULL; + pprintf(p, "Email address for %s removed\n", parray[p1].name); + } else { + parray[p1].emailAddress = strdup(param[1].val.word); + pprintf(p, "Email address of %s changed to \"%s\".\n", 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 email address.\n\n", parray[p].name); + } else { + pprintf_prompt(p1, "\n\n%s has changed your email address.\n\n", parray[p].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". + */ +PUBLIC int com_asetrealname(int p, param_list param) +{ + int p1, connected; + + ASSERT(parray[p].adminLevel >= ADMIN_ADMIN); + if (!FindPlayer(p, param[0].val.word, &p1, &connected)) + return COM_OK; + + if ((parray[p].adminLevel <= parray[p1].adminLevel) && !player_ishead(p)) { + pprintf(p, "You can only set real names for players below your adminlevel.\n"); + if (!connected) + player_remove(p1); + return COM_OK; + } + if (parray[p1].fullName) + rfree(parray[p1].fullName); + if (param[1].type == TYPE_NULL) { + parray[p1].fullName = NULL; + pprintf(p, "Real name for %s removed\n", parray[p1].name); + } else { + parray[p1].fullName = strdup(param[1].val.word); + pprintf(p, "Real name of %s changed to \"%s\".\n", 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", parray[p].name); + } else { + pprintf_prompt(p1, "\n\n%s has changed your real name.\n\n", parray[p].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. + */ +PUBLIC 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; + + ASSERT(parray[p].adminLevel >= ADMIN_ADMIN); + 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 ((parray[p].adminLevel <= parray[p1].adminLevel) && !player_ishead(p)) { + 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); + strfree(parray[p1].name); + parray[p1].name = strdup(newplayer); + player_save(p1); + if (parray[p1].s_stats.rating > 0) + UpdateRank(TYPE_STAND, newplayer, &parray[p1].s_stats, player); + if (parray[p1].b_stats.rating > 0) + UpdateRank(TYPE_BLITZ, newplayer, &parray[p1].b_stats, player); + if (parray[p1].w_stats.rating > 0) + UpdateRank(TYPE_WILD, newplayer, &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. + */ +PUBLIC int com_asetadmin(int p, param_list param) +{ + int p1, connected, oldlevel; + + ASSERT(parray[p].adminLevel >= ADMIN_GOD); + if (!FindPlayer(p, param[0].val.word,&p1, &connected)) + return COM_OK; + + if ((parray[p].adminLevel <= parray[p1].adminLevel) && !player_ishead(p)) { + pprintf(p, "You can only set adminlevel for players below your adminlevel.\n"); + if (!connected) + player_remove(p1); + return COM_OK; + } + if ((parray[p1].login) == (parray[p].login)) { + pprintf(p, "You can't change your own adminlevel.\n"); + return COM_OK; + } + if ((param[1].val.integer >= parray[p].adminLevel) && !player_ishead(p)) { + pprintf(p, "You can't promote someone to or above your adminlevel.\n"); + if (!connected) + player_remove(p1); + return COM_OK; + } + oldlevel = parray[p1].adminLevel; + parray[p1].adminLevel = param[1].val.integer; + pprintf(p, "Admin level of %s set to %d.\n", parray[p1].name, parray[p1].adminLevel); + player_save(p1); + if (connected) { + pprintf_prompt(p1, "\n\n%s has set your admin level to %d.\n\n", parray[p].name, parray[p1].adminLevel); + } else { + player_remove(p1); + } + return COM_OK; +} + +PRIVATE void SetRating(int p1, param_list param, 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. + */ +PUBLIC int com_asetblitz(int p, param_list param) +{ + int p1, connected; + + ASSERT(parray[p].adminLevel >= ADMIN_ADMIN); + if (!FindPlayer(p, param[0].val.word, &p1, &connected)) + return COM_OK; + + SetRating(p1, param, &parray[p1].b_stats); + player_save(p1); + UpdateRank(TYPE_BLITZ, parray[p1].name, &parray[p1].b_stats, + parray[p1].name); + pprintf(p, "Blitz rating for %s modified.\n", 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. + */ +PUBLIC int com_asetwild(int p, param_list param) +{ + int p1, connected; + + ASSERT(parray[p].adminLevel >= ADMIN_ADMIN); + if (!FindPlayer(p, param[0].val.word, &p1, &connected)) + return COM_OK; + + SetRating(p1, param, &parray[p1].w_stats); + player_save(p1); + UpdateRank(TYPE_WILD, parray[p1].name, &parray[p1].w_stats, + parray[p1].name); + pprintf(p, "Wild rating for %s modified.\n", 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. + */ +PUBLIC int com_asetstd(int p, param_list param) +{ + int p1, connected; + + ASSERT(parray[p].adminLevel >= ADMIN_ADMIN); + if (!FindPlayer(p, param[0].val.word, &p1, &connected)) + return COM_OK; + + SetRating(p1, param, &parray[p1].s_stats); + player_save(p1); + UpdateRank(TYPE_STAND, parray[p1].name, &parray[p1].s_stats, + parray[p1].name); + pprintf(p, "Standard rating for %s modified.\n", 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. + */ +PUBLIC int com_asetlight(int p, param_list param) +{ + int p1, connected; + + ASSERT(parray[p].adminLevel >= ADMIN_ADMIN); + if (!FindPlayer(p, param[0].val.word, &p1, &connected)) + return COM_OK; + + SetRating(p1, param, &parray[p1].l_stats); + player_save(p1); + pprintf(p, "Lightning rating for %s modified.\n", parray[p1].name); + if (!connected) + player_remove(p1); + 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). + */ +PUBLIC int com_nuke(int p, param_list param) +{ + int p1, fd; + + ASSERT(parray[p].adminLevel >= ADMIN_ADMIN); + if ((p1 = player_find_part_login(param[0].val.word)) < 0) { + pprintf(p, "%s isn't logged in.\n", param[0].val.word); + } else { + if ((parray[p].adminLevel > parray[p1].adminLevel) || player_ishead(p)) { + pprintf(p, "Nuking: %s\n", param[0].val.word); + pprintf(p, "Please leave a comment explaining why %s was nuked.\n", parray[p1].name); + pprintf(p1, "\n\n**** You have been kicked out by %s! ****\n\n", parray[p].name); + pcommand(p, "addcomment %s Nuked\n", parray[p1].name); + fd = parray[p1].socket; + process_disconnection(fd); + net_close_connection(fd); + return COM_OK; + } else { + pprintf(p, "You need a higher adminlevel to nuke %s!\n", param[0].val.word); + } + } + 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. + */ +PUBLIC int com_summon(int p, param_list param) +{ + int p1; + ASSERT(parray[p].adminLevel >= ADMIN_ADMIN); + 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; + } else { + pprintf(p1, "\a\n"); + pprintf_highlight(p1, "%s", parray[p].name); + pprintf_prompt(p1, " needs to talk with you. Use tell %s to reply.\a\n", parray[p].name); + pprintf(p, "Summoning sent to %s.\n", 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. + */ +PUBLIC int com_addcomment(int p, param_list param) +{ + int p1, connected; + + ASSERT(parray[p].adminLevel >= ADMIN_ADMIN); + 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", 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. + */ +PUBLIC int com_showcomment(int p, param_list param) +{ + int p1, connected; + ASSERT(parray[p].adminLevel >= ADMIN_ADMIN); + ASSERT(param[0].type == TYPE_WORD); + + 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. + */ +PUBLIC int com_admin(int p, param_list param) +{ + ASSERT(parray[p].adminLevel >= ADMIN_ADMIN); + parray[p].i_admin = !(parray[p].i_admin); + if (parray[p].i_admin) { + pprintf(p, "Admin mode (*) is now shown\n"); + } else { + pprintf(p, "Admin mode (*) is now not 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. + */ +PUBLIC int com_quota(int p, param_list param) +{ + ASSERT(parray[p].adminLevel >= ADMIN_ADMIN); + if (param[0].type == TYPE_NULL) { + pprintf(p, "The current shout quota is 2 shouts per %d seconds.\n", quota_time); + return COM_OK; + } + quota_time = param[0].val.integer; + pprintf(p, "The shout quota is now 2 shouts per %d seconds.\n", quota_time); + return COM_OK; +} + + +/* + * asetmaxplayer + * + * Usage: asetmaxplayer [n] + * + * The command sets the maximum number of players (n) who can connect. + */ +PUBLIC int com_asetmaxplayer(int p, param_list param) +{ + ASSERT(parray[p].adminLevel >= ADMIN_ADMIN); + if (param[0].type != TYPE_NULL) { + pprintf(p, "Previously %d total conenctions allowed...\n", max_connections); + max_connections = param[0].val.integer; + if ((max_connections > MAX_PLAYER) || (max_connections > getdtablesize()-4)) { + max_connections = MIN(MAX_PLAYER, getdtablesize()-4); + pprintf (p, "Value too high. System OS limits us to %d.\n", + max_connections); + pprintf (p, "For saftey's sake, it should not be higher than %d.\n", + max_connections-2); + } + } + pprintf(p, + "There are currently %d regular and %d admin connections available,\n", + max_connections-10, 10 ); + pprintf(p, + "with %d maximum logins before unregistered login restrictions begin.\n", + MAX(max_connections-50, 200) ); + pprintf(p, "Total allowed connections: %d.\n", max_connections ); + return COM_OK; +} diff --git a/FICS/adminproc.h b/FICS/adminproc.h new file mode 100644 index 0000000..c6a21a7 --- /dev/null +++ b/FICS/adminproc.h @@ -0,0 +1,71 @@ +/* adminproc.h + * + */ + +/* + 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 + (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. +*/ + +/* Revision history: + name email yy/mm/dd Change + Richard Nash 93/10/22 Created +*/ + +#ifndef _ADMINPROC_H +#define _ADMINPROC_H + +extern int num_anews; + +extern int com_addplayer(); +extern int com_adjudicate(int, param_list); +extern int com_nuke(); +extern int com_pose(); +extern int com_asetv(); +extern int com_announce(); +extern int com_annunreg(); +extern int com_muzzle(); +extern int com_cmuzzle(); +extern int com_asetrealname(); +extern int com_asetpasswd(); +extern int com_asetemail(); +extern int com_asethandle(); +extern int com_asetadmin(); +extern int server_shutdown(); +extern int com_asetblitz(); +extern int com_asetwild(); +extern int com_asetstd(); +extern int com_asetlight(); +extern int com_checkIP(); +extern int com_checkGAME(); +extern int com_checkPLAYER(); +extern int com_checkSOCKET(); +extern int com_checkTIMESEAL(); +extern int com_remplayer(); +extern int com_raisedead(); +extern int strcmpwild(); +extern int com_anews(); +extern int com_cnewsi(); +extern int com_cnewsf(); +extern int com_canewsi(); +extern int com_canewsf(); +extern int com_createadmnews(); +extern int com_summon(); +extern int com_addcomment(); +extern int com_showcomment(); +extern int com_admin(); +extern int com_asetmaxplayer(); +extern int com_quota(); + +#endif /* _ADMINPROC_H */ + diff --git a/FICS/algcheck.c b/FICS/algcheck.c new file mode 100644 index 0000000..10fad0c --- /dev/null +++ b/FICS/algcheck.c @@ -0,0 +1,465 @@ +/* algcheck.c + * + */ + +/* + 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 + (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. +*/ + +/* Revision history: + name email yy/mm/dd Change + Richard Nash 93/10/22 Created +*/ + +#include "stdinclude.h" + +#include "common.h" +#include "algcheck.h" +#include "movecheck.h" +#include "board.h" +#include "utils.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) + */ +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 +/* #define ALG_DROP -2 IanO: this is in board.h, used in movecheck.c */ + +PRIVATE int get_move_info(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; + strcpy(tmp, str); + if ((s = index(tmp, '+'))) { /* Cut off any check marks */ + *s = '\0'; + } + if ((s = index(tmp, '='))) { /* Cut off any promotion 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: + fprintf(stderr, "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; +} + +PUBLIC int alg_is_move(char *mstr) +{ + int piece, ff, fr, tf, tr, bc; + + return get_move_info(mstr, &piece, &ff, &fr, &tf, &tr, &bc); +} + +/* We already know it is algebraic, get the move squares */ +PUBLIC int alg_parse_move(char *mstr, game_state_t * gs, move_t * mt) +{ + int f, r, tmpr, posf, posr, posr2; + int piece, ff, fr, tf, tr, bc; + + if (get_move_info(mstr, &piece, &ff, &fr, &tf, &tr, &bc) != MS_ALG) { + fprintf(stderr, "FICS: Shouldn't try to algebraicly parse non-algabraic move string.\n"); + return MOVE_ILLEGAL; + } + /* Resolve ambiguities in to-ness */ + if (tf == ALG_UNKNOWN) + return MOVE_AMBIGUOUS; /* Must always know to file */ + if (tr == ALG_UNKNOWN) { + posr = posr2 = ALG_UNKNOWN; + if (piece != PAWN) + return MOVE_AMBIGUOUS; + if (ff == ALG_UNKNOWN) + 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)) + 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 ((ff != ALG_UNKNOWN) && (fr != ALG_UNKNOWN)) + 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)) + 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; + return MOVE_OK; +} + +/* A assumes the move has yet to be made on the board */ +/* this is the old stupid function, we are testing one from soso... +PUBLIC char *alg_unparse( game_state_t *gs, move_t *mt ) +{ + static char mStr[20]; + + if ((piecetype(gs->board[mt->fromFile][mt->fromRank]) == KING) && + ((mt->fromFile == 4) && (mt->toFile == 6)) ) + return "o-o"; + if ((piecetype(gs->board[mt->fromFile][mt->fromRank]) == KING) && + ((mt->fromFile == 4) && (mt->toFile == 2)) ) + return "o-o-o"; + + sprintf( mStr, "%c%d%c%d", mt->fromFile+'a', mt->fromRank+1, + mt->toFile+'a', mt->toRank+1 ); + return mStr; +} +*/ + + +/* 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. + */ + +PUBLIC char *alg_unparse(game_state_t * gs, move_t * mt) +{ + static char mStr[20]; + char tmp[20]; + int piece, f, r; + int ambig, r_ambig, f_ambig; + 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, DROP_STR); + } 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.onMove = CToggle(fakeMove.onMove); + gs->onMove = CToggle(gs->onMove); + + /* New bracketing below to try to fix 'ambiguous move' bug. */ + if ((in_check(gs)) || !in_check(&fakeMove)) { + ambig++; + } + if (f == mt->fromFile) { + f_ambig++; + ambig++; + } + if (r == mt->fromRank) { + r_ambig++; + 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/FICS/algcheck.h b/FICS/algcheck.h new file mode 100644 index 0000000..60d971b --- /dev/null +++ b/FICS/algcheck.h @@ -0,0 +1,41 @@ +/* algcheck.h + * + */ + +/* + 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 + (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. +*/ + +/* Revision history: + name email yy/mm/dd Change + Richard Nash 93/10/22 Created +*/ + +#ifndef _ALGCHECK_H +#define _ALGCHECK_H + +#ifndef _BOARD_H +#include "board.h" +#endif + +#define DROP_CHAR '@' /* used by algcheck.c and movecheck.c */ +#define DROP_STR "@" + +extern int alg_is_move(char *); +extern int alg_parse_move(char *, game_state_t *, move_t *); +extern char *alg_unparse(game_state_t *, move_t *); + +/* extern int tolower(); */ + +#endif /* _ALGCHECK_H */ diff --git a/FICS/autoconfig.h b/FICS/autoconfig.h new file mode 100644 index 0000000..f3b4d46 --- /dev/null +++ b/FICS/autoconfig.h @@ -0,0 +1,171 @@ +/* autoconfig.h. Generated automatically by configure. */ +/* 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 that is POSIX.1 compatible. */ +#define HAVE_SYS_WAIT_H 1 + +/* Define if your struct tm has tm_zone. */ +#define HAVE_TM_ZONE 1 + +/* Define if you don't have tm_zone but do have the external array + tzname. */ +/* #undef HAVE_TZNAME */ + +/* Define if you have the vprintf function. */ +#define HAVE_VPRINTF 1 + +/* Define if you have the wait3 system call. */ +#define HAVE_WAIT3 1 + +/* Define to `long' if doesn't define. */ +/* #undef off_t */ + +/* Define as the return type of signal handlers (int or void). */ +#define RETSIGTYPE void + +/* Define to `unsigned' if doesn't define. */ +/* #undef size_t */ + +/* Define if you have the ANSI C header files. */ +#define STDC_HEADERS 1 + +/* Define if you can safely include both and . */ +#define TIME_WITH_SYS_TIME 1 + +/* Define if your declares struct tm. */ +/* #undef TM_IN_SYS_TIME */ + +/* Define this to be the return value of the time() function. */ +/* #undef time_t */ + +/* 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. */ +#define TV_USEC tv_usec + +/* Define if you have the crypt function. */ +#define HAVE_CRYPT 1 + +/* Define if you have the gethostname function. */ +#define HAVE_GETHOSTNAME 1 + +/* Define if you have the gettimeofday function. */ +#define HAVE_GETTIMEOFDAY 1 + +/* Define if you have the malloc_debug function. */ +/* #undef HAVE_MALLOC_DEBUG */ + +/* Define if you have the malloc_size function. */ +/* #undef HAVE_MALLOC_SIZE */ + +/* Define if you have the select function. */ +#define HAVE_SELECT 1 + +/* Define if you have the socket function. */ +#define HAVE_SOCKET 1 + +/* Define if you have the statfs function. */ +/* #undef HAVE_STATFS */ + +/* Define if you have the strcspn function. */ +#define HAVE_STRCSPN 1 + +/* Define if you have the strdup function. */ +#define HAVE_STRDUP 1 + +/* Define if you have the strstr function. */ +#define HAVE_STRSTR 1 + +/* Define if you have the header file. */ +/* #undef HAVE_BSTRING_H */ + +/* Define if you have the header file. */ +/* #undef HAVE_CRYPT_H */ + +/* Define if you have the header file. */ +#define HAVE_DIRENT_H 1 + +/* Define if you have the header file. */ +#define HAVE_FCNTL_H 1 + +/* Define if you have the header file. */ +#define HAVE_MATH_H 1 + +/* Define if you have the header file. */ +/* #undef HAVE_NDIR_H */ + +/* Define if you have the header file. */ +/* #undef HAVE_SYS_CRED_H */ + +/* Define if you have the header file. */ +/* #undef HAVE_SYS_DIR_H */ + +/* Define if you have the header file. */ +#define HAVE_SYS_FILE_H 1 + +/* Define if you have the header file. */ +#define HAVE_SYS_FILIO_H 1 + +/* Define if you have the header file. */ +#define HAVE_SYS_IOCTL_H 1 + +/* Define if you have the header file. */ +#define HAVE_SYS_MOUNT_H 1 + +/* Define if you have the header file. */ +/* #undef HAVE_SYS_NDIR_H */ + +/* Define if you have the header file. */ +#define HAVE_SYS_PARAM_H 1 + +/* Define if you have the header file. */ +#define HAVE_SYS_RESOURCE_H 1 + +/* Define if you have the header file. */ +/* #undef HAVE_SYS_RUSAGE_H */ + +/* Define if you have the header file. */ +#define HAVE_SYS_STAT_H 1 + +/* Define if you have the header file. */ +#define HAVE_SYS_TIME_H 1 + +/* Define if you have the header file. */ +#define HAVE_SYS_VFS_H 1 + +/* Define if you have the header file. */ +#define HAVE_UNISTD_H 1 + +/* Define if you have the crypt library (-lcrypt). */ +/* #undef HAVE_LIBCRYPT */ + +/* Define if you have the m library (-lm). */ +#define HAVE_LIBM 1 + +/* Define if you have the nsl library (-lnsl). */ +#define HAVE_LIBNSL 1 + +/* Define if you have the resolv library (-lresolv). */ +#define HAVE_LIBRESOLV 1 + +/* Define if you have the socket library (-lsocket). */ +/* #undef HAVE_LIBSOCKET */ diff --git a/FICS/board.c b/FICS/board.c new file mode 100644 index 0000000..efffcfb --- /dev/null +++ b/FICS/board.c @@ -0,0 +1,1001 @@ +/* board.c + * + */ + +/* + 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 + (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. +*/ + +/* Revision history: + name email yy/mm/dd Change + Richard Nash 93/10/22 Created +*/ + +#include "stdinclude.h" + +#include "common.h" +#include "board.h" +#include "playerdb.h" +#include "gamedb.h" +#include "utils.h" + +extern int style1(); +extern int style2(); +extern int style3(); +extern int style4(); +extern int style5(); +extern int style6(); +extern int style7(); +extern int style8(); +extern int style9(); +extern int style10(); +extern int style11(); +extern int style12(); +extern int style13(); + +PUBLIC char *wpstring[] = {" ", "P", "N", "B", "R", "Q", "K"}; +PUBLIC char *bpstring[] = {" ", "p", "n", "b", "r", "q", "k"}; + +PUBLIC int pieceValues[7] = {0, 1, 3, 3, 5, 9, 0}; +PUBLIC int (*styleFuncs[MAX_STYLES]) () = { + style1, + style2, + style3, + style4, + style5, + style6, + style7, + style8, + style9, + style10, + style11, + style12, + style13 +}; + +PRIVATE const int mach_type = (1<<7) | (1<<8) | (1<<9) | (1<<10) | (1<<11); +#define IsMachineStyle(n) (((1<<(n)) & mach_type) != 0) + +PRIVATE char bstring[MAX_BOARD_STRING_LEGTH]; + +PUBLIC int board_init(game_state_t *b, char *category, char *board) +{ + int retval; + int wval; + + if (!category || !board || !category[0] || !board[0]) + retval = board_read_file("standard", "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); + } + b->gameNum = -1; + return retval; +} + +PUBLIC void board_calc_strength(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]; + } +} + +PRIVATE 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; +} + +PRIVATE char *append_holding_machine(char *buf, int g, int c, int p) +{ + game_state_t *gs = &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; +} + +PRIVATE char *append_holding_display(char *buf, 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; +} + +PUBLIC void update_holding(int g, int pieceCaptured) +{ + int p = piecetype(pieceCaptured); + int c = colorval(pieceCaptured); + game_state_t *gs = &garray[g].game_state; + int pp, pl; + char tmp1[80], tmp2[80]; + + if (c == WHITE) { + c = 0; + pp = garray[g].white; + } else { + c = 1; + pp = 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, + parray[pp].name, wpstring[p], holding_str(gs->holding[c])); + for (pl = 0; pl < p_num; pl++) { + if (parray[pl].status == PLAYER_EMPTY) + continue; + if (player_is_observe(pl, g) || (parray[pl].game == g)) { + pprintf_prompt(pl, IsMachineStyle(parray[pl].style) ? tmp1 : tmp2); + } + } +} + +/* Globals used for each board */ +PRIVATE char *wName, *bName; +PRIVATE int wTime, bTime; +PRIVATE int orient; +PRIVATE int forPlayer; +PRIVATE int myTurn; /* 1 = my turn, 0 = observe, -1 = other turn */ + /* 2 = examiner, -2 = observing examiner */ + /* -3 = just send position (spos/refresh) */ + +PUBLIC char *board_to_string(char *wn, char *bn, + int wt, int bt, + game_state_t *b, move_t *ml, int style, + int orientation, int relation, + int p) +{ + int bh = (b->gameNum >= 0 && garray[b->gameNum].link >= 0); + wName = wn; + bName = bn; + wTime = wt; + bTime = bt; + orient = orientation; + myTurn = relation; + + 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, + garray[b->gameNum].white_name, + 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; +} + +PUBLIC char *move_and_time(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 */ + +PRIVATE int genstyle(game_state_t *b, move_t *ml, char *wp[], char *bp[], + char *wsqr, char *bsqr, + char *top, char *mid, char *start, char *end, char *label, + 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 (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[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 */ +PUBLIC int style13(game_state_t *b, move_t *ml) +{ + static 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 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 char *wsqr = "\033[40m"; + static char *bsqr = "\033[45m"; + 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); +} + +/* Standard ICS */ +PUBLIC int style1(game_state_t *b, move_t *ml) +{ + static char *wp[] = {" |", " P |", " N |", " B |", " R |", " Q |", " K |"}; + static 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 */ +PUBLIC int style2(game_state_t *b, move_t *ml) +{ + static char *wp[] = {"+ ", "P ", "N ", "B ", "R ", "Q ", "K "}; + static 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 */ +PUBLIC int style3(game_state_t *b, move_t *ml) +{ + static char *wp[] = {" ", " P ", " N ", " B ", " R ", " Q ", " K "}; + static 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 */ +PUBLIC int style4(game_state_t *b, move_t *ml) +{ + static char *wp[] = {" ", " P ", " N ", " B ", " R ", " Q ", " K "}; + static 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 */ +PUBLIC int style5(game_state_t *b, move_t *ml) +{ + static char *wp[] = {" ", " o ", " :N:", " ", " |R|", " {Q}", " =K="}; + static 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) */ +PUBLIC int style6(game_state_t *b, move_t *ml) +{ + static char *wp[] = {" |", " wp |", " WN |", " WB |", " WR |", " WQ |", " WK |"}; + static 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 */ +PUBLIC int style7(game_state_t *b, move_t *ml) +{ + static char *wp[] = {" ", " P", " N", " B", " R", " Q", " K"}; + static 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 */ +PUBLIC int style8(game_state_t *b, 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, + garray[b->gameNum].white_name, + (orient == WHITE) ? "*" : ":", + 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", + garray[b->gameNum].numHalfMoves / 2 + 1, + (b->onMove == WHITE) ? "W" : "B", + ws, + bs, + (wTime + 5) / 10, + (bTime + 5) / 10, + garray[b->gameNum].numHalfMoves ? + ml[garray[b->gameNum].numHalfMoves - 1].algString : + "none", + garray[b->gameNum].numHalfMoves ? + tenth_str(ml[garray[b->gameNum].numHalfMoves - 1].tookTime, 0) : + "0:00"); + strcat(bstring, tmp); + return 0; +} + +/* last 2 moves only (previous non-verbose mode) */ +PUBLIC int style9(game_state_t *b, move_t *ml) +{ + int i, count; + char tmp[80]; + int startmove; + + sprintf(tmp, "\nMove %-23s%s\n", + garray[b->gameNum].white_name, + garray[b->gameNum].black_name); + strcat(bstring, tmp); + sprintf(tmp, "---- -------------- --------------\n"); + strcat(bstring, tmp); + startmove = ((garray[b->gameNum].numHalfMoves - 3) / 2) * 2; + if (startmove < 0) + startmove = 0; + for (i = startmove, count = 0; + i < 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... */ +PUBLIC int style10(game_state_t *b, 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 (garray[b->gameNum].numHalfMoves) { + sprintf(tmp, "%d ", + ml[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), + (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, + garray[b->gameNum].white_name, + garray[b->gameNum].black_name, + myTurn, + garray[b->gameNum].wInitTime / 600, + garray[b->gameNum].wIncrement / 10, + ws, + bs, + (wTime + 5) / 10, + (bTime + 5) / 10, + garray[b->gameNum].numHalfMoves / 2 + 1, + garray[b->gameNum].numHalfMoves ? + ml[garray[b->gameNum].numHalfMoves - 1].moveString : + "none", + garray[b->gameNum].numHalfMoves ? + tenth_str(ml[garray[b->gameNum].numHalfMoves - 1].tookTime, 0) : + "0:00", + garray[b->gameNum].numHalfMoves ? + ml[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") */ +PUBLIC int style11(game_state_t *b, 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, + garray[b->gameNum].white_name, + (orient == WHITE) ? "*" : ":", + 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", + garray[b->gameNum].numHalfMoves / 2 + 1, + (b->onMove == WHITE) ? "W" : "B", + ws, + bs, + (wTime + 5) / 10, + (bTime + 5) / 10, + garray[b->gameNum].numHalfMoves ? + ml[garray[b->gameNum].numHalfMoves - 1].moveString : + "none", + garray[b->gameNum].numHalfMoves ? + tenth_str(ml[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 */ +PUBLIC int style12(game_state_t *b, 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 (garray[b->gameNum].numHalfMoves) { + sprintf(tmp, "%d ", + ml[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), + (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 + 1, + garray[b->gameNum].white_name, + garray[b->gameNum].black_name, + myTurn, + garray[b->gameNum].wInitTime / 600, + garray[b->gameNum].wIncrement / 10, + ws, + bs, + (wTime + 5) / 10, + (bTime + 5) / 10, + garray[b->gameNum].numHalfMoves / 2 + 1, + garray[b->gameNum].numHalfMoves ? + ml[garray[b->gameNum].numHalfMoves - 1].moveString : + "none", + garray[b->gameNum].numHalfMoves ? + tenth_str(ml[garray[b->gameNum].numHalfMoves - 1].tookTime, 0) : + "0:00", + garray[b->gameNum].numHalfMoves ? + ml[garray[b->gameNum].numHalfMoves - 1].algString : + "none", (orient == WHITE) ? 0 : 1); + + strcat(bstring, tmp); + return 0; +} + +PUBLIC int board_read_file(char *category, char *gname, game_state_t *gs) +{ + int f, r; + FILE *fp; + char fname[MAX_FILENAME_SIZE + 1]; + int c; + int onNewLine = 1; + int onColor = -1; + int onPiece = -1; + int onFile = -1; + int onRank = -1; + + sprintf(fname, "%s/%s/%s", board_dir, category, gname); + fp = fopen(fname, "r"); + if (!fp) + return 1; + + for (f = 0; f < 8; f++) + for (r = 0; r < 8; r++) + gs->board[f][r] = NOPIECE; + 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-1] = 0; + } + gs->wkmoved = gs->wqrmoved = gs->wkrmoved = 0; + gs->bkmoved = gs->bqrmoved = gs->bkrmoved = 0; + gs->onMove = -1; + gs->moveNum = 1; + gs->lastIrreversable = -1; + 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) + +PRIVATE 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 = rand() % 8; + } else { + f = (rand() % 4) * 2; + if (SquareColor(f, r) != squareColor) + f++; + } + if ((b)[f][r] == NOPIECE) { + (b)[f][r] = piece; + placed = 1; + } + } +} + +PUBLIC 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 (rand() & 0x01) { + b[4][0] = W_KING; + b[3][0] = W_QUEEN; + } else { + b[3][0] = W_KING; + b[4][0] = W_QUEEN; + } + if (rand() & 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] = (rand() % 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] = (rand() % 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; + char fname[MAX_FILENAME_SIZE + 1]; + int onPiece; + + sprintf(fname, "%s/wild/%d", board_dir, style); + fp = fopen(fname, "w"); + if (!fp) { + fprintf(stderr, "FICS: Can't write file name %s\n", fname); + 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); + } +} + +PUBLIC void wild_init() +{ + wild_update(1); + wild_update(2); + wild_update(3); + wild_update(4); +} diff --git a/FICS/board.h b/FICS/board.h new file mode 100644 index 0000000..5db4fb9 --- /dev/null +++ b/FICS/board.h @@ -0,0 +1,123 @@ +/* board.h + * + */ + +/* + 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 + (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. +*/ + +/* Revision history: + name email yy/mm/dd Change + Richard Nash 93/10/22 Created +*/ + +#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 are indexes into an array so their values are not arbitrary */ +#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]; + +typedef struct _game_state_t { + board_t board; + /* 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; +} game_state_t; + +#define ALG_DROP -2 + +/* bughouse: if a drop move, then fromFile is ALG_DROP and fromRank is piece */ + +typedef 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]; + char algString[8]; + unsigned char FENpos[74]; /* This replaces the boardList. */ + unsigned atTime; + unsigned tookTime; +} move_t; + +#define MoveToHalfMove( gs ) ((((gs)->moveNum - 1) * 2) + (((gs)->onMove == WHITE) ? 0 : 1)) + +extern char *wpstring[]; +extern char *bpstring[]; + +extern int board_init(game_state_t *, char *, char *); +extern void board_calc_strength(game_state_t *, int *, int *); +extern void update_holding(int, int); +extern char *board_to_string(char *, char *, int, int, game_state_t *, move_t *, int, int, int, int); +extern char *move_and_time(move_t *); +extern int board_read_file(char *, char *, game_state_t *); +extern void wild_update(int); +extern void wild_init(void); + +extern int fgetc(); + +#endif diff --git a/FICS/channel.c b/FICS/channel.c new file mode 100644 index 0000000..8ada4b9 --- /dev/null +++ b/FICS/channel.c @@ -0,0 +1,101 @@ +/* channel.c + * + */ + +/* THIS SOURCE FILE IS NOW OBSOLETE - DAV */ + +/* + 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 + (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. +*/ + +/* Revision history: + name email yy/mm/dd Change + Richard Nash 93/10/22 Created +*/ + +#include "stdinclude.h" + +#include "common.h" +#include "channel.h" +#include "network.h" +#include "rmalloc.h" +#include "playerdb.h" + +#if 0 /* ARGH!!! 256 * 256 * 4 = 256K! */ +/* old cheesy (as loon would put it :) ) code removed */ +PUBLIC int *channels[MAX_CHANNELS]; +PUBLIC int numOn[MAX_CHANNELS]; + +PUBLIC void channel_init() +{ + int i; + for (i = 0; i < MAX_CHANNELS; i++) { + channels[i] = rmalloc(max_connections * sizeof(int)); + numOn[i] = 0; + } +} + +PUBLIC int on_channel(int ch, int p) +{ + int i; + + for (i = 0; i < numOn[ch]; i++) + if (p == channels[ch][i]) + return 1; + return 0; +} + +PUBLIC int channel_remove(int ch, int p) +{ + int i, found; + + found = -1; + for (i = 0; i < numOn[ch] && found < 0; i++) + if (p == channels[ch][i]) + found = i; + if (found < 0) + return 1; + for (i = found; i < numOn[ch] - 1; i++) + channels[ch][i] = channels[ch][i + 1]; + numOn[ch] = numOn[ch] - 1; + --parray[p].nochannels; + return 0; +} + +PUBLIC int channel_add(int ch, int p) +{ + if (numOn[ch] >= MAX_CHANNELS) + return 1; + if (on_channel(ch, p)) + return 2; + if ((parray[p].nochannels == MAX_INCHANNELS) && (parray[p].adminLevel == 0)) { + return 3; + } + channels[ch][numOn[ch]] = p; + numOn[ch]++; + parray[p].nochannels++; + return 0; +} + +/* this piece of replacement code appears in talkproc.c */ +PUBLIC 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,ch ) /* since needs ch converted to a string keep + hidden from view */ +} + +#endif diff --git a/FICS/channel.h b/FICS/channel.h new file mode 100644 index 0000000..9de4808 --- /dev/null +++ b/FICS/channel.h @@ -0,0 +1,40 @@ +/* channel.h + * + */ + +/* THIS SOURCE FILE IS NOW OBSOLETE - DAV */ + +/* + 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 + (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. +*/ + +/* Revision history: + name email yy/mm/dd Change + Richard Nash 93/10/22 Created +*/ + +#ifndef _CHANNEL_H +#define _CHANNEL_H + +#define MAX_CHANNELS 256 + +extern int *channels[MAX_CHANNELS]; +extern int numOn[MAX_CHANNELS]; + +extern void channel_init(void); +extern int on_channel(int, int); +extern int channel_remove(int, int); +extern int channel_add(int, int); + +#endif /* _CHANNEL_H */ diff --git a/FICS/command.c b/FICS/command.c new file mode 100644 index 0000000..a53f305 --- /dev/null +++ b/FICS/command.c @@ -0,0 +1,1080 @@ +/* command.c + * + */ + +/* + 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 + (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. +*/ + +/* Revision history: + name email yy/mm/dd Change + Richard Nash 93/10/22 Created +*/ + +#include "stdinclude.h" + +#include "common.h" +#include "rmalloc.h" +#include "command.h" +#include "command_list.h" +#include "movecheck.h" +#include "ficsmain.h" +#include "config.h" +#include "utils.h" +#include "playerdb.h" +#include "gamedb.h" +#include "gameproc.h" +#include "obsproc.h" +#include "ratings.h" +#include "vers.h" +#include "network.h" +#include "shutdown.h" +#include +#ifdef TIMESEAL +#include "timeseal.h" +#endif +/*#include "hostinfo.h" */ + +PUBLIC char *mess_dir = DEFAULT_MESS; +PUBLIC char *index_dir = DEFAULT_INDEX; +PUBLIC char *help_dir[NUM_LANGS] = {DEFAULT_HELP, HELP_SPANISH, HELP_FRENCH, HELP_DANISH}; +PUBLIC char *comhelp_dir = DEFAULT_COMHELP; +PUBLIC char *info_dir = DEFAULT_INFO; +PUBLIC char *adhelp_dir = DEFAULT_ADHELP; +PUBLIC char *uscf_dir = DEFAULT_USCF; +PUBLIC char *stats_dir = DEFAULT_STATS; +PUBLIC char *player_dir = DEFAULT_PLAYERS; +PUBLIC char *adj_dir = DEFAULT_ADJOURNED; +PUBLIC char *hist_dir = DEFAULT_HISTORY; +PUBLIC char *journal_dir = DEFAULT_JOURNAL; +PUBLIC char *board_dir = DEFAULT_BOARDS; +PUBLIC char *def_prompt = DEFAULT_PROMPT; +PUBLIC char *source_dir = DEFAULT_SOURCE; +PUBLIC char *lists_dir = DEFAULT_LISTS; +PUBLIC char *news_dir = DEFAULT_NEWS; +PUBLIC char *usage_dir[NUM_LANGS] = {DEFAULT_USAGE, USAGE_SPANISH, USAGE_FRENCH, USAGE_DANISH}; + +PUBLIC char *hadmin_handle = HADMINHANDLE; +char *hadmin_email = HADMINEMAIL; +char *reg_addr = REGMAIL; + +PUBLIC int startuptime; +PUBLIC char fics_hostname[81]; +PUBLIC int player_high; +PUBLIC int game_high; +PUBLIC int MailGameResult; + +PUBLIC int commanding_player = -1; /* The player whose command your in */ + +PRIVATE int lastCommandFound = -1; + +/* grimm */ +int player_notify_departure(int p); +/* added for warnings */ + +/* Copies command into comm, and returns pointer to parameters in + * parameters + */ +PRIVATE 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; +} + +PUBLIC int alias_lookup(char *tmp, alias_type *alias_list, int numalias) +/* numalias is the maximum number to search through */ +{ + int i; + + for (i = 0; (alias_list[i].comm_name && i < numalias); i++) { + if (!strcmp(tmp, alias_list[i].comm_name)) + return i; + } + return -1; /* not found */ +} + +PUBLIC int alias_count(alias_type *alias_list) +{ + int i; + + for (i = 0; alias_list[i].comm_name; i++); + return i; +} + + +/* Puts alias substitution into alias_string */ +PRIVATE void alias_substitute(alias_type *alias_list, int num_alias, + char *com_str, char outalias[]) +{ + char *s = com_str; + char name[MAX_COM_LENGTH]; + char *t = name; + int i = 0; + char *atpos, *aliasval; + + /* Get first word of command, terminated by whitespace or by containing + punctuation */ + while (*s && !iswhitespace(*s)) { + if (i++ >= MAX_COM_LENGTH) { + strcpy(outalias, com_str); + return; + } + if (ispunct(*t++ = *s++)) + break; + } + *t = '\0'; + if (*s && iswhitespace(*s)) + s++; + + i = alias_lookup(name, alias_list, num_alias); + if (i < 0) { + strcpy(outalias, com_str); + return; + } + aliasval = alias_list[i].alias; + + /* See if alias contains an @ */ + atpos = strchr(aliasval, '@'); + if (atpos != NULL) { + strncpy(outalias, aliasval, atpos - aliasval); + outalias[atpos - aliasval] = '\0'; + strcat(outalias, s); + strcat(outalias, atpos + 1); + } else { + strcpy(outalias, aliasval); + if (*s) { + strcat(outalias, " "); + strcat(outalias, s); + } + } +} + +/* Returns pointer to command that matches */ +PRIVATE 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) + && parray[p].adminLevel >= command_list[i].adminLevel) { + if (gotIt >= 0) + return -COM_AMBIGUOUS; + gotIt = i; + } + i++; + } + 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; + } + if (gotIt >= 0) { + lastCommandFound = gotIt; + return gotIt; + } + return -COM_FAILED; +} + +/* Gets the parameters for this command */ +PRIVATE 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 && iswhitespace(*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 && iswhitespace(*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; +} + +PRIVATE void printusage(int p, char *command_str) +{ + int i, parlen, UseLang = parray[p].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 */ + } + 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 'help %s' for a complete description.\n", command_list[lastCommandFound].comm_name); +} + +PUBLIC int process_command(int p, char *com_string, char **cmd) +{ + int which_command, retval; + param_list params; + static char alias_string1[MAX_STRING_LENGTH * 4], alias_string2[MAX_STRING_LENGTH * 4]; + char *comm, *parameters; + +#ifdef DEBUG + if (strcasecmp(parray[p].name, parray[p].login)) { + fprintf(stderr, "FICS: PROBLEM Name=%s, Login=%s\n", parray[p].name, parray[p].login); + } +#endif + if (!com_string) + return COM_FAILED; +#ifdef DEBUG + fprintf(stderr, "%s, %s, %d: >%s<\n", parray[p].name, parray[p].login, parray[p].socket, com_string); +#endif + alias_substitute(parray[p].alias_list, parray[p].numAlias, + com_string, alias_string1); + alias_substitute(g_alias_list, 999, + alias_string1, alias_string2); +#ifdef DEBUG + if (strcmp(com_string, alias_string2) != 0) + fprintf(stderr, "%s -alias-: >%s<\n", parray[p].name, alias_string2); +#endif + if ((retval = parse_command(alias_string2, &comm, ¶meters))) + return retval; + if (is_move(comm)) + return COM_ISMOVE; + stolower(comm); /* All commands are case-insensitive */ + *cmd = comm; + if ((which_command = match_command(comm, p)) < 0) + return -which_command; + if (parray[p].adminLevel < command_list[which_command].adminLevel) { + return COM_RIGHTS; + } + if ((retval = get_parameters(which_command, parameters, params))) + return retval; + return command_list[which_command].comm_func(p, params); +} + +PRIVATE int process_login(int p, char *loginname) +{ + int problem = 1; + + loginname = eatwhite(loginname); + + if (!*loginname) { /* do something in here? */ + } else { + char *loginnameii = strdup(loginname); + stolower(loginname); + if (!alphastring(loginname)) { + pprintf(p, "\nSorry, names can only consist of lower and upper case letters. Try again.\n"); + } else if (strlen(loginname) < 3) { + pprintf(p, "\nA name should be at least three characters long! Try again.\n"); + } else if (strlen(loginname) > 17) { + pprintf(p, "\nSorry, names may be at most 17 characters long. Try again.\n"); + } else if (in_list(p, L_BAN, loginnameii)) { + pprintf(p, "\nPlayer \"%s\" is banned.\n", loginname); + rfree(loginnameii); + return COM_LOGOUT; + } else if ((!in_list(p, L_ADMIN, loginnameii)) && (player_count(0) >= max_connections - 10)) { + psend_raw_file(p, mess_dir, MESS_FULL); + rfree(loginnameii); + return COM_LOGOUT; + } else { + problem = 0; + if (player_read(p, loginname)) { + strcpy(parray[p].name, loginnameii); + if (in_list(p, L_FILTER, dotQuad(parray[p].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", reg_addr); + 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"); + rfree(loginnameii); + return COM_LOGOUT; + } + if ((player_count(0)) >= MAX(max_connections - 60, 200)) { + psend_raw_file(p, mess_dir, MESS_FULL_UNREG); + rfree(loginnameii); + return COM_LOGOUT; + } + pprintf_noformat(p, "\n\"%s\" is not a registered name. You may use this name to play unrated games.\n(After logging in, do \"help register\" for more info on how to register.)\n\nPress return to enter the FICS as \"%s\":", + parray[p].name, parray[p].name); + } else { + 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: ", parray[p].name); + } + parray[p].status = PLAYER_PASSWORD; + turn_echo_off(parray[p].socket); + rfree(loginnameii); + if (strcasecmp(loginname, parray[p].name)) { + pprintf(p, "\nYou've got a bad name field in your playerfile -- please report this to an admin!\n"); + rfree(loginnameii); + return COM_LOGOUT; + } + if ((parray[p].adminLevel != 0) && (!in_list(p, L_ADMIN, parray[p].name))) { + pprintf(p, "\nYou've got a bad playerfile -- please report this to an admin!\n"); + pprintf(p, "Your handle is missing!"); + pprintf(p, "Please log on as an unreg until an admin can correct this.\n"); + rfree(loginnameii); + return COM_LOGOUT; + } + if ((parray[p].registered) && (parray[p].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"); + rfree(loginnameii); + return COM_LOGOUT; + } + if ((parray[p].registered) && (parray[p].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"); + rfree(loginnameii); + return COM_LOGOUT; + } + } + } + + if (problem) { + psend_raw_file(p, mess_dir, MESS_LOGIN); + pprintf(p, "login: "); + } + return 0; +} + +void boot_out(int p, int p1) +{ + int fd; + pprintf(p, "\n **** %s is already logged in - kicking them out. ****\n", parray[p].name); + pprintf(p1, "**** %s has arrived - you can't both be logged in. ****\n", parray[p].name); + fd = parray[p1].socket; + process_disconnection(fd); + net_close_connection(fd); +} + +PUBLIC void rscan_news(FILE *fp, int p, int lc) { + + char junk[MAX_LINE_SIZE], count[10]; + int crtime; + char *junkp; + + fgets(junk, MAX_LINE_SIZE, fp); + if (feof(fp)) + return; + sscanf(junk, "%d %s", &crtime, count); + + if (crtime - lc < 0) + return; + else { + rscan_news(fp, p, lc); + junkp = junk; + junkp = nextword(junkp); + junkp = nextword(junkp); + pprintf(p, "%3s (%s) %s", count, fix_time(strltime(&crtime)), junkp); + } +} + +PRIVATE void check_news(int p, int admin) +{ + FILE *fp; + char filename[MAX_FILENAME_SIZE]; + char junk[MAX_LINE_SIZE]; + char *junkp; + int crtime; + int lc = player_lastconnect(p); + char count[10]; + + if (admin) { + + sprintf(filename, "%s/newadminnews.index", news_dir); + fp = fopen(filename, "r"); + if (!fp) { + fprintf(stderr, "Can't find admin news index.\n"); + return; + } + + if (num_anews == -1) { + num_anews = count_lines(fp); + fclose(fp); + fp = fopen(filename, "r"); + } + + fgets(junk, MAX_LINE_SIZE, fp); + sscanf(junk, "%d %s", &crtime, count); + if ((crtime - lc) < 0) { + pprintf(p, "There are no new admin news items since your last login.\n\n"); + fclose(fp); + return; + } else { + pprintf(p, "Index of new admin news items:\n"); + rscan_news(fp, p, lc); + junkp = junk; + junkp = nextword(junkp); + junkp = nextword(junkp); + pprintf(p, "%3s (%s) %s", count, fix_time(strltime(&crtime)), junkp); + pprintf(p, "(\"anews %d\" will display the most recent admin news file)\n", num_anews); + } + + } else { + + sprintf(filename, "%s/newnews.index", news_dir); + fp = fopen(filename, "r"); + if (!fp) { + fprintf(stderr, "Can't find news index.\n"); + return; + } + + if (num_news == -1) { + num_news = count_lines(fp); + fclose(fp); + fp = fopen(filename, "r"); + } + + fgets(junk, MAX_LINE_SIZE, fp); + sscanf(junk, "%d %s", &crtime, count); + if ((crtime - lc) < 0) { + pprintf(p, "There are no new news items since your last login (%s).\n", strltime(&lc)); + fclose(fp); + return; + } else { + pprintf(p, "Index of new news items:\n"); + rscan_news(fp, p, lc); + junkp = junk; + junkp = nextword(junkp); + junkp = nextword(junkp); + pprintf(p, "%3s (%s) %s", count, fix_time(strltime(&crtime)), junkp); + pprintf(p, "(\"news %d\" will display the most recent admin news file)\n", num_news); + } + } + + fclose(fp); +} + +PRIVATE int process_password(int p, char *password) +{ + int p1; + char salt[3]; + int fd; + unsigned int fromHost; + int messnum; +/* + struct hostent *hp; +*/ + int dummy; /* (to hold a return value) */ + + turn_echo_on(parray[p].socket); + +/* if (password[0] == '\n') { + parray[p].status = PLAYER_LOGIN; + return 0; + }*/ + + if (parray[p].passwd && parray[p].registered) { + salt[0] = parray[p].passwd[0]; + salt[1] = parray[p].passwd[1]; + salt[2] = '\0'; + if (strcmp(crypt(password, salt), parray[p].passwd)) { + fd = parray[p].socket; + fromHost = parray[p].thisHost; + player_clear(p); + parray[p].logon_time = parray[p].last_command_time = time(0); + parray[p].status = PLAYER_LOGIN; + parray[p].socket = fd; + parray[p].thisHost = fromHost; + if (*password) + pprintf(p, "\n\n**** Invalid password! ****\n\n"); + return COM_LOGOUT; + } + } + for (p1 = 0; p1 < p_num; p1++) { + if (parray[p1].name != NULL) { + if ((!strcasecmp(parray[p].name, parray[p1].name)) && (p != p1)) { + if (parray[p].registered == 0) { + pprintf(p, "\n*** Sorry %s is already logged in ***\n", parray[p].name); + return COM_LOGOUT; + } + boot_out(p, p1); + } + } + } + if (parray[p].adminLevel > 0) { + psend_raw_file(p, mess_dir, MESS_ADMOTD); + } else { + psend_raw_file(p, mess_dir, MESS_MOTD); + } + if (!parray[p].passwd && parray[p].registered) + pprintf(p, "\n*** You have no password. Please set one with the password command."); + if (!parray[p].registered) + psend_raw_file(p, mess_dir, MESS_UNREGISTERED); + parray[p].status = PLAYER_PROMPT; + player_write_login(p); + for (p1 = 0; p1 < p_num; p1++) { + if (p1 == p) + continue; + if (parray[p1].status != PLAYER_PROMPT) + continue; +#if 0 /* deleted by mann */ + if (parray[p1].thisHost == parray[p].thisHost) { + fprintf(stderr, "FICS: Players %s and %s - same host: %s\n", + parray[p].name, parray[p1].name, dotQuad(parray[p].thisHost)); + } +#endif + if (!parray[p1].i_login) + continue; + if (parray[p1].adminLevel > 0) { +/* + hp = gethostbyaddr((const char*)&(parray[p].thisHost), sizeof(parray[p].thisHost), AF_INET); +*/ + pprintf_prompt(p1, "\n[%s (%s: %s) has connected.]\n", parray[p].name, + (parray[p].registered ? "R" : "U"), + dotQuad(parray[p].thisHost)); + } else { + pprintf_prompt(p1, "\n[%s has connected.]\n", parray[p].name); + } + } + parray[p].num_comments = player_num_comments(p); + messnum = player_num_messages(p); + +/* loon: don't send unreg any news. when you change this, feel free to + put all the news junk in one source file:) no reason for identical code + in command.c and comproc.c */ + if (parray[p].registered) { + check_news(p, 0); + if (parray[p].adminLevel > 0) { + pprintf(p, "\n"); + check_news(p, 1); + } + } + if (messnum) { + 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 (parray[p].registered && (parray[p].lastHost != 0) && + (parray[p].lastHost != parray[p].thisHost)) { +#if 0 /* removed by DAV - we don't need to know this rubbish */ + fprintf(stderr, "FICS: Player %s: Last login: %s ", parray[p].name, + dotQuad(parray[p].lastHost)); + fprintf(stderr, "This login: %s\n", dotQuad(parray[p].thisHost)); +#endif + pprintf(p, "\nPlayer %s: Last login: %s ", parray[p].name, + dotQuad(parray[p].lastHost)); + pprintf(p, "This login: %s", dotQuad(parray[p].thisHost)); + } + parray[p].lastHost = parray[p].thisHost; + if (parray[p].registered && !parray[p].timeOfReg) + parray[p].timeOfReg = time(0); + parray[p].logon_time = parray[p].last_command_time = time(0); + dummy = check_and_print_shutdown(p); /*Tells the user if we are going to shutdown */ + pprintf(p, "\n%s", parray[p].prompt); + return 0; +} + +PRIVATE int process_prompt(int p, char *command) +{ + int retval; + char *cmd = ""; + + command = eattailwhite(eatwhite(command)); + if (!*command) { + pprintf(p, "%s", parray[p].prompt); + return COM_OK; + } + retval = process_command(p, command, &cmd); + switch (retval) { + case COM_OK: + retval = COM_OK; + pprintf(p, "%s", parray[p].prompt); + break; + case COM_OK_NOPROMPT: + retval = COM_OK; + break; + case COM_ISMOVE: + retval = COM_OK; + +#ifdef TIMESEAL + if (parray[p].game >= 0 && garray[parray[p].game].status == GAME_ACTIVE + && parray[p].side == garray[parray[p].game].game_state.onMove + && garray[parray[p].game].flag_pending != FLAG_NONE) { + ExecuteFlagCmd(parray[p].game, con[parray[p].socket].time); + } +#endif + process_move(p, command); + pprintf(p, "%s", parray[p].prompt); + + break; + case COM_RIGHTS: + pprintf(p, "%s: Insufficient rights.\n", cmd); + pprintf(p, "%s", parray[p].prompt); + 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)) && + (parray[p].adminLevel >= command_list[i].adminLevel)) { + pprintf(p, " %s", command_list[i].comm_name); + } + i++; + } + } + pprintf(p, "\n%s", parray[p].prompt); + retval = COM_OK; + break; + case COM_BADPARAMETERS: + printusage(p, command_list[lastCommandFound].comm_name); + pprintf(p, "%s", parray[p].prompt); + retval = COM_OK; + break; + case COM_FAILED: + case COM_BADCOMMAND: + pprintf(p, "%s: Command not found.\n", cmd); + retval = COM_OK; + pprintf(p, "%s", parray[p].prompt); + break; + case COM_LOGOUT: + retval = COM_LOGOUT; + break; + } + return retval; +} + +/* Return 1 to disconnect */ +PUBLIC int process_input(int fd, char *com_string) +{ + int p = player_find(fd); + int retval = 0; + + if (p < 0) { + fprintf(stderr, "FICS: Input from a player not in array!\n"); + return -1; + } + + commanding_player = p; + parray[p].last_command_time = time(0); + + switch (parray[p].status) { + case PLAYER_EMPTY: + fprintf(stderr, "FICS: Command from an empty player!\n"); + break; + case PLAYER_NEW: + fprintf(stderr, "FICS: 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) + fprintf (stderr, "%s tried to log in and failed.\n", com_string); + break; + case PLAYER_PASSWORD: + retval = process_password(p, com_string); + break; + case PLAYER_PROMPT: + parray[p].busy[0] = '\0'; + /* added this to stop buggy admin levels; shane */ + if (parray[p].adminLevel < 10) + parray[p].adminLevel = 0; + retval = process_prompt(p, com_string); + break; + } + + commanding_player = -1; + return retval; +} + +PUBLIC int process_new_connection(int fd, unsigned int fromHost) +{ + int p = player_new(); + + parray[p].status = PLAYER_LOGIN; + parray[p].socket = fd; + parray[p].thisHost = fromHost; + parray[p].logon_time = time(0); + psend_raw_file(p, mess_dir, MESS_WELCOME); + pprintf(p, "Head admin : %s Complaints to : %s\n", hadmin_handle, hadmin_email); + pprintf(p, "Server location: %s Server version : %s\n", fics_hostname, VERS_NUM); + psend_raw_file(p, mess_dir, MESS_LOGIN); + pprintf(p, "login: "); + return 0; +} + +PUBLIC int process_disconnection(int fd) +{ + int p = player_find(fd); + int p1; + + if (p < 0) { + fprintf(stderr, "FICS: Disconnect from a player not in array!\n"); + return -1; + } + if ((parray[p].game >=0) &&(garray[parray[p].game].status == GAME_EXAMINE)) { + pcommand(p, "unexamine"); + } + if ((parray[p].game >=0) &&in_list(p, L_ABUSER, parray[p].name)) { + pcommand(p, "resign"); + } + if (parray[p].status == PLAYER_PROMPT) { + for (p1 = 0; p1 < p_num; p1++) { + if (p1 == p) + continue; + if (parray[p1].status != PLAYER_PROMPT) + continue; + if (!parray[p1].i_login) + continue; + pprintf_prompt(p1, "\n[%s has disconnected.]\n", parray[p].name); + } + player_notify(p, "departed", "departure"); + player_notify_departure(p); + player_write_logout(p); + if (parray[p].registered) { + parray[p].totalTime += time(0) - parray[p].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, parray[p].login[0], parray[p].login); + unlink(fname); + } + } + player_remove(p); + return 0; +} + +/* Called every few seconds */ +PUBLIC int process_heartbeat(int *fd) +{ + static int last_space = 0; + static int last_comfile = 0; +/* static int last_ratings = 0; */ + static int lastcalled = 0; + int time_since_last; + int p; +/* static int rpid = 0; */ + int now = time(0); + +/* game_update_times(); */ + + if (lastcalled == 0) + time_since_last = 0; + else + time_since_last = now - lastcalled; + lastcalled = now; + + /* Check for timed out connections */ + for (p = 0; p < p_num; p++) { + if (((parray[p].status == PLAYER_LOGIN) || + (parray[p].status == PLAYER_PASSWORD)) && + (player_idle(p) > MAX_LOGIN_IDLE)) { + pprintf(p, "\n**** LOGIN TIMEOUT ****\n"); + *fd = parray[p].socket; + return COM_LOGOUT; + } + if ((parray[p].status == PLAYER_PROMPT) && + (player_idle(p) > MAX_IDLE_TIME) && + (parray[p].adminLevel == 0) && + (!in_list(p, L_TD, parray[p].name))) { + pprintf(p, "\n**** Auto-logout because you were idle " + "more than one hour. ****\n"); + *fd = parray[p].socket; + return COM_LOGOUT; + } + } +/* loon: turning this fork off temporarily (28 Oct) for lag */ +#if 0 + if (rpid) { /* Rating calculating going on */ + int statusp; + + if (wait3(&statusp, WNOHANG, NULL) == rpid) { + fprintf(stderr, "FICS: Reinitting statistics.\n"); + rating_init(); /* Child finished, get the results. */ + rpid = 0; + } + } + /* Recalc ratings every 3 hours */ + /* This is done because the ratings stats and players can get out of sync + if there is a system crash. */ + /* This is done as a child process and read results when complete */ + if (last_ratings == 0) + last_ratings = (now - (5 * 60 * 60)) + 120; /* Do one in 2 minutes */ + else { + if (last_ratings + 6 * 60 * 60 < now) { + last_ratings = now; + rpid = fork(); + if (rpid < 0) { + fprintf(stderr, "FICS: Couldn't fork\n"); + } else { + if (rpid == 0) { /* The child */ + rating_recalc(); + exit(0); + fprintf(stderr, "Recalc process should never get here!\n"); + ASSERT(0); + } + } + } + } +#endif + /* Check for the communication file from mail updates every 10 minutes */ + /* That is probably too often, but who cares */ + if (MailGameResult) { + if (last_comfile == 0) + last_comfile = now; + else { + if (last_comfile + 10 * 60 < now) { + last_comfile = now; + /* Check for com file */ +/* hostinfo_checkcomfile(); */ + } + } + } + if (last_space == 0) + last_space = now; + else { + if (last_space + 60 < now) {/* Check the disk space every minute */ + last_space = now; + if (available_space() < 1000000) { + server_shutdown(60, " **** Disk space is dangerously low!!! ****\n"); + } + /* Check for com file */ + /* hostinfo_checkcomfile(); */ + } + } + ShutHeartBeat(); + return COM_OK; +} + +PUBLIC void commands_init() +{ + FILE *fp, *afp; + char fname[MAX_FILENAME_SIZE]; + int i = 0; + + sprintf(fname, "%s/commands", comhelp_dir); + fp = fopen(fname, "w"); + if (!fp) { + fprintf(stderr, "FICS: Could not write commands help file.\n"); + return; + } + sprintf(fname, "%s/admin_commands", adhelp_dir); + afp = fopen(fname, "w"); + if (!afp) { + fprintf(stderr, "FICS: 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, "%s\n", command_list[i].comm_name); + } else { + fprintf(fp, "%s\n", command_list[i].comm_name); + } + i++; + } + fclose(fp); + fclose(afp); +} + +/* Need to save rated games */ +PUBLIC void TerminateCleanup() +{ + int p1; + int g; + + for (g = 0; g < g_num; g++) { + if (garray[g].status != GAME_ACTIVE) + continue; + if (garray[g].rated) { + game_ended(g, WHITE, END_ADJOURN); + } + } + for (p1 = 0; p1 < p_num; p1++) { + if (parray[p1].status == PLAYER_EMPTY) + continue; + pprintf(p1, "\n **** Server shutting down immediately. ****\n\n"); + if (parray[p1].status != PLAYER_PROMPT) { + close(parray[p1].socket); + } else { + pprintf(p1, "Logging you out.\n"); + psend_raw_file(p1, mess_dir, MESS_LOGOUT); + player_write_logout(p1); + if (parray[p1].registered) + parray[p1].totalTime += time(0) - parray[p1].logon_time; + player_save(p1); + } + } +} diff --git a/FICS/command.h b/FICS/command.h new file mode 100644 index 0000000..c4e5648 --- /dev/null +++ b/FICS/command.h @@ -0,0 +1,140 @@ +/* command.h + * + */ + +/* + 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 + (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. +*/ + +/* Revision history: + name email yy/mm/dd Change + Richard Nash 93/10/22 Created +*/ + +#ifndef _COMMAND_H +#define _COMMAND_H + +#include "variable.h" +#include "stdinclude.h" + +extern char *mess_dir; +extern char *index_dir; +extern char *help_dir[NUM_LANGS]; +extern char *comhelp_dir; +extern char *info_dir; +extern char *adhelp_dir; +extern char *uscf_dir; +extern char *stats_dir; +extern char *config_dir; +extern char *player_dir; +extern char *adj_dir; +extern char *hist_dir; +extern char *journal_dir; +extern char *board_dir; +extern char *def_prompt; +extern char *source_dir; +extern char *lists_dir; +extern char *news_dir; +extern char *usage_dir[NUM_LANGS]; + +extern char *hadmin_handle; + +extern int startuptime; +extern char fics_hostname[81]; +extern int player_high; +extern int game_high; +extern int MailGameResult; + +/* Maximum length of a login name */ +#define MAX_LOGIN_NAME 20 + +/* 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 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_NULL NULL <-- this is WRONG WRONG WRONG! --mann 5/10/95 */ +#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 s_command_type { + char *comm_name; + char *param_string; + int (*comm_func)(); + int adminLevel; +} command_type; + +typedef struct s_alias_type { + char *comm_name; + char *alias; +} alias_type; + +extern int commanding_player; /* The player whose command you're in */ + +extern int process_input(int, char *); +extern int process_new_connection(int, unsigned int); +extern int process_disconnection(int); +/* extern int process_incomplete(int, char *); */ +extern int process_heartbeat(int *); + +extern void commands_init(void); + +extern void TerminateCleanup(void); +extern int process_command(int, char *, char **); + + +extern int alias_lookup(); +extern int gethostname(); + +#if defined(SGI) || defined(NETBSD) +#else +extern int wait3(); +/* extern char tolower(); */ +/* extern int sscanf(); */ +#endif + +#endif /* _COMMAND_H */ diff --git a/FICS/command.h.orig b/FICS/command.h.orig new file mode 100644 index 0000000..1d5d47f --- /dev/null +++ b/FICS/command.h.orig @@ -0,0 +1,135 @@ +/* command.h + * + */ + +/* + 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 + (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. +*/ + +/* Revision history: + name email yy/mm/dd Change + Richard Nash 93/10/22 Created +*/ + +#include "variable.h" +#ifndef _COMMAND_H +#define _COMMAND_H + +extern char *mess_dir; +extern char *index_dir; +extern char *help_dir[NUM_LANGS]; +extern char *comhelp_dir; +extern char *info_dir; +extern char *adhelp_dir; +extern char *stats_dir; +extern char *config_dir; +extern char *player_dir; +extern char *adj_dir; +extern char *hist_dir; +extern char *board_dir; +extern char *def_prompt; +extern char *source_dir; +extern char *lists_dir; +extern char *news_dir; + +extern char *hadmin_handle; + +extern int startuptime; +extern char fics_hostname[81]; +extern int player_high; +extern int game_high; +extern int MailGameResult; + +/* Maximum length of a login name */ +#define MAX_LOGIN_NAME 20 + +/* 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 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_NULL NULL <-- this is WRONG WRONG WRONG! --mann 5/10/95 */ +#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 s_command_type { + char *comm_name; + char *param_string; + int (*comm_func)(); + int adminLevel; +} command_type; + +typedef struct s_alias_type { + char *comm_name; + char *alias; +} alias_type; + +extern int commanding_player; /* The player whose command you're in */ + +extern int process_input(int, char *); +extern int process_new_connection(int, unsigned int); +extern int process_disconnection(int); +/* extern int process_incomplete(int, char *); */ +extern int process_heartbeat(int *); + +extern void commands_init(void); + +extern void TerminateCleanup(void); +extern int process_command(int, char *, char **); + + +extern int alias_lookup(); +extern int gethostname(); + +#if defined(SGI) +#else +extern int wait3(); +/* extern char tolower(); */ +/* extern int sscanf(); */ +#endif + +#endif /* _COMMAND_H */ diff --git a/FICS/command_list.h b/FICS/command_list.h new file mode 100644 index 0000000..104bf81 --- /dev/null +++ b/FICS/command_list.h @@ -0,0 +1,272 @@ +/* command_list.h + * + */ + +/* + 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 + (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. +*/ + +/* Revision history: + name email yy/mm/dd Change + Richard Nash 93/10/22 Created +*/ + +#ifndef _COMMAND_LIST_H +#define _COMMAND_LIST_H + +#include "comproc.h" +#include "matchproc.h" +#include "talkproc.h" +#include "lists.h" +#include "gameproc.h" +#include "obsproc.h" +#include "adminproc.h" +#include "playerdb.h" +#include "ratings.h" +#include "eco.h" +#include "rating_conv.h" +#include "shutdown.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, that is the way it is shown to + * the 'help commands' command. + */ + /* Name Options Functions Security */ +PUBLIC 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", "oo", com_assess, ADMIN_USER }, + {"backward", "p", com_backward, ADMIN_USER }, + {"bell", "", com_bell, ADMIN_USER }, + {"best", "o", com_best, ADMIN_USER }, + {"boards", "o", com_boards, ADMIN_USER }, +/* {"channel", "p", com_channel, ADMIN_USER }, */ + {"clearmessages", "n", com_clearmessages, ADMIN_USER }, + {"convert_bcf", "d", com_CONVERT_BCF, ADMIN_USER }, + {"convert_elo", "d", com_CONVERT_ELO, ADMIN_USER }, + {"convert_uscf", "d", com_CONVERT_USCF, 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", "o", com_stats, ADMIN_USER }, + {"flag", "", com_flag, ADMIN_USER }, + {"flip", "", com_flip, ADMIN_USER }, + {"forward", "p", com_forward, ADMIN_USER }, + {"games", "o", com_games, ADMIN_USER }, + {"getpi", "w", com_getpi, ADMIN_USER }, + {"goboard", "w", com_goboard, ADMIN_USER }, + {"gonum", "d", com_gonum, ADMIN_USER }, + {"handles", "w", com_handles, ADMIN_USER }, + {"hbest", "o", com_hbest, ADMIN_USER }, + {"help", "o", com_help, ADMIN_USER }, + {"history", "o", com_history, ADMIN_USER }, + {"hrank", "oo", com_hrank, ADMIN_USER }, + {"inchannel", "n", com_inchannel, ADMIN_USER }, + {"index", "o", com_index, ADMIN_USER }, + {"info", "", com_info, ADMIN_USER }, + {"it", "T", com_it, 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 }, +/* {"load", "ww", com_load, ADMIN_USER }, */ + {"logons", "o", com_logons, ADMIN_USER }, + {"mailhelp", "o", com_mailhelp, ADMIN_USER }, + {"mailmess", "", com_mailmess, ADMIN_USER }, + {"mailmoves", "n", com_mailmoves, ADMIN_USER }, + {"mailoldmoves", "o", com_mailoldmoves, ADMIN_USER }, + {"mailsource", "o", com_mailsource, ADMIN_USER }, + {"mailstored", "wi", com_mailstored, ADMIN_USER }, + {"match", "wt", com_match, 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 }, + {"pending", "", com_pending, ADMIN_USER }, + {"prefresh", "", com_prefresh, ADMIN_USER }, + {"promote", "w", com_promote, ADMIN_USER }, + {"ptell", "S", com_ptell, 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 }, + {"servers", "", com_servers, 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", "w", com_simmatch, ADMIN_USER }, + {"simnext", "", com_simnext, ADMIN_USER }, + {"simopen", "", com_simopen, ADMIN_USER }, + {"simpass", "", com_simpass, ADMIN_USER }, + {"simprev", "", com_simprev, 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 }, + {"time", "n", com_time, 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 }, + {"uscf", "o", com_uscf, 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 }, + {"xtell", "wS", com_xtell, ADMIN_USER }, + {"znotify", "", com_znotify, ADMIN_USER }, + + {"addcomment", "wS", com_addcomment, ADMIN_ADMIN }, + {"addplayer", "WWS", com_addplayer, ADMIN_ADMIN }, + {"adjudicate", "www", com_adjudicate, ADMIN_ADMIN }, + {"ahelp", "o", com_adhelp, ADMIN_ADMIN }, + {"admin", "", com_admin, ADMIN_ADMIN }, + {"anews", "o", com_anews, ADMIN_ADMIN }, + {"announce", "S", com_announce, ADMIN_ADMIN }, + {"annunreg", "S", com_annunreg, ADMIN_ADMIN }, + {"asetv", "wS", com_asetv, ADMIN_ADMIN }, + {"asetadmin", "wd", com_asetadmin, ADMIN_ADMIN }, + {"asetblitz", "wdpppp",com_asetblitz, 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 }, + {"chkip", "w", com_checkIP, ADMIN_ADMIN }, + {"chkgame", "i", com_checkGAME, ADMIN_ADMIN }, + {"chkpl", "w", com_checkPLAYER, ADMIN_ADMIN }, + {"chksc", "d", com_checkSOCKET, ADMIN_ADMIN }, + {"chkts", "", com_checkTIMESEAL, ADMIN_ADMIN }, + {"cmuzzle", "o", com_cmuzzle, ADMIN_ADMIN }, + {"cnewsi", "S", com_cnewsi, ADMIN_ADMIN }, + {"cnewsf", "dS", com_cnewsf, ADMIN_ADMIN }, + {"canewsi", "S", com_canewsi, ADMIN_ADMIN }, + {"canewsf", "dS", com_canewsf, ADMIN_ADMIN }, + {"muzzle", "o", com_muzzle, ADMIN_ADMIN }, + {"nuke", "w", com_nuke, ADMIN_ADMIN }, + {"pose", "wS", com_pose, ADMIN_GOD }, + {"asetmaxplayers", "p", com_asetmaxplayer, ADMIN_ADMIN }, + {"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} +}; + +PUBLIC alias_type g_alias_list[] = { + {"comment", "addcomment"}, + {"adhelp", "ahelp"}, + {"w", "who"}, + {"h", "help"}, + {"t", "tell"}, + {"m", "match"}, + {"go", "goboard"}, + {"goto", "goboard"}, + {"f", "finger"}, + {"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"}, + {"p", "who a"}, + {"pl", "who a"}, + {"o", "observe"}, + {"r", "refresh"}, + {"re", "refresh"}, /* So r/re doesn't resign! */ + {"ch", "channel"}, + {"cls", "help cls"}, + {"in", "inchannel"}, + {".", "tell ."}, + {",", "tell ,"}, + {"`", "tell ."}, + {"!", "shout"}, + {"I", "it"}, + {"i", "it"}, + {":", "it"}, + {"?", "help"}, + {"exit", "quit"}, + {"logout", "quit"}, + {"bye", "quit"}, + {"*", "kibitz"}, + {"#", "whisper"}, + {"ma", "match"}, + {"more", "next"}, + {"n", "next"}, + {"znotl", "znotify"}, + {"+", "addlist"}, + {"-", "sublist"}, + {"=", "showlist"}, + {NULL, NULL} +}; + +#endif /* _COMMAND_LIST_H */ diff --git a/FICS/common.h b/FICS/common.h new file mode 100644 index 0000000..b8afce6 --- /dev/null +++ b/FICS/common.h @@ -0,0 +1,56 @@ +/* + * File: common.h + * Copyright 1993, Richard V. Nash + */ + +/* + 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 + (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. +*/ + +/* Revision history: + name email yy/mm/dd Change + Richard Nash 93/10/22 Created +*/ + +#ifndef _COMMON_H +#define _COMMON_H + +#include "vers.h" +#include "legal.h" + +#define PUBLIC +#define PRIVATE static + +#ifndef NULL +#define NULL ((void *)0) +#endif + +#define SWAP(a,b,type) {\ + type tmp; \ + tmp = (a);\ + (a) = (b);\ + (b) = tmp;\ +} + +#ifdef DEBUG +#define ASSERT(expression) \ + while (((expression) ? 0 : \ + (fprintf (stderr, "Assertion failed: file %s, line %d.\n", \ + __FILE__, __LINE__), \ + abort (), 0))) +#else +#define ASSERT(expression) while(0) +#endif /* DEBUG */ + +#endif /* _COMMON_H */ diff --git a/FICS/comproc.c b/FICS/comproc.c new file mode 100644 index 0000000..b2d251c --- /dev/null +++ b/FICS/comproc.c @@ -0,0 +1,1638 @@ +/* comproc.c + * + */ + +/* + 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 + (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. +*/ + +/* Revision history: + name email yy/mm/dd Change + Richard Nash 93/10/22 Created + foxbat 95/03/11 added filters in cmatch. +*/ + +#include "stdinclude.h" + +#include "common.h" +#include "talkproc.h" +#include "comproc.h" +#include "command.h" +#include "utils.h" +#include "ficsmain.h" +#include "config.h" +#include "playerdb.h" +#include "network.h" +#include "rmalloc.h" +#include "variable.h" +#include "gamedb.h" +#include "gameproc.h" +#include "obsproc.h" +#include "board.h" +/* #include "hostinfo.h" */ +#include "multicol.h" +#include "ratings.h" +#include "formula.h" +#include "lists.h" +#include "eco.h" +#include "network.h" +#include + +#include + +/* grimm */ +#if defined(SGI) +#else +/* int system(char *arg); */ +#endif + +const none = 0; +const blitz_rat = 1; +const std_rat = 2; +const wild_rat = 3; +const light_rat = 4; + + +PUBLIC int com_rating_recalc(int p, param_list param) +{ + ASSERT(parray[p].adminLevel >= ADMIN_ADMIN); + rating_recalc(); + return COM_OK; +} + +PUBLIC int com_more(int p, param_list param) +{ + pmore_file(p); + return COM_OK; +} + +PUBLIC int num_news = -1; + +PUBLIC void rscan_news2(FILE *fp, int p, int num) +{ + char junk[MAX_LINE_SIZE], count[10]; + int crtime; + char *junkp; + + if (num == 0) + return; + + fgets(junk, MAX_LINE_SIZE, fp); + if (feof(fp)) + return; + sscanf(junk, "%d %s", &crtime, count); + rscan_news2(fp, p, num - 1); + junkp = junk; + junkp = nextword(junkp); + junkp = nextword(junkp); + pprintf(p, "%3s (%s) %s", count, fix_time(strltime(&crtime)), junkp); +} + +PUBLIC int com_news(int p, param_list param) +{ + FILE *fp; + char filename[MAX_FILENAME_SIZE]; + char junk[MAX_LINE_SIZE]; + char *junkp; + int crtime, found = 0; + char count[10]; + + sprintf(filename, "%s/newnews.index", news_dir); + fp = fopen(filename, "r"); + + if (!fp) { + fprintf(stderr, "Can\'t find news index.\n"); + return COM_OK; + } + + if (param[0].type == 0) { + + /* no params - then just display index of last ten news items */ + + pprintf(p,"Index of recent news items:\n"); + fgets(junk, MAX_LINE_SIZE, fp); + sscanf(junk, "%d %s", &crtime, count); + rscan_news2(fp, p, 9); + junkp = junk; + junkp = nextword(junkp); + junkp = nextword(junkp); + pprintf(p, "%3s (%s) %s", count, fix_time(strltime(&crtime)), junkp); + fclose(fp); + + } else if ((param[0].type == TYPE_WORD) && !strcmp(param[0].val.word,"all")) { + + /* param all - displays index all news items */ + + pprintf(p, "Index of all news items:\n"); + fgets(junk, MAX_LINE_SIZE, fp); + sscanf(junk, "%d %s", &crtime, count); + rscan_news(fp, p, 0); + junkp = junk; + junkp = nextword(junkp); + junkp = nextword(junkp); + pprintf(p, "%3s (%s) %s", count, fix_time(strltime(&crtime)), junkp); + fclose(fp); + + } else { + + /* check if the specific news file exist in index */ + + while (!feof(fp) && !found) { + junkp = junk; + fgets(junk, MAX_LINE_SIZE, fp); + if (feof(fp)) + break; + sscanf(junkp, "%d %s", &crtime, count); + if (!strcmp(count, param[0].val.word)) { + found = 1; + junkp = nextword(junkp); + junkp = nextword(junkp); + pprintf(p, "NEWS %3s (%s) %s\n", count, fix_time(strltime(&crtime)), + junkp); + } + } + + fclose(fp); + + if (!found) { + pprintf(p, "Bad index number!\n"); + return COM_OK; + } + + /* file exists - show it */ + sprintf(filename, "%s/news.%s", news_dir, param[0].val.word); + fp = fopen(filename, "r"); + if (!fp) { + pprintf(p, "No more info.\n"); + return COM_OK; + } + + fclose(fp); + + sprintf(filename, "news.%s", param[0].val.word); + if (psend_file(p, news_dir, filename) < 0) { + pprintf(p, "Internal error - couldn't send news file!\n"); + } + } + + return COM_OK; +} + +PUBLIC int com_quit(int p, param_list param) +{ + if ((parray[p].game >= 0) && (garray[parray[p].game].status == GAME_EXAMINE)) { + pcommand(p, "unexamine"); + } + + if (parray[p].game >= 0) { + 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; +} + +PUBLIC 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; +} + +PUBLIC 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; +} + +PRIVATE 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; +} + +PRIVATE void com_stats_rating(char *hdr, statistics * stats, char *dest) +{ + char tmp[100]; + + sprintf(dest, "%-10s%4s %5.1f %4d %4d %4d %4d", + hdr, ratstr(stats->rating), stats->sterr, 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; +} + +PUBLIC int com_stats(int p, param_list param) +{ + int g, i, t; + int p1, connected; + char line[255], tmp[255]; + int numbers[MAX_OBSERVE > MAX_SIMUL ? MAX_OBSERVE : MAX_SIMUL]; + int onTime; + + if (param[0].type == TYPE_WORD) { + if (!FindPlayer(p, param[0].val.word, &p1, &connected)) + return COM_OK; + } else { + p1 = p; + connected = 1; + } + + sprintf(line, "\nStatistics for %-11s ", parray[p1].name); + if ((connected) && (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 (parray[p1].simul_info.numBoards) { + for (i = 0, t = 0; i < parray[p1].simul_info.numBoards; i++) { + if ((numbers[t] = parray[p1].simul_info.boards[i] + 1) != 0) + t++; + } + pprintf(p, "%s is giving a simul: game%s ", parray[p1].name, ((t > 1) ? "s" : "")); + com_stats_andify(numbers, t, tmp); + pprintf(p, tmp); + } else if (parray[p1].game >= 0) { + g = parray[p1].game; + if (garray[g].status == GAME_EXAMINE) { + pprintf(p, "(Examining game %d: %s vs. %s)\n", g + 1, + garray[g].white_name, garray[g].black_name); + } else { + pprintf(p, "(playing game %d: %s vs. %s)\n", g + 1, + parray[garray[g].white].name, parray[garray[g].black].name); + if (garray[g].link >= 0) { + pprintf(p, "(partner is playing game %d: %s vs. %s)\n", garray[g].link + 1, + parray[garray[garray[g].link].white].name, + parray[garray[garray[g].link].black].name); + } + } + } + if (parray[p1].num_observe) { + for (i = 0, t = 0; i < parray[p1].num_observe; i++) { + g = parray[p1].observe_list[i]; + if ((g != -1) && ((parray[p].adminLevel >= ADMIN_ADMIN) || (garray[g].private == 0))) + numbers[t++] = g + 1; + } + if (t) { + pprintf(p, "%s is observing game%s ", parray[p1].name, ((t > 1) ? "s" : "")); + com_stats_andify(numbers, t, tmp); + pprintf(p, tmp); + } + } + if (parray[p1].busy[0]) { + pprintf(p, "(%s %s)\n", parray[p1].name, parray[p1].busy); + } + if (!parray[p1].registered) { + pprintf(p, "%s is NOT a registered player.\n\n", parray[p1].name); + } else { + pprintf(p, "\n rating RD win loss draw total best\n"); + com_stats_rating("Blitz", &parray[p1].b_stats, tmp); + pprintf(p, tmp); + com_stats_rating("Standard", &parray[p1].s_stats, tmp); + pprintf(p, tmp); + com_stats_rating("Lightning", &parray[p1].l_stats, tmp); + pprintf(p, tmp); + com_stats_rating("Wild", &parray[p1].w_stats, tmp); + pprintf(p, tmp); + } + pprintf(p, "\n"); + if (parray[p1].adminLevel > 0) { + pprintf(p, "Admin Level: "); + switch (parray[p1].adminLevel) { + 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", parray[p1].adminLevel); + break; + } + } + if (parray[p].adminLevel > 0) + pprintf(p, "Full Name : %s\n", (parray[p1].fullName ? parray[p1].fullName : "(none)")); + if (((p1 == p) && (parray[p1].registered)) || (parray[p].adminLevel > 0)) + pprintf(p, "Address : %s\n", (parray[p1].emailAddress ? parray[p1].emailAddress : "(none)")); + if (parray[p].adminLevel > 0) { + pprintf(p, "Host : %s\n", + dotQuad(connected ? parray[p1].thisHost : parray[p1].lastHost)); + } + if ((parray[p].adminLevel > 0) && (parray[p1].registered)) + if (parray[p1].num_comments) + pprintf(p, "Comments : %d\n", parray[p1].num_comments); + + if (connected && parray[p1].registered && (p==p1 || + (parray[p].adminLevel > 0))) { + char *timeToStr = ctime((time_t *) &parray[p1].timeOfReg); + + timeToStr[strlen(timeToStr)-1]='\0'; + pprintf(p, "\n"); + onTime = (time(0) - parray[p1].logon_time) + 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)-parray[p1].timeOfReg)), + timeToStr); + } + +#ifdef TIMESEAL + if (connected) + pprintf(p, "\nTimeseal : %s\n", + (con[parray[p1].socket].timeseal) ? "On" : "Off"); + if ((parray[p].adminLevel > 0) && (connected)) { + if (findConnection(parray[p1].socket) && con[parray[p1].socket].timeseal) { + pprintf(p, "Unix acc : %s\nSystem/OS : %s\n", + con[parray[p1].socket].user, + con[parray[p1].socket].sys); + } + } +#endif + + if (parray[p1].num_plan) { + pprintf(p, "\n"); + for (i = 0; i < parray[p1].num_plan; i++) + pprintf(p, "%2d: %s\n", i + 1, (parray[p1].planLines[i] != NULL) ? parray[p1].planLines[i] : ""); + } + if (!connected) + player_remove(p1); + return COM_OK; +} + +PUBLIC int com_password(int p, param_list param) +{ + char *oldpassword = param[0].val.word; + char *newpassword = param[1].val.word; + char salt[3]; + + if (!parray[p].registered) { + pprintf(p, "Setting a password is only for registered players.\n"); + return COM_OK; + } + if (parray[p].passwd) { + salt[0] = parray[p].passwd[0]; + salt[1] = parray[p].passwd[1]; + salt[2] = '\0'; + if (strcmp(crypt(oldpassword, salt), parray[p].passwd)) { + pprintf(p, "Incorrect password, password not changed!\n"); + return COM_OK; + } + rfree(parray[p].passwd); + parray[p].passwd = NULL; + } + salt[0] = 'a' + rand() % 26; + salt[1] = 'a' + rand() % 26; + salt[2] = '\0'; + parray[p].passwd = strdup(crypt(newpassword, salt)); + pprintf(p, "Password changed to \"%s\".\n", newpassword); + return COM_OK; +} + +PUBLIC int com_uptime(int p, param_list param) +{ + unsigned long uptime = time(0) - startuptime; + struct rusage ru; + 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", fics_hostname,VERS_NUM); + pprintf(p, "The server has been up since %s.\n", strltime(&startuptime)); + if ((days==0) && (hours==0) && (mins==0)) { + pprintf(p, "(Up for %d second%s)\n", + secs, (secs==1) ? "" : "s"); + } else if ((days==0) && (hours==0)) { + pprintf(p, "(Up for %d minute%s and %d second%s)\n", + mins, (mins==1) ? "" : "s", + secs, (secs==1) ? "" : "s"); + } else if (days==0) { + pprintf(p, "(Up for %d hour%s, %d minute%s and %d second%s)\n", + hours, (hours==1) ? "" : "s", + mins, (mins==1) ? "" : "s", + secs, (secs==1) ? "" : "s"); + } else { + pprintf(p, "(Up for %d day%s, %d hour%s, %d minute%s and %d second%s)\n", + days, (days==1) ? "" : "s", + hours, (hours==1) ? "" : "s", + mins, (mins==1) ? "" : "s", + secs, (secs==1) ? "" : "s"); + } + pprintf(p, "\nAllocs: %u Frees: %u Allocs In Use: %u\n", + malloc_count, free_count, malloc_count - free_count); + if (parray[p].adminLevel >= ADMIN_ADMIN) { + pprintf(p, "\nplayer size:%d, game size:%d, con size:%d, g_num:%d\n", + sizeof(player), sizeof(game), net_consize(), g_num); + getrusage(RUSAGE_SELF, &ru); + pprintf(p, "pagesize = %d, maxrss = %d, total = %d\n", getpagesize(), ru.ru_maxrss, getpagesize() * ru.ru_maxrss); + } + pprintf(p, "\nPlayer limit: %d\n", max_connections-10); + pprintf(p, "\nThere are currently %d players, with a high of %d since last restart.\n", player_count(1), player_high); + pprintf(p, "There are currently %d games, with a high of %d since last restart.\n", game_count(), game_high); + pprintf(p, "\nCompiled on %s\n", COMP_DATE); + return COM_OK; +} + +PUBLIC int com_date(int p, param_list param) +{ + int t = time(0); + pprintf(p, "Local time - %s\n", strltime(&t)); + pprintf(p, "Greenwich time - %s\n", strgtime(&t)); + return COM_OK; +} + +char *inout_string[] = { + "login", "logout" +}; + +PRIVATE int plogins(p, fname) +int p; +char *fname; +{ + FILE *fp; + int inout, thetime, registered; + char loginName[MAX_LOGIN_NAME + 1]; + char ipstr[20]; + + fp = fopen(fname, "r"); + if (!fp) { + pprintf(p, "Sorry, no login information available.\n"); + return COM_OK; + } + while (!feof(fp)) { + if (fscanf(fp, "%d %s %d %d %s\n", &inout, loginName, &thetime, + ®istered, ipstr) != 5) { + fprintf(stderr, "FICS: Error in login info format. %s\n", fname); + fclose(fp); + return COM_OK; + } + pprintf(p, "%s: %-17s %-6s", strltime(&thetime), loginName, + inout_string[inout]); + if (parray[p].adminLevel > 0) { + pprintf(p, " from %s\n", ipstr); + } else + pprintf(p, "\n"); + } + fclose(fp); + return COM_OK; +} + +PUBLIC int com_llogons(int p, param_list param) +{ + char fname[MAX_FILENAME_SIZE]; + + sprintf(fname, "%s/%s", stats_dir, STATS_LOGONS); + return plogins(p, fname); +} + +PUBLIC int com_logons(int p, param_list param) +{ + char fname[MAX_FILENAME_SIZE]; + + if (param[0].type == TYPE_WORD) { + sprintf(fname, "%s/player_data/%c/%s.%s", stats_dir, param[0].val.word[0], param[0].val.word, STATS_LOGONS); + } else { + sprintf(fname, "%s/player_data/%c/%s.%s", stats_dir, parray[p].login[0], parray[p].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 ((parray[p1].adminLevel >= 10) && (parray[p1].i_admin)) + strcat(ptmp, "(*)"); + if (in_list(p1, L_COMPUTER, parray[p1].name)) + strcat(ptmp, "(C)"); + if (in_list(p1, L_FM, parray[p1].name)) + strcat(ptmp, "(FM)"); + if (in_list(p1, L_IM, parray[p1].name)) + strcat(ptmp, "(IM)"); + if (in_list(p1, L_GM, parray[p1].name)) + strcat(ptmp, "(GM)"); + if (in_list(p1, L_TD, parray[p1].name)) + strcat(ptmp, "(TD)"); + if (in_list(p1, L_TEAMS, parray[p1].name)) + strcat(ptmp, "(T)"); + if (in_list(p1, L_BLIND, parray[p1].name)) + strcat(ptmp, "(B)"); +} + +PRIVATE void who_terse(int p, int num, int *plist, int type) +{ + char ptmp[80 + 20]; /* for highlight */ + multicol *m = multicol_start(PARRAY_SIZE); + int i; + int p1; + int rat; + + /* altered DAV 3/15/95 */ + + for (i = 0; i < num; i++) { + p1 = plist[i]; + + if (type == blitz_rat) + rat = parray[p1].b_stats.rating; + else if (type == wild_rat) + rat = parray[p1].w_stats.rating; + else if (type == std_rat) + rat = parray[p1].s_stats.rating; + else if (type == light_rat) + rat = parray[p1].l_stats.rating; + + if (type == none) { + sprintf(ptmp, " "); + } else { + sprintf(ptmp, "%-4s", ratstrii(rat, parray[p1].registered)); + if (parray[p1].simul_info.numBoards) { + strcat(ptmp, "~"); + } else if ((parray[p1].game >= 0) && (garray[parray[p1].game].status == GAME_EXAMINE)) { + strcat(ptmp, "#"); + } else if (parray[p1].game >= 0) { + strcat(ptmp, "^"); + } else if (!parray[p1].open) { + strcat(ptmp, ":"); + } else if (player_idle(p1) > 300) { + strcat(ptmp, "."); + } else { + strcat(ptmp, " "); + } + } + + if (p == p1) { + psprintf_highlight(p, ptmp + strlen(ptmp), "%s", parray[p1].name); + } else { + strcat(ptmp, parray[p1].name); + } + + AddPlayerLists(p1, ptmp); + multicol_store(m, ptmp); + } + multicol_pprint(m, p, 80, 2); + multicol_end(m); + pprintf(p, "\n %d players displayed (of %d). (*) indicates system administrator.\n", num, player_count(1)); +} + +PRIVATE 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 (parray[p1].game >= 0) + sprintf(tmp, "%3d", parray[p1].game + 1); + else + sprintf(tmp, " "); + strcat(playerLine, tmp); + + if (!parray[p1].open) + sprintf(tmp, "X"); + else + sprintf(tmp, " "); + strcat(playerLine, tmp); + + if (parray[p1].registered) + if (parray[p1].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, 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(parray[p1].s_stats.rating, parray[p1].registered), + ratstrii(parray[p1].b_stats.rating, parray[p1].registered), + 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" + ); +} + +PRIVATE 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, 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(parray[p1].s_stats.rating, parray[p1].registered), + (int) parray[p1].s_stats.win, + (int) parray[p1].s_stats.los, + (int) parray[p1].s_stats.dra); + strcat(playerLine, tmp); + + sprintf(tmp, "%4s %4d %4d %4d ", + ratstrii(parray[p1].b_stats.rating, parray[p1].registered), + (int) parray[p1].b_stats.win, + (int) parray[p1].b_stats.los, + (int) 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); +} + +PRIVATE int who_ok(int p, unsigned int sel_bits) +{ + int p2; + if (parray[p].status != PLAYER_PROMPT) + return 0; + if (sel_bits == WHO_ALL) + return 1; + if (sel_bits & WHO_OPEN) + if (!parray[p].open) + return 0; + if (sel_bits & WHO_CLOSED) + if (parray[p].open) + return 0; + if (sel_bits & WHO_RATED) + if (!parray[p].rated) + return 0; + if (sel_bits & WHO_UNRATED) + if (parray[p].rated) + return 0; + if (sel_bits & WHO_FREE) + if (parray[p].game >= 0) + return 0; + if (sel_bits & WHO_PLAYING) + if (parray[p].game < 0) + return 0; + if (sel_bits & WHO_REGISTERED) + if (!parray[p].registered) + return 0; + if (sel_bits & WHO_UNREGISTERED) + if (parray[p].registered) + return 0; + if (sel_bits & WHO_BUGTEAM) { + p2 = parray[p].partner; + if (p2 < 0 || parray[p2].partner != p) + return 0; + } + return 1; +} + + +PRIVATE int blitz_cmp(const void *pp1, const void *pp2) +{ + register int p1 = *(int *) pp1; + register int p2 = *(int *) pp2; + if (parray[p1].status != PLAYER_PROMPT) { + if (parray[p2].status != PLAYER_PROMPT) + return 0; + else + return -1; + } + if (parray[p2].status != PLAYER_PROMPT) + return 1; + if (parray[p1].b_stats.rating > parray[p2].b_stats.rating) + return -1; + if (parray[p1].b_stats.rating < parray[p2].b_stats.rating) + return 1; + if (parray[p1].registered > parray[p2].registered) + return -1; + if (parray[p1].registered < parray[p2].registered) + return 1; + return strcmp(parray[p1].login, parray[p2].login); +} + +PRIVATE int light_cmp(const void *pp1, const void *pp2) +{ + register int p1 = *(int *) pp1; + register int p2 = *(int *) pp2; + if (parray[p1].status != PLAYER_PROMPT) { + if (parray[p2].status != PLAYER_PROMPT) + return 0; + else + return -1; + } + if (parray[p2].status != PLAYER_PROMPT) + return 1; + if (parray[p1].l_stats.rating > parray[p2].l_stats.rating) + return -1; + if (parray[p1].l_stats.rating < parray[p2].l_stats.rating) + return 1; + if (parray[p1].registered > parray[p2].registered) + return -1; + if (parray[p1].registered < parray[p2].registered) + return 1; + return strcmp(parray[p1].login, parray[p2].login); +} + +PRIVATE int stand_cmp(const void *pp1, const void *pp2) +{ + register int p1 = *(int *) pp1; + register int p2 = *(int *) pp2; + if (parray[p1].status != PLAYER_PROMPT) { + if (parray[p2].status != PLAYER_PROMPT) + return 0; + else + return -1; + } + if (parray[p2].status != PLAYER_PROMPT) + return 1; + if (parray[p1].s_stats.rating > parray[p2].s_stats.rating) + return -1; + if (parray[p1].s_stats.rating < parray[p2].s_stats.rating) + return 1; + if (parray[p1].registered > parray[p2].registered) + return -1; + if (parray[p1].registered < parray[p2].registered) + return 1; + return strcmp(parray[p1].login, parray[p2].login); +} + +PRIVATE int wild_cmp(const void *pp1, const void *pp2) +{ + register int p1 = *(int *) pp1; + register int p2 = *(int *) pp2; + if (parray[p1].status != PLAYER_PROMPT) { + if (parray[p2].status != PLAYER_PROMPT) + return 0; + else + return -1; + } + if (parray[p2].status != PLAYER_PROMPT) + return 1; + if (parray[p1].w_stats.rating > parray[p2].w_stats.rating) + return -1; + if (parray[p1].w_stats.rating < parray[p2].w_stats.rating) + return 1; + if (parray[p1].registered > parray[p2].registered) + return -1; + if (parray[p1].registered < parray[p2].registered) + return 1; + return strcmp(parray[p1].login, parray[p2].login); +} + +PRIVATE int alpha_cmp(const void *pp1, const void *pp2) +{ + register int p1 = *(int *) pp1; + register int p2 = *(int *) pp2; + if (parray[p1].status != PLAYER_PROMPT) { + if (parray[p2].status != PLAYER_PROMPT) + return 0; + else + return -1; + } + if (parray[p2].status != PLAYER_PROMPT) + return 1; + return strcmp(parray[p1].login, parray[p2].login); +} + +PUBLIC void sort_players(int players[PARRAY_SIZE], + int ((*cmp_func) (const void *, const void *))) +{ + int i; + + for (i = 0; i < p_num; i++) { + players[i] = i; + } + qsort(players, p_num, sizeof(int), cmp_func); +} + +/* This is the of the most compliclicated commands in terms of parameters */ +PUBLIC int com_who(int p, param_list param) +{ + int style = 0; + float stop_perc = 1.0; + float start_perc = 0; + unsigned int sel_bits = WHO_ALL; + int sortlist[PARRAY_SIZE], plist[PARRAY_SIZE]; + int ((*cmp_func) (const void *, const void *)) = blitz_cmp; + int startpoint; + int stoppoint; + int i, len; + int tmpI, tmpJ; + char c; + int p1, count, num_who; + int sort_type = blitz_rat; + + 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]))) + return COM_BADPARAMETERS; + } else { + tmpI = c - '0'; + tmpJ = param[0].val.string[i - 1] - '0'; + if (tmpI == 0) + return COM_BADPARAMETERS; + if (tmpJ > tmpI) + return COM_BADPARAMETERS; + 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; + break; + default: + return COM_BADPARAMETERS; + break; + } + } + } + } + sort_players(sortlist, cmp_func); + count = 0; + for (p1 = 0; p1 < 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 < 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: + return COM_BADPARAMETERS; + break; + } + + return COM_OK; +} + +PUBLIC int com_refresh(int p, param_list param) +{ + int g, p1; + + if (param[0].type == TYPE_NULL) { + if (parray[p].game >= 0) { + send_board_to(parray[p].game, p); + } else { /* Do observing in here */ + if (parray[p].num_observe) { + for (g = 0; g < parray[p].num_observe; g++) { + send_board_to(parray[p].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 >= g_num) || ((garray[g].status != GAME_ACTIVE) + && (garray[g].status != GAME_EXAMINE))) { + pprintf(p, "No such game.\n"); + } else if (garray[g].private && parray[p].adminLevel==ADMIN_USER) { + pprintf (p, "Sorry, game %d is a private game.\n", g+1); + } else { + if (garray[g].private) + pprintf(p, "Refreshing PRIVATE game %d\n", g+1); + send_board_to(g, p); + } + } + return COM_OK; +} + +PUBLIC int com_prefresh(int p, param_list param) +{ + int retval, part = parray[p].partner; + + if (part < 0) { + pprintf(p, "You do not have a partner.\n"); + return COM_OK; + } + retval = pcommand (p, "refresh %s", parray[part].name); + if (retval == COM_OK) + return COM_OK_NOPROMPT; + else + return retval; +} + +PUBLIC int com_open(int p, param_list param) +{ + int retval; + ASSERT(param[0].type == TYPE_NULL); + if ((retval = pcommand(p, "set open")) != COM_OK) + return retval; + else + return COM_OK_NOPROMPT; +} + +PUBLIC int com_simopen(int p, param_list param) +{ + int retval; + ASSERT(param[0].type == TYPE_NULL); + if ((retval = pcommand(p, "set simopen")) != COM_OK) + return retval; + else + return COM_OK_NOPROMPT; +} + +PUBLIC int com_bell(int p, param_list param) +{ + int retval; + ASSERT(param[0].type == TYPE_NULL); + if ((retval = pcommand(p, "set bell")) != COM_OK) + return retval; + else + return COM_OK_NOPROMPT; +} + +PUBLIC int com_flip(int p, param_list param) +{ + int retval; + ASSERT(param[0].type == TYPE_NULL); + if ((retval = pcommand(p, "set flip")) != COM_OK) + return retval; + else + return COM_OK_NOPROMPT; +} + +PUBLIC int com_highlight(int p, param_list param) +{ + pprintf(p, "Obsolete command. Please do set highlight <0-15>.\n"); + return COM_OK; +} + +PUBLIC int com_style(int p, param_list param) +{ + int retval; + ASSERT(param[0].type == TYPE_INT); + if ((retval = pcommand(p, "set style %d", param[0].val.integer)) != COM_OK) + return retval; + else + return COM_OK_NOPROMPT; +} + +PUBLIC int com_promote(int p, param_list param) +{ + int retval; + ASSERT(param[0].type == TYPE_WORD); + if ((retval = pcommand(p, "set promote %s", param[0].val.word)) != COM_OK) + return retval; + else + return COM_OK_NOPROMPT; +} + +PUBLIC int com_alias(int p, param_list param) +{ + int al; + + if (param[0].type == TYPE_NULL) { + for (al = 0; al < parray[p].numAlias; al++) { + pprintf(p, "%s -> %s\n", parray[p].alias_list[al].comm_name, + parray[p].alias_list[al].alias); + } + return COM_OK; + } + al = alias_lookup(param[0].val.word, parray[p].alias_list, parray[p].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", parray[p].alias_list[al].comm_name, + parray[p].alias_list[al].alias); + } + } else { + if (al < 0) { + if (parray[p].numAlias >= MAX_ALIASES - 1) { + pprintf(p, "You have your maximum of %d aliases.\n", MAX_ALIASES - 1); + } else { + + if (!strcmp(param[0].val.string, "quit")) { /* making sure they + can't alias quit */ + pprintf(p, "You can't alias this command.\n"); + } else if (!strcmp(param[0].val.string, "unalias")) { /* making sure they + can't alias unalias + :) */ + pprintf(p, "You can't alias this command.\n"); + } else { + parray[p].alias_list[parray[p].numAlias].comm_name = + strdup(param[0].val.word); + parray[p].alias_list[parray[p].numAlias].alias = + strdup(param[1].val.string); + parray[p].numAlias++; + pprintf(p, "Alias set.\n"); + + } + } + } else { + rfree(parray[p].alias_list[al].alias); + parray[p].alias_list[al].alias = strdup(param[1].val.string); + pprintf(p, "Alias replaced.\n"); + } + parray[p].alias_list[parray[p].numAlias].comm_name = NULL; + } + return COM_OK; +} + +PUBLIC int com_unalias(int p, param_list param) +{ + int al; + int i; + + ASSERT(param[0].type == TYPE_WORD); + al = alias_lookup(param[0].val.word, parray[p].alias_list, parray[p].numAlias); + if (al < 0) { + pprintf(p, "You have no alias named '%s'.\n", param[0].val.word); + } else { + rfree(parray[p].alias_list[al].comm_name); + rfree(parray[p].alias_list[al].alias); + for (i = al; i < parray[p].numAlias; i++) { + parray[p].alias_list[i].comm_name = parray[p].alias_list[i + 1].comm_name; + parray[p].alias_list[i].alias = parray[p].alias_list[i + 1].alias; + } + parray[p].numAlias--; + parray[p].alias_list[parray[p].numAlias].comm_name = NULL; + pprintf(p, "Alias removed.\n"); + } + return COM_OK; +} + +PUBLIC int com_servers(int p, param_list param) +{ +/* + int i; + + ASSERT(param[0].type == TYPE_NULL); + if (numServers == 0) { + */ pprintf(p, "There are no other servers known to this server.\n"); + return COM_OK; +} + /* pprintf(p, "There are %d known servers.\n", numServers); pprintf(p, "(Not + all of these may be active)\n"); pprintf(p, "%-30s%-7s\n", "HOST", + "PORT"); for (i = 0; i < numServers; i++) pprintf(p, "%-30s%-7d\n", + serverNames[i], serverPorts[i]); return COM_OK; } */ + +PUBLIC int com_index(int p, param_list param) +{ + int i; + char index_default[] = "_index"; + char *iwant, *filenames[100]; /* enough for all index filenames */ + + if (param[0].type == TYPE_NULL) { + iwant = index_default; + } else { + iwant = param[0].val.word; + if (!safestring(iwant)) { + pprintf(p, "Illegal character in category %s.\n", iwant); + return COM_OK; + } + } + + i = search_directory(index_dir, iwant, filenames, 1000); + if (i == 0) { + pprintf(p, "No index entry for \"%s\".\n", iwant); + } else if ((i == 1) || !strcmp(*filenames, iwant)) { + if (psend_file(p, index_dir, *filenames)) { + /* we should never reach this unless the file was just deleted */ + pprintf(p, "Index file %s could not be found! ", *filenames); + pprintf(p, "Please inform an admin of this. Thank you.\n"); + } + } else { + pprintf(p, "Matches:"); + display_directory(p, filenames, i); + } + return COM_OK; +} + +PUBLIC int com_help(int p, param_list param) +{ + int i, UseLang = parray[p].language; + char help_default[] = "_help"; + char *iwant, *filenames[1000]; /* enough for all helpfile names */ + + if (param[0].type == TYPE_NULL) { + iwant = help_default; + } else { + iwant = param[0].val.word; + if (!safestring(iwant)) { + pprintf(p, "Illegal character in command %s.\n", iwant); + return COM_OK; + } + } + i = search_directory(help_dir[UseLang], iwant, filenames, 1000); + if (i == 0) { + if (UseLang != LANG_DEFAULT) { + i += search_directory(help_dir[LANG_DEFAULT], iwant, filenames, 1000); + if (i > 0) { + pprintf(p, "No help available in %s; using %s instead.\n", + Language(UseLang), Language(LANG_DEFAULT)); + UseLang = LANG_DEFAULT; + } + } + if (i==0) { + pprintf(p, "No help available on \"%s\".\n", iwant); + return COM_OK; + } + } + if ((i == 1) || !strcmp(*filenames, iwant)) { + if (psend_file(p, help_dir[UseLang], *filenames)) { + /* we should never reach this unless the file was just deleted */ + pprintf(p, "Helpfile %s could not be found! ", *filenames); + pprintf(p, "Please inform an admin of this. Thank you.\n"); + } + } else { + pprintf(p, "Matches:"); + display_directory(p, filenames, i); + pprintf(p, "[Type \"info\" for a list of FICS general information files.]\n"); + } + return COM_OK; +} + +PUBLIC int com_info(int p, param_list param) +{ + int n; + char *filenames[1000]; + + if ((n = search_directory(info_dir, NULL, filenames, 1000)) > 0) + display_directory(p, filenames, n); + return COM_OK; +} + +PRIVATE int FindAndShowFile(int p, param_list param, char *dir) +{ + int i; + static char nullify = '\0'; + char *iwant, *filenames[1000]; /* enough for all helpfile names */ + + if (param[0].type == TYPE_NULL) { + iwant = &nullify; + } else { + iwant = param[0].val.word; + if (!safestring(iwant)) { + pprintf(p, "Illegal character in filename %s.\n", iwant); + return COM_OK; + } + } + + i = search_directory(dir, iwant, filenames, 1000); + if (i == 0) { + pprintf(p, "No information available on \"%s\".\n", iwant); + } else if ((i == 1) || !strcmp(*filenames, iwant)) { + if (psend_file(p, dir, *filenames)) { + /* we should never reach this unless the file was just deleted */ + pprintf(p, "File %s could not be found! ", *filenames); + pprintf(p, "Please inform an admin of this. Thank you.\n"); + } + } else { + if (*iwant) + pprintf(p, "Matches:\n"); + display_directory(p, filenames, i); + } + return COM_OK; +} + +PUBLIC int com_uscf(int p, param_list param) +{ + return FindAndShowFile (p, param, uscf_dir); +} + +PUBLIC int com_adhelp(int p, param_list param) +{ + return FindAndShowFile (p, param, adhelp_dir); +} + +PUBLIC int com_mailsource(int p, param_list param) +{ + static char nullify = '\0'; + char *iwant, *buffer[1000]; + char subj[81], fname[MAX_FILENAME_SIZE]; + int count; + + if (!parray[p].registered) { + pprintf(p, "Only registered people can use the mailsource command.\n"); + return COM_OK; + } + + if (param[0].type == TYPE_NULL) { + iwant = &nullify; + } else { + iwant = param[0].val.word; + } + + count = search_directory(source_dir, iwant, buffer, 1000); + if (count == 0) { + pprintf(p, "Found no source file matching \"%s\".\n", iwant); + } else if ((count == 1) || !strcmp(iwant, *buffer)) { + sprintf(subj, "FICS source file from server %s: %s",fics_hostname,*buffer); + sprintf(fname, "%s/%s",source_dir, *buffer); + mail_file_to_user (p, subj, fname); + pprintf(p, "Source file %s sent to %s\n", *buffer, parray[p].emailAddress); + } else { + pprintf(p, "Found %d source files matching that:\n", count); + if (*iwant) + display_directory(p, buffer, count); + else { /* this junk is to get *.c *.h */ + multicol *m = multicol_start(count); + char *s; + int i; + for (i=0; i < count; i++) { + if (((s = buffer[i] + strlen(buffer[i]) - 2) >= buffer[i]) && (!strcmp(s, ".c") || !strcmp(s, ".h"))) + multicol_store(m, buffer[i]); + } + multicol_pprint(m, p, 78, 1); + multicol_end(m); + } + } + return COM_OK; +} + +PUBLIC int com_mailhelp(int p, param_list param) +{ /* Sparky */ + char subj[81], fname[MAX_FILENAME_SIZE]; + char *iwant, *buffer[1000]; + + int lang = parray[p].language; + int count; + static char nullify = '\0'; + + if (!parray[p].registered) { + pprintf(p, "Only registered people can use the mailhelp command.\n"); + return COM_OK; + } + if (param[0].type == TYPE_NULL) + iwant = &nullify; + else + iwant = param[0].val.word; + + count = search_directory(help_dir[lang], iwant, buffer, 1000); + if (count == 0 && lang != LANG_DEFAULT) { + count += search_directory(help_dir[LANG_DEFAULT], iwant, buffer, 1000); + if (count > 0) { + pprintf(p, "No help available in %s; using %s instead.\n", + Language(lang), Language(LANG_DEFAULT)); + lang = LANG_DEFAULT; + } + } + if (count == 0) { + pprintf(p, "Found no help file matching \"%s\".\n", iwant); + } else if (count == 1 || !strcmp(*buffer, iwant)) { + sprintf(subj, "FICS help file from server %s: %s", fics_hostname, *buffer); + sprintf(fname, "%s/%s",help_dir[lang], *buffer); + mail_file_to_user (p, subj, fname); + pprintf(p, "Help file %s sent to %s\n", *buffer, parray[p].emailAddress); + } else { + pprintf(p, "Found %d helpfiles matching that:\n", count); + display_directory(p, buffer, count); + } + + return COM_OK; +} + +PUBLIC 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; +} + +PUBLIC int com_getpi(int p, param_list param) +{ + int p1; + + if (!in_list(p, L_TD, parray[p].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) || (parray[p1].registered == 0)) { + /* Darkside suggested not to return anything */ + return COM_OK; + } + if (!parray[p1].registered) { + pprintf(p, "*getpi %s -1 -1 -1*\n", parray[p1].name); + } else { + pprintf(p, "*getpi %s %d %d %d*\n", parray[p1].name, + parray[p1].w_stats.rating, + parray[p1].b_stats.rating, + parray[p1].s_stats.rating); + } + return COM_OK; +} + +PUBLIC int com_getps(int p, param_list param) +{ + int p1; + + if ((((p1 = player_find_bylogin(param[0].val.word)) < 0) || (parray[p1].registered == 0)) || (parray[p1].game < 0)) { + + pprintf(p, "*status %s 1*\n", param[0].val.word); + return COM_OK; + } + pprintf(p, "*status %s 0 %s*\n", parray[p1].name, parray[(parray[p1].opponent)].name); + return COM_OK; +} +PUBLIC int com_limits(int p, param_list param) +{ + pprintf(p, "\nCurrent hardcoded limits:\n"); + pprintf(p, " Max number of players: %d\n", MAX_PLAYER); + 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 aliases: %d\n", MAX_ALIASES - 1); + pprintf(p, " Max number of games you can observe at a time: %d\n", MAX_OBSERVE); + pprintf(p, " Max number of requests pending: %d\n", MAX_PENDING); + 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 ((parray[p].adminLevel < ADMIN_ADMIN) && (!titled_player(p,parray[p].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", quota_time); + return COM_OK; +} diff --git a/FICS/comproc.c.orig b/FICS/comproc.c.orig new file mode 100644 index 0000000..2ec74e3 --- /dev/null +++ b/FICS/comproc.c.orig @@ -0,0 +1,1625 @@ +/* comproc.c + * + */ + +/* + 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 + (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. +*/ + +/* Revision history: + name email yy/mm/dd Change + Richard Nash 93/10/22 Created + foxbat 95/03/11 added filters in cmatch. +*/ + +#include "stdinclude.h" + +#include "common.h" +#include "talkproc.h" +#include "comproc.h" +#include "command.h" +#include "utils.h" +#include "ficsmain.h" +#include "config.h" +#include "playerdb.h" +#include "network.h" +#include "rmalloc.h" +#include "channel.h" +#include "variable.h" +#include "gamedb.h" +#include "gameproc.h" +#include "board.h" +/* #include "hostinfo.h" */ +#include "multicol.h" +#include "ratings.h" +#include "formula.h" +#include "lists.h" +#include "eco.h" +#include "network.h" +#include + +#include + +/* grimm */ +#if defined(SGI) +#else +/* int system(char *arg); */ +#endif + +const none = 0; +const blitz_rat = 1; +const std_rat = 2; +const wild_rat = 3; + + +PUBLIC int com_rating_recalc(int p, param_list param) +{ + ASSERT(parray[p].adminLevel >= ADMIN_ADMIN); + rating_recalc(); + return COM_OK; +} + +PUBLIC int com_more(int p, param_list param) +{ +/* in_push(IN_HELP); */ + pmore_file(p); + return COM_OK; +} + +PUBLIC int num_news = -1; + +PUBLIC int com_news(int p, param_list param) +{ + FILE *fp; + char filename[MAX_FILENAME_SIZE]; + char junk[MAX_LINE_SIZE]; + char *junkp; + int crtime, found = 0; + char count[10]; + + if (num_news == -1) { + sprintf(filename, "%s/news.index", news_dir); + fp = fopen(filename, "r"); + if (!fp) { + fprintf(stderr, "Cant find news index.\n"); + return COM_OK; + } + num_news = count_lines(fp); + fclose(fp); /* It's customary to close files after use! */ + } + + if (param[0].type == 0) { + /* no params - then just display index over news */ + sprintf(filename, "%s/news.index", news_dir); + fp = fopen(filename, "r"); + if (!fp) { + fprintf(stderr, "Can't find news index.\n"); + return COM_OK; + } + pprintf(p,"Index of recent news items:\n"); + while (!feof(fp)) { + junkp = junk; + fgets(junk, MAX_LINE_SIZE, fp); + if (feof(fp)) + break; + if (strlen(junk) > 1) { + sscanf(junkp, "%d %s", &crtime, count); + if (atoi(count) > num_news - 10) { + junkp = nextword(junkp); + junkp = nextword(junkp); + pprintf(p, "%3s (%s) %s", count, strltime(&crtime), junkp); + } + } + } + fclose(fp); + } else if ((param[0].type == TYPE_WORD) && !strcmp(param[0].val.word, "all")) { + /* param all - displays all news items */ + sprintf(filename, "%s/news.index", news_dir); + fp = fopen(filename, "r"); + if (!fp) { + fprintf(stderr, "Can't find news index.\n"); + return COM_OK; + } + pprintf(p, "Index of all news items:\n"); + while (!feof(fp)) { + junkp = junk; + fgets(junk, MAX_LINE_SIZE, fp); + if (feof(fp)) + break; + if (strlen(junk) > 1) { + sscanf(junkp, "%d %s", &crtime, count); + junkp = nextword(junkp); + junkp = nextword(junkp); + pprintf(p, "%3s (%s) %s", count, strltime(&crtime), junkp); + } + } + fclose(fp); /* It's customary to close files after use! */ + } else { /* check if the specific news file exist in index */ + sprintf(filename, "%s/news.index", news_dir); + fp = fopen(filename, "r"); + if (!fp) { + fprintf(stderr, "Can't find news index.\n"); + return COM_OK; + } + while (!feof(fp) && !found) { + junkp = junk; + fgets(junk, MAX_LINE_SIZE, fp); + if (feof(fp)) + break; + if (strlen(junk) > 1) { + sscanf(junkp, "%d %s", &crtime, count); + if (!strcmp(count, param[0].val.word)) { + found = 1; + junkp = nextword(junkp); + junkp = nextword(junkp); + pprintf(p, "NEWS %3s (%s) %s\n", count, strltime(&crtime), junkp); + } + } + } + fclose(fp); + if (!found) { + pprintf(p, "Bad index number!\n"); + return COM_OK; + } + /* file exists - show it */ + sprintf(filename, "%s/news.%s", news_dir, param[0].val.word); + fp = fopen(filename, "r"); + if (!fp) { + pprintf(p, "No more info.\n"); + return COM_OK; + } + fclose(fp); + sprintf(filename, "news.%s", param[0].val.word); + if (psend_file(p, news_dir, filename) < 0) { + pprintf(p, "Internal error - couldn't send news file!\n"); + } + } + return COM_OK; +} + +PUBLIC int com_quit(int p, param_list param) +{ + if ((parray[p].game >= 0) && (garray[parray[p].game].status == GAME_EXAMINE)) { + pcommand(p, "unexamine"); + } + + if (parray[p].game >= 0) { + 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; +} + +PUBLIC 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; +} + +PUBLIC int FindPlayer(int p, parameter * param, int *p1, int *connected) +{ + if (param->type == TYPE_WORD) { + *p1 = player_search(p, param->val.word); + 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; + } + } else { + *p1 = p; + *connected = 1; + } + return 1; +} + +PRIVATE 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; +} + +PRIVATE void com_stats_rating(char *hdr, statistics * stats, char *dest) +{ + char tmp[100]; + + sprintf(dest, "%-10s%4s %5.1f %4d %4d %4d %4d", + hdr, ratstr(stats->rating), stats->sterr, 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; +} + +PUBLIC int com_stats(int p, param_list param) +{ + int g, i, t; + int p1, connected; + char line[255], tmp[255]; + int numbers[MAX_OBSERVE > MAX_SIMUL ? MAX_OBSERVE : MAX_SIMUL]; + int days, hours, mins, secs, onTime; + + if (!FindPlayer(p, ¶m[0], &p1, &connected)) + return COM_OK; + + sprintf(line, "\nStatistics for %-11s ", parray[p1].name); + if ((connected) && (parray[p1].status == PLAYER_PROMPT)) { + sprintf(tmp, "On for: %s", hms(player_ontime(p1), 0, 0, 0)); + strcat(line, tmp); + sprintf(tmp, " Idle: %s\n", hms(player_idle(p1), 0, 0, 0)); + } 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 (parray[p1].simul_info.numBoards) { + for (i = 0, t = 0; i < parray[p1].simul_info.numBoards; i++) { + if ((numbers[t] = parray[p1].simul_info.boards[i] + 1) != 0) + t++; + } + pprintf(p, "%s is giving a simul: game%s ", parray[p1].name, ((t > 1) ? "s" : "")); + com_stats_andify(numbers, t, tmp); + pprintf(p, tmp); + } else if (parray[p1].game >= 0) { + g = parray[p1].game; + if (garray[g].status == GAME_EXAMINE) { + pprintf(p, "(Examining game %d: %s vs. %s)\n", g + 1, + garray[g].white_name, garray[g].black_name); + } else { + pprintf(p, "(playing game %d: %s vs. %s)\n", g + 1, + parray[garray[g].white].name, parray[garray[g].black].name); + } + } + if (parray[p1].num_observe) { + for (i = 0, t = 0; i < parray[p1].num_observe; i++) { + g = parray[p1].observe_list[i]; + if ((g != -1) && ((parray[p].adminLevel >= ADMIN_ADMIN) || (garray[g].private == 0))) + numbers[t++] = g + 1; + } + if (t) { + pprintf(p, "%s is observing game%s ", parray[p1].name, ((t > 1) ? "s" : "")); + com_stats_andify(numbers, t, tmp); + pprintf(p, tmp); + } + } + if (parray[p1].busy[0]) { + pprintf(p, "(%s %s)\n", parray[p1].name, parray[p1].busy); + } + if (!parray[p1].registered) { + pprintf(p, "%s is NOT a registered player.\n\n", parray[p1].name); + } else { + pprintf(p, "\n rating RD win loss draw total best\n"); + com_stats_rating("Blitz", &parray[p1].b_stats, tmp); + pprintf(p, tmp); + com_stats_rating("Standard", &parray[p1].s_stats, tmp); + pprintf(p, tmp); + com_stats_rating("Wild", &parray[p1].w_stats, tmp); + pprintf(p, tmp); + } + pprintf(p, "\n"); + if (parray[p1].adminLevel > 0) { + pprintf(p, "Admin Level: "); + switch (parray[p1].adminLevel) { +/* + case 0: + pprintf(p, "Normal User\n"); + break; + case 5: + pprintf(p, "Extra Cool User\n"); vek wants to be 5 + break; + + Forget it - you can do some admin stuff if your level is > than 0 - DAV + +*/ + 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", parray[p1].adminLevel); + break; + } + } + if (parray[p].adminLevel > 0) + pprintf(p, "Full Name : %s\n", (parray[p1].fullName ? parray[p1].fullName : "(none)")); + if (((p1 == p) && (parray[p1].registered)) || (parray[p].adminLevel > 0)) + pprintf(p, "Address : %s\n", (parray[p1].emailAddress ? parray[p1].emailAddress : "(none)")); + if (parray[p].adminLevel > 0) { + pprintf(p, "Host : %s\n", +/* + ((hp = gethostbyaddr((const char*) (connected ? &parray[p1].thisHost : &parray[p1].lastHost), sizeof(parray[p1].thisHost), AF_INET)) == 0) ? "" : hp->h_name, +*/ + dotQuad(connected ? parray[p1].thisHost : parray[p1].lastHost)); + } + if ((parray[p].adminLevel > 0) && (parray[p1].registered)) + if (parray[p1].num_comments) + pprintf(p, "Comments : %d\n", parray[p1].num_comments); + + if (connected && parray[p1].registered && (p==p1 || + (parray[p].adminLevel > 0))) { + char *timeToStr = ctime((time_t *) &parray[p1].timeOfReg); + + timeToStr[strlen(timeToStr)-1]='\0'; + pprintf(p, "\n"); + onTime = (time(0) - parray[p1].logon_time) + parray[p1].totalTime; + days = (onTime / (60*60*24)); + hours = ((onTime % (60*60*24)) / (60*60)); + mins = (((onTime % (60*60*24)) % (60*60)) / 60); + secs = (((onTime % (60*60*24)) % (60*60)) % 60); + if ((days==0) && (hours==0) && (mins==0)) { + pprintf(p, "Total time on-line: %d second%s\n", + secs, (secs==1) ? "" : "s"); + } else if ((days==0) && (hours==0)) { + pprintf(p, "Total time on-line: %d minute%s and %d second%s\n", + mins, (mins==1) ? "" : "s", + secs, (secs==1) ? "" : "s"); + } else if (days==0) { + pprintf(p, "Total time on-line: %d hour%s, %d minute%s and %d " + "second%s\n", + hours, (hours==1) ? "" : "s", + mins, (mins==1) ? "" : "s", + secs, (secs==1) ? "" : "s"); + } else { + pprintf(p, "Total time on-line: %d day%s, %d hour%s, %d minute%s " + "and %d second%s\n", + days, (days==1) ? "" : "s", + hours, (hours==1) ? "" : "s", + mins, (mins==1) ? "" : "s", + secs, (secs==1) ? "" : "s"); + } + pprintf(p, "%% of life on-line: %3.1f (since %s)\n", + (double)((onTime*100)/(double)(time(0)-parray[p1].timeOfReg)), + timeToStr); + } + +#ifdef TIMESEAL + + if (connected) + pprintf(p, "\nTimeseal : %s\n", (con[parray[p1].socket].timeseal) +? "On" : "Off"); + if ((parray[p].adminLevel > 0) && (connected)) { + if (findConnection(parray[p1].socket)) { + pprintf(p, "Unix acc : %s\nSystem/OS : %s\n", + con[parray[p1].socket].user, + con[parray[p1].socket].sys); + } + } + +#endif + + if (parray[p1].num_plan) { + pprintf(p, "\n"); + for (i = 0; i < parray[p1].num_plan; i++) + pprintf(p, "%2d: %s\n", i + 1, (parray[p1].planLines[i] != NULL) ? parray[p1].planLines[i] : ""); + } + if (!connected) + player_remove(p1); + return COM_OK; +} + +PUBLIC int com_variables(int p, param_list param) +{ + int p1, connected; + int i; + + if (!FindPlayer(p, ¶m[0], &p1, &connected)) + return COM_OK; + + pprintf(p, "Variable settings of %s:\n", parray[p1].name); +/* if (parray[p1].fullName) + pprintf(p, " Realname: %s\n", parray[p1].fullName); +*/ + if (parray[p1].uscfRating) + pprintf(p, " USCF: %d\n", parray[p1].uscfRating); + pprintf(p, " time=%-3d inc=%-3d private=%d Lang=%s\n", + parray[p1].d_time, parray[p1].d_inc, parray[p1].private, + Language(parray[p1].language)); + pprintf(p, " rated=%d ropen=%d open=%d simopen=%d\n", + parray[p1].rated, parray[p1].ropen, parray[p1].open, parray[p1].sopen); + pprintf(p, " shout=%d cshout=%d kib=%d tell=%d notifiedby=%d\n", + parray[p1].i_shout, parray[p1].i_cshout, parray[p1].i_kibitz, parray[p1].i_tell, parray[p1].notifiedby); + pprintf(p, " pin=%d gin=%d style=%-3d flip=%d\n", + parray[p1].i_login, parray[p1].i_game, parray[p1].style + 1, parray[p1].flip); + pprintf(p, " highlight=%d bell=%d auto=%d mailmess=%d pgn=%d\n", + parray[p1].highlight, parray[p1].bell, parray[p1].automail, parray[p1].i_mailmess, parray[p1].pgn); + pprintf(p, " width=%-3d height=%-3d\n", + parray[p1].d_width, parray[p1].d_height); + if (parray[p1].prompt && parray[p1].prompt != def_prompt) + pprintf(p, " Prompt: %s\n", parray[p1].prompt); + + { /* added code to print channels */ + int count = 0; + for (i = 0; i < MAX_CHANNELS; i++) { + if (on_channel(i, p1)) { + if (!count) + pprintf(p, "\n Channels:"); + pprintf(p, " %d", i); + count++; + } + } + if (count) + pprintf(p, "\n"); + } +/* if (parray[p1].numAlias && (p == p1)) { + pprintf(p, "\n Aliases:\n"); + for (i = 0; i < parray[p1].numAlias; i++) { + pprintf(p, " %s %s\n", parray[p1].alias_list[i].comm_name, + parray[p1].alias_list[i].alias); + } + } +*/ + if (parray[p1].num_formula) { + pprintf(p, "\n"); + for (i = 0; i < parray[p1].num_formula; i++) { + if (parray[p1].formulaLines[i] != NULL) + pprintf(p, " f%d: %s\n", i + 1, parray[p1].formulaLines[i]); + else + pprintf(p, " f%d:\n", i + 1); + } + } + if (parray[p1].formula != NULL) + pprintf(p, "\nFormula: %s\n", parray[p1].formula); + + if (!connected) + player_remove(p1); + return COM_OK; +} + +PUBLIC int com_password(int p, param_list param) +{ + char *oldpassword = param[0].val.word; + char *newpassword = param[1].val.word; + char salt[3]; + + if (!parray[p].registered) { + pprintf(p, "Setting a password is only for registered players.\n"); + return COM_OK; + } + if (parray[p].passwd) { + salt[0] = parray[p].passwd[0]; + salt[1] = parray[p].passwd[1]; + salt[2] = '\0'; + if (strcmp(crypt(oldpassword, salt), parray[p].passwd)) { + pprintf(p, "Incorrect password, password not changed!\n"); + return COM_OK; + } + rfree(parray[p].passwd); + parray[p].passwd = NULL; + } + salt[0] = 'a' + rand() % 26; + salt[1] = 'a' + rand() % 26; + salt[2] = '\0'; + parray[p].passwd = strdup(crypt(newpassword, salt)); + pprintf(p, "Password changed to \"%s\".\n", newpassword); + return COM_OK; +} + +PUBLIC int com_uptime(int p, param_list param) +{ + unsigned long uptime = time(0) - startuptime; + struct rusage ru; + 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", fics_hostname,VERS_NUM); + pprintf(p, "The server has been up since %s.\n", strltime(&startuptime)); + if ((days==0) && (hours==0) && (mins==0)) { + pprintf(p, "(Up for %d second%s)\n", + secs, (secs==1) ? "" : "s"); + } else if ((days==0) && (hours==0)) { + pprintf(p, "(Up for %d minute%s and %d second%s)\n", + mins, (mins==1) ? "" : "s", + secs, (secs==1) ? "" : "s"); + } else if (days==0) { + pprintf(p, "(Up for %d hour%s, %d minute%s and %d second%s)\n", + hours, (hours==1) ? "" : "s", + mins, (mins==1) ? "" : "s", + secs, (secs==1) ? "" : "s"); + } else { + pprintf(p, "(Up for %d day%s, %d hour%s, %d minute%s and %d second%s)\n", + days, (days==1) ? "" : "s", + hours, (hours==1) ? "" : "s", + mins, (mins==1) ? "" : "s", + secs, (secs==1) ? "" : "s"); + } + pprintf(p, "\nAllocs: %u Frees: %u Allocs In Use: %u\n", + malloc_count, free_count, malloc_count - free_count); + if (parray[p].adminLevel >= ADMIN_ADMIN) { + pprintf(p, "\nplayer size:%d, game size:%d, con size:%d, g_num:%d\n", + sizeof(player), sizeof(game), net_consize(), g_num); + getrusage(RUSAGE_SELF, &ru); + pprintf(p, "pagesize = %d, maxrss = %d, total = %d\n", getpagesize(), ru.ru_maxrss, getpagesize() * ru.ru_maxrss); + } + pprintf(p, "\nPlayer limit: %d\n", max_connections); + pprintf(p, "\nThere are currently %d players, with a high of %d since last restart.\n", player_count(), player_high); + pprintf(p, "There are currently %d games, with a high of %d since last restart.\n", game_count(), game_high); + pprintf(p, "\nCompiled on %s\n", COMP_DATE); + return COM_OK; +} + +PUBLIC int com_date(int p, param_list param) +{ + int t = time(0); + pprintf(p, "Local time - %s\n", strltime(&t)); + pprintf(p, "Greenwich time - %s\n", strgtime(&t)); + return COM_OK; +} + +char *inout_string[] = { + "login", "logout" +}; + +PRIVATE int plogins(p, fname) +int p; +char *fname; +{ + FILE *fp; + int inout, thetime, registered; + char loginName[MAX_LOGIN_NAME + 1]; + char ipstr[20]; + + fp = fopen(fname, "r"); + if (!fp) { + pprintf(p, "Sorry, no login information available.\n"); + return COM_OK; + } + while (!feof(fp)) { + if (fscanf(fp, "%d %s %d %d %s\n", &inout, loginName, &thetime, + ®istered, ipstr) != 5) { + fprintf(stderr, "FICS: Error in login info format. %s\n", fname); + fclose(fp); + return COM_OK; + } + pprintf(p, "%s: %-17s %-6s", strltime(&thetime), loginName, + inout_string[inout]); + if (parray[p].adminLevel > 0) { + pprintf(p, " from %s\n", ipstr); + } else + pprintf(p, "\n"); + } + fclose(fp); + return COM_OK; +} + +PUBLIC int com_llogons(int p, param_list param) +{ + char fname[MAX_FILENAME_SIZE]; + + sprintf(fname, "%s/%s", stats_dir, STATS_LOGONS); + return plogins(p, fname); +} + +PUBLIC int com_logons(int p, param_list param) +{ + char fname[MAX_FILENAME_SIZE]; + + if (param[0].type == TYPE_WORD) { + sprintf(fname, "%s/player_data/%c/%s.%s", stats_dir, param[0].val.word[0], param[0].val.word, STATS_LOGONS); + } else { + sprintf(fname, "%s/player_data/%c/%s.%s", stats_dir, parray[p].login[0], parray[p].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 + +PRIVATE void who_terse(int p, int num, int *plist, int type) +{ + char ptmp[80 + 20]; /* for highlight */ + multicol *m = multicol_start(PARRAY_SIZE); + int i; + int p1; + int rat; + + /* altered DAV 3/15/95 */ + + for (i = 0; i < num; i++) { + p1 = plist[i]; + if (type == blitz_rat) + rat = parray[p1].b_stats.rating; + if (type == wild_rat) + rat = parray[p1].w_stats.rating; + if (type == std_rat) + rat = parray[p1].s_stats.rating; + + if (type == none) { + sprintf(ptmp, " "); + } else { + sprintf(ptmp, "%-4s", ratstrii(rat, parray[p1].registered)); + if (parray[p1].simul_info.numBoards) { + strcat(ptmp, "~"); + } else if ((parray[p1].game >= 0) && (garray[parray[p1].game].status == GAME_EXAMINE)) { + strcat(ptmp, "#"); + } else if (parray[p1].game >= 0) { + strcat(ptmp, "^"); + } else if (!parray[p1].open) { + strcat(ptmp, ":"); + } else if (player_idle(p1) > 300) { + strcat(ptmp, "."); + } else { + strcat(ptmp, " "); + } + } + if (p == p1) { + psprintf_highlight(p, ptmp + strlen(ptmp), "%s", parray[p1].name); + } else { + strcat(ptmp, parray[p1].name); + } + if ((parray[p1].adminLevel >= 10) && (parray[p1].i_admin)) + strcat(ptmp, "(*)"); + if (in_list("computer", parray[p1].name)) + strcat(ptmp, "(C)"); +/* grimm's fishlist + if (in_list("fish", parray[p1].name)) strcat(ptmp, "(Fish)"); +*/ + if (in_list("fm", parray[p1].name)) + strcat(ptmp, "(FM)"); + if (in_list("im", parray[p1].name)) + strcat(ptmp, "(IM)"); + if (in_list("gm", parray[p1].name)) + strcat(ptmp, "(GM)"); + if (in_list("td", parray[p1].name)) + strcat(ptmp, "(TD)"); + multicol_store(m, ptmp); + } + multicol_pprint(m, p, 80, 2); + multicol_end(m); + pprintf(p, "\n %d Players displayed (of %d). (*) indicates system administrator.\n", num, player_count()); +} + +PRIVATE void who_verbose(p, num, plist) +int p; +int num; +int plist[]; +{ + int i, p1; + char playerLine[255], tmp[255]; /* +8 for highlight */ + + 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 (parray[p1].game >= 0) + sprintf(tmp, "%3d", parray[p1].game + 1); + else + sprintf(tmp, " "); + strcat(playerLine, tmp); + + if (!parray[p1].open) + sprintf(tmp, "X"); + else + sprintf(tmp, " "); + strcat(playerLine, tmp); + + if (parray[p1].registered) + if (parray[p1].rated) { + sprintf(tmp, " "); + } else { + sprintf(tmp, "u"); + } + else + sprintf(tmp, "U"); + strcat(playerLine, tmp); + + /* Modified by DAV 3/15/95 */ + if (p == p1) { + strcpy(tmp, " "); + psprintf_highlight(p, tmp + strlen(tmp), "%-17s", parray[p1].name); + } else { + sprintf(tmp, " %-17s", parray[p1].name); + } + strcat(playerLine, tmp); + + sprintf(tmp, " %4s %-4s %5s ", + ratstrii(parray[p1].s_stats.rating, parray[p1].registered), + ratstrii(parray[p1].b_stats.rating, parray[p1].registered), + 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" + ); +} + +PRIVATE void who_winloss(p, num, plist) +int p; +int num; +int plist[]; +{ + int i, p1; + char playerLine[255], tmp[255]; /* for highlight */ + + pprintf(p, + "Name Stand win loss draw Blitz win loss draw idle\n" + ); + pprintf(p, + "---------------- ----- ------------- ----- ------------- ----\n" + ); + + for (i = 0; i < num; i++) { + p1 = plist[i]; + if (p1 == p) { + psprintf_highlight(p, playerLine, "%-17s", parray[p1].name); + } else { + sprintf(playerLine, "%-17s", parray[p1].name); + } + sprintf(tmp, " %4s %4d %4d %4d ", + ratstrii(parray[p1].s_stats.rating, parray[p1].registered), + (int) parray[p1].s_stats.win, + (int) parray[p1].s_stats.los, + (int) parray[p1].s_stats.dra); + strcat(playerLine, tmp); + + sprintf(tmp, "%4s %4d %4d %4d ", + ratstrii(parray[p1].b_stats.rating, parray[p1].registered), + (int) parray[p1].b_stats.win, + (int) parray[p1].b_stats.los, + (int) 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); +} + +PRIVATE int who_ok(p, sel_bits) +int p; +unsigned int sel_bits; +{ + if (parray[p].status != PLAYER_PROMPT) + return 0; + if (sel_bits == 0xff) + return 1; + if (sel_bits & WHO_OPEN) + if (!parray[p].open) + return 0; + if (sel_bits & WHO_CLOSED) + if (parray[p].open) + return 0; + if (sel_bits & WHO_RATED) + if (!parray[p].rated) + return 0; + if (sel_bits & WHO_UNRATED) + if (parray[p].rated) + return 0; + if (sel_bits & WHO_FREE) + if (parray[p].game >= 0) + return 0; + if (sel_bits & WHO_PLAYING) + if (parray[p].game < 0) + return 0; + if (sel_bits & WHO_REGISTERED) + if (!parray[p].registered) + return 0; + if (sel_bits & WHO_UNREGISTERED) + if (parray[p].registered) + return 0; + return 1; +} + + +PRIVATE int blitz_cmp(const void *pp1, const void *pp2) +{ + register int p1 = *(int *) pp1; + register int p2 = *(int *) pp2; + if (parray[p1].status != PLAYER_PROMPT) { + if (parray[p2].status != PLAYER_PROMPT) + return 0; + else + return -1; + } + if (parray[p2].status != PLAYER_PROMPT) + return 1; + if (parray[p1].b_stats.rating > parray[p2].b_stats.rating) + return -1; + if (parray[p1].b_stats.rating < parray[p2].b_stats.rating) + return 1; + if (parray[p1].registered > parray[p2].registered) + return -1; + if (parray[p1].registered < parray[p2].registered) + return 1; + return strcmp(parray[p1].login, parray[p2].login); +} + +PRIVATE int stand_cmp(const void *pp1, const void *pp2) +{ + register int p1 = *(int *) pp1; + register int p2 = *(int *) pp2; + if (parray[p1].status != PLAYER_PROMPT) { + if (parray[p2].status != PLAYER_PROMPT) + return 0; + else + return -1; + } + if (parray[p2].status != PLAYER_PROMPT) + return 1; + if (parray[p1].s_stats.rating > parray[p2].s_stats.rating) + return -1; + if (parray[p1].s_stats.rating < parray[p2].s_stats.rating) + return 1; + if (parray[p1].registered > parray[p2].registered) + return -1; + if (parray[p1].registered < parray[p2].registered) + return 1; + return strcmp(parray[p1].login, parray[p2].login); +} + +PRIVATE int wild_cmp(const void *pp1, const void *pp2) +{ + register int p1 = *(int *) pp1; + register int p2 = *(int *) pp2; + if (parray[p1].status != PLAYER_PROMPT) { + if (parray[p2].status != PLAYER_PROMPT) + return 0; + else + return -1; + } + if (parray[p2].status != PLAYER_PROMPT) + return 1; + if (parray[p1].w_stats.rating > parray[p2].w_stats.rating) + return -1; + if (parray[p1].w_stats.rating < parray[p2].w_stats.rating) + return 1; + if (parray[p1].registered > parray[p2].registered) + return -1; + if (parray[p1].registered < parray[p2].registered) + return 1; + return strcmp(parray[p1].login, parray[p2].login); +} + +PRIVATE int alpha_cmp(const void *pp1, const void *pp2) +{ + register int p1 = *(int *) pp1; + register int p2 = *(int *) pp2; + if (parray[p1].status != PLAYER_PROMPT) { + if (parray[p2].status != PLAYER_PROMPT) + return 0; + else + return -1; + } + if (parray[p2].status != PLAYER_PROMPT) + return 1; + return strcmp(parray[p1].login, parray[p2].login); +} + +PUBLIC void sort_players(int players[PARRAY_SIZE], + int ((*cmp_func) (const void *, const void *))) +{ + int i; + + for (i = 0; i < p_num; i++) { + players[i] = i; + } + qsort(players, p_num, sizeof(int), cmp_func); +} + +/* This is the of the most compliclicated commands in terms of parameters */ +PUBLIC int com_who(int p, param_list param) +{ + int style = 0; + float stop_perc = 1.0; + float start_perc = 0; + unsigned int sel_bits = 0xff; + int sortlist[PARRAY_SIZE], plist[PARRAY_SIZE]; + int ((*cmp_func) (const void *, const void *)) = blitz_cmp; + int startpoint; + int stoppoint; + int i, len; + int tmpI, tmpJ; + char c; + int p1, count, num_who; + int sort_type = blitz_rat; + + if (param[0].type == TYPE_WORD) { + len = strlen(param[0].val.word); + for (i = 0; i < len; i++) { + c = param[0].val.word[i]; + if (isdigit(c)) { + if (i == 0 || !isdigit(param[0].val.word[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.word[i + 1]))) + return COM_BADPARAMETERS; + } else { + tmpI = c - '0'; + tmpJ = param[0].val.word[i - 1] - '0'; + if (tmpI == 0) + return COM_BADPARAMETERS; + if (tmpJ > tmpI) + return COM_BADPARAMETERS; + start_perc = ((float) tmpJ - 1.0) / (float) tmpI; + stop_perc = ((float) tmpJ) / (float) tmpI; + } + } else { + switch (c) { + case 'o': + if (sel_bits == 0xff) + sel_bits = WHO_OPEN; + else + sel_bits |= WHO_OPEN; + break; + case 'r': + if (sel_bits == 0xff) + sel_bits = WHO_RATED; + else + sel_bits |= WHO_RATED; + break; + case 'f': + if (sel_bits == 0xff) + sel_bits = WHO_FREE; + else + sel_bits |= WHO_FREE; + break; + case 'a': + if (sel_bits == 0xff) + sel_bits = WHO_FREE | WHO_OPEN; + else + sel_bits |= (WHO_FREE | WHO_OPEN); + break; + case 'R': + if (sel_bits == 0xff) + 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 't': /* format */ + style = 0; + break; + case 'v': /* format */ + style = 1; + break; + case 'n': /* format */ + style = 2; + break; + case 'U': + if (sel_bits == 0xff) + sel_bits = WHO_UNREGISTERED; + else + sel_bits |= WHO_UNREGISTERED; + break; + default: + return COM_BADPARAMETERS; + break; + } + } + } + } + sort_players(sortlist, cmp_func); + count = 0; + for (p1 = 0; p1 < 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 < 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: + return COM_BADPARAMETERS; + break; + } + return COM_OK; +} + +PUBLIC int com_refresh(int p, param_list param) +{ + int g, p1; + + if (param[0].type == TYPE_NULL) { + if (parray[p].game >= 0) { + send_board_to(parray[p].game, p); + } else { /* Do observing in here */ + if (parray[p].num_observe) { + for (g = 0; g < parray[p].num_observe; g++) { + send_board_to(parray[p].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 >= g_num) || ((garray[g].status != GAME_ACTIVE) + && (garray[g].status != GAME_EXAMINE))) { + pprintf(p, "No such game.\n"); + } else if (garray[g].private && parray[p].adminLevel==ADMIN_USER) { + pprintf (p, "Sorry, game %d is a private game.\n", g+1); + } else { + if (garray[g].private) + pprintf(p, "Refreshing PRIVATE game %d\n", g+1); + send_board_to(g, p); + } + } + return COM_OK; +} + +PUBLIC int com_open(int p, param_list param) +{ + int retval; + ASSERT(param[0].type == TYPE_NULL); + if ((retval = pcommand(p, "set open")) != COM_OK) + return retval; + else + return COM_OK_NOPROMPT; +} + +PUBLIC int com_simopen(int p, param_list param) +{ + int retval; + ASSERT(param[0].type == TYPE_NULL); + if ((retval = pcommand(p, "set simopen")) != COM_OK) + return retval; + else + return COM_OK_NOPROMPT; +} + +PUBLIC int com_bell(int p, param_list param) +{ + int retval; + ASSERT(param[0].type == TYPE_NULL); + if ((retval = pcommand(p, "set bell")) != COM_OK) + return retval; + else + return COM_OK_NOPROMPT; +} + +PUBLIC int com_flip(int p, param_list param) +{ + int retval; + ASSERT(param[0].type == TYPE_NULL); + if ((retval = pcommand(p, "set flip")) != COM_OK) + return retval; + else + return COM_OK_NOPROMPT; +} + +PUBLIC int com_highlight(int p, param_list param) +{ + pprintf(p, "Obsolete command. Please do set highlight <0-15>.\n"); + return COM_OK; +} + +PUBLIC int com_style(int p, param_list param) +{ + int retval; + ASSERT(param[0].type == TYPE_INT); + if ((retval = pcommand(p, "set style %d", param[0].val.integer)) != COM_OK) + return retval; + else + return COM_OK_NOPROMPT; +} + +PUBLIC int com_promote(int p, param_list param) +{ + int retval; + ASSERT(param[0].type == TYPE_WORD); + if ((retval = pcommand(p, "set promote %s", param[0].val.word)) != COM_OK) + return retval; + else + return COM_OK_NOPROMPT; +} + +PUBLIC int com_alias(int p, param_list param) +{ + int al; + + if (param[0].type == TYPE_NULL) { + for (al = 0; al < parray[p].numAlias; al++) { + pprintf(p, "%s -> %s\n", parray[p].alias_list[al].comm_name, + parray[p].alias_list[al].alias); + } + return COM_OK; + } + al = alias_lookup(param[0].val.word, parray[p].alias_list, parray[p].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", parray[p].alias_list[al].comm_name, + parray[p].alias_list[al].alias); + } + } else { + if (al < 0) { + if (parray[p].numAlias >= MAX_ALIASES - 1) { + pprintf(p, "You have your maximum of %d aliases.\n", MAX_ALIASES - 1); + } else { + + if (!strcmp(param[0].val.string, "quit")) { /* making sure they + can't alias quit */ + pprintf(p, "You can't alias this command.\n"); + } else if (!strcmp(param[0].val.string, "unalias")) { /* making sure they + can't alias unalias + :) */ + pprintf(p, "You can't alias this command.\n"); + } else { + parray[p].alias_list[parray[p].numAlias].comm_name = + strdup(param[0].val.word); + parray[p].alias_list[parray[p].numAlias].alias = + strdup(param[1].val.string); + parray[p].numAlias++; + pprintf(p, "Alias set.\n"); + + } + } + } else { + rfree(parray[p].alias_list[al].alias); + parray[p].alias_list[al].alias = strdup(param[1].val.string); + pprintf(p, "Alias replaced.\n"); + } + parray[p].alias_list[parray[p].numAlias].comm_name = NULL; + } + return COM_OK; +} + +PUBLIC int com_unalias(int p, param_list param) +{ + int al; + int i; + + ASSERT(param[0].type == TYPE_WORD); + al = alias_lookup(param[0].val.word, parray[p].alias_list, parray[p].numAlias); + if (al < 0) { + pprintf(p, "You have no alias named '%s'.\n", param[0].val.word); + } else { + rfree(parray[p].alias_list[al].comm_name); + rfree(parray[p].alias_list[al].alias); + for (i = al; i < parray[p].numAlias; i++) { + parray[p].alias_list[i].comm_name = parray[p].alias_list[i + 1].comm_name; + parray[p].alias_list[i].alias = parray[p].alias_list[i + 1].alias; + } + parray[p].numAlias--; + parray[p].alias_list[parray[p].numAlias].comm_name = NULL; + pprintf(p, "Alias removed.\n"); + } + return COM_OK; +} + +PUBLIC int com_servers(int p, param_list param) +{ +/* + int i; + + ASSERT(param[0].type == TYPE_NULL); + if (numServers == 0) { + */ pprintf(p, "There are no other servers known to this server.\n"); + return COM_OK; +} + /* pprintf(p, "There are %d known servers.\n", numServers); pprintf(p, "(Not + all of these may be active)\n"); pprintf(p, "%-30s%-7s\n", "HOST", + "PORT"); for (i = 0; i < numServers; i++) pprintf(p, "%-30s%-7d\n", + serverNames[i], serverPorts[i]); return COM_OK; } */ + +PUBLIC int com_index(int p, param_list param) +{ + int i; + char index_default[] = "_index"; + char *iwant, *filenames[100]; /* enough for all index filenames */ + + if (param[0].type == TYPE_NULL) { + iwant = index_default; + } else { + iwant = param[0].val.word; + if (!safestring(iwant)) { + pprintf(p, "Illegal character in category %s.\n", iwant); + return COM_OK; + } + } + + i = search_directory(index_dir, iwant, filenames, 1000); + if (i == 0) { + pprintf(p, "No index entry for \"%s\".\n", iwant); + } else if ((i == 1) || !strcmp(*filenames, iwant)) { + if (psend_file(p, index_dir, *filenames)) { + /* we should never reach this unless the file was just deleted */ + pprintf(p, "Index file %s could not be found! ", *filenames); + pprintf(p, "Please inform an admin of this. Thank you.\n"); + } + } else { + pprintf(p, "Matches:"); + display_directory(p, filenames, i); + } + return COM_OK; +} + +PUBLIC int com_help(int p, param_list param) +{ + int i, UseLang = parray[p].language; + char help_default[] = "_help"; + char *iwant, *filenames[1000]; /* enough for all helpfile names */ + + if (param[0].type == TYPE_NULL) { + iwant = help_default; + } else { + iwant = param[0].val.word; + if (!safestring(iwant)) { + pprintf(p, "Illegal character in command %s.\n", iwant); + return COM_OK; + } + } + i = search_directory(help_dir[UseLang], iwant, filenames, 1000); + if (i == 0) { + if (UseLang != LANG_DEFAULT) { + i += search_directory(help_dir[LANG_DEFAULT], iwant, filenames, 1000); + if (i > 0) { + pprintf(p, "No help available in %s; using %s instead.\n", + Language(UseLang), Language(LANG_DEFAULT)); + UseLang = LANG_DEFAULT; + } + } + if (i==0) { + pprintf(p, "No help available on \"%s\".\n", iwant); + return COM_OK; + } + } + if ((i == 1) || !strcmp(*filenames, iwant)) { + if (psend_file(p, help_dir[UseLang], *filenames)) { + /* we should never reach this unless the file was just deleted */ + pprintf(p, "Helpfile %s could not be found! ", *filenames); + pprintf(p, "Please inform an admin of this. Thank you.\n"); + } + } else { + pprintf(p, "Matches:"); + display_directory(p, filenames, i); + pprintf(p, "[Type \"info\" for a list of FICS general information files.]\n"); + } + return COM_OK; +} + +PUBLIC int com_info(int p, param_list param) +{ + int n; + char *filenames[1000]; + + if ((n = search_directory(info_dir, NULL, filenames, 1000)) > 0) + display_directory(p, filenames, n); + return COM_OK; +} + +PUBLIC int com_adhelp(int p, param_list param) +{ + int i; + static char nullify = '\0'; + char *iwant, *filenames[1000]; /* enough for all helpfile names */ + + if (param[0].type == TYPE_NULL) { + iwant = &nullify; + } else { + iwant = param[0].val.word; + if (!safestring(iwant)) { + pprintf(p, "Illegal character in command %s.\n", iwant); + return COM_OK; + } + } + + i = search_directory(adhelp_dir, iwant, filenames, 1000); + if (i == 0) { + pprintf(p, "No help available on \"%s\".\n", iwant); + } else if ((i == 1) || !strcmp(*filenames, iwant)) { + if (psend_file(p, adhelp_dir, *filenames)) { + /* we should never reach this unless the file was just deleted */ + pprintf(p, "Helpfile %s could not be found! ", *filenames); + pprintf(p, "Please inform an admin of this. Thank you.\n"); + } + } else { + if (*iwant) + pprintf(p, "Matches:\n"); + display_directory(p, filenames, i); + } + return COM_OK; +} + +PUBLIC int com_mailsource(int p, param_list param) +{ + static char nullify = '\0'; + char *iwant, *buffer[1000]; + char subj[81], fname[MAX_FILENAME_SIZE]; + int count; + + if (!parray[p].registered) { + pprintf(p, "Only registered people can use the mailsource command.\n"); + return COM_OK; + } + + if (param[0].type == TYPE_NULL) { + iwant = &nullify; + } else { + iwant = param[0].val.word; + } + + count = search_directory(source_dir, iwant, buffer, 1000); + if (count == 0) { + pprintf(p, "Found no source file matching \"%s\".\n", iwant); + } else if ((count == 1) || !strcmp(iwant, *buffer)) { + sprintf(subj, "FICS source file from server %s: %s",fics_hostname,*buffer); + sprintf(fname, "%s/%s",source_dir, *buffer); + mail_file_to_user (p, subj, fname); + pprintf(p, "Source file %s sent to %s\n", *buffer, parray[p].emailAddress); + } else { + pprintf(p, "Found %d source files matching that:\n", count); + if (*iwant) + display_directory(p, buffer, count); + else { /* this junk is to get *.c *.h */ + multicol *m = multicol_start(count); + char *s; + int i; + for (i=0; i < count; i++) { + if (((s = buffer[i] + strlen(buffer[i]) - 2) >= buffer[i]) && (!strcmp(s, ".c") || !strcmp(s, ".h"))) + multicol_store(m, buffer[i]); + } + multicol_pprint(m, p, 78, 1); + multicol_end(m); + } + } + return COM_OK; +} + +PUBLIC int com_mailhelp(int p, param_list param) +{ /* Sparky */ + char subj[81], fname[MAX_FILENAME_SIZE]; + char *iwant, *buffer[1000]; + + int count; + static char nullify = '\0'; + + if (!parray[p].registered) { + pprintf(p, "Only registered people can use the mailhelp command.\n"); + return COM_OK; + } + if (param[0].type == TYPE_NULL) + iwant = &nullify; + else + iwant = param[0].val.word; + + count = search_directory(help_dir[parray[p].language], iwant, buffer, 1000); + if (count == 0) { + pprintf(p, "Found no help file matching \"%s\".\n", iwant); + } else if (count == 1) { + sprintf(subj, "FICS help file from server %s: %s", fics_hostname, *buffer); + sprintf(fname, "%s/%s",help_dir[parray[p].language], *buffer); + mail_file_to_user (p, subj, fname); + pprintf(p, "Help file %s sent to %s\n", *buffer, parray[p].emailAddress); + } else { + pprintf(p, "Found %d helpfiles matching that:\n", count); + display_directory(p, buffer, count); + } + + return COM_OK; +} + +PUBLIC 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; +} + +PUBLIC int com_getpi(int p, param_list param) +{ + int p1; + + if (!in_list("td", parray[p].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) || (parray[p1].registered == 0)) { + /* Darkside suggested not to return anything */ + return COM_OK; + } + if (!parray[p1].registered) { + pprintf(p, "*getpi %s -1 -1 -1*\n", parray[p1].name); + } else { + pprintf(p, "*getpi %s %d %d %d*\n", parray[p1].name, + parray[p1].w_stats.rating, + parray[p1].b_stats.rating, + parray[p1].s_stats.rating); + } + return COM_OK; +} + +PUBLIC int com_getps(int p, param_list param) +{ + int p1; + + if ((((p1 = player_find_bylogin(param[0].val.word)) < 0) || (parray[p1].registered == 0)) || (parray[p1].game < 0)) { + pprintf(p, "*status %s 1*\n", param[0].val.word); + return COM_OK; + } + pprintf(p, "*status %s 0 %s*\n", parray[p1].name, parray[(parray[p1].opponent)].name); + return COM_OK; +} +PUBLIC int com_limits(int p, param_list param) +{ + pprintf(p, "\nCurrent hardcoded limits:\n"); + pprintf(p, " Max number of players: %d\n", MAX_PLAYER); + 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 aliases: %d\n", MAX_ALIASES - 1); + pprintf(p, " Max number of games you can observe at a time: %d\n", MAX_OBSERVE); + pprintf(p, " Max number of requests pending: %d\n", MAX_PENDING); + 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); + pprintf(p, "\nAdmin settable limits:\n"); + pprintf(p, " Quota list gives two shouts per %d seconds.\n", quota_time); + return COM_OK; +} diff --git a/FICS/comproc.h b/FICS/comproc.h new file mode 100644 index 0000000..20c68d4 --- /dev/null +++ b/FICS/comproc.h @@ -0,0 +1,74 @@ +/* comproc.h + * + */ + +/* + 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 + (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. +*/ + +/* Revision history: + name email yy/mm/dd Change + Richard Nash 93/10/22 Created +*/ + +#ifndef _COMPROC_H +#define _COMPROC_H + +extern const none; /* = 0; */ +extern const blitz_rat; /* = 1; */ +extern const std_rat; /* = 2; */ +extern const wild_rat; /* = 3; */ +extern const light_rat; +extern int com_rating_recalc(); +extern int com_more(); +extern void rscan_news(FILE *, int, int); +extern void rscan_news2(FILE *, int, int); +extern int num_news; /* The number of news items in the index file. */ + +extern int com_quit(); +extern int com_index(); +extern int com_help(); +extern int com_info(); +extern int com_adhelp(); +extern int com_uscf(); +extern int com_set(); +extern int FindPlayer(); +extern int com_stats(); +extern int com_password(); +extern int com_uptime(); +extern int com_date(); +extern int com_llogons(); +extern int com_logons(); +extern int com_who(); +extern int com_refresh(); +extern int com_prefresh(); +extern int com_open(); +extern int com_simopen(); +extern int com_bell(); +extern int com_flip(); +extern int com_highlight(); +extern int com_style(); +extern int com_promote(); +extern int com_alias(); +extern int com_unalias(); +extern int com_servers(); +extern int com_mailsource(); +extern int com_mailhelp(); +extern int com_handles(); +extern int com_news(); +extern int com_getpi(); +extern int com_getps(); +extern int com_limits(); + +#endif /* _COMPROC_H */ diff --git a/FICS/comproc.old.c b/FICS/comproc.old.c new file mode 100644 index 0000000..92386ed --- /dev/null +++ b/FICS/comproc.old.c @@ -0,0 +1,3394 @@ +/* comproc.c + * + */ + +/* + 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 + (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. +*/ + +/* Revision history: + name email yy/mm/dd Change + Richard Nash 93/10/22 Created + foxbat 95/03/11 added filters in cmatch. +*/ + +#include "stdinclude.h" + +#include "common.h" +#include "comproc.h" +#include "command.h" +#include "utils.h" +#include "ficsmain.h" +#include "config.h" +#include "playerdb.h" +#include "network.h" +#include "rmalloc.h" +#include "channel.h" +#include "variable.h" +#include "gamedb.h" +#include "gameproc.h" +#include "board.h" +/* #include "hostinfo.h" */ +#include "multicol.h" +#include "ratings.h" +#include "formula.h" +#include "lists.h" +#include "eco.h" +#include + +#include + +/* grimm */ +#if defined(SGI) +#else +/* int system(char *arg); */ +#endif + +const none = 0; +const blitz_rat = 1; +const std_rat = 2; +const wild_rat = 3; + +int quota_time; + +PUBLIC int com_rating_recalc(int p, param_list param) +{ + ASSERT(parray[p].adminLevel >= ADMIN_ADMIN); + rating_recalc(); + return COM_OK; +} + +PUBLIC int com_more(int p, param_list param) +{ +/* in_push(IN_HELP); */ + pmore_file(p); + return COM_OK; +} + +PUBLIC int com_news(int p, param_list param) +{ + FILE *fp; + char filename[MAX_FILENAME_SIZE]; + char junk[MAX_LINE_SIZE]; + char *junkp; + int crtime; + char count[10]; + int flag, len; + + if (((param[0].type == 0) || (!strcmp(param[0].val.word, "all")))) { + +/* no params - then just display index over news */ + + pprintf(p, "\n **** BULLETIN BOARD ****\n\n"); + sprintf(filename, "%s/news.index", news_dir); + fp = fopen(filename, "r"); + if (!fp) { + fprintf(stderr, "Can't find news index.\n"); + return COM_OK; + } + flag = 0; + while (!feof(fp)) { + junkp = junk; + fgets(junk, MAX_LINE_SIZE, fp); + if (feof(fp)) + break; + if ((len = strlen(junk)) > 1) { + junk[len - 1] = '\0'; + sscanf(junkp, "%d %s", &crtime, count); + junkp = nextword(junkp); + junkp = nextword(junkp); + if (((param[0].type == TYPE_WORD) && (!strcmp(param[0].val.word, "all")))) { + pprintf(p, "%3s (%s) %s\n", count, strltime(&crtime), junkp); + flag = 1; + } else { + if ((crtime - player_lastconnect(p)) > 0) { + pprintf(p, "%3s (%s) %s\n", count, strltime(&crtime), junkp); + flag = 1; + } + } + } + } + fclose(fp); + crtime = player_lastconnect(p); + if (!flag) { + pprintf(p, "There are no news since your last login (%s).\n", strltime(&crtime)); + } else { + pprintf(p, "\n"); + } + } else { + +/* check if the specific news file exist in index */ + + sprintf(filename, "%s/news.index", news_dir); + fp = fopen(filename, "r"); + if (!fp) { + fprintf(stderr, "Can't find news index.\n"); + return COM_OK; + } + flag = 0; + while ((!feof(fp)) && (!flag)) { + junkp = junk; + fgets(junk, MAX_LINE_SIZE, fp); + if (feof(fp)) + break; + if ((len = strlen(junk)) > 1) { + junk[len - 1] = '\0'; + sscanf(junkp, "%d %s", &crtime, count); + if (!strcmp(count, param[0].val.word)) { + flag = 1; + junkp = nextword(junkp); + junkp = nextword(junkp); + pprintf(p, "\nNEWS %3s (%s)\n\n %s\n\n", count, strltime(&crtime), junkp); + } + } + } + fclose(fp); + if (!flag) { + pprintf(p, "Bad index number!\n"); + return COM_OK; + } +/* file exists - show it */ + + sprintf(filename, "%s/news.%s", news_dir, param[0].val.word); + fp = fopen(filename, "r"); + if (!fp) { + pprintf(p, "No more info.\n"); + return COM_OK; + } + fclose(fp); + sprintf(filename, "news.%s", param[0].val.word); + if (psend_file(p, news_dir, filename) < 0) { + pprintf(p, "Internal error - couldn't send news file!\n"); + } + } + return COM_OK; +} + +PUBLIC int com_quit(int p, param_list param) +{ + if ((parray[p].game >= 0) && (garray[parray[p].game].status == GAME_EXAMINE)) { + pcommand(p, "unexamine"); + } + + if (parray[p].game >= 0) { + 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_file(p, mess_dir, MESS_LOGOUT); + return COM_LOGOUT; +} + +/* + +PUBLIC int com_query(int p, param_list param) +{ + int p1; + int count = 0; + + if (!parray[p].registered) { + pprintf(p, "Only registered players can use the query command.\n"); + return COM_OK; + } + if (parray[p].muzzled) { + pprintf(p, "You are muzzled.\n"); + return COM_OK; + } + if (!printablestring(param[0].val.string)) { + pprintf(p, "Your message contains some unprintable character(s).\n"); + return COM_OK; + } + if (!parray[p].query_log) { + parray[p].query_log = tl_new(5); + } else { + if (tl_numinlast(parray[p].query_log, 60 * 60) >= 2) { + pprintf(p, "Your can only query twice per hour.\n"); + return COM_OK; + } + } + in_push(IN_SHOUT); + for (p1 = 0; p1 < p_num; p1++) { + if (p1 == p) + continue; + if (parray[p1].status != PLAYER_PROMPT) + continue; + if (player_censored(p1, p)) + continue; + count++; + if (parray[p1].highlight) { + pprintf_prompt(p1, "\n\033[7m%s queries:\033[0m %s\n", parray[p].name, + param[0].val.string); + } else { + pprintf_prompt(p1, "\n%s queries: %s\n", parray[p].name, + param[0].val.string); + } + } + pprintf(p, "Query heard by %d player(s).\n", count); + tl_logevent(parray[p].query_log, 1); + in_pop(); + return COM_OK; +} + +*/ + +int CheckShoutQuota(int p) +{ + int timenow = time(0); + int timeleft = 0; + if (in_list("quota", parray[p].name)) { + if ((timeleft = timenow - parray[p].lastshout_a) < quota_time) { + return (quota_time - timeleft); + } else { + return 0; + } + } else { + return 0; + } +} + +PUBLIC int com_shout(int p, param_list param) +{ + int p1; + int count = 0; + int timeleft; /* time left for quota if applicable */ + + if (!parray[p].registered) { + pprintf(p, "Only registered players can use the shout command.\n"); + return COM_OK; + } + if (parray[p].muzzled) { + pprintf(p, "You are muzzled.\n"); + return COM_OK; + } + if (param[0].type == TYPE_NULL) { + if (in_list("quota", parray[p].name)) { + pprintf(p, "[You are on the quota list.]\n"); + if ((timeleft = CheckShoutQuota(p))) { + pprintf(p, "Next shout available in %d seconds.\n", timeleft); + } else { + pprintf(p, "Your next shout is ready for use.\n"); + } + } else { + pprintf(p, "[You are not on the quota list.]\n"); + pprintf(p, "Please specify what it is you want to shout.\n"); + } + return COM_OK; + } + if ((timeleft = CheckShoutQuota(p))) { + pprintf(p, "[You are on the quota list.]\n"); + pprintf(p, "Shout not sent. Next shout in %d seconds.\n", timeleft); + return COM_OK; + } + parray[p].lastshout_a = parray[p].lastshout_b; + parray[p].lastshout_b = time(0); + if (!printablestring(param[0].val.string)) { + pprintf(p, "Your message contains some unprintable character(s).\n"); + return COM_OK; + } +/* in_push(IN_SHOUT); */ + for (p1 = 0; p1 < p_num; p1++) { + if (p1 == p) + continue; + if (parray[p1].status != PLAYER_PROMPT) + continue; + if (!parray[p1].i_shout) + continue; + if (player_censored(p1, p)) + continue; + count++; + pprintf_prompt(p1, "\n%s shouts: %s\n", parray[p].name, + param[0].val.string); + } + pprintf(p, "(%d) %s shouts: %s\n", count, parray[p].name, + param[0].val.string); +/* in_pop(); */ + if ((in_list("quota", parray[p].name)) && (timeleft = CheckShoutQuota(p))) { + pprintf(p, "[You are on the quota list.]\n"); + pprintf(p, "Next shout in %d seconds.\n", timeleft); + return COM_OK; + } + return COM_OK; +} + +PUBLIC int com_cshout(int p, param_list param) +{ + int p1; + int count = 0; + + if (!parray[p].registered) { + pprintf(p, "Only registered players can use the cshout command.\n"); + return COM_OK; + } + if (parray[p].cmuzzled) { + 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; + } +/* in_push(IN_SHOUT); */ + for (p1 = 0; p1 < p_num; p1++) { + if (p1 == p) + continue; + if (parray[p1].status != PLAYER_PROMPT) + continue; + if (!parray[p1].i_cshout) + continue; + if (player_censored(p1, p)) + continue; + count++; + pprintf_prompt(p1, "\n%s c-shouts: %s\n", parray[p].name, + param[0].val.string); + } + pprintf(p, "(%d) %s c-shouts: %s\n", count, parray[p].name, + param[0].val.string); +/* in_pop(); */ + return COM_OK; +} + +PUBLIC int com_it(int p, param_list param) +{ + int p1; + int count = 0; + int timeleft; + + if (!parray[p].registered) { + pprintf(p, "Only registered players can use the it command.\n"); + return COM_OK; + } + if (parray[p].muzzled) { + pprintf(p, "You are muzzled.\n"); + return COM_OK; + } + if (param[0].type == TYPE_NULL) { + if (in_list("quota", parray[p].name)) { + pprintf(p, "[You are on the quota list.]\n"); + if ((timeleft = CheckShoutQuota(p))) { + pprintf(p, "Next shout available in %d seconds.\n", timeleft); + } else { + pprintf(p, "Your next shout is ready for use.\n"); + } + } else { + pprintf(p, "[You are not on the quota list.]\n"); + pprintf(p, "Please specify what it is you want to shout.\n"); + } + return COM_OK; + } + if ((timeleft = CheckShoutQuota(p))) { + pprintf(p, "[You are on the quota list.]\n"); + pprintf(p, "Shout not sent. Next shout in %d seconds.\n", timeleft); + return COM_OK; + } + parray[p].lastshout_a = parray[p].lastshout_b; + parray[p].lastshout_b = time(0); + + if (!printablestring(param[0].val.string)) { + pprintf(p, "Your message contains some unprintable character(s).\n"); + return COM_OK; + } +/* in_push(IN_SHOUT); */ + for (p1 = 0; p1 < p_num; p1++) { + if (p1 == p) + continue; + if (parray[p1].status != PLAYER_PROMPT) + continue; + if (!parray[p1].i_shout) + continue; + if (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", parray[p].name, + param[0].val.string); + } else { + pprintf_prompt(p1, "\n--> %s %s\n", parray[p].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, "(%d) --> %s%s\n", count, parray[p].name, param[0].val.string); + } else { + pprintf(p, "(%d) --> %s %s\n", count, parray[p].name, param[0].val.string); + } +/* in_pop(); */ + if ((in_list("quota", parray[p].name)) && (timeleft = CheckShoutQuota(p))) { + pprintf(p, "[You are on the quota list.]\n"); + pprintf(p, "Next shout in %d seconds.\n", timeleft); + return COM_OK; + } + return COM_OK; +} + +#define TELL_TELL 0 +#define TELL_SAY 1 +#define TELL_WHISPER 2 +#define TELL_KIBITZ 3 +#define TELL_CHANNEL 4 +PRIVATE int tell(int p, int p1, char *msg, int why, int ch) +{ + char tmp[MAX_LINE_SIZE]; + + if (!printablestring(msg)) { + pprintf(p, "Your message contains some unprintable character(s).\n"); + return COM_OK; + } +/* if (p1 == p) { + * pprintf(p, "Quit talking to yourself! It's embarrassing.\n"); + * return COM_OK; + * } + */ + if ((!parray[p1].i_tell) && (!parray[p].registered)) { + pprintf(p, "Player \"%s\" isn't listening to unregistered tells.\n", + parray[p1].name); + return COM_OK; + } + if ((player_censored(p1, p)) && (parray[p].adminLevel == 0)) { + pprintf(p, "Player \"%s\" is censoring you.\n", parray[p1].name); + return COM_OK; + } +/* in_push(IN_TELL); */ + switch (why) { + case TELL_SAY: + pprintf_highlight(p1, "\n%s", parray[p].name); + pprintf_prompt(p1, " says: %s\n", msg); + break; + case TELL_WHISPER: + pprintf(p1, "\n%s", parray[p].name); + pprintf_prompt(p1, " whispers: %s\n", msg); + break; + case TELL_KIBITZ: + pprintf(p1, "\n%s", parray[p].name); + pprintf_prompt(p1, " kibitzes: %s\n", msg); + break; + case TELL_CHANNEL: + pprintf(p1, "\n%s", parray[p].name); + pprintf_prompt(p1, "(%d): %s\n", ch, msg); + break; + case TELL_TELL: + default: + if (parray[p1].highlight) { + pprintf_highlight(p1, "\n%s", parray[p].name); + } else { + pprintf(p1, "\n%s", parray[p].name); + } + pprintf_prompt(p1, " tells you: %s\n", msg); + break; + } + tmp[0] = '\0'; + if (!(parray[p1].busy[0] == '\0')) { + sprintf(tmp, ", who %s (idle: %d minutes)", parray[p1].busy, + ((player_idle(p1) % 3600) / 60)); + } else { + if (((player_idle(p1) % 3600) / 60) > 2) { + sprintf(tmp, ", who has been idle %d minutes", ((player_idle(p1) % 3600) / 60)); + } + /* else sprintf(tmp," "); */ + } + if ((why == TELL_SAY) || (why == TELL_TELL)) { + pprintf(p, "(told %s%s)\n", parray[p1].name, + (((parray[p1].game>=0) && (garray[parray[p1].game].status == GAME_EXAMINE)) + ? ", who is examining a game" : + (parray[p1].game >= 0 && (parray[p1].game != parray[p].game)) + ? ", who is playing" : tmp)); + parray[p].last_tell = p1; + } +/* in_pop(); */ + return COM_OK; +} + +PRIVATE int chtell(int p, int ch, char *msg) +{ + int p1; + int i, count = 0, listening = 0; + + if ((ch == 0) && (parray[p].adminLevel == 0)) { + 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; + } +/* in_push(IN_TELL); */ + for (i = 0; i < numOn[ch]; i++) { + p1 = channels[ch][i]; + if (p1 == p) { + listening = 1; + continue; + } + if (player_censored(p1, p)) + continue; + if ((parray[p1].status == PLAYER_PASSWORD) + || (parray[p1].status == PLAYER_LOGIN)) + continue; + tell(p, p1, msg, TELL_CHANNEL, ch); + count++; + } + if (count) { + /* parray[p].last_tell = -1; */ + parray[p].last_channel = ch; + } + pprintf(p, "(%d->(%d))", ch, count); + if (!listening) + pprintf(p, " (You're not listening to channel %d.)", ch); + pprintf(p, "\n"); +/* in_pop(); */ + return COM_OK; +} + +PUBLIC int com_whisper(int p, param_list param) +{ + int g; + int p1; + int count = 0; + + if (!parray[p].num_observe && parray[p].game < 0) { + pprintf(p, "You are not playing or observing a game.\n"); + return COM_OK; + } + if (!parray[p].registered && (parray[p].game == -1)) { + pprintf(p, "You must be registered to whisper other people's games.\n"); + return COM_OK; + } + if (parray[p].game >= 0) + g = parray[p].game; + else + g = parray[p].observe_list[0]; + for (p1 = 0; p1 < p_num; p1++) { + if (p1 == p) + continue; + if (parray[p1].status != PLAYER_PROMPT) + continue; + if (player_is_observe(p1, g)) { + tell(p, p1, param[0].val.string, TELL_WHISPER, 0); + if ((parray[p].adminLevel >= ADMIN_ADMIN) || !garray[g].private) + count++; + } + } + pprintf(p, "whispered to %d.\n", count); + return COM_OK; +} + +PUBLIC int com_kibitz(int p, param_list param) +{ + int g; + int p1; + int count = 0; + + if (!parray[p].num_observe && parray[p].game < 0) { + pprintf(p, "You are not playing or observing a game.\n"); + return COM_OK; + } + if (!parray[p].registered && (parray[p].game == -1)) { + pprintf(p, "You must be registered to kibitz other people's games.\n"); + return COM_OK; + } + if (parray[p].game >= 0) + g = parray[p].game; + else + g = parray[p].observe_list[0]; + for (p1 = 0; p1 < p_num; p1++) { + if (p1 == p) + continue; + if (parray[p1].status != PLAYER_PROMPT) + continue; + if (player_is_observe(p1, g) || parray[p1].game == g) { + tell(p, p1, param[0].val.string, TELL_KIBITZ, 0); + if ((parray[p].adminLevel >= ADMIN_ADMIN) || !garray[g].private || (parray[p1].game == g)) + count++; + } + } + pprintf(p, "kibitzed to %d.\n", count); + return COM_OK; +} + +PUBLIC int com_tell(int p, param_list param) +{ + int p1; + + if (param[0].type == TYPE_NULL) + return COM_BADPARAMETERS; + if (param[0].type == TYPE_WORD) { + stolower(param[0].val.word); + if (!strcmp(param[0].val.word, ".")) { + if (parray[p].last_tell < 0) { + pprintf(p, "No one to tell anything to.\n"); + return COM_OK; + } else { + return tell(p, parray[p].last_tell, param[1].val.string, TELL_TELL, 0); + } + } + if (!strcmp(param[0].val.word, ",")) { + if (parray[p].last_channel < 0) { + pprintf(p, "No previous channel.\n"); + return COM_OK; + } else { + return chtell(p, parray[p].last_channel, param[1].val.string); + } + } + p1 = player_find_part_login(param[0].val.word); + if ((p1 < 0) || (parray[p1].status == PLAYER_PASSWORD) + || (parray[p1].status == PLAYER_LOGIN)) { + pprintf(p, "No user named \"%s\" is logged in.\n", param[0].val.word); + return COM_OK; + } + return tell(p, p1, param[1].val.string, TELL_TELL, 0); + } else { /* Channel */ + return chtell(p, param[0].val.integer, param[1].val.string); + } +} + +PUBLIC int com_xtell(int p, param_list param) +{ + int p1; + char *msg; + char tmp[2048]; + + msg = param[1].val.string; + p1 = player_find_part_login(param[0].val.word); + if ((p1 < 0) || (parray[p1].status == PLAYER_PASSWORD) + || (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 ((!parray[p1].i_tell) && (!parray[p].registered)) { + pprintf(p, "Player \"%s\" isn't listening to unregistered tells.\n", + parray[p1].name); + return COM_OK; + } + if ((player_censored(p1, p)) && (parray[p].adminLevel == 0)) { + pprintf(p, "Player \"%s\" is censoring you.\n", parray[p1].name); + return COM_OK; + } + if (parray[p1].highlight) { + pprintf_highlight(p1, "\n%s", parray[p].name); + } else { + pprintf(p1, "\n%s", parray[p].name); + } + pprintf_prompt(p1, " tells you: %s\n", msg); + + tmp[0] = '\0'; + if (!(parray[p1].busy[0] == '\0')) { + sprintf(tmp, ", who %s (idle: %d minutes)", parray[p1].busy, + ((player_idle(p1) % 3600) / 60)); + } else { + if (((player_idle(p1) % 3600) / 60) > 2) { + sprintf(tmp, ", who has been idle %d minutes", ((player_idle(p1) % 3600) / 60)); + } + } + pprintf(p, "(told %s%s)\n", parray[p1].name, + (((parray[p1].game>=0) && (garray[parray[p1].game].status == GAME_EXAMINE)) + ? ", who is examining a game" : + (parray[p1].game >= 0 && (parray[p1].game != parray[p].game)) + ? ", who is playing" : tmp)); + return COM_OK; +} + +PUBLIC int com_say(int p, param_list param) +{ + if (parray[p].opponent < 0) { + if (parray[p].last_opponent < 0) { + pprintf(p, "No one to say anything to, try tell.\n"); + return COM_OK; + } else { + return tell(p, parray[p].last_opponent, param[0].val.string, TELL_SAY, 0); + } + } + return tell(p, parray[p].opponent, param[0].val.string, TELL_SAY, 0); +} + +PUBLIC 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; +} + +PUBLIC int FindPlayer(int p, parameter * param, int *p1, int *connected) +{ + if (param->type == TYPE_WORD) { + *p1 = player_search(p, param->val.word); + 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; + } + } else { + *p1 = p; + *connected = 1; + } + return 1; +} + +PRIVATE 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; +} + +PRIVATE void com_stats_rating(char *hdr, statistics * stats, char *dest) +{ + char tmp[100]; + + sprintf(dest, "%-10s%4s %5.1f %4d %4d %4d %4d", + hdr, ratstr(stats->rating), stats->sterr, 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; +} + +PUBLIC int com_stats(int p, param_list param) +{ + int g, i, t; + int p1, connected; + char line[255], tmp[255]; + int numbers[MAX_OBSERVE > MAX_SIMUL ? MAX_OBSERVE : MAX_SIMUL]; + + if (!FindPlayer(p, ¶m[0], &p1, &connected)) + return COM_OK; + + sprintf(line, "\nStatistics for %-11s ", parray[p1].name); + if ((connected) && (parray[p1].status == PLAYER_PROMPT)) { + sprintf(tmp, "On for: %s", hms(player_ontime(p1), 0, 0, 0)); + strcat(line, tmp); + sprintf(tmp, " Idle: %s\n", hms(player_idle(p1), 0, 0, 0)); + } 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 (parray[p1].simul_info.numBoards) { + for (i = 0, t = 0; i < parray[p1].simul_info.numBoards; i++) { + if ((numbers[t] = parray[p1].simul_info.boards[i] + 1) != 0) + t++; + } + pprintf(p, "%s is giving a simul: game%s ", parray[p1].name, ((t > 1) ? "s" : "")); + com_stats_andify(numbers, t, tmp); + pprintf(p, tmp); + } else if (parray[p1].game >= 0) { + g = parray[p1].game; + if (garray[g].status == GAME_EXAMINE) { + pprintf(p, "(Examining game %d: %s vs. %s)\n", g + 1, + parray[garray[g].white].name, parray[garray[g].black].name); + } else { + pprintf(p, "(playing game %d: %s vs. %s)\n", g + 1, + parray[garray[g].white].name, parray[garray[g].black].name); + } + } + if (parray[p1].num_observe) { + for (i = 0, t = 0; i < parray[p1].num_observe; i++) { + g = parray[p1].observe_list[i]; + if ((g != -1) && ((parray[p].adminLevel >= ADMIN_ADMIN) || (garray[g].private == 0))) + numbers[t++] = g + 1; + } + if (t) { + pprintf(p, "%s is observing game%s ", parray[p1].name, ((t > 1) ? "s" : "")); + com_stats_andify(numbers, t, tmp); + pprintf(p, tmp); + } + } + if (parray[p1].busy[0]) { + pprintf(p, "(%s %s)\n", parray[p1].name, parray[p1].busy); + } + if (!parray[p1].registered) { + pprintf(p, "%s is NOT a registered player.\n\n", parray[p1].name); + } else { + pprintf(p, "\n rating RD win loss draw total best\n"); + com_stats_rating("Blitz", &parray[p1].b_stats, tmp); + pprintf(p, tmp); + com_stats_rating("Standard", &parray[p1].s_stats, tmp); + pprintf(p, tmp); + com_stats_rating("Wild", &parray[p1].w_stats, tmp); + pprintf(p, tmp); + } + pprintf(p, "\n"); + if (parray[p1].adminLevel > 0) { + pprintf(p, "Admin Level: "); + switch (parray[p1].adminLevel) { +/* + case 0: + pprintf(p, "Normal User\n"); + break; + case 5: + pprintf(p, "Extra Cool User\n"); vek wants to be 5 + break; + + Forget it - you can do some admin stuff if your level is > than 0 - DAV + +*/ + 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", parray[p1].adminLevel); + break; + } + } + if (parray[p].adminLevel > 0) + pprintf(p, "Full Name : %s\n", (parray[p1].fullName ? parray[p1].fullName : "(none)")); + if (((p1 == p) && (parray[p1].registered)) || (parray[p].adminLevel > 0)) + pprintf(p, "Address : %s\n", (parray[p1].emailAddress ? parray[p1].emailAddress : "(none)")); + if (parray[p].adminLevel > 0) { + pprintf(p, "Host : %s\n", +/* + ((hp = gethostbyaddr((const char*) (connected ? &parray[p1].thisHost : &parray[p1].lastHost), sizeof(parray[p1].thisHost), AF_INET)) == 0) ? "" : hp->h_name, +*/ + dotQuad(connected ? parray[p1].thisHost : parray[p1].lastHost)); + } + if ((parray[p].adminLevel > 0) && (parray[p1].registered)) + if (parray[p1].num_comments) + pprintf(p, "Comments : %d\n", parray[p1].num_comments); + + if (parray[p1].num_plan) { + pprintf(p, "\n"); + for (i = 0; i < parray[p1].num_plan; i++) + pprintf(p, "%2d: %s\n", i + 1, (parray[p1].planLines[i] != NULL) ? parray[p1].planLines[i] : ""); + } + if (!connected) + player_remove(p1); + return COM_OK; +} + + + +PUBLIC int com_variables(int p, param_list param) +{ + int p1, connected; + int i; + + if (!FindPlayer(p, ¶m[0], &p1, &connected)) + return COM_OK; + + pprintf(p, "Variable settings of %s:\n", parray[p1].name); +/* if (parray[p1].fullName) + pprintf(p, " Realname: %s\n", parray[p1].fullName); +*/ + if (parray[p1].uscfRating) + pprintf(p, " USCF: %d\n", parray[p1].uscfRating); + pprintf(p, " time=%-3d inc=%-3d private=%d\n", + parray[p1].d_time, parray[p1].d_inc, parray[p1].private); + pprintf(p, " rated=%d ropen=%d open=%d simopen=%d\n", + parray[p1].rated, parray[p1].ropen, parray[p1].open, parray[p1].sopen); + pprintf(p, " shout=%d cshout=%d kib=%d tell=%d notifiedby=%d\n", + parray[p1].i_shout, parray[p1].i_cshout, parray[p1].i_kibitz, parray[p1].i_tell, parray[p1].notifiedby); + pprintf(p, " pin=%d gin=%d style=%-3d flip=%d\n", + parray[p1].i_login, parray[p1].i_game, parray[p1].style + 1, parray[p1].flip); + pprintf(p, " highlight=%d bell=%d auto=%d mailmess=%d pgn=%d\n", + parray[p1].highlight, parray[p1].bell, parray[p1].automail, parray[p1].i_mailmess, parray[p1].pgn); + pprintf(p, " width=%-3d height=%-3d\n", + parray[p1].d_width, parray[p1].d_height); + if (parray[p1].prompt && parray[p1].prompt != def_prompt) + pprintf(p, " Prompt: %s\n", parray[p1].prompt); + + { /* added code to print channels */ + int count = 0; + for (i = 0; i < MAX_CHANNELS; i++) { + if (on_channel(i, p1)) { + if (!count) + pprintf(p, "\n Channels:"); + pprintf(p, " %d", i); + count++; + } + } + if (count) + pprintf(p, "\n"); + } +/* if (parray[p1].numAlias && (p == p1)) { + pprintf(p, "\n Aliases:\n"); + for (i = 0; i < parray[p1].numAlias; i++) { + pprintf(p, " %s %s\n", parray[p1].alias_list[i].comm_name, + parray[p1].alias_list[i].alias); + } + } +*/ + if (parray[p1].num_formula) { + pprintf(p, "\n"); + for (i = 0; i < parray[p1].num_formula; i++) { + if (parray[p1].formulaLines[i] != NULL) + pprintf(p, " f%d: %s\n", i + 1, parray[p1].formulaLines[i]); + else + pprintf(p, " f%d:\n", i + 1); + } + } + if (parray[p1].formula != NULL) + pprintf(p, "\nFormula: %s\n", parray[p1].formula); + + if (!connected) + player_remove(p1); + return COM_OK; +} + + + +PUBLIC int com_password(int p, param_list param) +{ + char *oldpassword = param[0].val.word; + char *newpassword = param[1].val.word; + char salt[3]; + + if (!parray[p].registered) { + pprintf(p, "Setting a password is only for registered players.\n"); + return COM_OK; + } + if (parray[p].passwd) { + salt[0] = parray[p].passwd[0]; + salt[1] = parray[p].passwd[1]; + salt[2] = '\0'; + if (strcmp(crypt(oldpassword, salt), parray[p].passwd)) { + pprintf(p, "Incorrect password, password not changed!\n"); + return COM_OK; + } + rfree(parray[p].passwd); + parray[p].passwd = NULL; + } + salt[0] = 'a' + rand() % 26; + salt[1] = 'a' + rand() % 26; + salt[2] = '\0'; + parray[p].passwd = strdup(crypt(newpassword, salt)); + pprintf(p, "Password changed to \"%s\".\n", newpassword); + return COM_OK; +} + +PUBLIC int com_uptime(int p, param_list param) +{ + unsigned long uptime = time(0) - startuptime; + struct rusage ru; + 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", fics_hostname,VERS_NUM); + pprintf(p, "The server has been up since %s.\n", strltime(&startuptime)); + if ((days==0) && (hours==0) && (mins==0)) { + pprintf(p, "(Up for %d second%s)\n", + secs, (secs==1) ? "" : "s"); + } else if ((days==0) && (hours==0)) { + pprintf(p, "(Up for %d minute%s and %d second%s)\n", + mins, (mins==1) ? "" : "s", + secs, (secs==1) ? "" : "s"); + } else if (days==0) { + pprintf(p, "(Up for %d hour%s, %d minute%s and %d second%s)\n", + hours, (hours==1) ? "" : "s", + mins, (mins==1) ? "" : "s", + secs, (secs==1) ? "" : "s"); + } else { + pprintf(p, "(Up for %d day%s, %d hour%s, %d minute%s and %d second%s)\n", + days, (days==1) ? "" : "s", + hours, (hours==1) ? "" : "s", + mins, (mins==1) ? "" : "s", + secs, (secs==1) ? "" : "s"); + } + pprintf(p, "\nAllocs: %u Frees: %u Allocs In Use: %u\n", + malloc_count, free_count, malloc_count - free_count); + if (parray[p].adminLevel >= ADMIN_ADMIN) { + pprintf(p, "\nplayer size:%d, game size:%d, con size:%d, g_num:%d\n", + sizeof(player), sizeof(game), net_consize(), g_num); + getrusage(RUSAGE_SELF, &ru); + pprintf(p, "pagesize = %d, maxrss = %d, total = %d\n", getpagesize(), ru.ru_maxrss, getpagesize() * ru.ru_maxrss); + } + pprintf(p, "\nPlayer limit: %d\n", max_connections); + pprintf(p, "\nThere are currently %d players, with a high of %d since last restart.\n", player_count(), player_high); + pprintf(p, "There are currently %d games, with a high of %d since last restart.\n", game_count(), game_high); + pprintf(p, "\nCompiled on %s\n", COMP_DATE); + return COM_OK; +} + +PUBLIC int com_date(int p, param_list param) +{ + int t = time(0); + pprintf(p, "Local time - %s\n", strltime(&t)); + pprintf(p, "Greenwich time - %s\n", strgtime(&t)); + return COM_OK; +} + +char *inout_string[] = { + "login", "logout" +}; + +PRIVATE int plogins(p, fname) +int p; +char *fname; +{ + FILE *fp; + int inout, thetime, registered; + char loginName[MAX_LOGIN_NAME + 1]; + char ipstr[20]; + + fp = fopen(fname, "r"); + if (!fp) { + pprintf(p, "Sorry, no login information available.\n"); + return COM_OK; + } + while (!feof(fp)) { + if (fscanf(fp, "%d %s %d %d %s\n", &inout, loginName, &thetime, + ®istered, ipstr) != 5) { + fprintf(stderr, "FICS: Error in login info format. %s\n", fname); + fclose(fp); + return COM_OK; + } + pprintf(p, "%s: %-17s %-6s", strltime(&thetime), loginName, + inout_string[inout]); + if (parray[p].adminLevel > 0) { + pprintf(p, " from %s\n", ipstr); + } else + pprintf(p, "\n"); + } + fclose(fp); + return COM_OK; +} + +PUBLIC int com_llogons(int p, param_list param) +{ + char fname[MAX_FILENAME_SIZE]; + + sprintf(fname, "%s/%s", stats_dir, STATS_LOGONS); + return plogins(p, fname); +} + +PUBLIC int com_logons(int p, param_list param) +{ + char fname[MAX_FILENAME_SIZE]; + + if (param[0].type == TYPE_WORD) { + sprintf(fname, "%s/player_data/%c/%s.%s", stats_dir, param[0].val.word[0], param[0].val.word, STATS_LOGONS); + } else { + sprintf(fname, "%s/player_data/%c/%s.%s", stats_dir, parray[p].login[0], parray[p].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 + +PRIVATE void who_terse(int p, int num, int *plist, int type) +{ + char ptmp[80 + 20]; /* for highlight */ + multicol *m = multicol_start(PARRAY_SIZE); + int i; + int p1; + int rat; + + /* altered DAV 3/15/95 */ + + for (i = 0; i < num; i++) { + p1 = plist[i]; + if (type == blitz_rat) + rat = parray[p1].b_stats.rating; + if (type == wild_rat) + rat = parray[p1].w_stats.rating; + if (type == std_rat) + rat = parray[p1].s_stats.rating; + + if (type == none) { + sprintf(ptmp, " "); + } else { + sprintf(ptmp, "%-4s", ratstrii(rat, parray[p1].registered)); + if (parray[p1].simul_info.numBoards) { + strcat(ptmp, "~"); + } else if ((parray[p1].game >= 0) && (garray[parray[p1].game].status == GAME_EXAMINE)) { + strcat(ptmp, "#"); + } else if (parray[p1].game >= 0) { + strcat(ptmp, "^"); + } else if (!parray[p1].open) { + strcat(ptmp, ":"); + } else if (player_idle(p1) > 300) { + strcat(ptmp, "."); + } else { + strcat(ptmp, " "); + } + } + if (p == p1) { + psprintf_highlight(p, ptmp + strlen(ptmp), "%s", parray[p1].name); + } else { + strcat(ptmp, parray[p1].name); + } + if ((parray[p1].adminLevel >= 10) && (parray[p1].i_admin)) + strcat(ptmp, "(*)"); + if (in_list("computer", parray[p1].name)) + strcat(ptmp, "(C)"); +/* grimm's fishlist + if (in_list("fish", parray[p1].name)) strcat(ptmp, "(Fish)"); +*/ + if (in_list("fm", parray[p1].name)) + strcat(ptmp, "(FM)"); + if (in_list("im", parray[p1].name)) + strcat(ptmp, "(IM)"); + if (in_list("gm", parray[p1].name)) + strcat(ptmp, "(GM)"); + if (in_list("td", parray[p1].name)) + strcat(ptmp, "(TD)"); + multicol_store(m, ptmp); + } + multicol_pprint(m, p, 80, 2); + multicol_end(m); + pprintf(p, "\n %d Players displayed (of %d). (*) indicates system administrator.\n", num, player_count()); +} + +PRIVATE void who_verbose(p, num, plist) +int p; +int num; +int plist[]; +{ + int i, p1; + char playerLine[255], tmp[255]; /* +8 for highlight */ + + 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 (parray[p1].game >= 0) + sprintf(tmp, "%3d", parray[p1].game + 1); + else + sprintf(tmp, " "); + strcat(playerLine, tmp); + + if (!parray[p1].open) + sprintf(tmp, "X"); + else + sprintf(tmp, " "); + strcat(playerLine, tmp); + + if (parray[p1].registered) + if (parray[p1].rated) { + sprintf(tmp, " "); + } else { + sprintf(tmp, "u"); + } + else + sprintf(tmp, "U"); + strcat(playerLine, tmp); + + /* Modified by DAV 3/15/95 */ + if (p == p1) { + strcpy(tmp, " "); + psprintf_highlight(p, tmp + strlen(tmp), "%-17s", parray[p1].name); + } else { + sprintf(tmp, " %-17s", parray[p1].name); + } + strcat(playerLine, tmp); + + sprintf(tmp, " %4s %-4s %5s ", + ratstrii(parray[p1].s_stats.rating, parray[p1].registered), + ratstrii(parray[p1].b_stats.rating, parray[p1].registered), + 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" + ); +} + +PRIVATE void who_winloss(p, num, plist) +int p; +int num; +int plist[]; +{ + int i, p1; + char playerLine[255], tmp[255]; /* for highlight */ + + pprintf(p, + "Name Stand win loss draw Blitz win loss draw idle\n" + ); + pprintf(p, + "---------------- ----- ------------- ----- ------------- ----\n" + ); + + for (i = 0; i < num; i++) { + p1 = plist[i]; + if (p1 == p) { + psprintf_highlight(p, playerLine, "%-17s", parray[p1].name); + } else { + sprintf(playerLine, "%-17s", parray[p1].name); + } + sprintf(tmp, " %4s %4d %4d %4d ", + ratstrii(parray[p1].s_stats.rating, parray[p1].registered), + (int) parray[p1].s_stats.win, + (int) parray[p1].s_stats.los, + (int) parray[p1].s_stats.dra); + strcat(playerLine, tmp); + + sprintf(tmp, "%4s %4d %4d %4d ", + ratstrii(parray[p1].b_stats.rating, parray[p1].registered), + (int) parray[p1].b_stats.win, + (int) parray[p1].b_stats.los, + (int) 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); +} + +PRIVATE int who_ok(p, sel_bits) +int p; +unsigned int sel_bits; +{ + if (parray[p].status != PLAYER_PROMPT) + return 0; + if (sel_bits == 0xff) + return 1; + if (sel_bits & WHO_OPEN) + if (!parray[p].open) + return 0; + if (sel_bits & WHO_CLOSED) + if (parray[p].open) + return 0; + if (sel_bits & WHO_RATED) + if (!parray[p].rated) + return 0; + if (sel_bits & WHO_UNRATED) + if (parray[p].rated) + return 0; + if (sel_bits & WHO_FREE) + if (parray[p].game >= 0) + return 0; + if (sel_bits & WHO_PLAYING) + if (parray[p].game < 0) + return 0; + if (sel_bits & WHO_REGISTERED) + if (!parray[p].registered) + return 0; + if (sel_bits & WHO_UNREGISTERED) + if (parray[p].registered) + return 0; + return 1; +} + + +PRIVATE int blitz_cmp(const void *pp1, const void *pp2) +{ + register int p1 = *(int *) pp1; + register int p2 = *(int *) pp2; + if (parray[p1].status != PLAYER_PROMPT) { + if (parray[p2].status != PLAYER_PROMPT) + return 0; + else + return -1; + } + if (parray[p2].status != PLAYER_PROMPT) + return 1; + if (parray[p1].b_stats.rating > parray[p2].b_stats.rating) + return -1; + if (parray[p1].b_stats.rating < parray[p2].b_stats.rating) + return 1; + if (parray[p1].registered > parray[p2].registered) + return -1; + if (parray[p1].registered < parray[p2].registered) + return 1; + return strcmp(parray[p1].login, parray[p2].login); +} + +PRIVATE int stand_cmp(const void *pp1, const void *pp2) +{ + register int p1 = *(int *) pp1; + register int p2 = *(int *) pp2; + if (parray[p1].status != PLAYER_PROMPT) { + if (parray[p2].status != PLAYER_PROMPT) + return 0; + else + return -1; + } + if (parray[p2].status != PLAYER_PROMPT) + return 1; + if (parray[p1].s_stats.rating > parray[p2].s_stats.rating) + return -1; + if (parray[p1].s_stats.rating < parray[p2].s_stats.rating) + return 1; + if (parray[p1].registered > parray[p2].registered) + return -1; + if (parray[p1].registered < parray[p2].registered) + return 1; + return strcmp(parray[p1].login, parray[p2].login); +} + +PRIVATE int wild_cmp(const void *pp1, const void *pp2) +{ + register int p1 = *(int *) pp1; + register int p2 = *(int *) pp2; + if (parray[p1].status != PLAYER_PROMPT) { + if (parray[p2].status != PLAYER_PROMPT) + return 0; + else + return -1; + } + if (parray[p2].status != PLAYER_PROMPT) + return 1; + if (parray[p1].w_stats.rating > parray[p2].w_stats.rating) + return -1; + if (parray[p1].w_stats.rating < parray[p2].w_stats.rating) + return 1; + if (parray[p1].registered > parray[p2].registered) + return -1; + if (parray[p1].registered < parray[p2].registered) + return 1; + return strcmp(parray[p1].login, parray[p2].login); +} + +PRIVATE int alpha_cmp(const void *pp1, const void *pp2) +{ + register int p1 = *(int *) pp1; + register int p2 = *(int *) pp2; + if (parray[p1].status != PLAYER_PROMPT) { + if (parray[p2].status != PLAYER_PROMPT) + return 0; + else + return -1; + } + if (parray[p2].status != PLAYER_PROMPT) + return 1; + return strcmp(parray[p1].login, parray[p2].login); +} + +PUBLIC void sort_players(int players[PARRAY_SIZE], + int ((*cmp_func) (const void *, const void *))) +{ + int i; + + for (i = 0; i < p_num; i++) { + players[i] = i; + } + qsort(players, p_num, sizeof(int), cmp_func); +} + +/* This is the of the most compliclicated commands in terms of parameters */ +PUBLIC int com_who(int p, param_list param) +{ + int style = 0; + float stop_perc = 1.0; + float start_perc = 0; + unsigned int sel_bits = 0xff; + int sortlist[PARRAY_SIZE], plist[PARRAY_SIZE]; + int ((*cmp_func) (const void *, const void *)) = blitz_cmp; + int startpoint; + int stoppoint; + int i, len; + int tmpI, tmpJ; + char c; + int p1, count, num_who; + int sort_type = blitz_rat; + + if (param[0].type == TYPE_WORD) { + len = strlen(param[0].val.word); + for (i = 0; i < len; i++) { + c = param[0].val.word[i]; + if (isdigit(c)) { + if (i == 0 || !isdigit(param[0].val.word[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.word[i + 1]))) + return COM_BADPARAMETERS; + } else { + tmpI = c - '0'; + tmpJ = param[0].val.word[i - 1] - '0'; + if (tmpI == 0) + return COM_BADPARAMETERS; + if (tmpJ > tmpI) + return COM_BADPARAMETERS; + start_perc = ((float) tmpJ - 1.0) / (float) tmpI; + stop_perc = ((float) tmpJ) / (float) tmpI; + } + } else { + switch (c) { + case 'o': + if (sel_bits == 0xff) + sel_bits = WHO_OPEN; + else + sel_bits |= WHO_OPEN; + break; + case 'r': + if (sel_bits == 0xff) + sel_bits = WHO_RATED; + else + sel_bits |= WHO_RATED; + break; + case 'f': + if (sel_bits == 0xff) + sel_bits = WHO_FREE; + else + sel_bits |= WHO_FREE; + break; + case 'a': + if (sel_bits == 0xff) + sel_bits = WHO_FREE | WHO_OPEN; + else + sel_bits |= (WHO_FREE | WHO_OPEN); + break; + case 'R': + if (sel_bits == 0xff) + 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 't': /* format */ + style = 0; + break; + case 'v': /* format */ + style = 1; + break; + case 'n': /* format */ + style = 2; + break; + case 'U': + if (sel_bits == 0xff) + sel_bits = WHO_UNREGISTERED; + else + sel_bits |= WHO_UNREGISTERED; + break; + default: + return COM_BADPARAMETERS; + break; + } + } + } + } + sort_players(sortlist, cmp_func); + count = 0; + for (p1 = 0; p1 < 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 < 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: + return COM_BADPARAMETERS; + break; + } + return COM_OK; +} + + + + +PRIVATE int notorcen(int p, param_list param, int *num, int max, + char **list, char *listname) +{ + int i, p1, connected; + + if (param[0].type != TYPE_WORD) { + if (!*num) { + pprintf(p, "Your %s list is empty.\n", listname); + return COM_OK; + } else + pprintf(p, "-- Your %s list contains %d names: --", listname, *num); + /* New code to print names in columns */ + { + multicol *m = multicol_start(MAX_NOTIFY + 1); + for (i = 0; i < *num; i++) + multicol_store_sorted(m, list[i]); + multicol_pprint(m, p, 78, 2); + multicol_end(m); + } + return COM_OK; + } + if (*num >= max) { + pprintf(p, "Sorry, your %s list is already full.\n", listname); + return COM_OK; + } + if (!FindPlayer(p, ¶m[0], &p1, &connected)) + return COM_OK; + + for (i = 0; i < *num; i++) { + if (!strcasecmp(list[i], param[0].val.word)) { + pprintf(p, "Your %s list already includes %s.\n", + listname, parray[p1].name); + if (!connected) + player_remove(p1); + return COM_OK; + } + } + if (p1 == p) { + pprintf(p, "You can't %s yourself.\n", listname); + return COM_OK; + } + list[*num] = strdup(parray[p1].name); + ++(*num); + pprintf(p, "%s is now on your %s list.\n", parray[p1].name, listname); + if (!connected) + player_remove(p1); + return COM_OK; +} + + +PRIVATE int unnotorcen(int p, param_list param, int *num, int max, + char **list, char *listname) +{ + char *pname = NULL; + int i, j; + int unc = 0; + + if (param[0].type == TYPE_WORD) { + pname = param[0].val.word; + } + for (i = 0; i < *num; i++) { + if (!pname || !strcasecmp(pname, list[i])) { + pprintf(p, "%s is removed from your %s list.\n", + list[i], listname); + rfree(list[i]); + list[i] = NULL; + unc++; + } + } + if (unc) { + i = 0; + j = 0; + while (j < *num) { + if (list[j] != NULL) { + list[i++] = list[j]; + } + j++; + } + while (i < j) { + list[i++] = NULL; + } + (*num) -= unc; + } else { + pprintf(p, "No one was removed from your %s list.\n", listname); + } + return COM_OK; +} + + +PUBLIC int com_notify(int p, param_list param) +{ + return notorcen(p, param, &parray[p].num_notify, MAX_NOTIFY, + parray[p].notifyList, "notify"); +} + +PUBLIC int com_censor(int p, param_list param) +{ + return notorcen(p, param, &parray[p].num_censor, MAX_CENSOR, + parray[p].censorList, "censor"); +} + +PUBLIC int com_unnotify(int p, param_list param) +{ + return unnotorcen(p, param, &parray[p].num_notify, MAX_NOTIFY, + parray[p].notifyList, "notify"); +} + +PUBLIC int com_uncensor(int p, param_list param) +{ + return unnotorcen(p, param, &parray[p].num_censor, MAX_CENSOR, + parray[p].censorList, "censor"); +} + + +PUBLIC int com_channel(int p, param_list param) +{ + int i, err; + + if (param[0].type == TYPE_NULL) { /* Turn off all channels */ + for (i = 0; i < MAX_CHANNELS; i++) { + if (!channel_remove(i, p)) + pprintf(p, "Channel %d turned off.\n", i); + } + } else { + i = param[0].val.integer; + if ((i == 0) && (parray[p].adminLevel == 0)) { + pprintf(p, "Only admins may join channel 0.\n"); + return COM_OK; + } + if (i < 0) { + pprintf(p, "The lowest channel number is 0.\n"); + return COM_OK; + } + if (i >= MAX_CHANNELS) { + pprintf(p, "The maximum channel number is %d.\n", MAX_CHANNELS - 1); + return COM_OK; + } + if (on_channel(i, p)) { + if (!channel_remove(i, p)) + pprintf(p, "Channel %d turned off.\n", i); + } else { + if (!(err = channel_add(i, p))) + pprintf(p, "Channel %d turned on.\n", i); + else { + if (err == 1) + pprintf(p, "Channel %d is already full.\n", i); + if (err == 2) + pprintf(p, "Maximum channel number exceeded.\n"); + } + } + } + return COM_OK; +} + +PUBLIC int com_inchannel(int p, param_list param) +{ + int c1, c2; + int i, j, count = 0; + + if (param[0].type == TYPE_NULL) { /* List everyone on every channel */ + c1 = -1; + c2 = -1; + } else if (param[1].type == TYPE_NULL) { /* One parameter */ + c1 = param[0].val.integer; + if (c1 < 0) { + pprintf(p, "The lowest channel number is 0.\n"); + return COM_OK; + } + c2 = -1; + } else { /* Two parameters */ + c1 = param[0].val.integer; + c2 = param[2].val.integer; + if ((c1 < 0) || (c2 < 0)) { + pprintf(p, "The lowest channel number is 0.\n"); + return COM_OK; + } + pprintf(p, "Two parameter inchannel is not implemented.\n"); + return COM_OK; + } + if ((c1 >= MAX_CHANNELS) || (c2 >= MAX_CHANNELS)) { + pprintf(p, "The maximum channel number is %d.\n", MAX_CHANNELS - 1); + return COM_OK; + } + for (i = 0; i < MAX_CHANNELS; i++) { + if (numOn[i] && ((c1 < 0) || (i == c1))) { + pprintf(p, "Channel %d:", i); + for (j = 0; j < numOn[i]; j++) { + pprintf(p, " %s", parray[channels[i][j]].name); + } + count++; + pprintf(p, "\n"); + } + } + if (!count) { + if (c1 < 0) + pprintf(p, "No channels in use.\n"); + else + pprintf(p, "Channel not in use.\n"); + } + return COM_OK; +} + + +PUBLIC int create_new_match(int white_player, int black_player, + int wt, int winc, int bt, int binc, + int rated, char *category, char *board, + int white) +{ + int g = game_new(), p; + char outStr[1024]; + int reverse = 0; + + if (g < 0) + return COM_FAILED; + if (white == 0) { + reverse = 1; + } else if (white == -1) { + if (!bt) { + if (parray[white_player].lastColor == parray[black_player].lastColor) { + if ((parray[white_player].num_white - parray[white_player].num_black) > + (parray[black_player].num_white - parray[black_player].num_black)) + reverse = 1; + } else if (parray[white_player].lastColor == WHITE) + reverse = 1; + } else + reverse = 1; /* Challenger is always white in unbalanced + match */ + } + if (reverse) { + int tmp = white_player; + white_player = black_player; + black_player = tmp; + } + player_remove_request(white_player, black_player, PEND_MATCH); + player_remove_request(black_player, white_player, PEND_MATCH); + player_remove_request(white_player, black_player, PEND_SIMUL); + player_remove_request(black_player, white_player, PEND_SIMUL); + player_decline_offers(white_player, -1, PEND_MATCH); + player_withdraw_offers(white_player, -1, PEND_MATCH); + player_decline_offers(black_player, -1, PEND_MATCH); + player_withdraw_offers(black_player, -1, PEND_MATCH); + player_withdraw_offers(white_player, -1, PEND_SIMUL); + player_withdraw_offers(black_player, -1, PEND_SIMUL); + + wt = wt * 60; /* To Seconds */ + bt = bt * 60; + garray[g].white = white_player; + garray[g].black = black_player; + strcpy(garray[g].white_name, parray[white_player].name); + strcpy(garray[g].black_name, parray[black_player].name); + garray[g].status = GAME_ACTIVE; + garray[g].type = game_isblitz(wt / 60, winc, bt / 60, binc, category, board); + if ((garray[g].type == TYPE_UNTIMED) || (garray[g].type == TYPE_NONSTANDARD)) + garray[g].rated = 0; + else + garray[g].rated = rated; + garray[g].private = parray[white_player].private || + parray[black_player].private; + garray[g].white = white_player; + if (garray[g].type == TYPE_BLITZ) { + garray[g].white_rating = parray[white_player].b_stats.rating; + garray[g].black_rating = parray[black_player].b_stats.rating; + } else if (garray[g].type == TYPE_WILD) { + garray[g].white_rating = parray[white_player].w_stats.rating; + garray[g].black_rating = parray[black_player].w_stats.rating; + } else { + garray[g].white_rating = parray[white_player].s_stats.rating; + garray[g].black_rating = parray[black_player].s_stats.rating; + } + if (board_init(&garray[g].game_state, category, board)) { + pprintf(white_player, "PROBLEM LOADING BOARD. Game Aborted.\n"); + pprintf(black_player, "PROBLEM LOADING BOARD. Game Aborted.\n"); + fprintf(stderr, "FICS: PROBLEM LOADING BOARD %s %s. Game Aborted.\n", + category, board); + } + garray[g].game_state.gameNum = g; + garray[g].wTime = wt * 10; + garray[g].wInitTime = wt * 10; + garray[g].wIncrement = winc * 10; + if (bt == 0) { + garray[g].bTime = wt * 10; + } else { + garray[g].bTime = bt * 10; + } + garray[g].bInitTime = bt * 10; + garray[g].bIncrement = binc * 10; + if (garray[g].game_state.onMove == BLACK) { /* Start with black */ + garray[g].numHalfMoves = 1; + garray[g].moveListSize = 1; + garray[g].moveList = (move_t *) rmalloc(sizeof(move_t)); + garray[g].moveList[0].fromFile = -1; + garray[g].moveList[0].fromRank = -1; + garray[g].moveList[0].toFile = -1; + garray[g].moveList[0].toRank = -1; + garray[g].moveList[0].color = WHITE; + strcpy(garray[g].moveList[0].moveString, "NONE"); + strcpy(garray[g].moveList[0].algString, "NONE"); + } else { + garray[g].numHalfMoves = 0; + garray[g].moveListSize = 0; + garray[g].moveList = NULL; + } + garray[g].timeOfStart = tenth_secs(); + garray[g].startTime = tenth_secs(); + garray[g].lastMoveTime = garray[g].startTime; + garray[g].lastDecTime = garray[g].startTime; + garray[g].clockStopped = 0; + sprintf(outStr, "\n{Game %d (%s vs. %s) Creating %s %s match.}\n", + g + 1, parray[white_player].name, + parray[black_player].name, + rstr[garray[g].rated], + bstr[garray[g].type]); + pprintf(white_player, "%s", outStr); + pprintf(black_player, "%s", outStr); + + for (p = 0; p < p_num; p++) { + if ((p == white_player) || (p == black_player)) + continue; + if (parray[p].status != PLAYER_PROMPT) + continue; + if (!parray[p].i_game) + continue; + pprintf_prompt(p, "%s", outStr); + } + parray[white_player].game = g; + parray[white_player].opponent = black_player; + parray[white_player].side = WHITE; + parray[white_player].promote = QUEEN; + parray[black_player].game = g; + parray[black_player].opponent = white_player; + parray[black_player].side = BLACK; + parray[black_player].promote = QUEEN; + send_boards(g); + + strcpy(garray[g].boardList[garray[g].numHalfMoves], boardToFEN(g)); + + return COM_OK; +} + +PRIVATE int accept_match(int p, int p1) +{ + int g, adjourned, foo; + int wt, winc, bt, binc, rated, white; + char *category, *board; + pending *pend; + char tmp[100]; + + unobserveAll(p); /* stop observing when match starts */ + unobserveAll(p1); + + pend = &parray[p].p_from_list[player_find_pendfrom(p, p1, PEND_MATCH)]; + wt = pend->param1; + winc = pend->param2; + bt = pend->param3; + binc = pend->param4; + rated = pend->param5; + category = pend->char1; + board = pend->char2; + white = (pend->param6 == -1) ? -1 : 1 - pend->param6; + + pprintf(p, "You accept the challenge of %s.\n", parray[p1].name); + pprintf(p1, "\n%s accepts your challenge.\n", parray[p].name); + player_remove_request(p, p1, -1); + player_remove_request(p1, p, -1); + + while ((foo = player_find_pendto(p, -1, -1)) != -1) { + foo = parray[p].p_to_list[foo].whoto; + pprintf_prompt(foo, "\n%s, who was challenging you, has joined a match with %s.\n", parray[p].name, parray[p1].name); + pprintf(p, "Challenge to %s withdrawn.\n", parray[foo].name); + player_remove_request(p, foo, -1); + } + + while ((foo = player_find_pendto(p1, -1, -1)) != -1) { + foo = parray[p1].p_to_list[foo].whoto; + pprintf_prompt(foo, "\n%s, who was challenging you, has joined a match with %s.\n", parray[p1].name, parray[p].name); + pprintf(p1, "Challenge to %s withdrawn.\n", parray[foo].name); + player_remove_request(p1, foo, -1); + } + + while ((foo = player_find_pendfrom(p, -1, -1)) != -1) { + foo = parray[p].p_from_list[foo].whofrom; + pprintf_prompt(foo, "\n%s, whom you were challenging, has joined a match with %s.\n", parray[p].name, parray[p1].name); + pprintf(p, "Challenge from %s removed.\n", parray[foo].name); + player_remove_request(foo, p, -1); + } + + while ((foo = player_find_pendfrom(p1, -1, -1)) != -1) { + foo = parray[p1].p_from_list[foo].whofrom; + pprintf_prompt(foo, "\n%s, whom you were challenging, has joined a match with %s.\n", parray[p1].name, parray[p].name); + pprintf(p1, "Challenge from %s removed.\n", parray[foo].name); + player_remove_request(foo, p1, -1); + } + + g = game_new(); + adjourned = 0; + if (game_read(g, p, p1) >= 0) + adjourned = 1; + else if (game_read(g, p1, p) >= 0) { + int swap; + adjourned = 1; + swap = p; + p = p1; + p1 = swap; + } + if (!adjourned) { /* no adjourned game, so begin a new game */ + game_remove(g); + + if (create_new_match(p, p1, wt, winc, bt, binc, rated, category, board, white) != COM_OK) { + sprintf(tmp, "There was a problem creating the new match.\n"); + pprintf(p, tmp); + pprintf_prompt(p1, tmp); + } + } else { /* resume adjourned game */ + game_delete(p, p1); + + sprintf(tmp, "{Game %d (%s vs. %s) Continuing %s %s match.}\n", g + 1, parray[p].name, parray[p1].name, rstr[garray[g].rated], bstr[garray[g].type]); + pprintf(p, tmp); + pprintf(p1, tmp); + + garray[g].white = p; + garray[g].black = p1; + garray[g].status = GAME_ACTIVE; + garray[g].startTime = tenth_secs(); + garray[g].lastMoveTime = garray[g].startTime; + garray[g].lastDecTime = garray[g].startTime; + parray[p].game = g; + parray[p].opponent = p1; + parray[p].side = WHITE; + parray[p1].game = g; + parray[p1].opponent = p; + parray[p1].side = BLACK; + send_boards(g); + } + return COM_OK; +} + +PUBLIC int com_match(int p, param_list param) +{ + int adjourned; /* adjourned game? */ + int g; /* more adjourned game junk */ + int p1; + int pendfrom, pendto; + int ppend, p1pend; + 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], parsebuf[100]; + char strFormula[MAX_STRING_LENGTH]; + char *val; + int type; + int confused = 0; + char *colorstr[] = {"", "[black] ", "[white] "}; + char *adjustr[] = {"", " (adjourned)"}; + + if ((parray[p].game >= 0) && (garray[parray[p].game].status == GAME_EXAMINE)) { + pprintf(p, "You can't challenge while you are examining a game.\n"); + return COM_OK; + } + if (parray[p].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 */ + pprintf(p, "Starting a game in examine mode.\n"); + { + int g = game_new(); + + unobserveAll(p); + + player_decline_offers(p, -1, PEND_MATCH); + player_withdraw_offers(p, -1, PEND_MATCH); + player_withdraw_offers(p, -1, PEND_SIMUL); + + garray[g].wInitTime = garray[g].wIncrement = 0; + garray[g].bInitTime = garray[g].bIncrement = 0; + garray[g].timeOfStart = tenth_secs(); + garray[g].wTime = garray[g].bTime = 0; + garray[g].rated = 0; + garray[g].clockStopped = 0; + garray[g].type = TYPE_UNTIMED; + garray[g].white = garray[g].black = p; + garray[g].status = GAME_EXAMINE; + garray[g].startTime = tenth_secs(); + garray[g].lastMoveTime = garray[g].startTime; + garray[g].lastDecTime = garray[g].startTime; + + parray[p].side = WHITE; /* oh well... */ + parray[p].game = g; + + category[0]='\0'; board[0]='\0'; + if (board_init(&garray[g].game_state, category, board)) { + pprintf(p, "PROBLEM LOADING BOARD. Game Aborted.\n"); + fprintf(stderr, "FICS: PROBLEM LOADING BOARD %s %s. Game Aborted.\n", + category, board); + } + garray[g].game_state.gameNum = g; + strcpy(garray[g].white_name, parray[p].name); + strcpy(garray[g].black_name, parray[p].name); + garray[g].white_rating = garray[g].black_rating = parray[p].s_stats.rating; + + send_boards(g); + + strcpy(garray[g].boardList[garray[g].numHalfMoves], boardToFEN(g)); + + } + return COM_OK; + } + + if (parray[p].open == 0) { + parray[p].open = 1; + pprintf(p, "Setting you open for matches.\n"); + } + if (player_censored(p1, p)) { + pprintf(p, "Player \"%s\" is censoring you.\n", parray[p1].name); + return COM_OK; + } + if (player_censored(p, p1)) { + pprintf(p, "You are censoring \"%s\".\n", parray[p1].name); + return COM_OK; + } + if (!parray[p1].open) { + pprintf(p, "Player \"%s\" is not open to match requests.\n", parray[p1].name); + return COM_OK; + } + if (parray[p1].game >= 0) { + pprintf(p, "Player \"%s\" is involved in another game.\n", parray[p1].name); + return COM_OK; + } +/* 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)) ? 0 : 1; + if (adjourned) { + type = garray[g].type; + wt = garray[g].wInitTime / 600; + bt = garray[g].bInitTime / 600; + winc = garray[g].wIncrement / 10; + binc = garray[g].bIncrement / 10; + rated = garray[g].rated; + } + game_remove(g); + + pendto = player_find_pendto(p, p1, PEND_MATCH); + pendfrom = player_find_pendfrom(p, p1, PEND_MATCH); + category[0] = '\0'; + board[0] = '\0'; + + if (!adjourned) { + if (param[1].type != TYPE_NULL) { + int numba; /* temp for atoi() */ + + 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)) { + if ((numba = atoi(parsebuf)) < 0) { + pprintf(p, "You can't specify negative time controls.\n"); + return COM_OK; + } 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 (strstr("rated", parsebuf) != NULL) { + if (rated == -1) + rated = 1; + else + confused = 1; + } else if (strstr("unrated", parsebuf) != NULL) { + if (rated == -1) + rated = 0; + else + confused = 1; + } else if (strstr("white", parsebuf) != NULL) { + if (white == -1) + white = 1; + else + confused = 1; + } else if (strstr("black", parsebuf) != NULL) { + if (white == -1) + white = 0; + else + confused = 1; + } 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 COM_OK; + } + } + rated = ((rated == -1) ? parray[p].rated : rated) && parray[p1].registered && parray[p].registered; + if (winc == -1) + winc = (wt == -1) ? parray[p].d_inc : 0; /* match 5 == match 5 0 */ + if (wt == -1) + wt = parray[p].d_time; + if (bt == -1) + bt = 0; + if (binc == -1) + binc = winc; + + if (category[0] && !board[0]) { + pprintf(p, "You must specify a board and a category.\n"); + return COM_OK; + } + if (category[0]) { + 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; + } + } + if ((pendfrom < 0) && (parray[p1].ropen == 0) && (rated != parray[p1].rated)) { + pprintf(p, "%s only wants to play %s games.\n", parray[p1].name, + rstr[parray[p1].rated]); + pprintf(p1, "Ignoring %srated match request from %s.\n", + (parray[p1].rated ? "un" : ""), parray[p].name); + return COM_OK; + } + type = game_isblitz(wt, winc, bt, binc, category, board); + if (rated && (type == TYPE_STAND || type == TYPE_BLITZ || type == TYPE_WILD)) { + if (parray[p].network_player == parray[p1].network_player) { + rated = 1; + } else { + pprintf(p, "Network vs. local player forced to not rated\n"); + 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; + } + /* Now check formula. */ + if ((pendfrom < 0 || param[1].type != TYPE_NULL) && + !GameMatchesFormula(p, p1, wt, winc, bt, binc, rated, type, strFormula)) { + pprintf(p, "Match request does not fit formula for %s:\n", + parray[p1].name); + pprintf(p, "%s's formula: %s\n", parray[p1].name, parray[p1].formula); + pprintf(p, "Evaluated: %s\n", strFormula); + pprintf_prompt(p1, "Ignoring (formula): %s (%d) %s (%d) %s.\n", + parray[p].name, + GetRating(&parray[p], type), + parray[p1].name, + GetRating(&parray[p1], type), + game_str(rated, wt * 60, winc, bt * 60, binc, category, board)); + return COM_OK; + } + /* Ok match offer will be made */ + + } /* adjourned games shouldn't have to worry + about that junk? */ + if (pendto >= 0) { + pprintf(p, "Updating offer already made to \"%s\".\n", parray[p1].name); + } + if (pendfrom >= 0) { + if (pendto >= 0) { + pprintf(p, "Internal error\n"); + fprintf(stderr, "FICS: This shouldn't happen. You can't have a match pending from and to the same person.\n"); + return COM_OK; + } + if (adjourned || ((wt == parray[p].p_from_list[pendfrom].param1) && + (winc == parray[p].p_from_list[pendfrom].param2) && + (bt == parray[p].p_from_list[pendfrom].param3) && + (binc == parray[p].p_from_list[pendfrom].param4) && + (rated == parray[p].p_from_list[pendfrom].param5) && + ((white == -1) || (white + parray[p].p_from_list[pendfrom].param6 == 1)) && + (!strcmp(category, parray[p].p_from_list[pendfrom].char1)) && + (!strcmp(board, parray[p].p_from_list[pendfrom].char2)))) { + /* Identical match, should accept! */ + accept_match(p, p1); + return COM_OK; + } else { + player_remove_pendfrom(p, p1, PEND_MATCH); + player_remove_pendto(p1, p, PEND_MATCH); + } + } + if (pendto < 0) { + ppend = player_new_pendto(p); + if (ppend < 0) { + pprintf(p, "Sorry you can't have any more pending matches.\n"); + return COM_OK; + } + p1pend = player_new_pendfrom(p1); + if (p1pend < 0) { + pprintf(p, "Sorry %s can't have any more pending matches.\n", parray[p1].name); + parray[p].num_to = parray[p].num_to - 1; + return COM_OK; + } + } else { + ppend = pendto; + p1pend = player_find_pendfrom(p1, p, PEND_MATCH); + } + parray[p].p_to_list[ppend].param1 = wt; + parray[p].p_to_list[ppend].param2 = winc; + parray[p].p_to_list[ppend].param3 = bt; + parray[p].p_to_list[ppend].param4 = binc; + parray[p].p_to_list[ppend].param5 = rated; + parray[p].p_to_list[ppend].param6 = white; + strcpy(parray[p].p_to_list[ppend].char1, category); + strcpy(parray[p].p_to_list[ppend].char2, board); + parray[p].p_to_list[ppend].type = PEND_MATCH; + parray[p].p_to_list[ppend].whoto = p1; + parray[p].p_to_list[ppend].whofrom = p; + + parray[p1].p_from_list[p1pend].param1 = wt; + parray[p1].p_from_list[p1pend].param2 = winc; + parray[p1].p_from_list[p1pend].param3 = bt; + parray[p1].p_from_list[p1pend].param4 = binc; + parray[p1].p_from_list[p1pend].param5 = rated; + parray[p1].p_from_list[p1pend].param6 = white; + strcpy(parray[p1].p_from_list[p1pend].char1, category); + strcpy(parray[p1].p_from_list[p1pend].char2, board); + parray[p1].p_from_list[p1pend].type = PEND_MATCH; + parray[p1].p_from_list[p1pend].whoto = p1; + parray[p1].p_from_list[p1pend].whofrom = p; + + if (pendfrom >= 0) { + pprintf(p, "Declining offer from %s and offering new match parameters.\n", parray[p1].name); + pprintf(p1, "\n%s declines your match offer a match with these parameters:", parray[p].name); + } + if (pendto >= 0) { + pprintf(p, "Updating match request to: "); + pprintf(p1, "\n%s updates the match request.\n", parray[p].name); + } else { + pprintf(p, "Issuing: "); + pprintf(p1, "\n", parray[p].name); + } + + pprintf(p, "%s (%s) %s", parray[p].name, + ratstrii(GetRating(&parray[p], type), parray[p].registered), + colorstr[white + 1]); + pprintf_highlight(p, "%s", parray[p1].name); + pprintf(p, " (%s) %s%s.\n", + ratstrii(GetRating(&parray[p1], type), parray[p1].registered), + game_str(rated, wt * 60, winc, bt * 60, binc, category, board), + adjustr[adjourned]); + pprintf(p1, "Challenge: "); + pprintf_highlight(p1, "%s", parray[p].name); + pprintf(p1, " (%s) %s", ratstrii(GetRating(&parray[p], type), parray[p].registered), colorstr[white + 1]); + pprintf(p1, "%s (%s) %s%s.\n", parray[p1].name, + ratstrii(GetRating(&parray[p1], type), parray[p1].registered), + game_str(rated, wt * 60, winc, bt * 60, binc, category, board), + adjustr[adjourned]); + if (parray[p1].bell == 1) + pprintf_noformat(p1, "\007"); + if (in_list("computer", parray[p].name)) { + pprintf(p1, "--** %s is a ", parray[p].name); + pprintf_highlight(p1, "computer"); + pprintf(p1, " **--\n"); + } + if (in_list("computer", parray[p1].name)) { + pprintf(p, "--** %s is a ", parray[p1].name); + pprintf_highlight(p, "computer"); + pprintf(p, " **--\n"); + } + if (in_list("abuser", parray[p].name)) { + pprintf(p1, "--** %s is in the ", parray[p].name); + pprintf_highlight(p1, "abuser"); + pprintf(p1, " list **--\n"); + } + if (in_list("abuser", parray[p1].name)) { + pprintf(p, "--** %s is in the ", parray[p1].name); + pprintf_highlight(p, "abuser"); + pprintf(p, " list **--\n"); + } + 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); + } + pprintf_prompt(p1, "You can \"accept\" or \"decline\", or propose different parameters.\n"); + return COM_OK; +} + +PUBLIC int com_accept(int p, param_list param) +{ + int acceptNum = -1; + int type = -1; + int p1; + + if (parray[p].num_from == 0) { + pprintf(p, "You have no offers to accept.\n"); + return COM_OK; + } + if (param[0].type == TYPE_NULL) { + if (parray[p].num_from != 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; + } + acceptNum = 0; + } else if (param[0].type == TYPE_INT) { + if ((param[0].val.integer < 1) || (param[0].val.integer > parray[p].num_from)) { + pprintf(p, "Out of range. Use \"pending\" to see the list of offers.\n"); + return COM_OK; + } + acceptNum = param[0].val.integer - 1; + } else if (param[0].type == TYPE_WORD) { + if (!strcmp(param[0].val.word, "draw")) { + type = PEND_DRAW; + } else if (!strcmp(param[0].val.word, "pause")) { + type = PEND_PAUSE; + } else if (!strcmp(param[0].val.word, "adjourn")) { + type = PEND_ADJOURN; + } else if (!strcmp(param[0].val.word, "abort")) { + type = PEND_ABORT; + } else if (!strcmp(param[0].val.word, "takeback")) { + type = PEND_TAKEBACK; + } + if (!strcmp(param[0].val.word, "simmatch")) { + type = PEND_SIMUL; + } + if (!strcmp(param[0].val.word, "switch")) { + type = PEND_SWITCH; + } + if (!strcmp(param[0].val.word, "all")) { + while (parray[p].num_from != 0) { + pcommand(p, "accept 1"); + } + return COM_OK; + } + if (type > 0) { + if ((acceptNum = player_find_pendfrom(p, -1, type)) < 0) { + pprintf(p, "There are no pending %s offers.\n", param[0].val.word); + return COM_OK; + } + } else { /* Word must be a name */ + 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 ((acceptNum = player_find_pendfrom(p, p1, -1)) < 0) { + pprintf(p, "There are no pending offers from %s.\n", parray[p1].name); + return COM_OK; + } + } + } + switch (parray[p].p_from_list[acceptNum].type) { + case PEND_MATCH: + accept_match(p, parray[p].p_from_list[acceptNum].whofrom); + return (COM_OK); + break; + case PEND_DRAW: + pcommand(p, "draw"); + break; + case PEND_PAUSE: + pcommand(p, "pause"); + break; + case PEND_ABORT: + pcommand(p, "abort"); + break; + case PEND_TAKEBACK: + pcommand(p, "takeback %d", parray[p].p_from_list[acceptNum].param1); + break; + case PEND_SIMUL: + pcommand(p, "simmatch %s", + parray[parray[p].p_from_list[acceptNum].whofrom].name); + break; + case PEND_SWITCH: + pcommand(p, "switch"); + break; + case PEND_ADJOURN: + pcommand(p, "adjourn"); + break; + } + return COM_OK_NOPROMPT; +} + + + +PUBLIC int com_decline(int p, param_list param) +{ + int declineNum; + int p1 = -1, type = -1; + int count; + + if (parray[p].num_from == 0) { + pprintf(p, "You have no pending offers from other players.\n"); + return COM_OK; + } + if (param[0].type == TYPE_NULL) { + if (parray[p].num_from == 1) { + p1 = parray[p].p_from_list[0].whofrom; + type = parray[p].p_from_list[0].type; + } else { + pprintf(p, "You have more than one pending offer. Please specify which one\nyou wish to decline.\n'Pending' will give you the list.\n"); + return COM_OK; + } + } else { + if (param[0].type == TYPE_WORD) { + /* Draw adjourn match takeback abort or */ + if (!strcmp(param[0].val.word, "match")) { + type = PEND_MATCH; + } else if (!strcmp(param[0].val.word, "draw")) { + type = PEND_DRAW; + } else if (!strcmp(param[0].val.word, "pause")) { + type = PEND_PAUSE; + } else if (!strcmp(param[0].val.word, "abort")) { + type = PEND_ABORT; + } else if (!strcmp(param[0].val.word, "takeback")) { + type = PEND_TAKEBACK; + } else if (!strcmp(param[0].val.word, "adjourn")) { + type = PEND_ADJOURN; + } else if (!strcmp(param[0].val.word, "switch")) { + type = PEND_SWITCH; + } else if (!strcmp(param[0].val.word, "simul")) { + type = PEND_SIMUL; + } else if (!strcmp(param[0].val.word, "all")) { + } else { + 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; + } + } + } else { /* Must be an integer */ + declineNum = param[0].val.integer - 1; + if (declineNum >= parray[p].num_from || declineNum < 0) { + pprintf(p, "Invalid offer number. Must be between 1 and %d.\n", parray[p].num_from); + return COM_OK; + } + p1 = parray[p].p_from_list[declineNum].whofrom; + type = parray[p].p_from_list[declineNum].type; + } + } + count = player_decline_offers(p, p1, type); + if (count != 1) + pprintf(p, "%d offers declined\n", count); + return COM_OK; +} + +PUBLIC int com_withdraw(int p, param_list param) +{ + int withdrawNum; + int p1 = -1, type = -1; + int count; + + if (parray[p].num_to == 0) { + pprintf(p, "You have no pending offers to other players.\n"); + return COM_OK; + } + if (param[0].type == TYPE_NULL) { + if (parray[p].num_to == 1) { + p1 = parray[p].p_to_list[0].whoto; + type = parray[p].p_to_list[0].type; + } else { + pprintf(p, "You have more than one pending offer. Please specify which one\nyou wish to withdraw.\n'Pending' will give you the list.\n"); + return COM_OK; + } + } else { + if (param[0].type == TYPE_WORD) { + /* Draw adjourn match takeback abort or */ + if (!strcmp(param[0].val.word, "match")) { + type = PEND_MATCH; + } else if (!strcmp(param[0].val.word, "draw")) { + type = PEND_DRAW; + } else if (!strcmp(param[0].val.word, "pause")) { + type = PEND_PAUSE; + } else if (!strcmp(param[0].val.word, "abort")) { + type = PEND_ABORT; + } else if (!strcmp(param[0].val.word, "takeback")) { + type = PEND_TAKEBACK; + } else if (!strcmp(param[0].val.word, "adjourn")) { + type = PEND_ADJOURN; + } else if (!strcmp(param[0].val.word, "switch")) { + type = PEND_SWITCH; + } else if (!strcmp(param[0].val.word, "simul")) { + type = PEND_SIMUL; + } else if (!strcmp(param[0].val.word, "all")) { + } else { + 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; + } + } + } else { /* Must be an integer */ + withdrawNum = param[0].val.integer - 1; + if (withdrawNum >= parray[p].num_to || withdrawNum < 0) { + pprintf(p, "Invalid offer number. Must be between 1 and %d.\n", parray[p].num_to); + return COM_OK; + } + p1 = parray[p].p_to_list[withdrawNum].whoto; + type = parray[p].p_to_list[withdrawNum].type; + } + } + count = player_withdraw_offers(p, p1, type); + if (count != 1) + pprintf(p, "%d offers withdrawn\n", count); + return COM_OK; +} + +PUBLIC int com_pending(int p, param_list param) +{ + int i; + + if (!parray[p].num_to) { + pprintf(p, "There are no offers pending TO other players.\n"); + } else { + pprintf(p, "Offers TO other players:\n"); + for (i = 0; i < parray[p].num_to; i++) { + pprintf(p, " "); + player_pend_print(p, &parray[p].p_to_list[i]); + } + } + if (!parray[p].num_from) { + pprintf(p, "\nThere are no offers pending FROM other players.\n"); + } else { + pprintf(p, "\nOffers FROM other players:\n"); + for (i = 0; i < parray[p].num_from; i++) { + pprintf(p, " %d: ", i + 1); + player_pend_print(p, &parray[p].p_from_list[i]); + } + pprintf(p, "\nIf you wish to accept any of these offers type 'accept n'\nor just 'accept' if there is only one offer.\n"); + } + return COM_OK; +} + +PUBLIC int com_refresh(int p, param_list param) +{ + int g, p1; + + if (param[0].type == TYPE_NULL) { + if (parray[p].game >= 0) { + send_board_to(parray[p].game, p); + } else { /* Do observing in here */ + if (parray[p].num_observe) { + for (g = 0; g < parray[p].num_observe; g++) { + send_board_to(parray[p].observe_list[g], p); + } + } else { + pprintf(p, "You are neither playing nor observing a game.\n"); + return COM_OK; + } + } + } else { + g = GameNumFromParam (p, &p1, ¶m[0]); + if (g < 0) + return COM_OK; + if ((g >= g_num) || ((garray[g].status != GAME_ACTIVE) + && (garray[g].status != GAME_EXAMINE))) { + pprintf(p, "No such game.\n"); + } else if (garray[g].private && parray[p].adminLevel==ADMIN_USER) { + pprintf (p, "Sorry, game %d is a private game.\n", g+1); + } else { + if (garray[g].private) + pprintf(p, "Refreshing PRIVATE game %d\n", g+1); + send_board_to(g, p); + } + } + return COM_OK; +} + +PUBLIC int com_open(int p, param_list param) +{ + int retval; + ASSERT(param[0].type == TYPE_NULL); + if ((retval = pcommand(p, "set open")) != COM_OK) + return retval; + else + return COM_OK_NOPROMPT; +} + +PUBLIC int com_simopen(int p, param_list param) +{ + int retval; + ASSERT(param[0].type == TYPE_NULL); + if ((retval = pcommand(p, "set simopen")) != COM_OK) + return retval; + else + return COM_OK_NOPROMPT; +} + +PUBLIC int com_bell(int p, param_list param) +{ + int retval; + ASSERT(param[0].type == TYPE_NULL); + if ((retval = pcommand(p, "set bell")) != COM_OK) + return retval; + else + return COM_OK_NOPROMPT; +} + +PUBLIC int com_flip(int p, param_list param) +{ + int retval; + ASSERT(param[0].type == TYPE_NULL); + if ((retval = pcommand(p, "set flip")) != COM_OK) + return retval; + else + return COM_OK_NOPROMPT; +} + +PUBLIC int com_highlight(int p, param_list param) +{ + pprintf(p, "Obsolete command. Please do set highlight <0-15>.\n"); + return COM_OK; +} + +PUBLIC int com_style(int p, param_list param) +{ + int retval; + ASSERT(param[0].type == TYPE_INT); + if ((retval = pcommand(p, "set style %d", param[0].val.integer)) != COM_OK) + return retval; + else + return COM_OK_NOPROMPT; +} + +PUBLIC int com_promote(int p, param_list param) +{ + int retval; + ASSERT(param[0].type == TYPE_WORD); + if ((retval = pcommand(p, "set promote %s", param[0].val.word)) != COM_OK) + return retval; + else + return COM_OK_NOPROMPT; +} + +PUBLIC int com_alias(int p, param_list param) +{ + int al; + + if (param[0].type == TYPE_NULL) { + for (al = 0; al < parray[p].numAlias; al++) { + pprintf(p, "%s -> %s\n", parray[p].alias_list[al].comm_name, + parray[p].alias_list[al].alias); + } + return COM_OK; + } + al = alias_lookup(param[0].val.word, parray[p].alias_list, parray[p].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", parray[p].alias_list[al].comm_name, + parray[p].alias_list[al].alias); + } + } else { + if (al < 0) { + if (parray[p].numAlias >= MAX_ALIASES - 1) { + pprintf(p, "You have your maximum of %d aliases.\n", MAX_ALIASES - 1); + } else { + + if (!strcmp(param[0].val.string, "quit")) { /* making sure they + can't alias quit */ + pprintf(p, "You can't alias this command.\n"); + } else if (!strcmp(param[0].val.string, "unalias")) { /* making sure they + can't alias unalias + :) */ + pprintf(p, "You can't alias this command.\n"); + } else { + parray[p].alias_list[parray[p].numAlias].comm_name = + strdup(param[0].val.word); + parray[p].alias_list[parray[p].numAlias].alias = + strdup(param[1].val.string); + parray[p].numAlias++; + pprintf(p, "Alias set.\n"); + + } + } + } else { + rfree(parray[p].alias_list[al].alias); + parray[p].alias_list[al].alias = strdup(param[1].val.string); + pprintf(p, "Alias replaced.\n"); + } + parray[p].alias_list[parray[p].numAlias].comm_name = NULL; + } + return COM_OK; +} + +PUBLIC int com_unalias(int p, param_list param) +{ + int al; + int i; + + ASSERT(param[0].type == TYPE_WORD); + al = alias_lookup(param[0].val.word, parray[p].alias_list, parray[p].numAlias); + if (al < 0) { + pprintf(p, "You have no alias named '%s'.\n", param[0].val.word); + } else { + rfree(parray[p].alias_list[al].comm_name); + rfree(parray[p].alias_list[al].alias); + for (i = al; i < parray[p].numAlias; i++) { + parray[p].alias_list[i].comm_name = parray[p].alias_list[i + 1].comm_name; + parray[p].alias_list[i].alias = parray[p].alias_list[i + 1].alias; + } + parray[p].numAlias--; + parray[p].alias_list[parray[p].numAlias].comm_name = NULL; + pprintf(p, "Alias removed.\n"); + } + return COM_OK; +} + +PUBLIC int com_servers(int p, param_list param) +{ +/* + int i; + + ASSERT(param[0].type == TYPE_NULL); + if (numServers == 0) { + */ pprintf(p, "There are no other servers known to this server.\n"); + return COM_OK; +} + /* pprintf(p, "There are %d known servers.\n", numServers); pprintf(p, "(Not + all of these may be active)\n"); pprintf(p, "%-30s%-7s\n", "HOST", + "PORT"); for (i = 0; i < numServers; i++) pprintf(p, "%-30s%-7d\n", + serverNames[i], serverPorts[i]); return COM_OK; } */ +PUBLIC int com_sendmessage(int p, param_list param) +{ + int p1, connected = 1; + + if (!parray[p].registered) { + pprintf(p, "You are not registered and cannot send messages.\n"); + return COM_OK; + } + if ((param[0].type == TYPE_NULL) || (param[1].type == TYPE_NULL)) { + pprintf(p, "No message sent.\n"); + return COM_OK; + } + if (!FindPlayer(p, ¶m[0], &p1, &connected)) + return COM_OK; + + if ((player_censored(p1, p)) && (parray[p].adminLevel == 0)) { + pprintf(p, "Player \"%s\" is censoring you.\n", parray[p1].name); + 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", + parray[p1].name); + } else { + if (connected) + pprintf_prompt(p1, "\n%s just sent you a message.\n", parray[p].name); + } + if (!connected) + player_remove(p1); + return COM_OK; +} + + +PUBLIC int com_messages(int p, param_list param) +{ + if (param[0].type != TYPE_NULL) { + if (param[1].type != TYPE_NULL) + return com_sendmessage(p, param); + else { + ShowMsgsBySender(p, param); + return COM_OK; + } + } + if (player_num_messages(p) <= 0) { + pprintf(p, "You have no messages.\n"); + return COM_OK; + } + pprintf(p, "Messages:\n"); + player_show_messages(p); + return COM_OK; +} + +PUBLIC 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); + return COM_OK; + } + ClearMsgsBySender(p, param); + return COM_OK; +} + +PUBLIC int com_help(int p, param_list param) +{ + int i; + static char nullify = '\0'; + char *iwant, *filenames[1000]; /* enough for all helpfile names */ + + if (param[0].type == TYPE_NULL) { + iwant = &nullify; + } else { + iwant = param[0].val.word; + if (!safestring(iwant)) { + pprintf(p, "Illegal character in command %s.\n", iwant); + return COM_OK; +#if 0 + } else { + char sublist[][8] = {"talk", "play", ""}; + + for (i=0; (sublist[i][0] != '\0') && strcmp(iwant, sublist[i]); i++); + if (sublist[i][0] != '\0') { + char searchdir[MAX_FILENAME_SIZE]; + pprintf(p, "The following \"%s\" commands are available.\n\n", + sublist[i]); + sprintf(searchdir, "%s/../%s_help", comhelp_dir, sublist[i]); + i = search_directory(searchdir, NULL, filenames, 1000); + display_directory(p, filenames, i); + pprintf(p, "\nType \"help [command]\" for more specific help.\n"); + return COM_OK; + } +#endif + } + } + + i = search_directory((*iwant) ? help_dir : comhelp_dir, iwant, filenames, 1000); + if (i == 0) { + pprintf(p, "No help available on \"%s\".\n", iwant); + } else if ((i == 1) || !strcmp(*filenames, iwant)) { + if (psend_file(p, help_dir, *filenames)) { + /* we should never reach this unless the file was just deleted */ + pprintf(p, "Helpfile %s could not be found! ", *filenames); + pprintf(p, "Please inform an admin of this. Thank you.\n"); + } + } else { + if (*iwant) + pprintf(p, "Matches:"); + display_directory(p, filenames, i); + pprintf(p, "[Type \"info\" for a list of FICS general information files.]\n"); + } + return COM_OK; +} + +PUBLIC int com_info(int p, param_list param) +{ + int n; + char *filenames[1000]; + + if ((n = search_directory(info_dir, NULL, filenames, 1000)) > 0) + display_directory(p, filenames, n); + return COM_OK; +} + +PUBLIC int com_adhelp(int p, param_list param) +{ + int i; + static char nullify = '\0'; + char *iwant, *filenames[1000]; /* enough for all helpfile names */ + + if (param[0].type == TYPE_NULL) { + iwant = &nullify; + } else { + iwant = param[0].val.word; + if (!safestring(iwant)) { + pprintf(p, "Illegal character in command %s.\n", iwant); + return COM_OK; + } + } + + i = search_directory(adhelp_dir, iwant, filenames, 1000); + if (i == 0) { + pprintf(p, "No help available on \"%s\".\n", iwant); + } else if ((i == 1) || !strcmp(*filenames, iwant)) { + if (psend_file(p, adhelp_dir, *filenames)) { + /* we should never reach this unless the file was just deleted */ + pprintf(p, "Helpfile %s could not be found! ", *filenames); + pprintf(p, "Please inform an admin of this. Thank you.\n"); + } + } else { + if (*iwant) + pprintf(p, "Matches:\n"); + display_directory(p, filenames, i); + } + return COM_OK; +} + +PUBLIC int com_mailsource(int p, param_list param) +{ + static char nullify = '\0'; + char *iwant, *buffer[1000]; +/* char command[MAX_FILENAME_SIZE]; */ + char subj[81], fname[MAX_FILENAME_SIZE]; + int count; + + if (!parray[p].registered) { + pprintf(p, "Only registered people can use the mailsource command.\n"); + return COM_OK; + } + + if (param[0].type == TYPE_NULL) { + iwant = &nullify; + } else { + iwant = param[0].val.word; + } + + count = search_directory(source_dir, iwant, buffer, 1000); + if (count == 0) { + pprintf(p, "Found no source file matching \"%s\".\n", iwant); + } else if ((count == 1) || !strcmp(iwant, *buffer)) { + /* sprintf(command, "%s -s\"FICS sourcefile: %s\" %s < %s/%s&", MAILPROGRAM, + *buffer, parray[p].emailAddress, source_dir, *buffer); + system(command); */ + + sprintf(subj, "FICS source file from server %s: %s", fics_hostname, *buffer); + sprintf(fname, "%s/%s",source_dir, *buffer); + mail_file_to_user (p, subj, fname); + pprintf(p, "Source file %s sent to %s\n", *buffer, parray[p].emailAddress); + } else { + pprintf(p, "Found %d source files matching that:\n", count); + if (*iwant) + display_directory(p, buffer, count); + else { /* this junk is to get *.c *.h */ + multicol *m = multicol_start(count); + char *s; + int i; + for (i=0; i < count; i++) { + if (((s = buffer[i] + strlen(buffer[i]) - 2) >= buffer[i]) && (!strcmp(s, ".c") || !strcmp(s, ".h"))) + multicol_store(m, buffer[i]); + } + multicol_pprint(m, p, 78, 1); + multicol_end(m); + } + } + return COM_OK; +} + +PUBLIC int com_mailhelp(int p, param_list param) +{ /* Sparky */ + /* FILE *fp; char tmp[MAX_LINE_SIZE]; char fname[MAX_FILENAME_SIZE]; */ + char command[MAX_FILENAME_SIZE]; + char subj[81], fname[MAX_FILENAME_SIZE]; + char *iwant, *buffer[1000]; + + int count; + static char nullify = '\0'; + + if (!parray[p].registered) { + pprintf(p, "Only registered people can use the mailhelp command.\n"); + return COM_OK; + } + if (param[0].type == TYPE_NULL) + iwant = &nullify; + else + iwant = param[0].val.word; + + count = search_directory(help_dir, iwant, buffer, 1000); + if (count == 0) { + pprintf(p, "Found no help file matching \"%s\".\n", iwant); + } else if (count == 1) { + /* sprintf(command, "%s -s \"FICS helpfile: %s\" %s < %s/%s&", MAILPROGRAM, + *buffer, parray[p].emailAddress, help_dir, *buffer); + system(command);a */ + + + sprintf(subj, "FICS help file from server %s: %s", fics_hostname, *buffer); + sprintf(fname, "%s/%s",help_dir, *buffer); + mail_file_to_user (p, subj, fname); + + pprintf(p, "Help file %s sent to %s\n", *buffer, parray[p].emailAddress); + } else { + pprintf(p, "Found %d helpfiles matching that:\n", count); + display_directory(p, buffer, count); + } + + return COM_OK; +} + +PUBLIC int com_mailmess(int p, param_list param) +{ + char command[MAX_FILENAME_SIZE]; + char *buffer[1000]; + char mdir[MAX_FILENAME_SIZE]; + char filename[MAX_FILENAME_SIZE]; + char subj[81], fname[MAX_FILENAME_SIZE]; + + + if (!parray[p].registered) { + pprintf(p, "Only registered people can use the mailmess command.\n"); + return COM_OK; + } + sprintf(filename, "%s.messages", parray[p].login); + sprintf(mdir, "%s/player_data/%c/", stats_dir, parray[p].login[0]); + + if (search_directory(mdir, filename, buffer, 1000)) { +/* Sprintf(command, "%s -s \"Your FICS messages\" %s < %s%s&", MAILPROGRAM, + parray[p].emailAddress, mdir, filename); + system(command); */ + + sprintf(subj, "Your FICS messages from server %s", fics_hostname); + sprintf(fname, "%s/%s", mdir, filename); + mail_file_to_user (p, subj, fname); + + + + pprintf(p, "Messages sent to %s\n", parray[p].emailAddress); + } else { + pprintf(p, "You have no messages.\n"); + } + return COM_OK; + +} + +PUBLIC 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; +} + +PUBLIC int com_znotify(int p, param_list param) +{ + int p1, count = 0; + + for (p1 = 0; p1 < p_num; p1++) { + if (player_notified(p, p1)) { + if (!count) + pprintf(p, "Present company on your notify list:\n "); + pprintf(p, " %s", parray[p1].name); + count++; + } + } + if (count) + pprintf(p, ".\n"); + else + pprintf(p, "No one from your notify list is logged on.\n"); + + count = 0; + for (p1 = 0; p1 < p_num; p1++) { + if (player_notified(p1, p)) { + if (!count) + pprintf(p, + "The following players have you on their notify list:\n "); + pprintf(p, " %s", parray[p1].name); + count++; + } + } + if (count) + pprintf(p, ".\n"); + else + pprintf(p, "No one logged in has you on their notify list.\n"); + return COM_OK; +} + +PUBLIC int com_qtell(int p, param_list param) +{ + 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; +/* FILE *fp; */ + + if (!in_list("td", parray[p].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) { +/* + fp = fopen("/tmp/fics-log", "a"); + fprintf(fp, "PLAYER \"%s\" - MESSAGE \"%s\"\n", param[0].val.word, param[1].val.string); + fclose(fp); +*/ + 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", (parray[p1].highlight && parray[p1].bell) ? buffer4 : + (parray[p1].highlight && !parray[p1].bell) ? buffer3 : + (!parray[p1].highlight && parray[p1].bell) ? buffer2 : + buffer1); + pprintf(p, "*qtell %s 0*\n", parray[p1].name); + + } else { + int p1; + int i; + int ch = param[0].val.integer; + +/* + fp = fopen("/tmp/fics-log", "a"); + fprintf(fp, "CHANNEL \"%d\" - MESSAGE \"%s\"\n", param[0].val.integer, param[1].val.string); + fclose(fp); +*/ + + 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; + } + for (i = 0; i < numOn[ch]; i++) { + p1 = channels[ch][i]; + if (p1 == p) + continue; + if (player_censored(p1, p)) + continue; + if ((parray[p1].status == PLAYER_PASSWORD) + || (parray[p1].status == PLAYER_LOGIN)) + continue; + pprintf_prompt(p1, "\n%s\n", (parray[p1].highlight && parray[p1].bell) ? buffer4 : + (parray[p1].highlight && !parray[p1].bell) ? buffer3 : + (!parray[p1].highlight && parray[p1].bell) ? buffer2 : + buffer1); + } + pprintf(p, "*qtell %d 0*\n", param[0].val.integer); + } + return COM_OK; +} + +PUBLIC int com_getpi(int p, param_list param) +{ + int p1; + + if (!in_list("td", parray[p].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) || (parray[p1].registered == 0)) { + /* Darkside suggested not to return anything */ + return COM_OK; + } + if (!parray[p1].registered) { + pprintf(p, "*getpi %s -1 -1 -1*\n", parray[p1].name); + } else { + pprintf(p, "*getpi %s %d %d %d*\n", parray[p1].name, + parray[p1].w_stats.rating, + parray[p1].b_stats.rating, + parray[p1].s_stats.rating); + } + return COM_OK; +} + +PUBLIC int com_getps(int p, param_list param) +{ + int p1; + + if ((((p1 = player_find_bylogin(param[0].val.word)) < 0) || (parray[p1].registered == 0)) || (parray[p1].game < 0)) { + pprintf(p, "*status %s 1*\n", param[0].val.word); + return COM_OK; + } + pprintf(p, "*status %s 0 %s*\n", parray[p1].name, parray[(parray[p1].opponent)].name); + return COM_OK; +} +PUBLIC int com_limits(int p, param_list param) +{ + pprintf(p, "\nCurrent hardcoded limits:\n"); + pprintf(p, " Max number of players: %d\n", MAX_PLAYER); + 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 aliases: %d\n", MAX_ALIASES); + pprintf(p, " Max number of games you can observe at a time: %d\n", MAX_OBSERVE); + pprintf(p, " Max number of requests pending: %d\n", MAX_PENDING); + 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); + pprintf(p, "\nAdmin settable limits:\n"); + pprintf(p, " Quota list gives two shouts per %d seconds.\n", quota_time); + return COM_OK; +} diff --git a/FICS/config.h b/FICS/config.h new file mode 100644 index 0000000..0257657 --- /dev/null +++ b/FICS/config.h @@ -0,0 +1,107 @@ +/* config.h + * + */ + +/* Configure file locations in this include file. */ + +/* + 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 + (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. +*/ + +/* Revision history: + name email yy/mm/dd Change + Richard Nash 94/03/08 Created + Sparky 95/12/30 Beautified. +*/ + +#ifndef _CONFIG_H +#define _CONFIG_H + +/* CONFIGURE THIS: The port on which the server binds */ + +#define DEFAULT_PORT 5000 + +/* Must be a dns recognisable host name */ + +#define SERVER_HOSTNAME "fics.somewhere.domain" + +/* At AFICS we just use 'fics' but for your server you might want to change this + eg to BICS, EICS, DICS etc */ + +#define SERVER_NAME "Xfics" /* for pgn output */ + +#define SERVER_LOCATION "Unconfigured City, Country" /* for pgn output */ + + +/* 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 DEFAULT_MESS "/usr/home/fics/FICS.DIST/data/messages" +#define DEFAULT_INDEX "/usr/home/fics/FICS.DIST/data/index" +#define DEFAULT_HELP "/usr/home/fics/FICS.DIST/data/help" +#define DEFAULT_COMHELP "/usr/home/fics/FICS.DIST/data/com_help" +#define HELP_SPANISH "/usr/home/fics/FICS.DIST/data/Spanish" +#define HELP_FRENCH "/usr/home/fics/FICS.DIST/data/French" +#define HELP_DANISH "/usr/home/fics/FICS.DIST/data/Danish" +#define DEFAULT_INFO "/usr/home/fics/FICS.DIST/data/info" +#define DEFAULT_ADHELP "/usr/home/fics/FICS.DIST/data/admin" +#define DEFAULT_USCF "/usr/home/fics/FICS.DIST/data/uscf" +#define DEFAULT_STATS "/usr/home/fics/FICS.DIST/data/stats" +#define DEFAULT_CONFIG "/usr/home/fics/FICS.DIST/config" +#define DEFAULT_PLAYERS "/usr/home/fics/FICS.DIST/players" +#define DEFAULT_ADJOURNED "/usr/home/fics/FICS.DIST/games/adjourned" +#define DEFAULT_HISTORY "/usr/home/fics/FICS.DIST/games/history" +#define DEFAULT_JOURNAL "/usr/home/fics/FICS.DIST/games/journal" +#define DEFAULT_BOARDS "/usr/home/fics/FICS.DIST/data/boards" +#define DEFAULT_SOURCE "/usr/home/fics/FICS.DIST/FICS" +#define DEFAULT_LISTS "/usr/home/fics/FICS.DIST/data/lists" +#define DEFAULT_NEWS "/usr/home/fics/FICS.DIST/data/news" +#define DEFAULT_BOOK "/usr/home/fics/FICS.DIST/data/book" +#define MESS_FULL "/usr/home/fics/FICS.DIST/data/messages/full" +#define MESS_FULL_UNREG "/usr/home/fics/FICS.DIST/data/messages/full_unreg" +#define DEFAULT_USAGE "/usr/home/fics/FICS.DIST/data/usage" +#define USAGE_SPANISH "/usr/home/fics/FICS.DIST/data/usage_spanish" +#define USAGE_FRENCH "/usr/home/fics/FICS.DIST/data/usage_french" +#define USAGE_DANISH "/usr/home/fics/FICS.DIST/data/usage_danish" + + +/* Where the standard ucb mail program is */ + +#define MAILPROGRAM "/usr/ucb/mail" + +/* SENDMAILPROG is a faster and more reliable means of sending mail if + defined. Make sure your system mailer agent is defined here properly + for your system with respect to name, location and options. These may + differ significatly depending on the type of system and what mailer is + installed */ +/* The floowing works fine for SunOS4.1.X with berkeley sendmail */ + +/* #define SENDMAILPROG "/usr/lib/sendmail -t" */ + +/* Details of the head admin */ + +#define HADMINHANDLE "AdminGuy" +#define HADMINEMAIL "AdminGuy@this.place" + +/* Registration mail address */ + +#define REGMAIL "AdminGuy@this.place" + +#endif /* _CONFIG_H */ diff --git a/FICS/config.h.dist b/FICS/config.h.dist new file mode 100644 index 0000000..0257657 --- /dev/null +++ b/FICS/config.h.dist @@ -0,0 +1,107 @@ +/* config.h + * + */ + +/* Configure file locations in this include file. */ + +/* + 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 + (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. +*/ + +/* Revision history: + name email yy/mm/dd Change + Richard Nash 94/03/08 Created + Sparky 95/12/30 Beautified. +*/ + +#ifndef _CONFIG_H +#define _CONFIG_H + +/* CONFIGURE THIS: The port on which the server binds */ + +#define DEFAULT_PORT 5000 + +/* Must be a dns recognisable host name */ + +#define SERVER_HOSTNAME "fics.somewhere.domain" + +/* At AFICS we just use 'fics' but for your server you might want to change this + eg to BICS, EICS, DICS etc */ + +#define SERVER_NAME "Xfics" /* for pgn output */ + +#define SERVER_LOCATION "Unconfigured City, Country" /* for pgn output */ + + +/* 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 DEFAULT_MESS "/usr/home/fics/FICS.DIST/data/messages" +#define DEFAULT_INDEX "/usr/home/fics/FICS.DIST/data/index" +#define DEFAULT_HELP "/usr/home/fics/FICS.DIST/data/help" +#define DEFAULT_COMHELP "/usr/home/fics/FICS.DIST/data/com_help" +#define HELP_SPANISH "/usr/home/fics/FICS.DIST/data/Spanish" +#define HELP_FRENCH "/usr/home/fics/FICS.DIST/data/French" +#define HELP_DANISH "/usr/home/fics/FICS.DIST/data/Danish" +#define DEFAULT_INFO "/usr/home/fics/FICS.DIST/data/info" +#define DEFAULT_ADHELP "/usr/home/fics/FICS.DIST/data/admin" +#define DEFAULT_USCF "/usr/home/fics/FICS.DIST/data/uscf" +#define DEFAULT_STATS "/usr/home/fics/FICS.DIST/data/stats" +#define DEFAULT_CONFIG "/usr/home/fics/FICS.DIST/config" +#define DEFAULT_PLAYERS "/usr/home/fics/FICS.DIST/players" +#define DEFAULT_ADJOURNED "/usr/home/fics/FICS.DIST/games/adjourned" +#define DEFAULT_HISTORY "/usr/home/fics/FICS.DIST/games/history" +#define DEFAULT_JOURNAL "/usr/home/fics/FICS.DIST/games/journal" +#define DEFAULT_BOARDS "/usr/home/fics/FICS.DIST/data/boards" +#define DEFAULT_SOURCE "/usr/home/fics/FICS.DIST/FICS" +#define DEFAULT_LISTS "/usr/home/fics/FICS.DIST/data/lists" +#define DEFAULT_NEWS "/usr/home/fics/FICS.DIST/data/news" +#define DEFAULT_BOOK "/usr/home/fics/FICS.DIST/data/book" +#define MESS_FULL "/usr/home/fics/FICS.DIST/data/messages/full" +#define MESS_FULL_UNREG "/usr/home/fics/FICS.DIST/data/messages/full_unreg" +#define DEFAULT_USAGE "/usr/home/fics/FICS.DIST/data/usage" +#define USAGE_SPANISH "/usr/home/fics/FICS.DIST/data/usage_spanish" +#define USAGE_FRENCH "/usr/home/fics/FICS.DIST/data/usage_french" +#define USAGE_DANISH "/usr/home/fics/FICS.DIST/data/usage_danish" + + +/* Where the standard ucb mail program is */ + +#define MAILPROGRAM "/usr/ucb/mail" + +/* SENDMAILPROG is a faster and more reliable means of sending mail if + defined. Make sure your system mailer agent is defined here properly + for your system with respect to name, location and options. These may + differ significatly depending on the type of system and what mailer is + installed */ +/* The floowing works fine for SunOS4.1.X with berkeley sendmail */ + +/* #define SENDMAILPROG "/usr/lib/sendmail -t" */ + +/* Details of the head admin */ + +#define HADMINHANDLE "AdminGuy" +#define HADMINEMAIL "AdminGuy@this.place" + +/* Registration mail address */ + +#define REGMAIL "AdminGuy@this.place" + +#endif /* _CONFIG_H */ diff --git a/FICS/dfree.c b/FICS/dfree.c new file mode 100644 index 0000000..ebd9e4d --- /dev/null +++ b/FICS/dfree.c @@ -0,0 +1,226 @@ +/* Free a block of memory allocated by `malloc'. + Copyright 1990, 1991, 1992, 1994 Free Software Foundation, Inc. + Written May 1989 by Mike Haertel. + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public License as +published by the Free Software Foundation; either version 2 of the +License, or (at your option) any later version. + +This library 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 +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public +License along with this library; see the file COPYING.LIB. If +not, write to the Free Software Foundation, Inc., 675 Mass Ave, +Cambridge, MA 02139, USA. + + The author may be reached (Email) at the address mike@ai.mit.edu, + or (US mail) as Mike Haertel c/o Free Software Foundation. */ + +#ifndef _MALLOC_INTERNAL +#define _MALLOC_INTERNAL +#include +#endif + +/* Debugging hook for free. */ +void (*__free_hook) __P ((__ptr_t __ptr)); + +/* List of blocks allocated by memalign. */ +struct alignlist *_aligned_blocks = NULL; + +/* Return memory to the heap. + Like `free' but don't call a __free_hook if there is one. */ +void +_free_internal (ptr) + __ptr_t ptr; +{ + int type; + __malloc_size_t block, blocks; + register __malloc_size_t i; + struct list *prev, *next; + + block = BLOCK (ptr); + + type = _heapinfo[block].busy.type; + switch (type) + { + case 0: + /* Get as many statistics as early as we can. */ + --_chunks_used; + _bytes_used -= _heapinfo[block].busy.info.size * BLOCKSIZE; + _bytes_free += _heapinfo[block].busy.info.size * BLOCKSIZE; + + /* Find the free cluster previous to this one in the free list. + Start searching at the last block referenced; this may benefit + programs with locality of allocation. */ + i = _heapindex; + if (i > block) + while (i > block) + i = _heapinfo[i].free.prev; + else + { + do + i = _heapinfo[i].free.next; + while (i > 0 && i < block); + i = _heapinfo[i].free.prev; + } + + /* Determine how to link this block into the free list. */ + if (block == i + _heapinfo[i].free.size) + { + /* Coalesce this block with its predecessor. */ + _heapinfo[i].free.size += _heapinfo[block].busy.info.size; + block = i; + } + else + { + /* Really link this block back into the free list. */ + _heapinfo[block].free.size = _heapinfo[block].busy.info.size; + _heapinfo[block].free.next = _heapinfo[i].free.next; + _heapinfo[block].free.prev = i; + _heapinfo[i].free.next = block; + _heapinfo[_heapinfo[block].free.next].free.prev = block; + ++_chunks_free; + } + + /* Now that the block is linked in, see if we can coalesce it + with its successor (by deleting its successor from the list + and adding in its size). */ + if (block + _heapinfo[block].free.size == _heapinfo[block].free.next) + { + _heapinfo[block].free.size + += _heapinfo[_heapinfo[block].free.next].free.size; + _heapinfo[block].free.next + = _heapinfo[_heapinfo[block].free.next].free.next; + _heapinfo[_heapinfo[block].free.next].free.prev = block; + --_chunks_free; + } + + /* Now see if we can return stuff to the system. */ + blocks = _heapinfo[block].free.size; + if (blocks >= FINAL_FREE_BLOCKS && block + blocks == _heaplimit + && (*__morecore) (0) == ADDRESS (block + blocks)) + { + register __malloc_size_t bytes = blocks * BLOCKSIZE; + _heaplimit -= blocks; + (*__morecore) (-bytes); + _heapinfo[_heapinfo[block].free.prev].free.next + = _heapinfo[block].free.next; + _heapinfo[_heapinfo[block].free.next].free.prev + = _heapinfo[block].free.prev; + block = _heapinfo[block].free.prev; + --_chunks_free; + _bytes_free -= bytes; + } + + /* Set the next search to begin at this block. */ + _heapindex = block; + break; + + default: + /* Do some of the statistics. */ + --_chunks_used; + _bytes_used -= 1 << type; + ++_chunks_free; + _bytes_free += 1 << type; + + /* Get the address of the first free fragment in this block. */ + prev = (struct list *) ((char *) ADDRESS (block) + + (_heapinfo[block].busy.info.frag.first << type)); + + if (_heapinfo[block].busy.info.frag.nfree == (BLOCKSIZE >> type) - 1) + { + /* If all fragments of this block are free, remove them + from the fragment list and free the whole block. */ + next = prev; + for (i = 1; i < (__malloc_size_t) (BLOCKSIZE >> type); ++i) + next = next->next; + prev->prev->next = next; + if (next != NULL) + next->prev = prev->prev; + _heapinfo[block].busy.type = 0; + _heapinfo[block].busy.info.size = 1; + + /* Keep the statistics accurate. */ + ++_chunks_used; + _bytes_used += BLOCKSIZE; + _chunks_free -= BLOCKSIZE >> type; + _bytes_free -= BLOCKSIZE; + + free (ADDRESS (block)); + } + else if (_heapinfo[block].busy.info.frag.nfree != 0) + { + /* If some fragments of this block are free, link this + fragment into the fragment list after the first free + fragment of this block. */ + + /****** Test for no double frees --mann ********/ + { +#include + struct list* tmp = prev; + + while (tmp != NULL && BLOCK(tmp) == BLOCK(ptr)) { + if (tmp == ptr) { + fprintf(stderr, "Freeing already freed memory!\n"); + abort(); + } + tmp = tmp->next; + } + } + /************************************************/ + + next = (struct list *) ptr; + next->next = prev->next; + next->prev = prev; + prev->next = next; + if (next->next != NULL) + next->next->prev = next; + ++_heapinfo[block].busy.info.frag.nfree; + } + else + { + /* No fragments of this block are free, so link this + fragment into the fragment list and announce that + it is the first free fragment of this block. */ + prev = (struct list *) ptr; + _heapinfo[block].busy.info.frag.nfree = 1; + _heapinfo[block].busy.info.frag.first = (unsigned long int) + ((unsigned long int) ((char *) ptr - (char *) NULL) + % BLOCKSIZE >> type); + prev->next = _fraghead[type].next; + prev->prev = &_fraghead[type]; + prev->prev->next = prev; + if (prev->next != NULL) + prev->next->prev = prev; + } + break; + } +} + +/* Return memory to the heap. */ +void +free (ptr) + __ptr_t ptr; +{ + register struct alignlist *l; + + if (ptr == NULL) + return; + + for (l = _aligned_blocks; l != NULL; l = l->next) + if (l->aligned == ptr) + { + l->aligned = NULL; /* Mark the slot in the list as free. */ + ptr = l->exact; + break; + } + + if (__free_hook != NULL) + (*__free_hook) (ptr); + else + _free_internal (ptr); +} diff --git a/FICS/eco.c b/FICS/eco.c new file mode 100644 index 0000000..80b1196 --- /dev/null +++ b/FICS/eco.c @@ -0,0 +1,428 @@ +#include "stdinclude.h" +#include "board.h" +#include "gamedb.h" +#include "command.h" +#include "playerdb.h" +#include "gameproc.h" +#include "obsproc.h" +#include "utils.h" +#include "common.h" +#include "config.h" + +PUBLIC char *book_dir = DEFAULT_BOOK; + +typedef struct { + char ECO[4]; + char FENpos[80]; +} ECO_entry; + +typedef struct { + char NIC[6]; + char FENpos[80]; +} NIC_entry; + +typedef struct { + char LONG[80]; + char FENpos[80]; +} LONG_entry; + +ECO_entry *ECO_book[1096]; +NIC_entry *NIC_book[1096]; +LONG_entry *LONG_book[4096]; + +int ECO_entries, NIC_entries, LONG_entries; + +char *boardToFEN(int g) +{ + int i,j; + static char FENstring[80]; + int FENcount = 0; + int space = 0; + + for(i=7; i>=0; i--) { + for(j=0; j<8; j++) { + switch(garray[g].game_state.board[j][i]) { + case W_PAWN: + if (space>0) { + FENstring[FENcount++]=space+'0'; + space=0; + } + FENstring[FENcount++]='P'; + break; + case W_ROOK: + if (space>0) { + FENstring[FENcount++]=space+'0'; + space=0; + } + FENstring[FENcount++]='R'; + break; + case W_KNIGHT: + if (space>0) { + FENstring[FENcount++]=space+'0'; + space=0; + } + FENstring[FENcount++]='N'; + break; + case W_BISHOP: + if (space>0) { + FENstring[FENcount++]=space+'0'; + space=0; + } + FENstring[FENcount++]='B'; + break; + case W_QUEEN: + if (space>0) { + FENstring[FENcount++]=space+'0'; + space=0; + } + FENstring[FENcount++]='Q'; + break; + case W_KING: + if (space>0) { + FENstring[FENcount++]=space+'0'; + space=0; + } + FENstring[FENcount++]='K'; + break; + case B_PAWN: + if (space>0) { + FENstring[FENcount++]=space+'0'; + space=0; + } + FENstring[FENcount++]='p'; + break; + case B_ROOK: + if (space>0) { + FENstring[FENcount++]=space+'0'; + space=0; + } + FENstring[FENcount++]='r'; + break; + case B_KNIGHT: + if (space>0) { + FENstring[FENcount++]=space+'0'; + space=0; + } + FENstring[FENcount++]='n'; + break; + case B_BISHOP: + if (space>0) { + FENstring[FENcount++]=space+'0'; + space=0; + } + FENstring[FENcount++]='b'; + break; + case B_QUEEN: + if (space>0) { + FENstring[FENcount++]=space+'0'; + space=0; + } + FENstring[FENcount++]='q'; + break; + case B_KING: + if (space>0) { + FENstring[FENcount++]=space+'0'; + space=0; + } + FENstring[FENcount++]='k'; + break; + default: + space++; + break; + } + } + if (space>0) { + FENstring[FENcount++]=space+'0'; + space=0; + } + FENstring[FENcount++]='/'; + } + FENstring[--FENcount]=' '; + FENstring[++FENcount]=(garray[g].game_state.onMove==WHITE) ? 'w' : 'b'; + FENstring[++FENcount]='\0'; + return FENstring; +} + +void ECO_init() +{ + FILE *fp; + char tmp[1024]; + char *ptmp= tmp; + char FENpos[73], ECO[4], onMove[2]; + char filename[1024]; + int i=0; + + sprintf(filename, "%s/eco999.idx", book_dir); + fp= fopen(filename, "r"); + if (!fp) { + fprintf(stderr, "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) { + fprintf(stderr, "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; + fprintf(stderr, "%d entries in ECO book\n", i); + ECO_entries = i; + + while (--i >= 0) + if (ECO_book[i] == NULL) + fprintf(stderr, "ERROR! ECO book position number %d is NULL.", i); +} + +void NIC_init() +{ + FILE *fp; + char tmp[1024]; + char *ptmp= tmp; + char FENpos[73], NIC[6], onMove[2]; + char filename[1024]; + int i=0; + + sprintf(filename, "%s/nic999.idx", book_dir); + fp= fopen(filename, "r"); + if (!fp) { + fprintf(stderr, "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) { + fprintf(stderr, "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; + fprintf(stderr, "%d entries in NIC book\n", i); + NIC_entries = i; +} + +void LONG_init() +{ + FILE *fp; + char tmp[1024]; + char *ptmp= tmp; + char FENpos[73], LONG[256], onMove[2]; + char filename[1024]; + int i=0; + + sprintf(filename, "%s/long999.idx", book_dir); + fp= fopen(filename, "r"); + if (!fp) { + fprintf(stderr, "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) { + fprintf(stderr, "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; + fprintf(stderr, "%d entries in LONG book\n", i); + LONG_entries = i; +} + +void BookInit() +{ + ECO_init(); + NIC_init(); + LONG_init(); +} + +char *getECO(int g) +{ + static char ECO[4]; + +#ifndef IGNORE_ECO + + int i, flag, l = 0, r = ECO_entries - 1, x; + + + if ((parray[garray[g].white].private) || (parray[garray[g].black].private)) { + strcpy(ECO, "---"); + return ECO; + } else { + if (garray[g].type == TYPE_WILD) { + strcpy(ECO, "---"); + return ECO; + } else if (garray[g].moveList == NULL) { + strcpy(ECO, "***"); + return ECO; + } else { + strcpy(ECO, "A00"); + } + } + + for (flag=0,i=garray[g].numHalfMoves; (i>0 && !flag); i--) { + l = 0; + r = ECO_entries - 1; + while ((r >= l) && !flag) { + x = (l+r)/2; + if ((strcmp(garray[g].moveList[i].FENpos, ECO_book[x]->FENpos)) < 0) + r = x - 1; + else + l = x + 1; + if (!strcmp(garray[g].moveList[i].FENpos, ECO_book[x]->FENpos)) { + strcpy(ECO, ECO_book[x]->ECO); + flag=1; + } + } + } +#else + + strcpy(ECO, "---"); + +#endif + + + return ECO; +} + +PUBLIC int com_eco(int p, param_list param) +{ + +#ifndef IGNORE_ECO + + int i, flag = 0, x, l, r; + int g1, p1; + + + if (param[0].type == TYPE_NULL) { /* own game */ + if (parray[p].game < 0) { + pprintf(p, "You are not playing or examining a game.\n"); + return COM_OK; + } + g1=parray[p].game; + if (garray[g1].status != GAME_EXAMINE && !pIsPlaying(p)) + return COM_OK; + } else { + g1 = GameNumFromParam (p, &p1, ¶m[0]); + if (g1 < 0) return COM_OK; + if ((g1 >= g_num) || ((garray[g1].status != GAME_ACTIVE) && + (garray[g1].status != GAME_EXAMINE))) { + pprintf(p, "There is no such game.\n"); + return COM_OK; + } + } + + if ((((parray[garray[g1].white].private) || + (parray[garray[g1].black].private))) && + (parray[p].adminLevel==0)) { + pprintf(p, "Sorry - that game is private.\n"); + return COM_OK; + } else { + if (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, + garray[g1].white_name, + garray[g1].black_name); + + if (garray[g1].moveList==NULL) { + return COM_OK; + } + + for (flag=0,i=garray[g1].numHalfMoves; (i>0 && !flag); i--) { + l = 0; + r = ECO_entries - 1; + while ((r >= l) && !flag) { + x = (l+r)/2; + if ((strcmp(garray[g1].moveList[i].FENpos, ECO_book[x]->FENpos)) < 0) + r = x - 1; + else + l = x + 1; + if (!strcmp(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=garray[g1].numHalfMoves; ((i>0) && (!flag)); i--) { + l = 0; + r = NIC_entries - 1; + while ((r >=l) && !flag) { + x = (l+r)/2; + if ((strcmp(garray[g1].moveList[i].FENpos, NIC_book[x]->FENpos)) < 0) + r = x - 1; + else + l = x + 1; + if (!strcmp(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=garray[g1].numHalfMoves; ((i>0) && (!flag)); i--) { + l = 0; + r = LONG_entries - 1; + while ((r >=l) && !flag) { + x = (l+r)/2; + if ((strcmp(garray[g1].moveList[i].FENpos, LONG_book[x]->FENpos)) < 0) + r = x - 1; + else + l = x + 1; + if (!strcmp(garray[g1].moveList[i].FENpos, LONG_book[x]->FENpos)) { + pprintf(p, " LONG[%3d]: %s\n", i, LONG_book[x]->LONG); + flag=1; + } + } + } + +#else + + pprintf(p, "ECO not available... out of service!.\n"); + +#endif + + return COM_OK; +} diff --git a/FICS/eco.h b/FICS/eco.h new file mode 100644 index 0000000..92e8d0b --- /dev/null +++ b/FICS/eco.h @@ -0,0 +1,12 @@ +#ifndef _ECO_H +#define _ECO_H + +extern char *boardToFEN(); +extern void ECO_init(); +extern void NIC_init(); +extern void LONG_init(); +extern void BookInit(); +extern int com_eco(); +extern char *getECO(); + +#endif diff --git a/FICS/fics_addplayer.c b/FICS/fics_addplayer.c new file mode 100644 index 0000000..709f741 --- /dev/null +++ b/FICS/fics_addplayer.c @@ -0,0 +1,167 @@ +/* fics_addplayer.c + * + */ + +/* + fics - An internet chess server. + Copyright (C) 1994 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 + (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. +*/ + +/* Revision history: + name email yy/mm/dd Change + Richard Nash 94/03/07 Created +*/ + +#include "stdinclude.h" + +#include "common.h" +#include "utils.h" +#include "playerdb.h" +/* #include "hostinfo.h" */ +#include "command.h" + +extern time_t time(); +extern int printf(); + +PRIVATE void usage(char *progname) +{ + fprintf(stderr, "Usage: %s [-l] [-n] UserName FullName EmailAddress\n", progname); + exit(1); +} + +/* Parameters */ +int local = 1; +char *funame = NULL, *fname = NULL, *email = NULL; + +#define PASSLEN 4 +PUBLIC int main(int argc, char *argv[]) +{ + int i; + int p; + char password[PASSLEN + 1]; + char salt[3]; + char text[2048]; + + for (i = 1; i < argc; i++) { + if (argv[i][0] == '-') { + switch (argv[i][1]) { + case 'l': + local = 1; + break; + case 'n': + local = 0; + break; + default: + usage(argv[0]); + break; + } + } else { + if (!funame) + funame = argv[i]; + else if (!fname) + fname = argv[i]; + else if (!email) + email = argv[i]; + else + usage(argv[0]); + } + } + if (!funame || !fname || !email) + usage(argv[0]); + + /* Add the player here */ + if (strlen(funame) >= MAX_LOGIN_NAME) { + fprintf(stderr, "Player name is too long\n"); + exit(0); + } + if (strlen(funame) < 3) { + fprintf(stderr, "Player name is too short\n"); + exit(0); + } + if (!alphastring(funame)) { + fprintf(stderr, "Illegal characters in player name. Only A-Za-z allowed.\n"); + exit(0); + } + +/* loon: see if we can deliver mail to this email address. */ +/* + printf("Verifying email address %s...\n", email); + if (check_emailaddr(email)) { + fprintf(stderr, "The email address %s looks bad.\n", email); + exit(0); + } +*/ +/* + if (local) + iamserver = 0; + else + iamserver = 1; +*/ +/* if (hostinfo_init()) { + if (iamserver) { + fprintf(stderr, "Can't read from hostinfo file.\n"); + fprintf(stderr, "Remember you need -l for local.\n"); + exit(1); + } else { + } + } */ + player_init(0); + srand(time(0)); + p = player_new(); + if (!player_read(p, funame)) { + fprintf(stderr, "%s already exists.\n", funame); + exit(0); + } + parray[p].name = strdup(funame); + parray[p].login = strdup(funame); + stolower(parray[p].login); + parray[p].fullName = strdup(fname); + parray[p].emailAddress = strdup(email); + for (i = 0; i < PASSLEN; i++) { + password[i] = 'a' + rand() % 26; + } + password[i] = '\0'; + salt[0] = 'a' + rand() % 26; + salt[1] = 'a' + rand() % 26; + salt[2] = '\0'; + parray[p].passwd = strdup(crypt(password, salt)); + parray[p].registered = 1; +/* parray[p].network_player = !local; */ + parray[p].rated = 1; + 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); + sprintf(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 player account: >%s< >%s< >%s< >%s<\n", + funame, fname, email, 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\nTo connect to the server and use this account:\n\n" + " telnet %s 5000\n\nand enter your handle name and password.\n\n" + "Regards,\n\nThe FICS admins\n", + funame, fname, email, password, fics_hostname); + + mail_string_to_address(email, "FICS Account Created", text); + exit(0); +} diff --git a/FICS/ficsmain.c b/FICS/ficsmain.c new file mode 100644 index 0000000..b1882f3 --- /dev/null +++ b/FICS/ficsmain.c @@ -0,0 +1,183 @@ +/* ficsmain.c + * + */ + +/* + 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 + (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. +*/ + +/* Revision history: + name email yy/mm/dd Change + Richard Nash 93/10/22 Created +*/ + +#include "stdinclude.h" + +#include "common.h" +#include "ficsmain.h" +#include "config.h" +#include "network.h" +#include "command.h" +#include "playerdb.h" +#include "ratings.h" +#include "utils.h" +/*#include "hostinfo.h" */ +#include "board.h" +#include "talkproc.h" +#include "comproc.h" +#include "shutdown.h" +#ifndef IGNORE_ECO +#include "eco.h" +#endif +#include + +/* Arguments */ +PUBLIC int port; +PUBLIC int withConsole; + +/* grimm */ +void player_array_init(void); +/* for warning */ + +PRIVATE void usage(char *progname) +{ + fprintf(stderr, "Usage: %s [-p port] [-C] [-h]\n", progname); + fprintf(stderr, "\t\t-p port\t\tSpecify port. (Default=5000)\n"); + fprintf(stderr, "\t\t-C\t\tStart with console player connected to stdin.\n"); + fprintf(stderr, "\t\t-h\t\tDisplay this information.\n"); + exit(1); +} + +PRIVATE void GetArgs(int argc, char *argv[]) +{ + int i; + + port = DEFAULT_PORT; + withConsole = 0; + + for (i = 1; i < argc; i++) { + if (argv[i][0] == '-') { + switch (argv[i][1]) { + case 'p': + if (i == argc - 1) + usage(argv[0]); + i++; + if (sscanf(argv[i], "%d", &port) != 1) + usage(argv[0]); + break; + case 'C': + fprintf(stderr, "-C Not implemented!\n"); + exit(1); + withConsole = 1; + break; + case 'h': + usage(argv[0]); + break; + } + } else { + usage(argv[0]); + } + } +} + +PRIVATE void main_event_loop(void) { +int current_socket; +char command_string[MAX_STRING_LENGTH]; + + while (1) { + ngc2(command_string, HEARTBEATTIME); + if (process_heartbeat(¤t_socket) == COM_LOGOUT) { + process_disconnection(current_socket); + net_close_connection(current_socket); + } + } +} + +void TerminateServer(int sig) +{ + fprintf(stderr, "FICS: Got signal %d\n", sig); + output_shut_mess(); + TerminateCleanup(); + net_close(); + exit(1); +} + +void BrokenPipe(int sig) +{ + fprintf(stderr, "FICS: Got Broken Pipe\n"); +} + +PUBLIC int main(int argc, char *argv[]) +{ + +#ifdef DEBUG +#ifdef HAVE_MALLOC_DEBUG + malloc_debug(16); +#endif +#endif + GetArgs(argc, argv); + signal(SIGTERM, TerminateServer); + signal(SIGINT, TerminateServer); + signal(SIGPIPE, BrokenPipe); + if (net_init(port)) { + fprintf(stderr, "FICS: Network initialize failed on port %d.\n", port); + exit(1); + } + startuptime = time(0); +/* Using the value defined in config.h now instead of the real hostname. + This is used as the return address in email, so it needs to be a real + DNS resolvable hostname! Sparky */ +/* gethostname(fics_hostname, 80); */ + strcpy ( fics_hostname, SERVER_HOSTNAME ); + quota_time = 60; + player_high = 0; + game_high = 0; + srand(startuptime); + fprintf(stderr, "FICS: Initialized on port %d at %s.\n", port, strltime(&startuptime)); +/* iamserver = 0; */ +/* if (hostinfo_init()) { + MailGameResult = 0; + fprintf(stderr, "FICS: No ratings server connection.\n"); + } else { + if (iamserver) { + fprintf(stderr, "FICS: I don't know how to be a ratings server, refusing.\n"); + MailGameResult = 0; + } else { + fprintf(stderr, "FICS: Ratings server set to: %s\n", hArray[0].email_address); + MailGameResult = 1; + } + } */ +/* if (mail_log_file) + fclose(mail_log_file); */ + fprintf(stderr, "FICS: commands_init()\n"); + commands_init(); +/* fprintf(stderr, "FICS: channel_init()\n"); + channel_init(); */ + fprintf(stderr, "FICS: rating_init()\n"); + rating_init(); + fprintf(stderr, "FICS: wild_init()\n"); + wild_init(); +#ifndef IGNORE_ECO + fprintf(stderr, "FICS: book init()\n"); + BookInit(); +#endif + fprintf(stderr, "FICS: player_array_init()\n"); + player_array_init(); + player_init(withConsole); + main_event_loop(); + fprintf(stderr, "FICS: Closing down.\n"); + output_shut_mess(); + net_close(); + return 0; +} diff --git a/FICS/ficsmain.c.orig b/FICS/ficsmain.c.orig new file mode 100644 index 0000000..d8ad0a1 --- /dev/null +++ b/FICS/ficsmain.c.orig @@ -0,0 +1,171 @@ +/* ficsmain.c + * + */ + +/* + 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 + (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. +*/ + +/* Revision history: + name email yy/mm/dd Change + Richard Nash 93/10/22 Created +*/ + +#include "stdinclude.h" + +#include "common.h" +#include "ficsmain.h" +#include "config.h" +#include "network.h" +#include "command.h" +#include "channel.h" +#include "playerdb.h" +#include "ratings.h" +#include "utils.h" +/*#include "hostinfo.h" */ +#include "board.h" +#include "talkproc.h" +#include "comproc.h" +#include "eco.h" + +/* Arguments */ +PUBLIC int port; +PUBLIC int withConsole; + +/* grimm */ +void player_array_init(void); +/* for warning */ + +PRIVATE void usage(char *progname) +{ + fprintf(stderr, "Usage: %s [-p port] [-C] [-h]\n", progname); + fprintf(stderr, "\t\t-p port\t\tSpecify port. (Default=5000)\n"); + fprintf(stderr, "\t\t-C\t\tStart with console player connected to stdin.\n"); + fprintf(stderr, "\t\t-h\t\tDisplay this information.\n"); + exit(1); +} + +PRIVATE void GetArgs(int argc, char *argv[]) +{ + int i; + + port = DEFAULT_PORT; + withConsole = 0; + + for (i = 1; i < argc; i++) { + if (argv[i][0] == '-') { + switch (argv[i][1]) { + case 'p': + if (i == argc - 1) + usage(argv[0]); + i++; + if (sscanf(argv[i], "%d", &port) != 1) + usage(argv[0]); + break; + case 'C': + fprintf(stderr, "-C Not implemented!\n"); + exit(1); + withConsole = 1; + break; + case 'h': + usage(argv[0]); + break; + } + } else { + usage(argv[0]); + } + } +} + +PRIVATE void main_event_loop(void) { +int current_socket; +char command_string[MAX_STRING_LENGTH]; + + while (1) { + ngc2(command_string, HEARTBEATTIME); + if (process_heartbeat(¤t_socket) == COM_LOGOUT) { + process_disconnection(current_socket); + net_close_connection(current_socket); + } + } +} + +void TerminateServer(int sig) +{ + fprintf(stderr, "FICS: Got signal %d\n", sig); + TerminateCleanup(); + net_close(); + exit(1); +} + +void BrokenPipe(int sig) +{ + fprintf(stderr, "FICS: Got Broken Pipe\n"); +} + +PUBLIC int main(int argc, char *argv[]) +{ +#ifdef SYSTEM_NEXT +#ifdef DEBUG + malloc_debug(16); +#endif +#endif + GetArgs(argc, argv); + signal(SIGTERM, TerminateServer); + signal(SIGINT, TerminateServer); + signal(SIGPIPE, BrokenPipe); + if (net_init(port)) { + fprintf(stderr, "FICS: Network initialize failed on port %d.\n", port); + exit(1); + } + startuptime = time(0); + gethostname(fics_hostname, 80); + quota_time = 60; + player_high = 0; + game_high = 0; + srand(startuptime); + fprintf(stderr, "FICS: Initialized on port %d at %s.\n", port, strltime(&startuptime)); +/* iamserver = 0; */ +/* if (hostinfo_init()) { + MailGameResult = 0; + fprintf(stderr, "FICS: No ratings server connection.\n"); + } else { + if (iamserver) { + fprintf(stderr, "FICS: I don't know how to be a ratings server, refusing.\n"); + MailGameResult = 0; + } else { + fprintf(stderr, "FICS: Ratings server set to: %s\n", hArray[0].email_address); + MailGameResult = 1; + } + } */ +/* if (mail_log_file) + fclose(mail_log_file); */ + fprintf(stderr, "FICS: commands_init()\n"); + commands_init(); + fprintf(stderr, "FICS: channel_init()\n"); + channel_init(); + fprintf(stderr, "FICS: rating_init()\n"); + rating_init(); + fprintf(stderr, "FICS: wild_init()\n"); + wild_init(); + fprintf(stderr, "FICS: book init()\n"); + BookInit(); + fprintf(stderr, "FICS: player_array_init()\n"); + player_array_init(); + player_init(withConsole); + main_event_loop(); + fprintf(stderr, "FICS: Closing down.\n"); + net_close(); + return 0; +} diff --git a/FICS/ficsmain.h b/FICS/ficsmain.h new file mode 100644 index 0000000..dd7d98d --- /dev/null +++ b/FICS/ficsmain.h @@ -0,0 +1,61 @@ +/* ficsmain.h + * + */ + +/* + 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 + (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. +*/ + +/* Revision history: + name email yy/mm/dd Change + Richard Nash 93/10/22 Created +*/ + +#ifndef _FICSMAIN_H +#define _FICSMAIN_H + +/* Heartbead functions occur approx in this time, including checking for + * new connections and decrementing timeleft counters. */ +#define HEARTBEATTIME 2 + +/* Number of seconds that an idle connection can stand at login or password + * prompt. */ +#define MAX_LOGIN_IDLE 120 + +/* Players who have been idle for more than 1 hour is logged out */ +#define MAX_IDLE_TIME 3600 + +/* This is the socket that the current command came in on */ +extern int current_socket; + +#define DEFAULT_PROMPT "fics% " + +#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" + +/* Arguments */ +extern int port; +extern int withConsole; +extern time_t time(); + +#endif /* _FICSMAIN_H */ diff --git a/FICS/formula.c b/FICS/formula.c new file mode 100644 index 0000000..dbdd798 --- /dev/null +++ b/FICS/formula.c @@ -0,0 +1,593 @@ +/* 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 +#include "config.h" +#include "formula.h" +#include "playerdb.h" +#include "gamedb.h" +#include "command.h" +#include "common.h" +#include "stdinclude.h" +#include "utils.h" +#include "rmalloc.h" +#include "lists.h" +#include "network.h" +#include "ratings.h" + +extern player parray[]; + +PRIVATE char *GetPlayersFormula (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. +*/ +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. */ + +/* GetRating simply chooses between blitz, standard and ratings. */ +int GetRating(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. */ + +int GetNumberInsideParens (game *g, int clause, int *i, int *token, + int eval) +{ + char *string = GetPlayersFormula(&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); +} + +int Maxtime (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. +*/ +int VarToToken (game *g, int clause, char *string, int *i, int *tok, int eval) +{ + player *me = &parray[g->black]; + player *you = &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=you->registered; + 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); + } +#ifdef TIMESEAL + else if (MoveIndexPastString(string, i, "timeseal")) + *tok = con[you->socket].timeseal; +#endif + 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 = you->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, "blitz")) *tok = (g->type == TYPE_BLITZ); + else if (MoveIndexPastString(string, i, "wild")) *tok = (g->type == TYPE_WILD); + else if (MoveIndexPastString(string, i, "lightning")) *tok = (g->type == TYPE_LIGHT); + else if (MoveIndexPastString(string, i, "nonstandard")) *tok = (g->type == TYPE_NONSTANDARD); + else if (MoveIndexPastString(string, i, "untimed")) *tok = (g->type == TYPE_UNTIMED); + 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[]. */ +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. */ +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 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. +*/ +int EvalBinaryOp (int *left, int op, 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 %lf 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. +*/ +int ScanForNumber (game *g, int clause, int *i, int op_type, + int *token, int eval) +{ + char *string = GetPlayersFormula (&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. +*/ +int CheckFormula (game *g, int clause, int *i, int op_type, + int *result, int eval) +{ + int token, ret, nextOp, lastPos; + char *string = GetPlayersFormula (&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. */ +PRIVATE int ChooseClauses(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. */ + +void ExplainFormula (game *g, textlist **clauses) +{ + int i, which, dummy_index, value; + char txt[20]; + player *challenged = &parray[g->black]; + 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; + } +} + +#if 0 +void ExplainFormula (game *g, textlist *eval) +{ + int i, newPos, value; + char Head[MAX_STRING_LENGTH], + Tail[MAX_STRING_LENGTH]; + + strcpy (strRet, GetPlayersFormula(&parray[g->black], clause)); + for (i=0; strRet[i] != '\0'; i++) + { + if (strRet[i] == '#') + { + strRet[i] = '\0'; + break; + } + if (!isalpha(strRet[i])) continue; + newPos = i; + if (!VarToToken(g, clause, strRet, &newPos, &value, 1)) + i = newPos; + else + { + strcpy (Head, strRet); + strcpy (Tail, strRet + newPos); + Head[i] = '\0'; + + sprintf(strRet, "%s%d%s", Head, value, Tail); + while (isalpha(strRet[i])) i++; + } + } +} +#endif + +/* GameMatchesFormula converts parameters to a game structure + and passes a pointer to this game to CheckFormula for + evaluation. It returns the evaluated formula. +*/ +PUBLIC int GameMatchesFormula (int w, int b, int wTime, int wInc, int bTime, + int bInc, int rated, int gametype, textlist **clauseList) +{ + 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) +{ + game g; + int index=0, ret, err=ERR_NONE; + char *Old=NULL, **Cur; + player *me = &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) rfree(Old); + return 1; + } + + g.white = g.black = p; + g.wInitTime = g.bInitTime = me->d_time; + g.wIncrement = g.bIncrement = me->d_inc; + g.rated = me->rated; + g.type = TYPE_BLITZ; + err = CheckFormula (&g, clause, &index, OPTYPE_NONE, &ret, 0); + + if (err != ERR_NONE) { + /* Bad formula; reset it. */ + rfree(*Cur); + *Cur = Old; + } else { + if (Old != NULL) rfree(Old); + } + return (err == ERR_NONE); +} + +PUBLIC void ShowClauses (int p, int p1, textlist *clauses) +{ + textlist *Cur; + + if (clauses != NULL) + pprintf(p, "\n"); + for (Cur = clauses; Cur != NULL; Cur = Cur->next) { + pprintf(p, "f%d=%s: %s\n", Cur->index + 1, Cur->text, + parray[p1].formulaLines[Cur->index]); + } +} diff --git a/FICS/formula.h b/FICS/formula.h new file mode 100644 index 0000000..17417c5 --- /dev/null +++ b/FICS/formula.h @@ -0,0 +1,55 @@ +#ifndef FORMULA_H +#define FORMULA_H + +#define OP_BAD -1 +#include "playerdb.h" +#include "gamedb.h" + +#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 + +extern int GetRating (player *, int); +extern int GameMatchesFormula (int, int, int, int, int, int, int, int, textlist **); +extern int CheckFormula (game *, int, int *, int, int *, int); +extern void ShowClauses (int, int, textlist *); + +#endif + diff --git a/FICS/gamedb.c b/FICS/gamedb.c new file mode 100644 index 0000000..03c677d --- /dev/null +++ b/FICS/gamedb.c @@ -0,0 +1,1795 @@ +/* gamedb.c + * + */ + +/* + 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 + (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. +*/ + +/* Revision history: + name email yy/mm/dd Change + Richard Nash 93/10/22 Created +*/ + +#include "stdinclude.h" + +#include "common.h" +#include "ficsmain.h" +#include "config.h" +#include "gamedb.h" +#include "playerdb.h" +#include "gameproc.h" +#include "command.h" +#include "utils.h" +#include "rmalloc.h" +#include "eco.h" +#include "network.h" + +PUBLIC game *garray = NULL; +PUBLIC int g_num = 0; + +PRIVATE int get_empty_slot() +/* this method is awful! how about allocation as we need it and freeing + afterwards! */ +{ + int i; + + for (i = 0; i < g_num; i++) { + if (garray[i].status == GAME_EMPTY) + return i; + } + g_num++; + if (!garray) { + garray = (game *) rmalloc(sizeof(game) * g_num); + } else { + garray = (game *) rrealloc(garray, sizeof(game) * g_num); + } /* yeah great, bet this causes lag! - DAV*/ + garray[g_num - 1].status = GAME_EMPTY; + return g_num - 1; +} + +PUBLIC int game_new() +{ + int new = get_empty_slot(); + game_zero(new); + return new; +} + +PUBLIC int game_zero(int g) +{ + garray[g].white = -1; + garray[g].black = -1; +/* garray[g].old_white = -1; + garray[g].old_black = -1; +*/ + garray[g].status = GAME_NEW; + garray[g].link = -1; + garray[g].rated = 0; + garray[g].private = 0; + garray[g].result = END_NOTENDED; + garray[g].type = TYPE_UNTIMED; + garray[g].passes = 0; + board_init(&garray[g].game_state, NULL, NULL); + garray[g].game_state.gameNum = g; + garray[g].numHalfMoves = 0; + garray[g].moveListSize = 0; + garray[g].moveList = NULL; + garray[g].examMoveListSize = 0; + garray[g].examMoveList = NULL; + garray[g].wInitTime = 300; /* 5 minutes */ + garray[g].wIncrement = 0; + garray[g].bInitTime = 300; /* 5 minutes */ + garray[g].bIncrement = 0; +#ifdef TIMESEAL + garray[g].flag_pending = FLAG_NONE; + garray[g].flag_check_time = 0L; +#endif + garray[g].white_name[0] = '\0'; + garray[g].black_name[0] = '\0'; + garray[g].white_rating = 0; + garray[g].black_rating = 0; + garray[g].revertHalfMove = 0; + return 0; +} + +PUBLIC int game_free(int g) +{ + if (garray[g].moveListSize) + rfree(garray[g].moveList); + if (garray[g].examMoveListSize) + rfree(garray[g].examMoveList); + garray[g].moveListSize = 0; + garray[g].examMoveListSize = 0; + return 0; +} + +PUBLIC int game_clear(int g) +{ + game_free(g); + game_zero(g); + return 0; +} + +PUBLIC int game_remove(int g) +{ + /* Should remove game from players observation list */ + game_clear(g); + garray[g].status = GAME_EMPTY; + return 0; +} + +/* old moves not stored now - uses smoves */ +PUBLIC int game_finish(int g) +{ + player_game_ended(g); /* Alert playerdb that game ended */ +/* NewOldGame(g); */ +/* game_free(g) */ + game_remove(g); + return 0; +} + +#if 0 +PUBLIC void PosToBoardList (int g) +{ + if (garray[g].numHalfMoves >= garray[g].boardListSize) { + garray[g].boardListSize += 50; + if (garray[g].boardListSize <= 50) + garray[g].boardList = + (boardList_t *) rmalloc(garray[g].boardListSize * sizeof(boardList_t)); + else + garray[g].boardList = (boardList_t *) rrealloc (garray[g].boardList, + garray[g].boardListSize * sizeof(boardList_t)); + } + if (garray[g].boardList != NULL) + strcpy(garray[g].boardList[garray[g].numHalfMoves], boardToFEN(g)); + else + fprintf(stderr, "Board List could not be allocated for game %d.\n", g+1); +} +#endif + +PUBLIC void MakeFENpos (int g, char *FEN) +{ + strcpy(FEN, boardToFEN(g)); +} + +PUBLIC 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; +} + +PUBLIC char *bstr[] = {"untimed", "blitz", "standard", "non-standard", "wild", "lightning", "bughouse"}; +PUBLIC char *rstr[] = {"unrated", "rated"}; + +PUBLIC 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; +} + +PUBLIC int game_isblitz(int wt, int winc, int bt, int binc, + char *cat, char *board) +{ + int total; + + if (cat && cat[0] && board && board[0] && (!strcmp(cat, "wild"))) + return TYPE_WILD; + if (cat && cat[0] && board && board[0] && + (strcmp(cat, "standard") || strcmp(board, "standard"))) + return TYPE_NONSTANDARD; + if (((wt == 0) && (winc == 0)) || ((bt == 0) && (binc == 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; +} + +PUBLIC void send_board_to(int g, int p) +{ + char *b; + int side; + int relation; + +/* since we know g and p, figure out our relationship to this game */ + + side = WHITE; + if (garray[g].status == GAME_EXAMINE) { + if (parray[p].game == g) { + relation = 2; + } else { + relation = -2; + } + } else { + if (parray[p].game == g) { + side = parray[p].side; + relation = ((side == garray[g].game_state.onMove) ? 1 : -1); + } else { + relation = 0; + } + } + + if (parray[p].flip) { /* flip board? */ + if (side == WHITE) + side = BLACK; + else + side = WHITE; + } + game_update_time(g); + b = board_to_string(garray[g].white_name, + garray[g].black_name, + garray[g].wTime, + garray[g].bTime, + &garray[g].game_state, + (garray[g].status == GAME_EXAMINE) ? + garray[g].examMoveList : garray[g].moveList, + parray[p].style, + side, relation, p); + +#ifdef TIMESEAL + + if (con[parray[p].socket].timeseal) { + if (parray[p].bell) { + pprintf_noformat(p, "\007\n[G]\n%s", b); + } else { + pprintf_noformat(p, "\n[G]\n%s", b); + } + } else { + if (parray[p].bell) { + pprintf_noformat(p, "\007\n%s", b); + } else { + pprintf_noformat(p, "\n%s", b); + } + } + +#else + + if (parray[p].bell) { + pprintf_noformat(p, "\007\n%s", b); + } else { + pprintf_noformat(p, "\n%s", b); + } + +#endif + + if (p != commanding_player) { + pprintf(p, "%s", parray[p].prompt); + } +} + +PUBLIC void send_boards(int g) +{ + int p; + simul_info_t *simInfo = &parray[garray[g].white].simul_info; + + if (simInfo->numBoards == 0 || simInfo->boards[simInfo->onBoard] == g) + for (p = 0; p < p_num; p++) { + if (parray[p].status == PLAYER_EMPTY) + continue; + if (player_is_observe(p, g) || (parray[p].game == g)) + send_board_to(g, p); + } +} + +PUBLIC void game_update_time(int g) +{ + unsigned now, timesince; + + if (garray[g].clockStopped) + return; + if (garray[g].type == TYPE_UNTIMED) + return; + now = tenth_secs(); + timesince = now - garray[g].lastDecTime; + if (garray[g].game_state.onMove == WHITE) { + garray[g].wTime -= timesince; + } else { + garray[g].bTime -= timesince; + } + garray[g].lastDecTime = now; +} + +PUBLIC void game_update_times() +{ + int g; + + for (g = 0; g < g_num; g++) { + if (garray[g].status != GAME_ACTIVE) + continue; + if (garray[g].clockStopped) + continue; + game_update_time(g); + } +} + +#if 0 /* oldgame is obsolete - games are stored in history */ +PRIVATE int oldGameArray[MAXOLDGAMES]; +PRIVATE int numOldGames = 0; + +PRIVATE int RemoveOldGame(int g) +{ + int i; + + for (i = 0; i < numOldGames; i++) { + if (oldGameArray[i] == g) + break; + } + if (i == numOldGames) + return -1; /* Not found! */ + for (; i < numOldGames - 1; i++) + oldGameArray[i] = oldGameArray[i + 1]; + numOldGames--; + game_remove(g); + return 0; +} + +PRIVATE int AddOldGame(int g) +{ + if (numOldGames == MAXOLDGAMES) /* Remove the oldest */ + RemoveOldGame(oldGameArray[0]); + oldGameArray[numOldGames] = g; + numOldGames++; + return 0; +} + +PUBLIC int FindOldGameFor(int p) +{ + int i; + + if (p == -1) + return numOldGames - 1; + for (i = numOldGames - 1; i >= 0; i--) { + if (garray[oldGameArray[i]].old_white == p) + return oldGameArray[i]; + if (garray[oldGameArray[i]].old_black == p) + return oldGameArray[i]; + } + return -1; +} + +/* This just removes the game if both players have new-old games */ +PUBLIC int RemoveOldGamesForPlayer(int p) +{ + int g; + + g = FindOldGameFor(p); + if (g < 0) + return 0; + if (garray[g].old_white == p) + garray[g].old_white = -1; + if (garray[g].old_black == p) + garray[g].old_black = -1; + if ((garray[g].old_white == -1) && (garray[g].old_black == -1)) { + RemoveOldGame(g); + } + return 0; +} + +/* This recycles any old games for players who disconnect */ +PUBLIC int ReallyRemoveOldGamesForPlayer(int p) +{ + int g; + + g = FindOldGameFor(p); + if (g < 0) + return 0; + RemoveOldGame(g); + return 0; +} + +PUBLIC int NewOldGame(int g) +{ + RemoveOldGamesForPlayer(garray[g].white); + RemoveOldGamesForPlayer(garray[g].black); + garray[g].old_white = garray[g].white; + garray[g].old_black = garray[g].black; + garray[g].status = GAME_STORED; + AddOldGame(g); + return 0; +} +#endif + +PUBLIC char *EndString(int g, int personal) +{ +/* personal 0 == White checkmated; personal 1 == loon checkmated */ + + static char endstr[200]; + char *blackguy, *whiteguy; + static char blackstr[] = "Black"; + static char whitestr[] = "White"; + + blackguy = (personal ? garray[g].black_name : blackstr); + whiteguy = (personal ? garray[g].white_name : whitestr); + + switch (garray[g].result) { + case END_CHECKMATE: + sprintf(endstr, "%s checkmated", + garray[g].winner == WHITE ? blackguy : whiteguy); + break; + case END_RESIGN: + sprintf(endstr, "%s resigned", + garray[g].winner == WHITE ? blackguy : whiteguy); + break; + case END_FLAG: + sprintf(endstr, "%s ran out of time", + 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", + 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", + garray[g].winner == WHITE ? whiteguy : blackguy); + break; + case END_COURTESYADJOURN: + sprintf(endstr, "Game courtesyadjourned by %s", + 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", + garray[g].winner == WHITE ? blackguy : whiteguy, + 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", + garray[g].winner == WHITE ? whiteguy : blackguy); + break; + case END_ADJABORT: + sprintf(endstr, "Game aborted by adjudication"); + break; + default: + sprintf(endstr, "???????"); + break; + } + + return (endstr); +} + +PUBLIC char *EndSym(int g) +{ + static char *symbols[] = {"1-0", "0-1", "1/2-1/2", "*"}; + + switch (garray[g].result) { + case END_CHECKMATE: + case END_RESIGN: + case END_FLAG: + case END_ADJWIN: + return ((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; + } + + return (symbols[3]); +} + +/* This should be enough to hold any game up to at least 250 moves + * If we overwrite this, the server will crash. + */ +#define GAME_STRING_LEN 16000 +PRIVATE char gameString[GAME_STRING_LEN]; +PUBLIC char *movesToString(int g, int pgn) +{ + char tmp[160]; + int wr, br; + int i, col; + unsigned curTime; + char *serv_loc = SERVER_LOCATION; + char *serv_name = SERVER_NAME; + + wr = garray[g].white_rating; + br = garray[g].black_rating; + + + curTime = untenths(garray[g].timeOfStart); + + if (pgn) { + sprintf(gameString, + "\n[Event \"%s %s %s game\"]\n" + "[Site \"%s, %s\"]\n", + serv_name,rstr[garray[g].rated], bstr[garray[g].type],serv_name,serv_loc); + 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", + garray[g].white_name, garray[g].black_name, wr, br); + strcat(gameString, tmp); + sprintf(tmp, + "[TimeControl \"%d+%d\"]\n" + "[Mode \"ICS\"]\n" + "[Result \"%s\"]\n\n", + garray[g].wInitTime / 10, garray[g].wIncrement / 10, EndSym(g)); + strcat(gameString, tmp); + + col = 0; + for (i = 0; i < garray[g].numHalfMoves; i++) { + if (!(i % 2)) { + if ((col += sprintf(tmp, "%d. ", i / 2 + 1)) > 70) { + strcat(gameString, "\n"); + col = 0; + } + strcat(gameString, tmp); + } + if ((col += sprintf(tmp, "%s ", (garray[g].status == GAME_EXAMINE) ? garray[g].examMoveList[i].algString : garray[g].moveList[i].algString)) > 70) { + strcat(gameString, "\n"); + col = 0; + } + strcat(gameString, tmp); + } + strcat(gameString, "\n"); + + } else { + + sprintf(gameString, "\n%s ", garray[g].white_name); + if (wr > 0) { + sprintf(tmp, "(%d) ", wr); + } else { + sprintf(tmp, "(UNR) "); + } + strcat(gameString, tmp); + sprintf(tmp, "vs. %s ", 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, (char*) (localtime((time_t *) &curTime))); + if (garray[g].rated) { + strcat(gameString, "\nRated "); + } else { + strcat(gameString, "\nUnrated "); + } + if (garray[g].type == TYPE_BLITZ) { + strcat(gameString, "Blitz "); + } else if (garray[g].type == TYPE_LIGHT) { + strcat(gameString, "Lighting "); + } else if (garray[g].type == TYPE_BUGHOUSE) { + strcat(gameString, "Bughouse "); + } else if (garray[g].type == TYPE_STAND) { + strcat(gameString, "Standard "); + } else if (garray[g].type == TYPE_WILD) { + strcat(gameString, "Wild "); + } else if (garray[g].type == TYPE_NONSTANDARD) { + strcat(gameString, "Non-standard "); + } else { + strcat(gameString, "Untimed "); + } + strcat(gameString, "match, initial time: "); + if ((garray[g].bInitTime != garray[g].wInitTime) || (garray[g].wIncrement != garray[g].bIncrement)) { /* different starting times */ + sprintf(tmp, "%d minutes, increment: %d seconds AND %d minutes, increment: %d seconds.\n\n", garray[g].wInitTime / 600, garray[g].wIncrement / 10, garray[g].bInitTime / 600, garray[g].bIncrement / 10); + } else { + sprintf(tmp, "%d minutes, increment: %d seconds.\n\n", garray[g].wInitTime / 600, garray[g].wIncrement / 10); + } + strcat(gameString, tmp); + sprintf(tmp, "Move %-19s%-19s\n", garray[g].white_name, garray[g].black_name); + strcat(gameString, tmp); + strcat(gameString, "---- ---------------- ----------------\n"); + + for (i = 0; i < garray[g].numHalfMoves; i += 2) { + if (i + 1 < garray[g].numHalfMoves) { + sprintf(tmp, "%3d. %-16s ", i / 2 + 1, + (garray[g].status == GAME_EXAMINE) ? + move_and_time(&garray[g].examMoveList[i]) : + move_and_time(&garray[g].moveList[i])); + strcat(gameString, tmp); + sprintf(tmp, "%-16s\n", + (garray[g].status == GAME_EXAMINE) ? + move_and_time(&garray[g].examMoveList[i + 1]) : + move_and_time(&garray[g].moveList[i + 1])); + } else { + sprintf(tmp, "%3d. %-16s\n", i / 2 + 1, + (garray[g].status == GAME_EXAMINE) ? + move_and_time(&garray[g].examMoveList[i]) : + move_and_time(&garray[g].moveList[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; +} + +PUBLIC void game_disconnect(int g, int p) +{ + game_ended(g, (garray[g].white == p) ? WHITE : BLACK, END_LOSTCONNECTION); +} + +PUBLIC 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; + } +} + +PUBLIC int 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 ' '; + } +} + +/* One line has everything on it */ +PRIVATE int WriteMoves(FILE * fp, 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); + +#if 0 + fprintf(fp, "%d %d %d %d %d %d %d %d %d \"%s\" \"%s\" %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); +#endif + return 0; +} + +PRIVATE int ReadMove(FILE * fp, 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; +} + +PRIVATE void WriteGameState(FILE * fp, 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); +} + +PRIVATE int ReadGameState(FILE * fp, 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 { + getc(fp); /* Skip past a newline. */ + 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; +} + +PUBLIC int got_attr_value(int g, char *attr, char *value, FILE * fp, char *file) +{ + int i; + + if (!strcmp(attr, "w_init:")) { + garray[g].wInitTime = atoi(value); + } else if (!strcmp(attr, "w_inc:")) { + garray[g].wIncrement = atoi(value); + } else if (!strcmp(attr, "b_init:")) { + garray[g].bInitTime = atoi(value); + } else if (!strcmp(attr, "b_inc:")) { + garray[g].bIncrement = atoi(value); + } else if (!strcmp(attr, "white_name:")) { + strcpy(garray[g].white_name, value); + } else if (!strcmp(attr, "black_name:")) { + strcpy(garray[g].black_name, value); + } else if (!strcmp(attr, "white_rating:")) { + garray[g].white_rating = atoi(value); + } else if (!strcmp(attr, "black_rating:")) { + garray[g].black_rating = atoi(value); + } else if (!strcmp(attr, "result:")) { + garray[g].result = atoi(value); + } else if (!strcmp(attr, "timestart:")) { + garray[g].timeOfStart = atoi(value); + } else if (!strcmp(attr, "w_time:")) { + garray[g].wTime = atoi(value); + } else if (!strcmp(attr, "b_time:")) { + garray[g].bTime = atoi(value); + } else if (!strcmp(attr, "clockstopped:")) { + garray[g].clockStopped = atoi(value); + } else if (!strcmp(attr, "rated:")) { + garray[g].rated = atoi(value); + } else if (!strcmp(attr, "private:")) { + garray[g].private = atoi(value); + } else if (!strcmp(attr, "type:")) { + garray[g].type = atoi(value); + } else if (!strcmp(attr, "halfmoves:")) { + garray[g].numHalfMoves = atoi(value); + if (garray[g].numHalfMoves == 0) + return 0; + garray[g].moveListSize = garray[g].numHalfMoves; + garray[g].moveList = (move_t *) rmalloc(sizeof(move_t) * garray[g].moveListSize); + for (i = 0; i < garray[g].numHalfMoves; i++) { + if (ReadMove(fp, &garray[g].moveList[i])) { + fprintf(stderr, "FICS: Trouble reading moves from %s.\n", file); + return -1; + } + } + } else if (!strcmp(attr, "gamestate:")) { /* Value meaningless */ + if (garray[g].status != GAME_EXAMINE && + ReadGameState(fp, &garray[g].game_state, 0)) { + fprintf(stderr, "FICS: Trouble reading game state from %s.\n", file); + return -1; + } + } else { + fprintf(stderr, "FICS: Error bad attribute >%s< from file %s\n", attr, file); + } + return 0; +} + +void ReadOneV1Move(FILE * fp, 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, "+"); +} + +int ReadV1Moves(game *g, FILE * fp) +{ + int i; + + g->moveListSize = g->numHalfMoves; + g->moveList = (move_t *) rmalloc(sizeof(move_t) * g->moveListSize); + for (i = 0; i < g->numHalfMoves; i++) { + ReadOneV1Move(fp, &g->moveList[i]); + } + return 0; +} + +int ReadV1GameFmt(game *g, FILE * fp, char *file, int version) +{ + 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", &g->result, &g->winner); + else + fscanf(fp, "%d", &g->result); + + fscanf(fp, "%d %d %d %d", &g->private, &g->type, + &g->rated, &g->clockStopped); + fscanf(fp, "%d", &g->numHalfMoves); + ReadV1Moves(g, fp); + if (g->status != GAME_EXAMINE + && ReadGameState(fp, &g->game_state, version)) { + fprintf(stderr, "FICS: Trouble reading game state from %s.\n", file); + return -1; + } + return 0; +} + +PUBLIC int ReadGameAttrs(FILE * fp, char *fname, int g) +{ + int len; + int version = 0; + char *attr, *value; + char line[MAX_GLINE_SIZE]; + + fgets(line, MAX_GLINE_SIZE - 1, fp); + + if (line[0] == 'v') { + sscanf(line, "%*c %d", &version); + } + if (version > 0) { + ReadV1GameFmt(&garray[g], fp, fname, version); + } + /* 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) { + fprintf(stderr, "FICS: Error reading file %s\n", fname); + fgets(line, MAX_GLINE_SIZE - 1, fp); + continue; + } + *value = '\0'; + value++; + value = eatwhite(value); + if (!*value) { + fprintf(stderr, "FICS: Error reading file %s\n", fname); + fgets(line, MAX_GLINE_SIZE - 1, fp); + continue; + } + stolower(attr); + if (got_attr_value(g, attr, value, fp, fname)) { + return -1; + } + fgets(line, MAX_GLINE_SIZE - 1, fp); + } while (!feof(fp)); + if (!(garray[g].bInitTime)) + garray[g].bInitTime = garray[g].wInitTime; + return 0; +} + +PUBLIC int game_read(int g, int wp, int bp) +{ + FILE *fp; + char fname[MAX_FILENAME_SIZE]; + + garray[g].white = wp; + garray[g].black = bp; +/* garray[g].old_white = -1; + garray[g].old_black = -1; +*/ + garray[g].moveListSize = 0; + garray[g].game_state.gameNum = g; + strcpy(garray[g].white_name, parray[wp].name); + strcpy(garray[g].black_name, parray[bp].name); + if (garray[g].type == TYPE_BLITZ) { + garray[g].white_rating = parray[wp].b_stats.rating; + garray[g].black_rating = parray[bp].b_stats.rating; + } else if (garray[g].type == TYPE_WILD) { + garray[g].white_rating = parray[wp].w_stats.rating; + garray[g].black_rating = parray[bp].w_stats.rating; + } else if (garray[g].type == TYPE_LIGHT) { + garray[g].white_rating = parray[wp].l_stats.rating; + garray[g].black_rating = parray[bp].l_stats.rating; + } else if (garray[g].type == TYPE_BUGHOUSE) { + garray[g].white_rating = parray[wp].bug_stats.rating; + garray[g].black_rating = parray[bp].bug_stats.rating; + } else { + garray[g].white_rating = parray[wp].s_stats.rating; + garray[g].black_rating = parray[bp].s_stats.rating; + } + sprintf(fname, "%s/%c/%s-%s", adj_dir, parray[wp].login[0], + parray[wp].login, parray[bp].login); + fp = fopen(fname, "r"); + if (!fp) { + return -1; + } + if (ReadGameAttrs(fp, fname, g) < 0) { + fclose(fp); + return -1; + } + fclose(fp); + + if (garray[g].result == END_ADJOURN + || garray[g].result == END_COURTESYADJOURN) + garray[g].result = END_NOTENDED; + garray[g].status = GAME_ACTIVE; + garray[g].startTime = tenth_secs(); + garray[g].lastMoveTime = garray[g].startTime; + garray[g].lastDecTime = garray[g].startTime; + /* Need to do notification and pending cleanup */ + return 0; +} + +PUBLIC int game_delete(int wp, int bp) +{ + char fname[MAX_FILENAME_SIZE]; + char lname[MAX_FILENAME_SIZE]; + + sprintf(fname, "%s/%c/%s-%s", adj_dir, parray[wp].login[0], + parray[wp].login, parray[bp].login); + sprintf(lname, "%s/%c/%s-%s", adj_dir, parray[bp].login[0], + parray[wp].login, parray[bp].login); + unlink(fname); + unlink(lname); + return 0; +} + +void WriteGameFile(FILE * fp, int g) +{ + int i; + game *gg = &garray[g]; + player *wp = &parray[gg->white], *bp = &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", gg->wTime, gg->bTime); */ +#ifdef TIMESEAL + fprintf(fp, "%d %d\n", + (con[wp->socket].timeseal ? gg->wRealTime/100 : gg->wTime), + (con[bp->socket].timeseal ? gg->bRealTime/100 : gg->bTime)); +#endif + 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 < garray[g].numHalfMoves; i++) { + WriteMoves(fp, &garray[g].moveList[i]); + } + WriteGameState(fp, &garray[g].game_state); +} + +PUBLIC int game_save(int g) +{ + FILE *fp; + player *wp, *bp; + game *gg = &garray[g]; + char fname[MAX_FILENAME_SIZE]; + char lname[MAX_FILENAME_SIZE]; + + wp = &parray[gg->white]; + bp = &parray[gg->black]; + sprintf(fname, "%s/%c/%s-%s", adj_dir, wp->login[0], + wp->login, bp->login); + sprintf(lname, "%s/%c/%s-%s", adj_dir, bp->login[0], + wp->login, bp->login); + fp = fopen(fname, "w"); + if (!fp) { + fprintf(stderr, "FICS: Problem opening file %s for write\n", fname); + return -1; + } + WriteGameFile(fp, g); +#if 0 + fprintf(fp, "W_Init: %d\n", garray[g].wInitTime); + fprintf(fp, "W_Inc: %d\n", garray[g].wIncrement); + fprintf(fp, "B_Init: %d\n", garray[g].bInitTime); + fprintf(fp, "B_Inc: %d\n", garray[g].bIncrement); + fprintf(fp, "white_name: %s\n", wp->name); + fprintf(fp, "black_name: %s\n", bp->name); + fprintf(fp, "white_rating: %d\n", garray[g].white_rating); + fprintf(fp, "black_rating: %d\n", garray[g].black_rating); + fprintf(fp, "result: %d\n", garray[g].result); + fprintf(fp, "TimeStart: %d\n", (int) garray[g].timeOfStart); + fprintf(fp, "W_Time: %d\n", garray[g].wTime); + fprintf(fp, "B_Time: %d\n", garray[g].bTime); + fprintf(fp, "ClockStopped: %d\n", garray[g].clockStopped); + fprintf(fp, "Rated: %d\n", garray[g].rated); + fprintf(fp, "Private: %d\n", garray[g].private); + fprintf(fp, "Type: %d\n", garray[g].type); + fprintf(fp, "HalfMoves: %d\n", garray[g].numHalfMoves); + for (i = 0; i < garray[g].numHalfMoves; i++) { + WriteMoves(fp, &garray[g].moveList[i]); + } + fprintf(fp, "GameState: IsNext\n"); + WriteGameState(fp, &garray[g].game_state); +#endif + fclose(fp); + /* Create link for easier stored game finding */ + if (bp->login[0] != wp->login[0]) + link(fname, lname); + return 0; +} + +#if 0 +PRIVATE int history_game_save(int g, char *fname) +{ + FILE *fp; + int wp, bp; + int i; + + wp = garray[g].white; + bp = garray[g].black; + fp = fopen(fname, "w"); + if (!fp) { + fprintf(stderr, "FICS: Problem openning file %s for write\n", fname); + return -1; + } + fprintf(fp, "W_Init: %d\n", garray[g].wInitTime); + fprintf(fp, "W_Inc: %d\n", garray[g].wIncrement); + fprintf(fp, "B_Init: %d\n", garray[g].bInitTime); + fprintf(fp, "B_Inc: %d\n", garray[g].bIncrement); + fprintf(fp, "TimeStart: %d\n", (int) garray[g].timeOfStart); + fprintf(fp, "W_Time: %d\n", garray[g].wTime); + fprintf(fp, "B_Time: %d\n", garray[g].bTime); + fprintf(fp, "ClockStopped: %d\n", garray[g].clockStopped); + fprintf(fp, "Rated: %d\n", garray[g].rated); + fprintf(fp, "Private: %d\n", garray[g].private); + fprintf(fp, "Type: %d\n", garray[g].type); + fprintf(fp, "HalfMoves: %d\n", garray[g].numHalfMoves); + for (i = 0; i < garray[g].numHalfMoves; i++) { + WriteMoves(fp, &garray[g].moveList[i]); + } + fprintf(fp, "GameState: IsNext\n"); + WriteGameState(fp, &garray[g].game_state); + fclose(fp); + return 0; +} +#endif + +PRIVATE long OldestHistGame(char *login) +{ + FILE *fp; + char pFile[MAX_FILENAME_SIZE]; + long when; + + sprintf(pFile, "%s/player_data/%c/%s.%s", stats_dir, + login[0], login, STATS_GAMES); + fp = fopen(pFile, "r"); + + if (fp == NULL) { + sprintf(pFile, "%s/player_data/%c/.rem.%s.%s", stats_dir, + login[0], login, STATS_GAMES); + fp = fopen(pFile, "r"); + } + if (fp != NULL) { + fscanf(fp, "%*d %*c %*d %*c %*d %*s %*s %*d %*d %*d %*d %*s %*s %ld", + &when); + fclose(fp); + return when; + } else + return 0L; +} + +PRIVATE 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(file, "r"); + 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", hist_dir, When % 100, When); + unlink(GameFile); + } + } +} + +PUBLIC void RemHist(char *who) +{ + FILE *fp; + char fName[MAX_FILENAME_SIZE]; + char Opp[MAX_LOGIN_NAME]; + long When, oppWhen; + + sprintf(fName, "%s/player_data/%c/%s.%s", stats_dir, + who[0], who, STATS_GAMES); + fp = fopen(fName, "r"); + if (fp != NULL) { + 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) { + sprintf(fName, "%s/%ld/%ld", hist_dir, When % 100, When); + unlink(fName); + } + } + } +} + +PRIVATE 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 = garray[g].white; + bp = garray[g].black; + + if (garray[g].private) { + type[0] = 'p'; + } else { + type[0] = ' '; + } + if (garray[g].type == TYPE_BLITZ) { + wr = parray[wp].b_stats.rating; + br = parray[bp].b_stats.rating; + type[1] = 'b'; + } else if (garray[g].type == TYPE_WILD) { + wr = parray[wp].w_stats.rating; + br = parray[bp].w_stats.rating; + type[1] = 'w'; + } else if (garray[g].type == TYPE_STAND) { + wr = parray[wp].s_stats.rating; + br = parray[bp].s_stats.rating; + type[1] = 's'; + } else if (garray[g].type == TYPE_LIGHT) { + wr = parray[wp].l_stats.rating; + br = parray[bp].l_stats.rating; + type[1] = 'l'; + } else if (garray[g].type == TYPE_BUGHOUSE) { + wr = parray[wp].bug_stats.rating; + br = parray[bp].bug_stats.rating; + type[1] = 'd'; + } else { + wr = 0; + br = 0; + if (garray[g].type == TYPE_NONSTANDARD) + type[1] = 'n'; + else + type[1] = 'u'; + } + if (garray[g].rated) { + type[2] = 'r'; + } else { + type[2] = 'u'; + } + type[3] = '\0'; + + fp = fopen(file, "r"); + if (fp) { + while (!feof(fp)) + fgets(tmp, 1024, fp); + sscanf(ptmp, "%d", &count); + fclose(fp); + } + count = (count + 1) % 100; + + fp = fopen(file, "a"); + if (!fp) + return; + + goteco = getECO(g); + +/* Counter Result MyRating MyColor OppRating OppName [pbr 2 12 2 12] ECO End Date */ + if (name == parray[wp].name) { + if (isDraw) + cResult = '='; + else if (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, parray[bp].name, type, + garray[g].wInitTime, garray[g].wIncrement, + garray[g].bInitTime, garray[g].bIncrement, + goteco, + EndSymbol, + (long) *now); + } else { + if (isDraw) + cResult = '='; + else if (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, parray[wp].name, type, + garray[g].wInitTime, garray[g].wIncrement, + garray[g].bInitTime, garray[g].bIncrement, + goteco, + EndSymbol, + (long) *now); + } + fclose(fp); + + RemoveHistGame(file, maxlines); +/* + if ((name == parray[wp].name) && (parray[wp].registered)) { + sprintf(tmp, "%s/%c/%s.%d", adj_dir, parray[wp].login[0], parray[wp].login, count); + history_game_save(g, tmp); + } + if ((name == parray[bp].name) && (parray[bp].registered)) { + sprintf(tmp, "%s/%c/%s.%d", adj_dir, parray[bp].login[0], parray[bp].login, count); + history_game_save(g, tmp); + } +*/ +} + +/* Find from_spot in journal list - return 0 if corrupted */ + +PUBLIC int journal_get_info(int p,char from_spot,char* WhiteName, int* WhiteRating, + char* BlackName, int* BlackRating, char* type,int* t,int* i,char* eco, + char* ending,char* result, char *fname) +{ + char count; + FILE *fp; + + fp = fopen(fname, "r"); + if (!fp) { + fprintf (stderr, "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", + &count, + WhiteName, + &(*WhiteRating), + BlackName, + &(*BlackRating), + type, + &(*t), &(*i), + eco, + ending, + result) != 11) { + fprintf(stderr, "FICS: 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(count) == from_spot) { + fclose(fp); + return 1; + } + } + fclose(fp); + return 0; +} + +PUBLIC void addjournalitem(int p,char count2,char* WhiteName2, int WhiteRating2, + char* BlackName2, int BlackRating2, char* type2,int t2,int i2,char* eco2, + char* ending2,char* result2, char* fname) + +{ + int WhiteRating, BlackRating; + int t, i; + char WhiteName[MAX_LOGIN_NAME + 1]; + char BlackName[MAX_LOGIN_NAME + 1]; + char type[100]; + char eco[100]; + char ending[100]; + char count; + char result[100]; + int have_output=0; + char fname2[MAX_FILENAME_SIZE]; + + FILE *fp; + FILE *fp2; + + strcpy (fname2,fname); + strcat (fname2,".w"); + fp2 = fopen(fname2, "w"); + if (!fp2) { + fprintf(stderr, "FICS: Problem opening file %s for write\n", fname); + pprintf (p, "Couldn't update journal! Report this to an admin.\n"); + return; + } + fp = fopen(fname, "r"); + if (!fp) { /* Empty? */ + fprintf(fp2, "%c %s %d %s %d %s %d %d %s %s %s\n", + count2, WhiteName2, WhiteRating2, BlackName2, BlackRating2, + type2, t2, i2, eco2, ending2, + result2); + fclose (fp2); + rename (fname2, fname); + return; + } else { + while (!feof(fp)) { + if (fscanf(fp, "%c %s %d %s %d %s %d %d %s %s %s\n", + &count, + WhiteName, + &WhiteRating, + BlackName, + &BlackRating, + type, + &t, &i, + eco, + ending, + result) != 11) { + fprintf(stderr, "FICS: Error in journal info format - aborting. %s\n", fname); + fclose(fp); + fclose(fp2); + return; + } + if ((count >= count2) && (!have_output)) { + fprintf(fp2, "%c %s %d %s %d %s %d %d %s %s %s\n", + count2, + WhiteName2, + WhiteRating2, + BlackName2, + BlackRating2, + type2, + t2, i2, + eco2, + ending2, + result2); + have_output = 1; + } + if (count != count2) { + fprintf(fp2, "%c %s %d %s %d %s %d %d %s %s %s\n", + count, + WhiteName, + WhiteRating, + BlackName, + BlackRating, + type, + t, i, + eco, + ending, + result); + } + } + if (!have_output) { /* Haven't written yet */ + fprintf(fp2, "%c %s %d %s %d %s %d %d %s %s %s\n", + count2, + WhiteName2, + WhiteRating2, + BlackName2, + BlackRating2, + type2, + t2, i2, + eco2, + ending2, + result2); + } + } + fclose(fp); + fclose(fp2); + rename(fname2, fname); + return; +} + +PUBLIC int pjournal(int p, int p1, char *fname) +{ + FILE *fp; + int WhiteRating, BlackRating; + int t, i; + char WhiteName[MAX_LOGIN_NAME + 1]; + char BlackName[MAX_LOGIN_NAME + 1]; + char type[100]; + char eco[100]; + char ending[100]; + char count; + char result[100]; + + fp = fopen(fname, "r"); + if (!fp) { + pprintf(p, "Sorry, no journal information available.\n"); + return COM_OK; + } + pprintf(p, "Journal for %s:\n", 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", + &count, + WhiteName, + &WhiteRating, + BlackName, + &BlackRating, + type, + &t, &i, + eco, + ending, + result) != 11) { + fprintf(stderr, "FICS: Error in journal info format. %s\n", fname); + fclose(fp); + return COM_OK; + } + WhiteName[13] = '\0'; /* only first 13 chars in name */ + BlackName[13] = '\0'; + pprintf(p, "%c: %-13s %4d %-13s %4d [%3s%3d%4d] %s %3s %-7s\n", + count, WhiteName, WhiteRating, + BlackName, BlackRating, + type, t / 600, i / 10, eco, ending, + result); + } + fclose(fp); + return COM_OK; +} + +PUBLIC 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(fname, "r"); + if (!fp) { + pprintf(p, "Sorry, no game information available.\n"); + return COM_OK; + } + pprintf(p, "History for %s:\n", 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) { + fprintf(stderr, "FICS: 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; +} + +PUBLIC void game_write_complete(int g, int isDraw, char *EndSymbol) +{ + char fname[MAX_FILENAME_SIZE]; + int wp = garray[g].white, bp = garray[g].black; + time_t now = time(NULL); + int fd; + FILE *fp; + + do { + sprintf(fname, "%s/%ld/%ld", hist_dir, (long) now % 100, (long) now); + fd = open(fname, O_WRONLY | O_CREAT | O_EXCL, 0644); + if (fd == EEXIST) + now++; + } while (fd == EEXIST); + + if (fd >= 0) { + fp = fdopen(fd, "w"); + if (fp != NULL) + WriteGameFile(fp, g); + else + fprintf(stderr, "Trouble writing history file %s", fname); + fclose(fp); + close(fd); + } + sprintf(fname, "%s/player_data/%c/%s.%s", stats_dir, + parray[wp].login[0], parray[wp].login, STATS_GAMES); + write_g_out(g, fname, 10, isDraw, EndSymbol, parray[wp].name, &now); + sprintf(fname, "%s/player_data/%c/%s.%s", stats_dir, + parray[bp].login[0], parray[bp].login, STATS_GAMES); + write_g_out(g, fname, 10, isDraw, EndSymbol, parray[bp].name, &now); +} + +PUBLIC int game_count(void) +{ + int g, count = 0; + + for (g = 0; g < g_num; g++) { + if ((garray[g].status == GAME_ACTIVE) || (garray[g].status == GAME_EXAMINE)) + count++; + } + if (count > game_high) + game_high = count; + return count; +} + diff --git a/FICS/gamedb.h b/FICS/gamedb.h new file mode 100644 index 0000000..a7f027c --- /dev/null +++ b/FICS/gamedb.h @@ -0,0 +1,209 @@ +/* gamedb.h + * + */ + +/* + 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 + (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. +*/ + +/* Revision history: + name email yy/mm/dd Change + Richard Nash 93/10/22 Created +*/ + +#ifndef _GAMEDB_H +#define _GAMEDB_H + +#include +#include "board.h" + +extern char *bstr[]; +extern char *rstr[]; + +#define GAMEFILE_VERSION 3 +#define MAX_GLINE_SIZE 1024 + +#define REL_GAME 0 +#define REL_SPOS 1 +#define REL_REFRESH 2 +#define REL_EXAMINE 3 + +#define GAME_EMPTY 0 +#define GAME_NEW 1 +#define GAME_ACTIVE 2 +#define GAME_EXAMINE 3 /* examine is now 3 */ + +/* +#define GAME_STORED 3 +#define GAME_EXAMINE 4 +*/ + +#define TYPE_UNTIMED 0 +#define TYPE_BLITZ 1 +#define TYPE_STAND 2 +#define TYPE_NONSTANDARD 3 +#define TYPE_WILD 4 +#define TYPE_LIGHT 5 +#define TYPE_BUGHOUSE 6 + +#ifdef TIMESEAL +#define FLAG_CHECKING -1 +#define FLAG_NONE 0 +#define FLAG_CALLED 1 +#define FLAG_ABORT 2 +#endif + +#define END_CHECKMATE 0 +#define END_RESIGN 1 +#define END_FLAG 2 +#define END_AGREEDDRAW 3 +#define END_REPETITION 4 +#define END_50MOVERULE 5 +#define END_ADJOURN 6 +#define END_LOSTCONNECTION 7 +#define END_ABORT 8 +#define END_STALEMATE 9 +#define END_NOTENDED 10 +#define END_COURTESY 11 +#define END_BOTHFLAG 12 +#define END_NOMATERIAL 13 +#define END_FLAGNOMATERIAL 14 +#define END_ADJDRAW 15 +#define END_ADJWIN 16 +#define END_ADJABORT 17 +#define END_COURTESYADJOURN 18 + +#if 0 +typedef unsigned char boardList_t[74]; +#endif + +typedef struct _game { + /* Saved in the game file */ + int wInitTime, wIncrement; + int bInitTime, bIncrement; + time_t timeOfStart; +#ifdef TIMESEAL + int wLastRealTime; + int wRealTime; + int wTimeWhenReceivedMove; + int wTimeWhenMoved; + int bLastRealTime; + int bRealTime; + int bTimeWhenReceivedMove; + int bTimeWhenMoved; + int flag_pending; + unsigned long flag_check_time; +#endif + int wTime; + int bTime; + int clockStopped; + int rated; + int private; + int type; + int passes; /* For simul's */ + int numHalfMoves; + move_t *moveList; /* primary movelist */ + unsigned char FENstartPos[74]; /* Save the starting position. */ + game_state_t game_state; +/* This is now in moveList, and FENstartPos. -- hersco */ +/* + int boardListSize; + boardList_t *boardList; + boardList_t boardList[500]; +*/ + char white_name[18]; /* to hold the playername even after he disconnects */ + char black_name[18]; + int white_rating; + int black_rating; + + /* Not saved in game file */ + int revertHalfMove; + int totalHalfMoves; + int white; + int black; + /* int old_white; */ /* Contains the old game player number */ + /* int old_black; */ /* Contains the old game player number */ + int link; + int status; + int moveListSize; /* Total allocated in *moveList */ + int examHalfMoves; + move_t *examMoveList; /* extra movelist for examine */ + int examMoveListSize; + + 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 result; + int winner; + +} game; + +extern game *garray; +extern int g_num; + +extern int game_new(void); +extern int game_zero(int); +extern int game_free(int); +extern int game_clear(int); +extern int game_remove(int); +extern int game_finish(int); +extern void MakeFENpos (int, char *); + +extern char *game_time_str(int, int, int, int); +extern char *game_str(int, int, int, int, int, char *, char *); +extern int game_isblitz(int, int, int, int, char *, char *); + +extern void send_board_to(int, int); +extern void send_boards(int); +extern void game_update_time(int); +extern void game_update_times(void); + +/* #define MAXOLDGAMES 50 + +extern int FindOldGameFor(int); +extern int RemoveOldGamesForPlayer(int); +extern int ReallyRemoveOldGamesForPlayer(int); +extern int NewOldGame(int); +Kill this oldgame rubbish - wastes memory - DAV */ + +extern char *movesToString(int, int); +extern char *EndSym(int); +extern char *EndString(int, int); + +extern void game_disconnect(int, int); + +extern int CharToPiece(char); +extern int PieceToChar(int); +extern int got_attr_value(); +extern int ReadGameAttrs(); +extern int game_read(int, int, int); +extern int game_delete(int, int); +extern int game_save(int); +extern void RemHist (char *); + +extern int journal_get_info(int,char,char*,int*, + char*,int*,char*,int*,int*,char*, + char*,char*,char*); +extern void addjournalitem(int,char,char*,int,char*,int,char*,int,int, + char*, char*, char* ,char*); +extern int pgames(int, int, char *); +extern int pjournal(int, int, char *); +extern void game_write_complete(int, int, char *); +extern int game_count(void); + +/* extern time_t time(); */ + +#endif + diff --git a/FICS/gameproc.c b/FICS/gameproc.c new file mode 100644 index 0000000..cf07200 --- /dev/null +++ b/FICS/gameproc.c @@ -0,0 +1,1745 @@ +/* gameproc.c + * + */ + +/* + 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 + (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. +*/ + +/* Revision history: + name email yy/mm/dd Change + Richard Nash 93/10/22 Created + Dave Herscovici 95/11/26 Split into two files; + Second is obsproc.c. +*/ + +#include "stdinclude.h" + +#include "common.h" +#include "command.h" +#include "ficsmain.h" +#include "config.h" +#include "playerdb.h" +#include "gamedb.h" +#include "gameproc.h" +#include "obsproc.h" +#include "movecheck.h" +#include "utils.h" +#include "ratings.h" +#include "rmalloc.h" +#include "comproc.h" +#include "matchproc.h" +#include "eco.h" +#include "network.h" +#include "lists.h" +/* #include "hostinfo.h" */ + +PUBLIC void game_ended(int g, int winner, int why) +{ + char outstr[200]; + char tmp[200]; + int p; + int gl = garray[g].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 */ + + beingplayed = (parray[garray[g].black].game == g); + + sprintf(outstr, "\n{Game %d (%s vs. %s) ", g + 1, + parray[garray[g].white].name, + parray[garray[g].black].name); + garray[g].result = why; + garray[g].winner = winner; + if (winner == WHITE) { + whiteResult = RESULT_WIN; + strcpy(winSymbol, "1-0"); + NameOfWinner = parray[garray[g].white].name; + NameOfLoser = parray[garray[g].black].name; + } else { + whiteResult = RESULT_LOSS; + strcpy(winSymbol, "0-1"); + NameOfWinner = parray[garray[g].black].name; + NameOfLoser = parray[garray[g].white].name; + } + switch (why) { + case END_CHECKMATE: + sprintf(tmp, "%s checkmated} %s\n", NameOfLoser, winSymbol); + strcpy(EndSymbol, "Mat"); + rate_change = 1; + break; + case END_RESIGN: + sprintf(tmp, "%s resigns} %s\n", NameOfLoser, winSymbol); + strcpy(EndSymbol, "Res"); + rate_change = 1; + break; + case END_FLAG: + sprintf(tmp, "%s forfeits on time} %s\n", NameOfLoser, winSymbol); + strcpy(EndSymbol, "Fla"); + rate_change = 1; + break; + case END_STALEMATE: + sprintf(tmp, "Game drawn by stalemate} 1/2-1/2\n"); + 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\n"); + 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\n"); + 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\n"); + 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\n"); + isDraw = 1; + strcpy(EndSymbol, "50"); + rate_change = 1; + whiteResult = RESULT_DRAW; + break; + case END_ADJOURN: + if (gl >= 0) { + sprintf(tmp, "Bughouse game aborted.} *\n"); + whiteResult = RESULT_ABORT; + } else { + sprintf(tmp, "Game adjourned by mutual agreement} *\n"); + game_save(g); + } + break; + case END_LOSTCONNECTION: + sprintf(tmp, "%s lost connection; game ", NameOfWinner); + if (parray[garray[g].white].registered && parray[garray[g].black].registered + && gl < 0) { + sprintf(tmp, "adjourned} *\n"); + game_save(g); + } else + sprintf(tmp, "aborted} *\n"); + whiteResult = RESULT_ABORT; + break; + case END_ABORT: + sprintf(tmp, "Game aborted by mutual agreement} *\n"); + whiteResult = RESULT_ABORT; + break; + case END_COURTESY: + sprintf(tmp, "Game courtesyaborted by %s} *\n", NameOfWinner); + whiteResult = RESULT_ABORT; + break; + case END_COURTESYADJOURN: + if (gl >= 0) { + sprintf(tmp, "Bughouse game courtesyaborted by %s.} *\n", NameOfWinner); + whiteResult = RESULT_ABORT; + } else { + sprintf(tmp, "Game courtesyadjourned by %s} *\n", 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\n"); + 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\n", + NameOfLoser, NameOfWinner); + isDraw = 1; + strcpy(EndSymbol, "TM "); + rate_change = 1; + whiteResult = RESULT_DRAW; + break; + case END_ADJWIN: + sprintf(tmp, "%s wins by adjudication} %s\n", NameOfWinner, winSymbol); + strcpy(EndSymbol, "Adj"); + rate_change = 1; + break; + case END_ADJDRAW: + sprintf(tmp, "Game drawn by adjudication} 1/2-1/2\n"); + isDraw = 1; + strcpy(EndSymbol, "Adj"); + rate_change = 1; + whiteResult = RESULT_DRAW; + break; + case END_ADJABORT: + sprintf(tmp, "Game aborted by adjudication} *\n"); + whiteResult = RESULT_ABORT; + break; + default: + sprintf(tmp, "Hmm, the game ended and I don't know why} *\n"); + break; + } + strcat(outstr, tmp); + if (beingplayed) { + pprintf_noformat(garray[g].white, outstr); + pprintf_noformat(garray[g].black, outstr); + if (parray[garray[g].white].bell) + pprintf (garray[g].white, "\007"); + if (parray[garray[g].black].bell) + pprintf (garray[g].black, "\007"); + + garray[g].link = -1; /*IanO: avoids recursion */ + if (gl >= 0 && garray[gl].link >= 0) { + pprintf_noformat(garray[gl].white, outstr); + pprintf_noformat(garray[gl].black, outstr); + game_ended(gl, CToggle(winner), why); + } + + for (p = 0; p < p_num; p++) { + if ((p == garray[g].white) || (p == garray[g].black)) + continue; + if (parray[p].status != PLAYER_PROMPT) + continue; + if (!parray[p].i_game && !player_is_observe(p, g)) + continue; + pprintf_noformat(p, outstr); +/* if (parray[p].bell) + pprintf (p, "\007"); removed - caused annoyance */ + pprintf_prompt(p, ""); + } + } + if ((garray[g].rated) && (rate_change)) { + /* Adjust ratings */ + rating_update(g); +#if 0 + if (parray[garray[g].white].network_player && + parray[garray[g].black].network_player) { + if (MailGameResult) { /* Send to ratings server */ + if (isDraw) { + /* hostinfo_mailresults(garray[g].type == TYPE_BLITZ ? "blitz" : + garray[g].type == TYPE_WILD ? "wild " : "stand", " + parray[garray[g].white].name, parray[garray[g].black].name, + "draw"); */ + } else { +/* hostinfo_mailresults(garray[g].type == TYPE_BLITZ ? "blitz" : garray[g].type == TYPE_WILD ? "wild " : "stand", + parray[garray[g].white].name, + parray[garray[g].black].name, + (winner == WHITE) ? parray[garray[g].white].name : + parray[garray[g].black].name); */ + } + } + } +#endif + + } else { + if (beingplayed) { + pprintf(garray[g].white, "No ratings adjustment done.\n"); + pprintf(garray[g].black, "No ratings adjustment done.\n"); + } + } + if (rate_change && gl < 0) + game_write_complete(g, isDraw, EndSymbol); + /* Mail off the moves */ + if (parray[garray[g].white].automail) { + pcommand(garray[g].white, "mailmoves"); + } + if (parray[garray[g].black].automail) { + pcommand(garray[g].black, "mailmoves"); + } + parray[garray[g].white].num_white++; + parray[garray[g].white].lastColor = WHITE; + parray[garray[g].black].num_black++; + parray[garray[g].black].lastColor = BLACK; + parray[garray[g].white].last_opponent = garray[g].black; + parray[garray[g].black].last_opponent = garray[g].white; + if (beingplayed) { + parray[garray[g].white].game = -1; + parray[garray[g].black].game = -1; + parray[garray[g].white].opponent = -1; + parray[garray[g].black].opponent = -1; + if (garray[g].white != commanding_player) + pprintf_prompt(garray[g].white, ""); + if (garray[g].black != commanding_player) + pprintf_prompt(garray[g].black, ""); + if (parray[garray[g].white].simul_info.numBoards) { + player_simul_over(garray[g].white, g, whiteResult); + } + } + game_finish(g); +} + +PRIVATE int was_promoted(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; +} + +PUBLIC int pIsPlaying (int p) +{ + int g = parray[p].game; + int p1 = parray[p].opponent; + + if (g < 0 || garray[g].status == GAME_EXAMINE) { + pprintf (p, "You are not playing a game.\n"); + return 0; + } else if (garray[g].white != p && garray[g].black != p) { + /* oh oh; big bad game bug. */ + fprintf (stderr, "BUG: Player %s playing game %d according to parray," + "\n but not according to garray.\n", parray[p].name, g+1); + pprintf (p, "Disconnecting you from game number %d.\n", g+1); + parray[p].game = -1; + if (p1 >= 0 && parray[p1].game == g + && garray[g].white != p1 && garray[g].black != p1) { + pprintf (p1, "Disconnecting you from game number %d.\n", g+1); + parray[p1].game = -1; + } + return 0; + } + else return 1; +} + +PUBLIC void process_move(int p, char *command) +{ + int g; + move_t move; + int result; + unsigned now; + int len; /* loon: for lame promotion hack */ + int i; + + if (parray[p].game < 0) { + pprintf(p, "You are not playing or examining a game.\n"); + return; + } + player_decline_offers(p, -1, -PEND_SIMUL); + g = parray[p].game; + + if (garray[g].status != GAME_EXAMINE) { + if (!pIsPlaying) return; + + if (parray[p].side != garray[g].game_state.onMove) { + pprintf(p, "It is not your move.\n"); + return; + } + if (garray[g].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': + parray[p].promote = KNIGHT; + break; + case 'b': + parray[p].promote = BISHOP; + break; + case 'r': + parray[p].promote = ROOK; + break; + case 'q': + parray[p].promote = QUEEN; + break; + default: + pprintf(p, "Don't understand that move.\n"); + return; + break; + } + } + } + switch (parse_move(command, &garray[g].game_state, &move, parray[p].promote)) { + case MOVE_ILLEGAL: + pprintf(p, "Illegal move.\n"); + return; + break; + case MOVE_AMBIGUOUS: + pprintf(p, "Ambiguous move.\n"); + return; + break; + default: + break; + } + + if (garray[g].status == GAME_EXAMINE) { + garray[g].numHalfMoves++; + if (garray[g].numHalfMoves > garray[g].examMoveListSize) { + garray[g].examMoveListSize += 20; /* Allocate 20 moves at a time */ + if (!garray[g].examMoveList) { + garray[g].examMoveList = (move_t *) rmalloc(sizeof(move_t) * garray[g].examMoveListSize); + } else { + garray[g].examMoveList = (move_t *) rrealloc(garray[g].examMoveList, sizeof(move_t) * garray[g].examMoveListSize); + } + } + result = execute_move(&garray[g].game_state, &move, 1); + move.atTime = now; + move.tookTime = 0; + MakeFENpos(g, move.FENpos); + garray[g].examMoveList[garray[g].numHalfMoves - 1] = move; + /* roll back time */ + if (garray[g].game_state.onMove == WHITE) { + garray[g].wTime += (garray[g].lastDecTime - garray[g].lastMoveTime); + } else { + garray[g].bTime += (garray[g].lastDecTime - garray[g].lastMoveTime); + } + now = tenth_secs(); + if (garray[g].numHalfMoves == 0) + garray[g].timeOfStart = now; + garray[g].lastMoveTime = now; + garray[g].lastDecTime = now; + + } else { /* real game */ + i = parray[p].opponent; + if (parray[i].simul_info.numBoards && + (parray[i].simul_info.boards[parray[i].simul_info.onBoard] != g)) { + pprintf(p, "It isn't your turn: wait until the simul giver is at your board.\n"); + return; + } +#ifdef TIMESEAL + + if (con[parray[p].socket].timeseal) { /* does he use timeseal? */ + if (parray[p].side == WHITE) { + garray[g].wLastRealTime = garray[g].wRealTime; + garray[g].wTimeWhenMoved = con[parray[p].socket].time; + if (((garray[g].wTimeWhenMoved - garray[g].wTimeWhenReceivedMove) < 0) || + (garray[g].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 :-) */ + garray[g].wTimeWhenReceivedMove = garray[g].wTimeWhenMoved; + } else { + garray[g].wRealTime -= garray[g].wTimeWhenMoved - garray[g].wTimeWhenReceivedMove; + } + } else if (parray[p].side == BLACK) { + garray[g].bLastRealTime = garray[g].bRealTime; + garray[g].bTimeWhenMoved = con[parray[p].socket].time; + if (((garray[g].bTimeWhenMoved - garray[g].bTimeWhenReceivedMove) < 0) || + (garray[g].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 :-) */ + garray[g].bTimeWhenReceivedMove = garray[g].bTimeWhenMoved; + } else { + garray[g].bRealTime -= garray[g].bTimeWhenMoved - garray[g].bTimeWhenReceivedMove; + } + } + } + /* 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 (parray[p].side == WHITE) { + garray[g].bTimeWhenReceivedMove = 0; + } else { + garray[g].wTimeWhenReceivedMove = 0; + } + +#endif + + game_update_time(g); + + /* maybe add autoflag here in the future? */ + +#ifdef TIMESEAL + + if (con[parray[p].socket].timeseal) { /* does he use timeseal? */ + if (parray[p].side == WHITE) { + garray[g].wRealTime += garray[g].wIncrement * 100; + garray[g].wTime = garray[g].wRealTime / 100; /* remember to conv to + tenth secs */ + } else if (parray[p].side == BLACK) { + garray[g].bRealTime += garray[g].bIncrement * 100; /* conv to ms */ + garray[g].bTime = garray[g].bRealTime / 100; /* remember to conv to + tenth secs */ + } + } else { + if (garray[g].game_state.onMove == BLACK) { + garray[g].bTime += garray[g].bIncrement; + } + if (garray[g].game_state.onMove == WHITE) { + garray[g].wTime += garray[g].wIncrement; + } + } + +#else + + if (garray[g].game_state.onMove == BLACK) { + garray[g].bTime += garray[g].bIncrement; + } + if (garray[g].game_state.onMove == WHITE) { + garray[g].wTime += garray[g].wIncrement; + } +#endif + + /* Do the move */ + garray[g].numHalfMoves++; + if (garray[g].numHalfMoves > garray[g].moveListSize) { + garray[g].moveListSize += 20; /* Allocate 20 moves at a time */ + if (!garray[g].moveList) { + garray[g].moveList = (move_t *) rmalloc(sizeof(move_t) * garray[g].moveListSize); + } else { + garray[g].moveList = (move_t *) rrealloc(garray[g].moveList, sizeof(move_t) * garray[g].moveListSize); + } + } + result = execute_move(&garray[g].game_state, &move, 1); + if (result == MOVE_OK && garray[g].link >= 0 && move.pieceCaptured != NOPIECE) { + /* transfer captured piece to partner */ + /* check if piece reverts to a pawn */ + if (was_promoted(&garray[g], move.toFile, move.toRank)) + update_holding(garray[g].link, colorval(move.pieceCaptured) | PAWN); + else + update_holding(garray[g].link, move.pieceCaptured); + } + now = tenth_secs(); + move.atTime = now; + if (garray[g].numHalfMoves > 1) { + move.tookTime = move.atTime - garray[g].lastMoveTime; + } else { + move.tookTime = move.atTime - garray[g].startTime; + } + garray[g].lastMoveTime = now; + garray[g].lastDecTime = now; + +#ifdef TIMESEAL + + if (con[parray[p].socket].timeseal) { /* does he use timeseal? */ + if (parray[p].side == WHITE) { + move.tookTime = (garray[parray[p].game].wTimeWhenMoved - + garray[parray[p].game].wTimeWhenReceivedMove) / 100; + } else { + move.tookTime = (garray[parray[p].game].bTimeWhenMoved - + garray[parray[p].game].bTimeWhenReceivedMove) / 100; + } + } +#endif + + MakeFENpos(g, move.FENpos); + garray[g].moveList[garray[g].numHalfMoves - 1] = move; + } + + send_boards(g); + + if (result == MOVE_ILLEGAL) { + pprintf(p, "Internal error, illegal move accepted!\n"); + } + if ((result == MOVE_OK) && (garray[g].status == GAME_EXAMINE)) { + int p1; + + for (p1 = 0; p1 < p_num; p1++) { + if (parray[p1].status != PLAYER_PROMPT) + continue; + if (player_is_observe(p1, g) || parray[p1].game == g) { + pprintf_prompt(p1, "%s moves: %s\n", parray[p].name, move.algString); + } + } + } + if (result == MOVE_CHECKMATE) { + if (garray[g].status == GAME_EXAMINE) { + int p1; + + for (p1 = 0; p1 < p_num; p1++) { + if (parray[p1].status != PLAYER_PROMPT) + continue; + if (player_is_observe(p1, g) || parray[p1].game == g) { + pprintf(p1, "%s has been checkmated.\n", + (CToggle(garray[g].game_state.onMove) == BLACK) ? "White" : "Black"); + } + } + } else { + game_ended(g, CToggle(garray[g].game_state.onMove), END_CHECKMATE); + } + } + if (result == MOVE_STALEMATE) { + if (garray[g].status == GAME_EXAMINE) { + int p1; + + for (p1 = 0; p1 < p_num; p1++) { + if (parray[p1].status != PLAYER_PROMPT) + continue; + if (player_is_observe(p1, g) || parray[p1].game == g) { + pprintf(p1, "Stalemate.\n"); + } + } + } else { + game_ended(g, CToggle(garray[g].game_state.onMove), END_STALEMATE); + } + } + if (result == MOVE_NOMATERIAL) { + if (garray[g].status == GAME_EXAMINE) { + int p1; + + for (p1 = 0; p1 < p_num; p1++) { + if (parray[p1].status != PLAYER_PROMPT) + continue; + if (player_is_observe(p1, g) || parray[p1].game == g) { + pprintf(p1, "No mating material.\n"); + } + } + } else { + game_ended(g, CToggle(garray[g].game_state.onMove), END_NOMATERIAL); + } + } +} + +PUBLIC int com_resign(int p, param_list param) +{ + int g, o, oconnected; + + if (param[0].type == TYPE_NULL) { + g = parray[p].game; + if (!pIsPlaying(p)) { + return COM_OK; + } else { + player_decline_offers(p, -1, -1); + game_ended(g, (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", parray[o].name); + if (!oconnected) + player_remove(o); + return COM_OK; + } else { + garray[g].white = o; + garray[g].black = p; + } + } else { + garray[g].white = p; + garray[g].black = o; + } + pprintf(p, "You resign your stored game with %s\n", parray[o].name); + game_delete(garray[g].white, garray[g].black); + game_ended(g, (garray[g].white == p) ? BLACK : WHITE, END_RESIGN); + pcommand(p, "message %s I have resigned our stored game \"%s vs. %s.\"", + parray[o].name, + parray[garray[g].white].name, + parray[garray[g].black].name); + if (!oconnected) + player_remove(o); + } + return COM_OK; +} + +int Check50MoveRule (int p, int g) +{ + int num_reversible = garray[g].numHalfMoves; + + if (garray[g].game_state.lastIrreversable >= 0) { + num_reversible -= garray[g].game_state.lastIrreversable; + } + if (num_reversible > 99) { + game_ended(g, (garray[g].white == p) ? BLACK : WHITE, END_50MOVERULE); + return 1; + } + return 0; +} + +char *GetFENpos (int g, int half_move) +{ + if (half_move < 0) + return garray[g].FENstartPos; + else return garray[g].moveList[half_move].FENpos; +} + +int CheckRepetition (int p, int g) +{ + int move_num; + int flag1 = 1, flag2 = 1; + char *pos1 = GetFENpos (g, garray[g].numHalfMoves - 1); + char *pos2 = GetFENpos (g, garray[g].numHalfMoves); + char *pos; + + if (garray[g].numHalfMoves < 8) /* can't have three repeats any quicker. */ + return 0; + + for (move_num = garray[g].game_state.lastIrreversable; + move_num < 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 (player_find_pendfrom(p, parray[p].opponent, PEND_DRAW) >= 0) { + player_remove_request(parray[p].opponent, p, PEND_DRAW); + player_decline_offers(p, -1, -1); + } + game_ended(g, (garray[g].white == p) ? BLACK : WHITE, END_REPETITION); + return 1; + } + else return 0; +} + +PUBLIC int com_draw(int p, param_list param) +{ + int p1, g = parray[p].game; + + ASSERT(param[0].type == TYPE_NULL); + if (!pIsPlaying(p)) { + return COM_OK; + } + if (Check50MoveRule (p, g) || CheckRepetition(p, g)) { + return COM_OK; + } + p1 = parray[p].opponent; + if (parray[p1].simul_info.numBoards && + parray[p1].simul_info.boards[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 (player_find_pendfrom(p, parray[p].opponent, PEND_DRAW) >= 0) { + player_remove_request(parray[p].opponent, p, PEND_DRAW); + player_decline_offers(p, -1, -1); + game_ended(g, (garray[g].white == p) ? BLACK : WHITE, END_AGREEDDRAW); + } else { + pprintf(parray[p].opponent, "\n"); + pprintf_highlight(parray[p].opponent, "%s", parray[p].name); + pprintf_prompt(parray[p].opponent, " offers you a draw.\n"); + pprintf(p, "Draw request sent.\n"); + player_add_request(p, parray[p].opponent, PEND_DRAW, 0); + } + return COM_OK; +} + +PUBLIC int com_pause(int p, param_list param) +{ + int g; + int now; + + ASSERT(param[0].type == TYPE_NULL); + if (!pIsPlaying(p)) { + return COM_OK; + } + g = parray[p].game; + if (garray[g].wTime == 0) { + pprintf(p, "You can't pause untimed games.\n"); + return COM_OK; + } + if (garray[g].clockStopped) { + pprintf(p, "Game is already paused, use \"unpause\" to resume.\n"); + return COM_OK; + } + if (player_find_pendfrom(p, parray[p].opponent, PEND_PAUSE) >= 0) { + player_remove_request(parray[p].opponent, p, PEND_PAUSE); + garray[g].clockStopped = 1; + /* Roll back the time */ + if (garray[g].game_state.onMove == WHITE) { + garray[g].wTime += (garray[g].lastDecTime - garray[g].lastMoveTime); + } else { + garray[g].bTime += (garray[g].lastDecTime - garray[g].lastMoveTime); + } + now = tenth_secs(); + if (garray[g].numHalfMoves == 0) + garray[g].timeOfStart = now; + garray[g].lastMoveTime = now; + garray[g].lastDecTime = now; + send_boards(g); + pprintf_prompt(parray[p].opponent, "\n%s accepted pause. Game clock paused.\n", + parray[p].name); + pprintf(p, "Game clock paused.\n"); + } else { + pprintf(parray[p].opponent, "\n"); + pprintf_highlight(parray[p].opponent, "%s", parray[p].name); + pprintf_prompt(parray[p].opponent, " requests to pause the game.\n"); + pprintf(p, "Pause request sent.\n"); + player_add_request(p, parray[p].opponent, PEND_PAUSE, 0); + } + return COM_OK; +} + +PUBLIC int com_unpause(int p, param_list param) +{ + int now; + int g; + + ASSERT(param[0].type == TYPE_NULL); + if (!pIsPlaying(p)) { + return COM_OK; + } + g = parray[p].game; + if (!garray[g].clockStopped) { + pprintf(p, "Game is not paused.\n"); + return COM_OK; + } + garray[g].clockStopped = 0; + now = tenth_secs(); + if (garray[g].numHalfMoves == 0) + garray[g].timeOfStart = now; + garray[g].lastMoveTime = now; + garray[g].lastDecTime = now; + send_boards(g); + pprintf(p, "Game clock resumed.\n"); + pprintf_prompt(parray[p].opponent, "\nGame clock resumed.\n"); + return COM_OK; +} + +PUBLIC int com_abort(int p, param_list param) +{ + int p1, g, myColor, yourColor, myGTime, yourGTime; + int courtesyOK = 1; + + ASSERT(param[0].type == TYPE_NULL); + + g = parray[p].game; + if (!pIsPlaying(p)) + return COM_OK; + + p1 = parray[p].opponent; + if (p == garray[g].white) { + myColor = WHITE; + yourColor = BLACK; + myGTime = garray[g].wTime; + yourGTime = garray[g].bTime; + } else { + myColor = BLACK; + yourColor = WHITE; + myGTime = garray[g].bTime; + yourGTime = garray[g].wTime; + } + if (parray[p1].simul_info.numBoards && + parray[p1].simul_info.boards[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 (player_find_pendfrom(p, p1, PEND_ABORT) >= 0) { + player_remove_request(p1, p, PEND_ABORT); + player_decline_offers(p, -1, -1); + game_ended(g, yourColor, END_ABORT); + } else { + game_update_time(g); + +#ifdef TIMESEAL + if (con[parray[p].socket].timeseal + && garray[g].game_state.onMove == myColor + && garray[g].flag_pending == FLAG_ABORT) { + /* It's my move, opponent has asked for abort; I lagged out, + my timeseal prevented courtesyabort, and I sent an abort + request before acknowledging (and processing) my opponent's + courtesyabort. OK, let's abort already :-). */ + player_decline_offers(p, -1, -1); + game_ended(g, yourColor, END_ABORT); + } + + if (con[parray[p1].socket].timeseal) { /* opp uses timeseal? */ + + int yourRealTime = (myColor == WHITE ? garray[g].bRealTime + : garray[g].wRealTime); + if (myGTime > 0 && yourGTime <= 0 && yourRealTime > 0) { + /* Override courtesyabort; opponent still has time. Check for lag. */ + courtesyOK = 0; + + if (garray[g].game_state.onMove != myColor + && garray[g].flag_pending != FLAG_CHECKING) { + /* Opponent may be lagging; let's ask. */ + garray[g].flag_pending = FLAG_ABORT; + garray[g].flag_check_time = time(0); + pprintf(p, "Opponent has timeseal; trying to courtesyabort.\n"); + pprintf(p1, "\n[G]\n"); + return COM_OK; + } + } + } +#endif + + 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."); + player_decline_offers(p, -1, -1); + game_ended(g, myColor, END_COURTESY); + } else { + pprintf(p1, "\n"); + pprintf_highlight(p1, "%s", parray[p].name); + pprintf(p1, " would like to abort the game; "); + pprintf_prompt(p1, "type \"abort\" to accept.\n"); + pprintf(p, "Abort request sent.\n"); + player_add_request(p, p1, PEND_ABORT, 0); + } + } + return COM_OK; +} + +PUBLIC int com_courtesyabort(int p, param_list param) +{ + pprintf(p, "Courtesyabort is obsolete; use \"abort\" instead.\n"); + return COM_OK; +} + +PUBLIC int com_courtesyadjourn(int p, param_list param) +{ + pprintf(p, "Use \"adjourn\" to courtesyadjourn a game.\n"); + return COM_OK; +} + +PRIVATE int player_has_mating_material(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); +} + +PUBLIC int com_flag(int p, param_list param) +{ + int g; + int myColor; + + ASSERT(param[0].type == TYPE_NULL); + if (!pIsPlaying(p)) { + return COM_OK; + } + g = parray[p].game; + myColor = (p == garray[g].white ? WHITE : BLACK); + if (garray[g].type == TYPE_UNTIMED) { + pprintf(p, "You can't flag an untimed game.\n"); + return COM_OK; + } + if (garray[g].numHalfMoves < 2) { + pprintf(p, "You cannot flag before both players have moved.\nUse abort instead.\n"); + return COM_OK; + } + game_update_time(g); + +#ifdef TIMESEAL + + { + int myTime, yourTime, opp = parray[p].opponent, serverTime; + + if (con[parray[p].socket].timeseal) { /* does caller use timeseal? */ + myTime = (myColor == WHITE ? garray[g].wRealTime + : garray[g].bRealTime); + } else { + myTime = (myColor == WHITE ? garray[g].wTime : garray[g].bTime); + } + serverTime = (myColor == WHITE ? garray[g].bTime : garray[g].wTime); + + if (con[parray[opp].socket].timeseal) { /* opp uses timeseal? */ + yourTime = (myColor == WHITE ? garray[g].bRealTime + : garray[g].wRealTime); + } else { + yourTime = serverTime; + } + + /* the clocks to compare are now in myTime and yourTime */ + + if ((myTime <= 0) && (yourTime <= 0)) { + player_decline_offers(p, -1, -1); + 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 && garray[g].game_state.onMove != myColor + && garray[g].flag_pending != FLAG_CHECKING) { + + /* server time thinks opponent is down, but RealTIme disagrees. + * ask client to acknowledge it's alive. */ + + garray[g].flag_pending = FLAG_CALLED; + garray[g].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; + } + } + +#else + + if ((garray[g].wTime <= 0) && (garray[g].bTime <= 0)) { + player_decline_offers(p, -1, -1); + game_ended(g, myColor, END_BOTHFLAG); + return COM_OK; + } + if (myColor == WHITE) { + if (garray[g].bTime > 0) { + pprintf(p, "Your opponent is not out of time!\n"); + return COM_OK; + } + } else { + if (garray[g].wTime > 0) { + pprintf(p, "Your opponent is not out of time!\n"); + return COM_OK; + } + } + +#endif + + player_decline_offers(p, -1, -1); + if (player_has_mating_material(&garray[g].game_state, myColor)) + game_ended(g, myColor, END_FLAG); + else + game_ended(g, myColor, END_FLAGNOMATERIAL); + return COM_OK; +} + +PUBLIC int com_adjourn(int p, param_list param) +{ + int p1, g, myColor, yourColor; + + ASSERT(param[0].type == TYPE_NULL); + if (!pIsPlaying(p)) + return COM_OK; + + p1 = parray[p].opponent; + g = parray[p].game; + if (!(parray[p].registered && parray[p1].registered)) { + pprintf(p, "Both players must be registered to adjorn a game. Use \"abort\".\n"); + return COM_OK; + } + if (garray[g].link >= 0) { + pprintf(p, "Bughouse games cannot be adjourned.\n"); + return COM_OK; + } + myColor = (p == garray[g].white ? WHITE : BLACK); + yourColor = (myColor == WHITE ? BLACK : WHITE); + + if (player_find_pendfrom(p, p1, PEND_ADJOURN) >= 0) { + player_remove_request(p1, p, PEND_ADJOURN); + player_decline_offers(p, -1, -1); + game_ended(parray[p].game, yourColor, END_ADJOURN); + } else { + game_update_time(g); + if (((myColor == WHITE) && (garray[g].wTime > 0) && (garray[g].bTime <= 0)) + || ((myColor == BLACK) && (garray[g].bTime > 0) && (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."); + player_decline_offers(p, -1, -1); + game_ended(g, myColor, END_COURTESYADJOURN); + } else { + pprintf(p1, "\n"); + pprintf_highlight(p1, "%s", parray[p].name); + pprintf(p1, " would like to adjourn the game; "); + pprintf_prompt(p1, "type \"adjourn\" to accept.\n"); + pprintf(p, "Adjourn request sent.\n"); + player_add_request(p, p1, PEND_ADJOURN, 0); + } + } + return COM_OK; +} +#if 0 /* this might as well die now */ +PUBLIC int com_load(int p, param_list param) +{ + pprintf(p, "Obsolete command, please use match .\n"); + return COM_OK; +} +#endif + +PUBLIC int com_takeback(int p, param_list param) +{ + int nHalfMoves = 1; + int from; + int g, i; + int p1; + + if (!pIsPlaying(p)) { + return COM_OK; + } + p1 = parray[p].opponent; + if (parray[p1].simul_info.numBoards && + parray[p1].simul_info.boards[parray[p1].simul_info.onBoard] != + parray[p].game) { + pprintf(p, "You can only make requests when the simul player is at your board.\n"); + return COM_OK; + } + g = parray[p].game; + if (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 ((from = player_find_pendfrom(p, parray[p].opponent, PEND_TAKEBACK)) >= 0) { + player_remove_request(parray[p].opponent, p, PEND_TAKEBACK); + if (parray[p].p_from_list[from].param1 == nHalfMoves) { + /* Doing the takeback */ + player_decline_offers(p, -1, -PEND_SIMUL); + for (i = 0; i < nHalfMoves; i++) { + if (backup_move(g, REL_GAME) != MOVE_OK) { + pprintf(garray[g].white, "Can only backup %d moves\n", i); + pprintf(garray[g].black, "Can only backup %d moves\n", i); + break; + } + } + +#ifdef TIMESEAL + + garray[g].wTimeWhenReceivedMove = 0; + garray[g].bTimeWhenReceivedMove = 0; + +#endif + + send_boards(g); + } else { + if (garray[g].numHalfMoves < nHalfMoves) { + pprintf(p, "There are only %d half moves in your game.\n", garray[g].numHalfMoves); + pprintf_prompt(parray[p].opponent, "\n%s has declined the takeback request.\n", parray[p].name, nHalfMoves); + 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(parray[p].opponent, "\n%s proposes a different number (%d) of half-move(s).\n", parray[p].name, nHalfMoves); + player_add_request(p, parray[p].opponent, PEND_TAKEBACK, nHalfMoves); + } + } else { + if (garray[g].numHalfMoves < nHalfMoves) { + pprintf(p, "There are only %d half moves in your game.\n", garray[g].numHalfMoves); + return COM_OK; + } + pprintf(parray[p].opponent, "\n"); + pprintf_highlight(parray[p].opponent, "%s", parray[p].name); + pprintf_prompt(parray[p].opponent, " would like to take back %d half move(s).\n", + nHalfMoves); + pprintf(p, "Takeback request sent.\n"); + player_add_request(p, parray[p].opponent, PEND_TAKEBACK, nHalfMoves); + } + return COM_OK; +} + + +PUBLIC int com_switch(int p, param_list param) +{ + int g = parray[p].game; + int tmp, now; + int p1; + char *strTmp; + + if (!pIsPlaying(p)) { + return COM_OK; + } + p1 = parray[p].opponent; + if (parray[p1].simul_info.numBoards && + parray[p1].simul_info.boards[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 (garray[g].link >= 0) { + pprintf(p, "Switch not implemented for bughouse games.\n"); + return COM_OK; + } + if (player_find_pendfrom(p, parray[p].opponent, PEND_SWITCH) >= 0) { + player_remove_request(parray[p].opponent, p, PEND_SWITCH); + /* Doing the switch */ + player_decline_offers(p, -1, -PEND_SIMUL); + + tmp = garray[g].white; + garray[g].white = garray[g].black; + garray[g].black = tmp; + parray[p].side = (parray[p].side == WHITE) ? BLACK : WHITE; + strTmp = strdup(garray[g].white_name); + strcpy(garray[g].white_name, garray[g].black_name); + strcpy(garray[g].black_name, strTmp); + strfree(strTmp); + + parray[parray[p].opponent].side = + (parray[parray[p].opponent].side == WHITE) ? BLACK : WHITE; + /* Roll back the time */ + if (garray[g].game_state.onMove == WHITE) { + garray[g].wTime += (garray[g].lastDecTime - garray[g].lastMoveTime); + } else { + garray[g].bTime += (garray[g].lastDecTime - garray[g].lastMoveTime); + } + now = tenth_secs(); + if (garray[g].numHalfMoves == 0) + garray[g].timeOfStart = now; + garray[g].lastMoveTime = now; + garray[g].lastDecTime = now; + send_boards(g); + return COM_OK; + } + if (garray[g].rated && garray[g].numHalfMoves > 0) { + pprintf(p, "You cannot switch sides once a rated game is underway.\n"); + return COM_OK; + } + pprintf(parray[p].opponent, "\n"); + pprintf_highlight(parray[p].opponent, "%s", parray[p].name); + pprintf_prompt(parray[p].opponent, " would like to switch sides.\nType \"accept\" to switch sides, or \"decline\" to refuse.\n"); + pprintf(p, "Switch request sent.\n"); + player_add_request(p, parray[p].opponent, PEND_SWITCH, 0); + return COM_OK; +} + +PUBLIC int com_time(int p, param_list param) +{ + int p1, g; + + if (param[0].type == TYPE_NULL) { + g = parray[p].game; + if (!pIsPlaying(p)) { + return COM_OK; + } + } else { + g = GameNumFromParam(p, &p1, ¶m[0]); + if (g < 0) + return COM_OK; + } + if ((g < 0) || (g >= g_num) || (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", + parray[garray[g].white].name, + garray[g].wTime / 600, + (garray[g].wTime - ((garray[g].wTime / 600) * 600)) / 10); + pprintf(p, "Black (%s) : %d mins, %d secs\n", + parray[garray[g].black].name, + garray[g].bTime / 600, + (garray[g].bTime - ((garray[g].bTime / 600) * 600)) / 10); + return COM_OK; +} + +PUBLIC int com_boards(int p, param_list param) +{ + char *category = NULL; + char dname[MAX_FILENAME_SIZE]; + DIR *dirp; +#ifdef USE_DIRENT + struct dirent *dp; +#else + struct direct *dp; +#endif + + 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; +} + +PUBLIC int com_simmatch(int p, param_list param) +{ + int p1, g, adjourned; + int num; + char tmp[100]; + + if ((parray[p].game >=0) &&(garray[parray[p].game].status == GAME_EXAMINE)) { + pprintf(p, "You are still examining a game.\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 (player_find_pendfrom(p, p1, PEND_SIMUL) >= 0) { + player_remove_request(p, p1, PEND_MATCH); + player_remove_request(p1, p, PEND_MATCH); + player_remove_request(p, p1, PEND_SIMUL); + player_remove_request(p1, p, PEND_SIMUL); + player_withdraw_offers(p, -1, PEND_SIMUL); + player_decline_offers(p1, -1, PEND_SIMUL); + player_withdraw_offers(p1, -1, PEND_SIMUL); + player_decline_offers(p, -1, PEND_MATCH); + player_withdraw_offers(p, -1, PEND_MATCH); + player_decline_offers(p1, -1, PEND_MATCH); + player_withdraw_offers(p1, -1, PEND_MATCH); + player_decline_offers(p, -1, PEND_PARTNER); + player_withdraw_offers(p, -1, PEND_PARTNER); + player_decline_offers(p1, -1, PEND_PARTNER); + player_withdraw_offers(p1, -1, PEND_PARTNER); + + /* Accepting Simul ! */ + + if (parray[p].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"); + 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; + if (!adjourned) { /* no adjourned game, so begin a new game */ + game_remove(g); + + if (create_new_match(p, p1, 0, 0, 0, 0, 0, "standard", "standard", 1)) { + pprintf(p, "There was a problem creating the new match.\n"); + pprintf_prompt(p1, "There was a problem creating the new match.\n"); + return COM_OK; + } + } else { /* resume adjourned game */ + game_delete(p, p1); + + sprintf(tmp, "{Game %d (%s vs. %s) Continuing %s %s simul.}\n", g + 1, parray[p].name, parray[p1].name, rstr[garray[g].rated], bstr[garray[g].type]); + pprintf(p, tmp); + pprintf(p1, tmp); + + garray[g].white = p; + garray[g].black = p1; + garray[g].status = GAME_ACTIVE; + garray[g].startTime = tenth_secs(); + garray[g].lastMoveTime = garray[g].startTime; + garray[g].lastDecTime = garray[g].startTime; + parray[p].game = g; + parray[p].opponent = p1; + parray[p].side = WHITE; + parray[p1].game = g; + parray[p1].opponent = p; + parray[p1].side = BLACK; + send_boards(g); + } + + num = parray[p].simul_info.numBoards; + parray[p].simul_info.results[num] = -1; + parray[p].simul_info.boards[num] = parray[p].game; + parray[p].simul_info.numBoards++; + if (parray[p].simul_info.numBoards > 1 && + parray[p].simul_info.onBoard >= 0) + player_goto_board(p, parray[p].simul_info.onBoard); + else + parray[p].simul_info.onBoard = 0; + return COM_OK; + } + if (player_find_pendfrom(p, -1, PEND_SIMUL) >= 0) { + 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 (parray[p].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 (parray[p].game >=0) { + pprintf(p, "You are already playing a game.\n"); + return COM_OK; + } + if (!parray[p1].sopen) { + pprintf_highlight(p, "%s", parray[p1].name); + pprintf(p, " is not open to receiving simul requests.\n"); + return COM_OK; + } + if (parray[p1].simul_info.numBoards >= MAX_SIMUL) { + pprintf_highlight(p, "%s", 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 ((parray[p1].game >=0) &&(parray[p1].simul_info.numBoards == 0)) { + pprintf_highlight(p, "%s", parray[p1].name); + if (parray[garray[parray[p1].game].white].simul_info.numBoards) { + pprintf(p, " is playing in "); + pprintf_highlight(p, "%s", parray[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; + } +/* loon: this was (p, p1, PEND_SIMUL) but player_add_request needs 4 args... +if 0 is the incorrect 4th arg, please fix :) */ + + 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 (!(garray[g].type == TYPE_UNTIMED)) + adjourned = 0; + } + game_remove(g); + + if (player_add_request(p, p1, PEND_SIMUL, 0)) { + pprintf(p, "Maximum number of pending actions reached. Your request was not sent.\nTry again later.\n"); + return COM_OK; + } else { + pprintf(p1, "\n"); + pprintf_highlight(p1, "%s", parray[p].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 { + pprintf_prompt(p1, " requests to join a simul match with you.\n"); + pprintf(p, "Simul match request sent.\n"); + } + } + return COM_OK; +} + +PUBLIC int com_goboard(int p, param_list param) +{ + int on, g, p1; + + if (!parray[p].simul_info.numBoards) { + pprintf(p, "You are not giving a simul.\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 goboard yourself!\n"); + return COM_OK; + } + on = parray[p].simul_info.onBoard; + g = parray[p].simul_info.boards[on]; + if (p1 == garray[g].black) { + pprintf(p, "You are already at that board!\n"); + return COM_OK; + } + if (parray[p].simul_info.numBoards > 1) { + player_decline_offers(p, -1, -PEND_SIMUL); + if (player_goto_simulgame_bynum(p, parray[p1].game) !=-1) { + if (g >= 0) { + pprintf(garray[g].black, "\n"); + pprintf_highlight(garray[g].black, "%s", parray[p].name); + pprintf_prompt(garray[g].black, " has moved away from your board.\n"); + } + } + } else + pprintf(p, "You are only playing one board!\n"); + return COM_OK; +} + +PUBLIC int com_gonum(int p, param_list param) +{ + int on, g, gamenum; + + if (!parray[p].simul_info.numBoards) { + pprintf(p, "You are not giving a simul.\n"); + return COM_OK; + } + on = parray[p].simul_info.onBoard; + g = parray[p].simul_info.boards[on]; + gamenum = param[0].val.integer - 1; + if (gamenum < 0) + gamenum = 0; + if (on == gamenum) { + pprintf(p, "You are already at that board!\n"); + return COM_OK; + } + if (parray[p].simul_info.numBoards > 1) { + player_decline_offers(p, -1, -PEND_SIMUL); + if (player_goto_simulgame_bynum(p, gamenum) != -1) { + if (g >= 0) { + pprintf(garray[g].black, "\n"); + pprintf_highlight(garray[g].black, "%s", parray[p].name); + pprintf_prompt(garray[g].black, " has moved away from your board.\n"); + } + } + } else + pprintf(p, "You are only playing one board!\n"); + return COM_OK; +} + +PUBLIC int com_simnext(int p, param_list param) +{ + int on, g; + + if (!parray[p].simul_info.numBoards) { + pprintf(p, "You are not giving a simul.\n"); + return COM_OK; + } + if (parray[p].simul_info.numBoards > 1) { + player_decline_offers(p, -1, -PEND_SIMUL); + on = parray[p].simul_info.onBoard; + g = parray[p].simul_info.boards[on]; + if (g >= 0) { + pprintf(garray[g].black, "\n"); + pprintf_highlight(garray[g].black, "%s", parray[p].name); + pprintf_prompt(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; +} + + +PUBLIC int com_simprev(int p, param_list param) +{ + int on, g; + + if (!parray[p].simul_info.numBoards) { + pprintf(p, "You are not giving a simul.\n"); + return COM_OK; + } + if (parray[p].simul_info.numBoards > 1) { + player_decline_offers(p, -1, -PEND_SIMUL); + on = parray[p].simul_info.onBoard; + g = parray[p].simul_info.boards[on]; + if (g >= 0) { + pprintf(garray[g].black, "\n"); + pprintf_highlight(garray[g].black, "%s", parray[p].name); + pprintf_prompt(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; +} + +PUBLIC 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", parray[p1].name, + player_num_active_boards(p1)); + return COM_OK; +} + +PUBLIC int com_simpass(int p, param_list param) +{ + int g, p1, on; + + if (!pIsPlaying(p)) { + return COM_OK; + } + g = parray[p].game; + p1 = garray[g].white; + if (!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 = parray[p1].simul_info.onBoard; + if (parray[p1].simul_info.boards[on] != g) { + pprintf(p, "You cannot pass until the simul holder arrives!\n"); + return COM_OK; + } + if (garray[g].passes >= MAX_SIMPASS) { + if (parray[p].bell) + pprintf(p, "\a"); + pprintf(p, "You have reached your maximum of %d pass(es).\n", MAX_SIMPASS); + pprintf(p, "Please move IMMEDIATELY!\n"); + pprintf_highlight(p1, "%s", parray[p].name); + pprintf_prompt(p1, " tried to pass, but is out of passes.\n"); + return COM_OK; + } + player_decline_offers(p, -1, -PEND_SIMUL); + + garray[g].passes++; + pprintf(p, "You have passed and have %d pass(es) left.\n", + (MAX_SIMPASS - garray[g].passes)); + pprintf_highlight(p1, "%s", parray[p].name); + pprintf_prompt(p1, " has decided to pass and has %d pass(es) left.\n", + (MAX_SIMPASS - garray[g].passes)); + player_goto_next_board(p1); + return COM_OK; +} + +PUBLIC int com_simabort(int p, param_list param) +{ + if (!parray[p].simul_info.numBoards) { + pprintf(p, "You are not giving a simul.\n"); + return COM_OK; + } + player_decline_offers(p, -1, -PEND_SIMUL); + game_ended(parray[p].simul_info.boards[parray[p].simul_info.onBoard], + WHITE, END_ABORT); + return COM_OK; +} + +PUBLIC int com_simallabort(int p, param_list param) +{ + int i; + + if (!parray[p].simul_info.numBoards) { + pprintf(p, "You are not giving a simul.\n"); + return COM_OK; + } + player_decline_offers(p, -1, -PEND_SIMUL); + for (i = 0; i < parray[p].simul_info.numBoards; i++) { + if (parray[p].simul_info.boards[i] >= 0) { + game_ended(parray[p].simul_info.boards[i], + WHITE, END_ABORT); + } + } + return COM_OK; +} + +PUBLIC int com_simadjourn(int p, param_list param) +{ + if (!parray[p].simul_info.numBoards) { + pprintf(p, "You are not giving a simul.\n"); + return COM_OK; + } + player_decline_offers(p, -1, -PEND_SIMUL); + game_ended(parray[p].simul_info.boards[parray[p].simul_info.onBoard], + WHITE, END_ADJOURN); + return COM_OK; +} + +PUBLIC int com_simalladjourn(int p, param_list param) +{ + int i; + + if (!parray[p].simul_info.numBoards) { + pprintf(p, "You are not giving a simul.\n"); + return COM_OK; + } + player_decline_offers(p, -1, -PEND_SIMUL); + for (i = 0; i < parray[p].simul_info.numBoards; i++) { + if (parray[p].simul_info.boards[i] >= 0) { + game_ended(parray[p].simul_info.boards[i], + WHITE, END_ADJOURN); + } + } + return COM_OK; +} + +PUBLIC int com_moretime(int p, param_list param) +{ + int g, increment; + + ASSERT(param[0].type == TYPE_INT); + if ((parray[p].game >=0) &&(garray[parray[p].game].status == GAME_EXAMINE)) { + 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 = parray[p].game; + if (garray[g].white == p) { + garray[g].bTime += increment * 10; +#ifdef TIMESEAL + garray[g].bRealTime += increment * 10 * 100; +#endif + pprintf(p, "%d seconds were added to your opponents clock\n", + increment); + pprintf_prompt(parray[p].opponent, + "\nYour opponent has added %d seconds to your clock.\n", + increment); + } + if (garray[g].black == p) { + garray[g].wTime += increment * 10;; +#ifdef TIMESEAL + garray[g].wRealTime += increment * 10 * 100; +#endif + pprintf(p, "%d seconds were added to your opponents clock\n", + increment); + pprintf_prompt(parray[p].opponent, + "\nYour opponent has added %d seconds to your clock.\n", + increment); + } + return COM_OK; +} + diff --git a/FICS/gameproc.c.orig b/FICS/gameproc.c.orig new file mode 100644 index 0000000..832f5c9 --- /dev/null +++ b/FICS/gameproc.c.orig @@ -0,0 +1,2826 @@ +/* gameproc.c + * + */ + +/* + 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 + (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. +*/ + +/* Revision history: + name email yy/mm/dd Change + Richard Nash 93/10/22 Created +*/ + +#include "stdinclude.h" + +#include "common.h" +#include "command.h" +#include "ficsmain.h" +#include "config.h" +#include "playerdb.h" +#include "gamedb.h" +#include "gameproc.h" +#include "movecheck.h" +#include "utils.h" +#include "ratings.h" +#include "rmalloc.h" +#include "comproc.h" +#include "matchproc.h" +#include "formula.h" +#include "eco.h" +#include "network.h" +/* #include "hostinfo.h" */ + +PUBLIC void game_ended(int g, int winner, int why) +{ + char outstr[200]; + char tmp[200]; + int p; + 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 */ + + beingplayed = (parray[garray[g].black].game == g); + + sprintf(outstr, "\n{Game %d (%s vs. %s) ", g + 1, + parray[garray[g].white].name, + parray[garray[g].black].name); + garray[g].result = why; + garray[g].winner = winner; + if (winner == WHITE) { + whiteResult = RESULT_WIN; + strcpy(winSymbol, "1-0"); + NameOfWinner = parray[garray[g].white].name; + NameOfLoser = parray[garray[g].black].name; + } else { + whiteResult = RESULT_LOSS; + strcpy(winSymbol, "0-1"); + NameOfWinner = parray[garray[g].black].name; + NameOfLoser = parray[garray[g].white].name; + } + switch (why) { + case END_CHECKMATE: + sprintf(tmp, "%s checkmated} %s\n", NameOfLoser, winSymbol); + strcpy(EndSymbol, "Mat"); + rate_change = 1; + break; + case END_RESIGN: + sprintf(tmp, "%s resigns} %s\n", NameOfLoser, winSymbol); + strcpy(EndSymbol, "Res"); + rate_change = 1; + break; + case END_FLAG: + sprintf(tmp, "%s forfeits on time} %s\n", NameOfLoser, winSymbol); + strcpy(EndSymbol, "Fla"); + rate_change = 1; + break; + case END_STALEMATE: + sprintf(tmp, "Game drawn by stalemate} 1/2-1/2\n"); + 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\n"); + 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\n"); + 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\n"); + 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\n"); + isDraw = 1; + strcpy(EndSymbol, "50"); + rate_change = 1; + whiteResult = RESULT_DRAW; + break; + case END_ADJOURN: + sprintf(tmp, "Game adjourned by mutual agreement} *\n"); + game_save(g); + break; + case END_LOSTCONNECTION: + sprintf(tmp, "%s lost connection; game ", NameOfWinner); + if (parray[garray[g].white].registered && parray[garray[g].black].registered) { + sprintf(tmp, "adjourned} *\n"); + game_save(g); + } else + sprintf(tmp, "aborted} *\n"); + whiteResult = RESULT_ABORT; + break; + case END_ABORT: + sprintf(tmp, "Game aborted by mutual agreement} *\n"); + whiteResult = RESULT_ABORT; + break; + case END_COURTESY: + sprintf(tmp, "Game courtesyaborted by %s} *\n", NameOfWinner); + whiteResult = RESULT_ABORT; + break; + case END_COURTESYADJOURN: + sprintf(tmp, "Game courtesyadjourned by %s} *\n", 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\n"); + 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\n", + NameOfLoser, NameOfWinner); + isDraw = 1; + strcpy(EndSymbol, "TM "); + rate_change = 1; + whiteResult = RESULT_DRAW; + break; + case END_ADJWIN: + sprintf(tmp, "%s wins by adjudication} %s\n", NameOfWinner, winSymbol); + strcpy(EndSymbol, "Adj"); + rate_change = 1; + break; + case END_ADJDRAW: + sprintf(tmp, "Game drawn by adjudication} 1/2-1/2\n"); + isDraw = 1; + strcpy(EndSymbol, "Adj"); + rate_change = 1; + whiteResult = RESULT_DRAW; + break; + case END_ADJABORT: + sprintf(tmp, "Game aborted by adjudication} *\n"); + whiteResult = RESULT_ABORT; + break; + default: + sprintf(tmp, "Hmm, the game ended and I don't know why} *\n"); + break; + } + strcat(outstr, tmp); + if (beingplayed) { + pprintf_noformat(garray[g].white, outstr); + pprintf_noformat(garray[g].black, outstr); + + for (p = 0; p < p_num; p++) { + if ((p == garray[g].white) || (p == garray[g].black)) + continue; + if (parray[p].status != PLAYER_PROMPT) + continue; + if (!parray[p].i_game && !player_is_observe(p, g)) + continue; + pprintf_noformat(p, outstr); + pprintf_prompt(p, ""); + } + } + if ((garray[g].rated) && (rate_change)) { + /* Adjust ratings */ + rating_update(g); + if (parray[garray[g].white].network_player && + parray[garray[g].black].network_player) { + if (MailGameResult) { /* Send to ratings server */ + if (isDraw) { + /* hostinfo_mailresults(garray[g].type == TYPE_BLITZ ? "blitz" : + garray[g].type == TYPE_WILD ? "wild " : "stand", " + parray[garray[g].white].name, parray[garray[g].black].name, + "draw"); */ + } else { +/* hostinfo_mailresults(garray[g].type == TYPE_BLITZ ? "blitz" : garray[g].type == TYPE_WILD ? "wild " : "stand", + parray[garray[g].white].name, + parray[garray[g].black].name, + (winner == WHITE) ? parray[garray[g].white].name : + parray[garray[g].black].name); */ + } + } + } + } else { + if (beingplayed) { + pprintf(garray[g].white, "No ratings adjustment done.\n"); + pprintf(garray[g].black, "No ratings adjustment done.\n"); + } + } + if (rate_change) + game_write_complete(g, isDraw, EndSymbol); + /* Mail off the moves */ + if (parray[garray[g].white].automail) { + pcommand(garray[g].white, "mailmoves"); + } + if (parray[garray[g].black].automail) { + pcommand(garray[g].black, "mailmoves"); + } + parray[garray[g].white].num_white++; + parray[garray[g].white].lastColor = WHITE; + parray[garray[g].black].num_black++; + parray[garray[g].black].lastColor = BLACK; + parray[garray[g].white].last_opponent = garray[g].black; + parray[garray[g].black].last_opponent = garray[g].white; + if (beingplayed) { + parray[garray[g].white].game = -1; + parray[garray[g].black].game = -1; + parray[garray[g].white].opponent = -1; + parray[garray[g].black].opponent = -1; + if (garray[g].white != commanding_player) + pprintf_prompt(garray[g].white, ""); + if (garray[g].black != commanding_player) + pprintf_prompt(garray[g].black, ""); + if (parray[garray[g].white].simul_info.numBoards) { + player_simul_over(garray[g].white, g, whiteResult); + } + } + game_finish(g); +} + +PUBLIC void process_move(int p, char *command) +{ + int g; + move_t move; + int result; + unsigned now; + int len; /* loon: for lame promotion hack */ + int i; + + if (parray[p].game <0) { + pprintf(p, "You are not playing a game.\n"); + return; + } + player_decline_offers(p, -1, -PEND_SIMUL); + g = parray[p].game; + + if (garray[g].status != GAME_EXAMINE) { + if (parray[p].side != garray[g].game_state.onMove) { + pprintf(p, "It is not your move.\n"); + return; + } + if (garray[g].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': + parray[p].promote = KNIGHT; + break; + case 'b': + parray[p].promote = BISHOP; + break; + case 'r': + parray[p].promote = ROOK; + break; + case 'q': + parray[p].promote = QUEEN; + break; + default: + pprintf(p, "Don't understand that move.\n"); + return; + break; + } + } + } + switch (parse_move(command, &garray[g].game_state, &move, parray[p].promote)) { + case MOVE_ILLEGAL: + pprintf(p, "Illegal move.\n"); + return; + break; + case MOVE_AMBIGUOUS: + pprintf(p, "Ambiguous move.\n"); + return; + break; + default: + break; + } + + if (garray[g].status == GAME_EXAMINE) { + garray[g].numHalfMoves++; + if (garray[g].numHalfMoves > garray[g].examMoveListSize) { + garray[g].examMoveListSize += 20; /* Allocate 20 moves at a time */ + if (!garray[g].examMoveList) { + garray[g].examMoveList = (move_t *) rmalloc(sizeof(move_t) * garray[g].examMoveListSize); + } else { + garray[g].examMoveList = (move_t *) rrealloc(garray[g].examMoveList, sizeof(move_t) * garray[g].examMoveListSize); + } + } + result = execute_move(&garray[g].game_state, &move, 1); + move.atTime = now; + move.tookTime = 0; + garray[g].examMoveList[garray[g].numHalfMoves - 1] = move; + /* roll back time */ + if (garray[g].game_state.onMove == WHITE) { + garray[g].wTime += (garray[g].lastDecTime - garray[g].lastMoveTime); + } else { + garray[g].bTime += (garray[g].lastDecTime - garray[g].lastMoveTime); + } + now = tenth_secs(); + if (garray[g].numHalfMoves == 0) + garray[g].timeOfStart = now; + garray[g].lastMoveTime = now; + garray[g].lastDecTime = now; + + } else { /* real game */ + i = parray[p].opponent; + if (parray[i].simul_info.numBoards && + (parray[i].simul_info.boards[parray[i].simul_info.onBoard] != g)) { + pprintf(p, "It isn't your turn: wait until the simul giver is at your board.\n"); + return; + } +#ifdef TIMESEAL + + + if (con[parray[p].socket].timeseal) { /* does he use timeseal? */ + if (parray[p].side == WHITE) { + garray[g].wLastRealTime = garray[g].wRealTime; + garray[g].wTimeWhenMoved = con[parray[p].socket].time; + if (((garray[g].wTimeWhenMoved - garray[g].wTimeWhenReceivedMove) < 0) || + (garray[g].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 :-) */ + garray[g].wTimeWhenReceivedMove = garray[g].wTimeWhenMoved; + } else { + garray[g].wRealTime -= garray[g].wTimeWhenMoved - garray[g].wTimeWhenReceivedMove; + } + } else if (parray[p].side == BLACK) { + garray[g].bLastRealTime = garray[g].bRealTime; + garray[g].bTimeWhenMoved = con[parray[p].socket].time; + if (((garray[g].bTimeWhenMoved - garray[g].bTimeWhenReceivedMove) < 0) || + (garray[g].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 :-) */ + garray[g].bTimeWhenReceivedMove = garray[g].bTimeWhenMoved; + } else { + garray[g].bRealTime -= garray[g].bTimeWhenMoved - garray[g].bTimeWhenReceivedMove; + } + } + } + if (parray[p].side == WHITE) { + /* 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 */ + garray[g].bTimeWhenReceivedMove = 0; + } else { + /* 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 */ + garray[g].wTimeWhenReceivedMove = 0; + } + +#endif + + game_update_time(g); + + /* maybe add autoflag here in the future? */ + +#ifdef TIMESEAL + + if (con[parray[p].socket].timeseal) { /* does he use timeseal? */ + if (parray[p].side == WHITE) { + garray[g].wRealTime += garray[g].wIncrement * 100; + garray[g].wTime = garray[g].wRealTime / 100; /* remember to conv to + tenth secs */ + } else if (parray[p].side == BLACK) { + garray[g].bRealTime += garray[g].bIncrement * 100; /* conv to ms */ + garray[g].bTime = garray[g].bRealTime / 100; /* remember to conv to + tenth secs */ + } + } else { + if (garray[g].game_state.onMove == BLACK) { + garray[g].bTime += garray[g].bIncrement; + } + if (garray[g].game_state.onMove == WHITE) { + garray[g].wTime += garray[g].wIncrement; + } + } + +#else + + if (garray[g].game_state.onMove == BLACK) { + garray[g].bTime += garray[g].bIncrement; + } + if (garray[g].game_state.onMove == WHITE) { + garray[g].wTime += garray[g].wIncrement; + } +#endif + + /* Do the move */ + garray[g].numHalfMoves++; + if (garray[g].numHalfMoves > garray[g].moveListSize) { + garray[g].moveListSize += 20; /* Allocate 20 moves at a time */ + if (!garray[g].moveList) { + garray[g].moveList = (move_t *) rmalloc(sizeof(move_t) * garray[g].moveListSize); + } else { + garray[g].moveList = (move_t *) rrealloc(garray[g].moveList, sizeof(move_t) * garray[g].moveListSize); + } + } + result = execute_move(&garray[g].game_state, &move, 1); + now = tenth_secs(); + move.atTime = now; + if (garray[g].numHalfMoves > 1) { + move.tookTime = move.atTime - garray[g].lastMoveTime; + } else { + move.tookTime = move.atTime - garray[g].startTime; + } + garray[g].lastMoveTime = now; + garray[g].lastDecTime = now; + +#ifdef TIMESEAL + + if (con[parray[p].socket].timeseal) { /* does he use timeseal? */ + if (parray[p].side == WHITE) { + move.tookTime = (garray[parray[p].game].wTimeWhenMoved - + garray[parray[p].game].wTimeWhenReceivedMove) / 100; + } else { + move.tookTime = (garray[parray[p].game].bTimeWhenMoved - + garray[parray[p].game].bTimeWhenReceivedMove) / 100; + } + } +#endif + + garray[g].moveList[garray[g].numHalfMoves - 1] = move; + } + + send_boards(g); + + strcpy(garray[g].boardList[garray[g].numHalfMoves], boardToFEN(g)); + + if (result == MOVE_ILLEGAL) { + pprintf(p, "Internal error, illegal move accepted!\n"); + } + if ((result == MOVE_OK) && (garray[g].status == GAME_EXAMINE)) { + int p1; + + for (p1 = 0; p1 < p_num; p1++) { + if (parray[p1].status != PLAYER_PROMPT) + continue; + if (player_is_observe(p1, g) || parray[p1].game == g) { + pprintf_prompt(p1, "%s moves: %s\n", parray[p].name, move.algString); + } + } + } + if (result == MOVE_CHECKMATE) { + if (garray[g].status == GAME_EXAMINE) { + int p1; + + for (p1 = 0; p1 < p_num; p1++) { + if (parray[p1].status != PLAYER_PROMPT) + continue; + if (player_is_observe(p1, g) || parray[p1].game == g) { + pprintf(p1, "%s has been checkmated.\n", + (CToggle(garray[g].game_state.onMove) == BLACK) ? "White" : "Black"); + } + } + } else { + game_ended(g, CToggle(garray[g].game_state.onMove), END_CHECKMATE); + } + } + if (result == MOVE_STALEMATE) { + if (garray[g].status == GAME_EXAMINE) { + int p1; + + for (p1 = 0; p1 < p_num; p1++) { + if (parray[p1].status != PLAYER_PROMPT) + continue; + if (player_is_observe(p1, g) || parray[p1].game == g) { + pprintf(p1, "Stalemate.\n"); + } + } + } else { + game_ended(g, CToggle(garray[g].game_state.onMove), END_STALEMATE); + } + } + if (result == MOVE_NOMATERIAL) { + if (garray[g].status == GAME_EXAMINE) { + int p1; + + for (p1 = 0; p1 < p_num; p1++) { + if (parray[p1].status != PLAYER_PROMPT) + continue; + if (player_is_observe(p1, g) || parray[p1].game == g) { + pprintf(p1, "No mating material.\n"); + } + } + } else { + game_ended(g, CToggle(garray[g].game_state.onMove), END_NOMATERIAL); + } + } +} + +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 (parray[*p1].game <0) + pprintf(p, "%s is not playing a game.\n", parray[*p1].name); + return 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; + } +} + +PUBLIC int com_resign(int p, param_list param) +{ + int g, o, oconnected, confused = 0; + + if (param[0].type == TYPE_NULL) { + g = parray[p].game; + if ((g < 0) || (garray[g].status == GAME_EXAMINE)) { + pprintf(p, "You are not playing a game.\n"); + } else { + player_decline_offers(p, -1, -1); + game_ended(g, (garray[g].white == p) ? BLACK : WHITE, END_RESIGN); + } + } else if (FindPlayer(p, ¶m[0], &o, &oconnected)) { + g = game_new(); + if (game_read(g, p, o) < 0) { + if (game_read(g, o, p) < 0) { + confused = 1; + pprintf(p, "You have no stored game with %s\n", parray[o].name); + } else { + garray[g].white = o; + garray[g].black = p; + } + } else { + garray[g].white = p; + garray[g].black = o; + } + if (!confused) { + pprintf(p, "You resign your stored game with %s\n", parray[o].name); + game_delete(garray[g].white, garray[g].black); + game_ended(g, (garray[g].white == p) ? BLACK : WHITE, END_RESIGN); + pcommand(p, "message %s I have resigned our stored game \"%s vs. %s.\"", + parray[o].name, + parray[garray[g].white].name, + parray[garray[g].black].name); + if (!oconnected) + player_remove(o); + } + } + return COM_OK; +} + +/* +PUBLIC int com_resign(int p, param_list param) +{ + ASSERT(param[0].type == TYPE_NULL); + if ((parray[p].game <0) || (garray[parray[p].game].status == GAME_EXAMINE)) { + pprintf(p, "You are not playing a game.\n"); + return COM_OK; + } + player_decline_offers(p, -1, -1); + game_ended(parray[p].game, (garray[parray[p].game].white == p) ? BLACK : WHITE, END_RESIGN); + return COM_OK; +} +*/ + +PUBLIC int com_draw(int p, param_list param) +{ + int p1; + int move_num = 0; + int i = 0, flag = 0; + + ASSERT(param[0].type == TYPE_NULL); + if ((parray[p].game <0) ||(garray[parray[p].game].status == GAME_EXAMINE)) { + pprintf(p, "You are not playing a game.\n"); + return COM_OK; + } + if (garray[parray[p].game].numHalfMoves - ((garray[parray[p].game].game_state.lastIrreversable == -1) ? 0 : garray[parray[p].game].game_state.lastIrreversable) > 99) { + game_ended(parray[p].game, (garray[parray[p].game].white == p) ? BLACK : WHITE, END_50MOVERULE); + return COM_OK; + } + if (garray[parray[p].game].game_state.lastIrreversable != -1) + move_num = garray[parray[p].game].game_state.lastIrreversable; + + for (i = (garray[parray[p].game].numHalfMoves - 1); i <= garray[parray[p].game].numHalfMoves; i++) { + flag = 0; + if (garray[parray[p].game].game_state.lastIrreversable != -1) + move_num = garray[parray[p].game].game_state.lastIrreversable; + for (; move_num <= garray[parray[p].game].numHalfMoves; move_num++) { + if ((strlen(garray[parray[p].game].boardList[move_num])) != + (strlen(garray[parray[p].game].boardList[i]))) + continue; + + if (!strcmp(garray[parray[p].game].boardList[move_num], + garray[parray[p].game].boardList[i])) + flag++; + } + if (flag >= 3) { + if (player_find_pendfrom(p, parray[p].opponent, PEND_DRAW) >= 0) { + player_remove_request(parray[p].opponent, p, PEND_DRAW); + player_decline_offers(p, -1, -1); + } + game_ended(parray[p].game, (garray[parray[p].game].white == p) ? BLACK : WHITE, END_REPETITION); + return COM_OK; + } + } + + p1 = parray[p].opponent; + if (parray[p1].simul_info.numBoards && + parray[p1].simul_info.boards[parray[p1].simul_info.onBoard] != + parray[p].game) { + pprintf(p, "You can only make requests when the simul player is at your board.\n"); + return COM_OK; + } + if (player_find_pendfrom(p, parray[p].opponent, PEND_DRAW) >= 0) { + player_remove_request(parray[p].opponent, p, PEND_DRAW); + player_decline_offers(p, -1, -1); + game_ended(parray[p].game, (garray[parray[p].game].white == p) ? BLACK : WHITE, END_AGREEDDRAW); + } else { + pprintf(parray[p].opponent, "\n"); + pprintf_highlight(parray[p].opponent, "%s", parray[p].name); + pprintf_prompt(parray[p].opponent, " offers you a draw.\n"); + pprintf(p, "Draw request sent.\n"); + player_add_request(p, parray[p].opponent, PEND_DRAW, 0); + } + return COM_OK; +} + +PUBLIC int com_pause(int p, param_list param) +{ + int g; + int now; + + ASSERT(param[0].type == TYPE_NULL); + if ((parray[p].game <0) ||(garray[parray[p].game].status == GAME_EXAMINE)) { + pprintf(p, "You are not playing a game.\n"); + return COM_OK; + } + g = parray[p].game; + if (garray[g].wTime == 0) { + pprintf(p, "You can't pause untimed games.\n"); + return COM_OK; + } + if (garray[g].clockStopped) { + pprintf(p, "Game is already paused, use \"unpause\" to resume.\n"); + return COM_OK; + } + if (player_find_pendfrom(p, parray[p].opponent, PEND_PAUSE) >= 0) { + player_remove_request(parray[p].opponent, p, PEND_PAUSE); + garray[g].clockStopped = 1; + /* Roll back the time */ + if (garray[g].game_state.onMove == WHITE) { + garray[g].wTime += (garray[g].lastDecTime - garray[g].lastMoveTime); + } else { + garray[g].bTime += (garray[g].lastDecTime - garray[g].lastMoveTime); + } + now = tenth_secs(); + if (garray[g].numHalfMoves == 0) + garray[g].timeOfStart = now; + garray[g].lastMoveTime = now; + garray[g].lastDecTime = now; + send_boards(g); + pprintf_prompt(parray[p].opponent, "\n%s accepted pause. Game clock paused.\n", + parray[p].name); + pprintf(p, "Game clock paused.\n"); + } else { + pprintf(parray[p].opponent, "\n"); + pprintf_highlight(parray[p].opponent, "%s", parray[p].name); + pprintf_prompt(parray[p].opponent, " requests to pause the game.\n"); + pprintf(p, "Pause request sent.\n"); + player_add_request(p, parray[p].opponent, PEND_PAUSE, 0); + } + return COM_OK; +} + +PUBLIC int com_unpause(int p, param_list param) +{ + int now; + int g; + + ASSERT(param[0].type == TYPE_NULL); + if ((parray[p].game <0) ||(garray[parray[p].game].status == GAME_EXAMINE)) { + pprintf(p, "You are not playing a game.\n"); + return COM_OK; + } + g = parray[p].game; + if (!garray[g].clockStopped) { + pprintf(p, "Game is not paused.\n"); + return COM_OK; + } + garray[g].clockStopped = 0; + now = tenth_secs(); + if (garray[g].numHalfMoves == 0) + garray[g].timeOfStart = now; + garray[g].lastMoveTime = now; + garray[g].lastDecTime = now; + send_boards(g); + pprintf(p, "Game clock resumed.\n"); + pprintf_prompt(parray[p].opponent, "\nGame clock resumed.\n"); + return COM_OK; +} + +PUBLIC int com_abort(int p, param_list param) +{ + int p1, g, myColor, yourColor; + + ASSERT(param[0].type == TYPE_NULL); + + g = parray[p].game; + if ((g < 0) || (garray[parray[p].game].status == GAME_EXAMINE)) { + pprintf(p, "You are not playing a game.\n"); + return COM_OK; + } + p1 = parray[p].opponent; + myColor = (p == garray[g].white ? WHITE : BLACK); + yourColor = (myColor == WHITE ? BLACK : WHITE); + + if (parray[p1].simul_info.numBoards && + parray[p1].simul_info.boards[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 (player_find_pendfrom(p, p1, PEND_ABORT) >= 0) { + player_remove_request(p1, p, PEND_ABORT); + player_decline_offers(p, -1, -1); + game_ended(g, yourColor, END_ABORT); + } else { + game_update_time(g); + +#ifdef TIMESEAL + + if (con[parray[parray[p].opponent].socket].timeseal) { /* opp uses timeseal? */ + + /* If opponent has timeseal - we have no use for courtesyabort since + courtesyabort was used when opponent lagged out of time which cannot + happen with timeseal - only courtesyadjourn should be possible. + Thus: the request can only be for a normal abort of the game. */ + + pprintf(p1, "\n"); + pprintf_highlight(p1, "%s", parray[p].name); + pprintf_prompt(p1, " would like to abort the game.\n"); + pprintf(p, "Abort request sent.\n"); + player_add_request(p, p1, PEND_ABORT, 0); + } else { + if ((myColor == WHITE && garray[g].wTime > 0 && garray[g].bTime <= 0) + || (myColor == BLACK && garray[g].bTime > 0 && garray[g].wTime <= 0)) { + /* 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."); + player_decline_offers(p, -1, -1); + game_ended(g, myColor, END_COURTESY); + } else { + pprintf(p1, "\n"); + pprintf_highlight(p1, "%s", parray[p].name); + pprintf_prompt(p1, " would like to abort the game.\n"); + pprintf(p, "Abort request sent.\n"); + player_add_request(p, p1, PEND_ABORT, 0); + } + } + +#else + + if ((myColor == WHITE && garray[g].wTime > 0 && garray[g].bTime <= 0) + || (myColor == BLACK && garray[g].bTime > 0 && garray[g].wTime <= 0)) { + /* 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."); + player_decline_offers(p, -1, -1); + game_ended(g, myColor, END_COURTESY); + } else { + pprintf(p1, "\n"); + pprintf_highlight(p1, "%s", parray[p].name); + pprintf(p1, " would like to abort the game; "); + pprintf_prompt(p1, "type \"abort\" to accept.\n"); + pprintf(p, "Abort request sent.\n"); + player_add_request(p, p1, PEND_ABORT, 0); + } + +#endif + + } + return COM_OK; +} + +#if 0 +int Courtesy(int p, int type) +{ + int g; + + if (parray[p].game <0) { + pprintf(p, "You are not playing a game.\n"); + return COM_OK; + } + g = parray[p].game; + if (garray[g].wInitTime == 0) { + if (type == END_COURTESY) + pprintf(p, "You can't courtesy abort an untimed game, just resign.\n"); + else if (type == END_COURTESYADJOURN) + pprintf(p, "You can't courtesy adjourn an untimed game, just resign.\n"); + return COM_OK; + } + game_update_time(g); + if (((garray[g].white == p) && (garray[g].bTime <= 0) && (garray[g].wTime > 0)) || + ((garray[g].black == p) && (garray[g].wTime <= 0) && (garray[g].bTime > 0))) { + player_decline_offers(p, -1, -1); + game_ended(parray[p].game, (garray[g].white == p) ? WHITE : BLACK, type); + } else { + if (type == END_COURTESY) + pprintf(p, "Game not aborted.\n"); + else if (type == END_COURTESYADJOURN) + pprintf(p, "Game not adjourned.\n"); + pprintf(p, "Either your opponent still has time, or you are out of time also.\n"); + } + return COM_OK; +} + +PUBLIC int com_courtesyabort(int p, param_list param) +{ + ASSERT(param[0].type == TYPE_NULL); + return Courtesy(p, END_COURTESY); +} + +PUBLIC int com_courtesyadjourn(int p, param_list param) +{ + ASSERT(param[0].type == TYPE_NULL); + if (!garray[parray[p].game].rated) { + pprintf(p, "You cannot adjourn an unrated game. Use \"courtesyabort\".\n"); + return COM_OK; + } + return Courtesy(p, END_COURTESYADJOURN); +} +#endif + +PUBLIC int com_courtesyabort(int p, param_list param) +{ + pprintf(p, "Courtesyabort is obsolete; use \"abort\" instead.\n"); + return COM_OK; +} + +PUBLIC int com_courtesyadjourn(int p, param_list param) +{ + pprintf(p, "Use \"adjourn\" to courtesyadjourn a game.\n"); + return COM_OK; +} + +PRIVATE int player_has_mating_material(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); +} + +PUBLIC int com_flag(int p, param_list param) +{ + int g; + int myColor; + + ASSERT(param[0].type == TYPE_NULL); + if ((parray[p].game <0) ||(garray[parray[p].game].status == GAME_EXAMINE)) { + pprintf(p, "You are not playing a game.\n"); + return COM_OK; + } + g = parray[p].game; + myColor = (p == garray[g].white ? WHITE : BLACK); + if (garray[g].wInitTime == 0) { + pprintf(p, "You can't flag an untimed game.\n"); + return COM_OK; + } + if (garray[g].numHalfMoves < 2) { + pprintf(p, "You cannot flag if your opponent has not moved.\nYou can use abort instead.\n"); + return COM_OK; + } + game_update_time(g); + +#ifdef TIMESEAL + + { + int wt, bt; + + if (con[parray[p].socket].timeseal) { /* do caller use timeseal? */ + if (myColor == WHITE) { + wt = garray[g].wRealTime; + } else { + bt = garray[g].bRealTime; + } + } else { + if (myColor == WHITE) { + wt = garray[g].wTime; + } else { + bt = garray[g].bTime; + } + } + + if (con[parray[parray[p].opponent].socket].timeseal) { /* opp uses timeseal? */ + if (myColor == WHITE) { + bt = garray[g].bRealTime; + } else { + wt = garray[g].wRealTime; + } + } else { + if (myColor == WHITE) { + bt = garray[g].bTime; + } else { + wt = garray[g].wTime; + } + } + + /* the clocks to compare is now in wt and bt */ + + if ((wt <= 0) && (bt <= 0)) { + player_decline_offers(p, -1, -1); + game_ended(g, myColor, END_BOTHFLAG); + return COM_OK; + } + if (myColor == WHITE) { + if (bt > 0) { + pprintf(p, "Your opponent is not out of time!\n"); + return COM_OK; + } + } else { + if (wt > 0) { + pprintf(p, "Your opponent is not out of time!\n"); + return COM_OK; + } + } + } + +#else + + if ((garray[g].wTime <= 0) && (garray[g].bTime <= 0)) { + player_decline_offers(p, -1, -1); + game_ended(g, myColor, END_BOTHFLAG); + return COM_OK; + } + if (myColor == WHITE) { + if (garray[g].bTime > 0) { + pprintf(p, "Your opponent is not out of time!\n"); + return COM_OK; + } + } else { + if (garray[g].wTime > 0) { + pprintf(p, "Your opponent is not out of time!\n"); + return COM_OK; + } + } + +#endif + + player_decline_offers(p, -1, -1); + if (player_has_mating_material(&garray[g].game_state, myColor)) + game_ended(g, myColor, END_FLAG); + else + game_ended(g, myColor, END_FLAGNOMATERIAL); + return COM_OK; +} + +PUBLIC int com_adjourn(int p, param_list param) +{ + int p1, g, myColor, yourColor; + + ASSERT(param[0].type == TYPE_NULL); + g = parray[p].game; + if ((g < 0) || (garray[parray[p].game].status == GAME_EXAMINE)) { + pprintf(p, "You are not playing a game.\n"); + return COM_OK; + } + p1 = parray[p].opponent; + if (!(parray[p].registered && parray[p1].registered)) { + pprintf(p, "Both players must be registered to adjorn a game. Use \"abort\".\n"); + return COM_OK; + } + myColor = (p == garray[g].white ? WHITE : BLACK); + yourColor = (myColor == WHITE ? BLACK : WHITE); + + if (player_find_pendfrom(p, p1, PEND_ADJOURN) >= 0) { + player_remove_request(p1, p, PEND_ADJOURN); + player_decline_offers(p, -1, -1); + game_ended(parray[p].game, yourColor, END_ADJOURN); + } else { + game_update_time(g); + if (((myColor == WHITE) && (garray[g].wTime > 0) && (garray[g].bTime <= 0)) + || ((myColor == BLACK) && (garray[g].bTime > 0) && (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."); + player_decline_offers(p, -1, -1); + game_ended(g, myColor, END_COURTESYADJOURN); + } else { + pprintf(p1, "\n"); + pprintf_highlight(p1, "%s", parray[p].name); + pprintf(p1, " would like to adjourn the game; "); + pprintf_prompt(p1, "type \"adjourn\" to accept.\n"); + pprintf(p, "Adjourn request sent.\n"); + player_add_request(p, p1, PEND_ADJOURN, 0); + } + } + return COM_OK; +} + +PRIVATE int gamesortfunc(const void *i, const void *j) +{ + return (GetRating(&parray[garray[*(int *) i].white], garray[*(int *) i].type) + + GetRating(&parray[garray[*(int *) i].black], garray[*(int *) i].type) + + ((garray[*(int *) i].status == GAME_EXAMINE) ? 10000 : 0) - + GetRating(&parray[garray[*(int *) j].white], garray[*(int *) j].type) - + GetRating(&parray[garray[*(int *) j].black], garray[*(int *) j].type) - + ((garray[*(int *) j].status == GAME_EXAMINE) ? 10000 : 0)); +} + + +PUBLIC 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 = rmalloc(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 < g_num; i++) { + if ((garray[i].status != GAME_ACTIVE) && (garray[i].status != GAME_EXAMINE)) + continue; + if ((selected) && (selected != i + 1)) + continue; /* not selected game number */ + wp = garray[i].white; + bp = garray[i].black; + if ((!selected) && s && strncasecmp(s, garray[i].white_name, slen) && + strncasecmp(s, 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 = garray[i].white; + bp = garray[i].black; + board_calc_strength(&garray[i].game_state, &ws, &bs); + if (garray[i].status != GAME_EXAMINE) { + pprintf_noformat(p, "%2d %4s %-11.11s %4s %-10.10s [%c%c%c%3d %3d] ", + i + 1, + ratstrii(GetRating(&parray[wp], + garray[i].type), + parray[wp].registered), + parray[wp].name, + ratstrii(GetRating(&parray[bp], + garray[i].type), + parray[bp].registered), + parray[bp].name, + (garray[i].private) ? 'p' : ' ', + *bstr[garray[i].type], + *rstr[garray[i].rated], + garray[i].wInitTime / 600, + garray[i].wIncrement / 10); + game_update_time(i); + pprintf_noformat(p, "%6s -", + tenth_str((garray[i].wTime > 0 ? garray[i].wTime : 0), 0)); + pprintf_noformat(p, "%6s (%2d-%2d) %c: %2d\n", + tenth_str((garray[i].bTime > 0 ? garray[i].bTime : 0), 0), + ws, bs, + (garray[i].game_state.onMove == WHITE) ? 'W' : 'B', + garray[i].game_state.moveNum); + } else { + pprintf_noformat(p, "%2d (Exam. %4d %-11.11s %4d %-10.10s) [%c%c%c%3d %3d] ", + i + 1, + garray[i].white_rating, + garray[i].white_name, + garray[i].black_rating, + garray[i].black_name, + (garray[i].private) ? 'p' : ' ', + *bstr[garray[i].type], + *rstr[garray[i].rated], + garray[i].wInitTime / 600, + garray[i].wIncrement / 10); + pprintf_noformat(p, "%c: %2d\n", + (garray[i].game_state.onMove == WHITE) ? 'W' : 'B', + 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"); + } + rfree(sortedgames); + } + return COM_OK; +} + +PRIVATE int do_observe(int p, int obgame) +{ + if ((garray[obgame].private) && (parray[p].adminLevel < ADMIN_ADMIN)) { + pprintf(p, "Sorry, game %d is a private game.\n", obgame + 1); + return COM_OK; + } + if ((garray[obgame].white == p) || (garray[obgame].black == p)) { + if (garray[obgame].status != GAME_EXAMINE) { + 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; +} + +PUBLIC void unobserveAll(int p) +{ + int i; + + for (i = 0; i < parray[p].num_observe; i++) { + pprintf(p, "Removing game %d from observation list.\n", parray[p].observe_list[i] + 1); + } + parray[p].num_observe = 0; + return; +} + +PUBLIC 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; +} + +PUBLIC int com_observe(int p, param_list param) +{ + int i; + int p1, obgame; + + if ((parray[p].game >=0) &&(garray[parray[p].game].status == GAME_EXAMINE)) { + pprintf(p, "You are still examining a game.\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 >= g_num) || ((garray[obgame].status != GAME_ACTIVE) && + (garray[obgame].status != GAME_EXAMINE))) { + pprintf(p, "There is no such game.\n"); + return COM_OK; + } + if ((p1 >= 0) && parray[p1].simul_info.numBoards) { + for (i = 0; i < parray[p1].simul_info.numBoards; i++) + if (parray[p1].simul_info.boards[i] >= 0) + do_observe(p, parray[p1].simul_info.boards[i]); + } else { + do_observe(p, obgame); + } + return COM_OK; +} + +PUBLIC int com_allobservers(int p, param_list param) +{ + 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 = g_num; + } else if ((obgame >= g_num) || ((obgame < g_num) + && ((garray[obgame].status != GAME_ACTIVE) + && (garray[obgame].status != GAME_EXAMINE)))) { + 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 ((garray[g].status == GAME_ACTIVE) && + ((parray[p].adminLevel > 0) || (garray[g].private == 0))) { + for (first = 1, p1 = 0; p1 < p_num; p1++) { + if ((parray[p1].status != PLAYER_EMPTY) && (player_is_observe(p1, g))) { + if (first) { + pprintf(p, "Observing %2d [%s vs. %s]:", + g + 1, + parray[garray[g].white].name, + parray[garray[g].black].name); + first = 0; + } + pprintf(p, " %s%s", (parray[p1].game >=0) ? "#" : "", parray[p1].name); + } + } + if (!first) + pprintf(p, "\n"); + } + } + + /* list games being examined last */ + + for (g = start; g < end; g++) { + if ((garray[g].status == GAME_EXAMINE) && + ((parray[p].adminLevel > 0) || (garray[g].private == 0))) { + for (first = 1, p1 = 0; p1 < p_num; p1++) { + if ((parray[p1].status != PLAYER_EMPTY) && (player_is_observe(p1, g) || + (parray[p1].game == g))) { + if (first) { + if (strcmp(garray[g].white_name, garray[g].black_name)) { + pprintf(p, "Examining %2d [%s vs %s]:", g + 1, + garray[g].white_name, garray[g].black_name); + } else { + pprintf(p, "Examining %2d (scratch):", g + 1); + } + first = 0; + } + pprintf(p, " %s%s", (parray[p1].game == g) ? "#" : "", parray[p1].name); + } + } + if (!first) + pprintf(p, "\n"); + } + } + return COM_OK; +} + +PUBLIC int com_unexamine(int p, param_list param) +{ + int g, p1, flag = 0; + + if ((parray[p].game <0) ||(garray[parray[p].game].status != GAME_EXAMINE)) { + pprintf(p, "You are not examining any games.\n"); + return COM_OK; + } + g = parray[p].game; + parray[p].game = -1; + for (p1 = 0; p1 < p_num; p1++) { + if (parray[p1].status != PLAYER_PROMPT) + continue; + if ((parray[p1].game == g) &&(p != p1)) { + /* ok - there are other examiners to take over the game */ + flag = 1; + } + if ((player_is_observe(p1, g)) || (parray[p1].game == g)) { + pprintf(p1, "%s stopped examining game %d.\n", parray[p].name, g + 1); + } + } + if (!flag) { + for (p1 = 0; p1 < p_num; p1++) { + if (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); + return COM_OK; +} + +PUBLIC int com_mexamine(int p, param_list param) +{ + int g, p1, p2; + + if ((parray[p].game <0) ||(garray[parray[p].game].status != GAME_EXAMINE)) { + 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 = parray[p].game; + if (!player_is_observe(p1, g)) { + pprintf(p, "%s must observe the game you are analysing.\n", parray[p1].name); + return COM_OK; + } else { + if (parray[p1].game >=0) { + pprintf(p, "%s is already analysing the game.\n", parray[p1].name); + return COM_OK; + } + /* if we get here - let's make him examiner of the game */ + unobserveAll(p1); /* fix for Xboard */ + player_decline_offers(p1, -1, PEND_MATCH); + player_withdraw_offers(p1, -1, PEND_MATCH); + player_withdraw_offers(p1, -1, PEND_SIMUL); + + 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 < p_num; p2++) { + if (parray[p2].status != PLAYER_PROMPT) + continue; + if (p2 == p1) + continue; + if ((player_is_observe(p2, g)) || (parray[p2].game == g)) { + pprintf_prompt(p2, "%s is now examiner of game %d.\n", parray[p1].name, g + 1); + } + } + } + return COM_OK; +} + +PUBLIC int com_moves(int p, param_list param) +{ + int g; + int p1; + + if (param[0].type == TYPE_NULL) { + if (parray[p].game >=0) { + g = parray[p].game; + } else if (parray[p].num_observe) { + for (g = 0; g < parray[p].num_observe; g++) { + pprintf(p, "%s\n", movesToString(parray[p].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 >= g_num) || ((garray[g].status != GAME_ACTIVE) && + (garray[g].status != GAME_EXAMINE))) { + pprintf(p, "There is no such game.\n"); + return COM_OK; + } + if ((garray[g].white != p) && (garray[g].black != p) && (garray[g].private) && (parray[p].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; +} + +PUBLIC int com_mailmoves(int p, param_list param) +{ + int g; + int p1; + char subj[81]; + + if (!parray[p].registered) { + pprintf(p, "Only registered people can use the mailhelp command.\n"); + return COM_OK; + } + + if (param[0].type == TYPE_NULL) { + if (parray[p].game >=0) { + g = parray[p].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 >= g_num) || ((garray[g].status != GAME_ACTIVE) && (garray[g].status != GAME_EXAMINE))) { + pprintf(p, "There is no such game.\n"); + return COM_OK; + } + if ((garray[g].white != p) && (garray[g].black != p) && (garray[g].private) && (parray[p].adminLevel < ADMIN_ADMIN)) { + pprintf(p, "Sorry, that is a private game.\n"); + return COM_OK; + } + sprintf(subj, "FICS game report %s vs %s", garray[g].white_name, garray[g].black_name); + if (mail_string_to_user(p, subj, movesToString(g, parray[p].pgn))) { + pprintf(p, "Moves NOT mailed, perhaps your address is incorrect.\n"); + } else { + pprintf(p, "Moves mailed.\n"); + } + return COM_OK; +} + +PUBLIC int com_oldmoves(int p, param_list param) +{ + int g; + int p1 = p; + + if (param[0].type == TYPE_NULL) { + p1 = p; + } else 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; + } + } + g = FindOldGameFor(p1); + if (g < 0) { + pprintf(p, "There is no old game for %s.\n", parray[p1].name); + return COM_OK; + } + if ((garray[g].white != p) && (garray[g].black != p) && (garray[g].private) && (parray[p].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; +} + +PUBLIC int com_mailoldmoves(int p, param_list param) +{ + int g; + int p1 = p; + char subj[81]; + + if (!parray[p].registered) { + pprintf(p, "Only registered people can use the mailhelp command.\n"); + return COM_OK; + } + + if (param[0].type == TYPE_NULL) { + p1 = p; + } else 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; + } + } + g = FindOldGameFor(p1); + if (g < 0) { + pprintf(p, "There is no old game for %s.\n", parray[p1].name); + return COM_OK; + } + if ((garray[g].white != p) && (garray[g].black != p) && (garray[g].private) && (parray[p].adminLevel < ADMIN_ADMIN)) { + pprintf(p, "Sorry, that is a private game.\n"); + return COM_OK; + } + sprintf(subj, "FICS game report %s vs %s", garray[g].white_name, garray[g].black_name); + if (mail_string_to_user(p, subj, movesToString(g, parray[p].pgn))) { + pprintf(p, "Moves NOT mailed, perhaps your address is incorrect.\n"); + } else { + pprintf(p, "Moves mailed.\n"); + } + return COM_OK; +} + +PUBLIC int com_load(int p, param_list param) +{ + pprintf(p, "Obsolete command, please use match .\n"); + return COM_OK; +} + +void ExamineScratch(int p) +{ + char category, board; + int g = game_new(); + + unobserveAll(p); + + player_decline_offers(p, -1, PEND_MATCH); + player_withdraw_offers(p, -1, PEND_MATCH); + player_withdraw_offers(p, -1, PEND_SIMUL); + + garray[g].wInitTime = garray[g].wIncrement = 0; + garray[g].bInitTime = garray[g].bIncrement = 0; + garray[g].timeOfStart = tenth_secs(); + garray[g].wTime = garray[g].bTime = 0; + garray[g].rated = 0; + garray[g].clockStopped = 0; + garray[g].type = TYPE_UNTIMED; + garray[g].white = garray[g].black = p; + garray[g].status = GAME_EXAMINE; + garray[g].startTime = tenth_secs(); + garray[g].lastMoveTime = garray[g].startTime; + garray[g].lastDecTime = garray[g].startTime; + garray[g].totalHalfMoves = 0; + + parray[p].side = WHITE; /* oh well... */ + parray[p].game = g; + + category = board = '\0'; + if (board_init(&garray[g].game_state, &category, &board)) { + pprintf(p, "PROBLEM LOADING BOARD. Game Aborted.\n"); + fprintf(stderr, "FICS: PROBLEM LOADING BOARD. Game Aborted.\n"); + } + garray[g].game_state.gameNum = g; + strcpy(garray[g].white_name, parray[p].name); + strcpy(garray[g].black_name, parray[p].name); + + send_boards(g); + + strcpy(garray[g].boardList[garray[g].numHalfMoves], boardToFEN(g)); +} + +PRIVATE int ExamineStored(FILE * fp, int p, char *filename) +{ + int g; + char category[100], board[100]; + game *gg; + + unobserveAll(p); + + player_decline_offers(p, -1, PEND_MATCH); + player_withdraw_offers(p, -1, PEND_MATCH); + player_withdraw_offers(p, -1, PEND_SIMUL); + + g = game_new(); + gg = &garray[g]; + category[0] = '\0'; + board[0] = '\0'; + if (board_init(&gg->game_state, category, board)) { + pprintf(p, "PROBLEM LOADING BOARD. Game Aborted.\n"); + fprintf(stderr, "FICS: PROBLEM LOADING BOARD %s %s. Game Aborted.\n", + category, board); + return -1; + } + gg->status = GAME_EXAMINE; + if (ReadGameAttrs(fp, filename, g) < 0) { + pprintf(p, "Gamefile is corrupt; please notify an admin.\n"); + 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; + + parray[p].side = WHITE; /* oh well... */ + parray[p].game = g; + + send_boards(g); + + strcpy(gg->boardList[gg->numHalfMoves], boardToFEN(g)); + return g; +} + +void ExamineAdjourned(int p, int p1, int p2) +{ + FILE *fp; + char filename[1024]; + char *p1Login, *p2Login; + int g; + + p1Login = parray[p1].login; + p2Login = parray[p2].login; + + sprintf(filename, "%s/%c/%s-%s", adj_dir, *p1Login, p1Login, p2Login); + fp = fopen(filename, "r"); + if (!fp) { + sprintf(filename, "%s/%c/%s-%s", adj_dir, *p2Login, p1Login, p2Login); + fp = fopen(filename, "r"); + if (!fp) { + sprintf(filename, "%s/%c/%s-%s", adj_dir, *p2Login, p2Login, p1Login); + fp = fopen(filename, "r"); + if (!fp) { + sprintf(filename, "%s/%c/%s-%s", adj_dir, *p1Login, p2Login, p1Login); + fp = fopen(filename, "r"); + if (!fp) { + pprintf(p, "No stored game between \"%s\" and \"%s\".\n", + parray[p1].name, parray[p2].name); + return; + } + } + } + } + g = ExamineStored(fp, p, filename); + fclose(fp); + + if (g >= 0) { + if (garray[g].white_name[0] == '\0') + strcpy(garray[g].white_name, p1Login); + if (garray[g].black_name[0] == '\0') + strcpy(garray[g].black_name, p2Login); + } + return; +} + +char *FindHistory(int p, int p1, int game) +{ + FILE *fpHist; + static char fileName[MAX_FILENAME_SIZE]; + int index; + long when; + + sprintf(fileName, "%s/player_data/%c/%s.%s", stats_dir, + parray[p1].login[0], parray[p1].login, STATS_GAMES); + fpHist = fopen(fileName, "r"); + if (fpHist == NULL) { + pprintf(p, "No games in history for %s.\n", parray[p1].name); + return(NULL); + } + do { + fscanf(fpHist, "%d %*c %*d %*c %*d %*s %*s %*d %*d %*d %*d %*s %*s %ld", + &index, &when); + } while (!feof(fpHist) && index != game); + + if (feof(fpHist)) { + pprintf(p, "There is no history game %d for %s.\n", game, parray[p1].name); + fclose(fpHist); + return(NULL); + } + fclose(fpHist); + + sprintf(fileName, "%s/%ld/%ld", hist_dir, when % 100, when); + return(fileName); +} + +void ExamineHistory(int p, int p1, int game) +{ + char *fileName; + + fileName = FindHistory(p, p1, game); + if (fileName != NULL) { + FILE *fpGame = fopen(fileName, "r"); + if (fpGame == NULL) { + pprintf(p, "History game %d not available for %s.\n", game, parray[p1].name); + } else { + ExamineStored(fpGame, p, fileName); + } + } + return; +} + +PUBLIC int com_examine(int p, param_list param) +{ + int p1, p2 = p, p1conn, p2conn = 1; + + if ((parray[p].game >=0) &&(garray[parray[p].game].status == GAME_EXAMINE)) { + pprintf(p, "You are already examining a game.\n"); + } else if (parray[p].game >=0) { + pprintf(p, "You are playing a game.\n"); + } else if (param[0].type == TYPE_NULL) { + ExamineScratch(p); + } else if (param[0].type == TYPE_WORD) { + if (!FindPlayer(p, ¶m[0], &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 + && !FindPlayer(p, ¶m[1], &p2, &p2conn)) + return COM_OK; + + ExamineAdjourned(p, p1, p2); + if (!p2conn) + player_remove(p2); + } + if (!p1conn) + player_remove(p1); + } + return COM_OK; +} + +PUBLIC int com_stored(int p, param_list param) +{ + DIR *dirp; +#ifdef USE_DIRENT + struct dirent *dp; +#else + struct direct *dp; +#endif + int p1, connected; + char dname[MAX_FILENAME_SIZE]; +#if 0 /* replacing all the code below with a + FindPlayer call; This stuff was buggy + anyway. */ + if (param[0].type == TYPE_WORD) { + if ((p1 = player_find_part_login(param[0].val.word)) < 0) { /* not logged in */ + connected = 0; + p1 = player_new(); + if (player_read(p1, param[0].val.word)) { + player_remove(p1); + pprintf(p, "There is no player by that name.\n"); + return COM_OK; + } + } else { + connected = 1; + } + } else { + p1 = p; + connected = 1; + } +#endif + if (!FindPlayer(p, ¶m[0], &p1, &connected)) + return COM_OK; + + sprintf(dname, "%s/%c", adj_dir, parray[p1].login[0]); + dirp = opendir(dname); + if (!dirp) { + pprintf(p, "Player %s has no games stored.\n", parray[p1].name); + if (!connected) + player_remove(p1); + return COM_OK; + } + pprintf(p, "Stored games for %s:\n", parray[p1].name); + for (dp = readdir(dirp); dp != NULL; dp = readdir(dirp)) { + if (file_has_pname(dp->d_name, parray[p1].login)) { + pprintf(p, " %s vs. %s\n", file_wplayer(dp->d_name), file_bplayer(dp->d_name)); + } + } + + closedir(dirp); + pprintf(p, "\n"); + if (!connected) + player_remove(p1); + return COM_OK; +} + +PUBLIC int com_mailstored(int p, param_list param) +{ + int wp, wconnected, bp, bconnected, gotit = 0; + int g = -1; + + if (!FindPlayer(p, ¶m[0], &wp, &wconnected)) + return (COM_OK); + + if (param[1].type == TYPE_INT) { /* look for a game from history */ + char *fileName = FindHistory(p, wp, param[1].val.integer); + if (fileName != NULL) { + FILE *fpGame = fopen(fileName, "r"); + if (fpGame == NULL) { + pprintf(p, "History game %d not available for %s.\n", param[1].val.integer, parray[wp].name); + } else { + g = game_new(); + if (ReadGameAttrs(fpGame, fileName, g) < 0) + pprintf(p, "Gamefile is corrupt; please notify an admin.\n"); + else + gotit = 1; + } + fclose(fpGame); + } + } else { /* look for a stored game between the players */ + if (FindPlayer(p, ¶m[1], &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", parray[wp].name, parray[bp].name); + } + if (!bconnected) + player_remove(bp); + } + } + + if (gotit) { + if (strcasecmp(parray[p].name, garray[g].white_name) && strcasecmp(parray[p] +.name, garray[g].black_name) && garray[g].private && (parray[p].adminLevel < ADMIN_ADMIN)) { + pprintf(p, "Sorry, that is a private game.\n"); + } else { + char subj[81]; + if (param[1].type == TYPE_INT) + sprintf(subj, "FICS history game: %s %d", parray[wp].name, param[1].val.integer); + else + sprintf(subj, "FICS adjourned game %s vs %s", garray[g].white_name, garray[g].black_name); + if (mail_string_to_user(p, subj, movesToString(g, parray[p].pgn))) + pprintf(p, "Moves NOT mailed, perhaps your address is incorrect.\n"); + else + pprintf(p, "Moves mailed.\n"); + } + } + if (!wconnected) + player_remove(wp); + if (g != -1) + game_remove(g); + return(COM_OK); +} + +/* it would be good to write a FindStored and nuke all the game_read(foo,bar) + game_read(bar,foo) etc. this stuff is a mess... */ + +PUBLIC int com_smoves(int p, param_list param) +{ + int wp, wconnected, bp, bconnected, gotit = 0; + int g = -1; + + if (!FindPlayer(p, ¶m[0], &wp, &wconnected)) + return(COM_OK); + + if (param[1].type == TYPE_INT) { +/* look for a game from history */ + char *fileName = FindHistory(p, wp, param[1].val.integer); + if (fileName != NULL) { + FILE *fpGame = fopen(fileName, "r"); + if (fpGame == NULL) { + pprintf(p, "History game %d not available for %s.\n", param[1].val.integer, parray[wp].name); + } else { + g = game_new(); + if (ReadGameAttrs(fpGame, fileName, g) < 0) { + pprintf(p, "Gamefile is corrupt; please notify an admin.\n"); + } else { + gotit = 1; + } + } + fclose(fpGame); + } + } else { +/* look for a stored game between the players */ + if (FindPlayer(p, ¶m[1], &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", parray[wp].name, parray[bp].name); + } + if (!bconnected) + player_remove(bp); + } + } + + if (gotit) { + if (strcasecmp(parray[p].name, garray[g].white_name) && strcasecmp(parray[p].name, garray[g].black_name) && garray[g].private && (parray[p].adminLevel < ADMIN_ADMIN)) { + pprintf(p, "Sorry, that is a private game.\n"); + } else { + pprintf(p, "%s\n", movesToString(g, 0)); + } + } + if (!wconnected) + player_remove(wp); + if (g != -1) + game_remove(g); + return(COM_OK); +} + +PUBLIC int com_sposition(int p, param_list param) +{ + int wp, wconnected, bp, bconnected, confused = 0; + int g; + + if (!FindPlayer(p, ¶m[0], &wp, &wconnected)) + return (COM_OK); + if (!FindPlayer(p, ¶m[1], &bp, &bconnected)) + 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", parray[wp].name, 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) && (garray[g].private) && (parray[p].adminLevel < ADMIN_ADMIN)) { + pprintf(p, "Sorry, that is a private game.\n"); + } else { + garray[g].white = wp; + garray[g].black = bp; + garray[g].startTime = tenth_secs(); + garray[g].lastMoveTime = garray[g].startTime; + garray[g].lastDecTime = garray[g].startTime; + pprintf(p, "Position of stored game %s vs. %s\n", parray[wp].name, parray[bp].name); + send_board_to(g, p); + } + } + game_remove(g); + if (!wconnected) + player_remove(wp); + if (!bconnected) + player_remove(bp); + return COM_OK; +} + +PUBLIC int com_forward(int p, param_list param) +{ + int nHalfMoves = 1; + int g, i; + int p1; + unsigned now; + + if (!((parray[p].game >=0) &&(garray[parray[p].game].status == GAME_EXAMINE))) { + pprintf(p, "You are not examining any games.\n"); + return COM_OK; + } + g = parray[p].game; + if (!strcmp(garray[g].white_name, 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 (garray[g].numHalfMoves > garray[g].revertHalfMove) { + pprintf(p, "No more moves.\n"); + return COM_OK; + } + if (garray[g].numHalfMoves < garray[g].totalHalfMoves) { + for (p1 = 0; p1 < p_num; p1++) { + if (parray[p1].status != PLAYER_PROMPT) + continue; + if (player_is_observe(p1, g) || parray[p1].game == g) { + pprintf(p1, "%s goes forward %d move%s.\n", + parray[p].name, nHalfMoves, (nHalfMoves == 1) ? "" : "s"); + } + } + } + for (i = 0; i < nHalfMoves; i++) { + if (garray[g].numHalfMoves < garray[g].totalHalfMoves) { + execute_move(&garray[g].game_state, &garray[g].moveList[garray[g].numHalfMoves], 1); + if (garray[g].numHalfMoves + 1 > garray[g].examMoveListSize) { + garray[g].examMoveListSize += 20; /* Allocate 20 moves at a + time */ + if (!garray[g].examMoveList) { + garray[g].examMoveList = (move_t *) rmalloc(sizeof(move_t) * garray[g].examMoveListSize); + } else { + garray[g].examMoveList = (move_t *) rrealloc(garray[g].examMoveList, sizeof(move_t) * garray[g].examMoveListSize); + } + } + garray[g].examMoveList[garray[g].numHalfMoves] = garray[g].moveList[garray[g].numHalfMoves]; + garray[g].revertHalfMove++; + garray[g].numHalfMoves++; + } else { + for (p1 = 0; p1 < p_num; p1++) { + if (parray[p1].status != PLAYER_PROMPT) + continue; + if (player_is_observe(p1, g) || parray[p1].game == g) { + pprintf(p1, "End of game.\n"); + } + } + break; + } + } + /* roll back time */ + if (garray[g].game_state.onMove == WHITE) { + garray[g].wTime += (garray[g].lastDecTime - garray[g].lastMoveTime); + } else { + garray[g].bTime += (garray[g].lastDecTime - garray[g].lastMoveTime); + } + now = tenth_secs(); + if (garray[g].numHalfMoves == 0) + garray[g].timeOfStart = now; + garray[g].lastMoveTime = now; + garray[g].lastDecTime = now; + send_boards(g); + return COM_OK; +} + +PUBLIC int com_backward(int p, param_list param) +{ + int nHalfMoves = 1; + int g, i; + int p1; + unsigned now; + + if (!((parray[p].game >=0) &&(garray[parray[p].game].status == GAME_EXAMINE))) { + pprintf(p, "You are not examining any games.\n"); + return COM_OK; + } + g = parray[p].game; + if (param[0].type == TYPE_INT) { + nHalfMoves = param[0].val.integer; + } + if (garray[g].numHalfMoves != 0) { + for (p1 = 0; p1 < p_num; p1++) { + if (parray[p1].status != PLAYER_PROMPT) + continue; + if (player_is_observe(p1, g) || parray[p1].game == g) { + pprintf(p1, "%s backs up %d move%s.\n", + parray[p].name, nHalfMoves, (nHalfMoves == 1) ? "" : "s"); + } + } + } + for (i = 0; i < nHalfMoves; i++) { + if (backup_move(g, REL_EXAMINE) != MOVE_OK) { + for (p1 = 0; p1 < p_num; p1++) { + if (parray[p1].status != PLAYER_PROMPT) + continue; + if (player_is_observe(p1, g) || parray[p1].game == g) { + pprintf(p1, "Beginning of game.\n"); + } + } + + break; + } + } + if (garray[g].numHalfMoves < garray[g].revertHalfMove) { + garray[g].revertHalfMove = garray[g].numHalfMoves; + } + /* roll back time */ + if (garray[g].game_state.onMove == WHITE) { + garray[g].wTime += (garray[g].lastDecTime - garray[g].lastMoveTime); + } else { + garray[g].bTime += (garray[g].lastDecTime - garray[g].lastMoveTime); + } + now = tenth_secs(); + if (garray[g].numHalfMoves == 0) + garray[g].timeOfStart = now; + garray[g].lastMoveTime = now; + garray[g].lastDecTime = now; + send_boards(g); + return COM_OK; +} + +PUBLIC int com_revert(int p, param_list param) +{ + int nHalfMoves = 1; + int g, i; + int p1; + unsigned now; + + if (!((parray[p].game >=0) &&(garray[parray[p].game].status == GAME_EXAMINE))) { + pprintf(p, "You are not examining any games.\n"); + return COM_OK; + } + g = parray[p].game; + nHalfMoves = garray[g].numHalfMoves - garray[g].revertHalfMove; + if (nHalfMoves == 0) { + pprintf(p, "Already at mainline.\n"); + return COM_OK; + } + if (nHalfMoves < 0) { /* eek - should NEVER happen! */ + fprintf(stderr, "OUCH! in com_revert: nHalfMoves < 0\n"); + return COM_OK; + } + for (p1 = 0; p1 < p_num; p1++) { + if (parray[p1].status != PLAYER_PROMPT) + continue; + if (player_is_observe(p1, g) || parray[p1].game == g) { + pprintf(p1, "%s reverts to mainline.\n", parray[p].name); + } + } + for (i = 0; i < nHalfMoves; i++) { + backup_move(g, REL_EXAMINE);/* should never return error */ + } + /* roll back time */ + if (garray[g].game_state.onMove == WHITE) { + garray[g].wTime += (garray[g].lastDecTime - garray[g].lastMoveTime); + } else { + garray[g].bTime += (garray[g].lastDecTime - garray[g].lastMoveTime); + } + now = tenth_secs(); + if (garray[g].numHalfMoves == 0) + garray[g].timeOfStart = now; + garray[g].lastMoveTime = now; + garray[g].lastDecTime = now; + send_boards(g); + return COM_OK; +} + +PUBLIC int com_takeback(int p, param_list param) +{ + int nHalfMoves = 1; + int from; + int g, i; + int p1; + + if ((parray[p].game <0) ||(garray[parray[p].game].status == GAME_EXAMINE)) { + pprintf(p, "You are not playing a game.\n"); + return COM_OK; + } + p1 = parray[p].opponent; + if (parray[p1].simul_info.numBoards && + parray[p1].simul_info.boards[parray[p1].simul_info.onBoard] != + parray[p].game) { + pprintf(p, "You can only make requests when the simul player is at your board.\n"); + return COM_OK; + } + g = parray[p].game; + if (param[0].type == TYPE_INT) { + nHalfMoves = param[0].val.integer; + } + if ((from = player_find_pendfrom(p, parray[p].opponent, PEND_TAKEBACK)) >= 0) { + player_remove_request(parray[p].opponent, p, PEND_TAKEBACK); + if (parray[p].p_from_list[from].param1 == nHalfMoves) { + /* Doing the takeback */ + player_decline_offers(p, -1, -PEND_SIMUL); + for (i = 0; i < nHalfMoves; i++) { + if (backup_move(g, REL_GAME) != MOVE_OK) { + pprintf(garray[g].white, "Can only backup %d moves\n", i); + pprintf(garray[g].black, "Can only backup %d moves\n", i); + break; + } + } + +#ifdef TIMESEAL + + garray[g].wTimeWhenReceivedMove = 0; + garray[g].bTimeWhenReceivedMove = 0; + +#endif + + send_boards(g); + } else { + if (garray[g].numHalfMoves < nHalfMoves) { + pprintf(p, "There are only %d half moves in your game.\n", garray[g].numHalfMoves); + pprintf_prompt(parray[p].opponent, "\n%s has declined the takeback request.\n", parray[p].name, nHalfMoves); + 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(parray[p].opponent, "\n%s proposes a different number (%d) of half-move(s).\n", parray[p].name, nHalfMoves); + player_add_request(p, parray[p].opponent, PEND_TAKEBACK, nHalfMoves); + } + } else { + if (garray[g].numHalfMoves < nHalfMoves) { + pprintf(p, "There are only %d half moves in your game.\n", garray[g].numHalfMoves); + return COM_OK; + } + pprintf(parray[p].opponent, "\n"); + pprintf_highlight(parray[p].opponent, "%s", parray[p].name); + pprintf_prompt(parray[p].opponent, " would like to take back %d half move(s).\n", + nHalfMoves); + pprintf(p, "Takeback request sent.\n"); + player_add_request(p, parray[p].opponent, PEND_TAKEBACK, nHalfMoves); + } + return COM_OK; +} + + +PUBLIC int com_switch(int p, param_list param) +{ + int g = parray[p].game; + int tmp, now; + int p1; + char *strTmp; + + if ((g < 0) || (garray[g].status == GAME_EXAMINE)) { + pprintf(p, "You are not playing a game.\n"); + return COM_OK; + } + p1 = parray[p].opponent; + if (parray[p1].simul_info.numBoards && + parray[p1].simul_info.boards[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 (player_find_pendfrom(p, parray[p].opponent, PEND_SWITCH) >= 0) { + player_remove_request(parray[p].opponent, p, PEND_SWITCH); + /* Doing the switch */ + player_decline_offers(p, -1, -PEND_SIMUL); + + tmp = garray[g].white; + garray[g].white = garray[g].black; + garray[g].black = tmp; + parray[p].side = (parray[p].side == WHITE) ? BLACK : WHITE; + strTmp = strdup(garray[g].white_name); + strcpy(garray[g].white_name, garray[g].black_name); + strcpy(garray[g].black_name, strTmp); + strfree(strTmp); + + parray[parray[p].opponent].side = + (parray[parray[p].opponent].side == WHITE) ? BLACK : WHITE; + /* Roll back the time */ + if (garray[g].game_state.onMove == WHITE) { + garray[g].wTime += (garray[g].lastDecTime - garray[g].lastMoveTime); + } else { + garray[g].bTime += (garray[g].lastDecTime - garray[g].lastMoveTime); + } + now = tenth_secs(); + if (garray[g].numHalfMoves == 0) + garray[g].timeOfStart = now; + garray[g].lastMoveTime = now; + garray[g].lastDecTime = now; + send_boards(g); + return COM_OK; + } + if (garray[g].rated && garray[g].numHalfMoves > 0) { + pprintf(p, "You cannot switch sides once a rated game is underway.\n"); + return COM_OK; + } + pprintf(parray[p].opponent, "\n"); + pprintf_highlight(parray[p].opponent, "%s", parray[p].name); + pprintf_prompt(parray[p].opponent, " would like to switch sides.\nType \"accept\" to switch sides, or \"decline\" to refuse.\n"); + pprintf(p, "Switch request sent.\n"); + player_add_request(p, parray[p].opponent, PEND_SWITCH, 0); + return COM_OK; +} + + +PUBLIC int com_history(int p, param_list param) +{ + int p1, connected; + char fname[MAX_FILENAME_SIZE]; + + if (!FindPlayer(p, ¶m[0], &p1, &connected)) + return COM_OK; + + sprintf(fname, "%s/player_data/%c/%s.%s", stats_dir, parray[p1].login[0], + parray[p1].login, STATS_GAMES); + pgames(p, p1, fname); + if (!connected) + player_remove(p1); + return COM_OK; +} + +PUBLIC int com_time(int p, param_list param) +{ + int p1, g; + + if (param[0].type == TYPE_NULL) { + g = parray[p].game; + if ((g < 0) || (garray[g].status == GAME_EXAMINE)) { + pprintf(p, "You are not playing a game.\n"); + return COM_OK; + } + } else { + g = GameNumFromParam(p, &p1, ¶m[0]); + if (g < 0) + return COM_OK; + } + if ((g < 0) || (g >= g_num) || (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", + parray[garray[g].white].name, + garray[g].wTime / 600, + (garray[g].wTime - ((garray[g].wTime / 600) * 600)) / 10); + pprintf(p, "Black (%s) : %d mins, %d secs\n", + parray[garray[g].black].name, + garray[g].bTime / 600, + (garray[g].bTime - ((garray[g].bTime / 600) * 600)) / 10); + return COM_OK; +} + +PUBLIC int com_boards(int p, param_list param) +{ + char *category = NULL; + char dname[MAX_FILENAME_SIZE]; + DIR *dirp; +#ifdef USE_DIRENT + struct dirent *dp; +#else + struct direct *dp; +#endif + + 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; + } + 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; +} + +PUBLIC int com_simmatch(int p, param_list param) +{ + int p1, g, adjourned; + int num; + char tmp[100]; + + if ((parray[p].game >=0) &&(garray[parray[p].game].status == GAME_EXAMINE)) { + pprintf(p, "You are still examining a game.\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 (player_find_pendfrom(p, p1, PEND_SIMUL) >= 0) { + player_remove_request(p, p1, PEND_MATCH); + player_remove_request(p1, p, PEND_MATCH); + player_remove_request(p, p1, PEND_SIMUL); + player_remove_request(p1, p, PEND_SIMUL); + player_withdraw_offers(p, -1, PEND_SIMUL); + player_decline_offers(p1, -1, PEND_SIMUL); + player_withdraw_offers(p1, -1, PEND_SIMUL); + player_decline_offers(p, -1, PEND_MATCH); + player_withdraw_offers(p, -1, PEND_MATCH); + player_decline_offers(p1, -1, PEND_MATCH); + player_withdraw_offers(p1, -1, PEND_MATCH); + + + + /* Accepting Simul ! */ + + + if (parray[p].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"); + 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; + if (!adjourned) { /* no adjourned game, so begin a new game */ + game_remove(g); + + if (create_new_match(p, p1, 0, 0, 0, 0, 0, "standard", "standard", 1)) { + pprintf(p, "There was a problem creating the new match.\n"); + pprintf_prompt(p1, "There was a problem creating the new match.\n"); + return COM_OK; + } + } else { /* resume adjourned game */ + game_delete(p, p1); + + sprintf(tmp, "{Game %d (%s vs. %s) Continuing %s %s simul.}\n", g + 1, parray[p].name, parray[p1].name, rstr[garray[g].rated], bstr[garray[g].type]); + pprintf(p, tmp); + pprintf(p1, tmp); + + garray[g].white = p; + garray[g].black = p1; + garray[g].status = GAME_ACTIVE; + garray[g].startTime = tenth_secs(); + garray[g].lastMoveTime = garray[g].startTime; + garray[g].lastDecTime = garray[g].startTime; + parray[p].game = g; + parray[p].opponent = p1; + parray[p].side = WHITE; + parray[p1].game = g; + parray[p1].opponent = p; + parray[p1].side = BLACK; + send_boards(g); + } + + num = parray[p].simul_info.numBoards; + parray[p].simul_info.results[num] = -1; + parray[p].simul_info.boards[num] = parray[p].game; + parray[p].simul_info.numBoards++; + if (parray[p].simul_info.numBoards > 1 && + parray[p].simul_info.onBoard >= 0) + player_goto_board(p, parray[p].simul_info.onBoard); + else + parray[p].simul_info.onBoard = 0; + return COM_OK; + } + if (player_find_pendfrom(p, -1, PEND_SIMUL) >= 0) { + 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 (parray[p].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 (parray[p].game >=0) { + pprintf(p, "You are already playing a game.\n"); + return COM_OK; + } + if (!parray[p1].sopen) { + pprintf_highlight(p, "%s", parray[p1].name); + pprintf(p, " is not open to receiving simul requests.\n"); + return COM_OK; + } + if (parray[p1].simul_info.numBoards >= MAX_SIMUL) { + pprintf_highlight(p, "%s", 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 ((parray[p1].game >=0) &&(parray[p1].simul_info.numBoards == 0)) { + pprintf_highlight(p, "%s", parray[p1].name); + if (parray[garray[parray[p1].game].white].simul_info.numBoards) { + pprintf(p, " is playing in "); + pprintf_highlight(p, "%s", parray[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; + } +/* loon: this was (p, p1, PEND_SIMUL) but player_add_request needs 4 args... +if 0 is the incorrect 4th arg, please fix :) */ + + 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 (!(garray[g].type == TYPE_UNTIMED)) + adjourned = 0; + } + game_remove(g); + + if (player_add_request(p, p1, PEND_SIMUL, 0)) { + pprintf(p, "Maximum number of pending actions reached. Your request was not sent.\nTry again later.\n"); + return COM_OK; + } else { + pprintf(p1, "\n"); + pprintf_highlight(p1, "%s", parray[p].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 { + pprintf_prompt(p1, " requests to join a simul match with you.\n"); + pprintf(p, "Simul match request sent.\n"); + } + } + return COM_OK; +} + +PUBLIC int com_goboard(int p, param_list param) +{ + int on, g, p1; + + if (!parray[p].simul_info.numBoards) { + pprintf(p, "You are not giving a simul.\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 goboard yourself!\n"); + return COM_OK; + } + on = parray[p].simul_info.onBoard; + g = parray[p].simul_info.boards[on]; + if (p1 == garray[g].black) { + pprintf(p, "You are already at that board!\n"); + return COM_OK; + } + if (parray[p].simul_info.numBoards > 1) { + player_decline_offers(p, -1, -PEND_SIMUL); + if (player_goto_simulgame_bynum(p, parray[p1].game) !=-1) { + if (g >= 0) { + pprintf(garray[g].black, "\n"); + pprintf_highlight(garray[g].black, "%s", parray[p].name); + pprintf_prompt(garray[g].black, " has moved away from your board.\n"); + } + } + } else + pprintf(p, "You are only playing one board!\n"); + return COM_OK; +} + +PUBLIC int com_gonum(int p, param_list param) +{ + int on, g, gamenum; + + if (!parray[p].simul_info.numBoards) { + pprintf(p, "You are not giving a simul.\n"); + return COM_OK; + } + on = parray[p].simul_info.onBoard; + g = parray[p].simul_info.boards[on]; + gamenum = param[0].val.integer - 1; + if (gamenum < 0) + gamenum = 0; + if (on == gamenum) { + pprintf(p, "You are already at that board!\n"); + return COM_OK; + } + if (parray[p].simul_info.numBoards > 1) { + player_decline_offers(p, -1, -PEND_SIMUL); + if (player_goto_simulgame_bynum(p, gamenum) != -1) { + if (g >= 0) { + pprintf(garray[g].black, "\n"); + pprintf_highlight(garray[g].black, "%s", parray[p].name); + pprintf_prompt(garray[g].black, " has moved away from your board.\n"); + } + } + } else + pprintf(p, "You are only playing one board!\n"); + return COM_OK; +} + +PUBLIC int com_simnext(int p, param_list param) +{ + int on, g; + + if (!parray[p].simul_info.numBoards) { + pprintf(p, "You are not giving a simul.\n"); + return COM_OK; + } + if (parray[p].simul_info.numBoards > 1) { + player_decline_offers(p, -1, -PEND_SIMUL); + on = parray[p].simul_info.onBoard; + g = parray[p].simul_info.boards[on]; + if (g >= 0) { + pprintf(garray[g].black, "\n"); + pprintf_highlight(garray[g].black, "%s", parray[p].name); + pprintf_prompt(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; +} + + +PUBLIC int com_simprev(int p, param_list param) +{ + int on, g; + + if (!parray[p].simul_info.numBoards) { + pprintf(p, "You are not giving a simul.\n"); + return COM_OK; + } + if (parray[p].simul_info.numBoards > 1) { + player_decline_offers(p, -1, -PEND_SIMUL); + on = parray[p].simul_info.onBoard; + g = parray[p].simul_info.boards[on]; + if (g >= 0) { + pprintf(garray[g].black, "\n"); + pprintf_highlight(garray[g].black, "%s", parray[p].name); + pprintf_prompt(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; +} + +PUBLIC 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", parray[p1].name, + player_num_active_boards(p1)); + return COM_OK; +} + +PUBLIC int com_simpass(int p, param_list param) +{ + int g, p1, on; + + if (parray[p].game <0) { + pprintf(p, "You are not playing a game.\n"); + return COM_OK; + } + g = parray[p].game; + p1 = garray[g].white; + if (!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 = parray[p1].simul_info.onBoard; + if (on != g) { + pprintf(p, "You cannot pass until the simul holder arrives!\n"); + return COM_OK; + } + if (garray[g].passes >= MAX_SIMPASS) { + if (parray[p].bell) + pprintf(p, "\a"); + pprintf(p, "You have reached your maximum of %d passes.\n", MAX_SIMPASS); + pprintf(p, "Please move IMMEDIATELY!\n"); + pprintf_highlight(p1, "%s", parray[p].name); + pprintf_prompt(p1, " tried to pass, but is out of passes.\n"); + return COM_OK; + } + player_decline_offers(p, -1, -PEND_SIMUL); + + garray[g].passes++; + pprintf(p, "You have passed and have %d passes left.\n", + (MAX_SIMPASS - garray[g].passes)); + pprintf_highlight(p1, "%s", parray[p].name); + pprintf_prompt(p1, " has decided to pass and has %d passes left.\n", + (MAX_SIMPASS - garray[g].passes)); + player_goto_next_board(p1); + return COM_OK; +} + +PUBLIC int com_simabort(int p, param_list param) +{ + if (!parray[p].simul_info.numBoards) { + pprintf(p, "You are not giving a simul.\n"); + return COM_OK; + } + player_decline_offers(p, -1, -PEND_SIMUL); + game_ended(parray[p].simul_info.boards[parray[p].simul_info.onBoard], + WHITE, END_ABORT); + return COM_OK; +} + +PUBLIC int com_simallabort(int p, param_list param) +{ + int i; + + if (!parray[p].simul_info.numBoards) { + pprintf(p, "You are not giving a simul.\n"); + return COM_OK; + } + player_decline_offers(p, -1, -PEND_SIMUL); + for (i = 0; i < parray[p].simul_info.numBoards; i++) { + if (parray[p].simul_info.boards[i] >= 0) { + game_ended(parray[p].simul_info.boards[i], + WHITE, END_ABORT); + } + } + return COM_OK; +} + +PUBLIC int com_simadjourn(int p, param_list param) +{ + if (!parray[p].simul_info.numBoards) { + pprintf(p, "You are not giving a simul.\n"); + return COM_OK; + } + player_decline_offers(p, -1, -PEND_SIMUL); + game_ended(parray[p].simul_info.boards[parray[p].simul_info.onBoard], + WHITE, END_ADJOURN); + return COM_OK; +} + +PUBLIC int com_simalladjourn(int p, param_list param) +{ + int i; + + if (!parray[p].simul_info.numBoards) { + pprintf(p, "You are not giving a simul.\n"); + return COM_OK; + } + player_decline_offers(p, -1, -PEND_SIMUL); + for (i = 0; i < parray[p].simul_info.numBoards; i++) { + if (parray[p].simul_info.boards[i] >= 0) { + game_ended(parray[p].simul_info.boards[i], + WHITE, END_ADJOURN); + } + } + return COM_OK; +} + +PUBLIC int com_moretime(int p, param_list param) +{ + int g, increment; + + ASSERT(param[0].type == TYPE_INT); + if ((parray[p].game >=0) &&(garray[parray[p].game].status == GAME_EXAMINE)) { + 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 (parray[p].game <0) { + pprintf(p, "You are not playing a game.\n"); + return COM_OK; + } + if (increment > 600) { + pprintf(p, "Moretime has a maximum limit of 600 seconds.\n"); + increment = 600; + } + g = parray[p].game; + if (garray[g].white == p) { + garray[g].bTime += increment * 10; +#ifdef TIMESEAL + garray[g].bRealTime += increment * 10 * 100; +#endif + pprintf(p, "%d seconds were added to your opponents clock\n", + increment); + pprintf_prompt(parray[p].opponent, + "\nYour opponent has added %d seconds to your clock.\n", + increment); + } + if (garray[g].black == p) { + garray[g].wTime += increment * 10;; +#ifdef TIMESEAL + garray[g].wRealTime += increment * 10 * 100; +#endif + pprintf(p, "%d seconds were added to your opponents clock\n", + increment); + pprintf_prompt(parray[p].opponent, + "\nYour opponent has added %d seconds to your clock.\n", + increment); + } + return COM_OK; +} diff --git a/FICS/gameproc.h b/FICS/gameproc.h new file mode 100644 index 0000000..6feacf1 --- /dev/null +++ b/FICS/gameproc.h @@ -0,0 +1,66 @@ +/* gameproc.h + * + */ + +/* + 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 + (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. +*/ + +/* Revision history: + name email yy/mm/dd Change + Richard Nash 93/10/22 Created +*/ + +#ifndef _GAMEPROC_H +#define _GAMEPROC_H + +#define MAX_SIMPASS 3 +#define MAX_JOURNAL 10 + +extern void game_ended(); +extern int pIsPlaying(); +extern void process_move(); +extern int com_resign(); +extern int com_draw(); +extern int com_pause(); +extern int com_unpause(); +extern int com_abort(); +extern int com_games(); + +extern int com_courtesyabort(); +extern int com_courtesyadjourn(); +extern int com_load(); +extern int com_stored(); +extern int com_adjourn(); +extern int com_flag(); +extern int com_takeback(); +extern int com_switch(); +extern int com_time(); +extern int com_boards(); + +extern int com_simmatch(); +extern int com_simnext(); +extern int com_simprev(); +extern int com_goboard(); +extern int com_gonum(); +extern int com_simgames(); +extern int com_simpass(); +extern int com_simabort(); +extern int com_simallabort(); +extern int com_simadjourn(); +extern int com_simalladjourn(); + +extern int com_moretime(); + +#endif /* _GAMEPROC_H */ diff --git a/FICS/get_tcp_conn.c b/FICS/get_tcp_conn.c new file mode 100644 index 0000000..904da47 --- /dev/null +++ b/FICS/get_tcp_conn.c @@ -0,0 +1,153 @@ +/* +** Routines to open a TCP connection +** +** New version that supports the old (pre 4.2 BSD) socket calls, +** and systems with the old (pre 4.2 BSD) hostname lookup stuff. +** Compile-time options are: +** +** OLDSOCKET - different args for socket() and connect() +** +** Erik E. Fair +** +*/ + +/* Uncomment the following line if you are using old socket calls */ +/* #define OLDSOCKET */ + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "get_tcp_conn.h" +#include "get_tcp_conn.proto.h" +#include "stdinclude.h" + +extern int errno; +extern int close(); + + + +/* +** Take the name of an internet host in ASCII (this may either be its +** official host name or internet number (with or without enclosing +** backets [])), and return a list of internet addresses. +** +** returns NULL for failure to find the host name in the local database, +** or for a bad internet address spec. +*/ +unsigned long ** + name_to_address(char *host) +{ + static u_long *host_addresses[2]; + static u_long haddr; + + if (host == (char *) NULL) { + return ((u_long **) NULL); + } + host_addresses[0] = &haddr; + host_addresses[1] = (u_long *) NULL; + + /* * Is this an ASCII internet address? (either of [10.0.0.78] or * + 10.0.0.78). We get away with the second test because hostnames * and + domain labels are not allowed to begin in numbers. * (cf. RFC952, + RFC882). */ + if (*host == '[' || isdigit(*host)) { + char namebuf[128]; + register char *cp = namebuf; + + /* * strip brackets [] or anything else we don't want. */ + while (*host != '\0' && cp < &namebuf[sizeof(namebuf)]) { + if (isdigit(*host) || *host == '.') + *cp++ = *host++; /* copy */ + else + host++; /* skip */ + } + *cp = '\0'; + haddr = inet_addr(namebuf); + return (&host_addresses[0]); + } else { + struct hostent *hstp = gethostbyname(host); + + if (hstp == NULL) { + return ((u_long **) NULL);/* no such host */ + } + if (hstp->h_length != sizeof(u_long)) + abort(); /* this is fundamental */ + return ((u_long **) hstp->h_addr_list); + } +} + +u_short +gservice(char *serv, char *proto) +{ + if (serv == (char *) NULL || proto == (char *) NULL) + return ((u_short) 0); + + if (isdigit(*serv)) { + return (htons((u_short) (atoi(serv)))); + } else { + struct servent *srvp = getservbyname(serv, proto); + + if (srvp == (struct servent *) NULL) + return ((u_short) 0); + return ((u_short) srvp->s_port); + } +} + +/* +** given a host name (either name or internet address) and port number +** give us a TCP connection to the +** requested service at the requested host (or give us FAIL). +*/ +int get_tcp_conn(host, port) +char *host; +int port; +{ + register int sock; + u_long **addrlist; + struct sockaddr_in sadr; +#ifdef OLDSOCKET + struct sockproto sp; + + sp.sp_family = (u_short) AF_INET; + sp.sp_protocol = (u_short) IPPROTO_TCP; +#endif + + if ((addrlist = name_to_address(host)) == (u_long **) NULL) { + return (NOHOST); + } + sadr.sin_family = (u_short) AF_INET; /* Only internet for now */ + sadr.sin_port = htons(port); + + for (; *addrlist != (u_long *) NULL; addrlist++) { + bcopy((caddr_t) * addrlist, (caddr_t) & sadr.sin_addr, + sizeof(sadr.sin_addr)); + +#ifdef OLDSOCKET + if ((sock = socket(SOCK_STREAM, &sp, (struct sockaddr *) NULL, 0)) < 0) + return (FAIL); + + if (connect(sock, (struct sockaddr *) & sadr) < 0) { +#else + if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) + return (FAIL); + + if (connect(sock, (struct sockaddr *) & sadr, sizeof(sadr)) < 0) { +#endif + int e_save = errno; + + fprintf(stderr, "%s [%s] port %d: %d\n", host, + inet_ntoa(sadr.sin_addr), port, errno); + (void) close(sock); /* dump descriptor */ + errno = e_save; + } else + return (sock); + } + return (FAIL); +} diff --git a/FICS/get_tcp_conn.h b/FICS/get_tcp_conn.h new file mode 100644 index 0000000..01320ae --- /dev/null +++ b/FICS/get_tcp_conn.h @@ -0,0 +1,13 @@ +/* +** Return codes from get_tcp_conn(). +*/ +#define FAIL (-1) /* routine failed */ +#define NOHOST (FAIL-1) /* no such host */ +#define NOSERVICE (FAIL-2) /* no such service */ + +extern int get_tcp_conn(char *, int); +extern unsigned long **name_to_address(char *); + +/* extern int bcopy(); */ +extern int socket(); +extern int connect(); diff --git a/FICS/get_tcp_conn.proto.h b/FICS/get_tcp_conn.proto.h new file mode 100644 index 0000000..ebddbb4 --- /dev/null +++ b/FICS/get_tcp_conn.proto.h @@ -0,0 +1,4 @@ + +/* get_tcp_conn.c */ +unsigned long **name_to_address(char *); +u_short gservice(char *, char *); diff --git a/FICS/gmon.out b/FICS/gmon.out new file mode 100644 index 0000000..2f2b945 Binary files /dev/null and b/FICS/gmon.out differ diff --git a/FICS/hashtbl.h b/FICS/hashtbl.h new file mode 100644 index 0000000..6e1e401 --- /dev/null +++ b/FICS/hashtbl.h @@ -0,0 +1,97 @@ +#ifndef __FICSHashTable_h +#define __FICSHashTable_h +#ifdef __GNUC__ +# pragma interface +#endif +//----------------------------------------------------------------------------- +// FICSHashTable.h +// +// A general-purpose C++ hash table object. +// +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +// $Id: FICSHashTable.h,v 1.0 1995/04/25 21:50:44 mabshier Exp $ +// $Log: FICSHashTable.h,v $ +// $Renamed file to HASHTBL.H to accomodate MSDOS file convention rename for Unix +// Initial revision +// +//----------------------------------------------------------------------------- + +#include +#include + +class FICSHashAdaptor; + +class FICSHashTable : public FICSContainer + { +public: + unsigned long const DEFAULT_CAPACITY = 47; + unsigned long const LOAD_FACTOR_SCALE = 16; + unsigned long const LOAD_FACTOR_SHIFT = 4; + unsigned long const LOAD_FACTOR_DEFAULT = 16; + +private: + FICSHashAdaptor* adaptor; + unsigned long max_load_factor; // Scaled * 16. + unsigned long table_count; // Number of entries. + unsigned long table_size; // Number of slots. + void** table; + void expand( unsigned long new_capacity ); + +public: + FICSHashTable( + FICSHashAdaptor&, + unsigned long capacity = DEFAULT_CAPACITY, + unsigned long max_load = LOAD_FACTOR_DEFAULT ); +virtual ~FICSHashTable(); +virtual size_t vcount() const; + size_t count() const { return table_count; } + size_t capacity() const { return table_size; } +virtual void empty(); +virtual bool findObj( void const* keyPtr, void const*& infoPtr ) const; +virtual bool storeObj( void const* keyPtr, void const* infoPtr, + FICSContainer::Unique u=FICSContainer::UNIQUE ); +virtual bool removeObj( void const* keyPtr ); // Removes 1st entry with key. +virtual int removeAllObj(void const* keyPtr); // Removes all, returns count. + +// These return a pointer to the hash_rec, or 0. +virtual void const* findObj( void const* keyPtr ) const; +virtual void const* findOrStoreObj( void const* keyPtr, void const* infoPtr ); + +friend class FICSHashTableIterator; + FICSHashTableIterator* iterator() const; +virtual FICSIterator* newIterator() const; + +private: // Illegal + FICSHashTable( FICSHashTable const& ) {} // No copy constructor. + void operator=(FICSHashTable const&) {}// No assignment. + +protected: + FICSHashValue getHash( void const* hash_rec ) const; + FICSHashValue hash( void const* key ) const; + void setLink( void* hash_rec, void const* hash_link ) const; + void const* getLink( void const* hash_rec ) const; + bool equal(void const* hash_rec,FICSHashValue,void const* key) const; + void deleteHashRec( void* ); + void* newHashRec( FICSHashValue hash_val, void const* key_ptr, + void const* info, void const* link ); + void const* getInfo( void const* hash_rec ) const; + void const* getKey( void const* hash_rec ) const; + void fakeEmpty() { table_count = 0; } + }; + + +class FICSHashTableIterator : public FICSIterator + { +private: + FICSHashTable const& table; + size_t next_slot; + void const* curr_ptr; +public: + void reset() { next_slot = 0; curr_ptr = 0; } + FICSHashTableIterator( FICSHashTable const& x ):table(x) { reset(); } +virtual ~FICSHashTableIterator(); +virtual bool next( void*& ); + }; + +#endif // __FICSHashTable_h diff --git a/FICS/legal.c b/FICS/legal.c new file mode 100644 index 0000000..5079683 --- /dev/null +++ b/FICS/legal.c @@ -0,0 +1,38 @@ +/* legal.c + * + */ + +/* + 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 + (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. +*/ + +/* Revision history: + name email yy/mm/dd Change + Richard Nash 93/10/22 Created +*/ + +char legalNotice[] = "\n\ + fics - An internet chess server.\n\ + Copyright (C) 1993 Richard V. Nash\n\ +\n\ + This program is free software; you can redistribute it and/or modify\n\ + it under the terms of the GNU General Public License as published by\n\ + the Free Software Foundation; either version 2 of the License, or\n\ + (at your option) any later version.\n\ +\n\ + This program is distributed in the hope that it will be useful,\n\ + but WITHOUT ANY WARRANTY; without even the implied warranty of\n\ + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n\ + GNU General Public License for more details.\n\ +"; diff --git a/FICS/legal.h b/FICS/legal.h new file mode 100644 index 0000000..5219938 --- /dev/null +++ b/FICS/legal.h @@ -0,0 +1,31 @@ +/* + * Copyright (c) 1993 by Richard V. Nash + * All rights reserved world wide. + */ + +/* + 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 + (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. +*/ + +/* Revision history: + name email yy/mm/dd Change + Richard Nash 93/10/22 Created +*/ + +#ifndef _LEGAL_H +#define _LEGAL_H + +extern char legalNotice[]; + +#endif /* _LEGAL_H */ diff --git a/FICS/lists.c b/FICS/lists.c new file mode 100644 index 0000000..7e3748d --- /dev/null +++ b/FICS/lists.c @@ -0,0 +1,470 @@ +/* lists.c + + * New global lists code + * + * Part of: FICS + * + * Added by Shaney, 29 May 1995 :) + * sometime in Oct 1995: changed things a little (loon) + * + +*/ + +#include "lists.h" +#include "common.h" +#include "multicol.h" +#include "command.h" +#include "utils.h" +#include "playerdb.h" +#include "ratings.h" +#include "rmalloc.h" +#include "talkproc.h" +#include "gamedb.h" +#include "stdinclude.h" +#include "comproc.h" + +#include + +List *firstGlobalList = NULL; + +PRIVATE ListTable ListArray[] = +{{P_HEAD, "admin"}, +{P_GOD, "removedcom"}, +{P_ADMIN, "filter"}, +{P_ADMIN, "ban"}, +{P_ADMIN, "abuser"}, +{P_ADMIN, "muzzle"}, +{P_ADMIN, "cmuzzle"}, +{P_PUBLIC, "fm"}, +{P_PUBLIC, "im"}, +{P_PUBLIC, "gm"}, +{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"}, +{0, NULL}}; + +/* find a list. loads from disk if not in memory. */ +PRIVATE List *list_find(int p, enum ListWhich l) +{ + List *prev, *tempList, **starter; + int personal; + int count = 0; + + personal = ListArray[l].rights == P_PERSONAL; + starter = personal ? &(parray[p].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; + } + prev = tempList; + } + + tempList = rmalloc(sizeof(List)); + if (tempList == NULL) + return NULL; + + if (!personal) { /* now we have to load the list */ + FILE *fp; + char listmember[100]; + char filename[MAX_FILENAME_SIZE]; + + /* fprintf(stderr,"SHANEDEBUG: Adding %s list\n", ListArray[l].name); */ + + sprintf(filename, "%s/%s", lists_dir, ListArray[l].name); + fp = fopen(filename, "r"); + if (!fp) { + rfree(tempList); + return NULL; + } + while (!feof(fp)) { + if (fgets(listmember, 100, fp) != NULL) { + listmember[strlen(listmember) - 1] = '\0'; + tempList->member[count++] = strdup(listmember); + } + } + fclose(fp); + } + tempList->which = l; + tempList->numMembers = count; + tempList->next = *starter; + *starter = tempList; + return tempList; +} + +/* add item to list */ +PUBLIC int list_add(int p, enum ListWhich l, char *s) +{ + List *gl = list_find(p, l); + + if (gl) { + if (gl->numMembers < MAX_GLOBAL_LIST_SIZE) { + gl->member[gl->numMembers] = strdup(s); + gl->numMembers++; + return 0; + } else { + return 1; + } + } else { + return 1; + } +} + +/* remove item from list */ +PUBLIC int list_sub(int p, enum ListWhich l, char *s) +{ + List *gl = list_find(p, l); + + if (gl) { + int i, found = -1; + for (i = 0; i < gl->numMembers; i++) + if (!strcasecmp(s, gl->member[i])) { + found = i; + break; + } + if (found == -1) + return 1; + rfree(gl->member[found]); + for (i = found; i < (gl->numMembers - 1); i++) + gl->member[i] = gl->member[i + 1]; + gl->numMembers--; + return 0; + } else { + return 1; + } +} + +/* pretty cheesy: print each member of a list, 1 per line */ +PUBLIC void list_print(FILE * fp, int p, enum ListWhich l) +{ + int i; + List *gl = list_find(p, l); + + if (gl) { + for (i = 0; i < gl->numMembers; i++) + fprintf(fp, "%s\n", gl->member[i]); + } +} + +/* return size of a list */ +PUBLIC int list_size(int p, enum ListWhich l) +{ + List *gl = list_find(p, l); + + if (gl) + return (gl->numMembers); + else + return 0; +} + +/* find list by name, doesn't have to be the whole name */ +PRIVATE List *list_findpartial(int p, char *which, int gonnado) +{ + 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 && (parray[p].adminLevel < ADMIN_GOD)) || + (!gonnado && (parray[p].adminLevel < ADMIN_ADMIN))) + youlose = 1; + break; + case P_ADMIN: + if (parray[p].adminLevel < ADMIN_ADMIN) + youlose = 1; + break; + case P_PUBLIC: + if (gonnado && (parray[p].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 */ +PUBLIC int in_list(int p, enum ListWhich which, char *member) +{ + 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->member[i], strlen(gl->member[i]))) + return 1; + } else { + if (!strcasecmp(member, gl->member[i])) + return 1; + } + } + return 0; +} + +/* add or subtract something to/from a list */ +PUBLIC int list_addsub(int p, char* list, char* who, int addsub) +{ + int p1, connected, loadme, personal, ch; + char *listname, *member; + 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 = parray[p1].name; + } else { + member = who; + } + + if (addsub == 1) { /* add to list */ + + if (gl->which == L_CHANNEL) { + + if (sscanf (who,"%d",&ch) == 1) { + + if ((!in_list(p,L_ADMIN,parray[p].name)) && (ch == 0)) { + pprintf(p, "Only admins may join channel 0.\n"); + return COM_OK; + } + + if (ch > (MAX_CHANNELS - 1)) { + pprintf(p,"The maximum channel number is %d.\n",MAX_CHANNELS-1); + return COM_OK; + } + } else { + pprintf (p,"Your 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_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 (parray[p1].b_stats.rating > 0) + UpdateRank(TYPE_BLITZ, member, &parray[p1].b_stats, member); + if (parray[p1].s_stats.rating > 0) + UpdateRank(TYPE_STAND, member, &parray[p1].s_stats, member); + if (parray[p1].w_stats.rating > 0) + UpdateRank(TYPE_WILD, member, &parray[p1].w_stats, member); + break; + case L_ADMIN: + if (addsub == 1) { /* adding to list */ + parray[p1].adminLevel = 10; + pprintf(p, "%s has been given an admin level of 10 - change with asetadmin.\n", member); + } else { + parray[p1].adminLevel = 0; + } + break; + case L_FILTER: + pprintf(p, "Please leave a message for filter to explain why site %s was %s filter list.\n", member, addrem); + break; + case L_REMOVEDCOM: + pprintf(p, "Please leave a message on anews to explain why %s was %s removedcom list.\n", member, addrem); + break; + default: + break; + } + if (loadme && connected) { + pprintf_prompt(p1, "You have been %s the %s list by %s.\n", addrem, listname, parray[p].name); + } + sprintf(filename, "%s/%s", lists_dir, listname); + fp = fopen(filename, "w"); + if (fp == NULL) { + fprintf(stderr, "Couldn't save %s list.\n", listname); + } else { + int i; + for (i = 0; i < gl->numMembers; i++) + fprintf(fp, "%s\n", gl->member[i]); + fclose(fp); + } + } + if (loadme || (gl->which == L_ADMIN)) { + player_save(p1); + } + if (loadme && !connected) { + player_remove(p1); + } + return COM_OK; +} + +PUBLIC int com_addlist(int p, param_list param) +{ + return list_addsub(p, param[0].val.word, param[1].val.word, 1); +} + +PUBLIC int com_sublist(int p,param_list param) +{ + return list_addsub(p, param[0].val.word, param[1].val.word, 2); +} + +PUBLIC int com_showlist(int p, param_list param) +{ + 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) || (parray[p].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->member[i]); + multicol_pprint(m, p, 78, 2); + multicol_end(m); + } + } + return COM_OK; +} + +PUBLIC int list_channels(int p,int p1) +{ + 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->member[i]); + multicol_pprint(m, p, 78, 1); + multicol_end(m); + } + return 0; +} + +/* free the memory used by a list */ +PUBLIC void list_free(List * gl) +{ + int i; + List *temp; + + while (gl) { + for (i = 0; i < gl->numMembers; i++) { + strfree(gl->member[i]); + } + temp = gl->next; + rfree(gl); + gl = temp; + } +} + +PUBLIC 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))) { + return 1; + } else { + return 0; + } +} diff --git a/FICS/lists.h b/FICS/lists.h new file mode 100644 index 0000000..8b34a69 --- /dev/null +++ b/FICS/lists.h @@ -0,0 +1,44 @@ +/* lists.h */ + +#include + +#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 */ + +enum ListWhich {L_ADMIN = 0, L_REMOVEDCOM, L_FILTER, L_BAN, L_ABUSER, +L_MUZZLE, L_CMUZZLE, L_FM, L_IM, L_GM, L_BLIND, L_TEAMS, L_COMPUTER, +L_TD, L_CENSOR, L_GNOTIFY, L_NOPLAY, L_NOTIFY, L_CHANNEL}; + +enum ListPerm {P_HEAD = 0, P_GOD, P_ADMIN, P_PUBLIC, P_PERSONAL}; + +typedef struct {enum ListPerm rights; char *name;} ListTable; + +/* max. names in one list: 200 */ +#define MAX_GLOBAL_LIST_SIZE 200 + +typedef struct _List List; +struct _List { + enum ListWhich which; + int numMembers; + char *member[MAX_GLOBAL_LIST_SIZE]; + struct _List *next; +}; + +extern int com_addlist(); +extern int com_sublist(); +extern int com_showlist(); + +extern void list_free(List *); +extern int in_list(int, enum ListWhich, char *); +extern int list_size(int p, enum ListWhich); +extern int list_add(int, enum ListWhich, char *); +extern int list_addsub (int,char*,char*,int); +extern int list_sub(int, enum ListWhich, char *); +extern void list_print(FILE *, int, enum ListWhich); +extern int titled_player(int, char *); +extern int list_channels(int,int); + +#endif /* _LISTS_H */ diff --git a/FICS/makerank.c b/FICS/makerank.c new file mode 100644 index 0000000..fe04fb7 --- /dev/null +++ b/FICS/makerank.c @@ -0,0 +1,217 @@ +#define COMPUTER_FILE DEFAULT_LISTS "/computer" +#define MAX_LOGIN_NAME 21 + +#include +#include +#include +#include +#include "config.h" + +char *rnames[] = {"std", "blitz", "wild", "lightning"}; + +typedef struct _ratings { + int rating; + int num; +} ratings; + +typedef struct _Entry { + char name[MAX_LOGIN_NAME]; + ratings r[4]; + int computer; +} ENTRY; + +ENTRY **list; +ENTRY **sortme; + +int GetPlayerInfo(char *fileName, ENTRY *e) +{ + FILE *fp; + char line[100]; + char field[20]; + char NameWithCase[30]; + int i, done = 0; + + e->computer = 0; + for (i = 0; i < 4; i++) { + e->r[i].num = 0; + e->r[i].rating = 0; + } + + fp = fopen(fileName, "r"); + fgets(line, 99, fp); + if (feof(fp)) + return(0); + if (!strcmp(line, "v 1\n")) { + fgets(line, 99, fp); + sscanf(line, "%s", e->name); + fgets(line, 99, fp); + fgets(line, 99, fp); + fgets(line, 99, fp); + 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", &(e->r[0].num), &(e->r[0].rating), &(e->r[1].num), &(e->r[1].rating), &(e->r[2].num), &(e->r[2].rating), &(e->r[3].num), &(e->r[3].rating)) != 8) + fprintf(stderr, "OOPS: couldn't parse player file %s.\n", fileName); + } else do { + sscanf(line, "%s", field); + if (!strcmp(field, "Name:")) { + sscanf(line, "%*s %s", NameWithCase); + if (strcasecmp(e->name, NameWithCase)) + printf("TROUBLE: %s's handle is listed as %s.\n", + e->name, NameWithCase); + else + strcpy(e->name, NameWithCase); + } else if (!strcmp(field, "S_NUM:")) { + sscanf(line, "%*s %d", &(e->r[0].num)); + } else if (!strcmp(field, "B_NUM:")) { + sscanf(line, "%*s %d", &(e->r[1].num)); + } else if (!strcmp(field, "W_NUM:")) { + sscanf(line, "%*s %d", &(e->r[2].num)); + } else if (!strcmp(field, "L_NUM:")) { + sscanf(line, "%*s %d", &(e->r[3].num)); + } else if (!strcmp(field, "S_RATING:")) { + sscanf(line, "%*s %d", &(e->r[0].rating)); + } else if (!strcmp(field, "B_RATING:")) { + sscanf(line, "%*s %d", &(e->r[1].rating)); + } else if (!strcmp(field, "W_RATING:")) { + sscanf(line, "%*s %d", &(e->r[2].rating)); + } else if (!strcmp(field, "L_RATING:")) { + sscanf(line, "%*s %d", &(e->r[3].rating)); + } else if (!strcmp(field, "Network:")) { + done = 1; + } + fgets(line, 99, fp); + } while (!done && !feof(fp)); + fclose(fp); + return (1); +} + +int LoadEntries(void) +{ + int listsize; + FILE *fpPlayerList; + char letter1; + char command[90]; + 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", DEFAULT_PLAYERS, letter1); + sprintf(command, "ls -1 %s", pathInput); + fpPlayerList = popen(command, "r"); + 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", DEFAULT_PLAYERS, letter1, e.name); + if (GetPlayerInfo(pathInput, &e)) { + if ((list[n] = malloc(sizeof(ENTRY))) == NULL) { + fprintf(stderr, "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); +} + +int SetComputers(int n) +{ + FILE *fpComp; + int i = 0; + char line[100], comp[30]; + + sprintf(line, "sort -f %s", COMPUTER_FILE); + fpComp = popen(line, "r"); + 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); +} + +int rtype; + +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); +} + +void makerank(void) +{ + int sortnum, sortmesize, i, n; + FILE *fp; + char fName[200]; + + 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"); + sprintf(fName, "%s/rank.%s", DEFAULT_STATS, rnames[rtype]); + fp = fopen(fName, "w"); + for (i = 0; i < sortnum; i++) + fprintf(fp, "%s %d %d %d\n", sortme[i]->name, sortme[i]->r[rtype].rating, sortme[i]->r[rtype].num, sortme[i]->computer); + 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/FICS/matchproc.c b/FICS/matchproc.c new file mode 100644 index 0000000..05a2aff --- /dev/null +++ b/FICS/matchproc.c @@ -0,0 +1,1081 @@ +/* matchproc.c + * + */ + +/* + 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 + (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. +*/ + +/* Revision history: + name email yy/mm/dd Change + hersco dhersco@stmarys-ca.edu 95/7/24 Created +*/ + +#include "stdinclude.h" + +#include "common.h" +#include "talkproc.h" +#include "comproc.h" +#include "command.h" +#include "utils.h" +#include "ficsmain.h" +#include "config.h" +#include "playerdb.h" +#include "network.h" +#include "rmalloc.h" +#include "variable.h" +#include "gamedb.h" +#include "gameproc.h" +#include "obsproc.h" +#include "board.h" +/* #include "hostinfo.h" */ +#include "multicol.h" +#include "ratings.h" +#include "formula.h" +#include "lists.h" +#include "eco.h" +#include + +#include + +PUBLIC int create_new_match(int white_player, int black_player, + int wt, int winc, int bt, int binc, + int rated, char *category, char *board, + int white) +{ + int g = game_new(), p; + char outStr[1024]; + int reverse = 0; + + if (g < 0) + return COM_FAILED; + if (white == 0) { + reverse = 1; + } else if (white == -1) { + if ((wt == bt) && (winc == binc)) { + if (parray[white_player].lastColor == parray[black_player].lastColor) { + if ((parray[white_player].num_white - parray[white_player].num_black) > + (parray[black_player].num_white - parray[black_player].num_black)) + reverse = 1; + } else if (parray[white_player].lastColor == WHITE) + reverse = 1; + } else + reverse = 1; /* Challenger is always white in unbalanced + match */ + } + if (reverse) { + int tmp = white_player; + white_player = black_player; + black_player = tmp; + } + player_remove_request(white_player, black_player, PEND_MATCH); + player_remove_request(black_player, white_player, PEND_MATCH); + player_remove_request(white_player, black_player, PEND_SIMUL); + player_remove_request(black_player, white_player, PEND_SIMUL); + player_decline_offers(white_player, -1, PEND_MATCH); + player_withdraw_offers(white_player, -1, PEND_MATCH); + player_decline_offers(black_player, -1, PEND_MATCH); + player_withdraw_offers(black_player, -1, PEND_MATCH); + player_withdraw_offers(white_player, -1, PEND_SIMUL); + player_withdraw_offers(black_player, -1, PEND_SIMUL); + + wt = wt * 60; /* To Seconds */ + bt = bt * 60; + garray[g].white = white_player; + garray[g].black = black_player; + strcpy(garray[g].white_name, parray[white_player].name); + strcpy(garray[g].black_name, parray[black_player].name); + garray[g].status = GAME_ACTIVE; + garray[g].type = game_isblitz(wt / 60, winc, bt / 60, binc, category, board); + if ((garray[g].type == TYPE_UNTIMED) || (garray[g].type == TYPE_NONSTANDARD)) + garray[g].rated = 0; + else + garray[g].rated = rated; + garray[g].private = parray[white_player].private || + parray[black_player].private; + garray[g].white = white_player; + if (garray[g].type == TYPE_BLITZ) { + garray[g].white_rating = parray[white_player].b_stats.rating; + garray[g].black_rating = parray[black_player].b_stats.rating; + } else if (garray[g].type == TYPE_WILD) { + garray[g].white_rating = parray[white_player].w_stats.rating; + garray[g].black_rating = parray[black_player].w_stats.rating; + } else if (garray[g].type == TYPE_LIGHT) { + garray[g].white_rating = parray[white_player].l_stats.rating; + garray[g].black_rating = parray[black_player].l_stats.rating; + } else if (garray[g].type == TYPE_BUGHOUSE) { + garray[g].white_rating = parray[white_player].bug_stats.rating; + garray[g].black_rating = parray[black_player].bug_stats.rating; + } else { + garray[g].white_rating = parray[white_player].s_stats.rating; + garray[g].black_rating = parray[black_player].s_stats.rating; + } + if (board_init(&garray[g].game_state, category, board)) { + pprintf(white_player, "PROBLEM LOADING BOARD. Game Aborted.\n"); + pprintf(black_player, "PROBLEM LOADING BOARD. Game Aborted.\n"); + fprintf(stderr, "FICS: PROBLEM LOADING BOARD %s %s. Game Aborted.\n", + category, board); + } + garray[g].game_state.gameNum = g; + garray[g].wTime = wt * 10; + garray[g].wInitTime = wt * 10; + garray[g].wIncrement = winc * 10; + garray[g].bTime = bt * 10; + if (garray[g].type != TYPE_UNTIMED) { + if (wt == 0) + garray[g].wTime = 100; + if (bt == 0) + garray[g].bTime = 100; + } /* 0 x games start with 10 seconds */ + +#ifdef TIMESEAL + + garray[g].wRealTime = garray[g].wTime * 100; + garray[g].bRealTime = garray[g].bTime * 100; + garray[g].wTimeWhenReceivedMove = 0; + garray[g].bTimeWhenReceivedMove = 0; + +#endif + garray[g].bInitTime = bt * 10; + garray[g].bIncrement = binc * 10; + if (garray[g].game_state.onMove == BLACK) { /* Start with black */ + garray[g].numHalfMoves = 1; + garray[g].moveListSize = 1; + garray[g].moveList = (move_t *) rmalloc(sizeof(move_t)); + garray[g].moveList[0].fromFile = -1; + garray[g].moveList[0].fromRank = -1; + garray[g].moveList[0].toFile = -1; + garray[g].moveList[0].toRank = -1; + garray[g].moveList[0].color = WHITE; + strcpy(garray[g].moveList[0].moveString, "NONE"); + strcpy(garray[g].moveList[0].algString, "NONE"); + } else { + garray[g].numHalfMoves = 0; + garray[g].moveListSize = 0; + garray[g].moveList = NULL; + } + garray[g].timeOfStart = tenth_secs(); + garray[g].startTime = tenth_secs(); + garray[g].lastMoveTime = garray[g].startTime; + garray[g].lastDecTime = garray[g].startTime; + garray[g].clockStopped = 0; + sprintf(outStr, "\n{Game %d (%s vs. %s) Creating %s %s match.}\n", + g + 1, parray[white_player].name, + parray[black_player].name, + rstr[garray[g].rated], + bstr[garray[g].type]); + pprintf(white_player, "%s", outStr); + pprintf(black_player, "%s", outStr); + + for (p = 0; p < p_num; p++) { + int gnw, gnb; + if ((p == white_player) || (p == black_player)) + continue; + if (parray[p].status != PLAYER_PROMPT) + continue; + if (parray[p].i_game) + pprintf_prompt(p, "%s", outStr); + gnw = in_list(p, L_GNOTIFY, parray[white_player].login); + gnb = in_list(p, L_GNOTIFY, parray[black_player].login); + if (gnw || gnb) { + pprintf(p, "Game notification: "); + if (gnw) + pprintf_highlight(p, parray[white_player].name); + else + pprintf(p, parray[white_player].name); + pprintf(p, " (%s) vs. ", + ratstr(GetRating(&parray[white_player], garray[g].type))); + if (gnb) + pprintf_highlight(p, parray[black_player].name); + else + pprintf(p, parray[black_player].name); + pprintf_prompt(p, " (%s) %s %s %d %d\n", + ratstr(GetRating(&parray[black_player], garray[g].type)), + rstr[garray[g].rated], bstr[garray[g].type], + garray[g].wInitTime/600, garray[g].wIncrement/10); + } + } + parray[white_player].game = g; + parray[white_player].opponent = black_player; + parray[white_player].side = WHITE; + parray[white_player].promote = QUEEN; + parray[black_player].game = g; + parray[black_player].opponent = white_player; + parray[black_player].side = BLACK; + parray[black_player].promote = QUEEN; + send_boards(g); + MakeFENpos(g, garray[g].FENstartPos); + + return COM_OK; +} + +PRIVATE int accept_match(int p, int p1) +{ + int g, adjourned, foo, which; + int wt, winc, bt, binc, rated, white; + char category[50], board[50]; + pending *pend; + char tmp[100]; + int bh=0, pp, pp1; + + unobserveAll(p); /* stop observing when match starts */ + unobserveAll(p1); + + which = player_find_pendfrom(p, p1, PEND_MATCH); + pend = &parray[p].p_from_list[which]; + wt = pend->param1; + winc = pend->param2; + bt = pend->param3; + binc = pend->param4; + rated = pend->param5; + strcpy (category, pend->char1); + strcpy (board, pend->char2); + white = (pend->param6 == -1) ? -1 : 1 - pend->param6; + + pprintf(p, "You accept the challenge of %s.\n", parray[p1].name); + pprintf(p1, "\n%s accepts your challenge.\n", parray[p].name); + player_remove_request(p, p1, -1); + player_remove_request(p1, p, -1); + + while ((which = player_find_pendto(p, -1, -1)) != -1) { + foo = parray[p].p_to_list[which].whoto; + pprintf_prompt(foo, "\n%s, who was challenging you, has joined a match with %s.\n", parray[p].name, parray[p1].name); + pprintf(p, "Challenge to %s withdrawn.\n", parray[foo].name); + player_remove_request(p, foo, -1); + } + + while ((which = player_find_pendto(p1, -1, -1)) != -1) { + foo = parray[p1].p_to_list[which].whoto; + pprintf_prompt(foo, "\n%s, who was challenging you, has joined a match with %s.\n", parray[p1].name, parray[p].name); + pprintf(p1, "Challenge to %s withdrawn.\n", parray[foo].name); + player_remove_request(p1, foo, -1); + } + + while ((which = player_find_pendfrom(p, -1, -1)) != -1) { + foo = parray[p].p_from_list[which].whofrom; + pprintf_prompt(foo, "\n%s, whom you were challenging, has joined a match with %s.\n", parray[p].name, parray[p1].name); + pprintf(p, "Challenge from %s removed.\n", parray[foo].name); + player_remove_request(foo, p, -1); + } + + while ((which = player_find_pendfrom(p1, -1, -1)) != -1) { + foo = parray[p1].p_from_list[which].whofrom; + pprintf_prompt(foo, "\n%s, whom you were challenging, has joined a match with %s.\n", parray[p1].name, parray[p].name); + pprintf(p1, "Challenge from %s removed.\n", parray[foo].name); + player_remove_request(foo, p1, -1); + } + + if (game_isblitz(wt, winc, bt, binc, category, board) == TYPE_WILD && + strcmp(board, "bughouse") == 0) { + bh = 1; + + if ((pp = parray[p].partner) >= 0 && + (pp1 = parray[p1].partner) >= 0) { + unobserveAll(pp); /* stop observing when match starts */ + unobserveAll(pp1); + + pprintf(pp, "\nYour partner accepts the challenge of %s.\n", parray[p1].name); + pprintf(pp1, "\nYour partner %s's challenge was accepted.\n", parray[p].name); + + while ((which = player_find_pendto(pp, -1, -1)) != -1) { + foo = parray[pp].p_to_list[which].whoto; + pprintf_prompt(foo, "\n%s, who was challenging you, has joined a match with %s.\n", parray[pp].name, parray[pp1].name); + pprintf(pp, "Challenge to %s withdrawn.\n", parray[foo].name); + player_remove_request(pp, foo, -1); + } + + while ((which = player_find_pendto(pp1, -1, -1)) != -1) { + foo = parray[pp1].p_to_list[which].whoto; + pprintf_prompt(foo, "\n%s, who was challenging you, has joined a match with %s.\n", parray[pp1].name, parray[pp].name); + pprintf(pp1, "Challenge to %s withdrawn.\n", parray[foo].name); + player_remove_request(pp1, foo, -1); + } + + while ((which = player_find_pendfrom(pp, -1, -1)) != -1) { + foo = parray[pp].p_from_list[which].whofrom; + pprintf_prompt(foo, "\n%s, whom you were challenging, has joined a match with %s.\n", parray[pp].name, parray[pp1].name); + pprintf(pp, "Challenge from %s removed.\n", parray[foo].name); + player_remove_request(foo, pp, -1); + } + + while ((which = player_find_pendfrom(pp1, -1, -1)) != -1) { + foo = parray[pp1].p_from_list[which].whofrom; + pprintf_prompt(foo, "\n%s, whom you were challenging, has joined a match with %s.\n", parray[pp1].name, parray[pp].name); + pprintf(pp1, "Challenge from %s removed.\n", parray[foo].name); + player_remove_request(foo, pp1, -1); + } + } else { + return COM_OK; + } + } + + g = game_new(); + adjourned = 0; + if (game_read(g, p, p1) >= 0) + adjourned = 1; + else if (game_read(g, p1, p) >= 0) { + int swap; + adjourned = 1; + swap = p; + p = p1; + p1 = swap; + } + if (!adjourned) { /* no adjourned game, so begin a new game */ + game_remove(g); + + if (create_new_match(p, p1, wt, winc, bt, binc, rated, category, board, white) != COM_OK) { + sprintf(tmp, "There was a problem creating the new match.\n"); + pprintf(p, tmp); + pprintf_prompt(p1, tmp); + } else if (bh) { + white = (parray[p].side == WHITE ? 0 : 1); + if (create_new_match(pp, pp1, wt, winc, bt, binc, rated, category, board, white) != COM_OK) { +/* sprintf(tmp, "There was a problem creating the new match.\n"); */ + pprintf_prompt(pp, tmp); + pprintf_prompt(pp1, tmp); + sprintf(tmp, "There was a problem creating your partner's match.\n"); + pprintf(p, tmp); + pprintf_prompt(p1, tmp); + /* abort first game p-p1 IanO: abort_game()? */ + } else { + int g1 = parray[p].game; + int g2 = parray[pp].game; + + garray[g1].link = g2; + garray[g2].link = g1; + + sprintf(tmp, "\nYour partner is playing game %d (%s vs. %s).\n", + g2 + 1, garray[g2].white_name, 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, garray[g1].white_name, garray[g1].black_name); + pprintf_prompt(pp, tmp); + pprintf_prompt(pp1, tmp); + } + } + } else { /* resume adjourned game */ + game_delete(p, p1); + + sprintf(tmp, "{Game %d (%s vs. %s) Continuing %s %s match.}\n", + g+1, parray[p].name, parray[p1].name, + rstr[garray[g].rated], bstr[garray[g].type]); + pprintf(p, tmp); + pprintf(p1, tmp); + + garray[g].white = p; + garray[g].black = p1; + garray[g].status = GAME_ACTIVE; + garray[g].result = END_NOTENDED; + garray[g].startTime = tenth_secs(); + garray[g].lastMoveTime = garray[g].startTime; + garray[g].lastDecTime = garray[g].startTime; + parray[p].game = g; + parray[p].opponent = p1; + parray[p].side = WHITE; + parray[p1].game = g; + parray[p1].opponent = p; + parray[p1].side = BLACK; + +#ifdef TIMESEAL + + garray[g].wRealTime = garray[g].wTime * 100; + garray[g].bRealTime = garray[g].bTime * 100; + garray[g].wTimeWhenReceivedMove = 0; + garray[g].bTimeWhenReceivedMove = 0; + +#endif + + send_boards(g); + } + return COM_OK; +} + +PUBLIC int com_match(int p, param_list param) +{ + int adjourned; /* adjourned game? */ + int g; /* more adjourned game junk */ + int p1; + int bh=0, pp, pp1; + int pendfrom, pendto; + int ppend, p1pend; + 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], parsebuf[100]; + char *val; + textlist *clauses = NULL; + int type; + int confused = 0; + char *colorstr[] = {"", "[black] ", "[white] "}; + char *adjustr[] = {"", " (adjourned)"}; + + if ((parray[p].game >= 0) && (garray[parray[p].game].status == GAME_EXAMINE)) { + pprintf(p, "You can't challenge while you are examining a game.\n"); + return COM_OK; + } + if (parray[p].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); + return COM_OK; + } + if (parray[p].open == 0) { + parray[p].open = 1; + pprintf(p, "Setting you open for matches.\n"); + } + if (!parray[p1].open) { + pprintf(p, "Player \"%s\" is not open to match requests.\n", parray[p1].name); + return COM_OK; + } + if (parray[p1].game >= 0) { + pprintf(p, "Player \"%s\" is involved in another game.\n", parray[p1].name); + return COM_OK; + } +/* 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 = garray[g].type; + wt = garray[g].wInitTime / 600; + bt = garray[g].bInitTime / 600; + winc = garray[g].wIncrement / 10; + binc = garray[g].bIncrement / 10; + rated = garray[g].rated; + } + game_remove(g); + + pendto = player_find_pendto(p, p1, PEND_MATCH); + pendfrom = player_find_pendfrom(p, p1, PEND_MATCH); + category[0] = '\0'; + board[0] = '\0'; + + if (!adjourned) { + if (in_list(p1, L_NOPLAY, parray[p].login)) { + pprintf(p, "You are on %s's noplay list.\n", parray[p1].name); + return COM_OK; + } + if (player_censored(p1, p)) { + pprintf(p, "Player \"%s\" is censoring you.\n", parray[p1].name); + return COM_OK; + } + if (player_censored(p, p1)) { + pprintf(p, "You are censoring \"%s\".\n", parray[p1].name); + return COM_OK; + } + if (param[1].type != TYPE_NULL) { + int numba; /* temp for atoi() */ + + 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)) { + if ((numba = atoi(parsebuf)) < 0) { + pprintf(p, "You can't specify negative time controls.\n"); + return COM_OK; + } else if (numba > 1000) { + pprintf(p, "You can't specify time or inc above 1000.\n"); + return COM_OK; + } 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 (strstr("rated", parsebuf) != NULL) { + if (rated == -1) + rated = 1; + else + confused = 1; + } else if (strstr("unrated", parsebuf) != NULL) { + if (rated == -1) + rated = 0; + else + confused = 1; + } else if (strstr("white", parsebuf) != NULL) { + if (white == -1) + white = 1; + else + confused = 1; + } else if (strstr("black", parsebuf) != NULL) { + if (white == -1) + white = 0; + else + confused = 1; + } 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 COM_OK; + } + } + rated = ((rated == -1) ? parray[p].rated : rated) && parray[p1].registered && parray[p].registered; + if (winc == -1) + winc = (wt == -1) ? parray[p].d_inc : 0; /* match 5 == match 5 0 */ + if (wt == -1) + wt = parray[p].d_time; + if (bt == -1) + bt = wt; + if (binc == -1) + binc = winc; + + if (!strcmp(category,"bughouse")) { /* save mentioning wild */ + (strcpy(board,"bughouse")); + (strcpy(category,"wild")); + } + if (category[0] && !board[0]) { + pprintf(p, "You must specify a board and a category.\n"); + return COM_OK; + } + if (category[0]) { + 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; + } + } + if ((pendfrom < 0) && (parray[p1].ropen == 0) && (rated != parray[p1].rated)) { + pprintf(p, "%s only wants to play %s games.\n", parray[p1].name, + rstr[parray[p1].rated]); + pprintf_highlight(p1, "Ignoring"); + pprintf(p1, " %srated match request from %s.\n", + (parray[p1].rated ? "un" : ""), parray[p].name); + return COM_OK; + } + type = game_isblitz(wt, winc, bt, binc, category, board); + +#if 0 + if (rated && (type == TYPE_STAND || type == TYPE_BLITZ || type == TYPE_WILD)) { + if (parray[p].network_player == parray[p1].network_player) { + rated = 1; + } else { + pprintf(p, "Network vs. local player forced to not rated\n"); + rated = 0; + } + } +#endif + + if (rated && (type == TYPE_WILD) && (!strcmp(board,"bughouse"))) { + pprintf(p, "Game is bughouse - reverting to unrated\n"); + rated = 0; /* will need to kill wild and make TYPE_BUGHOUSE */ + } + 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; + } + /* Now check formula. */ + if ((pendfrom < 0 || param[1].type != TYPE_NULL) + && !GameMatchesFormula(p, p1, wt, winc, bt, binc, + rated, type, &clauses)) { + pprintf(p, "Match request does not fit formula for %s:\n", + parray[p1].name); + pprintf(p, "%s's formula: %s\n", parray[p1].name, parray[p1].formula); + ShowClauses (p, p1, clauses); + ClearTextList(clauses); + pprintf_highlight(p1, "Ignoring"); + pprintf_prompt(p1, " (formula): %s (%d) %s (%d) %s.\n", + parray[p].name, + GetRating(&parray[p], type), + parray[p1].name, + GetRating(&parray[p1], type), + game_str(rated, wt * 60, winc, bt * 60, binc, category, board)); + return COM_OK; + } + if (type == TYPE_WILD && strcmp(board, "bughouse") == 0) { + bh = 1; + pp = parray[p].partner; + pp1 = 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 (pp == pp1) { + pprintf(p, "You and your opponent both chose the same partner!\n"); + return COM_OK; + } + if (pp == p1 || pp1 == p) { + pprintf(p, "You and your opponent can't choose each other as partners!\n"); + return COM_OK; + } + if (parray[pp].partner != p) { + pprintf(p, "Your partner hasn't chosen you as his partner!\n"); + return COM_OK; + } + if (parray[pp1].partner != p1) { + pprintf(p, "Your opponent's partner hasn't chosen your opponent as his partner!\n"); + return COM_OK; + } + if (!parray[pp].open || parray[pp].game >= 0) { + pprintf(p, "Your partner isn't open to play right now.\n"); + return COM_OK; + } + if (!parray[pp1].open || 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? */ + if (pendto >= 0) { + pprintf(p, "Updating offer already made to \"%s\".\n", parray[p1].name); + } + if (pendfrom >= 0) { + if (pendto >= 0) { + pprintf(p, "Internal error\n"); + fprintf(stderr, "FICS: This shouldn't happen. You can't have a match pending from and to the same person.\n"); + return COM_OK; + } + if (adjourned || ((wt == parray[p].p_from_list[pendfrom].param1) && + (winc == parray[p].p_from_list[pendfrom].param2) && + (bt == parray[p].p_from_list[pendfrom].param3) && + (binc == parray[p].p_from_list[pendfrom].param4) && + (rated == parray[p].p_from_list[pendfrom].param5) && + ((white == -1) || (white + parray[p].p_from_list[pendfrom].param6 == 1)) && + (!strcmp(category, parray[p].p_from_list[pendfrom].char1)) && + (!strcmp(board, parray[p].p_from_list[pendfrom].char2)))) { + /* Identical match, should accept! */ + accept_match(p, p1); + return COM_OK; + } else { + player_remove_pendfrom(p, p1, PEND_MATCH); + player_remove_pendto(p1, p, PEND_MATCH); + } + } + if (pendto < 0) { + ppend = player_new_pendto(p); + if (ppend < 0) { + pprintf(p, "Sorry you can't have any more pending matches.\n"); + return COM_OK; + } + p1pend = player_new_pendfrom(p1); + if (p1pend < 0) { + pprintf(p, "Sorry %s can't have any more pending matches.\n", parray[p1].name); + parray[p].num_to = parray[p].num_to - 1; + return COM_OK; + } + } else { + ppend = pendto; + p1pend = player_find_pendfrom(p1, p, PEND_MATCH); + } + parray[p].p_to_list[ppend].param1 = wt; + parray[p].p_to_list[ppend].param2 = winc; + parray[p].p_to_list[ppend].param3 = bt; + parray[p].p_to_list[ppend].param4 = binc; + parray[p].p_to_list[ppend].param5 = rated; + parray[p].p_to_list[ppend].param6 = white; + strcpy(parray[p].p_to_list[ppend].char1, category); + strcpy(parray[p].p_to_list[ppend].char2, board); + parray[p].p_to_list[ppend].type = PEND_MATCH; + parray[p].p_to_list[ppend].whoto = p1; + parray[p].p_to_list[ppend].whofrom = p; + + parray[p1].p_from_list[p1pend].param1 = wt; + parray[p1].p_from_list[p1pend].param2 = winc; + parray[p1].p_from_list[p1pend].param3 = bt; + parray[p1].p_from_list[p1pend].param4 = binc; + parray[p1].p_from_list[p1pend].param5 = rated; + parray[p1].p_from_list[p1pend].param6 = white; + strcpy(parray[p1].p_from_list[p1pend].char1, category); + strcpy(parray[p1].p_from_list[p1pend].char2, board); + parray[p1].p_from_list[p1pend].type = PEND_MATCH; + parray[p1].p_from_list[p1pend].whoto = p1; + parray[p1].p_from_list[p1pend].whofrom = p; + + if (pendfrom >= 0) { + pprintf(p, "Declining offer from %s and offering new match parameters.\n", parray[p1].name); + pprintf(p1, "\n%s declines your match offer a match with these parameters:", parray[p].name); + } + if (pendto >= 0) { + pprintf(p, "Updating match request to: "); + pprintf(p1, "\n%s updates the match request.\n", parray[p].name); + } else { + pprintf(p, "Issuing: "); + pprintf(p1, "\n", parray[p].name); + } + + pprintf(p, "%s (%s) %s", parray[p].name, + ratstrii(GetRating(&parray[p], type), parray[p].registered), + colorstr[white + 1]); + pprintf_highlight(p, "%s", parray[p1].name); + pprintf(p, " (%s) %s%s.\n", + ratstrii(GetRating(&parray[p1], type), parray[p1].registered), + game_str(rated, wt * 60, winc, bt * 60, binc, category, board), + adjustr[adjourned]); + pprintf(p1, "Challenge: "); + pprintf_highlight(p1, "%s", parray[p].name); + pprintf(p1, " (%s) %s", ratstrii(GetRating(&parray[p], type), parray[p].registered), colorstr[white + 1]); + pprintf(p1, "%s (%s) %s%s.\n", parray[p1].name, + ratstrii(GetRating(&parray[p1], type), parray[p1].registered), + game_str(rated, wt * 60, winc, bt * 60, binc, category, board), + adjustr[adjourned]); + if (parray[p1].bell == 1) + pprintf_noformat(p1, "\007"); + + if (bh) { + pprintf(pp, "\nYour bughouse partner issuing %s (%s) %s", + parray[p].name, ratstrii(GetRating(&parray[p], type), + parray[p].registered), colorstr[white + 1]); + pprintf_highlight(pp, "%s", parray[p1].name); + pprintf(pp, " (%s) %s.\n", + ratstrii(GetRating(&parray[p1], type), parray[p1].registered), + game_str(rated, wt * 60, winc, bt * 60, binc, category, board)); + pprintf(pp, "Your game would be "); + pprintf_highlight(pp, "%s", parray[pp1].name); + pprintf_prompt(pp, " (%s) %s%s (%s) %s.\n", + ratstrii(GetRating(&parray[pp1], type), parray[pp1].registered), + colorstr[white + 1], parray[pp].name, + ratstrii(GetRating(&parray[pp], type), parray[pp].registered), + game_str(rated, wt * 60, winc, bt * 60, binc, category, board)); + if (parray[pp].bell == 1) + pprintf_noformat(pp, "\007"); + + pprintf(pp1, "\nYour bughouse partner was challenged "); + pprintf_highlight(pp1, "%s", parray[p].name); + pprintf(pp1, " (%s) %s", ratstrii(GetRating(&parray[p], type), parray[p].registered), colorstr[white + 1]); + pprintf(pp1, "%s (%s) %s.\n", parray[p1].name, + ratstrii(GetRating(&parray[p1], type), parray[p1].registered), + game_str(rated, wt * 60, winc, bt * 60, binc, category, board)); + pprintf(pp1, "Your game would be %s (%s) %s", parray[pp1].name, + ratstrii(GetRating(&parray[pp1], type), parray[pp1].registered), + colorstr[white + 1]); + pprintf_highlight(pp1, "%s", parray[pp].name); + pprintf_prompt(pp1, " (%s) %s.\n", + ratstrii(GetRating(&parray[pp], type), parray[pp].registered), + game_str(rated, wt * 60, winc, bt * 60, binc, category, board)); + if (parray[pp1].bell == 1) + pprintf_noformat(pp1, "\007"); + } + + if (in_list(p, L_COMPUTER, parray[p].name)) { + pprintf(p1, "--** %s is a ", parray[p].name); + pprintf_highlight(p1, "computer"); + pprintf(p1, " **--\n"); + } + if (in_list(p, L_COMPUTER, parray[p1].name)) { + pprintf(p, "--** %s is a ", parray[p1].name); + pprintf_highlight(p, "computer"); + pprintf(p, " **--\n"); + } + if (in_list(p, L_ABUSER, parray[p].name)) { + pprintf(p1, "--** %s is in the ", parray[p].name); + pprintf_highlight(p1, "abuser"); + pprintf(p1, " list **--\n"); + } + if (in_list(p, L_ABUSER, parray[p1].name)) { + pprintf(p, "--** %s is in the ", parray[p1].name); + pprintf_highlight(p, "abuser"); + pprintf(p, " list **--\n"); + } + 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); + } + pprintf_prompt(p1, "You can \"accept\" or \"decline\", or propose different parameters.\n"); + return COM_OK; +} + +PUBLIC int com_accept(int p, param_list param) +{ + int acceptNum = -1; + int from; + int type = -1; + int p1; + + if (parray[p].num_from == 0) { + pprintf(p, "You have no offers to accept.\n"); + return COM_OK; + } + if (param[0].type == TYPE_NULL) { + if (parray[p].num_from != 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; + } + acceptNum = 0; + } else if (param[0].type == TYPE_INT) { + if ((param[0].val.integer < 1) || (param[0].val.integer > parray[p].num_from)) { + pprintf(p, "Out of range. Use \"pending\" to see the list of offers.\n"); + return COM_OK; + } + acceptNum = param[0].val.integer - 1; + } else if (param[0].type == TYPE_WORD) { + if (!strcmp(param[0].val.word, "draw")) { + type = PEND_DRAW; + } else if (!strcmp(param[0].val.word, "pause")) { + type = PEND_PAUSE; + } else if (!strcmp(param[0].val.word, "adjourn")) { + type = PEND_ADJOURN; + } else if (!strcmp(param[0].val.word, "abort")) { + type = PEND_ABORT; + } else if (!strcmp(param[0].val.word, "takeback")) { + type = PEND_TAKEBACK; + } else if (!strcmp(param[0].val.word, "simmatch")) { + type = PEND_SIMUL; + } else if (!strcmp(param[0].val.word, "switch")) { + type = PEND_SWITCH; + } else if (!strcmp(param[0].val.word, "partner")) { + type = PEND_PARTNER; + } + +#if 0 /* I don't think 'accept all' makes sense. -- hersco */ + if (!strcmp(param[0].val.word, "all")) { + while (parray[p].num_from != 0) { + pcommand(p, "accept 1"); + } + return COM_OK; + } +#endif + + if (type >= 0) { + if ((acceptNum = player_find_pendfrom(p, -1, type)) < 0) { + pprintf(p, "There are no pending %s offers.\n", param[0].val.word); + return COM_OK; + } + } else { /* Word must be a name */ + 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 ((acceptNum = player_find_pendfrom(p, p1, -1)) < 0) { + pprintf(p, "There are no pending offers from %s.\n", parray[p1].name); + return COM_OK; + } + } + } + from = parray[p].p_from_list[acceptNum].whofrom; + + switch (parray[p].p_from_list[acceptNum].type) { + case PEND_MATCH: + accept_match(p, from); + return (COM_OK); + break; + case PEND_DRAW: + pcommand(p, "draw"); + break; + case PEND_PAUSE: + pcommand(p, "pause"); + break; + case PEND_ABORT: + pcommand(p, "abort"); + break; + case PEND_TAKEBACK: + pcommand(p, "takeback %d", parray[p].p_from_list[acceptNum].param1); + break; + case PEND_SIMUL: + pcommand(p, "simmatch %s", parray[from].name); + break; + case PEND_SWITCH: + pcommand(p, "switch"); + break; + case PEND_ADJOURN: + pcommand(p, "adjourn"); + break; + case PEND_PARTNER: + pcommand(p, "partner %s", parray[from].name); + break; + } + return COM_OK_NOPROMPT; +} + +int WordToOffer (int p, char *Word, int *type, int *p1) +{ + /* Convert draw adjourn match takeback abort pause + simmatch switch partner or to offer type. */ + 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, "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; +} + +PUBLIC int com_decline(int p, param_list param) +{ + int declineNum; + int p1 = -1, type = -1; + int count; + + if (parray[p].num_from == 0) { + pprintf(p, "You have no pending offers from other players.\n"); + return COM_OK; + } + if (param[0].type == TYPE_NULL) { + if (parray[p].num_from == 1) { + p1 = parray[p].p_from_list[0].whofrom; + type = parray[p].p_from_list[0].type; + } else { + pprintf(p, "You have more than one pending offer. Please specify which one\nyou wish to decline.\n'Pending' will give you the list.\n"); + return COM_OK; + } + } else { + if (param[0].type == TYPE_WORD) { + if (!WordToOffer (p, param[0].val.word, &type, &p1)) + return COM_OK; + } else { /* Must be an integer */ + declineNum = param[0].val.integer - 1; + if (declineNum >= parray[p].num_from || declineNum < 0) { + pprintf(p, "Invalid offer number. Must be between 1 and %d.\n", parray[p].num_from); + return COM_OK; + } + p1 = parray[p].p_from_list[declineNum].whofrom; + type = parray[p].p_from_list[declineNum].type; + } + } + count = player_decline_offers(p, p1, type); + if (count != 1) + pprintf(p, "%d offers declined\n", count); + return COM_OK; +} + +PUBLIC int com_withdraw(int p, param_list param) +{ + int withdrawNum; + int p1 = -1, type = -1; + int count; + + if (parray[p].num_to == 0) { + pprintf(p, "You have no pending offers to other players.\n"); + return COM_OK; + } + if (param[0].type == TYPE_NULL) { + if (parray[p].num_to == 1) { + p1 = parray[p].p_to_list[0].whoto; + type = parray[p].p_to_list[0].type; + } else { + pprintf(p, "You have more than one pending offer. Please specify which one\nyou wish to withdraw.\n'Pending' will give you the list.\n"); + return COM_OK; + } + } else { + if (param[0].type == TYPE_WORD) { + if (!WordToOffer (p, param[0].val.word, &type, &p1)) + return COM_OK; + } else { /* Must be an integer */ + withdrawNum = param[0].val.integer - 1; + if (withdrawNum >= parray[p].num_to || withdrawNum < 0) { + pprintf(p, "Invalid offer number. Must be between 1 and %d.\n", parray[p].num_to); + return COM_OK; + } + p1 = parray[p].p_to_list[withdrawNum].whoto; + type = parray[p].p_to_list[withdrawNum].type; + } + } + count = player_withdraw_offers(p, p1, type); + if (count != 1) + pprintf(p, "%d offers withdrawn\n", count); + return COM_OK; +} + +PUBLIC int com_pending(int p, param_list param) +{ + int i; + + if (!parray[p].num_to) { + pprintf(p, "There are no offers pending TO other players.\n"); + } else { + pprintf(p, "Offers TO other players:\n"); + for (i = 0; i < parray[p].num_to; i++) { + pprintf(p, " "); + player_pend_print(p, &parray[p].p_to_list[i]); + } + } + if (!parray[p].num_from) { + pprintf(p, "\nThere are no offers pending FROM other players.\n"); + } else { + pprintf(p, "\nOffers FROM other players:\n"); + for (i = 0; i < parray[p].num_from; i++) { + pprintf(p, " %d: ", i + 1); + player_pend_print(p, &parray[p].p_from_list[i]); + } + pprintf(p, "\nIf you wish to accept any of these offers type 'accept n'\nor just 'accept' if there is only one offer.\n"); + } + return COM_OK; +} diff --git a/FICS/matchproc.h b/FICS/matchproc.h new file mode 100644 index 0000000..8f616ae --- /dev/null +++ b/FICS/matchproc.h @@ -0,0 +1,35 @@ +/* matchproc.h + * + */ + +/* + 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 + (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. +*/ + +/* Revision history: + name yy/mm/dd Change + hersco 95/07/24 Created +*/ + +#ifndef _MATCHPROC_H +#define _MATCHPROC_H + +extern int com_match(); +extern int com_decline(); +extern int com_withdraw(); +extern int com_pending(); +extern int com_accept(); +extern int create_new_match(int, int, int, int, int, int, int, char *, char *, int); + +#endif /* _MATCHPROC_H */ diff --git a/FICS/memmove.c b/FICS/memmove.c new file mode 100644 index 0000000..7f2ee3a --- /dev/null +++ b/FICS/memmove.c @@ -0,0 +1,120 @@ +/*- + * Copyright (c) 1990, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Chris Torek. + * + * 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. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. 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. + */ + +#if defined(LIBC_SCCS) && !defined(lint) +static char sccsid[] = "@(#)bcopy.c 8.1 (Berkeley) 6/4/93"; +#endif /* LIBC_SCCS and not lint */ + +/* #include +*/ +#include + +/* + * sizeof(word) MUST BE A POWER OF TWO + * SO THAT wmask BELOW IS ALL ONES + */ +typedef int word; /* "word" used for optimal copy speed */ + +#define wsize sizeof(word) +#define wmask (wsize - 1) + +/* + * Copy a block of memory, handling overlap. + * This is the routine that actually implements + * (the portable versions of) bcopy, memcpy, and memmove. + */ +void * + memmove(dst0, src0, length) +void *dst0; +const void *src0; +register size_t length; +{ + register char *dst = dst0; + register const char *src = src0; + register size_t t; + + if (length == 0 || dst == src)/* nothing to do */ + goto done; + + /* Macros: loop-t-times; and loop-t-times, t>0 */ +#define TLOOP(s) if (t) TLOOP1(s) +#define TLOOP1(s) do { s; } while (--t) + + if ((unsigned long) dst < (unsigned long) src) { + /* Copy forward. */ + t = (int) src; /* only need low bits */ + if ((t | (int) dst) & wmask) { + /* Try to align operands. This cannot be done unless the low bits + match. */ + if ((t ^ (int) dst) & wmask || length < wsize) + t = length; + else + t = wsize - (t & wmask); + length -= t; + TLOOP1(*dst++ = *src++); + } + /* Copy whole words, then mop up any trailing bytes. */ + t = length / wsize; + TLOOP(*(word *) dst = *(word *) src; + src += wsize; + dst += wsize); + t = length & wmask; + TLOOP(*dst++ = *src++); + } else { + /* Copy backwards. Otherwise essentially the same. Alignment works as + before, except that it takes (t&wmask) bytes to align, not + wsize-(t&wmask). */ + src += length; + dst += length; + t = (int) src; + if ((t | (int) dst) & wmask) { + if ((t ^ (int) dst) & wmask || length <= wsize) + t = length; + else + t &= wmask; + length -= t; + TLOOP1(*--dst = *--src); + } + t = length / wsize; + TLOOP(src -= wsize; + dst -= wsize; + *(word *) dst = *(word *) src); + t = length & wmask; + TLOOP(*--dst = *--src); + } +done: + return (dst0); +} diff --git a/FICS/movecheck.c b/FICS/movecheck.c new file mode 100644 index 0000000..8d62486 --- /dev/null +++ b/FICS/movecheck.c @@ -0,0 +1,1297 @@ +/* movecheck.c + * + */ + +/* + 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 + (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. +*/ + +/* Revision history: + name email yy/mm/dd Change + Richard Nash 93/10/22 Created +*/ + +#include "stdinclude.h" + +#include "common.h" +#include "movecheck.h" +#include "algcheck.h" +#include "board.h" +#include "gamedb.h" +#include "utils.h" +#include "network.h" +#include "playerdb.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 */ +PUBLIC int is_move(char *mstr) +{ + int len = strlen(mstr); + if ((len > 3) && (mstr[len - 2] == '=')) + len -= 2; + + 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); +} + + +PUBLIC int NextPieceLoop(board_t b, int *f, int *r, int color) +{ + while (1) { + (*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; +} + +PUBLIC 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() */ +PRIVATE int legal_pawn_move( 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; +} + +PRIVATE int legal_knight_move(game_state_t * gs, int ff, int fr, int tf, int tr) +{ + int dx, dy; + + dx = ff - tf; + dy = fr - tr; + if ((dx == 2) || (dx == -2)) { + if ((dy == -1) || (dy == 1)) + return 1; + } + if ((dy == 2) || (dy == -2)) { + if ((dx == -1) || (dx == 1)) + return 1; + } + return 0; +} + +PRIVATE int legal_bishop_move(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; +} + +PRIVATE int legal_rook_move(game_state_t * gs, int ff, int fr, int tf, int tr) +{ + int i; + int start, stop; + + if (ff == tf) { + if (((fr - tr) == 1) || ((tr - fr) == 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 (((ff - tf) == 1) || ((tf - ff) == 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; + } +} + +PRIVATE int legal_queen_move(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: */ +PRIVATE int is_square_attacked (game_state_t *gs, int kf, int kr) +{ + 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: +PRIVATE int is_square_attacked(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; +} +*/ + +PRIVATE int legal_king_move(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 (((ff - tf) > 1) || ((tf - ff) > 1)) + return 0; + if (((fr - tr) > 1) || ((tr - fr) > 1)) + return 0; + return 1; +} + +PRIVATE void add_pos(int tof, int tor, int *posf, int *posr, int *numpos) +{ + posf[*numpos] = tof; + posr[*numpos] = tor; + (*numpos)++; +} + +PRIVATE void possible_pawn_moves(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); + } +} + +PRIVATE void possible_knight_moves(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); + } +} + +PRIVATE void possible_bishop_moves(game_state_t * gs, + int onf, int onr, + int *posf, int *posr, int *numpos) +{ + int f, r; + + /* Up Left */ + f = onf; + r = onr; + while (1) { + 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; + while (1) { + 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; + while (1) { + 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; + while (1) { + 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; + } +} + +PRIVATE void possible_rook_moves(game_state_t * gs, + int onf, int onr, + int *posf, int *posr, int *numpos) +{ + int f, r; + + /* Left */ + f = onf; + r = onr; + while (1) { + 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; + while (1) { + 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; + while (1) { + 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; + while (1) { + 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; + } +} + +PRIVATE void possible_queen_moves(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); +} + +PRIVATE void possible_king_moves(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 */ +PUBLIC int legal_move(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; +} + + +/* 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 */ +PRIVATE int move_calculate(game_state_t * gs, move_t * mt, int promote) +{ + 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; +} + +PUBLIC int legal_andcheck_move(game_state_t * gs, + int fFile, int fRank, + int tFile, int tRank) +{ + 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; +} + +PUBLIC int in_check(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) { + fprintf(stderr, "FICS: 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; +} + +PRIVATE int has_legal_move(game_state_t * gs) +{ + int i; + int f, r; + int kf,kr; + 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) { + fprintf(stderr, "FICS: 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 && 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]--; + } + +/* don't think this works right... 9.30.95 + printf("NO LEGAL MOVE!\n"); +*/ + fprintf(stderr, "FICS: NO LEGAL MOVE!\n"); + return 0; +} + +/* This will end up being a very complicated function */ +PUBLIC int parse_move(char *mstr, game_state_t * gs, move_t * mt, int promote) +{ + int type = is_move(mstr); + int result; + + 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; + } + return move_calculate(gs, mt, promote); +} + +/* Returns MOVE_OK, MOVE_NOMATERIAL, MOVE_CHECKMATE, or MOVE_STALEMATE */ +/* check_game_status prevents recursion */ +PUBLIC int execute_move(game_state_t * gs, 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 = 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 = 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; +} + +PUBLIC int backup_move(int g, int mode) +{ + game_state_t *gs; + move_t *m, *m1; + int now, i; + + if (garray[g].link >= 0) /*IanO: not implemented for bughouse yet */ + return MOVE_ILLEGAL; + if (garray[g].numHalfMoves < 1) + return MOVE_ILLEGAL; + gs = &garray[g].game_state; + m = (mode==REL_GAME) ? &garray[g].moveList[garray[g].numHalfMoves - 1] : + &garray[g].examMoveList[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 < garray[g].numHalfMoves - 1; i += 2) { + m1 = (mode==REL_GAME) ? &garray[g].moveList[i] : &garray[g].examMoveList[i]; + if ((m1->fromFile == 0) && (m1->fromRank == 0)) + break; + } + if (i == garray[g].numHalfMoves - 1) + gs->wqrmoved = 0; + } + if ((m->fromFile == 7) && (m->fromRank == 0)) { + for (i = 2; i < garray[g].numHalfMoves - 1; i += 2) { + m1 = (mode==REL_GAME) ? &garray[g].moveList[i] : &garray[g].examMoveList[i]; + if ((m1->fromFile == 7) && (m1->fromRank == 0)) + break; + } + if (i == garray[g].numHalfMoves - 1) + gs->wkrmoved = 0; + } + } else { + if ((m->fromFile == 0) && (m->fromRank == 7)) { + for (i = 3; i < garray[g].numHalfMoves - 1; i += 2) { + m1 = (mode==REL_GAME) ? &garray[g].moveList[i] : &garray[g].examMoveList[i]; + if ((m1->fromFile == 0) && (m1->fromRank == 0)) + break; + } + if (i == garray[g].numHalfMoves - 1) + gs->bqrmoved = 0; + } + if ((m->fromFile == 7) && (m->fromRank == 7)) { + for (i = 3; i < garray[g].numHalfMoves - 1; i += 2) { + m1 = (mode==REL_GAME) ? &garray[g].moveList[i] : &garray[g].examMoveList[i]; + if ((m1->fromFile == 7) && (m1->fromRank == 0)) + break; + } + if (i == 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 < garray[g].numHalfMoves - 1; i += 2) { + m1 = (mode==REL_GAME) ? &garray[g].moveList[i] : &garray[g].examMoveList[i]; + if ((m1->fromFile == 4) && (m1->fromRank == 0)) + break; + } + if (i == garray[g].numHalfMoves - 1) + gs->wkmoved = 0; + } + } else { + if ((m->fromFile == 4) && (m->fromRank == 7)) { + for (i = 3; i < garray[g].numHalfMoves - 1; i += 2) { + m1 = (mode==REL_GAME) ? &garray[g].moveList[i] : &garray[g].examMoveList[i]; + if ((m1->fromFile == 4) && (m1->fromRank == 7)) + break; + } + if (i == 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 (garray[g].status != GAME_EXAMINE) { + game_update_time(g); + } + garray[g].numHalfMoves--; + if (garray[g].status != GAME_EXAMINE) { + if (garray[g].wInitTime) { /* Don't update times in untimed games */ + now = tenth_secs(); + +#ifdef TIMESEAL + + if (m->color == WHITE) { + if (con[parray[garray[g].white].socket].timeseal) { /* white uses timeseal? */ + garray[g].wRealTime += (m->tookTime * 100); + garray[g].wRealTime -= (garray[g].wIncrement * 100); + garray[g].wTime = garray[g].wRealTime / 100; + if (con[parray[garray[g].black].socket].timeseal) { /* opp uses timeseal? */ + garray[g].bTime = garray[g].bRealTime / 100; + } else { /* opp has no timeseal */ + garray[g].bTime += (garray[g].lastDecTime - garray[g].lastMoveTime); + } + } else { /* white has no timeseal */ + garray[g].wTime += m->tookTime; + garray[g].wTime -= garray[g].wIncrement; + if (con[parray[garray[g].black].socket].timeseal) { /* opp uses timeseal? */ + garray[g].bTime = garray[g].bRealTime / 100; + } else { /* opp has no timeseal */ + garray[g].bTime += (garray[g].lastDecTime - garray[g].lastMoveTime); + } + } + } else { + if (con[parray[garray[g].black].socket].timeseal) { /* black uses timeseal? */ + garray[g].bRealTime += (m->tookTime * 100); + garray[g].bRealTime -= (garray[g].wIncrement * 100); + garray[g].bTime = garray[g].bRealTime / 100; + if (con[parray[garray[g].white].socket].timeseal) { /* opp uses timeseal? */ + garray[g].wTime = garray[g].wRealTime / 100; + } else { /* opp has no timeseal */ + garray[g].wTime += (garray[g].lastDecTime - garray[g].lastMoveTime); + } + } else { /* black has no timeseal */ + garray[g].bTime += m->tookTime; + if (!garray[g].bIncrement) + garray[g].bTime -= garray[g].wIncrement; + else + garray[g].bTime -= garray[g].bIncrement; + if (con[parray[garray[g].white].socket].timeseal) { /* opp uses timeseal? */ + garray[g].wTime = garray[g].wRealTime / 100; + } else { /* opp has no timeseal */ + garray[g].wTime += (garray[g].lastDecTime - garray[g].lastMoveTime); + } + } + } + +#else + + if (m->color == WHITE) { + garray[g].wTime += m->tookTime; + garray[g].wTime = garray[g].wTime - garray[g].wIncrement; + garray[g].bTime += (garray[g].lastDecTime - garray[g].lastMoveTime); + } else { + garray[g].bTime += m->tookTime; + if (!garray[g].bIncrement) + garray[g].bTime = garray[g].bTime - garray[g].wIncrement; + else + garray[g].bTime = garray[g].bTime - garray[g].bIncrement; + garray[g].wTime += (garray[g].lastDecTime - garray[g].lastMoveTime); + } + +#endif + + if (garray[g].numHalfMoves == 0) + garray[g].timeOfStart = now; + garray[g].lastMoveTime = now; + 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 (garray[g].numHalfMoves > 0) { + m1 = (mode==REL_GAME) ? &garray[g].moveList[garray[g].numHalfMoves - 1] : + &garray[g].examMoveList[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/FICS/movecheck.h b/FICS/movecheck.h new file mode 100644 index 0000000..53a1712 --- /dev/null +++ b/FICS/movecheck.h @@ -0,0 +1,61 @@ +/* movecheck.h + * + */ + +/* + 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 + (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. +*/ + +/* Revision history: + name email yy/mm/dd Change + Richard Nash 93/10/22 Created +*/ + +#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')) + +#if !defined(_BOARD_H) +#include "board.h" +#endif + +extern int is_move(char *); +extern int parse_move(char *, game_state_t *, move_t *, int); +extern int execute_move(game_state_t *, move_t *, int); +extern int backup_move(int, int); + +/* Some useful chess utilities */ +extern int NextPieceLoop(board_t, int *, int *, int); +extern int InitPieceLoop(board_t, int *, int *, int); +extern int legal_move(game_state_t *, int, int, int, int); +extern int legal_andcheck_move(game_state_t *, int, int, int, int); +extern int in_check(game_state_t *); + +#endif /* _MOVECHECK_H */ diff --git a/FICS/multicol.c b/FICS/multicol.c new file mode 100644 index 0000000..8d52b04 --- /dev/null +++ b/FICS/multicol.c @@ -0,0 +1,153 @@ +/* multicol.c + * + */ + +/* + 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 + (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. +*/ + +/* Revision history: + name email yy/mm/dd Change + Richard Nash 93/10/22 Created +*/ + +#include "stdinclude.h" + +#include "common.h" +#include "multicol.h" +#include "utils.h" +#include "rmalloc.h" + +/* grimm */ +#if defined(SGI) +#else +/* char *strchr( char *s, int c); */ +#endif +/* added for warning */ + +PUBLIC multicol *multicol_start(int maxArray) +{ + int i; + multicol *m; + + m = (multicol *) rmalloc(sizeof(multicol)); + m->arraySize = maxArray; + m->num = 0; + m->strArray = (char **) rmalloc(sizeof(char *) * m->arraySize); + for (i = 0; i < m->arraySize; i++) + m->strArray[i] = NULL; + return m; +} + +PUBLIC 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; +} + +PUBLIC int multicol_store_sorted(multicol * m, char *str) +/* use this instead of milticol_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; +} + +PUBLIC 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; + 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; +} + +PUBLIC int multicol_end(multicol * m) +{ + int i; + for (i = 0; i < m->num; i++) + rfree(m->strArray[i]); + rfree(m->strArray); + rfree(m); + return 0; +} diff --git a/FICS/multicol.c.orig b/FICS/multicol.c.orig new file mode 100644 index 0000000..8d52b04 --- /dev/null +++ b/FICS/multicol.c.orig @@ -0,0 +1,153 @@ +/* multicol.c + * + */ + +/* + 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 + (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. +*/ + +/* Revision history: + name email yy/mm/dd Change + Richard Nash 93/10/22 Created +*/ + +#include "stdinclude.h" + +#include "common.h" +#include "multicol.h" +#include "utils.h" +#include "rmalloc.h" + +/* grimm */ +#if defined(SGI) +#else +/* char *strchr( char *s, int c); */ +#endif +/* added for warning */ + +PUBLIC multicol *multicol_start(int maxArray) +{ + int i; + multicol *m; + + m = (multicol *) rmalloc(sizeof(multicol)); + m->arraySize = maxArray; + m->num = 0; + m->strArray = (char **) rmalloc(sizeof(char *) * m->arraySize); + for (i = 0; i < m->arraySize; i++) + m->strArray[i] = NULL; + return m; +} + +PUBLIC 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; +} + +PUBLIC int multicol_store_sorted(multicol * m, char *str) +/* use this instead of milticol_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; +} + +PUBLIC 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; + 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; +} + +PUBLIC int multicol_end(multicol * m) +{ + int i; + for (i = 0; i < m->num; i++) + rfree(m->strArray[i]); + rfree(m->strArray); + rfree(m); + return 0; +} diff --git a/FICS/multicol.h b/FICS/multicol.h new file mode 100644 index 0000000..5acb850 --- /dev/null +++ b/FICS/multicol.h @@ -0,0 +1,41 @@ +/* multicol.h + * + */ + +/* + 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 + (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. +*/ + +/* Revision history: + name email yy/mm/dd Change + Richard Nash 93/10/22 Created +*/ + +#ifndef _MULTICOL_H +#define _MULTICOL_H + +typedef struct _multicol +{ + int arraySize; + int num; + char **strArray; +} multicol; + +extern multicol *multicol_start(int); +extern int multicol_store(multicol *, char *); +extern int multicol_store_sorted(multicol *, char *); +extern int multicol_pprint(multicol *, int, int, int); +extern int multicol_end(multicol *); + +#endif /* _MULTICOL_H */ diff --git a/FICS/network.c b/FICS/network.c new file mode 100644 index 0000000..2480a69 --- /dev/null +++ b/FICS/network.c @@ -0,0 +1,622 @@ +/* network.c + * + */ + +#include "stdinclude.h" + +#include +#include +#include +#include + +#include "ficsmain.h" +#include "common.h" +#include "utils.h" +#include "playerdb.h" +#include "network.h" +#include "rmalloc.h" +#include "config.h" +#ifdef TIMESEAL +#include "timeseal.h" +#endif + +extern int errno; + +PRIVATE int sockfd = 0; /* The socket */ +PRIVATE int numConnections = 0; +/* Sparse array */ +PUBLIC connection con[512]; + +PUBLIC int no_file; +PUBLIC int max_connections; + +/* Index == fd, for sparse array, quick lookups! wasted memory :( */ +PUBLIC int findConnection(int fd) +{ + if (con[fd].status == NETSTAT_EMPTY) + return -1; + else + return fd; +} + +PUBLIC int net_addConnection(int fd, unsigned int fromHost) +{ + int noblock = 1; + + if (findConnection(fd) >= 0) { + fprintf(stderr, "FICS: FD already in connection table!\n"); + return -1; + } + if (numConnections >= max_connections) + return -1; + if (ioctl(fd, FIONBIO, &noblock) == -1) { + fprintf(stderr, "Error setting nonblocking mode errno=%d\n", errno); + } + con[fd].fd = fd; + if (fd != 0) + con[fd].outFd = fd; + else + con[fd].outFd = 1; + con[fd].fromHost = fromHost; + con[fd].status = NETSTAT_CONNECTED; +#ifdef TIMESEAL + con[fd].user[0]='\0'; + con[fd].sys[0]='\0'; + con[fd].timeseal = 0; + con[fd].time = 0; +#endif + con[fd].numPending = 0; + con[fd].processed = 0; + con[fd].outPos = 0; + if (con[fd].sndbuf == NULL) { +#ifdef DEBUG + fprintf(stderr, "FICS: nac(%d) allocating sndbuf.\n", fd); +#endif + con[fd].sndbufpos = 0; + con[fd].sndbufsize = MAX_STRING_LENGTH; + con[fd].sndbuf = rmalloc(MAX_STRING_LENGTH); + } else { +#ifdef DEBUG + fprintf(stderr, "FICS: nac(%d) reusing old sndbuf size %d pos %d.\n", fd, con[fd].sndbufsize, con[fd].sndbufpos); +#endif + } + con[fd].state = 0; + numConnections++; + +#ifdef DEBUG + fprintf(stderr, "FICS: fd: %d connections: %d descriptors: %d \n", fd, numConnections, getdtablesize()); /* sparky 3/13/95 */ +#endif + + return 0; +} + +PRIVATE int remConnection(int fd) +{ + int which; + if ((which = findConnection(fd)) < 0) { + return -1; + } + numConnections--; + con[fd].status = NETSTAT_EMPTY; + if (con[fd].sndbuf == NULL) { + fprintf(stderr, "FICS: remcon(%d) SNAFU, this shouldn't happen.\n", fd); + } else { + if (con[fd].sndbufsize > MAX_STRING_LENGTH) { + con[fd].sndbufsize = MAX_STRING_LENGTH; + con[fd].sndbuf = rrealloc(con[fd].sndbuf, MAX_STRING_LENGTH); + } + if (con[fd].sndbufpos) { /* didn't send everything, bummer */ + con[fd].sndbufpos = 0; + } + } + return 0; +} + +PRIVATE void net_flushme(int which) +{ + int sent; + + sent = send(con[which].outFd, con[which].sndbuf, con[which].sndbufpos, 0); + if (sent == -1) { + if (errno != EPIPE) /* EPIPE = they've disconnected */ + fprintf(stderr, "FICS: net_flushme(%d) couldn't send, errno=%d.\n", which, errno); + con[which].sndbufpos = 0; + } else { + con[which].sndbufpos -= sent; + if (con[which].sndbufpos) + memmove(con[which].sndbuf, con[which].sndbuf + sent, con[which].sndbufpos); + } + if (con[which].sndbufsize > MAX_STRING_LENGTH && con[which].sndbufpos < MAX_STRING_LENGTH) { + /* time to shrink the buffer */ + con[which].sndbuf = rrealloc(con[which].sndbuf, MAX_STRING_LENGTH); + con[which].sndbufsize = MAX_STRING_LENGTH; + } +} + +PRIVATE void net_flush_all_connections(void) +{ + int which; + fd_set writefds; + struct timeval to; + + FD_ZERO(&writefds); + for (which = 0; which < MAX_PLAYER; which++) + if (con[which].status == NETSTAT_CONNECTED && con[which].sndbufpos) + FD_SET(con[which].outFd, &writefds); + + to.tv_usec = 0; + to.tv_sec = 0; + select(no_file, NULL, &writefds, NULL, &to); + for (which = 0; which < MAX_PLAYER; which++) { + if (FD_ISSET(con[which].outFd, &writefds)) { + net_flushme(which); + } + } +} + +PRIVATE void net_flush_connection(int fd) +{ + int which; + fd_set writefds; + struct timeval to; + + if (((which = findConnection(fd)) >= 0) && (con[which].sndbufpos)) { + FD_ZERO(&writefds); + FD_SET(con[which].outFd, &writefds); + to.tv_usec = 0; + to.tv_sec = 0; + select(no_file, NULL, &writefds, NULL, &to); + if (FD_ISSET(con[which].outFd, &writefds)) { + net_flushme(which); + } + } + return; +} + +PRIVATE int sendme(int which, char *str, int len) +{ + int i, count; + fd_set writefds; + struct timeval to; + count = len; + + while ((i = ((con[which].sndbufsize - con[which].sndbufpos) < len) ? (con[which].sndbufsize - con[which].sndbufpos) : len) > 0) { + memmove(con[which].sndbuf + con[which].sndbufpos, str, i); + con[which].sndbufpos += i; + if (con[which].sndbufpos == con[which].sndbufsize) { + + FD_ZERO(&writefds); + FD_SET(con[which].outFd, &writefds); + to.tv_usec = 0; + to.tv_sec = 0; + select(no_file, NULL, &writefds, NULL, &to); + if (FD_ISSET(con[which].outFd, &writefds)) { + net_flushme(which); + } else { + /* time to grow the buffer */ + con[which].sndbufsize += MAX_STRING_LENGTH; + con[which].sndbuf = rrealloc(con[which].sndbuf, con[which].sndbufsize); + } + } + str += i; + len -= i; + } + 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 +*/ +PUBLIC int net_send_string(int fd, char *str, int format) +{ + 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 = LINE_WIDTH - con[which].outPos))) { /* word wrap */ + i = j; + 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); + con[which].outPos = 4; + while (str[i] == ' ') /* eat the leading spaces after we wrap */ + i++; + } else { + sendme(which, str, i); + con[which].outPos += i; + } + str += i; + } else { /* non-printable stuff handled here */ + switch (*str) { + case '\t': + sendme(which, " ", 8 - (con[which].outPos & 7)); + con[which].outPos &= ~7; + if (con[which].outPos += 8 >= LINE_WIDTH) + con[which].outPos = 0; + break; + case '\n': + sendme(which, "\n\r", 2); + con[which].outPos = 0; + break; + case '\033': + 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. + */ +PUBLIC int readline2(char *com, int who) +{ + unsigned char *start, *s, *d; + int howmany, state, fd, pending; + + static unsigned char will_tm[] = {IAC, WILL, TELOPT_TM, '\0'}; + static unsigned char will_sga[] = {IAC, WILL, TELOPT_SGA, '\0'}; + static unsigned char ayt[] = "[Responding to AYT: Yes, I'm here.]\n"; + + state = con[who].state; + if ((state == 2) || (state > 4)) { + fprintf(stderr, "FICS: state screwed for con[%d], this is a bug.\n", who); + state = 0; + } + s = start = con[who].inBuf; + pending = con[who].numPending; + fd = 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 (con[who].processed) { /* nothing new and nothing old */ + return (0); + } else { /* nothing new, but some unprocessed old */ + howmany = 0; + } + } + if (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); + con[who].state = 0; + con[who].numPending = howmany; + con[who].processed = 0; + con[who].outPos = 0; + return (1); + } 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); + con[who].state = 0; + con[who].numPending = howmany; + con[who].processed = 0; + con[who].outPos = 0; + return (1); + } else if (*s >= ' ') + *(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; + con[who].state = state; + con[who].numPending = d - start; + con[who].processed = 1; + if (con[who].numPending == MAX_STRING_LENGTH - 1) { /* buffer full */ + *d = '\0'; + strcpy(com, start); + con[who].state = 0; + con[who].numPending = 0; + con[who].processed = 0; + return (1); + } + return (0); +} + +/* +PRIVATE int readline(int who) +{ + int e, fd = con[who].fd; + char *t = con[who].inBuf; + int recvCount; + int totalCount = 0; + unsigned char c; + static unsigned char will_tm[] = {IAC, WILL, TELOPT_TM, '\0'}; + static unsigned char will_sga[] = {IAC, WILL, TELOPT_SGA, '\0'}; + + t += con[who].numPending; + + while ((recvCount = recv(fd, (char *) &c, 1, 0)) == 1) { + totalCount += recvCount; + if (c == IAC) { + recvCount = recv(fd, (char *) &c, 1, 0); + if (recvCount == 1) { + totalCount += recvCount; + switch (c) { + case IP: + c = '\3'; + break; + case DO: + recvCount = recv(fd, (char *) &c, 1, 0); + if (recvCount == 1) { + totalCount += recvCount; + if (c == TELOPT_TM) { + send(fd, (char *) will_tm, strlen((char *) will_tm), 0); + } else if (c == TELOPT_SGA) { + send(fd, (char *) will_sga, strlen((char *) will_sga), 0); + } + } + c = '\0'; + break; + case DONT: + recvCount = recv(fd, (char *) &c, 1, 0); + break; + c = '\0'; + default: + recvCount = recv(fd, (char *) &c, 1, 0); + c = '\0'; + break; + } + } + } + if (c != '\r' && c > 2) { + if (isprint(c) || (c == '\n')) { + *t++ = c; + con[who].numPending++; + } + } + if (c == '\n' || con[who].numPending >= MAX_STRING_LENGTH - 1) { + *--t = '\0'; + con[who].numPending = 0; + con[fd].outPos = 0; + return 1; + } + } + + *t = '\0'; + e = ((totalCount == 0) || (errno != EWOULDBLOCK)) ? -1 : 0; + return (e); +} +*/ + +PUBLIC int net_init(int port) +{ + int i; + int opt; + struct sockaddr_in serv_addr; + struct linger lingeropt; + +/* Although we have 256 descriptors to work with for opening files, + * we can only use 126 for sockets under SunOS 4.x.x socket libs. Using + * glibc can get you up to 256 again. Many OS's can do more than that! + * Sparky 9/20/95 + */ + no_file = getdtablesize(); + if (no_file > MAX_PLAYER + 6) + no_file = MAX_PLAYER + 6; + max_connections = no_file - 6; + for (i = 0; i < no_file; i++) { + con[i].status = NETSTAT_EMPTY; + con[i].sndbuf = NULL; + con[i].sndbufsize = con[i].sndbufpos = 0; + } + /* Open a TCP socket (an Internet stream socket). */ + if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { + fprintf(stderr, "FICS: 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(sockfd, SOL_SOCKET, SO_REUSEADDR, (char *) &opt, sizeof(opt)); + opt = 1; + setsockopt(sockfd, SOL_SOCKET, SO_KEEPALIVE, (char *) &opt, sizeof(opt)); + lingeropt.l_onoff = 0; + lingeropt.l_linger = 0; + setsockopt(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(sockfd, (struct sockaddr *) & serv_addr, sizeof(serv_addr)) < 0) { + fprintf(stderr, "FICS: can't bind local address. errno=%d\n", errno); + return -1; + } + opt = 1; + ioctl(sockfd, FIONBIO, &opt); + listen(sockfd, 5); + return 0; +} + +PUBLIC void net_close(void) +{ + int i; + for (i = 0; i < no_file; i++) { + if (con[i].status != NETSTAT_EMPTY) + net_close_connection(con[i].fd); + } +} + +PUBLIC void net_close_connection(int fd) +{ + if (con[fd].status == NETSTAT_CONNECTED) + net_flush_connection(fd); + if (!remConnection(fd)) { + if (fd > 2) + close(fd); + } +} + +PUBLIC void turn_echo_on(int fd) +{ + static unsigned char wont_echo[] = {IAC, WONT, TELOPT_ECHO, '\0'}; + + send(fd, (char *) wont_echo, strlen((char *) wont_echo), 0); +} + +PUBLIC 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); +} + +PUBLIC unsigned int net_connected_host(int fd) +{ + int which; + + if ((which = findConnection(fd)) < 0) { + fprintf(stderr, "FICS: FD not in connection table!\n"); + return -1; + } + return con[which].fromHost; +} + +PUBLIC void ngc2(char *com, int timeout) +{ + struct sockaddr_in cli_addr; + int cli_len = (int) sizeof(struct sockaddr_in); + + int fd, loop, nfound, lineComplete; + fd_set readfds; + struct timeval to; + + while ((fd = accept(sockfd, (struct sockaddr *) & cli_addr, &cli_len)) != -1) + { + if (net_addConnection(fd, cli_addr.sin_addr.s_addr)) { + fprintf(stderr, "FICS is full. fd = %d.\n", fd); + psend_raw_file(fd, mess_dir, MESS_FULL); + close(fd); + } else + process_new_connection(fd, net_connected_host(fd)); + } + + if (errno != EWOULDBLOCK) + fprintf(stderr, "FICS: Problem with accept(). errno=%d\n", errno); + + net_flush_all_connections(); + + FD_ZERO(&readfds); + for (loop = 0; loop < no_file; loop++) + if (con[loop].status != NETSTAT_EMPTY) + FD_SET(con[loop].fd, &readfds); + + to.tv_usec = 0; + to.tv_sec = timeout; + nfound = select(no_file, &readfds, NULL, NULL, &to); + for (loop = 0; loop < no_file; loop++) { + if (con[loop].status != NETSTAT_EMPTY) { + fd = con[loop].fd; + lineComplete = readline2(com, fd); + if (lineComplete == 0) /* partial line: do nothing with it */ + continue; + if (lineComplete > 0) { /* complete line: process it */ +#ifdef TIMESEAL + if (!(parseInput(com, &con[loop]))) continue; +#endif + if (process_input(fd, com) != COM_LOGOUT) { + net_flush_connection(fd); + continue; + } + } + /* Disconnect anyone who gets here */ + process_disconnection(fd); + net_close_connection(fd); + } + } +} + +PUBLIC int net_consize(void) +{ + int i, total; + + total = sizeof(con); + for (i=0; i < no_file; i++) + total += con[i].sndbufsize; + + return(total); +} diff --git a/FICS/network.c.orig b/FICS/network.c.orig new file mode 100644 index 0000000..eed60c8 --- /dev/null +++ b/FICS/network.c.orig @@ -0,0 +1,657 @@ +/* network.c + * + */ + +#include "stdinclude.h" + +#include +#include +#include +#include + +#include "common.h" +#include "utils.h" +#include "playerdb.h" +#include "network.h" +#include "rmalloc.h" +#ifdef TIMESEAL +#include "timeseal.h" +#endif + +extern int errno; + +/* grimm */ +#if defined(SGI) +#else +/* +int send(int s, char *msg, int len, int flags); +int recv(int s, char *buf, int len, int flags); +char *memset(char *s, int c, int n); +int setsockopt( int s, int level, int optname, char *optval, int optlen); +int accept(int s, struct sockaddr *addr, size_t *addrlen); +void *memmove(void *dst0, const void *src0, register size_t length); +int bind(int s, struct sockaddr *name, int namelen); +int select(int width, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, + struct timeval *timeout); +int listen(int s, int level); +*/ +#endif +/* added for warning */ + +PRIVATE int sockfd = 0; /* The socket */ +PRIVATE int numConnections = 0; +/* Sparse array */ +PUBLIC connection con[256]; + +PUBLIC int no_file; +PUBLIC int max_connections; + +/* Index == fd, for sparse array, quick lookups! wasted memory :( */ +PUBLIC int findConnection(int fd) +{ + if (con[fd].status == NETSTAT_EMPTY) + return -1; + else + return fd; +} + +PUBLIC int net_addConnection(int fd, unsigned int fromHost) +{ + int noblock = 1; + + if (findConnection(fd) >= 0) { + fprintf(stderr, "FICS: FD already in connection table!\n"); + return -1; + } + if (numConnections == max_connections) + return -1; + if (ioctl(fd, FIONBIO, &noblock) == -1) { + fprintf(stderr, "Error setting nonblocking mode errno=%d\n", errno); + } + con[fd].fd = fd; + if (fd != 0) + con[fd].outFd = fd; + else + con[fd].outFd = 1; + con[fd].fromHost = fromHost; + con[fd].status = NETSTAT_CONNECTED; +#ifdef TIMESEAL + con[fd].user[0]='\0'; + con[fd].sys[0]='\0'; + con[fd].timeseal = 0; + con[fd].time = 0; +#endif + con[fd].numPending = 0; + con[fd].processed = 0; + con[fd].outPos = 0; + if (con[fd].sndbuf == NULL) { +#ifdef DEBUG + fprintf(stderr, "FICS: nac(%d) allocating sndbuf.\n", fd); +#endif + con[fd].sndbufpos = 0; + con[fd].sndbufsize = MAX_STRING_LENGTH; + con[fd].sndbuf = rmalloc(MAX_STRING_LENGTH); + } else { +#ifdef DEBUG + fprintf(stderr, "FICS: nac(%d) reusing old sndbuf size %d pos %d.\n", fd, con[fd].sndbufsize, con[fd].sndbufpos); +#endif + } + con[fd].state = 0; + numConnections++; + +#ifdef DEBUG + fprintf(stderr, "FICS: fd: %d connections: %d descriptors: %d \n", fd, numConnections, getdtablesize()); /* sparky 3/13/95 */ +#endif + + return 0; +} + +PRIVATE int remConnection(int fd) +{ + int which; + if ((which = findConnection(fd)) < 0) { + return -1; + } + numConnections--; + con[fd].status = NETSTAT_EMPTY; + if (con[fd].sndbuf == NULL) { + fprintf(stderr, "FICS: remcon(%d) totally screwed, this shouldn't happen.\n", fd); + } else { + if (con[fd].sndbufsize > MAX_STRING_LENGTH) { + con[fd].sndbufsize = MAX_STRING_LENGTH; + con[fd].sndbuf = rrealloc(con[fd].sndbuf, MAX_STRING_LENGTH); + } + if (con[fd].sndbufpos) { /* didn't send everything, bummer */ + con[fd].sndbufpos = 0; + } + } + return 0; +} + +PRIVATE void net_flushme(int which) +{ + int sent; + + sent = send(con[which].outFd, con[which].sndbuf, con[which].sndbufpos, 0); + if (sent == -1) { + if (errno != EPIPE) /* EPIPE = they've disconnected */ + fprintf(stderr, "FICS: net_flushme(%d) couldn't send, errno=%d.\n", which, errno); + con[which].sndbufpos = 0; + } else { + con[which].sndbufpos -= sent; + if (con[which].sndbufpos) + memmove(con[which].sndbuf, con[which].sndbuf + sent, con[which].sndbufpos); + } + if (con[which].sndbufsize > MAX_STRING_LENGTH && con[which].sndbufpos < MAX_STRING_LENGTH) { + /* time to shrink the buffer */ + con[which].sndbuf = rrealloc(con[which].sndbuf, MAX_STRING_LENGTH); + con[which].sndbufsize = MAX_STRING_LENGTH; + } +} + +PRIVATE void net_flush_all_connections(void) +{ + int which; + fd_set writefds; + struct timeval to; + + FD_ZERO(&writefds); + for (which = 0; which < max_connections; which++) + if (con[which].status == NETSTAT_CONNECTED && con[which].sndbufpos) + FD_SET(con[which].outFd, &writefds); + + to.tv_usec = 0; + to.tv_sec = 0; + select(no_file, NULL, &writefds, NULL, &to); + for (which = 0; which < max_connections; which++) { + if (FD_ISSET(con[which].outFd, &writefds)) { + net_flushme(which); + } + } +} + +PRIVATE void net_flush_connection(int fd) +{ + int which; + fd_set writefds; + struct timeval to; + + if (((which = findConnection(fd)) >= 0) && (con[which].sndbufpos)) { + FD_ZERO(&writefds); + FD_SET(con[which].outFd, &writefds); + to.tv_usec = 0; + to.tv_sec = 0; + select(no_file, NULL, &writefds, NULL, &to); + if (FD_ISSET(con[which].outFd, &writefds)) { + net_flushme(which); + } + } + return; +} + +PRIVATE int sendme(int which, char *str, int len) +{ + int i, count; + fd_set writefds; + struct timeval to; + count = len; + + while ((i = ((con[which].sndbufsize - con[which].sndbufpos) < len) ? (con[which].sndbufsize - con[which].sndbufpos) : len) > 0) { + memmove(con[which].sndbuf + con[which].sndbufpos, str, i); + con[which].sndbufpos += i; + if (con[which].sndbufpos == con[which].sndbufsize) { + + FD_ZERO(&writefds); + FD_SET(con[which].outFd, &writefds); + to.tv_usec = 0; + to.tv_sec = 0; + select(no_file, NULL, &writefds, NULL, &to); + if (FD_ISSET(con[which].outFd, &writefds)) { + net_flushme(which); + } else { + /* time to grow the buffer */ + con[which].sndbufsize += MAX_STRING_LENGTH; + con[which].sndbuf = rrealloc(con[which].sndbuf, con[which].sndbufsize); + } + } + str += i; + len -= i; + } + 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 +*/ +PUBLIC int net_send_string(int fd, char *str, int format) +{ + 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 = LINE_WIDTH - con[which].outPos))) { /* word wrap */ + i = j; + 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); + con[which].outPos = 4; + while (str[i] == ' ') /* eat the leading spaces after we wrap */ + i++; + } else { + sendme(which, str, i); + con[which].outPos += i; + } + str += i; + } else { /* non-printable stuff handled here */ + switch (*str) { + case '\t': + sendme(which, " ", 8 - (con[which].outPos & 7)); + con[which].outPos &= ~7; + if (con[which].outPos += 8 >= LINE_WIDTH) + con[which].outPos = 0; + break; + case '\n': + sendme(which, "\n\r", 2); + con[which].outPos = 0; + break; + case '\033': + 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. + */ +PUBLIC int readline2(char *com, int who) +{ + unsigned char *start, *s, *d; + int howmany, state, fd, pending; + + static unsigned char will_tm[] = {IAC, WILL, TELOPT_TM, '\0'}; + static unsigned char will_sga[] = {IAC, WILL, TELOPT_SGA, '\0'}; + static unsigned char ayt[] = "[Responding to AYT: Yes, I'm here.]\n"; + + state = con[who].state; + if ((state == 2) || (state > 4)) { + fprintf(stderr, "FICS: state screwed for con[%d], this is a bug.\n", who); + state = 0; + } + s = start = con[who].inBuf; + pending = con[who].numPending; + fd = 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 (con[who].processed) { /* nothing new and nothing old */ + return (0); + } else { /* nothing new, but some unprocessed old */ + howmany = 0; + } + } + if (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); + con[who].state = 0; + con[who].numPending = howmany; + con[who].processed = 0; + con[who].outPos = 0; + return (1); + } 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); + con[who].state = 0; + con[who].numPending = howmany; + con[who].processed = 0; + con[who].outPos = 0; + return (1); + } else if (*s >= ' ') + *(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; + con[who].state = state; + con[who].numPending = d - start; + con[who].processed = 1; + if (con[who].numPending == MAX_STRING_LENGTH - 1) { /* buffer full */ + *d = '\0'; + strcpy(com, start); + con[who].state = 0; + con[who].numPending = 0; + con[who].processed = 0; + return (1); + } + return (0); +} + +/* +PRIVATE int readline(int who) +{ + int e, fd = con[who].fd; + char *t = con[who].inBuf; + int recvCount; + int totalCount = 0; + unsigned char c; + static unsigned char will_tm[] = {IAC, WILL, TELOPT_TM, '\0'}; + static unsigned char will_sga[] = {IAC, WILL, TELOPT_SGA, '\0'}; + + t += con[who].numPending; + + while ((recvCount = recv(fd, (char *) &c, 1, 0)) == 1) { + totalCount += recvCount; + if (c == IAC) { + recvCount = recv(fd, (char *) &c, 1, 0); + if (recvCount == 1) { + totalCount += recvCount; + switch (c) { + case IP: + c = '\3'; + break; + case DO: + recvCount = recv(fd, (char *) &c, 1, 0); + if (recvCount == 1) { + totalCount += recvCount; + if (c == TELOPT_TM) { + send(fd, (char *) will_tm, strlen((char *) will_tm), 0); + } else if (c == TELOPT_SGA) { + send(fd, (char *) will_sga, strlen((char *) will_sga), 0); + } + } + c = '\0'; + break; + case DONT: + recvCount = recv(fd, (char *) &c, 1, 0); + break; + c = '\0'; + default: + recvCount = recv(fd, (char *) &c, 1, 0); + c = '\0'; + break; + } + } + } + if (c != '\r' && c > 2) { + if (isprint(c) || (c == '\n')) { + *t++ = c; + con[who].numPending++; + } + } + if (c == '\n' || con[who].numPending >= MAX_STRING_LENGTH - 1) { + *--t = '\0'; + con[who].numPending = 0; + con[fd].outPos = 0; + return 1; + } + } + + *t = '\0'; + e = ((totalCount == 0) || (errno != EWOULDBLOCK)) ? -1 : 0; + return (e); +} +*/ + +PUBLIC int net_init(int port) +{ + int i; + int opt; + struct sockaddr_in serv_addr; + struct linger lingeropt; + + no_file = getdtablesize(); +/* Although we have 256 descriptors to work with for opening sockets, + * we can only use 126 maximum of them for some reason... built in + * limitation of the socket libs? Sparky 3/13/95 + */ + if (no_file > MAX_PLAYER + 10) + no_file = MAX_PLAYER + 10; + max_connections = no_file - 10; + for (i = 0; i < no_file; i++) { + con[i].status = NETSTAT_EMPTY; + con[i].sndbuf = NULL; + con[i].sndbufsize = con[i].sndbufpos = 0; + } + /* Open a TCP socket (an Internet stream socket). */ + if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { + fprintf(stderr, "FICS: 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(sockfd, SOL_SOCKET, SO_REUSEADDR, (char *) &opt, sizeof(opt)); + opt = 1; + setsockopt(sockfd, SOL_SOCKET, SO_KEEPALIVE, (char *) &opt, sizeof(opt)); + lingeropt.l_onoff = 0; + lingeropt.l_linger = 0; + setsockopt(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(sockfd, (struct sockaddr *) & serv_addr, sizeof(serv_addr)) < 0) { + fprintf(stderr, "FICS: can't bind local address. errno=%d\n", errno); + return -1; + } + opt = 1; + ioctl(sockfd, FIONBIO, &opt); + listen(sockfd, 5); + return 0; +} + +PUBLIC void net_close(void) +{ + int i; + for (i = 0; i < no_file; i++) { + if (con[i].status != NETSTAT_EMPTY) + net_close_connection(con[i].fd); + } +} + +PUBLIC void net_close_connection(int fd) +{ + if (con[fd].status == NETSTAT_CONNECTED) + net_flush_connection(fd); + if (!remConnection(fd)) { + if (fd > 2) + close(fd); + } +} + +PUBLIC void turn_echo_on(int fd) +{ + static unsigned char wont_echo[] = {IAC, WONT, TELOPT_ECHO, '\0'}; + + send(fd, (char *) wont_echo, strlen((char *) wont_echo), 0); +} + +PUBLIC 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); +} + +PUBLIC unsigned int net_connected_host(int fd) +{ + int which; + + if ((which = findConnection(fd)) < 0) { + fprintf(stderr, "FICS: FD not in connection table!\n"); + return -1; + } + return con[which].fromHost; +} + +PUBLIC void ngc2(char *com, int timeout) +{ + struct sockaddr_in cli_addr; + size_t cli_len = sizeof(struct sockaddr_in); + + int fd, loop, nfound, lineComplete; + fd_set readfds; + struct timeval to; + + while ((fd = accept(sockfd, (struct sockaddr *) & cli_addr, &cli_len)) != -1) { + if (net_addConnection(fd, cli_addr.sin_addr.s_addr)) { + char *woo = +"FICS is currently full. Please try one of the following sites:\n\r\n\r" +"E-FICS: krypton.daimi.aau.dk 5000 (130.225.18.157 5000) Main EURO server\n\r" +"D-FICS: dds.hacktic.nl 5000 (193.78.33.69 5000) Dutch server\n\r" +"B-FICS: holly.csv.warwick.ac.uk 5000 (137.205.192.12 5000) British server\n\r" +"?-FICS: chess.unix-ag.uni-kl.de 5000 (131.246.89.3 5000) German server\n\r" +"M-FICS: wisdom.weizmann.ac.il 5000 (132.76.80.77 5000) Mid-east server\n\r\n\r"; + fprintf(stderr, "FICS is full. fd = %d\n"); + write (fd, woo, strlen(woo)); + sleep(1); + close(fd); + } else { +/* int opt, optlen; + + opt = 1024; + setsockopt(fd, SOL_SOCKET, SO_RCVBUF, (char *)&opt, sizeof(opt)); + opt = 8192; + setsockopt(fd, SOL_SOCKET, SO_SNDBUF, (char *) &opt, sizeof(opt)); + optlen = sizeof(opt); + getsockopt(fd, SOL_SOCKET, SO_SNDBUF, (char *)&opt, &optlen); + fprintf(stderr, "%d sndbuf: %d", fd, opt); + optlen = sizeof(opt); + getsockopt(fd, SOL_SOCKET, SO_RCVBUF, (char *)&opt, &optlen); + fprintf(stderr, " rcvbuf: %d\n", opt); +*/ + process_new_connection(fd, net_connected_host(fd)); + } + } + if (errno != EWOULDBLOCK) + fprintf(stderr, "FICS: Problem with accept(). errno=%d\n", errno); + + net_flush_all_connections(); + + FD_ZERO(&readfds); + for (loop = 0; loop < no_file; loop++) + if (con[loop].status != NETSTAT_EMPTY) + FD_SET(con[loop].fd, &readfds); + + to.tv_usec = 0; + to.tv_sec = timeout; + nfound = select(no_file, &readfds, NULL, NULL, &to); + for (loop = 0; loop < no_file; loop++) { + if (con[loop].status != NETSTAT_EMPTY) { + fd = con[loop].fd; + lineComplete = readline2(com, fd); + if (lineComplete == 0) /* partial line: do nothing with it */ + continue; + if (lineComplete > 0) { /* complete line: process it */ +#ifdef TIMESEAL + if (!(parseInput(com, &con[loop]))) continue; +#endif + if (process_input(fd, com) != COM_LOGOUT) { + net_flush_connection(fd); + continue; + } + } + /* Disconnect anyone who gets here */ + process_disconnection(fd); + net_close_connection(fd); + } + } +} + +PUBLIC int net_consize(void) +{ + int i, total; + + total = sizeof(con); + for (i=0; i < no_file; i++) + total += con[i].sndbufsize; + + return(total); +} diff --git a/FICS/network.h b/FICS/network.h new file mode 100644 index 0000000..7ff2a22 --- /dev/null +++ b/FICS/network.h @@ -0,0 +1,89 @@ +/* network.h + * + */ + +/* + 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 + (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. +*/ + +/* Revision history: + name email yy/mm/dd Change + Richard Nash 93/10/22 Created +*/ + +#ifndef _NETWORK_H +#define _NETWORK_H + +#include "command.h" /* For MAX_STRING_LENGTH */ + +#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 + +#define NETSTAT_EMPTY 0 +#define NETSTAT_CONNECTED 1 +#define NETSTAT_IDENT 2 + +typedef struct _connection { + int fd; + int outFd; + unsigned int fromHost; + int status; +#ifdef TIMESEAL + char user[512]; + char sys[512]; + int timeseal; + int time; +#endif +/* Input buffering */ + int numPending; + int processed; + unsigned char inBuf[MAX_STRING_LENGTH]; +/* Output buffering */ + int sndbufsize; /* size of send buffer (this changes) */ + int sndbufpos; /* position in send buffer */ + char *sndbuf; /* our send buffer, or NULL if none yet */ + int outPos; /* column count */ + int state; /* 'telnet state' */ +/* identd stuff */ + char ident[20]; + int mypal; +} connection; + +extern int no_file; +extern int max_connections; +extern connection con[512]; + +extern int findConnection(); +extern int net_init(int); +extern void net_close(void); +extern void ngc2(char *, int); +extern void net_close_connection(int); +extern int net_send_string(int, char *, int); +extern void turn_echo_on(int); +extern void turn_echo_off(int); +extern unsigned int net_connected_host(int); +extern int net_addConnection(int, unsigned int); +extern int net_consize(void); +extern int readline2(char *, int); +#endif /* _NETWORK_H */ diff --git a/FICS/obsproc.c b/FICS/obsproc.c new file mode 100644 index 0000000..e24a116 --- /dev/null +++ b/FICS/obsproc.c @@ -0,0 +1,1528 @@ +/* obsproc.c + * + */ + +/* + 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 + (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. +*/ + +/* Revision history: + name email yy/mm/dd Change + Dave Herscovici 95/11/26 Created +*/ + +#include "stdinclude.h" + +#include "common.h" +#include "command.h" +#include "ficsmain.h" +#include "config.h" +#include "playerdb.h" +#include "gamedb.h" +#include "gameproc.h" +#include "obsproc.h" +#include "movecheck.h" +#include "utils.h" +#include "ratings.h" +#include "rmalloc.h" +#include "comproc.h" +#include "matchproc.h" +#include "formula.h" +#include "eco.h" +#include "network.h" + +PUBLIC 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 (parray[*p1].game < 0) + pprintf(p, "%s is not playing a game.\n", parray[*p1].name); + return 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; + } +} + +PRIVATE int gamesortfunc(const void *i, const void *j) +{ +/* examine mode games moved to top of "games" output */ + return (GetRating(&parray[garray[*(int *) i].white], garray[*(int *) i].type) + + GetRating(&parray[garray[*(int *) i].black], garray[*(int *) i].type) - + ((garray[*(int *) i].status == GAME_EXAMINE) ? 10000 : 0) - + GetRating(&parray[garray[*(int *) j].white], garray[*(int *) j].type) - + GetRating(&parray[garray[*(int *) j].black], garray[*(int *) j].type) + + ((garray[*(int *) j].status == GAME_EXAMINE) ? 10000 : 0)); +} + + +PUBLIC 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 = rmalloc(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 < g_num; i++) { + if ((garray[i].status != GAME_ACTIVE) && (garray[i].status != GAME_EXAMINE)) + continue; + if ((selected) && (selected != i + 1)) + continue; /* not selected game number */ + wp = garray[i].white; + bp = garray[i].black; + if ((!selected) && s && strncasecmp(s, garray[i].white_name, slen) && + strncasecmp(s, 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 = garray[i].white; + bp = garray[i].black; + board_calc_strength(&garray[i].game_state, &ws, &bs); + if (garray[i].status != GAME_EXAMINE) { + pprintf_noformat(p, "%2d %4s %-11.11s %4s %-10.10s [%c%c%c%3d %3d] ", + i + 1, + ratstrii(GetRating(&parray[wp], + garray[i].type), + parray[wp].registered), + parray[wp].name, + ratstrii(GetRating(&parray[bp], + garray[i].type), + parray[bp].registered), + parray[bp].name, + (garray[i].private) ? 'p' : ' ', + *bstr[garray[i].type], + *rstr[garray[i].rated], + garray[i].wInitTime / 600, + garray[i].wIncrement / 10); + game_update_time(i); + pprintf_noformat(p, "%6s -", + tenth_str((garray[i].wTime > 0 ? garray[i].wTime : 0), 0)); + pprintf_noformat(p, "%6s (%2d-%2d) %c: %2d\n", + tenth_str((garray[i].bTime > 0 ? garray[i].bTime : 0), 0), + ws, bs, + (garray[i].game_state.onMove == WHITE) ? 'W' : 'B', + garray[i].game_state.moveNum); + } else { + pprintf_noformat(p, "%2d (Exam. %4d %-11.11s %4d %-10.10s) [%c%c%c%3d %3d] ", + i + 1, + garray[i].white_rating, + garray[i].white_name, + garray[i].black_rating, + garray[i].black_name, + (garray[i].private) ? 'p' : ' ', + *bstr[garray[i].type], + *rstr[garray[i].rated], + garray[i].wInitTime / 600, + garray[i].wIncrement / 10); + pprintf_noformat(p, "%c: %2d\n", + (garray[i].game_state.onMove == WHITE) ? 'W' : 'B', + 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"); + } + rfree(sortedgames); + } + return COM_OK; +} + +PRIVATE int do_observe(int p, int obgame) +{ + if ((garray[obgame].private) && (parray[p].adminLevel < ADMIN_ADMIN)) { + pprintf(p, "Sorry, game %d is a private game.\n", obgame + 1); + return COM_OK; + } + if ((garray[obgame].white == p) || (garray[obgame].black == p)) { + if (garray[obgame].status != GAME_EXAMINE) { + 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; +} + +PUBLIC void unobserveAll(int p) +{ + int i; + + for (i = 0; i < parray[p].num_observe; i++) { + pprintf(p, "Removing game %d from observation list.\n", parray[p].observe_list[i] + 1); + } + parray[p].num_observe = 0; + return; +} + +PUBLIC 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; +} + +PUBLIC int com_observe(int p, param_list param) +{ + int i; + int p1, obgame; + + if ((parray[p].game >=0) &&(garray[parray[p].game].status == GAME_EXAMINE)) { + pprintf(p, "You are still examining a game.\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 >= g_num) || ((garray[obgame].status != GAME_ACTIVE) && + (garray[obgame].status != GAME_EXAMINE))) { + pprintf(p, "There is no such game.\n"); + return COM_OK; + } + if ((p1 >= 0) && parray[p1].simul_info.numBoards) { + for (i = 0; i < parray[p1].simul_info.numBoards; i++) + if (parray[p1].simul_info.boards[i] >= 0) + do_observe(p, parray[p1].simul_info.boards[i]); + } else { + do_observe(p, obgame); + } + return COM_OK; +} + +PUBLIC int com_allobservers(int p, param_list param) +{ + 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 = g_num; + } else if ((obgame >= g_num) || ((obgame < g_num) + && ((garray[obgame].status != GAME_ACTIVE) + && (garray[obgame].status != GAME_EXAMINE)))) { + 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 ((garray[g].status == GAME_ACTIVE) && + ((parray[p].adminLevel > 0) || (garray[g].private == 0))) { + for (first = 1, p1 = 0; p1 < p_num; p1++) { + if ((parray[p1].status != PLAYER_EMPTY) && (player_is_observe(p1, g))) { + if (first) { + pprintf(p, "Observing %2d [%s vs. %s]:", + g + 1, + parray[garray[g].white].name, + parray[garray[g].black].name); + first = 0; + } + pprintf(p, " %s%s", (parray[p1].game >=0) ? "#" : "", parray[p1].name); + } + } + if (!first) + pprintf(p, "\n"); + } + } + + /* list games being examined last */ + + for (g = start; g < end; g++) { + if ((garray[g].status == GAME_EXAMINE) && + ((parray[p].adminLevel > 0) || (garray[g].private == 0))) { + for (first = 1, p1 = 0; p1 < p_num; p1++) { + if ((parray[p1].status != PLAYER_EMPTY) && (player_is_observe(p1, g) || + (parray[p1].game == g))) { + if (first) { + if (strcmp(garray[g].white_name, garray[g].black_name)) { + pprintf(p, "Examining %2d [%s vs %s]:", g + 1, + garray[g].white_name, garray[g].black_name); + } else { + pprintf(p, "Examining %2d (scratch):", g + 1); + } + first = 0; + } + pprintf(p, " %s%s", (parray[p1].game == g) ? "#" : "", parray[p1].name); + } + } + if (!first) + pprintf(p, "\n"); + } + } + return COM_OK; +} + +PUBLIC int com_unexamine(int p, param_list param) +{ + int g, p1, flag = 0; + + if ((parray[p].game <0) ||(garray[parray[p].game].status != GAME_EXAMINE)) { + pprintf(p, "You are not examining any games.\n"); + return COM_OK; + } + g = parray[p].game; + parray[p].game = -1; + for (p1 = 0; p1 < p_num; p1++) { + if (parray[p1].status != PLAYER_PROMPT) + continue; + if ((parray[p1].game == g) &&(p != p1)) { + /* ok - there are other examiners to take over the game */ + flag = 1; + } + if ((player_is_observe(p1, g)) || (parray[p1].game == g)) { + pprintf(p1, "%s stopped examining game %d.\n", parray[p].name, g + 1); + } + } + if (!flag) { + for (p1 = 0; p1 < p_num; p1++) { + if (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); + return COM_OK; +} + +PUBLIC int com_mexamine(int p, param_list param) +{ + int g, p1, p2; + + if ((parray[p].game <0) ||(garray[parray[p].game].status != GAME_EXAMINE)) { + 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 = parray[p].game; + if (!player_is_observe(p1, g)) { + pprintf(p, "%s must observe the game you are analysing.\n", parray[p1].name); + return COM_OK; + } else { + if (parray[p1].game >=0) { + pprintf(p, "%s is already analysing the game.\n", parray[p1].name); + return COM_OK; + } + /* if we get here - let's make him examiner of the game */ + unobserveAll(p1); /* fix for Xboard */ + player_decline_offers(p1, -1, PEND_MATCH); + player_withdraw_offers(p1, -1, PEND_MATCH); + player_withdraw_offers(p1, -1, PEND_SIMUL); + + 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 < p_num; p2++) { + if (parray[p2].status != PLAYER_PROMPT) + continue; + if (p2 == p1) + continue; + if ((player_is_observe(p2, g)) || (parray[p2].game == g)) { + pprintf_prompt(p2, "%s is now examiner of game %d.\n", parray[p1].name, g + 1); + } + } + } + return COM_OK; +} + +PUBLIC int com_moves(int p, param_list param) +{ + int g; + int p1; + + if (param[0].type == TYPE_NULL) { + if (parray[p].game >=0) { + g = parray[p].game; + } else if (parray[p].num_observe) { + for (g = 0; g < parray[p].num_observe; g++) { + pprintf(p, "%s\n", movesToString(parray[p].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 >= g_num) || ((garray[g].status != GAME_ACTIVE) && + (garray[g].status != GAME_EXAMINE))) { + pprintf(p, "There is no such game.\n"); + return COM_OK; + } + if ((garray[g].white != p) && (garray[g].black != p) && (garray[g].private) && (parray[p].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; +} + +PUBLIC int com_mailmoves(int p, param_list param) +{ + int g; + int p1; + char subj[81]; + + if (!parray[p].registered) { + pprintf (p,"Unregistered players cannot use mailmoves.\n"); + return COM_OK; + } + + if (param[0].type == TYPE_NULL) { + if (parray[p].game >=0) { + g = parray[p].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 >= g_num) || ((garray[g].status != GAME_ACTIVE) && (garray[g].status != GAME_EXAMINE))) { + pprintf(p, "There is no such game.\n"); + return COM_OK; + } + if ((garray[g].white != p) && (garray[g].black != p) && (garray[g].private) && (parray[p].adminLevel < ADMIN_ADMIN)) { + pprintf(p, "Sorry, that is a private game.\n"); + return COM_OK; + } + sprintf(subj, "FICS game report %s vs %s", garray[g].white_name, garray[g].black_name); + if (mail_string_to_user(p, subj, movesToString(g, parray[p].pgn))) { + pprintf(p, "Moves NOT mailed, perhaps your address is incorrect.\n"); + } else { + pprintf(p, "Moves mailed.\n"); + } + return COM_OK; +} + +PRIVATE 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 && (!parray[p].registered)) { + 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, + parray[p1].login[0], parray[p1].login, STATS_GAMES); + fp = fopen(fname, "r"); /* old moves now looks in history to save mem - DAV */ + + if (!fp) { + pprintf (p,"There is no old game for %s.\n", 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",parray[p1].name,count); + + if (mail) + pcommand (p,"mailstored %s %d",parray[p1].name,count); + else + pcommand (p,"smoves %s %d",parray[p1].name,count); + + if (!connected) + player_remove(p1); + + return COM_OK; +} + +PUBLIC int com_oldmoves(int p, param_list param) +{ + return old_mail_moves(p , 0, param); +} + +PUBLIC int com_mailoldmoves(int p, param_list param) +{ + return old_mail_moves(p , 1, param); +} + +PUBLIC void ExamineScratch(int p, param_list param) +{ + char category[100], board[100], parsebuf[100]; + char *val; + int confused = 0; + int g = game_new(); + + unobserveAll(p); + + player_decline_offers(p, -1, PEND_MATCH); + player_withdraw_offers(p, -1, PEND_MATCH); + player_withdraw_offers(p, -1, PEND_SIMUL); + + garray[g].wInitTime = garray[g].wIncrement = 0; + garray[g].bInitTime = garray[g].bIncrement = 0; + garray[g].timeOfStart = tenth_secs(); + garray[g].wTime = garray[g].bTime = 0; + garray[g].rated = 0; + garray[g].clockStopped = 0; + garray[g].type = TYPE_UNTIMED; + garray[g].white = garray[g].black = p; + garray[g].status = GAME_EXAMINE; + garray[g].startTime = tenth_secs(); + garray[g].lastMoveTime = garray[g].startTime; + garray[g].lastDecTime = garray[g].startTime; + garray[g].totalHalfMoves = 0; + + parray[p].side = WHITE; /* oh well... */ + parray[p].game = g; + + category[0] = '\0'; + board[0] = '\0'; + + if ((param[0].val.string != parray[p].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; + } + + pprintf(p, "Starting a game in examine (scratch) mode.\n"); + + if (category[0]) { + pprintf(p, "Loading from catagory: %s, board: %s.\n", category, board); + } + + if (board_init(&garray[g].game_state, category, board)) { + pprintf(p, "PROBLEM LOADING BOARD. Game Aborted.\n"); + fprintf(stderr, "FICS: PROBLEM LOADING BOARD. Game Aborted.\n"); + return; + } + + garray[g].game_state.gameNum = g; + strcpy(garray[g].white_name, parray[p].name); + strcpy(garray[g].black_name, parray[p].name); + garray[g].white_rating = garray[g].black_rating = parray[p].s_stats.rating; + + send_boards(g); + MakeFENpos(g, garray[g].FENstartPos); +} + +PRIVATE int ExamineStored(FILE * fp, int p, char *filename) +{ + int g; + char category[100], board[100]; + game *gg; + + unobserveAll(p); + + player_decline_offers(p, -1, PEND_MATCH); + player_withdraw_offers(p, -1, PEND_MATCH); + player_withdraw_offers(p, -1, PEND_SIMUL); + + g = game_new(); + gg = &garray[g]; + category[0] = '\0'; + board[0] = '\0'; + if (board_init(&gg->game_state, category, board)) { + pprintf(p, "PROBLEM LOADING BOARD. Game Aborted.\n"); + fprintf(stderr, "FICS: PROBLEM LOADING BOARD %s %s. Game Aborted.\n", + category, board); + return -1; + } + gg->status = GAME_EXAMINE; + if (ReadGameAttrs(fp, filename, g) < 0) { + pprintf(p, "Gamefile is corrupt; please notify an admin.\n"); + 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; + + parray[p].side = WHITE; /* oh well... */ + parray[p].game = g; + + send_boards(g); + MakeFENpos(g, garray[g].FENstartPos); + + return g; +} + +PRIVATE void ExamineAdjourned(int p, int p1, int p2) +{ + FILE *fp; + char filename[1024]; + char *p1Login, *p2Login; + int g; + + p1Login = parray[p1].login; + p2Login = parray[p2].login; + + sprintf(filename, "%s/%c/%s-%s", adj_dir, *p1Login, p1Login, p2Login); + fp = fopen(filename, "r"); + if (!fp) { + sprintf(filename, "%s/%c/%s-%s", adj_dir, *p2Login, p1Login, p2Login); + fp = fopen(filename, "r"); + if (!fp) { + sprintf(filename, "%s/%c/%s-%s", adj_dir, *p2Login, p2Login, p1Login); + fp = fopen(filename, "r"); + if (!fp) { + sprintf(filename, "%s/%c/%s-%s", adj_dir, *p1Login, p2Login, p1Login); + fp = fopen(filename, "r"); + if (!fp) { + pprintf(p, "No stored game between \"%s\" and \"%s\".\n", + parray[p1].name, parray[p2].name); + return; + } + } + } + } + g = ExamineStored(fp, p, filename); + fclose(fp); + + if (g >= 0) { + if (garray[g].white_name[0] == '\0') + strcpy(garray[g].white_name, p1Login); + if (garray[g].black_name[0] == '\0') + strcpy(garray[g].black_name, p2Login); + } + return; +} + +PRIVATE char *FindHistory(int p, int p1, int game) +{ + FILE *fpHist; + static char fileName[MAX_FILENAME_SIZE]; + int index; + long when; + + sprintf(fileName, "%s/player_data/%c/%s.%s", stats_dir, + parray[p1].login[0], parray[p1].login, STATS_GAMES); + fpHist = fopen(fileName, "r"); + if (fpHist == NULL) { + pprintf(p, "No games in history for %s.\n", parray[p1].name); + return(NULL); + } + do { + fscanf(fpHist, "%d %*c %*d %*c %*d %*s %*s %*d %*d %*d %*d %*s %*s %ld", + &index, &when); + } while (!feof(fpHist) && index != game); + + if (feof(fpHist)) { + pprintf(p, "There is no history game %d for %s.\n", game, parray[p1].name); + fclose(fpHist); + return(NULL); + } + fclose(fpHist); + + sprintf(fileName, "%s/%ld/%ld", hist_dir, when % 100, when); + return(fileName); +} + +/* I want to know how game ended */ + +PRIVATE char *FindHistory2(int p, int p1,int game,char* End) +{ + FILE *fpHist; + static char fileName[MAX_FILENAME_SIZE]; + int index; + long when; + + sprintf(fileName, "%s/player_data/%c/%s.%s", stats_dir, + parray[p1].login[0], parray[p1].login, STATS_GAMES); + fpHist = fopen(fileName, "r"); + if (fpHist == NULL) { + pprintf(p, "No games in history for %s.\n", parray[p1].name); + return(NULL); + } + do { + fscanf(fpHist, "%d %*c %*d %*c %*d %*s %*s %*d %*d %*d %*d %*s %s %ld", + &index, End, &when); + } while (!feof(fpHist) && index != game); + + if (feof(fpHist)) { + pprintf(p, "There is no history game %d for %s.\n", game, parray[p1].name); + fclose(fpHist); + return(NULL); + } + fclose(fpHist); + + sprintf(fileName, "%s/%ld/%ld", hist_dir, when % 100, when); + return(fileName); +} + +PRIVATE void ExamineHistory(int p, int p1, int game) +{ + char *fileName; + + fileName = FindHistory(p, p1, game); + if (fileName != NULL) { + FILE *fpGame = fopen(fileName, "r"); + if (fpGame == NULL) { + pprintf(p, "History game %d not available for %s.\n", game, parray[p1].name); + } else { + ExamineStored(fpGame, p, fileName); + fclose(fpGame); + } + } + return; +} + +PRIVATE void ExamineJournal(int p,int p1,char slot) +{ + char fname[MAX_FILENAME_SIZE]; + char* name_from = parray[p1].login; + FILE *fpGame; + + if ((parray[p1].jprivate) && (p != p1) && (parray[p].adminLevel < ADMIN_ADMIN)) { + pprintf (p,"Sorry, this journal is private.\n"); + return; + } + if (((slot - 'a' - 1) > MAX_JOURNAL) && (parray[p1].adminLevel < ADMIN_ADMIN) +&& (!titled_player(p,parray[p1].login))) { + pprintf (p,"%s's maximum journal entry is %c\n",parray[p1].name,toupper((char)(MAX_JOURNAL + 'A' - 1))); + return; + } + + sprintf(fname, "%s/%c/%s.%c", journal_dir, name_from[0],name_from,slot); + fpGame = fopen(fname, "r"); + if (fpGame == NULL) { + pprintf(p, "Journal entry %c is not available for %s.\n", toupper (slot), parray[p1].name); + } else { + ExamineStored(fpGame, p, fname); + fclose(fpGame); + } + return; +} + +PUBLIC int com_examine(int p, param_list param) +{ + int p1, p2 = p, p1conn, p2conn = 1; + char* param2string; + char fname[MAX_FILENAME_SIZE]; + + if ((parray[p].game >=0) &&(garray[parray[p].game].status == GAME_EXAMINE)) { + pprintf(p, "You are already examining a game.\n"); + } else if (parray[p].game >=0) { + pprintf(p, "You are playing a game.\n"); + } else if (param[0].type == TYPE_NULL) { + ExamineScratch(p, param); + } else if (param[0].type == TYPE_WORD) { + 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); + 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 */ + param2string = param[1].val.word; + if ((strlen(param2string) == 1) && (isalpha(param2string[0]))) { + ExamineJournal(p,p1,param2string[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; +} + +PUBLIC int com_stored(int p, param_list param) +{ + DIR *dirp; +#ifdef USE_DIRENT + struct dirent *dp; +#else + struct direct *dp; +#endif + 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", adj_dir, parray[p1].login[0]); + dirp = opendir(dname); + if (!dirp) { + pprintf(p, "Player %s has no games stored.\n", parray[p1].name); + if (!connected) + player_remove(p1); + return COM_OK; + } + pprintf(p, "Stored games for %s:\n", parray[p1].name); + for (dp = readdir(dirp); dp != NULL; dp = readdir(dirp)) { + if (file_has_pname(dp->d_name, parray[p1].login)) { + pprintf(p, " %s vs. %s\n", file_wplayer(dp->d_name), file_bplayer(dp->d_name)); + } + } + + closedir(dirp); + pprintf(p, "\n"); + if (!connected) + player_remove(p1); + return COM_OK; +} + +PRIVATE void stored_mail_moves(int p, int mail, param_list param) +{ + int wp, wconnected, bp, bconnected, gotit = 0; + int g = -1; + char* param2string; + char* name_from; + char* fileName; + char fileName2[MAX_FILENAME_SIZE]; + FILE* fpGame; + + if (mail && (!parray[p].registered)) { + 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); + if (fileName != NULL) { + fpGame = fopen(fileName, "r"); + if (fpGame == NULL) { + pprintf(p, "History game %d not available for %s.\n", param[1].val.integer, parray[wp].name); + } else { + g = game_new(); + if (ReadGameAttrs(fpGame, fileName, 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; + param2string = param[1].val.word; + if ((strlen(param2string) == 1) && (isalpha(param2string[0]))) { + if ((parray[wp].jprivate) && (parray[p].adminLevel < ADMIN_ADMIN) && (p != wp)) { + pprintf (p,"Sorry, the journal from which you are trying to fetch is private.\n"); + } else { + if (((param2string[0] - 'a' - 1) > MAX_JOURNAL) && (parray[wp].adminLevel < ADMIN_ADMIN) && (!titled_player(p,parray[wp].login))) { + pprintf (p,"%s's maximum journal entry is %c\n",parray[wp].name,toupper((char)(MAX_JOURNAL + 'A' - 1))); + } else { + sprintf(fileName2, "%s/%c/%s.%c", journal_dir, name_from[0],name_from,param2string[0]); + fpGame = fopen(fileName2, "r"); + if (fpGame == NULL) { + pprintf(p, "Journal entry %c is not available for %s.\n", toupper(param2string[0]), + parray[wp].name); + } else { + g = game_new(); + if (ReadGameAttrs(fpGame, fileName, 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", parray[wp].name, parray[bp].name); + } + if (!bconnected) + player_remove(bp); + } + } + } + if (gotit) { + if (strcasecmp(parray[p].name, garray[g].white_name) && strcasecmp(parray[p] +.name, garray[g].black_name) && garray[g].private && (parray[p].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", parray[wp].name, param[1].val.integer); + else + if ((strlen(param2string) == 1) && (isalpha(param2string[0]))) { + sprintf(subj, "FICS journal game %s vs %s", garray[g].white_name, garray[g].black_name); + } else { + sprintf(subj, "FICS adjourned game %s vs %s", garray[g].white_name, garray[g].black_name); + } + if (mail_string_to_user(p, subj, movesToString(g, parray[p].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 */ + +PUBLIC int com_mailstored(int p, param_list param) +{ + stored_mail_moves(p, 1, param); + return COM_OK; +} + +PUBLIC int com_smoves(int p, param_list param) +{ + stored_mail_moves(p, 0, param); + return COM_OK; +} + +PUBLIC int com_sposition(int p, param_list param) +{ + 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", parray[wp].name, 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) && (garray[g].private) && (parray[p].adminLevel < ADMIN_ADMIN)) { + pprintf(p, "Sorry, that is a private game.\n"); + } else { + garray[g].white = wp; + garray[g].black = bp; + garray[g].startTime = tenth_secs(); + garray[g].lastMoveTime = garray[g].startTime; + garray[g].lastDecTime = garray[g].startTime; + pprintf(p, "Position of stored game %s vs. %s\n", parray[wp].name, parray[bp].name); + send_board_to(g, p); + } + } + game_remove(g); + if (!wconnected) + player_remove(wp); + if (!bconnected) + player_remove(bp); + return COM_OK; +} + +PUBLIC int com_forward(int p, param_list param) +{ + int nHalfMoves = 1; + int g, i; + int p1; + unsigned now; + + if (!((parray[p].game >=0) &&(garray[parray[p].game].status == GAME_EXAMINE))) { + pprintf(p, "You are not examining any games.\n"); + return COM_OK; + } + g = parray[p].game; + if (!strcmp(garray[g].white_name, 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 (garray[g].numHalfMoves > garray[g].revertHalfMove) { + pprintf(p, "No more moves.\n"); + return COM_OK; + } + if (garray[g].numHalfMoves < garray[g].totalHalfMoves) { + for (p1 = 0; p1 < p_num; p1++) { + if (parray[p1].status != PLAYER_PROMPT) + continue; + if (player_is_observe(p1, g) || parray[p1].game == g) { + pprintf(p1, "%s goes forward %d move%s.\n", + parray[p].name, nHalfMoves, (nHalfMoves == 1) ? "" : "s"); + } + } + } + for (i = 0; i < nHalfMoves; i++) { + if (garray[g].numHalfMoves < garray[g].totalHalfMoves) { + execute_move(&garray[g].game_state, &garray[g].moveList[garray[g].numHalfMoves], 1); + if (garray[g].numHalfMoves + 1 > garray[g].examMoveListSize) { + garray[g].examMoveListSize += 20; /* Allocate 20 moves at a + time */ + if (!garray[g].examMoveList) { + garray[g].examMoveList = (move_t *) rmalloc(sizeof(move_t) * garray[g].examMoveListSize); + } else { + garray[g].examMoveList = (move_t *) rrealloc(garray[g].examMoveList, sizeof(move_t) * garray[g].examMoveListSize); + } + } + garray[g].examMoveList[garray[g].numHalfMoves] = garray[g].moveList[garray[g].numHalfMoves]; + garray[g].revertHalfMove++; + garray[g].numHalfMoves++; + } else { + for (p1 = 0; p1 < p_num; p1++) { + if (parray[p1].status != PLAYER_PROMPT) + continue; + if (player_is_observe(p1, g) || parray[p1].game == g) { + pprintf(p1, "End of game.\n"); + } + } + break; + } + } + /* roll back time */ + if (garray[g].game_state.onMove == WHITE) { + garray[g].wTime += (garray[g].lastDecTime - garray[g].lastMoveTime); + } else { + garray[g].bTime += (garray[g].lastDecTime - garray[g].lastMoveTime); + } + now = tenth_secs(); + if (garray[g].numHalfMoves == 0) + garray[g].timeOfStart = now; + garray[g].lastMoveTime = now; + garray[g].lastDecTime = now; + send_boards(g); + return COM_OK; +} + +PUBLIC int com_backward(int p, param_list param) +{ + int nHalfMoves = 1; + int g, i; + int p1; + unsigned now; + + if (!((parray[p].game >=0) &&(garray[parray[p].game].status == GAME_EXAMINE))) { + pprintf(p, "You are not examining any games.\n"); + return COM_OK; + } + g = parray[p].game; + if (param[0].type == TYPE_INT) { + nHalfMoves = param[0].val.integer; + } + if (garray[g].numHalfMoves != 0) { + for (p1 = 0; p1 < p_num; p1++) { + if (parray[p1].status != PLAYER_PROMPT) + continue; + if (player_is_observe(p1, g) || parray[p1].game == g) { + pprintf(p1, "%s backs up %d move%s.\n", + parray[p].name, nHalfMoves, (nHalfMoves == 1) ? "" : "s"); + } + } + } + for (i = 0; i < nHalfMoves; i++) { + if (backup_move(g, REL_EXAMINE) != MOVE_OK) { + for (p1 = 0; p1 < p_num; p1++) { + if (parray[p1].status != PLAYER_PROMPT) + continue; + if (player_is_observe(p1, g) || parray[p1].game == g) { + pprintf(p1, "Beginning of game.\n"); + } + } + + break; + } + } + if (garray[g].numHalfMoves < garray[g].revertHalfMove) { + garray[g].revertHalfMove = garray[g].numHalfMoves; + } + /* roll back time */ + if (garray[g].game_state.onMove == WHITE) { + garray[g].wTime += (garray[g].lastDecTime - garray[g].lastMoveTime); + } else { + garray[g].bTime += (garray[g].lastDecTime - garray[g].lastMoveTime); + } + now = tenth_secs(); + if (garray[g].numHalfMoves == 0) + garray[g].timeOfStart = now; + garray[g].lastMoveTime = now; + garray[g].lastDecTime = now; + send_boards(g); + return COM_OK; +} + +PUBLIC int com_revert(int p, param_list param) +{ + int nHalfMoves = 1; + int g, i; + int p1; + unsigned now; + + if (!((parray[p].game >=0) &&(garray[parray[p].game].status == GAME_EXAMINE))) { + pprintf(p, "You are not examining any games.\n"); + return COM_OK; + } + g = parray[p].game; + nHalfMoves = garray[g].numHalfMoves - garray[g].revertHalfMove; + if (nHalfMoves == 0) { + pprintf(p, "Already at mainline.\n"); + return COM_OK; + } + if (nHalfMoves < 0) { /* eek - should NEVER happen! */ + fprintf(stderr, "OUCH! in com_revert: nHalfMoves < 0\n"); + return COM_OK; + } + for (p1 = 0; p1 < p_num; p1++) { + if (parray[p1].status != PLAYER_PROMPT) + continue; + if (player_is_observe(p1, g) || parray[p1].game == g) { + pprintf(p1, "%s reverts to mainline.\n", parray[p].name); + } + } + for (i = 0; i < nHalfMoves; i++) { + backup_move(g, REL_EXAMINE);/* should never return error */ + } + /* roll back time */ + if (garray[g].game_state.onMove == WHITE) { + garray[g].wTime += (garray[g].lastDecTime - garray[g].lastMoveTime); + } else { + garray[g].bTime += (garray[g].lastDecTime - garray[g].lastMoveTime); + } + now = tenth_secs(); + if (garray[g].numHalfMoves == 0) + garray[g].timeOfStart = now; + garray[g].lastMoveTime = now; + garray[g].lastDecTime = now; + send_boards(g); + return COM_OK; +} + +PUBLIC 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, parray[p1].login[0], + parray[p1].login, STATS_GAMES); + pgames(p, p1, fname); + if (!connected) + player_remove(p1); + return COM_OK; +} + +PUBLIC int com_journal(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; + } + +if (!parray[p1].registered) { + pprintf (p,"Only registered players may keep a journal.\n"); + if (!connected) + player_remove(p1); + return COM_OK; + } + if ((parray[p1].jprivate) && (p != p1) && (parray[p].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, parray[p1].login[0], + parray[p1].login, STATS_JOURNAL); + pjournal(p, p1, fname); + if (!connected) + player_remove(p1); + return COM_OK; +} + +PRIVATE void jsave_journalentry(int p,char save_spot,int p1,char from_spot,char* to_file) + +{ + FILE *Game; + + char fname[MAX_FILENAME_SIZE], fname2[MAX_FILENAME_SIZE]; + char command[MAX_FILENAME_SIZE*2+3]; + char* name_from = parray[p1].login; + char* name_to = parray[p].login; + char WhiteName[MAX_LOGIN_NAME + 1]; + char BlackName[MAX_LOGIN_NAME + 1]; + int WhiteRating; + int BlackRating; + int i,t; + char type[100]; + char eco[100]; + char ending[100]; + char result[100]; + + sprintf(fname, "%s/%c/%s.%c", journal_dir, name_from[0],name_from,from_spot); + Game = fopen(fname, "r"); + if (Game == NULL) { + pprintf(p, "Journal entry %c not available for %s.\n", toupper(from_spot), parray[p1].name); + return; + } + fclose (Game); + + sprintf(fname2, "%s/%c/%s.%c", journal_dir, name_to[0],name_to,save_spot); + unlink (fname2); /* necessarity if cp is hard aliased to cp -i */ + sprintf(command, "cp %s %s",fname,fname2); + + if (system(command)) { /* A little messy, but works */ + pprintf (p,"System command in jsave_journalentry failed!\n"); + pprintf (p,"Please report this to an admin.\n"); + fprintf (stderr, "FICS: System command failed in jsave_journalentry\n"); + return; + } + + sprintf(fname, "%s/player_data/%c/%s.%s", stats_dir, name_to[0], + name_to, STATS_JOURNAL); + + if (!journal_get_info(p,from_spot,WhiteName,&WhiteRating, + BlackName,&BlackRating,type,&t,&i,eco, + ending,result,fname)) { + return; + } + + addjournalitem(p, toupper(save_spot), WhiteName, WhiteRating, + BlackName,BlackRating,type,t,i,eco, + ending,result, to_file); + + pprintf(p,"Journal entry %s %c saved in slot %c in journal.\n",parray[p1].name, toupper(from_spot), toupper(save_spot)); +} + +PUBLIC void jsave_history(int p,char save_spot,int p1,int from,char* to_file) +{ + + + char End[100]; + char jfname[MAX_FILENAME_SIZE]; + char* HistoryFname = FindHistory2(p, p1, from, 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 = parray[p].login; + char* EndSymbol; + FILE *Game; + char type[4]; + int g; + char* filename[MAX_FILENAME_SIZE+1]; + + if (HistoryFname != NULL) { + Game = fopen(HistoryFname, "r"); + if (Game == NULL) { + pprintf(p, "History game %d not available for %s.\n", from, parray[p1].name); + } else { + 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 (system(command)) { /* A little messy, but works */ + pprintf (p,"System command in jsave_history failed!\n"); + pprintf (p,"Please report this to an admin.\n"); + fprintf (stderr, "FICS: System command failed in jsave_journalentry\n"); + return; + } + g = game_new(); /* Open a dummy game */ + + if (ReadGameAttrs(Game, filename, g) < 0) { + pprintf (p,"Gamefile is corrupt. Please tell an admin.\n"); + game_free(g); + fclose (Game); + return; + } + fclose (Game); + if (garray[g].private) { + type[0] = 'p'; + } else { + type[0] = ' '; + } + if (garray[g].type == TYPE_BLITZ) { + type[1] = 'b'; + } else if (garray[g].type == TYPE_WILD) { + type[1] = 'w'; + } else if (garray[g].type == TYPE_STAND) { + type[1] = 's'; + } else { + if (garray[g].type == TYPE_NONSTANDARD) + type[1] = 'n'; + else + type[1] = 'u'; + } + if (garray[g].rated) { + type[2] = 'r'; + } else { + type[2] = 'u'; + } + type[3] = '\0'; + + EndSymbol = EndSym(g); + addjournalitem(p, toupper(save_spot), garray[g].white_name, garray[g].white_rating, + garray[g].black_name,garray[g].black_rating,type,garray[g].wInitTime,garray[g].wIncrement,getECO(g), + End,EndSymbol, to_file); + game_free(g); + pprintf(p,"Game %s %d saved in slot %c in journal.\n",parray[p1].name, from, toupper(save_spot)); + } + } +} + +PUBLIC int com_jsave(int p, param_list param) +{ + int p1, p1conn; + char* to = param[0].val.word; + char* from; + char fname[MAX_FILENAME_SIZE]; + + if (!parray[p].registered) { + 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) && (parray[p].adminLevel < ADMIN_ADMIN) && (!titled_player(p,parray[p].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,parray[p].login[0],parray[p].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 ((parray[p1].jprivate) && (parray[p].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) && (parray[p1].adminLevel < ADMIN_ADMIN) && (!titled_player(p,parray[p1].login))) { + pprintf (p,"%s's maximum journal entry is %c\n",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, parray[p].login[0], + parray[p].login, STATS_JOURNAL); + jsave_journalentry(p,to[0],p1, from[0], fname); + + } + if (!p1conn) + player_remove(p1); + return COM_OK; +} diff --git a/FICS/obsproc.h b/FICS/obsproc.h new file mode 100644 index 0000000..0d85e9a --- /dev/null +++ b/FICS/obsproc.h @@ -0,0 +1,57 @@ +/* obsproc.h + * + */ + +/* + 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 + (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. +*/ + +/* Revision history: + name email yy/mm/dd Change + Dave Herscovici 95/11/26 Created +*/ + +#ifndef _OBSPROC_H +#define _OBSPROC_H + +#define MAX_JOURNAL 10 + +extern int GameNumFromParam(); +extern int com_games(); +extern int com_observe(); +extern void unobserveAll(int); +extern int com_unobserve(); +extern int com_allobservers(); +extern int com_moves(); +extern int com_mailmoves(); +extern int com_oldmoves(); +extern int com_mailoldmoves(); +extern int com_mailstored(); +extern int com_stored(); +extern int com_smoves(); +extern int com_sposition(); +extern int com_history(); +extern int com_journal(); +extern int com_jsave(); + +extern int com_examine(); +extern int com_mexamine(); +extern int com_unexamine(); +extern int com_forward(); +extern int com_backward(); +extern int com_revert(); + +extern void ExamineScratch (); + +#endif /* _OBSPROC_H */ diff --git a/FICS/playerdb.c b/FICS/playerdb.c new file mode 100644 index 0000000..2cb30c5 --- /dev/null +++ b/FICS/playerdb.c @@ -0,0 +1,2542 @@ +/* playerdb.c + * + */ + +/* + 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 + (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. +*/ + +/* Revision history: + name email yy/mm/dd Change + Richard Nash 93/10/22 Created +*/ + +#include "stdinclude.h" +#include "common.h" +#include "command.h" +#include "comproc.h" +#include "playerdb.h" +#include "rmalloc.h" +#include "utils.h" +#include "network.h" +#include "ficsmain.h" +#include "config.h" +#include "talkproc.h" +#include "gamedb.h" +#include "lists.h" +/*#include "hostinfo.h" */ +#include "ratings.h" + +PUBLIC player parray[PARRAY_SIZE]; +PUBLIC int p_num = 0; + +#if 0 /* This never gets used! -- hersco */ +PUBLIC char *pend_strings[7] = {"match", "draw", "abort", "take back", "adjourn", "switch", "simul"}; +#endif + +PRIVATE int get_empty_slot(void) +{ + int i; + + for (i = 0; i < p_num; i++) { + if (parray[i].status == PLAYER_EMPTY) { +/*** fprintf(stderr,"New player put in parray[%d/%d]\n", i, p_num-1);*/ + return i; + } + } + + p_num++; + + if (p_num+1 >= PARRAY_SIZE) { + fprintf(stderr, "*** Bogus attempt to get_empty_slot() past end of parray ***\n"); + } + +/*** fprintf(stderr,"New player added in parray[%d]\n", p_num-1); */ + parray[p_num - 1].status = PLAYER_EMPTY; + return p_num - 1; +} + +PUBLIC void player_array_init() +{ + int i; + + for (i = 0; i < PARRAY_SIZE; i++) + parray[i].status = PLAYER_EMPTY; +} + +PUBLIC void player_init(int startConsole) +{ + int p; + + if (startConsole) { + net_addConnection(0, 0); + p = player_new(); + parray[p].login = strdup("console"); + parray[p].name = strdup("console"); + parray[p].passwd = strdup("*"); + parray[p].fullName = strdup("The Operator"); + parray[p].emailAddress = NULL; + parray[p].prompt = strdup("fics%"); + parray[p].adminLevel = ADMIN_GOD; + parray[p].socket = 0; + parray[p].busy[0] = '\0'; + pprintf_prompt(p, "\nLogged in on console.\n"); + } +} + +PUBLIC int player_new() +{ + int new; + + new = get_empty_slot(); + player_zero(new); + return new; +} + +#define INVALID ((char *) -42) + +PUBLIC int player_zero(int p) +{ + int i; + + parray[p].name = NULL; + parray[p].login = NULL; + parray[p].fullName = NULL; + parray[p].emailAddress = NULL; + parray[p].prompt = def_prompt; + parray[p].partner = -1; + parray[p].passwd = NULL; + parray[p].socket = -1; + parray[p].registered = 0; + parray[p].status = PLAYER_NEW; + parray[p].s_stats.num = 0; + parray[p].s_stats.win = 0; + parray[p].s_stats.los = 0; + parray[p].s_stats.dra = 0; + parray[p].s_stats.rating = 0; + parray[p].s_stats.sterr = 350.0; + parray[p].s_stats.ltime = 0; + parray[p].s_stats.best = 0; + parray[p].s_stats.whenbest = 0; + parray[p].b_stats.num = 0; + parray[p].b_stats.win = 0; + parray[p].b_stats.los = 0; + parray[p].b_stats.dra = 0; + parray[p].b_stats.rating = 0; + parray[p].b_stats.sterr = 350.0; + parray[p].b_stats.ltime = 0; + parray[p].b_stats.best = 0; + parray[p].b_stats.whenbest = 0; + parray[p].w_stats.num = 0; + parray[p].w_stats.win = 0; + parray[p].w_stats.los = 0; + parray[p].w_stats.dra = 0; + parray[p].w_stats.rating = 0; + parray[p].w_stats.sterr = 350.0; + parray[p].w_stats.ltime = 0; + parray[p].w_stats.best = 0; + parray[p].w_stats.whenbest = 0; + parray[p].l_stats.num = 0; + parray[p].l_stats.win = 0; + parray[p].l_stats.los = 0; + parray[p].l_stats.dra = 0; + parray[p].l_stats.rating = 0; + parray[p].l_stats.sterr = 350.0; + parray[p].l_stats.ltime = 0; + parray[p].l_stats.best = 0; + parray[p].l_stats.whenbest = 0; + parray[p].bug_stats.num = 0; + parray[p].bug_stats.win = 0; + parray[p].bug_stats.los = 0; + parray[p].bug_stats.dra = 0; + parray[p].bug_stats.rating = 0; + parray[p].bug_stats.sterr = 350.0; + parray[p].bug_stats.ltime = 0; + parray[p].bug_stats.best = 0; + parray[p].bug_stats.whenbest = 0; + parray[p].d_time = 2; + parray[p].d_inc = 12; + parray[p].d_height = 24; + parray[p].d_width = 79; + parray[p].language = LANG_DEFAULT; + parray[p].last_file = NULL; + parray[p].last_file_byte = 0L; + parray[p].open = 1; + parray[p].rated = 0; + parray[p].ropen = 1; + parray[p].bell = 0; + parray[p].timeOfReg = 0; + parray[p].totalTime = 0; + parray[p].pgn = 0; + parray[p].notifiedby = 0; + parray[p].i_login = 0; + parray[p].i_game = 0; + parray[p].i_shout = 1; + parray[p].i_cshout = 1; + parray[p].i_tell = 1; + parray[p].i_kibitz = 1; + parray[p].kiblevel = 0; + parray[p].private = 0; + parray[p].jprivate = 0; + parray[p].automail = 0; + parray[p].i_mailmess = 0; + parray[p].style = 0; + parray[p].promote = QUEEN; + parray[p].game = -1; + parray[p].last_tell = -1; + parray[p].last_channel = -1; + parray[p].logon_time = 0; + parray[p].last_command_time = 0; + parray[p].num_from = 0; + parray[p].num_to = 0; + parray[p].adminLevel = 0; + parray[p].i_admin = 1; +/* parray[p].computer = 0; */ + parray[p].num_plan = 0; + for (i = 0; i < MAX_PLAN; i++) + parray[p].planLines[i] = INVALID; + parray[p].num_formula = 0; + for (i = 0; i < MAX_FORMULA; i++) + parray[p].formulaLines[i] = NULL; + parray[p].formula = NULL; +/* parray[p].nochannels = 0; */ + parray[p].num_white = 0; + parray[p].num_black = 0; + parray[p].num_observe = 0; +/* parray[p].uscfRating = 0; */ +/* parray[p].network_player = 0; */ + parray[p].thisHost = 0; + parray[p].lastHost = 0; + parray[p].lastColor = WHITE; + parray[p].numAlias = 0; + for (i = 0; i < MAX_ALIASES; i++) { + parray[p].alias_list[i].comm_name = INVALID; + parray[p].alias_list[i].alias = INVALID; + } + parray[p].opponent = -1; + parray[p].last_opponent = -1; + parray[p].highlight = 0; +/* parray[p].query_log = NULL; */ + parray[p].lastshout_a = 0; + parray[p].lastshout_b = 0; + parray[p].sopen = 0; + parray[p].simul_info.numBoards = 0; + parray[p].num_comments = 0; + parray[p].flip = 0; + parray[p].lists = NULL; + return 0; +} + +PUBLIC int player_free(int p) +{ + int i; + + strfree(parray[p].login); + strfree(parray[p].name); + strfree(parray[p].passwd); + strfree(parray[p].fullName); + strfree(parray[p].emailAddress); + if (parray[p].prompt != def_prompt) + strfree(parray[p].prompt); +/* strfree(parray[p].partner); */ + for (i = 0; i < parray[p].num_plan; i++) + strfree(parray[p].planLines[i]); + for (i = 0; i < parray[p].num_formula; i++) + strfree(parray[p].formulaLines[i]); + strfree(parray[p].formula); + list_free(parray[p].lists); + for (i = 0; i < parray[p].numAlias; i++) { + strfree(parray[p].alias_list[i].comm_name); + strfree(parray[p].alias_list[i].alias); + } +/* + if (parray[p].query_log != NULL) + tl_free(parray[p].query_log); +*/ + return 0; +} + +PUBLIC int player_clear(int p) +{ + player_free(p); + player_zero(p); + return 0; +} + +PUBLIC int player_remove(int p) +{ + int i; + + player_decline_offers(p, -1, -1); + player_withdraw_offers(p, -1, -1); + if (parray[p].simul_info.numBoards) { /* Player disconnected in middle of + simul */ + for (i = 0; i < parray[p].simul_info.numBoards; i++) { + if (parray[p].simul_info.boards[i] >= 0) { + game_disconnect(parray[p].simul_info.boards[i], p); + } + } + } +#if 0 /* was finished elsewhere */ + if ((parray[p].game >=0) && (garray[parray[p].game].status == GAME_EXAMINE)) { + if (garray[parray[p].game].white == p) { /* owner of exam game */ + + /* not yet done */ + + } +#endif + + if (parray[p].game >=0) { /* Player disconnected in the middle of a + game! */ + pprintf(parray[p].opponent, "Your opponent has lost contact or quit."); + game_disconnect(parray[p].game, p); + } +/* ReallyRemoveOldGamesForPlayer(p); */ + for (i = 0; i < p_num; i++) { + if (parray[i].status == PLAYER_EMPTY) + continue; + if (parray[i].last_tell == p) + parray[i].last_tell = -1; + if (parray[i].last_opponent == p) + parray[i].last_opponent = -1; + if (parray[i].partner == p) { + pprintf_prompt (i, "Your partner has disconnected.\n"); + player_withdraw_offers(i, -1, PEND_BUGHOUSE); + player_decline_offers(i, -1, PEND_BUGHOUSE); + parray[i].partner = -1; + } + } + player_clear(p); + parray[p].status = PLAYER_EMPTY; +/*** fprintf(stderr, "Removed parray[%d/%d]\n", p, p_num-1);*/ + return 0; +} + +void ReadV1PlayerFmt(int p,player *pp, FILE * fp, char *file, int version) +{ + + int i,size_cens, size_noplay, size_not, size_gnot, size_chan, len; + int bs,ss,ws,ls,bugs; + + 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) != 46) { + fprintf(stderr,"Player %s is corrupt\n",parray[p].name); + return; + } + + 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 (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", + &pp->open, &pp->rated, &pp->ropen, &pp->timeOfReg, + &pp->totalTime, &pp->bell, &pp->pgn, &pp->notifiedby, + &pp->i_login, &pp->i_game, &pp->i_shout, &pp->i_cshout, + &pp->i_tell, &pp->i_kibitz, &pp->private, &pp->jprivate, + &pp->automail, &pp->i_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, &pp->numAlias, &size_chan) != 37) { + fprintf(stderr,"Player %s is corrupt\n",parray[p].name); + return; + } + + if (pp->num_plan > 0) { + for (i = 0; i < pp->num_plan; i++) { + fgets(tmp2, MAX_LINE_SIZE, fp); + if (!(len = strlen(tmp2))) { + fprintf(stderr, "FICS: 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))) { + fprintf(stderr, "FICS: 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 (pp->numAlias > 0) { + for (i = 0; i < pp->numAlias; i++) { + fgets(tmp2, MAX_LINE_SIZE, fp); + if (!(len = strlen(tmp2))) { + fprintf(stderr, "FICS: Error bad alias in file %s\n", file); + i--; + pp->numAlias--; + } else { + tmp2[len - 1] = '\0'; /* Get rid of '\n' */ + tmp = tmp2; + tmp = eatword(tmp2); + *tmp = '\0'; + tmp++; + tmp = eatwhite(tmp); + pp->alias_list[i].comm_name = strdup(tmp2); + pp->alias_list[i].alias = strdup(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); + } +} + +PRIVATE int got_attr_value_player(int p, char *attr, char *value, FILE * fp, char *file) +{ + int i, len; + char tmp[MAX_LINE_SIZE], *tmp1; + + if (!strcmp(attr, "name:")) { + parray[p].name = strdup(value); + } else if (!strcmp(attr, "password:")) { + parray[p].passwd = strdup(value); + } else if (!strcmp(attr, "fullname:")) { + parray[p].fullName = strdup(value); + } else if (!strcmp(attr, "email:")) { + parray[p].emailAddress = strdup(value); + } else if (!strcmp(attr, "prompt:")) { + parray[p].prompt = strdup(value); + } else if (!strcmp(attr, "s_num:")) { + parray[p].s_stats.num = atoi(value); + } else if (!strcmp(attr, "s_win:")) { + parray[p].s_stats.win = atoi(value); + } else if (!strcmp(attr, "s_loss:")) { + parray[p].s_stats.los = atoi(value); + } else if (!strcmp(attr, "s_draw:")) { + parray[p].s_stats.dra = atoi(value); + } else if (!strcmp(attr, "s_rating:")) { + parray[p].s_stats.rating = atoi(value); + } else if (!strcmp(attr, "s_sterr:")) { + parray[p].s_stats.sterr = (atoi(value) / 10.0); + } else if (!strcmp(attr, "s_ltime:")) { + parray[p].s_stats.ltime = atoi(value); + } else if (!strcmp(attr, "s_best:")) { + parray[p].s_stats.best = atoi(value); + } else if (!strcmp(attr, "s_wbest:")) { + parray[p].s_stats.whenbest = atoi(value); + } else if (!strcmp(attr, "b_num:")) { + parray[p].b_stats.num = atoi(value); + } else if (!strcmp(attr, "b_win:")) { + parray[p].b_stats.win = atoi(value); + } else if (!strcmp(attr, "b_loss:")) { + parray[p].b_stats.los = atoi(value); + } else if (!strcmp(attr, "b_draw:")) { + parray[p].b_stats.dra = atoi(value); + } else if (!strcmp(attr, "b_rating:")) { + parray[p].b_stats.rating = atoi(value); + } else if (!strcmp(attr, "b_sterr:")) { + parray[p].b_stats.sterr = (atoi(value) / 10.0); + } else if (!strcmp(attr, "b_ltime:")) { + parray[p].b_stats.ltime = atoi(value); + } else if (!strcmp(attr, "b_best:")) { + parray[p].b_stats.best = atoi(value); + } else if (!strcmp(attr, "b_wbest:")) { + parray[p].b_stats.whenbest = atoi(value); + } else if (!strcmp(attr, "w_num:")) { + parray[p].w_stats.num = atoi(value); + } else if (!strcmp(attr, "w_win:")) { + parray[p].w_stats.win = atoi(value); + } else if (!strcmp(attr, "w_loss:")) { + parray[p].w_stats.los = atoi(value); + } else if (!strcmp(attr, "w_draw:")) { + parray[p].w_stats.dra = atoi(value); + } else if (!strcmp(attr, "w_rating:")) { + parray[p].w_stats.rating = atoi(value); + } else if (!strcmp(attr, "w_sterr:")) { + parray[p].w_stats.sterr = (atoi(value) / 10.0); + } else if (!strcmp(attr, "w_ltime:")) { + parray[p].w_stats.ltime = atoi(value); + } else if (!strcmp(attr, "w_best:")) { + parray[p].w_stats.best = atoi(value); + } else if (!strcmp(attr, "w_wbest:")) { + parray[p].w_stats.whenbest = atoi(value); + } else if (!strcmp(attr, "open:")) { + parray[p].open = atoi(value); + } else if (!strcmp(attr, "rated:")) { + parray[p].rated = atoi(value); + } else if (!strcmp(attr, "ropen:")) { + parray[p].ropen = atoi(value); + } else if (!strcmp(attr, "bell:")) { + parray[p].bell = atoi(value); + } else if (!strcmp(attr, "pgn:")) { + parray[p].pgn = atoi(value); + } else if (!strcmp(attr, "timeofreg:")) { + parray[p].timeOfReg = atoi(value); + } else if (!strcmp(attr, "totaltime:")) { + parray[p].totalTime = atoi(value); + } else if (!strcmp(attr, "notifiedby:")) { + parray[p].notifiedby = atoi(value); + } else if (!strcmp(attr, "i_login:")) { + parray[p].i_login = atoi(value); + } else if (!strcmp(attr, "i_game:")) { + parray[p].i_game = atoi(value); + } else if (!strcmp(attr, "i_shout:")) { + parray[p].i_shout = atoi(value); + } else if (!strcmp(attr, "i_cshout:")) { + parray[p].i_cshout = atoi(value); + } else if (!strcmp(attr, "i_tell:")) { + parray[p].i_tell = atoi(value); + } else if (!strcmp(attr, "i_kibitz:")) { + parray[p].i_kibitz = atoi(value); + } else if (!strcmp(attr, "kiblevel:")) { + parray[p].kiblevel = atoi(value); + } else if (!strcmp(attr, "private:")) { + parray[p].private = atoi(value); + } else if (!strcmp(attr, "jprivate:")) { + parray[p].jprivate = atoi(value); + } else if (!strcmp(attr, "automail:")) { + parray[p].automail = atoi(value); + } else if (!strcmp(attr, "i_mailmess:")) { + parray[p].i_mailmess = atoi(value); + } else if (!strcmp(attr, "style:")) { + parray[p].style = atoi(value); + } else if (!strcmp(attr, "d_time:")) { + parray[p].d_time = atoi(value); + } else if (!strcmp(attr, "d_inc:")) { + parray[p].d_inc = atoi(value); + } else if (!strcmp(attr, "d_height:")) { + parray[p].d_height = atoi(value); + } else if (!strcmp(attr, "d_width:")) { + parray[p].d_width = atoi(value); + } else if (!strcmp(attr, "language:")) { + parray[p].language = atoi(value); + } else if (!strcmp(attr, "admin_level:")) { + parray[p].adminLevel = atoi(value); + if (parray[p].adminLevel >= ADMIN_ADMIN) + parray[p].i_admin = 1; + } else if (!strcmp(attr, "i_admin:")) { +/* parray[p].i_admin = atoi(value); */ + } else if (!strcmp(attr, "computer:")) { +/* parray[p].computer = atoi(value); */ + } else if (!strcmp(attr, "black_games:")) { + parray[p].num_black = atoi(value); + } else if (!strcmp(attr, "white_games:")) { + parray[p].num_white = atoi(value); + } else if (!strcmp(attr, "uscf:")) { +/* 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:")) { + parray[p].highlight = atoi(value); + } else if (!strcmp(attr, "network:")) { +/* parray[p].network_player = atoi(value); */ + } else if (!strcmp(attr, "lasthost:")) { + parray[p].lastHost = atoi(value); + } else if (!strcmp(attr, "channel:")) { + list_addsub(p,"channel",value, 1); + } else if (!strcmp(attr, "num_comments:")) { + parray[p].num_comments = atoi(value); + } else if (!strcmp(attr, "num_plan:")) { + parray[p].num_plan = atoi(value); + if (parray[p].num_plan > 0) { + for (i = 0; i < parray[p].num_plan; i++) { + fgets(tmp, MAX_LINE_SIZE, fp); + if (!(len = strlen(tmp))) { + fprintf(stderr, "FICS: Error bad plan in file %s\n", file); + i--; + parray[p].num_plan--; + } else { + tmp[len - 1] = '\0'; /* Get rid of '\n' */ + parray[p].planLines[i] = (len > 1) ? strdup(tmp) : NULL; + } + } + } + } else if (!strcmp(attr, "num_formula:")) { + parray[p].num_formula = atoi(value); + if (parray[p].num_formula > 0) { + for (i = 0; i < parray[p].num_formula; i++) { + fgets(tmp, MAX_LINE_SIZE, fp); + if (!(len = strlen(tmp))) { + fprintf(stderr, "FICS: Error bad formula in file %s\n", file); + i--; + parray[p].num_formula--; + } else { + tmp[len - 1] = '\0'; /* Get rid of '\n' */ + parray[p].formulaLines[i] = (len > 1) ? strdup(tmp) : NULL; + } + } + } + } else if (!strcmp(attr, "formula:")) { + parray[p].formula = strdup(value); + } else if (!strcmp(attr, "num_alias:")) { + parray[p].numAlias = atoi(value); + if (parray[p].numAlias > 0) { + for (i = 0; i < parray[p].numAlias; i++) { + fgets(tmp, MAX_LINE_SIZE, fp); + if (!(len = strlen(tmp))) { + fprintf(stderr, "FICS: Error bad alias in file %s\n", file); + i--; + parray[p].numAlias--; + } else { + tmp[len - 1] = '\0'; /* Get rid of '\n' */ + tmp1 = tmp; + tmp1 = eatword(tmp1); + *tmp1 = '\0'; + tmp1++; + tmp1 = eatwhite(tmp1); + parray[p].alias_list[i].comm_name = strdup(tmp); + parray[p].alias_list[i].alias = strdup(tmp1); + } + } + } + } 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!! */ + fprintf(stderr, "FICS: 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!! */ + fprintf(stderr, "FICS: 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!! */ + fprintf(stderr, "FICS: 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!! */ + fprintf(stderr, "FICS: Error bad gnotify in file %s\n", file); + } else { + tmp[len - 1] = '\0'; /* Get rid of '\n' */ + list_add(p, L_GNOTIFY, tmp); + } + } + } else { + fprintf(stderr, "FICS: Error bad attribute >%s< from file %s\n", attr, file); + } + return 0; +} + +PUBLIC int player_read(int p, char *name) +{ + char fname[MAX_FILENAME_SIZE]; + char line[MAX_LINE_SIZE]; + char *attr, *value; + FILE *fp; + int len; + int version = 0; + + parray[p].login = stolower(strdup(name)); + + sprintf(fname, "%s/%c/%s", player_dir, parray[p].login[0], parray[p].login); + fp = fopen(fname, "r"); + + if (!fp) { /* unregistered player */ + parray[p].name = strdup(name); + parray[p].registered = 0; + return -1; + } + + parray[p].registered = 1; /* 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 > 0) { + ReadV1PlayerFmt(p,&parray[p], fp, fname, version); /* Quick method */ + } + 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) { + fprintf(stderr, "FICS: 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)); + + fclose(fp); + + if (version == 0) + player_save (p); /* ensure old files are quickly converted eg when someone + fingers */ + if (!parray[p].name) { + parray[p].name = strdup(name); + pprintf(p, "\n*** WARNING: Your Data file is corrupt. Please tell an admin ***\n"); + } + return 0; +} + +PUBLIC int player_delete(int p) +{ + char fname[MAX_FILENAME_SIZE]; + + if (!parray[p].registered) { /* Player must not be registered */ + return -1; + } +/* if (iamserver) + sprintf(fname, "%s.server/%c/%s", player_dir, parray[p].login[0], parray[p].login); + else */ + sprintf(fname, "%s/%c/%s", player_dir, parray[p].login[0], parray[p].login); + unlink(fname); + return 0; +} + +PUBLIC int player_markdeleted(int p) +{ + FILE *fp; + char fname[MAX_FILENAME_SIZE], fname2[MAX_FILENAME_SIZE]; + + if (!parray[p].registered) { /* Player must not be registered */ + return -1; + } +/* if (iamserver) { + sprintf(fname, "%s.server/%c/%s", player_dir, parray[p].login[0], parray[p].login); + sprintf(fname2, "%s.server/%c/%s.delete", player_dir, parray[p].login[0], parray[p].login); + } else {*/ + sprintf(fname, "%s/%c/%s", player_dir, parray[p].login[0], parray[p].login); + sprintf(fname2, "%s/%c/%s.delete", player_dir, parray[p].login[0], parray[p].login); +/* } */ + rename(fname, fname2); + fp = fopen(fname2, "a"); /* Touch the file */ + if (fp) { + fprintf(fp, "\n"); + fclose(fp); + } + return 0; +} + +void WritePlayerFile(FILE* fp, int p) +{ + int i; + player *pp = &parray[p]; + + fprintf (fp, "v %d\n", PLAYER_VERSION); + 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\n", + pp->open, pp->rated, pp->ropen, pp->timeOfReg, + pp->totalTime, pp->bell, pp->pgn, pp->notifiedby, + pp->i_login, pp->i_game, pp->i_shout, pp->i_cshout, + pp->i_tell, pp->i_kibitz, pp->private, pp->jprivate, + pp->automail, pp->i_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 )); + 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 (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); +} + + #if 0 /* the old way */ + if (parray[p].name) + fprintf(fp, "Name: %s\n", parray[p].name); + if (parray[p].fullName) + fprintf(fp, "Fullname: %s\n", parray[p].fullName); + if (parray[p].passwd) + fprintf(fp, "Password: %s\n", parray[p].passwd); + if (parray[p].emailAddress) + fprintf(fp, "Email: %s\n", parray[p].emailAddress); + fprintf(fp, "S_NUM: %u\n", parray[p].s_stats.num); + fprintf(fp, "S_WIN: %u\n", parray[p].s_stats.win); + fprintf(fp, "S_LOSS: %u\n", parray[p].s_stats.los); + fprintf(fp, "S_DRAW: %u\n", parray[p].s_stats.dra); + fprintf(fp, "S_RATING: %u\n", parray[p].s_stats.rating); + fprintf(fp, "S_STERR: %u\n", (int) (parray[p].s_stats.sterr * 10.0)); + fprintf(fp, "S_LTIME: %u\n", parray[p].s_stats.ltime); + fprintf(fp, "S_BEST: %u\n", parray[p].s_stats.best); + fprintf(fp, "S_WBEST: %u\n", parray[p].s_stats.whenbest); + fprintf(fp, "B_NUM: %u\n", parray[p].b_stats.num); + fprintf(fp, "B_WIN: %u\n", parray[p].b_stats.win); + fprintf(fp, "B_LOSS: %u\n", parray[p].b_stats.los); + fprintf(fp, "B_DRAW: %u\n", parray[p].b_stats.dra); + fprintf(fp, "B_RATING: %u\n", parray[p].b_stats.rating); + fprintf(fp, "B_STERR: %u\n", (int) (parray[p].b_stats.sterr * 10.0)); + fprintf(fp, "B_LTIME: %u\n", parray[p].b_stats.ltime); + fprintf(fp, "B_BEST: %u\n", parray[p].b_stats.best); + fprintf(fp, "B_WBEST: %u\n", parray[p].b_stats.whenbest); + fprintf(fp, "W_NUM: %u\n", parray[p].w_stats.num); + fprintf(fp, "W_WIN: %u\n", parray[p].w_stats.win); + fprintf(fp, "W_LOSS: %u\n", parray[p].w_stats.los); + fprintf(fp, "W_DRAW: %u\n", parray[p].w_stats.dra); + fprintf(fp, "W_RATING: %u\n", parray[p].w_stats.rating); + fprintf(fp, "W_STERR: %u\n", (int) (parray[p].w_stats.sterr * 10.0)); + fprintf(fp, "W_LTIME: %u\n", parray[p].w_stats.ltime); + fprintf(fp, "W_BEST: %u\n", parray[p].w_stats.best); + fprintf(fp, "W_WBEST: %u\n", parray[p].w_stats.whenbest); + /* fprintf(fp, "Network: %d\n", parray[p].network_player); */ + /* if (iamserver) + return 0; *//* No need to write any more */ + + fprintf(fp, "LastHost: %d\n", parray[p].lastHost); + if (parray[p].prompt != def_prompt) + fprintf(fp, "Prompt: %s\n", parray[p].prompt); + fprintf(fp, "Open: %d\n", parray[p].open); + fprintf(fp, "Rated: %d\n", parray[p].rated); + fprintf(fp, "Ropen: %d\n", parray[p].ropen); + fprintf(fp, "timeofreg: %d\n", parray[p].timeOfReg); + fprintf(fp, "totaltime: %d\n", parray[p].totalTime); + fprintf(fp, "Bell: %d\n", parray[p].bell); + fprintf(fp, "PGN: %d\n", parray[p].pgn); + fprintf(fp, "Notifiedby: %d\n", parray[p].notifiedby); + fprintf(fp, "I_Login: %d\n", parray[p].i_login); + fprintf(fp, "I_Game: %d\n", parray[p].i_game); + fprintf(fp, "I_Shout: %d\n", parray[p].i_shout); + fprintf(fp, "I_CShout: %d\n", parray[p].i_cshout); + fprintf(fp, "I_Tell: %d\n", parray[p].i_tell); + fprintf(fp, "I_Kibitz: %d\n", parray[p].i_kibitz); + fprintf(fp, "Private: %d\n", parray[p].private); + fprintf(fp, "JPrivate: %d\n", parray[p].jprivate); + fprintf(fp, "Automail: %d\n", parray[p].automail); + fprintf(fp, "I_Mailmess: %d\n", parray[p].i_mailmess); + fprintf(fp, "Style: %d\n", parray[p].style); + fprintf(fp, "D_Time: %d\n", parray[p].d_time); + fprintf(fp, "D_Inc: %d\n", parray[p].d_inc); + fprintf(fp, "D_Height: %d\n", parray[p].d_height); + fprintf(fp, "D_Width: %d\n", parray[p].d_width); + fprintf(fp, "Language: %d\n", parray[p].language); + fprintf(fp, "Admin_level: %d\n", parray[p].adminLevel); + /* fprintf(fp, "I_Admin: %d\n", parray[p].i_admin); */ + /* if (parray[p].computer) { + fprintf(fp, "Computer: %d\n", parray[p].computer); + } */ + fprintf(fp, "White_Games: %d\n", parray[p].num_white); + fprintf(fp, "Black_Games: %d\n", parray[p].num_black); + /* fprintf(fp, "USCF: %d\n", parray[p].uscfRating); */ + fprintf(fp, "Highlight: %d\n", parray[p].highlight); + fprintf(fp, "Num_Comments: %d\n", parray[p].num_comments); + for (i = 0; i < MAX_CHANNELS; i++) { + if (on_channel(i, p)) + fprintf(fp, "Channel: %d\n", i); + } + fprintf(fp, "Num_plan: %d\n", parray[p].num_plan); + for (i = 0; i < parray[p].num_plan; i++) + fprintf(fp, "%s\n", (parray[p].planLines[i] ? parray[p].planLines[i] : "")); + fprintf(fp, "Num_formula: %d\n", parray[p].num_formula); + for (i = 0; i < parray[p].num_formula; i++) + fprintf(fp, "%s\n", (parray[p].formulaLines[i] ? parray[p].formulaLines[i] : "")); + if (parray[p].formula != NULL) + fprintf(fp, "Formula: %s\n", parray[p].formula); + fprintf(fp, "Num_censor: %d\n", list_size(p, L_CENSOR)); + list_print(fp, p, L_CENSOR); + fprintf(fp, "Num_notify: %d\n", list_size(p, L_NOTIFY)); + list_print(fp, p, L_NOTIFY); + fprintf(fp, "Num_noplay: %d\n", list_size(p, L_NOPLAY)); + list_print(fp, p, L_NOPLAY); + fprintf(fp, "Num_gnotify: %d\n", list_size(p, L_GNOTIFY)); + list_print(fp, p, L_GNOTIFY); + fprintf(fp, "Num_alias: %d\n", parray[p].numAlias); + for (i = 0; i < parray[p].numAlias; i++) + fprintf(fp, "%s %s\n", parray[p].alias_list[i].comm_name, + parray[p].alias_list[i].alias); + } + #endif + +PUBLIC int player_save(int p) +{ + FILE *fp; + char fname[MAX_FILENAME_SIZE]; + + if (!parray[p].registered) { /* Player must not be registered */ + return -1; + } + if (parray[p].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(parray[p].login, parray[p].name)) { + pprintf(p, "WARNING: Your player file could not be updated, due to corrupt data.\n"); + return -1; + } + + sprintf(fname, "%s/%c/%s", player_dir, parray[p].login[0], parray[p].login); + fp = fopen(fname, "w"); + if (!fp) { + fprintf(stderr, "FICS: Problem opening file %s for write\n", fname); + return -1; + } + + WritePlayerFile(fp,p); + fclose(fp); + return 0; +} + +PUBLIC int player_find(int fd) +{ + int i; + + for (i = 0; i < p_num; i++) { + if (parray[i].status == PLAYER_EMPTY) + continue; + if (parray[i].socket == fd) + return i; + } + return -1; +} + +PUBLIC int player_find_bylogin(char *name) +{ + int i; + + for (i = 0; i < p_num; i++) { + if ((parray[i].status == PLAYER_EMPTY) || + (parray[i].status == PLAYER_LOGIN) || + (parray[i].status == PLAYER_PASSWORD)) + continue; + if (!parray[i].login) + continue; + if (!strcmp(parray[i].login, name)) + return i; + } + return -1; +} + +PUBLIC int player_find_part_login(char *name) +{ + int i; + int found = -1; + + i = player_find_bylogin(name); + if (i >= 0) + return i; + for (i = 0; i < p_num; i++) { + if ((parray[i].status == PLAYER_EMPTY) || + (parray[i].status == PLAYER_LOGIN) || + (parray[i].status == PLAYER_PASSWORD)) + continue; + if (!parray[i].login) + continue; + if (!strncmp(parray[i].login, name, strlen(name))) { + if (found >= 0) { /* Ambiguous */ + return -2; + } + found = i; + } + } + return found; +} + +PUBLIC int player_censored(int p, int p1) +{ + if (in_list(p, L_CENSOR, parray[p1].login)) + return 1; + else + return 0; +} + +/* is p1 on p's notify list? */ +PUBLIC int player_notified(int p, int p1) +{ + if (!parray[p1].registered) + return 0; + + /* possible bug: p has just arrived! */ + if (!parray[p].name) + return 0; + + return (in_list(p, L_NOTIFY, parray[p1].login)); +} + +PUBLIC void player_notify_departure(int p) +/* Notify those with notifiedby set on a departure */ +{ + int p1; + + if (!parray[p].registered) + return; + for (p1 = 0; p1 < p_num; p1++) { + if (parray[p1].notifiedby && !player_notified(p1, p) && player_notified(p, p1) + && (parray[p1].status == PLAYER_PROMPT)) { + if (parray[p1].bell) + pprintf_noformat(p1, "\007"); + pprintf(p1, "\nNotification: "); + pprintf_highlight(p1, "%s", parray[p].name); + pprintf_prompt(p1, " has departed and isn't on your notify list.\n"); + } + } +} + +PUBLIC int player_notify_present(int p) +/* output Your arrival was notified by..... */ +/* also notify those with notifiedby set if necessary */ +{ + int p1; + int count = 0; + + if (!parray[p].registered) + return count; + for (p1 = 0; p1 < p_num; p1++) { + if ((player_notified(p, p1)) && (parray[p1].status == PLAYER_PROMPT)) { + if (!count) { + pprintf(p, "Present company includes:"); + } + count++; + pprintf(p, " %s", parray[p1].name); + if ((parray[p1].notifiedby) && (!player_notified(p1, p)) + && (parray[p1].status == PLAYER_PROMPT)) { + if (parray[p1].bell) + pprintf_noformat(p1, "\007"); + pprintf(p1, "\nNotification: "); + pprintf_highlight(p1, "%s", parray[p].name); + pprintf_prompt(p1, " has arrived and isn't on your notify list.\n"); + } + } + } + if (count) + pprintf(p, ".\n"); + return count; +} + +PUBLIC int player_notify(int p, char *note1, char *note2) +/* notify those interested that p has arrived/departed */ +{ + int p1; + int count = 0; + + if (!parray[p].registered) + return count; + for (p1 = 0; p1 < p_num; p1++) { + if ((player_notified(p1, p)) && (parray[p1].status == PLAYER_PROMPT)) { + if (parray[p1].bell) + pprintf_noformat(p1, "\007"); + pprintf(p1, "\nNotification: "); + pprintf_highlight(p1, "%s", parray[p].name); + pprintf_prompt(p1, " has %s.\n", note1); + if (!count) { + pprintf(p, "Your %s was noted by:", note2); + } + count++; + pprintf(p, " %s", parray[p1].name); + } + } + if (count) + pprintf(p, ".\n"); + return count; +} + +/* Show adjourned games upon logon. connex/sous@ipp.tu-clausthal.de +24.10.1995 */ +PUBLIC int showstored(int p) +{ + DIR *dirp; +#ifdef USE_DIRENT + struct dirent *dp; +#else + struct direct *dp; +#endif + int c=0,p1; + char dname[MAX_FILENAME_SIZE]; + multicol *m = multicol_start(50); /* Limit to 50, should be enough*/ + + sprintf(dname, "%s/%c", adj_dir, parray[p].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, parray[p].login)) { + if (strcmp(file_wplayer(dp->d_name),parray[p].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,parray[p1].name); + pprintf(p1,"\nNotification: "); + pprintf_highlight(p1,"%s",parray[p].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,parray[p].d_width,2); + multicol_end(m); +/* pprintf(p,"\n"); */ + return COM_OK; +} + + +PUBLIC int player_count(int CountAdmins) +{ + int count; + int i; + + for (count = 0, i = 0; i < p_num; i++) { + if ((parray[i].status == PLAYER_PROMPT) && + (CountAdmins || !in_list(i, L_ADMIN, parray[i].name))) + count++; + } + if (count > player_high) + player_high = count; + + return count; +} + +PUBLIC int player_idle(int p) +{ + if (parray[p].status != PLAYER_PROMPT) + return time(0) - parray[p].logon_time; + else + return time(0) - parray[p].last_command_time; +} + +PUBLIC int player_ontime(int p) +{ + return time(0) - parray[p].logon_time; +} + +PRIVATE void write_p_inout(int inout, int p, char *file, int maxlines) +{ + FILE *fp; + + fp = fopen(file, "a"); + if (!fp) + return; + fprintf(fp, "%d %s %d %d %s\n", inout, parray[p].name, (int) time(0), + parray[p].registered, dotQuad(parray[p].thisHost)); + fclose(fp); + if (maxlines) + truncate_file(file, maxlines); +} + +PUBLIC void player_write_login(int p) +{ + char fname[MAX_FILENAME_SIZE]; + + if (parray[p].registered) { + sprintf(fname, "%s/player_data/%c/%s.%s", stats_dir, parray[p].login[0], parray[p].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); +} + +PUBLIC void player_write_logout(int p) +{ + char fname[MAX_FILENAME_SIZE]; + + if (parray[p].registered) { + sprintf(fname, "%s/player_data/%c/%s.%s", stats_dir, parray[p].login[0], parray[p].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); +} + +PUBLIC int player_lastconnect(int p) +{ + char fname[MAX_FILENAME_SIZE]; + FILE *fp; + int inout, thetime, registered; + int last = 0; + char loginName[MAX_LOGIN_NAME]; + char ipstr[20]; + + sprintf(fname, "%s/player_data/%c/%s.%s", stats_dir, + parray[p].login[0], parray[p].login, STATS_LOGONS); + fp = fopen(fname, "r"); + if (!fp) + return 0; + inout = 1; + while (!feof(fp)) { + if (inout == P_LOGIN) + last = thetime; + if (fscanf(fp, "%d %s %d %d %s\n", &inout, loginName, &thetime, + ®istered, ipstr) != 5) { + fprintf(stderr, "FICS: Error in login info format. %s\n", fname); + fclose(fp); + return 0; + } + } + fclose(fp); + return last; +} + +PUBLIC int player_lastdisconnect(int 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, parray[p].login[0], parray[p].login, STATS_LOGONS); + fp = fopen(fname, "r"); + if (!fp) + return 0; + while (!feof(fp)) { + if (fscanf(fp, "%d %s %d %d %s\n", &inout, loginName, &thetime, ®istered, ipstr) != 5) { + fprintf(stderr, "FICS: Error in login info format. %s\n", fname); + fclose(fp); + return 0; + } + if (inout == P_LOGOUT) + last = thetime; + } + fclose(fp); + return last; +} + +PUBLIC void player_pend_print(int p, pending *pend) +{ + char outstr[200]; + char tmp[200]; + + if (p == pend->whofrom) { + sprintf(outstr, "You are offering "); + } else { + sprintf(outstr, "%s is offering ", parray[pend->whofrom].name); + } + + if (p == pend->whoto) { + strcpy(tmp, ""); + } else { + sprintf(tmp, "%s ", parray[pend->whoto].name); + } + + strcat(outstr, tmp); + switch (pend->type) { + case PEND_MATCH: + sprintf(tmp, "%s.", game_str(pend->param5, pend->param1 * 60, pend->param2, pend->param3 * 60, pend->param4, pend->char1, pend->char2)); + break; + case PEND_DRAW: + sprintf(tmp, "a draw.\n"); + break; + case PEND_PAUSE: + sprintf(tmp, "to pause the clock.\n"); + break; + case PEND_ABORT: + sprintf(tmp, "to abort the game.\n"); + break; + case PEND_TAKEBACK: + sprintf(tmp, "to takeback the last %d half moves.\n", pend->param1); + break; + case PEND_SIMUL: + sprintf(tmp, "to play a simul match.\n"); + break; + case PEND_SWITCH: + sprintf(tmp, "to switch sides.\n"); + break; + case PEND_ADJOURN: + sprintf(tmp, "an adjournment.\n"); + break; + case PEND_PARTNER: + sprintf(tmp, "to be bughouse partners.\n"); + break; + } + strcat(outstr, tmp); + pprintf(p, "%s\n", outstr); +} + +PUBLIC int player_find_pendto(int p, int p1, int type) +{ + int i; + + for (i = 0; i < parray[p].num_to; i++) { + if (parray[p].p_to_list[i].whoto != p1 && p1 != -1) + continue; + if (type < 0 || parray[p].p_to_list[i].type == type) + return i; + if (type == PEND_BUGHOUSE + && parray[p].p_to_list[i].type == PEND_MATCH + && !strcmp(parray[p].p_to_list[i].char2, "bughouse")) + return i; + } + return -1; +} + +PUBLIC int player_new_pendto(int p) +{ + if (parray[p].num_to >= MAX_PENDING) + return -1; + parray[p].num_to++; + return parray[p].num_to - 1; +} + +PUBLIC int player_remove_pendto(int p, int p1, int type) +{ + int w; + if ((w = player_find_pendto(p, p1, type)) < 0) + return -1; + for (; w < parray[p].num_to - 1; w++) + parray[p].p_to_list[w] = parray[p].p_to_list[w + 1]; + parray[p].num_to = parray[p].num_to - 1; + return 0; +} + +PUBLIC int player_find_pendfrom(int p, int p1, int type) +{ + int i; + + for (i = 0; i < parray[p].num_from; i++) { + if (parray[p].p_from_list[i].whofrom != p1 && p1 != -1) + continue; + if (type == PEND_ALL || parray[p].p_from_list[i].type == type) + return i; + if (type < 0 && parray[p].p_from_list[i].type != -type) + return i; + /* 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. */ + if (type == PEND_BUGHOUSE + && parray[p].p_from_list[i].type == PEND_MATCH + && !strcmp(parray[p].p_from_list[i].char2, "bughouse")) + return i; + } + return -1; +} + +PUBLIC int player_new_pendfrom(int p) +{ + if (parray[p].num_from >= MAX_PENDING) + return -1; + parray[p].num_from++; + return parray[p].num_from - 1; +} + +PUBLIC int player_remove_pendfrom(int p, int p1, int type) +{ + int w; + if ((w = player_find_pendfrom(p, p1, type)) < 0) + return -1; + for (; w < parray[p].num_from - 1; w++) + parray[p].p_from_list[w] = parray[p].p_from_list[w + 1]; + parray[p].num_from = parray[p].num_from - 1; + return 0; +} + +PUBLIC int player_add_request(int p, int p1, int type, int param) +{ + int pendt; + int pendf; + + if (player_find_pendto(p, p1, type) >= 0) + return -1; /* Already exists */ + pendt = player_new_pendto(p); + if (pendt == -1) { + return -1; + } + pendf = player_new_pendfrom(p1); + if (pendf == -1) { + parray[p].num_to--; /* Remove the pendto we allocated */ + return -1; + } + parray[p].p_to_list[pendt].type = type; + parray[p].p_to_list[pendt].whoto = p1; + parray[p].p_to_list[pendt].whofrom = p; + parray[p].p_to_list[pendt].param1 = param; + parray[p1].p_from_list[pendf].type = type; + parray[p1].p_from_list[pendf].whoto = p1; + parray[p1].p_from_list[pendf].whofrom = p; + parray[p1].p_from_list[pendf].param1 = param; + return 0; +} + +PUBLIC int player_remove_request(int p, int p1, int type) +{ + int to = 0, from = 0; + + while (to != -1) { + to = player_find_pendto(p, p1, type); + if (to != -1) { + for (; to < parray[p].num_to - 1; to++) + parray[p].p_to_list[to] = parray[p].p_to_list[to + 1]; + parray[p].num_to = parray[p].num_to - 1; + } + } + while (from != -1) { + from = player_find_pendfrom(p1, p, type); + if (from != -1) { + for (; from < parray[p1].num_from - 1; from++) + parray[p1].p_from_list[from] = parray[p1].p_from_list[from + 1]; + parray[p1].num_from = parray[p1].num_from - 1; + } + } + if ((type == PEND_ALL || type == PEND_MATCH) + && parray[p].partner >= 0) + player_remove_request (parray[p].partner, p1, PEND_BUGHOUSE); + return 0; +} + + +PUBLIC int player_decline_offers(int p, int p1, int offerType) +{ + int offer; + int type, p2; + int count = 0; + int part, p2part; + char *pName = parray[p].name, *p2Name; + + /* First get rid of bughouse offers from partner. */ + if ((offerType == PEND_MATCH || offerType == PEND_ALL) + && parray[p].partner >= 0 && parray[parray[p].partner].partner == p) + count += player_decline_offers(parray[p].partner, p1, PEND_BUGHOUSE); + + while ((offer = player_find_pendfrom(p, p1, offerType)) >= 0) { + type = parray[p].p_from_list[offer].type; + p2 = parray[p].p_from_list[offer].whofrom; + p2Name = parray[p2].name; + + part = parray[p].partner; + if (part >= 0 && parray[part].partner != p) + part = -1; + p2part = parray[p2].partner; + if (p2part >= 0 && parray[p2part].partner != p2) + p2part = -1; + + switch (type) { + case PEND_MATCH: + pprintf_prompt(p2, "\n%s declines the match offer.\n", pName); + pprintf(p, "You decline the match offer from %s.\n", p2Name); + if (!strcmp(parray[p].p_from_list[offer].char2, "bughouse")) { + if (part >= 0) + pprintf_prompt(part, + "Your partner declines the bughouse offer from %s.\n", + parray[p2].name); + if (p2part >= 0) + pprintf_prompt(p2part, + "%s declines the bughouse offer from your partner.\n", + parray[p].name); + } + break; + case PEND_DRAW: + pprintf_prompt(p2, "\n%s declines draw request.\n", pName); + pprintf(p, "You decline the draw request from %s.\n", p2Name); + break; + case PEND_PAUSE: + pprintf_prompt(p2, "\n%s declines pause request.\n", pName); + pprintf(p, "You decline the pause request from %s.\n", p2Name); + break; + case PEND_ABORT: + pprintf_prompt(p2, "\n%s declines abort request.\n", pName); + pprintf(p, "You decline the abort request from %s.\n", p2Name); + break; + case PEND_TAKEBACK: + pprintf_prompt(p2, "\n%s declines the takeback request.\n", pName); + pprintf(p, "You decline the takeback request from %s.\n", p2Name); + break; + case PEND_ADJOURN: + pprintf_prompt(p2, "\n%s declines the adjourn request.\n", pName); + pprintf(p, "You decline the adjourn request from %s.\n", p2Name); + break; + case PEND_SWITCH: + pprintf_prompt(p2, "\n%s declines the switch sides request.\n", pName); + pprintf(p, "You decline the switch sides request from %s.\n", p2Name); + break; + case PEND_SIMUL: + pprintf_prompt(p2, "\n%s declines the simul offer.\n", pName); + pprintf(p, "You decline the simul offer from %s.\n", p2Name); + break; + case PEND_PARTNER: + pprintf_prompt(p2, "\n%s declines your partnership request.\n", pName); + pprintf(p, "You decline the partnership request from %s.\n", p2Name); + break; + } + player_remove_request(p2, p, type); + count++; + } + return count; +} + + +PUBLIC int player_withdraw_offers(int p, int p1, int offerType) +{ + int offer; + int type, p2; + int count = 0; + int part, p2part; + char *pName = parray[p].name, *p2Name; + + /* First get rid of bughouse offers from partner. */ + if ((offerType == PEND_MATCH || offerType == PEND_ALL) + && parray[p].partner >= 0 && parray[parray[p].partner].partner == p) + count += player_withdraw_offers(parray[p].partner, p1, PEND_BUGHOUSE); + + while ((offer = player_find_pendto(p, p1, offerType)) >= 0) { + type = parray[p].p_to_list[offer].type; + p2 = parray[p].p_to_list[offer].whoto; + p2Name = parray[p2].name; + + part = parray[p].partner; + if (part >= 0 && parray[part].partner != p) + part = -1; + p2part = parray[p2].partner; + if (p2part >= 0 && parray[p2part].partner != p2) + p2part = -1; + + switch (type) { + case PEND_MATCH: + pprintf_prompt(p2, "\n%s withdraws the match offer.\n", pName); + pprintf(p, "You withdraw the match offer to %s.\n", p2Name); + if (!strcmp(parray[p].p_to_list[offer].char2, "bughouse")) { + if (part >= 0) + pprintf_prompt(part, + "Your partner withdraws the bughouse offer to %s.\n", + parray[p2].name); + if (p2part >= 0) + pprintf_prompt(p2part, + "%s withdraws the bughouse offer to your partner.\n", + parray[p].name); + } + break; + case PEND_DRAW: + 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: + pprintf_prompt(p2, "\n%s withdraws pause request.\n", pName); + pprintf(p, "You withdraw the pause request to %s.\n", p2Name); + break; + case PEND_ABORT: + 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: + 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: + 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: + 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: + 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: + pprintf_prompt(p2, "\n%s withdraws partnership request.\n", pName); + pprintf(p, "You withdraw the partnership request to %s.\n", p2Name); + break; + } + player_remove_request(p, p2, type); + count++; + } + return count; +} + + +PUBLIC int player_is_observe(int p, int g) +{ + int i; + + for (i = 0; i < parray[p].num_observe; i++) { + if (parray[p].observe_list[i] == g) + break; + } + if (i == parray[p].num_observe) + return 0; + else + return 1; +} + +PUBLIC int player_add_observe(int p, int g) +{ + if (parray[p].num_observe == MAX_OBSERVE) + return -1; + parray[p].observe_list[parray[p].num_observe] = g; + parray[p].num_observe++; + return 0; +} + +PUBLIC int player_remove_observe(int p, int g) +{ + int i; + + for (i = 0; i < parray[p].num_observe; i++) { + if (parray[p].observe_list[i] == g) + break; + } + if (i == parray[p].num_observe) + return -1; /* Not found! */ + for (; i < parray[p].num_observe - 1; i++) { + parray[p].observe_list[i] = parray[p].observe_list[i + 1]; + } + parray[p].num_observe--; + return 0; +} + +PUBLIC int player_game_ended(int g) +{ + int p; + + for (p = 0; p < p_num; p++) { + if (parray[p].status == PLAYER_EMPTY) + continue; + player_remove_observe(p, g); + } + player_remove_request(garray[g].white, garray[g].black, -1); + player_remove_request(garray[g].black, garray[g].white, -1); + player_save(garray[g].white); /* Hawk: Added to save finger-info after each + game */ + player_save(garray[g].black); + return 0; +} + +PUBLIC int player_goto_board(int p, int board_num) +{ + int start, count = 0, on, g; + + if (board_num < 0 || board_num >= parray[p].simul_info.numBoards) + return -1; + if (parray[p].simul_info.boards[board_num] < 0) + return -1; + parray[p].simul_info.onBoard = board_num; + parray[p].game = parray[p].simul_info.boards[board_num]; + parray[p].opponent = garray[parray[p].game].black; + if (parray[p].simul_info.numBoards == 1) + return 0; + send_board_to(parray[p].game, p); + start = parray[p].game; + on = parray[p].simul_info.onBoard; + do { + g = parray[p].simul_info.boards[on]; + if (g >= 0) { + if (count == 0) { + if (parray[garray[g].black].bell) { + pprintf(garray[g].black, "\007"); + } + pprintf(garray[g].black, "\n"); + pprintf_highlight(garray[g].black, "%s", parray[p].name); + pprintf_prompt(garray[g].black, " is at your board!\n"); + } else if (count == 1) { + if (parray[garray[g].black].bell) { + pprintf(garray[g].black, "\007"); + } + pprintf(garray[g].black, "\n"); + pprintf_highlight(garray[g].black, "%s", parray[p].name); + pprintf_prompt(garray[g].black, " will be at your board NEXT!\n"); + } else { + pprintf(garray[g].black, "\n"); + pprintf_highlight(garray[g].black, "%s", parray[p].name); + pprintf_prompt(garray[g].black, " is %d boards away.\n", count); + } + count++; + } + on++; + if (on >= parray[p].simul_info.numBoards) + on = 0; + } while (start != parray[p].simul_info.boards[on]); + return 0; +} + +PUBLIC int player_goto_next_board(int p) +{ + int on; + int start; + int g; + + on = parray[p].simul_info.onBoard; + start = on; + g = -1; + do { + on++; + if (on >= parray[p].simul_info.numBoards) + on = 0; + g = parray[p].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); +} + +PUBLIC int player_goto_prev_board(int p) +{ + int on; + int start; + int g; + + on = parray[p].simul_info.onBoard; + start = on; + g = -1; + do { + --on; + if (on < 0) + on = (parray[p].simul_info.numBoards) - 1; + g = parray[p].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); +} + +PUBLIC int player_goto_simulgame_bynum(int p, int num) +{ + int on; + int start; + int g; + + on = parray[p].simul_info.onBoard; + start = on; + do { + on++; + if (on >= parray[p].simul_info.numBoards) + on = 0; + g = parray[p].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); +} + +PUBLIC int player_num_active_boards(int p) +{ + int count = 0, i; + + if (!parray[p].simul_info.numBoards) + return 0; + for (i = 0; i < parray[p].simul_info.numBoards; i++) + if (parray[p].simul_info.boards[i] >= 0) + count++; + return count; +} + +PUBLIC int player_num_results(int p, int result) +{ + int count = 0, i; + + if (!parray[p].simul_info.numBoards) + return 0; + for (i = 0; i < parray[p].simul_info.numBoards; i++) + if (parray[p].simul_info.results[i] == result) + count++; + return count; +} + +PUBLIC int player_simul_over(int p, int g, int result) +{ + int on, ong, p1, which = -1, won; + char tmp[1024]; + + for (won = 0; won < parray[p].simul_info.numBoards; won++) { + if (parray[p].simul_info.boards[won] == g) { + which = won; + break; + } + } + if (which == -1) { + pprintf(p, "I can't find that game!\n"); + return -1; + } + pprintf(p, "\nBoard %d has completed.\n", won + 1); + on = parray[p].simul_info.onBoard; + ong = parray[p].simul_info.boards[on]; + parray[p].simul_info.boards[won] = -1; + parray[p].simul_info.results[won] = 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", + parray[p].name, + parray[p].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 < p_num; p1++) { + if (parray[p].status != PLAYER_PROMPT) + continue; + if (!parray[p1].i_game && !player_is_observe(p1, g) && (p1 != p)) + continue; + pprintf_prompt(p1, "%s", tmp); + } + parray[p].simul_info.numBoards = 0; + pprintf_prompt(p, "\nThat was the last board, thanks for playing.\n"); + return 0; + } + if (ong == g) { /* This game is over */ + player_goto_next_board(p); + } else { + player_goto_board(p, parray[p].simul_info.onBoard); + } + pprintf_prompt(p, "\nThere are %d boards left.\n", + player_num_active_boards(p)); + return 0; +} + +PRIVATE void GetMsgFile (int p, char *fName) +{ + sprintf(fName, "%s/player_data/%c/%s.%s", stats_dir, parray[p].login[0], + parray[p].login, STATS_MESSAGES); + } + +PUBLIC int player_num_messages(int p) +{ + char fname[MAX_FILENAME_SIZE]; + + if (!parray[p].registered) + return 0; + GetMsgFile (p, fname); + return lines_file(fname); +} + +PUBLIC int player_add_message(int top, int fromp, char *message) +{ +/* char command[MAX_FILENAME_SIZE]; */ + char fname[MAX_FILENAME_SIZE]; + FILE *fp; + char subj[256]; + char messbody[1024]; + int t = time(0); + + if (!parray[top].registered) + return -1; + if (!parray[fromp].registered) + return -1; + GetMsgFile (top, fname); + if ((lines_file(fname) >= MAX_MESSAGES) && (parray[top].adminLevel == 0)) + return -1; + fp = fopen(fname, "a"); + if (!fp) + return -1; + fprintf(fp, "%s at %s: %s\n", parray[fromp].name, strltime(&t), message); + fclose(fp); + pprintf(fromp, "\nThe following message was sent "); + if (parray[top].i_mailmess) { + sprintf(subj, "FICS message from %s at FICS %s (Do not reply by mail)", parray[fromp].name, fics_hostname); + sprintf(messbody, "%s at %s: %s\n", parray[fromp].name, strltime(&t), message); + mail_string_to_user(top, subj, messbody); + pprintf(fromp, "(and emailed) "); + } + pprintf(fromp, "to %s: \n %s\n", parray[top].name, message); + return 0; +} + +#if 0 +/* Function changed and moved lower to have messages numbered. */ +PUBLIC int player_show_messages(int p) +{ + char fname[MAX_FILENAME_SIZE]; + + if (!parray[p].registered) + return -1; + GetMsgFile (p, fname); + if (lines_file(fname) <= 0) + return -1; + psend_file(p, NULL, fname); + return 0; +} +#endif + +PUBLIC void SaveTextListEntry(textlist **Entry, char *string, int n) +{ + *Entry = (textlist *) rmalloc(sizeof(textlist)); + (*Entry)->text = strdup(string); + (*Entry)->index = n; + (*Entry)->next = NULL; +} + +PUBLIC textlist *ClearTextListEntry(textlist *entry) +{ + textlist *ret = entry->next; + strfree(entry->text); + rfree(entry); + return ret; +} + +PUBLIC void ClearTextList(textlist *head) +{ + textlist *cur; + + for (cur = head; cur != NULL; cur = ClearTextListEntry(cur)); +} + +/* if which=0 load all messages; if it's (p1+1) load messages only from + p1; if it's -(p1+1) load all messages EXCEPT those from p1. */ +PRIVATE 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, parray[p1].name); + } + else { + p1 = which - 1; + return !strcmp(Sender, parray[p1].name); + } +} + +PRIVATE int LoadMsgs(int p, int which, textlist **Head) + /* which=0 to load all messages; it's (p1+1) to load messages only from + p1, and it's -(p1+1) to load all messages EXCEPT those from p1. */ +{ + 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(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). */ +PRIVATE 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; + } +} + +#if 0 +PRIVATE int LoadMsgsFromP1(int p, int p1, int saveP1, textlist **Head) +{ + textlist **Cur=Head; + char Sender[MAX_LOGIN_NAME]; + int nKeep = 0; + int nKill = 0; + + /* First load all messages; then get rid of the ones we don't want. */ + LoadMsgs(p, 0, Head); + while (Cur != NULL && *Cur != NULL) { + sscanf ((*Cur)->text, "%s", Sender); + if ((saveP1 && strcmp(Sender, parray[p1].name)) + || (!saveP1 && !strcmp(Sender, parray[p1].name))) + /* either the message is from p1 and we're not saving his message + or it's not from p1, and we're only saving his messages. In + either case, we want to get rid of this one. */ + *Cur = ClearTextListEntry (*Cur); + nKill++; + } + else { + /* Save this message; move on to the next one. */ + if ((*Cur)->next != NULL) + Cur = &(*Cur)->next; + else Cur = NULL; + nKeep++; + } + } + return (saveP1 ? nKeep : nKill); +} +#endif + +PRIVATE int WriteMsgFile (int p, textlist *Head) +{ + char fName[MAX_FILENAME_SIZE]; + FILE *fp; + textlist *Cur; + + GetMsgFile (p, fName); + fp = fopen(fName, "w"); + if (fp == NULL) + return 0; + for (Cur = Head; Cur != NULL; Cur = Cur->next) + fprintf(fp, "%s", Cur->text); + fclose(fp); + return 1; +} + +PUBLIC int ClearMsgsBySender(int p, param_list param) +{ + 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", parray[p1].name); + } else { + if (WriteMsgFile (p, Head)) + pprintf(p, "Messages from %s cleared.\n", parray[p1].name); + else { + pprintf(p, "Problem writing message file; please contact an admin.\n"); + fprintf(stderr, "Problem writing message file for %s.\n", parray[p].name); + } + ClearTextList(Head); + } + if (!connected) + player_remove(p1); + return nFound; +} + +PRIVATE 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); + } +} + +PUBLIC 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; + } +} + +PUBLIC int ShowMsgsBySender(int p, param_list param) +{ + textlist *Head; + int p1, connected; + int nFrom, nTo; + + if (!FindPlayer(p, param[0].val.word, &p1, &connected)) + return -1; + + if (!parray[p1].registered) { + pprintf(p, "Player \"%s\" is unregistered and cannot send or receive messages.\n", + 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", parray[p1].name); + } else { + pprintf(p, "Messages to %s:\n", 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", parray[p1].name); + } else { + pprintf(p, "Messages from %s:\n", parray[p1].name); + ShowTextList (p, Head, 1); + ClearTextList(Head); + } + if (!connected) + player_remove(p1); + return (nFrom > 0 || nTo > 0); +} + +PUBLIC 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; +} + +PUBLIC int ClrMsgRange (int p, int start, int end) +{ + textlist *Head; + int n; + + n = LoadMsgRange (p, -start, -end, &Head); + if (n > 0) { +/* You can use ShowTextList to see what's left after the real code. */ +/* ShowTextList (p, Head, 1); */ + if (WriteMsgFile (p, Head)) + pprintf (p, "Message %d cleared.\n", start); + } + if (n >= 0) + ClearTextList (Head); + return n; +} + +PUBLIC int player_clear_messages(int p) +{ + char fname[MAX_FILENAME_SIZE]; + + if (!parray[p].registered) + return -1; + GetMsgFile (p, fname); + unlink(fname); + return 0; +} + +PUBLIC 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); +/* + char *s = buffer; + multicol *m = multicol_start(2000); + for (i = 0; i < count; i++) { + multicol_store(m, s); + s += strlen(s) + 1; + } + multicol_pprint(m, p, 78, 1); + multicol_end(m); + 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 */ +} + + +PUBLIC 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; +} + +PUBLIC 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; +} + +PUBLIC int player_raise(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(fname2, fname); + 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(fname2, fname); + 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(fname2, fname); + 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(fname2, fname); + 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(fname2, fname); + return 0; +} + +PUBLIC 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; +} + +PUBLIC int player_num_comments(int p) +{ + char fname[MAX_FILENAME_SIZE]; + + if (!parray[p].registered) + return 0; + sprintf(fname, "%s/player_data/%c/%s.%s", stats_dir, parray[p].login[0], + parray[p].login, "comments"); + return lines_file(fname); +} + +PUBLIC int player_add_comment(int p_by, int p_to, char *comment) +{ + char fname[MAX_FILENAME_SIZE]; + FILE *fp; + int t = time(0); + + if (!parray[p_to].registered) + return -1; + sprintf(fname, "%s/player_data/%c/%s.%s", stats_dir, parray[p_to].login[0], + parray[p_to].login, "comments"); + fp = fopen(fname, "a"); + if (!fp) + return -1; + fprintf(fp, "%s at %s: %s\n", parray[p_by].name, strltime(&t), comment); + fclose(fp); + parray[p_to].num_comments = player_num_comments(p_to); + return 0; +} + +PUBLIC int player_show_comments(int p, int p1) +{ + char fname[MAX_FILENAME_SIZE]; + + sprintf(fname, "%s/player_data/%c/%s.%s", stats_dir, parray[p1].login[0], + parray[p1].login, "comments"); + psend_file(p, NULL, fname); + return 0; +} + +/* returns 1 if player is head admin, 0 otherwise */ +PUBLIC int player_ishead(int p) +{ + return (!strcasecmp(parray[p].name, hadmin_handle)); +} diff --git a/FICS/playerdb.h b/FICS/playerdb.h new file mode 100644 index 0000000..4a40ef6 --- /dev/null +++ b/FICS/playerdb.h @@ -0,0 +1,289 @@ +/* playerdb.h + * + */ + +/* + 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 + (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. +*/ + +/* Revision history: + name email yy/mm/dd Change + Richard Nash 93/10/22 Created +*/ + +#include "command.h" +#include "lists.h" + +#ifndef _PLAYERDB_H +#define _PLAYERDB_H + +#define PLAYER_VERSION 1 + +#define MAX_PLAYER 500 +#define MAX_PENDING 10 +#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_ALIASES 30 +#define MAX_SIMUL 30 +#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 + +typedef struct _statistics { + int num, win, los, dra, rating, ltime, best, whenbest; + double sterr; +} statistics; + +#define PEND_MATCH 0 /* Params 1=wt 2=winc 3=bt 4=binc 5=registered */ +#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_ALL -1 + +#if 0 /* We never use this. -- hersco */ +extern char *pend_strings[7]; +#endif + +#define PEND_TO 0 +#define PEND_FROM 1 +typedef struct _pending { + int type; + int whoto; + int whofrom; + int param1, param2, param3, param4, param5, param6; + char char1[50], char2[50]; +} pending; + +typedef struct _simul_info_t { + int numBoards; + int onBoard; + int results[MAX_SIMUL]; + int boards[MAX_SIMUL]; +} simul_info_t; + +typedef struct _player { +/* This first block is not saved between logins */ + char *login; + int registered; + 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 last_tell; + int last_channel; + int last_opponent; + int logon_time; + int last_command_time; + int num_from; + pending p_from_list[MAX_PENDING]; + int num_to; + pending p_to_list[MAX_PENDING]; + int num_observe; + int observe_list[MAX_OBSERVE]; + int lastColor; + unsigned int thisHost; +/* timelog *query_log; */ + int lastshout_a; + int lastshout_b; + int sopen; + simul_info_t simul_info; + char busy[100]; /* more than enough */ + char *identptr; /* identd stuff */ + int num_comments; /* number of lines in comments file */ + int flip; + List *lists; + int partner; + long last_file_byte; + char *last_file; + int i_admin; + int kiblevel; + +/* All of this is saved between logins */ + char *name; + char *passwd; + char *fullName; + char *emailAddress; + char *prompt; + statistics s_stats; + statistics b_stats; + statistics w_stats; + statistics l_stats; + statistics bug_stats; + int d_time; + int d_inc; + int d_height; + int d_width; + int language; + int open; + int rated; + int ropen; + int notifiedby; + int bell; + int pgn; + int i_login; + int i_game; + int i_shout; + int i_cshout; + int i_tell; + int i_kibitz; + int private; + int jprivate; + int automail; + int i_mailmess; + int style; + int promote; + int adminLevel; +/* int computer; */ /* 1 if the player is a computer */ + int num_plan; + char *planLines[MAX_PLAN]; + int num_formula; + char *formulaLines[MAX_FORMULA]; + char *formula; + int nochannels; + int num_white; + int num_black; +/* int uscfRating; */ +/* int network_player; */ + unsigned int lastHost; + int numAlias; + alias_type alias_list[MAX_ALIASES]; + int highlight; +} player; + +typedef struct _textlist { + char *text; + int index; + struct _textlist *next; +} textlist; + +#define PARRAY_SIZE (MAX_PLAYER + 50) +extern player parray[PARRAY_SIZE]; +extern int p_num; + +extern void player_init(int); + +extern int player_new(void); +extern int player_remove(int); +extern int player_read(int, char *); +extern int player_delete(int); +extern int player_markdeleted(int); +extern int player_save(int); +extern int player_find(int); +extern int player_find_bylogin(char *); +extern int player_find_part_login(char *); +extern int player_censored(int, int); +extern int player_notified(int, int); +extern int player_notified_departure(int); +extern int player_notify_present (int); +extern int player_notify(int, char *, char *); +extern int showstored(int); + +extern int player_count(int); +extern int player_idle(int); +extern int player_ontime(int); + +extern int player_zero(int); +extern int player_free(int); +extern int player_clear(int); + +extern void player_write_login(int); +extern void player_write_logout(int); +extern int player_lastconnect(int); +extern int player_lastdisconnect(int); + +extern void player_pend_print(int, pending *); + +extern int player_find_pendto(int, int, int); +extern int player_new_pendto(int); +extern int player_remove_pendto(int, int, int); + +extern int player_find_pendfrom(int, int, int); +extern int player_new_pendfrom(int); +extern int player_remove_pendfrom(int, int, int); +extern int player_add_request(int, int, int, int); +extern int player_remove_request(int, int, int); +extern int player_decline_offers(int, int, int); +extern int player_withdraw_offers(int, int, int); + +extern int player_is_observe(int, int); +extern int player_add_observe(int, int); +extern int player_remove_observe(int, int); +extern int player_game_ended(int); + +extern int player_goto_board(int, int); +extern int player_goto_next_board(int); +extern int player_goto_prev_board(int); +extern int player_goto_simulgame_bynum(int,int); +extern int player_num_active_boards(int); +extern int player_num_results(int, int); +extern int player_simul_over(int, int, int); + +extern int player_num_messages(int); +extern int player_add_message(int, int, char *); +extern int player_show_messages(int); +extern int player_clear_messages(int); +extern void ClearTextList(textlist *); +extern void SaveTextListEntry(textlist **, char *, int); +extern int ShowMsgsBySender(int, param_list); +extern int ClrMsgRange(int, int, int); +extern int ShowMsgRange(int, int, int); +extern int ClearMsgsBySender(int, param_list); +#if 0 +extern int MessagesBySender(int, param_list, int); +#endif +extern int player_search(int, char *); + +extern int sort_blitz[]; +extern int sort_stand[]; +extern int sort_alpha[]; +extern int sort_wild[]; + +extern int player_kill(char *); +extern int player_rename(char *, char *); +extern int player_raise(char *); +extern int player_reincarn(char *,char *); + +extern int player_num_comments(int); +extern int player_add_comment(int, int, char *); +extern int player_show_comments(int, int); +extern int player_ishead(int); + +#endif /* _PLAYERDB_H */ + diff --git a/FICS/rating_conv.c b/FICS/rating_conv.c new file mode 100644 index 0000000..553b4b0 --- /dev/null +++ b/FICS/rating_conv.c @@ -0,0 +1,73 @@ +/* Ratings conversions by DAV */ +/* GNU licensing applies */ + +#include "rating_conv.h" +#include "common.h" +#include "stdinclude.h" +#include "command.h" +#include "utils.h" + +PRIVATE int elo_to_uscf(int elo) +{ + return elo + 100; +} + +PRIVATE int uscf_to_elo(int uscf) +{ + return uscf - 100; +} + +PRIVATE int bcf_to_elo(int bcf) +{ + return bcf * 8 + 600; +} + +PRIVATE int elo_to_bcf(int elo) +{ + return (elo - 600) / 8; +} + +PRIVATE int uscf_to_bcf(int uscf) +{ + return (uscf - 700) / 8; +} + +PRIVATE int bcf_to_uscf(int bcf) +{ + return bcf * 8 + 700; +} + +PRIVATE void printgrades(int p, int elo, int uscf, int bcf) +{ + pprintf(p, "Grading conversion:\n"); + pprintf(p, " ELO = %d, USCF = %d, BCF = %d\n", elo, uscf, bcf); +} + +PUBLIC int com_CONVERT_BCF(int p, param_list param) +{ + int elo = bcf_to_elo(param[0].val.integer); + int uscf = elo_to_uscf(elo); + + printgrades(p, elo, uscf, param[0].val.integer); + return COM_OK; +} + +PUBLIC int com_CONVERT_ELO(int p, param_list param) +{ + int bcf = elo_to_bcf(param[0].val.integer); + int uscf = elo_to_uscf(param[0].val.integer); + + printgrades(p, param[0].val.integer, uscf, bcf); + return COM_OK; +} + + +PUBLIC int com_CONVERT_USCF(int p, param_list param) +{ + int elo = uscf_to_elo(param[0].val.integer); + int bcf = elo_to_bcf(elo); + + printgrades(p, elo, param[0].val.integer, bcf); + return COM_OK; +} + diff --git a/FICS/rating_conv.h b/FICS/rating_conv.h new file mode 100644 index 0000000..cf12b27 --- /dev/null +++ b/FICS/rating_conv.h @@ -0,0 +1,11 @@ +/* rating_conv.h */ + + +#ifndef _RATINGCONV_H +#define _RATINGCONV_H + +extern int com_CONVERT_BCF(); +extern int com_CONVERT_ELO(); +extern int com_CONVERT_USCF(); + +#endif /* _RATINGCONV_H */ diff --git a/FICS/ratings.c b/FICS/ratings.c new file mode 100644 index 0000000..007e613 --- /dev/null +++ b/FICS/ratings.c @@ -0,0 +1,1512 @@ +/* + ratings.c + + 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 + (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. +*/ + +/* Revision history: + name email yy/mm/dd Change + Richard Nash 93/10/22 Created + vek leeds@math.gatech.edu 95/04/05 Glicko system, with sterr +*/ + +#include "stdinclude.h" + +#include "common.h" +#include "playerdb.h" +#include "ratings.h" +#include "gamedb.h" +#include "command.h" +#include "comproc.h" +#include "lists.h" +#include "ficsmain.h" +#include "config.h" +#include "utils.h" + +/* grimm */ +#if defined(SGI) +#else +/* int system(char *arg); */ +/* int rewind(FILE *stream); */ +#endif + + +PUBLIC double Ratings_B_Average; +PUBLIC double Ratings_B_StdDev; + +PUBLIC double Ratings_S_Average; +PUBLIC double Ratings_S_StdDev; + +PUBLIC double Ratings_L_Average; +PUBLIC double Ratings_L_StdDev; + +PUBLIC double Ratings_W_Average; +PUBLIC double Ratings_W_StdDev; + + +PRIVATE double Rb_M = 0.0, Rb_S = 0.0, Rb_total = 0.0; +PRIVATE int Rb_count = 0; + +PRIVATE double Rs_M = 0.0, Rs_S = 0.0, Rs_total = 0.0; +PRIVATE int Rs_count = 0; + +PRIVATE double Rl_M = 0.0, Rl_S = 0.0, Rl_total = 0.0; +PRIVATE int Rl_count = 0; + +PRIVATE double Rw_M = 0.0, Rw_S = 0.0, Rw_total = 0.0; +PRIVATE int Rw_count = 0; + +/* +PUBLIC rateStruct bestS[MAX_BEST]; +PUBLIC int numS = 0; +PUBLIC rateStruct bestB[MAX_BEST]; +PUBLIC int numB = 0; +PUBLIC rateStruct bestW[MAX_BEST]; +PUBLIC int numW = 0; +*/ + +#define MAXHIST 30 +#define LOWESTHIST 800 +PUBLIC int sHist[MAXHIST]; +PUBLIC int bHist[MAXHIST]; +PUBLIC int wHist[MAXHIST]; +PUBLIC int lHist[MAXHIST]; + +char sdir[] = DEFAULT_STATS; + +PUBLIC int is_active(int Games) +{ + return (Games >= PROVISIONAL); +} + + +PUBLIC 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; + +/* Insert bughouse stuff */ + } 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; + } +} + +PUBLIC 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); + /* added this 3.10.95 foxbat */ 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; + } +/* insert bughouse stuff here */ + } 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; + } + } +} + +PRIVATE void load_ratings(void) +{ + FILE *fp; + char fname[MAX_FILENAME_SIZE]; + int i; + + sprintf(fname, "%s/newratingsV%d_data", stats_dir,STATS_VERSION); + fp = fopen(fname, "r"); + if (!fp) { + fprintf(stderr, "FICS: 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; + } +} + +PUBLIC void save_ratings(void) +{ + FILE *fp; + char fname[MAX_FILENAME_SIZE]; + int i; + + sprintf(fname, "%s/newratingsV%d_data", stats_dir,STATS_VERSION); + fp = fopen(fname, "w"); + if (!fp) { + fprintf(stderr, "FICS: 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); +} + +/* +PRIVATE void BestRemove(int p) +{ + int i; + + for (i = 0; i < numB; i++) { + if (!strcmp(bestB[i].name, parray[p].name)) + break; + } + if (i < numB) { + for (; i < numB - 1; i++) { + strcpy(bestB[i].name, bestB[i + 1].name); + bestB[i].rating = bestB[i + 1].rating; + } + numB--; + } + for (i = 0; i < numS; i++) { + if (!strcmp(bestS[i].name, parray[p].name)) + break; + } + if (i < numS) { + for (; i < numS - 1; i++) { + strcpy(bestS[i].name, bestS[i + 1].name); + bestS[i].rating = bestS[i + 1].rating; + } + numS--; + } + for (i = 0; i < numW; i++) { + if (!strcmp(bestW[i].name, parray[p].name)) + break; + } + if (i < numW) { + for (; i < numW - 1; i++) { + strcpy(bestW[i].name, bestW[i + 1].name); + bestW[i].rating = bestW[i + 1].rating; + } + numW--; + } +} + +PRIVATE void BestAdd(int p) +{ + int where, j; + + if ((parray[p].b_stats.rating > 0) && (parray[p].b_stats.num > 19)) { + for (where = 0; where < numB; where++) { + if (parray[p].b_stats.rating > bestB[where].rating) + break; + } + if (where < MAX_BEST) { + for (j = numB; j > where; j--) { + if (j == MAX_BEST) + continue; + strcpy(bestB[j].name, bestB[j - 1].name); + bestB[j].rating = bestB[j - 1].rating; + } + strcpy(bestB[where].name, parray[p].name); + bestB[where].rating = parray[p].b_stats.rating; + if (numB < MAX_BEST) + numB++; + } + } + if ((parray[p].s_stats.rating > 0) && (parray[p].s_stats.num > 19)) { + for (where = 0; where < numS; where++) { + if (parray[p].s_stats.rating > bestS[where].rating) + break; + } + if (where < MAX_BEST) { + for (j = numS; j > where; j--) { + if (j == MAX_BEST) + continue; + strcpy(bestS[j].name, bestS[j - 1].name); + bestS[j].rating = bestS[j - 1].rating; + } + strcpy(bestS[where].name, parray[p].name); + bestS[where].rating = parray[p].s_stats.rating; + if (numS < MAX_BEST) + numS++; + } + } + if ((parray[p].w_stats.rating > 0) && (parray[p].w_stats.num > 19)) { + for (where = 0; where < numW; where++) { + if (parray[p].w_stats.rating > bestW[where].rating) + break; + } + if (where < MAX_BEST) { + for (j = numW; j > where; j--) { + if (j == MAX_BEST) + continue; + strcpy(bestW[j].name, bestW[j - 1].name); + bestW[j].rating = bestW[j - 1].rating; + } + strcpy(bestW[where].name, parray[p].name); + bestW[where].rating = parray[p].w_stats.rating; + if (numW < MAX_BEST) + numW++; + } + } +} + +PUBLIC void BestUpdate(int p) +{ + BestRemove(p); + BestAdd(p); +} + +*/ + +PUBLIC 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; + +/* + numS = 0; + numB = 0; + numW = 0; +*/ +} + +PUBLIC void rating_init(void) +{ + zero_stats(); + load_ratings(); +} + +/* This recalculates the rating info from the player data, it can take + a long time! */ +PUBLIC void rating_recalc(void) +{ + char dname[MAX_FILENAME_SIZE]; + int p1; + int c; + int t = time(0); + DIR *dirp; +#if USE_DIRENT + struct dirent *dp; +#else + struct direct *dp; +#endif + + fprintf(stderr, "FICS: Recalculating ratings at %s\n", strltime(&t)); + zero_stats(); + for (c = 'a'; c <= 'z'; c++) { + /* Never done as ratings server */ + sprintf(dname, "%s/%c", player_dir, c); + dirp = opendir(dname); + if (!dirp) + continue; + for (dp = readdir(dirp); dp != NULL; dp = readdir(dirp)) { + if (dp->d_name[0] != '.') { + p1 = player_new(); + if (player_read(p1, dp->d_name)) { + player_remove(p1); + fprintf(stderr, "FICS: Problem reading player %s.\n", dp->d_name); + continue; + } + if (parray[p1].b_stats.rating > 0) { + rating_add(parray[p1].b_stats.rating, TYPE_BLITZ); + } + if (parray[p1].s_stats.rating > 0) { + rating_add(parray[p1].s_stats.rating, TYPE_STAND); + } + if (parray[p1].l_stats.rating > 0) { + rating_add(parray[p1].l_stats.rating, TYPE_LIGHT); + } +/* insert bughouse stuff here */ + if (parray[p1].w_stats.rating > 0) { + rating_add(parray[p1].w_stats.rating, TYPE_WILD); + } + player_remove(p1); + } + } + closedir(dirp); + } + 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 (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; + } + 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; + } + save_ratings(); + t = time(0); + fprintf(stderr, "FICS: Finished at %s\n", strltime(&t)); +} + +PRIVATE int Round (double x) +{ + return (x < 0 ? (int) (x - 0.5) : (int) (x + 0.5)); +} + +/* Constants for Glicko system */ +#define Gd 3.25 +#define Gr0 1720 +#define Gs0 350 +#define Gq 0.00575646273249 +#define Gp 0.000010072398601964 + +/* End of Glicko system variables */ + +PRIVATE double Gf(double ss) +{ + return (1.0 / sqrt(1.0 + Gp * ss * ss)); +} + +/* Confusing but economical: calculate error and attenuation function together */ +PRIVATE 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))); +} + +PUBLIC double current_sterr(double s, int t) +{ + if (t < 0) + t = 0; /* this shouldn't happen */ + return (sqrt(s * s + Gd * Gd * log(1.0 + t / 60.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. */ + +PUBLIC void rating_sterr_delta(int p1, int p2, int type, int gtime, int result, + int *deltarating, double *newsterr) +{ + statistics *p1_stats; + statistics *p2_stats; + + double s1, s2; + int t1, r1, t2, r2; /* Initial sterrs and ratings */ + double E, fs2, denominator, GK, w; /* Parts of fancy formulas */ + double delta, sigma; /* Results to return */ + + if (type == TYPE_BLITZ) { + p1_stats = &parray[p1].b_stats; + p2_stats = &parray[p2].b_stats; + } else if (type == TYPE_WILD) { + p1_stats = &parray[p1].w_stats; + p2_stats = &parray[p2].w_stats; + } else if (type == TYPE_LIGHT) { + p1_stats = &parray[p1].l_stats; + p2_stats = &parray[p2].l_stats; +/* insert bughouse stuff here */ + } else { + p1_stats = &parray[p1].s_stats; + p2_stats = &parray[p2].s_stats; + } + + /* Calculate effective pre-game sterrs. ltime==0 implies never had sterr. */ + + if (p1_stats->ltime == 0) + s1 = Gs0; + else { + t1 = gtime - p1_stats->ltime; + s1 = current_sterr(p1_stats->sterr, t1); + if (s1 > Gs0) + s1 = Gs0; + } + + if (p2_stats->ltime == 0) + s2 = Gs0; + else { + t2 = gtime - p2_stats->ltime; + s2 = current_sterr(p2_stats->sterr, t2); + if (s2 > Gs0) + s2 = Gs0; + } + + /* pre-game ratings */ + if (p1_stats->rating == 0 && p1_stats->num == 0) + r1 = Gr0; + else + r1 = p1_stats->rating; + + if (p2_stats->rating == 0 && p2_stats->num == 0) + r2 = Gr0; + else + r2 = p2_stats->rating; + + /* now crunch */ + + if (result == RESULT_WIN) { + w = 1.0; + } else if (result == RESULT_DRAW) { + w = 0.5; + } else { + w = 0.0; + } + + E = GE(r1, r2, s2, &fs2); /* side effect: calculate fs2 */ + + denominator = 1.0 / (s1 * s1) + Gq * Gq * fs2 * fs2 * E * (1.0 - E); + GK = Gq * fs2 / denominator; + + delta = GK * (w - E); + if (p1_stats->rating == 0 && p1_stats->num == 0) + *deltarating = Round(Gr0 + delta); + else + *deltarating = Round(delta); /* Returned values: deltarating, + newsterr */ + sigma = 1.0 / sqrt(denominator); + *newsterr = (double) sigma; +} + +/* vek: Next is for when we want just the delta, and not the sigma. */ + +PUBLIC int rating_delta(int p1, int p2, int type, int result, int gtime) +{ + int delta; + double sigma; + + rating_sterr_delta(p1, p2, type, gtime, result, &delta, &sigma); + return (delta); + +} + +PUBLIC int rating_update(int g) +{ + int wDelta, bDelta; + double wSigma, bSigma; /* vek */ + + int wRes, bRes; + statistics *w_stats; + statistics *b_stats; + + int gtime; + + int inprogress = (g == parray[garray[g].black].game); + /* if this is adjudication of stored game, be quiet about ratings change */ + + if (garray[g].type == TYPE_BLITZ) { + w_stats = &parray[garray[g].white].b_stats; + b_stats = &parray[garray[g].black].b_stats; + } else if (garray[g].type == TYPE_STAND) { + w_stats = &parray[garray[g].white].s_stats; + b_stats = &parray[garray[g].black].s_stats; + } else if (garray[g].type == TYPE_WILD) { + w_stats = &parray[garray[g].white].w_stats; + b_stats = &parray[garray[g].black].w_stats; + } else if (garray[g].type == TYPE_LIGHT) { + w_stats = &parray[garray[g].white].l_stats; + b_stats = &parray[garray[g].black].l_stats; + } else { + fprintf(stderr, "FICS: Can't update untimed ratings!\n"); + return -1; + } + + switch (garray[g].result) { + case END_CHECKMATE: + case END_RESIGN: + case END_FLAG: + case END_ADJWIN: + if (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: + fprintf(stderr, "FICS: Update undecided game %d?\n", garray[g].result); + return -1; + } + gtime = untenths(garray[g].timeOfStart); + rating_sterr_delta(garray[g].white, garray[g].black, + garray[g].type, gtime, wRes, + &wDelta, &wSigma); + + rating_sterr_delta(garray[g].black, garray[g].white, + garray[g].type, gtime, bRes, + &bDelta, &bSigma); + + /* 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, garray[g].type); + rating_remove(b_stats->rating, garray[g].type); + + if (inprogress) { + pprintf(garray[g].white, "%s rating adjustment: %d ", + ((garray[g].type == TYPE_BLITZ) ? "Blitz" : ((garray[g].type == TYPE_WILD) ? "Wild" : ((garray[g].type == TYPE_LIGHT) ? "Lightning" : "Standard"))), w_stats->rating); + pprintf(garray[g].black, "%s rating adjustment: %d ", + ((garray[g].type == TYPE_BLITZ) ? "Blitz" : ((garray[g].type == TYPE_WILD) ? "Wild" : ((garray[g].type == TYPE_LIGHT) ? "Lightning" : "Standard"))), b_stats->rating); + } + if (wDelta < -1000) { + pprintf(garray[g].white, "not changed due to bug (way too small)! sorry!\n"); + fprintf(stderr, "FICS: Got too small ratings bug for %s (w) vs. %s\n", + parray[garray[g].white].login, parray[garray[g].black].login); + } else if (wDelta > 3000) { + pprintf(garray[g].white, "not changed due to bug (way too big)! sorry!\n"); + fprintf(stderr, "FICS: Got too big ratings bug for %s (w) vs. %s\n", + parray[garray[g].white].login, parray[garray[g].black].login); + } else { + w_stats->rating += wDelta; + w_stats->sterr = wSigma; + } + + if (bDelta < -1000) { + pprintf(garray[g].black, "not changed due to bug (way too small)! sorry! "); + fprintf(stderr, "FICS: Got too small ratings bug for %s (b) vs. %s\n", + parray[garray[g].black].login, parray[garray[g].white].login); + } else if (bDelta > 3000) { + pprintf(garray[g].black, "not changed due to bug (way too big)! sorry! "); + fprintf(stderr, "FICS: Got too big ratings bug for %s (b) vs. %s\n", + parray[garray[g].black].login, parray[garray[g].white].login); + } else { + b_stats->rating += bDelta; + b_stats->sterr = bSigma; + } /* error messages down to vek */ + + rating_add(w_stats->rating, garray[g].type); + rating_add(b_stats->rating, 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 now saved to disk after each game */ + player_save(garray[g].white); + player_save(garray[g].black); + +/* foxbat 3.11.95 */ + if (garray[g].type == TYPE_BLITZ) { + Rb_count++; + Rb_total += (w_stats->rating + b_stats->rating) / 2.0; + } else if (garray[g].type == TYPE_STAND) { + Rs_count++; + Rs_total += (w_stats->rating + b_stats->rating) / 2.0; + } else if (garray[g].type == TYPE_LIGHT) { + Rl_count++; + Rl_total += (w_stats->rating + b_stats->rating) / 2.0; + } else if (garray[g].type == TYPE_WILD) { + Rw_count++; + Rw_total += (w_stats->rating + b_stats->rating) / 2.0; + } +/* end add */ + if (inprogress) { + pprintf(garray[g].white, "--> %d\n", w_stats->rating); + pprintf(garray[g].black, "--> %d\n", b_stats->rating); + } + save_ratings(); + UpdateRank(garray[g].type, parray[garray[g].white].name, + w_stats, parray[garray[g].white].name); + UpdateRank(garray[g].type, parray[garray[g].black].name, + b_stats, parray[garray[g].black].name); + return 0; +} + +PUBLIC int com_assess(int p, param_list param) +{ + int p1 = p, p2, nowtime; + int p1_connected = 1, p2_connected = 1; + int win1, draw1, loss1; + double newsterr1; + int win2, draw2, loss2; + double newsterr2; + + nowtime = time(0); + +/* 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) { + if (parray[p].game < 0) { + pprintf(p, "You are not playing a game.\n"); + return COM_OK; + } else if (garray[parray[p].game].status == GAME_EXAMINE) { + if (!strcmp(garray[parray[p].game].black_name, parray[p].name)) { + pcommand(p, "assess %s\n", garray[parray[p].game].white_name); + } else { + pcommand(p, "assess %s %s\n", + garray[parray[p].game].white_name, + garray[parray[p].game].black_name); + } + return COM_OK; + } else { + p2 = parray[p].opponent; + } + } 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 (p1 == p2) { + pprintf(p, "You can't assess the same players.\n"); + if (!p1_connected) + player_remove(p1); + if (!p2_connected) + player_remove(p2); + return COM_OK; + } + rating_sterr_delta(p1, p2, TYPE_BLITZ, nowtime, RESULT_WIN, &win1, &newsterr1); + rating_sterr_delta(p1, p2, TYPE_BLITZ, nowtime, RESULT_DRAW, &draw1, &newsterr1); + rating_sterr_delta(p1, p2, TYPE_BLITZ, nowtime, RESULT_LOSS, &loss1, &newsterr1); + rating_sterr_delta(p2, p1, TYPE_BLITZ, nowtime, RESULT_WIN, &win2, &newsterr2); + rating_sterr_delta(p2, p1, TYPE_BLITZ, nowtime, RESULT_DRAW, &draw2, &newsterr2); + rating_sterr_delta(p2, p1, TYPE_BLITZ, nowtime, RESULT_LOSS, &loss2, &newsterr2); + + pprintf(p, "\nBlitz\n %10s (%4s, RD: %5.1f) %10s (%4s, RD: %5.1f)\n", + parray[p1].name, ratstrii(parray[p1].b_stats.rating, parray[p1].registered), parray[p1].b_stats.sterr, + parray[p2].name, ratstrii(parray[p2].b_stats.rating, parray[p2].registered), parray[p2].b_stats.sterr); + pprintf(p, "Win : %4d %4d\n", win1, loss2); + pprintf(p, "Draw: %4d %4d\n", draw1, draw2); + pprintf(p, "Loss: %4d %4d\n", loss1, win2); + pprintf(p, "New RD: %5.1f %5.1f\n", newsterr1, newsterr2); + + rating_sterr_delta(p1, p2, TYPE_STAND, nowtime, RESULT_WIN, &win1, &newsterr1); + rating_sterr_delta(p1, p2, TYPE_STAND, nowtime, RESULT_DRAW, &draw1, &newsterr1); + rating_sterr_delta(p1, p2, TYPE_STAND, nowtime, RESULT_LOSS, &loss1, &newsterr1); + rating_sterr_delta(p2, p1, TYPE_STAND, nowtime, RESULT_WIN, &win2, &newsterr2); + rating_sterr_delta(p2, p1, TYPE_STAND, nowtime, RESULT_DRAW, &draw2, &newsterr2); + rating_sterr_delta(p2, p1, TYPE_STAND, nowtime, RESULT_LOSS, &loss2, &newsterr2); + + pprintf(p, "\nStandard\n %10s (%4s, RD: %5.1f) %10s (%4s, RD: %5.1f)\n", + parray[p1].name, ratstrii(parray[p1].s_stats.rating, parray[p1].registered), parray[p1].s_stats.sterr, + parray[p2].name, ratstrii(parray[p2].s_stats.rating, parray[p2].registered), parray[p2].s_stats.sterr); + pprintf(p, "Win : %4d %4d\n", win1, loss2); + pprintf(p, "Draw: %4d %4d\n", draw1, draw2); + pprintf(p, "Loss: %4d %4d\n", loss1, win2); + pprintf(p, "New RD: %5.1f %5.1f\n", newsterr1, newsterr2); + + rating_sterr_delta(p1, p2, TYPE_LIGHT, nowtime, RESULT_WIN, &win1, &newsterr1); rating_sterr_delta(p1, p2, TYPE_LIGHT, nowtime, RESULT_DRAW, &draw1, &newsterr1); + rating_sterr_delta(p1, p2, TYPE_LIGHT, nowtime, RESULT_LOSS, &loss1, &newsterr1); + rating_sterr_delta(p2, p1, TYPE_LIGHT, nowtime, RESULT_WIN, &win2, &newsterr2); rating_sterr_delta(p2, p1, TYPE_LIGHT, nowtime, RESULT_DRAW, &draw2, &newsterr2); + rating_sterr_delta(p2, p1, TYPE_LIGHT, nowtime, RESULT_LOSS, &loss2, &newsterr2); + + pprintf(p, "\nLightning\n %10s (%4s, RD: %5.1f) %10s (%4s, RD: %5.1f)\n", + parray[p1].name, ratstrii(parray[p1].l_stats.rating, parray[p1].registered), parray[p1].l_stats.sterr, + parray[p2].name, ratstrii(parray[p2].l_stats.rating, parray[p2].registered), parray[p2].l_stats.sterr); + pprintf(p, "Win : %4d %4d\n", win1, loss2); + pprintf(p, "Draw: %4d %4d\n", draw1, draw2); + pprintf(p, "Loss: %4d %4d\n", loss1, win2); + pprintf(p, "New RD: %5.1f %5.1f\n", newsterr1, newsterr2); + + rating_sterr_delta(p1, p2, TYPE_WILD, nowtime, RESULT_WIN, &win1, &newsterr1); + rating_sterr_delta(p1, p2, TYPE_WILD, nowtime, RESULT_DRAW, &draw1, &newsterr1); + rating_sterr_delta(p1, p2, TYPE_WILD, nowtime, RESULT_LOSS, &loss1, &newsterr1); + rating_sterr_delta(p2, p1, TYPE_WILD, nowtime, RESULT_WIN, &win2, &newsterr2); + rating_sterr_delta(p2, p1, TYPE_WILD, nowtime, RESULT_DRAW, &draw2, &newsterr2); + rating_sterr_delta(p2, p1, TYPE_WILD, nowtime, RESULT_LOSS, &loss2, &newsterr2); + + pprintf(p, "\nWild\n %10s (%4s, RD: %5.1f) %10s (%4s, RD: %5.1f)\n", + parray[p1].name, ratstrii(parray[p1].w_stats.rating, parray[p1].registered), parray[p1].w_stats.sterr, + parray[p2].name, ratstrii(parray[p2].w_stats.rating, parray[p2].registered), parray[p2].w_stats.sterr); + pprintf(p, "Win : %4d %4d\n", win1, loss2); + pprintf(p, "Draw: %4d %4d\n", draw1, draw2); + pprintf(p, "Loss: %4d %4d\n", loss1, win2); + pprintf(p, "New RD: %5.1f %5.1f\n", newsterr1, newsterr2); + + if (!p1_connected) + player_remove(p1); + if (!p2_connected) + player_remove(p2); + return COM_OK; +} + + +PUBLIC int com_best(int p, param_list param) +{ + return Best(p, param, 1); +} + +PUBLIC int com_hbest(int p, param_list param) +{ + return Best(p, param, 0); +} + +#if 0 +PUBLIC 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 + +PUBLIC 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; +} + +PUBLIC 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, parray[p1].name, &parray[p1].b_stats, + parray[p1].name); + UpdateRank(TYPE_STAND, parray[p1].name, &parray[p1].s_stats, + parray[p1].name); + UpdateRank(TYPE_WILD, parray[p1].name, &parray[p1].w_stats, + parray[p1].name); + if (!connected) + player_remove(p1); + return COM_OK; +} + +PUBLIC int com_rank(int p, param_list param) +{ + return DisplayRank(p, param, 1); +} + +PUBLIC int com_hrank(int p, param_list param) +{ + return DisplayRank(p, param, 0); +} + +PUBLIC int DisplayRank(int p, param_list param, int showComputers) +{ + int start, end, target, connected; + int show = SHOW_BLITZ | SHOW_STANDARD | SHOW_WILD; + + if (param[0].type == TYPE_NULL) { + DisplayTargetRank(p, parray[p].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, 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 +PRIVATE 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; +*/ + fprintf(stderr, "Duplicate entries found: %s.\n", name1); + return 0; +} +#endif +PRIVATE int GetRankFileName(char *out, int type) +{ + switch (type) { + case TYPE_BLITZ: + sprintf(out, "%s/rank.blitz", sdir); + return type; + case TYPE_STAND: + sprintf(out, "%s/rank.std", sdir); + return type; + case TYPE_WILD: + sprintf(out, "%s/rank.wild", sdir); + return type; + default: + return -1; + } +} + +/* loon: Turning this off 28 Oct 1995 (temporary:)) since we're lagged + into outer space */ +PUBLIC void UpdateRank(int type, char *addName, + statistics *sNew, char *delName) +{} + +#if 0 +PUBLIC void UpdateRank(int type, char *addName, + statistics *sNew, char *delName) +{ + char RankFile[MAX_FILENAME_SIZE]; + char TmpRankFile[MAX_FILENAME_SIZE]; + char line[MAX_RANK_LINE]; + char login[MAX_LOGIN_NAME]; + char command[MAX_STRING_LENGTH]; + int comp; + statistics sCur; + FILE *fp; + FILE *fptemp; + + if (GetRankFileName(RankFile, type) < 0) + return; + fp = fopen(RankFile, "r"); + if (fp == NULL) { + fprintf(stderr, "Can't open rank file to update.\n"); + return; + } + sprintf(TmpRankFile, "%s/tmpRank", sdir); + fptemp = fopen(TmpRankFile, "w"); + if (fptemp == NULL) { + fprintf (stderr, "Unable to open rank file for updating.\n"); + 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); + + sprintf(command, "mv %s %s", TmpRankFile, RankFile); + system(command); +} +#endif + +PRIVATE 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); +} + +PRIVATE 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)); +} + +PRIVATE 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); +} + +PRIVATE 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)++; + } +} + +PRIVATE 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; + } +} + +PRIVATE 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); +} + +PRIVATE 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)) + ClearFlag(show, SHOW_BLITZ); + } + if (CheckFlag(show, SHOW_STANDARD)) { + PositionFilePtr(fs, sCount, &lastStd, &nTiedStd, showComp); + if (feof(fs)) + ClearFlag(show, SHOW_STANDARD); + } + if (CheckFlag(show, SHOW_WILD)) { + PositionFilePtr(fw, wCount, &lastWild, &nTiedWild, showComp); + if (feof(fw)) + ClearFlag(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; +} + +PUBLIC 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(Path, "r"); + if (fb != NULL) + blitzRank = GetRank(fb, target, showComp); + if (blitzRank < 0) + ClearFlag(show, SHOW_BLITZ); + } + if (CheckFlag(show, SHOW_STANDARD)) { + GetRankFileName(Path, TYPE_STAND); + fs = (FILE *) fopen(Path, "r"); + if (fs != NULL) + stdRank = GetRank(fs, target, showComp); + if (stdRank < 0) + ClearFlag(show, SHOW_STANDARD); + } + if (CheckFlag(show, SHOW_WILD)) { + GetRankFileName(Path, TYPE_WILD); + if (CheckFlag(show, SHOW_WILD)) + fw = (FILE *) fopen(Path, "r"); + if (fw != NULL) + wildRank = GetRank(fw, target, showComp); + if (wildRank < 0) + ClearFlag(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); +} + +PUBLIC 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(Path, "r"); + if (fb == NULL) + ClearFlag(show, SHOW_BLITZ); + } + if (CheckFlag(show, SHOW_STANDARD)) { + GetRankFileName(Path, TYPE_STAND); + fs = (FILE *) fopen(Path, "r"); + if (fs == NULL) + ClearFlag(show, SHOW_STANDARD); + } + if (CheckFlag(show, SHOW_WILD)) { + GetRankFileName(Path, TYPE_WILD); + fw = (FILE *) fopen(Path, "r"); + if (fw == NULL) + ClearFlag(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; +} + +PUBLIC 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': + SetFlag(show, SHOW_BLITZ); + break; + case 's': + SetFlag(show, SHOW_STANDARD); + break; + case 'w': + SetFlag(show, SHOW_WILD); + break; + } + } + return (show); +} + +PUBLIC 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/FICS/ratings.c.orig b/FICS/ratings.c.orig new file mode 100644 index 0000000..37e26f9 --- /dev/null +++ b/FICS/ratings.c.orig @@ -0,0 +1,1432 @@ +/* + ratings.c + + 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 + (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. +*/ + +/* Revision history: + name email yy/mm/dd Change + Richard Nash 93/10/22 Created + vek leeds@math.gatech.edu 95/04/05 Glicko system, with sterr +*/ + +#include "stdinclude.h" + +#include "common.h" +#include "playerdb.h" +#include "ratings.h" +#include "gamedb.h" +#include "command.h" +#include "comproc.h" +#include "lists.h" +#include "ficsmain.h" +#include "config.h" +#include "utils.h" + +/* grimm */ +#if defined(SGI) +#else +/* int system(char *arg); */ +/* int rewind(FILE *stream); */ +#endif + + +PUBLIC double Ratings_B_Average; +PUBLIC double Ratings_B_StdDev; + +PUBLIC double Ratings_S_Average; +PUBLIC double Ratings_S_StdDev; + +PUBLIC double Ratings_W_Average; +PUBLIC double Ratings_W_StdDev; + +PRIVATE double Rb_M = 0.0, Rb_S = 0.0, Rb_total = 0.0; +PRIVATE int Rb_count = 0; + +PRIVATE double Rs_M = 0.0, Rs_S = 0.0, Rs_total = 0.0; +PRIVATE int Rs_count = 0; + +PRIVATE double Rw_M = 0.0, Rw_S = 0.0, Rw_total = 0.0; +PRIVATE int Rw_count = 0; + +/* +PUBLIC rateStruct bestS[MAX_BEST]; +PUBLIC int numS = 0; +PUBLIC rateStruct bestB[MAX_BEST]; +PUBLIC int numB = 0; +PUBLIC rateStruct bestW[MAX_BEST]; +PUBLIC int numW = 0; +*/ + +#define MAXHIST 30 +#define LOWESTHIST 800 +PUBLIC int sHist[MAXHIST]; +PUBLIC int bHist[MAXHIST]; +PUBLIC int wHist[MAXHIST]; + +char sdir[] = DEFAULT_STATS; + +PUBLIC int is_active(int Games) +{ + return (Games >= PROVISIONAL); +} + + +PUBLIC 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 { /* 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; + } +} + +PUBLIC 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 { /* 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; + } + } +} + +PRIVATE void load_ratings(void) +{ + FILE *fp; + char fname[MAX_FILENAME_SIZE]; + int i; + + sprintf(fname, "%s/newratings_data", stats_dir); + fp = fopen(fname, "r"); + if (!fp) { + fprintf(stderr, "FICS: 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); +/* loon testing + fscanf(fp, "%d", &numB); + for (i = 0; i < numB; i++) { + fscanf(fp, "%s %d", bestB[i].name, &(bestB[i].rating)); + } + fscanf(fp, "%d", &numS); + for (i = 0; i < numS; i++) { + fscanf(fp, "%s %d", bestS[i].name, &bestS[i].rating); + } + fscanf(fp, "%d", &numW); + for (i = 0; i < numW; i++) { + fscanf(fp, "%s %d", bestW[i].name, &bestW[i].rating); + } +*/ + for (i = 0; i < MAXHIST; i++) { + fscanf(fp, "%d %d %d", &sHist[i], &bHist[i], &wHist[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; + } +} + +PUBLIC void save_ratings(void) +{ + FILE *fp; + char fname[MAX_FILENAME_SIZE]; + int i; + + sprintf(fname, "%s/newratings_data", stats_dir); + fp = fopen(fname, "w"); + if (!fp) { + fprintf(stderr, "FICS: 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); +/* loon testing + fprintf(fp, "%d\n", numB); + for (i = 0; i < numB; i++) { + fprintf(fp, "%s %d\n", bestB[i].name, bestB[i].rating); + } + fprintf(fp, "%d\n", numS); + for (i = 0; i < numS; i++) { + fprintf(fp, "%s %d\n", bestS[i].name, bestS[i].rating); + } + fprintf(fp, "%d\n", numW); + for (i = 0; i < numW; i++) { + fprintf(fp, "%s %d\n", bestW[i].name, bestW[i].rating); + } +*/ + for (i = 0; i < MAXHIST; i++) { + fprintf(fp, "%d %d %d\n", sHist[i], bHist[i], wHist[i]); + } + fclose(fp); +} + +/* +PRIVATE void BestRemove(int p) +{ + int i; + + for (i = 0; i < numB; i++) { + if (!strcmp(bestB[i].name, parray[p].name)) + break; + } + if (i < numB) { + for (; i < numB - 1; i++) { + strcpy(bestB[i].name, bestB[i + 1].name); + bestB[i].rating = bestB[i + 1].rating; + } + numB--; + } + for (i = 0; i < numS; i++) { + if (!strcmp(bestS[i].name, parray[p].name)) + break; + } + if (i < numS) { + for (; i < numS - 1; i++) { + strcpy(bestS[i].name, bestS[i + 1].name); + bestS[i].rating = bestS[i + 1].rating; + } + numS--; + } + for (i = 0; i < numW; i++) { + if (!strcmp(bestW[i].name, parray[p].name)) + break; + } + if (i < numW) { + for (; i < numW - 1; i++) { + strcpy(bestW[i].name, bestW[i + 1].name); + bestW[i].rating = bestW[i + 1].rating; + } + numW--; + } +} + +PRIVATE void BestAdd(int p) +{ + int where, j; + + if ((parray[p].b_stats.rating > 0) && (parray[p].b_stats.num > 19)) { + for (where = 0; where < numB; where++) { + if (parray[p].b_stats.rating > bestB[where].rating) + break; + } + if (where < MAX_BEST) { + for (j = numB; j > where; j--) { + if (j == MAX_BEST) + continue; + strcpy(bestB[j].name, bestB[j - 1].name); + bestB[j].rating = bestB[j - 1].rating; + } + strcpy(bestB[where].name, parray[p].name); + bestB[where].rating = parray[p].b_stats.rating; + if (numB < MAX_BEST) + numB++; + } + } + if ((parray[p].s_stats.rating > 0) && (parray[p].s_stats.num > 19)) { + for (where = 0; where < numS; where++) { + if (parray[p].s_stats.rating > bestS[where].rating) + break; + } + if (where < MAX_BEST) { + for (j = numS; j > where; j--) { + if (j == MAX_BEST) + continue; + strcpy(bestS[j].name, bestS[j - 1].name); + bestS[j].rating = bestS[j - 1].rating; + } + strcpy(bestS[where].name, parray[p].name); + bestS[where].rating = parray[p].s_stats.rating; + if (numS < MAX_BEST) + numS++; + } + } + if ((parray[p].w_stats.rating > 0) && (parray[p].w_stats.num > 19)) { + for (where = 0; where < numW; where++) { + if (parray[p].w_stats.rating > bestW[where].rating) + break; + } + if (where < MAX_BEST) { + for (j = numW; j > where; j--) { + if (j == MAX_BEST) + continue; + strcpy(bestW[j].name, bestW[j - 1].name); + bestW[j].rating = bestW[j - 1].rating; + } + strcpy(bestW[where].name, parray[p].name); + bestW[where].rating = parray[p].w_stats.rating; + if (numW < MAX_BEST) + numW++; + } + } +} + +PUBLIC void BestUpdate(int p) +{ + BestRemove(p); + BestAdd(p); +} + +*/ + +PUBLIC void zero_stats(void) +{ + int i; + for (i = 0; i < MAXHIST; i++) { + sHist[i] = 0; + bHist[i] = 0; + wHist[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; + +/* + numS = 0; + numB = 0; + numW = 0; +*/ +} + +PUBLIC void rating_init(void) +{ + zero_stats(); + load_ratings(); +} + +/* This recalculates the rating info from the player data, it can take + a long time! */ +PUBLIC void rating_recalc(void) +{ + char dname[MAX_FILENAME_SIZE]; + int p1; + int c; + int t = time(0); + DIR *dirp; +#if USE_DIRENT + struct dirent *dp; +#else + struct direct *dp; +#endif + + fprintf(stderr, "FICS: Recalculating ratings at %s\n", strltime(&t)); + zero_stats(); + for (c = 'a'; c <= 'z'; c++) { + /* Never done as ratings server */ + sprintf(dname, "%s/%c", player_dir, c); + dirp = opendir(dname); + if (!dirp) + continue; + for (dp = readdir(dirp); dp != NULL; dp = readdir(dirp)) { + if (dp->d_name[0] != '.') { + p1 = player_new(); + if (player_read(p1, dp->d_name)) { + player_remove(p1); + fprintf(stderr, "FICS: Problem reading player %s.\n", dp->d_name); + continue; + } + if (parray[p1].b_stats.rating > 0) { + rating_add(parray[p1].b_stats.rating, TYPE_BLITZ); + } + if (parray[p1].s_stats.rating > 0) { + rating_add(parray[p1].s_stats.rating, TYPE_STAND); + } + if (parray[p1].w_stats.rating > 0) { + rating_add(parray[p1].w_stats.rating, TYPE_WILD); + } + player_remove(p1); + } + } + closedir(dirp); + } + 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; + } + save_ratings(); + t = time(0); + fprintf(stderr, "FICS: Finished at %s\n", strltime(&t)); +} + +/* Constants for Glicko system */ +#define Gd 3.25 +#define Gr0 1720 +#define Gs0 350 +#define Gq 0.00575646273249 +#define Gp 0.000010072398601964 + +/* End of Glicko system variables */ + +PRIVATE double Gf(double ss) +{ + return (1.0 / sqrt(1.0 + Gp * ss * ss)); +} + +/* Confusing but economical: calculate error and attenuation function together */ +PRIVATE 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))); +} + +PUBLIC double current_sterr(double s, int t) +{ + if (t < 0) + t = 0; /* this shouldn't happen */ + return (sqrt(s * s + Gd * Gd * log(1.0 + t / 60.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. */ + +PUBLIC void rating_sterr_delta(int p1, int p2, int type, int gtime, int result, + int *deltarating, double *newsterr) +{ + statistics *p1_stats; + statistics *p2_stats; + + double s1, s2; + int t1, r1, t2, r2; /* Initial sterrs and ratings */ + double E, fs2, denominator, GK, w; /* Parts of fancy formulas */ + double delta, sigma; /* Results to return */ + + if (type == TYPE_BLITZ) { + p1_stats = &parray[p1].b_stats; + p2_stats = &parray[p2].b_stats; + } else if (type == TYPE_WILD) { + p1_stats = &parray[p1].w_stats; + p2_stats = &parray[p2].w_stats; + } else { + p1_stats = &parray[p1].s_stats; + p2_stats = &parray[p2].s_stats; + } + + /* Calculate effective pre-game sterrs. ltime==0 implies never had sterr. */ + + if (p1_stats->ltime == 0) + s1 = Gs0; + else { + t1 = gtime - p1_stats->ltime; + s1 = current_sterr(p1_stats->sterr, t1); + if (s1 > Gs0) + s1 = Gs0; + } + + if (p2_stats->ltime == 0) + s2 = Gs0; + else { + t2 = gtime - p2_stats->ltime; + s2 = current_sterr(p2_stats->sterr, t2); + if (s2 > Gs0) + s2 = Gs0; + } + + /* pre-game ratings */ + if (p1_stats->rating == 0 && p1_stats->num == 0) + r1 = Gr0; + else + r1 = p1_stats->rating; + + if (p2_stats->rating == 0 && p2_stats->num == 0) + r2 = Gr0; + else + r2 = p2_stats->rating; + + /* now crunch */ + + if (result == RESULT_WIN) { + w = 1.0; + } else if (result == RESULT_DRAW) { + w = 0.5; + } else { + w = 0.0; + } + + E = GE(r1, r2, s2, &fs2); /* side effect: calculate fs2 */ + + denominator = 1.0 / (s1 * s1) + Gq * Gq * fs2 * fs2 * E * (1.0 - E); + GK = Gq * fs2 / denominator; + + delta = GK * (w - E); + if (p1_stats->rating == 0 && p1_stats->num == 0) + *deltarating = (int) (Gr0 + delta + 0.5); + else + *deltarating = (int) delta + 0.5; /* Returned values: deltarating, + newsterr */ + + sigma = 1.0 / sqrt(denominator); + *newsterr = (double) sigma; + +} + +/* vek: Next is for when we want just the delta, and not the sigma. */ + +PUBLIC int rating_delta(int p1, int p2, int type, int result, int gtime) +{ + int delta; + double sigma; + + rating_sterr_delta(p1, p2, type, gtime, result, &delta, &sigma); + return (delta); + +} + +PUBLIC int rating_update(int g) +{ + int wDelta, bDelta; + double wSigma, bSigma; /* vek */ + + int wRes, bRes; + statistics *w_stats; + statistics *b_stats; + + int gtime; + + int inprogress = (g == parray[garray[g].black].game); + /* if this is adjudication of stored game, be quiet about ratings change */ + + if (garray[g].type == TYPE_BLITZ) { + w_stats = &parray[garray[g].white].b_stats; + b_stats = &parray[garray[g].black].b_stats; + } else if (garray[g].type == TYPE_STAND) { + w_stats = &parray[garray[g].white].s_stats; + b_stats = &parray[garray[g].black].s_stats; + } else if (garray[g].type == TYPE_WILD) { + w_stats = &parray[garray[g].white].w_stats; + b_stats = &parray[garray[g].black].w_stats; + } else { + fprintf(stderr, "FICS: Can't update untimed ratings!\n"); + return -1; + } + + switch (garray[g].result) { + case END_CHECKMATE: + case END_RESIGN: + case END_FLAG: + case END_ADJWIN: + if (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: + fprintf(stderr, "FICS: Update undecided game %d?\n", garray[g].result); + return -1; + } + gtime = untenths(garray[g].timeOfStart); + rating_sterr_delta(garray[g].white, garray[g].black, + garray[g].type, gtime, wRes, + &wDelta, &wSigma); + + rating_sterr_delta(garray[g].black, garray[g].white, + garray[g].type, gtime, bRes, + &bDelta, &bSigma); + + /* 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, garray[g].type); + rating_remove(b_stats->rating, garray[g].type); + + if (inprogress) { + pprintf(garray[g].white, "%s rating adjustment: %d ", + ((garray[g].type == TYPE_BLITZ) ? "Blitz" : ((garray[g].type == TYPE_WILD) ? "Wild" : "Standard")), w_stats->rating); + pprintf(garray[g].black, "%s rating adjustment: %d ", + ((garray[g].type == TYPE_BLITZ) ? "Blitz" : ((garray[g].type == TYPE_WILD) ? "Wild" : "Standard")), b_stats->rating); + } + if (wDelta < -1000) { + pprintf(garray[g].white, "not changed due to bug (way too small)! sorry!\n"); + fprintf(stderr, "FICS: Got too small ratings bug for %s (w) vs. %s\n", + parray[garray[g].white].login, parray[garray[g].black].login); + } else if (wDelta > 3000) { + pprintf(garray[g].white, "not changed due to bug (way too big)! sorry!\n"); + fprintf(stderr, "FICS: Got too big ratings bug for %s (w) vs. %s\n", + parray[garray[g].white].login, parray[garray[g].black].login); + } else { + w_stats->rating += wDelta; + w_stats->sterr = wSigma; + } + + if (bDelta < -1000) { + pprintf(garray[g].black, "not changed due to bug (way too small)! sorry! "); + fprintf(stderr, "FICS: Got too small ratings bug for %s (b) vs. %s\n", + parray[garray[g].black].login, parray[garray[g].white].login); + } else if (bDelta > 3000) { + pprintf(garray[g].black, "not changed due to bug (way too big)! sorry! "); + fprintf(stderr, "FICS: Got too big ratings bug for %s (b) vs. %s\n", + parray[garray[g].black].login, parray[garray[g].white].login); + } else { + b_stats->rating += bDelta; + b_stats->sterr = bSigma; + } /* error messages down to vek */ + + rating_add(w_stats->rating, garray[g].type); + rating_add(b_stats->rating, 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 now saved to disk after each game */ + player_save(garray[g].white); + player_save(garray[g].black); + +/* foxbat 3.11.95 */ + if (garray[g].type == TYPE_BLITZ) { + Rb_count++; + Rb_total += (w_stats->rating + b_stats->rating) / 2.0; + } else if (garray[g].type == TYPE_STAND) { + Rs_count++; + Rs_total += (w_stats->rating + b_stats->rating) / 2.0; + } else if (garray[g].type == TYPE_WILD) { + Rw_count++; + Rw_total += (w_stats->rating + b_stats->rating) / 2.0; + } +/* end add */ +/* loon testing + BestUpdate(garray[g].white); + BestUpdate(garray[g].black); +*/ + if (inprogress) { + pprintf(garray[g].white, "--> %d\n", w_stats->rating); + pprintf(garray[g].black, "--> %d\n", b_stats->rating); + } + save_ratings(); + UpdateRank(garray[g].type, parray[garray[g].white].name, + w_stats, parray[garray[g].white].name); + UpdateRank(garray[g].type, parray[garray[g].black].name, + b_stats, parray[garray[g].black].name); + return 0; +} + +PUBLIC int com_assess(int p, param_list param) +{ + int p1 = p, p2, nowtime; + int p1_connected = 1, p2_connected = 1; + int win1, draw1, loss1; + double newsterr1; + int win2, draw2, loss2; + double newsterr2; + + nowtime = time(0); + +/* 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) { + if (parray[p].game <0) { + pprintf(p, "You are not playing a game.\n"); + return COM_OK; + } else if (garray[parray[p].game].status == GAME_EXAMINE) { + if (!strcmp(garray[parray[p].game].black_name, parray[p].name)) { + pcommand(p, "assess %s\n", garray[parray[p].game].white_name); + } else { + pcommand(p, "assess %s %s\n", + garray[parray[p].game].white_name, + garray[parray[p].game].black_name); + } + return COM_OK; + } else { + p2 = parray[p].opponent; + } + } else { + if (!FindPlayer(p, ¶m[0], &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, ¶m[1], &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 (p1 == p2) { + pprintf(p, "You can't assess the same players.\n"); + if (!p1_connected) + player_remove(p1); + if (!p2_connected) + player_remove(p2); + return COM_OK; + } + rating_sterr_delta(p1, p2, TYPE_BLITZ, nowtime, RESULT_WIN, &win1, &newsterr1); + rating_sterr_delta(p1, p2, TYPE_BLITZ, nowtime, RESULT_DRAW, &draw1, &newsterr1); + rating_sterr_delta(p1, p2, TYPE_BLITZ, nowtime, RESULT_LOSS, &loss1, &newsterr1); + rating_sterr_delta(p2, p1, TYPE_BLITZ, nowtime, RESULT_WIN, &win2, &newsterr2); + rating_sterr_delta(p2, p1, TYPE_BLITZ, nowtime, RESULT_DRAW, &draw2, &newsterr2); + rating_sterr_delta(p2, p1, TYPE_BLITZ, nowtime, RESULT_LOSS, &loss2, &newsterr2); + + pprintf(p, "\nBlitz\n %10s (%4s, RD: %5.1f) %10s (%4s, RD: %5.1f)\n", + parray[p1].name, ratstrii(parray[p1].b_stats.rating, parray[p1].registered), parray[p1].b_stats.sterr, + parray[p2].name, ratstrii(parray[p2].b_stats.rating, parray[p2].registered), parray[p2].b_stats.sterr); + pprintf(p, "Win : %4d %4d\n", win1, loss2); + pprintf(p, "Draw: %4d %4d\n", draw1, draw2); + pprintf(p, "Loss: %4d %4d\n", loss1, win2); + pprintf(p, "New RD: %5.1f %5.1f\n", newsterr1, newsterr2); + + rating_sterr_delta(p1, p2, TYPE_STAND, nowtime, RESULT_WIN, &win1, &newsterr1); + rating_sterr_delta(p1, p2, TYPE_STAND, nowtime, RESULT_DRAW, &draw1, &newsterr1); + rating_sterr_delta(p1, p2, TYPE_STAND, nowtime, RESULT_LOSS, &loss1, &newsterr1); + rating_sterr_delta(p2, p1, TYPE_STAND, nowtime, RESULT_WIN, &win2, &newsterr2); + rating_sterr_delta(p2, p1, TYPE_STAND, nowtime, RESULT_DRAW, &draw2, &newsterr2); + rating_sterr_delta(p2, p1, TYPE_STAND, nowtime, RESULT_LOSS, &loss2, &newsterr2); + + pprintf(p, "\nStandard\n %10s (%4s, RD: %5.1f) %10s (%4s, RD: %5.1f)\n", + parray[p1].name, ratstrii(parray[p1].s_stats.rating, parray[p1].registered), parray[p1].s_stats.sterr, + parray[p2].name, ratstrii(parray[p2].s_stats.rating, parray[p2].registered), parray[p2].s_stats.sterr); + pprintf(p, "Win : %4d %4d\n", win1, loss2); + pprintf(p, "Draw: %4d %4d\n", draw1, draw2); + pprintf(p, "Loss: %4d %4d\n", loss1, win2); + pprintf(p, "New RD: %5.1f %5.1f\n", newsterr1, newsterr2); + + rating_sterr_delta(p1, p2, TYPE_WILD, nowtime, RESULT_WIN, &win1, &newsterr1); + rating_sterr_delta(p1, p2, TYPE_WILD, nowtime, RESULT_DRAW, &draw1, &newsterr1); + rating_sterr_delta(p1, p2, TYPE_WILD, nowtime, RESULT_LOSS, &loss1, &newsterr1); + rating_sterr_delta(p2, p1, TYPE_WILD, nowtime, RESULT_WIN, &win2, &newsterr2); + rating_sterr_delta(p2, p1, TYPE_WILD, nowtime, RESULT_DRAW, &draw2, &newsterr2); + rating_sterr_delta(p2, p1, TYPE_WILD, nowtime, RESULT_LOSS, &loss2, &newsterr2); + + pprintf(p, "\nWild\n %10s (%4s, RD: %5.1f) %10s (%4s, RD: %5.1f)\n", + parray[p1].name, ratstrii(parray[p1].w_stats.rating, parray[p1].registered), parray[p1].w_stats.sterr, + parray[p2].name, ratstrii(parray[p2].w_stats.rating, parray[p2].registered), parray[p2].w_stats.sterr); + pprintf(p, "Win : %4d %4d\n", win1, loss2); + pprintf(p, "Draw: %4d %4d\n", draw1, draw2); + pprintf(p, "Loss: %4d %4d\n", loss1, win2); + pprintf(p, "New RD: %5.1f %5.1f\n", newsterr1, newsterr2); + + if (!p1_connected) + player_remove(p1); + if (!p2_connected) + player_remove(p2); + return COM_OK; +} + + +PUBLIC int com_best(int p, param_list param) +{ + return Best(p, param, 1); +} + +PUBLIC int com_hbest(int p, param_list param) +{ + return Best(p, param, 0); +} + +#if 0 +PUBLIC 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 + +PUBLIC int com_statistics(int p, param_list param) +{ + pprintf(p, " Standard Blitz Wild\n"); + pprintf(p, "average: %7.2f %7.2f %7.2f\n", Ratings_S_Average, Ratings_B_Average, Ratings_W_Average); + pprintf(p, "std dev: %7.2f %7.2f %7.2f\n", Ratings_S_StdDev, Ratings_B_StdDev, Ratings_W_StdDev); + pprintf(p, "number : %7d %7d %7d\n", Rs_count, Rb_count, Rw_count); + return COM_OK; +} + +PUBLIC int com_fixrank(int p, param_list param) +{ + int p1, connected; + + if (!FindPlayer(p, ¶m[0], &p1, &connected)) + return COM_OK; + UpdateRank(TYPE_BLITZ, parray[p1].name, &parray[p1].b_stats, + parray[p1].name); + UpdateRank(TYPE_STAND, parray[p1].name, &parray[p1].s_stats, + parray[p1].name); + UpdateRank(TYPE_WILD, parray[p1].name, &parray[p1].w_stats, + parray[p1].name); + if (!connected) + player_remove(p1); + return COM_OK; +} + +PUBLIC int com_rank(int p, param_list param) +{ + return DisplayRank(p, param, 1); +} + +PUBLIC int com_hrank(int p, param_list param) +{ + return DisplayRank(p, param, 0); +} + +PUBLIC int DisplayRank(int p, param_list param, int showComputers) +{ + int start, end, target, connected; + int show = SHOW_BLITZ | SHOW_STANDARD | SHOW_WILD; + + if (param[0].type == TYPE_NULL) { + DisplayTargetRank(p, parray[p].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, 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. */ +PRIVATE 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; +*/ + fprintf(stderr, "Duplicate entries found: %s.\n", name1); + return 0; +} + +PRIVATE int GetRankFileName(char *out, int type) +{ + switch (type) { + case TYPE_BLITZ:sprintf(out, "%s/rank.blitz", sdir); + return type; + case TYPE_STAND: + sprintf(out, "%s/rank.std", sdir); + return type; + case TYPE_WILD: + sprintf(out, "%s/rank.wild", sdir); + return type; + default: + return -1; + } +} + +PUBLIC void UpdateRank(int type, char *addName, + statistics *sNew, char *delName) +{ + char RankFile[MAX_FILENAME_SIZE]; + char TmpRankFile[MAX_FILENAME_SIZE]; + char line[MAX_RANK_LINE]; + char login[MAX_LOGIN_NAME]; + char command[MAX_STRING_LENGTH]; + int comp; + statistics sCur; + FILE *fp; + FILE *fptemp; + + if (GetRankFileName(RankFile, type) < 0) + return; + fp = fopen(RankFile, "r"); + if (fp == NULL) { + fprintf(stderr, "Can't open rank file to update.\n"); + return; + } + sprintf(TmpRankFile, "%s/tmpRank", sdir); + fptemp = fopen(TmpRankFile, "w"); + + 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("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); + + sprintf(command, "mv %s %s", TmpRankFile, RankFile); + system(command); +} + +PRIVATE 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); +} + +PRIVATE 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)); +} + +PRIVATE 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); +} + +PRIVATE 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)++; + } +} + +PRIVATE 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; + } +} + +PRIVATE 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); +} + +PRIVATE 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)) + ClearFlag(show, SHOW_BLITZ); + } + if (CheckFlag(show, SHOW_STANDARD)) { + PositionFilePtr(fs, sCount, &lastStd, &nTiedStd, showComp); + if (feof(fs)) + ClearFlag(show, SHOW_STANDARD); + } + if (CheckFlag(show, SHOW_WILD)) { + PositionFilePtr(fw, wCount, &lastWild, &nTiedWild, showComp); + if (feof(fw)) + ClearFlag(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; +} + +PUBLIC 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(Path, "r"); + if (fb != NULL) + blitzRank = GetRank(fb, target, showComp); + if (blitzRank < 0) + ClearFlag(show, SHOW_BLITZ); + } + if (CheckFlag(show, SHOW_STANDARD)) { + GetRankFileName(Path, TYPE_STAND); + fs = (FILE *) fopen(Path, "r"); + if (fs != NULL) + stdRank = GetRank(fs, target, showComp); + if (stdRank < 0) + ClearFlag(show, SHOW_STANDARD); + } + if (CheckFlag(show, SHOW_WILD)) { + GetRankFileName(Path, TYPE_WILD); + if (CheckFlag(show, SHOW_WILD)) + fw = (FILE *) fopen(Path, "r"); + if (fw != NULL) + wildRank = GetRank(fw, target, showComp); + if (wildRank < 0) + ClearFlag(show, SHOW_WILD); + } + if (!CheckFlag(show, SHOW_BLITZ | SHOW_STANDARD | SHOW_WILD)) { + pprintf(p, "No ratings to show.\n"); + 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); +} + +PUBLIC 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(Path, "r"); + if (fb == NULL) + ClearFlag(show, SHOW_BLITZ); + } + if (CheckFlag(show, SHOW_STANDARD)) { + GetRankFileName(Path, TYPE_STAND); + fs = (FILE *) fopen(Path, "r"); + if (fs == NULL) + ClearFlag(show, SHOW_STANDARD); + } + if (CheckFlag(show, SHOW_WILD)) { + GetRankFileName(Path, TYPE_WILD); + fw = (FILE *) fopen(Path, "r"); + if (fw == NULL) + ClearFlag(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; +} + +PUBLIC 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': + SetFlag(show, SHOW_BLITZ); + break; + case 's': + SetFlag(show, SHOW_STANDARD); + break; + case 'w': + SetFlag(show, SHOW_WILD); + break; + } + } + return (show); +} + +PUBLIC 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/FICS/ratings.h b/FICS/ratings.h new file mode 100644 index 0000000..a9823da --- /dev/null +++ b/FICS/ratings.h @@ -0,0 +1,80 @@ +/* ratings.h + * + */ + +/* + 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 + (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. +*/ + +/* Revision history: + name email yy/mm/dd Change + Richard Nash 93/10/22 Created +*/ + +#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 + +#include "command.h" + +typedef struct _rateStruct { + char name[MAX_LOGIN_NAME]; + int rating; +} rateStruct; + +extern int is_active(int); +extern void rating_init(void); +extern void rating_recalc(void); +extern void rating_sterr_delta(int, int, int, int, int, int *, double *); +extern int rating_delta(int, int, int, int, int); +extern int rating_update(int); + +extern int com_assess(int, param_list); +extern int com_best(int, param_list); +extern int com_hbest(int, param_list); +extern int com_statistics(int, param_list); +extern int com_fixrank(int, param_list); +extern int com_rank(int, param_list); +extern int com_hrank(int, param_list); + +extern void save_ratings(void); +/*extern void BestUpdate(int); */ +extern void rating_remove(int, int); +extern void rating_add(int, int); + +extern int DisplayRank(int, param_list, int); +extern void UpdateRank(int, char *, statistics *, char *); +extern int DisplayTargetRank(int, char *, int, int); +extern int DisplayRankedPlayers(int, int, int, int, int); +extern int ShowFromString(char *); +/* extern time_t time(); */ +extern int Best(int, param_list, int); + +#endif /* _RATINGS_H */ + diff --git a/FICS/rmalloc.c b/FICS/rmalloc.c new file mode 100644 index 0000000..9eb0dbc --- /dev/null +++ b/FICS/rmalloc.c @@ -0,0 +1,87 @@ +/* rmalloc.c + * + */ + +/* + 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 + (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. +*/ + +/* Revision history: + name email yy/mm/dd Change + Richard Nash 93/10/22 Created +*/ + + +#include "stdinclude.h" + +#include "common.h" + +PUBLIC unsigned int allocated_size = 0; +PUBLIC unsigned int malloc_count = 0; +PUBLIC unsigned int free_count = 0; + +PUBLIC void *rmalloc(int byteSize) +{ + void *newptr; +#ifdef HASMALLOCSIZE + allocated_size += byteSize; +#endif + malloc_count++; + newptr = malloc(byteSize); + if (newptr == NULL) { + fprintf(stderr, "Out of memory in malloc!\n"); + abort(); + } + return newptr; +} + +PUBLIC void *rrealloc(void *ptr, int byteSize) +{ +#ifdef HASMALLOCSIZE + allocated_size += (byteSize - malloc_size(ptr)); +#endif + if (ptr == NULL) { /* Sparky 3/16/95 */ + fprintf(stderr, "Hoser! Null ptr passed to rrealloc!!\n"); + return NULL; + } else { + void *newptr = realloc(ptr, byteSize); + if (newptr == NULL) { + fprintf(stderr, "Out of memory in rrealloc!\n"); + abort(); + } + return newptr; + } +} + +PUBLIC void rfree(void *ptr) +{ +#ifdef HASMALLOCSIZE + allocated_size = allocated_size - malloc_size(ptr); +#endif + if (ptr == NULL) { /* Sparky 3/16/95 */ + fprintf(stderr, "Hoser! Null ptr passed to rfree!!\n"); + } else { + free_count++; + free(ptr); + } +} + +PUBLIC void strfree (char *string) +{ + /* This routine is often called on strings that are either + a rmalloc'd value or NULL. So it's not an error to see + a NULL here. --mann + */ + if (string != NULL) rfree (string); +} diff --git a/FICS/rmalloc.h b/FICS/rmalloc.h new file mode 100644 index 0000000..cde1d06 --- /dev/null +++ b/FICS/rmalloc.h @@ -0,0 +1,38 @@ +/* rmalloc.h + * + */ + +/* + 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 + (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. +*/ + +/* Revision history: + name email yy/mm/dd Change + Richard Nash 93/10/22 Created +*/ + +#ifndef _RMALLOC_H +#define _RMALLOC_H + +extern unsigned int allocated_size; +extern unsigned int malloc_count; +extern unsigned int free_count; + +extern void *rmalloc(int); +extern void *rrealloc(void *, int); +extern void rfree(void *); +extern void strfree(char *); + +#endif /* _RMALLOC_H */ + diff --git a/FICS/shutdown.c b/FICS/shutdown.c new file mode 100644 index 0000000..4f6f91c --- /dev/null +++ b/FICS/shutdown.c @@ -0,0 +1,262 @@ +/* shutdown.c + + Contains stuff related to shutdowns + + */ + /* 12/9/95 - added reason to shutdown - DAV */ + +#include "stdinclude.h" +#include "common.h" +#include "shutdown.h" +#include "command.h" +#include "ficsmain.h" +#include "network.h" +#include "playerdb.h" +#include "utils.h" + +PRIVATE int shutdownTime = 0; +PRIVATE int lastTimeLeft; +PRIVATE int shutdownStartTime; +PRIVATE char downer[1024]; +PRIVATE char reason[1024]; + +PUBLIC void output_shut_mess() +{ + int shuttime = time(0); + fprintf(stderr, "FICS: Shutting down at %s\n", strltime(&shuttime)); +} + +PUBLIC void ShutDown(void) +{ + int p1; + int shuttime = time(0); + + for (p1 = 0; p1 < p_num; p1++) { + if (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(); + fprintf(stderr, "FICS: Shut down ordered at %s by %s.\n", strltime(&shuttime), downer); + output_shut_mess(); + net_close(); + exit(0); +} + +PUBLIC 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) { + fprintf(stderr, + "FICS: **** Server going down in %d minutes and %d seconds. ****\n\n", + timeLeft / 60, + timeLeft - ((timeLeft / 60) * 60)); + if (reason[0] != '\0') + fprintf(stderr,"FICS: We are going down because: %s.\n",reason); + for (p1 = 0; p1 < p_num; p1++) { + if (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(); + } +} + +PUBLIC 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. + */ +PUBLIC int com_shutdown(int p, param_list param) +{ + char *ptr; + int p1, secs; + + ASSERT(parray[p].adminLevel >= ADMIN_ADMIN); + strcpy(downer, parray[p].name); + shutdownStartTime = time(0); + if (shutdownTime) { /* Cancel any pending shutdowns */ + for (p1 = 0; p1 < p_num; p1++) { + if (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, "die")) { + fprintf (stderr,"%s salutes FICS and presses the self-destruct button.\n", + parray[p].name); + output_shut_mess(); + abort(); + } 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 < p_num; p1++) { + if (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; +} + +PUBLIC int server_shutdown(int secs, char *why) +{ + int p1; + + if (shutdownTime && (shutdownTime <= secs)) { + /* Server is already shutting down, I'll let it go */ + return 0; + } + strcpy(downer, "Automatic"); + shutdownTime = secs; + shutdownStartTime = time(0); + for (p1 = 0; p1 < p_num; p1++) { + if (parray[p1].status != PLAYER_PROMPT) + continue; + pprintf(p1, "\n\n **** Automatic Server shutdown. ****\n"); + pprintf(p1, "%s\n", why); + pprintf_prompt(p1, + " **** Server going down in %d minutes and %d seconds. ****\n\n", + shutdownTime / 60, + shutdownTime - ((shutdownTime / 60) * 60)); + } + fprintf(stderr, "FICS: **** Automatic Server shutdown. ****\n"); + fprintf(stderr, "FICS: %s\n", why); + return 0; +} + +PUBLIC int com_whenshut(int p, param_list param) + +{ + int result = check_and_print_shutdown(p); + if (result == 0) { + pprintf (p,"No shutdown currently in progress\n"); + } + return COM_OK; +} diff --git a/FICS/shutdown.h b/FICS/shutdown.h new file mode 100644 index 0000000..5bbf77b --- /dev/null +++ b/FICS/shutdown.h @@ -0,0 +1,14 @@ +/* shutdown.h */ + +#ifndef _SHUTDOWN_H +#define _SHUTDOWN_H + +extern void output_shut_mess(); +extern int com_shutdown(); +extern void ShutHeartBeat(); +extern void ShutDown(); +extern int server_shutdown(); +extern int check_and_print_shutdown(int); +extern int com_whenshut(); + +#endif /* _SHUTDOWN_H */ diff --git a/FICS/stdinclude.h b/FICS/stdinclude.h new file mode 100644 index 0000000..295774e --- /dev/null +++ b/FICS/stdinclude.h @@ -0,0 +1,174 @@ +/* stdinclude.h + * + */ + +/* + 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 + (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. +*/ + +/* Revision history: + name email yy/mm/dd Change + Richard Nash 93/10/22 Created +*/ + +#ifndef _STDINCLUDE_H +#define _STDINCLUDE_H + +#include + +/* Set up system specific defines */ +#if defined(SYSTEM_NEXT) + +#define HASMALLOCSIZE +#include + +#elif defined(SYSTEM_ULTRIX) + +#include +#include + +#endif + +#ifdef SYSTEM_USL +# define NO_TM_ZONE +#endif + +#ifdef SYSTEM_SUN4 +# define USE_VARARGS +#endif + +#ifdef SGI +#define _BSD_SIGNALS +#include +#include +#endif + +#if defined(SYSTEM_RS6K) +#include +#include +#define USE_DIRENT +#endif + +/* These are included into every .c file */ +#if defined(SYSTEM_SUN5) +#define USE_RLIMIT +#define USE_TIMES +#define USE_WAITPID +#define GOOD_STDIO +#define NO_TM_ZONE +#include +#include +#include +#include +#include +#include +#include +#define direct dirent + +#else +#include +#include +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* Forward declare the functions that aren't defined above */ + +#if defined(SGI) +#include +#define GOOD_STDIO +#define NO_TM_ZONE +#else +#define GOOD_STDIO +/* +extern FILE *popen(char *, char *); +extern int pclose(FILE *); +extern int fputs(char *, FILE *); +extern int fseek(FILE *, long, int); +extern int fread(char *, int, int, FILE *); +extern int fwrite(char *, int, int, FILE *); +extern int socket(int, int, int); +extern int atoi (char *nptr); +extern long atol (char *nptr); +extern int truncate(char *, off_t), ftruncate(int, off_t); +*/ +#endif + +#ifndef GOOD_STDIO +extern int fclose(FILE *); +extern int fscanf(FILE *, char *, ...); +extern int fprintf(FILE *, char *, ...); +extern int printf(char *, ...); +#endif + + +#ifndef NETBSD +extern char *crypt (char *key, char *salt); +#endif + +extern time_t time(time_t *); +extern int rand(void); +extern int close(int); +extern size_t malloc_size(void *ptr); + +#ifdef __STDC__ +/* extern fcntl(int fildes, int cmd, ...); */ +/* extern open(char *path, int oflag, ...); */ +/* extern int ioctl(int, long, ...); */ + +#else + extern fcntl(); + extern open(); + extern int ioctl(); + +#endif /* __STDC__ */ +/* extern void *malloc(unsigned int size); */ +/* extern void *calloc(unsigned int num, unsigned int size); */ +/* extern void *realloc(void *addr, unsigned int size); */ +/* extern void free(void *data); */ +/* extern void malloc_good_size(unsigned int size); */ +/* extern int link(); */ +/* extern int unlink(); */ +/* extern int rename(); */ +/* extern int getpid(); */ +/* extern int kill(); */ +/* extern int fork(); */ +/* extern int access(); */ +/* extern int getdtablesize(); */ +/* extern int write(); */ +#if !defined(SYSTEM_ULTRIX) +/* extern int sleep(); */ +/* extern int getuid(); */ +extern int statfs(); +#endif + +#endif /* _STDINCLUDE_H */ + diff --git a/FICS/stdinclude.h.orig b/FICS/stdinclude.h.orig new file mode 100644 index 0000000..394b007 --- /dev/null +++ b/FICS/stdinclude.h.orig @@ -0,0 +1,164 @@ +/* stdinclude.h + * + */ + +/* + 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 + (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. +*/ + +/* Revision history: + name email yy/mm/dd Change + Richard Nash 93/10/22 Created +*/ +#include + +/* Set up system specific defines */ +#if defined(SYSTEM_NEXT) + +#define HASMALLOCSIZE +#include + +#elif defined(SYSTEM_ULTRIX) + +#include +#include + +#endif + +#ifdef SYSTEM_USL +# define NO_TM_ZONE +#endif + +#ifdef SYSTEM_SUN4 +# define USE_VARARGS +#endif + +#ifdef SGI +#define _BSD_SIGNALS +#include +#include +#endif + +#if defined(SYSTEM_RS6K) +#include +#include +#define USE_DIRENT +#endif + +/* These are included into every .c file */ +#if defined(SYSTEM_SUN5) +#define USE_RLIMIT +#define USE_TIMES +#define USE_WAITPID +#define GOOD_STDIO +#define NO_TM_ZONE +#include +#include +#include +#include +#include +#include +#include +#define direct dirent + +#else +#include +#include +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* Forward declare the functions that aren't defined above */ + +#if defined(SGI) +#include +#define GOOD_STDIO +#define NO_TM_ZONE +#else +#define GOOD_STDIO +/* +extern FILE *popen(char *, char *); +extern int pclose(FILE *); +extern int fputs(char *, FILE *); +extern int fseek(FILE *, long, int); +extern int fread(char *, int, int, FILE *); +extern int fwrite(char *, int, int, FILE *); +extern int socket(int, int, int); +extern int atoi (char *nptr); +extern long atol (char *nptr); +extern int truncate(char *, off_t), ftruncate(int, off_t); +*/ +#endif + +#ifndef GOOD_STDIO +extern int fclose(FILE *); +extern int fscanf(FILE *, char *, ...); +extern int fprintf(FILE *, char *, ...); +extern int printf(char *, ...); +#endif + +extern time_t time(time_t *); +extern int rand(void); +extern int close(int); +extern char *crypt (char *key, char *salt); +extern size_t malloc_size(void *ptr); + +#ifdef __STDC__ +/* extern fcntl(int fildes, int cmd, ...); */ +/* extern open(char *path, int oflag, ...); */ +/* extern int ioctl(int, long, ...); */ + +#else + extern fcntl(); + extern open(); + extern int ioctl(); + +#endif /* __STDC__ */ +/* extern void *malloc(unsigned int size); */ +/* extern void *calloc(unsigned int num, unsigned int size); */ +/* extern void *realloc(void *addr, unsigned int size); */ +/* extern void free(void *data); */ +/* extern void malloc_good_size(unsigned int size); */ +/* extern int link(); */ +/* extern int unlink(); */ +/* extern int rename(); */ +/* extern int getpid(); */ +/* extern int kill(); */ +/* extern int fork(); */ +/* extern int access(); */ +/* extern int getdtablesize(); */ +/* extern int write(); */ +#if !defined(SYSTEM_ULTRIX) +/* extern int sleep(); */ +/* extern int getuid(); */ +extern int statfs(); +#endif + diff --git a/FICS/talkproc.c b/FICS/talkproc.c new file mode 100644 index 0000000..cfd35b6 --- /dev/null +++ b/FICS/talkproc.c @@ -0,0 +1,1247 @@ +/* talkproc.c + * + */ + +/* + 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 + (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. +*/ + +/* Revision history: + name yy/mm/dd Change + hersco and Marsalis 95/07/24 Created + Sparky 95/10/05 + Modifed tell function for the following + changes: no longer informs you that someone + is censoring in tells to channels, whisper or + kibitz. Titles now shown instead of ratings + in kibitz and whisper, admins on duty now are + shown as (*), and computers marked as (C) as + well as with rating. + +*/ + +#include "stdinclude.h" + +#include "common.h" +#include "talkproc.h" +#include "comproc.h" +#include "command.h" +#include "utils.h" +#include "ficsmain.h" +#include "config.h" +#include "playerdb.h" +#include "network.h" +#include "rmalloc.h" +#include "variable.h" +#include "gamedb.h" +#include "gameproc.h" +#include "obsproc.h" +/* #include "hostinfo.h" */ +#include "multicol.h" +#include "lists.h" +#include "formula.h" +#include + +#include + +/* grimm */ +#if defined(SGI) +#else +/* int system(char *arg); */ +#endif + +int quota_time; + +#if 0 +PUBLIC int com_query(int p, param_list param) +{ + int p1; + int count = 0; + + if (!parray[p].registered) { + pprintf(p, "Only registered players can use the query command.\n"); + return COM_OK; + } + if (in_list(p, L_MUZZLE, parray[p].login)) { + pprintf(p, "You are muzzled.\n"); + return COM_OK; + } + if (!printablestring(param[0].val.string)) { + pprintf(p, "Your message contains some unprintable character(s).\n"); + return COM_OK; + } + if (!parray[p].query_log) { + parray[p].query_log = tl_new(5); + } else { + if (tl_numinlast(parray[p].query_log, 60 * 60) >= 2) { + pprintf(p, "Your can only query twice per hour.\n"); + return COM_OK; + } + } + in_push(IN_SHOUT); + for (p1 = 0; p1 < p_num; p1++) { + if (p1 == p) + continue; + if (parray[p1].status != PLAYER_PROMPT) + continue; + if (player_censored(p1, p)) + continue; + count++; + if (parray[p1].highlight) { + pprintf_prompt(p1, "\n\033[7m%s queries:\033[0m %s\n", parray[p].name, + param[0].val.string); + } else { + pprintf_prompt(p1, "\n%s queries: %s\n", parray[p].name, + param[0].val.string); + } + } + pprintf(p, "Query heard by %d player(s).\n", count); + tl_logevent(parray[p].query_log, 1); + in_pop(); + return COM_OK; +} +#endif + +/* hawk: hacked it to fit ALL persons - quota list is not needed anymore */ +int CheckShoutQuota(int p) +{ + int timenow = time(0); + int timeleft = 0; + + if (((timeleft = timenow - parray[p].lastshout_a) < quota_time) && + (parray[p].adminLevel == 0)) { + return (quota_time - timeleft); + } else { + return 0; + } +} + +PUBLIC int com_shout(int p, param_list param) +{ + int p1; + int count = 0; + int timeleft; /* time left for quota if applicable */ + + if (!parray[p].registered) { + pprintf(p, "Only registered players can use the shout command.\n"); + return COM_OK; + } + if (in_list(p, L_MUZZLE, parray[p].login)) { + pprintf(p, "You are muzzled.\n"); + return COM_OK; + } + if (param[0].type == TYPE_NULL) { + if ((timeleft = CheckShoutQuota(p))) { + 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 = CheckShoutQuota(p))) { + pprintf(p, "Shout not sent. Next shout in %d seconds.\n", timeleft); + return COM_OK; + } + parray[p].lastshout_a = parray[p].lastshout_b; + parray[p].lastshout_b = time(0); + if (!printablestring(param[0].val.string)) { + pprintf(p, "Your message contains some unprintable character(s).\n"); + return COM_OK; + } +/* in_push(IN_SHOUT); */ + for (p1 = 0; p1 < p_num; p1++) { + if (p1 == p) + continue; + if (parray[p1].status != PLAYER_PROMPT) + continue; + if (!parray[p1].i_shout) + continue; + if (player_censored(p1, p)) + continue; + count++; + pprintf_prompt(p1, "\n%s shouts: %s\n", parray[p].name, + param[0].val.string); + } + pprintf(p, "(%d) %s shouts: %s\n", count, parray[p].name, + param[0].val.string); +/* in_pop(); */ + if ((timeleft = CheckShoutQuota(p))) { + pprintf(p, "Next shout in %d seconds.\n", timeleft); + return COM_OK; + } + return COM_OK; +} + +PUBLIC int com_cshout(int p, param_list param) +{ + int p1; + int count = 0; + + if (!parray[p].registered) { + pprintf(p, "Only registered players can use the cshout command.\n"); + return COM_OK; + } + if (in_list(p, L_CMUZZLE, parray[p].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; + } +/* in_push(IN_SHOUT); */ + for (p1 = 0; p1 < p_num; p1++) { + if (p1 == p) + continue; + if (parray[p1].status != PLAYER_PROMPT) + continue; + if (!parray[p1].i_cshout) + continue; + if (player_censored(p1, p)) + continue; + count++; + pprintf_prompt(p1, "\n%s c-shouts: %s\n", parray[p].name, + param[0].val.string); + } + pprintf(p, "(%d) %s c-shouts: %s\n", count, parray[p].name, + param[0].val.string); +/* in_pop(); */ + return COM_OK; +} + +PUBLIC int com_it(int p, param_list param) +{ + int p1; + int count = 0; + int timeleft; + + if (!parray[p].registered) { + pprintf(p, "Only registered players can use the it command.\n"); + return COM_OK; + } + if (in_list(p, L_MUZZLE, parray[p].login)) { + pprintf(p, "You are muzzled.\n"); + return COM_OK; + } + if (param[0].type == TYPE_NULL) { + if ((timeleft = CheckShoutQuota(p))) { + 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 = CheckShoutQuota(p))) { + pprintf(p, "Shout not sent. Next shout in %d seconds.\n", timeleft); + return COM_OK; + } + parray[p].lastshout_a = parray[p].lastshout_b; + parray[p].lastshout_b = time(0); + + if (!printablestring(param[0].val.string)) { + pprintf(p, "Your message contains some unprintable character(s).\n"); + return COM_OK; + } +/* in_push(IN_SHOUT); */ + for (p1 = 0; p1 < p_num; p1++) { + if (p1 == p) + continue; + if (parray[p1].status != PLAYER_PROMPT) + continue; + if (!parray[p1].i_shout) + continue; + if (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", parray[p].name, + param[0].val.string); + } else { + pprintf_prompt(p1, "\n--> %s %s\n", parray[p].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, "(%d) --> %s%s\n", count, parray[p].name, param[0].val.string); + } else { + pprintf(p, "(%d) --> %s %s\n", count, parray[p].name, param[0].val.string); + } +/* in_pop(); */ + if ((timeleft = CheckShoutQuota(p))) { + pprintf(p, "Next shout in %d seconds.\n", timeleft); + return COM_OK; + } + return COM_OK; +} + +#define TELL_TELL 0 +#define TELL_SAY 1 +#define TELL_WHISPER 2 +#define TELL_KIBITZ 3 +#define TELL_CHANNEL 4 +PRIVATE int tell(int p, int p1, char *msg, int why, int ch) +{ + char tmp[MAX_LINE_SIZE]; + int rating; + int rating1; + + if (!printablestring(msg)) { + pprintf(p, "Your message contains some unprintable character(s).\n"); + return COM_OK; + } +/* if (p1 == p) { + * pprintf(p, "Quit talking to yourself! It's embarrassing.\n"); + * return COM_OK; + * } + */ + if ((!parray[p1].i_tell) && (!parray[p].registered)) { + pprintf(p, "Player \"%s\" isn't listening to unregistered tells.\n", + parray[p1].name); + return COM_OK; + } + if ((player_censored(p1, p)) && (parray[p].adminLevel == 0)) { + if ((why != TELL_KIBITZ) || (why != TELL_WHISPER) || (why != TELL_CHANNEL)) + { + pprintf(p, "Player \"%s\" is censoring you.\n", parray[p1].name); + } + return COM_OK; + } +/* in_push(IN_TELL); */ + switch (why) { + case TELL_SAY: + pprintf_highlight(p1, "\n%s", parray[p].name); + pprintf_prompt(p1, " says: %s\n", msg); + break; + case TELL_WHISPER: + case TELL_KIBITZ: + rating = GetRating(&parray[p], TYPE_BLITZ); + if (rating < ( rating1 = ( GetRating(&parray[p], TYPE_STAND ) ) ) ) + rating = rating1; + if (in_list(p, L_FM, parray[p].name)) + pprintf(p1, "\n%s(FM)", parray[p].name); + else if (in_list(p, L_IM, parray[p].name)) + pprintf(p1, "\n%s(IM)", parray[p].name); + else if (in_list(p, L_GM, parray[p].name)) + pprintf(p1, "\n%s(GM)", parray[p].name); + else if ((parray[p].adminLevel >= 10) && (parray[p].i_admin)) + pprintf(p1, "\n%s(*)", parray[p].name); + else if ((rating >= parray[p1].kiblevel) || + ((parray[p].adminLevel >= 10) && (parray[p].i_admin))) + if (!parray[p].registered) + pprintf(p1, "\n%s(++++)", parray[p].name); + + else if (rating != 0) + if (in_list(p, L_COMPUTER, parray[p].name)) + pprintf(p1, "\n%s(%d)(C)", parray[p].name, rating); + else + pprintf(p1, "\n%s(%d)", parray[p].name, rating); + else + pprintf(p1, "\n%s(----)", parray[p].name, rating); + 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", parray[p].name); + pprintf_prompt(p1, "(%d): %s\n", ch, msg); + break; + case TELL_TELL: + default: + if (parray[p1].highlight) { + pprintf_highlight(p1, "\n%s", parray[p].name); + } else { + pprintf(p1, "\n%s", parray[p].name); + } + pprintf_prompt(p1, " tells you: %s\n", msg); + break; + } + tmp[0] = '\0'; + if (!(parray[p1].busy[0] == '\0')) { + sprintf(tmp, ", who %s (idle: %s)", 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))); + } + /* else sprintf(tmp," "); */ + } + if ((why == TELL_SAY) || (why == TELL_TELL)) { + pprintf(p, "(told %s%s)\n", parray[p1].name, + (((parray[p1].game>=0) && (garray[parray[p1].game].status == GAME_EXAMINE)) + ? ", who is examining a game" : + (parray[p1].game >= 0 && (parray[p1].game != parray[p].game)) + ? ", who is playing" : tmp)); + parray[p].last_tell = p1; + } +/* in_pop(); */ + return COM_OK; +} + +PUBLIC int com_ptell(int p, param_list param) /*tells partner - doesn't change last tell */ + +{ + char tmp[MAX_LINE_SIZE]; + int p1; + + if (parray[p].partner < 0) { + pprintf (p, "You do not have a partner at present.\n"); + return COM_OK; + } + + p1 = parray[p].partner; + if ((p1 < 0) || (parray[p1].status == PLAYER_PASSWORD) + || (parray[p1].status == PLAYER_LOGIN)) { + pprintf(p, "Your partner is not logged in.\n"); + return COM_OK; + } + if (parray[p1].highlight) { + pprintf_highlight(p1, "\n%s", parray[p].name); + } else { + pprintf(p1, "\n%s", parray[p].name); + } + pprintf_prompt(p1, " (your partner) tells you: %s\n", param[0].val.string); + tmp[0] = '\0'; + if (!(parray[p1].busy[0] == '\0')) { + sprintf(tmp, ", who %s (idle: %s)", 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))); + } + } + /* else sprintf(tmp," "); */ + pprintf(p, "(told %s%s)\n", parray[p1].name, + (((parray[p1].game>=0) && (garray[parray[p1].game].status == GAME_EXAMINE)) + ? ", who is examining a game" : + (parray[p1].game >= 0 && (parray[p1].game != parray[p].game)) + ? ", who is playing" : tmp)); + return COM_OK; +} + +PRIVATE int chtell(int p, int ch, char *msg) +{ + int p1, count = 0; + + if ((ch == 0) && (parray[p].adminLevel == 0)) { + 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; + } + + for (p1 = 0; p1 < p_num; p1++) { + if ((p1 == p) || (parray[p1].status != PLAYER_PROMPT)) + continue; + if ((on_channel(ch, p1)) && (!player_censored(p1, p))) { + tell(p, p1, msg, TELL_CHANNEL, ch); + count++; + } + } + + if (count) + parray[p].last_channel = ch; + + pprintf(p, "(%d->(%d))\n", ch, count); + if (!on_channel(ch, p)) + pprintf(p, " (You're not listening to channel %d.)\n", ch); + + return COM_OK; +} + +PUBLIC int com_whisper(int p, param_list param) +{ + int g; + int p1; + int count = 0; + + if (!parray[p].num_observe && parray[p].game < 0) { + pprintf(p, "You are not playing or observing a game.\n"); + return COM_OK; + } + if (!parray[p].registered && (parray[p].game == -1)) { + pprintf(p, "You must be registered to whisper other people's games.\n"); + return COM_OK; + } + if (parray[p].game >= 0) + g = parray[p].game; + else + g = parray[p].observe_list[0]; + for (p1 = 0; p1 < p_num; p1++) { + if (p1 == p) + continue; + if (parray[p1].status != PLAYER_PROMPT) + continue; + if (player_is_observe(p1, g) || + (garray[g].link >= 0 && player_is_observe(p1, garray[g].link))) { + tell(p, p1, param[0].val.string, TELL_WHISPER, 0); + if ((parray[p].adminLevel >= ADMIN_ADMIN) || !garray[g].private) + count++; + } + } + pprintf(p, "whispered to %d.\n", count); + return COM_OK; +} + +PUBLIC int com_kibitz(int p, param_list param) +{ + int g; + int p1; + int count = 0; + + if (!parray[p].num_observe && parray[p].game < 0) { + pprintf(p, "You are not playing or observing a game.\n"); + return COM_OK; + } + if (!parray[p].registered && (parray[p].game == -1)) { + pprintf(p, "You must be registered to kibitz other people's games.\n"); + return COM_OK; + } + if (parray[p].game >= 0) + g = parray[p].game; + else + g = parray[p].observe_list[0]; + for (p1 = 0; p1 < p_num; p1++) { + if (p1 == p) + continue; + if (parray[p1].status != PLAYER_PROMPT) + continue; + if ((player_is_observe(p1, g) || parray[p1].game == g || + (garray[g].link >= 0 && + (player_is_observe(p1, garray[g].link) || parray[p1].game == garray[g].link) + ) + ) && parray[p1].i_kibitz) { + tell(p, p1, param[0].val.string, TELL_KIBITZ, 0); + if ((parray[p].adminLevel >= ADMIN_ADMIN) || !garray[g].private || (parray[p1].game == g)) + count++; + } + } + pprintf(p, "kibitzed to %d.\n", count); + return COM_OK; +} + +PUBLIC int com_tell(int p, param_list param) +{ + int p1; + + if (param[0].type == TYPE_NULL) + return COM_BADPARAMETERS; + if (param[0].type == TYPE_WORD) { + stolower(param[0].val.word); + if (!strcmp(param[0].val.word, ".")) { + if (parray[p].last_tell < 0) { + pprintf(p, "No one to tell anything to.\n"); + return COM_OK; + } else { + return tell(p, parray[p].last_tell, param[1].val.string, TELL_TELL, 0); + } + } + if (!strcmp(param[0].val.word, ",")) { + if (parray[p].last_channel < 0) { + pprintf(p, "No previous channel.\n"); + return COM_OK; + } else { + return chtell(p, parray[p].last_channel, param[1].val.string); + } + } + p1 = player_find_part_login(param[0].val.word); + if ((p1 < 0) || (parray[p1].status == PLAYER_PASSWORD) + || (parray[p1].status == PLAYER_LOGIN)) { + pprintf(p, "No user named \"%s\" is logged in.\n", param[0].val.word); + return COM_OK; + } + return tell(p, p1, param[1].val.string, TELL_TELL, 0); + } else { /* Channel */ + return chtell(p, param[0].val.integer, param[1].val.string); + } +} + +PUBLIC int com_xtell(int p, param_list param) +{ + int p1; + char *msg; + char tmp[2048]; + + msg = param[1].val.string; + p1 = player_find_part_login(param[0].val.word); + if ((p1 < 0) || (parray[p1].status == PLAYER_PASSWORD) + || (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 ((!parray[p1].i_tell) && (!parray[p].registered)) { + pprintf(p, "Player \"%s\" isn't listening to unregistered tells.\n", + parray[p1].name); + return COM_OK; + } + if ((player_censored(p1, p)) && (parray[p].adminLevel == 0)) { + pprintf(p, "Player \"%s\" is censoring you.\n", parray[p1].name); + return COM_OK; + } + if (parray[p1].highlight) { + pprintf_highlight(p1, "\n%s", parray[p].name); + } else { + pprintf(p1, "\n%s", parray[p].name); + } + pprintf_prompt(p1, " tells you: %s\n", msg); + + tmp[0] = '\0'; + if (!(parray[p1].busy[0] == '\0')) { + sprintf(tmp, ", who %s (idle: %s)", 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", parray[p1].name, + (((parray[p1].game>=0) && (garray[parray[p1].game].status == GAME_EXAMINE)) + ? ", who is examining a game" : + (parray[p1].game >= 0 && (parray[p1].game != parray[p].game)) + ? ", who is playing" : tmp)); + return COM_OK; +} + +PUBLIC int com_say(int p, param_list param) +{ + if (parray[p].opponent < 0) { + if (parray[p].last_opponent < 0) { + pprintf(p, "No one to say anything to, try tell.\n"); + return COM_OK; + } else { + return tell(p, parray[p].last_opponent, param[0].val.string, TELL_SAY, 0); + } + } + return tell(p, parray[p].opponent, param[0].val.string, TELL_SAY, 0); +} + +#if 0 +PRIVATE int notorcen(int p, param_list param, int *num, int max, + char **list, char *listname) +{ + int i, p1, connected; + + if (param[0].type != TYPE_WORD) { + if (!*num) { + pprintf(p, "Your %s list is empty.\n", listname); + return COM_OK; + } else + pprintf(p, "-- Your %s list contains %d names: --", listname, *num); + /* New code to print names in columns */ + { + multicol *m = multicol_start(MAX_NOTIFY + 1); + for (i = 0; i < *num; i++) + multicol_store_sorted(m, list[i]); + multicol_pprint(m, p, 78, 2); + multicol_end(m); + } + return COM_OK; + } + if (*num >= max) { + pprintf(p, "Sorry, your %s list is already full.\n", listname); + return COM_OK; + } + if (!FindPlayer(p, param[0].val.word, &p1, &connected)) + return COM_OK; + + for (i = 0; i < *num; i++) { + if (!strcasecmp(list[i], param[0].val.word)) { + pprintf(p, "Your %s list already includes %s.\n", + listname, parray[p1].name); + if (!connected) + player_remove(p1); + return COM_OK; + } + } + if (p1 == p) { + pprintf(p, "You can't %s yourself.\n", listname); + return COM_OK; + } + list[*num] = strdup(parray[p1].name); + ++(*num); + pprintf(p, "%s is now on your %s list.\n", parray[p1].name, listname); + if (!connected) + player_remove(p1); + return COM_OK; +} + +PRIVATE int unnotorcen(int p, param_list param, int *num, int max, + char **list, char *listname) +{ + char *pname = NULL; + int i, j; + int unc = 0; + + if (param[0].type == TYPE_WORD) { + pname = param[0].val.word; + } + for (i = 0; i < *num; i++) { + if (!pname || !strcasecmp(pname, list[i])) { + pprintf(p, "%s is removed from your %s list.\n", + list[i], listname); + rfree(list[i]); + list[i] = NULL; + unc++; + } + } + if (unc) { + i = 0; + j = 0; + while (j < *num) { + if (list[j] != NULL) { + list[i++] = list[j]; + } + j++; + } + while (i < j) { + list[i++] = NULL; + } + (*num) -= unc; + } else { + pprintf(p, "No one was removed from your %s list.\n", listname); + } + return COM_OK; +} + + +PUBLIC int com_notify(int p, param_list param) +{ + return notorcen(p, param, &parray[p].num_notify, MAX_NOTIFY, + parray[p].notifyList, "notify"); +} + +PUBLIC int com_censor(int p, param_list param) +{ + return notorcen(p, param, &parray[p].num_censor, MAX_CENSOR, + parray[p].censorList, "censor"); +} + +PUBLIC int com_unnotify(int p, param_list param) +{ + return unnotorcen(p, param, &parray[p].num_notify, MAX_NOTIFY, + parray[p].notifyList, "notify"); +} + +PUBLIC int com_uncensor(int p, param_list param) +{ + return unnotorcen(p, param, &parray[p].num_censor, MAX_CENSOR, + parray[p].censorList, "censor"); +} + +#endif + +#if 0 /* now in lists.c */ +PUBLIC int com_channel(int p, param_list param) +{ + int i, err; + + if (param[0].type == TYPE_NULL) { /* Turn off all channels */ + for (i = 0; i < MAX_CHANNELS; i++) { + if (!channel_remove(i, p)) + pprintf(p, "Channel %d turned off.\n", i); + } + } else { + i = param[0].val.integer; + if ((i == 0) && (!on_channel(i, p)) && (parray[p].adminLevel == 0)) { + pprintf(p, "Only admins may join channel 0.\n"); + return COM_OK; + } + if (i < 0) { + pprintf(p, "The lowest channel number is 0.\n"); + return COM_OK; + } + if (i >= MAX_CHANNELS) { + pprintf(p, "The maximum channel number is %d.\n", MAX_CHANNELS - 1); + return COM_OK; + } + if (on_channel(i, p)) { + if (!channel_remove(i, p)) + pprintf(p, "Channel %d turned off.\n", i); + } else { + if (!(err = channel_add(i, p))) + pprintf(p, "Channel %d turned on.\n", i); + else { + if (err == 1) + pprintf(p, "Channel %d is already full.\n", i); + if (err == 3) + pprintf(p, "Maximum channel number exceeded.\n"); + } + } + } + return COM_OK; +} +#endif + +PUBLIC int com_inchannel(int p, param_list param) +{ + int p1,count = 0; + char tmp[18]; + + + if (param[0].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) || (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:",parray[p1].name); /* no \n */ + if (list_channels (p,p1)) + pprintf (p," No channels found.\n",parray[p1].name); + return COM_OK; + } else { + sprintf (tmp,"%d",param[0].val.integer); + for (p1 = 0; p1 < p_num; p1++) { + if (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%s",parray[p1].name,(((parray[p1].adminLevel >= 10) && (parray[p1].i_admin) && (param[0].val.integer < 2)) ? "(*)" : "")); + 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; + } +} + +#if 0 /* if anyone can do inchannel NULL without n^3 computation + please do so*/ +PUBLIC int com_inchannel(int p, param_list param) +{ + int c1, c2; + int i, j, count = 0; + + if (param[0].type == TYPE_NULL) { /* List everyone on every channel */ + c1 = -1; + c2 = -1; + } else if (param[1].type == TYPE_NULL) { /* One parameter */ + c1 = param[0].val.integer; + if (c1 < 0) { + pprintf(p, "The lowest channel number is 0.\n"); + return COM_OK; + } + c2 = -1; + } else { /* Two parameters */ + c1 = param[0].val.integer; + c2 = param[1].val.integer; + if ((c1 < 0) || (c2 < 0)) { + pprintf(p, "The lowest channel number is 0.\n"); + return COM_OK; + } + pprintf(p, "Two parameter inchannel is not implemented.\n"); + return COM_OK; + } + if ((c1 >= MAX_CHANNELS) || (c2 >= MAX_CHANNELS)) { + pprintf(p, "The maximum channel number is %d.\n", MAX_CHANNELS - 1); + return COM_OK; + } + for (i = 0; i < MAX_CHANNELS; i++) { + if (numOn[i] && ((c1 < 0) || (i == c1))) { + /* First get rid of ghosts. */ + for (j=0; j < numOn[i]; j++) { + if (parray[channels[i][j]].status == PLAYER_PROMPT) + continue; + channels[i][j] = channels[i][--numOn[i]]; + j--; + } + pprintf(p, "Channel %d:", i); + for (j = 0; j < numOn[i]; j++) { + pprintf(p, " %s", parray[channels[i][j]].name); + if ((i==0 || i==1) && parray[channels[i][j]].adminLevel >= 10 + && parray[channels[i][j]].i_admin) + pprintf(p, "(*)"); + } + count++; + pprintf(p, "\n"); + } + } + if (!count) { + if (c1 < 0) + pprintf(p, "No channels in use.\n"); + else + pprintf(p, "Channel not in use.\n"); + } + return COM_OK; +} +#endif + +PUBLIC int com_sendmessage(int p, param_list param) +{ + int p1, connected = 1; + + if (!parray[p].registered) { + pprintf(p, "You are not registered and cannot send messages.\n"); + return COM_OK; + } + if ((param[0].type == TYPE_NULL) || (param[1].type == TYPE_NULL)) { + pprintf(p, "No message sent.\n"); + return COM_OK; + } + if (!FindPlayer(p, param[0].val.word, &p1, &connected)) + return COM_OK; + + if (!parray[p1].registered) { + pprintf(p, "Player \"%s\" is unregistered and cannot receive messages.\n", + parray[p1].name); + return COM_OK; /* no need to removed */ + } + + if ((player_censored(p1, p)) && (parray[p].adminLevel == 0)) { + pprintf(p, "Player \"%s\" is censoring you.\n", 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", + parray[p1].name); + } else { + if (connected) { + pprintf(p1, "\n%s just sent you a message:\n", parray[p].name); + pprintf_prompt(p1, " %s\n", param[1].val.string); + } + } + if (!connected) + player_remove(p1); + return COM_OK; +} + +PUBLIC int com_messages(int p, param_list param) +{ + int start; + /* int end = -1; */ + + if (!parray[p].registered) { + 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; +} + +PUBLIC int com_clearmessages(int p, param_list param) +{ + int start; + + 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) { + start = param[0].val.integer; + ClrMsgRange (p, start, start); + } + return COM_OK; +} + +PUBLIC int com_mailmess(int p, param_list param) +{ + char *buffer[1000]; + char mdir[MAX_FILENAME_SIZE]; + char filename[MAX_FILENAME_SIZE]; + char subj[81], fname[MAX_FILENAME_SIZE]; + + + if (!parray[p].registered) { + pprintf(p, "Only registered people can use the mailmess command.\n"); + return COM_OK; + } + sprintf(filename, "%s.messages", parray[p].login); + sprintf(mdir, "%s/player_data/%c/", stats_dir, parray[p].login[0]); + + if (search_directory(mdir, filename, buffer, 1000)) { + sprintf(subj, "Your FICS messages from server %s", fics_hostname); + sprintf(fname, "%s/%s", mdir, filename); + mail_file_to_user (p, subj, fname); + pprintf(p, "Messages sent to %s\n", parray[p].emailAddress); + } else { + pprintf(p, "You have no messages.\n"); + } + return COM_OK; + +} + +PUBLIC int com_znotify(int p, param_list param) +{ + int p1, count = 0; + + for (p1 = 0; p1 < p_num; p1++) { + if (player_notified(p, p1)) { + if (!count) + pprintf(p, "Present company on your notify list:\n "); + pprintf(p, " %s", parray[p1].name); + count++; + } + } + if (count) + pprintf(p, ".\n"); + else + pprintf(p, "No one from your notify list is logged on.\n"); + + count = 0; + for (p1 = 0; p1 < p_num; p1++) { + if (player_notified(p1, p) && parray[p1].status == PLAYER_PROMPT) { + if (!count) + pprintf(p, + "The following players have you on their notify list:\n "); + pprintf(p, " %s", parray[p1].name); + count++; + } + } + if (count) + pprintf(p, ".\n"); + else + pprintf(p, "No one logged in has you on their notify list.\n"); + return COM_OK; +} + +PUBLIC int com_qtell(int p, param_list param) +{ + 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; +/* FILE *fp; */ + + if (!in_list(p, L_TD, parray[p].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) { +/* + fp = fopen("/tmp/fics-log", "a"); + fprintf(fp, "PLAYER \"%s\" - MESSAGE \"%s\"\n", param[0].val.word, param[1].val.string); + fclose(fp); +*/ + 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", (parray[p1].highlight && parray[p1].bell) ? buffer4 : + (parray[p1].highlight && !parray[p1].bell) ? buffer3 : + (!parray[p1].highlight && parray[p1].bell) ? buffer2 : + buffer1); + pprintf(p, "*qtell %s 0*\n", 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 < p_num ; p1++) { + if ((p1 == p) || (player_censored(p1, p)) || (parray[p1].status != PLAYER_PROMPT)) + continue; + if (in_list(p1,L_CHANNEL,tmp)) + pprintf_prompt(p1, "\n%s\n", (parray[p1].highlight && parray[p1].bell) ? buffer4 : + (parray[p1].highlight && !parray[p1].bell) ? buffer3 : + (!parray[p1].highlight && parray[p1].bell) ? buffer2 : + buffer1); + } + pprintf(p, "*qtell %d 0*\n", param[0].val.integer); + } + return COM_OK; +} + +PUBLIC 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 keep + hidden from view */ +} + +#if 0 + +void WhichList(int p, char *partial, char **Full) +{ + int i, gotit = -1; + int slen = strlen(partial); + static char *MyList[] = {"notify", "censor", "channel", ""}; + + for (i=0; MyList[i][0] != '\0'; i++) { + if (strncmp(partial, MyList[i], slen)) + continue; + if (gotit >= 0) { + pprintf(p, "Ambiguous list name.\n"); + *Full = NULL; + return; + } + gotit = i; + } + if (gotit >= 0) + *Full = MyList[gotit]; + else **Full = '\0'; + return; +} + +PUBLIC int com_plus(int p, param_list param) +{ + char *list; + int chan; + parameter *Param1 = ¶m[1]; + + WhichList (p, param[0].val.word, &list); + + if (list == NULL) return COM_OK; + + if (!strcmp(list, "notify")) + return notorcen (p, Param1, &parray[p].num_notify, MAX_NOTIFY, + parray[p].notifyList, "notify"); + if (!strcmp(list, "censor")) + return notorcen (p, Param1, &parray[p].num_censor, MAX_NOTIFY, + parray[p].censorList, "censor"); + if (!strcmp(list, "channel")) { + chan = atoi(param[1].val.word); + if (chan < 0) { + } + + switch (channel_add(chan, p)) { + case 0: pprintf(p, "Channel %d turned on.\n", chan); break; + case 1: pprintf(p, "Channel %d is already full.\n", chan); break; + case 2: pprintf(p, "You are already on channel %d.\n", chan); break; + case 3: pprintf(p, "Maximum number of channels exceeded.\n"); break; + } + return COM_OK; + } + return com_addlist(p, param); +} + +PUBLIC int com_minus(int p, param_list param) +{ + char *list; + int chan; + parameter *Param1 = ¶m[1]; + + WhichList (p, param[0].val.word, &list); + + if (list == NULL) return COM_OK; + + if (!strcmp(list, "notify")) + return unnotorcen (p, Param1, &parray[p].num_notify, MAX_NOTIFY, + parray[p].notifyList, "notify"); + if (!strcmp(list, "censor")) + return unnotorcen (p, Param1, &parray[p].num_censor, MAX_CENSOR, + parray[p].censorList, "censor"); + if (!strcmp(list, "channel")) { + chan = atoi(param[1].val.word); + if (on_channel(chan, p)) + channel_remove(chan, p); + else + pprintf(p, "You are not on channel %d", chan); + return COM_OK; + } + return com_sublist(p, param); +} +#endif diff --git a/FICS/talkproc.h b/FICS/talkproc.h new file mode 100644 index 0000000..c2c9ee8 --- /dev/null +++ b/FICS/talkproc.h @@ -0,0 +1,56 @@ +/* talkproc.h + * + */ + +/* + 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 + (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. +*/ + +/* Revision history: + name yy/mm/dd Change + hersco and Marsalis 95/07/24 Created +*/ + +#ifndef _TALKPROC_H +#define _TALKPROC_H + +#define MAX_CHANNELS 256 + +extern int quota_time; + +extern int com_xtell(); +extern int com_shout(); +extern int com_cshout(); +/* extern int com_query(); */ +extern int com_it(); +extern int com_tell(); +extern int com_ptell(); +extern int com_say(); +extern int com_whisper(); +extern int com_kibitz(); +extern int com_censor(); +extern int com_uncensor(); +extern int com_notify(); +extern int com_unnotify(); +extern int com_channel(); +extern int com_inchannel(); +extern int com_sendmessage(); +extern int com_messages(); +extern int com_clearmessages(); +extern int com_mailmess(); +extern int com_znotify(); +extern int com_qtell(); +extern int on_channel(int, int); + +#endif /* _TALKPROC_H */ diff --git a/FICS/utils.c b/FICS/utils.c new file mode 100644 index 0000000..3cf08c0 --- /dev/null +++ b/FICS/utils.c @@ -0,0 +1,1049 @@ +/* utils.c + * + */ + +/* + 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 + (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. +*/ + +/* Revision history: + name email yy/mm/dd Change + Richard Nash 93/10/22 Created +*/ + +#include "stdinclude.h" + +#include "common.h" +#include "utils.h" +#include "playerdb.h" +#include "network.h" +#include "rmalloc.h" +#include "config.h" +#if defined(SYSTEM_SUN4) +/* #include */ +#endif + +/* +#include +#include +#include +#include +*/ + +#if defined(SGI) +#else +int gettimeofday(struct timeval * tp, struct timezone * tzp); +#endif + +PUBLIC int count_lines(FILE *fp) +{ + int c, nl = 0; + + while ((c = fgetc(fp)) != EOF) + if (c == '\n') + ++nl; + + return nl; +} + +PUBLIC int iswhitespace(int c) +{ + if ((c < ' ') || (c == '\b') || (c == '\n') || + (c == '\t') || (c == ' ')) { /* white */ + return 1; + } else { + return 0; + } +} + +PUBLIC char *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; +} + +PUBLIC char *eatword(char *str) +{ + while (*str && !iswhitespace(*str)) + str++; + return str; +} + +PUBLIC char *eatwhite(char *str) +{ + while (*str && iswhitespace(*str)) + str++; + return str; +} + +PUBLIC char *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); +} + +PUBLIC char *nextword(char *str) +{ + return eatwhite(eatword(str)); +} + +/* check_the_email_address function: */ +/* +PUBLIC int check_emailaddr(char *email) +{ + int qbuflen; + char qabuf[5120]; + + if ((email = strchr(email, '@')) == NULL) + return 2; + email++; + + res_init(); + _res.options = (RES_INIT | RES_RECURSE); + if ((qbuflen = res_mkquery(QUERY, email, C_IN, T_ANY, NULL, 0, NULL, qabuf, sizeof(qabuf))) == -1) + return 1; + + if (res_send(qabuf, qbuflen, qabuf, sizeof(qabuf)) == -1) + return 1; + + return (_getshort(qabuf + 6) ? 0 : 2); +} +*/ + +PUBLIC int mail_string_to_address(char *addr, char *subj, char *str) +{ + char com[1000]; + FILE *fp; + +#ifdef SENDMAILPROG + sprintf(com, "%s\n", SENDMAILPROG); +#else + sprintf(com, "%s -s \"%s\" %s", MAILPROGRAM, subj, addr); +#endif + fp = popen(com, "w"); + if (!fp) + return -1; +#ifdef SENDMAILPROG + fprintf(fp, "To: %s\nSubject: %s\n%s", addr, subj, str); +#else + fprintf(fp, "%s", str); +#endif + pclose(fp); + return 0; +} + +PUBLIC int mail_string_to_user(int p, char *subj, char *str) +{ + + if (parray[p].emailAddress && + parray[p].emailAddress[0] && + safestring(parray[p].emailAddress)) { + return mail_string_to_address(parray[p].emailAddress, subj, str); + } else { + return -1; + } +} + +PUBLIC int mail_file_to_address(char *addr, char *subj, char *fname) +{ + char com[1000]; + char tmp[MAX_LINE_SIZE]; + FILE *fp; + FILE *file_fp; + +#ifdef SENDMAILPROG + sprintf(com, "%s\n", SENDMAILPROG); +#else + sprintf(com, "%s -s \"%s\" %s < %s&", MAILPROGRAM, subj, addr, fname); +#endif + fp = popen(com, "w"); + if (!fp) + return -1; +#ifdef SENDMAILPROG + fprintf(fp, "To: %s\nSubject: %s\n", addr, subj); + file_fp = fopen(fname, "r"); + if (!file_fp) + return -1; + while (!feof(file_fp)) { + fgets(tmp, MAX_LINE_SIZE - 1, file_fp); + if (!feof(file_fp)) { + fputs(tmp, fp); + } + } + fclose(file_fp); + +#endif + pclose(fp); + return 0; +} + +PUBLIC int mail_file_to_user(int p, char *subj, char *fname) +{ + + if (parray[p].emailAddress && + parray[p].emailAddress[0] && + safestring(parray[p].emailAddress)) { + return mail_file_to_address(parray[p].emailAddress, subj, fname); + } else { + return -1; + } +} + + +/* Process a command for a user */ +PUBLIC int pcommand(int p, char *comstr,...) +{ + char tmp[MAX_LINE_SIZE]; + int retval; + int current_socket = parray[p].socket; + va_list ap; + va_start(ap, comstr); + + vsprintf(tmp, comstr, ap); + retval = process_input(current_socket, tmp); + if (retval == COM_LOGOUT) { + process_disconnection(current_socket); + net_close_connection(current_socket); + } + va_end(ap); + return retval; +} + +PUBLIC int pprintf(int p, char *format,...) +{ + char tmp[10 * MAX_LINE_SIZE]; /* Make sure you can handle 10 lines worth of + stuff */ + int retval; + va_list ap; + va_start(ap, format); + + retval = vsprintf(tmp, format, ap); + if (strlen(tmp) > 10 * MAX_LINE_SIZE) { + fprintf(stderr, "FICS: pprintf buffer overflow\n"); + } + net_send_string(parray[p].socket, tmp, 1); + va_end(ap); + return retval; +} + +PUBLIC void pprintf_dohightlight(int p) +{ + if (parray[p].highlight & 0x01) + pprintf(p, "\033[7m"); + if (parray[p].highlight & 0x02) + pprintf(p, "\033[1m"); + if (parray[p].highlight & 0x04) + pprintf(p, "\033[4m"); + if (parray[p].highlight & 0x08) + pprintf(p, "\033[2m"); +} + +PUBLIC int pprintf_highlight(int p, char *format,...) +{ + char tmp[10 * MAX_LINE_SIZE]; + int retval; + va_list ap; + + va_start(ap, format); + pprintf_dohightlight(p); + retval = vsprintf(tmp, format, ap); + if (strlen(tmp) > 10 * MAX_LINE_SIZE) { + fprintf(stderr, "FICS: pprintf buffer overflow\n"); + } + net_send_string(parray[p].socket, tmp, 1); + va_end(ap); + if (parray[p].highlight) + pprintf(p, "\033[0m"); + return retval; +} + +PUBLIC void sprintf_dohightlight(int p, char *s) +{ + + if (parray[p].highlight & 0x01) + strcat(s, "\033[7m"); + if (parray[p].highlight & 0x02) + strcat(s, "\033[1m"); + if (parray[p].highlight & 0x04) + strcat(s, "\033[4m"); + if (parray[p].highlight & 0x08) + strcat(s, "\033[2m"); +} + +PUBLIC int psprintf_highlight(int p, char *s, char *format,...) +{ + int retval; + va_list ap; + + va_start(ap, format); + if (parray[p].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; +} + +PUBLIC int pprintf_prompt(int p, char *format,...) +{ + char tmp[10 * MAX_LINE_SIZE]; /* Make sure you can handle 10 lines worth of + stuff */ + int retval; + va_list ap; + + va_start(ap, format); + + retval = vsprintf(tmp, format, ap); + if (strlen(tmp) > 10 * MAX_LINE_SIZE) { + fprintf(stderr, "FICS: pprintf_prompt buffer overflow\n"); + } + net_send_string(parray[p].socket, tmp, 1); + net_send_string(parray[p].socket, parray[p].prompt, 1); + va_end(ap); + return retval; +} + +PUBLIC int pprintf_noformat(int p, char *format,...) +{ + char tmp[10 * MAX_LINE_SIZE]; /* Make sure you can handle 10 lines worth of + stuff */ + int retval; + va_list ap; + + va_start(ap, format); + + retval = vsprintf(tmp, format, ap); + if (strlen(tmp) > 10 * MAX_LINE_SIZE) { + fprintf(stderr, "FICS: pprintf_noformat buffer overflow\n"); + } + net_send_string(parray[p].socket, tmp, 0); + va_end(ap); + return retval; +} + + +/******************* grimm *************/ +/******************* added below *************/ +PUBLIC int psend_raw_file(int p, char *dir, char *file) +{ + FILE *fp; + char tmp[MAX_LINE_SIZE]; + char fname[MAX_FILENAME_SIZE]; + int num; + + if (dir) + sprintf(fname, "%s/%s", dir, file); + else + strcpy(fname, file); + fp = fopen(fname, "r"); + if (!fp) + return -1; + while ((num = fread(tmp, sizeof(char), MAX_LINE_SIZE - 1, fp)) > 0) { + tmp[num] = '\0'; + net_send_string(parray[p].socket, tmp, 1); + } + fclose(fp); + return 0; +} + +PUBLIC int psend_file(int p, char *dir, char *file) +{ + FILE *fp; + char tmp[MAX_LINE_SIZE]; + char fname[MAX_FILENAME_SIZE]; + int lcount = parray[p].d_height - 1; + + if (parray[p].last_file) + rfree(parray[p].last_file); + parray[p].last_file = NULL; + parray[p].last_file_byte = 0L; + + if (dir) + sprintf(fname, "%s/%s", dir, file); + else + strcpy(fname, file); + fp = fopen(fname, "r"); + if (!fp) + return -1; + while (!feof(fp) && (--lcount > 0)) { + fgets(tmp, MAX_LINE_SIZE - 1, fp); + if (!feof(fp)) { + net_send_string(parray[p].socket, tmp, 1); + } + } + if (!feof(fp)) { + parray[p].last_file = strdup(fname); + parray[p].last_file_byte = ftell(fp); + pprintf(p, "Type [next] to see next page.\n"); + } + fclose(fp); + return 0; +} + +/* + * 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). + */ +PUBLIC int psend_logoutfile(int p, char *dir, char *file) +{ + FILE *fp; + char tmp[MAX_LINE_SIZE]; + char fname[MAX_FILENAME_SIZE]; + + if (parray[p].last_file) + rfree(parray[p].last_file); + parray[p].last_file = NULL; + parray[p].last_file_byte = 0L; + + if (dir) + sprintf(fname, "%s/%s", dir, file); + else + strcpy(fname, file); + fp = fopen(fname, "r"); + if (!fp) + return -1; + while (!feof(fp)) { + fgets(tmp, MAX_LINE_SIZE - 1, fp); + if (!feof(fp)) { + net_send_string(parray[p].socket, tmp, 1); + } + } + + fclose(fp); + return 0; +} + +PUBLIC int pmore_file(int p) +{ + FILE *fp; + char tmp[MAX_LINE_SIZE]; + int lcount = parray[p].d_height - 1; + + if (!parray[p].last_file) { + pprintf(p, "There is no more.\n"); + return -1; + } + fp = fopen(parray[p].last_file, "r"); + if (!fp) { + pprintf(p, "File not found!\n"); + return -1; + } + fseek(fp, parray[p].last_file_byte, SEEK_SET); + + while (!feof(fp) && (--lcount > 0)) { + fgets(tmp, MAX_LINE_SIZE, fp); + if (!feof(fp)) { + net_send_string(parray[p].socket, tmp, 1); + } + } + if (!feof(fp)) { + parray[p].last_file_byte = ftell(fp); + pprintf(p, "Type [next] to see next page.\n"); + } else { + rfree(parray[p].last_file); + parray[p].last_file = NULL; + parray[p].last_file_byte = 0L; + } + fclose(fp); + return 0; +} + +PUBLIC int psend_command(int p, char *command, char *input) +{ + FILE *fp; + char tmp[MAX_LINE_SIZE]; + int num; + + if (input) + fp = popen(command, "w"); + else + fp = popen(command, "r"); + if (!fp) + return -1; + if (input) { + fwrite(input, sizeof(char), strlen(input), fp); + } else { + while (!feof(fp)) { + num = fread(tmp, sizeof(char), MAX_LINE_SIZE - 1, fp); + tmp[num] = '\0'; + net_send_string(parray[p].socket, tmp, 1); + } + } + pclose(fp); + return 0; +} + +PUBLIC 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; +} + +PUBLIC int safechar(int c) +{ + if ((c == '>') || (c == '!') || (c == '&') || (c == '*') || (c == '?') || + (c == '/') || (c == '<') || (c == '|') || (c == '`') || (c == '$')) + return 0; + return 1; +} + +PUBLIC int safestring(char *str) +{ + int i; + + if (!str) + return 1; + for (i = 0; str[i]; i++) { + if (!safechar(str[i])) + return 0; + } + return 1; +} + +PUBLIC int alphastring(char *str) +{ + int i; + + if (!str) + return 1; + for (i = 0; str[i]; i++) { + if (!isalpha(str[i])) { + return 0; + } + } + return 1; +} + +PUBLIC int printablestring(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; +} + + +/*#if defined(SGI) +#else*/ +/* This version of strdup must be used, or the count of allocs + in "uptime" will omit them. Maybe we change the name to + rstrdup and replace all calls, if the name is causing a conflict + with anyone's libraries. --mann +*/ +PUBLIC char *strdup(const char *str) +{ + char *tmp; + + if (!str) + return NULL; + tmp = rmalloc(strlen(str) + 1); + strcpy(tmp, str); + return tmp; +} +/*#endif*/ + +PUBLIC 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; +} + +PUBLIC 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; +} + +PRIVATE char *strtime(struct tm * stm) +{ + static char tstr[100]; + +#if defined (SGI) + strftime(tstr, sizeof(tstr), "%a %b %e, %H:%M %Z", stm); +#else + strftime(tstr, sizeof(tstr), "%a %b %e, %k:%M %Z", stm); +#endif + return (tstr); +} + +PUBLIC char *fix_time(char *old_time) { + + char day[5]; + char month[5]; + char date[5]; + char new_time[20]; + char i; + + sscanf(old_time, "%s %s %s", day, month, date); + + if (date[2] != ',') { + i = date[0]; + date[0] = '0'; + date[1] = i; + } + date[2] = '\0'; + + sprintf (new_time, "%s, %s %s", day, month, date); + + return new_time; +} + +PUBLIC char *strltime(time_t *clock) +{ + struct tm *stm = localtime(clock); + return strtime(stm); +} + +PUBLIC char *strgtime(time_t *clock) +{ + struct tm *stm = gmtime(clock); + return strtime(stm); +} + +/* This is used only for relative timeing since it reports seconds since + * about 5:00pm on Feb 16, 1994 + */ +PUBLIC 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. +*/ +PUBLIC int untenths(unsigned tenths) +{ + return (tenths / 10 + 331939277 + 0xffffffff / 10 + 1); +} + +PUBLIC 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 */ +PUBLIC 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(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(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! */ +PUBLIC int lines_file(char *file) +{ + FILE *fp; + int lcount = 0; + char tmp[MAX_LINE_SIZE]; + + fp = fopen(file, "r"); + if (!fp) + return 0; + while (!feof(fp)) { + if (fgets(tmp, MAX_LINE_SIZE, fp)) + lcount++; + } + fclose(fp); + return lcount; +} + +PUBLIC 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; +} + +PUBLIC 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; +} + +PUBLIC char *file_bplayer(char *fname) +{ + char *ptr; + + ptr = rindex(fname, '-'); + if (!ptr) + return ""; + return ptr + 1; +} + + +/* Hey, leave this code alone. "a" is always in network byte order, + which is big-endian, even on a little-endian machine. I fixed this + code to handle that correctly a while ago, and someone + gratuitiously changed it so that it would work correctly only on a + big-endian machine (like a Sun). I have now changed it back. --mann +*/ +PUBLIC char *dotQuad(unsigned int a) +{ + static char tmp[20]; + unsigned char *aa = (unsigned char *) &a; + + sprintf(tmp, "%d.%d.%d.%d", aa[0], aa[1], aa[2], aa[3]); + return tmp; +} + +PUBLIC int available_space(void) +{ +#if defined(SYSTEM_NEXT) + struct statfs buf; + + statfs(player_dir, &buf); + return ((buf.f_bsize * buf.f_bavail)); +#elif defined(SYSTEM_ULTRIX) + struct fs_data buf; + + statfs(player_dir, &buf); + return ((1024 * buf.bfreen)); +#elif defined(SYSTEM_SUN4) +/* + struct statfs buf; + + statfs(player_dir, buf); + return (1024 * buf.f_bfree); */ + return 100000000; /* Infinite space */ +#else + return 100000000; /* Infinite space */ +#endif +} + +PUBLIC int file_exists(char *fname) +{ + FILE *fp; + + fp = fopen(fname, "r"); + if (!fp) + return 0; + fclose(fp); + return 1; +} + +PUBLIC 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]; +} + +PUBLIC char *ratstrii(int rat, int reg) +{ + static int on = 0; + static char tmp[20][10]; + + if (on == 20) + on = 0; + if (rat) { + sprintf(tmp[on], "%4d", rat); + } else { + if (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 */ +}; + +PRIVATE char **t_buffer = NULL; /* pointer to next space in return buffer */ +PRIVATE int t_buffersize = 0; /* size of return buffer */ + +/* fill t_buffer with anything matching "want*" in file tree t_tree */ +PRIVATE void t_sft(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 */ +PRIVATE void t_cft(struct t_tree **t) +{ + if (*t) { + t_cft(&(*t)->left); + t_cft(&(*t)->right); + rfree(*t); + *t = NULL; + } +} + +/* make file tree for dir d */ +PRIVATE void t_mft(struct t_dirs *d) +{ + DIR *dirp; +#ifdef USE_DIRENT + struct dirent *dp; +#else + struct direct *dp; +#endif + struct t_tree **t; + + if ((dirp = opendir(&(d->name))) == NULL) { + fprintf(stderr, "FICS: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 = rmalloc(sizeof(struct t_tree) + strlen(dp->d_name)); + (*t)->right = (*t)->left = NULL; + strcpy(&(*t)->name, dp->d_name); + } + } + closedir(dirp); + } +} + +PUBLIC int search_directory(char *dir, 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 = rmalloc(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); +} + +PUBLIC int display_directory(int p, char **buffer, int count) +/* buffer contains 'count' string pointers */ +{ + int i; + multicol *m = multicol_start(count); + + for (i = 0; (i < count); i++) + multicol_store(m, *buffer++); + multicol_pprint(m, p, 78, 1); + multicol_end(m); + return (i); +} diff --git a/FICS/utils.c.orig b/FICS/utils.c.orig new file mode 100644 index 0000000..1d4fdaa --- /dev/null +++ b/FICS/utils.c.orig @@ -0,0 +1,991 @@ +/* utils.c + * + */ + +/* + 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 + (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. +*/ + +/* Revision history: + name email yy/mm/dd Change + Richard Nash 93/10/22 Created +*/ + +#include "stdinclude.h" + +#include "common.h" +#include "utils.h" +#include "playerdb.h" +#include "network.h" +#include "rmalloc.h" +#include "config.h" +#if defined(SYSTEM_SUN4) +/* #include */ +#endif + +/* +#include +#include +#include +#include +*/ + +/* grimm */ +#if defined(SGI) +#else +/* char vsprintf(char *tmp, va_list format, va_list ap); */ +int gettimeofday(struct timeval * tp, struct timezone * tzp); +#endif +/* added for warnings */ + +PUBLIC int count_lines(FILE *fp) +{ + int c, nl = 0; + + while ((c = fgetc(fp)) != EOF) + if (c == '\n') + ++nl; + + return nl; +} + +PUBLIC int iswhitespace(int c) +{ + if ((c < ' ') || (c == '\b') || (c == '\n') || + (c == '\t') || (c == ' ')) { /* white */ + return 1; + } else { + return 0; + } +} + +PUBLIC char *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; +} + +PUBLIC char *eatword(char *str) +{ + while (*str && !iswhitespace(*str)) + str++; + return str; +} + +PUBLIC char *eatwhite(char *str) +{ + while (*str && iswhitespace(*str)) + str++; + return str; +} + +PUBLIC char *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); +} + +PUBLIC char *nextword(char *str) +{ + return eatwhite(eatword(str)); +} + +/* check_the_email_address function: */ +/* +PUBLIC int check_emailaddr(char *email) +{ + int qbuflen; + char qabuf[5120]; + + if ((email = strchr(email, '@')) == NULL) + return 2; + email++; + + res_init(); + _res.options = (RES_INIT | RES_RECURSE); + if ((qbuflen = res_mkquery(QUERY, email, C_IN, T_ANY, NULL, 0, NULL, qabuf, sizeof(qabuf))) == -1) + return 1; + + if (res_send(qabuf, qbuflen, qabuf, sizeof(qabuf)) == -1) + return 1; + + return (_getshort(qabuf + 6) ? 0 : 2); +} +*/ + +PUBLIC int mail_string_to_address(char *addr, char *subj, char *str) +{ + char com[1000]; + FILE *fp; + +#ifdef SENDMAILPROG + sprintf(com, "%s\n", SENDMAILPROG); +#else + sprintf(com, "%s -s \"%s\" %s", MAILPROGRAM, subj, addr); +#endif + fp = popen(com, "w"); + if (!fp) + return -1; +#ifdef SENDMAILPROG + fprintf(fp, "To: %s\nSubject: %s\n%s", addr, subj, str); +#else + fprintf(fp, "%s", str); +#endif + pclose(fp); + return 0; +} + +PUBLIC int mail_string_to_user(int p, char *subj, char *str) +{ + + if (parray[p].emailAddress && + parray[p].emailAddress[0] && + safestring(parray[p].emailAddress)) { + return mail_string_to_address(parray[p].emailAddress, subj, str); + } else { + return -1; + } +} + +PUBLIC int mail_file_to_address(char *addr, char *subj, char *fname) +{ + char com[1000]; + char tmp[MAX_LINE_SIZE]; + FILE *fp; + FILE *file_fp; + +#ifdef SENDMAILPROG + sprintf(com, "%s\n", SENDMAILPROG); +#else + sprintf(com, "%s -s \"%s\" %s < %s&", MAILPROGRAM, subj, addr, fname); +#endif + fp = popen(com, "w"); + if (!fp) + return -1; +#ifdef SENDMAILPROG + fprintf(fp, "To: %s\nSubject: %s\n", addr, subj); + file_fp = fopen(fname, "r"); + if (!file_fp) + return -1; + while (!feof(file_fp)) { + fgets(tmp, MAX_LINE_SIZE - 1, file_fp); + if (!feof(file_fp)) { + fputs(tmp, fp); + } + } + fclose(file_fp); + +#endif + pclose(fp); + return 0; +} + +PUBLIC int mail_file_to_user(int p, char *subj, char *fname) +{ + + if (parray[p].emailAddress && + parray[p].emailAddress[0] && + safestring(parray[p].emailAddress)) { + return mail_file_to_address(parray[p].emailAddress, subj, fname); + } else { + return -1; + } +} + + +/* Process a command for a user */ +PUBLIC int pcommand(int p, char *comstr,...) +{ + char tmp[MAX_LINE_SIZE]; + int retval; + int current_socket = parray[p].socket; + va_list ap; + va_start(ap, comstr); + + vsprintf(tmp, comstr, ap); + retval = process_input(current_socket, tmp); + if (retval == COM_LOGOUT) { + process_disconnection(current_socket); + net_close_connection(current_socket); + } + va_end(ap); + return retval; +} + +PUBLIC int pprintf(int p, char *format,...) +{ + char tmp[10 * MAX_LINE_SIZE]; /* Make sure you can handle 10 lines worth of + stuff */ + int retval; + va_list ap; + va_start(ap, format); + + retval = vsprintf(tmp, format, ap); + if (strlen(tmp) > 10 * MAX_LINE_SIZE) { + fprintf(stderr, "FICS: pprintf buffer overflow\n"); + } + net_send_string(parray[p].socket, tmp, 1); + va_end(ap); + return retval; +} + +PUBLIC void pprintf_dohightlight(int p) +{ + if (parray[p].highlight & 0x01) + pprintf(p, "\033[7m"); + if (parray[p].highlight & 0x02) + pprintf(p, "\033[1m"); + if (parray[p].highlight & 0x04) + pprintf(p, "\033[4m"); + if (parray[p].highlight & 0x08) + pprintf(p, "\033[2m"); +} + +PUBLIC int pprintf_highlight(int p, char *format,...) +{ + char tmp[10 * MAX_LINE_SIZE]; + int retval; + va_list ap; + + va_start(ap, format); + pprintf_dohightlight(p); + retval = vsprintf(tmp, format, ap); + if (strlen(tmp) > 10 * MAX_LINE_SIZE) { + fprintf(stderr, "FICS: pprintf buffer overflow\n"); + } + net_send_string(parray[p].socket, tmp, 1); + va_end(ap); + if (parray[p].highlight) + pprintf(p, "\033[0m"); + return retval; +} + +PUBLIC void sprintf_dohightlight(int p, char *s) +{ + + if (parray[p].highlight & 0x01) + strcat(s, "\033[7m"); + if (parray[p].highlight & 0x02) + strcat(s, "\033[1m"); + if (parray[p].highlight & 0x04) + strcat(s, "\033[4m"); + if (parray[p].highlight & 0x08) + strcat(s, "\033[2m"); +} + +PUBLIC int psprintf_highlight(int p, char *s, char *format,...) +{ + int retval; + va_list ap; + + va_start(ap, format); + if (parray[p].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; +} + +PUBLIC int pprintf_prompt(int p, char *format,...) +{ + char tmp[10 * MAX_LINE_SIZE]; /* Make sure you can handle 10 lines worth of + stuff */ + int retval; + va_list ap; + + va_start(ap, format); + + retval = vsprintf(tmp, format, ap); + if (strlen(tmp) > 10 * MAX_LINE_SIZE) { + fprintf(stderr, "FICS: pprintf_prompt buffer overflow\n"); + } + net_send_string(parray[p].socket, tmp, 1); + net_send_string(parray[p].socket, parray[p].prompt, 1); + va_end(ap); + return retval; +} + +PUBLIC int pprintf_noformat(int p, char *format,...) +{ + char tmp[10 * MAX_LINE_SIZE]; /* Make sure you can handle 10 lines worth of + stuff */ + int retval; + va_list ap; + + va_start(ap, format); + + retval = vsprintf(tmp, format, ap); + if (strlen(tmp) > 10 * MAX_LINE_SIZE) { + fprintf(stderr, "FICS: pprintf_noformat buffer overflow\n"); + } + net_send_string(parray[p].socket, tmp, 0); + va_end(ap); + return retval; +} + + +/******************* grimm *************/ +/******************* added below *************/ +PUBLIC int psend_raw_file(int p, char *dir, char *file) +{ + FILE *fp; + char tmp[MAX_LINE_SIZE]; + char fname[MAX_FILENAME_SIZE]; + int num; + + if (dir) + sprintf(fname, "%s/%s", dir, file); + else + strcpy(fname, file); + fp = fopen(fname, "r"); + if (!fp) + return -1; + while ((num = fread(tmp, sizeof(char), MAX_LINE_SIZE - 1, fp)) > 0) { + tmp[num] = '\0'; + net_send_string(parray[p].socket, tmp, 1); + } + fclose(fp); + return 0; +} + +PUBLIC int psend_file(int p, char *dir, char *file) +{ + FILE *fp; + char tmp[MAX_LINE_SIZE]; + char fname[MAX_FILENAME_SIZE]; + int lcount = parray[p].d_height - 1; + + if (parray[p].last_file) + rfree(parray[p].last_file); + parray[p].last_file = NULL; + parray[p].last_file_byte = 0L; + + if (dir) + sprintf(fname, "%s/%s", dir, file); + else + strcpy(fname, file); + fp = fopen(fname, "r"); + if (!fp) + return -1; + while (!feof(fp) && (--lcount > 0)) { + fgets(tmp, MAX_LINE_SIZE - 1, fp); + if (!feof(fp)) { + net_send_string(parray[p].socket, tmp, 1); + } + } + if (!feof(fp)) { + parray[p].last_file = strdup(fname); + parray[p].last_file_byte = ftell(fp); + pprintf(p, "Type [next] to see next page.\n"); + } + fclose(fp); + return 0; +} + +/* + * 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). + */ +PUBLIC int psend_logoutfile(int p, char *dir, char *file) +{ + FILE *fp; + char tmp[MAX_LINE_SIZE]; + char fname[MAX_FILENAME_SIZE]; + + if (parray[p].last_file) + rfree(parray[p].last_file); + parray[p].last_file = NULL; + parray[p].last_file_byte = 0L; + + if (dir) + sprintf(fname, "%s/%s", dir, file); + else + strcpy(fname, file); + fp = fopen(fname, "r"); + if (!fp) + return -1; + while (!feof(fp)) { + fgets(tmp, MAX_LINE_SIZE - 1, fp); + if (!feof(fp)) { + net_send_string(parray[p].socket, tmp, 1); + } + } + + fclose(fp); + return 0; +} + +PUBLIC int pmore_file(int p) +{ + FILE *fp; + char tmp[MAX_LINE_SIZE]; + int lcount = parray[p].d_height - 1; + + if (!parray[p].last_file) { + pprintf(p, "There is no more.\n"); + return -1; + } + fp = fopen(parray[p].last_file, "r"); + if (!fp) { + pprintf(p, "File not found!\n"); + return -1; + } + fseek(fp, parray[p].last_file_byte, SEEK_SET); + + while (!feof(fp) && (--lcount > 0)) { + fgets(tmp, MAX_LINE_SIZE - 1, fp); + if (!feof(fp)) { + net_send_string(parray[p].socket, tmp, 1); + } + } + if (!feof(fp)) { + parray[p].last_file_byte = ftell(fp); + pprintf(p, "Type [next] to see next page.\n"); + } else { + rfree(parray[p].last_file); + parray[p].last_file = NULL; + parray[p].last_file_byte = 0L; + } + fclose(fp); + return 0; +} + +PUBLIC int psend_command(int p, char *command, char *input) +{ + FILE *fp; + char tmp[MAX_LINE_SIZE]; + int num; + + if (input) + fp = popen(command, "w"); + else + fp = popen(command, "r"); + if (!fp) + return -1; + if (input) { + fwrite(input, sizeof(char), strlen(input), fp); + } else { + while (!feof(fp)) { + num = fread(tmp, sizeof(char), MAX_LINE_SIZE - 1, fp); + tmp[num] = '\0'; + net_send_string(parray[p].socket, tmp, 1); + } + } + pclose(fp); + return 0; +} + +PUBLIC 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; +} + +PUBLIC int safechar(int c) +{ + if ((c == '>') || (c == '!') || (c == '&') || (c == '*') || (c == '?') || + (c == '/') || (c == '<') || (c == '|') || (c == '`') || (c == '$')) + return 0; + return 1; +} + +PUBLIC int safestring(char *str) +{ + int i; + + if (!str) + return 1; + for (i = 0; str[i]; i++) { + if (!safechar(str[i])) + return 0; + } + return 1; +} + +PUBLIC int alphastring(char *str) +{ + int i; + + if (!str) + return 1; + for (i = 0; str[i]; i++) { + if (!isalpha(str[i])) { + return 0; + } + } + return 1; +} + +PUBLIC int printablestring(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; +} + + +/*#if defined(SGI) +#else*/ +/* This version of strdup must be used, or the count of allocs + in "uptime" will omit them. Maybe we change the name to + rstrdup and replace all calls, if the name is causing a conflict + with anyone's libraries. --mann +*/ +PUBLIC char *strdup(const char *str) +{ + char *tmp; + + if (!str) + return NULL; + tmp = rmalloc(strlen(str) + 1); + strcpy(tmp, str); + return tmp; +} +/*#endif*/ + +PUBLIC 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; +} + +PRIVATE char *strtime(struct tm * stm) +{ + static char tstr[100]; + +#if defined (SGI) + strftime(tstr, sizeof(tstr), "%a %b %e, %H:%M %Z", stm); +#else + strftime(tstr, sizeof(tstr), "%a %b %e, %k:%M %Z", stm); +#endif + return (tstr); +} + +PUBLIC char *strltime(time_t *clock) +{ + struct tm *stm = localtime(clock); + return strtime(stm); +} + +PUBLIC char *strgtime(time_t *clock) +{ + struct tm *stm = gmtime(clock); + return strtime(stm); +} + +/* This is used only for relative timeing since it reports seconds since + * about 5:00pm on Feb 16, 1994 + */ +PUBLIC 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. +*/ +PUBLIC int untenths(unsigned tenths) +{ + return (tenths / 10 + 331939277 + 0xffffffff / 10 + 1); +} + +PUBLIC 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 */ +PUBLIC 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(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(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! */ +PUBLIC int lines_file(char *file) +{ + FILE *fp; + int lcount = 0; + char tmp[MAX_LINE_SIZE]; + + fp = fopen(file, "r"); + if (!fp) + return 0; + while (!feof(fp)) { + if (fgets(tmp, MAX_LINE_SIZE, fp)) + lcount++; + } + fclose(fp); + return lcount; +} + +PUBLIC 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; +} + +PUBLIC 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; +} + +PUBLIC char *file_bplayer(char *fname) +{ + char *ptr; + + ptr = rindex(fname, '-'); + if (!ptr) + return ""; + return ptr + 1; +} + + +/* Hey, leave this code alone. "a" is always in network byte order, + which is big-endian, even on a little-endian machine. I fixed this + code to handle that correctly a while ago, and someone + gratuitiously changed it so that it would work correctly only on a + big-endian machine (like a Sun). I have now changed it back. --mann +*/ +PUBLIC char *dotQuad(unsigned int a) +{ + static char tmp[20]; + unsigned char *aa = (unsigned char *) &a; + + sprintf(tmp, "%d.%d.%d.%d", aa[0], aa[1], aa[2], aa[3]); + return tmp; +} + +PUBLIC int available_space(void) +{ +#if defined(SYSTEM_NEXT) + struct statfs buf; + + statfs(player_dir, &buf); + return ((buf.f_bsize * buf.f_bavail)); +#elif defined(SYSTEM_ULTRIX) + struct fs_data buf; + + statfs(player_dir, &buf); + return ((1024 * buf.bfreen)); +#elif defined(SYSTEM_SUN4) +/* + struct statfs buf; + + statfs(player_dir, buf); + return (1024 * buf.f_bfree); */ + return 100000000; /* Infinite space */ +#else + return 100000000; /* Infinite space */ +#endif +} + +PUBLIC int file_exists(char *fname) +{ + FILE *fp; + + fp = fopen(fname, "r"); + if (!fp) + return 0; + fclose(fp); + return 1; +} + +PUBLIC 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]; +} + +PUBLIC char *ratstrii(int rat, int reg) +{ + static int on = 0; + static char tmp[20][10]; + + if (on == 20) + on = 0; + if (rat) { + sprintf(tmp[on], "%4d", rat); + } else { + if (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 */ +}; + +PRIVATE char **t_buffer = NULL; /* pointer to next space in return buffer */ +PRIVATE int t_buffersize = 0; /* size of return buffer */ + +/* fill t_buffer with anything matching "want*" in file tree t_tree */ +PRIVATE void t_sft(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 */ +PRIVATE void t_cft(struct t_tree **t) +{ + if (*t) { + t_cft(&(*t)->left); + t_cft(&(*t)->right); + rfree(*t); + *t = NULL; + } +} + +/* make file tree for dir d */ +PRIVATE void t_mft(struct t_dirs *d) +{ + DIR *dirp; + struct dirent *dp; + struct t_tree **t; + + if ((dirp = opendir(&(d->name))) == NULL) { + fprintf(stderr, "FICS: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 = rmalloc(sizeof(struct t_tree) + strlen(dp->d_name)); + (*t)->right = (*t)->left = NULL; + strcpy(&(*t)->name, dp->d_name); + } + } + closedir(dirp); + } +} + +PUBLIC int search_directory(char *dir, 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 = rmalloc(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); +} + +PUBLIC int display_directory(int p, char **buffer, int count) +/* buffer contains 'count' string pointers */ +{ + int i; + multicol *m = multicol_start(count); + + for (i = 0; (i < count); i++) + multicol_store(m, *buffer++); + multicol_pprint(m, p, 78, 1); + multicol_end(m); + return (i); +} diff --git a/FICS/utils.h b/FICS/utils.h new file mode 100644 index 0000000..901da93 --- /dev/null +++ b/FICS/utils.h @@ -0,0 +1,116 @@ +/* utils.h + * + */ + +/* + 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 + (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. +*/ + +/* Revision history: + name email yy/mm/dd Change + Richard Nash 93/10/22 Created +*/ + +#ifndef _UTILS_H +#define _UTILS_H + +#include +#include "multicol.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 SetFlag(VAR, FLAG) (VAR |= (FLAG)) +#define ClearFlag(VAR, FLAG) (VAR &= ~(FLAG)) +#define CheckFlag(VAR, FLAG) (VAR & (FLAG)) + +extern int count_lines(FILE *); +extern int iswhitespace( ); +extern char *getword( ); +/* Returns a pointer to the first whitespace in the argument */ +extern char *eatword( ); +/* Returns a pointer to the first non-whitespace char in the argument */ +extern char *eatwhite( ); +/* Returns a pointer to the same string with trailing spaces removed */ +extern char *eattailwhite( ); +/* Returns the next word in a given string >eatwhite(eatword(foo))< */ +extern char *nextword( ); + +extern int check_emailaddr(char *); +extern int mail_string_to_address(); +extern int mail_string_to_user(); +extern int mail_file_to_address(); +extern int mail_file_to_user(); +extern int pcommand(int, char *, ...); +extern int pprintf(int, char *, ...); +extern void pprintf_dohightlight(int); +extern void sprintf_dohightlight(int,char *); +extern int pprintf_highlight(int, char *, ...); +extern int psprintf_highlight(int, char *, char *, ...); +extern int pprintf_prompt(int, char *, ...); +extern int pprintf_noformat(int, char *, ...); +extern int psend_raw_file( ); +extern int psend_file( ); +extern int psend_logoutfile( ); +extern int pmore_file( ); +extern int pmail_file( ); +extern int psend_command( ); +extern char *fix_time(char *); +extern char *stolower( ); + +extern int safechar( ); +extern int safestring( ); +extern int alphastring( ); +extern int printablestring( ); +#if defined(SGI) +#else +/* extern char *strdup( ); */ +#endif + +extern char *hms_desc(); +extern char *hms(); +extern char *strltime(); +extern char *strgtime(); +extern unsigned tenth_secs(); +extern char *tenth_str(); +extern int untenths(); + +extern int truncate_file(); +extern int lines_file(); + +extern int file_has_pname(); +extern char *file_wplayer(); +extern char *file_bplayer(); + +extern char *dotQuad(); + +extern int available_space(); +extern int file_exists(); +extern char *ratstr(); +extern char *ratstrii(); + +extern int search_directory(char *, char *, char **, int); +extern int display_directory(int, char **, int); + +#endif /* _UTILS_H */ + diff --git a/FICS/utils.h.orig b/FICS/utils.h.orig new file mode 100644 index 0000000..68f042f --- /dev/null +++ b/FICS/utils.h.orig @@ -0,0 +1,115 @@ +/* utils.h + * + */ + +/* + 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 + (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. +*/ + +/* Revision history: + name email yy/mm/dd Change + Richard Nash 93/10/22 Created +*/ + +#ifndef _UTILS_H +#define _UTILS_H + +#include +#include "multicol.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 SetFlag(VAR, FLAG) (VAR |= (FLAG)) +#define ClearFlag(VAR, FLAG) (VAR &= ~(FLAG)) +#define CheckFlag(VAR, FLAG) (VAR & (FLAG)) + +extern int count_lines(FILE *); +extern int iswhitespace( ); +extern char *getword( ); +/* Returns a pointer to the first whitespace in the argument */ +extern char *eatword( ); +/* Returns a pointer to the first non-whitespace char in the argument */ +extern char *eatwhite( ); +/* Returns a pointer to the same string with trailing spaces removed */ +extern char *eattailwhite( ); +/* Returns the next word in a given string >eatwhite(eatword(foo))< */ +extern char *nextword( ); + +extern int check_emailaddr(char *); +extern int mail_string_to_address(); +extern int mail_string_to_user(); +extern int mail_file_to_address(); +extern int mail_file_to_user(); +extern int pcommand(int, char *, ...); +extern int pprintf(int, char *, ...); +extern void pprintf_dohightlight(int); +extern void sprintf_dohightlight(int,char *); +extern int pprintf_highlight(int, char *, ...); +extern int psprintf_highlight(int, char *, char *, ...); +extern int pprintf_prompt(int, char *, ...); +extern int pprintf_noformat(int, char *, ...); +extern int psend_raw_file( ); +extern int psend_file( ); +extern int psend_logoutfile( ); +extern int pmore_file( ); +extern int pmail_file( ); +extern int psend_command( ); + +extern char *stolower( ); + +extern int safechar( ); +extern int safestring( ); +extern int alphastring( ); +extern int printablestring( ); +#if defined(SGI) +#else +/* extern char *strdup( ); */ +#endif + +extern char *hms(); +extern char *strltime(); +extern char *strgtime(); +extern unsigned tenth_secs(); +extern char *tenth_str(); +extern int untenths(); + +extern int truncate_file(); +extern int lines_file(); + +extern int file_has_pname(); +extern char *file_wplayer(); +extern char *file_bplayer(); + +extern char *dotQuad(); + +extern int available_space(); +extern int file_exists(); +extern char *ratstr(); +extern char *ratstrii(); + +extern int search_directory(char *, char *, char **, int); +extern int display_directory(int, char **, int); + +#endif /* _UTILS_H */ + diff --git a/FICS/variable.c b/FICS/variable.c new file mode 100644 index 0000000..b53664d --- /dev/null +++ b/FICS/variable.c @@ -0,0 +1,899 @@ +/* variable.c + * This is cludgy + */ + +/* + 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 + (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. +*/ + +/* Revision history: + name email yy/mm/dd Change + Richard Nash 93/10/22 Created + loon 95/03/17 added figure_boolean, use it :) + hersco 95/04/10 replaced figure_boolean with + set_boolean_var + DAV 95/19/11 moved variable command to here + added jprivate +*/ + +#include "stdinclude.h" + +#include "common.h" +#include "variable.h" +#include "playerdb.h" +#include "utils.h" +#include "ficsmain.h" +#include "config.h" +#include "rmalloc.h" +#include "board.h" +#include "command.h" +#include "talkproc.h" +#include "comproc.h" + +/* grimm */ +int SetValidFormula(int p, int which, char *val); +/* added for warning */ +PRIVATE int set_boolean_var(int *var, char *val) +{ + int v = -1; + + if (val == NULL) + return (*var = !*var); + + if (sscanf(val, "%d", &v) != 1) { + stolower(val); + if (!strcmp(val, "off")) + v = 0; + if (!strcmp(val, "false")) + v = 0; + if (!strcmp(val, "on")) + v = 1; + if (!strcmp(val, "true")) + v = 1; + } + if ((v == 0) || (v == 1)) + return (*var = v); + else + return (-1); +} + +PRIVATE int set_open(int p, char *var, char *val) +{ + int v = set_boolean_var(&parray[p].open, val); + + if (v < 0) + return VAR_BADVAL; + if (v > 0) + pprintf(p, "You are now open to receive match requests.\n"); + else { + player_decline_offers(p, -1, PEND_MATCH); + player_withdraw_offers(p, -1, PEND_MATCH); + pprintf(p, "You are no longer receiving match requests.\n"); + } + return VAR_OK; +} + +PRIVATE int set_sopen(int p, char *var, char *val) +{ + int v = set_boolean_var(&parray[p].sopen, val); + + if (v < 0) + return VAR_BADVAL; + pprintf(p, "sopen set to %d.\n", parray[p].sopen); + + 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"); + player_decline_offers(p, -1, PEND_SIMUL); + return VAR_OK; +} + +PRIVATE int set_ropen(int p, char *var, char *val) +{ + if (set_boolean_var(&parray[p].ropen, val) < 0) + return VAR_BADVAL; + pprintf(p, "ropen set to %d.\n", parray[p].ropen); + return VAR_OK; +} + +PRIVATE int set_rated(int p, char *var, char *val) +{ + if (!parray[p].registered) { + pprintf(p, "You cannot change your rated status.\n"); + return VAR_OK; + } + if (set_boolean_var(&parray[p].rated, val) < 0) + return VAR_BADVAL; + pprintf(p, "rated set to %d.\n", parray[p].rated); + return VAR_OK; +} + +PRIVATE int set_shout(int p, char *var, char *val) +{ + if (set_boolean_var(&parray[p].i_shout, val) < 0) + return VAR_BADVAL; + if (parray[p].i_shout) + pprintf(p, "You will now hear shouts.\n"); + else + pprintf(p, "You will not hear shouts.\n"); + return VAR_OK; +} + +PRIVATE int set_cshout(int p, char *var, char *val) +{ + if (set_boolean_var(&parray[p].i_cshout, val) < 0) + return VAR_BADVAL; + if (parray[p].i_cshout) + pprintf(p, "You will now hear cshouts.\n"); + else + pprintf(p, "You will not hear cshouts.\n"); + return VAR_OK; +} + +PRIVATE int set_kibitz(int p, char *var, char *val) +{ + if (set_boolean_var(&parray[p].i_kibitz, val) < 0) + return VAR_BADVAL; + if (parray[p].i_kibitz) + pprintf(p, "You will now hear kibitzes.\n"); + else + pprintf(p, "You will not hear kibitzes.\n"); + return VAR_OK; +} +PRIVATE int set_kiblevel(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 > 9999)) + return VAR_BADVAL; + parray[p].kiblevel = v; + pprintf(p, "Kibitz level now set to: %d.\n", v); + return VAR_OK; +} + +PRIVATE int set_tell(int p, char *var, char *val) +{ + if (set_boolean_var(&parray[p].i_tell, val) < 0) + return VAR_BADVAL; + if (parray[p].i_tell) + pprintf(p, "You will now hear tells.\n"); + else + pprintf(p, "You will not hear tells.\n"); + return VAR_OK; +} + +PRIVATE int set_notifiedby(int p, char *var, char *val) +{ + if (set_boolean_var(&parray[p].notifiedby, val) < 0) + return VAR_BADVAL; + if (parray[p].notifiedby) + 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; +} + +PRIVATE int set_pinform(int p, char *var, char *val) +{ + if (set_boolean_var(&parray[p].i_login, val) < 0) + return VAR_BADVAL; + if (parray[p].i_login) + pprintf(p, "You will now hear logins/logouts.\n"); + else + pprintf(p, "You will not hear logins/logouts.\n"); + return VAR_OK; +} + +PRIVATE int set_ginform(int p, char *var, char *val) +{ + if (set_boolean_var(&parray[p].i_game, val) < 0) + return VAR_BADVAL; + if (parray[p].i_game) + pprintf(p, "You will now hear game results.\n"); + else + pprintf(p, "You will not hear game results.\n"); + return VAR_OK; +} + +PRIVATE int set_private(int p, char *var, char *val) +{ + if (set_boolean_var(&parray[p].private, val) < 0) + return VAR_BADVAL; + if (parray[p].private) + pprintf(p, "Your games will be private.\n"); + else + pprintf(p, "Your games may not be private.\n"); + return VAR_OK; +} + +PRIVATE int set_jprivate(int p, char *var, char *val) +{ + if (!parray[p].registered) { + pprintf(p, "Unregistered players may not keep a journal.\n"); + return VAR_OK; + } + + if (set_boolean_var(&parray[p].jprivate, val) < 0) + return VAR_BADVAL; + if (parray[p].jprivate) + pprintf(p, "Your journal will be private.\n"); + else + pprintf(p, "Your journal will not be private.\n"); + return VAR_OK; +} + +PRIVATE int set_automail(int p, char *var, char *val) +{ + if (set_boolean_var(&parray[p].automail, val) < 0) + return VAR_BADVAL; + if (parray[p].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; +} + +PRIVATE int set_mailmess(int p, char *var, char *val) +{ + if (!parray[p].registered) { + pprintf(p, "Unregistered players may not receive messages.\n"); + return VAR_OK; + } + if (set_boolean_var(&parray[p].i_mailmess, val) < 0) + return VAR_BADVAL; + if (parray[p].i_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; +} + +PRIVATE int set_pgn(int p, char *var, char *val) +{ + if (set_boolean_var(&parray[p].pgn, val) < 0) + return VAR_BADVAL; + if (parray[p].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; +} + +PRIVATE int set_bell(int p, char *var, char *val) +{ + if (set_boolean_var(&parray[p].bell, val) < 0) + return VAR_BADVAL; + if (parray[p].bell) + pprintf(p, "Bell on.\n"); + else + pprintf(p, "Bell off.\n"); + return VAR_OK; +} + +PRIVATE int set_highlight(int p, char *var, char *val) +{ +/* if (set_boolean_var (&parray[p].highlight, val) < 0) return VAR_BADVAL; + */ + 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 ((parray[p].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; +} + +PRIVATE int set_style(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 < 1) || (v > MAX_STYLES)) + return VAR_BADVAL; + parray[p].style = v - 1; + pprintf(p, "Style %d set.\n", v); + return VAR_OK; +} + +PRIVATE int set_flip(int p, char *var, char *val) +{ + if (set_boolean_var(&parray[p].flip, val) < 0) + return VAR_BADVAL; + if (parray[p].flip) + pprintf(p, "Flip on.\n"); + else + pprintf(p, "Flip off.\n"); + return VAR_OK; +} +/* +PRIVATE 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; + parray[p].uscfRating = v; + pprintf(p, "USCF Rating set to %d.\n", v); + return VAR_OK; +} +*/ +PRIVATE int set_time(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 > 240)) + return VAR_BADVAL; + parray[p].d_time = v; + pprintf(p, "Default time set to %d.\n", v); + return VAR_OK; +} + +PRIVATE int set_inc(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 > 300)) + return VAR_BADVAL; + parray[p].d_inc = v; + pprintf(p, "Default increment set to %d.\n", v); + return VAR_OK; +} + +PRIVATE int set_height(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 < 5) || (v > 240)) + return VAR_BADVAL; + parray[p].d_height = v; + pprintf(p, "Height set to %d.\n", v); + return VAR_OK; +} + +PRIVATE int set_width(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 < 32) || (v > 240)) + return VAR_BADVAL; + parray[p].d_width = v; + pprintf(p, "Width set to %d.\n", v); + return VAR_OK; +} + +PUBLIC char *Language(int i) +{ + static char *Lang[NUM_LANGS] = {"English", "Spanish", "French", "Danish"}; + return Lang[i]; +} + +PRIVATE int set_language (int p, char *var, char *val) +{ + 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; + parray[p].language = gotIt; + pprintf(p, "Language set to %s.\n", Language(gotIt)); + return VAR_OK; +} + +PRIVATE int set_promote(int p, char *var, char *val) +{ + if (!val) + return VAR_BADVAL; + stolower(val); + switch (val[0]) { + case 'q': + parray[p].promote = QUEEN; + pprintf(p, "Promotion piece set to QUEEN.\n"); + break; + case 'r': + parray[p].promote = ROOK; + pprintf(p, "Promotion piece set to ROOK.\n"); + break; + case 'b': + parray[p].promote = BISHOP; + pprintf(p, "Promotion piece set to BISHOP.\n"); + break; + case 'n': + case 'k': + parray[p].promote = KNIGHT; + pprintf(p, "Promotion piece set to KNIGHT.\n"); + break; + default: + return VAR_BADVAL; + } + return VAR_OK; +} + +PRIVATE int set_prompt(int p, char *var, char *val) +{ + if (!val) { + if (parray[p].prompt && (parray[p].prompt != def_prompt)) + rfree(parray[p].prompt); + parray[p].prompt = def_prompt; + return VAR_OK; + } + if (!printablestring(val)) + return VAR_BADVAL; + if (parray[p].prompt != def_prompt) + rfree(parray[p].prompt); + parray[p].prompt = (char *) rmalloc(strlen(val) + 2); + strcpy(parray[p].prompt, val); + strcat(parray[p].prompt, " "); + return VAR_OK; +} + +int RePartner (int p, int new) +{ + int pOld; + + if (p < 0) + return -1; + pOld = parray[p].partner; + if (parray[pOld].partner == p) { + if (new >= 0) + pprintf_prompt (pOld, "Your partner has just chosen a new partner.\n"); + else + pprintf_prompt (pOld, "Your partner has just unset his/her partner.\n"); + player_withdraw_offers (pOld, -1, PEND_BUGHOUSE); + player_decline_offers (pOld, -1, PEND_BUGHOUSE); + player_withdraw_offers (p, -1, PEND_BUGHOUSE); + player_decline_offers (p, -1, PEND_BUGHOUSE); + } + player_withdraw_offers(p, -1, PEND_PARTNER); + player_decline_offers(p, -1, PEND_PARTNER); + parray[pOld].partner = -1; + parray[p].partner = new; + return new; +} + +PUBLIC int com_partner(int p, param_list param) +{ + int pNew; + + if (param[0].type == TYPE_NULL) { + 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 || parray[pNew].status == PLAYER_PASSWORD + || 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 (player_find_pendfrom(p, pNew, PEND_PARTNER) >= 0) { + pprintf (p, "You agree to be %s's partner.\n", parray[pNew].name); + pprintf_prompt (pNew, "%s agrees to be your partner.\n", parray[p].name); + player_remove_request(pNew, p, PEND_PARTNER); + + /* 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 (parray[pNew].partner >= 0) { + pprintf(p, "%s already has a partner.\n", parray[pNew].name); + return COM_OK; + } + pprintf(pNew, "\n"); + pprintf_highlight(pNew, "%s", parray[p].name); + pprintf(pNew, " offers to be your bughouse partner; "); + pprintf_prompt(pNew, "type \"partner %s\" to accept.\n", parray[p].name); + pprintf(p, "Making a partnership offer to %s.\n", parray[pNew].name); + player_add_request(p, pNew, PEND_PARTNER, 0); + +/* pprintf (p, "Command not implemented yet.\n"); */ + return COM_OK; +} + +PRIVATE int set_partner(int p, char *var, char *val) +{ +#if 0 + int p1 = parray[p].partner; + + if (!val) { + RePartner (p, -1); + return VAR_OK; + } + if (!printablestring(val)) + return VAR_BADVAL; + stolower(val); + p1 = player_find_part_login(val); + if (p1 < 0 || parray[p1].status == PLAYER_PASSWORD + || parray[p1].status == PLAYER_LOGIN) { + pprintf(p, "No user named \"%s\" is logged in.\n", val); + return VAR_OK; + } + if (p1 == p) { + pprintf(p, "You can't be your own bughouse partner!\n"); + return VAR_OK; + } + parray[p].partner = p1; + pprintf(p, "Your bughouse partner is now %s.\n", parray[p1].name); + pprintf_prompt(p1, "%s just chose you for a bughouse partner.\n", parray[p].name); +#endif + if (!val) + pprintf(p, "Command is obsolete; type \"partner\" to clear your partner\n"); + else + pprintf(p, "Command is obsolete; type \"partner %s\" to change your partner\n", val); + return VAR_OK; +} + +PRIVATE int set_busy(int p, char *var, char *val) +{ + if (!val) { + parray[p].busy[0] = '\0'; + pprintf(p, "Your \"busy\" string was cleared.\n"); + return VAR_OK; + } + if ((val) && (!printablestring(val))) + return VAR_BADVAL; + if (strlen(val) > 50) { + pprintf(p, "That string is too long.\n"); + return VAR_BADVAL; + } + sprintf(parray[p].busy, "%s", val); + pprintf(p, "Your \"busy\" string was set to \" %s\"\n", parray[p].busy); + return VAR_OK; +} + +/* this is really ugly */ +PRIVATE int set_plan(int p, char *var, char *val) +{ + 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 > parray[p].num_plan) + which = parray[p].num_plan + 1; + + if (which == 0) { /* shove from top */ + if (parray[p].num_plan >= MAX_PLAN) { /* free the bottom string */ + if (parray[p].planLines[parray[p].num_plan - 1] != NULL) + rfree(parray[p].planLines[parray[p].num_plan - 1]); + } + if (parray[p].num_plan) { + for (i = (parray[p].num_plan >= MAX_PLAN) ? MAX_PLAN - 1 : parray[p].num_plan; i > 0; i--) + parray[p].planLines[i] = parray[p].planLines[i - 1]; + } + if (parray[p].num_plan < MAX_PLAN) + parray[p].num_plan++; + parray[p].planLines[0] = ((val == NULL) ? NULL : strdup(val)); + pprintf(p, "\nPlan variable %d changed to '%s'.\n", which+1, parray[p].planLines[which]); + pprintf(p, "All other variables moved down.\n"); + return VAR_OK; + } + if (which > parray[p].num_plan) { /* new line at bottom */ + if (parray[p].num_plan >= MAX_PLAN) { /* shove the old lines up */ + if (parray[p].planLines[0] != NULL) + rfree(parray[p].planLines[0]); + for (i = 0; i < parray[p].num_plan; i++) + parray[p].planLines[i] = parray[p].planLines[i + 1]; + } else { + parray[p].num_plan++; + } + parray[p].planLines[which - 1] = ((val == NULL) ? NULL : strdup(val)); + pprintf(p, "\nPlan variable %d changed to '%s'.\n", which, parray[p].planLines[which-1]); + return VAR_OK; + } + which--; + if (parray[p].planLines[which] != NULL) { + rfree(parray[p].planLines[which]); + } + if (val != NULL) { + parray[p].planLines[which] = strdup(val); + pprintf(p, "\nPlan variable %d changed to '%s'.\n", which+1, parray[p].planLines[which]); + } else { + parray[p].planLines[which] = NULL; + if (which == parray[p].num_plan - 1) { /* clear nulls from bottom */ + while ((parray[p].num_plan > 0) && (parray[p].planLines[parray[p].num_plan - 1] == NULL)) { + parray[p].num_plan--; + pprintf(p, "\nPlan variable %d cleared.\n", which+1); + } + } else if (which == 0) { /* clear nulls from top */ + while ((which < parray[p].num_plan) && (parray[p].planLines[which] == NULL)) { + which++; + } + if (which != parray[p].num_plan) { + for (i = which; i < parray[p].num_plan; i++) + parray[p].planLines[i - which] = parray[p].planLines[i]; + } + parray[p].num_plan -= which; + } + } + return VAR_OK; +} + +PRIVATE int set_formula(int p, char *var, char *val) +{ + int which; + player *me = &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 +} + +PUBLIC var_list variables[] = { + {"open", set_open}, + {"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}, +/* {"uscf", set_uscf},*/ + {"prompt", set_prompt}, + {"partner", set_partner}, + {"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}, + {NULL, NULL} +}; + +PRIVATE 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; +} + +PUBLIC 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); +} + +PUBLIC 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", parray[p1].name); +/* if (parray[p1].fullName) + pprintf(p, " Realname: %s\n", parray[p1].fullName); + if (parray[p1].uscfRating) + pprintf(p, " USCF: %d\n", parray[p1].uscfRating); +*/ + pprintf(p, " time=%-3d inc=%-3d private=%d jprivate=%d Lang=%s\n", + parray[p1].d_time, parray[p1].d_inc, parray[p1].private, + parray[p1].jprivate, Language(parray[p1].language)); + pprintf(p, " rated=%d ropen=%d open=%d simopen=%d\n", + parray[p1].rated, parray[p1].ropen, parray[p1].open, parray[p1].sopen); + pprintf(p, " shout=%d cshout=%d kib=%d tell=%d notifiedby=%d\n", + parray[p1].i_shout, parray[p1].i_cshout, parray[p1].i_kibitz, parray[p1].i_tell, parray[p1].notifiedby); + pprintf(p, " pin=%d gin=%d style=%-3d flip=%d kiblevel=%d\n", + parray[p1].i_login, parray[p1].i_game, parray[p1].style + 1, parray[p1].flip, parray[p1].kiblevel); + pprintf(p, " highlight=%d bell=%d auto=%d mailmess=%d pgn=%d\n", + parray[p1].highlight, parray[p1].bell, parray[p1].automail, parray[p1].i_mailmess, parray[p1].pgn); + pprintf(p, " width=%-3d height=%-3d\n", + parray[p1].d_width, parray[p1].d_height); + if (parray[p1].prompt && parray[p1].prompt != def_prompt) + pprintf(p, " Prompt: %s\n", parray[p1].prompt); + if (parray[p1].partner >= 0) + pprintf(p, " Bughouse partner: %s\n", parray[parray[p1].partner].name); + +#if 0 + { /* added code to print channels */ + int count = 0; + for (i = 0; i < MAX_CHANNELS; i++) { + if (on_channel(i, p1)) { + if (!count) + pprintf(p, "\n Channels:"); + pprintf(p, " %d", i); + count++; + } + } + if (count) + pprintf(p, "\n"); + } +#endif /* Now use in [name] */ +/* if (parray[p1].numAlias && (p == p1)) { + pprintf(p, "\n Aliases:\n"); + for (i = 0; i < parray[p1].numAlias; i++) { + pprintf(p, " %s %s\n", parray[p1].alias_list[i].comm_name, + parray[p1].alias_list[i].alias); + } + } +*/ + if (parray[p1].num_formula) { + pprintf(p, "\n"); + for (i = 0; i < parray[p1].num_formula; i++) { + if (parray[p1].formulaLines[i] != NULL) + pprintf(p, " f%d: %s\n", i + 1, parray[p1].formulaLines[i]); + else + pprintf(p, " f%d:\n", i + 1); + } + } + if (parray[p1].formula != NULL) + pprintf(p, "\nFormula: %s\n", parray[p1].formula); + + if (!connected) + player_remove(p1); + return COM_OK; +} diff --git a/FICS/variable.h b/FICS/variable.h new file mode 100644 index 0000000..41e5a67 --- /dev/null +++ b/FICS/variable.h @@ -0,0 +1,56 @@ +/* variable.h + * + */ + +/* + 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 + (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. +*/ + +/* 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 int var_set(int, char *, char *, int *); +extern int com_time(); +extern int com_inc(); +extern int com_height(); +extern int com_width(); +extern int com_partner(); +extern char *Language(); + +extern var_list variables[]; + +extern int com_variables(); + +#endif /* _VARIABLE_H */ diff --git a/FICS/vers.h b/FICS/vers.h new file mode 100644 index 0000000..df005ac --- /dev/null +++ b/FICS/vers.h @@ -0,0 +1,31 @@ +/* vers.h + */ + +/* + 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 + (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. +*/ + +/* Revision history: + name email yy/mm/dd Change + Richard Nash 93/10/22 Created +*/ + +#ifndef _VERS_H +#define _VERS_H + +extern char SGS_VERS[]; +extern char VERS_NUM[]; +extern char COMP_DATE[]; + +#endif /* _VERS_H */ diff --git a/FICS/vers.h.orig b/FICS/vers.h.orig new file mode 100644 index 0000000..df005ac --- /dev/null +++ b/FICS/vers.h.orig @@ -0,0 +1,31 @@ +/* vers.h + */ + +/* + 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 + (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. +*/ + +/* Revision history: + name email yy/mm/dd Change + Richard Nash 93/10/22 Created +*/ + +#ifndef _VERS_H +#define _VERS_H + +extern char SGS_VERS[]; +extern char VERS_NUM[]; +extern char COMP_DATE[]; + +#endif /* _VERS_H */ diff --git a/data/Spanish/etiquette b/data/Spanish/etiquette new file mode 100644 index 0000000..2ce1fb8 --- /dev/null +++ b/data/Spanish/etiquette @@ -0,0 +1,37 @@ + +etiquette + +ETIQUETA + +El objetivo de FICS es proporcionar un medio amistoso para que los +entusiastas del ajedrez juegen partidas y discutan temas de interes. A fin +de promover una atmosfera amigable, FICS sigue algunas directrices y +reglas de etiqueta sencillas. Los administradores de FICS tienen autoridad +para advertir y, si es necesario, sancionar a los usuarios que violen +dichas reglas. + +Los usuarios de FICS deben evitar hacer cualquier declaracion o comprome- +terse en cualquier conducta que pueda ser considerada abusiva, ofensiva u +obscena, especialmente con respecto a la nacionalidad, raza, religion u +orientacion sexual. Evite que el tener diferencias de opinion se convierta +en una secuela de ataques personales. Si quiere evitar escuchar las decla- +raciones hechas por un usuario en particular, utilice el comando "censor". + +Los usuarios de FICS deben evitar las conductas abusivas que perjudiquen +a FICS. Tales conductas incluyen: (a) disconectarse a fin de evitar perder +una partida de ajedrez; (b) perder intencionalmente una partida a fin de +inflar el puntaje de otro usuario; (c) usar un computador de ajedrez sin +haberlo registrado como computador; (d) dejar a otras personas jugar +partidas validas por puntaje utilizando su cuenta registrada. + +Es considerado buen comportamiento sostener las discusiones largas sobre +un tema o problema particular usando los canales de FICS, en lugar de +gritar ("shout"). Para este proposito han sido creados canales de topicos +especiales (el archivo de ayuda "channel" tiene una lista). Puede haber +ocasiones en las que se le pida que traslade su discusion a un canal. + +Vea tambien: abuser admins censor channel computers + +[Ultima modificacion: junio 26, 1995 -- Friar + Version en espanhol: julio 3, 1995 -- Spike] + diff --git a/data/Spanish/ficsfaq b/data/Spanish/ficsfaq new file mode 100644 index 0000000..c81afed --- /dev/null +++ b/data/Spanish/ficsfaq @@ -0,0 +1,195 @@ + +ficsfaq + +PREGUNTAS DE OCURRENCIA FRECUENTE ACERCA DE FICS + + +Los admins de este sitio pueden estar muy ocupados, asi que si usted +encuentra un error (bug) o tiene preguntas, lea primero este archivo: + +1> Como me registro? + Lea el archivo de ayuda "register" -- "help register" + +2> Que es global (de red) vs. local ? + iene que ver con los puntajes distribuidos -- contacte a un admin si se + le presenta este error. + +3> Puedo tener mas de una cuenta? + Solo para jugar a la ciega, con/sin computador, para administrar o para + jugar en equipos. + +4> Puedo registrar mas de un computador? + Si. + +5> Puedo tener mas de una persona usando mi direccion electronica? + Si. + +6> Pueden varias personas compartir una cuenta para juegos en equipos? + Si, WEENIES es un ejemplo. + +7> Puedo ser un admin? + Lea el arcivo de ayuda "admin-new" -- "help admin-new". + +8> Puedo ayudar con la programacion? + Pregunte a Hawk [uno de los admins de aqui]. + +9> Quien esta programando? + Dan/DAV/foxbat/grimm/hawk/Len/Mann/Shane, etc. + Gracias a Friar por algunos archivos de ayuda. + Y Cthulu (clong) por la base de datos ECO - proximamente. + Gracias a Richard Nash (red) y Michael Moore por el codigo del viejo + fics. + +10> Donde mas puedo jugar ajedrez GRATIS? + anemone.daimi.aau.dk 5000 + arapaho.cse.ucsc.edu 5000 + helium.daimi.aau.dk 5000 + ics.onenet.net 5000 + pitt.chess.edu 5000 + Si usted sabe de mas sitios GRATUITOS, cuentenos! + +11> De donde consigo una interface? + pub/chess en ftp ics.onenet.net (use ftp-anonimo) + +12> De donde puedo conseguir el codigo mas reciente? + pub/chess/Unix en ftp ics.onenet.net (use ftp-anonimo) + Los archivos de ayuda estan en la version mas antigua FICS.tar.gz + +13> No me gusta el admin x. El admin y me esta tratando de mala manera. + Contacte a Sparky (onenet) y Hawk (helium). + +14> Darooha, arcsin y POTZY han venido a llevarse algo. Que hacer? + A veces, algunas personas fingen ser ellos. + No incurra en comportamiento abusivo contra ellos si entran al FICS. + Nuestro codigo es GNU - ellos pueden usar nuestras ideas y codigo en + ICC si quieren. Recuerde quien escribio este servidor en primer lugar. + [Nota del traductor: GNU es un proyecto del MIT para intercambiar + software libremente. Cualquiera puede tomar software de GNU y usarlo + como quiera -copiarlo, incorporarlo en sus programas, modificarlo, + distribuirlo-, dentro de los limites de la licencia publica de GNU.] + +15> Que es ICC? + No pregunte -- no hay publicidad gratuita -- usted paga $49 por jugar + ajedrez alli. :) + +16> Puedo gritar (shout) mensajes sobre ICC? + Si, seguro. Dada la eleccion de pagar $49 o $0. Yo elegiria la de $0. + +17> Deberia promocionar a FICS? + Si, hagalo. Procure sin embargo, no armar un lio en ICC. Si se conecta + a ICC, consulte el archivo de anuncios ("help ads"). Recuerde, las + hamburguesas Burger King son gratis. :) + +18> No puedo gritar (shout) ! + Ya se ha registrado? Ha sido sancionado? + +19> No puedo jugar partidas validas por puntaje. + Han colocado usted y su oponente la variable "rated" en 1? + Tiene el error global (de red) vs. local? + +20> Como uso la cosa "-->Nombre mensaje" que he visto desplegada? + Use "it", "i" o ":" seguido del mensaje. + +21> Observo que ha resurgido el canal de las hormonas (51). + Si, pero solo se permite el uso de lenguaje decente. Este es un + servidor familiar. No diga cosas que no diria en frente de ninhos + pequenhos. Aunque tal vez si las diga. :) + + +22> El tablero esta invertido (cabeza-abajo). + Problema del "flip" en el estilo 12 -- la vieja version de ZIICS y + SLICS se ven afectados por ello. + +23> No puedo coronar (promover un peon) - xboard -. + Intente e7e8 para una dama (reina). + +24> Como continuo un juego que fue aplazado? + Desafie ("match") al jugador nuevamente, y el servidor reiniciara el + juego si su oponente acepta. + +25> No puedo enrocar despues de devolver (cancelar) una jugada en la que + movi el rey. + Lo sabemos. + +26> Puedo enrocarme en jaque. + Si, sucedio una vez. + +27> "takeback" da informacion equivocada sobre la ultima jugada. + Un error. + +28> "simuls" no funciona. + Las simultaneas estuvieron fuera de servico algun tiempo. Deberian + funcionar bien ahora. + +29> Mi puntaje esta muy alto/bajo. + Debe haber un error en alguna parte. + +30> +alias/+censor etc. no funcionan. + Utilice alias/unalias y censor/uncensor por ahora. + +31> Tengo una vieja cuenta aqui, pero no recuerdo mi clave ... + Pida ayuda a un admin -- y tenga a mano su direccion electronica. + +34> "stats" da informacion inutil. + Lo sabemos. + +35> Hay variantes "salvajes" ? + Si ... y puntajes tambien. + +36> Zippy no quiere callarse, y grita mucho. + Utilice censor [nombre], cshout (equivalente a sshout en ICC) estara + listo proximamente. + +37> En cuantos canales puedo estar simultaneamente? + En tantos como quiera, pero no demasiados pues ello toma espacio de + archivos; teclee "help channel" para ver los canales predefinidos. + [Nota del traductor: canal 69 = canal latino; canal 73 = canal + espanhol. Con un poco de suerte, a traves de ellos puede obtener ayuda + en linea en espanhol]. + +39> La informacion de "who" no aparece bien alineada. + Se arreglara proximamente. + +40> Como retiro un desafio ("match") ? + Escriba "withdraw". + +41> Estoy teniendo "lag" -- que puedo hacer? + Intente Ctrl-C para cancelar, o use "adjourn" para aplazar. + De otro modo, haga que su oponente le de mas tiempo con "moretime #", + donde # <= 600 segundos. + [Nota del traductor: "lag" (en espanhol, "demora" o "retardo") es la + diferencia entre el momento en que usted ingresa un comando o una + jugada y el momento en que el servidor le responde. Es una caracte- + ristica normal dentro del estado tecnologico actual de Internet, + aunque en algunos dias -y en algunos sitios- es peor que en otros]. + +42> Repentinamente recibi el mensaje "connection closed". + a> Se bajo el servidor (shutdown) + b> Se cayo el servidor (crash) -tenganos paciencia-. + c> El servidor lo expulso por alguna razon + d> Usted armo algun lio + +43> Cuando duran los bajones (shutdowns) del servidor, y por que se + producen? + Alrededor de 10 segundos. + A veces necesitamos anhadir nuevo codigo, o corregir errores -por + favor, tenganos paciencia. + +44> Recibo caracteres no-desplegables / "delete" no funciona. + En reparacion. + +45> Donde puedo conseguir mas ayuda? + Siga estos pasos: + (a) Escriba "channel 1" + (b) Escriba "tell 1 help me!" + (c) Cuando sea suficiente, puede escribir "channel 1" para salir del + canal + [Nota del traductor: en los canales 69 (latino) y 73 (espanhol) puede + recibir ayuda en espanhol] + +46> Como detengo un archivo extenso que pasa de largo por mi pantalla? + Use Ctrl Q para detenerlo y Ctrl S para proseguir -- o use su barra de + "scroll". + Tambien "set height ##" determina cuantas lineas deben ser desplegadas + al tiempo. + diff --git a/data/Spanish/interface b/data/Spanish/interface new file mode 100644 index 0000000..cd07511 --- /dev/null +++ b/data/Spanish/interface @@ -0,0 +1,201 @@ + +interface + +En este archivo de ayuda aparecen algunos detalles de las diversas inter- +faces graficas. A menudo es dificil jugar ajedrez usando los tableros +ASCII que genera el servidor. No son faciles de ver, y se ven afectados +por otra informacion tal como los gritos (shouts). + +Las interfaces graficas le dan un tablero de ajedrez apropiado en el cual +ver sus piezas, haciendo su ajedrez mas facil de jugar. + +Aqui hay un resumen: + +========================================================================== +Interface Sistema Operativo y Modo Autor de la Localizacion +Grafica de Conexion Requerido interface en ICL +========================================================================== +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 *fischer 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 y/o modem MaDHaTteR pub/chess/Win3 +WinBoard WinNT or W95, TCP/IP y/o mann pub/chess/Win3 + modem +PMICS OS/2, TCP/IP y/o modem woof pub/chess/DOS +XBoard # Unix, X11R4, TCP/IP y/o mann pub/chess/X + modem +xics Unix, X11R3 , TCP/IP *observer pub/chess/X +cics TCP/IP y C, terminal *observer pub/chess/Unix + ASCII +NeXTICS NeXT, TCP/IP y/o 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 *fischer pub/chess/Amiga +========================================================================== +# Recomendado y popular +## Aun no funciona bien en FICS. +* No probado en FICS todavia. + +NB. Los handles de los autores pueden referirse a los handles de personas +en el antiguo Aics. Algunos pueden ser de personas diferentes o no existir +hoy en dia. La mayoria de las interfaces deberian trabajar; tanto los +autores como los programadores de FICS les gustaria recibir informacion si +usted tuviera problemas con alguna de ellas aqui. + +Mas adelante usted encontrara un listado que explica que interfaces corren +en una configuracion en particular y en que directorio pueden encontrarse. +En algunas hay breves comentarios de los usuarios o de los autores de las +interfaces para ayudarlo a elegir. + +Si usted tiene preguntas o problemas ulteriores, por favor contacte a un +admin. + + +Instrucciones para Obtener una Interface +---------------------------------------- + +Cualquiera de las interfaces graficas mencionadas arriba puede encontrarse +en el sitio ftp-anonimo chess.onenet.net (URL: ftp://chess.onenet.net/). +La mayoria viene con algunas instrucciones. :-) + +Elija una, utilice ftp (help ftp-hints), Netscape o algun software similar +para acceder a ella por Internet y transfierala a su sistema PC o estacion +de trabajo local a traves de su metodo preferido (zmodem, kermit para la +mayoria de conexiones telefonicas distintas de tcp/ip), desempaquetela (la +mayoria utilizan software de compresion, o son auto-extractables), y por +ultimo configurela. :-) + + +Comentarios sobre las Interfaces +-------------------------------- + +Este listado describe las interfaces en un detalle ligermante mayor, con +algunos comentarios de los usuarios/autores de las interfaces que pueden +servir para ayudarlo a elegir. + +Si usted tiene preguntas o problemas ulteriores, por favor contacte a un +admin. + + +PC y compatibles (Usando DOS y modem): pub/chess/DOS +---------------------------------------------------- + +ZIICS por Zek: + Una muy popular interfce para el PC. + + ZIICS requiere una coneccion normal por modem y un adaptador grafico + (VGA, EGA, CGA o Hercules). En VGA hay varios estilos de tableros, desde + 32 pixeles por escaque hasta 56 pixeles por escaque (casi llena toda la + pantalla verticalmente). Usted puede configurar los colores y las + funciones de los botones editando un archivo tipo texto. + [comentario de Zek] + +GIICS por LLama: + +JIICS por Peluri: + Necesitara VGA y un mouse para usar esta interface. + +Monarc por Kevster: + + +PC y compatibles (Usando DOS y TCP/IP): pub/chess/DOS +----------------------------------------------------- + +NGIICS por LLama: + + +PC y compatibles (Usando Windows y modem): pub/chess/Win3 +--------------------------------------------------------- + +Raja (elefante) de fischer: + +Gilchess por Azorduldu: + +bludrake por Bloodrake: + + +PC y compatibles (Usando Windows y TCP/IP): pub/chess/Win3 +---------------------------------------------------------- + +SLICS por dfong: + +Toolkit por MaDHaTteR: + Aun no funciona aqui correctamente, pero deberia hacerlo pronto. + + +PC y compatibles (Usando Windows NT (o 95) y TCP/IP): pub/chess/Win3 +-------------------------------------------------------------------- + +WinBoard por mann: + "finger mann" para obtener los ultimos detalles. + + +PC y compatibles (OS/2 PM ): pub/chess/DOS +------------------------------------------ + +PMICS por woof: + + +Unix (Xwindows): pub/chess/X +---------------------------- + +XBoard por mann: + Ciertamente la mejor de las interfaces UNIX, sigue siendo soportada para + trabajar aun mejor en FICS. A los usuarios de maquinas UNIX se les reco- + mienda ampliamente conseguir esta interface. Tambien es aconsejable para + usarla con GNUchess. + [comentario de DAV] + + "finger mann" para obtener los ultimos detalles. + +xics por observer: + + +Unix (terminal vt100): pub/chess/Unix +------------------------------------- + +cics por observer: + + +NeXT: pub/chess/NeXT +-------------------- + +NeXTICS por red: + + +MAC: pub/chess/Macintosh +------------------------ + +MacICS por douglas: + + +MAC (Modem): pub/chess/Macintosh +-------------------------------- + +E-ICS por douglas: + + +MAC (TCP\IP): pub/chess/Macintosh +--------------------------------- + +MacTCP por eew: + + +Amiga: pub/chess/Amiga +---------------------- + +Aics por fischer: + Podria no trabajar con KS2.0 y anteriores. + +Vea tambien: ftp-hints + +[Ultima modificacion: junio 16, 1995 -- Friar + Version en espanhol: julio 3, 1995 -- Spike] + diff --git a/data/Spanish/intro0 b/data/Spanish/intro0 new file mode 100644 index 0000000..837b1a9 --- /dev/null +++ b/data/Spanish/intro0 @@ -0,0 +1,55 @@ + +intro0 + + B I E N V E N I D O + + al + + S E R V I D O R G R A T U I T O D E A J E D R E Z + D E I N T E R N E T (FICS) + + +Hemos creado varios archivos de informacion para usuarios de este servidor +de ajedrez. Los archivos describen diferentes caracteristicas del servidor +y le dan algunas sugerencias sobre como esas caracteristicas pueden ayudar +a disfrutar del ajedrez en internet. Aqui hay un directorio de archivos de +informacion, con el tema que cubre cada uno: + + Archivo Tema + ------- -------------------------------------------------- + intro1 Informacion General + intro2 Comunicacion + intro3 Despliegue de Informacion + intro4 Definiendo sus Preferencias + intro5 Funciones Especiales + intro6 Partidas de Ajedrez + intro7 Haciendo Jugadas en una Partida de Ajedrez + +Para leer la informacion de uno de estos archivos , simplemente escriba +"help intro#" usando el numero adecuado. Si despues de leer los archivos +aun tiene preguntas, hay varias cosas que puede hacer. (1) Lea el archivo +de ayuda del comando sobre el que tenga dudas ; su respuesta podria estar +alli. (2) Contacte a otros usuarios, especialmente a los administradores +del servidor (conocidos como "admins"); sus ayudas suelen ser muy utiles. + +Para leer un archivo de ayuda teclee "help [tema]", sin los parentesis +cuadrados. Si el tema es un comando, el archivo de ayuda le dara infor- +macion acerca del formato para ese comando. Es facil notar que se trata +de un comando porque la pimera linea describe el formato ( "Uso" ). Las +palabras en parentesis cuadrados designan parametros opcionales; incluir +tales parametros afecta el modo en que se procesa el comando. En muchos +casos un archivo de ayuda sugiere otros que usted seguramente querra leer. + +Algunos archivos son mas largos que una pantalla.Para continuar leyendo el +archivo, teclee "next" o (su alias) "more". Cuantas lineas recibe usted de +una vez depende del valor de su variable "height". + +Sus sugerencias sobre los archivos de informacion (y sobre los archivos de +ayuda) son bienvenidas. Sientase libre de enviar un mensaje a HelpFiles +("message helpfiles") con sus comentarios. + +Vea tambien: help next variables + +[Ultima modificacion: julio 1, 1995 -- Friar + Version en espanhol: julio 3, 1995 -- Spike] + diff --git a/data/Spanish/intro1 b/data/Spanish/intro1 new file mode 100644 index 0000000..a29530c --- /dev/null +++ b/data/Spanish/intro1 @@ -0,0 +1,42 @@ + +intro1 + +INFORMACION GENERAL + + +Internet tiene gran capacidad para conectar gente alrededor del mundo. +Este servidor de ajedrez es una alternativa para los usuarios de la red +que disfrutan del ajedrez. Otros servidores de ajedrez ( al menos los que +nosotros conocemos ) se encuentran en el archivo "address". Entre otras +cosas, un servidor de ajedrez permite a los usuarios jugar partidas unos +con otros, asi como comunicarse entre si. El ( computador ) servidor de +ajedrez esta programado para enviar las movidas y mensajes de cada jugador +a los usuarios correctos. Tambien mantiene cierta informacion adicional. + +A fin de usar sus caracteristicas usted necesita ingresar ciertos co- +mandos. Para listar dichos comandos escriba "help". Para conseguir una +descripcion de un comando en particular, escriba "help [comando]" -- sin +los parentesis cuadrados, por supuesto. NOTA: usted no tiene que escribir +el comando entero a fin de usarlo o leer su archivo de ayuda; teclear las +primeras letras funcionara en la mayoria de los casos. + +En general, los comandos hacen una de estas cuatro cosas: (a) envian un +mensaje a uno o mas usuarios (ver intro2), (b) despliegan informacion para +usted (ver intro3), (c) modifican uno de sus parametros/caracteristicas/ +funciones (ver intro4), o (d) hacen que el servidor realice alguna accion +especial. Algunos comandos estan permitidos solo a los administradores del +servidor ("admins") y no pueden ser empleados por los usuarios corrientes. + +Los nuevos usuarios podrian querer empezar con caracteristicas simples, y +gradualmente aprender sobre las otras caracteristicas a medida que van +avanzando. El servidor permite determinar como se quiere recibir cierta +informacion. Por ejemplo, usted puede decidir como se muestra una posicion +en una partida (ver style). Tambien puede fijar sus preferencias sobre los +tipos de partidas de ajedrez que a usted le gustaria jugar, o los tipos de +mensajes que recibe de otros (ver variables). + +Vea tambien: addresses intro2 intro3 intro4 intro5 + +[Ultima modificacion: junio 11, 1995 -- Friar + Version en espanhol: julio 3, 1995 -- Spike] + diff --git a/data/Spanish/intro2 b/data/Spanish/intro2 new file mode 100644 index 0000000..b997794 --- /dev/null +++ b/data/Spanish/intro2 @@ -0,0 +1,71 @@ + +intro2 + +COMUNICACION + + +Las comunicaciones entre usuarios son de dos tipos: (a) mensajes, y (b) +peticiones. Los mensajes involucran basicamente conversaciones entre +usuarios; el servidor simplemente transmite los mensajes. Las peticiones +son diferentes por cuanto involucran el que el servidor haga algo acerca +de o durante una partida de ajedrez. + + +MENSAJES + +Suponga que usted quiere decir algo a uno o mas usuarios. Hay varios +comandos que puede usar: + + comando funcion + ------- -------------------------------------------- + message Enviar a un usuario un mensaje para ser almacenado, aun + si el usuario no esta conectado en el momento + tell Hablar a un usuario, o a usuarios en un canal + xtell Hablar a un usuario, pero permitir la continuacion de la + conversacion con otro + channel Escuchar los tells enviados a un canal dado + say Hablar al usuario con el que usted esta jugando (o con el + que acaba de jugar una partida) + shout Hablar a todos los usuarios que estan abiertos a los + gritos (shouts) + cshout Hablar a todos los usuarios que estan abiertos a los + gritos (shouts); el mensaje debe ser sobre ajedrez + it Una clase especial de grito + kibitz Hablar a todos los jugadores y observadores de un juego + de ajedrez especifico + whisper Hablar a todos los observadores de una partida especifica + censor Evita que los mensajes de un usuario dado lleguen a usted + +Lea mas acerca de estos comnados en sus propios archivos de ayuda. Pero en +general, "message" trabaja como una maquina contestadora, "tell" y "say" +son como conversaciones normales uno-a-uno, "shout", "cshout" e "it" son +para charlas en grupo y "kibitz" y "whisper" son para comentar una partida +que se esta observando. Por favor, siga las indicaciones de etiqueta del +servidor de ajedrez cuando utilice estos comandos. + + +PETICIONES + +Los usuarios necesitan ponerse de acuerdo sobre las partidas que van a +jugar. Tambien necesitan ponerse de acuerdo sobre diversas situaciones +durante el juego de una partida. Las peticiones sirven como forma de +alcanzar dichos acuerdos, asi como de realizar la accion acordada. Por +ejemplo, los usuarios necesitan solicitar el inicio de una partida. Cuando +ha habido acuerdo sobre las condiciones de juego, el servidor comienza una +partida entre esos dos usuarios. Durante la misma, un jugador puede +necesitar aplazarla; si se acuerda el aplazamiento, el servidor detiene el +juego y lo graba, de modo que pueda ser reiniciado posteriormente. Lea +intro6 para mas informacion sobre partidas de ajedrez y otras peticiones +especiales. + +AYUDA UTIL: en ocasiones, muchos mensajes de varios usuarios llegaran a su +pantalla. Para ayudarle a notar cuando un usuario le ha enviado un mensaje +o solicitud a usted personalmente (en lugar de a todos los usurios de +FICS), existe una variable llamada highlight que hace dichos mensajes mas +evidentes (vea highlight). + +Vea tambien: etiquette intro6 [y los comandos individuales] + +[Ultima modificacion: junio 16, 1995 -- Friar + Version en espanhol: julio 3, 1995 -- Spike] + diff --git a/data/Spanish/intro3 b/data/Spanish/intro3 new file mode 100644 index 0000000..7c813f0 --- /dev/null +++ b/data/Spanish/intro3 @@ -0,0 +1,65 @@ + +intro3 + + +DESPLIEGUE DE INFORMACION + +Hay varios comandos que pueden usarse para obtener informacion general: + + comando informacion + ------- -------------------------------------------- + allobservers lista todos los usuarios que observan una partida + best despliega los puntajes mas altos alcanzados en los varios + tipos de partidas (incluyendo computadores) + date fecha actual + games informa las partidas que se estan jugando en este momento + handle muestra los usuarios registrados con nombres que inician + con la letra o letras dadas + hbest despliega los puntajes mas altos alcanzados en los varios + tipos de partidas (excluyendo computadores) + help describe un comando, despliega informacion util, o lista + todos los comandos y los temas de los archivos de ayuda + alfabeticamente + hrank lista los usuarios y sus puntajes dentro del rango de + valores especificados (excluyendo computadores) + inchannel lista a todos los usuarios que estan escuchando un canal + de comunicacion dado + info lista los nombres de todos los archivos de ayuda que no + se refieren a comandos + llogons lista las ultimas 30 conexiones/desconexiones al servidor + rank lista los usuarios y puntajes dentro del rango de valores + especificado (incluyendo computadores) + statistics despliega informacion sobre uso del servidor + time hora actual + uptime cuanto tiempo ha estado corriendo el servidor desde su + ultimo arranque + who usuarios actualmente conectados + +Otros comandos despliegan informacion sobre usted a otro usuario y/o +viceversa: + + comando informacion + ------- -------------------------------------------- + assess despliega como los puntajes suyo y de otro usuario + cambiarian si ambos jugaran una partida valida por puntos + eco despliega informacion sobre la apertura utilizada en una + partida + finger despliega informacion general sobre un usuario + history despliega informacion sobre las partidas recientes de un + usuario + hrank informa el puesto y puntaje de un jugador (excluyendo los + computadores) + logons lista las ultimas 10 conexiones de un usuario + pending informa las peticiones que han sido hechas a usted o por + usted y que todavia no han sido declinadas + rank informa el puesto y puntaje de un jugador (incluyendo los + computadores) + stored lista las partidas almacenadas por un usuario + variables despliega la preferencias y parametros actuales de un + usuario + +Vea tambien: [comandos individuales] + +[Ultima modificacion: junio 26, 1995 -- Friar + Version en espanhol: julio 3, 1995 -- Spike] + diff --git a/data/Spanish/intro4 b/data/Spanish/intro4 new file mode 100644 index 0000000..e19dfb4 --- /dev/null +++ b/data/Spanish/intro4 @@ -0,0 +1,40 @@ + +intro4 + +DEFINIENDO SUS PREFERENCIAS + + +Cada usuario tiene desde el comienzo ciertos valores y parametros por +defecto, pero pueden cambiarse si se desea. Para cambiar los parametros +se utiliza el comando "set"; usted puede ver sus parametros actuales o los +de otro usuario, usando el comando "variables". + +Algunos parametros afectan la informacion que el servidor le transmitira a +usted, como las comunicaciones de otros usuarios y las notificaciones de +partidas que comienzan o de usuarios que llegan o se van. Otros parametros +afectan las partidas de ajedrez, como los controles de tiempo por defecto, +el si usted oye o no un timbre cuando se le envia una nueva posicion en el +tablero, si debe enviarsele automaticamente un listado de las movidas de +su partida cuando esta termina (o se aplaza), o incluso el formato usado +para enviarle la posicion del tablero. + +Al cambiar estos parametros, usted puede crear la clase de atmosfera que +le gustaria tener. Los parametros pueden cambiarse en cualquier momento, +incluso varias veces durante una misma sesion. En su mayoria, los cambios +que haga en sus parametros seran grabados luego de desconectarse, de modo +que no tendra que volverlos a cambiar cada vez que ingrese al FICS. + +Su clave secreta (password) tambien es un parametro especial, aunque nunca +se despliega en ninguna parte. Cuando usted se registra, se le asigna una +clave de ingreso que usted puede cambiar en cualquier momento utilizando +el comando password. + +Finalmente, el servidor le permite crear alias especiales para evitarle el +teclear frases que usa a menudo. En lugar de escribir toda la frase, lo +unico que tiene que hacer es teclear el alias. + +Vea tambien : aliases password set variables + +[Ultima modificacion: junio 16, 1995 -- Friar + Version en espanhol: julio 3, 1995 -- Spike] + diff --git a/data/Spanish/intro5 b/data/Spanish/intro5 new file mode 100644 index 0000000..a6c6bba --- /dev/null +++ b/data/Spanish/intro5 @@ -0,0 +1,28 @@ + +intro5 + +FUNCIONES ESPECIALES + + +Hay varios comandos que realizan funciones especiales mas alla de enviar +mensajes a otros usuarios, desplegar informacion o modificar sus +parametros. Aqui estan algunos de los mas utiles: + + + comando funcion + ------- -------------------------------------------- + alias facilita la escritura de frases frecuentemente usadas + examine permite analizar un juego + mailmoves le envia las jugadas de la partida actual de un usuario + mailoldmoves le envia las jugadas de la ultima partida de un usuario + oldmoves le permite ver la ultima partida de un usuario + smoves despliega las jugadas de una partida guardada + sposition despliega la posicion final de una partida guardada + +Con el tiempo se iran agregando mas funciones. + +Vea tambien: [comandos individuales] + +[Ultima modificacion: junio 29, 1995 -- Friar + Version en espanhol: julio 3, 1995 -- Spike] + diff --git a/data/Spanish/intro6 b/data/Spanish/intro6 new file mode 100644 index 0000000..fafea36 --- /dev/null +++ b/data/Spanish/intro6 @@ -0,0 +1,54 @@ + +intro6 + +PARTIDAS DE AJEDREZ + + +El proposito principal de este servidor de ajedrez es reunir usuarios que +quieran jugar ajedrez. Entre otras cosas, el servidor permite contactar a +otros usuarios para jugar partidas, valida que todos los movimientos sean +legales, mantiene la posicion del tablero a medida que transcurre el +juego, y actualiza los puntajes de los jugadores luego de cada partida. + +La manera basica de contactar a un usuario para jugar una partida es a +traves del comando match. Hay un archivo de ayuda especial para el comando +match, asi que no iremos en mucho detalle aqui. En seguida hay una lista +de comandos sobre los que usted puede querer saber algo mas (recuerde que +las peticiones estan dirigidas a su oponente, no al servidor, y que deben +ser aceptadas por el para que tengan efecto): + + comando funcion + ------- -------------------------------------------- + match pedir a otro usuario jugar una partida + abort pedir que la partida sea cancelada + accpet aceptar una peticion de un usuario + adjourn pedir que la partida sea detenida y grabada para + continuarla en algun otro momento + decline declinar una peticion de un usuario + draw pedir que la partida sea declarada tablas + flag finalizar la partida porque su oponente se quedo sin + tiempo + moves hacer que FICS le envie las movidas de la partida que + usted esta jugando + pause pedir que la partida sea suspendida temporalmente, pero + sin aplazarla + promote decir a que pieza va a ser promovido un peon cuando + alcanza la octava fila + refresh mostrar la posicion actual del tablero + resign terminar la partida, dando a su oponente la victoria + say comunicarse con su actual (o ultimo) oponente + switch pedir a su oponente cambiar de lado (color) + takeback pedir a su oponente devolver (cancelar) una o mas jugadas + unpause pedir que una partida detenida con pause sea continuada + withdraw cancelar una peticion hecha por usted + +Es posible jugar partidas con mas de un usuario al tiempo, a semejanza de +una exhibicion de simultaneas de un gran torneo de ajedrez. Si usted esta +interesado en jugar contra otros en partidas simultaneas, lea el archivo +"simuls". + +Vea tambien: match simuls [y los comandos individuales] + +[Ultima modificacion: junio 16, 1995 -- Friar + Version en espanhol: julio 3, 1995 -- Spike] + diff --git a/data/Spanish/intro7 b/data/Spanish/intro7 new file mode 100644 index 0000000..9028410 --- /dev/null +++ b/data/Spanish/intro7 @@ -0,0 +1,99 @@ + +intro7 + +HACIENDO JUGADAS EN UNA PARTIDA DE AJEDREZ + + +Hay dos maneras de hacer jugadas durante una partida. Muchos usuarios +tienen una interface grafica. En ese caso, el usuario mueve la pieza sobre +el tablero grafico usando el mouse de su computador, y el software de la +interface traduce este movimiento en notacion de ajedrez y lo envia al +servidor para procesamiento. Lea el archivo de informacion de interfaces +para obtener algunos detalles sobre interfaces graficas. + +Si no tiene una interface grafica, necesitara entrar sus jugadas usando un +teclado. A fin de hacerlo, debe saber que clase de notacion utiliza el +servidor de ajedrez. Los jugadores de ajedrez utilizan uno de dos sistemas +notacionales diferentes: descriptivo o algebraico. El servidor entiende el +algebraico unicamente (aunque tambien es capaz de comprender la version de +computador de la notacion de ajedrez; ver mas abajo). + +En notacion algebraica, cada escaque tiene un unico nombre. Cada fila se +numera del 1 al 8, siendo la primera fila del lado blanco la numero 1. +Analogamente, cada columna se etiqueta desde la a hasta la h, siendo la +primera columna de la izquierda del lado blanco la a. Asi, cada casilla +tiene un nombre de fila y columna, mencionandose primero el de la columna. +En notacion algebraica, cada pieza de ajedrez tiene su propio simbolo: + k = king = rey; + q = queen = reina o dama; + b = bishop = alfil; + n = knight = caballo; + r = rook = torre; + p = pawn = peon (aunque la "p" realmente no se utiliza). + +Aqui hay una muestra de una posicion de una partida, tal como se ve en el +estilo 1 que es el estilo por defecto. En este ejemplo, el blanco esta en +la parte inferior del tablero y el negro en la superior. Los simbolos de +las piezas estan en letras mayusculas; el "*" significa que la pieza es +negra. + + --------------------------------- + 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 + +El rey negro (*K) esta en el escaque g8; el rey blanco (K) esta en el g1, +y asi sucesivamente. Le toca mover al negro. Suponga que el negro quiere +colocar el caballo (*N) en el escaque e4. La movida a entrar en notacion +algebraica seria Ne4. Mover los peones es mas facil: usted no utiliza la +"p" para la pieza, sino que simplemente da el escaque al cual el peon se +va a mover. Suponga que el negro decide mover el peon (*P) del escaque h7 +al h6. La jugada a escribir seria h6. En muchas posiciones del tablero, +varias piezas iguales (por ejemplo, dos torres o dos caballos) pueden +moverse a la misma casilla. En este caso, usted debe indicar cual de las +varias piezas quiere mover. Por ejemplo, suponga que el negro tiene +caballos en c2 y e2, desde donde ambos pueden moverse a d4. Para mover el +caballo de c2 a d4 usted podria escribir Ncd4, donde la "c" sirve para +decir al servidor que caballo mover. + +En notacion algebraica, las capturas se denotan generalmente por "x". +Suponga que el negro quiere capturar el peon blanco de b2 (P) con la torre +de b8 (*R). El negro ingresaria el movimiento Rxb2. Sin embargo, el +servidor tambien entenderia el simple Rb2 y comprenderia que hay una +captura implicita. Asi que, para este servidor, usted puede ingresar la +casilla en la cual la pieza va a capturar. Para hacer un enroque, utilice +O-O si es el corto y O-O-O si se trata del largo. + +Muchos computadores requieren instrucciones muy explicitas de como mover +las piezas. Esta notacion de computadores tiene el siguiente formato: + casilla_de_salida-casilla_de_llegada + +Por ejemplo, en la anterior posicion del tablero, mover la torre negra +desde b8 hasta b2 se escribiria b8-b2. Nunca se utilizan simbolos para +las piezas; solo se nombran las casillas. El servidor tambien entiende +esta notacion de computador. + +En resumen, para mover una pieza durante una partida, ingrese la movida. +Cada vez que usted o su oponente hacen una movida, el servidor actualiza +la posicion del tablero y envia la nueva posicion tanto a su oponente como +a usted mismo. Es asi de simple ! + +Vea tambien: interfaces style + +[Ultima modificacion: junio 16, 1995 -- Friar + Version en espanhol: julio 3, 1995 -- Spike] + diff --git a/data/Spanish/nota_acerca b/data/Spanish/nota_acerca new file mode 100644 index 0000000..e0fedae --- /dev/null +++ b/data/Spanish/nota_acerca @@ -0,0 +1,40 @@ + +NOTA ACERCA DE LA TRADUCCION + +El espanhol no es un idioma uniforme entre todos los paises hispano- +parlantes; como cualquier hablante nativo sabe, en Espanha se utilizan +giros y expresiones virtualmente desconocidos en Hispanoamerica, y +viceversa; entre los paises de esta ultima, por supuesto, tambien hay +diferencias de mayor o menor importancia. + +A pesar de que en esta traduccion se ha procurado ser "neutral" en ese +sentido, es seguro que existen sesgos en favor del uso que se da al idioma +en America, especialmente en los paises andinos (estos sesgos se deben, +logicamente, a la procedencia del autor de la traduccion: Colombia). + +En solo un caso dicho favorecimiento ha sido consciente: en el caso de +tres terminos relacionados con computadores. Tales terminos son: + + Ingles Traducido como + + file archivo + interface interface + mouse mouse + +Es posible que un hablante espanhol encuentre mas natural traducir "file" +por "fichero", "interface" por "interfaz" y "mouse" por "raton"; sin +embargo, el traductor espera que, una vez hecha la aclaracion, la lectura +de la version traducida no presente mayores dificultades. + +Una observacion final sobre acentuacion: a fin de facilitar la difusion de +este archivo por cualquier tipo de sistema, no se han utilizado caracteres +acentuados; tampoco se acudio a recursos de uso corriente, como escribir +en mayUsculas las vocales acentuadas, ni con apo'strofes, por cuanto +parecia evidente que tales recursos iban a entorpecer, mas que favorecer, +la lectura del texto. Por tanto, las vocales van sin acentuar, y la letra +del alfabeto espanhol que va entre la "n" y la "o" (y que aqui hay que +describir por no poder llamarla por su nombre) se representa por la +combinacion "nh": "enhe". + + Spike -- julio 3, 1995 + diff --git a/data/Spanish/register b/data/Spanish/register new file mode 100644 index 0000000..917fcf4 --- /dev/null +++ b/data/Spanish/register @@ -0,0 +1,43 @@ + +register + + *** El registro por email ha sido automatizado! *** + +Para obtener una cuenta registrada, envie un mensaje a esta direccion: + + chess@caissa.onenet.net + +... y utilice como asunto ("Subject"): "Fics Registration" + +Incluya una linea como la siguiente como texto de su mensaje (por favor, +realice las sustituciones apropiadas como indican los marcadores <>): + + fics_addplayer "" + +(donde "edir" es su direccion electronica). +Aqui hay un ejemplo que registraria a Sparky con su nombre y direccion +electronica correctas: + + Ej: fics_addplayer Sparky "Chris L. Petroff" chris@onenet.net + o: fics_addplayer Sparky "Chris L. Petroff" chris@onenet.net human + + +NOTAS: + +(1) El nombre completo TIENE que estar entre comillas ("). + +(2) Si se trata de una cuenta personal, no es necesario especificar 'human'. + Sin embargo, ES OBLIGATORIO usar 'computer' si se esta registrando un + computador en FICS (ver el archivo de ayuda "computers"). + +(3) NO incluya los marcadores <> en su texto. Arriba se utilizaron solo para + indicar donde debe colocar informacion. + +(4) Por favor diganos si usted es un FM (Fide Master), IM (International + Master) o un GM (Grand Master). + +Vea tambien: computers + +[Ultima modificacion: junio 23, 1995 -- Friar + Version en espanhol: julio 3, 1995 -- Spike] + diff --git a/data/admin/accounts b/data/admin/accounts new file mode 100644 index 0000000..fdb6b08 --- /dev/null +++ b/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/data/admin/addaccounts b/data/admin/addaccounts new file mode 100644 index 0000000..80e3011 --- /dev/null +++ b/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/data/admin/addcomment b/data/admin/addcomment new file mode 100644 index 0000000..faadf3f --- /dev/null +++ b/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/data/admin/addplayer b/data/admin/addplayer new file mode 100644 index 0000000..6b162fb --- /dev/null +++ b/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/data/admin/adjrequests b/data/admin/adjrequests new file mode 120000 index 0000000..fd8211e --- /dev/null +++ b/data/admin/adjrequests @@ -0,0 +1 @@ +../stats/player_data/a/adjudicate.messages \ No newline at end of file diff --git a/data/admin/adjud_info b/data/admin/adjud_info new file mode 100644 index 0000000..de68878 --- /dev/null +++ b/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/data/admin/adjudicate b/data/admin/adjudicate new file mode 100644 index 0000000..57d399c --- /dev/null +++ b/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/data/admin/admin b/data/admin/admin new file mode 100644 index 0000000..c4ff054 --- /dev/null +++ b/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/data/admin/admin_commands b/data/admin/admin_commands new file mode 100644 index 0000000..852a19a --- /dev/null +++ b/data/admin/admin_commands @@ -0,0 +1,39 @@ +addcomment +addplayer +adjudicate +ahelp +admin +anews +announce +annunreg +asetv +asetadmin +asetblitz +asetemail +asethandle +asetlight +asetpasswd +asetrealname +asetstd +asetwild +chkip +chkgame +chkpl +chksc +chkts +cmuzzle +cnewsi +cnewsf +canewsi +canewsf +muzzle +nuke +pose +asetmaxplayers +quota +raisedead +remplayer +rerank +showcomment +shutdown +summon diff --git a/data/admin/admin_hierarchy b/data/admin/admin_hierarchy new file mode 100644 index 0000000..bbcd9ce --- /dev/null +++ b/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/data/admin/ahelp b/data/admin/ahelp new file mode 100644 index 0000000..1dbc9db --- /dev/null +++ b/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/data/admin/amotd b/data/admin/amotd new file mode 120000 index 0000000..6354afd --- /dev/null +++ b/data/admin/amotd @@ -0,0 +1 @@ +../messages/admotd \ No newline at end of file diff --git a/data/admin/anews b/data/admin/anews new file mode 100644 index 0000000..08bf7bb --- /dev/null +++ b/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/data/admin/announce b/data/admin/announce new file mode 100644 index 0000000..dd9fa75 --- /dev/null +++ b/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/data/admin/annunreg b/data/admin/annunreg new file mode 100644 index 0000000..d468b45 --- /dev/null +++ b/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/data/admin/asetadmin b/data/admin/asetadmin new file mode 100644 index 0000000..f199b16 --- /dev/null +++ b/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/data/admin/asetblitz b/data/admin/asetblitz new file mode 100644 index 0000000..e1112a8 --- /dev/null +++ b/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/data/admin/asetemail b/data/admin/asetemail new file mode 100644 index 0000000..c1e5800 --- /dev/null +++ b/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/data/admin/asethandle b/data/admin/asethandle new file mode 100644 index 0000000..cfb324a --- /dev/null +++ b/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/data/admin/asetmaxplayer b/data/admin/asetmaxplayer new file mode 100644 index 0000000..97f795f --- /dev/null +++ b/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/data/admin/asetpasswd b/data/admin/asetpasswd new file mode 100644 index 0000000..7485e16 --- /dev/null +++ b/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/data/admin/asetrealname b/data/admin/asetrealname new file mode 100644 index 0000000..10aa74c --- /dev/null +++ b/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/data/admin/asetstd b/data/admin/asetstd new file mode 100644 index 0000000..2fa3080 --- /dev/null +++ b/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/data/admin/asetv b/data/admin/asetv new file mode 100644 index 0000000..b341068 --- /dev/null +++ b/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/data/admin/asetwild b/data/admin/asetwild new file mode 100644 index 0000000..daf28a7 --- /dev/null +++ b/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/data/admin/ban b/data/admin/ban new file mode 100644 index 0000000..819407f --- /dev/null +++ b/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/data/admin/bug b/data/admin/bug new file mode 120000 index 0000000..371482d --- /dev/null +++ b/data/admin/bug @@ -0,0 +1 @@ +../stats/player_data/b/bug.messages \ No newline at end of file diff --git a/data/admin/buglist b/data/admin/buglist new file mode 100644 index 0000000..fa2acd0 --- /dev/null +++ b/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/data/admin/canewsf b/data/admin/canewsf new file mode 100644 index 0000000..00dfe4b --- /dev/null +++ b/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/data/admin/canewsi b/data/admin/canewsi new file mode 100644 index 0000000..1d2a963 --- /dev/null +++ b/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/data/admin/chkgame b/data/admin/chkgame new file mode 100644 index 0000000..9dc2bb6 --- /dev/null +++ b/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/data/admin/chkip b/data/admin/chkip new file mode 100644 index 0000000..093c7c1 --- /dev/null +++ b/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/data/admin/chkpl b/data/admin/chkpl new file mode 100644 index 0000000..d524cdc --- /dev/null +++ b/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/data/admin/chksc b/data/admin/chksc new file mode 100644 index 0000000..5bdc052 --- /dev/null +++ b/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/data/admin/chkts b/data/admin/chkts new file mode 100644 index 0000000..ae91d22 --- /dev/null +++ b/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/data/admin/cmuzzle b/data/admin/cmuzzle new file mode 100644 index 0000000..fed8131 --- /dev/null +++ b/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/data/admin/cnewsf b/data/admin/cnewsf new file mode 100644 index 0000000..54487b7 --- /dev/null +++ b/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. + +See ahelp: cnewsi +See help: news + +[Last modified: August 20, 1995 -- Friar] + diff --git a/data/admin/cnewsi b/data/admin/cnewsi new file mode 100644 index 0000000..5d7dad2 --- /dev/null +++ b/data/admin/cnewsi @@ -0,0 +1,18 @@ + +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. This command replaced the 'createnews' command. + +See ahelp: cnewsf +See help: news + +[Last modified: August 20, 1995 -- Friar] + diff --git a/data/admin/computerlist b/data/admin/computerlist new file mode 120000 index 0000000..c740eee --- /dev/null +++ b/data/admin/computerlist @@ -0,0 +1 @@ +../stats/player_data/c/computerlist.messages \ No newline at end of file diff --git a/data/admin/createanews b/data/admin/createanews new file mode 100644 index 0000000..0f279de --- /dev/null +++ b/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/data/admin/events b/data/admin/events new file mode 120000 index 0000000..fc63fcc --- /dev/null +++ b/data/admin/events @@ -0,0 +1 @@ +../stats/player_data/e/event.messages \ No newline at end of file diff --git a/data/admin/filter b/data/admin/filter new file mode 100644 index 0000000..833d7a0 --- /dev/null +++ b/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/data/admin/filtered b/data/admin/filtered new file mode 120000 index 0000000..db27444 --- /dev/null +++ b/data/admin/filtered @@ -0,0 +1 @@ +../stats/player_data/f/filter.messages \ No newline at end of file diff --git a/data/admin/finger b/data/admin/finger new file mode 100644 index 0000000..78f0d1e --- /dev/null +++ b/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/data/admin/helpfiles b/data/admin/helpfiles new file mode 120000 index 0000000..79c42d1 --- /dev/null +++ b/data/admin/helpfiles @@ -0,0 +1 @@ +../stats/player_data/h/helpfiles.messages \ No newline at end of file diff --git a/data/admin/lists b/data/admin/lists new file mode 100644 index 0000000..30e57f1 --- /dev/null +++ b/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/data/admin/multiaccounts b/data/admin/multiaccounts new file mode 120000 index 0000000..35652cd --- /dev/null +++ b/data/admin/multiaccounts @@ -0,0 +1 @@ +../stats/player_data/m/multiaccounts.messages \ No newline at end of file diff --git a/data/admin/muzzle b/data/admin/muzzle new file mode 100644 index 0000000..fe59bec --- /dev/null +++ b/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/data/admin/nuke b/data/admin/nuke new file mode 100644 index 0000000..f51fe2e --- /dev/null +++ b/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/data/admin/pose b/data/admin/pose new file mode 100644 index 0000000..1ac9b8a --- /dev/null +++ b/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/data/admin/projects b/data/admin/projects new file mode 100644 index 0000000..967a0df --- /dev/null +++ b/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/data/admin/quota b/data/admin/quota new file mode 100644 index 0000000..cbf847d --- /dev/null +++ b/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/data/admin/raisedead b/data/admin/raisedead new file mode 100644 index 0000000..6274371 --- /dev/null +++ b/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/data/admin/register b/data/admin/register new file mode 100644 index 0000000..bd90ec7 --- /dev/null +++ b/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/data/admin/remplayer b/data/admin/remplayer new file mode 100644 index 0000000..0356697 --- /dev/null +++ b/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/data/admin/rerank b/data/admin/rerank new file mode 100644 index 0000000..0b4ea93 --- /dev/null +++ b/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/data/admin/server_com b/data/admin/server_com new file mode 100644 index 0000000..f923473 --- /dev/null +++ b/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/data/admin/showcomment b/data/admin/showcomment new file mode 100644 index 0000000..2572caa --- /dev/null +++ b/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/data/admin/shutdown b/data/admin/shutdown new file mode 100644 index 0000000..a68a8e5 --- /dev/null +++ b/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/data/admin/suggestion b/data/admin/suggestion new file mode 120000 index 0000000..20848f1 --- /dev/null +++ b/data/admin/suggestion @@ -0,0 +1 @@ +../stats/player_data/s/suggestion.messages \ No newline at end of file diff --git a/data/admin/summon b/data/admin/summon new file mode 100644 index 0000000..4845e33 --- /dev/null +++ b/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/data/admin/vacation b/data/admin/vacation new file mode 120000 index 0000000..2295210 --- /dev/null +++ b/data/admin/vacation @@ -0,0 +1 @@ +../stats/player_data/v/vacation.messages \ No newline at end of file diff --git a/data/boards/chessercizes/deflection-79 b/data/boards/chessercizes/deflection-79 new file mode 100644 index 0000000..cf0acfa --- /dev/null +++ b/data/boards/chessercizes/deflection-79 @@ -0,0 +1,2 @@ +W: Kg1 Qc2 Rc8 Bg2 Ne4 Pa6 d4 g3 +B: Kh7 Qf5 Rb4 Re7 Pg7 h6 diff --git a/data/boards/chessercizes/discovery-70 b/data/boards/chessercizes/discovery-70 new file mode 100644 index 0000000..8350d88 --- /dev/null +++ b/data/boards/chessercizes/discovery-70 @@ -0,0 +1,2 @@ +B: Kc8 Qc7 Rd8 Re8 Bd7 Ne5 Nh4 Pa7 b6 +W: Ke1 Qb3 Rb1 Rg1 Bc1 Bf1 N32 Pa3 d3 f6 f5 g4 h2 diff --git a/data/boards/chessercizes/discovery-71 b/data/boards/chessercizes/discovery-71 new file mode 100644 index 0000000..4cba62e --- /dev/null +++ b/data/boards/chessercizes/discovery-71 @@ -0,0 +1,2 @@ +W: Kf3 Rd1 Re6 Ne4 Pa4 f6 f4 +B: Kf8 Re2 Rh2 Ne8 Pa5 c5 g6 diff --git a/data/boards/chessercizes/double-threat-49 b/data/boards/chessercizes/double-threat-49 new file mode 100644 index 0000000..0bbd592 --- /dev/null +++ b/data/boards/chessercizes/double-threat-49 @@ -0,0 +1,2 @@ +B: Kg4 Rf6 Be4 Pb6 g2 +W: Kg1 Re1 Ba5 Pa4 b5 c3 diff --git a/data/boards/chessercizes/fork-48 b/data/boards/chessercizes/fork-48 new file mode 100644 index 0000000..6d62e2d --- /dev/null +++ b/data/boards/chessercizes/fork-48 @@ -0,0 +1,2 @@ +W: Kg1 Qc7 Rc1 Re1 Pa2 b3 f2 g3 h2 +B: Ke8 Qd7 Rf8 Bb7 Be7 Pa6 d6 g6 h7 diff --git a/data/boards/chessercizes/fork-50 b/data/boards/chessercizes/fork-50 new file mode 100644 index 0000000..1c3dd74 --- /dev/null +++ b/data/boards/chessercizes/fork-50 @@ -0,0 +1,2 @@ +B: Ke7 Rh3 Bd4 Pa5 e6 f7 g6 +W: Kf4 Rc8 Bb5 Pa4 e5 diff --git a/data/boards/chessercizes/mating-attack-15 b/data/boards/chessercizes/mating-attack-15 new file mode 100644 index 0000000..a179341 --- /dev/null +++ b/data/boards/chessercizes/mating-attack-15 @@ -0,0 +1,2 @@ +W: Kf3 Rd8 Rh8 Bg4 Pa4 e3 g5 +B: Kg6 Rc7 Rf7 Bb4 Pa7 b6 f4 g7 diff --git a/data/boards/chessercizes/mating-attack-16 b/data/boards/chessercizes/mating-attack-16 new file mode 100644 index 0000000..39f9bcb --- /dev/null +++ b/data/boards/chessercizes/mating-attack-16 @@ -0,0 +1,2 @@ +W: Ka1 Rd1 Rf1 Nc3 Ne4 Pa3 b2 d5 g4 +B: Ke5 Rb8 Rb3 Be7 Na5 Pa6 c4 g6 diff --git a/data/boards/chessercizes/mating-attack-17 b/data/boards/chessercizes/mating-attack-17 new file mode 100644 index 0000000..1d66d5b --- /dev/null +++ b/data/boards/chessercizes/mating-attack-17 @@ -0,0 +1,2 @@ +W: Kb1 Qb4 Rf1 Bh4 Nc5 Pa2 b2 c2 e5 g4 h3 +B: Ke8 Qh6 Ra8 Be6 Nb6 Pa4 c7 c6 d5 g7 h7 diff --git a/data/boards/chessercizes/mating-attack-18 b/data/boards/chessercizes/mating-attack-18 new file mode 100644 index 0000000..a556d9c --- /dev/null +++ b/data/boards/chessercizes/mating-attack-18 @@ -0,0 +1,2 @@ +W: Kg1 Qf4 Rb1 Bc5 Pd4 e6 f3 g4 h2 +B: Kc4 Qd5 Rc8 Bb7 Pc7 c3 diff --git a/data/boards/chessercizes/mating-attack-19 b/data/boards/chessercizes/mating-attack-19 new file mode 100644 index 0000000..8354677 --- /dev/null +++ b/data/boards/chessercizes/mating-attack-19 @@ -0,0 +1,2 @@ +B Kg6 Qf1 Pa5 d5 e6 h6 +W: Kg4 Rc3 Be5 Nc5 Pf3 g3 diff --git a/data/boards/chessercizes/mating-net-01 b/data/boards/chessercizes/mating-net-01 new file mode 100644 index 0000000..8bca3b2 --- /dev/null +++ b/data/boards/chessercizes/mating-net-01 @@ -0,0 +1,2 @@ +B: Kh8 Qg5 Rd8 Rh7 Ne2 Nh4 Pa6 b7 d6 e5 f4 +W: Kh2 Qc1 Rc3 Rg1 Bh1 Nf2 Pa5 b4 d5 e4 f3 h3 diff --git a/data/boards/chessercizes/mating-net-02 b/data/boards/chessercizes/mating-net-02 new file mode 100644 index 0000000..82324c6 --- /dev/null +++ b/data/boards/chessercizes/mating-net-02 @@ -0,0 +1,2 @@ +W: Kb1 Qd8 Rd1 Pb3 e4 f3 g4 h4 +B: Kg7 Qe3 Rc4 Nf6 Pa5 b4 e5 g6 h7 diff --git a/data/boards/chessercizes/mating-net-03 b/data/boards/chessercizes/mating-net-03 new file mode 100644 index 0000000..6ffa41b --- /dev/null +++ b/data/boards/chessercizes/mating-net-03 @@ -0,0 +1,2 @@ +B: Kd8 Qd2 Ra8 Rb8 Nf6 Pa5 c7 c5 d6 e5 f7 g7 h7 +W: Kg1 Qc6 Ra1 Rf1 Ba4 Pa3 b2 c4 d5 e4 f4 g2 h4 diff --git a/data/boards/chessercizes/mating-net-04 b/data/boards/chessercizes/mating-net-04 new file mode 100644 index 0000000..0d75e44 --- /dev/null +++ b/data/boards/chessercizes/mating-net-04 @@ -0,0 +1,2 @@ +B: Kh7 Qc1 Re2 Ng4 Pc6 e6 f7 g6 h5 +W: Kg3 Qa7 Rc3 Bg1 Pa2 b4 c2 e4 h4 diff --git a/data/boards/chessercizes/mating-net-05 b/data/boards/chessercizes/mating-net-05 new file mode 100644 index 0000000..22ebbee --- /dev/null +++ b/data/boards/chessercizes/mating-net-05 @@ -0,0 +1,2 @@ +B: Kg8 Qd4 Be3 Nd2 Pa7 b7 e7 g6 h7 +W: Kg3 Qb5 Ra1 Nc3 Pa2 e4 g4 g2 h4 diff --git a/data/boards/chessercizes/overload-75 b/data/boards/chessercizes/overload-75 new file mode 100644 index 0000000..5f3c3a4 --- /dev/null +++ b/data/boards/chessercizes/overload-75 @@ -0,0 +1,2 @@ +W: Kc1 Qe5 Rg6 Be6 Nc3 Pa3 b2 e3 f2 h4 +B: Kf8 Qe7 Rh8 Rh5 Na6 Pa7 b6 c6 diff --git a/data/boards/chessercizes/pin-60 b/data/boards/chessercizes/pin-60 new file mode 100644 index 0000000..8678d87 --- /dev/null +++ b/data/boards/chessercizes/pin-60 @@ -0,0 +1,2 @@ +W: Kg1 Qh7 Rh1 Bd4 Pa2 d5 e4 f2 g2 +B: Kf7 Qa6 Rf8 Bc4 Bg7 Pa7 b7 f6 g6 diff --git a/data/boards/chessercizes/pin-62 b/data/boards/chessercizes/pin-62 new file mode 100644 index 0000000..8a50585 --- /dev/null +++ b/data/boards/chessercizes/pin-62 @@ -0,0 +1,2 @@ +W: Kg1 Qc7 Rd1 Bc5 Bh3 Pb6 e4 f2 g3 h2 +B: Kg8 Qa6 Rb8 Rd8 Bd3 Pa5 e5 f6 g7 h7 diff --git a/data/boards/chessercizes/pin-overload-61 b/data/boards/chessercizes/pin-overload-61 new file mode 100644 index 0000000..01e42a1 --- /dev/null +++ b/data/boards/chessercizes/pin-overload-61 @@ -0,0 +1,2 @@ +W: Kg1 Rc1 Re1 Bf4 Nd5 Ne5 Pd4 f2 g2 h2 +B: Kd8 Ra8 Re8 Bb3 Be7 Nd6 Pa6 b7 c7 f7 g7 h7 diff --git a/data/boards/chessercizes/promotion-96 b/data/boards/chessercizes/promotion-96 new file mode 100644 index 0000000..8a86e2d --- /dev/null +++ b/data/boards/chessercizes/promotion-96 @@ -0,0 +1,2 @@ +W: Kh1 Rb1 Ba5 Bg2 Ne4 Pd3 d5 g3 h2 +B: Kg8 Re8 Bg7 Nc8 Nd4 Pe5 f5 g6 h7 diff --git a/data/boards/chessercizes/remove-guard-76 b/data/boards/chessercizes/remove-guard-76 new file mode 100644 index 0000000..d85c001 --- /dev/null +++ b/data/boards/chessercizes/remove-guard-76 @@ -0,0 +1,2 @@ +W: Kg1 Qf3 Ra1 Rb5 Bb2 Bc4 Pa2 b3 e2 f2 g3 h2 +B: Kg8 Qe7 Rc6 Rd8 Bc5 Na6 Pa7 b7 f7 g6 h7 diff --git a/data/boards/chessercizes/shut-off-90 b/data/boards/chessercizes/shut-off-90 new file mode 100644 index 0000000..e6eba17 --- /dev/null +++ b/data/boards/chessercizes/shut-off-90 @@ -0,0 +1,2 @@ +W: Ke3 Be6 Pa2 d7 f6 g4 h2 +B: Kf8 Rd6 Pa6 b6 g6 h6 diff --git a/data/boards/chessercizes/simplification-89 b/data/boards/chessercizes/simplification-89 new file mode 100644 index 0000000..445ed5b --- /dev/null +++ b/data/boards/chessercizes/simplification-89 @@ -0,0 +1,2 @@ +W: Kh1 Qd8 Rd1 Pd7 e4 g2 h3 +B: Kh7 Qf4 Be5 Ph6 diff --git a/data/boards/chessercizes/skewer-69 b/data/boards/chessercizes/skewer-69 new file mode 100644 index 0000000..f4e9a83 --- /dev/null +++ b/data/boards/chessercizes/skewer-69 @@ -0,0 +1,2 @@ +W: Kg4 Rh3 Nb6 Pa2 b4 c5 e6 f5 +B: Ke8 Rc7 Nd5 Pa6 b5 c6 f6 g5 diff --git a/data/boards/material-odds/knight b/data/boards/material-odds/knight new file mode 100644 index 0000000..edd030a --- /dev/null +++ b/data/boards/material-odds/knight @@ -0,0 +1,2 @@ +W: P a2 b2 c2 d2 e2 f2 g2 h2 R a1 h1 N g1 B c1 f1 Q d1 K e1 +B: P a7 b7 c7 d7 e7 f7 g7 h7 R a8 h8 N b8 g8 B c8 f8 Q d8 K e8 diff --git a/data/boards/material-odds/knight-and-move b/data/boards/material-odds/knight-and-move new file mode 100644 index 0000000..82b044b --- /dev/null +++ b/data/boards/material-odds/knight-and-move @@ -0,0 +1,2 @@ +W: P a2 b2 c2 d2 e2 f2 g2 h2 R a1 h1 N b1 g1 B c1 f1 Q d1 K e1 +B: P a7 b7 c7 d7 e7 f7 g7 h7 R a8 h8 N g8 B c8 f8 Q d8 K e8 diff --git a/data/boards/material-odds/pawn b/data/boards/material-odds/pawn new file mode 100644 index 0000000..87a0cd8 --- /dev/null +++ b/data/boards/material-odds/pawn @@ -0,0 +1,2 @@ +W: P a2 b2 c2 d2 e2 g2 h2 R a1 h1 N b1 g1 B c1 f1 Q d1 K e1 +B: P a7 b7 c7 d7 e7 f7 g7 h7 R a8 h8 N b8 g8 B c8 f8 Q d8 K e8 diff --git a/data/boards/material-odds/pawn-and-move b/data/boards/material-odds/pawn-and-move new file mode 100644 index 0000000..87d3899 --- /dev/null +++ b/data/boards/material-odds/pawn-and-move @@ -0,0 +1,2 @@ +W: P a2 b2 c2 d2 e2 f2 g2 h2 R a1 h1 N b1 g1 B c1 f1 Q d1 K e1 +B: P a7 b7 c7 d7 e7 g7 h7 R a8 h8 N b8 g8 B c8 f8 Q d8 K e8 diff --git a/data/boards/material-odds/queen b/data/boards/material-odds/queen new file mode 100644 index 0000000..db477c6 --- /dev/null +++ b/data/boards/material-odds/queen @@ -0,0 +1,2 @@ +W: P a2 b2 c2 d2 e2 f2 g2 h2 R a1 h1 N b1 g1 B c1 f1 K e1 +B: P a7 b7 c7 d7 e7 f7 g7 h7 R a8 h8 N b8 g8 B c8 f8 Q d8 K e8 diff --git a/data/boards/material-odds/queen-and-move b/data/boards/material-odds/queen-and-move new file mode 100644 index 0000000..9addeeb --- /dev/null +++ b/data/boards/material-odds/queen-and-move @@ -0,0 +1,2 @@ +W: P a2 b2 c2 d2 e2 f2 g2 h2 R a1 h1 N b1 g1 B c1 f1 Q d1 K e1 +B: P a7 b7 c7 d7 e7 f7 g7 h7 R a8 h8 N b8 g8 B c8 f8 K e8 diff --git a/data/boards/material-odds/rook b/data/boards/material-odds/rook new file mode 100644 index 0000000..a7f6684 --- /dev/null +++ b/data/boards/material-odds/rook @@ -0,0 +1,2 @@ +W: P a2 b2 c2 d2 e2 f2 g2 h2 R h1 N b1 g1 B c1 f1 Q d1 K e1 +B: P a7 b7 c7 d7 e7 f7 g7 h7 R a8 h8 N b8 g8 B c8 f8 Q d8 K e8 diff --git a/data/boards/material-odds/rook-and-move b/data/boards/material-odds/rook-and-move new file mode 100644 index 0000000..9f2c3c1 --- /dev/null +++ b/data/boards/material-odds/rook-and-move @@ -0,0 +1,2 @@ +W: P a2 b2 c2 d2 e2 f2 g2 h2 R a1 h1 N b1 g1 B c1 f1 Q d1 K e1 +B: P a7 b7 c7 d7 e7 f7 g7 h7 R h8 N b8 g8 B c8 f8 Q d8 K e8 diff --git a/data/boards/misc/little-game b/data/boards/misc/little-game new file mode 100644 index 0000000..354cbe4 --- /dev/null +++ b/data/boards/misc/little-game @@ -0,0 +1,3 @@ +# This is Wild7 on ICC. +W: P a2 b2 c2 K d1 +B: P f7 g7 h7 K e8 diff --git a/data/boards/openings/double-d-pawn b/data/boards/openings/double-d-pawn new file mode 100644 index 0000000..dcf3feb --- /dev/null +++ b/data/boards/openings/double-d-pawn @@ -0,0 +1,2 @@ +W: P a2 b2 c2 d4 e2 f2 g2 h2 R a1 h1 N b1 g1 B c1 f1 Q d1 K e1 +B: P a7 b7 c7 d5 e7 f7 g7 h7 R a8 h8 N b8 g8 B c8 f8 Q d8 K e8 diff --git a/data/boards/openings/double-e-pawn b/data/boards/openings/double-e-pawn new file mode 100644 index 0000000..974fd07 --- /dev/null +++ b/data/boards/openings/double-e-pawn @@ -0,0 +1,3 @@ +W: P a2 b2 c2 d2 e4 f2 g2 h2 R a1 h1 N b1 g1 B c1 f1 Q d1 K e1 +B: P a7 b7 c7 d7 e5 f7 g7 h7 R a8 h8 N b8 g8 B c8 f8 Q d8 K e8 + diff --git a/data/boards/openings/giouco-piano b/data/boards/openings/giouco-piano new file mode 100644 index 0000000..bff23a3 --- /dev/null +++ b/data/boards/openings/giouco-piano @@ -0,0 +1,2 @@ +B: P a7 b7 c7 d7 e5 f7 g7 h7 R a8 h8 N c6 g8 B c8 f8 Q d8 K e8 +W: P a2 b2 c2 d2 e4 f2 g2 h2 R a1 h1 N b1 f3 B c1 c4 Q d1 K e1 diff --git a/data/boards/openings/kings-gambita b/data/boards/openings/kings-gambita new file mode 100644 index 0000000..a399579 --- /dev/null +++ b/data/boards/openings/kings-gambita @@ -0,0 +1,2 @@ +W: P a2 b2 c2 d2 e4 g2 h2 R a1 h1 N b1 g1 B c1 f1 Q d1 K e1 +B: P a7 b7 c7 d7 f4 f7 g7 h7 R a8 h8 N b8 g8 B c8 f8 Q d8 K e8 diff --git a/data/boards/openings/kings-gambita-be7 b/data/boards/openings/kings-gambita-be7 new file mode 100644 index 0000000..eb5472f --- /dev/null +++ b/data/boards/openings/kings-gambita-be7 @@ -0,0 +1,2 @@ +W: P a2 b2 c2 d2 e4 g2 h2 R a1 h1 N b1 f3 B c1 f1 Q d1 K e1 +B: P a7 b7 c7 d7 f4 f7 g7 h7 R a8 h8 N b8 g8 B c8 e7 Q d8 K e8 diff --git a/data/boards/openings/kings-gambita-fischer b/data/boards/openings/kings-gambita-fischer new file mode 100644 index 0000000..d1369d8 --- /dev/null +++ b/data/boards/openings/kings-gambita-fischer @@ -0,0 +1,2 @@ +W: P a2 b2 c2 d2 e4 g2 h2 R a1 h1 N b1 f3 B c1 f1 Q d1 K e1 +B: P a7 b7 c7 d6 f4 f7 g7 h7 R a8 h8 N b8 g8 B c8 f8 Q d8 K e8 diff --git a/data/boards/openings/kings-gambita-nc6 b/data/boards/openings/kings-gambita-nc6 new file mode 100644 index 0000000..71f993b --- /dev/null +++ b/data/boards/openings/kings-gambita-nc6 @@ -0,0 +1,2 @@ +W: P a2 b2 c2 d2 e4 g2 h2 R a1 h1 N b1 g1 B c1 f1 Q d1 K e1 +B: P a7 b7 c7 d7 f4 f7 g7 h7 R a8 h8 N c6 g8 B c8 f8 Q d8 K e8 diff --git a/data/boards/openings/kings-gambita-schallop b/data/boards/openings/kings-gambita-schallop new file mode 100644 index 0000000..ef23769 --- /dev/null +++ b/data/boards/openings/kings-gambita-schallop @@ -0,0 +1,2 @@ +W: P a2 b2 c2 d2 e4 g2 h2 R a1 h1 N b1 f3 B c1 f1 Q d1 K e1 +B: P a7 b7 c7 d7 f4 f7 g7 h7 R a8 h8 N b8 f6 B c8 f8 Q d8 K e8 diff --git a/data/boards/openings/kings-gambitd-bc5 b/data/boards/openings/kings-gambitd-bc5 new file mode 100644 index 0000000..412e79b --- /dev/null +++ b/data/boards/openings/kings-gambitd-bc5 @@ -0,0 +1,2 @@ +W: P a2 b2 c2 d2 e4 f4 g2 h2 R a1 h1 N b1 g1 B c1 f1 Q d1 K e1 +B: P a7 b7 c7 d7 e5 f7 g7 h7 R a8 h8 N b8 g8 B c8 c5 Q d8 K e8 diff --git a/data/boards/openings/kings-gambitd-d6 b/data/boards/openings/kings-gambitd-d6 new file mode 100644 index 0000000..7c8c948 --- /dev/null +++ b/data/boards/openings/kings-gambitd-d6 @@ -0,0 +1,2 @@ +W: P a2 b2 c2 d2 e4 f4 g2 h2 R a1 h1 N b1 g1 B c1 f1 Q d1 K e1 +B: P a7 b7 c7 d6 e5 f7 g7 h7 R a8 h8 N b8 g8 B c8 f8 Q d8 K e8 diff --git a/data/boards/openings/kings-gambitd-falkbeer b/data/boards/openings/kings-gambitd-falkbeer new file mode 100644 index 0000000..e5b73e0 --- /dev/null +++ b/data/boards/openings/kings-gambitd-falkbeer @@ -0,0 +1,2 @@ +W: P a2 b2 c2 d2 e4 f4 g2 h2 R a1 h1 N b1 g1 B c1 f1 Q d1 K e1 +B: P a7 b7 c7 d5 e5 f7 g7 h7 R a8 h8 N b8 g8 B c8 f8 Q d8 K e8 diff --git a/data/boards/openings/kings-gambitd-nf6 b/data/boards/openings/kings-gambitd-nf6 new file mode 100644 index 0000000..dd0f49e --- /dev/null +++ b/data/boards/openings/kings-gambitd-nf6 @@ -0,0 +1,2 @@ +W: P a2 b2 c2 d2 e4 f4 g2 h2 R a1 h1 N b1 g1 B c1 f1 Q d1 K e1 +B: P a7 b7 c7 d7 e5 f7 g7 h7 R a8 h8 N b8 f6 B c8 f8 Q d8 K e8 diff --git a/data/boards/openings/kings-gambitd-nimzo b/data/boards/openings/kings-gambitd-nimzo new file mode 100644 index 0000000..32503c3 --- /dev/null +++ b/data/boards/openings/kings-gambitd-nimzo @@ -0,0 +1,2 @@ +W: P a2 b2 c2 d2 d5 f4 g2 h2 R a1 h1 N b1 g1 B c1 f1 Q d1 K e1 +B: P a7 b7 c6 e5 f7 g7 h7 R a8 h8 N b8 g8 B c8 f8 Q d8 K e8 diff --git a/data/boards/openings/ruy-lopez b/data/boards/openings/ruy-lopez new file mode 100644 index 0000000..09ea391 --- /dev/null +++ b/data/boards/openings/ruy-lopez @@ -0,0 +1,3 @@ +W: P a2 b2 c2 d2 e4 f2 g2 h2 R a1 h1 N b1 f3 B c1 b5 Q d1 K e1 +B: P a6 b7 c7 d7 e5 f7 g7 h7 R a8 h8 N c6 g8 B c8 f8 Q d8 K e8 + diff --git a/data/boards/pawns/pawns-only b/data/boards/pawns/pawns-only new file mode 100644 index 0000000..7e1b8f7 --- /dev/null +++ b/data/boards/pawns/pawns-only @@ -0,0 +1,5 @@ +# Game with pawns only... +# Whichever color is listed first is on move +W: P a2 b2 c2 d2 e2 f2 g2 h2 K e1 +B: P a7 b7 c7 d7 e7 f7 g7 h7 K e8 + diff --git a/data/boards/standard/standard b/data/boards/standard/standard new file mode 100644 index 0000000..2c88ec8 --- /dev/null +++ b/data/boards/standard/standard @@ -0,0 +1,5 @@ +# This is the standard game +# Whichever color is listed first is on move +W: P a2 b2 c2 d2 e2 f2 g2 h2 R a1 h1 N b1 g1 B c1 f1 Q d1 K e1 +B: P a7 b7 c7 d7 e7 f7 g7 h7 R a8 h8 N b8 g8 B c8 f8 Q d8 K e8 + diff --git a/data/boards/std.board b/data/boards/std.board new file mode 100644 index 0000000..b03543b --- /dev/null +++ b/data/boards/std.board @@ -0,0 +1,2 @@ +W: P a2 b2 c2 d2 e2 f2 g2 h2 R a1 h1 N b1 g1 B c1 f1 Q d1 K e1 +B: P a7 b7 c7 d7 e7 f7 g7 h7 R a8 h8 N b8 g8 B c8 f8 Q d8 K e8 diff --git a/data/boards/test/bugpos b/data/boards/test/bugpos new file mode 100644 index 0000000..fe30582 --- /dev/null +++ b/data/boards/test/bugpos @@ -0,0 +1,2 @@ +B: Pa7 b6 e6 g5 Rh7 Kh6 Qe2 +W: P a3 b4 f2 g2 h3 Rd1 d4 Qf8 h8 Kg1 diff --git a/data/boards/wild/0 b/data/boards/wild/0 new file mode 100644 index 0000000..ef13177 --- /dev/null +++ b/data/boards/wild/0 @@ -0,0 +1,3 @@ +W: P a2 b2 c2 d2 e2 f2 g2 h2 R a1 h1 N b1 g1 B c1 f1 Q d1 K e1 +B: P a7 b7 c7 d7 e7 f7 g7 h7 R a8 h8 N b8 g8 B c8 f8 Q e8 K d8 + diff --git a/data/boards/wild/1 b/data/boards/wild/1 new file mode 100644 index 0000000..c793b6e --- /dev/null +++ b/data/boards/wild/1 @@ -0,0 +1,2 @@ +W: P a2 b2 c2 d2 e2 f2 g2 h2 R a1 N b1 c1 Q d1 K e1 B f1 g1 R h1 +B: P a7 b7 c7 d7 e7 f7 g7 h7 R a8 B b8 N c8 K d8 Q e8 N f8 B g8 R h8 diff --git a/data/boards/wild/2 b/data/boards/wild/2 new file mode 100644 index 0000000..4de2d42 --- /dev/null +++ b/data/boards/wild/2 @@ -0,0 +1,2 @@ +W: P a2 b2 c2 d2 e2 f2 g2 h2 Q a1 R b1 N c1 K d1 B e1 N f1 R g1 B h1 +B: P a7 b7 c7 d7 e7 f7 g7 h7 Q a8 R b8 N c8 K d8 B e8 N f8 R g8 B h8 diff --git a/data/boards/wild/3 b/data/boards/wild/3 new file mode 100644 index 0000000..7ab607e --- /dev/null +++ b/data/boards/wild/3 @@ -0,0 +1,2 @@ +W: P a2 b2 c2 d2 e2 f2 g2 h2 N a1 B b1 R c1 K d1 Q e1 N f1 B g1 R h1 +B: P a7 b7 c7 d7 e7 f7 g7 h7 N a8 B b8 R c8 K d8 Q e8 N f8 B g8 R h8 diff --git a/data/boards/wild/4 b/data/boards/wild/4 new file mode 100644 index 0000000..c36860e --- /dev/null +++ b/data/boards/wild/4 @@ -0,0 +1,2 @@ +W: P a2 b2 c2 d2 e2 f2 g2 h2 N a1 B b1 R c1 K d1 Q e1 N f1 B g1 R h1 +B: P a7 b7 c7 d7 e7 f7 g7 h7 B a8 N b8 c8 R d8 K e8 Q f8 R g8 B h8 diff --git a/data/boards/wild/5 b/data/boards/wild/5 new file mode 100644 index 0000000..0eb7c2f --- /dev/null +++ b/data/boards/wild/5 @@ -0,0 +1,3 @@ +W: P a7 b7 c7 d7 e7 f7 g7 h7 R a8 h8 N b8 g8 B c8 f8 Q e8 K d8 +B: P a2 b2 c2 d2 e2 f2 g2 h2 R a1 h1 N b1 g1 B c1 f1 Q e1 K d1 + diff --git a/data/boards/wild/8 b/data/boards/wild/8 new file mode 100644 index 0000000..3e3e25d --- /dev/null +++ b/data/boards/wild/8 @@ -0,0 +1,3 @@ +W: P a4 b4 c4 d4 e4 f4 g4 h4 R a1 h1 N b1 g1 B c1 f1 Q d1 K e1 +B: P a5 b5 c5 d5 e5 f5 g5 h5 R a8 h8 N b8 g8 B c8 f8 Q d8 K e8 + diff --git a/data/boards/wild/bughouse b/data/boards/wild/bughouse new file mode 120000 index 0000000..79685e8 --- /dev/null +++ b/data/boards/wild/bughouse @@ -0,0 +1 @@ +../standard/standard \ No newline at end of file diff --git a/data/book/changes.txt b/data/book/changes.txt new file mode 100644 index 0000000..3314120 --- /dev/null +++ b/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/data/book/eco000.idx b/data/book/eco000.idx new file mode 100644 index 0000000..9cfbbea --- /dev/null +++ b/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/data/book/eco999.idx b/data/book/eco999.idx new file mode 100644 index 0000000..9cfbbea --- /dev/null +++ b/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/data/book/fen.doc b/data/book/fen.doc new file mode 100644 index 0000000..da5570c --- /dev/null +++ b/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/data/book/long001.idx b/data/book/long001.idx new file mode 100644 index 0000000..a370e2e --- /dev/null +++ b/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/data/book/long999.idx b/data/book/long999.idx new file mode 100644 index 0000000..a370e2e --- /dev/null +++ b/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/data/book/nic000.idx b/data/book/nic000.idx new file mode 100644 index 0000000..b0cee3c --- /dev/null +++ b/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/data/book/nic999.idx b/data/book/nic999.idx new file mode 100644 index 0000000..b0cee3c --- /dev/null +++ b/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/data/book/opening.doc b/data/book/opening.doc new file mode 100644 index 0000000..c49e43e --- /dev/null +++ b/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/data/com_help/abort b/data/com_help/abort new file mode 120000 index 0000000..419dc6c --- /dev/null +++ b/data/com_help/abort @@ -0,0 +1 @@ +../help/abort \ No newline at end of file diff --git a/data/com_help/accept b/data/com_help/accept new file mode 120000 index 0000000..b922d38 --- /dev/null +++ b/data/com_help/accept @@ -0,0 +1 @@ +../help/accept \ No newline at end of file diff --git a/data/com_help/adjourn b/data/com_help/adjourn new file mode 120000 index 0000000..2bb6109 --- /dev/null +++ b/data/com_help/adjourn @@ -0,0 +1 @@ +../help/adjourn \ No newline at end of file diff --git a/data/com_help/alias b/data/com_help/alias new file mode 120000 index 0000000..19e472c --- /dev/null +++ b/data/com_help/alias @@ -0,0 +1 @@ +../help/alias \ No newline at end of file diff --git a/data/com_help/allobservers b/data/com_help/allobservers new file mode 120000 index 0000000..1577122 --- /dev/null +++ b/data/com_help/allobservers @@ -0,0 +1 @@ +../help/allobservers \ No newline at end of file diff --git a/data/com_help/assess b/data/com_help/assess new file mode 120000 index 0000000..abe4665 --- /dev/null +++ b/data/com_help/assess @@ -0,0 +1 @@ +../help/assess \ No newline at end of file diff --git a/data/com_help/bell b/data/com_help/bell new file mode 120000 index 0000000..9acd4b7 --- /dev/null +++ b/data/com_help/bell @@ -0,0 +1 @@ +../help/bell \ No newline at end of file diff --git a/data/com_help/best b/data/com_help/best new file mode 120000 index 0000000..78299da --- /dev/null +++ b/data/com_help/best @@ -0,0 +1 @@ +../help/best \ No newline at end of file diff --git a/data/com_help/boards b/data/com_help/boards new file mode 120000 index 0000000..2337fd0 --- /dev/null +++ b/data/com_help/boards @@ -0,0 +1 @@ +../help/boards \ No newline at end of file diff --git a/data/com_help/busy b/data/com_help/busy new file mode 120000 index 0000000..a474d54 --- /dev/null +++ b/data/com_help/busy @@ -0,0 +1 @@ +../help/busy \ No newline at end of file diff --git a/data/com_help/censor b/data/com_help/censor new file mode 120000 index 0000000..daca166 --- /dev/null +++ b/data/com_help/censor @@ -0,0 +1 @@ +../help/censor \ No newline at end of file diff --git a/data/com_help/channel b/data/com_help/channel new file mode 120000 index 0000000..5bca623 --- /dev/null +++ b/data/com_help/channel @@ -0,0 +1 @@ +../help/channel \ No newline at end of file diff --git a/data/com_help/clearmessages b/data/com_help/clearmessages new file mode 120000 index 0000000..166a6d7 --- /dev/null +++ b/data/com_help/clearmessages @@ -0,0 +1 @@ +../help/clearmessages \ No newline at end of file diff --git a/data/com_help/commands b/data/com_help/commands new file mode 120000 index 0000000..fc097e2 --- /dev/null +++ b/data/com_help/commands @@ -0,0 +1 @@ +../help/commands \ No newline at end of file diff --git a/data/com_help/courtesyabort b/data/com_help/courtesyabort new file mode 120000 index 0000000..9c9976f --- /dev/null +++ b/data/com_help/courtesyabort @@ -0,0 +1 @@ +../help/courtesyabort \ No newline at end of file diff --git a/data/com_help/cshout b/data/com_help/cshout new file mode 120000 index 0000000..427b50c --- /dev/null +++ b/data/com_help/cshout @@ -0,0 +1 @@ +../help/cshout \ No newline at end of file diff --git a/data/com_help/date b/data/com_help/date new file mode 120000 index 0000000..9fab2e9 --- /dev/null +++ b/data/com_help/date @@ -0,0 +1 @@ +../help/date \ No newline at end of file diff --git a/data/com_help/decline b/data/com_help/decline new file mode 120000 index 0000000..9584f79 --- /dev/null +++ b/data/com_help/decline @@ -0,0 +1 @@ +../help/decline \ No newline at end of file diff --git a/data/com_help/draw b/data/com_help/draw new file mode 120000 index 0000000..c86823d --- /dev/null +++ b/data/com_help/draw @@ -0,0 +1 @@ +../help/draw \ No newline at end of file diff --git a/data/com_help/finger b/data/com_help/finger new file mode 120000 index 0000000..7976350 --- /dev/null +++ b/data/com_help/finger @@ -0,0 +1 @@ +../help/finger \ No newline at end of file diff --git a/data/com_help/flag b/data/com_help/flag new file mode 120000 index 0000000..9a26c0e --- /dev/null +++ b/data/com_help/flag @@ -0,0 +1 @@ +../help/flag \ No newline at end of file diff --git a/data/com_help/games b/data/com_help/games new file mode 120000 index 0000000..3019726 --- /dev/null +++ b/data/com_help/games @@ -0,0 +1 @@ +../help/games \ No newline at end of file diff --git a/data/com_help/hbest b/data/com_help/hbest new file mode 120000 index 0000000..acdbbac --- /dev/null +++ b/data/com_help/hbest @@ -0,0 +1 @@ +../help/hbest \ No newline at end of file diff --git a/data/com_help/help b/data/com_help/help new file mode 120000 index 0000000..69c6155 --- /dev/null +++ b/data/com_help/help @@ -0,0 +1 @@ +../help/help \ No newline at end of file diff --git a/data/com_help/highlight b/data/com_help/highlight new file mode 120000 index 0000000..d174a11 --- /dev/null +++ b/data/com_help/highlight @@ -0,0 +1 @@ +../help/highlight \ No newline at end of file diff --git a/data/com_help/history b/data/com_help/history new file mode 120000 index 0000000..cffe0ac --- /dev/null +++ b/data/com_help/history @@ -0,0 +1 @@ +../help/history \ No newline at end of file diff --git a/data/com_help/hrank b/data/com_help/hrank new file mode 120000 index 0000000..f4f39f0 --- /dev/null +++ b/data/com_help/hrank @@ -0,0 +1 @@ +../help/hrank \ No newline at end of file diff --git a/data/com_help/inchannel b/data/com_help/inchannel new file mode 120000 index 0000000..1634f94 --- /dev/null +++ b/data/com_help/inchannel @@ -0,0 +1 @@ +../help/inchannel \ No newline at end of file diff --git a/data/com_help/it b/data/com_help/it new file mode 120000 index 0000000..ec40ca0 --- /dev/null +++ b/data/com_help/it @@ -0,0 +1 @@ +../help/it \ No newline at end of file diff --git a/data/com_help/kibitz b/data/com_help/kibitz new file mode 120000 index 0000000..3b0dd41 --- /dev/null +++ b/data/com_help/kibitz @@ -0,0 +1 @@ +../help/kibitz \ No newline at end of file diff --git a/data/com_help/llogons b/data/com_help/llogons new file mode 120000 index 0000000..a1e080e --- /dev/null +++ b/data/com_help/llogons @@ -0,0 +1 @@ +../help/llogons \ No newline at end of file diff --git a/data/com_help/load b/data/com_help/load new file mode 120000 index 0000000..73acbd3 --- /dev/null +++ b/data/com_help/load @@ -0,0 +1 @@ +../help/load \ No newline at end of file diff --git a/data/com_help/logons b/data/com_help/logons new file mode 120000 index 0000000..fc18830 --- /dev/null +++ b/data/com_help/logons @@ -0,0 +1 @@ +../help/logons \ No newline at end of file diff --git a/data/com_help/logout b/data/com_help/logout new file mode 120000 index 0000000..a327338 --- /dev/null +++ b/data/com_help/logout @@ -0,0 +1 @@ +../messages/logout \ No newline at end of file diff --git a/data/com_help/mailhelp b/data/com_help/mailhelp new file mode 120000 index 0000000..c9d51d4 --- /dev/null +++ b/data/com_help/mailhelp @@ -0,0 +1 @@ +../help/mailhelp \ No newline at end of file diff --git a/data/com_help/mailmess b/data/com_help/mailmess new file mode 120000 index 0000000..8355169 --- /dev/null +++ b/data/com_help/mailmess @@ -0,0 +1 @@ +../help/mailmess \ No newline at end of file diff --git a/data/com_help/mailmoves b/data/com_help/mailmoves new file mode 120000 index 0000000..95b20a5 --- /dev/null +++ b/data/com_help/mailmoves @@ -0,0 +1 @@ +../help/mailmoves \ No newline at end of file diff --git a/data/com_help/mailoldmoves b/data/com_help/mailoldmoves new file mode 120000 index 0000000..5e270d8 --- /dev/null +++ b/data/com_help/mailoldmoves @@ -0,0 +1 @@ +../help/mailoldmoves \ No newline at end of file diff --git a/data/com_help/mailsource b/data/com_help/mailsource new file mode 120000 index 0000000..afae9cf --- /dev/null +++ b/data/com_help/mailsource @@ -0,0 +1 @@ +../help/mailsource \ No newline at end of file diff --git a/data/com_help/makelinks.sh b/data/com_help/makelinks.sh new file mode 100755 index 0000000..9b20e03 --- /dev/null +++ b/data/com_help/makelinks.sh @@ -0,0 +1,82 @@ +ln -s ../help/abort abort +ln -s ../help/accept accept +ln -s ../help/adjourn adjourn +ln -s ../help/alias alias +ln -s ../help/allobservers allobservers +ln -s ../help/assess assess +ln -s ../help/bell bell +ln -s ../help/best best +ln -s ../help/boards boards +ln -s ../help/busy busy +ln -s ../help/censor censor +ln -s ../help/channel channel +ln -s ../help/clearmessages clearmessages +ln -s ../help/commands commands +ln -s ../help/courtesyabort courtesyabort +ln -s ../help/cshout cshout +ln -s ../help/date date +ln -s ../help/decline decline +ln -s ../help/draw draw +ln -s ../help/finger finger +ln -s ../help/flag flag +ln -s ../help/games games +ln -s ../help/hbest hbest +ln -s ../help/help help +ln -s ../help/highlight highlight +ln -s ../help/history history +ln -s ../help/hrank hrank +ln -s ../help/inchannel inchannel +ln -s ../help/it it +ln -s ../help/kibitz kibitz +ln -s ../help/llogons llogons +ln -s ../help/load load +ln -s ../help/logons logons +ln -s ../help/mailhelp mailhelp +ln -s ../help/mailmess mailmess +ln -s ../help/mailmoves mailmoves +ln -s ../help/mailoldmoves mailoldmoves +ln -s ../help/mailsource mailsource +ln -s ../help/match match +ln -s ../help/messages messages +ln -s ../help/moretime moretime +ln -s ../help/moves moves +ln -s ../help/notify notify +ln -s ../help/observe observe +ln -s ../help/oldmoves oldmoves +ln -s ../help/open open +ln -s ../help/password password +ln -s ../help/pause pause +ln -s ../help/pending pending +ln -s ../help/promote promote +ln -s ../help/quit quit +ln -s ../help/rank rank +ln -s ../help/refresh refresh +ln -s ../help/resign resign +ln -s ../help/say say +ln -s ../help/servers servers +ln -s ../help/set set +ln -s ../help/shout shout +ln -s ../help/simabort simabort +ln -s ../help/simgames simgames +ln -s ../help/simmatch simmatch +ln -s ../help/simnext simnext +ln -s ../help/simopen simopen +ln -s ../help/simpass simpass +ln -s ../help/smoves smoves +ln -s ../help/sposition sposition +ln -s ../help/statistics statistics +ln -s ../help/stored stored +ln -s ../help/style style +ln -s ../help/switch switch +ln -s ../help/takeback takeback +ln -s ../help/tell tell +ln -s ../help/time time +ln -s ../help/unalias unalias +ln -s ../help/uncensor uncensor +ln -s ../help/unpause unpause +ln -s ../help/uptime uptime +ln -s ../help/variables variables +ln -s ../help/whisper whisper +ln -s ../help/who who +ln -s ../help/withdraw withdraw +ln -s ../help/znotify znotify diff --git a/data/com_help/match b/data/com_help/match new file mode 120000 index 0000000..a8e1f21 --- /dev/null +++ b/data/com_help/match @@ -0,0 +1 @@ +../help/match \ No newline at end of file diff --git a/data/com_help/messages b/data/com_help/messages new file mode 120000 index 0000000..8d61813 --- /dev/null +++ b/data/com_help/messages @@ -0,0 +1 @@ +../help/messages \ No newline at end of file diff --git a/data/com_help/moretime b/data/com_help/moretime new file mode 120000 index 0000000..f46ba0a --- /dev/null +++ b/data/com_help/moretime @@ -0,0 +1 @@ +../help/moretime \ No newline at end of file diff --git a/data/com_help/moves b/data/com_help/moves new file mode 120000 index 0000000..dc9dce6 --- /dev/null +++ b/data/com_help/moves @@ -0,0 +1 @@ +../help/moves \ No newline at end of file diff --git a/data/com_help/notify b/data/com_help/notify new file mode 120000 index 0000000..c2c6c66 --- /dev/null +++ b/data/com_help/notify @@ -0,0 +1 @@ +../help/notify \ No newline at end of file diff --git a/data/com_help/observe b/data/com_help/observe new file mode 120000 index 0000000..7e3206f --- /dev/null +++ b/data/com_help/observe @@ -0,0 +1 @@ +../help/observe \ No newline at end of file diff --git a/data/com_help/oldmoves b/data/com_help/oldmoves new file mode 120000 index 0000000..42405e0 --- /dev/null +++ b/data/com_help/oldmoves @@ -0,0 +1 @@ +../help/oldmoves \ No newline at end of file diff --git a/data/com_help/open b/data/com_help/open new file mode 120000 index 0000000..395a31d --- /dev/null +++ b/data/com_help/open @@ -0,0 +1 @@ +../help/open \ No newline at end of file diff --git a/data/com_help/password b/data/com_help/password new file mode 120000 index 0000000..060ccd5 --- /dev/null +++ b/data/com_help/password @@ -0,0 +1 @@ +../help/password \ No newline at end of file diff --git a/data/com_help/pause b/data/com_help/pause new file mode 120000 index 0000000..fd78255 --- /dev/null +++ b/data/com_help/pause @@ -0,0 +1 @@ +../help/pause \ No newline at end of file diff --git a/data/com_help/pending b/data/com_help/pending new file mode 120000 index 0000000..9d8f3d0 --- /dev/null +++ b/data/com_help/pending @@ -0,0 +1 @@ +../help/pending \ No newline at end of file diff --git a/data/com_help/promote b/data/com_help/promote new file mode 120000 index 0000000..f746492 --- /dev/null +++ b/data/com_help/promote @@ -0,0 +1 @@ +../help/promote \ No newline at end of file diff --git a/data/com_help/quit b/data/com_help/quit new file mode 120000 index 0000000..bf49d04 --- /dev/null +++ b/data/com_help/quit @@ -0,0 +1 @@ +../help/quit \ No newline at end of file diff --git a/data/com_help/rank b/data/com_help/rank new file mode 120000 index 0000000..0d61a57 --- /dev/null +++ b/data/com_help/rank @@ -0,0 +1 @@ +../help/rank \ No newline at end of file diff --git a/data/com_help/refresh b/data/com_help/refresh new file mode 120000 index 0000000..b231cfc --- /dev/null +++ b/data/com_help/refresh @@ -0,0 +1 @@ +../help/refresh \ No newline at end of file diff --git a/data/com_help/resign b/data/com_help/resign new file mode 120000 index 0000000..3d2674e --- /dev/null +++ b/data/com_help/resign @@ -0,0 +1 @@ +../help/resign \ No newline at end of file diff --git a/data/com_help/say b/data/com_help/say new file mode 120000 index 0000000..d47cd0f --- /dev/null +++ b/data/com_help/say @@ -0,0 +1 @@ +../help/say \ No newline at end of file diff --git a/data/com_help/servers b/data/com_help/servers new file mode 120000 index 0000000..fa30b11 --- /dev/null +++ b/data/com_help/servers @@ -0,0 +1 @@ +../help/servers \ No newline at end of file diff --git a/data/com_help/set b/data/com_help/set new file mode 120000 index 0000000..dd108c7 --- /dev/null +++ b/data/com_help/set @@ -0,0 +1 @@ +../help/set \ No newline at end of file diff --git a/data/com_help/shout b/data/com_help/shout new file mode 120000 index 0000000..5bc4db4 --- /dev/null +++ b/data/com_help/shout @@ -0,0 +1 @@ +../help/shout \ No newline at end of file diff --git a/data/com_help/simabort b/data/com_help/simabort new file mode 120000 index 0000000..3223ffd --- /dev/null +++ b/data/com_help/simabort @@ -0,0 +1 @@ +../help/simabort \ No newline at end of file diff --git a/data/com_help/simgames b/data/com_help/simgames new file mode 120000 index 0000000..52327ba --- /dev/null +++ b/data/com_help/simgames @@ -0,0 +1 @@ +../help/simgames \ No newline at end of file diff --git a/data/com_help/simmatch b/data/com_help/simmatch new file mode 120000 index 0000000..f2f46e3 --- /dev/null +++ b/data/com_help/simmatch @@ -0,0 +1 @@ +../help/simmatch \ No newline at end of file diff --git a/data/com_help/simnext b/data/com_help/simnext new file mode 120000 index 0000000..d8f84d9 --- /dev/null +++ b/data/com_help/simnext @@ -0,0 +1 @@ +../help/simnext \ No newline at end of file diff --git a/data/com_help/simopen b/data/com_help/simopen new file mode 120000 index 0000000..fcc9357 --- /dev/null +++ b/data/com_help/simopen @@ -0,0 +1 @@ +../help/simopen \ No newline at end of file diff --git a/data/com_help/simpass b/data/com_help/simpass new file mode 120000 index 0000000..9148e5b --- /dev/null +++ b/data/com_help/simpass @@ -0,0 +1 @@ +../help/simpass \ No newline at end of file diff --git a/data/com_help/smoves b/data/com_help/smoves new file mode 120000 index 0000000..be0f30e --- /dev/null +++ b/data/com_help/smoves @@ -0,0 +1 @@ +../help/smoves \ No newline at end of file diff --git a/data/com_help/sposition b/data/com_help/sposition new file mode 120000 index 0000000..6b2db9c --- /dev/null +++ b/data/com_help/sposition @@ -0,0 +1 @@ +../help/sposition \ No newline at end of file diff --git a/data/com_help/statistics b/data/com_help/statistics new file mode 120000 index 0000000..de8d807 --- /dev/null +++ b/data/com_help/statistics @@ -0,0 +1 @@ +../help/statistics \ No newline at end of file diff --git a/data/com_help/stored b/data/com_help/stored new file mode 120000 index 0000000..b6091ae --- /dev/null +++ b/data/com_help/stored @@ -0,0 +1 @@ +../help/stored \ No newline at end of file diff --git a/data/com_help/style b/data/com_help/style new file mode 120000 index 0000000..92485c1 --- /dev/null +++ b/data/com_help/style @@ -0,0 +1 @@ +../help/style \ No newline at end of file diff --git a/data/com_help/switch b/data/com_help/switch new file mode 120000 index 0000000..85ba278 --- /dev/null +++ b/data/com_help/switch @@ -0,0 +1 @@ +../help/switch \ No newline at end of file diff --git a/data/com_help/takeback b/data/com_help/takeback new file mode 120000 index 0000000..9096281 --- /dev/null +++ b/data/com_help/takeback @@ -0,0 +1 @@ +../help/takeback \ No newline at end of file diff --git a/data/com_help/tell b/data/com_help/tell new file mode 120000 index 0000000..b377fe2 --- /dev/null +++ b/data/com_help/tell @@ -0,0 +1 @@ +../help/tell \ No newline at end of file diff --git a/data/com_help/time b/data/com_help/time new file mode 120000 index 0000000..c556b0c --- /dev/null +++ b/data/com_help/time @@ -0,0 +1 @@ +../help/time \ No newline at end of file diff --git a/data/com_help/unalias b/data/com_help/unalias new file mode 120000 index 0000000..696c266 --- /dev/null +++ b/data/com_help/unalias @@ -0,0 +1 @@ +../help/unalias \ No newline at end of file diff --git a/data/com_help/uncensor b/data/com_help/uncensor new file mode 120000 index 0000000..cd87c11 --- /dev/null +++ b/data/com_help/uncensor @@ -0,0 +1 @@ +../help/uncensor \ No newline at end of file diff --git a/data/com_help/unpause b/data/com_help/unpause new file mode 120000 index 0000000..edffaad --- /dev/null +++ b/data/com_help/unpause @@ -0,0 +1 @@ +../help/unpause \ No newline at end of file diff --git a/data/com_help/uptime b/data/com_help/uptime new file mode 120000 index 0000000..dab392a --- /dev/null +++ b/data/com_help/uptime @@ -0,0 +1 @@ +../help/uptime \ No newline at end of file diff --git a/data/com_help/variables b/data/com_help/variables new file mode 120000 index 0000000..92ded41 --- /dev/null +++ b/data/com_help/variables @@ -0,0 +1 @@ +../help/variables \ No newline at end of file diff --git a/data/com_help/whisper b/data/com_help/whisper new file mode 120000 index 0000000..c4aed55 --- /dev/null +++ b/data/com_help/whisper @@ -0,0 +1 @@ +../help/whisper \ No newline at end of file diff --git a/data/com_help/who b/data/com_help/who new file mode 120000 index 0000000..1f1c1fc --- /dev/null +++ b/data/com_help/who @@ -0,0 +1 @@ +../help/who \ No newline at end of file diff --git a/data/com_help/withdraw b/data/com_help/withdraw new file mode 120000 index 0000000..6df84c4 --- /dev/null +++ b/data/com_help/withdraw @@ -0,0 +1 @@ +../help/withdraw \ No newline at end of file diff --git a/data/com_help/znotify b/data/com_help/znotify new file mode 120000 index 0000000..ee591f6 --- /dev/null +++ b/data/com_help/znotify @@ -0,0 +1 @@ +../help/znotify \ No newline at end of file diff --git a/data/commands b/data/commands new file mode 100644 index 0000000..a7e5238 --- /dev/null +++ b/data/commands @@ -0,0 +1,107 @@ +abort +accept +addlist +adjourn +alias +allobservers +assess +backward +bell +best +boards +censor +channel +clearmessages +courtesyabort +cshout +date +decline +draw +examine +finger +flag +flip +forward +games +getpi +goboard +gonum +handles +hbest +help +history +hrank +inchannel +index +info +it +kibitz +limits +llogons +load +logons +mailhelp +mailmess +mailmoves +mailoldmoves +mailsource +mailstored +match +messages +mexamine +moretime +moves +news +next +notify +observe +oldmoves +open +password +pause +pending +promote +qtell +quit +rank +refresh +revert +resign +say +servers +set +shout +showlist +simabort +simallabort +simadjourn +simalladjourn +simgames +simmatch +simnext +simopen +simpass +simprev +smoves +sposition +statistics +stored +style +sublist +switch +takeback +tell +time +unalias +uncensor +unexamine +unnotify +unobserve +unpause +uptime +variables +whisper +who +withdraw +xtell +znotify diff --git a/data/help/_help b/data/help/_help new file mode 100644 index 0000000..90bcf65 --- /dev/null +++ b/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_basics list some basic commands for new users +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 information on your screen + diff --git a/data/help/abort b/data/help/abort new file mode 100644 index 0000000..679c70b --- /dev/null +++ b/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/data/help/abuser b/data/help/abuser new file mode 100644 index 0000000..96545cd --- /dev/null +++ b/data/help/abuser @@ -0,0 +1,31 @@ + +abuser + + The admins maintain a private list of individuals who have abused the chess +server. There are various kinds of abuse that can result in someone being +placed on the abuser list (... or worse). + + Sometimes there is an individual who intentionally disconnects in lost +positions, thus ruining the spirit of competition. 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. + +CONSEQUENCES + + Being on the abuser list has these consequences: (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. + + Other kinds of poor conduct can result in different sanctions. See the +"etiquette" and "shout_abuse" help files for details. + +See Also: adjudication etiquette formula shout_abuse showlist stored +variables + +[Last modified: October 10, 1995 -- Friar] + diff --git a/data/help/accept b/data/help/accept new file mode 100644 index 0000000..ca0eaff --- /dev/null +++ b/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/data/help/addlist b/data/help/addlist new file mode 100644 index 0000000..bbc4be8 --- /dev/null +++ b/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/data/help/addresses b/data/help/addresses new file mode 100644 index 0000000..a228b8d --- /dev/null +++ b/data/help/addresses @@ -0,0 +1,70 @@ + +addresses + + The Internet Chess Servers are services providing you a means for playing +chess with a wide range of players, both human and machine, from around the +world. The following lists give both the server names and telnet IP numbers +for the sites for chess servers. + +Chess servers using a version of FICS +------------------------------------- + +Main sites: + + AICS: ics.onenet.net 5000 (164.58.253.10 5000) Main US server + EICS: eics.daimi.aau.dk 5000 (130.225.18.157 5000) Main EURO server + DICS: dds.dds.nl 5000 (194.109.20.24 5000) Dutch server + BICS: holly.csv.warwick.ac.uk 5000 (137.205.192.12 5000) British server + GICS: chess.unix-ag.uni-kl.de 5000 (131.246.89.3 5000) German server + HEICS: violin.wisdom.weizmann.ac.il 5000 Wild-only server + MICS: wisdom.weizmann.ac.il 5000 (132.76.80.77 5000) Mid-east server + OICS: w0.infosys.tuwien.ac.at (128.130.172.40 5000) Austrian server + SICS: chess.mds.mdh.se 5000 (130.238.251.208 5000) Swedish server +UCHICS: cipres.cec.uchile.cl 5000 (146.83.5.130 5000) Chilean server + ZICS: ics.interdomain.net.au 5000 (203.17.167.4 5000) Australian + +Alternative sites: + + chess.pitt.edu 5000 (136.142.81.40 5000) Pittsburgh, PA, US + rogue.coe.ohio-state.edu 5000 (128.146.144.12 5000) Columbus, OH, US + getnet.com 4000 (204.157.9.29 4000) Phoenix, AZ, US + coot.lcs.mit.edu 5000 (18.52.0.70 5000) Test server only + +Internet Chess Club (commercial chess server): + + chess.lm.com 5000 (192.231.221.16 5000) Pittsburgh, PA, US + + +Other useful locations +---------------------- + +WWW-servers + + URL: http://chess.onenet.net/chess/ + URL: http://titan.enst-bretagne.fr/~wallez/fics.html + +FTP-servers: + + ftp.onenet.net (164.58.253.11) + ftp.math.uni-hamburg.de (134.100.220.2) + ftp.daimi.aau.dk [for timeseal files for use on EICS] + + +Connection information +---------------------- + +To connect to a chess server: + telnet 5000 + +To connect to an anonymous ftp server: + ftp (at LOGIN type: ftp [or anonymous] + at PASSWORD type: your_email_address) + +To connect to a www location: + use your web browser (such as lynx or netscape) and go to the URL address + + +See Also: ftp_hints inetchesslib timeseal + +[Last modified: December 17, 1995 -- Friar] + diff --git a/data/help/adjourn b/data/help/adjourn new file mode 100644 index 0000000..415d3af --- /dev/null +++ b/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/data/help/adjournments b/data/help/adjournments new file mode 100644 index 0000000..bf6ea96 --- /dev/null +++ b/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/data/help/adjudication b/data/help/adjudication new file mode 100644 index 0000000..5fcc33f --- /dev/null +++ b/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/data/help/adm_info b/data/help/adm_info new file mode 100644 index 0000000..954d604 --- /dev/null +++ b/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/data/help/adm_new b/data/help/adm_new new file mode 100644 index 0000000..03bf04a --- /dev/null +++ b/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/data/help/admins b/data/help/admins new file mode 100644 index 0000000..c837220 --- /dev/null +++ b/data/help/admins @@ -0,0 +1,39 @@ + +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: connex cranium Cthulhu DAV foxbat grimm* Hawk + [server code] hersco loon mann Marsalis Ramius Shane Shaughn + sms Sparky + +General admins: Clovis cyee equiLibre Friar Len McKeork + [server help] Rattlesnake river schert Shaughn sms Solid + sveshi Sparky Thanatos TheDane TheViking + +Special admin accounts: adjudicate Bug filter helpfiles RatingsTransfer + Sparkysdrone Suggestion + +* No longer an admin but he deserves his share of the credit. + +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 practical 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: October 1, 1995 -- Friar] + +See Also: adjudication adm_info adm_new + diff --git a/data/help/alias b/data/help/alias new file mode 100644 index 0000000..b10fc0c --- /dev/null +++ b/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/data/help/allobservers b/data/help/allobservers new file mode 100644 index 0000000..469ac3e --- /dev/null +++ b/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/data/help/analysis b/data/help/analysis new file mode 100644 index 0000000..df8ea55 --- /dev/null +++ b/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/data/help/assess b/data/help/assess new file mode 100644 index 0000000..924d981 --- /dev/null +++ b/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/data/help/backward b/data/help/backward new file mode 100644 index 0000000..bcccd55 --- /dev/null +++ b/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/data/help/bell b/data/help/bell new file mode 100644 index 0000000..bb09fa7 --- /dev/null +++ b/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/data/help/best b/data/help/best new file mode 100644 index 0000000..707caea --- /dev/null +++ b/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/data/help/blindfold b/data/help/blindfold new file mode 100644 index 0000000..8fece94 --- /dev/null +++ b/data/help/blindfold @@ -0,0 +1,23 @@ + +blindfold + + Blindfold accounts are special accounts for users who wish to play without +a board. Users playing blindfold chess must use style 9 while playing since +this style displays only the last few moves, not the board position. Since +style 9 does not list the times on the chess clocks, you may wish to use the +"time" command in order to list clock times. + + Users on the "blind" list will have the notation "(B)" displayed behind +their handles on who displays and will have their handles displayed when a +user types "=blind" (to show the contents of the list of players having +blindfold accounts chess). Users who have blindfold accounts must use style 9 +when playing. Not using style 9 to play will be considered abuse and make you +subject to sanctions. + + In order to be included on the blindfold list or to have an additional +account for blindfold chess, please contact an admin. + +See Also: admins lists showlists style who + +[Last modified: October 17, 1995 -- Friar] + diff --git a/data/help/blitz b/data/help/blitz new file mode 100644 index 0000000..6fb9efc --- /dev/null +++ b/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/data/help/boards b/data/help/boards new file mode 100644 index 0000000..a44a2c2 --- /dev/null +++ b/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/data/help/bughouse b/data/help/bughouse new file mode 100644 index 0000000..7ce44e1 --- /dev/null +++ b/data/help/bughouse @@ -0,0 +1,126 @@ +bughouse + + Bughouse (or siamese chess) is a "wild" variant of chess played between two +player teams on two separate boards. The special feature of the game is that +pieces you capture are transferred to your partner, who is playing with the +opposite color pieces from yourself. He may "drop" such a piece on an empty +square as a subsequent move in his game. + + +STARTING A BUGHOUSE MATCH + + First, use the "partner" command to select a partner. Next, find an +opponent team. You may use the Team channel for this purpose (channel 25), +and the command "who B" lists players who are members of a current bughouse +team. + + Then, one of your team challenges his desired opponent on the other team to +a "wild bughouse" match. (A useful alias for this is "alias bug match @ 2 12 +bughouse" where "bug user_name" is all you would need to type in order to +match user_name to a bughouse game.) + + When the match is accepted and all four players are present, then two games +are initiated simultaneously: one between the challenger and the challengee +with the desired colors, and one between the other partners, with colors +opposite from their partners. The same time control applies to both boards, +though "moretime" can be used independently on each board. Each player is +notified of the game number of their partner's game, so he may observe it as +well as playing in his own game. + + To help you form bughouse partnerships and bughouse matches, two channels +have been established: channels 24 and 25. Channel 24 is for matches and +channel 25 is for partnerships. + + +PLAYING BUGHOUSE + + As you play, you will be periodically notified when your partner passes you +captured pieces. You will be told the piece that was passed, and the set of +pieces that you are currently holding. You are also notified when your +opponent's holdings change. Both player's holdings are displayed whenever +your board position is refreshed. + + A new move notation is needed to drop one of your held pieces onto the +board. The notation for making a drop is "P@fr", where P is a piece you are +holding [PNBRQ] and "fr" is the empty destination square. + + You may talk to your partner. It is recommended to set up convenient +aliases for common messages, such as "I need a knight!!", "Don't give him a +bishop!", and "Are you out of your mind?!". The "ptell" command is used for +this purpose; only your partner will hear it. + + The match is finished when one player is checkmated, resigns, or is flagged. +At that point the wild ratings of *all* match players are adjusted, whether or +not the team result was because of their game. A draw request should be made +and accepted at *both* boards before the match is ended as a draw [a near +impossibility]. + + Note that checkmate is defined differently: there must be no *possibility* +of avoiding checkmate by a drop interposition. Even if your opponent is +holding no pieces that he can drop, he may later get a piece to interpose from +his partner. Thus, only contact and knight checks can give a "decisive" +checkmate. + + +RESTRICTIONS + + Pawns cannot be dropped onto your first or eighth rank, although they may be +dropped onto the seventh rank and promoted on the next move. + + Pieces that had been promoted revert to pawns when captured and passed to +your partner. + + Your partner variable is not saved between logins. You should set it prior +to starting your first bughouse match in a server session and when you want to +change partners. + + Observers should observe both games to see the full match. Kibitzes and +whispers, however, go to observers (and players) of *both* games. Observers +will also be notified of pieces transferred to each player's reserves. (Note +that kibitz can be used as a shortcut to tell your partner something if you +don't mind your opponents hearing it. It also makes the game more exciting +for the observers.) + + Strength assessment takes held pieces into account. + + This mode of play may break client interfaces. Contact the author of your +client to determine if you can play bughouse with it. If a client relies on +the board position rather than moves, things should work OK. No new styles +have been added to support bughouse. + + Because this is such a nonstandard type of play, there are a number of +commands that are not applicable to a bughouse game: + + 1. The move record is not saved. Adjournments and disconnections end both +games and the match cannot be resumed. (This leaves a lot of room for abuse, +but hey, bughouse is just for fun, guys!) Disabled commands are: adjourn, +sposition, mailstored, examine, mexamine, unexamine, backward, forward, +revert. + + 2. Simul commands cannot be used for bughouse games. [FDA regulation to +avoid frying the brains of the participants. :) ] + + 3. Takeback is disabled (for now). At best, takeback would work only on non- + +capture moves (including drops) to avoid having to take held pieces away from +the other game. + + 4. Switch is disabled (for now). + + 5. Moves, oldmoves, mailmoves and mailoldmoves do work during a game, but +they now break the PGN format, which doesn't allow drops. Moves are shown as +"P/@@-fr" and "P@fr" in the old and PGN formats. Only moves and drops are +recorded, not changes to a player's holdings. Theoretically, knowing the +duration of each move in both games allows you to reconstruct the holdings as +well. (But who'd want to analyze or store a bughouse game??) + + 6. Except for commands which terminate a game, commands affect only one of +the two games in a bughouse match. + + For notes on strategy in bughouse chess, see the "bughouse_strat" help file. + + +See Also: bughouse_strat match partner ptell set variables wild + +[Last Modified: December 17, 1995 -- Friar] + diff --git a/data/help/bughouse_not b/data/help/bughouse_not new file mode 100644 index 0000000..d90ade7 --- /dev/null +++ b/data/help/bughouse_not @@ -0,0 +1,5 @@ + +Bughouse chess is currently being tested. Thank you for your patience. + +[Last modified: November 26, 1995 -- Friar] + diff --git a/data/help/bughouse_strat b/data/help/bughouse_strat new file mode 100644 index 0000000..7d2ce24 --- /dev/null +++ b/data/help/bughouse_strat @@ -0,0 +1,214 @@ + +BUGHOUSE STRATEGY + + Bughouse games are extremely dynamic. The position never simplifies since +captured pieces are constantly being recycled. Draws are unheard of. Many of +the strategies used in the japanese form of chess, shogi, apply: + + 1. King safety is paramount, so don't leave weak squares next to your king. +This applies in particular to KB2. Diagonal weaknesses are prey to dropped +pieces. + + 2. Contact checks and knight checks are best, so your opponent cannot drop a +piece to interpose. This makes the knight a very powerful piece, often worth +more than a rook. + + 3. Drop pawns near the back rank, so they can promote quickly. Pawns are +quite useful for dropping in, to attack and to defend. It is illegal, +however, to drop pawns directly on the first or last rank. + + 4. Always keep some pieces held in reserve, rather than dropping them in for +no reason. "A knight in the hand is worth two on the board." + + 5. Be on the lookout for sacrifices to create weakness. The game ending +combination often starts with a blitz of sacrifice drops to lure the king out +of hiding, and ends with a mating net. + +Bughouse chess is known by many names and has many of its own "special" terms +and strategies, just as regular chess does. Before attempting to play +bughouse, you should attempt to learn a fair bit of both. Just like real +chess, it is better to learn through study than by experience! + +Terminology +----------- + +Please note that some of this may not be especially common in real life, but +is used quite often here on FICS. + +Inject: Placing pieces into your opponents position on squares that cause him +or her untold discomfort; used as "You got injected!" + +Noodle/Spoon: Traditional FICS bughouse battle cries; one partner shouts +"spooooon!!" and his partner replies "nooooooooodle" + +Themed: Placing two pawns side by side on the seventh rank and promoting them; +used as "I themed you!" + +Rock: Used to express confidence in the defensive resources of your position; +used as "I'm rock here" + +Parachute, DoubleBlitz, Doublespeed, Siamese, Chok, Tjak, Choke chess: all +synonyms for bughouse chess in various parts of the world. + +Annoy: attempting to bother your opponent by projected a painful stream of +babble across his or her screen; as in "I'm being annoyified!" + +The above should at least ensure that you aren't completely confused when you +start bughouse and your opponents start kibitzing at you. Now we move on to +general strategy, followed by opening theory. + +Advanced Strategy +----------------- + + The above tips will get you started. Here are some advanced tips on +bughouse strategy. + +Holes: + + AVOID leaving any holes in your position. In real chess, it may take a while +for your opponent to maneuver a good piece to occupy a hole. In bughouse, any +hole can be occupied immediately. This rule basically makes fianchettoing out +of the question for either side, as fianchettos can be easily occupied with +pawns. For example after 1.e4 g6 2.d4 Nf6 white can place a pawn on h6 +already, followed by another on g7 and then white can start shouting "Inject!" + The main difference regarding holes in bughouse is that you also have to +avoid leaving holes on your SECOND rank. The main effect of this is to +eliminate the Sicilian and Queens Gambit from bughouse, as both openings leave +holes on the c-file. For example, after 1.e4 c5 2. Nc3 Nc6 3. Nb5 a6 white +can place a pawn on c7 and win blacks queen already! This applies to the f- +file as well. A sample game once went 1.d4 Nf6 2.Bg5 Ne4 3.h4 d5 4.f3?? and +black placed a pawn on f2 with mate! + Reinfeld said it best: in bughouse, never move any pawns except the e and d +pawns. (Well, maybe he didn't say it about bughouse!) + +Initiative: + + This is the key concept of bughouse. A common saying is "As long as he's in +check, I'm winning". Often, new bughouse players are lured by the prospect of +winning material instead of continuing attack. While this may help your +partner in the short run, you and your partner will both be more comfortable +if you are attacking. The best way to attack is through checks that have to +be met with a King move. To accomplish this, checks should either be done +with knights (which cant be blocked) or with "contact" checks (placing a piece +within one square of the king). + Once attacking, communication with your partner becomes crucial. You must +tell him which pieces you need to finish your opponent off, and often, it is a +good idea to warn your partner that you are about to begin sacrificing pieces +to ensure that he is not under attack first. On occasion, your attack leads +to your partner getting mated! + +Teamwork: + + This is one you dont see in real chess. However in bughouse, without +teamwork you will be cooked. Use the FICS command "ptell" to tell your partner +details of your position. Even if you have nothing specific to say, letting +your partner know if you are rock or injected can help him or her make +decisions about what to do. Clock information is also quite good to tell your +partner. This is as a result of another key bughouse technique: the stall. + +The Stall: + + In bughouse, you often need a certain piece to mate with. It is perfectly +acceptable to wait and hope your partner gets it to you. However, stalling +occurs more commonly when you are being mated by force. You realize that if +you move, you are mated in one. Therefore, you simply decide not to move and +let your partner try to win the game. Naturally, for this to work, you must +have more time than your partner's opponent, or he will also refuse to move +and you will flag first. + Another element of stalling is if you know your opponent needs a certain +piece to mate you, and your partner tells you that it will come to your +opponent next move. It is good strategy to tell your partner not to move +until your opponent moves, so that your opponent will be forced to move +without that piece. Again, unless your partner has more time than your +opponent, this will not work, as your partner will flag. + Please note that there is currently a bug in timeseal that affects bughouse: +you cannot flag someone with timeseal until they move, so theoretically, they +can stall forever and not be flagged. "Sealsitting" is unethical and +frustrating. If you have timeseal and are trying to stall, once you are out +of time, the accepted practice is to move or resign. Not doing so will cause +a great deal of ill will. However, it is not currently considered abuse. + +Piece Values: + + Most serious chess players are familiar with the Piece Value Table: Q=9, +R=5, B and N=3, P=1. In bughouse however, the values are completely different. +While there is no general consensus on bughouse values, here is an +approximation. + + Q=10, N=7, R=4, B=2, P=1 + +The knight and queen rule the bughouse chessboard. The queen often can be +placed into a position with mate. The knight is useful as well because it can +check from a distance and not be blocked. Many bughouse mating attacks begin +with a sacrifice on KB7 followed by a knight check. For example, after 1.e4 +e5 2.d4 exd4 3.Nf3 Nc6 4.Bc4 Bc5 5.Bxf7+ Kxf7 6.Ng5+ all white needs is a +queen for f7 and black will get mated. The bishops value is seriously +diminished, as it often performs no better than a pawn, and sometimes not even +as well. The pawns promotion abilities may in some positions be worth +significantly more than a bishop. + +White/Black: + + The general strategy of bughouse is for the partner with white to go for +mate, and the partner with black to try to hold it together. Black attempts +to exchange pieces to reduce his opponents attack, while strengthening his +partner's. White therefore, attempts to keep pieces on the board to ensure +attacking chances. Often in bughouse, space advantages built on pawns can +reach epic proportions for white, so black would rather have fewer pieces to +try and rearrange in the face of oncoming pawns. + +These rules are obviously meant to be general. However, understanding and +utilizing them will help you play much better bughouse chess! + +Opening Theory: + + Yes, sadly bughouse has some opening theory. However, most of it is very +short, as new pieces appearing on the board begin to mess up opening +plans! Mainly, there are two or three defenses black can try, and white +generally attacks in one or two ways in response. + + White -- White generally positions his pieces to attack the kingside, and +especially the square f7. This may involve Bc4, Ng5, Ne5 or any similar +methods. A common development scheme used is e4, d4, Bc4, Be3, Nf3, Nbd2, +Qe2, known by some as the "Mongolian Attack". Please notice that white does +not castle in this line. In fact, castling is generally bad in bughouse. It +restrains your king to one side of the board, thus restricting it's ability to +escape from enemy pieces. This rule also applies to black. White may also +play for massive central pawn advances, attempting black to either open the +position so that white can attack, or force black to lock the pawn chain in +the center so that white can build a long pawn chain into the center and into +blacks position. This would work best against a fianchetto. For example, 1.e4 +g6 2.d4 Bg7 3.e5 and white attempts to place pawns on f6, g7 and inject black +badly. + + Black -- I have seen several defenses for black. I will list them by the +names I have seen them referred to on FICS, although serious bughouse +players may know them by other names in real life. + + Federkevic defense: 1.e4 e6 2.d4 b6 -- Black attempts to keep his pieces out +of the center, where they may be rolled back by white pawns. He also leaves +the dpawn on d7, where it may support e6, preventing sacrifices. The drawback +is that black may get injected along the queenside light squares. + + Barbeau Counter Attack: 1.e4 e6 2.d4 Qh4 -- Black pressures e4 and attempts +to force white to adopt an awkward development to protect the e4 pawn. For +example, after 2.Nc3, 2...Bb4! exchanges a bishop for a knight. The drawback +is that white often munches blacks queen in the opening. + + Fortress Defense: 1.e4 e6 2.d4 d6 - Black attempts to simply huddle in the +center behind a wall of pieces and pawns. By far the most common bughouse +opening. The drawback is that black will be cramped, but black is always +cramped in bughouse, so this is probably your best bet! + +Conclusion +---------- + + Bughouse is much more informal than regular chess and all four players +generally kibitz about both games while they are on. Oftentimes, observers +watch and kibitz along with the games. However, come into channel 24 and see +for yourself. A good way to see some of the principles above put into action +is to ask in channel 24 if anyone is playing, and then watch their games. +Only then will you get a sense of what fun bughouse is! Happy bugging! + +[Strategy written by IanO; Advanced strategy written by dogdog; editted by +Friar -- December 17, 1995] diff --git a/data/help/busy b/data/help/busy new file mode 100644 index 0000000..7f5ecd5 --- /dev/null +++ b/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/data/help/censor b/data/help/censor new file mode 100644 index 0000000..af758b0 --- /dev/null +++ b/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/data/help/chan_1 b/data/help/chan_1 new file mode 100644 index 0000000..58de222 --- /dev/null +++ b/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. (Use chan +2 for a discussion 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: + + +chan 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: + + -chan 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 channel_list inchannel intro_talking tell + +[Last modified: December 19, 1995 -- Friar] + diff --git a/data/help/channel b/data/help/channel new file mode 100644 index 0000000..c80e7c9 --- /dev/null +++ b/data/help/channel @@ -0,0 +1,26 @@ + +channel + +Usage: +|-|= channel [#] + + This command refers to your list of channels. When a channel is on your +list, you will receive messages (tells) sent to that channel. Here are the +forms of the command: + + +channel # Add channel # to your channel list + -channel # Remove channel # from your channel list + =channel Display your channel list + + In order too see which channels another user has on his/her list, use the +"inchannel" command. + + Some channels are designated for specific purposes and/or topics. Channel 1 +is the general help channel and of special importance to users. The "chan_1" +help file has more details about the use of channel 1 and gives the general +procedure for using a channel. Other designated channels are listed in the +"channel_list" help file. + +See Also: chan_1 channel_list inchannel say tell + +[Last modified: December 19, 1995 -- Friar] + diff --git a/data/help/channel_list b/data/help/channel_list new file mode 100644 index 0000000..142b31d --- /dev/null +++ b/data/help/channel_list @@ -0,0 +1,41 @@ + +channel_list + + Here is the listing of currently defined channels on the server: + + 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) + 24 Forming Bughouse games 47 Tomato managers + 25 Finding bughouse partners 49 Mamer tournament channel + + 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' + +See Also: chan_1 channel inchannel say tell + +[Last modified: December 17, 1995 -- Friar] + diff --git a/data/help/clearmessages b/data/help/clearmessages new file mode 100644 index 0000000..f05ee24 --- /dev/null +++ b/data/help/clearmessages @@ -0,0 +1,22 @@ + +clearmessages + +Usage: clearmessages [user,#] + + Clears any message(s) previously messaged to you. You can clear all +messages from a user, clear a single message by its number, or clear all +messages. Examples: + + (i) clearmessages Bach --- will clear all messages from user Bach + + (ii) clear 11 --- will clear message # 11 + + (iii) clear --- will clear all messages + +NOTE: If you clear one or more messages, the messages will be renumbered, so +becareful using "clear #" consecutively. + +See Also: messages + +[Last modified: December 17, 1995 -- Friar] + diff --git a/data/help/cls b/data/help/cls new file mode 100644 index 0000000..2ff59e6 --- /dev/null +++ b/data/help/cls @@ -0,0 +1 @@ + diff --git a/data/help/cls_info b/data/help/cls_info new file mode 100644 index 0000000..dca471d --- /dev/null +++ b/data/help/cls_info @@ -0,0 +1,12 @@ + +cls_info + + Typing "help cls" will clear your screen and set the cursor at the top. The +alias for "help cls" is now "cls". This command may be useful if you need to +clear your screen suddenly for some reason (like the boss walking in on you +unexpectedly). Server messages will soon appear again, however. + +See Also: + +[Last modified: November 26, 1995 -- Friar] + diff --git a/data/help/commands b/data/help/commands new file mode 100644 index 0000000..5e8df80 --- /dev/null +++ b/data/help/commands @@ -0,0 +1,20 @@ +abort examine mailmess quit stored +accept finger mailmoves rank style +addlist flag mailoldmoves refresh sublist +adjourn flip mailsource resign switch +alias forward mailstored revert takeback +allobservers games match say tell +assess goboard messages set time +backward gonum mexamine shout unalias +bell handles moretime simabort uncensor +best hbest moves simadjourn unexamine +boards help news simallabort unobserve +censor history next simalladjourn unpause +channel hrank notify simgames uptime +clearmessages inchannel observe simmatch variables +cls_info index oldmoves simnext whisper +cshout it open simopen who +date kibitz password simpass withdraw +decline llogons pause smoves xtell +draw logons pending sposition znotify +eco mailhelp promote statistics diff --git a/data/help/computers b/data/help/computers new file mode 100644 index 0000000..39c5802 --- /dev/null +++ b/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/data/help/convert_bcf b/data/help/convert_bcf new file mode 100644 index 0000000..c067c1a --- /dev/null +++ b/data/help/convert_bcf @@ -0,0 +1,22 @@ + +convert_bcf + +Usage: convert_bcf # + + This command will convert a BCF rating into ELO and USCF ratings. All three +values will be displayed to you. The conversion formulas are: + USCF = ELO + 100 + BCF = (ELO - 600)/8 + + BCF ratings are the official ratings of the British Chess Federation. USCF +ratings are the official ratings of the United States Chess Federation. ELO +ratings often used in international competition. + + Server ratings are, of course, something entirely different. There is no +exact way at present to convert server ratings into equivalent official +ratings. For server rating information, see "rating" and "glicko". + +See Also: convert_elo convert_uscf glicko rating + +[Last modified: October 22, 1995 -- Friar] + diff --git a/data/help/convert_elo b/data/help/convert_elo new file mode 100644 index 0000000..b08168a --- /dev/null +++ b/data/help/convert_elo @@ -0,0 +1,22 @@ + +convert_elo + +Usage: convert_elo # + + This command will convert a ELO rating into BCF and USCF ratings. All three +values will be displayed to you. The conversion formulas are: + USCF = ELO + 100 + BCF = (ELO - 600)/8 + + BCF ratings are the official ratings of the British Chess Federation. USCF +ratings are the official ratings of the United States Chess Federation. ELO +ratings often used in international competition. + + Server ratings are, of course, something entirely different. There is no +exact way at present to convert server ratings into equivalent official +ratings. For server rating information, see "rating" and "glicko". + +See Also: convert_bcf convert_uscf glicko rating + +[Last modified: October 22, 1995 -- Friar] + diff --git a/data/help/convert_uscf b/data/help/convert_uscf new file mode 100644 index 0000000..b393858 --- /dev/null +++ b/data/help/convert_uscf @@ -0,0 +1,22 @@ + +convert_uscf + +Usage: convert_uscf # + + This command will convert a USCF rating into BCF and ELO ratings. All three +values will be displayed to you. The conversion formulas are: + USCF = ELO + 100 + BCF = (ELO - 600)/8 + + BCF ratings are the official ratings of the British Chess Federation. USCF +ratings are the official ratings of the United States Chess Federation. ELO +ratings often used in international competition. + + Server ratings are, of course, something entirely different. There is no +exact way at present to convert server ratings into equivalent official +ratings. For server rating information, see "rating" and "glicko". + +See Also: convert_bcf convert_elo glicko rating + +[Last modified: October 22, 1995 -- Friar] + diff --git a/data/help/courtesyabort b/data/help/courtesyabort new file mode 100644 index 0000000..42b4071 --- /dev/null +++ b/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/data/help/credit b/data/help/credit new file mode 100644 index 0000000..21dfe5b --- /dev/null +++ b/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 much of original ICS and responsible for many + ideas that make this chess server as popular as it is. diff --git a/data/help/cshout b/data/help/cshout new file mode 100644 index 0000000..276db82 --- /dev/null +++ b/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/data/help/date b/data/help/date new file mode 100644 index 0000000..826ff5b --- /dev/null +++ b/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/data/help/decline b/data/help/decline new file mode 100644 index 0000000..82bbd45 --- /dev/null +++ b/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/data/help/draw b/data/help/draw new file mode 100644 index 0000000..0974e0b --- /dev/null +++ b/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/data/help/eco b/data/help/eco new file mode 100644 index 0000000..dd6f37a --- /dev/null +++ b/data/help/eco @@ -0,0 +1,33 @@ + +eco + +Usage: eco [game, name] + + 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. + +SPECIAL NOTES: + +(a) If a game was 'private' (meaning that no one could observe it), the eco +category is not given in the history table. + +See Also: history private + +[Last modified: October 9, 1995 -- Friar] + diff --git a/data/help/eggo b/data/help/eggo new file mode 100644 index 0000000..1e99cc5 --- /dev/null +++ b/data/help/eggo @@ -0,0 +1,139 @@ + +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: October 8, 1995 -- Friar] + diff --git a/data/help/etiquette b/data/help/etiquette new file mode 100644 index 0000000..c0619cc --- /dev/null +++ b/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/data/help/examine b/data/help/examine new file mode 100644 index 0000000..0b6a289 --- /dev/null +++ b/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/data/help/fics_lingo b/data/help/fics_lingo new file mode 100644 index 0000000..5cca039 --- /dev/null +++ b/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/data/help/ficsfaq b/data/help/ficsfaq new file mode 100644 index 0000000..fafb2cd --- /dev/null +++ b/data/help/ficsfaq @@ -0,0 +1,170 @@ + +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 blindfold/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 Sparky or one of the senior programmers. + +9> Who's programming? + See the listing in the "adm_info" help file -- "help adm_info". Or also + read the current listing in the "=programmer" file. + +10> Where else can I play FREE chess? + There are many sites. See the "addresses" help file -- "help addresses". + +11> Where do I get an interface from? + You need to ftp to ics.onenet.net using anonymous ftp, and look for the + pub/chess directory. There are several interefaces based on your + operating system. Read the help files for "interfaces" and "ftp_hints". + +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. + Contact Sparky. + +14> Some ICC admins have come for a peek. What gives? + a) Sometimes people pretend to be them. + b) Do not abuse them if they log on. + c) 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. See the "intro_talking" help + file -- "help intro_talking". + +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? + Simply "match" the player again, and it will resume the game if the + player accepts. Adjourned games are completed with that player before + new ones can begin. + +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 and real + human name. + +34> Stats gives silly information. + We know. + +35> Is there any wild? + Yes ... and rated, too. Read the "wild" help file -- "help wild". + +36> Zippy won't shut up, too many shouts. + Use censor [name]. + +37> How many channels can I be in? + Type "limits" for the current limits. You cannot have unlimited channels + because of the space in the user files. Type "help channel" for + predefined channels. + +39> The "who" listing appears staggered. + Fixed soon. Also, make sure you have the correct "highlight" thaat you + want. + +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. + Or try a version of timeseal. + +42> I suddenly got a Connection closed message. + There are several possibilities: 1) System shutdown. 2) Server crash -- + please bear with us as we add new code. 3) The server dumped you for + some reason -- contact an admin and/or report a bug. 4) You got nuked -- + disconnected by an admin (there should be a message to you in this case). + +43> How long do shutdowns last and why? + About 30 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) Type "+chan 1" + (b) Type "tell 1 help me please!" + (c) Type " tell 1 ". + When you are done, you can type "-chan 1" to 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. + + +See Also: [the various help files] + +[Last modified: December 19, 1995 -- Friar] + diff --git a/data/help/finger b/data/help/finger new file mode 100644 index 0000000..0e06ec7 --- /dev/null +++ b/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/data/help/fixes b/data/help/fixes new file mode 100644 index 0000000..3da06ee --- /dev/null +++ b/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/data/help/flag b/data/help/flag new file mode 100644 index 0000000..b74fd0e --- /dev/null +++ b/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/data/help/flip b/data/help/flip new file mode 100644 index 0000000..eced6c9 --- /dev/null +++ b/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/data/help/formula b/data/help/formula new file mode 100644 index 0000000..815cac4 --- /dev/null +++ b/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/data/help/forward b/data/help/forward new file mode 100644 index 0000000..a363cab --- /dev/null +++ b/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/data/help/ftp_hints b/data/help/ftp_hints new file mode 100644 index 0000000..18d039b --- /dev/null +++ b/data/help/ftp_hints @@ -0,0 +1,121 @@ + +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 (ftp.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 ftp.onenet.net + or ftp 164.58.253.11 + +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 ftp.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 can also type 'ftp'] + +You will then see this message: + + 331 Guest login ok, send your complete e-mail address as password. + Password: + +For your password, type your email address. + +You will now be logged on to the ftp site 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: December 17, 1995 -- Friar] + diff --git a/data/help/games b/data/help/games new file mode 100644 index 0000000..484679f --- /dev/null +++ b/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/data/help/glicko b/data/help/glicko new file mode 100644 index 0000000..d4614b2 --- /dev/null +++ b/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/data/help/gm_game b/data/help/gm_game new file mode 100644 index 0000000..5165593 --- /dev/null +++ b/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/data/help/gnotify b/data/help/gnotify new file mode 100644 index 0000000..58faad3 --- /dev/null +++ b/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/data/help/goboard b/data/help/goboard new file mode 100644 index 0000000..eef5292 --- /dev/null +++ b/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/data/help/gonum b/data/help/gonum new file mode 100644 index 0000000..69fcd4b --- /dev/null +++ b/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/data/help/handle b/data/help/handle new file mode 100644 index 0000000..209fcef --- /dev/null +++ b/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/data/help/handles b/data/help/handles new file mode 100644 index 0000000..f680235 --- /dev/null +++ b/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/data/help/hbest b/data/help/hbest new file mode 100644 index 0000000..20b5e85 --- /dev/null +++ b/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/data/help/help b/data/help/help new file mode 100644 index 0000000..632afe3 --- /dev/null +++ b/data/help/help @@ -0,0 +1,26 @@ + +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, typing "info" will list the +help files for non-commands, and typing "index" will display the general +categories of help files.. + + 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/data/help/highlight b/data/help/highlight new file mode 100644 index 0000000..7f3e8ec --- /dev/null +++ b/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/data/help/history b/data/help/history new file mode 100644 index 0000000..bb8a32c --- /dev/null +++ b/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/data/help/hrank b/data/help/hrank new file mode 100644 index 0000000..9d021f8 --- /dev/null +++ b/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/data/help/inchannel b/data/help/inchannel new file mode 100644 index 0000000..f6a8de4 --- /dev/null +++ b/data/help/inchannel @@ -0,0 +1,15 @@ + +inchannel + +Usage: inchannel name + + This command will list the channels for user 'name' so you can determine +which channels he/she is receiving (namely tells to channels). A user's name +(handle) must be given. Channels with specific purposes for the server are +listed in the "channel_list" help file. To add a channel to your channel +list, type "+chan #". More information is in the "channel" help file. + +See Also: channel channel_list handle lists tell + +[Last modified: December 17, 1995 -- Friar] + diff --git a/data/help/index b/data/help/index new file mode 100644 index 0000000..037647d --- /dev/null +++ b/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/data/help/inetchesslib b/data/help/inetchesslib new file mode 100644 index 0000000..c44c8ca --- /dev/null +++ b/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/data/help/interfaces b/data/help/interfaces new file mode 100644 index 0000000..3175913 --- /dev/null +++ b/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/data/help/intro_basics b/data/help/intro_basics new file mode 100644 index 0000000..ee698ca --- /dev/null +++ b/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/data/help/intro_general b/data/help/intro_general new file mode 100644 index 0000000..ef73393 --- /dev/null +++ b/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/data/help/intro_information b/data/help/intro_information new file mode 100644 index 0000000..c65e5da --- /dev/null +++ b/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/data/help/intro_moving b/data/help/intro_moving new file mode 100644 index 0000000..b156bc8 --- /dev/null +++ b/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/data/help/intro_playing b/data/help/intro_playing new file mode 100644 index 0000000..19af703 --- /dev/null +++ b/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/data/help/intro_settings b/data/help/intro_settings new file mode 100644 index 0000000..f8695ef --- /dev/null +++ b/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/data/help/intro_special b/data/help/intro_special new file mode 100644 index 0000000..cf76043 --- /dev/null +++ b/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/data/help/intro_talking b/data/help/intro_talking new file mode 100644 index 0000000..32e003b --- /dev/null +++ b/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/data/help/intro_welcome b/data/help/intro_welcome new file mode 100644 index 0000000..37ecfba --- /dev/null +++ b/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/data/help/it b/data/help/it new file mode 100644 index 0000000..2f62d00 --- /dev/null +++ b/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/data/help/journal b/data/help/journal new file mode 100644 index 0000000..faf6e9d --- /dev/null +++ b/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/data/help/jsave b/data/help/jsave new file mode 100644 index 0000000..78623ff --- /dev/null +++ b/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/data/help/kibitz b/data/help/kibitz new file mode 100644 index 0000000..3654d69 --- /dev/null +++ b/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/data/help/kiblevel b/data/help/kiblevel new file mode 100644 index 0000000..eb1ec49 --- /dev/null +++ b/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/data/help/lag b/data/help/lag new file mode 100644 index 0000000..cf67996 --- /dev/null +++ b/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/data/help/lecture1 b/data/help/lecture1 new file mode 100644 index 0000000..8d1da85 --- /dev/null +++ b/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/data/help/lightning b/data/help/lightning new file mode 100644 index 0000000..f11dde6 --- /dev/null +++ b/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/data/help/limits b/data/help/limits new file mode 100644 index 0000000..84ad700 --- /dev/null +++ b/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, size of your +journal, and messages you can retain. Also, the minimum number of games you +need in order to be considered active, and the shout quota. + +See Also: [the various commands and features] + +[Last modified: December 17, 1995 -- Friar] + diff --git a/data/help/lists b/data/help/lists new file mode 100644 index 0000000..77a411c --- /dev/null +++ b/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/data/help/llogons b/data/help/llogons new file mode 100644 index 0000000..5d5eeba --- /dev/null +++ b/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/data/help/login b/data/help/login new file mode 120000 index 0000000..8c56b9b --- /dev/null +++ b/data/help/login @@ -0,0 +1 @@ +../messages/login \ No newline at end of file diff --git a/data/help/logons b/data/help/logons new file mode 100644 index 0000000..e96d9a2 --- /dev/null +++ b/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/data/help/logout b/data/help/logout new file mode 120000 index 0000000..a327338 --- /dev/null +++ b/data/help/logout @@ -0,0 +1 @@ +../messages/logout \ No newline at end of file diff --git a/data/help/mailhelp b/data/help/mailhelp new file mode 100644 index 0000000..387de6d --- /dev/null +++ b/data/help/mailhelp @@ -0,0 +1,13 @@ + +mailhelp + +Usage: mailhelp [filename] +LIMITED TO REGISTERED USERS + + Mails a specified helpfile to your e-mail address. If no filename is +specified, a list of available help files is given. + +See Also: register + +[Last modified: October 8, 1995 -- Friar] + diff --git a/data/help/mailmess b/data/help/mailmess new file mode 100644 index 0000000..2966cfd --- /dev/null +++ b/data/help/mailmess @@ -0,0 +1,28 @@ + +mailmess +LIMITED TO REGISTERED USERS + + There are two ways to have your messages mailed to you: (a) all messages +currently stored for you sent as a group, and (b) automatically each time a +message arrives. The first method uses a command; the second method uses a +variable setting. REMINDER: only registered users can have stored messages. + + +STORED MESSAGES + + Use the "mailmess" command to send to you at 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. (You may want to clear unwanted messages first, then mailmes.) + + +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 email address. + +See Also: clearmessages messages register set variables + +[Last modified: October 8, 1995 -- Friar] + diff --git a/data/help/mailmoves b/data/help/mailmoves new file mode 100644 index 0000000..79c506f --- /dev/null +++ b/data/help/mailmoves @@ -0,0 +1,16 @@ + +mailmoves +LIMITED TO REGISTERED USERS + +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: October 8, 1995 -- Friar] + diff --git a/data/help/mailoldmoves b/data/help/mailoldmoves new file mode 100644 index 0000000..f2f8d77 --- /dev/null +++ b/data/help/mailoldmoves @@ -0,0 +1,23 @@ + +mailoldmoves +LIMITED TO REGISTERED USERS + +SPECIAL NOTE: This command has been superceded by an enhanced "mailstored" +command. Please refer to that help file. + +Usage: mailoldmoves [user] + + Mails to you at to your email address the moves of the last game played +by "user" or, if "user" is omitted, of yourself. Here are the two cases: + + mailoldmoves -- mails the moves of the game you last played + mailoldmoves User -- mails the moves of the game last played by User + +NOTE: At present, both players of the game in question must be logged on in +order for the stored game to be access and mailed to you. We hope to expand +the mail feature in the future. + +See Also: mailstored smoves + +[Last modified: October 8, 1995 -- Friar] + diff --git a/data/help/mailsource b/data/help/mailsource new file mode 100644 index 0000000..bfed3d2 --- /dev/null +++ b/data/help/mailsource @@ -0,0 +1,15 @@ + +mailsource + +Usage: mailsource [filename] +LIMITED TO REGISTERED USERS + + Mails a specified sourcecode file to your e-mail address. If no filename is +specified, a list of available filenames is given. This command can only be +used by registered users. For ftp information, see the "sourcecode" help +file. + +See Also: register sourcecode + +[Last modified: November 6, 1995 -- Friar] + diff --git a/data/help/mailstored b/data/help/mailstored new file mode 100644 index 0000000..f66eb96 --- /dev/null +++ b/data/help/mailstored @@ -0,0 +1,23 @@ + +mailstored + +Usage: mailstored player1 {#, player2, journal_slot} +LIMITED TO REGISTERED USERS + + Mails to you at your email address the moves of player1's game, either game +# from player1's "history" table, the "stored" (adjourned) game between +player1 and player2, or the game from the user's journal. + + Examples: + + mailstored Hawk 65 + mailstored Hawk DAV + mailstored Hawk K + + Other useful commands: "examine" helps you review the game; "smoves" +displays the moves; "sposition" displays current game position. + +See Also: examine history journal smoves sposition stored + +[Last modified: December 17, 1995 -- Friar] + diff --git a/data/help/match b/data/help/match new file mode 100644 index 0000000..575fed8 --- /dev/null +++ b/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/data/help/messages b/data/help/messages new file mode 100644 index 0000000..1c19f17 --- /dev/null +++ b/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/data/help/mexamine b/data/help/mexamine new file mode 100644 index 0000000..61d9266 --- /dev/null +++ b/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/data/help/moretime b/data/help/moretime new file mode 100644 index 0000000..96088b0 --- /dev/null +++ b/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/data/help/motd b/data/help/motd new file mode 120000 index 0000000..708b721 --- /dev/null +++ b/data/help/motd @@ -0,0 +1 @@ +../messages/motd \ No newline at end of file diff --git a/data/help/motd_help b/data/help/motd_help new file mode 100644 index 0000000..e59d6e2 --- /dev/null +++ b/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/data/help/moves b/data/help/moves new file mode 100644 index 0000000..7a7d287 --- /dev/null +++ b/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/data/help/newrating b/data/help/newrating new file mode 100644 index 0000000..993742a --- /dev/null +++ b/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/data/help/news b/data/help/news new file mode 100644 index 0000000..0021ad4 --- /dev/null +++ b/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/data/help/newstuff b/data/help/newstuff new file mode 120000 index 0000000..6cfbd41 --- /dev/null +++ b/data/help/newstuff @@ -0,0 +1 @@ +/home/chess/FICS/5001/README.NEW \ No newline at end of file diff --git a/data/help/next b/data/help/next new file mode 100644 index 0000000..ddfeb95 --- /dev/null +++ b/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/data/help/noplay b/data/help/noplay new file mode 100644 index 0000000..9ea0200 --- /dev/null +++ b/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/data/help/notes b/data/help/notes new file mode 100644 index 0000000..808a499 --- /dev/null +++ b/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/data/help/notify b/data/help/notify new file mode 100644 index 0000000..2e68c74 --- /dev/null +++ b/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/data/help/observe b/data/help/observe new file mode 100644 index 0000000..1b952fd --- /dev/null +++ b/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/data/help/oldmoves b/data/help/oldmoves new file mode 100644 index 0000000..dd45a7c --- /dev/null +++ b/data/help/oldmoves @@ -0,0 +1,19 @@ + +oldmoves + +SPECIAL NOTE: This command has been superceded by an enhanced "smoves" +command. Please refer to that help file. + +Usage: oldmoves [user] + + Displays the moves of the most recent game of 'user', or of yourself if +'user' is omitted. + +NOTE: At present, both players of the game in question must be logged on in +order for the stored game to be access and mailed to you. We hope to expand +the mail feature in the future. + +See Also: mailstored smoves + +[Last modified: October 8, 1995 -- Friar] + diff --git a/data/help/open b/data/help/open new file mode 100644 index 0000000..d6460d8 --- /dev/null +++ b/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/data/help/partner b/data/help/partner new file mode 100644 index 0000000..e088b27 --- /dev/null +++ b/data/help/partner @@ -0,0 +1,16 @@ + +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 "who" command (namely by "who B") as being available for +bughouse matches. + +See Also: accept bughouse decline pending who + +[Last modified: December 17, 1995 -- Friar] + diff --git a/data/help/password b/data/help/password new file mode 100644 index 0000000..4832baf --- /dev/null +++ b/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/data/help/pause b/data/help/pause new file mode 100644 index 0000000..f0a50a4 --- /dev/null +++ b/data/help/pause @@ -0,0 +1,19 @@ + +pause + +Usage: pause + + A "pause" request 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". + + You might want to consider using pause rather than adjourn if, for example, +you want to consult with an admin about a problem with the match. + +See Also: accept decline pending unpause + +[Last modified: October 8, 1995 -- Friar] + diff --git a/data/help/pending b/data/help/pending new file mode 100644 index 0000000..59714d6 --- /dev/null +++ b/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/data/help/policy b/data/help/policy new file mode 100644 index 0000000..0e86480 --- /dev/null +++ b/data/help/policy @@ -0,0 +1,8 @@ +FICS Policies + + Of course each local site will have its own set of policies, but in +general: + +1. I can't think of any!! + +See Also: localpolicy diff --git a/data/help/prefresh b/data/help/prefresh new file mode 100644 index 0000000..07867ca --- /dev/null +++ b/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/data/help/private b/data/help/private new file mode 100644 index 0000000..23cb32e --- /dev/null +++ b/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/data/help/promote b/data/help/promote new file mode 100644 index 0000000..84f5f00 --- /dev/null +++ b/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/data/help/ptell b/data/help/ptell new file mode 100644 index 0000000..7e43eb6 --- /dev/null +++ b/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/data/help/quit b/data/help/quit new file mode 100644 index 0000000..e45dd87 --- /dev/null +++ b/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/data/help/rank b/data/help/rank new file mode 100644 index 0000000..cd66335 --- /dev/null +++ b/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/data/help/ratings b/data/help/ratings new file mode 100644 index 0000000..934759f --- /dev/null +++ b/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/data/help/refresh b/data/help/refresh new file mode 100644 index 0000000..e68adeb --- /dev/null +++ b/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/data/help/register b/data/help/register new file mode 100644 index 0000000..c819cf0 --- /dev/null +++ b/data/help/register @@ -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/data/help/register.dist b/data/help/register.dist new file mode 100755 index 0000000..c819cf0 --- /dev/null +++ b/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/data/help/resign b/data/help/resign new file mode 100644 index 0000000..aafe819 --- /dev/null +++ b/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/data/help/revert b/data/help/revert new file mode 100644 index 0000000..e7d16aa --- /dev/null +++ b/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/data/help/say b/data/help/say new file mode 100644 index 0000000..189532e --- /dev/null +++ b/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/data/help/servers b/data/help/servers new file mode 100644 index 0000000..f662832 --- /dev/null +++ b/data/help/servers @@ -0,0 +1,15 @@ + +servers + +Usage: servers + + Lists all servers that are connected to and thus share ratings with the main +ratings server. + + Until this server is connected to other servers, a better way to locate +other chess servers is by typing "help addresses". + +See Also: addresses + +[Last modified: October 16, 1995 -- Friar] + diff --git a/data/help/set b/data/help/set new file mode 100644 index 0000000..ba9dbc1 --- /dev/null +++ b/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/data/help/shout b/data/help/shout new file mode 100644 index 0000000..5d528c9 --- /dev/null +++ b/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/data/help/shout_abuse b/data/help/shout_abuse new file mode 100644 index 0000000..8084536 --- /dev/null +++ b/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 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: + + 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: + + 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 + +[Edits by Friar; last modified October 17, 1995] + diff --git a/data/help/shout_quota b/data/help/shout_quota new file mode 100644 index 0000000..d099645 --- /dev/null +++ b/data/help/shout_quota @@ -0,0 +1,16 @@ + +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. + + 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: October 17, 1995 -- Friar] + diff --git a/data/help/showlist b/data/help/showlist new file mode 100644 index 0000000..45d1dbc --- /dev/null +++ b/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/data/help/simabort b/data/help/simabort new file mode 100644 index 0000000..771edf1 --- /dev/null +++ b/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 "sab". + +See Also: simadjourn simallabort simmatch simpass simuls + +[Last modified: October 16, 1995 -- Friar] + diff --git a/data/help/simadjourn b/data/help/simadjourn new file mode 100644 index 0000000..9a86e57 --- /dev/null +++ b/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/data/help/simallabort b/data/help/simallabort new file mode 100644 index 0000000..c80589a --- /dev/null +++ b/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/data/help/simalladjourn b/data/help/simalladjourn new file mode 100644 index 0000000..27b6188 --- /dev/null +++ b/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/data/help/simgames b/data/help/simgames new file mode 100644 index 0000000..d688553 --- /dev/null +++ b/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/data/help/simmatch b/data/help/simmatch new file mode 100644 index 0000000..0be861d --- /dev/null +++ b/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/data/help/simnext b/data/help/simnext new file mode 100644 index 0000000..c79043b --- /dev/null +++ b/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/data/help/simopen b/data/help/simopen new file mode 100644 index 0000000..74fe214 --- /dev/null +++ b/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/data/help/simpass b/data/help/simpass new file mode 100644 index 0000000..8505e61 --- /dev/null +++ b/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/data/help/simprev b/data/help/simprev new file mode 100644 index 0000000..c0d6c6f --- /dev/null +++ b/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/data/help/simuls b/data/help/simuls new file mode 100644 index 0000000..1f03ed2 --- /dev/null +++ b/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/data/help/smoves b/data/help/smoves new file mode 100644 index 0000000..1dfbff3 --- /dev/null +++ b/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/data/help/soapbox b/data/help/soapbox new file mode 100644 index 0000000..21011d6 --- /dev/null +++ b/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/data/help/sourcecode b/data/help/sourcecode new file mode 100644 index 0000000..25b9f54 --- /dev/null +++ b/data/help/sourcecode @@ -0,0 +1,16 @@ + +sourcecode + + You can get a version of the code via anonymous ftp to 'ftp.onenet.net' in +the directory /pub/chess/Unix. You can also obtain files using the +"mailsource" command. + + We encourage you, the chess server community, to help improve and debug this +server. If you make any changes to the code that you would like to see +incorporated into future releases, please contact one of the senior +programming admins. + +See Also: admins mailsource + +[Last modified: December 15, 1995 -- Sparky] + diff --git a/data/help/sposition b/data/help/sposition new file mode 100644 index 0000000..f6e0dd8 --- /dev/null +++ b/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/data/help/standard b/data/help/standard new file mode 100644 index 0000000..37be1f0 --- /dev/null +++ b/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/data/help/statistics b/data/help/statistics new file mode 100644 index 0000000..d91285e --- /dev/null +++ b/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/data/help/stored b/data/help/stored new file mode 100644 index 0000000..e56dfd0 --- /dev/null +++ b/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/data/help/style b/data/help/style new file mode 100644 index 0000000..2b9263a --- /dev/null +++ b/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/data/help/sublist b/data/help/sublist new file mode 100644 index 0000000..26ef80d --- /dev/null +++ b/data/help/sublist @@ -0,0 +1,16 @@ + +sublist + +Usage: sublist list information + + 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 "-". For example, "sublist notify +Stravinsky" could be typed as "-notify Stravinsky" instead. + +See Also: addlist admins alias showlists + +[Last modified: November 26, 1995 -- Friar] + diff --git a/data/help/switch b/data/help/switch new file mode 100644 index 0000000..fafd0b2 --- /dev/null +++ b/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/data/help/takeback b/data/help/takeback new file mode 100644 index 0000000..8efba19 --- /dev/null +++ b/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/data/help/team b/data/help/team new file mode 100644 index 0000000..619c52c --- /dev/null +++ b/data/help/team @@ -0,0 +1,18 @@ + +team + + It is possible to have a "team" account on the chess server. Team accounts +would be good for groups of players (whether human or computer) to play chess +matches against either individual players or other teams. These accounts are +designed for relatively stable groups of players, in contrast to teams formed +spontaneously for just one match (see "teamgames" help file). Good examples +would be chess clubs at schools or companies. + + If you represent a group of players who would like to form a team for a team +account, contact an admin. The team handle will be added to the "team" list +and will have the "(T)" designation appearing on who lists. + +See Also: admins lists showlists teamgames who + +[Last modified: October 10, 1995 -- Friar] + diff --git a/data/help/teamgames b/data/help/teamgames new file mode 100644 index 0000000..734829f --- /dev/null +++ b/data/help/teamgames @@ -0,0 +1,61 @@ + +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. + + If you have a relatively stable team that wants to have its own handle and +rating, please read the "team" help file for details on these special +accounts. + +See also: channel observe team tell + +[Last modified: October 10, 1995 -- Friar] + diff --git a/data/help/tell b/data/help/tell new file mode 100644 index 0000000..8a229dd --- /dev/null +++ b/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/data/help/time b/data/help/time new file mode 100644 index 0000000..dc6f5c9 --- /dev/null +++ b/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/data/help/timeseal b/data/help/timeseal new file mode 100644 index 0000000..6edbc86 --- /dev/null +++ b/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/data/help/totals b/data/help/totals new file mode 100644 index 0000000..67753e5 --- /dev/null +++ b/data/help/totals @@ -0,0 +1,5 @@ +*** Total players: 10518 +Active in last week: 3109 +Active in last day: 1111 + +Counted at Sat Dec 30 07:00:00 CST 1995 [Updated hourly] diff --git a/data/help/unalias b/data/help/unalias new file mode 100644 index 0000000..8a83db0 --- /dev/null +++ b/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/data/help/unexamine b/data/help/unexamine new file mode 100644 index 0000000..856e24b --- /dev/null +++ b/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/data/help/unobserve b/data/help/unobserve new file mode 100644 index 0000000..78d21dd --- /dev/null +++ b/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/data/help/unpause b/data/help/unpause new file mode 100644 index 0000000..0970f18 --- /dev/null +++ b/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/data/help/untimed b/data/help/untimed new file mode 100644 index 0000000..988e6b5 --- /dev/null +++ b/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/data/help/uptime b/data/help/uptime new file mode 100644 index 0000000..5b772a2 --- /dev/null +++ b/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/data/help/uscf_faq b/data/help/uscf_faq new file mode 100644 index 0000000..9d84bdc --- /dev/null +++ b/data/help/uscf_faq @@ -0,0 +1,223 @@ + +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 in order 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 products 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. :) + + +[Last modified October 22, 1995 by Dogma and Friar] + diff --git a/data/help/variables b/data/help/variables new file mode 100644 index 0000000..75514c8 --- /dev/null +++ b/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/data/help/wcmatch b/data/help/wcmatch new file mode 100644 index 0000000..4e783a8 --- /dev/null +++ b/data/help/wcmatch @@ -0,0 +1,33 @@ + +**** Anand-Kasparov World Championship Match Information: **** + + 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 +Kasparov = = = = = = = = 0 1 1 = 1 1 = = = = 10.5 +Anand = = = = = = = = 1 0 0 = 0 0 = = = = 7.5 + +Kasparov retains title! That's all folks ... ! + + +To review a game in this match, you need to know (a) the special handles on +the server for these two players, (b) how to read "history" correctly for this +match, and (c) how "examine" mode works. + +A. HANDLES -- The special handles for the contenders are "GMAnand" and +"GMKasparov". To read their 'notes' type "finger ". + +B. HISTORY -- To display the list of games of the match, type "history +". Please note that the first game of the match is listed as history +#0, the second game of the match as history #1 and so on. + +C. EXAMINE -- Examine mode loads the game for you so you can replay the moves +and even try subvariations. The "examine" help file has complete details of +the the various things you can do during examine mode. + + +EXAMPLE: Suppose you want to review the 9th game in the match, the game Anand +won. You would type: "examine GMAnand 8" -or- "examine GMKasparov 8". + +If you want the moves of this game emailed to you (and are are registered on +the server), you can type "mailstored GMAnand 8" at any time. + +ENJOY!!! diff --git a/data/help/whenshut b/data/help/whenshut new file mode 100644 index 0000000..9d61d42 --- /dev/null +++ b/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/data/help/whisper b/data/help/whisper new file mode 100644 index 0000000..4b0f896 --- /dev/null +++ b/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/data/help/who b/data/help/who new file mode 100644 index 0000000..dfddcbe --- /dev/null +++ b/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/data/help/wild b/data/help/wild new file mode 100644 index 0000000..1423eca --- /dev/null +++ b/data/help/wild @@ -0,0 +1,55 @@ + +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 0: White has the typical set-up at the start. Black's pieces are the +same, except that the King and Queen are reversed, so they are not on the same +files as White's King and Queen. + +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. + +Style 8: In this variant, the major pieces are in the normal positions but +the pawns are in their forth rank rather than their second rank. + +Bughouse -- Bughouse is a form of partner chess. Please see the special help +files for it. + +See Also: boards bughouse bughouse_strat match + +[Last modified: December 17, 1995 -- Friar] + diff --git a/data/help/withdraw b/data/help/withdraw new file mode 100644 index 0000000..3157d77 --- /dev/null +++ b/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/data/help/xtell b/data/help/xtell new file mode 100644 index 0000000..6cee73e --- /dev/null +++ b/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/data/help/znotify b/data/help/znotify new file mode 100644 index 0000000..c83b8fa --- /dev/null +++ b/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 variables + +[Last modified: October 17, 1995 -- Friar] + diff --git a/data/index/_index b/data/index/_index new file mode 100644 index 0000000..86bcdbb --- /dev/null +++ b/data/index/_index @@ -0,0 +1,23 @@ + +_index + +Type ... In Order To List Commands and Help Files About ... +---------------- -------------------------------------------------- +index all all help files, by categories +index analysis examining chess games or positions +index commands all command help files, by categories +index game_info games on the server +index help basic information and assistance +index mail mailing information and games to youself +index play playing chess matches on the server +index preferences the variables you can set +index server_info the server itself +index simul playing simultaneous matches +index special special features +index talk communicating on the server +index user_info users on the server + +FOR FURTHER ASSISTANCE, read the "chan_1" help file by typing: + + help chan_1 + diff --git a/data/index/all b/data/index/all new file mode 100644 index 0000000..0a23fe1 --- /dev/null +++ b/data/index/all @@ -0,0 +1,79 @@ + +index for ALL items + +These lists explain how helpfiles are organized by index entries. + +analysis commands: + allobservers, backward, examine, flip, forward, mexamine, observe, + refresh, revert, unexamine, unobserve. + +game_info commands: + allobservers, eco, games, mailmoves, mailoldmoves, mailstored, + moves, observe, oldmoves, smoves, sposition, stored, unobserve. + +help commands: + help, index, info, mailhelp, news, quit. + +help information: + fics_lingo, ficsfaq, ftp_hints, handle, intro_basics, intro_general, + intro_information, intro_moving, intro_playing, intro_settings, + intro_special, intro_welcome, login, logout. + +mail commands: + mailhelp, mailmess, mailmoves, mailoldmoves, mailsource, mailstored. + +play commands: + abort, accept, adjourn, assess, boards, decline, draw, flag, flip, + match, moretime, open, noplay, partner, pause, pending, promote, refresh, + resign, switch, takeback, time, unpause, withdraw. + +play information: + abuser, adjournments, adjudication, blindfold, blitz, computers, formula, + glicko, interfaces, intro_moving, intro_playing, lag, lightning, standard, + team, teamgames, timeseal, untimed, variables, wild. + +preferences commands: + addlist, alias, bell, formula, gnotify, highlight, kiblevel, notify, + password, set, style, sublist, unalias, variables. + +preferences information: + intro_settings, showlist. + +server_info commands: + boards, date, help, index, limits, llogons, mailhelp, mailsource, + news, next, servers, showlist, statistics, uptime. + +server information: + addresses, adm_info, adm_new, admins, credit, interfaces, + intro_general, limits, motd, motd_help, newstuff, sourcecode, + totals. + +simul commands: + accept, decline, goboard, gonum, simabort, simadjourn, simallabort, + simalladjourn, simgames, simmatch, simnext, simopen, simpass, + simprev. + +simul information: + simuls. + +special information: + eggo, gm_game, inetchesslib, lecture1, uscf. + +talk commands: + censor, channel, clearmessages, cshout, inchannel, it, kibitz, + mailmess, messages, ptell, say, shout, tell, whisper, xtell. + +talk information: + channel_list, etiquette, limits, shout_abuse, shout_quota, intro_talking. + +user_info commands: + best, convert_bcf, convert_elo, convert_uscf, finger, handles, hbest, + history, hrank, jsave, logons, mailstored, rank, stored, who, znotify. + +user_info information: + formula, handles, journal, notes, ratings, register. + +Type "help TOPIC" in order to read a specific help file. + +[Last modified: December 25, 1995 by Friar] + diff --git a/data/index/analysis b/data/index/analysis new file mode 100644 index 0000000..01795a3 --- /dev/null +++ b/data/index/analysis @@ -0,0 +1,13 @@ + +index for ANALYSIS items + +These commands (and help files on commands) concern analyzing games: + + allobservers flip mexamine refresh unexamine + backward forward observe revert unobserve + examine + +Type "help TOPIC" in order to read them. + +[Last modified: July 10, 1995 by Friar] + diff --git a/data/index/commands b/data/index/commands new file mode 100644 index 0000000..ecdac95 --- /dev/null +++ b/data/index/commands @@ -0,0 +1,46 @@ + +These lists explain how commands are organized by index entries. + +analysis commands: + allobservers, backward, examine, flip, forward, mexamine, observe, + refresh, revert, unexamine, unobserve. + +game_info commands: + allobservers, eco, games, mailmoves, mailoldmoves, mailstored, + moves, observe, oldmoves, smoves, sposition, stored, unobserve. + +help commands: + help, index, info, mailhelp, news, quit. + +mail commands: + mailhelp, mailmess, mailmoves, mailoldmoves, mailsource, mailstored. + +play commands: + abort, accept, adjourn, assess, boards, decline, draw, flag, flip, + match, moretime, open, pause, pending, promote, refresh, resign, + switch, takeback, time, unpause, withdraw. + +preferences commands: + addlist, alias, bell, formula, highlight, notify, password, set, + style, sublist, unalias, unnotify, variables. + +server_info commands: + boards, date, help, index, limits, llogons, mailhelp, mailsource, + news, next, servers, showlist, statistics, uptime. + +simul commands: + accept, decline, goboard, gonum, simabort, simadjourn, simallabort, + simalladjourn, simgames, simmatch, simnext, simopen, simpass, + simprev. + +talk commands: + censor, channel, clearmessages, cshout, inchannel, it, kibitz, + mailmess, messages, say, shout, tell, uncensor, whisper, xtell. + +user_info commands: + best, finger, handles, hbest, history, hrank, logons, mailstored, + rank, stored, who, znotify. + +Type "help TOPIC" in order to read a specific help file. + +[Last modified: August 17, 1995 by hersco] diff --git a/data/index/game_info b/data/index/game_info new file mode 100644 index 0000000..8de2bac --- /dev/null +++ b/data/index/game_info @@ -0,0 +1,14 @@ + +index for GAME_INFO items + +These commands (and help files on commands) concern game information: + + + allobservers mailmoves moves smoves stored + eco mailoldmoves observe sposition unobserve + games mailstored oldmoves + +Type "help TOPIC" in order to read them. + +[Last modified: July 10, 1995 by Friar] + diff --git a/data/index/help b/data/index/help new file mode 100644 index 0000000..92b1eae --- /dev/null +++ b/data/index/help @@ -0,0 +1,20 @@ + +index for HELP items + +These commands (and help files on commands) provide basic, helpful +information: + + help info mailhelp news quit + index + +Other, informative files (not commands) that are relevant: + + fics_lingo handle intro_information intro_settings login + ficsfaq intro_basics intro_moving intro_special logout + ftp_hints intro_general intro_playing intro_welcome + + +Type "help TOPIC" in order to read them. + +[Last modified: September 22, 1995 by Friar] + diff --git a/data/index/mail b/data/index/mail new file mode 100644 index 0000000..650ccf0 --- /dev/null +++ b/data/index/mail @@ -0,0 +1,13 @@ + +index for MAIL items + +These commands (and help files on commands) concerning emailing you various +items: + + mailhelp mailmoves mailoldmoves mailsource mailstored + mailmess + +Type "help TOPIC" in order to read them. + +[Last modified: July 10, 1995 by Friar] + diff --git a/data/index/play b/data/index/play new file mode 100644 index 0000000..6812b69 --- /dev/null +++ b/data/index/play @@ -0,0 +1,25 @@ + +index for PLAY items + +These commands (and help files on commands) concerning playing chess matches +on this server: + + abort draw open resign + accept flag pause switch + adjourn flip partner takeback + assess match pending time + boards moretime promote unpause + decline noplay refresh withdraw + +Other, informative files (not commands) that are relevant: + + abuser computers intro_playing teamgames + adjournments formula lag timeseal + adjudication glicko lightning untimed + blindfold interfaces standard variables + blitz intro_moving team wild + +Type "help TOPIC" in order to read them. + +[Last modified: December 25, 1995 by Friar] + diff --git a/data/index/preferences b/data/index/preferences new file mode 100644 index 0000000..addcdee --- /dev/null +++ b/data/index/preferences @@ -0,0 +1,20 @@ + +index for PREFERENCES items + +These commands (and help files on commands) concern settings that can be +modified by users to set up the environment they prefer: + + addlist gnotify password sublist + alias highlight private unalias + bell kiblevel set variables + formula notify style + +Other, informative files (not commands) that are relevant: + + intro_settings + showlist + +Type "help TOPIC" in order to read them. + +[Last modified: October 17, 1995 by Friar] + diff --git a/data/index/server_info b/data/index/server_info new file mode 100644 index 0000000..99cb6fb --- /dev/null +++ b/data/index/server_info @@ -0,0 +1,20 @@ + +index for SERVER_INFO items + +These commands (and help files on commands) concern information about this +server: + + boards index mailhelp next statistics + date limits mailsource servers uptime + help llogons news showlist + +Other, informative files (not commands) that are relevant: + + addresses admins intro_general motd_help totals + adm_info credit limits newstuff + adm_new interfaces motd sourcecode + +Type "help TOPIC" in order to read them. + +[Last modified: September 9, 1995 by Friar] + diff --git a/data/index/simul b/data/index/simul new file mode 100644 index 0000000..74e0a0f --- /dev/null +++ b/data/index/simul @@ -0,0 +1,20 @@ + +index for SIMUL items + +These commands (and help files on commands) concern simultaneous chess +matches: + + accept simabort simgames simpass + decline simadjourn simmatch simprev + goboard simallabort simnext + gonum simalladjourn simopen + +Other, informative files (not commands) that are relevant: + + simuls + +Type "help TOPIC" in order to read them. + + +[Last modified: July 10, 1995 by Friar] + diff --git a/data/index/special b/data/index/special new file mode 100644 index 0000000..80ff947 --- /dev/null +++ b/data/index/special @@ -0,0 +1,16 @@ + +index for SPECIAL items + +These are special files (not commands) that have archived information: + + eggo + gm_game + inetchesslib + lecture1 + uscf + +Type "help TOPIC" in order to read them. + + +[Last modified: October 22, 1995 by Friar] + diff --git a/data/index/talk b/data/index/talk new file mode 100644 index 0000000..846c2a6 --- /dev/null +++ b/data/index/talk @@ -0,0 +1,19 @@ + +index for TALK items + +These commands (and help files on commands) concern communications on this +server: + + censor inchannel messages tell + channel it ptell whisper + clearmessages kibitz say xtell + cshout mailmess shout + +Other, informative files (not commands) that are relevant: + + etiquette limits shout_abuse shout_quota intro_talking + +Type "help TOPIC" in order to read them. + +[Last modified: December 25, 1995 by Friar] + diff --git a/data/index/user_info b/data/index/user_info new file mode 100644 index 0000000..f5fa702 --- /dev/null +++ b/data/index/user_info @@ -0,0 +1,21 @@ + +index for USER_INFO items + +These commands (and help files on commands) concern information about +individual users on this server: + + best finger hrank rank + convert_bcf handles jsave stored + convert_elo hbest logons who + convert_uscf history mailstored znotify + +Other, informative files (not commands) that are relevant: + + formula handles ratings + journal notes register + + +Type "help TOPIC" in order to read them. + +[Last modified: December 25, 1995 by Friar] + diff --git a/data/info/abuser b/data/info/abuser new file mode 120000 index 0000000..981ca27 --- /dev/null +++ b/data/info/abuser @@ -0,0 +1 @@ +../help/abuser \ No newline at end of file diff --git a/data/info/addresses b/data/info/addresses new file mode 120000 index 0000000..7a1e769 --- /dev/null +++ b/data/info/addresses @@ -0,0 +1 @@ +../help/addresses \ No newline at end of file diff --git a/data/info/adjournments b/data/info/adjournments new file mode 120000 index 0000000..05ccea1 --- /dev/null +++ b/data/info/adjournments @@ -0,0 +1 @@ +../help/adjournments \ No newline at end of file diff --git a/data/info/adjudication b/data/info/adjudication new file mode 120000 index 0000000..fd7b65c --- /dev/null +++ b/data/info/adjudication @@ -0,0 +1 @@ +../help/adjudication \ No newline at end of file diff --git a/data/info/adm-info b/data/info/adm-info new file mode 120000 index 0000000..324df02 --- /dev/null +++ b/data/info/adm-info @@ -0,0 +1 @@ +../help/adm-info \ No newline at end of file diff --git a/data/info/adm_info b/data/info/adm_info new file mode 120000 index 0000000..add4ef7 --- /dev/null +++ b/data/info/adm_info @@ -0,0 +1 @@ +../help/adm_info \ No newline at end of file diff --git a/data/info/adm_new b/data/info/adm_new new file mode 120000 index 0000000..9f2d1f6 --- /dev/null +++ b/data/info/adm_new @@ -0,0 +1 @@ +../help/adm_new \ No newline at end of file diff --git a/data/info/admins b/data/info/admins new file mode 120000 index 0000000..c9dd193 --- /dev/null +++ b/data/info/admins @@ -0,0 +1 @@ +../help/admins \ No newline at end of file diff --git a/data/info/analysis b/data/info/analysis new file mode 120000 index 0000000..8afa57d --- /dev/null +++ b/data/info/analysis @@ -0,0 +1 @@ +../help/analysis \ No newline at end of file diff --git a/data/info/blindfold b/data/info/blindfold new file mode 120000 index 0000000..ae1e5a1 --- /dev/null +++ b/data/info/blindfold @@ -0,0 +1 @@ +../help/blindfold \ No newline at end of file diff --git a/data/info/blitz b/data/info/blitz new file mode 120000 index 0000000..c0f4393 --- /dev/null +++ b/data/info/blitz @@ -0,0 +1 @@ +../help/blitz \ No newline at end of file diff --git a/data/info/bughouse b/data/info/bughouse new file mode 120000 index 0000000..483bcf6 --- /dev/null +++ b/data/info/bughouse @@ -0,0 +1 @@ +../help/bughouse \ No newline at end of file diff --git a/data/info/busy b/data/info/busy new file mode 120000 index 0000000..a474d54 --- /dev/null +++ b/data/info/busy @@ -0,0 +1 @@ +../help/busy \ No newline at end of file diff --git a/data/info/chan_1 b/data/info/chan_1 new file mode 120000 index 0000000..9776df2 --- /dev/null +++ b/data/info/chan_1 @@ -0,0 +1 @@ +../help/chan_1 \ No newline at end of file diff --git a/data/info/channel_list b/data/info/channel_list new file mode 120000 index 0000000..db2a180 --- /dev/null +++ b/data/info/channel_list @@ -0,0 +1 @@ +../help/channel_list \ No newline at end of file diff --git a/data/info/commands b/data/info/commands new file mode 120000 index 0000000..fc097e2 --- /dev/null +++ b/data/info/commands @@ -0,0 +1 @@ +../help/commands \ No newline at end of file diff --git a/data/info/computers b/data/info/computers new file mode 120000 index 0000000..108731f --- /dev/null +++ b/data/info/computers @@ -0,0 +1 @@ +../help/computers \ No newline at end of file diff --git a/data/info/credit b/data/info/credit new file mode 120000 index 0000000..437a8dc --- /dev/null +++ b/data/info/credit @@ -0,0 +1 @@ +../help/credit \ No newline at end of file diff --git a/data/info/eggo b/data/info/eggo new file mode 120000 index 0000000..5f811e3 --- /dev/null +++ b/data/info/eggo @@ -0,0 +1 @@ +../help/eggo \ No newline at end of file diff --git a/data/info/etiquette b/data/info/etiquette new file mode 120000 index 0000000..7073d57 --- /dev/null +++ b/data/info/etiquette @@ -0,0 +1 @@ +../help/etiquette \ No newline at end of file diff --git a/data/info/fics-lingo b/data/info/fics-lingo new file mode 120000 index 0000000..6d74305 --- /dev/null +++ b/data/info/fics-lingo @@ -0,0 +1 @@ +../help/fics-lingo \ No newline at end of file diff --git a/data/info/fics_lingo b/data/info/fics_lingo new file mode 120000 index 0000000..b6f2464 --- /dev/null +++ b/data/info/fics_lingo @@ -0,0 +1 @@ +../help/fics_lingo \ No newline at end of file diff --git a/data/info/ficsfaq b/data/info/ficsfaq new file mode 120000 index 0000000..f918b54 --- /dev/null +++ b/data/info/ficsfaq @@ -0,0 +1 @@ +../help/ficsfaq \ No newline at end of file diff --git a/data/info/fixes b/data/info/fixes new file mode 120000 index 0000000..3fd7211 --- /dev/null +++ b/data/info/fixes @@ -0,0 +1 @@ +../help/fixes \ No newline at end of file diff --git a/data/info/formula b/data/info/formula new file mode 120000 index 0000000..2032958 --- /dev/null +++ b/data/info/formula @@ -0,0 +1 @@ +../help/formula \ No newline at end of file diff --git a/data/info/ftp-hints b/data/info/ftp-hints new file mode 120000 index 0000000..7ff9a45 --- /dev/null +++ b/data/info/ftp-hints @@ -0,0 +1 @@ +../help/ftp-hints \ No newline at end of file diff --git a/data/info/ftp_hints b/data/info/ftp_hints new file mode 120000 index 0000000..7194b2e --- /dev/null +++ b/data/info/ftp_hints @@ -0,0 +1 @@ +../help/ftp_hints \ No newline at end of file diff --git a/data/info/glicko b/data/info/glicko new file mode 120000 index 0000000..3bca53b --- /dev/null +++ b/data/info/glicko @@ -0,0 +1 @@ +../help/glicko \ No newline at end of file diff --git a/data/info/gm_game b/data/info/gm_game new file mode 120000 index 0000000..0b99a8a --- /dev/null +++ b/data/info/gm_game @@ -0,0 +1 @@ +../help/gm_game \ No newline at end of file diff --git a/data/info/handle b/data/info/handle new file mode 120000 index 0000000..65f72e6 --- /dev/null +++ b/data/info/handle @@ -0,0 +1 @@ +../help/handle \ No newline at end of file diff --git a/data/info/highlight b/data/info/highlight new file mode 120000 index 0000000..d174a11 --- /dev/null +++ b/data/info/highlight @@ -0,0 +1 @@ +../help/highlight \ No newline at end of file diff --git a/data/info/inetchesslib b/data/info/inetchesslib new file mode 120000 index 0000000..738dd62 --- /dev/null +++ b/data/info/inetchesslib @@ -0,0 +1 @@ +../help/inetchesslib \ No newline at end of file diff --git a/data/info/interfaces b/data/info/interfaces new file mode 120000 index 0000000..d75e0f3 --- /dev/null +++ b/data/info/interfaces @@ -0,0 +1 @@ +../help/interfaces \ No newline at end of file diff --git a/data/info/intro0 b/data/info/intro0 new file mode 120000 index 0000000..c14edec --- /dev/null +++ b/data/info/intro0 @@ -0,0 +1 @@ +../help/intro0 \ No newline at end of file diff --git a/data/info/intro1 b/data/info/intro1 new file mode 120000 index 0000000..d3eb3cb --- /dev/null +++ b/data/info/intro1 @@ -0,0 +1 @@ +../help/intro1 \ No newline at end of file diff --git a/data/info/intro2 b/data/info/intro2 new file mode 120000 index 0000000..07aac81 --- /dev/null +++ b/data/info/intro2 @@ -0,0 +1 @@ +../help/intro2 \ No newline at end of file diff --git a/data/info/intro3 b/data/info/intro3 new file mode 120000 index 0000000..c2800d7 --- /dev/null +++ b/data/info/intro3 @@ -0,0 +1 @@ +../help/intro3 \ No newline at end of file diff --git a/data/info/intro4 b/data/info/intro4 new file mode 120000 index 0000000..e578d00 --- /dev/null +++ b/data/info/intro4 @@ -0,0 +1 @@ +../help/intro4 \ No newline at end of file diff --git a/data/info/intro5 b/data/info/intro5 new file mode 120000 index 0000000..1ff5605 --- /dev/null +++ b/data/info/intro5 @@ -0,0 +1 @@ +../help/intro5 \ No newline at end of file diff --git a/data/info/intro6 b/data/info/intro6 new file mode 120000 index 0000000..270173d --- /dev/null +++ b/data/info/intro6 @@ -0,0 +1 @@ +../help/intro6 \ No newline at end of file diff --git a/data/info/intro7 b/data/info/intro7 new file mode 120000 index 0000000..0a5fe66 --- /dev/null +++ b/data/info/intro7 @@ -0,0 +1 @@ +../help/intro7 \ No newline at end of file diff --git a/data/info/intro_basics b/data/info/intro_basics new file mode 120000 index 0000000..53a2f23 --- /dev/null +++ b/data/info/intro_basics @@ -0,0 +1 @@ +../help/intro_basics \ No newline at end of file diff --git a/data/info/intro_general b/data/info/intro_general new file mode 120000 index 0000000..451c961 --- /dev/null +++ b/data/info/intro_general @@ -0,0 +1 @@ +../help/intro_general \ No newline at end of file diff --git a/data/info/intro_information b/data/info/intro_information new file mode 120000 index 0000000..cb759b8 --- /dev/null +++ b/data/info/intro_information @@ -0,0 +1 @@ +../help/intro_information \ No newline at end of file diff --git a/data/info/intro_moving b/data/info/intro_moving new file mode 120000 index 0000000..f9dfd01 --- /dev/null +++ b/data/info/intro_moving @@ -0,0 +1 @@ +../help/intro_moving \ No newline at end of file diff --git a/data/info/intro_playing b/data/info/intro_playing new file mode 120000 index 0000000..fe6f317 --- /dev/null +++ b/data/info/intro_playing @@ -0,0 +1 @@ +../help/intro_playing \ No newline at end of file diff --git a/data/info/intro_settings b/data/info/intro_settings new file mode 120000 index 0000000..946bc1d --- /dev/null +++ b/data/info/intro_settings @@ -0,0 +1 @@ +../help/intro_settings \ No newline at end of file diff --git a/data/info/intro_special b/data/info/intro_special new file mode 120000 index 0000000..3b06b0f --- /dev/null +++ b/data/info/intro_special @@ -0,0 +1 @@ +../help/intro_special \ No newline at end of file diff --git a/data/info/intro_talking b/data/info/intro_talking new file mode 120000 index 0000000..40047aa --- /dev/null +++ b/data/info/intro_talking @@ -0,0 +1 @@ +../help/intro_talking \ No newline at end of file diff --git a/data/info/intro_welcome b/data/info/intro_welcome new file mode 120000 index 0000000..abc4eaf --- /dev/null +++ b/data/info/intro_welcome @@ -0,0 +1 @@ +../help/intro_welcome \ No newline at end of file diff --git a/data/info/kiblevel b/data/info/kiblevel new file mode 120000 index 0000000..bb2082f --- /dev/null +++ b/data/info/kiblevel @@ -0,0 +1 @@ +../help/kiblevel \ No newline at end of file diff --git a/data/info/lag b/data/info/lag new file mode 120000 index 0000000..917ca71 --- /dev/null +++ b/data/info/lag @@ -0,0 +1 @@ +../help/lag \ No newline at end of file diff --git a/data/info/lecture1 b/data/info/lecture1 new file mode 120000 index 0000000..513acf2 --- /dev/null +++ b/data/info/lecture1 @@ -0,0 +1 @@ +../help/lecture1 \ No newline at end of file diff --git a/data/info/lightning b/data/info/lightning new file mode 120000 index 0000000..7279c2c --- /dev/null +++ b/data/info/lightning @@ -0,0 +1 @@ +../help/lightning \ No newline at end of file diff --git a/data/info/limits b/data/info/limits new file mode 120000 index 0000000..dacd830 --- /dev/null +++ b/data/info/limits @@ -0,0 +1 @@ +../help/limits \ No newline at end of file diff --git a/data/info/lists b/data/info/lists new file mode 120000 index 0000000..41666e7 --- /dev/null +++ b/data/info/lists @@ -0,0 +1 @@ +../help/lists \ No newline at end of file diff --git a/data/info/login b/data/info/login new file mode 120000 index 0000000..8c56b9b --- /dev/null +++ b/data/info/login @@ -0,0 +1 @@ +../messages/login \ No newline at end of file diff --git a/data/info/logout b/data/info/logout new file mode 120000 index 0000000..a327338 --- /dev/null +++ b/data/info/logout @@ -0,0 +1 @@ +../messages/logout \ No newline at end of file diff --git a/data/info/motd b/data/info/motd new file mode 120000 index 0000000..37abcb9 --- /dev/null +++ b/data/info/motd @@ -0,0 +1 @@ +../help/motd \ No newline at end of file diff --git a/data/info/motd_help b/data/info/motd_help new file mode 120000 index 0000000..2882685 --- /dev/null +++ b/data/info/motd_help @@ -0,0 +1 @@ +../help/motd_help \ No newline at end of file diff --git a/data/info/newrating b/data/info/newrating new file mode 120000 index 0000000..57a01c6 --- /dev/null +++ b/data/info/newrating @@ -0,0 +1 @@ +../help/newrating \ No newline at end of file diff --git a/data/info/newstuff b/data/info/newstuff new file mode 120000 index 0000000..b093904 --- /dev/null +++ b/data/info/newstuff @@ -0,0 +1 @@ +../help/newstuff \ No newline at end of file diff --git a/data/info/notes b/data/info/notes new file mode 120000 index 0000000..c98cfca --- /dev/null +++ b/data/info/notes @@ -0,0 +1 @@ +../help/notes \ No newline at end of file diff --git a/data/info/private b/data/info/private new file mode 120000 index 0000000..159aa01 --- /dev/null +++ b/data/info/private @@ -0,0 +1 @@ +../help/private \ No newline at end of file diff --git a/data/info/ratings b/data/info/ratings new file mode 120000 index 0000000..1539be2 --- /dev/null +++ b/data/info/ratings @@ -0,0 +1 @@ +../help/ratings \ No newline at end of file diff --git a/data/info/register b/data/info/register new file mode 120000 index 0000000..8fe3008 --- /dev/null +++ b/data/info/register @@ -0,0 +1 @@ +../help/register \ No newline at end of file diff --git a/data/info/shout_abuse b/data/info/shout_abuse new file mode 120000 index 0000000..d59fbf5 --- /dev/null +++ b/data/info/shout_abuse @@ -0,0 +1 @@ +../help/shout_abuse \ No newline at end of file diff --git a/data/info/shout_quota b/data/info/shout_quota new file mode 120000 index 0000000..25eef58 --- /dev/null +++ b/data/info/shout_quota @@ -0,0 +1 @@ +../help/shout_quota \ No newline at end of file diff --git a/data/info/showlist b/data/info/showlist new file mode 120000 index 0000000..7e02547 --- /dev/null +++ b/data/info/showlist @@ -0,0 +1 @@ +../help/showlist \ No newline at end of file diff --git a/data/info/simuls b/data/info/simuls new file mode 120000 index 0000000..bc8618c --- /dev/null +++ b/data/info/simuls @@ -0,0 +1 @@ +../help/simuls \ No newline at end of file diff --git a/data/info/sourcecode b/data/info/sourcecode new file mode 120000 index 0000000..f9e8761 --- /dev/null +++ b/data/info/sourcecode @@ -0,0 +1 @@ +../help/sourcecode \ No newline at end of file diff --git a/data/info/standard b/data/info/standard new file mode 120000 index 0000000..9367d72 --- /dev/null +++ b/data/info/standard @@ -0,0 +1 @@ +../help/standard \ No newline at end of file diff --git a/data/info/team b/data/info/team new file mode 120000 index 0000000..0c9c820 --- /dev/null +++ b/data/info/team @@ -0,0 +1 @@ +../help/team \ No newline at end of file diff --git a/data/info/teamgames b/data/info/teamgames new file mode 120000 index 0000000..29dbd0b --- /dev/null +++ b/data/info/teamgames @@ -0,0 +1 @@ +../help/teamgames \ No newline at end of file diff --git a/data/info/timeseal b/data/info/timeseal new file mode 120000 index 0000000..700fa8b --- /dev/null +++ b/data/info/timeseal @@ -0,0 +1 @@ +../help/timeseal \ No newline at end of file diff --git a/data/info/todo b/data/info/todo new file mode 120000 index 0000000..3989178 --- /dev/null +++ b/data/info/todo @@ -0,0 +1 @@ +../help/todo \ No newline at end of file diff --git a/data/info/totals b/data/info/totals new file mode 120000 index 0000000..2809561 --- /dev/null +++ b/data/info/totals @@ -0,0 +1 @@ +../help/totals \ No newline at end of file diff --git a/data/info/untimed b/data/info/untimed new file mode 120000 index 0000000..4aaf5e1 --- /dev/null +++ b/data/info/untimed @@ -0,0 +1 @@ +../help/untimed \ No newline at end of file diff --git a/data/info/uscf_faq b/data/info/uscf_faq new file mode 120000 index 0000000..b49fd58 --- /dev/null +++ b/data/info/uscf_faq @@ -0,0 +1 @@ +../uscf/uscf_faq \ No newline at end of file diff --git a/data/info/wild b/data/info/wild new file mode 120000 index 0000000..1856cdb --- /dev/null +++ b/data/info/wild @@ -0,0 +1 @@ +../help/wild \ No newline at end of file diff --git a/data/lists/HelpToIndex b/data/lists/HelpToIndex new file mode 100755 index 0000000..9231371 --- /dev/null +++ b/data/lists/HelpToIndex @@ -0,0 +1,6 @@ +-1 means no players but admin gods can edit, all may view it. +0 means no players but admins can access it +1 means only read by non-admins +2 means that everyone can see/write to the list + +Written by Hawk :) diff --git a/data/lists/README b/data/lists/README new file mode 100755 index 0000000..50cac96 --- /dev/null +++ b/data/lists/README @@ -0,0 +1,70 @@ +Index to lists and their priorities + +-2 set by head admin only (Not yet implemented) +-1 set by admin gods only (V1.2.4 onward) +0 read/write admins only +1 write admins - read by all +2 read/write by all (Not used at present) + +lists are used for: + + abuser list of game abusers - will lose on disconnnection (V1.2.2) + + admin list of all admins - NB (V1.2.3 and below use asetadmin to add +them) + +admin gives level 10 administrator - use asetadmin to increase) + (V1.2.4 the priveledge of the lists should be -1) + (Future versions should be -2) + + ban list of banned people (V1.2.4) + + blind list of people registered playing blind (style 9) + + cmuzzle list of people not allowed to use cshout (V1.2.3) + + computer list of computer opponents (V1.2.2) + + filter list of filtered ip addresses which unregs can't log in from (V1.2.7) + 1> eg +filter 128 does filter 128.*.*.* where * is don't care. + 2> eg +filter 128.127 does filter 128.127.*.* + 3> eg +filter 128.127.126 does filter 128.127.126.* + 4> eg +filter 128.127.126.125 does filter 128.127.126.125 + + NB Never use example 1! + Example 2 will probably filter a whole university + Example 3 will filter a network + Example 4 will filter a machine + + fm list of FM opponents (V1.2.2) + gm list of GM opponents (V1.2.2) + im list of IM opponents (V1.2.2) + + muzzle list of muzzled people (use muzzle command below V1.2.3) + NB muzzle doesn't revoke cshout priveledges + + quota list of people who will get severe shout quotas (V1.2.5) + NB The quota command can change the shout limit. + + removedcom list of commands that can't be used due to bugs (V1.2.12) + NB priveledge should be -1 + + td list of tournament directors (V1.2.4) + + teams list of all teams and club accounts + +Lists are added in the index file the format is: + + +Only one entry should appear per line. + +FICS commands: + + +listname [name] adds someone to a list + -listname [name] removes someone from a list + =listname [name] shows list + = list an index to the lists + + note + is short for addlist - short for sublist and = short for showlist + +[Written by DAV 06/11/95] + diff --git a/data/lists/abuser b/data/lists/abuser new file mode 100755 index 0000000..e69de29 diff --git a/data/lists/admin b/data/lists/admin new file mode 100755 index 0000000..52548cf --- /dev/null +++ b/data/lists/admin @@ -0,0 +1 @@ +AdminGuy diff --git a/data/lists/ban b/data/lists/ban new file mode 100755 index 0000000..e69de29 diff --git a/data/lists/blind b/data/lists/blind new file mode 100755 index 0000000..e69de29 diff --git a/data/lists/cmuzzle b/data/lists/cmuzzle new file mode 100755 index 0000000..e69de29 diff --git a/data/lists/computer b/data/lists/computer new file mode 100755 index 0000000..e69de29 diff --git a/data/lists/filter b/data/lists/filter new file mode 100755 index 0000000..e69de29 diff --git a/data/lists/fm b/data/lists/fm new file mode 100755 index 0000000..e69de29 diff --git a/data/lists/gm b/data/lists/gm new file mode 100755 index 0000000..e69de29 diff --git a/data/lists/im b/data/lists/im new file mode 100755 index 0000000..e69de29 diff --git a/data/lists/index b/data/lists/index new file mode 100755 index 0000000..7fb1275 --- /dev/null +++ b/data/lists/index @@ -0,0 +1,15 @@ +admin -1 +gm 1 +im 1 +fm 1 +abuser 0 +filter 0 +td -1 +computer 1 +blind 1 +teams 1 +muzzle 0 +cmuzzle 0 +ban 0 +removedcom -1 +programmer -1 diff --git a/data/lists/muzzle b/data/lists/muzzle new file mode 100755 index 0000000..e69de29 diff --git a/data/lists/removedcom b/data/lists/removedcom new file mode 100755 index 0000000..e69de29 diff --git a/data/lists/td b/data/lists/td new file mode 100755 index 0000000..e69de29 diff --git a/data/lists/teams b/data/lists/teams new file mode 100755 index 0000000..e69de29 diff --git a/data/messages/admotd b/data/messages/admotd new file mode 100755 index 0000000..6a4d319 --- /dev/null +++ b/data/messages/admotd @@ -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/data/messages/login b/data/messages/login new file mode 100755 index 0000000..f7f4c6d --- /dev/null +++ b/data/messages/login @@ -0,0 +1,2 @@ + +If you are not a registered player, enter a unique ID to join the server. diff --git a/data/messages/logout b/data/messages/logout new file mode 100755 index 0000000..a6432d1 --- /dev/null +++ b/data/messages/logout @@ -0,0 +1,3 @@ + +Thank you for using a Free (GNU) Internet Chess server. + diff --git a/data/messages/logout.fancy b/data/messages/logout.fancy new file mode 100755 index 0000000..0e9ea7f --- /dev/null +++ b/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/data/messages/motd b/data/messages/motd new file mode 100755 index 0000000..0934bd9 --- /dev/null +++ b/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/data/messages/unregistered b/data/messages/unregistered new file mode 100755 index 0000000..9074ba3 --- /dev/null +++ b/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/data/messages/welcome b/data/messages/welcome new file mode 100755 index 0000000..1fec1e1 --- /dev/null +++ b/data/messages/welcome @@ -0,0 +1,20 @@ + + _ __ __ __ + | | / /__ / /________ ____ ___ ___ / /_____ + | | /| / / _ \/ / ___/ __ \/ __ `__ \/ _ \ / __/ __ \ + | |/ |/ / __/ / /__/ /_/ / / / / / / __/ / /_/ /_/ / + |__/|__/\___/_/\___/\____/_/ /_/ /_/\___/ \__/\____/ + ^^__ _____________________ _ _ _ + / - \_ / ____/ _/ ____/ ___/ _ | || || | + <| __< / /_ / // / \__ \ (_) |_______| + <| \ / __/ _/ // /___ ___/ / _ \__ ___ / + <| \ /_/ /___/\____//____/ (_) |___|_| + <|______\ |_|___| + _|____|_ ====================================== |___|_| + (________) this.place.net -- xxx.xxx.xxx.xxx (_______) + /________\ ====================================== /_______\ + (Login screen designed by Alefith) + + ***** Welcome to a Free (GNU) Internet Chess Server at ***** + Come on in and check it out! + diff --git a/data/messages/welcome.backup b/data/messages/welcome.backup new file mode 100755 index 0000000..6630f2e --- /dev/null +++ b/data/messages/welcome.backup @@ -0,0 +1,35 @@ + + _ __ __ __ + | | / /__ / /________ ____ ___ ___ / /_____ + | | /| / / _ \/ / ___/ __ \/ __ `__ \/ _ \ / __/ __ \ + | |/ |/ / __/ / /__/ /_/ / / / / / / __/ / /_/ /_/ / + |__/|__/\___/_/\___/\____/_/ /_/ /_/\___/ \__/\____/ + ^^__ _____________________ _ _ _ + / - \_ / ____/ _/ ____/ ___/ _ | || || | + <| __< / /_ / // / \__ \ (_) |_______| + <| \ / __/ _/ // /___ ___/ / _ \__ ___ / + <| \ /_/ /___/\____//____/ (_) |___|_| + <|______\ |_|___| + _|____|_ ====================================== |___|_| + (________) this.place.net --- xxx.xxx.xxx.xxx (_______) + /________\ ====================================== /_______\ + ___ ____ ____ __ __ + / | / __/______ ___ / _/___ / /____ ________ ___ / /_ + / /| | / /_/ __/ _ \/ _ \ / // __ \/ __/ _ \/ __/ __ \/ _ \/ __/ + / ___ | / __/ / / __/ __/ _/ // / / / /_/ __/ / / / / / __/ /_ + /_/ |_| /_/ /_/ \___/\___/ /___/_/ /_/\__/\___/_/ /_/ /_/\___/\__/ + ________ _____ + / ____/ /_ ___ __________ / ___/___ ______ _____ _____ + / / / __ \/ _ \/ ___/ ___/ \__ \/ _ \/ ___/ | / / _ \/ ___/ + / /___/ / / / __(__ |__ ) ___/ / __/ / | |/ / __/ / + \____/_/ /_/\___/____/____/ /____/\___/_/ |___/\___/_/ + ================================================================ + + (Login screen designed by Alefith, hacked by Sparky) + + ***** Welcome to a Free (GNU) Internet Chess Server at this.place.net ***** + + Come on in and check it out. We are getting more stable all the time! + xboard, ziics, slics and Mac-TCP should all be supported! let us know of any + problems! + diff --git a/data/messages/welcome.old b/data/messages/welcome.old new file mode 100755 index 0000000..76314e5 --- /dev/null +++ b/data/messages/welcome.old @@ -0,0 +1,5 @@ + + ***** Welcome to a Free (GNU) Internet Chess Server at this.place.net ***** + + Come on in and check it out! + diff --git a/data/news/adminnews.1 b/data/news/adminnews.1 new file mode 100755 index 0000000..42ec7d9 --- /dev/null +++ b/data/news/adminnews.1 @@ -0,0 +1 @@ +Admin news is now set up similar to the general news. You will be able to see new items at login. You can use canewsf and canewsi to create admin news files. See help files for more info. diff --git a/data/news/newadminnews.index b/data/news/newadminnews.index new file mode 100644 index 0000000..909790e --- /dev/null +++ b/data/news/newadminnews.index @@ -0,0 +1 @@ +811045880 1 Admin news displayed at login! diff --git a/data/news/newnews.index b/data/news/newnews.index new file mode 100644 index 0000000..cb3a7b0 --- /dev/null +++ b/data/news/newnews.index @@ -0,0 +1 @@ +806644725 1 View new news items at login! diff --git a/data/stats/logons b/data/stats/logons new file mode 100755 index 0000000..f20c046 --- /dev/null +++ b/data/stats/logons @@ -0,0 +1,2 @@ +0 sparky 820329015 0 127.0.0.1 +1 sparky 820329058 0 127.0.0.1 diff --git a/data/stats/logons.log b/data/stats/logons.log new file mode 100755 index 0000000..f20c046 --- /dev/null +++ b/data/stats/logons.log @@ -0,0 +1,2 @@ +0 sparky 820329015 0 127.0.0.1 +1 sparky 820329058 0 127.0.0.1 diff --git a/data/stats/newratings_data b/data/stats/newratings_data new file mode 100755 index 0000000..e69de29 diff --git a/data/stats/rank.blitz b/data/stats/rank.blitz new file mode 100755 index 0000000..e69de29 diff --git a/data/stats/rank.std b/data/stats/rank.std new file mode 100755 index 0000000..e69de29 diff --git a/data/stats/rank.wild b/data/stats/rank.wild new file mode 100755 index 0000000..e69de29 diff --git a/data/usage/abort b/data/usage/abort new file mode 100644 index 0000000..6d7981e --- /dev/null +++ b/data/usage/abort @@ -0,0 +1,4 @@ +Command: abort +Purpose: to request an adjournment -OR- end game if opponent has no time +Usage: abort +Examples: abort diff --git a/data/usage/accept b/data/usage/accept new file mode 100644 index 0000000..d643b89 --- /dev/null +++ b/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/data/usage/addlist b/data/usage/addlist new file mode 100644 index 0000000..6a2a0db --- /dev/null +++ b/data/usage/addlist @@ -0,0 +1,4 @@ +Command: addlist +Purpose: add information to a list +Usage: addlist list information +Examples: addlist noplay Friar diff --git a/data/usage/adjourn b/data/usage/adjourn new file mode 100644 index 0000000..3e446fa --- /dev/null +++ b/data/usage/adjourn @@ -0,0 +1,4 @@ +Command: adjourn +Purpose: to request an adjournment of a game +Usage: adjourn +Examples: adjourn diff --git a/data/usage/alias b/data/usage/alias new file mode 100644 index 0000000..78c5371 --- /dev/null +++ b/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/data/usage/allobservers b/data/usage/allobservers new file mode 100644 index 0000000..76234b4 --- /dev/null +++ b/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/data/usage/assess b/data/usage/assess new file mode 100644 index 0000000..e24efbe --- /dev/null +++ b/data/usage/assess @@ -0,0 +1,4 @@ +Command: assess +Purpose: calculate expected changes to ratings from a chess match +Usage: assess [user1 [user2]] +Examples: assess; assess Sparky; assess DAV Thanatos diff --git a/data/usage/backward b/data/usage/backward new file mode 100644 index 0000000..a98198b --- /dev/null +++ b/data/usage/backward @@ -0,0 +1,4 @@ +Command: backward +Purpose: move backward in the game sequence as you examine a game +Usage: backward [#] +Examples: backward; backward 2 diff --git a/data/usage/bell b/data/usage/bell new file mode 100644 index 0000000..0f4fc6e --- /dev/null +++ b/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/data/usage/best b/data/usage/best new file mode 100644 index 0000000..1dd417c --- /dev/null +++ b/data/usage/best @@ -0,0 +1,4 @@ +Command: best +Purpose: list the 20 highest rated players in the ratings categories +Usage: best [b|s|w] +Examples: best; best s diff --git a/data/usage/boards b/data/usage/boards new file mode 100644 index 0000000..fb28c81 --- /dev/null +++ b/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/data/usage/censor b/data/usage/censor new file mode 100644 index 0000000..9585229 --- /dev/null +++ b/data/usage/censor @@ -0,0 +1,4 @@ +Command: censor +Purpose: filter comments from a user so you will not receive them +Usage: censor [user] +Examples: censor; censor Friar diff --git a/data/usage/channel b/data/usage/channel new file mode 100644 index 0000000..1be7f77 --- /dev/null +++ b/data/usage/channel @@ -0,0 +1,4 @@ +Command: channel +Purpose: toggles a channel on/off (1/0) -OR- turns all channels off +Usage: channel [0-255] +Examples: channel 1; channel diff --git a/data/usage/clearmessages b/data/usage/clearmessages new file mode 100644 index 0000000..1ae6048 --- /dev/null +++ b/data/usage/clearmessages @@ -0,0 +1,4 @@ +Command: clearmessages +Purpose: delete one or more stored messages from your message file +Usage: clearmessages [user] +Examples: clearmessages; clearmessages Solid diff --git a/data/usage/cshout b/data/usage/cshout new file mode 100644 index 0000000..8292529 --- /dev/null +++ b/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/data/usage/date b/data/usage/date new file mode 100644 index 0000000..208b846 --- /dev/null +++ b/data/usage/date @@ -0,0 +1,4 @@ +Command: date +Purpose: list local date/time at the server and at Greenwich, England +Usage: date +Examples: date diff --git a/data/usage/decline b/data/usage/decline new file mode 100644 index 0000000..00b7851 --- /dev/null +++ b/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, all, abort, adjourn, draw, match, pause, player, + simul, switch, takeback] +Examples: decline; decline 2; decline draw; decline cyee diff --git a/data/usage/draw b/data/usage/draw new file mode 100644 index 0000000..075981a --- /dev/null +++ b/data/usage/draw @@ -0,0 +1,4 @@ +Command: draw +Purpose: requests (or agrees to) a draw offer during a chess match +Usage: draw +Examples: draw diff --git a/data/usage/eco b/data/usage/eco new file mode 100644 index 0000000..34a44ca --- /dev/null +++ b/data/usage/eco @@ -0,0 +1,4 @@ +Command: eco +Purpose: display the type of opening used in the chess game +Usage: eco [game, name] +Examples: eco; eco 23; eco Clovis diff --git a/data/usage/examine b/data/usage/examine new file mode 100644 index 0000000..0f8208c --- /dev/null +++ b/data/usage/examine @@ -0,0 +1,4 @@ +Command: examine +Purpose: review or start a game under examination mode +Usage: examine [player1 [player2, game_number] +Examples: examine; examine river; examine TheDane sms; examine McKeork 7 diff --git a/data/usage/finger b/data/usage/finger new file mode 100644 index 0000000..9c1c0a1 --- /dev/null +++ b/data/usage/finger @@ -0,0 +1,4 @@ +Command: finger +Purpose: display information about yourself or another user +Usage: finger [user] +Examples: finger; finger TheViking diff --git a/data/usage/flag b/data/usage/flag new file mode 100644 index 0000000..5113cce --- /dev/null +++ b/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/data/usage/flip b/data/usage/flip new file mode 100644 index 0000000..3b525d6 --- /dev/null +++ b/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/data/usage/forward b/data/usage/forward new file mode 100644 index 0000000..e9261fe --- /dev/null +++ b/data/usage/forward @@ -0,0 +1,4 @@ +Command: forward +Purpose: move forward in a sequence of moves in a game being examined +Usage: forward [#] +Examples: forward; forward 2; forward 999 diff --git a/data/usage/games b/data/usage/games new file mode 100644 index 0000000..683be72 --- /dev/null +++ b/data/usage/games @@ -0,0 +1,4 @@ +Command: games +Purpose: display information about games currently in progress +Usage: games [#, word] +Examples: games; games 23; games sveshi diff --git a/data/usage/goboard b/data/usage/goboard new file mode 100644 index 0000000..c5f6fc8 --- /dev/null +++ b/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 diff --git a/data/usage/gonum b/data/usage/gonum new file mode 100644 index 0000000..747b177 --- /dev/null +++ b/data/usage/gonum @@ -0,0 +1,4 @@ +Command: gonum +Purpose: in a simul match, move to a given board number +Usage: gonum # +Examples: gonum 3 diff --git a/data/usage/handles b/data/usage/handles new file mode 100644 index 0000000..ab8730e --- /dev/null +++ b/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/data/usage/hbest b/data/usage/hbest new file mode 100644 index 0000000..6ce2a44 --- /dev/null +++ b/data/usage/hbest @@ -0,0 +1,4 @@ +Command: hbest +Purpose: displays 20 highest-rated human players by chess category +Usage: hbest [b|s|w] +Examples: hbest; hbest s diff --git a/data/usage/history b/data/usage/history new file mode 100644 index 0000000..bc77633 --- /dev/null +++ b/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/data/usage/hrank b/data/usage/hrank new file mode 100644 index 0000000..25ce39a --- /dev/null +++ b/data/usage/hrank @@ -0,0 +1,5 @@ +Command: hrank +Purpose: displays rank (excluding computer accounts) for a player or + range of players +Usage: hrank [user [b][s][w]] -OR- hrank m-n [b][s][w] +Examples: hrank; hrank 50-100; hrank s; hrank cyee bs diff --git a/data/usage/inchannel b/data/usage/inchannel new file mode 100644 index 0000000..36c9040 --- /dev/null +++ b/data/usage/inchannel @@ -0,0 +1,4 @@ +Command: inchannel +Purpose: lists users currently open on the given channel(s) +Usage: inchannel [0-255] +Examples: inchannel; inchannel 1 diff --git a/data/usage/it b/data/usage/it new file mode 100644 index 0000000..c03c4de --- /dev/null +++ b/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/data/usage/kibitz b/data/usage/kibitz new file mode 100644 index 0000000..b1b1bc5 --- /dev/null +++ b/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/data/usage/limits b/data/usage/limits new file mode 100644 index 0000000..01836af --- /dev/null +++ b/data/usage/limits @@ -0,0 +1,4 @@ +Command: limits +Purpose: display current server limits and settings +Usage: limits +Examples: limits diff --git a/data/usage/llogons b/data/usage/llogons new file mode 100644 index 0000000..e69de29 diff --git a/data/usage/logons b/data/usage/logons new file mode 100644 index 0000000..45b51c7 --- /dev/null +++ b/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/data/usage/mailhelp b/data/usage/mailhelp new file mode 100644 index 0000000..e40f2d3 --- /dev/null +++ b/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/data/usage/mailmess b/data/usage/mailmess new file mode 100644 index 0000000..72da86c --- /dev/null +++ b/data/usage/mailmess @@ -0,0 +1,4 @@ +Command: mailmess +Purpose: email your stored messages to you +Usage: mailmess +Examples: mailmess diff --git a/data/usage/mailmoves b/data/usage/mailmoves new file mode 100644 index 0000000..0160ebd --- /dev/null +++ b/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/data/usage/mailoldmoves b/data/usage/mailoldmoves new file mode 100644 index 0000000..0332a8e --- /dev/null +++ b/data/usage/mailoldmoves @@ -0,0 +1,4 @@ +Command: mailoldmoves [NOTE: mailstored is a better command to use] +Purpose: email to you the moves from a completed game +Usage: mailoldmoves [user] +Examples: mailoldmoves; mailoldmoves loon diff --git a/data/usage/mailsource b/data/usage/mailsource new file mode 100644 index 0000000..0dfdc69 --- /dev/null +++ b/data/usage/mailsource @@ -0,0 +1,4 @@ +Command: mailsource +Purpose: email to you a sourcecode file -OR- list sourcecode files +Usage: mailsource [filename] +Examples: mailsource formula.c diff --git a/data/usage/mailstored b/data/usage/mailstored new file mode 100644 index 0000000..28b89ec --- /dev/null +++ b/data/usage/mailstored @@ -0,0 +1,4 @@ +Command: mailstored +Purpose: email to you the moves of a game (either in history or stored) +Usage: mailstored player1 {#, player2} +Examples: mailstored hersco 87; mailstored Len schert diff --git a/data/usage/match b/data/usage/match new file mode 100644 index 0000000..f543196 --- /dev/null +++ b/data/usage/match @@ -0,0 +1,5 @@ +Command: match +Purpose: challenge a user to a chess match +Usage: match user [rated|unrated] [Start] [Inc] [Black_Start Black_Inc] + [White|Black] [board_category board] +Examples: match foxbat; match Marsalis 2 15 u diff --git a/data/usage/messages b/data/usage/messages new file mode 100644 index 0000000..eddbe06 --- /dev/null +++ b/data/usage/messages @@ -0,0 +1,4 @@ +Command: messages +Purpose: display your stored messages -OR- send a stored message to a user +Usage: messages [user [text]] +Examples: messages; messages Shane; messages Ramius Thanks for your help! diff --git a/data/usage/mexamine b/data/usage/mexamine new file mode 100644 index 0000000..2d344f9 --- /dev/null +++ b/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/data/usage/moretime b/data/usage/moretime new file mode 100644 index 0000000..7bab4a4 --- /dev/null +++ b/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/data/usage/moves b/data/usage/moves new file mode 100644 index 0000000..2657105 --- /dev/null +++ b/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/data/usage/news b/data/usage/news new file mode 100644 index 0000000..9445fa9 --- /dev/null +++ b/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 diff --git a/data/usage/next b/data/usage/next new file mode 100644 index 0000000..84cfbc1 --- /dev/null +++ b/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/data/usage/notify b/data/usage/notify new file mode 100644 index 0000000..b069b35 --- /dev/null +++ b/data/usage/notify @@ -0,0 +1,4 @@ +Command: notify +Purpose: add user to your notify list -OR- display your notify list +Usage: notify [user] +Examples: notify; notify sms diff --git a/data/usage/observe b/data/usage/observe new file mode 100644 index 0000000..0a3c65b --- /dev/null +++ b/data/usage/observe @@ -0,0 +1,4 @@ +Command: observe +Purpose: add (or remove) a game from your observation list +Usage: observe [game,user] +Examples: observe; observe 34; observe GMAnand diff --git a/data/usage/oldmoves b/data/usage/oldmoves new file mode 100644 index 0000000..d15bd54 --- /dev/null +++ b/data/usage/oldmoves @@ -0,0 +1,4 @@ +Command: oldmoves [NOTE: smoves is a better command to use] +Purpose: display moves of a recently chess match +Usage: oldmoves [user] +Examples: oldmoves; oldmoves TheDane diff --git a/data/usage/open b/data/usage/open new file mode 100644 index 0000000..485b507 --- /dev/null +++ b/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/data/usage/password b/data/usage/password new file mode 100644 index 0000000..0491e76 --- /dev/null +++ b/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/data/usage/pause b/data/usage/pause new file mode 100644 index 0000000..39ccd03 --- /dev/null +++ b/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/data/usage/pending b/data/usage/pending new file mode 100644 index 0000000..d804d88 --- /dev/null +++ b/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/data/usage/promote b/data/usage/promote new file mode 100644 index 0000000..cba0696 --- /dev/null +++ b/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]} +Examples: promote q; promote b diff --git a/data/usage/quit b/data/usage/quit new file mode 100644 index 0000000..6d83d32 --- /dev/null +++ b/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/data/usage/rank b/data/usage/rank new file mode 100644 index 0000000..5d409ff --- /dev/null +++ b/data/usage/rank @@ -0,0 +1,4 @@ +Command: rank +Purpose: display rank for user or range of users by category +Usage: rank [user [b][s][w]] -OR- rank m-n [b][s][w] +Examples: rank; rank sveshi; rank 50-100; rank s diff --git a/data/usage/refresh b/data/usage/refresh new file mode 100644 index 0000000..2790626 --- /dev/null +++ b/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] +Examples: refresh; refresh 45 diff --git a/data/usage/resign b/data/usage/resign new file mode 100644 index 0000000..622c155 --- /dev/null +++ b/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/data/usage/revert b/data/usage/revert new file mode 100644 index 0000000..c0b41b5 --- /dev/null +++ b/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/data/usage/say b/data/usage/say new file mode 100644 index 0000000..9ca89d6 --- /dev/null +++ b/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/data/usage/set b/data/usage/set new file mode 100644 index 0000000..d6ff838 --- /dev/null +++ b/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/data/usage/shout b/data/usage/shout new file mode 100644 index 0000000..e0d8407 --- /dev/null +++ b/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/data/usage/showlist b/data/usage/showlist new file mode 100644 index 0000000..327b362 --- /dev/null +++ b/data/usage/showlist @@ -0,0 +1,4 @@ +Command: showlist +Purpose: display users who are on special lists +Usage: showlist [list_name] +Examples: showlist computers; showlist admins diff --git a/data/usage/simabort b/data/usage/simabort new file mode 100644 index 0000000..dd507a2 --- /dev/null +++ b/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/data/usage/simadjourn b/data/usage/simadjourn new file mode 100644 index 0000000..58d9c80 --- /dev/null +++ b/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/data/usage/simallabort b/data/usage/simallabort new file mode 100644 index 0000000..5961722 --- /dev/null +++ b/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/data/usage/simalladjourn b/data/usage/simalladjourn new file mode 100644 index 0000000..ce9fccc --- /dev/null +++ b/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/data/usage/simgames b/data/usage/simgames new file mode 100644 index 0000000..526a716 --- /dev/null +++ b/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/data/usage/simmatch b/data/usage/simmatch new file mode 100644 index 0000000..28194b0 --- /dev/null +++ b/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/data/usage/simnext b/data/usage/simnext new file mode 100644 index 0000000..6c19c22 --- /dev/null +++ b/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/data/usage/simopen b/data/usage/simopen new file mode 100644 index 0000000..31f0e06 --- /dev/null +++ b/data/usage/simopen @@ -0,0 +1,4 @@ +Command: simopen +Purpose: sets yourself open to receive simul challenges +Usage: simopen +Examples: simopen diff --git a/data/usage/simpass b/data/usage/simpass new file mode 100644 index 0000000..7cdbbee --- /dev/null +++ b/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/data/usage/simprev b/data/usage/simprev new file mode 100644 index 0000000..dbffadb --- /dev/null +++ b/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/data/usage/smoves b/data/usage/smoves new file mode 100644 index 0000000..ce281a8 --- /dev/null +++ b/data/usage/smoves @@ -0,0 +1,4 @@ +Command: smoves +Purpose: displays moves of a user's game (either history or stored) +Usage: smoves player1 {#, player2} +Examples: smoves Rattlesnake 9; smoves cranium TheViking diff --git a/data/usage/sposition b/data/usage/sposition new file mode 100644 index 0000000..ce9af71 --- /dev/null +++ b/data/usage/sposition @@ -0,0 +1,4 @@ +Command: sposition +Purpose: displays position of the stored game between two users +Usage: sposition player1 player2 +Examples: sposition loon mann diff --git a/data/usage/statistics b/data/usage/statistics new file mode 100644 index 0000000..836f0b2 --- /dev/null +++ b/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/data/usage/stored b/data/usage/stored new file mode 100644 index 0000000..82a29a8 --- /dev/null +++ b/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/data/usage/style b/data/usage/style new file mode 100644 index 0000000..3513631 --- /dev/null +++ b/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/data/usage/sublist b/data/usage/sublist new file mode 100644 index 0000000..bf551a4 --- /dev/null +++ b/data/usage/sublist @@ -0,0 +1,4 @@ +Command: sublist +Purpose: removes information from the given list +Usage: sublist list information +Examples: sublist notify Friar diff --git a/data/usage/switch b/data/usage/switch new file mode 100644 index 0000000..62e8253 --- /dev/null +++ b/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/data/usage/takeback b/data/usage/takeback new file mode 100644 index 0000000..d7c1d26 --- /dev/null +++ b/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] +Examples: takeback; takeback 2 diff --git a/data/usage/tell b/data/usage/tell new file mode 100644 index 0000000..9f15666 --- /dev/null +++ b/data/usage/tell @@ -0,0 +1,4 @@ +Command: tell +Purpose: send a message to an individual user +Usage: tell user message +Examples: tell mann How do I set up xboard? diff --git a/data/usage/time b/data/usage/time new file mode 100644 index 0000000..a955816 --- /dev/null +++ b/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/data/usage/unalias b/data/usage/unalias new file mode 100644 index 0000000..0d7753e --- /dev/null +++ b/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/data/usage/uncensor b/data/usage/uncensor new file mode 100644 index 0000000..b210da1 --- /dev/null +++ b/data/usage/uncensor @@ -0,0 +1,4 @@ +Command: uncensor +Purpose: remove a user (or all users) from your censor list +Usage: uncensor [user] +Examples: uncensor; uncensor mann diff --git a/data/usage/unexamine b/data/usage/unexamine new file mode 100644 index 0000000..f7914fe --- /dev/null +++ b/data/usage/unexamine @@ -0,0 +1,4 @@ +Command: unexamine +Purpose: stop your examination of a game +Usage: unexamine +Examples: unexamine diff --git a/data/usage/unnotify b/data/usage/unnotify new file mode 100644 index 0000000..a600a3e --- /dev/null +++ b/data/usage/unnotify @@ -0,0 +1,4 @@ +Command: unnotify +Purpose: remove a user (or all users) from your notify list +Usage: notify [user] +Examples: unnotify; unnotify Solid diff --git a/data/usage/unobserve b/data/usage/unobserve new file mode 100644 index 0000000..e55236f --- /dev/null +++ b/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; unobserve 25; unobserve GMKasparov diff --git a/data/usage/unpause b/data/usage/unpause new file mode 100644 index 0000000..a4a89f9 --- /dev/null +++ b/data/usage/unpause @@ -0,0 +1,4 @@ +Command: unpause +Purpose: restarts the clocks for a game that had been paused +Usage: unpause +Examples: unpause diff --git a/data/usage/uptime b/data/usage/uptime new file mode 100644 index 0000000..82d6ac8 --- /dev/null +++ b/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/data/usage/variables b/data/usage/variables new file mode 100644 index 0000000..7e23e40 --- /dev/null +++ b/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/data/usage/whisper b/data/usage/whisper new file mode 100644 index 0000000..aa3eaa4 --- /dev/null +++ b/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/data/usage/who b/data/usage/who new file mode 100644 index 0000000..f3a3941 --- /dev/null +++ b/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][A][l][t][v][n][1-3] +Examples: who; who 1; who s; who a; who as; who asA diff --git a/data/usage/withdraw b/data/usage/withdraw new file mode 100644 index 0000000..1d8207c --- /dev/null +++ b/data/usage/withdraw @@ -0,0 +1,5 @@ +Command: withdraw +Purpose: remove an offer you had previously made to another user +Usage: withdraw [1-n, all, abort, adjourn, draw, match, pause, player, + simul, switch, takeback] +Examples: withdraw 3; withdraw pause; withdraw Shaughn diff --git a/data/usage/xtell b/data/usage/xtell new file mode 100644 index 0000000..693fb32 --- /dev/null +++ b/data/usage/xtell @@ -0,0 +1,4 @@ +Command: xtell +Purpose: send a message to a user, but not affect current "tell" setting +Usage: xtell user message +Examples: xtell sms Thanks for your help! diff --git a/data/usage/znotify b/data/usage/znotify new file mode 100644 index 0000000..95886b8 --- /dev/null +++ b/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 +Usage: znotify +Examples: znotify diff --git a/data/uscf/ak b/data/uscf/ak new file mode 100644 index 0000000..ae562ca --- /dev/null +++ b/data/uscf/ak @@ -0,0 +1,4 @@ +ALASKA + +no information + diff --git a/data/uscf/al b/data/uscf/al new file mode 100644 index 0000000..c96ea38 --- /dev/null +++ b/data/uscf/al @@ -0,0 +1,9 @@ + +ALABAMA + +Jan. 27. Medieval Days Scholastic. 5-SS, G/30. Springville Rd Library, 1224 +Old Springville Rd, B'ham, AL. Primary: K-3. Elementary: K-6. Open: K-12. All, +EF: $10 by 1/20, $15 at site. Trophies to 1st-3rd ea. sect, top team section. +Reg. 9-10 am. Rds. 10:30-12-1:15-2:30-3:45. Ent: Dale W Robbins, 6092 +Lamplighter Way, Trussville, AL 35173 (205)250-3100 (205)655-1081. + diff --git a/data/uscf/ar b/data/uscf/ar new file mode 100644 index 0000000..453a3e7 --- /dev/null +++ b/data/uscf/ar @@ -0,0 +1,5 @@ + +ARKANSAS + +January 20. Hot Springs Classic. See Grand Prix. + diff --git a/data/uscf/az b/data/uscf/az new file mode 100644 index 0000000..59b8783 --- /dev/null +++ b/data/uscf/az @@ -0,0 +1,44 @@ + +ARIZONA + +Dec. 15. Cheap Action. 3-SS, G/30. U.S. Chess Center, 1501 M Street NW, +Washington, DC 20005. EF: $4, $2 USCC members. Reg. 6-6:50. Rd. 1 at 7 pm. +Info: (202)857-4922. NS. NC. W. + +Jan. 2, 9, 16, 23, 30. Chess Emp. Tues. Nite Master/Expert & Amateur. 5-SS, +45/120, SD/60. Chess Emporium, 13832 N 32nd St. #D-3, Phoenix, AZ 85032. +Master/Expert: open to 2000+. Amateur: open to U2000. Both, EF: $29, $25 club +membs. $$ 70% entries. Reg. 6-7 pm on 1/2. Rds. 7 pm each Tuesday. Site: same +as above. + +Jan. 4, 11, 18, 25. Chess Emp. "$50 to Winner" Action. 4 separate events! 4- +SS/RR, G/30. Chess Emporium, 13832 N 32nd St. #D-3, Phoenix, AZ 85032. Open to +all. EF: $17, $13 club membs. $$ 70% entries. Reg. 6-7 pm. Rds. 7-8-9-10 pm. +Tuesday. Site: same as above. + +Jan. 5, 19, 26. Chess Emp. Friday Action. 3 separate events! 3-SS/RR, G/30. +Chess Emporium, 13832 N 32nd St. #D-3, Phoenix, AZ 85032. Open to all. EF: +$17, $13 club membs. $$ 70% of entries. Reg. 6-7. Rds. 7-8-9 pm. Ent: same as +above. + +Jan. 6. 2nd Annual Arizona School Grade. 4-SS, G/1. Sabino High School, 5000 N +Bowes Rd. 10 sections: one for each grade K-8, and a high school section. EF: +$7 by 12/24, $12 after. Prizes: All K trophies; all other sections top 8 +individuals receive trophies. K-1 2 team trophies, 2-3 4 team trophies, 4-8 5 +team trophies, HS 4 team trophies. Top 3 scores in division constitute team +score. Reg. By mail before 1/1/96. Check in 7:30-8:15 am at site. Rd 1 at 9 +am, rest as available. Info: Robert Giffords (520)325-3067. Limited to 1st 400 +entries. Ent: SACA, PO Box 42407, Tucson, AZ 85733. NS. NC. W. + +Jan. 1, 20, 27. Chess Emp. Sat. Cheapo. 3 separate events! 3-SS/RR, 25/60, +SD/45. Chess Emporium, 13832 N 32nd St. #D-3, Phoenix, AZ 85032. EF: $13, $10 +club membs. $$ 70% entries. Reg. 11-12. Rds. 1-3-5 pm. Site: same as above. + +Jan. 7, 21, 28. Chess Emp. Sunday Full Action. 3 separate events! 4-SS/RR, +G/30. Chess Emporium, 13832 N 32nd St. #D-3, Phoenix, AZ 85032. Open to all. +EF: $17, $13 club membs. $$ 70% entries. Reg. 12-1. Rds. 1-2-3-4. Site: same +as above. + +January 12-14. Chess Emp. January Championship. See Grand Prix. January 12- +14. Tucson Open. See Grand Prix. + diff --git a/data/uscf/beginner b/data/uscf/beginner new file mode 100644 index 0000000..13da412 --- /dev/null +++ b/data/uscf/beginner @@ -0,0 +1,7 @@ + +BEGINNER + +Jan. 6 (GA). Woodward Academy, 1662 Rugby Ave, Atlanta. 4-SS, G/30. EF: $15 +for adults and $5 for students. All entry fees will go toward giving free USCF +memberships to top players. Reg. ends 12:30 pm. Info: $404)209-0694. NS. W. + diff --git a/data/uscf/ca_n b/data/uscf/ca_n new file mode 100644 index 0000000..48e6ab6 --- /dev/null +++ b/data/uscf/ca_n @@ -0,0 +1,39 @@ + +CALIFORNIA NORTHERN + +Dec. 17. Chess In Richmond Quad. 3-RR, 30/30, G/30. Richmond Public Library, +Community Room, 27th and MacDonald Ave in the Richmond Civic Center (from +Richmond BART, walk east on Nevin Ave). EF: $12, $2 discount to CalChess +members. Unrated players are grouped alphabetically. $$ 24 to 1st in each +quad. Reg. 10-10:45 am. All players must check in by 10:45 so quads may be set +and play can begin at 11 am sharp. Please be on time! Rds. 11-1-3. Bring set, +board, and clock. Ent: TD John Easterling, 4617 Cutting Blvd, Richmond, CA +94804. (510)529-0910. NS. NC. + +Jan. 1 (QC). Modesto Winter Quick Insanity '96. G/10. Jack In The Box, +Briggsmore & McHenry, Modesto. EF: $16 by 12/30/95, $20 at site. Plaques to +"Most Insane" (Best Performance), "Most Deranged" (Best Percentage), +"Craziest" (Most Games Played). Distributed after USCF readout is rec'd. +Modesto Record: 65 games (59-1-5). Reg. 7-3. Rds. 7-11 (You may start later, +leave early or be in and out during the day, but 20 games must be played for +prize eligibility. Info: John or Diane (209)533-8222. Ent: SJVCC, Box 5252, +Sonora, CA 95370-2252. NS. NC. W. January 13-15. 1996 3rd Annual CalChess +Season Opener. See Grand Prix. Jan. 14. 2nd West Coast Scholastic Chess +Conference. 5-SS, G/30. Holiday Inn Select, 1221 Chess Dr., Foster City, CA +94404 (five miles south of SF Airport). In Two Divisions: Unrated: K-3, 4-6, 7- +8, 9-12. Under 1200: U1200, U1100, U1000, U900, U800, U700, U600. EF: $20, $40 +after 01/09/96. Checks payable to: CalChess Tournaments. Reg. 8:30-9:30 am. +Rds. 10-11:15-12:30-1:45-3. HR: $69 (415)570-5700 ask for "chess rate." Info: +Tom Dorsch (510)481-5351. Ent: CalChess Tournaments, PO Box 3294, Hayward, CA +94540-3294. + +Jan. 21. Central California Scholastic Winter Quads '96. 3-RR, G/30. Sonoma +Elementary School, Modesto, Hwy 99, E/Briggs-more, S/Oakdale, E/Orangeburg, +S/Sonoma. King Section: EF: $12 by 1/19, $17 at site. Prizes: Large plaques +w/king figurines to 1st in each 4 player section. Clock Section: EF: $22 by +1/19, $27 at site. Prizes: Inscribed Official USCF Master Quartz Chess Clock +to 1st in each 4 player section. Both, Ties played off with pairs of G/10 +rated. All receive participation certificates. Reg. 12 noon. All participants +must be present at 12:30. Rds. 1 pm ongoing. Ent: SJVCC, PO Box 5252, Sonora, +CA 95370-2252. John C. Barnard (209)533-8222. + diff --git a/data/uscf/ca_s b/data/uscf/ca_s new file mode 100644 index 0000000..b88e363 --- /dev/null +++ b/data/uscf/ca_s @@ -0,0 +1,95 @@ + + +CALIFORNIA SOUTHERN + + + +Dec. 16. Chess Palace Saturday Quads. 3-RR, 30/60, SD/60. Chess Palace, 3255 E. South St. #205, Long Beach, CA 90805. 4-player sections by rating. EF: $16, $11 Chess Palace club members. Prizes: $40/quad. Reg. 11-11:20 am. Rds. 11:30 on. Info: Charles Rostedt. (310)634-8477. + + + +Dec. 17. Chess Palace Sunday Action. 5-SS, G/30. Chess Palace, 3255 E. South St. #205, Long Beach, CA 90805. EF: $15, $10 Chess Palace club members. Prizes per entries. Reg. 11:30-12. Rds. 12-1:15-2:30-4:15-5:30. Info: Charles Rostedt. (310)634-8477. + + + +Dec. 21. Chess Palace Thursday Action Quads. 3-RR, G/30. Chess Palace, 3255 E. South St. #205, on Beach, CA 90805. 4-player sections by rating. EF: $16, $11 Chess Palace club members. Prizes: $40/quad. Reg. 7-7:30 pm. Rds. 7:30-8:30-9:30. Info: Charles Rostedt. (310)634-8477. + + + +Dec. 23. Chess Palace Saturday Quads. 3-RR, 30/60, SD/60. Chess Palace, 3255 E. South St. #205, Long Beach, CA 90805. 4-player sections by rating. EF: $16, $11 Chess Palace club members. Prizes: $40/quad. Reg. 11-11:20 am. Rds. 11:30 on. Info: Charles Rostedt. (310)634-8477. + + + +Dec. 24. Chess Palace Sunday Action. 5-SS, G/30. Chess Palace, 3255 E. South St. #205, Long Beach, CA 90805. EF: $15, $10 Chess Palace club members. Prizes per entries. Reg. 11:30-12. Rds. 12-1:15-2:30-4:15-5:30. Info: Charles Rostedt. (310)634-8477. + + + +Dec. 28. Chess Palace Thursday Action Quads. 3-RR, G/30. Chess Palace, 3255 E. South St. #205, Long Beach, CA 90805. 4-player sections by rating. EF: $16, $11 Chess Palace club members. Prizes: $40/quad. Reg. 7-7:30 pm. Rds. 7:30-8:30-9:30. Info: Charles Rostedt. (310)634-8477. + + + +Dec. 30. Chess Palace Saturday Quads. 3-RR, 30/60, SD/60. Chess Palace, 3255 E. South St. #205, Long Beach, CA 90805. 4-player sections by rating. EF: $16, $11 Chess Palace club members. Prizes: $40/quad. Reg. 11-11:20 am. Rds. 11:30 on. Info: Charles Rostedt. (310)634-8477. + + + +Dec. 31. Chess Palace Sunday Action. 5-SS, G/30. Chess Palace, 3255 E. South St. #205, Long Beach, CA 90805. EF: $15, $10 Chess Palace club members. Prizes per entries. Reg. 11:30-12. Rds. 12-1:15-2:30-4:15-5:30. Info: Charles Rostedt. (310)634-8477. + + + +Jan. 3-31. Chess Palace Wednesday Knights. 5-SS, 40/90, 30/60. Chess Palace, 3255 E South St. #205, Long Beach, CA 90805. EF: $15, $10. Chess Palace club membs. $5 more after 1/2. Prizes per entries. Info: Charles Rostedt (310)634-8477. + + + +Jan. 4. Chess Palace Thursday Action Quads. 3-RR, G/30. Chess Palace, 3255 E South St. #205, Long Beach, CA 90805. 4-player sections by rating. EF: $16, $11 Chess Palace club membs. Prizes: $40/quad. Reg. 7-7:30 pm. Rds. 7:30-8:30-9:30. Info: Charles Rostedt (310)634-8477. + + + +Jan. 5-Feb. 9. Pasadena Master's Tournament. 6-SS, 40/2, 20/1, G/30. Senior Citizens Center, 85 E Holly St., Pasadena, CA. Masters: open to 2200 and above. EF: FIDE rated players $30, others $40. $$ (1000 G): 500-300-200. Reg. 7:15 pm 1/5. Rds. 7:30 pm. FIDE rated rds played on consecutive Friday evenings starting at 7:30 pm. Prize fund will be increased entries permitting. Ent: Pasadena Chess Club, c/o Neilen Hultgren, 1146-B Western, Glendale, CA 91201. (818)243-3809. NS. FIDE. + + + +Jan. 5-Feb. 9. Pasadena Rating Tournament. 6-SS, 40/90, G/30. Senior Citizens Center, 85 E Holly St., Pasadena, CA. Open: to all. EF: $10 club membs, $13 non-membs. $$ 80% of entry fees returned as prizes. Reg. 1/5 7:15 pm. Rds. 7:30 pm. 6 rds played on consecutive Friday evenings. Ent: Pasadena Chess Club, c/o Neilen Hultgren, 1146-B Western, Glendale, CA 91201. (818)243-3809. NS. + + + +Jan. 6. "Chess For Juniors" January Scholastic. 4-SS, G/45. Chess For Juniors Center, 15081 Goldenwest, Huntington Beach, CA 92647. 2 sections. Beginning: open to grades K-9, U1000. Advanced: open to grades K-12. Both, EF: $27 if rec'd by 12/30 (non refundable), $30 after 12/30. $15 discount to CFJ members, school teams of 4+, or if traveling 60+ miles. Reg. 8:30-8:45 am. Info/phone entries (Visa/MC/ Disc/AmEx): Robert Snyder (714)531-5238. Ent: CFJ, PO Box 29, Midway City, CA 92655. NS. NC. W. + + + +Jan. 6. Chess Palace Saturday Quads. 3-RR, 30/60, SD/60. Chess Palace, 3255 E South St. #205, Long Beach, CA 90805. 4-player sections by rating. EF: $16, $11 Chess Palace club membs. Prizes: $40/quad. Reg. 11-11:20 am. Rds. 11:30 on. Info: Charles Rostedt (310)634-8477. + + + +Jan. 7. Old Irvine Octos. 3-SS, 40/90, SD/30. Lakeview Senior Ctr., 20 Lake Rd., Irvine, CA 92714. 8 player sections by rating. EF: $20 adv., $25 at site. $$ Prizes per entries. Reg. 9:15-10. Rds. 10:30-3-7. Ent: Michael Carr, 25601 Chrisanta Dr., Mission Viejo, CA 92691. (714)768-3539. NS. NC. Jan. 7. Chess Palace Sunday Action. 5-SS, G/30. Chess Palace, 3255 E South St. #205, Long Beach, CA 90805. EF: $15, $10 Chess Palace club membs. Prizes per entries. Reg. 11:30-12. Rds. 12-1:15-2:30-4:15-5:30. Info: Charles Rostedt (310)634-8477. Jan. 11. Chess Palace Thursday Action Quads. 3-RR, G/30. Chess Palace, 3255 E South St. #205, Long Beach, CA 90805. 4-player sections by rating. EF: $16, $11 Chess Palace club membs. Prizes: $40/quad. Reg. 7-7:30 pm. Rds. 7:30-8:30-9:30. Info: Charles Rostedt (310)634-8477. + + + +Jan. 13. Chess Palace Saturday Quads. 3-RR, 30/60, SD/60. Chess Palace, 3255 E South St. #205, Long Beach, CA 90805. 4-player sections by rating. EF: $16, $11 Chess Palace club members. Prizes: $40/quad. Reg. 11-11:20 am. Rds. 11:30 on. Info: Charles Rostedt (310)634-8477. + + + +Jan. 14. Chess Palace Sunday Action. 5-SS, G/30. Chess Palace, 3255 E South St. #205, Long Beach, CA 90805. EF: $15, $10 Chess Palace club membs. Prizes per entries. Reg. 11:30-12. Rds. 12-1:15-2:30-4:15-5:30. Info: Charles Rostedt (310)634-8477. Jan. 18. Chess Palace Thursday Action Quads. 3-RR, G/30. Chess Palace, 3255 E South St. #205, Long Beach, CA 90805. 4-player sections by rating. EF: $16, $11 Chess Palace club membs. Prizes: $40/quad. Reg. 7-7:30 pm. Rds. 7:30-8:30-9:30. Info: Charles Rostedt (310)634-8477. + + + +Jan. 20-21. Chess Palace January Grand Prix. See G.P. Jan. 25. Chess Palace Thursday Action Quads. 3-RR, G/30. Chess Palace, 3255 E South St. #205, Long Beach, CA 90805. 4-player sections by rating. EF: $16, $11 Chess Palace club members. Prizes: $40/quad. Reg. 7-7:30 pm. Rds. 7:30-8:30-9:30. Info: Charles Rostedt (310)634-8477. + + + +Jan. 27. Chess Palace Saturday Quads. 3-RR, 30/60, SD/60. Chess Palace, 3255 E South St. #205, Long Beach, CA 90805. 4-player sections by rating. EF: $16, $11 Chess Palace club members. Prizes: $40/quad. Reg. 11-11:20 am. Rds. 11:30 on. Info: Charles Rostedt (310)634-8477. + + + +Jan. 28. Chess Palace Sunday Action. 5-SS, G/30. Chess Palace, 3255 E South St. #205, Long Beach, CA 90805. EF: $15, $10 Chess Palace club members. Prizes per entries. Reg. 11:30-12. Rds. 12-1:15-2:30-4:15-5:30. Info: Charles Rostedt (310)634-8477. February 3-4. Balboa Open. See Grand Prix. + + + +February 17-19. 13th Annual U.S. Amateur Team Championship West. See National Events + + + +March 1-3. 4th Annual Pacific Coast Open. See G. P. + + + + \ No newline at end of file diff --git a/data/uscf/co b/data/uscf/co new file mode 100644 index 0000000..cff6ea9 --- /dev/null +++ b/data/uscf/co @@ -0,0 +1,10 @@ +COLORADO + +Dec. 2-3. Winter Springs Open. 4-SS, 40/2, 20/1, 20/1. Ramada Inn, I-25 & +Garden of the Gods Rd, Colorado Springs. 3 sections. June: open to all. +July: open to U1800/Unr. August: Open to U1400/Unr. All, prizes per +entries. EF: $25 if rec'd by 11/30, $30 at site, $6.25 off for Jrs, Srs, +Unr. Reg. 8:30-9:30. Rds. 10-4, 9-3. CSCA req'd $12, $6 jrs, OSA. HP: +594-0700. Some housing available. Ent: Richard Buchanan, 308 Ruxton Ave, +Manitou Springs, CO 80829. (719)685-1984. NS. NC. W. + diff --git a/data/uscf/ct b/data/uscf/ct new file mode 100644 index 0000000..92fd1e0 --- /dev/null +++ b/data/uscf/ct @@ -0,0 +1,72 @@ + +CONNECTICUT + +Dec. 16. Danbury 3rd Saturday Sectionals. 3-SS, 30/75, SD/60. Quality Inn (I- +84 Exit 8 next to Berkshire Shopping Center), Danbury CT. Sections b/number of +entries, ratings. EF: $22. $$ (b/8): 60-30-10. Possible RR in lowest section +(G/60 in RR). Reg. 8:30-9:15 am. Rds. 9:30 & ASAP. HR: $54 (203)748-6677. NS. +NC. W. + +Dec. 17 (QC). Mickey Mantle Memorial. 4-SS, G/25. Robin Ridge, 990 West Main +St. (I-84 exit 18), Waterbury, CT. 2 sections: Open, EF: $20. $$ 120-40. +Reserve: open to U1800, no unrateds. EF: $10. $$ 40-20. Both, Reg. 12:15- +12:45. Rds. 1-2-3-4. CT memb. req'd $4/yr. OSA. TD: Rob Roy. Info: Joe Bitto, +(203)756-3289. NS. NC. W. + +Jan. 11, 18, 25, Feb. 1, 8. The Roland Rossano Memorial. 5-SS, 35/90, 25/60. +UCONN Math Sciences Bldg., Math Faculty Lounge, Auditorium Road, Storrs, CT. +EF: $10, $5 students. $$ 50%-30%, top U2000 20%. Reg. 7-7:30 pm. Rds. 7:30 pm. +Ent: Tom Hartmayer, 59 Brook St., Willimantic, CT 06226. (203)423-1384. NS. + +Jan. 13. 15th Elm City Chess Club 2nd Sat. Sectionals. 3-SS, 30/60, SD/60. St. +Paul's Church, 57 Olive St., New Haven, CT 06511. 2 sections b/ratings: Open +and Reserve. Both, EF: $17 ($7/entry deducted for expenses). $$ 50%-30%-20%, +prizes b/$10 per entry. Reg. 9:15-9:30. Rds. 9:30-1-4:30. Ent: John E. Koch +Jr., 145 Peddlers Dr., Branford, CT 06405. (203)483-0820. NS. NC. NW. + +Jan. 14 (QC). 1996 Connecticut Quick-Chess Championship. 4-SS, G/25. Robin +Ridge, 990 West Main St. (I-84 exit 18), Waterbury, CT. 3 sections. Open: Open +to all. EF: $20. $$ 120-40. Reserve: open to U1800, no unrateds. EF: $10. $$ +40-20. Novice: open to U1400 & unrated. EF: $5. All, Reg. 12:15-12:45. Rds. 1- +2-3-4. CT memb. req'd $4/yr, OSA. Title trophy to top CT resident each sect, +Solkoff tiebreak. TD: Rob Roy. Info: Joe Bitto, (203)756-3289. NS. NC. W. + +Jan. 20-21. 1996 Connecticut Winter Classic. 4-SS. Wesleyan Univ Campus +Center, 222 Church St., Middletown, CT. 3 sections. Open: 40/2, SD/60. EF: +$34. $$ (b/15): 200-100, top Expert $75, more per entries. Reg. 9-9:45 am. +Rds. 10-4 each day. Reserve: open to U2000, no Unrateds. 30/90, SD/60. EF: +$29. $$ (b/15): 150-75, U1800 $75, more per entries. Reg. 10-10:45 am. Rds. 11- +4, 10-3. Novice: (1/20 only) open to U1600/Unr G/60. EF: $18. $$ (b/15) 100- +50, more per entries. Reg. 11-11:45 am. Rds. 12-2-4-6. All, EF $7 more if not +rec'd by 1/14. CCI memb. req'd. $4/yr, OSA. Title trophy to top CT resident +each section, Solkoff tiebreak. Ent: Rob Roy, PO Box 4726, Waterbury CT 06704- +0726. No phone entries. NS. W. + +Jan. 27-28. UCONN Invitational - Certamen Valentium. 4-SS, 30/90, 25/60, +SD/60. UCONN Student Union S CT Rm (3rd Flr), Fairfield Rd, Storrs CT. Open: +EF: $35 by 1/25, $40 at site. $$(500 b/20): 200-150-100, U2200 50. Reg. 9- +10:15. Rds. 10:30-4:30, 10-4. Prizes increased as entries allow. Anyone +interested in playing should request an invitation Valens solum superabit! +Ent: Tom Hartmayer, 59 Brook St., Willimantic, CT 06226. (860)423-1384. NS. + +Jan. 27 (QC). Southeastern Connecticut Quick Chess. 3-SS, G/25. Waterford +Public Library, 49 Rope Ferry Rd, Waterford, CT. 8-12 player sections. EF: $5 +(cheap). $$ 25 b/8. Reg. 9:15-9:30. Rds. 9:45 then ASAP. Info: (203)536-1027. +LS. NC. W. + +Feb. 9-11. UCONN Open (2 Day Option Rd. 1 G/60). 5-SS, 30/90, 25/60, SD/60. +UCONN Student Union South (3rd Fl. Connecticut Room) Hillside Road, Storrs, +CT. $$ (1075 b/56). 2 sections. Open: open to all. EF: $30 if rec'd by 2/7, +$33 at site. $$ (625 b/28): 175-125, top U2200 $100, top U2000 $100-75-50. +Reserve: open to U1800. EF: $25 if rec'd by 2/7, $28 at site. $$ (450 b/28): +100-75-50, top U1600 100-75-50. Both, Prizes increased as entries allow. 3-day +schedule: Reg. 6-7 pm 2/9. Rds. 7:30, 12-6, 10-4. 2-day schedule: Reg. 8-9 am +2/10. Rd. 1 G/60 at 9:30 am, then merges with 3-day. Half-point bye available +rds. 1-3 with advance notice. Ent: Tom Hartmayer, 59 Brook St., Willimantic, +CT 06226. (860)423-1384. NS. Feb. 10. 151st Elm City Chess Club 2nd Sat. +Sectionals. 3-SS, 30/60, SD/60. St. Paul's Church, 57 Olive St., New Haven, CT +06511. 2 sections b/ratings: Open and Reserve. Both, EF: $17 ($7/entry +deducted for expenses). $$ 50%-30%-20%, prizes b/$10 per entry. Reg. 9:15- +9:30. Rds. 9:30-1-4:30. Ent: John E. Koch Jr., 145 Peddlers Dr., Branford, CT +06405. (203)483-0820. NS. NC. NW. + diff --git a/data/uscf/dc b/data/uscf/dc new file mode 100644 index 0000000..d6fad4b --- /dev/null +++ b/data/uscf/dc @@ -0,0 +1,35 @@ + +DIST. OF COLUMBIA + +December 27-30 or 28-30. 22nd Annual Eastern Open. See Grand Prix. Dec. 31. +End of Year Scholastics. Open to Grades K-12. 4-SS, G/30. U.S. Chess Center, +1501 M Street NW, Washington, DC 20005. EF: $20, $18 Center members, $2 off if +by 12/23. All players receive t-shirt and come to post-tourney pizza party, +plus trophies and other prizes to winners. Reg. 11-11:45. Rds. 12-1:30-2:30- +3:30. Info: (202)857-4922. NS. W. + +Jan. 4, 11, 18 & 25. January Thursdays. U.S. Chess Ctr, 1501 M St. NW, +Washington, DC. 20005. 3-SS, 30/1, SD/1. EF: $14, $9 Center members. Reg. 6- +6:50. Rds. 7 pm each Tuesday. Info: (202)857-4922. NS. NC. W. Jan. 6. Pan +American Action Open. 5-SS, G/1. 1889 F St. NW, Washington, DC 20570. Open to +all. EF: $12 at site, $6 students-seniors. $$ 175 b/25 entries. Reg. 9:30. +Bring sets & clocks. NS. NC. W. + +Jan. 9. Metro Quad. U.S. Chess Center, 1501 M St. NW, Washington, DC. 3-RR, +G/30. EF: $25, $15 Center members. $$ 50/quad. Reg. 6-6:50. (202)857-4922. + +Jan. 16. Cheap Action. 3-SS, G/30. U.S. Chess Center, 1501 M St. NW, +Washington, DC 20005. EF: $4, $2 USCC membs. Reg. 6-6:50 pm. Rd 1 at 7 pm. +Info: (202)857-4922. NS. NC. W. January 20-21. Metro Swiss. See Grand Prix. +Jan. 27. Scholastic Warm Up. 4-SS, G/30. U.S. Chess Center, 1501 M St. NW, +Washington, DC 20005. EF: $7, $5 Center membs by 1/20, $10 at site. Reg. 11:30- +12:15. Info: (202)857-4922. + +Jan. 9. Metro Quick. U.S. Chess Center, 1501 M St. NW, Washington, DC. 5-SS, +G/10. EF: $20, $12 Center members. $$ 80% of member prices of EF. Reg. 6-6:50. +(202)857-4922. + +Feb. 2. Pan American Action Open. 5-SS, G/1. 1889 F St. NW, Washington, DC +20570. Open to all. EF: $12 at site, $6 students-seniors. $$ 175 b/25 entries. +Reg. 9:30. Bring sets & clocks. NS. NC. W. + diff --git a/data/uscf/de b/data/uscf/de new file mode 100644 index 0000000..83ef1cb --- /dev/null +++ b/data/uscf/de @@ -0,0 +1,12 @@ + +DELAWARE + +Jan. 20. Delaware Scholastic Championship. 4-SS, G/30. St. Paul's Church, +Camden (from Dairy Queen, US-13 & DE-10, west on DE-10, right at first light, +left at next light, 1/4 mile on left). 3 sections (min. of six players to make +sect). High School: open to grades 9-12. Middle School: open to grades 5-8. +Elementary School: open to grades K-4. All, EF: $7 by 1/18, $10 at site. DCA +memb. req'd. Age 19 $10, Scholastic $5, OSA. Trophies to 1st. Reg. 8:30-9:15. +Rds. 9:45-11-1:15-2:30. Ent: Kent County Parks & Rec., 414 Federal St., Dover, +DE 19901. (302)736-2090. NS. NC. W. + diff --git a/data/uscf/fl b/data/uscf/fl new file mode 100644 index 0000000..953e4fe --- /dev/null +++ b/data/uscf/fl @@ -0,0 +1,24 @@ + +FLORIDA + +Dec. 16. Orlando December Tornado. 4-SS, 40/1, SD/30. Melody Manor, 813 +Montana St., Orlando. $$(440 b/30). EF: $20 if rec'd by 12/14, $25 at site. $$ +440: 150-80-60, A,B,C/below each $50. Rds. 10-1-4-7. Reg. 9-9:45. Ent: CFCC, +c/o Harvey Lerman, 921 Thistle Lane, Maitland, FL 32751. (407)644-3542. NS. +NC. + +Dec. 30. Last of '95 Swiss. 4-SS, G/60. Port Charlotte Culture Center, 2280 +Arron St., Port Charlotte, FL 33952. EF: $12 in advance or PCCC memb, $15 at +site. $$ (b/70%). Reg. 9-9:45. Rds. 10-12:15-2:30-4:45. Ent: Ed Carpenter, +3501 Tropicaire Blvd, North Port, FL 34287. (941)423-1581. NS. NC. W. Jan. 7. +Gainesville Jan. Tornado. 4-SS, 40/1, SD/30. Reitz Union, U. of Florida, +Gainesville. EF: $20 by 1/4, $25 at site. $$ (330 b/20): 80-60-40, A,B,C,D,E +each $30. Reg. 9-9:45 am. Rds. 10-1-4-7. Ent: Gainesville Chess Club, c/o Tim +Hartigan, 4515 NW 41st Ln, Gainesville, FL 32606. Info only: (904)371-6517. +NS. NC. W. Jan. 12-14. 1996 Florida Class Championships. See G. P. Jan. 20. +1st '96 Swiss. 4-SS, G/60. Port Charlotte Culture Center, 2280 Arron St., Port +Charlotte, FL 33952. EF: $12 in advance or PCCC memb, $15 at site. $$ (b/70%). +Reg. 9-9:45. Rds. 10-12:15-2:30-4:45. Ent: Ed Carpenter, 3501 Tropicaire Blvd, +North Port, FL 34287. (941)423-1581. NS. NC. W. February 3-5. 7th Annual +Tallahassee Open. See G.P. + diff --git a/data/uscf/foreign b/data/uscf/foreign new file mode 100644 index 0000000..924d741 --- /dev/null +++ b/data/uscf/foreign @@ -0,0 +1,7 @@ + +FOREIGN + +Feb. 10. Montreal Bohemienne Quads. 3-RR, G/60. Cafe Bohemienne, 6050 Monkland +Ave, Montreal, Quebec, Canada H4A 1H2. Quads open to all. EF: $10. $$ 25/quad. +Reg. 10-10:45. Rds. 11-2-4:30. Info: (514)487-6002. NS. NC. + diff --git a/data/uscf/ga b/data/uscf/ga new file mode 100644 index 0000000..1f5dbd7 --- /dev/null +++ b/data/uscf/ga @@ -0,0 +1,72 @@ + +GEORGIA + +December 15-17. 25th Annual Atlanta Open. See G.P. Dec. 16-17. Augusta Winter +Smash. 5-SS, 35/90, SD/60. Augusta Chess Club, 807 Shartom Drive, Augusta, GA. +(706)650-9170. (Exit I-20 at Washington Road West. Go North on Washington Road +to Shartom Drive approx. 1/2 mile from I-20 Augusta Business Center, behind +Applebees). EF: $25 by 12/9, $30 at site, $10 for scholastic players who play +for trophies only. $$ (b/25 entries): 125-75-50, A,B,C,U1400 $75 each, +Scholastic 1st-3rd Trophy each. Reg. 8-9:30. Rds. 10-2-7, 9-2:30. Ent: Donny +Gray, 3001 Hummingbird Lane, Augusta, GA 30906. (706)790-5602. + +Dec. 30. 1995 December A.C.C. G/30 Championship. 6-SS, G/30. Atlanta Chess +Center, 3155 E Ponce de Leon Ave, Scottdale, GA 30079. EF: $25, $22 membs, +free to Unr. $$(b/27): 100-50, Expert,A,B,C,D/E each $50. Cash is based on +paid entries. Reg. ends 10:30. Rds. 11-12:30-2-3:30-5-6:30. Info: (404)377- +4400. Ent: same as above. NS. NC. + +Dec. 31. 1995 December A.C.C. G/1 Championship. 4-SS, G/1. Atlanta Chess +Center, 3155 E Ponce de Leon Ave, Scottdale, GA 30079. EF: $25, $22 to membs, +free to Unr. $$ (b/27): 100-50, Expert,A,B,C,D/E each $50. Cash is based on +paid entries. Reg. ends 10:30. Rds. 11-1:30-4-6:30. Info: (404)377-4400. Ent: +same as above. NS. NC. + +Jan 6. Winter Championship. Woodward Academy, 1662 Rugby Ave, Atlanta. 2 +sections. Open: to all. 6-SS, G/30. EF: $10. $$ 80% of EFs to 1st,2nd, and +class prizes. Reg. ends 10:40. Rds. 10:50-12:00-1:10-2:20-3:30-4:40. +Scholastic: open to K-12. 4-SS, G/30. EF: $5. Trophies to top students and +teams in each age group. Reg. ends 12:30. Info: (404)209-0694. NS. W. + +Jan. 7. 1996 Atlanta January G/1. 4-SS, G/1. Atlanta Chess Center, 3155 East +Ponce de Leon Ave, Scottdale (Atlanta), GA 30079. EF: $25, $22 to membs. $$ +(b/25): 100-50, Expert, A,B,C/D/E each $50. Reg. ends 10:30 am. Rds. 11-1:30-4- +6:30. Ent: at site. NS. NC. + +Jan. 13. Atlanta Chess Center January Scholastic. 4-SS, G/30. Atlanta Chess +Center, 3155 East Ponce de Leon Ave, Scottdale (Atlanta), GA 30079. In 4 +sections. High School: 10-12. Junior High: K-9. Elementary: K-6. Primary: K-3. +All, EF: $6 by 12/2, $7 at site. USCF memb. req'd $7. Trophies to top three +individuals, best team. Reg. 12:15-1 pm. Rds. 1:30-2:45-4-5:15. Awards +ceremony at 6:30 pm. Info: (404)377-4400. Ent: at site. NS. NC. + +Jan. 19-21. 1996 Atlanta Winter Congress. 5-SS, 35/90, SD/60. Atlanta Chess +Center, 3155 East Ponce de Leon Ave, Scottdale, GA 30079. $$ (2,275 b/85). In +3 sections. Open: to all. EF; $35 by 1/16. $$ 300-250-200, U2200 $150-100-75. +Under 2000: open to U2000, no unrateds. EF: $35 by 1/16. $$ 150-100-75, U1800 +$150-100-75. Reserve: open to U1600/Unr. EF: $31 by 1/16. $$ 150-125-75, +U1400, Unr. each $100. All, EF $5 more at site. Jrs U16 may pay $10 and play +for trophies only! GCA memb req'd $10, OSA. Unrateds may win Open or Unrated +prizes in Reserve only! Reg. ends at 9;45 am. Rds. 10:15-3-8, 10-3:30. Half- +point byes available in any rd (limit three) if requested before rd 1, add $1 +for each, no changes. Info: (912)742-5607 or 377-4400. Ent: American Chess +Promotions, 3055 General Lee Rd, Macon, GA 31204. NS. NC. + +Feb. 10. 1996 Atlanta February G/1. 4-SS, G/1. Atlanta Chess Center, 3155 East +Ponce de Leon Ave, Scottdale (Atlanta), GA 30079. EF: $25, $22 to membs. $$ +(b/25): 100-50, Expert, A, B, C/D/E each $50. Reg. ends 10:30 am. Rds. 11-1:30- +4-6:30. Ent: at site. NS. NC. + +Feb. 11. 1996 A.C.C. February Scholastic. 4-SS, G/30. Atlanta Chess Center, +3155 East Ponce de Leon Ave, Scottdale (Atlanta), GA 30079. In 4 sections: +High School: 10-12, Junior High: K-9. Elementary: K-6. Primary: K-3. All, EF: +$8. Trophies to the top three in each section (b/8 in each section). Reg. +12:15-1 pm. Rds. 1:30-2:45-4-5:15. Awards ceremony at 6:30. Ent: same as +above. NS. NC. + +Feb. 11. 1996 Atlanta February G/30 Championship. 6-SS, G/30. Atlanta Chess +Ctr., 3155 E. Ponce de Leon Ave, Scottdale (Atlanta), GA 30079. EF: $25, $22 +to membs, free to Unr. $$ (b/27): 100-50, Expert, A, B, C, D/E each $50. Cash +is based on paid entries. Reg. ends 10:30 am. Rds. 11-12:30-2-3:30-5-6:30. +Info: (404)377-4400. Ent: same as above. NS. NC. + diff --git a/data/uscf/gran_prix b/data/uscf/gran_prix new file mode 100644 index 0000000..a8bc9cb --- /dev/null +++ b/data/uscf/gran_prix @@ -0,0 +1,791 @@ + +GRAND PRIX + +A Heritage Event Dec. 15-17 GPP: 20 Georgia 25th Annual Atlanta Open. 5-SS, +35/90, SD/1 (2-day option rd. 1 G/90). Atlanta Chess and Game Center, 3155 +East Ponce de Leon Ave, Scottdale, GA 30079. $$ (7500 b/150, 50% G). In 6 +sections: Open, EF: $65 if postmarked by 11/10, $70 at site. $$ 600-400-300- +200. U2000 $400-300-200-100. Under 2000, EF: $59 if sent by 11/10, $65 at +site. $$ 500-400-200-100. Under 1800, EF: $58 if sent by 11/10, $65 at site. +$$ 500-400-200-100. Under 1600, EF: $57 if sent by 11/10, $65 at site. $$ 500- +400-200-100. Under 1400, EF: $56 if sent by 11/10, $65 at site. $$ 500-400-200- +100, U1200 $200. Unrateds, EF: $10 at site. Trophies to 1st through 5th. All, +Trophies to 1st through 5th, trophies to first in each class. Players whose +USCF class numbers indicate a former rating of 101 or more points over group +may not win more than 1/2 of any prize, or may elect to play up. Reg. 6-8 pm +11/17, 8:30-9:30 am 11/18. Rd. 1 at 8:30 11/17, 10 am 11/18. Rds. 2-5, 2-7:30, +9-2:30. Mention with entry when you will play the first round! If you lose +Friday night, you may re-enter Saturday for $20. Half-point bye available in +any round if requested in advance, add $1, no changes. HR: inquire. Info: +David Spinks (404)377-4400 or L. Thad Rogers (912)742-5607. Ent: Atlanta Chess +and Game Center, 3155 East Ponce de Leon Ave, Scottdale, GA 30079. NS. NC. + +Dec. 19-Jan. 9 or Jan 2,9 GPP: 10 New York 3rd Annual Max Euwe Open. 4-SS, +30/90, SD/60. Chess Center at the Marshall Club, 23 W 10th St., bet. 5-6th +Ave., NYC. EF: $35, membs. $25, $5 less to players on any 12/95 USCF Top 50 +List. Top 2 Open prizes Guaranteed, others b/40 total. 2 sections: Open: $$ +200-110-50, Top U2200/Unr. $100. Under 2000: 160-80, top U1800 $100, $80 limit +to unr. Both, byes OK all, limit 2 (byes rds. 3-4 must commit before rd. 2). +Choice of 2 schedules: 4-week option, rds. 7:45 pm each Tue., 12/19/95-1/9/96; +2-week option, rds. 5:30-6:40-7:45 1/2/96, 7:45 pm 1/9/96 (rds 1-2 of 2-week +schedule only are G/30, NC), both merge rd. 3. Re-entry $20, counts as 1/2 +entry. Reg. ends 15 min. before game. CCA Ratings used, class pairings OK rd. +4. Info: (212)477-3716. NS. FIDE. Dec. 23 GPP: 6 Missouri 1995 Saint Louis +Open and Reserve. 4-SS, G/90 (both sections). Radisson Hotel, 7750 Carondelet, +Clayton, MO 63105. (Clayton is an elegant suburb of Saint Louis). The total +prize fund of $2000 ($1000 in each section), is unconditionally guaranteed!! +Open Section: open to everyone. 1st overall $300, Expert $150-50, Class A $150- +50, Class B $150-50, U1600 $75-25. (Please note: Unrateds may play in the Open +Section, but are not eligible for the Under 1600 Class Prize. They are only +eligible for the 1st Overall Place Prize.) Reserve Section: open to U1600. 1st +overall $300, Class C $150-50, Class D $150-$50, Class E $150-50, Unrated $75- +$25. (Please note: Unrateds may play in the Reserve Section, but are not +eligible for the 1st Overall Place Prize, only eligible for Unrated Class +Prizes.) Reg. 7:30-9 am. Rds. 9:30-12:30-4-7:30 (both sections). EF: $30 by +mail, $40 at door. Scholastics (K-12) may pay 1/2 of either adult entry fee +and play for 1/2 of any adult prize, with the rest going to the next person(s) +in line. Scholastics may pay full adult entry fees and play for full adult +prize(s). One half-point bye allowed in any round in both sections, but must +be declared before first round pairings are made, and cannot be revoked. +Playing sites are the London and Sutton Rooms. Registration and TD's table in +London Room. For room rates and reservations only, call hotel at: (314)726- +5400. Mention chess tournament. Make all checks payable to "Bill Moushey." +Missouri Chess Association membership not req'd, but certainly appreciated. +Ent/Info: Bill Moushey, 4255 Louisiana Ave, Saint Louis, MO 63111. +(314)353PAWN (7296). NS. NC. W. + +Dec. 23 GPP: 10 New York Happy Holidays, New York! 4-SS, G/60. Holiday +Center of New York at the Marshall Club, 23 W 10th St., bet. 5-6th Ave., NYC. +EF: $30, membs. $25, $5 less to players on any 12/95 USCF Top 50 Rating List. +$$ (Top 2 prizes Guaranteed, others b/42): 250-120-70, Top 2200-2399/Unr., +2000-2199, 1800-1999, Under 1800 each 100. Byes OK all, limit 2 (rds. 3-4 must +commit before rd. 2, limit one bye for U2000 prizes). Re-entry $15, counts as +1/2 entry. Class pairings OK rd. 4. CCA Ratings used. Reg. ends 15 min. before +game. Rds. 12-2:30-4:45-7. Info: (212)477-3716. NS. NC. FIDE. + +Dec. 23-24 GPP: 10 New York Chess Improves Reading Scores and Raises Your +I.Q. Winter Insanity! 10-SS, G/30. Intellect Rehabilitation Center of New +York, 23 W 10 St., between 5-6th Ave., NYC. EF: $25, Marshall membs $20, or +$20 if also entering Happy Holidays Open. $$ 200-100-50, Top 1865-2198, 1492- +1861, Under 1492 each $99 (top 2 prizes guaranteed, others b/32), $1 to winner +of Insanity Trivia Contest. P. Mallick Memorial Trophy awarded to player with +best "escape." Re-entry $15, counts as 1/2 entry. Byes OK rds. 1-8, limit 3). +Reg. ends 17 min. before game. Rds. 9:29-10:44-11:59 pm-1:23-2:34-3:45-4:56-6- +7:29-8:39 am. Irregular pairings. Info. (212)675-0256. NS. NC. + +An American Classic December 26-29, 27-29 or 28-29 GPP: 200 Nevada 5th +Annual North American Open. Note change (new non-US provisional rule). 6-SS, +40/2, SD/1 (2-day option, rds. 1-3 G/60). Bally's Casino Resort, 3645 Las +Vegas Blvd, South, Las Vegas 89109. $$ 50,000 prize fund unconditionally +guaranteed! Free analysis of your games by GM Arthur Bisguier. In 7 sections +(unr. must play in Unrated or Open section): Open: $$ 5000-2500-1500-1000-600- +400, U2400/Unr $ 3000-1500-1000. U2200: $$ 3000-1500-1000-600-400-300. U2000: +$$ 3000-1500-1000-600-400-300. U1800: $$ 3000-1500-1000-600-400-300. U1600: $$ +3000-1500-1000-600-400-300. U1400: $$ 2000-1200-800-500-400-300. Unrated: $$ +500-300-200-100. A USCF-rated section; all players obtain ratings. +Provisionally rated players are not unrated Non-U.S. citizens with provisional +ratings as of 12/95 list may not win over $1500 in U2000, $1000 in U1800, +$$500 in U1600, $300 in U1400. EF: 4-day $139, 3-day $138, 2-day $137 if check +mailed by 12/14, all $140 with credit card by 12/21, $150 with credit card +12/22-24, $150 at site No checks at site. EF discounts: EF $90 less for +Unrated Section. EF $50 less to jrs. under 18 who are rated below 1500 or play +up. You must request special EF when calling, or will be charged $140. Life +2700s free; $130 deducted from prize. See also "Travel" below. Credit cards +accepted at site, or by phone call (914)496-9658 week days to 12/21. Also 24- +hour daily number for entries only (no questions) to 12/14: (914)437-0079. No +phone entries after 12/14. Choice of schedules: 4-day & 3-day merge after rd. +1; 2-day merges with others after rd. 3; all compete for same prizes. 4-day +schedule: Reg. ends Tues. 6 pm. Rds. Tues. 7, Wed. 7, Thu. 12-7, Fri. 10-4:30. +3-day schedule: Reg. ends Wed. 11 am. Rds. Wed. 12-7, Thu. 12-7, Fri. 10-4:30. +2-day schedule: Reg. ends Thu. 9 am. Rds. Thu. 10-1-4-7, Fri. 10-4:30. All: +Bye: all (rds. 4-6 must commit before rd. 3. Re-entry $100. HR: $60-60, +(800)833-3308, (702)739-4111, reserve early! Last year, all rooms blocked for +the chess tournament were taken by 11/5, and no other rooms at Bally's were +available. Free parking. Travel: EF $5 less if using Jetport Travel (800)688- +4521, (914)561-5283 for airfare. 5% off lowest American Airlines fare also +available through Jetport or directly from American (800)433-1790; refer to +Starfile S9037. Car rentals: Call Avis at (800)331-1600 for the "Chess +Tournament Rate," use AWD number D657633. Side events: 1) North American G/15: +7-SS, 12/26. EF: $40. IGMs free; $40 deducted from prize. $$ 2500 b/80. 2 +sections: Open: $$ 500-300-200, 2200-2399/Unr. 200, U2200 200. U2000: $$ 300- +200-100, B 200, U1600 200, U1400 100. Both G/15 sections: Reg. ends 7:30 pm. +Rds. 8-8:45-9:30-10:15-11-11:45-12:30. 2) North American Blitz (G/5): 7-SS +(double round, 14 games), 12/29. EF: $40, WBCA memb. $35. IGMs free; $35 +deducted from prize. $$ 1600 b/60. 2 sections: Open: $$ 300-150-100, 2200- +2399/Unr 150, U2200 150. U2000: $$ 200-100-50, B 150, U1600 150, U1400 100. +Both Blitz sections: Reg. ends 9:30 pm. Rds. 10-10:30-11-11:30-12-1-1:30. Ent: +Continental Chess, PO Box 249, Salisbury Mills, NY 12577. (914)496-9658 +recorded info. (914)496-7469 . NS. NC. W. FIDE. Dec. 27-30 or + +Dec. 28-30 GPP: 80 Dist. of Columbia 22nd Annual Eastern Open. 8-SS, 40/2, +SD/1. (3-day option, rds. 1-4 G/30). Vista Hotel, 1400 M Street, NW, +Washington, DC 20005. $20,000 b/300 paid entries. Prizes raised or lowered +proportionally except 60% of each prize guaranteed. 5 Sections: Open: $$ 2000- +1200-800-500, 2300-2399/Unr. $1000, 2200-2299 $1000, U2200 $1000. Under 2150: +$$ 1,600-800-400-200. Under 1900: $$ 1600-800-400-200. Under 1650: $$ 1500-800- +400-200. Under 1400: $$ 1400-700-400-200, U1200 $600-300. (U1200 is not a +section they play in the U1400 section and play for all U1400 prizes.) +Unrateds: No U.S. citizen unrated may win over $800 in U2150, $400 in U1900, +$200 in U1650, $100 in U1400. Unrated non-US citizens limited to half these +amounts. EF: 4-day $98, 3-day $99 if mailed by 12/16, all $110 at site. No +credit cards this year. GMs free, $80 deducted from prize. Special EF: $50 +less for juniors under 18 in Open section or playing up. $50 less to unrateds +in lower sections. Special entry fees count as half-entries for calculation of +prize fund. 4-day schedule: Reg. ends noon Wed. Rds: Wed. 1-7:30, Thurs. 11- +5:30, Fri. 11-5:30, Sat. 10-4:30. 3-day schedule: Reg. ends 6:15 pm Thurs. +Rds. 7-8:10-9:20-10:30, merges Fri. with 4-day. All: Byes any round, rds. 6-8 +must commit before rd. 3; limit 2 byes for U2200 or U1200 prizes. Re-entry: +$80. HR: $67, Call 1-800-VISTA-DC by 12/5. Ent: "MetroChess" mail to U.S. +Chess Center, 1501 M Street, NW, Washington, DC 20005. (202)857-4922. NS. NC. +W. FIDE. Dec. 28 GPP: 10 New York 2nd Annual Last Ten Grand Prix Points +Tonight This Year(Accept No Immittations)! 4-SS, G/30. Chess Center at the +Marshall Club, 23 W 10 St., bet 5-6th Ave, NYC. EF: $25. $$ (top 2 prizes +Guaranteed, others b/38): 250-110-100, Top 2200-2399/Unr, 2000-2199, U2000 +each $100. Byes OK all, limit 2 (byes rds. 3-4 must commit before tmt; limit 1 +bye for U2000 prize). Rds. 7-8:15-9:30-10:45 pm. Re-entry $15, counts as 1/2- +entry. Reg. ends 15 min. before game. CCA ratings used, class pairings OK rd. +4. Info: (212)477-3716. NS. NC. + +Dec. 30 GPP: 6 Ohio Hudson Holiday Open. 4-SS, G/75. Barlow Community Ctr., +41 Oviatt St., Hudson, OH. Take 91 Exit off 480 S to 303; 2 blocks east. $$ +750 G. Open: to all. $$ 200-100, U2100 $100. Premier: open to U1900. $$ 100, +U1700 $100. Reserve: open to U1500. All, EF: $25 by 1/27, $12 jrs, $30 at +door, $15 jrs at door. Reg. 9-9:45. Rds. 10-1-4-7. Free entry to over 2400. +Ent: Michael Joelson, 1499 Maple Rd, Cleveland Hts, OH 44121. (216)291-5738. +NS. NC. + +Dec. 30-Jan. 1 GPP: 6 Texas San Antonio New Year Open. 6-SS, 45/2, SD/1. +Comfort Inn-Airport, 2635 NE Loop 410 (at Perrin-Beitel), San Antonio, TX +78217. $$ (1500 b/60, 10/class; 2/3 each prize gtd): 300-150, X,A,B,C each +$150-75, D/E/Unr. $100-50 (unr. max $75 except for top prizes). EF: $30 if +rec'd by 12/28, $40 at site. Junior EF $10/$15, trophy prize only, counts as +1/3 toward "based on." Entry cap at 98 players. Reg. 9:30-11:30 am. Rds. 12-6, +9:30-3:30, 9:30-3:30. Half-point bye any one rd. if requested before Rd. 1. +HR: $46 flat rate (up to 4/rm). (210)653-9110, reserve by 12/23, mention chess +tournament. Free cont. bkfst. & airport van. Ent: SACC, PO Box 501, Helotes, +TX 78023. Info: (210)695-2324. NS. NC. W. + +Dec. 31 GPP: 10 New York (9th Annual) Your LAST Blunder in 1995! 5-SS, G/30. +Chess Center at the Marshall Chess Club, 23 W 10 St., bet 5-6th Ave, NYC. EF: +$30, Marshall membs. $25, $5 less to player on any 12/95 USCF Top 50 Rating +List. $$ (900 b/46, half each prize guaranteed): 400-200-100, Top 2000- +2199/unr, U2000 each 100, champagne bottle to 1st (non-alcoholic substitute if +under age 21 or if driving). Byes OK all, limit 3 (byes rds. 4-5 must commit +before rd. 2). Re-entry $15, counts 1/2 entry. Class pairings OK rd. 5, CCA. +Ratings used. Reg. ends 15 min. before game. Rds. 12-1:30-2:45-4-5:20 pm. +Info: (212)477-3716. NS. NC. + +Jan. 2, 9 GPP: 10 New York 3rd Annual Max Euwe Open (2-week schedule). 4-SS, +rds. 1-2 G/30, rds. 3-4 30/90, SD/60. Chess Center at the Marshall Club, 23 W +10 St., bet 5-6th Ave, NYC. EF: $35, Club membs. $25, $5 less to players on +any 12/95 USCF Top 50 Rating List. Top 2 Open prizes Guaranteed, others b/40. +2 sections. Open: $$ 200-110-50, Top U2200/Unr. $100. Under 2000: $$ 160-80, +top U1800 $100, $80 limit to unr. Both, byes OK all, limit 2 (byes rds. 3-4 +must commit before rd. 2). Rds. 5:30-6:40-7:45 pm 1/2, 7:45 pm 1/9; merges +with 4-week schedule, 12/19-1/9, for rd. 3. Re-entry $20, counts as 1/2-entry. +Reg. ends 15 min. before game. Class pairings OK rd. 4. CCA Ratings used. +Info: (212)477-3716. NS. + +Jan. 5-Feb. 2 GPP: 6 New York Queens Winter Open. 5-SS, 30/60, SD/60. +Margaret Tietz Center, 164-11 Chapin Pkwy, Jamaica, NY 11432. Two sections. $$ +500 G. Open: open to all. EF: $27 if rec'd by 12/29, $32 at site. $$ 200-100, +more per entries. Booster: open to U1800. EF: $22 if rec'd by 12/29, $27 at +site. $$ 130-70, more per entries. Both, $7 less to QCC membs. Reg. 7:30-8:15. +Rds. 8:30 each Fri. Half-point byes allowed any rd. if specified at entry +(limit two). Limited to first 60 entrants. Ent: Edward A. Frumkin, 42-65 +Kissena Blvd, #633, Flushing, NY 11355. (718)939-1859. NS. NC. W. + +Jan. 5-7 GPP: 50 Ohio 2nd Midwest Winter Open. 5-SS, 40/2, SD/1 (2 day +option round 1 G/75). Trueman Club Hotel, 900 East Dublin-Granville Road (Rt +161 and I-71), Columbus, OH. $$ 7000 G. 3 sections (unrated players may play +in any section, but are only eligible for the open section place prizes). +Open: $$ 1000-500-300-200, U2400 $500-200, U2200 $500-200. Premier: open to +Under 2000. $$ 400-300-200, U1800 $400-300-200. Reserve: open to Under 1600. +$$ 400-300-200, U1400 $400-300-200. EF: 3-day: Open $58, Premier & Reserve +$48. 2-day: Open $57, Premier & Reserve $47. Free entry to GM's. All $20 less +to juniors under 21 or $30 less to unrated players, $5 more at site. Visa and +MasterCard accepted by phone, mail, e-mail, or at site. 3-day schedule: Reg. +Fri 6-7:30 pm. Rds. 8, 1-7:30, 9-3. 2-day schedule: Reg. Sat 8-9:30. Rds. Sat +10-1-7:30, Sun 9-3. All, half-point byes available rds 1-4, must commit before +round 3. HR: $63-63-63-63 (ask for chess rate), includes free gourmet +continental breakfast and evening reception with complimentary Hors D'oeuvres +and drink coupon for all registered guest. (800)477-7888, please reserve by +December 22. Free parking. Books and equipment for sale at site by Fred +Lindsay. Ent: Midwest Chess Promotions, 734 Sheridan Ave, Bexley, OH 43209. +(614)231-8859. e-mail: gperks@coil.com. Visit our Web page at: +http//www,dnet,net/chess/ A Heritage Event Jan. 5-7 or 6-7 GPP: 50 +Pennsylvania 28th annual Liberty Bell Open. 5-SS, 40/2, SD/1 (2-day option, +rd 1 G/60). Adam's Mark Hotel, City Line Ave (Rt 1 near I-76 City Ave exit), +Philadelphia 19131. Free parking. $$ 15,000 b/250 paid entries, $10,000 +minimum (2/3 each prize) guaranteed. 8 sections (unrated must play in Unr or +Open section). Open: $$ 1200-700-500-300, U2400/Unr $800-400. Under 2200: $$ +1000-500-300-200. Under 2000: $$ 1000-500-300-200. Under 1800: $$ 1000-500-300- +200. Under 1600: $$ 1000-500-300-200. Under 1400: $$ 800-400-200-100. Under +1200: $$ 500-250-150-100. Unrated: $$ 300-200-100. All will obtain ratings. +Provisionally rated players are not unrated. EF: 3-day $88, 2-day $87 if check +mailed by 12/28, all $90 with credit card by 1/3, $95 at tmt. No checks at +site. Advance EF $2 less to PSCF members (must deduct from EF; no $2 refunds). +GMs free; $80 deducted from prize. Special EF: $60 less for Unrated section. +$40 less to juniors under 18 who are rated under 1500 or play up. Re-entry +$50. You must request special EF when calling, or will be charged $90. Special +EF players count as 1/2 entries toward prize fund, but may win full prizes. +Credit cards accepted at site or by phone call 914-496-9658 weekdays 11/14- +12/21 or 1/1-3. Also 24-hour daily number for entries only (no questions): 914- +437-0079. No phone entries after 1/3. 3-day schedule: Reg. ends Fri 7 pm, rds. +Fri 8, Sat 1-7:15, Sun 10-4:15. 2-day schedule: Reg. ends Sat 9 am, 1st rd Sat +10 am, then merges with 3-day. All, Bye all (rds 4-5 must commit before rd 2). +HR: $69-69-69-69, (215)581-5000, reserve by 12/22. Free parking. Car rentals: +Call Avis at (800)331-1600, use AWD number D657633 for "chess tournament +rate." Ent: Continental Chess, PO Box 249, Salisbury Mills NY 12577. (914)496- +9658 (recorded info, 914-496-7469). NS. NC. W. FIDE. + +Jan. 5-7 GPP: 20 Tennessee 19th Fairfield Glade Open. 5-SS, 40/100, 15/30, +15/30. Fairfield Glade Resort Conference Center, Peavine Rd, Crossville, TN. +$$G 5000. 3 sections: Open, EF: $40 if rec'd by 12/29. $$ 600-300-200; Expert, +A & below $350-150-100; 2200-2299, 2000-2099 & below 1900 $100; trophies to +1st, top Expert, A & below. Amateur: open to below 1800. EF: $40 if rec'd by +12/29. $$ 350-125-100; C & below $350-125-100; 1600-1699 & below 1500 $100; +trophies to 1st, top C & below. Novice: open to below 1400. EF: $40 if rec'd +by 12/29. $$ 350-125-100, 1200-1299 $100, E $225, Unr. $150; trophies to 1st, +E, Unr. (Unr. eligible for Unr. prize only). All, special $15 EF for all Jrs., +(current youth or scholastic member of USCF), may win trophies only. EF: $5 +more at site. St.: $10. USCF Rating List in effect 1/1/96 will be used for all +players. Optional trophies available. Reg. 3-7 pm 1/5 or 7-8 am 1/6. Rds: 1st +Round choice of Friday 8 pm or Saturday 9 am, other rounds 2-7, 9-2 CST. HR: +Fairfield Glade Resort, PO Box 1955, Fairfield Glade, TN 38557 (615)484-3723. +Lodge $49-49-49-49. Reservations should be made by 12/18. Ent: Harry Sabine, +PO Box 381, Crossville, TN 38557. (615)484-9593 or 484-4878. NS. NC. W. Jan. +6-7 GPP: 6 New York Marshall Chess Club January Grand Prix. 4-SS, 30/90, +SD/60. Marshall Chess Club, 23 W 10 St., NYC, NY 10011. 2 sections: Open: to +all. $$ (400 G): 200-100-55, U2200 $45. Amateur: open to U2000. $$ (275 b/16): +150-75, U1800 $50. Both, EF: $32, $20 members. Reg. 10:15-10:45. Rds. 11-4:30 +each day. Ent: as above. NS. NC. FIDE. + +Jan. 8 GPP: 6 New York 23rd Nassau Action Championship. 4-SS, G/30. 1st +Presbyterian Church, 1st St. & Main St., Mineola. 2 sections. Open: EF: $25 by +1/2. $$ (480 b/21, top 2 G): 200-100, U2200, 2000 each $90. Booster: open to +U1800/Unr. EF: $10 by 1/2. $$ (120 b/15): 50, U1600, U1400/Unr. each $35. +Both, non-membs. $3 more. EF $5 more at site. Byes 1-4 (rd 4 irrevocable & +must be requested before rd 2). Reg. 7-7:30 pm. Rds. 7:30-8:30-9:30-10:30. +Rule 14H not used. Ent: Harold Stenzel, 31 Rose Ln, New Hyde Park, NY 11040. +NS. W. Jan. 12-14. + +GPP: 6 Arizona Chess Emp. January Championship. 5-SS. Chess Emporium, 13832 +N 32nd St. #D-3, Phoenix, AZ 85032. 2 sections: Open: to all. Reserve: U1800. +Both, EF: $34 by 1/5, $39 at site, $5 less for club membs. $$ (1000 b/30 +entries,550 G): 200-100, A 100, B 75, C 75. Reg. 5-6:30 pm on 1/12. Rds. 7, 11- +5, 10-4. If less than 9 in either section, event may be combined as open only. +Site: same as above. + +Jan 12-14 or 13-14 GPP: 10 Arizona Tucson Open. Rodeway Inn Tucson North +Hotel, 1365 W Grant Rd. (520)622-7791. 2 sections. Open: 5-SS, 40/2, SD/1. EF: +$35 if rec'd by 1/11, $45 at site. $$ (b/35, top two G): 350-150 + trophies to +each, X,A,B/below $70 + trophies each. Reg. 6-6:45. Rds. 7:30, 10-5, 9-4. +Reserve: open to U1600. 5-SS, 40/2, SD/1 EF: $20 if rec'd by 1/11, $30 at +site. $$ (b/30): 120-60, trophies to top three, best U1400, best U1200, best +U1000, best K-12, best K-6, best K-3. Reg. 6-6:45 pm. Rds. 7:30, 10-5, 9-4. +Alternate Schedule: Players in either section may skip Friday rd. Reg. Sat. 8- +8:30. Rds. 9 am (G/90) & 1 pm (G/90) merge in rd 3 at 5 pm. All, SACA memb. +req'd. ($6 adults, $3 K-12, Jan-June) for So. AZ residents, OSA. Scholastic +players may compete in Open section for $10 (trophies only) if rec'd by 1/11, +$15 at site. SACA may adjust prizes b/fully-paid entries, class prizes b/4 or +more players. Info: Robert Giffords (520)325-3067. Ent: SACA, PO Box 42407, +Tucson, AZ 85733. NS. NC. W. + +Jan. 12-14 GPP: 15 FLORIDA 1996 Florida Class Championships. 5-SS, 35/90, +SD/1, (Sat. Rd. 1 G/60). Orlando North Hilton, 350 S North Lake Blvd at I-4 & +Rt 436, Altamonte Springs, FL 32715. $$G 2525. 5 sections. Open: EF: $39. $$ +400-250-125, U2200 $200-100, Unr. $100(b/3+). U2000: EF: $38. $$ 200-100. +U1800: EF; $37. $$ 200-100. U1600: EF: $36. $$ 200-100. U1400: EF: $35. $$ 200- +100, U1200 $100-50. All, EF $10 more after 1/8. Trophies to top in each +section. All non-prize winners with plus scores get chess book. Reg. ends 1/2 +hr before 1st rd. Rd. 1 at 7 pm Fri (or 10 am Sat at G/60. Entree must +indicate "Fri" or "Sat" for Rd. 1. '2nd chance' $20). Rds. 2-5, Sat 1-6, Sun 9- +2. Half-point byes if requested before rd. 2. Scholastic: Jan 13 only, open to +grades K-12. 5-SS, G/30. EF: $8 if rec'd by 1/8, $12 at site. Trophies to top +each grade, top schools K-5, 6-8, & 9-12. Reg. 9-10:30. Rds. 11-1-2:30-4-5:30. +HR: $55-55-55-55 (by Jan 2). (407)830-1985, (800)445-8667. Ent: CFCC, c/o +Harvey Lerman, 921 Thistle Ln, Maitland, FL 32751. (407)644-3542 (Info only). +NS. NC. W. + +Jan. 12-14, 13-14 GPP: 10 Washington Seattle City Championship. 40/103, +SD/60. Seattle Chess Club, 6556 Ravenna Ave NE, Seattle, WA 98115. $$ 1200 +b/50. 2 sections. Championship: open to all. 4-SS. EF: $40 by 1/11, $48 at +site. $$ (610, 1st 2 G): 180-120, 2100-2199 $85, 2000-2099 $80, 1900-1999 +$75, U1900 $70. Reg. 11-12, 1/13. Rds. 12:30-6:45, 11-5:15. Reserve: open to +U1800. EF: $32 by 1/11, $40 at site. $$ 590: 120-90-65, 1600-1699 $66, 1500- +1599 $62, 1400-1499 $58, 1300-1399 $54, U1300 $50, Unr $25. Reg. 6:30-7:30 +(1/12), 9-9:45 (1/13). Rds. 8, 12:30-6:45, 11-5:15. Option: rd 1 (G/64 or G/60 ++ 5/M) 10 am on 1/13. All, EF: Unr. $0 with purchase 1 year USCF/WCF, add $1 +for Sat. option, for local discounts see NWC. WCF req'd $20, $13 jrs, $5 tnmt, +OSA. Cks payable to: Seattle Chess Club Ent: SCC Tnmt. Dir, 2420 S 137th St., +Seattle, WA 98168. SCC info-line: (206)523-1553. NS. + +Jan 13-15, 14-15 GPP: 40 California 1996 3rd Annual CalChess Season Opener. +6-SS, 30/90, SD/1 (2-day option rds 1-3 G/60). Holiday Inn Select, 1221 Chess +Dr., Foster City, CA 94404. (Take Hwy 101 to San Mateo, take Hwy 92 east, exit +at Foster City Blvd). $$ 5000 G. 7 sections. Master: $600-400-250-150, U2400 +$300-100. Expert: $500-350-150. A: $300-150-100. B: $300-150-100. C: $300-150- +100. D/E: $300-150-100. Unr: $200-100. All, EF: postmarked by 1/5 3-day $59, +$30 Jrs, 2-day $58, $29 Jrs, $65 at site, $35 Jrs. $6 discount to CalChess +memb, $15 discount to registered guests of Holiday Inn Select (1 discount per +room). Special entry: new USCF & entry fee $65. IM/GM free. Re-Entry $39, $20 +Jrs. Players may play up one section for add'l $10. Trophy to top finisher in +each section. Plus door prizes, surprise prizes! Reg: Fri. 6-7 pm, Sat. 8-9:30 +am, Sun. 8:15-9:15 am. Rds. Choice of schedules 3-day and 2-day merge Rd. 4, +all compete for same prize. 3-day schedule Sat. 10-5, Sun. 11-4:30, Mon. 10- +3:30. 2-day schedule Sun. 9:30-11:45-2-4:30, Mon. 10-3:30. Half-point byes any +rd(s) if requested in advance (byes rds 5-6 must be requested before rd 1). +CalChess Blitz Master Invitational, 1/12, 7:30 pm. Prizes. TD: Carolyn +Withgitt, Tom Dorsch. 12/95 Annual Ratings Supplement, CCA minimums and +Directors' discretion will be used to place players as accurately as possible. +Sets and boards provided, please bring clocks. Books and equipment for sale on +site by Games of Berkeley. HR: Holiday Inn Select, $69 1-2, (415)570-5700, +request chess rate, reserve early; free 24-hr courtesy shuttle to/from SFO +Airport. Info: Tom Dorsch (510)481-5351. $1 from each entry donated to Kolty +Chess for Youth Foundation. Ent: CalChess Tournaments, PO Box 3294, Hayward, +CA 94540-3294. No phone entries. NS, NC, W, FIDE. + +Jan. 13-14 GPP: 6 Massachussetts 19th Newton Open. 4-SS, 45/2, SD/30. +Cavendish Club, 70 James St., Ste 151, Worcester. Ent rear gate from Genesee +St., door is at left of dock #7. (508)753-0971. $$ 300G: 200-100. EF: $39 by +1/11, $45 at site. Reg. 8-9:30. Rds. 10-3, 9-2. Half-pt byes avail. in rds. 1- +3 with adv. notice. HR: Ramada Inn, at Exit 10, Mass Tpke, Auburn (800)228- +2828. Ent: Stephen Dann, Box 452, Worcester, MA 01613. (508)845-6446. NS. NC. +W. SASE. Jan. 13-14 GPP: 10 Michigan 1996 Michigan Masters/Experts +Championships. 4-SS, 40/2, 20/1. Holiday Inn Fairlane, 5801 Southfield Service +Drive (at Ford Rd.), Detroit, MI 48228. Open to Masters/Experts. EF: $40 if +rec'd by 1/9, $50 at site, $5 discount if staying in hotel (one discount per +room). $$ (950 b/20, top 2 Gtd): Masters $300-200-125 + trophy to top MI +resident for each prize. Experts: $200-125 + trophy to top MI resident each +prize. Top MI resident seeded into the Michigan Invitational Championship +(Master section). Reg. 8:30-9:30. Rds. 10-4 each day. HR: $60, (313)336-3340. +Ent: Tim Sawmiller, 24480 Riverview, Novi, MI 48374. (313)344-4269. NS. NC. + +Jan. 16-Feb. 6 or Jan. 30, Feb. 6 GPP: 10 New York 7th Annual Mikhail M. +Botvinnik Memorial. 4-SS, 30/90, SD/1. Chess Center at the Marshall Chess +Club, 23 W. 10th St., bet. 5-6th Ave., NYC. EF: $35, $25 Marshall membs., $5 +less to players on any 12/95 USCF Top 50 Rating List. Top 2 open prizes +guaranteed, others b/40 total. 2 sections: Open, $$ 200-110-50, Top U2200/unr. +$100. Under 2000:160-80, top U1800 $100, $80 limit to unr. Both, byes OK: all, +limit 2 (byes rds. 3-4 must commit before rd. 2). Choice of 2 schedules: 4- +week option, rds. 7:45 pm each Tue., 1/16-2/6; 2-week option, rds. 5:30-6:40- +7:45 pm 1/30, 7:45 pm 2/6 (rds. 1-2 of 2-week option only are G/30, NC), both +schedules merge rd. 3. Re-entry $20, counts as half-entry. Reg. ends 15 min. +before game. CCA ratings used, class pairings OK rd. 4. Info: (212)477-3716. +NS. FIDE. + +Jan. 19-21 or 20-21 GPP: 300 New York Empire City Open! 5-SS, 40/2, SD/1 (2- +day option only, rd. 1 G/60; 1 1/2 day option only, rds. 1-3 G/30). Marshall +Chess Club, 23 W. 10th St., bet. 5-6th Ave., NYC. EF: 3-day $53, 2-day $52, 1 +1/2 day $51 postmarked by 1/13, all $55 by credit card thru 1/17, $60 at site, +Marshall members $10 less, Life 2700's free ($45 deducted from prize), free to +specified prizewinners in 1996 Greater NY Scholastic Championships, 1/13-14. +Special EF: juniors under 18 rated over 1999 $25 less. $$ (2400 b/66 paid +entries, 60% of each prize guaranteed): $$ 1000-500-200-100, top 2200- +2399/unr. $300, top U2200 $300. Choice of 3 playing schedules: 3-day option, +reg. ends Fri 6:30 pm. Rds. Fri 7 pm, Sat 12:30-6:45 pm, Sun 11 am-5 pm. 2-day +option, reg. ends Sat 10 am. Rd. 1 Sat 10:30 am, then merges with 3-day. 1 1/2 +day option, reg. ends Sat 7 pm. Rds. Sat 7:30-8:45-10 pm, then merges with +others for rd. 4, 11 am Sun. byes OK: all (byes rds. 4-5 must commit before +rd. 2, limit two byes for U2200 prize). Re-entry: $30. Special EF's & re- +entries count as 1/2 entries in calculating prize fund, but are eligible to +win full prizes. Credit card entries accepted by mail, at site or by phone: +(212)675-0256 or (212)477-3716. CCA ratings used. Class pairings OK rd. 5. HR: +Roger Williams: (212)684-7500, Herald Square: 279-4017, Off-Soho: 353-0860, +McBurney YMCA: 741-9210/9226. Ent: Chess Center of NY, PO Box 198, Old Chelsea +Station, NY, NY 10011. Info: (212)477-3716. NS. NC. FIDE. + +Jan. 19-21 or 20-21 GPP: 60 Ohio 19th Cardinal Open. 5-SS, 45/2, SD/1 (2-day +schedule rd 1 G/70) Hyatt Regency Columbus, 350 North High St., Columbus, OH +43215. $$ 14,600 b/260, 7300 G. In 7 sections. Open: to all. $$ 1000-600-500- +400-300-200, U2400 $300-200-100. Under 2200: $$ 1000-500-300-200-100. Under +2000: $$ 1000-500-300-200-100. Under 1800: $$ 1000-500-300-200-100. Under +1600: $$ 1000-500-300-200-100. Under 1400: $$ 1000-500-300-200-100. Unrated: +$$ 250-150-100. All, EF: $69 by 1/15, $76 at site, free to GMs and IMs that +complete their schedule ($60 subtracted from any prize won). OCA memb req'd +$12, $8 jrs U19, OSA. Players whose USCF class numbers indicate a former +rating of 101 or more points above group may not win more than 1/2 of any +prize, or may elect to play up! Re-entry: $25. 3-day schedule: Reg. ends Fri 7 +pm. Rds, 8, 1-7:30, 9-3:30. 2-day schedule: Reg ends Sat 9:30 am. Rd 1 at 10 +am, then merges with 3-day. Half-point bye available in any rd, limit three, +must request in advance of first rd, no changes, add $1. No credit card or +phone entries. HR: $69, 1-4, (614)463-1234, must reserve by 1/15 to get this +excellent rate! Affiliate: American Chess Promotions. Info: Larry Paxton +(513)731-5164 or L Thad Rogers (912)742-5607. Ent: Larry Paxton, 4515 Smith +Rd, Apt 15, Cincinnati, OH 45212. NS. NC. W. + +Jan. 19-21 GPP: 20 Virginia 1996 Virginia Open. Howard Johnson Motor Lodge, +Rt 1 & I-95, Fredericksburg, VA 22401. (703)898-1800. Open: open to all. 5-SS, +40/2, SD/1. EF: $40 by 1/10, $45 at site. $$ (1950): 700-400-250-150, X,A each +$150-75. Rds. 8, 10-5, 10-3:30. Amateur: open to U1900. 6-SS, 40/90, SD/1. EF: +$35 by 1/10, $40 at site. $$ (1300): 400-250-150, B,C,D/E each $100-50, Unr. +50. Rds. 8, 10-3-8, 10-3. Both, Reg. 6:30-7:30 pm 1/19 and 9-9:30 am 1/20. +Half-point bye available rds 1-3. Class prizes b/5. Special Scholastic EF +(under age 19) $5 by 1/10, $8 at site. Play for non cash prizes only. USCF & +VCF memb. req'd. ($10, $5 Jrs), OSA (proof req'd). Trophies to first in each +section. HR: (703)898-1800, reserve early $40 (1-4) chess rate. Cks. payable +to VCF. Ent: Virginia Chess Federation, c/o Helen S Hinshaw, 3430 Musket +Drive, Midlothian, VA 23113-2005. (804)272-3000 (no phone entries).NS. NC. W. + +Jan. 20-21 GPP: 10 Arkansas Hot Springs Classic. 5-SS, rd 1 G/90, 30/80, +SD/1. Majestic Hotel & Spa, Sycamore Room, Hot Springs, AR 72903. EF: $45 in +advance, $50 at site. $$ 300-200, A,B,C,D/E $150, $100 upset. Trophies to all +prizes, unrated and U19 (first 20 games) play free. Reg. 8-9 am. Rds. 10-2-7, +9-2. Half-point bye available. HR: $48/$58, 800-643-1504, (501)623-5511. +Reserve by 12/19. Ent: Bill Beck, 3 Hiland #B, AR 72015. (501)778-4632. NS. +NC. W. Jan. 20-21 GPP: 6 California Chess Palace January Grand Prix. 4-SS, +30/90, SD/60. Chess Palace, 3255 E South St. #205, Long Beach, CA 90805. EF: +$30, $25 Chess Palace club membs. $5 penalty after 11:20 am. Two sections. +Open: to all. $$ 450: 200-100-60, U2200/Unr. $90. FIDE. Amateur: open to U2000 +only. $$ 360: 130-70, U1800 $60, U1600 $50, U1400 $50. No Unrateds. Reg. 11- +11:20 am. Rds. 11:30-5. Info: Charles Rostedt (310)634-8477. + +Jan. 20-21 GPP: 10 District of Columbia Metro Swiss. 4-SS, 40/90, SD/1. U.S. +Chess Center, 1501 M St. NW, Washington DC 20005. EF: $33 by 1/13, $40 at +site, $5 off to Center members. $$ 500G: 250-150-100, U2200, U2000, U1800, +U1600 each $100. (Top prizes guaranteed, class b/35 & 4/class). Reg. 11:15-12. +Rds. 12:30-5:30. Info: (202)857-4922. NS. NC. W. + +Jan. 20 GPP: 10 New York Ithaca Back-to-School Open VIII. 4-SS, 40/60, +30/SD. Phillips Hall, Ithaca College, 953 Danby Rd, Ithaca, NY 14850. 2 +sections. Open: open to all. EF: $25 by 1/17, $30 at site. $$ G300): 200-100, +more based on entries. Under 1800: EF: $16 by 1/17, $18 at site. $$ 230 b/20. +All, Reg. 8:30-9:15. Rds. 9:30-12:15-3-5:45. $2 discount per player to college +students, juniors and carpools of 3/more. HP: (607)274-3313. Ent: Karl Heck, +Panorama Chess Promotions, 30 Ferguson Road, Dryden, NY 13053. +sldkth@baka.com. (607)844-KING. NS. NC. W. + +Jan. 20-22 GPP: 6 Texas 16th Annual A.C.E. Open Club Championship. 5-RR, +40/2, SD/1. Bridge Studio of Austin, 1701 Palo Duro Rd. $$ 1300 b/50, top 2 G. +Open: to all. $$ 275-125, X $150-75, U2000 $50. Reserve: open to U2000. $$ 190- +90, B $120, C $100, D/E $75, Unr $50. Both, EF: $25 by 1/16, $35 at site. Reg. +6-7 pm 1/20. Rds. 2-5, 2:30-8, 9:30-3:30. Rd 1 option Fri 7 pm or Sat 9 am +w/optional $10 re-entry. Half-point bye if requested prior to rd 1. Ent: +A.C.E., PO Box 161052, Austin, TX 78716. (512)328-3638. NS. NC. W. + +Jan. 27 GPP: 10 New York 9th Annual Chess Center Super Saturday!! 5-SS, +G/30. Marshall Chess Club, 23 W. 10th St. (between 5-6th Ave.), NYC. EF: $30, +$25 club membs, $5 less to players on any 2/96 USCF Top 50 List, GM's $20. $$ +(840 b/42, top 2 guaranteed): $$ 300-150-90, top 2200-2399/unr., 2000-2199, +U2000 each $100. Byes OK: all, limit 3 (byes rds. 4-5 must commit before rd. +2). Re-entry: $15, counts as 1/2 entry. Class pairings OK rd. 5. 2/96 USCF, +CCA ratings used if avail. Reg. ends 15 min. before game. Rds. 12-1:30-2:45-4- +5:20 pm. NS. NC. Info: (212)477-3716. + +Jan. 27-28 GPP: 6 Wisconsin UW Winter Open. 5-SS, 50/2,25/1,SD/1. Union +South, 227 N Randall Ave, Madison, 53715. (608)263-2600. Limited rooms avail, +call for rates. $$G810: $175-125, X 110, A 105, B 95, C 75, D/E 65, Unr 60. +Reg. 9-9:30. Rds. 10-2:30-7:30, 10:15-3:30. EF: $15 rec'd prior to 1/25, $20 +at site. First WCA Tour Event of 1996. Ent/checks: Jerry Noel, 1706 Whispering +Pines Way, Madison, WI 53713-4333. (608)274-8441. Call after 4 PM. NS. NC. W. +Jan. 29-Feb. 12 GPP: 6 New York 6th Nassau G/60 Championship. 6-SS, G-1. +First Presbyterian Church, First & Main Sts, Mineola. EF: $28 in advance, $33 +at site, non-memb. $5 more. $$ (750 b/30, top 2 G): 200-100, U2200, 2000, +1800, 1600, 1400/Unr each $90. 4 byes 1-6 (last rd must be requested before rd +3 and is irrevocable). Reg. 7-7:30 pm. Rds. 7:30-9:30 each Mon. Rule 14H not +used. Ent: Harold Stenzel, 31 Rose Ln, New Hyde Park, NY 11040. NS. W. + +Jan. 30, Feb. 6 GPP: 10 New York 7th Annual Mikhail M. Botvinnik Memorial (2- +week option). 4-SS, rds. 1-2 G/30, rds. 3-4 30/90, SD/1. Chess Center at the +Marshall Chess Club, 23 W. 10th St., bet. 5-6th Ave, NYC. EF: $35, $25 +Marshall membs., $5 less to players on any 12/95 USCF Top 50 Rating List. Top +2 open prizes guaranteed, others b/40 total. 2 sections: Open $$ 200-110-50, +Top U2200/unr. $100. Under 2000: 160-80, top U1800 $100, $80 limit to unr. +Both, byes OK: all, limit 2 (byes rds. 3-4 must commit before rd. 2). Re-entry +$20, counts as 1/2 entry. merges with 4-week schedule, 1/16-2/6, for rd. 3. +Reg. ends 15 min. before game. Rds. 5:30-6:40-7:45 pm. 1/30, 7:45 pm 2/6. CCA +ratings used, class pairings OK rd. 4. Info: (212)477-3716. NS. + +Feb. 1 GPP: 10 New York The Original 4 Rated Games Tonight America's First +Action Tournament! 4-SS, rds. 1-2 G/30, rds. 3-4 30/90, SD/1. Chess Center at +the Marshall Chess Club, 23 W. 10th St., bet. 5-6th Ave, NYC. EF: $25, $20 +Marshall membs. $$ (570 b/34, top 2 guaranteed): $$ 200-110-60, Top 2000- +2199/unr., U2000 each $100. Byes OK: all, limit 2 (byes rds. 3-4 must commit +before rd. 2, limit one bye for U2000 prize). Re-entry: $12, counts as 1/2 +entry. Class pairings OK rd. 4. CCA ratings used. Reg. ends 15 min. before +game. Rds. 7-8:15-9:30-10:45 pm. NS. NC. Info: (212)477-3716. + +Feb. 2-4 or 3-4 GPP: 60 Texas 5th Annual Southwest Class Championships. 5- +SS, 40/2, SD/1 (2-day option, Rd. 1 G/60). Dallas Park Central Hotel (formerly +Marriott), 7750 LBJ Freeway (I-635) at Coit Road exit, Dallas 75251. Free +parking. $$ 15,000 b/250 paid entries, else proportional; $10,000 minimum (2/3 +each prize) guaranteed. Unr. must enter Unr. section. 6 sections: Master- +Expert (over 1999): $$ 2000-1000-600-400, 2200-2399/Unr 1000-500, U2200 1000- +500. Class A (1800-1999): $$ 1000-500-300-200. Class B (1600-1799): $$ 1000- +500-300-200. Class C (1400-1599): $$ 1000-500-300-200. Class D (1200-1399): $$ +800-400-200-100. Unrated: $$ 250-150-100. All players will obtain ratings. +Provisionally rated players are not unrated. EF: 3-day $88, 2-day $87 if check +mailed by 1/25, all $90 with credit card by 1/31, $95 at tmt. No checks at +site. GMs free; $80 deducted from prize. Special EF: $60 less for Unrated +Section. $40 less to juniors under 18 who are rated under 1500 or play up one +class. Re-entry: $50. You must request special EF when calling, or will be +charged $90. Special EF players count as 1/2 entries toward prize fund, but +may win full prizes. Rated players age 18 & over may play one class up for $10 +extra. Credit cards accepted at site or by phone (call 914-496-9658 weekdays +11/14-12/21 or 1/1-24). Also 24-hour daily number for entries only (no +questions) through 1/31: 914-437-0079. No phone entries after 1/31. 3-day +schedule: Reg. ends Fri 7 pm, rds. Fri 8, Sat 1-7:15, Sun 10-4:15. 2-day +schedule: Reg. ends Sat 9 am, 1st rd 10 am, then merges with 3-day. All: TCA +memb. required ($10, jrs $7.50), OSA. Bye: all, rds 4-5 must commit before rd +2. HR: $59-59, 214-233-4421, reserve by 1/10. Car rentals: Call Avis at 800- +331-1600, use AWD number D657633 for "chess tournament rate." Ent: Continental +Chess, PO Box 249, Salisbury Mills, NY 12577. 914-496-9658 (through 1/24), 914- +496-7469 (recorded info). Do not mail entries after 1/25. NS. NC. W. FIDE. + +Feb. 2-4 GPP: 60 North Carolina Land of the Sky IX. 5-SS, 35/90, SD/60. +Holiday Inn Sunspree Resort (formerly Great Smokies Hilton, One Hilton Drive +(soon to be named Holiday Inn Drive), Asheville, NC 28806. $$ (20,000 b/320, +10,000 Gtd): 4 sections: Open: open to all. $$ 2400-900-800-500-400, 2399- +2200, 2199-2000, 2099/under each $700-400. Amateur: open to U2000. $$ 1500-800- +400, 1899-1800, 1799-1700, 1699/under each $800-400. Booster: Open to U1600. +$$ 1500-800-400, 1499-1400, 1399-1300, 1299/under each $500-300, Unr. $300. +All, EF: $79 postmarked by 1/26, $10 more at site or $49 postmarked by 1/26 +and $30 at site. $10 off pre-entry or at site entry for players new to Land of +the Sky. Family discount: first member full EF, $20 off each additional +(immediate family only, d/n apply to trophy entries). Players under 18, trophy +only, $20. Pre or at site, no discounts; if playing for money $10 off pre or +at site EF. One discount per player. Optional re-entry: re-enter for $40 after +Friday round; counts as 1/2 entry toward based-on prize fund. USCF/NCCA memb. +req'd., OSA. Reg. Friday 3-7 pm for Friday round, anytime until Saturday 1 pm +(take one half-point bye any time prior to 1 pm. Saturday, one half-point bye +available rounds 1-3). Rds. First round your choice Friday 8 pm or Saturday 9 +am. Other rounds 2:15-7:15 Saturday; 9-2:15 Sunday. Blitz tournament Saturday +morning. Scholastic Section: open to grades K-12. EF: $10 - $5 more at site. +Rounds same as other sections. Trophies to 1st and 2nd overall; 1st & 2nd +elementary (6th grade & below); 1st & 2nd primary (3rd grade & below); and +top unrated. Include school & grade when entering. HR: $55, up to four +occupants, mention tournament. HP: (704)254-3211. Visa & MasterCard accepted +(add $3 to EF). Checks payable to B&W, PO Box 1123, Weaverville, NC 28787. +(704)645-4215. + +Feb. 2-4 or 3-4 + +GPP: 30 Ohio Mad River Open. 5-SS, rd 1 G/90, rds 2-5 40/90, SD/60. Holiday +Inn, 383 E Leffel Ln, Springfield, OH Exit 54 (Rt 72) off I-70. $$ 5000 b/150 +entries, 60% G. Open: $$ 1000-500-250-150-100, Expert (2000-2199), $200-100, +Class A (1800-1899), $200-100. Premier/Under 1800: $$ 400-250-150-100, Class C +(1500-1599), $200-100. Reserve/Under 1400: $$ 400-250-150-100, Class D,E,Unr +(U1200), $200-100. (Unrated players limited to $200 in Premier and Reserve). +EF: Open $45, Premier/Reserve $40 before 1/26; Open $54, Premier/Reserve $49 +at site. Re-entry $15. GM, IM free entry, $45 deducted from prize. Reg. Fri +6:30-7:30 pm, Sat. 8:30-9:30. Rd. 1 Fri 8 pm, Sat 10 am. Rds 2-5 Sat 2-7, Sun +9-2. HR: $52 1-4 (513)323-8631. Ent: Alex Zelner, 355 Meadow Lane, +Springfield, OH 45505. (513)325-5531 or (513)323-9794. TD: Grant Perks +(614)231-8859. + +Feb. 3-4 GPP: 15 California Balboa Open. The San Diego Chess Club, 2225 +Sixth Ave, San Diego, CA 92101. (619)239-7166. $$(2000 top 3 G, rest b/65 +entries, Scholastic G). 3 sections. Open: to all. 4-SS, 50/2, G/1. EF: $45 by +1/31, $50 at site. $$ 350-250-150, U2200 200-110. Reg. 8:30-9:30. Rds. 10-4 +both days. Reserve: U2000/Unr. 5-SS, 40/90, G/30. EF: $40 by 1/31, $45 at +site. $$ 200-100, U1800 130-80, U1600 120-70, U1400 110-70, Unr. 60. Reg. 8:30- +9:30. Rds. 10-2:30-7, 10-2:30. Scholastic: 2/4 ONLY. Open to Grades 12 and +below. 4-SS, G/30. EF: $5 by 1/31, $7 at site. Assorted Chess books, equipment +& trophies. Reg. 8-9 am Sunday. Rds. 9:30-11-2:15-3:45. SCCF memb. req'd +except for Scholastic. Half-point byes: Rd 1 inform TD no later than 1/31. +Other rds inform TD at end of 1st rd. No last-rd byes. No byes for Scholastic. +Ent: Thomas Oakes, same as above. NS. NC. W. + +Feb. 3-5 or 4-5 GPP: 10 Florida 7th Annual Tallahassee Open. 5-SS, 30/90, +SD/60. Holiday Inn Northwest, I-10 interchange at US 27 North, 2417 Graves Rd, +Tallahassee, FL 32303. $$b/70: $3100. 4 sections. Open: $600-300-200, U1800: +$400-250-150, U1600: $350-200-100, U1400: $300-150-100. EF: $51. Unr limited +to winning $100 except in Open. Reg. 6-8 pm Friday, 9-10 am Saturday. Rd. 1 at +8 pm Friday OR 10 am Saturday (G/60). Rds 2-5, Saturday 1-6:30, Sunday 9-2:15. +Half-point bye any rd if requested before rd 1. Re-entry allowed on Saturday +before 10 am, $25. Ent: Tallahassee Chess Assoc, c/o Jay Ter Louw, 3305 Vassar +Ct, Tallahassee FL 32308, (904)668-3807. HR: $55 + tax, includes full +breakfast buffet for 2. $5 additional per person. HP: (904)562-2000. + +Feb. 3-4 GPP: 10 New York Marshall Chess Club February Grand Prix. 4-SS, +30/90, SD/1. Marshall Chess Club, 23 W 10 St., NYC 10011. 2 sections: Open: to +all. $$(300 G top two places, other prizes b/24): 200-100-60, U2200 $90. +Amateur: Open to U2000. $$(275 b/16): 150-75, U1800 $50. Both, EF: $35, $20 +membs. Reg. 10:15-10:45 am. Rds. 11-4:30 each day. Ent: as above. NS. NC. +FIDE. + +Feb. 3-4 GPP: 10 South Dakota 1st Joe House Coffee Classic. 5-SS, 40/2, +30/SD. Joe House, 311 3rd St., Brookings, SD 57006. EF: $21 by 2/1, $26 at +site. $$ 500 G: 175-125-50, B,C,D/E/Unr each $50. Reg. 8-8:45. Rds. 9-2-7, 9- +2. Ent: Andrew Westberg, 1504 5th St. S #10, Brookings, SD 57006. (605)692- +2364. NC. + +Feb. 9-11 or 10-11 GPP: 20 West Virginia 4th annual Atlantic Class +Championship. 5-SS, 40/2, SD/1 (2-day option, rd 1 G/60). Cliffside Inn, U.S. +Hwy 340, Harpers Ferry 25425 (about 70 minutes drive from Washington or +Baltimore, 2 hours from Harrisburg). $$ 6000 b/140 paid entries, otherwise in +proportion except minimum 2/3 of each prize guaranteed. Free parking. 6 +sections: Master (over 2199): $$ 700-350-200. Expert (2000-2199): $$ 500-300- +150. Class A (1800-1999): $$ 500-300-150. Class B (1600-1799): $$ 500-300-150. +Class C (1400-1599): $$ 500-300-150. Class D/E (Under 1400): $$ 500-300-150. +Unrated may enter any section, but may not win over $200 in A, $150 in B, $100 +in C, $50 in D/E. EF: 3-day $68, 2-day $67 if check mailed by 2/1, all $70 +with credit card by 2/7, $75 at tmt. No checks at site. GMs free; $60 deducted +from prize. Advance EF $5 less to WVCA members. Special EF: $30 less to +Unrated. $30 less to juniors U18 who are rated U1500 or play up one class. Re- +entry: $40. You must request special EF when calling, or will be charged $70. +Special EF players count as 1/2 entries toward prize fund, but may win full +prizes. Rated players age 18 & over may play one class up for $10 extra. +Credit cards accepted at site or by phone call (914)496-9658 weekdays 11/14- +12/21 or 1/1-24. Also 24-hour daily number for entries only (no questions) +through 2/7: (914)437-0079. No phone entries after 2/7. 3-day schedule: Reg. +ends Fri 7 pm. Rds. 8, 1-7:15, 10-4:15. 2-day schedule: Reg. ends Sat. 9 am, +1st rd 10 am, then merges with 3-day. All: Bye: all, rds 4-5 must commit +before rd 2. HR: $50-60, (800)782-9437, (304)535-6302, reserve by 1/19. Ent: +Bill Goichberg, PO Box 61776, Arcadia, CA 91066-1776. Checks payable to Bill +Goichberg. (914)496-9658 through 1/24. (914)496-7469 recorded info. NS. NC. W. +FIDE. + +Feb. 11 GPP: 10 New Jersey Westfield Novag Grand Prix #1. 4-SS, G/30. +Westfield Y, 138 Ferris Pl, Westfield NJ 07090. $$ (top three guaranteed, +others b/20): 125-112.50-100, U2300 $50, U2100 $50. EF: $30, $25 members. Reg. +6:15-6:45 pm. Rds. 7-8:15-9:30-10:45. Held same evening with Westfield Under +2000 #1. NS. + +March 1-3 or 2-3 GPP: 100 California 4th Annual Pacific Coast Open. 5-SS, +40/2, SD/1 (2-day option, rd. 1 G/60). Wyndham Hotel at Los Angeles Airport, +6225 West Century Blvd, Los Angeles 90045. Special parking rate $2/day. $$ +25,000 b/350 paid entries, else in proportion except minimum $20,000 (80% of +each prize) guaranteed. Unr must enter Unr or Open sections. 8 sections. Open: +$$ 2000-1200-800-500, U2400/Unr 1000-600-400. Under 2200: $$ 1600-800-400-300. +Under 2000: $$ 1600-800-400-300. Under 1800: $$1600-800- 400-300. Under 1600: +$$ 1600-800-400-300. Under 1400: $$ 1600-800-400-300. Under 1200: $$ 800-400- +200-100. Unrated: $$ 800-400-200-100. All players will obtain ratings. +Provisionally rated players are not unrated. Non-U.S. citizens without +established ratings (20 or more games) on 2/96 or prior USCF list or +acceptable foreign ratings may not win over $1000 in U2000, $800 in U1800, +$600 in U1600, $400 in U1400, $200 in U1200, $200 in Unrated. EF: 3-day $98, 2- +day $97 if check mailed by 1/24; 3-day $108, 2-day $107 if check mailed by +2/22; all $120 at site. No checks at site. Credit card entries: $100 by 1/24, +$110 by 2/28, $120 at site. GMs over 2600 free; $90 deducted from any prize. +Special EF: $50 less for Unrated Section. $50 less to juniors U18 who are +rated below 1500 or play up. Re-entry: $50. You must request special EF when +calling, or will be charged full fee. Special EF players count as half entries +toward prize fund, but may win full prizes. Credit card entries: call (914)496- +9658 weekdays 1/1-24 or (914)437-0079 24 hrs daily through 2/28. No phone +entries after 2/28. 3-day schedule: Reg. ends Fri 7 pm, rds. Fri 8, Sat 1- +7:15, Sun 10-4:15. 2-day schedule: Reg. ends Sat. 9 am. 1st rd 10 am, then +merges with 3-day. All: SCCF memb $12, $7 Jrs req'd for rated Southern CA +residents. Bye: all, rds 4-5 must commit before rd 2. HR: $69-69-79-79, +(310)670-9000, reserve by 2/16. Ent: Bill Goichberg, PO Box 661776, Arcadia, +CA 91066-1776. Checks payable to Bill Goichberg. NS. NC. W. FIDE. + +March 8-10 or 9-10 GPP: 80 Massachusetts 5th Annual Eastern Class +Championships. 5-SS, 40/2, SD/1 (2-day option, rd 1 G/60), Holiday Inn Crowne +Plaza, 2 Forbes Rd (near I-95 Exit 36 & I-93 Montvale Ave Exit), Woburn 01801. +Free parking. Free analysis of your games by GM Michael Rohde. $$ 20,000 b/290 +paid entries, else in proportion except minimum $14,000 (70% of each prize) +guaranteed. Unr must enter Unr section. 8 sections: Master (over 2199): $$ +2000-1000-600-350, U2400 1000-500. Expert (2000-2199): $$ 1500-700-400-200. +Class A (1800-1999): $$ 1500-700-400-200. Class B (1600-1799): $$ 1500-700-400- +200. Class C (1400-1599): $$ 1400-700-400-200. Class D (1200-1399): $$ 1200- +600-400-200. Class E (U1200): $$ 400-200-100. Unrated: $$ 200-100-50. All +players will obtain ratings. Provisionally rated players are not unrated. Non- +U.S. citizens without established ratings (20 or more games) on 2/96 or prior +USCF list or acceptable foreign ratings may not win over $1000 in Class A, +$800 in B, $600 in C, $400 in D, $100 in E, $100 in Unr. EF: 3-day $88, 2-day +$87 if check mailed by 1/24; 3-day $98, 2-day $97 if check mailed by 2/29; all +$110 at site. No checks at site. Credit card entries: $90 by 1/24, $100 by +3/6, $110 at site. GMs over 2600 free; $80 deducted from any prize. Special +EF: $70 less to Unrated. $40 less to juniors under 18 who are rated below 1500 +or play up. Special EF players count as half entries for calculation of prize +fund, but may win full prizes. Rated players age 18 & over may play one class +up for $10 extra. Credit card entries: call (914)496-9658 weekdays 1/1-24 or +3/5-6, or (914)437-0079 24 hrs daily through 3/6. 3-day schedule: Reg. ends +Fri 7 pm, rds Fri 8, Sat 1-7:15, Sun 10-4:15. 2-day schedule: Reg. ends Sat. 9 +am, 1st rd 10 am, then merges with 3-day. All: Home state memb $12, $6 U18 +req'd for rated MA, NH, RI, or ME residents. Bye: all, rds 4-5 must commit +before rd 2. HR: $65-65, (617)932-0999, reserve by 2/23. Ent: Continental +Chess Assn., PO Box 249, Salisbury Mills, NY 12577. (914)496-9658 (1/1-24, 3/5- +6), (914)496-7469 (recording). NS. NC. W. FIDE. + +March 15-17 March 16-17 GPP: 80 Illinois Mid-America Class Championships in +Chicago. 5-SS, 40/2, 25/1, SD/30 (2-day schedule rds 1 and 2 G/90). Ramada +Hotel O'Hare, 6600 N Mannheim Rd, Rosemont, IL 60018 (less than one mile from +O'Hare Airport with free Ramada pick up service). $$ 15,000 prize fund is +fully guaranteed and will not be reduced. In eight sections. Master: $$G 2000- +1000-500-300-200, U2400 500-200, U2300 300-100. Expert: $$G 1000-500-250, +U2100 250. Class A: $$G 1000-500-250, U1900 250. Class B: $$G 1000-500-250, +U1700 250. Class C: $$G 1000-500-250. U1500 $250. Class D: $$G 500-250, U1300 +150. Class E: $$G 300-200, U1100 100, U1000 100. Unrated: $$G 200-100. All, +EF: $70 if postmarked by 3/7, $10 more at door. USCF Jrs play for $30 if paid +in advance only. Entry fee for the unrated section is $25. Unrated players +joining USCF and ICA pay no entry fee to play in the unrated section. Team +discount: if four entries are sent together in advance, the player with the +lowest entry fee plays free. Add $1 to any entry fee for 2-day schedule. +Unrateds may play in the master section or in the unrated section, not in any +class section. Half-point byes available in rds 1-4 if requested in advance. +Add 50 cents to advance entry for first rd bye only. ICA memb. $14, $8 jrs U20 +is req'd of all Illinois residents. This is an ICA MAXI-TOUR EVENT. You may +play up one section higher than your rating for $5 additional. CCA ratings may +be used if higher than USCF February supplement. Reg. 4-7 pm. on Friday, 3/15, +8-9 am on Saturday, 3/16. Rds 3-day schedule 8, 10-5, 10-5. 2-day schedule rds +1 & 2 at 10-1:30, then merges with 3-day for rd 3 at 5 pm. Free Raffle before +rd 5. Chess sets provided for tournament play only; not for skittles. Please +bring chess clocks! Browse the Midwest's largest chess book concession by Jim +and Helen Warren of APCT. HR: 63-63-68-68. (708)827-5131. Make your +reservation by 3/1 to be assured a room. Be sure to ask for the Chess Rates. +Special airfare discounts from Classic Travel 1-800-488-6080. Ent/Info: Walter +Brown, 811 Elrose Ct, Crest Hill, IL 60435. (815)723-9453. Visa & MasterCard +accepted. Check out our WEB page at +http://www.mos.net/alanl/chess/MidAmerica.html. NS. W. FIDE. + +April 3-7 GPP: 200 New Jersey April 4-7 (other sections) New York Open +1996. 40/2, SD/60. Radisson Hotel Newark Airport (EWR), 128 Frontage Rd, +Newark, NJ (20 minutes from midtown Manhattan). $$G 100,000. 5 sections. Open: +to all. 9-SS. $$ 10,000-5,000-2,500-1,250-600-600-500-400-400-300, U2400/Unr. +$2,000-1,000-750-500. GM-IM norms and FIDE ratings possible. SECTION II: open +to U2200 (no unrateds). 7-SS. $$ 8,000-4,000-2,000-1,000-600-600-500-400-400- +300, U2100 $2,000-1,000-500. SECTION III: open to U2000 (no unrateds). 7-SS. +$$ 7,000-3,500-1,800-900-600-600-500-400-400-300, U1900 $2,000-1,000-500. +SECTION IV: open to U1800 (no unrateds). 7-SS. $$ 6,000-3,000-1,500-900-600- +600-500-400-400-300, U1700 $2,000-1,000-500. SECTION V: open to U1600 (no +unrateds). 7-SS. $$ 5,000-2,500-1,200-600-400-400-300-300-300-300, U1500 +$1,800-900-500, U1400 $800-400. All, EF: $196 if sent by 2/5, $211 if sent by +3/4, $226 thereafter. $100 discount for players under 14 years and rated +U1400. Free entry to GMs who win no prize. EF deducted from their prize, if +any. All non-U.S. players must send bank check or money order in U.S. funds; +no non-U.S. personal checks accepted. No personal checks accepted after 3/20 +or at the door. Players who win prizes in both the regular prize fund and +class prizes will receive the larger of the two, but not both. Provisionally +rated players cannot win more than $4,000 in Section II, $3,000 in Section +III, $2,000 in Section IV, $1,000 in Section V. Schedule for Open Section: +Regular Schedule: 7 pm Wed. 4/3, 10 am & 5 pm Thurs. 4/4 to Sun. 4/7. +Accelerated Schedule: First three rds. at G/60 at 5 pm, 7:30 pm, 10 pm Thurs +join regular schedule at 10 am Fri. for rd. 4. Schedule for Sections II to V: +Regular Schedule: 7 pm Thurs. 4/4, 10 am & 5 pm Fri 4/5 to Sun. 4/7. +Accelerated schedule #1: First two rds at G/60 at 12 noon and 2:30 pm Fri. +Join regular schedule at 5 pm Fri. for rd. 3. Accelerated schedule #2: First +three rds. at G/60 at 5 pm, 7:30 pm & 10 pm Fri. Join regular schedule at 10 +am Sat. for rd. 4. Reg. 10 am to 10 pm Wed. 4/3, 11-6 pm Thurs. 4/4, 9-4 pm +Fri. 4/5 for accelerated schedules. USCF, FIDE, CFC, & FQE are the only +ratings used in this tournament. Players without any of these ratings are +considered unrated. All these ratings are used on an equal basis. In the case +of players rated under more than one system, highest rating will be used. +February USCF official bulletin will be used (March Chess Life label). For +previously unrated or provisionally rated players, the April USCF bulletin +will be used. Because the Open Section is an international tournament, FIDE +ratings will be used for both pairing and prize money purposes in this +section. Only if a player in the Open Section does not have a FIDE rating, +will his or her USCF or Canadian rating be used. Provisionally rated foreign +players and unrated players must play in Open Section. Tournament Organizer +reserves the right to assign estimated rating to any player, and to expel +improperly rated players from a section in progress in order to protect the +integrity of the tournament. Re-entry System: Players may re-enter any section +with byes as needed for $100. If you switch to a later schedule, you could +start fresh in rd. 1. Half-point byes available in advance for all rounds. +(Last two rounds MUST be requested BEFORE start of tournament). HR: Great low +room rates: $72 for sgl,dbl,triple or quad. MAKE ROOM RESERVATIONS EARLY! For +room reservations only, call the Radisson Reservations directly at 800-333- +3333. You must mention that you are attending the New York Open Chess +Tournament. If you need to contact the hotel directly, their number is 201-690- +5500. If you have difficulty obtaining a room reservation, please note the +name of the person you spoke to and call the New York Open office for +assistance. Information to be sent with registration: Name, Address, Phone, +USCF ID number and Expiration, Rating, Section, Schedule, and Byes (if any) +desired. Ent: New York Open, Inc., 21 West 46th St., Suite 1004, New York, NY +10036. (212)719-4204, fax (212)719-4369, NS. NC. FIDE. + +April 26-28. 1996 National Open. See National Events. + diff --git a/data/uscf/help b/data/uscf/help new file mode 100644 index 0000000..3792945 --- /dev/null +++ b/data/uscf/help @@ -0,0 +1,25 @@ + +uscf + +Usage: uscf [string] + + As a service to users, USCF (the United States Chess Federation) has given +us a file of USCF tournament information. We have these tournaments divided +into several sections (similarly to "Chess Life"): National, Gran_prix, +Beginners and the various states of the United States according to state +appreviation (with two sections for CA: ca_n and ca_s for northern and +southern California). + + Typing "uscf" alone will list the various files that can be used as strings +for this command. Use "string" to select which of these states or types of +tournaments to display. For example, "uscf ny" will display upcoming +tournaments in New York and "uscf gran_prix" will list upcoming Gran Prix +events (tournaments having points that count to a special annual prize). +Typing "uscf help" will display this help file. + + Information about USCF is presented in the "uscf_faq" help file. + +See Also: uscf_faq + +[Last modified: October 23, 1995 -- Friar] + diff --git a/data/uscf/hi b/data/uscf/hi new file mode 100644 index 0000000..9fe0d95 --- /dev/null +++ b/data/uscf/hi @@ -0,0 +1,10 @@ + +HAWAII + +Jan. 13-15. What This State Needs is a Good $5 Chess Tournament. 5-SS, 40/90, +SD/30. Kailua Community Room, Kailua Safeway (around back & upstairs), 200 +Hamakua Drive, Kailua. EF: $5 if rec'd by 1/10, $10 thereafter. $$ (75 b/30): +1st $50, 2nd $25, trophy to Top A,B,C,D/E, Unr. Reg. 1/13, 8-8:45 am. Rds. 9- +1:30, 9-1:30, 9 am. State membr req'd $5, OSA. Ent: Larry Reifurth, 1253 +Mokulua Drive, Kailua, HI 96734. (808)262-5475. NS. NC. + diff --git a/data/uscf/ia b/data/uscf/ia new file mode 100644 index 0000000..10c8083 --- /dev/null +++ b/data/uscf/ia @@ -0,0 +1,9 @@ + +IOWA + +Jan. 20. Snow Fort Open. 4-SS, G/60. Best Western Starlite Village, I-235 on +Third St., Des Moines, IA 50309. Open: to all. EF: $17 by 1/17, $20 at site. +$$ (270 b/24): 84-42, A,B,C,D,E,Unr. $24 ea. Reg. 8:30-9:30. Rds. 10-12:15- +2:30-4:45. Ent: Robert D. Beelman, 2103 W 1st St. #8, Ankeny, IA 50021. NS. +NC. W. + diff --git a/data/uscf/id b/data/uscf/id new file mode 100644 index 0000000..b329f27 --- /dev/null +++ b/data/uscf/id @@ -0,0 +1,12 @@ +IDAHO + +Nov. 11-12. 1995 Idaho Class Championships. 4-SS or 4-RR, 35/90, SD/30. +Obenchain Insurance Building, 264 Main Ave S, Twin Falls, ID. EF: $20 if +rec'd by 11/8, $25 at site. Prizes: Trophies to 1st and 2nd in X,A,B,C,D,E. +Trophies to 1st in Junior, Senior, Unrated. Reg. 7:30-8:30 am. Rds. 10-3, +10-3. State memb. req'd $7, OSA. HR: Econolodge, Twin Falls, (208)733-8770 +ask for tournament rates. Swiss system or round robin, depending on +number of entrants in each class. May combine classes. Ent: Magic Valley +Chess Club, c/o Barry D Eacker, 963 Del Mar Dr, Twin Falls, ID 83301. +(208)733-6186. NS. NC. NW. + diff --git a/data/uscf/il b/data/uscf/il new file mode 100644 index 0000000..2e21122 --- /dev/null +++ b/data/uscf/il @@ -0,0 +1,69 @@ + +ILLINOIS + +Dec. 16. Tim Just's Beat Your Norm Holiday Special. 4-SS, G/60. College of +Lake County (Main Bldg.), 19351 W Washington at Rt 45, Grayslake, IL 60030. +Open: to all. $$ 500 b/50. EF: $10 by 12/12, $20 at site. $$ 100-75-50. Class +$$ pd for each 1/2 pt scored above your norm: A $25 ea. 1/2 pt above 2.5, B +$20 ea. 1/2 pt above 2, C $15 ea. 1/2 pt above 1.5, D/E $10 ea. 1/2 pt above +1, Best Unr. $10. Reg. 8:30-9. Rds. 9:15-12-2:15-4:30. Ent: Tim Just, 37165 +Willow Ln, Gurnee, IL 60031. (708)244-7954. NS. NC. W. + +Dec. 16 (QC). Tuley Park Quick Chess #14. 4, 5, or 6-SS (depends on number of +players). 501 E. 90th Pl, Chicago, IL 60619. EF: $12, $6 under 19, $1 discount +before 11:30. $$ (80% to 85% of EF). Reg. 11-11:45. Rd. 1 at 12. Ent: Tom +Fineberg, 7321 S. Shore Dr. 6D, Chicago, IL 60649. (312)721-3979. NS. NC. W. + +Dec. 17. Chicago CC Plus-Score Mini-Tour. 4-SS, G/60. Chicago Chess Club, 1149 +W Lunt (7000 North), Chicago 60626. (312)761-5050. EF: $15, $12 Jrs, CCC +membs. Prizes according to score: 4-0 $100, 3.5-.5 $50, 3-1 $25, 2.5-1.5 $12. +Reg. closes 12:30. Rd. 1 at 1. ICA memb req'd $14, $8 jrs. An ICA Tour Mini- +Event. NS. Dec. 23 (QC). Chicago CC Plus-Score Quick. 6-SS, G/29. Chicago +Chess Club, 1149 W Lunt (7000 No.), Chicago 60626. (312)761-5050. EF: $15, $12 +Jrs, CCC membs. Prizes according to score: 6-0 $100, 5.5-.5 $60, 5-1 $35, 4.5- +1.5 $20, 4-2 $12, 3.5-2.5 $5. Reg. closes 12:30. Rd. 1 at 1. NS. Dec. 30. +Chicago CC Ten O'Clock Plus-Score. 4-SS, 40/60, SD/30. Chicago Chess Club, +1149 W Lunt (7000 North), Chicago 60626. (312)761-5050. EF: $15, $12 Jrs, CCC +membs. Prizes according to score: 4-0 $100, 3.5-.5 $50, 3-1 $25, 2.5-1.5 $12. +Reg. closes 9:30 am. Rd 1 at 10. NS. + +Jan. 1. Illinois Chess '96. 3-SS, 40/80, 30/60. St. Paul United Church of +Christ, Locust & St. Paul Streets, Columbia, IL (two short blocks west of Main +St.). EF: $10. $$ (based on 36 entries): overall 1st $60, 1st each six player +section $30. Reg. 9:30-10:15 am. Rds. 10:30-2-5:30. Ent: Russell Day, 232 Hill +Castle Drive, Columbia, IL 62236. (618)281-5283. NS. NC. Jan. 13 (QC). Tuley +Park Quick Chess #1. 4, 5, or 6-SS, G/15 to G/25 (both depend on number of +players). 501 E. 90th Pl, Chicago, IL 60619. EF: $12, $6 under 19, $1 discount +before 11:30. $$ (200 b/24, $120 G). Reg. 11-11:45. Rd. 1 at 12. Ent: Tom +Fineberg, 7321 S. Shore Dr. 6D, Chicago, IL 60649. (312)721-3979. NS. NC. W. + +Jan. 20. MacArthur School's Northwest Scholastic Open. Keller Middle School, +820 Bode Rd, Schaumburg IL 60194. Open to all students Grades K-8. 3 +sections. Primary: grades K-3. Elementary: grades 4-5. 5-SS, G/30. Jr. High: +grades 6-8. 4-SS, G/45. Trophies to top seven individuals and teams in ea. +sect; also top 3 individuals in ea. grade level. Medals for all plus scores, +books for upset prizes, master demonstrations, book concession, & more. +Advance entry only. No on-site reg. Limited to first 400 entries, EF: $10 must +be rec'd by Jan. 15. Make ck payable to MacArthur School. USCF Scholastic +memb. req'd $10 (may be added to EF, also available at site). Reg. 8:15-9 am +(no later than 9 to be eligible for Rd 1 at 9:30. Ent: Mike Schleif, 1815 +Claremont Rd, Hoffman Estates, IL 60195. Info: (708)882-2359. NS. NC. W. + +Jan. 20. Peoria Tornado. 4-SS, G/80. Garrett Ctr, 824 Duryea Pl, Peoria, IL +61625. Open to all. EF: $11 by 1/18, $15 at site. $$ 125 G: 75-50, chess book +to A, B, C, D. Reg. 8-8:45. Rds. 9-12-2:45-5:30. State memb. req'd $14, $8 +jrs, OSA. ICA Mini-Tour. Half-point bye in any rd. Ent: Bill Naff, 212 W Vail +Ct, Peoria, IL 61614. NS. NW. + +Jan. 27-28. Tim Just's Winter Open XI. 5-SS, 40/90, G/30. College of Lake +County(Main Bldg.), 19351 W Washington Rt 45, Grayslake, IL 60030. $$ (2000 +b/70). Open: all. $$250-175-150, X,A/below 125-100, Unr must play for top +prize. Reserve: U1800. $$250-175-150, C 125-100, D/E 100, Unr 75 only. All, +EF: $25 by 1/21 (mail), $35 site/phone. Reg. 8-8:40. Rds. 9-1:30-6, 10-2:30. +State mem req'd $14, $8 Jr., OSA. Ent: Tim Just, 37165 Willow Ln, Gurnee, IL +60031. (708)244-7954. NS. NC. W. + +February 17-18. U.S. Amateur Team Championship Midwest. See National Events. +March 7-10. U.S. Masters (in 1996 incorporating the Midwest Masters IX). See +Grand Prix. March 15-17. Mid-America Class Championships. See G.P. + diff --git a/data/uscf/in b/data/uscf/in new file mode 100644 index 0000000..e71b9b9 --- /dev/null +++ b/data/uscf/in @@ -0,0 +1,37 @@ + +INDIANA + +Dec. 16. Indy Chess Center December Tornado. 4-SS, G/90. Washington Street +Presbyterian Church, 1802 W Washington St., Indianapolis, IN. Open to all. EF: +$15 by 12/14, $20 at site. $$ 250 b/30: 100-50, A,B,C,D/E/Unr each $25. Reg. 9- +9:45 am. Rds. 10-1-4-7. Ent: Michael Turner, 1002 Summitview Pl, Bloomington, +IN 47401. (812)331-8331. NS. NC. W. + +Dec. 23. Chessterton December Swiss. 3-SS, 25/60, SD/60. Westchester Public +Library, 200 W Indiana, Chesterton, IN 46314. Sections of 8-12 players by +rating. EF: $15, $10 to HS/below. $$ 60, 30 each section, prizes increased in +large section. Reg. 8:30-9:15. Rds. 9:30-1:30-6. Ent: Randall Pals, 1233 +Morningside Dr., Chesterton, IN 46304. (219)926-2266. NS. NC. Jan. 6. Joepye +Freebie (almost). 4-SS, rds 1&2 G/75, rds 3&4 G/90. Middlebury Public Library, +116 N Main St., Middlebury, IN 46540. Free entry. ISCA memb. req'd $12, $6 +Jrs, OSA. Reg. 8:30-8:50 am. Rds. 9-12-2:30-6. Sets, boards, and clocks +provided. Ent/Info: Joe Riegsecker, 55605 CR 33, Middlebury, IN 46540. +(219)825-9218. E-mail: joepye@delphi.com. NS. NC. Jan. 13. New Year Open. 4- +SS, G/70. Noble Romans, 2403 Washington Ave, Evansville, IN 47714. $$ 440 +b/30. Open: to all. EF: $20 if rec'd by 1/12, $25 at site. $125-75, A,B,C,D/E +$60 each. Reg. 10:30-11:15. Rds. 11:30-2:20-4-7:30. Hoosier Mini Tour Event. +Cks Payable/Ent: Evansville Chess Club, 1131 S. Harlan, Evansville, IN 47714. +(812)477-7086 Ask for Randy. NS. NC. W. + +Jan. 20-21. Southern Indiana Open. 5-SS, 30/90, SD/60. Indiana Univ. School of +Business, E 10th St. Rm 103, Bloomington, IN. Open to all. EF: $20 by 12/18, +$25 at site. $$ 410 b/30: 120-60-30, A,B,C,D/E/Unr each 30-20. State memb. +req'd $12, OSA. Hoosier Tour Maxi-Point Event. Ent: Michael Turner, 1002 +Summitview Place, Bloomington, IN 47401. (812)331-8331. NS. NC. W. + +Jan. 27. Chessterton January Open. 4-SS, G/90. Westchester Public Library, 200 +W Indiana, Chesterton, IN 46304. EF: $15, $10 to HS/below. $$ (310 b/30): 100- +50, U2000 $45, U1800 $40, U1600 $35, U1400 $25, U1200 $15. Reg. 8:30-9:15 am. +Rds. 9:30-12-3-6. Ent: Randall Pals, 1233 Morningside Dr., Chesterton, IN +46304. (219)926-2266. NS. NC. + diff --git a/data/uscf/ks b/data/uscf/ks new file mode 100644 index 0000000..8c1f2e6 --- /dev/null +++ b/data/uscf/ks @@ -0,0 +1,23 @@ +KANSAS + +October 7-8. Second Annual Don Oswald Memorial Open. See Grand Prix. + +Oct. 21-22. Wichita Open. 5-SS, G/90, Columbia Room, Days Inn East, 8300 E +Kellogg, Wichita, KS. $$ 850 b/40. Open: EF: $30 if postmarked by 10/16, +$40 at site. $$ 150-100, A,B,C, D/E/Unr. each 90-60. Reg. 9-9:45. Rds. +10-2-6, 10-2. State memb. req'd $7, OSA. HR: $36 for 1-4, (316)684-0541. +Ent: Ralph E Bowman, 215 S Webster, Erie, KS 66733. (316)244-5683. No phone +entries. NS. NC. + +Nov. 9, Dec. 14 (QC). Johnson County CC November, December G/10. 5-SS, +G/10. Two separate events. Leawood United Methodist Church, 2915 W 95th St, +Leawood, KS 66206. Trophies given to top score in each 1/3 of tournament. +EF: $3 (free to membs). Reg. 6:30-7 pm. Rds. 7-7:30-8-8:30-9. Ent: Mark +Stewart, 7601 Newton, Overland Park, KS 66204. (913)341-8915. NS. NC. W. + +Nov. 18. Eastern Kansas Open. 4-SS, G/45, G/60, G/75, G/90. Vista Baptist +Church, X 901 North Parker, Olathe, KS 66061. EF: $25 advance, $35 at site. +$$ (1250 b/60): 150-100-60, A,B,C,D/E $125-75-35. Reg. 8-8:30. Rds. +9-11-1:30-4:30. State memb. req'd $7, OSA. Ent: Mark A. Stewart, 7601 +Newton, Overland Park, KS 66204. (913)341-8915. NS. NC. W. + diff --git a/data/uscf/ky b/data/uscf/ky new file mode 100644 index 0000000..34834f0 --- /dev/null +++ b/data/uscf/ky @@ -0,0 +1,23 @@ + +KENTUCKY + +Dec. 16. Pink Floyd Open (music played during rounds). 4-SS, G/75. Shoney's +Inn, Rm 118, Richmond Rd at New Circle, Lexington. $$ (520 b/29). 2 sections. +Open: open to all. $$ 100 to 1st, X,A,B,C/under each $70. U1400: open to +U1400. $$ D,E $70 each. Both, all money winners receive a Chess Mug. EF: $20, +Special entry for new USCF players. Reg. 9-9:45 am. Rds. 10-12:45-3:15-ASAP. +Info: Jerry Baker (606)887-2574. + +Dec. 16. Beachmont Open. 4-SS, G/80. Beachmont Community Center, Wellington, +Louisville, KY. $$ 440 b/40. 3 section. Open: open to all. $$ 100-40, X,A +each $50. U1800: open to U1800. $$ B,C each $50. U1400: open to U1400. $$ D,E +each $50. All, EF: $15 if rec'd by 12/14, $20 at site. $1 discount for state +membs. (any state). Reg. 9-9:30. Rds. 10-12:30-3-6. Ent: Steve Dillard, 610 +Upland Rd, Louisville, KY 40206. (502)895-1779. NS. NC. W. + +Dec. 16. 2nd Annual St. Denis Scholastic. 4-SS (team modified), G/60. St. +Denis School, 4309 Cane Run Rd, Louisville, KY. HS: K-12. Jr. High: K-9. +Elementary: K-6. Primary: K-3. All, EF: $8 by 12/12, $12 at site. Trophies: +1st-3rd team, 1st-7th individual. Reg. 9-9:30. Rds. 10-12-2-4. Ent: Tim +Chilton, 114 E Florence #20, Louisville, KY 40214. (502)367-8946. NS. NC. W. + diff --git a/data/uscf/la b/data/uscf/la new file mode 100644 index 0000000..ba2a98a --- /dev/null +++ b/data/uscf/la @@ -0,0 +1,14 @@ + +LOUISIANA + +Jan. 20. January Open. 4-SS, G/60. Mid City Motor Hotel, 725 Jordan & Line Ave +(I-20 Exit 18D South), Shreveport, LA 71101. (318)425-7481. Open to all. EF: +$18 by 1/13 or SKCC membs, $20 at site. $$(300 b/20): 100-75-50, U1600 $40, +U1400 $35. Reg. 8-8:45. Rds. 9-11:45-2:30-5. Ent/Enq: George Leritte, 5930 +Dillingham, Shreveport, LA 71106. (318)868-7828. NS. NC. W. + +Jan. 27. Camellia City IX. 4-SS, G/90. La Quinta Inn, I-10 at Gause Blvd (Exit +266), Slidell LA 70461. Open to all. EF: $25. $$(340 b/20): 120-80, U1600 $80- +60. Reg. 8:15-8:45. Rds. 9-12:10-3:20-6:30. No chewing tobacco. Ent: Glenn +Ruiz, 60311 Kay Dr., Lacombe, LA 7045. (504)882-7671. NS. NC. W. + diff --git a/data/uscf/ma b/data/uscf/ma new file mode 100644 index 0000000..e3716c8 --- /dev/null +++ b/data/uscf/ma @@ -0,0 +1,74 @@ + +MASSACHUSETTS + +Dec. 16. BCC Quads #8. 3-RR, G/60. BCC, 140 Clarendon St., Boston, MA 02116. +EF: $20, $15 to BCC membs. $$ 55 per quad. Reg. 9-10 am. Rds. 10:15-12:45-3. +State memb req'd $12, $6 jrs. BCC, 140 Clarendon S #8, Boston, MA 02116. +(617)351-07668. NS. NC. W. + +Dec. 17. Cavendish Holiday G/64 Open. 3-SS, G/64. Cavendish Club, 70 James +St., Suite 151, Worcester. Enter rear gate from Genessee St., door is at left +of dock #7. (508)753-0971. In five sections. $$360 G in prizes. Open: EF: $19 +by 12/15. $$ 100 1st. Under 2100: EF: $18 by 12/15. $$ 80 1st. Under 1900: EF: +$17 by 12/15. $$ 70 1st. Under 1700: EF: $16 by 12/15. $$ 60 1st. Under 1500: +EF: $15 by 12/15. $$ 50 1st. All: EF: $6 more at site. Reg. 8-9:30. Rds. 10- +12:30-3. Ent: Stephen Dann, Box 452, Worcester, MA 01613. (508)845-6446. NS. +NC. W. SASE. Dec. 17. Cavendish Beginners. 4-SS, G/64. Cavendish Club, 70 +James St., Suite 151, Worcester. Enter rear gate from Genesee St., door is at +left of dock #7. (508)753-0971. Open: open to under 1200/Unr. EF: $9 by 12/15, +$6 more at site. Book & equipment prizes to winners & students. Reg. 8-9:30. +Rds. 10-12-2-4. Ent: Stephen Dann, Box 452, Worcester, MA 01613. (508)845- +6446. NS. NC. W. SASE. + +Jan. 1. BCC Herr Healy Tournament & Open House. 4-SS, G/30. BCC, 140 Clarendon +St., Boston, MA 02116. 2 sections. Rated: open to all rated. Unrated: open to +all unrated. Both, EF: $15, $10 to BCC memb. $$ b/entries. Reg. 10-10:45 am. +Rds. 11-1-2:30-4. State memb req'd $12, $6 jrs, OSA. Ent: Bernardo Iglesias, +135 W Newton St. #1, Boston, MA 02118. (617)351-7668. NS. NC. W. + +Jan. 2-Jan. 30. Framingham Chess Club Winter Warmer Swiss. 5-SS, 40/90, SD/30. +Callahan Senior Citizen Center, 154 Pearl St., Framingham, MA 01701. EF: $25, +$20 FCC membs. $$(200 b/20): 100-50, U1750 $50. Reg. 7-7:25 pm. Rds. 7:30 each +Tues. Up to two half-point byes available for all rds (rds 4 and 5 only with +two weeks notice). Ent: Framingham C.C., PO Box 1182, Framingham, MA 01701. +(508)788-3641. NS. W. + +January 13-14. 19th Newton Open. See Grand Prix. Jan. 13 & 14. +Newton/Worcester Game 64's. Each day 3-SS, G/64. Cavendish Club, 70 James St., +Ste 151, Worcester. Enter rear gate from Genesee St., door is at left of dock +#7. (508)753-0971. $$ 1100G in daily & weekend prizes in five sections. Open: +EF: $24 per day by 1/11. $$ 100 1st daily, $64 bonus to weekend winner (Sat & +Sun added scores). Under 2100: EF: $20 per day by 1/11. $80 1st daily, $64 +bonus to weekend winner. Under 1900: EF: $19 per day by 1/11. $75 1st daily, +$64 bonus to weekend winner. Under 1700: EF: $18 per day by 1/11. $70 1st +daily, $64 bonus to weekend winner. Under 1500: EF: $17 per day by 1/11. $65 +1st daily, $64 bonus to weekend winner. All, EF: $6 more at site. $3 discount +if entering both days together in adv. or at site. Half-point byes avail. in +rds. 1 & 2 with adv. notice. Unr. players may not cash in lower sections. Reg. +8-9:30. Rds. 10-12:30-3 (each day). HR: Ramada Inn at Exit 10, Mass. Tpke, +Auburn (800)228-2828. Ask for special chess rates. Ent: Stephen Dann, Box 452, +Worcester, MA 01613 (508)845-6446. NS. NC. W. SASE. + +Jan. 14. Worcester Beginners. 4-SS, G/64. Cavendish Club, 70 James St., Ste +151, Worcester. Enter rear gate from Genesee St., door is at left of dock #7. +(508)753-0971. Open: to U1200/Unr. EF: $9 by 1/11, $15 at site. Book & equip. +prizes to winners & students. Reg. 8-9:30. Rds. 10-12-2-4. Ent: Stephen Dann, +Box 452, Worcester, MA 01613. (508)845-6446. NS. NC. W. SASE. + +Jan. 20. 6th Midwinter Classic. 3-SS, G/105. Florence Civic Center, Rt 9, +Northampton, MA. $$ 550 b/50. Open: to all. $$ 120-60, U2000 $40. Reserve: +open to U1800. $$ 90-50, U1600 $40. Amateur: open to U1400. $$ 80-40, U1200 +$30. All, EF: $20 by 1/15, $30 at door. Reg. 8-9:45. Rds. 10-2-6. $2 discount +for W.M.C.A. membs, 3 W.M.C.A. Grand Prix Points available. Ent: Cam Catarino, +135 Evergreen Dr., E Long Meadow, MA 01028. Ent: Cam Catarino, 135 Evergreen +Dr., E Long Meadow, MA 01028. (413)525-0757. NS. NC. W. + +Feb. 6-Feb. 27. Framingham Chess Club Shortest Month Swiss. 4-SS, 40/90, +SD/30. Callahan Senior Citizen Center, 154 Pearl St., Framingham MA 01701. +Open to all. EF: $20, $15 FCC membs. $$(150 b/20): 75, U1750 $50, Shortest Win +$25. Reg. 7-7:25. Rds. 7:30 each Tues. Up to two half-point byes available for +all rds (rd 4 only with two weeks notice). Ent: Framingham Chess Club, PO Box +1182, Framingham, MA 01701. (508)788-3641. NS. W. + +March 8-10. 5th Annual Eastern Class Championship. See Grand Prix. + diff --git a/data/uscf/md b/data/uscf/md new file mode 100644 index 0000000..d14c88e --- /dev/null +++ b/data/uscf/md @@ -0,0 +1,57 @@ + +MARYLAND + +Dec. 16. Herschel Mednick Memorial Maryland Junior Chess Championship. 4-SS. +Francis Scott Key Elementary School, 1425 E Fort McHenry Ave, Baltimore, MD. 2 +sections. Teen: open to U20, G/60. EF: $6 if rec'd by 12/9, $8 at site. $$ 100- +50-25 to top three MD residents and/or students, trophies to top five, top +U1200, top Unr., top 16, 15, 14, 13 yrs. old. Reg. 9-10 am. Rds. 10:30-1:30- +3:45-6. Pre-teen: open to U13, G/30. EF: $5 if rec'd by 12/10, $7 at site. +Trophies to top five, top U1000, top Unr., top 10, 9, 8, 7, 6 yrs. old. Reg. +10-11 am. Rds. 11:30-1:30-2:45-4. Half-point bye available rd 1. Both, only +Maryland residents can win cash prizes. Checks payable to "MCA,I." Ent: Robert +Erkes, 865 Lemmon Street, Baltimore, MD 21201. (410)625-2656. + +Dec. 17. Highlands E.S. Open. 5-SS, G/45. Baltimore Highlands E.S., 4200 +Annapolis Rd (Rt 648). Balt. Highlands, MD 21227. EF: $20 if rec'd by 12/3, +$25 at site. $$ (450 b/30, 1st G): 200-100, U2000, U1950, U1700 each $50, +other prizes pending. Reg. 9:45-10:20. Rds. 10:30-12:15-2:15-4-5:45. Half- +point bye available any round. Ent: Boris Zisman, 3507 Beagle Lane, Apt. 204, +Randallstown, MD 21133. (410)922-1287. NS. NC. + +Jan. 7. Hillcrest Sunday Action. 5-SS, G/30. Rec. Center Room, Hillcrest +Elementary School, Frederick Rd at S. Rolling Rd., 1.5 miles west of I695, +Catonsville, MD. EF: $12. $$ (b/20): 150: 70-30, class prizes 50, more based +on entries. Reg. 9:45-10:15. Rd. 1 at 10:30 am. Accelerated pairings may be +used. Info: Bob Giordani, (410)830-3508, daytime. + +Jan. 13-14. Mid-Atlantic Amateur Team Championship/USAT Warmup. 4-SS, 50/2, +SD/1. Hillcrest Elementary School, Frederick Rd at S Rolling Rd, Catonsville, +MD 21228. Open to four player teams with one optional alternate; team average +(four highest ratings - 1995 annual rating list) must be U2200. Teams must +play in rating order. EF: $40 per team in advance by 1/9, $48 at site, +$20/adv., $24 at site for scholastic teams made up of players from same +school; $10/adv. or $12/site for players wishing to be assigned to free agent +pool from which teams will be formed. Plaque plus entry fees paid to U.S. +Amateur Team Championship for top team, plaques to 2nd and top U2000, U1700, +U1400 and top scholastic teams, assuming 3 teams per category. $25 chess +book/eqpt gift cert to top boards 1-4. Reg. 8:15-9 on 1/13. Rds. 9:30-4, 10- +4:30. MCA memb. req'd, OSA. For entries, help in forming teams, reg for free +agent pool, and general info: Kurt Eschbach, 172 Circle Rd, Pasadena, MD +21122. (410)360-6341, mdchess@aol.com. Cks payable to Maryland Chess +Association. NS. NC. W. + +Jan. 14. Great Hopes Scholastics. 4-SS, G/30. Charles E Smith Jewish Day +School, 1901 East Jefferson St., Rockville, MD 20852. Primary Scholastic: open +to K-3. Elementary Scholastic: open to grades 4-6. Secondary Scholastic: open +to grades 7-12. All, EF: $7. Trophies to 1st, 2nd, 3rd, ribbons to all. Reg. +11:30-12. Rds. 12:30-1:45-3-4:15. No meat products inside the school. Info: +(301)654-1352. NS. NC. W. + +Jan. 27 & Feb. 24. Fourth Saturday In Annapolis. 5-SS, G/30. Wiley H Bates Jr. +High, Take Rowe Blvd exit from Rt 50, right on Taylor, right on Spa, left on +Greenfield. Open: to all. EF: $12 in advance, $15 at site. $$ (60% b/entries): +30%-20%-10% cash. Reg. 10-10:45. Rds. 11-12:15-2:30-3:45-5. ACC memb. $12, +Under 18 $12, Sr. Citizen $12. Ent: Annapolis Chess Club, PO Box 6083, +Annapolis, MD 21401. (410)741-1644 (Allan). NS. NC. W. + diff --git a/data/uscf/me b/data/uscf/me new file mode 100644 index 0000000..01181dd --- /dev/null +++ b/data/uscf/me @@ -0,0 +1,10 @@ + +MAINE + +Jan. 20-21. Portland Open. 5-SS, 40/90, SD/60, rd 5 45/2, SD/60. Holiday Inn, +Exit 8, 81 Riverside St., Portland, ME 04103. Open: to all. EF: $25 by 1/17, +$30 at site. $$ 180, U2000 $75. Reserve: open to U1800. EF: $20 by 1/17, $25 +at site. $$ 100, Class B,C,D/E/Unr each $50. Rds. (b/5 per class) 10-2-7, 9-2. +Ent: Stuart Laughlin, 68 Prospect St., Portland, ME 04103. (207)772-4103. NS. +NC. W. + diff --git a/data/uscf/mi b/data/uscf/mi new file mode 100644 index 0000000..869c805 --- /dev/null +++ b/data/uscf/mi @@ -0,0 +1,30 @@ + +MICHIGAN + +Dec. 16. December Kalamazoo Mini-Swiss. 3-SS, G/90. Kalamazoo Valley Community +College, I-94 Exit 72, South 1/2 mile, Kalamazoo, MI. EF: $20. Reg. 8:15-8:50. +Rds. 9-12:30-4. $$ 100-60 per section of 8-12. State memb. req'd. $15, OSA. +Ent: Stan Franklin, 7300 Lovers Lane, Portage, MI 49002. (616)323-3786. NS. +NC. W. + +Dec. 22. East Detroit Action Quads. 3-RR, SD/30. East Pointe Parks and +Recreation Center, 16600 Stephens, East Pointe, MI 48021. EF: $8 if rec'd by +12/16, $10 at site. $$ 25 1st per quad. Reg. 6:15-7:15. Rds. 7:30-8:30-9:30. +MCA memb. req'd $15. OSA. Ent: James A Jackson Jr., 14639 Greenview, Detroit, +MI 48223-2326. (313)837-1143. NS. NC. W. + +January 13-14. 1996 Michigan Masters/Experts Championships. See Grand Prix. +Jan. 13-14. 1996 Michigan Class Championships. 5-SS, 50/2, 25/1. Holiday Inn +Fairlane, 5801 Southfield Service Drive (at Ford Rd.), Detroit, MI 48228. 3 +sections. $$ (1450 b/24/class): Open to Class A,B,C: $30 if rec'd by 1/8, $40 +at site. $$ 200-125-75 + trophies each class. Open to Class D/E: $20 if rec'd +by 1/8, $30 at site. $$ 150-100 + trophies. Beginners: Open to unrateds. EF: +$10 if rec'd by 1/8, $20 at site. Trophies to Top 3. All, $5 discount if +staying in hotel (one discount per room). Reg. 8:30-9:30. Rds. 10-3-8, 10- +3:30. HR: $60, (313)336-3340. Ent: Tim Sawmiller, 24480 Riverview, Novi, MI +48374. (313)344-4269. NS. NC. Jan. 20. Kalamazoo January Mini-Swiss. 3-SS, +G/90. Kalamazoo Valley Community College, I-94 Exit 72 S 1/2 mile, Kalamazoo, +MI. 8-12 per sect. EF: $20. $$ 100-60 per sect. Reg. 8:15-8:50 Rds. 9-12:30-4. +State memb req'd $15, OSA. Ent: Stan Franklin, 7300 Lovers Ln, Portage, MI +49002. NS. NC. W. + diff --git a/data/uscf/mn b/data/uscf/mn new file mode 100644 index 0000000..db27503 --- /dev/null +++ b/data/uscf/mn @@ -0,0 +1,11 @@ + +MINNESOTA + +Dec. 17. Seven More Shopping Days Open. 4-SS, G/60. Thunderbird Hotel, 2201 E. +78th St., Bloomington, MN 55425. Open to all. EF: $27 if rec'd by 12/12, $32 +at site. $5 discount under 19, over 64. Will split into 2 sections with 25-30 +entries. $$ 550 b/25 (5/class): $150-100, U2000, U1800, U1600, U1400, U1200, +Unr. each $50. Reg. 10-10:30 am. Rds. 11-1:15-3:30-5:45. State membr. req'd +$12/yr, $6 jrs, OSA. Ent: Philip R. Smith, 401 E. Burnsville Pkwy #236, +Burnsville, MN 55337-2853. (612)890-2644. NS. NC. W. + diff --git a/data/uscf/mo b/data/uscf/mo new file mode 100644 index 0000000..a2e4856 --- /dev/null +++ b/data/uscf/mo @@ -0,0 +1,21 @@ + +MISSOURI + +Dec. 23. 1995 Saint Louis Open and Reserve. See G.P. Dec. 30-31. 27th Annual +Christmas Tree Open. Note changes! 5-SS, 25/60, SD/60. Holiday Inn Express - +Westport Plaza, 801 Westport Road, Kansas City, MO 64111. 3 sections: Under +2400, Under 1800, Under 1400. EF: $35 if rec'd by 12/22, $40 at site. Special +entry fees: Jrs., Srs. & Unr. $25. $$ (2250 b/85 reg. entries): M,X,A,B,C,D,E +each $200-100, Unrated $100-50. Reg. 8:30-9:45. Rds. 10-3-7:30, 9-2. Half- +point bye available any round (max 2 byes), must commit 2 rds. in advance. HP: +(816)931-1000. Call for rates, mention tournament! Site is one-half mile north +of Country Club Plaza. Ent: Tim Blaco, 2922 Buchanan, North Kansas City, MO +64116. (816)842-2407. Checks payable to Tim Blaco. NS. NC. W. + +Jan. 27. Winter Action. 1/2 K, 5-SS, G/30. Grain Valley Civic Center, 105 +Armstrong Dr., Grain Valley, MO 64029. EF: $15 by 1/20, 20 at door. $$ 20 for +each player making class norm, 2nd $20 for each half point above norm. (Norms: +M=4.5, E=4, A=3.5, B=3, C=2.5 D/E=2). Reg. 9-9:45. Rds. 10-11:15-1-2:15-3:30. +State memb req'd $9, OSA. Ent: Bob Holliman, PO Box 634, Grain Valley, MO +64029. (816)224-9852. NS. NC. W. + diff --git a/data/uscf/ms b/data/uscf/ms new file mode 100644 index 0000000..492cdb6 --- /dev/null +++ b/data/uscf/ms @@ -0,0 +1,16 @@ + +MISSISSIPPI + +Jan. 13. MCA Fund Raiser. 5-SS, G/60. City Hall, Community Room, 2420 Old +Brandon Road, I-20 at Pearson Rd, (Ext. 48), Pearl, MS (two miles east of +Jackson, 2 red lights N). 2 sections. Open: trophies to 1st-2nd. Under 1700: +trophies to 1st-2nd. EF: $25, $15 under 18. State membr req'd $10, OSA. Reg. +7:45-8:45. Rds. 9-11-2-4-6. Info: George Brooks (601)825-4848. NS. NC. W. + +Feb. 10. 1st Dixie 60. 6-SS, G/60. City Hall Community Room, 2420 Old Brandon +Rd (I20 at Exit 48 Pearson Rd, 2 miles East of Jackson MS, 2nd red light +North), Pearl, MS. Open to all. EF: $25. $$ 330 b/28: 120-80-40, U1700 80-40- +20. Trophies to 1st & 2nd in Open and U1700. Reg. 7:45-8:45. Rds. 9-11-2-4-6- +8. Under 18: EF: $15. State memb req'd $10, OSA. Info: George Brooks, (601)825- +4848. NS. NC. W. + diff --git a/data/uscf/mt b/data/uscf/mt new file mode 100644 index 0000000..574feda --- /dev/null +++ b/data/uscf/mt @@ -0,0 +1,10 @@ +MONTANA + +Nov. 18-19. UCCC Turkey Open. 5-SS, G/2. University of Montana, Social +Science Building, Room 362, Missoula, MT. EF: $15 if rec'd by 11/16, $20 at +site. $$ (G 200): $100-50, U1800 $25, U1600 $15, U1400 $10. Reg. 8-8:30 am. +Rds. 9-2-7, 8:30-1. State memb. req'd $6, OSA. Plaque for biggest upset +(both must have non-provisional rating). All EFs, after 20 players, will be +added to prizes proportionately. Ent: Sherwood Moore, 453 Minnesota, +Missoula, MT 59802. (406)728-1695. NS. NC. W. + diff --git a/data/uscf/national b/data/uscf/national new file mode 100644 index 0000000..c27c5fb --- /dev/null +++ b/data/uscf/national @@ -0,0 +1,198 @@ +NATIONAL + +Golden Anniversary Event 1945-1995 + +December 26-29 New York Pan American Intercollegiate and Scholastic Team +Chess Championships. 6-SS, 50/2, 25/1. Manhattan Conference Center, Fiterman +Hall, 30 W. Broadway, New York, NY (site of the 1995 PCA Intel Grand Prix +Qualifier). 2 sections. Intercollegiate: open to college teams of four plus up +to two alternates, all team members must attend the same school; all +participants must be in degree-granting programs. EF: $100 for first team, $80 +for each additional team from the same school, if rec'd by 12/15. $$G 3000: +1000-600-400-200-200, Top A,B,C+under each $200; trophies to top 10 teams, top +A,B,C+under, top small school, top 2-year school, boards 1-4, top alternate. +Scholastic: open to scholastic teams of four plus up to two alternates, all +team members must attend the same school; Junior High/Middle School and +Elementary School teams are invited. EF: $80 for 1st team, $60 for each +additional team from the same school, if rec'd by 12/15. Trophies: Top 6 +teams, top Junior High/Middle School, top Elementary, top Primary, top +B,C,D+under, top boards 1-4, top alternate. Both, regular EF deadline 12/15, +$25 late fee will be added to each team entered after 12/15. Reg. ends 5 pm +12/26. Rds. 7, 11-6, 11-6, 10. HR: Incredible rates of $65 sgl, $75 dbl +offered by The Downtown Athletic Club, 19 West St., New York, NY (approx. 5 +blocks away through the World Trade Center). (212)425-7000. Mention "Pan-Am +Chess" to receive these rates and also free use of the athletic facility +during your stay plus free breakfast 12/27-29! Info: Dan Edelman (212)580- +6920, e-mail: isgv@gramercy.ios.com, WEB: http://www.redweb.com/panam/ Ent: +Make checks payable to International Sports & Games and send to International +Sports & Games, PO Box 20131, New York, NY 10025. + +January 13-15 North Carolina U.S. Junior Chess Congress-South. 7-SS, 25/60, +SD/60. Radisson Plaza Hotel, Trade & Tryon, Charlotte, NC 28280. 6 sections. +All, EF: $20 if postmarked by 12/31, $40 therefter. Prizes: 1st-10th, top +Unrated, 1st-3rd teams in each section. Age 8 and under: U1000, U900, U800. +Age 9-10: U1200, U1100, U1000. Age 11-12: U1400, U1300, U1200. Age 13-14: +U1600, U1400. Age 15-16: U1700, U1500. Age 17-18: U1800, U1600. Additional +trophies based on attendance. Three players per team. Reg. 1/12, 6-10 pm; +1/13, 8-10 am. Rds. 1-6, 9-2-7, 8-12. Other events: Speed 1/12, 6:30 pm EF $5; +Bughouse 1/14, 8 am EF $10 per team. Call (704)553-7708 for details. HR: +$71/night, 4/room. (704)377-0400. Ent: C.M.S.C.A., PO Box 221882, Charlotte, +NC 28222. (704)553-7708. NS. NC. W + +February 17-19 California 13th Annual U.S. Amateur Team Championship West. 6- +SS, 50/2, SD/60, Holiday Inn Buena Park, 7000 Beach Blvd., Buena Park, CA +90620. Four-player teams plus optional alternate w/average rating U2200; +rating difference between third and fourth player cannot exceed 1000 points. +EF: $80 per team in advance, $92 at site, under age 18 $56 in advance, $68 at +site. Trophies & BHB clocks to top 3 teams U2100, U2000, U1800, U1600, +U1400/Unr., trophies (one large, four small) to top college, industrial (if at +least three teams), junior (U18), Scholastic (same school), Master Quartz or +Game Timer clocks to best score each board & alternate and any 6-0 score. +Special prize TBA for best promotional idea and best team name. Reg. 8-10 am +2/17, Rds. 11-6 each day. Info, help in forming teams: Jerry Hanken (213)257- +9839, Paul Shannon (714)891-6398, Randy Hough (818)282-7412. HR: $49, (714)522- +7000 or 800-522-7006, mention chess. Ent: SCCF, P.O. Box 205, Monterey Park, +CA 91754. NS. NC. W. + +February 17-18 Illinois U.S. Amateur Team Championship Midwest. 50/2, SD/1, +(rds 1 & 2 45/90, SD/30). Clarion Hotel, 6810 N Mannheim Rd, Rosemont, IL +60018. Open: 4 player teams with one optional alternate. Team average (4 +highest ratings as of the 1995 annual list) must be U2200 and Board 4 may not +be more than 1000 pts below Board 3. EF: $80 if postmarked by 2/9, $95 at +site. Plaque plus 4 USCF GameTimer digital clocks to top team, plaque plus 4 +BHB clocks to 2nd & 3rd place teams. 4 BHB clocks each to top teams with +average rating below 2000, below 1800, below 1600, below 1400 and below 1200. +Trophies to top team in each state with 4 or more teams entered and in each of +the following categories with 4 or more teams entered: company, college, high +school(9-12), middle school(6-9), elementary school(K-6), junior(under 20), +and senior(over 50). Scholastic teams must be from the same school if local or +from the same city if traveling more than 50 miles. USCF GameTimer digital +clock for top player on each board 1 to 4. Special prize for best team name. +Reg. 7-8 pm. Fri., 8-9 am Sat. Roster changes after 8 pm Friday will require a +$15 late fee. Players may register as individuals for $25 and form teams at +the site. You must be here by 8:30 to be guaranteed a team assignment. Rds. 10- +2-7, 10-4. HR: 59-59-69-69 (708)297-8464, 297-1234. For more info or help in +forming teams call Walt Brown (815) 723-9453 or check out our WEB page at +http://www.mcs. net/ alanl/chess/ usatmw html. Ent: U.S. Chess Federation, 186 +Rt 9W, New Windsor, NY 12553, Attn: U.S. Amateur Team Midwest. (914)562-8350 +or (800)388-KING. NS. NC. W. + +February 17-19 New Jersey U.S. Amateur Team Championship East. 6-SS, 50/2, +SD/1. Parsippany Hilton, 1 Hilton Ct, Parsippany, NJ 07054 (201)267-7373 or 1- +800-HILTONS. Morris/Essex train to Morris Plains 1.5 miles. Open to four +player teams with one optional alternate. Team average (four highest ratings - +1995 Annual Rating List) must be under 2200. Regional winning team (advancing +to playoffs) may not have board three rated more than 1,000 points above board +four. Teams must play in strict rating order - no switching. EF: $80, $72 +Scholastic, $20 individual by 2/10, $92, $84 Scholastic, $25 individual after +2/10. Prizes: Top team plaque & four Seiko Quartz clocks; 2nd-5th place team +plaque & four BHB clocks; top team U2100, U2000, U1900, U1800, U1700, U1600, +U1500, U1400, U1200, U1000 each plaque & 4 BHB clocks; top 2 college teams +(same school), top HS team (grade 9-12, same school), top Middle School +(grades 5-9, same school), top Elem. team (grades K-6, same school), top 2 +Scholastics teams (mixed schools OK), Company team (four full-time employees), +Senior (all players over age 50) each plaque & 4 BHB clocks to top team; Mixed +Doubles (2 male, 2 female, no alternate), Family (4 family members), Military +(mixed branches OK), State teams: CT, DE, MD, MA, NJ, NY, PA, RI, VA, NC, +Ethel Collins Perseverance (lowest Scholastic) each plaque to top team; Best +Player, boards 1-4 and alternate, All players with 6-0 Score each Master +Quartz Clock; Biggest Individual Upset in each round Engraved Cross Pen; Team +with Best Costumes, Team with Biggest Upset in First Round each Gourmet Dinner +for Four. Entry Fee refunded to team with Best "Chess Related" Name. Reg. 9- +12, Saturday 2/17. Rds. 1-7, 11-6, 9:30-3:30. Special Events: Grandmaster +Lectures: Art Bisguier, Michael Rohde. Friday, Feb. 16, 8 pm. U.S. Team 5 +minute Tournament. EF: $10. Prizes trophies. Sunday, Feb. 18. Game 10. EF: +$15. $$ 100-50-50, A,B,C,D/E/Unr each $35. Reg. 8:30-9 am. Rds. 9-9:30-9:45- +10:10-10:30. HR: Address & phone above. $68 sgl/dbl, $72 triple/quad (reserve +early - sold out by 2/1). Travel Info: Jetport Travel, for special discounts +call 1-800-688-4521 (ask for Mike Glassman). For help forming teams or more +info: Roger Inglis (201)263-8696. E-mail questions: esdoyle@aol.com. WEB: +http://www.websong.com/chess/96USATE.htm1. Checks payable to USCF, Mail to: E. +Steven Doyle, 33 Starlight Drive, Morristown, NJ 07960. NS. NC. W. + +March 7-10 GPP: 200 Illinois 1996 U.S. Masters (in 1996 incorporating the +Midwest Masters IX). "The Homecoming of the American Master." 7-SS, 40/2, +20/1, SD/30. Hyatt Regency Oak Brook, 1909 Spring Rd, Oak Brook, IL 60521, +just 15 min. from O'Hare Airport. Free parking. Open: to players rated 2200+ +and all who have ever been so rated, plus six invited juniors. $$ 16,000 +unconditionally guaranteed. EF: $75 by 2/25, $90 thereafter until 3/2 +(postmark). No at door entries. GMs and IMs receive complimentary entry but +must confirm in writing their intent to play by 2/29. $$ 5000-3000-2000-1000- +800-500, 2400-2499 $500-300, 2300-2399 $500-300, 2200-2299 $400-200, U2200 +$400-200. Top scoring non-master junior $200. $500 in point prizes distributed +to non-winners of other prizes for 5 pts. & 4.5 pts. Best Game: $100. Best +Endgame $100. Trophies to U.S. Masters Ch, U.S. Masters Jr. Ch, and rating +groups as above. HR: $75 sgl/dbl. You must mention "U.S. Masters" when +reserving your room by phone (708)573-1234 or mail. Room reservations must be +made by 2/29 to secure chess rate. Half-point bye available for rd 1 or 2, but +must be requested with entry. Possible room sharing through Midwest Chess +Assoc. (Helen Warren) if req'd before 2/19. Rds. 7:30, 10:30-6, 10:30-6, 9:30- +5. Sets & boards will be provided. Please bring chess clocks. Ent: Helen +Warren, Midwest Chess Assoc, PO Box 305, Western Springs, IL 60558-0305. +(708)663-0688 or fax (708)663-0689. Checks payable to U.S. Masters/Midwest +Chess Association. VISA or MasterCard welcome. NS. NC. W. FIDE RATED. + +April 26-28 New Jersey 1996 National High School Chess Championship. 7-SS, +25/60, SD/60. Doubletree at Somerset, 200 Atrium Dr., Somerset, NJ 08873. +(908)469-2600. Reserve early in Host hotel will fill up early (Brand New +Hotel!). 3 Sections: K-12, K-12 U1400, K-12 U1100. EF: $20 before 4/3, $40 +after. Prizes: Trophies to the top 30 players and teams in each section, plus +plaques to four players on top five teams in each section. Rds. 1-6, 9-2-7, 9- +2. Special Events: Thursday, April 25, 7 pm. Five-minute Speed Championship. +EF: $7 with reg, $10 site. 20 trophies. Friday, April 26, 9 am: NJ Blitz (5 +min.). EF: $10 with reg, $12 at site. 30 trophies. Sunday, April 28, 6:30 pm: +Bughouse Championship. $20 per team. 20 trophies. Arthur Bisquier, IGM, +Analysis & Lectures during event. FREE! Surprises! & Fun! Travel info: Jetport +Travel, ask for Mike Glassman at 1-800-688-4521 (special discounts). +Complimentary bus service schedule as follows: Contact Carmen Grasso at +(609)424-5104 for more information. Shuttle will be available at the following +times at Newark Airport: 4/25, 7 pm & 9 pm; 4/26 9 am & 11 am. Departures +from hotel to Newark Airport on 4/28 at 5 pm & 7 pm. Reservations must be made +by calling Carmen. Country Club car service $15 per person with 4 in group to +hotel. 1-800-246-2287. Vans available for 6-10 people at $8.50 per person. HR: +$69-77 (reserve by 4/1/96). Back-up hotel within walking distance Somerset +Marriott (908)560-0500 HR: $72-$79. Local Attractions: Great Adventure, +Liberty Science Center, Statue of Liberty, and Rutgers University. Train to +NYC - only 40 minutes! Info/Ent: Make checks payable to USCF. Steve Doyle, 33 +Starlight Dr., Morristown, NJ 07960. Roger Inglis (201)263-8696. WEB: +http://www.websong.com/ chess/ 96 ushs.html, E-mail: esdoyle@aol.com. SASE for +registration confirmation. April 26-28 GPP: 200 0Nevada 1996 National Open. +6-SS, 45/2, 25/1, 30/30. Riviera Hotel and Casino, 2901 Las Vegas Blvd S, Las +Vegas, NV 89109. $$ 35,000 Prize fund is fully guaranteed and will not be +reduced. In three sections. Championship: open to all. EF: $79 by 4/12, $11 +more at site. $$G: 5000-3000-2500-1000-500 400-200. Master 2200-2399 $$G: 1250- +700-300-100. Expert $$G: 1250-700-300-100. Reserve: Under 2000. EF: $74 by +4/12, $11 more at site. $$G: 2500-1500-1000-500-300-100. Class B $$G: 1250-700- +300-100. $100 USCF gift certificate to each of the top 5 unrated players. +Booster: Under 1600. EF: $69 by 4/12, $11 more at site. $1250-700-400-200-100. +Class D $$G: 900-500-300-100. Class E $$G: 700-300-200. Under 1000 $$G: 200- +100. $100 USCF gift certificate to each of the top 5 unrated players. All, One +$2500 plus score bonus will be divided evenly among all players who finish +their schedule with a plus score and do not win a larger prize. Unrated may +only win unrated prizes except in the Championship section. $25 off advance +entry fee for USCF Jrs or second family members at same address. This is an +open tournament - you may play in any section above your rating level. CCA +ratings may be used if higher than USCF April Supplement. Half-point byes +available in any round, but 5th or 6th rd. byes must be requested before the +start of rd. 2. Add 50 cents to advance EF for 1st rd. bye. Chess sets +provided, bring clocks. Reg. 6-8 pm. Thursday, April 25, 8:30-11 am. Friday, +April 26. Rds. 12:30-7:30, 10-6, 10-6. Many Free Extras and Surprises! Free +crosstable and souvenir booklet to all players. Free parking. Free airport +pickup on Thursday. Free raffle with great prizes. Plus many other surprises! +HR: $69 sgl/dbl includes free breakfast Friday, free breakfast or brunch +Saturday and Sunday and free tickets to one of three Mardi Gras Riviera Las +Vegas Shows Thursday. 1-800-634-6753 or (702)734-5110. Make your reservations +early; the Riviera sells out most weekends. Cutoff for special rate is April +8th. Special $69 rates after cutoff only if rooms available! Credit card or +one night's room deposit will be required to hold reservation, fully +refundable if reservation cancelled 24 hours in advance. Special discounts +from Classic Travel 1-800-488-6080 and Allstate Car Rental 1-800-634-6186. Ask +for National Open Chess Rates. Tournament Registration: U.S. Chess Federation, +186 Rt. 9W, New Windsor, NY 12553, Attn: National Open Entries. Credit card +entries accepted 9-5 Eastern at 1-800-388-KING or (914)562-8350. You will +receive entry confirmation with additional info. For free Hotel Brochure, +tournament flyer and Las Vegas area map send a 78 cent self-addressed stamped +envelope to: National Open, PO Box 157, Morton Grove, IL 60053. Info: Alan +Losoff (708)966-5559 evenings only. (Internet:alanl@mcs.net or http://www.mcs. +net/ alanl/chess/NationalOpen.html) NS. W. FIDE. + diff --git a/data/uscf/nc b/data/uscf/nc new file mode 100644 index 0000000..d5f5c36 --- /dev/null +++ b/data/uscf/nc @@ -0,0 +1,23 @@ + +NORTH CAROLINA + +Dec. 16-17. Sandhills '95. 5-SS, 25/60, SD/60. Richmond Senior High School, +Rockingham, NC. $$ 1610 b/75. 3 sections. Open: open to all. $$ 200-100-50. +Top A,B & C: open to 1799. $$ 160-80-50. Under 1400: open to 1399. $$ 160-80- +50 + best Unrated 100. All, EF: $30 by 12/13, $35 at site. Reg. 8:30-9:30. +Rds. 10-2:30-7, 10-2:30. State memb. req'd. $10, OSA. Ent: NCCA, c/o Lamont +Allen, 1007 Rainwater Lane, Rockingham, NC 28379. (910)895-9668. LS. NC. W. + +January 13-15. U.S. Junior Chess Congress-South. See National Events. Jan. +13. Fayetteville Open. 3-SS, 40/90, G/30. FTCC Student Center, 2201 Hull Road, +Fayetteville, NC. 3 sections: Open, 1400-1799, Under 1400. EF: $8 if rec'd by +1/6, $10 at site. $$G 75% of entries. Reg. 9-9:45 am. Rds. 10-2-6. Ent: Keith +Dickens, 1529 Diamond Road, Fayetteville, NC 28311. (910)630-1657. Jan. 27. +1996 Phi Kappa Bianca LXVIII. 3-SS, 40/90, G/30. NCSU Student Union, Cates Ave +& Morrill Rd, Raleigh, NC. 3 sections. Open, 1400-1799, Under 1400. EF: $7 if +rec'd by 1/23, $8 a site. NCCA memb. req'd. $10, $8 Jrs. $$G 150: 40-10 each +section. Reg. 9-9:45 am. Rds. 10-2-6. Ent: Robert N. Singletary, 4713-C Fargo +Ct, Raleigh, NC 27612-4448. (919)681-8482. + +February 2-4. Land of the Sky IX. See Grand Prix. + diff --git a/data/uscf/nd b/data/uscf/nd new file mode 100644 index 0000000..b33eb43 --- /dev/null +++ b/data/uscf/nd @@ -0,0 +1,4 @@ +NORTH DAKOTA + +November 4-5. Capa Caper Open. See Grand Prix. + diff --git a/data/uscf/ne b/data/uscf/ne new file mode 100644 index 0000000..e839aef --- /dev/null +++ b/data/uscf/ne @@ -0,0 +1,20 @@ + +NEBRASKA + +Dec. 16. Cornhusker Winter Chess Challenge. 4-SS, G/75, 40/90, 20/30, SD/30. +Commercial Federal Community Room, 138th & Q (take Hwy S exit 1 block E of Hwy +50 & Q St.)Omaha, NE 68137. Open: to all. EF: $15 by 12/14, $20 at site. +Trophies to 1st, 2nd, A,B,C,D/E, Unr, top non-Nebraskan. Reg. 8-9. Rds. 9-12-3- +6. Master/Expert: open to 2000+. 3-SS if enough players. EF: $20 by 12/14, $25 +at site. $$(200 b/10): 120-80. State memb req'd, OSA. Ent: Bruce Draney, 14002 +Frederick Cir, Omaha, NE 68138. NS. NC. W. + +Jan. 20. Cross Country Chess. Clarks School Gym, W Kellogg, Clarks, NE 68628. +Nine recycled motorcycle trophies. 3 sections. Open: 3-SS, 45/90, 30/60. NSCA +memb req'd $6, OSA. Trophies to 1st, 1st U2000. Rds. 9-1-6. POY. B section: +open to U1800. 4-SS, 45/1, 50/1. Trophies to 1st, 1st U1600, 1st U1400. Rds. +9:10-12:30-3-6. C section: open to U1300. 5-SS, 55/1, 60/1. Trophies to 1st, +1st U1200, 1st Jr., 1st Jr. U1000. Rds. 9:20-11:30-2-4-6. All, EF: $3 if rec'd +by 1/18, $5 at site. Reg. 8-8:30 am. Ent: Richard Olson, Rt 1 Box 138, Clarks +NE 68628. (308)548-2634. NS. NC. W. + diff --git a/data/uscf/nh b/data/uscf/nh new file mode 100644 index 0000000..9795e9f --- /dev/null +++ b/data/uscf/nh @@ -0,0 +1,12 @@ +NEW HAMPSHIRE + +October 28-29. 18th Annual Monadnock Marathon. See Grand Prix. + +Oct. 28. Sixth Littleton Fall Open. 4-SS, G/60. Community House Annex, Main +St, Littleton, NH (next to post office). 3 sections. $$ 75% b/entries per +section. Open: 40%-20%, U1800 15%. U1600/Unr: 40%- 20%, U1400 15%. +U1200/Unr: 40%-20%, Unr. 15%. All, EF: $8 by 10/26, $10 at site. Reg. +8:30-9. Rds. 9:15-11:20-1:30-3:40. Free coffee and donuts as always. Ent: +Michael McShane, PO Box 21, Littleton, NH 03561-0021. (603)444-6117. NS. +NC. + diff --git a/data/uscf/nj b/data/uscf/nj new file mode 100644 index 0000000..e99726a --- /dev/null +++ b/data/uscf/nj @@ -0,0 +1,247 @@ + +NEW JERSEY + +Dec. 17 (QC). 2nd Elmwood Park Chess Club Win A Clock Quads. 3-RR, G/25. +Municipal Bldg., 182 Market St., Elmwood Park, NJ 07407. EF: $12, $10 for EPCC +membs. Jantar chess clock to 1st ea. sect. Reg. 1 pm. Rd. 1 at 1:30. Info: +(201)794-0061. NS. NC. W. + +Dec. 17. CCNJ Parsippany Swiss - 3rd Sunday Each Month. 4-SS, G/30, or 3-SS, +G/70. **NEW LOCATION** Hilton Hotel, Route 10 West, Parsippany, NJ, (201)267- +7373. EF: $15 until 12/13, $18 at site. 3 sections: G/30 Scholastic (K-12, +U1200): Rds. 10-11:15-Lunch-1-2:15. Trophies: 1-3, U1000, U900, U800, also +Best Unrated and Biggest Upset (shared with G/30 Open). G/30 Open: Rds. 10- +11:15-Lunch-1-2:15. Trophies: 1-3, U1800, U1600, U1400, also Best Unrated and +Biggest Upset (shared with Scholastic). G/70 Open: (previously G/65). Rds. 10- +Lunch-1:15-3:45. $$ (200 b/30): $100, $50 1600-1999, $50 U1600 (no trophies). +All, Reg. 9-9:30 am. Rds. start earlier when possible. NJSCF memb. req'd, OSA. +Ent: CCNJ, PO Box 216, Oak Ridge, NJ 07438. (201)697-4419 or chess@websong.com +or http://www.websong.com/chess. NS. W. Dec. 30. Hamilton Chess Quads. 3-RR, +40/80, 15/30. Ray Dwier Rec. Bldg., Mercer County Rd, Rt 609, Groveville, NJ +08620. EF: $10. $G25. NJSCF memb. req'd $5, $3 Jrs., OSA. Reg. 9:30-10 am. +Rds. 10-1-4. Info: (609)758-2326 or 585-9655. NS. NC. W. + +Dec. 31 (QC). Elmwood Park Chess Club's Last Blunder of 1995! 5-SS, G/10. +Municipal Bldg., 182 Market St., Elmwood Park, NJ 07407. EF: $5. Prizes to top +3, top 2, Unr, top ea. 100 pt. group U2100 to U600. Reg. 1. Rd 1 at 1:30. Bye: +1-2. Info: (201)794-0061. NS. NC. W. + +Jan. 5. West Orange Swiss & Quads. G/30. 242 Main Street, West Orange, NJ +07052. 2 sections. Swiss, 4-SS. EF: $18. $$ (225 b/20): 70-35, A,B,C, D/E/Unr. +each $30. Rds. 6:45-7:55-9-10. Scholastic Quads, 3-RR. EF: $13. Trophy to two +in quad, to all U500/Unr. Rds. 6:45-7:55-9. Both, Reg. 6-6:30. Info: Arkady +Geller (201)483-7927. NS. Jan. 5. Bloomfield Quads - First Friday Every +Month. 3-RR, G/30. Bloomfield Civic Center, 84 Broad Street, Bloomfield, NJ. +EF: $12. Open and Scholastic Quads (grades K-12, U1200). Trophies: top 2 +players each quad. Reg. 7-7:30. Rd. 1 at 7:45 sharp. Info: Chess Center of +North Jersey, PO Box 216, Oak Ridge, NJ 07438. (201)697-4419 or chess@websong. +com or http://www.websong.com/chess. NS. W. Jan. 7. 1st Sunday Of The Month +Quads. 3-RR, 40/80, 15/30, SD/30. Quality Inn, 1850 Easton Ave, exit 6 (Rt +527) off I-287, Somerset, NJ 08873. EF: $15 if playing for trophy, $20 if +playing for cash. NJSCF memb. req'd. $10, Sr. $8, Jr. $6. Prizes: trophy or +$25-$40 based on cash players in quad. 3-0 trophy winners receive free entry +next month. Reg. ends 10 am. Rds. 10:30-2-5. Ent: at site. Glenn Petersen. +(908)968-5524. + +Jan. 7. ACN Action Swiss. 5-SS, G/30. Quality Inn, 1850 Easton Ave, exit 6 (Rt +527) off I-287, Somerset, NJ 08873. EF: $25. NJSCF memb. req'd. $10, Sr. $8, +Jr. $6. $$ (b/30): 100-50, Exp., A,B,C,D/E/Unr. each $50, more per entries. +Reg. ends 10:45 am. Rds. 11-12:15-1:30-2:45-4. Ent: at site. Glenn Petersen. +(908)968-5524. + +Jan. 7 (QC). Westfield G/20 #2 Quad. 3-RR, G/20. Westfield Y, 138 Ferris Pl, +Westfield, NJ 07090. $$ 35 to 1st in ea. quad. All, EF: $15, $10 membs. State +membr. req'd. $10, $8 Srs. $6 Jrs. OSA. Reg. 7-7:30. Rds. 7:45-8:40-9:35. NS. + +Jan. 8, 22, 29. Dumont Chess Mates "Deep Freeze Quads." 3-RR, G/90. Dumont +High School Cafeteria, New Milford Ave, Dumont, NJ. Open: to all. EF: $7 by +12/31, $9 at site, $1 less Jrs./Srs. Trophies to first each quad. Reg. 6:45- +7:15 pm. Rds. 7:45 pm. Dumont memb. req'd. $8 yearly, $4 Jrs. U18, Srs. 65+. +Ent: Dumont Chess Mates, PO Box 322, Dumont NJ 07628. (201)385-2432 or 261- +4017. NS. NC. W. + +Jan. 8-Feb. 5. Hackettstown Winter Swiss. 5-SS, 40/90. Hackettstown Community +Center, 293 Main St., Hackettstown, NJ 07840. EF: $10, $7 jr. Trophy & chess +book (selected by winners from USCF catalog, remaining top 40% trophy or chess +book). Reg. 7-7:30 pm. Rds. 7:30 each Monday. Info: (908)852-5925. + +Jan. 12 (QC). Bloomfield Quads - Second Friday Every Month. 4-SS, G/10. +Bloomfield Civic Center, 84 Broad Street, Bloomfield, NJ. EF: $8. $$ (70 b/16; +50% G): 1st $30, 1600-1699 $20, U1600 $20. Reg. 7:30-7:50 pm. Rd. 1 at 8. +Info: Chess Center of North Jersey, PO Box 216, Oak Ridge, NJ 07438. (201)697- +4419 or chess@websong.com or http://www.websong.com/chess. NS. W. Jan. 14 +(QC). USCF Lifetime Title Open #3. 8-SS, G/10. Westfield Y, 138 Ferris Pl, +Westfield, NJ 07090. $$ (200 b/25): 1st $87.50, 2nd 37.50, U2100, U1850, U1600 +each $25. All, EF: $15, $10 members. State membr. req'd. $10, $8 Srs., $6 Jrs. +OSA. Reg. 6:15-6:45. Rds. 7-7:30-8-8:30-9-9:30-10-10:30. 80% of entry fees +returned at rate of $10 per player. NS. + +Jan. 20. NJ Women's Championship. Limited to all female players. 4-SS, G-45. +St. James Church Annex, corner of Moore & Washington Streets, Hackettstown, +NJ. EF: $15 by 1/16, $25 at site. NJSCF dues required. $$G 300: $100-70-50-30- +25-15-10. Trophies/awards to all. Top NJ resident, Teen, Booster (ages 10-12) +& Jr. Under 10 will be NJ Women's Champ for that category. Tie break is G-10 +play off. EF's rec'd in excess of advertised prizes and rating fees added to +cash prizes. Reg at site 9-9:45 am. Rds. 10 am then ASAP w/lunch break. Info: +(908)852-0385. Ent: Ken Thomas, 115 W Moore St., Hackettstown, NJ 07840. NS. +NC. + +Jan. 21. CCNJ Parsippany Swiss - 3rd Sunday Each Month. 4-SS, G/30, or 3-SS, +G/70. Hilton Hotel, Rt 10 W, Parsippany, NJ (201)267-7373. EF: $15 by 1/17, +$18 at site. 3 sections. G/30 Scholastic: (K-12, U1200). Rds. 10-11:15-Lunch-1- +2:15. Trophies: 1-3, U1000, U900, U800, also Best Unrated and Biggest Upset +(shared with G/30 Open). G/30 Open: Rds. 10-11:15-Lunch-1-2:15. Trophies: 1-3, +U1800, U1600, U1400, also Best Unrated and Biggest Upset (shared with +Scholastic). G/70 Open: Rds. 10-Lunch-1:15-3:45. $$(200 b/30): $100, 1600-1999 +$50, U1600 $50 (no trophies). All, Reg. 9-9:30 am. Rds. start earlier when +possible. NJSCF memb. req'd, OSA. The Parsippany Swiss will not run in +February regular schedule resumes March 17. Info/Ent: CCNJ, PO Box 216, Oak +Ridge, NJ 07438, (201)697-4419 or chess@websong.com or http://www.websong. +com/chess. NS. W. + +Jan. 21. Westfield Action #2. 3-SS, G/30. Westfield Y, 138 Ferris Pl, +Westfield, NJ 07090. EF: $15, $10 membs. $$ 200 b/25: 87.50-37.50, U2050, +U1800, U1550 each $25. Reg. 6:15-6:45 pm. Rds. 7-8:15-9:30. 80% of entrance +fees returned at rate of $10 per player. NS. + +Jan. 21(QC). Elmwood Park Chess Club Double Quick Cheap Quads. 3 x 2 RR (6 +games), G/10. Municipal Bldg., 182 Market St., Elmwood Park NJ 07407. EF: $3. +Prize 1st ea. sect. Reg. 1:15 1st game 2. Info: (201)794-0061. NS. NC. W. + +Jan. 27. Hamilton Chess Quads. 3-RR, 40/80, 15/30. Ray Dwier Rec. Bldg., +Mercer County Rd, Rt 609, Groveville, NJ 08620. EF: $10. $G25. NJSCF. memb. +req'd $10, $8 Srs, $6 Jrs, OSA, optional to join NJSCF. Reg. 9:30-10 am. Rds. +10-1-4. Info: (609)758-2326 or 585-9655. NS. NC. W. + +Feb. 2. Bloomfield Quads - First Friday Every Month. 3-RR, G/30. Bloomfield +Civic Center, 84 Broad St., Bloomfield, NJ. EF: $12. Open and Scholastic Quads +(grades K-12, U1200). Trophies: top 2 players each quad. Reg. 7-7:30. Rd 1 at +7:45 sharp. Info: Chess Center of North Jersey, PO Box 216, Oak Ridge, NJ +07438. (201)697-4419 or chess@websong. com or http://www.websong.com/chess. +NS. W. + +Feb. 2. West Orange Swiss & Quads. G/30. 242 Main St., West Orange, NJ 07052. +2 sections. Swiss, 4-SS. EF: $18. $$(225 b/20): 70-35, A,B,C,D/E/Unr. each +$30. Rds. 6:45-7:55-9-10. Scholastic Quads, 3-RR. EF: $13. Trophy to two in +quad, to all U500/Unr. Rds. 6:45-7:55-9-10. Both, Reg. 6-6:30 pm. Info: Arkady +Geller (201)483-7927. NS. + +Feb. 4. 1st Sunday Of The Month Quads. 3-RR, 40/80, 15/30, SD/30. Quality Inn, +1850 Easton Ave, exit 6 (Rt 527) off I-287, Somerset, NJ 08873. EF: $15 if +playing for trophy. $20 if playing for cash. NJSCF memb. req'd. $10, Sr. $8, +Jr. $6. Prizes: trophy or $25-$40 based on cash players in quad. 3-0 trophy +winners receive free entry next month. Reg. ends 10 am. Rds. 10:30-2-5. Ent: +at site. Glenn Petersen. (908)968-5524. Feb. 4. ACN Action Swiss. 5-SS, G/30. +Quality Inn, 1850 Easton Ave, exit 6 (Rt 527) off I-287, Somerset, NJ 08873. +EF: $25. NJSCF memb. req'd. $10, Sr. $8, Jr. $6. $$ (b/30): 100-50, Exp., +A,B,C,D/E/Unr. each $50, more per entries. Reg. ends 10:45 am. Rds. 11-12:15- +1:30-2:45-4. Ent: at site. Glenn Petersen. (908)968-5524. Feb. 4 (QC). +Westfield G/20 #3 Quad. 3-RR, G/20. Westfield Y, 138 Ferris Pl, Westfield, NY +07090. EF: $15, $10 to membs. $$ 35 to 1st in each quad. Reg. 7-7:30 pm. Rds. +7:45-8:40-9:35 pm. NS. + +Feb. 5-March 25. 27th Bergen County Closed Chess Championships. (No games Feb. +19). Bergen County Closed Championships. 7-SS, G/90. Dumont HS Cafeteria, New +Milford Ave, Dumont, NJ 07628. Open to all who live, work or are active +members of a CC in Bergen County. 2 sections. Open: to all. Rotating plaque to +champion, trophies 1-4, top U2000, U1900, U1800, top Sr. 65+, top Jr. U18, +books to 2nd U2000, U1900, U1800, biggest upset. Reserve: open to U1800. +Rotating trophy to 1st, trophies to 1-4, top U1700, U1600, U1500, U1400, +U1200, top Sr., Top Jr., top Unr, books to 2nd U1600, U1500, U1400, biggest +upset. The Bergen County Chess Champion will also receive the rotating "Ernest +W. Marx Trophy" and free entry to the "New Jersey Open" over Labor Day 1996. +Both, EF: $10, $8 Sr. & Jr. by 1/30, $13 or $11 at site. Reg. 6:15-7:15 at +site, however advance reg. by mail or otherwise recommended and appreciated. +Rds. 7:45 pm each Monday. Half-point bye any rd except rd 7 one week advance +notice req'd. NJSCF memb req'd $10, $8 Sr., $6 Jr., OSA. Info: (201)385-2432 +or 261-4017. Ent: Dumont Chess Mates, PO Box 322, Dumont, NJ 07628. NS. NC. W. + +Feb. 9 (QC). Bloomfield Quick Swiss - Second Friday Every Month. 4-SS, G/10. +Bloomfield Civic Center, 84 Broad St., Bloomfield, NJ. EF: $8. $$(70 b/16; 50% +G): 30, 1600-1699 $20, U1600 $20. Reg. 7:30-7:50 pm. Rd 1 at 8. Info: Chess +Center of North Jersey, PO Box 216, Oak Ridge, NJ 07438. (201)697-4419 or +chess@websong.com or http://www. websong.com/chess. NS. W. + +Feb. 11. Westfield Under 2000 #1. 3-SS, G/30. Westfield Y, 138 Ferris Pl, +Westfield, NJ 07090. Open to players Under 2000. EF: $15, $10 membs. $$(135 +b/15): 50-25, U1800, U1600, U1400 $20 each. 90% of entrance fees returned at +$10/player. Reg. 6:15-6:45 pm. Rds. 7-8:15-9:30. Held same evening with +Westfield Novag Grand Prix #1. NS. + +Feb. 11(QC). 4th Annual Elmwood Park Chess Club Winter Open. 4-SS, G/15. +Municipal Bldg., 182 Market St., Elmwood Park NJ 07407. EF: $5. Prizes per +entries. Reg. 1:15 1st game 2. Info: (201)794-0061. NS. NC. W. February 11. +Westfield Novag Grand Prix #1. See G.P. February 17-19. U.S. Amateur Team +Championship East. See National Events. March 9-10. New Jersey Scholastic +Team Championship. 5-SS. New Brunswick Hyatt Regency. Two Albany Street, New +Brunswick, NJ 08901 (Walking distance to McDonald's, Pizza Hut and more. One +block from Amtrak and NJ Transit train station. Phila and NYC connections. +Home to Rutgers University). 4 sections. H.S. Championship (K-12), G/90. +Trophies to top 15 individuals, top 10 NJ teams and top out-of-state team. +Rds. 10-2-6, 10-2. TD Roger Inglis, H.S. Booster (K-12), G/90. Trophies to top +12 individuals and top 10 teams. Rds. 10-2-6, 10-2. TD Harrison Coleman. +Junior High (K-9), G/90. Trophies to top 10 individuals and top five teams. +Rds. 10-2-6, 10-2. TD John Pustai. Elementary (K-6), G/30. Trophies to 5 +individuals, top 5 teams, and top 2 in each grade K-6. Rds. 10-11:15-1-2:15- +3:30. TD Michael Somers. All USCF memb req'd. EF: $15 ($25 out-of state) if +postmarked before 2/23. $25 ($35 out-of-state) at site. $10 for any changes at +site (EF includes one year memb to NJSCF and ACN). Top 5 scores constitute +team score (members must be full-time students from the same school). Reg. 8- +9:30 am, 3/9. After 9:30 half-point bye for rd 1 will be given. Special +Events: Friday Night, March 8: 1996 NJ Scholastic Collegiate Bughouse +Championship. 4-SS. EF: $15 per team. Prizes per entries. Reg. 7:15-7:45 pm. +Rd 1 at 8 pm. Friday Night, March 8: 1996 Central Jersey Game 10 Championship +(Open to All). 4-SS EF: $10. Prizes per entries. Reg. 7:15-7:45 pm. Rd. 1 at 8 +pm. Saturday Night, March 9: 1996 NJ Scholastic-Collegiate Game 10 +Championship. 4-SS. EF: $10 Prizes per entries. Reg. 7:45-8:15 pm. Rd 1 at +8:30 pm. HR: $69 single-quad. (908)873-1234 for reservations (reserve early). +Ent: NJ State Chess Federation (NJSCF), c/o Roger Inglis, 60A Dafrack Dr., +Lake Hiawatha, NJ 07034. (201)263-8696. Entries MUST list name, grade, school, +birthdate, USCF ID # & exp. date, mailing address, phone number and entry fee. +Incomplete entries will not be accepted. March 9-10. 1996 New Jersey +Collegiate Team Championship. 5-SS. New Brunswick Hyatt Regency. Two Albany +Street, New Brunswick NJ 08901 (Walking distance to McDonald's, Pizza Hut and +more. One block from Amtrak and NJ Transit train station. Phila and NYC +connections. Home to Rutgers University). G/90. Trophies to top 10 individuals +top 3 teams. Rds. 10-2-6, 10-2. USCF memb req'd. EF: $15 ($25 out-of-state) if +postmarked before 2/23, $25 ($35 out-of-state) at site (EF includes one year +membership to NJSCF and ACN). Top 4 scores constitute team score (members must +be full-time students from the same school). Reg. 9-9:30 am, 3/9. Special +Events: Friday Night, March 8: 1996 NJ Scholastic-Collegiate Bughouse +Championship. 4-SS. EF: $15 per team. Prizes per entries. Reg. 7:15-7:45 pm. +Rd. 1 at 8 pm. Friday Night, March 8: 1996 Central Jersey Game 10 Championship +(Open to All). 4-SS. EF: $10. Prizes per entries. Reg. 7:15-7:45 pm. Rd. 1 at +8 pm. Saturday night, March 9: 1996 NJ Scholastic-Collegiate Game 10 +Championship. 4-SS. EF: $10. Prizes per entries. Reg. 7:45-8:15 pm. Rd. 1 at +8:30 pm. HR: $69 single-quad. (908)873-1234 for reservations (reserve early). +Entries: NJ State Chess Federation (NJSCF), c/o Bill Bluestone, Box 552, +Metuchen, NJ 07840. (908)603-8850. Entries MUST list name, college, USCF ID# & +exp. date, mailing address, phone number and entry fee. + +March 9-10. 1996 New Jersey Senior Championship. 4-SS, 30/90, SD/1. New +Brunswick Hyatt Regency. Two Albany Street, New Brunswick, NJ 08901. (Walking +distance to McDonald's, Pizza Hut and more. One block from Amtrak and NJ +Transit train station. Phila and NYC connections). EF: $20 if postmarked +before 2/23. $25 at site, $5 off EF if staying at the Hyatt. NJSCF memb req'd. +$$ 50, Top A,B,C,D each $35. Trophies to top three and top A,B,C,D. Reg. 8- +9:30 am, 3/9. Rds. 10-3:30 both days. Special Event: Friday Night, March 8: +1996 Central Jersey Game 10 Championship (Open to All). 4-SS. EF: $10. Prizes +per entries. Reg. 7:15-7:45 pm. Rd. 1 at 8 pm. HR: $69 single-quad. (908)873- +1234 for reservations (reserve early). Entries: NJ State Chess Federation +(NJSCF), c/o Roger Inglis, 60A Dafrack Dr., Lake Hiawatha, NJ 07034. (201)263- +8696. + +March 9. NJSCF Middlesex County Championship. 4-SS, G/60. New Brunswick Hyatt +Regency. Two Albany Street, New Brunswick, NJ 08901. EF: $15 if postmarked +before 2/23. $20 at site, $5 off EF if staying at the Hyatt. NJSCF memb req'd. +Trophies to top three, top A,B,C, D,E,Unr. Reg. 9-9:30 am, 3/9. Rds. 10-12:30- +2:30-4:30. Special Event: Friday Night, March 8: 1996 Central Jersey Game 10 +Championship (Open to All). 4-SS. EF: $10. Prizes per entries. Reg. 7:15-7:45 +pm. Rd. 1 at 8 pm. HR: $69 single-quad. (908)873-1234 for reservations +(reserve early - Nice Getaway Weekend). Entries: NJ State Chess Federation +(NJSCF), c/o Bill Bluestone, Box 552, Metuchen, NJ 07840. Info: Roger Inglis +(908)603-8850. + +April 3-7, 4-7. New York Open. See Grand Prix. April 26-28. 1996 National +High School Chess Championship. See National Events. + diff --git a/data/uscf/nm b/data/uscf/nm new file mode 100644 index 0000000..cc3c4b2 --- /dev/null +++ b/data/uscf/nm @@ -0,0 +1,14 @@ + +NEW MEXICO + +Jan. 13-15. Don Lawson Memorial. 6-SS, 30/90, SD/1. Indian Peublo Cultural +Center (Spec. Events Bldg., North Prkg Lot), Albuquerque, NM (one block North +of I-40 on 12th St. NW). 2 sections. Open: to all. EF: $30 in advance. +Reserve: open to U1600/Unr. EF: $20, $15 jrs. (U18) in advance, free to new +first time USCF membs. All, EF $5 more at site. NMCO memb. req'd. $7, $4 jrs., +OSA. $$ 90% of EF's (excluding late fees and expenses) returned as cash +prizes. Jan. 15 is a national holiday. You may choose to play any combination +of rounds or days and receive one or two half-point byes. Byes must commit in +advance. Reg. Sat. 8:45-9:30 am. Rds. 10-4, 9-3, 8-2. Info: Bill Moffatt 857- +9817. Ent: Checks payable to NMCO, PO Box 9285, Albuquerque, NM 87119. NS. W. + diff --git a/data/uscf/nv b/data/uscf/nv new file mode 100644 index 0000000..5cd646d --- /dev/null +++ b/data/uscf/nv @@ -0,0 +1,13 @@ + +NEVADA + +Dec. 26-29. 5th Annual North American Open. See G.P. Jan. 19-21. Southern NV +Open. 5-SS, 40/100, SD/1. University Nevada at Las Vegas (UNLV), Carlson +Teacher Education Bldg., Rm 142. EF: $17 by 1/15, $22 at site. $$ 300 b/30, +400 b/40, etc. Reg. 6-6:30 pm 1/19. Rds. 7, 10:30-4, 10:30-4. Half-point bye +with notice. This tournament is a qualifier for Nevada State Championship. +Ent: Kenneth B Horne, 1904 Denby Ave, Las Vegas, NV 89106-3955. E-mail: +vttp38a@prodigy.com. + +April 26-28. 1996 National Open. See National Events. + diff --git a/data/uscf/ny b/data/uscf/ny new file mode 100644 index 0000000..0c1c634 --- /dev/null +++ b/data/uscf/ny @@ -0,0 +1,681 @@ + +NEW YORK + +Dec. 16. Marshall Chess Club Beginner's Open. 3-SS, G/60. Marshall Chess Club, +23 W 10 St., New York, NY 10011. Open to players rated U1300 or Unr. EF: $15, +$10 membs., Jrs. under 16 yrs. $3 less. 70% of EFs returned as follows: 1st +35%, 2nd 20%, 3rd 15%. Reg. 11:30-12. Rds. 12:30-2:45-5. Ent: Same as above. +NS. NC. + +Dec. 16-17. Marshall Chess Club U2300. 4-SS, 30/90, SD/60. Marshall Chess +Club, 23 W 10 St., New York, NY 10011. EF: $32, $20 members. $$ (480 b/32): +150-100-50, top A player, top U1800 each $90. Reg. 10:15-10:45. Rds. 11-4:30 +each day. Ent: Same as above. NS. NC. + +Dec. 16. Manhattan Chess Club Saturday U2200. 4-SS, G/45. Manhattan Chess +Club, 353 West 46th St., New York, NY 10036. EF: $30, $20 members. $$(450 +b/30): 150-100-50, A, U1800 $75 each. Reg. 11:30 am. Rds. 12-1:45-3:30-5:15. +Info: (212)333-5888. NS. NC. + +Dec. 16 (QC). Manhattan Chess Club Extra Quick Chess Open. 5-SS, G/10. +Manhattan Chess Club, 353 West 46th St., New York, NY 10036. Open to all. EF: +$15, $12 members. $$(200 b/25): 90-60, U2000 $50. Reg. 7:15 pm. Rd. 1 at 7:30 +pm then every 30 minutes. Info: (212)333-5888. NS. NC. + +Dec. 17. Manhattan Chess Club G/45 Open. 4-SS, G/45. Manhattan Chess Club, 353 +West 46th St., New York, NY 10036. EF: $30, $20 members. $$ (480 b/32): 150- +100-50, Expert, A, U1800 $60 each. Reg. 11:30. Rds. 12-1:45-3:30-5:15. Info: +(212)333-5888. NS. NC. + +Dec. 17. Manhattan Chess Club Rated Beginners Open. 4-SS, G/45. Manhattan +Chess Club, 353 West 46th St., NY, NY 10036. Open to Under 1200 and Unrated. +EF: $20, $10 members. Prizes: Trophies to top 3. Reg. 11:30. Rds. 12-1:45-3:30- +5:15. Info: (212)333-5888. NS. NC. + +Dec. 17. Manhattan Chess Club Sunday Night Quad. 3-RR, G/30. Manhattan Chess +Club, 353 West 46th St., New York, NY 10036. EF: $20, $15 members. $$ 45 1st +each quad. Reg. 6:45. Rds. 7-8-9. Info: (212)333-5888. NS. NC. + +Dec. 18. Manhattan Chess Club Monday Under 1600. 5-SS, G/30. Manhattan Chess +Club, 353 West 46th St., New York, NY 10036. Open to Under 1600 & Unrated. EF: +$20, $15 members. $$ (200 b/20): 90-60, U1400 $50. Reg. 6:45. Rds. 7-8:15- +9:30. Info: (212)333-5888. NS. NC. + +Dec. 18. Marshall Chess Club Monday U1600 Action Swiss. 4-SS, G/30. Marshall +C.C., 23 W 10 St., New York, NY 10011. Open to players rated U1600. EF: $20, +$12 members. $$ (175 b/20): 75-45-30, U1400/Unr. $25. Reg. 6:15-6:45. Rds. 7- +8:15-9:30-10:45. Ent: as above. NS. NC. Dec. 19-Jan. 9. 3rd Annual Max Euwe +Open. See G.P. Dec. 19 (QC). Manhattan Chess Club *New* Flash Four. 4-SS, +G/25. Manhattan Chess Club, 353 West 46th St., New York, NY 10036. EF: $20, +$15 members. $$ (420 b/35): 150-100-50, Expert, U2000 $60 each. Reg. 6:45. +Rds. 7-8-9-10. Info: (212)333-5888. NS. NC. + +Dec. 20. Manhattan Chess Club Wednesday U2000. 3-SS, G/30. Manhattan Chess +Club, 353 West 46th St., NY, NY 10036. Open to Under 2000 and unrated. EF: +$20, $15 membs. $$ (200 b/20): 75-55, C $40, U1400 $30. Reg. 6:45. Rds. 7-8:15- +9:30. Info: (212)333-5888. NS. NC. + +Dec. 21. The Original "4 Rated Games Tonight" First In Action! 4-SS, G/30. +Chess Center at the Marshall Club, 23 W 10 St., bet 5-6th Ave, NYC. EF: $20. +$$ (490 b/32): 170-90-50, Top 2000-2199/Unr, U2000 each $90. Byes: all, limit +2 (rds. 3-4 must commit before rd. 2). Re-entry $10, counts as 1/2-entry. +Class pairings OK rd. 4. Reg. ends 15 min. before game. Rds. 7-8:15-9:30-10:45 +pm. Info: (212)477-3716. NS. NC. Dec. 21. Manhattan Chess Club NYC's BEST +Thursday Night Action. 4-SS, G/30. Manhattan Chess Club, 353 West 46th St., +New York, NY 10036. EF: $20, $15 members. $$ (480 b/35): 200-100, Expert, +U2000 $90 each. Reg. 6:30. Rds. 7-8:15-9:30-10:45. Info: (212)333-5888. NS. +NC. December 23. Happy Holidays, New York!. See Grand Prix. December 23-24. +Chess Improves Reading Scores and Raises Your I.Q. Winter Insanity. See Grand +Prix. Dec. 23. Manhattan Chess Club Saturday U1700. 4-SS, G/45. Manhattan +Chess Club, 353 West 46th St., New York, NY 10036. EF: $30, $20 members. $$ +(300 b/20): 100-60-40, C, U1400 $50 each. Reg. 11. Rds. 11:30-1:45-3:30-5:15. +Info: (212)333-5888. NS. NC. + +Dec. 23 (QC). Manhattan Chess Club Extra Quick Chess Open. 5-SS, G/10. +Manhattan Chess Club, 353 West 46th St., New York, NY 10036. Open to all. EF: +$15, $12 members. $$ (200 b/25): 90-60, U2000 $50. Reg. 7:15. Rd. 1 at 7:30. + +Dec. 24 (QC). 2nd Annual America's Only 6:00 AM Quad! 3-RR, G/10. Holiday +Center of NY at the Marshall Club, 23 W 10 St., bet. 5-6th Ave, NYC. EF: $15. +$$ 30 b/4 per quad. Reg. ends 5:50 am. Rds. 6-6:20-6:40 am. Info: (212)477- +3716. NS. NC. Dec. 24. Manhattan Chess Club St. Nick's Open. 4-SS, G/30. +Manhattan Chess Club, 353 West 46th St., New York, NY 10036. EF: $20, $15 +members. $$ (250 b/25): 110-60, Expert, U2000 $40 each. Reg. 12:30. Rds. 1- +2:15-3:30-4:45. Info: (212)333-5888. NS. NC. + +December 26-29. Pan American Intercollegiate and Scholastic Team Chess +Championships. See National Events. Dec. 26. Manhattan Chess Club KidQuads. 3- +RR, G/30. Manhattan Chess Club, 353 West 46th St., New York, NY 10036. Open to +players under 18 years of age. EF: $10, $5 members. Prizes: Trophy to first +each quad. Reg. 12:30. Rds. 1-2:15-3:30. Info: (212)333-5888. NS. NC Dec. 26 +(QC). Manhattan Chess Club New Flash Four. 4-SS, G/25. Manhattan Chess Club, +353 West 46th St., New York, NY 10036. Open to all. EF: $20, $15 members. $$ +(420 b/35): 150-100-50, Expert, U2000 $60 each. Reg. 6:45. Rds. 7-8-9-10. +Info: (212)333-5888. NS. NC Dec. 27. Manhattan Chess Club Special U1500! 3- +SS, G/30. Manhattan Chess Club, 353 West 46th St., New York, NY 10036. Open to +Under 1500 and unrated. EF: $20, $15 members. $$ (200 b/20): 100-60, U1300 +$40. Reg. 6:45. Rds. 7-8:15-9:30. Info: (212)333-5888. NS. NC. + +Dec. 27-Jan. 17. Marshall Chess Club Wednesday U2000. 4-SS, 50/2, 25/1. +Marshall Chess Club, 23 W 10 St., New York, NY 10011. Open to players rated +U2000. Club membs. only. EF: $14. $$ (215 b/22): 100-55-35, U1700 $25. Reg. +6:15-6:45. Rds. 7 pm each Wednesday. Ent: as above. NS. NC. + +December 28. 2nd Annual Last Ten Grand Prix Points Tonight This Year (Accept +No Immittations)!. See G.P. Dec. 28. Manhattan Chess Club KidQuads. 3-RR, +G/30. Manhattan Chess Club, 353 West 46th St., New York, NY 10036. Open to +players under 18. EF: $10, $5 members. Prizes: Trophy to first each Quad. Reg. +12:30. Rds. 1-2:15-3:30. Info: (212)333-5888. NS. NC. Dec. 28. Manhattan +Chess Club NYC's Best Thursday Night Action. 4-SS, G/30. Manhattan Chess Club, +353 West 46th St., New York, NY 10036. EF: $20, $15 members. $$ (480 b/35): +200-100, Expert, U2000 $90 each. Reg. 6:30. Rds. 7-8:15-9:30-10:45. Info: +(212)333-5888. NS. NC. + +Dec. 28. 48th Freeport Quad. 3-RR, G/30. Freeport Library, Merrick Rd & Ocean +Ave, Freeport. EF: $11 by 12/22, $16 at site, non-memb $3 more. $$ 30. Reg. 7- +7:30 pm. Rds. 7:30-8:30-9:30. Rule 14H not used. Ent: Harold Stenzel, 31 Rose +lane, New Hyde Park, NY 11040. NS. W. + +Dec. 30. Syracuse Dec. Open. 4-SS, Rds. 1-2 G/60, Rds. 3-4 G/90. Holiday Inn, +Carrier Circle (off 298), E. Syracuse, NY (Exit 35 I-90). EF: $22 if rec'd by +12/27, $3 more at site. $$ (b/26): 162-70, top B $56, top C $46, top D $36. +Reg. 8:30-9 am. Rds. 9:30-11:45-2-5:30. Accelerated pairings may be used. Ent: +Joe Ball, 310 Helfer Lane, Minoa, NY 13116. + +Dec. 30. Holiday Quads. 2 separate events, each a 3-RR. Chess Center at the +Marshall Club, 23 W. 10th St., bet. 5-6 Ave., NYC. 11 am Quad: 30/60, SD/60. +EF: $25. $$ (60 b/4 per quad). Rds. 11-3-7. Noon Quad: G/60. EF: $20. $$ (50 +b/4 per quad). Rds. 12-2-4. Both, EF: $5 less to Marshall members. Qt. of +eggnog to winner of each quad (split if tie). Reg. ends 10 minutes before rd. +1. NS. NC. + +Dec. 30. Manhattan Chess Club G/30 Open. 5-SS, G/30. Manhattan Chess Club, 353 +West 46th St., New York, NY 10036. Open to all. EF: $30, $20 members. $$ (480 +b/32): 150-100-50, Expert $70, A $60, U1800 $50. Reg. 11:30. Rds. 12-1:15-2:30- +3:45-5. Info: (212)333-5888. NS. NC. + +Dec. 30. Manhattan Chess Club Under 1000 Open. 4-SS, G/30. Manhattan Chess +Club, 353 West 46th St., New York, NY 10036. Open to Under 1000 and unrated. +EF: $20, $10 membs. Prizes: Trophies to top 3. Reg. 11:30. Rds. 12-1:15-2:30- +3:45. Info: (212)333-5888. NS. NC. + +Dec. 30 (QC). Manhattan Chess Club Extra Quick Chess Open. 5-SS, G/10. +Manhattan Chess Club, 353 West 46th St., New York, NY 10036. Open to all. EF: +$15, $12 members. $$ (200 b/25): 90-60, U2000 $50. Reg. 7:15. Rd. 1 at 7:30 pm +then every 30 minutes. Info: (212)333-5888. NS. NC. Dec. 31. (9th Annual) +Your Last Blunder in '95! See G.P. Dec. 31. Manhattan Chess Club Father Time +Open. 5-SS, G/30. Manhattan Chess Club, 353 West 46th St., New York, NY 10036. +EF: $20, $15 members. $$ (250 b/25): 100-60, Expert, U2000 $45 each. Reg. +1:30. Rds. 2-3:15-4:30-5:45-7. Info: (212)333-5888. NS. NC. + +Jan. 1. Manhattan Chess Club First Quad of 1996! 3-RR, G/30. Manhattan Chess +Club, 353 West 46th St., New York, NY 10036. EF: $20, $15 members. $$ 45 1st +each quad. Reg. 6:30. Rds. 7-8-9. Info: (212)333-5888. NS. NC. + +January 2-9. 3rd Annual Max Euwe Open. See Grand Prix. Jan. 2-23. Manhattan +Chess Club U1800 Slow Swiss. 4-SS, 30/90, SD/60. Manhattan Chess Club, 353 +West 46th St., NY, NY 10036. Open to Under 1800. EF: $20, $15 members. $$ (200 +b/20): 80-50, C $40, U1400 $30. Reg. 6:45 pm. Rds. 7 pm each Tuesday. Info: +(212)333-5888. NS. NC. Jan. 2 (QC). Manhattan Chess Club *New* Flash Four. 4- +SS, G/25. Manhattan Chess Club, 353 West 46th St., New York, NY 10036. EF: +$20, $15 members. $$ (420 b/35): 150-100-50, Expert, U2000 $60 each. Reg. +6:30. Rds. 7-8-9-10. Info: (212)333-5888. NS. NC. + +Jan. 3. Manhattan Chess Club Wednesday U1400. 3-SS, G/30. Manhattan Chess +Club, 353 West 46th St., New York, NY 10036. Open to Under 1400. EF: $15, $10 +members. Prizes: Trophies to top 3. Reg. 6:45. Rds. 7-8:15-9:30. Info: +(212)333-5888. NS. NC. + +Jan. 4. Your First 4 Rated Games Tonight This Year! 4-SS, G/30. Chess Center +at the Marshall Club, 23 W 10 St., bet. 5-6th Ave, NYC. EF: $20. $$ (490 +b/32): 170-90-50, Top 2000-2199/Unr, U2000 each $90. Byes: all, limit 2 (rds. +3-4 must commit before rd. 2). Re-entry: $10, counts as 1/2-entry. Class +pairings OK rd. 4. Reg. ends 15 min. before game. Rds. 7-8:15-9:30-10:45 pm. +Info: (212)477-3716. NS. NC. Jan. 4. Manhattan Chess Club NYC's Best Thursday +Night Action. 4-SS, G/30. Manhattan Chess Club, 353 West 46th St., New York, +NY 10036. EF: $20, $15 members. $$ (480 b/35): 200-100, Expert, U2000 $90 +each. Reg. 6:30. Rds. 7-8:15-9:30-10:45. Info: (212)333-5888. NS. NC. + +Jan. 4-Feb. 15. 13th Freeport Winter Swiss. 4-SS, 40/80. Freeport Library, +Merrick Rd & Ocean Ave, Freeport. EF: $19 in adv., $24 at site. $$ (280 b/20): +80, U2300, 2050, 1800, 1550/Unr each $50. $10 FCC memb. req'd. Byes 1-4 (last +rd must be requested before rd 2 and is irrevocable). Reg. 7-7:30 pm. Rds. +7:30 each Thurs (1/18, 2/1, 2/15 for adj). Ent: Harold Stenzel, 31 Rose Ln, +New Hyde Park, NY 11040. NS. W. January 5-February 2. Queens Winter Open. See +G.P. Jan. 6. Manhattan Chess Club Saturday U1900. 4-SS, G/45. Manhattan Chess +Club, 353 West 46th St., New York, NY 10036. Open to Under 1900. EF: $30, $20 +members. $$ (300 b/20): 100-60-40, B, U1600 $50 each. Reg. 11. Rds. 11:30-1:15- +3-4:45. Info: (212)333-5888. NS. NC. + +Jan. 6 (QC). Manhattan Chess Club Extra Quick Chess Open. 5-SS, G/10. +Manhattan Chess Club, 353 West 46th St., New York, NY 10036. Open to all. EF: +$15, $12 members. $$ (200 b/25): 90-60, U2000 $50. Reg. 7:15. Rd. 1 at 7:30 pm +then every 30 minutes. Info: (212)333-5888. NS. NC. + +January 6-7. Marshall Chess Club January Grand Prix. See Grand Prix. Jan. 7. +Manhattan Chess Club Under 2400 Action. 5-SS, G/30. Manhattan Chess Club, 353 +West 46th St., New York, NY 10036. EF: $30, $20 members. $$ (480 b/32): 160-90- +50, Expert, A, U1800 $60 each. Reg. 11:30. Rds. 12-1:15-2:30-3:45-5. Info: +(212)333-5888. NS. NC. + +Jan. 7. Manhattan Chess Club Sunday U2200 Quad. 3-RR, G/30. Manhattan Chess +Club, 353 West 46th St., New York, NY 10036. EF: $20, $15 membs. $$ 45 to +first each quad. Reg. 6:15. Rds. 6:30-7:30-8:30. Info: (212)333-5888. NS. NC. + +Jan. 8. 23rd Nassau Action Championship. See Grand Prix. Jan. 8-Feb. 12. 5th +Nassau Monday Scholastic. 6-SS, G/30. 1st Presbyterian Church, 1st & Main Sts, +Mineola. Open: to grades K-12 U1400/Unr. EF: $5 in adv., $10 at site. NCC +memb. req'd. Reg. 7-7:30 pm. Rds. 7:30 each Mon. Trophies to top 3. Byes 1-6 +(last rd must be requested before rd 3 and is irrevocable). Rule 14H not used. +Ent: Harold Stenzel, 31 Rose Lane, New Hyde Park, NY 11040. NS. W. + +Jan. 8. Manhattan Chess Club Monday U2000. 3-SS, G/30. Manhattan Chess Club, +353 West 46th St., New York, NY 10036. EF: $20, $15 members. $$ (200 b/20): 75- +55, B $40, U1600 $30. Reg. 6:30. Rds. 7-8:15-9:30. Info: (212)333-5888. NS. +NC. + +Jan. 8-29. Marshall Chess Club Monday U1600. 4-SS, 50/2, 25/1. Marshall Chess +Club, 23 W 10 St., New York, NY 10011. Open to players rated Under 1600. EF: +$25, $15 members. $$ (220 b/20): 100-60, U1400 $35, U1200/Unr. $25. Reg. 6:15- +6:45. Rds. 7 pm each Monday. Ent: as above. NS. NC. + +Jan. 9 (QC). Manhattan Chess Club *New* Flash Four. 4-SS, G/25. Manhattan +Chess Club, 353 West 46th St., New York, NY 10036. EF: $20, $15 members. $$ +(200 b/20): 90-60, U2000 $50. Reg. 6:45. Rds. 7-8-9-10. Info: (212)333-5888. +NS. NC. + +Jan. 10. Manhattan Chess Club Wednesday U1600. 3-SS, G/30. Manhattan Chess +Club, 353 West 46th St., New York, NY 10036. Open to Under 1600. EF: $20, $15 +members. $$ (200 b/20): 75-55-35, U1400 $35. Reg. 6:45. Rds. 7-8:15-9:30. +Info: (212)333-5888. NS. NC. + +Jan. 10-31. Manhattan Chess Club Wednesday Night Swiss. 4-SS, 30/90, SD/1. +Manhattan Chess Club, 353 West 46th St., New York, NY 10036. Open to all. EF: +$20, $15 members. $$ (320 b/25): 120-60-40, U2200, U2000 $50 each. Reg. 6:30. +Rds. 7 pm each Wednesday. Byes Rds. 1-3 with entry, limit two. Info: (212)333- +5888. NS. NC. + +Jan. 11. The Original "4 Rated Games Tonight" First In Action! 4-SS, G/30. +Chess Center at the Marshall Club, 23 W 10 St., bet. 5-6th Ave, NYC. EF: $20. +$$ (490 b/32): 170-90-50, Top 2000-2199/Unr, U2000 each $90. Byes: all, limit +2 (rds. 3-4 must commit before rd. 2). Re-entry: $10, counts as 1/2-entry. +Class pairings OK rd. 4. Reg. ends 15 min. before game. Rds. 7-8:15-9:30-10:45 +pm. Info: (212)477-3716. NS. NC. Jan. 11. Manhattan Chess Club NYC's Best +Thursday Night Action. 4-SS, G/30. Manhattan Chess Club, 353 West 46th St., +New York, NY 10036. EF; $20, $15 members. $$ (480 b/35): 200-100, Expert, +U2000 $90 each. Reg. 6:30. Rds. 7-8:15-9:30-10:45. Info: (212)333-5888. NS. +NC. + +Jan. 13-14. Manhattan Chess Club Slow Open. 4-SS. Manhattan Chess Club, 353 +West 46th St., New York, NY 10036. 2 schedule options. Two Day: 30/90, SD/60. +Rds. 12-5:30 each day. One Day: Rds. 1-2 G/30, 9:30-10:45 Sunday morning. Rds. +3-4, 12-5:30. Both, EF: $30, $20 members. $$ (480 b/32): 200-100, Expert, +U2000 $90 each. Reg. Sat 11:15, Sun 9:15. Info: (212)333-5888. NS. NC. + +Jan. 13 (QC). Manhattan Chess Club Extra Quick Chess Open. 5-SS G/10. +Manhattan Chess Club, 353 West 46th St., New York, NY 10036. Open to all. EF: +$15, $12 members. $$ (200, b/25): 90-60, U2000 $50. Reg. 7:15. Rd. 1 at 7:30 +pm then every 30 minutes. Info: (212)333-5888. NS. NC. + +Jan. 13-14. Marshall Chess Club U1800 Weekend Swiss. 4-SS, 30/90, SD/1. +Marshall Chess Club, 23 W 10th St., New York, NY 10011. Open to players rated +Under 1800. EF: $25, $15 members. $$ (300 b/24): 120-80, U1600 $55, U1400/Unr. +$45. Reg. 11:15-11:45. Rds. 12-5:30 each day. Ent: as above. NS. NC. + +Jan. 13-14. Marshall Chess Club Blackmar - Diemer Gambit Thematic. 4-SS, +30/90, SD/1. Marshall Chess Club, 23 W 10 St., New York, NY 10011. All games +to start 1. d4 d5 2. e4 dxe 3. Nc3 Nf6 4. f3. EF: $25, $15 members. $$ (220 +b/20): 100-65, U2000 $55. Reg. 10:15-10:45. Rds. 11-4:30 each day. Ent: as +above. NS. NC. + +Jan. 13. 18th Annual Greater New York Primary Championship. 5-SS, G/30. +Borough of Manhattan Community College, 199 Chambers St. (between West & +Greenwich Sts), New York. Walking distance from subways (Chambers St. & City +Hall Stations, and World Trade Center PATH & subway stations). By car, take +West Side Highway to Chambers St. USCF Memb. req'd. In 2 sections. Primary +Championship: open to grades 3/below. EF: $14.50 if postmarked by 12/22/95. +Trophies to Top 15, top 2 rated 800-999, top 2 rated U800, top 5 unr, top 6 +school teams. Free entry to all Chess Center tmts. thru 7/1/96 plus all 2-day +tmts thru 8/1/96 to 1st, all tmts. free thru 7/1/96 to 2nd, thru 6/1/96 to +3rd. Primary K-1: open to grade 1/below. EF: $14.40 is postmarked by 12/22/95. +Trophies to top 15, top 3 rated 600-799, top 3 rated U600, top 3 unrateds, top +5 school teams. Free entry to Chess Center tmts. thru 6/1/96 to 1st, thru +5/1/96 to 2nd. Both, all entry fees $7 extra if postmarked 12/23-1/4, all $30 +at site; $10 extra charge to switch sections. All substitutions from advance +entries charged late EF. Top 2 each section win free entry to 1996 NYS +Championship, 8/30-9/2 in Saratoga Springs; free entries do not include "$100 +Quads." Speed playoff for 5-0 scores. Top 4 scores per school = team score +(all on team must attend same school). Byes OK rds. 1-2. Advance entries: list +name, rating, USCF ID# & expiration date (enclose dues if necessary), school +(even if no team), grade, birthdate address. Checks payable & Ent(specify +which section): Chess Center of New York, PO Box 198, Old Chelsea Station, New +York, NY 10011. No mail entries accepted postmarked after 1/4/96. Credit card +entries: $30 at site, $20 by phone thru 12/25, $25 by phone 12/26-1/9, +(212)675-0256 (or 212-477-3716 Tues-Thur evening). Late registration ends 9:30 +am 1/13. Rds. 10-12-1:30-3-4:30. Bring sets, clocks, boards NONE SUPPLIED!! +Info: (212)675-0256, (212)477-3716 (evenings), 718-336-3988. NS. NC. W. + +A Heritage Event Jan. 13. 31st Annual Greater New York Junior High +Championship USCF's Longest Running Scholastic Tournament! 5-SS, G/30. Borough +of Manhattan Community College, 199 Chambers St.(between West & Greenwich +Sts), New York. Walking distance from subways (Chambers St. & City Hall +Stations, and World Trade Center PATH & subway stations). By car, take West +Side highway to Chambers St. Open to all not yet in 10th grade, USCF memb. +req'd. In 2 sections. Junior High Championship: open to all. EF: $16.50 if +postmarked by 12/22/95. Trophies to Top 15, top 2 Class B, Top 2 Class C, top +2 U1400, top 5 Unr, top 6 school teams. Free entry to all Chess Center tmts. +thru 7/1/96 plus all 2-day tmts. thru 8/1/96 to 1st, free entry thru 7/1/96 to +2nd, free thru 6/1/96 to 3rd. Junior High Novice: open to all rated U1200 or +Unr. EF: $16.40 if postmarked by 12/22/95. Trophies to top 15, top 2 rated +U1000, top 5 unr players, top 6 school teams. Free entry to all Chess Center +tmts. thru 6/1/96 to 1st, thru 5/1/96 to 2nd. Special grade plaques to top 2 +in each grade 4-6 (a player may win both a grade plaque and a trophy). Both, +all entry fees $7 extra if postmarked 12/23-1/4, $30 at site; $10 extra charge +to switch sections. All substitutions from advance entries charged late EF. +Top 2 each section win free entry to 1996 NYS Championship, 8/30-9/2 in +Saratoga Springs; free entries do not include "$100 Quads." Speed playoff for +5-0 scores. Top 4 scores per school = team score (all on team must attend same +school; no combined teams, even if one school "feeds" another). Byes OK rds. 1- +2. Advance entries: list name, rating, USCF ID# & expiration date (enclose +dues if necessary), school (even if no team), grade, birthdate, address. +Checks payable & Ent(specify which section): Chess Center of New York, PO Box +198, Old Chelsea Station, New York, NY 10011. No mail entries accepted +postmarked after 1/4/96. Credit card entries: $30 at site, $20 by phone thru +12/25, $25 by phone 12/26-1/9, (212)675-0256 (or 212-477-3716 Tues-Thurs +evenings). Late registration ends 9:30 am 1/13. Rds. 10-12-1:30-3-4:30. Bring +sets, clocks, boards NONE SUPPLIED!! Info: (212)675-0256, (212)477-3716 +(evenings), (718)336-3988. NS. NC. W. A Heritage Event Jan. 14. 31st Annual +Greater New York Elementary High Championship USCF's Longest Running +Scholastic Tournament! 5-SS, G/30. Borough of Manhattan Community College, 199 +Chambers St.(between West & Greenwich Sts), New York. Walking distance from +subways (Chambers St. & City Hall Stations, and World Trade Center PATH & +subway stations). By car, take West Side highway to Chambers St. Open to all +not yet in 7th grade, USCF memb. req'd. In 2 sections. Elementary +Championship: open to all. EF: $15.50 if postmarked by 12/22/95. Trophies to +Top 15, top 2 U1200, top 5 unrateds, top 6 school teams. Free entry to all +Chess Center tmts. thru 7/1/96 plus all 2-day tmts. thru 8/1/96 to 1st, free +entry thru 7/1/96 to 2nd, thru 6/1/96 to 3rd. Elementary Novice: open to +players rated U1000 or Unrateds. EF: $15.40 if postmarked by 12/22/95. +Trophies to top 15, top 2 rated 700-799, top 2 rated U700, top 5 unrateds, +top 6 teams. Free entry to all Chess Center tmts. thru 6/1/96 to 1st, thru +5/1/96 to 2nd, thru 4/1/96 to 3rd. Both, all entry fees $7 extra if postmarked +12/23-1/4, $30 at site; $10 extra charge to switch sections. All substitutions +from advance entries charged late EF. Top 2 each section win free entry to +1996 NYS Championship, 8/30-9/2 in Saratoga Springs; free entries do not +include "$100 Quads." Speed playoff for 5-0 scores. Top 4 scores per school = +team scores (all on team must attend same school). Byes OK rds. 1-2. Advance +entries: list name, rating, USCF ID# & expiration date (enclose dues if +necessary), school (even if no team), grade, birthdate, address. Checks +payable & Ent(specify which section): Chess Center of New York, PO Box 198, +Old Chelsea Station, New York, NY 10011. No mail entries accepted postmarked +after 1/4/96. Credit card entries: $30 at site, $20 by phone thru 12/25, $25 +by phone 12/26-1/9, (212)675-0256 (or 212-477-3716 Tues-Thurs evenings). Late +registration ends 9:30 am 1/14. Rds. 10-12-1:30-3-4:30. Bring sets, clocks, +boards NONE SUPPLIED!! Info: (212)675-0256, (212)477-3716 (evenings), (718)336- +3988. NS. NC. W. + +A Heritage Event Jan. 14. 31st Annual Greater New York High School +Championship USCF's Longest Running Scholastic Tournament! 5-SS, G/30. Borough +of Manhattan Community College, 199 Chambers St.(between West & Greenwich +Sts), New York. Walking distance from subways (Chambers St. & City Hall +Stations, and World Trade Center PATH & subway stations). By car, take West +Side highway to Chambers St. Open to all grades 12/below, USCF memb. req'd. In +3 sections. Varsity: open to all. EF: $17.60 if postmarked by 12/22/95. +Trophies to Top 15, top 2 each class: A,B,U1600,top 4 unrated,top 6 school +teams. Free entry to all Chess Center tmts. thru 7/1/96 plus all 2-day tmts. +thru 8/1/96 to 1st, all tmts. thru 6/1/96 plus all 2-day tmts. thru 7/1/96 +free to 2nd, all tmts. thru 5/1/96 free to 3rd. Junior-Varsity: open to U1700 +or unrated. EF: $17.50 if postmarked by 12/22/95. Trophies to top 15, top 2 +Class C, top 2 U1400, top 5 unrateds, top 6 teams. Free entry to all Chess +Center tmts. thru 7/1/96 to 1st, thru 6/1/96 to 2nd. Novice: open to U1200 or +unrated. EF: $17.40 if postmarked by 12/22/95. Trophies to top 15, top 2 +U1000, top 5 unrateds, top 6 teams. Free entry thru 5/1/96 to 1st. All, entry +fees $7 extra if postmarked 12/23-1/4, $30 at site; $10 extra charge to switch +sections. All substitutions from advance entries charged late EF. Top 2 each +section win free entry to 1996 NYS Championship, 8/30-9/2 in Saratoga Springs; +free entries do not include "$100 Quads." Speed playoff for 5-0 scores. Top 4 +scores per school = team scores (all on team must attend same school; no +combined teams, even if one school "feeds" another). Byes OK rds. 1-2. Advance +entries: list name, rating, USCF ID# & expiration date, school (even if no +team), grade, birthdate, address. Checks payable & Ent(specify which section): +Chess Center of New York, PO Box 198, Old Chelsea Station, New York, NY 10011. +No mail entries accepted postmarked after 1/4/96. Credit card entries: $30 at +site, $20 by phone thru 12/25, $25 by phone 12/26-1/9, (212)675-0256 (or 212- +477-3716 Tues-Thurs evenings). Late registration ends 9:30 am 1/14. Rds. 10-12- +1:30-3-4:30. Bring sets, clocks, boards NONE SUPPLIED!! Info: (212)675-0256, +(212)477-3716, (718)336-3988. NS. NC. W. + +Jan. 14 (QC). 1996 Greater New York Scholastic Quick Chess Championship! 4-SS, +G/10. Manhattan Community College, 199 Chambers St. (between West & Greenwich +Sts), New York. Walking distance from subways (Chambers St. & City Hall +Stations, and World Trade Center PATH & subway stations). By car, take West +Side highway to Chambers St. Open to all grades 12/below, USCF memb. req'd. +EF: $10 if postmarked by 12/22/95, $15 if postmarked 12/23-1/4, $20 at site. +Trophies to Top 10, top 2 each class: A, B, C, U1400, top 2 unrated. Speed +playoff for 4-0 scores. Higher of player's Quick Rating or Slow Rating-200 +used. Byes OK rds. 1-4, limit 1 (byes rds. 3-4 must commit before tmt). Reg. +ends 6:45 pm. Rds. 7-7:45-8:15-8:45 pm. Ent: Chess Center of New York, PO Box +198, Old Chelsea Station, New York, NY 10011 (must be postmarked by 1/4/96). +Credit card entries: $20 at site, $15 by phone thru 1/9; (212)675-0256 (or 212- +477-3716 Tues-Thur eves). Bring sets, clocks, boards NONE SUPPLIED! Info: +(212)675-0256. NS. NC. W. Jan. 14. Manhattan Chess Club Sunday Novice. 4-SS +G/60. Manhattan Chess Club, 353 West 46th St., New York, NY 10036. Open to +Under 1400. EF: $20, $10 members. Prizes: Trophies to top 3. Reg. 11:15. Rds. +11:30-1:45-4-6:15. Info: (212)333-5888. NS. NC. + +Jan. 14. Manhattan Chess Club Sunday U2200 Quad. 3-RR, G/30. Manhattan Chess +Club, 353 West 46th St., New York, NY 10036. EF: $20, $15 membs. $$ 45 1st +each quad. Reg. 6:15. Rds. 6:30-7:30-8:30. Info: (212)333-5888. NS. NC. Jan. +15. Nassau ML King Quads. 3-RR, G/30. First Presbyterian Church, First & Main +Sts, Mineola. EF: $10 by 1/8, $15 at site, non-memb $3 more. $$ 35. Reg. 7- +7:30 pm. Rds. 7:30-8:30-9:30. Rule 14H not used. Ent: Harold Stenzel, 31 Rose +Ln, New Hyde Park, NY 11040. NS. W. Jan. 15. Manhattan Chess Club Monday +U1400. 3-SS, G/30. Manhattan Chess Club, 353 W 46 St., New York, NY 10036. +Open to Under 1400. EF: $15, $10 membs. Trophies to top 3. Reg. 6:45 pm. Rds. +7-8:15-9:30. Info: (212)333-5888. NS. NC. + +Jan 16 (QC). Manhattan Chess Club *New* Flash Four. 4-SS, G/25. Manhattan +Chess Club, 353 W 46 St., New York, NY 10036. EF: $20, $15 membs. $$ (420 +b/35): 150-100-50, Expert 60, U2000 60. Reg. 6:45 pm. Rds. 7-8-9-10. Info: +(212)333-5888. NS. NC. + +January 16-February 6. 7th Annual Mikhail M. Botvinnik Memorial. See Grand +Prix. Jan 17. Manhattan Chess Club Wednesday U1800. 3-SS, G/30. Manhattan +Chess Club, 353 W 46 St., New York, NY 10036. Open to Under 1800. EF: $20, $15 +membs. $$ (200 b/20): 75-55, C 40, U1400 30. Reg. 6:45 pm. Rds. 7-8:15-9:30. +Info: (212)333-5888. NS. NC. + +Jan 18. Manhattan Chess Club NYC's Best Thursday Night Action. 4-SS, G/30. +Manhattan Chess Club, 353 W 46 St., NY, NY 10036. EF: $20, $15 membs. $$ (480 +b/35): 200-100, Expert 90, U2000 90. Reg. 6:30 pm. Rds. 7-8:15-9:30-10:45. +Info: (212)333-5888. NS. NC. + +Jan. 18. The Original "4 Rated Games Tonight" First In Action! 4-SS, G/30. +Chess Center at the Marshall Club, 23 W. 10th St., bet. 5-6th Ave, NYC. EF: +$20. $$ (490 b/32): 170-90-50, Top 2000-2199/unr., U2000 each $90. Byes: all, +limit 2 (byes rds. 3-4 must commit before rd. 2). Re-entry: $10, counts as 1/2 +entry. Class pairings OK rd. 4. Reg. ends 15 min. before game. Rds. 7-8:15- +9:30-10:45 pm. Info: (212)477-3716. NS. NC. + +Jan. 18-Feb. 8. Marshall Chess Club Thursday U2200. 4-SS, 40/2, 20/1. Marshall +Chess Club, 23 W 10 St., NYC 10011. Open to players U2200. EF: $27, $15 membs. +$$ (240/20): 100-60, U2000 $40, U1700 $30. Reg. 6:15-6:45. Rds. 7 pm each +Thursday. Ent: as above. NS. NC. + +January 19-21. Empire City Open!. See Grand Prix. January 20. Ithaca Back-to- +School Open VIII. See G.P. Jan 20. Manhattan Chess Club Saturday U1700. 4-SS, +G/45. Manhattan Chess Club, 353 W 46 St., New York, NY 10036. EF: $30, $20 +membs. $$ (300 b/20): 100-60-40, C 50, U1400 50. Reg. 11 am. Rds. 11:30-1:45- +3:30-5:15. Info: (212)333-5888. NS. NC. + +Jan 20 (QC). Manhattan Chess Club Extra Quick Chess Open. 5-SS, G/10. +Manhattan Chess Club, 353 W 46 St., New York, NY 10036. Open to all. EF: $15, +$12 membs. $$ (200 b/25): 90-60, U2000 50. Reg. 7:15 pm. Rd. 1 at 7:30 then +every 30 min. Info: (212)333-5888. NS. NC. + +Jan. 20. Finger Lakes Winter Scholastic. 5-SS, G/45. Phillips Hall, Ithaca +College, NY 14850. H.S.: open to grades 9-12. J.H.S.: open to grades 6-8. +Elementary: open to grades K-5. EF: $7 in advance, $9 at site. All, trophies +and other prizes. Reg. 8:30-9:45. Rds. 10-11:45-1:30-3-4:30. HP:(607)274-3313. +Ent: Panorama Chess Promotions, 30 Ferguson Rd, Dryden NY 13053. (607)844- +KING. NS. NC. W. Jan. 21. Studio Quad. 3-RR, 40/90, G/60. Studio, 1639 +Eastern Pky, Schenectady, NY 12309. Reg. 9 am. Rds. 10-2-6. Info: (518)346- +3773. + +Jan. 21. Manhattan Chess Club G/45 Open. 4-SS, G/45. Manhattan Chess Club, 353 +W 46 St., New York, NY 10036. EF; $30, $20 membs. $$ (480 b/32): 150-100-50, +Expert, A, U1800 60 each. Reg. 10:30 am. Rds. 11-12:45-2:30-4:15. Info: +(212)333-5888. NS. NC. + +Jan. 21. Manhattan Chess Club Rated Beginners Open. 4-SS, G/45. Manhattan +Chess Club, 353 W 46 St., New York, NY 10036. Open to Under 1200 & Unrated. +EF: $20, $10 membs. Trophies to top 3. Reg. 10:30 am. Rds. 11-12:45-2:30-4:15. +Info: (212)333-5888. NS. NC. + +Jan. 21. Manhattan Chess Club Sunday U2200 Quad. 3-RR, G/30. Manhattan Chess +Club, 353 W 46 St., New York, NY 10036. Open to Under 2200. EF: $20, $15 +membs. $$ 40 to first each quad. Reg. 6:15 pm. Rds. 6:30-7:30-8:30. Info: +(212)333-5888. NS. NC. + +Jan. 21. Sunday Night Quad! 3-RR, G/30. Chess Center at the Marshall Club, 23 +W. 10th St., bet. 5-6th Ave, NYC. EF: $20, $15 club membs. $$ (50 b/4 per +quad). Reg. ends 6:50 pm. Rds. 7-8-9 pm. NS. NC. Jan. 22. Manhattan Chess +Club Monday U1600. 3-SS, G/30. Manhattan Chess Club, 353 W 46 St., New York, +NY 10036. Open to Under 1600. EF: $20, $15 membs. $$ (200 b/20): 75-55-35, +U1400 35. Reg. 6:45 pm. Rds. 7-8:15-9:30. Info: (212)333-5888. NS. NC. + +Jan. 23. Manhattan Chess Club *New* Flash Four. 4-SS, G/25. Manhattan Chess +Club, 353 W 46 St., New York, NY 10036. EF: $20, $15 membs. $$ (420 b/35): 150- +100-50, Expert 60, U2000 60. Reg. 6:45 pm. Rds. 7-8-9-10. Info: (212)333-5888. +NS. NC. + +Jan. 23-Feb. 13. Manhattan Chess Club U1800 Slow Swiss. 4-SS, 30/90, SD/1. +Manhattan Chess Club, 353 W 46 St., New York, NY 10036. Open to U1800. EF: +$20, $15 membs. $$ (200 b/20): 80-50, 1400-1599 35, U1400 35. Reg. 6:30 pm. +Rds. 7 pm each Tues. Byes rds 1-3 with entry, limit two. Info: (212)333-5888. +NS. NC. + +Jan. 24. Manhattan Chess Club Wednesday U2000. 3-SS, G/30. Manhattan Chess +Club, 353 W 46 St., New York, NY 10036. EF: $20, $15 membs. $$ (200 b/20): 75- +55, B 40, U1600 30. Reg. 6:30 pm. Rds. 7-8:15-9:30. Info: (212)333-5888. NS. +NC. + +Jan. 24-Feb. 14. Marshall Chess Club Wednesday U1800. 4-SS, 50/2, 25/1. +Marshall Chess Club, 23 W 10 St., NYC 10011. Open to players rated U1800. EF: +$20, $10 membs. $$ (175 b/20): 75-45-30, U1700 $25. Reg. 6:15-6:45. Rds. 7 pm +each Wednesday. Ent: as above. NS. NC. + +Jan. 25. Manhattan Chess Club NYC's Best Thursday Night Action. 4-SS, G/30. +Manhattan Chess Club, 353 W 46 St., New York, NY 10036. EF: $20, $15 membs. $$ +(480 b/35): 200-100, Expert 90, U2000 90. Reg. 6:30 pm. Rds. 7-8:15-9:30. +Info: (212)333-5888. NS. NC. + +Jan. 25. The Original "4 Rated Games Tonight" First In Action! 4-SS, G/30. +Chess Center at the Marshall Club, 23 W. 10th St., bet. 5-6th Ave, NYC. EF: +$20. $$ (490 b/32): 170-90-50, Top 2000-2199/unr., U2000 each $90. Byes: all, +limit 2 (byes rds. 3-4 must commit before rd. 2). Re-entry: $10, counts as 1/2 +entry. Class pairings OK rd. 4. Reg. ends 15 min. before game. Rds. 7-8:15- +9:30-10:45 pm. Info: (212)477-3716. NS. NC. + +Jan. 27. Syracuse Jan Open. 4-SS, Rds 1-2 G/60, Rds 3-4 G/90. Holiday Inn, +Carrier Circle (off 298), E Syracuse, NY (Exit 35 I-90). EF: $22 if rec'd by +1/25, $3 more at site. $$ (b/28): 160-70, Class prizes $152. Ent: Joe Ball, +310 Helfer Ln, Minoa, NY 13116. + +Jan. 27. Manhattan Chess Club G/60 Open. 4-SS, G/60. Manhattan Chess Club, 353 +W 46 St., New York, NY 10036. Open to all. EF: $30, $20 membs. $$ (480 b/32): +150-100-50, Expert 70, A 60, U1800 50. Reg. 11:30 am. Rds. 12-2:15-4:30-6:45. +Info: (212)333-5888. NS. NC. + +Jan. 27 (QC). Manhattan Chess Club Extra Quick Chess Open. 5-SS, G/10. +Manhattan Chess Club, 353 W 46 St., New York, NY 10036. Open to all. EF: $15, +$12 membs. $$ (200 b/25): 90-60, U2000 50. Reg. 7:15 pm. Rd. 1 at 7:30 pm then +every 30 minutes. Info: (212)333-5888. NS. NC. + +Jan. 27. 9th Annual Chess Center Super Saturday!! See Grand Prix. Jan. 28. +Manhattan Chess Club Sunday Action. 5-SS, G/30. Manhattan Chess Club, 353 W 46 +St., New York, NY 10036. EF: $30, $20 membs. $$ (480 b/32): 160-90-50, Expert, +A, U1800 each $60. Reg. 11:30 am. Rds. 12-1:15-2:30-3:45-5. Info: (212)333- +5888. NS. NC. + +Jan. 28. Manhattan Chess Club Sunday Night Quad. 3-RR, G/30. Manhattan Chess +Club, 353 W 46 St., New York, NY 10036. EF: $20, $15 membs. $$ 45 1st each +quad. Reg. 6:30 pm. Rds. 7-8-9 pm. Info: (212)333-5888. NS. NC. + +Jan. 28. Sunday Quads. 2 separate events, each a 3-RR. Chess Center at the +Marshall Chess Club, 23 W. 10th St. (between 5-6th Ave.), NYC. Noon Quad: +G/60. EF: $25. $$ (60 b/4 per quad). Rds. 12-2-4 pm. 7 PM Quad: EF: $20, $15 +if also entered in Noon Quad. Rds. 7-8-9 pm. Both, EF $5 less to Club membs. +Reg. ends 10 min. before rd. 1. NS. NC. Info: (212)477-3716. + +January 29-February 12. 6th Nassau G/60 Championship. See Grand Prix. Jan. +29. Manhattan Chess Club Monday U1800. 3-SS, G/30. Manhattan Chess Club, 353 W +46 St., New York, NY 10036. Open to Under 1800. EF: $20, $15 memb. $$ (200 +b/20): 75-55, C 40, U1400 30. Reg. 6:45 pm. Rds. 7-8:15-9:30. Info: (212)333- +5888. NS. NC. + +Jan. 30. Manhattan Chess Club *New* Flash Four. 4-SS, G/25. Manhattan Chess +Club, 353 W 46 St., New York, NY 10036. EF: $20, $15 memb. $$ (200 b/20): 90- +60, U2000 50. Reg. 6:45 pm. Rds. 7-8-9-10. Info: (212)333-5888. NS. NC. + +January 30-February 6. 7th Annual Mikhail M. Botvinnik Memorial. See Grand +Prix. Jan. 31. Manhattan Chess Club Wednesday U1400. 3-SS, G/30. Manhattan +Chess Club, 353 W 46 St., New York, NY 10036. Open to Under 1400. EF: $15, $10 +memb. Trophies to top 3. Reg. 6:45 pm. Rds. 7-8:15-9:30. Info: (212)333-5888. +NS. NC. + +Feb. 1. Manhattan Chess Club NYC's Best Thursday Night Action. 4-SS, G/30. +Manhattan Chess Club, 353 W 46 St., New York, NY 10036. EF: $20, $15 memb. $$ +(480 b/35): 200-100, Expert 90, U2000 90. Reg. 6:30 pm. Rds. 7-8:15-9:30- +10:45. Info: (212)333-5888. NS. NC. + +February 1. The Original 4 Rated Games Tonight America's First Action +Tournament. See Grand Prix. Feb. 3. PS 9, Open K thru 8th Graders. 4-SS, +G/30. PS 9, 100 W 84 St., New York 10024. Open to all K thru 8. 5 sections: +Grades K-1, 2-3, 4-5, 6-8, G/40 Over 1100. Trophies to all with 2 1/2 or more +points. Reg. 9. Rds. 9:30-11-1:30-3. Pre-reg. EF: $20, Walk-in's $30. $5 +surcharge non-USCF membs. Food on site at 9 am. Ent: Rob Young, Apt 8F, 90N +Riverside Dr., New York, NY 10024. (212)724-6367 7-9 pm. Phone reg until 9 pm +2/2. NS. NC. + +Feb. 3. Manhattan Chess Club Saturday U1900. 4-SS, G/45. Manhattan Chess Club, +353 W 46 St., New York, NY 10036. Open to Under 2000. EF: $30, $20 memb. $$ +(300 b/20): 100-60-40, B 50, U1600 50. Reg. 11 am. Rds. 11:30-1:15-3-4:45. +Info: (212)333-5888. NS. NC. + +Feb. 3 (QC). Manhattan Chess Club Extra Quick Chess Open. 5-SS, G/10. +Manhattan Chess Club, 353 W 46 St., New York, NY 10036. Open to all. EF: $15, +$12 memb. $$ (200 b/25): 90-60, U2000 50. Reg. 7:15 pm. Rds. 1 at 7;30 pm then +every 30 minutes. Info: (212)333-5888. NS. NC. + +Feb. 3-4. Marshall Chess Club February Grand Prix. See Grand Prix. Feb. 4. +Manhattan Chess Club Under 2400 Action. 5-SS, G/30. Manhattan Chess Club, 353 +W 46 St., New York, NY 10036. EF: $30, $20 membs. $$ (480 b/32): 160-90-50, +Expert, A, U1800 each $60. Reg. 11:30 am. Rds. 12-1:15-2:30-3:45-5. Info: +(212)333-5888. NS. NC. + +Feb. 4. Manhattan Chess Club Sunday U2200 Quad. 3-RR, G/30. Manhattan Chess +Club, 353 W 46 St., New York, NY 10036. EF: $20, $15 membs. $$ (200 b/20): 75- +55, B 40, U1600 30. Reg. 6:30 pm. Rds. 7-8:15-9:30. Info: (212)333-5888. NS. +NC. + +Feb. 5. Manhattan Chess Club Monday U2000. 3-SS, G/30. Manhattan Chess Club, +353 W 46 St., New York, NY 10036. EF: $20, $15 membs. $$ (200 b/20): 75-55, B +40, U1600 30. Reg. 6:30 pm. Rds. 7-8:15-9:30. Info: (212)333-5888. NS. NC. +Feb. 5. Marshall Chess Club U1600 Action Swiss. 4-SS, G/30. Marshall Chess +Club, 23 W 10 St., NYC 10011. Open to players rated U1600. EF: $20, $12 membs. +$$ (175 b/20): 75-45-30, U1400/unr. $25. Reg. 6:15-6:45 pm. Rds. 7-8:15-9:30- +10:45. Ent: as above. NS. NC. Feb. 6(QC). Manhattan Chess Club *New* Flash +Four. 4-SS, G/25. Manhattan Chess Club, 353 W 46 St., New York, NY 10036. EF: +$20, $15 membs. $$ (200 b/20): 90-60, U2000 50. Reg. 6:45 pm. Rds. 7-8-9-10. +Info: (212)333-5888. NS. NC. + +Feb. 7. Manhattan Chess Club Wednesday U1600. 3-SS, G/30. Manhattan Chess +Club, 353 W 46 St., New York, NY 10036. Open to Under 1600. EF: $20, $15 +membs. $$ (200 b/20): 75-55-35, U1400 35. Reg. 6:45 pm. Rds. 7-8:15-9:30. +Info: (212)333-5888. NS. NC. Feb. 7-28. Manhattan Chess Club Wednesday Night +Swiss. 4-SS, 30/90, SD/1. Manhattan Chess Club, 353 W 46 St., New York, NY +10036. Open to all. EF: $20, $15 membs. $$ (320 b/25): 120-60-40, U2200 50, +U2000 50. Reg. 6:30 pm. Rds. 7 pm each Wed. Byes Rds. 1-3 with entry, limit +two. Info: (212)333-5888. NS. NC. Feb. 8. Manhattan Chess Club NYC's Best +Thursday Night Action. 4-SS, G/30. Manhattan Chess Club, 353 W 46 St., New +York, NY 10036. EF: $20, $15 membs. $$ (480 b/35): 200-100, Expert 90, U2000 +90. Reg. 6:30 pm. Rds. 7-8:15-9:30-10:45. Info: (212)333-5888. NS. NC. Feb. +8. The Original "4 Rated Games Tonight" First In Action! 4-SS, G/30. Chess +Center at the Marshall Chess Club, 23 W. 10th St. (between 5-6th Ave), NYC. +EF: $20. $$ (490 b/32): 170-90-50, Top 2000-2199/unr., U2000 each $90. Byes: +all, limit 2 (byes rds. 3-4 must commit before rd. 2). Re-entry: $10, counts +as 1/2 entry. Class pairings OK rd. 4. Reg. ends 15 min. before game. Rds. 7- +8:15-9:30-10:45 pm. Info: (212)477-3716. NS. NC. + +Feb. 10. Binghamton Panorama Open. 4-SS, 40/60, 30/SD. Days Inn, Upper Front +St., Binghamton, NY. Open: to all. EF: $18 by 2/8, $20 at site. $$ 250 b/20. +Under 1400/Novice: EF: $8 by 2/8, $10 at site. Trophies to top quarter. Both, +Reg. 8:30-9:15. Rds. 9:30-12:15-3-5:45. $2 discount to college students, jrs, +carpools of three or more. Ent: Bob Nasiff, Tully Farms Rd, Tully, NY 13159. +(315)677-3949. NS. NC. W. + +Feb. 10. Manhattan Chess Club Saturday Under 2200. 4-SS, G/60. Manhattan Chess +Club, 353 W 46 St., New York, NY 10036. EF: $30, $20 membs. $$ (450 b/30): 150- +105-75, A, U1800 each $60. Reg. 11:30 am. Rds. 12-2:30-5-7:15. Info: (212)333- +5888. NS. NC. Feb. 10 (QC). Manhattan Chess Club Extra Quick Chess Open. 5- +SS, G/10. Manhattan Chess Club, 353 W 46 St., New York, NY 10036. Open to all. +EF: $15, $12 membs. $$ (200 b/25): 90-60, U2000 50. Reg. 7:15 pm. Rd. 1 7:30 +pm then every 30 minutes. Info: (212)333-5888. NS. NC. Feb. 10-11. Marshall +Chess Club U2300. 4-SS, 30/90, SD/1. Marshall Chess Club, 23 W 10 St., NYC +10011. EF: $35, $20 membs. $$ (360 b/22): 120-80-50, U2000 $60, U1800/unr. +$50. Reg. 10:15-10:45 am. Rds. 11-4:30 each day. Ent: as above. NS. NC. + +Feb. 11. Manhattan Chess Club G/60 Open. 4-SS, G/60. Manhattan Chess Club, 353 +W 46 St., New York, NY 10036. Open to all. EF: $30, $20 membs. $$ (480 b/32): +150-100-50, Expert 70, A 60, U1800 50. Reg. 11:30 am. Rds. 12-2:15-4:30-6:45. +Info: (212)333-5888. NS. NC. Feb. 11. Manhattan Chess Club Sunday Novice. 4- +SS, G/60. Manhattan Chess Club, 353 W 46 St., New York, NY 10036. Open to +Under 1400. EF: $20, $10 membs. Trophies to top 3. Reg. 11:15 am. Rds. 11:30- +1:45-4-6:15. Info: (212)333-5888. NS. NC. Feb. 11. Manhattan Chess Club +Sunday U2200 Quad. 3-RR, G/30. Manhattan Chess Club, 353 W 46 St., New York, +NY 10036. EF: $20, $15 membs. $$ (40 1st each quad. Reg. 6:15 pm. Rds. 6:30- +7:30-8:30. Info: (212)333-5888. NS. NC. Feb. 12. Manhattan Chess Club Monday +U1400. 3-SS, G/30. Manhattan Chess Club, 353 W 46 St., New York, NY 10036. +Open to Under 1400. EF: $15, $10 membs. Trophies to top 3. Reg. 6:45 pm. Rds. +7-8:15-9:30. Info: (212)333-5888. NS. NC. Feb. 12-March 11. Marshall Chess +Club U1600. 4-SS, 50/2, 25/1. Marshall Chess Club, 23 W 10 St., NYC 10011. +Open to players rated U1600. EF: $25, $15 membs. $$ (220 b/20): 100-60, U1400 +$35, U1200/Unr. $25. Reg. 6:15-6:45. Rds. 7 each Monday no rd 2/19. Ent: as +above. NS. NC. + +Feb. 13 (QC). Manhattan Chess Club *New* Flash Four. 4-SS, G/25. Manhattan +Chess Club, 353 W 46 St., New York, NY 10036. EF: $20, $15 membs. $$ (420 +b/35): 150-100-50, Expert, 60, U2000 60. Reg. 6:30 pm. Rds. 7-8-9-10. Info: +(212)333-5888. NS. NC. Feb. 13(QC). King's Gambit Quick Thematic! 4-SS, G/29. +Chess Center at the Marshall Chess Club, 23 W. 10th St. (between 5-6th Ave), +NYC. All games begin 1. e4 e5 2. f4! EF: $15. $$ (200 b/20): 100-60, top U1900 +$40. Byes OK rds. 1-4, limit 2 (byes rds. 3-4 must commit before rd. 2). Reg. +ends 10 min. before game. Rds. 7-8:15-9:30-10:45 pm. NS. NC. Info: (212)477- +3716. + +Feb. 14. Manhattan Chess Club Wednesday U1800. 3-SS, G/30. Manhattan Chess +Club, 353 W 46 St., New York, NY 10036. Open to Under 1800. EF: $20, $15 +membs. $$ (200 b/20): 75-55, C 40, U1400 30. Reg. 6:45 pm. Rds. 7-8:15-9:30. +Info: (212)333-5888. NS. NC. April 3-7. New York Open 1996. See Grand Prix. + diff --git a/data/uscf/oh b/data/uscf/oh new file mode 100644 index 0000000..e33df21 --- /dev/null +++ b/data/uscf/oh @@ -0,0 +1,97 @@ + +OHIO + +Dec. 15. Cleveland Friday Action. 4-SS, G/30. Severance Shopping Mall, +Learning Center (enter directly from SW corner parking lot near Dunham's), +Mayfield and Taylor Rds, Cleveland Hts, OH. 2 sections: Open and Under 1800. +EF: $10, $7 Jrs. $$ (Open) 80-40, more prizes based on entries. Reg. ends 7:30 +pm promptly. Info: Mike Joelson (216)291-5788 or Sri Rahm (216)382-8790. + +Dec. 16 (QC). Beachwood Quick Chess. 7-SS, G/15. Beachwood Public Library, NW +corner of Shaker and Richmond Rds in Beachwood, OH (1 mile N of Chagrin Blvd +at I-271 Exit). EF: $10, $7 Jrs. under 18. $$ based on entries. Reg. ends +12:30. Tnmt ends approx. 5 pm. Info: Sri Rahm (216)382-8790. + +Dec. 16. Winter Scholastic. 4-SS, G/45. Walnut Hills High School, 3250 Victory +Pky, Cincinnati, OH 45207. 3 sections: Open, U1300, U1000. All, EF: $8 by +12/10, $10 at site. Trophies & $$ to top 5 in ea. sect. Reg. 8:30-9. Rds. 9:30- +11:30-1:30-3:30. Food sold at site. Ent: Alan Barrett, 6337 Amelia Dr., +Cincinnati, OH 45241. (513)779-3828. NS. NC. + +Dec. 16. Miamisburg Tornado. 4-SS, 30/1, 30/30. Civic Center, First & Central, +Miamisburg, OH. EF: $12 by 12/15, $14 at site. Jrs. $1 off, U17 $3 off. $$ 75% +of entries. Reg. 8-8:45 am. Rds. 9-12-3:30-7. Half-point bye available any +round. Ent: Tien Chou, 1303 Meadowview Dr., Miamisburg, OH 45342. (513)859- +4849. NS. NC. W. + +Dec. 22. Hudson Action Swiss. 4-SS, G/30. Hudson High School, 2500 Hudson- +Aurora Rd. Take 91 Exit off 480 S to Hudson-Aurora Rd. Open: to all. EF: $10, +$7 Jrs, Srs, free to over 2400. $$ (120 G): 80-40, other prizes based on +entries. Reg. 7-7:30. Rd. 1 at 7:45. NS. NC. + +Dec. 28. Christmas Break Scholastic. 4-SS, G/30. First Christian Church of +Stow, 3493 Darrow Rd (corner of 59&91), Stow, OH 44224. 3 sections: Grade +6/below, Grade 7-9, Grade 10-12. EF: $12 in advance, $15 at door. Trophies to +top three in each section, certificates to all. Reg. 8:30-9:30. Rd. 1 at 10 +am. Ent: George W Gotschall, 3028 Englewood Dr., Silver Lake, OH 44224. +(216)688-0245. NS. NC. W. + +December 30. Hudson Holiday Open. See Grand Prix. Jan. 2. Parma Quad #1. 3- +RR, G/30. German Central Organization, 7853 York Rd, Parma, OH 44130. (216)843- +9377. EF: $4 for club membs, $6 non-membs. $$ 12 to 1st in each quad. Reg. 7- +7:30 pm. Rds. 7:45-8:50-9:55. Ent: William Wright, 19121 Wheelers Lane, +Strongsville, OH 44136. + +January 5-7. 2nd Midwest Winter Open. See Grand Prix. Jan. 9. Parma Quad #2. +3-RR, G/30. German Central Organization, 7853 York Rd, Parma, OH 44130. +(216)843-9377. EF: $4 for club membs, $6 non-membs. $$ 12 to 1st in each quad. +Reg. 7-7:30 pm. Rds. 7:45-8:50-9:55. Ent: William Wright, 19121 Wheelers Lane, +Strongsville, OH 44136. + +Jan. 16. Parma Quad #3. 3-RR, G/30. German Central Organization, 7853 York Rd, +Parma, OH 44130. (216)843-9377. EF: $4 for club membs, $6 non-membs. $$ 12 to +1st in each quad. Reg. 7-7:30 pm. Rds. 7:45-8:50-9:55. Ent: William Wright, +19121 Wheelers Lane, Strongsville, OH 44136. + +Jan. 13. Chess Playoffs. 4-SS, Rd 1 G/45, Rd 2 G/60. Rds. 3 & 4 G/75 at Best +Western Inn, I-71 and Rt 18, Medina OH (216)725-4571. 1 mile south off +intersection I-271 and I-71 (20 miles S of Cleveland airport). EF: $25, $20 +Jrs. by 1/10, $5 more at site. $$ (1st place G, rest b/30 entries): 120-80, +U2000 $80-50, U1800 $60-40, U1600 $50-30, U1400 $40-25. Accelerated pairings +may be used. Reg. ends 9:45 pm. Rds. 10-11:45-2:15-5. Ent: Sri Rahm, 4249 +Wyncote Rd, S Euclid, OH 44121. (216)382-8790. + +Jan. 13. Happy Bishop III. 4-SS, G/75. Happy Corner Church of the Brethren, +7037 Union Rd, Clayton OH(A Northwest Suburb of Dayton), take I-70 west of I- +75, exit 26 then left on Hoke Rd, left on SR 49 left on Old Salem, church +located on corner of Union & Old Salem. EF: $16. $$ 75% of entries. Reg. 8:30- +9:15 am. Rds. 9:30-12:30-3:30-6:30. Half-point bye available. T.D. John +Jackson (513)836-6827. NS. NC. + +January 19-21. 19th Cardinal Open. See Grand Prix. Jan. 23. Parma Quad #4. 3- +RR, G/30. German Central Organization, 7853 York Rd, Parma, OH 44130. (216)843- +9377. EF: $4 for club membs, $6 non-membs. $$ 12 to 1st in each quad. Reg. 7- +7:30 pm. Rds. 7:45-8:50-9:55. Ent: William Wright, 19121 Wheelers Lane, +Strongsville, OH 44136. + +Jan. 27 (QC). Beachwood Quick Chess. 7-SS, G/15 at Beachwood Public Library, +Beachwood, OH (NW corner of Shaker and Richmond, 1 mile N of Chagrin at I-271 +exit). EF: $10, $7 jrs. $$ based on entries. Reg. ends 12:30 pm tournament +ends approx. 5 pm. Info: Sri Rahm (216)382-8790. + +Jan. 30. Parma Quad #5. 3-RR, G/30. German Central Organization, 7853 York Rd, +Parma, OH 44130. (216)843-9377. EF: $4 for club membs, $6 non-membs. $$ 12 to +1st in each quad. Reg. 7-7:30 pm. Rds. 7:45-8:50-9:55. Ent: William Wright, +19121 Wheelers Lane, Strongsville, OH 44136. + +February 2-4. Mad River Open. See Grand Prix. Feb. 6. Parma Quad #6. 3-RR, +G/30. German Central Organization, 7853 York Rd, Parma, OH 44130. (216)843- +9377. EF: $4 for club membs, $6 non-membs. $$ 12 to 1st in each quad. Reg. 7- +7:30 pm. Rds. 7:45-8:50-9:55. Ent: William Wright, 19121 Wheelers Lane, +Strongsville, OH 44136. + +Feb. 13. Parma Quad #7. 3-RR, G/30. German Central Organization, 7853 York Rd, +Parma, OH 44130. (216)843-9377. EF: $4 for club membs, $6 non-membs. $$ 12 to +1st in each quad. Reg. 7-7:30 pm. Rds. 7:45-8:50-9:55. Ent: William Wright, +19121 Wheelers Lane, Strongsville, OH 44136. + diff --git a/data/uscf/ok b/data/uscf/ok new file mode 100644 index 0000000..dd9e914 --- /dev/null +++ b/data/uscf/ok @@ -0,0 +1,15 @@ + +OKLAHOMA + +Jan. 1. 5th Holiday Open. 4-SS, G/80 White, G/85 Black. Holiday Inn +(Holidome), 2515 W 6th Ave, Stillwater, OK 74074. EF: $12. $$ b/entries. State +memb. req'd $8, $4 Jr., OSA. Free parking. HR: $44 (1-4). HP: (405)372-0800. +Ent: Jim Berry, PO Box 351, Stillwater, OK 74076. (800)426-6814. LS. NC. W. + +Jan. 27. Super Saturday Knight Bash. 3-SS, G/2. OSU-Okmulgee Student Union, +1801 E 4th, Okmulgee, OK 74447. $$ (650 b/40). Open: to all. EF: $20 by 1/22, +$25 at site. $$ 150, X,A, each $80. Reserve: open to U1800. EF: $20 by 1/22, +$25 at site. $$ 100 B,C,D/E/Unr each $80. Trophies to section and class +winner. Reg. 8:30-9:30. Rds. 10-3-7. State memb req'd $8, OSA. Ent: Raymond +Griffin, 421 S Central, Okmulgee, OK 74447. NS. NC. W. + diff --git a/data/uscf/or b/data/uscf/or new file mode 100644 index 0000000..97333cd --- /dev/null +++ b/data/uscf/or @@ -0,0 +1,29 @@ + +OREGON + +Dec. 16. 5th Annual Philomath Winter Scholastic. 5-SS, G/30. Philomath Middle +School, 2021 Chapel Drive, Philomath, OR 97370 (4 miles W of Corvallis, OR). +Two sections. Section 1: 7th-12th grade. Section 2: K-6th grade. (K-6th may +play in Section 1 upon request.) Reg. 8-9 am. Rds. 9:30-11-12:30-2-3:30. +Awards: 5 pm. EF: $8 by 12/13, $10 at site. Prizes: 19 trophies. Section 1: +1st Overall, 1st, 2nd, 3rd High School (9-12); 1st, 2nd, 3rd Middle School (7- +8); Best Unrated & Biggest Upset. Section 2: 1st Overall, 1st, 2nd, 3rd +Elementary (4-6); 1st, 2nd, 3rd Primary (K-3); Best Unrated & Biggest Upset. +USCF memb req'd, $7/yr includes one year subscription to School Mates. Ent: +John Bain, PO Box 398, Philomath, OR 97370. (503)929-2844. Dec. 30. Portland +Chess Club Saturday Action. 1/2K, 5-SS, G/30. Portland Chess Club, 321 SW 4 +Ave, Rm 201, Portland, OR 97204. Open to all. EF: $15. $$ 50-30-20, U1800, +U1500 each $25. Reg. 9-9:30. Rds. 9:45-11-1-2:15-3:30. Building entry code: +2&5 together to clear, then 2345 to enter. Ent: Laszlo Szalvay, 14950 SW 144 +Ave, Tigard, OR 97224. (503)590-5001. NS. NC. W. Jan. 20. Portland Chess Club +(PCC) Winter Quads. 3-RR, 40/90, SD/30. Portland Chess Club, 321 SW 4th Ave +2nd Flr, Portland, OR 97204. EF: $15. $$ 35 first prize to each quad. Reg. 9- +9:45 am. Rds. 10-2:30-7 or ASAP. State memb. req'd. $20, OSA. Ent: Troy +Pendergraft, 1963 SW 2nd Dr., Gresham, OR 97080. (503)661-0812. NS. NC. + +Jan. 27. Portland Chess Club Saturday Action. 1/2 K, 5-SS, G/30. Portland +Chess Club, 321 SW 4th Ave, Rm 201. Open: to all. EF: $15. $$ 50-30-20, U1800, +U1500 each $25. Reg. 9-9:30. Rds. 9:45-11-1-2:15-3:30. Bldg. entry code: 2 & 5 +together to clear then 2345 to open. Ent: Laszlo Szalvay, 14950 SW 144 Ave, +Tigard, OR 97224. (503)590-5001. NS. NC. W. + diff --git a/data/uscf/pa b/data/uscf/pa new file mode 100644 index 0000000..3d6e938 --- /dev/null +++ b/data/uscf/pa @@ -0,0 +1,89 @@ + +PENNSYLVANIA + +Dec. 16. PSCF-SJP Octos. St. Joseph's Prep School, 17th & Girard Sts, +Philadelphia, PA 19130. 2 sections. Open: open to all. 3-SS, G/60. EF: $10. $$ +25-15-10 per section of 8-12. Reg. 8:30-9:30. Rds. 10-12:30-2:30. Scholastic: +open to scholastic, U1200. 4-SS, G/30. Book to all scoring 3 pts or higher, +groups of 8-12. Reg. 8:30-9:30. Rds. 10-11-12:30-1:30. State memb. req'd. $5, +$3 students, OSA. Ent: Dr. Ira Lee Riddle. (215)674-8892. NS. NC. W. + +Dec. 16. NPCC Saturday Octo. 3-SS, 40/80, SD/30. St. John's UCC (church), Main +& Richardson, Lansdale, PA. EF: $12, $10 NPCC memb. $$ (b/8): $30-20. Reg. 9- +9:25. Rds. 9:30-1-4:30. Ent: North Penn CC, c/o Don Funk, 612 Shearer St., +North Wales, PA 19454. (215)699-8418. NS. + +Jan. 3, 10, 17. DCC/"Operation Shingle," Sectional. 3-SS, 40/90, SD/30. The +Doylestown Inn, 18 W State St., Doylestown, PA 18901. 8 player sections. EF: +$12, $10 to DCC membs. $$ (60 b/8): 40-20. Reg. 7-7:20. Rds. 7:30 each +Wednesday. Ent: Doylestown Chess Club, c/o Stan Ward, 2241 Wodoch Ave, +Warrington, PA 18976. (215)343-2373. LS. NC. + +Jan. 5-Mar. 8. NPCC Winter Robin. 7-RR (max. 8 players per sect.), 40/100, +SD/45. St. John's UCC (church), Main & Richardson, Lansdale, PA. EF: $20, $15 +NPCC memb. $$ (b/8 per section): $40-30, (Top-in-lower-half) $20. Reg. 7:45- +7:55. Rds. 8 pm each Fri. (Rd 1, 1/5; Rd 2, 1/12, Rd 3, 1/26; Rd 4, 2/2; Rd 5, +2/9; Rd 6, 2/23, Rd 7, 3/1. Make-up games possible Thurs. evenings 1/19, 2/16 +& 3/8.) Ent: North Penn CC, c/o Don Funk, 612 Shearer St., North Wales, PA +19454. (215)699-8418. NS. + +Jan. 5-7. 28th annual Liberty Bell Open. See Grand Prix. Jan. 6. W/Chester +1st Sat. Quads. 3-RR, 40/80, SD/30. United Methodist Church, 129 S. High +Street (Rt. 100), West Chester, PA. EF: $15. $$ 30 to first each section. Reg. +9 am. Rds. 9:30-1-5. Ent: James J. White, 429 Bianca Circle, Downington, PA +19335. (610)269-7639. NS. NC. Jan. 7. Philadelphia Scholastic Novice. 4-SS, +G/30. Adam's Mark Hotel (see Liberty Bell Open, 1/5-7). Open: to K-12 under +1000 or unr. EF: $12 mailed by 12/28, $20 at site. Free if playing in Liberty +Bell Open with round 4 bye. Trophies to top 7. Reg. ends 8:30 am, rds. 9-10-11- +12. Ent: See Liberty Bell Open. + +Jan. 13. PA State Team Tmnt. 5-SS, G/45. St. Joseph's Prep, 17th & Girard Sts, +Philadelphia, PA 19130. $$ 700 b/20 teams. Open: open to all teams of 4, avg. +U2200. EF: $50 if rec'd by 1/7, $60 at site. $$ 250-150-100, U2100, U2000, +U1800, U1600 $50 each. Scholastic/Reserve: open to scholastic, avg. U1400. EF: +$15 if rec'd by 1/7, $20 at site. Plaques to 4 membs. of top 3 teams. Both, +Reg. 8:30-9:30. Rds. 10-12-2-3:30-5. State memb. req'd. $5, Jrs. $3, OSA. Ent; +Dr. Ira Lee Riddle, 400 Newtown Rd, Warminster, PA 18974-5208. (215)674-8892. +NS. NC. W. + +Jan. 13. Allentown 2nd Saturday Quads. 3-RR, G/30. St. Luke's Evangelical +Lutheran Church, 417 N 7th St., Allentown, PA 18102. EF: $10. $24 to 1st ea. +quad. Reg. 12-12:45. Rds. 1-2-3. Info: Mark Knerr (610)432-8702. NS. NC. Jan. +16, 23, 30 Feb. 6, 13, 20, 27. Tuesday Night Club Championship. Open to all +members. 7-SS, 30/90, G/60. The Pittsburgh Chess Club, 5604 Solway St., +Pittsburgh, PA 15217. This is a benefit tnmt. All entries must be a memb. of +the Pittsburgh Chess Club. EF: $14 (tax deductible)! $$ TBA. First place ties +to be broken by playoff. Reg. 5:45-6:45 pm. 1/16. Rds begin at 7 pm. Ent: same +as above. (412)421-1881 NS. NC. + +Jan. 20. NPCC Saturday Octo. 3-SS, 40/80, SD/30. St. John's UCC (church), Main +& Richardson, Lansdale, PA. EF: $12, $10 NPCC memb. $$ (b/8): 30-20. Reg. 9- +9:25. Rds. 9:30-1-4:30. Ent: North Penn CC, c/o Don Funk, 612 Shearer St., +North Wales, PA 19454. (215)699-8418. NS. + +Jan. 21 (QC). Pittsburgh Chess League January Quick Quads. 3-RR, G/15. William +Pitt Union, University of Pittsburgh, Pittsburgh, PA 15260. EF: $10. $$ 20 to +1st in each quad. Reg. ends 11:15 am. Rds. 11:30-12-12:30. Info: (412)681- +7590. Ent: Tom Martinak, 320 N Neville St. Apt 5B, Pittsburgh, PA 15213-1656. +NS. W. Feb. 3. W/Chester 1st Sat. Quads. 3-RR, 40/80, SD/30. United Methodist +Church, 129 S. High St. (Rt 100), West Chester, PA. EF: $15. $$ 30 to first +each section. Reg. 9 am. Rds. 9:30-1-5. Ent: James J. White, 429 Bianca +Circle, Downington, PA 19335. (610)269-7639. NS. NC. + +Feb. 3-4. Metropolitan Open. 4-SS, 35/90, SD/60. Pittsburgh Chess Club, 5604 +Solway St., Pittsburgh, PA 15217. $$ 600 G. Open: to all. $$ 200, U2000 $80, +U1800 $70. Reserve: open to U1600. $$ 125-65, U1400 $60. Both, EF: $20 by +1/31, $25 at site, $3 less to PCC members. Reg. Sat 10-10:45 am. Rds. 11-5, 10- +4. Ent: Brian Thomson, 3191 Morningside Dr., Allsion Park, PA 15101. (412)492- +9330. NS. NC. + +Feb. 10. Allentown 2nd Saturday Quads. 3-RR, G/30. St. Luke's Evangelical +Lutheran Church, 417 N 7th St., Allentown, PA 18102. EF: $10. $$ 24 to 1st ea. +quad. Reg. 12-12:45. Rds. 1-2-3. Info: Mark Knerr (610)432-8702. NS. NC. +URHODE ISLANDU Dec. 16 (QC). New England Quick Chess Championship. 5-SS, +G/15. Rhode Island College, Mann Hall, 600 Mt Pleasant Ave, Providence, RI. +EF: $13 by 12/14, $18 at site. Home state memb. req'd $12, $6 jrs. $$ 260 +b/30: 100-50, U1900 $40, U1750 $40, U1500 $30. Reg. ends at 9 am. Rd. 1 at +9:30 & ASAP. Will be in two sections if entries permit. Bring chess clock. +Ent: Gilbert Gosselin, Box 1255, Melrose, MA 02176. (617)397-0919. NS. NC. + diff --git a/data/uscf/ri b/data/uscf/ri new file mode 100644 index 0000000..0eb6675 --- /dev/null +++ b/data/uscf/ri @@ -0,0 +1,31 @@ +RHODE ISLAND + +Oct. 21-22. 109th Rhode Island Open. 4-SS, 50/2, SD/1. Rhode Island College, +Mann Hall, 600 Mt Pleasant Ave, Providence, RI. $$ (1,000 b/75). 2 sections: +Open: open to all. EF: $22. $$ 200-100-50, U2000 $120-70-40. Reserve: open to +U1750/Unr. EF: $16. $$ 120-70-50, U1500 $100-50-30. Both, EF $6 more at site +if not rec'd by 10/19. Home state memb. req'd for rated players ($12 adult, $6 +jr). Reg. 8:30-9:30 am. Rds. 10-4, 9:30-3:30. Bye: with entry, limit 1. +Scholastic (10/22 only), open to U1500 in K-3, 4-6, EF: $1 per year of age if +rec'd by 10/19. (max. entry fee advance $10), $4 more at site. Trophies to top +in each section. Reg. 8:30-9:30 am. Rd. 1 at 10. Free parking. Ent: Gilbert +Gosselin, PO Box 1255, Melrose, MA 02176. (617)397-0919. NS. NC. + +Oct. 22. Rhode Island Scholastic. 4-SS, 50/2, SD/1. Rhode Island College, Mann +Hall, 600 Mt Pleasant Ave, Providence, RI. Open to U1500 in K-3, 4-6. EF: $1 +per year of age if rec'd by 10/19 (max. entry fee advance $10). $4 more at +site. Trophies to top in each section. Reg. 8:30-9:30 am. Rd. 1 at 10. See +Chess Life and Chess Horizons for details or call (617)397-0919. Ent: Gilbert +Gosselin, PO Box 1255, Melrose, MA 02176. + +Nov. 18-19. 31st Southeastern New England Open. 4-SS, 50/2, SD/1. Rhode Island +College, Mann Hall, 600 Mt Pleasant Ave, Providence, RI. $$ (1000 b/75). 2 +sections. Open: open to all. EF: $22. $$ 200-100- 50, U2000 $120-70-40. +Reserve: open to U1750/Unr. EF: $16. $$ 120-70-50, U1500 $100-50-30. Both, EF +$6 more at site if not rec'd by 11/6. Home state memb. req'd for rated players +$12, $6 Jr. Reg. 8:30- 9:30 am. Rds. 10-4, 9:30-3:30. Bye with entry, limit 1. +Scholastic (11/19 only): open to U1500 in K-3, 4- 6. EF: $1 per year or age if +rec'd by 11/16 (max. entry fee advance $10), $4 more at site. Reg. 8:30-9:30 +am. Rd. 1 at 10. Free parking. Ent: Gilbert Gosselin, PO 1255, Melrose, MA +02176. (617)397-0919. NS. NC. + diff --git a/data/uscf/sc b/data/uscf/sc new file mode 100644 index 0000000..175aa1c --- /dev/null +++ b/data/uscf/sc @@ -0,0 +1,19 @@ +SOUTH CAROLINA + +Oct. 14-15. South Carolina Championships. 5-SS, 35/90, SD/60. Hampton Inn, +7333 Garners Ferry Rd, Columbia, SC 29209. $$ 500 (b/40). 3 sections: +Championship: open to SC residents, including students and military. $$ 250: +100-75-50-25, trophy to top two. Reserve: open to U1900. $$ 150: 60-40, U1700 +$30-20, trophy to first. Amateur: open to U1600. $$100: 40-30, U1400 $20-10. +All, EF: $25 if rec'd by 10/13, $30 at site. SCCA memb. req'd. $8, OSA. Reg. 8- +9:15 am. Rds. 9:30-2:30-7:30, 9:30-3:30. SCCA Annual. Meeting 10/15 at 2:30 +pm. HR: (803)783-5410, mention tournament. Info: (803)794-5773. (Out- of-state +may enter Amateur and Reserve.) Ent: SC Chess Association, 564 Rainbow Cir., +West Columbia, SC 29170. NS. NC. W. + +Dec. 2-3. Columbia Open. 5-SS, 35/90, G/60. Columbia Chess Center, 410 D +Veterans Rd, Columbia, SC 29209. $$ (1000 b/40). Open to all. EF: $35 if rec'd +by 11/29, $40 at site. $$ 200-150, Expert,A,B,C,D,E each $100, top non-rated +$50. Reg. 9-9:50. Rds. 10-2:30-7, 10-3. HR: $49, (803)783-5410. Ent: Ronnie +Farmer, 120 Lookout Ln, Irmo, SC 29063. (803)732-1909 after 6 pm. NS. NC. W. + diff --git a/data/uscf/sd b/data/uscf/sd new file mode 100644 index 0000000..9df5df0 --- /dev/null +++ b/data/uscf/sd @@ -0,0 +1,5 @@ + +SOUTH DAKOTA + +Feb. 3-4. 1st Joe House Coffee Classic. See Grand Prix. + diff --git a/data/uscf/tn b/data/uscf/tn new file mode 100644 index 0000000..c489fc7 --- /dev/null +++ b/data/uscf/tn @@ -0,0 +1,5 @@ + +TENNESSEE + +January 5-7. 19th Fairfield Glade Open. See Grand Prix. + diff --git a/data/uscf/tx b/data/uscf/tx new file mode 100644 index 0000000..407bed2 --- /dev/null +++ b/data/uscf/tx @@ -0,0 +1,177 @@ + +TEXAS + +Dec. 15, 22, 29 (QC). HCC - Friday Nite Quick. 3 separate events. 4-SS, G/25. +Houston Chess Club, 6640 Harwin, Houston, TX 77036. EF: $15, $7.50 for U20. +Reg. 6:30-7. Rds. 7-8-9-10. LS. NC. W. + +Dec. 16. SACS 3rd Saturday Futurity. 4-SS, G/60. Open to adults under 1600 & +all juniors. San Antonio Chess Studio, 6618 Seidel, San Antonio, TX 78209. EF: +$10, $5 jr. One section. Trophies to top 1/3 overall, top 1/3 juniors. +(Juniors also eligible for overall prizes.) Reg. 9:30 am. Rds. 10-12:30-2:30- +4:30. half-point bye available if notice given with entry. Info: (210)804- +1005. Ent: above. NS. W. + +Dec. 16. HCC - U2000. 4-SS, G/45. Houston Chess Club, 6640 Harwin, Houston, TX +77036. EF: $20, $10 for jrs. Reg. 11:30-12. Rds. 12-1:30-3-4:30. (713)95- +CHESS. LS. NC. W. + +Dec. 16. San Jac Dec. Swiss. 3-SS, G/90. San Jacinto College, Student Center +Bld, 2nd Floor, 8060 Spencer Hwy, Pasadena, TX. EF: $10. $$G: Trophies. Reg. +9:30-10. Rds. 10-1-4. Info: (713)485-1465. NS. NC. W. + +Dec. 16. High School USCF Joiner. Scholastic membership required. 5-SS, G/30. +Dallas Chess Club, 1001 Hampshire Lane, Richardson, TX 75080. Open to grades 9- +12. EF: $10 (included USCF membership fee if non-member). $$ Trophies 1-3 +individual and team. Reg. 9-10. Rd. 1 at 10:15, rest ASAP. Info: (214)234-9002 +or E-mail: dcc@dallaschess.com. NS. NC. W. + +Dec. 16, 23 30. HCC - Saturday Swiss. 3 separate events. 3-SS, G/60. Houston +Chess Club, 6640 Harwin, Houston, TX 77036. EF: $15, $7.50 U20. Reg. 11:30-12. +Rds. 12-2-4. LS. NC. W. + +Dec. 17, 24, 31. HCC - Sunday Swiss. 3 separate events. 4-SS, G/45. Houston +Chess Club, 6640 Harwin, Houston, TX 77036. EF: $15, $7.50 U20. Reg. 11:30-12. +Rds. 12-1:30-3-4:30. LS. NC. W. + +Dec. 19, 26 (QC). HCC - Quick Tuesday & Pizza. 2 separate events. 5-SS, G/15. +Houston Chess Club, 6640 Harwin, Houston, TX 77036. EF: $15, $7.50 for U20. +Reg. 6:30-7. Rds. every 1/2 hour. LS. NC. W. + +Dec. 20, 27. HCC - Wednesday Nite Open. 4-SS, 30/90, G/60. Houston Chess Club, +6640 Harwin, Houston, TX 77036. Masters & Experts: open to above 2000. +Amateur: open to U2000. EF: $30, $15 for U20. Reg. 6:30-7. Rds. 7 pm each Wed. +LS. NC. W. + +Dec. 22, 29. Jan. 5, 12. Chronos G.P. 4 separate events. 4-SS, G/30. Dallas +CC, 1001 Hampshire Ln, Richardson, TX 75080. EF: $10, $5 Jrs./Srs. $5 fee for +non-DCC memb. $$ 65% of EF. Reg. 6:30-6:55 pm. Rd. 1 at 7:10 pm. Rds. 2-4 +ASAP. Bye 1-4 if requested before end of rd 1. The Chronos digital clock is +the preferred clock for this event if either player (White or Black) has one +and wants to use it, the Chronos must be used. Info: (214)234-9002. E-Mail: +lsalinas@iadfw.net. NS. NC. W. + +Dec. 23. HCC - December Scholastics. 5-SS, G/30. Houston Chess Club, 6640 +Harwin, Houston, TX 77036. HS: K-12. MS: K-9. Elem: K-6. All, EF: $10 by +12/17, $15 at site. Trophies to top 5 in each section. Reg. 11:30-12. Rds. 12 +& ASAP thereafter. Ent: above (713)95-CHESS. LS. NC. W. + +Dec. 30-Jan. 1. San Antonio New Year Open. See G.P. Dec. 30. MEC Club +(Ladder) Challenges. 4-6 SS/RR (b/entries), G/1. Morning Glory Civic Center, +3313 E Harrison St., Harlingen, TX 78550. (210)412-4054. 0pen: to all. EF: $10 +if rec'd one week before each tnmt., $15 at site. $$ (50% b/entries): 1s-2nd +trophy & cash each. Reg. 8-10. Rd. 1 at 10:30 am. Top Jr. players who are not +USCF memb. will be memb. by MEC Club. Unrated or 1st time USCF memb. who has +top score receives trophy. Ent: Hanna High School Chess Club, c/o J.J. Garza, +2615 price Rd, Brownsville, TX 78521. (210)831-9789 after 5 pm or call +(210)504-9139 as for Ray. NS. NC. W. Dec. 30 (QC). Houston Open G/10 +Championship. 10-SS, G/10. Houston Chess Club, 6640 Harwin, Houston, TX 77036. +EF: $20, $10 for U20. Free pizzas for players. Reg. 11:30-12. Rds. every 20 +minutes. Ent: above. NC. W. + +Jan. 2, 9, 16, 23, 30. SACS Tues Nite Swiss. 5-SS, 45/90, 30/60. San Antonio +Chess Studio, 6618 Seidel, San Antonio, TX 78209. EF: $20, $10 membs/jr. One +section. $$: 1st 25% of entries, 2nd 12.5%, Top Member 12.5%. Reg. 7 pm, 1/2. +Rds. 7:30 each Tuesday of month. Half-point bye any round if notice given with +entry. Info: (210)804-1005. Ent: above. NS. W. + +Jan. 2, 9, 16, 23, 30 (QC). HCC - Quick Tuesday & Pizza. 5 separate events. 5- +SS, G/15. Houston Chess Club, 6640 Harwin, Houston, TX 77036. EF: $15. Reg. +6:30-7. LS. NC. W. + +Jan. 3-24. HCC - Wednesday Nite Open. 4-SS, 30/90, G/60. Houston Chess Club, +6640 Harwin, Houston, TX 77036. Masters & Experts: open to above 2000. +Amateur: open to U2000. EF: $30, $15 for U20. Reg. 6:30-7. Rds. 7 pm each Wed. +LS. NC. W. + +Jan. 5, 12, 19, 26 (QC). HCC - Friday Nite Quick. 4 separate events. 4-SS, +G/25. Houston Chess Club, 6640 Harwin, Houston, TX 77036. EF: $15, $7.50 for +U20. Reg. 6:30-7. Rds. 7-8-9-10. LS. NC. W. + +Jan. 5, 12, 19, 26. Friendswood Fridays. 4-SS, 40/90, SD/30. Friendswood CC +(at Grace Family Fellowship), 209 S Friendswood Dr., Friendswood, TX 77546. +EF: $12, $10 memb. Reg. 7 pm. Rds. 7:30 each Friday. Info: David Babola +(713)338-5059. + +Jan. 6. SACS 1st Saturday Action (1/2 K). 4-SS, G/30. San Antonio Chess +Studio, 6618 Seidel, San Antonio, TX 78209. EF: $10, $5 jr. One section. $$: +1st 25% of entries, top score lower half 25%. Reg. 12:30 pm. Rds. 1-2:15-3:30- +4:45. Half-point bye any round if notice given with entry. Info: (210)804- +1005. Ent: above. NS. W. Rated at 1/2 K. Jan. 6, 13, 20, 27. HCC - Saturday +Swiss. 4 separate events. 3-SS, G/60. Houston Chess Club, 6640 Harwin, +Houston, TX 77036. EF: $15, $7.50 U20. Reg. 11:30-12. Rds. 12-2-4. LS. NC. W. + +Jan. 6. HCC - U1600. 4-SS, G/45. Houston Chess Club, 6640 Harwin, Houston, TX +77036 (713)95-CHESS. EF: $20, $10 for U20. Chess books for prizes. Reg. 11:30- +12. Rds. 12-1:30-3-4:30. LS. NC. W. + +Jan. 7, 14, 21, 28. HCC - Sunday Swiss. 4 separate events. 4-SS, G/45. Houston +Chess Club, 6640 Harwin, Houston, TX 77036. EF: $15, $7.50 U20. Reg. 11:30-12. +Rds. 12-1:30-3-4:30. LS. NC. W. + +Jan. 13. San Jac Jan. Swiss. 3-SS, G/90. San Jacinto College, Student Center +Bld., 2nd Floor, 8060 Spencer Hwy, Pasadena, TX. EF: $10. $$G: Trophies. Reg. +9:30-10. Rds. 10-1-4. Info: (713)485-1465. NS. NC. W. + +Jan. 13. Klein Winter Scholastic. 4-SS, G/60 to 6-SS, G/30, Champ b/4 over +1600 G/75. Klein High School, 16715 Stuebner-Airline, Spring, TX 77379. 4 +sections: HS, MS, Elem, and Pri of 20-35 players. All, EF: $7 by 1/9, $10 at +site requires half-point bye in rd 1. Trophies. Reg. 8-8:45. Rd. 1 at 9, +others ASAP. Ent: James Liptrap, Klein High School, Spring, TX 77379. (713)251- +2659 eve. NS. NC. W. + +Jan. 13 (QC). HCC - January Quick Championship. 7-SS, G/15. Houston Chess +Club, 6640 Harwin, Houston, TX 77036 (713)95-CHESS. EF: $20, $10 for U20. Reg. +11:30-12. Rds. 12 & ASAP thereafter. LS. NC. W. + +January 14. 5th Annual Southwest Class Championships. See Grand Prix. Jan. +19, 20, 27, Feb. 9. Chronos G.P. 4 separate events. 4-SS, G/30. Dallas CC, +1001 Hampshire Ln, Richardson, TX 75080. EF: $10, $5 Jr./Sr. $5 fee for non- +DCC memb. $$ 65% of EF. Reg. 6:30-6:55 pm. Rd 1 at 7:10 pm. Rds 2-4 ASAP. Bye +1-4 if requested before end of rd 1. The Chronos digital clock is the +preferred clock for this event. If either player (White or Black) has one and +wants to use it, the Chronos must be used. Info: (214)234-9002. E-Mail: +lsalinas@iadfw.net. NS. NC. W. + +Jan. 20. SACS 3rd Saturday Futurity. 4-SS, G/60. San Antonio Chess Studio, +6618 Seidel, SA, TX 78209. Open to adults U1600 & all Jrs. EF: $10/$5 jr. One +section. Trophies to top 1/3 overall, top 1/3 jrs. (Jrs also eligible for +overall prizes). Reg. 9:30. Rds. 10-12:30-2:30-4:30. Half-point bye available +if notice given with entry. Info:(210)804-1005. Ent: above. NS. W. + +Jan. 20. Woodpushers Sudden Death IX. 4-SS, G/35. South Montgomery County +Community Center, 2235 Lake Robbins Dr., The Woodlands, TX. EF: $15, $10 +membs, $5 less jrs. $$ 50 1st, A,B $30 each, C,D/E/Unr trophies each. Limit +one prize per player. NS. NC. W. + +Jan. 20. 1996 Tip-O-Tex Winter Scholastic Chess Tournament. 6-SS, G/30. +Russell Elem School Cafeteria, 800 Lakeside Blvd, Brownsville TX 78520. HS: +grades 9-12. MS: grades 6-8. Elem: grades K-6. All, EF: $10 by 1/18, $15 at +site. Class prizes in all sections. 69 trophies. Also trophies to top 5 teams +in each section. Food & drink for sale at site. Reg. 8-10. Rd 1 at 10:30, all +succeeding rds paired as soon as previous rd ends. Ent: above. (210)548-8960, +eve. (210)541-1682. NS. NC. W. + +January 20-22. 16th Annual A.C.E. Open Club Championship. See Grand Prix. +Jan. 27. Fortworth Classic. 5-SS, G/30. Haltom City Public Library, 3201 +Friendly Ln, Haltom City, TX 76117, Use side entrance. Limited to 50 players. +One section. EF: $12.50 by 1/23, $15 at site. $$ (80% return per class): +Prizes M/X, A,B,C, D/E/Unr 1st-2nd-3rd each class. Reg. 9-9:45. Rds. 10-11:10- +12:40-1:50-2:55. Ent: Fortworth Chess, 1612 S Timber Ct, Benbrook, TX 76126 +(817)249-2884 after 7 pm. NS. NC. W. + +February 2-4. 5th Annual Southwest Class Championship. See Grand Prix. + +Feb. 3. SACS 1st Saturday Action. 1/2 K, 4-SS, G/30. San Antonio Chess Studio, +6618 Seidel, SA, TX 78209. EF: $10/$5 jr. One section. $$ 1st 25% of entries, +Top score lower half 25%. Reg. 12:30 pm. Rds. 1-2:15-3:30-4:45. Half-point bye +any rd if notice given with entry. Info: (210)804-1005. Ent: above. NS. W. +Rated at 1/2 K. Feb. 6, 13, 20, 27. SACS Tues Nite Swiss. 4-SS, 45/90, 30/60. +San Antonio Chess Studio, 6618 Seidel, SA, TX 78209. EF: $20 membs, $10 jr. +One section. $$: 1st 25% of entries, 2nd 12.5%, Top Member 12.5%. Reg. 7 pm +2/6. Rds. 7:30 pm each Tues of month. Half-point bye any rd if notice given +with entry. Info: (210)804-1005. Ent: above. NS. W. Feb. 10. Bar-Jona Open. 4- +SS, G/45. East Waco Community Center, 409 Turner St. EF: $5. $$ 50. Reg. 9- +9:45. Rds. 10-11:45, 12-1:30,1:45-3:15,3:30-5. Info: Michael Walton (817)757- +3148 or (817)799-2185. + diff --git a/data/uscf/ut b/data/uscf/ut new file mode 100644 index 0000000..b0a6037 --- /dev/null +++ b/data/uscf/ut @@ -0,0 +1,12 @@ + +UTAH + +Jan. 6 (QC). Ogden Quick Chess. 6-SS, G/29. Newgate Mall Community Room, 36th +Wall Ave., Ogden, UT 84404. EF: $10 if rec'd by 12/30, $12 at site. $$ (200 +b/25): 100-50, A,B,C,D,Unr. each $10. Reg. 9-10. Rds. 10:15-11:30-12:45-2:30- +3:45-5. Ent: Paul LaCourse, 4445 S. 1950 W. #23, Roy, UT 84067 (801)731-3672. +NS. NC. Feb. 3. Ogden Open. 4-SS, G/60. Newgate Mall community room, 36th +Wall Ave, Ogden, UT 84404. EF: $10 by 11/25, $12 at site. $$ (200 b/25): 100- +50, A,B,C,D,Unr each $10. Reg. 9-10. Rds. 10:15-12:30-3-5:15. Ent: Paul +LaCourse, 4445 S 1950 W #23, Roy, UT 84067. (801)731-3672. NS. NC. + diff --git a/data/uscf/va b/data/uscf/va new file mode 100644 index 0000000..54334fa --- /dev/null +++ b/data/uscf/va @@ -0,0 +1,18 @@ + +VIRGINIA + +Jan. 14. Giles Scholastic Swiss. 5-SS, G/45 rds 1-4, G/60 rd 5. Macy +McClaugherty School, Pearisburg, VA. 4 sections. Unrated: Beginners (K-3) no +teams. Rated: Primary (K-3), Elementary (K-7), Open Scholastic (K-12). Team +Rules: The team score is the total of the four best scores of players from the +same school. A school must have at least three players to be eligible for a +team prize. All, EF: $10 by 1/11, $15 at site (8-9 am only). Fax or mail your +registration and pay your Pre-Registration Fees at the tournament. Trophies: +top 10 individual all sections, top 5 teams all sections (no teams in Beginner +section), top score U800, U1000, U1200 all sections. Reg. 9-9:30 am. Rds. 10- +11:45-1:30-3:15-5 or ASAP. USCF memb req'd $7. Info: (703)921-4345. FAX +(703)921-4457. Giles Co. Scholastic Chess, c/o Pam Olson, 219 S Buchanan St., +Pearisburg, VA 24134. + +January 19-21. 1996 Virginia Open. See Grand Prix. + diff --git a/data/uscf/vt b/data/uscf/vt new file mode 100644 index 0000000..ceed1bb --- /dev/null +++ b/data/uscf/vt @@ -0,0 +1,18 @@ +VERMONT + +November 3-5. 3nd Annual Green Mountain Open & Vermont Championship. See Grand +Prix. + +Nov. 4 or 5. Vermont Novice Scholastics. 4-SS, G/30. Stratton Mountain Inn, +(see Green Mountain Open, 11/3-5, for address, rates). In 4 sections: +Elementary (K-6) & Primary (K-3) Nov. 4, HS (K-12) & JHS (K- 9) Nov. 5. Open +to all under 1200 or unr; not limited to VT players. EF: $13 postmarked by +10/26, $15 at tmt. (includes USCF dues if non-member). Free entry to +scholastic if playing in Green Mountain Open (Elem/Prim should take .5-point +bye in GMO rd 2, HS/JHS in GMO rd 4). Prizes each section: Trophies to top 5 +players, 1st unrated, top 2 teams of 3. Special prizes: Players scoring at +least 2 pts in Elementary or Primary win free entry in JHS; trophies to top 2 +K-6 students in JHS. Elementary & Primary late reg. 1- 1:30 pm 11/4; rds. 2-3- +4-5. HS & JHS late reg. 9-9:30 am 11/5; rds. 10-11-12-1:30. Ent: Continental +Chess, PO Box 249, Salisbury Mills, NY 12577. + diff --git a/data/uscf/wa b/data/uscf/wa new file mode 100644 index 0000000..fb98510 --- /dev/null +++ b/data/uscf/wa @@ -0,0 +1,13 @@ + +WASHINGTON + +Dec. 16-17. Washington Challenger's Cup. Taste 'N' Time Coffee Shop, 3617 +Bridgeport Way W, Tacoma, WA. 2 sections: Open: 4-SS, 40/2, SD/60. $$ 100 + +trophy, 2nd $80 + trophy, U2000 $80 + trophy. Rds. 10-4, 11-4 or ASAP. +Washington resident with the highest score will be seeded into the 1996 State +Championship. No half-point byes. Reserve: open to U1800. 5-SS, 40/90, SD/60. +$$ 100 + trophy, 2nd $80, U1600 $80 + trophy, U1400 $80 + trophy. Rds. 10-2:30- +7, 11-4 or ASAP. Both, 12/16 Reg. 9-9:45. Half-point byes rds 1-4. WCF/USCF +memb req'd. Ent: Gary J Dorfner, 8423 E B St., Tacoma, WA 98445. (206)535- +2536. NS. NC. January 12-14. Seattle City Championship. See G.P. + diff --git a/data/uscf/wi b/data/uscf/wi new file mode 100644 index 0000000..7425fc8 --- /dev/null +++ b/data/uscf/wi @@ -0,0 +1,26 @@ + +WISCONSIN + +Dec. 16-17. Herman Schramm Memorial. 5-SS, 50/2 then 25/1. Gruenhagen +Conference Center, UW-Oshkosh, corner of High and Osceola, Oshkosh, WI 54901. +(414)424-1106. EF: $20 if rcv'd by 12/11, $3 more at site. USCF Juniors may +deduct $6. $$ (500 unconditionally guaranteed): 125-75, A $70, B $60, C $50, +D/E $40, 1st Unr. $25, 1st Jr. $20, Upset $35. Reg. 8:45-9:30. Rds. 10-2:30- +7:30, 10-3. HR: $15 sgl, $24 dbl. (mention chess). Ent: Chris Krumenauer, 1729 +Buehring Rd, Oshkosh, WI 54904. Cks payable to WCA. WCA membership included in +entry fee rebated upon proof of membership. NS. NC. W. + +Jan. 6-7. 1996 WIS Amateur Open/Arver Memorial. 5-SS, 40/100, 30/60. +Restricted to U2000 or unrated. Travelers Inn, 1325 S Main (Hiway 41 at 175), +Fond du Lac, WI 54935. (414)923-0223. EF: $20 ($13 for U18 or HS students) if +by 1/1/96. Both $5 more if later or by phone. $$ (1000 b/90 with 5 per class): +200-150-100, best 1800 $85, 1700, 1600 $80 ea., 1500 $75, 1400 $70, 1300 $60, +U1300, Unrated $50 ea. Trophies to: 1st, 1200, 1100, 1000, U1000, and Unrated +(6 total). Reg. 9-9:30. Rds. 10-2:45-7:30, 10-3. One half-point bye available +Rds 1-4. Secondary T/L for Rd 4 only is SD/1. HR: $38 sgl, $45 dbl. Call early +as only 35 rooms are 'blocked' for our group! Make checks payable to NEWCA. +Ent: WIS Amateur/Arver, Mike Selig-TD, 720-C Westhaven Place, Appleton, WI +54914-4469. (414)739-7550. LS. NC. W. + +January 27-28. UW. Winter Open. See Grand Prix. + diff --git a/data/uscf/wv b/data/uscf/wv new file mode 100644 index 0000000..b5dc2ad --- /dev/null +++ b/data/uscf/wv @@ -0,0 +1,10 @@ + +WEST VIRGINIA + +Jan. 20. Cross Lanes Open. 4-SS, G/80. Lake Chaweva Clubhouse, 5101 W +Washington St., Cross Lanes, WV 25313. EF: $18, $9 U18, $3 off Charleston CC +membs. Prizes per entries. Reg. 9-9:45. Rds. 10-1-4-7. Ent: Donald W. +Griffith, 2718 Lakeview Dr., St. Albans, WV 25177. (304)727-5009. NS. NC. W. + +February 9-11. 4th annual Atlantic Chess Championships. See Grand Prix. + diff --git a/data/uscf/wy b/data/uscf/wy new file mode 100644 index 0000000..7738560 --- /dev/null +++ b/data/uscf/wy @@ -0,0 +1,4 @@ +WYOMING + +November 4-5. Warren Air Force Base Open. See G.P. + diff --git a/games/adjourned/a b/games/adjourned/a new file mode 120000 index 0000000..82f488f --- /dev/null +++ b/games/adjourned/a @@ -0,0 +1 @@ +../a \ No newline at end of file diff --git a/games/adjourned/b b/games/adjourned/b new file mode 120000 index 0000000..42532fe --- /dev/null +++ b/games/adjourned/b @@ -0,0 +1 @@ +../b \ No newline at end of file diff --git a/games/adjourned/c b/games/adjourned/c new file mode 120000 index 0000000..1b271d8 --- /dev/null +++ b/games/adjourned/c @@ -0,0 +1 @@ +../c \ No newline at end of file diff --git a/games/adjourned/d b/games/adjourned/d new file mode 120000 index 0000000..991c0b7 --- /dev/null +++ b/games/adjourned/d @@ -0,0 +1 @@ +../d \ No newline at end of file diff --git a/games/adjourned/e b/games/adjourned/e new file mode 120000 index 0000000..3652ac0 --- /dev/null +++ b/games/adjourned/e @@ -0,0 +1 @@ +../e \ No newline at end of file diff --git a/games/adjourned/f b/games/adjourned/f new file mode 120000 index 0000000..a727136 --- /dev/null +++ b/games/adjourned/f @@ -0,0 +1 @@ +../f \ No newline at end of file diff --git a/games/adjourned/g b/games/adjourned/g new file mode 120000 index 0000000..24387a6 --- /dev/null +++ b/games/adjourned/g @@ -0,0 +1 @@ +../g \ No newline at end of file diff --git a/games/adjourned/h b/games/adjourned/h new file mode 120000 index 0000000..70aca9e --- /dev/null +++ b/games/adjourned/h @@ -0,0 +1 @@ +../h \ No newline at end of file diff --git a/games/adjourned/i b/games/adjourned/i new file mode 120000 index 0000000..f39c11f --- /dev/null +++ b/games/adjourned/i @@ -0,0 +1 @@ +../i \ No newline at end of file diff --git a/games/adjourned/j b/games/adjourned/j new file mode 120000 index 0000000..5f98fe9 --- /dev/null +++ b/games/adjourned/j @@ -0,0 +1 @@ +../j \ No newline at end of file diff --git a/games/adjourned/k b/games/adjourned/k new file mode 120000 index 0000000..c4d8682 --- /dev/null +++ b/games/adjourned/k @@ -0,0 +1 @@ +../k \ No newline at end of file diff --git a/games/adjourned/l b/games/adjourned/l new file mode 120000 index 0000000..fa00f58 --- /dev/null +++ b/games/adjourned/l @@ -0,0 +1 @@ +../l \ No newline at end of file diff --git a/games/adjourned/m b/games/adjourned/m new file mode 120000 index 0000000..1af297f --- /dev/null +++ b/games/adjourned/m @@ -0,0 +1 @@ +../m \ No newline at end of file diff --git a/games/adjourned/n b/games/adjourned/n new file mode 120000 index 0000000..65af0ab --- /dev/null +++ b/games/adjourned/n @@ -0,0 +1 @@ +../n \ No newline at end of file diff --git a/games/adjourned/o b/games/adjourned/o new file mode 120000 index 0000000..b0e41ac --- /dev/null +++ b/games/adjourned/o @@ -0,0 +1 @@ +../o \ No newline at end of file diff --git a/games/adjourned/p b/games/adjourned/p new file mode 120000 index 0000000..9ebf291 --- /dev/null +++ b/games/adjourned/p @@ -0,0 +1 @@ +../p \ No newline at end of file diff --git a/games/adjourned/q b/games/adjourned/q new file mode 120000 index 0000000..b069682 --- /dev/null +++ b/games/adjourned/q @@ -0,0 +1 @@ +../q \ No newline at end of file diff --git a/games/adjourned/r b/games/adjourned/r new file mode 120000 index 0000000..dd1bd21 --- /dev/null +++ b/games/adjourned/r @@ -0,0 +1 @@ +../r \ No newline at end of file diff --git a/games/adjourned/s b/games/adjourned/s new file mode 120000 index 0000000..2df8d64 --- /dev/null +++ b/games/adjourned/s @@ -0,0 +1 @@ +../s \ No newline at end of file diff --git a/games/adjourned/t b/games/adjourned/t new file mode 120000 index 0000000..f2b48ce --- /dev/null +++ b/games/adjourned/t @@ -0,0 +1 @@ +../t \ No newline at end of file diff --git a/games/adjourned/u b/games/adjourned/u new file mode 120000 index 0000000..0bceb44 --- /dev/null +++ b/games/adjourned/u @@ -0,0 +1 @@ +../u \ No newline at end of file diff --git a/games/adjourned/v b/games/adjourned/v new file mode 120000 index 0000000..54379ce --- /dev/null +++ b/games/adjourned/v @@ -0,0 +1 @@ +../v \ No newline at end of file diff --git a/games/adjourned/w b/games/adjourned/w new file mode 120000 index 0000000..fc98f1c --- /dev/null +++ b/games/adjourned/w @@ -0,0 +1 @@ +../w \ No newline at end of file diff --git a/games/adjourned/x b/games/adjourned/x new file mode 120000 index 0000000..eda76f7 --- /dev/null +++ b/games/adjourned/x @@ -0,0 +1 @@ +../x \ No newline at end of file diff --git a/games/adjourned/y b/games/adjourned/y new file mode 120000 index 0000000..ef70f85 --- /dev/null +++ b/games/adjourned/y @@ -0,0 +1 @@ +../y \ No newline at end of file diff --git a/games/adjourned/z b/games/adjourned/z new file mode 120000 index 0000000..1856dae --- /dev/null +++ b/games/adjourned/z @@ -0,0 +1 @@ +../z \ No newline at end of file diff --git a/players/a/adminguy b/players/a/adminguy new file mode 100755 index 0000000..48ea9f6 --- /dev/null +++ b/players/a/adminguy @@ -0,0 +1,65 @@ +Name: AdminGuy +Fullname: I am admin, hear me roar... +Password: +Email: AdminGuy@this.place.net +S_NUM: 0 +S_WIN: 0 +S_LOSS: 0 +S_DRAW: 0 +S_RATING: 0 +S_STERR: 3500 +S_LTIME: 0 +S_BEST: 0 +S_WBEST: 0 +B_NUM: 0 +B_WIN: 0 +B_LOSS: 0 +B_DRAW: 0 +B_RATING: 0 +B_STERR: 3500 +B_LTIME: 0 +B_BEST: 0 +B_WBEST: 0 +W_NUM: 0 +W_WIN: 0 +W_LOSS: 0 +W_DRAW: 0 +W_RATING: 0 +W_STERR: 3500 +W_LTIME: 0 +W_BEST: 0 +W_WBEST: 0 +Network: 0 +LastHost: 0 +Open: 1 +Rated: 1 +Ropen: 1 +Bell: 0 +Notifiedby: 0 +I_Login: 0 +I_Game: 0 +I_Shout: 1 +I_CShout: 1 +I_Tell: 1 +I_Kibitz: 1 +Private: 0 +Automail: 0 +Style: 0 +D_Time: 2 +D_Inc: 12 +D_Height: 24 +D_Width: 79 +Admin_level: 100 +I_Admin: 0 +White_Games: 0 +Black_Games: 0 +USCF: 0 +Muzzled: 0 +CMuzzled: 0 +Highlight: 0 +Num_Comments: 0 +Num_plan: 0 +Num_formula: 0 +Num_censor: 0 +Num_notify: 0 +Num_alias: 0 diff --git a/scripts/fics_autorun b/scripts/fics_autorun new file mode 100755 index 0000000..fb77fef --- /dev/null +++ b/scripts/fics_autorun @@ -0,0 +1,14 @@ +#!/bin/csh +limit stacksize unlimited +while (1) + ps aux | grep "fics -p 5000" | grep -v grep >! fics.pid + if (-z fics.pid ) then +# echo "doing mv stuff and running fics" + cat console.txt >>! console.old + rm console.txt + fics -p 5000 >>&! console.txt + endif +# echo "sleeping..." + sleep 10 +end + -- cgit v1.2.3