diff options
author | rgrimes <rgrimes@FreeBSD.org> | 1993-06-12 14:49:13 +0000 |
---|---|---|
committer | rgrimes <rgrimes@FreeBSD.org> | 1993-06-12 14:49:13 +0000 |
commit | f078b88a160c467761b3f3641f05dfd0aa3f7753 (patch) | |
tree | 1f058a53dd274694716ec00c288d27223606ee45 /gnu/games/chess | |
download | FreeBSD-src-f078b88a160c467761b3f3641f05dfd0aa3f7753.zip FreeBSD-src-f078b88a160c467761b3f3641f05dfd0aa3f7753.tar.gz |
Initial import, 0.1 + pk 0.2.4-B1
Diffstat (limited to 'gnu/games/chess')
78 files changed, 21660 insertions, 0 deletions
diff --git a/gnu/games/chess/DOCUMENTATION/ARTICLE b/gnu/games/chess/DOCUMENTATION/ARTICLE new file mode 100644 index 0000000..b2ab331 --- /dev/null +++ b/gnu/games/chess/DOCUMENTATION/ARTICLE @@ -0,0 +1,66 @@ +[This article was reproduced from a GNU Bulletin.] + + GNU Chess + by Stuart Cracraft + copyright 1987 Stuart Cracraft + + + GNU Chess is a communal chess program. Contributors donate their +time and effort in order to make it a stronger, better, sleeker program. +Contributions take many forms: interfaces to high-resolution displays, +opening book treatises, speedups of the underlying algorithms, additions +of extra heuristics. These contributions are then distributed to the +large user-base so that all may enjoy the fruits of our labor. The +original and continuing purpose of this project is to permanently end +the rampant hoarding of computer chess software that has been the +case for the past 20 years. + + Many people have contributed to GNU Chess. Their contributions have +improved the program from being a patzer (weak program) to being a +grandpatzer (decently strong program). In its growth since initial +release, GNU Chess has gone from approximately class D to expert +strength. It beats the Fidelity Excel commercial unit rather handily. + + GNU Chess's structure is a hybrid of the Shannon Type-A and +Type-B methods. It conducts a full-width search to a fixed-depth +and then continues with a quiescence search for many more ply. +This quiescence search helps the program find positions which +can be safely evaluated and which are not too turbulent. If +a terminal position is too turbulent, the evaluation will be +highly inaccurate. Additional searching by investigating series +of captures, checks, and other potentially imbalance-producing +moves is quite helpful. + + GNU Chess will sacrifice pieces in order to reach known winning +endings. Also, it uses a trade-down bonus to encourage the stronger +side to trade off certain types of pieces thus reaching a more +simplified and therefore ostensibly "clearer" position. + + GNU Chess has certain types of knowledge regarding easier endgames. +This allows it to play these endings somewhat better than might be +expected. + + GNU Chess has time heuristics that it uses to improve its handling +of time-controls and hasten its making of "obvious" moves. + + GNU Chess is interfaced to the SUN Windows and X Windows +display protocols and can display its pieces in elaborate format, +similar to chess diagrams. + + GNU Chess has an opening book which consists of many variations +from MCO (Modern Chess Openings). + + For comparison purposes, GNU Chess running on a VAX 8650 is +stronger than the famous Chess 4.5 running on a CDC 6400. + + We wish to acknowledge the contributions of the following +individuals: (in alphabetical order) Jim Aspnes, Wayne Christopher, +Steve Dougherty, David Goldberg, Richard Greenblatt, David Kittinger, +Richard Stallman, John Stanback, and Ken Thompson. + + Contact information: The author may be reached by a variety of +methods. Via U.S. mail: Stuart Cracraft, 5 Via Amistosa, Suite G, +Rancho Santa Margarita, Ca. 92688 USA. + By Internet: 'cracraft at wheaties.ai.mit.edu' +The author may also be contacted via the Free Software Foundation, Inc. +675 Massachusetts Ave.,Cambridge MA 02139. diff --git a/gnu/games/chess/DOCUMENTATION/ARTICLE.2 b/gnu/games/chess/DOCUMENTATION/ARTICLE.2 new file mode 100644 index 0000000..031ae18 --- /dev/null +++ b/gnu/games/chess/DOCUMENTATION/ARTICLE.2 @@ -0,0 +1,123 @@ + + + GNU Chess: Experiences Learned + with Communal Sharing + by Stuart Cracraft + (and contributors to the GNU Project) + + +Limited sharing has characterized the computer chess community +for the past two decades. Occasional research articles give hints +and suggestions for useful features, but rarely reveal the real +details of the critically important advances. We will here +describe an effort underway (titled "GNU Chess") to create a more +open and friendly environment of sharing. + +GNU Chess is part of Project GNU, a large-scale effort in which +the philosophical goals are far-reaching. We will not go into any +great depth about these goals as they relate to the larger pro- +ject, because these are described elsewhere [1]. However, we will +mention the basic issues and the changes we hope to encourage. + +The start of the GNU Chess project was a natural result of the +experiences gleaned in writing a chess program. While the author +was at a progressive academic location [2], he was able to con- +ceive the idea of a communal chess program only after much heart- +ache. During the period of writing the initial version (which +has since undergone many improvements and whole revisions), it +became clear that the best features and most useful hints, the +very best of the heuristics, were hidden and difficult to find in +the literature. + +Sprinkled across many books, research papers, magazine articles, +accumulated in the community, during the past 25 years, there was +literally a void of true, empirical programs. Locating usable +programs was difficult. Many programs were the result of academic +work in "ivory towers", and hence were inaccessible to the common +man. Other programs were sequestered in research think-tanks. Na- +turally, developers of commercial programs carefully guarded +their source in order to protect their investment. On the other +hand, a few chess program source listings had actually been pub- +lished, but these were not really very strong, often written in a +non-general language, and frequently more pedantic than practi- +cal. + +The idea of a reasonably strong communal program solidified. +When we refer to a communal program, we do not regard this as +public-domain software. Rather, we refer to a program which is +under the shared authority of a number of individuals, the prin- +cipal contributors. These individuals have experienced and real- +ized the positive results of a sharing community and the rapid +improvements that come through contributing in such a community. +Further, these individuals devote time and energy to coordinating +the contributions of other individuals. While they exercise a +certain editorial right, this is usually not exercised arbitrari- +ly; instead, a discussion is often undertaken. + +Eventually, a working C program that played chess was available. +The coordinating institution for Project GNU [3], accepted our +suggestion of inclusion of a chess program in the GNU distribu- +tion. Initial distribution of GNU Chess commenced in October of +1986. Interest in the project increased rapidly. + +Contributions came in from many places and people. Interfaces to +X-windows and SUN-windows were donated, thus allowing very fancy +chess fonts on bit-mapped screens. Also, contributions involving +large portions of opening books such as MCO and collections of +master games were added to the distribution. Additionally, +tree-search modifications and heuristics were provided, and occa- +sionally even entire rewrites. + +The program advanced in strength by several USCF class intervals +during a period of less than one year. During this time, many +unusual features and enhancements were added to the program, usu- +ally under the coordination of two or more people, with one work- +ing in a distant-advisory capacity to the other. Frequently, gra- +duate students would give up significant time from their thesis +work to devote energy to contributing. Their corporate counter- +parts would often give up project time to make their donation. + +Contributors would often enter the project in a very forceful way +and then having made their contribution, learn the viability of +communal sharing once others had stepped in and contributed to +them, thus providing considerable reinforcement. Frequently, con- +tributors would then go into "hibernation" for a long period of +time, but most of them remained open to contributing and were +helpful when asked to reprogram their particular contribution in +a more recent version. + +GNU Chess has made great strides in relatively little time. It +has run on many different hardware architectures and has been +compiled by a number of C compilers [4]. A sampling of the com- +puters on which the program has run is: National 32032, Vax +11/750, 8550, 8600, 8650, Motorola 68020, CCI 5/32, CCI 6/32 +(tahoe), Cray XMP. + +It is our belief that GNU Chess will stimulate graduate research +in computer chess theory and practice. When students are able to +easily obtain a state-of-the-art program in order to test out +their ideas, they will no longer need to reinvent the wheel. The +students will be able to investigate their research areas much +more thoroughly, because they will spend more time on the specif- +ic research areas they are concerned about. Basically, GNU Chess +"frees up" time in order to get on to more fundamental issues. + +We also feel that as other researchers gain trust in the GNU +Chess project, they will be more likely to release their results +directly and rapidly, through journal articles, or directly to +the GNU project, and in fact become contributors and join the +present list [5]. At the very least, a communal, ever-growing +program will encourage the few "closeted" researchers to be some- +what more open in their approach to disseminating advances. + +In whatever form it takes, the progress toward elaboration of +machine chess is ongoing, and we hope that GNU chess will be +helpful to the community. Copies of GNU Chess source and "book", +as well as additional experimental code are available from the +Free Software Foundation [3] or the author [6]. + + +[1] The GNU Manifesto, Richard Stallman, Free Software Foundation, Inc. + +[2] University of Southern California, Information Sciences Institute. + diff --git a/gnu/games/chess/DOCUMENTATION/CHANGES b/gnu/games/chess/DOCUMENTATION/CHANGES new file mode 100644 index 0000000..9866075 --- /dev/null +++ b/gnu/games/chess/DOCUMENTATION/CHANGES @@ -0,0 +1,362 @@ + GNU CHESS HISTORY + (#include "../version.h") + +August 1, 1989 -- Jay Scott +He proofread the opening book and made +corrections. + +June 21, 1989 -- Hes @log-se.sv +He contributed new move generation routines (move.c move.h) to speedup +move generation and the overall program, by about 15-30% + +June 9, 1989 -- Tim Radzy (unet!nplab4!radz@ames.arc.nasa.gov) +He fixed a bug in xchess/board.c. In a post-game new-game situation, +castling wouldn't be permitted under circumstances. Tim made +it possible to castle again. + +May 12, 1989 -- Joe Garbarini (garbarini%kegger@circus.llnl.gov) +Recommended changes to documentation vis a vis chesstool usage. + +May 5, 1989 -- Jouko Holopainen (jhol@tolsun.oulu.fi) +Wrote code to support underpromotion. +Changed interface to accept ECO/Informator style moves. + +April 30, 1989 -- Various GNU contributors +setlinebuf() modification for xchess/chesstool. +check for zero division in time printout. + +January 17, 1989 -- Anders Thulin +Provided extensive addition to the opening book for his +favorite opening the Vienna Game. This was drawn from ECO. + +November 23, 1988 -- Stuart Cracraft +Installed new version of Xchess that is better debugged, works on +the next version of X. Thanks to Wayne Christopher and Arturo Perez. + +August 28, 1988 -- Stuart Cracraft +Removed a sacrifice line from the Giuoco Piano entry in the opening +book; the program didn't seem to like the positions it got from this line. + +December 30, 1987 -- John Stanback +Wrote a short blurb on the heuristics contained in GNU Chess. It resides +in the subdirectory DOCUMENTATION as the file HEURISTICS. + +December 17, 1987 -- John Stanback +Modified criteria for positional evaluation in quiescence search +to include positions in which the estimated score lies within +the alpha-beta window; fixed a bug in the king proximity to pawns heuristic; +fixed a bug involving passed pawn heuristics; + +December 16, 1987 -- Stuart Cracraft +Added automatic 'list' upon exit (both in display, non-display, and +chesstool mode); command-line setting of tournament time controls +bug fixed. + +December 14, 1987 -- John Stanback +GNU defeated the commercial product 'Fidelity Excellence' 5.5-4.5 in +a 10-game match. It was running at about 500 nodes per second (typical +of its speed on a VAX 8650) and this would indicate its strength +would be about USCF 1875-1900. + +December 4, 1987 -- John Stanback +Man page added. Command line arguments now specify regular clock +settings if so desired (useful for SUN players). Thinking +on opponent's time is now disabled by default. Estimated +rating is 1850 at 500 nodes per second. + +October 20, 1987 -- Stuart Cracraft +Fixed GNU/SUN interaction. Chesstool and its features now +seem to fully work. + +October 5, 1987 -- Ken Thompson +GNU beat Belle (actually drew due to a bug, but +Ken kept GNU playing through to the win) while +running on a Cray XMP-48. In this 3-1 time handicap game +Belle outsearched Cray GNU by 10-1 (even with the handicap). + +September 26, 1987 -- John Stanback at HP +Hash table functioning. Thinking on opponent's +time functioning. + +August 20, 1987 -- Mike Meyer at Berkeley +Mike ran GNU Chess on a Cray 1 supercomputer. +The system was very heavily loaded, so the +program was not as speedy as with the Cray below. + +August 16, 1987 -- David Goldberg at SUN +He added "chesstool" support so that this +version of GNU Chess can run under the +display manager "chesstool". + +August 15, 1987 -- John Stanback at HP +Hash tables, more heuristics, a modified +search which is more efficient. He also +discovered a bug in the piece-exchanger. This +would cause the program to exchange pieces suboptimally. +With this fix, the program should play much +more strongly. + +August 13, 1987 -- Ken Thompson at Bell Labs +Ken ran GNU Chess on a Cray XMP supercomputer + (among other processors). The program got + about 3000-4000 chess positions per second + which is comprable to today's fastest bit-slice + commercial machines. Also, he had GNU Chess + play two games against Belle. + +July 19, 1987 -- Jay Scott & John Stanback + Many positional heuristics have been added. + +July 18, 1987 -- Stuart Cracraft + Improvements have been made to the opening + book. It is mostly an MCO book, containing + major variations from many of the major openings + and particularly in-depth on Sicilian. + +May 11, 1987 -- John Stanback at HP + He donated his chess program, a fairly mature + and strong program. + +May 1, 1987 -- Stuart Cracraft + He added several bug fixes various people + had reported. He also changed makemove() so that + the calling syntax is makemove(movelist,index,board) + rather than makemove(move,board). Having the latter + tickled a bug in at least one manufacturer's C-compiler, + so rather than write fancy code, we simplified it. + +April 25, 1987-- Jim Aspnes at MIT +He added all sorts of useful capabilities, +including positional evaluation in the tree +search using a table-driven algorithm, +modifying transposition table code in order +to work properly, though it doesn't improve +speed too much, checkmates/stalemates detected +in the search, en passant captures allowed, +detect repeated positions, iterative deepening, +quicker quiescence search, tournament time controls, +sqattacked sped up by a factor of 4, compile-time +debugging options. + +January 2, 1987 -- Stuart Cracraft + He added a few more Tal games to the collection. + +January 2, 1987 -- Jim Aspnes at MIT + He contributed MCO variations for the Catalan, + Queen's Indian, and Reti openings. + +December 29, 1986 -- Jim Aspnes at MIT + He contributed all MCO variations of the Najdorf + to the opening book. He also contributed a LISP + macro (written in GNU Emacs Lisp) to convert + xchess game formats to GNU Chess opening book + format. + +December 14, 1986 -- Ken Thompson at Bell Labs + He contributed almost 200 games by Tal to + our collection of Tal-games, bringing the + total number of Tal positions in the book + to 10,692. Total book positions now 13,207. + These reside in bookin, bookin.bdg, bookin.tal. + Note that presently, only bookin and bookin.tal + can be used. The new Tal positions came in a + slightly different format, which we have chosen + to adopt as our standard format. All book + games in bookin and bookin.bdg will gradually + change into the new standard format. + +December 11, 1986 -- Stuart Cracraft + Added "averages" for node-count per move, + cpu per move, rate per move to list_history + and write_history. + New version of Xchess installed. + Started typing in Tal games into "bookin.tal". + Added "total book positions" printout to "book" + and "enter" statistics printout. + +December 10, 1986 -- Stuart Cracraft + Implemented aspiration search in normal + alpha-beta search. Speedups of 3% to 40% + have been noticed in most positions. + Occasionally a slower search will result, + but it is thought these are worth the + usual speedups. + +December 9, 1986 -- Stuart Cracraft + Fixed minor bug in write_history() + Added another Tal game, 2nd game of 1st world + championship match with Botvinnik, a Benoni. + +December 9, 1986 -- Stuart Cracraft + Enhanced parallelism. All parallel processors + now communicate via a shared data file and + are kept running (in idle loops watching the + shared data file). This saves us a few seconds + on each move since the 'rsh' need not be invoked + more than once (at the beginning). Since the + shared data file is now implemented, we will + next work towards a "parallel anarchy" in which + any processor can use any other processor in + order to reduce its search. The current scheme + with the program being only as fast as its slowest + processor, is quite inefficient. + +December 1, 1986 -- Jim Aspnes at MIT + Added a couple of Master games from + Modern Chess Openings 12 (a Fischer game, + and a Matanovic game). + +November 30, 1986 -- Stuart Cracraft + Added parallelism. Can now handle multiple + processors (sharing same disk). Later we will + add the capability to use processors not sharing + the same disk. Modified README and MAN-PAGE. + +November 26, 1986 -- Stuart Cracraft + Fixed a few bugs in book-mailing mechanism. + Fixed a bug regarding situations where only + one move is available. + Fixed a bug in read_history() that caused + Black queenside castles to be mishandled. + +November 25, 1986 -- Stuart Cracraft + Added two pawn heuristics. Reward pawns moving into + a phalanx of pawns. A phalanx is two or more + horizontally-connected pawns. Likewise, penalize + pawns leaving a phalanx of pawns. The penalty for + leaving is a little more than the reward for + entering. + +November 24, 1986 -- Stuart Cracraft + A user reported an unbelievable bug. Investigation + of this bug led to the discovery that GNU Chess was + not picking the move judged best by the tree search + in all cases. This resulted in the bug showing + itself which further showed that the program was + selecting an inferior move. This may result in an + improvement to the program's play. + +November 24, 1986 -- Stuart Cracraft + Added two heuristics. Penalize king moves if + the king hasn't castled yet. Also, penalize pawn + moves which produce doubled pawns. Should + probably have something for isolated pawns + too. + +November 23, 1986 -- Wayne Christopher at Berkeley + New version of X chess display front-end. + Fixed bugs include multiple pieces, runs + on SUNS & Bobcats, loads saved games. + +November 23, 1986 -- Stuart Cracraft + Cleaned up some minor bugs regarding history. + Added "Illegal command" error message at Wayne's + request. + +November 22, 1986 -- David Goldberg at SUN Microsystems + He complained that GNU Chess was memory-hungry. + A few minor modifications to hash.c reduced + uninitialized data space 87% and text space + 12%. This should make it easier for GNU Chess + to run on small computers. + +November 22, 1986 -- Stuart Cracraft + "read" command was working, but needed + additional tweaking so that history + array would be printed by list_history(). + +November 19, 1986 -- Stuart Cracraft + Added "read" command which reads a history + file (game listing) and restores the board + to as if the person was still playing that. + particular game. Generally cleaned up + history mechanism, made it more orthogonal. + Revised README. Added doc to MAN-PAGE. + +November 16, 1986 -- Stuart Cracraft + More opening book bugs found and fixed. + Added capability to accept abbreviated-algebraic notation + for entering "book" games from files. + Added approximately 2500 new positions to + opening book from games involving the + opening called Blackmar-Diemer Gambit, + a hoary line developed by Diemer in + Germany years ago. + +November 15, 1986 -- Wayne Christopher at Berkeley + He modified the move generator, resulting in + a 28% speedup. + +November 14, 1986 -- Stuart Cracraft + He documented a lot of the GNU Chess modules + with brief comments for each function. More + extensive internal documentation may go in + later. + +November 14, 1986 -- Wayne Christopher at Berkeley + He created the Xchess interface for + GNU Chess to have windowing with X windows. + +November 14, 1986 -- Stuart Cracraft + He added a "randomization" feature to + the opening book. This will cause the + program to select randomly from alternate + variations whenever -DBEST is removed + from Makefile's CFLAGS. If this is not + removed, the opening play selects the + first move found in the book as it appears + "in order" in the human-readable book. + +November 14, 1986 -- David Goldberg at SUN Microsystems + He responded to a query about dbm(3) which + eventually resulted in the fixing of a subtle + bug in the book code which was causing the + program to sometimes hash to the incorrect + address and thereby produce a book move which + didn't even exist in the book. Thanks David! + +November 14, 1986 -- Stuart Cracraft + He added the "oboard" routine in util.c. This + is the reverse of the already extant "iboard" + (same module). These two routines translate + between GNU Chess internal format and + Forsythe notation. + +November 10, 1986 -- Stuart Cracraft + He added the "enter" command. This causes + the current game to be entered in the book. + Then, GNU Chess tries to mail this new entry + to the book maintainers (for inclusion in + the master copy of the book). + +November 9, 1986 -- Stuart Cracraft +He added code for an opening book. MAN-PAGE +and README were modified accordingly. + +November 8, 1986 -- Stuart Cracraft +Checks and mates are now noticed at ply-1. +This is a more complete fix to the Oct 31 fix. + +October 31, 1986 -- Stuart Cracraft +First attempt at fix to bug which causes +program to check human's king when program +itself is in check. + +October 31, 1986 -- Mly at MIT +Reported a bug which caused program to crash +when an illegal human move was played. Fixed. +Also, program was unable to play as White. Fixed. + +October 22, 1986 -- Stuart Cracraft +Pps now rewards moves which liberate bishops. + +October 19, 1986 -- Stuart Cracraft +Added bitmapper routines to distribution. +Added version notice. + +October 19, 1986 -- David Goldberg at SUN Microsystems +Interfaced GNU Chess with SUN's chesstool. + +October 18, 1986 -- Initial release date. + + diff --git a/gnu/games/chess/DOCUMENTATION/COPYING b/gnu/games/chess/DOCUMENTATION/COPYING new file mode 100644 index 0000000..17847b7 --- /dev/null +++ b/gnu/games/chess/DOCUMENTATION/COPYING @@ -0,0 +1,123 @@ + GNU CHESS GENERAL PUBLIC LICENSE + + Copyright (C) 1986,1987 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license, but changing it is not allowed. + + The license agreements of most software companies keep you at the +mercy of those companies. By contrast, our general public license is +intended to give everyone the right to share GNU Chess. To make +sure that you get the rights we want you to have, we need to make +restrictions that forbid anyone to deny you these rights or to ask you +to surrender the rights. Hence this license agreement. + + Specifically, we want to make sure that you have the right to give +away copies of GNU Chess, that you receive source code or else can get it +if you want it, that you can change GNU Chess or use pieces of it in new +free programs, and that you know you can do these things. + + To make sure that everyone has such rights, we have to forbid you to +deprive anyone else of these rights. For example, if you distribute +copies of GNU Chess, 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 tell them their rights. + + Also, for our own protection, we must make certain that everyone +finds out that there is no warranty for GNU Chess. If GNU Chess is +modified by someone else and passed on, we want its recipients to know +that what they have is not what we distributed, so that any problems +introduced by others will not reflect on our reputation. + + Therefore the Free Software Foundation, Inc. makes the following +terms which say what you must do to be allowed to distribute or change +GNU Chess. + + COPYING POLICIES + + 1. You may copy and distribute verbatim copies of GNU Chess source +code as you receive it, in any medium, provided that you conspicuously +and appropriately publish on each file a valid copyright notice +"Copyright (C) 1986,1987 Free Software Foundation, Inc.", containing the +year of last change for the file in question; keep intact the notices +on all files that refer to this License Agreement and to the absence +of any warranty; and give any other recipients of the GNU Chess +program a copy of this License Agreement along with the program. + + 2. You may modify your copy or copies of GNU Chess source code or +any portion of it, and copy and distribute such modifications under +the terms of Paragraph 1 above, provided that you also do the following: + + a) cause the modified files to carry prominent notices stating + who last changed such files and the date of any change; and + + b) cause the whole of any work that you distribute or publish, + that in whole or in part contains or is a derivative of GNU Chess + or any part thereof, to be freely distributed + and licensed to all third parties on terms identical to those + contained in this License Agreement (except that you may choose + to grant more extensive warranty protection to third parties, + at your option). + + c) if the modified program serves as a text editor, cause it + when started running in the simplest and usual way, to print + an announcement including a valid copyright notice ("Copyright + (C)", the year of authorship, and all copyright owners' names), + saying 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 Agreement. + + 3. You may copy and distribute GNU Chess or any portion of it in +compiled, executable or object code form under the terms of Paragraphs +1 and 2 above provided that you do the following: + + a) cause each such copy of GNU Chess to be accompanied by the + corresponding machine-readable source code; or + + b) cause each such copy of GNU Chess to be accompanied by a + written offer, with no time limit, to give any third party + free (except for a nominal shipping charge) machine readable + copy of the corresponding source code; or + + c) in the case of a recipient of GNU Chess in compiled, executable + or object code form (without the corresponding source code) you + shall cause copies you distribute to be accompanied by a copy + of the written offer of source code which you received along + with the copy of GNU Chess. + + 4. You may not copy, sublicense, distribute or transfer GNU Chess +except as expressly provided under this License Agreement. Any attempt +otherwise to copy, sublicense, distribute or transfer GNU Chess is void and +your rights to use GNU Chess under this License agreement shall be +automatically terminated. However, parties who have received computer +software programs from you with this License Agreement will not have +their licenses terminated so long as such parties remain in full compliance. + +Your comments and suggestions about our licensing policies and our +software are welcome! Please contact the Free Software Foundation, Inc., +1000 Mass Ave, Cambridge, MA 02138, or call (617) 876-3296. + + NO WARRANTY + + BECAUSE GNU CHESS IS LICENSED FREE OF CHARGE, WE PROVIDE ABSOLUTELY +NO WARRANTY, TO THE EXTENT PERMITTED BY APPLICABLE STATE LAW. EXCEPT +WHEN OTHERWISE STATED IN WRITING, FREE SOFTWARE FOUNDATION, INC, +AND/OR OTHER PARTIES PROVIDE GNU CHESS "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 GNU CHESS PROGRAM PROVE DEFECTIVE, +YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW WILL FREE SOFTWARE +FOUNDATION, INC., AND/OR ANY OTHER PARTY WHO MAY MODIFY AND +REDISTRIBUTE GNU CHESS AS PERMITTED ABOVE, BE LIABLE TO YOU FOR +DAMAGES, INCLUDING ANY LOST PROFITS, LOST MONIES, OR OTHER SPECIAL, +INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR +INABILITY TO USE (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA +BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY THIRD PARTIES OR A +FAILURE OF THE PROGRAM TO OPERATE WITH PROGRAMS NOT DISTRIBUTED BY +FREE SOFTWARE FOUNDATION, INC.) THE PROGRAM, EVEN IF YOU HAVE BEEN +ADVISED OF THE POSSIBILITY OF SUCH DAMAGES, OR FOR ANY CLAIM BY ANY +OTHER PARTY. +====================================================================== diff --git a/gnu/games/chess/DOCUMENTATION/GENERAL b/gnu/games/chess/DOCUMENTATION/GENERAL new file mode 100644 index 0000000..aafb7ed --- /dev/null +++ b/gnu/games/chess/DOCUMENTATION/GENERAL @@ -0,0 +1,34 @@ + GNU Chess + +Copyright (C) 1987 Stuart Cracraft + (Copying permission notice at the end.) + +GNU Chess is your program (as long as you follow the copyright and +licensing rules listed in the file COPYING). Your contributioinspire current and future software +developers. + +This document +------------- +This document is not meant to be a an introduction to computer chess. +The following books are excellent introductions and treatises. +They are listed in order of difficulty: + + Computer Chess (2nd edition), by David Welsh and Boris Bazcynski + The Joy of Computer Chess, by David Levy + Chess Skill in Man and Machine (2nd edition), by Peter Frey + + +Current Distribution +-------------------- +The most recent distribution of GNU Chess contains the following +main-level files and directories: + + Filename Purpose + ------------------------------------------------------ + README Pointer to main README below. + gnuchess.c Most recent version of GNU Chess + nondsp.c Non-display interface, and chesstool/xchess interface + uxdsp.c Unix (curses) display interface + ansidsp.c ANSI display interface + gnuchess.book Most recent version of opening book + diff --git a/gnu/games/chess/DOCUMENTATION/HEURISTICS b/gnu/games/chess/DOCUMENTATION/HEURISTICS new file mode 100644 index 0000000..254b344 --- /dev/null +++ b/gnu/games/chess/DOCUMENTATION/HEURISTICS @@ -0,0 +1,122 @@ +This file contains a description of GNU's heuristics. + Copyright (C) 1986, 1987 Free Software Foundation, Inc. + +This file is part of CHESS. + +CHESS is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY. No author or distributor +accepts responsibility to anyone for the consequences of using it +or for whether it serves any particular purpose or works at all, +unless he says so in writing. Refer to the CHESS General Public +License for full details. + +Everyone is granted permission to copy, modify and redistribute +CHESS, but only under the conditions described in the +CHESS General Public License. A copy of this license is +supposed to have been given to you along with CHESS so you +can know your rights and responsibilities. It should be in a +file named COPYING. Among other things, the copyright notice +and this notice must be preserved on all copies. */ + + -- requested by main author +Heuristic descriptions for CHESS. + +Revision: 12-16-87 + +Copyright (c) 1987 by John Stanback + + Here is a brief description of the heuristics used in the positional + evaluator of the GNU Chess program. Many heuristics are functions of the + stage of the game which is based on the total non-pawn material remaining + for both sides. + + +PAWNS + The material value of a pawn is 100 points. Isolated pawns get a + penalty depending on which file they occupy: + (12,14,16,20,20,16,14,12) for files (a..h). + Doubled pawns (which are not also isolated) get a penalty of 12 + points. Backward pawns (defined simply as not being defended by a + pawn with the square in front also not defended by a a pawn) are + penalized 6 points. A 4 point penalty is also invoked for each attack + by the opponent to a backward pawn and for a backward pawn on a + half-open file. Pawn Advancement in the centre is given a bonus of + about 4 points per rank in the opening increasing to about 8 points + per rank in the ending. Advancement on the edges is given a lower + bonus. Pawns on the e and d files and on the 2nd rank are given a 10 + point penalty. An additional penalty of 15 points is invoked if these + pawns are also blocked. Pawns within 2 squares of the king are given + a 10 point bonus. Passed pawns are given a bonus for increasing rank + which is a function of stage of the game and of whether the opponent + blocks or attacks one or more squares in front of the pawn or if the + opponents king is in the square of the pawn. This bonus ranges from + about 15 points for a pawn on the second rank up to about 300 points + for a passed pawn on the 7th rank which can't be stopped from + queening. + + +KNIGHTS + The material value of a knight is 330 points. The main heuristic for + knights is a bonus for proximity to the centre. This varies from 0 + points in the corners to 30 points in the centre. Knights are also + given a bonus for being within 2 squares of each enemy piece. This + bonus is a function of the stage of the game, equalling 4 points in + the end game. A penalty of 1 point per square is given for distance + from either king. A bonus of up to 8 points (depends on stage) is + given for knights which can't be driven away by enemy pawns. + + +BISHOPS + The material value of a bishop is 330 points. Bishops are given a + bonus as material falls off the board equalling 10 points in the end + game. Bishops get a bonus for mobility and Xray mobility thru pieces + but not pawns. This bonus ranges from -4 points for a totally blocked + bishop up to 18 points for a bishop attacking 12 or more squares. + Xray attacks on an enemy R,Q,K or any undefended piece are given an 8 + point bonus. Bishops are given a bonus of 14 points if they lie on + the edge of the board up to 22 points if the lie in the centre. A + bishop is given a bonus of up to 5 points for each attack to a square + adjacent to the enemy king. + + +ROOKS + The material value of a rook is 520 points. Rook mobility is handled + similiarly to bishops with a bonus of 0 points if blocked up to 20 + points if attacking 12 squares or more. A bonus of 8 points for Xray + attacks is handled as it is for bishops. Rooks are given a bonus of + 10 points for occupying a file with no friendly pawns and a bonus of + 4 points if no enemy pawns lie on that file. After the opening Rooks + are penalized slightly depending on "taxicab" distance to the enemy + king. + + +QUEENS + The material value of a queen is 980 points. The only heuristic for a + queen is that after the opening it is penalized slightly for + "taxicab" distance to the enemy king. + + +KINGS + Kings are given a penalty for proximity to the centre in the opening + and a bonus for proximity to the centre in the endgame. The penalty + is about 24 points for being in the centre in the opening with a + bonus of about 36 points for being in the centre in the endgame. + Kings are penalized for lying on an open or half-open file or if the + adjacent file closest to the corner is open or half-open. This + penalty is up to 23 points in the opening and goes to zero in the end + game. The King is penalized up to 8 points if there are no pawns + immediately adjacent. A penalty is invoked depending on the number of + "safe" checks available by the opponent. This penalty ranges from 6 + points for one such check to 50 points for 4 or more. Depending on + game stage, Kings are given up to 10 points for castling and a + penalty of up to 40 points for moving before castling. + + +SPECIAL + If more than one piece is "hung" (attacked and not defended or + attacked by an enemy piece of lower value) an extra penalty of 10 + points is invoked for that side and the search may be extended one + ply. Pinned or trapped pieces are treated similarly. A special mating + routine is used if one side has only a king and the other has mating + material. + diff --git a/gnu/games/chess/DOCUMENTATION/MAN-PAGE b/gnu/games/chess/DOCUMENTATION/MAN-PAGE new file mode 100644 index 0000000..bbf0aa4 --- /dev/null +++ b/gnu/games/chess/DOCUMENTATION/MAN-PAGE @@ -0,0 +1,161 @@ +.TH Chess GNU +.SH NAME +Chess \- GNU Chess +.SH SYNOPSIS +.B Chess +[ +.B arg1 arg2 +] +.SH DESCRIPTION +.I Chess +plays a game of chess against the user or it plays against itself. +.PP +.I Chess +has a simple alpha-numeric board display or it can be compiled for +use with the CHESSTOOL program on a SUN workstation. +The program gets its opening moves from the file gnuchess.book which +should be located in the same directory as gnuchess. +To invoke the prgram, type 'gnuchess' or type 'chesstool gnuchess' +on a SUN workstation where 'CHESSTOOL' is installed. +The 'gnuchess' command can be followed by up to 2 command line arguments. +If one argument is given it determines the programs search time in +seconds. If two arguments are given, they will be used to set tournament +time controls with the first argument being the number of moves and the second +being the total clock time in minutes. Thus, entering 'chess 60 5' will set +the clocks for 5 minutes (300 seconds) for the first 60 moves. +If no argument is given the program will prompt the user for level of +play. +For use with CHESSTOOL, see the documentation on that program. +.PP +Once +.I Chess +is invoked, the program will display the board and prompt the user +for a move. To enter a move, use the notation 'e2e4' where the first +letter-number pair indicates the origination square +and the second letter-number pair indicates the destination square. +An alternative is to use the notation 'nf3' where +the first letter indicates the piece type (p,n,b,r,q,k). +To castle, type the origin and destination squares +of the king just as you would do for a regular move, or type +"o-o" for kingside castling and "o-o-o" for queenside. +.SH COMMANDS +.PP +In addition to legal moves, the following commands are available as responses. +.PP +.I beep +-- causes the program to beep after each move. +.PP +.I bd +-- updates the current board position on the display. +.PP +.I book +-- turns off use of the opening library. +.PP +.I both +-- causes the computer to play both sides of a chess game. +.PP +.I black +-- causes the computer to take the black pieces with the move +and begin searching. +.PP +.I level +-- allows the user to set time controls such as +60 moves in 5 minutes etc. In tournament mode, the program will +vary the time it takes for each +move depending on the situation. If easy mode is disabled (using +the 'easy' command), the program +will often respond with its move immediately, saving time on +its clock for use later on. +.PP +.I depth +-- allows the user to change the +search depth of the program. The maximum depth is 29 ply. +Normally the depth is set to 29 and the computer terminates +its search based on elapsed time rather than depth. +Using the depth command allows setting depth to say +4 ply and setting response time to a large number such as +9999 seconds. The program will then search until all moves +have been examined to a depth of 4 ply (with extensions up +to 11 additional ply for sequences of checks and captures). +.PP +.I easy +-- toggles easy mode (thinking on opponents time) +on and off. The default is easy mode ON. If easy mode is disabled, +the user must enter a 'break' or '^C' to get the programs +attention before entering each move. +.PP +.I edit +-- allows the user to set up a board position. +In this mode, the '#' command will clear the board, the 'c' +command will toggle piece color, and the '.' command will exit +setup mode. Pieces are entered by typing a letter (p,n,b,r,q,k) for +the piece followed by the coordinate. For example "pb3" would +place a pawn on square b3. +.PP +.I force +-- allows the user to enter moves for both +sides. To get the program to play after a sequence of moves +has been entered use the 'white' or 'black' commands. +.PP +.I get +-- retrieves a game from disk. The program will +prompt the user for a file name. +.PP +.I help +-- displays a short description of the commands. +.PP +.I hint +-- causes the program to supply the user with +its predicted move. +.PP +.I list +-- writes the game moves and some statistics +on search depth, nodes, and time to the file 'chess.lst'. +.PP +.I new +-- starts a new game. +.PP +.I post +-- causes the program to display the principle +variation and the score during the search. A score of +100 is equivalent to a 1 pawn advantage for the computer. +.PP +.I random +-- causes the program to randomize its move +selection slightly. +.PP +.I reverse +-- causes the board display to be reversed. That +is, the white pieces will now appear at the top of the board. +.PP +.I quit +-- exits the game. +.PP +.I save +-- saves a game to disk. The program will prompt +the user for a file name. +.PP +.I switch +-- causes the program to switch places with +the opponent and begin searching. +.PP +.I undo +-- undoes the last move whether it was the computer's +or the human's. You may also type "remove". This is equivalent +to two "undo's" (e.g. retract one move for each side). +.PP +.I white +-- causes the computer to take the white pieces +with the move and begin searching. +.SH BUGS +.PP +Pawn promotion to pieces other than a queen is not allowed. +En-Passant does not work properly with CHESSTOOOL. +The transposition table may not work properly in some +positions so the default is to turn this off. +.fi +.SH SEE ALSO +.nf +chesstool(6) +.fi + diff --git a/gnu/games/chess/Makefile b/gnu/games/chess/Makefile new file mode 100644 index 0000000..d5fa6f4 --- /dev/null +++ b/gnu/games/chess/Makefile @@ -0,0 +1,15 @@ +# @(#)Makefile 5.4 (Berkeley) 5/11/90 + +PROG= chess +SRCS= gnuchess.c uxdsp.c move.c +CFLAGS+=-DNEWMOVE=12 +MAN6= chess.0 +DPADD= ${LIBCURSES} ${LIBTERM} +LDADD= -lcurses -ltermlib +HIDEGAME=hidegame + +beforeinstall: + install -c -o ${BINOWN} -g ${BINGRP} -m 444 ${.CURDIR}/gnuchess.book \ + ${DESTDIR}/usr/share/games + +.include <bsd.prog.mk> diff --git a/gnu/games/chess/Xchess/COPYING b/gnu/games/chess/Xchess/COPYING new file mode 100644 index 0000000..5905c32 --- /dev/null +++ b/gnu/games/chess/Xchess/COPYING @@ -0,0 +1,124 @@ + + GNU X-CHESS GENERAL PUBLIC LICENSE + + Copyright (C) 1986 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license, but changing it is not allowed. + + The license agreements of most software companies keep you at the +mercy of those companies. By contrast, our general public license is +intended to give everyone the right to share GNU X-Chess. To make +sure that you get the rights we want you to have, we need to make +restrictions that forbid anyone to deny you these rights or to ask you +to surrender the rights. Hence this license agreement. + + Specifically, we want to make sure that you have the right to give +away copies of GNU X-Chess, that you receive source code or else can get it +if you want it, that you can change GNU X-Chess or use pieces of it in new +free programs, and that you know you can do these things. + + To make sure that everyone has such rights, we have to forbid you to +deprive anyone else of these rights. For example, if you distribute +copies of GNU X-Chess, 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 tell them their rights. + + Also, for our own protection, we must make certain that everyone +finds out that there is no warranty for GNU X-Chess. If GNU X-Chess is +modified by someone else and passed on, we want its recipients to know +that what they have is not what we distributed, so that any problems +introduced by others will not reflect on our reputation. + + Therefore the Free Software Foundation, Inc. makes the following +terms which say what you must do to be allowed to distribute or change +GNU X-Chess. + + COPYING POLICIES + + 1. You may copy and distribute verbatim copies of GNU X-Chess source +code as you receive it, in any medium, provided that you conspicuously +and appropriately publish on each file a valid copyright notice +"Copyright (C) 1986 Free Software Foundation, Inc.", containing the +year of last change for the file in question; keep intact the notices +on all files that refer to this License Agreement and to the absence +of any warranty; and give any other recipients of the GNU X-Chess +program a copy of this License Agreement along with the program. + + 2. You may modify your copy or copies of GNU X-Chess source code or +any portion of it, and copy and distribute such modifications under +the terms of Paragraph 1 above, provided that you also do the following: + + a) cause the modified files to carry prominent notices stating + who last changed such files and the date of any change; and + + b) cause the whole of any work that you distribute or publish, + that in whole or in part contains or is a derivative of GNU X-Chess + or any part thereof, to be freely distributed + and licensed to all third parties on terms identical to those + contained in this License Agreement (except that you may choose + to grant more extensive warranty protection to third parties, + at your option). + + c) if the modified program serves as a text editor, cause it + when started running in the simplest and usual way, to print + an announcement including a valid copyright notice ("Copyright + (C)", the year of authorship, and all copyright owners' names), + saying 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 Agreement. + + 3. You may copy and distribute GNU X-Chess or any portion of it in +compiled, executable or object code form under the terms of Paragraphs +1 and 2 above provided that you do the following: + + a) cause each such copy of GNU X-Chess to be accompanied by the + corresponding machine-readable source code; or + + b) cause each such copy of GNU X-Chess to be accompanied by a + written offer, with no time limit, to give any third party + free (except for a nominal shipping charge) machine readable + copy of the corresponding source code; or + + c) in the case of a recipient of GNU X-Chess in compiled, executable + or object code form (without the corresponding source code) you + shall cause copies you distribute to be accompanied by a copy + of the written offer of source code which you received along + with the copy of GNU X-Chess. + + 4. You may not copy, sublicense, distribute or transfer GNU X-Chess +except as expressly provided under this License Agreement. Any attempt +otherwise to copy, sublicense, distribute or transfer GNU X-Chess is void and +your rights to use GNU X-Chess under this License agreement shall be +automatically terminated. However, parties who have received computer +software programs from you with this License Agreement will not have +their licenses terminated so long as such parties remain in full compliance. + +Your comments and suggestions about our licensing policies and our +software are welcome! Please contact the Free Software Foundation, Inc., +1000 Mass Ave, Cambridge, MA 02138, or call (617) 876-3296. + + NO WARRANTY + + BECAUSE GNU X-CHESS IS LICENSED FREE OF CHARGE, WE PROVIDE ABSOLUTELY +NO WARRANTY, TO THE EXTENT PERMITTED BY APPLICABLE STATE LAW. EXCEPT +WHEN OTHERWISE STATED IN WRITING, FREE SOFTWARE FOUNDATION, INC, +AND/OR OTHER PARTIES PROVIDE GNU X-CHESS "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 GNU X-CHESS PROGRAM PROVE DEFECTIVE, +YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW WILL FREE SOFTWARE +FOUNDATION, INC., AND/OR ANY OTHER PARTY WHO MAY MODIFY AND +REDISTRIBUTE GNU X-CHESS AS PERMITTED ABOVE, BE LIABLE TO YOU FOR +DAMAGES, INCLUDING ANY LOST PROFITS, LOST MONIES, OR OTHER SPECIAL, +INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR +INABILITY TO USE (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA +BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY THIRD PARTIES OR A +FAILURE OF THE PROGRAM TO OPERATE WITH PROGRAMS NOT DISTRIBUTED BY +FREE SOFTWARE FOUNDATION, INC.) THE PROGRAM, EVEN IF YOU HAVE BEEN +ADVISED OF THE POSSIBILITY OF SUCH DAMAGES, OR FOR ANY CLAIM BY ANY +OTHER PARTY. +====================================================================== diff --git a/gnu/games/chess/Xchess/Makefile b/gnu/games/chess/Xchess/Makefile new file mode 100644 index 0000000..c6afd8f --- /dev/null +++ b/gnu/games/chess/Xchess/Makefile @@ -0,0 +1,136 @@ +# RCS Info: $Revision: 1.5 $ on $Date: 86/11/26 12:09:19 $ +# $Source: /users/faustus/xchess/RCS/Makefile,v $ +# Copyright (c) 1985 Wayne A. Christopher, U. C. Berkeley CAD Group +# +# Makefile for xchess. + +#CC = cc -O -m68010 -L/pub.MC68010/lib -L/usr.MC68010/lib +CC = cc -O + +CFILES =\ + board.c\ + button.c\ + clock.c\ + control.c\ + jail.c\ + message.c\ + parse.c\ + popup.c\ + program.c\ + record.c\ + std.c\ + valid.c\ + window.c\ + XCircle.c + +COBJS =\ + board.o\ + button.o\ + clock.o\ + control.o\ + jail.o\ + message.o\ + parse.o\ + popup.o\ + program.o\ + record.o\ + std.o\ + valid.o\ + window.o\ + XCircle.o + +HFILES =\ + std.h\ + xchess.h + +SOURCE = $(CFILES) + +ALLFILES = $(SOURCE) $(HFILES) + +INCLUDE = -I. + +DEFINES = -DDEF_PROGRAM=\"gnuchess\" + +CFLAGS = $(DEFINES) $(INCLUDE) +LINTFLAGS = -u -z -lc -DLINT $(DEFINES) $(INCLUDE) +LINTLIB = ../lib/llib-lX.ln +#LDFLAGS = -L/usr2/X/lib -z -lX -lm +LDFLAGS = -loldX -lX11 -z -lX -lm +GPLDFLAGS = -z -loldX -lX11 -lXMenu_p -lX -lm_p -g -pg + +.c.o: $*.c + $(CC) $(CFLAGS) -c $*.c +.s.o: $*.s + $(CC) $(CFLAGS) -c $*.s + +all: xchess scrollText.o + @echo "All done." + +everything: all tags depend lint wc + @echo "All done." + +xchess: xchess.o $(COBJS) scrollText.o + $(CC) -o xchess xchess.o $(COBJS) scrollText.o \ + $(LDFLAGS) + +scrollText.o: scrollText.h scrollText.c + +gpxchess: xchess.o $(COBJS) + $(CC) -o gpxchess xchess.o $(COBJS) scrollText/libScroll.a \ + $(GPLDFLAGS) + +lint: $(SOURCE) + lint $(LINTFLAGS) $(SOURCE) $(LINTLIB) | \ + grep -v "multiply declared" + +qgrind: $(ALLFILES) + qgrind -lc $(ALLFILES) + +vgrind: $(ALLFILES) + vgrind -lc $(ALLFILES) + +opt: all + +reopt: all + +install: all + +source: $(SOURCE) + +tags: $(ALLFILES) + ctags -w -t *.c *.h > /dev/null 2>&1 + +wc: $(ALLFILES) + @wc $(ALLFILES) + +print: $(ALLFILES) + @pr $(ALLFILES) + +clean: + rm -f *.o *.a *.out xchess tags foo tmp + +tar: + tar -cf xchess.tar Makefile *.h *.c *.bitmap *.icon *.cur *.1\ + scrollText/Makefile scrollText/*.h scrollText/*.c scrollText/*.1\ + scrollText/*.3 + +$(ALLFILES): + co $@ + +depend: $(SOURCE) + cc -M $(CFLAGS) $(CFILES) > makedep + echo '/^# DO NOT DELETE THIS LINE/+2,$$d' >eddep + echo '$$r makedep' >>eddep + echo 'w' >>eddep + ed - Makefile < eddep + rm eddep makedep + echo '# DEPENDENCIES MUST END AT END OF FILE' >> Makefile + echo '# IF YOU PUT STUFF HERE IT WILL GO AWAY' >> Makefile + echo '# see make depend above' >> Makefile + +#----------------------------------------------------------------- +# DO NOT DELETE THIS LINE -- make depend uses it +# DEPENDENCIES MUST END AT END OF FILE + +xchess.o $(COBJS): $(HFILES) + diff --git a/gnu/games/chess/Xchess/ScrollText b/gnu/games/chess/Xchess/ScrollText new file mode 100644 index 0000000..782a54f --- /dev/null +++ b/gnu/games/chess/Xchess/ScrollText @@ -0,0 +1,34 @@ +Subject: File: scrollText.h + +/* + * Scrollable Text Window Header File + * + * David Harrison + * University of California, Berkeley + * 1986 + * + * This file contains definitions for a scrollable text window + * with scroll bar support. + */ + +int TxtGrab(); + /* Take hold of a previously created window */ + +#define TXT_NO_COLOR -1 + +int TxtAddFont(); + /* Loads a new font for use later */ +int TxtWinP(); + /* Returns non-zero value if the window is text window */ +int TxtClear(); + /* Clears text window and resets text buffer */ + +int TxtWriteStr(); + /* Writes a string to window with immediate update */ +int TxtJamStr(); + /* Write a string without causing update to screen */ + +int TxtRepaint(); + /* Repaints entire scrollable text window */ +int TxtFilter(); + /* Handles events related to text window */ diff --git a/gnu/games/chess/Xchess/XCircle.c b/gnu/games/chess/Xchess/XCircle.c new file mode 100644 index 0000000..d2144bc --- /dev/null +++ b/gnu/games/chess/Xchess/XCircle.c @@ -0,0 +1,162 @@ + +/* This file contains code for X-CHESS. + Copyright (C) 1986 Free Software Foundation, Inc. + +This file is part of X-CHESS. + +X-CHESS is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY. No author or distributor +accepts responsibility to anyone for the consequences of using it +or for whether it serves any particular purpose or works at all, +unless he says so in writing. Refer to the X-CHESS General Public +License for full details. + +Everyone is granted permission to copy, modify and redistribute +X-CHESS, but only under the conditions described in the +X-CHESS General Public License. A copy of this license is +supposed to have been given to you along with X-CHESS so you +can know your rights and responsibilities. It should be in a +file named COPYING. Among other things, the copyright notice +and this notice must be preserved on all copies. */ + + +/* RCS Info: $Revision: 1.2 $ on $Date: 86/11/23 17:17:04 $ + * $Source: /users/faustus/xchess/RCS/XCircle.c,v $ + * Copyright (c) 1986 Wayne A. Christopher, U. C. Berkeley CAD Group + * Permission is granted to do anything with this code except sell it + * or remove this message. + * + */ + +#include <stdio.h> +#include <X11/Xlib.h> +#include <X11/X10.h> +#include <math.h> + +#define PI 3.1415926535897932384 + +#define MAXVERTS 1000 + +void +XCircle(win, x, y, rad, start, end, width, height, pixel, func, planes) + Window win; + int x, y, rad; + double start, end; + int pixel; + int width, height; + int func, planes; +{ + Vertex verts[MAXVERTS]; + double xp, yp, ang; + int lx, ly, xpt, ypt, i; + double gradincr = 2 / (double) rad; + int bk = 0; + + while (end >= PI * 2) + end -= PI * 2; + while (start >= PI * 2) + start -= PI * 2; + while (end < 0) + end += PI * 2; + while (start < 0) + start += PI * 2; + if (end == start) { + if (end < gradincr) + end = end + PI * 2 - gradincr / 2; + else + end -= gradincr / 2; + } + for (ang = start, i = 0; i < MAXVERTS; ) { + + xp = x + rad * cos(ang); + yp = y + rad * sin(ang); + + xpt = xp; + ypt = yp; + + if (!i || (lx != xpt) || (ly != ypt)) { + verts[i].x = xpt; + verts[i].y = ypt; + verts[i].flags = 0; + i++; + } + lx = xpt; + ly = ypt; + if (bk) + break; + if (((ang < end) && (ang + gradincr > end)) || ((end < start) + && (ang + gradincr > 2 * PI) + && (ang + gradincr - 2 * PI > end))) { + ang = end; + bk = 1; + } else if (ang == end) { + break; + } else { + ang += gradincr; + } + if (ang >= PI * 2) + ang -= PI * 2; + } + + /* Now draw the thing.. */ + XDraw(win, verts, i, width, height, pixel, func, planes); + + return; +} + +#ifdef notdef VertexCurved is screwed up + +void +XCircle(win, x, y, rad, start, end, width, height, pixel, func, planes) + Window win; + int x, y, rad; + double start, end; + int pixel; + int width, height; + int func, planes; +{ + Vertex verts[7]; + int i, j, sv, ev; + int dp = 0; + + for (i = j = 0 ; i < 4; i++) { + verts[j].x = x + rad * cos((double) (PI * i / 2)); + verts[j].y = y + rad * sin((double) (PI * i / 2)); + verts[j].flags = VertexCurved; + if ((start >= PI * i / 2) && (start < PI * (i + 1) / 2) && + (start != end)) { + j++; + verts[j].x = x + rad * cos(start); + verts[j].y = y + rad * sin(start); + verts[j].flags = VertexCurved; + sv = j; + } else if ((end >= PI * i / 2) && (end < PI * (i + 1) / 2) + && (start != end)) { + j++; + verts[j].x = x + rad * cos(end); + verts[j].y = y + rad * sin(end); + verts[j].flags = VertexCurved; + ev = j; + } + j++; + } + verts[0].flags |= VertexStartClosed; + verts[j].x = verts[0].x; + verts[j].y = verts[0].y; + verts[j].flags = (verts[0].flags & ~VertexStartClosed) | + VertexEndClosed; + for (i = 0; i < 15; i++) { + if (dp) + verts[i % 7].flags |= VertexDontDraw; + if (i % 7 == ev) + dp = 1; + else if (i % 7 == sv) + dp = 0; + } + XDraw(win, verts, j + 1, width, height, pixel, func, planes); + + return; +} + +#endif notdef + diff --git a/gnu/games/chess/Xchess/bishop.bitmap b/gnu/games/chess/Xchess/bishop.bitmap new file mode 100644 index 0000000..dc068dd --- /dev/null +++ b/gnu/games/chess/Xchess/bishop.bitmap @@ -0,0 +1,71 @@ + +#define bishop_width 80 +#define bishop_height 80 +static char bishop_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x07, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x8f, + 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x8f, 0x0f, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x8f, 0x0f, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x0f, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x9f, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x7f, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x7f, 0x10, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xf8, 0xff, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfc, 0xff, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, + 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0x23, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xf8, 0x67, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xf8, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x80, 0xff, 0xf8, 0x4f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, + 0x1f, 0xc0, 0x4f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x1f, 0xc0, + 0x5f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x1f, 0xc0, 0x5f, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xf8, 0x7f, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xe0, 0xff, 0xf8, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0xff, 0xf8, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, + 0xff, 0xf8, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0xf8, + 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0xf8, 0x7f, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0xf8, 0xff, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xf8, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, + 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, + 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xf0, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xf0, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, + 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, + 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0x3f, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x80, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, + 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, + 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x07, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfe, 0xfd, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfa, 0xf8, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x72, 0x70, 0x02, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x72, 0x70, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfa, 0xf8, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xfe, 0xfd, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x04, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xc0, 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x1f, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x3f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xf0, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xf8, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x1f, + 0xfc, 0xfd, 0xc1, 0xff, 0x01, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0x07, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0x3f, 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0x00, + 0x00, 0xc0, 0xff, 0xff, 0x3f, 0xf0, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x80, + 0x0f, 0xf0, 0x0f, 0xc0, 0x7f, 0x00, 0x1f, 0x00, 0x00, 0xc0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; diff --git a/gnu/games/chess/Xchess/bishop_mask.bitmap b/gnu/games/chess/Xchess/bishop_mask.bitmap new file mode 100644 index 0000000..ca17bb3 --- /dev/null +++ b/gnu/games/chess/Xchess/bishop_mask.bitmap @@ -0,0 +1,71 @@ + +#define bishop_mask_width 80 +#define bishop_mask_height 80 +static char bishop_mask_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x80, 0x8f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0xdf, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xdf, + 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xdf, 0x1f, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xdf, 0x1f, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xc0, 0xdf, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x80, 0x8f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, + 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0x3f, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0x3f, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xfe, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, + 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xc0, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, + 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, + 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xf0, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, + 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, + 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xfc, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, + 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0xff, + 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xf8, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, + 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, + 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0xff, 0x7f, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, + 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, + 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0x1f, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x80, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, + 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, + 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x07, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x80, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, + 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, + 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0x1f, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, + 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x3f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x7f, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfc, 0x3f, 0xfc, 0xff, 0xe3, 0xff, 0x03, 0x00, 0x00, 0x00, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x7f, 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x01, 0x00, 0xf8, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0x01, + 0x00, 0xf8, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0x01, 0x00, 0xe0, + 0xff, 0xff, 0x7f, 0xf8, 0xff, 0xff, 0x7f, 0x00, 0x00, 0xf0, 0x1f, 0xf8, + 0x1f, 0xe0, 0xff, 0x80, 0xff, 0x00, 0x00, 0xf0, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xf8, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; diff --git a/gnu/games/chess/Xchess/bishop_outline.bitmap b/gnu/games/chess/Xchess/bishop_outline.bitmap new file mode 100644 index 0000000..9772328 --- /dev/null +++ b/gnu/games/chess/Xchess/bishop_outline.bitmap @@ -0,0 +1,71 @@ + +#define bishop_outline_width 80 +#define bishop_outline_height 80 +static char bishop_outline_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x07, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x8d, + 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x88, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x8d, 0x0d, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x0f, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x98, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x70, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x40, 0x10, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x18, 0xc0, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x08, 0x80, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0c, 0x80, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x80, + 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x22, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x07, 0x66, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x05, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x01, 0x05, 0x4c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, + 0xe0, 0x3d, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x20, 0x20, + 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xe0, 0x3d, 0x50, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x05, 0x70, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x20, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x20, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, + 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x05, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x05, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x07, 0xc0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x08, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, + 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0xc0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x10, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, + 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, + 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x07, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x07, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8e, 0x8d, 0x03, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8e, 0x8d, 0x03, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x06, 0x07, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x02, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x04, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xc0, 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x08, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x18, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x18, 0xc7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x1f, + 0x0c, 0x85, 0xc1, 0xff, 0x01, 0x00, 0x00, 0x00, 0x0e, 0xf0, 0x87, 0x0d, + 0x7f, 0x00, 0x07, 0x00, 0x00, 0xc0, 0x03, 0x00, 0xc0, 0x08, 0x00, 0x00, + 0x3c, 0x00, 0x00, 0x70, 0x00, 0x00, 0xe0, 0x18, 0x00, 0x00, 0xe0, 0x00, + 0x00, 0xc0, 0xf8, 0x1f, 0x38, 0x70, 0xc0, 0xff, 0x31, 0x00, 0x00, 0x80, + 0x0f, 0xf0, 0x0f, 0xc0, 0x7f, 0x00, 0x1f, 0x00, 0x00, 0xc0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; diff --git a/gnu/games/chess/Xchess/bishop_small.bitmap b/gnu/games/chess/Xchess/bishop_small.bitmap new file mode 100644 index 0000000..5525ecd --- /dev/null +++ b/gnu/games/chess/Xchess/bishop_small.bitmap @@ -0,0 +1,15 @@ + +#define bishop_small_width 32 +#define bishop_small_height 32 +static char bishop_small_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x1c, 0x00, 0x00, 0x70, 0x1c, 0x00, + 0x00, 0x70, 0x1c, 0x00, 0x00, 0x20, 0x08, 0x00, 0x00, 0x60, 0x16, 0x00, + 0x00, 0x60, 0x22, 0x00, 0x00, 0xf0, 0x23, 0x00, 0x00, 0xf0, 0x21, 0x00, + 0x00, 0xf8, 0x21, 0x00, 0x00, 0xf8, 0x23, 0x00, 0x00, 0xf8, 0x23, 0x00, + 0x00, 0xf8, 0x27, 0x00, 0x00, 0x38, 0x27, 0x00, 0x00, 0x3c, 0x2f, 0x00, + 0x00, 0x0c, 0x2c, 0x00, 0x00, 0x0e, 0x3c, 0x00, 0x00, 0x3e, 0x3f, 0x00, + 0x00, 0x3e, 0x3f, 0x00, 0x00, 0x3e, 0x3f, 0x00, 0x00, 0x3e, 0x3f, 0x00, + 0x00, 0xfe, 0x7f, 0x00, 0x00, 0xfe, 0x7f, 0x00, 0x00, 0xfe, 0x7f, 0x00, + 0x00, 0xfe, 0x7f, 0x00, 0x00, 0xfe, 0x7f, 0x00, 0x00, 0xfe, 0x7f, 0x00, + 0x00, 0xfe, 0x7f, 0x00, 0x00, 0xfe, 0x7f, 0x00, 0xe0, 0xff, 0xff, 0x07, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; diff --git a/gnu/games/chess/Xchess/bishop_small_outline.bitmap b/gnu/games/chess/Xchess/bishop_small_outline.bitmap new file mode 100644 index 0000000..8d29a81 --- /dev/null +++ b/gnu/games/chess/Xchess/bishop_small_outline.bitmap @@ -0,0 +1,15 @@ + +#define bishop_small_outline_width 32 +#define bishop_small_outline_height 32 +static char bishop_small_outline_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x1c, 0x00, 0x00, 0x50, 0x14, 0x00, + 0x00, 0x70, 0x1c, 0x00, 0x00, 0x20, 0x08, 0x00, 0x00, 0x60, 0x16, 0x00, + 0x00, 0x60, 0x22, 0x00, 0x00, 0xf0, 0x23, 0x00, 0x00, 0x10, 0x21, 0x00, + 0x00, 0x18, 0x21, 0x00, 0x00, 0x08, 0x23, 0x00, 0x00, 0x08, 0x22, 0x00, + 0x00, 0x08, 0x26, 0x00, 0x00, 0x08, 0x24, 0x00, 0x00, 0xcc, 0x2c, 0x00, + 0x00, 0xc4, 0x28, 0x00, 0x00, 0xf6, 0x3b, 0x00, 0x00, 0xf2, 0x23, 0x00, + 0x00, 0xc2, 0x20, 0x00, 0x00, 0xc2, 0x20, 0x00, 0x00, 0xc2, 0x20, 0x00, + 0x00, 0xc2, 0x60, 0x00, 0x00, 0x02, 0x40, 0x00, 0x00, 0x02, 0x40, 0x00, + 0x00, 0x02, 0x40, 0x00, 0x00, 0x02, 0x40, 0x00, 0x00, 0x02, 0x40, 0x00, + 0x00, 0x02, 0x40, 0x00, 0x00, 0x02, 0x40, 0x00, 0xe0, 0xff, 0xff, 0x07, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; diff --git a/gnu/games/chess/Xchess/board.c b/gnu/games/chess/Xchess/board.c new file mode 100644 index 0000000..4c5b934 --- /dev/null +++ b/gnu/games/chess/Xchess/board.c @@ -0,0 +1,179 @@ + +/* This file contains code for X-CHESS. + Copyright (C) 1986 Free Software Foundation, Inc. + +This file is part of X-CHESS. + +X-CHESS is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY. No author or distributor +accepts responsibility to anyone for the consequences of using it +or for whether it serves any particular purpose or works at all, +unless he says so in writing. Refer to the X-CHESS General Public +License for full details. + +Everyone is granted permission to copy, modify and redistribute +X-CHESS, but only under the conditions described in the +X-CHESS General Public License. A copy of this license is +supposed to have been given to you along with X-CHESS so you +can know your rights and responsibilities. It should be in a +file named COPYING. Among other things, the copyright notice +and this notice must be preserved on all copies. */ + + +/* RCS Info: $Revision: 1.4 $ on $Date: 86/11/23 17:17:15 $ + * $Source: /users/faustus/xchess/RCS/board.c,v $ + * Copyright (c) 1986 Wayne A. Christopher, U. C. Berkeley CAD Group + * Permission is granted to do anything with this code except sell it + * or remove this message. + * + * Stuff to deal with the board. + */ + +#include "xchess.h" + +board *chessboard; + +void +board_setup() +{ + chessboard = alloc(board); + board_init(chessboard); + return; +} + +void +board_init(b) + board *b; +{ + int i, j; + + for (i = 0; i < 2; i++) + for (j = 0; j < SIZE; j++) + b->square[i][j].color = BLACK; + for (i = 2; i < 6; i++) + for (j = 0; j < SIZE; j++) + b->square[i][j].color = NONE; + for (i = 6; i < 8; i++) + for (j = 0; j < SIZE; j++) + b->square[i][j].color = WHITE; + for (i = 0; i < SIZE; i++) + b->square[1][i].type = b->square[6][i].type = + PAWN; + b->square[0][0].type = b->square[7][0].type = ROOK; + b->square[0][1].type = b->square[7][1].type = KNIGHT; + b->square[0][2].type = b->square[7][2].type = BISHOP; + b->square[0][3].type = b->square[7][3].type = QUEEN; + b->square[0][4].type = b->square[7][4].type = KING; + b->square[0][5].type = b->square[7][5].type = BISHOP; + b->square[0][6].type = b->square[7][6].type = KNIGHT; + b->square[0][7].type = b->square[7][7].type = ROOK; + b->black_cant_castle_k = false; + b->black_cant_castle_q = false; + b->white_cant_castle_k = false; + b->white_cant_castle_q = false; + + return; +} + +void +board_drawall() +{ + int i, j; + + for (i = 0; i < SIZE; i++) + for (j = 0; j < SIZE; j++) + if (chessboard->square[i][j].color != NONE) { + win_drawpiece(&chessboard->square[i][j], i, + j, WHITE); + if (!oneboard) + win_drawpiece(&chessboard->square[i][j], + i, j, BLACK); + } + return; +} + +void +board_move(b, m) + board *b; + move *m; +{ + switch (m->type) { + + case MOVE: + case CAPTURE: + b->square[m->fromy][m->fromx].color = NONE; + b->square[m->toy][m->tox].color = m->piece.color; + b->square[m->toy][m->tox].type = m->piece.type; + if ((m->piece.type == PAWN) && (((m->piece.color == BLACK) && + (m->toy == 7)) || ((m->piece.color == WHITE) && + (m->toy == 0)))) + b->square[m->toy][m->tox].type = QUEEN; + if (m->enpassant) + b->square[m->toy + ((m->piece.color == WHITE) ? 1 : + -1)][m->tox].color = NONE; + break; + + case KCASTLE: + if (m->piece.color == WHITE) { + b->square[7][5].color = m->piece.color; + b->square[7][5].type = ROOK; + b->square[7][6].color = m->piece.color; + b->square[7][6].type = KING; + b->square[7][4].color = NONE; + b->square[7][7].color = NONE; + } else { + b->square[0][5].color = m->piece.color; + b->square[0][5].type = ROOK; + b->square[0][6].color = m->piece.color; + b->square[0][6].type = KING; + b->square[0][4].color = NONE; + b->square[0][7].color = NONE; + } + break; + + case QCASTLE: + if (m->piece.color == WHITE) { + b->square[7][3].color = m->piece.color; + b->square[7][3].type = ROOK; + b->square[7][2].color = m->piece.color; + b->square[7][2].type = KING; + b->square[7][4].color = NONE; + b->square[7][0].color = NONE; + } else { + b->square[0][3].color = m->piece.color; + b->square[0][3].type = ROOK; + b->square[0][2].color = m->piece.color; + b->square[0][2].type = KING; + b->square[0][4].color = NONE; + b->square[0][0].color = NONE; + } + break; + + default: + fprintf(stderr, "Bad move type %d\n", m->type); + } + + if (m->piece.type == KING) { + if (m->piece.color == WHITE) + b->white_cant_castle_q = + b->white_cant_castle_k= true; + else + b->black_cant_castle_q = + b->black_cant_castle_k= true; + } else if (m->piece.type == ROOK) { + if (m->piece.color == WHITE) { + if (m->fromx == 0) + b->white_cant_castle_q = true; + else if (m->fromx == 7) + b->white_cant_castle_k = true; + } else { + if (m->fromx == 0) + b->black_cant_castle_q = true; + else if (m->fromx == 7) + b->black_cant_castle_k = true; + } + } + + return; +} + diff --git a/gnu/games/chess/Xchess/button.c b/gnu/games/chess/Xchess/button.c new file mode 100644 index 0000000..67bf3c8 --- /dev/null +++ b/gnu/games/chess/Xchess/button.c @@ -0,0 +1,337 @@ + +/* This file contains code for X-CHESS. + Copyright (C) 1986 Free Software Foundation, Inc. + +This file is part of X-CHESS. + +X-CHESS is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY. No author or distributor +accepts responsibility to anyone for the consequences of using it +or for whether it serves any particular purpose or works at all, +unless he says so in writing. Refer to the X-CHESS General Public +License for full details. + +Everyone is granted permission to copy, modify and redistribute +X-CHESS, but only under the conditions described in the +X-CHESS General Public License. A copy of this license is +supposed to have been given to you along with X-CHESS so you +can know your rights and responsibilities. It should be in a +file named COPYING. Among other things, the copyright notice +and this notice must be preserved on all copies. */ + + +/* RCS Info: $Revision: 1.4 $ on $Date: 86/11/26 12:09:41 $ + * $Source: /users/faustus/xchess/RCS/button.c,v $ + * Copyright (c) 1986 Wayne A. Christopher, U. C. Berkeley CAD Group + * Permission is granted to do anything with this code except sell it + * or remove this message. + * + * Do stuff with the buttons. + * The configuration we're using is: Draw Back Pause + * Resign Fwd Flip + * Reset Save Easy (Switch) + */ + +#include "xchess.h" + +typedef enum choice { NOCHOICE, DRAW, RESIGN, REPLAY, SWITCH, FORE, SAVE, + STOP, FLIP, RESTART, EASY } choice; + +static struct but { + char *label; + int x, y; + int width, height; + choice which; +} buts[] = { + { "Draw", 0, 20, 108, 29, DRAW } , + { "Back", 109, 20, 108, 29, REPLAY } , + { "Pause", 219, 20, 108, 29, STOP } , + { "Resign", 0, 50, 108, 29, RESIGN } , + { "Fwd", 109, 50, 108, 29, FORE } , + { "Flip", 219, 50, 108, 29, FLIP } , + { "Reset", 0, 80, 108, 29, RESTART } , + { "Save", 109, 80, 108, 29, SAVE } , +#define EASY_OFFSET 8 + { "Switch", 219, 80, 108, 29, SWITCH } +/* { "NoEasy", 219, 80, 108, 29, EASY }*/ +} ; +static int easy = 1; + +void +button_draw(win) + windata *win; +{ + int i, x, numbuts = sizeof (buts) / sizeof (struct but); + + XSetState(win->display, DefaultGC(win->display, 0), + win->border.pixel, WhitePixel(win->display, 0), + GXcopy, AllPlanes); + XSetLineAttributes(win->display, DefaultGC(win->display, 0), + BORDER_WIDTH, LineSolid, CapButt, + JoinMiter); + + XDrawLine(win->display, win->buttonwin, + DefaultGC(win->display, 0), + 0, 29, BUTTON_WIDTH, 29); + XDrawLine(win->display, win->buttonwin, + DefaultGC(win->display, 0), + 0, 60, BUTTON_WIDTH, 60); + XDrawLine(win->display, win->buttonwin, + DefaultGC(win->display, 0), + 108, 0, 108, BUTTON_HEIGHT); + XDrawLine(win->display, win->buttonwin, + DefaultGC(win->display, 0), + 219, 0, 219, BUTTON_HEIGHT); + + XSetFont(win->display, DefaultGC(win->display, 0), win->large->fid); + XSetForeground(win->display, DefaultGC(win->display, 0), + win->textcolor.pixel); + XSetBackground(win->display, DefaultGC(win->display, 0), + win->textback.pixel); + + for (i = 0; i < numbuts; i++) { + x = (buts[i].width - + XTextWidth(win->large, buts[i].label, + strlen(buts[i].label))) / 2; + + XDrawImageString(win->display, win->buttonwin, + DefaultGC(win->display, 0), + buts[i].x + x, buts[i].y, buts[i].label, + strlen(buts[i].label)); + } + return; +} + +void +button_service(win, event) + windata *win; + XEvent *event; +{ + XKeyEvent *ev = &event->xkey; + choice c; + int i, numbuts = sizeof (buts) / sizeof (struct but); + char *s; + + ev->y += 15; + for (i = 0; i < numbuts; i++) + if ((ev->x >= buts[i].x) && (ev->x <= buts[i].x + + buts[i].width) && (ev->y >= buts[i].y) && + (ev->y <= buts[i].y + buts[i].height)) { + c = buts[i].which; + break; + } + if ((i == numbuts) || (c == NOCHOICE)) { + message_add(win, "Bad choice.\n", true); + return; + } + + if (loading_flag && (c != STOP)) { + message_add(win, "You can only use PAUSE now\n", true); + return; + } + + switch (c) { + case DRAW: + if (!oneboard) { + message_add(win, "Just a sec...\n", false); + if (!pop_question(((win == win1) ? win2 : win1), +"The other player wants\nto call the game a draw.\nDo you agree?\n")) { + message_add(win, + "The other player declines the draw\n", false); + return; + } + } + message_add(win1, "Draw agreed.\n", false); + if (!oneboard) + message_add(win2, "Draw agreed.\n", false); + cleanup("Draw agreed."); + break; + + case RESIGN: + if (!pop_question(win, "Are you sure\nyou want to resign?")) + return; + if ((oneboard && !progflag) || (nexttomove == win->color)) { + if (nexttomove == WHITE) + s = "White resigns."; + else + s = "Black resigns."; + if (oneboard) { + message_add(win, s, false); + message_add(win, "\n", false); + } else { + message_add(win1, s, false); + message_add(win, "\n", false); + message_add(win2, s, false); + message_add(win, "\n", false); + } + sleep(5); + cleanup(s); + } else { + message_add(win, "It's not your turn.\n", true); + } + break; + + case REPLAY: + if (!oneboard) { + message_add(win, "Just a sec...\n", false); + if (!pop_question(((win == win1) ? win2 : win1), +"The other player wants\nto take back his last move.\nDo you let him?\n")) { + message_add(win, + "The other player refuses...\n", false); + return; + } + } + if (!moves) { + message_add(win, "Can't back up...\n", true); + break; + } + message_add(win1, "Replaying...\n", false); + if (!oneboard) + message_add(win2, "Replaying...\n", false); + replay(); + if (progflag) + replay(); + break; + + case FORE: + if (!oneboard) { + message_add(win, "Just a sec...\n", false); + if (!pop_question(((win == win1) ? win2 : win1), +"The other player wants\nto do a 'fore'.\nIs that ok with you?\n")) { + message_add(win, + "The other player refuses...\n", false); + return; + } + } + if (!foremoves) { + message_add(win, "Can't go forward...\n", true); + break; + } + message_add(win1, "Moving forward...\n", false); + if (!oneboard) + message_add(win2, "Moving forward...\n", false); + forward(); + break; + + case SWITCH: + message_add(win, "You can't switch yet.\n", false); + break; + + case SAVE: + if (saveflag) { + message_add(win, + "Game is already being logged in file '", true); + message_add(win, record_file, true); + message_add(win, "'.\n", true); + } else { + message_add(win, "Saving game to file '", false); + message_add(win, record_file, false); + message_add(win, "'.\n", false); + record_save(); + } + break; + + case STOP: + if (loading_flag) { + loading_paused = (loading_paused ? false : true); + message_add(win, loading_paused ? + "Stopped.\nHit 'Pause' again to restart.\n" : + "Restarted.\n", false); + } else if (clock_started) { + if (!oneboard) { + message_add(win, "Just a sec...\n", false); + if (!pop_question(((win == win1) ? win2 : win1), +"The other player wants\nto stop the clock.\nDo you let him?\n")) { + message_add(win, + "The other player refuses to pause.\n", + false); + return; + } + } + message_add(win1, + "Clock stopped.\nHit 'Pause' again to restart.\n", + false); + if (!oneboard) + message_add(win2, + "Clock stopped.\nHit 'Pause' again to restart.\n", + false); + clock_started = false; + } else { + if (!oneboard) { + message_add(win, "Just a sec...\n", false); + if (!pop_question(((win == win1) ? win2 : win1), +"The other player wants\nto start the clock again.\nIs that ok?\n")) { + message_add(win, + "The other player refuses to resume.\n", + false); + return; + } + } + message_add(win1, "Clock restarted.\n", false); + if (!oneboard) + message_add(win2, "Clock restarted.\n", false); + clock_started = true; + } + break; + + case FLIP: + message_add(win, "Flipping window...\n", false); + win->flipped = win->flipped ? false : true; + win_redraw(win, (XEvent *) NULL); + break; + + case RESTART: + if (!oneboard) { + message_add(win, "Just a sec...\n", false); + if (!pop_question(((win == win1) ? win2 : win1), +"The other player wants\nto restart the game.\nDo you agree?\n")) { + message_add(win, + "The other player refuses to reset\n", false); + return; + } + } + message_add(win, "Restarting game.\n", false); + restart(); + break; + case EASY: + if (oneboard) { + int x; + if (easy) + easy = 0; + else + easy = 1; + + if (easy) + buts[EASY_OFFSET].label = " Easy "; + else + buts[EASY_OFFSET].label = "NoEasy"; + + program_easy(easy); + + x = (buts[EASY_OFFSET].width - + XTextWidth(win->large, + buts[EASY_OFFSET].label, + strlen(buts[EASY_OFFSET].label))) / 2; + + XSetFont(win->display, DefaultGC(win->display, + 0), win->large->fid); + XSetForeground(win->display, + DefaultGC(win->display, 0), + win->textcolor.pixel); + XSetBackground(win->display, + DefaultGC(win->display, 0), + win->textback.pixel); + + XDrawImageString(win->display, + win->buttonwin, + DefaultGC(win->display, 0), + buts[EASY_OFFSET].x + x, + buts[EASY_OFFSET].y, + buts[EASY_OFFSET].label, + strlen(buts[EASY_OFFSET].label)); + } + break; + } + return; +} + diff --git a/gnu/games/chess/Xchess/clock.c b/gnu/games/chess/Xchess/clock.c new file mode 100644 index 0000000..a7b3c32 --- /dev/null +++ b/gnu/games/chess/Xchess/clock.c @@ -0,0 +1,291 @@ + +/* This file contains code for X-CHESS. + Copyright (C) 1986 Free Software Foundation, Inc. + +This file is part of X-CHESS. + +X-CHESS is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY. No author or distributor +accepts responsibility to anyone for the consequences of using it +or for whether it serves any particular purpose or works at all, +unless he says so in writing. Refer to the X-CHESS General Public +License for full details. + +Everyone is granted permission to copy, modify and redistribute +X-CHESS, but only under the conditions described in the +X-CHESS General Public License. A copy of this license is +supposed to have been given to you along with X-CHESS so you +can know your rights and responsibilities. It should be in a +file named COPYING. Among other things, the copyright notice +and this notice must be preserved on all copies. */ + + +/* RCS Info: $Revision: 1.4 $ on $Date: 86/11/26 12:09:47 $ + * $Source: /users/faustus/xchess/RCS/clock.c,v $ + * Copyright (c) 1986 Wayne A. Christopher, U. C. Berkeley CAD Group + * Permission is granted to do anything with this code except sell it + * or remove this message. + * + * Do stuff with the clocks. The way things work is as follows. We call + * clock_init to draw the clocks initially, but they don't actually start + * running until we call clock_switch for the first time. + */ + +#include "xchess.h" + +int movesperunit = 0; +int timeunit = 0; +bool clock_started = false; +int whiteseconds, blackseconds; + +static bool white_running = true; +static long lastwhite, lastblack; +static bool firstmove = true; + +extern void dohands(), hilight(); + +#define PI 3.1415926535897932384 + +void +clock_draw(win, col) + windata *win; + color col; +{ + int i; + char buf[BSIZE]; + int x = CLOCK_WIDTH / 2, y = CLOCK_WIDTH / 2; + int xp, yp; + int rad = CLOCK_WIDTH / 2 - 10; + Window w = ((col == WHITE) ? win->wclockwin : win->bclockwin); + + /* Draw a clock face and the hands. */ + XCircle(w, x, y, rad, 0.0, 0.0, 1, 1, win->textcolor.pixel, GXcopy, + AllPlanes); + rad -= 8; + + XSetFont(win->display, DefaultGC(win->display, 0), + win->small->fid); + XSetForeground(win->display, DefaultGC(win->display, 0), + win->textcolor.pixel); + XSetBackground(win->display, DefaultGC(win->display, 0), + win->textback.pixel); + for (i = 1; i <= 12; i++) { + xp = x + rad * cos(PI * 3 / 2 + i * PI / 6) - 4; + yp = y + rad * sin(PI * 3 / 2 + i * PI / 6) - 5; + sprintf(buf, "%d", i); + XDrawString(win->display, w, DefaultGC(win->display, 0), + xp, yp, buf, strlen(buf)); + } + + dohands(win, col); + + if (white_running) { + hilight(win, WHITE, true); + hilight(win, BLACK, false); + } else { + hilight(win, WHITE, false); + hilight(win, BLACK, true); + } + return; +} + +void +clock_init(win, col) + windata *win; + color col; +{ + whiteseconds = blackseconds = 0; + clock_started = false; + firstmove = true; + clock_draw(win, col); + + return; +} + +void +clock_update() +{ + int now = time((long *) NULL); + int i; + + if (!clock_started) { + lastwhite = lastblack = now; + return; + } + + if (white_running) { + whiteseconds += now - lastwhite; + lastwhite = now; + dohands(win1, WHITE); + if (!oneboard) + dohands(win2, WHITE); + if (timeunit) { + i = whiteseconds / timeunit; + if ((i > 0) && (whiteseconds > i * timeunit) && + (whiteseconds < i * timeunit + 10) && + (movesperunit * i > movenum)) { + message_add(win1, + "White has exceeded his time limit\n", + true); + if (!oneboard) { + message_add(win2, + "White has exceeded his time limit\n", + true); + } + timeunit = 0; + } + } + } else { + blackseconds += now - lastblack; + lastblack = now; + dohands(win1, BLACK); + if (!oneboard) + dohands(win2, BLACK); + if (timeunit) { + i = blackseconds / timeunit; + if ((i > 0) && (blackseconds > i * timeunit) && + (blackseconds < i * timeunit + 10) && + (movesperunit * i > movenum)) { + message_add(win1, + "Black has exceeded his time limit\n", + true); + if (!oneboard) { + message_add(win2, + "Black has exceeded his time limit\n", + true); + } + timeunit = 0; + } + } + } + return; +} + +void +clock_switch() +{ + if (firstmove) { + clock_started = true; + firstmove = false; + lastwhite = lastblack = time((long *) NULL); + } + if (white_running) { + white_running = false; + lastblack = time((long *) NULL); + hilight(win1, WHITE, false); + hilight(win1, BLACK, true); + if (!oneboard) { + hilight(win2, WHITE, false); + hilight(win2, BLACK, true); + } + } else { + white_running = true; + lastwhite = time((long *) NULL); + hilight(win1, WHITE, true); + hilight(win1, BLACK, false); + if (!oneboard) { + hilight(win2, WHITE, true); + hilight(win2, BLACK, false); + } + } + return; +} + +static void +dohands(win, col) + windata *win; + color col; +{ + int cx = CLOCK_WIDTH / 2, cy = CLOCK_WIDTH / 2; + double *h = (col == WHITE) ? win->whitehands : win->blackhands; + Window w = (col == WHITE) ? win->wclockwin : win->bclockwin; + long secs = (col == WHITE) ? whiteseconds : blackseconds; + int rad, x, y, i; + + /* First erase the old hands. */ + XSetState(win->display, DefaultGC(win->display, 0), + win->textback.pixel, win->textback.pixel, + GXcopy, AllPlanes); + + rad = CLOCK_WIDTH / 2 - 30; + for (i = 0; i < 3; i++) { + x = cx + rad * sin(PI - h[i]); + y = cy + rad * cos(PI - h[i]); + XSetLineAttributes(win->display, + DefaultGC(win->display, 0), + i, LineSolid, 0, 0); + XDrawLine(win->display, w, DefaultGC(win->display, 0), + cx, cy, x, y); + rad -= 8; + } + + h[0] = (secs % 60) * 2 * PI / 60; + h[1] = ((secs / 60) % 60) * 2 * PI / 60; + h[2] = ((secs / 3600) % 12) * 2 * PI / 12; + + /* Now draw the new ones. */ + + XSetState(win->display, DefaultGC(win->display, 0), + win->textcolor.pixel, win->textback.pixel, + GXcopy, AllPlanes); + + rad = CLOCK_WIDTH / 2 - 30; + for (i = 0; i < 3; i++) { + x = cx + rad * sin(PI - h[i]); + y = cy + rad * cos(PI - h[i]); + XSetLineAttributes(win->display, + DefaultGC(win->display, 0), + i, LineSolid, 0, 0); + XDrawLine(win->display, w, DefaultGC(win->display, 0), + cx, cy, x, y); + rad -= 8; + } + XFlush(win->display); + return; +} + +static void +hilight(win, col, on) + windata *win; + color col; + bool on; +{ + Window w = (col == WHITE) ? win->wclockwin : win->bclockwin; + char *s = (col == WHITE) ? " WHITE " : " BLACK "; + int x; + + + x = XTextWidth(win->large, s, strlen(s)); + if (on) + XSetState(win->display, DefaultGC(win->display, 0), + win->textback.pixel, + win->textcolor.pixel, + GXcopy, + AllPlanes); + else + XSetState(win->display, DefaultGC(win->display, 0), + win->textcolor.pixel, + win->textback.pixel, + GXcopy, AllPlanes); + + XSetLineAttributes(win->display, DefaultGC(win->display, 0), + BORDER_WIDTH, LineSolid, CapButt, JoinMiter); + XSetFont(win->display, DefaultGC(win->display, 0), + win->large->fid); + + XDrawLine(win->display, w, DefaultGC(win->display, 0), + 0, CLOCK_HEIGHT - 26, + CLOCK_WIDTH, CLOCK_HEIGHT - 26); + + XDrawImageString(win->display, w, DefaultGC(win->display, 0), + (CLOCK_WIDTH - x) / 2, CLOCK_HEIGHT, + s, strlen(s)); + + if (on) + XSetState(win->display, DefaultGC(win->display, 0), + win->textcolor.pixel, + win->textback.pixel, + GXcopy, AllPlanes); + return; +} + diff --git a/gnu/games/chess/Xchess/control.c b/gnu/games/chess/Xchess/control.c new file mode 100644 index 0000000..ad2e1d7 --- /dev/null +++ b/gnu/games/chess/Xchess/control.c @@ -0,0 +1,515 @@ +/* This file contains code for X-CHESS. + Copyright (C) 1986 Free Software Foundation, Inc. + +This file is part of X-CHESS. + +X-CHESS is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY. No author or distributor +accepts responsibility to anyone for the consequences of using it +or for whether it serves any particular purpose or works at all, +unless he says so in writing. Refer to the X-CHESS General Public +License for full details. + +Everyone is granted permission to copy, modify and redistribute +X-CHESS, but only under the conditions described in the +X-CHESS General Public License. A copy of this license is +supposed to have been given to you along with X-CHESS so you +can know your rights and responsibilities. It should be in a +file named COPYING. Among other things, the copyright notice +and this notice must be preserved on all copies. */ + + +/* RCS Info: $Revision: 1.4 $ on $Date: 86/11/23 17:17:32 $ + * $Source: /users/faustus/xchess/RCS/control.c,v $ + * Copyright (c) 1986 Wayne A. Christopher, U. C. Berkeley CAD Group + * Permission is granted to do anything with this code except sell it + * or remove this message. + * + * Deal with input from the user. + */ + +#include "xchess.h" + +move *moves; +move *foremoves; +color nexttomove = WHITE; +bool noisyflag = false; + +move *lastmove; +static move *thismove; + +static void screen_move(); + +void +button_pressed(event, win) + XEvent *event; + windata *win; +{ + int x, y; + XKeyEvent *ev = (XKeyEvent *) event; + + if (!oneboard && (win->color != nexttomove)) { + message_add(win, "Wrong player!\n", true); + return; + } + if (progflag && (nexttomove == (blackflag ? WHITE : BLACK))) { + message_add(win, "Wait for the computer...\n", true); + return; + } + if (loading_flag) { + message_add(win, "You'd better not do that now...\n", true); + return; + } + + /* Figure out what piece he is pointing at. */ + x = ev->x / (SQUARE_WIDTH + BORDER_WIDTH); + y = ev->y / (SQUARE_HEIGHT + BORDER_WIDTH); + + if (win->flipped) { + y = SIZE - y - 1; + x = SIZE - x - 1; + } + + if ((x < 0) || (x >= SIZE) || (y < 0) || (y >= SIZE)) { + fprintf(stderr, "Bad coords (%d, %d)\n", x, y); + return; + } + + if (oneboard && (chessboard->square[y][x].color != nexttomove)) { + message_add(win, "Wrong player!\n", true); + return; + } else if (!oneboard && (chessboard->square[y][x].color != + win->color)) { + message_add(win, "Can't move that\n", true); + return; + } + + thismove = alloc(move); + thismove->fromx = x; + thismove->fromy = y; + thismove->piece.color = chessboard->square[y][x].color; + thismove->piece.type = chessboard->square[y][x].type; + + if (debug) + fprintf(stderr, "%s selected his %s at (%d, %d)...\n", + colornames[(int) thismove->piece.color], + piecenames[(int) thismove->piece.type], + thismove->fromy, thismove->fromx); + return; +} + +void +button_released(event, win) + XEvent *event; + windata *win; +{ + int x, y; + XKeyEvent *ev = (XKeyEvent *) event; + + if (!thismove) { + /* fprintf(stderr, "Error: button hasn't been pressed\n"); */ + return; + } + if (loading_flag) + return; + + /* Figure out what piece he is pointing at. */ + x = ev->x / (SQUARE_WIDTH + BORDER_WIDTH); + y = ev->y / (SQUARE_HEIGHT + BORDER_WIDTH); + + if (win->flipped) { + y = SIZE - y - 1; + x = SIZE - x - 1; + } + + if ((x < 0) || (x >= SIZE) || (y < 0) || (y >= SIZE)) { + fprintf(stderr, "Bad coords (%d, %d)\n", x, y); + return; + } + + if ((thismove->fromx == x) && (thismove->fromy == y)) { + message_add(win, "Hey, you touch it, you move it, buddy.\n", + true); + return; + } + if (chessboard->square[y][x].color == thismove->piece.color) { + message_add(win, "Can't put one piece on top of another\n", + true); + return; + } + + thismove->tox = x; + thismove->toy = y; + thismove->taken.color = chessboard->square[y][x].color; + thismove->taken.type = chessboard->square[y][x].type; + if (thismove->taken.color != NONE) + thismove->type = CAPTURE; + else if ((thismove->piece.type == KING) && (thismove->fromx == 4) && + (thismove->tox == 6) && + (thismove->toy == thismove->fromy)) + thismove->type = KCASTLE; + else if ((thismove->piece.type == KING) && (thismove->tox == 2) && + (thismove->fromx == 4) && + (thismove->toy == thismove->fromy)) + thismove->type = QCASTLE; + else + thismove->type = MOVE; + + /* Now check the en-passant case... */ + if ((thismove->type == MOVE) && ((thismove->tox == thismove->fromx + 1) + || (thismove->tox == thismove->fromx - 1)) && + (thismove->piece.type == PAWN) && lastmove && + (lastmove->tox == lastmove->fromx) && (lastmove->fromx + == thismove->tox) && ((lastmove->fromy + lastmove->toy) + / 2 == thismove->toy)) { + thismove->type = CAPTURE; + thismove->enpassant = true; + thismove->taken = lastmove->piece; + } + + if (!valid_move(thismove, chessboard)) { + message_add(win, "Invalid move.\n", true); + return; + } + + if (debug) + fprintf(stderr, "\t... and moved it to (%d, %d), type %s\n", + thismove->toy, thismove->tox, + movetypenames[(int) thismove->type]); + move_piece(thismove); + + if (thismove->check) { + message_add(win1, "Check.\n", true); + if (!oneboard) { + message_add(win2, "Check.\n", true); + } + } + + if (!moves) + moves = lastmove = thismove; + else + lastmove = lastmove->next = thismove; + + if (progflag) + program_send(thismove); + + thismove = NULL; + nexttomove = ((nexttomove == WHITE) ? BLACK : WHITE); + clock_switch(); + + return; +} + +void +prog_move(m) + move *m; +{ + if (debug) + fprintf(stderr, "program moves from (%d, %d) to (%d, %d)\n", + m->fromy, m->fromx, m->toy, m->tox); + move_piece(m); + + if (!moves) + moves = lastmove = m; + else + lastmove = lastmove->next = m; + + nexttomove = ((nexttomove == WHITE) ? BLACK : WHITE); + clock_switch(); + + return; +} + +void +move_piece(m) + move *m; +{ + /* Update the screen... */ + screen_move(m); + + /* Move the piece on the board... */ + board_move(chessboard, m); + + /* And record it... */ + record_move(m); + + if (noisyflag) { + XBell(win1->display, 50); + XBell(win2->display, 50); + } + return; +} + +static void +screen_move(m) + move *m; +{ + piece pp; + + switch (m->type) { + case CAPTURE: + jail_add(&m->taken); + /* FALLTHRU */ + + case MOVE: + win_erasepiece(m->fromy, m->fromx, WHITE); + if (win_flashmove) + win_flash(m, WHITE); + win_drawpiece(&m->piece, m->toy, m->tox, WHITE); + if (m->enpassant) + win_erasepiece(m->toy + ((m->piece.color == WHITE) ? + 1 : -1), m->tox, WHITE); + if (!oneboard) { + win_erasepiece(m->fromy, m->fromx, BLACK); + if (win_flashmove) + win_flash(m, BLACK); + win_drawpiece(&m->piece, m->toy, m->tox, BLACK); + if (m->enpassant) + win_erasepiece(m->toy + ((m->piece.color == + WHITE) ? 1 : -1), m->tox, WHITE); + } + if ((m->piece.type == PAWN) && (((m->piece.color == BLACK) && + (m->toy == 7)) || ((m->piece.color == WHITE) && + (m->toy == 0)))) { + pp.color = m->piece.color; + pp.type = QUEEN; + win_drawpiece(&pp, m->toy, m->tox, WHITE); + if (!oneboard) + win_drawpiece(&m->piece, m->toy, m->tox, BLACK); + } + break; + + case KCASTLE: + if (m->piece.color == WHITE) { + win_erasepiece(7, 4, WHITE); + win_erasepiece(7, 7, WHITE); + if (win_flashmove) + win_flash(m, WHITE); + win_drawpiece(&m->piece, 7, 6, WHITE); + win_drawpiece(&chessboard->square[7][7], 7, 5, WHITE); + if (!oneboard) { + win_erasepiece(7, 4, BLACK); + win_erasepiece(7, 7, BLACK); + if (win_flashmove) + win_flash(m, BLACK); + win_drawpiece(&m->piece, 7, 6, BLACK); + win_drawpiece(&chessboard->square[7][7], 7, 5, + BLACK); + } + } else { + win_erasepiece(0, 4, WHITE); + win_erasepiece(0, 7, WHITE); + if (win_flashmove) + win_flash(m, WHITE); + win_drawpiece(&m->piece, 0, 6, WHITE); + win_drawpiece(&chessboard->square[0][7], 0, 5, WHITE); + if (!oneboard) { + win_erasepiece(0, 4, BLACK); + win_erasepiece(0, 7, BLACK); + if (win_flashmove) + win_flash(m, BLACK); + win_drawpiece(&m->piece, 0, 6, BLACK); + win_drawpiece(&chessboard->square[0][7], 0, 5, + BLACK); + } + } + break; + + case QCASTLE: + if (m->piece.color == WHITE) { + win_erasepiece(7, 4, WHITE); + win_erasepiece(7, 0, WHITE); + if (win_flashmove) + win_flash(m, WHITE); + win_drawpiece(&m->piece, 7, 2, WHITE); + win_drawpiece(&chessboard->square[7][0], 7, 3, WHITE); + if (!oneboard) { + win_erasepiece(7, 4, BLACK); + win_erasepiece(7, 0, BLACK); + if (win_flashmove) + win_flash(m, BLACK); + win_drawpiece(&m->piece, 7, 2, BLACK); + win_drawpiece(&chessboard->square[7][7], 7, 3, + BLACK); + } + } else { + win_erasepiece(0, 4, WHITE); + win_erasepiece(0, 0, WHITE); + if (win_flashmove) + win_flash(m, WHITE); + win_drawpiece(&m->piece, 0, 2, WHITE); + win_drawpiece(&chessboard->square[0][0], 0, 3, WHITE); + if (!oneboard) { + win_erasepiece(0, 4, BLACK); + win_erasepiece(0, 0, BLACK); + if (win_flashmove) + win_flash(m, BLACK); + win_drawpiece(&m->piece, 0, 2, BLACK); + win_drawpiece(&chessboard->square[0][7], 0, 3, + BLACK); + } + } + break; + + default: + fprintf(stderr, "Bad move type %d\n", m->type); + } + return; +} + +/* Retract the last move made... */ + +void +replay() +{ + move *m = lastmove, bm; + + memset(&bm, 0, sizeof(bm)); + switch (m->type) { + case MOVE: + bm.type = MOVE; + bm.piece = m->piece; + bm.fromx = m->tox; + bm.fromy = m->toy; + bm.tox = m->fromx; + bm.toy = m->fromy; + board_move(chessboard, &bm); + screen_move(&bm); + break; + + case CAPTURE: + bm.type = MOVE; + bm.piece = m->piece; + bm.fromx = m->tox; + bm.fromy = m->toy; + bm.tox = m->fromx; + bm.toy = m->fromy; + board_move(chessboard, &bm); + screen_move(&bm); + chessboard->square[m->toy][m->tox] = m->taken; + bm.piece = m->taken; + bm.fromx = bm.tox = m->tox; + bm.fromy = bm.toy = m->toy; + screen_move(&bm); + jail_remove(&m->taken); + break; + + case KCASTLE: + bm.type = MOVE; + bm.piece.type = KING; + bm.piece.color = m->piece.color; + bm.fromx = 6; + bm.tox = 4; + bm.fromy = bm.toy = (m->piece.color == WHITE) ? 7 : 0; + board_move(chessboard, &bm); + screen_move(&bm); + bm.type = MOVE; + bm.piece.type = ROOK; + bm.piece.color = m->piece.color; + bm.fromx = 5; + bm.tox = 7; + bm.fromy = bm.toy = (m->piece.color == WHITE) ? 7 : 0; + board_move(chessboard, &bm); + screen_move(&bm); + if (m->piece.color == WHITE) + chessboard->white_cant_castle_k = false; + else + chessboard->black_cant_castle_k = false; + break; + + case QCASTLE: + bm.type = MOVE; + bm.piece.type = KING; + bm.piece.color = m->piece.color; + bm.fromx = 2; + bm.tox = 4; + bm.fromy = bm.toy = (m->piece.color == WHITE) ? 7 : 0; + board_move(chessboard, &bm); + screen_move(&bm); + bm.type = MOVE; + bm.piece.type = ROOK; + bm.piece.color = m->piece.color; + bm.fromx = 3; + bm.tox = 0; + bm.fromy = bm.toy = (m->piece.color == WHITE) ? 7 : 0; + board_move(chessboard, &bm); + screen_move(&bm); + if (m->piece.color == WHITE) + chessboard->white_cant_castle_q = false; + else + chessboard->black_cant_castle_q = false; + break; + } + record_back(); + + nexttomove = ((nexttomove == WHITE) ? BLACK : WHITE); + clock_switch(); + + if (!moves->next) { + moves->next = foremoves; + foremoves = moves; + moves = lastmove = NULL; + } else { + for (m = moves; m->next; m = m->next) + lastmove = m; + lastmove->next->next = foremoves; + foremoves = lastmove->next; + lastmove->next = NULL; + } + + if (progflag) + program_undo(); + + return; +} + +/* Put back the last move undone. */ + +void +forward() +{ + prog_move(foremoves); + foremoves = foremoves->next; + return; +} + +/* End the game. */ + +void +cleanup(s) + char *s; +{ + if (progflag) + program_end(); + record_end(s); + XSync(win1->display, 0); + if (!oneboard) { + XSync(win2->display, 0); + } + exit(0); +} + +void +restart() +{ + moves = lastmove = thismove = NULL; + nexttomove = WHITE; + + clock_init(win1, WHITE); + clock_init(win1, BLACK); + jail_init(win1); + if (!oneboard) { + clock_init(win2, WHITE); + clock_init(win2, BLACK); + jail_init(win2); + } + board_init(chessboard); + win_restart(); + record_reset(); + if (progflag) { + program_end(); + program_init(progname); + } + return; +} + diff --git a/gnu/games/chess/Xchess/jail.c b/gnu/games/chess/Xchess/jail.c new file mode 100644 index 0000000..e5e6064 --- /dev/null +++ b/gnu/games/chess/Xchess/jail.c @@ -0,0 +1,327 @@ + +/* This file contains code for X-CHESS. + Copyright (C) 1986 Free Software Foundation, Inc. + +This file is part of X-CHESS. + +X-CHESS is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY. No author or distributor +accepts responsibility to anyone for the consequences of using it +or for whether it serves any particular purpose or works at all, +unless he says so in writing. Refer to the X-CHESS General Public +License for full details. + +Everyone is granted permission to copy, modify and redistribute +X-CHESS, but only under the conditions described in the +X-CHESS General Public License. A copy of this license is +supposed to have been given to you along with X-CHESS so you +can know your rights and responsibilities. It should be in a +file named COPYING. Among other things, the copyright notice +and this notice must be preserved on all copies. */ + + +/* RCS Info: $Revision: 1.3 $ on $Date: 86/11/26 12:09:54 $ + * $Source: /users/faustus/xchess/RCS/jail.c,v $ + * Copyright (c) 1986 Wayne A. Christopher, U. C. Berkeley CAD Group + * Permission is granted to do anything with this code except sell it + * or remove this message. + * + */ + +#include "xchess.h" + +#include "pawn_small.bitmap" +#include "rook_small.bitmap" +#include "knight_small.bitmap" +#include "bishop_small.bitmap" +#include "queen_small.bitmap" +#include "king_small.bitmap" + +#include "pawn_small_outline.bitmap" +#include "rook_small_outline.bitmap" +#include "knight_small_outline.bitmap" +#include "bishop_small_outline.bitmap" +#include "queen_small_outline.bitmap" +#include "king_small_outline.bitmap" + +static bool pos[32]; + +static piecetype pcs[] = { KING, QUEEN, ROOK, ROOK, BISHOP, BISHOP, KNIGHT, + KNIGHT, PAWN, PAWN, PAWN, PAWN, PAWN, PAWN, PAWN, PAWN } ; + +extern int piecepos(); +extern char *bitsget(); + +void +jail_init(win) + windata *win; +{ + int i; + + for (i = 0; i < 32; i++) + pos[i] = false; + jail_draw(win); + return; +} + +#define JAIL_HEADER "Captured Pieces" + +void +jail_draw(win) + windata *win; +{ + int i; + char *bits; + Pixmap tmpPM; + piece p; + + i = XTextWidth(win->large, JAIL_HEADER, strlen(JAIL_HEADER)); + XSetFont(win->display, DefaultGC(win->display, 0), + win->large->fid); + XSetForeground(win->display, DefaultGC(win->display, 0), + win->textcolor.pixel); + XSetBackground(win->display, DefaultGC(win->display, 0), + win->textback.pixel); + + XDrawImageString(win->display, win->jailwin, + DefaultGC(win->display, 0), + (JAIL_WIDTH - i) / 2, 20, JAIL_HEADER, + strlen(JAIL_HEADER)); + + XSetForeground(win->display, DefaultGC(win->display, 0), + win->blackpiece.pixel); + XSetBackground(win->display, DefaultGC(win->display, 0), + win->textback.pixel); + XSetFillStyle(win->display, DefaultGC(win->display, 0), + FillSolid); + XSetFunction(win->display, DefaultGC(win->display, 0), + GXcopy); + + for (i = 0; i < 16; i++) + if (pos[i]) { + p.color = WHITE; + p.type = pcs[i]; + bits = bitsget(&p); + tmpPM = XCreateBitmapFromData(win->display, + win->jailwin, bits, + 32, 32); + + XCopyPlane(win->display, tmpPM, win->jailwin, + DefaultGC(win->display, 0), + 0, 0, 32, 32, + 5 + (i % 8) * 32, 25 + (i / 8) * 32, + 1); + XFreePixmap(win->display, tmpPM); + } else { + XFillRectangle(win->display, win->jailwin, + DefaultGC(win->display, 0), + 5 + (i % 8) * 32, + 25 + (i / 8) * 32, + 32, 32); + } + for (i = 0; i < 16; i++) + if (pos[i + 16]) { + p.color = BLACK; + p.type = pcs[i]; + bits = bitsget(&p); + tmpPM = XCreateBitmapFromData(win->display, + win->jailwin, bits, + 32, 32); + + XCopyPlane(win->display, tmpPM, win->jailwin, + DefaultGC(win->display, 0), + 0, 0, 32, 32, + 5 + (i % 8) * 32, 94 + (i / 8) * 32, + 1); + XFreePixmap(win->display, tmpPM); + } else { + XFillRectangle(win->display, win->jailwin, + DefaultGC(win->display, 0), + 5 + (i % 8) * 32, 94 + (i / 8) * 32, + 32, 32); + } + + return; +} + +void +jail_add(p) + piece *p; +{ + int i = piecepos(p, false); + char *bits; + Pixmap tmpPM; + + pos[i] = true; + + bits = bitsget(p); + + XSetState(win1->display, DefaultGC(win1->display, 0), + win1->blackpiece.pixel, + win1->textback.pixel, + GXcopy, + AllPlanes); + + tmpPM = XCreateBitmapFromData(win1->display, + win1->jailwin, bits, + 32, 32); + + XCopyPlane(win1->display, tmpPM, win1->jailwin, + DefaultGC(win1->display, 0), + 0, 0, 32, 32, + 5 + (i % 8) * 32, ((i >= 16) ? 30 : 25) + (i / 8) * 32, + 1); + XFreePixmap(win1->display, tmpPM); + + if (!oneboard) { + XSetState(win2->display, DefaultGC(win2->display, 0), + win2->blackpiece.pixel, + win2->textback.pixel, + GXcopy, + AllPlanes); + + + tmpPM = XCreateBitmapFromData(win2->display, + win2->jailwin, bits, + 32, 32); + + XCopyPlane(win2->display, tmpPM, win2->jailwin, + DefaultGC(win2->display, 0), + 0, 0, 32, 32, + 5 + (i % 8) * 32, ((i >= 16) ? 30 : 25) + (i / 8) * 32, + 1); + XFreePixmap(win2->display, tmpPM); + } + + return; +} + +void +jail_remove(p) + piece *p; +{ + int i = piecepos(p, true); + + pos[i] = false; + + + XSetForeground(win1->display, + DefaultGC(win1->display, 0), + win1->blackpiece.pixel); + XSetBackground(win1->display, + DefaultGC(win1->display, 0), + win1->textback.pixel); + XSetFillStyle(win1->display, + DefaultGC(win1->display, 0), + FillSolid); + + XFillRectangle(win1->display, win1->jailwin, + DefaultGC(win1->display, 0), + 5 + (i % 8) * 32, + ((i >= 16) ? 30 : 25) + (i / 8) * 32, + 32, 32); + + if (!oneboard) { + XSetForeground(win2->display, + DefaultGC(win2->display, 0), + win2->blackpiece.pixel); + XSetBackground(win2->display, + DefaultGC(win2->display, 0), + win2->textback.pixel); + XSetFillStyle(win2->display, + DefaultGC(win2->display, 0), + FillSolid); + + XFillRectangle(win2->display, win2->jailwin, + DefaultGC(win2->display, 0), + 5 + (i % 8) * 32, + ((i >= 16) ? 30 : 25) + (i / 8) * 32, + 32, 32); + } + + return; +} + +static char *bitsget(p) + piece *p; +{ + char *bits; + + switch (p->type) { + case PAWN: + bits = (p->color == WHITE) ? pawn_small_outline_bits : + pawn_small_bits; + break; + + case ROOK: + bits = (p->color == WHITE) ? rook_small_outline_bits : + rook_small_bits; + break; + + case KNIGHT: + bits = (p->color == WHITE) ? knight_small_outline_bits : + knight_small_bits; + break; + + case BISHOP: + bits = (p->color == WHITE) ? bishop_small_outline_bits : + bishop_small_bits; + break; + + case QUEEN: + bits = (p->color == WHITE) ? queen_small_outline_bits : + queen_small_bits; + break; + + case KING: + bits = (p->color == WHITE) ? king_small_outline_bits : + king_small_bits; + break; + } + return (bits); +} + +static int +piecepos(p, there) + piece *p; + bool there; +{ + int i, base = (p->color == WHITE) ? 0 : 16; + + switch (p->type) { + case PAWN: + for (i = base + 8; (i < base + 15) && pos[i]; i++) + ; + if (there && !pos[i]) + i--; + break; + + case KING: + /* Hmm... */ + i = base; + break; + + case QUEEN: + i = base + 1; + break; + + case ROOK: + i = base + 2; + if ((there && pos[i + 1]) || (!there && pos[i])) + i++; + break; + + case BISHOP: + i = base + 4; + if ((there && pos[i + 1]) || (!there && pos[i])) + i++; + break; + + case KNIGHT: + i = base + 6; + if ((there && pos[i + 1]) || (!there && pos[i])) + i++; + break; + } + return (i); +} diff --git a/gnu/games/chess/Xchess/king.bitmap b/gnu/games/chess/Xchess/king.bitmap new file mode 100644 index 0000000..dd9178a --- /dev/null +++ b/gnu/games/chess/Xchess/king.bitmap @@ -0,0 +1,71 @@ + +#define king_width 80 +#define king_height 80 +static char king_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x03, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x0f, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x0f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xe0, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x1f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x1f, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xf8, 0x1f, 0x00, 0x30, 0x18, 0x00, 0xfc, 0x1f, 0x00, + 0x00, 0xfe, 0x7f, 0x00, 0xb8, 0x3b, 0x00, 0xff, 0x7f, 0x00, 0x00, 0xff, + 0xff, 0x00, 0xb8, 0x3b, 0x80, 0xff, 0xff, 0x00, 0x80, 0xff, 0xff, 0x03, + 0xb8, 0x3b, 0xe0, 0xff, 0xff, 0x01, 0xc0, 0xff, 0xff, 0x0f, 0xb8, 0x3b, + 0xf0, 0xff, 0xff, 0x03, 0xe0, 0xff, 0xff, 0x1f, 0xb8, 0x3b, 0xf8, 0xff, + 0xf8, 0x07, 0xe0, 0x1f, 0xc0, 0x3f, 0xb8, 0x3b, 0xfc, 0x07, 0xe2, 0x07, + 0xf0, 0xcf, 0x9f, 0x7f, 0x30, 0x18, 0xfe, 0xf3, 0xcf, 0x0f, 0xf0, 0xe7, + 0x3f, 0xfe, 0xf0, 0x1f, 0x7e, 0xfc, 0xdf, 0x0f, 0xf0, 0xf3, 0xff, 0xfc, + 0xf1, 0x1f, 0x3f, 0xff, 0x9f, 0x0f, 0xf8, 0xfb, 0xff, 0xfd, 0xf3, 0x9f, + 0xbf, 0xff, 0xbf, 0x1f, 0xf8, 0xf9, 0xff, 0xf9, 0xe3, 0x8f, 0xdf, 0xff, + 0x3f, 0x1f, 0xf8, 0xfd, 0xff, 0xf3, 0xef, 0xcf, 0xcf, 0xff, 0x7f, 0x1f, + 0xf8, 0xfd, 0xff, 0xe7, 0xef, 0xef, 0xef, 0xff, 0x7f, 0x1f, 0xfc, 0xfd, + 0xff, 0xcf, 0xff, 0xff, 0xe7, 0x3f, 0x7c, 0x3f, 0xfc, 0x3c, 0xfc, 0xdf, + 0xff, 0xfe, 0xf3, 0x3d, 0x7c, 0x3f, 0xfc, 0x3e, 0xfc, 0x9e, 0x7f, 0xfc, + 0xf9, 0x39, 0x7c, 0x3f, 0xfc, 0x3e, 0x7c, 0xbe, 0x3f, 0xf8, 0xf9, 0x3b, + 0x7c, 0x3f, 0xfc, 0x3e, 0x78, 0x3f, 0x7f, 0xfc, 0xfc, 0x3b, 0x7f, 0x3f, + 0xfc, 0xfe, 0x7b, 0x7f, 0xff, 0xfe, 0xfe, 0x9b, 0x7f, 0x3f, 0xf8, 0xfe, + 0xbb, 0x7f, 0xfe, 0x7f, 0xfe, 0xdb, 0x79, 0x1f, 0xf8, 0xfe, 0xb3, 0xff, + 0xfe, 0x7f, 0xff, 0xcb, 0x7c, 0x1f, 0xf8, 0x9e, 0xb7, 0xff, 0xfe, 0x7f, + 0xff, 0x2b, 0x3e, 0x1f, 0xf8, 0x3e, 0xa6, 0xff, 0xfc, 0x7f, 0xff, 0xa3, + 0xbf, 0x1f, 0xf8, 0xfe, 0xa8, 0xff, 0xfd, 0x3e, 0xff, 0xd3, 0xbf, 0x1f, + 0xf8, 0xfd, 0x83, 0xff, 0x7d, 0xbc, 0xff, 0xc3, 0xbf, 0x1f, 0xf0, 0xfd, + 0x8f, 0xff, 0x39, 0xb8, 0xff, 0xe3, 0xbf, 0x1f, 0xf0, 0xfd, 0x9f, 0xff, + 0x7b, 0xbc, 0xff, 0xf1, 0x9f, 0x0f, 0xf0, 0xf9, 0xbf, 0xff, 0xfb, 0xbe, + 0xff, 0xfd, 0xdf, 0x0f, 0xf0, 0xfb, 0x3f, 0xff, 0xf3, 0x9f, 0xff, 0xfd, + 0xdf, 0x0f, 0xf0, 0xf3, 0x7f, 0xff, 0xf7, 0xdf, 0xff, 0xfc, 0xdf, 0x0f, + 0xe0, 0xf7, 0x7f, 0xfe, 0xf7, 0xdf, 0xff, 0xfe, 0xdf, 0x07, 0xe0, 0xf7, + 0xff, 0xfe, 0xf7, 0xdf, 0x7f, 0xfe, 0xcf, 0x07, 0xe0, 0xe7, 0xff, 0xfe, + 0xf7, 0xdf, 0x7f, 0xff, 0xef, 0x07, 0xc0, 0xef, 0xff, 0xfc, 0xef, 0xee, + 0x7f, 0xff, 0xe7, 0x03, 0xc0, 0xcf, 0xff, 0xfd, 0x6f, 0xec, 0x3f, 0xff, + 0xf7, 0x03, 0x80, 0xdf, 0xff, 0xf9, 0xef, 0xee, 0xbf, 0xff, 0xf3, 0x01, + 0x80, 0x9f, 0xff, 0xfb, 0xef, 0xef, 0x9f, 0xff, 0xfb, 0x01, 0x00, 0xbf, + 0xff, 0xfb, 0xef, 0xef, 0xdf, 0xff, 0xf9, 0x00, 0x00, 0x7e, 0xff, 0xf3, + 0xef, 0xef, 0xdf, 0xff, 0x7e, 0x00, 0x00, 0x7e, 0xfe, 0xff, 0xef, 0xef, + 0xff, 0x7f, 0x7e, 0x00, 0x00, 0xfc, 0xfc, 0xff, 0xef, 0xef, 0xff, 0x7f, + 0x3f, 0x00, 0x00, 0xfc, 0xf9, 0xff, 0xef, 0xef, 0xff, 0x3f, 0x1f, 0x00, + 0x00, 0xf8, 0xfb, 0x03, 0xe0, 0x0f, 0x00, 0x9f, 0x1f, 0x00, 0x00, 0xf0, + 0x03, 0xf8, 0xff, 0xff, 0x7f, 0xc0, 0x0f, 0x00, 0x00, 0xe0, 0xff, 0xbf, + 0xf7, 0xde, 0xfb, 0xff, 0x07, 0x00, 0x00, 0xc0, 0xff, 0x1d, 0x63, 0x8c, + 0x71, 0xff, 0x03, 0x00, 0x00, 0x80, 0xef, 0xb8, 0xf7, 0xde, 0x3b, 0xee, + 0x01, 0x00, 0x00, 0x00, 0xc7, 0xfd, 0xff, 0xff, 0x7f, 0xc7, 0x00, 0x00, + 0x00, 0x00, 0xee, 0xff, 0x00, 0x00, 0xfc, 0x6f, 0x00, 0x00, 0x00, 0x00, + 0xfe, 0x03, 0xfe, 0xff, 0x01, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x06, 0xf8, + 0x7f, 0xfc, 0x7f, 0x60, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0x1f, 0xf0, + 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xff, 0x07, 0xc0, 0xff, 0x63, + 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0x1f, 0xf0, 0xff, 0x60, 0x00, 0x00, + 0x00, 0x00, 0x06, 0xfc, 0x7f, 0xfc, 0x3f, 0x60, 0x00, 0x00, 0x00, 0x00, + 0x06, 0xff, 0xff, 0xff, 0xff, 0x60, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xff, + 0x00, 0x00, 0xfc, 0x63, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x03, 0xfe, 0xff, + 0x01, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x06, 0xf8, 0xff, 0xff, 0x7f, 0x60, + 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, + 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; diff --git a/gnu/games/chess/Xchess/king_mask.bitmap b/gnu/games/chess/Xchess/king_mask.bitmap new file mode 100644 index 0000000..e1bb523 --- /dev/null +++ b/gnu/games/chess/Xchess/king_mask.bitmap @@ -0,0 +1,71 @@ + +#define king_mask_width 80 +#define king_mask_height 80 +static char king_mask_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x1f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x1f, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x1f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xf0, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xf0, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xf8, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x3f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x3f, 0x00, 0xf8, 0x3f, 0x00, 0xfe, + 0x3f, 0x00, 0x00, 0xff, 0xff, 0x00, 0xfc, 0x3f, 0x80, 0xff, 0x7f, 0x00, + 0x80, 0xff, 0xff, 0x01, 0xfc, 0x7f, 0xc0, 0xff, 0xff, 0x00, 0xc0, 0xff, + 0xff, 0x07, 0xfc, 0x7f, 0xe0, 0xff, 0xff, 0x01, 0xe0, 0xff, 0xff, 0x1f, + 0xfc, 0x7f, 0xf8, 0xff, 0xff, 0x07, 0xe0, 0xff, 0xff, 0x3f, 0xfc, 0x7f, + 0xfc, 0xff, 0xff, 0x0f, 0xf0, 0xff, 0xff, 0x7f, 0xfc, 0x7f, 0xfe, 0xff, + 0xff, 0x0f, 0xf8, 0xff, 0xff, 0xff, 0xfc, 0x7f, 0xff, 0xff, 0xff, 0x1f, + 0xf8, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xf8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xfc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x7f, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x7f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, + 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xfe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xfe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x7f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x7f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, + 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xfe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xfe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x3f, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x3f, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, + 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xfc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xf8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x1f, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x1f, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xf0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xf0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0f, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x07, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, + 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0xc0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x80, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x7f, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, + 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00, 0xf8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x07, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x03, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, + 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; diff --git a/gnu/games/chess/Xchess/king_outline.bitmap b/gnu/games/chess/Xchess/king_outline.bitmap new file mode 100644 index 0000000..173651c --- /dev/null +++ b/gnu/games/chess/Xchess/king_outline.bitmap @@ -0,0 +1,71 @@ + +#define king_outline_width 80 +#define king_outline_height 80 +static char king_outline_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x40, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x1c, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x70, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x40, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x40, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x3c, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xf8, 0x1f, 0x00, 0x0c, 0x60, 0x00, 0xfc, 0x1f, 0x00, + 0x00, 0x0e, 0x70, 0x00, 0x84, 0x43, 0x00, 0x07, 0x70, 0x00, 0x00, 0x03, + 0xc0, 0x00, 0xc4, 0x46, 0x80, 0x01, 0xc0, 0x00, 0x80, 0x01, 0x80, 0x03, + 0x44, 0x44, 0xe0, 0x00, 0x80, 0x01, 0xc0, 0x00, 0x00, 0x0e, 0x44, 0x44, + 0x30, 0x00, 0x00, 0x03, 0x60, 0x00, 0x00, 0x18, 0x44, 0x44, 0x18, 0x00, + 0x07, 0x06, 0x20, 0xe0, 0x3f, 0x30, 0xc4, 0x46, 0x0c, 0xf8, 0x1d, 0x04, + 0x30, 0x30, 0x60, 0x60, 0x8c, 0x63, 0x06, 0x0c, 0x30, 0x0c, 0x10, 0x18, + 0xc0, 0xc1, 0x08, 0x20, 0x82, 0x03, 0x20, 0x0c, 0x10, 0x0c, 0x00, 0x83, + 0x09, 0x20, 0xc3, 0x00, 0x60, 0x08, 0x18, 0x04, 0x00, 0x02, 0x8b, 0xa3, + 0x41, 0x00, 0x40, 0x18, 0x08, 0x06, 0x00, 0x06, 0x7a, 0xb6, 0x20, 0x00, + 0xc0, 0x10, 0x08, 0x02, 0x00, 0x0c, 0x3e, 0x7c, 0x30, 0x00, 0x80, 0x10, + 0x08, 0x02, 0x00, 0x18, 0x18, 0x18, 0x10, 0x00, 0x80, 0x10, 0x0c, 0x02, + 0x00, 0x30, 0x00, 0x00, 0x18, 0xc0, 0x83, 0x30, 0x04, 0xc3, 0x03, 0x20, + 0x00, 0x01, 0x0c, 0xc2, 0x83, 0x20, 0x04, 0xc1, 0x03, 0x61, 0x80, 0x03, + 0x06, 0xc6, 0x83, 0x20, 0x04, 0xc1, 0x83, 0x41, 0xc0, 0x07, 0x06, 0xc4, + 0x83, 0x20, 0x04, 0xc1, 0x87, 0xc0, 0x80, 0x03, 0x03, 0xc4, 0x80, 0x20, + 0x0c, 0x01, 0x84, 0x80, 0x00, 0x01, 0x01, 0x64, 0x80, 0x30, 0x08, 0x01, + 0x44, 0x80, 0x01, 0x80, 0x01, 0x24, 0x86, 0x10, 0x08, 0x01, 0x4c, 0x00, + 0x01, 0x80, 0x00, 0x34, 0x83, 0x10, 0x08, 0x61, 0x48, 0x00, 0x01, 0x80, + 0x00, 0xd4, 0xc1, 0x10, 0x08, 0xc1, 0x59, 0x00, 0x03, 0x80, 0x00, 0x5c, + 0x40, 0x10, 0x08, 0x01, 0x57, 0x00, 0x02, 0xc1, 0x00, 0x2c, 0x40, 0x10, + 0x18, 0x02, 0x7c, 0x00, 0x82, 0x43, 0x00, 0x3c, 0x40, 0x18, 0x10, 0x02, + 0x70, 0x00, 0xc6, 0x47, 0x00, 0x1c, 0x40, 0x18, 0x10, 0x02, 0x60, 0x00, + 0x84, 0x43, 0x00, 0x0e, 0x60, 0x08, 0x10, 0x06, 0x40, 0x00, 0x04, 0x41, + 0x00, 0x02, 0x20, 0x08, 0x10, 0x04, 0xc0, 0x00, 0x0c, 0x60, 0x00, 0x02, + 0x20, 0x0c, 0x30, 0x0c, 0x80, 0x00, 0x08, 0x20, 0x00, 0x03, 0x20, 0x0c, + 0x20, 0x08, 0x80, 0x01, 0x08, 0x20, 0x00, 0x01, 0x20, 0x04, 0x20, 0x08, + 0x00, 0x01, 0x08, 0x20, 0x80, 0x01, 0x30, 0x04, 0x60, 0x18, 0x00, 0x01, + 0x08, 0x20, 0x80, 0x00, 0x10, 0x06, 0x40, 0x10, 0x00, 0x03, 0x10, 0x11, + 0x80, 0x00, 0x18, 0x02, 0xc0, 0x30, 0x00, 0x02, 0x90, 0x13, 0xc0, 0x00, + 0x08, 0x03, 0x80, 0x20, 0x00, 0x06, 0x10, 0x11, 0x40, 0x00, 0x04, 0x01, + 0x80, 0x61, 0x00, 0x04, 0x10, 0x10, 0x60, 0x00, 0x84, 0x01, 0x00, 0x41, + 0x00, 0x04, 0x10, 0x10, 0x20, 0x00, 0xc6, 0x00, 0x00, 0x83, 0x00, 0x0c, + 0x10, 0x10, 0x20, 0x00, 0x41, 0x00, 0x00, 0x82, 0x01, 0x00, 0x10, 0x10, + 0x00, 0x80, 0x61, 0x00, 0x00, 0x06, 0x01, 0x00, 0x10, 0x10, 0x00, 0x80, + 0x30, 0x00, 0x00, 0x0c, 0x01, 0x00, 0x10, 0x10, 0x00, 0xc0, 0x10, 0x00, + 0x00, 0x18, 0x02, 0xff, 0x1f, 0xf0, 0xff, 0x60, 0x18, 0x00, 0x00, 0x30, + 0xfe, 0x01, 0x00, 0x00, 0x80, 0x3f, 0x0c, 0x00, 0x00, 0x20, 0x00, 0x40, + 0x08, 0x21, 0x04, 0x00, 0x06, 0x00, 0x00, 0xc0, 0x00, 0xe2, 0x9c, 0x73, + 0x8e, 0x00, 0x03, 0x00, 0x00, 0x80, 0x11, 0x47, 0x08, 0x21, 0xc4, 0x11, + 0x01, 0x00, 0x00, 0x00, 0x3b, 0x02, 0x00, 0x00, 0x80, 0xb8, 0x00, 0x00, + 0x00, 0x00, 0x12, 0x00, 0xff, 0xff, 0x03, 0x90, 0x00, 0x00, 0x00, 0x00, + 0x02, 0xfc, 0x01, 0x00, 0xfe, 0xc0, 0x00, 0x00, 0x00, 0x00, 0xfa, 0x07, + 0x80, 0x03, 0x80, 0x5f, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xe0, 0x0f, + 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x3a, 0x00, 0xf8, 0x3f, 0x00, 0x5c, + 0x00, 0x00, 0x00, 0x00, 0xfa, 0x00, 0xe0, 0x0f, 0x00, 0x5f, 0x00, 0x00, + 0x00, 0x00, 0xfa, 0x03, 0x80, 0x03, 0xc0, 0x5f, 0x00, 0x00, 0x00, 0x00, + 0xfa, 0x00, 0x00, 0x00, 0x00, 0x5f, 0x00, 0x00, 0x00, 0x00, 0x3a, 0x00, + 0xff, 0xff, 0x03, 0x5c, 0x00, 0x00, 0x00, 0x00, 0x02, 0xfc, 0x01, 0x00, + 0xfe, 0x40, 0x00, 0x00, 0x00, 0x00, 0xfa, 0x07, 0x00, 0x00, 0x80, 0x5f, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, + 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; diff --git a/gnu/games/chess/Xchess/king_small.bitmap b/gnu/games/chess/Xchess/king_small.bitmap new file mode 100644 index 0000000..38bb2b7 --- /dev/null +++ b/gnu/games/chess/Xchess/king_small.bitmap @@ -0,0 +1,15 @@ + +#define king_small_width 32 +#define king_small_height 32 +static char king_small_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xe0, 0x00, 0x00, 0x80, 0x9f, 0x00, 0x00, 0x70, 0x20, 0x00, + 0x00, 0x0c, 0x40, 0x00, 0x00, 0x02, 0x80, 0x01, 0x80, 0x01, 0x00, 0x03, + 0x40, 0x00, 0x00, 0x06, 0x40, 0x60, 0x30, 0x08, 0x20, 0x60, 0x30, 0x10, + 0x20, 0x00, 0x00, 0x60, 0x20, 0x00, 0x00, 0x40, 0x10, 0x00, 0x00, 0x80, + 0x10, 0x00, 0x02, 0x80, 0x10, 0x00, 0x01, 0x80, 0x10, 0x01, 0x01, 0x80, + 0x10, 0x03, 0x1f, 0x84, 0x10, 0x02, 0x00, 0x84, 0x10, 0x06, 0x00, 0x86, + 0x20, 0x1c, 0x00, 0x42, 0x20, 0xf0, 0xff, 0x43, 0x20, 0x00, 0x00, 0x40, + 0x40, 0x00, 0x00, 0x20, 0x40, 0x00, 0x00, 0x20, 0x80, 0x01, 0x00, 0x18, + 0x00, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; diff --git a/gnu/games/chess/Xchess/king_small_outline.bitmap b/gnu/games/chess/Xchess/king_small_outline.bitmap new file mode 100644 index 0000000..18d569e --- /dev/null +++ b/gnu/games/chess/Xchess/king_small_outline.bitmap @@ -0,0 +1,15 @@ + +#define king_small_outline_width 32 +#define king_small_outline_height 32 +static char king_small_outline_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x90, 0x00, 0x06, 0x10, 0xb1, 0x00, + 0x22, 0x12, 0xe1, 0x00, 0x24, 0x92, 0x9f, 0x00, 0x40, 0x72, 0xa0, 0x50, + 0x04, 0x0e, 0x40, 0x50, 0x40, 0x02, 0x80, 0x71, 0xc8, 0x01, 0x00, 0x73, + 0xd8, 0x00, 0x00, 0x46, 0xd8, 0x60, 0x30, 0x08, 0xa0, 0x60, 0x30, 0x10, + 0x20, 0x00, 0x00, 0x60, 0x20, 0x00, 0x00, 0x40, 0x10, 0x00, 0x00, 0x80, + 0x10, 0x00, 0x02, 0x80, 0x10, 0x00, 0x01, 0x80, 0x10, 0x01, 0x01, 0x80, + 0x10, 0x03, 0x1f, 0x84, 0x10, 0x02, 0x00, 0x84, 0x10, 0x06, 0x00, 0x86, + 0x20, 0x1c, 0x00, 0x42, 0x20, 0xf0, 0xff, 0x43, 0x20, 0x00, 0x00, 0x40, + 0x40, 0x00, 0x00, 0x20, 0x40, 0x00, 0x00, 0x20, 0x80, 0x01, 0x00, 0x18, + 0x00, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; diff --git a/gnu/games/chess/Xchess/knight.bitmap b/gnu/games/chess/Xchess/knight.bitmap new file mode 100644 index 0000000..c5b1de1 --- /dev/null +++ b/gnu/games/chess/Xchess/knight.bitmap @@ -0,0 +1,71 @@ + +#define knight_width 80 +#define knight_height 80 +static char knight_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x18, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x38, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, + 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x1f, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xe0, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xbf, 0xff, + 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x7f, 0xfe, 0x0f, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xf8, 0xff, 0x01, 0x00, 0x00, + 0x00, 0x00, 0xe0, 0x0f, 0xfc, 0xe3, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xf0, 0xe1, 0xf3, 0xcf, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xfd, + 0xff, 0x1f, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x3f, 0xfe, 0x7f, + 0xfe, 0x1f, 0x00, 0x00, 0x00, 0x00, 0xff, 0x1f, 0xfe, 0xff, 0xfc, 0x07, + 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x7f, 0x00, 0x00, + 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x1f, 0x00, 0x00, 0x00, 0xe0, + 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0x03, 0x00, 0x00, 0xf0, 0xff, 0xff, + 0xff, 0xff, 0x9f, 0x3f, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, + 0x3f, 0xff, 0x07, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xfe, + 0x00, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfc, 0x07, 0x00, + 0x00, 0xfe, 0xff, 0xff, 0xff, 0x7f, 0xfe, 0xfd, 0x01, 0x00, 0x00, 0xff, + 0xff, 0xff, 0xff, 0x3f, 0xff, 0xfb, 0x1f, 0x00, 0x00, 0xff, 0xff, 0xff, + 0xff, 0xbf, 0xff, 0xf3, 0x03, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0x9f, + 0xff, 0xf7, 0x3f, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xef, + 0x07, 0x00, 0xc0, 0xff, 0xff, 0xff, 0x7f, 0xf3, 0xff, 0xcf, 0x7f, 0x00, + 0xe0, 0xff, 0xff, 0xff, 0x1f, 0xfd, 0xff, 0xdf, 0x07, 0x00, 0xe0, 0xff, + 0xff, 0xff, 0x83, 0xff, 0xf3, 0x9f, 0xff, 0x00, 0xf0, 0xff, 0xff, 0x7f, + 0x80, 0xff, 0xf9, 0xbf, 0x0f, 0x00, 0xf0, 0xff, 0xff, 0x00, 0x80, 0x7f, + 0xfc, 0x7f, 0xff, 0x01, 0xf8, 0x3f, 0x7f, 0x00, 0x80, 0x81, 0xff, 0x7f, + 0x1e, 0x00, 0x18, 0x9f, 0x3f, 0x00, 0xc0, 0xff, 0xff, 0x7f, 0xfe, 0x07, + 0x98, 0x8f, 0x1f, 0x00, 0xc0, 0xff, 0xcf, 0x7f, 0x3e, 0x00, 0xf8, 0x87, + 0x0f, 0x00, 0xe0, 0xff, 0xe3, 0xff, 0xfe, 0x07, 0xf0, 0xc3, 0x07, 0x00, + 0xf0, 0x1f, 0xfc, 0xff, 0x3c, 0x00, 0xf0, 0xe1, 0x03, 0x00, 0xf0, 0xc0, + 0xff, 0xff, 0xfc, 0x0f, 0x60, 0xe0, 0x01, 0x00, 0xf8, 0xff, 0xff, 0xff, + 0x7c, 0x00, 0x00, 0xf0, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0x0f, + 0x00, 0x70, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0x7c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xf9, 0x0f, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0f, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x1f, + 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x01, 0x00, 0x00, + 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x3f, 0x00, 0x00, 0x00, 0xf0, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x01, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x3f, 0x00, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x01, 0x00, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x3f, + 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x01, 0x00, 0x00, + 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x3f, 0x00, 0x00, 0x00, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x01, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x3f, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x01, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x3f, + 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x01, 0x00, 0x00, + 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x3f, 0x00, 0x00, 0xe0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x01, 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x3f, 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x01, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x3f, + 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x01, 0x00, 0x00, + 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x3f, 0x00, 0x00, 0xfc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x01, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x3f, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x01, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x3f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; diff --git a/gnu/games/chess/Xchess/knight_mask.bitmap b/gnu/games/chess/Xchess/knight_mask.bitmap new file mode 100644 index 0000000..97d288c --- /dev/null +++ b/gnu/games/chess/Xchess/knight_mask.bitmap @@ -0,0 +1,71 @@ + +#define knight_mask_width 80 +#define knight_mask_height 80 +static char knight_mask_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9c, 0x0f, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xfe, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xfc, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, + 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0x7f, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xf0, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xf0, 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, + 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, + 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff, 0x03, + 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, + 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, + 0xfc, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, + 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, + 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00, 0xfc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0f, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0f, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, + 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x80, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0xc0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x7f, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x7f, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, + 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xf8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xf8, 0xff, 0xff, 0xff, + 0xc7, 0xff, 0xff, 0xff, 0xff, 0x01, 0xfc, 0xff, 0xff, 0xff, 0xc1, 0xff, + 0xff, 0xff, 0xff, 0x03, 0xfc, 0xff, 0xff, 0x01, 0xc0, 0xff, 0xff, 0xff, + 0xff, 0x0f, 0xfc, 0xff, 0xff, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0x0f, + 0xfc, 0xff, 0x7f, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xfc, 0xdf, + 0x3f, 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xfc, 0xef, 0x1f, 0x00, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xf8, 0xf7, 0x0f, 0x00, 0xfc, 0xff, + 0xff, 0xff, 0xff, 0x1f, 0xf8, 0xfb, 0x07, 0x00, 0xfc, 0xff, 0xff, 0xff, + 0xff, 0x1f, 0xf0, 0xf9, 0x03, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x1f, + 0x00, 0xf8, 0x01, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0xf8, + 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x80, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x1f, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, + 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, + 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x7f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, + 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, + 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0xc0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x7f, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, + 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, + 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0xf8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x7f, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, + 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x7f, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, + 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; diff --git a/gnu/games/chess/Xchess/knight_outline.bitmap b/gnu/games/chess/Xchess/knight_outline.bitmap new file mode 100644 index 0000000..a1ab938 --- /dev/null +++ b/gnu/games/chess/Xchess/knight_outline.bitmap @@ -0,0 +1,71 @@ + +#define knight_outline_width 80 +#define knight_outline_height 80 +static char knight_outline_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x18, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x38, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, + 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xf9, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x0f, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0xf8, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x20, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x20, 0x00, 0xe0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, + 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x80, + 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0xf8, 0x01, 0x00, 0x00, + 0x00, 0x00, 0xe0, 0xf0, 0x01, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x30, 0x58, 0x07, 0x00, 0xc0, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x18, 0x4c, + 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x78, 0x07, 0x00, + 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x23, 0xe0, 0x01, 0x00, 0x00, 0x04, + 0x00, 0x00, 0x00, 0x80, 0x11, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, + 0x00, 0xc0, 0x08, 0x00, 0x00, 0x40, 0x00, 0x10, 0x00, 0x00, 0x00, 0x60, + 0x04, 0x00, 0x00, 0x40, 0x00, 0xf0, 0x03, 0x00, 0x00, 0x30, 0x02, 0x00, + 0x00, 0x60, 0x00, 0x20, 0x00, 0x00, 0x00, 0x18, 0x01, 0x00, 0x00, 0x20, + 0x00, 0xe0, 0x07, 0x00, 0x00, 0x8c, 0x00, 0x00, 0x00, 0x20, 0x00, 0x80, + 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x20, 0x00, 0x80, 0x07, 0x00, + 0x00, 0x26, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x01, 0x00, 0x00, 0x13, + 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x1f, 0x00, 0x00, 0x09, 0x40, 0x00, + 0x00, 0x18, 0x08, 0x00, 0x02, 0x00, 0x80, 0x05, 0xc0, 0x00, 0x00, 0x0c, + 0x0c, 0x00, 0x3e, 0x00, 0x80, 0x00, 0x80, 0x00, 0xc0, 0x03, 0x06, 0x00, + 0x04, 0x00, 0xc0, 0x00, 0x80, 0x01, 0x70, 0x01, 0xc3, 0x00, 0x7c, 0x00, + 0x60, 0x00, 0x00, 0x03, 0x1e, 0x81, 0x41, 0x00, 0x04, 0x00, 0x20, 0x00, + 0x00, 0xce, 0x83, 0x61, 0x60, 0x00, 0xfc, 0x00, 0x30, 0x00, 0x80, 0x7f, + 0x80, 0x1c, 0x30, 0x00, 0x08, 0x00, 0x10, 0xe0, 0xc1, 0x00, 0x80, 0x07, + 0x10, 0x00, 0xf8, 0x01, 0x18, 0x30, 0x61, 0x00, 0x80, 0x00, 0x08, 0x00, + 0x10, 0x00, 0x08, 0x98, 0x31, 0x00, 0xc0, 0x00, 0x0c, 0x00, 0xf0, 0x07, + 0x08, 0x8c, 0x18, 0x00, 0x40, 0x00, 0x03, 0x00, 0x20, 0x00, 0x18, 0x86, + 0x0c, 0x00, 0x60, 0xc0, 0x01, 0x00, 0xe0, 0x07, 0x10, 0xc3, 0x06, 0x00, + 0x30, 0x30, 0x00, 0x00, 0x20, 0x00, 0xf0, 0x61, 0x02, 0x00, 0x10, 0x1e, + 0x00, 0x00, 0xe0, 0x0f, 0x60, 0x30, 0x02, 0x00, 0x98, 0x03, 0x00, 0x00, + 0x40, 0x00, 0x00, 0x10, 0x02, 0x00, 0x0c, 0x00, 0x00, 0x00, 0xc0, 0x0f, + 0x00, 0xb0, 0x03, 0x00, 0x06, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xc0, + 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xc0, 0x0f, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, + 0x00, 0x00, 0x80, 0x0f, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x80, 0x1f, + 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x30, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, + 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, + 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x20, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, + 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x04, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; diff --git a/gnu/games/chess/Xchess/knight_small.bitmap b/gnu/games/chess/Xchess/knight_small.bitmap new file mode 100644 index 0000000..77c7451 --- /dev/null +++ b/gnu/games/chess/Xchess/knight_small.bitmap @@ -0,0 +1,15 @@ + +#define knight_small_width 32 +#define knight_small_height 32 +static char knight_small_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x80, 0x00, 0x00, 0xee, 0x7f, 0x02, + 0x00, 0xfe, 0x7f, 0x01, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x02, + 0x80, 0xff, 0xff, 0x09, 0xc0, 0xfc, 0xff, 0x07, 0xe0, 0xfc, 0xff, 0x11, + 0xe0, 0xff, 0xff, 0x0d, 0xe0, 0xff, 0xff, 0x03, 0xf0, 0xff, 0xff, 0x3f, + 0xf0, 0xff, 0xff, 0x03, 0xf0, 0xff, 0xff, 0x7f, 0xf8, 0xff, 0xff, 0x07, + 0xfc, 0xc7, 0xff, 0x7f, 0xfe, 0xc1, 0xff, 0x07, 0xfa, 0xc1, 0xff, 0x7f, + 0xce, 0xc0, 0xff, 0x07, 0x6c, 0xc0, 0xff, 0x7f, 0x28, 0xe0, 0xff, 0x07, + 0x00, 0xe0, 0xff, 0x7f, 0x00, 0xe0, 0xff, 0x0f, 0x00, 0xf0, 0xff, 0x7f, + 0x00, 0xf0, 0xff, 0x0f, 0x00, 0xf0, 0xff, 0x7f, 0x00, 0xf8, 0xff, 0x0f, + 0x00, 0xf8, 0xff, 0x7f, 0x00, 0xfc, 0xff, 0x0f, 0x00, 0xff, 0xff, 0x7f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; diff --git a/gnu/games/chess/Xchess/knight_small_outline.bitmap b/gnu/games/chess/Xchess/knight_small_outline.bitmap new file mode 100644 index 0000000..c0e738c --- /dev/null +++ b/gnu/games/chess/Xchess/knight_small_outline.bitmap @@ -0,0 +1,15 @@ + +#define knight_small_outline_width 32 +#define knight_small_outline_height 32 +static char knight_small_outline_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x80, 0x00, 0x00, 0xee, 0x7f, 0x02, + 0x00, 0x3a, 0x40, 0x01, 0x00, 0x03, 0xc0, 0x04, 0x00, 0x01, 0x80, 0x02, + 0x80, 0x01, 0x80, 0x09, 0xc0, 0x0c, 0x00, 0x07, 0x60, 0x0c, 0x00, 0x11, + 0x20, 0x00, 0x00, 0x0d, 0x20, 0x00, 0x00, 0x03, 0x30, 0x00, 0x00, 0x3e, + 0x10, 0x00, 0x00, 0x02, 0x10, 0x00, 0x00, 0x7e, 0x18, 0x7c, 0x00, 0x04, + 0x0c, 0x47, 0x00, 0x7c, 0x06, 0x41, 0x00, 0x04, 0xf2, 0x41, 0x00, 0x7c, + 0xde, 0x40, 0x00, 0x04, 0x6c, 0x40, 0x00, 0x7c, 0x28, 0x60, 0x00, 0x04, + 0x00, 0x20, 0x00, 0x7c, 0x00, 0x20, 0x00, 0x08, 0x00, 0x30, 0x00, 0x78, + 0x00, 0x10, 0x00, 0x08, 0x00, 0x10, 0x00, 0x78, 0x00, 0x18, 0x00, 0x08, + 0x00, 0x08, 0x00, 0x78, 0x00, 0x0c, 0x00, 0x08, 0x00, 0xff, 0xff, 0x7f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; diff --git a/gnu/games/chess/Xchess/message.c b/gnu/games/chess/Xchess/message.c new file mode 100644 index 0000000..8b85e9c --- /dev/null +++ b/gnu/games/chess/Xchess/message.c @@ -0,0 +1,101 @@ + +/* This file contains code for X-CHESS. + Copyright (C) 1986 Free Software Foundation, Inc. + +This file is part of X-CHESS. + +X-CHESS is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY. No author or distributor +accepts responsibility to anyone for the consequences of using it +or for whether it serves any particular purpose or works at all, +unless he says so in writing. Refer to the X-CHESS General Public +License for full details. + +Everyone is granted permission to copy, modify and redistribute +X-CHESS, but only under the conditions described in the +X-CHESS General Public License. A copy of this license is +supposed to have been given to you along with X-CHESS so you +can know your rights and responsibilities. It should be in a +file named COPYING. Among other things, the copyright notice +and this notice must be preserved on all copies. */ + + +/* RCS Info: $Revision: 1.4 $ on $Date: 86/11/26 12:10:22 $ + * $Source: /users/faustus/xchess/RCS/message.c,v $ + * Copyright (c) 1986 Wayne A. Christopher, U. C. Berkeley CAD Group + * Permission is granted to do anything with this code except sell it + * or remove this message. + * + * Do stuff with the message window. Font 0 is the normal font, font 1 + * is large, and font 2 is normal red. + */ + +#include "xchess.h" + +#define MESSAGE_HEADER "\n1 XChess Messages0\n" + +void +message_init(win) + windata *win; +{ + TxtGrab(win->display, win->messagewin, "xchess", win->medium, + win->textback.pixel, win->textcolor.pixel, + win->cursorcolor.pixel); + TxtAddFont(win->display, win->messagewin, 1, win->large, win->textcolor.pixel); + TxtAddFont(win->display, win->messagewin, 2, win->medium, win->errortext.pixel); + TxtAddFont(win->display, win->messagewin, 3, win->medium, win->playertext.pixel); + + TxtWriteStr(win->display, win->messagewin, MESSAGE_HEADER); + return; +} + +void +message_add(win, string, err) + windata *win; + char *string; + bool err; +{ + if (err) { + TxtWriteStr(win->display, win->messagewin, "2"); + TxtWriteStr(win->display, win->messagewin, string); + TxtWriteStr(win->display, win->messagewin, "0"); + XBell(win->display, 50); + } else + TxtWriteStr(win->display, win->messagewin, string); + + XSync(win->display, 0); + return; +} + +void +message_send(win, event) + windata *win; + XEvent *event; +{ + XKeyEvent *ev = &event->xkey; + KeySym keysym; + windata *ow = (win == win1) ? win2 : win1; + char buf[BSIZE], *s; + int i; + + i = XLookupString(ev, buf, sizeof(buf) - 1, &keysym, &s); + buf[i] = '\0'; + for (s = buf; *s; s++) + if (*s == '\r') + *s = '\n'; + else if (*s == '\177') + *s = ''; + + TxtWriteStr(win->display, win->messagewin, "3"); + TxtWriteStr(win->display, win->messagewin, buf); + TxtWriteStr(win->display, win->messagewin, "0"); + XSync(win->display, 0); + if (ow) { + TxtWriteStr(ow->display, ow->messagewin, "3"); + TxtWriteStr(ow->display, ow->messagewin, buf); + TxtWriteStr(ow->display, ow->messagewin, "0"); + XSync(ow->display, 0); + } + return; +} + diff --git a/gnu/games/chess/Xchess/parse.c b/gnu/games/chess/Xchess/parse.c new file mode 100644 index 0000000..c66cc38 --- /dev/null +++ b/gnu/games/chess/Xchess/parse.c @@ -0,0 +1,386 @@ +/* This file contains code for X-CHESS. + Copyright (C) 1986 Free Software Foundation, Inc. + +This file is part of X-CHESS. + +X-CHESS is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY. No author or distributor +accepts responsibility to anyone for the consequences of using it +or for whether it serves any particular purpose or works at all, +unless he says so in writing. Refer to the X-CHESS General Public +License for full details. + +Everyone is granted permission to copy, modify and redistribute +X-CHESS, but only under the conditions described in the +X-CHESS General Public License. A copy of this license is +supposed to have been given to you along with X-CHESS so you +can know your rights and responsibilities. It should be in a +file named COPYING. Among other things, the copyright notice +and this notice must be preserved on all copies. */ + + +/* RCS Info: $Revision: 1.2 $ on $Date: 86/11/23 17:17:59 $ + * $Source: /users/faustus/xchess/RCS/parse.c,v $ + * Copyright (c) 1986 Wayne A. Christopher, U. C. Berkeley CAD Group + * Permission is granted to do anything with this code except sell it + * or remove this message. + * + * Parse a sequence of chess moves... + */ + +#include "xchess.h" + +bool loading_flag = false; +bool loading_paused = false; + +static char *line; + +/* Load a record file in. This returns a number of things -- the board, the + * list of moves, and whose turn it is. + */ + +void +load_game(file) + char *file; +{ + FILE *fp; + char buf[BSIZE]; + bool eflag; + move *m; + board *tmpboard = alloc(board); + + if (eq(file, "xchess.game") && saveflag) { + message_add(win1, + "Oops, I just overwrote the\nfile xchess.game...\n", + true); + message_add(win1, "I hope you had another copy.\n", true); + return; + } + if (!(fp = fopen(file, "r"))) { + perror(file); + return; + } + + /* Get a few lines... */ + fgets(buf, BSIZE, fp); + message_add(win1, buf, false); + if (!oneboard) + message_add(win2, buf, false); + + fgets(buf, BSIZE, fp); + message_add(win1, buf, false); + if (!oneboard) + message_add(win2, buf, false); + + fgets(buf, BSIZE, fp); + if (eq(buf, "\tenglish\n")) + eflag = true; + else if (eq(buf, "\talgebraic\n")) + eflag = false; + else { + fprintf(stderr, "Can't decide whether this is english...\n"); + return; + } + + board_init(tmpboard); + line = NULL; + m = parse_file(fp, tmpboard, eflag); + tfree(tmpboard); + + /* Now apply these moves to the board we were given... */ + loading_flag = true; + while (m) { + if (!quickflag) + XSync(win1->display, 0); + win_process(true); + if (!quickflag) + sleep(1); + if (!loading_paused) { + prog_move(m); + m = m->next; + } + } + loading_flag = false; + if (line) + message_add(win1, line, false); + + while (fgets(buf, BSIZE, fp)) + message_add(win1, buf, false); + + fclose(fp); + + return; +} + +/* Given a starting position (usually the beginning board configuration), + * read in a file of moves. + */ + +move * +parse_file(fp, b, english) + FILE *fp; + board *b; + bool english; +{ + move *mvs = NULL, *end = NULL; + char buf[BSIZE], *s, *t; + + while (fgets(buf, BSIZE, fp)) { + if (*buf == '#') + continue; + s = buf; + + /* The move number... */ + if (!(t = gettok(&s))) + break; + if (!isdigit(*t)) { + line = copy(buf); + break; + } + + if (!(t = gettok(&s))) + break; + if (end) + end = end->next = (english ? parse_move(b, t, WHITE) : + parse_imove(b, t, WHITE)); + else + mvs = end = (english ? parse_move(b, t, WHITE) : + parse_imove(b, t, WHITE)); + if (!end) { + fprintf(stderr, "Can't parse %s\n", buf); + return (NULL); + } + board_move(b, end); + + if (!(t = gettok(&s))) + break; + if (end) + end = end->next = (english ? parse_move(b, t, BLACK) : + parse_imove(b, t, BLACK)); + else + mvs = end = (english ? parse_move(b, t, BLACK) : + parse_imove(b, t, BLACK)); + if (!end) { + fprintf(stderr, "Can't parse %s\n", buf); + return (NULL); + } + board_move(b, end); + } + + return (mvs); +} + +/* Parse a move. The move format accepted is as follows - + * move: spec-spec + * capture: specxspec + * kcastle: 2 o's + * qcastle: 3 o's + * A spec is either piece/pos, piece, or just pos. A pos consists of a column + * name followed by a row number. If the column name is kr, kn, kb, k, q, + * qb, qn, or qr, then the row number is according to the english system, + * or if it is a-h then it is according to the international system. + * + *** As of now the spec must include the position. + */ + +move * +parse_move(b, str, w) + board *b; + char *str; + color w; +{ + move *m = alloc(move); + char *s; + char spec1[16], spec2[16]; + int i, j; + +if (debug) fprintf(stderr, "parsing %s\n", str); + + /* Check for castles. */ + for (s = str, i = 0; *s; s++) + if ((*s == 'o') || (*s == 'O')) + i++; + if (i == 2) { + m->type = KCASTLE; + m->piece.type = KING; + m->piece.color = w; + return (m); + } else if (i == 3) { + m->type = QCASTLE; + m->piece.type = KING; + m->piece.color = w; + return (m); + } + if (index(str, '-')) + m->type = MOVE; + else if (index(str, 'x')) + m->type = CAPTURE; + else + return (NULL); + for (i = 0; str[i]; i++) + if ((str[i] == 'x') || (str[i] == '-')) + break; + else + spec1[i] = str[i]; + spec1[i] = '\0'; + for (i++, j = 0; str[i]; i++, j++) + if ((str[i] == 'x') || (str[i] == '-')) + break; + else + spec2[j] = str[i]; + spec2[j] = '\0'; + + /* Now decode the specifications. */ + s = spec1; + switch (*s) { + case 'p': case 'P': + m->piece.type = PAWN; break; + case 'r': case 'R': + m->piece.type = ROOK; break; + case 'n': case 'N': + m->piece.type = KNIGHT; break; + case 'b': case 'B': + m->piece.type = BISHOP; break; + case 'q': case 'Q': + m->piece.type = QUEEN; break; + case 'k': case 'K': + m->piece.type = KING; break; + default: + return (NULL); + } + m->piece.color = w; + s += 2; + + /* Now get the {q,k}{,b,n,r}n string... */ + if ((s[0] == 'q') && (s[1] == 'r')) + m->fromx = 0, s += 2; + else if ((s[0] == 'q') && (s[1] == 'n')) + m->fromx = 1, s += 2; + else if ((s[0] == 'q') && (s[1] == 'b')) + m->fromx = 2, s += 2; + else if ((s[0] == 'q') && isdigit(s[1])) + m->fromx = 3, s += 1; + else if ((s[0] == 'k') && isdigit(s[1])) + m->fromx = 4, s += 1; + else if ((s[0] == 'k') && (s[1] == 'b')) + m->fromx = 5, s += 2; + else if ((s[0] == 'k') && (s[1] == 'n')) + m->fromx = 6, s += 2; + else if ((s[0] == 'k') && (s[1] == 'r')) + m->fromx = 7, s += 2; + m->fromy = ((w == WHITE) ? (SIZE - atoi(s)) : (atoi(s) - 1)); + + if ((b->square[m->fromy][m->fromx].color != w) || + (b->square[m->fromy][m->fromx].type != m->piece.type)) { + fprintf(stderr, "Error: bad stuff\n"); + return (NULL); + } + + s = spec2; + if (m->type == CAPTURE) { + switch (*s) { + case 'p': case 'P': + m->taken.type = PAWN; break; + case 'r': case 'R': + m->taken.type = ROOK; break; + case 'n': case 'N': + m->taken.type = KNIGHT; break; + case 'b': case 'B': + m->taken.type = BISHOP; break; + case 'q': case 'Q': + m->taken.type = QUEEN; break; + case 'k': case 'K': + m->taken.type = KING; break; + default: + return (NULL); + } + m->taken.color = ((w == WHITE) ? BLACK : WHITE); + s += 2; + } + + /* Now get the {q,k}{,b,n,r}n string... */ + if ((s[0] == 'q') && (s[1] == 'r')) + m->tox = 0, s += 2; + else if ((s[0] == 'q') && (s[1] == 'n')) + m->tox = 1, s += 2; + else if ((s[0] == 'q') && (s[1] == 'b')) + m->tox = 2, s += 2; + else if ((s[0] == 'q') && isdigit(s[1])) + m->tox = 3, s += 1; + else if ((s[0] == 'k') && isdigit(s[1])) + m->tox = 4, s += 1; + else if ((s[0] == 'k') && (s[1] == 'b')) + m->tox = 5, s += 2; + else if ((s[0] == 'k') && (s[1] == 'n')) + m->tox = 6, s += 2; + else if ((s[0] == 'k') && (s[1] == 'r')) + m->tox = 7, s += 2; + m->toy = ((w == WHITE) ? (SIZE - atoi(s)) : (atoi(s) - 1)); + + if ((m->type == CAPTURE) && ((b->square[m->toy][m->tox].color != + m->taken.color) || (b->square[m->toy][m->tox].type != + m->taken.type))) { + fprintf(stderr, "Error: bad stuff\n"); + return (NULL); + } + + return (m); +} + +/* Parse an algebraic notation move. This is a lot easier... */ + +move * +parse_imove(b, buf, w) + board *b; + char *buf; + color w; +{ + char *s; + move *m = alloc(move); + int n; + +if (debug) fprintf(stderr, "(alg) parsing %s\n", buf); + + for (s = buf, n = 0; *s; s++) + if ((*s == 'o') || (*s == 'O')) + n++; + s = buf; + + if (n == 2) + m->type = KCASTLE; + else if (n == 3) + m->type = QCASTLE; + else { + m->fromx = *s++ - 'a'; + m->fromy = SIZE - (*s++ - '0'); + m->tox = *s++ - 'a'; + m->toy = SIZE - (*s++ - '0'); + m->piece = b->square[m->fromy][m->fromx]; + m->taken = b->square[m->toy][m->tox]; + if (m->taken.color == NONE) + m->type = MOVE; + else + m->type = CAPTURE; + /* for pawns we must account for en passant */ + if (m->piece.type == PAWN) { + if (m->type == MOVE && m->fromx != m->tox) { + m->enpassant = 1; + m->type = CAPTURE; + } + } + } + + if (m->piece.color != w) { + fprintf(stderr, "Error: parse_imove: piece of wrong color!\n"); + return (NULL); + } + if ((m->piece.type == KING) && (m->fromy == m->toy) && (m->fromx == 4) + && (m->tox == 6)) + m->type = KCASTLE; + else if ((m->piece.type == KING) && (m->fromy == m->toy) && + (m->fromx == 4) && (m->tox == 2)) + m->type = QCASTLE; + + return (m); +} + diff --git a/gnu/games/chess/Xchess/pawn.bitmap b/gnu/games/chess/Xchess/pawn.bitmap new file mode 100644 index 0000000..5c3ff76 --- /dev/null +++ b/gnu/games/chess/Xchess/pawn.bitmap @@ -0,0 +1,71 @@ + +#define pawn_width 80 +#define pawn_height 80 +static char pawn_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x7f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xf8, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xf8, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xe0, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0x03, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0x0f, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, + 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xf8, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xf8, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, + 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0x07, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xfe, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, + 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0x3f, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, + 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0xff, + 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xf8, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, + 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, + 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0x03, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xf0, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, + 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0xff, + 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xc0, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, + 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, + 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0x3f, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xfe, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfc, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, + 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, + 0x80, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x03, 0x00, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, + 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, + 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0xfe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x1f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; diff --git a/gnu/games/chess/Xchess/pawn_mask.bitmap b/gnu/games/chess/Xchess/pawn_mask.bitmap new file mode 100644 index 0000000..724875c --- /dev/null +++ b/gnu/games/chess/Xchess/pawn_mask.bitmap @@ -0,0 +1,71 @@ + +#define pawn_mask_width 80 +#define pawn_mask_height 80 +static char pawn_mask_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc0, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xf0, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0x03, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xfc, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfc, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0x03, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0x03, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xfc, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfc, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, + 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0x07, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xfc, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, + 0xff, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0xff, + 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0x03, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xfc, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfe, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, + 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0x0f, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x80, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, + 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, + 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xf0, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, + 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, + 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0x07, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xfc, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, + 0xff, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0xff, + 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0x07, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xfc, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, + 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, + 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0x03, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xf0, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, + 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, + 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0x7f, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0xff, + 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0x0f, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, + 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, + 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0xf0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0f, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, + 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00, 0x80, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x3f, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x3f, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, + 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; diff --git a/gnu/games/chess/Xchess/pawn_outline.bitmap b/gnu/games/chess/Xchess/pawn_outline.bitmap new file mode 100644 index 0000000..0c4a3a1 --- /dev/null +++ b/gnu/games/chess/Xchess/pawn_outline.bitmap @@ -0,0 +1,71 @@ + +#define pawn_outline_width 80 +#define pawn_outline_height 80 +static char pawn_outline_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x70, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0xc0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x18, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x08, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x80, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xe0, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x03, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x80, 0x03, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, + 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x20, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x20, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, + 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, + 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x08, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, + 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, + 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, + 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x18, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x06, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x1f, 0x00, 0xff, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x78, 0xc0, 0x81, 0x07, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x07, 0xc0, 0x7f, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x01, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, + 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, + 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x02, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; diff --git a/gnu/games/chess/Xchess/pawn_small.bitmap b/gnu/games/chess/Xchess/pawn_small.bitmap new file mode 100644 index 0000000..88ff7bb --- /dev/null +++ b/gnu/games/chess/Xchess/pawn_small.bitmap @@ -0,0 +1,15 @@ + +#define pawn_small_width 32 +#define pawn_small_height 32 +static char pawn_small_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x07, 0x00, 0x00, 0xf0, 0x0f, 0x00, + 0x00, 0xf8, 0x1f, 0x00, 0x00, 0xf8, 0x1f, 0x00, 0x00, 0xf8, 0x1f, 0x00, + 0x00, 0xf8, 0x1f, 0x00, 0x00, 0xf8, 0x1f, 0x00, 0x00, 0xf0, 0x0f, 0x00, + 0x00, 0xe0, 0x07, 0x00, 0x00, 0xe0, 0x07, 0x00, 0x80, 0xff, 0xff, 0x01, + 0x80, 0xff, 0xff, 0x01, 0x00, 0xe0, 0x07, 0x00, 0x00, 0xe0, 0x07, 0x00, + 0x00, 0xe0, 0x07, 0x00, 0x00, 0xe0, 0x07, 0x00, 0x00, 0xe0, 0x07, 0x00, + 0x00, 0xe0, 0x07, 0x00, 0x00, 0xe0, 0x07, 0x00, 0x00, 0xe0, 0x07, 0x00, + 0x00, 0xe0, 0x07, 0x00, 0x00, 0xe0, 0x07, 0x00, 0x00, 0xe0, 0x07, 0x00, + 0x00, 0xf0, 0x0f, 0x00, 0x00, 0xf8, 0x1f, 0x00, 0x00, 0xfc, 0x3f, 0x00, + 0x00, 0xff, 0xff, 0x00, 0xe0, 0xff, 0xff, 0x07, 0xf0, 0xff, 0xff, 0x0f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; diff --git a/gnu/games/chess/Xchess/pawn_small_outline.bitmap b/gnu/games/chess/Xchess/pawn_small_outline.bitmap new file mode 100644 index 0000000..e860f43 --- /dev/null +++ b/gnu/games/chess/Xchess/pawn_small_outline.bitmap @@ -0,0 +1,15 @@ + +#define pawn_small_outline_width 32 +#define pawn_small_outline_height 32 +static char pawn_small_outline_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x07, 0x00, 0x00, 0x30, 0x0c, 0x00, + 0x00, 0x18, 0x18, 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x08, 0x10, 0x00, + 0x00, 0x08, 0x10, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x30, 0x0c, 0x00, + 0x00, 0x20, 0x04, 0x00, 0x00, 0x20, 0x04, 0x00, 0x80, 0x3f, 0xfc, 0x01, + 0x80, 0x3f, 0xfc, 0x01, 0x00, 0x20, 0x04, 0x00, 0x00, 0x20, 0x04, 0x00, + 0x00, 0x20, 0x04, 0x00, 0x00, 0x20, 0x04, 0x00, 0x00, 0x20, 0x04, 0x00, + 0x00, 0x20, 0x04, 0x00, 0x00, 0x20, 0x04, 0x00, 0x00, 0x20, 0x04, 0x00, + 0x00, 0x20, 0x04, 0x00, 0x00, 0x20, 0x04, 0x00, 0x00, 0x20, 0x04, 0x00, + 0x00, 0xf0, 0x0f, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x0c, 0x30, 0x00, + 0x00, 0x07, 0xe0, 0x00, 0xe0, 0x01, 0x80, 0x07, 0xf0, 0xff, 0xff, 0x0f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; diff --git a/gnu/games/chess/Xchess/popup.c b/gnu/games/chess/Xchess/popup.c new file mode 100644 index 0000000..2e19ee5 --- /dev/null +++ b/gnu/games/chess/Xchess/popup.c @@ -0,0 +1,112 @@ + +/* This file contains code for X-CHESS. + Copyright (C) 1986 Free Software Foundation, Inc. + +This file is part of X-CHESS. + +X-CHESS is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY. No author or distributor +accepts responsibility to anyone for the consequences of using it +or for whether it serves any particular purpose or works at all, +unless he says so in writing. Refer to the X-CHESS General Public +License for full details. + +Everyone is granted permission to copy, modify and redistribute +X-CHESS, but only under the conditions described in the +X-CHESS General Public License. A copy of this license is +supposed to have been given to you along with X-CHESS so you +can know your rights and responsibilities. It should be in a +file named COPYING. Among other things, the copyright notice +and this notice must be preserved on all copies. */ + + +/* RCS Info: $Revision: 1.2 $ on $Date: 86/11/26 12:10:38 $ + * $Source: /users/faustus/xchess/RCS/popup.c,v $ + * Copyright (c) 1986 Wayne A. Christopher, U. C. Berkeley CAD Group + * faustus@cad.berkeley.edu, ucbvax!faustus + * Permission is granted to modify and re-distribute this code in any manner + * as long as this notice is preserved. All standard disclaimers apply. + * + * A simple pop-up menu system. + */ + +#include "xchess.h" + +/* Open a small window with some text in it and two buttons -- yes and no. + * Use black and white pixel, and the medium font. + */ + +bool +pop_question(win, text) + windata *win; + char *text; +{ + char *s, *t; + int nlines = 1, ncols = 0, i = 0, j; + int x, y; + Window w; + bool ch; + XEvent ev; + + for (s = text; *s; s++) { + if ((*s == '\n') && s[1]) + nlines++; + if ((*s == '\n') || !s[1]) { + if (i > ncols) + ncols = i; + i = 0; + } else + i++; + } + + if (ncols < 12) + ncols = 12; + nlines += 4; + ncols += 4; + + x = (BASE_WIDTH - ncols * win->medium->max_bounds.width) / 2; + y = (BASE_HEIGHT - nlines * win->medium->max_bounds.ascent) / 2; + + w = XCreateSimpleWindow(win->display, win->basewin, + x, y, ncols * win->medium->max_bounds.width, + nlines * win->medium->ascent, + BORDER_WIDTH, win->border.pixel, + win->textback.pixel); + XMapRaised(win->display, w); + XSetFont(win->display, DefaultGC(win->display, 0), + win->medium->fid); + + for (i = 0, s = text; i < nlines - 4; i++) { + for (t = s, j = 0; *t && (*t != '\n'); t++, j++) + ; + XDrawString(win->display, w, DefaultGC(win->display, 0), + (ncols - j) / 2 * win->medium->max_bounds.width, + (i + 1) * win->medium->ascent, + s, j); + s = t + 1; + } + XDrawString(win->display, w, DefaultGC(win->display, 0), + (ncols - 8) * win->medium->max_bounds.width / 4, + (nlines - 2) * win->medium->ascent, + "YES", 3); + XDrawString(win->display, w, DefaultGC(win->display, 0), + (ncols - 4) * win->medium->max_bounds.width * 3 / 4, + (nlines - 2) * win->medium->ascent, + "NO", 2); + + XSync(win->display, 0); + XSelectInput(win->display, w, ButtonPressMask); + XWindowEvent(win->display, w, ButtonPressMask, &ev); + x = ev.xkey.x; + y = ev.xkey.y; + + if (x > ncols * win->medium->max_bounds.width / 2) + ch = false; + else + ch = true; + + XDestroyWindow(win->display, w); + XSync(win->display, 0); + return (ch); +} + diff --git a/gnu/games/chess/Xchess/program.c b/gnu/games/chess/Xchess/program.c new file mode 100644 index 0000000..876f29c --- /dev/null +++ b/gnu/games/chess/Xchess/program.c @@ -0,0 +1,200 @@ + +/* This file contains code for X-CHESS. + Copyright (C) 1986 Free Software Foundation, Inc. + +This file is part of X-CHESS. + +X-CHESS is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY. No author or distributor +accepts responsibility to anyone for the consequences of using it +or for whether it serves any particular purpose or works at all, +unless he says so in writing. Refer to the X-CHESS General Public +License for full details. + +Everyone is granted permission to copy, modify and redistribute +X-CHESS, but only under the conditions described in the +X-CHESS General Public License. A copy of this license is +supposed to have been given to you along with X-CHESS so you +can know your rights and responsibilities. It should be in a +file named COPYING. Among other things, the copyright notice +and this notice must be preserved on all copies. */ + + +/* RCS Info: $Revision: 1.2 $ on $Date: 86/11/23 17:18:10 $ + * $Source: /users/faustus/xchess/RCS/program.c,v $ + * Copyright (c) 1986 Wayne A. Christopher, U. C. Berkeley CAD Group + * Permission is granted to do anything with this code except sell it + * or remove this message. + * + * The interface to whichever chess playing program we are using... + */ + +#include "xchess.h" +#include <signal.h> +#include <sys/time.h> + +static int pid; +static FILE *from; +static FILE *to; +static bool easy = 1; + +bool +program_init(name) + char *name; +{ + int toprog[2], fromprog[2]; + char buf[BSIZE]; + char time[10]; + char moves[10]; + + pipe(toprog); + pipe(fromprog); + + if (!(pid = fork())) { + /* Start up the program. */ + dup2(toprog[0], 0); + dup2(fromprog[1], 1); + close(toprog[0]); + close(toprog[1]); + close(fromprog[0]); + close(fromprog[1]); + sprintf (time, "%d", timeunit/60); + sprintf (moves, "%d", movesperunit); + if (proghost) + execl("/usr/ucb/rsh", "rsh", proghost, name, + moves, time, + (char *) NULL); + else + execl(name, name, moves, time, (char *) NULL); + perror(name); + exit(1); + } + + close(toprog[0]); + close(fromprog[1]); + + from = fdopen(fromprog[0], "r"); + setbuf(from, NULL); + to = fdopen(toprog[1], "w"); + setbuf(to, NULL); + + /* Get the first line... */ + fgets(buf, BSIZE, from); + if (debug) + fprintf(stderr, "program says %s", buf); + if (blackflag) { + fputs("switch\n", to); + fflush(to); + fgets(buf, BSIZE, from); + if (debug) + fprintf(stderr, "program says %s", buf); + message_add(win1, "GNU Chess playing white\n", false); + } else + message_add(win1, "GNU Chess playing black\n", false); + + return (true); +} + +void +program_end() +{ + fclose(from); + fclose(to); + kill(pid, SIGTERM); + return; +} + +void +program_send(m) + move *m; +{ + char buf[BSIZE]; + + if ((m->type == MOVE) || (m->type == CAPTURE)) + sprintf(buf, "%c%d%c%d\n", 'a' + m->fromx, SIZE - m->fromy, + 'a' + m->tox, SIZE - m->toy); + else if (m->type == KCASTLE) + strcpy(buf, (m->piece.color == WHITE) ? "e1g1\n" : "e8g8\n"); + else if (m->type == QCASTLE) + strcpy(buf, (m->piece.color == WHITE) ? "e1c1\n" : "e8c8\n"); + + if (debug) + fprintf(stderr, "sending program %s", buf); + if (!easy) + kill (pid, SIGINT); + + fputs(buf, to); + fflush(to); + + /* One junk line... */ + fgets(buf, BSIZE, from); + if (debug) + fprintf(stderr, "program says %s", buf); + return; +} + +move * +program_get() +{ + int rfd = (1 << fileno(from)), wfd = 0, xfd = 0; + static struct timeval notime = { 0, 0 }; + char buf[BSIZE], *s; + move *m; + int i; + + /* Do a poll... */ + + if (!(i = select(32, &rfd, &wfd, &xfd, ¬ime)) && + !from->_cnt) { /* Bad stuff... */ + if (debug) + fprintf(stderr, "poll: nothing\n"); + return (NULL); + } + if (i == -1) { + perror("select"); + return (NULL); + } + + fgets(buf, BSIZE, from); + if (*buf == '\n' || *buf == '\0') { + message_add(win1, "program died", false); + return (NULL); + } + + if (debug) + fprintf(stderr, "got from program %s", buf); + + for (s = buf; !isalpha(*s); s++) + ; + m = parse_imove(chessboard, s, nexttomove); + if (m == NULL) + return (NULL); + + if (!valid_move(m, chessboard)) { + fprintf(stderr, "Error: move %s is invalid!!\n", buf); + return (NULL); + } + + /* + fgets(buf, BSIZE, from); + if (debug) + fprintf(stderr, "program says %s", buf); + */ + message_add(win1, buf, false); + return (m); +} + +void +program_undo() +{ + fputs("undo\n", to); + return; +} +void +program_easy (mode) + bool mode; + +{ + fputs("easy\n", to); + easy = mode; +} diff --git a/gnu/games/chess/Xchess/queen.bitmap b/gnu/games/chess/Xchess/queen.bitmap new file mode 100644 index 0000000..ab3817a --- /dev/null +++ b/gnu/games/chess/Xchess/queen.bitmap @@ -0,0 +1,71 @@ + +#define queen_width 80 +#define queen_height 80 +static char queen_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x03, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xe0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x80, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x01, 0x80, 0x01, 0x00, 0x07, + 0x00, 0x00, 0x00, 0x00, 0xf0, 0x01, 0x80, 0x01, 0x80, 0x0f, 0x00, 0x00, + 0x00, 0x00, 0xf0, 0x01, 0xc0, 0x03, 0x80, 0x0f, 0x00, 0x00, 0x00, 0x00, + 0xe0, 0x00, 0xc0, 0x03, 0x80, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, + 0xc0, 0x03, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xc0, 0x03, + 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xc0, 0x03, 0x00, 0x03, + 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xc0, 0x03, 0x00, 0x03, 0x00, 0x00, + 0x00, 0x00, 0xc0, 0x01, 0xc0, 0x03, 0x80, 0x03, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0x01, 0xc0, 0x03, 0x80, 0x03, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x01, + 0xe0, 0x07, 0x80, 0x03, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x03, 0xe0, 0x07, + 0xc0, 0x03, 0x00, 0x00, 0x1c, 0x00, 0xc0, 0x03, 0xe0, 0x07, 0xc0, 0x03, + 0x00, 0x00, 0x3e, 0x00, 0xc0, 0x03, 0xe0, 0x07, 0xc0, 0x03, 0x00, 0x0e, + 0x3e, 0x00, 0xc0, 0x07, 0xe0, 0x07, 0xe0, 0x03, 0x00, 0x1f, 0x3e, 0x00, + 0xc0, 0x07, 0xe0, 0x07, 0xe0, 0x03, 0x00, 0x1f, 0x3c, 0x00, 0xc0, 0x07, + 0xe0, 0x07, 0xe0, 0x03, 0x00, 0x1f, 0x70, 0x00, 0xc0, 0x0f, 0xe0, 0x07, + 0xf0, 0x03, 0x00, 0x0e, 0x60, 0x00, 0xc0, 0x0f, 0xe0, 0x07, 0xf0, 0x03, + 0x00, 0x03, 0xe0, 0x00, 0xc0, 0x0f, 0xf0, 0x0f, 0xf0, 0x03, 0x80, 0x03, + 0xc0, 0x01, 0xc0, 0x1f, 0xf0, 0x0f, 0xf8, 0x03, 0x80, 0x01, 0xc0, 0x01, + 0xc0, 0x1f, 0xf0, 0x0f, 0xf8, 0x03, 0xc0, 0x01, 0xc0, 0x03, 0xc0, 0x1f, + 0xf0, 0x0f, 0xf8, 0x03, 0xe0, 0x01, 0xc0, 0x07, 0xc0, 0x1f, 0xf0, 0x0f, + 0xf8, 0x03, 0xe0, 0x01, 0xc0, 0x07, 0xc0, 0x3f, 0xf0, 0x0f, 0xfc, 0x03, + 0xf0, 0x01, 0xc0, 0x0f, 0xc0, 0x3f, 0xf0, 0x0f, 0xfc, 0x03, 0xf8, 0x01, + 0x80, 0x1f, 0xc0, 0x3f, 0xf0, 0x0f, 0xfc, 0x03, 0xf8, 0x01, 0x80, 0x1f, + 0xc0, 0x7f, 0xf0, 0x0f, 0xfe, 0x03, 0xfc, 0x01, 0x80, 0x3f, 0xc0, 0x7f, + 0xf8, 0x1f, 0xfe, 0x03, 0xfc, 0x00, 0x80, 0x3f, 0xc0, 0x7f, 0xf8, 0x1f, + 0xfe, 0x03, 0xfe, 0x00, 0x80, 0x7f, 0xc0, 0xff, 0xf8, 0x1f, 0xff, 0x03, + 0xff, 0x00, 0x80, 0xff, 0xc0, 0xff, 0xf8, 0x1f, 0xff, 0x03, 0xff, 0x00, + 0x00, 0xff, 0xc0, 0xff, 0xf8, 0x1f, 0xff, 0x83, 0xff, 0x00, 0x00, 0xff, + 0xc1, 0xff, 0xf9, 0x9f, 0xff, 0x83, 0xff, 0x00, 0x00, 0xff, 0xc3, 0xff, + 0xf9, 0x9f, 0xff, 0xc3, 0xff, 0x00, 0x00, 0xff, 0xc3, 0xff, 0xf9, 0x9f, + 0xff, 0xe3, 0x7f, 0x00, 0x00, 0xff, 0xc7, 0xff, 0xff, 0xff, 0xff, 0xe3, + 0x7f, 0x00, 0x00, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x7f, 0x00, + 0x00, 0xfe, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x7f, 0x00, 0x00, 0xfe, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x7f, 0x00, 0x00, 0xfe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x7f, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x7f, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, + 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0xfc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0xfc, 0xff, 0xff, 0x01, 0x80, + 0xff, 0xff, 0x3f, 0x00, 0x00, 0xf8, 0xff, 0x03, 0xfc, 0x3f, 0xc0, 0xff, + 0x1f, 0x00, 0x00, 0xf0, 0x01, 0xf8, 0x7f, 0xfe, 0x1f, 0x80, 0x1f, 0x00, + 0x00, 0x30, 0xfc, 0xff, 0x1f, 0xf8, 0xff, 0x3f, 0x0c, 0x00, 0x00, 0xe0, + 0xe7, 0xff, 0x07, 0xe0, 0xff, 0xe7, 0x07, 0x00, 0x00, 0xc0, 0x81, 0xff, + 0x1f, 0xf8, 0xff, 0x81, 0x03, 0x00, 0x00, 0x80, 0x00, 0xfe, 0x7f, 0xfe, + 0x7f, 0x00, 0x03, 0x00, 0x00, 0x80, 0x81, 0xff, 0xff, 0xff, 0xff, 0x81, + 0x01, 0x00, 0x00, 0x00, 0xe7, 0xff, 0x01, 0x80, 0xff, 0xe7, 0x00, 0x00, + 0x00, 0x00, 0xff, 0x03, 0xfc, 0x3f, 0xc0, 0xff, 0x00, 0x00, 0x00, 0x80, + 0x01, 0xf8, 0xff, 0xff, 0x1f, 0x80, 0x01, 0x00, 0x00, 0x80, 0xfc, 0xff, + 0xff, 0xff, 0xff, 0x3f, 0x01, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x01, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x03, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, + 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0xe0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00, 0xe0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; diff --git a/gnu/games/chess/Xchess/queen_mask.bitmap b/gnu/games/chess/Xchess/queen_mask.bitmap new file mode 100644 index 0000000..76a5904 --- /dev/null +++ b/gnu/games/chess/Xchess/queen_mask.bitmap @@ -0,0 +1,71 @@ + +#define queen_mask_width 80 +#define queen_mask_height 80 +static char queen_mask_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xe0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x07, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x07, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x07, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xf0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x60, 0x00, 0xf0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x01, + 0xc0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x03, 0xc0, 0x03, + 0xc0, 0x1f, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x03, 0xc0, 0x03, 0xc0, 0x1f, + 0x00, 0x00, 0x00, 0x00, 0xf8, 0x03, 0xe0, 0x07, 0xc0, 0x1f, 0x00, 0x00, + 0x00, 0x00, 0xf8, 0x03, 0xe0, 0x07, 0xc0, 0x1f, 0x00, 0x00, 0x00, 0x00, + 0xf8, 0x01, 0xe0, 0x07, 0xc0, 0x1f, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x01, + 0xe0, 0x07, 0xc0, 0x1f, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x01, 0xe0, 0x07, + 0x80, 0x07, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x01, 0xe0, 0x07, 0x80, 0x07, + 0x00, 0x00, 0x00, 0x00, 0xe0, 0x03, 0xe0, 0x07, 0x80, 0x07, 0x00, 0x00, + 0x00, 0x00, 0xe0, 0x03, 0xf0, 0x0f, 0xc0, 0x07, 0x00, 0x00, 0x00, 0x00, + 0xe0, 0x07, 0xf0, 0x0f, 0xc0, 0x07, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x07, + 0xf0, 0x0f, 0xc0, 0x07, 0x00, 0x00, 0x7e, 0x00, 0xe0, 0x07, 0xf0, 0x0f, + 0xe0, 0x07, 0x00, 0x00, 0x7f, 0x00, 0xe0, 0x0f, 0xf0, 0x0f, 0xe0, 0x07, + 0x00, 0x1f, 0x7f, 0x00, 0xe0, 0x0f, 0xf0, 0x0f, 0xe0, 0x07, 0x80, 0x3f, + 0x7f, 0x00, 0xe0, 0x0f, 0xf0, 0x0f, 0xf0, 0x07, 0x80, 0x3f, 0x7f, 0x00, + 0xe0, 0x0f, 0xf0, 0x0f, 0xf0, 0x07, 0x80, 0x3f, 0xff, 0x00, 0xe0, 0x1f, + 0xf0, 0x0f, 0xf0, 0x07, 0x80, 0x3f, 0xfe, 0x00, 0xe0, 0x1f, 0xf0, 0x0f, + 0xf8, 0x07, 0x80, 0x1f, 0xfc, 0x01, 0xe0, 0x1f, 0xf8, 0x1f, 0xf8, 0x07, + 0x80, 0x1f, 0xf0, 0x03, 0xe0, 0x3f, 0xf8, 0x1f, 0xf8, 0x07, 0xc0, 0x0f, + 0xf0, 0x07, 0xe0, 0x3f, 0xf8, 0x1f, 0xfc, 0x07, 0xe0, 0x03, 0xe0, 0x07, + 0xe0, 0x3f, 0xf8, 0x1f, 0xfc, 0x07, 0xf0, 0x03, 0xe0, 0x0f, 0xe0, 0x7f, + 0xf8, 0x1f, 0xfc, 0x07, 0xf0, 0x03, 0xe0, 0x1f, 0xe0, 0x7f, 0xf8, 0x1f, + 0xfc, 0x07, 0xf8, 0x03, 0xe0, 0x1f, 0xe0, 0x7f, 0xf8, 0x1f, 0xfe, 0x07, + 0xf8, 0x03, 0xe0, 0x3f, 0xe0, 0x7f, 0xf8, 0x1f, 0xfe, 0x07, 0xfc, 0x03, + 0xe0, 0x3f, 0xe0, 0xff, 0xf8, 0x1f, 0xfe, 0x07, 0xfe, 0x03, 0xc0, 0x7f, + 0xe0, 0xff, 0xfc, 0x3f, 0xff, 0x07, 0xfe, 0x03, 0xc0, 0xff, 0xe0, 0xff, + 0xfd, 0x3f, 0xff, 0x07, 0xff, 0x03, 0xc0, 0xff, 0xe1, 0xff, 0xfd, 0xff, + 0xff, 0x87, 0xff, 0x03, 0xc0, 0xff, 0xe3, 0xff, 0xff, 0xff, 0xff, 0x87, + 0xff, 0x01, 0xc0, 0xff, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xc7, 0xff, 0x01, + 0xc0, 0xff, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xc7, 0xff, 0x01, 0x80, 0xff, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xe7, 0xff, 0x01, 0x80, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe7, 0xff, 0x01, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0xff, 0x01, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, + 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, + 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0xfe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0xfe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x7f, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x7f, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, + 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00, 0xf0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x07, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x07, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, + 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0xc0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x03, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x07, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, + 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0xf0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0xf0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; diff --git a/gnu/games/chess/Xchess/queen_outline.bitmap b/gnu/games/chess/Xchess/queen_outline.bitmap new file mode 100644 index 0000000..2527216 --- /dev/null +++ b/gnu/games/chess/Xchess/queen_outline.bitmap @@ -0,0 +1,71 @@ + +#define queen_outline_width 80 +#define queen_outline_height 80 +static char queen_outline_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x60, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x80, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0x01, 0x80, 0x01, 0x00, 0x07, + 0x00, 0x00, 0x00, 0x00, 0x10, 0x01, 0x80, 0x01, 0x80, 0x0d, 0x00, 0x00, + 0x00, 0x00, 0xb0, 0x01, 0xc0, 0x03, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, + 0xe0, 0x00, 0x40, 0x02, 0x80, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, + 0x40, 0x02, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x40, 0x02, + 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x40, 0x02, 0x00, 0x03, + 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x40, 0x02, 0x00, 0x03, 0x00, 0x00, + 0x00, 0x00, 0xc0, 0x01, 0x40, 0x02, 0x80, 0x03, 0x00, 0x00, 0x00, 0x00, + 0x40, 0x01, 0x40, 0x02, 0x80, 0x02, 0x00, 0x00, 0x00, 0x00, 0x40, 0x01, + 0x60, 0x06, 0x80, 0x02, 0x00, 0x00, 0x00, 0x00, 0x40, 0x03, 0x20, 0x04, + 0xc0, 0x02, 0x00, 0x00, 0x1c, 0x00, 0x40, 0x02, 0x20, 0x04, 0x40, 0x02, + 0x00, 0x00, 0x36, 0x00, 0x40, 0x02, 0x20, 0x04, 0x40, 0x02, 0x00, 0x0e, + 0x22, 0x00, 0x40, 0x06, 0x20, 0x04, 0x60, 0x02, 0x00, 0x1b, 0x36, 0x00, + 0x40, 0x04, 0x20, 0x04, 0x20, 0x02, 0x00, 0x11, 0x3c, 0x00, 0x40, 0x04, + 0x20, 0x04, 0x20, 0x02, 0x00, 0x1b, 0x70, 0x00, 0x40, 0x0c, 0x20, 0x04, + 0x30, 0x02, 0x00, 0x0e, 0x60, 0x00, 0x40, 0x08, 0x20, 0x04, 0x10, 0x02, + 0x00, 0x03, 0xe0, 0x00, 0x40, 0x08, 0x30, 0x0c, 0x10, 0x02, 0x80, 0x03, + 0xc0, 0x01, 0x40, 0x18, 0x10, 0x08, 0x18, 0x02, 0x80, 0x01, 0x40, 0x01, + 0x40, 0x10, 0x10, 0x08, 0x08, 0x02, 0xc0, 0x01, 0x40, 0x03, 0x40, 0x10, + 0x10, 0x08, 0x08, 0x02, 0x60, 0x01, 0x40, 0x06, 0x40, 0x10, 0x10, 0x08, + 0x08, 0x02, 0x20, 0x01, 0x40, 0x04, 0x40, 0x30, 0x10, 0x08, 0x0c, 0x02, + 0x30, 0x01, 0xc0, 0x0c, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x18, 0x01, + 0x80, 0x18, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x08, 0x01, 0x80, 0x10, + 0x40, 0x60, 0x10, 0x08, 0x06, 0x02, 0x8c, 0x01, 0x80, 0x30, 0x40, 0x40, + 0x18, 0x18, 0x02, 0x02, 0x84, 0x00, 0x80, 0x20, 0x40, 0x40, 0x08, 0x10, + 0x02, 0x02, 0x86, 0x00, 0x80, 0x60, 0x40, 0xc0, 0x08, 0x10, 0x03, 0x02, + 0x83, 0x00, 0x80, 0xc1, 0x40, 0x80, 0x08, 0x10, 0x01, 0x02, 0x81, 0x00, + 0x00, 0x81, 0x40, 0x80, 0x08, 0x10, 0x01, 0x82, 0x81, 0x00, 0x00, 0x81, + 0x41, 0x80, 0x09, 0x90, 0x01, 0x82, 0x80, 0x00, 0x00, 0x01, 0x43, 0x00, + 0x09, 0x90, 0x00, 0xc2, 0xc0, 0x00, 0x00, 0x01, 0x42, 0x00, 0x09, 0x90, + 0x00, 0x62, 0x40, 0x00, 0x00, 0x01, 0x46, 0x00, 0x0f, 0xf0, 0x00, 0x22, + 0x40, 0x00, 0x00, 0x03, 0x4c, 0x00, 0x00, 0x00, 0x00, 0x32, 0x40, 0x00, + 0x00, 0x02, 0x48, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x40, 0x00, 0x00, 0x02, + 0x58, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x40, 0x00, 0x00, 0x02, 0x70, 0x00, + 0x00, 0x00, 0x00, 0x0e, 0x40, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x40, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x04, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x0c, 0x00, 0x00, 0xfe, 0x7f, + 0x00, 0x00, 0x30, 0x00, 0x00, 0x18, 0x00, 0xfc, 0x03, 0xc0, 0x3f, 0x00, + 0x10, 0x00, 0x00, 0x10, 0xfe, 0x07, 0x80, 0x01, 0xe0, 0x7f, 0x18, 0x00, + 0x00, 0x30, 0x03, 0x00, 0xe0, 0x07, 0x00, 0xc0, 0x0c, 0x00, 0x00, 0x60, + 0x18, 0x00, 0xf8, 0x1f, 0x00, 0x18, 0x06, 0x00, 0x00, 0x40, 0x7e, 0x00, + 0xe0, 0x07, 0x00, 0x7e, 0x02, 0x00, 0x00, 0x40, 0xff, 0x01, 0x80, 0x01, + 0x80, 0xff, 0x02, 0x00, 0x00, 0x40, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x7e, + 0x02, 0x00, 0x00, 0xc0, 0x18, 0x00, 0xfe, 0x7f, 0x00, 0x18, 0x03, 0x00, + 0x00, 0x80, 0x00, 0xfc, 0x03, 0xc0, 0x3f, 0x00, 0x01, 0x00, 0x00, 0x80, + 0xfe, 0x07, 0x00, 0x00, 0xe0, 0x7f, 0x01, 0x00, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, + 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x60, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0xe0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; diff --git a/gnu/games/chess/Xchess/queen_small.bitmap b/gnu/games/chess/Xchess/queen_small.bitmap new file mode 100644 index 0000000..d7ee50e --- /dev/null +++ b/gnu/games/chess/Xchess/queen_small.bitmap @@ -0,0 +1,15 @@ + +#define queen_small_width 32 +#define queen_small_height 32 +static char queen_small_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x80, 0x80, 0x80, 0x00, 0x80, 0x80, 0x80, 0x00, + 0x80, 0x81, 0xc0, 0x00, 0x80, 0x81, 0xc0, 0x00, 0x00, 0xc1, 0x41, 0x00, + 0x00, 0xc1, 0x41, 0x00, 0x02, 0xc3, 0x61, 0x20, 0x06, 0xc3, 0x61, 0x30, + 0x04, 0xc3, 0x61, 0x10, 0x0c, 0xc3, 0x61, 0x18, 0x08, 0xc7, 0x71, 0x08, + 0x18, 0xc6, 0x31, 0x0c, 0x38, 0xc6, 0x31, 0x0e, 0x30, 0xce, 0x39, 0x06, + 0x70, 0xce, 0x39, 0x07, 0x60, 0xee, 0x3b, 0x03, 0xe0, 0xee, 0xbb, 0x03, + 0xe0, 0xff, 0xff, 0x03, 0xc0, 0xff, 0xff, 0x01, 0xc0, 0xff, 0xff, 0x01, + 0x80, 0xff, 0xff, 0x00, 0x80, 0xff, 0xff, 0x00, 0x00, 0xff, 0x7f, 0x00, + 0x80, 0xff, 0xff, 0x00, 0xf0, 0xff, 0xff, 0x07, 0xf0, 0xff, 0xff, 0x07, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; diff --git a/gnu/games/chess/Xchess/queen_small_outline.bitmap b/gnu/games/chess/Xchess/queen_small_outline.bitmap new file mode 100644 index 0000000..0b624b9 --- /dev/null +++ b/gnu/games/chess/Xchess/queen_small_outline.bitmap @@ -0,0 +1,15 @@ + +#define queen_small_outline_width 32 +#define queen_small_outline_height 32 +static char queen_small_outline_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x80, 0x80, 0x80, 0x00, 0x80, 0x80, 0x80, 0x00, + 0x80, 0x81, 0xc0, 0x00, 0x80, 0x81, 0xc0, 0x00, 0x00, 0xc1, 0x41, 0x00, + 0x00, 0x41, 0x41, 0x00, 0x02, 0x43, 0x61, 0x20, 0x06, 0x43, 0x61, 0x30, + 0x04, 0x43, 0x61, 0x10, 0x0c, 0x43, 0x61, 0x18, 0x08, 0x47, 0x71, 0x08, + 0x18, 0x46, 0x31, 0x0c, 0x38, 0x46, 0x31, 0x0e, 0x30, 0x4e, 0x39, 0x06, + 0x70, 0x4e, 0x29, 0x07, 0x60, 0x6a, 0x2b, 0x03, 0xe0, 0x2a, 0xab, 0x03, + 0xe0, 0x3b, 0xee, 0x03, 0x40, 0x00, 0x00, 0x01, 0xc0, 0x00, 0x80, 0x01, + 0x80, 0xfc, 0x9f, 0x00, 0x80, 0x01, 0xc0, 0x00, 0x00, 0x01, 0x40, 0x00, + 0x80, 0xfd, 0xdf, 0x00, 0xf0, 0x00, 0x80, 0x07, 0xf0, 0xff, 0xff, 0x07, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; diff --git a/gnu/games/chess/Xchess/record.c b/gnu/games/chess/Xchess/record.c new file mode 100644 index 0000000..d9459b3 --- /dev/null +++ b/gnu/games/chess/Xchess/record.c @@ -0,0 +1,315 @@ + +/* This file contains code for X-CHESS. + Copyright (C) 1986 Free Software Foundation, Inc. + +This file is part of X-CHESS. + +X-CHESS is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY. No author or distributor +accepts responsibility to anyone for the consequences of using it +or for whether it serves any particular purpose or works at all, +unless he says so in writing. Refer to the X-CHESS General Public +License for full details. + +Everyone is granted permission to copy, modify and redistribute +X-CHESS, but only under the conditions described in the +X-CHESS General Public License. A copy of this license is +supposed to have been given to you along with X-CHESS so you +can know your rights and responsibilities. It should be in a +file named COPYING. Among other things, the copyright notice +and this notice must be preserved on all copies. */ + + +/* RCS Info: $Revision: 1.4 $ on $Date: 86/11/23 17:18:20 $ + * $Source: /users/faustus/xchess/RCS/record.c,v $ + * Copyright (c) 1986 Wayne A. Christopher, U. C. Berkeley CAD Group + * Permission is granted to do anything with this code except sell it + * or remove this message. + * + * Deal with recording moves. + */ + +#include "xchess.h" + +#undef smartass + +bool record_english = true; +char *record_file = DEF_RECORD_FILE; +int movenum = 0; +bool saveflag = false; + +static char *colnames[] = { "qr", "qn", "qb", "q", "k", "kb", "kn", "kr" } ; +static char *pcnames[] = { "P", "R", "N", "B", "Q", "K" } ; + +static char *movestring(); +static char *tstring(); +static FILE *backup; + +#define RECORD_HEADER "\n1 XChess Game Record0\n" + +void +record_init(win) + windata *win; +{ + int i; + + i = XTextWidth(win->medium, RECORD_HEADER, + sizeof(RECORD_HEADER) - 1); + i = (40 * win->small->max_bounds.width - i * + win->medium->max_bounds.width) / + win->medium->max_bounds.width / 2; + TxtGrab(win->display, win->recwin, "xchess", win->small, win->textback.pixel, + win->textcolor.pixel, win->cursorcolor.pixel); + TxtAddFont(win->display, win->recwin, 1, win->medium, win->textcolor.pixel); + for (; i > 0; i++) + TxtWriteStr(win->display, win->recwin, " "); + TxtWriteStr(win->display, win->recwin, RECORD_HEADER); + + if (saveflag) { + if (!(backup = fopen(record_file, "w"))) { + perror(record_file); + saveflag = false; + } else { + fprintf(backup, "X Chess -- %s\n", datestring()); + if (dispname2) + fprintf(backup, "\tWhite on %s, black on %s\n", + dispname1, dispname2); + else + fprintf(backup, "\tGame played on %s\n", + dispname1); + fprintf(backup, "\t%s\n", record_english ? "english" : + "algebraic"); + fflush(backup); + } + } + + movenum = 0; + return; +} + +void +record_reset() +{ + TxtWriteStr(win1->display, win1->recwin, "\n\n1 New Game0\n\n"); + if (!oneboard) { + TxtWriteStr(win2->display, win2->recwin, "\n\n1 New Game0\n\n"); + } + movenum = 0; + if (saveflag) { + fprintf(backup, "\n\nNew Game\n\n"); + fflush(backup); + } + return; +} + +void +record_end(s) + char *s; +{ + char buf[BSIZE]; + + sprintf(buf, "\n%s\n", s); + TxtWriteStr(win1->display, win1->recwin, s); + if (!oneboard) { + TxtWriteStr(win2->display, win2->recwin, s); + } + if (saveflag) { + fprintf(backup, "\n%s\n", s); + fprintf(backup, "Time: white: %s, ", tstring(whiteseconds)); + fprintf(backup, "black: %s\n", tstring(blackseconds)); + fclose(backup); + } + return; +} + +void +record_save() +{ + move *m; + FILE *fp; + int i; + char *s; + + if (!(fp = fopen(record_file, "w"))) { + perror(record_file); + return; + } + fprintf(fp, "X Chess -- %s\n", datestring()); + if (dispname2) + fprintf(fp, "\tWhite on %s, black on %s\n", + dispname1, dispname2); + else + fprintf(fp, "\tGame played on %s\n", dispname1); + fprintf(fp, "\t%s\n", record_english ? "english" : "algebraic"); + + for (m = moves, i = 1; m; i++) { + s = movestring(m); + fprintf(fp, "%2d. %-16s ", i, s); + m = m->next; + if (m) + s = movestring(m); + else + s = ""; + fprintf(fp, "%s\n", s); + if (m) + m = m->next; + } + fclose(fp); + return; +} + +void +record_move(m) + move *m; +{ + char *s, buf[BSIZE]; + + s = movestring(m); + + if (m->piece.color == WHITE) { + movenum++; + sprintf(buf, "%2d. %-16s ", movenum, s); + } else { + sprintf(buf, "%s\n", s); + } + TxtWriteStr(win1->display, win1->recwin, buf); + if (!oneboard) { + TxtWriteStr(win2->display, win2->recwin, buf); + } + if (saveflag) { + fprintf(backup, "%s", buf); + fflush(backup); + } + + return; +} + +void +record_back() +{ + extern move *lastmove; + move *m = lastmove; + char *s = movestring(m); + char buf[BSIZE]; + long i; + + if (m->piece.color == WHITE) { + sprintf(buf, "%2d. %-16s ", movenum, s); + } else { + sprintf(buf, "%s\n", s); + } + s = buf; + for (i = 0; *s != '\0'; i++) + *s++ = ''; /* control H, backspace */ + + TxtWriteStr(win1->display, win1->recwin, buf); + if (!oneboard) { + TxtWriteStr(win2->display, win2->recwin, buf); + } + + if (nexttomove == BLACK) + movenum--; + if (saveflag) { + fseek(backup, -i, 1); + fflush(backup); + } + + return; +} + +static char * +movestring(m) + move *m; +{ + int fy, ty; + static char buf[BSIZE]; + + if (!record_english || (m->piece.color == WHITE)) { + fy = SIZE - m->fromy; + ty = SIZE - m->toy; + } else { + fy = m->fromy + 1; + ty = m->toy + 1; + } + + switch (m->type) { + case MOVE: + if (record_english) + sprintf(buf, "%s/%s%d-%s%d%s", pcnames[(int) m->piece. + type], colnames[m->fromx], fy, + colnames[m->tox], ty, m->check ? "+" : + ""); + else + sprintf(buf, "%c%d%c%d", 'a' + m->fromx, fy, 'a' + + m->tox, ty); + break; + case CAPTURE: + if (record_english) + sprintf(buf, "%s/%s%dx%s/%s%d%s%s", + pcnames[(int) m->piece.type], + colnames[m->fromx], fy, + pcnames[(int) m->taken.type], + colnames[m->tox], ty, + m->enpassant ? "e.p." : "", + m->check ? "+" : ""); + else + sprintf(buf, "%c%d%c%d", 'a' + m->fromx, fy, 'a' + + m->tox, ty); + break; + + case KCASTLE: + if (record_english) + sprintf(buf, "O-O%s", m->check ? "ch" : ""); + else if (m->piece.color == WHITE) + strcpy(buf, "e1g1"); + else + strcpy(buf, "e8g8"); + break; + + case QCASTLE: + if (record_english) + sprintf(buf, "O-O-O%s", m->check ? "ch" : ""); + else if (m->piece.color == WHITE) + strcpy(buf, "e1c1"); + else + strcpy(buf, "e8c8"); + break; + + default: + sprintf(buf, "something strange"); + break; + } + if ((m->piece.type == PAWN) && (((m->piece.color == BLACK) && + (m->toy == 7)) || ((m->piece.color == WHITE) && + (m->toy == 0)))) + strcat(buf, "(Q)"); + +#ifdef smartass + if (!(random() % 50)) + strcat(buf, "?"); + else if (!(random() % 50)) + strcat(buf, "!"); + else if (!(random() % 500)) + strcat(buf, "???"); + else if (!(random() % 500)) + strcat(buf, "!!!"); +#endif smartass + + return (buf); +} + +static char * +tstring(s) + int s; +{ + static char buf[64]; + + if (s > 3600) + sprintf(buf, "%dh %dm %ds", s / 3600, (s % 3600) / 60, s % 60); + else if (s > 60) + sprintf(buf, "%dm %ds", (s % 3600) / 60, s % 60); + else + sprintf(buf, "%ds", s); + return (buf); +} + diff --git a/gnu/games/chess/Xchess/rook.bitmap b/gnu/games/chess/Xchess/rook.bitmap new file mode 100644 index 0000000..f274614 --- /dev/null +++ b/gnu/games/chess/Xchess/rook.bitmap @@ -0,0 +1,71 @@ + +#define rook_width 80 +#define rook_height 80 +static char rook_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xf8, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x01, 0xf8, 0xff, 0x00, 0x3c, + 0x00, 0x00, 0x00, 0x80, 0xff, 0x01, 0xf8, 0xff, 0x00, 0xfc, 0x0f, 0x00, + 0x00, 0xc0, 0xff, 0x01, 0xf8, 0xff, 0x00, 0xfc, 0x1f, 0x00, 0x00, 0xc0, + 0xff, 0x01, 0xf8, 0xff, 0x00, 0xfc, 0x1f, 0x00, 0x00, 0xc0, 0xff, 0x01, + 0xf8, 0xff, 0x00, 0xfc, 0x1f, 0x00, 0x00, 0xc0, 0xff, 0x01, 0xff, 0xff, + 0x07, 0xfc, 0x1f, 0x00, 0x00, 0xc0, 0xff, 0xfd, 0x01, 0x00, 0xfc, 0xfd, + 0x1f, 0x00, 0x00, 0xc0, 0xff, 0x07, 0xfc, 0xff, 0x01, 0xff, 0x1f, 0x00, + 0x00, 0xc0, 0x1f, 0xf0, 0xff, 0xff, 0x7f, 0xc0, 0x1f, 0x00, 0x00, 0x40, + 0xc0, 0xff, 0x07, 0x00, 0xff, 0x1f, 0x10, 0x00, 0x00, 0xc0, 0xff, 0x1f, + 0xf0, 0x7f, 0xc0, 0xff, 0x1f, 0x00, 0x00, 0xc0, 0x7f, 0xc0, 0xfd, 0xff, + 0x1d, 0xf0, 0x1f, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xfd, 0xff, 0xfd, 0x1f, + 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xfd, 0xff, 0xfd, 0x1f, 0x00, 0x00, + 0x00, 0x00, 0xc0, 0xff, 0xfd, 0xff, 0xfd, 0x1f, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0xff, 0xfd, 0xff, 0xfd, 0x1f, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, + 0xfd, 0xff, 0xfd, 0x1f, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xfd, 0xff, + 0xfd, 0x1f, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xfd, 0xff, 0xfd, 0x1f, + 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xfd, 0xff, 0xfd, 0x1f, 0x00, 0x00, + 0x00, 0x00, 0xc0, 0xff, 0xfd, 0xff, 0xfd, 0x1f, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0x7f, 0x00, 0x00, 0xf0, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, + 0xff, 0xfe, 0x07, 0x10, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xfe, + 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xfe, 0xff, 0x1f, + 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xfe, 0xff, 0x1f, 0x00, 0x00, + 0x00, 0x00, 0xc0, 0xff, 0xff, 0xfe, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0xff, 0xff, 0xfe, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, + 0xff, 0xfe, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xfe, + 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xfe, 0xff, 0x1f, + 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xfe, 0xff, 0x1f, 0x00, 0x00, + 0x00, 0x00, 0xc0, 0xff, 0xff, 0xfe, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0xff, 0xff, 0xfe, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, + 0x0f, 0x80, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0xe0, 0x3f, + 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xfd, 0xff, 0xfd, 0x1f, + 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xfd, 0xff, 0xfd, 0x1f, 0x00, 0x00, + 0x00, 0x00, 0xc0, 0xff, 0xfd, 0xff, 0xfd, 0x1f, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0xff, 0xfd, 0xff, 0xfd, 0x1f, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, + 0xfd, 0xff, 0xfd, 0x1f, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xfd, 0xff, + 0xfd, 0x1f, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xfd, 0xff, 0xfd, 0x1f, + 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xfd, 0xff, 0xfd, 0x1f, 0x00, 0x00, + 0x00, 0x00, 0xc0, 0xff, 0xfd, 0xff, 0xfd, 0x1f, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0xff, 0xfd, 0xff, 0xfd, 0x1f, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, + 0xfd, 0xff, 0xfd, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xfd, 0xff, 0x1f, + 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xfd, 0xff, 0x1f, 0x00, 0x00, + 0x00, 0x00, 0xc0, 0xff, 0xff, 0xfd, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0xff, 0xff, 0xfd, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, + 0xff, 0xfd, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xfd, + 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xfd, 0xff, 0x1f, + 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xfd, 0xff, 0x1f, 0x00, 0x00, + 0x00, 0x00, 0xc0, 0xff, 0xff, 0xfd, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0xff, 0xff, 0xfd, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, + 0xff, 0xfd, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xfd, + 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x10, + 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x07, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, + 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x60, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x20, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x20, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x3f, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; diff --git a/gnu/games/chess/Xchess/rook_mask.bitmap b/gnu/games/chess/Xchess/rook_mask.bitmap new file mode 100644 index 0000000..c044416 --- /dev/null +++ b/gnu/games/chess/Xchess/rook_mask.bitmap @@ -0,0 +1,71 @@ + +#define rook_mask_width 80 +#define rook_mask_height 80 +static char rook_mask_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xfc, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfc, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x03, 0xfc, 0xff, + 0x01, 0x7e, 0x00, 0x00, 0x00, 0xc0, 0xff, 0x03, 0xfc, 0xff, 0x01, 0xfe, + 0x1f, 0x00, 0x00, 0xe0, 0xff, 0x03, 0xfc, 0xff, 0x01, 0xfe, 0x3f, 0x00, + 0x00, 0xe0, 0xff, 0x03, 0xfc, 0xff, 0x01, 0xfe, 0x3f, 0x00, 0x00, 0xe0, + 0xff, 0x03, 0xfc, 0xff, 0x1f, 0xfe, 0x3f, 0x00, 0x00, 0xe0, 0xff, 0x83, + 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x3f, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x3f, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, + 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0xe0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0xe0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x3f, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x3f, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, + 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, + 0xe0, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, + 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, + 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0x3f, + 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, + 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, + 0xe0, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, + 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, + 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0x3f, + 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, + 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, + 0xe0, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, + 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, + 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0x3f, + 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, + 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, + 0xe0, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, + 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, + 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0x3f, + 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, + 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, + 0xe0, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, + 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, + 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0x3f, + 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, + 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, + 0xe0, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, + 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, + 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0x3f, + 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, + 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, + 0xe0, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, + 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, + 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0x3f, + 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, + 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, + 0xe0, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, + 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, + 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x01, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, + 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0f, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x1f, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, + 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0xf0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0xf0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x7f, 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x7f, 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, + 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; diff --git a/gnu/games/chess/Xchess/rook_outline.bitmap b/gnu/games/chess/Xchess/rook_outline.bitmap new file mode 100644 index 0000000..f30107a --- /dev/null +++ b/gnu/games/chess/Xchess/rook_outline.bitmap @@ -0,0 +1,71 @@ + +#define rook_outline_width 80 +#define rook_outline_height 80 +static char rook_outline_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xf8, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x01, 0x08, 0x80, 0x00, 0x3c, + 0x00, 0x00, 0x00, 0x80, 0x3f, 0x01, 0x08, 0x80, 0x00, 0xe4, 0x0f, 0x00, + 0x00, 0xc0, 0x00, 0x01, 0x08, 0x80, 0x00, 0x04, 0x18, 0x00, 0x00, 0x40, + 0x00, 0x01, 0x08, 0x80, 0x00, 0x04, 0x10, 0x00, 0x00, 0x40, 0x00, 0x01, + 0x08, 0x80, 0x00, 0x04, 0x10, 0x00, 0x00, 0x40, 0x00, 0x01, 0x0f, 0x80, + 0x07, 0x04, 0x10, 0x00, 0x00, 0x40, 0x00, 0xfd, 0x01, 0x00, 0xfc, 0x05, + 0x10, 0x00, 0x00, 0x40, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x10, 0x00, + 0x00, 0x40, 0x00, 0x00, 0xfc, 0xff, 0x01, 0x00, 0x10, 0x00, 0x00, 0x40, + 0x00, 0xf0, 0x07, 0x00, 0x7f, 0x00, 0x10, 0x00, 0x00, 0x40, 0xc0, 0x1f, + 0x00, 0x00, 0xc0, 0x1f, 0x10, 0x00, 0x00, 0xc0, 0x7f, 0x00, 0x02, 0x00, + 0x02, 0xf0, 0x1f, 0x00, 0x00, 0x00, 0x40, 0x00, 0x02, 0x00, 0x02, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x02, 0x00, 0x02, 0x10, 0x00, 0x00, + 0x00, 0x00, 0x40, 0x00, 0x02, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x02, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, + 0x02, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x02, 0x00, + 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x02, 0x00, 0x02, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x02, 0x00, 0x02, 0x10, 0x00, 0x00, + 0x00, 0x00, 0x40, 0x00, 0x02, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x40, 0x80, 0xff, 0xff, 0x0f, 0x10, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, + 0x00, 0x01, 0xf8, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x01, + 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x01, 0x00, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0x00, + 0x00, 0x00, 0x40, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, + 0x00, 0x01, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x01, + 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x01, 0x00, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0x00, + 0x00, 0x00, 0x40, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, + 0xf0, 0x7f, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0x1f, 0xc0, + 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x02, 0x00, 0x02, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x02, 0x00, 0x02, 0x10, 0x00, 0x00, + 0x00, 0x00, 0x40, 0x00, 0x02, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x02, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, + 0x02, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x02, 0x00, + 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x02, 0x00, 0x02, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x02, 0x00, 0x02, 0x10, 0x00, 0x00, + 0x00, 0x00, 0x40, 0x00, 0x02, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x02, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, + 0x02, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, + 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x02, 0x00, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x02, 0x00, 0x10, 0x00, 0x00, + 0x00, 0x00, 0x40, 0x00, 0x00, 0x02, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x00, 0x02, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, + 0x00, 0x02, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x02, + 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x02, 0x00, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x02, 0x00, 0x10, 0x00, 0x00, + 0x00, 0x00, 0x40, 0x00, 0x00, 0x02, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x00, 0x02, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, + 0x00, 0x02, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x02, + 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff, 0x1f, + 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, + 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x07, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, + 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x60, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x20, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x20, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x3f, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; diff --git a/gnu/games/chess/Xchess/rook_small.bitmap b/gnu/games/chess/Xchess/rook_small.bitmap new file mode 100644 index 0000000..ddee756 --- /dev/null +++ b/gnu/games/chess/Xchess/rook_small.bitmap @@ -0,0 +1,15 @@ + +#define rook_small_width 32 +#define rook_small_height 32 +static char rook_small_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0x73, 0xce, 0x03, 0xc0, 0x73, 0xce, 0x03, 0xc0, 0x73, 0xce, 0x03, + 0xc0, 0x73, 0xce, 0x03, 0xc0, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x00, + 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, + 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, + 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, + 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, + 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, + 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, + 0xe0, 0xff, 0xff, 0x07, 0xe0, 0xff, 0xff, 0x07, 0xe0, 0xff, 0xff, 0x07, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; diff --git a/gnu/games/chess/Xchess/rook_small_outline.bitmap b/gnu/games/chess/Xchess/rook_small_outline.bitmap new file mode 100644 index 0000000..523521b --- /dev/null +++ b/gnu/games/chess/Xchess/rook_small_outline.bitmap @@ -0,0 +1,15 @@ + +#define rook_small_outline_width 32 +#define rook_small_outline_height 32 +static char rook_small_outline_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0x73, 0xce, 0x03, 0x40, 0x52, 0x4a, 0x02, 0x40, 0x52, 0x4a, 0x02, + 0x40, 0x52, 0x4a, 0x02, 0xc0, 0xff, 0xff, 0x03, 0x00, 0x01, 0x80, 0x00, + 0x00, 0x01, 0x80, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x01, 0x80, 0x00, + 0x00, 0x01, 0x80, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x01, 0x80, 0x00, + 0x00, 0x01, 0x80, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x01, 0x80, 0x00, + 0x00, 0x01, 0x80, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x01, 0x80, 0x00, + 0x00, 0x01, 0x80, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x01, 0x80, 0x00, + 0x00, 0x01, 0x80, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x01, 0x80, 0x00, + 0xe0, 0xff, 0xff, 0x07, 0x20, 0x00, 0x00, 0x04, 0xe0, 0xff, 0xff, 0x07, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; diff --git a/gnu/games/chess/Xchess/scrollText.c b/gnu/games/chess/Xchess/scrollText.c new file mode 100644 index 0000000..4320710 --- /dev/null +++ b/gnu/games/chess/Xchess/scrollText.c @@ -0,0 +1,1858 @@ +/* + * A Scrollable Text Output Window + * + * David Harrison + * University of California, Berkeley + * 1986 + * + * The following is an implementation for a scrollable text output + * system. It handles exposure events only (other interactions are + * under user control). For scrolling, a always present scroll bar + * is implemented. It detects size changes and compensates accordingly. + */ + +#include <X11/X.h> +#include <X11/Xlib.h> +#include <X11/X10.h> +#include <sys/types.h> +#include "scrollText.h" + +extern char *malloc(); +extern char *realloc(); +#define alloc(type) (type *) malloc(sizeof(type)) +#define numalloc(type, num) (type *) malloc((unsigned) (num * sizeof(type))) +#define MAXINT 2147483647 + +extern XAssocTable *XCreateAssocTable(); +extern caddr_t XLookUpAssoc(); + +static XAssocTable *textWindows = (XAssocTable *) 0; + +#define NOOPTION -1 /* Option hasn't been set yet */ +#define NORMSCROLL 0 /* Smooth scroll on LineToTop and TopToHere */ +#define JUMPSCROLL 1 /* Jump scrolling on LineToTop and TopToHere */ + +static int ScrollOption = NOOPTION; + +typedef char *Generic; + +#define DEFAULT_GC textInfo->fontGC[textInfo->curFont] + +#define BARSIZE 15 +#define BARBORDER 1 +#define MAXFONTS 8 +#define INITBUFSIZE 1024 +#define INITLINES 50 +#define INITEXPARY 50 +#define XPADDING 2 +#define YPADDING 2 +#define INTERLINE 5 +#define INTERSPACE 1 +#define CURSORWIDTH 2 +#define EXPANDPERCENT 40 +#define BUFSIZE 1024 +#define CUROFFSET 1 +#define MAXFOREIGN 250 +#define NOINDEX -1 + +/* The wrap line indicator */ +#define WRAPINDSIZE 7 +#define STEMOFFSET 5 +#define arrow_width 7 +#define arrow_height 5 +static char arrow_bits[] = { + 0x24, 0x26, 0x3f, 0x06, 0x04}; + +#define NEWLINE '\n' +#define BACKSPACE '\010' +#define NEWFONT '\006' +#define LOWCHAR '\040' +#define HIGHCHAR '\176' + +#define CHARMASK 0x00ff /* Character mask */ +#define FONTMASK 0x0700 /* Character font */ +#define FONTSHIFT 8 /* Shift amount */ + +#define WRAPFLAG 0x01 /* Line wrap flag */ + +/* + * Lines are represented by a pointer into the overall array of + * 16-bit characters. The lower eight bits is used to indicate the character + * (in ASCII), and the next two bits are used to indicate the font + * the character should be drawn in. + */ + +typedef struct txtLine { + int lineLength; /* Current line length */ + int lineHeight; /* Full height of line in pixels */ + int lineBaseLine; /* Current baseline of the line */ + int lineWidth; /* Drawing position at end of line */ + int lineText; /* Offset into master buffer */ + int lineFlags; /* Line wrap flag is here */ +}; + + +/* + * For ExposeCopy events, we queue up the redraw requests collapsing + * them into line redraw requests until the CopyExpose event arrives. + * The queue is represented as a dynamic array of the following + * structure: + */ + +typedef struct expEvent { + int lineIndex; /* Index of line to redraw */ + int ypos; /* Drawing position of line */ +}; + + +/* + * The text buffer is represented using a dynamic counted array + * of 16-bit quantities. This array expands as needed. + * For the screen representation, a dynamic counted array + * of line structures is used. This array points into the + * text buffer to denote the start of each line and its parameters. + * The windows are configured as one overall window which contains + * the scroll bar as a sub-window along its right edge. Thus, + * the text drawing space is actually w-BARSIZE. + */ + +#define NOTATBOTTOM 0x01 /* Need to scroll to bottom before appending */ +#define FONTNUMWAIT 0x02 /* Waiting for font number */ +#define COPYEXPOSE 0x04 /* Need to process a copy expose event */ +#define SCREENWRONG 0x08 /* TxtJamStr has invalidated screen contents */ + +typedef struct txtWin { + /* Basic text buffer */ + int bufAlloc; /* Allocated size of buffer */ + int bufSpot; /* Current writing position in buffer */ + short *mainBuffer; /* Main buffer of text */ + + /* Line information */ + int numLines; /* Number of display lines in buffer */ + int allocLines; /* Number of lines allocated */ + struct txtLine **txtBuffer; /* Dynamic array of lines */ + + /* Current Window display information */ + Window mainWindow; /* Text display window */ + Window scrollBar; /* Subwindow for scroll bar */ + Pixmap arrowMap; /* line wrap indicator */ + int bgPix, fgPix; /* Background and cursor */ + GC CursorGC; /* gc for the cursor */ + GC bgGC; /* gc for erasing things */ + GC fontGC[MAXFONTS]; /* gc for doing fonts */ + XFontStruct theFonts[MAXFONTS];/* Display fonts */ + int theColors[MAXFONTS]; /* foregrounds of the fonts */ + int curFont; /* current font for tracking */ + int w, h; /* Current size */ + int startLine; /* Top line in display */ + int endLine; /* Bottom line in display */ + int bottomSpace; /* Space at bottom of screen */ + int flagWord; /* If non-zero, not at end */ + + /* For handling ExposeCopy events */ + int exposeSize; /* Current size of array */ + int exposeAlloc; /* Allocated size */ + struct expEvent **exposeAry;/* Array of line indices */ + + /* Drawing position information */ + int curLine; /* Current line in buffer */ + int curX; /* Current horizontal positi */ + int curY; /* Current vertical drawing */ +}; + +/* Flags for the various basic character handling functions */ + +#define DODISP 0x01 /* Update the display */ +#define NONEWLINE 0x02 /* Dont append newline */ + + + +static int InitLine(newLine) +struct txtLine *newLine; /* Newly created line structure */ +/* + * This routine initializes a newly created line structure. + */ +{ + newLine->lineLength = 0; + newLine->lineHeight = 0; + newLine->lineBaseLine = 0; + newLine->lineWidth = XPADDING; + newLine->lineText = NOINDEX; + newLine->lineFlags = 0; + return 1; +} + + + + +int TxtGrab(display, txtWin, program, mainFont, bg, fg, cur) +Display *display; /* display window is on */ +Window txtWin; /* Window to take over as scrollable text */ +char *program; /* Program name for Xdefaults */ +XFontStruct *mainFont; /* Primary text font */ +int bg, fg, cur; /* Background, foreground, and cursor colors */ +/* + * This routine takes control of 'txtWin' and makes it into a scrollable + * text output window. It will create a sub-window for the scroll bar + * with a background of 'bg' and an bar with color 'fg'. Both fixed width + * and variable width fonts are supported. Additional fonts can be loaded + * using 'TxtAddFont'. Returns 0 if there were problems, non-zero if + * everything went ok. + */ +{ + struct txtWin *newWin; /* Text package specific information */ + XWindowAttributes winInfo; /* Window information */ + int index; + XGCValues gc_val; + + if (textWindows == (XAssocTable *) 0) { + textWindows = XCreateAssocTable(32); + if (textWindows == (XAssocTable *) 0) return(0); + } + if (XGetWindowAttributes(display, txtWin, &winInfo) == 0) return 0; + + if (ScrollOption == NOOPTION) { + /* Read to see if the user wants jump scrolling or not */ + if (XGetDefault(display, program, "JumpScroll")) { + ScrollOption = JUMPSCROLL; + } else { + ScrollOption = NORMSCROLL; + } + } + + /* Initialize local structure */ + newWin = alloc(struct txtWin); + + /* Initialize arrow pixmap */ + newWin->arrowMap = XCreatePixmapFromBitmapData(display, txtWin, + arrow_bits, + arrow_width, arrow_height, + cur, bg, + DisplayPlanes(display, 0)); + + newWin->bufAlloc = INITBUFSIZE; + newWin->bufSpot = 0; + newWin->mainBuffer = numalloc(short, INITBUFSIZE); + + newWin->numLines = 1; + newWin->allocLines = INITLINES; + newWin->txtBuffer = numalloc(struct txtLine *, INITLINES); + for (index = 0; index < INITLINES; index++) { + newWin->txtBuffer[index] = alloc(struct txtLine); + InitLine(newWin->txtBuffer[index]); + } + + /* Window display information */ + newWin->mainWindow = txtWin; + newWin->w = winInfo.width; + newWin->h = winInfo.height; + newWin->startLine = 0; + newWin->endLine = 0; + newWin->bottomSpace = winInfo.height + - YPADDING - mainFont->ascent - mainFont->descent - INTERLINE; + newWin->flagWord = 0; + newWin->bgPix = bg; + newWin->fgPix = fg; + + /* Scroll Bar Creation */ + newWin->scrollBar = XCreateSimpleWindow(display, txtWin, + winInfo.width - BARSIZE, + 0, BARSIZE - (2*BARBORDER), + winInfo.height - (2*BARBORDER), + BARBORDER, + fg, bg); + XSelectInput(display, newWin->scrollBar, ExposureMask|ButtonReleaseMask); + XMapRaised(display, newWin->scrollBar); + + /* Font and Color Initialization */ + newWin->theFonts[0] = *mainFont; + newWin->theColors[0] = fg; + gc_val.function = GXcopy; + gc_val.plane_mask = AllPlanes; + gc_val.foreground = fg; + gc_val.background = bg; + gc_val.graphics_exposures = 1; + gc_val.font = mainFont->fid; + gc_val.line_width = 1; + gc_val.line_style = LineSolid; + + newWin->fontGC[0] = XCreateGC(display, txtWin, + GCFunction | GCPlaneMask | + GCForeground | GCBackground | + GCGraphicsExposures | GCFont, + &gc_val); + + gc_val.foreground = cur; + newWin->CursorGC = XCreateGC(display, txtWin, + GCFunction | GCPlaneMask | + GCForeground | GCBackground | + GCLineStyle | GCLineWidth, + &gc_val); + + gc_val.foreground = bg; + newWin->bgGC = XCreateGC(display, txtWin, + GCFunction | GCPlaneMask | + GCForeground | GCBackground | + GCGraphicsExposures | GCFont, + &gc_val); + + + for (index = 1; index < MAXFONTS; index++) { + newWin->theFonts[index].fid = 0; + newWin->fontGC[index] = 0; + } + + + /* Initialize size of first line */ + newWin->txtBuffer[0]->lineHeight = newWin->theFonts[0].ascent + + newWin->theFonts[0].descent; + newWin->txtBuffer[0]->lineText = 0; + + /* ExposeCopy array initialization */ + newWin->exposeSize = 0; + newWin->exposeAlloc = INITEXPARY; + newWin->exposeAry = numalloc(struct expEvent *, INITEXPARY); + for (index = 0; index < newWin->exposeAlloc; index++) + newWin->exposeAry[index] = alloc(struct expEvent); + /* Put plus infinity in last slot for sorting purposes */ + newWin->exposeAry[0]->lineIndex = MAXINT; + + /* Drawing Position Information */ + newWin->curLine = 0; + newWin->curX = 0; + newWin->curY = YPADDING + mainFont->ascent + mainFont->descent; + + /* Attach it to both windows */ + XMakeAssoc(display, textWindows, (XID) txtWin, (caddr_t) newWin); + XMakeAssoc(display, textWindows, (XID) newWin->scrollBar, (caddr_t) newWin); + return 1; +} + + +int TxtRelease(display, w) +Display *display; +Window w; /* Window to release */ +/* + * This routine releases all resources associated with the + * specified window which are consumed by the text + * window package. This includes the entire text buffer, line start + * array, and the scroll bar window. However, the window + * itself is NOT destroyed. The routine will return zero if + * the window is not owned by the text window package. + */ +{ + struct txtWin *textInfo; + int index; + + if ((textInfo = (struct txtWin *) XLookUpAssoc(display, + textWindows, (XID) w)) == 0) + return 0; + + for (index = 0; index < MAXFONTS; index++) + if (textInfo->fontGC[index] != 0) + XFreeGC(display, textInfo->fontGC[index]); + + free((Generic) textInfo->mainBuffer); + for (index = 0; index < textInfo->numLines; index++) { + free((Generic) textInfo->txtBuffer[index]); + } + free((Generic) textInfo->txtBuffer); + XDestroyWindow(display, textInfo->scrollBar); + for (index = 0; index < textInfo->exposeSize; index++) { + free((Generic) textInfo->exposeAry[index]); + } + free((Generic) textInfo->exposeAry); + XDeleteAssoc(display, textWindows, (XID) w); + free((Generic) textInfo); + return 1; +} + + + +static int RecompBuffer(textInfo) +struct txtWin *textInfo; /* Text window information */ +/* + * This routine recomputes all line breaks in a buffer after + * a change in window size or font. This is done by throwing + * away the old line start array and recomputing it. Although + * a lot of this work is also done elsewhere, it has been included + * inline here for efficiency. + */ +{ + int startPos, endSize, linenum; + register int index, chsize, curfont; + register short *bufptr; + register XFontStruct *fontptr; + register struct txtLine *lineptr; + char theChar; + + /* Record the old position so we can come back to it */ + for (startPos = textInfo->txtBuffer[textInfo->startLine]->lineText; + (startPos > 0) && (textInfo->mainBuffer[startPos] != '\n'); + startPos--) + /* null loop body */; + + /* Clear out the old line start array */ + for (index = 0; index < textInfo->numLines; index++) { + InitLine(textInfo->txtBuffer[index]); + } + + /* Initialize first line */ + textInfo->txtBuffer[0]->lineHeight = + textInfo->theFonts[0].ascent + textInfo->theFonts[0].descent; + textInfo->txtBuffer[0]->lineText = 0; + + /* Process the text back into lines */ + endSize = textInfo->w - BARSIZE - WRAPINDSIZE; + bufptr = textInfo->mainBuffer; + lineptr = textInfo->txtBuffer[0]; + linenum = 0; + fontptr = &(textInfo->theFonts[0]); + curfont = 0; + for (index = 0; index < textInfo->bufSpot; index++) { + theChar = bufptr[index] & CHARMASK; + + if ((bufptr[index] & FONTMASK) != curfont) { + int newFontNum, heightDiff; + + /* Switch fonts */ + newFontNum = (bufptr[index] & FONTMASK) >> FONTSHIFT; + if (textInfo->theFonts[newFontNum].fid != 0) { + /* Valid font */ + curfont = bufptr[index] & FONTMASK; + fontptr = &(textInfo->theFonts[newFontNum]); + heightDiff = (fontptr->ascent + fontptr->descent) - + lineptr->lineHeight; + if (heightDiff < 0) heightDiff = 0; + lineptr->lineHeight += heightDiff; + } + } + if (theChar == '\n') { + /* Handle new line */ + if (linenum >= textInfo->allocLines-1) + /* Expand number of lines */ + ExpandLines(textInfo); + linenum++; + lineptr = textInfo->txtBuffer[linenum]; + /* Initialize next line */ + lineptr->lineHeight = fontptr->ascent + fontptr->descent; + lineptr->lineText = index+1; + /* Check to see if its the starting line */ + if (index == startPos) textInfo->startLine = linenum; + } else { + /* Handle normal character */ + chsize = CharSize(textInfo, linenum, index); + if (lineptr->lineWidth + chsize > endSize) { + /* Handle line wrap */ + lineptr->lineFlags |= WRAPFLAG; + if (linenum >= textInfo->allocLines-1) + /* Expand number of lines */ + ExpandLines(textInfo); + linenum++; + lineptr = textInfo->txtBuffer[linenum]; + /* Initialize next line */ + lineptr->lineHeight = fontptr->ascent + fontptr->descent; + lineptr->lineText = index; + lineptr->lineLength = 1; + lineptr->lineWidth += chsize; + } else { + /* Handle normal addition of character */ + lineptr->lineLength += 1; + lineptr->lineWidth += chsize; + } + } + } + /* We now have a valid line array. Let's clean up some other fields. */ + textInfo->numLines = linenum+1; + if (startPos == 0) { + textInfo->startLine = 0; + } + textInfo->endLine = FindEndLine(textInfo, &(textInfo->bottomSpace)); + textInfo->curLine = linenum; + /* Check to see if we are at the bottom */ + if (textInfo->endLine >= textInfo->numLines-1) { + textInfo->curY = textInfo->h - textInfo->bottomSpace - + lineptr->lineHeight; + textInfo->flagWord &= (~NOTATBOTTOM); + } else { + textInfo->flagWord |= NOTATBOTTOM; + } + return 1; +} + + + + +int TxtAddFont(display, textWin, fontNumber, newFont, newColor) +Display *display; +Window textWin; /* Scrollable text window */ +int fontNumber; /* Place to add font (0-7) */ +XFontStruct *newFont; /* Font to add */ +int newColor; /* Color of font */ +/* + * This routine loads a new font so that it can be used in a previously + * created text window. There are eight font slots numbered 0 through 7. + * If there is already a font in the specified slot, it will be replaced + * and an automatic redraw of the window will take place. See TxtWriteStr + * for details on using alternate fonts. The color specifies the foreground + * color of the text. The default foreground color is used if this + * parameter is TXT_NO_COLOR. Returns a non-zero value if + * everything went well. + */ +{ + struct txtWin *textInfo; + int redrawFlag; + XGCValues gc_val; + + if ((fontNumber < 0) || (fontNumber >= MAXFONTS)) return 0; + if ((textInfo = (struct txtWin *) + XLookUpAssoc(display, textWindows, (XID) textWin)) == 0) + return 0; + if (newColor == TXT_NO_COLOR) { + newColor = textInfo->fgPix; + } + + gc_val.font = newFont->fid; + gc_val.foreground = newColor; + gc_val.background = textInfo->bgPix; + gc_val.plane_mask = AllPlanes; + gc_val.graphics_exposures = 1; + gc_val.function = GXcopy; + + if (textInfo->fontGC[fontNumber] != 0) + { + XChangeGC(display, textInfo->fontGC[fontNumber], + GCFont | GCForeground, &gc_val); + } + else + textInfo->fontGC[fontNumber] = XCreateGC(display, textWin, + GCFont | + GCForeground | + GCBackground | + GCFunction | + GCPlaneMask | + GCGraphicsExposures, + &gc_val); + + + redrawFlag = (textInfo->theFonts[fontNumber].fid != 0) && + (((newFont) && (newFont->fid != textInfo->theFonts[fontNumber].fid)) || + (newColor != textInfo->theColors[fontNumber])); + if (newFont) { + textInfo->theFonts[fontNumber] = *newFont; + } + textInfo->theColors[fontNumber] = newColor; + + if (redrawFlag) { + RecompBuffer(textInfo); + XClearWindow(display, textWin); + TxtRepaint(display, textWin); + } + return 1; +} + + + +int TxtWinP(display, w) +Display *display; +Window w; +/* + * Returns a non-zero value if the window has been previously grabbed + * using TxtGrab and 0 if it has not. + */ +{ + if (XLookUpAssoc(display, textWindows, (XID) w)) + return(1); + else return(0); +} + + + +static int FindEndLine(textInfo, botSpace) +struct txtWin *textInfo; +int *botSpace; +/* + * Given the starting line in 'textInfo->startLine', this routine + * determines the index of the last line that can be drawn given the + * current size of the screen. If there are not enough lines to + * fill the screen, the index of the last line will be returned. + * The amount of empty bottom space is returned in 'botSpace'. + */ +{ + int index, height, lineHeight; + + height = YPADDING; + index = textInfo->startLine; + while (index < textInfo->numLines) { + lineHeight = textInfo->txtBuffer[index]->lineHeight + INTERLINE; + if (height + lineHeight > textInfo->h) break; + height += lineHeight; + index++; + } + if (botSpace) { + *botSpace = textInfo->h - height; + } + return index - 1; +} + + + +static int UpdateScroll(display, textInfo) +Display *display; +struct txtWin *textInfo; /* Text window information */ +/* + * This routine computes the current extent of the scroll bar + * indicator and repaints the bar with the correct information. + */ +{ + int top, bottom; + + if (textInfo->numLines > 1) { + top = textInfo->startLine * (textInfo->h - 2*BARBORDER) / + (textInfo->numLines - 1); + bottom = textInfo->endLine * (textInfo->h - 2*BARBORDER) / + (textInfo->numLines - 1); + } else { + top = 0; + bottom = textInfo->h - (2*BARBORDER); + } + + /* Draw it - make sure there is a little padding */ + if (top == 0) top++; + if (bottom == textInfo->h-(2*BARBORDER)) bottom--; + + XFillRectangle(display, textInfo->scrollBar, + textInfo->bgGC, + 0, 0, BARSIZE, top-1); + XFillRectangle(display, textInfo->scrollBar, + DEFAULT_GC, top, BARSIZE - (2*BARBORDER) - 2, + bottom - top); + XFillRectangle(display, textInfo->scrollBar, DEFAULT_GC, + 0, bottom+1, BARSIZE, + textInfo->h - (2 * BARBORDER) - bottom); + + return 1; +} + + + + +int TxtClear(display, w) +Display *display; +Window w; +/* + * This routine clears a scrollable text window. It resets the current + * writing position to the upper left hand corner of the screen. + * NOTE: THIS ALSO CLEARS THE CONTENTS OF THE TEXT WINDOW BUFFER AND + * RESETS THE SCROLL BAR. Returns 0 if the window is not a text window. + * This should be used *instead* of XClear. + */ +{ + struct txtWin *textInfo; + int index; + + if ((textInfo = (struct txtWin *) XLookUpAssoc(display, textWindows, (XID) w)) == 0) + return 0; + + /* Zero out the arrays */ + textInfo->bufSpot = 0; + for (index = 0; index < textInfo->numLines; index++) { + InitLine(textInfo->txtBuffer[index]); + } + textInfo->txtBuffer[0]->lineHeight = + textInfo->theFonts[textInfo->curFont].ascent + + textInfo->theFonts[textInfo->curFont].descent; + + textInfo->numLines = 1; + textInfo->startLine = 0; + textInfo->endLine = 0; + textInfo->curLine = 0; + textInfo->curX = 0; + textInfo->curY = YPADDING + textInfo->theFonts[textInfo->curFont].ascent + + textInfo->theFonts[textInfo->curFont].descent; + + textInfo->bottomSpace = textInfo->h - YPADDING - + textInfo->theFonts[textInfo->curFont].ascent - INTERLINE - + textInfo->theFonts[textInfo->curFont].descent; + /* Actually clear the window */ + XClearWindow(display, w); + + /* Draw the current cursor */ + XFillRectangle(display, w, textInfo->CursorGC, + XPADDING + CUROFFSET, textInfo->curY, + CURSORWIDTH, + textInfo->theFonts[textInfo->curFont].ascent + + textInfo->theFonts[textInfo->curFont].descent); + + /* Update the scroll bar */ + UpdateScroll(display, textInfo); + return 1; +} + + +static int WarpToBottom(display, textInfo) +Display *display; +struct txtWin *textInfo; /* Text Information */ +/* + * This routine causes the specified text window to display its + * last screen of information. It updates the scroll bar + * to the appropriate spot. The implementation scans backward + * through the buffer to find an appropriate starting spot for + * the window. + */ +{ + int index, height, lineHeight; + + index = textInfo->numLines-1; + height = 0; + while (index >= 0) { + lineHeight = textInfo->txtBuffer[index]->lineHeight + INTERLINE; + if (height + lineHeight > textInfo->h) break; + height += lineHeight; + index--; + } + textInfo->startLine = index + 1; + textInfo->endLine = FindEndLine(textInfo, &(textInfo->bottomSpace)); + textInfo->curY = textInfo->h - textInfo->bottomSpace - + textInfo->txtBuffer[textInfo->endLine]->lineHeight; + XClearWindow(display, textInfo->mainWindow); + TxtRepaint(display, textInfo->mainWindow); + return 1; +} + + + +static int UpdateExposures(display, textInfo) +Display *display; +struct txtWin *textInfo; /* Text window information */ +/* + * Before a new scrolling action occurs, the text window package + * must handle all COPYEXPOSE events generated by the last scrolling + * action. This routine is called to do this. Foreign events (those + * not handled by TxtFilter) are queued up and replaced on the queue + * after the processing of the exposure events is complete. + */ +{ +#if 0 + XEvent foreignQueue[MAXFOREIGN]; + int index, lastItem = 0; + + while (textInfo->flagWord & COPYEXPOSE) { + XNextEvent(display, &(foreignQueue[lastItem])); + if (!TxtFilter(display, &(foreignQueue[lastItem]))) + lastItem++; + if (lastItem >= MAXFOREIGN) { + printf("Too many foreign events to queue!\n"); + textInfo->flagWord &= (~COPYEXPOSE); + } + } + for (index = 0; index < lastItem; index++) { + XPutBackEvent(display, &(foreignQueue[index])); + } +#endif + return 1; +} + + +static int ScrollDown(display,textInfo) +Display *display; +struct txtWin *textInfo; /* Text window information */ +/* + * This routine scrolls the indicated text window down by one + * line. The line below the current line must exist. The window + * is scrolled so that the line below the last line is fully + * displayed. This may cause many lines to scroll off the top. + * Scrolling is done using XCopyArea. The exposure events should + * be caught using ExposeCopy. + */ +{ + int lineSum, index, targetSpace, freeSpace, updateFlag; + + lineSum = 0; + if (textInfo->endLine + 1 >= textInfo->numLines) return 0; + targetSpace = textInfo->txtBuffer[textInfo->endLine+1]->lineHeight + + INTERLINE; + if (textInfo->bottomSpace < targetSpace) { + index = textInfo->startLine; + while (index < textInfo->endLine) { + lineSum += (textInfo->txtBuffer[index]->lineHeight + INTERLINE); + if (textInfo->bottomSpace + lineSum >= targetSpace) break; + index++; + } + + /* Must move upward by 'lineSum' pixels */ + XCopyArea(display, textInfo->mainWindow, textInfo->mainWindow, + DEFAULT_GC, 0, lineSum, + textInfo->w - BARSIZE, textInfo->h, + 0, 0); + + textInfo->flagWord |= COPYEXPOSE; + /* Repair the damage to the structures */ + textInfo->startLine = index + 1; + updateFlag = 1; + } else { + updateFlag = 0; + } + /* More lines might be able to fit. Let's check. */ + freeSpace = textInfo->bottomSpace + lineSum - targetSpace; + index = textInfo->endLine + 1; + while (index < textInfo->numLines-1) { + if (freeSpace - textInfo->txtBuffer[index+1]->lineHeight - INTERLINE < 0) + break; + freeSpace -= (textInfo->txtBuffer[index+1]->lineHeight + INTERLINE); + index++; + } + textInfo->endLine = index; + textInfo->bottomSpace = freeSpace; + if (updateFlag) { + UpdateExposures(display, textInfo); + } + UpdateScroll(display, textInfo); + return 1; +} + + + + +static int ExpandLines(textInfo) +struct txtWin *textInfo; /* Text Information */ +/* + * This routine allocates and initializes additional space in + * the line start array (txtBuffer). The new space + * is allocated using realloc. The expansion factor is a percentage + * given by EXPANDPERCENT. + */ +{ + int newSize, index; + + newSize = textInfo->allocLines; + newSize += (newSize * EXPANDPERCENT) / 100; + + textInfo->txtBuffer = (struct txtLine **) + realloc((char *) textInfo->txtBuffer, + (unsigned) (newSize * sizeof(struct txtLine *))); + for (index = textInfo->allocLines; index < newSize; index++) { + textInfo->txtBuffer[index] = alloc(struct txtLine); + InitLine(textInfo->txtBuffer[index]); + } + textInfo->allocLines = newSize; + return 1; +} + +static int ExpandBuffer(textInfo) +struct txtWin *textInfo; /* Text information */ +/* + * Expands the basic character buffer using realloc. The expansion + * factor is a percentage given by EXPANDPERCENT. + */ +{ + int newSize; + + newSize = textInfo->bufAlloc + (textInfo->bufAlloc * EXPANDPERCENT) / 100; + textInfo->mainBuffer = (short *) + realloc((char *) textInfo->mainBuffer, (unsigned) newSize * sizeof(short)); + textInfo->bufAlloc = newSize; + return 1; +} + + + +static int HandleNewLine(display, textInfo, flagWord) +Display *display; +struct txtWin *textInfo; /* Text Information */ +int flagWord; /* DODISP or NONEWLINE or both */ +/* + * This routine initializes the next line for drawing by setting + * its height to the current font height, scrolls the screen down + * one line, and updates the current drawing position to the + * left edge of the newly cleared line. If DODISP is specified, + * the screen will be updated (otherwise not). If NONEWLINE is + * specified, no newline character will be added to the text buffer + * (this is for line wrap). + */ +{ + struct txtLine *curLine, *nextLine; + + /* Check to see if a new line must be allocated */ + if (textInfo->curLine >= textInfo->allocLines-1) + /* Expand the number of lines */ + ExpandLines(textInfo); + textInfo->numLines += 1; + + /* Then we initialize the next line */ + nextLine = textInfo->txtBuffer[textInfo->numLines-1]; + nextLine->lineHeight = + textInfo->theFonts[textInfo->curFont].ascent + + textInfo->theFonts[textInfo->curFont].descent; + + curLine = textInfo->txtBuffer[textInfo->curLine]; + if (flagWord & DODISP) { + /* Scroll down a line if required */ + if ((textInfo->curY + curLine->lineHeight + + nextLine->lineHeight + (INTERLINE * 2)) > textInfo->h) + { + ScrollDown(display, textInfo); + } + else + { + /* Update the bottom space appropriately */ + textInfo->bottomSpace -= (nextLine->lineHeight + INTERLINE); + textInfo->endLine += 1; + } + /* Update drawing position */ + textInfo->curY = textInfo->h - + (textInfo->bottomSpace + nextLine->lineHeight); + } + + /* Move down a line */ + textInfo->curLine += 1; + if (!(flagWord & NONEWLINE)) { + /* Append end-of-line to text buffer */ + if (textInfo->bufSpot >= textInfo->bufAlloc) { + /* Allocate more space in main text buffer */ + ExpandBuffer(textInfo); + } + textInfo->mainBuffer[(textInfo->bufSpot)++] = + (textInfo->curFont << FONTSHIFT) | '\n'; + } + nextLine->lineText = textInfo->bufSpot; + textInfo->curX = 0; + return 1; +} + + + +static int CharSize(textInfo, lineNum, charNum) +struct txtWin *textInfo; /* Current Text Information */ +int lineNum; /* Line in buffer */ +int charNum; /* Character in line */ +/* + * This routine determines the size of the specified character. + * It takes in account the font of the character and whether its + * fixed or variable. The size includes INTERSPACE spacing between + * the characters. + */ +{ + register XFontStruct *charFont; + register short *theLine; + register short theChar; + + theLine = &(textInfo->mainBuffer[textInfo->txtBuffer[lineNum]->lineText]); + theChar = theLine[charNum] & CHARMASK; + charFont = &(textInfo->theFonts[(theChar & FONTMASK) >> FONTSHIFT]); + if (theChar <= charFont->min_char_or_byte2 || + theChar >= charFont->max_char_or_byte2 || + charFont->per_char == 0) + return charFont->max_bounds.width + 1; + else + return charFont->per_char[theChar].width + 1; +} + + + + + +static int HandleBackspace(display, textInfo, flagWord) +Display *display; +struct txtWin *textInfo; /* Text Information */ +int flagWord; /* DODISP or nothing */ +/* + * This routine handles a backspace found in the input stream. The + * character before the current writing position will be erased and + * the drawing position will move back one character. If the writing + * position is at the left margin, the drawing position will move + * up to the previous line. If it is a line that has been wrapped, + * the character at the end of the previous line will be erased. + */ +{ + struct txtLine *thisLine, *prevLine; + int chSize; + + thisLine = textInfo->txtBuffer[textInfo->curLine]; + /* First, determine whether we need to go back a line */ + if (thisLine->lineLength == 0) { + /* Bleep if at top of buffer */ + if (textInfo->curLine == 0) { + XBell(display, 50); + return 0; + } + + /* See if we have to scroll in the other direction */ + if ((flagWord & DODISP) && (textInfo->curY <= YPADDING)) { + /* This will display the last lines of the buffer */ + WarpToBottom(display, textInfo); + } + + /* Set drawing position at end of previous line */ + textInfo->curLine -= 1; + prevLine = textInfo->txtBuffer[textInfo->curLine]; + textInfo->numLines -= 1; + if (flagWord & DODISP) { + textInfo->curY -= (prevLine->lineHeight + INTERLINE); + textInfo->bottomSpace += (thisLine->lineHeight + INTERLINE); + textInfo->endLine -= 1; + } + + /* We are unlinewrapping if the previous line has flag set */ + if (prevLine->lineFlags & WRAPFLAG) { + /* Get rid of line wrap indicator */ + if (flagWord & DODISP) { + XFillRectangle(display, textInfo->mainWindow, + textInfo->bgGC, + textInfo->w - BARSIZE - WRAPINDSIZE, + textInfo->curY, WRAPINDSIZE, + prevLine->lineHeight); + } + prevLine->lineFlags &= (~WRAPFLAG); + /* Call recursively to wipe out the ending character */ + HandleBackspace(display, textInfo, flagWord); + } else { + /* Delete the end-of-line in the primary buffer */ + textInfo->bufSpot -= 1; + } + } else { + /* Normal deletion of character */ + chSize = + CharSize(textInfo, textInfo->curLine, + textInfo->txtBuffer[textInfo->curLine]->lineLength - 1); + /* Move back appropriate amount and wipe it out */ + thisLine->lineWidth -= chSize; + if (flagWord & DODISP) { + XFillRectangle(display, textInfo->mainWindow, + textInfo->bgGC, + thisLine->lineWidth, textInfo->curY, + chSize, thisLine->lineHeight); + } + /* Delete from buffer */ + textInfo->txtBuffer[textInfo->curLine]->lineLength -= 1; + textInfo->bufSpot -= 1; + } + return 1; +} + + + +static int DrawLineWrap(display, win, x, y, h, col) +Display *display; +Window win; /* What window to draw it in */ +int x, y; /* Position of upper left corner */ +int h; /* Height of indicator */ +int col; /* Color of indicator */ +/* + * This routine draws a line wrap indicator at the end of a line. + * Visually, it is an arrow of the specified height directly against + * the scroll bar border. The bitmap used for the arrow is stored + * in 'arrowMap' with size 'arrow_width' and 'arrow_height'. + */ +{ + struct txtWin *textInfo; + + textInfo = (struct txtWin *)XLookUpAssoc(display, textWindows, + (XID) win); + + /* First, draw the arrow */ + XCopyArea(display, textInfo->arrowMap, textInfo->mainWindow, + textInfo->CursorGC, + 0, 0, arrow_width, arrow_height, + x, y + h - arrow_height, 1); + + /* Then draw the stem */ + XDrawLine(display, textInfo->mainWindow, textInfo->CursorGC, + x + STEMOFFSET, y, + x + STEMOFFSET, y + h - arrow_height); + return 1; +} + + + + +static int DrawLine(display, textInfo, lineIndex, ypos) +Display *display; +struct txtWin *textInfo; /* Text window information */ +int lineIndex; /* Index of line to draw */ +int ypos; /* Y position for line */ +/* + * This routine destructively draws the indicated line in the + * indicated window at the indicated position. It does not + * clear to end of line however. It draws a line wrap indicator + * if needed but does not draw a cursor. + */ +{ + int index, startPos, curFont, theColor, curX, saveX, fontIndex; + struct txtLine *someLine; + char lineBuffer[BUFSIZE], *glyph; + short *linePointer; + XFontStruct *theFont; + XGCValues gc; + + /* First, we draw the text */ + index = 0; + curX = XPADDING; + someLine = textInfo->txtBuffer[lineIndex]; + linePointer = &(textInfo->mainBuffer[someLine->lineText]); + while (index < someLine->lineLength) { + startPos = index; + saveX = curX; + curFont = linePointer[index] & FONTMASK; + fontIndex = curFont >> FONTSHIFT; + theFont = &(textInfo->theFonts[fontIndex]); + theColor = textInfo->theColors[fontIndex]; + glyph = &(lineBuffer[0]); + while ((index < someLine->lineLength) && + ((linePointer[index] & FONTMASK) == curFont)) + { + *glyph = linePointer[index] & CHARMASK; + index++; + curX += CharSize(textInfo, lineIndex, index); + glyph++; + } + + /* Flush out the glyphs */ + XFillRectangle(display, textInfo->mainWindow, + textInfo->bgGC, + saveX, ypos, + textInfo->w - BARSIZE, + someLine->lineHeight + YPADDING + INTERLINE); + + XDrawString(display, textInfo->mainWindow, + textInfo->fontGC[fontIndex], + saveX, ypos, + lineBuffer, someLine->lineLength); + } + /* Then the line wrap indicator (if needed) */ + if (someLine->lineFlags & WRAPFLAG) { + DrawLineWrap(display, textInfo->mainWindow, + textInfo->w - BARSIZE - WRAPINDSIZE, + ypos, someLine->lineHeight, + textInfo->fgPix); + } + return 1; +} + + + + +static int HandleNewFont(display, fontNum, textInfo, flagWord) +Display *display; +int fontNum; /* Font number */ +struct txtWin *textInfo; /* Text information */ +int flagWord; /* DODISP or nothing */ +/* + * This routine handles a new font request. These requests take + * the form "^F<digit>". The parsing is done in TxtWriteStr. + * This routine is called only if the form is valid. It may return + * a failure (0 status) if the requested font is not loaded. + * If the new font is larger than any of the current + * fonts on the line, it will change the line height and redisplay + * the line. + */ +{ + struct txtLine *thisLine; + int heightDiff, baseDiff, redrawFlag; + + if (textInfo->theFonts[fontNum].fid == 0) { + return 0; + } else { + thisLine = textInfo->txtBuffer[textInfo->curLine]; + textInfo->curFont = fontNum; + redrawFlag = 0; + heightDiff = textInfo->theFonts[fontNum].ascent + + textInfo->theFonts[fontNum].descent - + thisLine->lineHeight; + + if (heightDiff > 0) { + redrawFlag = 1; + } else { + heightDiff = 0; + } + + if (redrawFlag) { + if (flagWord & DODISP) { + /* Clear current line */ + XFillRectangle(display, textInfo->mainWindow, + textInfo->bgGC, + 0, textInfo->curY, textInfo->w, + thisLine->lineHeight); + + /* Check to see if it requires scrolling */ + if ((textInfo->curY + thisLine->lineHeight + heightDiff + + INTERLINE) > textInfo->h) + { + /* + * General approach: "unscroll" the last line up + * and then call ScrollDown to do the right thing. + */ + textInfo->endLine -= 1; + textInfo->bottomSpace += thisLine->lineHeight + + INTERLINE; + + XFillRectangle(display, textInfo->mainWindow, + textInfo->bgGC, + 0, textInfo->h - textInfo->bottomSpace, + textInfo->w, textInfo->bottomSpace); + + thisLine->lineHeight += heightDiff; + ScrollDown(display, textInfo); + textInfo->curY = textInfo->h - + (textInfo->bottomSpace + INTERLINE + + thisLine->lineHeight); + } + else + { + /* Just update bottom space */ + textInfo->bottomSpace -= heightDiff; + thisLine->lineHeight += heightDiff; + } + /* Redraw the current line */ + DrawLine(display, textInfo, textInfo->curLine, textInfo->curY); + } else { + /* Just update line height */ + thisLine->lineHeight += heightDiff; + } + } + return 1; + } +} + + + +int TxtWriteStr(display, w, str) +Display *display; +Window w; /* Text window */ +register char *str; /* 0 terminated string */ +/* + * This routine writes a string to the specified text window. + * The following notes apply: + * - Text is always appended to the end of the text buffer. + * - If the scroll bar is positioned such that the end of the + * text is not visible, an automatic scroll to the bottom + * will be done before the appending of text. + * - Non-printable ASCII characters are not displayed. + * - The '\n' character causes the current text position to + * advance one line and start at the left. + * - Tabs are not supported. + * - Lines too long for the screen will be wrapped and a line wrap + * indication will be drawn. + * - Backspace clears the previous character. It will do the right + * thing if asked to backspace past a wrapped line. + * - A new font can be chosen using the sequence '^F<digit>' where + * <digit> is 0-7. The directive will be ignored if + * there is no font in the specified slot. + * Returns 0 if something went wrong. + */ +{ + register int fontIndex; + register struct txtWin *textInfo; + register struct txtLine *thisLine; + + if ((textInfo = (struct txtWin *) XLookUpAssoc(display, textWindows, (XID) w)) == 0) + return 0; + + /* See if screen needs to be updated */ + if (textInfo->flagWord & SCREENWRONG) { + TxtRepaint(display, textInfo->mainWindow); + } + + /* See if we have to scroll down to the bottom */ + if (textInfo->flagWord & NOTATBOTTOM) { + WarpToBottom(display, textInfo); + textInfo->flagWord &= (~NOTATBOTTOM); + } + + /* Undraw the current cursor */ + thisLine = textInfo->txtBuffer[textInfo->curLine]; + + XFillRectangle(display, w, textInfo->bgGC, + thisLine->lineWidth + CUROFFSET, + textInfo->curY, + CURSORWIDTH, + thisLine->lineHeight); + + for ( /* str is ok */ ; (*str != 0) ; str++) { + /* Check to see if we are waiting on a font */ + if (textInfo->flagWord & FONTNUMWAIT) { + textInfo->flagWord &= (~FONTNUMWAIT); + fontIndex = *str - '0'; + if ((fontIndex >= 0) && (fontIndex < MAXFONTS)) { + /* Handle font -- go get next character */ + if (HandleNewFont(display, fontIndex, textInfo, DODISP)) + continue; + } + } + + /* Inline code for handling normal character case */ + if ((*str >= LOWCHAR) && (*str <= HIGHCHAR)) { + register XFontStruct *thisFont; + register struct txtLine *thisLine; + register int charWidth; + int thisColor; + + /* Determine size of character */ + thisFont = &(textInfo->theFonts[textInfo->curFont]); + thisColor = textInfo->theColors[textInfo->curFont]; + if (*str <= thisFont->min_char_or_byte2 || + *str >= thisFont->max_char_or_byte2 || + thisFont->per_char == 0) + charWidth = thisFont->max_bounds.width + 1; + else + charWidth = thisFont->per_char[*str].width + 1; + + /* Check to see if line wrap is required */ + thisLine = textInfo->txtBuffer[textInfo->curLine]; + if (thisLine->lineWidth + charWidth > + (textInfo->w-BARSIZE-WRAPINDSIZE)) + { + DrawLineWrap(display, textInfo->mainWindow, + textInfo->w-BARSIZE-WRAPINDSIZE, + textInfo->curY, thisLine->lineHeight, + textInfo->fgPix); + thisLine->lineFlags |= WRAPFLAG; + /* Handle the spacing problem the same way as a newline */ + HandleNewLine(display, textInfo, DODISP | NONEWLINE); + thisLine = textInfo->txtBuffer[textInfo->curLine]; + } + + /* Ready to draw character */ + XDrawString(display, textInfo->mainWindow, + DEFAULT_GC, + textInfo->curX += charWidth, + textInfo->curY + thisLine->lineHeight, + str, 1); + + /* Append character onto main buffer */ + if (textInfo->bufSpot >= textInfo->bufAlloc) + /* Make room for more characters */ + ExpandBuffer(textInfo); + textInfo->mainBuffer[(textInfo->bufSpot)++] = + (textInfo->curFont << FONTSHIFT) | (*str); + + /* Update the line start array */ + thisLine->lineLength += 1; + thisLine->lineWidth += charWidth; + } else if (*str == NEWLINE) { + HandleNewLine(display, textInfo, DODISP); + } else if (*str == NEWFONT) { + /* Go into waiting for font number mode */ + textInfo->flagWord |= FONTNUMWAIT; + } else if (*str == BACKSPACE) { + HandleBackspace(display, textInfo, DODISP); + } else { + /* Ignore all others */ + } + } + /* Draw the cursor in its new position */ + thisLine = textInfo->txtBuffer[textInfo->curLine]; + + XFillRectangle(display, w, textInfo->CursorGC, + thisLine->lineWidth + CUROFFSET, + textInfo->curY /* + thisLine->lineHeight */, + CURSORWIDTH, thisLine->lineHeight); + + return 1; +} + + + +int TxtJamStr(display, w, str) +Display *display; +Window w; /* Text window */ +register char *str; /* NULL terminated string */ +/* + * This is the same as TxtWriteStr except the screen is NOT updated. + * After a call to this routine, TxtRepaint should be called to + * update the screen. This routine is meant to be used to load + * a text buffer with information and then allow the user to + * scroll through it at will. + */ +{ + register int fontIndex; + register struct txtWin *textInfo; + + if ((textInfo = (struct txtWin *) XLookUpAssoc(display, textWindows, (XID) w) + ) == 0) + return 0; + + for ( /* str is ok */ ; (*str != 0) ; str++) { + /* Check to see if we are waiting on a font */ + if (textInfo->flagWord & FONTNUMWAIT) { + textInfo->flagWord &= (~FONTNUMWAIT); + fontIndex = *str - '0'; + if ((fontIndex >= 0) && (fontIndex < MAXFONTS)) { + if (HandleNewFont(display, fontIndex, textInfo, 0)) { + /* Handled font -- go get next character */ + continue; + } + } + } + /* Inline code for handling normal character case */ + if ((*str >= LOWCHAR) && (*str <= HIGHCHAR)) { + register XFontStruct *thisFont; + register struct txtLine *thisLine; + register int charWidth; + + /* Determine size of character */ + thisFont = &(textInfo->theFonts[textInfo->curFont]); + + if (*str <= thisFont->min_char_or_byte2 || + *str >= thisFont->max_char_or_byte2 || + thisFont->per_char == 0) + charWidth = thisFont->max_bounds.width + 1; + else + charWidth = thisFont->per_char[*str].width + 1; + + /* Check to see if line wrap is required */ + thisLine = textInfo->txtBuffer[textInfo->curLine]; + if (thisLine->lineWidth + charWidth > + (textInfo->w-BARSIZE-WRAPINDSIZE)) + { + thisLine->lineFlags |= WRAPFLAG; + /* Handle the spacing problem the same way as a newline */ + HandleNewLine(display, textInfo, NONEWLINE); + thisLine = textInfo->txtBuffer[textInfo->curLine]; + } + /* Append character onto main buffer */ + if (textInfo->bufSpot >= textInfo->bufAlloc) + /* Make room for more characters */ + ExpandBuffer(textInfo); + textInfo->mainBuffer[(textInfo->bufSpot)++] = + (textInfo->curFont << FONTSHIFT) | (*str); + + /* Update the line start array */ + thisLine->lineLength += 1; + thisLine->lineWidth += charWidth; + } else if (*str == NEWLINE) { + HandleNewLine(display, textInfo, 0); + } else if (*str == NEWFONT) { + /* Go into waiting for font number mode */ + textInfo->flagWord |= FONTNUMWAIT; + } else if (*str == BACKSPACE) { + HandleBackspace(display, textInfo, 0); + } else { + /* Ignore all others */ + } + } + textInfo->flagWord |= SCREENWRONG; + return 1; +} + + + +int TxtRepaint(display,w) +Display *display; +Window w; +/* + * Repaints the given scrollable text window. The routine repaints + * the entire window. For handling exposure events, the TxtFilter + * routine should be used. + */ +{ + struct txtWin *textInfo; + int index, ypos; + + if ((textInfo = (struct txtWin *) XLookUpAssoc(display, textWindows, (XID) w) + ) == 0) + return 0; + + /* Check to see if the screen is up to date */ + if (textInfo->flagWord & SCREENWRONG) { + textInfo->endLine = FindEndLine(textInfo, &(textInfo->bottomSpace)); + textInfo->flagWord &= (~SCREENWRONG); + } + + ypos = YPADDING; + index = textInfo->startLine; + for (;;) { + DrawLine(display, textInfo, index, ypos); + if (index >= textInfo->endLine) break; + ypos += (textInfo->txtBuffer[index]->lineHeight + INTERLINE); + index++; + } + /* Draw the cursor (if on screen) */ + if (textInfo->endLine == textInfo->curLine) { + XFillRectangle(display, w, textInfo->CursorGC, + textInfo->txtBuffer[index]->lineWidth + CUROFFSET, + ypos /* + textInfo->txtBuffer[index]->lineHeight */, + CURSORWIDTH, textInfo->txtBuffer[index]->lineHeight); + + } + /* Update the scroll bar */ + UpdateScroll(display, textInfo); + return 1; +} + + + +static int InsertIndex(textInfo, thisIndex, ypos) +struct txtWin *textInfo; /* Text Window Information */ +int thisIndex; /* Line index of exposed line */ +int ypos; /* Drawing position of line */ +/* + * This routine inserts the supplied line index into the copy + * exposure array for 'textInfo'. The array is kept sorted + * from lowest to highest using insertion sort. The array + * is dynamically expanded if needed. + */ +{ + struct expEvent *newItem; + int newSize, index, downIndex; + + /* Check to see if we need to expand it */ + if ((textInfo->exposeSize + 3) >= textInfo->exposeAlloc) { + newSize = textInfo->exposeAlloc + + (textInfo->exposeAlloc * EXPANDPERCENT / 100); + textInfo->exposeAry = (struct expEvent **) + realloc((char *) textInfo->exposeAry, + (unsigned) (newSize * sizeof(struct expEvent *))); + for (index = textInfo->exposeAlloc; index < newSize; index++) + textInfo->exposeAry[index] = alloc(struct expEvent); + textInfo->exposeAlloc = newSize; + } + /* Find spot for insertion. NOTE: last spot has big number */ + for (index = 0; index <= textInfo->exposeSize; index++) { + if (textInfo->exposeAry[index]->lineIndex >= thisIndex) { + if (textInfo->exposeAry[index]->lineIndex > thisIndex) { + /* Insert before this entry */ + newItem = textInfo->exposeAry[textInfo->exposeSize+1]; + for (downIndex = textInfo->exposeSize; + downIndex >= index; + downIndex--) + { + textInfo->exposeAry[downIndex+1] = + textInfo->exposeAry[downIndex]; + } + /* Put a free structure at this spot */ + textInfo->exposeAry[index] = newItem; + /* Fill it in */ + textInfo->exposeAry[index]->lineIndex = thisIndex; + textInfo->exposeAry[index]->ypos = ypos; + /* Break out of loop */ + textInfo->exposeSize += 1; + } + break; + } + } + return 1; +} + + + +static int ScrollUp(display, textInfo) +Display *display; +struct txtWin *textInfo; /* Text window information */ +/* + * This routine scrolls the indicated text window up by one + * line. The line above the current line must exist. The + * window is scrolled so that the line above the start line + * is displayed at the top of the screen. This may cause + * many lines to scroll off the bottom. The scrolling is + * done using XCopyArea. The exposure events should be caught + * by ExposeCopy. + */ +{ + int targetSpace; + + /* Make sure all exposures have been handled by now */ + if (textInfo->startLine == 0) return 0; + targetSpace = textInfo->txtBuffer[textInfo->startLine-1]->lineHeight + + INTERLINE; + /* Move the area downward by the target amount */ + XCopyArea(display, textInfo->mainWindow, textInfo->mainWindow, + DEFAULT_GC, + 0, YPADDING, textInfo->w - BARSIZE, + textInfo->h, 0, targetSpace); + + textInfo->flagWord |= COPYEXPOSE; + /* Update the text window parameters */ + textInfo->startLine -= 1; + textInfo->endLine = FindEndLine(textInfo, &(textInfo->bottomSpace)); + + /* Clear out bottom space region */ + XClearArea(display, textInfo->mainWindow, + 0, textInfo->h - textInfo->bottomSpace, + textInfo->w, textInfo->bottomSpace); + + UpdateExposures(display, textInfo); + UpdateScroll(display, textInfo); + + return 1; +} + + +static int ScrollToSpot(display, textInfo, ySpot) +Display *display; +struct txtWin *textInfo; /* Text window information */ +int ySpot; /* Button position in scroll window */ +/* + * This routine scrolls the specified text window relative to the + * position of the mouse in the scroll bar. The center of the screen + * will be positioned to correspond to the mouse position. + */ +{ + int targetLine, aboveLines; + + targetLine = textInfo->numLines * ySpot / textInfo->h; + textInfo->startLine = targetLine; + textInfo->endLine = FindEndLine(textInfo, &(textInfo->bottomSpace)); + aboveLines = 0; + /* Make the target line the *center* of the window */ + while ((textInfo->startLine > 0) && + (aboveLines < textInfo->endLine - targetLine)) + { + textInfo->startLine -= 1; + textInfo->endLine = FindEndLine(textInfo, &(textInfo->bottomSpace)); + aboveLines++; + } + if (textInfo->endLine == textInfo->numLines-1) { + WarpToBottom(display, textInfo); + } else { + XClearWindow(display, textInfo->mainWindow); + TxtRepaint(display, textInfo->mainWindow); + } + return 1; +} + + + +static int LineToTop(display, textInfo, pos) +Display *display; +struct txtWin *textInfo; /* Text window information */ +int pos; /* Y position of mouse */ +/* + * This routine scrolls the screen down until the line at the + * mouse position is at the top of the screen. It stops + * if it can't scroll the buffer down that far. If the + * global 'ScrollOption' is NORMSCROLL, a smooth scroll + * is used. Otherwise, it jumps to the right position + * and repaints the screen. + */ +{ + int index, sum; + + /* First, we find the current line */ + sum = 0; + for (index = textInfo->startLine; index <= textInfo->endLine; index++) { + if (sum + textInfo->txtBuffer[index]->lineHeight + INTERLINE> pos) break; + sum += textInfo->txtBuffer[index]->lineHeight + INTERLINE; + } + /* We always want to scroll down at least one line */ + if (index == textInfo->startLine) index++; + if (ScrollOption == NORMSCROLL) { + /* Scroll down until 'index' is the starting line */ + while ((textInfo->startLine < index) && ScrollDown(display, textInfo)) + { + /* Empty Loop Body */ + } + } else { + /* Immediately jump to correct spot */ + textInfo->startLine = index; + textInfo->endLine = FindEndLine(textInfo, &(textInfo->bottomSpace)); + if (textInfo->endLine == textInfo->numLines-1) { + WarpToBottom(display, textInfo); + } else { + XClearWindow(display, textInfo->mainWindow); + TxtRepaint(display, textInfo->mainWindow); + } + } + /* Check to see if at end of buffer */ + if (textInfo->endLine >= textInfo->numLines-1) { + textInfo->flagWord &= (~NOTATBOTTOM); + } + return 1; +} + + + +static int TopToHere(display, textInfo, pos) +Display *display; +struct txtWin *textInfo; /* Text window information */ +int pos; /* Y position of mouse */ +/* + * This routine scrolls the screen up until the top line of + * the screen is at the current Y position of the mouse. Again, + * it will stop if it can't scroll that far. If the global + * 'ScrollOption' is NORMSCROLL, a smooth scroll is used. + * If it's not, it will simply redraw the screen at the + * correct spot. + */ +{ + int sum, target, linesup, index; + + target = pos - textInfo->txtBuffer[textInfo->startLine]->lineHeight; + /* We always want to scroll up at least one line */ + if (target <= 0) target = 1; + sum = 0; + linesup = 0; + /* Check to see if we are at the top anyway */ + if (textInfo->startLine == 0) return 0; + if (ScrollOption == NORMSCROLL) { + /* Scroll up until sum of new top lines greater than target */ + while ((sum < target) && ScrollUp(display, textInfo)) { + sum += textInfo->txtBuffer[textInfo->startLine]->lineHeight; + linesup++; + } + } else { + /* Search backward to find index */ + index = textInfo->startLine - 1; + while ((index > 0) && (sum < target)) { + sum += textInfo->txtBuffer[index]->lineHeight; + linesup++; + index--; + } + /* Go directly to the index */ + textInfo->startLine = index; + textInfo->endLine = FindEndLine(textInfo, &(textInfo->bottomSpace)); + XClearWindow(display, textInfo->mainWindow); + TxtRepaint(display, textInfo->mainWindow); + } + /* If we scrolled, assert we are not at bottom of buffer */ + if (linesup > 0) { + textInfo->flagWord |= NOTATBOTTOM; + } + return 1; +} + + + +int TxtFilter(display, evt) +Display *display; +XEvent *evt; +/* + * This routine handles events associated with scrollable text windows. + * It will handle all exposure events and any button released events + * in the scroll bar of a text window. It does NOT handle any other + * events. If it cannot handle the event, it will return 0. + */ +{ + XExposeEvent *expose = &evt->xexpose; + XButtonEvent *btEvt = &evt->xbutton; + XGraphicsExposeEvent *gexpose = &evt->xgraphicsexpose; + XNoExposeEvent *noexpose = &evt->xnoexpose; + struct txtWin *textInfo; + int index, ypos; + Window w, sw; + + if (textWindows == (XAssocTable *) 0) { + textWindows = XCreateAssocTable(32); + if (textWindows == (XAssocTable *) 0) return(0); + } + if (evt->type == Expose) { + w = expose->window; + sw = 0; + } + else if (evt->type == GraphicsExpose) { + w = gexpose->drawable; + sw = 0; + } + else if (evt->type == NoExpose) { + w = noexpose->drawable; + sw = 0; + } + else if (evt->type == ButtonRelease) { + w = btEvt->window; + sw = btEvt->subwindow; + } + else + return 0; + + if ((textInfo = (struct txtWin *) + XLookUpAssoc(display, textWindows, (XID) w)) == 0) + return 0; + + /* Determine whether it's main window or not */ + if ((w == textInfo->mainWindow) && (sw == 0)) { + /* Main Window - handle exposures */ + switch (evt->type) { + case Expose: + ypos = 0 /*YPADDING*/; + for (index = textInfo->startLine; + index <= textInfo->endLine; + index++) + { + int lh = textInfo->txtBuffer[index]->lineHeight; + + if (((ypos + lh) >= expose->y) && + (ypos <= (expose->y + expose->height))) + { + /* Intersection region */ + /* Draw line immediately */ + DrawLine(display, textInfo, index, ypos); + /* And possibly draw cursor */ + if (textInfo->curLine == index) { + XFillRectangle(display, w, textInfo->CursorGC, + textInfo->txtBuffer[index]->lineWidth + + CUROFFSET, + ypos, + CURSORWIDTH, + lh); + } + } + ypos += lh + INTERLINE; + } + break; + case GraphicsExpose: + ypos = 0 /*YPADDING*/; + for (index = textInfo->startLine; + index <= textInfo->endLine; + index++) + { + int lh = textInfo->txtBuffer[index]->lineHeight; + + if (((ypos + lh) >= gexpose->y) && + (ypos <= (gexpose->y + gexpose->height))) + { + /* Intersection region */ + /* Draw line immediately */ + DrawLine(display, textInfo, index, ypos); + /* And possibly draw cursor */ + if (textInfo->curLine == index) { + XFillRectangle(display, w, textInfo->CursorGC, + textInfo->txtBuffer[index]->lineWidth + + CUROFFSET, + ypos, + CURSORWIDTH, + lh); + } + } + ypos += lh + INTERLINE; + } + break; + case NoExpose: + break; + default: + /* Not one of our events */ + return 0; + } + } else { + switch (evt->type) { + case Expose: + UpdateScroll(display, textInfo); + break; + case ButtonRelease: + /* Find out which button */ + switch (btEvt->button) { + case Button1: + /* Scroll up until top line is at mouse position */ + TopToHere(display, textInfo, btEvt->y); + break; + case Button2: + /* Scroll to spot relative to position */ + ScrollToSpot(display, textInfo, btEvt->y); + if (textInfo->endLine >= textInfo->numLines-1) { + textInfo->flagWord &= (~NOTATBOTTOM); + } else { + textInfo->flagWord |= NOTATBOTTOM; + } + break; + case Button3: + /* Scroll down until pointed line is at top */ + LineToTop(display, textInfo, btEvt->y); + break; + } + break; + default: + /* Not one of our events */ + return 0; + } + } + return 1; +} diff --git a/gnu/games/chess/Xchess/scrollText.h b/gnu/games/chess/Xchess/scrollText.h new file mode 100644 index 0000000..d9d05b0 --- /dev/null +++ b/gnu/games/chess/Xchess/scrollText.h @@ -0,0 +1,32 @@ +/* + * Scrollable Text Window Header File + * + * David Harrison + * University of California, Berkeley + * 1986 + * + * This file contains definitions for a scrollable text window + * with scroll bar support. + */ + +int TxtGrab(); + /* Take hold of a previously created window */ + +#define TXT_NO_COLOR -1 + +int TxtAddFont(); + /* Loads a new font for use later */ +int TxtWinP(); + /* Returns non-zero value if the window is text window */ +int TxtClear(); + /* Clears text window and resets text buffer */ + +int TxtWriteStr(); + /* Writes a string to window with immediate update */ +int TxtJamStr(); + /* Write a string without causing update to screen */ + +int TxtRepaint(); + /* Repaints entire scrollable text window */ +int TxtFilter(); + /* Handles events related to text window */ diff --git a/gnu/games/chess/Xchess/scrollText/scrollText.c b/gnu/games/chess/Xchess/scrollText/scrollText.c new file mode 100644 index 0000000..4320710 --- /dev/null +++ b/gnu/games/chess/Xchess/scrollText/scrollText.c @@ -0,0 +1,1858 @@ +/* + * A Scrollable Text Output Window + * + * David Harrison + * University of California, Berkeley + * 1986 + * + * The following is an implementation for a scrollable text output + * system. It handles exposure events only (other interactions are + * under user control). For scrolling, a always present scroll bar + * is implemented. It detects size changes and compensates accordingly. + */ + +#include <X11/X.h> +#include <X11/Xlib.h> +#include <X11/X10.h> +#include <sys/types.h> +#include "scrollText.h" + +extern char *malloc(); +extern char *realloc(); +#define alloc(type) (type *) malloc(sizeof(type)) +#define numalloc(type, num) (type *) malloc((unsigned) (num * sizeof(type))) +#define MAXINT 2147483647 + +extern XAssocTable *XCreateAssocTable(); +extern caddr_t XLookUpAssoc(); + +static XAssocTable *textWindows = (XAssocTable *) 0; + +#define NOOPTION -1 /* Option hasn't been set yet */ +#define NORMSCROLL 0 /* Smooth scroll on LineToTop and TopToHere */ +#define JUMPSCROLL 1 /* Jump scrolling on LineToTop and TopToHere */ + +static int ScrollOption = NOOPTION; + +typedef char *Generic; + +#define DEFAULT_GC textInfo->fontGC[textInfo->curFont] + +#define BARSIZE 15 +#define BARBORDER 1 +#define MAXFONTS 8 +#define INITBUFSIZE 1024 +#define INITLINES 50 +#define INITEXPARY 50 +#define XPADDING 2 +#define YPADDING 2 +#define INTERLINE 5 +#define INTERSPACE 1 +#define CURSORWIDTH 2 +#define EXPANDPERCENT 40 +#define BUFSIZE 1024 +#define CUROFFSET 1 +#define MAXFOREIGN 250 +#define NOINDEX -1 + +/* The wrap line indicator */ +#define WRAPINDSIZE 7 +#define STEMOFFSET 5 +#define arrow_width 7 +#define arrow_height 5 +static char arrow_bits[] = { + 0x24, 0x26, 0x3f, 0x06, 0x04}; + +#define NEWLINE '\n' +#define BACKSPACE '\010' +#define NEWFONT '\006' +#define LOWCHAR '\040' +#define HIGHCHAR '\176' + +#define CHARMASK 0x00ff /* Character mask */ +#define FONTMASK 0x0700 /* Character font */ +#define FONTSHIFT 8 /* Shift amount */ + +#define WRAPFLAG 0x01 /* Line wrap flag */ + +/* + * Lines are represented by a pointer into the overall array of + * 16-bit characters. The lower eight bits is used to indicate the character + * (in ASCII), and the next two bits are used to indicate the font + * the character should be drawn in. + */ + +typedef struct txtLine { + int lineLength; /* Current line length */ + int lineHeight; /* Full height of line in pixels */ + int lineBaseLine; /* Current baseline of the line */ + int lineWidth; /* Drawing position at end of line */ + int lineText; /* Offset into master buffer */ + int lineFlags; /* Line wrap flag is here */ +}; + + +/* + * For ExposeCopy events, we queue up the redraw requests collapsing + * them into line redraw requests until the CopyExpose event arrives. + * The queue is represented as a dynamic array of the following + * structure: + */ + +typedef struct expEvent { + int lineIndex; /* Index of line to redraw */ + int ypos; /* Drawing position of line */ +}; + + +/* + * The text buffer is represented using a dynamic counted array + * of 16-bit quantities. This array expands as needed. + * For the screen representation, a dynamic counted array + * of line structures is used. This array points into the + * text buffer to denote the start of each line and its parameters. + * The windows are configured as one overall window which contains + * the scroll bar as a sub-window along its right edge. Thus, + * the text drawing space is actually w-BARSIZE. + */ + +#define NOTATBOTTOM 0x01 /* Need to scroll to bottom before appending */ +#define FONTNUMWAIT 0x02 /* Waiting for font number */ +#define COPYEXPOSE 0x04 /* Need to process a copy expose event */ +#define SCREENWRONG 0x08 /* TxtJamStr has invalidated screen contents */ + +typedef struct txtWin { + /* Basic text buffer */ + int bufAlloc; /* Allocated size of buffer */ + int bufSpot; /* Current writing position in buffer */ + short *mainBuffer; /* Main buffer of text */ + + /* Line information */ + int numLines; /* Number of display lines in buffer */ + int allocLines; /* Number of lines allocated */ + struct txtLine **txtBuffer; /* Dynamic array of lines */ + + /* Current Window display information */ + Window mainWindow; /* Text display window */ + Window scrollBar; /* Subwindow for scroll bar */ + Pixmap arrowMap; /* line wrap indicator */ + int bgPix, fgPix; /* Background and cursor */ + GC CursorGC; /* gc for the cursor */ + GC bgGC; /* gc for erasing things */ + GC fontGC[MAXFONTS]; /* gc for doing fonts */ + XFontStruct theFonts[MAXFONTS];/* Display fonts */ + int theColors[MAXFONTS]; /* foregrounds of the fonts */ + int curFont; /* current font for tracking */ + int w, h; /* Current size */ + int startLine; /* Top line in display */ + int endLine; /* Bottom line in display */ + int bottomSpace; /* Space at bottom of screen */ + int flagWord; /* If non-zero, not at end */ + + /* For handling ExposeCopy events */ + int exposeSize; /* Current size of array */ + int exposeAlloc; /* Allocated size */ + struct expEvent **exposeAry;/* Array of line indices */ + + /* Drawing position information */ + int curLine; /* Current line in buffer */ + int curX; /* Current horizontal positi */ + int curY; /* Current vertical drawing */ +}; + +/* Flags for the various basic character handling functions */ + +#define DODISP 0x01 /* Update the display */ +#define NONEWLINE 0x02 /* Dont append newline */ + + + +static int InitLine(newLine) +struct txtLine *newLine; /* Newly created line structure */ +/* + * This routine initializes a newly created line structure. + */ +{ + newLine->lineLength = 0; + newLine->lineHeight = 0; + newLine->lineBaseLine = 0; + newLine->lineWidth = XPADDING; + newLine->lineText = NOINDEX; + newLine->lineFlags = 0; + return 1; +} + + + + +int TxtGrab(display, txtWin, program, mainFont, bg, fg, cur) +Display *display; /* display window is on */ +Window txtWin; /* Window to take over as scrollable text */ +char *program; /* Program name for Xdefaults */ +XFontStruct *mainFont; /* Primary text font */ +int bg, fg, cur; /* Background, foreground, and cursor colors */ +/* + * This routine takes control of 'txtWin' and makes it into a scrollable + * text output window. It will create a sub-window for the scroll bar + * with a background of 'bg' and an bar with color 'fg'. Both fixed width + * and variable width fonts are supported. Additional fonts can be loaded + * using 'TxtAddFont'. Returns 0 if there were problems, non-zero if + * everything went ok. + */ +{ + struct txtWin *newWin; /* Text package specific information */ + XWindowAttributes winInfo; /* Window information */ + int index; + XGCValues gc_val; + + if (textWindows == (XAssocTable *) 0) { + textWindows = XCreateAssocTable(32); + if (textWindows == (XAssocTable *) 0) return(0); + } + if (XGetWindowAttributes(display, txtWin, &winInfo) == 0) return 0; + + if (ScrollOption == NOOPTION) { + /* Read to see if the user wants jump scrolling or not */ + if (XGetDefault(display, program, "JumpScroll")) { + ScrollOption = JUMPSCROLL; + } else { + ScrollOption = NORMSCROLL; + } + } + + /* Initialize local structure */ + newWin = alloc(struct txtWin); + + /* Initialize arrow pixmap */ + newWin->arrowMap = XCreatePixmapFromBitmapData(display, txtWin, + arrow_bits, + arrow_width, arrow_height, + cur, bg, + DisplayPlanes(display, 0)); + + newWin->bufAlloc = INITBUFSIZE; + newWin->bufSpot = 0; + newWin->mainBuffer = numalloc(short, INITBUFSIZE); + + newWin->numLines = 1; + newWin->allocLines = INITLINES; + newWin->txtBuffer = numalloc(struct txtLine *, INITLINES); + for (index = 0; index < INITLINES; index++) { + newWin->txtBuffer[index] = alloc(struct txtLine); + InitLine(newWin->txtBuffer[index]); + } + + /* Window display information */ + newWin->mainWindow = txtWin; + newWin->w = winInfo.width; + newWin->h = winInfo.height; + newWin->startLine = 0; + newWin->endLine = 0; + newWin->bottomSpace = winInfo.height + - YPADDING - mainFont->ascent - mainFont->descent - INTERLINE; + newWin->flagWord = 0; + newWin->bgPix = bg; + newWin->fgPix = fg; + + /* Scroll Bar Creation */ + newWin->scrollBar = XCreateSimpleWindow(display, txtWin, + winInfo.width - BARSIZE, + 0, BARSIZE - (2*BARBORDER), + winInfo.height - (2*BARBORDER), + BARBORDER, + fg, bg); + XSelectInput(display, newWin->scrollBar, ExposureMask|ButtonReleaseMask); + XMapRaised(display, newWin->scrollBar); + + /* Font and Color Initialization */ + newWin->theFonts[0] = *mainFont; + newWin->theColors[0] = fg; + gc_val.function = GXcopy; + gc_val.plane_mask = AllPlanes; + gc_val.foreground = fg; + gc_val.background = bg; + gc_val.graphics_exposures = 1; + gc_val.font = mainFont->fid; + gc_val.line_width = 1; + gc_val.line_style = LineSolid; + + newWin->fontGC[0] = XCreateGC(display, txtWin, + GCFunction | GCPlaneMask | + GCForeground | GCBackground | + GCGraphicsExposures | GCFont, + &gc_val); + + gc_val.foreground = cur; + newWin->CursorGC = XCreateGC(display, txtWin, + GCFunction | GCPlaneMask | + GCForeground | GCBackground | + GCLineStyle | GCLineWidth, + &gc_val); + + gc_val.foreground = bg; + newWin->bgGC = XCreateGC(display, txtWin, + GCFunction | GCPlaneMask | + GCForeground | GCBackground | + GCGraphicsExposures | GCFont, + &gc_val); + + + for (index = 1; index < MAXFONTS; index++) { + newWin->theFonts[index].fid = 0; + newWin->fontGC[index] = 0; + } + + + /* Initialize size of first line */ + newWin->txtBuffer[0]->lineHeight = newWin->theFonts[0].ascent + + newWin->theFonts[0].descent; + newWin->txtBuffer[0]->lineText = 0; + + /* ExposeCopy array initialization */ + newWin->exposeSize = 0; + newWin->exposeAlloc = INITEXPARY; + newWin->exposeAry = numalloc(struct expEvent *, INITEXPARY); + for (index = 0; index < newWin->exposeAlloc; index++) + newWin->exposeAry[index] = alloc(struct expEvent); + /* Put plus infinity in last slot for sorting purposes */ + newWin->exposeAry[0]->lineIndex = MAXINT; + + /* Drawing Position Information */ + newWin->curLine = 0; + newWin->curX = 0; + newWin->curY = YPADDING + mainFont->ascent + mainFont->descent; + + /* Attach it to both windows */ + XMakeAssoc(display, textWindows, (XID) txtWin, (caddr_t) newWin); + XMakeAssoc(display, textWindows, (XID) newWin->scrollBar, (caddr_t) newWin); + return 1; +} + + +int TxtRelease(display, w) +Display *display; +Window w; /* Window to release */ +/* + * This routine releases all resources associated with the + * specified window which are consumed by the text + * window package. This includes the entire text buffer, line start + * array, and the scroll bar window. However, the window + * itself is NOT destroyed. The routine will return zero if + * the window is not owned by the text window package. + */ +{ + struct txtWin *textInfo; + int index; + + if ((textInfo = (struct txtWin *) XLookUpAssoc(display, + textWindows, (XID) w)) == 0) + return 0; + + for (index = 0; index < MAXFONTS; index++) + if (textInfo->fontGC[index] != 0) + XFreeGC(display, textInfo->fontGC[index]); + + free((Generic) textInfo->mainBuffer); + for (index = 0; index < textInfo->numLines; index++) { + free((Generic) textInfo->txtBuffer[index]); + } + free((Generic) textInfo->txtBuffer); + XDestroyWindow(display, textInfo->scrollBar); + for (index = 0; index < textInfo->exposeSize; index++) { + free((Generic) textInfo->exposeAry[index]); + } + free((Generic) textInfo->exposeAry); + XDeleteAssoc(display, textWindows, (XID) w); + free((Generic) textInfo); + return 1; +} + + + +static int RecompBuffer(textInfo) +struct txtWin *textInfo; /* Text window information */ +/* + * This routine recomputes all line breaks in a buffer after + * a change in window size or font. This is done by throwing + * away the old line start array and recomputing it. Although + * a lot of this work is also done elsewhere, it has been included + * inline here for efficiency. + */ +{ + int startPos, endSize, linenum; + register int index, chsize, curfont; + register short *bufptr; + register XFontStruct *fontptr; + register struct txtLine *lineptr; + char theChar; + + /* Record the old position so we can come back to it */ + for (startPos = textInfo->txtBuffer[textInfo->startLine]->lineText; + (startPos > 0) && (textInfo->mainBuffer[startPos] != '\n'); + startPos--) + /* null loop body */; + + /* Clear out the old line start array */ + for (index = 0; index < textInfo->numLines; index++) { + InitLine(textInfo->txtBuffer[index]); + } + + /* Initialize first line */ + textInfo->txtBuffer[0]->lineHeight = + textInfo->theFonts[0].ascent + textInfo->theFonts[0].descent; + textInfo->txtBuffer[0]->lineText = 0; + + /* Process the text back into lines */ + endSize = textInfo->w - BARSIZE - WRAPINDSIZE; + bufptr = textInfo->mainBuffer; + lineptr = textInfo->txtBuffer[0]; + linenum = 0; + fontptr = &(textInfo->theFonts[0]); + curfont = 0; + for (index = 0; index < textInfo->bufSpot; index++) { + theChar = bufptr[index] & CHARMASK; + + if ((bufptr[index] & FONTMASK) != curfont) { + int newFontNum, heightDiff; + + /* Switch fonts */ + newFontNum = (bufptr[index] & FONTMASK) >> FONTSHIFT; + if (textInfo->theFonts[newFontNum].fid != 0) { + /* Valid font */ + curfont = bufptr[index] & FONTMASK; + fontptr = &(textInfo->theFonts[newFontNum]); + heightDiff = (fontptr->ascent + fontptr->descent) - + lineptr->lineHeight; + if (heightDiff < 0) heightDiff = 0; + lineptr->lineHeight += heightDiff; + } + } + if (theChar == '\n') { + /* Handle new line */ + if (linenum >= textInfo->allocLines-1) + /* Expand number of lines */ + ExpandLines(textInfo); + linenum++; + lineptr = textInfo->txtBuffer[linenum]; + /* Initialize next line */ + lineptr->lineHeight = fontptr->ascent + fontptr->descent; + lineptr->lineText = index+1; + /* Check to see if its the starting line */ + if (index == startPos) textInfo->startLine = linenum; + } else { + /* Handle normal character */ + chsize = CharSize(textInfo, linenum, index); + if (lineptr->lineWidth + chsize > endSize) { + /* Handle line wrap */ + lineptr->lineFlags |= WRAPFLAG; + if (linenum >= textInfo->allocLines-1) + /* Expand number of lines */ + ExpandLines(textInfo); + linenum++; + lineptr = textInfo->txtBuffer[linenum]; + /* Initialize next line */ + lineptr->lineHeight = fontptr->ascent + fontptr->descent; + lineptr->lineText = index; + lineptr->lineLength = 1; + lineptr->lineWidth += chsize; + } else { + /* Handle normal addition of character */ + lineptr->lineLength += 1; + lineptr->lineWidth += chsize; + } + } + } + /* We now have a valid line array. Let's clean up some other fields. */ + textInfo->numLines = linenum+1; + if (startPos == 0) { + textInfo->startLine = 0; + } + textInfo->endLine = FindEndLine(textInfo, &(textInfo->bottomSpace)); + textInfo->curLine = linenum; + /* Check to see if we are at the bottom */ + if (textInfo->endLine >= textInfo->numLines-1) { + textInfo->curY = textInfo->h - textInfo->bottomSpace - + lineptr->lineHeight; + textInfo->flagWord &= (~NOTATBOTTOM); + } else { + textInfo->flagWord |= NOTATBOTTOM; + } + return 1; +} + + + + +int TxtAddFont(display, textWin, fontNumber, newFont, newColor) +Display *display; +Window textWin; /* Scrollable text window */ +int fontNumber; /* Place to add font (0-7) */ +XFontStruct *newFont; /* Font to add */ +int newColor; /* Color of font */ +/* + * This routine loads a new font so that it can be used in a previously + * created text window. There are eight font slots numbered 0 through 7. + * If there is already a font in the specified slot, it will be replaced + * and an automatic redraw of the window will take place. See TxtWriteStr + * for details on using alternate fonts. The color specifies the foreground + * color of the text. The default foreground color is used if this + * parameter is TXT_NO_COLOR. Returns a non-zero value if + * everything went well. + */ +{ + struct txtWin *textInfo; + int redrawFlag; + XGCValues gc_val; + + if ((fontNumber < 0) || (fontNumber >= MAXFONTS)) return 0; + if ((textInfo = (struct txtWin *) + XLookUpAssoc(display, textWindows, (XID) textWin)) == 0) + return 0; + if (newColor == TXT_NO_COLOR) { + newColor = textInfo->fgPix; + } + + gc_val.font = newFont->fid; + gc_val.foreground = newColor; + gc_val.background = textInfo->bgPix; + gc_val.plane_mask = AllPlanes; + gc_val.graphics_exposures = 1; + gc_val.function = GXcopy; + + if (textInfo->fontGC[fontNumber] != 0) + { + XChangeGC(display, textInfo->fontGC[fontNumber], + GCFont | GCForeground, &gc_val); + } + else + textInfo->fontGC[fontNumber] = XCreateGC(display, textWin, + GCFont | + GCForeground | + GCBackground | + GCFunction | + GCPlaneMask | + GCGraphicsExposures, + &gc_val); + + + redrawFlag = (textInfo->theFonts[fontNumber].fid != 0) && + (((newFont) && (newFont->fid != textInfo->theFonts[fontNumber].fid)) || + (newColor != textInfo->theColors[fontNumber])); + if (newFont) { + textInfo->theFonts[fontNumber] = *newFont; + } + textInfo->theColors[fontNumber] = newColor; + + if (redrawFlag) { + RecompBuffer(textInfo); + XClearWindow(display, textWin); + TxtRepaint(display, textWin); + } + return 1; +} + + + +int TxtWinP(display, w) +Display *display; +Window w; +/* + * Returns a non-zero value if the window has been previously grabbed + * using TxtGrab and 0 if it has not. + */ +{ + if (XLookUpAssoc(display, textWindows, (XID) w)) + return(1); + else return(0); +} + + + +static int FindEndLine(textInfo, botSpace) +struct txtWin *textInfo; +int *botSpace; +/* + * Given the starting line in 'textInfo->startLine', this routine + * determines the index of the last line that can be drawn given the + * current size of the screen. If there are not enough lines to + * fill the screen, the index of the last line will be returned. + * The amount of empty bottom space is returned in 'botSpace'. + */ +{ + int index, height, lineHeight; + + height = YPADDING; + index = textInfo->startLine; + while (index < textInfo->numLines) { + lineHeight = textInfo->txtBuffer[index]->lineHeight + INTERLINE; + if (height + lineHeight > textInfo->h) break; + height += lineHeight; + index++; + } + if (botSpace) { + *botSpace = textInfo->h - height; + } + return index - 1; +} + + + +static int UpdateScroll(display, textInfo) +Display *display; +struct txtWin *textInfo; /* Text window information */ +/* + * This routine computes the current extent of the scroll bar + * indicator and repaints the bar with the correct information. + */ +{ + int top, bottom; + + if (textInfo->numLines > 1) { + top = textInfo->startLine * (textInfo->h - 2*BARBORDER) / + (textInfo->numLines - 1); + bottom = textInfo->endLine * (textInfo->h - 2*BARBORDER) / + (textInfo->numLines - 1); + } else { + top = 0; + bottom = textInfo->h - (2*BARBORDER); + } + + /* Draw it - make sure there is a little padding */ + if (top == 0) top++; + if (bottom == textInfo->h-(2*BARBORDER)) bottom--; + + XFillRectangle(display, textInfo->scrollBar, + textInfo->bgGC, + 0, 0, BARSIZE, top-1); + XFillRectangle(display, textInfo->scrollBar, + DEFAULT_GC, top, BARSIZE - (2*BARBORDER) - 2, + bottom - top); + XFillRectangle(display, textInfo->scrollBar, DEFAULT_GC, + 0, bottom+1, BARSIZE, + textInfo->h - (2 * BARBORDER) - bottom); + + return 1; +} + + + + +int TxtClear(display, w) +Display *display; +Window w; +/* + * This routine clears a scrollable text window. It resets the current + * writing position to the upper left hand corner of the screen. + * NOTE: THIS ALSO CLEARS THE CONTENTS OF THE TEXT WINDOW BUFFER AND + * RESETS THE SCROLL BAR. Returns 0 if the window is not a text window. + * This should be used *instead* of XClear. + */ +{ + struct txtWin *textInfo; + int index; + + if ((textInfo = (struct txtWin *) XLookUpAssoc(display, textWindows, (XID) w)) == 0) + return 0; + + /* Zero out the arrays */ + textInfo->bufSpot = 0; + for (index = 0; index < textInfo->numLines; index++) { + InitLine(textInfo->txtBuffer[index]); + } + textInfo->txtBuffer[0]->lineHeight = + textInfo->theFonts[textInfo->curFont].ascent + + textInfo->theFonts[textInfo->curFont].descent; + + textInfo->numLines = 1; + textInfo->startLine = 0; + textInfo->endLine = 0; + textInfo->curLine = 0; + textInfo->curX = 0; + textInfo->curY = YPADDING + textInfo->theFonts[textInfo->curFont].ascent + + textInfo->theFonts[textInfo->curFont].descent; + + textInfo->bottomSpace = textInfo->h - YPADDING - + textInfo->theFonts[textInfo->curFont].ascent - INTERLINE - + textInfo->theFonts[textInfo->curFont].descent; + /* Actually clear the window */ + XClearWindow(display, w); + + /* Draw the current cursor */ + XFillRectangle(display, w, textInfo->CursorGC, + XPADDING + CUROFFSET, textInfo->curY, + CURSORWIDTH, + textInfo->theFonts[textInfo->curFont].ascent + + textInfo->theFonts[textInfo->curFont].descent); + + /* Update the scroll bar */ + UpdateScroll(display, textInfo); + return 1; +} + + +static int WarpToBottom(display, textInfo) +Display *display; +struct txtWin *textInfo; /* Text Information */ +/* + * This routine causes the specified text window to display its + * last screen of information. It updates the scroll bar + * to the appropriate spot. The implementation scans backward + * through the buffer to find an appropriate starting spot for + * the window. + */ +{ + int index, height, lineHeight; + + index = textInfo->numLines-1; + height = 0; + while (index >= 0) { + lineHeight = textInfo->txtBuffer[index]->lineHeight + INTERLINE; + if (height + lineHeight > textInfo->h) break; + height += lineHeight; + index--; + } + textInfo->startLine = index + 1; + textInfo->endLine = FindEndLine(textInfo, &(textInfo->bottomSpace)); + textInfo->curY = textInfo->h - textInfo->bottomSpace - + textInfo->txtBuffer[textInfo->endLine]->lineHeight; + XClearWindow(display, textInfo->mainWindow); + TxtRepaint(display, textInfo->mainWindow); + return 1; +} + + + +static int UpdateExposures(display, textInfo) +Display *display; +struct txtWin *textInfo; /* Text window information */ +/* + * Before a new scrolling action occurs, the text window package + * must handle all COPYEXPOSE events generated by the last scrolling + * action. This routine is called to do this. Foreign events (those + * not handled by TxtFilter) are queued up and replaced on the queue + * after the processing of the exposure events is complete. + */ +{ +#if 0 + XEvent foreignQueue[MAXFOREIGN]; + int index, lastItem = 0; + + while (textInfo->flagWord & COPYEXPOSE) { + XNextEvent(display, &(foreignQueue[lastItem])); + if (!TxtFilter(display, &(foreignQueue[lastItem]))) + lastItem++; + if (lastItem >= MAXFOREIGN) { + printf("Too many foreign events to queue!\n"); + textInfo->flagWord &= (~COPYEXPOSE); + } + } + for (index = 0; index < lastItem; index++) { + XPutBackEvent(display, &(foreignQueue[index])); + } +#endif + return 1; +} + + +static int ScrollDown(display,textInfo) +Display *display; +struct txtWin *textInfo; /* Text window information */ +/* + * This routine scrolls the indicated text window down by one + * line. The line below the current line must exist. The window + * is scrolled so that the line below the last line is fully + * displayed. This may cause many lines to scroll off the top. + * Scrolling is done using XCopyArea. The exposure events should + * be caught using ExposeCopy. + */ +{ + int lineSum, index, targetSpace, freeSpace, updateFlag; + + lineSum = 0; + if (textInfo->endLine + 1 >= textInfo->numLines) return 0; + targetSpace = textInfo->txtBuffer[textInfo->endLine+1]->lineHeight + + INTERLINE; + if (textInfo->bottomSpace < targetSpace) { + index = textInfo->startLine; + while (index < textInfo->endLine) { + lineSum += (textInfo->txtBuffer[index]->lineHeight + INTERLINE); + if (textInfo->bottomSpace + lineSum >= targetSpace) break; + index++; + } + + /* Must move upward by 'lineSum' pixels */ + XCopyArea(display, textInfo->mainWindow, textInfo->mainWindow, + DEFAULT_GC, 0, lineSum, + textInfo->w - BARSIZE, textInfo->h, + 0, 0); + + textInfo->flagWord |= COPYEXPOSE; + /* Repair the damage to the structures */ + textInfo->startLine = index + 1; + updateFlag = 1; + } else { + updateFlag = 0; + } + /* More lines might be able to fit. Let's check. */ + freeSpace = textInfo->bottomSpace + lineSum - targetSpace; + index = textInfo->endLine + 1; + while (index < textInfo->numLines-1) { + if (freeSpace - textInfo->txtBuffer[index+1]->lineHeight - INTERLINE < 0) + break; + freeSpace -= (textInfo->txtBuffer[index+1]->lineHeight + INTERLINE); + index++; + } + textInfo->endLine = index; + textInfo->bottomSpace = freeSpace; + if (updateFlag) { + UpdateExposures(display, textInfo); + } + UpdateScroll(display, textInfo); + return 1; +} + + + + +static int ExpandLines(textInfo) +struct txtWin *textInfo; /* Text Information */ +/* + * This routine allocates and initializes additional space in + * the line start array (txtBuffer). The new space + * is allocated using realloc. The expansion factor is a percentage + * given by EXPANDPERCENT. + */ +{ + int newSize, index; + + newSize = textInfo->allocLines; + newSize += (newSize * EXPANDPERCENT) / 100; + + textInfo->txtBuffer = (struct txtLine **) + realloc((char *) textInfo->txtBuffer, + (unsigned) (newSize * sizeof(struct txtLine *))); + for (index = textInfo->allocLines; index < newSize; index++) { + textInfo->txtBuffer[index] = alloc(struct txtLine); + InitLine(textInfo->txtBuffer[index]); + } + textInfo->allocLines = newSize; + return 1; +} + +static int ExpandBuffer(textInfo) +struct txtWin *textInfo; /* Text information */ +/* + * Expands the basic character buffer using realloc. The expansion + * factor is a percentage given by EXPANDPERCENT. + */ +{ + int newSize; + + newSize = textInfo->bufAlloc + (textInfo->bufAlloc * EXPANDPERCENT) / 100; + textInfo->mainBuffer = (short *) + realloc((char *) textInfo->mainBuffer, (unsigned) newSize * sizeof(short)); + textInfo->bufAlloc = newSize; + return 1; +} + + + +static int HandleNewLine(display, textInfo, flagWord) +Display *display; +struct txtWin *textInfo; /* Text Information */ +int flagWord; /* DODISP or NONEWLINE or both */ +/* + * This routine initializes the next line for drawing by setting + * its height to the current font height, scrolls the screen down + * one line, and updates the current drawing position to the + * left edge of the newly cleared line. If DODISP is specified, + * the screen will be updated (otherwise not). If NONEWLINE is + * specified, no newline character will be added to the text buffer + * (this is for line wrap). + */ +{ + struct txtLine *curLine, *nextLine; + + /* Check to see if a new line must be allocated */ + if (textInfo->curLine >= textInfo->allocLines-1) + /* Expand the number of lines */ + ExpandLines(textInfo); + textInfo->numLines += 1; + + /* Then we initialize the next line */ + nextLine = textInfo->txtBuffer[textInfo->numLines-1]; + nextLine->lineHeight = + textInfo->theFonts[textInfo->curFont].ascent + + textInfo->theFonts[textInfo->curFont].descent; + + curLine = textInfo->txtBuffer[textInfo->curLine]; + if (flagWord & DODISP) { + /* Scroll down a line if required */ + if ((textInfo->curY + curLine->lineHeight + + nextLine->lineHeight + (INTERLINE * 2)) > textInfo->h) + { + ScrollDown(display, textInfo); + } + else + { + /* Update the bottom space appropriately */ + textInfo->bottomSpace -= (nextLine->lineHeight + INTERLINE); + textInfo->endLine += 1; + } + /* Update drawing position */ + textInfo->curY = textInfo->h - + (textInfo->bottomSpace + nextLine->lineHeight); + } + + /* Move down a line */ + textInfo->curLine += 1; + if (!(flagWord & NONEWLINE)) { + /* Append end-of-line to text buffer */ + if (textInfo->bufSpot >= textInfo->bufAlloc) { + /* Allocate more space in main text buffer */ + ExpandBuffer(textInfo); + } + textInfo->mainBuffer[(textInfo->bufSpot)++] = + (textInfo->curFont << FONTSHIFT) | '\n'; + } + nextLine->lineText = textInfo->bufSpot; + textInfo->curX = 0; + return 1; +} + + + +static int CharSize(textInfo, lineNum, charNum) +struct txtWin *textInfo; /* Current Text Information */ +int lineNum; /* Line in buffer */ +int charNum; /* Character in line */ +/* + * This routine determines the size of the specified character. + * It takes in account the font of the character and whether its + * fixed or variable. The size includes INTERSPACE spacing between + * the characters. + */ +{ + register XFontStruct *charFont; + register short *theLine; + register short theChar; + + theLine = &(textInfo->mainBuffer[textInfo->txtBuffer[lineNum]->lineText]); + theChar = theLine[charNum] & CHARMASK; + charFont = &(textInfo->theFonts[(theChar & FONTMASK) >> FONTSHIFT]); + if (theChar <= charFont->min_char_or_byte2 || + theChar >= charFont->max_char_or_byte2 || + charFont->per_char == 0) + return charFont->max_bounds.width + 1; + else + return charFont->per_char[theChar].width + 1; +} + + + + + +static int HandleBackspace(display, textInfo, flagWord) +Display *display; +struct txtWin *textInfo; /* Text Information */ +int flagWord; /* DODISP or nothing */ +/* + * This routine handles a backspace found in the input stream. The + * character before the current writing position will be erased and + * the drawing position will move back one character. If the writing + * position is at the left margin, the drawing position will move + * up to the previous line. If it is a line that has been wrapped, + * the character at the end of the previous line will be erased. + */ +{ + struct txtLine *thisLine, *prevLine; + int chSize; + + thisLine = textInfo->txtBuffer[textInfo->curLine]; + /* First, determine whether we need to go back a line */ + if (thisLine->lineLength == 0) { + /* Bleep if at top of buffer */ + if (textInfo->curLine == 0) { + XBell(display, 50); + return 0; + } + + /* See if we have to scroll in the other direction */ + if ((flagWord & DODISP) && (textInfo->curY <= YPADDING)) { + /* This will display the last lines of the buffer */ + WarpToBottom(display, textInfo); + } + + /* Set drawing position at end of previous line */ + textInfo->curLine -= 1; + prevLine = textInfo->txtBuffer[textInfo->curLine]; + textInfo->numLines -= 1; + if (flagWord & DODISP) { + textInfo->curY -= (prevLine->lineHeight + INTERLINE); + textInfo->bottomSpace += (thisLine->lineHeight + INTERLINE); + textInfo->endLine -= 1; + } + + /* We are unlinewrapping if the previous line has flag set */ + if (prevLine->lineFlags & WRAPFLAG) { + /* Get rid of line wrap indicator */ + if (flagWord & DODISP) { + XFillRectangle(display, textInfo->mainWindow, + textInfo->bgGC, + textInfo->w - BARSIZE - WRAPINDSIZE, + textInfo->curY, WRAPINDSIZE, + prevLine->lineHeight); + } + prevLine->lineFlags &= (~WRAPFLAG); + /* Call recursively to wipe out the ending character */ + HandleBackspace(display, textInfo, flagWord); + } else { + /* Delete the end-of-line in the primary buffer */ + textInfo->bufSpot -= 1; + } + } else { + /* Normal deletion of character */ + chSize = + CharSize(textInfo, textInfo->curLine, + textInfo->txtBuffer[textInfo->curLine]->lineLength - 1); + /* Move back appropriate amount and wipe it out */ + thisLine->lineWidth -= chSize; + if (flagWord & DODISP) { + XFillRectangle(display, textInfo->mainWindow, + textInfo->bgGC, + thisLine->lineWidth, textInfo->curY, + chSize, thisLine->lineHeight); + } + /* Delete from buffer */ + textInfo->txtBuffer[textInfo->curLine]->lineLength -= 1; + textInfo->bufSpot -= 1; + } + return 1; +} + + + +static int DrawLineWrap(display, win, x, y, h, col) +Display *display; +Window win; /* What window to draw it in */ +int x, y; /* Position of upper left corner */ +int h; /* Height of indicator */ +int col; /* Color of indicator */ +/* + * This routine draws a line wrap indicator at the end of a line. + * Visually, it is an arrow of the specified height directly against + * the scroll bar border. The bitmap used for the arrow is stored + * in 'arrowMap' with size 'arrow_width' and 'arrow_height'. + */ +{ + struct txtWin *textInfo; + + textInfo = (struct txtWin *)XLookUpAssoc(display, textWindows, + (XID) win); + + /* First, draw the arrow */ + XCopyArea(display, textInfo->arrowMap, textInfo->mainWindow, + textInfo->CursorGC, + 0, 0, arrow_width, arrow_height, + x, y + h - arrow_height, 1); + + /* Then draw the stem */ + XDrawLine(display, textInfo->mainWindow, textInfo->CursorGC, + x + STEMOFFSET, y, + x + STEMOFFSET, y + h - arrow_height); + return 1; +} + + + + +static int DrawLine(display, textInfo, lineIndex, ypos) +Display *display; +struct txtWin *textInfo; /* Text window information */ +int lineIndex; /* Index of line to draw */ +int ypos; /* Y position for line */ +/* + * This routine destructively draws the indicated line in the + * indicated window at the indicated position. It does not + * clear to end of line however. It draws a line wrap indicator + * if needed but does not draw a cursor. + */ +{ + int index, startPos, curFont, theColor, curX, saveX, fontIndex; + struct txtLine *someLine; + char lineBuffer[BUFSIZE], *glyph; + short *linePointer; + XFontStruct *theFont; + XGCValues gc; + + /* First, we draw the text */ + index = 0; + curX = XPADDING; + someLine = textInfo->txtBuffer[lineIndex]; + linePointer = &(textInfo->mainBuffer[someLine->lineText]); + while (index < someLine->lineLength) { + startPos = index; + saveX = curX; + curFont = linePointer[index] & FONTMASK; + fontIndex = curFont >> FONTSHIFT; + theFont = &(textInfo->theFonts[fontIndex]); + theColor = textInfo->theColors[fontIndex]; + glyph = &(lineBuffer[0]); + while ((index < someLine->lineLength) && + ((linePointer[index] & FONTMASK) == curFont)) + { + *glyph = linePointer[index] & CHARMASK; + index++; + curX += CharSize(textInfo, lineIndex, index); + glyph++; + } + + /* Flush out the glyphs */ + XFillRectangle(display, textInfo->mainWindow, + textInfo->bgGC, + saveX, ypos, + textInfo->w - BARSIZE, + someLine->lineHeight + YPADDING + INTERLINE); + + XDrawString(display, textInfo->mainWindow, + textInfo->fontGC[fontIndex], + saveX, ypos, + lineBuffer, someLine->lineLength); + } + /* Then the line wrap indicator (if needed) */ + if (someLine->lineFlags & WRAPFLAG) { + DrawLineWrap(display, textInfo->mainWindow, + textInfo->w - BARSIZE - WRAPINDSIZE, + ypos, someLine->lineHeight, + textInfo->fgPix); + } + return 1; +} + + + + +static int HandleNewFont(display, fontNum, textInfo, flagWord) +Display *display; +int fontNum; /* Font number */ +struct txtWin *textInfo; /* Text information */ +int flagWord; /* DODISP or nothing */ +/* + * This routine handles a new font request. These requests take + * the form "^F<digit>". The parsing is done in TxtWriteStr. + * This routine is called only if the form is valid. It may return + * a failure (0 status) if the requested font is not loaded. + * If the new font is larger than any of the current + * fonts on the line, it will change the line height and redisplay + * the line. + */ +{ + struct txtLine *thisLine; + int heightDiff, baseDiff, redrawFlag; + + if (textInfo->theFonts[fontNum].fid == 0) { + return 0; + } else { + thisLine = textInfo->txtBuffer[textInfo->curLine]; + textInfo->curFont = fontNum; + redrawFlag = 0; + heightDiff = textInfo->theFonts[fontNum].ascent + + textInfo->theFonts[fontNum].descent - + thisLine->lineHeight; + + if (heightDiff > 0) { + redrawFlag = 1; + } else { + heightDiff = 0; + } + + if (redrawFlag) { + if (flagWord & DODISP) { + /* Clear current line */ + XFillRectangle(display, textInfo->mainWindow, + textInfo->bgGC, + 0, textInfo->curY, textInfo->w, + thisLine->lineHeight); + + /* Check to see if it requires scrolling */ + if ((textInfo->curY + thisLine->lineHeight + heightDiff + + INTERLINE) > textInfo->h) + { + /* + * General approach: "unscroll" the last line up + * and then call ScrollDown to do the right thing. + */ + textInfo->endLine -= 1; + textInfo->bottomSpace += thisLine->lineHeight + + INTERLINE; + + XFillRectangle(display, textInfo->mainWindow, + textInfo->bgGC, + 0, textInfo->h - textInfo->bottomSpace, + textInfo->w, textInfo->bottomSpace); + + thisLine->lineHeight += heightDiff; + ScrollDown(display, textInfo); + textInfo->curY = textInfo->h - + (textInfo->bottomSpace + INTERLINE + + thisLine->lineHeight); + } + else + { + /* Just update bottom space */ + textInfo->bottomSpace -= heightDiff; + thisLine->lineHeight += heightDiff; + } + /* Redraw the current line */ + DrawLine(display, textInfo, textInfo->curLine, textInfo->curY); + } else { + /* Just update line height */ + thisLine->lineHeight += heightDiff; + } + } + return 1; + } +} + + + +int TxtWriteStr(display, w, str) +Display *display; +Window w; /* Text window */ +register char *str; /* 0 terminated string */ +/* + * This routine writes a string to the specified text window. + * The following notes apply: + * - Text is always appended to the end of the text buffer. + * - If the scroll bar is positioned such that the end of the + * text is not visible, an automatic scroll to the bottom + * will be done before the appending of text. + * - Non-printable ASCII characters are not displayed. + * - The '\n' character causes the current text position to + * advance one line and start at the left. + * - Tabs are not supported. + * - Lines too long for the screen will be wrapped and a line wrap + * indication will be drawn. + * - Backspace clears the previous character. It will do the right + * thing if asked to backspace past a wrapped line. + * - A new font can be chosen using the sequence '^F<digit>' where + * <digit> is 0-7. The directive will be ignored if + * there is no font in the specified slot. + * Returns 0 if something went wrong. + */ +{ + register int fontIndex; + register struct txtWin *textInfo; + register struct txtLine *thisLine; + + if ((textInfo = (struct txtWin *) XLookUpAssoc(display, textWindows, (XID) w)) == 0) + return 0; + + /* See if screen needs to be updated */ + if (textInfo->flagWord & SCREENWRONG) { + TxtRepaint(display, textInfo->mainWindow); + } + + /* See if we have to scroll down to the bottom */ + if (textInfo->flagWord & NOTATBOTTOM) { + WarpToBottom(display, textInfo); + textInfo->flagWord &= (~NOTATBOTTOM); + } + + /* Undraw the current cursor */ + thisLine = textInfo->txtBuffer[textInfo->curLine]; + + XFillRectangle(display, w, textInfo->bgGC, + thisLine->lineWidth + CUROFFSET, + textInfo->curY, + CURSORWIDTH, + thisLine->lineHeight); + + for ( /* str is ok */ ; (*str != 0) ; str++) { + /* Check to see if we are waiting on a font */ + if (textInfo->flagWord & FONTNUMWAIT) { + textInfo->flagWord &= (~FONTNUMWAIT); + fontIndex = *str - '0'; + if ((fontIndex >= 0) && (fontIndex < MAXFONTS)) { + /* Handle font -- go get next character */ + if (HandleNewFont(display, fontIndex, textInfo, DODISP)) + continue; + } + } + + /* Inline code for handling normal character case */ + if ((*str >= LOWCHAR) && (*str <= HIGHCHAR)) { + register XFontStruct *thisFont; + register struct txtLine *thisLine; + register int charWidth; + int thisColor; + + /* Determine size of character */ + thisFont = &(textInfo->theFonts[textInfo->curFont]); + thisColor = textInfo->theColors[textInfo->curFont]; + if (*str <= thisFont->min_char_or_byte2 || + *str >= thisFont->max_char_or_byte2 || + thisFont->per_char == 0) + charWidth = thisFont->max_bounds.width + 1; + else + charWidth = thisFont->per_char[*str].width + 1; + + /* Check to see if line wrap is required */ + thisLine = textInfo->txtBuffer[textInfo->curLine]; + if (thisLine->lineWidth + charWidth > + (textInfo->w-BARSIZE-WRAPINDSIZE)) + { + DrawLineWrap(display, textInfo->mainWindow, + textInfo->w-BARSIZE-WRAPINDSIZE, + textInfo->curY, thisLine->lineHeight, + textInfo->fgPix); + thisLine->lineFlags |= WRAPFLAG; + /* Handle the spacing problem the same way as a newline */ + HandleNewLine(display, textInfo, DODISP | NONEWLINE); + thisLine = textInfo->txtBuffer[textInfo->curLine]; + } + + /* Ready to draw character */ + XDrawString(display, textInfo->mainWindow, + DEFAULT_GC, + textInfo->curX += charWidth, + textInfo->curY + thisLine->lineHeight, + str, 1); + + /* Append character onto main buffer */ + if (textInfo->bufSpot >= textInfo->bufAlloc) + /* Make room for more characters */ + ExpandBuffer(textInfo); + textInfo->mainBuffer[(textInfo->bufSpot)++] = + (textInfo->curFont << FONTSHIFT) | (*str); + + /* Update the line start array */ + thisLine->lineLength += 1; + thisLine->lineWidth += charWidth; + } else if (*str == NEWLINE) { + HandleNewLine(display, textInfo, DODISP); + } else if (*str == NEWFONT) { + /* Go into waiting for font number mode */ + textInfo->flagWord |= FONTNUMWAIT; + } else if (*str == BACKSPACE) { + HandleBackspace(display, textInfo, DODISP); + } else { + /* Ignore all others */ + } + } + /* Draw the cursor in its new position */ + thisLine = textInfo->txtBuffer[textInfo->curLine]; + + XFillRectangle(display, w, textInfo->CursorGC, + thisLine->lineWidth + CUROFFSET, + textInfo->curY /* + thisLine->lineHeight */, + CURSORWIDTH, thisLine->lineHeight); + + return 1; +} + + + +int TxtJamStr(display, w, str) +Display *display; +Window w; /* Text window */ +register char *str; /* NULL terminated string */ +/* + * This is the same as TxtWriteStr except the screen is NOT updated. + * After a call to this routine, TxtRepaint should be called to + * update the screen. This routine is meant to be used to load + * a text buffer with information and then allow the user to + * scroll through it at will. + */ +{ + register int fontIndex; + register struct txtWin *textInfo; + + if ((textInfo = (struct txtWin *) XLookUpAssoc(display, textWindows, (XID) w) + ) == 0) + return 0; + + for ( /* str is ok */ ; (*str != 0) ; str++) { + /* Check to see if we are waiting on a font */ + if (textInfo->flagWord & FONTNUMWAIT) { + textInfo->flagWord &= (~FONTNUMWAIT); + fontIndex = *str - '0'; + if ((fontIndex >= 0) && (fontIndex < MAXFONTS)) { + if (HandleNewFont(display, fontIndex, textInfo, 0)) { + /* Handled font -- go get next character */ + continue; + } + } + } + /* Inline code for handling normal character case */ + if ((*str >= LOWCHAR) && (*str <= HIGHCHAR)) { + register XFontStruct *thisFont; + register struct txtLine *thisLine; + register int charWidth; + + /* Determine size of character */ + thisFont = &(textInfo->theFonts[textInfo->curFont]); + + if (*str <= thisFont->min_char_or_byte2 || + *str >= thisFont->max_char_or_byte2 || + thisFont->per_char == 0) + charWidth = thisFont->max_bounds.width + 1; + else + charWidth = thisFont->per_char[*str].width + 1; + + /* Check to see if line wrap is required */ + thisLine = textInfo->txtBuffer[textInfo->curLine]; + if (thisLine->lineWidth + charWidth > + (textInfo->w-BARSIZE-WRAPINDSIZE)) + { + thisLine->lineFlags |= WRAPFLAG; + /* Handle the spacing problem the same way as a newline */ + HandleNewLine(display, textInfo, NONEWLINE); + thisLine = textInfo->txtBuffer[textInfo->curLine]; + } + /* Append character onto main buffer */ + if (textInfo->bufSpot >= textInfo->bufAlloc) + /* Make room for more characters */ + ExpandBuffer(textInfo); + textInfo->mainBuffer[(textInfo->bufSpot)++] = + (textInfo->curFont << FONTSHIFT) | (*str); + + /* Update the line start array */ + thisLine->lineLength += 1; + thisLine->lineWidth += charWidth; + } else if (*str == NEWLINE) { + HandleNewLine(display, textInfo, 0); + } else if (*str == NEWFONT) { + /* Go into waiting for font number mode */ + textInfo->flagWord |= FONTNUMWAIT; + } else if (*str == BACKSPACE) { + HandleBackspace(display, textInfo, 0); + } else { + /* Ignore all others */ + } + } + textInfo->flagWord |= SCREENWRONG; + return 1; +} + + + +int TxtRepaint(display,w) +Display *display; +Window w; +/* + * Repaints the given scrollable text window. The routine repaints + * the entire window. For handling exposure events, the TxtFilter + * routine should be used. + */ +{ + struct txtWin *textInfo; + int index, ypos; + + if ((textInfo = (struct txtWin *) XLookUpAssoc(display, textWindows, (XID) w) + ) == 0) + return 0; + + /* Check to see if the screen is up to date */ + if (textInfo->flagWord & SCREENWRONG) { + textInfo->endLine = FindEndLine(textInfo, &(textInfo->bottomSpace)); + textInfo->flagWord &= (~SCREENWRONG); + } + + ypos = YPADDING; + index = textInfo->startLine; + for (;;) { + DrawLine(display, textInfo, index, ypos); + if (index >= textInfo->endLine) break; + ypos += (textInfo->txtBuffer[index]->lineHeight + INTERLINE); + index++; + } + /* Draw the cursor (if on screen) */ + if (textInfo->endLine == textInfo->curLine) { + XFillRectangle(display, w, textInfo->CursorGC, + textInfo->txtBuffer[index]->lineWidth + CUROFFSET, + ypos /* + textInfo->txtBuffer[index]->lineHeight */, + CURSORWIDTH, textInfo->txtBuffer[index]->lineHeight); + + } + /* Update the scroll bar */ + UpdateScroll(display, textInfo); + return 1; +} + + + +static int InsertIndex(textInfo, thisIndex, ypos) +struct txtWin *textInfo; /* Text Window Information */ +int thisIndex; /* Line index of exposed line */ +int ypos; /* Drawing position of line */ +/* + * This routine inserts the supplied line index into the copy + * exposure array for 'textInfo'. The array is kept sorted + * from lowest to highest using insertion sort. The array + * is dynamically expanded if needed. + */ +{ + struct expEvent *newItem; + int newSize, index, downIndex; + + /* Check to see if we need to expand it */ + if ((textInfo->exposeSize + 3) >= textInfo->exposeAlloc) { + newSize = textInfo->exposeAlloc + + (textInfo->exposeAlloc * EXPANDPERCENT / 100); + textInfo->exposeAry = (struct expEvent **) + realloc((char *) textInfo->exposeAry, + (unsigned) (newSize * sizeof(struct expEvent *))); + for (index = textInfo->exposeAlloc; index < newSize; index++) + textInfo->exposeAry[index] = alloc(struct expEvent); + textInfo->exposeAlloc = newSize; + } + /* Find spot for insertion. NOTE: last spot has big number */ + for (index = 0; index <= textInfo->exposeSize; index++) { + if (textInfo->exposeAry[index]->lineIndex >= thisIndex) { + if (textInfo->exposeAry[index]->lineIndex > thisIndex) { + /* Insert before this entry */ + newItem = textInfo->exposeAry[textInfo->exposeSize+1]; + for (downIndex = textInfo->exposeSize; + downIndex >= index; + downIndex--) + { + textInfo->exposeAry[downIndex+1] = + textInfo->exposeAry[downIndex]; + } + /* Put a free structure at this spot */ + textInfo->exposeAry[index] = newItem; + /* Fill it in */ + textInfo->exposeAry[index]->lineIndex = thisIndex; + textInfo->exposeAry[index]->ypos = ypos; + /* Break out of loop */ + textInfo->exposeSize += 1; + } + break; + } + } + return 1; +} + + + +static int ScrollUp(display, textInfo) +Display *display; +struct txtWin *textInfo; /* Text window information */ +/* + * This routine scrolls the indicated text window up by one + * line. The line above the current line must exist. The + * window is scrolled so that the line above the start line + * is displayed at the top of the screen. This may cause + * many lines to scroll off the bottom. The scrolling is + * done using XCopyArea. The exposure events should be caught + * by ExposeCopy. + */ +{ + int targetSpace; + + /* Make sure all exposures have been handled by now */ + if (textInfo->startLine == 0) return 0; + targetSpace = textInfo->txtBuffer[textInfo->startLine-1]->lineHeight + + INTERLINE; + /* Move the area downward by the target amount */ + XCopyArea(display, textInfo->mainWindow, textInfo->mainWindow, + DEFAULT_GC, + 0, YPADDING, textInfo->w - BARSIZE, + textInfo->h, 0, targetSpace); + + textInfo->flagWord |= COPYEXPOSE; + /* Update the text window parameters */ + textInfo->startLine -= 1; + textInfo->endLine = FindEndLine(textInfo, &(textInfo->bottomSpace)); + + /* Clear out bottom space region */ + XClearArea(display, textInfo->mainWindow, + 0, textInfo->h - textInfo->bottomSpace, + textInfo->w, textInfo->bottomSpace); + + UpdateExposures(display, textInfo); + UpdateScroll(display, textInfo); + + return 1; +} + + +static int ScrollToSpot(display, textInfo, ySpot) +Display *display; +struct txtWin *textInfo; /* Text window information */ +int ySpot; /* Button position in scroll window */ +/* + * This routine scrolls the specified text window relative to the + * position of the mouse in the scroll bar. The center of the screen + * will be positioned to correspond to the mouse position. + */ +{ + int targetLine, aboveLines; + + targetLine = textInfo->numLines * ySpot / textInfo->h; + textInfo->startLine = targetLine; + textInfo->endLine = FindEndLine(textInfo, &(textInfo->bottomSpace)); + aboveLines = 0; + /* Make the target line the *center* of the window */ + while ((textInfo->startLine > 0) && + (aboveLines < textInfo->endLine - targetLine)) + { + textInfo->startLine -= 1; + textInfo->endLine = FindEndLine(textInfo, &(textInfo->bottomSpace)); + aboveLines++; + } + if (textInfo->endLine == textInfo->numLines-1) { + WarpToBottom(display, textInfo); + } else { + XClearWindow(display, textInfo->mainWindow); + TxtRepaint(display, textInfo->mainWindow); + } + return 1; +} + + + +static int LineToTop(display, textInfo, pos) +Display *display; +struct txtWin *textInfo; /* Text window information */ +int pos; /* Y position of mouse */ +/* + * This routine scrolls the screen down until the line at the + * mouse position is at the top of the screen. It stops + * if it can't scroll the buffer down that far. If the + * global 'ScrollOption' is NORMSCROLL, a smooth scroll + * is used. Otherwise, it jumps to the right position + * and repaints the screen. + */ +{ + int index, sum; + + /* First, we find the current line */ + sum = 0; + for (index = textInfo->startLine; index <= textInfo->endLine; index++) { + if (sum + textInfo->txtBuffer[index]->lineHeight + INTERLINE> pos) break; + sum += textInfo->txtBuffer[index]->lineHeight + INTERLINE; + } + /* We always want to scroll down at least one line */ + if (index == textInfo->startLine) index++; + if (ScrollOption == NORMSCROLL) { + /* Scroll down until 'index' is the starting line */ + while ((textInfo->startLine < index) && ScrollDown(display, textInfo)) + { + /* Empty Loop Body */ + } + } else { + /* Immediately jump to correct spot */ + textInfo->startLine = index; + textInfo->endLine = FindEndLine(textInfo, &(textInfo->bottomSpace)); + if (textInfo->endLine == textInfo->numLines-1) { + WarpToBottom(display, textInfo); + } else { + XClearWindow(display, textInfo->mainWindow); + TxtRepaint(display, textInfo->mainWindow); + } + } + /* Check to see if at end of buffer */ + if (textInfo->endLine >= textInfo->numLines-1) { + textInfo->flagWord &= (~NOTATBOTTOM); + } + return 1; +} + + + +static int TopToHere(display, textInfo, pos) +Display *display; +struct txtWin *textInfo; /* Text window information */ +int pos; /* Y position of mouse */ +/* + * This routine scrolls the screen up until the top line of + * the screen is at the current Y position of the mouse. Again, + * it will stop if it can't scroll that far. If the global + * 'ScrollOption' is NORMSCROLL, a smooth scroll is used. + * If it's not, it will simply redraw the screen at the + * correct spot. + */ +{ + int sum, target, linesup, index; + + target = pos - textInfo->txtBuffer[textInfo->startLine]->lineHeight; + /* We always want to scroll up at least one line */ + if (target <= 0) target = 1; + sum = 0; + linesup = 0; + /* Check to see if we are at the top anyway */ + if (textInfo->startLine == 0) return 0; + if (ScrollOption == NORMSCROLL) { + /* Scroll up until sum of new top lines greater than target */ + while ((sum < target) && ScrollUp(display, textInfo)) { + sum += textInfo->txtBuffer[textInfo->startLine]->lineHeight; + linesup++; + } + } else { + /* Search backward to find index */ + index = textInfo->startLine - 1; + while ((index > 0) && (sum < target)) { + sum += textInfo->txtBuffer[index]->lineHeight; + linesup++; + index--; + } + /* Go directly to the index */ + textInfo->startLine = index; + textInfo->endLine = FindEndLine(textInfo, &(textInfo->bottomSpace)); + XClearWindow(display, textInfo->mainWindow); + TxtRepaint(display, textInfo->mainWindow); + } + /* If we scrolled, assert we are not at bottom of buffer */ + if (linesup > 0) { + textInfo->flagWord |= NOTATBOTTOM; + } + return 1; +} + + + +int TxtFilter(display, evt) +Display *display; +XEvent *evt; +/* + * This routine handles events associated with scrollable text windows. + * It will handle all exposure events and any button released events + * in the scroll bar of a text window. It does NOT handle any other + * events. If it cannot handle the event, it will return 0. + */ +{ + XExposeEvent *expose = &evt->xexpose; + XButtonEvent *btEvt = &evt->xbutton; + XGraphicsExposeEvent *gexpose = &evt->xgraphicsexpose; + XNoExposeEvent *noexpose = &evt->xnoexpose; + struct txtWin *textInfo; + int index, ypos; + Window w, sw; + + if (textWindows == (XAssocTable *) 0) { + textWindows = XCreateAssocTable(32); + if (textWindows == (XAssocTable *) 0) return(0); + } + if (evt->type == Expose) { + w = expose->window; + sw = 0; + } + else if (evt->type == GraphicsExpose) { + w = gexpose->drawable; + sw = 0; + } + else if (evt->type == NoExpose) { + w = noexpose->drawable; + sw = 0; + } + else if (evt->type == ButtonRelease) { + w = btEvt->window; + sw = btEvt->subwindow; + } + else + return 0; + + if ((textInfo = (struct txtWin *) + XLookUpAssoc(display, textWindows, (XID) w)) == 0) + return 0; + + /* Determine whether it's main window or not */ + if ((w == textInfo->mainWindow) && (sw == 0)) { + /* Main Window - handle exposures */ + switch (evt->type) { + case Expose: + ypos = 0 /*YPADDING*/; + for (index = textInfo->startLine; + index <= textInfo->endLine; + index++) + { + int lh = textInfo->txtBuffer[index]->lineHeight; + + if (((ypos + lh) >= expose->y) && + (ypos <= (expose->y + expose->height))) + { + /* Intersection region */ + /* Draw line immediately */ + DrawLine(display, textInfo, index, ypos); + /* And possibly draw cursor */ + if (textInfo->curLine == index) { + XFillRectangle(display, w, textInfo->CursorGC, + textInfo->txtBuffer[index]->lineWidth + + CUROFFSET, + ypos, + CURSORWIDTH, + lh); + } + } + ypos += lh + INTERLINE; + } + break; + case GraphicsExpose: + ypos = 0 /*YPADDING*/; + for (index = textInfo->startLine; + index <= textInfo->endLine; + index++) + { + int lh = textInfo->txtBuffer[index]->lineHeight; + + if (((ypos + lh) >= gexpose->y) && + (ypos <= (gexpose->y + gexpose->height))) + { + /* Intersection region */ + /* Draw line immediately */ + DrawLine(display, textInfo, index, ypos); + /* And possibly draw cursor */ + if (textInfo->curLine == index) { + XFillRectangle(display, w, textInfo->CursorGC, + textInfo->txtBuffer[index]->lineWidth + + CUROFFSET, + ypos, + CURSORWIDTH, + lh); + } + } + ypos += lh + INTERLINE; + } + break; + case NoExpose: + break; + default: + /* Not one of our events */ + return 0; + } + } else { + switch (evt->type) { + case Expose: + UpdateScroll(display, textInfo); + break; + case ButtonRelease: + /* Find out which button */ + switch (btEvt->button) { + case Button1: + /* Scroll up until top line is at mouse position */ + TopToHere(display, textInfo, btEvt->y); + break; + case Button2: + /* Scroll to spot relative to position */ + ScrollToSpot(display, textInfo, btEvt->y); + if (textInfo->endLine >= textInfo->numLines-1) { + textInfo->flagWord &= (~NOTATBOTTOM); + } else { + textInfo->flagWord |= NOTATBOTTOM; + } + break; + case Button3: + /* Scroll down until pointed line is at top */ + LineToTop(display, textInfo, btEvt->y); + break; + } + break; + default: + /* Not one of our events */ + return 0; + } + } + return 1; +} diff --git a/gnu/games/chess/Xchess/scrollText/scrollText.h b/gnu/games/chess/Xchess/scrollText/scrollText.h new file mode 100644 index 0000000..d9d05b0 --- /dev/null +++ b/gnu/games/chess/Xchess/scrollText/scrollText.h @@ -0,0 +1,32 @@ +/* + * Scrollable Text Window Header File + * + * David Harrison + * University of California, Berkeley + * 1986 + * + * This file contains definitions for a scrollable text window + * with scroll bar support. + */ + +int TxtGrab(); + /* Take hold of a previously created window */ + +#define TXT_NO_COLOR -1 + +int TxtAddFont(); + /* Loads a new font for use later */ +int TxtWinP(); + /* Returns non-zero value if the window is text window */ +int TxtClear(); + /* Clears text window and resets text buffer */ + +int TxtWriteStr(); + /* Writes a string to window with immediate update */ +int TxtJamStr(); + /* Write a string without causing update to screen */ + +int TxtRepaint(); + /* Repaints entire scrollable text window */ +int TxtFilter(); + /* Handles events related to text window */ diff --git a/gnu/games/chess/Xchess/shade.bitmap b/gnu/games/chess/Xchess/shade.bitmap new file mode 100644 index 0000000..a32ac80 --- /dev/null +++ b/gnu/games/chess/Xchess/shade.bitmap @@ -0,0 +1,71 @@ + +#define shade_width 80 +#define shade_height 80 +static char shade_bits[] = { + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88}; diff --git a/gnu/games/chess/Xchess/std.c b/gnu/games/chess/Xchess/std.c new file mode 100644 index 0000000..c839b91 --- /dev/null +++ b/gnu/games/chess/Xchess/std.c @@ -0,0 +1,425 @@ + +/* This file contains code for X-CHESS. + Copyright (C) 1986 Free Software Foundation, Inc. + +This file is part of X-CHESS. + +X-CHESS is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY. No author or distributor +accepts responsibility to anyone for the consequences of using it +or for whether it serves any particular purpose or works at all, +unless he says so in writing. Refer to the X-CHESS General Public +License for full details. + +Everyone is granted permission to copy, modify and redistribute +X-CHESS, but only under the conditions described in the +X-CHESS General Public License. A copy of this license is +supposed to have been given to you along with X-CHESS so you +can know your rights and responsibilities. It should be in a +file named COPYING. Among other things, the copyright notice +and this notice must be preserved on all copies. */ + + +/* RCS Info: $Revision: 1.1 $ on $Date: 86/11/01 17:08:40 $ + * $Source: /users/faustus/xchess/RCS/std.c,v $ + * Copyright (c) 1985 Wayne A. Christopher, U. C. Berkeley CAD Group + * + * Utility routines. + */ + +#include "std.h" + +#ifndef IBMPC +#include <sys/types.h> +#endif not IBMPC +#ifdef UNIX +#include <signal.h> +#include <pwd.h> +#endif UNIX +#ifdef BSD +#include <sys/time.h> +#include <sys/resource.h> +#endif BSD + +extern char **environ; + +bool +prefix(p, s) + register char *p, *s; +{ + while (*p && (*p == *s)) + p++, s++; + if (!*p) + return (true); + else + return (false); +} + +/* Create a copy of a string. */ + +char * +copy(str) + char *str; +{ + char *p, *tmalloc(); + + p = tmalloc(strlen(str) + 1); + strcpy(p, str); + return(p); +} + +/* Determine whether sub is a substring of str. */ + +bool +substring(sub, str) + register char *str, *sub; +{ + register char *s; + + while(*str) { + if(*str == *sub) { + for(s = sub; *s; s++) + if(*s != *str++) + break; + if(*s == '\0') + return (true); + } + str++; + } + return (false); +} + +/* Malloc num bytes and initialize to zero. Fatal error if the space can't + * be malloc'd. + */ + +char * +tmalloc(num) + register int num; +{ + register char *s; + char *malloc(); + + s = malloc((unsigned) num); + if (!s) { + fatal("malloc: can't allocate %d bytes", num); + } + bzero(s, num); + return(s); +} + +char * +trealloc(ptr, num) + char *ptr; + int num; +{ + register char *s; + char *realloc(); + + s = realloc(ptr, (unsigned) num); + if (!s) { + fatal("realloc: can't allocate %d bytes", num); + } + /* Well, this won't be zeroed... Too bad... */ + return(s); +} + +/* Append one character to a string. Don't check for overflow. */ + +void +appendc(s, c) + char *s, c; +{ + while (*s) + s++; + *s++ = c; + *s = '\0'; + return; +} + +int +scannum(str) + char *str; +{ + int i = 0; + + while(isdigit(*str)) + i = i * 10 + *(str++) - '0'; + return(i); +} + +/* Case insensitive prefix. */ + +bool +ciprefix(p, s) + register char *p, *s; +{ + while (*p) { + if ((isupper(*p) ? tolower(*p) : *p) != + (isupper(*s) ? tolower(*s) : *s)) + return(false); + p++; + s++; + } + return (true); +} + +/* Case insensitive strcmp... */ + +bool +cieq(p, s) + register char *p, *s; +{ + while (*p) { + if ((isupper(*p) ? tolower(*p) : *p) != + (isupper(*s) ? tolower(*s) : *s)) + return(false); + p++; + s++; + } + return (!*s); +} + +#ifdef BSD + +/* Return the date. Return value is static data. */ + +char * +datestring() +{ + register char *tzn; + struct tm *tp; + static char tbuf[40]; + char *ap; + struct timeval tv; + struct timezone tz; + char *timezone(), *asctime(); + int i; + struct tm *localtime(); + + (void) gettimeofday(&tv, &tz); + tp = localtime((time_t *) &tv.tv_sec); + ap = asctime(tp); + tzn = timezone(tz.tz_minuteswest, tp->tm_isdst); + sprintf(tbuf, "%.20s", ap); + if (tzn) + strcat(tbuf, tzn); + strcat(tbuf, ap + 19); + i = strlen(tbuf); + tbuf[i - 1] = '\0'; + return (tbuf); +} + +#else BSD + +/* Give it a try... */ + +char * +datestring() +{ + long i; + static char buf[64]; + + i = time(0); + strcpy(buf, ctime(&i)); + buf[strlen(buf) - 1] = '\0'; /* Kill the nl. */ + return (buf); +} + +#endif + +/* How many seconds have elapsed in running time. */ + +int +seconds() +{ +#ifdef BSD + struct rusage ruse; + + getrusage(RUSAGE_SELF, &ruse); + return (ruse.ru_utime.tv_sec); +#else BSD +#endif BSD +} + +/* A few things that may not exist on non-unix systems. */ + +#ifndef BSD + +#ifndef index + +char * +index(s, c) + register char *s; + register char c; +{ + while ((*s != c) && (*s != '\0')) + s++; + if (*s == '\0') + return ((char *) 0); + else + return (s); +} + +#endif not index + +#ifndef rindex + +char * +rindex(s, c) + register char *s; + register char c; +{ + register char *t; + + for (t = s; *t != '\0'; t++); + while ((*t != c) && (t != s)) + t--; + if (t == s) + return ((char *) 0); + else + return (t); +} + +#endif not rindex + +#ifndef bcopy + +void +bcopy(from, to, num) + register char *from, *to; + register int num; +{ + while (num-- > 0) + *to++ = *from++; + return; +} + +#endif not bcopy + +#ifndef bzero + +void +bzero(ptr, num) + register char *ptr; + register int num; +{ + while (num-- > 0) + *ptr++ = '\0'; + return; +} + +#endif not bzero + +/* This might not be around... If not then forget about sorting... */ + +void qsort() {} + +#endif BSD + +char * +gettok(s) + char **s; +{ + char buf[BSIZE]; + int i = 0; + + while (isspace(**s)) + (*s)++; + if (!**s) + return (NULL); + while (**s && !isspace(**s)) + buf[i++] = *(*s)++; + buf[i] = '\0'; + while (isspace(**s)) + (*s)++; + return (copy(buf)); +} + +/* Die horribly. */ + +/* VARARGS1 */ +void +fatal(s, args) + char *s; +{ + fputs("Internal Error: ", stderr); + _doprnt(s, &args, stderr); + putc('\n', stderr); + + kill(getpid(), SIGIOT); + /* NOTREACHED */ +} + +void +setenv(name, value) + char *name, *value; +{ + int i; + char **xx, *s; + + s = tmalloc(strlen(name) + 2); + sprintf(s, "%s=", name); + + /* Copy the old environment... */ + for (i = 0; environ[i]; i++) + if (prefix(s, environ[i])) + break; + if (!environ[i]) { + xx = (char **) tmalloc((i + 2) * sizeof (char *)); + for (i = 0; environ[i]; i++) + xx[i] = environ[i]; + xx[i + 1] = NULL; + environ = xx; + } else + xx = environ; + + xx[i] = tmalloc(strlen(name) + strlen(value) + 2); + sprintf(xx[i], "%s=%s", name, value); + return; +} + +char * +getusername() +{ + int i = getuid(); + struct passwd *pw = getpwuid(i); + + return (pw ? pw->pw_name : NULL); +} + +char * +gethome() +{ + int i = getuid(); + struct passwd *pw = getpwuid(i); + + return (pw ? pw->pw_dir : "/strange"); +} + +char * +tildexpand(s) + char *s; +{ + struct passwd *pw; + char *n, buf[64]; + int i; + + if (*s != '~') + return (copy(s)); + + for (s++, i = 0; *s != '/'; s++, i++) + buf[i] = *s; + buf[i] = '\0'; + if (!i) + pw = getpwuid(getuid()); + else + pw = getpwnam(buf); + if (!pw) + return (s); + n = tmalloc(strlen(s) + strlen(pw->pw_dir) + 1); + strcpy(n, pw->pw_dir); + strcat(n, s); + return (n); +} + diff --git a/gnu/games/chess/Xchess/std.h b/gnu/games/chess/Xchess/std.h new file mode 100644 index 0000000..fc8fa64 --- /dev/null +++ b/gnu/games/chess/Xchess/std.h @@ -0,0 +1,105 @@ + +/* This file contains code for X-CHESS. + Copyright (C) 1986 Free Software Foundation, Inc. + +This file is part of X-CHESS. + +X-CHESS is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY. No author or distributor +accepts responsibility to anyone for the consequences of using it +or for whether it serves any particular purpose or works at all, +unless he says so in writing. Refer to the X-CHESS General Public +License for full details. + +Everyone is granted permission to copy, modify and redistribute +X-CHESS, but only under the conditions described in the +X-CHESS General Public License. A copy of this license is +supposed to have been given to you along with X-CHESS so you +can know your rights and responsibilities. It should be in a +file named COPYING. Among other things, the copyright notice +and this notice must be preserved on all copies. */ + + +/* RCS Info: $Revision: 1.2 $ on $Date: 86/11/23 17:18:32 $ + * $Source: /users/faustus/xchess/RCS/std.h,v $ + * Copyright (c) 1986 Wayne A. Christopher, U. C. Berkeley CAD Group + * + * Standard definitions. + */ + +#define UNIX +#define BSD + +#ifndef FILE +#include <stdio.h> +#endif +#ifndef isalpha +#include <ctype.h> +#endif +#ifndef HUGE +#include <math.h> +#endif +#include <strings.h> + +typedef int bool; + +#define false 0 +#define true 1 + +/* Externs defined in std.c */ + +extern char *tmalloc(); +extern char *trealloc(); +extern char *copy(); +extern char *datestring(); +extern char *getusername(); +extern char *gethome(); +extern char *gettok(); +extern char *tildexpand(); +extern void fatal(); +extern void setenv(); +extern void appendc(); +extern int scannum(); +extern int seconds(); +extern bool prefix(); +extern bool ciprefix(); +extern bool cieq(); +extern bool substring(); + +/* Externs from libc */ + +extern char *getenv(); +extern int errno; +extern char *sys_errlist[]; + +/* Should use BSIZE instead of BUFSIZ... */ + +#define BSIZE 512 + +/* Some standard macros. */ + +#define eq(a,b) (!strcmp((a), (b))) +#define isalphanum(c) (isalpha(c) || isdigit(c)) +#define alloc(strname) ((struct strname *) tmalloc(sizeof(struct strname))) +#define tfree(ptr) { if (ptr) free((char *) ptr); ptr = 0; } +#define hexnum(c) ((((c) >= '0') && ((c) <= '9')) ? ((c) - '0') : ((((c) >= \ + 'a') && ((c) <= 'f')) ? ((c) - 'a' + 10) : ((((c) >= 'A') && \ + ((c) <= 'F')) ? ((c) - 'A' + 10) : 0))) + +#ifndef BSD +#define random rand +#define srandom srand +#endif BSD + +#ifdef VMS + +#define EXIT_NORMAL 1 +#define EXIT_BAD 0 + +#else VMS + +#define EXIT_NORMAL 0 +#define EXIT_BAD 1 + +#endif VMS + diff --git a/gnu/games/chess/Xchess/valid.c b/gnu/games/chess/Xchess/valid.c new file mode 100644 index 0000000..3dcdb00 --- /dev/null +++ b/gnu/games/chess/Xchess/valid.c @@ -0,0 +1,264 @@ + +/* This file contains code for X-CHESS. + Copyright (C) 1986 Free Software Foundation, Inc. + +This file is part of X-CHESS. + +X-CHESS is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY. No author or distributor +accepts responsibility to anyone for the consequences of using it +or for whether it serves any particular purpose or works at all, +unless he says so in writing. Refer to the X-CHESS General Public +License for full details. + +Everyone is granted permission to copy, modify and redistribute +X-CHESS, but only under the conditions described in the +X-CHESS General Public License. A copy of this license is +supposed to have been given to you along with X-CHESS so you +can know your rights and responsibilities. It should be in a +file named COPYING. Among other things, the copyright notice +and this notice must be preserved on all copies. */ + + +/* RCS Info: $Revision: 1.3 $ on $Date: 86/11/23 17:18:35 $ + * $Source: /users/faustus/xchess/RCS/valid.c,v $ + * Copyright (c) 1986 Wayne A. Christopher, U. C. Berkeley CAD Group + * Permission is granted to do anything with this code except sell it + * or remove this message. + * + * Validate a move. + */ + +#include "xchess.h" + +extern bool ischeck(), couldmove(); + +bool +valid_move(m, b) + move *m; + board *b; +{ + board tb; + + /* First check that the piece can make the move at all... */ + if (!couldmove(m, b)) + return (false); + + /* Now see if the king is in check now. */ + bcopy((char *) b, (char *) &tb, sizeof (board)); + board_move(&tb, m); + if (ischeck(&tb, m->piece.color)) + return (false); + + if (ischeck(&tb, ((m->piece.color == WHITE) ? BLACK : WHITE))) + m->check = true; + + return (true); +} + +static bool +couldmove(m, b) + move *m; + board *b; +{ + int x, y; + + switch (m->type) { + case KCASTLE: + if ((m->piece.color == WHITE) && (b->white_cant_castle_k) || + (m->piece.color == BLACK) && + (b->black_cant_castle_k)) + return (false); + if ((b->square[m->fromy][5].color != NONE) || + (b->square[m->fromy][6].color != NONE)) + return (false); + if (ischeck(b, m->piece.color)) + return (false); + break; + + case QCASTLE: + if ((m->piece.color == WHITE) && (b->white_cant_castle_q) || + (m->piece.color == BLACK) && + (b->black_cant_castle_q)) + return (false); + if ((b->square[m->fromy][1].color != NONE) || + (b->square[m->fromy][2].color != NONE) || + (b->square[m->fromy][3].color != NONE)) + return (false); + if (ischeck(b, m->piece.color)) + return (false); + break; + + case MOVE: + case CAPTURE: + /* There is one special case here, that of taking a pawn + * en passant. In this case we change the move field to + * CAPTURE if it's ok. + */ + switch (m->piece.type) { + case PAWN: + if ((m->type == MOVE) && (m->fromx == m->tox)) { + /* A normal move. */ + if ((m->piece.color == WHITE) && (m->fromy == + m->toy + 1)) + break; + if ((m->piece.color == WHITE) && (m->fromy == + 6) && (m->toy == 4) && + (b->square[5][m->fromx].color + == NONE)) + break; + if ((m->piece.color == BLACK) && (m->fromy == + m->toy - 1)) + break; + if ((m->piece.color == BLACK) && (m->fromy == + 1) && (m->toy == 3) && + (b->square[2][m->fromx].color + == NONE)) + break; + return (false); + } else if (m->type == CAPTURE) { + if ((((m->piece.color == WHITE) && (m->fromy == + m->toy + 1)) || ((m->piece.color == + BLACK) && (m->fromy == m->toy - + 1))) && ((m->fromx == m->tox + 1) || + (m->fromx == m->tox - 1))) + break; + /* Now maybe it's enpassant... We've already + * checked for some of these things in the + * calling routine. + */ + if (m->enpassant) { + if (b->square[(m->piece.color == WHITE) + ? 3 : 4][m->tox].color == + ((m->piece.color == WHITE) ? + BLACK : WHITE)) + break; + } + return (false); + } + return (false); + + case ROOK: + if (m->fromx == m->tox) { + for (y = m->fromy + ((m->fromy > m->toy) ? -1 : + 1); y != m->toy; y += ((m->fromy + > m->toy) ? -1 : 1)) + if (b->square[y][m->tox].color != NONE) + return (false); + break; + } + if (m->fromy == m->toy) { + for (x = m->fromx + ((m->fromx > m->tox) ? -1 : + 1); x != m->tox; x += ((m->fromx + > m->tox) ? -1 : 1)) + if (b->square[m->toy][x].color != NONE) + return (false); + break; + } + return (false); + + case KNIGHT: + x = m->fromx - m->tox; + y = m->fromy - m->toy; + if ((((x == 2) || (x == -2)) && + ((y == 1) || (y == -1))) || + (((x == 1) || (x == -1)) && + ((y == 2) || (y == -2)))) + break; + return (false); + + case BISHOP: + x = m->fromx - m->tox; + y = m->fromy - m->toy; + if ((x != y) && (x != - y)) + return (false); + for (x = m->fromx + ((m->fromx > m->tox) ? -1 : 1), y = + m->fromy + ((m->fromy > m->toy) ? -1 : + 1); x != m->tox; + x += ((m->fromx > m->tox) ? -1 : 1), + y += ((m->fromy > m->toy) ? -1 : 1)) + if (b->square[y][x].color != NONE) + return (false); + break; + + case QUEEN: + if (m->fromx == m->tox) { + for (y = m->fromy + ((m->fromy > m->toy) ? -1 : + 1); y != m->toy; y += ((m->fromy + > m->toy) ? -1 : 1)) + if (b->square[y][m->tox].color != NONE) + return (false); + break; + } + if (m->fromy == m->toy) { + for (x = m->fromx + ((m->fromx > m->tox) ? -1 : + 1); x != m->tox; x += ((m->fromx + > m->tox) ? -1 : 1)) + if (b->square[m->toy][x].color != NONE) + return (false); + break; + } + x = m->fromx - m->tox; + y = m->fromy - m->toy; + if ((x != y) && (x != - y)) + return (false); + for (x = m->fromx + ((m->fromx > m->tox) ? -1 : 1), y = + m->fromy + ((m->fromy > m->toy) ? -1 : + 1); x != m->tox; + x += ((m->fromx > m->tox) ? -1 : 1), + y += ((m->fromy > m->toy) ? -1 : 1)) + if (b->square[y][x].color != NONE) + return (false); + break; + + case KING: + x = m->fromx - m->tox; + y = m->fromy - m->toy; + if ((x >= -1) && (x <= 1) && (y >= -1) && (y <= 1)) + break; + return (false); + } + break; + } + return (true); +} + +/* Say whether either king is in check... If move is non-NULL, say whether he + * in in check after the move takes place. We do this in a rather stupid way. + */ + +static bool +ischeck(b, col) + board *b; + color col; +{ + int x, y, kx, ky; + move ch; + + for (x = 0; x < SIZE; x++) + for (y = 0; y < SIZE; y++) + if ((b->square[y][x].color == col) && + (b->square[y][x].type == KING)) { + kx = x; + ky = y; + } + + for (x = 0; x < SIZE; x++) + for (y = 0; y < SIZE; y++) + if (b->square[y][x].color == ((col == WHITE) ? + BLACK : WHITE)) { + ch.type = CAPTURE; + ch.piece.color = b->square[y][x].color; + ch.piece.type = b->square[y][x].type; + ch.fromx = x; + ch.fromy = y; + ch.tox = kx; + ch.toy = ky; + ch.enpassant = false; + if (couldmove(&ch, b)) + return (true); + } + + return (false); +} + diff --git a/gnu/games/chess/Xchess/window.c b/gnu/games/chess/Xchess/window.c new file mode 100644 index 0000000..4aae06d --- /dev/null +++ b/gnu/games/chess/Xchess/window.c @@ -0,0 +1,952 @@ +/* This file contains code for X-CHESS. + Copyright (C) 1986 Free Software Foundation, Inc. + +This file is part of X-CHESS. + +X-CHESS is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY. No author or distributor +accepts responsibility to anyone for the consequences of using it +or for whether it serves any particular purpose or works at all, +unless he says so in writing. Refer to the X-CHESS General Public +License for full details. + +Everyone is granted permission to copy, modify and redistribute +X-CHESS, but only under the conditions described in the +X-CHESS General Public License. A copy of this license is +supposed to have been given to you along with X-CHESS so you +can know your rights and responsibilities. It should be in a +file named COPYING. Among other things, the copyright notice +and this notice must be preserved on all copies. */ + + +/* RCS Info: $Revision: 1.5 $ on $Date: 86/11/26 12:11:15 $ + * $Source: /users/faustus/xchess/RCS/window.c,v $ + * Copyright (c) 1986 Wayne A. Christopher, U. C. Berkeley CAD Group + * Permission is granted to do anything with this code except sell it + * or remove this message. + * + * Deal with the two (or one) windows. + */ + +#include "xchess.h" +#include <X11/Xutil.h> +#include <sys/time.h> + +#include "pawn.bitmap" +#include "rook.bitmap" +#include "knight.bitmap" +#include "bishop.bitmap" +#include "queen.bitmap" +#include "king.bitmap" + +#include "pawn_outline.bitmap" +#include "rook_outline.bitmap" +#include "knight_outline.bitmap" +#include "bishop_outline.bitmap" +#include "queen_outline.bitmap" +#include "king_outline.bitmap" + +#include "pawn_mask.bitmap" +#include "rook_mask.bitmap" +#include "knight_mask.bitmap" +#include "bishop_mask.bitmap" +#include "queen_mask.bitmap" +#include "king_mask.bitmap" + +#include "shade.bitmap" + +#include "xchess.cur" +#include "xchess_mask.cur" + +#include "xchess.icon" + +windata *win1, *win2; +bool win_flashmove = false; + +extern bool setup(); +extern void service(), drawgrid(), icon_refresh(); + +bool +win_setup(disp1, disp2) + char *disp1, *disp2; +{ + win1 = alloc(windata); + if (!oneboard) + win2 = alloc(windata); + + if (!setup(disp1, win1) || (!oneboard && !setup(disp2, win2))) + return (false); + + if (blackflag) { + win1->color = BLACK; + win1->flipped = true; + } else + win1->color = WHITE; + win_drawboard(win1); + + if (!oneboard) { + win2->color = BLACK; + win2->flipped = true; + win_drawboard(win2); + } + + return(true); +} + +/* Draw the chess board... */ + +void +win_drawboard(win) + windata *win; +{ + int i, j; + + drawgrid(win); + + /* Now toss on the squares... */ + for (i = 0; i < SIZE; i++) + for (j = 0; j < SIZE; j++) + win_erasepiece(j, i, win->color); + + return; +} + +/* Draw one piece. */ + +void +win_drawpiece(p, y, x, wnum) + piece *p; + int y, x; + color wnum; +{ + char *bits, *maskbits, *outline; + windata *win; + char buf[BSIZE]; + XImage *tmpImage; + Pixmap tmpPM, maskPM; + XGCValues gc; + + if (oneboard || (wnum == win1->color)) + win = win1; + else + win = win2; + + if (win->flipped) { + y = SIZE - y - 1; + x = SIZE - x - 1; + } + + /* + if (debug) + fprintf(stderr, "draw a %s at (%d, %d) on board %d\n", + piecenames[(int) p->type], y, x, wnum); + */ + + if ((x < 0) || (x > 7) || (y < 0) || (y > 7)) exit(1); + + switch (p->type) { + case PAWN: + bits = pawn_bits; + maskbits = pawn_mask_bits; + outline = pawn_outline_bits; + break; + + case ROOK: + bits = rook_bits; + maskbits = rook_mask_bits; + outline = rook_outline_bits; + break; + + case KNIGHT: + bits = knight_bits; + maskbits = knight_mask_bits; + outline = knight_outline_bits; + break; + + case BISHOP: + bits = bishop_bits; + maskbits = bishop_mask_bits; + outline = bishop_outline_bits; + break; + + case QUEEN: + bits = queen_bits; + maskbits = queen_mask_bits; + outline = queen_outline_bits; + break; + + case KING: + bits = king_bits; + maskbits = king_mask_bits; + outline = king_outline_bits; + break; + + default: + fprintf(stderr, + "Internal Error: win_drawpiece: bad piece type %d\n", + p->type); + } + + /* There are two things we can do... If this is a black and white + * display, we have to shade the square and use an outline if the piece + * is white. We also have to use a mask... Since we don't want + * to use up too many bitmaps, create the mask bitmap, put the bits, + * and then destroy it. + */ + if (win->bnw && (p->color == WHITE)) + bits = outline; + if (win->bnw && !iswhite(win, x, y)) { + XSetState(win->display, DefaultGC(win->display, 0), + BlackPixel(win->display, 0), + WhitePixel(win->display, 0), GXcopy, AllPlanes); + + tmpPM = XCreateBitmapFromData(win->display, win->boardwin, + shade_bits, SQUARE_WIDTH, SQUARE_HEIGHT); + + XCopyPlane(win->display, tmpPM, win->boardwin, DefaultGC(win->display, 0), + 0, 0, SQUARE_WIDTH, SQUARE_HEIGHT, + x * (SQUARE_WIDTH + BORDER_WIDTH), + y * (SQUARE_HEIGHT + BORDER_WIDTH), 1); + + XFreePixmap(win->display, tmpPM); + + XSetFunction(win->display, DefaultGC(win->display, 0), + GXandInverted); + maskPM = XCreateBitmapFromData(win->display, win->boardwin, + maskbits, SQUARE_WIDTH, SQUARE_HEIGHT); + XCopyPlane(win->display, maskPM, win->boardwin, DefaultGC(win->display, 0), + 0, 0, SQUARE_WIDTH, SQUARE_HEIGHT, + x * (SQUARE_WIDTH + BORDER_WIDTH), + y * (SQUARE_HEIGHT + BORDER_WIDTH), 1); + XFreePixmap(win->display, maskPM); + + XSetFunction(win->display, DefaultGC(win->display, 0), + GXor); + tmpPM = XCreateBitmapFromData(win->display, win->boardwin, + bits, SQUARE_WIDTH, SQUARE_HEIGHT); + XCopyPlane(win->display, tmpPM, win->boardwin, DefaultGC(win->display, 0), + 0, 0, SQUARE_WIDTH, SQUARE_HEIGHT, + x * (SQUARE_WIDTH + BORDER_WIDTH), + y * (SQUARE_HEIGHT + BORDER_WIDTH), 1); + XFreePixmap(win->display, tmpPM); + + XSetFunction(win->display, DefaultGC(win->display, 0), GXcopy); + + } else if (win->bnw){ + XSetState(win->display, DefaultGC(win->display, 0), + BlackPixel(win->display, 0), + WhitePixel(win->display, 0), GXcopy, AllPlanes); + + tmpPM = XCreateBitmapFromData(win->display, win->boardwin, + bits, SQUARE_WIDTH, SQUARE_HEIGHT); + XCopyPlane(win->display, tmpPM, win->boardwin, DefaultGC(win->display, 0), + 0, 0, SQUARE_WIDTH, SQUARE_HEIGHT, + x * (SQUARE_WIDTH + BORDER_WIDTH), + y * (SQUARE_HEIGHT + BORDER_WIDTH), 1); + XFreePixmap(win->display, tmpPM); + } else { + XSetState(win->display, DefaultGC(win->display, 0), + ((p->color == WHITE) ? win->whitepiece.pixel : + win->blackpiece.pixel), + (iswhite(win, x, y) ? win->whitesquare.pixel : + win->blacksquare.pixel), + GXcopy, AllPlanes); + tmpPM = XCreateBitmapFromData(win->display, win->boardwin, + bits, SQUARE_WIDTH, SQUARE_HEIGHT); + XCopyPlane(win->display, tmpPM, win->boardwin, DefaultGC(win->display, 0), + 0, 0, SQUARE_WIDTH, SQUARE_HEIGHT, + x * (SQUARE_WIDTH + BORDER_WIDTH), + y * (SQUARE_HEIGHT + BORDER_WIDTH), 1); + XFreePixmap(win->display, tmpPM); + } + + if (!record_english) { + gc.foreground = win->textcolor.pixel; + if (iswhite(win, x, y) || win->bnw) + gc.background = win->whitesquare.pixel; + else + gc.background = win->blacksquare.pixel; + + gc.font = win->small->fid; + + XChangeGC(win->display, DefaultGC(win->display, 0), + GCForeground | GCBackground | GCFont, &gc); + + if (!x) { + sprintf(buf, " %d", SIZE - y); + XDrawImageString(win->display, win->boardwin, + DefaultGC(win->display, 0), + 1, (y + 1) * (SQUARE_HEIGHT + + BORDER_WIDTH) - BORDER_WIDTH + + win->small->max_bounds.ascent - 1, buf, 2); + } + if (y == SIZE - 1) { + sprintf(buf, "%c", 'A' + x); + XDrawImageString(win->display, win->boardwin, + DefaultGC(win->display, 0), + x * (SQUARE_WIDTH + BORDER_WIDTH) + 1, + SIZE * (SQUARE_HEIGHT + BORDER_WIDTH) - BORDER_WIDTH + + win->small->max_bounds.ascent - 1, buf, 1); + } + } + return; +} + +void +win_erasepiece(y, x, wnum) + int y, x; + color wnum; +{ + windata *win; + char buf[BSIZE]; + XGCValues gc; + Pixmap tmpPM; + + if (oneboard || (wnum == win1->color)) + win = win1; + else + win = win2; + + if (win->flipped) { + y = SIZE - y - 1; + x = SIZE - x - 1; + } + + /* + if (debug) + fprintf(stderr, "erase square (%d, %d) on board %d\n", y, x, + wnum); + */ + + if ((x < 0) || (x > 7) || (y < 0) || (y > 7)) exit(1); + + if (win->bnw && !iswhite(win, x, y)) { + XSetState(win->display, DefaultGC(win->display, 0), + BlackPixel(win->display, 0), + WhitePixel(win->display, 0), GXcopy, AllPlanes); + tmpPM = XCreateBitmapFromData(win->display, win->boardwin, + shade_bits, SQUARE_WIDTH, SQUARE_HEIGHT); + + XCopyPlane(win->display, tmpPM, win->boardwin, DefaultGC(win->display, 0), + 0, 0, SQUARE_WIDTH, SQUARE_HEIGHT, + x * (SQUARE_WIDTH + BORDER_WIDTH), + y * (SQUARE_HEIGHT + BORDER_WIDTH), 1); + + XFreePixmap(win->display, tmpPM); + } else { + XSetFillStyle(win->display, DefaultGC(win->display, 0), + FillSolid); + XSetForeground(win->display, DefaultGC(win->display, 0), + iswhite(win, x, y) ? win->whitesquare.pixel : + win->blacksquare.pixel); + XFillRectangle(win->display, win->boardwin, + DefaultGC(win->display, 0), + x * (SQUARE_WIDTH + BORDER_WIDTH), + y * (SQUARE_HEIGHT + BORDER_WIDTH), + SQUARE_WIDTH, SQUARE_HEIGHT); + } + + if (!record_english) { + gc.foreground = win->textcolor.pixel; + if (iswhite(win, x, y) || win->bnw) + gc.background = win->whitesquare.pixel; + else + gc.background = win->blacksquare.pixel; + + gc.font = win->small->fid; + + XChangeGC(win->display, DefaultGC(win->display, 0), + GCForeground | GCBackground | GCFont, &gc); + + if (!x) { + sprintf(buf, " %d", SIZE - y); + XDrawImageString(win->display, win->boardwin, + DefaultGC(win->display, 0), + 1, (y + 1) * (SQUARE_HEIGHT + + BORDER_WIDTH) - BORDER_WIDTH + + win->small->max_bounds.ascent - 1, buf, 2); + } + if (y == SIZE - 1) { + sprintf(buf, "%c", 'A' + x); + XDrawImageString(win->display, win->boardwin, + DefaultGC(win->display, 0), + x * (SQUARE_WIDTH + BORDER_WIDTH) + 1, + SIZE * (SQUARE_HEIGHT + BORDER_WIDTH) - BORDER_WIDTH + + win->small->max_bounds.ascent - 1, buf, 1); + } + } + + + return; +} + +void +win_flash(m, wnum) + move *m; + color wnum; +{ + windata *win; + int sx, sy, ex, ey, i; + + if (oneboard || (wnum == win1->color)) + win = win1; + else + win = win2; + + if (win->flipped) { + sx = SIZE - m->fromx - 1; + sy = SIZE - m->fromy - 1; + ex = SIZE - m->tox - 1; + ey = SIZE - m->toy - 1; + } else { + sx = m->fromx; + sy = m->fromy; + ex = m->tox; + ey = m->toy; + } + sx = sx * (SQUARE_WIDTH + BORDER_WIDTH) + SQUARE_WIDTH / 2; + sy = sy * (SQUARE_HEIGHT + BORDER_WIDTH) + SQUARE_HEIGHT / 2; + ex = ex * (SQUARE_WIDTH + BORDER_WIDTH) + SQUARE_WIDTH / 2; + ey = ey * (SQUARE_HEIGHT + BORDER_WIDTH) + SQUARE_HEIGHT / 2; + + XSetFunction(win->display, DefaultGC(win->display, 0), GXinvert); + XSetLineAttributes(win->display, DefaultGC(win->display, 0), + 0, LineSolid, 0, 0); + for (i = 0; i < num_flashes * 2; i++) { + XDrawLine(win->display,win->boardwin, + DefaultGC(win->display, 0), + sx, sy, ex, ey); + } + + XSetFunction(win->display, DefaultGC(win->display, 0), GXcopy); + return; +} + +/* Handle input from the players. */ + +void +win_process(quick) + bool quick; +{ + int i, rfd = 0, wfd = 0, xfd = 0; + struct timeval timeout; + + timeout.tv_sec = 0; + timeout.tv_usec = (quick ? 0 : 500000); + + if (XPending(win1->display)) + service(win1); + if (!oneboard) { + if (XPending(win1->display)) + service(win2); + } + + if (oneboard) + rfd = 1 << win1->display->fd; + else + rfd = (1 << win1->display->fd) | (1 << win2->display->fd); + if (!(i = select(32, &rfd, &wfd, &xfd, &timeout))) + return; + if (i == -1) { + perror("select"); + exit(1); + } + if (rfd & (1 << win1->display->fd)) + service(win1); + if (!oneboard && (rfd & (1 << win2->display->fd))) + service(win2); + + return; +} + +static void +service(win) + windata *win; +{ + XEvent ev; + + while(XPending(win->display)) { + XNextEvent(win->display, &ev); + if (TxtFilter(win->display, &ev)) + continue; + + if (ev.xany.window == win->boardwin) { + switch (ev.type) { + case ButtonPress: + button_pressed(&ev, win); + break; + + case ButtonRelease: + button_released(&ev, win); + break; + + case Expose: + /* Redraw... */ + win_redraw(win, &ev); + break; + + case 0: + case NoExpose: + break; + default: + fprintf(stderr, "Bad event type %d\n", ev.type); + exit(1); + } + } else if (ev.xany.window == win->wclockwin) { + switch (ev.type) { + case Expose: + clock_draw(win, WHITE); + break; + + case 0: + case NoExpose: + break; + default: + fprintf(stderr, "Bad event type %d\n", ev.type); + exit(1); + } + } else if (ev.xany.window == win->bclockwin) { + switch (ev.type) { + case Expose: + clock_draw(win, BLACK); + break; + + case 0: + case NoExpose: + break; + default: + fprintf(stderr, "Bad event type %d\n", ev.type); + exit(1); + } + } else if (ev.xany.window == win->jailwin) { + switch (ev.type) { + case Expose: + jail_draw(win); + break; + + case 0: + case NoExpose: + break; + default: + fprintf(stderr, "Bad event type %d\n", ev.type); + exit(1); + } + } else if (ev.xany.window == win->buttonwin) { + switch (ev.type) { + case ButtonPress: + button_service(win, &ev); + break; + + case Expose: + button_draw(win); + break; + + case 0: + case NoExpose: + break; + default: + fprintf(stderr, "Bad event type %d\n", ev.type); + exit(1); + } + } else if (ev.xany.window == win->icon) { + icon_refresh(win); + } else if (ev.xany.window == win->basewin) { + message_send(win, &ev); + } else { + fprintf(stderr, "Internal Error: service: bad win\n"); + fprintf(stderr, "window = %d, event = %d\n", ev.xany.window, + ev.type); + } + } + return; +} + +void +win_redraw(win, event) + windata *win; + XEvent *event; +{ + XExposeEvent *ev = &event->xexpose; + int x1, y1, x2, y2, i, j; + + drawgrid(win); + if (ev) { + x1 = ev->x / (SQUARE_WIDTH + BORDER_WIDTH); + y1 = ev->y / (SQUARE_HEIGHT + BORDER_WIDTH); + x2 = (ev->x + ev->width) / (SQUARE_WIDTH + BORDER_WIDTH); + y2 = (ev->y + ev->height) / (SQUARE_HEIGHT + BORDER_WIDTH); + } else { + x1 = 0; + y1 = 0; + x2 = SIZE - 1; + y2 = SIZE - 1; + } + + if (x1 < 0) x1 = 0; + if (y1 < 0) y1 = 0; + if (x2 < 0) x2 = 0; + if (y2 < 0) y2 = 0; + if (x1 > SIZE - 1) x1 = SIZE - 1; + if (y1 > SIZE - 1) y1 = SIZE - 1; + if (x2 > SIZE - 1) x2 = SIZE - 1; + if (y2 > SIZE - 1) y2 = SIZE - 1; + + if (win->flipped) { + y1 = SIZE - y2 - 1; + y2 = SIZE - y1 - 1; + x1 = SIZE - x2 - 1; + x2 = SIZE - x1 - 1; + } + + for (i = x1; i <= x2; i++) + for (j = y1; j <= y2; j++) { + if (chessboard->square[j][i].color == NONE) + win_erasepiece(j, i, WHITE); + else + win_drawpiece(&chessboard->square[j][i], j, i, + WHITE); + if (!oneboard) { + if (chessboard->square[j][i].color == NONE) + win_erasepiece(j, i, BLACK); + else + win_drawpiece(&chessboard->square[j][i], + j, i, BLACK); + } + } + + return; +} + +static bool +setup(dispname, win) + char *dispname; + windata *win; +{ + char buf[BSIZE], *s; + Pixmap bm, bmask; + Cursor cur; + extern char *program, *recfile; + XSizeHints xsizes; + + + if (!(win->display = XOpenDisplay(dispname))) + return (false); + + + /* Now get boolean defaults... */ + if ((s = XGetDefault(win->display, program, "noisy")) && eq(s, "on")) + noisyflag = true; + if ((s = XGetDefault(win->display, program, "savemoves")) && eq(s, "on")) + saveflag = true; + if ((s = XGetDefault(win->display, program, "algebraic")) && eq(s, "on")) + record_english = false; + if ((s = XGetDefault(win->display, program, "blackandwhite")) && eq(s, "on")) + bnwflag = true; + if ((s = XGetDefault(win->display, program, "quickrestore")) && eq(s, "on")) + quickflag = true; + if ((s = XGetDefault(win->display, program, "flash")) && eq(s, "on")) + win_flashmove = true; + + /* ... numeric variables ... */ + if (s = XGetDefault(win->display, program, "numflashes")) + num_flashes = atoi(s); + if (s = XGetDefault(win->display, program, "flashsize")) + flash_size = atoi(s); + + /* ... and strings. */ + if (s = XGetDefault(win->display, program, "progname")) + progname = s; + if (s = XGetDefault(win->display, program, "proghost")) + proghost = s; + if (s = XGetDefault(win->display, program, "recordfile")) + recfile = s; + if (s = XGetDefault(win->display, program, "blackpiece")) + black_piece_color = s; + if (s = XGetDefault(win->display, program, "whitepiece")) + white_piece_color = s; + if (s = XGetDefault(win->display, program, "blacksquare")) + black_square_color = s; + if (s = XGetDefault(win->display, program, "whitesquare")) + white_square_color = s; + if (s = XGetDefault(win->display, program, "bordercolor")) + border_color = s; + if (s = XGetDefault(win->display, program, "textcolor")) + text_color = s; + if (s = XGetDefault(win->display, program, "textback")) + text_back = s; + if (s = XGetDefault(win->display, program, "errortext")) + error_text = s; + if (s = XGetDefault(win->display, program, "playertext")) + player_text = s; + if (s = XGetDefault(win->display, program, "cursorcolor")) + cursor_color = s; + + if ((DisplayPlanes(win->display, 0) == 1) || bnwflag) + win->bnw = true; + + /* Allocate colors... */ + if (win->bnw) { + win->blackpiece.pixel = BlackPixel (win->display, 0); + win->whitepiece.pixel = WhitePixel (win->display, 0); + win->blacksquare.pixel = BlackPixel (win->display, 0); + win->whitesquare.pixel = WhitePixel (win->display, 0); + win->border.pixel = BlackPixel (win->display, 0); + win->textcolor.pixel = BlackPixel (win->display, 0); + win->textback.pixel = WhitePixel (win->display, 0); + win->playertext.pixel = BlackPixel (win->display, 0); + win->errortext.pixel = BlackPixel (win->display, 0); + win->cursorcolor.pixel = BlackPixel (win->display, 0) ; + } else { + if (!XParseColor(win->display, + DefaultColormap(win->display, 0), + black_piece_color, &win->blackpiece) || + !XParseColor(win->display, + DefaultColormap(win->display, 0), + white_piece_color, &win->whitepiece) || + !XParseColor(win->display, + DefaultColormap(win->display, 0), + black_square_color, &win->blacksquare) || + !XParseColor(win->display, + DefaultColormap(win->display, 0), + white_square_color, &win->whitesquare) || + !XParseColor(win->display, + DefaultColormap(win->display, 0), + border_color, &win->border) || + !XParseColor(win->display, + DefaultColormap(win->display, 0), + text_color, &win->textcolor) || + !XParseColor(win->display, + DefaultColormap(win->display, 0), + text_back, &win->textback) || + !XParseColor(win->display, + DefaultColormap(win->display, 0), + error_text, &win->errortext) || + !XParseColor(win->display, + DefaultColormap(win->display, 0), + player_text, &win->playertext) || + !XParseColor(win->display, + DefaultColormap(win->display, 0), + cursor_color, &win->cursorcolor) || + !XAllocColor(win->display, + DefaultColormap(win->display, 0), + &win->blackpiece) || + !XAllocColor(win->display, + DefaultColormap(win->display, 0), + &win->whitepiece) || + !XAllocColor(win->display, + DefaultColormap(win->display, 0), + &win->blacksquare) || + !XAllocColor(win->display, + DefaultColormap(win->display, 0), + &win->whitesquare) || + !XAllocColor(win->display, + DefaultColormap(win->display, 0), + &win->border) || + !XAllocColor(win->display, + DefaultColormap(win->display, 0), + &win->textcolor) || + !XAllocColor(win->display, + DefaultColormap(win->display, 0), + &win->textback) || + !XAllocColor(win->display, + DefaultColormap(win->display, 0), + &win->errortext) || + !XAllocColor(win->display, + DefaultColormap(win->display, 0), + &win->playertext) || + !XAllocColor(win->display, + DefaultColormap(win->display, 0), + &win->cursorcolor)) + fprintf(stderr, "Can't get colors...\n"); + } + + /* Get fonts... */ + if ((win->small = XLoadQueryFont(win->display,SMALL_FONT)) == + NULL) + fprintf(stderr, "Can't get small font...\n"); + + if ((win->medium = XLoadQueryFont(win->display,MEDIUM_FONT)) + == NULL) + fprintf(stderr, "Can't get medium font...\n"); + + if ((win->large = XLoadQueryFont(win->display,LARGE_FONT)) == + NULL) + fprintf(stderr, "Can't get large font...\n"); + + + /* Create the windows... */ + + win->basewin = + XCreateSimpleWindow(win->display,DefaultRootWindow(win->display), + BASE_XPOS, BASE_YPOS, + BASE_WIDTH, BASE_HEIGHT, 0, + BlackPixel(win->display, 0), + WhitePixel(win->display, 0)); + win->boardwin = XCreateSimpleWindow(win->display,win->basewin, + BOARD_XPOS, BOARD_YPOS, + BOARD_WIDTH, BOARD_HEIGHT, + BORDER_WIDTH, + win->border.pixel, + WhitePixel(win->display, 0)); + win->recwin = XCreateSimpleWindow(win->display,win->basewin, + RECORD_XPOS, RECORD_YPOS, + RECORD_WIDTH, RECORD_HEIGHT, + BORDER_WIDTH, win->border.pixel, + win->textback.pixel); + win->jailwin = XCreateSimpleWindow(win->display,win->basewin, + JAIL_XPOS, JAIL_YPOS, + JAIL_WIDTH, JAIL_HEIGHT, + BORDER_WIDTH, + win->border.pixel, + win->textback.pixel); + win->wclockwin = XCreateSimpleWindow(win->display,win->basewin, + WCLOCK_XPOS, WCLOCK_YPOS, + CLOCK_WIDTH, CLOCK_HEIGHT, + BORDER_WIDTH, win->border.pixel, + win->textback.pixel); + win->bclockwin = XCreateSimpleWindow(win->display,win->basewin, + BCLOCK_XPOS, BCLOCK_YPOS, + CLOCK_WIDTH, CLOCK_HEIGHT, + BORDER_WIDTH, win->border.pixel, + win->textback.pixel); + win->messagewin = XCreateSimpleWindow(win->display,win->basewin, + MESS_XPOS, MESS_YPOS, + MESS_WIDTH, MESS_HEIGHT, + BORDER_WIDTH, win->border.pixel, + win->textback.pixel); + win->buttonwin = XCreateSimpleWindow(win->display,win->basewin, + BUTTON_XPOS, BUTTON_YPOS, + BUTTON_WIDTH, BUTTON_HEIGHT, + BORDER_WIDTH, win->border.pixel, + win->textback.pixel); + + /* Let's define an icon... */ + win->iconpixmap = XCreatePixmapFromBitmapData(win->display, + win->basewin, icon_bits, + icon_width, icon_height, + win->blacksquare.pixel, + win->whitesquare.pixel, + 1); + xsizes.flags = PSize | PMinSize | PPosition; + xsizes.min_width = BASE_WIDTH; + xsizes.min_height = BASE_HEIGHT; + xsizes.x = BASE_XPOS; + xsizes.y = BASE_YPOS; + XSetStandardProperties(win->display, win->basewin, + program, program, win->iconpixmap, + 0, NULL, &xsizes); + + bm = XCreateBitmapFromData(win->display, + win->basewin, xchess_bits, + xchess_width, xchess_height); + bmask = XCreateBitmapFromData(win->display, + win->basewin, xchess_mask_bits, + xchess_width, xchess_height); + cur = XCreatePixmapCursor(win->display, bm, bmask, + &win->cursorcolor, + &WhitePixel(win->display, 0), + xchess_x_hot, xchess_y_hot); + XFreePixmap(win->display, bm); + XFreePixmap(win->display, bmask); + + XDefineCursor(win->display,win->basewin, cur); + + XMapSubwindows(win->display,win->basewin); + XMapRaised(win->display,win->basewin); + + XSelectInput(win->display,win->basewin, KeyPressMask); + XSelectInput(win->display,win->boardwin, + ButtonPressMask | ButtonReleaseMask | ExposureMask); + XSelectInput(win->display,win->recwin, + ButtonReleaseMask | ExposureMask); + XSelectInput(win->display,win->jailwin, ExposureMask); + XSelectInput(win->display,win->wclockwin, ExposureMask); + XSelectInput(win->display,win->bclockwin, ExposureMask); + XSelectInput(win->display,win->messagewin, + ButtonReleaseMask | ExposureMask); + XSelectInput(win->display,win->buttonwin, + ButtonPressMask | ExposureMask); + + message_init(win); + record_init(win); + button_draw(win); + jail_init(win); + clock_init(win, WHITE); + clock_init(win, BLACK); + if (timeunit) { + if (timeunit > 1800) + sprintf(buf, "%d moves every %.2lg hours.\n", + movesperunit, ((double) timeunit) / 3600); + else if (timeunit > 30) + sprintf(buf, "%d moves every %.2lg minutes.\n", + movesperunit, ((double) timeunit) / 60); + else + sprintf(buf, "%d moves every %d seconds.\n", + movesperunit, timeunit); + message_add(win, buf, false); + } + return (true); +} + +static void +drawgrid(win) + windata *win; +{ + int i; + XGCValues gc; + + gc.function = GXcopy; + gc.plane_mask = AllPlanes; + gc.foreground = win->border.pixel; + gc.line_width = 0; + gc.line_style = LineSolid; + + XChangeGC(win->display, + DefaultGC(win->display, 0), + GCFunction | GCPlaneMask | GCForeground | + GCLineWidth | GCLineStyle, &gc); + + /* Draw the lines... horizontal, */ + for (i = 1; i < SIZE; i++) + XDrawLine(win->display, win->boardwin, + DefaultGC(win->display, 0), 0, + i * (SQUARE_WIDTH + BORDER_WIDTH) - + BORDER_WIDTH / 2, + SIZE * (SQUARE_WIDTH + BORDER_WIDTH), + i * (SQUARE_WIDTH + BORDER_WIDTH) - + BORDER_WIDTH / 2); + + /* and vertical... */ + for (i = 1; i < SIZE; i++) + XDrawLine(win->display, win->boardwin, + DefaultGC(win->display, 0), + i * (SQUARE_WIDTH + BORDER_WIDTH) - + BORDER_WIDTH / 2, 0, + i * (SQUARE_WIDTH + BORDER_WIDTH) - + BORDER_WIDTH / 2, + SIZE * (SQUARE_WIDTH + BORDER_WIDTH)); + return; +} + +void +win_restart() +{ + win1->flipped = false; + win_redraw(win1, (XEvent *) NULL); + if (!oneboard) { + win2->flipped = true; + win_redraw(win2, (XEvent *) NULL); + } + return; +} + +static void +icon_refresh(win) + windata *win; +{ + XCopyArea(win->display, win->iconpixmap, win->icon, + DefaultGC(win->display, 0), + 0, 0, icon_width, icon_height, 0, 0); + return; +} + diff --git a/gnu/games/chess/Xchess/window.c.bm b/gnu/games/chess/Xchess/window.c.bm new file mode 100644 index 0000000..19134d0 --- /dev/null +++ b/gnu/games/chess/Xchess/window.c.bm @@ -0,0 +1,928 @@ +/* This file contains code for X-CHESS. + Copyright (C) 1986 Free Software Foundation, Inc. + +This file is part of X-CHESS. + +X-CHESS is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY. No author or distributor +accepts responsibility to anyone for the consequences of using it +or for whether it serves any particular purpose or works at all, +unless he says so in writing. Refer to the X-CHESS General Public +License for full details. + +Everyone is granted permission to copy, modify and redistribute +X-CHESS, but only under the conditions described in the +X-CHESS General Public License. A copy of this license is +supposed to have been given to you along with X-CHESS so you +can know your rights and responsibilities. It should be in a +file named COPYING. Among other things, the copyright notice +and this notice must be preserved on all copies. */ + + +/* RCS Info: $Revision: 1.5 $ on $Date: 86/11/26 12:11:15 $ + * $Source: /users/faustus/xchess/RCS/window.c,v $ + * Copyright (c) 1986 Wayne A. Christopher, U. C. Berkeley CAD Group + * Permission is granted to do anything with this code except sell it + * or remove this message. + * + * Deal with the two (or one) windows. + */ + +#include "xchess.h" +#include <sys/time.h> + +#include "pawn.bitmap" +#include "rook.bitmap" +#include "knight.bitmap" +#include "bishop.bitmap" +#include "queen.bitmap" +#include "king.bitmap" + +#include "pawn_outline.bitmap" +#include "rook_outline.bitmap" +#include "knight_outline.bitmap" +#include "bishop_outline.bitmap" +#include "queen_outline.bitmap" +#include "king_outline.bitmap" + +#include "pawn_mask.bitmap" +#include "rook_mask.bitmap" +#include "knight_mask.bitmap" +#include "bishop_mask.bitmap" +#include "queen_mask.bitmap" +#include "king_mask.bitmap" + +#include "shade.bitmap" + +#include "xchess.cur" +#include "xchess_mask.cur" + +#include "xchess.icon" + +windata *win1, *win2; +bool win_flashmove = false; + +extern bool setup(); +extern void service(), drawgrid(), icon_refresh(); + +bool +win_setup(disp1, disp2) + char *disp1, *disp2; +{ + win1 = alloc(windata); + if (!oneboard) + win2 = alloc(windata); + + if (!setup(disp1, win1) || (!oneboard && !setup(disp2, win2))) + return (false); + + if (blackflag) { + win1->color = BLACK; + win1->flipped = true; + } else + win1->color = WHITE; + win_drawboard(win1); + + if (!oneboard) { + win2->color = BLACK; + win2->flipped = true; + win_drawboard(win2); + } + + return(true); +} + +/* Draw the chess board... */ + +void +win_drawboard(win) + windata *win; +{ + int i, j; + + drawgrid(win); + + /* Now toss on the squares... */ + for (i = 0; i < SIZE; i++) + for (j = 0; j < SIZE; j++) + win_erasepiece(j, i, win->color); + + return; +} + +/* Draw one piece. */ + +void +win_drawpiece(p, y, x, wnum) + piece *p; + int y, x; + color wnum; +{ + char *bits, *maskbits, *outline; + windata *win; + char buf[BSIZE]; + XImage *tmpImage; + Pixmap tmpPM, maskPM; + XGCValues gc; + + if (oneboard || (wnum == win1->color)) + win = win1; + else + win = win2; + + if (win->flipped) { + y = SIZE - y - 1; + x = SIZE - x - 1; + } + + /* + if (debug) + fprintf(stderr, "draw a %s at (%d, %d) on board %d\n", + piecenames[(int) p->type], y, x, wnum); + */ + + if ((x < 0) || (x > 7) || (y < 0) || (y > 7)) exit(1); + + switch (p->type) { + case PAWN: + bits = pawn_bits; + maskbits = pawn_mask_bits; + outline = pawn_outline_bits; + break; + + case ROOK: + bits = rook_bits; + maskbits = rook_mask_bits; + outline = rook_outline_bits; + break; + + case KNIGHT: + bits = knight_bits; + maskbits = knight_mask_bits; + outline = knight_outline_bits; + break; + + case BISHOP: + bits = bishop_bits; + maskbits = bishop_mask_bits; + outline = bishop_outline_bits; + break; + + case QUEEN: + bits = queen_bits; + maskbits = queen_mask_bits; + outline = queen_outline_bits; + break; + + case KING: + bits = king_bits; + maskbits = king_mask_bits; + outline = king_outline_bits; + break; + + default: + fprintf(stderr, + "Internal Error: win_drawpiece: bad piece type %d\n", + p->type); + } + + /* There are two things we can do... If this is a black and white + * display, we have to shade the square and use an outline if the piece + * is white. We also have to use a mask... Since we don't want + * to use up too many bitmaps, create the mask bitmap, put the bits, + * and then destroy it. + */ + if (win->bnw && (p->color == WHITE)) + bits = outline; + if (win->bnw && !iswhite(win, x, y)) { + XSetState(win->display, DefaultGC(win->display, 0), + BlackPixel(win->display, 0), + WhitePixel(win->display, 0), GXcopy, AllPlanes); + + tmpPM = XCreateBitmapFromData(win->display, win->boardwin, + shade_bits, SQUARE_WIDTH, SQUARE_HEIGHT); + + XCopyPlane(win->display, tmpPM, win->boardwin, DefaultGC(win->display, 0), + 0, 0, SQUARE_WIDTH, SQUARE_HEIGHT, + x * (SQUARE_WIDTH + BORDER_WIDTH), + y * (SQUARE_HEIGHT + BORDER_WIDTH), 1); + + XFreePixmap(win->display, tmpPM); + + XSetFunction(win->display, DefaultGC(win->display, 0), + GXandInverted); + maskPM = XCreateBitmapFromData(win->display, win->boardwin, + maskbits, SQUARE_WIDTH, SQUARE_HEIGHT); + XCopyPlane(win->display, maskPM, win->boardwin, DefaultGC(win->display, 0), + 0, 0, SQUARE_WIDTH, SQUARE_HEIGHT, + x * (SQUARE_WIDTH + BORDER_WIDTH), + y * (SQUARE_HEIGHT + BORDER_WIDTH), 1); + XFreePixmap(win->display, maskPM); + + XSetFunction(win->display, DefaultGC(win->display, 0), + GXor); + tmpPM = XCreateBitmapFromData(win->display, win->boardwin, + bits, SQUARE_WIDTH, SQUARE_HEIGHT); + XCopyPlane(win->display, tmpPM, win->boardwin, DefaultGC(win->display, 0), + 0, 0, SQUARE_WIDTH, SQUARE_HEIGHT, + x * (SQUARE_WIDTH + BORDER_WIDTH), + y * (SQUARE_HEIGHT + BORDER_WIDTH), 1); + XFreePixmap(win->display, tmpPM); + + XSetFunction(win->display, DefaultGC(win->display, 0), GXcopy); + + } else if (win->bnw){ + XSetState(win->display, DefaultGC(win->display, 0), + BlackPixel(win->display, 0), + WhitePixel(win->display, 0), GXcopy, AllPlanes); + + tmpPM = XCreateBitmapFromData(win->display, win->boardwin, + bits, SQUARE_WIDTH, SQUARE_HEIGHT); + XCopyPlane(win->display, tmpPM, win->boardwin, DefaultGC(win->display, 0), + 0, 0, SQUARE_WIDTH, SQUARE_HEIGHT, + x * (SQUARE_WIDTH + BORDER_WIDTH), + y * (SQUARE_HEIGHT + BORDER_WIDTH), 1); + XFreePixmap(win->display, tmpPM); + } else { + XSetState(win->display, DefaultGC(win->display, 0), + ((p->color == WHITE) ? win->whitepiece.pixel : + win->blackpiece.pixel), + (iswhite(win, x, y) ? win->whitesquare.pixel : + win->blacksquare.pixel), + GXcopy, AllPlanes); + tmpPM = XCreateBitmapFromData(win->display, win->boardwin, + bits, SQUARE_WIDTH, SQUARE_HEIGHT); + XCopyPlane(win->display, tmpPM, win->boardwin, DefaultGC(win->display, 0), + 0, 0, SQUARE_WIDTH, SQUARE_HEIGHT, + x * (SQUARE_WIDTH + BORDER_WIDTH), + y * (SQUARE_HEIGHT + BORDER_WIDTH), 1); + XFreePixmap(win->display, tmpPM); + } + + if (!record_english) { + gc.foreground = win->textcolor.pixel; + if (iswhite(win, x, y) || win->bnw) + gc.background = win->whitesquare.pixel; + else + gc.background = win->blacksquare.pixel; + + gc.font = win->small->fid; + + XChangeGC(win->display, DefaultGC(win->display, 0), + GCForeground | GCBackground | GCFont, &gc); + + if (!x) { + sprintf(buf, " %d", SIZE - y); + XDrawImageString(win->display, win->boardwin, + DefaultGC(win->display, 0), + 1, (y + 1) * (SQUARE_HEIGHT + + BORDER_WIDTH) - BORDER_WIDTH + + win->small->max_bounds.ascent - 1, buf, 2); + } + if (y == SIZE - 1) { + sprintf(buf, "%c", 'A' + x); + XDrawImageString(win->display, win->boardwin, + DefaultGC(win->display, 0), + x * (SQUARE_WIDTH + BORDER_WIDTH) + 1, + SIZE * (SQUARE_HEIGHT + BORDER_WIDTH) - BORDER_WIDTH + + win->small->max_bounds.ascent - 1, buf, 1); + } + } + return; +} + +void +win_erasepiece(y, x, wnum) + int y, x; + color wnum; +{ + windata *win; + char buf[BSIZE]; + XGCValues gc; + Pixmap tmpPM; + + if (oneboard || (wnum == win1->color)) + win = win1; + else + win = win2; + + if (win->flipped) { + y = SIZE - y - 1; + x = SIZE - x - 1; + } + + /* + if (debug) + fprintf(stderr, "erase square (%d, %d) on board %d\n", y, x, + wnum); + */ + + if ((x < 0) || (x > 7) || (y < 0) || (y > 7)) exit(1); + + if (win->bnw && !iswhite(win, x, y)) { + XSetState(win->display, DefaultGC(win->display, 0), + BlackPixel(win->display, 0), + WhitePixel(win->display, 0), GXcopy, AllPlanes); + tmpPM = XCreateBitmapFromData(win->display, win->boardwin, + shade_bits, SQUARE_WIDTH, SQUARE_HEIGHT); + + XCopyPlane(win->display, tmpPM, win->boardwin, DefaultGC(win->display, 0), + 0, 0, SQUARE_WIDTH, SQUARE_HEIGHT, + x * (SQUARE_WIDTH + BORDER_WIDTH), + y * (SQUARE_HEIGHT + BORDER_WIDTH), 1); + + XFreePixmap(win->display, tmpPM); + } else { + XSetFillStyle(win->display, DefaultGC(win->display, 0), + FillSolid); + XSetForeground(win->display, DefaultGC(win->display, 0), + iswhite(win, x, y) ? win->whitesquare.pixel : + win->blacksquare.pixel); + XFillRectangle(win->display, win->boardwin, + DefaultGC(win->display, 0), + x * (SQUARE_WIDTH + BORDER_WIDTH), + y * (SQUARE_HEIGHT + BORDER_WIDTH), + SQUARE_WIDTH, SQUARE_HEIGHT); + } + + if (!record_english) { + gc.foreground = win->textcolor.pixel; + if (iswhite(win, x, y) || win->bnw) + gc.background = win->whitesquare.pixel; + else + gc.background = win->blacksquare.pixel; + + gc.font = win->small->fid; + + XChangeGC(win->display, DefaultGC(win->display, 0), + GCForeground | GCBackground | GCFont, &gc); + + if (!x) { + sprintf(buf, " %d", SIZE - y); + XDrawImageString(win->display, win->boardwin, + DefaultGC(win->display, 0), + 1, (y + 1) * (SQUARE_HEIGHT + + BORDER_WIDTH) - BORDER_WIDTH + + win->small->max_bounds.ascent - 1, buf, 2); + } + if (y == SIZE - 1) { + sprintf(buf, "%c", 'A' + x); + XDrawImageString(win->display, win->boardwin, + DefaultGC(win->display, 0), + x * (SQUARE_WIDTH + BORDER_WIDTH) + 1, + SIZE * (SQUARE_HEIGHT + BORDER_WIDTH) - BORDER_WIDTH + + win->small->max_bounds.ascent - 1, buf, 1); + } + } + + + return; +} + +void +win_flash(m, wnum) + move *m; + color wnum; +{ + windata *win; + int sx, sy, ex, ey, i; + + if (oneboard || (wnum == win1->color)) + win = win1; + else + win = win2; + + if (win->flipped) { + sx = SIZE - m->fromx - 1; + sy = SIZE - m->fromy - 1; + ex = SIZE - m->tox - 1; + ey = SIZE - m->toy - 1; + } else { + sx = m->fromx; + sy = m->fromy; + ex = m->tox; + ey = m->toy; + } + sx = sx * (SQUARE_WIDTH + BORDER_WIDTH) + SQUARE_WIDTH / 2; + sy = sy * (SQUARE_HEIGHT + BORDER_WIDTH) + SQUARE_HEIGHT / 2; + ex = ex * (SQUARE_WIDTH + BORDER_WIDTH) + SQUARE_WIDTH / 2; + ey = ey * (SQUARE_HEIGHT + BORDER_WIDTH) + SQUARE_HEIGHT / 2; + + for (i = 0; i < num_flashes * 2; i++) + XDrawLine(win->display,win->boardwin, + DefaultGC(win->display, 0), + sx, sy, ex, ey); + return; +} + +/* Handle input from the players. */ + +void +win_process(quick) + bool quick; +{ + int i, rfd = 0, wfd = 0, xfd = 0; + struct timeval timeout; + + timeout.tv_sec = 0; + timeout.tv_usec = (quick ? 0 : 500000); + + if (XPending(win1->display)) + service(win1); + if (!oneboard) { + if (XPending(win1->display)) + service(win2); + } + + if (oneboard) + rfd = 1 << win1->display->fd; + else + rfd = (1 << win1->display->fd) | (1 << win2->display->fd); + if (!(i = select(32, &rfd, &wfd, &xfd, &timeout))) + return; + if (i == -1) { + perror("select"); + exit(1); + } + if (rfd & (1 << win1->display->fd)) + service(win1); + if (!oneboard && (rfd & (1 << win2->display->fd))) + service(win2); + + return; +} + +static void +service(win) + windata *win; +{ + XEvent ev; + + while(XPending(win->display)) { + XNextEvent(win->display, &ev); + if (TxtFilter(win->display, &ev)) + continue; + + if (ev.xany.window == win->boardwin) { + switch (ev.type) { + case ButtonPress: + button_pressed(&ev, win); + break; + + case ButtonRelease: + button_released(&ev, win); + break; + + case Expose: + /* Redraw... */ + win_redraw(win, &ev); + break; + + case 0: + case NoExpose: + break; + default: + fprintf(stderr, "Bad event type %d\n", ev.type); + exit(1); + } + } else if (ev.xany.window == win->wclockwin) { + switch (ev.type) { + case Expose: + clock_draw(win, WHITE); + break; + + case 0: + case NoExpose: + break; + default: + fprintf(stderr, "Bad event type %d\n", ev.type); + exit(1); + } + } else if (ev.xany.window == win->bclockwin) { + switch (ev.type) { + case Expose: + clock_draw(win, BLACK); + break; + + case 0: + case NoExpose: + break; + default: + fprintf(stderr, "Bad event type %d\n", ev.type); + exit(1); + } + } else if (ev.xany.window == win->jailwin) { + switch (ev.type) { + case Expose: + jail_draw(win); + break; + + case 0: + case NoExpose: + break; + default: + fprintf(stderr, "Bad event type %d\n", ev.type); + exit(1); + } + } else if (ev.xany.window == win->buttonwin) { + switch (ev.type) { + case ButtonPress: + button_service(win, &ev); + break; + + case Expose: + button_draw(win); + break; + + case 0: + case NoExpose: + break; + default: + fprintf(stderr, "Bad event type %d\n", ev.type); + exit(1); + } + } else if (ev.xany.window == win->icon) { + icon_refresh(win); + } else if (ev.xany.window == win->basewin) { + message_send(win, &ev); + } else { + fprintf(stderr, "Internal Error: service: bad win\n"); + fprintf(stderr, "window = %d, event = %d\n", ev.xany.window, + ev.type); + } + } + return; +} + +void +win_redraw(win, event) + windata *win; + XEvent *event; +{ + XExposeEvent *ev = &event->xexpose; + int x1, y1, x2, y2, i, j; + + drawgrid(win); + if (ev) { + x1 = ev->x / (SQUARE_WIDTH + BORDER_WIDTH); + y1 = ev->y / (SQUARE_HEIGHT + BORDER_WIDTH); + x2 = (ev->x + ev->width) / (SQUARE_WIDTH + BORDER_WIDTH); + y2 = (ev->y + ev->height) / (SQUARE_HEIGHT + BORDER_WIDTH); + } else { + x1 = 0; + y1 = 0; + x2 = SIZE - 1; + y2 = SIZE - 1; + } + + if (x1 < 0) x1 = 0; + if (y1 < 0) y1 = 0; + if (x2 < 0) x2 = 0; + if (y2 < 0) y2 = 0; + if (x1 > SIZE - 1) x1 = SIZE - 1; + if (y1 > SIZE - 1) y1 = SIZE - 1; + if (x2 > SIZE - 1) x2 = SIZE - 1; + if (y2 > SIZE - 1) y2 = SIZE - 1; + + if (win->flipped) { + y1 = SIZE - y2 - 1; + y2 = SIZE - y1 - 1; + x1 = SIZE - x2 - 1; + x2 = SIZE - x1 - 1; + } + + for (i = x1; i <= x2; i++) + for (j = y1; j <= y2; j++) { + if (chessboard->square[j][i].color == NONE) + win_erasepiece(j, i, WHITE); + else + win_drawpiece(&chessboard->square[j][i], j, i, + WHITE); + if (!oneboard) { + if (chessboard->square[j][i].color == NONE) + win_erasepiece(j, i, BLACK); + else + win_drawpiece(&chessboard->square[j][i], + j, i, BLACK); + } + } + + return; +} + +static bool +setup(dispname, win) + char *dispname; + windata *win; +{ + char buf[BSIZE], *s; + Pixmap bm, bmask; + Cursor cur; + extern char *program, *recfile; + + + if (!(win->display = XOpenDisplay(dispname))) + return (false); + + + /* Now get boolean defaults... */ + if ((s = XGetDefault(win->display, program, "noisy")) && eq(s, "on")) + noisyflag = true; + if ((s = XGetDefault(win->display, program, "savemoves")) && eq(s, "on")) + saveflag = true; + if ((s = XGetDefault(win->display, program, "algebraic")) && eq(s, "on")) + record_english = false; + if ((s = XGetDefault(win->display, program, "blackandwhite")) && eq(s, "on")) + bnwflag = true; + if ((s = XGetDefault(win->display, program, "quickrestore")) && eq(s, "on")) + quickflag = true; + if ((s = XGetDefault(win->display, program, "flash")) && eq(s, "on")) + win_flashmove = true; + + /* ... numeric variables ... */ + if (s = XGetDefault(win->display, program, "numflashes")) + num_flashes = atoi(s); + if (s = XGetDefault(win->display, program, "flashsize")) + flash_size = atoi(s); + + /* ... and strings. */ + if (s = XGetDefault(win->display, program, "progname")) + progname = s; + if (s = XGetDefault(win->display, program, "proghost")) + proghost = s; + if (s = XGetDefault(win->display, program, "recordfile")) + recfile = s; + if (s = XGetDefault(win->display, program, "blackpiece")) + black_piece_color = s; + if (s = XGetDefault(win->display, program, "whitepiece")) + white_piece_color = s; + if (s = XGetDefault(win->display, program, "blacksquare")) + black_square_color = s; + if (s = XGetDefault(win->display, program, "whitesquare")) + white_square_color = s; + if (s = XGetDefault(win->display, program, "bordercolor")) + border_color = s; + if (s = XGetDefault(win->display, program, "textcolor")) + text_color = s; + if (s = XGetDefault(win->display, program, "textback")) + text_back = s; + if (s = XGetDefault(win->display, program, "errortext")) + error_text = s; + if (s = XGetDefault(win->display, program, "playertext")) + player_text = s; + if (s = XGetDefault(win->display, program, "cursorcolor")) + cursor_color = s; + + if ((DisplayPlanes(win->display, 0) == 1) || bnwflag) + win->bnw = true; + + /* Allocate colors... */ + if (win->bnw) { + win->blackpiece.pixel = BlackPixel (win->display, 0); + win->whitepiece.pixel = WhitePixel (win->display, 0); + win->blacksquare.pixel = BlackPixel (win->display, 0); + win->whitesquare.pixel = WhitePixel (win->display, 0); + win->border.pixel = BlackPixel (win->display, 0); + win->textcolor.pixel = BlackPixel (win->display, 0); + win->textback.pixel = WhitePixel (win->display, 0); + win->playertext.pixel = BlackPixel (win->display, 0); + win->errortext.pixel = BlackPixel (win->display, 0); + win->cursorcolor.pixel = BlackPixel (win->display, 0) ; + } else { + if (!XParseColor(win->display, + DefaultColormap(win->display, 0), + black_piece_color, &win->blackpiece) || + !XParseColor(win->display, + DefaultColormap(win->display, 0), + white_piece_color, &win->whitepiece) || + !XParseColor(win->display, + DefaultColormap(win->display, 0), + black_square_color, &win->blacksquare) || + !XParseColor(win->display, + DefaultColormap(win->display, 0), + white_square_color, &win->whitesquare) || + !XParseColor(win->display, + DefaultColormap(win->display, 0), + border_color, &win->border) || + !XParseColor(win->display, + DefaultColormap(win->display, 0), + text_color, &win->textcolor) || + !XParseColor(win->display, + DefaultColormap(win->display, 0), + text_back, &win->textback) || + !XParseColor(win->display, + DefaultColormap(win->display, 0), + error_text, &win->errortext) || + !XParseColor(win->display, + DefaultColormap(win->display, 0), + player_text, &win->playertext) || + !XParseColor(win->display, + DefaultColormap(win->display, 0), + cursor_color, &win->cursorcolor) || + !XAllocColor(win->display, + DefaultColormap(win->display, 0), + &win->blackpiece) || + !XAllocColor(win->display, + DefaultColormap(win->display, 0), + &win->whitepiece) || + !XAllocColor(win->display, + DefaultColormap(win->display, 0), + &win->blacksquare) || + !XAllocColor(win->display, + DefaultColormap(win->display, 0), + &win->whitesquare) || + !XAllocColor(win->display, + DefaultColormap(win->display, 0), + &win->border) || + !XAllocColor(win->display, + DefaultColormap(win->display, 0), + &win->textcolor) || + !XAllocColor(win->display, + DefaultColormap(win->display, 0), + &win->textback) || + !XAllocColor(win->display, + DefaultColormap(win->display, 0), + &win->errortext) || + !XAllocColor(win->display, + DefaultColormap(win->display, 0), + &win->playertext) || + !XAllocColor(win->display, + DefaultColormap(win->display, 0), + &win->cursorcolor)) + fprintf(stderr, "Can't get color...\n"); + } + + /* Get fonts... */ + win->small = XLoadQueryFont(win->display,SMALL_FONT); + win->medium = XLoadQueryFont(win->display,MEDIUM_FONT); + win->large = XLoadQueryFont(win->display,LARGE_FONT); + + /* Create the windows... */ + + win->basewin = + XCreateSimpleWindow(win->display,DefaultRootWindow(win->display), + BASE_XPOS, BASE_YPOS, + BASE_WIDTH, BASE_HEIGHT, 0, + BlackPixel(win->display, 0), + WhitePixel(win->display, 0)); + win->boardwin = XCreateSimpleWindow(win->display,win->basewin, + BOARD_XPOS, BOARD_YPOS, + BOARD_WIDTH, BOARD_HEIGHT, + BORDER_WIDTH, + win->border.pixel, + WhitePixel(win->display, 0)); + win->recwin = XCreateSimpleWindow(win->display,win->basewin, + RECORD_XPOS, RECORD_YPOS, + RECORD_WIDTH, RECORD_HEIGHT, + BORDER_WIDTH, win->border.pixel, + win->textback.pixel); + win->jailwin = XCreateSimpleWindow(win->display,win->basewin, + JAIL_XPOS, JAIL_YPOS, + JAIL_WIDTH, JAIL_HEIGHT, + BORDER_WIDTH, + win->border.pixel, + win->textback.pixel); + win->wclockwin = XCreateSimpleWindow(win->display,win->basewin, + WCLOCK_XPOS, WCLOCK_YPOS, + CLOCK_WIDTH, CLOCK_HEIGHT, + BORDER_WIDTH, win->border.pixel, + win->textback.pixel); + win->bclockwin = XCreateSimpleWindow(win->display,win->basewin, + BCLOCK_XPOS, BCLOCK_YPOS, + CLOCK_WIDTH, CLOCK_HEIGHT, + BORDER_WIDTH, win->border.pixel, + win->textback.pixel); + win->messagewin = XCreateSimpleWindow(win->display,win->basewin, + MESS_XPOS, MESS_YPOS, + MESS_WIDTH, MESS_HEIGHT, + BORDER_WIDTH, win->border.pixel, + win->textback.pixel); + win->buttonwin = XCreateSimpleWindow(win->display,win->basewin, + BUTTON_XPOS, BUTTON_YPOS, + BUTTON_WIDTH, BUTTON_HEIGHT, + BORDER_WIDTH, win->border.pixel, + win->textback.pixel); + + /* Let's define an icon... */ + win->iconpixmap = XCreatePixmapFromBitmapData(win->display, + win->basewin, icon_bits, + icon_width, icon_height, + win->blacksquare.pixel, + win->whitesquare.pixel, + 1); + + bm = XCreateBitmapFromData(win->display, + win->basewin, xchess_bits, + xchess_width, xchess_height); + bmask = XCreateBitmapFromData(win->display, + win->basewin, xchess_mask_bits, + xchess_width, xchess_height); + cur = XCreatePixmapCursor(win->display, bm, bmask, + &win->cursorcolor, + &WhitePixel(win->display, 0), + xchess_x_hot, xchess_y_hot); + XFreePixmap(win->display, bm); + XFreePixmap(win->display, bmask); + + XDefineCursor(win->display,win->basewin, cur); + + XMapSubwindows(win->display,win->basewin); + XMapRaised(win->display,win->basewin); + + XSelectInput(win->display,win->basewin, KeyPressMask); + XSelectInput(win->display,win->boardwin, + ButtonPressMask | ButtonReleaseMask | ExposureMask); + XSelectInput(win->display,win->recwin, + ButtonReleaseMask | ExposureMask); + XSelectInput(win->display,win->jailwin, ExposureMask); + XSelectInput(win->display,win->wclockwin, ExposureMask); + XSelectInput(win->display,win->bclockwin, ExposureMask); + XSelectInput(win->display,win->messagewin, + ButtonReleaseMask | ExposureMask); + XSelectInput(win->display,win->buttonwin, + ButtonPressMask | ExposureMask); + + message_init(win); + record_init(win); + button_draw(win); + jail_init(win); + clock_init(win, WHITE); + clock_init(win, BLACK); + if (timeunit) { + if (timeunit > 1800) + sprintf(buf, "%d moves every %.2lg hours.\n", + movesperunit, ((double) timeunit) / 3600); + else if (timeunit > 30) + sprintf(buf, "%d moves every %.2lg minutes.\n", + movesperunit, ((double) timeunit) / 60); + else + sprintf(buf, "%d moves every %d seconds.\n", + movesperunit, timeunit); + message_add(win, buf, false); + } + + return (true); +} + +static void +drawgrid(win) + windata *win; +{ + int i; + XGCValues gc; + + gc.function = GXcopy; + gc.plane_mask = AllPlanes; + gc.foreground = win->border.pixel; + gc.line_width = 0; + gc.line_style = LineSolid; + + XChangeGC(win->display, + DefaultGC(win->display, 0), + GCFunction | GCPlaneMask | GCForeground | + GCLineWidth | GCLineStyle, &gc); + + /* Draw the lines... horizontal, */ + for (i = 1; i < SIZE; i++) + XDrawLine(win->display, win->boardwin, + DefaultGC(win->display, 0), 0, + i * (SQUARE_WIDTH + BORDER_WIDTH) - + BORDER_WIDTH / 2, + SIZE * (SQUARE_WIDTH + BORDER_WIDTH), + i * (SQUARE_WIDTH + BORDER_WIDTH) - + BORDER_WIDTH / 2); + + /* and vertical... */ + for (i = 1; i < SIZE; i++) + XDrawLine(win->display, win->boardwin, + DefaultGC(win->display, 0), + i * (SQUARE_WIDTH + BORDER_WIDTH) - + BORDER_WIDTH / 2, 0, + i * (SQUARE_WIDTH + BORDER_WIDTH) - + BORDER_WIDTH / 2, + SIZE * (SQUARE_WIDTH + BORDER_WIDTH)); + return; +} + +void +win_restart() +{ + win1->flipped = false; + win_redraw(win1, (XEvent *) NULL); + if (!oneboard) { + win2->flipped = true; + win_redraw(win2, (XEvent *) NULL); + } + return; +} + +static void +icon_refresh(win) + windata *win; +{ + XCopyArea(win->display, win->iconpixmap, win->icon, + DefaultGC(win->display, 0), + 0, 0, icon_width, icon_height, 0, 0); + return; +} + diff --git a/gnu/games/chess/Xchess/xchess.1 b/gnu/games/chess/Xchess/xchess.1 new file mode 100644 index 0000000..e687513 --- /dev/null +++ b/gnu/games/chess/Xchess/xchess.1 @@ -0,0 +1,217 @@ + +.TH XCHESS 1 "14 Nov 1986" "X Version 10" +.SH NAME +xchess \- X chess display +.SH SYNOPSIS +.B xchess +[ option ... ] [ white-display ] [ black-display ] +.SH DESCRIPTION +.PP +.B xchess +is a chess display program which allows players to play a game on either +one or two displays, or play a chess-playing program. It uses the +.B X +window system. If one or no display names are given, it will open up one +window and both black and white at the same board. If two displays are +given, +.B xchess +will accept moves from each player in his turn. Black's board will be drawn +with his pieces at the bottom. +.PP +.B xchess +will not allow a player to make an illegal move. It accepts all legal moves, +including castling and pawn capture \fIen passant\fR. +.SH OPTIONS +.TP 8 +.B -d +Turn on debugging. +.TP 8 +.B -f record-file +Use \fBrecord-file\fR for saving the game when the \fBSave\fR button is +selected, or if the \fB-s\fR flag is given. The default is "xchess.game". +.TP 8 +.B -r saved-game +Start with the position at the end of the saved game in the named file. +This file may be the result of the \fBSave\fR command, and may be in +either English or International format. When reading moves, one move +it made per second. +.TP 8 +.B -q +Don't pause for a second every time a move is made when a game is being +restored. +.TP 8 +.B -v +Whenever a piece is moved, outline the path with a "lightning bolt". +This option and the \fB-n\fR option are useful if you don't want to miss +an opponent's move when he makes it. +.TP 8 +.B -i +Use International format for recording moves (squares numbered 1-8, a-h) +as opposed to English (e.g, \fIp/k4xp/q5\fR). +.TP 8 +.B -t moves/timeunit +Allows \fBtimeunit\fR seconds for every \fBmoves\fR moves. If either player +exceeds this allowance both recieve a message saying informing them of +this fact. +.TP 8 +.B -c +Play the computer. +.B xchess +will start up a chess-playing program (currently the only one it knows +how to talk to is \fBGNU Chess\fR). +.TP 8 +.B -p program +The name of the program to use if the \fB-c\fR option is given. The +default is "/usr/public/gnuchess". Note that \fBgnuchess\fR must be +compiled with the \fIcompat\fR flag (in the file "main.c") set to 1. +.TP 8 +.B -b +If the \fB-c\fR flag was given, have the computer play white. +.TP 8 +.B -bnw +If the display has more than one display plane (i.e, is color), pretend +it's black and white. +.TP 8 +.B -s +Save the moves in the record file as they are made. This is useful if +you don't want your game to be lost when \fBxchess\fR core dumps. +.TP 8 +.B -n +Be noisy \- beep after every move is made. +.TP 8 +.B -h host +Run GNU Chess on the specified \fBhost\fR. +.TP 8 +.B -R +Randomly chose who plays white and who plays black, if two displays are +given. +.SH CONTROLS +.PP +The window is divided up into several sub-windows. The pieces are moved by +pushing down any mouse button on top of the piece, moving to the destination +square, and releasing it. Castling is done by moving the king to the +right square. If you push down on a piece and then let the button +up without moving it, you must move that piece. ("Touch it, move it.") +.PP +The progress of the game is listed in the "Game Record" window. Error +messages and such things are printed in the "Message" window. Both these +windows have scroll bars that you can use to move around. +There are also windows for clocks and for a record of the pieces captured. +.PP +If you type any keys in the window, the text will go into the message +window of both players. This provides a simple communication facility. +.PP +There are 9 buttons in the control window. They are as follows: +.TP 8 +.B Draw +Both players must push this button to agree on a draw (just one is ok +if only one display is being used). +.TP 8 +.B Resign +The player whose turn it is to move resigns. +.TP 8 +.B Reset +Start over from the beginning. +.TP 8 +.B Back +Retract a move. If two displays are being used the other player will be +asked to confirm this. +.TP 8 +.B Fwd +This will re-play the most recently retracted move. This button in conjunction +with \fBBack\fR is useful for "scrolling around" in a saved game. +.TP 8 +.B Save +Save the game in the record file. +.TP 8 +.B Flip +Rotate the board so that Black will have his pieces at the bottom. +.TP 8 +.B Switch +Change the mapping of boards to players. +.TP 8 +.B Pause +This button has two functions. When a game is being restored, pieces will +be moved once a second. Hitting \fBPause\fR will stop this process, and +hitting it again will restart it. During the time that it is stopped no +other action can be made except restarting it. While a game is being played, +\fBPause\fR will stop the clock and restart it. +.SH DEFAULTS +.PP +\fBxchess\fR uses the following \fI.Xdefaults\fR: +.TP 8 +.B Noisy +The -n flag. +.TP 8 +.B SaveMoves +The -s flag. +.TP 8 +.B Algebraic +The -i flag. +.TP 8 +.B BlackAndWhite +The -bnw flag. +.TP 8 +.B QuickRestore +The -q flag. +.TP 8 +.B Flash +The -v flag. +.TP 8 +.B NumFlashes +How many times to flash the move. The default is 5. +.TP 8 +.B FlashWidth +How big to make the lightning bolt. The default is 10 pixels. +.TP 8 +.B ProgName +The -p option. This may also be changed in the Makefile (-DDEF_PROG_NAME). +.TP 8 +.B ProgHost +The -h option. +.TP 8 +.B RecordFile +The -f option. +.TP 8 +.B BlackPiece +The color of the black pieces. +.TP 8 +.B WhitePiece +The color of the white pieces. +.TP 8 +.B BorderColor +The color of the borders. +.TP 8 +.B BlackSquare +The color of the black squares. +.TP 8 +.B WhiteSquare +The color of the white squares. +.TP 8 +.B TextColor +The color of routine messages and the move record text. +.TP 8 +.B ErrorText +The color of error messages. +.TP 8 +.B PlayerText +The color of player-entered text. +.TP 8 +.B TextBack +The background color for the two text windows. +.TP 8 +.B CursorColor +The color of the mouse and the text cursors. +.SH "SEE ALSO" +X(8), gnuchess(1), chess(5) +.SH AUTHOR +Wayne A. Christopher (faustus@ic.berkeley.edu) +.SH BUGS +.PP +Checkmate and stalemate are not detected, so the appropriate player must resign +or agree to a draw respectively. +.PP +\fBSwitch\fR doesn't work. +.PP +If you are playing \fBgnuchess\fR, and you select Undo a few times so that it +is \fBgnuchess\fR's turn to move, it won't do anything. diff --git a/gnu/games/chess/Xchess/xchess.c b/gnu/games/chess/Xchess/xchess.c new file mode 100644 index 0000000..6de6502 --- /dev/null +++ b/gnu/games/chess/Xchess/xchess.c @@ -0,0 +1,205 @@ + +/* This file contains code for X-CHESS. + Copyright (C) 1986 Free Software Foundation, Inc. + +This file is part of X-CHESS. + +X-CHESS is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY. No author or distributor +accepts responsibility to anyone for the consequences of using it +or for whether it serves any particular purpose or works at all, +unless he says so in writing. Refer to the X-CHESS General Public +License for full details. + +Everyone is granted permission to copy, modify and redistribute +X-CHESS, but only under the conditions described in the +X-CHESS General Public License. A copy of this license is +supposed to have been given to you along with X-CHESS so you +can know your rights and responsibilities. It should be in a +file named COPYING. Among other things, the copyright notice +and this notice must be preserved on all copies. */ + + +/* RCS Info: $Revision: 1.2 $ on $Date: 89/04/28 08:44:02 $ + * $Source: /usr/local/src/source/X.V11R3/contrib/games/xchess/Xchess/RCS/xchess.c,v $ + * Copyright (c) 1986 Wayne A. Christopher, U. C. Berkeley CAD Group + * Permission is granted to do anything with this code except sell it + * or remove this message. + */ + +#define USAGE "xchess [ -d ] [ -f recordfile ] [ -r savedfile ] [ -i ]\n\ +\t[ -t moves/timeunit ] [ -c ] [ -p program ] [ -b ] [ -bnw ] [ -s ]\n\ +\t[ -n ] [ -h host ] [ -v ] [ -R ] [ whitedisplay ] [ blackdisplay ]" + +#include <signal.h> +#include "xchess.h" + +bool debug = false; +bool oneboard = false; +bool bnwflag = false; +bool progflag = false; +bool blackflag = false; +bool quickflag = false; + +char *progname = DEF_PROGRAM; +char *proghost = NULL; +char *piecenames[] = { "pawn", "rook", "knight", "bishop", "queen", "king" } ; +char *colornames[] = { "white", "black", "none" } ; +char *movetypenames[] = { "move", "qcastle", "kcastle", "capture" } ; +char *dispname1 = NULL, *dispname2 = NULL; + +char *black_piece_color = BLACK_PIECE_COLOR; +char *white_piece_color = WHITE_PIECE_COLOR; +char *black_square_color = BLACK_SQUARE_COLOR; +char *white_square_color = WHITE_SQUARE_COLOR; +char *border_color = BORDER_COLOR; +char *text_color = TEXT_COLOR; +char *text_back = TEXT_BACK; +char *error_text = ERROR_TEXT; +char *player_text = PLAYER_TEXT; +char *cursor_color = CURSOR_COLOR; + +int num_flashes = NUM_FLASHES; +int flash_size = FLASH_SIZE; +char *program; +char *recfile = NULL; + +#ifdef notdef +/* + * Serves no purpose. + */ +die () { +fprintf(stderr, "child proc changed status?!\n"); +} +#endif + +void +main(ac, av) + char **av; +{ + bool randflag = false; + move *m; + char *s; + + program = av[0]; + +#ifdef notdef + signal(SIGCHLD, die); +#endif + + /* Process args. */ + av++; ac--; + while (ac > 0 && **av == '-') { + if (eq(*av, "-d")) { + debug = true; + } else if (eq(*av, "-f")) { + av++; ac--; + if (*av) + record_file = *av; + else + goto usage; + } else if (eq(*av, "-r")) { + av++; ac--; + if (*av) + recfile = *av; + else + goto usage; + } else if (eq(*av, "-i")) { + record_english = false; + } else if (eq(*av, "-R")) { + randflag = true; + } else if (eq(*av, "-v")) { + win_flashmove = true; + } else if (eq(*av, "-q")) { + quickflag = true; + } else if (eq(*av, "-t")) { + av++; ac--; + if (*av) { + movesperunit = atoi(*av); + if (s = index(*av, '/')) + timeunit = atoi(s + 1) * 60; + else + timeunit = 60; + } else + goto usage; + } else if (eq(*av, "-p")) { + av++; ac--; + if (*av) + progname = *av; + else + goto usage; + } else if (eq(*av, "-h")) { + av++; ac--; + if (*av) + proghost = *av; + else + goto usage; + } else if (eq(*av, "-b")) { + blackflag = true; + } else if (eq(*av, "-c")) { + progflag = true; + } else if (eq(*av, "-bnw")) { + bnwflag = true; + } else if (eq(*av, "-s")) { + saveflag = true; + } else if (eq(*av, "-n")) { + noisyflag = true; + } else + goto usage; + av++; ac--; + } + if (ac > 0) + dispname1 = av[0]; + if (ac > 1) + dispname2 = av[1]; + if (ac > 2) + goto usage; + + if (!dispname2) + oneboard = true; + + srandom(getpid()); + + if (!oneboard && randflag && (random() % 2)) { + s = dispname1; + dispname1 = dispname2; + dispname2 = s; + } + + if (!dispname1) + dispname1 = getenv("DISPLAY"); + + /* Set up the board. */ + board_setup(); + + /* Create the windows. */ + win_setup(dispname1, dispname2); + + board_drawall(); + + /* Start the program if necessary. */ + if (progflag) + if (!program_init(progname)) + exit(1); + + if (recfile) + load_game(recfile); + + /* Go into a loop of prompting players alternately for moves, checking + * them, and updating things. + */ + for (;;) { + win_process(false); + clock_update(); + if (progflag && ((!blackflag && (nexttomove == BLACK)) || + (blackflag && (nexttomove == WHITE)))) { + m = program_get(); + if (m) + prog_move(m); + } + } + +usage: fprintf(stderr, "Usage: %s\n", USAGE); + exit(1); +} + diff --git a/gnu/games/chess/Xchess/xchess.c.150 b/gnu/games/chess/Xchess/xchess.c.150 new file mode 100644 index 0000000..2c17906 --- /dev/null +++ b/gnu/games/chess/Xchess/xchess.c.150 @@ -0,0 +1,197 @@ + +/* This file contains code for X-CHESS. + Copyright (C) 1986 Free Software Foundation, Inc. + +This file is part of X-CHESS. + +X-CHESS is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY. No author or distributor +accepts responsibility to anyone for the consequences of using it +or for whether it serves any particular purpose or works at all, +unless he says so in writing. Refer to the X-CHESS General Public +License for full details. + +Everyone is granted permission to copy, modify and redistribute +X-CHESS, but only under the conditions described in the +X-CHESS General Public License. A copy of this license is +supposed to have been given to you along with X-CHESS so you +can know your rights and responsibilities. It should be in a +file named COPYING. Among other things, the copyright notice +and this notice must be preserved on all copies. */ + + +/* RCS Info: $Revision: 1.5 $ on $Date: 86/11/26 12:11:32 $ + * $Source: /users/faustus/xchess/RCS/xchess.c,v $ + * Copyright (c) 1986 Wayne A. Christopher, U. C. Berkeley CAD Group + * Permission is granted to do anything with this code except sell it + * or remove this message. + */ + +#define USAGE "xchess [ -d ] [ -f recordfile ] [ -r savedfile ] [ -i ]\n\ +\t[ -t moves/timeunit ] [ -c ] [ -p program ] [ -b ] [ -bnw ] [ -s ]\n\ +\t[ -n ] [ -h host ] [ -v ] [ -R ] [ whitedisplay ] [ blackdisplay ]" + +#include <signal.h> +#include "xchess.h" + +bool debug = false; +bool oneboard = false; +bool bnwflag = false; +bool progflag = false; +bool blackflag = false; +bool quickflag = false; + +char *progname = DEF_PROGRAM; +char *proghost = NULL; +char *piecenames[] = { "pawn", "rook", "knight", "bishop", "queen", "king" } ; +char *colornames[] = { "white", "black", "none" } ; +char *movetypenames[] = { "move", "qcastle", "kcastle", "capture" } ; +char *dispname1 = NULL, *dispname2 = NULL; + +char *black_piece_color = BLACK_PIECE_COLOR; +char *white_piece_color = WHITE_PIECE_COLOR; +char *black_square_color = BLACK_SQUARE_COLOR; +char *white_square_color = WHITE_SQUARE_COLOR; +char *border_color = BORDER_COLOR; +char *text_color = TEXT_COLOR; +char *text_back = TEXT_BACK; +char *error_text = ERROR_TEXT; +char *player_text = PLAYER_TEXT; +char *cursor_color = CURSOR_COLOR; + +int num_flashes = NUM_FLASHES; +int flash_size = FLASH_SIZE; +char *program; +char *recfile = NULL; + +die () { +fprintf(stderr, "child proc changed status?!\n"); +} + +void +main(ac, av) + char **av; +{ + bool randflag = false; + move *m; + char *s; + + program = av[0]; + + signal(SIGCHLD, die); + /* Process args. */ + av++; ac--; + while (ac > 0 && **av == '-') { + if (eq(*av, "-d")) { + debug = true; + } else if (eq(*av, "-f")) { + av++; ac--; + if (*av) + record_file = *av; + else + goto usage; + } else if (eq(*av, "-r")) { + av++; ac--; + if (*av) + recfile = *av; + else + goto usage; + } else if (eq(*av, "-i")) { + record_english = false; + } else if (eq(*av, "-R")) { + randflag = true; + } else if (eq(*av, "-v")) { + win_flashmove = true; + } else if (eq(*av, "-q")) { + quickflag = true; + } else if (eq(*av, "-t")) { + av++; ac--; + if (*av) { + movesperunit = atoi(*av); + if (s = index(*av, '/')) + timeunit = atoi(s + 1) * 60; + else + timeunit = 60; + } else + goto usage; + } else if (eq(*av, "-p")) { + av++; ac--; + if (*av) + progname = *av; + else + goto usage; + } else if (eq(*av, "-h")) { + av++; ac--; + if (*av) + proghost = *av; + else + goto usage; + } else if (eq(*av, "-b")) { + blackflag = true; + } else if (eq(*av, "-c")) { + progflag = true; + } else if (eq(*av, "-bnw")) { + bnwflag = true; + } else if (eq(*av, "-s")) { + saveflag = true; + } else if (eq(*av, "-n")) { + noisyflag = true; + } else + goto usage; + av++; ac--; + } + if (ac > 0) + dispname1 = av[0]; + if (ac > 1) + dispname2 = av[1]; + if (ac > 2) + goto usage; + + if (!dispname2) + oneboard = true; + + srandom(getpid()); + + if (!oneboard && randflag && (random() % 2)) { + s = dispname1; + dispname1 = dispname2; + dispname2 = s; + } + + if (!dispname1) + dispname1 = getenv("DISPLAY"); + + /* Set up the board. */ + board_setup(); + + /* Create the windows. */ + win_setup(dispname1, dispname2); + + board_drawall(); + + /* Start the program if necessary. */ + if (progflag) + if (!program_init(progname)) + exit(1); + + if (recfile) + load_game(recfile); + + /* Go into a loop of prompting players alternately for moves, checking + * them, and updating things. + */ + for (;;) { + win_process(false); + clock_update(); + if (progflag && ((!blackflag && (nexttomove == BLACK)) || + (blackflag && (nexttomove == WHITE)))) { + m = program_get(); + if (m) + prog_move(m); + } + } + +usage: fprintf(stderr, "Usage: %s\n", USAGE); + exit(1); +} + diff --git a/gnu/games/chess/Xchess/xchess.cur b/gnu/games/chess/Xchess/xchess.cur new file mode 100644 index 0000000..ef3750d --- /dev/null +++ b/gnu/games/chess/Xchess/xchess.cur @@ -0,0 +1,9 @@ + +#define xchess_width 16 +#define xchess_height 16 +#define xchess_x_hot 9 +#define xchess_y_hot 8 +static char xchess_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0xf8, 0x00, 0xfe, 0x80, 0xff, + 0xc0, 0xff, 0x60, 0xff, 0xb0, 0xfd, 0xd8, 0x66, 0x6c, 0x3b, 0x76, 0x1d, + 0x98, 0x1d, 0xcc, 0x0c, 0x60, 0x00, 0x00, 0x00}; diff --git a/gnu/games/chess/Xchess/xchess.game b/gnu/games/chess/Xchess/xchess.game new file mode 100644 index 0000000..2302334 --- /dev/null +++ b/gnu/games/chess/Xchess/xchess.game @@ -0,0 +1,8 @@ + +X Chess -- Sun Sep 18 18:01:17 EDT 1988 + Game played on pitcairn:0 + english + 1. P/kb2-kb4 P/k2-k3 + 2. P/k2-k4 +Draw agreed. +Time: white: 6s, black: 43s diff --git a/gnu/games/chess/Xchess/xchess.h b/gnu/games/chess/Xchess/xchess.h new file mode 100644 index 0000000..355731d --- /dev/null +++ b/gnu/games/chess/Xchess/xchess.h @@ -0,0 +1,301 @@ + +/* This file contains code for X-CHESS. + Copyright (C) 1986 Free Software Foundation, Inc. + +This file is part of X-CHESS. + +X-CHESS is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY. No author or distributor +accepts responsibility to anyone for the consequences of using it +or for whether it serves any particular purpose or works at all, +unless he says so in writing. Refer to the X-CHESS General Public +License for full details. + +Everyone is granted permission to copy, modify and redistribute +X-CHESS, but only under the conditions described in the +X-CHESS General Public License. A copy of this license is +supposed to have been given to you along with X-CHESS so you +can know your rights and responsibilities. It should be in a +file named COPYING. Among other things, the copyright notice +and this notice must be preserved on all copies. */ + + +/* RCS Info: $Revision: 1.5 $ on $Date: 86/11/26 12:11:39 $ + * $Source: /users/faustus/xchess/RCS/xchess.h,v $ + * Copyright (c) 1986 Wayne A. Christopher, U. C. Berkeley CAD Group + * Permission is granted to do anything with this code except sell it + * or remove this message. + * + * Definitions for the X chess program. + */ + +#include "std.h" +#include <X11/Xlib.h> +#include "scrollText/scrollText.h" + +#define SIZE 8 + +typedef enum piecetype { PAWN, ROOK, KNIGHT, BISHOP, QUEEN, KING } piecetype; +typedef enum movetype { MOVE, QCASTLE, KCASTLE, CAPTURE } movetype; +typedef enum color { WHITE, BLACK, NONE } color; + +typedef struct piece { + enum piecetype type; + enum color color; +} piece; + +/* The board has y=0 and black at the top... This probably isn't the best + * place to keep track of who can castle, but it's part of the game state... + */ + +typedef struct board { + piece square[SIZE][SIZE]; + bool white_cant_castle_k; + bool white_cant_castle_q; + bool black_cant_castle_k; + bool black_cant_castle_q; +} board; + +typedef struct move { + movetype type; + piece piece; + piece taken; + int fromx, fromy; + int tox, toy; + struct move *next; + bool enpassant; + bool check; +} move; + +#define iswhite(win, i, j) (!(((i) + (j)) % 2)) + +/* Stuff for the display. */ + +typedef struct windata { + Display *display; + Window basewin; + Window boardwin; + Window recwin; + Window wclockwin; + Window bclockwin; + Window messagewin; + Window buttonwin; + Window jailwin; + Window icon; + Pixmap iconpixmap; + XColor blackpiece; + XColor whitepiece; + XColor blacksquare; + XColor whitesquare; + XColor border; + XColor textcolor; + XColor textback; + XColor errortext; + XColor playertext; + XColor cursorcolor; + XFontStruct *small; + XFontStruct *medium; + XFontStruct *large; + bool bnw; + color color; + bool flipped; + double whitehands[3]; + double blackhands[3]; + char *txtassoc; +} windata; + +#define SMALL_FONT "6x10" +#define MEDIUM_FONT "8x13" +#define LARGE_FONT "9x15" +#define JAIL_FONT "6x10" + +#define SQUARE_WIDTH 80 +#define SQUARE_HEIGHT 80 + +#define BORDER_WIDTH 3 + +#define BOARD_WIDTH 8 * SQUARE_WIDTH + 7 * BORDER_WIDTH +#define BOARD_HEIGHT 8 * SQUARE_HEIGHT + 7 * BORDER_WIDTH +#define BOARD_XPOS 0 +#define BOARD_YPOS 0 + +#define RECORD_WIDTH 265 /* 40 chars * 6 pixels / character. */ +#define RECORD_HEIGHT 433 +#define RECORD_XPOS BOARD_WIDTH + BORDER_WIDTH +#define RECORD_YPOS 0 + +#define JAIL_WIDTH RECORD_WIDTH +#define JAIL_HEIGHT 163 +#define JAIL_XPOS RECORD_XPOS +#define JAIL_YPOS RECORD_YPOS + RECORD_HEIGHT + BORDER_WIDTH + +#define CLOCK_WIDTH 131 +#define CLOCK_HEIGHT 131 + BORDER_WIDTH + 20 +#define WCLOCK_XPOS RECORD_XPOS +#define WCLOCK_YPOS RECORD_HEIGHT + JAIL_HEIGHT + BORDER_WIDTH * 2 +#define BCLOCK_XPOS WCLOCK_XPOS + CLOCK_WIDTH + BORDER_WIDTH +#define BCLOCK_YPOS WCLOCK_YPOS + +#define MESS_WIDTH 329 +#define MESS_HEIGHT 92 +#define MESS_XPOS 0 +#define MESS_YPOS BOARD_HEIGHT + BORDER_WIDTH + +#define BUTTON_WIDTH MESS_WIDTH +#define BUTTON_HEIGHT MESS_HEIGHT +#define BUTTON_XPOS MESS_WIDTH + BORDER_WIDTH +#define BUTTON_YPOS MESS_YPOS + +#define BASE_WIDTH BOARD_WIDTH + RECORD_WIDTH + BORDER_WIDTH * 3 +#define BASE_HEIGHT BOARD_HEIGHT + MESS_HEIGHT + BORDER_WIDTH * 3 + +#define BASE_XPOS 50 +#define BASE_YPOS 50 + +#define BLACK_PIECE_COLOR "#202020" +#define WHITE_PIECE_COLOR "#FFFFCC" +#define BLACK_SQUARE_COLOR "#77A26D" +#define WHITE_SQUARE_COLOR "#C8C365" +#define BORDER_COLOR "#902E39" +#define TEXT_COLOR "#006D6D" +#define TEXT_BACK "#FFFFDD" +#define ERROR_TEXT "Red" +#define PLAYER_TEXT "Blue" +#define CURSOR_COLOR "#FF606F" + +#define DEF_RECORD_FILE "xchess.game" + +#define NUM_FLASHES 5 +#define FLASH_SIZE 10 + +/* xchess.c */ + +extern void main(); +extern bool debug; +extern char *progname; +extern char *proghost; +extern char *piecenames[]; +extern char *colornames[]; +extern char *movetypenames[]; +extern char *dispname1, *dispname2; +extern bool oneboard; +extern bool bnwflag; +extern bool progflag; +extern bool blackflag; +extern bool quickflag; +extern int num_flashes; +extern int flash_size; +extern char *black_piece_color; +extern char *white_piece_color; +extern char *black_square_color; +extern char *white_square_color; +extern char *border_color; +extern char *text_color; +extern char *text_back; +extern char *error_text; +extern char *player_text; +extern char *cursor_color; + +/* board.c */ + +extern void board_setup(); +extern void board_drawall(); +extern void board_move(); +extern board *chessboard; +extern void board_init(); + +/* window.c */ + +extern bool win_setup(); +extern void win_redraw(); +extern void win_restart(); +extern void win_drawboard(); +extern void win_drawpiece(); +extern void win_erasepiece(); +extern void win_process(); +extern void win_flash(); +extern windata *win1, *win2; +extern bool win_flashmove; + +/* control.c */ + +extern void button_pressed(); +extern void button_released(); +extern void move_piece(); +extern void prog_move(); +extern move *moves; +extern move *foremoves; +extern color nexttomove; +extern void replay(); +extern void forward(); +extern void cleanup(); +extern void restart(); +extern bool noisyflag; + +/* valid.c */ + +extern bool valid_move(); + +/* record.c */ + +extern void record_move(); +extern void record_reset(); +extern void record_save(); +extern void record_back(); +extern void record_init(); +extern void record_end(); +extern bool record_english; +extern char *record_file; +extern int movenum; +extern bool saveflag; + +/* message.c */ + +extern void message_init(); +extern void message_add(); +extern void message_send(); + +/* clock.c */ + +extern void clock_init(); +extern void clock_draw(); +extern void clock_update(); +extern void clock_switch(); +extern bool clock_started; +extern int movesperunit; +extern int timeunit; +extern int whiteseconds; +extern int blackseconds; + +/* button.c */ + +extern void button_draw(); +extern void button_service(); + +/* jail.c */ + +extern void jail_init(); +extern void jail_draw(); +extern void jail_add(); +extern void jail_remove(); + +/* program.c */ +extern bool program_init(); +extern void program_end(); +extern void program_send(); +extern void program_undo(); +extern move *program_get(); + +/* parse.c */ + +extern void load_game(); +extern move *parse_file(); +extern move *parse_move(); +extern move *parse_imove(); +extern bool loading_flag; +extern bool loading_paused; + +/* popup.c */ + +extern bool pop_question(); + diff --git a/gnu/games/chess/Xchess/xchess.icon b/gnu/games/chess/Xchess/xchess.icon new file mode 100644 index 0000000..78c68f1 --- /dev/null +++ b/gnu/games/chess/Xchess/xchess.icon @@ -0,0 +1,28 @@ + +#define icon_width 48 +#define icon_height 48 +static char icon_bits[] = { + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x80, + 0xc1, 0xff, 0xff, 0xff, 0xff, 0x83, 0x41, 0x00, 0x00, 0x00, 0x00, 0x82, + 0x41, 0xf0, 0xf0, 0xf0, 0xf0, 0x82, 0x41, 0xf0, 0xf0, 0xf0, 0xf0, 0x82, + 0x41, 0xf0, 0xf0, 0xf0, 0xf0, 0x82, 0x41, 0xf0, 0xf0, 0xf0, 0xf0, 0x82, + 0x41, 0x0f, 0x0f, 0x0f, 0x0f, 0x82, 0x41, 0x0f, 0x0f, 0x0f, 0x0f, 0x82, + 0x41, 0x0f, 0x0f, 0x0f, 0x0f, 0x82, 0x41, 0x0f, 0x0f, 0x0f, 0x0f, 0x82, + 0x41, 0xf0, 0xf0, 0xf0, 0xf0, 0x82, 0x41, 0xf0, 0xf0, 0xf0, 0xf0, 0x82, + 0x41, 0xf0, 0xf0, 0xf0, 0xf0, 0x82, 0x41, 0xf0, 0xf0, 0xf0, 0xf0, 0x82, + 0x41, 0x0f, 0x0f, 0x0f, 0x0f, 0x82, 0x41, 0x0f, 0x0f, 0x0f, 0x0f, 0x82, + 0x41, 0x0f, 0x0f, 0x0f, 0x0f, 0x82, 0x41, 0x0f, 0x0f, 0x0f, 0x0f, 0x82, + 0x41, 0xf0, 0xf0, 0xf0, 0xf0, 0x82, 0x41, 0xf0, 0xf0, 0xf0, 0xf0, 0x82, + 0x41, 0xf0, 0xf0, 0xf0, 0xf0, 0x82, 0x41, 0xf0, 0xf0, 0xf0, 0xf0, 0x82, + 0x41, 0x0f, 0x0f, 0x0f, 0x0f, 0x82, 0x41, 0x0f, 0x0f, 0x0f, 0x0f, 0x82, + 0x41, 0x0f, 0x0f, 0x0f, 0x0f, 0x82, 0x41, 0x0f, 0x0f, 0x0f, 0x0f, 0x82, + 0x41, 0xf0, 0xf0, 0xf0, 0xf0, 0x82, 0x41, 0xf0, 0xf0, 0xf0, 0xf0, 0x82, + 0x41, 0xf0, 0xf0, 0xf0, 0xf0, 0x82, 0x41, 0xf0, 0xf0, 0xf0, 0xf0, 0x82, + 0x41, 0x0f, 0x0f, 0x0f, 0x0f, 0x82, 0x41, 0x0f, 0x0f, 0x0f, 0x0f, 0x82, + 0x41, 0x0f, 0x0f, 0x0f, 0x0f, 0x82, 0x41, 0x0f, 0x0f, 0x0f, 0x0f, 0x82, + 0x41, 0x00, 0x00, 0x00, 0x00, 0x82, 0xc1, 0xff, 0xff, 0xff, 0xff, 0x83, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x80, 0x41, 0xc4, 0x89, 0x3c, 0xcf, 0x83, + 0x41, 0x24, 0x88, 0x04, 0x41, 0x80, 0x81, 0x22, 0x88, 0x04, 0x41, 0x80, + 0x01, 0x21, 0xf8, 0x1c, 0xcf, 0x83, 0x81, 0x22, 0x88, 0x04, 0x08, 0x82, + 0x41, 0x24, 0x88, 0x04, 0x08, 0x82, 0x41, 0xc4, 0x89, 0x3c, 0xcf, 0x83, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; diff --git a/gnu/games/chess/Xchess/xchess_mask.cur b/gnu/games/chess/Xchess/xchess_mask.cur new file mode 100644 index 0000000..6408b7e --- /dev/null +++ b/gnu/games/chess/Xchess/xchess_mask.cur @@ -0,0 +1,7 @@ + +#define xchess_mask_width 16 +#define xchess_mask_height 16 +static char xchess_mask_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0xf8, 0x00, 0xfe, 0x80, 0xff, + 0xc0, 0xff, 0x60, 0xff, 0xb0, 0xfd, 0xd8, 0x66, 0x6c, 0x3b, 0x76, 0x1d, + 0x98, 0x1d, 0xcc, 0x0c, 0x60, 0x00, 0x00, 0x00}; diff --git a/gnu/games/chess/gnuchess.book b/gnu/games/chess/gnuchess.book new file mode 100644 index 0000000..7e8a3b5 --- /dev/null +++ b/gnu/games/chess/gnuchess.book @@ -0,0 +1,3878 @@ +! +! Opening Library for CHESS +! +! Copyright (C) 1986, 1987, 1988 Free Software Foundation, Inc. +! Copyright (c) 1987 by Stuart Cracraft and John Stanback +! +! This file is part of CHESS. +! +! CHESS is distributed in the hope that it will be useful, +! but WITHOUT ANY WARRANTY. No author or distributor +! accepts responsibility to anyone for the consequences of using it +! or for whether it serves any particular purpose or works at all, +! unless he says so in writing. Refer to the CHESS General Public +! License for full details. +! +! Everyone is granted permission to copy, modify and redistribute +! CHESS, but only under the conditions described in the +! CHESS General Public License. A copy of this license is +! supposed to have been given to you along with CHESS so you +! can know your rights and responsibilities. It should be in a +! file named COPYING. Among other things, the copyright notice +! and this notice must be preserved on all copies. +! +! +! +! Four Knight's Game +e2e4 e7e5 +g1f3 b8c6 +b1c3 g8f6 +f1b5 f8b4 +o-o o-o +d2d3 b4c3 +b2c3 d7d6 +c1g5 d8e7 +f1e1 c6d8 +d3d4 d8e6 +! Giuoco Piano +e2e4 e7e5 +g1f3 b8c6 +f1c4 f8c5 +d2d3 g8f6 +b1c3 d7d6 +c1g5 h7h6 +g5f6 d8f6 +c3d5 f6d8 +! Two Knights Defence +e2e4 e7e5 +g1f3 b8c6 +f1c4 g8f6 +f3g5 d7d5 +e4d5 c6a5 +c4b5 c7c6 +d5c6 b7c6 +b5e2 h7h6 +! Two Knights Defence -- Max Lange Attack +e2e4 e7e5 +g1f3 b8c6 +f1c4 g8f6 +d2d4 e5d4 +o-o f8c5 +e4e5 d7d5 +e5f6 d5c4 +f6g7 h8g8 +! Petrov's Defence +e2e4 e7e5 +g1f3 g8f6 +f3e5 d7d6 +e5f3 f6e4 +d2d4 d6d5 +f1d3 f8d6 +o-o o-o +c2c4 c8g4 +c4d5 f7f5 +b1c3 b8d7 +! Petrov's Defence +e2e4 e7e5 +g1f3 g8f6 +d2d4 e5d4 +e4e5 f6e4 +d1d4 d7d5 +! +! Vienna Game +e2e4 e7e5 +b1c3 f8c5 +g1f3 d7d6 +d2d4 e5d4 +f3d4 g8f6 +c1g5 h7h6 +g5h4 b1c3 +! +e2e4 e7e5 +b1c3 b8c6 +g1f3 g7g6 +d2d4 e5d4 +c3d5 f8g7 +c1g5 c6e7 +f3d4 c7c6 +d5c3 h7h6 +! - - - - - - +! ECO C25/1-2 +e2e4 e7e5 +b1c3 f8c5 +f1c4 d7d6 +d2d3 c8e6 +c4e6 f7f6 +d1h5 e7d7 +c1e3 c5b6 +g1e2 b8c6 +o-o g8f6 +h5h3 d8e8 +! +e2e4 e7e5 +b1c3 f8c5 +g1f3 d7d6 +d2d4 e5d4 +f3d4 g8f6 +c1g5 h7h6 +g5h4 b8c6 +d4c6 b7c6 +f1d3 e8e7 +o-o g7g5 +! ECO C25/3-9 +e2e4 e7e5 +b1c3 b8c6 +f2f4 e5f4 +g1f3 g7g5 +h2h4 g5g4 +f3g5 h7h6 +g5f7 e7f7 +d2d4 d7d5 +c1f4 f8b4 +f1e2 b4c3 +b2c3 g8f6 +! +e2e4 e7e5 +b1c3 b8c6 +f2f4 e5f4 +g1f3 g7g5 +d2d4 g5g4 +f1c4 g4f3 +o-o d7d5 +e4d5 c8g4 +d1d2 c6e7 +d2f4 g8h6 +! +e2e4 e7e5 +b1c3 b8c6 +f2f4 e5f4 +d2d4 d8h4 +e1e2 d7d5 +e4d5 c8g4 +g1f3 o-o-o +d5c6 f8c5 +d1e1 h4h5 +c6b7 e8b8 +e2d2 g4f3 +! +e2e4 e7e5 +b1c3 b8c6 +f2f4 e5f4 +d2d4 d8h4 +e1e2 d7d6 +g1f3 c8g4 +c1f4 o-o-o +e2e3 h4h5 +f1e2 g7g5 +f3g5 f7f5 +h2h3 g4e2 +! +e2e4 e7e5 +b1c3 b8c6 +g2g3 f8c5 +f1g2 a7a6 +g1e2 d7d6 +d1d3 c8g4 +h2h3 g4e6 +o-o g8e7 +c3d5 o-o +c2c3 c5a7 +g1h2 f7f6 +! +e2e4 e7e5 +b1c3 b8c6 +g2g3 f8c5 +f1g2 d7d6 +c3a4 g8e7 +a4c5 d6c5 +d2d3 o-o +g2e3 b7b6 +d1d2 c8e6 +g1e2 d8d7 +o-o a8d8 +! +e2e4 e7e5 +b1c3 b8c6 +f1c4 f8c5 +d1g4 g7g6 +d4f3 g8f6 +g1e2 d7d6 +d2d3 c8g4 +f3g3 h7h6 +f2f4 d7e7 +c3d5 f6d5 +g3g4 d5e3 +! ECO C26/1-10 +e2e4 e7e5 +b1c3 g8f6 +g2g3 c7c6 +f1g2 d7d6 +g1e2 b7b5 +o-o b8d7 +h2h3 d8c7 +g3g4 b5b4 +c3b1 a7a5 +a2a3 c8a6 +a3b4 a5b4 +! +e2e4 e7e5 +b1c3 g8f6 +g2g3 d7d5 +e4d5 f6d5 +f1g2 c8e6 +g1f3 b8c6 +o-o f8e7 +f1e1 e7f6 +c3e4 o-o +d2d3 f6e7 +a2a3 d5b6 +! +e2e4 e7e5 +b1c3 g8f6 +g2g3 d7d5 +e4d5 f6d5 +f1g2 d5c3 +b2c3 f8d6 +g1f3 o-o +o-o b8d7 +d2d3 a1b8 +a2a4 b7b6 +a4a5 c8b7 +! +e2e4 e7e5 +b1c3 g8f6 +g2g3 f8b4 +f1g2 c7c6 +g1e2 o-o +o-o d7d5 +e4d5 c6d5 +d2d4 e5d4 +e2d4 b8c6 +c1g5 b4e7 +f1e1 h7h6 +! +e2e4 e7e5 +b1c3 g8f6 +g2g3 f8c5 +f1g2 b8c6 +g1e2 d7d6 +o-o o-o +d2d3 c8e6 +c3d5 e6d5 +e4d5 c6e7 +c1g5 f6d7 +d3d4 e5d4 +! +e2e4 e7e5 +b1c3 g8f6 +g2g3 f8c5 +f1g2 b8c6 +g1f3 d7d6 +d2d3 a7a6 +o-o o-o +c1g5 h7h6 +g5e3 c5e3 +f2e3 d6d5 +e4d5 f6d5 +! +e2e4 e7e5 +b1c3 g8f6 +g2g3 f8c5 +f1g2 o-o +d2d3 f8e8 +g1e2 c7c6 +o-o d7d5 +e5d5 f6d5 +g1h1 c8g4 +h2h3 g4e6 +c3e4 c5e7 +! +e2e4 e7e5 +b1c3 g8f6 +f1c4 f8b4 +g1e2 o-o +d2d3 c7c6 +o-o d7d5 +c4b3 d5e4 +c3e4 b8d7 +e2g3 f6e4 +d3e4 d7c5 +d1h5 c5b3 +! +e2e4 e7e5 +b1c3 g8f6 +f1c4 f8c5 +d2d3 d7d6 +c1g5 c8e6 +d1d2 b8d7 +g1e2 e6c4 +d3c4 h7h6 +g5e3 d8e7 +e2g3 c5e3 +f2e3 g7g6 +! +e2e4 e7e5 +b1c3 g8f6 +f1c4 f8c5 +d2d3 d7d6 +f2f4 b8c6 +f4f5 b6d4 +g1f3 c7c6 +f3d4 c5d4 +d1f3 b7b5 +c4b3 a7a5 +a2a3 a5a4 +! ECO C27/1-2 +e2e4 e7e5 +b1c3 g8f6 +f1c4 f6e4 +d1h5 e4d6 +h5e5 d8e7 +e5e7 f8e7 +c4b3 d6f5 +c3d5 e7d8 +d5e3 f5d4 +b3c4 c7c6 +g1e2 d4e2 +c4e2 d7d5 +! +e2e4 e7e5 +b1c3 g8f6 +f1c4 f6e4 +d1h5 e4d6 +c4b3 b8c6 +c3b5 g7g6 +h5f3 f7f6 +b5c7 d8c7 +f3f6 b7b6 +g1f3 c8a6 +f3e5 c6e5 +f6e5 e8d8 +! ECO C27/3-5 +e2e4 e7e5 +b1c3 g8f6 +f1c4 f6e4 +d1h5 e4d6 +c4b3 b8c6 +c3b5 g7g6 +h5f3 f7f5 +f3d5 d8e7 +b5c7 e8d8 +c7a8 b7b6 +d2d3 c8b7 +h2h4 f5f4 +d5f3 f8h6 +b3d5 b7a8 +f3g4 h8f8 +g1e2 e5e4 +c1f4 h6f4 +e2f4 e7e5 +g4g5 e5g5 +! +e2e4 e7e5 +b1c3 g8f6 +f1c4 f6e4 +d1h5 e4d6 +c4b3 b8c6 +c3b5 g7g6 +h5f3 f7f5 +f3d5 d8e7 +b5c7 e8d8 +c7a8 b7b6 +g1f3 c8b7 +d3d4 c6d4 +c1g5 d4f3 +d5f3 e7g5 +b3d5 e5e4 +f3b3 b7a6 +b3a4 f8h6 +a4d4 h8e8 +g2g3 g5g4 +! +e2e4 e7e5 +b1c3 g8f6 +f1c4 f6e4 +d1h5 e4d6 +c4b3 b8c6 +c3b5 g7g6 +h5f3 f7f5 +f3d5 d8e7 +b5c7 e8d8 +c7a8 b7b6 +a8b6 a7b6 +d5f3 c8b7 +d2d3 c6d4 +f3h3 e5e4 +c1e3 e4d3 +o-o-o d4c2 +e3b6 d8e8 +h3d3 f8h6 +c1b1 b7e4 +! ECO C27/6-7 +e2e4 e7e5 +b1c3 g8f6 +f1c4 f6e4 +d1h5 e4d6 +c4b3 f8e7 +g1f3 b8c6 +f3e5 o-o +o-o c6d4 +c3d5 d4b3 +a2b3 d6e8 +h5e2 e8f6 +e5c6 d7c6 +d5e7 g8h8 +e7c8 d8c8 +! +e2e4 e7e5 +b1c3 g8f6 +f1c4 f6e4 +d1h5 e4d6 +c4b3 f8e7 +g1f3 o-o +h2h4 b8c6 +f3g5 h7h6 +h5g6 e7g5 +h4g5 d8g5 +d2d3 d6f5 +c1g5 c6d4 +c3d5 d4b3 +! ECO C28/1-7 +e2e4 e7e5 +b1c3 g8f6 +f1c4 b8c6 +f2f3 f6e4 +g1f3 e4c3 +d2c3 d8e7 +b2b4 d7d6 +o-o c8e6 +c4e6 e7e6 +b4b5 c6d8 +f4e5 d6e5 +f3e5 f8d6 +! +e2e4 e7e5 +b1c3 g8f6 +f1c4 b8c6 +d2d3 c6a5 +g1e2 a5c4 +d3c4 d7d6 +o-o c8e6 +b2b3 c7c6 +e2g3 g7g6 +h2h3 h7h5 +d1d3 f8e7 +c1e3 d8d7 +! +e2e4 e7e5 +b1c3 g8f6 +f1c4 b8c6 +d2d3 f8c5 +c1g5 h7h6 +g5h4 d7d6 +c3a4 c8e6 +a4c5 d6c5 +b2b3 e6c4 +b3c4 d8d6 +g1e2 c6d4 +h4f6 +! +e2e4 e7e5 +b1c3 g8f6 +f1c4 b8c6 +d2d3 f8b4 +g1e2 d7d5 +e4d5 f6d5 +c4d5 d8d5 +o-o d5d8 +f2f4 e5f4 +c1f4 o-o +d1e1 b4d6 +e1g3 b6f4 +! +e2e4 e7e5 +b1c3 g8f6 +f1c4 b8c6 +d2d3 f8b4 +c1g5 d7d6 +g1e2 c8e6 +o-o h7h6 +g5f6 d8f6 +c3d5 e6d5 +c4d5 b4c5 +c2c3 o-o +g1h1 c6e7 +! +e2e4 e7e5 +b1c3 g8f6 +f1c4 b8c6 +d2d3 f8b4 +c1g5 h7h6 +g5f6 b4c3 +b2c3 d8f6 +g1e2 d7d6 +d1d2 c1e6 +c4b5 f6g5 +e2g3 o-o +b5c6 b7c6 +! +e2e4 e7e5 +b1c3 g8f6 +f1c4 b8c6 +d2d3 f8b4 +g1f3 d7d6 +o-o b4c3 +b2c3 c6a5 +c4b3 a5b3 +a2b3 o-o +c3c4 b7b6 +d1e2 f6d7 +c1g5 f7f6 +! ECO C29/1 +e2e4 e7e5 +b1c3 g8f6 +f1f4 d7d5 +d2d3 e5f4 +e4d5 f6d5 +c3d5 d8d5 +c1f4 f8d6 +f4d6 d5d6 +d1d2 o-o +g1f3 c8g4 +f1e2 g4f3 +! ECO C29/2-12 +e2e4 e7e5 +b1c3 g8f6 +f2f4 d7d5 +f4e5 f6e4 +d1f3 b8c6 +f1b5 e4c3 +b2c3 f8e7 +d2d4 o-o +b5d3 f7f6 +f3h5 g7g6 +d3g6 h7g6 +h5g6 g8h8 +g6h6 h8g8 +! +e2e4 e7e5 +b1c3 g8f6 +f2f4 d7d5 +f4e5 f6e4 +d1f3 f7f5 +d2d3 e4c3 +b2c3 d5d4 +f3g3 b8c6 +f1e2 c8e6 +e2f3 d8d7 +g1e2 f8c5 +c3c4 o-o +o-o e6c4 +! +e2e4 e7e5 +b1c3 g8f6 +f2f4 d7d5 +f4e5 f6e4 +d2d3 d8h4 +g2g3 e4g3 +g1f3 h4h5 +c3d5 c8g4 +f1g2 g3h1 +d5c7 e8d7 +c7h8 b8c6 +c1e3 f7f6 +d3d4 f6e5 +! +e2e4 e7e5 +b1c3 g8f6 +f2f4 d7d5 +f4e5 f6e4 +d2d3 f1b4 +d3e4 d8h4 +e1e2 b8c6 +g1f3 c8g4 +c3d5 o-o-o +c2c3 f7f5 +e5f6 h8e8 +c3b4 e8e4 +c1e3 g7f6 +! +e2e4 e7e5 +b1c3 g8f6 +f2f4 d7d5 +f4e5 f6e4 +d2d3 e4c3 +b2c3 d5d4 +g1f3 b8c6 +c3d4 f8b4 +c1d2 b4d2 +d1d2 c6d4 +c2c3 d4f3 +g2f3 d8h4 +d2f2 h4f2 +! +e2e4 e7e5 +b1c3 g8f6 +f2f4 d7d5 +f4e5 f6e4 +g1f3 f1b4 +d1e2 b4c3 +b2c3 o-o +e2e3 b8c6 +f1d3 f7f5 +o-o c8e6 +c1a3 f8e8 +a1b1 a8b8 +a3b5 e6d7 +! +e2e4 e7e5 +b1c3 g8f6 +f2f4 d7d5 +f4e5 f6e4 +g1f3 b8c6 +f1b5 f8c5 +d2d4 c5b4 +c1d2 b4c3 +b2c3 o-o +o-o c1g4 +d1e1 f7f6 +d2e3 g4d7 +e5f6 d8f6 +! +e2e4 e7e5 +b1c3 g8f6 +f2f4 d7d5 +f4e5 f6e4 +g1f3 f8c5 +d1e2 c5f2 +e1d1 e4c3 +d2c3 f2b6 +c3g5 d8d7 +d1d2 o-o +a1d1 d7a4 +a2a3 c7c5 +d2c1 c8e6 +! +e2e4 e7e5 +b1c3 g8f6 +f2f4 d7d5 +f4e5 f6e4 +g1f3 c8g4 +d1e2 e4g5 +h2h4 g5f3 +g2f3 g4e6 +d2d4 b8c6 +c1e3 f8e7 +e2f2 d8d7 +o-o-o o-o-o +f1b5 a7a6 +! +e2e4 e7e5 +b1c3 g8f6 +f2f4 d7d5 +f4e5 f6e4 +g1f3 f8e7 +d1e2 e4c3 +d2c3 o-o +c1f4 c7c5 +o-o-o d8a5 +c1b1 b8c6 +a4b5 c8e6 +b5a5 f3g5 +! +e2e4 e7e5 +b1c3 g8f6 +f2f4 d7d5 +f4e5 f6e4 +g1f3 f8e7 +d2d4 o-o +f1d3 f7f6 +e5f6 e7f6 +o-o b8c6 +c3e4 d5e4 +d3e4 c6d4 +f3g5 c8f5 +c2c3 f7g5 +! +! Vienna Game +e2e4 e7e5 +b1c3 f8c5 +g1f3 d7d6 +d2d4 e5d4 +f3d4 g8f6 +c1g5 h7h6 +g5h4 b1c3 +! Three Knights Game +e2e4 e7e5 +b1c3 b8c6 +g1f3 g7g6 +d2d4 e5d4 +c3d5 f8g7 +c1g5 c6e7 +f3d4 c7c6 +d5c3 h7h6 +! Bishop's Opening +e2e4 e7e5 +f1c4 g8f6 +d2d4 e5d4 +g1f3 f6e4 +d1d4 e4c5 +o-o c5e6 +f1e1 c7c6 +b1c3 d7d5 +c4d3 f8e7 +! Ruy Lopez -- Classical Defence +e2e4 e7e5 +g1f3 b8c6 +f1b5 f8c5 +c2c3 g8f6 +d2d4 e5d4 +e4e5 f6e4 +o-o d7d5 +! Ruy Lopez -- Birds Defence +e2e4 e7e5 +g1f3 b8c6 +f1b5 c6d4 +b5a4 f8c5 +o-o d4f3 +d1f3 g8e7 +d2d3 o-o +c1e3 c5b6 +b1c3 d7d6 +! Ruy Lopez -- Schliemann Defence +e2e4 e7e5 +g1f3 b8c6 +f1b5 f7f5 +b1c3 f5e4 +c3e4 d7d5 +f3e5 d5e4 +e5c6 d8d5 +c2c4 d5d6 +c6a7 c8d7 +! Ruy Lopez -- Old Steinitz Defence +e2e4 e7e5 +g1f3 b8c6 +f1b5 d7d6 +d2d4 c8d7 +b1c3 g8f6 +o-o f8e7 +f1e1 e5d4 +f3d4 o-o +d4f5 f8e8 +! Ruy Lopez -- Old Steinitz Defence +e2e4 e7e5 +g1f3 b8c6 +f1b5 d7d6 +d2d4 c8d7 +b1c3 g8f6 +b5c6 d7c6 +d1d3 e5d4 +f3d4 f8e7 +c1g5 c6d7 +! Ruy Lopez -- Modern Steinitz Defence +e2e4 e7e5 +g1f3 b8c6 +f1b5 a7a6 +b5a4 d7d6 +d2d4 b7b5 +a4b3 c6d4 +f3d4 e5d4 +c2c3 d4c3 +b1c3 c8b7 +! Ruy Lopez -- Open Defence +e2e4 e7e5 +g1f3 b8c6 +f1b5 a7a6 +b5a4 g8f6 +o-o f6e4 +d2d4 b7b5 +a4b3 d7d5 +d4e5 c8e6 +c2c3 f8c5 +b1d2 o-o +! Ruy Lopez -- Open Defence +e2e4 e7e5 +g1f3 b8c6 +f1b5 a7a6 +b5a4 g8f6 +o-o f8e7 +f1e1 b7b5 +a4b3 d7d6 +c2c3 o-o +h2h3 c6a5 +b3c2 c2c4 +d2d4 d8c7 +! Ruy Lopez +e2e4 e7e5 +g1f3 b8c6 +f1b5 a7a6 +b5c6 d7c6 +d2d4 e5d4 +d1d4 d8d4 +f3d4 c8d7 +c1e3 o-o-o +b1d2 g8e7 +! Scotch Game +e2e4 e7e5 +g1f3 b8c6 +d2d4 e5d4 +f3d4 f8c5 +c1e3 d8f6 +c2c3 g8e7 +b1d2 d7d6 +e3c5 d6c5 +! Philidor's Defence +e2e4 e7e5 +g1f3 d7d6 +d2d4 g8f6 +b8c6 b1d2 +f8c5 f1e2 +o-o o-o +d1e2 c7c6 +! Alekhine's Defence +e2e4 g8f6 +e4e5 f6d5 +c2c4 d5b6 +d2d4 d7d6 +f2f4 d6e5 +f4e5 b8c6 +c1e3 c8f5 +b1c3 e7e6 +g1f3 f8e7 +! Alekhine's Defence +e2e4 g8f6 +e4e5 f6d5 +d2d4 d7d6 +g1f3 c8g4 +f1e2 e7e6 +o-o f8e7 +h2h3 g4h5 +c2c4 d5b6 +! Kings Gambit Accepted +e2e4 e7e5 +f2f4 e5f4 +g1f3 d7d6 +f1c4 h7h6 +d2d4 g7g5 +o-o f8g7 +c2c3 b8c6 +d1b3 d8e7 +! Ponziani's Opening +e2e4 e7e5 +g1f3 b8c6 +c2c3 d7d5 +d1a4 g8f6 +f3e5 f8d6 +e5c6 b7c6 +d2d3 o-o +c1g5 h7h6 +! Caro-Kann Defence +e2e4 c7c6 +d2d4 d7d5 +e4d5 c6d5 +c2c4 g8f6 +b1c3 b8c6 +c1g5 e7e6 +c4c5 f8e7 +f1b5 o-o +g1f3 f6e4 +! Caro-Kann Defence +e2e4 c7c6 +d2d4 d7d5 +e4e5 c8f5 +f1d3 f5d3 +d1d3 e7e6 +b1c3 d8b6 +b1d2 c6c5 +d4c5 f8c5 +! Caro-Kann Defence +e2e4 c7c6 +b1c3 d7d5 +g1f3 c8g4 +h2h3 g4f3 +d1f3 e7e6 +d2d4 g8f6 +f1d3 d5e4 +c3e4 d8d4 +c2c3 d4d8 +! French Defence -- Classical +e2e4 e7e6 +d2d4 d7d5 +b1c3 g8f6 +c1g5 f8e7 +e4e5 f6d7 +g5e7 d8e7 +d1d2 o-o +f2f4 c7c5 +g1f3 b8c6 +o-o-o c5c4 +! French Defence -- MacCutcheon +e2e4 e7e6 +d2d4 d7d5 +b1c3 g8f6 +c1g5 c8g4 +e4e5 h7h6 +g5d2 g4f3 +g2f3 f6e4 +d1g4 e8f8 +h2h4 c7c5 +! French Defence -- Rubenstein +e2e4 e7e6 +d2d4 d7d5 +b1c3 d5e4 +c3e4 b8d7 +g1f3 g8f6 +e4f6 d7f6 +f1d3 b7b6 +d1e2 c8b7 +c1g5 f8e7 +! French Defence -- Winawer +e2e4 e7e6 +d2d4 d7d5 +b1c3 f8b4 +e4e5 c7c5 +a2a3 b4c3 +b2c3 b8d7 +d1g4 o-o +g1f3 b8c6 +f1e3 f7f5 +! French Defence -- Tarrasch +e2e4 e7e6 +d2d4 d7d5 +b1d2 b8c6 +g1f3 g8f6 +e4e5 f6d7 +d2b3 f7f6 +f1b5 f8e7 +c1f4 o-o +! Sicilian Defence -- Dragon Variation +e2e4 c7c5 +g1f3 b8c6 +d2d4 c5d4 +f3d4 g8f6 +b1c3 d7d6 +f1e2 g7g6 +c1e3 f8g7 +o-o o-o +d4b3 c8e6 +f2f4 c6a5 +f4f5 e6c4 +! Sicilian Defence -- Dragon Variation +e2e4 c7c5 +g1f3 b8c6 +d2d4 c5d4 +f3d4 g7g6 +b1c3 f8g7 +c1e3 g8f6 +f1c4 o-o +! Sicilian Defence -- Boleslavsky Variation +e2e4 c7c5 +g1f3 b8c6 +d2d4 c5d4 +f3d4 g8f6 +b1c3 d7d6 +f1e2 e7e5 +d4b3 f8e7 +o-o o-o +c1e3 c8e6 +! Sicilian Defence -- Najdorf +e2e4 c7c5 +g1f3 d7d6 +d2d4 c5d4 +f3d4 g8f6 +b1c3 a7a6 +c1g5 e7e6 +d1d2 f8e7 +o-o-o o-o +! Sicilian Defence -- Najdorf +e2e4 c7c5 +g1f3 d7d6 +d2d4 c5d4 +f3d4 g8f6 +b1c3 a7a6 +f1e2 e7e5 +d4b3 f8e7 +o-o o-o +f2f4 b7b5 +a2a3 c8b7 +! Sicilian Defence -- Najdorf +e2e4 c7c5 +g1f3 d7d6 +d2d4 c5d4 +f3d4 g8f6 +b1c3 a7a6 +g2g3 e7e5 +d4e2 c8e6 +f1g2 b7b5 +o-o b8d7 +! Sicilian Defence -- Closed +e2e4 c7c5 +b1c3 b8c6 +g2g3 g7g6 +f1g2 f8g7 +d2d3 e7e6 +c1e3 d7d6 +g1e2 c6d4 +d1d2 d8h4 +o-o g8d7 +! Nimzowitsch Defence +e2e4 b8c6 +d2d4 d7d5 +e4e5 f7f6 +g1f3 c1g4 +f1e2 e7e6 +e5f6 g8f6 +c2c3 f8d6 +c1g5 d8d7 +! Queens Gambit Accepted +d2d4 d7d5 +c2c4 d5c4 +g1f3 g8f6 +e2e3 e7e6 +f1c4 c7c5 +o-o a7a6 +d1e2 b7b5 +c4d3 c5d4 +e3d4 b8c6 +! Queens Gambit -- Catalan +d2d4 d7d5 +c2c4 e7e6 +g2g3 g8f6 +g1f3 f8e7 +f1g2 o-o +o-o f6d7 +d1c2 c7c6 +b1d2 b7b6 +e2e4 c8b7 +b2b3 a8c8 +! Queens Gambit Declined -- Orthodox +d2d4 d7d5 +c2c4 e7e6 +b1c3 g8f6 +c1g5 f8e7 +e2e3 o-o +g1f3 b8d7 +a1c1 c7c6 +f8d3 d5c4 +f1c4 f6d5 +! Queens Gambit Declined -- Cambridge Springs +d2d4 d7d5 +c2c4 e7e6 +b1c3 g8f6 +c1g5 b8d7 +e2e3 c7c6 +g1f3 d8a5 +f3d2 f8b4 +d1c2 o-o +g5h4 c6c5 +! Queens Gambit Declined -- Exchange Var. +d2d4 d7d5 +c2c4 e7e6 +b1c3 g8f6 +c1g5 b8d7 +c4d5 e6d5 +e2e3 c7c6 +f1d3 f8e7 +d1c2 o-o +g1e2 f8e8 +! Queens Gambit Declined -- Semi-Tarrasch +d2d4 d7d5 +c2c4 e7e6 +b1c3 g8f6 +g1f3 c7c5 +c4d5 c5d4 +d1d4 e6d5 +e2e4 b8c6 +f1b5 f6e4 +! Queens Gambit Declined -- Tarrasch +d2d4 d7d5 +c2c4 e7e6 +b1c3 c7c5 +c4d5 e6d5 +g1f3 b8c6 +g2g3 g8f6 +f1g2 f8e7 +o-o o-o +! Queens Gambit Declined -- Vienna +d2d4 d7d5 +c2c4 e7e6 +g1f3 g8f6 +f1b5 f8b4 +b1c3 d5c4 +e2e4 c7c5 +e4e5 c5d4 +d1a4 b8c6 +o-o-o c1d2 +! Queens Gambit Declined -- Slav (Marshall Gambit) +d2d4 d7d5 +c2c4 c7c6 +b1c3 e7e6 +e2e4 d4e4 +c3e4 f8b4 +c1d2 d8d4 +d2b4 d4e4 +f1e2 b8a6 +b4d6 b7b6 +! Queens Gambit --Slav (Krause) +d2d4 d7d5 +c2c4 c7c6 +g1f3 g8f6 +b1c3 d5c4 +a2a4 c8f5 +f3e5 e7e6 +f2f3 f8b4 +c1g5 h7h6 +g5f6 d8f6 +e2e4 f5h7 +! Modern Benoni Counter Gambit +d2d4 g8f6 +c2c4 c7c5 +d4d5 e7e6 +b1c3 e6d5 +c4d5 d7d6 +e2e4 g7g6 +f1d3 f8g7 +g1e2 o-o +o-o a7a6 +a2a4 d8c7 +! Queens Pawn Game +d2d4 d7d5 +g1f3 g8f6 +c1f4 c7c5 +e2e3 b8c6 +c2c3 d8b6 +d1c1 c8f5 +d4c5 b6c5 +b1d2 a8c8 +f3d4 c6d4 +e3d4 c5b6 +! Pirc-Robatsch Defence +d2d4 d7d6 +e2e4 g8f6 +b1c3 g7g6 +c1g5 f8g7 +d1d2 b8d7 +o-o-o e7e5 +d4e5 d6e5 +g1f3 h7h6 +g5h4 g6g5 +h4g3 d8e7 +! Pirc-Robatsch Defence +d2d4 d7d6 +e2e4 g8f6 +b1c3 g7g6 +f1c4 c7c6 +d1e2 f8g7 +g1f3 o-o +c1g5 b7b5 +c4d3 d8c7 +! Queens Indian Defence +d2d4 g8f6 +c2c4 e7e6 +g1f3 b7b6 +g2g3 c8b7 +f1g2 f8e7 +o-o o-o +b1c3 f6e4 +d1c2 e4c3 +c2c3 d7d6 +c3c2 f7f5 +! Queens Indian Defence +d2d4 g8f6 +c2c4 e7e6 +g1f3 b7b6 +e2e3 c8b7 +f1d3 f8e7 +b1c3 d7d5 +o-o o-o +d1e2 b8d7 +! Nimzo-Indian Defence +d2d4 g8f6 +c2c4 e7e6 +b1c3 f8b4 +d1c2 d7d5 +a2a3 b4c3 +c2c3 b8c6 +g1f3 f6e4 +c3b3 c6a5 +b3a4 c7c6 +! Nimzo-Indian Defence (Rubenstein) +d2d4 g8f6 +c2c4 e7e6 +b1c3 f8b4 +e2e3 o-o +f1d3 d7d5 +g1f3 c7c5 +o-o b8c6 +a2a3 b4c3 +b2c3 d5c4 +d3c4 d8c7 +! Nimzo-Indian Defence -- Samisch +d2d4 g8f6 +c2c4 e7e6 +b1c3 f8b4 +a2a3 b4c3 +b2c3 o-o +f2f3 d7d5 +c4d5 e6d5 +e2e3 c8f5 +g1e2 b8d7 +e2g3 f5g6 +! Nimzo-Indian Defence +d2d4 g8f6 +c2c4 e7e6 +b1c3 f8b4 +c1d2 o-o +e2e3 d7d5 +g1f3 c7c5 +a2a3 b4c3 +d2c3 f6e4 +a1c1 e4c3 +c1c3 c5d4 +! Grunfeld Defence +d2d4 g8f6 +c2c4 g7g6 +b1c3 d7d5 +c4d5 f6d5 +e2e4 d5c3 +b2c3 c7c5 +f1c4 f8g7 +g1e2 o-o +o-o c5d4 +c3d4 b8c6 +! Grunfeld Defence -- Smyslov +d2d4 g8f6 +c2c4 g7g6 +b1c3 d7d5 +g1f3 f8g7 +d1b3 d5c4 +b3c4 o-o +e2e4 c8g4 +c1e3 f6d7 +o-o-o b8c6 +! Grunfeld Defence +d2d4 g8f6 +c2c4 g7g6 +b1c3 d7d5 +c1f4 f8g7 +d2d3 o-o +c4d5 f6d5 +c3d5 d8d5 +f4c7 b8c6 +! Kings Indian Defence -- Classical +d2d4 g8f6 +c2c4 g7g6 +b1c3 f8g7 +e2e4 d7d6 +g1f3 o-o +f1e2 e7e5 +o-o b8c6 +c1e3 f8e8 +d4e5 d6e5 +! Kings Indian Defence -- 4 pawns attack +d2d4 g8f6 +c2c4 g7g6 +b1c3 f8g7 +e2e4 d7d6 +f2f4 c7c5 +g1f3 o-o +d4d5 e7e6 +f1d3 e6d5 +c4d5 d8b6 +! Kings Indian Defence -- Samisch +d2d4 g8f6 +c2c4 g7g6 +b1c3 f8g7 +e2e4 d7d6 +f2f3 o-o +c1e3 e7e5 +d4d5 c7c6 +g1e2 c6d5 +c3d5 f6d5 +! Kings Indian Defence -- Main Line +d2d4 g8f6 +c2c4 g7g6 +g2g3 f8g7 +f1g2 o-o +b1c3 d7d6 +g1f3 b8d7 +o-o e7e5 +e2e4 c7c6 +h2h3 d8b6 +! Kings Indian Defence +d2d4 g8f6 +c2c4 g7g6 +b1c3 f8g7 +g1f3 o-o +c1f4 d7d6 +h2h3 b8d7 +e2e3 c7c6 +! Dutch Defence +d2d4 f7f5 +g2g3 e7e6 +f1g2 g8f6 +g1f3 f8e7 +o-o o-o +c2c4 d7d6 +b1c3 d8e8 +d1c2 e8h5 +b2b3 b8c6 +c1a3 a7a5 +! English Opening +c2c4 e7e5 +b1c3 g8f6 +g1f3 b8c6 +e2e4 f8b4 +d2d3 d7d6 +f1e2 o-o +o-o b4c3 +b2c3 d8e7 +! English Opening +c2c4 g8f6 +b1c3 d7d5 +c4d5 f6d5 +e2e4 d5f4 +f1c4 c8e6 +c4e6 f7e6 +! English Opening +c2c4 e7e5 +b1c3 g8f6 +g1f3 b8c6 +g2g3 d7d5 +c4d5 f6d5 +f1g2 d5b6 +o-o f8e7 +d2d3 o-o +c1e3 f7f5 +! Reti -- Accepted +g1f3 d7d5 +c2c4 d5c4 +e2e3 c7c5 +f1c4 e7e6 +o-o g8f6 +b2b3 b8c6 +c1b2 a7a6 +a2a4 f8e7 +! Reti -- Neo Catalan +g1f3 d7d5 +c2c4 e7e6 +g2g3 g8f6 +f1g2 f8e7 +o-o o-o +b2b3 c7c5 +c4d5 f6d5 +c1b2 b8c6 +d2d4 b7b6 +b1c3 d5c3 +! Reti -- Barcza +g1f3 d7d5 +g2g3 g8f6 +f1g2 g7g6 +o-o f8g7 +d2d3 o-o +b1d2 b8c6 +e2e4 e7e5 +c2c3 a7a5 +f1e1 d5e4 +d3e4 f6d7 +! Sicilian Najdorf +e2e4 c7c5 +g1f3 d7d6 +d2d4 c5d4 +f3d4 g8f6 +b1c3 a7a6 +c1g5 e7e6 +f2f4 d8b6 +d1d2 b6b2 +a1b1 b2a3 +e4e5 d6e5 +f4e5 f6d7 +c3e4 h7h6 +g5h4 a3a2 +b1b3 b8c6 +d4c6 b7c6 +e4d6 f8d6 +e5d6 a6a5 +f1e2 a5a4 +b3c3 a2a1 +e2d1 a4a3 +o-o a3a2 +d2e3 o-o +! # Sicilian Defense col. 2f p. 176 MCO 12. (Incomplete game) +e2e4 c7c5 +g1f3 d7d6 +d2d4 c5d4 +f3d4 g8f6 +b1c3 a7a6 +c1g5 e7e6 +f2f4 d8b6 +d1d2 b6b2 +a1b1 b2a3 +e4e5 d6e5 +f4e5 f6d7 +f1c4 f8b4 +b1b3 a3a5 +o-o o-o +g5f6 d7f6 +e5f6 f8d8 +b3b4 a5b4 +d2g5 g7g6 +f1f4 b7b6 +f4h4 b4f8 +g1f1 a8a7 +! # Sicilian Defense col. 3g p. 176 MCO (Incomplete Game) +e2e4 c7c5 +g1f3 d7d6 +d2d4 c5d4 +f3d4 g8f6 +b1c3 a7a6 +c1g5 e7e6 +f2f4 d8b6 +d1d2 b6b2 +a1b1 b2a3 +e4e5 d6e5 +f4e5 f6d7 +f1c4 a3a5 +c4e6 f7e6 +d4e6 d7e5 +c3d5 a5d2 +e1d2 e8d7 +e6c7 a8a7 +h1e1 e5c4 +! # Parma vs. Fischer, Havana 1965. Sicilian Defense col. 4j p. 176 +e2e4 c7c5 +g1f3 d7d6 +d2d4 c5d4 +f3d4 g8f6 +b1c3 a7a6 +c1g5 e7e6 +f2f4 d8b6 +d1d2 b6b2 +a1b1 b2a3 +g5f6 g7f6 +f1e2 f8g7 +o-o f6f5 +f1d1 b8c6 +d4c6 g7c3 +d2e3 b7c6 +b1b3 a3c5 +e3c5 d6c5 +b3c3 f5e4 +c3c5 c8d7 +c5e5 f7f5 +g2g4 h8g8 +g1g2 f5g4 +e5e4 h7h5 +g2g3 e8e7 +! # Matanovic, Sicilian Defense col. 5k p. 176 MCO (partial game) +e2e4 c7c5 +g1f3 d7d6 +d2d4 c5d4 +f3d4 g8f6 +b1c3 a7a6 +c1g5 e7e6 +f2f4 d8b6 +d1d2 b6b2 +a1b1 b2a3 +g5f6 g7f6 +f1e2 b8c6 +d4c6 b7c6 +o-o a3a5 +g1h1 f8e7 +f4f5 e6f5 +e4f5 c8f5 +e2a6 a5a6 +f1f5 d6d5 +b1e1 a6b7 +d2h6 o-o-o +h6h3 b7d7 +c3a4 +! # col. 6a +e2e4 c7c5 +g1f3 d7d6 +d2d4 c5d4 +f3d4 g8f6 +b1c3 a7a6 +c1g5 e7e6 +f2f4 d8b6 +d1d2 b6b2 +a1b1 b2a3 +f4f5 b8c6 +f5e6 f7e6 +d4c6 b7c6 +e4e5 d6e5 +g5f6 g7f6 +c3e4 f8e7 +f1e2 h7h6 +c2c4 f6f5 +b1b3 a3a4 +o-o f5e4 +g1h1 c6c5 +d2c3 a4c6 +c3e5 h8f8 +! # col. 7d +e2e4 c7c5 +g1f3 d7d6 +d2d4 c5d4 +f3d4 g8f6 +b1c3 a7a6 +c1g5 e7e6 +f2f4 d8b6 +d1d2 b6b2 +a1b1 b2a3 +f4f5 b8c6 +f5e6 f7e6 +d4c6 b7c6 +e4e5 f6d5 +c3d5 c6d5 +f1e2 d6e5 +o-o a8a7 +g1h1 a3c5 +c2c4 d5d4 +e2h5 g7g6 +h5d1 f8e7 +d1a4 e8d8 +f1f7 h7h6 +g5h6 e5e4 +! # col. 8 +e2e4 c7c5 +g1f3 d7d6 +d2d4 c5d4 +f3d4 g8f6 +b1c3 a7a6 +c1g5 e7e6 +f2f4 d8b6 +d1d2 b6b2 +d4b3 b8d7 +g5f6 g7f6 +f1e2 h7h5 +o-o b2a3 +a1d1 f8e7 +g1h1 d7c5 +e2f3 a8a7 +b3c5 a3c5 +! # col. 9g; Minic-Barczay, Varna 1967 (partial game) +e2e4 c7c5 +g1f3 d7d6 +d2d4 c5d4 +f3d4 g8f6 +b1c3 a7a6 +c1g5 e7e6 +f2f4 d8b6 +d1d2 b6b2 +d4b3 b8c6 +f1d3 d6d5 +g5f6 g7f6 +c3a4 b2a3 +a4b6 d5d4 +o-o a8b8 +f4f5 a3b4 +d2b4 f8b4 +b6c8 b8c8 +f5e6 f7e6 +f1f6 e8e7 +a1f1 c6e5 +! # col. 10i; Matulovic-Kavalek, Sousse 1967 +e2e4 c7c5 +g1f3 d7d6 +d2d4 c5d4 +f3d4 g8f6 +b1c3 a7a6 +c1g5 e7e6 +f2f4 d8b6 +d1d2 b6b2 +d4b3 b8c6 +a1b1 b2a3 +g5f6 g7f6 +f1d3 f8g7 +o-o o-o +f1f3 g8h8 +f3h3 c6e7 +f4f5 e6f5 +e4f5 c8f5 +d3f5 e7f5 +c3d5 +! # col. 11b; Joppen-Bronstein, Belgrade 1954 (partial game) +e2e4 c7c5 +g1f3 d7d6 +d2d4 c5d4 +f3d4 g8f6 +b1c3 a7a6 +c1g5 e7e6 +f2f4 d8b6 +d4b3 b6e3 +d1e2 e3e2 +f1e2 b8d7 +a2a4 f8e7 +o-o-o h7h6 +g5h4 e6e5 +f4f5 b7b6 +e2f3 c8b7 +! # col. 12e; Rajkovic-Udovcic, Yugoslav Chp. 1962 (partial game) +e2e4 c7c5 +g1f3 d7d6 +d2d4 c5d4 +f3d4 g8f6 +b1c3 a7a6 +c1g5 e7e6 +f2f4 d8b6 +d4b3 b8d7 +d1f3 f8e7 +o-o-o b6c7 +f1d3 h7h6 +g5h4 g7g5 +f4g5 d7e5 +f3e2 f6g4 +b3d4 h6g5 +h4g3 c8d7 +d4f3 c7c5 +! # col. 13i; Fischer-Vukovic (partial game) +e2e4 c7c5 +g1f3 d7d6 +d2d4 c5d4 +f3d4 g8f6 +b1c3 a7a6 +c1g5 e7e6 +f2f4 f8e7 +d1f3 d8c7 +o-o-o b8d7 +g2g4 b7b5 +g5f6 d7f6 +g4g5 f6d7 +a2a3 a8b8 +h2h4 b5b4 +a3b4 b8b4 +f1h3 o-o +d4e6 f7e6 +h3e6 g8h8 +c3d5 c7c4 +e6f5 f8f5 +e4f5 c8b7 +h1e1 e7f8 +! # col. 14m Parma-Tatai, Athens 1968 (partial game) +e2e4 c7c5 +g1f3 d7d6 +d2d4 c5d4 +f3d4 g8f6 +b1c3 a7a6 +c1g5 e7e6 +f2f4 b7b5 +e4e5 d6e5 +f4e5 d8c7 +e5f6 c7e5 +f1e2 e5g5 +d1d3 a8a7 +c3e4 g5e5 +d4f3 e5b2 +o-o a7d7 +d3e3 c8b7 +a1b1 b2c2 +f3g5 c2c6 +f6g7 f8g7 +! # col. 15; slight advantage for white. +e2e4 c7c5 +g1f3 d7d6 +d2d4 c5d4 +f3d4 g8f6 +b1c3 a7a6 +c1g5 e7e6 +f2f4 h7h6 +g5h4 d8b6 +d1d3 b6b2 +a1b1 b2a3 +e4e5 f6d5 +c3d5 a3d3 +f1d3 e6d5 +e5e6 +! # col. 16c; Fichtl-Dolezal, CSSR 1954 +e2e4 c7c5 +g1f3 d7d6 +d2d4 c5d4 +f3d4 g8f6 +b1c3 a7a6 +c1g5 e7e6 +d1f3 b8d7 +o-o-o d8c7 +f3g3 b7b5 +f1b5 a6b5 +d4b5 c7b8 +b5d6 f8d6 +g3d6 b8d6 +d1d6 h7h6 +g5f6 d7f6 +h1d1 c8b7 +f2f3 +! # col. 17e; Vasyukov-Zukharov, USSR 1960 +e2e4 c7c5 +g1f3 d7d6 +d2d4 c5d4 +f3d4 g8f6 +b1c3 a7a6 +c1g5 e7e6 +d1d2 b8c6 +o-o-o h7h6 +g5h4 f6e4 +d2f4 e4g5 +d4c6 b7c6 +f4a4 d8b6 +f2f4 g5h7 +f4f5 a8b8 +f5e6 c8e6 +f1c4 +! # col. 18g (somewhat questionable) +e2e4 c7c5 +g1f3 d7d6 +d2d4 c5d4 +f3d4 g8f6 +b1c3 a7a6 +c1g5 b8d7 +f1c4 d8a5 +d1d2 e7e6 +o-o-o b7b5 +c4b3 c8b7 +h1e1 a8c8 +e4e5 d7e5 +d4e6 f7e6 +e1e5 d6e5 +g5f6 +! # col. 19m; Yanofsky-Bolbochan, Stockholm 1962 +e2e4 c7c5 +g1f3 d7d6 +d2d4 c5d4 +f3d4 g8f6 +b1c3 a7a6 +f1e2 e7e5 +d4b3 f8e7 +o-o o-o +f2f4 b7b5 +a2a3 c8b7 +e2f3 b8d7 +g2g3 a8c8 +d1e1 d7b6 +g1h1 b6c4 +b3d2 d8d7 +d2c4 c8c4 +c1d2 d6d5 +! # col. 20p +e2e4 c7c5 +g1f3 d7d6 +d2d4 c5d4 +f3d4 g8f6 +b1c3 a7a6 +f1e2 e7e5 +d4b3 f8e7 +o-o o-o +c1e3 b8d7 +a2a4 b7b6 +d1d2 c8b7 +f2f3 d8c7 +f1d1 f8c8 +b3c1 +! # col. 21b +e2e4 c7c5 +g1f3 d7d6 +d2d4 c5d4 +f3d4 g8f6 +b1c3 a7a6 +g2g3 e7e5 +d4e2 f8e7 +f1g2 o-o +o-o b7b5 +h2h3 c8b7 +c3d5 f6d5 +e4d5 b8d7 +a2a4 d7c5 +e2c3 d8d7 +a4b5 a6b5 +a1a8 f8a8 +! # col. 22 +e2e4 c7c5 +g1f3 d7d6 +d2d4 c5d4 +f3d4 g8f6 +b1c3 a7a6 +f2f4 e7e6 +d1f3 d8b6 +d4b3 b8c6 +f1d3 f8e7 +c1e3 b6c7 +o-o o-o +a1e1 c6b4 +! # col. 23f +e2e4 c7c5 +g1f3 d7d6 +d2d4 c5d4 +f3d4 g8f6 +b1c3 a7a6 +c1e3 e7e5 +d4b3 c8e6 +d1d2 b8d7 +f2f3 f8e7 +g2g4 b7b5 +g4g5 f6h5 +o-o-o o-o +h1g1 a8c8 +c3e2 +! # col. 24k; Kotkov-Polugayevski, USSR 1959 +e2e4 c7c5 +g1f3 d7d6 +d2d4 c5d4 +f3d4 g8f6 +b1c3 a7a6 +f1c4 e7e6 +o-o f8e7 +c4b3 o-o +f2f4 b7b5 +a2a3 c8b7 +f4f5 e6e5 +d4e2 b8d7 +e2g3 d7c5 +b3d5 b7d5 +e4d5 a8c8 +c1g5 c5d7 +g5f6 d7f6 +c3e4 c8c4 +! # col. 25o; Ciocaltea-Minic, Bucharest 1966 +e2e4 c7c5 +g1f3 d7d6 +d2d4 c5d4 +f3d4 g8f6 +b1c3 a7a6 +f1c4 e7e6 +c4b3 b7b5 +f2f4 c8b7 +f4f5 e6e5 +d4e2 b8d7 +o-o f8e7 +e2g3 a8c8 +c1g5 o-o +! # col. 26e +e2e4 c7c5 +g1f3 d7d6 +d2d4 c5d4 +f3d4 g8f6 +b1c3 g7g6 +c1e3 f8g7 +f2f3 o-o +d1d2 b8c6 +o-o-o d6d5 +e4d5 f6d5 +d4c6 b7c6 +c3d5 c6d5 +d2d5 d8c7 +d5a8 c8f5 +a8f8 g8f8 +d1d2 h7h5 +f1e2 f8g8 +a2a3 c7b8 +! # col. 27i; Bikhovski-Gik, Moscow 1968 +e2e4 c7c5 +g1f3 d7d6 +d2d4 c5d4 +f3d4 g8f6 +b1c3 g7g6 +c1e3 f8g7 +f2f3 o-o +d1d2 b8c6 +f1c4 c8d7 +o-o-o d8a5 +c4b3 f8c8 +g2g4 c6e5 +h2h4 e5c4 +b3c4 c8c4 +d4b3 a5a6 +h4h5 c4c3 +b2c3 d7e6 +c1b1 a8c8 +e3d4 c8c4 +h5g6 h7g6 +! # col. 28k +e2e4 c7c5 +g1f3 d7d6 +d2d4 c5d4 +f3d4 g8f6 +b1c3 g7g6 +c1e3 f8g7 +f2f3 o-o +d1d2 b8c6 +f1c4 c8d7 +o-o-o d8a5 +c4b3 f8c8 +h2h4 c6e5 +h4h5 f6h5 +e3h6 e5d3 +c1b1 d3b2 +b1b2 g7h6 +d2h6 c8c3 +g2g4 h5f6 +g4g5 f6h5 +! # col. 29m; Ostojic-Honfi, Monte Carlo 1968 +e2e4 c7c5 +g1f3 d7d6 +d2d4 c5d4 +f3d4 g8f6 +b1c3 g7g6 +c1e3 f8g7 +f2f3 o-o +d1d2 b8c6 +f1c4 c8d7 +o-o-o d8a5 +c4b3 f8c8 +c1b1 c6e5 +h2h4 e5c4 +b3c4 c8c4 +d4b3 a5c7 +h4h5 c4c3 +d2c3 c7c3 +b2c3 f6h5 +e3d4 d7e6 +h1e1 h5f6 +e4e5 d6e5 +d4e5 f6d5 +b1b2 a8c8 +! # col. 30p; Karpov-Korchnoi, 2nd match game 1974. +e2e4 c7c5 +g1f3 d7d6 +d2d4 c5d4 +f3d4 g8f6 +b1c3 g7g6 +c1e3 f8g7 +f2f3 o-o +d1d2 b8c6 +f1c4 c8d7 +h2h4 a8c8 +c4b3 c6e5 +h4h5 f6h5 +o-o-o e5c4 +b3c4 c8c4 +g2g4 h5f6 +d4e2 d8a5 +e3h6 g7h6 +d2h6 f8c8 +d1d3 c4c5 +g4g5 c5g5 +d3d5 g5d5 +c3d5 c8e8 +e2c3 d7c6 +e4e5 c6d5 +e5f6 e7f6 +h6h7 g8f8 +h7h8 f8e7 +c3d5 +! # col. 31 +e2e4 c7c5 +g1f3 d7d6 +d2d4 c5d4 +f3d4 g8f6 +b1c3 g7g6 +g2g3 b8c6 +f1g2 c6d4 +d1d4 f8g7 +o-o o-o +d4d3 c8e6 +c3d5 f6d5 +e4d5 e6f5 +! # col. 32c; Pulsen-Cortlever, Buenos Aires 1939. +e2e4 c7c5 +g1f3 d7d6 +d2d4 c5d4 +f3d4 g8f6 +b1c3 g7g6 +c1g5 f8g7 +d1d2 b8c6 +o-o-o o-o +d4b3 f8e8 +f2f3 a7a6 +c1b1 b7b5 +h2h4 c8e6 +g2g4 c6e5 +! # col. 33h +e2e4 c7c5 +g1f3 d7d6 +d2d4 c5d4 +f3d4 g8f6 +b1c3 g7g6 +f2f4 b8c6 +d4c6 b7c6 +e4e5 d6e5 +d1d8 e8d8 +f4e5 f6g4 +c1f4 c8e6 +c3e4 f8g7 +e4g5 g7e5 +o-o-o d8c7 +g5e6 f7e6 +f4e5 g4e5 +d1e1 c7d6 +g2g3 e5g4 +f1c4 e6e5 +e1e2 +! # col. 34j +e2e4 c7c5 +g1f3 d7d6 +d2d4 c5d4 +f3d4 g8f6 +b1c3 g7g6 +f2f4 b8c6 +f1b5 d8c7 +c3d5 f6d5 +e4d5 a7a6 +b5c6 b7c6 +d4c6 c8b7 +c1e3 f8g7 +e3d4 g7d4 +d1d4 o-o +o-o b7c6 +! # col. 35l +e2e4 c7c5 +g1f3 d7d6 +d2d4 c5d4 +f3d4 g8f6 +b1c3 g7g6 +f2f4 b8d7 +f1e2 f8g7 +c1e3 o-o +e2f3 d7b6 +d1e2 e7e5 +d4b3 f6g4 +f3g4 d8h4 +g2g3 h4g4 +e2g4 c8g4 +! # col. 36a +e2e4 c7c5 +g1f3 d7d6 +d2d4 c5d4 +f3d4 g8f6 +b1c3 g7g6 +f1e2 f8g7 +c1e3 b8c6 +o-o o-o +d4b3 c8e6 +f2f4 c6a5 +f4f5 e6c4 +b3a5 c4e2 +d1e2 d8a5 +g2g4 a8c8 +g4g5 c8c3 +g5f6 c3e3 +e2e3 g7f6 +c2c3 f8c8 +a2a3 c8c4 +a1e1 b7b5 +! # col. 37c; Domnitz-Kraidman, Tel Aviv 1964 +e2e4 c7c5 +g1f3 d7d6 +d2d4 c5d4 +f3d4 g8f6 +b1c3 g7g6 +f1e2 f8g7 +c1e3 b8c6 +o-o o-o +d4b3 c8e6 +f2f4 d8c8 +d1e1 f6g4 +e2g4 e6g4 +f4f5 g6f5 +h2h3 g4h3 +g2h3 f5e4 +e1h4 f7f5 +g1h1 f8f7 +f1g1 c6e5 +c3d5 c8d7 +b3d4 e5g6 +g1g6 h7g6 +a1g1 e7e5 +g1g6 d7d8 +e3g5 d8a5 +d5f6 g8f8 +d4e6 +! # col. 38f; Unzicker-Geller, W. Germany-USSR 1960 (drawn) +e2e4 c7c5 +g1f3 d7d6 +d2d4 c5d4 +f3d4 g8f6 +b1c3 g7g6 +f1e2 f8g7 +c1e3 b8c6 +o-o o-o +d1d2 f6g4 +e2g4 c8g4 +f2f4 c6d4 +e3d4 e7e5 +d4e3 e5f4 +f1f4 g4e6 +f4f2 g7e5 +e3d4 a8c8 +a1d1 d8a5 +a2a3 c8c4 +c3e2 a5d2 +d1d2 +! # col. 39 +e2e4 c7c5 +g1f3 d7d6 +d2d4 c5d4 +f3d4 g8f6 +b1c3 g7g6 +f1e2 f8g7 +c1e3 b8c6 +o-o o-o +f2f4 d8b6 +d1d3 f6g4 +c3d5 g7d4 +e2g4 d4e3 +d3e3 b6b2 +g4c8 a8c8 +a1b1 b2a2 +b1b7 e7e6 +! # col. 40h +e2e4 c7c5 +g1f3 d7d6 +d2d4 c5d4 +f3d4 g8f6 +b1c3 g7g6 +f1e2 f8g7 +c1e3 b8c6 +o-o o-o +f2f4 d8b6 +e4e5 d6e5 +f4e5 c6e5 +d4f5 b6b2 +f5e7 g8h8 +e3d4 b2b4 +d4e5 b4e7 +d1d4 f6e8 +e5g7 e8g7 +e2d3 c8e6 +! # col. 41b; Smyslov-Botvinnik, match 1958 +e2e4 c7c5 +g1f3 d7d6 +d2d4 c5d4 +f3d4 g8f6 +b1c3 g7g6 +f1e2 f8g7 +c1e3 b8c6 +h2h4 h7h5 +f2f3 o-o +d1d2 d6d5 +d4c6 b7c6 +e4e5 f6e8 +f3f4 f7f6 +o-o-o f6e5 +f4e5 g7e5 +g2g4 c8g4 +e2g4 h5g4 +h4h5 g6g5 +! # col. 42d; Van den Burg-Rajkovic, Orebro 1966 +e2e4 c7c5 +g1f3 d7d6 +d2d4 c5d4 +f3d4 g8f6 +b1c3 g7g6 +f1e2 f8g7 +c1e3 b8c6 +d4b3 o-o +f2f4 c6a5 +g2g4 b7b6 +g4g5 f6d7 +o-o c8b7 +e2d3 a8c8 +b3a5 b6a5 +d1e1 d7c5 +f4f5 g7e5 +e1h4 e7e6 +f5f6 h7h5 +d3e2 g8h7 +e2h5 f8h8 +! # col. 43f +e2e4 c7c5 +g1f3 d7d6 +d2d4 c5d4 +f3d4 g8f6 +b1c3 g7g6 +f1e2 f8g7 +c1e3 b8c6 +d4b3 o-o +f2f4 c6a5 +g2g4 c8e6 +g4g5 f6d7 +e3d4 f7f6 +h2h4 f6g5 +d4g7 g8g7 +b3d4 e6g8 +f4f5 d8b6 +! # col. 44 +e2e4 c7c5 +g1f3 d7d6 +d2d4 c5d4 +f3d4 g8f6 +b1c3 g7g6 +f1e2 f8g7 +o-o b8c6 +d4b3 o-o +f2f4 b7b5 +e2f3 b5b4 +c3d5 f6d5 +e4d5 c6a5 +b3a5 d8a5 +f1e1 f8e8 +! # col. 45i; Smyslov-Korchnoi, Moscow 1960 +e2e4 c7c5 +g1f3 d7d6 +d2d4 c5d4 +f3d4 g8f6 +b1c3 g7g6 +f1e2 f8g7 +d4b3 b8c6 +g2g4 b7b6 +f2f4 c8b7 +e2f3 o-o +h2h4 a7a5 +a2a4 c6b4 +h4h5 d6d5 +e4e5 f6g4 +b3d4 g4h6 +h5g6 f7g6 +d4e6 d8d7 +e6f8 a8f8 +c3b5 d5d4 +! # col. 46 +e2e4 c7c5 +g1f3 d7d6 +d2d4 c5d4 +f3d4 g8f6 +f2f3 e7e5 +f1b5 c8d7 +b5d7 b8d7 +d4f5 d6d5 +e4d5 d8a5 +b1c3 d7b6 +! # col. 47h; Schweber-Najdorf, Buenos Aires 1970 +e2e4 c7c5 +g1f3 d7d6 +d2d4 c5d4 +d1d4 b8c6 +f1b5 c8d7 +b5c6 d7c6 +c2c4 g8f6 +b1c3 e7e6 +c1g5 f8e7 +o-o o-o +f1e1 h7h6 +g5h4 a7a6 +a1d1 d8a5 +d4d2 a5b6 +f3d4 a8c8 +e1e3 f8e8 +! # col. 48i +e2e4 c7c5 +g1f3 d7d6 +d2d4 c5d4 +d1d4 a7a6 +c1e3 g8f6 +b1c3 b8c6 +d4b6 d8b6 +e3b6 g7g6 +o-o-o f8h6 +c1b1 o-o +f3d4 c8d7 +f2f3 c6e5 +d4b3 f8c8 +b3a5 d7c6 +c3d5 c6d5 +e4d5 f6d7 +b6d4 b7b6 +! # col. 49m; Fischer-Korchnoi, Buenos-Aires 1960 +e2e4 c7c5 +g1f3 d7d6 +d2d4 c5d4 +c2c3 d4c3 +b1c3 b8c6 +f1c4 e7e6 +o-o a7a6 +d1e2 g8f6 +f1d1 d8c7 +c1g5 f8e7 +a1c1 o-o +c4b3 h7h6 +g5f4 e6e5 +f4e3 c7d8 +c3d5 f6d5 +b3d5 c8d7 +! # col. 50 +e2e4 c7c5 +g1f3 d7d6 +d2d4 g8f6 +d4c5 f6e4 +c5d6 e7e6 +d1d3 e4d6 +b1c3 b8c6 +c1f4 f7f6 +o-o-o e6e5 +c3b5 +! # col. 51c; Pfeiffer-Kottnauer, Helsinki 1952 +e2e4 c7c5 +g1f3 d7d6 +c2c3 g8f6 +f1d3 b8c6 +d3c2 c8g4 +h2h3 g4h5 +d2d3 d6d5 +d1e2 e7e6 +b1d2 f8e7 +d2f1 d8a5 +! # col. 52d; Brasket-Evans, U.S. Open Chp. 1960 +e2e4 c7c5 +g1f3 d7d6 +c2c3 g8f6 +d2d3 g7g6 +g2g3 f8g7 +b1d2 o-o +f1g2 e7e5 +o-o b8c6 +a2a4 h7h6 +d2b1 d8a5 +! # col. 53h; Ciocaltea-Fischer, Varna 1962 +e2e4 c7c5 +g1f3 d7d6 +g2g3 g7g6 +f1g2 f8g7 +o-o b8c6 +c2c3 e7e5 +d2d3 g8e7 +f3h4 o-o +f2f4 e5f4 +g3f4 f7f5 +b1d2 g8h8 +d2f3 +! # col. 54k; Tarjan-Mednis, U.S. Chp. 1973 +e2e4 c7c5 +g1f3 b8c6 +d2d4 c5d4 +f3d4 g8f6 +b1c3 e7e6 +f1e2 g7g6 +d4b3 +! e2e4 c7c5 +g1f3 d7d6 +b1c3 g8f6 +e4e5 d6e5 +f3e5 a7a6 +f1e2 e7e6 +o-o d8c7 +e5c4 b7b5 +c4e3 f8d6 +h2h3 b8c6 +a2a4 b5b4 +c3b1 c8b7 +d2d3 c6d4 +b1d2 o-o +d2f3 d4e2 +d1e2 f8e8 +e3c4 e6e5 +f3g5 e5e4 +c4d6 c7d6 +g5e4 f6e4 +d3e4 b7e4 +c1e3 d6c6 +! # col. 55o; Medina-Pomar, Santander 1947 +e2e4 c7c5 +g1f3 d7d6 +b2b4 c5b4 +d2d4 g8f6 +f1d3 d6d5 +b1d2 d5e4 +d2e4 b8d7 +e4g5 d8c7 +c2c4 h7h6 +g5h3 g7g5 +h3g1 f8g7 +g1e2 e7e5 +e2g3 e5e4 +d1e2 o-o +! # col. 56e; del Corral-Benko, Mallorca 1968 +e2e4 c7c5 +g1f3 d7d6 +f1b5 c8d7 +b5d7 d8d7 +o-o b8c6 +f1e1 g8f6 +c2c3 e7e6 +d2d3 f8e7 +a2a4 o-o +b1d2 d7c7 +! # col. 57g; Radovich-Lombardy, Leipzig 1960 +e2e4 c7c5 +g1f3 d7d6 +f1b5 b8c6 +o-o a7a6 +b5c6 b7c6 +d2d4 c5d4 +d1d4 e7e5 +d4d3 f7f6 +c2c4 c8e6 +b1c3 d8c7 +! # col. 58j; Gurgenidze-Osnos, Alma Ata 1969 +e2e4 c7c5 +g1f3 b8c6 +f1b5 e7e6 +b1c3 g8e7 +o-o a7a6 +b5c6 e7c6 +d2d4 c5d4 +f3d4 d7d6 +d4c6 b7c6 +d1g4 g7g6 +e4e5 d6d5 +c1g5 f8e7 +! # col. 59m +e2e4 c7c5 +g1f3 b8c6 +f1b5 g7g6 +o-o f8g7 +c2c3 g8f6 +f1e1 o-o +d2d4 c5d4 +c3d4 d7d5 +e4e5 f6e4 +b1c3 e4c3 +b2c3 c6a5 +c1g5 c8f5 +f3d2 f8e8 +! # col. 60o +e2e4 c7c5 +g1f3 b8c6 +f1b5 g7g6 +o-o f8g7 +f1e1 e7e5 +f1e1 o-o +d2d4 c5d4 +c3d4 d7d5 +e4e5 f6e4 +b1c3 e4c3 +b2c3 c6a5 +c1g5 c8f5 +f3d2 f8e8 +! # col. 61c; Barczay-Szilagyi, Hungarian Chp. 1969 +e2e4 c7c5 +g1f3 b8c6 +d2d4 c5d4 +f3d4 g8f6 +b1c3 d7d6 +c1g5 c8d7 +g5f6 g7f6 +d4b3 h8g8 +g2g3 f6f5 +d1d2 f8g7 +e4f5 d7f5 +f1g2 d8d7 +o-o g7c3 +b2c3 f5h3 +g2h3 d7h3 +! # col. 62e +e2e4 c7c5 +g1f3 b8c6 +d2d4 c5d4 +f3d4 g8f6 +b1c3 d7d6 +c1g5 c8d7 +d4b3 h7h6 +g5h4 a8c8 +f1e2 g7g5 +h4g3 h6h5 +h2h4 g5g4 +g3f4 c6e5 +d1d4 e5g6 +f4g5 f8g7 +o-o +! # col. 63g; Matulovic-Masic, Sombor 1968 +e2e4 c7c5 +g1f3 b8c6 +d2d4 c5d4 +f3d4 g8f6 +b1c3 d7d6 +c1g5 c8d7 +f2f4 d8b6 +d4b3 f6g4 +d1e2 c6d4 +c3d5 d4e2 +d5b6 a7b6 +e1e2 h7h6 +g5h4 g7g5 +h4g3 g5f4 +g3f4 f8g7 +c2c3 d7c6 +! # col. 64j; Liberzo-Stein, USSR Chp. 1969-70. Complete game (draw). +e2e4 c7c5 +g1f3 b8c6 +d2d4 c5d4 +f3d4 g8f6 +b1c3 d7d6 +c1g5 c8d7 +d1d3 c6d4 +d3d4 d8a5 +f2f4 e7e5 +d4d3 f8e7 +o-o-o d7c6 +c1b1 e5f4 +g5f4 o-o +f1e2 f8e8 +e2f3 e7f8 +c3d5 f6d7 +d3d2 a5d2 +d1d2 a8c8 +h1d1 d7e5 +b2b3 +! # col. 65m; Bronstein-Stein, USSR 1969 +e2e4 c7c5 +g1f3 b8c6 +d2d4 c5d4 +f3d4 g8f6 +b1c3 d7d6 +c1g5 c8d7 +d1d3 c6d4 +d3d4 d8a5 +f1e2 e7e5 +d4d3 a5c7 +e2g4 f8e7 +g5f6 e7f6 +o-o-o f6e7 +c3b5 d7b5 +d3b5 c7c6 +b5d5 c6d5 +d1d5 +! # col. 66b; Benko-R. Byrne, US Open Chp. 1968 +e2e4 c7c5 +g1f3 b8c6 +d2d4 c5d4 +f3d4 g8f6 +b1c3 d7d6 +c1g5 c8d7 +d1d2 a8c8 +o-o-o c6d4 +d2d4 d8a5 +g5d2 a7a6 +f1c4 a5c5 +d4c5 c8c5 +c4b3 g7g6 +d2e3 c5c8 +e3d4 f8g7 +c3d5 f6h5 +d4g7 h5g7 +e4e5 c8c6 +d5b4 c6b6 +! # col. 66b alternate; Polgar-Nagy, Hungarian Chp. 1972 +e2e4 c7c5 +g1f3 b8c6 +d2d4 c5d4 +f3d4 g8f6 +b1c3 d7d6 +c1g5 c8d7 +d1d2 a8c8 +o-o-o c6d4 +d2d4 d8a5 +g5d2 e7e5 +d4d3 a7a6 +c1b1 h7h6 +f2f3 a5c7 +g2g3 f8e7 +h2h4 b7b5 +! # col. 67c; Suetin-Gheorghiu, Hastings 1967/8. Draw. +e2e4 c7c5 +g1f3 b8c6 +d2d4 c5d4 +f3d4 g8f6 +b1c3 d7d6 +c1g5 c8d7 +d1d2 a8c8 +o-o-o c6d4 +d2d4 d8a5 +g5e3 a7a6 +f2f3 e7e6 +d4b6 a5b6 +e3b6 d7c6 +f1c4 c6e4 +c4e6 f7e6 +c3e4 f6e4 +f3e4 f8e7 +h1f1 e7g5 +c1b1 e8e7 +c2c3 h8f8 +b1c2 f8f1 +d1f1 c8f8 +! # col. 68d +e2e4 c7c5 +g1f3 b8c6 +d2d4 c5d4 +f3d4 g8f6 +b1c3 d7d6 +c1g5 c8d7 +d1d2 a8c8 +o-o-o c6d4 +d2d4 d8a5 +f2f4 e7e6 +e4e5 d6e5 +f4e5 c8c3 +g5d2 a5a2 +d2c3 g7g6 +! # col. 69fA1; Janosevic-Larsen, Belgrade 1964 +e2e4 c7c5 +g1f3 b8c6 +d2d4 c5d4 +f3d4 g8f6 +b1c3 d7d6 +c1g5 c8d7 +d1d2 a8c8 +o-o-o c6d4 +d2d4 d8a5 +f2f4 c8c3 +b2c3 e7e5 +d4b4 a5b4 +c3b4 f6e4 +f1c4 b7b5 +c4d5 e4c3 +f4e5 h7h6 +g5h4 g7g5 +h4g3 c3e2 +c1b2 e2g3 +h2g3 f8g7 +! # col. 70g; Bednarski-Simagin, Polanica Zdroj 1968 +e2e4 c7c5 +g1f3 b8c6 +d2d4 c5d4 +f3d4 g8f6 +b1c3 d7d6 +c1g5 c8d7 +d1d2 a8c8 +o-o-o c6d4 +d2d4 c8c3 +d4c3 f6e4 +c3e3 e4g5 +e3g5 d8b6 +f1c4 e7e6 +g5g3 g7g6 +c4b3 f8e7 +h2h4 h7h5 +h1e1 b6b4 +g3e3 a7a5 +e3d4 +! # col. 71d +e2e4 c7c5 +g1f3 b8c6 +d2d4 c5d4 +f3d4 g8f6 +b1c3 d7d6 +c1g5 e7e6 +d1d2 f8e7 +o-o-o c6d4 +d2d4 o-o +f2f4 h7h6 +g5h4 d8a5 +f1c4 e6e5 +f4e5 d6e5 +d4d3 a5c5 +h4f6 e7f6 +! # col. 72g +e2e4 c7c5 +g1f3 b8c6 +d2d4 c5d4 +f3d4 g8f6 +b1c3 d7d6 +c1g5 e7e6 +d1d2 f8e7 +o-o-o c6d4 +d2d4 o-o +f2f4 d8a5 +f1c4 c8d7 +c4b3 d7c6 +h1f1 b7b5 +g5f6 e7f6 +d4d6 f6c3 +d6c6 a8c8 +c6d7 c8d8 +d7e7 c3d2 +c1b1 d2f4 +d1d8 a5d8 +! # col. 73i +e2e4 c7c5 +g1f3 b8c6 +d2d4 c5d4 +f3d4 g8f6 +b1c3 d7d6 +c1g5 e7e6 +d1d2 f8e7 +o-o-o o-o +d4b3 d8b6 +f2f3 a7a6 +g2g4 f8d8 +g5e3 b6c7 +h2h4 b7b5 +g4g5 f6d7 +g5g6 f7g6 +h4h5 g6h5 +h1h5 d7f6 +h5g5 c6e5 +d2g2 e7f8 +f3f4 e5c4 +f1c4 b5c4 +b3d4 a8b8 +d1g1 b8b7 +! # col. 74; Tal-Larsen, match 1969 +e2e4 c7c5 +g1f3 b8c6 +d2d4 c5d4 +f3d4 g8f6 +b1c3 d7d6 +c1g5 e7e6 +d1d2 f8e7 +o-o-o o-o +d4b3 a7a6 +g5f6 g7f6 +f1e2 g8h8 +e2h5 c8d7 +f2f4 b7b5 +c1b1 +! # col. 75k +e2e4 c7c5 +g1f3 b8c6 +d2d4 c5d4 +f3d4 g8f6 +b1c3 d7d6 +c1g5 e7e6 +d1d2 f8e7 +o-o-o o-o +d4b5 d8a5 +g5f6 e7f6 +b5d6 f8d8 +f2f4 e6e5 +d2d5 a5c7 +f4f5 c6d4 +d6b5 c7a5 +d5c4 c8f5 +b2b4 a5a6 +! # col. 76b; Spasski-Larsen, Santa Monica 1966 +e2e4 c7c5 +g1f3 b8c6 +d2d4 c5d4 +f3d4 g8f6 +b1c3 d7d6 +c1g5 e7e6 +d1d2 f8e7 +o-o-o o-o +f2f4 h7h6 +g5h4 e6e5 +d4f5 c8f5 +e4f5 d8a5 +c1b1 a8d8 +h4f6 e7f6 +c3d5 a5d2 +d5f6 g7f6 +d1d2 e5f4 +! # col. 77e; Kujpers-Minev, Halle 1967 +e2e4 c7c5 +g1f3 b8c6 +d2d4 c5d4 +f3d4 g8f6 +b1c3 d7d6 +c1g5 e7e6 +d1d2 f8e7 +o-o-o o-o +f2f4 d6d5 +e4e5 f6d7 +h2h4 d7b6 +d2e3 c8d7 +g5e7 d8e7 +h4h5 c6a5 +d4b3 a5c4 +e3d4 f8c8 +c1b1 a7a5 +f4f5 a5a4 +f5f6 e7f8 +h1h3 c4b2 +b1b2 b6c4 +f1c4 c8c4 +d4d2 +! # col. 78h +e2e4 c7c5 +g1f3 b8c6 +d2d4 c5d4 +f3d4 g8f6 +b1c3 d7d6 +c1g5 e7e6 +d1d2 a7a6 +o-o-o c8d7 +f2f4 h7h6 +g5h4 f6e4 +d2e1 e4f6 +d4f5 d8a5 +f5d6 f8d6 +d1d6 o-o-o +d6d1 e6e5 +f1c4 e5f4 +c3e4 d7e6 +c4e6 f7e6 +e4d6 c8b8 +e1e6 h8f8 +! # col. 79j; O'Kelly-Simagin corr. 1964 +e2e4 c7c5 +g1f3 b8c6 +d2d4 c5d4 +f3d4 g8f6 +b1c3 d7d6 +c1g5 e7e6 +d1d2 a7a6 +o-o-o h7h6 +g5h4 f6e4 +d2f4 e4g5 +d4c6 b7c6 +f4a4 d8b6 +f2f4 g5h7 +f4f5 f8e7 +c3e4 a8b8 +a4a3 b6b5 +! # col. 80k; Di Camillo-R. Byrne, US Open Chp. 1958 +e2e4 c7c5 +g1f3 b8c6 +d2d4 c5d4 +f3d4 g8f6 +b1c3 d7d6 +c1g5 e7e6 +d1d2 h7h6 +g5f6 g7f6 +o-o-o a7a6 +f2f4 c8d7 +f1e2 h6h5 +c1b1 d8b6 +d4b3 o-o-o +h1f1 f8e7 +c3a4 b6a7 +c2c4 c6d4 +! # col. 81b +e2e4 c7c5 +g1f3 b8c6 +d2d4 c5d4 +f3d4 g8f6 +b1c3 d7d6 +c1g5 e7e6 +d4c6 b7c6 +e4e5 d6e5 +d1f3 f8e7 +f3c6 c8d7 +c6f3 e5e4 +c3e4 f6e4 +g5e7 d8a5 +! # col. 82e +e2e4 c7c5 +g1f3 b8c6 +d2d4 c5d4 +f3d4 g8f6 +b1c3 d7d6 +c1g5 e7e6 +d1d3 f8e7 +a1d1 o-o +f1e2 c8d7 +o-o c6d4 +d3d4 d7c6 +g1h1 d8a5 +f2f4 f8e8 +! # col. 83 +e2e4 c7c5 +g1f3 b8c6 +d2d4 c5d4 +f3d4 g8f6 +b1c3 d7d6 +h2h3 g7g6 +c1e3 f8g7 +d1d2 o-o +o-o-o c6d4 +e3d4 d8a5 +c1b1 e7e5 +d4e3 c8e6 +! # BAD! -- col. 84i; Karaklajic-Taimanov, Yugoslavia-USSR, match 1956 +e2e4 c7c5 +g1f3 b8c6 +d2d4 c5d4 +f3d4 g8f6 +b1c3 d7d6 +c1e3 f6g4 +f1b5 g4e3 +f2e3 c8d7 +o-o e7e6 +5c6 b7c6 +e4e5 f8e7 +d1h5 o-o +e5d6 e7d6 +c3e4 d6e7 +a1d1 d8c7 +d4b3 h7h6 +! # col. 85 +e2e4 c7c5 +g1f3 b8c6 +d2d4 c5d4 +f3d4 g8f6 +b1c3 d7d6 +d4e2 e7e6 +g2g3 d6d5 +e4d5 f6d5 +f1g2 d5c3 +d1d8 e8d8 +e2c3 c8d7 +c1d2 f8e7 +! # col. 86c; Carcia-Pomar, Havana 1969 +e2e4 c7c5 +g1f3 b8c6 +d2d4 c5d4 +f3d4 g8f6 +b1c3 d7d6 +f1c4 e7e5 +d4e2 c8e6 +c4e6 f7e6 +o-o f8e7 +f2f4 o-o +e2g3 e5f4 +f1f4 d8b6 +g1h1 a8d8 +b2b3 d6d5 +e4d5 f6d5 +f4f8 e7f8 +c3d5 d8d5 +d1e1 c6d4 +c1e3 f8c5 +! # col. 87 +e2e4 c7c5 +g1f3 b8c6 +d2d4 c5d4 +f3d4 g8f6 +b1c3 d7d6 +f1c4 d8b6 +d4b3 e7e6 +o-o f8e7 +c1e3 b6c7 +f2f4 o-o +c4d3 a7a6 +d1f3 +! # col. 88 +e2e4 c7c5 +g1f3 b8c6 +d2d4 c5d4 +f3d4 g8f6 +b1c3 d7d6 +f1c4 e7e6 +c1e3 d8c7 +d1e2 a7a6 +c4b3 c6a5 +g2g4 b7b5 +g4g5 f6d7 +o-o-o d7c5 +! # col. 89mA; Spasjevic-Ostojic, Belgrade 1966 (draw) +e2e4 c7c5 +g1f3 b8c6 +d2d4 c5d4 +f3d4 g8f6 +b1c3 d7d6 +f1c4 e7e6 +c1e3 f8e7 +d1e2 a7a6 +o-o-o o-o +c4b3 d8c7 +g2g4 c6d4 +d1d4 e6e5 +d4c4 c7d8 +g4g5 f6e8 +h1g1 c8d7 +c3d5 d7b5 +e3b6 d8d7 +e2g4 e7d8 +g4d7 b5d7 +c4c3 d7e6 +b6d8 a8d8 +d5e3 d8d7 +b3a4 d7c7 +! # col. 90o; Bogdanovic-Shamkovich, Sarajevo 1963 +e2e4 c7c5 +g1f3 b8c6 +d2d4 c5d4 +f3d4 g8f6 +b1c3 d7d6 +f1c4 e7e6 +c1e3 f8e7 +d1e2 o-o +o-o-o c6d4 +e3d4 d8a5 +e4e5 d6e5 +d4e5 b7b6 +c3b5 c8a6 +e5c3 a5a4 +d1d4 a6b5 +c4b5 a4a2 +h1d1 f8d8 +d4a4 d8d1 +e2d1 a2d5 +d1d5 f6d5 +c3d4 e7g5 +c1b1 h7h5 +b5c6 a8d8 +a4a7 d5b4 +c6d7 b4c6 +! # Queen's Catalan, col. 1c; Kramer-Fichtl, Varna Olympics 1962 +d2d4 d7d5 +c2c4 e7e6 +g2g3 g8f6 +g1f3 f8e7 +f1g2 o-o +o-o b8d7 +b1c3 c7c6 +b2b3 b7b6 +c1b2 c8b7 +d1c2 a8c8 +a1d1 d8c7 +e2e4 d5e4 +c3e4 f6e4 +c2e4 c6c5 +d4d5 e7f6 +e4c2 e6d5 +c4d5 f6b2 +c2b2 c8d8 +! # col. 2f +d2d4 d7d5 +c2c4 e7e6 +g2g3 g8f6 +g1f3 f8e7 +f1g2 o-o +o-o b8d7 +b1c3 d5c4 +e2e4 c7c6 +a2a4 a7a5 +d1e2 d7b6 +f1d1 e7b4 +f3e5 d8e7 +c1e3 c8d7 +e5c4 b6c4 +e2c4 e6e5 +d4e5 f6g4 +! # col. 3i; Geller-Medina, Beverwijk 1965 +d2d4 d7d5 +c2c4 e7e6 +g2g3 g8f6 +g1f3 f8e7 +f1g2 o-o +o-o b8d7 +d1c2 b7b6 +c4d5 f6d5 +b1c3 c8b7 +c3d5 b7d5 +e2e4 d5b7 +f1d1 c7c5 +d4d5 e6d5 +e4d5 e7f6 +h2h4 h7h6 +! # col. 4k; Geller-Bisguier, Bled 1961 +d2d4 d7d5 +c2c4 e7e6 +g2g3 g8f6 +g1f3 f8e7 +f1g2 o-o +o-o b8d7 +d1c2 c7c6 +b2b3 b7b6 +c1b2 c8b7 +b1c3 a8c8 +a1d1 b6b5 +c4c5 b5b4 +c3b1 f6e4 +f3e1 f7f5 +e1d3 a7a5 +d3f4 f8f6 +f2f3 e4g5 +! # col. 5m; Benko-Pachman, Budapest 1948 +d2d4 d7d5 +c2c4 e7e6 +g2g3 g8f6 +g1f3 f8e7 +f1g2 o-o +o-o b8d7 +d1c2 c7c6 +b1d2 b7b6 +e2e4 c8b7 +b2b3 a8c8 +f1d1 d8c7 +c1b2 f8d8 +a1c1 c7b8 +c2b1 a7a5 +f3e5 b8a8 +! # col. 6 +d2d4 d7d5 +c2c4 e7e6 +g2g3 g8f6 +g1f3 f8e7 +f1g2 o-o +o-o c7c6 +b1c3 b7b6 +f3e5 a7a5 +d1c2 c8a6 +f1d1 b6b5 +! # col. 7d; Evans-Poschel, US Jr. Chp. 1947 +d2d4 d7d5 +c2c4 e7e6 +g2g3 g8f6 +g1f3 c7c5 +c4d5 f6d5 +f1g2 c5d4 +o-o f8c5 +f3d4 o-o +a2a3 b8c6 +d4c6 b7c6 +b2b4 c5e7 +c1b2 e7f6 +d1c2 f6b2 +c2b2 a7a5 +! # col. 8g; O'Kelly-Euwe, New York 1951 +d2d4 d7d5 +c2c4 e7e6 +g2g3 g8f6 +g1f3 d5c4 +f1g2 c7c5 +o-o b8c6 +d1a4 f6d7 +d4c5 f8c5 +a4c4 o-o +b1c3 a7a6 +c3e4 c5e7 +c1e3 d7b6 +c4b3 b6d5 +f1d1 d8c7 +! # col. 9 +d2d4 d7d5 +c2c4 e7e6 +g2g3 g8f6 +g1f3 d5c4 +f1g2 b7b5 +a2a4 c7c6 +o-o c8b7 +f3e5 d8c8 +b2b3 c4b3 +d1b3 b5b4 +a4a5 f6d7 +! # col. 10l; Keres-Korchnoi, Curacao 1962 +d2d4 d7d5 +c2c4 e7e6 +g2g3 g8f6 +g1f3 d5c4 +d1a4 b8d7 +f1g2 a7a6 +a4c4 c7c5 +d4c5 f8c5 +o-o b7b5 +c4h4 c8b7 +b1d2 c5e7 +d2b3 a8c8 +h4d4 o-o +c1d2 d7c5 +! # col. -- Accelerated Catalan +d2d4 d7d5 +c2c4 e7e6 +g2g3 g8f6 +f1g2 d5c4 +d1a4 b8d7 +b1d2 c7c6 +a4c4 e6e5 +g1f3 d7b6 +c4d3 e5d4 +f3d4 f8e7 +o-o o-o +! # col. 12e; Muller-Ratzek, Vienna 1951 +d2d4 d7d5 +c2c4 e7e6 +g2g3 g8f6 +f1g2 d5c4 +d1a4 c8d7 +a4c4 d7c6 +g1f3 c6d5 +c4d3 c7c5 +b1c3 d5c6 +o-o b8d7 +f1d1 d8b6 +e2e4 c5d4 +f3d4 f8c5 +d4c6 c5f2 +g1f1 b7c6 +c3a4 b6a5 +f1f2 a5a4 +d3d6 +! # col. 13f; Smyslov-Kere, USSR Chp. 1948 +d2d4 d7d5 +c2c4 e7e6 +g2g3 g8f6 +f1g2 d5c4 +d1a4 c8d7 +a4c4 d7c6 +g1f3 b8d7 +b1c3 d7b6 +c4d3 f8b4 +o-o o-o +f1d1 h7h6 +c1d2 d8e7 +a2a3 b4c3 +d3c3 f8d8 +! # col. 14g +d2d4 d7d5 +c2c4 e7e6 +g2g3 g8f6 +b1c3 d5c4 +d1a4 b8c6 +f1g2 c8d7 +a4c4 c6b4 +c4b3 c7c5 +g1f3 c5d4 +f3d4 e6e5 +d4f3 d7e6 +b3a4 e6d7 +! # col. 15; Stoltz-Vidmar, Groningen 1946 +d2d4 d7d5 +c2c4 e7e6 +g2g3 g8f6 +b1c3 f8e7 +f1g2 o-o +g1f3 d5c4 +d1a4 a7a6 +a4c4 b7b5 +c4d3 c8b7 +! # col. 16 +d2d4 d7d5 +c2c4 e7e6 +g2g3 g8f6 +b1d2 c7c5 +d4c5 f8c5 +f1g2 b8c6 +g1f3 o-o +o-o a7a5 +c4d5 e6d5 +d2b3 c5b6 +! # col. 17d; Mikenas-Aronin, USSR Chp. 1963 +d2d4 d7d5 +c2c4 e7e6 +g2g3 c7c5 +c4d5 e6d5 +g1f3 b8c6 +f1g2 g8f6 +o-o f8e7 +d4c5 e7c5 +b1d2 o-o +d2b3 c5b6 +b3d4 f8e8 +b2b3 c6d4 +f3d4 b6d4 +d1d4 e8e2 +! # col. 18e +d2d4 d7d5 +c2c4 e7e6 +g2g3 d5c4 +d1a4 c8d7 +a4c4 c7c5 +d4c5 d7c6 +g1f3 b8d7 +c1e3 g8f6 +f1g2 d8c7 +o-o c6d5 +c4a4 f8c5 +e3c5 c7c5 +b1c3 d5c6 +! # col. 19 +d2d4 d7d5 +c2c4 e7e6 +g2g3 f8b4 +c1d2 b4d2 +d1d2 g8f6 +g1f3 o-o +f1g2 d8e7 +o-o b8c6 +f1c1 +! # col. 20 +d2d4 d7d5 +c2c4 e7e6 +g2g3 f8b4 +c1d2 b4e7 +f1g2 g8f6 +g1f3 o-o +d1b3 b7b6 +c4d5 e6d5 +b1c3 c8b7 +o-o +! # col. 21 +d2d4 g8f6 +c2c4 e7e6 +g2g3 e6e5 +g1f3 e5d4 +f3d4 d7d5 +f1g2 d5c4 +d1a4 c7c6 +a4c4 f8e7 +o-o o-o +f1d1 +! # col. 22 +d2d4 g8f6 +c2c4 e7e6 +g2g3 c7c5 +g1f3 c5d4 +f3d4 d7d5 +f1g2 e6e5 +d4f3 d5d4 +o-o b8c6 +e2e3 f8e7 +e3d4 e5d4 +! # col. 23g +d2d4 g8f6 +c2c4 e7e6 +g2g3 c7c5 +g1f3 c5d4 +f3d4 b8c6 +f1g2 d8b6 +d4c2 f8c5 +e2e3 o-o +b1c3 b6a6 +d1d2 f8d8 +a2a3 d7d5 +b2b4 d5d4 +c3e4 +! # col. 24j; Smyslov-Petrosian, Moscow 1967 +d2d4 g8f6 +c2c4 e7e6 +g2g3 f8b4 +b1d2 c7c5 +d4c5 b4c5 +f1g2 b8c6 +g1f3 b7b6 +o-o c8b7 +a2a3 o-o +b2b4 c5e7 +c1b2 a8c8 +d1b1 +! # col. 25 +d2d4 g8f6 +c2c4 e7e6 +g2g3 f8b4 +c1d2 b4d2 +d1d2 f6e4 +d2c2 f7f5 +f2f3 e4f6 +e2e4 f5e4 +f3e4 e6e5 +! # Alternate openings leading to the Catalan, line C +g1f3 d7d5 +c2c4 e7e6 +g2g3 g8f6 +d2d4 +! # line D +c2c4 g8f6 +d2d4 e7e6 +g2g3 d7d5 +! # line E +d2d4 g8f6 +c2c4 e7e6 +g2g3 d7d5 +! # The Reti Opening, col. 1c; Muller-Lilenthal, Budapest 1933 +g1f3 d7d5 +c2c4 c7c6 +b2b3 g8f6 +g2g3 c8f5 +c1b2 e7e6 +f1g2 b8d7 +o-o f8d6 +d2d3 o-o +b1c3 d8e7 +f1e1 e6e5 +c4d5 c6d5 +e2e4 d5e4 +d3e4 f5g6 +! # col. 2g; Bilek-Geller, Sousse 1967 +g1f3 d7d5 +c2c4 c7c6 +b2b3 g8f6 +g2g3 c8g4 +f1g2 e7e6 +c1b2 b8d7 +o-o f8e7 +d2d3 o-o +b1d2 a7a5 +a2a3 d8b6 +d1c2 h7h6 +b2c3 f8c8 +f1e1 b6d8 +e2e4 d8f8 +! # col. 3k; Botvinnik-Fine, Nottingham 1936 +g1f3 d7d5 +c2c4 d5c4 +b1a3 c7c5 +a3c4 b8c6 +g2g3 e7e5 +f1g2 f7f6 +b2b3 g8e7 +c1b2 e7d5 +o-o f8e7 +f3h4 o-o +d1b1 f8f7 +h4f5 c8e6 +f2f4 e5f4 +g3f4 d5b6 +g2e4 e6c4 +! # col. 4n; Katetov-Alekhin, Prague 1943 +g1f3 d7d5 +c2c4 d5d4 +e2e3 b8c6 +e3d4 c6d4 +f3d4 d8d4 +b1c3 e7e5 +d2d3 f8c5 +c1e3 d4d6 +c3b5 d6e7 +e3c5 e7c5 +d3d4 e5d4 +d1d4 c5d4 +b5d4 c8g4 +! # col. 5o +g1f3 d7d5 +c2c4 d5d4 +e2e3 c7c5 +e3d4 c5d4 +g2g3 b8c6 +f1g2 g7g6 +d2d3 f8g7 +o-o e7e5 +f1e1 f7f6 +b2b4 c6b4 +d1a4 b4c6 +f3d4 d8d4 +g2c6 c8d7 +! # col. 6 +g1f3 d7d5 +c2c4 e7e6 +g2g3 g8f6 +f1g2 f8e7 +o-o o-o +b2b3 c7c5 +c4d5 f6d5 +c1b2 b8c6 +d2d4 d5b4 +a2a3 b4a6 +d4c5 d8d1 +! # col. 7 +g1f3 d7d5 +c2c4 e7e6 +g2g3 g8f6 +f1g2 f8e7 +b1c3 o-o +b2b3 c7c5 +c1b2 b8c6 +c4d5 e6d5 +a1c1 c8e6 +o-o a8c8 +d2d4 f8e8 +! # col. 8g; Kashdan-Horowitz, New York 1931 +g1f3 d7d5 +c2c4 e7e6 +g2g3 g8f6 +f1g2 b8d7 +b2b3 c7c6 +o-o f8d6 +c1b2 o-o +b1c3 b7b6 +d2d3 c8b7 +e2e4 d5e4 +d3e4 d8c7 +d1e2 f8d8 +f1d1 +! # col. 9h; Abroshin-Krykov corr. 1960 +g1f3 d7d5 +c2c4 e7e6 +g2g3 g8f6 +f1g2 d5c4 +d1a4 c8d7 +a4c4 d7c6 +o-o c6d5 +c4a4 d8d7 +a4c2 b8c6 +b1c3 d5f3 +g2f3 c6d4 +c2d3 c7c6 +! # col. 10m; Teti-Tartakover, Semmering 1926 +g1f3 d7d5 +c2c4 e7e6 +g2g3 d5c4 +d1a4 c8d7 +a4c4 c7c5 +f3e5 b8c6 +e5d7 d8d7 +f1g2 g8f6 +d2d3 f8e7 +o-o c6d4 +b1c3 a8d8 +a2a4 f6d5 +! # Barcza System, col. 11 +g1f3 d7d5 +g2g3 g8f6 +f1g2 c8f5 +o-o c7c6 +c2c4 d5c4 +b1a3 e7e5 +a3c4 e5e4 +f3e1 f8c5 +d2d3 o-o +c1e3 b8d7 +! # col. 12d; Benko-Petrosian, Curacao 1962 +g1f3 d7d5 +g2g3 g8f6 +f1g2 c8f5 +o-o c7c6 +d2d3 b8d7 +b1d2 h7h6 +d1e1 e7e6 +e2e4 f5h7 +e1e2 f8e7 +e4e5 f6g8 +d2b3 e7f8 +c2c4 g8e7 +b3d4 e7f5 +d4f5 h7f5 +c4d5 c6d5 +d3d4 a7a5 +c1e3 f8e7 +f1c1 o-o +! # col. 13f; Bronstein-O'Kelly, Beverwijk 1963 +g1f3 d7d5 +g2g3 g8f6 +f1g2 c7c5 +o-o e7e6 +d2d3 b8c6 +b1d2 f8e7 +e2e4 o-o +f1e1 d8c7 +e4e5 f6d7 +d1e2 b7b5 +h2h4 a7a5 +d2f1 c8a6 +f1h2 c6b4 +h4h5 +! # col. 14i; Evans-Olafsson, Dallas 1957 +g1f3 d7d5 +g2g3 g8f6 +f1g2 g7g6 +o-o f8g7 +d2d3 o-o +b1d2 b8c6 +e2e4 e7e5 +c2c3 a7a5 +f1e1 d5e4 +d3e4 f6d7 +d1e2 b7b6 +d2c4 c8a6 +g2f1 d8f6 +! # col. 15 +g1f3 d7d5 +g2g3 g8f6 +f1g2 g7g6 +d2d4 f8g7 +o-o c7c6 +b2b3 b8d7 +c1b2 e7e5 +d4e5 f6g4 +b1d2 d7e5 +f3e5 g4e5 +! # col. 16d; Larsen-Mecking, Mallorca 1969 +g1f3 d7d5 +g2g3 c7c5 +f1g2 b8c6 +o-o e7e6 +d2d3 g7g6 +b1c3 f8g7 +a2a3 g8e7 +a1b1 o-o +c1d2 a8b8 +b2b4 c5b4 +a3b4 b7b5 +e2e4 a7a5 +! # col. 17h; Benko-Bisguier, US Chp. 1963 +g1f3 d7d5 +g2g3 c8g4 +f1g2 b8d7 +c2c4 c7c6 +c4d5 c6d5 +b1c3 e7e6 +d1b3 d8b6 +b3b6 d7b6 +d2d3 a8c8 +c1e3 f8d6 +c3b5 d6b8 +o-o g8e7 +f1c1 c8c1 +a1c1 e7c6 +f3d4 e8d7 +! # col. 18j; Keene-Basman, Hastings 1966-7 +g1f3 d7d5 +g2g3 c8g4 +f1g2 g8f6 +c2c4 c7c6 +c4d5 g4f3 +g2f3 c6d5 +d1b3 d8d7 +b1c3 e7e6 +o-o b8c6 +f3g2 f8e7 +d2d3 o-o +! # col. 19k +g1f3 d7d5 +g2g3 c8g4 +f1g2 g8f6 +c2c4 c7c6 +d1c2 e7e6 +o-o f8e7 +b2b3 b8d7 +c1b2 o-o +d2d3 a7a5 +b1d2 a5a4 +b2c3 a4b3 +a2b3 d8b6 +! # col. 20m +g1f3 d7d5 +g2g3 c8g4 +f1g2 g8f6 +o-o c7c6 +c2c4 e7e6 +c4d5 g4f3 +g2f3 c6d5 +b1c3 b8c6 +d2d3 f8e7 +f3g2 +! # col. 21b; Savon-Aronin, USSR 1963 +g1f3 d7d5 +g2g3 b8c6 +d2d4 c8f5 +f1g2 c6b4 +b1a3 e7e6 +o-o g8f6 +f3h4 f5g4 +c2c4 c7c6 +a3c2 b4c2 +d1c2 f8e7 +h2h3 g4h5 +f2f3 h5g6 +h4g6 h7g6 +! # col. 22d; Fischer-Ivkov, Santa Monica 1966 +g1f3 d7d5 +g2g3 e7e6 +f1g2 c7c5 +o-o b8c6 +d2d3 f8d6 +e2e4 g8e7 +b1d2 o-o +f3h4 b7b6 +f2f4 d5e4 +d3e4 c8a6 +f1e1 c5c4 +c2c3 +! # col. 23 +g1f3 d7d5 +g2g3 b8d7 +c2c4 e7e6 +f1g2 g8f6 +b1c3 f8e7 +o-o o-o +d2d3 c7c5 +c4d5 e6d5 +c1g5 b7b6 +! # col. 24g; Benko-Bisguier, US Chp. 1976-7 +g1f3 d7d5 +g2g3 g8f6 +f1g2 b7b6 +c2c4 e7e6 +c4d5 e6d5 +o-o f8d6 +d2d4 o-o +b1c3 c7c6 +f3e5 c8b7 +c1g5 h7h6 +g5f6 d8f6 +f2f4 f8d8 +e2e4 +! # col. 25; Rabinovich-Rauser, Moscow 1934 +g1f3 d7d5 +b2b3 c8g4 +c1b2 b8d7 +c2c4 e7e6 +e2e3 g8f6 +f1e2 c7c6 +f3d4 g4e2 +d1e2 f8d6 +f2f4 o-o +! # col. 26e; Evans-Najdorf, Dallas 1967 +g1f3 c7c5 +g2g3 b8c6 +f1g2 g7g6 +o-o f8g7 +e2e4 d7d6 +c2c3 e7e5 +d2d3 g8h6 +f3e1 o-o +f2f4 e5f4 +c1f4 h6g4 +b1a3 g4e5 +g1h1 d8b6 +d1d2 c8e6 +! # col. 27h; Van den Pol-Barden, Holland v. England 1960 +g1f3 f7f5 +g2g3 g8f6 +f1g2 g7g6 +d2d3 f8g7 +b1d2 d7d6 +e2e4 e7e5 +d2c4 o-o +e4f5 g6f5 +c1e3 b8c6 +d3d4 e5e4 +! # col. 28m; Gufeld-Bokuchava, USSR Chp. prelims 1968 +g1f3 f7f5 +g2g3 g8f6 +f1g2 e7e6 +c2c4 f8e7 +o-o o-o +d2d3 d7d6 +b1c3 b8c6 +a1b1 a7a5 +a2a3 d8e8 +b2b4 a5b4 +a3b4 e6e5 +! # col. 29p; Lundin-Tartakover, Groningen 1946 +g1f3 f7f5 +g2g3 g8f6 +f1g2 e7e6 +c2c4 f8e7 +o-o o-o +b2b3 c7c5 +c1b2 b8c6 +b1c3 e6e5 +e2e3 d7d6 +d2d4 +! # col. 30 +g1f3 g7g6 +g2g3 f8g7 +f1g2 e7e5 +d2d3 b8c6 +e2e4 d7d6 +b1c3 g8e7 +c1e3 o-o +d1d2 c6d4 +o-o +! # King's Indian attack, col. 31a +g1f3 g8f6 +g2g3 b7b5 +h2h4 b5b4 +d2d3 c8b7 +e2e4 d7d6 +f1g2 b8d7 +o-o e7e6 +h4h5 a8b8 +b1d2 f8e7 +d2c4 o-o +! # col. 32d +g1f3 g8f6 +g2g3 g7g6 +b2b4 f8g7 +c1b2 o-o +f1g2 d7d5 +o-o c8g4 +c2c4 c7c6 +b1a3 b8d7 +a1c1 a7a5 +b4b5 a5a4 +d2d3 e7e5 +! # col. 33e; Olafsson-Kavalek, Wijik aan Zee 1969 +g1f3 g8f6 +g2g3 g7g6 +b2b3 f8g7 +c1b2 o-o +f1g2 d7d6 +d2d4 f6d7 +b1c3 e7e5 +d1d2 f8e8 +d4e5 d7e5 +f3e5 g7e5 +! # col. 34h +g1f3 g8f6 +g2g3 g7g6 +c2c4 d7d6 +f1g2 f8g7 +o-o o-o +b1c3 b8d7 +d2d3 e7e5 +c1d2 d7c5 +b2b4 c5e6 +a1b1 f6e8 +a2a4 c7c6 +a4a5 e8c7 +! # col. 35 +g1f3 g8f6 +c2c4 g7g6 +b2b3 f8g7 +c1b2 o-o +e2e3 d7d6 +f1e2 e7e5 +o-o f8e8 +b1c3 b8d7 +d2d3 c7c6 +! # col. 36d +g1f3 g8f6 +c2c4 g7g6 +b1c3 d7d5 +c4d5 f6d5 +d1a4 c8d7 +a4b3 d5b6 +d2d4 f8g7 +c1f4 d7e6 +b3c2 b8c6 +a1d1 +! # col. 37f +g1f3 g8f6 +c2c4 b7b6 +g2g3 c8b7 +f1g2 c7c5 +o-o g7g6 +b2b3 f8g7 +c1b2 o-o +b1c3 d7d5 +c3d5 f6d5 +b2g7 g8g7 +c4d5 d8d5 +d2d4 b8a6 +! # col. 38h; Geller-Kholmov, Moscow 1969 +g1f3 g8f6 +c2c4 b7b6 +g2g3 c8b7 +f1g2 e7e6 +o-o f8e7 +b2b3 o-o +c1b2 d7d5 +e2e3 b8d7 +b1c3 f6e4 +c4d5 e4c3 +b2c3 e6d5 +! # col. 39 +g1f3 g8f6 +b2b3 g7g6 +c2c4 f8g7 +c1b2 o-o +g2g3 c7c5 +f1g2 b7b6 +o-o c8b7 +b1c3 e7e6 +a1b1 d8e7 +! # col. 40o; Lombardy-Burger, US Chp. 1969-70 +g1f3 g8f6 +b2b3 d7d5 +c1b2 e7e6 +e2e3 f8e7 +c2c4 o-o +d2d4 b7b6 +f1d3 c8b7 +o-o b8d7 +b1d2 c7c5 +d1e2 f6e4 +a1c1 a8c8 +! diff --git a/gnu/games/chess/gnuchess.c b/gnu/games/chess/gnuchess.c new file mode 100644 index 0000000..ac62953 --- /dev/null +++ b/gnu/games/chess/gnuchess.c @@ -0,0 +1,2307 @@ +/* + C source for CHESS + + Revision: 4-25-88 + + Copyright (C) 1986, 1987, 1988 Free Software Foundation, Inc. + Copyright (c) 1988 John Stanback + + This file is part of CHESS. + + CHESS is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY. No author or distributor + accepts responsibility to anyone for the consequences of using it + or for whether it serves any particular purpose or works at all, + unless he says so in writing. Refer to the CHESS General Public + License for full details. + + Everyone is granted permission to copy, modify and redistribute + CHESS, but only under the conditions described in the + CHESS General Public License. A copy of this license is + supposed to have been given to you along with CHESS so you + can know your rights and responsibilities. It should be in a + file named COPYING. Among other things, the copyright notice + and this notice must be preserved on all copies. +*/ + + +#include <stdio.h> +#include <ctype.h> + +#ifdef MSDOS +#include <stdlib.h> +#include <time.h> +#include <alloc.h> +#define ttblsz 4096 +#else +#include <sys/param.h> +#include <sys/times.h> +#define ttblsz 16384 +#define huge +#endif MSDOS + +#include "move.h" + +#define neutral 2 +#define white 0 +#define black 1 +#define no_piece 0 +#define pawn 1 +#define knight 2 +#define bishop 3 +#define rook 4 +#define queen 5 +#define king 6 +#define valueP 100 +#define valueN 350 +#define valueB 355 +#define valueR 550 +#define valueQ 1100 +#define valueK 1200 +#define ctlP 0x4000 +#define ctlN 0x2800 +#define ctlB 0x1800 +#define ctlR 0x0400 +#define ctlQ 0x0200 +#define ctlK 0x0100 +#define ctlBQ 0x1200 +#define ctlRQ 0x0600 +#define ctlNN 0x2000 +#define pxx " PNBRQK" +#define qxx " pnbrqk" +#define rxx "12345678" +#define cxx "abcdefgh" +#define check 0x0001 +#define capture 0x0002 +#define draw 0x0004 +#define promote 0x0008 +#define cstlmask 0x0010 +#define epmask 0x0020 +#define exact 0x0040 +#define pwnthrt 0x0080 +#define truescore 0x0001 +#define lowerbound 0x0002 +#define upperbound 0x0004 +#define maxdepth 30 +#define true 1 +#define false 0 +#define absv(x) ((x) < 0 ? -(x) : (x)) +#if (NEWMOVE < 1) +#define taxicab(a,b) (abs(column[a]-column[b]) + abs(row[a]-row[b])) +#endif +struct leaf + { + short f,t,score,reply; + unsigned short flags; + }; +struct GameRec + { + unsigned short gmove; + short score,depth,time,piece,color; + long nodes; + }; +struct TimeControlRec + { + short moves[2]; + long clock[2]; + }; +struct BookEntry + { + struct BookEntry *next; + unsigned short *mv; + }; +struct hashval + { + unsigned long bd; + unsigned short key; + }; +struct hashentry + { + unsigned long hashbd; + unsigned short mv,flags; + short score,depth; + }; + +char mvstr1[5],mvstr2[5]; +struct leaf Tree[2000],*root; +short TrPnt[maxdepth],board[64],color[64]; +short row[64],column[64],locn[8][8],Pindex[64],svalue[64]; +short PieceList[2][16],PieceCnt[2],atak[2][64],PawnCnt[2][8]; +short castld[2],kingmoved[2],mtl[2],pmtl[2],emtl[2],hung[2]; +short c1,c2,*atk1,*atk2,*PC1,*PC2,EnemyKing; +short mate,post,opponent,computer,Sdepth,Awindow,Bwindow,dither; +long ResponseTime,ExtraTime,Level,et,et0,time0,cputimer,ft; +long NodeCnt,evrate,ETnodes,EvalNodes,HashCnt; +short quit,reverse,bothsides,hashflag,InChk,player,force,easy,beep; +short wking,bking,FROMsquare,TOsquare,timeout,Zscore,zwndw,xwndw,slk; +short INCscore; +short HasPawn[2],HasKnight[2],HasBishop[2],HasRook[2],HasQueen[2]; +short ChkFlag[maxdepth],CptrFlag[maxdepth],PawnThreat[maxdepth]; +short Pscore[maxdepth],Tscore[maxdepth],Threat[maxdepth]; +struct GameRec GameList[240]; +short GameCnt,Game50,epsquare,lpost,rcptr,contempt; +short MaxSearchDepth; +struct BookEntry *Book; +struct TimeControlRec TimeControl; +short TCflag,TCmoves,TCminutes,OperatorTime; +short otherside[3]={1,0,2}; +short rank7[3]={6,1,0}; +short map[64]= + {0,1,2,3,4,5,6,7, + 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17, + 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27, + 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37, + 0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47, + 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57, + 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67, + 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77}; +short unmap[120]= + {0,1,2,3,4,5,6,7,-1,-1,-1,-1,-1,-1,-1,-1, + 8,9,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1, + 16,17,18,19,20,21,22,23,-1,-1,-1,-1,-1,-1,-1,-1, + 24,25,26,27,28,29,30,31,-1,-1,-1,-1,-1,-1,-1,-1, + 32,33,34,35,36,37,38,39,-1,-1,-1,-1,-1,-1,-1,-1, + 40,41,42,43,44,45,46,47,-1,-1,-1,-1,-1,-1,-1,-1, + 48,49,50,51,52,53,54,55,-1,-1,-1,-1,-1,-1,-1,-1, + 56,57,58,59,60,61,62,63}; +short Dcode[120]= + {0,1,1,1,1,1,1,1,0,0,0,0,0,0,0x0E,0x0F, + 0x10,0x11,0x12,0,0,0,0,0,0,0,0,0,0,0,0x0F,0x1F, + 0x10,0x21,0x11,0,0,0,0,0,0,0,0,0,0,0x0F,0,0, + 0x10,0,0,0x11,0,0,0,0,0,0,0,0,0x0F,0,0,0, + 0x10,0,0,0,0x11,0,0,0,0,0,0,0x0F,0,0,0,0, + 0x10,0,0,0,0,0x11,0,0,0,0,0x0F,0,0,0,0,0, + 0x10,0,0,0,0,0,0x11,0,0,0x0F,0,0,0,0,0,0, + 0x10,0,0,0,0,0,0,0x11}; +short Stboard[64]= + {rook,knight,bishop,queen,king,bishop,knight,rook, + pawn,pawn,pawn,pawn,pawn,pawn,pawn,pawn, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + pawn,pawn,pawn,pawn,pawn,pawn,pawn,pawn, + rook,knight,bishop,queen,king,bishop,knight,rook}; +short Stcolor[64]= + {white,white,white,white,white,white,white,white, + white,white,white,white,white,white,white,white, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + black,black,black,black,black,black,black,black, + black,black,black,black,black,black,black,black}; +short sweep[7]= {false,false,false,true,true,true,false}; +short Dpwn[3]={4,6,0}; +short Dstart[7]={6,4,8,4,0,0,0}; +short Dstop[7]={7,5,15,7,3,7,7}; +short Dir[16]={1,0x10,-1,-0x10,0x0F,0x11,-0x0F,-0x11, + 0x0E,-0x0E,0x12,-0x12,0x1F,-0x1F,0x21,-0x21}; +short Pdir[34]={0,0x38,0,0,0,0,0,0,0,0,0,0,0,0,0x02,0x35, + 0x38,0x35,0x02,0,0,0,0,0,0,0,0,0,0,0,0,0x02, + 0,0x02}; +short pbit[7]={0,0x01,0x02,0x04,0x08,0x10,0x20}; +unsigned short killr0[maxdepth],killr1[maxdepth],killr2[maxdepth]; +unsigned short killr3[maxdepth],PrVar[maxdepth]; +unsigned short PV,hint,Swag0,Swag1,Swag2,Swag3,Swag4; +unsigned short hashkey; +unsigned long hashbd; +struct hashval hashcode[2][7][64]; +struct hashentry huge *ttable,*ptbl; +unsigned char history[8192]; + +short Mwpawn[64],Mbpawn[64],Mknight[2][64],Mbishop[2][64]; +short Mking[2][64],Kfield[2][64]; +short value[7]={0,valueP,valueN,valueB,valueR,valueQ,valueK}; +short control[7]={0,ctlP,ctlN,ctlB,ctlR,ctlQ,ctlK}; +short PassedPawn0[8]={0,60,80,120,200,360,600,800}; +short PassedPawn1[8]={0,30,40,60,100,180,300,800}; +short PassedPawn2[8]={0,15,25,35,50,90,140,800}; +short PassedPawn3[8]={0,5,10,15,20,30,140,800}; +short ISOLANI[8] = {-12,-16,-20,-24,-24,-20,-16,-12}; +short BACKWARD[8] = {-6,-10,-15,-21,-28,-28,-28,-28}; +short BMBLTY[14] = {-2,0,2,4,6,8,10,12,13,14,15,16,16,16}; +short RMBLTY[14] = {0,2,4,6,8,10,11,12,13,14,14,14,14,14}; +short Kthreat[16] = {0,-8,-20,-36,-52,-68,-80,-80,-80,-80,-80,-80, + -80,-80,-80,-80}; +short KNIGHTPOST,KNIGHTSTRONG,BISHOPSTRONG,KATAK,KBNKsq; +short PEDRNK2B,PWEAKH,PADVNCM,PADVNCI,PAWNSHIELD,PDOUBLED,PBLOK; +short RHOPN,RHOPNX,KHOPN,KHOPNX,KSFTY; +short ATAKD,HUNGP,HUNGX,KCASTLD,KMOVD,XRAY,PINVAL; +short stage,stage2,Zwmtl,Zbmtl,Developed[2],PawnStorm; +short PawnBonus,BishopBonus,RookBonus; +short KingOpening[64]= + { 0, 0, -4,-10,-10, -4, 0, 0, + -4, -4, -8,-12,-12, -8, -4, -4, + -12,-16,-20,-20,-20,-20,-16,-12, + -16,-20,-24,-24,-24,-24,-20,-16, + -16,-20,-24,-24,-24,-24,-20,-16, + -12,-16,-20,-20,-20,-20,-16,-12, + -4, -4, -8,-12,-12, -8, -4, -4, + 0, 0, -4,-10,-10, -4, 0, 0}; +short KingEnding[64]= + { 0, 6,12,18,18,12, 6, 0, + 6,12,18,24,24,18,12, 6, + 12,18,24,30,30,24,18,12, + 18,24,30,36,36,30,24,18, + 18,24,30,36,36,30,24,18, + 12,18,24,30,30,24,18,12, + 6,12,18,24,24,18,12, 6, + 0, 6,12,18,18,12, 6, 0}; +short DyingKing[64]= + { 0, 8,16,24,24,16, 8, 0, + 8,32,40,48,48,40,32, 8, + 16,40,56,64,64,56,40,16, + 24,48,64,72,72,64,48,24, + 24,48,64,72,72,64,48,24, + 16,40,56,64,64,56,40,16, + 8,32,40,48,48,40,32, 8, + 0, 8,16,24,24,16, 8, 0}; +short KBNK[64]= + {99,90,80,70,60,50,40,40, + 90,80,60,50,40,30,20,40, + 80,60,40,30,20,10,30,50, + 70,50,30,10, 0,20,40,60, + 60,40,20, 0,10,30,50,70, + 50,30,10,20,30,40,60,80, + 40,20,30,40,50,60,80,90, + 40,40,50,60,70,80,90,99}; +short pknight[64]= + { 0, 4, 8,10,10, 8, 4, 0, + 4, 8,16,20,20,16, 8, 4, + 8,16,24,28,28,24,16, 8, + 10,20,28,32,32,28,20,10, + 10,20,28,32,32,28,20,10, + 8,16,24,28,28,24,16, 8, + 4, 8,16,20,20,16, 8, 4, + 0, 4, 8,10,10, 8, 4, 0}; +short pbishop[64]= + {14,14,14,14,14,14,14,14, + 14,22,18,18,18,18,22,14, + 14,18,22,22,22,22,18,14, + 14,18,22,22,22,22,18,14, + 14,18,22,22,22,22,18,14, + 14,18,22,22,22,22,18,14, + 14,22,18,18,18,18,22,14, + 14,14,14,14,14,14,14,14}; +short PawnAdvance[64]= + { 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 0, 0, 4, 4, 4, + 6, 8, 2,10,10, 2, 8, 6, + 6, 8,12,16,16,12, 8, 6, + 8,12,16,24,24,16,12, 8, + 12,16,24,32,32,24,16,12, + 12,16,24,32,32,24,16,12, + 0, 0, 0, 0, 0, 0, 0, 0}; + + +main(argc,argv) +int argc; char *argv[]; +{ +#ifdef MSDOS + ttable = (struct hashentry huge *)farmalloc(ttblsz * + (unsigned long)sizeof(struct hashentry)); +#else + ttable = (struct hashentry *)malloc(ttblsz * + (unsigned long)sizeof(struct hashentry)); +#endif + Level = 0; TCflag = false; OperatorTime = 0; + if (argc == 2) Level = atoi(argv[1]); + if (argc == 3) + { + TCmoves = atoi(argv[1]); TCminutes = atoi(argv[2]); TCflag = true; + } + Initialize(); + NewGame(); +#if (NEWMOVE > 0) + Initialize_dist(); +#if (NEWMOVE > 1) + Initialize_moves(); +#endif +#endif + while (!(quit)) + { + if (bothsides && !mate) SelectMove(opponent,1); else InputCommand(); + if (!(quit || mate || force)) SelectMove(computer,1); + } + ExitChess(); +} + + + +/* ............ INTERFACE ROUTINES ........................... */ + +int VerifyMove(s,iop,mv) +char s[]; +short iop; +unsigned short *mv; + +/* + Compare the string 's' to the list of legal moves available for the + opponent. If a match is found, make the move on the board. +*/ + +{ +static short pnt,tempb,tempc,tempsf,tempst,cnt; +static struct leaf xnode; +struct leaf *node; + + *mv = 0; + if (iop == 2) + { + UnmakeMove(opponent,&xnode,&tempb,&tempc,&tempsf,&tempst); + return(false); + } + cnt = 0; + MoveList(opponent,2); + pnt = TrPnt[2]; + while (pnt < TrPnt[3]) + { + node = &Tree[pnt++]; + algbr(node->f,node->t,(short) node->flags & cstlmask); + if (strcmp(s,mvstr1) == 0 || strcmp(s,mvstr2) == 0) + { + cnt++; xnode = *node; + } + } + if (cnt == 1) + { + MakeMove(opponent,&xnode,&tempb,&tempc,&tempsf,&tempst); + if (SqAtakd(PieceList[opponent][0],computer)) + { + UnmakeMove(opponent,&xnode,&tempb,&tempc,&tempsf,&tempst); + ShowMessage("Illegal Move!!"); + return(false); + } + else + { + if (iop == 1) return(true); + if (xnode.flags & epmask) UpdateDisplay(0,0,1,0); + else UpdateDisplay(xnode.f,xnode.t,0,xnode.flags & cstlmask); + if (xnode.flags & cstlmask) Game50 = GameCnt; + else if (board[xnode.t] == pawn || (xnode.flags & capture)) + Game50 = GameCnt; + GameList[GameCnt].depth = GameList[GameCnt].score = 0; + GameList[GameCnt].nodes = 0; + ElapsedTime(1); + GameList[GameCnt].time = (short)et; + TimeControl.clock[opponent] -= et; + --TimeControl.moves[opponent]; + *mv = (xnode.f << 8) + xnode.t; + algbr(xnode.f,xnode.t,false); + return(true); + } + } + if (cnt > 1) ShowMessage("Ambiguous Move!"); + return(false); +} + + +NewGame() + +/* + Reset the board and other variables to start a new game. +*/ + +{ +short l,r,c,p; + + mate = quit = reverse = bothsides = post = false; + hashflag = force = PawnStorm = false; + beep = rcptr = easy = true; + lpost = NodeCnt = epsquare = et0 = 0; + dither = 0; + Awindow = 90; + Bwindow = 90; + xwndw = 90; + MaxSearchDepth = 29; + contempt = 0; + GameCnt = -1; Game50 = 0; + Zwmtl = Zbmtl = 0; + Developed[white] = Developed[black] = false; + castld[white] = castld[black] = false; + kingmoved[white] = kingmoved[black] = 0; + PawnThreat[0] = CptrFlag[0] = Threat[0] = false; + Pscore[0] = 12000; Tscore[0] = 12000; + opponent = white; computer = black; + for (r = 0; r < 8; r++) + for (c = 0; c < 8; c++) + { + l = 8*r+c; locn[r][c] = l; + row[l] = r; column[l] = c; + board[l] = Stboard[l]; color[l] = Stcolor[l]; + } + for (c = white; c <= black; c++) + for (p = pawn; p <= king; p++) + for (l = 0; l < 64; l++) + { + hashcode[c][p][l].key = (unsigned short)rand(); + hashcode[c][p][l].bd = ((unsigned long)rand() << 16) + + (unsigned long)rand(); + } + ClrScreen(); + if (TCflag) SetTimeControl(); + else if (Level == 0) SelectLevel(); + UpdateDisplay(0,0,1,0); + InitializeStats(); + time0 = time((long *)0); + ElapsedTime(1); + GetOpenings(); +} + + +algbr(f,t,iscastle) +short f,t,iscastle; +{ + mvstr1[0] = cxx[column[f]]; mvstr1[1] = rxx[row[f]]; + mvstr1[2] = cxx[column[t]]; mvstr1[3] = rxx[row[t]]; + mvstr2[0] = qxx[board[f]]; + mvstr2[1] = mvstr1[2]; mvstr2[2] = mvstr1[3]; + mvstr1[4] = '\0'; mvstr2[3] = '\0'; + if (iscastle) + if (t > f) strcpy(mvstr2,"o-o"); + else strcpy(mvstr2,"o-o-o"); +} + + +/* ............ MOVE GENERATION & SEARCH ROUTINES .............. */ + +SelectMove(side,iop) +short side,iop; + +/* + Select a move by calling function search() at progressively deeper + ply until time is up or a mate or draw is reached. An alpha-beta + window of -90 to +90 points is set around the score returned from the + previous iteration. If Sdepth != 0 then the program has correctly + predicted the opponents move and the search will start at a depth of + Sdepth+1 rather than a depth of 1. +*/ + +{ +static short i,alpha,beta,score,tempb,tempc,tempsf,tempst,xside,rpt; + + timeout = false; + xside = otherside[side]; + if (iop != 2) player = side; + if (TCflag) + { + if (((TimeControl.moves[side] + 3) - OperatorTime) != 0) + ResponseTime = (TimeControl.clock[side]) / + (TimeControl.moves[side] + 3) - + OperatorTime; + else ResponseTime = 0; + ResponseTime += (ResponseTime*TimeControl.moves[side])/(2*TCmoves+1); + } + else ResponseTime = Level; + if (iop == 2) ResponseTime = 999; + if (Sdepth > 0 && root->score > Zscore-zwndw) ResponseTime -= ft; + else if (ResponseTime < 1) ResponseTime = 1; + ExtraTime = 0; + ExaminePosition(); + ScorePosition(side,&score); + ShowSidetomove(); + + if (Sdepth == 0) + { + ZeroTTable(); + SearchStartStuff(side); + for (i = 0; i < 8192; i++) history[i] = 0; + FROMsquare = TOsquare = -1; + PV = 0; + if (iop != 2) hint = 0; + for (i = 0; i < maxdepth; i++) + PrVar[i] = killr0[i] = killr1[i] = killr2[i] = killr3[i] = 0; + alpha = score-90; beta = score+90; + rpt = 0; + TrPnt[1] = 0; root = &Tree[0]; + MoveList(side,1); + for (i = TrPnt[1]; i < TrPnt[2]; i++) pick(i,TrPnt[2]-1); + if (Book != NULL) OpeningBook(); + if (Book != NULL) timeout = true; + NodeCnt = ETnodes = EvalNodes = HashCnt = 0; + Zscore = 0; zwndw = 20; + } + + while (!timeout && Sdepth < MaxSearchDepth) + { + Sdepth++; + ShowDepth(' '); + score = search(side,1,Sdepth,alpha,beta,PrVar,&rpt); + for (i = 1; i <= Sdepth; i++) killr0[i] = PrVar[i]; + if (score < alpha) + { + ShowDepth('-'); + ExtraTime = 10*ResponseTime; + ZeroTTable(); + score = search(side,1,Sdepth,-9000,beta,PrVar,&rpt); + } + if (score > beta && !(root->flags & exact)) + { + ShowDepth('+'); + ExtraTime = 0; + ZeroTTable(); + score = search(side,1,Sdepth,alpha,9000,PrVar,&rpt); + } + score = root->score; + if (!timeout) + for (i = TrPnt[1]+1; i < TrPnt[2]; i++) pick(i,TrPnt[2]-1); + ShowResults(score,PrVar,'.'); + for (i = 1; i <= Sdepth; i++) killr0[i] = PrVar[i]; + if (score > Zscore-zwndw && score > Tree[1].score+250) ExtraTime = 0; + else if (score > Zscore-3*zwndw) ExtraTime = ResponseTime; + else ExtraTime = 3*ResponseTime; + if (root->flags & exact) timeout = true; + if (Tree[1].score < -9000) timeout = true; + if (4*et > 2*ResponseTime + ExtraTime) timeout = true; + if (!timeout) + { + Tscore[0] = score; + if (Zscore == 0) Zscore = score; + else Zscore = (Zscore+score)/2; + } + zwndw = 20+abs(Zscore/12); + beta = score + Bwindow; + if (Zscore < score) alpha = Zscore - Awindow - zwndw; + else alpha = score - Awindow - zwndw; + } + + score = root->score; + if (rpt >= 2 || score < -12000) root->flags |= draw; + if (iop == 2) return(0); + if (Book == NULL) hint = PrVar[2]; + ElapsedTime(1); + + if (score > -9999 && rpt <= 2) + { + MakeMove(side,root,&tempb,&tempc,&tempsf,&tempst); + algbr(root->f,root->t,(short) root->flags & cstlmask); + } + else mvstr1[0] = '\0'; + OutputMove(); + if (score == -9999 || score == 9998) mate = true; + if (mate) hint = 0; + if (root->flags & cstlmask) Game50 = GameCnt; + else if (board[root->t] == pawn || (root->flags & capture)) + Game50 = GameCnt; + GameList[GameCnt].score = score; + GameList[GameCnt].nodes = NodeCnt; + GameList[GameCnt].time = (short)et; + GameList[GameCnt].depth = Sdepth; + if (TCflag) + { + TimeControl.clock[side] -= (et + OperatorTime); + if (--TimeControl.moves[side] == 0) SetTimeControl(); + } + if ((root->flags & draw) && bothsides) quit = true; + if (GameCnt > 238) quit = true; + player = xside; + Sdepth = 0; + fflush(stdin); + return(0); +} + + +OpeningBook() + +/* + Go thru each of the opening lines of play and check for a match with + the current game listing. If a match occurs, generate a random number. + If this number is the largest generated so far then the next move in + this line becomes the current "candidate". After all lines are + checked, the candidate move is put at the top of the Tree[] array and + will be played by the program. Note that the program does not handle + book transpositions. +*/ + +{ +short j,pnt; +unsigned short m,*mp; +unsigned r,r0; +struct BookEntry *p; + + srand((unsigned)time0); + r0 = m = 0; + p = Book; + while (p != NULL) + { + mp = p->mv; + for (j = 0; j <= GameCnt; j++) + if (GameList[j].gmove != *(mp++)) break; + if (j > GameCnt) + if ((r=rand()) > r0) + { + r0 = r; m = *mp; + hint = *(++mp); + } + p = p->next; + } + + for (pnt = TrPnt[1]; pnt < TrPnt[2]; pnt++) + if ((Tree[pnt].f<<8) + Tree[pnt].t == m) Tree[pnt].score = 0; + pick(TrPnt[1],TrPnt[2]-1); + if (Tree[TrPnt[1]].score < 0) Book = NULL; +} + + +#define UpdateSearchStatus\ +{\ + if (post) ShowCurrentMove(pnt,node->f,node->t);\ + if (pnt > TrPnt[1])\ + {\ + d = best-Zscore; e = best-node->score;\ + if (best < alpha) ExtraTime = 10*ResponseTime;\ + else if (d > -zwndw && e > 4*zwndw) ExtraTime = -ResponseTime/3;\ + else if (d > -zwndw) ExtraTime = 0;\ + else if (d > -3*zwndw) ExtraTime = ResponseTime;\ + else if (d > -9*zwndw) ExtraTime = 3*ResponseTime;\ + else ExtraTime = 5*ResponseTime;\ + }\ +} + +int search(side,ply,depth,alpha,beta,bstline,rpt) +short side,ply,depth,alpha,beta,*rpt; +unsigned short bstline[]; + +/* + Perform an alpha-beta search to determine the score for the current + board position. If depth <= 0 only capturing moves, pawn promotions + and responses to check are generated and searched, otherwise all + moves are processed. The search depth is modified for check evasions, + certain re-captures and threats. Extensions may continue for up to 11 + ply beyond the nominal search depth. +*/ + +#define prune (cf && score+node->score < alpha) +#define ReCapture (rcptr && score > alpha && score < beta &&\ + ply > 2 && CptrFlag[ply-1] && CptrFlag[ply-2]) +#define MateThreat (ply < Sdepth+4 && ply > 4 &&\ + ChkFlag[ply-2] && ChkFlag[ply-4] &&\ + ChkFlag[ply-2] != ChkFlag[ply-4]) + +{ +register short j,pnt; +short best,tempb,tempc,tempsf,tempst; +short xside,pbst,d,e,cf,score,rcnt; +unsigned short mv,nxtline[maxdepth]; +struct leaf *node,tmp; + + NodeCnt++; + xside = otherside[side]; + if (depth < 0) depth = 0; + + if (ply <= Sdepth+3) repetition(rpt); else *rpt = 0; + if (*rpt >= 2) return(0); + + score = evaluate(side,xside,ply,alpha,beta); + if (score > 9000) + { + bstline[ply] = 0; + return(score); + } + + if (depth > 0) + { + if (InChk || PawnThreat[ply-1] || ReCapture) ++depth; + } + else + { + if (score >= alpha && + (InChk || PawnThreat[ply-1] || Threat[ply-1])) ++depth; + else if (score <= beta && MateThreat) ++depth; + } + + if (depth > 0 && hashflag && ply > 1) + { + ProbeTTable(side,depth,&alpha,&beta,&score); + bstline[ply] = PV; + bstline[ply+1] = 0; + if (beta == -20000) return(score); + if (alpha > beta) return(alpha); + } + + if (Sdepth == 1) d = 7; else d = 11; + if (ply > Sdepth+d || (depth < 1 && score > beta)) return(score); + + if (ply > 1) + if (depth > 0) MoveList(side,ply); + else CaptureList(side,xside,ply); + + if (TrPnt[ply] == TrPnt[ply+1]) return(score); + + cf = (depth < 1 && ply > Sdepth+1 && !ChkFlag[ply-2] && !slk); + + if (depth > 0) best = -12000; else best = score; + if (best > alpha) alpha = best; + + for (pnt = pbst = TrPnt[ply]; + pnt < TrPnt[ply+1] && best <= beta; + pnt++) + { + if (ply > 1) pick(pnt,TrPnt[ply+1]-1); + node = &Tree[pnt]; + mv = (node->f << 8) + node->t; + nxtline[ply+1] = 0; + + if (prune) break; + if (ply == 1) UpdateSearchStatus; + + if (!(node->flags & exact)) + { + MakeMove(side,node,&tempb,&tempc,&tempsf,&tempst); + CptrFlag[ply] = (node->flags & capture); + PawnThreat[ply] = (node->flags & pwnthrt); + Tscore[ply] = node->score; + PV = node->reply; + node->score = -search(xside,ply+1,depth-1,-beta,-alpha, + nxtline,&rcnt); + if (abs(node->score) > 9000) node->flags |= exact; + else if (rcnt == 1) node->score /= 2; + if (rcnt >= 2 || GameCnt-Game50 > 99 || + (node->score == 9999-ply && !ChkFlag[ply])) + { + node->flags |= draw; node->flags |= exact; + if (side == computer) node->score = contempt; + else node->score = -contempt; + } + node->reply = nxtline[ply+1]; + UnmakeMove(side,node,&tempb,&tempc,&tempsf,&tempst); + } + if (node->score > best && !timeout) + { + if (depth > 0) + if (node->score > alpha && !(node->flags & exact)) + node->score += depth; + best = node->score; pbst = pnt; + if (best > alpha) alpha = best; + for (j = ply+1; nxtline[j] > 0; j++) bstline[j] = nxtline[j]; + bstline[j] = 0; + bstline[ply] = mv; + if (ply == 1) + { + if (best == alpha) + { + tmp = Tree[pnt]; + for (j = pnt-1; j >= 0; j--) Tree[j+1] = Tree[j]; + Tree[0] = tmp; + pbst = 0; + } + if (Sdepth > 2) + if (best > beta) ShowResults(best,bstline,'+'); + else if (best < alpha) ShowResults(best,bstline,'-'); + else ShowResults(best,bstline,'&'); + } + } + if (NodeCnt > ETnodes) ElapsedTime(0); + if (timeout) return(-Tscore[ply-1]); + } + + node = &Tree[pbst]; + mv = (node->f<<8) + node->t; + if (hashflag && ply <= Sdepth && *rpt == 0 && best == alpha) + PutInTTable(side,best,depth,alpha,beta,mv); + if (depth > 0) + { + j = (node->f<<6) + node->t; if (side == black) j |= 0x1000; + if (history[j] < 150) history[j] += 2*depth; + if (node->t != (GameList[GameCnt].gmove & 0xFF)) + if (best <= beta) killr3[ply] = mv; + else if (mv != killr1[ply]) + { + killr2[ply] = killr1[ply]; + killr1[ply] = mv; + } + if (best > 9000) killr0[ply] = mv; else killr0[ply] = 0; + } + return(best); +} + + +evaluate(side,xside,ply,alpha,beta) +short side,xside,ply,alpha,beta; + +/* + Compute an estimate of the score by adding the positional score from + the previous ply to the material difference. If this score falls + inside a window which is 180 points wider than the alpha-beta window + (or within a 50 point window during quiescence search) call + ScorePosition() to determine a score, otherwise return the estimated + score. If one side has only a king and the other either has no pawns + or no pieces then the function ScoreLoneKing() is called. +*/ + +{ +short s,evflag; + + hung[white] = hung[black] = 0; + slk = ((mtl[white] == valueK && (pmtl[black] == 0 || emtl[black] == 0)) || + (mtl[black] == valueK && (pmtl[white] == 0 || emtl[white] == 0))); + s = -Pscore[ply-1] + mtl[side] - mtl[xside]; + s -= INCscore; + + if (slk) evflag = false; + else evflag = + (ply == 1 || ply < Sdepth || + ((ply == Sdepth+1 || ply == Sdepth+2) && + (s > alpha-xwndw && s < beta+xwndw)) || + (ply > Sdepth+2 && s >= alpha-25 && s <= beta+25)); + + if (evflag) + { + EvalNodes++; + ataks(side,atak[side]); + if (atak[side][PieceList[xside][0]] > 0) return(10001-ply); + ataks(xside,atak[xside]); + InChk = (atak[xside][PieceList[side][0]] > 0); + ScorePosition(side,&s); + } + else + { + if (SqAtakd(PieceList[xside][0],side)) return(10001-ply); + InChk = SqAtakd(PieceList[side][0],xside); + if (slk) ScoreLoneKing(side,&s); + } + + Pscore[ply] = s - mtl[side] + mtl[xside]; + if (InChk) ChkFlag[ply-1] = Pindex[TOsquare]; + else ChkFlag[ply-1] = 0; + Threat[ply-1] = (hung[side] > 1 && ply == Sdepth+1); + return(s); +} + + +ProbeTTable(side,depth,alpha,beta,score) +short side,depth,*alpha,*beta,*score; + +/* + Look for the current board position in the transposition table. +*/ + +{ +short hindx; + if (side == white) hashkey |= 1; else hashkey &= 0xFFFE; + hindx = (hashkey & (ttblsz-1)); + ptbl = (ttable + hindx); + if (ptbl->depth >= depth && ptbl->hashbd == hashbd) + { + HashCnt++; + PV = ptbl->mv; + if (ptbl->flags & truescore) + { + *score = ptbl->score; + *beta = -20000; + return(true); + } +/* + else if (ptbl->flags & upperbound) + { + if (ptbl->score < *beta) *beta = ptbl->score+1; + } +*/ + else if (ptbl->flags & lowerbound) + { + if (ptbl->score > *alpha) *alpha = ptbl->score-1; + } + } + return(false); +} + + +PutInTTable(side,score,depth,alpha,beta,mv) +short side,score,depth,alpha,beta; +unsigned short mv; + +/* + Store the current board position in the transposition table. +*/ + +{ +short hindx; + if (side == white) hashkey |= 1; else hashkey &= 0xFFFE; + hindx = (hashkey & (ttblsz-1)); + ptbl = (ttable + hindx); + ptbl->hashbd = hashbd; + ptbl->depth = depth; + ptbl->score = score; + ptbl->mv = mv; + ptbl->flags = 0; + if (score < alpha) ptbl->flags |= upperbound; + else if (score > beta) ptbl->flags |= lowerbound; + else ptbl->flags |= truescore; +} + + +ZeroTTable() +{ +int i; + if (hashflag) + for (i = 0; i < ttblsz; i++) + { + ptbl = (ttable + i); + ptbl->depth = 0; + } +} + + +MoveList(side,ply) +short side,ply; + +/* + Fill the array Tree[] with all available moves for side to play. Array + TrPnt[ply] contains the index into Tree[] of the first move at a ply. +*/ + +{ +register short i; +short xside,f; + + xside = otherside[side]; + if (PV == 0) Swag0 = killr0[ply]; else Swag0 = PV; + Swag1 = killr1[ply]; Swag2 = killr2[ply]; + Swag3 = killr3[ply]; Swag4 = 0; + if (ply > 2) Swag4 = killr1[ply-2]; + TrPnt[ply+1] = TrPnt[ply]; + Dstart[pawn] = Dpwn[side]; Dstop[pawn] = Dstart[pawn] + 1; + for (i = PieceCnt[side]; i >= 0; i--) + GenMoves(ply,PieceList[side][i],side,xside); + if (kingmoved[side] == 0 && !castld[side]) + { + f = PieceList[side][0]; + if (castle(side,f,f+2,0)) + { + LinkMove(ply,f,f+2,xside); + Tree[TrPnt[ply+1]-1].flags |= cstlmask; + } + if (castle(side,f,f-2,0)) + { + LinkMove(ply,f,f-2,xside); + Tree[TrPnt[ply+1]-1].flags |= cstlmask; + } + } +} + +#if (NEWMOVE < 11) +GenMoves(ply,sq,side,xside) +short ply,sq,side,xside; + +/* + Generate moves for a piece. The from square is mapped onto a special + board and offsets (taken from array Dir[]) are added to the mapped + location. The newly generated square is tested to see if it falls off + the board by ANDing the square with 88 HEX. Legal moves are linked + into the tree. +*/ + +{ +register short m,u,d; +short i,m0,piece; + + piece = board[sq]; m0 = map[sq]; + if (sweep[piece]) + for (i = Dstart[piece]; i <= Dstop[piece]; i++) + { + d = Dir[i]; m = m0+d; + while (!(m & 0x88)) + { + u = unmap[m]; + if (color[u] == neutral) + { + LinkMove(ply,sq,u,xside); + m += d; + } + else if (color[u] == xside) + { + LinkMove(ply,sq,u,xside); + break; + } + else break; + } + } + else if (piece == pawn) + { + if (side == white && color[sq+8] == neutral) + { + LinkMove(ply,sq,sq+8,xside); + if (row[sq] == 1) + if (color[sq+16] == neutral) + LinkMove(ply,sq,sq+16,xside); + } + else if (side == black && color[sq-8] == neutral) + { + LinkMove(ply,sq,sq-8,xside); + if (row[sq] == 6) + if (color[sq-16] == neutral) + LinkMove(ply,sq,sq-16,xside); + } + for (i = Dstart[piece]; i <= Dstop[piece]; i++) + if (!((m = m0+Dir[i]) & 0x88)) + { + u = unmap[m]; + if (color[u] == xside || u == epsquare) + LinkMove(ply,sq,u,xside); + } + } + else + { + for (i = Dstart[piece]; i <= Dstop[piece]; i++) + if (!((m = m0+Dir[i]) & 0x88)) + { + u = unmap[m]; + if (color[u] != side) LinkMove(ply,sq,u,xside); + } + } +} +#endif + +LinkMove(ply,f,t,xside) +short ply,f,t,xside; + +/* + Add a move to the tree. Assign a bonus to order the moves + as follows: + 1. Principle variation + 2. Capture of last moved piece + 3. Other captures (major pieces first) + 4. Killer moves + 5. "history" killers +*/ + +{ +register short s,z; +unsigned short mv; +struct leaf *node; + + node = &Tree[TrPnt[ply+1]]; + ++TrPnt[ply+1]; + node->flags = node->reply = 0; + node->f = f; node->t = t; + mv = (f<<8) + t; + s = 0; + if (mv == Swag0) s = 2000; + else if (mv == Swag1) s = 60; + else if (mv == Swag2) s = 50; + else if (mv == Swag3) s = 40; + else if (mv == Swag4) s = 30; + if (color[t] != neutral) + { + node->flags |= capture; + if (t == TOsquare) s += 500; + s += value[board[t]] - board[f]; + } + if (board[f] == pawn) + if (row[t] == 0 || row[t] == 7) + { + node->flags |= promote; + s += 800; + } + else if (row[t] == 1 || row[t] == 6) + { + node->flags |= pwnthrt; + s += 600; + } + else if (t == epsquare) node->flags |= epmask; + z = (f<<6) + t; if (xside == white) z |= 0x1000; + s += history[z]; + node->score = s - 20000; +} + +#if (NEWMOVE < 10) +CaptureList(side,xside,ply) +short side,xside,ply; + +/* + Generate captures and Pawn promotions only. +*/ + +#define LinkCapture\ +{\ + node->f = sq; node->t = u;\ + node->reply = 0;\ + node->flags = capture;\ + node->score = value[board[u]] + svalue[board[u]] - piece;\ + if (piece == pawn && (u < 8 || u > 55))\ + {\ + node->flags |= promote;\ + node->score = valueQ;\ + }\ + ++node;\ + ++TrPnt[ply+1];\ +} + +{ +register short m,u; +short d,sq,i,j,j1,j2,m0,r7,d0,piece,*PL; +struct leaf *node; + + TrPnt[ply+1] = TrPnt[ply]; + node = &Tree[TrPnt[ply]]; + Dstart[pawn] = Dpwn[side]; Dstop[pawn] = Dstart[pawn] + 1; + if (side == white) + { + r7 = 6; d0 = 8; + } + else + { + r7 = 1; d0 = -8; + } + PL = PieceList[side]; + for (i = 0; i <= PieceCnt[side]; i++) + { + sq = PL[i]; + m0 = map[sq]; piece = board[sq]; + j1 = Dstart[piece]; j2 = Dstop[piece]; + if (sweep[piece]) + for (j = j1; j <= j2; j++) + { + d = Dir[j]; m = m0+d; + while (!(m & 0x88)) + { + u = unmap[m]; + if (color[u] == neutral) m += d; + else + { + if (color[u] == xside) LinkCapture; + break; + } + } + } + else + { + for (j = j1; j <= j2; j++) + if (!((m = m0+Dir[j]) & 0x88)) + { + u = unmap[m]; + if (color[u] == xside) LinkCapture; + } + if (piece == pawn && row[sq] == r7) + { + u = sq+d0; + if (color[u] == neutral) LinkCapture; + } + } + } +} +#endif + +int castle(side,kf,kt,iop) +short side,kf,kt,iop; + +/* + Make or Unmake a castling move. +*/ + +{ +short rf,rt,d,t0,xside; + + xside = otherside[side]; + if (kt > kf) + { + rf = kf+3; rt = kt-1; d = 1; + } + else + { + rf = kf-4; rt = kt+1; d = -1; + } + if (iop == 0) + { + if (board[kf] != king || board[rf] != rook || color[rf] != side) + return(false); + if (color[kt] != neutral || color[rt] != neutral) return(false); + if (d == -1 && color[kt+d] != neutral) return(false); + if (SqAtakd(kf,xside)) return(false); + if (SqAtakd(kt,xside)) return(false); + if (SqAtakd(kf+d,xside)) return(false); + } + else + { + if (iop == 1) castld[side] = true; else castld[side] = false; + if (iop == 2) + { + t0 = kt; kt = kf; kf = t0; + t0 = rt; rt = rf; rf = t0; + } + board[kt] = king; color[kt] = side; Pindex[kt] = 0; + board[kf] = no_piece; color[kf] = neutral; + board[rt] = rook; color[rt] = side; Pindex[rt] = Pindex[rf]; + board[rf] = no_piece; color[rf] = neutral; + PieceList[side][Pindex[kt]] = kt; + PieceList[side][Pindex[rt]] = rt; + if (hashflag) + { + UpdateHashbd(side,king,kf,kt); + UpdateHashbd(side,rook,rf,rt); + } + } + return(true); +} + + +EnPassant(xside,f,t,iop) +short xside,f,t,iop; + +/* + Make or unmake an en passant move. +*/ + +{ +short l; + if (t > f) l = t-8; else l = t+8; + if (iop == 1) + { + board[l] = no_piece; color[l] = neutral; + } + else + { + board[l] = pawn; color[l] = xside; + } + InitializeStats(); +} + + +MakeMove(side,node,tempb,tempc,tempsf,tempst) +short side,*tempc,*tempb,*tempsf,*tempst; +struct leaf *node; + +/* + Update Arrays board[], color[], and Pindex[] to reflect the new board + position obtained after making the move pointed to by node. Also + update miscellaneous stuff that changes when a move is made. +*/ + +{ +register short f,t; +short xside,ct,cf; + + xside = otherside[side]; + f = node->f; t = node->t; epsquare = -1; + FROMsquare = f; TOsquare = t; + INCscore = 0; + GameList[++GameCnt].gmove = (f<<8) + t; + if (node->flags & cstlmask) + { + GameList[GameCnt].piece = no_piece; + GameList[GameCnt].color = side; + castle(side,f,t,1); + } + else + { + *tempc = color[t]; *tempb = board[t]; + *tempsf = svalue[f]; *tempst = svalue[t]; + GameList[GameCnt].piece = *tempb; + GameList[GameCnt].color = *tempc; + if (*tempc != neutral) + { + UpdatePieceList(*tempc,t,1); + if (*tempb == pawn) --PawnCnt[*tempc][column[t]]; + if (board[f] == pawn) + { + --PawnCnt[side][column[f]]; + ++PawnCnt[side][column[t]]; + cf = column[f]; ct = column[t]; + if (PawnCnt[side][ct] > 1+PawnCnt[side][cf]) + INCscore -= 15; + else if (PawnCnt[side][ct] < 1+PawnCnt[side][cf]) + INCscore += 15; + else if (ct == 0 || ct == 7 || PawnCnt[side][ct+ct-cf] == 0) + INCscore -= 15; + } + mtl[xside] -= value[*tempb]; + if (*tempb == pawn) pmtl[xside] -= valueP; + if (hashflag) UpdateHashbd(xside,*tempb,-1,t); + INCscore += *tempst; + } + color[t] = color[f]; board[t] = board[f]; svalue[t] = svalue[f]; + Pindex[t] = Pindex[f]; PieceList[side][Pindex[t]] = t; + color[f] = neutral; board[f] = no_piece; + if (board[t] == pawn) + if (t-f == 16) epsquare = f+8; + else if (f-t == 16) epsquare = f-8; + if (node->flags & promote) + { + board[t] = queen; + --PawnCnt[side][column[t]]; + mtl[side] += valueQ - valueP; + pmtl[side] -= valueP; + HasQueen[side] = true; + if (hashflag) + { + UpdateHashbd(side,pawn,f,-1); + UpdateHashbd(side,queen,f,-1); + } + INCscore -= *tempsf; + } + if (board[t] == king) ++kingmoved[side]; + if (node->flags & epmask) EnPassant(xside,f,t,1); + else if (hashflag) UpdateHashbd(side,board[t],f,t); + } +} + + +UnmakeMove(side,node,tempb,tempc,tempsf,tempst) +short side,*tempc,*tempb,*tempsf,*tempst; +struct leaf *node; + +/* + Take back a move. +*/ + +{ +register short f,t; +short xside; + + xside = otherside[side]; + f = node->f; t = node->t; epsquare = -1; + GameCnt--; + if (node->flags & cstlmask) castle(side,f,t,2); + else + { + color[f] = color[t]; board[f] = board[t]; svalue[f] = *tempsf; + Pindex[f] = Pindex[t]; PieceList[side][Pindex[f]] = f; + color[t] = *tempc; board[t] = *tempb; svalue[t] = *tempst; + if (node->flags & promote) + { + board[f] = pawn; + ++PawnCnt[side][column[t]]; + mtl[side] += valueP - valueQ; + pmtl[side] += valueP; + if (hashflag) + { + UpdateHashbd(side,queen,-1,t); + UpdateHashbd(side,pawn,-1,t); + } + } + if (*tempc != neutral) + { + UpdatePieceList(*tempc,t,2); + if (*tempb == pawn) ++PawnCnt[*tempc][column[t]]; + if (board[f] == pawn) + { + --PawnCnt[side][column[t]]; + ++PawnCnt[side][column[f]]; + } + mtl[xside] += value[*tempb]; + if (*tempb == pawn) pmtl[xside] += valueP; + if (hashflag) UpdateHashbd(xside,*tempb,-1,t); + } + if (board[f] == king) --kingmoved[side]; + if (node->flags & epmask) EnPassant(xside,f,t,2); + else if (hashflag) UpdateHashbd(side,board[f],f,t); + } +} + + +UpdateHashbd(side,piece,f,t) +short side,piece,f,t; + +/* + hashbd contains a 32 bit "signature" of the board position. hashkey + contains a 16 bit code used to address the hash table. When a move is + made, XOR'ing the hashcode of moved piece on the from and to squares + with the hashbd and hashkey values keeps things current. +*/ + +{ + if (f >= 0) + { + hashbd ^= hashcode[side][piece][f].bd; + hashkey ^= hashcode[side][piece][f].key; + } + if (t >= 0) + { + hashbd ^= hashcode[side][piece][t].bd; + hashkey ^= hashcode[side][piece][t].key; + } +} + + +UpdatePieceList(side,sq,iop) +short side,sq,iop; + +/* + Update the PieceList and Pindex arrays when a piece is captured or + when a capture is unmade. +*/ + +{ +register short i; + if (iop == 1) + { + PieceCnt[side]--; + for (i = Pindex[sq]; i <= PieceCnt[side]; i++) + { + PieceList[side][i] = PieceList[side][i+1]; + Pindex[PieceList[side][i]] = i; + } + } + else + { + PieceCnt[side]++; + PieceList[side][PieceCnt[side]] = sq; + Pindex[sq] = PieceCnt[side]; + } +} + + +InitializeStats() + +/* + Scan thru the board seeing what's on each square. If a piece is found, + update the variables PieceCnt, PawnCnt, Pindex and PieceList. Also + determine the material for each side and set the hashkey and hashbd + variables to represent the current board position. Array + PieceList[side][indx] contains the location of all the pieces of + either side. Array Pindex[sq] contains the indx into PieceList for a + given square. +*/ + +{ +register short i,sq; + epsquare = -1; + for (i = 0; i < 8; i++) + PawnCnt[white][i] = PawnCnt[black][i] = 0; + mtl[white] = mtl[black] = pmtl[white] = pmtl[black] = 0; + PieceCnt[white] = PieceCnt[black] = 0; + hashbd = hashkey = 0; + for (sq = 0; sq < 64; sq++) + if (color[sq] != neutral) + { + mtl[color[sq]] += value[board[sq]]; + if (board[sq] == pawn) + { + pmtl[color[sq]] += valueP; + ++PawnCnt[color[sq]][column[sq]]; + } + if (board[sq] == king) Pindex[sq] = 0; + else Pindex[sq] = ++PieceCnt[color[sq]]; + PieceList[color[sq]][Pindex[sq]] = sq; + hashbd ^= hashcode[color[sq]][board[sq]][sq].bd; + hashkey ^= hashcode[color[sq]][board[sq]][sq].key; + } +} + + +pick(p1,p2) +short p1,p2; + +/* + Find the best move in the tree between indexes p1 and p2. Swap the + best move into the p1 element. +*/ + +{ +register short p,s; +short p0,s0; +struct leaf temp; + + s0 = Tree[p1].score; p0 = p1; + for (p = p1+1; p <= p2; p++) + if ((s = Tree[p].score) > s0) + { + s0 = s; p0 = p; + } + if (p0 != p1) + { + temp = Tree[p1]; Tree[p1] = Tree[p0]; Tree[p0] = temp; + } +} + + +repetition(cnt) +short *cnt; + +/* + Check for draw by threefold repetition. +*/ + +{ +register short i,c; +short f,t,b[64]; +unsigned short m; + *cnt = c = 0; + if (GameCnt > Game50+3) + { +/* + memset((char *)b,0,64*sizeof(short)); +*/ + for (i = 0; i < 64; b[i++] = 0); + for (i = GameCnt; i > Game50; i--) + { + m = GameList[i].gmove; f = m>>8; t = m & 0xFF; + if (++b[f] == 0) c--; else c++; + if (--b[t] == 0) c--; else c++; + if (c == 0) (*cnt)++; + } + } +} + +#if (NEWMOVE < 3) +int SqAtakd(sq,side) +short sq,side; + +/* + See if any piece with color 'side' ataks sq. First check for pawns + or king, then try other pieces. Array Dcode is used to check for + knight attacks or R,B,Q co-linearity. +*/ + +{ +register short m,d; +short i,m0,m1,loc,piece,*PL; + + m1 = map[sq]; + if (side == white) m = m1-0x0F; else m = m1+0x0F; + if (!(m & 0x88)) + if (board[unmap[m]] == pawn && color[unmap[m]] == side) return(true); + if (side == white) m = m1-0x11; else m = m1+0x11; + if (!(m & 0x88)) + if (board[unmap[m]] == pawn && color[unmap[m]] == side) return(true); + if (distance(sq,PieceList[side][0]) == 1) return(true); + + PL = PieceList[side]; + for (i = 1; i <= PieceCnt[side]; i++) + { + loc = PL[i]; piece = board[loc]; + if (piece == pawn) continue; + m0 = map[loc]; d = Dcode[abs(m1-m0)]; + if (d == 0 || (Pdir[d] & pbit[piece]) == 0) continue; + if (piece == knight) return(true); + else + { + if (m1 < m0) d = -d; + for (m = m0+d; m != m1; m += d) + if (color[unmap[m]] != neutral) break; + if (m == m1) return(true); + } + } + return(false); +} +#endif + +#if (NEWMOVE < 2) +ataks(side,a) +short side,*a; + +/* + Fill array atak[][] with info about ataks to a square. Bits 8-15 + are set if the piece (king..pawn) ataks the square. Bits 0-7 + contain a count of total ataks to the square. +*/ + +{ +register short u,m; +short d,c,j,j1,j2,piece,i,m0,sq,*PL; + +/* + memset((char *)a,0,64*sizeof(short)); +*/ + for (u = 0; u < 64; a[u++] = 0); + Dstart[pawn] = Dpwn[side]; Dstop[pawn] = Dstart[pawn] + 1; + PL = PieceList[side]; + for (i = 0; i <= PieceCnt[side]; i++) + { + sq = PL[i]; + m0 = map[sq]; + piece = board[sq]; + c = control[piece]; j1 = Dstart[piece]; j2 = Dstop[piece]; + if (sweep[piece]) + for (j = j1; j <= j2; j++) + { + d = Dir[j]; m = m0+d; + while (!(m & 0x88)) + { + u = unmap[m]; + a[u] = ++a[u] | c; + if (color[u] == neutral) m += d; + else break; + } + } + else + for (j = j1; j <= j2; j++) + if (!((m = m0+Dir[j]) & 0x88)) + { + u = unmap[m]; + a[u] = ++a[u] | c; + } + } +} +#endif + +/* ............ POSITIONAL EVALUATION ROUTINES ............ */ + +ScorePosition(side,score) +short side,*score; + +/* + Perform normal static evaluation of board position. A score is + generated for each piece and these are summed to get a score for each + side. +*/ + +{ +register short sq,s; +short i,xside,pscore[3]; + + wking = PieceList[white][0]; bking = PieceList[black][0]; + UpdateWeights(); + xside = otherside[side]; + pscore[white] = pscore[black] = 0; + + for (c1 = white; c1 <= black; c1++) + { + c2 = otherside[c1]; + if (c1 == white) EnemyKing = bking; else EnemyKing = wking; + atk1 = atak[c1]; atk2 = atak[c2]; + PC1 = PawnCnt[c1]; PC2 = PawnCnt[c2]; + for (i = 0; i <= PieceCnt[c1]; i++) + { + sq = PieceList[c1][i]; + s = SqValue(sq,side); + pscore[c1] += s; + svalue[sq] = s; + } + } + if (hung[side] > 1) pscore[side] += HUNGX; + if (hung[xside] > 1) pscore[xside] += HUNGX; + + *score = mtl[side] - mtl[xside] + pscore[side] - pscore[xside] + 10; + if (dither) *score += rand() % dither; + + if (*score > 0 && pmtl[side] == 0) + if (emtl[side] < valueR) *score = 0; + else if (*score < valueR) *score /= 2; + if (*score < 0 && pmtl[xside] == 0) + if (emtl[xside] < valueR) *score = 0; + else if (-*score < valueR) *score /= 2; + + if (mtl[xside] == valueK && emtl[side] > valueB) *score += 200; + if (mtl[side] == valueK && emtl[xside] > valueB) *score -= 200; +} + + +ScoreLoneKing(side,score) +short side,*score; + +/* + Static evaluation when loser has only a king and winner has no pawns + or no pieces. +*/ + +{ +short winner,loser,king1,king2,s,i; + + UpdateWeights(); + if (mtl[white] > mtl[black]) winner = white; else winner = black; + loser = otherside[winner]; + king1 = PieceList[winner][0]; king2 = PieceList[loser][0]; + + s = 0; + + if (pmtl[winner] > 0) + for (i = 1; i <= PieceCnt[winner]; i++) + s += ScoreKPK(side,winner,loser,king1,king2,PieceList[winner][i]); + + else if (emtl[winner] == valueB+valueN) + s = ScoreKBNK(winner,king1,king2); + + else if (emtl[winner] > valueB) + s = 500 + emtl[winner] - DyingKing[king2] - 2*distance(king1,king2); + + if (side == winner) *score = s; else *score = -s; +} + + +int ScoreKPK(side,winner,loser,king1,king2,sq) +short side,winner,loser,king1,king2,sq; + +/* + Score King and Pawns versus King endings. +*/ + +{ +short s,r; + + if (PieceCnt[winner] == 1) s = 50; else s = 120; + if (winner == white) + { + if (side == loser) r = row[sq]-1; else r = row[sq]; + if (row[king2] >= r && distance(sq,king2) < 8-r) s += 10*row[sq]; + else s = 500+50*row[sq]; + if (row[sq] < 6) sq += 16; else sq += 8; + } + else + { + if (side == loser) r = row[sq]+1; else r = row[sq]; + if (row[king2] <= r && distance(sq,king2) < r+1) s += 10*(7-row[sq]); + else s = 500+50*(7-row[sq]); + if (row[sq] > 1) sq -= 16; else sq -= 8; + } + s += 8*(taxicab(king2,sq) - taxicab(king1,sq)); + return(s); +} + + +int ScoreKBNK(winner,king1,king2) +short winner,king1,king2; + +/* + Score King+Bishop+Knight versus King endings. + This doesn't work all that well but it's better than nothing. +*/ + +{ +short s; + s = emtl[winner] - 300; + if (KBNKsq == 0) s += KBNK[king2]; + else s += KBNK[locn[row[king2]][7-column[king2]]]; + s -= taxicab(king1,king2); + s -= distance(PieceList[winner][1],king2); + s -= distance(PieceList[winner][2],king2); + return(s); +} + + +SqValue(sq,side) +short sq,side; + +/* + Calculate the positional value for the piece on 'sq'. +*/ + +{ +register short j,fyle,rank; +short s,piece,a1,a2,in_square,r,mob,e,c; + + piece = board[sq]; + a1 = (atk1[sq] & 0x4FFF); a2 = (atk2[sq] & 0x4FFF); + rank = row[sq]; fyle = column[sq]; + s = 0; + if (piece == pawn && c1 == white) + { + s = Mwpawn[sq]; + if (sq == 11 || sq == 12) + if (color[sq+8] != neutral) s += PEDRNK2B; + if ((fyle == 0 || PC1[fyle-1] == 0) && + (fyle == 7 || PC1[fyle+1] == 0)) + s += ISOLANI[fyle]; + else if (PC1[fyle] > 1) s += PDOUBLED; + if (a1 < ctlP && atk1[sq+8] < ctlP) + { + s += BACKWARD[a2 & 0xFF]; + if (PC2[fyle] == 0) s += PWEAKH; + if (color[sq+8] != neutral) s += PBLOK; + } + if (PC2[fyle] == 0) + { + if (side == black) r = rank-1; else r = rank; + in_square = (row[bking] >= r && distance(sq,bking) < 8-r); + if (a2 == 0 || side == white) e = 0; else e = 1; + for (j = sq+8; j < 64; j += 8) + if (atk2[j] >= ctlP) { e = 2; break; } + else if (atk2[j] > 0 || color[j] != neutral) e = 1; + if (e == 2) s += (stage*PassedPawn3[rank]) / 10; + else if (in_square || e == 1) s += (stage*PassedPawn2[rank]) / 10; + else if (emtl[black] > 0) s += (stage*PassedPawn1[rank]) / 10; + else s += PassedPawn0[rank]; + } + } + else if (piece == pawn && c1 == black) + { + s = Mbpawn[sq]; + if (sq == 51 || sq == 52) + if (color[sq-8] != neutral) s += PEDRNK2B; + if ((fyle == 0 || PC1[fyle-1] == 0) && + (fyle == 7 || PC1[fyle+1] == 0)) + s += ISOLANI[fyle]; + else if (PC1[fyle] > 1) s += PDOUBLED; + if (a1 < ctlP && atk1[sq-8] < ctlP) + { + s += BACKWARD[a2 & 0xFF]; + if (PC2[fyle] == 0) s += PWEAKH; + if (color[sq-8] != neutral) s += PBLOK; + } + if (PC2[fyle] == 0) + { + if (side == white) r = rank+1; else r = rank; + in_square = (row[wking] <= r && distance(sq,wking) < r+1); + if (a2 == 0 || side == black) e = 0; else e = 1; + for (j = sq-8; j >= 0; j -= 8) + if (atk2[j] >= ctlP) { e = 2; break; } + else if (atk2[j] > 0 || color[j] != neutral) e = 1; + if (e == 2) s += (stage*PassedPawn3[7-rank]) / 10; + else if (in_square || e == 1) s += (stage*PassedPawn2[7-rank]) / 10; + else if (emtl[white] > 0) s += (stage*PassedPawn1[7-rank]) / 10; + else s += PassedPawn0[7-rank]; + } + } + else if (piece == knight) + { + s = Mknight[c1][sq]; + } + else if (piece == bishop) + { + s = Mbishop[c1][sq]; + BRscan(sq,&s,&mob); + s += BMBLTY[mob]; + } + else if (piece == rook) + { + s += RookBonus; + BRscan(sq,&s,&mob); + s += RMBLTY[mob]; + if (PC1[fyle] == 0) s += RHOPN; + if (PC2[fyle] == 0) s += RHOPNX; + if (rank == rank7[c1] && pmtl[c2] > 100) s += 10; + if (stage > 2) s += 14 - taxicab(sq,EnemyKing); + } + else if (piece == queen) + { + if (stage > 2) s += 14 - taxicab(sq,EnemyKing); + if (distance(sq,EnemyKing) < 3) s += 12; + } + else if (piece == king) + { + s = Mking[c1][sq]; + if (KSFTY > 0) + if (Developed[c2] || stage > 0) KingScan(sq,&s); + if (castld[c1]) s += KCASTLD; + else if (kingmoved[c1]) s += KMOVD; + + if (PC1[fyle] == 0) s += KHOPN; + if (PC2[fyle] == 0) s += KHOPNX; + if (fyle == 1 || fyle == 2 || fyle == 3 || fyle == 7) + { + if (PC1[fyle-1] == 0) s += KHOPN; + if (PC2[fyle-1] == 0) s += KHOPNX; + } + if (fyle == 4 || fyle == 5 || fyle == 6 || fyle == 0) + { + if (PC1[fyle+1] == 0) s += KHOPN; + if (PC2[fyle+1] == 0) s += KHOPNX; + } + if (fyle == 2) + { + if (PC1[0] == 0) s += KHOPN; + if (PC2[0] == 0) s += KHOPNX; + } + if (fyle == 5) + { + if (PC1[7] == 0) s += KHOPN; + if (PC2[7] == 0) s += KHOPNX; + } + } + + if (a2 > 0) + { + c = (control[piece] & 0x4FFF); + if (a1 == 0 || a2 > c+1) + { + s += HUNGP; + ++hung[c1]; + if (piece != king && trapped(sq,piece)) ++hung[c1]; + } + else if (piece != pawn || a2 > a1) + if (a2 >= c || a1 < ctlP) s += ATAKD; + } + return(s); +} + +#if (NEWMOVE > 6) +KingScan(sq,s) +short sq,*s; + +/* + Assign penalties if king can be threatened by checks, if squares + near the king are controlled by the enemy (especially the queen), + or if there are no pawns near the king. +*/ + +#define ScoreThreat\ + if (color[u] != c2)\ + if (atk1[u] == 0 || (atk2[u] & 0xFF) > 1) ++cnt;\ + else *s -= 3 + +{ +register short m,u; +short d,i,m0,cnt,ok; + + cnt = 0; + m0 = map[sq]; + if (HasBishop[c2] || HasQueen[c2]) + for (i = Dstart[bishop]; i <= Dstop[bishop]; i++) + { + d = Dir[i]; m = m0+d; + while (!(m & 0x88)) + { + u = unmap[m]; + if (atk2[u] & ctlBQ) ScoreThreat; + if (color[u] != neutral) break; + m += d; + } + } + if (HasRook[c2] || HasQueen[c2]) + for (i = Dstart[rook]; i <= Dstop[rook]; i++) + { + d = Dir[i]; m = m0+d; + while (!(m & 0x88)) + { + u = unmap[m]; + if (atk2[u] & ctlRQ) ScoreThreat; + if (color[u] != neutral) break; + m += d; + } + } + if (HasKnight[c2]) + for (i = Dstart[knight]; i <= Dstop[knight]; i++) + if (!((m = m0+Dir[i]) & 0x88)) + { + u = unmap[m]; + if (atk2[u] & ctlNN) ScoreThreat; + } + *s += (KSFTY*Kthreat[cnt]) / 16; + + cnt = 0; ok = false; + m0 = map[sq]; + for (i = Dstart[king]; i <= Dstop[king]; i++) + if (!((m = m0+Dir[i]) & 0x88)) + { + u = unmap[m]; + if (board[u] == pawn) ok = true; + if (atk2[u] > atk1[u]) + { + ++cnt; + if (atk2[u] & ctlQ) + if (atk2[u] > ctlQ+1 && atk1[u] < ctlQ) *s -= 4*KSFTY; + } + } + if (!ok) *s -= KSFTY; + if (cnt > 1) *s -= KSFTY; +} +#endif + +#if (NEWMOVE < 4) +BRscan(sq,s,mob) +short sq,*s,*mob; + +/* + Find Bishop and Rook mobility, XRAY attacks, and pins. Increment the + hung[] array if a pin is found. +*/ + +{ +register short m,u; +short d,j,m0,piece,pin,*Kf; + + Kf = Kfield[c1]; + *mob = 0; + m0 = map[sq]; piece = board[sq]; + for (j = Dstart[piece]; j <= Dstop[piece]; j++) + { + pin = -1; + d = Dir[j]; m = m0+d; + while (!(m & 0x88)) + { + u = unmap[m]; *s += Kf[u]; + if (color[u] == neutral) + { + (*mob)++; + m += d; + } + else if (pin < 0) + { + if (board[u] == pawn || board[u] == king) break; + pin = u; + m += d; + } + else if (color[u] == c2 && (board[u] > piece || atk2[u] == 0)) + { + if (color[pin] == c2) + { + *s += PINVAL; + if (atk2[pin] == 0 || + atk1[pin] > control[board[pin]]+1) + ++hung[c2]; + } + else *s += XRAY; + break; + } + else break; + } + } +} +#endif + +#if (NEWMOVE > 5) +int trapped(sq,piece) +short sq,piece; + +/* + See if the attacked piece has unattacked squares to move to. +*/ + +{ +register short u,m,d; +short i,m0; + + m0 = map[sq]; + if (sweep[piece]) + for (i = Dstart[piece]; i <= Dstop[piece]; i++) + { + d = Dir[i]; m = m0+d; + while (!(m & 0x88)) + { + u = unmap[m]; + if (color[u] == c1) break; + if (atk2[u] == 0 || board[u] >= piece) return(false); + if (color[u] == c2) break; + m += d; + } + } + else if (piece == pawn) + { + if (c1 == white) u = sq+8; else u = sq-8; + if (color[u] == neutral && atk1[u] >= atk2[u]) + return(false); + if (!((m = m0+Dir[Dpwn[c1]]) & 0x88)) + if (color[unmap[m]] == c2) return(false); + if (!((m = m0+Dir[Dpwn[c1]+1]) & 0x88)) + if (color[unmap[m]] == c2) return(false); + } + else + { + for (i = Dstart[piece]; i <= Dstop[piece]; i++) + if (!((m = m0+Dir[i]) & 0x88)) + { + u = unmap[m]; + if (color[u] != c1) + if (atk2[u] == 0 || board[u] >= piece) return(false); + } + } + return(true); +} +#endif + +ExaminePosition() + +/* + This is done one time before the search is started. Set up arrays + Mwpawn, Mbpawn, Mknight, Mbishop, Mking which are used in the + SqValue() function to determine the positional value of each piece. +*/ + +{ +register short i,sq; +short wpadv,bpadv,wstrong,bstrong,z,side,pp,j,val,Pd,fyle,rank; + + wking = PieceList[white][0]; bking = PieceList[black][0]; + ataks(white,atak[white]); ataks(black,atak[black]); + Zwmtl = Zbmtl = 0; + UpdateWeights(); + HasPawn[white] = HasPawn[black] = 0; + HasKnight[white] = HasKnight[black] = 0; + HasBishop[white] = HasBishop[black] = 0; + HasRook[white] = HasRook[black] = 0; + HasQueen[white] = HasQueen[black] = 0; + for (side = white; side <= black; side++) + for (i = 0; i <= PieceCnt[side]; i++) + switch (board[PieceList[side][i]]) + { + case pawn : ++HasPawn[side]; break; + case knight : ++HasKnight[side]; break; + case bishop : ++HasBishop[side]; break; + case rook : ++HasRook[side]; break; + case queen : ++HasQueen[side]; break; + } + if (!Developed[white]) + Developed[white] = (board[1] != knight && board[2] != bishop && + board[5] != bishop && board[6] != knight); + if (!Developed[black]) + Developed[black] = (board[57] != knight && board[58] != bishop && + board[61] != bishop && board[62] != knight); + if (!PawnStorm && stage < 5) + PawnStorm = ((column[wking] < 3 && column[bking] > 4) || + (column[wking] > 4 && column[bking] < 3)); + + CopyBoard(pknight,Mknight[white]); + CopyBoard(pknight,Mknight[black]); + CopyBoard(pbishop,Mbishop[white]); + CopyBoard(pbishop,Mbishop[black]); + BlendBoard(KingOpening,KingEnding,Mking[white]); + BlendBoard(KingOpening,KingEnding,Mking[black]); + + for (sq = 0; sq < 64; sq++) + { + fyle = column[sq]; rank = row[sq]; + wstrong = bstrong = true; + for (i = sq; i < 64; i += 8) + if (atak[black][i] >= ctlP) wstrong = false; + for (i = sq; i >= 0; i -= 8) + if (atak[white][i] >= ctlP) bstrong = false; + wpadv = bpadv = PADVNCM; + if ((fyle == 0 || PawnCnt[white][fyle-1] == 0) && + (fyle == 7 || PawnCnt[white][fyle+1] == 0)) wpadv = PADVNCI; + if ((fyle == 0 || PawnCnt[black][fyle-1] == 0) && + (fyle == 7 || PawnCnt[black][fyle+1] == 0)) bpadv = PADVNCI; + Mwpawn[sq] = (wpadv*PawnAdvance[sq]) / 10; + Mbpawn[sq] = (bpadv*PawnAdvance[63-sq]) / 10; + Mwpawn[sq] += PawnBonus; Mbpawn[sq] += PawnBonus; + if (castld[white] || kingmoved[white]) + { + if ((fyle < 3 || fyle > 4) && distance(sq,wking) < 3) + Mwpawn[sq] += PAWNSHIELD; + } + else if (rank < 3 && (fyle < 2 || fyle > 5)) + Mwpawn[sq] += PAWNSHIELD / 2; + if (castld[black] || kingmoved[black]) + { + if ((fyle < 3 || fyle > 4) && distance(sq,bking) < 3) + Mbpawn[sq] += PAWNSHIELD; + } + else if (rank > 4 && (fyle < 2 || fyle > 5)) + Mbpawn[sq] += PAWNSHIELD / 2; + if (PawnStorm) + { + if ((column[wking] < 4 && fyle > 4) || + (column[wking] > 3 && fyle < 3)) Mwpawn[sq] += 3*rank - 21; + if ((column[bking] < 4 && fyle > 4) || + (column[bking] > 3 && fyle < 3)) Mbpawn[sq] -= 3*rank; + } + + Mknight[white][sq] += 5 - distance(sq,bking); + Mknight[white][sq] += 5 - distance(sq,wking); + Mknight[black][sq] += 5 - distance(sq,wking); + Mknight[black][sq] += 5 - distance(sq,bking); + Mbishop[white][sq] += BishopBonus; + Mbishop[black][sq] += BishopBonus; + for (i = 0; i <= PieceCnt[black]; i++) + if (distance(sq,PieceList[black][i]) < 3) + Mknight[white][sq] += KNIGHTPOST; + for (i = 0; i <= PieceCnt[white]; i++) + if (distance(sq,PieceList[white][i]) < 3) + Mknight[black][sq] += KNIGHTPOST; + if (wstrong) Mknight[white][sq] += KNIGHTSTRONG; + if (bstrong) Mknight[black][sq] += KNIGHTSTRONG; + if (wstrong) Mbishop[white][sq] += BISHOPSTRONG; + if (bstrong) Mbishop[black][sq] += BISHOPSTRONG; + + if (HasBishop[white] == 2) Mbishop[white][sq] += 8; + if (HasBishop[black] == 2) Mbishop[black][sq] += 8; + if (HasKnight[white] == 2) Mknight[white][sq] += 5; + if (HasKnight[black] == 2) Mknight[black][sq] += 5; + + if (board[sq] == bishop) + if (rank % 2 == fyle % 2) KBNKsq = 0; else KBNKsq = 7; + + Kfield[white][sq] = Kfield[black][sq] = 0; + if (distance(sq,wking) == 1) Kfield[black][sq] = KATAK; + if (distance(sq,bking) == 1) Kfield[white][sq] = KATAK; + + Pd = 0; + for (i = 0; i < 64; i++) + if (board[i] == pawn) + { + if (color[i] == white) + { + pp = true; + if (row[i] == 6) z = i+8; else z = i+16; + for (j = i+8; j < 64; j += 8) + if (atak[black][j] > ctlP || board[j] == pawn) pp = false; + } + else + { + pp = true; + if (row[i] == 1) z = i-8; else z = i-16; + for (j = i-8; j >= 0; j -= 8) + if (atak[white][j] > ctlP || board[j] == pawn) pp = false; + } + if (pp) Pd += 5*taxicab(sq,z); else Pd += taxicab(sq,z); + } + if (Pd != 0) + { + val = (Pd*stage2) / 10; + Mking[white][sq] -= val; + Mking[black][sq] -= val; + } + } +} + + +UpdateWeights() + +/* + If material balance has changed, determine the values for the + positional evaluation terms. +*/ + +{ +short tmtl; + + if (mtl[white] != Zwmtl || mtl[black] != Zbmtl) + { + Zwmtl = mtl[white]; Zbmtl = mtl[black]; + emtl[white] = Zwmtl - pmtl[white] - valueK; + emtl[black] = Zbmtl - pmtl[black] - valueK; + tmtl = emtl[white] + emtl[black]; + if (tmtl > 6600) stage = 0; + else if (tmtl < 1400) stage = 10; + else stage = (6600-tmtl) / 520; + if (tmtl > 3600) stage2 = 0; + else if (tmtl < 1400) stage2 = 10; + else stage2 = (3600-tmtl) / 220; + + PEDRNK2B = -15; /* centre pawn on 2nd rank & blocked */ + PBLOK = -4; /* blocked backward pawn */ + PDOUBLED = -14; /* doubled pawn */ + PWEAKH = -4; /* weak pawn on half open file */ + PAWNSHIELD = 10-stage; /* pawn near friendly king */ + PADVNCM = 10; /* advanced pawn multiplier */ + PADVNCI = 7; /* muliplier for isolated pawn */ + PawnBonus = stage; + + KNIGHTPOST = (stage+2)/3; /* knight near enemy pieces */ + KNIGHTSTRONG = (stage+6)/2; /* occupies pawn hole */ + + BISHOPSTRONG = (stage+6)/2; /* occupies pawn hole */ + BishopBonus = 2*stage; + + RHOPN = 10; /* rook on half open file */ + RHOPNX = 4; + RookBonus = 6*stage; + + XRAY = 8; /* Xray attack on piece */ + PINVAL = 10; /* Pin */ + + KHOPN = (3*stage-30) / 2; /* king on half open file */ + KHOPNX = KHOPN / 2; + KCASTLD = 10 - stage; + KMOVD = -40 / (stage+1); /* king moved before castling */ + KATAK = (10-stage) / 2; /* B,R attacks near enemy king */ + if (stage < 8) KSFTY = 16-2*stage; else KSFTY = 0; + + ATAKD = -6; /* defender > attacker */ + HUNGP = -8; /* each hung piece */ + HUNGX = -12; /* extra for >1 hung piece */ + } +} + +#if (NEWMOVE < 1) +int distance(a,b) +short a,b; +{ +register short d1,d2; + + d1 = abs(column[a]-column[b]); + d2 = abs(row[a]-row[b]); + return(d1 > d2 ? d1 : d2); +} +#endif + +BlendBoard(a,b,c) +short a[64],b[64],c[64]; +{ +register int sq; + for (sq = 0; sq < 64; sq++) + c[sq] = (a[sq]*(10-stage) + b[sq]*stage) / 10; +} + + +CopyBoard(a,b) +short a[64],b[64]; +{ +register int sq; + for (sq = 0; sq < 64; sq++) + b[sq] = a[sq]; +} diff --git a/gnu/games/chess/gnuchess.h b/gnu/games/chess/gnuchess.h new file mode 100644 index 0000000..6e9c74b --- /dev/null +++ b/gnu/games/chess/gnuchess.h @@ -0,0 +1,97 @@ +/* + This file contains code for CHESS. + Copyright (C) 1986, 1987, 1988 Free Software Foundation, Inc. + + This file is part of CHESS. + + CHESS is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY. No author or distributor + accepts responsibility to anyone for the consequences of using it + or for whether it serves any particular purpose or works at all, + unless he says so in writing. Refer to the CHESS General Public + License for full details. + + Everyone is granted permission to copy, modify and redistribute + CHESS, but only under the conditions described in the + CHESS General Public License. A copy of this license is + supposed to have been given to you along with CHESS so you + can know your rights and responsibilities. It should be in a + file named COPYING. Among other things, the copyright notice + and this notice must be preserved on all copies. +*/ + + +/* Header file for GNU CHESS */ + +#define neutral 2 +#define white 0 +#define black 1 +#define no_piece 0 +#define pawn 1 +#define knight 2 +#define bishop 3 +#define rook 4 +#define queen 5 +#define king 6 +#define pxx " PNBRQK" +#define qxx " pnbrqk" +#define rxx "12345678" +#define cxx "abcdefgh" +#define check 0x0001 +#define capture 0x0002 +#define draw 0x0004 +#define promote 0x0008 +#define cstlmask 0x0010 +#define epmask 0x0020 +#define exact 0x0040 +#define pwnthrt 0x0080 +#define maxdepth 30 +#define true 1 +#define false 0 + +struct leaf + { + short f,t,score,reply; + unsigned short flags; + }; +struct GameRec + { + unsigned short gmove; + short score,depth,time,piece,color; + long nodes; + }; +struct TimeControlRec + { + short moves[2]; + long clock[2]; + }; +struct BookEntry + { + struct BookEntry *next; + unsigned short *mv; + }; + +extern char mvstr1[5],mvstr2[5]; +extern struct leaf Tree[2000],*root; +extern short TrPnt[maxdepth],board[64],color[64]; +extern short row[64],column[64],locn[8][8]; +extern short atak[2][64],PawnCnt[2][8]; +extern short castld[2],kingmoved[2]; +extern short c1,c2,*atk1,*atk2,*PC1,*PC2; +extern short mate,post,opponent,computer,Sdepth,Awindow,Bwindow,dither; +extern long ResponseTime,ExtraTime,Level,et,et0,time0,cputimer,ft; +extern long NodeCnt,evrate,ETnodes,EvalNodes,HashCnt; +extern short quit,reverse,bothsides,hashflag,InChk,player,force,easy,beep,meter; +extern short timeout,xwndw; +extern struct GameRec GameList[240]; +extern short GameCnt,Game50,epsquare,lpost,rcptr,contempt; +extern short MaxSearchDepth; +extern struct BookEntry *Book; +extern struct TimeControlRec TimeControl; +extern short TCflag,TCmoves,TCminutes,OperatorTime; +extern short otherside[3]; +extern short Stboard[64]; +extern short Stcolor[64]; +extern unsigned short hint,PrVar[maxdepth]; + +#define HZ 60 diff --git a/gnu/games/chess/move.c b/gnu/games/chess/move.c new file mode 100644 index 0000000..4ce686c --- /dev/null +++ b/gnu/games/chess/move.c @@ -0,0 +1,357 @@ +/* move generator hes@log-sv.se 890318 + Modified: 890606 NEWMOVE Levels 1-6 for easier debugging */ +#include "move.h" +#include "gnuchess.h" + +short distdata[64][64]; +short taxidata[64][64]; + +void Initialize_dist() { +register short a,b,d,di; + + /* init taxi and dist data */ + for(a=0;a<64;a++) + for(b=0;b<64;b++) { + d = abs(column[a]-column[b]); + di = abs(row[a]-row[b]); + taxidata[a][b] = d + di; + distdata[a][b] = (d > di ? d : di); + }; +} + +#if (NEWMOVE > 1) +struct sqdata posdata[3][8][64][64]; + +static short direc[8][8] = { + 0, 0, 0, 0, 0, 0, 0, 0, /* no_piece = 0 */ + -10,-11, -9, 0, 0, 0, 0, 0, /* wpawn = 1 */ + -21,-19,-12, -8, 21, 19, 12, 8, /* knight = 2 */ + -11, -9, 11, 9, 0, 0, 0, 0, /* bishop = 3 */ + -10, -1, 10, 1, 0, 0, 0, 0, /* rook = 4 */ + -11, -9,-10, -1, 11, 9, 10, 1, /* queen = 5 */ + -11, -9,-10, -1, 11, 9, 10, 1, /* king = 6 */ + 0, 0, 0, 0, 0, 0, 0, 0};/* no_piece = 7 */ + +static short dc[3] = {-1,1,0}; + +static short max_steps [8] = {0,2,1,7,7,7,1,0}; + +static short unmap[120] = { + -1,-1,-1,-1,-1,-1,-1,-1,-1,-1, + -1,-1,-1,-1,-1,-1,-1,-1,-1,-1, + -1, 0, 1, 2, 3, 4, 5, 6, 7,-1, + -1, 8, 9,10,11,12,13,14,15,-1, + -1,16,17,18,19,20,21,22,23,-1, + -1,24,25,26,27,28,29,30,31,-1, + -1,32,33,34,35,36,37,38,39,-1, + -1,40,41,42,43,44,45,46,47,-1, + -1,48,49,50,51,52,53,54,55,-1, + -1,56,57,58,59,60,61,62,63,-1, + -1,-1,-1,-1,-1,-1,-1,-1,-1,-1, + -1,-1,-1,-1,-1,-1,-1,-1,-1,-1}; + +void Initialize_moves() { + short c,ptyp,po,p0,d,di,s; + struct sqdata *p; + short dest[8][8]; + short steps[8]; + short sorted[8]; + + /* init posdata */ + for(c=0;c<3;c++) + for(ptyp=0;ptyp<8;ptyp++) + for(po=0;po<64;po++) + for(p0=0;p0<64;p0++) { + posdata[c][ptyp][po][p0].nextpos = po; + posdata[c][ptyp][po][p0].nextdir = po; + }; + /* dest is a function of dir and step */ + for(c=0;c<2;c++) + for(ptyp=1;ptyp<7;ptyp++) + for(po=21;po<99;po++) + if (unmap[po] >= 0) { + p = posdata[c][ptyp][unmap[po]]; + for(d=0;d<8;d++) { + dest[d][0] = unmap[po]; + if (dc[c]*direc[ptyp][d] != 0) { + p0=po; + for(s=0;s<max_steps[ptyp];s++) { + p0 = p0 + dc[c]*direc[ptyp][d]; + /* break if (off board) or + (pawns move two steps from home square) */ + if (unmap[p0] < 0 || + (ptyp == pawn && s>0 && (d>0 || Stboard[unmap[po]] != ptyp))) + break; + else + dest[d][s] = unmap[p0]; + } + } + else s=0; + /* sort dest in number of steps order */ + steps[d] = s; + for(di=d;di>0;di--) + if (steps[sorted[di-1]] < s) + sorted[di] = sorted[di-1]; + else + break; + sorted[di] = d; + } + /* update posdata, pawns have two threads (capture and no capture) */ + p0=unmap[po]; + if (ptyp == pawn) { + for(s=0;s<steps[0];s++) { + p[p0].nextpos = dest[0][s]; + p0 = dest[0][s]; + } + p0=unmap[po]; + for(d=1;d<3;d++) { + p[p0].nextdir = dest[d][0]; + p0 = dest[d][0]; + } + } + else { + p[p0].nextdir = dest[sorted[0]][0]; + for(d=0;d<8;d++) + for(s=0;s<steps[sorted[d]];s++) { + p[p0].nextpos = dest[sorted[d]][s]; + p0 = dest[sorted[d]][s]; + if (d < 7) + p[p0].nextdir = dest[sorted[d+1]][0]; + /* else is already initialised */ + } + } +#ifdef DEBUG + printf("Ptyp:%d Position:%d\n{",ptyp,unmap[po]); + for(p0=0;p0<63;p0++) printf("%d,",p[p0].nextpos); + printf("%d};\n",p[63].nextpos); + for(p0=0;p0<63;p0++) printf("%d,",p[p0].nextdir); + printf("%d};\n",p[63].nextdir); +#endif DEBUG + } +} +#endif + + +#if (NEWMOVE > 2) +int SqAtakd(sq,side) +short sq,side; + +/* + See if any piece with color 'side' ataks sq. First check pawns + Then Queen, Bishop, Rook and King and last Knight. +*/ + +{ + register short u; + register struct sqdata *p; + + p = posdata[1-side][pawn][sq]; + u = p[sq].nextdir; /* follow captures thread */ + while (u != sq) { + if (board[u] == pawn && color[u] == side) return(true); + u = p[u].nextdir; + } + /* king capture */ + if (distance(sq,PieceList[side][0]) == 1) return(true); + /* try a queen bishop capture */ + p = posdata[side][bishop][sq]; + u = p[sq].nextpos; + while (u != sq) { + if (color[u] == neutral) { + u = p[u].nextpos; + } + else { + if (color[u] == side && + (board[u] == queen || board[u] == bishop)) + return(true); + u = p[u].nextdir; + } + } + /* try a queen rook capture */ + p = posdata[side][rook][sq]; + u = p[sq].nextpos; + while (u != sq) { + if (color[u] == neutral) { + u = p[u].nextpos; + } + else { + if (color[u] == side && + (board[u] == queen || board[u] == rook)) + return(true); + u = p[u].nextdir; + } + } + /* try a knight capture */ + p = posdata[side][knight][sq]; + u = p[sq].nextpos; + while (u != sq) { + if (color[u] == neutral) { + u = p[u].nextpos; + } + else { + if (color[u] == side && board[u] == knight) return(true); + u = p[u].nextdir; + } + } + return(false); +} +#endif + +#if (NEWMOVE > 3) +BRscan(sq,s,mob) +short sq,*s,*mob; +/* + Find Bishop and Rook mobility, XRAY attacks, and pins. Increment the + hung[] array if a pin is found. +*/ +{ + register short u,piece,pin; + register struct sqdata *p; + short *Kf; + + Kf = Kfield[c1]; + *mob = 0; + piece = board[sq]; + p = posdata[color[sq]][piece][sq]; + u = p[sq].nextpos; + pin = -1; /* start new direction */ + while (u != sq) { + *s += Kf[u]; + if (color[u] == neutral) { + (*mob)++; + if (p[u].nextpos == p[u].nextdir) pin = -1; /* oops new direction */ + u = p[u].nextpos; + } + else if (pin < 0) { + if (board[u] == pawn || board[u] == king) + u = p[u].nextdir; + else { + if (p[u].nextpos != p[u].nextdir) + pin = u; /* not on the edge and on to find a pin */ + u = p[u].nextpos; + } + } + else if (color[u] == c2 && (board[u] > piece || atk2[u] == 0)) + { + if (color[pin] == c2) + { + *s += PINVAL; + if (atk2[pin] == 0 || + atk1[pin] > control[board[pin]]+1) + ++hung[c2]; + } + else *s += XRAY; + pin = -1; /* new direction */ + u = p[u].nextdir; + } + else { + pin = -1; /* new direction */ + u = p[u].nextdir; + } + } +} +#endif + +#if (NEWMOVE >= 5) +CaptureList(side,xside,ply) +short side,xside,ply; +{ + register short u,sq; + register struct sqdata *p; + short i,piece,*PL; + struct leaf *node; + + TrPnt[ply+1] = TrPnt[ply]; + node = &Tree[TrPnt[ply]]; + PL = PieceList[side]; + for (i = 0; i <= PieceCnt[side]; i++) + { + sq = PL[i]; + piece = board[sq]; + p = posdata[side][piece][sq]; + if (piece == pawn) { + u = p[sq].nextdir; /* follow captures thread */ + while (u != sq) { + if (color[u] == xside) { + node->f = sq; node->t = u; + node->flags = capture; + if (u < 8 || u > 55) + { + node->flags |= promote; + node->score = valueQ; + } + else + node->score = value[board[u]] + svalue[board[u]] - piece; + ++node; + ++TrPnt[ply+1]; + } + u = p[u].nextdir; + } + } + else { + u = p[sq].nextpos; + while (u != sq) { + if (color[u] == neutral) + u = p[u].nextpos; + else { + if (color[u] == xside) { + node->f = sq; node->t = u; + node->flags = capture; + node->score = value[board[u]] + svalue[board[u]] - piece; + ++node; + ++TrPnt[ply+1]; + } + u = p[u].nextdir; + } + } + } + } +} +#endif + +#if (NEWMOVE > 5) +GenMoves(ply,sq,side,xside) + short ply,sq,side,xside; + +/* + Generate moves for a piece. The moves are taken from the + precalulated array posdata. If the board is free, next move + is choosen from nextpos else from nextdir. +*/ + +{ + register short u,piece; + register struct sqdata *p; + + piece = board[sq]; + p = posdata[side][piece][sq]; + if (piece == pawn) { + u = p[sq].nextdir; /* follow captures thread */ + while (u != sq) { + if (color[u] == xside) LinkMove(ply,sq,u,xside); + u = p[u].nextdir; + } + u = p[sq].nextpos; /* and follow no captures thread */ + while (u != sq) { + if (color[u] == neutral && (u != sq+16 || color[u-8] == neutral) + && (u != sq-16 || color[u+8] == neutral)) { + LinkMove(ply,sq,u,xside); + } + u = p[u].nextpos; + } + } + else { + u = p[sq].nextpos; + while (u != sq) { + if (color[u] == neutral) { + LinkMove(ply,sq,u,xside); + u = p[u].nextpos; + } + else { + if (color[u] == xside) LinkMove(ply,sq,u,xside); + u = p[u].nextdir; + } + } + } +} +#endif diff --git a/gnu/games/chess/move.h b/gnu/games/chess/move.h new file mode 100644 index 0000000..2f32830 --- /dev/null +++ b/gnu/games/chess/move.h @@ -0,0 +1,81 @@ +/* header file for move generator hes 890318 + Modified: 890510 minor bug fixed in Newataks + 890606 NEWMOVE levels 1-6 */ + +#if (NEWMOVE >= 1) +extern short distdata[64][64]; +extern short taxidata[64][64]; + +#define taxicab(a,b) taxidata[a][b] +#define distance(a,b) distdata[a][b] + +extern void Initialize_dist(); +#endif + +#if (NEWMOVE >= 2) +struct sqdata { + short nextpos; + short nextdir; +}; +extern struct sqdata posdata[3][8][64][64]; + +extern void Initialize_moves(); + +#define ataks(side,a)\ +{\ + register short u,c,sq;\ + register struct sqdata *p;\ + short i,piece,*PL;\ + \ + for (u = 64; u; a[--u] = 0); \ + PL = PieceList[side];\ + for (i = 0; i <= PieceCnt[side]; i++)\ + {\ + sq = PL[i];\ + piece = board[sq];\ + c = control[piece];\ + p = posdata[side][piece][sq];\ + if (piece == pawn) {\ + u = p[sq].nextdir; /* follow captures thread */\ + while (u != sq) {\ + a[u] = ++a[u] | c;\ + u = p[u].nextdir;\ + }\ + }\ + else {\ + u = p[sq].nextpos;\ + while (u != sq) {\ + a[u] = ++a[u] | c;\ + if (color[u] == neutral)\ + u = p[u].nextpos;\ + else\ + u = p[u].nextdir;\ + }\ + }\ + }\ +} +#endif + +#if (NEWMOVE >= 3) +extern short PieceList[2][16]; + +extern int Sqatakd(); +#endif + +#if (NEWMOVE > 3) +extern short Kfield[2][64],PINVAL,control[7],hung[2],XRAY; + +extern BRscan(); +#endif + +#if (NEWMOVE > 4) +#define valueQ 1100 + +extern short PieceCnt[2],value[7],svalue[64]; + +extern CaptureList(); +#endif + +#if (NEWMOVE > 5) +extern GenMoves(); +#endif diff --git a/gnu/games/chess/nondsp.c b/gnu/games/chess/nondsp.c new file mode 100644 index 0000000..0b29ad5 --- /dev/null +++ b/gnu/games/chess/nondsp.c @@ -0,0 +1,791 @@ +/* + UNIX & MSDOS NON-DISPLAY, AND CHESSTOOL interface for Chess + + Revision: 4-25-88 + + Copyright (C) 1986, 1987, 1988 Free Software Foundation, Inc. + Copyright (c) 1988 John Stanback + + This file is part of CHESS. + + CHESS is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY. No author or distributor + accepts responsibility to anyone for the consequences of using it + or for whether it serves any particular purpose or works at all, + unless he says so in writing. Refer to the CHESS General Public + License for full details. + + Everyone is granted permission to copy, modify and redistribute + CHESS, but only under the conditions described in the + CHESS General Public License. A copy of this license is + supposed to have been given to you along with CHESS so you + can know your rights and responsibilities. It should be in a + file named COPYING. Among other things, the copyright notice + and this notice must be preserved on all copies. +*/ + + +#include <stdio.h> +#include <ctype.h> +#ifdef MSDOS +#include <dos.h> +#include <stdlib.h> +#include <time.h> +#else +#include <sys/param.h> +#include <sys/times.h> +#include <sys/file.h> +struct tms tmbuf1,tmbuf2; +int TerminateSearch(),Die(); +#endif MSDOS + +#include "gnuchess.h" +#ifdef NEWMOVE +#include "move.h" +#endif + +#define printz printf +#define scanz scanf +int mycnt1,mycnt2; + + +Initialize() +{ + mycnt1 = mycnt2 = 0; +#ifndef MSDOS +#endif +#ifdef CHESSTOOL + setlinebuf(stdout); +/* + setvbuf(stdout,NULL,_IOLBF,BUFSIZ); +*/ + printf("Chess\n"); + if (Level == 0 && !TCflag) Level = 15; +#endif CHESSTOOL +} + +ExitChess() +{ + ListGame(); + exit(0); +} + +#ifndef MSDOS +Die() +{ +char s[80]; + printz("Abort? "); + scanz("%s",s); + if (strcmp(s,"yes") == 0) ExitChess(); +} + +TerminateSearch() +{ + timeout = true; + bothsides = false; +} +#endif MSDOS + + +InputCommand() + +/* + Process the users command. If easy mode is OFF (the computer is + thinking on opponents time) and the program is out of book, then make + the 'hint' move on the board and call SelectMove() to find a response. + The user terminates the search by entering ^C (quit siqnal) before + entering a command. If the opponent does not make the hint move, then + set Sdepth to zero. +*/ + +{ +int i; +short ok,tmp; +long cnt,rate,t1,t2; +unsigned short mv; +char s[80]; + + ok = quit = false; + player = opponent; + ft = 0; + if (hint > 0 && !easy && Book == NULL) + { + fflush(stdout); + time0 = time((long *)0); + algbr(hint>>8,hint & 0xFF,false); + strcpy(s,mvstr1); + tmp = epsquare; + if (VerifyMove(s,1,&mv)) + { + SelectMove(computer,2); + VerifyMove(mvstr1,2,&mv); + if (Sdepth > 0) Sdepth--; + } + ft = time((long *)0) - time0; + epsquare = tmp; + } + +#ifndef MSDOS +#endif + while (!(ok || quit)) + { + PromptForMove(); + i = scanz("%s",s); + if (i == EOF || s[0] == 0) ExitChess(); + player = opponent; + ok = VerifyMove(s,0,&mv); + if (ok && mv != hint) + { + Sdepth = 0; + ft = 0; + } + + if (strcmp(s,"bd") == 0) + { + ClrScreen(); + UpdateDisplay(0,0,1,0); + } + if (strcmp(s,"quit") == 0) quit = true; + if (strcmp(s,"post") == 0) post = !post; + if (strcmp(s,"set") == 0) EditBoard(); + if (strcmp(s,"go") == 0) ok = true; + if (strcmp(s,"help") == 0) help(); + if (strcmp(s,"force") == 0) force = !force; + if (strcmp(s,"book") == 0) Book = NULL; + if (strcmp(s,"new") == 0) NewGame(); + if (strcmp(s,"list") == 0) ListGame(); + if (strcmp(s,"level") == 0) SelectLevel(); + if (strcmp(s,"hash") == 0) hashflag = !hashflag; + if (strcmp(s,"beep") == 0) beep = !beep; + if (strcmp(s,"Awindow") == 0) ChangeAlphaWindow(); + if (strcmp(s,"Bwindow") == 0) ChangeBetaWindow(); + if (strcmp(s,"rcptr") == 0) rcptr = !rcptr; + if (strcmp(s,"hint") == 0) GiveHint(); + if (strcmp(s,"zero") == 0) ZeroTTable(); + if (strcmp(s,"both") == 0) + { + bothsides = !bothsides; + Sdepth = 0; + SelectMove(opponent,1); + ok = true; + } + if (strcmp(s,"reverse") == 0) + { + reverse = !reverse; + ClrScreen(); + UpdateDisplay(0,0,1,0); + } + if (strcmp(s,"switch") == 0) + { + computer = otherside[computer]; + opponent = otherside[opponent]; + force = false; + Sdepth = 0; + ok = true; + } + if (strcmp(s,"white") == 0) + { + computer = white; opponent = black; + ok = true; force = false; + Sdepth = 0; + } + if (strcmp(s,"black") == 0) + { + computer = black; opponent = white; + ok = true; force = false; + Sdepth = 0; + } + if (strcmp(s,"undo") == 0 && GameCnt >= 0) Undo(); + if (strcmp(s,"remove") == 0 && GameCnt >= 1) + { + Undo(); Undo(); + } + if (strcmp(s,"get") == 0) GetGame(); + if (strcmp(s,"save") == 0) SaveGame(); + if (strcmp(s,"depth") == 0) ChangeSearchDepth(); + if (strcmp(s,"random") == 0) dither = 6; + if (strcmp(s,"easy") == 0) easy = !easy; + if (strcmp(s,"contempt") == 0) SetContempt(); + if (strcmp(s,"xwndw") == 0) ChangeXwindow(); + if (strcmp(s,"test") == 0) + { + t1 = time(0); + cnt = 0; + for (i = 0; i < 10000; i++) + { + MoveList(opponent,2); + cnt += TrPnt[3] - TrPnt[2]; + } + t2 = time(0); + rate = cnt / (t2-t1); + printz("cnt= %ld rate= %ld\n",cnt,rate); + } + } + + ElapsedTime(1); + if (force) + { + computer = opponent; opponent = otherside[computer]; + } +#ifndef MSDOS + (void) times(&tmbuf1); +#ifdef CHESSTOOL + printf("%d. %s\n",++mycnt2,s); +#endif CHESSTOOL +#endif MSDOS +} + + +help() +{ + ClrScreen(); + printz("CHESS command summary\n"); + printz("g1f3 move from g1 to f3\n"); + printz("nf3 move knight to f3\n"); + printz("o-o castle king side\n"); + printz("o-o-o castle queen side\n"); + printz("set edit board\n"); + printz("switch sides with computer\n"); + printz("white computer plays white\n"); + printz("black computer plays black\n"); + printz("reverse board display\n"); + printz("both computer match\n"); + printz("random randomize play\n"); + printz("undo undo last move\n"); + printz("time change level\n"); + printz("depth set search depth\n"); + printz("post principle variation\n"); + printz("hint suggest a move\n"); + printz("bd redraw board\n"); + printz("clock set time control\n"); + printz("force enter game moves\n"); + printz("list game to chess.lst\n"); + printz("save game to file\n"); + printz("get game from file\n"); + printz("new start new game\n"); + printz("quit exit CHESS\n"); + printz("Computer: "); + if (computer == white) printz("WHITE\n"); else printz("BLACK\n"); + printz("Opponent: "); + if (opponent == white) printz("WHITE\n"); else printz("BLACK\n"); + printz("Response time: %ld",Level," sec.\n"); + printz("Easy mode: "); + if (easy) printz("ON\n"); else printz("OFF\n"); + printz("Depth: %d\n",MaxSearchDepth); + printz("Random: "); + if (dither) printz("ON\n"); else printz("OFF\n"); + printz("Transposition table: "); + if (hashflag) printz("ON\n"); else printz("OFF\n"); + UpdateDisplay(0,0,1,0); +} + + +EditBoard() + +/* + Set up a board position. Pieces are entered by typing the piece + followed by the location. For example, Nf3 will place a knight on + square f3. +*/ + +{ +short a,r,c,sq; +char s[80]; + + ClrScreen(); + UpdateDisplay(0,0,1,0); + printz(". exit to main\n"); + printz("# clear board\n"); + printz("enter piece & location: \n"); + + a = white; + do + { + scanz("%s",s); + if (s[0] == '#') + { + for (sq = 0; sq < 64; sq++) + { + board[sq] = no_piece; color[sq] = neutral; + } + UpdateDisplay(0,0,1,0); + } + if (s[0] == 'c' || s[0] == 'C') a = otherside[a]; + c = s[1]-'a'; r = s[2]-'1'; + if ((c >= 0) && (c < 8) && (r >= 0) && (r < 8)) + { + sq = locn[r][c]; + color[sq] = a; + if (s[0] == 'p') board[sq] = pawn; + else if (s[0] == 'n') board[sq] = knight; + else if (s[0] == 'b') board[sq] = bishop; + else if (s[0] == 'r') board[sq] = rook; + else if (s[0] == 'q') board[sq] = queen; + else if (s[0] == 'k') board[sq] = king; + else { board[sq] = no_piece; color[sq] = neutral; } + } + } + while (s[0] != '.'); + if (board[4] != king) kingmoved[white] = 10; + if (board[60] != king) kingmoved[black] = 10; + GameCnt = -1; Game50 = 0; Sdepth = 0; + InitializeStats(); + ClrScreen(); + UpdateDisplay(0,0,1,0); +} + + +ShowDepth(ch) +char ch; +{ +} + +ShowResults(score,bstline,ch) +short score; +unsigned short bstline[]; +char ch; +{ +#ifndef CHESSTOOL +register int i; + printz("%2d%c %5d %4ld %7ld ",Sdepth,ch,score,et,NodeCnt); + for (i = 1; bstline[i] > 0; i++) + { + algbr((short)(bstline[i] >> 8),(short)(bstline[i] & 0xFF),false); + if (i == 9 || i == 17) printz("\n "); + printz("%5s ",mvstr1); + } + printz("\n"); +#endif +} + + +SearchStartStuff(side) +short side; +{ +#ifndef MSDOS +#endif +#ifndef CHESSTOOL + printz("\nMove# %d Target= %ld Clock: %ld\n", + TCmoves-TimeControl.moves[side]+1, + ResponseTime,TimeControl.clock[side]); +#endif +} + + +OutputMove() +{ +#ifdef CHESSTOOL + printz("%d. ... %s\n",++mycnt1,mvstr1); + if (root->flags & draw) + { + printz("Draw\n"); + ListGame(); + exit(0); + } + if (root->score == -9999) + { + if (opponent == white) printz("White\n"); else printz("Black\n"); + ListGame(); + exit(0); + } + if (root->score == 9998) + { + if (computer == white) printz("White\n"); else printz("Black\n"); + ListGame(); + exit(0); + } +#else + printz("Nodes= %ld Eval= %ld Hash= %ld Rate= %ld ", + NodeCnt,EvalNodes,HashCnt,evrate); + printz("CPU= %.2ld:%.2ld.%.2ld\n\n", + cputimer/6000,(cputimer % 6000)/100,cputimer % 100); + + if (root->flags & epmask) UpdateDisplay(0,0,1,0); + else UpdateDisplay(root->f,root->t,0,root->flags & cstlmask); + printz("My move is: %s\n\n",mvstr1); + if (beep) printz("%c",7); + + if (root->flags & draw) printz("Draw game!\n"); + else if (root->score == -9999) printz("opponent mates!\n"); + else if (root->score == 9998) printz("computer mates!\n"); + else if (root->score < -9000) printz("opponent will soon mate!\n"); + else if (root->score > 9000) printz("computer will soon mate!\n"); +#endif CHESSTOOL +} + + +ElapsedTime(iop) +short iop; + +/* + Determine the time that has passed since the search was started. If + the elapsed time exceeds the target (ResponseTime+ExtraTime) then set + timeout to true which will terminate the search. +*/ + +{ + et = time((long *)0) - time0; + if (et < 0) et = 0; + ETnodes += 50; + if (et > et0 || iop == 1) + { + if (et > ResponseTime+ExtraTime && Sdepth > 1) timeout = true; + et0 = et; + if (iop == 1) + { + time0 = time((long *)0); et0 = 0; + } +#ifdef MSDOS + cputimer = 100*et; + if (et > 0) evrate = NodeCnt/(et+ft); else evrate = 0; + if (kbhit() && Sdepth > 1) + { + timeout = true; + bothsides = false; + } +#else + (void) times(&tmbuf2); + cputimer = 100*(tmbuf2.tms_utime - tmbuf1.tms_utime) / HZ; + if (cputimer > 0) evrate = (100*NodeCnt)/(cputimer+100*ft); + else evrate = 0; +#endif MSDOS + ETnodes = NodeCnt + 50; + } +} + + +SetTimeControl() +{ + if (TCflag) + { + TimeControl.moves[white] = TimeControl.moves[black] = TCmoves; + TimeControl.clock[white] = TimeControl.clock[black] = 60*(long)TCminutes; + } + else + { + TimeControl.moves[white] = TimeControl.moves[black] = 0; + TimeControl.clock[white] = TimeControl.clock[black] = 0; + Level = 60*(long)TCminutes; + } + et = 0; + ElapsedTime(1); +} + + +ClrScreen() +{ +#ifndef CHESSTOOL + printz("\n"); +#endif +} + + +UpdateDisplay(f,t,flag,iscastle) +short f,t,flag,iscastle; +{ +#ifndef CHESSTOOL +short r,c,l; + if (flag) + { + printz("\n"); + for (r = 7; r >= 0; r--) + { + for (c = 0; c <= 7; c++) + { + if (reverse) l = locn[7-r][7-c]; else l = locn[r][c]; + if (color[l] == neutral) printz(" -"); + else if (color[l] == white) printz(" %c",qxx[board[l]]); + else printz(" %c",pxx[board[l]]); + } + printz("\n"); + } + printz("\n"); + } +#endif CHESSTOOL +} + + +GetOpenings() + +/* + Read in the Opening Book file and parse the algebraic notation for a + move into an unsigned integer format indicating the from and to + square. Create a linked list of opening lines of play, with + entry->next pointing to the next line and entry->move pointing to a + chunk of memory containing the moves. More Opening lines of up to 256 + half moves may be added to gnuchess.book. +*/ + +{ +FILE *fd; +int c,i,j,side; +char buffr[2048]; +struct BookEntry *entry; +unsigned short mv,*mp,tmp[100]; + + if ((fd = fopen("gnuchess.book","r")) != NULL) + { +/* + setvbuf(fd,buffr,_IOFBF,2048); +*/ + Book = NULL; + i = 0; side = white; + while ((c = parse(fd,&mv,side)) >= 0) + if (c == 1) + { + tmp[++i] = mv; + side = otherside[side]; + } + else if (c == 0 && i > 0) + { + entry = (struct BookEntry *)malloc(sizeof(struct BookEntry)); + mp = (unsigned short *)malloc((i+1)*sizeof(unsigned short)); + entry->mv = mp; + entry->next = Book; + Book = entry; + for (j = 1; j <= i; j++) *(mp++) = tmp[j]; + *mp = 0; + i = 0; side = white; + } + fclose(fd); + } +} + + +int parse(fd,mv,side) +FILE *fd; +unsigned short *mv; +short side; +{ +int c,i,r1,r2,c1,c2; +char s[100]; + while ((c = getc(fd)) == ' '); + i = 0; s[0] = c; + while (c != ' ' && c != '\n' && c != EOF) s[++i] = c = getc(fd); + s[++i] = '\0'; + if (c == EOF) return(-1); + if (s[0] == '!' || i < 3) + { + while (c != '\n' && c != EOF) c = getc(fd); + return(0); + } + if (s[4] == 'o') + if (side == black) *mv = 0x3C3A; else *mv = 0x0402; + else if (s[0] == 'o') + if (side == black) *mv = 0x3C3E; else *mv = 0x0406; + else + { + c1 = s[0] - 'a'; r1 = s[1] - '1'; + c2 = s[2] - 'a'; r2 = s[3] - '1'; + *mv = (locn[r1][c1]<<8) + locn[r2][c2]; + } + return(1); +} + + +GetGame() +{ +FILE *fd; +char fname[40]; +int c; +short sq; +unsigned short m; + + printz("Enter file name: "); + scanz("%s",fname); + if (fname[0] == '\0') strcpy(fname,"chess.000"); + if ((fd = fopen(fname,"r")) != NULL) + { + fscanf(fd,"%hd%hd%hd",&computer,&opponent,&Game50); + fscanf(fd,"%hd%hd%hd%hd", + &castld[white],&castld[black], + &kingmoved[white],&kingmoved[black]); + fscanf(fd,"%hd%hd",&TCflag,&OperatorTime); + fscanf(fd,"%ld%ld%hd%hd", + &TimeControl.clock[white],&TimeControl.clock[black], + &TimeControl.moves[white],&TimeControl.moves[black]); + for (sq = 0; sq < 64; sq++) + { + fscanf(fd,"%hd",&m); + board[sq] = (m >> 8); color[sq] = (m & 0xFF); + if (color[sq] == 0) color[sq] = neutral; else --color[sq]; + } + GameCnt = -1; c = '?'; + while (c != EOF) + { + ++GameCnt; + c = fscanf(fd,"%hd%hd%hd%ld%hd%hd%hd",&GameList[GameCnt].gmove, + &GameList[GameCnt].score,&GameList[GameCnt].depth, + &GameList[GameCnt].nodes,&GameList[GameCnt].time, + &GameList[GameCnt].piece,&GameList[GameCnt].color); + if (GameList[GameCnt].color == 0) GameList[GameCnt].color = neutral; + else --GameList[GameCnt].color; + } + GameCnt--; + if (TimeControl.clock[white] > 0) TCflag = true; + computer--; opponent--; + } + fclose(fd); + InitializeStats(); + UpdateDisplay(0,0,1,0); + Sdepth = 0; +} + + +SaveGame() +{ +FILE *fd; +char fname[40]; +short sq,i,c; + + printz("Enter file name: "); + scanz("%s",fname); + + if (fname[0] == '\0' || access(fname,W_OK) == -1) strcpy(fname,"chess.000"); + fd = fopen(fname,"w"); + fprintf(fd,"%d %d %d\n",computer+1,opponent+1,Game50); + fprintf(fd,"%d %d %d %d\n", + castld[white],castld[black],kingmoved[white],kingmoved[black]); + fprintf(fd,"%d %d\n",TCflag,OperatorTime); + fprintf(fd,"%ld %ld %d %d\n", + TimeControl.clock[white],TimeControl.clock[black], + TimeControl.moves[white],TimeControl.moves[black]); + for (sq = 0; sq < 64; sq++) + { + if (color[sq] == neutral) c = 0; else c = color[sq]+1; + fprintf(fd,"%d\n",256*board[sq] + c); + } + for (i = 0; i <= GameCnt; i++) + { + if (GameList[i].color == neutral) c = 0; + else c = GameList[i].color + 1; + fprintf(fd,"%d %d %d %ld %d %d %d\n", + GameList[i].gmove,GameList[i].score,GameList[i].depth, + GameList[i].nodes,GameList[i].time, + GameList[i].piece,c); + } + fclose(fd); +} + + +ListGame() +{ +FILE *fd; +short i,f,t; + fd = fopen("chess.lst","w"); + fprintf(fd,"\n"); + fprintf(fd," score depth nodes time "); + fprintf(fd," score depth nodes time\n"); + for (i = 0; i <= GameCnt; i++) + { + f = GameList[i].gmove>>8; t = (GameList[i].gmove & 0xFF); + algbr(f,t,false); + if ((i % 2) == 0) fprintf(fd,"\n"); else fprintf(fd," "); + fprintf(fd,"%5s %5d %2d %6ld %5d",mvstr1, + GameList[i].score,GameList[i].depth, + GameList[i].nodes,GameList[i].time); + } + fprintf(fd,"\n\n"); + fclose(fd); +} + + +Undo() + +/* + Undo the most recent half-move. +*/ + +{ +short f,t; + f = GameList[GameCnt].gmove>>8; + t = GameList[GameCnt].gmove & 0xFF; + if (board[t] == king && distance(t,f) > 1) + castle(GameList[GameCnt].color,f,t,2); + else + { + board[f] = board[t]; color[f] = color[t]; + board[t] = GameList[GameCnt].piece; + color[t] = GameList[GameCnt].color; + if (board[f] == king) --kingmoved[color[f]]; + } + if (TCflag) ++TimeControl.moves[color[f]]; + GameCnt--; mate = false; Sdepth = 0; + UpdateDisplay(0,0,1,0); + InitializeStats(); +} + + +ShowMessage(s) +char *s; +{ +#ifndef CHESSTOOL + printz("%s\n"); +#endif CHESSTOOL +} + +ShowSidetomove() +{ +} + +PromptForMove() +{ +#ifndef CHESSTOOL + printz("\nYour move is? "); +#endif CHESSTOOL +} + + +ShowCurrentMove(pnt,f,t) +short pnt,f,t; +{ +} + +ChangeAlphaWindow() +{ + printz("window: "); + scanz("%hd",&Awindow); +} + +ChangeBetaWindow() +{ + printz("window: "); + scanz("%hd",&Bwindow); +} + +GiveHint() +{ + algbr((short)(hint>>8),(short)(hint & 0xFF),false); + printz("try %s\n",mvstr1); +} + + +SelectLevel() +{ + OperatorTime = 30000; + printz("Enter #moves #minutes: "); + scanz("%hd %hd",&TCmoves,&TCminutes); + printz("Operator time= "); + scanz("%hd",&OperatorTime); + TCflag = (TCmoves > 1); + SetTimeControl(); +} + + +ChangeSearchDepth() +{ + printz("depth= "); + scanz("%hd",&MaxSearchDepth); +} + +SetContempt() +{ + printz("contempt= "); + scanz("%hd",&contempt); +} + +ChangeXwindow() +{ + printz("xwndw= "); + scanz("%hd",&xwndw); +} diff --git a/gnu/games/chess/pathnames.h b/gnu/games/chess/pathnames.h new file mode 100644 index 0000000..b70a0f0 --- /dev/null +++ b/gnu/games/chess/pathnames.h @@ -0,0 +1,36 @@ +/*- + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. 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. + * + * @(#)pathnames.h 5.1 (Berkeley) 5/2/90 + */ + +#define _PATH_CHESSBOOK "/usr/share/games/gnuchess.book" diff --git a/gnu/games/chess/uxdsp.c b/gnu/games/chess/uxdsp.c new file mode 100644 index 0000000..d584738 --- /dev/null +++ b/gnu/games/chess/uxdsp.c @@ -0,0 +1,933 @@ +/* + ALPHA interface for CHESS + + Revision: 4-25-88 + + Copyright (C) 1986, 1987, 1988 Free Software Foundation, Inc. + Copyright (c) 1988 John Stanback + + This file is part of CHESS. + + CHESS is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY. No author or distributor + accepts responsibility to anyone for the consequences of using it + or for whether it serves any particular purpose or works at all, + unless he says so in writing. Refer to the CHESS General Public + License for full details. + + Everyone is granted permission to copy, modify and redistribute + CHESS, but only under the conditions described in the + CHESS General Public License. A copy of this license is + supposed to have been given to you along with CHESS so you + can know your rights and responsibilities. It should be in a + file named COPYING. Among other things, the copyright notice + and this notice must be preserved on all copies. +*/ + + +#include <stdio.h> +#include <ctype.h> +#include <sys/param.h> +#include <sys/times.h> +#include <sys/file.h> +#include <curses.h> +#include <signal.h> +#include "gnuchess.h" +#ifdef NEWMOVE +#include "move.h" +#endif +#include "pathnames.h" + +struct tms tmbuf1,tmbuf2; +void TerminateSearch(),Die(); + +#define scanz fflush(stdout),scanw +#define printz printw + + +Initialize() +{ + signal(SIGINT,Die); signal(SIGQUIT,Die); + initscr(); + crmode(); +} + + +ExitChess() +{ + nocrmode(); + endwin(); + exit(0); +} + + +void +Die() +{ +char s[80]; + signal(SIGINT,SIG_IGN); + signal(SIGQUIT,SIG_IGN); + ShowMessage("Abort? "); + scanz("%s",s); + if (strcmp(s,"yes") == 0) ExitChess(); + signal(SIGINT,Die); signal(SIGQUIT,Die); +} + + +void +TerminateSearch() +{ + signal(SIGINT,SIG_IGN); + signal(SIGQUIT,SIG_IGN); + timeout = true; + bothsides = false; + signal(SIGINT,Die); signal(SIGQUIT,Die); +} + + +InputCommand() + +/* + Process the users command. If easy mode is OFF (the computer is + thinking on opponents time) and the program is out of book, then make + the 'hint' move on the board and call SelectMove() to find a response. + The user terminates the search by entering ^C (quit siqnal) before + entering a command. If the opponent does not make the hint move, then + set Sdepth to zero. +*/ + +{ +short ok,i,tmp; +long cnt,rate,t1,t2; +unsigned short mv; +char s[80]; + + ok = quit = false; + player = opponent; + ShowSidetomove(); + ft = 0; + if (hint > 0 && !easy && Book == NULL) + { + fflush(stdout); + time0 = time((long *)0); + algbr(hint>>8,hint & 0xFF,false); + strcpy(s,mvstr1); + tmp = epsquare; + if (VerifyMove(s,1,&mv)) + { + PromptForMove(); + SelectMove(computer,2); + VerifyMove(mvstr1,2,&mv); + if (Sdepth > 0) Sdepth--; + } + ft = time((time_t *)0) - time0; + epsquare = tmp; + } + + signal(SIGINT,Die); signal(SIGQUIT,Die); + while (!(ok || quit)) + { + PromptForMove(); + scanz("%s",s); + player = opponent; + ok = VerifyMove(s,0,&mv); + if (ok && mv != hint) + { + Sdepth = 0; + ft = 0; + } + + if (strcmp(s,"bd") == 0) + { + ClrScreen(); + UpdateDisplay(0,0,1,0); + } + if (strcmp(s,"quit") == 0) quit = true; + if (strcmp(s,"post") == 0) post = !post; + if (strcmp(s,"edit") == 0) EditBoard(); + if (strcmp(s,"go") == 0) ok = true; + if (strcmp(s,"help") == 0) help(); + if (strcmp(s,"force") == 0) force = !force; + if (strcmp(s,"book") == 0) Book = NULL; + if (strcmp(s,"undo") == 0 && GameCnt >= 0) Undo(); + if (strcmp(s,"new") == 0) NewGame(); + if (strcmp(s,"list") == 0) ListGame(); + if (strcmp(s,"level") == 0) SelectLevel(); + if (strcmp(s,"hash") == 0) hashflag = !hashflag; + if (strcmp(s,"beep") == 0) beep = !beep; + if (strcmp(s,"Awindow") == 0) ChangeAlphaWindow(); + if (strcmp(s,"Bwindow") == 0) ChangeBetaWindow(); + if (strcmp(s,"hint") == 0) GiveHint(); + if (strcmp(s,"both") == 0) + { + bothsides = !bothsides; + Sdepth = 0; + SelectMove(opponent,1); + ok = true; + } + if (strcmp(s,"reverse") == 0) + { + reverse = !reverse; + ClrScreen(); + UpdateDisplay(0,0,1,0); + } + if (strcmp(s,"switch") == 0) + { + computer = otherside[computer]; + opponent = otherside[opponent]; + force = false; + Sdepth = 0; + ok = true; + } + if (strcmp(s,"white") == 0) + { + computer = white; opponent = black; + ok = true; force = false; + Sdepth = 0; + } + if (strcmp(s,"black") == 0) + { + computer = black; opponent = white; + ok = true; force = false; + Sdepth = 0; + } + if (strcmp(s,"remove") == 0 && GameCnt >= 1) + { + Undo(); Undo(); + } + if (strcmp(s,"get") == 0) GetGame(); + if (strcmp(s,"save") == 0) SaveGame(); + if (strcmp(s,"depth") == 0) ChangeSearchDepth(); + if (strcmp(s,"random") == 0) dither = 6; + if (strcmp(s,"easy") == 0) easy = !easy; + if (strcmp(s,"contempt") == 0) SetContempt(); + if (strcmp(s,"xwndw") == 0) ChangeXwindow(); + if (strcmp(s,"test") == 0) + { + t1 = time(0); + cnt = 0; + for (i = 0; i < 10000; i++) + { + MoveList(opponent,2); + cnt += TrPnt[3] - TrPnt[2]; + } + t2 = time(0); + rate = cnt / (t2-t1); + gotoXY(50,24); + printz("cnt= %ld rate= %ld",cnt,rate); + ClrEoln(); + } + if (strcmp(s,"p") == 0) ShowPostnValues(); + if (strcmp(s,"debug") == 0) DoDebug(); + } + + ClearMessage(); + ElapsedTime(1); + if (force) + { + computer = opponent; opponent = otherside[computer]; + } + (void) times(&tmbuf1); + signal(SIGINT,TerminateSearch); signal(SIGQUIT,TerminateSearch); +} + + +EditBoard() + +/* + Set up a board position. Pieces are entered by typing the piece + followed by the location. For example, Nf3 will place a knight on + square f3. +*/ + +{ +short a,r,c,sq; +char s[80]; + + ClrScreen(); + UpdateDisplay(0,0,1,0); + gotoXY(50,2); printz(". Exit to main"); + gotoXY(50,3); printz("# Clear board"); + gotoXY(49,5); printz("Enter piece & location: "); + a = white; + do + { + gotoXY(73,5); ClrEoln(); scanz("%s",s); + if (s[0] == '#') + { + for (sq = 0; sq < 64; sq++) + { + board[sq] = no_piece; color[sq] = neutral; + } + UpdateDisplay(0,0,1,0); + } + if (s[0] == 'c' || s[0] == 'C') a = otherside[a]; + c = s[1]-'a'; r = s[2]-'1'; + if ((c >= 0) && (c < 8) && (r >= 0) && (r < 8)) + { + sq = locn[r][c]; + color[sq] = a; + if (s[0] == 'p') board[sq] = pawn; + else if (s[0] == 'n') board[sq] = knight; + else if (s[0] == 'b') board[sq] = bishop; + else if (s[0] == 'r') board[sq] = rook; + else if (s[0] == 'q') board[sq] = queen; + else if (s[0] == 'k') board[sq] = king; + else { board[sq] = no_piece; color[sq] = neutral; } + DrawPiece(sq); + } + } + while (s[0] != '.'); + if (board[4] != king) kingmoved[white] = 10; + if (board[60] != king) kingmoved[black] = 10; + GameCnt = -1; Game50 = 0; Sdepth = 0; + InitializeStats(); + ClrScreen(); + UpdateDisplay(0,0,1,0); +} + + +help() +{ + ClrScreen(); + gotoXY(28,1); printz("CHESS command summary"); + gotoXY(1,3); printz("g1f3 move from g1 to f3"); + gotoXY(1,4); printz("nf3 move knight to f3"); + gotoXY(1,5); printz("o-o castle king side"); + gotoXY(1,6); printz("o-o-o castle queen side"); + gotoXY(1,7); printz("edit edit board"); + gotoXY(1,8); printz("switch sides with computer"); + gotoXY(1,9); printz("white computer plays white"); + gotoXY(1,10); printz("black computer plays black"); + gotoXY(1,11); printz("reverse board display"); + gotoXY(1,12); printz("both computer match"); + gotoXY(1,13); printz("random randomize play"); + gotoXY(1,14); printz("undo undo last move"); + gotoXY(42,3); printz("level change level"); + gotoXY(42,4); printz("depth set search depth"); + gotoXY(42,5); printz("post principle variation"); + gotoXY(42,6); printz("hint suggest a move"); + gotoXY(42,7); printz("bd redraw board"); + gotoXY(42,8); printz("force enter game moves"); + gotoXY(42,9); printz("list game to chess.lst"); + gotoXY(42,10); printz("save game to file"); + gotoXY(42,11); printz("get game from file"); + gotoXY(42,12); printz("new start new game"); + gotoXY(42,13); printz("quit exit CHESS"); + gotoXY(10,21); printz("Computer: "); + if (computer == white) printz("WHITE"); else printz("BLACK"); + gotoXY(10,22); printz("Opponent: "); + if (opponent == white) printz("WHITE"); else printz("BLACK"); + gotoXY(10,23); printz("Level: %ld",Level," sec."); + gotoXY(10,24); printz("Easy mode: "); + if (easy) printz("ON"); else printz("OFF"); + gotoXY(40,21); printz("Depth: %d",MaxSearchDepth); + gotoXY(40,22); printz("Random: "); + if (dither) printz("ON"); else printz("OFF"); + gotoXY(40,23); printz("Transposition table: "); + if (hashflag) printz("ON"); else printz("OFF"); + refresh(); + while (getchar() != 27); + ClrScreen(); + UpdateDisplay(0,0,1,0); +} + + +ShowDepth(ch) +char ch; +{ + gotoXY(50,4); printz("Depth= %d%c ",Sdepth,ch); ClrEoln(); +} + + +ShowResults(score,bstline,ch) +short score; +unsigned short bstline[]; +char ch; +{ +short d,e,ply; + if (post && player == computer) + { + e = lpost; + gotoXY(50,5); printz("Score= %d",score); ClrEoln(); + d = 8; gotoXY(50,d); ClrEoln(); + for (ply = 1; bstline[ply] > 0; ply++) + { + algbr(bstline[ply] >> 8,bstline[ply] & 0xFF,false); + if (ply == 5 || ply == 9 || ply == 13 || ply == 17) + { + gotoXY(50,++d); ClrEoln(); + } + printz("%5s ",mvstr1); + } + ClrEoln(); + lpost = d; + while (++d <= e) + { + gotoXY(50,d); ClrEoln(); + } + } +} + + +SearchStartStuff(side) +short side; +{ +short i; + signal(SIGINT,TerminateSearch); signal(SIGQUIT,TerminateSearch); + if (player == computer) + for (i = 5; i < 14; i++) + { + gotoXY(50,i); ClrEoln(); + } +} + + +OutputMove() +{ + if (root->flags & epmask) UpdateDisplay(0,0,1,0); + else UpdateDisplay(root->f,root->t,0,root->flags & cstlmask); + gotoXY(50,17); printz("My move is: %s",mvstr1); + if (beep) putchar(7); + ClrEoln(); + + gotoXY(50,24); + if (root->flags & draw) printz("Draw game!"); + else if (root->score == -9999) printz("opponent mates!"); + else if (root->score == 9998) printz("computer mates!"); + else if (root->score < -9000) printz("opponent will soon mate!"); + else if (root->score > 9000) printz("computer will soon mate!"); + ClrEoln(); + + if (post) + { + gotoXY(50,22); printz("Nodes= %6ld",NodeCnt); ClrEoln(); + gotoXY(50,23); printz("Nodes/Sec= %4ld",evrate); ClrEoln(); + } +} + + +ElapsedTime(iop) + +/* + Determine the time that has passed since the search was started. If + the elapsed time exceeds the target (ResponseTime+ExtraTime) then set + timeout to true which will terminate the search. +*/ + +short iop; +{ + et = time((time_t *)0) - time0; + if (et < 0) et = 0; + ETnodes += 50; + if (et > et0 || iop == 1) + { + if (et > ResponseTime+ExtraTime && Sdepth > 1) timeout = true; + et0 = et; + if (iop == 1) + { + time0 = time((time_t *)0); et0 = 0; + } + (void) times(&tmbuf2); + cputimer = 100*(tmbuf2.tms_utime - tmbuf1.tms_utime) / HZ; + if (cputimer > 0) evrate = (100*NodeCnt)/(cputimer+100*ft); + else evrate = 0; + ETnodes = NodeCnt + 50; + UpdateClocks(); + } +} + + +UpdateClocks() +{ +short m,s; + m = et/60; s = (et - 60*m); + if (TCflag) + { + m = (TimeControl.clock[player] - et) / 60; + s = TimeControl.clock[player] - et - 60*m; + } + if (m < 0) m = 0; + if (s < 0) s = 0; + if (player == white) + if (reverse) gotoXY(20,2); else gotoXY(20,23); + else + if (reverse) gotoXY(20,23); else gotoXY(20,2); + printz("%d:%2d ",m,s); + if (post) + { + gotoXY(50,22); printz("Nodes= %6ld",NodeCnt); + gotoXY(50,23); printz("Nodes/Sec= %4ld",evrate); + } + refresh(); +} + + + +SetTimeControl() +{ + if (TCflag) + { + TimeControl.moves[white] = TimeControl.moves[black] = TCmoves; + TimeControl.clock[white] = TimeControl.clock[black] = 60*(long)TCminutes; + } + else + { + TimeControl.moves[white] = TimeControl.moves[black] = 0; + TimeControl.clock[white] = TimeControl.clock[black] = 0; + Level = 60*(long)TCminutes; + } + et = 0; + ElapsedTime(1); +} + + +gotoXY(x,y) +short x,y; +{ + move(y-1,x-1); +} + + +ClrScreen() +{ + clear(); refresh(); +} + + +ClrEoln() +{ + clrtoeol(); refresh(); +} + + +DrawPiece(sq) +short sq; +{ +short r,c; char x; + if (reverse) r = 7-row[sq]; else r = row[sq]; + if (reverse) c = 7-column[sq]; else c = column[sq]; + if (color[sq] == black) x = '*'; else x = ' '; + gotoXY(5+5*c,5+2*(7-r)); printz("%c%c ",x,pxx[board[sq]]); +} + + +UpdateDisplay(f,t,flag,iscastle) +short f,t,flag,iscastle; +{ +short i,l,z; + if (flag) + { + gotoXY(56,2); printz("CHESS"); + i = 3; + gotoXY(3,++i); + printz("|----|----|----|----|----|----|----|----|"); + while (i<19) + { + gotoXY(1,++i); + if (reverse) z = (i/2)-1; else z = 10-(i/2); + printz("%d | | | | | | | | |",z); + gotoXY(3,++i); + if (i < 19) + printz("+----+----+----+----+----+----+----+----+"); + } + printz("|----|----|----|----|----|----|----|----|"); + gotoXY(3,21); + if (reverse) printz(" h g f e d c b a"); + else printz(" a b c d e f g h"); + if (reverse) gotoXY(5,23); else gotoXY(5,2); + if (computer == black) printz("Computer"); else printz("Human "); + if (reverse) gotoXY(5,2); else gotoXY(5,23); + if (computer == white) printz("Computer"); else printz("Human "); + for (l = 0; l < 64; l++) DrawPiece(l); + } + else + { + DrawPiece(f); DrawPiece(t); + if (iscastle) + if (t > f) + { DrawPiece(f+3); DrawPiece(t-1); } + else + { DrawPiece(f-4); DrawPiece(t+1); } + } + refresh(); +} + + +GetOpenings() + +/* + Read in the Opening Book file and parse the algebraic notation for a + move into an unsigned integer format indicating the from and to + square. Create a linked list of opening lines of play, with + entry->next pointing to the next line and entry->move pointing to a + chunk of memory containing the moves. More Opening lines of up to 256 + half moves may be added to gnuchess.book. +*/ + +{ +FILE *fd; +int c,i,j,side; +struct BookEntry *entry; +unsigned short mv,*mp,tmp[100]; + + if ((fd = fopen(_PATH_CHESSBOOK,"r")) != NULL) + { + Book = NULL; + i = 0; side = white; + while ((c = parse(fd,&mv,side)) >= 0) + if (c == 1) + { + tmp[++i] = mv; + side = otherside[side]; + } + else if (c == 0 && i > 0) + { + entry = (struct BookEntry *)malloc(sizeof(struct BookEntry)); + mp = (unsigned short *)malloc((i+1)*sizeof(unsigned short)); + entry->mv = mp; + entry->next = Book; + Book = entry; + for (j = 1; j <= i; j++) *(mp++) = tmp[j]; + *mp = 0; + i = 0; side = white; + } + fclose(fd); + } + else + { + fprintf(stderr, "\nchess: can't read %s.\n", _PATH_CHESSBOOK); + exit(1); + } +} + + +int parse(fd,mv,side) +FILE *fd; +unsigned short *mv; +short side; +{ +int c,i,r1,r2,c1,c2; +char s[100]; + while ((c = getc(fd)) == ' '); + i = 0; s[0] = c; + while (c != ' ' && c != '\n' && c != EOF) s[++i] = c = getc(fd); + s[++i] = '\0'; + if (c == EOF) return(-1); + if (s[0] == '!' || i < 3) + { + while (c != '\n' && c != EOF) c = getc(fd); + return(0); + } + if (s[4] == 'o') + if (side == black) *mv = 0x3C3A; else *mv = 0x0402; + else if (s[0] == 'o') + if (side == black) *mv = 0x3C3E; else *mv = 0x0406; + else + { + c1 = s[0] - 'a'; r1 = s[1] - '1'; + c2 = s[2] - 'a'; r2 = s[3] - '1'; + *mv = (locn[r1][c1]<<8) + locn[r2][c2]; + } + return(1); +} + + +GetGame() +{ +FILE *fd; +char fname[40]; +int c; +short sq; +unsigned short m; + + ShowMessage("File name: "); + scanz("%s",fname); + if (fname[0] == '\0') strcpy(fname,"chess.000"); + if ((fd = fopen(fname,"r")) != NULL) + { + fscanf(fd,"%hd%hd%hd",&computer,&opponent,&Game50); + fscanf(fd,"%hd%hd%hd%hd", + &castld[white],&castld[black], + &kingmoved[white],&kingmoved[black]); + fscanf(fd,"%hd%hd",&TCflag,&OperatorTime); + fscanf(fd,"%ld%ld%hd%hd", + &TimeControl.clock[white],&TimeControl.clock[black], + &TimeControl.moves[white],&TimeControl.moves[black]); + for (sq = 0; sq < 64; sq++) + { + fscanf(fd,"%hd",&m); + board[sq] = (m >> 8); color[sq] = (m & 0xFF); + if (color[sq] == 0) color[sq] = neutral; else --color[sq]; + } + GameCnt = -1; c = '?'; + while (c != EOF) + { + ++GameCnt; + c = fscanf(fd,"%hd%hd%hd%ld%hd%hd%hd",&GameList[GameCnt].gmove, + &GameList[GameCnt].score,&GameList[GameCnt].depth, + &GameList[GameCnt].nodes,&GameList[GameCnt].time, + &GameList[GameCnt].piece,&GameList[GameCnt].color); + if (GameList[GameCnt].color == 0) GameList[GameCnt].color = neutral; + else --GameList[GameCnt].color; + } + GameCnt--; + if (TimeControl.clock[white] > 0) TCflag = true; + computer--; opponent--; + } + fclose(fd); + InitializeStats(); + UpdateDisplay(0,0,1,0); + Sdepth = 0; +} + + +SaveGame() +{ +FILE *fd; +char fname[40]; +short sq,i,c; + + ShowMessage("File name: "); + scanz("%s",fname); + + if (fname[0] == '\0' || access(fname,W_OK) == -1) strcpy(fname,"chess.000"); + fd = fopen(fname,"w"); + fprintf(fd,"%d %d %d\n",computer+1,opponent+1,Game50); + fprintf(fd,"%d %d %d %d\n", + castld[white],castld[black],kingmoved[white],kingmoved[black]); + fprintf(fd,"%d %d\n",TCflag,OperatorTime); + fprintf(fd,"%ld %ld %d %d\n", + TimeControl.clock[white],TimeControl.clock[black], + TimeControl.moves[white],TimeControl.moves[black]); + for (sq = 0; sq < 64; sq++) + { + if (color[sq] == neutral) c = 0; else c = color[sq]+1; + fprintf(fd,"%d\n",256*board[sq] + c); + } + for (i = 0; i <= GameCnt; i++) + { + if (GameList[i].color == neutral) c = 0; + else c = GameList[i].color + 1; + fprintf(fd,"%d %d %d %ld %d %d %d\n", + GameList[i].gmove,GameList[i].score,GameList[i].depth, + GameList[i].nodes,GameList[i].time, + GameList[i].piece,c); + } + fclose(fd); +} + + +ListGame() +{ +FILE *fd; +short i,f,t; + fd = fopen("chess.lst","w"); + fprintf(fd,"\n"); + fprintf(fd," score depth nodes time "); + fprintf(fd," score depth nodes time\n"); + for (i = 0; i <= GameCnt; i++) + { + f = GameList[i].gmove>>8; t = (GameList[i].gmove & 0xFF); + algbr(f,t,false); + if ((i % 2) == 0) fprintf(fd,"\n"); else fprintf(fd," "); + fprintf(fd,"%5s %5d %2d %6ld %5d",mvstr1, + GameList[i].score,GameList[i].depth, + GameList[i].nodes,GameList[i].time); + } + fprintf(fd,"\n\n"); + fclose(fd); +} + + +Undo() + +/* + Undo the most recent half-move. +*/ + +{ +short f,t; + f = GameList[GameCnt].gmove>>8; + t = GameList[GameCnt].gmove & 0xFF; + if (board[t] == king && distance(t,f) > 1) + castle(GameList[GameCnt].color,f,t,2); + else + { + board[f] = board[t]; color[f] = color[t]; + board[t] = GameList[GameCnt].piece; + color[t] = GameList[GameCnt].color; + if (board[f] == king) --kingmoved[color[f]]; + } + if (TCflag) ++TimeControl.moves[color[f]]; + GameCnt--; mate = false; Sdepth = 0; + UpdateDisplay(0,0,1,0); + InitializeStats(); +} + + +ShowMessage(s) +char *s; +{ + gotoXY(50,24); printz("%s",s); ClrEoln(); +} + +ClearMessage() +{ + gotoXY(50,24); ClrEoln(); +} + +ShowSidetomove() +{ + gotoXY(50,14); + if (player == white) printz("%2d: WHITE",1+(GameCnt+1)/2); + else printz("%2d: BLACK",1+(GameCnt+1)/2); + ClrEoln(); +} + +PromptForMove() +{ + gotoXY(50,19); printz("Your move is? "); ClrEoln(); +} + +ShowCurrentMove(pnt,f,t) +short pnt,f,t; +{ + algbr(f,t,false); + gotoXY(50,7); printz("(%2d) %4s",pnt,mvstr1); +} + +ChangeAlphaWindow() +{ + ShowMessage("window: "); + scanz("%hd",&Awindow); +} + +ChangeBetaWindow() +{ + ShowMessage("window: "); + scanz("%hd",&Bwindow); +} + +GiveHint() +{ +char s[40]; + algbr((short)(hint>>8),(short)(hint & 0xFF),false); + strcpy(s,"try "); + strcat(s,mvstr1); + ShowMessage(s); +} + +ChangeSearchDepth() +{ + ShowMessage("depth= "); + scanz("%hd",&MaxSearchDepth); +} + +SetContempt() +{ + ShowMessage("contempt= "); + scanz("%hd",&contempt); +} + +ChangeXwindow() +{ + ShowMessage("xwndw= "); + scanz("%hd",&xwndw); +} + + +SelectLevel() +{ + ClrScreen(); + gotoXY(32,2); printz("CHESS"); + gotoXY(20,4); printz(" 1. 60 moves in 5 minutes"); + gotoXY(20,5); printz(" 2. 60 moves in 15 minutes"); + gotoXY(20,6); printz(" 3. 60 moves in 30 minutes"); + gotoXY(20,7); printz(" 4. 40 moves in 30 minutes"); + gotoXY(20,8); printz(" 5. 40 moves in 60 minutes"); + gotoXY(20,9); printz(" 6. 40 moves in 120 minutes"); + gotoXY(20,10); printz(" 7. 40 moves in 240 minutes"); + gotoXY(20,11); printz(" 8. 1 move in 15 minutes"); + gotoXY(20,12); printz(" 9. 1 move in 60 minutes"); + gotoXY(20,13); printz("10. 1 move in 600 minutes"); + + OperatorTime = 0; TCmoves = 60; TCminutes = 5; + + gotoXY(20,17); printz("Enter Level: "); + refresh(); + scanz("%ld",&Level); + switch (Level) + { + case 1 : TCmoves = 60; TCminutes = 5; break; + case 2 : TCmoves = 60; TCminutes = 15; break; + case 3 : TCmoves = 60; TCminutes = 30; break; + case 4 : TCmoves = 40; TCminutes = 30; break; + case 5 : TCmoves = 40; TCminutes = 60; break; + case 6 : TCmoves = 40; TCminutes = 120; break; + case 7 : TCmoves = 40; TCminutes = 240; break; + case 8 : TCmoves = 1; TCminutes = 15; break; + case 9 : TCmoves = 1; TCminutes = 60; break; + case 10 : TCmoves = 1; TCminutes = 600; break; + } + + TCflag = (TCmoves > 1); + SetTimeControl(); + ClrScreen(); + UpdateDisplay(0,0,1,0); +} + + +ShowPostnValues() +{ +short i,r,c; + ExaminePosition(); + for (i = 0; i < 64; i++) + { + if (reverse) r = 7-row[i]; else r = row[i]; + if (reverse) c = 7-column[i]; else c = column[i]; + gotoXY(4+5*c,5+2*(7-r)); + c1 = color[i]; c2 = otherside[c1]; + PC1 = PawnCnt[c1]; PC2 = PawnCnt[c2]; + atk1 = atak[c1]; atk2 = atak[c2]; + if (color[i] == neutral) printz(" "); + else printz("%3d ",SqValue(i,opponent)); + } + ScorePosition(opponent,&i); + gotoXY(50,24); + printz("Score= %d",i); ClrEoln(); +} + + +DoDebug() +{ +short k,p,i,r,c,tp,tc; +char s[40]; + ExaminePosition(); + ShowMessage("Enter piece: "); + scanz("%s",s); + if (s[0] == 'w') k = white; else k = black; + if (s[1] == 'p') p = pawn; + else if (s[1] == 'n') p = knight; + else if (s[1] == 'b') p = bishop; + else if (s[1] == 'r') p = rook; + else if (s[1] == 'q') p = queen; + else if (s[1] == 'k') p = king; + else p = no_piece; + for (i = 0; i < 64; i++) + { + if (reverse) r = 7-row[i]; else r = row[i]; + if (reverse) c = 7-column[i]; else c = column[i]; + gotoXY(4+5*c,5+2*(7-r)); + tp = board[i]; tc = color[i]; + board[i] = p; color[i] = k; + c1 = k; c2 = otherside[c1]; + PC1 = PawnCnt[c1]; PC2 = PawnCnt[c2]; + atk1 = atak[c1]; atk2 = atak[c2]; + printz("%3d ",SqValue(i,opponent)); + board[i] = tp; color[i] = tc; + } + ScorePosition(opponent,&i); + gotoXY(50,24); + printz("Score= %d",i); ClrEoln(); +} |